ezllm 0.0.39 → 0.0.40

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.
Files changed (32) hide show
  1. package/README.md +2 -2
  2. package/dist/cli.js +22 -22
  3. package/dist/daemon.js +3 -3
  4. package/dist/plugin-host.js +3 -3
  5. package/dist/server.js +65 -65
  6. package/dist/web-ui/assets/{DashboardView-STI4Bkxw.js → DashboardView-C0baZH6c.js} +1 -1
  7. package/dist/web-ui/assets/{LayoutView-DHXc1jcz.js → LayoutView-BMNKjFyW.js} +1 -1
  8. package/dist/web-ui/assets/{LoginView-CwH6eISd.js → LoginView-C3CW0urr.js} +1 -1
  9. package/dist/web-ui/assets/{LogsView-CGgzVbGZ.js → LogsView-C70vgFde.js} +1 -1
  10. package/dist/web-ui/assets/{ManagedServicesView-BvzeGhcb.js → ManagedServicesView-dC-MR3OW.js} +1 -1
  11. package/dist/web-ui/assets/PluginsView-B7CeBD8Q.js +2 -0
  12. package/dist/web-ui/assets/PluginsView-ggYmqCJ8.css +1 -0
  13. package/dist/web-ui/assets/ProvidersView-B8l3DcZY.js +14 -0
  14. package/dist/web-ui/assets/{ProvidersView-BpBOF4eX.css → ProvidersView-BSFjmX9y.css} +1 -1
  15. package/dist/web-ui/assets/{ServiceStatusView-BvuFCgT-.js → ServiceStatusView-DpGDJHh9.js} +1 -1
  16. package/dist/web-ui/assets/{SettingsView-W9bjQ9ly.js → SettingsView-CqUrHj3w.js} +1 -1
  17. package/dist/web-ui/assets/{SetupView-D5KYolFQ.js → SetupView-B_hE_Uhm.js} +1 -1
  18. package/dist/web-ui/assets/{config-CX31TfJ4.js → config-IC8ZbooF.js} +1 -1
  19. package/dist/web-ui/assets/{index-D6ydfwRk.js → index-D2JhqxaS.js} +1 -1
  20. package/dist/web-ui/assets/{message-B022-tc2.js → message-Cp_GAwQs.js} +1 -1
  21. package/dist/web-ui/assets/{providers-C6QKdfzy.js → providers-BwuaO9o9.js} +1 -1
  22. package/dist/web-ui/assets/{router-Daxct41S.js → router-BzfmTCjF.js} +2 -2
  23. package/dist/web-ui/assets/{useCopyToast-0dz9T4-H.js → useCopyToast-BpTqycuM.js} +1 -1
  24. package/dist/web-ui/assets/{useManagerApi-DdgACgsq.js → useManagerApi-lFkQleJX.js} +1 -1
  25. package/dist/web-ui/assets/{useQuickRangeFilter-D8oTOMUp.js → useQuickRangeFilter-DmQyTw4A.js} +1 -1
  26. package/dist/web-ui/assets/useToast-D3xB24vj.js +1 -0
  27. package/dist/web-ui/index.html +3 -3
  28. package/package.json +1 -1
  29. package/dist/web-ui/assets/PluginsView-CNDVeVj8.js +0 -2
  30. package/dist/web-ui/assets/PluginsView-zyTILSF1.css +0 -1
  31. package/dist/web-ui/assets/ProvidersView-DTIx2VSi.js +0 -14
  32. package/dist/web-ui/assets/useToast-nQZ8k6t7.js +0 -1
