ezllm 0.0.42 → 0.0.43
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/server.js +56 -56
- package/dist/web-ui/assets/{DashboardView-DRckeG7f.js → DashboardView-WtDwRkVw.js} +1 -1
- package/dist/web-ui/assets/{LayoutView-4x7mM1Nd.js → LayoutView-Bxe9Zpzg.js} +1 -1
- package/dist/web-ui/assets/{LoginView-D55GMnh2.js → LoginView-oHqStvWg.js} +1 -1
- package/dist/web-ui/assets/LogsView-C1rYzWM5.js +5 -0
- package/dist/web-ui/assets/{LogsView-u-0B5Xpc.css → LogsView-CXFJ_22b.css} +1 -1
- package/dist/web-ui/assets/{ManagedServicesView-aU7KD-uK.js → ManagedServicesView-Roep2c1v.js} +1 -1
- package/dist/web-ui/assets/PluginsView-Ar17i6aK.css +1 -0
- package/dist/web-ui/assets/PluginsView-xy5NajWq.js +2 -0
- package/dist/web-ui/assets/{ProvidersView-BuCzzvhA.js → ProvidersView-M_MSab-K.js} +1 -1
- package/dist/web-ui/assets/{ServiceStatusView-BfEtiG3k.js → ServiceStatusView-Dsrz87_B.js} +2 -2
- package/dist/web-ui/assets/{SettingsView-C3lfSDLN.js → SettingsView-CwdCfurj.js} +1 -1
- package/dist/web-ui/assets/{SetupView-BB5YHhmw.js → SetupView-8ajUBY2H.js} +1 -1
- package/dist/web-ui/assets/{config-B3YP6GMt.js → config-_F8xCbJI.js} +1 -1
- package/dist/web-ui/assets/format-CPPf8IfM.js +1 -0
- package/dist/web-ui/assets/{index-DVkpGX_l.js → index-W7WdLt_5.js} +1 -1
- package/dist/web-ui/assets/{message-JXw_u_ps.js → message-DpifAOwJ.js} +1 -1
- package/dist/web-ui/assets/providers-CkMtur-C.js +1 -0
- package/dist/web-ui/assets/{router-DxY62FPf.js → router-BgTNV93P.js} +2 -2
- package/dist/web-ui/assets/{useCopyToast-W6vLjLdg.js → useCopyToast-B_Qvf_Pf.js} +1 -1
- package/dist/web-ui/assets/{useManagerApi-7t9qNB2C.js → useManagerApi-USNyi1JZ.js} +1 -1
- package/dist/web-ui/assets/{useQuickRangeFilter-BWtDACYs.js → useQuickRangeFilter-DNSnrkx7.js} +1 -1
- package/dist/web-ui/assets/useToast-X_JkPDpr.js +1 -0
- package/dist/web-ui/index.html +3 -3
- package/package.json +1 -1
- package/dist/web-ui/assets/LogsView-Ck8cUn2K.js +0 -5
- package/dist/web-ui/assets/PluginsView-XtlAtfkK.js +0 -2
- package/dist/web-ui/assets/PluginsView-ggYmqCJ8.css +0 -1
- package/dist/web-ui/assets/format-7jzqzMS_.js +0 -1
- package/dist/web-ui/assets/providers-CbsDigh3.js +0 -1
- package/dist/web-ui/assets/src-DLq1gsLr.js +0 -1
- package/dist/web-ui/assets/useToast-DgnKZwIF.js +0 -1
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import{A as e,Ct as t,F as n,I as r,M as i,O as a,P as o,Pt as s,S as c,Tt as l,V as u,Wt as d,Z as f,a as p,at as ee,bt as m,et as h,fn as g,ft as _,ht as v,it as y,j as b,k as x,m as S,mt as C,nt as w,vt as T,w as E,x as D,xt as O}from"./router-DxY62FPf.js";import{R as k,S as te}from"./message-JXw_u_ps.js";import{n as A,t as j}from"./index-DVkpGX_l.js";import{t as M}from"./providers-CbsDigh3.js";import{n as N,t as P}from"./useCopyToast-W6vLjLdg.js";import{t as ne}from"./useToast-DgnKZwIF.js";import{n as F,t as re}from"./useQuickRangeFilter-BWtDACYs.js";import{S as I,_ as L,a as R,c as z,f as B,g as V,h as H,i as ie,l as U,m as W,n as ae,o as oe,p as se,s as G,t as ce,u as K,x as le}from"./format-7jzqzMS_.js";u(),T(),d();var ue={class:`detail-content`},de={key:0,class:`ip-link`},q={class:`ip-pop`},fe={class:`ip-pop-row`},J={key:0,class:`ip-pop-row`},Y={key:1,class:`ip-pop-error`},X={key:2},pe=[`href`],me={key:1},he={key:1},ge=[`title`],_e=[`title`],ve={class:`error-text`},ye={class:`pane-bar`},be={class:`json-block`},xe={class:`pane-bar`},Se={class:`json-block`},Z={class:`pane-bar`},Ce={class:`json-block`},Q={class:`pane-bar`},we={class:`json-block`},Te={class:`pane-bar`},$={class:`json-block`},Ee={class:`pane-bar`},De={class:`json-block`},Oe={class:`pane-bar`},ke={class:`json-block`},Ae={class:`pane-bar`},je={class:`json-block`},Me=j(r({__name:`LogDetailDialog`,setup(t,{expose:r}){let{copyWithToast:c}=P(),{loadError:u,run:d}=N(),f=l(!1),m=l(null),_=l(!1),S=l(`info`),w=l(!1),T=l(null),D=F(),k=e=>{T.value=e,f.value=!0,m.value=null,S.value=`info`;let t=D();_.value=!0,d(async()=>{try{let n=`?id=${String(e.id)}`,r=await p.get(`/api/logs/detail`+n);if(!t())return;if(r&&r.detail){let e={...r.detail,...r.meta};e.response&&=O(e.response),e.request&&=O(e.request),m.value=e}else m.value=r}catch(e){if(!t())return;throw e}finally{t()&&(_.value=!1)}})},te=()=>{T.value&&k(T.value)};r({open:k});let A=a(()=>W(m.value?.response?.inbound_request)),j=a(()=>W(m.value?.response?.upstream_request)),M=a(()=>V(m.value?.response?.upstream_response_text)),ne=a(()=>(m.value?.response?.upstream_stream_frames||[]).join(`
|
|
2
|
-
|
|
3
|
-
`)),re=a(()=>W(m.value?.response?.client_response)),L=a(()=>(m.value?.response?.client_stream_frames||[]).join(`
|
|
4
|
-
|
|
5
|
-
`)),R=a(()=>W(m.value?.request)),z=a(()=>W(m.value?.response)),U=async e=>{if(!(e._ipInfo||e._ipInfoError)){w.value=!0;try{let t=await p.get(`/api/logs/ipinfo?ip=${encodeURIComponent(e.ip)}`);t.error?e._ipInfoError=t.error:e._ipInfo=t}catch{e._ipInfoError=`查询失败`}finally{w.value=!1}}},oe=e=>[e.country,e.region,e.city].filter(Boolean).join(` · `)||`-`;return(t,r)=>{let a=y(`el-button`),l=y(`el-alert`),d=y(`el-descriptions-item`),p=y(`el-tag`),T=y(`el-divider`),D=y(`el-popover`),O=y(`el-descriptions`),k=y(`el-tab-pane`),N=y(`el-tabs`),P=y(`el-dialog`),F=ee(`loading`);return h(),e(P,{modelValue:f.value,"onUpdate:modelValue":r[11]||=e=>f.value=e,title:`日志详情`,width:`80%`,top:`5vh`,"destroy-on-close":``},{default:C(()=>[s(u)?(h(),e(l,{key:0,title:s(u),type:`error`,"show-icon":``,closable:!1,class:`mb-16`},{default:C(()=>[n(a,{size:`small`,onClick:te},{default:C(()=>[...r[12]||=[o(`重试`,-1)]]),_:1})]),_:1},8,[`title`])):b(``,!0),v((h(),i(`div`,ue,[m.value?(h(),e(N,{key:0,modelValue:S.value,"onUpdate:modelValue":r[10]||=e=>S.value=e},{default:C(()=>[n(k,{lazy:``,label:`基本信息`,name:`info`},{default:C(()=>[n(O,{column:2,border:``},{default:C(()=>[n(d,{label:`时间`},{default:C(()=>[o(g(s(H)(m.value.time)),1)]),_:1}),n(d,{label:`模型`},{default:C(()=>[o(g(m.value.model),1)]),_:1}),n(d,{label:`方法`},{default:C(()=>[o(g(m.value.method),1)]),_:1}),n(d,{label:`路径`},{default:C(()=>[o(g(m.value.path),1)]),_:1}),n(d,{label:`状态码`},{default:C(()=>[o(g(m.value.status),1)]),_:1}),n(d,{label:`流式`},{default:C(()=>[n(p,{type:m.value.stream?`warning`:`info`},{default:C(()=>[o(g(m.value.stream?`是`:`否`),1)]),_:1},8,[`type`])]),_:1}),n(d,{label:`IP`},{default:C(()=>[m.value.ip?(h(),i(`span`,de,[n(D,{placement:`right`,width:`240`,trigger:`click`,onShow:r[0]||=e=>U(m.value)},{reference:C(()=>[x(`span`,null,g(m.value.ip),1)]),default:C(()=>[v((h(),i(`div`,q,[m.value._ipInfo?(h(),i(E,{key:0},[x(`div`,fe,[r[13]||=x(`span`,{class:`ip-pop-label`},`归属地`,-1),x(`span`,null,g(oe(m.value._ipInfo)),1)]),m.value._ipInfo.isp?(h(),i(`div`,J,[r[14]||=x(`span`,{class:`ip-pop-label`},`运营商`,-1),x(`span`,null,g(m.value._ipInfo.isp),1)])):b(``,!0)],64)):m.value._ipInfoError?(h(),i(`div`,Y,g(m.value._ipInfoError),1)):(h(),i(`span`,X,`查询中...`)),n(T,{style:{margin:`8px 0`}}),x(`a`,{class:`ip-pop-link`,href:`https://m.ip138.com/iplookup.php?ip=${encodeURIComponent(m.value.ip)}`,target:`_blank`},`在 ip138 查看`,8,pe)])),[[F,w.value]])]),_:1})])):(h(),i(`span`,me,`-`))]),_:1}),n(d,{label:`Session`},{default:C(()=>[o(g(m.value.session_id||`-`),1)]),_:1}),n(d,{label:`ID`},{default:C(()=>[m.value._id==null?(h(),i(`span`,he,`-`)):(h(),i(`span`,{key:0,class:`request-id`,title:`点击复制(日志 id 同时是响应头 x-request-id)`,onClick:r[1]||=e=>s(c)(String(m.value._id))},g(m.value._id),1))]),_:1}),n(d,{label:`输入 Token(含缓存读取)`},{default:C(()=>[o(g(s(B)(m.value.input_tokens??0)),1)]),_:1}),n(d,{label:`输出 Token`},{default:C(()=>[o(g(s(B)(m.value.output_tokens??0)),1)]),_:1}),n(d,{label:`缓存读取`},{default:C(()=>[o(g(s(B)(m.value.cache_read_tokens??0)),1)]),_:1}),n(d,{label:`请求耗时`},{default:C(()=>[o(g(s(K)(m.value.duration)),1)]),_:1}),n(d,{label:`缓存命中率`},{default:C(()=>[o(g(s(ie)(m.value)),1)]),_:1}),n(d,{label:`首 Token`},{default:C(()=>[x(`span`,{title:s(ae)},g(s(K)(m.value.ttft)),9,ge)]),_:1}),n(d,{label:`生成速度`},{default:C(()=>[x(`span`,{title:s(ce)},g(s(se)(m.value.tps)),9,_e)]),_:1}),m.value.error?(h(),e(d,{key:0,label:`错误`,span:2},{default:C(()=>[x(`span`,ve,g(m.value.error),1)]),_:1})):b(``,!0)]),_:1}),m.value.response?.truncated?(h(),e(l,{key:0,class:`mt-16`,type:`warning`,closable:!1,title:`内容超过单请求捕获上限,已截断`})):b(``,!0)]),_:1}),m.value.response?._capture?(h(),i(E,{key:0},[n(k,{lazy:``,label:`客户端请求`,name:`inbound`},{default:C(()=>[x(`div`,ye,[n(a,{size:`small`,class:`copy-btn`,onClick:r[2]||=e=>s(c)(A.value)},{default:C(()=>[...r[15]||=[o(` 复制 `,-1)]]),_:1})]),x(`pre`,be,g(s(I)(A.value)),1)]),_:1}),n(k,{lazy:``,label:`转发上游的请求`,name:`upstreamReq`},{default:C(()=>[x(`div`,xe,[n(a,{size:`small`,class:`copy-btn`,onClick:r[3]||=e=>s(c)(j.value)},{default:C(()=>[...r[16]||=[o(` 复制 `,-1)]]),_:1})]),x(`pre`,Se,g(s(I)(j.value)),1)]),_:1}),m.value.response.upstream_response_text?(h(),e(k,{key:0,lazy:``,label:`上游响应(原始)`,name:`upstreamRes`},{default:C(()=>[x(`div`,Z,[n(a,{size:`small`,class:`copy-btn`,onClick:r[4]||=e=>s(c)(m.value.response.upstream_response_text)},{default:C(()=>[...r[17]||=[o(` 复制 `,-1)]]),_:1})]),x(`pre`,Ce,g(s(I)(M.value)),1)]),_:1})):m.value.response.upstream_stream_frames?.length?(h(),e(k,{key:1,lazy:``,label:`上游响应(原始流,${m.value.response.upstream_stream_frames.length} 帧)`,name:`upstreamStream`},{default:C(()=>[x(`div`,Q,[n(a,{size:`small`,class:`copy-btn`,onClick:r[5]||=e=>s(c)(ne.value)},{default:C(()=>[...r[18]||=[o(` 复制 `,-1)]]),_:1})]),x(`pre`,we,g(s(I)(ne.value)),1)]),_:1},8,[`label`])):b(``,!0),m.value.response.client_response!==void 0&&m.value.response.client_response!==null?(h(),e(k,{key:2,lazy:``,label:`回写客户端(转换后)`,name:`clientRes`},{default:C(()=>[x(`div`,Te,[n(a,{size:`small`,class:`copy-btn`,onClick:r[6]||=e=>s(c)(re.value)},{default:C(()=>[...r[19]||=[o(` 复制 `,-1)]]),_:1})]),x(`pre`,$,g(s(I)(re.value)),1)]),_:1})):m.value.response.client_stream_frames?.length?(h(),e(k,{key:3,lazy:``,label:`回写客户端(${m.value.response.client_stream_frames.length} 帧)`,name:`clientStream`},{default:C(()=>[x(`div`,Ee,[n(a,{size:`small`,class:`copy-btn`,onClick:r[7]||=e=>s(c)(L.value)},{default:C(()=>[...r[20]||=[o(` 复制 `,-1)]]),_:1})]),x(`pre`,De,g(s(I)(L.value)),1)]),_:1},8,[`label`])):b(``,!0)],64)):(h(),i(E,{key:1},[n(k,{lazy:``,label:`请求体`,name:`request`},{default:C(()=>[x(`div`,Oe,[n(a,{size:`small`,class:`copy-btn`,onClick:r[8]||=e=>s(c)(R.value)},{default:C(()=>[...r[21]||=[o(` 复制 `,-1)]]),_:1})]),x(`pre`,ke,g(s(I)(R.value)),1)]),_:1}),n(k,{lazy:``,label:`响应体`,name:`response`},{default:C(()=>[x(`div`,Ae,[n(a,{size:`small`,class:`copy-btn`,onClick:r[9]||=e=>s(c)(z.value)},{default:C(()=>[...r[22]||=[o(` 复制 `,-1)]]),_:1})]),x(`pre`,je,g(s(I)(z.value)),1)]),_:1})],64))]),_:1},8,[`modelValue`])):b(``,!0)])),[[F,_.value]])]),_:1},8,[`modelValue`])}}}),[[`__scopeId`,`data-v-7e1ff197`]]);u(),T(),d(),S();var Ne={class:`session-table`},Pe={class:`group-detail`},Fe={class:`cell-sub`},Ie=[`title`],Le=[`title`],Re={key:0,class:`detail-error`},ze={class:`detail-footer`},Be={class:`detail-count`},Ve=[`title`,`onClick`],He={class:`cell-sub`},Ue={class:`cell-sub`},We=50,Ge=j(r({__name:`SessionGroupTable`,props:{groups:{},noSession:{},loading:{type:Boolean},filterParams:{}},emits:[`open-detail`],setup(r,{emit:u}){let d=r,f=u,{copyWithToast:m}=P(),S=a(()=>d.noSession?[...d.groups,d.noSession]:d.groups),w=e=>e.session_id||`__no_session__`,T=l(null),E=t(new Map),D={loading:!1,items:[],total:0,nextPage:1,error:null},O=e=>E.get(w(e))??D,k=async(e,t)=>{let n=(e=>(E.has(e)||E.set(e,{loading:!1,items:[],total:0,nextPage:1,error:null}),E.get(e)))(w(e));if(!n.loading){n.loading=!0,n.error=null;try{let r={...d.filterParams,sort:`time`,order:`desc`,page:String(t),pageSize:String(We)};e.session_id?r.sessionId=e.session_id:r.noSession=`1`;let i=await p.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=>w(t)===w(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=>{T.value?.toggleRowExpansion(e)};return _(()=>S.value.map(w),e=>{let t=new Set(e);for(let e of[...E.keys()])t.has(e)||E.delete(e)}),(t,a)=>{let l=y(`el-table-column`),u=y(`el-tag`),d=y(`el-button`),p=y(`el-table`),_=y(`el-empty`),E=ee(`loading`);return h(),i(`div`,Ne,[S.value.length>0||r.loading?v((h(),e(p,{key:0,ref_key:`tableRef`,ref:T,data:S.value,height:`100%`,"row-key":w,stripe:``,class:`dense-table`,onExpandChange:te,onRowClick:j},{default:C(()=>[n(l,{type:`expand`},{default:C(({row:t})=>[x(`div`,Pe,[v((h(),e(p,{data:O(t).items,size:`small`,stripe:``,class:`dense-table`},{default:C(()=>[n(l,{label:`时间`,width:`96`,align:`center`},{default:C(({row:e})=>[x(`div`,null,g(s(z)(e.time)),1),x(`div`,Fe,g(s(U)(e.time)),1)]),_:1}),n(l,{prop:`model`,label:`模型`,"min-width":`150`,align:`center`,"show-overflow-tooltip":``}),n(l,{label:`客户端`,"min-width":`96`,align:`center`,"show-overflow-tooltip":``},{default:C(({row:e})=>[o(g(s(R)(e)),1)]),_:1}),n(l,{label:`状态`,width:`60`,align:`center`},{default:C(({row:e})=>[n(u,{size:`small`,type:e.status>=400?`danger`:e.status>=300?`warning`:`success`},{default:C(()=>[o(g(e.status),1)]),_:2},1032,[`type`])]),_:1}),n(l,{label:`输入`,width:`84`,align:`center`},{default:C(({row:e})=>[o(g(s(B)(e.input_tokens??0)),1)]),_:1}),n(l,{label:`输出`,width:`78`,align:`center`},{default:C(({row:e})=>[o(g(s(B)(e.output_tokens??0)),1)]),_:1}),n(l,{label:`缓存读取`,width:`84`,align:`center`},{default:C(({row:e})=>[o(g(s(B)(e.cache_read_tokens??0)),1)]),_:1}),n(l,{label:`缓存命中率`,width:`88`,align:`center`},{default:C(({row:e})=>[o(g(s(ie)(e)),1)]),_:1}),n(l,{label:`请求耗时`,width:`74`,align:`center`},{default:C(({row:e})=>[o(g(s(K)(e.duration)),1)]),_:1}),n(l,{label:`速度`,width:`96`,align:`center`},{default:C(({row:e})=>[x(`div`,{title:s(ce)},g(s(se)(e.tps)),9,Ie),e.ttft==null?b(``,!0):(h(),i(`div`,{key:0,class:`cell-sub`,title:s(ae)},` 首 `+g(s(K)(e.ttft)),9,Le))]),_:1}),n(l,{label:`详情`,width:`52`,align:`center`},{default:C(({row:e})=>[n(d,{link:``,type:`primary`,onClick:t=>f(`open-detail`,e)},{default:C(()=>[...a[0]||=[o(`查看`,-1)]]),_:1},8,[`onClick`])]),_:1})]),_:1},8,[`data`])),[[E,O(t).loading]]),O(t).error?(h(),i(`div`,Re,[o(g(O(t).error)+` `,1),n(d,{link:``,type:`primary`,size:`small`,onClick:e=>k(t,1)},{default:C(()=>[...a[1]||=[o(`重试`,-1)]]),_:1},8,[`onClick`])])):b(``,!0),x(`div`,ze,[x(`span`,Be,`已显示 `+g(O(t).items.length)+` / `+g(O(t).total)+` 条`,1),O(t).items.length<O(t).total?(h(),e(d,{key:0,size:`small`,loading:O(t).loading,onClick:e=>A(t)},{default:C(()=>[...a[2]||=[o(` 加载更多 `,-1)]]),_:1},8,[`loading`,`onClick`])):b(``,!0)])])]),_:1}),n(l,{label:`Session`,width:`100`,align:`center`},{default:C(({row:t})=>[t.session_id?(h(),i(`span`,{key:0,class:`session-id`,title:`${t.session_id}(点击复制)`,onClick:c(e=>s(m)(t.session_id),[`stop`])},g(s(le)(t.session_id)),9,Ve)):(h(),e(u,{key:1,size:`small`,type:`info`,title:`未携带会话标识的请求(NULL / 空串 session_id)`},{default:C(()=>[...a[3]||=[o(` 无 Session `,-1)]]),_:1}))]),_:1}),n(l,{label:`请求数`,width:`70`,align:`center`},{default:C(({row:e})=>[o(g(s(B)(e.calls)),1)]),_:1}),n(l,{label:`模型`,"min-width":`150`,align:`center`,"show-overflow-tooltip":``},{default:C(({row:e})=>[o(g(s(L)(e.models)),1)]),_:1}),n(l,{label:`客户端`,"min-width":`130`,align:`center`,"show-overflow-tooltip":``},{default:C(({row:e})=>[o(g(s(G)(e.clients)),1)]),_:1}),n(l,{label:`输入`,width:`100`,align:`center`},{default:C(({row:e})=>[o(g(s(B)(e.input_tokens)),1)]),_:1}),n(l,{label:`输出`,width:`90`,align:`center`},{default:C(({row:e})=>[o(g(s(B)(e.output_tokens)),1)]),_:1}),n(l,{label:`缓存读取`,width:`100`,align:`center`},{default:C(({row:e})=>[o(g(s(B)(e.cache_read_tokens)),1)]),_:1}),n(l,{label:`首次请求`,width:`96`,align:`center`},{default:C(({row:e})=>[x(`div`,null,g(s(z)(e.first_time)),1),x(`div`,He,g(s(U)(e.first_time)),1)]),_:1}),n(l,{label:`最后请求`,width:`96`,align:`center`},{default:C(({row:e})=>[x(`div`,null,g(s(z)(e.last_time)),1),x(`div`,Ue,g(s(U)(e.last_time)),1)]),_:1})]),_:1},8,[`data`])),[[E,r.loading]]):(h(),e(_,{key:1,description:`当前筛选下没有日志`}))])}}}),[[`__scopeId`,`data-v-1a4244ff`]]);u(),T(),S(),d();var Ke={class:`logs-page`},qe={class:`filter-bar`},Je={class:`table-wrap`},Ye=[`onClick`],Xe={key:1},Ze={class:`cell-sub`},Qe=[`title`,`onClick`],$e={key:1},et=[`title`,`onClick`],tt={key:1},nt=[`title`],rt=[`title`],it={class:`pagination-bar`},at=j(r({__name:`LogsView`,setup(t){let r=M(),{toast:c}=ne(),{copyWithToast:u}=P(),{loadError:d,run:_}=N(),{rangeKey:S,dateRange:T,setRange:O,onRangeChange:j}=re(()=>$()),I=l(`2xx`),L=l(``),V=l(``),H=l(``),W=l(`session`),G=l([]),ue=l([]),de=l(null),q=l(0),fe=l(0),J=l(1),Y=l(20),X=l(!1),pe=l(null),me=e=>{pe.value?.open(e)},he=a(()=>{let e=new Set;for(let t of r.suppliers)for(let n of t.models)e.add(n.modelName);for(let t of G.value)t.model&&e.add(t.model);return[...e].sort()}),ge=l([]),_e=a(()=>{let e=new Set(ge.value);for(let t of G.value)t.client&&e.add(t.client);return[...e].sort()}),ve=async()=>{try{let e=await p.get(`/api/logs/clients`);ge.value=e.clients||[]}catch{ge.value=[]}},ye=e=>{S.value=``,T.value=e||null,$()},be=()=>{let e={};T.value&&T.value.length===2&&(e.startDate=T.value[0],e.endDate=T.value[1]),I.value&&(e.status=I.value),L.value&&(e.model=L.value),V.value&&(e.client=V.value);let t=H.value.trim();return t&&(e.sessionId=t),e},xe=a(()=>be()),Se=F(),Z=()=>_(async()=>{let e=Se();X.value=!0;try{let t={...be(),page:String(J.value),pageSize:String(Y.value)};if(W.value===`session`){let n=new URLSearchParams(t).toString(),r=await p.get(`/api/logs/sessions?`+n);if(!e())return;ue.value=r.groups||[],de.value=r.noSession??null,q.value=r.total||0,fe.value=r.rowsTotal||0}else{let n=new URLSearchParams({...t,sort:`time`,order:`desc`}).toString(),r=await p.get(`/api/logs?`+n);if(!e())return;G.value=r.items||[],q.value=r.total||0}}catch(t){if(!e())return;throw t}finally{e()&&(X.value=!1)}}),Ce=e=>{W.value!==e&&(W.value=e,J.value=1,Y.value=W.value===`session`?20:50,Z())},Q=l(!1),we=a(()=>W.value===`session`?fe.value:q.value),Te=async()=>{if(Q.value||we.value===0)return;let e=W.value===`session`?`(按筛选行数计,含「无 Session」组)`:``;try{await A.confirm(`将永久清理当前筛选条件下的 ${we.value} 条日志${e},清理后不可恢复,请谨慎操作!`,`清理确认`,{confirmButtonText:`确认清理`,cancelButtonText:`取消`,type:`warning`})}catch{return}Q.value=!0;try{let e=new URLSearchParams(be()).toString(),t=await p.post(`/api/logs/clear?`+e,{});c(`已清理 ${t.deleted??0} 条日志`,`success`),J.value>1&&(J.value=1),Z()}catch(e){c(e.message||`清理失败`,`error`)}finally{Q.value=!1}},$=()=>{J.value=1,ve(),Z()},Ee=()=>{S.value=`today`,T.value=null,I.value=`2xx`,L.value=``,V.value=``,H.value=``,J.value=1,Y.value=W.value===`session`?20:50,O(`today`)};return f(()=>{r.loadProviders().catch(()=>{}),ve(),O(`today`)}),(t,r)=>{let a=y(`el-button`),c=y(`el-alert`),l=y(`el-option`),f=y(`el-select`),p=y(`el-date-picker`),_=y(`el-input`),O=y(`el-tooltip`),A=y(`el-button-group`),M=y(`el-card`),N=y(`el-table-column`),P=y(`el-tag`),ne=y(`el-table`),F=y(`el-pagination`),re=ee(`loading`);return h(),i(`div`,Ke,[s(d)?(h(),e(c,{key:0,title:s(d),type:`error`,"show-icon":``,closable:!1,class:`mb-16`},{default:C(()=>[n(a,{size:`small`,onClick:Z},{default:C(()=>[...r[10]||=[o(`重试`,-1)]]),_:1})]),_:1},8,[`title`])):b(``,!0),n(M,{shadow:`never`},{default:C(()=>[x(`div`,qe,[n(f,{modelValue:s(S),"onUpdate:modelValue":r[0]||=e=>m(S)?S.value=e:null,placeholder:`时间范围`,clearable:``,style:{width:`114px`},onChange:s(j)},{default:C(()=>[n(l,{label:`今天`,value:`today`}),n(l,{label:`昨天`,value:`yesterday`}),n(l,{label:`前天`,value:`beforeYesterday`}),n(l,{label:`近三天`,value:`last3days`}),n(l,{label:`本周`,value:`week`}),n(l,{label:`本月`,value:`month`})]),_:1},8,[`modelValue`,`onChange`]),n(p,{modelValue:s(T),"onUpdate:modelValue":r[1]||=e=>m(T)?T.value=e:null,type:`daterange`,"value-format":`YYYY-MM-DD`,"range-separator":`至`,"start-placeholder":`开始日期`,"end-placeholder":`结束日期`,style:{width:`240px`},onChange:ye},null,8,[`modelValue`]),n(f,{modelValue:I.value,"onUpdate:modelValue":r[2]||=e=>I.value=e,placeholder:`全部状态`,clearable:``,style:{width:`106px`},onChange:$},{default:C(()=>[n(l,{label:`成功 (2xx)`,value:`2xx`}),n(l,{label:`3xx`,value:`3xx`}),n(l,{label:`4xx`,value:`4xx`}),n(l,{label:`5xx`,value:`5xx`}),n(l,{label:`错误 (4xx+)`,value:`err`})]),_:1},8,[`modelValue`]),n(f,{modelValue:L.value,"onUpdate:modelValue":r[3]||=e=>L.value=e,placeholder:`全部模型`,clearable:``,filterable:``,style:{width:`176px`},onChange:$},{default:C(()=>[(h(!0),i(E,null,w(he.value,t=>(h(),e(l,{key:t,label:t,value:t},null,8,[`label`,`value`]))),128))]),_:1},8,[`modelValue`]),n(f,{modelValue:V.value,"onUpdate:modelValue":r[4]||=e=>V.value=e,placeholder:`全部客户端`,clearable:``,filterable:``,style:{width:`130px`},onChange:$},{default:C(()=>[(h(!0),i(E,null,w(_e.value,t=>(h(),e(l,{key:t,label:t,value:t},null,8,[`label`,`value`]))),128))]),_:1},8,[`modelValue`]),n(_,{modelValue:H.value,"onUpdate:modelValue":r[5]||=e=>H.value=e,class:`session-input`,placeholder:`Session ID(前缀匹配)`,clearable:``,onKeyup:D($,[`enter`])},null,8,[`modelValue`]),n(A,{class:`view-switch push-right`},{default:C(()=>[n(O,{content:`按会话分组`,placement:`top`,"show-after":300},{default:C(()=>[n(a,{type:W.value===`session`?`primary`:`default`,icon:s(te),"aria-label":`按会话分组`,onClick:r[6]||=e=>Ce(`session`)},null,8,[`type`,`icon`])]),_:1}),n(O,{content:`列表`,placement:`top`,"show-after":300},{default:C(()=>[n(a,{type:W.value===`list`?`primary`:`default`,icon:s(k),"aria-label":`列表视图`,onClick:r[7]||=e=>Ce(`list`)},null,8,[`type`,`icon`])]),_:1})]),_:1}),n(a,{type:`primary`,onClick:$},{default:C(()=>[...r[11]||=[o(`搜索`,-1)]]),_:1}),n(a,{onClick:Ee},{default:C(()=>[...r[12]||=[o(`重置`,-1)]]),_:1})])]),_:1}),n(M,{shadow:`never`,class:`mt-16 table-card`},{default:C(()=>[x(`div`,Je,[W.value===`list`?v((h(),e(ne,{key:0,data:G.value,stripe:``,height:`100%`,class:`dense-table`},{default:C(()=>[n(N,{prop:`id`,label:`ID`,width:`66`,align:`center`},{default:C(({row:e})=>[e.id==null?(h(),i(`span`,Xe,`-`)):(h(),i(`span`,{key:0,class:`request-id`,title:`点击复制(日志 id 同时是响应头 x-request-id,可用于关联控制台日志与检索)`,onClick:t=>s(u)(String(e.id))},g(e.id),9,Ye))]),_:1}),n(N,{prop:`time`,label:`时间`,width:`96`,align:`center`},{default:C(({row:e})=>[x(`div`,null,g(s(z)(e.time)),1),x(`div`,Ze,g(s(U)(e.time)),1)]),_:1}),n(N,{prop:`model`,label:`模型`,"min-width":`150`,align:`center`,"show-overflow-tooltip":``}),n(N,{label:`客户端`,"min-width":`96`,align:`center`},{default:C(({row:e})=>[e.client||e.user_agent?(h(),i(`span`,{key:0,class:`request-id`,title:s(oe)(e),onClick:t=>s(u)(e.user_agent||e.client)},g(s(R)(e)),9,Qe)):(h(),i(`span`,$e,`-`))]),_:1}),n(N,{label:`Session`,width:`88`,align:`center`},{default:C(({row:e})=>[e.session_id?(h(),i(`span`,{key:0,class:`request-id`,title:`${e.session_id}(点击复制)`,onClick:t=>s(u)(e.session_id)},g(s(le)(e.session_id)),9,et)):(h(),i(`span`,tt,`-`))]),_:1}),n(N,{label:`输入`,width:`84`,align:`center`},{default:C(({row:e})=>[o(g(s(B)(e.input_tokens??0)),1)]),_:1}),n(N,{label:`输出`,width:`78`,align:`center`},{default:C(({row:e})=>[o(g(s(B)(e.output_tokens??0)),1)]),_:1}),n(N,{label:`缓存读取`,width:`84`,align:`center`},{default:C(({row:e})=>[o(g(s(B)(e.cache_read_tokens??0)),1)]),_:1}),n(N,{label:`缓存命中率`,width:`88`,align:`center`},{default:C(({row:e})=>[x(`span`,null,g(s(ie)(e)),1)]),_:1}),n(N,{label:`请求耗时`,width:`74`,align:`center`},{default:C(({row:e})=>[o(g(s(K)(e.duration)),1)]),_:1}),n(N,{label:`速度`,width:`96`,align:`center`},{default:C(({row:e})=>[x(`div`,{title:s(ce)},g(s(se)(e.tps)),9,nt),e.ttft==null?b(``,!0):(h(),i(`div`,{key:0,class:`cell-sub`,title:s(ae)},`首 `+g(s(K)(e.ttft)),9,rt))]),_:1}),n(N,{prop:`status`,label:`状态`,width:`60`,align:`center`},{default:C(({row:e})=>[n(P,{size:`small`,type:e.status>=400?`danger`:e.status>=300?`warning`:`success`},{default:C(()=>[o(g(e.status),1)]),_:2},1032,[`type`])]),_:1}),n(N,{label:`详情`,width:`52`,align:`center`,fixed:`right`},{default:C(({row:e})=>[n(a,{link:``,type:`primary`,onClick:t=>me(e)},{default:C(()=>[...r[13]||=[o(`查看`,-1)]]),_:1},8,[`onClick`])]),_:1})]),_:1},8,[`data`])),[[re,X.value]]):b(``,!0),W.value===`session`?(h(),e(Ge,{key:1,groups:ue.value,"no-session":de.value,loading:X.value,"filter-params":xe.value,onOpenDetail:me},null,8,[`groups`,`no-session`,`loading`,`filter-params`])):b(``,!0)]),x(`div`,it,[n(a,{type:`danger`,plain:``,size:`small`,loading:Q.value,disabled:we.value===0,onClick:Te},{default:C(()=>[...r[14]||=[o(`清理已筛选日志`,-1)]]),_:1},8,[`loading`,`disabled`]),n(F,{class:`push-right`,"current-page":J.value,"onUpdate:currentPage":r[8]||=e=>J.value=e,"page-size":Y.value,"onUpdate:pageSize":r[9]||=e=>Y.value=e,total:q.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}),n(Me,{ref_key:`logDetailRef`,ref:pe},null,512)])}}}),[[`__scopeId`,`data-v-8caf26b0`]]);export{at as default};
|
|
@@ -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,m as te,mt as h,nt as g,s as _,vt as v,w as y,x as ne}from"./router-DxY62FPf.js";import{W as re}from"./message-JXw_u_ps.js";import{n as b,t as x}from"./index-DVkpGX_l.js";import{t as ie}from"./useManagerApi-7t9qNB2C.js";import{t as S}from"./src-DLq1gsLr.js";import{t as ae}from"./useToast-DgnKZwIF.js";async function C(e,t={}){return await _.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)}v();var k=`https://raw.githubusercontent.com/magpie-community/plugins/main/registry.json`,A=[`https://gh-proxy.com/${k}`,`https://ghfast.top/${k}`,k],oe=1e4,se=`plugin_market_cache`,j=1,ce=216e5,le=36e5,ue=[`provider`];function M(){try{let e=localStorage.getItem(se);if(e===null)return null;let t=JSON.parse(e);if(t.version!==j||!Array.isArray(t.entries))return null;let n=t.fetchedAt;return n===void 0||typeof n.at!=`number`?null:{version:j,entries:t.entries.filter(L),fetchedAt:n}}catch{return null}}function N(e,t){try{let n={version:j,entries:e,fetchedAt:t};localStorage.setItem(se,JSON.stringify(n))}catch{}}function P(e){return typeof e==`string`&&e.trim()!==``?e.trim():null}function F(e){if(typeof e!=`object`||!e||Array.isArray(e))return null;let t=e;return P(t.zh)??P(t.en)}function I(e){switch(e){case`provider`:case`middleware`:case`agent`:case`tools`:case`page`:return e;default:return`provider`}}function de(e){return ue.includes(e)}function L(e){if(typeof e!=`object`||!e)return!1;let t=e.kind;return typeof t==`string`&&de(t)}function R(e){let t=P(e.package);if(t===null)return null;let n=Array.isArray(e.providers)?e.providers.filter(e=>typeof e==`string`):[];return{package:t,name:P(e.name)??t,icon:P(e.icon),providers:n,community:P(e.community),summary:F(e.summary),kind:I(e.kind),replaces:P(e.replaces),version:null,license:null,description:null,homepage:null,weeklyDownloads:null}}var z=new Map,B=new Map;async function fe(e){let t=z.get(e);if(t!==void 0&&Date.now()-t.at<le)return t.meta;try{let t=await E(`https://registry.npmjs.org/${encodeURIComponent(e)}`),n={version:P(t[`dist-tags`]?.latest),license:P(t.license),description:P(t.description),homepage:P(t.homepage)};return z.set(e,{at:Date.now(),meta:n}),n}catch{return{version:null,license:null,description:null,homepage:null}}}async function pe(e){let t=B.get(e);if(t!==void 0&&Date.now()-t.at<le)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 B.set(e,{at:Date.now(),downloads:n}),n}catch{return null}}async function me(){let e=[];for(let t of A)try{let e=await E(t,{timeoutMs:oe});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 he(e){let{registry:t,source:n}=await me(),r=t.plugins;if(!Array.isArray(r))throw Error(`清单格式不是预期形状(缺 plugins 数组):${k}`);let i=r.map(e=>typeof e==`object`&&e?R(e):null).filter(L).sort((e,t)=>e.package.localeCompare(t.package)),a=0;return await Promise.all(i.map(async t=>{let[n,r]=await Promise.all([fe(t.package),pe(t.package)]);Object.assign(t,n,{weeklyDownloads:r}),a+=1,e?.(a,i.length)})),{entries:i,source:n}}var V=s([]),H=s(!1),U=s(null),ge=s({loaded:0,total:0}),W=s(null),G=s(!1),K=null;function q(e,t){JSON.stringify(e)!==JSON.stringify(V.value)&&(V.value=e),W.value=t,N(e,t)}async function _e(e={}){let t=e.force===!0,n=V.value.length===0?M():null;n!==null&&(V.value=n.entries,W.value=n.fetchedAt);let r=V.value.length>0,i=W.value,a=i!==null&&Date.now()-i.at<ce;if(!(!t&&r&&a)){if(K!==null){if(t)await K;else return}if(t||!r){H.value=!0,G.value=!1,ge.value={loaded:0,total:0};try{let e=await he((e,t)=>{ge.value={loaded:e,total:t}});q(e.entries,{source:e.source,at:Date.now()}),U.value=null}catch(e){U.value=`插件市场清单加载失败:${e instanceof Error?e.message:String(e)}`}finally{H.value=!1}return}G.value=!0,K=(async()=>{try{let e=await he();q(e.entries,{source:e.source,at:Date.now()}),U.value=null,G.value=!1}catch(e){S(`[plugin-market] 后台刷新失败,继续用缓存:${e instanceof Error?e.message:String(e)}`)}finally{K=null}})()}}function ve(){return{entries:V,loading:H,marketError:U,progress:ge,fetchedAt:W,stale:G,loadMarket:_e}}c(),v(),l(),te();var ye={class:`page-head`},be={class:`page-head-actions`},xe={class:`flex-between`},Se={class:`muted-sm`},Ce={key:0,class:`loading-block`},we={key:1,class:`loading-block`},Te={key:2,class:`plugin-grid`},Ee={class:`card-top`},De={class:`plugin-icon`},Oe=[`src`,`alt`,`onError`],ke={key:1},Ae={class:`plugin-titles`},je=[`title`],Me={class:`plugin-tags`},Ne={class:`plugin-action`},Pe=[`title`],Fe={class:`plugin-meta`},Ie={key:0},Le={key:1,class:`mono`},Re={key:2,class:`muted-disabled`},ze={class:`mono`},Be={key:0,class:`muted-sm`},Ve={class:`mono`},He={class:`mono`},Ue={class:`mono muted-12`},We={class:`method-list`},Ge={class:`muted-sm`},Ke={key:0,class:`muted-sm`},qe={class:`muted-sm`},Je={class:`muted-sm`},Ye={key:0,class:`mt-8`},Xe=[`href`],Ze={key:2,class:`muted-sm mt-8`},Qe=x(n({__name:`PluginsView`,setup(n){let{toast:c}=ae(),l=s(!0),te=s(`服务未由 ezllm 主进程托管(源码运行模式);请用 ezllm 启动服务`),_=s(!1),v=s(!1),x=s(null),S=s(!1),C=s(!0),w=s(!1),{entries:k,loading:A,marketError:oe,progress:se,fetchedAt:j,stale:ce,loadMarket:le}=ve(),ue=s(new Set),M=s([]),N=s(null),P=s(!1),F=s(``),I=s(!1),de=s(!1),L=s({}),R=s(!1),z=s(!0),B=i(()=>v.value&&x.value!==null),fe=e=>M.value.some(t=>t.package===e.package),pe=e=>e.icon===null||ue.value.has(e.package)?null:/^https?:\/\//i.test(e.icon)?e.icon:null,me=e=>e.icon!==null&&!/^https?:\/\//i.test(e.icon)?e.icon:(e.name.charAt(0)||`?`).toUpperCase(),he=e=>{ue.value=new Set(ue.value).add(e.package)},V=e=>e>=1e3?`${(e/1e3).toFixed(e>=1e4?0:1)}k`:String(e),H=async()=>{try{let e=await ie.plugins();l.value=!0,_.value=e.enabled,C.value=e.autoUpdate,v.value=e.running,x.value=e.port}catch(e){if(typeof e?.message==`string`&&e.message.includes(`未由 ezllm 主进程托管`)){l.value=!1,te.value=e.message,_.value=!1,C.value=!1,v.value=!1,x.value=null;return}throw e}},U=async()=>{if(!B.value){M.value=[];return}let e=x.value;if(e!==null)try{let t=await E(T(e,`/packages`));M.value=Array.isArray(t.packages)?t.packages:[]}catch{M.value=[]}},ge=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()},W=i(()=>{if(A.value)return`正在加载 ${String(se.value.loaded)}/${String(se.value.total)}…`;let e=j.value===null?``:ge(j.value.at),t=e===``?``:` · ${e}更新`,n=ce.value?` · 更新中…`:``;return`${String(k.value.length)} 个插件 · 已装 ${String(M.value.length)} 个${t}${n}`}),G=async(e=!1)=>{await le({force:e})},K=async()=>{try{await H()}catch(e){oe.value=e?.message??`插件服务状态加载失败`;return}await U(),await G()},q=async e=>{S.value=!0;try{let t=await ie.setPluginEnabled(e);_.value=t.enabled,v.value=t.running,x.value=t.port,c(e?`插件服务已开启`:`插件服务已关闭`,`success`),await U()}catch(e){await H().catch(()=>void 0),c(e?.message??`操作失败`,`error`)}finally{S.value=!1}},_e=async e=>{if(e){await q(!0);return}try{await b.confirm(`关闭插件服务?已装插件保留,但插件模型的请求将不可用。`,`关闭确认`,{confirmButtonText:`关闭`,cancelButtonText:`取消`,type:`warning`})}catch{await H().catch(()=>void 0);return}await q(!1)},Qe=async e=>{let t=!!e;w.value=!0;try{let e=await ie.setPluginAutoUpdate(t);C.value=e.autoUpdate,c(t?`已开启插件自动更新`:`已关闭插件自动更新`,`success`)}catch(e){await H().catch(()=>void 0),c(e?.message??`操作失败`,`error`)}finally{w.value=!1}},$e=async e=>{await tt(e.package)},et=async()=>{let e=F.value.trim();if(e!==``){de.value=!0;try{await tt(e),P.value=!1,F.value=``}finally{de.value=!1}}},tt=async e=>{let t=x.value;if(t===null){c(`插件服务未开启`,`error`);return}N.value=e;try{(await D(T(t,`/packages`),{package:e})).loaded===!1?c(`${e} 已安装但未加载成功(重启插件服务或查看日志)`,`warning`):c(`已安装 ${e}`,`success`),await U()}catch(e){c(e?.message??`安装失败`,`error`)}finally{N.value=null}},nt=async e=>{let t=x.value;if(t!==null){try{await b.confirm(`确定卸载 ${e}?该插件提供的模型将不可用。`,`确认卸载`,{confirmButtonText:`卸载`,cancelButtonText:`取消`,type:`warning`})}catch{return}N.value=e;try{await O(T(t,`/packages/${encodeURIComponent(e)}`)),c(`已卸载 ${e}`,`success`),await U()}catch(e){c(e?.message??`卸载失败`,`error`)}finally{N.value=null}}},rt=()=>{F.value=``,P.value=!0},it=async()=>{await U(),I.value=!0},at=i(()=>B.value?z.value?`检查已装插件是否有新版本`:`宿主当前无法检查更新`:`插件服务未开启`),ot=e=>{let t=L.value[e];return!t||!t.updateAvailable||!t.latest?null:`${t.current} → ${t.latest}`},st=async(e=!1)=>{let t=x.value;if(t===null){e||c(`插件服务未开启`,`error`);return}R.value=!0;try{let n=await E(T(t,`/packages/updates`)),r=Array.isArray(n.packages)?n.packages:[];z.value=n.canCheck;let i={};for(let e of r)i[e.package]=e;if(L.value=i,e)return;if(!n.canCheck){c(`宿主当前无法检查更新`,`warning`);return}let a=r.filter(e=>e.updateAvailable).length;c(a>0?`发现 ${String(a)} 个插件有新版本`:`全部插件已是最新`,`success`)}catch(t){e||c(t?.message??`检查更新失败`,`error`)}finally{R.value=!1}},ct=async e=>{let t=x.value,n=L.value[e]?.latest;if(t===null){c(`插件服务未开启`,`error`);return}if(n!=null){N.value=e;try{await D(T(t,`/packages`),{package:e,version:n});let r=await ie.restartPlugins();v.value=r.running,x.value=r.port,c(`已更新到 ${n} 并重启插件服务`,`success`),delete L.value[e],await U(),await st(!0)}catch(e){c(e?.message??`更新失败`,`error`)}finally{N.value=null}}},lt=s(null),ut=s(!1),dt=s(``),ft=s([]),pt=s(!1),mt=s(``),ht=s(``),gt=s(``),J=s(null),Y=s(!1),_t=s(``),vt=s(``),yt=s(``),bt=s(``),xt=s(void 0),St=s({}),X=s(null),Ct=s(!1),Z=s(!1),wt=s(``),Tt=s([]),Q=s({}),Et=s(void 0),$=s(null),Dt=s(!1),Ot=(e,t)=>{ht.value=e,mt.value=t.url??``,gt.value=t.instructions??``,J.value=null,pt.value=!0},kt=async e=>{let t=x.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){J.value=e?.message??`查询登录状态失败`;return}if(r.state===`success`){pt.value=!1,c(`已登录${r.accountId?`(${r.accountId})`:``}`,`success`),await U();return}if(r.state===`failed`){J.value=r.error??`登录失败`;return}if(Date.now()>n){J.value=`等待超时,可关闭后重新点击「登录」`;return}}},At=async(e,t,n,r)=>{let i=x.value;if(i===null){c(`插件服务未开启`,`error`);return}let a={};t!==void 0&&(a.method=t),Object.keys(n).length>0&&(a.inputs=n),r!==void 0&&r!==``&&(a.key=r);let o=await D(T(i,`/login/${encodeURIComponent(e)}`),a);if(o.needMethod===!0){dt.value=e,ft.value=o.methods,ut.value=!0;return}if(o.needInputs!==void 0&&o.needInputs.length>0){Y.value=!1,wt.value=e,Et.value=t,Tt.value=o.needInputs;let r={...o.inputs??n};for(let e of o.needInputs)r[e.key]=r[e.key]??``;Q.value=r,$.value=null,Z.value=!0;return}if(o.needKey===!0){Z.value=!1,_t.value=e,xt.value=t,vt.value=o.label??``,yt.value=o.placeholder??``,St.value={...o.inputs??n},bt.value=``,X.value=null,Y.value=!0;return}if(o.state===`success`){Z.value=!1,Y.value=!1,c(`已登录${o.accountId?`(${o.accountId})`:``}`,`success`),await U();return}if(o.state===`failed`){let e=o.error??`登录失败`;if(Y.value){X.value=e;return}if(Z.value){$.value=e;return}c(e,`error`);return}Z.value=!1,Y.value=!1,Ot(e,o),kt(e)},jt=async(e,t)=>{lt.value=e;try{await At(e,t,{})}catch(e){c(e?.message??`发起登录失败`,`error`)}finally{lt.value=null}},Mt=async e=>{ut.value=!1,await jt(dt.value,e)},Nt=async()=>{Dt.value=!0;try{await At(wt.value,Et.value,{...Q.value})}catch(e){$.value=e?.message??`提交失败`}finally{Dt.value=!1}},Pt=async()=>{if(bt.value.trim()===``){X.value=`请填写密钥`;return}Ct.value=!0,X.value=null;try{await At(_t.value,xt.value,{...St.value},bt.value)}catch(e){X.value=e?.message??`提交失败`}finally{Ct.value=!1}};return ee(K),(n,i)=>{let s=f(`el-switch`),c=f(`el-button`),ee=f(`el-icon`),b=f(`el-alert`),x=f(`el-tag`),ie=f(`el-card`),ae=f(`el-input`),T=f(`el-form-item`),E=f(`el-form`),D=f(`el-dialog`),O=f(`el-table-column`),se=f(`el-table`),j=f(`el-option`),ce=f(`el-select`);return u(),r(`div`,null,[m(`div`,ye,[i[22]||=m(`div`,null,[m(`div`,{class:`page-head-title`},`插件`),m(`div`,{class:`page-head-sub`},` 订阅社区 OpenCode 插件——把订阅账号(CodeBuddy、智谱 Coding Plan 等)当作供应商接入网关 `)],-1),m(`div`,be,[t(s,{modelValue:_.value,"onUpdate:modelValue":i[0]||=e=>_.value=e,loading:S.value,disabled:!l.value||S.value,"active-text":`插件服务`,"inline-prompt":``,onChange:_e},null,8,[`modelValue`,`loading`,`disabled`]),t(s,{modelValue:C.value,"onUpdate:modelValue":i[1]||=e=>C.value=e,loading:w.value,disabled:!l.value||w.value,"active-text":`自动更新`,"inline-prompt":``,title:`插件会在后台每小时检查并更新`,onChange:Qe},null,8,[`modelValue`,`loading`,`disabled`]),t(c,{disabled:!v.value,onClick:it},{default:h(()=>[...i[19]||=[a(`已装插件`,-1)]]),_:1},8,[`disabled`]),t(c,{disabled:!v.value,onClick:rt},{default:h(()=>[t(ee,null,{default:h(()=>[t(o(re))]),_:1}),i[20]||=a(` 手动安装 `,-1)]),_:1},8,[`disabled`]),t(c,{loading:o(A),onClick:i[2]||=e=>G(!0)},{default:h(()=>[...i[21]||=[a(`刷新`,-1)]]),_:1},8,[`loading`])])]),l.value?v.value?p(``,!0):(u(),e(b,{key:1,type:`info`,"show-icon":``,closable:!1,class:`mb-16`,title:`插件服务未开启`},{default:h(()=>[i[24]||=m(`div`,{class:`muted-sm`},`开启后即可安装并加载插件;下方清单仍可浏览。`,-1),t(c,{size:`small`,type:`primary`,class:`mt-8`,loading:S.value,onClick:i[3]||=e=>q(!0)},{default:h(()=>[...i[23]||=[a(` 开启插件服务 `,-1)]]),_:1},8,[`loading`])]),_:1})):(u(),e(b,{key:0,type:`warning`,"show-icon":``,closable:!1,class:`mb-16`,title:`插件服务不可用`},{default:h(()=>[a(d(te.value),1)]),_:1})),o(oe)?(u(),e(b,{key:2,type:`error`,"show-icon":``,closable:!1,class:`mb-16`,title:o(oe)},{default:h(()=>[t(c,{size:`small`,onClick:G},{default:h(()=>[...i[25]||=[a(`重试`,-1)]]),_:1})]),_:1},8,[`title`])):p(``,!0),t(ie,{shadow:`never`},{header:h(()=>[m(`div`,xe,[i[26]||=m(`span`,{class:`fw-600`},`社区插件`,-1),m(`span`,Se,d(W.value),1)])]),default:h(()=>[o(A)&&o(k).length===0?(u(),r(`div`,Ce,`正在从社区清单加载…`)):o(k).length===0?(u(),r(`div`,we,` 清单里没有本宿主支持的插件(只收 provider 类),可点右上角「刷新」重试,或用「手动安装」直接按包名安装。 `)):(u(),r(`div`,Te,[(u(!0),r(y,null,g(o(k),t=>(u(),r(`div`,{key:t.package,class:`plugin-card`},[m(`div`,Ee,[m(`div`,De,[pe(t)?(u(),r(`img`,{key:0,src:pe(t),alt:t.name,onError:e=>he(t)},null,40,Oe)):(u(),r(`span`,ke,d(me(t)),1))]),m(`div`,Ae,[m(`div`,{class:`plugin-name`,title:t.name},d(t.name),9,je),m(`div`,Me,[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`,Ne,[fe(t)?(u(),e(x,{key:0,type:`success`,size:`small`,"disable-transitions":``},{default:h(()=>[...i[27]||=[a(`已装`,-1)]]),_:1})):(u(),e(c,{key:1,type:`primary`,size:`small`,disabled:!B.value||N.value===t.package,loading:N.value===t.package,onClick:e=>$e(t)},{default:h(()=>[...i[28]||=[a(` 安装 `,-1)]]),_:1},8,[`disabled`,`loading`,`onClick`]))])]),m(`div`,{class:`plugin-summary`,title:t.summary??``},d(t.summary??`(清单未提供简介)`),9,Pe),m(`div`,Fe,[m(`span`,null,`供应商 `+d(t.providers.length),1),t.weeklyDownloads===null?p(``,!0):(u(),r(`span`,Ie,d(V(t.weeklyDownloads))+`/周`,1)),t.version?(u(),r(`span`,Le,`v`+d(t.version),1)):(u(),r(`span`,Re,`版本未知`))])]))),128))]))]),_:1}),t(D,{modelValue:P.value,"onUpdate:modelValue":i[6]||=e=>P.value=e,title:`手动安装插件`,width:`520px`},{footer:h(()=>[t(c,{onClick:i[5]||=e=>P.value=!1},{default:h(()=>[...i[30]||=[a(`取消`,-1)]]),_:1}),t(c,{type:`primary`,loading:de.value,disabled:F.value.trim()===``,onClick:et},{default:h(()=>[...i[31]||=[a(` 安装 `,-1)]]),_:1},8,[`loading`,`disabled`])]),default:h(()=>[t(E,{"label-position":`top`},{default:h(()=>[t(T,{label:`npm 包名`},{default:h(()=>[t(ae,{modelValue:F.value,"onUpdate:modelValue":i[4]||=e=>F.value=e,placeholder:`例:@magpie-community/opencode-workbuddy-auth`,clearable:``},null,8,[`modelValue`]),i[29]||=m(`div`,{class:`muted-sm`},[a(`可带版本(`),m(`span`,{class:`mono`},`name@1.2.3`),a(`);清单加载不出来时用这个。`)],-1)]),_:1})]),_:1})]),_:1},8,[`modelValue`]),t(D,{modelValue:I.value,"onUpdate:modelValue":i[9]||=e=>I.value=e,title:`已装插件`,width:`880px`},{footer:h(()=>[t(c,{disabled:!B.value||!z.value||N.value!==null,loading:R.value,title:at.value,onClick:i[7]||=e=>st()},{default:h(()=>[...i[39]||=[a(`检查更新`,-1)]]),_:1},8,[`disabled`,`loading`,`title`]),t(c,{onClick:i[8]||=e=>I.value=!1},{default:h(()=>[...i[40]||=[a(`关闭`,-1)]]),_:1})]),default:h(()=>[t(se,{data:M.value,"empty-text":`尚未安装任何插件`},{default:h(()=>[t(O,{label:`包名`,"min-width":`190`},{default:h(({row:e})=>[m(`div`,ze,d(e.package),1)]),_:1}),t(O,{label:`供应商`,"min-width":`200`},{default:h(({row:n})=>[n.providers.length?p(``,!0):(u(),r(`div`,Be,`-`)),(u(!0),r(y,null,g(n.providers,n=>(u(),r(`div`,{key:n.id,class:`provider-line`},[m(`span`,Ve,d(n.id),1),n.signedIn?(u(),e(x,{key:0,type:`success`,size:`small`,"disable-transitions":``},{default:h(()=>[...i[32]||=[a(`已登录`,-1)]]),_:1})):(u(),r(y,{key:1},[i[34]||=m(`span`,{class:`muted-sm`},`未登录`,-1),t(c,{link:``,type:`primary`,size:`small`,loading:lt.value===n.id,onClick:e=>jt(n.id)},{default:h(()=>[...i[33]||=[a(` 登录 `,-1)]]),_:1},8,[`loading`,`onClick`])],64))]))),128))]),_:1}),t(O,{label:`版本`,width:`110`},{default:h(({row:e})=>[m(`span`,He,d(e.version||`-`),1)]),_:1}),t(O,{label:`更新`,width:`150`},{default:h(({row:e})=>[ot(e.package)?(u(),r(y,{key:0},[m(`div`,Ue,d(ot(e.package)),1),t(c,{link:``,type:`primary`,size:`small`,disabled:N.value!==null||R.value,loading:N.value===e.package,onClick:t=>ct(e.package)},{default:h(()=>[...i[35]||=[a(`更新`,-1)]]),_:1},8,[`disabled`,`loading`,`onClick`])],64)):p(``,!0)]),_:1}),t(O,{label:`状态`,width:`90`,align:`center`},{default:h(({row:t})=>[t.loaded?(u(),e(x,{key:0,type:`success`,size:`small`,"disable-transitions":``},{default:h(()=>[...i[36]||=[a(`已加载`,-1)]]),_:1})):(u(),e(x,{key:1,type:`danger`,size:`small`,"disable-transitions":``},{default:h(()=>[...i[37]||=[a(`加载失败`,-1)]]),_:1}))]),_:1}),t(O,{label:`操作`,width:`90`,align:`center`},{default:h(({row:e})=>[t(c,{link:``,type:`danger`,loading:N.value===e.package,onClick:t=>nt(e.package)},{default:h(()=>[...i[38]||=[a(`卸载`,-1)]]),_:1},8,[`loading`,`onClick`])]),_:1})]),_:1},8,[`data`])]),_:1},8,[`modelValue`]),t(D,{modelValue:ut.value,"onUpdate:modelValue":i[11]||=e=>ut.value=e,title:`选择登录方式`,width:`460px`},{footer:h(()=>[t(c,{onClick:i[10]||=e=>ut.value=!1},{default:h(()=>[...i[41]||=[a(`取消`,-1)]]),_:1})]),default:h(()=>[i[42]||=m(`div`,{class:`muted-sm`},`该插件提供多种登录方式,选一种:`,-1),m(`div`,We,[(u(!0),r(y,null,g(ft.value,t=>(u(),e(c,{key:t.label,class:`method-btn`,onClick:e=>Mt(t.label)},{default:h(()=>[a(d(t.label||t.type),1)]),_:2},1032,[`onClick`]))),128))])]),_:1},8,[`modelValue`]),t(D,{modelValue:Z.value,"onUpdate:modelValue":i[13]||=e=>Z.value=e,title:`登录 ${wt.value}`,width:`480px`},{footer:h(()=>[t(c,{onClick:i[12]||=e=>Z.value=!1},{default:h(()=>[...i[43]||=[a(`取消`,-1)]]),_:1}),t(c,{type:`primary`,loading:Dt.value,onClick:Nt},{default:h(()=>[...i[44]||=[a(`确定`,-1)]]),_:1},8,[`loading`])]),default:h(()=>[(u(!0),r(y,null,g(Tt.value,t=>(u(),r(`div`,{key:t.key,class:`field-row`},[m(`div`,Ge,d(t.message||t.key),1),t.type===`select`?(u(),e(ce,{key:0,modelValue:Q.value[t.key],"onUpdate:modelValue":e=>Q.value[t.key]=e,class:`mt-8`,placeholder:`请选择`,style:{width:`100%`}},{default:h(()=>[(u(!0),r(y,null,g(t.options,t=>(u(),e(j,{key:t.value,label:t.label??t.value,value:t.value??``},{default:h(()=>[m(`span`,null,d(t.label??t.value),1),t.hint?(u(),r(`span`,Ke,`(`+d(t.hint)+`)`,1)):p(``,!0)]),_:2},1032,[`label`,`value`]))),128))]),_:2},1032,[`modelValue`,`onUpdate:modelValue`])):(u(),e(ae,{key:1,modelValue:Q.value[t.key],"onUpdate:modelValue":e=>Q.value[t.key]=e,class:`mt-8`,placeholder:t.placeholder||``,onKeyup:ne(Nt,[`enter`])},null,8,[`modelValue`,`onUpdate:modelValue`,`placeholder`]))]))),128)),$.value?(u(),e(b,{key:0,type:`error`,"show-icon":``,closable:!1,class:`mt-8`,title:$.value},null,8,[`title`])):p(``,!0)]),_:1},8,[`modelValue`,`title`]),t(D,{modelValue:Y.value,"onUpdate:modelValue":i[16]||=e=>Y.value=e,title:`登录 ${_t.value}`,width:`480px`},{footer:h(()=>[t(c,{onClick:i[15]||=e=>Y.value=!1},{default:h(()=>[...i[45]||=[a(`取消`,-1)]]),_:1}),t(c,{type:`primary`,loading:Ct.value,onClick:Pt},{default:h(()=>[...i[46]||=[a(`确定`,-1)]]),_:1},8,[`loading`])]),default:h(()=>[m(`div`,qe,d(vt.value||`该登录方式需要一枚密钥`),1),t(ae,{modelValue:bt.value,"onUpdate:modelValue":i[14]||=e=>bt.value=e,class:`mt-8`,placeholder:yt.value||`粘贴密钥`,"show-password":``,onKeyup:ne(Pt,[`enter`])},null,8,[`modelValue`,`placeholder`]),X.value?(u(),e(b,{key:0,type:`error`,"show-icon":``,closable:!1,class:`mt-8`,title:X.value},null,8,[`title`])):p(``,!0)]),_:1},8,[`modelValue`,`title`]),t(D,{modelValue:pt.value,"onUpdate:modelValue":i[18]||=e=>pt.value=e,title:`登录 ${ht.value}`,width:`480px`},{footer:h(()=>[t(c,{onClick:i[17]||=e=>pt.value=!1},{default:h(()=>[...i[48]||=[a(`关闭`,-1)]]),_:1})]),default:h(()=>[m(`div`,Je,d(gt.value||`正在读取本机已登录的凭据…`),1),mt.value?(u(),r(`div`,Ye,[m(`a`,{class:`el-button el-button--primary`,href:mt.value,target:`_blank`,rel:`noopener`},` 打开登录页 `,8,Xe),i[47]||=m(`div`,{class:`muted-sm mt-8`},`在打开的页面完成登录即可,本页会自动检测(最长等待几分钟)。`,-1)])):p(``,!0),J.value?(u(),e(b,{key:1,type:`error`,"show-icon":``,closable:!1,class:`mt-8`,title:J.value},null,8,[`title`])):(u(),r(`div`,Ze,`等待登录完成…`))]),_:1},8,[`modelValue`,`title`])])}}}),[[`__scopeId`,`data-v-45469a71`]]);export{Qe as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
.plugin-grid[data-v-45469a71]{grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:16px;display:grid}.plugin-card[data-v-45469a71]{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-45469a71]:hover{border-color:var(--el-color-primary-light-5)}.card-top[data-v-45469a71]{align-items:flex-start;gap:12px;display:flex}.plugin-icon[data-v-45469a71]{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-45469a71]{object-fit:contain;width:100%;height:100%}.plugin-titles[data-v-45469a71]{flex:1;min-width:0}.plugin-name[data-v-45469a71]{text-overflow:ellipsis;white-space:nowrap;font-size:14px;font-weight:600;overflow:hidden}.plugin-tags[data-v-45469a71]{flex-wrap:wrap;gap:6px;margin-top:4px;display:flex}.plugin-action[data-v-45469a71]{flex-shrink:0}.plugin-summary[data-v-45469a71]{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-45469a71]{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-45469a71]{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}.provider-line[data-v-45469a71]{align-items:center;gap:8px;display:flex}.provider-line[data-v-45469a71]:not(:last-child){margin-bottom:4px}.method-list[data-v-45469a71]{flex-direction:column;gap:8px;margin-top:12px;display:flex}.method-btn[data-v-45469a71]{justify-content:flex-start;margin-left:0}.field-row[data-v-45469a71]:not(:first-child){margin-top:12px}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
var e=e=>String(e).padStart(2,`0`),t=t=>{let n=t=>`${t.getFullYear()}-${e(t.getMonth()+1)}-${e(t.getDate())}`,r=new Date,i=new Date(r),a=r;if(t!==`today`){if(t===`yesterday`)i.setDate(r.getDate()-1),a=i;else if(t===`beforeYesterday`)i.setDate(r.getDate()-2),a=i;else if(t===`last3days`)i.setDate(r.getDate()-2);else if(t===`week`)i.setDate(r.getDate()-(r.getDay()+6)%7);else if(t===`month`)i.setDate(1);else return null}return[n(i),n(a)]},n=e=>{if(e.name)return e.name;if(e.alias)return e.alias;let t=e.apiKey||``;if(!t)return`-`;if(t.length<=8)return t;let n=Math.min(6,Math.floor(t.length/4));return`${t.substring(0,n)}...${t.substring(t.length-n)}`},r=e=>{if(!e)return null;let t=new Date(e);return Number.isNaN(t.getTime())?null:t},i=t=>{let n=r(t);return n===null?`-`:`${n.getFullYear()}-${e(n.getMonth()+1)}-${e(n.getDate())} ${e(n.getHours())}:${e(n.getMinutes())}:${e(n.getSeconds())}`},a=t=>{let n=r(t);return n===null?`-`:`${n.getFullYear()}-${e(n.getMonth()+1)}-${e(n.getDate())}`},o=t=>{let n=r(t);return n===null?`-`:`${e(n.getHours())}:${e(n.getMinutes())}:${e(n.getSeconds())}`},s=e=>e?typeof e==`string`?e:JSON.stringify(e,null,2):`-`,c=e=>{if(!e)return`-`;try{return JSON.stringify(JSON.parse(e),null,2)}catch{return e}},l=e=>{let t=e??0;return(Number.isFinite(t)?t:0).toLocaleString()},u=({protocol:e,hostname:t,port:n})=>`${e===`https:`?`https:`:`http:`}//${t}${n?`:${n}`:``}`,d=e=>e==null||e<=0?`-`:e>=1e3?(e/1e3).toFixed(2)+`s`:Math.round(e)+`ms`,f=e=>e==null?`-`:e<1e3?`${String(e)}ms`:`${(e/1e3).toFixed(1)}s`,p=e=>typeof e!=`number`||!Number.isFinite(e)||e<=0?`-`:`${e.toFixed(1)} tok/s`,m=`首 token 延迟:请求进入网关 → 上游首个响应数据块到达(仅流式请求有观测点)`,h=`生成速度:输出 token ÷ 生成窗口。流式 = 首 token 后到流结束;非流式无更细观测点,按总耗时近似`,g=e=>{let t=e.input_tokens||0,n=e.cache_read_tokens||0;return t<=0?`-`:(n/t*100).toFixed(1)+`%`},_=(e,t=262144)=>{let n=e??``;return n.length<=t?n:`${n.slice(0,t)}\n\n…(已省略 ${(n.length-t).toLocaleString()} 字符以保持流畅,完整内容请点上方「复制」按钮)`},v=e=>{let t=(e||``).trim();return t?t.length>8?`${t.slice(0,8)}…`:t:`-`},y=e=>e.client||e.user_agent||`-`,b=e=>e.user_agent?`${e.user_agent}(点击复制)`:`${e.client??`-`}(点击复制)`,x=e=>{let t=(e||``).split(`,`).map(e=>e.trim()).filter(Boolean).sort();return t.length===0?`-`:t.length<=2?t.join(`, `):`${t.slice(0,2).join(`, `)} +${t.length-2}`},S=e=>x(e),C=e=>x(e);export{_ as S,S as _,y as a,t as b,o as c,f as d,l as f,c as g,i as h,g as i,a as l,s as m,m as n,b as o,p,u as r,C as s,h as t,d as u,e as v,v as x,n as y};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{O as e,Tt as t,V as n,vt as r}from"./router-DxY62FPf.js";import{r as i}from"./index-DVkpGX_l.js";import{t as a}from"./config-B3YP6GMt.js";import{t as o}from"./src-DLq1gsLr.js";r(),n();var s=i(`providers`,()=>{let n=a(),r=e(()=>n.providers),i=e(()=>n.loading),s=e(()=>n.providerCount),c=e(()=>n.totalModelCount),l=t([]);function u(){try{let e=localStorage.getItem(`provider_order`);if(!e)return;let t=JSON.parse(e);if(!Array.isArray(t))return;l.value=t}catch{}}function d(){try{localStorage.setItem(`provider_order`,JSON.stringify(l.value))}catch(e){o(`[ezllm] 供应商卡片顺序持久化失败(本次会话内仍生效,刷新后回退):${e instanceof Error?e.message:String(e)}`)}}let f=e(()=>{let e=l.value.map(e=>r.value.find(t=>t.name===e)).filter(e=>!!e);for(let t of r.value)e.find(e=>e.name===t.name)||e.push(t);let t=e.map(e=>e.name);(t.length!==l.value.length||t.some((e,t)=>l.value[t]!==e))&&(l.value=t,d());let n=e=>e.enabled!==!1;return[...e.filter(n),...e.filter(e=>!n(e))]});function p(e){l.value=e.map(e=>e.name),d()}function m(e){l.value=[e,...l.value.filter(t=>t!==e)],d()}async function h(){u(),await n.load()}async function g(e){let t=n.config.providers;n.config.providers=e;try{return await n.save()}catch(e){throw n.config.providers=t,e}}async function _(e){return await g(r.value.filter(t=>t.name!==e.name))}async function v(e){return await g(r.value.map(t=>({...t,models:(t.models??[]).filter(t=>t.modelName!==e)})))}return{suppliers:r,loading:i,orderedProviders:f,providerCount:s,totalModelCount:c,loadProviders:h,saveProviders:g,deleteProvider:_,deleteModel:v,reorderProviders:p,moveProviderToTop:m}});export{s as t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
function e(e,...t){console.warn(e,...t)}export{e as t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./message-JXw_u_ps.js";function t(){function t(t,n=`success`){e({message:t,type:n,duration:n===`warning`?8e3:3e3})}return{toast:t}}export{t};
|