coding-tool-x 3.8.5 → 3.8.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/web/assets/{AgentsDrawer-BG6P3DX-.js → AgentsDrawer-C7ePByZx.js} +1 -1
- package/dist/web/assets/{Analytics--z_FmL5P.js → Analytics-BVG6ehFv.js} +1 -1
- package/dist/web/assets/{AssetPathField-CrJtRKHy.js → AssetPathField-BZI9NvEr.js} +1 -1
- package/dist/web/assets/{ChatHistoryDrawer-BiuEryJj.js → ChatHistoryDrawer-Ccl4rhdz.js} +1 -1
- package/dist/web/assets/{CollapseItem-BAYEsL_Q.js → CollapseItem-MxG_UD4o.js} +1 -1
- package/dist/web/assets/{CommandsDrawer-YJ-U7BXN.js → CommandsDrawer-DWbaxHRZ.js} +1 -1
- package/dist/web/assets/{ConfigExportDrawer-Ce_hAknW.js → ConfigExportDrawer-DrawKwxE.js} +1 -1
- package/dist/web/assets/{ConfigTemplates-Bvr1NN6K.js → ConfigTemplates-AiRPv2cd.js} +1 -1
- package/dist/web/assets/{ConfigTemplatesDrawer-BjIeHfF-.js → ConfigTemplatesDrawer-CKMFsfEF.js} +1 -1
- package/dist/web/assets/{ConfigTemplatesPanel-AV00tm_D.js → ConfigTemplatesPanel-Cvbnkvpt.js} +1 -1
- package/dist/web/assets/{FavoritesDrawer-Cz95o4CD.js → FavoritesDrawer-DA-dR_vP.js} +1 -1
- package/dist/web/assets/{GatewayConvertDrawer-DLlbMz27.js → GatewayConvertDrawer-402_raGb.js} +1 -1
- package/dist/web/assets/{Home-D7CCOFQC.js → Home-CTF8ZWKW.js} +1 -1
- package/dist/web/assets/{MarkdownEditor-rEZ-c72L.js → MarkdownEditor-BvkDECwH.js} +1 -1
- package/dist/web/assets/{McpDrawer-DfoCyxU2.js → McpDrawer-DZGHkuDm.js} +1 -1
- package/dist/web/assets/{McpFormDrawer-SKu8HNUR.js → McpFormDrawer-DPMnyt5L.js} +1 -1
- package/dist/web/assets/{PluginManager-BbeK-3rV.js → PluginManager-FKVeugr4.js} +1 -1
- package/dist/web/assets/{PluginsDrawer-CWVJ7yjS.js → PluginsDrawer-MvM1R55d.js} +1 -1
- package/dist/web/assets/{PluginsPanel-Cm2N3StG.js → PluginsPanel-CKuBs38B.js} +1 -1
- package/dist/web/assets/{ProjectList-CsjnsNPv.js → ProjectList-tsjwjXV1.js} +1 -1
- package/dist/web/assets/{PromptsDrawer-EGd3djFa.js → PromptsDrawer-B-X9ci8n.js} +1 -1
- package/dist/web/assets/{RecentSessionsDrawer-D1vtoLAs.js → RecentSessionsDrawer-wLktMF_c.js} +1 -1
- package/dist/web/assets/{SessionCard-BgLg49U3.js → SessionCard-DkJPy0TY.js} +1 -1
- package/dist/web/assets/{SessionList-TRiTklWk.js → SessionList-Gzhh4FOZ.js} +1 -1
- package/dist/web/assets/SettingsDrawer-Dw5NUgHC.css +1 -0
- package/dist/web/assets/SettingsDrawer-lMjttbkD.js +1 -0
- package/dist/web/assets/{SkillManager-BTjTUbHq.js → SkillManager-CzFxWxx-.js} +1 -1
- package/dist/web/assets/{SkillsDrawer-pN0hbkK3.js → SkillsDrawer-DF6JsSyj.js} +1 -1
- package/dist/web/assets/{SkillsPanel-gmBWEoiF.js → SkillsPanel--lLEts9y.js} +1 -1
- package/dist/web/assets/{SpeedTestDrawer-DcNzuVJk.js → SpeedTestDrawer-BaZkZqPP.js} +1 -1
- package/dist/web/assets/{Upload-v5rV0qTT.js → Upload-BEQ-3Kqq.js} +1 -1
- package/dist/web/assets/{WorkspaceDrawer-DxmicM4U.js → WorkspaceDrawer-BFSwZ5yU.js} +1 -1
- package/dist/web/assets/{WorkspaceManager-CJHCjARN.js → WorkspaceManager-BHL1uYct.js} +1 -1
- package/dist/web/assets/{WorkspacePanel-D8_Zq-du.js → WorkspacePanel-B5PooBtg.js} +1 -1
- package/dist/web/assets/{index-DnEocV0M.js → index-BFInlZGI.js} +2 -2
- package/dist/web/assets/{index-C0EHRym0.css → index-BohDDAy_.css} +1 -1
- package/dist/web/assets/{useResponsiveDrawer-B3uojyvV.js → useResponsiveDrawer-D-DDpbnI.js} +1 -1
- package/dist/web/index.html +2 -2
- package/package.json +1 -1
- package/src/commands/daemon.js +10 -0
- package/src/platforms/channel-auth-registry.js +3 -0
- package/src/platforms/channel-auth-service.js +33 -8
- package/src/platforms/native-oauth-adapters.js +11 -1
- package/src/platforms/notification-hooks.js +55 -5
- package/src/platforms/oauth-credentials-service.js +170 -41
- package/src/server/services/channel-balance.js +122 -4
- package/src/server/services/network-access.js +11 -1
- package/src/server/services/session-history-index.js +106 -11
- package/src/shared/channel-driver.js +80 -5
- package/dist/web/assets/SettingsDrawer-d5liXjHq.css +0 -1
- package/dist/web/assets/SettingsDrawer-rz2WejGY.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{i as e,s as a,t}from"./_plugin-vue_export-helper-BeLZJZij.js";import{C as s,D as l,J as r,K as n,O as i,S as o,W as u,Z as c,_t as d,at as v,b as p,et as f,g as m,ht as y,m as h,mt as g,st as k,w as b,x as w}from"./vue-vendor-BqZbbXHA.js";import{s as _}from"./client-UDwXBP9i.js";import{O as C,S as j,Z as x,at as S,et as $,it as D,lt as O,o as z,r as M,tt as U}from"./icons-B2Vg-IOC.js";import{l as P}from"./light-Cp0t7v32.js";import{a as N,c as J,i as A,l as R,n as q,o as L,r as T,s as B,t as E}from"./McpFormDrawer-SKu8HNUR.js";import{n as W,t as F}from"./useResponsiveDrawer-B3uojyvV.js";import{t as I}from"./DrawerContent-ChXgZ1Xm.js";import{$ as Z,F as K,I as Q,M as G,N as H,Nt as V,Q as X,at as Y,ct as ee,dt as ae}from"./index-DnEocV0M.js";import{t as te}from"./clipboard-B46yyoz_.js";function se(e,a,t="操作失败",s=""){const l=function(e,a="操作失败"){return String(function(e){return e?"string"==typeof e?e:e.message||e.error||e.result?.message||e.result?.error||e.response?.data?.message||e.response?.data?.error||e.response?.data?.result?.message||e.response?.data?.result?.error||e.data?.message||e.data?.error||"":""}(e)||"").trim()||a}(a,t),r=function(e){return e?.hint||e?.data?.hint||e?.result?.hint||e?.result?.data?.hint||e?.response?.data?.hint||e?.response?.data?.result?.hint||e?.response?.data?.result?.data?.hint||null}(a),n=l.split(/\r?\n/).map(e=>e.trim()).filter(Boolean),i=[r?.title,...Array.isArray(r?.details)?r.details:[]].map(e=>String(e||"").trim()).filter(Boolean).filter(e=>!n.includes(e)),o=[...n,...i],u=o[0]||t,c=o.slice(1),d=s?`${s}${u}`:u;return e.error(d,{duration:c.length>0?8e3:5e3}),c.length>0&&e.warning(c.join("\n"),{duration:12e3,closable:!0}),l}var le={class:"drawer-header"},re={class:"header-title"},ne={class:"header-actions"},ie={class:"mcp-container"},oe={class:"stats-bar"},ue={class:"stats-text"},ce={class:"server-list"},de={key:0,class:"empty-state"},ve=["onClick","onDragstart","onDragover","onDrop"],pe={class:"card-header"},fe={class:"card-title"},me={class:"server-name"},ye={class:"card-actions"},he={key:0,class:"card-desc"},ge={key:1,class:"card-tags"},ke={class:"card-apps"},be={class:"app-label"},we={class:"paste-modal-content"},_e={key:0,class:"parse-error"},Ce={class:"paste-modal-footer"},je={class:"batch-modal-content"},xe={class:"batch-actions"},Se={class:"batch-selected"},$e={class:"batch-list"},De={class:"batch-item-info"},Oe={class:"batch-item-header"},ze={class:"batch-item-name"},Me={class:"batch-item-detail"},Ue={key:0},Pe={key:1,class:"batch-args"},Ne={class:"batch-modal-footer"},Je={class:"export-modal-content"},Ae={class:"export-info"},Re={class:"export-modal-footer"},qe=t({__name:"McpDrawer",props:{visible:{type:Boolean,default:!1}},emits:["update:visible"],setup(t,{emit:qe}){const{drawerWidth:Le}=F(720),Te=t,Be=qe,Ee=p({get:()=>Te.visible,set:e=>Be("update:visible",e)}),We=k(!1),Fe=k({}),Ie=k(!1),Ze=k(null),Ke=v({}),Qe=k(null),Ge=k(null),He=k(!1),Ve=k(""),Xe=k(""),Ye=k(!1),ea=k(!1),aa=k([]),ta=k([]),sa=k(!1),la=k(!1),ra=k({format:"",content:"",filename:""}),na=k(!1),ia=k(null),oa=p(()=>Object.values(Fe.value).sort((e,a)=>void 0!==e.order&&void 0!==a.order?e.order-a.order:void 0!==e.order?-1:void 0!==a.order?1:(a.updatedAt||0)-(e.updatedAt||0))),ua=p(()=>oa.value.length),ca=p(()=>Object.keys(Fe.value)),{byCapability:da}=V(),va=p(()=>da("mcp")),pa=p(()=>{const e=oa.value;return Object.fromEntries(va.value.map(a=>[a.key,e.filter(e=>!0===e.apps?.[a.key]).length]))}),fa=p({get:()=>{const e=aa.value.filter(e=>!ka(e.id)).map(e=>e.id);return e.length>0&&e.every(e=>ta.value.includes(e))},set:()=>{}}),ma=p(()=>va.value.map(e=>({label:`同步 ${e.label||e.title||e.key} 已有配置`,key:e.key}))),ya=p(()=>[{label:"导出为 JSON (通用)",key:"json"},...va.value.filter(e=>_(e.key)).map(e=>({label:`导出为 ${e.label||e.title||e.key} 格式`,key:e.key}))]);function ha(e){return"online"===e.status?`在线 - ${ga(e.lastChecked)}`:"error"===e.status?`异常 - ${ga(e.lastChecked)}`:"testing"===e.status?"测试中...":"未测试"}function ga(e){return e?new Date(e).toLocaleString("zh-CN",{hour:"2-digit",minute:"2-digit"}):""}function ka(e){return ca.value.includes(e)}async function ba(){We.value=!0;try{const e=await A();e.success&&(Fe.value=e.servers)}catch(e){H.error("加载 MCP 服务器失败")}finally{We.value=!1}}async function wa(e){try{const a=await N(e);a.success&&(H.success(a.message),await ba())}catch(a){H.error("同步失败")}}async function _a(e){try{const a=await T(e);a.success&&(ra.value={format:a.format,content:a.content,filename:a.filename},la.value=!0)}catch(a){H.error("导出失败")}}async function Ca(){try{if("manual"===(await te(ra.value.content))?.method)return void H.warning("自动复制失败,已弹出手动复制框");H.success("已复制到剪贴板")}catch{H.error("复制失败")}}function ja(){const e=new Blob([ra.value.content],{type:"text/plain"}),a=URL.createObjectURL(e),t=document.createElement("a");t.href=a,t.download=ra.value.filename,t.click(),URL.revokeObjectURL(a),H.success("下载成功")}function xa(){Qe.value=null}function Sa(){Ze.value=null,Ie.value=!0}function $a(){ba()}function Da(){Xe.value="",Ye.value=!0;try{let t,s=Ve.value.trim();if(!s)return Xe.value="请输入配置内容",void(Ye.value=!1);s.startsWith("{")||s.startsWith("[")||(s=s.replace(/^[\s,]+/,""),s=s.replace(/[\s,]+$/,""),s=`{${s}}`);try{t=JSON.parse(s)}catch(e){let l=s.replace(/\}\s*"/g,'}, "');try{t=JSON.parse(l)}catch(a){return Xe.value="JSON 格式错误:"+e.message,void(Ye.value=!1)}}const l=[];let r=null;if(t.mcpServers&&"object"==typeof t.mcpServers)r=t.mcpServers;else if(t.mcp_servers&&"object"==typeof t.mcp_servers)r=t.mcp_servers;else if(t.command||t.url)r={"new-server":t};else{if(!Object.keys(t).some(e=>{const a=t[e];return a&&"object"==typeof a&&(a.command||a.url||a.args)}))return Xe.value="未找到有效的 MCP 服务器配置,请检查 JSON 格式",void(Ye.value=!1);r=t}for(const[e,a]of Object.entries(r)){if(!a||"object"!=typeof a)continue;if(!a.command&&!a.url&&!a.args)continue;const t={id:e,name:e,apps:Object.fromEntries(va.value.map((e,a)=>[e.key,0===a])),server:{type:a.type||"stdio"}};a.command&&(t.server.command=a.command,a.args&&(t.server.args=Array.isArray(a.args)?a.args:[a.args]),a.env&&"object"==typeof a.env&&(t.server.env=a.env)),a.url&&(t.server.type=a.type||"streamable_http",t.server.url=a.url,a.headers&&"object"==typeof a.headers&&(t.server.headers=a.headers)),l.push(t)}if(0===l.length)return Xe.value="未找到有效的 MCP 服务器配置",void(Ye.value=!1);1!==l.length||ka(l[0].id)?(aa.value=l,ta.value=l.filter(e=>!ka(e.id)).map(e=>e.id),ea.value=!0,He.value=!1):(Ze.value=l[0],Ie.value=!0,He.value=!1,Ve.value="")}catch(t){Xe.value="解析失败:"+t.message}finally{Ye.value=!1}}function Oa(e){ta.value=e?aa.value.filter(e=>!ka(e.id)).map(e=>e.id):[]}async function za(){if(0===ta.value.length)return;sa.value=!0;let e=0,a=0;try{for(const s of ta.value){const l=aa.value.find(e=>e.id===s);if(l)try{await L(l),e++}catch(t){a++}}e>0?(H.success(`成功导入 ${e} 个服务器${a>0?`,${a} 个失败`:""}`),await ba()):H.error("导入失败"),ea.value=!1,Ve.value="",aa.value=[],ta.value=[]}catch(t){H.error("批量导入失败")}finally{sa.value=!1}}return c(()=>Te.visible,e=>{e&&ba()},{immediate:!0}),c(He,e=>{e||(Xe.value="")}),(t,c)=>{const v=r("McpServerDetailDrawer");return u(),b(m,null,[i(g(W),{show:Ee.value,"onUpdate:show":c[2]||(c[2]=e=>Ee.value=e),width:g(Le),placement:"right","show-mask":!0},{default:f(()=>[i(g(I),{title:"MCP 服务器管理",closable:"","native-scrollbar":!1},{header:f(()=>[w("div",le,[w("div",re,[i(g(e),{size:20,class:"header-icon"},{default:f(()=>[i(g(x))]),_:1}),c[13]||(c[13]=w("span",null,"MCP 服务器管理",-1))]),w("div",ne,[i(g(X),{trigger:"click",options:ya.value,onSelect:_a},{default:f(()=>[i(g(a),{size:"small",quaternary:""},{icon:f(()=>[i(g(e),null,{default:f(()=>[i(g($))]),_:1})]),default:f(()=>[c[14]||(c[14]=l(" 导出 ",-1))]),_:1})]),_:1},8,["options"]),i(g(a),{size:"small",type:"primary",ghost:"",onClick:c[0]||(c[0]=e=>He.value=!0)},{icon:f(()=>[i(g(e),null,{default:f(()=>[i(g(O))]),_:1})]),default:f(()=>[c[15]||(c[15]=l(" 粘贴解析 ",-1))]),_:1}),i(g(a),{size:"small",type:"primary",onClick:Sa},{icon:f(()=>[i(g(e),null,{default:f(()=>[i(g(U))]),_:1})]),default:f(()=>[c[16]||(c[16]=l(" 添加 ",-1))]),_:1})])])]),default:f(()=>[w("div",ie,[w("div",oe,[w("span",ue,[l(" 共 "+d(ua.value)+" 个服务器 ",1),(u(!0),b(m,null,n(va.value,e=>(u(),b(m,{key:e.key},[l(" · "+d(e.label||e.title||e.key)+": "+d(pa.value[e.key]||0),1)],64))),128))]),i(g(X),{trigger:"click",options:ma.value,onSelect:wa},{default:f(()=>[i(g(a),{size:"tiny",quaternary:""},{icon:f(()=>[i(g(e),null,{default:f(()=>[i(g(z))]),_:1})]),default:f(()=>[c[17]||(c[17]=l(" 同步 ",-1))]),_:1})]),_:1},8,["options"])]),w("div",ce,[i(g(Q),{show:We.value},{default:f(()=>[0!==oa.value.length||We.value?(u(),b("div",{key:1,class:"server-cards",ref_key:"serverCardsRef",ref:Ge},[(u(!0),b(m,null,n(oa.value,(t,r)=>(u(),b("div",{key:t.id,class:y(["server-card",{dragging:Qe.value===r}]),draggable:"true",onClick:e=>function(e){ia.value=e,na.value=!0}(t),onDragstart:e=>function(e,a){Qe.value=a,e.dataTransfer.effectAllowed="move",e.dataTransfer.setData("text/plain",a)}(e,r),onDragend:xa,onDragover:e=>{return(a=e).preventDefault(),void(a.dataTransfer.dropEffect="move");var a},onDrop:e=>async function(e,a){e.preventDefault();const t=Qe.value;if(null===t||t===a)return void(Qe.value=null);const s=[...oa.value],[l]=s.splice(t,1);s.splice(a,0,l);const r=s.map(e=>e.id);try{await R(r),await ba()}catch(n){H.error("排序保存失败")}Qe.value=null}(e,r)},[w("div",pe,[w("div",fe,[i(g(e),{class:"drag-handle",size:14},{default:f(()=>[i(g(j))]),_:1}),w("span",me,d(t.name||t.id),1),t.server?.type?(u(),o(g(ae),{key:0,size:"tiny",bordered:!1,type:"info"},{default:f(()=>[l(d(t.server.type),1)]),_:2},1024)):s("",!0),t.status?(u(),o(g(Z),{key:1},{trigger:f(()=>[w("span",{class:y(["status-dot",{online:"online"===t.status,error:"error"===t.status,testing:"testing"===t.status}])},null,2)]),default:f(()=>[l(" "+d(ha(t)),1)]),_:2},1024)):s("",!0)]),w("div",ye,[i(g(Z),null,{trigger:f(()=>[i(g(a),{quaternary:"",size:"tiny",loading:Ke[t.id],onClick:h(e=>async function(e){Ke[e.id]=!0,Fe.value[e.id].status="testing";try{const a=await B(e.id);if(a.success){const t=a.result;Fe.value[e.id].status=t.success?"online":"error",Fe.value[e.id].lastChecked=Date.now(),t.success?H.success(`${e.name||e.id}: ${t.message} (${t.duration}ms)`):se(H,t,"测试失败",`${e.name||e.id}: `)}}catch(a){Fe.value[e.id].status="error",se(H,a,"测试失败",`${e.name||e.id}: `)}finally{Ke[e.id]=!1}}(t),["stop"])},{icon:f(()=>[i(g(e),null,{default:f(()=>[i(g(C))]),_:1})]),_:1},8,["loading","onClick"])]),default:f(()=>[c[20]||(c[20]=l(" 测试连接 ",-1))]),_:2},1024),i(g(a),{quaternary:"",size:"tiny",onClick:h(e=>function(e){Ze.value=e,Ie.value=!0}(t),["stop"])},{icon:f(()=>[i(g(e),null,{default:f(()=>[i(g(D))]),_:1})]),_:1},8,["onClick"]),i(g(a),{quaternary:"",size:"tiny",onClick:h(e=>function(e){G.warning({title:"删除确认",content:`确定要删除 MCP 服务器 "${e.name||e.id}" 吗?此操作将从所有平台配置中移除该服务器。`,positiveText:"删除",negativeText:"取消",onPositiveClick:async()=>{try{(await q(e.id)).success&&(delete Fe.value[e.id],H.success("删除成功"))}catch(a){H.error("删除失败")}}})}(t),["stop"])},{icon:f(()=>[i(g(e),null,{default:f(()=>[i(g(M))]),_:1})]),_:1},8,["onClick"])])]),t.description?(u(),b("p",he,d(t.description),1)):s("",!0),t.tags?.length?(u(),b("div",ge,[(u(!0),b(m,null,n(t.tags.slice(0,3),e=>(u(),o(g(ae),{key:e,size:"tiny",bordered:!1},{default:f(()=>[l(d(e),1)]),_:2},1024))),128))])):s("",!0),w("div",ke,[(u(!0),b(m,null,n(va.value,e=>(u(),b("label",{key:e.key,class:"app-toggle",onClick:c[1]||(c[1]=h(()=>{},["stop"]))},[i(g(K),{size:"small",value:!0===t.apps?.[e.key],"onUpdate:value":a=>async function(e,a,t){try{const s=await J(e,a,t);s.success&&(Fe.value[e]=s.server,H.success(`已${t?"启用":"禁用"} ${a}`))}catch(s){H.error("操作失败")}}(t.id,e.key,a)},null,8,["value","onUpdate:value"]),w("span",be,d(e.label||e.title||e.key),1)]))),128))])],42,ve))),128))],512)):(u(),b("div",de,[i(g(e),{size:48,class:"empty-icon"},{default:f(()=>[i(g(x))]),_:1}),c[18]||(c[18]=w("p",{class:"empty-title"},"暂无 MCP 服务器",-1)),c[19]||(c[19]=w("p",{class:"empty-desc"},'点击上方"添加"按钮添加 MCP 服务器,或"粘贴解析"快速导入',-1))]))]),_:1},8,["show"])])])]),_:1})]),_:1},8,["show","width"]),i(E,{visible:Ie.value,"onUpdate:visible":c[3]||(c[3]=e=>Ie.value=e),"editing-server":Ze.value,"existing-ids":ca.value,platforms:va.value,onSaved:$a},null,8,["visible","editing-server","existing-ids","platforms"]),i(g(P),{show:He.value,"onUpdate:show":c[6]||(c[6]=e=>He.value=e),preset:"card",title:"粘贴 MCP 配置",style:{width:"600px","max-width":"90vw"}},{footer:f(()=>[w("div",Ce,[i(g(a),{onClick:c[5]||(c[5]=e=>He.value=!1)},{default:f(()=>[...c[23]||(c[23]=[l("取消",-1)])]),_:1}),i(g(a),{type:"primary",onClick:Da,loading:Ye.value},{default:f(()=>[...c[24]||(c[24]=[l(" 解析配置 ",-1)])]),_:1},8,["loading"])])]),default:f(()=>[w("div",we,[c[21]||(c[21]=w("p",{class:"paste-hint"}," 粘贴 JSON 格式的 MCP 配置,支持单个或批量导入。格式示例: ",-1)),c[22]||(c[22]=w("pre",{class:"paste-example"},'{\n "mcpServers": {\n "服务器名称": {\n "type": "streamable_http",\n "url": "https://example.com/mcp"\n }\n }\n}',-1)),i(g(ee),{value:Ve.value,"onUpdate:value":c[4]||(c[4]=e=>Ve.value=e),type:"textarea",placeholder:"在此粘贴 JSON 配置...",rows:8,status:Xe.value?"error":void 0},null,8,["value","status"]),Xe.value?(u(),b("p",_e,d(Xe.value),1)):s("",!0)])]),_:1},8,["show"]),i(g(P),{show:ea.value,"onUpdate:show":c[9]||(c[9]=e=>ea.value=e),preset:"card",title:"选择要导入的 MCP 服务器",style:{width:"650px","max-width":"90vw"}},{footer:f(()=>[w("div",Ne,[i(g(a),{onClick:c[8]||(c[8]=e=>ea.value=!1)},{default:f(()=>[...c[26]||(c[26]=[l("取消",-1)])]),_:1}),i(g(a),{type:"primary",disabled:0===ta.value.length,loading:sa.value,onClick:za},{default:f(()=>[l(" 导入选中 ("+d(ta.value.length)+") ",1)]),_:1},8,["disabled","loading"])])]),default:f(()=>[w("div",je,[w("div",xe,[i(g(Y),{checked:fa.value,"onUpdate:checked":[c[7]||(c[7]=e=>fa.value=e),Oa]},{default:f(()=>[l(" 全选 ("+d(aa.value.length)+") ",1)]),_:1},8,["checked"]),w("span",Se,"已选择 "+d(ta.value.length)+" 个",1)]),w("div",$e,[(u(!0),b(m,null,n(aa.value,e=>(u(),b("div",{key:e.id,class:y(["batch-item",{selected:ta.value.includes(e.id),exists:ka(e.id)}])},[i(g(Y),{checked:ta.value.includes(e.id),disabled:ka(e.id),"onUpdate:checked":a=>function(e,a){if(a)ta.value.includes(e)||ta.value.push(e);else{const a=ta.value.indexOf(e);a>-1&&ta.value.splice(a,1)}}(e.id,a)},null,8,["checked","disabled","onUpdate:checked"]),w("div",De,[w("div",Oe,[w("span",ze,d(e.id),1),ka(e.id)?(u(),o(g(ae),{key:0,size:"tiny",type:"warning"},{default:f(()=>[...c[25]||(c[25]=[l("已存在",-1)])]),_:1})):s("",!0),e.server?.type?(u(),o(g(ae),{key:1,size:"tiny",bordered:!1,type:"info"},{default:f(()=>[l(d(e.server.type),1)]),_:2},1024)):s("",!0)]),w("div",Me,[e.server?.command?(u(),b("span",Ue,d(e.server.command),1)):s("",!0),e.server?.args?.length?(u(),b("span",Pe,d(e.server.args.slice(0,3).join(" "))+d(e.server.args.length>3?"...":""),1)):s("",!0)])])],2))),128))])])]),_:1},8,["show"]),i(g(P),{show:la.value,"onUpdate:show":c[11]||(c[11]=e=>la.value=e),preset:"card",title:"导出 MCP 配置",style:{width:"650px","max-width":"90vw"}},{footer:f(()=>[w("div",Re,[i(g(a),{onClick:c[10]||(c[10]=e=>la.value=!1)},{default:f(()=>[...c[27]||(c[27]=[l("关闭",-1)])]),_:1}),i(g(a),{onClick:Ca},{icon:f(()=>[i(g(e),null,{default:f(()=>[i(g(S))]),_:1})]),default:f(()=>[c[28]||(c[28]=l(" 复制 ",-1))]),_:1}),i(g(a),{type:"primary",onClick:ja},{icon:f(()=>[i(g(e),null,{default:f(()=>[i(g($))]),_:1})]),default:f(()=>[c[29]||(c[29]=l(" 下载 ",-1))]),_:1})])]),default:f(()=>[w("div",Je,[w("div",Ae,[w("span",null,"格式: "+d(ra.value.format),1),w("span",null,"文件名: "+d(ra.value.filename),1)]),i(g(ee),{value:ra.value.content,type:"textarea",readonly:"",rows:12,class:"export-content"},null,8,["value"])])]),_:1},8,["show"]),i(v,{visible:na.value,"onUpdate:visible":c[12]||(c[12]=e=>na.value=e),server:ia.value},null,8,["visible","server"])],64)}}},[["__scopeId","data-v-0b241016"]]);export{qe as default};
|
|
1
|
+
import{i as e,s as a,t}from"./_plugin-vue_export-helper-BeLZJZij.js";import{C as s,D as l,J as r,K as n,O as i,S as o,W as u,Z as c,_t as d,at as v,b as p,et as f,g as m,ht as y,m as h,mt as g,st as k,w as b,x as w}from"./vue-vendor-BqZbbXHA.js";import{s as _}from"./client-UDwXBP9i.js";import{O as C,S as j,Z as x,at as S,et as $,it as D,lt as O,o as z,r as M,tt as U}from"./icons-B2Vg-IOC.js";import{l as P}from"./light-Cp0t7v32.js";import{a as N,c as J,i as A,l as R,n as q,o as L,r as T,s as B,t as E}from"./McpFormDrawer-DPMnyt5L.js";import{n as W,t as F}from"./useResponsiveDrawer-D-DDpbnI.js";import{t as I}from"./DrawerContent-ChXgZ1Xm.js";import{$ as Z,F as K,I as Q,M as G,N as H,Nt as V,Q as X,at as Y,ct as ee,dt as ae}from"./index-BFInlZGI.js";import{t as te}from"./clipboard-B46yyoz_.js";function se(e,a,t="操作失败",s=""){const l=function(e,a="操作失败"){return String(function(e){return e?"string"==typeof e?e:e.message||e.error||e.result?.message||e.result?.error||e.response?.data?.message||e.response?.data?.error||e.response?.data?.result?.message||e.response?.data?.result?.error||e.data?.message||e.data?.error||"":""}(e)||"").trim()||a}(a,t),r=function(e){return e?.hint||e?.data?.hint||e?.result?.hint||e?.result?.data?.hint||e?.response?.data?.hint||e?.response?.data?.result?.hint||e?.response?.data?.result?.data?.hint||null}(a),n=l.split(/\r?\n/).map(e=>e.trim()).filter(Boolean),i=[r?.title,...Array.isArray(r?.details)?r.details:[]].map(e=>String(e||"").trim()).filter(Boolean).filter(e=>!n.includes(e)),o=[...n,...i],u=o[0]||t,c=o.slice(1),d=s?`${s}${u}`:u;return e.error(d,{duration:c.length>0?8e3:5e3}),c.length>0&&e.warning(c.join("\n"),{duration:12e3,closable:!0}),l}var le={class:"drawer-header"},re={class:"header-title"},ne={class:"header-actions"},ie={class:"mcp-container"},oe={class:"stats-bar"},ue={class:"stats-text"},ce={class:"server-list"},de={key:0,class:"empty-state"},ve=["onClick","onDragstart","onDragover","onDrop"],pe={class:"card-header"},fe={class:"card-title"},me={class:"server-name"},ye={class:"card-actions"},he={key:0,class:"card-desc"},ge={key:1,class:"card-tags"},ke={class:"card-apps"},be={class:"app-label"},we={class:"paste-modal-content"},_e={key:0,class:"parse-error"},Ce={class:"paste-modal-footer"},je={class:"batch-modal-content"},xe={class:"batch-actions"},Se={class:"batch-selected"},$e={class:"batch-list"},De={class:"batch-item-info"},Oe={class:"batch-item-header"},ze={class:"batch-item-name"},Me={class:"batch-item-detail"},Ue={key:0},Pe={key:1,class:"batch-args"},Ne={class:"batch-modal-footer"},Je={class:"export-modal-content"},Ae={class:"export-info"},Re={class:"export-modal-footer"},qe=t({__name:"McpDrawer",props:{visible:{type:Boolean,default:!1}},emits:["update:visible"],setup(t,{emit:qe}){const{drawerWidth:Le}=F(720),Te=t,Be=qe,Ee=p({get:()=>Te.visible,set:e=>Be("update:visible",e)}),We=k(!1),Fe=k({}),Ie=k(!1),Ze=k(null),Ke=v({}),Qe=k(null),Ge=k(null),He=k(!1),Ve=k(""),Xe=k(""),Ye=k(!1),ea=k(!1),aa=k([]),ta=k([]),sa=k(!1),la=k(!1),ra=k({format:"",content:"",filename:""}),na=k(!1),ia=k(null),oa=p(()=>Object.values(Fe.value).sort((e,a)=>void 0!==e.order&&void 0!==a.order?e.order-a.order:void 0!==e.order?-1:void 0!==a.order?1:(a.updatedAt||0)-(e.updatedAt||0))),ua=p(()=>oa.value.length),ca=p(()=>Object.keys(Fe.value)),{byCapability:da}=V(),va=p(()=>da("mcp")),pa=p(()=>{const e=oa.value;return Object.fromEntries(va.value.map(a=>[a.key,e.filter(e=>!0===e.apps?.[a.key]).length]))}),fa=p({get:()=>{const e=aa.value.filter(e=>!ka(e.id)).map(e=>e.id);return e.length>0&&e.every(e=>ta.value.includes(e))},set:()=>{}}),ma=p(()=>va.value.map(e=>({label:`同步 ${e.label||e.title||e.key} 已有配置`,key:e.key}))),ya=p(()=>[{label:"导出为 JSON (通用)",key:"json"},...va.value.filter(e=>_(e.key)).map(e=>({label:`导出为 ${e.label||e.title||e.key} 格式`,key:e.key}))]);function ha(e){return"online"===e.status?`在线 - ${ga(e.lastChecked)}`:"error"===e.status?`异常 - ${ga(e.lastChecked)}`:"testing"===e.status?"测试中...":"未测试"}function ga(e){return e?new Date(e).toLocaleString("zh-CN",{hour:"2-digit",minute:"2-digit"}):""}function ka(e){return ca.value.includes(e)}async function ba(){We.value=!0;try{const e=await A();e.success&&(Fe.value=e.servers)}catch(e){H.error("加载 MCP 服务器失败")}finally{We.value=!1}}async function wa(e){try{const a=await N(e);a.success&&(H.success(a.message),await ba())}catch(a){H.error("同步失败")}}async function _a(e){try{const a=await T(e);a.success&&(ra.value={format:a.format,content:a.content,filename:a.filename},la.value=!0)}catch(a){H.error("导出失败")}}async function Ca(){try{if("manual"===(await te(ra.value.content))?.method)return void H.warning("自动复制失败,已弹出手动复制框");H.success("已复制到剪贴板")}catch{H.error("复制失败")}}function ja(){const e=new Blob([ra.value.content],{type:"text/plain"}),a=URL.createObjectURL(e),t=document.createElement("a");t.href=a,t.download=ra.value.filename,t.click(),URL.revokeObjectURL(a),H.success("下载成功")}function xa(){Qe.value=null}function Sa(){Ze.value=null,Ie.value=!0}function $a(){ba()}function Da(){Xe.value="",Ye.value=!0;try{let t,s=Ve.value.trim();if(!s)return Xe.value="请输入配置内容",void(Ye.value=!1);s.startsWith("{")||s.startsWith("[")||(s=s.replace(/^[\s,]+/,""),s=s.replace(/[\s,]+$/,""),s=`{${s}}`);try{t=JSON.parse(s)}catch(e){let l=s.replace(/\}\s*"/g,'}, "');try{t=JSON.parse(l)}catch(a){return Xe.value="JSON 格式错误:"+e.message,void(Ye.value=!1)}}const l=[];let r=null;if(t.mcpServers&&"object"==typeof t.mcpServers)r=t.mcpServers;else if(t.mcp_servers&&"object"==typeof t.mcp_servers)r=t.mcp_servers;else if(t.command||t.url)r={"new-server":t};else{if(!Object.keys(t).some(e=>{const a=t[e];return a&&"object"==typeof a&&(a.command||a.url||a.args)}))return Xe.value="未找到有效的 MCP 服务器配置,请检查 JSON 格式",void(Ye.value=!1);r=t}for(const[e,a]of Object.entries(r)){if(!a||"object"!=typeof a)continue;if(!a.command&&!a.url&&!a.args)continue;const t={id:e,name:e,apps:Object.fromEntries(va.value.map((e,a)=>[e.key,0===a])),server:{type:a.type||"stdio"}};a.command&&(t.server.command=a.command,a.args&&(t.server.args=Array.isArray(a.args)?a.args:[a.args]),a.env&&"object"==typeof a.env&&(t.server.env=a.env)),a.url&&(t.server.type=a.type||"streamable_http",t.server.url=a.url,a.headers&&"object"==typeof a.headers&&(t.server.headers=a.headers)),l.push(t)}if(0===l.length)return Xe.value="未找到有效的 MCP 服务器配置",void(Ye.value=!1);1!==l.length||ka(l[0].id)?(aa.value=l,ta.value=l.filter(e=>!ka(e.id)).map(e=>e.id),ea.value=!0,He.value=!1):(Ze.value=l[0],Ie.value=!0,He.value=!1,Ve.value="")}catch(t){Xe.value="解析失败:"+t.message}finally{Ye.value=!1}}function Oa(e){ta.value=e?aa.value.filter(e=>!ka(e.id)).map(e=>e.id):[]}async function za(){if(0===ta.value.length)return;sa.value=!0;let e=0,a=0;try{for(const s of ta.value){const l=aa.value.find(e=>e.id===s);if(l)try{await L(l),e++}catch(t){a++}}e>0?(H.success(`成功导入 ${e} 个服务器${a>0?`,${a} 个失败`:""}`),await ba()):H.error("导入失败"),ea.value=!1,Ve.value="",aa.value=[],ta.value=[]}catch(t){H.error("批量导入失败")}finally{sa.value=!1}}return c(()=>Te.visible,e=>{e&&ba()},{immediate:!0}),c(He,e=>{e||(Xe.value="")}),(t,c)=>{const v=r("McpServerDetailDrawer");return u(),b(m,null,[i(g(W),{show:Ee.value,"onUpdate:show":c[2]||(c[2]=e=>Ee.value=e),width:g(Le),placement:"right","show-mask":!0},{default:f(()=>[i(g(I),{title:"MCP 服务器管理",closable:"","native-scrollbar":!1},{header:f(()=>[w("div",le,[w("div",re,[i(g(e),{size:20,class:"header-icon"},{default:f(()=>[i(g(x))]),_:1}),c[13]||(c[13]=w("span",null,"MCP 服务器管理",-1))]),w("div",ne,[i(g(X),{trigger:"click",options:ya.value,onSelect:_a},{default:f(()=>[i(g(a),{size:"small",quaternary:""},{icon:f(()=>[i(g(e),null,{default:f(()=>[i(g($))]),_:1})]),default:f(()=>[c[14]||(c[14]=l(" 导出 ",-1))]),_:1})]),_:1},8,["options"]),i(g(a),{size:"small",type:"primary",ghost:"",onClick:c[0]||(c[0]=e=>He.value=!0)},{icon:f(()=>[i(g(e),null,{default:f(()=>[i(g(O))]),_:1})]),default:f(()=>[c[15]||(c[15]=l(" 粘贴解析 ",-1))]),_:1}),i(g(a),{size:"small",type:"primary",onClick:Sa},{icon:f(()=>[i(g(e),null,{default:f(()=>[i(g(U))]),_:1})]),default:f(()=>[c[16]||(c[16]=l(" 添加 ",-1))]),_:1})])])]),default:f(()=>[w("div",ie,[w("div",oe,[w("span",ue,[l(" 共 "+d(ua.value)+" 个服务器 ",1),(u(!0),b(m,null,n(va.value,e=>(u(),b(m,{key:e.key},[l(" · "+d(e.label||e.title||e.key)+": "+d(pa.value[e.key]||0),1)],64))),128))]),i(g(X),{trigger:"click",options:ma.value,onSelect:wa},{default:f(()=>[i(g(a),{size:"tiny",quaternary:""},{icon:f(()=>[i(g(e),null,{default:f(()=>[i(g(z))]),_:1})]),default:f(()=>[c[17]||(c[17]=l(" 同步 ",-1))]),_:1})]),_:1},8,["options"])]),w("div",ce,[i(g(Q),{show:We.value},{default:f(()=>[0!==oa.value.length||We.value?(u(),b("div",{key:1,class:"server-cards",ref_key:"serverCardsRef",ref:Ge},[(u(!0),b(m,null,n(oa.value,(t,r)=>(u(),b("div",{key:t.id,class:y(["server-card",{dragging:Qe.value===r}]),draggable:"true",onClick:e=>function(e){ia.value=e,na.value=!0}(t),onDragstart:e=>function(e,a){Qe.value=a,e.dataTransfer.effectAllowed="move",e.dataTransfer.setData("text/plain",a)}(e,r),onDragend:xa,onDragover:e=>{return(a=e).preventDefault(),void(a.dataTransfer.dropEffect="move");var a},onDrop:e=>async function(e,a){e.preventDefault();const t=Qe.value;if(null===t||t===a)return void(Qe.value=null);const s=[...oa.value],[l]=s.splice(t,1);s.splice(a,0,l);const r=s.map(e=>e.id);try{await R(r),await ba()}catch(n){H.error("排序保存失败")}Qe.value=null}(e,r)},[w("div",pe,[w("div",fe,[i(g(e),{class:"drag-handle",size:14},{default:f(()=>[i(g(j))]),_:1}),w("span",me,d(t.name||t.id),1),t.server?.type?(u(),o(g(ae),{key:0,size:"tiny",bordered:!1,type:"info"},{default:f(()=>[l(d(t.server.type),1)]),_:2},1024)):s("",!0),t.status?(u(),o(g(Z),{key:1},{trigger:f(()=>[w("span",{class:y(["status-dot",{online:"online"===t.status,error:"error"===t.status,testing:"testing"===t.status}])},null,2)]),default:f(()=>[l(" "+d(ha(t)),1)]),_:2},1024)):s("",!0)]),w("div",ye,[i(g(Z),null,{trigger:f(()=>[i(g(a),{quaternary:"",size:"tiny",loading:Ke[t.id],onClick:h(e=>async function(e){Ke[e.id]=!0,Fe.value[e.id].status="testing";try{const a=await B(e.id);if(a.success){const t=a.result;Fe.value[e.id].status=t.success?"online":"error",Fe.value[e.id].lastChecked=Date.now(),t.success?H.success(`${e.name||e.id}: ${t.message} (${t.duration}ms)`):se(H,t,"测试失败",`${e.name||e.id}: `)}}catch(a){Fe.value[e.id].status="error",se(H,a,"测试失败",`${e.name||e.id}: `)}finally{Ke[e.id]=!1}}(t),["stop"])},{icon:f(()=>[i(g(e),null,{default:f(()=>[i(g(C))]),_:1})]),_:1},8,["loading","onClick"])]),default:f(()=>[c[20]||(c[20]=l(" 测试连接 ",-1))]),_:2},1024),i(g(a),{quaternary:"",size:"tiny",onClick:h(e=>function(e){Ze.value=e,Ie.value=!0}(t),["stop"])},{icon:f(()=>[i(g(e),null,{default:f(()=>[i(g(D))]),_:1})]),_:1},8,["onClick"]),i(g(a),{quaternary:"",size:"tiny",onClick:h(e=>function(e){G.warning({title:"删除确认",content:`确定要删除 MCP 服务器 "${e.name||e.id}" 吗?此操作将从所有平台配置中移除该服务器。`,positiveText:"删除",negativeText:"取消",onPositiveClick:async()=>{try{(await q(e.id)).success&&(delete Fe.value[e.id],H.success("删除成功"))}catch(a){H.error("删除失败")}}})}(t),["stop"])},{icon:f(()=>[i(g(e),null,{default:f(()=>[i(g(M))]),_:1})]),_:1},8,["onClick"])])]),t.description?(u(),b("p",he,d(t.description),1)):s("",!0),t.tags?.length?(u(),b("div",ge,[(u(!0),b(m,null,n(t.tags.slice(0,3),e=>(u(),o(g(ae),{key:e,size:"tiny",bordered:!1},{default:f(()=>[l(d(e),1)]),_:2},1024))),128))])):s("",!0),w("div",ke,[(u(!0),b(m,null,n(va.value,e=>(u(),b("label",{key:e.key,class:"app-toggle",onClick:c[1]||(c[1]=h(()=>{},["stop"]))},[i(g(K),{size:"small",value:!0===t.apps?.[e.key],"onUpdate:value":a=>async function(e,a,t){try{const s=await J(e,a,t);s.success&&(Fe.value[e]=s.server,H.success(`已${t?"启用":"禁用"} ${a}`))}catch(s){H.error("操作失败")}}(t.id,e.key,a)},null,8,["value","onUpdate:value"]),w("span",be,d(e.label||e.title||e.key),1)]))),128))])],42,ve))),128))],512)):(u(),b("div",de,[i(g(e),{size:48,class:"empty-icon"},{default:f(()=>[i(g(x))]),_:1}),c[18]||(c[18]=w("p",{class:"empty-title"},"暂无 MCP 服务器",-1)),c[19]||(c[19]=w("p",{class:"empty-desc"},'点击上方"添加"按钮添加 MCP 服务器,或"粘贴解析"快速导入',-1))]))]),_:1},8,["show"])])])]),_:1})]),_:1},8,["show","width"]),i(E,{visible:Ie.value,"onUpdate:visible":c[3]||(c[3]=e=>Ie.value=e),"editing-server":Ze.value,"existing-ids":ca.value,platforms:va.value,onSaved:$a},null,8,["visible","editing-server","existing-ids","platforms"]),i(g(P),{show:He.value,"onUpdate:show":c[6]||(c[6]=e=>He.value=e),preset:"card",title:"粘贴 MCP 配置",style:{width:"600px","max-width":"90vw"}},{footer:f(()=>[w("div",Ce,[i(g(a),{onClick:c[5]||(c[5]=e=>He.value=!1)},{default:f(()=>[...c[23]||(c[23]=[l("取消",-1)])]),_:1}),i(g(a),{type:"primary",onClick:Da,loading:Ye.value},{default:f(()=>[...c[24]||(c[24]=[l(" 解析配置 ",-1)])]),_:1},8,["loading"])])]),default:f(()=>[w("div",we,[c[21]||(c[21]=w("p",{class:"paste-hint"}," 粘贴 JSON 格式的 MCP 配置,支持单个或批量导入。格式示例: ",-1)),c[22]||(c[22]=w("pre",{class:"paste-example"},'{\n "mcpServers": {\n "服务器名称": {\n "type": "streamable_http",\n "url": "https://example.com/mcp"\n }\n }\n}',-1)),i(g(ee),{value:Ve.value,"onUpdate:value":c[4]||(c[4]=e=>Ve.value=e),type:"textarea",placeholder:"在此粘贴 JSON 配置...",rows:8,status:Xe.value?"error":void 0},null,8,["value","status"]),Xe.value?(u(),b("p",_e,d(Xe.value),1)):s("",!0)])]),_:1},8,["show"]),i(g(P),{show:ea.value,"onUpdate:show":c[9]||(c[9]=e=>ea.value=e),preset:"card",title:"选择要导入的 MCP 服务器",style:{width:"650px","max-width":"90vw"}},{footer:f(()=>[w("div",Ne,[i(g(a),{onClick:c[8]||(c[8]=e=>ea.value=!1)},{default:f(()=>[...c[26]||(c[26]=[l("取消",-1)])]),_:1}),i(g(a),{type:"primary",disabled:0===ta.value.length,loading:sa.value,onClick:za},{default:f(()=>[l(" 导入选中 ("+d(ta.value.length)+") ",1)]),_:1},8,["disabled","loading"])])]),default:f(()=>[w("div",je,[w("div",xe,[i(g(Y),{checked:fa.value,"onUpdate:checked":[c[7]||(c[7]=e=>fa.value=e),Oa]},{default:f(()=>[l(" 全选 ("+d(aa.value.length)+") ",1)]),_:1},8,["checked"]),w("span",Se,"已选择 "+d(ta.value.length)+" 个",1)]),w("div",$e,[(u(!0),b(m,null,n(aa.value,e=>(u(),b("div",{key:e.id,class:y(["batch-item",{selected:ta.value.includes(e.id),exists:ka(e.id)}])},[i(g(Y),{checked:ta.value.includes(e.id),disabled:ka(e.id),"onUpdate:checked":a=>function(e,a){if(a)ta.value.includes(e)||ta.value.push(e);else{const a=ta.value.indexOf(e);a>-1&&ta.value.splice(a,1)}}(e.id,a)},null,8,["checked","disabled","onUpdate:checked"]),w("div",De,[w("div",Oe,[w("span",ze,d(e.id),1),ka(e.id)?(u(),o(g(ae),{key:0,size:"tiny",type:"warning"},{default:f(()=>[...c[25]||(c[25]=[l("已存在",-1)])]),_:1})):s("",!0),e.server?.type?(u(),o(g(ae),{key:1,size:"tiny",bordered:!1,type:"info"},{default:f(()=>[l(d(e.server.type),1)]),_:2},1024)):s("",!0)]),w("div",Me,[e.server?.command?(u(),b("span",Ue,d(e.server.command),1)):s("",!0),e.server?.args?.length?(u(),b("span",Pe,d(e.server.args.slice(0,3).join(" "))+d(e.server.args.length>3?"...":""),1)):s("",!0)])])],2))),128))])])]),_:1},8,["show"]),i(g(P),{show:la.value,"onUpdate:show":c[11]||(c[11]=e=>la.value=e),preset:"card",title:"导出 MCP 配置",style:{width:"650px","max-width":"90vw"}},{footer:f(()=>[w("div",Re,[i(g(a),{onClick:c[10]||(c[10]=e=>la.value=!1)},{default:f(()=>[...c[27]||(c[27]=[l("关闭",-1)])]),_:1}),i(g(a),{onClick:Ca},{icon:f(()=>[i(g(e),null,{default:f(()=>[i(g(S))]),_:1})]),default:f(()=>[c[28]||(c[28]=l(" 复制 ",-1))]),_:1}),i(g(a),{type:"primary",onClick:ja},{icon:f(()=>[i(g(e),null,{default:f(()=>[i(g($))]),_:1})]),default:f(()=>[c[29]||(c[29]=l(" 下载 ",-1))]),_:1})])]),default:f(()=>[w("div",Je,[w("div",Ae,[w("span",null,"格式: "+d(ra.value.format),1),w("span",null,"文件名: "+d(ra.value.filename),1)]),i(g(ee),{value:ra.value.content,type:"textarea",readonly:"",rows:12,class:"export-content"},null,8,["value"])])]),_:1},8,["show"]),i(v,{visible:na.value,"onUpdate:visible":c[12]||(c[12]=e=>na.value=e),server:ia.value},null,8,["visible","server"])],64)}}},[["__scopeId","data-v-0b241016"]]);export{qe as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{I as e,L as a,N as t,P as l,Qt as r,St as s,Tt as n,Yt as i,bn as o,d as u,gn as d,gt as c,hn as p,ht as v,i as m,j as f,pt as h,rn as g,s as y,t as b,vn as k,xt as w,yn as x}from"./_plugin-vue_export-helper-BeLZJZij.js";import{A as C,C as $,D as P,G as j,K as U,M as I,N as _,O as S,S as O,W as R,Z as B,_t as D,at as A,b as V,dt as z,et as F,g as T,ht as E,mt as L,nt as M,st as q,ut as N,w as K,x as W}from"./vue-vendor-BqZbbXHA.js";import{n as G}from"./client-UDwXBP9i.js";import{B as Y,Ft as Z,Mt as H,Nt as Q,Y as J,g as X,tt as ee,xt as ae}from"./icons-B2Vg-IOC.js";import{n as te,t as le}from"./CollapseItem-BAYEsL_Q.js";import{n as re,t as se}from"./useResponsiveDrawer-B3uojyvV.js";import{t as ne}from"./DrawerContent-ChXgZ1Xm.js";import{$ as ie,F as oe,I as ue,N as de,Nt as ce,ct as pe,et as ve,ht as me,q as fe,tt as he,vt as ge}from"./index-DnEocV0M.js";import{s as ye}from"./project-config-B2baPzYL.js";var be=C({name:"ArrowDown",render:()=>I("svg",{viewBox:"0 0 28 28",version:"1.1",xmlns:"http://www.w3.org/2000/svg"},I("g",{stroke:"none","stroke-width":"1","fill-rule":"evenodd"},I("g",{"fill-rule":"nonzero"},I("path",{d:"M23.7916,15.2664 C24.0788,14.9679 24.0696,14.4931 23.7711,14.206 C23.4726,13.9188 22.9978,13.928 22.7106,14.2265 L14.7511,22.5007 L14.7511,3.74792 C14.7511,3.33371 14.4153,2.99792 14.0011,2.99792 C13.5869,2.99792 13.2511,3.33371 13.2511,3.74793 L13.2511,22.4998 L5.29259,14.2265 C5.00543,13.928 4.53064,13.9188 4.23213,14.206 C3.93361,14.4931 3.9244,14.9679 4.21157,15.2664 L13.2809,24.6944 C13.6743,25.1034 14.3289,25.1034 14.7223,24.6944 L23.7916,15.2664 Z"}))))}),ke=C({name:"ArrowUp",render:()=>I("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20"},I("g",{fill:"none"},I("path",{d:"M3.13 9.163a.5.5 0 1 0 .74.674L9.5 3.67V17.5a.5.5 0 0 0 1 0V3.672l5.63 6.165a.5.5 0 0 0 .738-.674l-6.315-6.916a.746.746 0 0 0-.632-.24a.746.746 0 0 0-.476.24L3.131 9.163z",fill:"currentColor"})))}),we="0!important",xe="-1px!important";function Ce(e){return x(`${e}-type`,[p("& +",[d("button",{},[x(`${e}-type`,[k("border",{borderLeftWidth:we}),k("state-border",{left:xe})])])])])}function $e(e){return x(`${e}-type`,[p("& +",[d("button",[x(`${e}-type`,[k("border",{borderTopWidth:we}),k("state-border",{top:xe})])])])])}var Pe=d("button-group","\n flex-wrap: nowrap;\n display: inline-flex;\n position: relative;\n",[o("vertical",{flexDirection:"row"},[o("rtl",[d("button",[p("&:first-child:not(:last-child)",`\n margin-right: ${we};\n border-top-right-radius: ${we};\n border-bottom-right-radius: ${we};\n `),p("&:last-child:not(:first-child)",`\n margin-left: ${we};\n border-top-left-radius: ${we};\n border-bottom-left-radius: ${we};\n `),p("&:not(:first-child):not(:last-child)",`\n margin-left: ${we};\n margin-right: ${we};\n border-radius: ${we};\n `),Ce("default"),x("ghost",[Ce("primary"),Ce("info"),Ce("success"),Ce("warning"),Ce("error")])])])]),x("vertical",{flexDirection:"column"},[d("button",[p("&:first-child:not(:last-child)",`\n margin-bottom: ${we};\n margin-left: ${we};\n margin-right: ${we};\n border-bottom-left-radius: ${we};\n border-bottom-right-radius: ${we};\n `),p("&:last-child:not(:first-child)",`\n margin-top: ${we};\n margin-left: ${we};\n margin-right: ${we};\n border-top-left-radius: ${we};\n border-top-right-radius: ${we};\n `),p("&:not(:first-child):not(:last-child)",`\n margin: ${we};\n border-radius: ${we};\n `),$e("default"),x("ghost",[$e("primary"),$e("info"),$e("success"),$e("warning"),$e("error")])])])]),je=C({name:"ButtonGroup",props:{size:{type:String,default:void 0},vertical:Boolean},setup(a){const{mergedClsPrefixRef:t,mergedRtlRef:r}=c(a);return l("-button-group",Pe,t),j(u,a),{rtlEnabled:e("ButtonGroup",r,t),mergedClsPrefix:t}},render(){const{mergedClsPrefix:e}=this;return I("div",{class:[`${e}-button-group`,this.rtlEnabled&&`${e}-button-group--rtl`,this.vertical&&`${e}-button-group--vertical`],role:"group"},this.$slots)}}),Ue=i("n-dynamic-input"),Ie=C({name:"DynamicInputInputPreset",props:{clsPrefix:{type:String,required:!0},value:{type:String,default:""},disabled:Boolean,parentPath:String,path:String,onUpdateValue:{type:Function,required:!0}},setup(){const{mergedThemeRef:e,placeholderRef:a}=_(Ue);return{mergedTheme:e,placeholder:a}},render(){const{mergedTheme:e,placeholder:a,value:t,clsPrefix:l,onUpdateValue:r,disabled:s}=this;return I("div",{class:`${l}-dynamic-input-preset-input`},I(pe,{theme:e.peers.Input,"theme-overrides":e.peerOverrides.Input,value:t,placeholder:a,onUpdateValue:r,disabled:s}))}}),_e=C({name:"DynamicInputPairPreset",props:{clsPrefix:{type:String,required:!0},value:{type:Object,default:()=>({key:"",value:""})},disabled:Boolean,parentPath:String,path:String,onUpdateValue:{type:Function,required:!0}},setup(e){const{mergedThemeRef:a,keyPlaceholderRef:t,valuePlaceholderRef:l}=_(Ue);return{mergedTheme:a,keyPlaceholder:t,valuePlaceholder:l,handleKeyInput(a){e.onUpdateValue({key:a,value:e.value.value})},handleValueInput(a){e.onUpdateValue({key:e.value.key,value:a})}}},render(){const{mergedTheme:e,keyPlaceholder:a,valuePlaceholder:t,value:l,clsPrefix:r,disabled:s}=this;return I("div",{class:`${r}-dynamic-input-preset-pair`},I(pe,{theme:e.peers.Input,"theme-overrides":e.peerOverrides.Input,value:l.key,class:`${r}-dynamic-input-pair-input`,placeholder:a,onUpdateValue:this.handleKeyInput,disabled:s}),I(pe,{theme:e.peers.Input,"theme-overrides":e.peerOverrides.Input,value:l.value,class:`${r}-dynamic-input-pair-input`,placeholder:t,onUpdateValue:this.handleValueInput,disabled:s}))}}),Se=d("dynamic-input",{width:"100%"},[d("dynamic-input-item","\n margin-bottom: 10px;\n display: flex;\n flex-wrap: nowrap;\n ",[d("dynamic-input-preset-input",{flex:1,alignItems:"center"}),d("dynamic-input-preset-pair","\n flex: 1;\n display: flex;\n align-items: center;\n ",[d("dynamic-input-pair-input",[p("&:first-child",{"margin-right":"12px"})])]),k("action","\n align-self: flex-start;\n display: flex;\n justify-content: flex-end;\n flex-shrink: 0;\n flex-grow: 0;\n margin: var(--action-margin);\n ",[x("icon",{cursor:"pointer"})]),p("&:last-child",{marginBottom:0})]),d("form-item","\n padding-top: 0 !important;\n margin-right: 0 !important;\n ",[d("form-item-blank",{paddingTop:"0 !important"})])]),Oe=new WeakMap,Re=C({name:"DynamicInput",props:Object.assign(Object.assign({},t.props),{max:Number,min:{type:Number,default:0},value:Array,defaultValue:{type:Array,default:()=>[]},preset:{type:String,default:"input"},keyField:String,itemClass:String,itemStyle:[String,Object],keyPlaceholder:{type:String,default:""},valuePlaceholder:{type:String,default:""},placeholder:{type:String,default:""},disabled:Boolean,showSortButton:Boolean,createButtonProps:Object,onCreate:Function,onRemove:Function,"onUpdate:value":[Function,Array],onUpdateValue:[Function,Array],onClear:Function,onInput:[Function,Array]}),setup(l,{slots:s}){const{mergedComponentPropsRef:i,mergedClsPrefixRef:o,mergedRtlRef:u,inlineThemeDisabled:d}=c(),p=_(h,null),m=q(l.defaultValue),f=z(l,"value"),y=r(f,m),b=t("DynamicInput","-dynamic-input",Se,fe,l,o),k=V(()=>{const{value:e}=y;if(Array.isArray(e)){const{max:a}=l;return void 0!==a&&e.length>=a}return!1}),w=V(()=>{const{value:e}=y;return!Array.isArray(e)||e.length<=l.min}),x=V(()=>{var e,a;return null===(a=null===(e=null==i?void 0:i.value)||void 0===e?void 0:e.DynamicInput)||void 0===a?void 0:a.buttonSize});function C(e){const{onInput:a,"onUpdate:value":t,onUpdateValue:r}=l;a&&n(a,e),t&&n(t,e),r&&n(r,e),m.value=e}function $(e){const{value:a}=y,{onCreate:t}=l,r=Array.from(null!=a?a:[]);if(t)r.splice(e+1,0,t(e+1)),C(r);else if(s.default)r.splice(e+1,0,null),C(r);else switch(l.preset){case"input":r.splice(e+1,0,""),C(r);break;case"pair":r.splice(e+1,0,{key:"",value:""}),C(r)}}function P(e,a,t){if(a<0||t<0||a>=e.length||t>=e.length)return;if(a===t)return;const l=e[a];e[a]=e[t],e[t]=l}j(Ue,{mergedThemeRef:b,keyPlaceholderRef:z(l,"keyPlaceholder"),valuePlaceholderRef:z(l,"valuePlaceholder"),placeholderRef:z(l,"placeholder")});const U=e("DynamicInput",u,o),I=V(()=>{const{self:{actionMargin:e,actionMarginRtl:a}}=b.value;return{"--action-margin":e,"--action-margin-rtl":a}}),S=d?v("dynamic-input",void 0,I,l):void 0;return{locale:a("DynamicInput").localeRef,rtlEnabled:U,buttonSize:x,mergedClsPrefix:o,NFormItem:p,uncontrolledValue:m,mergedValue:y,insertionDisabled:k,removeDisabled:w,handleCreateClick:function(){$(-1)},ensureKey:function(e,a){if(null==e)return a;if("object"!=typeof e)return a;const t=M(e)?N(e):e;let l=Oe.get(t);return void 0===l&&Oe.set(t,l=g()),l},handleValueChange:function(e,a){const{value:t}=y,l=Array.from(null!=t?t:[]),r=l[e];if(l[e]=a,r&&a&&"object"==typeof r&&"object"==typeof a){const e=M(r)?N(r):r,t=M(a)?N(a):a,l=Oe.get(e);void 0!==l&&Oe.set(t,l)}C(l)},remove:function(e){const{value:a}=y;if(!Array.isArray(a))return;const{min:t}=l;if(a.length<=t)return;const{onRemove:r}=l;r&&r(e);const s=Array.from(a);s.splice(e,1),C(s)},move:function(e,a){const{value:t}=y;if(!Array.isArray(t))return;const l=Array.from(t);"up"===e&&P(l,a,a-1),"down"===e&&P(l,a,a+1),C(l)},createItem:$,mergedTheme:b,cssVars:d?void 0:I,themeClass:null==S?void 0:S.themeClass,onRender:null==S?void 0:S.onRender}},render(){const{$slots:e,itemClass:a,buttonSize:t,mergedClsPrefix:l,mergedValue:r,locale:n,mergedTheme:i,keyField:o,itemStyle:u,preset:d,showSortButton:c,NFormItem:p,ensureKey:v,handleValueChange:m,remove:h,createItem:g,move:b,onRender:k,disabled:x}=this;return null==k||k(),I("div",{class:[`${l}-dynamic-input`,this.rtlEnabled&&`${l}-dynamic-input--rtl`,this.themeClass],style:this.cssVars},Array.isArray(r)&&0!==r.length?r.map((n,k)=>I("div",{key:o?n[o]:v(n,k),"data-key":o?n[o]:v(n,k),class:[`${l}-dynamic-input-item`,a],style:u},s(e.default,{value:r[k],index:k},()=>["input"===d?I(Ie,{disabled:x,clsPrefix:l,value:r[k],parentPath:p?p.path.value:void 0,path:(null==p?void 0:p.path.value)?`${p.path.value}[${k}]`:void 0,onUpdateValue:e=>{m(k,e)}}):"pair"===d?I(_e,{disabled:x,clsPrefix:l,value:r[k],parentPath:p?p.path.value:void 0,path:(null==p?void 0:p.path.value)?`${p.path.value}[${k}]`:void 0,onUpdateValue:e=>{m(k,e)}}):null]),s(e.action,{value:r[k],index:k,create:g,remove:h,move:b},()=>[I("div",{class:`${l}-dynamic-input-item__action`},I(je,{size:t},{default:()=>[I(y,{disabled:this.removeDisabled||x,theme:i.peers.Button,themeOverrides:i.peerOverrides.Button,circle:!0,onClick:()=>{h(k)}},{icon:()=>I(f,{clsPrefix:l},{default:()=>I(me,null)})}),I(y,{disabled:this.insertionDisabled||x,circle:!0,theme:i.peers.Button,themeOverrides:i.peerOverrides.Button,onClick:()=>{g(k)}},{icon:()=>I(f,{clsPrefix:l},{default:()=>I(ge,null)})}),c?I(y,{disabled:0===k||x,circle:!0,theme:i.peers.Button,themeOverrides:i.peerOverrides.Button,onClick:()=>{b("up",k)}},{icon:()=>I(f,{clsPrefix:l},{default:()=>I(ke,null)})}):null,c?I(y,{disabled:k===r.length-1||x,circle:!0,theme:i.peers.Button,themeOverrides:i.peerOverrides.Button,onClick:()=>{b("down",k)}},{icon:()=>I(f,{clsPrefix:l},{default:()=>I(be,null)})}):null]}))]))):I(y,Object.assign({block:!0,ghost:!0,dashed:!0,size:t},this.createButtonProps,{disabled:this.insertionDisabled||x,theme:i.peers.Button,themeOverrides:i.peerOverrides.Button,onClick:this.handleCreateClick}),{default:()=>w(e["create-button-default"],()=>[n.create]),icon:()=>w(e["create-button-icon"],()=>[I(f,{clsPrefix:l},{default:()=>I(ge,null)})])}))}});async function Be(){return(await G.get("/mcp/servers")).data}async function De(e){return(await G.post("/mcp/servers",e)).data}async function Ae(e){return(await G.delete(`/mcp/servers/${e}`)).data}async function Ve(e,a,t){return(await G.post(`/mcp/servers/${e}/toggle`,{app:a,enabled:t})).data}async function ze(e){return(await G.post(`/mcp/import/${e}`)).data}async function Fe(e){return(await G.post(`/mcp/servers/${e}/test`)).data}async function Te(e){return(await G.post("/mcp/servers/order",{serverIds:e})).data}async function Ee(e="json"){return(await G.get("/mcp/export",{params:{format:e}})).data}var Le={class:"drawer-header"},Me={class:"header-title"},qe={class:"drawer-footer"},Ne={class:"form-content"},Ke={key:0,class:"form-group"},We={class:"group-title"},Ge={class:"preset-grid"},Ye=["onClick"],Ze={class:"form-group"},He={class:"group-title"},Qe={class:"field"},Je={key:0,class:"field-error"},Xe={class:"field"},ea={key:1,class:"form-group"},aa={class:"group-title"},ta={class:"platform-toggles"},la={class:"platform-name"},ra={key:0,class:"platform-empty"},sa={class:"form-group"},na={class:"group-title"},ia={class:"field"},oa={class:"field"},ua={class:"field"},da={class:"field"},ca={class:"kv-row"},pa={class:"field"},va={class:"field"},ma={class:"kv-row"},fa={class:"collapse-header"},ha={class:"collapse-content"},ga={class:"field"},ya={class:"field"},ba={class:"field-row"},ka={class:"field"},wa={class:"field"},xa=b({__name:"McpFormDrawer",props:{visible:{type:Boolean,default:!1},editingServer:{type:Object,default:null},existingIds:{type:Array,default:()=>[]},platforms:{type:Array,default:()=>[]},platform:{type:String,default:"claude"},scope:{type:String,default:"user"},projectPath:{type:String,default:""}},emits:["update:visible","saved"],setup(e,{emit:a}){const{drawerWidth:t}=se(520),l=e,r=a,s=V({get:()=>l.visible,set:e=>r("update:visible",e)}),n=V(()=>!!l.editingServer),i=q([]),o=q(!1),u=q(-1),d=q(!1),{byCapability:c}=ce(),p=V(()=>l.platforms.length>0?l.platforms:c("mcp"));function v(){return Object.fromEntries(p.value.map((e,a)=>[e.key,0===a]))}const f=A({id:"",name:"",description:"",homepage:"",docs:"",apps:{},server:{type:"stdio",command:"",args:[],env:{},url:"",headers:{}}}),h=q("stdio"),g=q([]),b=q([]),k=q(""),w=V(()=>f.id.trim()&&!n.value&&l.existingIds.includes(f.id.trim())?"该 ID 已存在":"");function x(e){return l.existingIds.includes(e)}async function C(){o.value=!0;try{const e=await async function(){return(await G.get("/mcp/presets")).data}();e.success&&(i.value=e.presets)}catch(e){}finally{o.value=!1}}function j(){u.value=-1,I()}function I(){f.id="",f.name="",f.description="",f.homepage="",f.docs="",f.apps=v(),f.server={type:"stdio",command:"",args:[],env:{},url:"",headers:{}},h.value="stdio",g.value=[],b.value=[],k.value=""}async function _(){if(!f.id.trim())return void de.error("请输入服务器 ID");if(w.value)return void de.error(w.value);if("stdio"===h.value&&!f.server.command?.trim())return void de.error("请输入命令");if(("streamable_http"===h.value||"sse"===h.value)&&!f.server.url?.trim())return void de.error("请输入 URL");const e={type:h.value};if("stdio"===h.value){e.command=f.server.command,f.server.args?.length&&(e.args=f.server.args.filter(e=>e.trim()));const a={};g.value.forEach(e=>{const t=e.key.trim();t&&"[REDACTED]"!==e.value&&(a[t]=e.value)}),Object.keys(a).length>0&&(e.env=a)}else{e.url=f.server.url;const a={};b.value.forEach(e=>{const t=e.key.trim();t&&"[REDACTED]"!==e.value&&(a[t]=e.value)}),Object.keys(a).length>0&&(e.headers=a)}const a={id:f.id.trim(),name:f.name.trim()||f.id.trim(),server:e,apps:n.value?{...f.apps}:Object.fromEntries(p.value.map(e=>[e.key,!0===f.apps[e.key]]))};f.description.trim()&&(a.description=f.description.trim()),f.homepage.trim()&&(a.homepage=f.homepage.trim()),f.docs.trim()&&(a.docs=f.docs.trim()),k.value.trim()&&(a.tags=k.value.split(",").map(e=>e.trim()).filter(e=>e)),d.value=!0;try{("project"===l.scope?await ye(l.projectPath,l.platform,a.id,a.server):await De(a)).success&&(de.success(n.value?"保存成功":"添加成功"),r("saved"),s.value=!1)}catch(t){de.error(t.response?.data?.error||"保存失败")}finally{d.value=!1}}return B(()=>l.visible,e=>{e&&(C(),l.editingServer?function(){const e=l.editingServer;e&&(f.id=e.id,f.name=e.name||"",f.description=e.description||"",f.homepage=e.homepage||"",f.docs=e.docs||"",f.apps=e.apps?{...e.apps}:v(),k.value=(e.tags||[]).join(", "),e.server&&(h.value=e.server.type||"stdio",f.server={...e.server},f.server.type=h.value,e.server.env&&"object"==typeof e.server.env?g.value=Object.entries(e.server.env).map(([e,a])=>({key:e,value:a})):g.value=[],e.server.headers&&"object"==typeof e.server.headers?b.value=Object.entries(e.server.headers).map(([e,a])=>({key:e,value:a})):b.value=[]))}():(I(),u.value=-1))}),B(h,e=>{f.server.type=e}),(a,r)=>(R(),O(L(re),{show:s.value,"onUpdate:show":r[14]||(r[14]=e=>s.value=e),width:L(t),placement:"right","show-mask":!0},{default:F(()=>[S(L(ne),{closable:"","native-scrollbar":!1},{header:F(()=>[W("div",Le,[S(L(y),{quaternary:"",size:"small",onClick:r[0]||(r[0]=e=>s.value=!1)},{icon:F(()=>[S(L(m),null,{default:F(()=>[S(L(H))]),_:1})]),_:1}),W("span",Me,D(n.value?"编辑 MCP 服务器":"添加 MCP 服务器"),1)])]),footer:F(()=>[W("div",qe,[S(L(y),{onClick:r[1]||(r[1]=e=>s.value=!1)},{default:F(()=>[...r[15]||(r[15]=[P("取消",-1)])]),_:1}),S(L(y),{type:"primary",loading:d.value,onClick:_},{default:F(()=>[P(D(n.value?"保存":"添加"),1)]),_:1},8,["loading"])])]),default:F(()=>[S(L(ue),{show:o.value},{default:F(()=>[W("div",Ne,[n.value?$("",!0):(R(),K("div",Ke,[W("div",We,[S(L(m),{size:16,class:"group-icon"},{default:F(()=>[S(L(J))]),_:1}),r[16]||(r[16]=W("span",null,"快速选择",-1))]),W("div",Ge,[W("div",{class:E(["preset-chip",{active:-1===u.value}]),onClick:j},[S(L(m),{size:14},{default:F(()=>[S(L(Z))]),_:1}),r[17]||(r[17]=W("span",null,"自定义",-1))],2),(R(!0),K(T,null,U(i.value,(e,a)=>(R(),O(L(ie),{key:e.id,disabled:!x(e.id)},{trigger:F(()=>[W("div",{class:E(["preset-chip",{active:u.value===a,disabled:x(e.id)}]),onClick:t=>!x(e.id)&&function(e){u.value=e;const a=i.value[e];if(!a)return;let t=a.id,r=1;for(;l.existingIds.includes(t);)t=`${a.id}-${r}`,r++;f.id=t,f.name=a.name||a.id,f.description=a.description||"",f.homepage=a.homepage||"",f.docs=a.docs||"",k.value=(a.tags||[]).join(", "),a.server&&(h.value=a.server.type||"stdio",f.server={...a.server},f.server.type=h.value,a.server.env?g.value=Object.entries(a.server.env).map(([e,a])=>({key:e,value:a})):g.value=[],a.server.headers?b.value=Object.entries(a.server.headers).map(([e,a])=>({key:e,value:a})):b.value=[])}(a)},[P(D(e.id)+" ",1),x(e.id)?(R(),O(L(m),{key:0,size:12,class:"installed-icon"},{default:F(()=>[S(L(ae))]),_:1})):$("",!0)],10,Ye)]),default:F(()=>[r[18]||(r[18]=P(" 已安装 ",-1))]),_:2},1032,["disabled"]))),128))])])),W("div",Ze,[W("div",He,[S(L(m),{size:16,class:"group-icon"},{default:F(()=>[S(L(Y))]),_:1}),r[19]||(r[19]=W("span",null,"基本信息",-1))]),W("div",Qe,[r[20]||(r[20]=W("label",{class:"field-label"},[P(" ID "),W("span",{class:"required"},"*")],-1)),S(L(pe),{value:f.id,"onUpdate:value":r[2]||(r[2]=e=>f.id=e),placeholder:"服务器唯一标识,如 fetch、memory",disabled:n.value,status:w.value?"error":void 0},null,8,["value","disabled","status"]),w.value?(R(),K("span",Je,D(w.value),1)):$("",!0)]),W("div",Xe,[r[21]||(r[21]=W("label",{class:"field-label"},"显示名称",-1)),S(L(pe),{value:f.name,"onUpdate:value":r[3]||(r[3]=e=>f.name=e),placeholder:"可选,用于展示的名称"},null,8,["value"])])]),"project"!==e.scope?(R(),K("div",ea,[W("div",aa,[S(L(m),{size:16,class:"group-icon"},{default:F(()=>[S(L(Q))]),_:1}),r[22]||(r[22]=W("span",null,"启用平台",-1))]),W("div",ta,[(R(!0),K(T,null,U(p.value,e=>(R(),K("label",{key:e.key,class:"platform-item"},[S(L(oe),{size:"small",value:f.apps[e.key],"onUpdate:value":a=>f.apps[e.key]=a},null,8,["value","onUpdate:value"]),W("span",la,D(e.label||e.title||e.key),1)]))),128)),0===p.value.length?(R(),K("span",ra," 当前没有可用的 MCP 平台 ")):$("",!0)])])):$("",!0),W("div",sa,[W("div",na,[S(L(m),{size:16,class:"group-icon"},{default:F(()=>[S(L(X))]),_:1}),r[23]||(r[23]=W("span",null,"服务器配置",-1))]),W("div",ia,[r[27]||(r[27]=W("label",{class:"field-label"},"类型",-1)),S(L(ve),{value:h.value,"onUpdate:value":r[4]||(r[4]=e=>h.value=e),class:"type-radios"},{default:F(()=>[S(L(he),{value:"stdio"},{default:F(()=>[...r[24]||(r[24]=[W("span",{class:"radio-label"},"stdio",-1),W("span",{class:"radio-desc"},"本地命令",-1)])]),_:1}),S(L(he),{value:"streamable_http"},{default:F(()=>[...r[25]||(r[25]=[W("span",{class:"radio-label"},"streamable_http",-1)])]),_:1}),S(L(he),{value:"sse"},{default:F(()=>[...r[26]||(r[26]=[W("span",{class:"radio-label"},"sse",-1)])]),_:1})]),_:1},8,["value"])]),"stdio"===h.value?(R(),K(T,{key:0},[W("div",oa,[r[28]||(r[28]=W("label",{class:"field-label"},[P(" 命令 "),W("span",{class:"required"},"*")],-1)),S(L(pe),{value:f.server.command,"onUpdate:value":r[5]||(r[5]=e=>f.server.command=e),placeholder:"如 npx、uvx、node"},null,8,["value"])]),W("div",ua,[r[29]||(r[29]=W("label",{class:"field-label"},"参数",-1)),S(L(Re),{value:f.server.args,"onUpdate:value":r[6]||(r[6]=e=>f.server.args=e),placeholder:"点击添加参数",min:0},null,8,["value"])]),W("div",da,[r[31]||(r[31]=W("label",{class:"field-label"},"环境变量",-1)),S(L(Re),{value:g.value,"onUpdate:value":r[7]||(r[7]=e=>g.value=e),"on-create":()=>({key:"",value:""}),min:0},{default:F(({value:e})=>[W("div",ca,[S(L(pe),{value:e.key,"onUpdate:value":a=>e.key=a,placeholder:"变量名",class:"kv-key"},null,8,["value","onUpdate:value"]),r[30]||(r[30]=W("span",{class:"kv-sep"},"=",-1)),S(L(pe),{value:e.value,"onUpdate:value":a=>e.value=a,placeholder:"值",class:"kv-value"},null,8,["value","onUpdate:value"])])]),_:1},8,["value"])])],64)):(R(),K(T,{key:1},[W("div",pa,[r[32]||(r[32]=W("label",{class:"field-label"},[P(" URL "),W("span",{class:"required"},"*")],-1)),S(L(pe),{value:f.server.url,"onUpdate:value":r[8]||(r[8]=e=>f.server.url=e),placeholder:"http://localhost:3000/mcp"},null,8,["value"])]),W("div",va,[r[34]||(r[34]=W("label",{class:"field-label"},"请求头",-1)),S(L(Re),{value:b.value,"onUpdate:value":r[9]||(r[9]=e=>b.value=e),"on-create":()=>({key:"",value:""}),min:0},{default:F(({value:e})=>[W("div",ma,[S(L(pe),{value:e.key,"onUpdate:value":a=>e.key=a,placeholder:"Header 名",class:"kv-key"},null,8,["value","onUpdate:value"]),r[33]||(r[33]=W("span",{class:"kv-sep"},":",-1)),S(L(pe),{value:e.value,"onUpdate:value":a=>e.value=a,placeholder:"值",class:"kv-value"},null,8,["value","onUpdate:value"])])]),_:1},8,["value"])])],64))]),S(L(te),{class:"extra-collapse"},{default:F(()=>[S(L(le),{name:"extra"},{header:F(()=>[W("div",fa,[S(L(m),{size:16,class:"group-icon"},{default:F(()=>[S(L(ee))]),_:1}),r[35]||(r[35]=W("span",null,"附加信息",-1)),r[36]||(r[36]=W("span",{class:"collapse-hint"},"(可选)",-1))])]),default:F(()=>[W("div",ha,[W("div",ga,[r[37]||(r[37]=W("label",{class:"field-label"},"描述",-1)),S(L(pe),{value:f.description,"onUpdate:value":r[10]||(r[10]=e=>f.description=e),type:"textarea",placeholder:"服务器功能描述",rows:2},null,8,["value"])]),W("div",ya,[r[38]||(r[38]=W("label",{class:"field-label"},"标签",-1)),S(L(pe),{value:k.value,"onUpdate:value":r[11]||(r[11]=e=>k.value=e),placeholder:"用逗号分隔,如 http, web, fetch"},null,8,["value"])]),W("div",ba,[W("div",ka,[r[39]||(r[39]=W("label",{class:"field-label"},"主页",-1)),S(L(pe),{value:f.homepage,"onUpdate:value":r[12]||(r[12]=e=>f.homepage=e),placeholder:"https://github.com/..."},null,8,["value"])]),W("div",wa,[r[40]||(r[40]=W("label",{class:"field-label"},"文档",-1)),S(L(pe),{value:f.docs,"onUpdate:value":r[13]||(r[13]=e=>f.docs=e),placeholder:"https://..."},null,8,["value"])])])])]),_:1})]),_:1})])]),_:1},8,["show"])]),_:1})]),_:1},8,["show","width"]))}},[["__scopeId","data-v-f2623980"]]);export{ze as a,Ve as c,Be as i,Te as l,Ae as n,De as o,Ee as r,Fe as s,xa as t};
|
|
1
|
+
import{I as e,L as a,N as t,P as l,Qt as r,St as s,Tt as n,Yt as i,bn as o,d as u,gn as d,gt as c,hn as p,ht as v,i as m,j as f,pt as h,rn as g,s as y,t as b,vn as k,xt as w,yn as x}from"./_plugin-vue_export-helper-BeLZJZij.js";import{A as C,C as $,D as P,G as j,K as U,M as I,N as _,O as S,S as O,W as R,Z as B,_t as D,at as A,b as V,dt as z,et as F,g as T,ht as E,mt as L,nt as M,st as q,ut as N,w as K,x as W}from"./vue-vendor-BqZbbXHA.js";import{n as G}from"./client-UDwXBP9i.js";import{B as Y,Ft as Z,Mt as H,Nt as Q,Y as J,g as X,tt as ee,xt as ae}from"./icons-B2Vg-IOC.js";import{n as te,t as le}from"./CollapseItem-MxG_UD4o.js";import{n as re,t as se}from"./useResponsiveDrawer-D-DDpbnI.js";import{t as ne}from"./DrawerContent-ChXgZ1Xm.js";import{$ as ie,F as oe,I as ue,N as de,Nt as ce,ct as pe,et as ve,ht as me,q as fe,tt as he,vt as ge}from"./index-BFInlZGI.js";import{s as ye}from"./project-config-B2baPzYL.js";var be=C({name:"ArrowDown",render:()=>I("svg",{viewBox:"0 0 28 28",version:"1.1",xmlns:"http://www.w3.org/2000/svg"},I("g",{stroke:"none","stroke-width":"1","fill-rule":"evenodd"},I("g",{"fill-rule":"nonzero"},I("path",{d:"M23.7916,15.2664 C24.0788,14.9679 24.0696,14.4931 23.7711,14.206 C23.4726,13.9188 22.9978,13.928 22.7106,14.2265 L14.7511,22.5007 L14.7511,3.74792 C14.7511,3.33371 14.4153,2.99792 14.0011,2.99792 C13.5869,2.99792 13.2511,3.33371 13.2511,3.74793 L13.2511,22.4998 L5.29259,14.2265 C5.00543,13.928 4.53064,13.9188 4.23213,14.206 C3.93361,14.4931 3.9244,14.9679 4.21157,15.2664 L13.2809,24.6944 C13.6743,25.1034 14.3289,25.1034 14.7223,24.6944 L23.7916,15.2664 Z"}))))}),ke=C({name:"ArrowUp",render:()=>I("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20"},I("g",{fill:"none"},I("path",{d:"M3.13 9.163a.5.5 0 1 0 .74.674L9.5 3.67V17.5a.5.5 0 0 0 1 0V3.672l5.63 6.165a.5.5 0 0 0 .738-.674l-6.315-6.916a.746.746 0 0 0-.632-.24a.746.746 0 0 0-.476.24L3.131 9.163z",fill:"currentColor"})))}),we="0!important",xe="-1px!important";function Ce(e){return x(`${e}-type`,[p("& +",[d("button",{},[x(`${e}-type`,[k("border",{borderLeftWidth:we}),k("state-border",{left:xe})])])])])}function $e(e){return x(`${e}-type`,[p("& +",[d("button",[x(`${e}-type`,[k("border",{borderTopWidth:we}),k("state-border",{top:xe})])])])])}var Pe=d("button-group","\n flex-wrap: nowrap;\n display: inline-flex;\n position: relative;\n",[o("vertical",{flexDirection:"row"},[o("rtl",[d("button",[p("&:first-child:not(:last-child)",`\n margin-right: ${we};\n border-top-right-radius: ${we};\n border-bottom-right-radius: ${we};\n `),p("&:last-child:not(:first-child)",`\n margin-left: ${we};\n border-top-left-radius: ${we};\n border-bottom-left-radius: ${we};\n `),p("&:not(:first-child):not(:last-child)",`\n margin-left: ${we};\n margin-right: ${we};\n border-radius: ${we};\n `),Ce("default"),x("ghost",[Ce("primary"),Ce("info"),Ce("success"),Ce("warning"),Ce("error")])])])]),x("vertical",{flexDirection:"column"},[d("button",[p("&:first-child:not(:last-child)",`\n margin-bottom: ${we};\n margin-left: ${we};\n margin-right: ${we};\n border-bottom-left-radius: ${we};\n border-bottom-right-radius: ${we};\n `),p("&:last-child:not(:first-child)",`\n margin-top: ${we};\n margin-left: ${we};\n margin-right: ${we};\n border-top-left-radius: ${we};\n border-top-right-radius: ${we};\n `),p("&:not(:first-child):not(:last-child)",`\n margin: ${we};\n border-radius: ${we};\n `),$e("default"),x("ghost",[$e("primary"),$e("info"),$e("success"),$e("warning"),$e("error")])])])]),je=C({name:"ButtonGroup",props:{size:{type:String,default:void 0},vertical:Boolean},setup(a){const{mergedClsPrefixRef:t,mergedRtlRef:r}=c(a);return l("-button-group",Pe,t),j(u,a),{rtlEnabled:e("ButtonGroup",r,t),mergedClsPrefix:t}},render(){const{mergedClsPrefix:e}=this;return I("div",{class:[`${e}-button-group`,this.rtlEnabled&&`${e}-button-group--rtl`,this.vertical&&`${e}-button-group--vertical`],role:"group"},this.$slots)}}),Ue=i("n-dynamic-input"),Ie=C({name:"DynamicInputInputPreset",props:{clsPrefix:{type:String,required:!0},value:{type:String,default:""},disabled:Boolean,parentPath:String,path:String,onUpdateValue:{type:Function,required:!0}},setup(){const{mergedThemeRef:e,placeholderRef:a}=_(Ue);return{mergedTheme:e,placeholder:a}},render(){const{mergedTheme:e,placeholder:a,value:t,clsPrefix:l,onUpdateValue:r,disabled:s}=this;return I("div",{class:`${l}-dynamic-input-preset-input`},I(pe,{theme:e.peers.Input,"theme-overrides":e.peerOverrides.Input,value:t,placeholder:a,onUpdateValue:r,disabled:s}))}}),_e=C({name:"DynamicInputPairPreset",props:{clsPrefix:{type:String,required:!0},value:{type:Object,default:()=>({key:"",value:""})},disabled:Boolean,parentPath:String,path:String,onUpdateValue:{type:Function,required:!0}},setup(e){const{mergedThemeRef:a,keyPlaceholderRef:t,valuePlaceholderRef:l}=_(Ue);return{mergedTheme:a,keyPlaceholder:t,valuePlaceholder:l,handleKeyInput(a){e.onUpdateValue({key:a,value:e.value.value})},handleValueInput(a){e.onUpdateValue({key:e.value.key,value:a})}}},render(){const{mergedTheme:e,keyPlaceholder:a,valuePlaceholder:t,value:l,clsPrefix:r,disabled:s}=this;return I("div",{class:`${r}-dynamic-input-preset-pair`},I(pe,{theme:e.peers.Input,"theme-overrides":e.peerOverrides.Input,value:l.key,class:`${r}-dynamic-input-pair-input`,placeholder:a,onUpdateValue:this.handleKeyInput,disabled:s}),I(pe,{theme:e.peers.Input,"theme-overrides":e.peerOverrides.Input,value:l.value,class:`${r}-dynamic-input-pair-input`,placeholder:t,onUpdateValue:this.handleValueInput,disabled:s}))}}),Se=d("dynamic-input",{width:"100%"},[d("dynamic-input-item","\n margin-bottom: 10px;\n display: flex;\n flex-wrap: nowrap;\n ",[d("dynamic-input-preset-input",{flex:1,alignItems:"center"}),d("dynamic-input-preset-pair","\n flex: 1;\n display: flex;\n align-items: center;\n ",[d("dynamic-input-pair-input",[p("&:first-child",{"margin-right":"12px"})])]),k("action","\n align-self: flex-start;\n display: flex;\n justify-content: flex-end;\n flex-shrink: 0;\n flex-grow: 0;\n margin: var(--action-margin);\n ",[x("icon",{cursor:"pointer"})]),p("&:last-child",{marginBottom:0})]),d("form-item","\n padding-top: 0 !important;\n margin-right: 0 !important;\n ",[d("form-item-blank",{paddingTop:"0 !important"})])]),Oe=new WeakMap,Re=C({name:"DynamicInput",props:Object.assign(Object.assign({},t.props),{max:Number,min:{type:Number,default:0},value:Array,defaultValue:{type:Array,default:()=>[]},preset:{type:String,default:"input"},keyField:String,itemClass:String,itemStyle:[String,Object],keyPlaceholder:{type:String,default:""},valuePlaceholder:{type:String,default:""},placeholder:{type:String,default:""},disabled:Boolean,showSortButton:Boolean,createButtonProps:Object,onCreate:Function,onRemove:Function,"onUpdate:value":[Function,Array],onUpdateValue:[Function,Array],onClear:Function,onInput:[Function,Array]}),setup(l,{slots:s}){const{mergedComponentPropsRef:i,mergedClsPrefixRef:o,mergedRtlRef:u,inlineThemeDisabled:d}=c(),p=_(h,null),m=q(l.defaultValue),f=z(l,"value"),y=r(f,m),b=t("DynamicInput","-dynamic-input",Se,fe,l,o),k=V(()=>{const{value:e}=y;if(Array.isArray(e)){const{max:a}=l;return void 0!==a&&e.length>=a}return!1}),w=V(()=>{const{value:e}=y;return!Array.isArray(e)||e.length<=l.min}),x=V(()=>{var e,a;return null===(a=null===(e=null==i?void 0:i.value)||void 0===e?void 0:e.DynamicInput)||void 0===a?void 0:a.buttonSize});function C(e){const{onInput:a,"onUpdate:value":t,onUpdateValue:r}=l;a&&n(a,e),t&&n(t,e),r&&n(r,e),m.value=e}function $(e){const{value:a}=y,{onCreate:t}=l,r=Array.from(null!=a?a:[]);if(t)r.splice(e+1,0,t(e+1)),C(r);else if(s.default)r.splice(e+1,0,null),C(r);else switch(l.preset){case"input":r.splice(e+1,0,""),C(r);break;case"pair":r.splice(e+1,0,{key:"",value:""}),C(r)}}function P(e,a,t){if(a<0||t<0||a>=e.length||t>=e.length)return;if(a===t)return;const l=e[a];e[a]=e[t],e[t]=l}j(Ue,{mergedThemeRef:b,keyPlaceholderRef:z(l,"keyPlaceholder"),valuePlaceholderRef:z(l,"valuePlaceholder"),placeholderRef:z(l,"placeholder")});const U=e("DynamicInput",u,o),I=V(()=>{const{self:{actionMargin:e,actionMarginRtl:a}}=b.value;return{"--action-margin":e,"--action-margin-rtl":a}}),S=d?v("dynamic-input",void 0,I,l):void 0;return{locale:a("DynamicInput").localeRef,rtlEnabled:U,buttonSize:x,mergedClsPrefix:o,NFormItem:p,uncontrolledValue:m,mergedValue:y,insertionDisabled:k,removeDisabled:w,handleCreateClick:function(){$(-1)},ensureKey:function(e,a){if(null==e)return a;if("object"!=typeof e)return a;const t=M(e)?N(e):e;let l=Oe.get(t);return void 0===l&&Oe.set(t,l=g()),l},handleValueChange:function(e,a){const{value:t}=y,l=Array.from(null!=t?t:[]),r=l[e];if(l[e]=a,r&&a&&"object"==typeof r&&"object"==typeof a){const e=M(r)?N(r):r,t=M(a)?N(a):a,l=Oe.get(e);void 0!==l&&Oe.set(t,l)}C(l)},remove:function(e){const{value:a}=y;if(!Array.isArray(a))return;const{min:t}=l;if(a.length<=t)return;const{onRemove:r}=l;r&&r(e);const s=Array.from(a);s.splice(e,1),C(s)},move:function(e,a){const{value:t}=y;if(!Array.isArray(t))return;const l=Array.from(t);"up"===e&&P(l,a,a-1),"down"===e&&P(l,a,a+1),C(l)},createItem:$,mergedTheme:b,cssVars:d?void 0:I,themeClass:null==S?void 0:S.themeClass,onRender:null==S?void 0:S.onRender}},render(){const{$slots:e,itemClass:a,buttonSize:t,mergedClsPrefix:l,mergedValue:r,locale:n,mergedTheme:i,keyField:o,itemStyle:u,preset:d,showSortButton:c,NFormItem:p,ensureKey:v,handleValueChange:m,remove:h,createItem:g,move:b,onRender:k,disabled:x}=this;return null==k||k(),I("div",{class:[`${l}-dynamic-input`,this.rtlEnabled&&`${l}-dynamic-input--rtl`,this.themeClass],style:this.cssVars},Array.isArray(r)&&0!==r.length?r.map((n,k)=>I("div",{key:o?n[o]:v(n,k),"data-key":o?n[o]:v(n,k),class:[`${l}-dynamic-input-item`,a],style:u},s(e.default,{value:r[k],index:k},()=>["input"===d?I(Ie,{disabled:x,clsPrefix:l,value:r[k],parentPath:p?p.path.value:void 0,path:(null==p?void 0:p.path.value)?`${p.path.value}[${k}]`:void 0,onUpdateValue:e=>{m(k,e)}}):"pair"===d?I(_e,{disabled:x,clsPrefix:l,value:r[k],parentPath:p?p.path.value:void 0,path:(null==p?void 0:p.path.value)?`${p.path.value}[${k}]`:void 0,onUpdateValue:e=>{m(k,e)}}):null]),s(e.action,{value:r[k],index:k,create:g,remove:h,move:b},()=>[I("div",{class:`${l}-dynamic-input-item__action`},I(je,{size:t},{default:()=>[I(y,{disabled:this.removeDisabled||x,theme:i.peers.Button,themeOverrides:i.peerOverrides.Button,circle:!0,onClick:()=>{h(k)}},{icon:()=>I(f,{clsPrefix:l},{default:()=>I(me,null)})}),I(y,{disabled:this.insertionDisabled||x,circle:!0,theme:i.peers.Button,themeOverrides:i.peerOverrides.Button,onClick:()=>{g(k)}},{icon:()=>I(f,{clsPrefix:l},{default:()=>I(ge,null)})}),c?I(y,{disabled:0===k||x,circle:!0,theme:i.peers.Button,themeOverrides:i.peerOverrides.Button,onClick:()=>{b("up",k)}},{icon:()=>I(f,{clsPrefix:l},{default:()=>I(ke,null)})}):null,c?I(y,{disabled:k===r.length-1||x,circle:!0,theme:i.peers.Button,themeOverrides:i.peerOverrides.Button,onClick:()=>{b("down",k)}},{icon:()=>I(f,{clsPrefix:l},{default:()=>I(be,null)})}):null]}))]))):I(y,Object.assign({block:!0,ghost:!0,dashed:!0,size:t},this.createButtonProps,{disabled:this.insertionDisabled||x,theme:i.peers.Button,themeOverrides:i.peerOverrides.Button,onClick:this.handleCreateClick}),{default:()=>w(e["create-button-default"],()=>[n.create]),icon:()=>w(e["create-button-icon"],()=>[I(f,{clsPrefix:l},{default:()=>I(ge,null)})])}))}});async function Be(){return(await G.get("/mcp/servers")).data}async function De(e){return(await G.post("/mcp/servers",e)).data}async function Ae(e){return(await G.delete(`/mcp/servers/${e}`)).data}async function Ve(e,a,t){return(await G.post(`/mcp/servers/${e}/toggle`,{app:a,enabled:t})).data}async function ze(e){return(await G.post(`/mcp/import/${e}`)).data}async function Fe(e){return(await G.post(`/mcp/servers/${e}/test`)).data}async function Te(e){return(await G.post("/mcp/servers/order",{serverIds:e})).data}async function Ee(e="json"){return(await G.get("/mcp/export",{params:{format:e}})).data}var Le={class:"drawer-header"},Me={class:"header-title"},qe={class:"drawer-footer"},Ne={class:"form-content"},Ke={key:0,class:"form-group"},We={class:"group-title"},Ge={class:"preset-grid"},Ye=["onClick"],Ze={class:"form-group"},He={class:"group-title"},Qe={class:"field"},Je={key:0,class:"field-error"},Xe={class:"field"},ea={key:1,class:"form-group"},aa={class:"group-title"},ta={class:"platform-toggles"},la={class:"platform-name"},ra={key:0,class:"platform-empty"},sa={class:"form-group"},na={class:"group-title"},ia={class:"field"},oa={class:"field"},ua={class:"field"},da={class:"field"},ca={class:"kv-row"},pa={class:"field"},va={class:"field"},ma={class:"kv-row"},fa={class:"collapse-header"},ha={class:"collapse-content"},ga={class:"field"},ya={class:"field"},ba={class:"field-row"},ka={class:"field"},wa={class:"field"},xa=b({__name:"McpFormDrawer",props:{visible:{type:Boolean,default:!1},editingServer:{type:Object,default:null},existingIds:{type:Array,default:()=>[]},platforms:{type:Array,default:()=>[]},platform:{type:String,default:"claude"},scope:{type:String,default:"user"},projectPath:{type:String,default:""}},emits:["update:visible","saved"],setup(e,{emit:a}){const{drawerWidth:t}=se(520),l=e,r=a,s=V({get:()=>l.visible,set:e=>r("update:visible",e)}),n=V(()=>!!l.editingServer),i=q([]),o=q(!1),u=q(-1),d=q(!1),{byCapability:c}=ce(),p=V(()=>l.platforms.length>0?l.platforms:c("mcp"));function v(){return Object.fromEntries(p.value.map((e,a)=>[e.key,0===a]))}const f=A({id:"",name:"",description:"",homepage:"",docs:"",apps:{},server:{type:"stdio",command:"",args:[],env:{},url:"",headers:{}}}),h=q("stdio"),g=q([]),b=q([]),k=q(""),w=V(()=>f.id.trim()&&!n.value&&l.existingIds.includes(f.id.trim())?"该 ID 已存在":"");function x(e){return l.existingIds.includes(e)}async function C(){o.value=!0;try{const e=await async function(){return(await G.get("/mcp/presets")).data}();e.success&&(i.value=e.presets)}catch(e){}finally{o.value=!1}}function j(){u.value=-1,I()}function I(){f.id="",f.name="",f.description="",f.homepage="",f.docs="",f.apps=v(),f.server={type:"stdio",command:"",args:[],env:{},url:"",headers:{}},h.value="stdio",g.value=[],b.value=[],k.value=""}async function _(){if(!f.id.trim())return void de.error("请输入服务器 ID");if(w.value)return void de.error(w.value);if("stdio"===h.value&&!f.server.command?.trim())return void de.error("请输入命令");if(("streamable_http"===h.value||"sse"===h.value)&&!f.server.url?.trim())return void de.error("请输入 URL");const e={type:h.value};if("stdio"===h.value){e.command=f.server.command,f.server.args?.length&&(e.args=f.server.args.filter(e=>e.trim()));const a={};g.value.forEach(e=>{const t=e.key.trim();t&&"[REDACTED]"!==e.value&&(a[t]=e.value)}),Object.keys(a).length>0&&(e.env=a)}else{e.url=f.server.url;const a={};b.value.forEach(e=>{const t=e.key.trim();t&&"[REDACTED]"!==e.value&&(a[t]=e.value)}),Object.keys(a).length>0&&(e.headers=a)}const a={id:f.id.trim(),name:f.name.trim()||f.id.trim(),server:e,apps:n.value?{...f.apps}:Object.fromEntries(p.value.map(e=>[e.key,!0===f.apps[e.key]]))};f.description.trim()&&(a.description=f.description.trim()),f.homepage.trim()&&(a.homepage=f.homepage.trim()),f.docs.trim()&&(a.docs=f.docs.trim()),k.value.trim()&&(a.tags=k.value.split(",").map(e=>e.trim()).filter(e=>e)),d.value=!0;try{("project"===l.scope?await ye(l.projectPath,l.platform,a.id,a.server):await De(a)).success&&(de.success(n.value?"保存成功":"添加成功"),r("saved"),s.value=!1)}catch(t){de.error(t.response?.data?.error||"保存失败")}finally{d.value=!1}}return B(()=>l.visible,e=>{e&&(C(),l.editingServer?function(){const e=l.editingServer;e&&(f.id=e.id,f.name=e.name||"",f.description=e.description||"",f.homepage=e.homepage||"",f.docs=e.docs||"",f.apps=e.apps?{...e.apps}:v(),k.value=(e.tags||[]).join(", "),e.server&&(h.value=e.server.type||"stdio",f.server={...e.server},f.server.type=h.value,e.server.env&&"object"==typeof e.server.env?g.value=Object.entries(e.server.env).map(([e,a])=>({key:e,value:a})):g.value=[],e.server.headers&&"object"==typeof e.server.headers?b.value=Object.entries(e.server.headers).map(([e,a])=>({key:e,value:a})):b.value=[]))}():(I(),u.value=-1))}),B(h,e=>{f.server.type=e}),(a,r)=>(R(),O(L(re),{show:s.value,"onUpdate:show":r[14]||(r[14]=e=>s.value=e),width:L(t),placement:"right","show-mask":!0},{default:F(()=>[S(L(ne),{closable:"","native-scrollbar":!1},{header:F(()=>[W("div",Le,[S(L(y),{quaternary:"",size:"small",onClick:r[0]||(r[0]=e=>s.value=!1)},{icon:F(()=>[S(L(m),null,{default:F(()=>[S(L(H))]),_:1})]),_:1}),W("span",Me,D(n.value?"编辑 MCP 服务器":"添加 MCP 服务器"),1)])]),footer:F(()=>[W("div",qe,[S(L(y),{onClick:r[1]||(r[1]=e=>s.value=!1)},{default:F(()=>[...r[15]||(r[15]=[P("取消",-1)])]),_:1}),S(L(y),{type:"primary",loading:d.value,onClick:_},{default:F(()=>[P(D(n.value?"保存":"添加"),1)]),_:1},8,["loading"])])]),default:F(()=>[S(L(ue),{show:o.value},{default:F(()=>[W("div",Ne,[n.value?$("",!0):(R(),K("div",Ke,[W("div",We,[S(L(m),{size:16,class:"group-icon"},{default:F(()=>[S(L(J))]),_:1}),r[16]||(r[16]=W("span",null,"快速选择",-1))]),W("div",Ge,[W("div",{class:E(["preset-chip",{active:-1===u.value}]),onClick:j},[S(L(m),{size:14},{default:F(()=>[S(L(Z))]),_:1}),r[17]||(r[17]=W("span",null,"自定义",-1))],2),(R(!0),K(T,null,U(i.value,(e,a)=>(R(),O(L(ie),{key:e.id,disabled:!x(e.id)},{trigger:F(()=>[W("div",{class:E(["preset-chip",{active:u.value===a,disabled:x(e.id)}]),onClick:t=>!x(e.id)&&function(e){u.value=e;const a=i.value[e];if(!a)return;let t=a.id,r=1;for(;l.existingIds.includes(t);)t=`${a.id}-${r}`,r++;f.id=t,f.name=a.name||a.id,f.description=a.description||"",f.homepage=a.homepage||"",f.docs=a.docs||"",k.value=(a.tags||[]).join(", "),a.server&&(h.value=a.server.type||"stdio",f.server={...a.server},f.server.type=h.value,a.server.env?g.value=Object.entries(a.server.env).map(([e,a])=>({key:e,value:a})):g.value=[],a.server.headers?b.value=Object.entries(a.server.headers).map(([e,a])=>({key:e,value:a})):b.value=[])}(a)},[P(D(e.id)+" ",1),x(e.id)?(R(),O(L(m),{key:0,size:12,class:"installed-icon"},{default:F(()=>[S(L(ae))]),_:1})):$("",!0)],10,Ye)]),default:F(()=>[r[18]||(r[18]=P(" 已安装 ",-1))]),_:2},1032,["disabled"]))),128))])])),W("div",Ze,[W("div",He,[S(L(m),{size:16,class:"group-icon"},{default:F(()=>[S(L(Y))]),_:1}),r[19]||(r[19]=W("span",null,"基本信息",-1))]),W("div",Qe,[r[20]||(r[20]=W("label",{class:"field-label"},[P(" ID "),W("span",{class:"required"},"*")],-1)),S(L(pe),{value:f.id,"onUpdate:value":r[2]||(r[2]=e=>f.id=e),placeholder:"服务器唯一标识,如 fetch、memory",disabled:n.value,status:w.value?"error":void 0},null,8,["value","disabled","status"]),w.value?(R(),K("span",Je,D(w.value),1)):$("",!0)]),W("div",Xe,[r[21]||(r[21]=W("label",{class:"field-label"},"显示名称",-1)),S(L(pe),{value:f.name,"onUpdate:value":r[3]||(r[3]=e=>f.name=e),placeholder:"可选,用于展示的名称"},null,8,["value"])])]),"project"!==e.scope?(R(),K("div",ea,[W("div",aa,[S(L(m),{size:16,class:"group-icon"},{default:F(()=>[S(L(Q))]),_:1}),r[22]||(r[22]=W("span",null,"启用平台",-1))]),W("div",ta,[(R(!0),K(T,null,U(p.value,e=>(R(),K("label",{key:e.key,class:"platform-item"},[S(L(oe),{size:"small",value:f.apps[e.key],"onUpdate:value":a=>f.apps[e.key]=a},null,8,["value","onUpdate:value"]),W("span",la,D(e.label||e.title||e.key),1)]))),128)),0===p.value.length?(R(),K("span",ra," 当前没有可用的 MCP 平台 ")):$("",!0)])])):$("",!0),W("div",sa,[W("div",na,[S(L(m),{size:16,class:"group-icon"},{default:F(()=>[S(L(X))]),_:1}),r[23]||(r[23]=W("span",null,"服务器配置",-1))]),W("div",ia,[r[27]||(r[27]=W("label",{class:"field-label"},"类型",-1)),S(L(ve),{value:h.value,"onUpdate:value":r[4]||(r[4]=e=>h.value=e),class:"type-radios"},{default:F(()=>[S(L(he),{value:"stdio"},{default:F(()=>[...r[24]||(r[24]=[W("span",{class:"radio-label"},"stdio",-1),W("span",{class:"radio-desc"},"本地命令",-1)])]),_:1}),S(L(he),{value:"streamable_http"},{default:F(()=>[...r[25]||(r[25]=[W("span",{class:"radio-label"},"streamable_http",-1)])]),_:1}),S(L(he),{value:"sse"},{default:F(()=>[...r[26]||(r[26]=[W("span",{class:"radio-label"},"sse",-1)])]),_:1})]),_:1},8,["value"])]),"stdio"===h.value?(R(),K(T,{key:0},[W("div",oa,[r[28]||(r[28]=W("label",{class:"field-label"},[P(" 命令 "),W("span",{class:"required"},"*")],-1)),S(L(pe),{value:f.server.command,"onUpdate:value":r[5]||(r[5]=e=>f.server.command=e),placeholder:"如 npx、uvx、node"},null,8,["value"])]),W("div",ua,[r[29]||(r[29]=W("label",{class:"field-label"},"参数",-1)),S(L(Re),{value:f.server.args,"onUpdate:value":r[6]||(r[6]=e=>f.server.args=e),placeholder:"点击添加参数",min:0},null,8,["value"])]),W("div",da,[r[31]||(r[31]=W("label",{class:"field-label"},"环境变量",-1)),S(L(Re),{value:g.value,"onUpdate:value":r[7]||(r[7]=e=>g.value=e),"on-create":()=>({key:"",value:""}),min:0},{default:F(({value:e})=>[W("div",ca,[S(L(pe),{value:e.key,"onUpdate:value":a=>e.key=a,placeholder:"变量名",class:"kv-key"},null,8,["value","onUpdate:value"]),r[30]||(r[30]=W("span",{class:"kv-sep"},"=",-1)),S(L(pe),{value:e.value,"onUpdate:value":a=>e.value=a,placeholder:"值",class:"kv-value"},null,8,["value","onUpdate:value"])])]),_:1},8,["value"])])],64)):(R(),K(T,{key:1},[W("div",pa,[r[32]||(r[32]=W("label",{class:"field-label"},[P(" URL "),W("span",{class:"required"},"*")],-1)),S(L(pe),{value:f.server.url,"onUpdate:value":r[8]||(r[8]=e=>f.server.url=e),placeholder:"http://localhost:3000/mcp"},null,8,["value"])]),W("div",va,[r[34]||(r[34]=W("label",{class:"field-label"},"请求头",-1)),S(L(Re),{value:b.value,"onUpdate:value":r[9]||(r[9]=e=>b.value=e),"on-create":()=>({key:"",value:""}),min:0},{default:F(({value:e})=>[W("div",ma,[S(L(pe),{value:e.key,"onUpdate:value":a=>e.key=a,placeholder:"Header 名",class:"kv-key"},null,8,["value","onUpdate:value"]),r[33]||(r[33]=W("span",{class:"kv-sep"},":",-1)),S(L(pe),{value:e.value,"onUpdate:value":a=>e.value=a,placeholder:"值",class:"kv-value"},null,8,["value","onUpdate:value"])])]),_:1},8,["value"])])],64))]),S(L(te),{class:"extra-collapse"},{default:F(()=>[S(L(le),{name:"extra"},{header:F(()=>[W("div",fa,[S(L(m),{size:16,class:"group-icon"},{default:F(()=>[S(L(ee))]),_:1}),r[35]||(r[35]=W("span",null,"附加信息",-1)),r[36]||(r[36]=W("span",{class:"collapse-hint"},"(可选)",-1))])]),default:F(()=>[W("div",ha,[W("div",ga,[r[37]||(r[37]=W("label",{class:"field-label"},"描述",-1)),S(L(pe),{value:f.description,"onUpdate:value":r[10]||(r[10]=e=>f.description=e),type:"textarea",placeholder:"服务器功能描述",rows:2},null,8,["value"])]),W("div",ya,[r[38]||(r[38]=W("label",{class:"field-label"},"标签",-1)),S(L(pe),{value:k.value,"onUpdate:value":r[11]||(r[11]=e=>k.value=e),placeholder:"用逗号分隔,如 http, web, fetch"},null,8,["value"])]),W("div",ba,[W("div",ka,[r[39]||(r[39]=W("label",{class:"field-label"},"主页",-1)),S(L(pe),{value:f.homepage,"onUpdate:value":r[12]||(r[12]=e=>f.homepage=e),placeholder:"https://github.com/..."},null,8,["value"])]),W("div",wa,[r[40]||(r[40]=W("label",{class:"field-label"},"文档",-1)),S(L(pe),{value:f.docs,"onUpdate:value":r[13]||(r[13]=e=>f.docs=e),placeholder:"https://..."},null,8,["value"])])])])]),_:1})]),_:1})])]),_:1},8,["show"])]),_:1})]),_:1},8,["show","width"]))}},[["__scopeId","data-v-f2623980"]]);export{ze as a,Ve as c,Be as i,Te as l,Ae as n,De as o,Ee as r,Fe as s,xa as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as a}from"./_plugin-vue_export-helper-BeLZJZij.js";import{O as e,W as r,et as s,mt as t,w as i}from"./vue-vendor-BqZbbXHA.js";import{O as o}from"./light-Cp0t7v32.js";import{t as l}from"./PluginsPanel-
|
|
1
|
+
import{t as a}from"./_plugin-vue_export-helper-BeLZJZij.js";import{O as e,W as r,et as s,mt as t,w as i}from"./vue-vendor-BqZbbXHA.js";import{O as o}from"./light-Cp0t7v32.js";import{t as l}from"./PluginsPanel-CKuBs38B.js";var d={class:"plugin-manager"},m=a({__name:"PluginManager",setup:a=>(a,m)=>(r(),i("div",d,[e(t(o),{title:"Plugins 插件管理",bordered:!1},{default:s(()=>[e(l,{"in-drawer":!1,"hide-back":!0})]),_:1})]))},[["__scopeId","data-v-6d92033b"]]);export{m as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as e}from"./_plugin-vue_export-helper-BeLZJZij.js";import{O as a,S as t,W as r,b as s,et as l,mt as o,x as i}from"./vue-vendor-BqZbbXHA.js";import{n as p,t as d}from"./useResponsiveDrawer-
|
|
1
|
+
import{t as e}from"./_plugin-vue_export-helper-BeLZJZij.js";import{O as a,S as t,W as r,b as s,et as l,mt as o,x as i}from"./vue-vendor-BqZbbXHA.js";import{n as p,t as d}from"./useResponsiveDrawer-D-DDpbnI.js";import{t as n}from"./DrawerContent-ChXgZ1Xm.js";import{t as u}from"./PluginsPanel-CKuBs38B.js";var m=e({__name:"PluginsDrawer",props:{visible:Boolean,platform:{type:String,default:""},projectPath:{type:String,default:""}},emits:["update:visible"],setup(e,{emit:m}){const v=e,f=m,{drawerWidth:c}=d(720),h=s({get:()=>v.visible,set:e=>f("update:visible",e)}),w={padding:0,display:"flex",flexDirection:"column",overflow:"hidden"};return(e,s)=>(r(),t(o(p),{show:h.value,"onUpdate:show":s[1]||(s[1]=e=>h.value=e),width:o(c),placement:"right","mask-closable":!0},{default:l(()=>[a(o(n),{closable:"","native-scrollbar":!1,"body-content-style":w},{header:l(()=>[...s[2]||(s[2]=[i("div",{class:"drawer-header"},[i("span",null,"插件管理")],-1)])]),default:l(()=>[a(u,{onBack:s[0]||(s[0]=e=>h.value=!1),"hide-back":!0,"in-drawer":!0,"drawer-visible":h.value,platform:v.platform,"project-path":v.projectPath},null,8,["drawer-visible","platform","project-path"])]),_:1})]),_:1},8,["show","width"]))}},[["__scopeId","data-v-f34c728b"]]);export{m as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{i as e,s as a,t as l}from"./_plugin-vue_export-helper-BeLZJZij.js";import{C as t,D as s,K as n,O as i,S as r,V as o,W as u,Z as c,_t as p,b as d,et as v,g as m,ht as y,m as f,mt as g,p as h,r as k,st as b,w,x as P}from"./vue-vendor-BqZbbXHA.js";import{n as _}from"./client-UDwXBP9i.js";import{r as j,s as U,t as C}from"./platforms-CBkB45JP.js";import{A as $,B as L,Ft as T,G as I,L as z,Mt as x,Z as O,_ as S,ft as B,o as H,tt as A,w as G}from"./icons-B2Vg-IOC.js";import{t as R}from"./use-message-DoLM8C1C.js";import{l as M}from"./light-Cp0t7v32.js";import{c as D,n as N,s as K,t as E}from"./AssetPathField-CrJtRKHy.js";import{n as q,t as V}from"./useResponsiveDrawer-B3uojyvV.js";import{t as F}from"./DrawerContent-ChXgZ1Xm.js";import{F as Q,I as W,N as Z,Nt as J,O as X,ct as Y,dt as ee,k as ae,lt as le,nt as te,pt as se}from"./index-DnEocV0M.js";import{t as ne}from"./markdown-u082bbtj.js";import{n as ie,t as re}from"./skill-repo-input-B_fkGlUK.js";function oe(e={},a={}){return{...e,...a.cwd?{cwd:a.cwd}:{},...a.scope?{scope:a.scope}:{}}}async function ue(e,a,l="claude",t="",s={},n={}){const i=oe({platform:l},s);return t?(i.source=t,Object.assign(i,{pluginId:n.pluginId||t,name:n.name,pluginKind:n.pluginKind,marketplace:n.marketplace,installSource:n.installSource,version:n.version,description:n.description,resourceTypes:n.resourceTypes})):(i.directory=e,i.repo=a),(await _.post("/plugins/install",i)).data}async function ce(e,a="claude",l={}){return(await _.post("/plugins/repos",oe({...e,platform:a},l))).data}async function pe(e,a={},l="claude"){return(await _.put("/plugins/repos/auth",{id:e.id||"",owner:e.owner||"",name:e.name||"",token:a.token||"",clearToken:!!a.clearToken,platform:l})).data}async function de(e="claude",a={}){return(await _.post("/plugins/repos/sync",oe({platform:e},a))).data}var ve={class:"asset-card-main"},me={class:"asset-card-top"},ye={class:"asset-card-title-stack"},fe={class:"asset-card-title-row"},ge={class:"asset-name"},he={class:"asset-tags"},ke={key:0,class:"asset-description"},be={class:"asset-meta"},we={class:"asset-meta-item mono"},Pe=["href"],_e={__name:"PluginCard",props:{plugin:{type:Object,required:!0},readonly:{type:Boolean,default:!1},canInstall:{type:Boolean,default:!0},canUninstall:{type:Boolean,default:!0},installing:{type:Boolean,default:!1},uninstalling:{type:Boolean,default:!1}},emits:["click","install","uninstall"],setup(e){function l(e){return!!(e?.installSource||e?.repoOwner||e?.repoProjectPath||e?.repoLocalPath)}return(n,i)=>{return u(),w("div",{class:y(["plugin-card asset-card",{"is-installed":e.plugin.installed,"is-disabled":e.readonly}]),onClick:i[4]||(i[4]=a=>n.$emit("click",e.plugin))},[P("div",ve,[P("div",me,[P("div",ye,[P("div",fe,[P("span",{class:y(["asset-status-dot",{active:e.plugin.installed}])},null,2),P("span",ge,p(e.plugin.name),1)]),P("div",he,[e.plugin.installed?(u(),r(g(ee),{key:0,type:"success",size:"tiny",bordered:!1},{default:v(()=>[...i[5]||(i[5]=[s("已安装",-1)])]),_:1})):t("",!0),e.readonly?(u(),r(g(ee),{key:1,type:"default",size:"tiny",bordered:!1},{default:v(()=>[...i[6]||(i[6]=[s("只读",-1)])]),_:1})):t("",!0),e.plugin.scope?(u(),r(g(ee),{key:2,type:"info",size:"tiny",bordered:!1},{default:v(()=>[s(p("project"===e.plugin.scope?"项目":"全局"),1)]),_:1})):t("",!0),"extension"===e.plugin.pluginKind?(u(),r(g(ee),{key:3,type:"default",size:"tiny",bordered:!1},{default:v(()=>[...i[7]||(i[7]=[s("扩展",-1)])]),_:1})):t("",!0),"skill-bundle"===e.plugin.pluginKind?(u(),r(g(ee),{key:4,type:"warning",size:"tiny",bordered:!1},{default:v(()=>[...i[8]||(i[8]=[s("技能包插件",-1)])]),_:1})):t("",!0),"gitlab"===e.plugin.repoProvider?(u(),r(g(ee),{key:5,type:"info",size:"tiny",bordered:!1},{default:v(()=>[...i[9]||(i[9]=[s("GitLab",-1)])]),_:1})):"local"===e.plugin.repoProvider?(u(),r(g(ee),{key:6,type:"info",size:"tiny",bordered:!1},{default:v(()=>[...i[10]||(i[10]=[s("本地",-1)])]),_:1})):e.plugin.repoOwner?(u(),r(g(ee),{key:7,type:"info",size:"tiny",bordered:!1},{default:v(()=>[s(p(e.plugin.repoOwner),1)]),_:1})):t("",!0)])])]),e.plugin.description?(u(),w("div",ke,p((c=e.plugin.description,d=120,c?.length>d?c.slice(0,d)+"...":c)),1)):t("",!0),P("div",be,[P("span",we,p(e.plugin.directory),1),e.plugin.readmeUrl?(u(),w("a",{key:0,class:"asset-link",href:e.plugin.readmeUrl,target:"_blank",onClick:i[0]||(i[0]=f(()=>{},["stop"]))},p((o=e.plugin,"gitlab"===o?.repoProvider?"GitLab":"local"===o?.repoProvider?"本地":"GitHub")),9,Pe)):t("",!0)])]),e.readonly?t("",!0):(u(),w("div",{key:0,class:"asset-card-actions",onClick:i[3]||(i[3]=f(()=>{},["stop"]))},[e.plugin.installed&&e.canUninstall?(u(),r(g(a),{key:0,size:"small",tertiary:"",type:"error",loading:e.uninstalling,focusable:!1,onClick:i[1]||(i[1]=a=>n.$emit("uninstall",e.plugin))},{default:v(()=>[...i[11]||(i[11]=[s("卸载",-1)])]),_:1},8,["loading"])):e.canInstall?(u(),r(g(a),{key:1,size:"small",type:"primary",loading:e.installing,disabled:!l(e.plugin),focusable:!1,onClick:i[2]||(i[2]=a=>n.$emit("install",e.plugin))},{default:v(()=>[...i[12]||(i[12]=[s("安装",-1)])]),_:1},8,["loading","disabled"])):t("",!0)]))],2);var o,c,d}}},je={class:"repo-manager"},Ue={class:"repo-list"},Ce={class:"repo-main"},$e={class:"repo-info"},Le={class:"repo-name-row"},Te={class:"repo-name"},Ie={class:"repo-branch"},ze={key:0,class:"repo-auth-hint"},xe={class:"repo-actions"},Oe={key:0,class:"empty-hint"},Se={class:"add-repo"},Be={class:"add-title"},He={class:"add-form"},Ae={class:"add-hint"},Ge={class:"tips"},Re={key:0,class:"recommended"},Me={class:"recommended-list"},De=["onClick"],Ne={class:"rec-info"},Ke={class:"rec-name"},Ee={class:"rec-desc"},qe={key:0,class:"auth-manager"},Ve={class:"auth-meta"},Fe={class:"auth-meta-row"},Qe={class:"auth-value"},We={class:"auth-meta-row"},Ze={class:"auth-value"},Je={class:"auth-meta-row"},Xe={class:"auth-value"},Ye={class:"auth-actions"},ea=l({__name:"PluginRepoManager",props:{visible:Boolean,platform:{type:String,default:"claude"},projectPath:{type:String,default:""},capabilities:{type:Object,default:()=>({})}},emits:["update:visible","updated"],setup(l,{emit:f}){const k=l,j=f,U=d({get:()=>k.visible,set:e=>j("update:visible",e)}),C=b([]),$=b(!1),L=b(!1),I=b(!1),z=b(!1),x=b(null),O=b(!1),S=b(!1),B=b({token:""}),A=b({input:"",branch:"main"}),G=d(()=>"native-marketplace"===k.capabilities.repositoryMode),R=d(()=>({...k.projectPath?{cwd:k.projectPath}:{}})),D=d(()=>x.value?("gitlab"===x.value.provider?"GitLab":"GitHub")+" 仓库认证":"仓库认证"),N=d(()=>"opencode"===k.platform?[{owner:"Tommertom",name:"opencode-plugin-marketplace",url:"https://github.com/Tommertom/opencode-plugin-marketplace",description:"OpenCode 插件市场",branch:"main"},{owner:"avifenesh",name:"awesome-slash",url:"https://github.com/avifenesh/awesome-slash",description:"Awesome Slash 命令集",branch:"main"},{owner:"NeoLabHQ",name:"context-engineering-kit",url:"https://github.com/NeoLabHQ/context-engineering-kit",description:"上下文工程工具包",branch:"master"},{owner:"awesome-opencode",name:"awesome-opencode",url:"https://github.com/awesome-opencode/awesome-opencode",description:"OpenCode 生态聚合",branch:"main"},{owner:"sst",name:"opencode",url:"https://github.com/sst/opencode",description:"OpenCode 官方仓库",branch:"dev"}]:"codex"===k.platform||"omp"===k.platform?[]:[{owner:"anthropics",name:"claude-plugins-official",url:"https://github.com/anthropics/claude-plugins-official",description:"官方插件库",branch:"main"}]),K=d(()=>G.value?Boolean(A.value.input.trim()):!!ie(A.value.input.trim()));function E(e){const a=e.provider||(e.localPath?"local":e.projectPath?"gitlab":"github"),l=e.branch||"main",t=re(e.directory);return"local"===a?`local:${e.localPath||""}::${t}`:"gitlab"===a?`gitlab:${e.host||"https://gitlab.com"}::${e.projectPath||""}::${l}::${t}`:`github:${e.host||"https://github.com"}::${e.owner||""}/${e.name||""}::${l}::${t}`}function q(e){return"omp-marketplace"===e.provider?e.label||e.name||e.id:"local"===e.provider?e.localPath||e.name||"本地仓库":"gitlab"===e.provider&&e.projectPath||[e.owner,e.name].filter(Boolean).join("/")}function V(e){if("omp-marketplace"===e.provider)return e.sourceUri||e.source||"";const a=[];return"local"===e.provider?a.push("本地仓库"):"gitlab"===e.provider?(a.push("GitLab"),e.host&&a.push(e.host.replace(/^https?:\/\//,""))):a.push("GitHub"),e.branch&&a.push(e.branch),e.directory&&a.push(`目录: ${e.directory}`),a.join(" · ")}function F(e){return"github"===e?.provider||"gitlab"===e?.provider}function J(e){return F(e)?e.hasToken?`仓库 Token: ${e.tokenPreview||"已配置"}`:"gitlab"===e.provider?"未配置仓库 Token,将回退到全局 Token、glab 或 git credential":"未配置仓库 Token,可选配置后优先用于 GitHub API 访问":""}function X(){z.value=!1,x.value=null,B.value.token="",O.value=!1,S.value=!1}async function ae(){$.value=!0;try{const e=await async function(e="claude",a={}){return(await _.get("/plugins/repos",{params:oe({platform:e},a)})).data}(k.platform,R.value);e.success&&(C.value=e.repos||[])}catch(e){Z.error("加载仓库失败: "+e.message)}finally{$.value=!1}}async function te(){I.value=!0;try{const e=await de(k.platform,R.value);e.success&&(Array.isArray(e.repos)&&(C.value=e.repos),Z.success("仓库同步成功"),j("updated"))}catch(e){Z.error("同步失败: "+e.message)}finally{I.value=!1}}async function se(){if(!K.value)return;const e=G.value?{source:A.value.input.trim()}:ie(A.value.input.trim());L.value=!0;try{const a=await ce({...e,branch:A.value.branch||"main",enabled:!0},k.platform,R.value);a.success&&(C.value=a.repos,A.value.input="",A.value.branch="main",Z.success("仓库添加成功"),j("updated"))}catch(a){Z.error("添加失败: "+a.message)}finally{L.value=!1}}async function ne(e){try{const a=await async function(e,a="claude",l={}){return(await _.delete("/plugins/repos",{params:oe({platform:a,id:e.id||"",owner:e.owner||"",name:e.name||""},l)})).data}(e,k.platform,R.value);a.success&&(C.value=a.repos,Z.success("仓库已删除"),j("updated"))}catch(a){Z.error("删除失败: "+a.message)}}async function ue(e,a){try{const l=await async function(e,a,l="claude"){return(await _.put("/plugins/repos/toggle",{id:e.id||"",owner:e.owner||"",name:e.name||"",enabled:a,platform:l})).data}(e,a,k.platform);l.success&&(C.value=l.repos,j("updated"))}catch(l){Z.error("操作失败: "+l.message)}}async function ve(){const e=x.value,a=B.value.token.trim();if(e&&a){O.value=!0;try{const l=await pe(e,{token:a},k.platform);l.success&&(C.value=l.repos||[],Z.success("仓库 Token 已保存"),j("updated"),X())}catch(l){Z.error("保存 Token 失败: "+l.message)}finally{O.value=!1}}}async function me(){const e=x.value;if(e){S.value=!0;try{const a=await pe(e,{clearToken:!0},k.platform);a.success&&(C.value=a.repos||[],Z.success("仓库 Token 已清除"),j("updated"),X())}catch(a){Z.error("清除 Token 失败: "+a.message)}finally{S.value=!1}}}function ye(e){const a=E(e);return C.value.some(e=>E(e)===a)}function fe(){X(),j("update:visible",!1)}return c(()=>k.visible,e=>{e&&ae()}),c(()=>k.platform,()=>{k.visible&&ae()}),o(()=>{k.visible&&ae()}),(o,c)=>(u(),w(m,null,[i(g(M),{show:U.value,"onUpdate:show":c[2]||(c[2]=e=>U.value=e),preset:"card",title:G.value?"OMP Marketplace 管理":"插件仓库管理",bordered:!1,closable:!0,style:{width:"480px","max-width":"90vw"},onClose:fe},{"header-extra":v(()=>[i(g(a),{type:"primary",size:"small",loading:I.value,focusable:!1,onClick:te},{icon:v(()=>[i(g(e),null,{default:v(()=>[i(g(H))]),_:1})]),default:v(()=>[s(" "+p(G.value?"刷新":"同步"),1)]),_:1},8,["loading"])]),default:v(()=>[P("div",je,[P("div",Ue,[i(g(W),{show:$.value},{default:v(()=>[(u(!0),w(m,null,n(C.value,e=>(u(),w("div",{key:e.id||`${e.owner}/${e.name}/${e.localPath||""}`,class:"repo-item"},[P("div",Ce,[!1!==l.capabilities.repositoryToggle?(u(),r(g(Q),{key:0,value:e.enabled,size:"small","onUpdate:value":a=>ue(e,a)},null,8,["value","onUpdate:value"])):t("",!0),P("div",$e,[P("div",Le,[P("div",Te,p(q(e)),1),!1!==l.capabilities.repositoryAuth&&F(e)?(u(),r(g(ee),{key:0,size:"tiny",type:e.hasToken?"success":"default",bordered:!1},{default:v(()=>[s(p(e.hasToken?"已配 Token":"未配 Token"),1)]),_:2},1032,["type"])):t("",!0)]),P("div",Ie,p(V(e)),1),!1!==l.capabilities.repositoryAuth&&F(e)?(u(),w("div",ze,p(J(e)),1)):t("",!0)])]),P("div",xe,[!1!==l.capabilities.repositoryAuth&&F(e)?(u(),r(g(a),{key:0,text:"",type:"primary",size:"tiny",focusable:!1,onClick:a=>function(e){F(e)&&(x.value=e,B.value.token="",z.value=!0)}(e)},{default:v(()=>[...c[5]||(c[5]=[s(" 认证 ",-1)])]),_:1},8,["onClick"])):t("",!0),i(g(a),{text:"",type:"error",size:"tiny",focusable:!1,onClick:a=>ne(e)},{default:v(()=>[...c[6]||(c[6]=[s(" 删除 ",-1)])]),_:1},8,["onClick"])])]))),128)),0===C.value.length?(u(),w("div",Oe," 暂无仓库,请添加 ")):t("",!0)]),_:1},8,["show"])]),P("div",Se,[P("div",Be,p(G.value?"添加 Marketplace source":"添加仓库"),1),P("div",He,[i(g(Y),{value:A.value.input,"onUpdate:value":c[0]||(c[0]=e=>A.value.input=e),placeholder:G.value?"Marketplace source(owner/repo、URL 或本地路径)":"GitHub/GitLab 仓库地址,或本地路径",size:"small",class:"repo-input",onKeyup:h(se,["enter"])},null,8,["value","placeholder"]),G.value?t("",!0):(u(),r(g(Y),{key:0,value:A.value.branch,"onUpdate:value":c[1]||(c[1]=e=>A.value.branch=e),placeholder:"分支",size:"small",class:"branch-input"},null,8,["value"])),i(g(a),{type:"primary",size:"small",disabled:!K.value,loading:L.value,focusable:!1,onClick:se},{default:v(()=>[...c[7]||(c[7]=[s(" 添加 ",-1)])]),_:1},8,["disabled","loading"])]),P("div",Ae,p(G.value?"source 将原样传递给 omp plugin marketplace add":"支持 `owner/repo`、GitHub/GitLab URL 或 SSH、以及本地路径"),1)]),P("div",Ge,[i(g(le),{type:"info",bordered:!1,size:"small"},{default:v(()=>[s(p(G.value?"OMP Marketplace 由原生 CLI 管理;不支持单独启停、branch 或仓库 Token。":"支持 GitHub、GitLab 和本地仓库路径;远程仓库可按仓库单独配置 Token。"),1)]),_:1})]),N.value.length>0?(u(),w("div",Re,[c[9]||(c[9]=P("div",{class:"recommended-title"},"推荐仓库",-1)),P("div",Me,[(u(!0),w(m,null,n(N.value,a=>(u(),w("div",{key:a.url||`${a.owner}/${a.name}`,class:y(["recommended-item",{added:ye(a)}]),onClick:e=>!ye(a)&&async function(e){L.value=!0;try{const a=await ce({owner:e.owner,name:e.name,url:e.url,branch:e.branch,enabled:!0},k.platform);a.success&&(C.value=a.repos,Z.success("仓库添加成功"),j("updated"))}catch(a){Z.error("添加失败: "+a.message)}finally{L.value=!1}}(a)},[P("div",Ne,[P("span",Ke,p(a.owner)+"/"+p(a.name),1),P("span",Ee,p(a.description),1)]),ye(a)?(u(),r(g(ee),{key:0,size:"tiny",type:"success",bordered:!1},{default:v(()=>[...c[8]||(c[8]=[s(" 已添加 ",-1)])]),_:1})):(u(),r(g(e),{key:1,class:"add-icon"},{default:v(()=>[i(g(T))]),_:1}))],10,De))),128))])])):t("",!0)])]),_:1},8,["show","title"]),i(g(M),{show:z.value,"onUpdate:show":c[4]||(c[4]=e=>z.value=e),preset:"card",title:D.value,bordered:!1,style:{width:"460px","max-width":"92vw"},onClose:X},{default:v(()=>[x.value?(u(),w("div",qe,[i(g(le),{type:"info",bordered:!1,size:"small"},{default:v(()=>{return[s(p((e=x.value,"gitlab"===e?.provider?"私有 GitLab 仓库建议配置仓库级 Private Token;保存后会优先使用当前仓库 Token,再回退到全局环境变量、glab 和 git credential。":"GitHub 仓库可选配置 Personal Access Token;保存后会优先使用当前仓库 Token,再回退到全局环境变量、gh 和 git credential。")),1)];var e}),_:1}),P("div",Ve,[P("div",Fe,[c[10]||(c[10]=P("span",{class:"auth-label"},"仓库",-1)),P("span",Qe,p(q(x.value)),1)]),P("div",We,[c[11]||(c[11]=P("span",{class:"auth-label"},"来源",-1)),P("span",Ze,p("gitlab"===x.value.provider?"GitLab":"GitHub"),1)]),P("div",Je,[c[12]||(c[12]=P("span",{class:"auth-label"},"当前状态",-1)),P("span",Xe,p(x.value.hasToken?`已配置 ${x.value.tokenPreview||""}`:"未配置仓库 Token"),1)])]),i(g(Y),{value:B.value.token,"onUpdate:value":c[3]||(c[3]=e=>B.value.token=e),type:"password","show-password-on":"click",clearable:"",placeholder:"输入此仓库专属 Token",onKeyup:h(ve,["enter"])},null,8,["value"]),c[16]||(c[16]=P("div",{class:"auth-footnote"}," 仓库 Token 会优先于全局环境变量、CLI 登录和系统 Git 凭据。 ",-1)),P("div",Ye,[i(g(a),{focusable:!1,onClick:X},{default:v(()=>[...c[13]||(c[13]=[s(" 取消 ",-1)])]),_:1}),x.value.hasToken?(u(),r(g(a),{key:0,type:"warning",secondary:"",focusable:!1,loading:S.value,onClick:me},{default:v(()=>[...c[14]||(c[14]=[s(" 清除 Token ",-1)])]),_:1},8,["loading"])):t("",!0),i(g(a),{type:"primary",focusable:!1,disabled:!B.value.token.trim(),loading:O.value,onClick:ve},{default:v(()=>[...c[15]||(c[15]=[s(" 保存 Token ",-1)])]),_:1},8,["disabled","loading"])])])):t("",!0)]),_:1},8,["show","title"])],64))}},[["__scopeId","data-v-cf7e92d6"]]),aa={class:"asset-detail-drawer-header"},la={class:"asset-detail-identity"},ta={class:"asset-detail-heading"},sa={class:"asset-detail-name"},na={class:"asset-detail-meta"},ia={key:2,class:"asset-detail-subtle"},ra={class:"asset-detail-body"},oa={class:"asset-detail-container"},ua={class:"asset-detail-info-section"},ca={class:"asset-detail-description"},pa={key:0,class:"asset-detail-info-section"},da={class:"asset-detail-list"},va={class:"asset-detail-value mono"},ma={key:1,class:"asset-detail-info-section"},ya={class:"asset-detail-box"},fa=["href"],ga={key:1},ha={class:"asset-detail-container"},ka={key:0,class:"asset-detail-loading"},ba=["innerHTML"],wa={key:2,class:"asset-detail-empty"},Pa={__name:"PluginDetailDrawer",props:{visible:{type:Boolean,default:!1},plugin:{type:Object,default:null},platform:{type:String,default:"claude"}},emits:["update:visible"],setup(a,{emit:l}){ne.setOptions({breaks:!0,gfm:!0});const{drawerWidth:o}=V(600),y=a,f=l,h=d({get:()=>y.visible,set:e=>f("update:visible",e)}),k=b(""),j=b(!1),U=b(0),C=d(()=>/^(https?:)?\/\//.test(y.plugin?.repoUrl||y.plugin?.gitUrl||"")),L=d(()=>y.plugin?.installPath||y.plugin?.fullPath||y.plugin?.path||y.plugin?.directory||""),T=d(()=>Array.isArray(y.plugin?.skillPaths)?y.plugin.skillPaths:[]),I={height:"100%",minHeight:0,overflow:"hidden"};c(()=>[y.visible,y.plugin,y.platform],async([e,a,l])=>{const t=++U.value;if(!e||!a)return j.value=!1,void(k.value="");j.value=!0;try{const e={repoId:a.repoId,repoProvider:a.repoProvider,repoHost:a.repoHost,repoOwner:a.repoOwner,repoName:a.repoName,repoBranch:a.repoBranch,directory:a.directory,source:a.source,repoUrl:a.repoUrl,repoProjectPath:a.repoProjectPath,repoLocalPath:a.repoLocalPath,installPath:a.installPath},s=await function(e,a={},l="claude",t={}){const s=a.scope||t.scope||"",n=a.repoLocalPath||a.repoProjectPath||a.repoUrl||a.directory||e,i=X(`plugin-readme:${e}`,l,s,n),r=new URLSearchParams;return l&&r.append("platform",l),a.repoId&&r.append("repoId",a.repoId),a.repoProvider&&r.append("repoProvider",a.repoProvider),a.repoHost&&r.append("repoHost",a.repoHost),a.repoOwner&&r.append("repoOwner",a.repoOwner),a.repoName&&r.append("repoName",a.repoName),a.repoBranch&&r.append("repoBranch",a.repoBranch),a.directory&&r.append("directory",a.directory),a.source&&r.append("source",a.source),a.repoUrl&&r.append("repoUrl",a.repoUrl),a.repoProjectPath&&r.append("repoProjectPath",a.repoProjectPath),a.repoLocalPath&&r.append("repoLocalPath",a.repoLocalPath),a.installPath&&r.append("installPath",a.installPath),ae(i,a=>_.get(`/plugins/${encodeURIComponent(e)}/readme?${r.toString()}`,{signal:a}).then(e=>e.data),`plugin-readme:${e}`,`plugin-readme:${l}`)}(a.name,e,l);if(t!==U.value)return;k.value=s.readme||""}catch(s){if(t!==U.value)return;k.value=""}finally{t===U.value&&(j.value=!1)}});const x=d(()=>k.value?ne(k.value):"");return(l,c)=>(u(),r(g(q),{show:h.value,"onUpdate:show":c[0]||(c[0]=e=>h.value=e),width:g(o),placement:"right","show-mask":!0},{default:v(()=>[i(g(F),{closable:"","native-scrollbar":!1,"body-content-style":I},{header:v(()=>[P("div",aa,[P("div",la,[i(g(e),{size:20,class:"asset-detail-icon"},{default:v(()=>[i(g(O))]),_:1}),P("div",ta,[P("span",sa,p(a.plugin?.name||"插件详情"),1),P("div",na,[a.plugin?.version?(u(),r(g(ee),{key:0,size:"tiny",bordered:!1,type:"info"},{default:v(()=>[s(" v"+p(a.plugin.version),1)]),_:1})):t("",!0),"skill-bundle"===a.plugin?.pluginKind?(u(),r(g(ee),{key:1,size:"tiny",bordered:!1,type:"warning"},{default:v(()=>[...c[1]||(c[1]=[s(" 技能包插件 ",-1)])]),_:1})):t("",!0),a.plugin?.author?(u(),w("span",ia,[i(g(e),{size:12},{default:v(()=>[i(g($))]),_:1}),s(" "+p(a.plugin.author),1)])):t("",!0)])])])])]),default:v(()=>[P("div",ra,[i(g(K),{type:"line",animated:"",class:"asset-detail-tabs"},{default:v(()=>[i(g(D),{name:"overview",tab:"概览"},{default:v(()=>[P("div",oa,[P("div",ua,[c[2]||(c[2]=P("h3",{class:"asset-detail-section-title"},"描述",-1)),P("p",ca,p(a.plugin?.description||"暂无描述"),1)]),T.value.length>0?(u(),w("div",pa,[c[3]||(c[3]=P("h3",{class:"asset-detail-section-title"},"包含技能",-1)),P("div",da,[(u(!0),w(m,null,n(T.value,e=>(u(),w("div",{key:e,class:"asset-detail-row"},[P("span",va,p(e),1)]))),128))])])):t("",!0),a.plugin?.repoUrl||a.plugin?.gitUrl||a.plugin?.repoLocalPath?(u(),w("div",ma,[c[4]||(c[4]=P("h3",{class:"asset-detail-section-title"},"仓库地址",-1)),P("div",ya,[i(g(e),{size:16},{default:v(()=>[i(g(z))]),_:1}),C.value?(u(),w("a",{key:0,class:"asset-detail-link",href:a.plugin.repoUrl||a.plugin.gitUrl,target:"_blank",rel:"noopener noreferrer"},p(a.plugin.repoUrl||a.plugin.gitUrl),9,fa)):(u(),w("span",ga,p(a.plugin.repoLocalPath),1))])])):t("",!0),i(E,{path:L.value},null,8,["path"])])]),_:1}),i(g(D),{name:"readme",tab:"README"},{default:v(()=>[P("div",ha,[j.value?(u(),w("div",ka,[i(g(W),{size:"medium"}),c[5]||(c[5]=P("p",null,"加载 README 中...",-1))])):k.value?(u(),w("div",{key:1,class:"asset-detail-content",innerHTML:x.value},null,8,ba)):(u(),w("div",wa,[i(g(e),{size:44,class:"asset-detail-empty-icon"},{default:v(()=>[i(g(A))]),_:1}),c[6]||(c[6]=P("p",null,"暂无 README 文档",-1))]))])]),_:1})]),_:1})])]),_:1})]),_:1},8,["show","width"]))}},_a={key:0,class:"asset-panel-header"},ja={class:"asset-title-group"},Ua={class:"asset-heading"},Ca={class:"asset-title-row"},$a={class:"asset-platform-pill"},La={key:0,class:"asset-action-row"},Ta={key:1,class:"asset-drawer-toolbar"},Ia={key:0,class:"asset-action-row"},za={class:"asset-summary"},xa={class:"asset-summary-item"},Oa={class:"asset-summary-value"},Sa={class:"asset-summary-item"},Ba={class:"asset-summary-value"},Ha={class:"asset-summary-item"},Aa={class:"asset-summary-value"},Ga={class:"asset-filter-bar"},Ra={class:"asset-panel-content"},Ma={key:0,class:"asset-empty"},Da={key:1,class:"asset-list"},Na={key:2,class:"asset-footer"},Ka=l({__name:"PluginsPanel",props:{inDrawer:{type:Boolean,default:!1},hideBack:{type:Boolean,default:!1},drawerVisible:{type:Boolean,default:!1},platform:{type:String,default:""},projectPath:{type:String,default:""}},emits:["back","updated"],setup(l){const f=l,h=k(),$=C(),T=R(),z=b(!1),H=b([]),A=b(""),M=b("all"),D=b(!1),K=b(!1),E=b(null),q=b({}),V=b({}),F=b(!1),Q=b(0),Z=b({supportsPlugins:!0,repositories:!0,market:!0,install:!0,uninstall:!0,import:!0,syncRepos:!0}),{byCapability:ee}=J(),le=d(()=>ee("plugins").map(e=>e.key)),ne=d(()=>le.value.includes(ie.value));const ie=d(()=>String(f.platform||(Array.isArray(h.query.platform)?h.query.platform[0]:h.query.platform)||j(h)||"").trim().toLowerCase()),re=d(()=>{const e=$.get(ie.value)||U(ie.value);return e.label||e.title||"Claude Code"}),ce=[{label:"全部",value:"all"},{label:"已安装",value:"installed"},{label:"未安装",value:"uninstalled"}],pe=d(()=>H.value.filter(e=>e.installed).length);function ve(e=null){return{...f.projectPath?{cwd:f.projectPath}:{},...e?.scope?{scope:e.scope}:{scope:f.projectPath?"project":"user"}}}const me=d(()=>{let e=H.value;if("installed"===M.value?e=e.filter(e=>e.installed):"uninstalled"===M.value&&(e=e.filter(e=>!e.installed)),A.value.trim()){const a=A.value.toLowerCase();e=e.filter(e=>e.name?.toLowerCase().includes(a)||e.description?.toLowerCase().includes(a))}return[...e].sort((e,a)=>e.installed===a.installed?0:e.installed?-1:1)}),ye=d(()=>A.value?"没有匹配的插件":"installed"===M.value?"暂无已安装的插件":"uninstalled"===M.value?"所有插件都已安装":!1===Z.value.supportsPlugins?Z.value.disabledReason||`${re.value} 暂未提供插件管理能力`:"暂无可用插件,请配置仓库源");async function fe(e,a){try{const l=await async function(e="claude",a={}){const l=X("plugin-capabilities",e,a.scope||"",a.cwd||"");return ae(l,a=>_.get("/plugins/capabilities",{params:{platform:e},signal:a}).then(e=>e.data),"plugin-capabilities",`plugin-capabilities:${e}`)}(e);if(a!==Q.value||e!==ie.value)return!1;if(l.success&&l.capabilities)return Z.value={supportsPlugins:!0,repositories:!1,market:!1,install:!1,uninstall:!1,import:!1,syncRepos:!1,...l.capabilities},!0}catch{if(a!==Q.value||e!==ie.value)return!1}return a===Q.value&&e===ie.value&&(Z.value={supportsPlugins:le.value.includes(e),repositories:le.value.includes(e),market:le.value.includes(e),install:le.value.includes(e),uninstall:le.value.includes(e),import:"claude"===e,syncRepos:"claude"===e},!0)}async function ge(e=!1){const a=++Q.value,l=ie.value;if(!ne.value)return H.value=[],Z.value={supportsPlugins:!1,repositories:!1,market:!1,install:!1,uninstall:!1,import:!1,syncRepos:!1,disabledReason:`${re.value} 暂未提供插件管理能力`},void(z.value=!1);z.value=!0;try{if(!(await fe(l,a)))return;if(a!==Q.value||l!==ie.value)return;if(!1===Z.value.supportsPlugins)return void(H.value=[]);if(e&&Z.value.syncRepos&&(await de(l,ve()).catch(()=>{}),a!==Q.value||l!==ie.value))return;const t=await async function(e="claude",a={}){const l=X("plugins",e,a.scope||"",a.cwd||"");return ae(l,l=>_.get("/plugins",{params:oe({platform:e},a),signal:l}).then(e=>e.data),"plugins",`plugins:${e}`)}(l,{...f.projectPath?{cwd:f.projectPath}:{}});if(a!==Q.value||l!==ie.value)return;const s=t.success?t.plugins:[];let n=[];const i=(e,a)=>{const l={};for(const n of a)l[n.pluginId||n.id||n.name]=n;const t=e.map(e=>{const a=e.pluginId||e.id||e.name,t=l[a]||{};return{...t,...e,installed:!0,key:e.key||`installed-${a}-${e.scope||"user"}`,description:e.description||t.description||"",repoProvider:e.repoProvider||t.repoProvider||"",repoHost:e.repoHost||t.repoHost||"",repoOwner:e.repoOwner||t.repoOwner||"",repoName:e.repoName||t.repoName||"",repoBranch:e.repoBranch||t.repoBranch||"main",repoProjectPath:e.repoProjectPath||t.repoProjectPath||"",repoLocalPath:e.repoLocalPath||t.repoLocalPath||"",repoId:e.repoId||t.repoId||"",repoUrl:e.repoUrl||t.repoUrl||"",marketplace:e.marketplace||t.marketplace||"",installSource:e.installSource||t.installSource||"",readmeUrl:e.readmeUrl||t.readmeUrl||"",containsSkills:Boolean(e.containsSkills||t.containsSkills),skillPaths:Array.isArray(e.skillPaths)?e.skillPaths:Array.isArray(t.skillPaths)?t.skillPaths:[],pluginKind:e.pluginKind||t.pluginKind||(e.containsSkills||t.containsSkills?"skill-bundle":"plugin"),strict:Object.prototype.hasOwnProperty.call(e,"strict")?e.strict:t.strict,directory:e.directory||t.directory||e.installPath||""}}),s=new Set(e.map(e=>e.pluginId||e.id||e.name));return[...t,...a.filter(e=>!s.has(e.pluginId||e.id||e.name)).map(e=>({...e,installed:!1,key:e.key||`market-${e.pluginId||e.id||e.name}`}))]};H.value=i(s,n),Z.value.market&&async function(e="claude",a=!1,l={}){const t=X("plugins-market",e,l.scope||"",l.cwd||"");return ae(t,t=>_.get("/plugins/market",{params:oe({platform:e,refresh:a?"1":""},l),signal:t}).then(e=>e.data),"plugins-market",`plugins-market:${e}`)}(l,e,{...f.projectPath?{cwd:f.projectPath}:{}}).catch(()=>({success:!0,plugins:[]})).then(e=>{a===Q.value&&l===ie.value&&(n=e.success?e.plugins:[],H.value=i(s,n))})}catch(t){a===Q.value&&l===ie.value&&T.error("加载插件失败: "+t.message)}finally{a===Q.value&&(z.value=!1)}}async function he(){if(ne.value&&"claude"===ie.value){F.value=!0;try{const e=await N("plugins");e.success?(T.success(`成功导入 ${e.imported} 个插件`),await ge(!0)):T.error(e.message||"导入失败")}catch(e){T.error("导入失败: "+e.message)}finally{F.value=!1}}}async function ke(e){if(ne.value&&Z.value.install&&!e.readonly){if(!(e.installSource||e.repoOwner||e.repoProjectPath||e.repoLocalPath))return T.error("缺少可安装来源");q.value[e.key]=!0;try{const a=e.installSource?await ue("",null,ie.value,e.pluginId||e.installSource,ve(e),e):await ue(e.directory,{id:e.repoId,provider:e.repoProvider,host:e.repoHost,owner:e.repoOwner,name:e.repoName,branch:e.repoBranch||"main",projectPath:e.repoProjectPath,localPath:e.repoLocalPath,repoUrl:e.repoUrl,marketplace:e.marketplace},ie.value,"",ve(e),e);if(a.success){T.success(`插件 "${e.name}" 安装成功`);const a=H.value.findIndex(a=>a.key===e.key);-1!==a&&(H.value[a]={...H.value[a],installed:!0,key:`installed-${e.pluginId||e.id||e.name}-${e.scope||ve(e).scope}`})}else T.error(a.message||"安装失败")}catch(a){T.error("安装失败: "+a.message)}finally{delete q.value[e.key]}}}async function be(e){if(ne.value&&Z.value.uninstall&&!e.readonly){V.value[e.key]=!0;try{const a=await async function(e,a="claude",l={}){return(await _.delete(`/plugins/${encodeURIComponent(e)}`,{params:oe({platform:a,pluginId:e},l)})).data}(e.pluginId||e.id||e.name,ie.value,ve(e));if(a.success){T.success(`插件 "${e.name}" 已卸载`);const a=H.value.findIndex(a=>a.key===e.key);-1!==a&&(H.value[a]={...H.value[a],installed:!1,key:`market-${e.pluginId||e.id||e.name}`})}else T.error(a.message||a.error||"卸载失败")}catch(a){T.error("卸载失败: "+a.message)}finally{delete V.value[e.key]}}}function we(e){E.value=e,K.value=!0}return o(()=>{f.inDrawer&&!f.drawerVisible||ge()}),c(()=>f.drawerVisible,e=>{e&&ge()}),c(()=>ie.value,()=>{ge()}),(o,c)=>(u(),w("div",{class:y(["plugins-panel asset-panel",{"in-drawer":l.inDrawer}])},[l.inDrawer?t("",!0):(u(),w("div",_a,[P("div",ja,[l.hideBack?t("",!0):(u(),r(g(a),{key:0,text:"",onClick:c[0]||(c[0]=e=>o.$emit("back")),class:"back-btn"},{icon:v(()=>[i(g(e),null,{default:v(()=>[i(g(x))]),_:1})]),_:1})),P("div",Ua,[P("div",Ca,[c[10]||(c[10]=P("span",{class:"asset-title"},"插件管理",-1)),P("span",$a,p(re.value),1)]),c[11]||(c[11]=P("div",{class:"asset-subtitle"},"管理平台插件、仓库源和市场安装状态",-1))])]),le.value.includes(ie.value)?(u(),w("div",La,[Z.value.repositories?(u(),r(g(a),{key:0,text:"",focusable:!1,onClick:c[1]||(c[1]=e=>D.value=!0),class:"action-btn"},{icon:v(()=>[i(g(e),null,{default:v(()=>[i(g(I))]),_:1})]),default:v(()=>[c[12]||(c[12]=s(" 仓库 ",-1))]),_:1})):t("",!0),Z.value.import?(u(),r(g(a),{key:1,text:"",focusable:!1,onClick:he,loading:F.value,class:"action-btn"},{icon:v(()=>[i(g(e),null,{default:v(()=>[i(g(B))]),_:1})]),default:v(()=>[c[13]||(c[13]=s(" 导入 ",-1))]),_:1},8,["loading"])):t("",!0),i(g(a),{text:"",focusable:!1,onClick:c[2]||(c[2]=e=>ge(!0)),loading:z.value,class:"action-btn"},{icon:v(()=>[i(g(e),null,{default:v(()=>[i(g(G))]),_:1})]),default:v(()=>[c[14]||(c[14]=s(" 刷新 ",-1))]),_:1},8,["loading"])])):t("",!0)])),l.inDrawer?(u(),w("div",Ta,[le.value.includes(ie.value)?(u(),w("div",Ia,[Z.value.repositories?(u(),r(g(a),{key:0,text:"",focusable:!1,onClick:c[3]||(c[3]=e=>D.value=!0),class:"action-btn"},{icon:v(()=>[i(g(e),null,{default:v(()=>[i(g(I))]),_:1})]),default:v(()=>[c[15]||(c[15]=s(" 仓库 ",-1))]),_:1})):t("",!0),Z.value.import?(u(),r(g(a),{key:1,text:"",focusable:!1,onClick:he,loading:F.value,class:"action-btn"},{icon:v(()=>[i(g(e),null,{default:v(()=>[i(g(B))]),_:1})]),default:v(()=>[c[16]||(c[16]=s(" 导入 ",-1))]),_:1},8,["loading"])):t("",!0),i(g(a),{text:"",focusable:!1,onClick:c[4]||(c[4]=e=>ge(!0)),loading:z.value,class:"action-btn"},{icon:v(()=>[i(g(e),null,{default:v(()=>[i(g(G))]),_:1})]),default:v(()=>[c[17]||(c[17]=s(" 刷新 ",-1))]),_:1},8,["loading"])])):t("",!0)])):t("",!0),P("div",za,[P("span",xa,[c[18]||(c[18]=P("span",{class:"asset-summary-label"},"全部",-1)),P("span",Oa,p(H.value.length),1)]),P("span",Sa,[c[19]||(c[19]=P("span",{class:"asset-summary-label"},"已安装",-1)),P("span",Ba,p(pe.value),1)]),P("span",Ha,[c[20]||(c[20]=P("span",{class:"asset-summary-label"},"可安装",-1)),P("span",Aa,p(H.value.length-pe.value),1)])]),P("div",Ga,[i(g(Y),{value:A.value,"onUpdate:value":c[5]||(c[5]=e=>A.value=e),placeholder:"搜索插件名称或描述",clearable:"",size:"small",class:"asset-search"},{prefix:v(()=>[i(g(e),null,{default:v(()=>[i(g(S))]),_:1})]),_:1},8,["value"]),i(g(te),{value:M.value,"onUpdate:value":c[6]||(c[6]=e=>M.value=e),options:ce,size:"small",class:"asset-filter"},null,8,["value"])]),P("div",Ra,[i(g(W),{show:z.value},{default:v(()=>[0!==me.value.length||z.value?(u(),w("div",Da,[(u(!0),w(m,null,n(me.value,e=>(u(),r(_e,{key:e.key,plugin:e,readonly:e.readonly||!Z.value.install&&!Z.value.uninstall,"can-install":Z.value.install,"can-uninstall":Z.value.uninstall,installing:!!q.value[e.key],uninstalling:!!V.value[e.key],onInstall:ke,onUninstall:be,onClick:we},null,8,["plugin","readonly","can-install","can-uninstall","installing","uninstalling"]))),128))])):(u(),w("div",Ma,[i(g(se),{description:ye.value},{icon:v(()=>[i(g(e),{size:"48",color:"var(--text-quaternary)"},{default:v(()=>[i(g(O))]),_:1})]),extra:v(()=>[le.value.includes(ie.value)&&0===H.value.length&&Z.value.repositories?(u(),r(g(a),{key:0,size:"small",onClick:c[7]||(c[7]=e=>D.value=!0)},{default:v(()=>[...c[21]||(c[21]=[s("配置仓库源",-1)])]),_:1})):t("",!0)]),_:1},8,["description"])]))]),_:1},8,["show"])]),le.value.includes(ie.value)&&(Z.value.install||Z.value.uninstall)?(u(),w("div",Na,[i(g(e),{size:"14",class:"asset-info-icon"},{default:v(()=>[i(g(L))]),_:1}),P("span",null,"安装/卸载后需重启 "+p(re.value)+" 生效",1)])):t("",!0),Z.value.repositories?(u(),r(ea,{key:3,visible:D.value,"onUpdate:visible":c[8]||(c[8]=e=>D.value=e),platform:ie.value,"project-path":f.projectPath,capabilities:Z.value,onUpdated:ge},null,8,["visible","platform","project-path","capabilities"])):t("",!0),i(Pa,{visible:K.value,"onUpdate:visible":c[9]||(c[9]=e=>K.value=e),plugin:E.value,platform:ie.value,onUpdated:ge},null,8,["visible","plugin","platform"])],2))}},[["__scopeId","data-v-be781058"]]);export{Ka as t};
|
|
1
|
+
import{i as e,s as a,t as l}from"./_plugin-vue_export-helper-BeLZJZij.js";import{C as t,D as s,K as n,O as i,S as r,V as o,W as u,Z as c,_t as p,b as d,et as v,g as m,ht as y,m as f,mt as g,p as h,r as k,st as b,w,x as P}from"./vue-vendor-BqZbbXHA.js";import{n as _}from"./client-UDwXBP9i.js";import{r as j,s as U,t as C}from"./platforms-CBkB45JP.js";import{A as $,B as L,Ft as T,G as I,L as z,Mt as x,Z as O,_ as S,ft as B,o as H,tt as A,w as G}from"./icons-B2Vg-IOC.js";import{t as R}from"./use-message-DoLM8C1C.js";import{l as M}from"./light-Cp0t7v32.js";import{c as D,n as N,s as K,t as E}from"./AssetPathField-BZI9NvEr.js";import{n as q,t as V}from"./useResponsiveDrawer-D-DDpbnI.js";import{t as F}from"./DrawerContent-ChXgZ1Xm.js";import{F as Q,I as W,N as Z,Nt as J,O as X,ct as Y,dt as ee,k as ae,lt as le,nt as te,pt as se}from"./index-BFInlZGI.js";import{t as ne}from"./markdown-u082bbtj.js";import{n as ie,t as re}from"./skill-repo-input-B_fkGlUK.js";function oe(e={},a={}){return{...e,...a.cwd?{cwd:a.cwd}:{},...a.scope?{scope:a.scope}:{}}}async function ue(e,a,l="claude",t="",s={},n={}){const i=oe({platform:l},s);return t?(i.source=t,Object.assign(i,{pluginId:n.pluginId||t,name:n.name,pluginKind:n.pluginKind,marketplace:n.marketplace,installSource:n.installSource,version:n.version,description:n.description,resourceTypes:n.resourceTypes})):(i.directory=e,i.repo=a),(await _.post("/plugins/install",i)).data}async function ce(e,a="claude",l={}){return(await _.post("/plugins/repos",oe({...e,platform:a},l))).data}async function pe(e,a={},l="claude"){return(await _.put("/plugins/repos/auth",{id:e.id||"",owner:e.owner||"",name:e.name||"",token:a.token||"",clearToken:!!a.clearToken,platform:l})).data}async function de(e="claude",a={}){return(await _.post("/plugins/repos/sync",oe({platform:e},a))).data}var ve={class:"asset-card-main"},me={class:"asset-card-top"},ye={class:"asset-card-title-stack"},fe={class:"asset-card-title-row"},ge={class:"asset-name"},he={class:"asset-tags"},ke={key:0,class:"asset-description"},be={class:"asset-meta"},we={class:"asset-meta-item mono"},Pe=["href"],_e={__name:"PluginCard",props:{plugin:{type:Object,required:!0},readonly:{type:Boolean,default:!1},canInstall:{type:Boolean,default:!0},canUninstall:{type:Boolean,default:!0},installing:{type:Boolean,default:!1},uninstalling:{type:Boolean,default:!1}},emits:["click","install","uninstall"],setup(e){function l(e){return!!(e?.installSource||e?.repoOwner||e?.repoProjectPath||e?.repoLocalPath)}return(n,i)=>{return u(),w("div",{class:y(["plugin-card asset-card",{"is-installed":e.plugin.installed,"is-disabled":e.readonly}]),onClick:i[4]||(i[4]=a=>n.$emit("click",e.plugin))},[P("div",ve,[P("div",me,[P("div",ye,[P("div",fe,[P("span",{class:y(["asset-status-dot",{active:e.plugin.installed}])},null,2),P("span",ge,p(e.plugin.name),1)]),P("div",he,[e.plugin.installed?(u(),r(g(ee),{key:0,type:"success",size:"tiny",bordered:!1},{default:v(()=>[...i[5]||(i[5]=[s("已安装",-1)])]),_:1})):t("",!0),e.readonly?(u(),r(g(ee),{key:1,type:"default",size:"tiny",bordered:!1},{default:v(()=>[...i[6]||(i[6]=[s("只读",-1)])]),_:1})):t("",!0),e.plugin.scope?(u(),r(g(ee),{key:2,type:"info",size:"tiny",bordered:!1},{default:v(()=>[s(p("project"===e.plugin.scope?"项目":"全局"),1)]),_:1})):t("",!0),"extension"===e.plugin.pluginKind?(u(),r(g(ee),{key:3,type:"default",size:"tiny",bordered:!1},{default:v(()=>[...i[7]||(i[7]=[s("扩展",-1)])]),_:1})):t("",!0),"skill-bundle"===e.plugin.pluginKind?(u(),r(g(ee),{key:4,type:"warning",size:"tiny",bordered:!1},{default:v(()=>[...i[8]||(i[8]=[s("技能包插件",-1)])]),_:1})):t("",!0),"gitlab"===e.plugin.repoProvider?(u(),r(g(ee),{key:5,type:"info",size:"tiny",bordered:!1},{default:v(()=>[...i[9]||(i[9]=[s("GitLab",-1)])]),_:1})):"local"===e.plugin.repoProvider?(u(),r(g(ee),{key:6,type:"info",size:"tiny",bordered:!1},{default:v(()=>[...i[10]||(i[10]=[s("本地",-1)])]),_:1})):e.plugin.repoOwner?(u(),r(g(ee),{key:7,type:"info",size:"tiny",bordered:!1},{default:v(()=>[s(p(e.plugin.repoOwner),1)]),_:1})):t("",!0)])])]),e.plugin.description?(u(),w("div",ke,p((c=e.plugin.description,d=120,c?.length>d?c.slice(0,d)+"...":c)),1)):t("",!0),P("div",be,[P("span",we,p(e.plugin.directory),1),e.plugin.readmeUrl?(u(),w("a",{key:0,class:"asset-link",href:e.plugin.readmeUrl,target:"_blank",onClick:i[0]||(i[0]=f(()=>{},["stop"]))},p((o=e.plugin,"gitlab"===o?.repoProvider?"GitLab":"local"===o?.repoProvider?"本地":"GitHub")),9,Pe)):t("",!0)])]),e.readonly?t("",!0):(u(),w("div",{key:0,class:"asset-card-actions",onClick:i[3]||(i[3]=f(()=>{},["stop"]))},[e.plugin.installed&&e.canUninstall?(u(),r(g(a),{key:0,size:"small",tertiary:"",type:"error",loading:e.uninstalling,focusable:!1,onClick:i[1]||(i[1]=a=>n.$emit("uninstall",e.plugin))},{default:v(()=>[...i[11]||(i[11]=[s("卸载",-1)])]),_:1},8,["loading"])):e.canInstall?(u(),r(g(a),{key:1,size:"small",type:"primary",loading:e.installing,disabled:!l(e.plugin),focusable:!1,onClick:i[2]||(i[2]=a=>n.$emit("install",e.plugin))},{default:v(()=>[...i[12]||(i[12]=[s("安装",-1)])]),_:1},8,["loading","disabled"])):t("",!0)]))],2);var o,c,d}}},je={class:"repo-manager"},Ue={class:"repo-list"},Ce={class:"repo-main"},$e={class:"repo-info"},Le={class:"repo-name-row"},Te={class:"repo-name"},Ie={class:"repo-branch"},ze={key:0,class:"repo-auth-hint"},xe={class:"repo-actions"},Oe={key:0,class:"empty-hint"},Se={class:"add-repo"},Be={class:"add-title"},He={class:"add-form"},Ae={class:"add-hint"},Ge={class:"tips"},Re={key:0,class:"recommended"},Me={class:"recommended-list"},De=["onClick"],Ne={class:"rec-info"},Ke={class:"rec-name"},Ee={class:"rec-desc"},qe={key:0,class:"auth-manager"},Ve={class:"auth-meta"},Fe={class:"auth-meta-row"},Qe={class:"auth-value"},We={class:"auth-meta-row"},Ze={class:"auth-value"},Je={class:"auth-meta-row"},Xe={class:"auth-value"},Ye={class:"auth-actions"},ea=l({__name:"PluginRepoManager",props:{visible:Boolean,platform:{type:String,default:"claude"},projectPath:{type:String,default:""},capabilities:{type:Object,default:()=>({})}},emits:["update:visible","updated"],setup(l,{emit:f}){const k=l,j=f,U=d({get:()=>k.visible,set:e=>j("update:visible",e)}),C=b([]),$=b(!1),L=b(!1),I=b(!1),z=b(!1),x=b(null),O=b(!1),S=b(!1),B=b({token:""}),A=b({input:"",branch:"main"}),G=d(()=>"native-marketplace"===k.capabilities.repositoryMode),R=d(()=>({...k.projectPath?{cwd:k.projectPath}:{}})),D=d(()=>x.value?("gitlab"===x.value.provider?"GitLab":"GitHub")+" 仓库认证":"仓库认证"),N=d(()=>"opencode"===k.platform?[{owner:"Tommertom",name:"opencode-plugin-marketplace",url:"https://github.com/Tommertom/opencode-plugin-marketplace",description:"OpenCode 插件市场",branch:"main"},{owner:"avifenesh",name:"awesome-slash",url:"https://github.com/avifenesh/awesome-slash",description:"Awesome Slash 命令集",branch:"main"},{owner:"NeoLabHQ",name:"context-engineering-kit",url:"https://github.com/NeoLabHQ/context-engineering-kit",description:"上下文工程工具包",branch:"master"},{owner:"awesome-opencode",name:"awesome-opencode",url:"https://github.com/awesome-opencode/awesome-opencode",description:"OpenCode 生态聚合",branch:"main"},{owner:"sst",name:"opencode",url:"https://github.com/sst/opencode",description:"OpenCode 官方仓库",branch:"dev"}]:"codex"===k.platform||"omp"===k.platform?[]:[{owner:"anthropics",name:"claude-plugins-official",url:"https://github.com/anthropics/claude-plugins-official",description:"官方插件库",branch:"main"}]),K=d(()=>G.value?Boolean(A.value.input.trim()):!!ie(A.value.input.trim()));function E(e){const a=e.provider||(e.localPath?"local":e.projectPath?"gitlab":"github"),l=e.branch||"main",t=re(e.directory);return"local"===a?`local:${e.localPath||""}::${t}`:"gitlab"===a?`gitlab:${e.host||"https://gitlab.com"}::${e.projectPath||""}::${l}::${t}`:`github:${e.host||"https://github.com"}::${e.owner||""}/${e.name||""}::${l}::${t}`}function q(e){return"omp-marketplace"===e.provider?e.label||e.name||e.id:"local"===e.provider?e.localPath||e.name||"本地仓库":"gitlab"===e.provider&&e.projectPath||[e.owner,e.name].filter(Boolean).join("/")}function V(e){if("omp-marketplace"===e.provider)return e.sourceUri||e.source||"";const a=[];return"local"===e.provider?a.push("本地仓库"):"gitlab"===e.provider?(a.push("GitLab"),e.host&&a.push(e.host.replace(/^https?:\/\//,""))):a.push("GitHub"),e.branch&&a.push(e.branch),e.directory&&a.push(`目录: ${e.directory}`),a.join(" · ")}function F(e){return"github"===e?.provider||"gitlab"===e?.provider}function J(e){return F(e)?e.hasToken?`仓库 Token: ${e.tokenPreview||"已配置"}`:"gitlab"===e.provider?"未配置仓库 Token,将回退到全局 Token、glab 或 git credential":"未配置仓库 Token,可选配置后优先用于 GitHub API 访问":""}function X(){z.value=!1,x.value=null,B.value.token="",O.value=!1,S.value=!1}async function ae(){$.value=!0;try{const e=await async function(e="claude",a={}){return(await _.get("/plugins/repos",{params:oe({platform:e},a)})).data}(k.platform,R.value);e.success&&(C.value=e.repos||[])}catch(e){Z.error("加载仓库失败: "+e.message)}finally{$.value=!1}}async function te(){I.value=!0;try{const e=await de(k.platform,R.value);e.success&&(Array.isArray(e.repos)&&(C.value=e.repos),Z.success("仓库同步成功"),j("updated"))}catch(e){Z.error("同步失败: "+e.message)}finally{I.value=!1}}async function se(){if(!K.value)return;const e=G.value?{source:A.value.input.trim()}:ie(A.value.input.trim());L.value=!0;try{const a=await ce({...e,branch:A.value.branch||"main",enabled:!0},k.platform,R.value);a.success&&(C.value=a.repos,A.value.input="",A.value.branch="main",Z.success("仓库添加成功"),j("updated"))}catch(a){Z.error("添加失败: "+a.message)}finally{L.value=!1}}async function ne(e){try{const a=await async function(e,a="claude",l={}){return(await _.delete("/plugins/repos",{params:oe({platform:a,id:e.id||"",owner:e.owner||"",name:e.name||""},l)})).data}(e,k.platform,R.value);a.success&&(C.value=a.repos,Z.success("仓库已删除"),j("updated"))}catch(a){Z.error("删除失败: "+a.message)}}async function ue(e,a){try{const l=await async function(e,a,l="claude"){return(await _.put("/plugins/repos/toggle",{id:e.id||"",owner:e.owner||"",name:e.name||"",enabled:a,platform:l})).data}(e,a,k.platform);l.success&&(C.value=l.repos,j("updated"))}catch(l){Z.error("操作失败: "+l.message)}}async function ve(){const e=x.value,a=B.value.token.trim();if(e&&a){O.value=!0;try{const l=await pe(e,{token:a},k.platform);l.success&&(C.value=l.repos||[],Z.success("仓库 Token 已保存"),j("updated"),X())}catch(l){Z.error("保存 Token 失败: "+l.message)}finally{O.value=!1}}}async function me(){const e=x.value;if(e){S.value=!0;try{const a=await pe(e,{clearToken:!0},k.platform);a.success&&(C.value=a.repos||[],Z.success("仓库 Token 已清除"),j("updated"),X())}catch(a){Z.error("清除 Token 失败: "+a.message)}finally{S.value=!1}}}function ye(e){const a=E(e);return C.value.some(e=>E(e)===a)}function fe(){X(),j("update:visible",!1)}return c(()=>k.visible,e=>{e&&ae()}),c(()=>k.platform,()=>{k.visible&&ae()}),o(()=>{k.visible&&ae()}),(o,c)=>(u(),w(m,null,[i(g(M),{show:U.value,"onUpdate:show":c[2]||(c[2]=e=>U.value=e),preset:"card",title:G.value?"OMP Marketplace 管理":"插件仓库管理",bordered:!1,closable:!0,style:{width:"480px","max-width":"90vw"},onClose:fe},{"header-extra":v(()=>[i(g(a),{type:"primary",size:"small",loading:I.value,focusable:!1,onClick:te},{icon:v(()=>[i(g(e),null,{default:v(()=>[i(g(H))]),_:1})]),default:v(()=>[s(" "+p(G.value?"刷新":"同步"),1)]),_:1},8,["loading"])]),default:v(()=>[P("div",je,[P("div",Ue,[i(g(W),{show:$.value},{default:v(()=>[(u(!0),w(m,null,n(C.value,e=>(u(),w("div",{key:e.id||`${e.owner}/${e.name}/${e.localPath||""}`,class:"repo-item"},[P("div",Ce,[!1!==l.capabilities.repositoryToggle?(u(),r(g(Q),{key:0,value:e.enabled,size:"small","onUpdate:value":a=>ue(e,a)},null,8,["value","onUpdate:value"])):t("",!0),P("div",$e,[P("div",Le,[P("div",Te,p(q(e)),1),!1!==l.capabilities.repositoryAuth&&F(e)?(u(),r(g(ee),{key:0,size:"tiny",type:e.hasToken?"success":"default",bordered:!1},{default:v(()=>[s(p(e.hasToken?"已配 Token":"未配 Token"),1)]),_:2},1032,["type"])):t("",!0)]),P("div",Ie,p(V(e)),1),!1!==l.capabilities.repositoryAuth&&F(e)?(u(),w("div",ze,p(J(e)),1)):t("",!0)])]),P("div",xe,[!1!==l.capabilities.repositoryAuth&&F(e)?(u(),r(g(a),{key:0,text:"",type:"primary",size:"tiny",focusable:!1,onClick:a=>function(e){F(e)&&(x.value=e,B.value.token="",z.value=!0)}(e)},{default:v(()=>[...c[5]||(c[5]=[s(" 认证 ",-1)])]),_:1},8,["onClick"])):t("",!0),i(g(a),{text:"",type:"error",size:"tiny",focusable:!1,onClick:a=>ne(e)},{default:v(()=>[...c[6]||(c[6]=[s(" 删除 ",-1)])]),_:1},8,["onClick"])])]))),128)),0===C.value.length?(u(),w("div",Oe," 暂无仓库,请添加 ")):t("",!0)]),_:1},8,["show"])]),P("div",Se,[P("div",Be,p(G.value?"添加 Marketplace source":"添加仓库"),1),P("div",He,[i(g(Y),{value:A.value.input,"onUpdate:value":c[0]||(c[0]=e=>A.value.input=e),placeholder:G.value?"Marketplace source(owner/repo、URL 或本地路径)":"GitHub/GitLab 仓库地址,或本地路径",size:"small",class:"repo-input",onKeyup:h(se,["enter"])},null,8,["value","placeholder"]),G.value?t("",!0):(u(),r(g(Y),{key:0,value:A.value.branch,"onUpdate:value":c[1]||(c[1]=e=>A.value.branch=e),placeholder:"分支",size:"small",class:"branch-input"},null,8,["value"])),i(g(a),{type:"primary",size:"small",disabled:!K.value,loading:L.value,focusable:!1,onClick:se},{default:v(()=>[...c[7]||(c[7]=[s(" 添加 ",-1)])]),_:1},8,["disabled","loading"])]),P("div",Ae,p(G.value?"source 将原样传递给 omp plugin marketplace add":"支持 `owner/repo`、GitHub/GitLab URL 或 SSH、以及本地路径"),1)]),P("div",Ge,[i(g(le),{type:"info",bordered:!1,size:"small"},{default:v(()=>[s(p(G.value?"OMP Marketplace 由原生 CLI 管理;不支持单独启停、branch 或仓库 Token。":"支持 GitHub、GitLab 和本地仓库路径;远程仓库可按仓库单独配置 Token。"),1)]),_:1})]),N.value.length>0?(u(),w("div",Re,[c[9]||(c[9]=P("div",{class:"recommended-title"},"推荐仓库",-1)),P("div",Me,[(u(!0),w(m,null,n(N.value,a=>(u(),w("div",{key:a.url||`${a.owner}/${a.name}`,class:y(["recommended-item",{added:ye(a)}]),onClick:e=>!ye(a)&&async function(e){L.value=!0;try{const a=await ce({owner:e.owner,name:e.name,url:e.url,branch:e.branch,enabled:!0},k.platform);a.success&&(C.value=a.repos,Z.success("仓库添加成功"),j("updated"))}catch(a){Z.error("添加失败: "+a.message)}finally{L.value=!1}}(a)},[P("div",Ne,[P("span",Ke,p(a.owner)+"/"+p(a.name),1),P("span",Ee,p(a.description),1)]),ye(a)?(u(),r(g(ee),{key:0,size:"tiny",type:"success",bordered:!1},{default:v(()=>[...c[8]||(c[8]=[s(" 已添加 ",-1)])]),_:1})):(u(),r(g(e),{key:1,class:"add-icon"},{default:v(()=>[i(g(T))]),_:1}))],10,De))),128))])])):t("",!0)])]),_:1},8,["show","title"]),i(g(M),{show:z.value,"onUpdate:show":c[4]||(c[4]=e=>z.value=e),preset:"card",title:D.value,bordered:!1,style:{width:"460px","max-width":"92vw"},onClose:X},{default:v(()=>[x.value?(u(),w("div",qe,[i(g(le),{type:"info",bordered:!1,size:"small"},{default:v(()=>{return[s(p((e=x.value,"gitlab"===e?.provider?"私有 GitLab 仓库建议配置仓库级 Private Token;保存后会优先使用当前仓库 Token,再回退到全局环境变量、glab 和 git credential。":"GitHub 仓库可选配置 Personal Access Token;保存后会优先使用当前仓库 Token,再回退到全局环境变量、gh 和 git credential。")),1)];var e}),_:1}),P("div",Ve,[P("div",Fe,[c[10]||(c[10]=P("span",{class:"auth-label"},"仓库",-1)),P("span",Qe,p(q(x.value)),1)]),P("div",We,[c[11]||(c[11]=P("span",{class:"auth-label"},"来源",-1)),P("span",Ze,p("gitlab"===x.value.provider?"GitLab":"GitHub"),1)]),P("div",Je,[c[12]||(c[12]=P("span",{class:"auth-label"},"当前状态",-1)),P("span",Xe,p(x.value.hasToken?`已配置 ${x.value.tokenPreview||""}`:"未配置仓库 Token"),1)])]),i(g(Y),{value:B.value.token,"onUpdate:value":c[3]||(c[3]=e=>B.value.token=e),type:"password","show-password-on":"click",clearable:"",placeholder:"输入此仓库专属 Token",onKeyup:h(ve,["enter"])},null,8,["value"]),c[16]||(c[16]=P("div",{class:"auth-footnote"}," 仓库 Token 会优先于全局环境变量、CLI 登录和系统 Git 凭据。 ",-1)),P("div",Ye,[i(g(a),{focusable:!1,onClick:X},{default:v(()=>[...c[13]||(c[13]=[s(" 取消 ",-1)])]),_:1}),x.value.hasToken?(u(),r(g(a),{key:0,type:"warning",secondary:"",focusable:!1,loading:S.value,onClick:me},{default:v(()=>[...c[14]||(c[14]=[s(" 清除 Token ",-1)])]),_:1},8,["loading"])):t("",!0),i(g(a),{type:"primary",focusable:!1,disabled:!B.value.token.trim(),loading:O.value,onClick:ve},{default:v(()=>[...c[15]||(c[15]=[s(" 保存 Token ",-1)])]),_:1},8,["disabled","loading"])])])):t("",!0)]),_:1},8,["show","title"])],64))}},[["__scopeId","data-v-cf7e92d6"]]),aa={class:"asset-detail-drawer-header"},la={class:"asset-detail-identity"},ta={class:"asset-detail-heading"},sa={class:"asset-detail-name"},na={class:"asset-detail-meta"},ia={key:2,class:"asset-detail-subtle"},ra={class:"asset-detail-body"},oa={class:"asset-detail-container"},ua={class:"asset-detail-info-section"},ca={class:"asset-detail-description"},pa={key:0,class:"asset-detail-info-section"},da={class:"asset-detail-list"},va={class:"asset-detail-value mono"},ma={key:1,class:"asset-detail-info-section"},ya={class:"asset-detail-box"},fa=["href"],ga={key:1},ha={class:"asset-detail-container"},ka={key:0,class:"asset-detail-loading"},ba=["innerHTML"],wa={key:2,class:"asset-detail-empty"},Pa={__name:"PluginDetailDrawer",props:{visible:{type:Boolean,default:!1},plugin:{type:Object,default:null},platform:{type:String,default:"claude"}},emits:["update:visible"],setup(a,{emit:l}){ne.setOptions({breaks:!0,gfm:!0});const{drawerWidth:o}=V(600),y=a,f=l,h=d({get:()=>y.visible,set:e=>f("update:visible",e)}),k=b(""),j=b(!1),U=b(0),C=d(()=>/^(https?:)?\/\//.test(y.plugin?.repoUrl||y.plugin?.gitUrl||"")),L=d(()=>y.plugin?.installPath||y.plugin?.fullPath||y.plugin?.path||y.plugin?.directory||""),T=d(()=>Array.isArray(y.plugin?.skillPaths)?y.plugin.skillPaths:[]),I={height:"100%",minHeight:0,overflow:"hidden"};c(()=>[y.visible,y.plugin,y.platform],async([e,a,l])=>{const t=++U.value;if(!e||!a)return j.value=!1,void(k.value="");j.value=!0;try{const e={repoId:a.repoId,repoProvider:a.repoProvider,repoHost:a.repoHost,repoOwner:a.repoOwner,repoName:a.repoName,repoBranch:a.repoBranch,directory:a.directory,source:a.source,repoUrl:a.repoUrl,repoProjectPath:a.repoProjectPath,repoLocalPath:a.repoLocalPath,installPath:a.installPath},s=await function(e,a={},l="claude",t={}){const s=a.scope||t.scope||"",n=a.repoLocalPath||a.repoProjectPath||a.repoUrl||a.directory||e,i=X(`plugin-readme:${e}`,l,s,n),r=new URLSearchParams;return l&&r.append("platform",l),a.repoId&&r.append("repoId",a.repoId),a.repoProvider&&r.append("repoProvider",a.repoProvider),a.repoHost&&r.append("repoHost",a.repoHost),a.repoOwner&&r.append("repoOwner",a.repoOwner),a.repoName&&r.append("repoName",a.repoName),a.repoBranch&&r.append("repoBranch",a.repoBranch),a.directory&&r.append("directory",a.directory),a.source&&r.append("source",a.source),a.repoUrl&&r.append("repoUrl",a.repoUrl),a.repoProjectPath&&r.append("repoProjectPath",a.repoProjectPath),a.repoLocalPath&&r.append("repoLocalPath",a.repoLocalPath),a.installPath&&r.append("installPath",a.installPath),ae(i,a=>_.get(`/plugins/${encodeURIComponent(e)}/readme?${r.toString()}`,{signal:a}).then(e=>e.data),`plugin-readme:${e}`,`plugin-readme:${l}`)}(a.name,e,l);if(t!==U.value)return;k.value=s.readme||""}catch(s){if(t!==U.value)return;k.value=""}finally{t===U.value&&(j.value=!1)}});const x=d(()=>k.value?ne(k.value):"");return(l,c)=>(u(),r(g(q),{show:h.value,"onUpdate:show":c[0]||(c[0]=e=>h.value=e),width:g(o),placement:"right","show-mask":!0},{default:v(()=>[i(g(F),{closable:"","native-scrollbar":!1,"body-content-style":I},{header:v(()=>[P("div",aa,[P("div",la,[i(g(e),{size:20,class:"asset-detail-icon"},{default:v(()=>[i(g(O))]),_:1}),P("div",ta,[P("span",sa,p(a.plugin?.name||"插件详情"),1),P("div",na,[a.plugin?.version?(u(),r(g(ee),{key:0,size:"tiny",bordered:!1,type:"info"},{default:v(()=>[s(" v"+p(a.plugin.version),1)]),_:1})):t("",!0),"skill-bundle"===a.plugin?.pluginKind?(u(),r(g(ee),{key:1,size:"tiny",bordered:!1,type:"warning"},{default:v(()=>[...c[1]||(c[1]=[s(" 技能包插件 ",-1)])]),_:1})):t("",!0),a.plugin?.author?(u(),w("span",ia,[i(g(e),{size:12},{default:v(()=>[i(g($))]),_:1}),s(" "+p(a.plugin.author),1)])):t("",!0)])])])])]),default:v(()=>[P("div",ra,[i(g(K),{type:"line",animated:"",class:"asset-detail-tabs"},{default:v(()=>[i(g(D),{name:"overview",tab:"概览"},{default:v(()=>[P("div",oa,[P("div",ua,[c[2]||(c[2]=P("h3",{class:"asset-detail-section-title"},"描述",-1)),P("p",ca,p(a.plugin?.description||"暂无描述"),1)]),T.value.length>0?(u(),w("div",pa,[c[3]||(c[3]=P("h3",{class:"asset-detail-section-title"},"包含技能",-1)),P("div",da,[(u(!0),w(m,null,n(T.value,e=>(u(),w("div",{key:e,class:"asset-detail-row"},[P("span",va,p(e),1)]))),128))])])):t("",!0),a.plugin?.repoUrl||a.plugin?.gitUrl||a.plugin?.repoLocalPath?(u(),w("div",ma,[c[4]||(c[4]=P("h3",{class:"asset-detail-section-title"},"仓库地址",-1)),P("div",ya,[i(g(e),{size:16},{default:v(()=>[i(g(z))]),_:1}),C.value?(u(),w("a",{key:0,class:"asset-detail-link",href:a.plugin.repoUrl||a.plugin.gitUrl,target:"_blank",rel:"noopener noreferrer"},p(a.plugin.repoUrl||a.plugin.gitUrl),9,fa)):(u(),w("span",ga,p(a.plugin.repoLocalPath),1))])])):t("",!0),i(E,{path:L.value},null,8,["path"])])]),_:1}),i(g(D),{name:"readme",tab:"README"},{default:v(()=>[P("div",ha,[j.value?(u(),w("div",ka,[i(g(W),{size:"medium"}),c[5]||(c[5]=P("p",null,"加载 README 中...",-1))])):k.value?(u(),w("div",{key:1,class:"asset-detail-content",innerHTML:x.value},null,8,ba)):(u(),w("div",wa,[i(g(e),{size:44,class:"asset-detail-empty-icon"},{default:v(()=>[i(g(A))]),_:1}),c[6]||(c[6]=P("p",null,"暂无 README 文档",-1))]))])]),_:1})]),_:1})])]),_:1})]),_:1},8,["show","width"]))}},_a={key:0,class:"asset-panel-header"},ja={class:"asset-title-group"},Ua={class:"asset-heading"},Ca={class:"asset-title-row"},$a={class:"asset-platform-pill"},La={key:0,class:"asset-action-row"},Ta={key:1,class:"asset-drawer-toolbar"},Ia={key:0,class:"asset-action-row"},za={class:"asset-summary"},xa={class:"asset-summary-item"},Oa={class:"asset-summary-value"},Sa={class:"asset-summary-item"},Ba={class:"asset-summary-value"},Ha={class:"asset-summary-item"},Aa={class:"asset-summary-value"},Ga={class:"asset-filter-bar"},Ra={class:"asset-panel-content"},Ma={key:0,class:"asset-empty"},Da={key:1,class:"asset-list"},Na={key:2,class:"asset-footer"},Ka=l({__name:"PluginsPanel",props:{inDrawer:{type:Boolean,default:!1},hideBack:{type:Boolean,default:!1},drawerVisible:{type:Boolean,default:!1},platform:{type:String,default:""},projectPath:{type:String,default:""}},emits:["back","updated"],setup(l){const f=l,h=k(),$=C(),T=R(),z=b(!1),H=b([]),A=b(""),M=b("all"),D=b(!1),K=b(!1),E=b(null),q=b({}),V=b({}),F=b(!1),Q=b(0),Z=b({supportsPlugins:!0,repositories:!0,market:!0,install:!0,uninstall:!0,import:!0,syncRepos:!0}),{byCapability:ee}=J(),le=d(()=>ee("plugins").map(e=>e.key)),ne=d(()=>le.value.includes(ie.value));const ie=d(()=>String(f.platform||(Array.isArray(h.query.platform)?h.query.platform[0]:h.query.platform)||j(h)||"").trim().toLowerCase()),re=d(()=>{const e=$.get(ie.value)||U(ie.value);return e.label||e.title||"Claude Code"}),ce=[{label:"全部",value:"all"},{label:"已安装",value:"installed"},{label:"未安装",value:"uninstalled"}],pe=d(()=>H.value.filter(e=>e.installed).length);function ve(e=null){return{...f.projectPath?{cwd:f.projectPath}:{},...e?.scope?{scope:e.scope}:{scope:f.projectPath?"project":"user"}}}const me=d(()=>{let e=H.value;if("installed"===M.value?e=e.filter(e=>e.installed):"uninstalled"===M.value&&(e=e.filter(e=>!e.installed)),A.value.trim()){const a=A.value.toLowerCase();e=e.filter(e=>e.name?.toLowerCase().includes(a)||e.description?.toLowerCase().includes(a))}return[...e].sort((e,a)=>e.installed===a.installed?0:e.installed?-1:1)}),ye=d(()=>A.value?"没有匹配的插件":"installed"===M.value?"暂无已安装的插件":"uninstalled"===M.value?"所有插件都已安装":!1===Z.value.supportsPlugins?Z.value.disabledReason||`${re.value} 暂未提供插件管理能力`:"暂无可用插件,请配置仓库源");async function fe(e,a){try{const l=await async function(e="claude",a={}){const l=X("plugin-capabilities",e,a.scope||"",a.cwd||"");return ae(l,a=>_.get("/plugins/capabilities",{params:{platform:e},signal:a}).then(e=>e.data),"plugin-capabilities",`plugin-capabilities:${e}`)}(e);if(a!==Q.value||e!==ie.value)return!1;if(l.success&&l.capabilities)return Z.value={supportsPlugins:!0,repositories:!1,market:!1,install:!1,uninstall:!1,import:!1,syncRepos:!1,...l.capabilities},!0}catch{if(a!==Q.value||e!==ie.value)return!1}return a===Q.value&&e===ie.value&&(Z.value={supportsPlugins:le.value.includes(e),repositories:le.value.includes(e),market:le.value.includes(e),install:le.value.includes(e),uninstall:le.value.includes(e),import:"claude"===e,syncRepos:"claude"===e},!0)}async function ge(e=!1){const a=++Q.value,l=ie.value;if(!ne.value)return H.value=[],Z.value={supportsPlugins:!1,repositories:!1,market:!1,install:!1,uninstall:!1,import:!1,syncRepos:!1,disabledReason:`${re.value} 暂未提供插件管理能力`},void(z.value=!1);z.value=!0;try{if(!(await fe(l,a)))return;if(a!==Q.value||l!==ie.value)return;if(!1===Z.value.supportsPlugins)return void(H.value=[]);if(e&&Z.value.syncRepos&&(await de(l,ve()).catch(()=>{}),a!==Q.value||l!==ie.value))return;const t=await async function(e="claude",a={}){const l=X("plugins",e,a.scope||"",a.cwd||"");return ae(l,l=>_.get("/plugins",{params:oe({platform:e},a),signal:l}).then(e=>e.data),"plugins",`plugins:${e}`)}(l,{...f.projectPath?{cwd:f.projectPath}:{}});if(a!==Q.value||l!==ie.value)return;const s=t.success?t.plugins:[];let n=[];const i=(e,a)=>{const l={};for(const n of a)l[n.pluginId||n.id||n.name]=n;const t=e.map(e=>{const a=e.pluginId||e.id||e.name,t=l[a]||{};return{...t,...e,installed:!0,key:e.key||`installed-${a}-${e.scope||"user"}`,description:e.description||t.description||"",repoProvider:e.repoProvider||t.repoProvider||"",repoHost:e.repoHost||t.repoHost||"",repoOwner:e.repoOwner||t.repoOwner||"",repoName:e.repoName||t.repoName||"",repoBranch:e.repoBranch||t.repoBranch||"main",repoProjectPath:e.repoProjectPath||t.repoProjectPath||"",repoLocalPath:e.repoLocalPath||t.repoLocalPath||"",repoId:e.repoId||t.repoId||"",repoUrl:e.repoUrl||t.repoUrl||"",marketplace:e.marketplace||t.marketplace||"",installSource:e.installSource||t.installSource||"",readmeUrl:e.readmeUrl||t.readmeUrl||"",containsSkills:Boolean(e.containsSkills||t.containsSkills),skillPaths:Array.isArray(e.skillPaths)?e.skillPaths:Array.isArray(t.skillPaths)?t.skillPaths:[],pluginKind:e.pluginKind||t.pluginKind||(e.containsSkills||t.containsSkills?"skill-bundle":"plugin"),strict:Object.prototype.hasOwnProperty.call(e,"strict")?e.strict:t.strict,directory:e.directory||t.directory||e.installPath||""}}),s=new Set(e.map(e=>e.pluginId||e.id||e.name));return[...t,...a.filter(e=>!s.has(e.pluginId||e.id||e.name)).map(e=>({...e,installed:!1,key:e.key||`market-${e.pluginId||e.id||e.name}`}))]};H.value=i(s,n),Z.value.market&&async function(e="claude",a=!1,l={}){const t=X("plugins-market",e,l.scope||"",l.cwd||"");return ae(t,t=>_.get("/plugins/market",{params:oe({platform:e,refresh:a?"1":""},l),signal:t}).then(e=>e.data),"plugins-market",`plugins-market:${e}`)}(l,e,{...f.projectPath?{cwd:f.projectPath}:{}}).catch(()=>({success:!0,plugins:[]})).then(e=>{a===Q.value&&l===ie.value&&(n=e.success?e.plugins:[],H.value=i(s,n))})}catch(t){a===Q.value&&l===ie.value&&T.error("加载插件失败: "+t.message)}finally{a===Q.value&&(z.value=!1)}}async function he(){if(ne.value&&"claude"===ie.value){F.value=!0;try{const e=await N("plugins");e.success?(T.success(`成功导入 ${e.imported} 个插件`),await ge(!0)):T.error(e.message||"导入失败")}catch(e){T.error("导入失败: "+e.message)}finally{F.value=!1}}}async function ke(e){if(ne.value&&Z.value.install&&!e.readonly){if(!(e.installSource||e.repoOwner||e.repoProjectPath||e.repoLocalPath))return T.error("缺少可安装来源");q.value[e.key]=!0;try{const a=e.installSource?await ue("",null,ie.value,e.pluginId||e.installSource,ve(e),e):await ue(e.directory,{id:e.repoId,provider:e.repoProvider,host:e.repoHost,owner:e.repoOwner,name:e.repoName,branch:e.repoBranch||"main",projectPath:e.repoProjectPath,localPath:e.repoLocalPath,repoUrl:e.repoUrl,marketplace:e.marketplace},ie.value,"",ve(e),e);if(a.success){T.success(`插件 "${e.name}" 安装成功`);const a=H.value.findIndex(a=>a.key===e.key);-1!==a&&(H.value[a]={...H.value[a],installed:!0,key:`installed-${e.pluginId||e.id||e.name}-${e.scope||ve(e).scope}`})}else T.error(a.message||"安装失败")}catch(a){T.error("安装失败: "+a.message)}finally{delete q.value[e.key]}}}async function be(e){if(ne.value&&Z.value.uninstall&&!e.readonly){V.value[e.key]=!0;try{const a=await async function(e,a="claude",l={}){return(await _.delete(`/plugins/${encodeURIComponent(e)}`,{params:oe({platform:a,pluginId:e},l)})).data}(e.pluginId||e.id||e.name,ie.value,ve(e));if(a.success){T.success(`插件 "${e.name}" 已卸载`);const a=H.value.findIndex(a=>a.key===e.key);-1!==a&&(H.value[a]={...H.value[a],installed:!1,key:`market-${e.pluginId||e.id||e.name}`})}else T.error(a.message||a.error||"卸载失败")}catch(a){T.error("卸载失败: "+a.message)}finally{delete V.value[e.key]}}}function we(e){E.value=e,K.value=!0}return o(()=>{f.inDrawer&&!f.drawerVisible||ge()}),c(()=>f.drawerVisible,e=>{e&&ge()}),c(()=>ie.value,()=>{ge()}),(o,c)=>(u(),w("div",{class:y(["plugins-panel asset-panel",{"in-drawer":l.inDrawer}])},[l.inDrawer?t("",!0):(u(),w("div",_a,[P("div",ja,[l.hideBack?t("",!0):(u(),r(g(a),{key:0,text:"",onClick:c[0]||(c[0]=e=>o.$emit("back")),class:"back-btn"},{icon:v(()=>[i(g(e),null,{default:v(()=>[i(g(x))]),_:1})]),_:1})),P("div",Ua,[P("div",Ca,[c[10]||(c[10]=P("span",{class:"asset-title"},"插件管理",-1)),P("span",$a,p(re.value),1)]),c[11]||(c[11]=P("div",{class:"asset-subtitle"},"管理平台插件、仓库源和市场安装状态",-1))])]),le.value.includes(ie.value)?(u(),w("div",La,[Z.value.repositories?(u(),r(g(a),{key:0,text:"",focusable:!1,onClick:c[1]||(c[1]=e=>D.value=!0),class:"action-btn"},{icon:v(()=>[i(g(e),null,{default:v(()=>[i(g(I))]),_:1})]),default:v(()=>[c[12]||(c[12]=s(" 仓库 ",-1))]),_:1})):t("",!0),Z.value.import?(u(),r(g(a),{key:1,text:"",focusable:!1,onClick:he,loading:F.value,class:"action-btn"},{icon:v(()=>[i(g(e),null,{default:v(()=>[i(g(B))]),_:1})]),default:v(()=>[c[13]||(c[13]=s(" 导入 ",-1))]),_:1},8,["loading"])):t("",!0),i(g(a),{text:"",focusable:!1,onClick:c[2]||(c[2]=e=>ge(!0)),loading:z.value,class:"action-btn"},{icon:v(()=>[i(g(e),null,{default:v(()=>[i(g(G))]),_:1})]),default:v(()=>[c[14]||(c[14]=s(" 刷新 ",-1))]),_:1},8,["loading"])])):t("",!0)])),l.inDrawer?(u(),w("div",Ta,[le.value.includes(ie.value)?(u(),w("div",Ia,[Z.value.repositories?(u(),r(g(a),{key:0,text:"",focusable:!1,onClick:c[3]||(c[3]=e=>D.value=!0),class:"action-btn"},{icon:v(()=>[i(g(e),null,{default:v(()=>[i(g(I))]),_:1})]),default:v(()=>[c[15]||(c[15]=s(" 仓库 ",-1))]),_:1})):t("",!0),Z.value.import?(u(),r(g(a),{key:1,text:"",focusable:!1,onClick:he,loading:F.value,class:"action-btn"},{icon:v(()=>[i(g(e),null,{default:v(()=>[i(g(B))]),_:1})]),default:v(()=>[c[16]||(c[16]=s(" 导入 ",-1))]),_:1},8,["loading"])):t("",!0),i(g(a),{text:"",focusable:!1,onClick:c[4]||(c[4]=e=>ge(!0)),loading:z.value,class:"action-btn"},{icon:v(()=>[i(g(e),null,{default:v(()=>[i(g(G))]),_:1})]),default:v(()=>[c[17]||(c[17]=s(" 刷新 ",-1))]),_:1},8,["loading"])])):t("",!0)])):t("",!0),P("div",za,[P("span",xa,[c[18]||(c[18]=P("span",{class:"asset-summary-label"},"全部",-1)),P("span",Oa,p(H.value.length),1)]),P("span",Sa,[c[19]||(c[19]=P("span",{class:"asset-summary-label"},"已安装",-1)),P("span",Ba,p(pe.value),1)]),P("span",Ha,[c[20]||(c[20]=P("span",{class:"asset-summary-label"},"可安装",-1)),P("span",Aa,p(H.value.length-pe.value),1)])]),P("div",Ga,[i(g(Y),{value:A.value,"onUpdate:value":c[5]||(c[5]=e=>A.value=e),placeholder:"搜索插件名称或描述",clearable:"",size:"small",class:"asset-search"},{prefix:v(()=>[i(g(e),null,{default:v(()=>[i(g(S))]),_:1})]),_:1},8,["value"]),i(g(te),{value:M.value,"onUpdate:value":c[6]||(c[6]=e=>M.value=e),options:ce,size:"small",class:"asset-filter"},null,8,["value"])]),P("div",Ra,[i(g(W),{show:z.value},{default:v(()=>[0!==me.value.length||z.value?(u(),w("div",Da,[(u(!0),w(m,null,n(me.value,e=>(u(),r(_e,{key:e.key,plugin:e,readonly:e.readonly||!Z.value.install&&!Z.value.uninstall,"can-install":Z.value.install,"can-uninstall":Z.value.uninstall,installing:!!q.value[e.key],uninstalling:!!V.value[e.key],onInstall:ke,onUninstall:be,onClick:we},null,8,["plugin","readonly","can-install","can-uninstall","installing","uninstalling"]))),128))])):(u(),w("div",Ma,[i(g(se),{description:ye.value},{icon:v(()=>[i(g(e),{size:"48",color:"var(--text-quaternary)"},{default:v(()=>[i(g(O))]),_:1})]),extra:v(()=>[le.value.includes(ie.value)&&0===H.value.length&&Z.value.repositories?(u(),r(g(a),{key:0,size:"small",onClick:c[7]||(c[7]=e=>D.value=!0)},{default:v(()=>[...c[21]||(c[21]=[s("配置仓库源",-1)])]),_:1})):t("",!0)]),_:1},8,["description"])]))]),_:1},8,["show"])]),le.value.includes(ie.value)&&(Z.value.install||Z.value.uninstall)?(u(),w("div",Na,[i(g(e),{size:"14",class:"asset-info-icon"},{default:v(()=>[i(g(L))]),_:1}),P("span",null,"安装/卸载后需重启 "+p(re.value)+" 生效",1)])):t("",!0),Z.value.repositories?(u(),r(ea,{key:3,visible:D.value,"onUpdate:visible":c[8]||(c[8]=e=>D.value=e),platform:ie.value,"project-path":f.projectPath,capabilities:Z.value,onUpdated:ge},null,8,["visible","platform","project-path","capabilities"])):t("",!0),i(Pa,{visible:K.value,"onUpdate:visible":c[9]||(c[9]=e=>K.value=e),plugin:E.value,platform:ie.value,onUpdated:ge},null,8,["visible","plugin","platform"])],2))}},[["__scopeId","data-v-be781058"]]);export{Ka as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{i as e,s as a,t}from"./_plugin-vue_export-helper-BeLZJZij.js";import{C as s,D as l,H as o,I as n,K as r,O as i,S as c,V as u,W as d,Z as p,_t as m,b as v,et as f,f as h,g as y,gt as g,i as j,m as _,mt as k,p as w,r as x,st as b,tt as C,w as z,x as P}from"./vue-vendor-BqZbbXHA.js";import{t as $}from"./vendors-D0c_0KLP.js";import{r as I,t as L}from"./platforms-CBkB45JP.js";import{Ft as M,J as D,_ as N,a as K,r as E}from"./icons-B2Vg-IOC.js";import{l as T}from"./light-Cp0t7v32.js";import{t as U}from"./headers-cf-QapUq.js";import{I as V,K as H,M as O,N as R,P as S,ct as q,dt as A,lt as F,pt as J}from"./index-
|
|
1
|
+
import{i as e,s as a,t}from"./_plugin-vue_export-helper-BeLZJZij.js";import{C as s,D as l,H as o,I as n,K as r,O as i,S as c,V as u,W as d,Z as p,_t as m,b as v,et as f,f as h,g as y,gt as g,i as j,m as _,mt as k,p as w,r as x,st as b,tt as C,w as z,x as P}from"./vue-vendor-BqZbbXHA.js";import{t as $}from"./vendors-D0c_0KLP.js";import{r as I,t as L}from"./platforms-CBkB45JP.js";import{Ft as M,J as D,_ as N,a as K,r as E}from"./icons-B2Vg-IOC.js";import{l as T}from"./light-Cp0t7v32.js";import{t as U}from"./headers-cf-QapUq.js";import{I as V,K as H,M as O,N as R,P as S,ct as q,dt as A,lt as F,pt as J}from"./index-BFInlZGI.js";import{t as W}from"./clipboard-B46yyoz_.js";import{p as Z,t as B}from"./sessions-Cmy31slD.js";import{t as G}from"./sessions-yC_oVVh8.js";var Q={class:"card-content"},X={class:"header-row"},Y={class:"project-name"},ee={class:"stats-row"},ae=t({__name:"ProjectCard",props:{project:{type:Object,required:!0}},emits:["click","delete"],setup(t,{emit:o}){const n=t,r=o,u=b(!1);function p(){r("click")}function y(){r("delete",n.project)}const g=v(()=>n.project?.displayName||n.project?.name||""),j=v(()=>n.project?.path||n.project?.fullPath||n.project?.name||""),w=v(()=>n.project?.sessionCount||0),x=v(()=>n.project?.lastUsed),$=v(()=>{const e=["#18a058","#2080f0","#f0a020","#d03050","#9333ea","#06b6d4"];return e[(n.project?.name||"").split("").reduce((e,a)=>e+a.charCodeAt(0),0)%e.length]});function I(e){if(!e)return"";const a=new Date(e),t=new Date-a;return t<6e4?"刚刚":t<36e5?`${Math.floor(t/6e4)}分钟前`:t<864e5?`${Math.floor(t/36e5)}小时前`:t<6048e5?`${Math.floor(t/864e5)}天前`:a.toLocaleDateString("zh-CN")}return(t,o)=>(d(),z("div",{class:"project-card",onClick:p,onMouseenter:o[0]||(o[0]=e=>u.value=!0),onMouseleave:o[1]||(o[1]=e=>u.value=!1)},[P("div",Q,[P("div",X,[i(k(e),{size:"18",color:$.value},{default:f(()=>[i(k(D))]),_:1},8,["color"]),P("span",Y,m(g.value),1),C(i(k(a),{text:"",type:"error",size:"tiny",class:"delete-btn",onClick:_(y,["stop"])},{icon:f(()=>[i(k(e),{size:"14"},{default:f(()=>[i(k(E))]),_:1})]),_:1},512),[[h,u.value]])]),i(k(S),{depth:"3",class:"project-path"},{default:f(()=>[l(m(j.value),1)]),_:1}),P("div",ee,[i(k(A),{size:"tiny",bordered:!1,type:"success"},{default:f(()=>[l(m(w.value)+" 会话 ",1)]),_:1}),x.value?(d(),c(k(S),{key:0,depth:"3",class:"last-used"},{default:f(()=>[l(m(I(x.value)),1)]),_:1})):s("",!0)])])],32))}},[["__scopeId","data-v-3a18e66d"]]),te={class:"project-list-container"},se={class:"header"},le={class:"header-text"},oe={key:0,class:"loading-container"},ne={key:1,class:"loading-container compact"},re={key:4,class:"projects-grid"},ie={class:"search-hint"},ce={style:{"margin-bottom":"16px"}},ue={key:0,style:{"max-height":"60vh","overflow-y":"auto"}},de={class:"search-result-header"},pe={class:"search-result-title"},me=t({__name:"ProjectList",setup(t){const h=j(),_=x(),C=G(),E=L(),Q=v(()=>I(_)),X=b(""),Y=b([]),ee=b(null),me=b(!1),ve=b(""),fe=b(null),he=b(!1),ye=b(null),ge=v(()=>{const e=X.value.toLowerCase();return Y.value.filter(a=>{const t=(a.displayName||"").toLowerCase(),s=(a.fullPath||"").toLowerCase();return t.includes(e)||s.includes(e)})});function je(e){h.push({name:"cli-sessions",params:{platform:Q.value,projectName:e}})}async function _e(){const e=Y.value.map(e=>e.name);await C.saveProjectOrder(e)}function ke(e){const a=e.fullPath||e.name,t=e.sessionCount||0;O.warning({title:"删除项目",content:`确定要删除项目 "${a}" 吗?\n\n当前项目包含 ${t} 个会话,删除后所有会话数据将无法恢复!`,positiveText:"确定删除",negativeText:"取消",onPositiveClick:async()=>{try{await C.deleteProject(e.name),R.success("项目已删除")}catch(a){R.error("删除失败: "+a.message)}}})}async function we(){try{const a=(e=Q.value,E.get(e)?.command||e);if("manual"===(await W(a))?.method)return void R.warning("自动复制失败,已弹出手动复制框");R.success("基础启动命令已复制到剪贴板")}catch(a){R.error("复制失败: "+a.message)}var e}async function xe(){if(ve.value){he.value=!0;try{const e=await Z(ve.value,35,Q.value);fe.value=e}catch(e){R.error("搜索失败: "+e.message)}finally{he.value=!1}}}function be(e,a){if(!a||!e)return e;const t=new RegExp(`(${a})`,"gi");return e.replace(t,'<mark style="background-color: #ffd700; padding: 2px 4px; border-radius: 2px; font-weight: 600;">$1</mark>')}function Ce(e){(e.metaKey||e.ctrlKey)&&"k"===e.key&&(e.preventDefault(),me.value=!0,n(()=>{ye.value?.focus()}))}return p(()=>C.projects,e=>{Y.value=[...e]}),p(me,e=>{e||(ve.value="",fe.value=null)}),p(Q,e=>{C.setChannel(e),C.fetchProjects()},{immediate:!0}),u(()=>{document.addEventListener("keydown",Ce)}),o(()=>{document.removeEventListener("keydown",Ce)}),(t,o)=>(d(),z("div",te,[P("div",se,[P("div",le,[i(k(U),{style:{margin:"0"}},{default:f(()=>[...o[4]||(o[4]=[l("我的项目",-1)])]),_:1}),i(k(S),{depth:"3"},{default:f(()=>[...o[5]||(o[5]=[l("选择一个项目查看会话,拖拽可调整顺序",-1)])]),_:1})]),i(k(H),null,{default:f(()=>[i(k(a),{type:"primary",size:"medium",onClick:we},{icon:f(()=>[i(k(e),null,{default:f(()=>[i(k(M))]),_:1})]),default:f(()=>[o[6]||(o[6]=l(" 新建项目 ",-1))]),_:1}),i(k(q),{value:X.value,"onUpdate:value":o[0]||(o[0]=e=>X.value=e),placeholder:"搜索项目...",clearable:"",class:"search-input"},{prefix:f(()=>[i(k(e),null,{default:f(()=>[i(k(N))]),_:1})]),_:1},8,["value"])]),_:1})]),P("div",{class:"content",ref_key:"contentEl",ref:ee},[k(C).loading&&0===k(C).projects.length&&!k(C).projectsPending?(d(),z("div",oe,[i(k(V),{size:"large"},{description:f(()=>[...o[7]||(o[7]=[l(" 加载项目列表... ",-1)])]),_:1})])):k(C).projectsPending?(d(),z("div",ne,[i(k(V),{size:"small"},{description:f(()=>[...o[8]||(o[8]=[l(" 正在生成项目列表... ",-1)])]),_:1})])):k(C).error&&0===k(C).projects.length?(d(),c(k(F),{key:2,type:"error",title:"加载失败",style:{"margin-top":"20px"}},{default:f(()=>[l(m(k(C).error),1)]),_:1})):!X.value&&Y.value.length>0?(d(),c(k($),{key:3,modelValue:Y.value,"onUpdate:modelValue":o[1]||(o[1]=e=>Y.value=e),"item-key":"name",class:"projects-grid","ghost-class":"ghost","chosen-class":"chosen","drag-class":"drag",animation:"200",onEnd:_e},{item:f(({element:e})=>[i(ae,{project:e,onClick:a=>je(e.name),onDelete:ke},null,8,["project","onClick"])]),_:1},8,["modelValue"])):X.value&&ge.value.length>0?(d(),z("div",re,[(d(!0),z(y,null,r(ge.value,e=>(d(),c(ae,{key:e.name,project:e,onClick:a=>je(e.name),onDelete:ke},null,8,["project","onClick"]))),128))])):s("",!0),k(C).loading||k(C).error||k(C).projectsPending||!(!X.value&&0===k(C).projects.length||X.value&&0===ge.value.length)?s("",!0):(d(),c(k(J),{key:5,description:X.value?"没有匹配的项目":"没有找到项目",style:{"margin-top":"60px"}},{icon:f(()=>[i(k(e),null,{default:f(()=>[i(k(D))]),_:1})]),_:1},8,["description"]))],512),P("div",ie,[i(k(S),{depth:"3",style:{"font-size":"12px"}},{default:f(()=>[...o[9]||(o[9]=[P("kbd",null,"Cmd",-1),l(" / ",-1),P("kbd",null,"Ctrl",-1),l(" + ",-1),P("kbd",null,"K",-1),l(" 全局搜索 ",-1)])]),_:1})]),i(k(T),{show:me.value,"onUpdate:show":o[3]||(o[3]=e=>me.value=e),preset:"card",title:"全局搜索",style:g([{width:"800px","max-width":"90vw"},{marginTop:"80px"}])},{default:f(()=>[P("div",ce,[i(k(q),{ref_key:"globalSearchInputRef",ref:ye,value:ve.value,"onUpdate:value":o[2]||(o[2]=e=>ve.value=e),placeholder:"搜索所有项目的对话内容...",clearable:"",onKeyup:w(xe,["enter"]),disabled:he.value},{prefix:f(()=>[i(k(e),null,{default:f(()=>[i(k(N))]),_:1})]),suffix:f(()=>[i(k(a),{text:"",onClick:xe,disabled:!ve.value||he.value,loading:he.value},{default:f(()=>[...o[10]||(o[10]=[l(" 搜索 ",-1)])]),_:1},8,["disabled","loading"])]),_:1},8,["value","disabled"])]),fe.value?(d(),z("div",ue,[i(k(F),{type:"info",style:{"margin-bottom":"16px"}},{default:f(()=>[l(' 关键词 "'+m(fe.value.keyword)+'" 共找到 '+m(fe.value.totalMatches)+" 处匹配 ",1)]),_:1}),(d(!0),z(y,null,r(fe.value.sessions,t=>(d(),z("div",{key:`${t.projectName}-${t.sessionId}`,class:"search-result-item"},[P("div",de,[P("div",pe,[i(k(S),{strong:"",style:{"font-size":"15px","font-weight":"700"}},{default:f(()=>[l(m(t.projectDisplayName),1)]),_:2},1024),i(k(S),{depth:"2",style:{margin:"0 8px"}},{default:f(()=>[...o[11]||(o[11]=[l("·",-1)])]),_:1}),i(k(S),{strong:""},{default:f(()=>[l(m(t.alias?`${t.alias} (${t.sessionId.substring(0,8)})`:t.sessionId.substring(0,8)),1)]),_:2},1024),i(k(A),{size:"small",bordered:!1},{default:f(()=>[l(m(t.matchCount)+" 个匹配",1)]),_:2},1024)]),i(k(a),{size:"small",type:"primary",onClick:e=>async function(e,a){try{const{copyResult:t}=await B(e,a,Q.value);"manual"===t?.method?R.warning("自动复制失败,已弹出手动复制框"):R.success("启动命令已复制到剪贴板"),me.value=!1}catch(t){R.error("复制失败: "+t.message)}}(t.projectName,t.sessionId)},{icon:f(()=>[i(k(e),null,{default:f(()=>[i(k(K))]),_:1})]),default:f(()=>[o[12]||(o[12]=l(" 使用对话 ",-1))]),_:1},8,["onClick"])]),(d(!0),z(y,null,r(t.matches,(e,a)=>(d(),z("div",{key:a,class:"search-match"},[i(k(A),{size:"tiny",type:"user"===e.role?"info":"success",bordered:!1},{default:f(()=>[l(m("user"===e.role?"用户":"助手"),1)]),_:2},1032,["type"]),i(k(S),{depth:"3",class:"search-match-text",innerHTML:be(e.context,fe.value.keyword)},null,8,["innerHTML"])]))),128))]))),128)),0===fe.value.sessions.length?(d(),c(k(J),{key:0,description:"没有找到匹配的内容"})):s("",!0)])):s("",!0)]),_:1},8,["show"])]))}},[["__scopeId","data-v-8e29bffb"]]);export{me as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{i as e,s as a,t as s}from"./_plugin-vue_export-helper-BeLZJZij.js";import{C as t,D as l,K as i,O as n,S as r,W as c,Z as u,_t as o,at as d,b as p,et as v,g as m,ht as f,mt as y,st as g,w as b,x as h}from"./vue-vendor-BqZbbXHA.js";import{n as k}from"./client-UDwXBP9i.js";import{B as _,C as w,Ft as z,Nt as P,et as C,it as x,lt as j,pt as B,r as I,tt as D,xt as U}from"./icons-B2Vg-IOC.js";import{n as $,t as O}from"./useResponsiveDrawer-B3uojyvV.js";import{t as q}from"./DrawerContent-ChXgZ1Xm.js";import{$ as A,F as T,I as E,M as F,N as L,Nt as M,Q as N,ct as S,dt as V}from"./index-DnEocV0M.js";import{t as W}from"./MarkdownEditor-rEZ-c72L.js";var Z={class:"form-header"},K={class:"form-container"},Q={class:"form-section"},R={class:"section-title"},G={class:"form-item"},H={key:0,class:"form-error"},J={class:"form-item"},X={class:"form-item"},Y={class:"form-section"},ee={class:"section-title"},ae={class:"apps-toggles"},se={class:"app-name"},te={key:0,class:"platform-empty"},le={class:"form-section content-section"},ie={class:"section-title"},ne={class:"form-footer"},re=s({__name:"PromptsFormDrawer",props:{visible:{type:Boolean,default:!1},editingPreset:{type:Object,default:null},existingIds:{type:Array,default:()=>[]},platforms:{type:Array,default:()=>[]}},emits:["update:visible","saved"],setup(s,{emit:f}){const{drawerWidth:w}=O(600),z=s,C=f,x=p({get:()=>z.visible,set:e=>C("update:visible",e)}),B=p(()=>!!z.editingPreset),{byCapability:I}=M(),U=p(()=>z.platforms.length>0?z.platforms:I("prompts"));function A(){return Object.fromEntries(U.value.map(e=>[e.key,!0]))}const E=g(!1),F=g(""),N=d({id:"",name:"",description:"",content:"",apps:{}});async function V(){if(N.id.trim()?/^[a-zA-Z0-9_-]+$/.test(N.id)?!B.value&&z.existingIds.includes(N.id)?(F.value="该 ID 已被使用",0):(F.value="",1):(F.value="ID 只能包含字母、数字、下划线和连字符",0):(F.value="预设 ID 不能为空",0))if(N.name.trim()){E.value=!0;try{const e={id:N.id.trim(),name:N.name.trim(),description:N.description.trim(),content:N.content,apps:B.value?{...N.apps}:Object.fromEntries(U.value.map(e=>[e.key,!0===N.apps[e.key]]))};z.editingPreset?.isBuiltin&&(e.isBuiltin=!0),(await async function(e){return(await k.post("/prompts/presets",e)).data}(e)).success&&(L.success(B.value?"保存成功":"创建成功"),C("saved"),x.value=!1)}catch(e){L.error("保存失败: "+e.message)}finally{E.value=!1}}else L.error("预设名称不能为空")}function re(){x.value=!1}return u(()=>z.visible,e=>{e&&(z.editingPreset?(N.id=z.editingPreset.id||"",N.name=z.editingPreset.name||"",N.description=z.editingPreset.description||"",N.content=z.editingPreset.content||"",N.apps=z.editingPreset.apps?{...z.editingPreset.apps}:A()):(N.id="",N.name="",N.description="",N.content="",N.apps=A()),F.value="")}),(u,d)=>(c(),r(y($),{show:x.value,"onUpdate:show":d[4]||(d[4]=e=>x.value=e),width:y(w),placement:"right","show-mask":!0},{default:v(()=>[n(y(q),{closable:"","native-scrollbar":!1},{header:v(()=>[h("div",Z,[n(y(e),{size:18,class:"header-icon"},{default:v(()=>[n(y(D))]),_:1}),h("span",null,o(B.value?"编辑预设":"新建预设"),1)])]),footer:v(()=>[h("div",ne,[n(y(a),{onClick:re},{default:v(()=>[...d[12]||(d[12]=[l("取消",-1)])]),_:1}),n(y(a),{type:"primary",onClick:V,loading:E.value},{default:v(()=>[l(o(B.value?"保存":"创建"),1)]),_:1},8,["loading"])])]),default:v(()=>[h("div",K,[h("div",Q,[h("div",R,[n(y(e),{size:16},{default:v(()=>[n(y(_))]),_:1}),d[5]||(d[5]=h("span",null,"基本信息",-1))]),h("div",G,[d[6]||(d[6]=h("label",{class:"form-label"},[l("预设 ID "),h("span",{class:"required"},"*")],-1)),n(y(S),{value:N.id,"onUpdate:value":d[0]||(d[0]=e=>N.id=e),placeholder:"唯一标识符,如 my-preset",disabled:B.value&&s.editingPreset?.isBuiltin},null,8,["value","disabled"]),F.value?(c(),b("p",H,o(F.value),1)):t("",!0)]),h("div",J,[d[7]||(d[7]=h("label",{class:"form-label"},[l("名称 "),h("span",{class:"required"},"*")],-1)),n(y(S),{value:N.name,"onUpdate:value":d[1]||(d[1]=e=>N.name=e),placeholder:"预设名称"},null,8,["value"])]),h("div",X,[d[8]||(d[8]=h("label",{class:"form-label"},"描述",-1)),n(y(S),{value:N.description,"onUpdate:value":d[2]||(d[2]=e=>N.description=e),placeholder:"简短描述这个预设的用途"},null,8,["value"])])]),h("div",Y,[h("div",ee,[n(y(e),{size:16},{default:v(()=>[n(y(P))]),_:1}),d[9]||(d[9]=h("span",null,"生效范围",-1))]),h("div",ae,[(c(!0),b(m,null,i(U.value,e=>(c(),b("label",{key:e.key,class:"app-toggle"},[n(y(T),{value:N.apps[e.key],"onUpdate:value":a=>N.apps[e.key]=a},null,8,["value","onUpdate:value"]),h("span",se,o(e.promptLabel||e.label||e.title||e.key),1)]))),128)),0===U.value.length?(c(),b("span",te," 当前没有可用的 Prompt 平台 ")):t("",!0)])]),h("div",le,[h("div",ie,[n(y(e),{size:16},{default:v(()=>[n(y(j))]),_:1}),d[10]||(d[10]=h("span",null,"提示词内容",-1)),d[11]||(d[11]=h("span",{class:"content-hint"},"支持 Markdown 格式",-1))]),n(W,{modelValue:N.content,"onUpdate:modelValue":d[3]||(d[3]=e=>N.content=e),rows:16,"min-height":300,placeholder:"# 系统提示词\n\n在这里编写你的系统提示词..."},null,8,["modelValue"])])])]),_:1})]),_:1},8,["show","width"]))}},[["__scopeId","data-v-1e68a77e"]]),ce={class:"drawer-header"},ue={class:"header-title"},oe={class:"prompts-container"},de={class:"status-card"},pe={class:"status-info"},ve={class:"status-text"},me={class:"status-value"},fe={class:"status-actions"},ye={class:"stats-bar"},ge={class:"stats-text"},be={class:"preset-list"},he={key:0,class:"empty-state"},ke={key:1,class:"preset-cards"},_e={class:"card-header"},we={class:"card-title"},ze={class:"preset-name"},Pe={class:"card-actions"},Ce={key:0,class:"card-desc"},xe={class:"card-apps"},je={class:"card-preview"},Be={class:"preview-content"},Ie=s({__name:"PromptsDrawer",props:{visible:{type:Boolean,default:!1}},emits:["update:visible"],setup(s,{emit:d}){const{drawerWidth:_}=O(720),P=s,j=d,T=p({get:()=>P.visible,set:e=>j("update:visible",e)}),S=g(!1),W=g({}),Z=g(null),K=g(!1),Q=g(null),R=g(null),G=g(!1),{byCapability:H}=M(),J=p(()=>H("prompts")),X=p(()=>{const e=Object.values(W.value),a=e.filter(e=>!e.isBuiltin),s=e.filter(e=>e.isBuiltin);return a.sort((e,a)=>e.id===Z.value?-1:a.id===Z.value?1:(a.updatedAt||0)-(e.updatedAt||0)),[...a,...s]}),Y=p(()=>X.value.length),ee=p(()=>Object.keys(W.value)),ae=p(()=>Z.value?W.value[Z.value]:null),se=p(()=>{const e=X.value;return{builtin:e.filter(e=>e.isBuiltin).length,custom:e.filter(e=>!e.isBuiltin).length}}),te=p(()=>J.value.map(e=>({label:`从 ${e.promptLabel||e.label||e.title||e.key} 导入`,key:e.key})));function le(e){if(!e)return"";let a=e.split("\n").slice(0,4).join("\n");return e.split("\n").length>4&&(a+="\n..."),a.substring(0,200)}async function ie(){S.value=!0;try{const e=await async function(){return(await k.get("/prompts/presets")).data}();e.success&&(W.value=e.presets,Z.value=e.activePresetId)}catch(e){L.error("加载预设失败")}finally{S.value=!1}}async function ne(e){R.value=e.id;try{(await async function(e){return(await k.post(`/prompts/presets/${e}/activate`)).data}(e.id)).success&&(Z.value=e.id,L.success(`已激活预设 "${e.name}"`))}catch(a){L.error("激活失败: "+a.message)}finally{R.value=null}}async function Ie(){F.warning({title:"移除提示词",content:"确定要移除当前激活的提示词吗?这将删除各平台的提示词文件。",positiveText:"移除",negativeText:"取消",onPositiveClick:async()=>{G.value=!0;try{(await async function(){return(await k.post("/prompts/deactivate")).data}()).success&&(Z.value=null,L.success("已移除提示词"))}catch(e){L.error("移除失败: "+e.message)}finally{G.value=!1}}})}function De(e){F.warning({title:"删除确认",content:`确定要删除预设 "${e.name}" 吗?此操作不可恢复。`,positiveText:"删除",negativeText:"取消",onPositiveClick:async()=>{try{(await async function(e){return(await k.delete(`/prompts/presets/${e}`)).data}(e.id)).success&&(delete W.value[e.id],L.success("删除成功"))}catch(a){L.error("删除失败: "+a.message)}}})}async function Ue(e){try{const a=await async function(e,a){return(await k.post(`/prompts/import/${e}`,{name:a})).data}(e);a.success&&(W.value[a.preset.id]=a.preset,L.success(a.message))}catch(a){L.error("导入失败: "+a.message)}}function $e(){Q.value=null,K.value=!0}function Oe(){ie()}return u(()=>P.visible,e=>{e&&ie()},{immediate:!0}),(s,u)=>(c(),b(m,null,[n(y($),{show:T.value,"onUpdate:show":u[0]||(u[0]=e=>T.value=e),width:y(_),placement:"right","show-mask":!0},{default:v(()=>[n(y(q),{title:"Prompts 管理",closable:"","native-scrollbar":!1},{header:v(()=>[h("div",ce,[h("div",ue,[n(y(e),{size:20,class:"header-icon"},{default:v(()=>[n(y(D))]),_:1}),u[2]||(u[2]=h("span",null,"Prompts 管理",-1))])])]),default:v(()=>[h("div",oe,[h("div",de,[h("div",pe,[ae.value?(c(),b(m,{key:0},[n(y(e),{class:"status-icon active",size:18},{default:v(()=>[n(y(U))]),_:1}),h("div",ve,[u[3]||(u[3]=h("span",{class:"status-label"},"当前激活:",-1)),h("span",me,o(ae.value.name),1)])],64)):(c(),b(m,{key:1},[n(y(e),{class:"status-icon inactive",size:18},{default:v(()=>[n(y(w))]),_:1}),u[4]||(u[4]=h("div",{class:"status-text"},[h("span",{class:"status-label"},"未激活任何提示词")],-1))],64))]),h("div",fe,[n(y(N),{trigger:"click",options:te.value,onSelect:Ue},{default:v(()=>[n(y(a),{size:"small",tertiary:"",class:"action-btn"},{icon:v(()=>[n(y(e),{size:14},{default:v(()=>[n(y(C))]),_:1})]),default:v(()=>[u[5]||(u[5]=l(" 导入 ",-1))]),_:1})]),_:1},8,["options"]),n(y(a),{size:"small",tertiary:"",type:"primary",class:"action-btn",onClick:$e},{icon:v(()=>[n(y(e),{size:14},{default:v(()=>[n(y(z))]),_:1})]),default:v(()=>[u[6]||(u[6]=l(" 新建 ",-1))]),_:1}),ae.value?(c(),r(y(A),{key:0,trigger:"hover"},{trigger:v(()=>[n(y(a),{size:"small",quaternary:"",class:"action-btn remove-btn",onClick:Ie,loading:G.value},{icon:v(()=>[n(y(e),{size:16},{default:v(()=>[n(y(B))]),_:1})]),default:v(()=>[u[7]||(u[7]=l(" 移除 ",-1))]),_:1},8,["loading"])]),default:v(()=>[u[8]||(u[8]=l(" 删除各平台的提示词文件 ",-1))]),_:1})):t("",!0)])]),h("div",ye,[h("span",ge,[l(" 共 "+o(Y.value)+" 个预设 ",1),Y.value>0?(c(),b(m,{key:0},[l(" · 自定义: "+o(se.value.custom)+" · 内置模板: "+o(se.value.builtin),1)],64)):t("",!0)])]),h("div",be,[n(y(E),{show:S.value},{default:v(()=>[0!==X.value.length||S.value?(c(),b("div",ke,[(c(!0),b(m,null,i(X.value,s=>(c(),b("div",{key:s.id,class:f(["preset-card",{active:s.id===Z.value}])},[h("div",_e,[h("div",we,[s.id===Z.value?(c(),r(y(e),{key:0,class:"active-icon",size:16},{default:v(()=>[n(y(U))]),_:1})):t("",!0),h("span",ze,o(s.name),1),s.isBuiltin?(c(),r(y(V),{key:1,size:"tiny",bordered:!1,type:"info"},{default:v(()=>[...u[11]||(u[11]=[l("模板",-1)])]),_:1})):t("",!0),s.isImported?(c(),r(y(V),{key:2,size:"tiny",bordered:!1,type:"warning"},{default:v(()=>[...u[12]||(u[12]=[l("已导入",-1)])]),_:1})):t("",!0)]),h("div",Pe,[s.id!==Z.value?(c(),r(y(a),{key:0,size:"tiny",type:"primary",onClick:e=>ne(s),loading:R.value===s.id},{default:v(()=>[...u[13]||(u[13]=[l(" 激活 ",-1)])]),_:1},8,["onClick","loading"])):t("",!0),n(y(a),{quaternary:"",size:"tiny",onClick:e=>function(e){Q.value=e,K.value=!0}(s)},{icon:v(()=>[n(y(e),null,{default:v(()=>[n(y(x))]),_:1})]),_:1},8,["onClick"]),s.isBuiltin?t("",!0):(c(),r(y(a),{key:1,quaternary:"",size:"tiny",onClick:e=>De(s)},{icon:v(()=>[n(y(e),null,{default:v(()=>[n(y(I))]),_:1})]),_:1},8,["onClick"]))])]),s.description?(c(),b("p",Ce,o(s.description),1)):t("",!0),h("div",xe,[u[14]||(u[14]=h("span",{class:"apps-label"},"生效范围:",-1)),(c(!0),b(m,null,i(J.value,e=>(c(),r(y(V),{key:e.key,type:s.apps?.[e.key]?"success":"default",size:"tiny",bordered:!1},{default:v(()=>[l(o(e.promptLabel||e.label||e.title||e.key),1)]),_:2},1032,["type"]))),128))]),h("div",je,[h("pre",Be,o(le(s.content)),1)])],2))),128))])):(c(),b("div",he,[n(y(e),{size:48,class:"empty-icon"},{default:v(()=>[n(y(D))]),_:1}),u[9]||(u[9]=h("p",{class:"empty-title"},"暂无预设",-1)),u[10]||(u[10]=h("p",{class:"empty-desc"},'点击上方"新建"按钮创建系统提示词预设',-1))]))]),_:1},8,["show"])])])]),_:1})]),_:1},8,["show","width"]),n(re,{visible:K.value,"onUpdate:visible":u[1]||(u[1]=e=>K.value=e),"editing-preset":Q.value,"existing-ids":ee.value,platforms:J.value,onSaved:Oe},null,8,["visible","editing-preset","existing-ids","platforms"])],64))}},[["__scopeId","data-v-61810a34"]]);export{Ie as default};
|
|
1
|
+
import{i as e,s as a,t as s}from"./_plugin-vue_export-helper-BeLZJZij.js";import{C as t,D as l,K as i,O as n,S as r,W as c,Z as u,_t as o,at as d,b as p,et as v,g as m,ht as f,mt as y,st as g,w as b,x as h}from"./vue-vendor-BqZbbXHA.js";import{n as k}from"./client-UDwXBP9i.js";import{B as _,C as w,Ft as z,Nt as P,et as C,it as x,lt as j,pt as B,r as I,tt as D,xt as U}from"./icons-B2Vg-IOC.js";import{n as $,t as O}from"./useResponsiveDrawer-D-DDpbnI.js";import{t as q}from"./DrawerContent-ChXgZ1Xm.js";import{$ as A,F as T,I as E,M as F,N as L,Nt as M,Q as N,ct as S,dt as V}from"./index-BFInlZGI.js";import{t as W}from"./MarkdownEditor-BvkDECwH.js";var Z={class:"form-header"},K={class:"form-container"},Q={class:"form-section"},R={class:"section-title"},G={class:"form-item"},H={key:0,class:"form-error"},J={class:"form-item"},X={class:"form-item"},Y={class:"form-section"},ee={class:"section-title"},ae={class:"apps-toggles"},se={class:"app-name"},te={key:0,class:"platform-empty"},le={class:"form-section content-section"},ie={class:"section-title"},ne={class:"form-footer"},re=s({__name:"PromptsFormDrawer",props:{visible:{type:Boolean,default:!1},editingPreset:{type:Object,default:null},existingIds:{type:Array,default:()=>[]},platforms:{type:Array,default:()=>[]}},emits:["update:visible","saved"],setup(s,{emit:f}){const{drawerWidth:w}=O(600),z=s,C=f,x=p({get:()=>z.visible,set:e=>C("update:visible",e)}),B=p(()=>!!z.editingPreset),{byCapability:I}=M(),U=p(()=>z.platforms.length>0?z.platforms:I("prompts"));function A(){return Object.fromEntries(U.value.map(e=>[e.key,!0]))}const E=g(!1),F=g(""),N=d({id:"",name:"",description:"",content:"",apps:{}});async function V(){if(N.id.trim()?/^[a-zA-Z0-9_-]+$/.test(N.id)?!B.value&&z.existingIds.includes(N.id)?(F.value="该 ID 已被使用",0):(F.value="",1):(F.value="ID 只能包含字母、数字、下划线和连字符",0):(F.value="预设 ID 不能为空",0))if(N.name.trim()){E.value=!0;try{const e={id:N.id.trim(),name:N.name.trim(),description:N.description.trim(),content:N.content,apps:B.value?{...N.apps}:Object.fromEntries(U.value.map(e=>[e.key,!0===N.apps[e.key]]))};z.editingPreset?.isBuiltin&&(e.isBuiltin=!0),(await async function(e){return(await k.post("/prompts/presets",e)).data}(e)).success&&(L.success(B.value?"保存成功":"创建成功"),C("saved"),x.value=!1)}catch(e){L.error("保存失败: "+e.message)}finally{E.value=!1}}else L.error("预设名称不能为空")}function re(){x.value=!1}return u(()=>z.visible,e=>{e&&(z.editingPreset?(N.id=z.editingPreset.id||"",N.name=z.editingPreset.name||"",N.description=z.editingPreset.description||"",N.content=z.editingPreset.content||"",N.apps=z.editingPreset.apps?{...z.editingPreset.apps}:A()):(N.id="",N.name="",N.description="",N.content="",N.apps=A()),F.value="")}),(u,d)=>(c(),r(y($),{show:x.value,"onUpdate:show":d[4]||(d[4]=e=>x.value=e),width:y(w),placement:"right","show-mask":!0},{default:v(()=>[n(y(q),{closable:"","native-scrollbar":!1},{header:v(()=>[h("div",Z,[n(y(e),{size:18,class:"header-icon"},{default:v(()=>[n(y(D))]),_:1}),h("span",null,o(B.value?"编辑预设":"新建预设"),1)])]),footer:v(()=>[h("div",ne,[n(y(a),{onClick:re},{default:v(()=>[...d[12]||(d[12]=[l("取消",-1)])]),_:1}),n(y(a),{type:"primary",onClick:V,loading:E.value},{default:v(()=>[l(o(B.value?"保存":"创建"),1)]),_:1},8,["loading"])])]),default:v(()=>[h("div",K,[h("div",Q,[h("div",R,[n(y(e),{size:16},{default:v(()=>[n(y(_))]),_:1}),d[5]||(d[5]=h("span",null,"基本信息",-1))]),h("div",G,[d[6]||(d[6]=h("label",{class:"form-label"},[l("预设 ID "),h("span",{class:"required"},"*")],-1)),n(y(S),{value:N.id,"onUpdate:value":d[0]||(d[0]=e=>N.id=e),placeholder:"唯一标识符,如 my-preset",disabled:B.value&&s.editingPreset?.isBuiltin},null,8,["value","disabled"]),F.value?(c(),b("p",H,o(F.value),1)):t("",!0)]),h("div",J,[d[7]||(d[7]=h("label",{class:"form-label"},[l("名称 "),h("span",{class:"required"},"*")],-1)),n(y(S),{value:N.name,"onUpdate:value":d[1]||(d[1]=e=>N.name=e),placeholder:"预设名称"},null,8,["value"])]),h("div",X,[d[8]||(d[8]=h("label",{class:"form-label"},"描述",-1)),n(y(S),{value:N.description,"onUpdate:value":d[2]||(d[2]=e=>N.description=e),placeholder:"简短描述这个预设的用途"},null,8,["value"])])]),h("div",Y,[h("div",ee,[n(y(e),{size:16},{default:v(()=>[n(y(P))]),_:1}),d[9]||(d[9]=h("span",null,"生效范围",-1))]),h("div",ae,[(c(!0),b(m,null,i(U.value,e=>(c(),b("label",{key:e.key,class:"app-toggle"},[n(y(T),{value:N.apps[e.key],"onUpdate:value":a=>N.apps[e.key]=a},null,8,["value","onUpdate:value"]),h("span",se,o(e.promptLabel||e.label||e.title||e.key),1)]))),128)),0===U.value.length?(c(),b("span",te," 当前没有可用的 Prompt 平台 ")):t("",!0)])]),h("div",le,[h("div",ie,[n(y(e),{size:16},{default:v(()=>[n(y(j))]),_:1}),d[10]||(d[10]=h("span",null,"提示词内容",-1)),d[11]||(d[11]=h("span",{class:"content-hint"},"支持 Markdown 格式",-1))]),n(W,{modelValue:N.content,"onUpdate:modelValue":d[3]||(d[3]=e=>N.content=e),rows:16,"min-height":300,placeholder:"# 系统提示词\n\n在这里编写你的系统提示词..."},null,8,["modelValue"])])])]),_:1})]),_:1},8,["show","width"]))}},[["__scopeId","data-v-1e68a77e"]]),ce={class:"drawer-header"},ue={class:"header-title"},oe={class:"prompts-container"},de={class:"status-card"},pe={class:"status-info"},ve={class:"status-text"},me={class:"status-value"},fe={class:"status-actions"},ye={class:"stats-bar"},ge={class:"stats-text"},be={class:"preset-list"},he={key:0,class:"empty-state"},ke={key:1,class:"preset-cards"},_e={class:"card-header"},we={class:"card-title"},ze={class:"preset-name"},Pe={class:"card-actions"},Ce={key:0,class:"card-desc"},xe={class:"card-apps"},je={class:"card-preview"},Be={class:"preview-content"},Ie=s({__name:"PromptsDrawer",props:{visible:{type:Boolean,default:!1}},emits:["update:visible"],setup(s,{emit:d}){const{drawerWidth:_}=O(720),P=s,j=d,T=p({get:()=>P.visible,set:e=>j("update:visible",e)}),S=g(!1),W=g({}),Z=g(null),K=g(!1),Q=g(null),R=g(null),G=g(!1),{byCapability:H}=M(),J=p(()=>H("prompts")),X=p(()=>{const e=Object.values(W.value),a=e.filter(e=>!e.isBuiltin),s=e.filter(e=>e.isBuiltin);return a.sort((e,a)=>e.id===Z.value?-1:a.id===Z.value?1:(a.updatedAt||0)-(e.updatedAt||0)),[...a,...s]}),Y=p(()=>X.value.length),ee=p(()=>Object.keys(W.value)),ae=p(()=>Z.value?W.value[Z.value]:null),se=p(()=>{const e=X.value;return{builtin:e.filter(e=>e.isBuiltin).length,custom:e.filter(e=>!e.isBuiltin).length}}),te=p(()=>J.value.map(e=>({label:`从 ${e.promptLabel||e.label||e.title||e.key} 导入`,key:e.key})));function le(e){if(!e)return"";let a=e.split("\n").slice(0,4).join("\n");return e.split("\n").length>4&&(a+="\n..."),a.substring(0,200)}async function ie(){S.value=!0;try{const e=await async function(){return(await k.get("/prompts/presets")).data}();e.success&&(W.value=e.presets,Z.value=e.activePresetId)}catch(e){L.error("加载预设失败")}finally{S.value=!1}}async function ne(e){R.value=e.id;try{(await async function(e){return(await k.post(`/prompts/presets/${e}/activate`)).data}(e.id)).success&&(Z.value=e.id,L.success(`已激活预设 "${e.name}"`))}catch(a){L.error("激活失败: "+a.message)}finally{R.value=null}}async function Ie(){F.warning({title:"移除提示词",content:"确定要移除当前激活的提示词吗?这将删除各平台的提示词文件。",positiveText:"移除",negativeText:"取消",onPositiveClick:async()=>{G.value=!0;try{(await async function(){return(await k.post("/prompts/deactivate")).data}()).success&&(Z.value=null,L.success("已移除提示词"))}catch(e){L.error("移除失败: "+e.message)}finally{G.value=!1}}})}function De(e){F.warning({title:"删除确认",content:`确定要删除预设 "${e.name}" 吗?此操作不可恢复。`,positiveText:"删除",negativeText:"取消",onPositiveClick:async()=>{try{(await async function(e){return(await k.delete(`/prompts/presets/${e}`)).data}(e.id)).success&&(delete W.value[e.id],L.success("删除成功"))}catch(a){L.error("删除失败: "+a.message)}}})}async function Ue(e){try{const a=await async function(e,a){return(await k.post(`/prompts/import/${e}`,{name:a})).data}(e);a.success&&(W.value[a.preset.id]=a.preset,L.success(a.message))}catch(a){L.error("导入失败: "+a.message)}}function $e(){Q.value=null,K.value=!0}function Oe(){ie()}return u(()=>P.visible,e=>{e&&ie()},{immediate:!0}),(s,u)=>(c(),b(m,null,[n(y($),{show:T.value,"onUpdate:show":u[0]||(u[0]=e=>T.value=e),width:y(_),placement:"right","show-mask":!0},{default:v(()=>[n(y(q),{title:"Prompts 管理",closable:"","native-scrollbar":!1},{header:v(()=>[h("div",ce,[h("div",ue,[n(y(e),{size:20,class:"header-icon"},{default:v(()=>[n(y(D))]),_:1}),u[2]||(u[2]=h("span",null,"Prompts 管理",-1))])])]),default:v(()=>[h("div",oe,[h("div",de,[h("div",pe,[ae.value?(c(),b(m,{key:0},[n(y(e),{class:"status-icon active",size:18},{default:v(()=>[n(y(U))]),_:1}),h("div",ve,[u[3]||(u[3]=h("span",{class:"status-label"},"当前激活:",-1)),h("span",me,o(ae.value.name),1)])],64)):(c(),b(m,{key:1},[n(y(e),{class:"status-icon inactive",size:18},{default:v(()=>[n(y(w))]),_:1}),u[4]||(u[4]=h("div",{class:"status-text"},[h("span",{class:"status-label"},"未激活任何提示词")],-1))],64))]),h("div",fe,[n(y(N),{trigger:"click",options:te.value,onSelect:Ue},{default:v(()=>[n(y(a),{size:"small",tertiary:"",class:"action-btn"},{icon:v(()=>[n(y(e),{size:14},{default:v(()=>[n(y(C))]),_:1})]),default:v(()=>[u[5]||(u[5]=l(" 导入 ",-1))]),_:1})]),_:1},8,["options"]),n(y(a),{size:"small",tertiary:"",type:"primary",class:"action-btn",onClick:$e},{icon:v(()=>[n(y(e),{size:14},{default:v(()=>[n(y(z))]),_:1})]),default:v(()=>[u[6]||(u[6]=l(" 新建 ",-1))]),_:1}),ae.value?(c(),r(y(A),{key:0,trigger:"hover"},{trigger:v(()=>[n(y(a),{size:"small",quaternary:"",class:"action-btn remove-btn",onClick:Ie,loading:G.value},{icon:v(()=>[n(y(e),{size:16},{default:v(()=>[n(y(B))]),_:1})]),default:v(()=>[u[7]||(u[7]=l(" 移除 ",-1))]),_:1},8,["loading"])]),default:v(()=>[u[8]||(u[8]=l(" 删除各平台的提示词文件 ",-1))]),_:1})):t("",!0)])]),h("div",ye,[h("span",ge,[l(" 共 "+o(Y.value)+" 个预设 ",1),Y.value>0?(c(),b(m,{key:0},[l(" · 自定义: "+o(se.value.custom)+" · 内置模板: "+o(se.value.builtin),1)],64)):t("",!0)])]),h("div",be,[n(y(E),{show:S.value},{default:v(()=>[0!==X.value.length||S.value?(c(),b("div",ke,[(c(!0),b(m,null,i(X.value,s=>(c(),b("div",{key:s.id,class:f(["preset-card",{active:s.id===Z.value}])},[h("div",_e,[h("div",we,[s.id===Z.value?(c(),r(y(e),{key:0,class:"active-icon",size:16},{default:v(()=>[n(y(U))]),_:1})):t("",!0),h("span",ze,o(s.name),1),s.isBuiltin?(c(),r(y(V),{key:1,size:"tiny",bordered:!1,type:"info"},{default:v(()=>[...u[11]||(u[11]=[l("模板",-1)])]),_:1})):t("",!0),s.isImported?(c(),r(y(V),{key:2,size:"tiny",bordered:!1,type:"warning"},{default:v(()=>[...u[12]||(u[12]=[l("已导入",-1)])]),_:1})):t("",!0)]),h("div",Pe,[s.id!==Z.value?(c(),r(y(a),{key:0,size:"tiny",type:"primary",onClick:e=>ne(s),loading:R.value===s.id},{default:v(()=>[...u[13]||(u[13]=[l(" 激活 ",-1)])]),_:1},8,["onClick","loading"])):t("",!0),n(y(a),{quaternary:"",size:"tiny",onClick:e=>function(e){Q.value=e,K.value=!0}(s)},{icon:v(()=>[n(y(e),null,{default:v(()=>[n(y(x))]),_:1})]),_:1},8,["onClick"]),s.isBuiltin?t("",!0):(c(),r(y(a),{key:1,quaternary:"",size:"tiny",onClick:e=>De(s)},{icon:v(()=>[n(y(e),null,{default:v(()=>[n(y(I))]),_:1})]),_:1},8,["onClick"]))])]),s.description?(c(),b("p",Ce,o(s.description),1)):t("",!0),h("div",xe,[u[14]||(u[14]=h("span",{class:"apps-label"},"生效范围:",-1)),(c(!0),b(m,null,i(J.value,e=>(c(),r(y(V),{key:e.key,type:s.apps?.[e.key]?"success":"default",size:"tiny",bordered:!1},{default:v(()=>[l(o(e.promptLabel||e.label||e.title||e.key),1)]),_:2},1032,["type"]))),128))]),h("div",je,[h("pre",Be,o(le(s.content)),1)])],2))),128))])):(c(),b("div",he,[n(y(e),{size:48,class:"empty-icon"},{default:v(()=>[n(y(D))]),_:1}),u[9]||(u[9]=h("p",{class:"empty-title"},"暂无预设",-1)),u[10]||(u[10]=h("p",{class:"empty-desc"},'点击上方"新建"按钮创建系统提示词预设',-1))]))]),_:1},8,["show"])])])]),_:1})]),_:1},8,["show","width"]),n(re,{visible:K.value,"onUpdate:visible":u[1]||(u[1]=e=>K.value=e),"editing-preset":Q.value,"existing-ids":ee.value,platforms:J.value,onSaved:Oe},null,8,["visible","editing-preset","existing-ids","platforms"])],64))}},[["__scopeId","data-v-61810a34"]]);export{Ie as default};
|