@@ -1,2 +0,0 @@
1
- import{A as e,F as t,I as n,M as r,O as i,P as a,Pt as o,Tt as s,V as c,Wt as l,Z as ee,et as u,fn as d,it as f,j as p,k as m,mt as h,nt as g,s as te,vt as _,w as v}from"./router-Daxct41S.js";import{W as ne}from"./message-B022-tc2.js";import{n as y,t as b}from"./index-D6ydfwRk.js";import{t as x}from"./useManagerApi-DdgACgsq.js";import{t as S}from"./src-DLq1gsLr.js";import{t as re}from"./useToast-nQZ8k6t7.js";async function C(e,t={}){return await te.post(`/api/fetch`,{url:e,...t})}async function w(e,t){if(e.binary)throw Error(`${t} 返回二进制内容(${e.contentType||`无 content-type`}),不是 JSON`);let n=e.body;if(e.status<200||e.status>=300){let t=(n??``).trim().slice(0,300);throw Error(`上游返回 HTTP ${String(e.status)}${t===``?``:`:${t}`}`)}if(n===null||n.trim()===``)throw Error(`上游返回空响应体(HTTP ${String(e.status)},${e.contentType||`无 content-type`})`);try{return JSON.parse(n)}catch{throw Error(`上游响应不是 JSON(HTTP ${String(e.status)},${e.contentType||`无 content-type`}):`+n.trim().slice(0,300))}}function T(e,t){return`http://127.0.0.1:${String(e)}${t.startsWith(`/`)?t:`/${t}`}`}async function E(e,t={}){return await w(await C(e,{method:`GET`,...t}),e)}async function D(e,t,n=`POST`){return await w(await C(e,{method:n,body:t}),e)}async function O(e){return await w(await C(e,{method:`DELETE`}),e)}_();var k=`https://raw.githubusercontent.com/magpie-community/plugins/main/registry.json`,A=[`https://gh-proxy.com/${k}`,`https://ghfast.top/${k}`,k],j=1e4,M=`plugin_market_cache`,N=1,ie=216e5,P=36e5,F=[`provider`];function I(){try{let e=localStorage.getItem(M);if(e===null)return null;let t=JSON.parse(e);if(t.version!==N||!Array.isArray(t.entries))return null;let n=t.fetchedAt;return n===void 0||typeof n.at!=`number`?null:{version:N,entries:t.entries.filter(oe),fetchedAt:n}}catch{return null}}function L(e,t){try{let n={version:N,entries:e,fetchedAt:t};localStorage.setItem(M,JSON.stringify(n))}catch{}}function R(e){return typeof e==`string`&&e.trim()!==``?e.trim():null}function z(e){if(typeof e!=`object`||!e||Array.isArray(e))return null;let t=e;return R(t.zh)??R(t.en)}function B(e){switch(e){case`provider`:case`middleware`:case`agent`:case`tools`:case`page`:return e;default:return`provider`}}function ae(e){return F.includes(e)}function oe(e){if(typeof e!=`object`||!e)return!1;let t=e.kind;return typeof t==`string`&&ae(t)}function se(e){let t=R(e.package);if(t===null)return null;let n=Array.isArray(e.providers)?e.providers.filter(e=>typeof e==`string`):[];return{package:t,name:R(e.name)??t,icon:R(e.icon),providers:n,community:R(e.community),summary:z(e.summary),kind:B(e.kind),replaces:R(e.replaces),version:null,license:null,description:null,homepage:null,weeklyDownloads:null}}var ce=new Map,le=new Map;async function ue(e){let t=ce.get(e);if(t!==void 0&&Date.now()-t.at<P)return t.meta;try{let t=await E(`https://registry.npmjs.org/${encodeURIComponent(e)}`),n={version:R(t[`dist-tags`]?.latest),license:R(t.license),description:R(t.description),homepage:R(t.homepage)};return ce.set(e,{at:Date.now(),meta:n}),n}catch{return{version:null,license:null,description:null,homepage:null}}}async function V(e){let t=le.get(e);if(t!==void 0&&Date.now()-t.at<P)return t.downloads;try{let t=await E(`https://api.npmjs.org/downloads/point/last-week/${encodeURIComponent(e)}`),n=typeof t.downloads==`number`?t.downloads:null;return le.set(e,{at:Date.now(),downloads:n}),n}catch{return null}}async function H(){let e=[];for(let t of A)try{let e=await E(t,{timeoutMs:j});return t!==A[0]&&S(`[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(A.length)} 个源):\n${e.join(`
2
- `)}`)}async function de(e){let{registry:t,source:n}=await H(),r=t.plugins;if(!Array.isArray(r))throw Error(`清单格式不是预期形状(缺 plugins 数组):${k}`);let i=r.map(e=>typeof e==`object`&&e?se(e):null).filter(oe).sort((e,t)=>e.package.localeCompare(t.package)),a=0;return await Promise.all(i.map(async t=>{let[n,r]=await Promise.all([ue(t.package),V(t.package)]);Object.assign(t,n,{weeklyDownloads:r}),a+=1,e?.(a,i.length)})),{entries:i,source:n}}var U=s([]),W=s(!1),G=s(null),K=s({loaded:0,total:0}),q=s(null),J=s(!1),Y=null;function X(e,t){JSON.stringify(e)!==JSON.stringify(U.value)&&(U.value=e),q.value=t,L(e,t)}async function fe(e={}){let t=e.force===!0,n=U.value.length===0?I():null;n!==null&&(U.value=n.entries,q.value=n.fetchedAt);let r=U.value.length>0,i=q.value,a=i!==null&&Date.now()-i.at<ie;if(!(!t&&r&&a)){if(Y!==null){if(t)await Y;else return}if(t||!r){W.value=!0,J.value=!1,K.value={loaded:0,total:0};try{let e=await de((e,t)=>{K.value={loaded:e,total:t}});X(e.entries,{source:e.source,at:Date.now()}),G.value=null}catch(e){G.value=`插件市场清单加载失败:${e instanceof Error?e.message:String(e)}`}finally{W.value=!1}return}J.value=!0,Y=(async()=>{try{let e=await de();X(e.entries,{source:e.source,at:Date.now()}),G.value=null,J.value=!1}catch(e){S(`[plugin-market] 后台刷新失败,继续用缓存:${e instanceof Error?e.message:String(e)}`)}finally{Y=null}})()}}function pe(){return{entries:U,loading:W,marketError:G,progress:K,fetchedAt:q,stale:J,loadMarket:fe}}c(),_(),l();var me={class:`page-head`},he={class:`page-head-actions`},ge={class:`flex-between`},_e={class:`muted-sm`},ve={key:0,class:`loading-block`},ye={key:1,class:`loading-block`},be={key:2,class:`plugin-grid`},xe={class:`card-top`},Se={class:`plugin-icon`},Ce=[`src`,`alt`,`onError`],we={key:1},Te={class:`plugin-titles`},Ee=[`title`],De={class:`plugin-tags`},Oe={class:`plugin-action`},ke=[`title`],Ae={class:`plugin-meta`},je={key:0},Me={key:1,class:`mono`},Ne={key:2,class:`muted-disabled`},Pe={class:`mono`},Fe={key:0,class:`muted-sm`},Ie={class:`mono`},Le={class:`mono`},Re={class:`method-list`},ze={class:`muted-sm`},Be={key:0,class:`mt-8`},Ve=[`href`],He={key:2,class:`muted-sm mt-8`},Ue=b(n({__name:`PluginsView`,setup(n){let{toast:c}=re(),l=s(!0),te=s(`服务未由 ezllm 主进程托管(源码运行模式);请用 ezllm 启动服务`),_=s(!1),b=s(!1),S=s(null),C=s(!1),{entries:w,loading:k,marketError:A,progress:j,fetchedAt:M,stale:N,loadMarket:ie}=pe(),P=s(new Set),F=s([]),I=s(null),L=s(!1),R=s(``),z=s(!1),B=s(!1),ae=i(()=>b.value&&S.value!==null),oe=e=>F.value.some(t=>t.package===e.package),se=e=>e.icon===null||P.value.has(e.package)?null:/^https?:\/\//i.test(e.icon)?e.icon:null,ce=e=>e.icon!==null&&!/^https?:\/\//i.test(e.icon)?e.icon:(e.name.charAt(0)||`?`).toUpperCase(),le=e=>{P.value=new Set(P.value).add(e.package)},ue=e=>e>=1e3?`${(e/1e3).toFixed(e>=1e4?0:1)}k`:String(e),V=async()=>{try{let e=await x.plugins();l.value=!0,_.value=e.enabled,b.value=e.running,S.value=e.port}catch(e){if(typeof e?.message==`string`&&e.message.includes(`未由 ezllm 主进程托管`)){l.value=!1,te.value=e.message,_.value=!1,b.value=!1,S.value=null;return}throw e}},H=async()=>{if(!ae.value){F.value=[];return}let e=S.value;if(e!==null)try{let t=await E(T(e,`/packages`));F.value=Array.isArray(t.packages)?t.packages:[]}catch{F.value=[]}},de=e=>{let t=Math.floor((Date.now()-e)/6e4);if(t<1)return`刚刚`;if(t<60)return`${String(t)} 分钟前`;let n=Math.floor(t/60);return n<24?`${String(n)} 小时前`:new Date(e).toLocaleDateString()},U=i(()=>{if(k.value)return`正在加载 ${String(j.value.loaded)}/${String(j.value.total)}…`;let e=M.value===null?``:de(M.value.at),t=e===``?``:` · ${e}更新`,n=N.value?` · 更新中…`:``;return`${String(w.value.length)} 个插件 · 已装 ${String(F.value.length)} 个${t}${n}`}),W=async(e=!1)=>{await ie({force:e})},G=async()=>{try{await V()}catch(e){A.value=e?.message??`插件服务状态加载失败`;return}await H(),await W()},K=async e=>{C.value=!0;try{let t=await x.setPluginEnabled(e);_.value=t.enabled,b.value=t.running,S.value=t.port,c(e?`插件服务已开启`:`插件服务已关闭`,`success`),await H()}catch(e){await V().catch(()=>void 0),c(e?.message??`操作失败`,`error`)}finally{C.value=!1}},q=async e=>{if(e){await K(!0);return}try{await y.confirm(`关闭插件服务?已装插件保留,但插件模型的请求将不可用。`,`关闭确认`,{confirmButtonText:`关闭`,cancelButtonText:`取消`,type:`warning`})}catch{await V().catch(()=>void 0);return}await K(!1)},J=async e=>{await X(e.package)},Y=async()=>{let e=R.value.trim();if(e!==``){B.value=!0;try{await X(e),L.value=!1,R.value=``}finally{B.value=!1}}},X=async e=>{let t=S.value;if(t===null){c(`插件服务未开启`,`error`);return}I.value=e;try{(await D(T(t,`/packages`),{package:e})).loaded===!1?c(`${e} 已安装但未加载成功(重启插件服务或查看日志)`,`warning`):c(`已安装 ${e}`,`success`),await H()}catch(e){c(e?.message??`安装失败`,`error`)}finally{I.value=null}},fe=async e=>{let t=S.value;if(t!==null){try{await y.confirm(`确定卸载 ${e}?该插件提供的模型将不可用。`,`确认卸载`,{confirmButtonText:`卸载`,cancelButtonText:`取消`,type:`warning`})}catch{return}I.value=e;try{await O(T(t,`/packages/${encodeURIComponent(e)}`)),c(`已卸载 ${e}`,`success`),await H()}catch(e){c(e?.message??`卸载失败`,`error`)}finally{I.value=null}}},Ue=()=>{R.value=``,L.value=!0},We=async()=>{await H(),z.value=!0},Ge=s(null),Z=s(!1),Ke=s(``),qe=s([]),Q=s(!1),Je=s(``),Ye=s(``),Xe=s(``),$=s(null),Ze=(e,t)=>{Ye.value=e,Je.value=t.url??``,Xe.value=t.instructions??``,$.value=null,Q.value=!0},Qe=async e=>{let t=S.value;if(t===null)return;let n=Date.now()+18e4;for(;;){await new Promise(e=>setTimeout(e,2e3));let r;try{r=await E(T(t,`/login/${encodeURIComponent(e)}`))}catch(e){$.value=e?.message??`查询登录状态失败`;return}if(r.state===`success`){Q.value=!1,c(`已登录${r.accountId?`(${r.accountId})`:``}`,`success`),await H();return}if(r.state===`failed`){$.value=r.error??`登录失败`;return}if(Date.now()>n){$.value=`等待超时,可关闭后重新点击「登录」`;return}}},$e=async(e,t)=>{let n=S.value;if(n===null){c(`插件服务未开启`,`error`);return}Ge.value=e;try{let r=await D(T(n,`/login/${encodeURIComponent(e)}`),t===void 0?{}:{method:t});if(r.needMethod===!0){Ke.value=e,qe.value=r.methods,Z.value=!0;return}Ze(e,r),Qe(e)}catch(e){c(e?.message??`发起登录失败`,`error`)}finally{Ge.value=null}},et=async e=>{Z.value=!1,await $e(Ke.value,e)};return ee(G),(n,i)=>{let s=f(`el-switch`),c=f(`el-button`),ee=f(`el-icon`),y=f(`el-alert`),x=f(`el-tag`),S=f(`el-card`),re=f(`el-input`),T=f(`el-form-item`),E=f(`el-form`),D=f(`el-dialog`),O=f(`el-table-column`),j=f(`el-table`);return u(),r(`div`,null,[m(`div`,me,[i[15]||=m(`div`,null,[m(`div`,{class:`page-head-title`},`插件`),m(`div`,{class:`page-head-sub`},` 订阅社区 OpenCode 插件——把订阅账号(CodeBuddy、智谱 Coding Plan 等)当作供应商接入网关 `)],-1),m(`div`,he,[t(s,{modelValue:_.value,"onUpdate:modelValue":i[0]||=e=>_.value=e,loading:C.value,disabled:!l.value||C.value,"active-text":`插件服务`,"inline-prompt":``,onChange:q},null,8,[`modelValue`,`loading`,`disabled`]),t(c,{disabled:!b.value,onClick:We},{default:h(()=>[...i[12]||=[a(`已装插件`,-1)]]),_:1},8,[`disabled`]),t(c,{disabled:!b.value,onClick:Ue},{default:h(()=>[t(ee,null,{default:h(()=>[t(o(ne))]),_:1}),i[13]||=a(` 手动安装 `,-1)]),_:1},8,[`disabled`]),t(c,{loading:o(k),onClick:i[1]||=e=>W(!0)},{default:h(()=>[...i[14]||=[a(`刷新`,-1)]]),_:1},8,[`loading`])])]),l.value?b.value?p(``,!0):(u(),e(y,{key:1,type:`info`,"show-icon":``,closable:!1,class:`mb-16`,title:`插件服务未开启`},{default:h(()=>[i[17]||=m(`div`,{class:`muted-sm`},`开启后即可安装并加载插件;下方清单仍可浏览。`,-1),t(c,{size:`small`,type:`primary`,class:`mt-8`,loading:C.value,onClick:i[2]||=e=>K(!0)},{default:h(()=>[...i[16]||=[a(` 开启插件服务 `,-1)]]),_:1},8,[`loading`])]),_:1})):(u(),e(y,{key:0,type:`warning`,"show-icon":``,closable:!1,class:`mb-16`,title:`插件服务不可用`},{default:h(()=>[a(d(te.value),1)]),_:1})),o(A)?(u(),e(y,{key:2,type:`error`,"show-icon":``,closable:!1,class:`mb-16`,title:o(A)},{default:h(()=>[t(c,{size:`small`,onClick:W},{default:h(()=>[...i[18]||=[a(`重试`,-1)]]),_:1})]),_:1},8,[`title`])):p(``,!0),t(S,{shadow:`never`},{header:h(()=>[m(`div`,ge,[i[19]||=m(`span`,{class:`fw-600`},`社区插件`,-1),m(`span`,_e,d(U.value),1)])]),default:h(()=>[o(k)&&o(w).length===0?(u(),r(`div`,ve,`正在从社区清单加载…`)):o(w).length===0?(u(),r(`div`,ye,` 清单里没有本宿主支持的插件(只收 provider 类),可点右上角「刷新」重试,或用「手动安装」直接按包名安装。 `)):(u(),r(`div`,be,[(u(!0),r(v,null,g(o(w),t=>(u(),r(`div`,{key:t.package,class:`plugin-card`},[m(`div`,xe,[m(`div`,Se,[se(t)?(u(),r(`img`,{key:0,src:se(t),alt:t.name,onError:e=>le(t)},null,40,Ce)):(u(),r(`span`,we,d(ce(t)),1))]),m(`div`,Te,[m(`div`,{class:`plugin-name`,title:t.name},d(t.name),9,Ee),m(`div`,De,[t.community?(u(),e(x,{key:0,size:`small`,type:`info`,"disable-transitions":``},{default:h(()=>[a(d(t.community),1)]),_:2},1024)):p(``,!0)])]),m(`div`,Oe,[oe(t)?(u(),e(x,{key:0,type:`success`,size:`small`,"disable-transitions":``},{default:h(()=>[...i[20]||=[a(`已装`,-1)]]),_:1})):(u(),e(c,{key:1,type:`primary`,size:`small`,disabled:!ae.value||I.value===t.package,loading:I.value===t.package,onClick:e=>J(t)},{default:h(()=>[...i[21]||=[a(` 安装 `,-1)]]),_:1},8,[`disabled`,`loading`,`onClick`]))])]),m(`div`,{class:`plugin-summary`,title:t.summary??``},d(t.summary??`(清单未提供简介)`),9,ke),m(`div`,Ae,[m(`span`,null,`供应商 `+d(t.providers.length),1),t.weeklyDownloads===null?p(``,!0):(u(),r(`span`,je,d(ue(t.weeklyDownloads))+`/周`,1)),t.version?(u(),r(`span`,Me,`v`+d(t.version),1)):(u(),r(`span`,Ne,`版本未知`))])]))),128))]))]),_:1}),t(D,{modelValue:L.value,"onUpdate:modelValue":i[5]||=e=>L.value=e,title:`手动安装插件`,width:`520px`},{footer:h(()=>[t(c,{onClick:i[4]||=e=>L.value=!1},{default:h(()=>[...i[23]||=[a(`取消`,-1)]]),_:1}),t(c,{type:`primary`,loading:B.value,disabled:R.value.trim()===``,onClick:Y},{default:h(()=>[...i[24]||=[a(` 安装 `,-1)]]),_:1},8,[`loading`,`disabled`])]),default:h(()=>[t(E,{"label-position":`top`},{default:h(()=>[t(T,{label:`npm 包名`},{default:h(()=>[t(re,{modelValue:R.value,"onUpdate:modelValue":i[3]||=e=>R.value=e,placeholder:`例:@magpie-community/opencode-workbuddy-auth`,clearable:``},null,8,[`modelValue`]),i[22]||=m(`div`,{class:`muted-sm`},[a(`可带版本(`),m(`span`,{class:`mono`},`name@1.2.3`),a(`);清单加载不出来时用这个。`)],-1)]),_:1})]),_:1})]),_:1},8,[`modelValue`]),t(D,{modelValue:z.value,"onUpdate:modelValue":i[7]||=e=>z.value=e,title:`已装插件`,width:`720px`},{footer:h(()=>[t(c,{onClick:i[6]||=e=>z.value=!1},{default:h(()=>[...i[31]||=[a(`关闭`,-1)]]),_:1})]),default:h(()=>[t(j,{data:F.value,"empty-text":`尚未安装任何插件`},{default:h(()=>[t(O,{label:`包名`,"min-width":`220`},{default:h(({row:e})=>[m(`div`,Pe,d(e.package),1)]),_:1}),t(O,{label:`供应商`,"min-width":`230`},{default:h(({row:n})=>[n.providers.length?p(``,!0):(u(),r(`div`,Fe,`-`)),(u(!0),r(v,null,g(n.providers,n=>(u(),r(`div`,{key:n.id,class:`provider-line`},[m(`span`,Ie,d(n.id),1),n.signedIn?(u(),e(x,{key:0,type:`success`,size:`small`,"disable-transitions":``},{default:h(()=>[...i[25]||=[a(`已登录`,-1)]]),_:1})):(u(),r(v,{key:1},[i[27]||=m(`span`,{class:`muted-sm`},`未登录`,-1),t(c,{link:``,type:`primary`,size:`small`,loading:Ge.value===n.id,onClick:e=>$e(n.id)},{default:h(()=>[...i[26]||=[a(` 登录 `,-1)]]),_:1},8,[`loading`,`onClick`])],64))]))),128))]),_:1}),t(O,{label:`版本`,width:`110`},{default:h(({row:e})=>[m(`span`,Le,d(e.version||`-`),1)]),_:1}),t(O,{label:`状态`,width:`110`,align:`center`},{default:h(({row:t})=>[t.loaded?(u(),e(x,{key:0,type:`success`,size:`small`,"disable-transitions":``},{default:h(()=>[...i[28]||=[a(`已加载`,-1)]]),_:1})):(u(),e(x,{key:1,type:`danger`,size:`small`,"disable-transitions":``},{default:h(()=>[...i[29]||=[a(`加载失败`,-1)]]),_:1}))]),_:1}),t(O,{label:`操作`,width:`100`,align:`center`},{default:h(({row:e})=>[t(c,{link:``,type:`danger`,loading:I.value===e.package,onClick:t=>fe(e.package)},{default:h(()=>[...i[30]||=[a(`卸载`,-1)]]),_:1},8,[`loading`,`onClick`])]),_:1})]),_:1},8,[`data`])]),_:1},8,[`modelValue`]),t(D,{modelValue:Z.value,"onUpdate:modelValue":i[9]||=e=>Z.value=e,title:`选择登录方式`,width:`460px`},{footer:h(()=>[t(c,{onClick:i[8]||=e=>Z.value=!1},{default:h(()=>[...i[32]||=[a(`取消`,-1)]]),_:1})]),default:h(()=>[i[33]||=m(`div`,{class:`muted-sm`},`该插件提供多种登录方式,选一种:`,-1),m(`div`,Re,[(u(!0),r(v,null,g(qe.value,t=>(u(),e(c,{key:t.label,class:`method-btn`,onClick:e=>et(t.label)},{default:h(()=>[a(d(t.label||t.type),1)]),_:2},1032,[`onClick`]))),128))])]),_:1},8,[`modelValue`]),t(D,{modelValue:Q.value,"onUpdate:modelValue":i[11]||=e=>Q.value=e,title:`登录 ${Ye.value}`,width:`480px`},{footer:h(()=>[t(c,{onClick:i[10]||=e=>Q.value=!1},{default:h(()=>[...i[35]||=[a(`关闭`,-1)]]),_:1})]),default:h(()=>[m(`div`,ze,d(Xe.value||`正在读取本机已登录的凭据…`),1),Je.value?(u(),r(`div`,Be,[m(`a`,{class:`el-button el-button--primary`,href:Je.value,target:`_blank`,rel:`noopener`},` 打开登录页 `,8,Ve),i[34]||=m(`div`,{class:`muted-sm mt-8`},`在打开的页面完成登录即可,本页会自动检测(最长等待几分钟)。`,-1)])):p(``,!0),$.value?(u(),e(y,{key:1,type:`error`,"show-icon":``,closable:!1,class:`mt-8`,title:$.value},null,8,[`title`])):(u(),r(`div`,He,`等待登录完成…`))]),_:1},8,[`modelValue`,`title`])])}}}),[[`__scopeId`,`data-v-559553f3`]]);export{Ue as default};
@@ -1 +0,0 @@
1
- .plugin-grid[data-v-559553f3]{grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:16px;display:grid}.plugin-card[data-v-559553f3]{border:1px solid var(--el-border-color-light);border-radius:8px;flex-direction:column;gap:10px;padding:16px;transition:border-color .15s;display:flex}.plugin-card[data-v-559553f3]:hover{border-color:var(--el-color-primary-light-5)}.card-top[data-v-559553f3]{align-items:flex-start;gap:12px;display:flex}.plugin-icon[data-v-559553f3]{background:var(--el-fill-color-light);border-radius:8px;flex-shrink:0;justify-content:center;align-items:center;width:40px;height:40px;font-size:18px;font-weight:600;display:flex;overflow:hidden}.plugin-icon img[data-v-559553f3]{object-fit:contain;width:100%;height:100%}.plugin-titles[data-v-559553f3]{flex:1;min-width:0}.plugin-name[data-v-559553f3]{text-overflow:ellipsis;white-space:nowrap;font-size:14px;font-weight:600;overflow:hidden}.plugin-tags[data-v-559553f3]{flex-wrap:wrap;gap:6px;margin-top:4px;display:flex}.plugin-action[data-v-559553f3]{flex-shrink:0}.plugin-summary[data-v-559553f3]{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-559553f3]{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-559553f3]{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}.provider-line[data-v-559553f3]{align-items:center;gap:8px;display:flex}.provider-line[data-v-559553f3]:not(:last-child){margin-bottom:4px}.method-list[data-v-559553f3]{flex-direction:column;gap:8px;margin-top:12px;display:flex}.method-btn[data-v-559553f3]{justify-content:flex-start;margin-left:0}