coding-tool-x 3.9.0 → 3.9.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/README.md +2 -0
  2. package/dist/web/assets/AgentsDrawer-Dubq1kQI.css +1 -0
  3. package/dist/web/assets/AgentsDrawer-x29vGIIi.js +1 -0
  4. package/dist/web/assets/{Analytics-BXRwqC-P.js → Analytics-BJbR6XJO.js} +1 -1
  5. package/dist/web/assets/{AssetPathField-B-LHvOxq.js → AssetPathField-2W-16zgR.js} +1 -1
  6. package/dist/web/assets/{ChatHistoryDrawer-CoHlGAxb.js → ChatHistoryDrawer-C1URzQ_4.js} +1 -1
  7. package/dist/web/assets/{CollapseItem-kJkiHxFl.js → CollapseItem-DjkOkbwE.js} +1 -1
  8. package/dist/web/assets/{CommandsDrawer-DLQrikcw.js → CommandsDrawer-DcnfrHC4.js} +1 -1
  9. package/dist/web/assets/{ConfigExportDrawer-BItwo0FQ.js → ConfigExportDrawer-CKwG_RGJ.js} +1 -1
  10. package/dist/web/assets/{ConfigTemplates-R3YzzBT3.js → ConfigTemplates-C1tNpfzi.js} +1 -1
  11. package/dist/web/assets/{ConfigTemplatesDrawer-C_nPKrhx.js → ConfigTemplatesDrawer-gZNPbcUR.js} +1 -1
  12. package/dist/web/assets/{ConfigTemplatesPanel-BiwrNyYN.js → ConfigTemplatesPanel-C-Fy53Qo.js} +1 -1
  13. package/dist/web/assets/{FavoritesDrawer-BAJ-AOpN.js → FavoritesDrawer-Bp8FYHPk.js} +1 -1
  14. package/dist/web/assets/GatewayConvertDrawer-CvUkvNQy.css +1 -0
  15. package/dist/web/assets/GatewayConvertDrawer-j5IJzb2Y.js +1 -0
  16. package/dist/web/assets/Home-2MAvBnml.js +1 -0
  17. package/dist/web/assets/Home-BRNWE0Qy.css +1 -0
  18. package/dist/web/assets/{MarkdownEditor-D75GGt5X.js → MarkdownEditor-BA_PcLed.js} +1 -1
  19. package/dist/web/assets/{McpDrawer-xNzJtT4X.js → McpDrawer-DAep5PP_.js} +1 -1
  20. package/dist/web/assets/{McpFormDrawer-B240mJ5y.js → McpFormDrawer-BRm-hzv1.js} +1 -1
  21. package/dist/web/assets/{PluginManager-CgLjBdlr.js → PluginManager-C2yY8-FP.js} +1 -1
  22. package/dist/web/assets/{PluginsDrawer-DvJdwMXx.js → PluginsDrawer-CxKnWzTO.js} +1 -1
  23. package/dist/web/assets/{PluginsPanel-CzGMK-Ap.css → PluginsPanel-DsmiW9TU.css} +1 -1
  24. package/dist/web/assets/PluginsPanel-DtbXSoXu.js +1 -0
  25. package/dist/web/assets/{ProjectList-CRtc3Hhx.js → ProjectList-Cb25pa2s.js} +1 -1
  26. package/dist/web/assets/{PromptsDrawer-CvT9dA2N.js → PromptsDrawer-D39OJVRP.js} +1 -1
  27. package/dist/web/assets/{RecentSessionsDrawer-DM1gf584.js → RecentSessionsDrawer-DkCjc4kS.js} +1 -1
  28. package/dist/web/assets/{SessionCard-cZR2V4Br.js → SessionCard-5Mwig8zy.js} +1 -1
  29. package/dist/web/assets/{SessionList-D7-P4Zme.js → SessionList-DVkIlraF.js} +1 -1
  30. package/dist/web/assets/{SettingsDrawer-gW8kh-S8.js → SettingsDrawer-Cr9qZDgO.js} +1 -1
  31. package/dist/web/assets/{SkillManager-D0BlI7CG.js → SkillManager-D935sPSV.js} +1 -1
  32. package/dist/web/assets/{SkillsDrawer-BMB6uzqP.js → SkillsDrawer-D1_3j74b.js} +1 -1
  33. package/dist/web/assets/{SkillsPanel-BzR828De.js → SkillsPanel-6SehnNG8.js} +1 -1
  34. package/dist/web/assets/{Upload-3fNyOQrx.js → Upload-38eKB6wv.js} +1 -1
  35. package/dist/web/assets/{WorkspaceDrawer-DvtBA58Q.js → WorkspaceDrawer-Bkfmlr5M.js} +1 -1
  36. package/dist/web/assets/{WorkspaceManager-BW5KtsHO.js → WorkspaceManager-DFVQ5YoE.js} +1 -1
  37. package/dist/web/assets/{WorkspacePanel-BC_xpAEZ.js → WorkspacePanel-CEnogXEv.js} +1 -1
  38. package/dist/web/assets/client-oU6RT-6I.js +1 -0
  39. package/dist/web/assets/dsh-agent-presets-DjJRVMT6.js +1 -0
  40. package/dist/web/assets/index-CCATqHAD.js +2 -0
  41. package/dist/web/assets/index-p-yggtLj.css +1 -0
  42. package/dist/web/assets/{platforms-DrzAtnjY.js → platforms-DILqyP72.js} +1 -1
  43. package/dist/web/assets/platforms-JV36QBCw.js +1 -0
  44. package/dist/web/assets/{project-config-BVt5s-pH.js → project-config-CzFKBw_m.js} +1 -1
  45. package/dist/web/assets/{sessions-CaWUaysM.js → sessions-WXODMvLY.js} +1 -1
  46. package/dist/web/assets/{sessions-53-Fr68H.js → sessions-wvj5oaYr.js} +1 -1
  47. package/dist/web/assets/{useResponsiveDrawer-Ckgj760z.js → useResponsiveDrawer-BWRBXImg.js} +1 -1
  48. package/dist/web/assets/{workspaces-DQuZd4qw.js → workspaces-D2yLnT-B.js} +1 -1
  49. package/dist/web/index.html +5 -5
  50. package/package.json +4 -4
  51. package/src/platforms/agents-service.js +50 -12
  52. package/src/platforms/drivers/dsh/api-operations.js +60 -2
  53. package/src/platforms/drivers/dsh/common.js +222 -11
  54. package/src/platforms/drivers/dsh/native-config.js +2 -2
  55. package/src/platforms/drivers/dsh/native-logs.js +16 -1
  56. package/src/platforms/drivers/dsh/plugin-manager.js +64 -6
  57. package/src/platforms/drivers/omp/channels-implementation.js +1 -1
  58. package/src/platforms/drivers/omp/gateway.js +28 -2
  59. package/src/platforms/drivers/omp/model-role-settings.js +235 -0
  60. package/src/platforms/drivers/opencode/conversion.js +60 -8
  61. package/src/platforms/manifest-schema.js +4 -0
  62. package/src/platforms/manifests/dsh.json +29 -4
  63. package/src/platforms/manifests/omp.json +5 -4
  64. package/src/platforms/registry.js +1 -0
  65. package/src/server/api/convert.js +26 -76
  66. package/src/server/api/platforms.js +1 -0
  67. package/src/server/api/settings.js +27 -0
  68. package/src/server/services/model-definition-schema.js +2 -2
  69. package/src/server/services/model-detector.js +13 -22
  70. package/src/server/services/native-log-observer.js +1 -0
  71. package/src/server/services/plugins-service.js +13 -14
  72. package/src/server/services/request-logger.js +95 -0
  73. package/src/server/services/usage-log-utils.js +2 -1
  74. package/dist/web/assets/AgentsDrawer-DooV5Qhx.js +0 -1
  75. package/dist/web/assets/AgentsDrawer-Pw2k-ZAa.css +0 -1
  76. package/dist/web/assets/GatewayConvertDrawer-Av3yzwhP.js +0 -1
  77. package/dist/web/assets/GatewayConvertDrawer-CuNlf7AC.css +0 -1
  78. package/dist/web/assets/Home-B01aL_SR.js +0 -1
  79. package/dist/web/assets/Home-CSuFuJ9Y.css +0 -1
  80. package/dist/web/assets/PluginsPanel-kX14E_DT.js +0 -1
  81. package/dist/web/assets/client-BgcNg4Bt.js +0 -1
  82. package/dist/web/assets/index-BFqnddoI.js +0 -2
  83. package/dist/web/assets/index-Bn8BUnwP.css +0 -1
  84. package/dist/web/assets/platforms-mqqe_82d.js +0 -1
