ezllm 0.0.42 → 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/server.js +56 -56
- package/dist/web-ui/assets/{DashboardView-DRckeG7f.js → DashboardView-DTL4kRw7.js} +1 -1
- package/dist/web-ui/assets/{LayoutView-4x7mM1Nd.js → LayoutView-CU11b-ex.js} +1 -1
- package/dist/web-ui/assets/{LoginView-D55GMnh2.js → LoginView-D1Bu2XC9.js} +1 -1
- package/dist/web-ui/assets/{LogsView-u-0B5Xpc.css → LogsView-CXFJ_22b.css} +1 -1
- package/dist/web-ui/assets/LogsView-qU6iMr5I.js +5 -0
- package/dist/web-ui/assets/{ManagedServicesView-aU7KD-uK.js → ManagedServicesView-B6JE5Odv.js} +1 -1
- package/dist/web-ui/assets/PluginsView-Ar17i6aK.css +1 -0
- package/dist/web-ui/assets/PluginsView-Cjv5DQzy.js +2 -0
- package/dist/web-ui/assets/{ProvidersView-BuCzzvhA.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-BfEtiG3k.js → ServiceStatusView-A8mjOoU-.js} +2 -2
- package/dist/web-ui/assets/{SettingsView-C3lfSDLN.js → SettingsView-CYnqDlfO.js} +1 -1
- package/dist/web-ui/assets/{SetupView-BB5YHhmw.js → SetupView-BSRObllO.js} +1 -1
- package/dist/web-ui/assets/{config-B3YP6GMt.js → config-CcujDHN0.js} +1 -1
- package/dist/web-ui/assets/format-CPPf8IfM.js +1 -0
- package/dist/web-ui/assets/{index-DVkpGX_l.js → index-B5mLXy9e.js} +1 -1
- package/dist/web-ui/assets/{message-JXw_u_ps.js → message-t8lJfFLj.js} +1 -1
- package/dist/web-ui/assets/providers-CqcnYJca.js +1 -0
- package/dist/web-ui/assets/{router-DxY62FPf.js → router-C6GERXs3.js} +2 -2
- package/dist/web-ui/assets/{useCopyToast-W6vLjLdg.js → useCopyToast-OBVjElCH.js} +1 -1
- package/dist/web-ui/assets/{useManagerApi-7t9qNB2C.js → useManagerApi-DoVhcoa7.js} +1 -1
- package/dist/web-ui/assets/{useQuickRangeFilter-BWtDACYs.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/LogsView-Ck8cUn2K.js +0 -5
- package/dist/web-ui/assets/PluginsView-XtlAtfkK.js +0 -2
- package/dist/web-ui/assets/PluginsView-ggYmqCJ8.css +0 -1
- package/dist/web-ui/assets/format-7jzqzMS_.js +0 -1
- package/dist/web-ui/assets/providers-CbsDigh3.js +0 -1
- package/dist/web-ui/assets/src-DLq1gsLr.js +0 -1
- package/dist/web-ui/assets/useToast-DgnKZwIF.js +0 -1
|
@@ -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}}
|
|
@@ -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,Q as s,Tt as c,V as l,Wt as u,Z as d,a as f,at as ee,et as p,fn as m,ht as h,it as g,j as _,k as v,ln as te,mt as y,nt as b,sn as ne,vt as x,w as S}from"./router-
|
|
2
|
-
`),cells:n}})),xe=(e,t)=>e===null&&t===null?0:e===null?1:t===null?-1:e-t,Se=i(()=>[...F.value].sort((e,t)=>{let n=e.lastOk===!1;if(n!==(t.lastOk===!1))return n?1:-1;let r=xe(e.avg24h,t.avg24h);return r===0?e.model.localeCompare(t.model):r})),Z=async e=>{if(e.length===0){W.value=new Map;return}let t=await Promise.all(e.map(async e=>{try{let t=await f.get(`/api/latency/trend?model=${encodeURIComponent(e)}&granularity=hour`);return[e,new Map((t.buckets??[]).map(e=>[e.bucketStart,e]))]}catch{return[e,new Map]}}));W.value=new Map(t)},Q=async()=>{let e=await f.get(`/api/latency/history`);return F.value=e.models??[],L.value=e.running,R.value=e.lastRunAt,e},$=()=>C(async()=>{try{await Q(),U.value=G(),await Z(F.value.map(e=>e.model))}finally{I.value=!1}}),Ce=()=>$(),we=()=>{B.value?V=window.setInterval(()=>void $(),5e3):V!==void 0&&(window.clearInterval(V),V=void 0)},Te=async()=>{z.value=!0;try{await f.post(`/api/latency/run`)}catch(e){l(e.message,`error`),z.value=!1;return}H=window.setInterval(async()=>{try{(await Q()).running||(window.clearInterval(H),H=void 0,z.value=!1,U.value=G(),await Z(F.value.map(e=>e.model)))}catch{}},2e3)};return d(()=>{$()}),s(()=>{V!==void 0&&window.clearInterval(V),H!==void 0&&window.clearInterval(H)}),(n,i)=>{let s=g(`el-button`),c=g(`el-alert`),l=g(`el-tag`),d=g(`el-checkbox`),f=g(`el-empty`),C=g(`el-card`),w=ee(`loading`);return p(),r(`div`,oe,[o(x)?(p(),e(c,{key:0,title:o(x),type:`error`,"show-icon":``,closable:!1,class:`mb-16`},{default:y(()=>[t(s,{size:`small`,onClick:Ce},{default:y(()=>[...i[1]||=[a(`重试`,-1)]]),_:1})]),_:1},8,[`title`])):_(``,!0),t(C,{shadow:`never`,class:`main-card`},{header:y(()=>[v(`div`,se,[v(`div`,ce,[i[3]||=v(`span`,{class:`fw-600`},`服务状态`,-1),L.value?(p(),e(l,{key:0,type:`warning`,size:`small`},{default:y(()=>[...i[2]||=[a(`测试进行中`,-1)]]),_:1})):R.value?(p(),e(l,{key:1,type:`info`,size:`small`},{default:y(()=>[a(` 上次测试 `+m(o(ae)(R.value)),1)]),_:1})):_(``,!0)]),v(`div`,D,[t(d,{modelValue:B.value,"onUpdate:modelValue":i[0]||=e=>B.value=e,onChange:we},{default:y(()=>[...i[4]||=[a(` 自动刷新(5s) `,-1)]]),_:1},8,[`modelValue`]),t(s,{loading:z.value,onClick:Te},{default:y(()=>[...i[5]||=[a(` 延迟测试 `,-1)]]),_:1},8,[`loading`])])])]),default:y(()=>[i[9]||=v(`div`,{class:`legend`},[v(`span`,{class:`legend-text`},`延迟`),v(`span`,{class:`legend-text`},`低`),v(`span`,{class:`legend-gradient`}),v(`span`,{class:`legend-text`},`高`),v(`span`,{class:`legend-swatch legend-swatch--down`}),v(`span`,{class:`legend-text`},`该小时有失败探测`),v(`span`,{class:`legend-swatch legend-swatch--empty`}),v(`span`,{class:`legend-text`},`无探测数据`)],-1),h((p(),r(`div`,O,[i[8]||=v(`div`,{class:`muted-sm hint`},` 右侧 24 格为最近 24 小时(每格 1 小时,本地整点对齐,最右格为当前小时)。 格子底色为当小时成功探测的平均延迟,全表统一色标(本期最快→最慢 绿→红); 当小时存在失败探测即视为不可用,显示灰色。 行按 24h 平均延迟升序,最近一次探测失败的模型沉底。 `,-1),X.value.length>0?(p(),r(`div`,k,[v(`div`,le,[i[6]||=v(`div`,{class:`col-name`},`模型名称`,-1),i[7]||=v(`div`,{class:`col-status`},`状态`,-1),v(`div`,ue,[(p(!0),r(S,null,b(_e.value,e=>(p(),r(`div`,{key:e.start,class:`cell cell--head`,title:e.fullLabel},[v(`span`,fe,m(e.dateLabel),1),v(`span`,null,m(e.hourLabel),1)],8,de))),128))])]),(p(!0),r(S,null,b(X.value,e=>(p(),r(`div`,{key:e.model,class:`gantt-row`},[v(`div`,pe,[v(`span`,{class:`copy-text model-name`,title:e.model,onClick:t=>o(u)(e.model)},m(e.model),9,me)]),v(`div`,{class:`col-status`,title:e.statusTitle},m(o(
|
|
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,et as p,fn as m,ht as h,it as g,j as _,k as v,ln as te,mt as y,nt as b,sn as ne,vt as x,w as S}from"./router-C6GERXs3.js";import{t as C}from"./index-B5mLXy9e.js";import{n as w,t as re}from"./useCopyToast-OBVjElCH.js";import{t as ie}from"./useToast-Du3Ickw8.js";import{_ as T,m as ae,u as E}from"./format-CPPf8IfM.js";l(),x(),u();var oe={class:`service-status-page`},se={class:`flex-between`},ce={class:`flex-gap-8`},D={class:`flex-gap-8`},O={class:`gantt-wrap`},k={key:0,class:`gantt`},le={class:`gantt-row gantt-head`},ue={class:`col-cells`},de=[`title`],fe={class:`cell-head-date`},pe={class:`col-name`},me=[`title`,`onClick`],he=[`title`],ge={class:`col-cells`},A=[`title`],j={key:1,class:`gantt-empty`},M=36e5,N=24,P=`#909399`,F=C(n({__name:`ServiceStatusView`,setup(n){let{toast:l}=ie(),{copyWithToast:u}=re(),{loadError:x,run:C}=w(`延迟数据加载失败,请重试`),F=c([]),I=c(!0),L=c(!1),R=c(null),z=c(!1),B=c(!1),V,H,U=c(G()),W=c(new Map);function G(){let e=new Date,t=new Date(e.getFullYear(),e.getMonth(),e.getDate(),e.getHours()).getTime();return Array.from({length:N},(e,n)=>t-(23-n)*M)}let K=e=>{let t=new Date(e);return Number.isNaN(t.getTime())?`-`:`${t.getFullYear()}-${T(t.getMonth()+1)}-${T(t.getDate())} ${T(t.getHours())}:00`},_e=i(()=>U.value.map(e=>{let t=new Date(e),n=T(t.getHours());return{start:e,dateLabel:`${T(t.getMonth()+1)}-${T(t.getDate())}`,hourLabel:n,fullLabel:`${K(e)} - ${n}:59`}})),ve=[103,194,58],q=[230,162,60],ye=[245,108,108],be=i(()=>{let e=[];for(let t of W.value.values())for(let n of t.values())n.avgLatencyMs!==null&&e.push(n.avgLatencyMs);if(e.length===0)return{min:0,max:0};let t=e[0],n=e[0];for(let r of e)r<t&&(t=r),r>n&&(n=r);return{min:t,max:n}}),J=e=>{let{min:t,max:n}=be.value,r=n===t?0:(e-t)/(n-t),[i,a]=r<=.5?[ve,q]:[q,ye],o=r<=.5?r*2:(r-.5)*2,s=i.map((e,t)=>Math.round(e+(a[t]-e)*o));return`rgba(${String(s[0])}, ${String(s[1])}, ${String(s[2])}, 0.9)`},Y=(e,t)=>{let n=`${K(t)} - ${T(new Date(t+M).getHours())}:00`;return e===void 0||e.total===0?`${n}\n无探测数据`:`${n}\n平均延迟 ${E(e.avgLatencyMs)}\n成功 ${String(e.success)} / 失败 ${String(e.failed)}`},X=i(()=>Se.value.map(e=>{let t=W.value.get(e.model),n=U.value.map(e=>{let n=t?.get(e);return n!==void 0&&n.failed>0?{start:e,className:`cell--down`,style:{backgroundColor:P},title:Y(n,e)}:n===void 0||n.avgLatencyMs===null?{start:e,className:`cell--empty`,style:{},title:Y(n,e)}:{start:e,className:``,style:{backgroundColor:J(n.avgLatencyMs)},title:Y(n,e)}});return{model:e.model,avg24h:e.avg24h,statusTitle:[e.avg24h===null?`最近 24 小时无成功探测记录`:`最近 24 小时成功探测平均延迟 ${E(e.avg24h)}`,e.lastLatencyMs==null?`最近一次探测:无成功延迟记录`:`最近一次探测延迟 ${E(e.lastLatencyMs)}`].join(`
|
|
2
|
+
`),cells:n}})),xe=(e,t)=>e===null&&t===null?0:e===null?1:t===null?-1:e-t,Se=i(()=>[...F.value].sort((e,t)=>{let n=e.lastOk===!1;if(n!==(t.lastOk===!1))return n?1:-1;let r=xe(e.avg24h,t.avg24h);return r===0?e.model.localeCompare(t.model):r})),Z=async e=>{if(e.length===0){W.value=new Map;return}let t=await Promise.all(e.map(async e=>{try{let t=await f.get(`/api/latency/trend?model=${encodeURIComponent(e)}&granularity=hour`);return[e,new Map((t.buckets??[]).map(e=>[e.bucketStart,e]))]}catch{return[e,new Map]}}));W.value=new Map(t)},Q=async()=>{let e=await f.get(`/api/latency/history`);return F.value=e.models??[],L.value=e.running,R.value=e.lastRunAt,e},$=()=>C(async()=>{try{await Q(),U.value=G(),await Z(F.value.map(e=>e.model))}finally{I.value=!1}}),Ce=()=>$(),we=()=>{B.value?V=window.setInterval(()=>void $(),5e3):V!==void 0&&(window.clearInterval(V),V=void 0)},Te=async()=>{z.value=!0;try{await f.post(`/api/latency/run`)}catch(e){l(e.message,`error`),z.value=!1;return}H=window.setInterval(async()=>{try{(await Q()).running||(window.clearInterval(H),H=void 0,z.value=!1,U.value=G(),await Z(F.value.map(e=>e.model)))}catch{}},2e3)};return d(()=>{$()}),s(()=>{V!==void 0&&window.clearInterval(V),H!==void 0&&window.clearInterval(H)}),(n,i)=>{let s=g(`el-button`),c=g(`el-alert`),l=g(`el-tag`),d=g(`el-checkbox`),f=g(`el-empty`),C=g(`el-card`),w=ee(`loading`);return p(),r(`div`,oe,[o(x)?(p(),e(c,{key:0,title:o(x),type:`error`,"show-icon":``,closable:!1,class:`mb-16`},{default:y(()=>[t(s,{size:`small`,onClick:Ce},{default:y(()=>[...i[1]||=[a(`重试`,-1)]]),_:1})]),_:1},8,[`title`])):_(``,!0),t(C,{shadow:`never`,class:`main-card`},{header:y(()=>[v(`div`,se,[v(`div`,ce,[i[3]||=v(`span`,{class:`fw-600`},`服务状态`,-1),L.value?(p(),e(l,{key:0,type:`warning`,size:`small`},{default:y(()=>[...i[2]||=[a(`测试进行中`,-1)]]),_:1})):R.value?(p(),e(l,{key:1,type:`info`,size:`small`},{default:y(()=>[a(` 上次测试 `+m(o(ae)(R.value)),1)]),_:1})):_(``,!0)]),v(`div`,D,[t(d,{modelValue:B.value,"onUpdate:modelValue":i[0]||=e=>B.value=e,onChange:we},{default:y(()=>[...i[4]||=[a(` 自动刷新(5s) `,-1)]]),_:1},8,[`modelValue`]),t(s,{loading:z.value,onClick:Te},{default:y(()=>[...i[5]||=[a(` 延迟测试 `,-1)]]),_:1},8,[`loading`])])])]),default:y(()=>[i[9]||=v(`div`,{class:`legend`},[v(`span`,{class:`legend-text`},`延迟`),v(`span`,{class:`legend-text`},`低`),v(`span`,{class:`legend-gradient`}),v(`span`,{class:`legend-text`},`高`),v(`span`,{class:`legend-swatch legend-swatch--down`}),v(`span`,{class:`legend-text`},`该小时有失败探测`),v(`span`,{class:`legend-swatch legend-swatch--empty`}),v(`span`,{class:`legend-text`},`无探测数据`)],-1),h((p(),r(`div`,O,[i[8]||=v(`div`,{class:`muted-sm hint`},` 右侧 24 格为最近 24 小时(每格 1 小时,本地整点对齐,最右格为当前小时)。 格子底色为当小时成功探测的平均延迟,全表统一色标(本期最快→最慢 绿→红); 当小时存在失败探测即视为不可用,显示灰色。 行按 24h 平均延迟升序,最近一次探测失败的模型沉底。 `,-1),X.value.length>0?(p(),r(`div`,k,[v(`div`,le,[i[6]||=v(`div`,{class:`col-name`},`模型名称`,-1),i[7]||=v(`div`,{class:`col-status`},`状态`,-1),v(`div`,ue,[(p(!0),r(S,null,b(_e.value,e=>(p(),r(`div`,{key:e.start,class:`cell cell--head`,title:e.fullLabel},[v(`span`,fe,m(e.dateLabel),1),v(`span`,null,m(e.hourLabel),1)],8,de))),128))])]),(p(!0),r(S,null,b(X.value,e=>(p(),r(`div`,{key:e.model,class:`gantt-row`},[v(`div`,pe,[v(`span`,{class:`copy-text model-name`,title:e.model,onClick:t=>o(u)(e.model)},m(e.model),9,me)]),v(`div`,{class:`col-status`,title:e.statusTitle},m(o(E)(e.avg24h)),9,he),v(`div`,ge,[(p(!0),r(S,null,b(e.cells,e=>(p(),r(`div`,{key:e.start,class:ne([`cell`,e.className]),style:te(e.style),title:e.title},null,14,A))),128))])]))),128))])):(p(),r(`div`,j,[t(f,{description:`暂无延迟数据,点击「延迟测试」开始`,"image-size":80})]))])),[[w,I.value]])]),_:1})])}}}),[[`__scopeId`,`data-v-95ae284d`]]);export{F 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,Q as s,Tt as c,V as l,Wt as u,Z as d,a as f,at as p,et as m,fn as h,ht as g,i as _,it as v,j as y,k as b,mt as x,n as S,nt as C,vt as w,w as T}from"./router-DxY62FPf.js";import{n as E,t as D}from"./index-DVkpGX_l.js";import{n as O,t as k}from"./useManagerApi-7t9qNB2C.js";import{t as A}from"./config-B3YP6GMt.js";import{n as j,t as M}from"./useCopyToast-W6vLjLdg.js";import{t as N}from"./useToast-DgnKZwIF.js";import{t as P}from"./updateNote-CttDt8SZ.js";l(),u(),w();var F={class:`flex-between`},I={class:`muted-sm mb-8`},L={class:`switch-row`},R={class:`switch-info`},z={class:`switch-title`},B={class:`switch-row`},V={class:`switch-info`},H={class:`switch-title`},U={class:`switch-row`},W={class:`switch-info`},G={class:`switch-title`},K=D(n({__name:`HarnessSwitches`,setup(n){let{toast:i}=N(),o=c(!0),s=c(!1),l=c(null),u=c(null),f=c(null),_=c(null),S=c(`success`),C=async e=>{e||(l.value?s.value=!0:o.value=!0);try{l.value=await k.harness(),u.value=null}catch(t){e||(u.value=t.message)}finally{e||(o.value=!1,s.value=!1)}};d(()=>C(!1));let w={claudeCode:{label:`Claude Code`,file:`~/.claude/settings.json`,toggle:k.setClaudeCode},codex:{label:`Codex CLI`,file:`~/.codex/config.toml`,toggle:k.setCodex},dsh:{label:`DeepSeek Harness`,file:`~/.dsh/settings.yaml`,toggle:k.setDsh}},D=async(e,t)=>{if(!l.value||f.value)return;let n=w[e],r=t?`确定开启 ${n.label} 代理?将改写 ${n.file}(开启前自动备份,关闭时从备份还原)。`:`确定关闭 ${n.label} 代理?将从备份还原 ${n.file}(无备份时移除代理相关配置)。`;try{await E.confirm(r,t?`开启确认`:`关闭确认`,{confirmButtonText:t?`开启`:`关闭`,cancelButtonText:`取消`,type:`warning`})}catch{return}f.value=e;try{let e=await n.toggle(t);_.value=e.note??null,S.value=t?`success`:`info`,i(t?`已开启代理`:`已关闭代理`,`success`)}catch(e){i(e.message||`操作失败`,`error`)}finally{f.value=null,await C(!0)}};return(n,i)=>{let c=v(`el-button`),d=v(`el-alert`),w=v(`el-tag`),E=v(`el-switch`),O=v(`el-divider`),k=v(`el-empty`),A=v(`el-card`),j=p(`loading`);return g((m(),e(A,{shadow:`never`},{header:x(()=>[b(`div`,F,[i[7]||=b(`span`,{class:`fw-600`},`代理开关`,-1),t(c,{loading:s.value,onClick:i[0]||=e=>C(!1)},{default:x(()=>[...i[6]||=[a(`刷新`,-1)]]),_:1},8,[`loading`])])]),default:x(()=>[l.value?(m(),r(T,{key:0},[b(`div`,I,` 将本机 CLI 工具的流量一键指向本机网关(`+h(l.value.gatewayBase)+`)。 开启前自动备份原配置为 *.ellm-bak(保留最早的原始备份),关闭时从备份还原。 `,1),_.value?(m(),e(d,{key:0,title:_.value,type:S.value,"show-icon":``,class:`mb-8`,onClose:i[1]||=e=>_.value=null},null,8,[`title`,`type`])):y(``,!0),b(`div`,L,[b(`div`,R,[b(`div`,z,[i[8]||=a(` Claude Code `,-1),t(w,{type:l.value.claudeCode?`success`:`info`,size:`small`,"disable-transitions":``},{default:x(()=>[a(h(l.value.claudeCode?`已开启`:`未开启`),1)]),_:1},8,[`type`])]),i[9]||=b(`div`,{class:`switch-desc`},[a(` 写入 `),b(`code`,null,`~/.claude/settings.json`),a(` 的 env.ANTHROPIC_BASE_URL / ANTHROPIC_AUTH_TOKEN, 鉴权取网关配置的 masterKey(未设置将开启失败);其余字段原样保留,重启 Claude Code 会话后生效。 `)],-1)]),t(E,{"model-value":l.value.claudeCode,loading:f.value===`claudeCode`,onChange:i[2]||=e=>D(`claudeCode`,!!e)},null,8,[`model-value`,`loading`])]),t(O,{class:`switch-divider`}),b(`div`,B,[b(`div`,V,[b(`div`,H,[i[10]||=a(` Codex CLI `,-1),t(w,{type:l.value.codex?`success`:`info`,size:`small`,"disable-transitions":``},{default:x(()=>[a(h(l.value.codex?`已开启`:`未开启`),1)]),_:1},8,[`type`])]),i[11]||=b(`div`,{class:`switch-desc`},[a(` 写入 `),b(`code`,null,`~/.codex/config.toml`),a(` 的 model_provider 与 [model_providers.ellm-proxy] 段 (保留用户注释与排版);开启后需按提示设置环境变量 ELLM_PROXY_API_KEY 供 Codex 鉴权。 `)],-1)]),t(E,{"model-value":l.value.codex,loading:f.value===`codex`,onChange:i[3]||=e=>D(`codex`,!!e)},null,8,[`model-value`,`loading`])]),t(O,{class:`switch-divider`}),b(`div`,U,[b(`div`,W,[b(`div`,G,[i[12]||=a(` DeepSeek Harness `,-1),t(w,{type:l.value.dsh?`success`:`info`,size:`small`,"disable-transitions":``},{default:x(()=>[a(h(l.value.dsh?`已开启`:`未开启`),1)]),_:1},8,[`type`])]),i[13]||=b(`div`,{class:`switch-desc`},[a(` 写入 `),b(`code`,null,`~/.dsh/settings.yaml`),a(` 的 llm-deepseek.baseURL 与 `),b(`code`,null,`~/.dsh/.credentials.yaml`),a(` 的 DEEPSEEK_API_KEY(取网关 masterKey,未设置则写占位值);模型请在 dsh 内选择与网关部署名一致的模型。 dsh 为 developer preview,配置格式可能随版本变化。 `)],-1)]),t(E,{"model-value":l.value.dsh,loading:f.value===`dsh`,onChange:i[4]||=e=>D(`dsh`,!!e)},null,8,[`model-value`,`loading`])])],64)):(m(),e(k,{key:1,description:u.value||`暂无开关状态`},{default:x(()=>[t(c,{type:`primary`,onClick:i[5]||=e=>C(!1)},{default:x(()=>[...i[14]||=[a(`重试`,-1)]]),_:1})]),_:1},8,[`description`]))]),_:1})),[[j,o.value]])}}}),[[`__scopeId`,`data-v-fb084a91`]]);l(),u(),w();var q={class:`service-settings`},J={class:`flex-between`},Y={key:0,class:`switch-row`},ee={class:`switch-info`},te={class:`switch-title`},X={key:0,class:`switch-row`},Z={class:`switch-info`},ne={class:`switch-title`},re={class:`switch-desc`},ie={key:0,class:`version-block`},ae={class:`version-row`},oe={class:`muted-sm`},se={key:0,class:`muted-sm`},ce={key:1,class:`muted-sm`},le={class:`muted-sm`},ue={class:`version-actions`},Q=D(n({__name:`ServiceUpdateSettings`,setup(n){let{toast:o}=N(),l=c(!0),u=c(!1),f=c(null),S=c(null),C=c(null),w=c(null),D=c(null),A=c(!1),j=c(!1),M=c(null),F=null;s(()=>F?.abort());let I=async e=>{if(!e){if(u.value)return;u.value=!0}try{let[e,t]=await Promise.allSettled([k.autostart(),k.update()]);f.value=e.status===`fulfilled`?e.value:null,S.value=e.status===`rejected`?e.reason?.message:null,C.value=t.status===`fulfilled`?t.value:null,w.value=t.status===`rejected`?t.reason?.message:null}finally{l.value=!1,u.value=!1}};d(()=>I(!1));let L=e=>e?new Date(e).toLocaleString():``,R=i(()=>C.value?.lastCheck?.currentVersion??null),z=i(()=>_.value?.buildSource===`local`),B=i(()=>C.value?.lastCheck?.latestVersion??null),V=i(()=>C.value?.lastCheck?.hasUpdate===!0),H=i(()=>{let e=C.value?.lastCheck?.checkedAt;return e?new Date(e).toLocaleString():null}),U=i(()=>{let e=C.value?.lastApply;if(!e)return null;let t=L(e.appliedAt);return`${e.fromVersion} → ${e.toVersion}${t?`(${t})`:``}`}),W=async e=>{if(!f.value||D.value)return;let t=e?`确定开启开机自启?将注册登录触发的自启项(登录时自动恢复服务)。`:`确定关闭开机自启?将移除自启项,且此后首次启动不再自动注册。`;try{await E.confirm(t,e?`开启确认`:`关闭确认`,{confirmButtonText:e?`开启`:`关闭`,cancelButtonText:`取消`,type:`warning`})}catch{return}D.value=`autostart`;try{let t=await k.setAutostart(e);t.note?o(t.note,`success`):o(e?`开机自启已开启`:`开机自启已关闭`,`success`)}catch(e){o(e.message||`操作失败`,`error`)}finally{D.value=null,await I(!0)}},G=async e=>{if(!C.value||D.value)return;let t=e?`确定开启自动更新?将每小时检查 npm 源,发现新版本后自动安装并重启服务(过程中管理台短暂不可访问)。`:`确定关闭自动更新?不再自动检查与安装(手动检查与更新不受影响)。`;try{await E.confirm(t,e?`开启确认`:`关闭确认`,{confirmButtonText:e?`开启`:`关闭`,cancelButtonText:`取消`,type:`warning`})}catch{return}D.value=`updateEnabled`;try{let t=await k.setUpdateEnabled(e);t.note&&o(t.note,`success`)}catch(e){o(e.message||`操作失败`,`error`)}finally{D.value=null,await I(!0)}},K=async()=>{A.value=!0;try{let e=await k.checkUpdate();M.value=e.hasUpdate?`发现新版本 ${e.latestVersion}(当前 ${e.currentVersion}):可点击「立即更新」安装`:`已是最新版本 ${e.currentVersion}(检查于 ${L(e.checkedAt)})`,await I(!0)}catch(e){o(e.message||`检查更新失败`,`error`)}finally{A.value=!1}},Q=async()=>{try{await E.confirm(`确定更新到 ${B.value}?服务会自动重启并在启动时安装新版本:重启期间管理台短暂不可访问(预计 1~3 分钟),完成后自动恢复。`,`立即更新`,{confirmButtonText:`立即更新`,cancelButtonText:`取消`,type:`warning`})}catch{return}j.value=!0;let e=new AbortController;F=e;try{let t=await k.update(),n=await k.applyUpdate();if(!n.updated){M.value=`已是最新版本 ${n.fromVersion}`;return}M.value=`正在重启服务并安装 ${n.toVersion}(预计 1~3 分钟):重启期间管理台短暂不可访问,完成后这里会自动显示结果。`;let r=await O({targetVersion:n.toVersion,sinceAppliedAt:t.lastApply?.appliedAt??null,signal:e.signal});if(e.signal.aborted)return;r&&!r.error?(o(`已更新到 ${r.toVersion}`,`success`),M.value=`已更新 ${r.fromVersion} → ${r.toVersion},服务已在新版本上运行。`):r?.error?(o(`更新失败:${r.error}`,`error`),M.value=P(r.error)):M.value=`更新仍在进行(安装耗时较长):稍后刷新页面查看最新状态。`}catch(e){o(e.message||`更新失败`,`error`)}finally{j.value=!1,F===e&&(F=null),e.signal.aborted||await I(!0)}};return(n,i)=>{let o=v(`el-button`),s=v(`el-tag`),c=v(`el-switch`),d=v(`el-empty`),_=v(`el-card`),E=v(`el-link`),O=v(`el-alert`),k=p(`loading`);return g((m(),r(`div`,q,[t(_,{shadow:`never`,class:`mb-16`},{header:x(()=>[b(`div`,J,[i[7]||=b(`span`,{class:`fw-600`},`开机自启`,-1),t(o,{loading:u.value,onClick:i[0]||=e=>I(!1)},{default:x(()=>[...i[6]||=[a(`刷新`,-1)]]),_:1},8,[`loading`])])]),default:x(()=>[f.value?(m(),r(`div`,Y,[b(`div`,ee,[b(`div`,te,[i[8]||=a(` 登录时自动启动服务 `,-1),t(s,{type:f.value.enabled?`success`:`info`,size:`small`,"disable-transitions":``},{default:x(()=>[a(h(f.value.enabled?`已开启`:`未开启`),1)]),_:1},8,[`type`])]),i[9]||=b(`div`,{class:`switch-desc`},[a(` 登录操作系统时自动启动服务(无需管理员权限)。 关闭后首次启动 `),b(`code`,null,`ezllm`),a(` 也不会再自动注册,重新开启即可解除。 `)],-1)]),t(c,{"model-value":f.value.enabled,loading:D.value===`autostart`,onChange:i[1]||=e=>W(!!e)},null,8,[`model-value`,`loading`])])):(m(),e(d,{key:1,description:S.value||`暂无自启状态`},{default:x(()=>[t(o,{type:`primary`,onClick:i[2]||=e=>I(!1)},{default:x(()=>[...i[10]||=[a(`重试`,-1)]]),_:1})]),_:1},8,[`description`]))]),_:1}),t(_,{shadow:`never`,class:`mb-16`},{header:x(()=>[...i[11]||=[b(`div`,{class:`flex-between`},[b(`span`,{class:`fw-600`},`自动更新`)],-1)]]),default:x(()=>[C.value?(m(),r(`div`,X,[b(`div`,Z,[b(`div`,ne,[i[12]||=a(` 自动检查并安装新版本 `,-1),t(s,{type:C.value.enabled?`success`:`info`,size:`small`,"disable-transitions":``},{default:x(()=>[a(h(C.value.enabled?`已开启`:`未开启`),1)]),_:1},8,[`type`])]),b(`div`,re,[C.value.supported?(m(),r(T,{key:1},[a(` 每小时检查 npm 源,发现新版本后自动安装并重启服务(过程中管理台短暂不可访问); 关闭后仍可在下方手动检查与更新。 `)],64)):(m(),r(T,{key:0},[a(` 当前为源码运行模式,更新功能不可用(仅通过 npx ezllm install 装配的实例支持)。 `)],64))])]),C.value.supported?(m(),e(c,{key:0,"model-value":C.value.enabled,loading:D.value===`updateEnabled`,onChange:i[3]||=e=>G(!!e)},null,8,[`model-value`,`loading`])):y(``,!0)])):(m(),e(d,{key:1,description:w.value||`暂无更新状态`},{default:x(()=>[t(o,{type:`primary`,onClick:i[4]||=e=>I(!1)},{default:x(()=>[...i[13]||=[a(`重试`,-1)]]),_:1})]),_:1},8,[`description`]))]),_:1}),t(_,{shadow:`never`},{header:x(()=>[...i[14]||=[b(`div`,{class:`flex-between`},[b(`span`,{class:`fw-600`},`版本信息`)],-1)]]),default:x(()=>[C.value?(m(),r(`div`,ie,[b(`div`,ae,[i[18]||=b(`span`,{class:`version-label`},`当前版本`,-1),t(s,{size:`small`},{default:x(()=>[a(h(R.value||`未知`),1)]),_:1}),z.value?(m(),e(s,{key:0,type:`warning`,size:`small`,"disable-transitions":``},{default:x(()=>[...i[15]||=[a(`本地构建`,-1)]]),_:1})):y(``,!0),B.value?(m(),r(T,{key:1},[i[17]||=b(`span`,{class:`version-label`},`最新版本`,-1),t(s,{type:V.value?`warning`:`success`,size:`small`,"disable-transitions":``},{default:x(()=>[a(h(B.value),1)]),_:1},8,[`type`]),V.value?(m(),e(s,{key:0,type:`warning`,size:`small`,"disable-transitions":``},{default:x(()=>[...i[16]||=[a(`发现新版本`,-1)]]),_:1})):y(``,!0)],64)):y(``,!0)]),b(`div`,oe,[a(` 上次检查:`+h(H.value||`尚未检查`)+` `,1),C.value.updating?(m(),r(T,{key:0},[a(` · 更新执行中...`)],64)):y(``,!0)]),C.value.supported?y(``,!0):(m(),r(`div`,se,`源码运行模式:手动检查与更新不可用。`)),U.value?(m(),r(`div`,ce,`上次更新:`+h(U.value),1)):y(``,!0),b(`div`,le,[i[20]||=a(` npm 包主页:`,-1),t(E,{type:`primary`,href:`https://www.npmjs.com/package/ezllm`,target:`_blank`},{default:x(()=>[...i[19]||=[a(`npmjs.com/package/ezllm`,-1)]]),_:1})]),b(`div`,ue,[t(o,{loading:A.value,disabled:!C.value.supported||C.value.updating,onClick:K},{default:x(()=>[a(h(A.value?`检查中...`:`检查更新`),1)]),_:1},8,[`loading`,`disabled`]),V.value&&C.value.supported?(m(),e(o,{key:0,type:`primary`,loading:j.value,disabled:C.value.updating,onClick:Q},{default:x(()=>[a(h(j.value?`更新中...`:`立即更新到 ${B.value}`),1)]),_:1},8,[`loading`,`disabled`])):y(``,!0)]),M.value?(m(),e(O,{key:2,title:M.value,type:`info`,"show-icon":``,class:`mt-8`,onClose:i[5]||=e=>M.value=null},null,8,[`title`])):y(``,!0)])):(m(),e(d,{key:1,description:`更新状态不可用`}))]),_:1})])),[[k,l.value]])}}}),[[`__scopeId`,`data-v-567dce2c`]]);l(),w(),u();var de={class:`flex-col-gap`},$={class:`flex-between`},fe={class:`muted-sm`},pe={class:`login-row`},me={class:`muted-sm`},he={class:`flex-between`},ge={class:`monitor-row`},_e={class:`save-bar`},ve=D(n({__name:`SettingsView`,setup(n){let{toast:s}=N(),{copyWithToast:l}=M(),u=A(),_=c(`basic`),w=c(!0),E=c(!1),D=c(``),O=async()=>{D.value&&await l(D.value)},k=c(29770),P=c(null),F=c(!0),I=c(``),L=c(``),R=i(()=>D.value.trim()!==``||I.value!==``&&L.value!==``),z=c(!1),B=c(60),V=[{label:`10分钟`,value:10},{label:`30分钟`,value:30},{label:`1小时`,value:60},{label:`2小时`,value:120},{label:`5小时`,value:300},{label:`8小时`,value:480},{label:`12小时`,value:720},{label:`24小时`,value:1440}],{loadError:H,run:U}=j(`设置加载失败,请重试`),W=()=>U(async()=>{try{await u.load(),D.value=u.config.masterKey||``,k.value=u.config.port??29770;let e=u.config[`web-ui`]?.[`login-account`];I.value=e?.username||``,L.value=e?.password||``,F.value=u.config.allowLan!==!1;let t=u.config.latencyTest;z.value=t?.enabled===!0,B.value=t?.intervalMinutes??60;try{let e=await f.get(`/api/status`);P.value=e.listenPort}catch{P.value=null}}finally{w.value=!1}}),G=async()=>{if(I.value.trim()!==``||L.value!==``){if(I.value.trim()===``||L.value===``){s(`用户名和密码需同时填写`,`error`);return}if(L.value.length<6){s(`密码至少 6 位`,`error`);return}}E.value=!0;let e=z.value&&u.config.latencyTest?.enabled!==!0;try{let t=await u.update(e=>{e.masterKey=D.value.trim(),e.port=k.value,e.allowLan=F.value,e.latencyTest={enabled:z.value,intervalMinutes:B.value},e[`web-ui`]??={},e[`web-ui`][`login-account`]??={},e[`web-ui`][`login-account`].username=I.value.trim(),e[`web-ui`][`login-account`].password=L.value});await S(!0),s(`设置已保存并生效`,`success`),e&&s(`已开启自动测试:服务将定期直连所有上游发送探测请求,有少量 token 消耗`,`warning`),t.restartHint&&s(t.restartHint,`warning`)}catch(e){s(e.message,`error`)}finally{E.value=!1}};return d(W),(n,i)=>{let s=v(`el-button`),c=v(`el-alert`),l=v(`el-tag`),u=v(`el-input`),d=v(`el-form-item`),f=v(`el-input-number`),S=v(`el-form`),A=v(`el-card`),j=v(`el-switch`),M=v(`el-divider`),N=v(`el-option`),U=v(`el-select`),q=v(`el-tab-pane`),J=v(`el-tabs`),Y=p(`loading`);return m(),e(J,{modelValue:_.value,"onUpdate:modelValue":i[7]||=e=>_.value=e,class:`settings-tabs`},{default:x(()=>[t(q,{label:`基本设置`,name:`basic`},{default:x(()=>[g((m(),r(`div`,de,[o(H)?(m(),e(c,{key:0,title:o(H),type:`error`,"show-icon":``,closable:!1},{default:x(()=>[t(s,{size:`small`,onClick:W},{default:x(()=>[...i[8]||=[a(`重试`,-1)]]),_:1})]),_:1},8,[`title`])):y(``,!0),t(A,{shadow:`never`},{header:x(()=>[b(`div`,$,[i[10]||=b(`span`,{class:`fw-600`},`网关访问`,-1),t(l,{type:`success`},{default:x(()=>[...i[9]||=[a(`运行中`,-1)]]),_:1})])]),default:x(()=>[t(S,{"label-position":`top`},{default:x(()=>[t(d,{label:`API 密钥 (masterKey)`},{default:x(()=>[t(u,{modelValue:D.value,"onUpdate:modelValue":i[0]||=e=>D.value=e,placeholder:`sk-1234`,clearable:``},{append:x(()=>[t(s,{onClick:O},{default:x(()=>[...i[11]||=[a(`复制`,-1)]]),_:1})]),_:1},8,[`modelValue`]),i[12]||=b(`div`,{class:`muted-sm`},`客户端请求 /v1/* 时的认证密钥(Bearer <masterKey>;留空 = 本地放行)`,-1)]),_:1}),t(d,{label:`监听端口 (port)`},{default:x(()=>[t(f,{modelValue:k.value,"onUpdate:modelValue":i[1]||=e=>k.value=e,min:1,max:65535,step:1,style:{width:`220px`}},null,8,[`modelValue`]),b(`div`,fe,[i[14]||=a(` 网关与管理台 API 的监听端口,保存后重启生效 `,-1),P.value===null?y(``,!0):(m(),r(T,{key:0},[i[13]||=a(` ;服务上报的端口 `,-1),b(`b`,null,h(P.value),1)],64))])]),_:1})]),_:1})]),_:1}),t(A,{shadow:`never`},{header:x(()=>[...i[15]||=[b(`span`,{class:`fw-600`},`安全与登录`,-1)]]),default:x(()=>[t(S,{"label-position":`top`},{default:x(()=>[t(d,{label:`管理台登录账号`},{default:x(()=>[b(`div`,pe,[t(u,{modelValue:I.value,"onUpdate:modelValue":i[2]||=e=>I.value=e,placeholder:`用户名`,style:{width:`200px`}},null,8,[`modelValue`]),t(u,{modelValue:L.value,"onUpdate:modelValue":i[3]||=e=>L.value=e,type:`password`,placeholder:`密码(至少 6 位)`,"show-password":``,style:{width:`200px`}},null,8,[`modelValue`])]),i[16]||=b(`div`,{class:`muted-sm`},` 管理台登录凭证;留空 = 免登录直接访问(仅本机使用时推荐)。 修改后立即生效,需用新账号重新登录 `,-1)]),_:1}),t(d,{label:`允许局域网访问 (allowLan)`},{default:x(()=>[t(j,{modelValue:F.value,"onUpdate:modelValue":i[4]||=e=>F.value=e},null,8,[`modelValue`]),b(`div`,me,[i[17]||=a(` 开启 = 绑定全部网卡,局域网内设备可访问;关闭 = 仅本机 127.0.0.1。保存后需重启生效 `,-1),R.value?y(``,!0):(m(),r(T,{key:0},[a(` ;未设置任何凭据(密钥与登录账号皆无)时始终仅绑本机 `)],64))])]),_:1})]),_:1})]),_:1}),t(A,{shadow:`never`},{header:x(()=>[b(`div`,he,[i[18]||=b(`span`,{class:`fw-600`},`模型服务监控`,-1),t(l,{type:z.value?`success`:`info`,size:`small`,"disable-transitions":``},{default:x(()=>[a(h(z.value?`已开启`:`未开启`),1)]),_:1},8,[`type`])])]),default:x(()=>[b(`div`,ge,[i[19]||=b(`div`,{class:`monitor-info`},[b(`div`,{class:`monitor-title`},`自动测试模型服务状态`),b(`div`,{class:`muted-sm`},` 按设定间隔自动直连所有上游模型发送极小探测请求(max_tokens: 1,有少量 token 消耗); 测试结果展示在「服务状态」页面 `)],-1),t(j,{modelValue:z.value,"onUpdate:modelValue":i[5]||=e=>z.value=e},null,8,[`modelValue`])]),z.value?(m(),r(T,{key:0},[t(M,{style:{margin:`12px 0`}}),t(S,{"label-position":`top`},{default:x(()=>[t(d,{label:`测试间隔`,style:{"margin-bottom":`0`}},{default:x(()=>[t(U,{modelValue:B.value,"onUpdate:modelValue":i[6]||=e=>B.value=e,style:{width:`220px`}},{default:x(()=>[(m(),r(T,null,C(V,e=>t(N,{key:e.value,label:e.label,value:e.value},null,8,[`label`,`value`])),64))]),_:1},8,[`modelValue`]),i[20]||=b(`div`,{class:`muted-sm`},`自动测试的执行间隔,保存后即时生效(无需重启)`,-1)]),_:1})]),_:1})],64)):y(``,!0)]),_:1}),b(`div`,_e,[t(s,{type:`primary`,size:`large`,loading:E.value,disabled:E.value||o(H)!==null,onClick:G},{default:x(()=>[a(h(E.value?`保存中...`:`保存设置`),1)]),_:1},8,[`loading`,`disabled`])])])),[[Y,w.value]])]),_:1}),t(q,{label:`代理开关`,name:`harness`,lazy:``},{default:x(()=>[t(K)]),_:1}),t(q,{label:`服务与更新`,name:`service`,lazy:``},{default:x(()=>[t(Q)]),_:1})]),_:1},8,[`modelValue`])}}}),[[`__scopeId`,`data-v-e5f93ad5`]]);export{ve as default};
|
|
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 p,et as m,fn as h,ht as g,i as _,it as v,j as y,k as b,mt as x,n as S,nt as C,vt as w,w as T}from"./router-C6GERXs3.js";import{n as E,t as D}from"./index-B5mLXy9e.js";import{n as O,t as k}from"./useManagerApi-DoVhcoa7.js";import{t as A}from"./config-CcujDHN0.js";import{n as j,t as M}from"./useCopyToast-OBVjElCH.js";import{t as N}from"./useToast-Du3Ickw8.js";import{t as P}from"./updateNote-CttDt8SZ.js";l(),u(),w();var F={class:`flex-between`},I={class:`muted-sm mb-8`},L={class:`switch-row`},R={class:`switch-info`},z={class:`switch-title`},B={class:`switch-row`},V={class:`switch-info`},H={class:`switch-title`},U={class:`switch-row`},W={class:`switch-info`},G={class:`switch-title`},K=D(n({__name:`HarnessSwitches`,setup(n){let{toast:i}=N(),o=c(!0),s=c(!1),l=c(null),u=c(null),f=c(null),_=c(null),S=c(`success`),C=async e=>{e||(l.value?s.value=!0:o.value=!0);try{l.value=await k.harness(),u.value=null}catch(t){e||(u.value=t.message)}finally{e||(o.value=!1,s.value=!1)}};d(()=>C(!1));let w={claudeCode:{label:`Claude Code`,file:`~/.claude/settings.json`,toggle:k.setClaudeCode},codex:{label:`Codex CLI`,file:`~/.codex/config.toml`,toggle:k.setCodex},dsh:{label:`DeepSeek Harness`,file:`~/.dsh/settings.yaml`,toggle:k.setDsh}},D=async(e,t)=>{if(!l.value||f.value)return;let n=w[e],r=t?`确定开启 ${n.label} 代理?将改写 ${n.file}(开启前自动备份,关闭时从备份还原)。`:`确定关闭 ${n.label} 代理?将从备份还原 ${n.file}(无备份时移除代理相关配置)。`;try{await E.confirm(r,t?`开启确认`:`关闭确认`,{confirmButtonText:t?`开启`:`关闭`,cancelButtonText:`取消`,type:`warning`})}catch{return}f.value=e;try{let e=await n.toggle(t);_.value=e.note??null,S.value=t?`success`:`info`,i(t?`已开启代理`:`已关闭代理`,`success`)}catch(e){i(e.message||`操作失败`,`error`)}finally{f.value=null,await C(!0)}};return(n,i)=>{let c=v(`el-button`),d=v(`el-alert`),w=v(`el-tag`),E=v(`el-switch`),O=v(`el-divider`),k=v(`el-empty`),A=v(`el-card`),j=p(`loading`);return g((m(),e(A,{shadow:`never`},{header:x(()=>[b(`div`,F,[i[7]||=b(`span`,{class:`fw-600`},`代理开关`,-1),t(c,{loading:s.value,onClick:i[0]||=e=>C(!1)},{default:x(()=>[...i[6]||=[a(`刷新`,-1)]]),_:1},8,[`loading`])])]),default:x(()=>[l.value?(m(),r(T,{key:0},[b(`div`,I,` 将本机 CLI 工具的流量一键指向本机网关(`+h(l.value.gatewayBase)+`)。 开启前自动备份原配置为 *.ellm-bak(保留最早的原始备份),关闭时从备份还原。 `,1),_.value?(m(),e(d,{key:0,title:_.value,type:S.value,"show-icon":``,class:`mb-8`,onClose:i[1]||=e=>_.value=null},null,8,[`title`,`type`])):y(``,!0),b(`div`,L,[b(`div`,R,[b(`div`,z,[i[8]||=a(` Claude Code `,-1),t(w,{type:l.value.claudeCode?`success`:`info`,size:`small`,"disable-transitions":``},{default:x(()=>[a(h(l.value.claudeCode?`已开启`:`未开启`),1)]),_:1},8,[`type`])]),i[9]||=b(`div`,{class:`switch-desc`},[a(` 写入 `),b(`code`,null,`~/.claude/settings.json`),a(` 的 env.ANTHROPIC_BASE_URL / ANTHROPIC_AUTH_TOKEN, 鉴权取网关配置的 masterKey(未设置将开启失败);其余字段原样保留,重启 Claude Code 会话后生效。 `)],-1)]),t(E,{"model-value":l.value.claudeCode,loading:f.value===`claudeCode`,onChange:i[2]||=e=>D(`claudeCode`,!!e)},null,8,[`model-value`,`loading`])]),t(O,{class:`switch-divider`}),b(`div`,B,[b(`div`,V,[b(`div`,H,[i[10]||=a(` Codex CLI `,-1),t(w,{type:l.value.codex?`success`:`info`,size:`small`,"disable-transitions":``},{default:x(()=>[a(h(l.value.codex?`已开启`:`未开启`),1)]),_:1},8,[`type`])]),i[11]||=b(`div`,{class:`switch-desc`},[a(` 写入 `),b(`code`,null,`~/.codex/config.toml`),a(` 的 model_provider 与 [model_providers.ellm-proxy] 段 (保留用户注释与排版);开启后需按提示设置环境变量 ELLM_PROXY_API_KEY 供 Codex 鉴权。 `)],-1)]),t(E,{"model-value":l.value.codex,loading:f.value===`codex`,onChange:i[3]||=e=>D(`codex`,!!e)},null,8,[`model-value`,`loading`])]),t(O,{class:`switch-divider`}),b(`div`,U,[b(`div`,W,[b(`div`,G,[i[12]||=a(` DeepSeek Harness `,-1),t(w,{type:l.value.dsh?`success`:`info`,size:`small`,"disable-transitions":``},{default:x(()=>[a(h(l.value.dsh?`已开启`:`未开启`),1)]),_:1},8,[`type`])]),i[13]||=b(`div`,{class:`switch-desc`},[a(` 写入 `),b(`code`,null,`~/.dsh/settings.yaml`),a(` 的 llm-deepseek.baseURL 与 `),b(`code`,null,`~/.dsh/.credentials.yaml`),a(` 的 DEEPSEEK_API_KEY(取网关 masterKey,未设置则写占位值);模型请在 dsh 内选择与网关部署名一致的模型。 dsh 为 developer preview,配置格式可能随版本变化。 `)],-1)]),t(E,{"model-value":l.value.dsh,loading:f.value===`dsh`,onChange:i[4]||=e=>D(`dsh`,!!e)},null,8,[`model-value`,`loading`])])],64)):(m(),e(k,{key:1,description:u.value||`暂无开关状态`},{default:x(()=>[t(c,{type:`primary`,onClick:i[5]||=e=>C(!1)},{default:x(()=>[...i[14]||=[a(`重试`,-1)]]),_:1})]),_:1},8,[`description`]))]),_:1})),[[j,o.value]])}}}),[[`__scopeId`,`data-v-fb084a91`]]);l(),u(),w();var q={class:`service-settings`},J={class:`flex-between`},Y={key:0,class:`switch-row`},ee={class:`switch-info`},te={class:`switch-title`},X={key:0,class:`switch-row`},Z={class:`switch-info`},ne={class:`switch-title`},re={class:`switch-desc`},ie={key:0,class:`version-block`},ae={class:`version-row`},oe={class:`muted-sm`},se={key:0,class:`muted-sm`},ce={key:1,class:`muted-sm`},le={class:`muted-sm`},ue={class:`version-actions`},Q=D(n({__name:`ServiceUpdateSettings`,setup(n){let{toast:o}=N(),l=c(!0),u=c(!1),f=c(null),S=c(null),C=c(null),w=c(null),D=c(null),A=c(!1),j=c(!1),M=c(null),F=null;s(()=>F?.abort());let I=async e=>{if(!e){if(u.value)return;u.value=!0}try{let[e,t]=await Promise.allSettled([k.autostart(),k.update()]);f.value=e.status===`fulfilled`?e.value:null,S.value=e.status===`rejected`?e.reason?.message:null,C.value=t.status===`fulfilled`?t.value:null,w.value=t.status===`rejected`?t.reason?.message:null}finally{l.value=!1,u.value=!1}};d(()=>I(!1));let L=e=>e?new Date(e).toLocaleString():``,R=i(()=>C.value?.lastCheck?.currentVersion??null),z=i(()=>_.value?.buildSource===`local`),B=i(()=>C.value?.lastCheck?.latestVersion??null),V=i(()=>C.value?.lastCheck?.hasUpdate===!0),H=i(()=>{let e=C.value?.lastCheck?.checkedAt;return e?new Date(e).toLocaleString():null}),U=i(()=>{let e=C.value?.lastApply;if(!e)return null;let t=L(e.appliedAt);return`${e.fromVersion} → ${e.toVersion}${t?`(${t})`:``}`}),W=async e=>{if(!f.value||D.value)return;let t=e?`确定开启开机自启?将注册登录触发的自启项(登录时自动恢复服务)。`:`确定关闭开机自启?将移除自启项,且此后首次启动不再自动注册。`;try{await E.confirm(t,e?`开启确认`:`关闭确认`,{confirmButtonText:e?`开启`:`关闭`,cancelButtonText:`取消`,type:`warning`})}catch{return}D.value=`autostart`;try{let t=await k.setAutostart(e);t.note?o(t.note,`success`):o(e?`开机自启已开启`:`开机自启已关闭`,`success`)}catch(e){o(e.message||`操作失败`,`error`)}finally{D.value=null,await I(!0)}},G=async e=>{if(!C.value||D.value)return;let t=e?`确定开启自动更新?将每小时检查 npm 源,发现新版本后自动安装并重启服务(过程中管理台短暂不可访问)。`:`确定关闭自动更新?不再自动检查与安装(手动检查与更新不受影响)。`;try{await E.confirm(t,e?`开启确认`:`关闭确认`,{confirmButtonText:e?`开启`:`关闭`,cancelButtonText:`取消`,type:`warning`})}catch{return}D.value=`updateEnabled`;try{let t=await k.setUpdateEnabled(e);t.note&&o(t.note,`success`)}catch(e){o(e.message||`操作失败`,`error`)}finally{D.value=null,await I(!0)}},K=async()=>{A.value=!0;try{let e=await k.checkUpdate();M.value=e.hasUpdate?`发现新版本 ${e.latestVersion}(当前 ${e.currentVersion}):可点击「立即更新」安装`:`已是最新版本 ${e.currentVersion}(检查于 ${L(e.checkedAt)})`,await I(!0)}catch(e){o(e.message||`检查更新失败`,`error`)}finally{A.value=!1}},Q=async()=>{try{await E.confirm(`确定更新到 ${B.value}?服务会自动重启并在启动时安装新版本:重启期间管理台短暂不可访问(预计 1~3 分钟),完成后自动恢复。`,`立即更新`,{confirmButtonText:`立即更新`,cancelButtonText:`取消`,type:`warning`})}catch{return}j.value=!0;let e=new AbortController;F=e;try{let t=await k.update(),n=await k.applyUpdate();if(!n.updated){M.value=`已是最新版本 ${n.fromVersion}`;return}M.value=`正在重启服务并安装 ${n.toVersion}(预计 1~3 分钟):重启期间管理台短暂不可访问,完成后这里会自动显示结果。`;let r=await O({targetVersion:n.toVersion,sinceAppliedAt:t.lastApply?.appliedAt??null,signal:e.signal});if(e.signal.aborted)return;r&&!r.error?(o(`已更新到 ${r.toVersion}`,`success`),M.value=`已更新 ${r.fromVersion} → ${r.toVersion},服务已在新版本上运行。`):r?.error?(o(`更新失败:${r.error}`,`error`),M.value=P(r.error)):M.value=`更新仍在进行(安装耗时较长):稍后刷新页面查看最新状态。`}catch(e){o(e.message||`更新失败`,`error`)}finally{j.value=!1,F===e&&(F=null),e.signal.aborted||await I(!0)}};return(n,i)=>{let o=v(`el-button`),s=v(`el-tag`),c=v(`el-switch`),d=v(`el-empty`),_=v(`el-card`),E=v(`el-link`),O=v(`el-alert`),k=p(`loading`);return g((m(),r(`div`,q,[t(_,{shadow:`never`,class:`mb-16`},{header:x(()=>[b(`div`,J,[i[7]||=b(`span`,{class:`fw-600`},`开机自启`,-1),t(o,{loading:u.value,onClick:i[0]||=e=>I(!1)},{default:x(()=>[...i[6]||=[a(`刷新`,-1)]]),_:1},8,[`loading`])])]),default:x(()=>[f.value?(m(),r(`div`,Y,[b(`div`,ee,[b(`div`,te,[i[8]||=a(` 登录时自动启动服务 `,-1),t(s,{type:f.value.enabled?`success`:`info`,size:`small`,"disable-transitions":``},{default:x(()=>[a(h(f.value.enabled?`已开启`:`未开启`),1)]),_:1},8,[`type`])]),i[9]||=b(`div`,{class:`switch-desc`},[a(` 登录操作系统时自动启动服务(无需管理员权限)。 关闭后首次启动 `),b(`code`,null,`ezllm`),a(` 也不会再自动注册,重新开启即可解除。 `)],-1)]),t(c,{"model-value":f.value.enabled,loading:D.value===`autostart`,onChange:i[1]||=e=>W(!!e)},null,8,[`model-value`,`loading`])])):(m(),e(d,{key:1,description:S.value||`暂无自启状态`},{default:x(()=>[t(o,{type:`primary`,onClick:i[2]||=e=>I(!1)},{default:x(()=>[...i[10]||=[a(`重试`,-1)]]),_:1})]),_:1},8,[`description`]))]),_:1}),t(_,{shadow:`never`,class:`mb-16`},{header:x(()=>[...i[11]||=[b(`div`,{class:`flex-between`},[b(`span`,{class:`fw-600`},`自动更新`)],-1)]]),default:x(()=>[C.value?(m(),r(`div`,X,[b(`div`,Z,[b(`div`,ne,[i[12]||=a(` 自动检查并安装新版本 `,-1),t(s,{type:C.value.enabled?`success`:`info`,size:`small`,"disable-transitions":``},{default:x(()=>[a(h(C.value.enabled?`已开启`:`未开启`),1)]),_:1},8,[`type`])]),b(`div`,re,[C.value.supported?(m(),r(T,{key:1},[a(` 每小时检查 npm 源,发现新版本后自动安装并重启服务(过程中管理台短暂不可访问); 关闭后仍可在下方手动检查与更新。 `)],64)):(m(),r(T,{key:0},[a(` 当前为源码运行模式,更新功能不可用(仅通过 npx ezllm install 装配的实例支持)。 `)],64))])]),C.value.supported?(m(),e(c,{key:0,"model-value":C.value.enabled,loading:D.value===`updateEnabled`,onChange:i[3]||=e=>G(!!e)},null,8,[`model-value`,`loading`])):y(``,!0)])):(m(),e(d,{key:1,description:w.value||`暂无更新状态`},{default:x(()=>[t(o,{type:`primary`,onClick:i[4]||=e=>I(!1)},{default:x(()=>[...i[13]||=[a(`重试`,-1)]]),_:1})]),_:1},8,[`description`]))]),_:1}),t(_,{shadow:`never`},{header:x(()=>[...i[14]||=[b(`div`,{class:`flex-between`},[b(`span`,{class:`fw-600`},`版本信息`)],-1)]]),default:x(()=>[C.value?(m(),r(`div`,ie,[b(`div`,ae,[i[18]||=b(`span`,{class:`version-label`},`当前版本`,-1),t(s,{size:`small`},{default:x(()=>[a(h(R.value||`未知`),1)]),_:1}),z.value?(m(),e(s,{key:0,type:`warning`,size:`small`,"disable-transitions":``},{default:x(()=>[...i[15]||=[a(`本地构建`,-1)]]),_:1})):y(``,!0),B.value?(m(),r(T,{key:1},[i[17]||=b(`span`,{class:`version-label`},`最新版本`,-1),t(s,{type:V.value?`warning`:`success`,size:`small`,"disable-transitions":``},{default:x(()=>[a(h(B.value),1)]),_:1},8,[`type`]),V.value?(m(),e(s,{key:0,type:`warning`,size:`small`,"disable-transitions":``},{default:x(()=>[...i[16]||=[a(`发现新版本`,-1)]]),_:1})):y(``,!0)],64)):y(``,!0)]),b(`div`,oe,[a(` 上次检查:`+h(H.value||`尚未检查`)+` `,1),C.value.updating?(m(),r(T,{key:0},[a(` · 更新执行中...`)],64)):y(``,!0)]),C.value.supported?y(``,!0):(m(),r(`div`,se,`源码运行模式:手动检查与更新不可用。`)),U.value?(m(),r(`div`,ce,`上次更新:`+h(U.value),1)):y(``,!0),b(`div`,le,[i[20]||=a(` npm 包主页:`,-1),t(E,{type:`primary`,href:`https://www.npmjs.com/package/ezllm`,target:`_blank`},{default:x(()=>[...i[19]||=[a(`npmjs.com/package/ezllm`,-1)]]),_:1})]),b(`div`,ue,[t(o,{loading:A.value,disabled:!C.value.supported||C.value.updating,onClick:K},{default:x(()=>[a(h(A.value?`检查中...`:`检查更新`),1)]),_:1},8,[`loading`,`disabled`]),V.value&&C.value.supported?(m(),e(o,{key:0,type:`primary`,loading:j.value,disabled:C.value.updating,onClick:Q},{default:x(()=>[a(h(j.value?`更新中...`:`立即更新到 ${B.value}`),1)]),_:1},8,[`loading`,`disabled`])):y(``,!0)]),M.value?(m(),e(O,{key:2,title:M.value,type:`info`,"show-icon":``,class:`mt-8`,onClose:i[5]||=e=>M.value=null},null,8,[`title`])):y(``,!0)])):(m(),e(d,{key:1,description:`更新状态不可用`}))]),_:1})])),[[k,l.value]])}}}),[[`__scopeId`,`data-v-567dce2c`]]);l(),w(),u();var de={class:`flex-col-gap`},$={class:`flex-between`},fe={class:`muted-sm`},pe={class:`login-row`},me={class:`muted-sm`},he={class:`flex-between`},ge={class:`monitor-row`},_e={class:`save-bar`},ve=D(n({__name:`SettingsView`,setup(n){let{toast:s}=N(),{copyWithToast:l}=M(),u=A(),_=c(`basic`),w=c(!0),E=c(!1),D=c(``),O=async()=>{D.value&&await l(D.value)},k=c(29770),P=c(null),F=c(!0),I=c(``),L=c(``),R=i(()=>D.value.trim()!==``||I.value!==``&&L.value!==``),z=c(!1),B=c(60),V=[{label:`10分钟`,value:10},{label:`30分钟`,value:30},{label:`1小时`,value:60},{label:`2小时`,value:120},{label:`5小时`,value:300},{label:`8小时`,value:480},{label:`12小时`,value:720},{label:`24小时`,value:1440}],{loadError:H,run:U}=j(`设置加载失败,请重试`),W=()=>U(async()=>{try{await u.load(),D.value=u.config.masterKey||``,k.value=u.config.port??29770;let e=u.config[`web-ui`]?.[`login-account`];I.value=e?.username||``,L.value=e?.password||``,F.value=u.config.allowLan!==!1;let t=u.config.latencyTest;z.value=t?.enabled===!0,B.value=t?.intervalMinutes??60;try{let e=await f.get(`/api/status`);P.value=e.listenPort}catch{P.value=null}}finally{w.value=!1}}),G=async()=>{if(I.value.trim()!==``||L.value!==``){if(I.value.trim()===``||L.value===``){s(`用户名和密码需同时填写`,`error`);return}if(L.value.length<6){s(`密码至少 6 位`,`error`);return}}E.value=!0;let e=z.value&&u.config.latencyTest?.enabled!==!0;try{let t=await u.update(e=>{e.masterKey=D.value.trim(),e.port=k.value,e.allowLan=F.value,e.latencyTest={enabled:z.value,intervalMinutes:B.value},e[`web-ui`]??={},e[`web-ui`][`login-account`]??={},e[`web-ui`][`login-account`].username=I.value.trim(),e[`web-ui`][`login-account`].password=L.value});await S(!0),s(`设置已保存并生效`,`success`),e&&s(`已开启自动测试:服务将定期直连所有上游发送探测请求,有少量 token 消耗`,`warning`),t.restartHint&&s(t.restartHint,`warning`)}catch(e){s(e.message,`error`)}finally{E.value=!1}};return d(W),(n,i)=>{let s=v(`el-button`),c=v(`el-alert`),l=v(`el-tag`),u=v(`el-input`),d=v(`el-form-item`),f=v(`el-input-number`),S=v(`el-form`),A=v(`el-card`),j=v(`el-switch`),M=v(`el-divider`),N=v(`el-option`),U=v(`el-select`),q=v(`el-tab-pane`),J=v(`el-tabs`),Y=p(`loading`);return m(),e(J,{modelValue:_.value,"onUpdate:modelValue":i[7]||=e=>_.value=e,class:`settings-tabs`},{default:x(()=>[t(q,{label:`基本设置`,name:`basic`},{default:x(()=>[g((m(),r(`div`,de,[o(H)?(m(),e(c,{key:0,title:o(H),type:`error`,"show-icon":``,closable:!1},{default:x(()=>[t(s,{size:`small`,onClick:W},{default:x(()=>[...i[8]||=[a(`重试`,-1)]]),_:1})]),_:1},8,[`title`])):y(``,!0),t(A,{shadow:`never`},{header:x(()=>[b(`div`,$,[i[10]||=b(`span`,{class:`fw-600`},`网关访问`,-1),t(l,{type:`success`},{default:x(()=>[...i[9]||=[a(`运行中`,-1)]]),_:1})])]),default:x(()=>[t(S,{"label-position":`top`},{default:x(()=>[t(d,{label:`API 密钥 (masterKey)`},{default:x(()=>[t(u,{modelValue:D.value,"onUpdate:modelValue":i[0]||=e=>D.value=e,placeholder:`sk-1234`,clearable:``},{append:x(()=>[t(s,{onClick:O},{default:x(()=>[...i[11]||=[a(`复制`,-1)]]),_:1})]),_:1},8,[`modelValue`]),i[12]||=b(`div`,{class:`muted-sm`},`客户端请求 /v1/* 时的认证密钥(Bearer <masterKey>;留空 = 本地放行)`,-1)]),_:1}),t(d,{label:`监听端口 (port)`},{default:x(()=>[t(f,{modelValue:k.value,"onUpdate:modelValue":i[1]||=e=>k.value=e,min:1,max:65535,step:1,style:{width:`220px`}},null,8,[`modelValue`]),b(`div`,fe,[i[14]||=a(` 网关与管理台 API 的监听端口,保存后重启生效 `,-1),P.value===null?y(``,!0):(m(),r(T,{key:0},[i[13]||=a(` ;服务上报的端口 `,-1),b(`b`,null,h(P.value),1)],64))])]),_:1})]),_:1})]),_:1}),t(A,{shadow:`never`},{header:x(()=>[...i[15]||=[b(`span`,{class:`fw-600`},`安全与登录`,-1)]]),default:x(()=>[t(S,{"label-position":`top`},{default:x(()=>[t(d,{label:`管理台登录账号`},{default:x(()=>[b(`div`,pe,[t(u,{modelValue:I.value,"onUpdate:modelValue":i[2]||=e=>I.value=e,placeholder:`用户名`,style:{width:`200px`}},null,8,[`modelValue`]),t(u,{modelValue:L.value,"onUpdate:modelValue":i[3]||=e=>L.value=e,type:`password`,placeholder:`密码(至少 6 位)`,"show-password":``,style:{width:`200px`}},null,8,[`modelValue`])]),i[16]||=b(`div`,{class:`muted-sm`},` 管理台登录凭证;留空 = 免登录直接访问(仅本机使用时推荐)。 修改后立即生效,需用新账号重新登录 `,-1)]),_:1}),t(d,{label:`允许局域网访问 (allowLan)`},{default:x(()=>[t(j,{modelValue:F.value,"onUpdate:modelValue":i[4]||=e=>F.value=e},null,8,[`modelValue`]),b(`div`,me,[i[17]||=a(` 开启 = 绑定全部网卡,局域网内设备可访问;关闭 = 仅本机 127.0.0.1。保存后需重启生效 `,-1),R.value?y(``,!0):(m(),r(T,{key:0},[a(` ;未设置任何凭据(密钥与登录账号皆无)时始终仅绑本机 `)],64))])]),_:1})]),_:1})]),_:1}),t(A,{shadow:`never`},{header:x(()=>[b(`div`,he,[i[18]||=b(`span`,{class:`fw-600`},`模型服务监控`,-1),t(l,{type:z.value?`success`:`info`,size:`small`,"disable-transitions":``},{default:x(()=>[a(h(z.value?`已开启`:`未开启`),1)]),_:1},8,[`type`])])]),default:x(()=>[b(`div`,ge,[i[19]||=b(`div`,{class:`monitor-info`},[b(`div`,{class:`monitor-title`},`自动测试模型服务状态`),b(`div`,{class:`muted-sm`},` 按设定间隔自动直连所有上游模型发送极小探测请求(max_tokens: 1,有少量 token 消耗); 测试结果展示在「服务状态」页面 `)],-1),t(j,{modelValue:z.value,"onUpdate:modelValue":i[5]||=e=>z.value=e},null,8,[`modelValue`])]),z.value?(m(),r(T,{key:0},[t(M,{style:{margin:`12px 0`}}),t(S,{"label-position":`top`},{default:x(()=>[t(d,{label:`测试间隔`,style:{"margin-bottom":`0`}},{default:x(()=>[t(U,{modelValue:B.value,"onUpdate:modelValue":i[6]||=e=>B.value=e,style:{width:`220px`}},{default:x(()=>[(m(),r(T,null,C(V,e=>t(N,{key:e.value,label:e.label,value:e.value},null,8,[`label`,`value`])),64))]),_:1},8,[`modelValue`]),i[20]||=b(`div`,{class:`muted-sm`},`自动测试的执行间隔,保存后即时生效(无需重启)`,-1)]),_:1})]),_:1})],64)):y(``,!0)]),_:1}),b(`div`,_e,[t(s,{type:`primary`,size:`large`,loading:E.value,disabled:E.value||o(H)!==null,onClick:G},{default:x(()=>[a(h(E.value?`保存中...`:`保存设置`),1)]),_:1},8,[`loading`,`disabled`])])])),[[Y,w.value]])]),_:1}),t(q,{label:`代理开关`,name:`harness`,lazy:``},{default:x(()=>[t(K)]),_:1}),t(q,{label:`服务与更新`,name:`service`,lazy:``},{default:x(()=>[t(Q)]),_:1})]),_:1},8,[`modelValue`])}}}),[[`__scopeId`,`data-v-e5f93ad5`]]);export{ve 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,Z as c,a as l,et as u,ft as d,it as f,j as p,k as m,m as h,mt as g,n as _,r as v,u as y,vt as b}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,Z as c,a as l,et as u,ft as d,it as f,j as p,k as m,m as h,mt as g,n as _,r as v,u as y,vt as b}from"./router-C6GERXs3.js";import{t as x}from"./message-t8lJfFLj.js";import{t as S}from"./index-B5mLXy9e.js";import{t as C}from"./clipboard-JYWVdyjq.js";s(),h(),b();var w={class:`setup-wrap`},T={class:`account-row`},E=S(n({__name:`SetupView`,setup(n){let s=y(),h=o(!1),b=o(``),S=o(!1),E=!1,D=o(``),O=o(``),k=o(!1),A=o(``);c(async()=>{let e=await _();S.value=e.masterKeySet});function j(){b.value=(()=>{let e=new Uint8Array(32);crypto.getRandomValues(e);let t=``;for(let n of e)t+=String.fromCharCode(n);return btoa(t).replace(/\+/g,`-`).replace(/\//g,`_`).replace(/=+$/,``)})(),E=!0}d(h,e=>{A.value=``,e?b.value.trim()===``&&j():E&&=(b.value=``,!1)});async function M(){await C(b.value)?x.success(`已复制到剪贴板`):x.error(`复制失败,请手动选择复制`)}async function N(){A.value=``;let e=h.value?`server`:`local`,t=b.value.trim(),n=D.value.trim()!==``||O.value!==``;if(h.value&&t===``){A.value=`服务器部署必须设置主密钥,防止 /v1 网关被他人盗用`;return}if(h.value&&!n){A.value=`服务器部署必须设置登录账号密码,防止管理台被陌生人登录`;return}if(n){if(D.value.trim()===``||O.value===``){A.value=`用户名和密码需同时填写`;return}if(O.value.length<6){A.value=`密码至少 6 位`;return}}k.value=!0;try{let r=await l.post(`/api/setup/finish`,{deployment:e,...t===``?{}:{masterKey:t},...n?{username:D.value.trim(),password:O.value}:{}});v(e,n),x.success(n?`初始化完成,请使用新账号登录`:`初始化完成,免登录进入管理台`),r.restartHint&&x({message:r.restartHint,type:`warning`,duration:8e3}),await s.push(n?`/login`:`/`)}catch(e){A.value=e.message||`保存失败`}finally{k.value=!1}}return(n,o)=>{let s=f(`el-checkbox`),c=f(`el-alert`),l=f(`el-button`),d=f(`el-input`),_=f(`el-form-item`),v=f(`el-form`),y=f(`el-card`);return u(),r(`div`,w,[t(y,{shadow:`never`,class:`setup-card`},{default:g(()=>[o[10]||=m(`div`,{class:`setup-brand`},[m(`span`,{class:`brand-mark`},`EZ`),m(`span`,{class:`setup-title`},`初始化 EZLLM`)],-1),o[11]||=m(`p`,{class:`setup-sub`},`首次使用前完成部署形态与访问凭据的配置`,-1),t(s,{modelValue:h.value,"onUpdate:modelValue":o[0]||=e=>h.value=e,class:`mb-16`},{default:g(()=>[...o[4]||=[i(` 允许其他设备访问本服务(局域网 / 公网部署) `,-1)]]),_:1},8,[`modelValue`]),h.value?(u(),e(c,{key:0,type:`warning`,"show-icon":``,closable:!1,title:`服务将对网络中的其他设备可见,请务必保留主密钥并修改默认账号`,class:`mb-16`})):p(``,!0),t(v,{"label-position":`top`,onSubmit:a(N,[`prevent`])},{default:g(()=>[t(_,null,{label:g(()=>[...o[5]||=[i(` API 主密钥(本地部署可留空) `,-1),m(`span`,{class:`label-hint`},`调用 /v1/* 时的 Bearer Token;留空 = 不启用鉴权,且未设登录账号时服务仅本机可访问`,-1)]]),default:g(()=>[t(d,{modelValue:b.value,"onUpdate:modelValue":o[1]||=e=>b.value=e,placeholder:S.value?`已设置主密钥,留空保持不变`:`未设置主密钥`,clearable:``},{append:g(()=>[t(l,{onClick:j},{default:g(()=>[...o[6]||=[i(`生成`,-1)]]),_:1}),t(l,{disabled:!b.value,onClick:M},{default:g(()=>[...o[7]||=[i(`复制`,-1)]]),_:1},8,[`disabled`])]),_:1},8,[`modelValue`,`placeholder`])]),_:1}),t(_,null,{label:g(()=>[...o[8]||=[i(` 管理台登录(可选) `,-1),m(`span`,{class:`label-hint`},`不填 = 免登录直接进管理台(纯本机使用);勾选上方后必须填写`,-1)]]),default:g(()=>[m(`div`,T,[t(d,{modelValue:D.value,"onUpdate:modelValue":o[2]||=e=>D.value=e,placeholder:`用户名`,clearable:``},null,8,[`modelValue`]),t(d,{modelValue:O.value,"onUpdate:modelValue":o[3]||=e=>O.value=e,type:`password`,"show-password":``,placeholder:`密码(至少 6 位)`},null,8,[`modelValue`])])]),_:1}),A.value?(u(),e(c,{key:0,title:A.value,type:`error`,"show-icon":``,closable:!1,class:`mb-16`},null,8,[`title`])):p(``,!0),t(l,{type:`primary`,class:`full-width`,loading:k.value,onClick:N},{default:g(()=>[...o[9]||=[i(` 完成初始化 `,-1)]]),_:1},8,[`loading`])]),_:1})]),_:1})])}}}),[[`__scopeId`,`data-v-d62562ab`]]);export{E as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{O as e,Tt as t,V as n,a as r,vt as i}from"./router-
|
|
1
|
+
import{O as e,Tt as t,V as n,a as r,vt as i}from"./router-C6GERXs3.js";import{r as a}from"./index-B5mLXy9e.js";i(),n();var o=a(`config`,()=>{let n=t({}),i=t(!1),a=e(()=>Array.isArray(n.value.providers)?n.value.providers:[]),o=e(()=>a.value.length),s=e(()=>a.value.reduce((e,t)=>e+(t.models?.length??0),0));async function c(){i.value=!0;try{n.value=await r.get(`/api/config`)}finally{i.value=!1}}async function l(){return await r.put(`/api/config`,n.value)}async function u(e){return e(n.value),await l()}return{config:n,loading:i,providers:a,providerCount:o,totalModelCount:s,load:c,save:l,update:u}});export{o as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e=e=>String(e).padStart(2,`0`),t=t=>{let n=t=>`${t.getFullYear()}-${e(t.getMonth()+1)}-${e(t.getDate())}`,r=new Date,i=new Date(r),a=r;if(t!==`today`){if(t===`yesterday`)i.setDate(r.getDate()-1),a=i;else if(t===`beforeYesterday`)i.setDate(r.getDate()-2),a=i;else if(t===`last3days`)i.setDate(r.getDate()-2);else if(t===`week`)i.setDate(r.getDate()-(r.getDay()+6)%7);else if(t===`month`)i.setDate(1);else return null}return[n(i),n(a)]},n=e=>{if(e.name)return e.name;if(e.alias)return e.alias;let t=e.apiKey||``;if(!t)return`-`;if(t.length<=8)return t;let n=Math.min(6,Math.floor(t.length/4));return`${t.substring(0,n)}...${t.substring(t.length-n)}`},r=e=>{if(!e)return null;let t=new Date(e);return Number.isNaN(t.getTime())?null:t},i=t=>{let n=r(t);return n===null?`-`:`${n.getFullYear()}-${e(n.getMonth()+1)}-${e(n.getDate())} ${e(n.getHours())}:${e(n.getMinutes())}:${e(n.getSeconds())}`},a=t=>{let n=r(t);return n===null?`-`:`${e(n.getMonth()+1)}-${e(n.getDate())} ${e(n.getHours())}:${e(n.getMinutes())}:${e(n.getSeconds())}`},o=e=>e?typeof e==`string`?e:JSON.stringify(e,null,2):`-`,s=e=>{if(!e)return`-`;try{return JSON.stringify(JSON.parse(e),null,2)}catch{return e}},c=e=>{let t=e??0;return(Number.isFinite(t)?t:0).toLocaleString()},l=({protocol:e,hostname:t,port:n})=>`${e===`https:`?`https:`:`http:`}//${t}${n?`:${n}`:``}`,u=e=>e>=1?String(Math.floor(e)):(Math.floor(e*10)/10).toFixed(1),d=e=>e==null||e<=0?`-`:u(e/1e3)+`s`,f=e=>e==null?`-`:e<1e3?`${String(e)}ms`:`${(e/1e3).toFixed(1)}s`,p=e=>typeof e!=`number`||!Number.isFinite(e)||e<=0?`-`:`${u(e)} t/s`,m=`首 token 延迟:请求进入网关 → 上游首个响应数据块到达(仅流式请求有观测点)`,h=`生成速度:输出 token ÷ 生成窗口。流式 = 首 token 后到流结束;非流式无更细观测点,按总耗时近似`,g=`${h};${m}`,_=(e,t)=>{let n=p(e),r=d(t);return r===`-`?n:n===`-`?r:`${r} · ${n}`},v=e=>{let t=e.input_tokens||0,n=e.cache_read_tokens||0;return t<=0?`-`:(n/t*100).toFixed(1)+`%`},y=(e,t=262144)=>{let n=e??``;return n.length<=t?n:`${n.slice(0,t)}\n\n…(已省略 ${(n.length-t).toLocaleString()} 字符以保持流畅,完整内容请点上方「复制」按钮)`},b=e=>{let t=(e||``).trim();return t?t.length>8?`${t.slice(0,8)}…`:t:`-`},x=e=>e.client||e.user_agent||`-`,S=e=>e.user_agent?`${e.user_agent}(点击复制)`:`${e.client??`-`}(点击复制)`,C=e=>{let t=(e||``).split(`,`).map(e=>e.trim()).filter(Boolean).sort();return t.length===0?`-`:t.length<=2?t.join(`, `):`${t.slice(0,2).join(`, `)} +${t.length-2}`},w=e=>C(e),T=e=>C(e);export{y as C,_ as S,e as _,v as a,b,T as c,c as d,p as f,w as g,s as h,l as i,d as l,i as m,h as n,x as o,o as p,m as r,S as s,g as t,f as u,n as v,a as x,t as y};
|