ezllm 0.0.43 → 0.0.44
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.
- package/dist/web-ui/assets/{DashboardView-WtDwRkVw.js → DashboardView-DTL4kRw7.js} +1 -1
- package/dist/web-ui/assets/{LayoutView-Bxe9Zpzg.js → LayoutView-CU11b-ex.js} +1 -1
- package/dist/web-ui/assets/{LoginView-oHqStvWg.js → LoginView-D1Bu2XC9.js} +1 -1
- package/dist/web-ui/assets/{LogsView-C1rYzWM5.js → LogsView-qU6iMr5I.js} +1 -1
- package/dist/web-ui/assets/{ManagedServicesView-Roep2c1v.js → ManagedServicesView-B6JE5Odv.js} +1 -1
- package/dist/web-ui/assets/{PluginsView-xy5NajWq.js → PluginsView-Cjv5DQzy.js} +1 -1
- package/dist/web-ui/assets/{ProvidersView-M_MSab-K.js → ProvidersView-B31OhA_q.js} +2 -2
- package/dist/web-ui/assets/{ProvidersView-BSFjmX9y.css → ProvidersView-B6GPraOb.css} +1 -1
- package/dist/web-ui/assets/{ServiceStatusView-Dsrz87_B.js → ServiceStatusView-A8mjOoU-.js} +1 -1
- package/dist/web-ui/assets/{SettingsView-CwdCfurj.js → SettingsView-CYnqDlfO.js} +1 -1
- package/dist/web-ui/assets/{SetupView-8ajUBY2H.js → SetupView-BSRObllO.js} +1 -1
- package/dist/web-ui/assets/{config-_F8xCbJI.js → config-CcujDHN0.js} +1 -1
- package/dist/web-ui/assets/{index-W7WdLt_5.js → index-B5mLXy9e.js} +1 -1
- package/dist/web-ui/assets/{message-DpifAOwJ.js → message-t8lJfFLj.js} +1 -1
- package/dist/web-ui/assets/providers-CqcnYJca.js +1 -0
- package/dist/web-ui/assets/{router-BgTNV93P.js → router-C6GERXs3.js} +2 -2
- package/dist/web-ui/assets/{useCopyToast-B_Qvf_Pf.js → useCopyToast-OBVjElCH.js} +1 -1
- package/dist/web-ui/assets/{useManagerApi-USNyi1JZ.js → useManagerApi-DoVhcoa7.js} +1 -1
- package/dist/web-ui/assets/{useQuickRangeFilter-DNSnrkx7.js → useQuickRangeFilter-YdXjHGk-.js} +1 -1
- package/dist/web-ui/assets/useToast-Du3Ickw8.js +1 -0
- package/dist/web-ui/index.html +3 -3
- package/package.json +1 -1
- package/dist/web-ui/assets/providers-CkMtur-C.js +0 -1
- package/dist/web-ui/assets/useToast-X_JkPDpr.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{A as e,F as t,I as n,M as r,O as i,P as a,Pt as o,Q as s,Tt as c,V as l,Wt as u,Z as d,a as f,at as ee,bt as p,et as m,fn as h,ht as te,it as g,j as _,k as v,mt as y,nt as b,sn as ne,vt as x,w as S}from"./router-
|
|
1
|
+
import{A as e,F as t,I as n,M as r,O as i,P as a,Pt as o,Q as s,Tt as c,V as l,Wt as u,Z as d,a as f,at as ee,bt as p,et as m,fn as h,ht as te,it as g,j as _,k as v,mt as y,nt as b,sn as ne,vt as x,w as S}from"./router-C6GERXs3.js";import{t as C}from"./useManagerApi-DoVhcoa7.js";import{t as w}from"./providers-CqcnYJca.js";import{n as T,t as E}from"./useCopyToast-OBVjElCH.js";import{n as D,t as re}from"./useQuickRangeFilter-YdXjHGk-.js";import{d as O,f as k,i as A,l as j,n as M,r as N}from"./format-CPPf8IfM.js";x();function ie(e){let{loadError:t,run:n}=T(e),r=c(null);function i(e){let t=async()=>{let i=await n(e);return i?r.value===t&&(r.value=null):r.value=t,i};return t}function a(e){n(r.value??e)}return{loadError:t,track:i,retry:a}}l(),x(),u();var ae={class:`flex-col-gap`},oe={class:`kv-grid`},se={class:`kv-label`},ce={class:`kv-value`},le=[`onClick`],ue={class:`kv-item kv-span-2`},de={class:`kv-value`},fe={key:1,class:`kv-unit`},pe={class:`kv-item`},me={class:`kv-value`},he={class:`kv-unit`},ge={class:`kv-item`},_e={class:`kv-value`},ve={class:`flex-between card-header-wrap`},ye={class:`flex-gap-8`},be={class:`usage-grid`},xe={class:`usage-cell`},Se={class:`usage-num orange`},Ce={class:`usage-cell`},we={class:`usage-num blue`},Te={class:`usage-cell`},Ee={class:`usage-num green`},De={class:`usage-cell`},Oe={class:`usage-num purple`},ke={class:`usage-cell`},Ae={class:`usage-num purple`},je={key:0,class:`usage-cell`},Me={class:`usage-num gray`},Ne={class:`usage-cell`},Pe={class:`usage-num blue`},Fe={class:`usage-cell`},Ie=[`title`],Le={class:`usage-cell`},Re=[`title`],ze={key:0},Be=[`onClick`],Ve=[`title`],He=[`title`],P=n({__name:`DashboardView`,setup(n){let l=w(),{copyWithToast:u}=E(),{loadError:x,track:T,retry:P}=ie(),Ue={local:`本机 API 地址`,lan:`局域网地址`,other:`API 地址`},F=c(null),I=c(!0),L=c(``),{rangeKey:R,dateRange:z,onRangeChange:We}=re(()=>B(),`today`),Ge=()=>{R.value=``,B()},Ke=i(()=>{let e=new Set;for(let t of l.suppliers)for(let n of t.models)e.add(n.modelName);if(F.value?.models)for(let t of F.value.models)e.add(t.model);return[...e].sort()}),qe=D(),B=T(async()=>{let e=qe();I.value=!0;try{let t=new URLSearchParams;L.value&&t.set(`model`,L.value),z.value?.length===2&&(t.set(`startDate`,z.value[0]),t.set(`endDate`,z.value[1]));let n=t.toString(),r=await f.get(`/api/usage${n?`?${n}`:``}`);if(!e())return;F.value=r}catch(t){if(!e())return;throw t}finally{e()&&(I.value=!1)}}),Je=D(),V=T(async()=>{let e=Je();try{await Promise.all([B(),l.loadProviders()])}catch(t){if(!e())return;throw t}finally{e()&&(I.value=!1)}}),Ye=()=>P(V),H=window.location.hostname,U=Number(window.location.port)||null,W=i(()=>A({protocol:window.location.protocol,hostname:H,port:U})),G=c(null),K=c(null),q=c(!1),J=c(!0),Y=c(Date.now()),X=c(null),Z=c([]),Q=i(()=>X.value??U),Xe=e=>A({protocol:`http:`,hostname:e,port:Q.value}),Ze=i(()=>H===`127.0.0.1`||H===`::1`||H===`localhost`?`local`:Z.value.includes(H)?`lan`:`other`),$=i(()=>Q.value?Z.value.map(Xe).filter(e=>e!==W.value):[]),Qe=i(()=>{let e=Q.value?Xe(`127.0.0.1`):``;return e!==``&&e!==W.value?e:``}),$e=i(()=>{let e=[];return Ze.value===`lan`?e.push({label:`局域网地址`,values:[W.value,...$.value]}):(e.push({label:Ue[Ze.value],values:[W.value]}),$.value.length>0&&e.push({label:`局域网地址`,values:$.value})),Qe.value!==``&&e.push({label:`本机 API 地址`,values:[Qe.value]}),e.map((t,n)=>({...t,span2:e.length%2==1&&n===e.length-1}))}),et=async()=>{let[e,t]=await Promise.allSettled([C.processes(),f.get(`/api/status`)]);if(J.value=!1,e.status===`fulfilled`&&(G.value=e.value[0]??null),t.status===`rejected`){K.value=null,q.value=!0;return}let n=t.value?.masterKey;K.value=typeof n==`string`?n:null,q.value=typeof n!=`string`;let r=t.value?.listenPort;X.value=typeof r==`number`&&r>0?r:null;let i=t.value?.lanAddresses;Z.value=Array.isArray(i)?i.filter(e=>typeof e==`string`):[],Y.value=Date.now()},tt=e=>{if(!e.startedAt)return`-`;let t=Math.max(0,Math.floor((Y.value-e.startedAt)/1e3)),n=Math.floor(t/86400);t-=n*86400;let r=Math.floor(t/3600);t-=r*3600;let i=Math.floor(t/60);return t-=i*60,[n?`${n}天`:``,r?`${r}时`:``,i?`${i}分`:``,`${t}秒`].filter(Boolean).join(` `)},nt=i(()=>q.value?`获取失败,请刷新重试`:K.value===null?`-`:`未设置(/v1 免鉴权)`),rt;return d(()=>{V(),et(),rt=window.setInterval(et,1e4)}),s(()=>window.clearInterval(rt)),(n,i)=>{let s=g(`el-button`),c=g(`el-alert`),l=g(`el-card`),d=g(`el-option`),f=g(`el-select`),C=g(`el-date-picker`),w=g(`el-table-column`),T=g(`el-table`),E=g(`el-empty`),D=ee(`loading`);return m(),r(`div`,ae,[o(x)?(m(),e(c,{key:0,title:o(x),type:`error`,"show-icon":``,closable:!1},{default:y(()=>[t(s,{size:`small`,onClick:Ye},{default:y(()=>[...i[4]||=[a(`重试`,-1)]]),_:1})]),_:1},8,[`title`])):_(``,!0),t(l,{shadow:`never`},{header:y(()=>[...i[5]||=[v(`span`,{class:`fw-600`},`服务信息`,-1)]]),default:y(()=>[te((m(),r(`div`,oe,[(m(!0),r(S,null,b($e.value,e=>(m(),r(`div`,{key:e.label+e.values[0],class:ne([`kv-item`,{"kv-span-2":e.span2}])},[v(`div`,se,h(e.label),1),v(`div`,ce,[(m(!0),r(S,null,b(e.values,e=>(m(),r(`div`,{key:e},[v(`span`,{class:`copy-text`,onClick:t=>o(u)(e)},h(e),9,le)]))),128))])],2))),128)),v(`div`,ue,[i[6]||=v(`div`,{class:`kv-label`},`API 密钥`,-1),v(`div`,de,[K.value?(m(),r(`span`,{key:0,class:`copy-text`,onClick:i[0]||=e=>o(u)(K.value)},h(K.value),1)):_(``,!0),K.value?(m(),r(`span`,fe,`(/v1 需 Bearer 认证)`)):(m(),r(S,{key:2},[a(h(nt.value),1)],64))])]),v(`div`,pe,[i[9]||=v(`div`,{class:`kv-label`},`运行状态`,-1),v(`div`,me,[G.value?(m(),r(S,{key:0},[i[7]||=v(`span`,{class:`status-dot running`},null,-1),i[8]||=a(`运行中 `,-1),v(`span`,he,`PID `+h(G.value.pid??`-`),1)],64)):(m(),r(S,{key:1},[a(`-`)],64))])]),v(`div`,ge,[i[10]||=v(`div`,{class:`kv-label`},`运行时长`,-1),v(`div`,_e,h(G.value?tt(G.value):`-`),1)])])),[[D,I.value||J.value]])]),_:1}),F.value?(m(),e(l,{key:1,shadow:`never`},{header:y(()=>[v(`div`,ve,[i[12]||=v(`span`,{class:`fw-600`},`用量统计`,-1),v(`div`,ye,[t(f,{modelValue:L.value,"onUpdate:modelValue":i[1]||=e=>L.value=e,placeholder:`全部模型`,clearable:``,filterable:``,style:{width:`220px`},onChange:o(B)},{default:y(()=>[(m(!0),r(S,null,b(Ke.value,t=>(m(),e(d,{key:t,label:t,value:t},null,8,[`label`,`value`]))),128))]),_:1},8,[`modelValue`,`onChange`]),t(f,{modelValue:o(R),"onUpdate:modelValue":i[2]||=e=>p(R)?R.value=e:null,placeholder:`时间范围`,clearable:``,style:{width:`130px`},onChange:o(We)},{default:y(()=>[t(d,{label:`今天`,value:`today`}),t(d,{label:`昨天`,value:`yesterday`}),t(d,{label:`前天`,value:`beforeYesterday`}),t(d,{label:`近三天`,value:`last3days`}),t(d,{label:`本周`,value:`week`}),t(d,{label:`本月`,value:`month`})]),_:1},8,[`modelValue`,`onChange`]),t(C,{modelValue:o(z),"onUpdate:modelValue":i[3]||=e=>p(z)?z.value=e:null,type:`daterange`,"range-separator":`至`,"start-placeholder":`开始日期`,"end-placeholder":`结束日期`,"value-format":`YYYY-MM-DD`,style:{width:`260px`},onChange:Ge},null,8,[`modelValue`]),t(s,{loading:I.value,onClick:o(B)},{default:y(()=>[...i[11]||=[a(`刷新`,-1)]]),_:1},8,[`loading`,`onClick`])])])]),default:y(()=>[v(`div`,be,[v(`div`,xe,[v(`div`,Se,h(o(O)(F.value.total.total_tokens)),1),i[13]||=v(`div`,{class:`usage-label`},`总 Token`,-1)]),v(`div`,Ce,[v(`div`,we,h(o(O)(F.value.total.input_tokens)),1),i[14]||=v(`div`,{class:`usage-label`},`输入 Token`,-1)]),v(`div`,Te,[v(`div`,Ee,h(o(O)(F.value.total.output_tokens)),1),i[15]||=v(`div`,{class:`usage-label`},`输出 Token`,-1)]),v(`div`,De,[v(`div`,Oe,h(o(O)(F.value.total.cache_read_tokens)),1),i[16]||=v(`div`,{class:`usage-label`},`缓存读取`,-1)]),v(`div`,ke,[v(`div`,Ae,h(F.value.total.cache_rate==null?`-`:F.value.total.cache_rate+`%`),1),i[17]||=v(`div`,{class:`usage-label`},`缓存命中率`,-1)]),F.value.logStorageMB==null?_(``,!0):(m(),r(`div`,je,[v(`div`,Me,h(F.value.logStorageMB),1),i[18]||=v(`div`,{class:`usage-label`},`数据目录占用 (MB)`,-1)])),v(`div`,Ne,[v(`div`,Pe,h(o(j)(F.value.total.avg_duration)),1),i[19]||=v(`div`,{class:`usage-label`},`平均耗时`,-1)]),v(`div`,Fe,[v(`div`,{class:`usage-num blue`,title:o(N)},h(o(j)(F.value.total.avg_ttft)),9,Ie),i[20]||=v(`div`,{class:`usage-label`},`平均首 Token`,-1)]),v(`div`,Le,[v(`div`,{class:`usage-num green`,title:o(M)},h(o(k)(F.value.total.tps)),9,Re),i[21]||=v(`div`,{class:`usage-label`},`平均生成速度`,-1)])]),F.value.models?.length?(m(),r(`div`,ze,[i[22]||=v(`div`,{class:`section-title`},`模型用量`,-1),t(T,{data:F.value.models,stripe:``,class:`full-width`},{default:y(()=>[t(w,{prop:`model`,label:`模型`,"min-width":`200`},{default:y(({row:e})=>[v(`span`,{class:`copy-text`,onClick:t=>o(u)(e.model)},h(e.model),9,Be)]),_:1}),t(w,{label:`调用次数`,width:`90`,align:`center`},{default:y(({row:e})=>[a(h(e.calls),1)]),_:1}),t(w,{label:`平均耗时`,width:`110`,align:`center`},{default:y(({row:e})=>[a(h(o(j)(e.avg_duration)),1)]),_:1}),t(w,{label:`速度`,width:`130`,align:`center`},{default:y(({row:e})=>[v(`div`,{title:o(M)},h(o(k)(e.tps)),9,Ve),e.avg_ttft==null?_(``,!0):(m(),r(`div`,{key:0,class:`cell-sub`,title:o(N)},` 首 `+h(o(j)(e.avg_ttft)),9,He))]),_:1}),t(w,{label:`总 Token`,width:`140`,align:`center`},{default:y(({row:e})=>[a(h(o(O)(e.total_tokens)),1)]),_:1}),t(w,{label:`输入 Token`,width:`140`,align:`center`},{default:y(({row:e})=>[a(h(o(O)(e.input_tokens)),1)]),_:1}),t(w,{label:`输出 Token`,width:`140`,align:`center`},{default:y(({row:e})=>[a(h(o(O)(e.output_tokens)),1)]),_:1}),t(w,{label:`缓存读取`,width:`130`,align:`center`},{default:y(({row:e})=>[a(h(o(O)(e.cache_read_tokens)),1)]),_:1}),t(w,{label:`缓存命中率`,width:`110`,align:`center`},{default:y(({row:e})=>[a(h(e.cache_rate==null?`-`:e.cache_rate+`%`),1)]),_:1})]),_:1},8,[`data`])])):(m(),e(E,{key:1,description:`暂无调用记录`,"image-size":60}))]),_:1})):_(``,!0)])}}});export{P as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{A as e,F as t,I as n,M as r,O as i,P as a,Pt as o,Tt as s,V as c,Wt as l,Z as u,at as d,et as f,fn as p,ht as m,i as h,it as g,j as _,k as v,l as y,lt as b,mt as x,n as S,o as C,u as w,vt as T,w as E}from"./router-
|
|
1
|
+
import{A as e,F as t,I as n,M as r,O as i,P as a,Pt as o,Tt as s,V as c,Wt as l,Z as u,at as d,et as f,fn as p,ht as m,i as h,it as g,j as _,k as v,l as y,lt as b,mt as x,n as S,o as C,u as w,vt as T,w as E}from"./router-C6GERXs3.js";import{m as D}from"./message-t8lJfFLj.js";import{n as O,t as k}from"./index-B5mLXy9e.js";import{n as A,t as j}from"./useManagerApi-DoVhcoa7.js";import{t as M}from"./useToast-Du3Ickw8.js";import{t as N}from"./updateNote-CttDt8SZ.js";c(),l(),T();var P={class:`check-body`},F={class:`version-row`},I={class:`version-row`},L={class:`muted-sm`},R=k(n({__name:`UpdateCheckDialog`,props:{modelValue:{type:Boolean,default:!1},modelModifiers:{}},emits:[`update:modelValue`],setup(n){let{toast:o}=M(),c=b(n,`modelValue`),l=s(!1),u=s(!1),y=s(null),S=s(null),C=i(()=>h.value?.buildSource===`local`),w=s(null),T=s(null),D=null,k=()=>D?.abort(),R=e=>new Date(e).toLocaleString(),z=e=>`https://www.npmjs.com/package/ezllm/v/${e}`,B=async()=>{S.value=null,w.value=null,T.value=null,l.value=!0;try{let e=await j.update();if(y.value=e,!e.supported)return;S.value=await j.checkUpdate()}catch(e){w.value=e.message||`检查更新失败`}finally{l.value=!1}},V=async()=>{if(!S.value)return;let e=S.value.latestVersion;try{await O.confirm(`确定更新到 ${e}?服务会自动重启并在启动时安装新版本:重启期间管理台短暂不可访问(预计 1~3 分钟),完成后自动恢复。`,`立即更新`,{confirmButtonText:`立即更新`,cancelButtonText:`取消`,type:`warning`})}catch{return}u.value=!0;let t=new AbortController;D=t;try{let e=await j.update(),n=await j.applyUpdate();if(!n.updated){T.value=`已是最新版本 ${n.fromVersion}`,S.value={hasUpdate:!1,currentVersion:n.fromVersion,latestVersion:n.fromVersion,checkedAt:Date.now()};return}T.value=`正在重启服务并安装 ${n.toVersion}(预计 1~3 分钟):重启期间管理台短暂不可访问,完成后这里会自动显示结果。`;let r=await A({targetVersion:n.toVersion,sinceAppliedAt:e.lastApply?.appliedAt??null,signal:t.signal});if(t.signal.aborted)return;r&&!r.error?(o(`已更新到 ${r.toVersion}`,`success`),T.value=`已更新 ${r.fromVersion} → ${r.toVersion},服务已在新版本上运行。`,S.value={hasUpdate:!1,currentVersion:r.toVersion,latestVersion:r.toVersion,checkedAt:Date.now()}):r?.error?(o(`更新失败:${r.error}`,`error`),T.value=N(r.error)):T.value=`更新仍在进行(安装耗时较长):稍后刷新页面查看最新状态。`}catch(e){o(e.message||`更新失败`,`error`)}finally{u.value=!1,D===t&&(D=null)}};return(n,i)=>{let o=g(`el-alert`),s=g(`el-tag`),h=g(`el-link`),b=g(`el-button`),D=g(`el-dialog`),O=d(`loading`);return f(),e(D,{modelValue:c.value,"onUpdate:modelValue":i[2]||=e=>c.value=e,title:`检查更新`,width:`420px`,"close-on-click-modal":!u.value,onOpen:B,onClose:k},{footer:x(()=>[S.value?.hasUpdate?(f(),e(b,{key:0,type:`primary`,loading:u.value,onClick:V},{default:x(()=>[a(p(u.value?`更新中...`:`立即更新`),1)]),_:1},8,[`loading`])):_(``,!0),t(b,{onClick:i[1]||=e=>c.value=!1},{default:x(()=>[...i[11]||=[a(`关闭`,-1)]]),_:1})]),default:x(()=>[m((f(),r(`div`,P,[y.value&&!y.value.supported?(f(),e(o,{key:0,title:`当前为源码运行模式,更新功能不可用`,type:`info`,"show-icon":``,closable:!1},{default:x(()=>[...i[3]||=[v(`div`,{class:`alert-hint`},[a(` 仅通过 npx ezllm install 装配的实例支持更新检查。本地开发用仓库里的 `),v(`code`,null,`pnpm upgrade:local`),a(` 更新运行中的服务。 `)],-1)]]),_:1})):S.value?(f(),r(E,{key:1},[v(`div`,F,[i[5]||=v(`span`,{class:`version-label`},`当前版本`,-1),t(s,{size:`small`},{default:x(()=>[a(p(S.value.currentVersion),1)]),_:1}),C.value?(f(),e(s,{key:0,type:`warning`,size:`small`,"disable-transitions":``},{default:x(()=>[...i[4]||=[a(`本地构建`,-1)]]),_:1})):_(``,!0)]),v(`div`,I,[i[6]||=v(`span`,{class:`version-label`},`最新版本`,-1),t(s,{type:S.value.hasUpdate?`warning`:`success`,size:`small`,"disable-transitions":``},{default:x(()=>[a(p(S.value.latestVersion),1)]),_:1},8,[`type`])]),t(o,{title:S.value.hasUpdate?`发现新版本 ${S.value.latestVersion}(当前 ${S.value.currentVersion})`:`已是最新版本 ${S.value.currentVersion}`,type:S.value.hasUpdate?`warning`:`success`,"show-icon":``,closable:!1,class:`mt-12`},null,8,[`title`,`type`]),v(`div`,L,[a(` 检查时间:`+p(R(S.value.checkedAt))+` `,1),S.value.hasUpdate?(f(),r(E,{key:0},[i[8]||=a(` · `,-1),t(h,{type:`primary`,href:z(S.value.latestVersion),target:`_blank`},{default:x(()=>[...i[7]||=[a(`在 npm 查看该版本`,-1)]]),_:1},8,[`href`])],64)):_(``,!0)])],64)):!l.value&&w.value?(f(),e(o,{key:2,title:w.value,type:`error`,"show-icon":``,closable:!1},{default:x(()=>[i[10]||=v(`div`,{class:`alert-hint`},` 检查需访问 npm 源,可能是网络不可达或版本号解析失败;稍后重试即可。 `,-1),t(b,{size:`small`,class:`mt-8`,onClick:B},{default:x(()=>[...i[9]||=[a(`重试`,-1)]]),_:1})]),_:1},8,[`title`])):_(``,!0)])),[[O,l.value]]),T.value?(f(),e(o,{key:0,title:T.value,type:`info`,"show-icon":``,class:`mt-12`,onClose:i[0]||=e=>T.value=null},null,8,[`title`])):_(``,!0)]),_:1},8,[`modelValue`,`close-on-click-modal`])}}}),[[`__scopeId`,`data-v-5e671468`]]);c(),l(),T();var z={class:`layout`},B=[`title`],V={key:0,class:`header-version-tag`},H={class:`header-nav`},U={class:`header-actions`},W={class:`user-chip`},G={class:`user-avatar`},K={class:`user-name`},q={class:`main`},J={class:`page`},Y=k(n({__name:`LayoutView`,setup(n){let c=y(),l=w(),d=s(!1);u(()=>{S()});let m=i(()=>h.value?.version||``),b=i(()=>h.value?.buildSource===`local`),T=i(()=>b.value?`本地构建版本(upgrade:local 产物)`:`当前运行版本`),E=i(()=>h.value?.authRequired!==!1),O=i(()=>{if(!E.value)return`免登录`;let e=localStorage.getItem(`webui_token`)||``;try{return atob(e).split(`:`)[0]||`用户`}catch{return`用户`}}),k=i(()=>{let e=c.path;return e===`/`?`/`:e.startsWith(`/providers`)?`/providers`:e.startsWith(`/service-status`)?`/service-status`:e.startsWith(`/managed-services`)?`/managed-services`:e.startsWith(`/settings`)?`/settings`:e.startsWith(`/logs`)?`/logs`:`/`}),A=e=>{e===`logout`&&(C(),l.push(`/login`)),e===`check-update`&&(d.value=!0)};return(n,i)=>{let s=g(`el-menu-item`),c=g(`el-menu`),l=g(`el-icon`),u=g(`el-dropdown-item`),h=g(`el-dropdown-menu`),y=g(`el-dropdown`),S=g(`el-header`),C=g(`router-view`);return f(),r(`div`,z,[t(S,{class:`header`},{default:x(()=>[i[10]||=v(`div`,{class:`brand`},[v(`span`,{class:`brand-mark`},`EZ`),v(`h1`,null,`LLM`)],-1),m.value?(f(),r(`span`,{key:0,class:`header-version`,title:T.value},[a(` v`+p(m.value),1),b.value?(f(),r(`span`,V,`本地构建`)):_(``,!0)],8,B)):_(``,!0),v(`nav`,H,[t(c,{mode:`horizontal`,"default-active":k.value,ellipsis:!1,router:``,class:`header-menu`},{default:x(()=>[t(s,{index:`/`},{default:x(()=>[...i[1]||=[a(`首页`,-1)]]),_:1}),t(s,{index:`/providers`},{default:x(()=>[...i[2]||=[a(`供应商管理`,-1)]]),_:1}),t(s,{index:`/service-status`},{default:x(()=>[...i[3]||=[a(`服务状态`,-1)]]),_:1}),t(s,{index:`/managed-services`},{default:x(()=>[...i[4]||=[a(`托管服务`,-1)]]),_:1}),t(s,{index:`/plugins`},{default:x(()=>[...i[5]||=[a(`插件`,-1)]]),_:1}),t(s,{index:`/logs`},{default:x(()=>[...i[6]||=[a(`日志`,-1)]]),_:1}),t(s,{index:`/settings`},{default:x(()=>[...i[7]||=[a(`设置`,-1)]]),_:1})]),_:1},8,[`default-active`])]),v(`div`,U,[t(y,{trigger:`click`,onCommand:A,class:`ml-12`},{dropdown:x(()=>[t(h,null,{default:x(()=>[t(u,{command:`check-update`},{default:x(()=>[...i[8]||=[a(`检查更新`,-1)]]),_:1}),E.value?(f(),e(u,{key:0,command:`logout`,divided:``},{default:x(()=>[...i[9]||=[a(`退出`,-1)]]),_:1})):_(``,!0)]),_:1})]),default:x(()=>[v(`div`,W,[v(`span`,G,p(O.value.charAt(0).toUpperCase()),1),v(`span`,K,p(O.value),1),t(l,{class:`el-icon--right`},{default:x(()=>[t(o(D))]),_:1})])]),_:1})])]),_:1}),v(`main`,q,[v(`div`,J,[t(C)])]),t(R,{modelValue:d.value,"onUpdate:modelValue":i[0]||=e=>d.value=e},null,8,[`modelValue`])])}}}),[[`__scopeId`,`data-v-4e7e0e0d`]]);export{Y as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{A as e,F as t,I as n,M as r,P as i,S as a,Tt as o,V as s,a as c,c as l,et as u,it as d,j as f,k as p,m,mt as h,u as g,vt as _,x as v}from"./router-
|
|
1
|
+
import{A as e,F as t,I as n,M as r,P as i,S as a,Tt as o,V as s,a as c,c as l,et as u,it as d,j as f,k as p,m,mt as h,u as g,vt as _,x as v}from"./router-C6GERXs3.js";import{t as y}from"./index-B5mLXy9e.js";s(),m(),_();var b={class:`login-wrap`},x=y(n({__name:`LoginView`,setup(n){let s=g(),m=o(``),_=o(``),y=o(``),x=o(!1);async function S(){if(!m.value){y.value=`请输入用户名`;return}if(!_.value){y.value=`请输入密码`;return}x.value=!0,y.value=``;try{let e=await c.post(`/api/auth/login`,{username:m.value.trim(),password:_.value});l(e.token),s.push(`/`)}catch(e){y.value=e.message||`登录失败`}finally{x.value=!1}}return(n,o)=>{let s=d(`el-input`),c=d(`el-form-item`),l=d(`el-alert`),g=d(`el-button`),C=d(`el-form`),w=d(`el-card`);return u(),r(`div`,b,[t(w,{shadow:`never`,class:`login-card`},{default:h(()=>[o[3]||=p(`div`,{class:`login-brand`},[p(`span`,{class:`brand-mark`},`EZ`),p(`span`,{class:`login-title`},`LLM`)],-1),o[4]||=p(`p`,{class:`login-sub`},`本地 LLM 网关 · 管理台登录`,-1),t(C,{"label-position":`top`,onSubmit:a(S,[`prevent`])},{default:h(()=>[t(c,{label:`用户名`},{default:h(()=>[t(s,{modelValue:m.value,"onUpdate:modelValue":o[0]||=e=>m.value=e,placeholder:`请输入用户名`,onKeyup:v(S,[`enter`])},null,8,[`modelValue`])]),_:1}),t(c,{label:`密码`},{default:h(()=>[t(s,{modelValue:_.value,"onUpdate:modelValue":o[1]||=e=>_.value=e,type:`password`,placeholder:`请输入密码`,"show-password":``,onKeyup:v(S,[`enter`])},null,8,[`modelValue`])]),_:1}),y.value?(u(),e(l,{key:0,title:y.value,type:`error`,"show-icon":``,class:`mb-16`},null,8,[`title`])):f(``,!0),t(g,{type:`primary`,class:`full-width`,loading:x.value,onClick:S},{default:h(()=>[...o[2]||=[i(` 登录 `,-1)]]),_:1},8,[`loading`])]),_:1})]),_:1})])}}}),[[`__scopeId`,`data-v-b3e448fa`]]);export{x as default};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{A as e,Ct as t,F as n,I as r,M as i,O as a,P as o,Pt as s,S as c,Tt as l,V as u,Wt as d,Z as f,a as p,at as ee,bt as m,et as h,fn as g,ft as _,ht as v,it as y,j as b,k as x,m as S,mt as C,nt as w,vt as T,w as E,x as te,xt as D}from"./router-
|
|
1
|
+
import{A as e,Ct as t,F as n,I as r,M as i,O as a,P as o,Pt as s,S as c,Tt as l,V as u,Wt as d,Z as f,a as p,at as ee,bt as m,et as h,fn as g,ft as _,ht as v,it as y,j as b,k as x,m as S,mt as C,nt as w,vt as T,w as E,x as te,xt as D}from"./router-C6GERXs3.js";import{R as O,S as ne}from"./message-t8lJfFLj.js";import{n as k,t as A}from"./index-B5mLXy9e.js";import{t as re}from"./providers-CqcnYJca.js";import{n as j,t as M}from"./useCopyToast-OBVjElCH.js";import{t as N}from"./useToast-Du3Ickw8.js";import{n as P,t as F}from"./useQuickRangeFilter-YdXjHGk-.js";import{C as I,S as L,a as ie,b as R,c as z,d as B,f as V,g as H,h as U,l as W,m as G,n as ae,o as oe,p as K,r as q,s as se,t as ce,x as le}from"./format-CPPf8IfM.js";u(),T(),d();var ue={class:`detail-content`},J={key:0,class:`ip-link`},Y={class:`ip-pop`},X={class:`ip-pop-row`},de={key:0,class:`ip-pop-row`},fe={key:1,class:`ip-pop-error`},pe={key:2},me=[`href`],he={key:1},ge={key:1},_e=[`title`],ve=[`title`],ye={class:`error-text`},be={class:`pane-bar`},Z={class:`json-block`},xe={class:`pane-bar`},Q={class:`json-block`},Se={class:`pane-bar`},Ce={class:`json-block`},$={class:`pane-bar`},we={class:`json-block`},Te={class:`pane-bar`},Ee={class:`json-block`},De={class:`pane-bar`},Oe={class:`json-block`},ke={class:`pane-bar`},Ae={class:`json-block`},je={class:`pane-bar`},Me={class:`json-block`},Ne=A(r({__name:`LogDetailDialog`,setup(t,{expose:r}){let{copyWithToast:c}=M(),{loadError:u,run:d}=j(),f=l(!1),m=l(null),_=l(!1),S=l(`info`),w=l(!1),T=l(null),te=P(),O=e=>{T.value=e,f.value=!0,m.value=null,S.value=`info`;let t=te();_.value=!0,d(async()=>{try{let n=`?id=${String(e.id)}`,r=await p.get(`/api/logs/detail`+n);if(!t())return;if(r&&r.detail){let e={...r.detail,...r.meta};e.response&&=D(e.response),e.request&&=D(e.request),m.value=e}else m.value=r}catch(e){if(!t())return;throw e}finally{t()&&(_.value=!1)}})},ne=()=>{T.value&&O(T.value)};r({open:O});let k=a(()=>K(m.value?.response?.inbound_request)),A=a(()=>K(m.value?.response?.upstream_request)),re=a(()=>U(m.value?.response?.upstream_response_text)),N=a(()=>(m.value?.response?.upstream_stream_frames||[]).join(`
|
|
2
2
|
|
|
3
3
|
`)),F=a(()=>K(m.value?.response?.client_response)),L=a(()=>(m.value?.response?.client_stream_frames||[]).join(`
|
|
4
4
|
|
package/dist/web-ui/assets/{ManagedServicesView-Roep2c1v.js → ManagedServicesView-B6JE5Odv.js}
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{A as e,F as t,I as n,M as r,O as i,P as a,Pt as o,Q as s,Tt as c,V as l,Wt as u,Z as d,at as f,et as p,fn as m,ht as h,it as g,j as _,k as v,mt as y,vt as b,w as x}from"./router-
|
|
1
|
+
import{A as e,F as t,I as n,M as r,O as i,P as a,Pt as o,Q as s,Tt as c,V as l,Wt as u,Z as d,at as f,et as p,fn as m,ht as h,it as g,j as _,k as v,mt as y,vt as b,w as x}from"./router-C6GERXs3.js";import{W as S}from"./message-t8lJfFLj.js";import{n as C,t as w}from"./index-B5mLXy9e.js";import{t as T}from"./useManagerApi-DoVhcoa7.js";import{n as E,t as D}from"./useCopyToast-OBVjElCH.js";import{t as O}from"./useToast-Du3Ickw8.js";import{m as k}from"./format-CPPf8IfM.js";l(),u(),b();var A={class:`form-hint`},j={key:1,class:`form-hint form-hint--block`},M=w(n({__name:`ManagedServiceModal`,props:{editingName:{},service:{}},emits:[`close`,`saved`],setup(n,{emit:o}){let s=n,l=o,{toast:u}=O(),d=c(),f=c(!1),h=c(!0),b=i(()=>s.service?.pid!=null),S=c({name:s.service?.name??``,exec:s.service?.exec??``,cwd:s.service?.cwd??``,autostart:s.service?.autostart??!0}),C=c((s.service?.args??[]).join(`
|
|
2
2
|
`)),w={name:[{required:!0,message:`请填写服务名`,trigger:`blur`},{pattern:/^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/,message:`只能用字母、数字、点、下划线、短横线(字母或数字开头,不超过 64 个字符)`,trigger:`blur`}],cwd:[{required:!0,message:`请填写工作目录`,trigger:`blur`}]},E=async()=>{let e=e=>e.split(`
|
|
3
3
|
`).map(e=>e.trim()).filter(e=>e!==``);if(!await d.value?.validate().catch(()=>!1)){u(`请补全标红的必填项`,`error`);return}let t={name:S.value.name.trim(),exec:S.value.exec.trim(),args:e(C.value),cwd:S.value.cwd.trim(),autostart:S.value.autostart};b.value||(t.start=h.value),f.value=!0;try{s.editingName===null?(await T.createManagedService(t),u(t.start?`服务已添加并启动`:`服务已添加`,`success`)):(await T.updateManagedService(s.editingName,t),u(b.value?`已保存,服务正按新配置重启`:`已保存`,`success`)),l(`saved`)}catch(e){u(e.message||`保存失败`,`error`)}finally{f.value=!1}};return(i,o)=>{let s=g(`el-input`),c=g(`el-form-item`),u=g(`el-switch`),T=g(`el-form`),D=g(`el-button`),O=g(`el-dialog`);return p(),e(O,{"model-value":!0,title:n.editingName?`编辑托管服务`:`添加托管服务`,width:`720px`,top:`6vh`,"align-center":``,"close-on-click-modal":!1,onClose:o[7]||=e=>l(`close`)},{footer:y(()=>[t(D,{disabled:f.value,onClick:o[6]||=e=>l(`close`)},{default:y(()=>[...o[13]||=[a(`取消`,-1)]]),_:1},8,[`disabled`]),t(D,{type:`primary`,loading:f.value,onClick:E},{default:y(()=>[a(m(f.value?`保存中...`:n.editingName?`保存`:`添加服务`),1)]),_:1},8,[`loading`])]),default:y(()=>[t(T,{ref_key:`formRef`,ref:d,model:S.value,rules:w,"label-position":`top`},{default:y(()=>[t(c,{label:`服务名`,prop:`name`},{default:y(()=>[t(s,{modelValue:S.value.name,"onUpdate:modelValue":o[0]||=e=>S.value.name=e,disabled:n.editingName!==null,placeholder:`如 codebuddy-cpa(字母数字开头,可用 . _ -)`},null,8,[`modelValue`,`disabled`]),v(`div`,A,[o[8]||=a(` 名称用于日志文件名(logs/out-<名称>.log)与进程标识;`,-1),n.editingName===null?_(``,!0):(p(),r(x,{key:0},[a(`编辑时不可修改(改名请删除后重新添加)。`)],64))])]),_:1}),t(c,{label:`工作目录`,prop:`cwd`},{default:y(()=>[t(s,{modelValue:S.value.cwd,"onUpdate:modelValue":o[1]||=e=>S.value.cwd=e,placeholder:`如 E:\\gitee\\codebuddy-cpa(服务的运行目录)`},null,8,[`modelValue`]),o[9]||=v(`div`,{class:`form-hint`},`服务在此目录下启动;保存时会校验目录是否存在。`,-1)]),_:1}),t(c,{label:`可执行文件`},{default:y(()=>[t(s,{modelValue:S.value.exec,"onUpdate:modelValue":o[2]||=e=>S.value.exec=e,placeholder:`留空 = 使用 ezllm 主进程的 Node;也可填 npm.cmd 或绝对路径`},null,8,[`modelValue`]),o[10]||=v(`div`,{class:`form-hint`},` 留空时用主进程的 Node 直接运行下方参数(第一个参数通常是脚本相对工作目录的路径)。 Windows 上 .cmd / .bat / 无扩展名的命令(如 npm)会自动经 cmd.exe 执行;其他平台直接执行。 `,-1)]),_:1}),t(c,{label:`参数`},{default:y(()=>[t(s,{modelValue:C.value,"onUpdate:modelValue":o[3]||=e=>C.value=e,type:`textarea`,rows:3,placeholder:`每行一个参数,如:
|
|
4
4
|
src/proxy.js
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{A as e,F as t,I as n,M as r,O as i,P as a,Pt as o,Tt as s,V as c,Wt as l,Z as u,et as d,fn as f,it as p,j as m,k as h,m as g,mt as _,nt as v,s as ee,vt as y,w as b,x as te}from"./router-
|
|
1
|
+
import{A as e,F as t,I as n,M as r,O as i,P as a,Pt as o,Tt as s,V as c,Wt as l,Z as u,et as d,fn as f,it as p,j as m,k as h,m as g,mt as _,nt as v,s as ee,vt as y,w as b,x as te}from"./router-C6GERXs3.js";import{W as ne}from"./message-t8lJfFLj.js";import{n as x,t as S}from"./index-B5mLXy9e.js";import{t as re}from"./useManagerApi-DoVhcoa7.js";import{n as C,t as ie}from"./providers-CqcnYJca.js";import{t as ae}from"./useToast-Du3Ickw8.js";async function w(e,t={}){return await ee.post(`/api/fetch`,{url:e,...t})}async function T(e,t){if(e.binary)throw Error(`${t} 返回二进制内容(${e.contentType||`无 content-type`}),不是 JSON`);let n=e.body;if(e.status<200||e.status>=300){let t=(n??``).trim().slice(0,300);throw Error(`上游返回 HTTP ${String(e.status)}${t===``?``:`:${t}`}`)}if(n===null||n.trim()===``)throw Error(`上游返回空响应体(HTTP ${String(e.status)},${e.contentType||`无 content-type`})`);try{return JSON.parse(n)}catch{throw Error(`上游响应不是 JSON(HTTP ${String(e.status)},${e.contentType||`无 content-type`}):`+n.trim().slice(0,300))}}function E(e,t){return`http://127.0.0.1:${String(e)}${t.startsWith(`/`)?t:`/${t}`}`}async function D(e,t={}){return await T(await w(e,{method:`GET`,...t}),e)}async function oe(e,t,n=`POST`){return await T(await w(e,{method:n,body:t}),e)}async function se(e){return await T(await w(e,{method:`DELETE`}),e)}y();var O=`https://raw.githubusercontent.com/magpie-community/plugins/main/registry.json`,k=[`https://gh-proxy.com/${O}`,`https://ghfast.top/${O}`,O],ce=1e4,A=`plugin_market_cache`,j=1,le=216e5,ue=36e5,de=[`provider`];function fe(){try{let e=localStorage.getItem(A);if(e===null)return null;let t=JSON.parse(e);if(t.version!==j||!Array.isArray(t.entries))return null;let n=t.fetchedAt;return n===void 0||typeof n.at!=`number`?null:{version:j,entries:t.entries.filter(pe),fetchedAt:n}}catch{return null}}function M(e,t){try{let n={version:j,entries:e,fetchedAt:t};localStorage.setItem(A,JSON.stringify(n))}catch{}}function N(e){return typeof e==`string`&&e.trim()!==``?e.trim():null}function P(e){if(typeof e!=`object`||!e||Array.isArray(e))return null;let t=e;return N(t.zh)??N(t.en)}function F(e){switch(e){case`provider`:case`middleware`:case`agent`:case`tools`:case`page`:return e;default:return`provider`}}function I(e){return de.includes(e)}function pe(e){if(typeof e!=`object`||!e)return!1;let t=e.kind;return typeof t==`string`&&I(t)}function me(e){let t=N(e.package);if(t===null)return null;let n=Array.isArray(e.providers)?e.providers.filter(e=>typeof e==`string`):[];return{package:t,name:N(e.name)??t,icon:N(e.icon),providers:n,community:N(e.community),summary:P(e.summary),kind:F(e.kind),replaces:N(e.replaces),version:null,license:null,description:null,homepage:null,weeklyDownloads:null}}var L=new Map,he=new Map;async function R(e){let t=L.get(e);if(t!==void 0&&Date.now()-t.at<ue)return t.meta;try{let t=await D(`https://registry.npmjs.org/${encodeURIComponent(e)}`),n={version:N(t[`dist-tags`]?.latest),license:N(t.license),description:N(t.description),homepage:N(t.homepage)};return L.set(e,{at:Date.now(),meta:n}),n}catch{return{version:null,license:null,description:null,homepage:null}}}async function ge(e){let t=he.get(e);if(t!==void 0&&Date.now()-t.at<ue)return t.downloads;try{let t=await D(`https://api.npmjs.org/downloads/point/last-week/${encodeURIComponent(e)}`),n=typeof t.downloads==`number`?t.downloads:null;return he.set(e,{at:Date.now(),downloads:n}),n}catch{return null}}async function _e(){let e=[];for(let t of k)try{let e=await D(t,{timeoutMs:ce});return t!==k[0]&&C(`[plugin-market] 清单改由备用源取到:${t}`),{registry:e,source:t}}catch(n){let r=n instanceof Error?n.message:String(n);e.push(`${t} → ${r}`)}throw Error(`插件清单取不到(已试 ${String(k.length)} 个源):\n${e.join(`
|
|
2
2
|
`)}`)}async function ve(e){let{registry:t,source:n}=await _e(),r=t.plugins;if(!Array.isArray(r))throw Error(`清单格式不是预期形状(缺 plugins 数组):${O}`);let i=r.map(e=>typeof e==`object`&&e?me(e):null).filter(pe).sort((e,t)=>e.package.localeCompare(t.package)),a=0;return await Promise.all(i.map(async t=>{let[n,r]=await Promise.all([R(t.package),ge(t.package)]);Object.assign(t,n,{weeklyDownloads:r}),a+=1,e?.(a,i.length)})),{entries:i,source:n}}var z=s([]),ye=s(!1),B=s(null),V=s({loaded:0,total:0}),H=s(null),U=s(!1),W=null;function be(e,t){JSON.stringify(e)!==JSON.stringify(z.value)&&(z.value=e),H.value=t,M(e,t)}async function G(e={}){let t=e.force===!0,n=z.value.length===0?fe():null;n!==null&&(z.value=n.entries,H.value=n.fetchedAt);let r=z.value.length>0,i=H.value,a=i!==null&&Date.now()-i.at<le;if(!(!t&&r&&a)){if(W!==null){if(t)await W;else return}if(t||!r){ye.value=!0,U.value=!1,V.value={loaded:0,total:0};try{let e=await ve((e,t)=>{V.value={loaded:e,total:t}});be(e.entries,{source:e.source,at:Date.now()}),B.value=null}catch(e){B.value=`插件市场清单加载失败:${e instanceof Error?e.message:String(e)}`}finally{ye.value=!1}return}U.value=!0,W=(async()=>{try{let e=await ve();be(e.entries,{source:e.source,at:Date.now()}),B.value=null,U.value=!1}catch(e){C(`[plugin-market] 后台刷新失败,继续用缓存:${e instanceof Error?e.message:String(e)}`)}finally{W=null}})()}}function xe(){return{entries:z,loading:ye,marketError:B,progress:V,fetchedAt:H,stale:U,loadMarket:G}}var Se=[`127.0.0.1`,`localhost`,`[::1]`,`::1`],K=`plugin-host`;function q(e){if(e===void 0||e.trim()===``)return null;let t;try{t=new URL(e.trim())}catch{return null}if(!Se.includes(t.hostname.toLowerCase()))return null;let n=/^\/p\/([^/]+)\/?$/.exec(t.pathname);if(n===null)return null;try{return decodeURIComponent(n[1]??``)||null}catch{return null}}function Ce(e,t){return`http://127.0.0.1:${String(e)}/p/${encodeURIComponent(t)}`}function we(e){let t=e.toLowerCase().replace(/[^a-z0-9]+/g,`-`).replace(/^-+|-+$/g,``);return t===``?`plugin`:t}function Te(e,t){if(!t.has(e))return e;for(let n=2;;n+=1){let r=`${e}-${n}`;if(!t.has(r))return r}}function Ee(e){let t=new Set,n=[];for(let r of e.models){let e=r.trim();e===``||t.has(e)||(t.add(e),n.push(e))}return n}function De(e,t,n){let r=[...e],i=[],a=[],o=new Set(r.map(e=>e.name)),s=new Set(r.flatMap(e=>e.alias===void 0?[]:[e.alias])),c=new Set(r.flatMap(e=>(e.models??[]).map(e=>e.modelName)));for(let e of t){if(e.protocol===null)continue;let t=Ce(n,e.id),l=r.findIndex(t=>q(t.apiBase)===e.id);if(l>=0){let n=r[l],i={};if(n.apiBase!==t&&(i.apiBase=t),n.customLlmProvider!==e.protocol&&(i.customLlmProvider=e.protocol),(n.apiKey===void 0||n.apiKey.trim()===``)&&(i.apiKey=K),Object.keys(i).length===0)continue;r[l]={...n,...i},a.push(n.name);continue}let u=Te(we(e.id),s);s.add(u);let d=Te(`${e.name||e.id}(插件)`,o);o.add(d);let f=Ee(e).map(e=>{let t=Te(`${u}/${e}`,c);return c.add(t),{modelName:t,model:e}});r.push({name:d,alias:u,customLlmProvider:e.protocol,apiKey:K,apiBase:t,models:f}),i.push(d)}return{providers:r,added:i,updated:a}}function Oe(e,t){let n=new Set(t);return e.filter(e=>{let t=q(e.apiBase);return t!==null&&n.has(t)}).map(e=>e.name)}c(),y(),l(),g();var ke={class:`page-head`},Ae={class:`page-head-actions`},je={class:`flex-between`},Me={class:`muted-sm`},Ne={key:0,class:`loading-block`},Pe={key:1,class:`loading-block`},Fe={key:2,class:`plugin-grid`},Ie={class:`card-top`},Le={class:`plugin-icon`},Re=[`src`,`alt`,`onError`],ze={key:1},Be={class:`plugin-titles`},Ve=[`title`],He={class:`plugin-tags`},Ue={class:`plugin-action`},We=[`title`],Ge={class:`plugin-meta`},Ke={key:0},qe={key:1,class:`mono`},Je={key:2,class:`muted-disabled`},Ye=[`title`],Xe=[`title`],Ze={key:0,class:`muted-disabled`},Qe={key:1,class:`provider-list`},$e=[`title`],et={class:`provider-models`},tt={class:`provider-state`},nt={class:`mono`},rt={key:0,class:`version-update`},it={class:`mono muted-12`},at={class:`method-list`},ot={class:`muted-sm`},st={key:0,class:`muted-sm`},ct={class:`muted-sm`},lt={class:`muted-sm`},ut={key:0,class:`mt-8`},dt=[`href`],ft={key:2,class:`muted-sm mt-8`},pt=S(n({__name:`PluginsView`,setup(n){let{toast:c}=ae(),l=ie(),g=s(!0),ee=s(`服务未由 ezllm 主进程托管(源码运行模式);请用 ezllm 启动服务`),y=s(!1),S=s(!1),C=s(null),w=s(!1),T=s(!0),O=s(!1),{entries:k,loading:ce,marketError:A,progress:j,fetchedAt:le,stale:ue,loadMarket:de}=xe(),fe=s(new Set),M=s([]),N=s(null),P=s(!1),F=s(``),I=s(!1),pe=s(!1),me=s({}),L=s(!1),he=s(!0),R=i(()=>S.value&&C.value!==null),ge=e=>M.value.some(t=>t.package===e.package),_e=e=>e.icon===null||fe.value.has(e.package)?null:/^https?:\/\//i.test(e.icon)?e.icon:null,ve=e=>e.icon!==null&&!/^https?:\/\//i.test(e.icon)?e.icon:(e.name.charAt(0)||`?`).toUpperCase(),z=e=>{fe.value=new Set(fe.value).add(e.package)},ye=e=>e>=1e3?`${(e/1e3).toFixed(e>=1e4?0:1)}k`:String(e),B=async()=>{try{let e=await re.plugins();g.value=!0,y.value=e.enabled,T.value=e.autoUpdate,S.value=e.running,C.value=e.port}catch(e){if(typeof e?.message==`string`&&e.message.includes(`未由 ezllm 主进程托管`)){g.value=!1,ee.value=e.message,y.value=!1,T.value=!1,S.value=!1,C.value=null;return}throw e}},V=async()=>{if(!R.value){M.value=[];return}let e=C.value;if(e!==null)try{let t=await D(E(e,`/packages`));M.value=Array.isArray(t.packages)?t.packages:[]}catch{M.value=[]}},H=e=>{let t=Math.floor((Date.now()-e)/6e4);if(t<1)return`刚刚`;if(t<60)return`${String(t)} 分钟前`;let n=Math.floor(t/60);return n<24?`${String(n)} 小时前`:new Date(e).toLocaleDateString()},U=i(()=>{if(ce.value)return`正在加载 ${String(j.value.loaded)}/${String(j.value.total)}…`;let e=le.value===null?``:H(le.value.at),t=e===``?``:` · ${e}更新`,n=ue.value?` · 更新中…`:``;return`${String(k.value.length)} 个插件 · 已装 ${String(M.value.length)} 个${t}${n}`}),W=async(e=!1)=>{await de({force:e})},be=async()=>{try{await B()}catch(e){A.value=e?.message??`插件服务状态加载失败`;return}await V(),await W()},G=s(!1),Se=async e=>{let t=await D(E(e,`/plugins`));return Array.isArray(t.providers)?t.providers:[]},K=async()=>{let e=C.value;if(R.value&&e!==null){G.value=!0;try{await l.loadProviders();let t=De(l.suppliers,await Se(e),e);if(t.added.length===0&&t.updated.length===0)return;await l.saveProviders(t.providers);let n=[];t.added.length>0&&n.push(`新增 ${String(t.added.length)} 个`),t.updated.length>0&&n.push(`修正 ${String(t.updated.length)} 个`),c(`已接入网关:${n.join(`、`)}供应商`,`success`)}catch(e){c(e?.message??`供应商配置同步失败`,`error`)}finally{G.value=!1}}},q=async e=>{w.value=!0;try{let t=await re.setPluginEnabled(e);y.value=t.enabled,S.value=t.running,C.value=t.port,c(e?`插件服务已开启`:`插件服务已关闭`,`success`),await V()}catch(e){await B().catch(()=>void 0),c(e?.message??`操作失败`,`error`)}finally{w.value=!1}},Ce=async e=>{if(e){await q(!0);return}try{await x.confirm(`关闭插件服务?已装插件保留,但插件模型的请求将不可用。`,`关闭确认`,{confirmButtonText:`关闭`,cancelButtonText:`取消`,type:`warning`})}catch{await B().catch(()=>void 0);return}await q(!1)},we=async e=>{let t=!!e;O.value=!0;try{let e=await re.setPluginAutoUpdate(t);T.value=e.autoUpdate,c(t?`已开启插件自动更新`:`已关闭插件自动更新`,`success`)}catch(e){await B().catch(()=>void 0),c(e?.message??`操作失败`,`error`)}finally{O.value=!1}},Te=async e=>{await pt(e.package)},Ee=async()=>{let e=F.value.trim();if(e!==``){pe.value=!0;try{await pt(e),P.value=!1,F.value=``}finally{pe.value=!1}}},pt=async e=>{let t=C.value;if(t===null){c(`插件服务未开启`,`error`);return}N.value=e;try{(await oe(E(t,`/packages`),{package:e})).loaded===!1?c(`${e} 已安装但未加载成功(重启插件服务或查看日志)`,`warning`):c(`已安装 ${e}`,`success`),await V(),await K()}catch(e){c(e?.message??`安装失败`,`error`)}finally{N.value=null}},mt=async e=>{let t=C.value;if(t===null)return;let n=[];try{await l.loadProviders(),n=Oe(l.suppliers,e.providers.map(e=>e.id))}catch{}let r=n.length===0?``:`网关里对应的供应商(${n.join(`、`)})也会一并移除。`;try{await x.confirm(`确定卸载 ${e.package}?该插件提供的模型将不可用。${r}`,`确认卸载`,{confirmButtonText:`卸载`,cancelButtonText:`取消`,type:`warning`})}catch{return}N.value=e.package;try{await se(E(t,`/packages/${encodeURIComponent(e.package)}`)),n.length>0&&await l.saveProviders(l.suppliers.filter(e=>!n.includes(e.name))),c(`已卸载 ${e.package}`,`success`),await V()}catch(e){c(e?.message??`卸载失败`,`error`)}finally{N.value=null}},ht=()=>{F.value=``,P.value=!0},gt=async()=>{await V(),I.value=!0},_t=i(()=>R.value?he.value?`检查已装插件是否有新版本`:`宿主当前无法检查更新`:`插件服务未开启`),vt=e=>{let t=me.value[e];return t&&t.updateAvailable&&t.latest?t.latest:null},yt=async(e=!1)=>{let t=C.value;if(t===null){e||c(`插件服务未开启`,`error`);return}L.value=!0;try{let n=await D(E(t,`/packages/updates`)),r=Array.isArray(n.packages)?n.packages:[];he.value=n.canCheck;let i={};for(let e of r)i[e.package]=e;if(me.value=i,e)return;if(!n.canCheck){c(`宿主当前无法检查更新`,`warning`);return}let a=r.filter(e=>e.updateAvailable).length;c(a>0?`发现 ${String(a)} 个插件有新版本`:`全部插件已是最新`,`success`)}catch(t){e||c(t?.message??`检查更新失败`,`error`)}finally{L.value=!1}},bt=async e=>{let t=C.value,n=me.value[e]?.latest;if(t===null){c(`插件服务未开启`,`error`);return}if(n!=null){N.value=e;try{await oe(E(t,`/packages`),{package:e,version:n});let r=await re.restartPlugins();S.value=r.running,C.value=r.port,c(`已更新到 ${n} 并重启插件服务`,`success`),delete me.value[e],await V(),await yt(!0)}catch(e){c(e?.message??`更新失败`,`error`)}finally{N.value=null}}},xt=s(null),St=s(!1),Ct=s(``),wt=s([]),Tt=s(!1),Et=s(``),Dt=s(``),Ot=s(``),J=s(null),Y=s(!1),kt=s(``),At=s(``),jt=s(``),X=s(``),Mt=s(void 0),Nt=s({}),Z=s(null),Pt=s(!1),Q=s(!1),Ft=s(``),It=s([]),$=s({}),Lt=s(void 0),Rt=s(null),zt=s(!1),Bt=(e,t)=>{Dt.value=e,Et.value=t.url??``,Ot.value=t.instructions??``,J.value=null,Tt.value=!0},Vt=async e=>{let t=C.value;if(t===null)return;let n=Date.now()+18e4;for(;;){await new Promise(e=>setTimeout(e,2e3));let r;try{r=await D(E(t,`/login/${encodeURIComponent(e)}`))}catch(e){J.value=e?.message??`查询登录状态失败`;return}if(r.state===`success`){Tt.value=!1,c(`已登录${r.accountId?`(${r.accountId})`:``}`,`success`),await V(),await K();return}if(r.state===`failed`){J.value=r.error??`登录失败`;return}if(Date.now()>n){J.value=`等待超时,可关闭后重新点击「登录」`;return}}},Ht=async(e,t,n,r)=>{let i=C.value;if(i===null){c(`插件服务未开启`,`error`);return}let a={};t!==void 0&&(a.method=t),Object.keys(n).length>0&&(a.inputs=n),r!==void 0&&r!==``&&(a.key=r);let o=await oe(E(i,`/login/${encodeURIComponent(e)}`),a);if(o.needMethod===!0){Ct.value=e,wt.value=o.methods,St.value=!0;return}if(o.needInputs!==void 0&&o.needInputs.length>0){Y.value=!1,Ft.value=e,Lt.value=t,It.value=o.needInputs;let r={...o.inputs??n};for(let e of o.needInputs)r[e.key]=r[e.key]??``;$.value=r,Rt.value=null,Q.value=!0;return}if(o.needKey===!0){Q.value=!1,kt.value=e,Mt.value=t,At.value=o.label??``,jt.value=o.placeholder??``,Nt.value={...o.inputs??n},X.value=``,Z.value=null,Y.value=!0;return}if(o.state===`success`){Q.value=!1,Y.value=!1,c(`已登录${o.accountId?`(${o.accountId})`:``}`,`success`),await V(),await K();return}if(o.state===`failed`){let e=o.error??`登录失败`;if(Y.value){Z.value=e;return}if(Q.value){Rt.value=e;return}c(e,`error`);return}Q.value=!1,Y.value=!1,Bt(e,o),Vt(e)},Ut=async(e,t)=>{xt.value=e;try{await Ht(e,t,{})}catch(e){c(e?.message??`发起登录失败`,`error`)}finally{xt.value=null}},Wt=async e=>{St.value=!1,await Ut(Ct.value,e)},Gt=async()=>{zt.value=!0;try{await Ht(Ft.value,Lt.value,{...$.value})}catch(e){Rt.value=e?.message??`提交失败`}finally{zt.value=!1}},Kt=async()=>{if(X.value.trim()===``){Z.value=`请填写密钥`;return}Pt.value=!0,Z.value=null;try{await Ht(kt.value,Mt.value,{...Nt.value},X.value)}catch(e){Z.value=e?.message??`提交失败`}finally{Pt.value=!1}};return u(be),(n,i)=>{let s=p(`el-switch`),c=p(`el-button`),l=p(`el-icon`),u=p(`el-alert`),x=p(`el-tag`),re=p(`el-card`),C=p(`el-input`),ie=p(`el-form-item`),ae=p(`el-form`),E=p(`el-dialog`),D=p(`el-table-column`),oe=p(`el-table`),se=p(`el-option`),j=p(`el-select`);return d(),r(`div`,null,[h(`div`,ke,[i[22]||=h(`div`,null,[h(`div`,{class:`page-head-title`},`插件`),h(`div`,{class:`page-head-sub`},` 订阅社区 OpenCode 插件——把订阅账号(CodeBuddy、智谱 Coding Plan 等)当作供应商接入网关 `)],-1),h(`div`,Ae,[t(s,{modelValue:y.value,"onUpdate:modelValue":i[0]||=e=>y.value=e,loading:w.value,disabled:!g.value||w.value,"active-text":`插件服务`,"inline-prompt":``,onChange:Ce},null,8,[`modelValue`,`loading`,`disabled`]),t(s,{modelValue:T.value,"onUpdate:modelValue":i[1]||=e=>T.value=e,loading:O.value,disabled:!g.value||O.value,"active-text":`自动更新`,"inline-prompt":``,title:`插件会在后台每小时检查并更新`,onChange:we},null,8,[`modelValue`,`loading`,`disabled`]),t(c,{disabled:!S.value,onClick:gt},{default:_(()=>[...i[19]||=[a(`已装插件`,-1)]]),_:1},8,[`disabled`]),t(c,{disabled:!S.value,onClick:ht},{default:_(()=>[t(l,null,{default:_(()=>[t(o(ne))]),_:1}),i[20]||=a(` 手动安装 `,-1)]),_:1},8,[`disabled`]),t(c,{loading:o(ce),onClick:i[2]||=e=>W(!0)},{default:_(()=>[...i[21]||=[a(`刷新`,-1)]]),_:1},8,[`loading`])])]),g.value?S.value?m(``,!0):(d(),e(u,{key:1,type:`info`,"show-icon":``,closable:!1,class:`mb-16`,title:`插件服务未开启`},{default:_(()=>[i[24]||=h(`div`,{class:`muted-sm`},`开启后即可安装并加载插件;下方清单仍可浏览。`,-1),t(c,{size:`small`,type:`primary`,class:`mt-8`,loading:w.value,onClick:i[3]||=e=>q(!0)},{default:_(()=>[...i[23]||=[a(` 开启插件服务 `,-1)]]),_:1},8,[`loading`])]),_:1})):(d(),e(u,{key:0,type:`warning`,"show-icon":``,closable:!1,class:`mb-16`,title:`插件服务不可用`},{default:_(()=>[a(f(ee.value),1)]),_:1})),o(A)?(d(),e(u,{key:2,type:`error`,"show-icon":``,closable:!1,class:`mb-16`,title:o(A)},{default:_(()=>[t(c,{size:`small`,onClick:W},{default:_(()=>[...i[25]||=[a(`重试`,-1)]]),_:1})]),_:1},8,[`title`])):m(``,!0),t(re,{shadow:`never`},{header:_(()=>[h(`div`,je,[i[26]||=h(`span`,{class:`fw-600`},`社区插件`,-1),h(`span`,Me,f(U.value),1)])]),default:_(()=>[o(ce)&&o(k).length===0?(d(),r(`div`,Ne,`正在从社区清单加载…`)):o(k).length===0?(d(),r(`div`,Pe,` 清单里没有本宿主支持的插件(只收 provider 类),可点右上角「刷新」重试,或用「手动安装」直接按包名安装。 `)):(d(),r(`div`,Fe,[(d(!0),r(b,null,v(o(k),t=>(d(),r(`div`,{key:t.package,class:`plugin-card`},[h(`div`,Ie,[h(`div`,Le,[_e(t)?(d(),r(`img`,{key:0,src:_e(t),alt:t.name,onError:e=>z(t)},null,40,Re)):(d(),r(`span`,ze,f(ve(t)),1))]),h(`div`,Be,[h(`div`,{class:`plugin-name`,title:t.name},f(t.name),9,Ve),h(`div`,He,[t.community?(d(),e(x,{key:0,size:`small`,type:`info`,"disable-transitions":``},{default:_(()=>[a(f(t.community),1)]),_:2},1024)):m(``,!0)])]),h(`div`,Ue,[ge(t)?(d(),e(x,{key:0,type:`success`,size:`small`,"disable-transitions":``},{default:_(()=>[...i[27]||=[a(`已装`,-1)]]),_:1})):(d(),e(c,{key:1,type:`primary`,size:`small`,disabled:!R.value||N.value===t.package,loading:N.value===t.package,onClick:e=>Te(t)},{default:_(()=>[...i[28]||=[a(` 安装 `,-1)]]),_:1},8,[`disabled`,`loading`,`onClick`]))])]),h(`div`,{class:`plugin-summary`,title:t.summary??``},f(t.summary??`(清单未提供简介)`),9,We),h(`div`,Ge,[h(`span`,null,`供应商 `+f(t.providers.length),1),t.weeklyDownloads===null?m(``,!0):(d(),r(`span`,Ke,f(ye(t.weeklyDownloads))+`/周`,1)),t.version?(d(),r(`span`,qe,`v`+f(t.version),1)):(d(),r(`span`,Je,`版本未知`))])]))),128))]))]),_:1}),t(E,{modelValue:P.value,"onUpdate:modelValue":i[6]||=e=>P.value=e,title:`手动安装插件`,width:`520px`},{footer:_(()=>[t(c,{onClick:i[5]||=e=>P.value=!1},{default:_(()=>[...i[30]||=[a(`取消`,-1)]]),_:1}),t(c,{type:`primary`,loading:pe.value,disabled:F.value.trim()===``,onClick:Ee},{default:_(()=>[...i[31]||=[a(` 安装 `,-1)]]),_:1},8,[`loading`,`disabled`])]),default:_(()=>[t(ae,{"label-position":`top`},{default:_(()=>[t(ie,{label:`npm 包名`},{default:_(()=>[t(C,{modelValue:F.value,"onUpdate:modelValue":i[4]||=e=>F.value=e,placeholder:`例:@magpie-community/opencode-workbuddy-auth`,clearable:``},null,8,[`modelValue`]),i[29]||=h(`div`,{class:`muted-sm`},[a(`可带版本(`),h(`span`,{class:`mono`},`name@1.2.3`),a(`);清单加载不出来时用这个。`)],-1)]),_:1})]),_:1})]),_:1},8,[`modelValue`]),t(E,{modelValue:I.value,"onUpdate:modelValue":i[9]||=e=>I.value=e,title:`已装插件`,width:`1100px`,top:`6vh`},{footer:_(()=>[t(c,{disabled:!R.value||G.value,loading:G.value,title:`把宿主已加载的插件供应商补进网关配置:缺的整条新增,已在的只修地址/协议(模型清单保持你的选择)`,onClick:K},{default:_(()=>[...i[39]||=[a(`接入网关`,-1)]]),_:1},8,[`disabled`,`loading`]),t(c,{disabled:!R.value||!he.value||N.value!==null,loading:L.value,title:_t.value,onClick:i[7]||=e=>yt()},{default:_(()=>[...i[40]||=[a(`检查更新`,-1)]]),_:1},8,[`disabled`,`loading`,`title`]),t(c,{onClick:i[8]||=e=>I.value=!1},{default:_(()=>[...i[41]||=[a(`关闭`,-1)]]),_:1})]),default:_(()=>[t(oe,{data:M.value,"empty-text":`尚未安装任何插件`,class:`dense-table`},{default:_(()=>[t(D,{label:`插件包`,"min-width":`320`},{default:_(({row:e})=>[h(`div`,{class:`mono pkg-name`,title:e.package},f(e.package),9,Ye),e.description?(d(),r(`div`,{key:0,class:`pkg-desc`,title:e.description},f(e.description),9,Xe)):m(``,!0)]),_:1}),t(D,{label:`供应商`,"min-width":`280`},{default:_(({row:n})=>[n.providers.length?(d(),r(`div`,Qe,[(d(!0),r(b,null,v(n.providers,n=>(d(),r(b,{key:n.id},[h(`span`,{class:`mono provider-id`,title:n.id},f(n.id),9,$e),h(`span`,et,f(n.models)+` 个模型`,1),h(`span`,tt,[n.signedIn?(d(),e(x,{key:0,type:`success`,size:`small`,"disable-transitions":``},{default:_(()=>[...i[32]||=[a(`已登录`,-1)]]),_:1})):(d(),r(b,{key:1},[t(x,{type:`info`,size:`small`,effect:`plain`,"disable-transitions":``},{default:_(()=>[...i[33]||=[a(`未登录`,-1)]]),_:1}),t(c,{link:``,type:`primary`,size:`small`,loading:xt.value===n.id,onClick:e=>Ut(n.id)},{default:_(()=>[...i[34]||=[a(` 登录 `,-1)]]),_:1},8,[`loading`,`onClick`])],64))])],64))),128))])):(d(),r(`div`,Ze,`-`))]),_:1}),t(D,{label:`版本`,width:`180`,align:`center`},{default:_(({row:e})=>[h(`div`,nt,f(e.version||`-`),1),vt(e.package)?(d(),r(`div`,rt,[h(`span`,it,`→ `+f(vt(e.package)),1),t(c,{link:``,type:`primary`,size:`small`,disabled:N.value!==null||L.value,loading:N.value===e.package,onClick:t=>bt(e.package)},{default:_(()=>[...i[35]||=[a(`更新`,-1)]]),_:1},8,[`disabled`,`loading`,`onClick`])])):m(``,!0)]),_:1}),t(D,{label:`状态`,width:`100`,align:`center`},{default:_(({row:t})=>[t.loaded?(d(),e(x,{key:0,type:`success`,size:`small`,"disable-transitions":``},{default:_(()=>[...i[36]||=[a(`已加载`,-1)]]),_:1})):(d(),e(x,{key:1,type:`danger`,size:`small`,"disable-transitions":``},{default:_(()=>[...i[37]||=[a(`加载失败`,-1)]]),_:1}))]),_:1}),t(D,{label:`操作`,width:`90`,align:`center`},{default:_(({row:e})=>[t(c,{link:``,type:`danger`,loading:N.value===e.package,onClick:t=>mt(e)},{default:_(()=>[...i[38]||=[a(`卸载`,-1)]]),_:1},8,[`loading`,`onClick`])]),_:1})]),_:1},8,[`data`])]),_:1},8,[`modelValue`]),t(E,{modelValue:St.value,"onUpdate:modelValue":i[11]||=e=>St.value=e,title:`选择登录方式`,width:`460px`},{footer:_(()=>[t(c,{onClick:i[10]||=e=>St.value=!1},{default:_(()=>[...i[42]||=[a(`取消`,-1)]]),_:1})]),default:_(()=>[i[43]||=h(`div`,{class:`muted-sm`},`该插件提供多种登录方式,选一种:`,-1),h(`div`,at,[(d(!0),r(b,null,v(wt.value,t=>(d(),e(c,{key:t.label,class:`method-btn`,onClick:e=>Wt(t.label)},{default:_(()=>[a(f(t.label||t.type),1)]),_:2},1032,[`onClick`]))),128))])]),_:1},8,[`modelValue`]),t(E,{modelValue:Q.value,"onUpdate:modelValue":i[13]||=e=>Q.value=e,title:`登录 ${Ft.value}`,width:`480px`},{footer:_(()=>[t(c,{onClick:i[12]||=e=>Q.value=!1},{default:_(()=>[...i[44]||=[a(`取消`,-1)]]),_:1}),t(c,{type:`primary`,loading:zt.value,onClick:Gt},{default:_(()=>[...i[45]||=[a(`确定`,-1)]]),_:1},8,[`loading`])]),default:_(()=>[(d(!0),r(b,null,v(It.value,t=>(d(),r(`div`,{key:t.key,class:`field-row`},[h(`div`,ot,f(t.message||t.key),1),t.type===`select`?(d(),e(j,{key:0,modelValue:$.value[t.key],"onUpdate:modelValue":e=>$.value[t.key]=e,class:`mt-8`,placeholder:`请选择`,style:{width:`100%`}},{default:_(()=>[(d(!0),r(b,null,v(t.options,t=>(d(),e(se,{key:t.value,label:t.label??t.value,value:t.value??``},{default:_(()=>[h(`span`,null,f(t.label??t.value),1),t.hint?(d(),r(`span`,st,`(`+f(t.hint)+`)`,1)):m(``,!0)]),_:2},1032,[`label`,`value`]))),128))]),_:2},1032,[`modelValue`,`onUpdate:modelValue`])):(d(),e(C,{key:1,modelValue:$.value[t.key],"onUpdate:modelValue":e=>$.value[t.key]=e,class:`mt-8`,placeholder:t.placeholder||``,onKeyup:te(Gt,[`enter`])},null,8,[`modelValue`,`onUpdate:modelValue`,`placeholder`]))]))),128)),Rt.value?(d(),e(u,{key:0,type:`error`,"show-icon":``,closable:!1,class:`mt-8`,title:Rt.value},null,8,[`title`])):m(``,!0)]),_:1},8,[`modelValue`,`title`]),t(E,{modelValue:Y.value,"onUpdate:modelValue":i[16]||=e=>Y.value=e,title:`登录 ${kt.value}`,width:`480px`},{footer:_(()=>[t(c,{onClick:i[15]||=e=>Y.value=!1},{default:_(()=>[...i[46]||=[a(`取消`,-1)]]),_:1}),t(c,{type:`primary`,loading:Pt.value,onClick:Kt},{default:_(()=>[...i[47]||=[a(`确定`,-1)]]),_:1},8,[`loading`])]),default:_(()=>[h(`div`,ct,f(At.value||`该登录方式需要一枚密钥`),1),t(C,{modelValue:X.value,"onUpdate:modelValue":i[14]||=e=>X.value=e,class:`mt-8`,placeholder:jt.value||`粘贴密钥`,"show-password":``,onKeyup:te(Kt,[`enter`])},null,8,[`modelValue`,`placeholder`]),Z.value?(d(),e(u,{key:0,type:`error`,"show-icon":``,closable:!1,class:`mt-8`,title:Z.value},null,8,[`title`])):m(``,!0)]),_:1},8,[`modelValue`,`title`]),t(E,{modelValue:Tt.value,"onUpdate:modelValue":i[18]||=e=>Tt.value=e,title:`登录 ${Dt.value}`,width:`480px`},{footer:_(()=>[t(c,{onClick:i[17]||=e=>Tt.value=!1},{default:_(()=>[...i[49]||=[a(`关闭`,-1)]]),_:1})]),default:_(()=>[h(`div`,lt,f(Ot.value||`正在读取本机已登录的凭据…`),1),Et.value?(d(),r(`div`,ut,[h(`a`,{class:`el-button el-button--primary`,href:Et.value,target:`_blank`,rel:`noopener`},` 打开登录页 `,8,dt),i[48]||=h(`div`,{class:`muted-sm mt-8`},`在打开的页面完成登录即可,本页会自动检测(最长等待几分钟)。`,-1)])):m(``,!0),J.value?(d(),e(u,{key:1,type:`error`,"show-icon":``,closable:!1,class:`mt-8`,title:J.value},null,8,[`title`])):(d(),r(`div`,ft,`等待登录完成…`))]),_:1},8,[`modelValue`,`title`])])}}}),[[`__scopeId`,`data-v-1245bc25`]]);export{pt as default};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{A as e,Bt as t,Ct as n,F as r,Ft as i,Gt as a,I as o,It as s,Kt as c,Lt as l,M as u,O as d,P as f,Pt as p,Q as m,Qt as h,Rt as g,S as _,Tt as v,V as y,Vt as b,Wt as x,Xt as S,Yt as C,Z as w,Zt as T,_n as E,a as D,an as O,dn as k,et as A,fn as j,ft as M,g as ee,gn as te,hn as ne,in as re,it as N,j as P,k as F,m as ie,mn as ae,mt as I,nn as oe,nt as se,on as ce,pn as le,rn as L,sn as ue,tn as de,un as fe,vn as pe,vt as R,w as me,x as he,zt as ge}from"./router-
|
|
1
|
+
import{A as e,Bt as t,Ct as n,F as r,Ft as i,Gt as a,I as o,It as s,Kt as c,Lt as l,M as u,O as d,P as f,Pt as p,Q as m,Qt as h,Rt as g,S as _,Tt as v,V as y,Vt as b,Wt as x,Xt as S,Yt as C,Z as w,Zt as T,_n as E,a as D,an as O,dn as k,et as A,fn as j,ft as M,g as ee,gn as te,hn as ne,in as re,it as N,j as P,k as F,m as ie,mn as ae,mt as I,nn as oe,nt as se,on as ce,pn as le,rn as L,sn as ue,tn as de,un as fe,vn as pe,vt as R,w as me,x as he,zt as ge}from"./router-C6GERXs3.js";import{G as _e,H as ve,K as ye,P as be,W as xe}from"./message-t8lJfFLj.js";import{n as Se,r as Ce,t as we}from"./index-B5mLXy9e.js";import{t as Te}from"./providers-CqcnYJca.js";import{n as Ee,t as De}from"./useCopyToast-OBVjElCH.js";import{t as Oe}from"./useToast-Du3Ickw8.js";import{u as ke,v as Ae}from"./format-CPPf8IfM.js";function je(e){Object.getOwnPropertySymbols(e).forEach(t=>{ai[t]=e[t]})}function Me(e,t=``){return{type:0,source:t,children:e,helpers:new Set,components:[],directives:[],hoists:[],imports:[],cached:[],temps:0,codegenNode:void 0,loc:ui}}function Ne(e,t,n,r,i,a,o,s=!1,c=!1,l=!1,u=ui){return e&&(s?(e.helper(Tr),e.helper(Xe(e.inSSR,l))):e.helper(Ye(e.inSSR,l)),o&&e.helper(Lr)),{type:13,tag:t,props:n,children:r,patchFlag:i,dynamicProps:a,directives:o,isBlock:s,disableTracking:c,isComponent:l,loc:u}}function Pe(e,t=ui){return{type:17,loc:t,elements:e}}function Fe(e,t=ui){return{type:15,loc:t,properties:e}}function Ie(e,t){return{type:16,loc:ui,key:L(e)?z(e,!0):e,value:t}}function z(e,t=!1,n=ui,r=0){return{type:4,loc:n,content:e,isStatic:t,constType:t?3:r}}function Le(e,t){return{type:5,loc:t,content:L(e)?z(e,!1,t):e}}function Re(e,t=ui){return{type:8,loc:t,children:e}}function ze(e,t=[],n=ui){return{type:14,loc:n,callee:e,arguments:t}}function Be(e,t=void 0,n=!1,r=!1,i=ui){return{type:18,params:e,returns:t,newline:n,isSlot:r,loc:i}}function Ve(e,t,n,r=!0){return{type:19,test:e,consequent:t,alternate:n,newline:r,loc:ui}}function He(e,t,n=!1,r=!1){return{type:20,index:e,value:t,needPauseTracking:n,inVOnce:r,needArraySpread:!1,loc:ui}}function Ue(e){return{type:21,body:e,loc:ui}}function We(e){return{type:22,elements:e,loc:ui}}function Ge(e,t,n){return{type:23,test:e,consequent:t,alternate:n,loc:ui}}function Ke(e,t){return{type:24,left:e,right:t,loc:ui}}function qe(e){return{type:25,expressions:e,loc:ui}}function Je(e){return{type:26,returns:e,loc:ui}}function Ye(e,t){return e||t?Or:kr}function Xe(e,t){return e||t?Er:Dr}function Ze(e,{helper:t,removeHelper:n,inSSR:r}){e.isBlock||(e.isBlock=!0,n(Ye(r,e.isComponent)),t(Tr),t(Xe(r,e.isComponent)))}function Qe(e){return e>=97&&e<=122||e>=65&&e<=90}function $e(e){return e===32||e===10||e===9||e===12||e===13}function et(e){return e===47||e===62||$e(e)}function tt(e){let t=new Uint8Array(e.length);for(let n=0;n<e.length;n++)t[n]=e.charCodeAt(n);return t}function nt(e,{compatConfig:t}){let n=t&&t[e];return e===`MODE`?n||3:n}function rt(e,t){let n=nt(`MODE`,t),r=nt(e,t);return n===3?r===!0:r!==!1}function it(e,t,n,...r){return rt(e,t)}function at(e,t,n,...r){if(nt(e,t)===`suppress-warning`)return;let{message:i,link:a}=gi[e],o=`(deprecation ${e}) ${typeof i==`function`?i(...r):i}${a?`
|
|
2
2
|
Details: ${a}`:``}`,s=SyntaxError(o);s.code=e,n&&(s.loc=n),t.onWarn(s)}function ot(e){throw e}function st(e){}function B(e,t,n,r){let i=`https://vuejs.org/error-reference/#compiler-${e}`,a=SyntaxError(String(i));return a.code=e,a.loc=t,a}function ct(e,t,n=!1,r=[],i=Object.create(null)){}function lt(e,t,n){return!1}function ut(e,t){if(e&&(e.type===`ObjectProperty`||e.type===`ArrayPattern`)){let e=t.length;for(;e--;){let n=t[e];if(n.type===`AssignmentExpression`)return!0;if(n.type!==`ObjectProperty`&&!n.type.endsWith(`Pattern`))break}}return!1}function dt(e){let t=e.length;for(;t--;){let n=e[t];if(n.type===`NewExpression`)return!0;if(n.type!==`MemberExpression`)break}return!1}function ft(e,t){for(let n of e.params)for(let e of _t(n))t(e)}function pt(e,t){let n=e.type===`SwitchCase`?e.consequent:e.body;for(let e of n)if(e.type===`VariableDeclaration`){if(e.declare)continue;for(let n of e.declarations)for(let e of _t(n.id))t(e)}else if(e.type===`FunctionDeclaration`||e.type===`ClassDeclaration`){if(e.declare||!e.id)continue;t(e.id)}else mt(e)?ht(e,!0,t):e.type===`SwitchStatement`&>(e,!0,t)}function mt(e){return e.type===`ForOfStatement`||e.type===`ForInStatement`||e.type===`ForStatement`}function ht(e,t,n){let r=e.type===`ForStatement`?e.init:e.left;if(r&&r.type===`VariableDeclaration`&&(r.kind===`var`?t:!t))for(let e of r.declarations)for(let t of _t(e.id))n(t)}function gt(e,t,n){for(let r of e.cases){for(let e of r.consequent)if(e.type===`VariableDeclaration`&&(e.kind===`var`?t:!t))for(let t of e.declarations)for(let e of _t(t.id))n(e);pt(r,n)}}function _t(e,t=[]){switch(e.type){case`Identifier`:t.push(e);break;case`MemberExpression`:let n=e;for(;n.type===`MemberExpression`;)n=n.object;t.push(n);break;case`ObjectPattern`:for(let n of e.properties)n.type===`RestElement`?_t(n.argument,t):_t(n.value,t);break;case`ArrayPattern`:e.elements.forEach(e=>{e&&_t(e,t)});break;case`RestElement`:_t(e.argument,t);break;case`AssignmentPattern`:_t(e.left,t)}return t}function vt(e){return Si.includes(e.type)?vt(e.expression):e}function yt(e){switch(e){case`Teleport`:case`teleport`:return xr;case`Suspense`:case`suspense`:return Sr;case`KeepAlive`:case`keep-alive`:return Cr;case`BaseTransition`:case`base-transition`:return wr}}function bt(e,t,n=t.length){return xt({offset:e.offset,line:e.line,column:e.column},t,n)}function xt(e,t,n=t.length){let r=0,i=-1;for(let e=0;e<n;e++)t.charCodeAt(e)===10&&(r++,i=e);return e.offset+=n,e.line+=r,e.column=i===-1?e.column+n:n-i,e}function St(e,t){if(!e)throw Error(t||`unexpected compiler condition`)}function Ct(e,t,n=!1){for(let r=0;r<e.props.length;r++){let i=e.props[r];if(i.type===7&&(n||i.exp)&&(L(t)?i.name===t:t.test(i.name)))return i}}function wt(e,t,n=!1,r=!1){for(let i=0;i<e.props.length;i++){let a=e.props[i];if(a.type===6){if(n)continue;if(a.name===t&&(a.value||r))return a}else if(a.name===`bind`&&(a.exp||r)&&Tt(a.arg,t))return a}}function Tt(e,t){return!!(e&&Ci(e)&&e.content===t)}function Et(e){return e.props.some(e=>e.type===7&&e.name===`bind`&&(!e.arg||e.arg.type!==4||!e.arg.isStatic))}function Dt(e){return e.type===5||e.type===2}function Ot(e){return e.type===7&&e.name===`pre`}function kt(e){return e.type===7&&e.name===`slot`}function At(e){return e.type===1&&e.tagType===3}function jt(e){return e.type===1&&e.tagType===2}function Mt(e,t=[]){if(e&&!L(e)&&e.type===14){let n=e.callee;if(!L(n)&&Li.has(n))return Mt(e.arguments[0],t.concat(e))}return[e,t]}function Nt(e,t,n){if(e.type!==13&&Pt(e,t))return;let r,i=e.type===13?e.props:e.arguments[2],a=[],o;if(i&&!L(i)&&i.type===14){let e=Mt(i);i=e[0],a=e[1],o=a[a.length-1]}if(i==null||L(i))r=Fe([t]);else if(i.type===14){let e=i.arguments[0];!L(e)&&e.type===15?Ft(t,e)||e.properties.unshift(t):i.callee===qr?r=ze(n.helper(Hr),[Fe([t]),i]):i.arguments.unshift(Fe([t])),!r&&(r=i)}else i.type===15?(Ft(t,i)||i.properties.unshift(t),r=i):(r=ze(n.helper(Hr),[Fe([t]),i]),o&&o.callee===Kr&&(o=a[a.length-2]));e.type===13?o?o.arguments[0]=r:e.props=r:o?o.arguments[0]=r:e.arguments[2]=r}function Pt(e,t){var n,r,i;if(t.key.type!==4||t.key.content!==`key`)return!1;let a=e.arguments[2];if(a&&!L(a)){let[e]=Mt(a);if(e&&!L(e)&&e.type===15&&Ft(t,e))return!0}return(n=e.arguments)[2]||(n[2]=`{}`),(r=e.arguments)[3]||(r[3]=`undefined`),(i=e.arguments)[4]||(i[4]=`undefined`),e.arguments[5]=t.value,!0}function Ft(e,t){let n=!1;if(e.key.type===4){let r=e.key.content;n=t.properties.some(e=>e.key.type===4&&e.key.content===r)}return n}function It(e,t){return`_${t}_${e.replace(/[^\w]/g,(t,n)=>t===`-`?`_`:e.charCodeAt(n).toString())}`}function Lt(e,t){if(!e||Object.keys(t).length===0)return!1;switch(e.type){case 1:for(let n=0;n<e.props.length;n++){let r=e.props[n];if(r.type===7&&(Lt(r.arg,t)||Lt(r.exp,t)))return!0}return e.children.some(e=>Lt(e,t));case 11:return Lt(e.source,t)?!0:e.children.some(e=>Lt(e,t));case 9:return e.branches.some(e=>Lt(e,t));case 10:return Lt(e.condition,t)?!0:e.children.some(e=>Lt(e,t));case 4:return!e.isStatic&&Ti(e.content)&&!!t[e.content];case 8:return e.children.some(e=>T(e)&&Lt(e,t));case 5:case 12:return Lt(e.content,t);case 2:case 3:case 20:return!1;default:return!1}}function Rt(e){return e.type===14&&e.callee===ri?e.arguments[1].returns:e}function zt(e){for(let t=0;t<e.length;t++)if(!$e(e.charCodeAt(t)))return!1;return!0}function Bt(e){return e.type===2&&zt(e.content)||e.type===12&&Bt(e.content)}function Vt(e){return e.type===3||Bt(e)}function Ht(e){let t=e.loc,n=e.content,r=n.match(Ri);if(!r)return;let[,i,a]=r,o=(e,n,r=!1)=>{let i=t.start.offset+n;return sn(e,!1,nn(i,i+e.length),0,+!!r)},s={source:o(a.trim(),n.indexOf(a,i.length)),value:void 0,key:void 0,index:void 0,finalized:!1},c=i.trim().replace(Zi,``).trim(),l=i.indexOf(c),u=c.match(Xi);if(u){c=c.replace(Xi,``).trim();let e=u[1].trim(),t;if(e&&(t=n.indexOf(e,l+c.length),s.key=o(e,t,!0)),u[2]){let r=u[2].trim();r&&(s.index=o(r,n.indexOf(r,s.key?t+e.length:l+c.length),!0))}}return c&&(s.value=o(c,l,!0)),s}function Ut(e,t){return Vi.slice(e,t)}function Wt(e){Yi.inSFCRoot&&(Hi.innerLoc=nn(e+1,e+1)),tn(Hi);let{tag:t,ns:n}=Hi;n===0&&V.isPreTag(t)&&Ki++,V.isVoidTag(t)?Kt(Hi,e):(U.unshift(Hi),(n===1||n===2)&&(Yi.inXML=!0)),Hi=null}function Gt(e,t,n){{let t=U[0]&&U[0].tag;t!==`script`&&t!==`style`&&e.includes(`&`)&&(e=V.decodeEntities(e,!1))}let r=U[0]||Bi,i=r.children[r.children.length-1];i&&i.type===2?(i.content+=e,an(i.loc,n)):r.children.push({type:2,content:e,loc:nn(t,n)})}function Kt(e,n,r=!1){r?an(e.loc,Jt(n,60)):an(e.loc,qt(n,62)+1),Yi.inSFCRoot&&(e.children.length?e.innerLoc.end=t({},e.children[e.children.length-1].loc.end):e.innerLoc.end=t({},e.innerLoc.start),e.innerLoc.source=Ut(e.innerLoc.start.offset,e.innerLoc.end.offset));let{tag:i,ns:a,children:o}=e;if(qi||(i===`slot`?e.tagType=2:Yt(e)?e.tagType=3:Xt(e)&&(e.tagType=1)),Yi.inRCDATA||(e.children=Qt(o)),a===0&&V.isIgnoreNewlineTag(i)){let e=o[0];e&&e.type===2&&(e.content=e.content.replace(/^\r?\n/,``))}a===0&&V.isPreTag(i)&&Ki--,Ji===e&&(qi=Yi.inVPre=!1,Ji=null),Yi.inXML&&(U[0]?U[0].ns:V.ns)===0&&(Yi.inXML=!1);{let t=e.props;if(!Yi.inSFCRoot&&rt(`COMPILER_NATIVE_TEMPLATE`,V)&&e.tag===`template`&&!Yt(e)){let t=U[0]||Bi,n=t.children.indexOf(e);t.children.splice(n,1,...e.children)}let n=t.find(e=>e.type===6&&e.name===`inline-template`);n&&it(`COMPILER_INLINE_TEMPLATE`,V,n.loc)&&e.children.length&&(n.value={type:2,content:Ut(e.children[0].loc.start.offset,e.children[e.children.length-1].loc.end.offset),loc:n.loc})}}function qt(e,t){let n=e;for(;Vi.charCodeAt(n)!==t&&n<Vi.length-1;)n++;return n}function Jt(e,t){let n=e;for(;Vi.charCodeAt(n)!==t&&n>=0;)n--;return n}function Yt({tag:e,props:t}){if(e===`template`){for(let e=0;e<t.length;e++)if(t[e].type===7&&Qi.has(t[e].name))return!0}return!1}function Xt({tag:e,props:t}){if(V.isCustomElement(e))return!1;if(e===`component`||Zt(e.charCodeAt(0))||yt(e)||V.isBuiltInComponent&&V.isBuiltInComponent(e)||V.isNativeTag&&!V.isNativeTag(e))return!0;for(let e=0;e<t.length;e++){let n=t[e];if(n.type===6){if(n.name===`is`&&n.value&&(n.value.content.startsWith(`vue:`)||it(`COMPILER_IS_ON_ELEMENT`,V,n.loc)))return!0}else if(n.name===`bind`&&Tt(n.arg,`is`)&&it(`COMPILER_IS_ON_ELEMENT`,V,n.loc))return!0}return!1}function Zt(e){return e>64&&e<91}function Qt(e){let t=V.whitespace!==`preserve`,n=!1;for(let r=0;r<e.length;r++){let i=e[r];if(i.type===2){if(Ki)i.content=i.content.replace($i,`
|
|
3
3
|
`);else if(zt(i.content)){let a=e[r-1]&&e[r-1].type,o=e[r+1]&&e[r+1].type;!a||!o||t&&(a===3&&(o===3||o===1)||a===1&&(o===3||o===1&&$t(i.content)))?(n=!0,e[r]=null):i.content=` `}else t&&(i.content=en(i.content))}}return n?e.filter(Boolean):e}function $t(e){for(let t=0;t<e.length;t++){let n=e.charCodeAt(t);if(n===10||n===13)return!0}return!1}function en(e){let t=``,n=!1;for(let r=0;r<e.length;r++)$e(e.charCodeAt(r))?n||=(t+=` `,!0):(t+=e[r],n=!1);return t}function tn(e){(U[0]||Bi).children.push(e)}function nn(e,t){return{start:Yi.getPos(e),end:t==null?t:Yi.getPos(t),source:t==null?t:Ut(e,t)}}function rn(e){return nn(e.start.offset,e.end.offset)}function an(e,t){e.end=Yi.getPos(t),e.source=Ut(e.start.offset,t)}function on(e){let t={type:6,name:e.rawName,nameLoc:nn(e.loc.start.offset,e.loc.start.offset+e.rawName.length),value:void 0,loc:e.loc};if(e.exp){let n=e.exp.loc;n.end.offset<e.loc.end.offset&&(n.start.offset--,n.start.column--,n.end.offset++,n.end.column++),t.value={type:2,content:e.exp.content,loc:n}}return t}function sn(e,t=!1,n,r=0,i=0){return z(e,t,n,r)}function cn(e,t,n){V.onError(B(e,nn(t,t),void 0,n))}function ln(){Yi.reset(),Hi=null,H=null,Ui=``,Wi=-1,Gi=-1,U.length=0}function un(e,n){if(ln(),Vi=e,V=t({},zi),n){let e;for(e in n)n[e]!=null&&(V[e]=n[e])}Yi.mode=V.parseMode===`html`?1:V.parseMode===`sfc`?2:0,Yi.inXML=V.ns===1||V.ns===2;let r=n&&n.delimiters;r&&(Yi.delimiterOpen=tt(r[0]),Yi.delimiterClose=tt(r[1]));let i=Bi=Me([],e);return Yi.parse(Vi),i.loc=nn(0,e.length),i.children=Qt(i.children),Bi=null,i}function dn(e,t){pn(e,void 0,t,!!fn(e))}function fn(e){let t=e.children.filter(e=>e.type!==3);return t.length===1&&t[0].type===1&&!jt(t[0])?t[0]:null}function pn(e,t,n,r=!1,i=!1){let{children:o}=e,s=[];for(let t=0;t<o.length;t++){let a=o[t];if(a.type===1&&a.tagType===0){let e=r?0:mn(a,n);if(e>0){if(e>=2){a.codegenNode.patchFlag=-1,s.push(a);continue}}else{let e=a.codegenNode;if(e.type===13){let t=e.patchFlag;if((t===void 0||t===512||t===1)&&gn(a,n)>=2){let t=_n(a);t&&(e.props=n.hoist(t))}e.dynamicProps&&=n.hoist(e.dynamicProps)}}}else if(a.type===12&&(r?0:mn(a,n))>=2){a.codegenNode.type===14&&a.codegenNode.arguments.length>0&&a.codegenNode.arguments.push(`-1`),s.push(a);continue}if(a.type===1){let t=a.tagType===1;t&&n.scopes.vSlot++,pn(a,e,n,!1,i),t&&n.scopes.vSlot--}else if(a.type===11)pn(a,e,n,a.children.length===1,!0);else if(a.type===9)for(let t=0;t<a.branches.length;t++)pn(a.branches[t],e,n,a.branches[t].children.length===1,i)}let c=!1;if(s.length===o.length&&e.type===1){if(e.tagType===0&&e.codegenNode&&e.codegenNode.type===13&&a(e.codegenNode.children))e.codegenNode.children=l(Pe(e.codegenNode.children)),c=!0;else if(e.tagType===1&&e.codegenNode&&e.codegenNode.type===13&&e.codegenNode.children&&!a(e.codegenNode.children)&&e.codegenNode.children.type===15){let t=u(e.codegenNode,`default`);t&&(t.returns=l(Pe(t.returns)),c=!0)}else if(e.tagType===3&&t&&t.type===1&&t.tagType===1&&t.codegenNode&&t.codegenNode.type===13&&t.codegenNode.children&&!a(t.codegenNode.children)&&t.codegenNode.children.type===15){let n=Ct(e,`slot`,!0),r=n&&n.arg&&u(t.codegenNode,n.arg);r&&(r.returns=l(Pe(r.returns)),c=!0)}}if(!c)for(let e of s)e.codegenNode=n.cache(e.codegenNode);function l(e){let t=n.cache(e);return t.needArraySpread=!0,t}function u(e,t){if(e.children&&!a(e.children)&&e.children.type===15){let n=e.children.properties.find(e=>e.key===t||e.key.content===t);return n&&n.value}}s.length&&n.transformHoist&&n.transformHoist(o,n,e)}function mn(e,t){let{constantCache:n}=t;switch(e.type){case 1:if(e.tagType!==0)return 0;let r=n.get(e);if(r!==void 0)return r;let i=e.codegenNode;if(i.type!==13||i.isBlock&&e.tag!==`svg`&&e.tag!==`foreignObject`&&e.tag!==`math`)return 0;if(i.patchFlag===void 0){let r=3,a=gn(e,t);if(a===0)return n.set(e,0),0;a<r&&(r=a);for(let i=0;i<e.children.length;i++){let a=mn(e.children[i],t);if(a===0)return n.set(e,0),0;a<r&&(r=a)}if(r>1)for(let i=0;i<e.props.length;i++){let a=e.props[i];if(a.type===7&&a.name===`bind`&&a.exp){let i=mn(a.exp,t);if(i===0)return n.set(e,0),0;i<r&&(r=i)}}if(i.isBlock){for(let t=0;t<e.props.length;t++)if(e.props[t].type===7)return n.set(e,0),0;t.removeHelper(Tr),t.removeHelper(Xe(t.inSSR,i.isComponent)),i.isBlock=!1,t.helper(Ye(t.inSSR,i.isComponent))}return n.set(e,r),r}return n.set(e,0),0;case 2:case 3:return 3;case 9:case 11:case 10:return 0;case 5:case 12:return mn(e.content,t);case 4:return e.constType;case 8:let a=3;for(let n=0;n<e.children.length;n++){let r=e.children[n];if(L(r)||re(r))continue;let i=mn(r,t);if(i===0)return 0;i<a&&(a=i)}return a;case 20:return 2;default:return 0}}function hn(e,t){if(e.type===14&&!L(e.callee)&&ea.has(e.callee)){let n=e.arguments[0];if(n.type===4)return mn(n,t);if(n.type===14)return hn(n,t)}return 0}function gn(e,t){let n=3,r=_n(e);if(r&&r.type===15){let{properties:e}=r;for(let r=0;r<e.length;r++){let{key:i,value:a}=e[r],o=mn(i,t);if(o===0)return o;o<n&&(n=o);let s;if(s=a.type===4?mn(a,t):a.type===14?hn(a,t):0,s===0)return s;s<n&&(n=s)}}return n}function _n(e){let t=e.codegenNode;if(t.type===13)return t.props}function vn(e,{filename:t=``,prefixIdentifiers:n=!1,hoistStatic:r=!1,hmr:a=!1,cacheHandlers:o=!1,nodeTransforms:s=[],directiveTransforms:c={},transformHoist:u=null,isBuiltInComponent:d=l,isCustomElement:f=l,expressionPlugins:p=[],scopeId:m=null,slotted:h=!0,ssr:_=!1,inSSR:v=!1,ssrCssVars:y=``,bindingMetadata:b=i,inline:x=!1,isTS:S=!1,onError:C=ot,onWarn:w=st,compatConfig:T}){let E=t.replace(/\?.*$/,``).match(/([^/\\]+)\.\w+$/),D={filename:t,selfName:E&&ge(g(E[1])),prefixIdentifiers:n,hoistStatic:r,hmr:a,cacheHandlers:o,nodeTransforms:s,directiveTransforms:c,transformHoist:u,isBuiltInComponent:d,isCustomElement:f,expressionPlugins:p,scopeId:m,slotted:h,ssr:_,inSSR:v,ssrCssVars:y,bindingMetadata:b,inline:x,isTS:S,onError:C,onWarn:w,compatConfig:T,root:e,helpers:new Map,components:new Set,directives:new Set,hoists:[],imports:[],cached:[],constantCache:new WeakMap,vForMemoKeyedNodes:new WeakSet,temps:0,identifiers:Object.create(null),scopes:{vFor:0,vSlot:0,vPre:0,vOnce:0},parent:null,grandParent:null,currentNode:e,childIndex:0,inVOnce:!1,helper(e){let t=D.helpers.get(e)||0;return D.helpers.set(e,t+1),e},removeHelper(e){let t=D.helpers.get(e);if(t){let n=t-1;n?D.helpers.set(e,n):D.helpers.delete(e)}},helperString(e){return`_${ai[D.helper(e)]}`},replaceNode(e){D.parent.children[D.childIndex]=D.currentNode=e},removeNode(e){let t=D.parent.children,n=e?t.indexOf(e):D.currentNode?D.childIndex:-1;!e||e===D.currentNode?(D.currentNode=null,D.onNodeRemoved()):D.childIndex>n&&(D.childIndex--,D.onNodeRemoved()),D.parent.children.splice(n,1)},onNodeRemoved:l,addIdentifiers(e){},removeIdentifiers(e){},hoist(e){L(e)&&(e=z(e)),D.hoists.push(e);let t=z(`_hoisted_${D.hoists.length}`,!1,e.loc,2);return t.hoisted=e,t},cache(e,t=!1,n=!1){let r=He(D.cached.length,e,t,n);return D.cached.push(r),r}};return D.filters=new Set,D}function yn(e,t){let n=vn(e,t);Sn(e,n),t.hoistStatic&&dn(e,n),t.ssr||bn(e,n),e.helpers=new Set([...n.helpers.keys()]),e.components=[...n.components],e.directives=[...n.directives],e.imports=n.imports,e.hoists=n.hoists,e.temps=n.temps,e.cached=n.cached,e.transformed=!0,e.filters=[...n.filters]}function bn(e,t){let{helper:n}=t,{children:r}=e;if(r.length===1){let n=fn(e);if(n&&n.codegenNode){let r=n.codegenNode;r.type===13&&Ze(r,t),e.codegenNode=r}else e.codegenNode=r[0]}else r.length>1&&(e.codegenNode=Ne(t,n(br),void 0,e.children,64,void 0,void 0,!0,void 0,!1))}function xn(e,t){let n=0,r=()=>{n--};for(;n<e.children.length;n++){let i=e.children[n];L(i)||(t.grandParent=t.parent,t.parent=e,t.childIndex=n,t.onNodeRemoved=r,Sn(i,t))}}function Sn(e,t){t.currentNode=e;let{nodeTransforms:n}=t,r=[];for(let i=0;i<n.length;i++){let o=n[i](e,t);if(o&&(a(o)?r.push(...o):r.push(o)),t.currentNode)e=t.currentNode;else return}switch(e.type){case 3:t.ssr||t.helper(Ar);break;case 5:t.ssr||t.helper(Vr);break;case 9:for(let n=0;n<e.branches.length;n++)Sn(e.branches[n],t);break;case 10:case 11:case 1:case 0:xn(e,t)}t.currentNode=e;let i=r.length;for(;i--;)r[i]()}function Cn(e,t){let n=L(e)?t=>t===e:t=>e.test(t);return(e,r)=>{if(e.type===1){let{props:i}=e;if(e.tagType===3&&i.some(kt))return;let a=[];for(let o=0;o<i.length;o++){let s=i[o];if(s.type===7&&n(s.name)){i.splice(o,1),o--;let n=t(e,s,r);n&&a.push(n)}}return a}}}function wn(e,{mode:t=`function`,prefixIdentifiers:n=t===`module`,sourceMap:r=!1,filename:i=`template.vue.html`,scopeId:a=null,optimizeImports:o=!1,runtimeGlobalName:s=`Vue`,runtimeModuleName:c=`vue`,ssrRuntimeModuleName:l=`vue/server-renderer`,ssr:u=!1,isTS:d=!1,inSSR:f=!1}){let p={mode:t,prefixIdentifiers:n,sourceMap:r,filename:i,scopeId:a,optimizeImports:o,runtimeGlobalName:s,runtimeModuleName:c,ssrRuntimeModuleName:l,ssr:u,isTS:d,inSSR:f,source:e.source,code:``,column:1,line:1,offset:0,indentLevel:0,pure:!1,map:void 0,helper(e){return`_${ai[e]}`},push(e,t=-2,n){p.code+=e},indent(){m(++p.indentLevel)},deindent(e=!1){e?--p.indentLevel:m(--p.indentLevel)},newline(){m(p.indentLevel)}};function m(e){p.push(`
|
|
4
4
|
`+` `.repeat(e),0)}return p}function Tn(e,t={}){let n=wn(e,t);t.onContextCreated&&t.onContextCreated(n);let{mode:r,push:i,prefixIdentifiers:a,indent:o,deindent:s,newline:c,scopeId:l,ssr:u}=n,d=Array.from(e.helpers),f=d.length>0,p=!a&&r!==`module`;if(En(e,n),i(`function ${u?`ssrRender`:`render`}(${(u?[`_ctx`,`_push`,`_parent`,`_attrs`]:[`_ctx`,`_cache`]).join(`, `)}) {`),o(),p&&(i(`with (_ctx) {`),o(),f&&(i(`const { ${d.map(na).join(`, `)} } = _Vue
|
|
@@ -11,4 +11,4 @@ In order to be iterable, non-array objects must have a [Symbol.iterator]() metho
|
|
|
11
11
|
`)&&(m=`(?: `+m+`)`,g=` `+g,h++),i=RegExp(`^(?:`+m+`)`,p)),u&&(i=RegExp(`^`+m+`$(?!\\s)`,p)),c&&(n=t.lastIndex),s=a.call(f?i:t,g),f?s?(s.input=s.input.slice(h),s[0]=s[0].slice(h),s.index=t.lastIndex,t.lastIndex+=s[0].length):t.lastIndex=0:c&&s&&(t.lastIndex=t.global?s.index+s[0].length:n),u&&s&&s.length>1&&o.call(s[0],i,function(){for(d=1;d<arguments.length-2;d++)arguments[d]===void 0&&(s[d]=void 0)}),s}),e.exports=s}),"94ca":(function(e,t,n){var r=n(`d039`),i=/#|\.prototype\./,a=function(e,t){var n=s[o(e)];return n==l?!0:n==c?!1:typeof t==`function`?r(t):!!t},o=a.normalize=function(e){return String(e).replace(i,`.`).toLowerCase()},s=a.data={},c=a.NATIVE=`N`,l=a.POLYFILL=`P`;e.exports=a}),"99af":(function(e,t,n){var r=n(`23e7`),i=n(`d039`),a=n(`e8b5`),o=n(`861d`),s=n(`7b0b`),c=n(`50c4`),l=n(`8418`),u=n(`65f0`),d=n(`1dde`),f=n(`b622`),p=n(`2d00`),m=f(`isConcatSpreadable`),h=9007199254740991,g=`Maximum allowed index exceeded`,_=p>=51||!i(function(){var e=[];return e[m]=!1,e.concat()[0]!==e}),v=d(`concat`),y=function(e){if(!o(e))return!1;var t=e[m];return t===void 0?a(e):!!t};r({target:`Array`,proto:!0,forced:!_||!v},{concat:function(e){for(var t=s(this),n=u(t,0),r=0,i=-1,a,o=arguments.length,d,f;i<o;i++)if(f=i===-1?t:arguments[i],y(f)){if(d=c(f.length),r+d>h)throw TypeError(g);for(a=0;a<d;a++,r++)a in f&&l(n,r,f[a])}else{if(r>=h)throw TypeError(g);l(n,r++,f)}return n.length=r,n}})}),"9bdd":(function(e,t,n){var r=n(`825a`);e.exports=function(e,t,n,i){try{return i?t(r(n)[0],n[1]):t(n)}catch(t){var a=e.return;throw a!==void 0&&r(a.call(e)),t}}}),"9bf2":(function(e,t,n){var r=n(`83ab`),i=n(`0cfb`),a=n(`825a`),o=n(`c04e`),s=Object.defineProperty;t.f=r?s:function(e,t,n){if(a(e),t=o(t,!0),a(n),i)try{return s(e,t,n)}catch{}if(`get`in n||`set`in n)throw TypeError(`Accessors not supported`);return`value`in n&&(e[t]=n.value),e}}),"9ed3":(function(e,t,n){var r=n(`ae93`).IteratorPrototype,i=n(`7c73`),a=n(`5c6c`),o=n(`d44e`),s=n(`3f8c`),c=function(){return this};e.exports=function(e,t,n){var l=t+` Iterator`;return e.prototype=i(r,{next:a(1,n)}),o(e,l,!1,!0),s[l]=c,e}}),"9f7f":(function(e,t,n){var r=n(`d039`);function i(e,t){return RegExp(e,t)}t.UNSUPPORTED_Y=r(function(){var e=i(`a`,`y`);return e.lastIndex=2,e.exec(`abcd`)!=null}),t.BROKEN_CARET=r(function(){var e=i(`^r`,`gy`);return e.lastIndex=2,e.exec(`str`)!=null})}),a2bf:(function(e,t,n){var r=n(`e8b5`),i=n(`50c4`),a=n(`0366`),o=function(e,t,n,s,c,l,u,d){for(var f=c,p=0,m=u?a(u,d,3):!1,h;p<s;){if(p in n){if(h=m?m(n[p],p,t):n[p],l>0&&r(h))f=o(e,t,h,i(h.length),f,l-1)-1;else{if(f>=9007199254740991)throw TypeError(`Exceed the acceptable array length`);e[f]=h}f++}p++}return f};e.exports=o}),a352:(function(e,n){e.exports=t}),a434:(function(e,t,n){var r=n(`23e7`),i=n(`23cb`),a=n(`a691`),o=n(`50c4`),s=n(`7b0b`),c=n(`65f0`),l=n(`8418`),u=n(`1dde`),d=n(`ae40`),f=u(`splice`),p=d(`splice`,{ACCESSORS:!0,0:0,1:2}),m=Math.max,h=Math.min,g=9007199254740991,_=`Maximum allowed length exceeded`;r({target:`Array`,proto:!0,forced:!f||!p},{splice:function(e,t){var n=s(this),r=o(n.length),u=i(e,r),d=arguments.length,f,p,v,y,b,x;if(d===0?f=p=0:d===1?(f=0,p=r-u):(f=d-2,p=h(m(a(t),0),r-u)),r+f-p>g)throw TypeError(_);for(v=c(n,p),y=0;y<p;y++)b=u+y,b in n&&l(v,y,n[b]);if(v.length=p,f<p){for(y=u;y<r-p;y++)b=y+p,x=y+f,b in n?n[x]=n[b]:delete n[x];for(y=r;y>r-p+f;y--)delete n[y-1]}else if(f>p)for(y=r-p;y>u;y--)b=y+p-1,x=y+f-1,b in n?n[x]=n[b]:delete n[x];for(y=0;y<f;y++)n[y+u]=arguments[y+2];return n.length=r-p+f,v}})}),a4d3:(function(e,t,n){var r=n(`23e7`),i=n(`da84`),a=n(`d066`),o=n(`c430`),s=n(`83ab`),c=n(`4930`),l=n(`fdbf`),u=n(`d039`),d=n(`5135`),f=n(`e8b5`),p=n(`861d`),m=n(`825a`),h=n(`7b0b`),g=n(`fc6a`),_=n(`c04e`),v=n(`5c6c`),y=n(`7c73`),b=n(`df75`),x=n(`241c`),S=n(`057f`),C=n(`7418`),w=n(`06cf`),T=n(`9bf2`),E=n(`d1e7`),D=n(`9112`),O=n(`6eeb`),k=n(`5692`),A=n(`f772`),j=n(`d012`),M=n(`90e3`),ee=n(`b622`),te=n(`e538`),ne=n(`746f`),re=n(`d44e`),N=n(`69f3`),P=n(`b727`).forEach,F=A(`hidden`),ie=`Symbol`,ae=`prototype`,I=ee(`toPrimitive`),oe=N.set,se=N.getterFor(ie),ce=Object[ae],le=i.Symbol,L=a(`JSON`,`stringify`),ue=w.f,de=T.f,fe=S.f,pe=E.f,R=k(`symbols`),me=k(`op-symbols`),he=k(`string-to-symbol-registry`),ge=k(`symbol-to-string-registry`),_e=k(`wks`),ve=i.QObject,ye=!ve||!ve[ae]||!ve[ae].findChild,be=s&&u(function(){return y(de({},`a`,{get:function(){return de(this,`a`,{value:7}).a}})).a!=7})?function(e,t,n){var r=ue(ce,t);r&&delete ce[t],de(e,t,n),r&&e!==ce&&de(ce,t,r)}:de,xe=function(e,t){var n=R[e]=y(le[ae]);return oe(n,{type:ie,tag:e,description:t}),s||(n.description=t),n},Se=l?function(e){return typeof e==`symbol`}:function(e){return Object(e)instanceof le},Ce=function(e,t,n){e===ce&&Ce(me,t,n),m(e);var r=_(t,!0);return m(n),d(R,r)?(n.enumerable?(d(e,F)&&e[F][r]&&(e[F][r]=!1),n=y(n,{enumerable:v(0,!1)})):(d(e,F)||de(e,F,v(1,{})),e[F][r]=!0),be(e,r,n)):de(e,r,n)},we=function(e,t){m(e);var n=g(t);return P(b(n).concat(ke(n)),function(t){(!s||Ee.call(n,t))&&Ce(e,t,n[t])}),e},Te=function(e,t){return t===void 0?y(e):we(y(e),t)},Ee=function(e){var t=_(e,!0),n=pe.call(this,t);return this===ce&&d(R,t)&&!d(me,t)?!1:n||!d(this,t)||!d(R,t)||d(this,F)&&this[F][t]?n:!0},De=function(e,t){var n=g(e),r=_(t,!0);if(n!==ce||!d(R,r)||d(me,r)){var i=ue(n,r);return i&&d(R,r)&&!(d(n,F)&&n[F][r])&&(i.enumerable=!0),i}},Oe=function(e){var t=fe(g(e)),n=[];return P(t,function(e){!d(R,e)&&!d(j,e)&&n.push(e)}),n},ke=function(e){var t=e===ce,n=fe(t?me:g(e)),r=[];return P(n,function(e){d(R,e)&&(!t||d(ce,e))&&r.push(R[e])}),r};c||(le=function(){if(this instanceof le)throw TypeError(`Symbol is not a constructor`);var e=!arguments.length||arguments[0]===void 0?void 0:String(arguments[0]),t=M(e),n=function(e){this===ce&&n.call(me,e),d(this,F)&&d(this[F],t)&&(this[F][t]=!1),be(this,t,v(1,e))};return s&&ye&&be(ce,t,{configurable:!0,set:n}),xe(t,e)},O(le[ae],`toString`,function(){return se(this).tag}),O(le,`withoutSetter`,function(e){return xe(M(e),e)}),E.f=Ee,T.f=Ce,w.f=De,x.f=S.f=Oe,C.f=ke,te.f=function(e){return xe(ee(e),e)},s&&(de(le[ae],`description`,{configurable:!0,get:function(){return se(this).description}}),o||O(ce,`propertyIsEnumerable`,Ee,{unsafe:!0}))),r({global:!0,wrap:!0,forced:!c,sham:!c},{Symbol:le}),P(b(_e),function(e){ne(e)}),r({target:ie,stat:!0,forced:!c},{for:function(e){var t=String(e);if(d(he,t))return he[t];var n=le(t);return he[t]=n,ge[n]=t,n},keyFor:function(e){if(!Se(e))throw TypeError(e+` is not a symbol`);if(d(ge,e))return ge[e]},useSetter:function(){ye=!0},useSimple:function(){ye=!1}}),r({target:`Object`,stat:!0,forced:!c,sham:!s},{create:Te,defineProperty:Ce,defineProperties:we,getOwnPropertyDescriptor:De}),r({target:`Object`,stat:!0,forced:!c},{getOwnPropertyNames:Oe,getOwnPropertySymbols:ke}),r({target:`Object`,stat:!0,forced:u(function(){C.f(1)})},{getOwnPropertySymbols:function(e){return C.f(h(e))}}),L&&r({target:`JSON`,stat:!0,forced:!c||u(function(){var e=le();return L([e])!=`[null]`||L({a:e})!=`{}`||L(Object(e))!=`{}`})},{stringify:function(e,t,n){for(var r=[e],i=1,a;arguments.length>i;)r.push(arguments[i++]);if(a=t,!(!p(t)&&e===void 0||Se(e)))return f(t)||(t=function(e,t){if(typeof a==`function`&&(t=a.call(this,e,t)),!Se(t))return t}),r[1]=t,L.apply(null,r)}}),le[ae][I]||D(le[ae],I,le[ae].valueOf),re(le,ie),j[F]=!0}),a630:(function(e,t,n){var r=n(`23e7`),i=n(`4df4`);r({target:`Array`,stat:!0,forced:!n(`1c7e`)(function(e){Array.from(e)})},{from:i})}),a640:(function(e,t,n){var r=n(`d039`);e.exports=function(e,t){var n=[][e];return!!n&&r(function(){n.call(null,t||function(){throw 1},1)})}}),a691:(function(e,t){var n=Math.ceil,r=Math.floor;e.exports=function(e){return isNaN(e=+e)?0:(e>0?r:n)(e)}}),ab13:(function(e,t,n){var r=n(`b622`)(`match`);e.exports=function(e){var t=/./;try{`/./`[e](t)}catch{try{return t[r]=!1,`/./`[e](t)}catch{}}return!1}}),ac1f:(function(e,t,n){var r=n(`23e7`),i=n(`9263`);r({target:`RegExp`,proto:!0,forced:/./.exec!==i},{exec:i})}),ad6d:(function(e,t,n){var r=n(`825a`);e.exports=function(){var e=r(this),t=``;return e.global&&(t+=`g`),e.ignoreCase&&(t+=`i`),e.multiline&&(t+=`m`),e.dotAll&&(t+=`s`),e.unicode&&(t+=`u`),e.sticky&&(t+=`y`),t}}),ae40:(function(e,t,n){var r=n(`83ab`),i=n(`d039`),a=n(`5135`),o=Object.defineProperty,s={},c=function(e){throw e};e.exports=function(e,t){if(a(s,e))return s[e];t||={};var n=[][e],l=a(t,`ACCESSORS`)?t.ACCESSORS:!1,u=a(t,0)?t[0]:c,d=a(t,1)?t[1]:void 0;return s[e]=!!n&&!i(function(){if(l&&!r)return!0;var e={length:-1};l?o(e,1,{enumerable:!0,get:c}):e[1]=1,n.call(e,u,d)})}}),ae93:(function(e,t,n){var r=n(`e163`),i=n(`9112`),a=n(`5135`),o=n(`b622`),s=n(`c430`),c=o(`iterator`),l=!1,u=function(){return this},d,f,p;[].keys&&(p=[].keys(),`next`in p?(f=r(r(p)),f!==Object.prototype&&(d=f)):l=!0),d??={},!s&&!a(d,c)&&i(d,c,u),e.exports={IteratorPrototype:d,BUGGY_SAFARI_ITERATORS:l}}),b041:(function(e,t,n){var r=n(`00ee`),i=n(`f5df`);e.exports=r?{}.toString:function(){return`[object `+i(this)+`]`}}),b0c0:(function(e,t,n){var r=n(`83ab`),i=n(`9bf2`).f,a=Function.prototype,o=a.toString,s=/^\s*function ([^ (]*)/,c=`name`;r&&!(c in a)&&i(a,c,{configurable:!0,get:function(){try{return o.call(this).match(s)[1]}catch{return``}}})}),b622:(function(e,t,n){var r=n(`da84`),i=n(`5692`),a=n(`5135`),o=n(`90e3`),s=n(`4930`),c=n(`fdbf`),l=i(`wks`),u=r.Symbol,d=c?u:u&&u.withoutSetter||o;e.exports=function(e){return a(l,e)||(l[e]=s&&a(u,e)?u[e]:d(`Symbol.`+e)),l[e]}}),b64b:(function(e,t,n){var r=n(`23e7`),i=n(`7b0b`),a=n(`df75`);r({target:`Object`,stat:!0,forced:n(`d039`)(function(){a(1)})},{keys:function(e){return a(i(e))}})}),b727:(function(e,t,n){var r=n(`0366`),i=n(`44ad`),a=n(`7b0b`),o=n(`50c4`),s=n(`65f0`),c=[].push,l=function(e){var t=e==1,n=e==2,l=e==3,u=e==4,d=e==6,f=e==5||d;return function(p,m,h,g){for(var _=a(p),v=i(_),y=r(m,h,3),b=o(v.length),x=0,S=g||s,C=t?S(p,b):n?S(p,0):void 0,w,T;b>x;x++)if((f||x in v)&&(w=v[x],T=y(w,x,_),e)){if(t)C[x]=T;else if(T)switch(e){case 3:return!0;case 5:return w;case 6:return x;case 2:c.call(C,w)}else if(u)return!1}return d?-1:l||u?u:C}};e.exports={forEach:l(0),map:l(1),filter:l(2),some:l(3),every:l(4),find:l(5),findIndex:l(6)}}),c04e:(function(e,t,n){var r=n(`861d`);e.exports=function(e,t){if(!r(e))return e;var n,i;if(t&&typeof(n=e.toString)==`function`&&!r(i=n.call(e))||typeof(n=e.valueOf)==`function`&&!r(i=n.call(e))||!t&&typeof(n=e.toString)==`function`&&!r(i=n.call(e)))return i;throw TypeError(`Can't convert object to primitive value`)}}),c430:(function(e,t){e.exports=!1}),c6b6:(function(e,t){var n={}.toString;e.exports=function(e){return n.call(e).slice(8,-1)}}),c6cd:(function(e,t,n){var r=n(`da84`),i=n(`ce4e`),a=`__core-js_shared__`;e.exports=r[a]||i(a,{})}),c740:(function(e,t,n){var r=n(`23e7`),i=n(`b727`).findIndex,a=n(`44d2`),o=n(`ae40`),s=`findIndex`,c=!0,l=o(s);s in[]&&[,][s](function(){c=!1}),r({target:`Array`,proto:!0,forced:c||!l},{findIndex:function(e){return i(this,e,arguments.length>1?arguments[1]:void 0)}}),a(s)}),c8ba:(function(e,t){var n=(function(){return this})();try{n||=Function(`return this`)()}catch{typeof window==`object`&&(n=window)}e.exports=n}),c975:(function(e,t,n){var r=n(`23e7`),i=n(`4d64`).indexOf,a=n(`a640`),o=n(`ae40`),s=[].indexOf,c=!!s&&1/[1].indexOf(1,-0)<0,l=a(`indexOf`),u=o(`indexOf`,{ACCESSORS:!0,1:0});r({target:`Array`,proto:!0,forced:c||!l||!u},{indexOf:function(e){return c?s.apply(this,arguments)||0:i(this,e,arguments.length>1?arguments[1]:void 0)}})}),ca84:(function(e,t,n){var r=n(`5135`),i=n(`fc6a`),a=n(`4d64`).indexOf,o=n(`d012`);e.exports=function(e,t){var n=i(e),s=0,c=[],l;for(l in n)!r(o,l)&&r(n,l)&&c.push(l);for(;t.length>s;)r(n,l=t[s++])&&(~a(c,l)||c.push(l));return c}}),caad:(function(e,t,n){var r=n(`23e7`),i=n(`4d64`).includes,a=n(`44d2`);r({target:`Array`,proto:!0,forced:!n(`ae40`)(`indexOf`,{ACCESSORS:!0,1:0})},{includes:function(e){return i(this,e,arguments.length>1?arguments[1]:void 0)}}),a(`includes`)}),cc12:(function(e,t,n){var r=n(`da84`),i=n(`861d`),a=r.document,o=i(a)&&i(a.createElement);e.exports=function(e){return o?a.createElement(e):{}}}),ce4e:(function(e,t,n){var r=n(`da84`),i=n(`9112`);e.exports=function(e,t){try{i(r,e,t)}catch{r[e]=t}return t}}),d012:(function(e,t){e.exports={}}),d039:(function(e,t){e.exports=function(e){try{return!!e()}catch{return!0}}}),d066:(function(e,t,n){var r=n(`428f`),i=n(`da84`),a=function(e){return typeof e==`function`?e:void 0};e.exports=function(e,t){return arguments.length<2?a(r[e])||a(i[e]):r[e]&&r[e][t]||i[e]&&i[e][t]}}),d1e7:(function(e,t,n){var r={}.propertyIsEnumerable,i=Object.getOwnPropertyDescriptor;t.f=i&&!r.call({1:2},1)?function(e){var t=i(this,e);return!!t&&t.enumerable}:r}),d28b:(function(e,t,n){n(`746f`)(`iterator`)}),d2bb:(function(e,t,n){var r=n(`825a`),i=n(`3bbe`);e.exports=Object.setPrototypeOf||(`__proto__`in{}?function(){var e=!1,t={},n;try{n=Object.getOwnPropertyDescriptor(Object.prototype,`__proto__`).set,n.call(t,[]),e=t instanceof Array}catch{}return function(t,a){return r(t),i(a),e?n.call(t,a):t.__proto__=a,t}}():void 0)}),d3b7:(function(e,t,n){var r=n(`00ee`),i=n(`6eeb`),a=n(`b041`);r||i(Object.prototype,`toString`,a,{unsafe:!0})}),d44e:(function(e,t,n){var r=n(`9bf2`).f,i=n(`5135`),a=n(`b622`)(`toStringTag`);e.exports=function(e,t,n){e&&!i(e=n?e:e.prototype,a)&&r(e,a,{configurable:!0,value:t})}}),d58f:(function(e,t,n){var r=n(`1c0b`),i=n(`7b0b`),a=n(`44ad`),o=n(`50c4`),s=function(e){return function(t,n,s,c){r(n);var l=i(t),u=a(l),d=o(l.length),f=e?d-1:0,p=e?-1:1;if(s<2)for(;;){if(f in u){c=u[f],f+=p;break}if(f+=p,e?f<0:d<=f)throw TypeError(`Reduce of empty array with no initial value`)}for(;e?f>=0:d>f;f+=p)f in u&&(c=n(c,u[f],f,l));return c}};e.exports={left:s(!1),right:s(!0)}}),d784:(function(e,t,n){n(`ac1f`);var r=n(`6eeb`),i=n(`d039`),a=n(`b622`),o=n(`9263`),s=n(`9112`),c=a(`species`),l=!i(function(){var e=/./;return e.exec=function(){var e=[];return e.groups={a:`7`},e},``.replace(e,`$<a>`)!==`7`}),u=(function(){return`a`.replace(/./,`$0`)===`$0`})(),d=a(`replace`),f=(function(){return/./[d]?/./[d](`a`,`$0`)===``:!1})(),p=!i(function(){var e=/(?:)/,t=e.exec;e.exec=function(){return t.apply(this,arguments)};var n=`ab`.split(e);return n.length!==2||n[0]!==`a`||n[1]!==`b`});e.exports=function(e,t,n,d){var m=a(e),h=!i(function(){var t={};return t[m]=function(){return 7},``[e](t)!=7}),g=h&&!i(function(){var t=!1,n=/a/;return e===`split`&&(n={},n.constructor={},n.constructor[c]=function(){return n},n.flags=``,n[m]=/./[m]),n.exec=function(){return t=!0,null},n[m](``),!t});if(!h||!g||e===`replace`&&!(l&&u&&!f)||e===`split`&&!p){var _=/./[m],v=n(m,``[e],function(e,t,n,r,i){return t.exec===o?h&&!i?{done:!0,value:_.call(t,n,r)}:{done:!0,value:e.call(n,t,r)}:{done:!1}},{REPLACE_KEEPS_$0:u,REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE:f}),y=v[0],b=v[1];r(String.prototype,e,y),r(RegExp.prototype,m,t==2?function(e,t){return b.call(e,this,t)}:function(e){return b.call(e,this)})}d&&s(RegExp.prototype[m],`sham`,!0)}}),d81d:(function(e,t,n){var r=n(`23e7`),i=n(`b727`).map,a=n(`1dde`),o=n(`ae40`),s=a(`map`),c=o(`map`);r({target:`Array`,proto:!0,forced:!s||!c},{map:function(e){return i(this,e,arguments.length>1?arguments[1]:void 0)}})}),da84:(function(e,t,n){(function(t){var n=function(e){return e&&e.Math==Math&&e};e.exports=n(typeof globalThis==`object`&&globalThis)||n(typeof window==`object`&&window)||n(typeof self==`object`&&self)||n(typeof t==`object`&&t)||Function(`return this`)()}).call(this,n(`c8ba`))}),dbb4:(function(e,t,n){var r=n(`23e7`),i=n(`83ab`),a=n(`56ef`),o=n(`fc6a`),s=n(`06cf`),c=n(`8418`);r({target:`Object`,stat:!0,sham:!i},{getOwnPropertyDescriptors:function(e){for(var t=o(e),n=s.f,r=a(t),i={},l=0,u,d;r.length>l;)d=n(t,u=r[l++]),d!==void 0&&c(i,u,d);return i}})}),dbf1:(function(e,t,n){(function(e){n.d(t,`a`,function(){return i});function r(){return typeof window<`u`?window.console:e.console}var i=r()}).call(this,n(`c8ba`))}),ddb0:(function(e,t,n){var r=n(`da84`),i=n(`fdbc`),a=n(`e260`),o=n(`9112`),s=n(`b622`),c=s(`iterator`),l=s(`toStringTag`),u=a.values;for(var d in i){var f=r[d],p=f&&f.prototype;if(p){if(p[c]!==u)try{o(p,c,u)}catch{p[c]=u}if(p[l]||o(p,l,d),i[d]){for(var m in a)if(p[m]!==a[m])try{o(p,m,a[m])}catch{p[m]=a[m]}}}}}),df75:(function(e,t,n){var r=n(`ca84`),i=n(`7839`);e.exports=Object.keys||function(e){return r(e,i)}}),e01a:(function(e,t,n){var r=n(`23e7`),i=n(`83ab`),a=n(`da84`),o=n(`5135`),s=n(`861d`),c=n(`9bf2`).f,l=n(`e893`),u=a.Symbol;if(i&&typeof u==`function`&&(!(`description`in u.prototype)||u().description!==void 0)){var d={},f=function(){var e=arguments.length<1||arguments[0]===void 0?void 0:String(arguments[0]),t=this instanceof f?new u(e):e===void 0?u():u(e);return e===``&&(d[t]=!0),t};l(f,u);var p=f.prototype=u.prototype;p.constructor=f;var m=p.toString,h=String(u(`test`))==`Symbol(test)`,g=/^Symbol\((.*)\)[^)]+$/;c(p,`description`,{configurable:!0,get:function(){var e=s(this)?this.valueOf():this,t=m.call(e);if(o(d,e))return``;var n=h?t.slice(7,-1):t.replace(g,`$1`);return n===``?void 0:n}}),r({global:!0,forced:!0},{Symbol:f})}}),e163:(function(e,t,n){var r=n(`5135`),i=n(`7b0b`),a=n(`f772`),o=n(`e177`),s=a(`IE_PROTO`),c=Object.prototype;e.exports=o?Object.getPrototypeOf:function(e){return e=i(e),r(e,s)?e[s]:typeof e.constructor==`function`&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?c:null}}),e177:(function(e,t,n){e.exports=!n(`d039`)(function(){function e(){}return e.prototype.constructor=null,Object.getPrototypeOf(new e)!==e.prototype})}),e260:(function(e,t,n){var r=n(`fc6a`),i=n(`44d2`),a=n(`3f8c`),o=n(`69f3`),s=n(`7dd0`),c=`Array Iterator`,l=o.set,u=o.getterFor(c);e.exports=s(Array,`Array`,function(e,t){l(this,{type:c,target:r(e),index:0,kind:t})},function(){var e=u(this),t=e.target,n=e.kind,r=e.index++;return!t||r>=t.length?(e.target=void 0,{value:void 0,done:!0}):n==`keys`?{value:r,done:!1}:n==`values`?{value:t[r],done:!1}:{value:[r,t[r]],done:!1}},`values`),a.Arguments=a.Array,i(`keys`),i(`values`),i(`entries`)}),e439:(function(e,t,n){var r=n(`23e7`),i=n(`d039`),a=n(`fc6a`),o=n(`06cf`).f,s=n(`83ab`),c=i(function(){o(1)});r({target:`Object`,stat:!0,forced:!s||c,sham:!s},{getOwnPropertyDescriptor:function(e,t){return o(a(e),t)}})}),e538:(function(e,t,n){t.f=n(`b622`)}),e893:(function(e,t,n){var r=n(`5135`),i=n(`56ef`),a=n(`06cf`),o=n(`9bf2`);e.exports=function(e,t){for(var n=i(t),s=o.f,c=a.f,l=0;l<n.length;l++){var u=n[l];r(e,u)||s(e,u,c(t,u))}}}),e8b5:(function(e,t,n){var r=n(`c6b6`);e.exports=Array.isArray||function(e){return r(e)==`Array`}}),e95a:(function(e,t,n){var r=n(`b622`),i=n(`3f8c`),a=r(`iterator`),o=Array.prototype;e.exports=function(e){return e!==void 0&&(i.Array===e||o[a]===e)}}),f5df:(function(e,t,n){var r=n(`00ee`),i=n(`c6b6`),a=n(`b622`)(`toStringTag`),o=i(function(){return arguments}())==`Arguments`,s=function(e,t){try{return e[t]}catch{}};e.exports=r?i:function(e){var t,n,r;return e===void 0?`Undefined`:e===null?`Null`:typeof(n=s(t=Object(e),a))==`string`?n:o?i(t):(r=i(t))==`Object`&&typeof t.callee==`function`?`Arguments`:r}}),f772:(function(e,t,n){var r=n(`5692`),i=n(`90e3`),a=r(`keys`);e.exports=function(e){return a[e]||(a[e]=i(e))}}),fb15:(function(e,t,n){if(n.r(t),typeof window<`u`){var r=window.document.currentScript,i=n(`8875`);r=i(),`currentScript`in document||Object.defineProperty(document,"currentScript",{get:i});var a=r&&r.src.match(/(.+\/)[^/]+\.js(\?.*)?$/);a&&(n.p=a[1])}n(`99af`),n(`4de4`),n(`4160`),n(`c975`),n(`d81d`),n(`a434`),n(`159b`),n(`a4d3`),n(`e439`),n(`dbb4`),n(`b64b`);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function s(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function c(e){for(var t=1;t<arguments.length;t++){var n=arguments[t]==null?{}:arguments[t];t%2?s(Object(n),!0).forEach(function(t){o(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):s(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}function l(e){if(Array.isArray(e))return e}n(`e01a`),n(`d28b`),n(`e260`),n(`d3b7`),n(`3ca3`),n(`ddb0`);function u(e,t){if(typeof Symbol<`u`&&Symbol.iterator in Object(e)){var n=[],r=!0,i=!1,a=void 0;try{for(var o=e[Symbol.iterator](),s;!(r=(s=o.next()).done)&&(n.push(s.value),!(t&&n.length===t));r=!0);}catch(e){i=!0,a=e}finally{try{!r&&o.return!=null&&o.return()}finally{if(i)throw a}}return n}}n(`a630`),n(`fb6a`),n(`b0c0`),n(`25f0`);function d(e,t){(t==null||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function f(e,t){if(e){if(typeof e==`string`)return d(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);if(n===`Object`&&e.constructor&&(n=e.constructor.name),n===`Map`||n===`Set`)return Array.from(e);if(n===`Arguments`||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return d(e,t)}}function p(){throw TypeError(`Invalid attempt to destructure non-iterable instance.
|
|
12
12
|
In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function m(e,t){return l(e)||u(e,t)||f(e,t)||p()}function h(e){if(Array.isArray(e))return d(e)}function g(e){if(typeof Symbol<`u`&&Symbol.iterator in Object(e))return Array.from(e)}function _(){throw TypeError(`Invalid attempt to spread non-iterable instance.
|
|
13
13
|
In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function v(e){return h(e)||g(e)||f(e)||_()}var y=n(`a352`),b=n.n(y);function x(e){e.parentElement!==null&&e.parentElement.removeChild(e)}function S(e,t,n){var r=n===0?e.children[0]:e.children[n-1].nextSibling;e.insertBefore(t,r)}var C=n(`dbf1`);n(`13d5`),n(`4fad`),n(`ac1f`),n(`5319`);function w(e){var t=Object.create(null);return function(n){return t[n]||(t[n]=e(n))}}var T=/-(\w)/g,E=w(function(e){return e.replace(T,function(e,t){return t.toUpperCase()})});n(`5db7`),n(`73d9`);var D=[`Start`,`Add`,`Remove`,`Update`,`End`],O=[`Choose`,`Unchoose`,`Sort`,`Filter`,`Clone`],k=[`Move`],A=[k,D,O].flatMap(function(e){return e}).map(function(e){return`on${e}`}),j={manage:k,manageAndEmit:D,emit:O};function M(e){return A.indexOf(e)!==-1}n(`caad`),n(`2ca0`);var ee=`a.abbr.address.area.article.aside.audio.b.base.bdi.bdo.blockquote.body.br.button.canvas.caption.cite.code.col.colgroup.data.datalist.dd.del.details.dfn.dialog.div.dl.dt.em.embed.fieldset.figcaption.figure.footer.form.h1.h2.h3.h4.h5.h6.head.header.hgroup.hr.html.i.iframe.img.input.ins.kbd.label.legend.li.link.main.map.mark.math.menu.menuitem.meta.meter.nav.noscript.object.ol.optgroup.option.output.p.param.picture.pre.progress.q.rb.rp.rt.rtc.ruby.s.samp.script.section.select.slot.small.source.span.strong.style.sub.summary.sup.svg.table.tbody.td.template.textarea.tfoot.th.thead.time.title.tr.track.u.ul.var.video.wbr`.split(`.`);function te(e){return ee.includes(e)}function ne(e){return[`transition-group`,`TransitionGroup`].includes(e)}function re(e){return[`id`,`class`,`role`,`style`].includes(e)||e.startsWith(`data-`)||e.startsWith(`aria-`)||e.startsWith(`on`)}function N(e){return e.reduce(function(e,t){var n=m(t,2),r=n[0];return e[r]=n[1],e},{})}function P(e){var t=e.$attrs,n=e.componentData,r=n===void 0?{}:n;return c(c({},N(Object.entries(t).filter(function(e){var t=m(e,2),n=t[0];return t[1],re(n)}))),r)}function F(e){var t=e.$attrs,n=e.callBackBuilder,r=N(ie(t));Object.entries(n).forEach(function(e){var t=m(e,2),n=t[0],i=t[1];j[n].forEach(function(e){r[`on${e}`]=i(e)})});var i=`[data-draggable]${r.draggable||``}`;return c(c({},r),{},{draggable:i})}function ie(e){return Object.entries(e).filter(function(e){var t=m(e,2),n=t[0];return t[1],!re(n)}).map(function(e){var t=m(e,2),n=t[0],r=t[1];return[E(n),r]}).filter(function(e){var t=m(e,2),n=t[0];return t[1],!M(n)})}n(`c740`);function ae(e,t){if(!(e instanceof t))throw TypeError(`Cannot call a class as a function`)}function I(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,`value`in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function oe(e,t,n){return t&&I(e.prototype,t),n&&I(e,n),e}var se=function(e){return e.el},ce=function(e,t){return e.__draggable_context=t},le=function(e){return e.__draggable_context},L=function(){function e(t){var n=t.nodes,r=n.header,i=n.default,a=n.footer,o=t.root,s=t.realList;ae(this,e),this.defaultNodes=i,this.children=[].concat(v(r),v(i),v(a)),this.externalComponent=o.externalComponent,this.rootTransition=o.transition,this.tag=o.tag,this.realList=s}return oe(e,[{key:`render`,value:function(e,t){var n=this.tag,r=this.children;return e(n,t,this._isRootComponent?{default:function(){return r}}:r)}},{key:`updated`,value:function(){var e=this.defaultNodes,t=this.realList;e.forEach(function(e,n){ce(se(e),{element:t[n],index:n})})}},{key:`getUnderlyingVm`,value:function(e){return le(e)}},{key:`getVmIndexFromDomIndex`,value:function(e,t){var n=this.defaultNodes,r=n.length,i=t.children,a=i.item(e);if(a===null)return r;var o=le(a);if(o)return o.index;if(r===0)return 0;var s=se(n[0]);return e<v(i).findIndex(function(e){return e===s})?0:r}},{key:`_isRootComponent`,get:function(){return this.externalComponent||this.rootTransition}}]),e}(),ue=n(`8bbf`);function de(e,t){var n=e[t];return n?n():[]}function fe(e){var t=e.$slots,n=e.realList,r=e.getKey,i=n||[],a=m([`header`,`footer`].map(function(e){return de(t,e)}),2),o=a[0],s=a[1],l=t.item;if(!l)throw Error(`draggable element must have an item slot`);var u=i.flatMap(function(e,t){return l({element:e,index:t}).map(function(t){return t.key=r(e),t.props=c(c({},t.props||{}),{},{"data-draggable":!0}),t})});if(u.length!==i.length)throw Error(`Item slot must have only one child`);return{header:o,footer:s,default:u}}function pe(e){var t=ne(e),n=!te(e)&&!t;return{transition:t,externalComponent:n,tag:n?(0,ue.resolveComponent)(e):t?ue.TransitionGroup:e}}function R(e){var t=e.$slots,n=e.tag,r=e.realList,i=e.getKey;return new L({nodes:fe({$slots:t,realList:r,getKey:i}),root:pe(n),realList:r})}function me(e,t){var n=this;(0,ue.nextTick)(function(){return n.$emit(e.toLowerCase(),t)})}function he(e){var t=this;return function(n,r){if(t.realList!==null)return t[`onDrag${e}`](n,r)}}function ge(e){var t=this,n=he.call(this,e);return function(r,i){n.call(t,r,i),me.call(t,e,r)}}var _e=null,ve={list:{type:Array,required:!1,default:null},modelValue:{type:Array,required:!1,default:null},itemKey:{type:[String,Function],required:!0},clone:{type:Function,default:function(e){return e}},tag:{type:String,default:`div`},move:{type:Function,default:null},componentData:{type:Object,required:!1,default:null}},ye=[`update:modelValue`,`change`].concat(v([].concat(v(j.manageAndEmit),v(j.emit)).map(function(e){return e.toLowerCase()})));t.default=(0,ue.defineComponent)({name:`draggable`,inheritAttrs:!1,props:ve,emits:ye,data:function(){return{error:!1}},render:function(){try{this.error=!1;var e=this.$slots,t=this.$attrs,n=this.tag,r=this.componentData,i=this.realList,a=this.getKey,o=R({$slots:e,tag:n,realList:i,getKey:a});this.componentStructure=o;var s=P({$attrs:t,componentData:r});return o.render(ue.h,s)}catch(e){return this.error=!0,(0,ue.h)(`pre`,{style:{color:`red`}},e.stack)}},created:function(){this.list!==null&&this.modelValue!==null&&C.a.error(`modelValue and list props are mutually exclusive! Please set one or another.`)},mounted:function(){var e=this;if(!this.error){var t=this.$attrs,n=this.$el;this.componentStructure.updated();var r=F({$attrs:t,callBackBuilder:{manageAndEmit:function(t){return ge.call(e,t)},emit:function(t){return me.bind(e,t)},manage:function(t){return he.call(e,t)}}}),i=n.nodeType===1?n:n.parentElement;this._sortable=new b.a(i,r),this.targetDomElement=i,i.__draggable_component__=this}},updated:function(){this.componentStructure.updated()},beforeUnmount:function(){this._sortable!==void 0&&this._sortable.destroy()},computed:{realList:function(){return this.list||this.modelValue},getKey:function(){var e=this.itemKey;return typeof e==`function`?e:function(t){return t[e]}}},watch:{$attrs:{handler:function(e){var t=this._sortable;t&&ie(e).forEach(function(e){var n=m(e,2),r=n[0],i=n[1];t.option(r,i)})},deep:!0}},methods:{getUnderlyingVm:function(e){return this.componentStructure.getUnderlyingVm(e)||null},getUnderlyingPotencialDraggableComponent:function(e){return e.__draggable_component__},emitChanges:function(e){var t=this;(0,ue.nextTick)(function(){return t.$emit(`change`,e)})},alterList:function(e){if(this.list){e(this.list);return}var t=v(this.modelValue);e(t),this.$emit(`update:modelValue`,t)},spliceList:function(){var e=arguments;this.alterList(function(t){return t.splice.apply(t,v(e))})},updatePosition:function(e,t){this.alterList(function(n){return n.splice(t,0,n.splice(e,1)[0])})},getRelatedContextFromMoveEvent:function(e){var t=e.to,n=e.related,r=this.getUnderlyingPotencialDraggableComponent(t);if(!r)return{component:r};var i=r.realList,a={list:i,component:r};return t!==n&&i?c(c({},r.getUnderlyingVm(n)||{}),a):a},getVmIndexFromDomIndex:function(e){return this.componentStructure.getVmIndexFromDomIndex(e,this.targetDomElement)},onDragStart:function(e){this.context=this.getUnderlyingVm(e.item),e.item._underlying_vm_=this.clone(this.context.element),_e=e.item},onDragAdd:function(e){var t=e.item._underlying_vm_;if(t!==void 0){x(e.item);var n=this.getVmIndexFromDomIndex(e.newIndex);this.spliceList(n,0,t);var r={element:t,newIndex:n};this.emitChanges({added:r})}},onDragRemove:function(e){if(S(this.$el,e.item,e.oldIndex),e.pullMode===`clone`){x(e.clone);return}var t=this.context,n=t.index,r=t.element;this.spliceList(n,1);var i={element:r,oldIndex:n};this.emitChanges({removed:i})},onDragUpdate:function(e){x(e.item),S(e.from,e.item,e.oldIndex);var t=this.context.index,n=this.getVmIndexFromDomIndex(e.newIndex);this.updatePosition(t,n);var r={element:this.context.element,oldIndex:t,newIndex:n};this.emitChanges({moved:r})},computeFutureIndex:function(e,t){if(!e.element)return 0;var n=v(t.to.children).filter(function(e){return e.style.display!==`none`}),r=n.indexOf(t.related),i=e.component.getVmIndexFromDomIndex(r);return n.indexOf(_e)!==-1||!t.willInsertAfter?i:i+1},onDragMove:function(e,t){var n=this.move,r=this.realList;if(!n||!r)return!0;var i=this.getRelatedContextFromMoveEvent(e),a=this.computeFutureIndex(i,e),o=c(c({},this.context),{},{futureIndex:a});return n(c(c({},e),{},{relatedContext:i,draggedContext:o}),t)},onDragEnd:function(){_e=null}}})}),fb6a:(function(e,t,n){var r=n(`23e7`),i=n(`861d`),a=n(`e8b5`),o=n(`23cb`),s=n(`50c4`),c=n(`fc6a`),l=n(`8418`),u=n(`b622`),d=n(`1dde`),f=n(`ae40`),p=d(`slice`),m=f(`slice`,{ACCESSORS:!0,0:0,1:2}),h=u(`species`),g=[].slice,_=Math.max;r({target:`Array`,proto:!0,forced:!p||!m},{slice:function(e,t){var n=c(this),r=s(n.length),u=o(e,r),d=o(t===void 0?r:t,r),f,p,m;if(a(n)&&(f=n.constructor,typeof f==`function`&&(f===Array||a(f.prototype))?f=void 0:i(f)&&(f=f[h],f===null&&(f=void 0)),f===Array||f===void 0))return g.call(n,u,d);for(p=new(f===void 0?Array:f)(_(d-u,0)),m=0;u<d;u++,m++)u in n&&l(p,m,n[u]);return p.length=m,p}})}),fc6a:(function(e,t,n){var r=n(`44ad`),i=n(`1d80`);e.exports=function(e){return r(i(e))}}),fdbc:(function(e,t){e.exports={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0}}),fdbf:(function(e,t,n){e.exports=n(`4930`)&&!Symbol.sham&&typeof Symbol.iterator==`symbol`})}).default})}))(),1);R();var Xc=Ce(`testResults`,()=>{let e=n({}),t=n({}),r=n({}),i=n({});function a(n,a){e[n]=a.status,t[n]=a.message||``,r[n]=a.time??``,i[n]=a.latency||0}function o(e){for(let[t,n]of Object.entries(e))a(t,{status:n.status,message:n.message,time:n.time?new Date(n.time).toLocaleString():``,latency:n.latency})}async function s(){try{o(await D.get(`/api/test/results`))}catch{}}async function c(n){e[n]=`testing`,t[n]=``;try{let e=await D.post(`/api/test/proxy`,{model:n});a(n,{status:e.status,message:e.message,time:new Date().toLocaleString(),latency:e.latency})}catch(e){a(n,{status:`error`,message:e.message,time:new Date().toLocaleString(),latency:0})}}return{modelStatus:e,modelMessage:t,modelTime:r,modelLatency:i,loadResults:s,testProxy:c}});R(),y();var Zc=Ce(`quota`,()=>{let e=v({}),t=v([]),n=v(!1),r=v(!1),i=d(()=>t.value.flatMap(e=>e.hosts));function a(e){let n=(e??``).trim();if(n===``)return null;let r,i,a;try{let e=new URL(n);r=e.hostname.toLowerCase(),i=e.host.toLowerCase(),a=e.pathname}catch{return null}return t.value.find(e=>e.matchMode===`loopbackPath`&&(e.apiHosts??[]).includes(r)&&a.startsWith(e.pathPrefix??`/p/`))||(t.value.find(e=>e.matchMode!==`loopbackPath`&&(e.hosts.includes(r)||(e.apiHosts??[]).includes(r)||(e.apiOrigins??[]).includes(i)))??null)}function o(e){return a(e)!==null}function s(e){return a(e)?.credentialSource??null}async function c(){n.value=!0;try{let n=await D.get(`/api/quota`);t.value=n.vendors??[],e.value=n.providers??{}}finally{n.value=!1}}function l(t){return e.value[t]??null}function u(t,n){let r=n??void 0;return r&&(e.value[t]=r),r}async function f(e,t){return u(e,(await D.put(`/api/quota/${encodeURIComponent(e)}`,{fetchText:t})).entry)}async function p(t){await D.del(`/api/quota/${encodeURIComponent(t)}`),delete e.value[t]}async function m(e){return u(e,(await D.post(`/api/quota/${encodeURIComponent(e)}/refresh`)).entry)}async function h(){r.value=!0;try{for(let[t,n]of Object.entries(e.value))typeof n.fetchText==`string`&&n.fetchText!==``&&await m(t)}finally{r.value=!1}}return{providers:e,vendors:t,loading:n,refreshing:r,supportedHosts:i,supportsProvider:o,credentialSourceOf:s,load:c,entryOf:l,saveFetchText:f,remove:p,refresh:m,refreshAllConfigured:h}});R();function Qc(e){let t=Zc(),{toast:n}=Oe(),r=v(!1);async function i(){r.value=!0;try{let r=await t.refresh(e());r?.error?n(`额度查询失败:${r.error}`,`error`):n(`额度查询完成`,`success`)}catch(e){n(e instanceof Error?e.message:String(e),`error`)}finally{r.value=!1}}return{refreshing:r,refresh:i}}y(),x(),R(),ie();var $c={class:`quota-header`},el={class:`quota-header-stats`},tl={key:0,class:`quota-error`},nl={class:`quota-label`},rl={class:`quota-main`},il={key:1,class:`quota-cap-null`},al={class:`quota-label`},ol={class:`quota-main`},sl={class:`quota-label`},cl={class:`quota-main`},ll={class:`quota-cap-null`},ul={class:`quota-label`},dl={class:`quota-main`},fl={class:`quota-cap-null`},pl={key:1,class:`quota-hint`},ml={key:2,class:`quota-hint`},hl=we(o({__name:`QuotaBlock`,props:{provider:{}},setup(t){let n=t,i=Zc(),a=d(()=>i.entryOf(n.provider.name)),o=d(()=>i.credentialSourceOf(n.provider.apiBase)),s=d(()=>o.value===`pluginHost`?!0:o.value===`apiKey`?(n.provider.apiKey??``).trim()!==``:a.value?.fetchText!==void 0),c=d(()=>o.value===`apiKey`?`该供应商未配置 apiKey,无法自动查询额度——请在供应商编辑里填写 API key`:`未配置额度查询,点击卡片右下角「更多」→「额度查询配置」设置`),l=d(()=>a.value?.snapshot?.totalTokens??null),h=d(()=>a.value?.snapshot?.totalRuns??null),g=d(()=>a.value?.snapshot?.voucherBalance??null),y=d(()=>a.value?.snapshot?.balance??null),b=d(()=>a.value?.snapshot?.totalCost??null),x=e=>e>=1e8?`${(e/1e8).toFixed(2)} 亿`:e>=1e4?`${(e/1e4).toFixed(1)} 万`:e.toLocaleString(),{refreshing:S,refresh:C}=Qc(()=>n.provider.name),T=[{key:`fiveHour`,label:`5 小时额度`},{key:`weekly`,label:`周额度`},{key:`monthly`,label:`月额度`}],E=d(()=>{let e=a.value?.snapshot;return e?T.filter(t=>e[t.key]!==null):[]}),D=d(()=>a.value?.snapshot?.windows??[]),O=d(()=>{let e=a.value?.snapshot;if(!e)return[];let t=e=>{let t=[];if(e.cost!==null){let n=e.currency===`CNY`?`¥`:e.currency===`USD`?`$`:`${e.currency??``} `;t.push(`${n}${ne(e.cost)}`)}return e.requests!==null&&t.push(`${e.requests.toLocaleString()} 次`),t.join(` · `)},n=[];if(e.today!=null){let r=t(e.today);r!==``&&n.push({key:`today`,label:`今天`,text:r})}if(e.yesterday!=null){let r=t(e.yesterday);r!==``&&n.push({key:`yesterday`,label:`昨天`,text:r})}return n}),k=d(()=>a.value?.snapshot?.extraStats??[]),M=e=>a.value?.snapshot?.[e]??{used:0,cap:null,resetAt:null,exceeded:!1},ee=v(Date.now()),te;w(()=>{te=window.setInterval(()=>{ee.value=Date.now()},6e4)}),m(()=>{te!==void 0&&window.clearInterval(te)});let ne=e=>Number.isInteger(e)?String(e):e.toFixed(2),re=e=>e.cap===null||e.cap<=0?0:Math.min(100,Math.max(0,e.used/e.cap*100)),ie=e=>Math.min(100,Math.max(0,e)),ae=e=>{let t=[(e=>e.cap===null||e.cap<=0?``:`${ne(e.used/e.cap*100)}%`)(e),(e=>{if(e===null||e<=0)return`按账期结算`;let t=e-ee.value;if(t<=0)return`即将重置`;let n=t/36e5;return n<48?`${n.toFixed(1)} 小时后重置`:`${(n/24).toFixed(1)} 天后重置`})(e.resetAt)].filter(e=>e!==``);return`(${ne(e.used)} / ${e.cap??`-`})${t.length===0?``:` · ${t.join(` · `)}`}`};return(t,n)=>{let i=N(`el-tag`),o=N(`el-button`),d=N(`el-progress`);return A(),u(`div`,{class:`quota-block`,onClick:n[0]||=_(()=>{},[`stop`])},[F(`div`,$c,[n[2]||=F(`span`,{class:`quota-block-title`},`额度`,-1),F(`div`,el,[l.value===null?P(``,!0):(A(),e(i,{key:0,type:`info`,size:`small`,"disable-transitions":``},{default:I(()=>[f(`Token `+j(x(l.value)),1)]),_:1})),h.value===null?P(``,!0):(A(),e(i,{key:1,type:`info`,size:`small`,"disable-transitions":``},{default:I(()=>[f(`次数 `+j(h.value.toLocaleString()),1)]),_:1})),g.value===null?P(``,!0):(A(),e(i,{key:2,type:`info`,size:`small`,"disable-transitions":``},{default:I(()=>[f(`代金券 ¥`+j(g.value.toFixed(2)),1)]),_:1})),y.value===null?P(``,!0):(A(),e(i,{key:3,type:`info`,size:`small`,"disable-transitions":``},{default:I(()=>[f(`余额 ¥`+j(y.value.toFixed(2)),1)]),_:1})),b.value===null?P(``,!0):(A(),e(i,{key:4,type:`info`,size:`small`,"disable-transitions":``},{default:I(()=>[f(`消费 ¥`+j(b.value.toFixed(2)),1)]),_:1})),s.value?(A(),e(o,{key:5,link:``,size:`small`,loading:p(S),onClick:p(C)},{default:I(()=>[...n[1]||=[f(`刷新`,-1)]]),_:1},8,[`loading`,`onClick`])):P(``,!0)])]),a.value?.error?(A(),u(`div`,tl,`查询失败:`+j(a.value.error),1)):P(``,!0),s.value?(A(),u(me,{key:1},[a.value?.snapshot&&(E.value.length>0||D.value.length>0||O.value.length>0||k.value.length>0)?(A(),u(me,{key:0},[(A(!0),u(me,null,se(E.value,t=>(A(),u(`div`,{key:t.key,class:`quota-row`},[F(`span`,nl,j(t.label),1),F(`div`,rl,[M(t.key).cap===null?(A(),u(`span`,il,j(ne(M(t.key).used)),1)):(A(),e(d,{key:0,percentage:re(M(t.key)),"stroke-width":18,"text-inside":``,color:M(t.key).exceeded?`#f56c6c`:`#79bbff`,format:()=>ae(M(t.key))},null,8,[`percentage`,`color`,`format`]))])]))),128)),(A(!0),u(me,null,se(D.value,e=>(A(),u(`div`,{key:e.name,class:`quota-row`},[F(`span`,al,j(e.name),1),F(`div`,ol,[r(d,{percentage:ie(e.usedPercent),"stroke-width":18,"text-inside":``,color:e.usedPercent>=100?`#f56c6c`:`#79bbff`,format:()=>e.display},null,8,[`percentage`,`color`,`format`])])]))),128)),(A(!0),u(me,null,se(O.value,e=>(A(),u(`div`,{key:e.key,class:`quota-row`},[F(`span`,sl,j(e.label),1),F(`div`,cl,[F(`span`,ll,j(e.text),1)])]))),128)),(A(!0),u(me,null,se(k.value,e=>(A(),u(`div`,{key:e.label,class:`quota-row`},[F(`span`,ul,j(e.label),1),F(`div`,dl,[F(`span`,fl,j(e.value),1)])]))),128))],64)):a.value?.error?P(``,!0):(A(),u(`div`,pl,`暂无额度数据`))],64)):(A(),u(`div`,ml,j(c.value),1))])}}}),[[`__scopeId`,`data-v-08de3309`]]);y(),x(),ie(),R();var gl={class:`card-header`},_l={class:`card-title`},vl={class:`provider-name`},yl={class:`card-header-right`},bl={key:1,class:`model-tags`},xl=[`onClick`],Sl={key:0,class:`badge-mark`},Cl={key:1,class:`badge-mark`},wl={key:2,class:`text-empty`},Tl={class:`card-footer`},El=we(o({__name:`ProviderCard`,props:{provider:{}},emits:[`clone`,`delete`,`edit`,`open-models`,`open-quota-config`,`copy-model`,`toggle-enabled`],setup(t,{emit:n}){let i=t,a=n,{toast:o}=Oe(),s=Xc(),c=Zc(),l=d(()=>c.supportsProvider(i.provider.apiBase)),m=d(()=>c.credentialSourceOf(i.provider.apiBase)),h=d(()=>i.provider.enabled!==!1),g=async e=>{let t=!!e;if(t!==h.value){try{await Se.confirm(t?`确定启用该供应商(${y.value})?其 ${String(i.provider.models.length)} 个模型将对外提供。`:`确定停用该供应商(${y.value})?其 ${String(i.provider.models.length)} 个模型将立即停止对外提供(客户端请求返回 404),配置完整保留。`,t?`启用确认`:`停用确认`,{confirmButtonText:t?`启用`:`停用`,cancelButtonText:`取消`,type:`warning`})}catch{return}a(`toggle-enabled`,t)}},y=d(()=>Ae(i.provider)),b=e=>{e===`clone`&&a(`clone`),e===`delete`&&a(`delete`),e===`open-quota-config`&&a(`open-quota-config`)},x=v(!1),S=async()=>{let e=i.provider.models;x.value=!0;try{await Promise.all(e.map(e=>s.testProxy(e.modelName)));let t=e.filter(e=>s.modelStatus[e.modelName]===`ok`).length;o(`${y.value}: ${t}/${e.length} 个模型通过`,t===e.length?`success`:`error`)}catch{o(`测试出错`,`error`)}finally{x.value=!1}};return(n,i)=>{let o=N(`el-tag`),c=N(`el-switch`),d=N(`el-icon`),v=N(`el-button`),C=N(`el-dropdown-item`),w=N(`el-dropdown-menu`),T=N(`el-dropdown`),E=N(`el-card`);return A(),e(E,{shadow:`never`,class:ue([`provider-card`,{"is-disabled":!h.value}])},{header:I(()=>[F(`div`,gl,[F(`div`,_l,[F(`span`,vl,j(y.value),1),t.provider.alias&&t.provider.name!==t.provider.alias?(A(),e(o,{key:0,type:`info`,size:`small`},{default:I(()=>[f(j(t.provider.alias),1)]),_:1})):P(``,!0),h.value?P(``,!0):(A(),e(o,{key:1,type:`warning`,size:`small`,"disable-transitions":``},{default:I(()=>[...i[7]||=[f(`已停用`,-1)]]),_:1}))]),F(`div`,yl,[F(`div`,{class:`header-switch`,onMousedown:i[0]||=_(()=>{},[`stop`]),onTouchstart:i[1]||=_(()=>{},[`stop`]),onClick:i[2]||=_(()=>{},[`stop`])},[r(c,{"model-value":h.value,size:`small`,"inline-prompt":``,"active-text":`启用`,"inactive-text":`停用`,onChange:g},null,8,[`model-value`])],32),r(d,{class:`drag-hint-icon`},{default:I(()=>[r(p(ye))]),_:1})])])]),default:I(()=>[l.value?(A(),e(hl,{key:0,provider:t.provider},null,8,[`provider`])):P(``,!0),t.provider.models.length?(A(),u(`div`,bl,[(A(!0),u(me,null,se(t.provider.models,e=>(A(),u(`span`,{key:e.modelName,class:ue([`model-tag`,{ok:p(s).modelStatus[e.modelName]===`ok`,error:p(s).modelStatus[e.modelName]===`error`}]),onClick:_(t=>a(`copy-model`,e.modelName),[`stop`])},[f(j(e.modelName)+` `,1),p(s).modelStatus[e.modelName]===`ok`?(A(),u(`span`,Sl,`✓`)):P(``,!0),p(s).modelStatus[e.modelName]===`error`?(A(),u(`span`,Cl,`✗`)):P(``,!0)],10,xl))),128))])):(A(),u(`div`,wl,`暂无模型`)),F(`div`,Tl,[F(`span`,{class:`model-count`,onClick:i[3]||=_(e=>a(`open-models`),[`stop`])},j(t.provider.models.length)+` 个模型`,1),F(`div`,{class:`card-actions`,onClick:i[6]||=_(()=>{},[`stop`])},[r(v,{size:`small`,loading:x.value,disabled:x.value||!t.provider.models.length,onClick:S},{default:I(()=>[f(j(x.value?`测试中...`:`一键测试`),1)]),_:1},8,[`loading`,`disabled`]),r(v,{size:`small`,onClick:i[4]||=e=>a(`open-models`)},{default:I(()=>[...i[8]||=[f(`模型`,-1)]]),_:1}),r(v,{size:`small`,onClick:i[5]||=e=>a(`edit`)},{default:I(()=>[...i[9]||=[f(`编辑`,-1)]]),_:1}),r(T,{class:`dropdown`,trigger:`click`,onCommand:b},{dropdown:I(()=>[r(w,null,{default:I(()=>[r(C,{command:`clone`},{default:I(()=>[...i[10]||=[f(`复制供应商`,-1)]]),_:1}),l.value&&m.value===`fetchText`?(A(),e(C,{key:0,command:`open-quota-config`},{default:I(()=>[...i[11]||=[f(`额度查询配置`,-1)]]),_:1})):P(``,!0),r(C,{command:`delete`,divided:``,class:`danger-item`},{default:I(()=>[...i[12]||=[f(`删除`,-1)]]),_:1})]),_:1})]),default:I(()=>[r(v,{size:`small`,title:`更多操作`},{default:I(()=>[r(d,null,{default:I(()=>[r(p(ve))]),_:1})]),_:1})]),_:1})])])]),_:1},8,[`class`])}}}),[[`__scopeId`,`data-v-ba756612`]]),Dl=[{id:`deepseek`,name:`DeepSeek(按量 API)`,alias:`ds`,website:`https://platform.deepseek.com`,keyUrl:`https://platform.deepseek.com/api_keys`,keyNote:`登录 DeepSeek 开放平台 →「API keys」→ 创建。官方原生支持 Anthropic 协议:本模板已指向 Anthropic 兼容地址(api.deepseek.com/anthropic),配合 Claude Code 等客户端可原生保留缓存控制。同一把 Key 也可改用 OpenAI 协议地址 https://api.deepseek.com。`,apiBase:`https://api.deepseek.com/anthropic`,autoV1:!1,protocol:`anthropic`,presetModels:[`deepseek-v4-pro`,`deepseek-v4-flash`]},{id:`kimi`,name:`月之暗面 Kimi(按量 API)`,alias:`kimi`,website:`https://platform.kimi.com`,keyUrl:`https://platform.kimi.com/console/api-keys`,keyNote:`登录 Kimi 开放平台 →「API Key 管理」→ 新建。本模板指向 Anthropic 兼容地址(api.moonshot.cn/anthropic),配合 Claude Code 使用;1M 上下文模型名需加 [1m] 后缀(如 kimi-k3[1m])。同一把 Key 也可改用 OpenAI 协议地址 https://api.moonshot.cn/v1。`,apiBase:`https://api.moonshot.cn/anthropic`,autoV1:!1,protocol:`anthropic`,presetModels:[`kimi-k3`,`kimi-k2.7-code`]},{id:`zhipu`,name:`智谱 GLM(按量 API)`,alias:`zhipu`,website:`https://open.bigmodel.cn`,keyUrl:`https://bigmodel.cn/usercenter/proj-mgmt/apikeys`,keyNote:`登录智谱开放平台 →「API Keys」→ 创建。按量付费用此 Key + 本模板地址(OpenAI 兼容 /api/paas/v4)。若购买的是 Coding Plan 套餐,请改用下方「智谱 GLM(Coding Plan)」模板——套餐 Key 与按量 Key 不通用。`,apiBase:`https://open.bigmodel.cn/api/paas/v4`,autoV1:!1,protocol:`openai`,presetModels:[`glm-5.3`,`glm-5.3-flash`]},{id:`zhipu-coding`,name:`智谱 GLM(Coding Plan)`,alias:`zhipu-code`,website:`https://bigmodel.cn/coding-plan/personal/overview`,keyUrl:`https://bigmodel.cn/coding-plan/personal/overview`,keyNote:`Coding Plan 套餐专用:Key 在套餐页面单独获取,与按量付费 Key 不通用。本模板指向套餐 Anthropic 端点(/api/anthropic),供 Claude Code 等客户端使用;注意地址填错会把套餐额度按按量计费扣费。`,apiBase:`https://open.bigmodel.cn/api/anthropic`,autoV1:!1,protocol:`anthropic`,presetModels:[`glm-5.3`,`glm-5.3-flash`]},{id:`ark`,name:`火山方舟(按量 API)`,alias:`ark`,website:`https://console.volcengine.com/ark`,keyUrl:`https://console.volcengine.com/ark/region:cn-beijing/apikey`,keyNote:`火山方舟控制台 →「API Key 管理」→ 创建。API Key 鉴权可直接填模型名(如 doubao-seed-2.1-turbo);若使用 Access Key 鉴权则需填推理接入点 ID(ep-xxx)。购买 Coding Plan 套餐请改用下方「火山方舟(Coding Plan)」模板。`,apiBase:`https://ark.cn-beijing.volces.com/api/v3`,autoV1:!1,protocol:`openai`},{id:`ark-coding`,name:`火山方舟(Coding Plan)`,alias:`ark-code`,website:`https://console.volcengine.com/ark`,keyUrl:`https://console.volcengine.com/ark/region:cn-beijing/apikey`,keyNote:`Coding Plan 套餐专用端点(/api/coding/v3),模型直接填模型名(如 ark-code-latest 自动切换、doubao-seed-evolving、glm-5.3、deepseek-v4-flash 等),无需接入点。注意:误用按量地址(/api/v3)会把套餐额度按按量计费扣费。`,apiBase:`https://ark.cn-beijing.volces.com/api/coding/v3`,autoV1:!1,protocol:`openai`,presetModels:[`ark-code-latest`,`doubao-seed-evolving`]},{id:`dashscope`,name:`阿里云百炼(按量 API)`,alias:`ali`,website:`https://bailian.console.aliyun.com`,keyUrl:`https://bailian.console.aliyun.com/?apiKey=1`,keyNote:`登录阿里云百炼控制台 →右上角「API-KEY」→ 创建。本模板为 OpenAI 兼容地址(旧域名,仍可用);开通 Token Plan / Coding Plan 套餐的用户请到对应套餐控制台获取专属 Key 和地址。`,apiBase:`https://dashscope.aliyuncs.com/compatible-mode/v1`,autoV1:!1,protocol:`openai`,presetModels:[`qwen3.8-max`,`qwen3.7-plus`]},{id:`openai`,name:`OpenAI(按量 API)`,alias:`openai`,website:`https://platform.openai.com`,keyUrl:`https://platform.openai.com/api-keys`,keyNote:`登录 OpenAI 平台 →「API keys」→ 创建新密钥。官方支持 /v1/chat/completions 与 /v1/responses 两种协议(不支持 Anthropic 协议)。`,apiBase:`https://api.openai.com/v1`,autoV1:!1,protocol:`openai`,presetModels:[`gpt-5.6-sol`,`gpt-5.5`]},{id:`st`,name:`商汤`,alias:`st`,website:`https://senseaudio.cn/login?inviteCode=X5VH5PZY`,apiBase:`https://api.senseaudio.cn`,autoV1:!0,protocol:`openai`,presetModels:[`glm-5.3-flash`,`deepseek-v4-pro-0813`,`deepseek-v4-flash-0731`]},{id:`commandcode`,name:`CommandCode`,alias:`cd`,apiBase:`https://api.commandcode.ai/provider/v1`,autoV1:!1,protocol:`openai`,presetModels:[`z-ai/glm-5.3-flash`,`deepseek/deepseek-v4.1-flash`],keyNote:`登录 CommandCode 平台 → 控制台创建 API Key(user_ 前缀)。本模板指向 provider/v1 端点(OpenAI 协议),预置模型为上游命名空间名(全名自动加 cd/ 前缀)。该供应商支持额度查询:在供应商编辑弹窗的「额度查询」中粘贴浏览器复制的 billing/credits 接口 fetch 即可。`},{id:`custom`,name:`自定义 / OpenAI 兼容中转`,alias:``,keyNote:`不使用模板预填,按中转站文档填写即可;协议拿不准先用「测试」验证。`,apiBase:``,autoV1:!0,protocol:`openai`}];R();function Ol(e){let{toast:t}=Oe(),r=v(!1),i=v(null),a=n({}),o=()=>{for(let e of Object.keys(a))delete a[e]},s=()=>{i.value=null},c=async()=>{let n=e.api_key.trim(),r=e.api_base.trim();if(n&&r){i.value={loading:!0};try{let a=await D.post(`/api/test`,{api_base:r,api_key:n,protocol:e.protocol,autoV1:e.autoV1});a.status===`ok`?(i.value={loading:!1,status:`ok`,msg:`连接成功 (${a.models??0} 个模型)`},t(`连接成功`,`success`)):(i.value={loading:!1,status:`fail`,msg:a.message},t(`连接失败: ${a.message}`,`error`))}catch(e){i.value={loading:!1,status:`fail`,msg:e.message},t(e.message,`error`)}}},l=async n=>{a[n.full_name]={loading:!0};try{let r=await D.post(`/api/test/model`,{model:n.upstream,api_base:e.api_base.trim(),api_key:e.api_key.trim(),protocol:n.protocol||e.protocol,autoV1:e.autoV1});a[n.full_name]={loading:!1,status:r.status===`ok`?`ok`:`fail`,msg:r.status===`ok`&&r.latency!=null?`${r.message} · ${r.latency}ms`:r.message,request:r.request,response:r.response},t(r.status===`ok`?`模型可用`:`模型不可用: ${r.message}`,r.status===`ok`?`success`:`error`)}catch(e){a[n.full_name]={loading:!1,status:`fail`,msg:e.message},t(e.message,`error`)}};return{testingAll:r,keyStatus:i,modelTest:a,testKey:c,testModel:l,testAll:async()=>{let t=[...e.models];if(t.length){r.value=!0;try{await Promise.all(t.map(e=>l(e)))}finally{r.value=!1}}},clearModelTest:o,resetKeyStatus:s}}y(),x(),R();var kl={key:0,class:`detail-body`},Al={class:`detail-head`},jl={class:`detail-name`},Ml={class:`muted-sm`},Nl={class:`detail-pre`},Pl={class:`detail-pre`},Fl=we(o({__name:`TestDetailDialog`,props:{modelValue:{type:Boolean},detail:{}},emits:[`update:modelValue`],setup(t,{emit:n}){let i=t,a=n,o=v(`request`);M(()=>i.modelValue,e=>{e&&(o.value=`request`)});let s=e=>{if(e==null)return`(无)`;try{let t=new WeakSet;return JSON.stringify(e,(e,n)=>{if(n&&typeof n==`object`){if(t.has(n))return`[circular]`;t.add(n)}return n},2)}catch{return String(e)}};return(n,i)=>{let c=N(`el-tag`),l=N(`el-tab-pane`),d=N(`el-tabs`),p=N(`el-button`),m=N(`el-dialog`);return A(),e(m,{"model-value":t.modelValue,title:`测试详情`,width:`900px`,top:`5vh`,"align-center":``,"append-to-body":``,"onUpdate:modelValue":i[2]||=e=>a(`update:modelValue`,e)},{footer:I(()=>[r(p,{type:`primary`,onClick:i[1]||=e=>a(`update:modelValue`,!1)},{default:I(()=>[...i[3]||=[f(`关闭`,-1)]]),_:1})]),default:I(()=>[t.detail?(A(),u(`div`,kl,[F(`div`,Al,[F(`span`,jl,j(t.detail.name),1),r(c,{type:t.detail.status===`ok`?`success`:`danger`,size:`small`},{default:I(()=>[f(j(t.detail.status===`ok`?`成功`:`失败`),1)]),_:1},8,[`type`]),F(`span`,Ml,j(t.detail.msg),1)]),r(d,{modelValue:o.value,"onUpdate:modelValue":i[0]||=e=>o.value=e},{default:I(()=>[r(l,{label:`请求参数 (Request)`,name:`request`},{default:I(()=>[F(`pre`,Nl,j(s(t.detail.request)),1)]),_:1}),r(l,{label:`响应数据 (Response)`,name:`response`},{default:I(()=>[F(`pre`,Pl,j(s(t.detail.response)),1)]),_:1})]),_:1},8,[`modelValue`])])):P(``,!0)]),_:1},8,[`model-value`])}}}),[[`__scopeId`,`data-v-08dfa117`]]);y();var Il={class:`protocol-help`},Ll={class:`help-item`},Rl={class:`help-title`},zl={class:`help-item`},Bl={class:`help-title`},Vl={class:`help-item`},Hl={class:`help-title`},Ul={class:`help-item`},Wl=we(o({__name:`ProtocolHelpDialog`,props:{modelValue:{type:Boolean}},emits:[`update:modelValue`],setup(t,{emit:n}){let i=n,a=[{client:`Claude Code`,endpoint:`/v1/messages`,note:`Anthropic 协议入口;上游优先选 Anthropic Messages(官方支持时),缓存/思维链原生保留`},{client:`Codex CLI`,endpoint:`/v1/chat/completions`,note:`OpenAI Chat 协议入口;上游协议随意,网关自动转换`},{client:`其他 OpenAI SDK / 工具`,endpoint:`/v1/chat/completions`,note:`OpenAI Chat 协议入口(chat/completions 是事实标准)`}];return(n,o)=>{let s=N(`el-tag`),c=N(`el-divider`),l=N(`el-table-column`),u=N(`el-table`),d=N(`el-button`),p=N(`el-dialog`);return A(),e(p,{"model-value":t.modelValue,title:`上游协议怎么选?`,width:`760px`,"align-center":``,"append-to-body":``,"onUpdate:modelValue":o[1]||=e=>i(`update:modelValue`,e)},{footer:I(()=>[r(d,{type:`primary`,onClick:o[0]||=e=>i(`update:modelValue`,!1)},{default:I(()=>[...o[15]||=[f(`我知道了`,-1)]]),_:1})]),default:I(()=>[F(`div`,Il,[o[13]||=F(`p`,{class:`help-intro`},` 协议就是上游 API「说话的格式」——同样的模型,接口路径、请求和响应的字段都不一样。选错格式,请求会直接失败。 `,-1),F(`div`,Ll,[F(`div`,Rl,[o[3]||=f(`OpenAI Chat Completions `,-1),r(s,{size:`small`,type:`primary`},{default:I(()=>[...o[2]||=[f(`最常用`,-1)]]),_:1})]),o[4]||=F(`p`,null,`业界事实标准。DeepSeek、通义、Kimi、智谱、火山方舟等绝大多数国内外厂商,以及各类 OpenAI 兼容中转站,都用这套格式。`,-1)]),F(`div`,zl,[F(`div`,Bl,[o[6]||=f(`Anthropic Messages `,-1),r(s,{size:`small`,type:`success`},{default:I(()=>[...o[5]||=[f(`推荐优先`,-1)]]),_:1})]),o[7]||=F(`p`,null,[f(` Claude 官方格式,以 /v1/messages 为标志。DeepSeek 官方 API 等少数厂商原生支持。 `),F(`strong`,null,`如果上游官方支持,优先选它`),f(`——尤其在 Claude Code 这类客户端场景下,能原生保留缓存控制(省 token 费用)、思维链等能力,避免协议来回转换造成损耗。 `)],-1)]),F(`div`,Vl,[F(`div`,Hl,[o[9]||=f(`OpenAI Responses `,-1),r(s,{size:`small`,type:`info`},{default:I(()=>[...o[8]||=[f(`小众`,-1)]]),_:1})]),o[10]||=F(`p`,null,`OpenAI 官方推出的新一代接口(/v1/responses),目前基本只有 OpenAI 自家在用。`,-1)]),r(c),F(`div`,Ul,[o[11]||=F(`div`,{class:`help-title`},`常用客户端对照表`,-1),o[12]||=F(`p`,{class:`help-table-note`},`客户端接入本网关后用哪个入口,是客户端自己的属性,与上游协议选择无关;网关负责两边互转。`,-1),r(u,{data:a,size:`small`,border:``,class:`help-table`},{default:I(()=>[r(l,{prop:`client`,label:`客户端`,width:`150`}),r(l,{prop:`endpoint`,label:`网关入口`,width:`190`}),r(l,{prop:`note`,label:`说明`,"min-width":`220`})]),_:1})]),o[14]||=F(`div`,{class:`help-item`},[F(`div`,{class:`help-title`},`还是拿不准?`),F(`p`,null,`先选 OpenAI Chat Completions,添加模型后用「测试」按钮验证:成功即选对;报 404 / format 类错误时,换 Anthropic Messages 再试。`)],-1)])]),_:1},8,[`model-value`])}}}),[[`__scopeId`,`data-v-2248b61a`]]);y(),R(),x();var Gl={class:`full-width mb-8`},Kl={class:`flex-gap-8 mb-8`},ql={class:`model-select-wrap`},Jl={class:`muted-13`},Yl={key:0,class:`muted-12`},Xl=we(o({__name:`ProviderModelEditor`,props:{form:{},modelTest:{},testingAll:{type:Boolean},editingName:{}},emits:[`test-model`,`test-all`,`show-test-detail`],setup(t,{expose:n,emit:i}){let a=t,o=i,{toast:s}=Oe(),c=v([]),l=v([]),m=d(()=>c.value.filter(e=>!a.form.models.some(t=>t.full_name===(a.form.alias.trim()?`${a.form.alias.trim()}/${e}`:e)))),h=()=>{let e=a.form.alias.trim();for(let t of l.value){let n=t.trim();if(!n)continue;c.value.includes(n)||c.value.push(n);let r=e?`${e}/${n}`:n,i=2;for(;a.form.models.some(e=>e.full_name===r);)r=`${e?`${e}/`:``}${n}-${i}`,i+=1;a.form.models.push({full_name:r,upstream:n,protocol:a.form.protocol})}l.value=[]},g=e=>{a.form.models.splice(e,1)},_=async e=>{let t=await D.get(`/api/test/models-cache/${encodeURIComponent(e)}`).catch(()=>({models:[]}));c.value=t.models||[]},y=e=>{c.value=[...e],l.value=[...e],h()},b=()=>{c.value=[],l.value=[]},x=v(!1),S=v(``),C=async()=>{let e=async()=>{x.value=!0;try{let e=a.editingName==null?`new::${a.form.api_base.trim()}`:a.editingName,t=await D.post(`/api/test/fetch-models`,{api_base:a.form.api_base.trim(),api_key:a.form.api_key.trim(),keyId:e,protocol:a.form.protocol,autoV1:a.form.autoV1});t.status===`ok`&&t.models?.length>0?(c.value=[...new Set([...c.value,...t.models])],s(`已获取 ${t.models.length} 个模型`,`success`)):/404/.test(t.message||``)?s(`该供应商未提供模型列表接口(404)——请主动查询该供应商的 API 文档获取支持的模型,手动添加`,`error`):s(t.message||`未获取到模型`,`error`)}catch(e){s(e.message,`error`)}finally{x.value=!1}};if(!a.form.api_base.trim()||!a.form.api_key.trim())return;let t=[a.form.api_base.trim(),a.form.api_key.trim(),a.form.protocol,String(a.form.autoV1)].join(`|`);t===S.value||x.value||(S.value=t,await e())};return n({loadCachedModels:_,addPresetModels:y,resetState:b,autoFetchModels:C}),(n,i)=>{let a=N(`el-icon`),s=N(`el-tooltip`),c=N(`el-alert`),d=N(`el-option`),_=N(`el-select`),v=N(`el-button`),y=N(`el-table-column`),b=N(`el-input`),S=N(`el-switch`),w=N(`el-link`),T=N(`el-table`),E=N(`el-form-item`);return A(),e(E,{prop:`models`},{label:I(()=>[i[2]||=F(`span`,null,`模型列表`,-1),r(s,{placement:`top`,content:`这家供应商下你要用哪些模型。至少添加一个才能保存;客户端请求时填「模型全名」即可路由到这里。`},{default:I(()=>[r(a,{class:`col-help-icon`},{default:I(()=>[r(p(_e))]),_:1})]),_:1})]),default:I(()=>[F(`div`,Gl,[r(c,{type:`info`,closable:!1,"show-icon":``,title:`此处测试为直连上游(不经过网关),仅验证连通性;保存后可在列表卡片中测试完整代理链路。`})]),F(`div`,Kl,[F(`div`,ql,[r(_,{modelValue:l.value,"onUpdate:modelValue":i[0]||=e=>l.value=e,multiple:``,"collapse-tags":``,filterable:``,"allow-create":``,"default-first-option":``,loading:x.value,placeholder:`聚焦自动拉取模型列表;也可直接输入模型名`,onFocus:C},{default:I(()=>[(A(!0),u(me,null,se(m.value,t=>(A(),e(d,{key:t,label:t,value:t},null,8,[`label`,`value`]))),128))]),_:1},8,[`modelValue`,`loading`])]),r(v,{onClick:h,disabled:!l.value.length},{default:I(()=>[...i[3]||=[f(`添加`,-1)]]),_:1},8,[`disabled`]),r(v,{loading:t.testingAll,disabled:!t.form.models.length||!t.form.api_base||!t.form.api_key,onClick:i[1]||=e=>o(`test-all`)},{default:I(()=>[f(j(t.testingAll?``:`测试全部`),1)]),_:1},8,[`loading`,`disabled`])]),r(T,{border:``,data:t.form.models,class:`full-width`,"empty-text":`暂无模型`},{default:I(()=>[r(y,{type:`index`,label:`#`,width:`50`,align:`center`}),r(y,{"min-width":`260`},{header:I(()=>[i[4]||=F(`span`,{class:`col-help`},`模型全名(可编辑)`,-1),r(s,{placement:`top`,content:`发请求时实际使用的模型名称(客户端填的 model 参数),默认 = 别名/上游模型名,可自由修改;全局唯一,点击可复制。`},{default:I(()=>[r(a,{class:`col-help-icon`},{default:I(()=>[r(p(_e))]),_:1})]),_:1})]),default:I(({row:e})=>[r(b,{modelValue:e.full_name,"onUpdate:modelValue":t=>e.full_name=t},null,8,[`modelValue`,`onUpdate:modelValue`])]),_:1}),r(y,{prop:`upstream`,"min-width":`180`},{header:I(()=>[i[5]||=F(`span`,{class:`col-help`},`上游模型`,-1),r(s,{placement:`top`,content:`供应商 API 真实的模型标识(如 deepseek-chat、gpt-4o),请求会被转发给这个模型;同一上游模型可添加多次(如配不同协议),但模型全名不能重复。`},{default:I(()=>[r(a,{class:`col-help-icon`},{default:I(()=>[r(p(_e))]),_:1})]),_:1})]),default:I(({row:e})=>[F(`span`,Jl,j(e.upstream),1)]),_:1}),r(y,{width:`230`},{header:I(()=>[i[6]||=F(`span`,{class:`col-help`},`上游协议`,-1),r(s,{placement:`top`,content:`请求该模型时使用的 API 格式,默认继承上方供应商协议;个别模型可单独改(如同一供应商既有 OpenAI 风格又有 Anthropic 风格的模型)。`},{default:I(()=>[r(a,{class:`col-help-icon`},{default:I(()=>[r(p(_e))]),_:1})]),_:1})]),default:I(({row:e})=>[r(_,{modelValue:e.protocol,"onUpdate:modelValue":t=>e.protocol=t,class:`full-width`,size:`small`},{default:I(()=>[r(d,{label:`Anthropic Messages`,value:`anthropic`}),r(d,{label:`OpenAI Chat Completions`,value:`openai`}),r(d,{label:`OpenAI Responses`,value:`openai-responses`})]),_:1},8,[`modelValue`,`onUpdate:modelValue`])]),_:1}),r(y,{width:`120`,align:`center`},{header:I(()=>[i[7]||=F(`span`,{class:`col-help`},`完整透传`,-1),r(s,{placement:`top`,content:`开启后请求此模型不做任何参数加工(不注入、不补字段、不重建流),请求与响应都原样转发上游;仅保留模型名替换与 [DONE] 兜底。要求客户端协议与上游协议一致——用其它协议调用会直接报 400,不会自动转换。日志仍完整记录入站/上游/客户端三段原文。`},{default:I(()=>[r(a,{class:`col-help-icon`},{default:I(()=>[r(p(_e))]),_:1})]),_:1})]),default:I(({row:e})=>[r(S,{modelValue:e.rawPassthrough,"onUpdate:modelValue":t=>e.rawPassthrough=t},null,8,[`modelValue`,`onUpdate:modelValue`])]),_:1}),r(y,{label:`测试结果(直连)`,width:`170`,align:`center`},{default:I(({row:n})=>[t.modelTest[n.full_name]?.loading?(A(),u(`span`,Yl,`测试中...`)):t.modelTest[n.full_name]?.status?(A(),e(w,{key:1,type:t.modelTest[n.full_name].status===`ok`?`success`:`danger`,class:`test-result-link`,onClick:e=>o(`show-test-detail`,n.full_name)},{default:I(()=>[f(j(t.modelTest[n.full_name].msg),1)]),_:2},1032,[`type`,`onClick`])):P(``,!0)]),_:1}),r(y,{width:`140`,align:`center`,label:`操作`},{default:I(({row:e})=>[r(v,{link:``,loading:t.modelTest[e.full_name]?.loading,disabled:!t.form.api_base||!t.form.api_key,onClick:t=>o(`test-model`,e)},{default:I(()=>[...i[8]||=[f(`测试`,-1)]]),_:1},8,[`loading`,`disabled`,`onClick`]),r(v,{link:``,type:`danger`,onClick:n=>g(t.form.models.indexOf(e))},{default:I(()=>[...i[9]||=[f(`删除`,-1)]]),_:1},8,[`onClick`])]),_:1})]),_:1},8,[`data`])]),_:1})}}}),[[`__scopeId`,`data-v-67bd57e3`]]);y(),R(),x(),ie();var Zl={class:`dialog-body`},Ql={class:`flex-gap-8 full-width`},$l={class:`full-url-toggle label-inline-toggle`},eu={key:0,class:`muted-sm`},tu={key:0,class:`mt-4`},nu={key:0,class:`test-ok-text`},ru={key:1,class:`test-fail-text`},iu={key:1,class:`muted-sm`},au={class:`flex-gap-8 flex-center`},ou=we(o({__name:`ProviderModal`,props:{editName:{},provider:{},cloneOf:{}},emits:[`close`,`saved`],setup(t,{emit:i}){let a=t,o=i,{toast:s}=Oe(),c=Te(),l=Zc(),m=v(a.editName),h=d(()=>a.editName!=null),g=v(``),_=d(()=>Dl.find(e=>e.id===g.value)),y=e=>{let t=e=>ne.value?.addPresetModels(e),n=Dl.find(t=>t.id===e);n&&(S.name=n.name,S.alias=n.alias,S.website=n.website||``,S.api_base=n.apiBase,S.autoV1=n.autoV1,S.protocol=n.protocol,n.presetModels?.length&&!S.models.length&&t(n.presetModels))},b=()=>{let e=_.value?.keyUrl;e&&window.open(e,`_blank`,`noopener`)},x=()=>{let e=S.website.trim();e&&oe(e)&&window.open(e,`_blank`,`noopener`)},S=n({name:``,alias:``,website:``,api_base:``,protocol:`anthropic`,api_key:``,autoV1:!0,enabled:!0,models:[]}),{testingAll:C,keyStatus:T,modelTest:E,testKey:D,testModel:O,testAll:k,clearModelTest:ee,resetKeyStatus:te}=Ol(S),ne=v(null),re=()=>{ne.value?.autoFetchModels()},ie=v(),ae=v(!1),oe=e=>{try{let t=new URL(e);return t.protocol===`http:`||t.protocol===`https:`}catch{return!1}},ce=(e,t,n)=>{!t||oe(t)?n():n(Error(`请输入有效的 URL(以 http:// 或 https:// 开头)`))},le={name:[{required:!0,message:`请输入供应商名称`,trigger:`blur`}],alias:[{required:!0,message:`请输入供应商英文名称(别名)`,trigger:`blur`}],website:[{validator:ce,trigger:`blur`}],api_base:[{required:!0,message:`请输入请求地址 (API Base)`,trigger:`blur`},{validator:ce,trigger:`blur`}],api_key:[{required:!0,message:`请输入 API Key`,trigger:`blur`}]},L={anthropic:`/messages`,openai:`/chat/completions`,"openai-responses":`/responses`},ue=d(()=>{let e=S.api_base.trim().replace(/\/+$/,``);if(!e)return``;let t=L[S.protocol]||``;return S.autoV1&&!/\/v\d+$/i.test(e)?`${e}/v1${t}`:`${e}${t}`}),de=async()=>{let e=e=>ne.value?.loadCachedModels(e);Object.assign(S,{name:``,alias:``,website:``,api_base:``,protocol:`anthropic`,api_key:``,autoV1:!0,enabled:!0,models:[]}),ie.value?.clearValidate(),g.value=``,ne.value?.resetState(),te(),ee(),fe.value=!1,R.value=null;let t=a.provider;if(a.editName!=null&&t)await e(t.name),Object.assign(S,{name:t.name||``,alias:t.alias||``,website:t.website||``,api_base:t.apiBase||``,protocol:t.customLlmProvider||`anthropic`,api_key:t.apiKey||``,autoV1:t.autoV1!==!1,enabled:t.enabled!==!1,models:t.models.map(e=>({full_name:e.modelName,upstream:e.model,protocol:e.customLlmProvider||t.customLlmProvider||`anthropic`,rawPassthrough:e.rawPassthrough===!0}))});else if(a.cloneOf){let t=a.cloneOf;t.name&&await e(t.name);let n=t.alias?.trim(),r=n?`${n}-copy`:`copy`,i=`${t.name?.trim()||n||`供应商`}副本`;Object.assign(S,{name:i,alias:r,website:t.website||``,api_base:t.apiBase||``,protocol:t.customLlmProvider||`anthropic`,api_key:t.apiKey||``,autoV1:t.autoV1!==!1,enabled:t.enabled!==!1,models:(t.models||[]).map(e=>{let i=e.modelName;return n&&i.startsWith(`${n}/`)&&(i=`${r}/${i.slice(n.length+1)}`),{full_name:i,upstream:e.model,protocol:e.customLlmProvider||t.customLlmProvider||`anthropic`,rawPassthrough:e.rawPassthrough===!0}})})}};w(()=>{m.value=a.editName,de()}),M(()=>a.editName,async e=>{m.value=e,await de()});let fe=v(!1),pe=v(!1),R=v(null),ge=e=>{let t=E[e];t&&!t.loading&&(R.value={name:e,status:t.status||``,msg:t.msg||``,request:t.request,response:t.response},fe.value=!0)},ve=async()=>{let e=async(e,t)=>{if(t===null||t===e)return null;try{let n=l.entryOf(t);return n?.fetchText!==void 0&&(await l.saveFetchText(e,n.fetchText),await l.remove(t)),null}catch(e){return`额度配置迁移失败:${e?.message??String(e)}`}};if(!await ie.value?.validate().catch(()=>!1)){s(`请补全标红的必填项(名称、别名、请求地址、API Key)`,`error`);return}if(!S.models.length){s(`请至少添加一个模型`,`error`);return}let t=S.models.map(e=>({full_name:e.full_name.trim(),upstream:e.upstream.trim(),protocol:e.protocol||S.protocol,rawPassthrough:e.rawPassthrough===!0})).filter(e=>e.full_name);if(!t.length){s(`请至少填写一个有效的模型名称`,`error`);return}let n=S.name.trim(),r=S.alias.trim(),i=S.website.trim(),a=S.api_base.trim(),u=S.api_key.trim(),d=c.suppliers.filter(e=>e.name!==m.value);if(d.some(e=>e.name===n)){s(`供应商名称已存在: ${n}`,`error`);return}let f=d.filter(e=>e.enabled!==!1);if(S.enabled&&r&&f.some(e=>(e.alias??``).trim()===r)){s(`供应商别名已被启用中的供应商占用: ${r}`,`error`);return}let p={name:n,...r?{alias:r}:{},...i?{website:i}:{},customLlmProvider:S.protocol,apiKey:u,apiBase:a,...S.autoV1?{}:{autoV1:!1},...S.enabled?{}:{enabled:!1},models:t.map(e=>({modelName:e.full_name,model:e.upstream,...e.rawPassthrough?{rawPassthrough:!0}:{},...e.protocol&&e.protocol!==S.protocol?{customLlmProvider:e.protocol}:{}}))};if(S.enabled){let e=f.flatMap(e=>e.models.map(e=>e.modelName)),n=t.map(e=>e.full_name).find(t=>e.includes(t));if(n){s(`模型名称已被启用中的供应商占用: ${n}`,`error`);return}}ae.value=!0;try{let t=m.value==null,r=m.value,i=await c.saveProviders(t?[p,...d]:[...d,p]);t&&c.moveProviderToTop(n);let a=await e(n,r);a?s(a,`error`):s(i.message||`供应商已保存`,`success`),o(`saved`)}catch(e){s(e.message,`error`)}finally{ae.value=!1}};return(t,n)=>{let i=N(`el-alert`),s=N(`el-option`),c=N(`el-select`),l=N(`el-form-item`),d=N(`el-icon`),v=N(`el-tooltip`),w=N(`el-input`),M=N(`el-switch`),ee=N(`el-button`),te=N(`el-form`),oe=N(`el-dialog`);return A(),e(oe,{"model-value":!0,title:m.value?`编辑供应商`:`添加供应商`,width:`1200px`,top:`3vh`,"align-center":``,"close-on-click-modal":!1,onClose:n[13]||=e=>o(`close`)},{footer:I(()=>[F(`div`,au,[r(ee,{onClick:n[12]||=e=>o(`close`),disabled:ae.value},{default:I(()=>[...n[30]||=[f(` 取消 `,-1)]]),_:1},8,[`disabled`]),r(ee,{type:`primary`,loading:ae.value,onClick:ve},{default:I(()=>[f(j(ae.value?`保存中...`:m.value?`保存`:`添加供应商`),1)]),_:1},8,[`loading`])])]),default:I(()=>[F(`div`,Zl,[!h.value&&!a.cloneOf?(A(),e(i,{key:0,class:`mb-16`,type:`info`,closable:!1,"show-icon":``,title:`添加流程:选模板 → 去平台创建 API Key → 粘贴 Key → 测试 → 保存。全新手建议从「供应商模板」开始。`})):P(``,!0),r(te,{ref_key:`formRef`,ref:ie,model:S,rules:le,"label-position":`top`},{default:I(()=>[!h.value&&!a.cloneOf?(A(),e(l,{key:0,label:`供应商模板`},{default:I(()=>[F(`div`,Ql,[r(c,{modelValue:g.value,"onUpdate:modelValue":n[0]||=e=>g.value=e,class:`full-width`,placeholder:`选择模板快速填充,或选「自定义」手动填写`,onChange:y},{default:I(()=>[(A(!0),u(me,null,se(p(Dl),t=>(A(),e(s,{key:t.id,label:t.name,value:t.id},null,8,[`label`,`value`]))),128))]),_:1},8,[`modelValue`])]),n[14]||=F(`div`,{class:`muted-sm`},`内置常用厂商的地址和配置,选中后自动填充下方所有字段,仍可自由修改`,-1)]),_:1})):P(``,!0),r(l,{prop:`name`},{label:I(()=>[n[15]||=F(`span`,null,`供应商名称`,-1),r(v,{placement:`top`,content:`给你接入的 AI 服务起个名字,只在管理界面显示,随便起(如:DeepSeek、公司中转、朋友的号)。`},{default:I(()=>[r(d,{class:`col-help-icon`},{default:I(()=>[r(p(_e))]),_:1})]),_:1})]),default:I(()=>[r(w,{modelValue:S.name,"onUpdate:modelValue":n[1]||=e=>S.name=e,modelModifiers:{trim:!0},placeholder:`如:DeepSeek(仅用于界面展示)`},null,8,[`modelValue`])]),_:1}),r(l,null,{label:I(()=>[n[16]||=F(`span`,null,`启用`,-1),r(v,{placement:`top`,content:`关闭后本供应商的全部模型不参与网关路由(客户端请求会得到 404,模型列表也不显示),配置本身完整保留,随时可再开启。`},{default:I(()=>[r(d,{class:`col-help-icon`},{default:I(()=>[r(p(_e))]),_:1})]),_:1})]),default:I(()=>[r(M,{modelValue:S.enabled,"onUpdate:modelValue":n[2]||=e=>S.enabled=e},null,8,[`modelValue`]),n[17]||=F(`div`,{class:`muted-sm`},`关闭后本供应商的模型不再对外提供(卡片开关可随时切换)`,-1)]),_:1}),r(l,{prop:`alias`},{label:I(()=>[n[18]||=F(`span`,null,`供应商英文名称(别名)`,-1),r(v,{placement:`top`,content:`模型名的统一前缀。添加模型后名字会变成 前缀/模型名(如 ds/deepseek-chat),客户端选择模型时一眼能看出属于哪家。仅限英文小写。`},{default:I(()=>[r(d,{class:`col-help-icon`},{default:I(()=>[r(p(_e))]),_:1})]),_:1})]),default:I(()=>[r(w,{modelValue:S.alias,"onUpdate:modelValue":n[3]||=e=>S.alias=e,modelModifiers:{trim:!0},placeholder:`如:ds`},null,8,[`modelValue`]),n[19]||=F(`div`,{class:`muted-sm`},`添加模型时的默认名称前缀,如 ds/deepseek-chat`,-1)]),_:1}),r(l,{prop:`website`},{label:I(()=>[n[21]||=F(`span`,null,`官网链接`,-1),r(v,{placement:`top`,content:`选填。方便以后回来查文档、看模型列表;填了之后这里会出现「打开链接」按钮。`},{default:I(()=>[r(d,{class:`col-help-icon`},{default:I(()=>[r(p(_e))]),_:1})]),_:1}),S.website?(A(),e(ee,{key:0,class:`label-action-btn`,link:``,type:`primary`,onClick:x},{default:I(()=>[...n[20]||=[f(`打开链接`,-1)]]),_:1})):P(``,!0)]),default:I(()=>[r(w,{modelValue:S.website,"onUpdate:modelValue":n[4]||=e=>S.website=e,modelModifiers:{trim:!0},placeholder:`https://platform.deepseek.com(可选)`},null,8,[`modelValue`])]),_:1}),r(l,{prop:`api_base`},{label:I(()=>[n[23]||=F(`span`,null,`请求地址 (API Base)`,-1),r(v,{placement:`top`,content:`网关往哪发请求。官方厂商在「API 文档」里找,通常长得像 https://api.xxx.com;中转站会直接给你这个地址。模板会自动填好。`},{default:I(()=>[r(d,{class:`col-help-icon`},{default:I(()=>[r(p(_e))]),_:1})]),_:1}),F(`div`,$l,[n[22]||=F(`span`,{class:`muted-13`},`自动补全 /v1`,-1),r(M,{modelValue:S.autoV1,"onUpdate:modelValue":n[5]||=e=>S.autoV1=e},null,8,[`modelValue`])])]),default:I(()=>[r(w,{modelValue:S.api_base,"onUpdate:modelValue":n[6]||=e=>S.api_base=e,modelModifiers:{trim:!0},placeholder:`https://api.deepseek.com`},null,8,[`modelValue`]),ue.value?(A(),u(`div`,eu,` 实际请求地址:`+j(ue.value)+`(开启自动补全时,地址末尾无 /v1~v9 版本段会插入 /v1;上游无版本前缀请关闭) `,1)):P(``,!0)]),_:1}),r(l,null,{label:I(()=>[n[25]||=F(`span`,null,`上游协议 (Protocol)`,-1),r(ee,{class:`label-action-btn`,link:``,type:`primary`,onClick:n[7]||=e=>pe.value=!0},{default:I(()=>[...n[24]||=[f(` 如何选择 `,-1)]]),_:1})]),default:I(()=>[r(c,{modelValue:S.protocol,"onUpdate:modelValue":n[8]||=e=>S.protocol=e},{default:I(()=>[r(s,{label:`Anthropic Messages`,value:`anthropic`}),r(s,{label:`OpenAI Chat Completions`,value:`openai`}),r(s,{label:`OpenAI Responses`,value:`openai-responses`})]),_:1},8,[`modelValue`]),n[26]||=F(`div`,{class:`muted-sm protocol-hint`},` 上游接口的 API 风格,选错会请求失败;拿不准时先用下方「测试」逐个验证。 `,-1)]),_:1}),r(l,{prop:`api_key`},{label:I(()=>[n[29]||=F(`span`,null,`API Key`,-1),r(v,{placement:`top`,content:`你在上游平台的「钥匙」,证明请求是你发的、从你账户扣费。在平台控制台创建,形如 sk- 开头的一串字符,粘贴到这里即可。`},{default:I(()=>[r(d,{class:`col-help-icon`},{default:I(()=>[r(p(_e))]),_:1})]),_:1}),_.value?.keyUrl?(A(),e(ee,{key:0,class:`label-action-btn`,link:``,type:`primary`,onClick:b},{default:I(()=>[...n[27]||=[f(`获取 Key`,-1)]]),_:1})):P(``,!0),r(ee,{class:`label-action-btn`,link:``,type:`primary`,loading:p(T)?.loading,disabled:!S.api_base||!S.api_key,onClick:p(D)},{default:I(()=>[...n[28]||=[f(`测试`,-1)]]),_:1},8,[`loading`,`disabled`,`onClick`])]),default:I(()=>[r(w,{modelValue:S.api_key,"onUpdate:modelValue":n[9]||=e=>S.api_key=e,modelModifiers:{trim:!0},placeholder:`如:sk-xxxxxxxx(DeepSeek 开放平台密钥)`,onKeyup:he(p(D),[`enter`]),onBlur:re},null,8,[`modelValue`,`onKeyup`]),p(T)&&!p(T).loading?(A(),u(`div`,tu,[p(T).status===`ok`?(A(),u(`span`,nu,j(p(T).msg),1)):p(T).status===`fail`?(A(),u(`span`,ru,j(p(T).msg),1)):P(``,!0)])):P(``,!0),_.value?.keyNote?(A(),u(`div`,iu,j(_.value.keyNote),1)):P(``,!0)]),_:1}),r(Xl,{ref_key:`modelEditorRef`,ref:ne,form:S,"model-test":p(E),"testing-all":p(C),"editing-name":m.value,onTestModel:p(O),onTestAll:p(k),onShowTestDetail:ge},null,8,[`form`,`model-test`,`testing-all`,`editing-name`,`onTestModel`,`onTestAll`])]),_:1},8,[`model`])]),r(Fl,{modelValue:fe.value,"onUpdate:modelValue":n[10]||=e=>fe.value=e,detail:R.value},null,8,[`modelValue`,`detail`]),r(Wl,{modelValue:pe.value,"onUpdate:modelValue":n[11]||=e=>pe.value=e},null,8,[`modelValue`])]),_:1},8,[`title`])}}}),[[`__scopeId`,`data-v-54cea1cb`]]);y(),x(),R();var su={class:`models-dialog-body`},cu=[`onClick`],lu={class:`muted-13`},uu={key:3,class:`muted-disabled`},du={key:0,class:`muted-12`},fu={key:1,class:`muted-disabled`},pu={key:0,class:`muted-12`},mu={key:1,class:`muted-disabled`},hu=we(o({__name:`ProviderModelsDialog`,props:{modelValue:{type:Boolean},providerName:{}},emits:[`update:modelValue`,`copy-model`,`changed`],setup(t,{emit:n}){let i=t,a=n,{toast:o}=Oe(),s=Te(),c=Xc(),l=d(()=>i.providerName==null?void 0:s.suppliers.find(e=>e.name===i.providerName)),m=d(()=>{let e=l.value;return e?e.alias&&e.alias!==e.name?`${e.name}(${e.alias})`:e.name:``}),h=async e=>{try{await Se.confirm(`确定删除模型 "${e}"?`,`确认删除`,{confirmButtonText:`确定`,cancelButtonText:`取消`,type:`warning`}),await s.deleteModel(e),a(`changed`),o(`模型已删除`,`success`)}catch(e){e!==`cancel`&&o(e.message,`error`)}};return(n,i)=>{let o=N(`el-alert`),s=N(`el-table-column`),d=N(`el-tag`),g=N(`el-tooltip`),_=N(`el-button`),v=N(`el-table`),y=N(`el-empty`),b=N(`el-dialog`);return A(),e(b,{"model-value":t.modelValue,title:m.value,width:`1200px`,top:`3vh`,"destroy-on-close":``,"onUpdate:modelValue":i[0]||=e=>a(`update:modelValue`,e)},{default:I(()=>[F(`div`,su,[l.value?(A(),e(o,{key:0,class:`mb-8`,type:`info`,closable:!1,"show-icon":``,title:`测试走网关代理:请求经本网关转发至上游(含协议转换、计费记录),验证完整链路;编辑弹窗内测试为直连上游,仅验证连通性。`})):P(``,!0),l.value&&l.value.models.length?(A(),e(v,{key:1,border:``,data:l.value.models,stripe:``,class:`models-table full-width`},{default:I(()=>[r(s,{prop:`modelName`,label:`模型名称`,"min-width":`220`},{default:I(({row:e})=>[F(`span`,{class:`link-blue`,onClick:t=>a(`copy-model`,e.modelName),title:`点击复制`},j(e.modelName),9,cu)]),_:1}),r(s,{prop:`model`,label:`上游模型`,"min-width":`180`},{default:I(({row:e})=>[F(`span`,lu,j(e.model),1)]),_:1}),r(s,{prop:`customLlmProvider`,label:`上游协议`,width:`100`,align:`center`},{default:I(({row:e})=>[r(d,{type:`info`},{default:I(()=>[f(j(e.customLlmProvider||l.value.customLlmProvider),1)]),_:2},1024)]),_:1}),r(s,{label:`状态`,width:`150`,align:`center`},{default:I(({row:t})=>[p(c).modelStatus[t.modelName]===`ok`?(A(),e(d,{key:0,type:`success`},{default:I(()=>[...i[1]||=[f(`通过`,-1)]]),_:1})):p(c).modelStatus[t.modelName]===`error`?(A(),e(g,{key:1,content:p(c).modelMessage[t.modelName],placement:`top`,"show-after":300},{default:I(()=>[r(d,{type:`danger`,class:`error-tag`},{default:I(()=>[f(j(p(c).modelMessage[t.modelName]),1)]),_:2},1024)]),_:2},1032,[`content`])):p(c).modelStatus[t.modelName]===`testing`?(A(),e(d,{key:2,type:`warning`},{default:I(()=>[...i[2]||=[f(`测试中`,-1)]]),_:1})):(A(),u(`span`,uu,`-`))]),_:1}),r(s,{label:`耗时`,width:`80`,align:`center`},{default:I(({row:e})=>[p(c).modelLatency[e.modelName]?(A(),u(`span`,du,j(p(ke)(p(c).modelLatency[e.modelName])),1)):(A(),u(`span`,fu,`-`))]),_:1}),r(s,{label:`上次测试`,"min-width":`160`},{default:I(({row:e})=>[p(c).modelTime[e.modelName]?(A(),u(`span`,pu,j(p(c).modelTime[e.modelName]),1)):(A(),u(`span`,mu,`未测试`))]),_:1}),r(s,{label:`操作`,width:`140`,align:`center`},{default:I(({row:e})=>[r(_,{link:``,loading:p(c).modelStatus[e.modelName]===`testing`,onClick:t=>p(c).testProxy(e.modelName)},{default:I(()=>[...i[3]||=[f(` 测试 `,-1)]]),_:1},8,[`loading`,`onClick`]),r(_,{link:``,type:`danger`,onClick:t=>h(e.modelName)},{default:I(()=>[...i[4]||=[f(` 删除 `,-1)]]),_:1},8,[`onClick`])]),_:1})]),_:1},8,[`data`])):l.value?(A(),e(y,{key:2,description:`暂无模型`,"image-size":64})):P(``,!0)])]),_:1},8,[`model-value`,`title`])}}}),[[`__scopeId`,`data-v-7b39dd25`]]);y(),x(),R();var gu={class:`muted-sm mb-8`},_u={class:`flex-between`},vu=o({__name:`ConfigFileDialog`,props:{modelValue:{type:Boolean}},emits:[`update:modelValue`],setup(t,{emit:n}){let i=t,a=n,{toast:o}=Oe(),{copyWithToast:s}=De(),c=v(``),l=v(``);M(()=>i.modelValue,async e=>{if(e){c.value=``;try{let e=await D.get(`/api/config`);c.value=JSON.stringify(e,null,2)+`
|
|
14
|
-
`,l.value=`ezllm.config.json`}catch(e){o(e.message,`error`)}}});let u=async()=>{await s(c.value,`已复制`)};return(n,i)=>{let o=N(`el-input`),s=N(`el-button`),d=N(`el-dialog`);return A(),e(d,{"model-value":t.modelValue,title:`配置文件`,width:`800px`,top:`5vh`,"destroy-on-close":``,"onUpdate:modelValue":i[2]||=e=>a(`update:modelValue`,e)},{footer:I(()=>[F(`div`,_u,[r(s,{onClick:u},{default:I(()=>[...i[3]||=[f(`复制`,-1)]]),_:1}),r(s,{onClick:i[1]||=e=>a(`update:modelValue`,!1)},{default:I(()=>[...i[4]||=[f(`关闭`,-1)]]),_:1})])]),default:I(()=>[F(`div`,gu,`配置文件:`+j(l.value)+`(只读展示;修改请直接编辑该文件,保存后热更新生效)`,1),r(o,{type:`textarea`,rows:24,modelValue:c.value,"onUpdate:modelValue":i[0]||=e=>c.value=e,readonly:``,placeholder:`loading...`,spellcheck:`false`,class:`full-width`},null,8,[`modelValue`])]),_:1},8,[`model-value`])}}}),yu=`/assets/quota-help-fetch-node-S7ELzwnj.png`;y(),R();var bu={class:`quota-help`},xu={class:`help-item`},Su={class:`help-item`},Cu={class:`help-item`},wu=[`src`],Tu={class:`help-item`},Eu={class:`footer`},Du=we(o({__name:`QuotaHelpDialog`,props:{modelValue:{type:Boolean}},emits:[`update:modelValue`],setup(t,{emit:n}){let i=n,a=[{q:`提示「暂不支持该供应商」`,a:`粘贴的请求域名不在已支持列表里。目前仅支持已适配的供应商,其余需先适配后端实现。`},{q:`提示额度查询失败 / 401 / 403`,a:`粘贴的浏览器凭据失效了——上游撤销了登录会话(不会自愈),重新登录该网站再复制一次替换。`},{q:`CommandCode 为什么没有配置入口?`,a:`它已改为自动查询:额度接口与模型接口共用同一个 key,供应商配置里的 apiKey 填好即可,服务端每 10 分钟自动刷新,无需粘贴任何内容。`},{q:`提示未找到额度查询请求`,a:`粘贴的内容里没有该供应商的额度接口。确认复制的是用量 / 余额相关的请求,而不是普通页面接口。`},{q:`多久更新一次?`,a:`服务端每 10 分钟自动查一次;保存时也会立即查一次,方便你确认配置是否正确。`}];return(n,o)=>{let s=N(`el-tag`),c=N(`el-divider`),l=N(`el-table-column`),u=N(`el-table`),d=N(`el-alert`),m=N(`el-button`),h=N(`el-dialog`);return A(),e(h,{"model-value":t.modelValue,title:`怎么配置额度查询?`,width:`820px`,"align-center":``,"append-to-body":``,"onUpdate:modelValue":o[1]||=e=>i(`update:modelValue`,e)},{footer:I(()=>[F(`div`,Eu,[r(m,{type:`primary`,onClick:o[0]||=e=>i(`update:modelValue`,!1)},{default:I(()=>[...o[24]||=[f(`我知道了`,-1)]]),_:1})])]),default:I(()=>[F(`div`,bu,[o[22]||=F(`p`,{class:`help-intro`},` 部分供应商在网页上能看到 5 小时 / 周 / 月额度,但没有公开的额度 API 文档。本功能让你 提供一份浏览器凭据,服务端定时查询并展示。CommandCode 等支持 API key 直查的供应商 无需任何配置——供应商配置里填了 API key 就会自动查询。 `,-1),o[23]||=F(`div`,{class:`help-item`},[F(`div`,{class:`help-title`},`复制浏览器请求(适用需要粘贴凭据的供应商)`),F(`p`,null,`按下面三步操作即可;凭据是会话快照,失效后需重新复制。`)],-1),F(`div`,xu,[o[7]||=F(`div`,{class:`help-title`},`第一步:打开开发者工具`,-1),F(`p`,null,[o[3]||=f(` 在供应商的用量页面上按 `,-1),r(s,{size:`small`,type:`info`},{default:I(()=>[...o[2]||=[f(`F12`,-1)]]),_:1}),o[4]||=f(`(或右键 →「检查」), 切到 `,-1),o[5]||=F(`strong`,null,`Network(网络)`,-1),o[6]||=f(` 面板。 `,-1)])]),F(`div`,Su,[o[15]||=F(`div`,{class:`help-title`},`第二步:刷新页面并找到额度请求`,-1),F(`p`,null,[o[11]||=f(` 按 `,-1),r(s,{size:`small`,type:`info`},{default:I(()=>[...o[8]||=[f(`F5`,-1)]]),_:1}),o[12]||=f(` 刷新页面,面板里会冒出一串请求。在筛选框输入 `,-1),r(s,{size:`small`,type:`info`},{default:I(()=>[...o[9]||=[f(`usage`,-1)]]),_:1}),o[13]||=f(` 或 `,-1),r(s,{size:`small`,type:`info`},{default:I(()=>[...o[10]||=[f(`billing`,-1)]]),_:1}),o[14]||=f(` 缩小范围,找到返回额度数据的那条。 `,-1)]),o[16]||=F(`p`,{class:`help-tip`},[f(` 提示:点开某条请求看 `),F(`strong`,null,`Response(响应)`),f(` 选项卡,里面能看到 `),F(`code`,null,`fiveHour`),f(` / `),F(`code`,null,`weekly`),f(` / `),F(`code`,null,`credits`),f(` 之类字段的,就是要找的。 只找到一条也没关系,另一条服务端会自己补。 `)],-1)]),F(`div`,Cu,[o[17]||=F(`div`,{class:`help-title`},`第三步:复制为 fetch(Node.js 格式)`,-1),o[18]||=F(`p`,null,[f(` 在请求上 `),F(`strong`,null,`右键 → 复制 → 以 fetch (Node.js) 格式复制`),f(`, 然后粘贴到弹窗的「额度查询」文本框里。找到`),F(`strong`,null,`一条`),f(`即可。 `)],-1),F(`img`,{class:`help-shot`,src:p(yu),alt:`DevTools 网络面板:任意接口请求右键 → 复制 → 以 fetch (Node.js) 格式复制`},null,8,wu),o[19]||=F(`p`,{class:`help-tip`},[f(` 推荐 `),F(`strong`,null,`fetch (Node.js)`),f(` 这个格式:它会自动带上 `),F(`code`,null,`cookie`),f(` 登录凭据,一步到位。部分供应商(如火山方舟)的页面请求也能直接用, 端点由服务端自动换算。 `)],-1),o[20]||=F(`p`,{class:`help-tip`},[f(` 若右键菜单里没有 Node.js 选项,用 `),F(`strong`,null,`Copy as cURL`),f(` 同样可以(也带 Cookie);普通「Copy as fetch」通常`),F(`strong`,null,`不含 cookie`),f(`,用它的话需手动在 `),F(`code`,null,`headers`),f(` 里补上 `),F(`code`,null,`cookie`),f(` 字段,否则查询会因缺少登录凭据而失败。 `)],-1)]),r(c),F(`div`,Tu,[o[21]||=F(`div`,{class:`help-title`},`常见问题`,-1),r(u,{data:a,size:`small`,border:``,class:`help-table`},{default:I(()=>[r(l,{prop:`q`,label:`问题`,width:`220`}),r(l,{prop:`a`,label:`说明`,"min-width":`300`})]),_:1})]),r(d,{class:`mt-16`,type:`warning`,closable:!1,"show-icon":``,title:`粘贴的凭据(请求里的 Cookie / authorization)只保存在本机、仅用于定时查询额度,请勿分享给他人。`})])]),_:1},8,[`model-value`])}}}),[[`__scopeId`,`data-v-775466be`]]);y(),R(),x(),ie();var Ou={class:`dialog-body`},ku={class:`muted-sm`},Au={key:0},ju={key:0,class:`status-row`},Mu={class:`test-fail-text-full`},Nu={key:1,class:`status-row`},Pu={class:`test-ok-text-full`},Fu={key:2,class:`status-row`},Iu={class:`flex-gap-8 flex-center`},Lu=we(o({__name:`QuotaConfigDialog`,props:{modelValue:{type:Boolean},provider:{}},emits:[`update:modelValue`],setup(t,{emit:n}){let i=t,a=n,{toast:o}=Oe(),s=Zc(),c=v(!1),l=d(()=>s.supportedHosts),m=d(()=>s.entryOf(i.provider.name)),h=v(``);M(()=>i.modelValue,e=>{e&&(h.value=m.value?.fetchText||``)},{immediate:!0});let g=e=>typeof e==`number`&&e>0?new Date(e).toLocaleString():`未知时间`,{refreshing:y,refresh:b}=Qc(()=>i.provider.name),x=v(!1),S=async()=>{x.value=!0;try{let e=h.value.trim();if(e===``){m.value?.fetchText!==void 0&&(await s.remove(i.provider.name),o(`已清除额度查询配置`,`success`)),a(`update:modelValue`,!1);return}let t=await s.saveFetchText(i.provider.name,e);t?.error?o(`额度查询:${t.error}`,`error`):o(`额度查询配置已保存`,`success`),a(`update:modelValue`,!1)}catch(e){o(`额度配置保存失败:${e?.message??String(e)}`,`error`)}finally{x.value=!1}};return(n,i)=>{let o=N(`el-icon`),s=N(`el-tooltip`),d=N(`el-button`),v=N(`el-input`),C=N(`el-form-item`),w=N(`el-form`),T=N(`el-dialog`);return A(),e(T,{"model-value":t.modelValue,title:`额度查询配置 - ${t.provider.name}`,width:`720px`,"close-on-click-modal":!1,"append-to-body":``,"align-center":``,"onUpdate:modelValue":i[5]||=e=>a(`update:modelValue`,e)},{footer:I(()=>[F(`div`,Iu,[r(d,{onClick:i[4]||=e=>a(`update:modelValue`,!1),disabled:x.value},{default:I(()=>[...i[10]||=[f(`取消`,-1)]]),_:1},8,[`disabled`]),r(d,{type:`primary`,loading:x.value,onClick:S},{default:I(()=>[f(j(x.value?`保存中...`:`保存`),1)]),_:1},8,[`loading`])])]),default:I(()=>[F(`div`,Ou,[r(w,{"label-position":`top`,onSubmit:i[2]||=_(()=>{},[`prevent`])},{default:I(()=>[r(C,null,{label:I(()=>[i[7]||=F(`span`,null,`额度查询凭据(选填)`,-1),r(s,{placement:`top`,content:`粘贴从浏览器复制的 fetch 请求(一条即可),或供应商的 API key(如 CommandCode 的 user_…,长期有效);服务端每 10 分钟查一次该供应商的剩余额度,在供应商卡片展示。不填则不查询。`},{default:I(()=>[r(o,{class:`col-help-icon`},{default:I(()=>[r(p(_e))]),_:1})]),_:1}),r(d,{class:`label-action-btn`,link:``,type:`primary`,onClick:i[0]||=e=>c.value=!0},{default:I(()=>[...i[6]||=[f(`如何获取`,-1)]]),_:1})]),default:I(()=>[r(v,{modelValue:h.value,"onUpdate:modelValue":i[1]||=e=>h.value=e,type:`textarea`,rows:24,spellcheck:`false`,placeholder:`粘贴浏览器复制的 fetch 请求,或供应商的 API key(点击上方「如何获取」查看步骤)`},null,8,[`modelValue`]),F(`div`,ku,[i[8]||=f(` 留空 = 不查询该供应商额度;凭据(Cookie / API key)只保存在本机 `,-1),l.value.length?(A(),u(`span`,Au,` (已支持:`+j(l.value.join(`、`))+`) `,1)):P(``,!0)])]),_:1}),m.value?.error?(A(),u(`div`,ju,[F(`span`,Mu,`额度查询失败:`+j(m.value.error),1)])):m.value?.snapshot?(A(),u(`div`,Nu,[F(`span`,Pu,` 额度查询正常(`+j(m.value.vendorId)+`,更新于 `+j(g(m.value.fetchedAt))+`) `,1)])):P(``,!0),m.value?.fetchText===void 0?P(``,!0):(A(),u(`div`,Fu,[r(d,{size:`small`,loading:p(y),onClick:p(b)},{default:I(()=>[...i[9]||=[f(`立即查询`,-1)]]),_:1},8,[`loading`,`onClick`])]))]),_:1})]),r(Du,{modelValue:c.value,"onUpdate:modelValue":i[3]||=e=>c.value=e},null,8,[`modelValue`])]),_:1},8,[`model-value`,`title`])}}}),[[`__scopeId`,`data-v-8066b35a`]]);y(),R(),x();var Ru={class:`page-head`},zu={class:`page-head-sub`},Bu={class:`page-head-actions`},Vu={key:1,class:`loading-block`},Hu=we(o({__name:`ProvidersView`,setup(t){let{toast:n}=Oe(),{copyWithToast:i}=De(),a=Te(),o=Xc(),s=Zc(),{loadError:c,run:l}=Ee(),m=v(!1),h=v(null),g=v(null),_=v(!1),y=v(null),b=v(!1),x=v(!1),S=v(null),C=e=>{S.value=e,x.value=!0},T=d({get:()=>a.orderedProviders,set:e=>a.reorderProviders(e)}),E=()=>l(async()=>{await Promise.all([a.loadProviders(),o.loadResults(),s.load()])}),D=()=>{h.value=null,g.value=null,m.value=!0},O=e=>{h.value=e,g.value=null,m.value=!0},k=e=>{let t=a.suppliers.find(t=>t.name===e);t&&(h.value=null,g.value=t,m.value=!0)},M=()=>{m.value=!1,g.value=null},ee=async()=>{m.value=!1,g.value=null,await E()},te=async e=>{try{let t=a.suppliers.find(t=>t.name===e);if(!t)return;await Se.confirm(`确定删除该供应商(${Ae(t)})及其所有模型?`,`确认删除`,{confirmButtonText:`确定`,cancelButtonText:`取消`,type:`warning`}),await a.deleteProvider(t),await E(),n(`供应商已删除`,`success`)}catch(e){e!==`cancel`&&n(e.message,`error`)}},ne=e=>{y.value=e,_.value=!0},re=async(e,t)=>{let r=a.suppliers.map(n=>{if(n.name!==e)return n;if(t){let{enabled:e,...t}=n;return t}return{...n,enabled:!1}});try{let e=await a.saveProviders(r);await E(),n(e.message||(t?`供应商已启用`:`供应商已停用`),`success`)}catch(e){n(e.message||`操作失败`,`error`)}},ie=async e=>{await i(e,`已复制: ${e}`)};return w(E),(t,n)=>{let i=N(`el-icon`),o=N(`el-button`),s=N(`el-alert`),l=N(`el-empty`);return A(),u(`div`,null,[F(`div`,Ru,[F(`div`,null,[n[5]||=F(`div`,{class:`page-head-title`},`供应商`,-1),F(`div`,zu,j(p(a).providerCount)+` 个供应商 · `+j(p(a).totalModelCount)+` 个模型 · 拖拽卡片可调整顺序 `,1)]),F(`div`,Bu,[r(o,{onClick:n[0]||=e=>b.value=!0},{default:I(()=>[r(i,null,{default:I(()=>[r(p(be))]),_:1}),n[6]||=f(` 配置文件 `,-1)]),_:1}),r(o,{type:`primary`,onClick:D},{default:I(()=>[r(i,null,{default:I(()=>[r(p(xe))]),_:1}),n[7]||=f(` 添加供应商 `,-1)]),_:1})])]),p(c)?(A(),e(s,{key:0,title:p(c),type:`error`,"show-icon":``,closable:!1,class:`mb-16`},{default:I(()=>[r(o,{size:`small`,onClick:E},{default:I(()=>[...n[8]||=[f(`重试`,-1)]]),_:1})]),_:1},8,[`title`])):P(``,!0),p(a).loading?(A(),u(`div`,Vu,`加载中...`)):!p(c)&&p(a).orderedProviders.length===0?(A(),e(l,{key:2,description:`暂无供应商,点击上方按钮添加`})):(A(),e(p(Yc.default),{key:3,modelValue:T.value,"onUpdate:modelValue":n[1]||=e=>T.value=e,"item-key":`name`,filter:`.card-actions, .header-switch`,"prevent-on-filter":!1,"ghost-class":`ghost`,"drag-class":`dragging`,class:`provider-grid`},{item:I(({element:e})=>[r(El,{provider:e,onClone:t=>k(e.name),onDelete:t=>te(e.name),onEdit:t=>O(e.name),onOpenModels:t=>ne(e.name),onOpenQuotaConfig:t=>C(e),onCopyModel:ie,onToggleEnabled:t=>re(e.name,t)},null,8,[`provider`,`onClone`,`onDelete`,`onEdit`,`onOpenModels`,`onOpenQuotaConfig`,`onToggleEnabled`])]),_:1},8,[`modelValue`])),m.value?(A(),e(ou,{key:4,"edit-name":h.value,provider:h.value==null?void 0:p(a).suppliers.find(e=>e.name===h.value),"clone-of":g.value,onClose:M,onSaved:ee},null,8,[`edit-name`,`provider`,`clone-of`])):P(``,!0),r(hu,{modelValue:_.value,"onUpdate:modelValue":n[2]||=e=>_.value=e,"provider-name":y.value,onCopyModel:ie,onChanged:E},null,8,[`modelValue`,`provider-name`]),S.value?(A(),e(Lu,{key:5,modelValue:x.value,"onUpdate:modelValue":n[3]||=e=>x.value=e,provider:S.value},null,8,[`modelValue`,`provider`])):P(``,!0),r(vu,{modelValue:b.value,"onUpdate:modelValue":n[4]||=e=>b.value=e},null,8,[`modelValue`])])}}}),[[`__scopeId`,`data-v-550e94f2`]]);export{Hu as default};
|
|
14
|
+
`,l.value=`ezllm.config.json`}catch(e){o(e.message,`error`)}}});let u=async()=>{await s(c.value,`已复制`)};return(n,i)=>{let o=N(`el-input`),s=N(`el-button`),d=N(`el-dialog`);return A(),e(d,{"model-value":t.modelValue,title:`配置文件`,width:`800px`,top:`5vh`,"destroy-on-close":``,"onUpdate:modelValue":i[2]||=e=>a(`update:modelValue`,e)},{footer:I(()=>[F(`div`,_u,[r(s,{onClick:u},{default:I(()=>[...i[3]||=[f(`复制`,-1)]]),_:1}),r(s,{onClick:i[1]||=e=>a(`update:modelValue`,!1)},{default:I(()=>[...i[4]||=[f(`关闭`,-1)]]),_:1})])]),default:I(()=>[F(`div`,gu,`配置文件:`+j(l.value)+`(只读展示;修改请直接编辑该文件,保存后热更新生效)`,1),r(o,{type:`textarea`,rows:24,modelValue:c.value,"onUpdate:modelValue":i[0]||=e=>c.value=e,readonly:``,placeholder:`loading...`,spellcheck:`false`,class:`full-width`},null,8,[`modelValue`])]),_:1},8,[`model-value`])}}}),yu=`/assets/quota-help-fetch-node-S7ELzwnj.png`;y(),R();var bu={class:`quota-help`},xu={class:`help-item`},Su={class:`help-item`},Cu={class:`help-item`},wu=[`src`],Tu={class:`help-item`},Eu={class:`footer`},Du=we(o({__name:`QuotaHelpDialog`,props:{modelValue:{type:Boolean}},emits:[`update:modelValue`],setup(t,{emit:n}){let i=n,a=[{q:`提示「暂不支持该供应商」`,a:`粘贴的请求域名不在已支持列表里。目前仅支持已适配的供应商,其余需先适配后端实现。`},{q:`提示额度查询失败 / 401 / 403`,a:`粘贴的浏览器凭据失效了——上游撤销了登录会话(不会自愈),重新登录该网站再复制一次替换。`},{q:`CommandCode 为什么没有配置入口?`,a:`它已改为自动查询:额度接口与模型接口共用同一个 key,供应商配置里的 apiKey 填好即可,服务端每 10 分钟自动刷新,无需粘贴任何内容。`},{q:`提示未找到额度查询请求`,a:`粘贴的内容里没有该供应商的额度接口。确认复制的是用量 / 余额相关的请求,而不是普通页面接口。`},{q:`多久更新一次?`,a:`服务端每 10 分钟自动查一次;保存时也会立即查一次,方便你确认配置是否正确。`}];return(n,o)=>{let s=N(`el-tag`),c=N(`el-divider`),l=N(`el-table-column`),u=N(`el-table`),d=N(`el-alert`),m=N(`el-button`),h=N(`el-dialog`);return A(),e(h,{"model-value":t.modelValue,title:`怎么配置额度查询?`,width:`820px`,"align-center":``,"append-to-body":``,"onUpdate:modelValue":o[1]||=e=>i(`update:modelValue`,e)},{footer:I(()=>[F(`div`,Eu,[r(m,{type:`primary`,onClick:o[0]||=e=>i(`update:modelValue`,!1)},{default:I(()=>[...o[24]||=[f(`我知道了`,-1)]]),_:1})])]),default:I(()=>[F(`div`,bu,[o[22]||=F(`p`,{class:`help-intro`},` 部分供应商在网页上能看到 5 小时 / 周 / 月额度,但没有公开的额度 API 文档。本功能让你 提供一份浏览器凭据,服务端定时查询并展示。CommandCode 等支持 API key 直查的供应商 无需任何配置——供应商配置里填了 API key 就会自动查询。 `,-1),o[23]||=F(`div`,{class:`help-item`},[F(`div`,{class:`help-title`},`复制浏览器请求(适用需要粘贴凭据的供应商)`),F(`p`,null,`按下面三步操作即可;凭据是会话快照,失效后需重新复制。`)],-1),F(`div`,xu,[o[7]||=F(`div`,{class:`help-title`},`第一步:打开开发者工具`,-1),F(`p`,null,[o[3]||=f(` 在供应商的用量页面上按 `,-1),r(s,{size:`small`,type:`info`},{default:I(()=>[...o[2]||=[f(`F12`,-1)]]),_:1}),o[4]||=f(`(或右键 →「检查」), 切到 `,-1),o[5]||=F(`strong`,null,`Network(网络)`,-1),o[6]||=f(` 面板。 `,-1)])]),F(`div`,Su,[o[15]||=F(`div`,{class:`help-title`},`第二步:刷新页面并找到额度请求`,-1),F(`p`,null,[o[11]||=f(` 按 `,-1),r(s,{size:`small`,type:`info`},{default:I(()=>[...o[8]||=[f(`F5`,-1)]]),_:1}),o[12]||=f(` 刷新页面,面板里会冒出一串请求。在筛选框输入 `,-1),r(s,{size:`small`,type:`info`},{default:I(()=>[...o[9]||=[f(`usage`,-1)]]),_:1}),o[13]||=f(` 或 `,-1),r(s,{size:`small`,type:`info`},{default:I(()=>[...o[10]||=[f(`billing`,-1)]]),_:1}),o[14]||=f(` 缩小范围,找到返回额度数据的那条。 `,-1)]),o[16]||=F(`p`,{class:`help-tip`},[f(` 提示:点开某条请求看 `),F(`strong`,null,`Response(响应)`),f(` 选项卡,里面能看到 `),F(`code`,null,`fiveHour`),f(` / `),F(`code`,null,`weekly`),f(` / `),F(`code`,null,`credits`),f(` 之类字段的,就是要找的。 只找到一条也没关系,另一条服务端会自己补。 `)],-1)]),F(`div`,Cu,[o[17]||=F(`div`,{class:`help-title`},`第三步:复制为 fetch(Node.js 格式)`,-1),o[18]||=F(`p`,null,[f(` 在请求上 `),F(`strong`,null,`右键 → 复制 → 以 fetch (Node.js) 格式复制`),f(`, 然后粘贴到弹窗的「额度查询」文本框里。找到`),F(`strong`,null,`一条`),f(`即可。 `)],-1),F(`img`,{class:`help-shot`,src:p(yu),alt:`DevTools 网络面板:任意接口请求右键 → 复制 → 以 fetch (Node.js) 格式复制`},null,8,wu),o[19]||=F(`p`,{class:`help-tip`},[f(` 推荐 `),F(`strong`,null,`fetch (Node.js)`),f(` 这个格式:它会自动带上 `),F(`code`,null,`cookie`),f(` 登录凭据,一步到位。部分供应商(如火山方舟)的页面请求也能直接用, 端点由服务端自动换算。 `)],-1),o[20]||=F(`p`,{class:`help-tip`},[f(` 若右键菜单里没有 Node.js 选项,用 `),F(`strong`,null,`Copy as cURL`),f(` 同样可以(也带 Cookie);普通「Copy as fetch」通常`),F(`strong`,null,`不含 cookie`),f(`,用它的话需手动在 `),F(`code`,null,`headers`),f(` 里补上 `),F(`code`,null,`cookie`),f(` 字段,否则查询会因缺少登录凭据而失败。 `)],-1)]),r(c),F(`div`,Tu,[o[21]||=F(`div`,{class:`help-title`},`常见问题`,-1),r(u,{data:a,size:`small`,border:``,class:`help-table`},{default:I(()=>[r(l,{prop:`q`,label:`问题`,width:`220`}),r(l,{prop:`a`,label:`说明`,"min-width":`300`})]),_:1})]),r(d,{class:`mt-16`,type:`warning`,closable:!1,"show-icon":``,title:`粘贴的凭据(请求里的 Cookie / authorization)只保存在本机、仅用于定时查询额度,请勿分享给他人。`})])]),_:1},8,[`model-value`])}}}),[[`__scopeId`,`data-v-775466be`]]);y(),R(),x(),ie();var Ou={class:`dialog-body`},ku={class:`muted-sm`},Au={key:0},ju={key:0,class:`status-row`},Mu={class:`test-fail-text-full`},Nu={key:1,class:`status-row`},Pu={class:`test-ok-text-full`},Fu={key:2,class:`status-row`},Iu={class:`flex-gap-8 flex-center`},Lu=we(o({__name:`QuotaConfigDialog`,props:{modelValue:{type:Boolean},provider:{}},emits:[`update:modelValue`],setup(t,{emit:n}){let i=t,a=n,{toast:o}=Oe(),s=Zc(),c=v(!1),l=d(()=>s.supportedHosts),m=d(()=>s.entryOf(i.provider.name)),h=v(``);M(()=>i.modelValue,e=>{e&&(h.value=m.value?.fetchText||``)},{immediate:!0});let g=e=>typeof e==`number`&&e>0?new Date(e).toLocaleString():`未知时间`,{refreshing:y,refresh:b}=Qc(()=>i.provider.name),x=v(!1),S=async()=>{x.value=!0;try{let e=h.value.trim();if(e===``){m.value?.fetchText!==void 0&&(await s.remove(i.provider.name),o(`已清除额度查询配置`,`success`)),a(`update:modelValue`,!1);return}let t=await s.saveFetchText(i.provider.name,e);t?.error?o(`额度查询:${t.error}`,`error`):o(`额度查询配置已保存`,`success`),a(`update:modelValue`,!1)}catch(e){o(`额度配置保存失败:${e?.message??String(e)}`,`error`)}finally{x.value=!1}};return(n,i)=>{let o=N(`el-icon`),s=N(`el-tooltip`),d=N(`el-button`),v=N(`el-input`),C=N(`el-form-item`),w=N(`el-form`),T=N(`el-dialog`);return A(),e(T,{"model-value":t.modelValue,title:`额度查询配置 - ${t.provider.name}`,width:`720px`,"close-on-click-modal":!1,"append-to-body":``,"align-center":``,"onUpdate:modelValue":i[5]||=e=>a(`update:modelValue`,e)},{footer:I(()=>[F(`div`,Iu,[r(d,{onClick:i[4]||=e=>a(`update:modelValue`,!1),disabled:x.value},{default:I(()=>[...i[10]||=[f(`取消`,-1)]]),_:1},8,[`disabled`]),r(d,{type:`primary`,loading:x.value,onClick:S},{default:I(()=>[f(j(x.value?`保存中...`:`保存`),1)]),_:1},8,[`loading`])])]),default:I(()=>[F(`div`,Ou,[r(w,{"label-position":`top`,onSubmit:i[2]||=_(()=>{},[`prevent`])},{default:I(()=>[r(C,null,{label:I(()=>[i[7]||=F(`span`,null,`额度查询凭据(选填)`,-1),r(s,{placement:`top`,content:`粘贴从浏览器复制的 fetch 请求(一条即可),或供应商的 API key(如 CommandCode 的 user_…,长期有效);服务端每 10 分钟查一次该供应商的剩余额度,在供应商卡片展示。不填则不查询。`},{default:I(()=>[r(o,{class:`col-help-icon`},{default:I(()=>[r(p(_e))]),_:1})]),_:1}),r(d,{class:`label-action-btn`,link:``,type:`primary`,onClick:i[0]||=e=>c.value=!0},{default:I(()=>[...i[6]||=[f(`如何获取`,-1)]]),_:1})]),default:I(()=>[r(v,{modelValue:h.value,"onUpdate:modelValue":i[1]||=e=>h.value=e,type:`textarea`,rows:24,spellcheck:`false`,placeholder:`粘贴浏览器复制的 fetch 请求,或供应商的 API key(点击上方「如何获取」查看步骤)`},null,8,[`modelValue`]),F(`div`,ku,[i[8]||=f(` 留空 = 不查询该供应商额度;凭据(Cookie / API key)只保存在本机 `,-1),l.value.length?(A(),u(`span`,Au,` (已支持:`+j(l.value.join(`、`))+`) `,1)):P(``,!0)])]),_:1}),m.value?.error?(A(),u(`div`,ju,[F(`span`,Mu,`额度查询失败:`+j(m.value.error),1)])):m.value?.snapshot?(A(),u(`div`,Nu,[F(`span`,Pu,` 额度查询正常(`+j(m.value.vendorId)+`,更新于 `+j(g(m.value.fetchedAt))+`) `,1)])):P(``,!0),m.value?.fetchText===void 0?P(``,!0):(A(),u(`div`,Fu,[r(d,{size:`small`,loading:p(y),onClick:p(b)},{default:I(()=>[...i[9]||=[f(`立即查询`,-1)]]),_:1},8,[`loading`,`onClick`])]))]),_:1})]),r(Du,{modelValue:c.value,"onUpdate:modelValue":i[3]||=e=>c.value=e},null,8,[`modelValue`])]),_:1},8,[`model-value`,`title`])}}}),[[`__scopeId`,`data-v-8066b35a`]]);y(),R(),x();var Ru={class:`page-head`},zu={class:`page-head-sub`},Bu={class:`page-head-actions`},Vu={key:1,class:`loading-block`},Hu=we(o({__name:`ProvidersView`,setup(t){let{toast:n}=Oe(),{copyWithToast:i}=De(),a=Te(),o=Xc(),s=Zc(),{loadError:c,run:l}=Ee(),m=v(!1),h=v(null),g=v(null),_=v(!1),y=v(null),b=v(!1),x=v(!1),S=v(null),C=e=>{S.value=e,x.value=!0},T=v(`enabled`),E=d(()=>{let e=a.orderedProviders.filter(e=>e.enabled!==!1),t=a.orderedProviders.filter(e=>e.enabled===!1);return[{name:`enabled`,label:`已启用`,emptyText:`暂无启用的供应商`,providers:e},{name:`disabled`,label:`已停用`,emptyText:`暂无停用的供应商`,providers:t}]}),D=()=>l(async()=>{await Promise.all([a.loadProviders(),o.loadResults(),s.load()])}),O=()=>{h.value=null,g.value=null,m.value=!0},k=e=>{h.value=e,g.value=null,m.value=!0},M=e=>{let t=a.suppliers.find(t=>t.name===e);t&&(h.value=null,g.value=t,m.value=!0)},ee=()=>{m.value=!1,g.value=null},te=async()=>{m.value=!1,g.value=null,await D()},ne=async e=>{try{let t=a.suppliers.find(t=>t.name===e);if(!t)return;await Se.confirm(`确定删除该供应商(${Ae(t)})及其所有模型?`,`确认删除`,{confirmButtonText:`确定`,cancelButtonText:`取消`,type:`warning`}),await a.deleteProvider(t),await D(),n(`供应商已删除`,`success`)}catch(e){e!==`cancel`&&n(e.message,`error`)}},re=e=>{y.value=e,_.value=!0},ie=async(e,t)=>{let r=a.suppliers.map(n=>{if(n.name!==e)return n;if(t){let{enabled:e,...t}=n;return t}return{...n,enabled:!1}});try{let e=await a.saveProviders(r);await D(),n(e.message||(t?`供应商已启用`:`供应商已停用`),`success`)}catch(e){n(e.message||`操作失败`,`error`)}},ae=async e=>{await i(e,`已复制: ${e}`)};return w(D),(t,n)=>{let i=N(`el-icon`),o=N(`el-button`),s=N(`el-alert`),l=N(`el-empty`),d=N(`el-tab-pane`),v=N(`el-tabs`);return A(),u(`div`,null,[F(`div`,Ru,[F(`div`,null,[n[5]||=F(`div`,{class:`page-head-title`},`供应商`,-1),F(`div`,zu,j(p(a).providerCount)+` 个供应商 · `+j(p(a).totalModelCount)+` 个模型 · 拖拽卡片可调整顺序 `,1)]),F(`div`,Bu,[r(o,{onClick:n[0]||=e=>b.value=!0},{default:I(()=>[r(i,null,{default:I(()=>[r(p(be))]),_:1}),n[6]||=f(` 配置文件 `,-1)]),_:1}),r(o,{type:`primary`,onClick:O},{default:I(()=>[r(i,null,{default:I(()=>[r(p(xe))]),_:1}),n[7]||=f(` 添加供应商 `,-1)]),_:1})])]),p(c)?(A(),e(s,{key:0,title:p(c),type:`error`,"show-icon":``,closable:!1,class:`mb-16`},{default:I(()=>[r(o,{size:`small`,onClick:D},{default:I(()=>[...n[8]||=[f(`重试`,-1)]]),_:1})]),_:1},8,[`title`])):P(``,!0),p(a).loading?(A(),u(`div`,Vu,`加载中...`)):!p(c)&&p(a).orderedProviders.length===0?(A(),e(l,{key:2,description:`暂无供应商,点击上方按钮添加`})):(A(),e(v,{key:3,modelValue:T.value,"onUpdate:modelValue":n[1]||=e=>T.value=e,class:`provider-tabs`},{default:I(()=>[(A(!0),u(me,null,se(E.value,t=>(A(),e(d,{key:t.name,name:t.name,label:`${t.label} (${t.providers.length})`},{default:I(()=>[t.providers.length===0?(A(),e(l,{key:0,description:t.emptyText},null,8,[`description`])):(A(),e(p(Yc.default),{key:1,"model-value":t.providers,"item-key":`name`,filter:`.card-actions, .header-switch`,"prevent-on-filter":!1,"ghost-class":`ghost`,"drag-class":`dragging`,class:`provider-grid`,"onUpdate:modelValue":p(a).reorderProviders},{item:I(({element:e})=>[r(El,{provider:e,onClone:t=>M(e.name),onDelete:t=>ne(e.name),onEdit:t=>k(e.name),onOpenModels:t=>re(e.name),onOpenQuotaConfig:t=>C(e),onCopyModel:ae,onToggleEnabled:t=>ie(e.name,t)},null,8,[`provider`,`onClone`,`onDelete`,`onEdit`,`onOpenModels`,`onOpenQuotaConfig`,`onToggleEnabled`])]),_:1},8,[`model-value`,`onUpdate:modelValue`]))]),_:2},1032,[`name`,`label`]))),128))]),_:1},8,[`modelValue`])),m.value?(A(),e(ou,{key:4,"edit-name":h.value,provider:h.value==null?void 0:p(a).suppliers.find(e=>e.name===h.value),"clone-of":g.value,onClose:ee,onSaved:te},null,8,[`edit-name`,`provider`,`clone-of`])):P(``,!0),r(hu,{modelValue:_.value,"onUpdate:modelValue":n[2]||=e=>_.value=e,"provider-name":y.value,onCopyModel:ae,onChanged:D},null,8,[`modelValue`,`provider-name`]),S.value?(A(),e(Lu,{key:5,modelValue:x.value,"onUpdate:modelValue":n[3]||=e=>x.value=e,provider:S.value},null,8,[`modelValue`,`provider`])):P(``,!0),r(vu,{modelValue:b.value,"onUpdate:modelValue":n[4]||=e=>b.value=e},null,8,[`modelValue`])])}}}),[[`__scopeId`,`data-v-3ec999b9`]]);export{Hu as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
.quota-block[data-v-08de3309]{background:#fafbfc;border:1px solid #f0f2f5;border-radius:6px;margin-bottom:4px;padding:8px 10px}.quota-header[data-v-08de3309]{justify-content:space-between;align-items:center;gap:8px;margin-bottom:6px;display:flex}.quota-block-title[data-v-08de3309]{color:#303133;flex-shrink:0;font-size:13px;font-weight:600}.quota-header-stats[data-v-08de3309]{flex-wrap:wrap;justify-content:flex-end;align-items:center;gap:4px;min-width:0;display:flex}.quota-hint[data-v-08de3309]{color:#c0c4cc;font-size:12px}.quota-error[data-v-08de3309]{color:#f56c6c;word-break:break-all;margin-bottom:4px;font-size:12px}.quota-row[data-v-08de3309]{align-items:flex-start;gap:8px;padding:3px 0;display:flex}.quota-label[data-v-08de3309]{color:#909399;flex-shrink:0;width:72px;font-size:12px;line-height:18px}.quota-main[data-v-08de3309]{flex:1;min-width:0}.quota-main[data-v-08de3309] .el-progress{width:100%}.quota-main[data-v-08de3309] .el-progress-bar__outer{background-color:#f2f2f2}.quota-main[data-v-08de3309] .el-progress-bar__inner{align-items:center;display:flex}.quota-main[data-v-08de3309] .el-progress-bar__innerText{color:#303133;white-space:nowrap;margin:0 5px;font-size:12px;line-height:1}.quota-cap-null[data-v-08de3309]{color:#606266;font-size:12px}.provider-card[data-v-ba756612]{cursor:grab;min-width:0;transition:box-shadow .2s,border-color .2s}.provider-card[data-v-ba756612] .el-card__header{padding-bottom:10px}.provider-card[data-v-ba756612] .el-card__body{padding-top:12px}.provider-card[data-v-ba756612]:hover{border-color:var(--el-color-primary-light-5);box-shadow:var(--ez-card-shadow-hover)}.provider-card.dragging[data-v-ba756612]{cursor:grabbing}.provider-card.is-disabled[data-v-ba756612]{background:#fafafa}.provider-card.is-disabled .provider-name[data-v-ba756612]{color:#a8abb2}.provider-card.is-disabled[data-v-ba756612] .el-card__header{background:#fafafa}.card-header-right[data-v-ba756612]{flex-shrink:0;align-items:center;gap:10px;display:flex}.header-switch[data-v-ba756612]{cursor:auto;align-items:center;display:flex}.header-switch[data-v-ba756612] .el-switch{cursor:pointer}.card-header[data-v-ba756612]{justify-content:space-between;align-items:center;gap:12px;display:flex}.card-title[data-v-ba756612]{align-items:center;gap:8px;min-width:0;display:flex}.provider-name[data-v-ba756612]{color:#303133;text-overflow:ellipsis;white-space:nowrap;font-size:15px;font-weight:600;overflow:hidden}.card-actions[data-v-ba756612]{cursor:auto;flex-shrink:0;gap:0;display:flex}.model-tags[data-v-ba756612]{flex-wrap:wrap;gap:6px;margin-top:10px;display:flex}.model-tag[data-v-ba756612]{color:#606266;cursor:pointer;text-overflow:ellipsis;white-space:nowrap;background:#f5f7fa;border:1px solid #0000;border-radius:999px;align-items:center;max-width:100%;padding:3px 10px;font-size:12px;line-height:18px;transition:color .15s,background .15s;display:inline-flex;overflow:hidden}.model-tag[data-v-ba756612]:hover{color:#3b82f6;background:#eff6ff}.model-tag.ok[data-v-ba756612]{color:#16a34a;background:#f0fdf4}.model-tag.error[data-v-ba756612]{color:#dc2626;background:#fef2f2}.badge-mark[data-v-ba756612]{margin-left:3px}.card-footer[data-v-ba756612]{border-top:1px solid #f0f2f5;justify-content:space-between;align-items:center;margin-top:14px;padding-top:12px;display:flex}.model-count[data-v-ba756612]{color:#16a34a;cursor:pointer;border-radius:4px;font-size:13px;font-weight:500}.model-count[data-v-ba756612]:hover{text-decoration:underline}.drag-hint-icon[data-v-ba756612]{color:#c0c4cc;cursor:grab;flex-shrink:0}.drag-hint-icon[data-v-ba756612]:hover{color:#909399}.el-dropdown-menu__item.danger-item[data-v-ba756612]{color:var(--el-color-danger)}.el-dropdown-menu__item.danger-item[data-v-ba756612]:hover,.el-dropdown-menu__item.danger-item[data-v-ba756612]:focus{color:var(--el-color-danger);background-color:#fef2f2}.dropdown[data-v-ba756612]{margin-left:12px}.detail-body[data-v-08dfa117]{max-height:70vh;overflow-y:auto}.detail-head[data-v-08dfa117]{align-items:center;gap:12px;margin-bottom:12px;display:flex}.detail-name[data-v-08dfa117]{font-size:14px;font-weight:600}.detail-pre[data-v-08dfa117]{color:#303133;white-space:pre-wrap;word-break:break-all;background:#f5f7fa;border:1px solid #e4e7ed;border-radius:6px;max-height:300px;margin:0;padding:12px;font-size:12px;line-height:1.6;overflow:auto}.protocol-help .help-intro[data-v-2248b61a]{color:#606266;margin-bottom:14px;font-size:13px}.protocol-help .help-item[data-v-2248b61a]{margin-bottom:12px}.protocol-help .help-title[data-v-2248b61a]{color:#303133;align-items:center;gap:8px;margin-bottom:4px;font-size:14px;font-weight:600;display:flex}.protocol-help .help-item p[data-v-2248b61a]{color:#606266;margin:0;font-size:13px;line-height:1.7}.protocol-help .help-table-note[data-v-2248b61a]{margin-bottom:8px}.protocol-help .help-table[data-v-2248b61a]{width:100%}.model-select-wrap[data-v-67bd57e3]{flex-shrink:0;width:400px}.test-result-link[data-v-67bd57e3]{font-size:12px}.col-help[data-v-67bd57e3]{margin-right:4px}.dialog-body[data-v-54cea1cb]{max-height:80vh;padding-bottom:100px;overflow:hidden auto}.test-ok-text[data-v-54cea1cb]{color:#16a34a;text-overflow:ellipsis;white-space:nowrap;vertical-align:middle;max-width:140px;font-size:12px;display:inline-block;overflow:hidden}.test-fail-text[data-v-54cea1cb]{color:#dc2626;text-overflow:ellipsis;white-space:nowrap;vertical-align:middle;max-width:140px;font-size:12px;display:inline-block;overflow:hidden}.protocol-hint[data-v-54cea1cb]{line-height:1.8}.label-inline-toggle[data-v-54cea1cb]{align-items:center;gap:6px;margin-left:8px;display:inline-flex}.models-dialog-body[data-v-7b39dd25]{flex-direction:column;height:calc(94vh - 100px);display:flex}.models-dialog-body .models-table[data-v-7b39dd25]{flex:1;min-height:0}.error-tag[data-v-7b39dd25]{text-overflow:ellipsis;white-space:nowrap;max-width:100px;overflow:hidden}.quota-help[data-v-775466be]{background:#fff;height:70vh;overflow:hidden auto}.quota-help .help-intro[data-v-775466be]{color:#606266;margin-bottom:14px;font-size:13px;line-height:1.7}.quota-help .help-item[data-v-775466be]{margin-bottom:12px}.quota-help .help-title[data-v-775466be]{color:#303133;margin-bottom:4px;font-size:14px;font-weight:600}.quota-help .help-item p[data-v-775466be]{color:#606266;margin:0;font-size:13px;line-height:1.7}.quota-help .help-tip[data-v-775466be]{color:#909399!important;margin-top:4px!important}.quota-help .help-shot[data-v-775466be]{border:1px solid #dcdfe6;border-radius:6px;width:100%;margin:8px 0;display:block}.quota-help code[data-v-775466be]{background:#f5f7fa;border-radius:3px;padding:1px 4px;font-size:12px}.quota-help .help-table[data-v-775466be]{width:100%}.footer[data-v-775466be]{place-content:center;display:flex}.dialog-body[data-v-8066b35a]{min-height:70vh;overflow-y:auto}.muted-sm[data-v-8066b35a]{color:#909399;font-size:12px;line-height:1.6}.status-row[data-v-8066b35a]{margin-top:4px}.test-ok-text-full[data-v-8066b35a]{color:#16a34a;font-size:12px}.test-fail-text-full[data-v-8066b35a]{color:#dc2626;word-break:break-all;font-size:12px}.col-help-icon[data-v-8066b35a]{margin-left:4px}.ghost[data-v-
|
|
1
|
+
.quota-block[data-v-08de3309]{background:#fafbfc;border:1px solid #f0f2f5;border-radius:6px;margin-bottom:4px;padding:8px 10px}.quota-header[data-v-08de3309]{justify-content:space-between;align-items:center;gap:8px;margin-bottom:6px;display:flex}.quota-block-title[data-v-08de3309]{color:#303133;flex-shrink:0;font-size:13px;font-weight:600}.quota-header-stats[data-v-08de3309]{flex-wrap:wrap;justify-content:flex-end;align-items:center;gap:4px;min-width:0;display:flex}.quota-hint[data-v-08de3309]{color:#c0c4cc;font-size:12px}.quota-error[data-v-08de3309]{color:#f56c6c;word-break:break-all;margin-bottom:4px;font-size:12px}.quota-row[data-v-08de3309]{align-items:flex-start;gap:8px;padding:3px 0;display:flex}.quota-label[data-v-08de3309]{color:#909399;flex-shrink:0;width:72px;font-size:12px;line-height:18px}.quota-main[data-v-08de3309]{flex:1;min-width:0}.quota-main[data-v-08de3309] .el-progress{width:100%}.quota-main[data-v-08de3309] .el-progress-bar__outer{background-color:#f2f2f2}.quota-main[data-v-08de3309] .el-progress-bar__inner{align-items:center;display:flex}.quota-main[data-v-08de3309] .el-progress-bar__innerText{color:#303133;white-space:nowrap;margin:0 5px;font-size:12px;line-height:1}.quota-cap-null[data-v-08de3309]{color:#606266;font-size:12px}.provider-card[data-v-ba756612]{cursor:grab;min-width:0;transition:box-shadow .2s,border-color .2s}.provider-card[data-v-ba756612] .el-card__header{padding-bottom:10px}.provider-card[data-v-ba756612] .el-card__body{padding-top:12px}.provider-card[data-v-ba756612]:hover{border-color:var(--el-color-primary-light-5);box-shadow:var(--ez-card-shadow-hover)}.provider-card.dragging[data-v-ba756612]{cursor:grabbing}.provider-card.is-disabled[data-v-ba756612]{background:#fafafa}.provider-card.is-disabled .provider-name[data-v-ba756612]{color:#a8abb2}.provider-card.is-disabled[data-v-ba756612] .el-card__header{background:#fafafa}.card-header-right[data-v-ba756612]{flex-shrink:0;align-items:center;gap:10px;display:flex}.header-switch[data-v-ba756612]{cursor:auto;align-items:center;display:flex}.header-switch[data-v-ba756612] .el-switch{cursor:pointer}.card-header[data-v-ba756612]{justify-content:space-between;align-items:center;gap:12px;display:flex}.card-title[data-v-ba756612]{align-items:center;gap:8px;min-width:0;display:flex}.provider-name[data-v-ba756612]{color:#303133;text-overflow:ellipsis;white-space:nowrap;font-size:15px;font-weight:600;overflow:hidden}.card-actions[data-v-ba756612]{cursor:auto;flex-shrink:0;gap:0;display:flex}.model-tags[data-v-ba756612]{flex-wrap:wrap;gap:6px;margin-top:10px;display:flex}.model-tag[data-v-ba756612]{color:#606266;cursor:pointer;text-overflow:ellipsis;white-space:nowrap;background:#f5f7fa;border:1px solid #0000;border-radius:999px;align-items:center;max-width:100%;padding:3px 10px;font-size:12px;line-height:18px;transition:color .15s,background .15s;display:inline-flex;overflow:hidden}.model-tag[data-v-ba756612]:hover{color:#3b82f6;background:#eff6ff}.model-tag.ok[data-v-ba756612]{color:#16a34a;background:#f0fdf4}.model-tag.error[data-v-ba756612]{color:#dc2626;background:#fef2f2}.badge-mark[data-v-ba756612]{margin-left:3px}.card-footer[data-v-ba756612]{border-top:1px solid #f0f2f5;justify-content:space-between;align-items:center;margin-top:14px;padding-top:12px;display:flex}.model-count[data-v-ba756612]{color:#16a34a;cursor:pointer;border-radius:4px;font-size:13px;font-weight:500}.model-count[data-v-ba756612]:hover{text-decoration:underline}.drag-hint-icon[data-v-ba756612]{color:#c0c4cc;cursor:grab;flex-shrink:0}.drag-hint-icon[data-v-ba756612]:hover{color:#909399}.el-dropdown-menu__item.danger-item[data-v-ba756612]{color:var(--el-color-danger)}.el-dropdown-menu__item.danger-item[data-v-ba756612]:hover,.el-dropdown-menu__item.danger-item[data-v-ba756612]:focus{color:var(--el-color-danger);background-color:#fef2f2}.dropdown[data-v-ba756612]{margin-left:12px}.detail-body[data-v-08dfa117]{max-height:70vh;overflow-y:auto}.detail-head[data-v-08dfa117]{align-items:center;gap:12px;margin-bottom:12px;display:flex}.detail-name[data-v-08dfa117]{font-size:14px;font-weight:600}.detail-pre[data-v-08dfa117]{color:#303133;white-space:pre-wrap;word-break:break-all;background:#f5f7fa;border:1px solid #e4e7ed;border-radius:6px;max-height:300px;margin:0;padding:12px;font-size:12px;line-height:1.6;overflow:auto}.protocol-help .help-intro[data-v-2248b61a]{color:#606266;margin-bottom:14px;font-size:13px}.protocol-help .help-item[data-v-2248b61a]{margin-bottom:12px}.protocol-help .help-title[data-v-2248b61a]{color:#303133;align-items:center;gap:8px;margin-bottom:4px;font-size:14px;font-weight:600;display:flex}.protocol-help .help-item p[data-v-2248b61a]{color:#606266;margin:0;font-size:13px;line-height:1.7}.protocol-help .help-table-note[data-v-2248b61a]{margin-bottom:8px}.protocol-help .help-table[data-v-2248b61a]{width:100%}.model-select-wrap[data-v-67bd57e3]{flex-shrink:0;width:400px}.test-result-link[data-v-67bd57e3]{font-size:12px}.col-help[data-v-67bd57e3]{margin-right:4px}.dialog-body[data-v-54cea1cb]{max-height:80vh;padding-bottom:100px;overflow:hidden auto}.test-ok-text[data-v-54cea1cb]{color:#16a34a;text-overflow:ellipsis;white-space:nowrap;vertical-align:middle;max-width:140px;font-size:12px;display:inline-block;overflow:hidden}.test-fail-text[data-v-54cea1cb]{color:#dc2626;text-overflow:ellipsis;white-space:nowrap;vertical-align:middle;max-width:140px;font-size:12px;display:inline-block;overflow:hidden}.protocol-hint[data-v-54cea1cb]{line-height:1.8}.label-inline-toggle[data-v-54cea1cb]{align-items:center;gap:6px;margin-left:8px;display:inline-flex}.models-dialog-body[data-v-7b39dd25]{flex-direction:column;height:calc(94vh - 100px);display:flex}.models-dialog-body .models-table[data-v-7b39dd25]{flex:1;min-height:0}.error-tag[data-v-7b39dd25]{text-overflow:ellipsis;white-space:nowrap;max-width:100px;overflow:hidden}.quota-help[data-v-775466be]{background:#fff;height:70vh;overflow:hidden auto}.quota-help .help-intro[data-v-775466be]{color:#606266;margin-bottom:14px;font-size:13px;line-height:1.7}.quota-help .help-item[data-v-775466be]{margin-bottom:12px}.quota-help .help-title[data-v-775466be]{color:#303133;margin-bottom:4px;font-size:14px;font-weight:600}.quota-help .help-item p[data-v-775466be]{color:#606266;margin:0;font-size:13px;line-height:1.7}.quota-help .help-tip[data-v-775466be]{color:#909399!important;margin-top:4px!important}.quota-help .help-shot[data-v-775466be]{border:1px solid #dcdfe6;border-radius:6px;width:100%;margin:8px 0;display:block}.quota-help code[data-v-775466be]{background:#f5f7fa;border-radius:3px;padding:1px 4px;font-size:12px}.quota-help .help-table[data-v-775466be]{width:100%}.footer[data-v-775466be]{place-content:center;display:flex}.dialog-body[data-v-8066b35a]{min-height:70vh;overflow-y:auto}.muted-sm[data-v-8066b35a]{color:#909399;font-size:12px;line-height:1.6}.status-row[data-v-8066b35a]{margin-top:4px}.test-ok-text-full[data-v-8066b35a]{color:#16a34a;font-size:12px}.test-fail-text-full[data-v-8066b35a]{color:#dc2626;word-break:break-all;font-size:12px}.col-help-icon[data-v-8066b35a]{margin-left:4px}.ghost[data-v-3ec999b9]{opacity:.4}.provider-tabs[data-v-3ec999b9] .el-tabs__header{margin-bottom:20px}.provider-grid[data-v-3ec999b9]{grid-template-columns:repeat(2,1fr);gap:16px;display:grid}@media (width<=992px){.provider-grid[data-v-3ec999b9]{grid-template-columns:1fr}}
|