coding-tool-x 3.8.9 → 3.9.0

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 (130) hide show
  1. package/README.md +59 -387
  2. package/dist/web/assets/AgentsDrawer-DooV5Qhx.js +1 -0
  3. package/dist/web/assets/Analytics-BXRwqC-P.js +1 -0
  4. package/dist/web/assets/AssetPathField-B-LHvOxq.js +1 -0
  5. package/dist/web/assets/{ChatHistoryDrawer-BTmQ1aQr.js → ChatHistoryDrawer-CoHlGAxb.js} +1 -1
  6. package/dist/web/assets/{CollapseItem-CwqJk3bE.js → CollapseItem-kJkiHxFl.js} +1 -1
  7. package/dist/web/assets/CommandsDrawer-DLQrikcw.js +1 -0
  8. package/dist/web/assets/ConfigExportDrawer-BItwo0FQ.js +1 -0
  9. package/dist/web/assets/{ConfigTemplates-gyERg9iC.js → ConfigTemplates-R3YzzBT3.js} +1 -1
  10. package/dist/web/assets/{ConfigTemplatesDrawer-B17RqFi4.js → ConfigTemplatesDrawer-C_nPKrhx.js} +1 -1
  11. package/dist/web/assets/ConfigTemplatesPanel-BiwrNyYN.js +1 -0
  12. package/dist/web/assets/{Divider-DsdbkHrG.js → Divider-BLLhMTSt.js} +1 -1
  13. package/dist/web/assets/FavoritesDrawer-BAJ-AOpN.js +1 -0
  14. package/dist/web/assets/GatewayConvertDrawer-Av3yzwhP.js +1 -0
  15. package/dist/web/assets/Home-B01aL_SR.js +1 -0
  16. package/dist/web/assets/{MarkdownEditor-9TTwTS-U.js → MarkdownEditor-D75GGt5X.js} +1 -1
  17. package/dist/web/assets/McpDrawer-xNzJtT4X.js +1 -0
  18. package/dist/web/assets/McpFormDrawer-B240mJ5y.js +1 -0
  19. package/dist/web/assets/{PluginManager-BuRcWuBj.js → PluginManager-CgLjBdlr.js} +1 -1
  20. package/dist/web/assets/{PluginsDrawer-_zZENaQn.js → PluginsDrawer-DvJdwMXx.js} +1 -1
  21. package/dist/web/assets/PluginsPanel-kX14E_DT.js +1 -0
  22. package/dist/web/assets/ProjectList-CRtc3Hhx.js +1 -0
  23. package/dist/web/assets/PromptsDrawer-CvT9dA2N.js +1 -0
  24. package/dist/web/assets/RecentSessionsDrawer-DM1gf584.js +1 -0
  25. package/dist/web/assets/SessionCard-cZR2V4Br.js +1 -0
  26. package/dist/web/assets/SessionList-D7-P4Zme.js +1 -0
  27. package/dist/web/assets/SettingsDrawer-BFzaxbgC.css +1 -0
  28. package/dist/web/assets/SettingsDrawer-gW8kh-S8.js +1 -0
  29. package/dist/web/assets/{SkillManager-S698Hns8.js → SkillManager-D0BlI7CG.js} +1 -1
  30. package/dist/web/assets/{SkillsDrawer-Ms4lPCow.js → SkillsDrawer-BMB6uzqP.js} +1 -1
  31. package/dist/web/assets/SkillsPanel-BzR828De.js +1 -0
  32. package/dist/web/assets/Upload-3fNyOQrx.js +1 -0
  33. package/dist/web/assets/{WorkspaceDrawer-L7HJRc6u.js → WorkspaceDrawer-DvtBA58Q.js} +1 -1
  34. package/dist/web/assets/{WorkspaceManager-DsoNg2z8.js → WorkspaceManager-BW5KtsHO.js} +1 -1
  35. package/dist/web/assets/WorkspacePanel-BC_xpAEZ.js +1 -0
  36. package/dist/web/assets/client-BgcNg4Bt.js +1 -0
  37. package/dist/web/assets/{headers-B5JWGn3v.js → headers-DbowkmZJ.js} +1 -1
  38. package/dist/web/assets/{icons-DmFe4b5j.js → icons-B-AzZoeE.js} +1 -1
  39. package/dist/web/assets/index-BFqnddoI.js +2 -0
  40. package/dist/web/assets/index-Bn8BUnwP.css +1 -0
  41. package/dist/web/assets/{light-0eavxNvt.js → light-C2X7hegj.js} +1 -1
  42. package/dist/web/assets/platforms-DrzAtnjY.js +1 -0
  43. package/dist/web/assets/platforms-mqqe_82d.js +1 -0
  44. package/dist/web/assets/project-config-BVt5s-pH.js +1 -0
  45. package/dist/web/assets/sessions-53-Fr68H.js +1 -0
  46. package/dist/web/assets/{sessions-D4yQtfKb.js → sessions-CaWUaysM.js} +1 -1
  47. package/dist/web/assets/use-message-DBsCm7FJ.js +1 -0
  48. package/dist/web/assets/{useResponsiveDrawer-V_onl9NV.js → useResponsiveDrawer-Ckgj760z.js} +1 -1
  49. package/dist/web/assets/{workspaces-mjyPVGS8.js → workspaces-DQuZd4qw.js} +1 -1
  50. package/dist/web/index.html +8 -8
  51. package/docs/analytics.png +0 -0
  52. package/docs/home.png +0 -0
  53. package/package.json +4 -2
  54. package/src/commands/export-config.js +17 -211
  55. package/src/config/model-metadata.json +180 -16
  56. package/src/platforms/channel-auth-service.js +1 -1
  57. package/src/platforms/commands-service.js +28 -0
  58. package/src/platforms/driver-registry.js +1 -0
  59. package/src/platforms/drivers/claude/channels-implementation.js +79 -90
  60. package/src/platforms/drivers/claude/native-config-implementation.js +3 -4
  61. package/src/platforms/drivers/codex/channels-implementation.js +34 -49
  62. package/src/platforms/drivers/codex/native-config-implementation.js +3 -51
  63. package/src/platforms/drivers/dsh/api-operations.js +1 -1
  64. package/src/platforms/drivers/dsh/channels-implementation.js +28 -8
  65. package/src/platforms/drivers/dsh/channels.js +0 -18
  66. package/src/platforms/drivers/dsh/common.js +7 -0
  67. package/src/platforms/drivers/dsh/native-config.js +7 -2
  68. package/src/platforms/drivers/gemini/channels-implementation.js +47 -55
  69. package/src/platforms/drivers/gemini/native-config-implementation.js +8 -20
  70. package/src/platforms/drivers/generic-native-config.js +20 -0
  71. package/src/platforms/drivers/native-config-snapshot.js +30 -4
  72. package/src/platforms/drivers/omp/channels-implementation.js +51 -17
  73. package/src/platforms/drivers/omp/native-config-implementation.js +10 -17
  74. package/src/platforms/drivers/opencode/channels-implementation.js +6 -0
  75. package/src/platforms/drivers/opencode/native-config-implementation.js +3 -67
  76. package/src/platforms/manifest-schema.js +35 -2
  77. package/src/platforms/manifests/claude.json +0 -8
  78. package/src/platforms/manifests/codex.json +0 -8
  79. package/src/platforms/manifests/dsh.json +6 -9
  80. package/src/platforms/manifests/gemini.json +0 -8
  81. package/src/platforms/manifests/omp.json +0 -8
  82. package/src/platforms/manifests/opencode.json +0 -8
  83. package/src/platforms/native-oauth-adapters.js +33 -33
  84. package/src/platforms/remote-notification-providers.js +5 -5
  85. package/src/server/api/settings.js +6 -5
  86. package/src/server/index.js +2 -0
  87. package/src/server/services/bounded-content.js +60 -0
  88. package/src/server/services/channel-balance.js +10 -4
  89. package/src/server/services/config-export-service.js +2 -2
  90. package/src/server/services/config-templates-service.js +5 -1
  91. package/src/server/services/plugins-service.js +162 -85
  92. package/src/server/services/session-history-maintenance-worker.js +71 -0
  93. package/src/server/services/session-history-maintenance.js +166 -0
  94. package/src/server/services/skill-service.js +23 -3
  95. package/src/server/services/speed-test.js +0 -72
  96. package/src/shared/channel-driver.js +16 -0
  97. package/src/shared/driver-factories/api.js +1 -0
  98. package/src/utils/native-config-patcher.js +474 -0
  99. package/dist/web/assets/AgentsDrawer-Cj5CJ4d9.js +0 -1
  100. package/dist/web/assets/Analytics-1doS-8uC.js +0 -1
  101. package/dist/web/assets/AssetPathField-C9TOPl7o.js +0 -1
  102. package/dist/web/assets/CommandsDrawer-CaZWDI_G.js +0 -1
  103. package/dist/web/assets/ConfigExportDrawer-C3vSZEsS.js +0 -1
  104. package/dist/web/assets/ConfigTemplatesPanel-DKIC_FqG.js +0 -1
  105. package/dist/web/assets/FavoritesDrawer-DaziQmBp.js +0 -1
  106. package/dist/web/assets/GatewayConvertDrawer-OMgWUUSc.js +0 -1
  107. package/dist/web/assets/Home-DOSUTfrE.js +0 -1
  108. package/dist/web/assets/McpDrawer-I8rl8lGH.js +0 -1
  109. package/dist/web/assets/McpFormDrawer-DEP3C7ut.js +0 -1
  110. package/dist/web/assets/PluginsPanel-Bs5qZ-TK.js +0 -1
  111. package/dist/web/assets/ProjectList-BSxuL2td.js +0 -1
  112. package/dist/web/assets/PromptsDrawer-CoZ-ZtsY.js +0 -1
  113. package/dist/web/assets/RecentSessionsDrawer-B_17aJBG.js +0 -1
  114. package/dist/web/assets/SessionCard-BL_x0d3t.js +0 -1
  115. package/dist/web/assets/SessionList-DhRYZ6vl.js +0 -1
  116. package/dist/web/assets/SettingsDrawer-Dw5NUgHC.css +0 -1
  117. package/dist/web/assets/SettingsDrawer-fYb0DU7X.js +0 -1
  118. package/dist/web/assets/SkillsPanel-rqnqAOGL.js +0 -1
  119. package/dist/web/assets/SpeedTestDrawer-Bbn38SfV.js +0 -1
  120. package/dist/web/assets/SpeedTestDrawer-Dc0WToJ_.css +0 -1
  121. package/dist/web/assets/Upload-CdyVHxCI.js +0 -1
  122. package/dist/web/assets/WorkspacePanel-Be8PVZah.js +0 -1
  123. package/dist/web/assets/client-UDwXBP9i.js +0 -1
  124. package/dist/web/assets/index-3Lp6z8TQ.css +0 -1
  125. package/dist/web/assets/index-BKlAWTH-.js +0 -2
  126. package/dist/web/assets/platforms-BmzzwnSw.js +0 -1
  127. package/dist/web/assets/platforms-DWXgmy2w.js +0 -1
  128. package/dist/web/assets/project-config-B2baPzYL.js +0 -1
  129. package/dist/web/assets/sessions-CC0j-KH_.js +0 -1
  130. package/dist/web/assets/use-message-DqCwefG6.js +0 -1