@@ -1 +0,0 @@
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 f,m as g,mt as y,p as h,r as k,st as b,w,x as P}from"./vue-vendor-BqZbbXHA.js";import{t as _}from"./client-BgcNg4Bt.js";import{r as j,s as U,t as $}from"./platforms-mqqe_82d.js";import{$ as C,At as T,F as I,Nt as L,O as z,R as S,S as x,U as O,Y as B,a as H,g as G,ut as A}from"./icons-B-AzZoeE.js";import{t as R}from"./use-message-DBsCm7FJ.js";import{l as M}from"./light-C2X7hegj.js";import{c as D,n as N,s as K,t as q}from"./AssetPathField-B-LHvOxq.js";import{n as E,t as V}from"./useResponsiveDrawer-Ckgj760z.js";import{t as F}from"./DrawerContent-ChXgZ1Xm.js";import{$ as Q,Et as W,M as Y,T as Z,ct as J,ft as X,j as ee,k as ae,st as le,ut as te,w as se}from"./index-BFqnddoI.js";import{t as ne}from"./markdown-u082bbtj.js";import{n as ie,t as re}from"./skill-repo-input-B_fkGlUK.js";var oe=new Map;function ue(e,a,l={}){return se(e,a,l.scope||"",l.cwd||"")}function ce(e=""){for(const a of oe.keys())e&&!a.includes(`:${e}:`)||oe.delete(a)}function pe(e={},a={}){return{...e,...a.cwd?{cwd:a.cwd}:{},...a.scope?{scope:a.scope}:{}}}async function de(e="claude",a={}){const l=ue("plugins",e,a);if(oe.has(l))return oe.get(l);const t=Z(l,t=>_.get("/plugins",{params:pe({platform:e},a),signal:t}).then(e=>e.data).catch(e=>{throw oe.delete(l),e}),"plugins",`plugins:${e}`);return oe.set(l,t),t}async function ve(e="claude",a=!1,l={}){const t=ue("plugins-market",e,l);if(oe.has(t))return oe.get(t);const s=Z(t,a=>_.get("/plugins/market",{params:pe({platform:e},l),signal:a}).then(e=>e.data).catch(e=>{throw oe.delete(t),e}),"plugins-market",`plugins-market:${e}`);return oe.set(t,s),s}async function me(e="claude",a={}){return ce(e),(await _.post("/plugins/refresh",pe({platform:e},a))).data}async function fe(e,a={}){return(await _.get(`/plugins/refresh/${encodeURIComponent(e)}`,{params:pe({platform:a.platform||"claude"},a)})).data}function ge(e=""){ce(e)}async function ye(e,a,l="claude",t="",s={},n={}){const i=pe({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 he(e,a="claude",l={}){return(await _.post("/plugins/repos",pe({...e,platform:a},l))).data}async function ke(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}var be={class:"asset-card-main"},we={class:"asset-card-top"},Pe={class:"asset-card-title-stack"},_e={class:"asset-card-title-row"},je={class:"asset-name"},Ue={class:"asset-tags"},$e={key:0,class:"asset-description"},Ce={class:"asset-meta"},Te={class:"asset-meta-item mono"},Ie=["href"],Le={__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:f(["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",be,[P("div",we,[P("div",Pe,[P("div",_e,[P("span",{class:f(["asset-status-dot",{active:e.plugin.installed}])},null,2),P("span",je,p(e.plugin.name),1)]),P("div",Ue,[e.plugin.installed?(u(),r(y(te),{key:0,type:"success",size:"tiny",bordered:!1},{default:v(()=>[...i[5]||(i[5]=[s("已安装",-1)])]),_:1})):t("",!0),e.readonly?(u(),r(y(te),{key:1,type:"default",size:"tiny",bordered:!1},{default:v(()=>[...i[6]||(i[6]=[s("只读",-1)])]),_:1})):t("",!0),e.plugin.scope?(u(),r(y(te),{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(y(te),{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(y(te),{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(y(te),{key:5,type:"info",size:"tiny",bordered:!1},{default:v(()=>[...i[9]||(i[9]=[s("GitLab",-1)])]),_:1})):"local"===e.plugin.repoProvider?(u(),r(y(te),{key:6,type:"info",size:"tiny",bordered:!1},{default:v(()=>[...i[10]||(i[10]=[s("本地",-1)])]),_:1})):e.plugin.repoOwner?(u(),r(y(te),{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",$e,p((c=e.plugin.description,d=120,c?.length>d?c.slice(0,d)+"...":c)),1)):t("",!0),P("div",Ce,[P("span",Te,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]=g(()=>{},["stop"]))},p((o=e.plugin,"gitlab"===o?.repoProvider?"GitLab":"local"===o?.repoProvider?"本地":"GitHub")),9,Ie)):t("",!0)])]),e.readonly?t("",!0):(u(),w("div",{key:0,class:"asset-card-actions",onClick:i[3]||(i[3]=g(()=>{},["stop"]))},[e.plugin.installed&&e.canUninstall?(u(),r(y(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(y(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}}},ze={class:"repo-manager"},Se={class:"repo-list"},xe={class:"repo-main"},Oe={class:"repo-info"},Be={class:"repo-name-row"},He={class:"repo-name"},Ge={class:"repo-branch"},Ae={key:0,class:"repo-auth-hint"},Re={class:"repo-actions"},Me={key:0,class:"empty-hint"},De={class:"add-repo"},Ne={class:"add-title"},Ke={class:"add-form"},qe={class:"add-hint"},Ee={class:"tips"},Ve={key:0,class:"recommended"},Fe={class:"recommended-list"},Qe=["onClick"],We={class:"rec-info"},Ye={class:"rec-name"},Ze={class:"rec-desc"},Je={key:0,class:"auth-manager"},Xe={class:"auth-meta"},ea={class:"auth-meta-row"},aa={class:"auth-value"},la={class:"auth-meta-row"},ta={class:"auth-value"},sa={class:"auth-meta-row"},na={class:"auth-value"},ia={class:"auth-actions"},ra=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:g}){const k=l,j=g,U=d({get:()=>k.visible,set:e=>j("update:visible",e)}),$=b([]),C=b(!1),T=b(!1),I=b(!1),z=b(!1),S=b(null),x=b(!1),O=b(!1),B=b({token:""}),G=b({input:"",branch:"main"}),A=d(()=>"native-marketplace"===k.capabilities.repositoryMode),R=d(()=>({...k.projectPath?{cwd:k.projectPath}:{}})),D=d(()=>S.value?("gitlab"===S.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(()=>A.value?Boolean(G.value.input.trim()):!!ie(G.value.input.trim()));function q(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 E(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 Q(e){return F(e)?e.hasToken?`仓库 Token: ${e.tokenPreview||"已配置"}`:"gitlab"===e.provider?"未配置仓库 Token,将回退到全局 Token、glab 或 git credential":"未配置仓库 Token,可选配置后优先用于 GitHub API 访问":""}function W(){z.value=!1,S.value=null,B.value.token="",x.value=!1,O.value=!1}async function Z(){C.value=!0;try{const e=await async function(e="claude",a={}){return(await _.get("/plugins/repos",{params:pe({platform:e},a)})).data}(k.platform,R.value);e.success&&($.value=e.repos||[])}catch(e){ae.error("加载仓库失败: "+e.message)}finally{C.value=!1}}async function X(){I.value=!0;try{let e=(await me(k.platform,R.value)).task;for(;e&&["queued","running"].includes(e.status);)await new Promise(e=>setTimeout(e,250)),e=(await fe(e.id,{platform:k.platform,...R.value})).task;"failed"===e?.status?ae.error(e.error||"刷新失败,已保留旧缓存"):(await Z(),ae.success("仓库缓存刷新成功"),j("updated"))}catch(e){ae.error("刷新失败: "+e.message)}finally{I.value=!1}}async function se(){if(!K.value)return;const e=A.value?{source:G.value.input.trim()}:ie(G.value.input.trim());T.value=!0;try{const a=await he({...e,branch:G.value.branch||"main",enabled:!0},k.platform,R.value);a.success&&($.value=a.repos,G.value.input="",G.value.branch="main",ae.success("仓库添加成功"),j("updated"))}catch(a){ae.error("添加失败: "+a.message)}finally{T.value=!1}}async function ne(e){try{const a=await async function(e,a="claude",l={}){return(await _.delete("/plugins/repos",{params:pe({platform:a,id:e.id||"",owner:e.owner||"",name:e.name||""},l)})).data}(e,k.platform,R.value);a.success&&($.value=a.repos,ae.success("仓库已删除"),j("updated"))}catch(a){ae.error("删除失败: "+a.message)}}async function oe(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&&($.value=l.repos,j("updated"))}catch(l){ae.error("操作失败: "+l.message)}}async function ue(){const e=S.value,a=B.value.token.trim();if(e&&a){x.value=!0;try{const l=await ke(e,{token:a},k.platform);l.success&&($.value=l.repos||[],ae.success("仓库 Token 已保存"),j("updated"),W())}catch(l){ae.error("保存 Token 失败: "+l.message)}finally{x.value=!1}}}async function ce(){const e=S.value;if(e){O.value=!0;try{const a=await ke(e,{clearToken:!0},k.platform);a.success&&($.value=a.repos||[],ae.success("仓库 Token 已清除"),j("updated"),W())}catch(a){ae.error("清除 Token 失败: "+a.message)}finally{O.value=!1}}}function de(e){const a=q(e);return $.value.some(e=>q(e)===a)}function ve(){W(),j("update:visible",!1)}return c(()=>k.visible,e=>{e&&Z()}),c(()=>k.platform,()=>{k.visible&&Z()}),o(()=>{k.visible&&Z()}),(o,c)=>(u(),w(m,null,[i(y(M),{show:U.value,"onUpdate:show":c[2]||(c[2]=e=>U.value=e),preset:"card",title:A.value?"OMP Marketplace 管理":"插件仓库管理",bordered:!1,closable:!0,style:{width:"480px","max-width":"90vw"},onClose:ve},{"header-extra":v(()=>[i(y(a),{type:"primary",size:"small",loading:I.value,focusable:!1,onClick:X},{icon:v(()=>[i(y(e),null,{default:v(()=>[i(y(H))]),_:1})]),default:v(()=>[c[5]||(c[5]=s(" 刷新 ",-1))]),_:1},8,["loading"])]),default:v(()=>[P("div",ze,[P("div",Se,[i(y(Y),{show:C.value},{default:v(()=>[(u(!0),w(m,null,n($.value,e=>(u(),w("div",{key:e.id||`${e.owner}/${e.name}/${e.localPath||""}`,class:"repo-item"},[P("div",xe,[!1!==l.capabilities.repositoryToggle?(u(),r(y(ee),{key:0,value:e.enabled,size:"small","onUpdate:value":a=>oe(e,a)},null,8,["value","onUpdate:value"])):t("",!0),P("div",Oe,[P("div",Be,[P("div",He,p(E(e)),1),!1!==l.capabilities.repositoryAuth&&F(e)?(u(),r(y(te),{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",Ge,p(V(e)),1),!1!==l.capabilities.repositoryAuth&&F(e)?(u(),w("div",Ae,p(Q(e)),1)):t("",!0)])]),P("div",Re,[!1!==l.capabilities.repositoryAuth&&F(e)?(u(),r(y(a),{key:0,text:"",type:"primary",size:"tiny",focusable:!1,onClick:a=>function(e){F(e)&&(S.value=e,B.value.token="",z.value=!0)}(e)},{default:v(()=>[...c[6]||(c[6]=[s(" 认证 ",-1)])]),_:1},8,["onClick"])):t("",!0),i(y(a),{text:"",type:"error",size:"tiny",focusable:!1,onClick:a=>ne(e)},{default:v(()=>[...c[7]||(c[7]=[s(" 删除 ",-1)])]),_:1},8,["onClick"])])]))),128)),0===$.value.length?(u(),w("div",Me," 暂无仓库,请添加 ")):t("",!0)]),_:1},8,["show"])]),P("div",De,[P("div",Ne,p(A.value?"添加 Marketplace source":"添加仓库"),1),P("div",Ke,[i(y(le),{value:G.value.input,"onUpdate:value":c[0]||(c[0]=e=>G.value.input=e),placeholder:A.value?"Marketplace source(owner/repo、URL 或本地路径)":"GitHub/GitLab 仓库地址,或本地路径",size:"small",class:"repo-input",onKeyup:h(se,["enter"])},null,8,["value","placeholder"]),A.value?t("",!0):(u(),r(y(le),{key:0,value:G.value.branch,"onUpdate:value":c[1]||(c[1]=e=>G.value.branch=e),placeholder:"分支",size:"small",class:"branch-input"},null,8,["value"])),i(y(a),{type:"primary",size:"small",disabled:!K.value,loading:T.value,focusable:!1,onClick:se},{default:v(()=>[...c[8]||(c[8]=[s(" 添加 ",-1)])]),_:1},8,["disabled","loading"])]),P("div",qe,p(A.value?"source 将原样传递给 omp plugin marketplace add":"支持 `owner/repo`、GitHub/GitLab URL 或 SSH、以及本地路径"),1)]),P("div",Ee,[i(y(J),{type:"info",bordered:!1,size:"small"},{default:v(()=>[s(p(A.value?"OMP Marketplace 由原生 CLI 管理;不支持单独启停、branch 或仓库 Token。":"支持 GitHub、GitLab 和本地仓库路径;远程仓库可按仓库单独配置 Token。"),1)]),_:1})]),N.value.length>0?(u(),w("div",Ve,[c[10]||(c[10]=P("div",{class:"recommended-title"},"推荐仓库",-1)),P("div",Fe,[(u(!0),w(m,null,n(N.value,a=>(u(),w("div",{key:a.url||`${a.owner}/${a.name}`,class:f(["recommended-item",{added:de(a)}]),onClick:e=>!de(a)&&async function(e){T.value=!0;try{const a=await he({owner:e.owner,name:e.name,url:e.url,branch:e.branch,enabled:!0},k.platform);a.success&&($.value=a.repos,ae.success("仓库添加成功"),j("updated"))}catch(a){ae.error("添加失败: "+a.message)}finally{T.value=!1}}(a)},[P("div",We,[P("span",Ye,p(a.owner)+"/"+p(a.name),1),P("span",Ze,p(a.description),1)]),de(a)?(u(),r(y(te),{key:0,size:"tiny",type:"success",bordered:!1},{default:v(()=>[...c[9]||(c[9]=[s(" 已添加 ",-1)])]),_:1})):(u(),r(y(e),{key:1,class:"add-icon"},{default:v(()=>[i(y(L))]),_:1}))],10,Qe))),128))])])):t("",!0)])]),_:1},8,["show","title"]),i(y(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:W},{default:v(()=>[S.value?(u(),w("div",Je,[i(y(J),{type:"info",bordered:!1,size:"small"},{default:v(()=>{return[s(p((e=S.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",Xe,[P("div",ea,[c[11]||(c[11]=P("span",{class:"auth-label"},"仓库",-1)),P("span",aa,p(E(S.value)),1)]),P("div",la,[c[12]||(c[12]=P("span",{class:"auth-label"},"来源",-1)),P("span",ta,p("gitlab"===S.value.provider?"GitLab":"GitHub"),1)]),P("div",sa,[c[13]||(c[13]=P("span",{class:"auth-label"},"当前状态",-1)),P("span",na,p(S.value.hasToken?`已配置 ${S.value.tokenPreview||""}`:"未配置仓库 Token"),1)])]),i(y(le),{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(ue,["enter"])},null,8,["value"]),c[17]||(c[17]=P("div",{class:"auth-footnote"}," 仓库 Token 会优先于全局环境变量、CLI 登录和系统 Git 凭据。 ",-1)),P("div",ia,[i(y(a),{focusable:!1,onClick:W},{default:v(()=>[...c[14]||(c[14]=[s(" 取消 ",-1)])]),_:1}),S.value.hasToken?(u(),r(y(a),{key:0,type:"warning",secondary:"",focusable:!1,loading:O.value,onClick:ce},{default:v(()=>[...c[15]||(c[15]=[s(" 清除 Token ",-1)])]),_:1},8,["loading"])):t("",!0),i(y(a),{type:"primary",focusable:!1,disabled:!B.value.token.trim(),loading:x.value,onClick:ue},{default:v(()=>[...c[16]||(c[16]=[s(" 保存 Token ",-1)])]),_:1},8,["disabled","loading"])])])):t("",!0)]),_:1},8,["show","title"])],64))}},[["__scopeId","data-v-2321d587"]]),oa={class:"asset-detail-drawer-header"},ua={class:"asset-detail-identity"},ca={class:"asset-detail-heading"},pa={class:"asset-detail-name"},da={class:"asset-detail-meta"},va={key:2,class:"asset-detail-subtle"},ma={class:"asset-detail-body"},fa={class:"asset-detail-container"},ga={class:"asset-detail-info-section"},ya={class:"asset-detail-description"},ha={key:0,class:"asset-detail-info-section"},ka={class:"asset-detail-list"},ba={class:"asset-detail-value mono"},wa={key:1,class:"asset-detail-info-section"},Pa={class:"asset-detail-box"},_a=["href"],ja={key:1},Ua={class:"asset-detail-container"},$a={key:0,class:"asset-detail-loading"},Ca=["innerHTML"],Ta={key:2,class:"asset-detail-empty"},Ia={__name:"PluginDetailDrawer",props:{visible:{type:Boolean,default:!1},plugin:{type:Object,default:null},platform:{type:String,default:"claude"},projectPath:{type:String,default:""}},emits:["update:visible"],setup(a,{emit:l}){ne.setOptions({breaks:!0,gfm:!0});const{drawerWidth:o}=V(600),f=a,g=l,h=d({get:()=>f.visible,set:e=>g("update:visible",e)}),k=b(""),j=b(!1),U=b(0),$=b("overview"),T=b(""),L=d(()=>/^(https?:)?\/\//.test(f.plugin?.repoUrl||f.plugin?.gitUrl||"")),S=d(()=>f.plugin?.installPath||f.plugin?.fullPath||f.plugin?.path||f.plugin?.directory||""),x=d(()=>Array.isArray(f.plugin?.skillPaths)?f.plugin.skillPaths:[]),O={height:"100%",minHeight:0,overflow:"hidden"};async function H(){const e=f.plugin,a=f.platform;if(!f.visible||!e)return;const l=function(e,a){return e?[a,e.pluginId||e.id||e.name||"",e.repoId||"",e.directory||""].join(":"):""}(e,a);if(T.value===l)return;const t=++U.value;j.value=!0;try{const s={repoId:e.repoId,repoProvider:e.repoProvider,repoHost:e.repoHost,repoOwner:e.repoOwner,repoName:e.repoName,repoBranch:e.repoBranch,directory:e.directory,source:e.source,repoUrl:e.repoUrl,repoProjectPath:e.repoProjectPath,repoLocalPath:e.repoLocalPath,installPath:e.installPath},n=await function(e,a={},l="claude",t={}){const s=a.scope||t.scope||"",n=a.repoLocalPath||a.repoProjectPath||a.repoUrl||a.directory||e,i=se(`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),t.scope&&r.append("scope",t.scope),t.cwd&&r.append("cwd",t.cwd),Z(i,a=>_.get(`/plugins/${encodeURIComponent(e)}/readme?${r.toString()}`,{signal:a}).then(e=>e.data),`plugin-readme:${e}`,`plugin-readme:${l}`)}(e.name,s,a,{scope:f.projectPath?"project":"user",...f.projectPath?{cwd:f.projectPath}:{}});if(t!==U.value)return;k.value=n.readme||"",T.value=l}catch(s){if(t!==U.value)return;k.value="",T.value=l}finally{t===U.value&&(j.value=!1)}}c(()=>[f.visible,f.plugin,f.platform],([e])=>{U.value+=1,$.value="overview",T.value="",j.value=!1,k.value=""}),c($,e=>{"readme"===e&&H()});const G=d(()=>k.value?ne(k.value):"");return(l,c)=>(u(),r(y(E),{show:h.value,"onUpdate:show":c[1]||(c[1]=e=>h.value=e),width:y(o),placement:"right","show-mask":!0},{default:v(()=>[i(y(F),{closable:"","native-scrollbar":!1,"body-content-style":O},{header:v(()=>[P("div",oa,[P("div",ua,[i(y(e),{size:20,class:"asset-detail-icon"},{default:v(()=>[i(y(B))]),_:1}),P("div",ca,[P("span",pa,p(a.plugin?.name||"插件详情"),1),P("div",da,[a.plugin?.version?(u(),r(y(te),{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(y(te),{key:1,size:"tiny",bordered:!1,type:"warning"},{default:v(()=>[...c[2]||(c[2]=[s(" 技能包插件 ",-1)])]),_:1})):t("",!0),a.plugin?.author?(u(),w("span",va,[i(y(e),{size:12},{default:v(()=>[i(y(z))]),_:1}),s(" "+p(a.plugin.author),1)])):t("",!0)])])])])]),default:v(()=>[P("div",ma,[i(y(K),{value:$.value,"onUpdate:value":c[0]||(c[0]=e=>$.value=e),type:"line",animated:"",class:"asset-detail-tabs"},{default:v(()=>[i(y(D),{name:"overview",tab:"概览"},{default:v(()=>[P("div",fa,[P("div",ga,[c[3]||(c[3]=P("h3",{class:"asset-detail-section-title"},"描述",-1)),P("p",ya,p(a.plugin?.description||"暂无描述"),1)]),x.value.length>0?(u(),w("div",ha,[c[4]||(c[4]=P("h3",{class:"asset-detail-section-title"},"包含技能",-1)),P("div",ka,[(u(!0),w(m,null,n(x.value,e=>(u(),w("div",{key:e,class:"asset-detail-row"},[P("span",ba,p(e),1)]))),128))])])):t("",!0),a.plugin?.repoUrl||a.plugin?.gitUrl||a.plugin?.repoLocalPath?(u(),w("div",wa,[c[5]||(c[5]=P("h3",{class:"asset-detail-section-title"},"仓库地址",-1)),P("div",Pa,[i(y(e),{size:16},{default:v(()=>[i(y(I))]),_:1}),L.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,_a)):(u(),w("span",ja,p(a.plugin.repoLocalPath),1))])])):t("",!0),i(q,{path:S.value},null,8,["path"])])]),_:1}),i(y(D),{name:"readme",tab:"README"},{default:v(()=>[P("div",Ua,[j.value?(u(),w("div",$a,[i(y(Y),{size:"medium"}),c[6]||(c[6]=P("p",null,"加载 README 中...",-1))])):k.value?(u(),w("div",{key:1,class:"asset-detail-content",innerHTML:G.value},null,8,Ca)):(u(),w("div",Ta,[i(y(e),{size:44,class:"asset-detail-empty-icon"},{default:v(()=>[i(y(C))]),_:1}),c[7]||(c[7]=P("p",null,"暂无 README 文档",-1))]))])]),_:1})]),_:1},8,["value"])])]),_:1})]),_:1},8,["show","width"]))}},La={key:0,class:"asset-panel-header"},za={class:"asset-title-group"},Sa={class:"asset-heading"},xa={class:"asset-title-row"},Oa={class:"asset-platform-pill"},Ba={key:0,class:"asset-action-row"},Ha={key:1,class:"asset-drawer-toolbar"},Ga={key:0,class:"asset-action-row"},Aa={class:"asset-summary"},Ra={class:"asset-summary-item"},Ma={class:"asset-summary-value"},Da={class:"asset-summary-item"},Na={class:"asset-summary-value"},Ka={class:"asset-summary-item"},qa={class:"asset-summary-value"},Ea={class:"asset-filter-bar"},Va={class:"asset-panel-content"},Fa={key:0,class:"asset-empty"},Qa={key:1,class:"asset-list"},Wa={key:2,class:"asset-footer"},Ya=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 g=l,h=k(),C=$(),I=R(),L=b(!1),z=b([]),H=b(""),M=b("all"),D=b(!1),K=b(!1),q=b(null),E=b({}),V=b({}),F=b(!1),J=b(!1),ee=b(0),ae=b({supportsPlugins:!0,repositories:!0,market:!0,install:!0,uninstall:!0,import:!0,syncRepos:!0}),{byCapability:te}=W(),ne=d(()=>te("plugins").map(e=>e.key)),ie=d(()=>ne.value.includes(re.value));const re=d(()=>String(g.platform||(Array.isArray(h.query.platform)?h.query.platform[0]:h.query.platform)||j(h)||"").trim().toLowerCase()),oe=d(()=>{const e=C.get(re.value)||U(re.value);return e.label||e.title||"Claude Code"}),ue=[{label:"全部",value:"all"},{label:"已安装",value:"installed"},{label:"未安装",value:"uninstalled"}],ce=d(()=>z.value.filter(e=>e.installed).length);function he(e=null){return{...g.projectPath?{cwd:g.projectPath}:{},...e?.scope?{scope:e.scope}:{scope:g.projectPath?"project":"user"}}}const ke=d(()=>{let e=z.value;if("installed"===M.value?e=e.filter(e=>e.installed):"uninstalled"===M.value&&(e=e.filter(e=>!e.installed)),H.value.trim()){const a=H.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)}),be=d(()=>H.value?"没有匹配的插件":"installed"===M.value?"暂无已安装的插件":"uninstalled"===M.value?"所有插件都已安装":!1===ae.value.supportsPlugins?ae.value.disabledReason||`${oe.value} 暂未提供插件管理能力`:ae.value.repositories||ae.value.market||ae.value.install||ae.value.uninstall?"暂无可用插件,请配置仓库源":ae.value.disabledReason||`${oe.value} 当前没有可展示的插件`);async function we(e,a){try{const l=await async function(e="claude",a={}){const l=se("plugin-capabilities",e,a.scope||"",a.cwd||"");return Z(l,a=>_.get("/plugins/capabilities",{params:{platform:e},signal:a}).then(e=>e.data),"plugin-capabilities",`plugin-capabilities:${e}`)}(e);if(a!==ee.value||e!==re.value)return!1;if(l.success&&l.capabilities)return ae.value={supportsPlugins:!0,repositories:!1,market:!1,install:!1,uninstall:!1,import:!1,syncRepos:!1,...l.capabilities},!0}catch{if(a!==ee.value||e!==re.value)return!1}return a===ee.value&&e===re.value&&(ae.value={supportsPlugins:ne.value.includes(e),repositories:ne.value.includes(e),market:ne.value.includes(e),install:ne.value.includes(e),uninstall:ne.value.includes(e),import:"claude"===e,syncRepos:"claude"===e},!0)}async function Pe(){const e=++ee.value,a=re.value;if(!ie.value)return z.value=[],ae.value={supportsPlugins:!1,repositories:!1,market:!1,install:!1,uninstall:!1,import:!1,syncRepos:!1,disabledReason:`${oe.value} 暂未提供插件管理能力`},void(L.value=!1);L.value=!0;try{if(!(await we(a,e)))return;if(e!==ee.value||a!==re.value)return;if(!1===ae.value.supportsPlugins)return void(z.value=[]);const l=he(),[t,s]=await Promise.all([de(a,l),ae.value.market?ve(a,!1,l):Promise.resolve({success:!0,plugins:[]})]);if(e!==ee.value||a!==re.value)return;const n=t.success?t.plugins:[],i=s.success?s.plugins:[],r=(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}`}))]};z.value=r(n,i)}catch(l){e===ee.value&&a===re.value&&I.error("加载插件失败: "+l.message)}finally{e===ee.value&&(L.value=!1)}}async function _e(){if(J.value||!ie.value)return;const e=re.value;J.value=!0;try{const a=await async function(e,a){if(!e?.id)return e;let l=e;for(;l&&["queued","running"].includes(l.status);)await new Promise(e=>setTimeout(e,250)),l=(await fe(l.id,{platform:a,...he()})).task;return l}((await me(e,he())).task,e);"failed"===a?.status?I.error(a.error||"插件缓存刷新失败,已保留旧缓存"):"partial"===a?.status&&I.warning("插件缓存已部分更新,未成功的内容保留旧缓存"),await Pe()}catch(a){I.error("插件缓存刷新失败: "+a.message)}finally{J.value=!1}}async function je(){if(ie.value&&"claude"===re.value){F.value=!0;try{const e=await N("plugins");e.success?(I.success(`成功导入 ${e.imported} 个插件`),ge(re.value),await Pe()):I.error(e.message||"导入失败")}catch(e){I.error("导入失败: "+e.message)}finally{F.value=!1}}}function Ue(){ge(re.value),Pe()}async function $e(e){if(ie.value&&ae.value.install&&!e.readonly){if(!(e.installSource||e.repoOwner||e.repoProjectPath||e.repoLocalPath))return I.error("缺少可安装来源");E.value[e.key]=!0;try{const a=e.installSource?await ye("",null,re.value,e.pluginId||e.installSource,he(e),e):await ye(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},re.value,"",he(e),e);if(a.success){I.success(`插件 "${e.name}" 安装成功`),ge(re.value);const a=z.value.findIndex(a=>a.key===e.key);-1!==a&&(z.value[a]={...z.value[a],installed:!0,key:`installed-${e.pluginId||e.id||e.name}-${e.scope||he(e).scope}`})}else I.error(a.message||"安装失败")}catch(a){I.error("安装失败: "+a.message)}finally{delete E.value[e.key]}}}async function Ce(e){if(ie.value&&ae.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:pe({platform:a,pluginId:e},l)})).data}(e.pluginId||e.id||e.name,re.value,he(e));if(a.success){I.success(`插件 "${e.name}" 已卸载`),ge(re.value);const a=z.value.findIndex(a=>a.key===e.key);-1!==a&&(z.value[a]={...z.value[a],installed:!1,key:`market-${e.pluginId||e.id||e.name}`})}else I.error(a.message||a.error||"卸载失败")}catch(a){I.error("卸载失败: "+a.message)}finally{delete V.value[e.key]}}}function Te(e){q.value=e,K.value=!0}return o(()=>{g.inDrawer&&!g.drawerVisible||Pe()}),c(()=>g.drawerVisible,e=>{e&&Pe()}),c(()=>re.value,()=>{Pe()}),(o,c)=>(u(),w("div",{class:f(["plugins-panel asset-panel",{"in-drawer":l.inDrawer}])},[l.inDrawer?t("",!0):(u(),w("div",La,[P("div",za,[l.hideBack?t("",!0):(u(),r(y(a),{key:0,text:"",onClick:c[0]||(c[0]=e=>o.$emit("back")),class:"back-btn"},{icon:v(()=>[i(y(e),null,{default:v(()=>[i(y(T))]),_:1})]),_:1})),P("div",Sa,[P("div",xa,[c[8]||(c[8]=P("span",{class:"asset-title"},"插件管理",-1)),P("span",Oa,p(oe.value),1)]),c[9]||(c[9]=P("div",{class:"asset-subtitle"},"管理平台插件、仓库源和市场安装状态",-1))])]),ne.value.includes(re.value)?(u(),w("div",Ba,[ae.value.repositories?(u(),r(y(a),{key:0,text:"",focusable:!1,onClick:c[1]||(c[1]=e=>D.value=!0),class:"action-btn"},{icon:v(()=>[i(y(e),null,{default:v(()=>[i(y(O))]),_:1})]),default:v(()=>[c[10]||(c[10]=s(" 仓库 ",-1))]),_:1})):t("",!0),ae.value.import?(u(),r(y(a),{key:1,text:"",focusable:!1,onClick:je,loading:F.value,class:"action-btn"},{icon:v(()=>[i(y(e),null,{default:v(()=>[i(y(A))]),_:1})]),default:v(()=>[c[11]||(c[11]=s(" 导入 ",-1))]),_:1},8,["loading"])):t("",!0),i(y(a),{text:"",focusable:!1,onClick:_e,loading:J.value,class:"action-btn"},{icon:v(()=>[i(y(e),null,{default:v(()=>[i(y(x))]),_:1})]),default:v(()=>[c[12]||(c[12]=s(" 刷新 ",-1))]),_:1},8,["loading"])])):t("",!0)])),l.inDrawer?(u(),w("div",Ha,[ne.value.includes(re.value)?(u(),w("div",Ga,[ae.value.repositories?(u(),r(y(a),{key:0,text:"",focusable:!1,onClick:c[2]||(c[2]=e=>D.value=!0),class:"action-btn"},{icon:v(()=>[i(y(e),null,{default:v(()=>[i(y(O))]),_:1})]),default:v(()=>[c[13]||(c[13]=s(" 仓库 ",-1))]),_:1})):t("",!0),ae.value.import?(u(),r(y(a),{key:1,text:"",focusable:!1,onClick:je,loading:F.value,class:"action-btn"},{icon:v(()=>[i(y(e),null,{default:v(()=>[i(y(A))]),_:1})]),default:v(()=>[c[14]||(c[14]=s(" 导入 ",-1))]),_:1},8,["loading"])):t("",!0),i(y(a),{text:"",focusable:!1,onClick:_e,loading:J.value,class:"action-btn"},{icon:v(()=>[i(y(e),null,{default:v(()=>[i(y(x))]),_:1})]),default:v(()=>[c[15]||(c[15]=s(" 刷新 ",-1))]),_:1},8,["loading"])])):t("",!0)])):t("",!0),P("div",Aa,[P("span",Ra,[c[16]||(c[16]=P("span",{class:"asset-summary-label"},"全部",-1)),P("span",Ma,p(z.value.length),1)]),P("span",Da,[c[17]||(c[17]=P("span",{class:"asset-summary-label"},"已安装",-1)),P("span",Na,p(ce.value),1)]),P("span",Ka,[c[18]||(c[18]=P("span",{class:"asset-summary-label"},"可安装",-1)),P("span",qa,p(z.value.length-ce.value),1)])]),P("div",Ea,[i(y(le),{value:H.value,"onUpdate:value":c[3]||(c[3]=e=>H.value=e),placeholder:"搜索插件名称或描述",clearable:"",size:"small",class:"asset-search"},{prefix:v(()=>[i(y(e),null,{default:v(()=>[i(y(G))]),_:1})]),_:1},8,["value"]),i(y(Q),{value:M.value,"onUpdate:value":c[4]||(c[4]=e=>M.value=e),options:ue,size:"small",class:"asset-filter"},null,8,["value"])]),P("div",Va,[i(y(Y),{show:L.value},{default:v(()=>[0!==ke.value.length||L.value?(u(),w("div",Qa,[(u(!0),w(m,null,n(ke.value,e=>(u(),r(Le,{key:e.key,plugin:e,readonly:e.readonly||!ae.value.install&&!ae.value.uninstall,"can-install":ae.value.install,"can-uninstall":ae.value.uninstall,installing:!!E.value[e.key],uninstalling:!!V.value[e.key],onInstall:$e,onUninstall:Ce,onClick:Te},null,8,["plugin","readonly","can-install","can-uninstall","installing","uninstalling"]))),128))])):(u(),w("div",Fa,[i(y(X),{description:be.value},{icon:v(()=>[i(y(e),{size:"48",color:"var(--text-quaternary)"},{default:v(()=>[i(y(B))]),_:1})]),extra:v(()=>[ne.value.includes(re.value)&&0===z.value.length&&ae.value.repositories?(u(),r(y(a),{key:0,size:"small",onClick:c[5]||(c[5]=e=>D.value=!0)},{default:v(()=>[...c[19]||(c[19]=[s("配置仓库源",-1)])]),_:1})):t("",!0)]),_:1},8,["description"])]))]),_:1},8,["show"])]),ne.value.includes(re.value)&&(ae.value.install||ae.value.uninstall)?(u(),w("div",Wa,[i(y(e),{size:"14",class:"asset-info-icon"},{default:v(()=>[i(y(S))]),_:1}),P("span",null,"安装/卸载后需重启 "+p(oe.value)+" 生效",1)])):t("",!0),ae.value.repositories?(u(),r(ra,{key:3,visible:D.value,"onUpdate:visible":c[6]||(c[6]=e=>D.value=e),platform:re.value,"project-path":g.projectPath,capabilities:ae.value,onUpdated:Ue},null,8,["visible","platform","project-path","capabilities"])):t("",!0),i(Ia,{visible:K.value,"onUpdate:visible":c[7]||(c[7]=e=>K.value=e),plugin:q.value,platform:re.value,"project-path":g.projectPath,onUpdated:Pe},null,8,["visible","plugin","platform","project-path"])],2))}},[["__scopeId","data-v-2362c407"]]);export{Ya as t};
@@ -1 +0,0 @@
1
- import{n as e}from"./vendors-D0c_0KLP.js";var o=e.create({baseURL:"/api",timeout:3e4});o.interceptors.response.use(e=>e,e=>{if(e.response&&e.response.data){const o=e.response.data,r=new Error(o.message||e.message);return r.response=e.response,r.status=e.response.status,r.data=o,Promise.reject(r)}return Promise.reject(e)});var r=Object.freeze({claude:"",codex:"/codex",gemini:"/gemini",opencode:"/opencode",omp:"/omp"}),t={...r};function n(e=[]){if(t={...r},!Array.isArray(e))return t;for(const o of e){const e=s(o?.key);if(!e||Object.prototype.hasOwnProperty.call(r,e))continue;const n=String(o?.apiPrefix||"").trim().replace(/^\/+|\/+$/g,"");t[e]=n?`/${encodeURIComponent(n)}`:`/platforms/${encodeURIComponent(e)}`}return t}function s(e){return String(e||"").trim().toLowerCase()}function a(e){return Object.prototype.hasOwnProperty.call(r,s(e))}function p(e,o="not_found"){const r=s(e),t=new Error("not_found"===o?`Unknown platform: ${r||"(empty)"}`:`Unsupported platform capability: ${r||"(empty)"}`);return t.code=o,t.status=404,t.platform=r,t}function c(e="claude"){const o=s(e);if(!o)throw p(e);return Object.prototype.hasOwnProperty.call(t,o)?t[o]:`/platforms/${encodeURIComponent(o)}`}function i(e="claude"){return c(e)}export{c as a,i,n,a as o,p as r,s,o as t};