ezllm 0.0.46 → 0.0.48
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/README.md +2 -2
- package/dist/cli.js +24 -24
- package/dist/daemon.js +15 -14
- package/dist/plugin-host.js +3 -4
- package/dist/server.js +82 -82
- package/dist/web-ui/assets/DashboardView-CJOcLFY-.js +2 -0
- package/dist/web-ui/assets/{DashboardView-C2Yev1D5.css → DashboardView-CNsnnzad.css} +1 -1
- package/dist/web-ui/assets/{LayoutView-nQtqB0Tc.js → LayoutView-DH55aSBP.js} +1 -1
- package/dist/web-ui/assets/{LoginView-BhEpm0Au.js → LoginView-Cp-a8Nds.js} +1 -1
- package/dist/web-ui/assets/LogsView-C1ImQHJ6.js +5 -0
- package/dist/web-ui/assets/{LogsView-CXFJ_22b.css → LogsView-DPmB8dy8.css} +1 -1
- package/dist/web-ui/assets/{ManagedServicesView-CLzTT7z2.js → ManagedServicesView-DIMY-j18.js} +2 -2
- package/dist/web-ui/assets/ManagedServicesView-DVCADa1y.css +1 -0
- package/dist/web-ui/assets/PluginsView-Bnwsd3-R.css +1 -0
- package/dist/web-ui/assets/PluginsView-CqmYhJ6G.js +2 -0
- package/dist/web-ui/assets/ProvidersView-BwX8Y3kP.css +1 -0
- package/dist/web-ui/assets/ProvidersView-uCjHMlHd.js +14 -0
- package/dist/web-ui/assets/{SettingsView-b2CeR1My.js → SettingsView-BbmPwJ-1.js} +1 -1
- package/dist/web-ui/assets/{SetupView-DoX2Bgw3.js → SetupView-WCA8Jeug.js} +1 -1
- package/dist/web-ui/assets/{config-YrFlUs_u.js → config-BKCqJSgG.js} +1 -1
- package/dist/web-ui/assets/{format-CPPf8IfM.js → format-Deb1hfjO.js} +1 -1
- package/dist/web-ui/assets/{index-DI3uc2DE.js → index-DNgY-btf.js} +1 -1
- package/dist/web-ui/assets/{index-s_h6GEbv.css → index-DodsqGDu.css} +1 -1
- package/dist/web-ui/assets/{message-C2sOagFr.js → message-Bqg-4z7y.js} +1 -1
- package/dist/web-ui/assets/pluginProviders-BGmYcLwJ.js +1 -0
- package/dist/web-ui/assets/{providers-B3Yjaw16.js → providers-DRvT1zLg.js} +1 -1
- package/dist/web-ui/assets/{router-HZFOsjIe.js → router-CpkAp9dB.js} +2 -2
- package/dist/web-ui/assets/{useCopyToast-CAPtwvVI.js → useCopyToast-DwJ3VhPN.js} +1 -1
- package/dist/web-ui/assets/{useManagerApi-CqPHDl58.js → useManagerApi-Cf88mNiu.js} +1 -1
- package/dist/web-ui/assets/{useQuickRangeFilter-D6GerEKs.js → useQuickRangeFilter-BsOHHbog.js} +1 -1
- package/dist/web-ui/assets/useToast-IlI6ESuD.js +1 -0
- package/dist/web-ui/index.html +4 -4
- package/package.json +2 -1
- package/dist/web-ui/assets/DashboardView-BBhbdkOC.js +0 -2
- package/dist/web-ui/assets/LogsView-CndSVBE7.js +0 -5
- package/dist/web-ui/assets/ManagedServicesView-D29NyvP6.css +0 -1
- package/dist/web-ui/assets/PluginsView-C9WsFDej.css +0 -1
- package/dist/web-ui/assets/PluginsView-DyhLcnWT.js +0 -2
- package/dist/web-ui/assets/ProvidersView-C-bcvgrC.css +0 -1
- package/dist/web-ui/assets/ProvidersView-COO6c5v9.js +0 -14
- package/dist/web-ui/assets/pluginProviders-CF1xaQO3.js +0 -1
- package/dist/web-ui/assets/useToast-DrZEDnuk.js +0 -1
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{$ as e,A as t,Et as n,F as r,Ft as i,Gt as a,H as o,I as s,L as c,M as l,N as u,Q as d,T as f,a as p,at as m,cn as ee,d as h,gt as te,ht as g,j as _,k as v,l as y,ot as ne,pn as b,pt as x,rt as S,tt as C,un as w,xt as T,yt as E}from"./router-HZFOsjIe.js";import{t as D}from"./useManagerApi-CqPHDl58.js";import{t as O}from"./providers-B3Yjaw16.js";import{n as k,t as re}from"./useCopyToast-CAPtwvVI.js";import{t as ie}from"./useToast-DrZEDnuk.js";import{n as A,t as j}from"./useQuickRangeFilter-D6GerEKs.js";import{_ as M,d as N,f as P,i as F,l as I,m as L,n as R,r as z,u as B}from"./format-CPPf8IfM.js";E();function ae(e){let{loadError:t,run:r}=k(e),i=n(null);function a(e){let t=async()=>{let n=await r(e);return n?i.value===t&&(i.value=null):i.value=t,n};return t}function o(e){r(i.value??e)}return{loadError:t,track:a,retry:o}}o(),E(),a();var V={class:`service-status-panel`},H={class:`flex-between`},U={class:`flex-gap-8`},oe={class:`flex-gap-8`},se={class:`gantt-wrap`},ce={key:0,class:`gantt`},le={class:`gantt-row gantt-head`},W={class:`col-cells`},ue=[`title`],G={class:`cell-head-date`},de={class:`col-name`},K=[`title`,`onClick`],fe=[`title`],q={class:`col-cells`},J=[`title`],Y={key:1,class:`gantt-empty`},X=36e5,pe=24,me=`#909399`,he=h(c({__name:`ServiceStatusPanel`,setup(a){let{toast:o}=ie(),{copyWithToast:c}=re(),{loadError:h,run:y}=k(`延迟数据加载失败,请重试`),x=n([]),T=n(!0),E=n(!1),D=n(null),O=n(!1),A=n(!1),j,N,P=n(I()),F=n(new Map);function I(){let e=new Date,t=new Date(e.getFullYear(),e.getMonth(),e.getDate(),e.getHours()).getTime();return Array.from({length:pe},(e,n)=>t-(23-n)*X)}let R=e=>{let t=new Date(e);return Number.isNaN(t.getTime())?`-`:`${t.getFullYear()}-${M(t.getMonth()+1)}-${M(t.getDate())} ${M(t.getHours())}:00`},z=v(()=>P.value.map(e=>{let t=new Date(e),n=M(t.getHours());return{start:e,dateLabel:`${M(t.getMonth()+1)}-${M(t.getDate())}`,hourLabel:n,fullLabel:`${R(e)} - ${n}:59`}})),ae=[103,194,58],he=[230,162,60],ge=[245,108,108],_e=v(()=>{let e=[];for(let t of F.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}}),ve=e=>{let{min:t,max:n}=_e.value,r=n===t?0:(e-t)/(n-t),[i,a]=r<=.5?[ae,he]:[he,ge],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)`},Z=(e,t)=>{let n=`${R(t)} - ${M(new Date(t+X).getHours())}:00`;return e===void 0||e.total===0?`${n}\n无探测数据`:`${n}\n平均延迟 ${B(e.avgLatencyMs)}\n成功 ${String(e.success)} / 失败 ${String(e.failed)}`},ye=v(()=>xe.value.map(e=>{let t=F.value.get(e.model),n=P.value.map(e=>{let n=t?.get(e);return n!==void 0&&n.failed>0?{start:e,className:`cell--down`,style:{backgroundColor:me},title:Z(n,e)}:n===void 0||n.avgLatencyMs===null?{start:e,className:`cell--empty`,style:{},title:Z(n,e)}:{start:e,className:``,style:{backgroundColor:ve(n.avgLatencyMs)},title:Z(n,e)}});return{model:e.model,avg24h:e.avg24h,statusTitle:[e.avg24h===null?`最近 24 小时无成功探测记录`:`最近 24 小时成功探测平均延迟 ${B(e.avg24h)}`,e.lastLatencyMs==null?`最近一次探测:无成功延迟记录`:`最近一次探测延迟 ${B(e.lastLatencyMs)}`].join(`
|
|
2
|
-
`),cells:n}})),be=(e,t)=>e===null&&t===null?0:e===null?1:t===null?-1:e-t,xe=v(()=>[...x.value].sort((e,t)=>{let n=e.lastOk===!1;if(n!==(t.lastOk===!1))return n?1:-1;let r=be(e.avg24h,t.avg24h);return r===0?e.model.localeCompare(t.model):r})),Se=async e=>{if(e.length===0){F.value=new Map;return}let t=await Promise.all(e.map(async e=>{try{let t=await p.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]}}));F.value=new Map(t)},Ce=async()=>{let e=await p.get(`/api/latency/history`);return x.value=e.models??[],E.value=e.running,D.value=e.lastRunAt,e},Q=()=>y(async()=>{try{await Ce(),P.value=I(),await Se(x.value.map(e=>e.model))}finally{T.value=!1}}),we=()=>Q(),Te=()=>{A.value?j=window.setInterval(()=>void Q(),5e3):j!==void 0&&(window.clearInterval(j),j=void 0)},Ee=async()=>{O.value=!0;try{await p.post(`/api/latency/run`)}catch(e){o(e.message,`error`),O.value=!1;return}N=window.setInterval(async()=>{try{(await Ce()).running||(window.clearInterval(N),N=void 0,O.value=!1,P.value=I(),await Se(x.value.map(e=>e.model)))}catch{}},2e3)};return d(()=>{Q()}),e(()=>{j!==void 0&&window.clearInterval(j),N!==void 0&&window.clearInterval(N)}),(e,n)=>{let a=m(`el-button`),o=m(`el-alert`),d=m(`el-tag`),p=m(`el-checkbox`),v=m(`el-empty`),y=m(`el-card`),x=ne(`loading`);return C(),u(`div`,V,[i(h)?(C(),_(o,{key:0,title:i(h),type:`error`,"show-icon":``,closable:!1,class:`mb-16`},{default:g(()=>[s(a,{size:`small`,onClick:we},{default:g(()=>[...n[1]||=[r(`重试`,-1)]]),_:1})]),_:1},8,[`title`])):l(``,!0),s(y,{shadow:`never`,class:`service-status-card`},{header:g(()=>[t(`div`,H,[t(`div`,U,[n[3]||=t(`span`,{class:`fw-600`},`服务状态`,-1),E.value?(C(),_(d,{key:0,type:`warning`,size:`small`},{default:g(()=>[...n[2]||=[r(`测试进行中`,-1)]]),_:1})):D.value?(C(),_(d,{key:1,type:`info`,size:`small`},{default:g(()=>[r(` 上次测试 `+b(i(L)(D.value)),1)]),_:1})):l(``,!0)]),t(`div`,oe,[s(p,{modelValue:A.value,"onUpdate:modelValue":n[0]||=e=>A.value=e,onChange:Te},{default:g(()=>[...n[4]||=[r(` 自动刷新(5s) `,-1)]]),_:1},8,[`modelValue`]),s(a,{loading:O.value,onClick:Ee},{default:g(()=>[...n[5]||=[r(` 延迟测试 `,-1)]]),_:1},8,[`loading`])])])]),default:g(()=>[n[9]||=t(`div`,{class:`legend`},[t(`span`,{class:`legend-text`},`延迟`),t(`span`,{class:`legend-text`},`低`),t(`span`,{class:`legend-gradient`}),t(`span`,{class:`legend-text`},`高`),t(`span`,{class:`legend-swatch legend-swatch--down`}),t(`span`,{class:`legend-text`},`该小时有失败探测`),t(`span`,{class:`legend-swatch legend-swatch--empty`}),t(`span`,{class:`legend-text`},`无探测数据`)],-1),te((C(),u(`div`,se,[n[8]||=t(`div`,{class:`muted-sm hint`},` 右侧 24 格为最近 24 小时(每格 1 小时,本地整点对齐,最右格为当前小时)。 格子底色为当小时成功探测的平均延迟,全表统一色标(本期最快→最慢 绿→红); 当小时存在失败探测即视为不可用,显示灰色。 行按 24h 平均延迟升序,最近一次探测失败的模型沉底。 `,-1),ye.value.length>0?(C(),u(`div`,ce,[t(`div`,le,[n[6]||=t(`div`,{class:`col-name`},`模型名称`,-1),n[7]||=t(`div`,{class:`col-status`},`状态`,-1),t(`div`,W,[(C(!0),u(f,null,S(z.value,e=>(C(),u(`div`,{key:e.start,class:`cell cell--head`,title:e.fullLabel},[t(`span`,G,b(e.dateLabel),1),t(`span`,null,b(e.hourLabel),1)],8,ue))),128))])]),(C(!0),u(f,null,S(ye.value,e=>(C(),u(`div`,{key:e.model,class:`gantt-row`},[t(`div`,de,[t(`span`,{class:`copy-text model-name`,title:e.model,onClick:t=>i(c)(e.model)},b(e.model),9,K)]),t(`div`,{class:`col-status`,title:e.statusTitle},b(i(B)(e.avg24h)),9,fe),t(`div`,q,[(C(!0),u(f,null,S(e.cells,e=>(C(),u(`div`,{key:e.start,class:ee([`cell`,e.className]),style:w(e.style),title:e.title},null,14,J))),128))])]))),128))])):(C(),u(`div`,Y,[s(v,{description:`暂无延迟数据,点击「延迟测试」开始`,"image-size":80})]))])),[[x,T.value]])]),_:1})])}}}),[[`__scopeId`,`data-v-0f99bcf1`]]);o(),E(),a();var ge={class:`flex-col-gap`},_e={class:`kv-grid`},ve={class:`kv-label`},Z={class:`kv-value`},ye=[`onClick`],be={class:`kv-item kv-span-2`},xe={class:`kv-value`},Se={key:1,class:`kv-unit`},Ce={class:`kv-item`},Q={class:`kv-value`},we={class:`kv-unit`},Te={class:`kv-item`},Ee={class:`kv-value`},De={class:`flex-between card-header-wrap`},Oe={class:`flex-gap-8`},ke={class:`usage-grid`},Ae={class:`usage-cell`},je={class:`usage-num orange`},Me={class:`usage-cell`},Ne={class:`usage-num blue`},Pe={class:`usage-cell`},Fe={class:`usage-num green`},Ie={class:`usage-cell`},Le={class:`usage-num purple`},Re={class:`usage-cell`},ze={class:`usage-num purple`},Be={key:0,class:`usage-cell`},Ve={class:`usage-num gray`},He={class:`usage-cell`},Ue={class:`usage-num blue`},We={class:`usage-cell`},Ge=[`title`],Ke={class:`usage-cell`},qe=[`title`],Je={key:0},Ye=[`onClick`],Xe=[`title`],Ze=[`title`],Qe=h(c({__name:`DashboardView`,setup(a){let o=O(),c=y(),{copyWithToast:h}=re(),{loadError:w,track:E,retry:k}=ae(),ie={local:`本机 API 地址`,lan:`局域网地址`,other:`API 地址`},M=n(null),L=n(!0),B=n(``),V=n(c.query.tab===`status`?`status`:`overview`);x(()=>c.query.tab,e=>{e===`status`&&(V.value=`status`)});let{rangeKey:H,dateRange:U,onRangeChange:oe}=j(()=>W(),`today`),se=()=>{H.value=``,W()},ce=v(()=>{let e=new Set;for(let t of o.suppliers)for(let n of t.models)e.add(n.modelName);if(M.value?.models)for(let t of M.value.models)e.add(t.model);return[...e].sort()}),le=A(),W=E(async()=>{let e=le();L.value=!0;try{let t=new URLSearchParams;B.value&&t.set(`model`,B.value),U.value?.length===2&&(t.set(`startDate`,U.value[0]),t.set(`endDate`,U.value[1]));let n=t.toString(),r=await p.get(`/api/usage${n?`?${n}`:``}`);if(!e())return;M.value=r}catch(t){if(!e())return;throw t}finally{e()&&(L.value=!1)}}),ue=A(),G=E(async()=>{let e=ue();try{await Promise.all([W(),o.loadProviders()])}catch(t){if(!e())return;throw t}finally{e()&&(L.value=!1)}}),de=()=>k(G),K=window.location.hostname,fe=Number(window.location.port)||null,q=v(()=>F({protocol:window.location.protocol,hostname:K,port:fe})),J=n(null),Y=n(null),X=n(!1),pe=n(!0),me=n(Date.now()),Qe=n(null),$e=n([]),et=v(()=>Qe.value??fe),tt=e=>F({protocol:`http:`,hostname:e,port:et.value}),nt=v(()=>K===`127.0.0.1`||K===`::1`||K===`localhost`?`local`:$e.value.includes(K)?`lan`:`other`),$=v(()=>et.value?$e.value.map(tt).filter(e=>e!==q.value):[]),rt=v(()=>{let e=et.value?tt(`127.0.0.1`):``;return e!==``&&e!==q.value?e:``}),it=v(()=>{let e=[];return nt.value===`lan`?e.push({label:`局域网地址`,values:[q.value,...$.value]}):(e.push({label:ie[nt.value],values:[q.value]}),$.value.length>0&&e.push({label:`局域网地址`,values:$.value})),rt.value!==``&&e.push({label:`本机 API 地址`,values:[rt.value]}),e.map((t,n)=>({...t,span2:e.length%2==1&&n===e.length-1}))}),at=async()=>{let[e,t]=await Promise.allSettled([D.processes(),p.get(`/api/status`)]);if(pe.value=!1,e.status===`fulfilled`&&(J.value=e.value[0]??null),t.status===`rejected`){Y.value=null,X.value=!0;return}let n=t.value?.masterKey;Y.value=typeof n==`string`?n:null,X.value=typeof n!=`string`;let r=t.value?.listenPort;Qe.value=typeof r==`number`&&r>0?r:null;let i=t.value?.lanAddresses;$e.value=Array.isArray(i)?i.filter(e=>typeof e==`string`):[],me.value=Date.now()},ot=e=>{if(!e.startedAt)return`-`;let t=Math.max(0,Math.floor((me.value-e.startedAt)/1e3)),n=Math.floor(t/86400);t-=n*86400;let r=Math.floor(t/3600);t-=r*3600;let i=Math.floor(t/60);return t-=i*60,[n?`${n}天`:``,r?`${r}时`:``,i?`${i}分`:``,`${t}秒`].filter(Boolean).join(` `)},st=v(()=>X.value?`获取失败,请刷新重试`:Y.value===null?`-`:`未设置(/v1 免鉴权)`),ct;return d(()=>{G(),at(),ct=window.setInterval(at,1e4)}),e(()=>window.clearInterval(ct)),(e,n)=>{let a=m(`el-button`),o=m(`el-alert`),c=m(`el-card`),d=m(`el-option`),p=m(`el-select`),v=m(`el-date-picker`),y=m(`el-table-column`),x=m(`el-table`),E=m(`el-empty`),D=m(`el-tab-pane`),O=m(`el-tabs`),k=ne(`loading`);return C(),_(O,{modelValue:V.value,"onUpdate:modelValue":n[4]||=e=>V.value=e,class:`dashboard-tabs`},{default:g(()=>[s(D,{label:`概览`,name:`overview`},{default:g(()=>[t(`div`,ge,[i(w)?(C(),_(o,{key:0,title:i(w),type:`error`,"show-icon":``,closable:!1},{default:g(()=>[s(a,{size:`small`,onClick:de},{default:g(()=>[...n[5]||=[r(`重试`,-1)]]),_:1})]),_:1},8,[`title`])):l(``,!0),s(c,{shadow:`never`},{header:g(()=>[...n[6]||=[t(`span`,{class:`fw-600`},`服务信息`,-1)]]),default:g(()=>[te((C(),u(`div`,_e,[(C(!0),u(f,null,S(it.value,e=>(C(),u(`div`,{key:e.label+e.values[0],class:ee([`kv-item`,{"kv-span-2":e.span2}])},[t(`div`,ve,b(e.label),1),t(`div`,Z,[(C(!0),u(f,null,S(e.values,e=>(C(),u(`div`,{key:e},[t(`span`,{class:`copy-text`,onClick:t=>i(h)(e)},b(e),9,ye)]))),128))])],2))),128)),t(`div`,be,[n[7]||=t(`div`,{class:`kv-label`},`API 密钥`,-1),t(`div`,xe,[Y.value?(C(),u(`span`,{key:0,class:`copy-text`,onClick:n[0]||=e=>i(h)(Y.value)},b(Y.value),1)):l(``,!0),Y.value?(C(),u(`span`,Se,`(/v1 需 Bearer 认证)`)):(C(),u(f,{key:2},[r(b(st.value),1)],64))])]),t(`div`,Ce,[n[10]||=t(`div`,{class:`kv-label`},`运行状态`,-1),t(`div`,Q,[J.value?(C(),u(f,{key:0},[n[8]||=t(`span`,{class:`status-dot running`},null,-1),n[9]||=r(`运行中 `,-1),t(`span`,we,`PID `+b(J.value.pid??`-`),1)],64)):(C(),u(f,{key:1},[r(`-`)],64))])]),t(`div`,Te,[n[11]||=t(`div`,{class:`kv-label`},`运行时长`,-1),t(`div`,Ee,b(J.value?ot(J.value):`-`),1)])])),[[k,L.value||pe.value]])]),_:1}),M.value?(C(),_(c,{key:1,shadow:`never`},{header:g(()=>[t(`div`,De,[n[13]||=t(`span`,{class:`fw-600`},`用量统计`,-1),t(`div`,Oe,[s(p,{modelValue:B.value,"onUpdate:modelValue":n[1]||=e=>B.value=e,placeholder:`全部模型`,clearable:``,filterable:``,style:{width:`220px`},onChange:i(W)},{default:g(()=>[(C(!0),u(f,null,S(ce.value,e=>(C(),_(d,{key:e,label:e,value:e},null,8,[`label`,`value`]))),128))]),_:1},8,[`modelValue`,`onChange`]),s(p,{modelValue:i(H),"onUpdate:modelValue":n[2]||=e=>T(H)?H.value=e:null,placeholder:`时间范围`,clearable:``,style:{width:`130px`},onChange:i(oe)},{default:g(()=>[s(d,{label:`今天`,value:`today`}),s(d,{label:`昨天`,value:`yesterday`}),s(d,{label:`前天`,value:`beforeYesterday`}),s(d,{label:`近三天`,value:`last3days`}),s(d,{label:`本周`,value:`week`}),s(d,{label:`本月`,value:`month`})]),_:1},8,[`modelValue`,`onChange`]),s(v,{modelValue:i(U),"onUpdate:modelValue":n[3]||=e=>T(U)?U.value=e:null,type:`daterange`,"range-separator":`至`,"start-placeholder":`开始日期`,"end-placeholder":`结束日期`,"value-format":`YYYY-MM-DD`,style:{width:`260px`},onChange:se},null,8,[`modelValue`]),s(a,{loading:L.value,onClick:i(W)},{default:g(()=>[...n[12]||=[r(`刷新`,-1)]]),_:1},8,[`loading`,`onClick`])])])]),default:g(()=>[t(`div`,ke,[t(`div`,Ae,[t(`div`,je,b(i(N)(M.value.total.total_tokens)),1),n[14]||=t(`div`,{class:`usage-label`},`总 Token`,-1)]),t(`div`,Me,[t(`div`,Ne,b(i(N)(M.value.total.input_tokens)),1),n[15]||=t(`div`,{class:`usage-label`},`输入 Token`,-1)]),t(`div`,Pe,[t(`div`,Fe,b(i(N)(M.value.total.output_tokens)),1),n[16]||=t(`div`,{class:`usage-label`},`输出 Token`,-1)]),t(`div`,Ie,[t(`div`,Le,b(i(N)(M.value.total.cache_read_tokens)),1),n[17]||=t(`div`,{class:`usage-label`},`缓存读取`,-1)]),t(`div`,Re,[t(`div`,ze,b(M.value.total.cache_rate==null?`-`:M.value.total.cache_rate+`%`),1),n[18]||=t(`div`,{class:`usage-label`},`缓存命中率`,-1)]),M.value.logStorageMB==null?l(``,!0):(C(),u(`div`,Be,[t(`div`,Ve,b(M.value.logStorageMB),1),n[19]||=t(`div`,{class:`usage-label`},`数据目录占用 (MB)`,-1)])),t(`div`,He,[t(`div`,Ue,b(i(I)(M.value.total.avg_duration)),1),n[20]||=t(`div`,{class:`usage-label`},`平均耗时`,-1)]),t(`div`,We,[t(`div`,{class:`usage-num blue`,title:i(z)},b(i(I)(M.value.total.avg_ttft)),9,Ge),n[21]||=t(`div`,{class:`usage-label`},`平均首 Token`,-1)]),t(`div`,Ke,[t(`div`,{class:`usage-num green`,title:i(R)},b(i(P)(M.value.total.tps)),9,qe),n[22]||=t(`div`,{class:`usage-label`},`平均生成速度`,-1)])]),M.value.models?.length?(C(),u(`div`,Je,[n[23]||=t(`div`,{class:`section-title`},`模型用量`,-1),s(x,{data:M.value.models,stripe:``,class:`full-width`},{default:g(()=>[s(y,{prop:`model`,label:`模型`,"min-width":`200`},{default:g(({row:e})=>[t(`span`,{class:`copy-text`,onClick:t=>i(h)(e.model)},b(e.model),9,Ye)]),_:1}),s(y,{label:`调用次数`,width:`90`,align:`center`},{default:g(({row:e})=>[r(b(e.calls),1)]),_:1}),s(y,{label:`平均耗时`,width:`110`,align:`center`},{default:g(({row:e})=>[r(b(i(I)(e.avg_duration)),1)]),_:1}),s(y,{label:`速度`,width:`130`,align:`center`},{default:g(({row:e})=>[t(`div`,{title:i(R)},b(i(P)(e.tps)),9,Xe),e.avg_ttft==null?l(``,!0):(C(),u(`div`,{key:0,class:`cell-sub`,title:i(z)},` 首 `+b(i(I)(e.avg_ttft)),9,Ze))]),_:1}),s(y,{label:`总 Token`,width:`140`,align:`center`},{default:g(({row:e})=>[r(b(i(N)(e.total_tokens)),1)]),_:1}),s(y,{label:`输入 Token`,width:`140`,align:`center`},{default:g(({row:e})=>[r(b(i(N)(e.input_tokens)),1)]),_:1}),s(y,{label:`输出 Token`,width:`140`,align:`center`},{default:g(({row:e})=>[r(b(i(N)(e.output_tokens)),1)]),_:1}),s(y,{label:`缓存读取`,width:`130`,align:`center`},{default:g(({row:e})=>[r(b(i(N)(e.cache_read_tokens)),1)]),_:1}),s(y,{label:`缓存命中率`,width:`110`,align:`center`},{default:g(({row:e})=>[r(b(e.cache_rate==null?`-`:e.cache_rate+`%`),1)]),_:1})]),_:1},8,[`data`])])):(C(),_(E,{key:1,description:`暂无调用记录`,"image-size":60}))]),_:1})):l(``,!0)])]),_:1}),s(D,{label:`服务状态`,name:`status`,lazy:``,"destroy-on-close":``},{default:g(()=>[s(he)]),_:1})]),_:1},8,[`modelValue`])}}}),[[`__scopeId`,`data-v-b5b21c4c`]]);export{Qe as default};
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import{A as e,C as t,Et as n,F as r,Ft as i,Gt as a,H as o,I as s,L as c,M as l,N as u,Q as d,S as f,St as p,T as m,a as h,at as g,d as _,gt as v,h as y,ht as b,j as x,k as S,ot as ee,pn as C,pt as w,rt as T,tt as E,wt as D,xt as O,yt as k}from"./router-HZFOsjIe.js";import{S as te,z as A}from"./message-C2sOagFr.js";import{t as j}from"./index-DI3uc2DE.js";import{t as ne}from"./providers-B3Yjaw16.js";import{n as M,t as N}from"./useCopyToast-CAPtwvVI.js";import{t as re}from"./useToast-DrZEDnuk.js";import{n as P,t as ie}from"./useQuickRangeFilter-D6GerEKs.js";import{C as F,S as I,a as ae,b as L,c as R,d as z,f as B,g as V,h as H,l as U,m as W,n as oe,o as se,p as G,r as K,s as ce,t as le,x as ue}from"./format-CPPf8IfM.js";o(),k(),a();var de={class:`detail-content`},q={key:0,class:`ip-link`},J={class:`ip-pop`},Y={class:`ip-pop-row`},fe={key:0,class:`ip-pop-row`},pe={key:1,class:`ip-pop-error`},me={key:2},X=[`href`],he={key:1},ge={key:1},_e=[`title`],ve=[`title`],ye={class:`error-text`},be={class:`pane-bar`},Z={class:`json-block`},xe={class:`pane-bar`},Q={class:`json-block`},Se={class:`pane-bar`},Ce={class:`json-block`},$={class:`pane-bar`},we={class:`json-block`},Te={class:`pane-bar`},Ee={class:`json-block`},De={class:`pane-bar`},Oe={class:`json-block`},ke={class:`pane-bar`},Ae={class:`json-block`},je={class:`pane-bar`},Me={class:`json-block`},Ne=_(c({__name:`LogDetailDialog`,setup(t,{expose:a}){let{copyWithToast:o}=N(),{loadError:c,run:d}=M(),f=n(!1),_=n(null),y=n(!1),w=n(`info`),T=n(!1),D=n(null),O=P(),k=e=>{D.value=e,f.value=!0,_.value=null,w.value=`info`;let t=O();y.value=!0,d(async()=>{try{let n=`?id=${String(e.id)}`,r=await h.get(`/api/logs/detail`+n);if(!t())return;if(r&&r.detail){let e={...r.detail,...r.meta};e.response&&=p(e.response),e.request&&=p(e.request),_.value=e}else _.value=r}catch(e){if(!t())return;throw e}finally{t()&&(y.value=!1)}})},te=()=>{D.value&&k(D.value)};a({open:k});let A=S(()=>G(_.value?.response?.inbound_request)),j=S(()=>G(_.value?.response?.upstream_request)),ne=S(()=>H(_.value?.response?.upstream_response_text)),re=S(()=>(_.value?.response?.upstream_stream_frames||[]).join(`
|
|
2
|
-
|
|
3
|
-
`)),ie=S(()=>G(_.value?.response?.client_response)),I=S(()=>(_.value?.response?.client_stream_frames||[]).join(`
|
|
4
|
-
|
|
5
|
-
`)),L=S(()=>G(_.value?.request)),R=S(()=>G(_.value?.response)),V=async e=>{if(!(e._ipInfo||e._ipInfoError)){T.value=!0;try{let t=await h.get(`/api/logs/ipinfo?ip=${encodeURIComponent(e.ip)}`);t.error?e._ipInfoError=t.error:e._ipInfo=t}catch{e._ipInfoError=`查询失败`}finally{T.value=!1}}},se=e=>[e.country,e.region,e.city].filter(Boolean).join(` · `)||`-`;return(t,n)=>{let a=g(`el-button`),d=g(`el-alert`),p=g(`el-descriptions-item`),h=g(`el-tag`),S=g(`el-divider`),D=g(`el-popover`),O=g(`el-descriptions`),k=g(`el-tab-pane`),M=g(`el-tabs`),N=g(`el-dialog`),P=ee(`loading`);return E(),x(N,{modelValue:f.value,"onUpdate:modelValue":n[11]||=e=>f.value=e,title:`日志详情`,width:`80%`,top:`5vh`,"destroy-on-close":``},{default:b(()=>[i(c)?(E(),x(d,{key:0,title:i(c),type:`error`,"show-icon":``,closable:!1,class:`mb-16`},{default:b(()=>[s(a,{size:`small`,onClick:te},{default:b(()=>[...n[12]||=[r(`重试`,-1)]]),_:1})]),_:1},8,[`title`])):l(``,!0),v((E(),u(`div`,de,[_.value?(E(),x(M,{key:0,modelValue:w.value,"onUpdate:modelValue":n[10]||=e=>w.value=e},{default:b(()=>[s(k,{lazy:``,label:`基本信息`,name:`info`},{default:b(()=>[s(O,{column:2,border:``},{default:b(()=>[s(p,{label:`时间`},{default:b(()=>[r(C(i(W)(_.value.time)),1)]),_:1}),s(p,{label:`模型`},{default:b(()=>[r(C(_.value.model),1)]),_:1}),s(p,{label:`方法`},{default:b(()=>[r(C(_.value.method),1)]),_:1}),s(p,{label:`路径`},{default:b(()=>[r(C(_.value.path),1)]),_:1}),s(p,{label:`状态码`},{default:b(()=>[r(C(_.value.status),1)]),_:1}),s(p,{label:`流式`},{default:b(()=>[s(h,{type:_.value.stream?`warning`:`info`},{default:b(()=>[r(C(_.value.stream?`是`:`否`),1)]),_:1},8,[`type`])]),_:1}),s(p,{label:`IP`},{default:b(()=>[_.value.ip?(E(),u(`span`,q,[s(D,{placement:`right`,width:`240`,trigger:`click`,onShow:n[0]||=e=>V(_.value)},{reference:b(()=>[e(`span`,null,C(_.value.ip),1)]),default:b(()=>[v((E(),u(`div`,J,[_.value._ipInfo?(E(),u(m,{key:0},[e(`div`,Y,[n[13]||=e(`span`,{class:`ip-pop-label`},`归属地`,-1),e(`span`,null,C(se(_.value._ipInfo)),1)]),_.value._ipInfo.isp?(E(),u(`div`,fe,[n[14]||=e(`span`,{class:`ip-pop-label`},`运营商`,-1),e(`span`,null,C(_.value._ipInfo.isp),1)])):l(``,!0)],64)):_.value._ipInfoError?(E(),u(`div`,pe,C(_.value._ipInfoError),1)):(E(),u(`span`,me,`查询中...`)),s(S,{style:{margin:`8px 0`}}),e(`a`,{class:`ip-pop-link`,href:`https://m.ip138.com/iplookup.php?ip=${encodeURIComponent(_.value.ip)}`,target:`_blank`},`在 ip138 查看`,8,X)])),[[P,T.value]])]),_:1})])):(E(),u(`span`,he,`-`))]),_:1}),s(p,{label:`Session`},{default:b(()=>[r(C(_.value.session_id||`-`),1)]),_:1}),s(p,{label:`ID`},{default:b(()=>[_.value._id==null?(E(),u(`span`,ge,`-`)):(E(),u(`span`,{key:0,class:`request-id`,title:`点击复制(日志 id 同时是响应头 x-request-id)`,onClick:n[1]||=e=>i(o)(String(_.value._id))},C(_.value._id),1))]),_:1}),s(p,{label:`输入 Token(含缓存读取)`},{default:b(()=>[r(C(i(z)(_.value.input_tokens??0)),1)]),_:1}),s(p,{label:`输出 Token`},{default:b(()=>[r(C(i(z)(_.value.output_tokens??0)),1)]),_:1}),s(p,{label:`缓存读取`},{default:b(()=>[r(C(i(z)(_.value.cache_read_tokens??0)),1)]),_:1}),s(p,{label:`请求耗时`},{default:b(()=>[r(C(i(U)(_.value.duration)),1)]),_:1}),s(p,{label:`缓存命中率`},{default:b(()=>[r(C(i(ae)(_.value)),1)]),_:1}),s(p,{label:`首 Token`},{default:b(()=>[e(`span`,{title:i(K)},C(i(U)(_.value.ttft)),9,_e)]),_:1}),s(p,{label:`生成速度`},{default:b(()=>[e(`span`,{title:i(oe)},C(i(B)(_.value.tps)),9,ve)]),_:1}),_.value.error?(E(),x(p,{key:0,label:`错误`,span:2},{default:b(()=>[e(`span`,ye,C(_.value.error),1)]),_:1})):l(``,!0)]),_:1}),_.value.response?.truncated?(E(),x(d,{key:0,class:`mt-16`,type:`warning`,closable:!1,title:`内容超过单请求捕获上限,已截断`})):l(``,!0)]),_:1}),_.value.response?._capture?(E(),u(m,{key:0},[s(k,{lazy:``,label:`客户端请求`,name:`inbound`},{default:b(()=>[e(`div`,be,[s(a,{size:`small`,class:`copy-btn`,onClick:n[2]||=e=>i(o)(A.value)},{default:b(()=>[...n[15]||=[r(` 复制 `,-1)]]),_:1})]),e(`pre`,Z,C(i(F)(A.value)),1)]),_:1}),s(k,{lazy:``,label:`转发上游的请求`,name:`upstreamReq`},{default:b(()=>[e(`div`,xe,[s(a,{size:`small`,class:`copy-btn`,onClick:n[3]||=e=>i(o)(j.value)},{default:b(()=>[...n[16]||=[r(` 复制 `,-1)]]),_:1})]),e(`pre`,Q,C(i(F)(j.value)),1)]),_:1}),_.value.response.upstream_response_text?(E(),x(k,{key:0,lazy:``,label:`上游响应(原始)`,name:`upstreamRes`},{default:b(()=>[e(`div`,Se,[s(a,{size:`small`,class:`copy-btn`,onClick:n[4]||=e=>i(o)(_.value.response.upstream_response_text)},{default:b(()=>[...n[17]||=[r(` 复制 `,-1)]]),_:1})]),e(`pre`,Ce,C(i(F)(ne.value)),1)]),_:1})):_.value.response.upstream_stream_frames?.length?(E(),x(k,{key:1,lazy:``,label:`上游响应(原始流,${_.value.response.upstream_stream_frames.length} 帧)`,name:`upstreamStream`},{default:b(()=>[e(`div`,$,[s(a,{size:`small`,class:`copy-btn`,onClick:n[5]||=e=>i(o)(re.value)},{default:b(()=>[...n[18]||=[r(` 复制 `,-1)]]),_:1})]),e(`pre`,we,C(i(F)(re.value)),1)]),_:1},8,[`label`])):l(``,!0),_.value.response.client_response!==void 0&&_.value.response.client_response!==null?(E(),x(k,{key:2,lazy:``,label:`回写客户端(转换后)`,name:`clientRes`},{default:b(()=>[e(`div`,Te,[s(a,{size:`small`,class:`copy-btn`,onClick:n[6]||=e=>i(o)(ie.value)},{default:b(()=>[...n[19]||=[r(` 复制 `,-1)]]),_:1})]),e(`pre`,Ee,C(i(F)(ie.value)),1)]),_:1})):_.value.response.client_stream_frames?.length?(E(),x(k,{key:3,lazy:``,label:`回写客户端(${_.value.response.client_stream_frames.length} 帧)`,name:`clientStream`},{default:b(()=>[e(`div`,De,[s(a,{size:`small`,class:`copy-btn`,onClick:n[7]||=e=>i(o)(I.value)},{default:b(()=>[...n[20]||=[r(` 复制 `,-1)]]),_:1})]),e(`pre`,Oe,C(i(F)(I.value)),1)]),_:1},8,[`label`])):l(``,!0)],64)):(E(),u(m,{key:1},[s(k,{lazy:``,label:`请求体`,name:`request`},{default:b(()=>[e(`div`,ke,[s(a,{size:`small`,class:`copy-btn`,onClick:n[8]||=e=>i(o)(L.value)},{default:b(()=>[...n[21]||=[r(` 复制 `,-1)]]),_:1})]),e(`pre`,Ae,C(i(F)(L.value)),1)]),_:1}),s(k,{lazy:``,label:`响应体`,name:`response`},{default:b(()=>[e(`div`,je,[s(a,{size:`small`,class:`copy-btn`,onClick:n[9]||=e=>i(o)(R.value)},{default:b(()=>[...n[22]||=[r(` 复制 `,-1)]]),_:1})]),e(`pre`,Me,C(i(F)(R.value)),1)]),_:1})],64))]),_:1},8,[`modelValue`])):l(``,!0)])),[[P,y.value]])]),_:1},8,[`modelValue`])}}}),[[`__scopeId`,`data-v-7e1ff197`]]);o(),k(),a(),y();var Pe={class:`session-table`},Fe={class:`group-detail`},Ie=[`title`],Le={key:0,class:`detail-error`},Re={class:`detail-footer`},ze={class:`detail-count`},Be=[`title`,`onClick`],Ve=`会话平均生成速度:组内有效请求的输出 token 合计 ÷ 生成窗口合计(按窗口加权,不是各请求速度的算术平均);首 = 组内流式且已采集首 token 的请求的平均首 token 延迟(非流式请求无此观测点,不参与)`,He=50,Ue=_(c({__name:`SessionGroupTable`,props:{groups:{},noSession:{},loading:{type:Boolean},filterParams:{}},emits:[`open-detail`],setup(a,{emit:o}){let c=a,d=o,{copyWithToast:f}=N(),p=S(()=>c.noSession?[...c.groups,c.noSession]:c.groups),m=e=>e.session_id||`__no_session__`,_=n(null),y=D(new Map),T={loading:!1,items:[],total:0,nextPage:1,error:null},O=e=>y.get(m(e))??T,k=async(e,t)=>{let n=(e=>(y.has(e)||y.set(e,{loading:!1,items:[],total:0,nextPage:1,error:null}),y.get(e)))(m(e));if(!n.loading){n.loading=!0,n.error=null;try{let r={...c.filterParams,sort:`time`,order:`desc`,page:String(t),pageSize:String(He)};e.session_id?r.sessionId=e.session_id:r.noSession=`1`;let i=await h.get(`/api/logs?`+new URLSearchParams(r).toString()),a=i.items||[];n.items=t===1?a:[...n.items,...a],n.total=i.total||0,n.nextPage=t+1}catch(e){n.error=e?.message||`加载失败`}finally{n.loading=!1}}},te=(e,t)=>{t.some(t=>m(t)===m(e))&&O(e).items.length===0&&k(e,1)},A=e=>{let t=O(e);t.loading||t.items.length>=t.total||k(e,t.nextPage)},j=e=>{_.value?.toggleRowExpansion(e)};return w(()=>p.value.map(m),e=>{let t=new Set(e);for(let e of[...y.keys()])t.has(e)||y.delete(e)}),(n,o)=>{let c=g(`el-table-column`),h=g(`el-tag`),y=g(`el-button`),S=g(`el-table`),w=g(`el-empty`),T=ee(`loading`);return E(),u(`div`,Pe,[p.value.length>0||a.loading?v((E(),x(S,{key:0,ref_key:`tableRef`,ref:_,data:p.value,height:`100%`,"row-key":m,stripe:``,class:`dense-table`,onExpandChange:te,onRowClick:j},{default:b(()=>[s(c,{type:`expand`},{default:b(({row:t})=>[e(`div`,Fe,[v((E(),x(S,{data:O(t).items,size:`small`,stripe:``,class:`dense-table`},{default:b(()=>[s(c,{label:`时间`,width:`136`,align:`center`},{default:b(({row:e})=>[r(C(i(ue)(e.time)),1)]),_:1}),s(c,{prop:`model`,label:`模型`,"min-width":`80`,align:`center`,"show-overflow-tooltip":``}),s(c,{label:`客户端`,"min-width":`80`,align:`center`,"show-overflow-tooltip":``},{default:b(({row:e})=>[r(C(i(se)(e)),1)]),_:1}),s(c,{label:`状态`,width:`60`,align:`center`},{default:b(({row:e})=>[s(h,{size:`small`,type:e.status>=400?`danger`:e.status>=300?`warning`:`success`},{default:b(()=>[r(C(e.status),1)]),_:2},1032,[`type`])]),_:1}),s(c,{label:`输入`,width:`84`,align:`center`},{default:b(({row:e})=>[r(C(i(z)(e.input_tokens??0)),1)]),_:1}),s(c,{label:`输出`,width:`78`,align:`center`},{default:b(({row:e})=>[r(C(i(z)(e.output_tokens??0)),1)]),_:1}),s(c,{label:`缓存读取`,width:`84`,align:`center`},{default:b(({row:e})=>[r(C(i(z)(e.cache_read_tokens??0)),1)]),_:1}),s(c,{label:`缓存命中率`,width:`88`,align:`center`},{default:b(({row:e})=>[r(C(i(ae)(e)),1)]),_:1}),s(c,{label:`请求耗时`,width:`74`,align:`center`},{default:b(({row:e})=>[r(C(i(U)(e.duration)),1)]),_:1}),s(c,{label:`速度`,width:`140`,align:`center`},{default:b(({row:t})=>[e(`div`,{title:i(le)},C(i(I)(t.tps,t.ttft)),9,Ie)]),_:1}),s(c,{label:`详情`,width:`52`,align:`center`},{default:b(({row:e})=>[s(y,{link:``,type:`primary`,onClick:t=>d(`open-detail`,e)},{default:b(()=>[...o[0]||=[r(`查看`,-1)]]),_:1},8,[`onClick`])]),_:1})]),_:1},8,[`data`])),[[T,O(t).loading]]),O(t).error?(E(),u(`div`,Le,[r(C(O(t).error)+` `,1),s(y,{link:``,type:`primary`,size:`small`,onClick:e=>k(t,1)},{default:b(()=>[...o[1]||=[r(`重试`,-1)]]),_:1},8,[`onClick`])])):l(``,!0),e(`div`,Re,[e(`span`,ze,`已显示 `+C(O(t).items.length)+` / `+C(O(t).total)+` 条`,1),O(t).items.length<O(t).total?(E(),x(y,{key:0,size:`small`,loading:O(t).loading,onClick:e=>A(t)},{default:b(()=>[...o[2]||=[r(` 加载更多 `,-1)]]),_:1},8,[`loading`,`onClick`])):l(``,!0)])])]),_:1}),s(c,{label:`Session`,width:`100`,align:`center`},{default:b(({row:e})=>[e.session_id?(E(),u(`span`,{key:0,class:`session-id`,title:`${e.session_id}(点击复制)`,onClick:t(t=>i(f)(e.session_id),[`stop`])},C(i(L)(e.session_id)),9,Be)):(E(),x(h,{key:1,size:`small`,type:`info`,title:`未携带会话标识的请求(NULL / 空串 session_id)`},{default:b(()=>[...o[3]||=[r(` 无 Session `,-1)]]),_:1}))]),_:1}),s(c,{label:`请求数`,width:`70`,align:`center`},{default:b(({row:e})=>[r(C(i(z)(e.calls)),1)]),_:1}),s(c,{label:`模型`,"min-width":`80`,align:`center`,"show-overflow-tooltip":``},{default:b(({row:e})=>[r(C(i(V)(e.models)),1)]),_:1}),s(c,{label:`客户端`,"min-width":`80`,align:`center`,"show-overflow-tooltip":``},{default:b(({row:e})=>[r(C(i(R)(e.clients)),1)]),_:1}),s(c,{label:`输入`,width:`100`,align:`center`},{default:b(({row:e})=>[r(C(i(z)(e.input_tokens)),1)]),_:1}),s(c,{label:`输出`,width:`90`,align:`center`},{default:b(({row:e})=>[r(C(i(z)(e.output_tokens)),1)]),_:1}),s(c,{label:`缓存读取`,width:`100`,align:`center`},{default:b(({row:e})=>[r(C(i(z)(e.cache_read_tokens)),1)]),_:1}),s(c,{label:`速度`,width:`140`,align:`center`},{default:b(({row:t})=>[e(`div`,{title:Ve},C(i(I)(t.tps,t.avg_ttft)),1)]),_:1}),s(c,{label:`首次请求`,width:`136`,align:`center`},{default:b(({row:e})=>[r(C(i(ue)(e.first_time)),1)]),_:1}),s(c,{label:`最后请求`,width:`136`,align:`center`},{default:b(({row:e})=>[r(C(i(ue)(e.last_time)),1)]),_:1})]),_:1},8,[`data`])),[[T,a.loading]]):(E(),x(w,{key:1,description:`当前筛选下没有日志`}))])}}}),[[`__scopeId`,`data-v-53b49f30`]]);o(),k(),y(),a();var We={class:`logs-page`},Ge={class:`filter-bar`},Ke={class:`table-wrap`},qe=[`onClick`],Je={key:1},Ye=[`title`,`onClick`],Xe={key:1},Ze=[`title`,`onClick`],Qe={key:1},$e=[`title`],et={class:`pagination-bar`},tt=_(c({__name:`LogsView`,setup(t){let a=ne(),{toast:o}=re(),{copyWithToast:c}=N(),{loadError:p,run:_}=M(),{rangeKey:y,dateRange:w,setRange:D,onRangeChange:k}=ie(()=>$()),F=n(`2xx`),R=n(``),B=n(``),V=n(``),H=n(`session`),W=n([]),oe=n([]),G=n(null),K=n(0),de=n(0),q=n(1),J=n(20),Y=n(!1),fe=n(null),pe=e=>{fe.value?.open(e)},me=S(()=>{let e=new Set;for(let t of a.suppliers)for(let n of t.models)e.add(n.modelName);for(let t of W.value)t.model&&e.add(t.model);return[...e].sort()}),X=n([]),he=S(()=>{let e=new Set(X.value);for(let t of W.value)t.client&&e.add(t.client);return[...e].sort()}),ge=async()=>{try{let e=await h.get(`/api/logs/clients`);X.value=e.clients||[]}catch{X.value=[]}},_e=e=>{y.value=``,w.value=e||null,$()},ve=()=>{let e={};w.value&&w.value.length===2&&(e.startDate=w.value[0],e.endDate=w.value[1]),F.value&&(e.status=F.value),R.value&&(e.model=R.value),B.value&&(e.client=B.value);let t=V.value.trim();return t&&(e.sessionId=t),e},ye=S(()=>ve()),be=P(),Z=()=>_(async()=>{let e=be();Y.value=!0;try{let t={...ve(),page:String(q.value),pageSize:String(J.value)};if(H.value===`session`){let n=new URLSearchParams(t).toString(),r=await h.get(`/api/logs/sessions?`+n);if(!e())return;oe.value=r.groups||[],G.value=r.noSession??null,K.value=r.total||0,de.value=r.rowsTotal||0}else{let n=new URLSearchParams({...t,sort:`time`,order:`desc`}).toString(),r=await h.get(`/api/logs?`+n);if(!e())return;W.value=r.items||[],K.value=r.total||0}}catch(t){if(!e())return;throw t}finally{e()&&(Y.value=!1)}}),xe=e=>{H.value!==e&&(H.value=e,q.value=1,J.value=H.value===`session`?20:50,Z())},Q=n(!1),Se=S(()=>H.value===`session`?de.value:K.value),Ce=async()=>{if(Q.value||Se.value===0)return;let e=H.value===`session`?`(按筛选行数计,含「无 Session」组)`:``;try{await j.confirm(`将永久清理当前筛选条件下的 ${Se.value} 条日志${e},清理后不可恢复,请谨慎操作!`,`清理确认`,{confirmButtonText:`确认清理`,cancelButtonText:`取消`,type:`warning`})}catch{return}Q.value=!0;try{let e=new URLSearchParams(ve()).toString(),t=await h.post(`/api/logs/clear?`+e,{});o(`已清理 ${t.deleted??0} 条日志`,`success`),q.value>1&&(q.value=1),Z()}catch(e){o(e.message||`清理失败`,`error`)}finally{Q.value=!1}},$=()=>{q.value=1,ge(),Z()},we=()=>{y.value=`today`,w.value=null,F.value=`2xx`,R.value=``,B.value=``,V.value=``,q.value=1,J.value=H.value===`session`?20:50,D(`today`)};return d(()=>{a.loadProviders().catch(()=>{}),ge(),D(`today`)}),(t,n)=>{let a=g(`el-button`),o=g(`el-alert`),d=g(`el-option`),h=g(`el-select`),_=g(`el-date-picker`),S=g(`el-input`),D=g(`el-tooltip`),j=g(`el-button-group`),ne=g(`el-card`),M=g(`el-table-column`),N=g(`el-tag`),re=g(`el-table`),P=g(`el-pagination`),ie=ee(`loading`);return E(),u(`div`,We,[i(p)?(E(),x(o,{key:0,title:i(p),type:`error`,"show-icon":``,closable:!1,class:`mb-16`},{default:b(()=>[s(a,{size:`small`,onClick:Z},{default:b(()=>[...n[10]||=[r(`重试`,-1)]]),_:1})]),_:1},8,[`title`])):l(``,!0),s(ne,{shadow:`never`},{default:b(()=>[e(`div`,Ge,[s(h,{modelValue:i(y),"onUpdate:modelValue":n[0]||=e=>O(y)?y.value=e:null,placeholder:`时间范围`,clearable:``,style:{width:`114px`},onChange:i(k)},{default:b(()=>[s(d,{label:`今天`,value:`today`}),s(d,{label:`昨天`,value:`yesterday`}),s(d,{label:`前天`,value:`beforeYesterday`}),s(d,{label:`近三天`,value:`last3days`}),s(d,{label:`本周`,value:`week`}),s(d,{label:`本月`,value:`month`})]),_:1},8,[`modelValue`,`onChange`]),s(_,{modelValue:i(w),"onUpdate:modelValue":n[1]||=e=>O(w)?w.value=e:null,type:`daterange`,"value-format":`YYYY-MM-DD`,"range-separator":`至`,"start-placeholder":`开始日期`,"end-placeholder":`结束日期`,style:{width:`240px`},onChange:_e},null,8,[`modelValue`]),s(h,{modelValue:F.value,"onUpdate:modelValue":n[2]||=e=>F.value=e,placeholder:`全部状态`,clearable:``,style:{width:`106px`},onChange:$},{default:b(()=>[s(d,{label:`成功 (2xx)`,value:`2xx`}),s(d,{label:`3xx`,value:`3xx`}),s(d,{label:`4xx`,value:`4xx`}),s(d,{label:`5xx`,value:`5xx`}),s(d,{label:`错误 (4xx+)`,value:`err`})]),_:1},8,[`modelValue`]),s(h,{modelValue:R.value,"onUpdate:modelValue":n[3]||=e=>R.value=e,placeholder:`全部模型`,clearable:``,filterable:``,style:{width:`176px`},onChange:$},{default:b(()=>[(E(!0),u(m,null,T(me.value,e=>(E(),x(d,{key:e,label:e,value:e},null,8,[`label`,`value`]))),128))]),_:1},8,[`modelValue`]),s(h,{modelValue:B.value,"onUpdate:modelValue":n[4]||=e=>B.value=e,placeholder:`全部客户端`,clearable:``,filterable:``,style:{width:`130px`},onChange:$},{default:b(()=>[(E(!0),u(m,null,T(he.value,e=>(E(),x(d,{key:e,label:e,value:e},null,8,[`label`,`value`]))),128))]),_:1},8,[`modelValue`]),s(S,{modelValue:V.value,"onUpdate:modelValue":n[5]||=e=>V.value=e,class:`session-input`,placeholder:`Session ID(前缀匹配)`,clearable:``,onKeyup:f($,[`enter`])},null,8,[`modelValue`]),s(j,{class:`view-switch push-right`},{default:b(()=>[s(D,{content:`按会话分组`,placement:`top`,"show-after":300},{default:b(()=>[s(a,{type:H.value===`session`?`primary`:`default`,icon:i(te),"aria-label":`按会话分组`,onClick:n[6]||=e=>xe(`session`)},null,8,[`type`,`icon`])]),_:1}),s(D,{content:`列表`,placement:`top`,"show-after":300},{default:b(()=>[s(a,{type:H.value===`list`?`primary`:`default`,icon:i(A),"aria-label":`列表视图`,onClick:n[7]||=e=>xe(`list`)},null,8,[`type`,`icon`])]),_:1})]),_:1}),s(a,{type:`primary`,onClick:$},{default:b(()=>[...n[11]||=[r(`搜索`,-1)]]),_:1}),s(a,{onClick:we},{default:b(()=>[...n[12]||=[r(`重置`,-1)]]),_:1})])]),_:1}),s(ne,{shadow:`never`,class:`mt-16 table-card`},{default:b(()=>[e(`div`,Ke,[H.value===`list`?v((E(),x(re,{key:0,data:W.value,stripe:``,height:`100%`,class:`dense-table`},{default:b(()=>[s(M,{prop:`id`,label:`ID`,width:`66`,align:`center`},{default:b(({row:e})=>[e.id==null?(E(),u(`span`,Je,`-`)):(E(),u(`span`,{key:0,class:`request-id`,title:`点击复制(日志 id 同时是响应头 x-request-id,可用于关联控制台日志与检索)`,onClick:t=>i(c)(String(e.id))},C(e.id),9,qe))]),_:1}),s(M,{prop:`time`,label:`时间`,width:`136`,align:`center`},{default:b(({row:e})=>[r(C(i(ue)(e.time)),1)]),_:1}),s(M,{prop:`model`,label:`模型`,"min-width":`80`,align:`center`,"show-overflow-tooltip":``}),s(M,{label:`客户端`,"min-width":`80`,align:`center`},{default:b(({row:e})=>[e.client||e.user_agent?(E(),u(`span`,{key:0,class:`request-id`,title:i(ce)(e),onClick:t=>i(c)(e.user_agent||e.client)},C(i(se)(e)),9,Ye)):(E(),u(`span`,Xe,`-`))]),_:1}),s(M,{label:`Session`,width:`88`,align:`center`},{default:b(({row:e})=>[e.session_id?(E(),u(`span`,{key:0,class:`request-id`,title:`${e.session_id}(点击复制)`,onClick:t=>i(c)(e.session_id)},C(i(L)(e.session_id)),9,Ze)):(E(),u(`span`,Qe,`-`))]),_:1}),s(M,{label:`输入`,width:`84`,align:`center`},{default:b(({row:e})=>[r(C(i(z)(e.input_tokens??0)),1)]),_:1}),s(M,{label:`输出`,width:`78`,align:`center`},{default:b(({row:e})=>[r(C(i(z)(e.output_tokens??0)),1)]),_:1}),s(M,{label:`缓存读取`,width:`84`,align:`center`},{default:b(({row:e})=>[r(C(i(z)(e.cache_read_tokens??0)),1)]),_:1}),s(M,{label:`缓存命中率`,width:`88`,align:`center`},{default:b(({row:t})=>[e(`span`,null,C(i(ae)(t)),1)]),_:1}),s(M,{label:`请求耗时`,width:`74`,align:`center`},{default:b(({row:e})=>[r(C(i(U)(e.duration)),1)]),_:1}),s(M,{label:`速度`,width:`140`,align:`center`},{default:b(({row:t})=>[e(`div`,{title:i(le)},C(i(I)(t.tps,t.ttft)),9,$e)]),_:1}),s(M,{prop:`status`,label:`状态`,width:`60`,align:`center`},{default:b(({row:e})=>[s(N,{size:`small`,type:e.status>=400?`danger`:e.status>=300?`warning`:`success`},{default:b(()=>[r(C(e.status),1)]),_:2},1032,[`type`])]),_:1}),s(M,{label:`详情`,width:`52`,align:`center`,fixed:`right`},{default:b(({row:e})=>[s(a,{link:``,type:`primary`,onClick:t=>pe(e)},{default:b(()=>[...n[13]||=[r(`查看`,-1)]]),_:1},8,[`onClick`])]),_:1})]),_:1},8,[`data`])),[[ie,Y.value]]):l(``,!0),H.value===`session`?(E(),x(Ue,{key:1,groups:oe.value,"no-session":G.value,loading:Y.value,"filter-params":ye.value,onOpenDetail:pe},null,8,[`groups`,`no-session`,`loading`,`filter-params`])):l(``,!0)]),e(`div`,et,[s(a,{type:`danger`,plain:``,size:`small`,loading:Q.value,disabled:Se.value===0,onClick:Ce},{default:b(()=>[...n[14]||=[r(`清理已筛选日志`,-1)]]),_:1},8,[`loading`,`disabled`]),s(P,{class:`push-right`,"current-page":q.value,"onUpdate:currentPage":n[8]||=e=>q.value=e,"page-size":J.value,"onUpdate:pageSize":n[9]||=e=>J.value=e,total:K.value,"page-sizes":[20,50,100,200],layout:`total, sizes, prev, pager, next`,onCurrentChange:Z,onSizeChange:Z},null,8,[`current-page`,`page-size`,`total`])])]),_:1}),s(Ne,{ref_key:`logDetailRef`,ref:fe},null,512)])}}}),[[`__scopeId`,`data-v-7cb554f8`]]);export{tt as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
.form-hint[data-v-55b26af7]{color:var(--el-text-color-secondary);margin-top:4px;font-size:12px;line-height:1.6}.form-hint--inline[data-v-55b26af7]{margin-top:0;margin-left:8px}.form-hint--block[data-v-55b26af7]{margin-bottom:8px}.name-cell[data-v-f4d654e1]{align-items:center;gap:8px;display:flex}.cmd-cell[data-v-f4d654e1]{flex-direction:column;gap:2px;min-width:0;display:flex}.mono[data-v-f4d654e1]{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px}.cwd-text[data-v-f4d654e1]{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
.plugin-tabs[data-v-08295b8f] .el-tabs__header{margin-bottom:16px}.tab-count[data-v-08295b8f]{background:var(--el-fill-color);color:var(--el-text-color-secondary);vertical-align:1px;border-radius:999px;margin-left:4px;padding:0 6px;font-size:11px;line-height:16px;display:inline-block}.tab-toolbar[data-v-08295b8f]{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:8px 12px;margin-bottom:12px;display:flex}.tab-actions[data-v-08295b8f]{flex-shrink:0;align-items:center;gap:8px;display:flex}.plugin-grid[data-v-08295b8f]{grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:16px;display:grid}.plugin-card[data-v-08295b8f]{border:1px solid var(--el-border-color-light);background:var(--el-bg-color);border-radius:10px;flex-direction:column;gap:10px;padding:16px;transition:border-color .15s,box-shadow .15s;display:flex;box-shadow:0 1px 2px #00000008}.plugin-card[data-v-08295b8f]:hover{border-color:var(--el-color-primary-light-5);box-shadow:0 2px 8px #0000000f}.card-top[data-v-08295b8f]{align-items:flex-start;gap:12px;display:flex}.plugin-icon[data-v-08295b8f]{background:var(--el-color-primary-light-9);width:36px;height:36px;color:var(--el-color-primary);border-radius:10px;flex-shrink:0;justify-content:center;align-items:center;font-size:15px;font-weight:600;display:flex;overflow:hidden}.plugin-icon img[data-v-08295b8f]{object-fit:contain;width:100%;height:100%}.plugin-titles[data-v-08295b8f]{flex:1;min-width:0}.plugin-name[data-v-08295b8f]{text-overflow:ellipsis;white-space:nowrap;font-size:14px;font-weight:600;overflow:hidden}.plugin-tags[data-v-08295b8f]{flex-wrap:wrap;gap:6px;margin-top:4px;display:flex}.plugin-action[data-v-08295b8f]{flex-shrink:0}.plugin-summary[data-v-08295b8f]{color:var(--el-text-color-regular);-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical;min-height:39px;font-size:13px;line-height:1.5;display:-webkit-box;overflow:hidden}.plugin-meta[data-v-08295b8f]{color:var(--el-text-color-secondary);border-top:1px solid var(--el-border-color-lighter);flex-wrap:wrap;gap:12px;padding-top:10px;font-size:12px;display:flex}.mono[data-v-08295b8f]{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}.installed-error[data-v-08295b8f]{margin-bottom:12px}.installed-list[data-v-08295b8f]{grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:16px;display:grid}.installed-summary[data-v-08295b8f]{color:var(--el-text-color-secondary);font-size:12px}.installed-summary-ok[data-v-08295b8f]{color:var(--el-color-success)}.installed-card[data-v-08295b8f]{border:1px solid var(--el-border-color-light);background:var(--el-bg-color);border-radius:10px;flex-direction:column;gap:10px;padding:16px;transition:border-color .15s,box-shadow .15s;display:flex;box-shadow:0 1px 2px #00000008}.installed-card[data-v-08295b8f]:hover{border-color:var(--el-color-primary-light-5);box-shadow:0 2px 8px #0000000f}.installed-head[data-v-08295b8f]{flex-wrap:wrap;align-items:flex-start;gap:8px 12px;display:flex}.installed-avatar[data-v-08295b8f]{background:var(--el-color-primary-light-9);width:36px;height:36px;color:var(--el-color-primary);border-radius:10px;flex-shrink:0;justify-content:center;align-items:center;font-size:15px;font-weight:600;display:flex}.installed-identity[data-v-08295b8f]{flex:140px;min-width:0}.installed-title[data-v-08295b8f]{align-items:center;gap:8px;min-width:0;display:flex}.installed-name[data-v-08295b8f]{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--el-text-color-primary);font-size:14px;font-weight:600;overflow:hidden}.installed-version[data-v-08295b8f]{border:1px solid var(--el-border-color-light);background:var(--el-bg-color);color:var(--el-text-color-regular);border-radius:999px;flex-shrink:0;padding:0 6px;font-size:11px;line-height:16px}.installed-desc[data-v-08295b8f]{color:var(--el-text-color-regular);-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical;margin-top:4px;font-size:12px;line-height:1.5;display:-webkit-box;overflow:hidden}.installed-pkgname[data-v-08295b8f]{color:var(--el-text-color-placeholder);text-overflow:ellipsis;white-space:nowrap;margin-top:3px;font-size:11px;overflow:hidden}.installed-ops[data-v-08295b8f]{flex-shrink:0;align-items:center;gap:4px;margin-left:auto;display:flex}.installed-ops .el-button[data-v-08295b8f]{height:auto;padding:0}.installed-ops .card-more[data-v-08295b8f]{width:28px;height:28px;color:var(--el-text-color-secondary);border-radius:6px;padding:0}.installed-ops .card-more[data-v-08295b8f]:hover{color:var(--el-color-primary);background:var(--el-fill-color-darker)}.danger-text[data-v-08295b8f]{color:var(--el-color-danger)}.installed-noprovider[data-v-08295b8f]{border-top:1px solid var(--el-border-color-lighter);color:var(--el-text-color-secondary);padding-top:8px;font-size:12px}.installed-providers[data-v-08295b8f]{border-top:1px solid var(--el-border-color-lighter);padding-top:2px}.installed-provider[data-v-08295b8f]{justify-content:space-between;align-items:center;gap:12px;padding:8px 0;display:flex}.installed-provider[data-v-08295b8f]:not(:last-child){border-bottom:1px solid var(--el-border-color-lighter)}.installed-provider-info[data-v-08295b8f]{align-items:baseline;gap:8px;min-width:0;display:flex}.installed-provider-id[data-v-08295b8f]{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--el-text-color-primary);font-size:13px;overflow:hidden}.installed-provider-models[data-v-08295b8f]{color:var(--el-text-color-secondary);flex-shrink:0;font-size:12px}.installed-provider-actions[data-v-08295b8f]{flex-shrink:0;align-items:center;gap:8px;display:flex}.installed-provider-actions .el-button[data-v-08295b8f]{height:auto;padding:0}.installed-state[data-v-08295b8f]{color:var(--el-text-color-secondary);white-space:nowrap;align-items:center;gap:4px;font-size:12px;display:inline-flex}.installed-state .status-dot[data-v-08295b8f]{background:var(--el-text-color-placeholder);margin-right:0}.installed-state.is-on[data-v-08295b8f]{color:var(--el-color-success)}.installed-state.is-on .status-dot[data-v-08295b8f]{background:var(--el-color-success)}.method-list[data-v-08295b8f]{flex-direction:column;gap:8px;margin-top:12px;display:flex}.method-btn[data-v-08295b8f]{justify-content:flex-start;margin-left:0}.field-row[data-v-08295b8f]:not(:first-child){margin-top:12px}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{A as e,Et as t,F as n,Ft as r,Gt as i,H as a,I as o,L as s,M as c,N as l,Q as u,S as ee,T as d,Y as te,at as f,cn as ne,d as re,h as ie,ht as p,j as m,k as h,pn as g,rt as _,tt as v,yt as y}from"./router-HZFOsjIe.js";import{G as ae,U as oe}from"./message-C2sOagFr.js";import{t as se}from"./index-DI3uc2DE.js";import{t as b}from"./useManagerApi-CqPHDl58.js";import{n as x,t as ce}from"./providers-B3Yjaw16.js";import{t as le}from"./useToast-DrZEDnuk.js";import{a as S,c as ue,d as C,f as w,i as de,l as T,n as fe,o as pe,p as E,s as me,u as he}from"./pluginProviders-CF1xaQO3.js";y();var D=`https://raw.githubusercontent.com/magpie-community/plugins/main/registry.json`,O=[`https://gh-proxy.com/${D}`,`https://ghfast.top/${D}`,D],ge=1e4,_e=`plugin_market_cache`,ve=2,ye=216e5,be=36e5,k=[`provider`];function A(){try{let e=localStorage.getItem(_e);if(e===null)return null;let t=JSON.parse(e);if(t.version!==ve||!Array.isArray(t.entries))return null;let n=t.fetchedAt;return n===void 0||typeof n.at!=`number`?null:{version:ve,entries:t.entries.filter(P),fetchedAt:n}}catch{return null}}function j(e,t){try{let n={version:ve,entries:e,fetchedAt:t};localStorage.setItem(_e,JSON.stringify(n))}catch{}}function M(e){return typeof e==`string`&&e.trim()!==``?e.trim():null}function xe(e){if(typeof e!=`object`||!e||Array.isArray(e))return null;let t=e;return M(t.zh)??M(t.en)}function Se(e){switch(e){case`provider`:case`middleware`:case`agent`:case`tools`:case`page`:return e;default:return`provider`}}function N(e){return k.includes(e)}function P(e){if(typeof e!=`object`||!e)return!1;let t=e.kind;return typeof t==`string`&&N(t)}function F(e){let t=M(e.package);if(t===null)return null;let n=Array.isArray(e.providers)?e.providers.filter(e=>typeof e==`string`):[];return{package:t,name:M(e.name)??t,icon:M(e.icon),providers:n,community:M(e.community),summary:xe(e.summary),kind:Se(e.kind),replaces:M(e.replaces),version:null,license:null,description:null,homepage:null,weeklyDownloads:null,published:null}}var I=new Map,Ce=new Map;async function L(e){let t=I.get(e);if(t!==void 0&&Date.now()-t.at<be)return t.meta;try{let t=await C(`https://registry.npmjs.org/${encodeURIComponent(e)}`),n={version:M(t[`dist-tags`]?.latest),license:M(t.license),description:M(t.description),homepage:M(t.homepage),published:!0};return I.set(e,{at:Date.now(),meta:n}),n}catch(t){let n={version:null,license:null,description:null,homepage:null,published:E(t)!==404&&null};return n.published===!1&&I.set(e,{at:Date.now(),meta:n}),n}}async function R(e){let t=Ce.get(e);if(t!==void 0&&Date.now()-t.at<be)return t.downloads;try{let t=await C(`https://api.npmjs.org/downloads/point/last-week/${encodeURIComponent(e)}`),n=typeof t.downloads==`number`?t.downloads:null;return Ce.set(e,{at:Date.now(),downloads:n}),n}catch{return null}}async function we(){let e=[];for(let t of O)try{let e=await C(t,{timeoutMs:ge});return t!==O[0]&&x(`[plugin-market] 清单改由备用源取到:${t}`),{registry:e,source:t}}catch(n){let r=n instanceof Error?n.message:String(n);e.push(`${t} → ${r}`)}throw Error(`插件清单取不到(已试 ${String(O.length)} 个源):\n${e.join(`
|
|
2
|
-
`)}`)}async function z(e){let{registry:t,source:n}=await we(),r=t.plugins;if(!Array.isArray(r))throw Error(`清单格式不是预期形状(缺 plugins 数组):${D}`);let i=r.map(e=>typeof e==`object`&&e?F(e):null).filter(P).sort((e,t)=>e.package.localeCompare(t.package)),a=0;return await Promise.all(i.map(async t=>{let[n,r]=await Promise.all([L(t.package),R(t.package)]);Object.assign(t,n,{weeklyDownloads:r}),a+=1,e?.(a,i.length)})),{entries:i,source:n}}var B=t([]),V=t(!1),H=t(null),Te=t({loaded:0,total:0}),Ee=t(null),De=t(!1),U=null;function W(e,t){JSON.stringify(e)!==JSON.stringify(B.value)&&(B.value=e),Ee.value=t,j(e,t)}async function Oe(e={}){let t=e.force===!0,n=B.value.length===0?A():null;n!==null&&(B.value=n.entries,Ee.value=n.fetchedAt);let r=B.value.length>0,i=Ee.value,a=i!==null&&Date.now()-i.at<ye;if(!(!t&&r&&a)){if(U!==null){if(t)await U;else return}if(t||!r){V.value=!0,De.value=!1,Te.value={loaded:0,total:0};try{let e=await z((e,t)=>{Te.value={loaded:e,total:t}});W(e.entries,{source:e.source,at:Date.now()}),H.value=null}catch(e){H.value=`插件市场清单加载失败:${e instanceof Error?e.message:String(e)}`}finally{V.value=!1}return}De.value=!0,U=(async()=>{try{let e=await z();W(e.entries,{source:e.source,at:Date.now()}),H.value=null,De.value=!1}catch(e){x(`[plugin-market] 后台刷新失败,继续用缓存:${e instanceof Error?e.message:String(e)}`)}finally{U=null}})()}}function ke(){return{entries:B,loading:V,marketError:H,progress:Te,fetchedAt:Ee,stale:De,loadMarket:Oe}}async function Ae(e){let t=e.timeoutMs??2e4,n=e.intervalMs??400,r=e.now??Date.now,i=e.sleep??(e=>new Promise(t=>setTimeout(t,e))),a=r()+t;for(;;)try{return await e.probe(),!0}catch{if(r()>=a)return!1;await i(n)}}a(),y(),i(),ie();var je={class:`page-head`},Me={class:`page-head-actions`},Ne={key:0,class:`tab-count`},Pe={key:1,class:`loading-block`},Fe={key:3},Ie={class:`tab-toolbar`},Le={class:`installed-summary`},Re={class:`installed-summary-ok`},ze={class:`tab-actions`},Be={class:`installed-list`},Ve={class:`installed-head`},He={class:`installed-avatar`},Ue={class:`installed-identity`},We={class:`installed-title`},Ge=[`title`],Ke={class:`installed-version`},qe=[`title`],Je=[`title`],Ye={class:`installed-ops`},Xe={key:0,class:`installed-noprovider`},Ze={key:1,class:`installed-providers`},Qe={class:`installed-provider-info`},$e=[`title`],et={class:`installed-provider-models`},tt={class:`installed-provider-actions`},nt={key:0,class:`tab-count`},rt={class:`tab-toolbar`},it={class:`muted-sm`},at={key:0,class:`loading-block`},ot={key:2,class:`plugin-grid`},st={class:`card-top`},ct={class:`plugin-icon`},lt=[`src`,`alt`,`onError`],ut={key:1},dt={class:`plugin-titles`},ft=[`title`],pt={class:`plugin-tags`},mt={class:`plugin-action`},ht=[`title`],gt={class:`plugin-meta`},_t={key:0},vt={key:1,class:`mono`},yt={key:2,class:`muted-disabled`},bt={key:3,class:`muted-disabled`},xt={class:`method-list`},St={class:`muted-sm`},Ct={key:0,class:`muted-sm`},wt={class:`muted-sm`},Tt={class:`muted-sm`},Et={key:0,class:`mt-8`},Dt=[`href`],Ot={key:2,class:`muted-sm mt-8`},kt=5e3,At=5e3,jt=re(s({__name:`PluginsView`,setup(i){let{toast:a}=le(),s=ce(),re=t(!0),ie=t(`服务未由 ezllm 主进程托管(源码运行模式);请用 ezllm 启动服务`),y=t(!1),x=t(null),{entries:E,loading:D,marketError:O,progress:ge,fetchedAt:_e,stale:ve,loadMarket:ye}=ke(),be=t(new Set),k=t([]),A=t(null),j=t(!1),M=h(()=>{let e=k.value.flatMap(e=>e.providers);return{total:e.length,signedIn:e.filter(e=>e.signedIn).length}}),xe=e=>E.value.find(t=>t.package===e)?.name??e.replace(/^@[^/]+\//,``),Se=e=>{let t=xe(e).trim();return t===``?`?`:t.charAt(0).toUpperCase()},N=t(null),P=t(!1),F=t(``),I=t(`installed`),Ce=t(!1),L=t({}),R=t(!1),we=t(!0),z=h(()=>y.value&&x.value!==null),B=e=>k.value.some(t=>t.package===e.package),V=h(()=>E.value.filter(e=>!B(e))),H=e=>e.icon===null||be.value.has(e.package)?null:/^https?:\/\//i.test(e.icon)?e.icon:null,Te=e=>e.icon!==null&&!/^https?:\/\//i.test(e.icon)?e.icon:(e.name.charAt(0)||`?`).toUpperCase(),Ee=e=>{be.value=new Set(be.value).add(e.package)},De=e=>e>=1e3?`${(e/1e3).toFixed(e>=1e4?0:1)}k`:String(e),U=async()=>{try{let e=await b.plugins();re.value=!0,y.value=e.running,x.value=e.port}catch(e){if(typeof e?.message==`string`&&e.message.includes(`未由 ezllm 主进程托管`)){re.value=!1,ie.value=e.message,y.value=!1,x.value=null;return}throw e}},W=async()=>{if(!z.value){k.value=[],A.value=null,j.value=!1;return}let e=x.value;if(e!==null){j.value=!0;try{let t=await C(T(e,`/packages`));k.value=Array.isArray(t.packages)?t.packages:[],A.value=null}catch(e){k.value=[],A.value=`无法读取已装插件(插件服务可能正在重启):${e?.message??`请求失败`}`}finally{j.value=!1}}},Oe=e=>{let t=Math.floor((Date.now()-e)/6e4);if(t<1)return`刚刚`;if(t<60)return`${String(t)} 分钟前`;let n=Math.floor(t/60);return n<24?`${String(n)} 小时前`:new Date(e).toLocaleDateString()},jt=h(()=>{if(D.value)return`正在加载 ${String(ge.value.loaded)}/${String(ge.value.total)}…`;let e=_e.value===null?``:Oe(_e.value.at),t=e===``?``:` · ${e}更新`,n=ve.value?` · 更新中…`:``;return`清单 ${String(E.value.length)} 个 · 已装 ${String(k.value.length)} 个${t}${n}`}),Mt=async(e=!1)=>{await ye({force:e})},Nt=async()=>{try{await U()}catch{}await Promise.all([W(),Mt(!0)])},Pt=async()=>{try{await U()}catch(e){O.value=e?.message??`插件服务状态加载失败`;return}await W(),await Mt(),G()},Ft=t(!1),It=async e=>{let t=await C(T(e,`/plugins`));return Array.isArray(t.providers)?t.providers:[]},Lt=async(e,t)=>{try{let n=await C(`${pe(t,e)}/v1/models`,{timeoutMs:kt}),r=(n.data??[]).map(e=>typeof e.id==`string`?e.id.trim():``).filter(e=>e!==``);return{fromHook:n.fromHook===!0,ids:r}}catch{return null}},Rt=async()=>{let e=x.value;if(z.value&&e!==null){Ft.value=!0;try{await s.loadProviders();let t=await It(e),n=S(s.suppliers,t,e),r=t.filter(e=>e.protocol!==null&&n.providers.filter(t=>me(t.apiBase)===e.id).some(t=>fe(t,e))),i=new Map;await Promise.all(r.map(async t=>{let n=await Lt(t.id,e);n!==null&&i.set(t.id,n)}));let o=de(n.providers,t,i);if(n.added.length===0&&n.updated.length===0&&o.refreshed.length===0)return;await s.mutateProviders(n=>{let r=S(n,t,e);return de(r.providers,t,i).providers});let c=[];n.added.length>0&&c.push(`新增 ${String(n.added.length)} 个供应商`),n.updated.length>0&&c.push(`修正 ${String(n.updated.length)} 个供应商`),o.refreshed.length>0&&c.push(`刷新 ${String(o.refreshed.length)} 个供应商的模型清单`),a(`已接入网关:${c.join(`、`)}`,`success`)}catch(e){a(e?.message??`供应商配置同步失败`,`error`)}finally{Ft.value=!1}}},zt=null,G=()=>(zt===null&&(zt=Rt().finally(()=>{zt=null})),zt),Bt=e=>Ae({probe:()=>C(T(e,`/health`),{timeoutMs:2e3})}),Vt=async()=>{try{let e=await b.plugins();return{pid:e.pid,startedAt:e.startedAt}}catch{return null}},Ht=(e,t)=>!(e.pid!==null&&t.pid!==null&&e.pid!==t.pid||e.startedAt!==null&&t.startedAt!==null&&e.startedAt!==t.startedAt),Ut=(e,t,n)=>Ae({timeoutMs:n,probe:async()=>{let n=await b.plugins();if(!n.running||n.port!==e||Ht(t,{pid:n.pid,startedAt:n.startedAt}))throw Error(`宿主尚未完成重启`)}}),Wt=async(e,t)=>(t!==null&&await Ut(e,t,At),await Bt(e)),Gt=async(e,t)=>await Wt(e,t)?(await W(),!0):(A.value=`插件服务未确认完成重启,请稍后点「刷新」或重新打开本页`,!1),Kt=async(e,t)=>{try{let n=e;try{let e=await b.plugins();if(t!==null&&e.running&&!Ht(t,{pid:e.pid,startedAt:e.startedAt}))y.value=e.running,x.value=e.port,n=e.port;else{let e=await b.restartPlugins();y.value=e.running,x.value=e.port,n=e.port}}catch{let e=await b.restartPlugins();y.value=e.running,x.value=e.port,n=e.port}return await Gt(n,t)}catch(e){return A.value=`插件服务重启失败:${e?.message??`请求失败`}`,!1}},qt=async e=>{await Yt(e.package)},Jt=async()=>{let e=F.value.trim();if(e!==``){Ce.value=!0;try{await Yt(e),P.value=!1,F.value=``}finally{Ce.value=!1}}},Yt=async e=>{let t=x.value;if(t===null){a(`插件服务未开启`,`error`);return}N.value=e;try{let n=await Vt(),r=await w(T(t,`/packages`),{package:e}),i=r.restartRequested!==!0||await Kt(t,n);r.restartRequested!==!0&&await W(),r.loaded===!1?a(`${e} 已安装但未加载成功(重启插件服务或查看日志)`,`warning`):i?a(`已安装 ${e}`,`success`):a(`${e} 已安装,但未能确认插件服务已完成重启;稍后刷新即可`,`warning`),i&&await G()}catch(e){a(e?.message??`安装失败`,`error`)}finally{N.value=null}},Xt=async e=>{let t=x.value;if(t===null)return;let n=[];try{await s.loadProviders(),n=ue(s.suppliers,e.providers.map(e=>e.id))}catch{}let r=n.length===0?``:`网关里对应的供应商(${n.join(`、`)})也会一并移除。`;try{await se.confirm(`确定卸载 ${e.package}?该插件提供的模型将不可用。${r}`,`确认卸载`,{confirmButtonText:`卸载`,cancelButtonText:`取消`,type:`warning`})}catch{return}N.value=e.package;try{let r=await Vt(),i=await he(T(t,`/packages/${encodeURIComponent(e.package)}`));n.length>0&&await s.mutateProviders(e=>e.filter(e=>!n.includes(e.name))),a(`已卸载 ${e.package}`,`success`),i.restartRequested===!0?await Kt(t,r)||a(`插件服务未确认完成重启;稍后刷新即可`,`warning`):await W()}catch(e){a(e?.message??`卸载失败`,`error`)}finally{N.value=null}},Zt=(e,t)=>{e===`uninstall`&&Xt(t)},Qt=()=>{F.value=``,P.value=!0},$t=h(()=>z.value?we.value?`检查已装插件是否有新版本`:`宿主当前无法检查更新`:`插件服务未开启`),en=e=>{let t=L.value[e];return t&&t.updateAvailable&&t.latest?t.latest:null},tn=async(e=!1)=>{let t=x.value;if(t===null){e||a(`插件服务未开启`,`error`);return}R.value=!0;try{let n=await C(T(t,`/packages/updates`)),r=Array.isArray(n.packages)?n.packages:[];we.value=n.canCheck;let i={};for(let e of r)i[e.package]=e;if(L.value=i,e)return;if(!n.canCheck){a(`宿主当前无法检查更新`,`warning`);return}let o=r.filter(e=>e.updateAvailable).length;a(o>0?`发现 ${String(o)} 个插件有新版本`:`全部插件已是最新`,`success`)}catch(t){e||a(t?.message??`检查更新失败`,`error`)}finally{R.value=!1}},nn=async e=>{let t=x.value,n=L.value[e]?.latest;if(t===null){a(`插件服务未开启`,`error`);return}if(n!=null){N.value=e;try{let r=await Vt();if(await w(T(t,`/packages`),{package:e,version:n}),delete L.value[e],!await Kt(t,r)){a(`已更新到 ${n},但未能确认插件服务已完成重启;稍后刷新即可`,`warning`);return}a(`已更新到 ${n} 并重启插件服务`,`success`),await G(),await tn(!0)}catch(e){a(e?.message??`更新失败`,`error`)}finally{N.value=null}}},rn=t(null),an=t(!1),on=t(``),sn=t([]),K=t(!1),cn=t(``),q=t(``),ln=t(``),J=t(null),Y=t(!1),un=t(``),dn=t(``),fn=t(``),pn=t(``),mn=t(void 0),hn=t({}),X=t(null),gn=t(!1),Z=t(!1),_n=t(``),vn=t([]),Q=t({}),yn=t(void 0),bn=t(null),xn=t(!1),$=new Map,Sn=!1,Cn=e=>{$.set(e,($.get(e)??0)+1)};te(()=>{Sn=!0,$.clear()});let wn=(e,t)=>{q.value!==``&&q.value!==e&&Cn(q.value),q.value=e,cn.value=t.url??``,ln.value=t.instructions??``,J.value=null,K.value=!0},Tn=async e=>{let t=x.value;if(t===null)return;let n=($.get(e)??0)+1;$.set(e,n);let r=()=>!Sn&&$.get(e)===n,i=Date.now()+18e4;for(;;){if(await new Promise(e=>setTimeout(e,2e3)),!r())return;let n;try{n=await C(T(t,`/login/${encodeURIComponent(e)}`))}catch(t){r()&&q.value===e&&(J.value=t?.message??`查询登录状态失败`);return}if(!r())return;if(n.state===`success`){q.value===e&&(K.value=!1),a(`已登录${n.accountId?`(${n.accountId})`:``}`,`success`),await W(),await G();return}if(n.state===`failed`){q.value===e&&(J.value=n.error??`登录失败`);return}if(Date.now()>i){q.value===e&&(J.value=`等待超时,可关闭后重新点击「登录」`);return}}},En=async(e,t,n,r)=>{let i=x.value;if(i===null){a(`插件服务未开启`,`error`);return}Cn(e);let o={};t!==void 0&&(o.method=t),Object.keys(n).length>0&&(o.inputs=n),r!==void 0&&r!==``&&(o.key=r);let s=await w(T(i,`/login/${encodeURIComponent(e)}`),o);if(s.needMethod===!0){on.value=e,sn.value=s.methods,an.value=!0;return}if(s.needInputs!==void 0&&s.needInputs.length>0){Y.value=!1,_n.value=e,yn.value=t,vn.value=s.needInputs;let r={...s.inputs??n};for(let e of s.needInputs)r[e.key]=r[e.key]??``;Q.value=r,bn.value=null,Z.value=!0;return}if(s.needKey===!0){Z.value=!1,un.value=e,mn.value=t,dn.value=s.label??``,fn.value=s.placeholder??``,hn.value={...s.inputs??n},pn.value=``,X.value=null,Y.value=!0;return}if(s.state===`success`){Z.value=!1,Y.value=!1,a(`已登录${s.accountId?`(${s.accountId})`:``}`,`success`),await W(),await G();return}if(s.state===`failed`){let e=s.error??`登录失败`;if(Y.value){X.value=e;return}if(Z.value){bn.value=e;return}a(e,`error`);return}Z.value=!1,Y.value=!1,wn(e,s),Tn(e)},Dn=async(e,t)=>{rn.value=e;try{await En(e,t,{})}catch(e){a(e?.message??`发起登录失败`,`error`)}finally{rn.value=null}},On=t(null),kn=async e=>{let t=x.value;if(t===null){a(`插件服务未开启`,`error`);return}try{await se.confirm(`确定退出 ${e.id} 的登录?本机保存的凭据会被删除,该供应商的模型将立即不可用(插件与网关配置保留)。`,`确认退出登录`,{confirmButtonText:`退出登录`,cancelButtonText:`取消`,type:`warning`})}catch{return}Cn(e.id),q.value===e.id&&(K.value=!1),On.value=e.id;try{await he(T(t,`/login/${encodeURIComponent(e.id)}`)),a(`已退出 ${e.id} 的登录`,`success`),await W()}catch(e){let t=String(e?.message??``);a(t.includes(`405`)?`当前插件服务版本不支持退出登录,请先升级 ezllm`:e?.message??`退出登录失败`,`error`)}finally{On.value=null}},An=async e=>{an.value=!1,await Dn(on.value,e)},jn=async()=>{xn.value=!0;try{await En(_n.value,yn.value,{...Q.value})}catch(e){bn.value=e?.message??`提交失败`}finally{xn.value=!1}},Mn=async()=>{if(pn.value.trim()===``){X.value=`请填写密钥`;return}gn.value=!0,X.value=null;try{await En(un.value,mn.value,{...hn.value},pn.value)}catch(e){X.value=e?.message??`提交失败`}finally{gn.value=!1}};return u(Pt),(t,i)=>{let a=f(`el-icon`),s=f(`el-button`),u=f(`el-alert`),te=f(`el-empty`),h=f(`el-tag`),se=f(`el-dropdown-item`),b=f(`el-dropdown-menu`),x=f(`el-dropdown`),ce=f(`el-tab-pane`),le=f(`el-tabs`),S=f(`el-input`),ue=f(`el-form-item`),C=f(`el-form`),w=f(`el-dialog`),de=f(`el-option`),T=f(`el-select`);return v(),l(`div`,null,[e(`div`,je,[i[20]||=e(`div`,null,[e(`div`,{class:`page-head-title`},`插件`),e(`div`,{class:`page-head-sub`},` 订阅社区 OpenCode 插件——把订阅账号(CodeBuddy、智谱 Coding Plan 等)当作供应商接入网关 `)],-1),e(`div`,Me,[o(s,{disabled:!y.value,onClick:Qt},{default:p(()=>[o(a,null,{default:p(()=>[o(r(ae))]),_:1}),i[18]||=n(` 手动安装 `,-1)]),_:1},8,[`disabled`]),o(s,{loading:r(D),onClick:Nt},{default:p(()=>[...i[19]||=[n(`刷新`,-1)]]),_:1},8,[`loading`])])]),re.value?y.value?c(``,!0):(v(),m(u,{key:1,type:`info`,"show-icon":``,closable:!1,class:`mb-16`,title:`插件服务未运行`},{default:p(()=>[...i[21]||=[e(`div`,{class:`muted-sm`},` 插件服务与设置页「显示插件入口」共用同一配置:开关开启时随服务启动自动拉起。如仍不可用,请查看日志或重启服务。 `,-1)]]),_:1})):(v(),m(u,{key:0,type:`warning`,"show-icon":``,closable:!1,class:`mb-16`,title:`插件服务不可用`},{default:p(()=>[n(g(ie.value),1)]),_:1})),r(O)?(v(),m(u,{key:2,type:`error`,"show-icon":``,closable:!1,class:`mb-16`,title:r(O)},{default:p(()=>[o(s,{size:`small`,onClick:Mt},{default:p(()=>[...i[22]||=[n(`重试`,-1)]]),_:1})]),_:1},8,[`title`])):c(``,!0),o(le,{modelValue:I.value,"onUpdate:modelValue":i[4]||=e=>I.value=e,class:`plugin-tabs`},{default:p(()=>[o(ce,{name:`installed`},{label:p(()=>[i[23]||=n(` 已安装 `,-1),k.value.length>0?(v(),l(`span`,Ne,g(k.value.length),1)):c(``,!0)]),default:p(()=>[A.value?(v(),m(u,{key:0,type:`warning`,"show-icon":``,closable:!1,class:`installed-error`,title:A.value},null,8,[`title`])):c(``,!0),j.value&&k.value.length===0?(v(),l(`div`,Pe,`正在读取已装插件…`)):k.value.length===0&&!A.value?(v(),m(te,{key:2,description:`尚未安装任何插件`,"image-size":80},{default:p(()=>[o(s,{type:`primary`,onClick:i[0]||=e=>I.value=`market`},{default:p(()=>[n(g(z.value?`去安装插件`:`查看插件清单`),1)]),_:1})]),_:1})):c(``,!0),k.value.length>0?(v(),l(`div`,Fe,[e(`div`,Ie,[e(`span`,Le,[n(g(k.value.length)+` 个插件 · `+g(M.value.total)+` 个供应商 · `,1),e(`span`,Re,g(M.value.signedIn)+` 个已登录`,1)]),e(`div`,ze,[o(s,{size:`small`,disabled:!z.value||Ft.value,loading:Ft.value,title:`把宿主已加载的插件供应商补进网关配置:缺的整条新增,已在的只修地址/协议(模型清单保持你的选择)`,onClick:G},{default:p(()=>[...i[24]||=[n(`接入网关`,-1)]]),_:1},8,[`disabled`,`loading`]),o(s,{size:`small`,disabled:!z.value||!we.value||N.value!==null,loading:R.value,title:$t.value,onClick:i[1]||=e=>tn()},{default:p(()=>[...i[25]||=[n(`检查更新`,-1)]]),_:1},8,[`disabled`,`loading`,`title`])])]),e(`div`,Be,[(v(!0),l(d,null,_(k.value,t=>(v(),l(`div`,{key:t.package,class:`installed-card`},[e(`div`,Ve,[e(`div`,He,g(Se(t.package)),1),e(`div`,Ue,[e(`div`,We,[e(`span`,{class:`installed-name`,title:t.package},g(xe(t.package)),9,Ge),e(`span`,Ke,`v`+g(t.version||`-`),1),t.loaded?c(``,!0):(v(),m(h,{key:0,type:`danger`,size:`small`,"disable-transitions":``},{default:p(()=>[...i[26]||=[n(`加载失败`,-1)]]),_:1}))]),t.description?(v(),l(`div`,{key:0,class:`installed-desc`,title:t.description},g(t.description),9,qe)):c(``,!0),xe(t.package)===t.package?c(``,!0):(v(),l(`div`,{key:1,class:`mono installed-pkgname`,title:t.package},g(t.package),9,Je))]),e(`div`,Ye,[en(t.package)?(v(),m(s,{key:0,link:``,type:`primary`,size:`small`,disabled:N.value!==null||R.value,loading:N.value===t.package,onClick:e=>nn(t.package)},{default:p(()=>[n(`更新到 `+g(en(t.package)),1)]),_:2},1032,[`disabled`,`loading`,`onClick`])):c(``,!0),o(x,{trigger:`click`,placement:`bottom-end`,onCommand:e=>Zt(e,t)},{dropdown:p(()=>[o(b,null,{default:p(()=>[o(se,{command:`uninstall`,disabled:N.value!==null},{default:p(()=>[...i[27]||=[e(`span`,{class:`danger-text`},`卸载插件`,-1)]]),_:1},8,[`disabled`])]),_:1})]),default:p(()=>[o(s,{link:``,size:`small`,class:`card-more`,title:`更多操作`},{default:p(()=>[o(a,null,{default:p(()=>[o(r(oe))]),_:1})]),_:1})]),_:1},8,[`onCommand`])])]),t.providers.length?(v(),l(`div`,Ze,[(v(!0),l(d,null,_(t.providers,t=>(v(),l(`div`,{key:t.id,class:`installed-provider`},[e(`div`,Qe,[e(`span`,{class:`mono installed-provider-id`,title:t.id},g(t.id),9,$e),e(`span`,et,g(t.models)+` 个模型`,1)]),e(`div`,tt,[e(`span`,{class:ne([`installed-state`,{"is-on":t.signedIn}])},[e(`span`,{class:ne([`status-dot`,{running:t.signedIn}])},null,2),e(`span`,null,g(t.signedIn?`已登录`:t.needsLogin===!1?`无需登录`:`未登录`),1)],2),t.signedIn?(v(),m(s,{key:0,link:``,size:`small`,loading:On.value===t.id,onClick:e=>kn(t)},{default:p(()=>[...i[28]||=[n(`退出登录`,-1)]]),_:1},8,[`loading`,`onClick`])):t.needsLogin===!1?c(``,!0):(v(),m(s,{key:1,link:``,type:`primary`,size:`small`,loading:rn.value===t.id,onClick:e=>Dn(t.id)},{default:p(()=>[...i[29]||=[n(`登录`,-1)]]),_:1},8,[`loading`,`onClick`]))])]))),128))])):(v(),l(`div`,Xe,`未声明可用的供应商`))]))),128))])])):c(``,!0)]),_:1}),o(ce,{name:`market`,lazy:``},{label:p(()=>[i[30]||=n(` 未安装 `,-1),V.value.length>0?(v(),l(`span`,nt,g(V.value.length),1)):c(``,!0)]),default:p(()=>[e(`div`,rt,[e(`span`,it,g(jt.value),1)]),r(D)&&r(E).length===0?(v(),l(`div`,at,`正在从社区清单加载…`)):V.value.length===0?(v(),m(te,{key:1,description:r(E).length===0?`清单里没有本宿主支持的插件`:`社区清单里的插件都已安装`,"image-size":80},{default:p(()=>[r(E).length===0?(v(),m(s,{key:0,loading:r(D),onClick:i[2]||=e=>Mt(!0)},{default:p(()=>[...i[31]||=[n(`刷新清单`,-1)]]),_:1},8,[`loading`])):(v(),m(s,{key:1,onClick:i[3]||=e=>I.value=`installed`},{default:p(()=>[...i[32]||=[n(`查看已安装`,-1)]]),_:1}))]),_:1},8,[`description`])):(v(),l(`div`,ot,[(v(!0),l(d,null,_(V.value,t=>(v(),l(`div`,{key:t.package,class:`plugin-card`},[e(`div`,st,[e(`div`,ct,[H(t)?(v(),l(`img`,{key:0,src:H(t),alt:t.name,onError:e=>Ee(t)},null,40,lt)):(v(),l(`span`,ut,g(Te(t)),1))]),e(`div`,dt,[e(`div`,{class:`plugin-name`,title:t.name},g(t.name),9,ft),e(`div`,pt,[t.community?(v(),m(h,{key:0,size:`small`,type:`info`,"disable-transitions":``},{default:p(()=>[n(g(t.community),1)]),_:2},1024)):c(``,!0)])]),e(`div`,mt,[o(s,{type:`primary`,size:`small`,disabled:!z.value||N.value===t.package||t.published===!1,loading:N.value===t.package,title:t.published===!1?`该包在 npm 上不存在(可能是清单条目尚未发布)`:void 0,onClick:e=>qt(t)},{default:p(()=>[...i[33]||=[n(` 安装 `,-1)]]),_:1},8,[`disabled`,`loading`,`title`,`onClick`])])]),e(`div`,{class:`plugin-summary`,title:t.summary??``},g(t.summary??`(清单未提供简介)`),9,ht),e(`div`,gt,[e(`span`,null,`供应商 `+g(t.providers.length),1),t.weeklyDownloads===null?c(``,!0):(v(),l(`span`,_t,g(De(t.weeklyDownloads))+`/周`,1)),t.version?(v(),l(`span`,vt,`v`+g(t.version),1)):t.published===!1?(v(),l(`span`,yt,`npm 上不存在`)):(v(),l(`span`,bt,`版本未知`))])]))),128))]))]),_:1})]),_:1},8,[`modelValue`]),o(w,{modelValue:P.value,"onUpdate:modelValue":i[7]||=e=>P.value=e,title:`手动安装插件`,width:`520px`},{footer:p(()=>[o(s,{onClick:i[6]||=e=>P.value=!1},{default:p(()=>[...i[35]||=[n(`取消`,-1)]]),_:1}),o(s,{type:`primary`,loading:Ce.value,disabled:F.value.trim()===``,onClick:Jt},{default:p(()=>[...i[36]||=[n(` 安装 `,-1)]]),_:1},8,[`loading`,`disabled`])]),default:p(()=>[o(C,{"label-position":`top`},{default:p(()=>[o(ue,{label:`npm 包名`},{default:p(()=>[o(S,{modelValue:F.value,"onUpdate:modelValue":i[5]||=e=>F.value=e,placeholder:`例:@magpie-community/opencode-workbuddy-auth`,clearable:``},null,8,[`modelValue`]),i[34]||=e(`div`,{class:`muted-sm`},[n(`可带版本(`),e(`span`,{class:`mono`},`name@1.2.3`),n(`);清单加载不出来时用这个。`)],-1)]),_:1})]),_:1})]),_:1},8,[`modelValue`]),o(w,{modelValue:an.value,"onUpdate:modelValue":i[9]||=e=>an.value=e,title:`选择登录方式`,width:`460px`},{footer:p(()=>[o(s,{onClick:i[8]||=e=>an.value=!1},{default:p(()=>[...i[37]||=[n(`取消`,-1)]]),_:1})]),default:p(()=>[i[38]||=e(`div`,{class:`muted-sm`},`该插件提供多种登录方式,选一种:`,-1),e(`div`,xt,[(v(!0),l(d,null,_(sn.value,e=>(v(),m(s,{key:e.label,class:`method-btn`,onClick:t=>An(e.label)},{default:p(()=>[n(g(e.label||e.type),1)]),_:2},1032,[`onClick`]))),128))])]),_:1},8,[`modelValue`]),o(w,{modelValue:Z.value,"onUpdate:modelValue":i[11]||=e=>Z.value=e,title:`登录 ${_n.value}`,width:`480px`},{footer:p(()=>[o(s,{onClick:i[10]||=e=>Z.value=!1},{default:p(()=>[...i[39]||=[n(`取消`,-1)]]),_:1}),o(s,{type:`primary`,loading:xn.value,onClick:jn},{default:p(()=>[...i[40]||=[n(`确定`,-1)]]),_:1},8,[`loading`])]),default:p(()=>[(v(!0),l(d,null,_(vn.value,t=>(v(),l(`div`,{key:t.key,class:`field-row`},[e(`div`,St,g(t.message||t.key),1),t.type===`select`?(v(),m(T,{key:0,modelValue:Q.value[t.key],"onUpdate:modelValue":e=>Q.value[t.key]=e,class:`mt-8`,placeholder:`请选择`,style:{width:`100%`}},{default:p(()=>[(v(!0),l(d,null,_(t.options,t=>(v(),m(de,{key:t.value,label:t.label??t.value,value:t.value??``},{default:p(()=>[e(`span`,null,g(t.label??t.value),1),t.hint?(v(),l(`span`,Ct,`(`+g(t.hint)+`)`,1)):c(``,!0)]),_:2},1032,[`label`,`value`]))),128))]),_:2},1032,[`modelValue`,`onUpdate:modelValue`])):(v(),m(S,{key:1,modelValue:Q.value[t.key],"onUpdate:modelValue":e=>Q.value[t.key]=e,class:`mt-8`,placeholder:t.placeholder||``,onKeyup:ee(jn,[`enter`])},null,8,[`modelValue`,`onUpdate:modelValue`,`placeholder`]))]))),128)),bn.value?(v(),m(u,{key:0,type:`error`,"show-icon":``,closable:!1,class:`mt-8`,title:bn.value},null,8,[`title`])):c(``,!0)]),_:1},8,[`modelValue`,`title`]),o(w,{modelValue:Y.value,"onUpdate:modelValue":i[14]||=e=>Y.value=e,title:`登录 ${un.value}`,width:`480px`},{footer:p(()=>[o(s,{onClick:i[13]||=e=>Y.value=!1},{default:p(()=>[...i[41]||=[n(`取消`,-1)]]),_:1}),o(s,{type:`primary`,loading:gn.value,onClick:Mn},{default:p(()=>[...i[42]||=[n(`确定`,-1)]]),_:1},8,[`loading`])]),default:p(()=>[e(`div`,wt,g(dn.value||`该登录方式需要一枚密钥`),1),o(S,{modelValue:pn.value,"onUpdate:modelValue":i[12]||=e=>pn.value=e,class:`mt-8`,placeholder:fn.value||`粘贴密钥`,"show-password":``,onKeyup:ee(Mn,[`enter`])},null,8,[`modelValue`,`placeholder`]),X.value?(v(),m(u,{key:0,type:`error`,"show-icon":``,closable:!1,class:`mt-8`,title:X.value},null,8,[`title`])):c(``,!0)]),_:1},8,[`modelValue`,`title`]),o(w,{modelValue:K.value,"onUpdate:modelValue":i[16]||=e=>K.value=e,title:`登录 ${q.value}`,width:`480px`,onClose:i[17]||=e=>Cn(q.value)},{footer:p(()=>[o(s,{onClick:i[15]||=e=>K.value=!1},{default:p(()=>[...i[44]||=[n(`关闭`,-1)]]),_:1})]),default:p(()=>[e(`div`,Tt,g(ln.value||`正在读取本机已登录的凭据…`),1),cn.value?(v(),l(`div`,Et,[e(`a`,{class:`el-button el-button--primary`,href:cn.value,target:`_blank`,rel:`noopener`},` 打开登录页 `,8,Dt),i[43]||=e(`div`,{class:`muted-sm mt-8`},`在打开的页面完成登录即可,本页会自动检测(最长等待几分钟)。`,-1)])):c(``,!0),J.value?(v(),m(u,{key:1,type:`error`,"show-icon":``,closable:!1,class:`mt-8`,title:J.value},null,8,[`title`])):(v(),l(`div`,Ot,`等待登录完成…`))]),_:1},8,[`modelValue`,`title`])])}}}),[[`__scopeId`,`data-v-08295b8f`]]);export{jt as default};
|
|
@@ -1 +0,0 @@
|
|
|
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-04418493]{cursor:grab;min-width:0;transition:box-shadow .2s,border-color .2s}.provider-card[data-v-04418493] .el-card__header{padding-bottom:10px}.provider-card[data-v-04418493] .el-card__body{padding-top:12px}.provider-card[data-v-04418493]:hover{border-color:var(--el-color-primary-light-5);box-shadow:var(--ez-card-shadow-hover)}.provider-card.dragging[data-v-04418493]{cursor:grabbing}.provider-card.is-disabled[data-v-04418493]{background:#fafafa}.provider-card.is-disabled .provider-name[data-v-04418493]{color:#a8abb2}.provider-card.is-disabled[data-v-04418493] .el-card__header{background:#fafafa}.card-header-right[data-v-04418493]{flex-shrink:0;align-items:center;gap:10px;display:flex}.header-switch[data-v-04418493]{cursor:auto;align-items:center;display:flex}.header-switch[data-v-04418493] .el-switch{cursor:pointer}.card-header[data-v-04418493]{justify-content:space-between;align-items:center;gap:12px;display:flex}.card-title[data-v-04418493]{align-items:center;gap:8px;min-width:0;display:flex}.provider-name[data-v-04418493]{color:#303133;text-overflow:ellipsis;white-space:nowrap;font-size:15px;font-weight:600;overflow:hidden}.plugin-auth-tag[data-v-04418493]{cursor:pointer}.plugin-auth-tag[data-v-04418493]:focus-visible,.model-tag[data-v-04418493]:focus-visible{outline:2px solid var(--el-color-primary);outline-offset:1px}.card-actions[data-v-04418493]{cursor:auto;flex-shrink:0;gap:0;display:flex}.model-tags[data-v-04418493]{flex-wrap:nowrap;gap:6px;margin-top:10px;display:flex;overflow:hidden;-webkit-mask-image:linear-gradient(90deg,#000 calc(100% - 24px),#0000);mask-image:linear-gradient(90deg,#000 calc(100% - 24px),#0000)}.model-tag[data-v-04418493]{color:#606266;cursor:pointer;text-overflow:ellipsis;white-space:nowrap;background:#f5f7fa;border:1px solid #0000;border-radius:999px;flex:none;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-04418493]:hover{color:#3b82f6;background:#eff6ff}.model-tag.ok[data-v-04418493]{color:#16a34a;background:#f0fdf4}.model-tag.error[data-v-04418493]{color:#dc2626;background:#fef2f2}.model-tag.off[data-v-04418493]{color:#a8abb2;background:#f5f7fa;border-color:#e4e7ed}.badge-mark[data-v-04418493]{margin-left:3px}.card-footer[data-v-04418493]{border-top:1px solid #f0f2f5;justify-content:space-between;align-items:center;margin-top:14px;padding-top:12px;display:flex}.model-count[data-v-04418493]{color:#16a34a;cursor:pointer;border-radius:4px;font-size:13px;font-weight:500}.model-count[data-v-04418493]:hover{text-decoration:underline}.drag-hint-icon[data-v-04418493]{color:#c0c4cc;cursor:grab;flex-shrink:0}.drag-hint-icon[data-v-04418493]:hover{color:#909399}.el-dropdown-menu__item.danger-item[data-v-04418493]{color:var(--el-color-danger)}.el-dropdown-menu__item.danger-item[data-v-04418493]:hover,.el-dropdown-menu__item.danger-item[data-v-04418493]:focus{color:var(--el-color-danger);background-color:#fef2f2}.dropdown[data-v-04418493]{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-a99a9e34]{flex-shrink:0;width:400px}.test-result-link[data-v-a99a9e34]{font-size:12px}.col-help[data-v-a99a9e34]{margin-right:4px}.dialog-body[data-v-136abedc]{max-height:80vh;padding-bottom:100px;overflow:hidden auto}.test-ok-text[data-v-136abedc]{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-136abedc]{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-136abedc]{line-height:1.8}.label-inline-toggle[data-v-136abedc]{align-items:center;gap:6px;margin-left:8px;display:inline-flex}.models-dialog-body[data-v-03259bbf]{flex-direction:column;height:calc(94vh - 100px);display:flex}.models-dialog-body .models-table[data-v-03259bbf]{flex:1;min-height:0}.models-toolbar[data-v-03259bbf]{flex-wrap:wrap;align-items:center;gap:8px 12px;margin-bottom:8px;display:flex}.models-search[data-v-03259bbf]{flex-shrink:0;width:280px}.models-filter-count[data-v-03259bbf]{white-space:nowrap}.models-bulk-actions[data-v-03259bbf]{gap:8px;margin-left:auto;display:flex}.error-tag[data-v-03259bbf]{text-overflow:ellipsis;white-space:nowrap;max-width:100px;overflow:hidden}.model-time[data-v-03259bbf]{text-overflow:ellipsis;white-space:nowrap;vertical-align:middle;max-width:100%;display:inline-block;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-56b77d4f]{opacity:.4}.provider-tabs[data-v-56b77d4f] .el-tabs__header{margin-bottom:20px}.provider-grid[data-v-56b77d4f]{grid-template-columns:repeat(2,1fr);gap:16px;display:grid}@media (width<=992px){.provider-grid[data-v-56b77d4f]{grid-template-columns:1fr}}
|