@@ -0,0 +1 @@
1
+ import{i as e,s as a,t as l}from"./_plugin-vue_export-helper-BeLZJZij.js";import{C as s,D as n,H as t,I as c,J as o,K as i,O as r,S as u,V as d,W as v,Y as p,Z as h,_t as y,b as g,et as m,g as f,gt as k,ht as T,i as b,m as w,mt as $,st as _,w as C,x}from"./vue-vendor-BqZbbXHA.js";import{t as z}from"./vendors-D0c_0KLP.js";import{a as S,c as j,t as q,u as L}from"./platforms-mqqe_82d.js";import{C as M,G as I,I as E,L as O,O as A,Ot as D,T as F,Y as N,ft as P,i as J,n as U,r as V,v as K,xt as R,y as Y,yt as H}from"./icons-B-AzZoeE.js";import{t as G,u as W}from"./use-message-DBsCm7FJ.js";import{A as Z,C as B,Et as Q,Y as X,g as ee,j as ae,ut as le,v as se}from"./index-BFqnddoI.js";import{t as ne}from"./RecentSessionsDrawer-DM1gf584.js";var te={class:"channel-column"},ce={class:"drag-handle",title:"拖拽排序"},oe={class:"header-icon"},ie={class:"channel-title"},re={key:0,class:"claude-extra-area"},ue={key:0,class:"channel-content"},de={key:0,class:"card"},ve={class:"card-header"},pe={class:"card-title"},he={key:0,class:"runtime-badge"},ye={class:"card-body",style:{padding:"6px 10px"}},ge={class:"proxy-info-row"},me={class:"proxy-status"},fe={key:0,class:"proxy-port"},ke={class:"channel-name"},Te={class:"channel-quick-panel"},be={class:"panel-title"},we={key:0,class:"no-channels"},$e={key:1,class:"channel-quick-list"},_e={class:"channel-quick-info"},Ce={class:"channel-quick-name"},xe={key:0,class:"channel-switching-tip"},ze={class:"channel-metrics"},Se={class:"metric-item"},je={class:"metric-value"},qe={class:"metric-item"},Le={class:"metric-value"},Me={class:"metric-item"},Ie={class:"metric-value"},Ee={class:"metric-item"},Oe={class:"card"},Ae={class:"card-header compact"},De={class:"card-body",style:{padding:"8px 10px"}},Fe={class:"quick-access-list"},Ne={class:"access-icon"},Pe={class:"access-content"},Je={class:"access-value"},Ue={class:"access-icon"},Ve={class:"access-content"},Ke={class:"access-value"},Re={class:"access-icon"},Ye={class:"access-content"},He={class:"access-goto"},Ge={class:"card-header compact"},We={class:"card-body",style:{padding:"8px 10px"}},Ze={class:"stats-inline stats-3col"},Be={class:"stat-inline-item stat-requests"},Qe={class:"stat-info"},Xe={class:"stat-inline-item stat-input"},ea={class:"stat-info"},aa={class:"stat-inline-item stat-output"},la={class:"stat-info"},sa={key:3,class:"card logs-card"},na={class:"card-header compact"},ta={class:"card-body logs-card-body"},ca={class:"logs-table-wrapper"},oa={key:0,class:"empty-logs"},ia=["title"],ra={key:0,class:"action-content"},ua={class:"action-msg"},da={class:"action-time"},va={key:1,class:"action-content"},pa={class:"action-msg error-msg"},ha={class:"action-time error-time"},ya={class:"locked-content"},ga={class:"lock-icon"},ma="channelLocks",fa=l({__name:"ChannelColumn",props:{channelType:{type:String,required:!0}},setup(l){const z=l,S=b(),Q=q(),fa=G(),{getProxyState:ka,getChannels:Ta,getSchedulerState:ba,startProxy:wa,stopProxy:$a,getLogs:_a,clearLogsForSource:Ca,loadChannels:xa,logLimit:za,statsInterval:Sa}=se(),{dashboardData:ja,isLoading:qa,loadDashboard:La,scheduleRefresh:Ma}=ee(),Ia=g(()=>Q.get(z.channelType)||{key:z.channelType,label:z.channelType,title:z.channelType,icon:J,color:"#64748b",capabilities:{},resourceTypes:{}}),Ea=g(()=>Ia.value.title||Ia.value.label||z.channelType),Oa=g(()=>Ia.value.icon||J),Aa=g(()=>Ia.value.color||"#64748b"),Da=g(()=>Ia.value.label||Ia.value.title||z.channelType),Fa=g(()=>ka(z.channelType)?.value||{}),Na=_({projects:0,sessions:0}),Pa=_({requests:0,tokens:0,cost:0}),Ja=_({requests:0,tokens:0,cost:0}),Ua={requests:0,tokens:0,cost:3},Va={requests:null,tokens:null,cost:null},Ka=_({requests:!1,tokens:!1,cost:!1}),Ra=g(()=>ja.value?.todayStats?.[z.channelType]?.byModel||{});function Ya(e,a,l,s=600){Va[e]&&cancelAnimationFrame(Va[e]),Ka.value[e]=!0;const n=Date.now(),t=()=>{const c=Date.now()-n,o=Math.min(c/s,1),i=1-Math.pow(1-o,2),r=a+(l-a)*i,u=Ua[e]??0,d=Math.pow(10,u),v=u>0?Math.round(r*d)/d:Math.round(r);Ja.value[e]=v,o<1?Va[e]=requestAnimationFrame(t):Ka.value[e]=!1};Va[e]=requestAnimationFrame(t)}const Ha=_(!1);function Ga(e){try{const a=localStorage.getItem(ma),l=a?JSON.parse(a):{};l[z.channelType]=e,localStorage.setItem(ma,JSON.stringify(l))}catch(a){}}const Wa=_(function(){try{const e=localStorage.getItem(ma);if(e)return JSON.parse(e)[z.channelType]||!1}catch(e){}return!1}());async function Za(){Wa.value=!Wa.value,Ga(Wa.value);try{if(await L("channelLocks",z.channelType,Wa.value),ja.value){const e=ja.value.uiConfig||{},a={...e.channelLocks||{}};a[z.channelType]=Wa.value,ja.value={...ja.value,uiConfig:{...e,channelLocks:a}}}}catch(e){}}const Ba=_(!0);function Qa(e){e.detail&&void 0!==e.detail.showLogs&&(Ba.value=e.detail.showLogs)}const Xa=_(Date.now()),el=g(()=>{if(!Fa.value.running)return"";const e=Fa.value.startTime;if(!e)return"";const a=Xa.value-e;if(a<=0)return"";const l=Math.floor(a/1e3),s=Math.floor(l/3600),n=Math.floor(l%3600/60),t=l%60;let c="已运行 ";return s>0&&(c+=`${s}小时`),n>0&&(c+=`${n}分`),(t>0||0===s&&0===n)&&(c+=`${t}秒`),c}),al=_(null),ll=g(()=>za.value),sl=g(()=>fl()?(_a(z.channelType)?.value||[]).slice(0,ll.value):[]);let nl=null,tl=null,cl=null,ol=!1,il=null;const rl=g(()=>{const e=Ta(z.channelType)?.value||[];return[...e.filter(e=>!1!==e.enabled),...e.filter(e=>!1===e.enabled)]});function ul(e){const a=ba(z.channelType);if(!a?.channels)return 0;const l=a.channels.find(a=>a.id===e);return l?l.inflight:0}const dl=g(()=>{const e=rl.value.filter(e=>!1!==e.enabled).length;return Fa.value.running?`${e}个渠道动态切换中`:rl.value.length>0?`${e}个渠道已启用`:"无渠道"}),vl=g(()=>ja.value?.todayStats?.[z.channelType]?.byChannel||{});function pl(e){return vl.value[e]||{requests:0,tokens:0,cost:0}}function hl(e,a){return e?.usageMissing?"--":e?.tokens?.[a]||0}function yl(e){return Q.hasCapability(z.channelType,e)}function gl(e){return yl(e)||!0===Ia.value.resourceTypes?.[e]}const ml=g(()=>["skills","commands","agents","plugins"].some(gl));function fl(){return yl("nativeLogs")}function kl(e){if(!e||"action"===e.type||"error"===e.status)return"";const a=[];return e.model&&a.push(`模型: ${e.model}`),e.originalModel&&e.originalModel!==e.model&&a.push(`重定向: ${e.originalModel} -> ${e.model}`),e.usageMissing&&a.push("上游响应未返回 usage,当前无法计算 token。"),a.join("\n")}async function Tl(e){if(!yl("proxy"))return void fa.warning(`${Ea.value} 暂未接入动态代理`);const a=ka(z.channelType);if(a){a.value.loading=!0;try{let l;l=e?await wa(z.channelType):await $a(z.channelType,{refreshChannelsDrawer:!0}),!1!==l.success?"omp"===z.channelType?fa.success(e?"OMP 动态切换已启用":"OMP 已切换为单渠道直连模式"):fa.success(e?`${Ea.value} 代理已启动`:`${Ea.value} 代理已停止`):(fa.error(l.error||"操作失败"),a.value.running=!e)}catch(l){fa.error(l.response?.data?.error||l.message||"操作失败"),a.value.running=!e}finally{a.value.loading=!1}}}function bl(){yl("projects")?S.push({name:"cli-projects",params:{platform:z.channelType}}):fa.info(`${Ea.value} 当前仅作为首页显示项`)}function wl(){yl("projects")?S.push({name:"cli-projects",params:{platform:z.channelType}}):fa.info(`${Ea.value} 当前仅作为首页显示项`)}function $l(){yl("sessions")?Ha.value=!0:fa.info(`${Ea.value} 当前没有托管会话列表`)}h(sl,e=>{const a=e[0]?.id||null;a&&a!==nl?(nl=a,il&&clearTimeout(il),il=setTimeout(()=>{Ma({fresh:!0}).then(()=>jl()).catch(()=>{})},5e3),(!al.value||al.value.scrollTop<20)&&c(()=>{al.value&&(al.value.scrollTop=0)})):nl=a}),h(()=>Pa.value.requests,e=>{Ya("requests",Ja.value.requests,e,600)}),h(()=>Pa.value.tokens,e=>{Ya("tokens",Ja.value.tokens,e,600)}),h(()=>Pa.value.cost,e=>{Ya("cost",Ja.value.cost,e,600)}),h(()=>z.channelType,()=>{nl=sl.value[0]?.id||null}),h(()=>ja.value?.counts?.[z.channelType],()=>{Sl()}),h(()=>ja.value?.todayStats?.[z.channelType],()=>{jl()},{deep:!0}),h(Sa,()=>{ol&&function(){tl&&(clearInterval(tl),tl=null);const e=Sa.value||30,a=Math.max(1e3*e,1e4);tl=setInterval(()=>{Ma({fresh:!0}).then(()=>jl()).catch(()=>{})},a)}()});const _l=_({});function Cl(e){return!!_l.value[e]}function xl(e,a){e&&(_l.value={..._l.value,[e]:!!a})}async function zl(e,a){if(!e)return;const l=`${z.channelType}ChannelCollapse`;let s={};try{const e=l?localStorage.getItem(l):null;s=e?JSON.parse(e):{}}catch(n){s={}}a?delete s[e]:s[e]=!0;try{l&&localStorage.setItem(l,JSON.stringify(s))}catch(n){}try{await L("channelCollapse",z.channelType,s)}catch(n){}}function Sl(){const e=ja.value?.counts?.[z.channelType];Na.value.projects=e?.projectCount||0,Na.value.sessions=e?.sessionCount||0}async function jl(){if(ja.value&&ja.value.todayStats){const e=ja.value.todayStats[z.channelType];e&&(Pa.value.requests=e.requests||0,Pa.value.tokens=e.tokens||0,Pa.value.cost=e.cost||0)}Sl()}function ql(){Ca(z.channelType)}function Ll(e){e?.currentTarget?.blur?.()}function Ml(e){window.dispatchEvent(new CustomEvent("open-skills-drawer",{detail:{platform:z.channelType}})),Ll(e)}function Il(e){window.dispatchEvent(new CustomEvent("open-commands-drawer",{detail:{platform:z.channelType}})),Ll(e)}function El(e){if(!gl("agents"))return fa.info(`${Ea.value} 的 Agent 能力通过插件/扩展提供`),void Ll(e);window.dispatchEvent(new CustomEvent("open-agents-drawer",{detail:{platform:z.channelType}})),Ll(e)}return d(async()=>{await La().then(()=>jl()),async function(){try{if(ja.value&&ja.value.uiConfig)Ba.value=!1!==ja.value.uiConfig.panelVisibility?.showLogs;else{const e=await j();e.success&&e.config&&(Ba.value=!1!==e.config.panelVisibility?.showLogs)}}catch(e){}}(),async function(){try{let e=!1;if(ja.value&&ja.value.uiConfig)e=ja.value.uiConfig.channelLocks?.[z.channelType]||!1;else{const a=await j();a.success&&a.config&&(e=a.config.channelLocks?.[z.channelType]||!1)}Wa.value=e,Ga(e)}catch(e){}}(),window.addEventListener("panel-visibility-change",Qa),Ja.value={...Pa.value},ol=!0,cl=setInterval(()=>{Xa.value=Date.now()},1e3)}),t(()=>{ol=!1,tl&&clearInterval(tl),cl&&clearInterval(cl),il&&clearTimeout(il),window.removeEventListener("panel-visibility-change",Qa),Object.values(Va).forEach(e=>{e&&cancelAnimationFrame(e)})}),(t,c)=>{const d=o("n-collapse");return v(),C("div",te,[x("div",{class:T(["channel-header",l.channelType]),style:k({"--platform-color":Aa.value})},[x("div",ce,[r($(e),{size:16},{default:m(()=>[r($(Y))]),_:1})]),x("div",oe,[r($(e),{size:20},{default:m(()=>[(v(),u(p(Oa.value)))]),_:1})]),x("h2",ie,y(Ea.value),1),ml.value?(v(),C("div",re,[gl("skills")?(v(),u($(X),{key:0,trigger:"hover"},{trigger:m(()=>[r($(a),{text:"",class:"config-shortcut-button",onClick:Ml,title:"Skills 技能管理"},{icon:m(()=>[r($(e),{size:18},{default:m(()=>[r($(N))]),_:1})]),_:1})]),default:m(()=>[c[2]||(c[2]=n(" Skills 技能管理 ",-1))]),_:1})):s("",!0),gl("commands")?(v(),u($(X),{key:1,trigger:"hover"},{trigger:m(()=>[r($(a),{text:"",class:"config-shortcut-button",onClick:Il,title:"Commands 命令管理"},{icon:m(()=>[r($(e),{size:18},{default:m(()=>[r($(J))]),_:1})]),_:1})]),default:m(()=>[c[3]||(c[3]=n(" Commands 命令管理 ",-1))]),_:1})):s("",!0),gl("agents")?(v(),u($(X),{key:2,trigger:"hover"},{trigger:m(()=>[r($(a),{text:"",class:"config-shortcut-button",onClick:El,title:"Agents 代理管理"},{icon:m(()=>[r($(e),{size:18},{default:m(()=>[r($(A))]),_:1})]),_:1})]),default:m(()=>[c[4]||(c[4]=n(" Agents 代理管理 ",-1))]),_:1})):s("",!0)])):s("",!0),r($(a),{text:"",class:"lock-button",onClick:Za,title:Wa.value?"解锁此列":"锁定此列"},{icon:m(()=>[r($(e),{size:18},{default:m(()=>[Wa.value?(v(),u($(O),{key:0})):(v(),u($(E),{key:1}))]),_:1})]),_:1},8,["title"])],6),Wa.value?s("",!0):(v(),C("div",ue,[yl("proxy")?(v(),C("div",de,[x("div",ve,[r($(e),{size:16},{default:m(()=>[r($(F))]),_:1}),x("h3",pe,y("omp"===l.channelType?"动态切换":"代理控制"),1),Fa.value.running&&el.value?(v(),C("span",he,y(el.value),1)):s("",!0),r($(ae),{value:Fa.value.running,"onUpdate:value":[c[0]||(c[0]=e=>Fa.value.running=e),Tl],loading:Fa.value.loading,size:"small",style:{"margin-left":"auto"}},null,8,["value","loading"])]),x("div",ye,[x("div",ge,[x("div",me,[x("div",{class:T(["status-dot",{active:Fa.value.running}])},null,2),r($(Z),{type:Fa.value.running?"success":"default",style:{"font-size":"12px"}},{default:m(()=>[n(y(Fa.value.running?"运行中":"已停止"),1)]),_:1},8,["type"]),"omp"!==l.channelType?(v(),C("span",fe,"端口: "+y(Fa.value.port),1)):s("",!0)]),yl("channels")?(v(),u($(W),{key:0,trigger:"click",placement:"bottom",width:320,class:"channel-popover"},{trigger:m(()=>[r($(a),{text:"",size:"tiny",class:"channel-status"},{default:m(()=>[x("span",ke,y(dl.value),1)]),_:1})]),default:m(()=>[x("div",Te,[x("div",be,[c[6]||(c[6]=x("span",null,"渠道快捷管理",-1)),r($(Z),{depth:"3",style:{"font-size":"11px"}},{default:m(()=>[...c[5]||(c[5]=[n("点击开关切换状态",-1)])]),_:1})]),0===rl.value.length?(v(),C("div",we,[r($(Z),{depth:"3"},{default:m(()=>[...c[7]||(c[7]=[n("暂无配置渠道",-1)])]),_:1})])):(v(),C("div",$e,[(v(!0),C(f,null,i(rl.value,e=>{return v(),C("div",{key:e.id,class:T(["channel-quick-item",{disabled:!1===e.enabled}])},[x("div",_e,[x("span",Ce,y(e.name),1),"frozen"===e.health?.status?(v(),u($(le),{key:0,size:"tiny",type:"error",bordered:!1},{default:m(()=>[...c[8]||(c[8]=[n(" 冻结 ",-1)])]),_:1})):s("",!0),r($(ae),{size:"small",value:!1!==e.enabled,"onUpdate:value":a=>async function(e,a){if(e&&!Cl(e.id)){xl(e.id,!0);try{await B(z.channelType,e.id,{enabled:a}),await zl(e.id,a),fa.success(a?`渠道「${e.name}」已启用`:`渠道「${e.name}」已停用`),await xa({force:!0,keys:[z.channelType]}),window.dispatchEvent(new CustomEvent("channel-management-refresh",{detail:{channel:z.channelType}}))}catch(l){fa.error("操作失败: "+l.message)}finally{xl(e.id,!1)}}}(e,a),loading:Cl(e.id),disabled:Cl(e.id),style:{"margin-left":"auto"}},null,8,["value","onUpdate:value","loading","disabled"])]),Cl(e.id)?(v(),C("div",xe," 正在切换渠道状态... ")):s("",!0),x("div",ze,[x("span",Se,[c[9]||(c[9]=x("span",{class:"metric-label"},"请求",-1)),x("span",je,y(pl(e.id).requests),1)]),x("span",qe,[c[10]||(c[10]=x("span",{class:"metric-label"},"Tokens",-1)),x("span",Le,y((a=pl(e.id).tokens,a>=1e6?(a/1e6).toFixed(1)+"M":a>=1e3?(a/1e3).toFixed(1)+"K":a.toString())),1)]),x("span",Me,[c[11]||(c[11]=x("span",{class:"metric-label"},"权重",-1)),x("span",Ie,y(e.weight||1),1)]),x("span",Ee,[c[12]||(c[12]=x("span",{class:"metric-label"},"并发",-1)),x("span",{class:T(["metric-value",{active:ul(e.id)>0}])},y(ul(e.id))+y(e.maxConcurrency?`/${e.maxConcurrency}`:""),3)])])],2);var a}),128))]))])]),_:1})):s("",!0)])])])):s("",!0),x("div",Oe,[x("div",Ae,[r($(e),{size:14},{default:m(()=>[r($(K))]),_:1}),c[13]||(c[13]=x("h3",{class:"card-title"},"快速访问",-1))]),x("div",De,[x("div",Fe,[x("div",{class:T(["access-card access-card-projects",{clickable:yl("projects"),disabled:!yl("projects")}]),onClick:bl},[x("div",Ne,[r($(e),{size:16},{default:m(()=>[r($(I))]),_:1})]),x("div",Pe,[c[14]||(c[14]=x("span",{class:"access-label"},"项目",-1)),x("span",Je,y(Na.value.projects),1)])],2),x("div",{class:T(["access-card access-card-sessions",{clickable:yl("sessions"),disabled:!yl("sessions")}]),onClick:$l},[x("div",Ue,[r($(e),{size:16},{default:m(()=>[r($(R))]),_:1})]),x("div",Ve,[c[15]||(c[15]=x("span",{class:"access-label"},"最新对话",-1)),x("span",Ke,y(Na.value.sessions),1)])],2),x("div",{class:T(["access-card access-card-goto",{clickable:yl("projects"),disabled:!yl("projects")}]),onClick:wl},[x("div",Re,[r($(e),{size:16},{default:m(()=>[r($(D))]),_:1})]),x("div",Ye,[c[16]||(c[16]=x("span",{class:"access-label"},"前往",-1)),x("span",He,y(Da.value),1)])],2)])])]),yl("statistics")?(v(),C("div",{key:1,class:T(["card stats-card",`stats-card-${l.channelType}`])},[x("div",Ge,[r($(e),{size:14},{default:m(()=>[r($(U))]),_:1}),c[17]||(c[17]=x("h3",{class:"card-title"},"今日数据",-1))]),x("div",We,[x("div",Ze,[x("div",Be,[c[19]||(c[19]=x("div",{class:"stat-icon-dot requests"},null,-1)),x("div",Qe,[c[18]||(c[18]=x("span",{class:"stat-label"},"请求",-1)),x("span",{class:T(["stat-value",{animating:Ka.value.requests}])},y(Ja.value.requests),3)])]),x("div",Xe,[c[21]||(c[21]=x("div",{class:"stat-icon-dot tokens"},null,-1)),x("div",ea,[c[20]||(c[20]=x("span",{class:"stat-label"},"总 Tokens",-1)),x("span",{class:T(["stat-value",{animating:Ka.value.tokens}])},y((g=Ja.value.tokens,g>=1e6?(g/1e6).toFixed(1)+"M":g>=1e3?(g/1e3).toFixed(1)+"K":g.toString())),3)])]),x("div",aa,[c[23]||(c[23]=x("div",{class:"stat-icon-dot cost"},null,-1)),x("div",la,[c[22]||(c[22]=x("span",{class:"stat-label"},"成本 / USD",-1)),x("span",{class:T(["stat-value",{animating:Ka.value.cost}])},y((h=Ja.value.cost,!h||Number.isNaN(h)?"$0":"$"+Number(h).toFixed(3))),3)])])])])],2)):s("",!0),yl("statistics")&&Object.keys(Ra.value).length>0?(v(),C("div",{key:2,class:T(["card chart-card",`chart-card-${l.channelType}`])},[r(d,{"default-expanded-names":[],accordion:""})],2)):s("",!0),Ba.value&&fl()?(v(),C("div",sa,[x("div",na,[r($(e),{size:14},{default:m(()=>[r($(M))]),_:1}),c[24]||(c[24]=x("h3",{class:"card-title"},"实时日志",-1)),r($(a),{text:"",size:"tiny",onClick:w(ql,["stop"]),style:{"margin-left":"auto"},title:"清空日志"},{icon:m(()=>[r($(e),{size:14},{default:m(()=>[r($(V))]),_:1})]),_:1})]),x("div",ta,[x("div",ca,[x("div",{class:T(["logs-table-header",`logs-header-${l.channelType}`])},[x("div",{class:T(["log-col col-channel",`col-channel-${l.channelType}`])},"渠道",2),x("div",{class:T(["log-col col-token",`col-token-${l.channelType}`])},"请求",2),x("div",{class:T(["log-col col-token",`col-token-${l.channelType}`])},"回复",2),"claude"===l.channelType?(v(),C(f,{key:0},[x("div",{class:T(["log-col col-token",`col-token-${l.channelType}`])},"写入",2),x("div",{class:T(["log-col col-token",`col-token-${l.channelType}`])},"命中",2)],64)):"codex"===l.channelType?(v(),C(f,{key:1},[x("div",{class:T(["log-col col-token",`col-token-${l.channelType}`])},"推理",2),x("div",{class:T(["log-col col-token",`col-token-${l.channelType}`])},"缓存",2),x("div",{class:T(["log-col col-token",`col-token-${l.channelType}`])},"总计",2)],64)):"gemini"===l.channelType?(v(),C(f,{key:2},[x("div",{class:T(["log-col col-token",`col-token-${l.channelType}`])},"缓存",2),x("div",{class:T(["log-col col-token",`col-token-${l.channelType}`])},"总计",2)],64)):"opencode"===l.channelType||"omp"===l.channelType?(v(),C(f,{key:3},[x("div",{class:T(["log-col col-token",`col-token-${l.channelType}`])},"推理",2),x("div",{class:T(["log-col col-token",`col-token-${l.channelType}`])},"缓存",2),x("div",{class:T(["log-col col-token",`col-token-${l.channelType}`])},"总计",2)],64)):(v(),C("div",{key:4,class:T(["log-col col-token",`col-token-${l.channelType}`])},"总计",2)),x("div",{class:T(["log-col col-time",`col-time-${l.channelType}`])},"时间",2)],2),x("div",{class:"logs-container",ref_key:"logsContainer",ref:al},[0===sl.value.length?(v(),C("div",oa,[r($(e),{size:32,depth:"3",style:{"margin-bottom":"8px"}},{default:m(()=>[r($(M))]),_:1}),r($(Z),{depth:"3",style:{"font-size":"12px","font-weight":"500"}},{default:m(()=>[...c[25]||(c[25]=[n("暂无实时日志",-1)])]),_:1}),r($(Z),{depth:"3",style:{"font-size":"11px","margin-top":"4px"}},{default:m(()=>[n(y("omp"===l.channelType?"ctx 将持续读取 OMP 原生会话日志":"开启代理后将显示请求记录"),1)]),_:1})])):s("",!0),(v(!0),C(f,null,i(sl.value,a=>(v(),C("div",{key:a.id,class:T(["log-row",{"action-row":"action"===a.type,"error-row":"error"===a.status,"new-log":a.isNew}]),title:kl(a)},["action"===a.type?(v(),C("div",ra,[r($(e),{size:12,color:"#18a058"},{default:m(()=>[r($(H))]),_:1}),x("span",ua,y(a.message),1),x("span",da,y(a.time),1)])):"error"===a.status?(v(),C("div",va,[r($(e),{size:12,color:"#d03050"},{default:m(()=>[r($(P))]),_:1}),x("span",pa,y(a.channel)+": "+y(a.error||a.message||"请求失败"),1),x("span",ha,y(a.time),1)])):(v(),C(f,{key:2},[x("div",{class:T(["log-col col-channel",`col-channel-${l.channelType}`])},[r($(le),{size:"tiny",type:"success"},{default:m(()=>[n(y(a.channel),1)]),_:2},1024)],2),x("div",{class:T(["log-col col-token",`col-token-${l.channelType}`])},y(hl(a,"input")),3),x("div",{class:T(["log-col col-token",`col-token-${l.channelType}`])},y(hl(a,"output")),3),"claude"===l.channelType?(v(),C(f,{key:0},[x("div",{class:T(["log-col col-token",`col-token-${l.channelType}`])},y(hl(a,"cacheCreation")),3),x("div",{class:T(["log-col col-token",`col-token-${l.channelType}`])},y(hl(a,"cacheRead")),3)],64)):"codex"===l.channelType?(v(),C(f,{key:1},[x("div",{class:T(["log-col col-token",`col-token-${l.channelType}`])},y(hl(a,"reasoning")),3),x("div",{class:T(["log-col col-token",`col-token-${l.channelType}`])},y(hl(a,"cached")),3),x("div",{class:T(["log-col col-token",`col-token-${l.channelType}`])},y(hl(a,"total")),3)],64)):"gemini"===l.channelType?(v(),C(f,{key:2},[x("div",{class:T(["log-col col-token",`col-token-${l.channelType}`])},y(hl(a,"cached")),3),x("div",{class:T(["log-col col-token",`col-token-${l.channelType}`])},y(hl(a,"total")),3)],64)):"opencode"===l.channelType||"omp"===l.channelType?(v(),C(f,{key:3},[x("div",{class:T(["log-col col-token",`col-token-${l.channelType}`])},y(hl(a,"reasoning")),3),x("div",{class:T(["log-col col-token",`col-token-${l.channelType}`])},y(hl(a,"cached")),3),x("div",{class:T(["log-col col-token",`col-token-${l.channelType}`])},y(hl(a,"total")),3)],64)):(v(),C("div",{key:4,class:T(["log-col col-token",`col-token-${l.channelType}`])},y(hl(a,"total")),3)),x("div",{class:T(["log-col col-time",`col-time-${l.channelType}`])},y(a.time),3)],64))],10,ia))),128))],512)])])])):s("",!0)])),Wa.value?(v(),C("div",{key:1,class:T(["locked-overlay",`locked-${l.channelType}`])},[x("div",ya,[x("div",ga,[r($(e),{size:48},{default:m(()=>[r($(O))]),_:1})]),c[27]||(c[27]=x("h3",{class:"locked-title"},"该渠道已锁定",-1)),r($(Z),{depth:"3",class:"locked-hint"},{default:m(()=>[...c[26]||(c[26]=[n(" 点击上方按钮解锁以查看内容 ",-1)])]),_:1})])],2)):s("",!0),yl("sessions")?(v(),u(ne,{key:2,visible:Ha.value,"onUpdate:visible":c[1]||(c[1]=e=>Ha.value=e),channel:l.channelType},null,8,["visible","channel"])):s("",!0)]);var h,g}}},[["__scopeId","data-v-a1598dde"]]),ka={class:"dashboard-container"},Ta=l({__name:"Home",setup(e){const{uiConfig:a,updateConfig:l,loadUIConfig:s}=S(),n=q(),{enabledKeys:c}=Q({platformStore:n,configRef:a}),o=_([]);function i(e=c.value){o.value=e.map(e=>({type:e}))}async function p(){const e=o.value.map(e=>e.type);i(e),await l("enabledCliPlatforms",e)}function h(e){const l=e?.detail?.enabledCliPlatforms;Array.isArray(l)&&(a.value={...a.value,enabledCliPlatforms:[...l]}),i()}return d(async()=>{window.addEventListener("enabled-cli-platforms-change",h),await Promise.all([s(),n.load()]),i()}),t(()=>{window.removeEventListener("enabled-cli-platforms-change",h)}),(e,a)=>(v(),C("div",ka,[r($(z),{modelValue:o.value,"onUpdate:modelValue":a[0]||(a[0]=e=>o.value=e),class:"dashboard-grid","item-key":"type",animation:200,handle:".drag-handle",onEnd:p},{item:m(({element:e})=>[(v(),u(fa,{"channel-type":e.type,key:e.type},null,8,["channel-type"]))]),_:1},8,["modelValue"])]))}},[["__scopeId","data-v-5858e14d"]]);export{Ta as default};
@@ -1 +1 @@
1
- import{i as e,t as a}from"./_plugin-vue_export-helper-BeLZJZij.js";import{I as t,O as l,W as s,Z as i,_t as o,b as n,et as r,gt as d,ht as u,mt as p,p as c,st as m,w as g,x as h}from"./vue-vendor-BqZbbXHA.js";import{rt as f}from"./icons-DmFe4b5j.js";import{dt as v}from"./index-BKlAWTH-.js";import{n as y}from"./markdown-u082bbtj.js";import{a as w,c as k,i as b,n as x,o as j,r as _,s as E,t as M}from"./xml-CgY3RMlX.js";var V={key:0,class:"editor-container"},H=["innerHTML"],L={key:1,class:"placeholder-text"},B={class:"preview-hint"},I=a({__name:"MarkdownEditor",props:{modelValue:{type:String,default:""},placeholder:{type:String,default:"输入内容,支持 Markdown 格式..."},rows:{type:Number,default:10},minHeight:{type:Number,default:150},disabled:{type:Boolean,default:!1},defaultEditing:{type:Boolean,default:!1}},emits:["update:modelValue","edit","blur"],setup(a,{expose:I,emit:T}){const N=a,S=T,z=m(N.defaultEditing),D=m(null);function K(e,a){k.getLanguage(e)||k.registerLanguage(e,a)}K("javascript",E),K("typescript",j),K("json",w),K("bash",b),K("shell",b),K("sh",b),K("python",_),K("css",x),K("xml",M),K("html",M);const O=new y({html:!0,linkify:!0,typographer:!0,highlight:function(e,a){if(a&&k.getLanguage(a))try{return'<pre class="hljs"><code>'+k.highlight(e,{language:a,ignoreIllegals:!0}).value+"</code></pre>"}catch(t){}return'<pre class="hljs"><code>'+O.utils.escapeHtml(e)+"</code></pre>"}}),R=n(()=>O.render(N.modelValue||""));function U(){N.disabled||(z.value=!0,S("edit"),t(()=>{D.value?.focus()}))}function W(){z.value=!1,S("blur")}function Z(){setTimeout(()=>{W()},150)}function $(){W()}return i(()=>N.defaultEditing,e=>{e&&!z.value&&U()}),I({enterEditMode:U,exitEditMode:W,isEditing:z}),(t,i)=>(s(),g("div",{class:u(["markdown-editor",{"is-editing":z.value,"is-empty":!a.modelValue}])},[z.value?(s(),g("div",V,[l(p(v),{ref_key:"inputRef",ref:D,value:a.modelValue,type:"textarea",rows:a.rows,placeholder:a.placeholder,disabled:a.disabled,"onUpdate:value":i[0]||(i[0]=e=>t.$emit("update:modelValue",e)),onBlur:Z,onKeydown:c($,["esc"])},null,8,["value","rows","placeholder","disabled"]),i[1]||(i[1]=h("div",{class:"editor-hint"},[h("span",null,"按 Esc 退出编辑 | 支持 Markdown 格式")],-1))])):(s(),g("div",{key:1,class:"preview-container",style:d({minHeight:a.minHeight+"px"}),onDblclick:U},[a.modelValue?(s(),g("div",{key:0,class:"markdown-content",innerHTML:R.value},null,8,H)):(s(),g("div",L,o(a.placeholder||"双击编辑..."),1)),h("div",B,[l(p(e),{size:"12"},{default:r(()=>[l(p(f))]),_:1}),i[2]||(i[2]=h("span",null,"双击编辑",-1))])],36))],2))}},[["__scopeId","data-v-224a81d1"]]);export{I as t};
1
+ import{i as e,t as a}from"./_plugin-vue_export-helper-BeLZJZij.js";import{I as t,O as l,W as s,Z as i,_t as o,b as n,et as r,gt as d,ht as u,mt as p,p as c,st as m,w as g,x as h}from"./vue-vendor-BqZbbXHA.js";import{nt as f}from"./icons-B-AzZoeE.js";import{st as v}from"./index-BFqnddoI.js";import{n as y}from"./markdown-u082bbtj.js";import{a as w,c as k,i as b,n as x,o as j,r as _,s as E,t as M}from"./xml-CgY3RMlX.js";var V={key:0,class:"editor-container"},H=["innerHTML"],L={key:1,class:"placeholder-text"},B={class:"preview-hint"},I=a({__name:"MarkdownEditor",props:{modelValue:{type:String,default:""},placeholder:{type:String,default:"输入内容,支持 Markdown 格式..."},rows:{type:Number,default:10},minHeight:{type:Number,default:150},disabled:{type:Boolean,default:!1},defaultEditing:{type:Boolean,default:!1}},emits:["update:modelValue","edit","blur"],setup(a,{expose:I,emit:T}){const N=a,S=T,z=m(N.defaultEditing),D=m(null);function K(e,a){k.getLanguage(e)||k.registerLanguage(e,a)}K("javascript",E),K("typescript",j),K("json",w),K("bash",b),K("shell",b),K("sh",b),K("python",_),K("css",x),K("xml",M),K("html",M);const O=new y({html:!0,linkify:!0,typographer:!0,highlight:function(e,a){if(a&&k.getLanguage(a))try{return'<pre class="hljs"><code>'+k.highlight(e,{language:a,ignoreIllegals:!0}).value+"</code></pre>"}catch(t){}return'<pre class="hljs"><code>'+O.utils.escapeHtml(e)+"</code></pre>"}}),R=n(()=>O.render(N.modelValue||""));function U(){N.disabled||(z.value=!0,S("edit"),t(()=>{D.value?.focus()}))}function W(){z.value=!1,S("blur")}function Z(){setTimeout(()=>{W()},150)}function $(){W()}return i(()=>N.defaultEditing,e=>{e&&!z.value&&U()}),I({enterEditMode:U,exitEditMode:W,isEditing:z}),(t,i)=>(s(),g("div",{class:u(["markdown-editor",{"is-editing":z.value,"is-empty":!a.modelValue}])},[z.value?(s(),g("div",V,[l(p(v),{ref_key:"inputRef",ref:D,value:a.modelValue,type:"textarea",rows:a.rows,placeholder:a.placeholder,disabled:a.disabled,"onUpdate:value":i[0]||(i[0]=e=>t.$emit("update:modelValue",e)),onBlur:Z,onKeydown:c($,["esc"])},null,8,["value","rows","placeholder","disabled"]),i[1]||(i[1]=h("div",{class:"editor-hint"},[h("span",null,"按 Esc 退出编辑 | 支持 Markdown 格式")],-1))])):(s(),g("div",{key:1,class:"preview-container",style:d({minHeight:a.minHeight+"px"}),onDblclick:U},[a.modelValue?(s(),g("div",{key:0,class:"markdown-content",innerHTML:R.value},null,8,H)):(s(),g("div",L,o(a.placeholder||"双击编辑..."),1)),h("div",B,[l(p(e),{size:"12"},{default:r(()=>[l(p(f))]),_:1}),i[2]||(i[2]=h("span",null,"双击编辑",-1))])],36))],2))}},[["__scopeId","data-v-224a81d1"]]);export{I as t};
@@ -0,0 +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{o as _}from"./client-BgcNg4Bt.js";import{$ as C,E as j,Q as x,Y as $,a as D,b as S,nt as O,r as z,rt as M,st as U}from"./icons-B-AzZoeE.js";import{l as P}from"./light-C2X7hegj.js";import{a as J,c as N,i as A,l as E,n as R,o as q,r as L,s as T,t as B}from"./McpFormDrawer-B240mJ5y.js";import{n as W,t as Y}from"./useResponsiveDrawer-Ckgj760z.js";import{t as F}from"./DrawerContent-ChXgZ1Xm.js";import{Et as I,J as K,M as Q,O as Z,Y as G,j as H,k as V,rt as X,st as ee,ut as ae}from"./index-BFqnddoI.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"},$e={class:"batch-selected"},De={class:"batch-list"},Se={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"},Je={class:"batch-modal-footer"},Ne={class:"export-modal-content"},Ae={class:"export-info"},Ee={class:"export-modal-footer"},Re=t({__name:"McpDrawer",props:{visible:{type:Boolean,default:!1}},emits:["update:visible"],setup(t,{emit:Re}){const{drawerWidth:qe}=Y(720),Le=t,Te=Re,Be=p({get:()=>Le.visible,set:e=>Te("update:visible",e)}),We=k(!1),Ye=k({}),Fe=k(!1),Ie=k(null),Ke=v({}),Qe=k(null),Ze=k(null),Ge=k(!1),He=k(""),Ve=k(""),Xe=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(Ye.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(Ye.value)),{byCapability:da}=I(),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&&(Ye.value=e.servers)}catch(e){V.error("加载 MCP 服务器失败")}finally{We.value=!1}}async function wa(e){try{const a=await J(e);a.success&&(V.success(a.message),await ba())}catch(a){V.error("同步失败")}}async function _a(e){try{const a=await L(e);a.success&&(ra.value={format:a.format,content:a.content,filename:a.filename},la.value=!0)}catch(a){V.error("导出失败")}}async function Ca(){try{if("manual"===(await te(ra.value.content))?.method)return void V.warning("自动复制失败,已弹出手动复制框");V.success("已复制到剪贴板")}catch{V.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),V.success("下载成功")}function xa(){Qe.value=null}function $a(){Ie.value=null,Fe.value=!0}function Da(){ba()}function Sa(){Ve.value="",Xe.value=!0;try{let t,s=He.value.trim();if(!s)return Ve.value="请输入配置内容",void(Xe.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 Ve.value="JSON 格式错误:"+e.message,void(Xe.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 Ve.value="未找到有效的 MCP 服务器配置,请检查 JSON 格式",void(Xe.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 Ve.value="未找到有效的 MCP 服务器配置",void(Xe.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,Ge.value=!1):(Ie.value=l[0],Fe.value=!0,Ge.value=!1,He.value="")}catch(t){Ve.value="解析失败:"+t.message}finally{Xe.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 q(l),e++}catch(t){a++}}e>0?(V.success(`成功导入 ${e} 个服务器${a>0?`,${a} 个失败`:""}`),await ba()):V.error("导入失败"),ea.value=!1,He.value="",aa.value=[],ta.value=[]}catch(t){V.error("批量导入失败")}finally{sa.value=!1}}return c(()=>Le.visible,e=>{e&&ba()},{immediate:!0}),c(Ge,e=>{e||(Ve.value="")}),(t,c)=>{const v=r("McpServerDetailDrawer");return u(),b(m,null,[i(g(W),{show:Be.value,"onUpdate:show":c[2]||(c[2]=e=>Be.value=e),width:g(qe),placement:"right","show-mask":!0},{default:f(()=>[i(g(F),{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($))]),_:1}),c[13]||(c[13]=w("span",null,"MCP 服务器管理",-1))]),w("div",ne,[i(g(K),{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(x))]),_: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=>Ge.value=!0)},{icon:f(()=>[i(g(e),null,{default:f(()=>[i(g(U))]),_:1})]),default:f(()=>[c[15]||(c[15]=l(" 粘贴解析 ",-1))]),_:1}),i(g(a),{size:"small",type:"primary",onClick:$a},{icon:f(()=>[i(g(e),null,{default:f(()=>[i(g(C))]),_: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(K),{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(D))]),_: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:Ze},[(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 E(r),await ba()}catch(n){V.error("排序保存失败")}Qe.value=null}(e,r)},[w("div",pe,[w("div",fe,[i(g(e),{class:"drag-handle",size:14},{default:f(()=>[i(g(S))]),_: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(G),{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(G),null,{trigger:f(()=>[i(g(a),{quaternary:"",size:"tiny",loading:Ke[t.id],onClick:h(e=>async function(e){Ke[e.id]=!0,Ye.value[e.id].status="testing";try{const a=await T(e.id);if(a.success){const t=a.result;Ye.value[e.id].status=t.success?"online":"error",Ye.value[e.id].lastChecked=Date.now(),t.success?V.success(`${e.name||e.id}: ${t.message} (${t.duration}ms)`):se(V,t,"测试失败",`${e.name||e.id}: `)}}catch(a){Ye.value[e.id].status="error",se(V,a,"测试失败",`${e.name||e.id}: `)}finally{Ke[e.id]=!1}}(t),["stop"])},{icon:f(()=>[i(g(e),null,{default:f(()=>[i(g(j))]),_: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){Ie.value=e,Fe.value=!0}(t),["stop"])},{icon:f(()=>[i(g(e),null,{default:f(()=>[i(g(O))]),_:1})]),_:1},8,["onClick"]),i(g(a),{quaternary:"",size:"tiny",onClick:h(e=>function(e){Z.warning({title:"删除确认",content:`确定要删除 MCP 服务器 "${e.name||e.id}" 吗?此操作将从所有平台配置中移除该服务器。`,positiveText:"删除",negativeText:"取消",onPositiveClick:async()=>{try{(await R(e.id)).success&&(delete Ye.value[e.id],V.success("删除成功"))}catch(a){V.error("删除失败")}}})}(t),["stop"])},{icon:f(()=>[i(g(e),null,{default:f(()=>[i(g(z))]),_: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(H),{size:"small",value:!0===t.apps?.[e.key],"onUpdate:value":a=>async function(e,a,t){try{const s=await N(e,a,t);s.success&&(Ye.value[e]=s.server,V.success(`已${t?"启用":"禁用"} ${a}`))}catch(s){V.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($))]),_: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(B,{visible:Fe.value,"onUpdate:visible":c[3]||(c[3]=e=>Fe.value=e),"editing-server":Ie.value,"existing-ids":ca.value,platforms:va.value,onSaved:Da},null,8,["visible","editing-server","existing-ids","platforms"]),i(g(P),{show:Ge.value,"onUpdate:show":c[6]||(c[6]=e=>Ge.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=>Ge.value=!1)},{default:f(()=>[...c[23]||(c[23]=[l("取消",-1)])]),_:1}),i(g(a),{type:"primary",onClick:Sa,loading:Xe.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:He.value,"onUpdate:value":c[4]||(c[4]=e=>He.value=e),type:"textarea",placeholder:"在此粘贴 JSON 配置...",rows:8,status:Ve.value?"error":void 0},null,8,["value","status"]),Ve.value?(u(),b("p",_e,d(Ve.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",Je,[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(X),{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",$e,"已选择 "+d(ta.value.length)+" 个",1)]),w("div",De,[(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(X),{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",Se,[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",Ee,[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(M))]),_: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(x))]),_:1})]),default:f(()=>[c[29]||(c[29]=l(" 下载 ",-1))]),_:1})])]),default:f(()=>[w("div",Ne,[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{Re as default};
@@ -0,0 +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 D,_t as A,at as B,b as V,dt as z,et as T,g as E,ht as F,mt as L,nt as M,st as q,ut as N,w as K,x as W}from"./vue-vendor-BqZbbXHA.js";import{t as G}from"./client-BgcNg4Bt.js";import{$ as Z,At as Y,Nt as H,R as Q,h as X,jt as J,q as ee,yt as ae}from"./icons-B-AzZoeE.js";import{n as te,t as le}from"./CollapseItem-kJkiHxFl.js";import{n as re,t as se}from"./useResponsiveDrawer-Ckgj760z.js";import{t as ne}from"./DrawerContent-ChXgZ1Xm.js";import{Et as ie,M as oe,U as ue,X as de,Y as ce,Z as pe,_t as ve,ht as me,j as fe,k as he,st as ge}from"./index-BFqnddoI.js";import{s as ye}from"./project-config-BVt5s-pH.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(ge,{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(ge,{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(ge,{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,ue,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(ve,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(ve,null)})])}))}});async function De(){return(await G.get("/mcp/servers")).data}async function Ae(e){return(await G.post("/mcp/servers",e)).data}async function Be(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 Te(e){return(await G.post(`/mcp/servers/${e}/test`)).data}async function Ee(e){return(await G.post("/mcp/servers/order",{serverIds:e})).data}async function Fe(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"},Ze=["onClick"],Ye={class:"form-group"},He={class:"group-title"},Qe={class:"field"},Xe={key:0,class:"field-error"},Je={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}=ie(),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=B({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 he.error("请输入服务器 ID");if(w.value)return void he.error(w.value);if("stdio"===h.value&&!f.server.command?.trim())return void he.error("请输入命令");if(("streamable_http"===h.value||"sse"===h.value)&&!f.server.url?.trim())return void he.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 Ae(a)).success&&(he.success(n.value?"保存成功":"添加成功"),r("saved"),s.value=!1)}catch(t){he.error(t.response?.data?.error||"保存失败")}finally{d.value=!1}}return D(()=>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))}),D(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:T(()=>[S(L(ne),{closable:"","native-scrollbar":!1},{header:T(()=>[W("div",Le,[S(L(y),{quaternary:"",size:"small",onClick:r[0]||(r[0]=e=>s.value=!1)},{icon:T(()=>[S(L(m),null,{default:T(()=>[S(L(Y))]),_:1})]),_:1}),W("span",Me,A(n.value?"编辑 MCP 服务器":"添加 MCP 服务器"),1)])]),footer:T(()=>[W("div",qe,[S(L(y),{onClick:r[1]||(r[1]=e=>s.value=!1)},{default:T(()=>[...r[15]||(r[15]=[P("取消",-1)])]),_:1}),S(L(y),{type:"primary",loading:d.value,onClick:_},{default:T(()=>[P(A(n.value?"保存":"添加"),1)]),_:1},8,["loading"])])]),default:T(()=>[S(L(oe),{show:o.value},{default:T(()=>[W("div",Ne,[n.value?$("",!0):(R(),K("div",Ke,[W("div",We,[S(L(m),{size:16,class:"group-icon"},{default:T(()=>[S(L(ee))]),_:1}),r[16]||(r[16]=W("span",null,"快速选择",-1))]),W("div",Ge,[W("div",{class:F(["preset-chip",{active:-1===u.value}]),onClick:j},[S(L(m),{size:14},{default:T(()=>[S(L(H))]),_:1}),r[17]||(r[17]=W("span",null,"自定义",-1))],2),(R(!0),K(E,null,U(i.value,(e,a)=>(R(),O(L(ce),{key:e.id,disabled:!x(e.id)},{trigger:T(()=>[W("div",{class:F(["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(A(e.id)+" ",1),x(e.id)?(R(),O(L(m),{key:0,size:12,class:"installed-icon"},{default:T(()=>[S(L(ae))]),_:1})):$("",!0)],10,Ze)]),default:T(()=>[r[18]||(r[18]=P(" 已安装 ",-1))]),_:2},1032,["disabled"]))),128))])])),W("div",Ye,[W("div",He,[S(L(m),{size:16,class:"group-icon"},{default:T(()=>[S(L(Q))]),_: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(ge),{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",Xe,A(w.value),1)):$("",!0)]),W("div",Je,[r[21]||(r[21]=W("label",{class:"field-label"},"显示名称",-1)),S(L(ge),{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:T(()=>[S(L(J))]),_:1}),r[22]||(r[22]=W("span",null,"启用平台",-1))]),W("div",ta,[(R(!0),K(E,null,U(p.value,e=>(R(),K("label",{key:e.key,class:"platform-item"},[S(L(fe),{size:"small",value:f.apps[e.key],"onUpdate:value":a=>f.apps[e.key]=a},null,8,["value","onUpdate:value"]),W("span",la,A(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:T(()=>[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(de),{value:h.value,"onUpdate:value":r[4]||(r[4]=e=>h.value=e),class:"type-radios"},{default:T(()=>[S(L(pe),{value:"stdio"},{default:T(()=>[...r[24]||(r[24]=[W("span",{class:"radio-label"},"stdio",-1),W("span",{class:"radio-desc"},"本地命令",-1)])]),_:1}),S(L(pe),{value:"streamable_http"},{default:T(()=>[...r[25]||(r[25]=[W("span",{class:"radio-label"},"streamable_http",-1)])]),_:1}),S(L(pe),{value:"sse"},{default:T(()=>[...r[26]||(r[26]=[W("span",{class:"radio-label"},"sse",-1)])]),_:1})]),_:1},8,["value"])]),"stdio"===h.value?(R(),K(E,{key:0},[W("div",oa,[r[28]||(r[28]=W("label",{class:"field-label"},[P(" 命令 "),W("span",{class:"required"},"*")],-1)),S(L(ge),{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:T(({value:e})=>[W("div",ca,[S(L(ge),{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(ge),{value:e.value,"onUpdate:value":a=>e.value=a,placeholder:"值",class:"kv-value"},null,8,["value","onUpdate:value"])])]),_:1},8,["value"])])],64)):(R(),K(E,{key:1},[W("div",pa,[r[32]||(r[32]=W("label",{class:"field-label"},[P(" URL "),W("span",{class:"required"},"*")],-1)),S(L(ge),{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:T(({value:e})=>[W("div",ma,[S(L(ge),{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(ge),{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:T(()=>[S(L(le),{name:"extra"},{header:T(()=>[W("div",fa,[S(L(m),{size:16,class:"group-icon"},{default:T(()=>[S(L(Z))]),_:1}),r[35]||(r[35]=W("span",null,"附加信息",-1)),r[36]||(r[36]=W("span",{class:"collapse-hint"},"(可选)",-1))])]),default:T(()=>[W("div",ha,[W("div",ga,[r[37]||(r[37]=W("label",{class:"field-label"},"描述",-1)),S(L(ge),{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(ge),{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(ge),{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(ge),{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,De as i,Ee as l,Be as n,Ae as o,Fe as r,Te 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-0eavxNvt.js";import{t as l}from"./PluginsPanel-Bs5qZ-TK.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
+ 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-C2X7hegj.js";import{t as l}from"./PluginsPanel-kX14E_DT.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-V_onl9NV.js";import{t as n}from"./DrawerContent-ChXgZ1Xm.js";import{t as u}from"./PluginsPanel-Bs5qZ-TK.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
+ 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-Ckgj760z.js";import{t as n}from"./DrawerContent-ChXgZ1Xm.js";import{t as u}from"./PluginsPanel-kX14E_DT.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};
@@ -0,0 +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 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};
@@ -0,0 +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 r,I as n,K as o,O as i,S as u,V as c,W as d,Z as p,_t as v,b as m,et as f,f as y,g as h,gt as g,i as j,m as _,mt as k,p as b,r as w,st as x,tt as C,w as z,x as $}from"./vue-vendor-BqZbbXHA.js";import{r as N,t as P}from"./platforms-mqqe_82d.js";import{K as M,Nt as A,g as I,i as T,r as D}from"./icons-B-AzZoeE.js";import{l as K}from"./light-C2X7hegj.js";import{t as L}from"./headers-DbowkmZJ.js";import{$ as U,A as S,H as E,M as H,O as R,ct as q,ft as O,k as F,st as V,ut as W}from"./index-BFqnddoI.js";import{t as Z}from"./clipboard-B46yyoz_.js";import{p as B,t as G}from"./sessions-CaWUaysM.js";import{n as J,t as Q}from"./sessions-53-Fr68H.js";import{n as X,t as Y}from"./session-visibility-BAmxh3cK.js";var ee={class:"card-content"},ae={class:"header-row"},te={class:"project-name"},se={class:"stats-row"},le=t({__name:"ProjectCard",props:{project:{type:Object,required:!0}},emits:["click","delete"],setup(t,{emit:r}){const n=t,o=r,c=x(!1);function p(){o("click")}function h(){o("delete",n.project)}const g=m(()=>n.project?.displayName||n.project?.name||""),j=m(()=>n.project?.path||n.project?.fullPath||n.project?.name||""),b=m(()=>n.project?.sessionCount||0),w=m(()=>n.project?.lastUsed),N=m(()=>{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 P(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,r)=>(d(),z("div",{class:"project-card",onClick:p,onMouseenter:r[0]||(r[0]=e=>c.value=!0),onMouseleave:r[1]||(r[1]=e=>c.value=!1)},[$("div",ee,[$("div",ae,[i(k(e),{size:"18",color:N.value},{default:f(()=>[i(k(M))]),_:1},8,["color"]),$("span",te,v(g.value),1),C(i(k(a),{text:"",type:"error",size:"tiny",class:"delete-btn",onClick:_(h,["stop"])},{icon:f(()=>[i(k(e),{size:"14"},{default:f(()=>[i(k(D))]),_:1})]),_:1},512),[[y,c.value]])]),i(k(S),{depth:"3",class:"project-path"},{default:f(()=>[l(v(j.value),1)]),_:1}),$("div",se,[i(k(W),{size:"tiny",bordered:!1,type:"success"},{default:f(()=>[l(v(b.value)+" 会话 ",1)]),_:1}),w.value?(d(),u(k(S),{key:0,depth:"3",class:"last-used"},{default:f(()=>[l(v(P(w.value)),1)]),_:1})):s("",!0)])])],32))}},[["__scopeId","data-v-3a18e66d"]]),re={class:"project-list-container"},ne={class:"header"},oe={class:"header-text"},ie={key:0,class:"loading-container"},ue={key:1,class:"loading-container compact"},ce={key:3,class:"projects-grid"},de={class:"search-hint"},pe={style:{"margin-bottom":"16px"}},ve={key:0,style:{"max-height":"60vh","overflow-y":"auto"}},me={class:"search-result-header"},fe={class:"search-result-title"},ye=t({__name:"ProjectList",setup(t){const y=j(),_=w(),C=Q(),D=P(),ee=m(()=>N(_)),ae=ee.value,te=x("");let se=null;const ye=x([]),he=x(null),ge=x(!1),je=x(""),_e=x(null),ke=x(!1),be=x(null),we=x("workspace"),xe=x(null),Ce=[{label:"全工作区",value:"workspace"},{label:"当前项目",value:"current"},{label:"指定项目",value:"project"}],ze=m(()=>C.currentProject||ye.value[0]?.name||null),$e=m(()=>{const e=ye.value.find(e=>e.name===ze.value);return e?.displayName||e?.name||ze.value||"未选择项目"}),Ne=e=>e.map(e=>({label:e.displayName&&e.displayName!==e.name?`${e.displayName} (${e.name})`:e.name,value:e.name})),Pe=x([]);function Me(e){const a=e.fullPath||e.name,t=e.sessionCount||0;R.warning({title:"删除项目",content:`确定要删除项目 "${a}" 吗?\n\n当前项目包含 ${t} 个会话,删除后所有会话数据将无法恢复!`,positiveText:"确定删除",negativeText:"取消",onPositiveClick:async()=>{try{await C.deleteProject(e.name),F.success("项目已删除")}catch(a){F.error("删除失败: "+a.message)}}})}async function Ae(){try{const a=(e=ee.value,D.get(e)?.command||e);if("manual"===(await Z(a))?.method)return void F.warning("自动复制失败,已弹出手动复制框");F.success("基础启动命令已复制到剪贴板")}catch(a){F.error("复制失败: "+a.message)}var e}async function Ie(){if(!je.value)return;let e=null;if("current"===we.value){if(e=ze.value,!e)return void F.warning("当前没有可搜索的项目")}else if("project"===we.value&&(e=xe.value,!e))return void F.warning("请选择要搜索的项目");ke.value=!0;try{const a=await B(je.value,35,ee.value,{projectName:e,limit:35}),t=X(Array.isArray(a?.sessions)?a.sessions:Array.isArray(a)?a:[]);_e.value={...a&&"object"==typeof a&&!Array.isArray(a)?a:{},keyword:je.value,sessions:t,totalMatches:t.reduce((e,a)=>e+(Number(a.matchCount)||0),0),scope:we.value,projectName:e}}catch(a){F.error("搜索失败: "+a.message)}finally{ke.value=!1}}async function Te(e){const a=String(e||"").trim();if(a)try{const e=await J(ee.value,{page:1,limit:50,query:a}),t=Y(e?.projects);Pe.value=Ne(t)}catch(t){}else Pe.value=Ne(ye.value)}function De(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 Ke(e){(e.metaKey||e.ctrlKey)&&"k"===e.key&&(e.preventDefault(),ge.value=!0,n(()=>{be.value?.focus()}))}return p(ye,e=>{Pe.value=Ne(e)},{immediate:!0}),p(()=>C.projects,e=>{ye.value=[...e]}),p(te,e=>{se&&clearTimeout(se),se=setTimeout(()=>{C.fetchProjects({query:e}).catch(()=>{})},180)}),p(ge,e=>{e||(je.value="",_e.value=null,we.value="workspace",xe.value=null)}),p(ee,e=>{C.setChannel(e),C.fetchProjects()},{immediate:!0}),c(()=>{document.addEventListener("keydown",Ke)}),r(()=>{se&&clearTimeout(se),C.pauseProjectRefresh(ae),document.removeEventListener("keydown",Ke)}),(t,r)=>(d(),z("div",re,[$("div",ne,[$("div",oe,[i(k(L),{style:{margin:"0"}},{default:f(()=>[...r[5]||(r[5]=[l("我的项目",-1)])]),_:1}),i(k(S),{depth:"3"},{default:f(()=>[l("选择一个项目查看会话(共 "+v(k(C).projects.length)+" 个)",1)]),_:1})]),i(k(E),null,{default:f(()=>[i(k(a),{type:"primary",size:"medium",onClick:Ae},{icon:f(()=>[i(k(e),null,{default:f(()=>[i(k(A))]),_:1})]),default:f(()=>[r[6]||(r[6]=l(" 新建项目 ",-1))]),_:1}),i(k(V),{value:te.value,"onUpdate:value":r[0]||(r[0]=e=>te.value=e),placeholder:"搜索项目...",clearable:"",class:"search-input"},{prefix:f(()=>[i(k(e),null,{default:f(()=>[i(k(I))]),_:1})]),_:1},8,["value"])]),_:1})]),$("div",{class:"content",ref_key:"contentEl",ref:he},[k(C).loading&&0===k(C).projects.length&&!k(C).projectsPending?(d(),z("div",ie,[i(k(H),{size:"large"},{description:f(()=>[...r[7]||(r[7]=[l(" 加载项目列表... ",-1)])]),_:1})])):k(C).projectsPending?(d(),z("div",ue,[i(k(H),{size:"small"},{description:f(()=>[...r[8]||(r[8]=[l(" 正在生成项目列表... ",-1)])]),_:1})])):k(C).error&&0===k(C).projects.length?(d(),u(k(q),{key:2,type:"error",title:"加载失败",style:{"margin-top":"20px"}},{default:f(()=>[l(v(k(C).error),1)]),_:1})):ye.value.length>0?(d(),z("div",ce,[(d(!0),z(h,null,o(ye.value,e=>(d(),u(le,{key:e.name,project:e,onClick:a=>{return t=e.name,void y.push({name:"cli-sessions",params:{platform:ee.value,projectName:t}});var t},onDelete:Me},null,8,["project","onClick"]))),128))])):s("",!0),k(C).loading||k(C).error||k(C).projectsPending||0!==k(C).projects.length?s("",!0):(d(),u(k(O),{key:4,description:te.value?"没有匹配的项目":"没有找到项目",style:{"margin-top":"60px"}},{icon:f(()=>[i(k(e),null,{default:f(()=>[i(k(M))]),_:1})]),_:1},8,["description"]))],512),$("div",de,[i(k(S),{depth:"3",style:{"font-size":"12px"}},{default:f(()=>[...r[9]||(r[9]=[$("kbd",null,"Cmd",-1),l(" / ",-1),$("kbd",null,"Ctrl",-1),l(" + ",-1),$("kbd",null,"K",-1),l(" 全局搜索 ",-1)])]),_:1})]),i(k(K),{show:ge.value,"onUpdate:show":r[4]||(r[4]=e=>ge.value=e),preset:"card",title:"全局搜索",style:g([{width:"800px","max-width":"90vw"},{marginTop:"80px"}])},{default:f(()=>[$("div",pe,[i(k(V),{ref_key:"globalSearchInputRef",ref:be,value:je.value,"onUpdate:value":r[1]||(r[1]=e=>je.value=e),placeholder:"搜索对话内容...",clearable:"",onKeyup:b(Ie,["enter"]),disabled:ke.value},{prefix:f(()=>[i(k(e),null,{default:f(()=>[i(k(I))]),_:1})]),suffix:f(()=>[i(k(a),{text:"",onClick:Ie,disabled:!je.value||ke.value,loading:ke.value},{default:f(()=>[...r[10]||(r[10]=[l(" 搜索 ",-1)])]),_:1},8,["disabled","loading"])]),_:1},8,["value","disabled"])]),i(k(E),{align:"center",style:{"margin-bottom":"16px"}},{default:f(()=>[i(k(S),{depth:"3"},{default:f(()=>[...r[11]||(r[11]=[l("搜索范围",-1)])]),_:1}),i(k(U),{value:we.value,"onUpdate:value":r[2]||(r[2]=e=>we.value=e),size:"small",options:Ce,style:{width:"130px"},disabled:ke.value},null,8,["value","disabled"]),"project"===we.value?(d(),u(k(U),{key:0,value:xe.value,"onUpdate:value":r[3]||(r[3]=e=>xe.value=e),size:"small",filterable:"",remote:"",clearable:"",placeholder:"选择项目",options:Pe.value,onSearch:Te,style:{"min-width":"240px"},disabled:ke.value},null,8,["value","options","disabled"])):"current"===we.value&&ze.value?(d(),u(k(W),{key:1,size:"small",bordered:!1},{default:f(()=>[l(v($e.value),1)]),_:1})):s("",!0)]),_:1}),_e.value?(d(),z("div",ve,[i(k(q),{type:"info",style:{"margin-bottom":"16px"}},{default:f(()=>[l(' 关键词 "'+v(_e.value.keyword)+'" 共找到 '+v(_e.value.totalMatches)+" 处匹配 ",1)]),_:1}),(d(!0),z(h,null,o(_e.value.sessions,t=>(d(),z("div",{key:`${t.channel||ee.value}-${t.projectName}-${t.projectFullPath||""}-${t.sessionId}`,class:"search-result-item"},[$("div",me,[$("div",fe,[i(k(S),{strong:"",style:{"font-size":"15px","font-weight":"700"}},{default:f(()=>[l(v(t.projectDisplayName),1)]),_:2},1024),i(k(S),{depth:"2",style:{margin:"0 8px"}},{default:f(()=>[...r[12]||(r[12]=[l("·",-1)])]),_:1}),i(k(S),{strong:""},{default:f(()=>[l(v(t.alias?`${t.alias} (${t.sessionId.substring(0,8)})`:t.sessionId.substring(0,8)),1)]),_:2},1024),i(k(W),{size:"small",bordered:!1},{default:f(()=>[l(v(t.matchCount)+" 个匹配",1)]),_:2},1024)]),i(k(a),{size:"small",type:"primary",onClick:e=>async function(e,a,t=ee.value){try{const{copyResult:s}=await G(e,a,t||ee.value);"manual"===s?.method?F.warning("自动复制失败,已弹出手动复制框"):F.success("启动命令已复制到剪贴板"),ge.value=!1}catch(s){F.error("复制失败: "+s.message)}}(t.projectName,t.sessionId,t.channel)},{icon:f(()=>[i(k(e),null,{default:f(()=>[i(k(T))]),_:1})]),default:f(()=>[r[13]||(r[13]=l(" 使用对话 ",-1))]),_:1},8,["onClick"])]),(d(!0),z(h,null,o(t.matches,(e,a)=>(d(),z("div",{key:a,class:"search-match"},[i(k(W),{size:"tiny",type:"user"===e.role?"info":"success",bordered:!1},{default:f(()=>[l(v("user"===e.role?"用户":"助手"),1)]),_:2},1032,["type"]),i(k(S),{depth:"3",class:"search-match-text",innerHTML:De(e.context,_e.value.keyword)},null,8,["innerHTML"])]))),128))]))),128)),0===_e.value.sessions.length?(d(),u(k(O),{key:0,description:"没有找到匹配的内容"})):s("",!0)])):s("",!0)]),_:1},8,["show"])]))}},[["__scopeId","data-v-dda709bc"]]);export{ye as default};
@@ -0,0 +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 u,Z as c,_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 k}from"./vue-vendor-BqZbbXHA.js";import{t as h}from"./client-BgcNg4Bt.js";import{$ as _,Nt as w,Q as z,R as P,dt as j,jt as x,nt as C,r as B,st as I,x as D,yt as U}from"./icons-B-AzZoeE.js";import{n as $,t as O}from"./useResponsiveDrawer-Ckgj760z.js";import{t as q}from"./DrawerContent-ChXgZ1Xm.js";import{Et as A,J as E,M as T,O as L,Y as M,j as S,k as V,st as W,ut as R}from"./index-BFqnddoI.js";import{t as Z}from"./MarkdownEditor-D75GGt5X.js";var F={class:"form-header"},J={class:"form-container"},K={class:"form-section"},N={class:"section-title"},Q={class:"form-item"},Y={key:0,class:"form-error"},G={class:"form-item"},H={class:"form-item"},X={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,j=f,C=p({get:()=>z.visible,set:e=>j("update:visible",e)}),B=p(()=>!!z.editingPreset),{byCapability:D}=A(),U=p(()=>z.platforms.length>0?z.platforms:D("prompts"));function E(){return Object.fromEntries(U.value.map(e=>[e.key,!0]))}const T=g(!1),L=g(""),M=d({id:"",name:"",description:"",content:"",apps:{}});async function R(){if(M.id.trim()?/^[a-zA-Z0-9_-]+$/.test(M.id)?!B.value&&z.existingIds.includes(M.id)?(L.value="该 ID 已被使用",0):(L.value="",1):(L.value="ID 只能包含字母、数字、下划线和连字符",0):(L.value="预设 ID 不能为空",0))if(M.name.trim()){T.value=!0;try{const e={id:M.id.trim(),name:M.name.trim(),description:M.description.trim(),content:M.content,apps:B.value?{...M.apps}:Object.fromEntries(U.value.map(e=>[e.key,!0===M.apps[e.key]]))};z.editingPreset?.isBuiltin&&(e.isBuiltin=!0),(await async function(e){return(await h.post("/prompts/presets",e)).data}(e)).success&&(V.success(B.value?"保存成功":"创建成功"),j("saved"),C.value=!1)}catch(e){V.error("保存失败: "+e.message)}finally{T.value=!1}}else V.error("预设名称不能为空")}function re(){C.value=!1}return c(()=>z.visible,e=>{e&&(z.editingPreset?(M.id=z.editingPreset.id||"",M.name=z.editingPreset.name||"",M.description=z.editingPreset.description||"",M.content=z.editingPreset.content||"",M.apps=z.editingPreset.apps?{...z.editingPreset.apps}:E()):(M.id="",M.name="",M.description="",M.content="",M.apps=E()),L.value="")}),(c,d)=>(u(),r(y($),{show:C.value,"onUpdate:show":d[4]||(d[4]=e=>C.value=e),width:y(w),placement:"right","show-mask":!0},{default:v(()=>[n(y(q),{closable:"","native-scrollbar":!1},{header:v(()=>[k("div",F,[n(y(e),{size:18,class:"header-icon"},{default:v(()=>[n(y(_))]),_:1}),k("span",null,o(B.value?"编辑预设":"新建预设"),1)])]),footer:v(()=>[k("div",ne,[n(y(a),{onClick:re},{default:v(()=>[...d[12]||(d[12]=[l("取消",-1)])]),_:1}),n(y(a),{type:"primary",onClick:R,loading:T.value},{default:v(()=>[l(o(B.value?"保存":"创建"),1)]),_:1},8,["loading"])])]),default:v(()=>[k("div",J,[k("div",K,[k("div",N,[n(y(e),{size:16},{default:v(()=>[n(y(P))]),_:1}),d[5]||(d[5]=k("span",null,"基本信息",-1))]),k("div",Q,[d[6]||(d[6]=k("label",{class:"form-label"},[l("预设 ID "),k("span",{class:"required"},"*")],-1)),n(y(W),{value:M.id,"onUpdate:value":d[0]||(d[0]=e=>M.id=e),placeholder:"唯一标识符,如 my-preset",disabled:B.value&&s.editingPreset?.isBuiltin},null,8,["value","disabled"]),L.value?(u(),b("p",Y,o(L.value),1)):t("",!0)]),k("div",G,[d[7]||(d[7]=k("label",{class:"form-label"},[l("名称 "),k("span",{class:"required"},"*")],-1)),n(y(W),{value:M.name,"onUpdate:value":d[1]||(d[1]=e=>M.name=e),placeholder:"预设名称"},null,8,["value"])]),k("div",H,[d[8]||(d[8]=k("label",{class:"form-label"},"描述",-1)),n(y(W),{value:M.description,"onUpdate:value":d[2]||(d[2]=e=>M.description=e),placeholder:"简短描述这个预设的用途"},null,8,["value"])])]),k("div",X,[k("div",ee,[n(y(e),{size:16},{default:v(()=>[n(y(x))]),_:1}),d[9]||(d[9]=k("span",null,"生效范围",-1))]),k("div",ae,[(u(!0),b(m,null,i(U.value,e=>(u(),b("label",{key:e.key,class:"app-toggle"},[n(y(S),{value:M.apps[e.key],"onUpdate:value":a=>M.apps[e.key]=a},null,8,["value","onUpdate:value"]),k("span",se,o(e.promptLabel||e.label||e.title||e.key),1)]))),128)),0===U.value.length?(u(),b("span",te," 当前没有可用的 Prompt 平台 ")):t("",!0)])]),k("div",le,[k("div",ie,[n(y(e),{size:16},{default:v(()=>[n(y(I))]),_:1}),d[10]||(d[10]=k("span",null,"提示词内容",-1)),d[11]||(d[11]=k("span",{class:"content-hint"},"支持 Markdown 格式",-1))]),n(Z,{modelValue:M.content,"onUpdate:modelValue":d[3]||(d[3]=e=>M.content=e),rows:16,"min-height":300,placeholder:"# 系统提示词\n\n在这里编写你的系统提示词..."},null,8,["modelValue"])])])]),_:1})]),_:1},8,["show","width"]))}},[["__scopeId","data-v-1e68a77e"]]),ue={class:"drawer-header"},ce={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"},ke={key:0,class:"empty-state"},he={key:1,class:"preset-cards"},_e={class:"card-header"},we={class:"card-title"},ze={class:"preset-name"},Pe={class:"card-actions"},je={key:0,class:"card-desc"},xe={class:"card-apps"},Ce={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:P}=O(720),x=s,I=d,S=p({get:()=>x.visible,set:e=>I("update:visible",e)}),W=g(!1),Z=g({}),F=g(null),J=g(!1),K=g(null),N=g(null),Q=g(!1),{byCapability:Y}=A(),G=p(()=>Y("prompts")),H=p(()=>{const e=Object.values(Z.value),a=e.filter(e=>!e.isBuiltin),s=e.filter(e=>e.isBuiltin);return a.sort((e,a)=>e.id===F.value?-1:a.id===F.value?1:(a.updatedAt||0)-(e.updatedAt||0)),[...a,...s]}),X=p(()=>H.value.length),ee=p(()=>Object.keys(Z.value)),ae=p(()=>F.value?Z.value[F.value]:null),se=p(()=>{const e=H.value;return{builtin:e.filter(e=>e.isBuiltin).length,custom:e.filter(e=>!e.isBuiltin).length}}),te=p(()=>G.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(){W.value=!0;try{const e=await async function(){return(await h.get("/prompts/presets")).data}();e.success&&(Z.value=e.presets,F.value=e.activePresetId)}catch(e){V.error("加载预设失败")}finally{W.value=!1}}async function ne(e){N.value=e.id;try{(await async function(e){return(await h.post(`/prompts/presets/${e}/activate`)).data}(e.id)).success&&(F.value=e.id,V.success(`已激活预设 "${e.name}"`))}catch(a){V.error("激活失败: "+a.message)}finally{N.value=null}}async function Ie(){L.warning({title:"移除提示词",content:"确定要移除当前激活的提示词吗?这将删除各平台的提示词文件。",positiveText:"移除",negativeText:"取消",onPositiveClick:async()=>{Q.value=!0;try{(await async function(){return(await h.post("/prompts/deactivate")).data}()).success&&(F.value=null,V.success("已移除提示词"))}catch(e){V.error("移除失败: "+e.message)}finally{Q.value=!1}}})}function De(e){L.warning({title:"删除确认",content:`确定要删除预设 "${e.name}" 吗?此操作不可恢复。`,positiveText:"删除",negativeText:"取消",onPositiveClick:async()=>{try{(await async function(e){return(await h.delete(`/prompts/presets/${e}`)).data}(e.id)).success&&(delete Z.value[e.id],V.success("删除成功"))}catch(a){V.error("删除失败: "+a.message)}}})}async function Ue(e){try{const a=await async function(e,a){return(await h.post(`/prompts/import/${e}`,{name:a})).data}(e);a.success&&(Z.value[a.preset.id]=a.preset,V.success(a.message))}catch(a){V.error("导入失败: "+a.message)}}function $e(){K.value=null,J.value=!0}function Oe(){ie()}return c(()=>x.visible,e=>{e&&ie()},{immediate:!0}),(s,c)=>(u(),b(m,null,[n(y($),{show:S.value,"onUpdate:show":c[0]||(c[0]=e=>S.value=e),width:y(P),placement:"right","show-mask":!0},{default:v(()=>[n(y(q),{title:"Prompts 管理",closable:"","native-scrollbar":!1},{header:v(()=>[k("div",ue,[k("div",ce,[n(y(e),{size:20,class:"header-icon"},{default:v(()=>[n(y(_))]),_:1}),c[2]||(c[2]=k("span",null,"Prompts 管理",-1))])])]),default:v(()=>[k("div",oe,[k("div",de,[k("div",pe,[ae.value?(u(),b(m,{key:0},[n(y(e),{class:"status-icon active",size:18},{default:v(()=>[n(y(U))]),_:1}),k("div",ve,[c[3]||(c[3]=k("span",{class:"status-label"},"当前激活:",-1)),k("span",me,o(ae.value.name),1)])],64)):(u(),b(m,{key:1},[n(y(e),{class:"status-icon inactive",size:18},{default:v(()=>[n(y(D))]),_:1}),c[4]||(c[4]=k("div",{class:"status-text"},[k("span",{class:"status-label"},"未激活任何提示词")],-1))],64))]),k("div",fe,[n(y(E),{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(z))]),_:1})]),default:v(()=>[c[5]||(c[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(w))]),_:1})]),default:v(()=>[c[6]||(c[6]=l(" 新建 ",-1))]),_:1}),ae.value?(u(),r(y(M),{key:0,trigger:"hover"},{trigger:v(()=>[n(y(a),{size:"small",quaternary:"",class:"action-btn remove-btn",onClick:Ie,loading:Q.value},{icon:v(()=>[n(y(e),{size:16},{default:v(()=>[n(y(j))]),_:1})]),default:v(()=>[c[7]||(c[7]=l(" 移除 ",-1))]),_:1},8,["loading"])]),default:v(()=>[c[8]||(c[8]=l(" 删除各平台的提示词文件 ",-1))]),_:1})):t("",!0)])]),k("div",ye,[k("span",ge,[l(" 共 "+o(X.value)+" 个预设 ",1),X.value>0?(u(),b(m,{key:0},[l(" · 自定义: "+o(se.value.custom)+" · 内置模板: "+o(se.value.builtin),1)],64)):t("",!0)])]),k("div",be,[n(y(T),{show:W.value},{default:v(()=>[0!==H.value.length||W.value?(u(),b("div",he,[(u(!0),b(m,null,i(H.value,s=>(u(),b("div",{key:s.id,class:f(["preset-card",{active:s.id===F.value}])},[k("div",_e,[k("div",we,[s.id===F.value?(u(),r(y(e),{key:0,class:"active-icon",size:16},{default:v(()=>[n(y(U))]),_:1})):t("",!0),k("span",ze,o(s.name),1),s.isBuiltin?(u(),r(y(R),{key:1,size:"tiny",bordered:!1,type:"info"},{default:v(()=>[...c[11]||(c[11]=[l("模板",-1)])]),_:1})):t("",!0),s.isImported?(u(),r(y(R),{key:2,size:"tiny",bordered:!1,type:"warning"},{default:v(()=>[...c[12]||(c[12]=[l("已导入",-1)])]),_:1})):t("",!0)]),k("div",Pe,[s.id!==F.value?(u(),r(y(a),{key:0,size:"tiny",type:"primary",onClick:e=>ne(s),loading:N.value===s.id},{default:v(()=>[...c[13]||(c[13]=[l(" 激活 ",-1)])]),_:1},8,["onClick","loading"])):t("",!0),n(y(a),{quaternary:"",size:"tiny",onClick:e=>function(e){K.value=e,J.value=!0}(s)},{icon:v(()=>[n(y(e),null,{default:v(()=>[n(y(C))]),_:1})]),_:1},8,["onClick"]),s.isBuiltin?t("",!0):(u(),r(y(a),{key:1,quaternary:"",size:"tiny",onClick:e=>De(s)},{icon:v(()=>[n(y(e),null,{default:v(()=>[n(y(B))]),_:1})]),_:1},8,["onClick"]))])]),s.description?(u(),b("p",je,o(s.description),1)):t("",!0),k("div",xe,[c[14]||(c[14]=k("span",{class:"apps-label"},"生效范围:",-1)),(u(!0),b(m,null,i(G.value,e=>(u(),r(y(R),{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))]),k("div",Ce,[k("pre",Be,o(le(s.content)),1)])],2))),128))])):(u(),b("div",ke,[n(y(e),{size:48,class:"empty-icon"},{default:v(()=>[n(y(_))]),_:1}),c[9]||(c[9]=k("p",{class:"empty-title"},"暂无预设",-1)),c[10]||(c[10]=k("p",{class:"empty-desc"},'点击上方"新建"按钮创建系统提示词预设',-1))]))]),_:1},8,["show"])])])]),_:1})]),_:1},8,["show","width"]),n(re,{visible:J.value,"onUpdate:visible":c[1]||(c[1]=e=>J.value=e),"editing-preset":K.value,"existing-ids":ee.value,platforms:G.value,onSaved:Oe},null,8,["visible","editing-preset","existing-ids","platforms"])],64))}},[["__scopeId","data-v-61810a34"]]);export{Ie as default};
@@ -0,0 +1 @@
1
+ import{Dn as e,i as s,t as a}from"./_plugin-vue_export-helper-BeLZJZij.js";import{D as t,K as n,M as i,O as o,S as l,W as r,Z as c,b as u,et as d,g as m,mt as p,st as h,w as v}from"./vue-vendor-BqZbbXHA.js";import{xt as f}from"./icons-B-AzZoeE.js";import{n as w,t as y}from"./useResponsiveDrawer-Ckgj760z.js";import{t as g}from"./DrawerContent-ChXgZ1Xm.js";import{M as j,O as _,ft as k,k as x,st as b}from"./index-BFqnddoI.js";import{m as C,n as D,o as I,t as S}from"./sessions-CaWUaysM.js";import{t as O}from"./SessionCard-cZR2V4Br.js";import{n as M}from"./session-visibility-BAmxh3cK.js";var P=e({default:()=>A}),R={key:0,class:"loading-container"},z={key:1,class:"sessions-list"},A=a({__name:"RecentSessionsDrawer",props:{visible:{type:Boolean,default:!1},channel:{type:String,default:"claude"}},emits:["update:visible"],setup(e,{emit:a}){const{drawerWidth:P}=y(720),A=e,K=a,N=h(!1),T=h([]),U=h(!1),W=u(()=>A.channel);async function B(){U.value=!0;try{const e=await I(10,A.channel);T.value=M(e.sessions)}catch(e){x.error("加载失败: "+e.message)}finally{U.value=!1}}async function E(e){const s=e.alias||"";let a=s;const t=await new Promise(e=>{const t=_.create({title:"设置别名",content:()=>i(b,{defaultValue:s,placeholder:"请输入会话别名","onUpdate:value":e=>{a=e},onKeyup:s=>{"Enter"===s.key&&(t.destroy(),e(a.trim()))}}),positiveText:"确定",negativeText:"取消",onPositiveClick:()=>{e(a.trim())},onNegativeClick:()=>{e(null)}})});if(null!==t)try{t?(await C(e.sessionId,t),x.success("别名设置成功")):(await D(e.sessionId),x.success("别名已删除")),await B()}catch(n){x.error("操作失败: "+n.message)}}async function G(e){try{const{copyResult:s}=await S(e.projectName,e.sessionId,A.channel);if("manual"===s?.method)return void x.warning("自动复制失败,已弹出手动复制框");x.success("启动命令已复制到剪贴板")}catch(s){x.error("复制失败: "+s.message)}}return c(()=>A.visible,e=>{N.value=e,e&&B()},{immediate:!0}),c(N,e=>{K("update:visible",e)}),c(()=>A.channel,()=>{N.value&&B()}),(e,a)=>(r(),l(p(w),{show:N.value,"onUpdate:show":a[0]||(a[0]=e=>N.value=e),width:p(P),placement:"right","show-close":!0},{default:d(()=>[o(p(g),{title:"claude"===A.channel?"Claude 最新对话":"codex"===A.channel?"Codex 最新对话":"gemini"===A.channel?"Gemini 最新对话":"opencode"===A.channel?"OpenCode 最新对话":"omp"===A.channel?"OMP 最新对话":"最新对话","native-scrollbar":!1,closable:""},{default:d(()=>[U.value?(r(),v("div",R,[o(p(j),{size:"medium"},{description:d(()=>[...a[1]||(a[1]=[t("加载中...",-1)])]),_:1})])):T.value.length>0?(r(),v("div",z,[(r(!0),v(m,null,n(T.value,e=>(r(),l(O,{key:e.sessionId,session:e,channel:W.value,"show-project":!0,"hide-fork":!0,"hide-delete":!0,onSetAlias:E,onLaunch:G},null,8,["session","channel"]))),128))])):(r(),l(p(k),{key:2,description:"暂无最近使用的会话",style:{"margin-top":"60px"}},{icon:d(()=>[o(p(s),{size:"48"},{default:d(()=>[o(p(f))]),_:1})]),_:1}))]),_:1},8,["title"])]),_:1},8,["show","width"]))}},[["__scopeId","data-v-49e4936a"]]);export{P as n,A as t};
@@ -0,0 +1 @@
1
+ import{i as s,s as e,t as a}from"./_plugin-vue_export-helper-BeLZJZij.js";import{C as o,D as t,O as i,S as l,W as n,_t as r,b as d,et as u,mt as c,q as f,st as p,w as m,x as h}from"./vue-vendor-BqZbbXHA.js";import{Ct as _,Et as y,U as k,et as v,i as g,r as M,w as j}from"./icons-B-AzZoeE.js";import{Y as z,ut as w}from"./index-BFqnddoI.js";var B={class:"session-left"},$={class:"session-icon"},F={class:"session-info"},b={class:"session-header"},C={class:"session-title-row"},D={class:"session-title"},x={class:"session-meta"},P={class:"meta-item"},S={key:0,class:"session-message"},I={key:1,class:"session-path"},N={class:"session-actions"},q=a({__name:"SessionCard",props:{session:{type:Object,required:!0},channel:{type:String,default:"claude"},showProject:{type:Boolean,default:!1},hideFork:{type:Boolean,default:!1},hideDelete:{type:Boolean,default:!1}},emits:["set-alias","launch","fork","delete"],setup(a,{emit:q}){const O=a,E=p(!1),G=d(()=>O.session.alias?`${O.session.alias} (${O.session.sessionId.substring(0,8)})`:O.session.sessionId);function K(s){const e=new Date(s),a=new Date-e,o=Math.floor(a/6e4),t=Math.floor(a/36e5),i=Math.floor(a/864e5);return o<1?"刚刚":o<60?`${o}分钟前`:t<24?`${t}小时前`:i<7?`${i}天前`:e.toLocaleDateString("zh-CN")}function L(s){if(!s)return"0 B";const e=Math.floor(Math.log(s)/Math.log(1024));return Math.round(s/Math.pow(1024,e)*100)/100+" "+["B","KB","MB","GB"][e]}return(d,p)=>(n(),m("div",{class:"session-item",onMouseenter:p[4]||(p[4]=s=>E.value=!0),onMouseleave:p[5]||(p[5]=s=>E.value=!1)},[h("div",B,[h("div",$,[i(c(s),{size:"24",color:"#18a058"},{default:u(()=>[i(c(_))]),_:1})]),h("div",F,[h("div",b,[h("div",C,[a.showProject&&a.session.projectDisplayName?(n(),l(c(w),{key:0,size:"small",type:"info",bordered:!1,style:{"margin-right":"8px"}},{default:u(()=>[t(r(a.session.projectDisplayName),1)]),_:1})):o("",!0),h("span",D,r(G.value),1),a.session.forkedFrom?(n(),l(c(z),{key:1,placement:"top"},{trigger:u(()=>[i(c(w),{size:"small",type:"warning",bordered:!1,style:{"margin-left":"8px",cursor:"help"}},{icon:u(()=>[i(c(s),null,{default:u(()=>[i(c(k))]),_:1})]),default:u(()=>[p[6]||(p[6]=t(" Fork ",-1))]),_:1})]),default:u(()=>[h("span",null,"Fork 自 "+r(a.session.forkedFrom),1)]),_:1})):o("",!0)]),h("div",x,[h("span",P,[i(c(s),{size:"14"},{default:u(()=>[i(c(y))]),_:1}),t(" "+r(K(a.session.mtime)),1)]),i(c(w),{size:"small",bordered:!1,type:"info"},{icon:u(()=>[i(c(s),null,{default:u(()=>[i(c(v))]),_:1})]),default:u(()=>[t(" "+r(L(a.session.size)),1)]),_:1}),a.session.gitBranch?(n(),l(c(w),{key:0,size:"small",bordered:!1,type:"success"},{icon:u(()=>[i(c(s),null,{default:u(()=>[i(c(k))]),_:1})]),default:u(()=>[t(" "+r(a.session.gitBranch),1)]),_:1})):o("",!0)])]),a.session.firstMessage?(n(),m("div",S,r(a.session.firstMessage),1)):o("",!0),a.showProject&&a.session.projectFullPath?(n(),m("div",I," 路径: "+r(a.session.projectFullPath),1)):o("",!0)])]),h("div",N,[i(c(e),{size:"small",onClick:p[0]||(p[0]=s=>d.$emit("set-alias",a.session))},{icon:u(()=>[i(c(s),null,{default:u(()=>[i(c(j))]),_:1})]),default:u(()=>[p[7]||(p[7]=t(" 别名 ",-1))]),_:1}),i(c(e),{type:"primary",size:"small",onClick:p[1]||(p[1]=s=>d.$emit("launch",a.session))},{icon:u(()=>[i(c(s),null,{default:u(()=>[i(c(g))]),_:1})]),default:u(()=>[p[8]||(p[8]=t(" 使用对话 ",-1))]),_:1}),a.hideFork?o("",!0):(n(),l(c(e),{key:0,size:"small",onClick:p[2]||(p[2]=s=>d.$emit("fork",a.session))},{icon:u(()=>[i(c(s),null,{default:u(()=>[i(c(k))]),_:1})]),default:u(()=>[p[9]||(p[9]=t(" Fork ",-1))]),_:1})),a.hideDelete?o("",!0):(n(),l(c(e),{key:1,size:"small",type:"error",onClick:p[3]||(p[3]=s=>d.$emit("delete",a.session))},{icon:u(()=>[i(c(s),null,{default:u(()=>[i(c(M))]),_:1})]),_:1})),f(d.$slots,"actions-extra",{},void 0,!0)])],32))}},[["__scopeId","data-v-32d1b310"]]);export{q as t};
@@ -0,0 +1 @@
1
+ import{I as e,L as a,N as t,Qt as s,Tt as n,Yt as l,bn as i,gn as o,gt as r,hn as u,ht as d,i as c,j as p,s as v,t as m,xn as h,xt as f,yn as g}from"./_plugin-vue_export-helper-BeLZJZij.js";import{A as b,C as y,D as w,G as k,H as C,I as x,K as j,M as P,N as F,O as _,Q as z,S as M,V as I,W as S,Z as B,_t as $,b as N,dt as T,et as O,f as A,g as U,ht as R,i as D,m as E,mt as L,p as q,r as H,st as V,tt as Q,w as W,x as J}from"./vue-vendor-BqZbbXHA.js";import{r as K}from"./platforms-mqqe_82d.js";import{$ as Z,At as G,Ct as Y,U as X,c as ee,g as ae,i as te,l as se,nt as ne,r as le}from"./icons-B-AzZoeE.js";import{d as ie,k as oe,t as re,u as ue,x as de}from"./use-message-DBsCm7FJ.js";import{F as ce,S as pe,l as ve}from"./light-C2X7hegj.js";import{c as me,s as he}from"./AssetPathField-B-LHvOxq.js";import{t as fe}from"./McpFormDrawer-B240mJ5y.js";import{i as ge,n as be,r as ye,t as we}from"./Forward-DLCL7aMY.js";import{n as ke,t as Ce}from"./useResponsiveDrawer-Ckgj760z.js";import{t as xe}from"./DrawerContent-ChXgZ1Xm.js";import{t as je}from"./headers-DbowkmZJ.js";import{t as Pe}from"./SkillsPanel-BzR828De.js";import{$ as Fe,A as _e,H as ze,M as Me,O as Ie,Q as Se,Tt as Be,Y as $e,_ as Ne,ct as Te,dt as Oe,et as Ae,ft as Ue,k as Re,ot as De,pt as Ee,rt as Le,st as qe,ut as He,vt as Ve,xt as Qe,yt as We}from"./index-BFqnddoI.js";import{c as Je,f as Ke,t as Ze}from"./sessions-CaWUaysM.js";import Ge from"./ChatHistoryDrawer-CoHlGAxb.js";import{t as Ye}from"./sessions-53-Fr68H.js";import{i as Xe,l as ea,n as aa,o as ta,r as sa,t as na}from"./project-config-BVt5s-pH.js";var la={tiny:"mini",small:"tiny",medium:"small",large:"medium",huge:"large"};function ia(e){const a=la[e];if(void 0===a)throw new Error(`${e} has no smaller size.`);return a}var oa=b({name:"More",render:()=>P("svg",{viewBox:"0 0 16 16",version:"1.1",xmlns:"http://www.w3.org/2000/svg"},P("g",{stroke:"none","stroke-width":"1",fill:"none","fill-rule":"evenodd"},P("g",{fill:"currentColor","fill-rule":"nonzero"},P("path",{d:"M4,7 C4.55228,7 5,7.44772 5,8 C5,8.55229 4.55228,9 4,9 C3.44772,9 3,8.55229 3,8 C3,7.44772 3.44772,7 4,7 Z M8,7 C8.55229,7 9,7.44772 9,8 C9,8.55229 8.55229,9 8,9 C7.44772,9 7,8.55229 7,8 C7,7.44772 7.44772,7 8,7 Z M12,7 C12.5523,7 13,7.44772 13,8 C13,8.55229 12.5523,9 12,9 C11.4477,9 11,8.55229 11,8 C11,7.44772 11.4477,7 12,7 Z"}))))}),ra=l("n-popselect"),ua=o("popselect-menu","\n box-shadow: var(--n-menu-box-shadow);\n"),da={multiple:Boolean,value:{type:[String,Number,Array],default:null},cancelable:Boolean,options:{type:Array,default:()=>[]},size:{type:String,default:"medium"},scrollable:Boolean,"onUpdate:value":[Function,Array],onUpdateValue:[Function,Array],onMouseenter:Function,onMouseleave:Function,renderLabel:Function,showCheckmark:{type:Boolean,default:void 0},nodeProps:Function,virtualScroll:Boolean,onChange:[Function,Array]},ca=ce(da),pa=b({name:"PopselectPanel",props:da,setup(e){const a=F(ra),{mergedClsPrefixRef:s,inlineThemeDisabled:l}=r(e),i=t("Popselect","-pop-select",ua,Ae,a.props,s),o=N(()=>Ee(e.options,De("value","children")));function u(a,t){const{onUpdateValue:s,"onUpdate:value":l,onChange:i}=e;s&&n(s,a,t),l&&n(l,a,t),i&&n(i,a,t)}B(T(e,"options"),()=>{x(()=>{a.syncPosition()})});const c=N(()=>{const{self:{menuBoxShadow:e}}=i.value;return{"--n-menu-box-shadow":e}}),p=l?d("select",void 0,c,a.props):void 0;return{mergedTheme:a.mergedThemeRef,mergedClsPrefix:s,treeMate:o,handleToggle:function(t){!function(t){const{value:{getNode:s}}=o;if(e.multiple)if(Array.isArray(e.value)){const a=[],n=[];let l=!0;e.value.forEach(e=>{if(e===t)return void(l=!1);const i=s(e);i&&(a.push(i.key),n.push(i.rawNode))}),l&&(a.push(t),n.push(s(t).rawNode)),u(a,n)}else{const e=s(t);e&&u([t],[e.rawNode])}else if(e.value===t&&e.cancelable)u(null,null);else{const e=s(t);e&&u(t,e.rawNode);const{"onUpdate:show":l,onUpdateShow:i}=a.props;l&&n(l,!1),i&&n(i,!1),a.setShow(!1)}x(()=>{a.syncPosition()})}(t.key)},handleMenuMousedown:function(e){Be(e,"action")||Be(e,"empty")||Be(e,"header")||e.preventDefault()},cssVars:l?void 0:c,themeClass:null==p?void 0:p.themeClass,onRender:null==p?void 0:p.onRender}},render(){var e;return null===(e=this.onRender)||void 0===e||e.call(this),P(Oe,{clsPrefix:this.mergedClsPrefix,focusable:!0,nodeProps:this.nodeProps,class:[`${this.mergedClsPrefix}-popselect-menu`,this.themeClass],style:this.cssVars,theme:this.mergedTheme.peers.InternalSelectMenu,themeOverrides:this.mergedTheme.peerOverrides.InternalSelectMenu,multiple:this.multiple,treeMate:this.treeMate,size:this.size,value:this.value,virtualScroll:this.virtualScroll,scrollable:this.scrollable,renderLabel:this.renderLabel,onToggle:this.handleToggle,onMouseenter:this.onMouseenter,onMouseleave:this.onMouseenter,onMousedown:this.handleMenuMousedown,showCheckmark:this.showCheckmark},{header:()=>{var e,a;return(null===(a=(e=this.$slots).header)||void 0===a?void 0:a.call(e))||[]},action:()=>{var e,a;return(null===(a=(e=this.$slots).action)||void 0===a?void 0:a.call(e))||[]},empty:()=>{var e,a;return(null===(a=(e=this.$slots).empty)||void 0===a?void 0:a.call(e))||[]}})}}),va=b({name:"Popselect",props:Object.assign(Object.assign(Object.assign(Object.assign({},t.props),Ve(ie,["showArrow","arrow"])),{placement:Object.assign(Object.assign({},ie.placement),{default:"bottom"}),trigger:{type:String,default:"hover"}}),da),slots:Object,inheritAttrs:!1,__popover__:!0,setup(e){const{mergedClsPrefixRef:a}=r(e),s=t("Popselect","-popselect",void 0,Ae,e,a),n=V(null);function l(){var e;null===(e=n.value)||void 0===e||e.syncPosition()}function i(e){var a;null===(a=n.value)||void 0===a||a.setShow(e)}return k(ra,{props:e,mergedThemeRef:s,syncPosition:l,setShow:i}),Object.assign(Object.assign({},{syncPosition:l,setShow:i}),{popoverInstRef:n,mergedTheme:s})},render(){const{mergedTheme:e}=this,a={theme:e.peers.Popover,themeOverrides:e.peerOverrides.Popover,builtinThemeOverrides:{padding:"0"},ref:"popoverInstRef",internalRenderBody:(e,a,t,s,n)=>{const{$attrs:l}=this;return P(pa,Object.assign({},l,{class:[l.class,e],style:[l.style,...t]},de(this.$props,ca),{ref:Qe(a),onMouseenter:We([s,l.onMouseenter]),onMouseleave:We([n,l.onMouseleave])}),{header:()=>{var e,a;return null===(a=(e=this.$slots).header)||void 0===a?void 0:a.call(e)},action:()=>{var e,a;return null===(a=(e=this.$slots).action)||void 0===a?void 0:a.call(e)},empty:()=>{var e,a;return null===(a=(e=this.$slots).empty)||void 0===a?void 0:a.call(e)}})}};return P(ue,Object.assign({},Ve(this.$props,ca),a,{internalDeactivateImmediately:!0}),{trigger:()=>{var e,a;return null===(a=(e=this.$slots).default)||void 0===a?void 0:a.call(e)}})}}),ma="\n background: var(--n-item-color-hover);\n color: var(--n-item-text-color-hover);\n border: var(--n-item-border-hover);\n",ha=[g("button","\n background: var(--n-button-color-hover);\n border: var(--n-button-border-hover);\n color: var(--n-button-icon-color-hover);\n ")],fa=o("pagination","\n display: flex;\n vertical-align: middle;\n font-size: var(--n-item-font-size);\n flex-wrap: nowrap;\n",[o("pagination-prefix","\n display: flex;\n align-items: center;\n margin: var(--n-prefix-margin);\n "),o("pagination-suffix","\n display: flex;\n align-items: center;\n margin: var(--n-suffix-margin);\n "),u("> *:not(:first-child)","\n margin: var(--n-item-margin);\n "),o("select","\n width: var(--n-select-width);\n "),u("&.transition-disabled",[o("pagination-item","transition: none!important;")]),o("pagination-quick-jumper","\n white-space: nowrap;\n display: flex;\n color: var(--n-jumper-text-color);\n transition: color .3s var(--n-bezier);\n align-items: center;\n font-size: var(--n-jumper-font-size);\n ",[o("input","\n margin: var(--n-input-margin);\n width: var(--n-input-width);\n ")]),o("pagination-item","\n position: relative;\n cursor: pointer;\n user-select: none;\n -webkit-user-select: none;\n display: flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n min-width: var(--n-item-size);\n height: var(--n-item-size);\n padding: var(--n-item-padding);\n background-color: var(--n-item-color);\n color: var(--n-item-text-color);\n border-radius: var(--n-item-border-radius);\n border: var(--n-item-border);\n fill: var(--n-button-icon-color);\n transition:\n color .3s var(--n-bezier),\n border-color .3s var(--n-bezier),\n background-color .3s var(--n-bezier),\n fill .3s var(--n-bezier);\n ",[g("button","\n background: var(--n-button-color);\n color: var(--n-button-icon-color);\n border: var(--n-button-border);\n padding: 0;\n ",[o("base-icon","\n font-size: var(--n-button-icon-size);\n ")]),i("disabled",[g("hover",ma,ha),u("&:hover",ma,ha),u("&:active","\n background: var(--n-item-color-pressed);\n color: var(--n-item-text-color-pressed);\n border: var(--n-item-border-pressed);\n ",[g("button","\n background: var(--n-button-color-pressed);\n border: var(--n-button-border-pressed);\n color: var(--n-button-icon-color-pressed);\n ")]),g("active","\n background: var(--n-item-color-active);\n color: var(--n-item-text-color-active);\n border: var(--n-item-border-active);\n ",[u("&:hover","\n background: var(--n-item-color-active-hover);\n ")])]),g("disabled","\n cursor: not-allowed;\n color: var(--n-item-text-color-disabled);\n ",[g("active, button","\n background-color: var(--n-item-color-disabled);\n border: var(--n-item-border-disabled);\n ")])]),g("disabled","\n cursor: not-allowed;\n ",[o("pagination-quick-jumper","\n color: var(--n-jumper-text-color-disabled);\n ")]),g("simple","\n display: flex;\n align-items: center;\n flex-wrap: nowrap;\n ",[o("pagination-quick-jumper",[o("input","\n margin: 0;\n ")])])]);function ga(e,a){const t=[];for(let s=e;s<=a;++s)t.push({label:`${s}`,value:s});return t}var ba=b({name:"Pagination",props:Object.assign(Object.assign({},t.props),{simple:Boolean,page:Number,defaultPage:{type:Number,default:1},itemCount:Number,pageCount:Number,defaultPageCount:{type:Number,default:1},showSizePicker:Boolean,pageSize:Number,defaultPageSize:Number,pageSizes:{type:Array,default:()=>[10]},showQuickJumper:Boolean,size:{type:String,default:"medium"},disabled:Boolean,pageSlot:{type:Number,default:9},selectProps:Object,prev:Function,next:Function,goto:Function,prefix:Function,suffix:Function,label:Function,displayOrder:{type:Array,default:["pages","size-picker","quick-jumper"]},to:oe.propTo,showQuickJumpDropdown:{type:Boolean,default:!0},"onUpdate:page":[Function,Array],onUpdatePage:[Function,Array],"onUpdate:pageSize":[Function,Array],onUpdatePageSize:[Function,Array],onPageSizeChange:[Function,Array],onChange:[Function,Array]}),slots:Object,setup(l){const{mergedComponentPropsRef:i,mergedClsPrefixRef:o,inlineThemeDisabled:u,mergedRtlRef:c}=r(l),p=t("Pagination","-pagination",fa,Se,l,o),{localeRef:v}=a("Pagination"),m=V(null),f=V(l.defaultPage),g=V(function(e){var a;if(!e)return 10;const{defaultPageSize:t}=e;if(void 0!==t)return t;const s=null===(a=e.pageSizes)||void 0===a?void 0:a[0];return"number"==typeof s?s:(null==s?void 0:s.value)||10}(l)),b=s(T(l,"page"),f),y=s(T(l,"pageSize"),g),w=N(()=>{const{itemCount:e}=l;if(void 0!==e)return Math.max(1,Math.ceil(e/y.value));const{pageCount:a}=l;return void 0!==a?Math.max(a,1):1}),k=V("");z(()=>{l.simple,k.value=String(b.value)});const C=V(!1),j=V(!1),P=V(!1),F=V(!1),_=N(()=>function(e,a,t,s){let n=!1,l=!1,i=1,o=a;if(1===a)return{hasFastBackward:!1,hasFastForward:!1,fastForwardTo:o,fastBackwardTo:i,items:[{type:"page",label:1,active:1===e,mayBeFastBackward:!1,mayBeFastForward:!1}]};if(2===a)return{hasFastBackward:!1,hasFastForward:!1,fastForwardTo:o,fastBackwardTo:i,items:[{type:"page",label:1,active:1===e,mayBeFastBackward:!1,mayBeFastForward:!1},{type:"page",label:2,active:2===e,mayBeFastBackward:!0,mayBeFastForward:!1}]};const r=a;let u=e,d=e;const c=(t-5)/2;d+=Math.ceil(c),d=Math.min(Math.max(d,1+t-3),r-2),u-=Math.floor(c),u=Math.max(Math.min(u,r-t+3),3);let p=!1,v=!1;u>3&&(p=!0),d<r-2&&(v=!0);const m=[];m.push({type:"page",label:1,active:1===e,mayBeFastBackward:!1,mayBeFastForward:!1}),p?(n=!0,i=u-1,m.push({type:"fast-backward",active:!1,label:void 0,options:s?ga(2,u-1):null})):r>=2&&m.push({type:"page",label:2,mayBeFastBackward:!0,mayBeFastForward:!1,active:2===e});for(let h=u;h<=d;++h)m.push({type:"page",label:h,mayBeFastBackward:!1,mayBeFastForward:!1,active:e===h});return v?(l=!0,o=d+1,m.push({type:"fast-forward",active:!1,label:void 0,options:s?ga(d+1,r-1):null})):d===r-2&&m[m.length-1].label!==r-1&&m.push({type:"page",mayBeFastForward:!0,mayBeFastBackward:!1,label:r-1,active:e===r-1}),m[m.length-1].label!==r&&m.push({type:"page",mayBeFastForward:!1,mayBeFastBackward:!1,label:r,active:e===r}),{hasFastBackward:n,hasFastForward:l,fastBackwardTo:i,fastForwardTo:o,items:m}}(b.value,w.value,l.pageSlot,l.showQuickJumpDropdown));z(()=>{_.value.hasFastBackward?_.value.hasFastForward||(C.value=!1,P.value=!1):(j.value=!1,F.value=!1)});const M=N(()=>{const e=v.value.selectionSuffix;return l.pageSizes.map(a=>"number"==typeof a?{label:`${a} / ${e}`,value:a}:a)}),I=N(()=>{var e,a;return(null===(a=null===(e=null==i?void 0:i.value)||void 0===e?void 0:e.Pagination)||void 0===a?void 0:a.inputSize)||ia(l.size)}),S=N(()=>{var e,a;return(null===(a=null===(e=null==i?void 0:i.value)||void 0===e?void 0:e.Pagination)||void 0===a?void 0:a.selectSize)||ia(l.size)}),B=N(()=>(b.value-1)*y.value),$=N(()=>{const e=b.value*y.value-1,{itemCount:a}=l;return void 0!==a&&e>a-1?a-1:e}),O=N(()=>{const{itemCount:e}=l;return void 0!==e?e:(l.pageCount||1)*y.value}),A=e("Pagination",c,o);function U(){x(()=>{var e;const{value:a}=m;a&&(a.classList.add("transition-disabled"),null===(e=m.value)||void 0===e||e.offsetWidth,a.classList.remove("transition-disabled"))})}function R(e){if(e===b.value)return;const{"onUpdate:page":a,onUpdatePage:t,onChange:s,simple:i}=l;a&&n(a,e),t&&n(t,e),s&&n(s,e),f.value=e,i&&(k.value=String(e))}z(()=>{b.value,y.value,U()});const D=N(()=>{const{size:e}=l,{self:{buttonBorder:a,buttonBorderHover:t,buttonBorderPressed:s,buttonIconColor:n,buttonIconColorHover:i,buttonIconColorPressed:o,itemTextColor:r,itemTextColorHover:u,itemTextColorPressed:d,itemTextColorActive:c,itemTextColorDisabled:v,itemColor:m,itemColorHover:f,itemColorPressed:g,itemColorActive:b,itemColorActiveHover:y,itemColorDisabled:w,itemBorder:k,itemBorderHover:C,itemBorderPressed:x,itemBorderActive:j,itemBorderDisabled:P,itemBorderRadius:F,jumperTextColor:_,jumperTextColorDisabled:z,buttonColor:M,buttonColorHover:I,buttonColorPressed:S,[h("itemPadding",e)]:B,[h("itemMargin",e)]:$,[h("inputWidth",e)]:N,[h("selectWidth",e)]:T,[h("inputMargin",e)]:O,[h("selectMargin",e)]:A,[h("jumperFontSize",e)]:U,[h("prefixMargin",e)]:R,[h("suffixMargin",e)]:D,[h("itemSize",e)]:E,[h("buttonIconSize",e)]:L,[h("itemFontSize",e)]:q,[`${h("itemMargin",e)}Rtl`]:H,[`${h("inputMargin",e)}Rtl`]:V},common:{cubicBezierEaseInOut:Q}}=p.value;return{"--n-prefix-margin":R,"--n-suffix-margin":D,"--n-item-font-size":q,"--n-select-width":T,"--n-select-margin":A,"--n-input-width":N,"--n-input-margin":O,"--n-input-margin-rtl":V,"--n-item-size":E,"--n-item-text-color":r,"--n-item-text-color-disabled":v,"--n-item-text-color-hover":u,"--n-item-text-color-active":c,"--n-item-text-color-pressed":d,"--n-item-color":m,"--n-item-color-hover":f,"--n-item-color-disabled":w,"--n-item-color-active":b,"--n-item-color-active-hover":y,"--n-item-color-pressed":g,"--n-item-border":k,"--n-item-border-hover":C,"--n-item-border-disabled":P,"--n-item-border-active":j,"--n-item-border-pressed":x,"--n-item-padding":B,"--n-item-border-radius":F,"--n-bezier":Q,"--n-jumper-font-size":U,"--n-jumper-text-color":_,"--n-jumper-text-color-disabled":z,"--n-item-margin":$,"--n-item-margin-rtl":H,"--n-button-icon-size":L,"--n-button-icon-color":n,"--n-button-icon-color-hover":i,"--n-button-icon-color-pressed":o,"--n-button-color-hover":I,"--n-button-color":M,"--n-button-color-pressed":S,"--n-button-border":a,"--n-button-border-hover":t,"--n-button-border-pressed":s}}),E=u?d("pagination",N(()=>{let e="";const{size:a}=l;return e+=a[0],e}),D,l):void 0;return{rtlEnabled:A,mergedClsPrefix:o,locale:v,selfRef:m,mergedPage:b,pageItems:N(()=>_.value.items),mergedItemCount:O,jumperValue:k,pageSizeOptions:M,mergedPageSize:y,inputSize:I,selectSize:S,mergedTheme:p,mergedPageCount:w,startIndex:B,endIndex:$,showFastForwardMenu:P,showFastBackwardMenu:F,fastForwardActive:C,fastBackwardActive:j,handleMenuSelect:e=>{R(e)},handleFastForwardMouseenter:()=>{l.disabled||(C.value=!0,U())},handleFastForwardMouseleave:()=>{l.disabled||(C.value=!1,U())},handleFastBackwardMouseenter:()=>{j.value=!0,U()},handleFastBackwardMouseleave:()=>{j.value=!1,U()},handleJumperInput:function(e){k.value=e.replace(/\D+/g,"")},handleBackwardClick:function(){l.disabled||R(Math.max(b.value-1,1))},handleForwardClick:function(){l.disabled||R(Math.min(b.value+1,w.value))},handlePageItemClick:function(e){if(!l.disabled)switch(e.type){case"page":R(e.label);break;case"fast-backward":l.disabled||R(Math.max(_.value.fastBackwardTo,1));break;case"fast-forward":l.disabled||R(Math.min(_.value.fastForwardTo,w.value))}},handleSizePickerChange:function(e){!function(e){if(e===y.value)return;const{"onUpdate:pageSize":a,onUpdatePageSize:t,onPageSizeChange:s}=l;a&&n(a,e),t&&n(t,e),s&&n(s,e),g.value=e,w.value<b.value&&R(w.value)}(e)},handleQuickJumperChange:function(){!function(){const e=Number.parseInt(k.value);Number.isNaN(e)||(R(Math.max(1,Math.min(e,w.value))),l.simple||(k.value=""))}()},cssVars:u?void 0:D,themeClass:null==E?void 0:E.themeClass,onRender:null==E?void 0:E.onRender}},render(){const{$slots:e,mergedClsPrefix:a,disabled:t,cssVars:s,mergedPage:n,mergedPageCount:l,pageItems:i,showSizePicker:o,showQuickJumper:r,mergedTheme:u,locale:d,inputSize:c,selectSize:v,mergedPageSize:m,pageSizeOptions:h,jumperValue:g,simple:b,prev:y,next:w,prefix:k,suffix:C,label:x,goto:j,handleJumperInput:F,handleSizePickerChange:_,handleBackwardClick:z,handlePageItemClick:M,handleForwardClick:I,handleQuickJumperChange:S,onRender:B}=this;null==B||B();const $=k||e.prefix,N=C||e.suffix,T=y||e.prev,O=w||e.next,A=x||e.label;return P("div",{ref:"selfRef",class:[`${a}-pagination`,this.themeClass,this.rtlEnabled&&`${a}-pagination--rtl`,t&&`${a}-pagination--disabled`,b&&`${a}-pagination--simple`],style:s},$?P("div",{class:`${a}-pagination-prefix`},$({page:n,pageSize:m,pageCount:l,startIndex:this.startIndex,endIndex:this.endIndex,itemCount:this.mergedItemCount})):null,this.displayOrder.map(e=>{switch(e){case"pages":return P(U,null,P("div",{class:[`${a}-pagination-item`,!T&&`${a}-pagination-item--button`,(n<=1||n>l||t)&&`${a}-pagination-item--disabled`],onClick:z},T?T({page:n,pageSize:m,pageCount:l,startIndex:this.startIndex,endIndex:this.endIndex,itemCount:this.mergedItemCount}):P(p,{clsPrefix:a},{default:()=>this.rtlEnabled?P(we,null):P(ge,null)})),b?P(U,null,P("div",{class:`${a}-pagination-quick-jumper`},P(qe,{value:g,onUpdateValue:F,size:c,placeholder:"",disabled:t,theme:u.peers.Input,themeOverrides:u.peerOverrides.Input,onChange:S}))," /"," ",l):i.map((e,s)=>{let n,l,i;const{type:o}=e;switch(o){case"page":const t=e.label;n=A?A({type:"page",node:t,active:e.active}):t;break;case"fast-forward":const s=this.fastForwardActive?P(p,{clsPrefix:a},{default:()=>this.rtlEnabled?P(ye,null):P(be,null)}):P(p,{clsPrefix:a},{default:()=>P(oa,null)});n=A?A({type:"fast-forward",node:s,active:this.fastForwardActive||this.showFastForwardMenu}):s,l=this.handleFastForwardMouseenter,i=this.handleFastForwardMouseleave;break;case"fast-backward":const o=this.fastBackwardActive?P(p,{clsPrefix:a},{default:()=>this.rtlEnabled?P(be,null):P(ye,null)}):P(p,{clsPrefix:a},{default:()=>P(oa,null)});n=A?A({type:"fast-backward",node:o,active:this.fastBackwardActive||this.showFastBackwardMenu}):o,l=this.handleFastBackwardMouseenter,i=this.handleFastBackwardMouseleave}const r=P("div",{key:s,class:[`${a}-pagination-item`,e.active&&`${a}-pagination-item--active`,"page"!==o&&("fast-backward"===o&&this.showFastBackwardMenu||"fast-forward"===o&&this.showFastForwardMenu)&&`${a}-pagination-item--hover`,t&&`${a}-pagination-item--disabled`,"page"===o&&`${a}-pagination-item--clickable`],onClick:()=>{M(e)},onMouseenter:l,onMouseleave:i},n);if("page"!==o||e.mayBeFastBackward||e.mayBeFastForward){const a="page"===e.type?e.mayBeFastBackward?"fast-backward":"fast-forward":e.type;return"page"===e.type||e.options?P(va,{to:this.to,key:a,disabled:t,trigger:"hover",virtualScroll:!0,style:{width:"60px"},theme:u.peers.Popselect,themeOverrides:u.peerOverrides.Popselect,builtinThemeOverrides:{peers:{InternalSelectMenu:{height:"calc(var(--n-option-height) * 4.6)"}}},nodeProps:()=>({style:{justifyContent:"center"}}),show:"page"!==o&&("fast-backward"===o?this.showFastBackwardMenu:this.showFastForwardMenu),onUpdateShow:e=>{"page"!==o&&(e?"fast-backward"===o?this.showFastBackwardMenu=e:this.showFastForwardMenu=e:(this.showFastBackwardMenu=!1,this.showFastForwardMenu=!1))},options:"page"!==e.type&&e.options?e.options:[],onUpdateValue:this.handleMenuSelect,scrollable:!0,showCheckmark:!1},{default:()=>r}):r}return r}),P("div",{class:[`${a}-pagination-item`,!O&&`${a}-pagination-item--button`,{[`${a}-pagination-item--disabled`]:n<1||n>=l||t}],onClick:I},O?O({page:n,pageSize:m,pageCount:l,itemCount:this.mergedItemCount,startIndex:this.startIndex,endIndex:this.endIndex}):P(p,{clsPrefix:a},{default:()=>this.rtlEnabled?P(ge,null):P(we,null)})));case"size-picker":return!b&&o?P(Fe,Object.assign({consistentMenuWidth:!1,placeholder:"",showCheckmark:!1,to:this.to},this.selectProps,{size:v,options:h,value:m,disabled:t,theme:u.peers.Select,themeOverrides:u.peerOverrides.Select,onUpdateValue:_})):null;case"quick-jumper":return!b&&r?P("div",{class:`${a}-pagination-quick-jumper`},j?j():f(this.$slots.goto,()=>[d.goto]),P(qe,{value:g,onUpdateValue:F,size:c,placeholder:"",disabled:t,theme:u.peers.Input,themeOverrides:u.peerOverrides.Input,onChange:S})):null;default:return null}}),N?P("div",{class:`${a}-pagination-suffix`},N({page:n,pageSize:m,pageCount:l,startIndex:this.startIndex,endIndex:this.endIndex,itemCount:this.mergedItemCount})):null)}}),ya={class:"project-instruction-panel"},wa={key:0,class:"unsupported-state"},ka={class:"resource-path"},Ca={__name:"ProjectInstructionPanel",props:{projectPath:{type:String,required:!0},platform:{type:String,required:!0},instruction:{type:Object,default:()=>({supported:!1,path:null,exists:!1,content:""})}},emits:["updated"],setup(e,{emit:a}){const t=e,s=a,n=re(),l=pe(),i=V(t.instruction.content||""),o=V(!1),r=V(!1);async function u(){o.value=!0;try{const e=await ta(t.projectPath,t.platform,i.value);i.value=e.content??i.value,s("updated",e),n.success("项目指令已保存")}catch(e){n.error(`保存项目指令失败:${e.message}`)}finally{o.value=!1}}function d(){l.warning({title:"删除项目指令",content:`确定删除 ${t.instruction.path} 吗?`,positiveText:"删除",negativeText:"取消",onPositiveClick:async()=>{r.value=!0;try{const e=await na(t.projectPath,t.platform);i.value="",s("updated",e),n.success("项目指令已删除")}catch(e){n.error(`删除项目指令失败:${e.message}`)}finally{r.value=!1}}})}return B(()=>t.instruction,e=>{i.value=e?.content||""},{deep:!0}),(a,t)=>(S(),W("div",ya,[e.instruction?.supported?(S(),W(U,{key:1},[J("div",ka,"目标文件:"+$(e.instruction.path),1),_(L(qe),{value:i.value,"onUpdate:value":t[0]||(t[0]=e=>i.value=e),type:"textarea",rows:16,placeholder:"输入项目指令",disabled:o.value},null,8,["value","disabled"]),_(L(ze),{justify:"end",class:"actions"},{default:O(()=>[e.instruction.exists?(S(),M(L(v),{key:0,"data-action":"delete-instruction",type:"error",secondary:"",loading:r.value,onClick:d},{default:O(()=>[...t[1]||(t[1]=[w(" 删除文件 ",-1)])]),_:1},8,["loading"])):y("",!0),_(L(v),{"data-action":"save-instruction",type:"primary",loading:o.value,onClick:u},{default:O(()=>[...t[2]||(t[2]=[w(" 保存 ",-1)])]),_:1},8,["loading"])]),_:1}),_(L(_e),{depth:"3",class:"hint"},{default:O(()=>[...t[3]||(t[3]=[w(" 写入项目原生文件;修改后通常需要重新启动对应 CLI。 ",-1)])]),_:1})],64)):(S(),W("div",wa," 当前平台不提供项目指令文件 "))]))}},xa=m(Ca,[["__scopeId","data-v-f2f46409"]]),ja={class:"project-mcp-panel"},Pa={class:"panel-toolbar"},Fa={class:"resource-path"},_a={key:2,class:"server-list"},za={class:"server-info"},Ma={class:"server-title"},Ia={class:"server-spec"},Sa={__name:"ProjectMcpPanel",props:{projectPath:{type:String,required:!0},platform:{type:String,required:!0},mcp:{type:Object,default:()=>({supported:!0,servers:[]})}},emits:["updated"],setup(e,{emit:a}){const t=e,s=a,n=re(),l=pe(),i=V(!1),o=V(null),r=V(""),u=V(t.mcp),d=N(()=>u.value||t.mcp||{servers:[]}),c=N(()=>Array.isArray(d.value?.servers)?d.value.servers:[]),p=N(()=>c.value.some(e=>{const a=e.server||{};return Object.keys(a.env||{}).length>0||Object.keys(a.headers||{}).length>0}));function m(e){const a=e.server||{};return"stdio"===a.type?`${a.command||""} ${(a.args||[]).join(" ")}`.trim():a.url||a.type||"MCP"}function h(){o.value=null,i.value=!0}async function f(){i.value=!1,o.value=null,await g(),s("updated")}async function g(){const e=await Xe(t.projectPath,t.platform);u.value=e}return B(()=>t.mcp,e=>{u.value=e},{deep:!0}),B([()=>t.projectPath,()=>t.platform],()=>{t.projectPath&&t.platform&&g().catch(e=>n.error(`加载项目 MCP 失败:${e.message}`))}),(a,u)=>(S(),W("div",ja,[J("div",Pa,[J("span",Fa,"目标文件:"+$(d.value?.path||"当前平台未声明"),1),_(L(v),{size:"small",type:"primary",onClick:h},{default:O(()=>[...u[1]||(u[1]=[w(" 添加 MCP ",-1)])]),_:1})]),p.value?(S(),M(L(Te),{key:0,type:"warning",bordered:!1,style:{"margin-bottom":"12px"}},{default:O(()=>[...u[2]||(u[2]=[w(" 项目 MCP 配置中的静态密钥可能随项目进入 Git,请优先使用环境变量引用。 ",-1)])]),_:1})):y("",!0),0===c.value.length?(S(),M(L(Ue),{key:1,description:"暂无项目 MCP 服务器"})):(S(),W("div",_a,[(S(!0),W(U,null,j(c.value,e=>(S(),W("div",{key:e.id,class:"server-row"},[J("div",za,[J("div",Ma,$(e.id),1),J("div",Ia,$(m(e)),1)]),_(L(ze),{size:"small"},{default:O(()=>[_(L(v),{size:"tiny",loading:r.value===e.id,onClick:a=>async function(e){r.value=e.id;try{const a=await ea(t.projectPath,t.platform,e.id);a.success?n.success(`${e.id} 连接成功`):n.error(a.message||`${e.id} 连接失败`)}catch(a){n.error(`测试失败:${a.message}`)}finally{r.value=""}}(e)},{default:O(()=>[...u[3]||(u[3]=[w("测试",-1)])]),_:1},8,["loading","onClick"]),_(L(v),{size:"tiny",disabled:e.external,onClick:a=>function(e){o.value={id:e.id,...e},i.value=!0}(e)},{default:O(()=>[...u[4]||(u[4]=[w("编辑",-1)])]),_:1},8,["disabled","onClick"]),_(L(v),{size:"tiny",type:"error",secondary:"",disabled:e.external,onClick:a=>function(e){l.warning({title:"移除项目 MCP",content:`确定从当前项目移除 ${e.id} 吗?用户级配置不会被删除。`,positiveText:"移除",negativeText:"取消",onPositiveClick:async()=>{try{await aa(t.projectPath,t.platform,e.id),await g(),s("updated"),n.success("项目 MCP 已移除")}catch(a){n.error(`移除失败:${a.message}`)}}})}(e)},{default:O(()=>[...u[5]||(u[5]=[w("移除",-1)])]),_:1},8,["disabled","onClick"])]),_:2},1024)]))),128))])),_(fe,{visible:i.value,"onUpdate:visible":u[0]||(u[0]=e=>i.value=e),"editing-server":o.value,"existing-ids":c.value.map(e=>e.id),scope:"project","project-path":e.projectPath,platform:e.platform,onSaved:f},null,8,["visible","editing-server","existing-ids","project-path","platform"])]))}},Ba=m(Sa,[["__scopeId","data-v-1ebbb765"]]),$a={class:"project-config-content"},Na={class:"project-config-header"},Ta={key:0,class:"unsupported-state"},Oa={key:0,class:"unsupported-state"},Aa=m({__name:"ProjectConfigDrawer",props:{show:{type:Boolean,default:!1},projectPath:{type:String,default:""},platform:{type:String,default:"claude"}},emits:["update:show"],setup(e,{emit:a}){const t=e,s=a,{drawerWidth:n}=Ce(760),l=N({get:()=>t.show,set:e=>s("update:show",e)}),i=[{label:"Claude",value:"claude"},{label:"Codex",value:"codex"},{label:"Gemini",value:"gemini"},{label:"OpenCode",value:"opencode"},{label:"OMP",value:"omp"}],o=V(t.platform||"claude"),r=V("instruction"),u=V(null),d=V(!1),c=V(0);async function p(){if(!t.projectPath||!o.value)return;const e=++c.value;d.value=!0;try{const a=await sa(t.projectPath,o.value);if(e!==c.value)return;u.value=a}finally{e===c.value&&(d.value=!1)}}return B(l,e=>{e?(o.value=t.platform||"claude",r.value="instruction",p()):c.value+=1}),B([()=>t.projectPath,()=>t.platform,o],([e,a],t)=>{l.value&&e&&a&&(a===t?.[1]&&e===t?.[0]||p())}),I(()=>{l.value&&p()}),(a,t)=>(S(),M(L(ke),{show:l.value,"onUpdate:show":t[2]||(t[2]=e=>l.value=e),width:L(n),placement:"right","show-mask":!0},{default:O(()=>[_(L(xe),{title:"项目配置",closable:"","native-scrollbar":!1},{default:O(()=>[J("div",$a,[J("div",Na,[J("div",null,[t[3]||(t[3]=J("div",{class:"project-config-title"},"当前项目",-1)),_(L(_e),{depth:"3",class:"project-path"},{default:O(()=>[w($(e.projectPath),1)]),_:1})]),_(L(Fe),{value:o.value,"onUpdate:value":t[0]||(t[0]=e=>o.value=e),size:"small",options:i,disabled:d.value,style:{width:"130px"}},null,8,["value","disabled"])]),_(L(Me),{show:d.value},{default:O(()=>[_(L(he),{value:r.value,"onUpdate:value":t[1]||(t[1]=e=>r.value=e),type:"line",animated:""},{default:O(()=>[_(L(me),{name:"instruction",tab:"项目指令"},{default:O(()=>[_(xa,{"project-path":e.projectPath,platform:o.value,instruction:u.value?.instruction,onUpdated:p},null,8,["project-path","platform","instruction"])]),_:1}),_(L(me),{name:"skills",tab:"Skills"},{default:O(()=>[!1===u.value?.capabilities?.skills?(S(),W("div",Ta," 当前平台不提供项目 Skills ")):(S(),M(Pe,{key:1,platform:o.value,"project-path":e.projectPath,scope:"project","in-drawer":"","drawer-visible":l.value},null,8,["platform","project-path","drawer-visible"]))]),_:1}),_(L(me),{name:"mcp",tab:"MCP"},{default:O(()=>[!1===u.value?.capabilities?.mcp?(S(),W("div",Oa," 当前平台不提供项目 MCP ")):(S(),M(Ba,{key:1,"project-path":e.projectPath,platform:o.value,mcp:u.value?.mcp,onUpdated:p},null,8,["project-path","platform","mcp"]))]),_:1})]),_:1},8,["value"])]),_:1},8,["show"])])]),_:1})]),_:1},8,["show","width"]))}},[["__scopeId","data-v-e9a405fe"]]),Ua={class:"session-list-container"},Ra={class:"header"},Da={class:"title-bar"},Ea={class:"title-section"},La={class:"title-with-count"},qa={class:"header-actions"},Ha={key:0,class:"loading-container"},Va={key:1,class:"loading-container compact"},Qa={key:3,class:"sessions-list"},Wa=["onMouseenter","onClick"],Ja={class:"session-left"},Ka={class:"session-icon"},Za={class:"session-info"},Ga={class:"session-header"},Ya={class:"session-title-row"},Xa={class:"session-title"},et={class:"session-meta"},at={class:"session-right"},tt={class:"session-tags-area"},st={key:0,class:"session-actions"},nt={key:0,style:{"max-height":"70vh","overflow-y":"auto"}},lt={class:"search-result-header"},it={class:"search-result-title"},ot="__full__",rt=m({__name:"SessionList",props:{projectName:{type:String,required:!0}},setup(e){const a=e,t=D(),s=H(),n=Ye(),{addFavorite:l,removeFavorite:i,isFavorite:o}=Ne(),r=N(()=>K(s)),u=V(a.projectName),d=N(()=>u.value||a.projectName),p=V(""),m=V(null),h=V(!1),f=V(null),g=V(""),b=V(null),k=V([]),P=V(1),F=V(null),z=V(!1),T=V(!1),ie=V(null),oe=V(!1),re=V(!1),ue=V([]),de=V(!1),ce=V(!1),pe=V(null),me=V(""),he=V(ot),fe=V(!1),ge=V(!1),be=V([]),ye=V(!1),we=V(""),ke=V(""),Ce=V(null);function xe(e){return"string"==typeof e&&(e.startsWith("/")||/^[A-Za-z]:[\\/]/.test(e)||e.startsWith("\\\\"))}const Pe=N(()=>{const e=d.value;return n.projects.find(a=>a.name===e)||n.projects.find(e=>e.displayName===a.projectName||e.fullPath===a.projectName||e.path===a.projectName)||null}),Se=N(()=>[n.currentProjectInfo?.fullPath,n.currentProjectInfo?.path,Pe.value?.fullPath,Pe.value?.path].find(xe)||""),Be=N(()=>n.currentProjectInfo?.displayName||Pe.value?.displayName||a.projectName),Oe=N(()=>Se.value||n.currentProjectInfo?.fullPath||Pe.value?.fullPath||Pe.value?.path||d.value),Ae=N(()=>new Set(ue.value)),De=N(()=>ue.value.length),Ee=N(()=>k.value.length>0&&k.value.every(e=>Ae.value.has(e.sessionId))),Ve=N(()=>De.value>0&&!Ee.value);async function Qe(){n.projects.length||await n.fetchProjects();const e=n.projects.find(e=>e.name===a.projectName);if(e)return u.value=e.name,e.name;const s=n.projects.find(e=>e.displayName===a.projectName||e.fullPath===a.projectName||e.path===a.projectName);return s?(u.value=s.name,s.name!==a.projectName&&await t.replace({name:"cli-sessions",params:{platform:r.value,projectName:s.name}}),s.name):(u.value=a.projectName,a.projectName)}async function We(e={}){const a=await Qe(),t=e.page??P.value,s=e.limit??n.sessionsPagination.limit;await n.fetchSessions(a,{page:t,limit:s,...e})}async function Xe(e){P.value=e,await We({page:e})}function ea(){t.push({name:"cli-projects",params:{platform:r.value}})}async function aa(){if(p.value){oe.value=!0;try{const e=await Ke(d.value,p.value,35,r.value);F.value=e,z.value=!0}catch(e){Re.error("搜索失败: "+e.message)}finally{oe.value=!1}}}function ta(){re.value=!0,b.value=null}function sa(){re.value=!1,ue.value=[],b.value=null}function na(e){return Ae.value.has(e)}function la(e,a=!na(e)){const t=new Set(ue.value);a?t.add(e):t.delete(e),ue.value=Array.from(t)}function ia(e){ue.value=e?k.value.map(e=>e.sessionId):[]}function oa(e){re.value?la(e.sessionId):function(e){we.value=e.sessionId,ke.value=e.alias||"",ye.value=!0,x(()=>{Ce.value?.open()})}(e)}async function ra(){if(f.value)try{const e=f.value.sessionId;g.value?(await n.setAlias(e,g.value),Re.success("别名设置成功")):(await n.deleteAlias(e),Re.success("别名已删除")),h.value=!1,f.value=null,g.value=""}catch(e){Re.error("操作失败: "+e.message)}}function ua(){ce.value=!1,pe.value=null,me.value="",he.value=ot,be.value=[],fe.value=!1,ge.value=!1}async function da(){if(pe.value)try{ge.value=!0,await n.forkSession(pe.value.sessionId,{afterUserMessageNumber:he.value===ot?null:he.value,alias:me.value?.trim()||void 0}),Re.success("Fork 成功!"),ua()}catch(e){Re.error("Fork 失败: "+e.message)}finally{ge.value=!1}}function ca(e){Re.error(e)}function pa(e){const a=new Set((e||[]).filter(Boolean));0!==a.size&&(ue.value=ue.value.filter(e=>!a.has(e)),we.value&&a.has(we.value)&&(ye.value=!1,we.value="",ke.value=""))}async function va(e){try{const{copyResult:a}=await Ze(d.value,e,r.value);if("manual"===a?.method)return void Re.warning("自动复制失败,已弹出手动复制框");Re.success("启动命令已复制到剪贴板")}catch(a){Re.error("复制失败: "+a.message)}}function ma(){if(0===De.value)return void Re.warning("请先选择要删除的会话");const e=[...ue.value];Ie.warning({title:"批量删除会话",content:`确定要删除选中的 ${e.length} 个会话吗?此操作不可恢复!`,positiveText:"确定删除",negativeText:"取消",onPositiveClick:async()=>{de.value=!0;try{const a=await n.deleteSessions(e);if(pa(a.deletedSessionIds),0===a.failed.length)return Re.success(`已删除 ${a.deletedSessionIds.length} 个会话`),void sa();ue.value=a.failed.map(e=>e.sessionId),a.deletedSessionIds.length>0?Re.warning(`已删除 ${a.deletedSessionIds.length} 个会话,${a.failed.length} 个删除失败`):Re.error(`删除失败: ${a.failed[0].error.message}`)}finally{de.value=!1}}})}function ha(e){if(!e)return"0 B";const a=1024;return e<a?e+" B":e<a*a?(e/a).toFixed(1)+" KB":(e/a/a).toFixed(1)+" MB"}function fa(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 ga(e,a=80){return e?e.length>a?e.substring(0,a)+"...":e:""}B(()=>n.sessionsWithAlias,e=>{k.value=[...e];const a=new Set(e.map(e=>e.sessionId));ue.value=ue.value.filter(e=>a.has(e)),re.value&&0===e.length&&sa()},{immediate:!0});let ya=0,wa=!1;async function ka(){if("visible"!==document.visibilityState||wa)return;const e=Date.now();if(!(e-ya<3e4)){wa=!0,ya=e;try{const e=ie.value?.scrollTop||0,a=await Qe();await n.fetchSessions(a,{page:P.value,limit:n.sessionsPagination.limit,force:!0,silent:!0,fresh:!0}),await x(),ie.value&&(ie.value.scrollTop=e)}finally{wa=!1}}}function Ca(){"visible"===document.visibilityState&&ka().catch(()=>{})}function xa(){ka().catch(()=>{})}function ja(e){(e.metaKey||e.ctrlKey)&&"k"===String(e.key).toLowerCase()&&(e.preventDefault(),m.value?.querySelector?.("input")?.focus?.())}return B([r,()=>a.projectName],([e])=>{T.value=!1,sa(),n.setChannel(e),P.value=1,We()},{immediate:!0}),I(()=>{document.addEventListener("visibilitychange",Ca),window.addEventListener("focus",xa),document.addEventListener("keydown",ja)}),C(()=>{document.removeEventListener("visibilitychange",Ca),window.removeEventListener("focus",xa),document.removeEventListener("keydown",ja)}),(e,a)=>(S(),W("div",Ua,[J("div",Ra,[J("div",Da,[_(L(v),{size:"small",onClick:ea,class:"back-button"},{icon:O(()=>[_(L(c),{size:"18"},{default:O(()=>[_(L(G))]),_:1})]),_:1}),J("div",Ea,[J("div",La,[_(L(je),null,{default:O(()=>[w($(Be.value),1)]),_:1}),_(L(_e),{depth:"3",class:"session-count"},{default:O(()=>[w("("+$(L(n).sessionsPagination.total)+" 个对话)",1)]),_:1}),_(L(He),{size:"small",bordered:!1,type:"info",class:"total-size-tag"},{default:O(()=>[w($(ha(L(n).totalSize)),1)]),_:1}),J("div",qa,[re.value?(S(),W(U,{key:0},[_(L(Le),{checked:Ee.value,indeterminate:Ve.value,disabled:0===k.value.length||de.value,"onUpdate:checked":ia},{default:O(()=>[...a[14]||(a[14]=[w(" 全选 ",-1)])]),_:1},8,["checked","indeterminate","disabled"]),_(L(_e),{depth:"3"},{default:O(()=>[w("已选 "+$(De.value)+" 个",1)]),_:1}),_(L(v),{size:"small",type:"error",disabled:0===De.value,loading:de.value,onClick:ma},{icon:O(()=>[_(L(c),null,{default:O(()=>[_(L(le))]),_:1})]),default:O(()=>[a[15]||(a[15]=w(" 删除 ",-1))]),_:1},8,["disabled","loading"]),_(L(v),{size:"small",disabled:de.value,onClick:sa},{default:O(()=>[...a[16]||(a[16]=[w(" 完成 ",-1)])]),_:1},8,["disabled"])],64)):(S(),W(U,{key:1},[_(L(v),{size:"small",type:"error",secondary:"",onClick:ta},{icon:O(()=>[_(L(c),null,{default:O(()=>[_(L(le))]),_:1})]),default:O(()=>[a[17]||(a[17]=w(" 管理 ",-1))]),_:1}),_(L(v),{size:"small",type:"primary",secondary:"",disabled:!Se.value,onClick:a[0]||(a[0]=e=>T.value=!0)},{default:O(()=>[...a[18]||(a[18]=[w(" 项目配置 ",-1)])]),_:1},8,["disabled"])],64))])]),_(L(_e),{depth:"3",class:"project-path"},{default:O(()=>[w($(Oe.value),1)]),_:1})]),J("div",{ref_key:"searchInputContainer",ref:m,class:"search-input-container"},[_(L(qe),{value:p.value,"onUpdate:value":a[1]||(a[1]=e=>p.value=e),placeholder:"搜索会话...(Cmd/Ctrl+K)",clearable:"",class:"search-input",onKeyup:q(aa,["enter"]),disabled:oe.value},{prefix:O(()=>[_(L(c),null,{default:O(()=>[_(L(ae))]),_:1})]),suffix:O(()=>[_(L(v),{text:"",onClick:aa,disabled:!p.value||oe.value,loading:oe.value},{default:O(()=>[...a[19]||(a[19]=[w(" 搜索 ",-1)])]),_:1},8,["disabled","loading"])]),_:1},8,["value","disabled"])],512)])]),J("div",{class:"content",ref_key:"contentEl",ref:ie},[L(n).loading&&0===L(n).sessions.length&&!L(n).sessionsPending?(S(),W("div",Ha,[_(L(Me),{size:"large"},{description:O(()=>[...a[20]||(a[20]=[w(" 加载会话列表... ",-1)])]),_:1})])):L(n).sessionsPending?(S(),W("div",Va,[_(L(Me),{size:"small"},{description:O(()=>[...a[21]||(a[21]=[w(" 正在生成会话列表... ",-1)])]),_:1})])):L(n).error&&0===L(n).sessions.length?(S(),M(L(Te),{key:2,type:"error",title:"加载失败",style:{"margin-bottom":"16px"}},{default:O(()=>[w($(L(n).error),1)]),_:1})):k.value.length>0?(S(),W("div",Qa,[(S(!0),W(U,null,j(k.value,e=>(S(),W("div",{key:e.sessionId},[J("div",{class:R(["session-item",{"session-item-selected":na(e.sessionId),"session-item-selection-mode":re.value}]),onMouseenter:a=>b.value=e.sessionId,onMouseleave:a[3]||(a[3]=e=>b.value=null),onClick:a=>oa(e)},[re.value?(S(),W("div",{key:0,class:"selection-checkbox",onClick:a[2]||(a[2]=E(()=>{},["stop"]))},[_(L(Le),{checked:na(e.sessionId),"onUpdate:checked":a=>la(e.sessionId,a)},null,8,["checked","onUpdate:checked"])])):y("",!0),J("div",Ja,[J("div",Ka,[_(L(c),{size:"24",color:"#18a058"},{default:O(()=>[_(L(Y))]),_:1})]),J("div",Za,[J("div",Ga,[J("div",Ya,[J("span",Xa,$(e.alias?`${e.alias} (${e.sessionId.substring(0,8)})`:e.sessionId),1),e.forkedFrom?(S(),M(L($e),{key:0,placement:"top"},{trigger:O(()=>[_(L(He),{size:"small",type:"warning",bordered:!1,style:{"margin-left":"8px",cursor:"help"}},{icon:O(()=>[_(L(c),null,{default:O(()=>[_(L(X))]),_:1})]),default:O(()=>[a[22]||(a[22]=w(" Fork ",-1))]),_:1})]),default:O(()=>[w(" Fork 自: "+$(e.forkedFrom),1)]),_:2},1024)):y("",!0)])]),J("div",et,[_(L(_e),{depth:"3"},{default:O(()=>{return[w($((a=e.mtime,a?new Date(a).toLocaleString("zh-CN"):"")),1)];var a}),_:2},1024),_(L(_e),{depth:"3"},{default:O(()=>[...a[23]||(a[23]=[w("•",-1)])]),_:1}),_(L(He),{size:"small",bordered:!1},{default:O(()=>[w($(ha(e.size)),1)]),_:2},1024)]),e.firstMessage?(S(),M(L(_e),{key:0,depth:"3",class:"session-message"},{default:O(()=>[w($(ga(e.firstMessage,80)),1)]),_:2},1024)):e.gitBranch||e.summary?y("",!0):(S(),M(L(_e),{key:1,depth:"3",class:"session-message session-message-empty"},{default:O(()=>[...a[24]||(a[24]=[w(" 暂未读取到对话内容 ",-1)])]),_:1}))])]),J("div",at,[J("div",tt,[e.gitBranch?(S(),M(L(He),{key:0,size:"small",type:"info",bordered:!1},{icon:O(()=>[_(L(c),null,{default:O(()=>[_(L(X))]),_:1})]),default:O(()=>[w(" "+$(e.gitBranch),1)]),_:2},1024)):y("",!0)]),re.value?y("",!0):(S(),W("div",st,[_(L(ze),null,{default:O(()=>[Q(_(L(v),{size:"small",type:"error",onClick:E(a=>{return t=e.sessionId,void Ie.warning({title:"删除会话",content:"确定要删除这个会话吗?此操作不可恢复!",positiveText:"确定删除",negativeText:"取消",onPositiveClick:async()=>{try{await n.deleteSession(t),pa([t]),Re.success("会话已删除")}catch(e){Re.error("删除失败: "+e.message)}}});var t},["stop"])},{icon:O(()=>[_(L(c),null,{default:O(()=>[_(L(le))]),_:1})]),default:O(()=>[a[25]||(a[25]=w(" 删除 ",-1))]),_:1},8,["onClick"]),[[A,b.value===e.sessionId]]),_(L(v),{size:"small",onClick:E(a=>function(e){f.value=e,g.value=e.alias||"",h.value=!0}(e),["stop"])},{icon:O(()=>[_(L(c),null,{default:O(()=>[_(L(ne))]),_:1})]),default:O(()=>[a[26]||(a[26]=w(" 别名 ",-1))]),_:1},8,["onClick"]),_(L(v),{size:"small",type:L(o)(r.value,d.value,e.sessionId)?"warning":"default",onClick:E(a=>async function(e){const a=r.value,t=o(a,d.value,e.sessionId);try{if(t)await i(a,d.value,e.sessionId),Re.success("已取消收藏");else{const t={sessionId:e.sessionId,projectName:d.value,projectDisplayName:Be.value,projectFullPath:Oe.value,alias:e.alias||"",firstMessage:e.firstMessage||"",mtime:e.mtime,size:e.size,gitBranch:e.gitBranch||"",forkedFrom:e.forkedFrom||""};await l(a,t),Re.success("已添加到收藏")}}catch(s){Re.error("操作失败: "+s.message)}}(e),["stop"])},{icon:O(()=>[_(L(c),null,{default:O(()=>[L(o)(r.value,d.value,e.sessionId)?(S(),M(L(se),{key:0})):(S(),M(L(ee),{key:1}))]),_:2},1024)]),default:O(()=>[w(" "+$(L(o)(r.value,d.value,e.sessionId)?"已收藏":"收藏"),1)]),_:2},1032,["type","onClick"]),"opencode"!==r.value?(S(),M(L(v),{key:0,size:"small",onClick:E(a=>async function(e){if("opencode"!==r.value)try{const a=k.value.find(a=>a.sessionId===e);pe.value=a||{sessionId:e},me.value="",he.value=ot,be.value=[{label:"完整会话末尾(保留全部消息)",value:ot}],ce.value=!0,fe.value=!0;const t=await Je(d.value,e,r.value),s=Array.isArray(t?.items)?t.items:[];be.value=[{label:"完整会话末尾(保留全部消息)",value:ot},...s.map(e=>({label:`保留到第 ${e.userMessageNumber} 条用户消息这一轮 · ${e.preview}`,value:e.userMessageNumber}))]}catch(a){Re.error("加载 Fork 位置失败: "+a.message),ua()}finally{fe.value=!1}else Re.warning("OpenCode 当前不支持该 Fork 操作")}(e.sessionId),["stop"])},{icon:O(()=>[_(L(c),null,{default:O(()=>[_(L(X))]),_:1})]),default:O(()=>[a[27]||(a[27]=w(" Fork ",-1))]),_:1},8,["onClick"])):y("",!0),_(L(v),{size:"small",type:"primary",onClick:E(a=>va(e.sessionId),["stop"])},{icon:O(()=>[_(L(c),null,{default:O(()=>[_(L(te))]),_:1})]),default:O(()=>[a[28]||(a[28]=w(" 使用对话 ",-1))]),_:1},8,["onClick"])]),_:2},1024)]))])],42,Wa)]))),128))])):y("",!0),L(n).sessionsPagination.total>L(n).sessionsPagination.limit?(S(),M(L(ba),{key:4,page:P.value,"onUpdate:page":[a[4]||(a[4]=e=>P.value=e),Xe],"page-count":Math.ceil(L(n).sessionsPagination.total/L(n).sessionsPagination.limit),"page-size":L(n).sessionsPagination.limit,"show-quick-jumper":"",class:"list-pagination"},null,8,["page","page-count","page-size"])):y("",!0),L(n).loading||L(n).error||L(n).sessionsPending||0!==k.value.length?y("",!0):(S(),M(L(Ue),{key:5,description:p.value?"当前页没有匹配的会话":"没有找到会话",style:{"margin-top":"60px"}},{icon:O(()=>[_(L(c),null,{default:O(()=>[_(L(Z))]),_:1})]),_:1},8,["description"]))],512),_(L(ve),{show:h.value,"onUpdate:show":a[7]||(a[7]=e=>h.value=e),preset:"dialog",title:"设置别名"},{action:O(()=>[_(L(ze),null,{default:O(()=>[_(L(v),{onClick:a[6]||(a[6]=e=>h.value=!1)},{default:O(()=>[...a[29]||(a[29]=[w("取消",-1)])]),_:1}),_(L(v),{type:"primary",onClick:ra},{default:O(()=>[...a[30]||(a[30]=[w("确定",-1)])]),_:1})]),_:1})]),default:O(()=>[_(L(qe),{value:g.value,"onUpdate:value":a[5]||(a[5]=e=>g.value=e),placeholder:"输入别名(留空删除)",onKeyup:q(ra,["enter"])},null,8,["value"])]),_:1},8,["show"]),_(L(ve),{show:ce.value,"onUpdate:show":a[10]||(a[10]=e=>ce.value=e),preset:"dialog",title:"Fork 对话"},{action:O(()=>[_(L(ze),null,{default:O(()=>[_(L(v),{disabled:ge.value,onClick:ua},{default:O(()=>[...a[32]||(a[32]=[w("取消",-1)])]),_:1},8,["disabled"]),_(L(v),{type:"primary",loading:ge.value,onClick:da},{default:O(()=>[...a[33]||(a[33]=[w(" 确认 Fork ",-1)])]),_:1},8,["loading"])]),_:1})]),default:O(()=>[_(L(ze),{vertical:"",size:14},{default:O(()=>[_(L(_e),{depth:"3"},{default:O(()=>[...a[31]||(a[31]=[w(" 可选择保留到第几条用户消息所在轮次;会包含这条消息后 AI 的完整输出。 ",-1)])]),_:1}),_(L(Fe),{value:he.value,"onUpdate:value":a[8]||(a[8]=e=>he.value=e),options:be.value,loading:fe.value,clearable:"",placeholder:"选择保留到哪一轮(默认完整会话)"},null,8,["value","options","loading"]),_(L(qe),{value:me.value,"onUpdate:value":a[9]||(a[9]=e=>me.value=e),placeholder:"输入新会话别名(可选)",maxlength:"120"},null,8,["value"])]),_:1})]),_:1},8,["show"]),_(L(ve),{show:z.value,"onUpdate:show":a[11]||(a[11]=e=>z.value=e),preset:"card",title:"搜索结果",style:{width:"1200px"}},{default:O(()=>[F.value?(S(),W("div",nt,[_(L(Te),{type:"info",style:{"margin-bottom":"16px"}},{default:O(()=>[w(' 关键词 "'+$(F.value.keyword)+'" 共找到 '+$(F.value.totalMatches)+" 处匹配 ",1)]),_:1}),(S(!0),W(U,null,j(F.value.sessions,e=>(S(),W("div",{key:e.sessionId,class:"search-result-item"},[J("div",lt,[J("div",it,[_(L(_e),{strong:""},{default:O(()=>[w($(e.alias?`${e.alias} (${e.sessionId.substring(0,8)})`:e.sessionId.substring(0,8)),1)]),_:2},1024),_(L(He),{size:"small",bordered:!1},{default:O(()=>[w($(e.matchCount)+" 个匹配",1)]),_:2},1024)]),_(L(v),{size:"small",type:"primary",onClick:a=>va(e.sessionId)},{icon:O(()=>[_(L(c),null,{default:O(()=>[_(L(te))]),_:1})]),default:O(()=>[a[34]||(a[34]=w(" 使用对话 ",-1))]),_:1},8,["onClick"])]),(S(!0),W(U,null,j(e.matches,(e,a)=>(S(),W("div",{key:a,class:"search-match"},[_(L(He),{size:"tiny",type:"user"===e.role?"info":"success",bordered:!1},{default:O(()=>[w($("user"===e.role?"用户":"助手"),1)]),_:2},1032,["type"]),_(L(_e),{depth:"3",class:"search-match-text",innerHTML:fa(e.context,F.value.keyword)},null,8,["innerHTML"])]))),128))]))),128)),0===F.value.sessions.length?(S(),M(L(Ue),{key:0,description:"没有找到匹配的内容"})):y("",!0)])):y("",!0)]),_:1},8,["show"]),we.value?(S(),M(Ge,{key:0,ref_key:"chatHistoryRef",ref:Ce,show:ye.value,"onUpdate:show":a[12]||(a[12]=e=>ye.value=e),"project-name":d.value,"session-id":we.value,"session-alias":ke.value,channel:r.value,onError:ca},null,8,["show","project-name","session-id","session-alias","channel"])):y("",!0),_(Aa,{show:T.value,"onUpdate:show":a[13]||(a[13]=e=>T.value=e),"project-path":Se.value,platform:r.value},null,8,["show","project-path","platform"])]))}},[["__scopeId","data-v-66cfe9c9"]]);export{rt as default};