coding-tool-x 3.8.8 → 3.8.10

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 (134) hide show
  1. package/README.md +56 -388
  2. package/dist/web/assets/AgentsDrawer-Bam7kBjG.js +1 -0
  3. package/dist/web/assets/Analytics-D5dUWXEa.js +1 -0
  4. package/dist/web/assets/AssetPathField-CLqalYv-.js +1 -0
  5. package/dist/web/assets/{ChatHistoryDrawer-CrfS0KYV.js → ChatHistoryDrawer-C1At65O3.js} +1 -1
  6. package/dist/web/assets/{CollapseItem-ClMsJuUu.js → CollapseItem-CVWojShK.js} +1 -1
  7. package/dist/web/assets/CommandsDrawer-BEoypGBf.js +1 -0
  8. package/dist/web/assets/ConfigExportDrawer-DBvFDDWK.js +1 -0
  9. package/dist/web/assets/ConfigTemplates-BpaWG-iC.js +1 -0
  10. package/dist/web/assets/{ConfigTemplatesDrawer-BqM32Im7.js → ConfigTemplatesDrawer-C2lvyKMf.js} +1 -1
  11. package/dist/web/assets/ConfigTemplatesPanel-CorOY7kY.js +1 -0
  12. package/dist/web/assets/{Divider-DsdbkHrG.js → Divider-BLLhMTSt.js} +1 -1
  13. package/dist/web/assets/FavoritesDrawer-uW88N6te.js +1 -0
  14. package/dist/web/assets/GatewayConvertDrawer-i5Wt9Dd9.js +1 -0
  15. package/dist/web/assets/Home-BIxWvm29.js +1 -0
  16. package/dist/web/assets/{MarkdownEditor-BMMUufSc.js → MarkdownEditor-Ul0bSGj-.js} +1 -1
  17. package/dist/web/assets/McpDrawer-Cc2xq77I.js +1 -0
  18. package/dist/web/assets/McpFormDrawer-DLHX_nrI.js +1 -0
  19. package/dist/web/assets/{PluginManager-C4kJlpVX.js → PluginManager-BGQ0xF2F.js} +1 -1
  20. package/dist/web/assets/{PluginsDrawer-05R4k15x.js → PluginsDrawer-STwHEqiF.js} +1 -1
  21. package/dist/web/assets/PluginsPanel-1zuNP7da.js +1 -0
  22. package/dist/web/assets/ProjectList-VbIYSHbH.css +1 -0
  23. package/dist/web/assets/ProjectList-_pe2nk9c.js +1 -0
  24. package/dist/web/assets/PromptsDrawer-CJN1xZk7.js +1 -0
  25. package/dist/web/assets/RecentSessionsDrawer-DX1HI8Nm.js +1 -0
  26. package/dist/web/assets/SessionCard-Op6PHvi0.js +1 -0
  27. package/dist/web/assets/SessionList-Da_TAEYr.js +1 -0
  28. package/dist/web/assets/SettingsDrawer-DKLd4Sjy.js +1 -0
  29. package/dist/web/assets/{SkillManager-D9jkNuRM.js → SkillManager-PcAa5EbF.js} +1 -1
  30. package/dist/web/assets/{SkillsDrawer-0Z4IefxC.js → SkillsDrawer-DPdU4p6C.js} +1 -1
  31. package/dist/web/assets/SkillsPanel-B9qzRqjd.js +1 -0
  32. package/dist/web/assets/Upload-e1M9Yp5z.js +1 -0
  33. package/dist/web/assets/{WorkspaceDrawer-eujtWpoq.js → WorkspaceDrawer-oS6mB1VZ.js} +1 -1
  34. package/dist/web/assets/{WorkspaceManager-CQ-8Ej68.js → WorkspaceManager-6VvRWe3r.js} +1 -1
  35. package/dist/web/assets/WorkspacePanel-CYq0Z8iY.js +1 -0
  36. package/dist/web/assets/client-BgcNg4Bt.js +1 -0
  37. package/dist/web/assets/headers-DbowkmZJ.js +1 -0
  38. package/dist/web/assets/{icons-DmFe4b5j.js → icons-B-AzZoeE.js} +1 -1
  39. package/dist/web/assets/index-BlUXw84U.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-DZd5rNk5.js → useResponsiveDrawer-ChHZrTfl.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/package.json +4 -2
  52. package/src/commands/daemon.js +27 -4
  53. package/src/commands/export-config.js +17 -211
  54. package/src/config/model-metadata.json +180 -16
  55. package/src/platforms/channel-auth-registry.js +36 -6
  56. package/src/platforms/channel-auth-service.js +13 -3
  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/omp/prompts.js +58 -2
  75. package/src/platforms/drivers/omp/proxy-implementation.js +25 -1
  76. package/src/platforms/drivers/opencode/channels-implementation.js +31 -22
  77. package/src/platforms/drivers/opencode/channels.js +6 -1
  78. package/src/platforms/drivers/opencode/native-config-implementation.js +3 -67
  79. package/src/platforms/manifest-schema.js +35 -2
  80. package/src/platforms/manifests/claude.json +0 -8
  81. package/src/platforms/manifests/codex.json +0 -8
  82. package/src/platforms/manifests/dsh.json +6 -9
  83. package/src/platforms/manifests/gemini.json +0 -8
  84. package/src/platforms/manifests/omp.json +2 -9
  85. package/src/platforms/manifests/opencode.json +28 -8
  86. package/src/platforms/native-oauth-adapters.js +351 -51
  87. package/src/platforms/oauth-credentials-service.js +344 -13
  88. package/src/server/index.js +37 -1
  89. package/src/server/services/bounded-content.js +60 -0
  90. package/src/server/services/channel-balance.js +10 -4
  91. package/src/server/services/config-export-service.js +2 -2
  92. package/src/server/services/config-templates-service.js +5 -1
  93. package/src/server/services/plugins-service.js +162 -85
  94. package/src/server/services/session-history-maintenance-worker.js +71 -0
  95. package/src/server/services/session-history-maintenance.js +166 -0
  96. package/src/server/services/skill-service.js +23 -3
  97. package/src/server/services/speed-test.js +0 -72
  98. package/src/shared/channel-driver.js +16 -0
  99. package/src/shared/driver-factories/api.js +1 -0
  100. package/src/utils/native-config-patcher.js +474 -0
  101. package/dist/web/assets/AgentsDrawer-DRQuwi0m.js +0 -1
  102. package/dist/web/assets/Analytics-Cf5KwEdj.js +0 -1
  103. package/dist/web/assets/AssetPathField-DyniM0pF.js +0 -1
  104. package/dist/web/assets/CommandsDrawer-CzHelf56.js +0 -1
  105. package/dist/web/assets/ConfigExportDrawer-BEZ8wTby.js +0 -1
  106. package/dist/web/assets/ConfigTemplates-Crg3xWe5.js +0 -1
  107. package/dist/web/assets/ConfigTemplatesPanel-lTdutC8H.js +0 -1
  108. package/dist/web/assets/FavoritesDrawer-DDyWUBJR.js +0 -1
  109. package/dist/web/assets/GatewayConvertDrawer-Rigtt_5J.js +0 -1
  110. package/dist/web/assets/Home-tCSKmSHV.js +0 -1
  111. package/dist/web/assets/McpDrawer-CmE-d7VW.js +0 -1
  112. package/dist/web/assets/McpFormDrawer-ByvS18od.js +0 -1
  113. package/dist/web/assets/PluginsPanel-BCoEs7Og.js +0 -1
  114. package/dist/web/assets/ProjectList-BJt1OIaI.js +0 -1
  115. package/dist/web/assets/ProjectList-DG3yu8xZ.css +0 -1
  116. package/dist/web/assets/PromptsDrawer-DnwBf_oW.js +0 -1
  117. package/dist/web/assets/RecentSessionsDrawer-B7d-38wH.js +0 -1
  118. package/dist/web/assets/SessionCard-BUgjHQwX.js +0 -1
  119. package/dist/web/assets/SessionList-B-bXZRFk.js +0 -1
  120. package/dist/web/assets/SettingsDrawer-BITzjQLl.js +0 -1
  121. package/dist/web/assets/SkillsPanel-BKIVOj7n.js +0 -1
  122. package/dist/web/assets/SpeedTestDrawer-Bx1bYf5i.js +0 -1
  123. package/dist/web/assets/SpeedTestDrawer-Dc0WToJ_.css +0 -1
  124. package/dist/web/assets/Upload-CzC4rGI4.js +0 -1
  125. package/dist/web/assets/WorkspacePanel-Cql5qE2R.js +0 -1
  126. package/dist/web/assets/client-UDwXBP9i.js +0 -1
  127. package/dist/web/assets/headers-BqDmkMjy.js +0 -1
  128. package/dist/web/assets/index-Cmmwj3Fx.js +0 -2
  129. package/dist/web/assets/index-Cnbe696C.css +0 -1
  130. package/dist/web/assets/platforms-BmzzwnSw.js +0 -1
  131. package/dist/web/assets/platforms-DWXgmy2w.js +0 -1
  132. package/dist/web/assets/project-config-B2baPzYL.js +0 -1
  133. package/dist/web/assets/sessions-DqlbocLJ.js +0 -1
  134. package/dist/web/assets/use-message-DqCwefG6.js +0 -1
@@ -1 +0,0 @@
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 D,Z as R,_t as A,at as B,b as V,dt as z,et as T,g as F,ht as E,mt as L,nt as M,st as q,ut as N,w as K,x as W}from"./vue-vendor-BqZbbXHA.js";import{n as G}from"./client-UDwXBP9i.js";import{J as Z,Mt as H,Pt as J,bt as Q,et as Y,g as X,jt as ee,z as ae}from"./icons-DmFe4b5j.js";import{n as te,t as le}from"./CollapseItem-ClMsJuUu.js";import{n as re,t as se}from"./useResponsiveDrawer-DZd5rNk5.js";import{t as ne}from"./DrawerContent-ChXgZ1Xm.js";import{$ as ie,F as oe,I as ue,N as de,St as ce,dt as pe,et as ve,jt as me,q as fe,tt as he,yt as ge}from"./index-Cmmwj3Fx.js";import{s as ye}from"./project-config-B2baPzYL.js";var be=C({name:"ArrowDown",render:()=>I("svg",{viewBox:"0 0 28 28",version:"1.1",xmlns:"http://www.w3.org/2000/svg"},I("g",{stroke:"none","stroke-width":"1","fill-rule":"evenodd"},I("g",{"fill-rule":"nonzero"},I("path",{d:"M23.7916,15.2664 C24.0788,14.9679 24.0696,14.4931 23.7711,14.206 C23.4726,13.9188 22.9978,13.928 22.7106,14.2265 L14.7511,22.5007 L14.7511,3.74792 C14.7511,3.33371 14.4153,2.99792 14.0011,2.99792 C13.5869,2.99792 13.2511,3.33371 13.2511,3.74793 L13.2511,22.4998 L5.29259,14.2265 C5.00543,13.928 4.53064,13.9188 4.23213,14.206 C3.93361,14.4931 3.9244,14.9679 4.21157,15.2664 L13.2809,24.6944 C13.6743,25.1034 14.3289,25.1034 14.7223,24.6944 L23.7916,15.2664 Z"}))))}),ke=C({name:"ArrowUp",render:()=>I("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20"},I("g",{fill:"none"},I("path",{d:"M3.13 9.163a.5.5 0 1 0 .74.674L9.5 3.67V17.5a.5.5 0 0 0 1 0V3.672l5.63 6.165a.5.5 0 0 0 .738-.674l-6.315-6.916a.746.746 0 0 0-.632-.24a.746.746 0 0 0-.476.24L3.131 9.163z",fill:"currentColor"})))}),we="0!important",xe="-1px!important";function Ce(e){return x(`${e}-type`,[p("& +",[d("button",{},[x(`${e}-type`,[k("border",{borderLeftWidth:we}),k("state-border",{left:xe})])])])])}function $e(e){return x(`${e}-type`,[p("& +",[d("button",[x(`${e}-type`,[k("border",{borderTopWidth:we}),k("state-border",{top:xe})])])])])}var Pe=d("button-group","\n flex-wrap: nowrap;\n display: inline-flex;\n position: relative;\n",[o("vertical",{flexDirection:"row"},[o("rtl",[d("button",[p("&:first-child:not(:last-child)",`\n margin-right: ${we};\n border-top-right-radius: ${we};\n border-bottom-right-radius: ${we};\n `),p("&:last-child:not(:first-child)",`\n margin-left: ${we};\n border-top-left-radius: ${we};\n border-bottom-left-radius: ${we};\n `),p("&:not(:first-child):not(:last-child)",`\n margin-left: ${we};\n margin-right: ${we};\n border-radius: ${we};\n `),Ce("default"),x("ghost",[Ce("primary"),Ce("info"),Ce("success"),Ce("warning"),Ce("error")])])])]),x("vertical",{flexDirection:"column"},[d("button",[p("&:first-child:not(:last-child)",`\n margin-bottom: ${we};\n margin-left: ${we};\n margin-right: ${we};\n border-bottom-left-radius: ${we};\n border-bottom-right-radius: ${we};\n `),p("&:last-child:not(:first-child)",`\n margin-top: ${we};\n margin-left: ${we};\n margin-right: ${we};\n border-top-left-radius: ${we};\n border-top-right-radius: ${we};\n `),p("&:not(:first-child):not(:last-child)",`\n margin: ${we};\n border-radius: ${we};\n `),$e("default"),x("ghost",[$e("primary"),$e("info"),$e("success"),$e("warning"),$e("error")])])])]),je=C({name:"ButtonGroup",props:{size:{type:String,default:void 0},vertical:Boolean},setup(a){const{mergedClsPrefixRef:t,mergedRtlRef:r}=c(a);return l("-button-group",Pe,t),j(u,a),{rtlEnabled:e("ButtonGroup",r,t),mergedClsPrefix:t}},render(){const{mergedClsPrefix:e}=this;return I("div",{class:[`${e}-button-group`,this.rtlEnabled&&`${e}-button-group--rtl`,this.vertical&&`${e}-button-group--vertical`],role:"group"},this.$slots)}}),Ue=i("n-dynamic-input"),Ie=C({name:"DynamicInputInputPreset",props:{clsPrefix:{type:String,required:!0},value:{type:String,default:""},disabled:Boolean,parentPath:String,path:String,onUpdateValue:{type:Function,required:!0}},setup(){const{mergedThemeRef:e,placeholderRef:a}=_(Ue);return{mergedTheme:e,placeholder:a}},render(){const{mergedTheme:e,placeholder:a,value:t,clsPrefix:l,onUpdateValue:r,disabled:s}=this;return I("div",{class:`${l}-dynamic-input-preset-input`},I(pe,{theme:e.peers.Input,"theme-overrides":e.peerOverrides.Input,value:t,placeholder:a,onUpdateValue:r,disabled:s}))}}),_e=C({name:"DynamicInputPairPreset",props:{clsPrefix:{type:String,required:!0},value:{type:Object,default:()=>({key:"",value:""})},disabled:Boolean,parentPath:String,path:String,onUpdateValue:{type:Function,required:!0}},setup(e){const{mergedThemeRef:a,keyPlaceholderRef:t,valuePlaceholderRef:l}=_(Ue);return{mergedTheme:a,keyPlaceholder:t,valuePlaceholder:l,handleKeyInput(a){e.onUpdateValue({key:a,value:e.value.value})},handleValueInput(a){e.onUpdateValue({key:e.value.key,value:a})}}},render(){const{mergedTheme:e,keyPlaceholder:a,valuePlaceholder:t,value:l,clsPrefix:r,disabled:s}=this;return I("div",{class:`${r}-dynamic-input-preset-pair`},I(pe,{theme:e.peers.Input,"theme-overrides":e.peerOverrides.Input,value:l.key,class:`${r}-dynamic-input-pair-input`,placeholder:a,onUpdateValue:this.handleKeyInput,disabled:s}),I(pe,{theme:e.peers.Input,"theme-overrides":e.peerOverrides.Input,value:l.value,class:`${r}-dynamic-input-pair-input`,placeholder:t,onUpdateValue:this.handleValueInput,disabled:s}))}}),Se=d("dynamic-input",{width:"100%"},[d("dynamic-input-item","\n margin-bottom: 10px;\n display: flex;\n flex-wrap: nowrap;\n ",[d("dynamic-input-preset-input",{flex:1,alignItems:"center"}),d("dynamic-input-preset-pair","\n flex: 1;\n display: flex;\n align-items: center;\n ",[d("dynamic-input-pair-input",[p("&:first-child",{"margin-right":"12px"})])]),k("action","\n align-self: flex-start;\n display: flex;\n justify-content: flex-end;\n flex-shrink: 0;\n flex-grow: 0;\n margin: var(--action-margin);\n ",[x("icon",{cursor:"pointer"})]),p("&:last-child",{marginBottom:0})]),d("form-item","\n padding-top: 0 !important;\n margin-right: 0 !important;\n ",[d("form-item-blank",{paddingTop:"0 !important"})])]),Oe=new WeakMap,De=C({name:"DynamicInput",props:Object.assign(Object.assign({},t.props),{max:Number,min:{type:Number,default:0},value:Array,defaultValue:{type:Array,default:()=>[]},preset:{type:String,default:"input"},keyField:String,itemClass:String,itemStyle:[String,Object],keyPlaceholder:{type:String,default:""},valuePlaceholder:{type:String,default:""},placeholder:{type:String,default:""},disabled:Boolean,showSortButton:Boolean,createButtonProps:Object,onCreate:Function,onRemove:Function,"onUpdate:value":[Function,Array],onUpdateValue:[Function,Array],onClear:Function,onInput:[Function,Array]}),setup(l,{slots:s}){const{mergedComponentPropsRef:i,mergedClsPrefixRef:o,mergedRtlRef:u,inlineThemeDisabled:d}=c(),p=_(h,null),m=q(l.defaultValue),f=z(l,"value"),y=r(f,m),b=t("DynamicInput","-dynamic-input",Se,fe,l,o),k=V(()=>{const{value:e}=y;if(Array.isArray(e)){const{max:a}=l;return void 0!==a&&e.length>=a}return!1}),w=V(()=>{const{value:e}=y;return!Array.isArray(e)||e.length<=l.min}),x=V(()=>{var e,a;return null===(a=null===(e=null==i?void 0:i.value)||void 0===e?void 0:e.DynamicInput)||void 0===a?void 0:a.buttonSize});function C(e){const{onInput:a,"onUpdate:value":t,onUpdateValue:r}=l;a&&n(a,e),t&&n(t,e),r&&n(r,e),m.value=e}function $(e){const{value:a}=y,{onCreate:t}=l,r=Array.from(null!=a?a:[]);if(t)r.splice(e+1,0,t(e+1)),C(r);else if(s.default)r.splice(e+1,0,null),C(r);else switch(l.preset){case"input":r.splice(e+1,0,""),C(r);break;case"pair":r.splice(e+1,0,{key:"",value:""}),C(r)}}function P(e,a,t){if(a<0||t<0||a>=e.length||t>=e.length)return;if(a===t)return;const l=e[a];e[a]=e[t],e[t]=l}j(Ue,{mergedThemeRef:b,keyPlaceholderRef:z(l,"keyPlaceholder"),valuePlaceholderRef:z(l,"valuePlaceholder"),placeholderRef:z(l,"placeholder")});const U=e("DynamicInput",u,o),I=V(()=>{const{self:{actionMargin:e,actionMarginRtl:a}}=b.value;return{"--action-margin":e,"--action-margin-rtl":a}}),S=d?v("dynamic-input",void 0,I,l):void 0;return{locale:a("DynamicInput").localeRef,rtlEnabled:U,buttonSize:x,mergedClsPrefix:o,NFormItem:p,uncontrolledValue:m,mergedValue:y,insertionDisabled:k,removeDisabled:w,handleCreateClick:function(){$(-1)},ensureKey:function(e,a){if(null==e)return a;if("object"!=typeof e)return a;const t=M(e)?N(e):e;let l=Oe.get(t);return void 0===l&&Oe.set(t,l=g()),l},handleValueChange:function(e,a){const{value:t}=y,l=Array.from(null!=t?t:[]),r=l[e];if(l[e]=a,r&&a&&"object"==typeof r&&"object"==typeof a){const e=M(r)?N(r):r,t=M(a)?N(a):a,l=Oe.get(e);void 0!==l&&Oe.set(t,l)}C(l)},remove:function(e){const{value:a}=y;if(!Array.isArray(a))return;const{min:t}=l;if(a.length<=t)return;const{onRemove:r}=l;r&&r(e);const s=Array.from(a);s.splice(e,1),C(s)},move:function(e,a){const{value:t}=y;if(!Array.isArray(t))return;const l=Array.from(t);"up"===e&&P(l,a,a-1),"down"===e&&P(l,a,a+1),C(l)},createItem:$,mergedTheme:b,cssVars:d?void 0:I,themeClass:null==S?void 0:S.themeClass,onRender:null==S?void 0:S.onRender}},render(){const{$slots:e,itemClass:a,buttonSize:t,mergedClsPrefix:l,mergedValue:r,locale:n,mergedTheme:i,keyField:o,itemStyle:u,preset:d,showSortButton:c,NFormItem:p,ensureKey:v,handleValueChange:m,remove:h,createItem:g,move:b,onRender:k,disabled:x}=this;return null==k||k(),I("div",{class:[`${l}-dynamic-input`,this.rtlEnabled&&`${l}-dynamic-input--rtl`,this.themeClass],style:this.cssVars},Array.isArray(r)&&0!==r.length?r.map((n,k)=>I("div",{key:o?n[o]:v(n,k),"data-key":o?n[o]:v(n,k),class:[`${l}-dynamic-input-item`,a],style:u},s(e.default,{value:r[k],index:k},()=>["input"===d?I(Ie,{disabled:x,clsPrefix:l,value:r[k],parentPath:p?p.path.value:void 0,path:(null==p?void 0:p.path.value)?`${p.path.value}[${k}]`:void 0,onUpdateValue:e=>{m(k,e)}}):"pair"===d?I(_e,{disabled:x,clsPrefix:l,value:r[k],parentPath:p?p.path.value:void 0,path:(null==p?void 0:p.path.value)?`${p.path.value}[${k}]`:void 0,onUpdateValue:e=>{m(k,e)}}):null]),s(e.action,{value:r[k],index:k,create:g,remove:h,move:b},()=>[I("div",{class:`${l}-dynamic-input-item__action`},I(je,{size:t},{default:()=>[I(y,{disabled:this.removeDisabled||x,theme:i.peers.Button,themeOverrides:i.peerOverrides.Button,circle:!0,onClick:()=>{h(k)}},{icon:()=>I(f,{clsPrefix:l},{default:()=>I(ge,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(ce,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(ce,null)})])}))}});async function Re(){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 Fe(e){return(await G.post("/mcp/servers/order",{serverIds:e})).data}async function Ee(e="json"){return(await G.get("/mcp/export",{params:{format:e}})).data}var Le={class:"drawer-header"},Me={class:"header-title"},qe={class:"drawer-footer"},Ne={class:"form-content"},Ke={key:0,class:"form-group"},We={class:"group-title"},Ge={class:"preset-grid"},Ze=["onClick"],He={class:"form-group"},Je={class:"group-title"},Qe={class:"field"},Ye={key:0,class:"field-error"},Xe={class:"field"},ea={key:1,class:"form-group"},aa={class:"group-title"},ta={class:"platform-toggles"},la={class:"platform-name"},ra={key:0,class:"platform-empty"},sa={class:"form-group"},na={class:"group-title"},ia={class:"field"},oa={class:"field"},ua={class:"field"},da={class:"field"},ca={class:"kv-row"},pa={class:"field"},va={class:"field"},ma={class:"kv-row"},fa={class:"collapse-header"},ha={class:"collapse-content"},ga={class:"field"},ya={class:"field"},ba={class:"field-row"},ka={class:"field"},wa={class:"field"},xa=b({__name:"McpFormDrawer",props:{visible:{type:Boolean,default:!1},editingServer:{type:Object,default:null},existingIds:{type:Array,default:()=>[]},platforms:{type:Array,default:()=>[]},platform:{type:String,default:"claude"},scope:{type:String,default:"user"},projectPath:{type:String,default:""}},emits:["update:visible","saved"],setup(e,{emit:a}){const{drawerWidth:t}=se(520),l=e,r=a,s=V({get:()=>l.visible,set:e=>r("update:visible",e)}),n=V(()=>!!l.editingServer),i=q([]),o=q(!1),u=q(-1),d=q(!1),{byCapability:c}=me(),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 de.error("请输入服务器 ID");if(w.value)return void de.error(w.value);if("stdio"===h.value&&!f.server.command?.trim())return void de.error("请输入命令");if(("streamable_http"===h.value||"sse"===h.value)&&!f.server.url?.trim())return void de.error("请输入 URL");const e={type:h.value};if("stdio"===h.value){e.command=f.server.command,f.server.args?.length&&(e.args=f.server.args.filter(e=>e.trim()));const a={};g.value.forEach(e=>{const t=e.key.trim();t&&"[REDACTED]"!==e.value&&(a[t]=e.value)}),Object.keys(a).length>0&&(e.env=a)}else{e.url=f.server.url;const a={};b.value.forEach(e=>{const t=e.key.trim();t&&"[REDACTED]"!==e.value&&(a[t]=e.value)}),Object.keys(a).length>0&&(e.headers=a)}const a={id:f.id.trim(),name:f.name.trim()||f.id.trim(),server:e,apps:n.value?{...f.apps}:Object.fromEntries(p.value.map(e=>[e.key,!0===f.apps[e.key]]))};f.description.trim()&&(a.description=f.description.trim()),f.homepage.trim()&&(a.homepage=f.homepage.trim()),f.docs.trim()&&(a.docs=f.docs.trim()),k.value.trim()&&(a.tags=k.value.split(",").map(e=>e.trim()).filter(e=>e)),d.value=!0;try{("project"===l.scope?await ye(l.projectPath,l.platform,a.id,a.server):await Ae(a)).success&&(de.success(n.value?"保存成功":"添加成功"),r("saved"),s.value=!1)}catch(t){de.error(t.response?.data?.error||"保存失败")}finally{d.value=!1}}return R(()=>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))}),R(h,e=>{f.server.type=e}),(a,r)=>(D(),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(ee))]),_: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(ue),{show:o.value},{default:T(()=>[W("div",Ne,[n.value?$("",!0):(D(),K("div",Ke,[W("div",We,[S(L(m),{size:16,class:"group-icon"},{default:T(()=>[S(L(Z))]),_:1}),r[16]||(r[16]=W("span",null,"快速选择",-1))]),W("div",Ge,[W("div",{class:E(["preset-chip",{active:-1===u.value}]),onClick:j},[S(L(m),{size:14},{default:T(()=>[S(L(J))]),_:1}),r[17]||(r[17]=W("span",null,"自定义",-1))],2),(D(!0),K(F,null,U(i.value,(e,a)=>(D(),O(L(ie),{key:e.id,disabled:!x(e.id)},{trigger:T(()=>[W("div",{class:E(["preset-chip",{active:u.value===a,disabled:x(e.id)}]),onClick:t=>!x(e.id)&&function(e){u.value=e;const a=i.value[e];if(!a)return;let t=a.id,r=1;for(;l.existingIds.includes(t);)t=`${a.id}-${r}`,r++;f.id=t,f.name=a.name||a.id,f.description=a.description||"",f.homepage=a.homepage||"",f.docs=a.docs||"",k.value=(a.tags||[]).join(", "),a.server&&(h.value=a.server.type||"stdio",f.server={...a.server},f.server.type=h.value,a.server.env?g.value=Object.entries(a.server.env).map(([e,a])=>({key:e,value:a})):g.value=[],a.server.headers?b.value=Object.entries(a.server.headers).map(([e,a])=>({key:e,value:a})):b.value=[])}(a)},[P(A(e.id)+" ",1),x(e.id)?(D(),O(L(m),{key:0,size:12,class:"installed-icon"},{default:T(()=>[S(L(Q))]),_:1})):$("",!0)],10,Ze)]),default:T(()=>[r[18]||(r[18]=P(" 已安装 ",-1))]),_:2},1032,["disabled"]))),128))])])),W("div",He,[W("div",Je,[S(L(m),{size:16,class:"group-icon"},{default:T(()=>[S(L(ae))]),_:1}),r[19]||(r[19]=W("span",null,"基本信息",-1))]),W("div",Qe,[r[20]||(r[20]=W("label",{class:"field-label"},[P(" ID "),W("span",{class:"required"},"*")],-1)),S(L(pe),{value:f.id,"onUpdate:value":r[2]||(r[2]=e=>f.id=e),placeholder:"服务器唯一标识,如 fetch、memory",disabled:n.value,status:w.value?"error":void 0},null,8,["value","disabled","status"]),w.value?(D(),K("span",Ye,A(w.value),1)):$("",!0)]),W("div",Xe,[r[21]||(r[21]=W("label",{class:"field-label"},"显示名称",-1)),S(L(pe),{value:f.name,"onUpdate:value":r[3]||(r[3]=e=>f.name=e),placeholder:"可选,用于展示的名称"},null,8,["value"])])]),"project"!==e.scope?(D(),K("div",ea,[W("div",aa,[S(L(m),{size:16,class:"group-icon"},{default:T(()=>[S(L(H))]),_:1}),r[22]||(r[22]=W("span",null,"启用平台",-1))]),W("div",ta,[(D(!0),K(F,null,U(p.value,e=>(D(),K("label",{key:e.key,class:"platform-item"},[S(L(oe),{size:"small",value:f.apps[e.key],"onUpdate:value":a=>f.apps[e.key]=a},null,8,["value","onUpdate:value"]),W("span",la,A(e.label||e.title||e.key),1)]))),128)),0===p.value.length?(D(),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(ve),{value:h.value,"onUpdate:value":r[4]||(r[4]=e=>h.value=e),class:"type-radios"},{default:T(()=>[S(L(he),{value:"stdio"},{default:T(()=>[...r[24]||(r[24]=[W("span",{class:"radio-label"},"stdio",-1),W("span",{class:"radio-desc"},"本地命令",-1)])]),_:1}),S(L(he),{value:"streamable_http"},{default:T(()=>[...r[25]||(r[25]=[W("span",{class:"radio-label"},"streamable_http",-1)])]),_:1}),S(L(he),{value:"sse"},{default:T(()=>[...r[26]||(r[26]=[W("span",{class:"radio-label"},"sse",-1)])]),_:1})]),_:1},8,["value"])]),"stdio"===h.value?(D(),K(F,{key:0},[W("div",oa,[r[28]||(r[28]=W("label",{class:"field-label"},[P(" 命令 "),W("span",{class:"required"},"*")],-1)),S(L(pe),{value:f.server.command,"onUpdate:value":r[5]||(r[5]=e=>f.server.command=e),placeholder:"如 npx、uvx、node"},null,8,["value"])]),W("div",ua,[r[29]||(r[29]=W("label",{class:"field-label"},"参数",-1)),S(L(De),{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(De),{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(pe),{value:e.key,"onUpdate:value":a=>e.key=a,placeholder:"变量名",class:"kv-key"},null,8,["value","onUpdate:value"]),r[30]||(r[30]=W("span",{class:"kv-sep"},"=",-1)),S(L(pe),{value:e.value,"onUpdate:value":a=>e.value=a,placeholder:"值",class:"kv-value"},null,8,["value","onUpdate:value"])])]),_:1},8,["value"])])],64)):(D(),K(F,{key:1},[W("div",pa,[r[32]||(r[32]=W("label",{class:"field-label"},[P(" URL "),W("span",{class:"required"},"*")],-1)),S(L(pe),{value:f.server.url,"onUpdate:value":r[8]||(r[8]=e=>f.server.url=e),placeholder:"http://localhost:3000/mcp"},null,8,["value"])]),W("div",va,[r[34]||(r[34]=W("label",{class:"field-label"},"请求头",-1)),S(L(De),{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(pe),{value:e.key,"onUpdate:value":a=>e.key=a,placeholder:"Header 名",class:"kv-key"},null,8,["value","onUpdate:value"]),r[33]||(r[33]=W("span",{class:"kv-sep"},":",-1)),S(L(pe),{value:e.value,"onUpdate:value":a=>e.value=a,placeholder:"值",class:"kv-value"},null,8,["value","onUpdate:value"])])]),_:1},8,["value"])])],64))]),S(L(te),{class:"extra-collapse"},{default:T(()=>[S(L(le),{name:"extra"},{header:T(()=>[W("div",fa,[S(L(m),{size:16,class:"group-icon"},{default:T(()=>[S(L(Y))]),_: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(pe),{value:f.description,"onUpdate:value":r[10]||(r[10]=e=>f.description=e),type:"textarea",placeholder:"服务器功能描述",rows:2},null,8,["value"])]),W("div",ya,[r[38]||(r[38]=W("label",{class:"field-label"},"标签",-1)),S(L(pe),{value:k.value,"onUpdate:value":r[11]||(r[11]=e=>k.value=e),placeholder:"用逗号分隔,如 http, web, fetch"},null,8,["value"])]),W("div",ba,[W("div",ka,[r[39]||(r[39]=W("label",{class:"field-label"},"主页",-1)),S(L(pe),{value:f.homepage,"onUpdate:value":r[12]||(r[12]=e=>f.homepage=e),placeholder:"https://github.com/..."},null,8,["value"])]),W("div",wa,[r[40]||(r[40]=W("label",{class:"field-label"},"文档",-1)),S(L(pe),{value:f.docs,"onUpdate:value":r[13]||(r[13]=e=>f.docs=e),placeholder:"https://..."},null,8,["value"])])])])]),_:1})]),_:1})])]),_:1},8,["show"])]),_:1})]),_:1},8,["show","width"]))}},[["__scopeId","data-v-f2623980"]]);export{ze as a,Ve as c,Re as i,Fe as l,Be as n,Ae as o,Ee as r,Te as s,xa as t};
@@ -1 +0,0 @@
1
- import{i as e,s as a,t as l}from"./_plugin-vue_export-helper-BeLZJZij.js";import{C as t,D as s,K as n,O as i,S as r,V as o,W as u,Z as c,_t as p,b as d,et as v,g as m,ht as f,m as g,mt as y,p as h,r as k,st as b,w,x as P}from"./vue-vendor-BqZbbXHA.js";import{n as _}from"./client-UDwXBP9i.js";import{r as j,s as U,t as C}from"./platforms-DWXgmy2w.js";import{C as $,I,Pt as T,W as L,X as z,_ as x,dt as S,et as O,jt as B,k as H,o as G,z as A}from"./icons-DmFe4b5j.js";import{t as R}from"./use-message-DqCwefG6.js";import{l as M}from"./light-0eavxNvt.js";import{c as D,n as N,s as K,t as q}from"./AssetPathField-DyniM0pF.js";import{n as E,t as V}from"./useResponsiveDrawer-DZd5rNk5.js";import{t as W}from"./DrawerContent-ChXgZ1Xm.js";import{F,I as Q,N as X,O as Z,dt as J,ft as Y,gt as ee,jt as ae,k as le,mt as te,rt as se}from"./index-Cmmwj3Fx.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 Z(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=le(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=le(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"},Ce={key:0,class:"asset-description"},$e={class:"asset-meta"},Ie={class:"asset-meta-item mono"},Te=["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",Ce,p((c=e.plugin.description,d=120,c?.length>d?c.slice(0,d)+"...":c)),1)):t("",!0),P("div",$e,[P("span",Ie,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,Te)):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"},xe={class:"repo-list"},Se={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"},We={class:"recommended-list"},Fe=["onClick"],Qe={class:"rec-info"},Xe={class:"rec-name"},Ze={class:"rec-desc"},Je={key:0,class:"auth-manager"},Ye={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)}),C=b([]),$=b(!1),I=b(!1),L=b(!1),z=b(!1),x=b(null),S=b(!1),O=b(!1),B=b({token:""}),H=b({input:"",branch:"main"}),A=d(()=>"native-marketplace"===k.capabilities.repositoryMode),R=d(()=>({...k.projectPath?{cwd:k.projectPath}:{}})),D=d(()=>x.value?("gitlab"===x.value.provider?"GitLab":"GitHub")+" 仓库认证":"仓库认证"),N=d(()=>"opencode"===k.platform?[{owner:"Tommertom",name:"opencode-plugin-marketplace",url:"https://github.com/Tommertom/opencode-plugin-marketplace",description:"OpenCode 插件市场",branch:"main"},{owner:"avifenesh",name:"awesome-slash",url:"https://github.com/avifenesh/awesome-slash",description:"Awesome Slash 命令集",branch:"main"},{owner:"NeoLabHQ",name:"context-engineering-kit",url:"https://github.com/NeoLabHQ/context-engineering-kit",description:"上下文工程工具包",branch:"master"},{owner:"awesome-opencode",name:"awesome-opencode",url:"https://github.com/awesome-opencode/awesome-opencode",description:"OpenCode 生态聚合",branch:"main"},{owner:"sst",name:"opencode",url:"https://github.com/sst/opencode",description:"OpenCode 官方仓库",branch:"dev"}]:"codex"===k.platform||"omp"===k.platform?[]:[{owner:"anthropics",name:"claude-plugins-official",url:"https://github.com/anthropics/claude-plugins-official",description:"官方插件库",branch:"main"}]),K=d(()=>A.value?Boolean(H.value.input.trim()):!!ie(H.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 W(e){return"github"===e?.provider||"gitlab"===e?.provider}function Z(e){return W(e)?e.hasToken?`仓库 Token: ${e.tokenPreview||"已配置"}`:"gitlab"===e.provider?"未配置仓库 Token,将回退到全局 Token、glab 或 git credential":"未配置仓库 Token,可选配置后优先用于 GitHub API 访问":""}function ee(){z.value=!1,x.value=null,B.value.token="",S.value=!1,O.value=!1}async function ae(){$.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&&(C.value=e.repos||[])}catch(e){X.error("加载仓库失败: "+e.message)}finally{$.value=!1}}async function le(){L.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?X.error(e.error||"刷新失败,已保留旧缓存"):(await ae(),X.success("仓库缓存刷新成功"),j("updated"))}catch(e){X.error("刷新失败: "+e.message)}finally{L.value=!1}}async function se(){if(!K.value)return;const e=A.value?{source:H.value.input.trim()}:ie(H.value.input.trim());I.value=!0;try{const a=await he({...e,branch:H.value.branch||"main",enabled:!0},k.platform,R.value);a.success&&(C.value=a.repos,H.value.input="",H.value.branch="main",X.success("仓库添加成功"),j("updated"))}catch(a){X.error("添加失败: "+a.message)}finally{I.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&&(C.value=a.repos,X.success("仓库已删除"),j("updated"))}catch(a){X.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&&(C.value=l.repos,j("updated"))}catch(l){X.error("操作失败: "+l.message)}}async function ue(){const e=x.value,a=B.value.token.trim();if(e&&a){S.value=!0;try{const l=await ke(e,{token:a},k.platform);l.success&&(C.value=l.repos||[],X.success("仓库 Token 已保存"),j("updated"),ee())}catch(l){X.error("保存 Token 失败: "+l.message)}finally{S.value=!1}}}async function ce(){const e=x.value;if(e){O.value=!0;try{const a=await ke(e,{clearToken:!0},k.platform);a.success&&(C.value=a.repos||[],X.success("仓库 Token 已清除"),j("updated"),ee())}catch(a){X.error("清除 Token 失败: "+a.message)}finally{O.value=!1}}}function de(e){const a=q(e);return C.value.some(e=>q(e)===a)}function ve(){ee(),j("update:visible",!1)}return c(()=>k.visible,e=>{e&&ae()}),c(()=>k.platform,()=>{k.visible&&ae()}),o(()=>{k.visible&&ae()}),(o,c)=>(u(),w(m,null,[i(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:L.value,focusable:!1,onClick:le},{icon:v(()=>[i(y(e),null,{default:v(()=>[i(y(G))]),_:1})]),default:v(()=>[c[5]||(c[5]=s(" 刷新 ",-1))]),_:1},8,["loading"])]),default:v(()=>[P("div",ze,[P("div",xe,[i(y(Q),{show:$.value},{default:v(()=>[(u(!0),w(m,null,n(C.value,e=>(u(),w("div",{key:e.id||`${e.owner}/${e.name}/${e.localPath||""}`,class:"repo-item"},[P("div",Se,[!1!==l.capabilities.repositoryToggle?(u(),r(y(F),{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&&W(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&&W(e)?(u(),w("div",Ae,p(Z(e)),1)):t("",!0)])]),P("div",Re,[!1!==l.capabilities.repositoryAuth&&W(e)?(u(),r(y(a),{key:0,text:"",type:"primary",size:"tiny",focusable:!1,onClick:a=>function(e){W(e)&&(x.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===C.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(J),{value:H.value.input,"onUpdate:value":c[0]||(c[0]=e=>H.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(J),{key:0,value:H.value.branch,"onUpdate:value":c[1]||(c[1]=e=>H.value.branch=e),placeholder:"分支",size:"small",class:"branch-input"},null,8,["value"])),i(y(a),{type:"primary",size:"small",disabled:!K.value,loading:I.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(Y),{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",We,[(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){I.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&&(C.value=a.repos,X.success("仓库添加成功"),j("updated"))}catch(a){X.error("添加失败: "+a.message)}finally{I.value=!1}}(a)},[P("div",Qe,[P("span",Xe,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(T))]),_:1}))],10,Fe))),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:ee},{default:v(()=>[x.value?(u(),w("div",Je,[i(y(Y),{type:"info",bordered:!1,size:"small"},{default:v(()=>{return[s(p((e=x.value,"gitlab"===e?.provider?"私有 GitLab 仓库建议配置仓库级 Private Token;保存后会优先使用当前仓库 Token,再回退到全局环境变量、glab 和 git credential。":"GitHub 仓库可选配置 Personal Access Token;保存后会优先使用当前仓库 Token,再回退到全局环境变量、gh 和 git credential。")),1)];var e}),_:1}),P("div",Ye,[P("div",ea,[c[11]||(c[11]=P("span",{class:"auth-label"},"仓库",-1)),P("span",aa,p(E(x.value)),1)]),P("div",la,[c[12]||(c[12]=P("span",{class:"auth-label"},"来源",-1)),P("span",ta,p("gitlab"===x.value.provider?"GitLab":"GitHub"),1)]),P("div",sa,[c[13]||(c[13]=P("span",{class:"auth-label"},"当前状态",-1)),P("span",na,p(x.value.hasToken?`已配置 ${x.value.tokenPreview||""}`:"未配置仓库 Token"),1)])]),i(y(J),{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:ee},{default:v(()=>[...c[14]||(c[14]=[s(" 取消 ",-1)])]),_:1}),x.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:S.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"},Ca={key:0,class:"asset-detail-loading"},$a=["innerHTML"],Ia={key:2,class:"asset-detail-empty"},Ta={__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),C=b("overview"),$=b(""),T=d(()=>/^(https?:)?\/\//.test(f.plugin?.repoUrl||f.plugin?.gitUrl||"")),L=d(()=>f.plugin?.installPath||f.plugin?.fullPath||f.plugin?.path||f.plugin?.directory||""),x=d(()=>Array.isArray(f.plugin?.skillPaths)?f.plugin.skillPaths:[]),S={height:"100%",minHeight:0,overflow:"hidden"};async function B(){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($.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=Z(`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),le(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||"",$.value=l}catch(s){if(t!==U.value)return;k.value="",$.value=l}finally{t===U.value&&(j.value=!1)}}c(()=>[f.visible,f.plugin,f.platform],([e])=>{U.value+=1,C.value="overview",$.value="",j.value=!1,k.value=""}),c(C,e=>{"readme"===e&&B()});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(W),{closable:"","native-scrollbar":!1,"body-content-style":S},{header:v(()=>[P("div",oa,[P("div",ua,[i(y(e),{size:20,class:"asset-detail-icon"},{default:v(()=>[i(y(z))]),_: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(H))]),_:1}),s(" "+p(a.plugin.author),1)])):t("",!0)])])])])]),default:v(()=>[P("div",ma,[i(y(K),{value:C.value,"onUpdate:value":c[0]||(c[0]=e=>C.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}),T.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:L.value},null,8,["path"])])]),_:1}),i(y(D),{name:"readme",tab:"README"},{default:v(()=>[P("div",Ua,[j.value?(u(),w("div",Ca,[i(y(Q),{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,$a)):(u(),w("div",Ia,[i(y(e),{size:44,class:"asset-detail-empty-icon"},{default:v(()=>[i(y(O))]),_: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"},xa={class:"asset-heading"},Sa={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"},Wa={key:0,class:"asset-empty"},Fa={key:1,class:"asset-list"},Qa={key:2,class:"asset-footer"},Xa=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(),I=C(),T=R(),O=b(!1),H=b([]),G=b(""),M=b("all"),D=b(!1),K=b(!1),q=b(null),E=b({}),V=b({}),W=b(!1),F=b(!1),X=b(0),Y=b({supportsPlugins:!0,repositories:!0,market:!0,install:!0,uninstall:!0,import:!0,syncRepos:!0}),{byCapability:te}=ae(),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=I.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(()=>H.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=H.value;if("installed"===M.value?e=e.filter(e=>e.installed):"uninstalled"===M.value&&(e=e.filter(e=>!e.installed)),G.value.trim()){const a=G.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(()=>G.value?"没有匹配的插件":"installed"===M.value?"暂无已安装的插件":"uninstalled"===M.value?"所有插件都已安装":!1===Y.value.supportsPlugins?Y.value.disabledReason||`${oe.value} 暂未提供插件管理能力`:Y.value.repositories||Y.value.market||Y.value.install||Y.value.uninstall?"暂无可用插件,请配置仓库源":Y.value.disabledReason||`${oe.value} 当前没有可展示的插件`);async function we(e,a){try{const l=await async function(e="claude",a={}){const l=Z("plugin-capabilities",e,a.scope||"",a.cwd||"");return le(l,a=>_.get("/plugins/capabilities",{params:{platform:e},signal:a}).then(e=>e.data),"plugin-capabilities",`plugin-capabilities:${e}`)}(e);if(a!==X.value||e!==re.value)return!1;if(l.success&&l.capabilities)return Y.value={supportsPlugins:!0,repositories:!1,market:!1,install:!1,uninstall:!1,import:!1,syncRepos:!1,...l.capabilities},!0}catch{if(a!==X.value||e!==re.value)return!1}return a===X.value&&e===re.value&&(Y.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=++X.value,a=re.value;if(!ie.value)return H.value=[],Y.value={supportsPlugins:!1,repositories:!1,market:!1,install:!1,uninstall:!1,import:!1,syncRepos:!1,disabledReason:`${oe.value} 暂未提供插件管理能力`},void(O.value=!1);O.value=!0;try{if(!(await we(a,e)))return;if(e!==X.value||a!==re.value)return;if(!1===Y.value.supportsPlugins)return void(H.value=[]);const l=he(),[t,s]=await Promise.all([de(a,l),Y.value.market?ve(a,!1,l):Promise.resolve({success:!0,plugins:[]})]);if(e!==X.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}`}))]};H.value=r(n,i)}catch(l){e===X.value&&a===re.value&&T.error("加载插件失败: "+l.message)}finally{e===X.value&&(O.value=!1)}}async function _e(){if(F.value||!ie.value)return;const e=re.value;F.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?T.error(a.error||"插件缓存刷新失败,已保留旧缓存"):"partial"===a?.status&&T.warning("插件缓存已部分更新,未成功的内容保留旧缓存"),await Pe()}catch(a){T.error("插件缓存刷新失败: "+a.message)}finally{F.value=!1}}async function je(){if(ie.value&&"claude"===re.value){W.value=!0;try{const e=await N("plugins");e.success?(T.success(`成功导入 ${e.imported} 个插件`),ge(re.value),await Pe()):T.error(e.message||"导入失败")}catch(e){T.error("导入失败: "+e.message)}finally{W.value=!1}}}function Ue(){ge(re.value),Pe()}async function Ce(e){if(ie.value&&Y.value.install&&!e.readonly){if(!(e.installSource||e.repoOwner||e.repoProjectPath||e.repoLocalPath))return T.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){T.success(`插件 "${e.name}" 安装成功`),ge(re.value);const a=H.value.findIndex(a=>a.key===e.key);-1!==a&&(H.value[a]={...H.value[a],installed:!0,key:`installed-${e.pluginId||e.id||e.name}-${e.scope||he(e).scope}`})}else T.error(a.message||"安装失败")}catch(a){T.error("安装失败: "+a.message)}finally{delete E.value[e.key]}}}async function $e(e){if(ie.value&&Y.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){T.success(`插件 "${e.name}" 已卸载`),ge(re.value);const a=H.value.findIndex(a=>a.key===e.key);-1!==a&&(H.value[a]={...H.value[a],installed:!1,key:`market-${e.pluginId||e.id||e.name}`})}else T.error(a.message||a.error||"卸载失败")}catch(a){T.error("卸载失败: "+a.message)}finally{delete V.value[e.key]}}}function Ie(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(B))]),_:1})]),_:1})),P("div",xa,[P("div",Sa,[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,[Y.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(L))]),_:1})]),default:v(()=>[c[10]||(c[10]=s(" 仓库 ",-1))]),_:1})):t("",!0),Y.value.import?(u(),r(y(a),{key:1,text:"",focusable:!1,onClick:je,loading:W.value,class:"action-btn"},{icon:v(()=>[i(y(e),null,{default:v(()=>[i(y(S))]),_:1})]),default:v(()=>[c[11]||(c[11]=s(" 导入 ",-1))]),_:1},8,["loading"])):t("",!0),i(y(a),{text:"",focusable:!1,onClick:_e,loading:F.value,class:"action-btn"},{icon:v(()=>[i(y(e),null,{default:v(()=>[i(y($))]),_: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,[Y.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(L))]),_:1})]),default:v(()=>[c[13]||(c[13]=s(" 仓库 ",-1))]),_:1})):t("",!0),Y.value.import?(u(),r(y(a),{key:1,text:"",focusable:!1,onClick:je,loading:W.value,class:"action-btn"},{icon:v(()=>[i(y(e),null,{default:v(()=>[i(y(S))]),_:1})]),default:v(()=>[c[14]||(c[14]=s(" 导入 ",-1))]),_:1},8,["loading"])):t("",!0),i(y(a),{text:"",focusable:!1,onClick:_e,loading:F.value,class:"action-btn"},{icon:v(()=>[i(y(e),null,{default:v(()=>[i(y($))]),_: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(H.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(H.value.length-ce.value),1)])]),P("div",Ea,[i(y(J),{value:G.value,"onUpdate:value":c[3]||(c[3]=e=>G.value=e),placeholder:"搜索插件名称或描述",clearable:"",size:"small",class:"asset-search"},{prefix:v(()=>[i(y(e),null,{default:v(()=>[i(y(x))]),_:1})]),_:1},8,["value"]),i(y(se),{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(Q),{show:O.value},{default:v(()=>[0!==ke.value.length||O.value?(u(),w("div",Fa,[(u(!0),w(m,null,n(ke.value,e=>(u(),r(Le,{key:e.key,plugin:e,readonly:e.readonly||!Y.value.install&&!Y.value.uninstall,"can-install":Y.value.install,"can-uninstall":Y.value.uninstall,installing:!!E.value[e.key],uninstalling:!!V.value[e.key],onInstall:Ce,onUninstall:$e,onClick:Ie},null,8,["plugin","readonly","can-install","can-uninstall","installing","uninstalling"]))),128))])):(u(),w("div",Wa,[i(y(ee),{description:be.value},{icon:v(()=>[i(y(e),{size:"48",color:"var(--text-quaternary)"},{default:v(()=>[i(y(z))]),_:1})]),extra:v(()=>[ne.value.includes(re.value)&&0===H.value.length&&Y.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)&&(Y.value.install||Y.value.uninstall)?(u(),w("div",Qa,[i(y(e),{size:"14",class:"asset-info-icon"},{default:v(()=>[i(y(A))]),_:1}),P("span",null,"安装/卸载后需重启 "+p(oe.value)+" 生效",1)])):t("",!0),Y.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:Y.value,onUpdated:Ue},null,8,["visible","platform","project-path","capabilities"])):t("",!0),i(Ta,{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{Xa as t};
@@ -1 +0,0 @@
1
- import{i as e,s as a,t}from"./_plugin-vue_export-helper-BeLZJZij.js";import{C as l,D as s,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 P,w as C,x as z}from"./vue-vendor-BqZbbXHA.js";import{r as $,t as N}from"./platforms-DWXgmy2w.js";import{Pt as M,_ as I,a as A,q as T,r as D}from"./icons-DmFe4b5j.js";import{l as U}from"./light-0eavxNvt.js";import{n as q,t as K}from"./headers-BqDmkMjy.js";import{I as L,K as S,M as E,N as R,P as H,dt as O,ft as F,gt as V,mt as W,rt as Z}from"./index-Cmmwj3Fx.js";import{t as B}from"./clipboard-B46yyoz_.js";import{p as G,t as J}from"./sessions-D4yQtfKb.js";import{n as Q,t as X}from"./sessions-DqlbocLJ.js";import{n as Y,t as ee}from"./session-visibility-BAmxh3cK.js";var ae={class:"card-content"},te={class:"header-row"},le={class:"project-name"},se={class:"stats-row"},re=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),$=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 N(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(),C("div",{class:"project-card",onClick:p,onMouseenter:r[0]||(r[0]=e=>c.value=!0),onMouseleave:r[1]||(r[1]=e=>c.value=!1)},[z("div",ae,[z("div",te,[i(k(e),{size:"18",color:$.value},{default:f(()=>[i(k(T))]),_:1},8,["color"]),z("span",le,v(g.value),1),P(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(H),{depth:"3",class:"project-path"},{default:f(()=>[s(v(j.value),1)]),_:1}),z("div",se,[i(k(W),{size:"tiny",bordered:!1,type:"success"},{default:f(()=>[s(v(b.value)+" 会话 ",1)]),_:1}),w.value?(d(),u(k(H),{key:0,depth:"3",class:"last-used"},{default:f(()=>[s(v(N(w.value)),1)]),_:1})):l("",!0)])])],32))}},[["__scopeId","data-v-3a18e66d"]]),ne={class:"project-list-container"},oe={class:"header"},ie={class:"header-text"},ue={key:0,class:"loading-container"},ce={key:1,class:"loading-container compact"},de={key:3,class:"projects-grid"},pe={class:"search-hint"},ve={style:{"margin-bottom":"16px"}},me={key:0,style:{"max-height":"60vh","overflow-y":"auto"}},fe={class:"search-result-header"},ye={class:"search-result-title"},he=t({__name:"ProjectList",setup(t){const y=j(),_=w(),P=X(),D=N(),ae=m(()=>$(_)),te=ae.value,le=x(""),se=x(1);let he=null;const ge=x([]),je=x(null),_e=x(!1),ke=x(""),be=x(null),we=x(!1),xe=x(null),Pe=x("workspace"),Ce=x(null),ze=[{label:"全工作区",value:"workspace"},{label:"当前项目",value:"current"},{label:"指定项目",value:"project"}],$e=m(()=>P.currentProject||ge.value[0]?.name||null),Ne=m(()=>{const e=ge.value.find(e=>e.name===$e.value);return e?.displayName||e?.name||$e.value||"未选择项目"}),Me=e=>e.map(e=>({label:e.displayName&&e.displayName!==e.name?`${e.displayName} (${e.name})`:e.name,value:e.name})),Ie=x([]);function Ae(e){return se.value=e,P.fetchProjects({page:e,limit:P.projectsPagination.limit,query:le.value})}function Te(e){const a=e.fullPath||e.name,t=e.sessionCount||0;E.warning({title:"删除项目",content:`确定要删除项目 "${a}" 吗?\n\n当前项目包含 ${t} 个会话,删除后所有会话数据将无法恢复!`,positiveText:"确定删除",negativeText:"取消",onPositiveClick:async()=>{try{await P.deleteProject(e.name),R.success("项目已删除")}catch(a){R.error("删除失败: "+a.message)}}})}async function De(){try{const a=(e=ae.value,D.get(e)?.command||e);if("manual"===(await B(a))?.method)return void R.warning("自动复制失败,已弹出手动复制框");R.success("基础启动命令已复制到剪贴板")}catch(a){R.error("复制失败: "+a.message)}var e}async function Ue(){if(!ke.value)return;let e=null;if("current"===Pe.value){if(e=$e.value,!e)return void R.warning("当前没有可搜索的项目")}else if("project"===Pe.value&&(e=Ce.value,!e))return void R.warning("请选择要搜索的项目");we.value=!0;try{const a=await G(ke.value,35,ae.value,{projectName:e,limit:35}),t=Y(Array.isArray(a?.sessions)?a.sessions:Array.isArray(a)?a:[]);be.value={...a&&"object"==typeof a&&!Array.isArray(a)?a:{},keyword:ke.value,sessions:t,totalMatches:t.reduce((e,a)=>e+(Number(a.matchCount)||0),0),scope:Pe.value,projectName:e}}catch(a){R.error("搜索失败: "+a.message)}finally{we.value=!1}}async function qe(e){const a=String(e||"").trim();if(a)try{const e=await Q(ae.value,{page:1,limit:50,query:a}),t=ee(e?.projects);Ie.value=Me(t)}catch(t){}else Ie.value=Me(ge.value)}function Ke(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 Le(e){(e.metaKey||e.ctrlKey)&&"k"===e.key&&(e.preventDefault(),_e.value=!0,n(()=>{xe.value?.focus()}))}return p(ge,e=>{Ie.value=Me(e)},{immediate:!0}),p(()=>P.projects,e=>{ge.value=[...e]}),p(le,e=>{he&&clearTimeout(he),he=setTimeout(()=>{se.value=1,P.fetchProjects({page:1,limit:P.projectsPagination.limit,query:e}).catch(()=>{})},180)}),p(_e,e=>{e||(ke.value="",be.value=null,Pe.value="workspace",Ce.value=null)}),p(ae,e=>{se.value=1,P.setChannel(e),P.fetchProjects()},{immediate:!0}),c(()=>{document.addEventListener("keydown",Le)}),r(()=>{he&&clearTimeout(he),P.pauseProjectRefresh(te),document.removeEventListener("keydown",Le)}),(t,r)=>(d(),C("div",ne,[z("div",oe,[z("div",ie,[i(k(K),{style:{margin:"0"}},{default:f(()=>[...r[6]||(r[6]=[s("我的项目",-1)])]),_:1}),i(k(H),{depth:"3"},{default:f(()=>[s("选择一个项目查看会话(共 "+v(k(P).projectsPagination.total)+" 个)",1)]),_:1})]),i(k(S),null,{default:f(()=>[i(k(a),{type:"primary",size:"medium",onClick:De},{icon:f(()=>[i(k(e),null,{default:f(()=>[i(k(M))]),_:1})]),default:f(()=>[r[7]||(r[7]=s(" 新建项目 ",-1))]),_:1}),i(k(O),{value:le.value,"onUpdate:value":r[0]||(r[0]=e=>le.value=e),placeholder:"搜索项目...",clearable:"",class:"search-input"},{prefix:f(()=>[i(k(e),null,{default:f(()=>[i(k(I))]),_:1})]),_:1},8,["value"])]),_:1})]),z("div",{class:"content",ref_key:"contentEl",ref:je},[k(P).loading&&0===k(P).projects.length&&!k(P).projectsPending?(d(),C("div",ue,[i(k(L),{size:"large"},{description:f(()=>[...r[8]||(r[8]=[s(" 加载项目列表... ",-1)])]),_:1})])):k(P).projectsPending?(d(),C("div",ce,[i(k(L),{size:"small"},{description:f(()=>[...r[9]||(r[9]=[s(" 正在生成项目列表... ",-1)])]),_:1})])):k(P).error&&0===k(P).projects.length?(d(),u(k(F),{key:2,type:"error",title:"加载失败",style:{"margin-top":"20px"}},{default:f(()=>[s(v(k(P).error),1)]),_:1})):ge.value.length>0?(d(),C("div",de,[(d(!0),C(h,null,o(ge.value,e=>(d(),u(re,{key:e.name,project:e,onClick:a=>{return t=e.name,void y.push({name:"cli-sessions",params:{platform:ae.value,projectName:t}});var t},onDelete:Te},null,8,["project","onClick"]))),128))])):l("",!0),k(P).projectsPagination.total>k(P).projectsPagination.limit?(d(),u(k(q),{key:4,page:se.value,"onUpdate:page":[r[1]||(r[1]=e=>se.value=e),Ae],"page-count":Math.ceil(k(P).projectsPagination.total/k(P).projectsPagination.limit),"page-size":k(P).projectsPagination.limit,"show-quick-jumper":"",class:"list-pagination"},null,8,["page","page-count","page-size"])):l("",!0),k(P).loading||k(P).error||k(P).projectsPending||0!==k(P).projects.length?l("",!0):(d(),u(k(V),{key:5,description:le.value?"没有匹配的项目":"没有找到项目",style:{"margin-top":"60px"}},{icon:f(()=>[i(k(e),null,{default:f(()=>[i(k(T))]),_:1})]),_:1},8,["description"]))],512),z("div",pe,[i(k(H),{depth:"3",style:{"font-size":"12px"}},{default:f(()=>[...r[10]||(r[10]=[z("kbd",null,"Cmd",-1),s(" / ",-1),z("kbd",null,"Ctrl",-1),s(" + ",-1),z("kbd",null,"K",-1),s(" 全局搜索 ",-1)])]),_:1})]),i(k(U),{show:_e.value,"onUpdate:show":r[5]||(r[5]=e=>_e.value=e),preset:"card",title:"全局搜索",style:g([{width:"800px","max-width":"90vw"},{marginTop:"80px"}])},{default:f(()=>[z("div",ve,[i(k(O),{ref_key:"globalSearchInputRef",ref:xe,value:ke.value,"onUpdate:value":r[2]||(r[2]=e=>ke.value=e),placeholder:"搜索对话内容...",clearable:"",onKeyup:b(Ue,["enter"]),disabled:we.value},{prefix:f(()=>[i(k(e),null,{default:f(()=>[i(k(I))]),_:1})]),suffix:f(()=>[i(k(a),{text:"",onClick:Ue,disabled:!ke.value||we.value,loading:we.value},{default:f(()=>[...r[11]||(r[11]=[s(" 搜索 ",-1)])]),_:1},8,["disabled","loading"])]),_:1},8,["value","disabled"])]),i(k(S),{align:"center",style:{"margin-bottom":"16px"}},{default:f(()=>[i(k(H),{depth:"3"},{default:f(()=>[...r[12]||(r[12]=[s("搜索范围",-1)])]),_:1}),i(k(Z),{value:Pe.value,"onUpdate:value":r[3]||(r[3]=e=>Pe.value=e),size:"small",options:ze,style:{width:"130px"},disabled:we.value},null,8,["value","disabled"]),"project"===Pe.value?(d(),u(k(Z),{key:0,value:Ce.value,"onUpdate:value":r[4]||(r[4]=e=>Ce.value=e),size:"small",filterable:"",remote:"",clearable:"",placeholder:"选择项目",options:Ie.value,onSearch:qe,style:{"min-width":"240px"},disabled:we.value},null,8,["value","options","disabled"])):"current"===Pe.value&&$e.value?(d(),u(k(W),{key:1,size:"small",bordered:!1},{default:f(()=>[s(v(Ne.value),1)]),_:1})):l("",!0)]),_:1}),be.value?(d(),C("div",me,[i(k(F),{type:"info",style:{"margin-bottom":"16px"}},{default:f(()=>[s(' 关键词 "'+v(be.value.keyword)+'" 共找到 '+v(be.value.totalMatches)+" 处匹配 ",1)]),_:1}),(d(!0),C(h,null,o(be.value.sessions,t=>(d(),C("div",{key:`${t.channel||ae.value}-${t.projectName}-${t.projectFullPath||""}-${t.sessionId}`,class:"search-result-item"},[z("div",fe,[z("div",ye,[i(k(H),{strong:"",style:{"font-size":"15px","font-weight":"700"}},{default:f(()=>[s(v(t.projectDisplayName),1)]),_:2},1024),i(k(H),{depth:"2",style:{margin:"0 8px"}},{default:f(()=>[...r[13]||(r[13]=[s("·",-1)])]),_:1}),i(k(H),{strong:""},{default:f(()=>[s(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(()=>[s(v(t.matchCount)+" 个匹配",1)]),_:2},1024)]),i(k(a),{size:"small",type:"primary",onClick:e=>async function(e,a,t=ae.value){try{const{copyResult:l}=await J(e,a,t||ae.value);"manual"===l?.method?R.warning("自动复制失败,已弹出手动复制框"):R.success("启动命令已复制到剪贴板"),_e.value=!1}catch(l){R.error("复制失败: "+l.message)}}(t.projectName,t.sessionId,t.channel)},{icon:f(()=>[i(k(e),null,{default:f(()=>[i(k(A))]),_:1})]),default:f(()=>[r[14]||(r[14]=s(" 使用对话 ",-1))]),_:1},8,["onClick"])]),(d(!0),C(h,null,o(t.matches,(e,a)=>(d(),C("div",{key:a,class:"search-match"},[i(k(W),{size:"tiny",type:"user"===e.role?"info":"success",bordered:!1},{default:f(()=>[s(v("user"===e.role?"用户":"助手"),1)]),_:2},1032,["type"]),i(k(H),{depth:"3",class:"search-match-text",innerHTML:Ke(e.context,be.value.keyword)},null,8,["innerHTML"])]))),128))]))),128)),0===be.value.sessions.length?(d(),u(k(V),{key:0,description:"没有找到匹配的内容"})):l("",!0)])):l("",!0)]),_:1},8,["show"])]))}},[["__scopeId","data-v-ae6b8c27"]]);export{he as default};
@@ -1 +0,0 @@
1
- .project-card[data-v-3a18e66d]{cursor:pointer;border:1px solid var(--border-primary);background:var(--bg-primary);border-radius:8px;padding:12px 14px;transition:all .25s cubic-bezier(.4,0,.2,1);position:relative;overflow:hidden;box-shadow:0 1px 3px #0000000a}.project-card[data-v-3a18e66d]:before{content:"";opacity:0;background:linear-gradient(#18a058,#18a05866);width:3px;height:100%;transition:opacity .25s;position:absolute;top:0;left:0}.project-card[data-v-3a18e66d]:hover{border-color:#18a05866;transform:translateY(-3px);box-shadow:0 8px 20px #18a0581f,0 2px 6px #0000000f}.project-card[data-v-3a18e66d]:hover:before{opacity:1}.card-content[data-v-3a18e66d]{flex-direction:column;gap:6px;display:flex}.header-row[data-v-3a18e66d]{align-items:center;gap:8px;display:flex}.project-name[data-v-3a18e66d]{text-overflow:ellipsis;white-space:nowrap;color:var(--text-primary);letter-spacing:-.2px;flex:1;font-size:14px;font-weight:600;overflow:hidden}.delete-btn[data-v-3a18e66d]{opacity:.7;transition:opacity .2s;padding:2px!important}.delete-btn[data-v-3a18e66d]:hover{opacity:1}.project-path[data-v-3a18e66d]{text-overflow:ellipsis;white-space:nowrap;font-size:11px;line-height:1.3;display:block;overflow:hidden}.stats-row[data-v-3a18e66d]{border-top:1px dashed var(--border-primary);justify-content:space-between;align-items:center;margin-top:4px;padding-top:8px;display:flex}.stats-row[data-v-3a18e66d] .n-tag{border-radius:4px;height:18px;padding:0 6px;font-size:11px;font-weight:600}.last-used[data-v-3a18e66d]{font-size:11px;font-weight:500}.project-list-container[data-v-ae6b8c27]{box-sizing:border-box;flex-direction:column;width:100%;height:100%;display:flex}.header[data-v-ae6b8c27]{background:var(--gradient-bg);border-bottom:1px solid var(--border-primary);flex-shrink:0;justify-content:space-between;align-items:flex-start;gap:24px;padding:24px 24px 20px;display:flex;position:relative}.header[data-v-ae6b8c27]:after{content:"";background:linear-gradient(90deg,#0000,#18a0581a,#0000);height:1px;position:absolute;bottom:0;left:0;right:0}.header-text[data-v-ae6b8c27]{flex:1}.header-text[data-v-ae6b8c27] .n-h2{background:linear-gradient(135deg,#1f2937 0%,#374151 100%);-webkit-text-fill-color:transparent;letter-spacing:-.5px;-webkit-background-clip:text;background-clip:text;font-size:26px;font-weight:700}[data-theme=dark] .header-text[data-v-ae6b8c27] .n-h2{background:linear-gradient(135deg,#f9fafb 0%,#d1d5db 100%);-webkit-text-fill-color:transparent;-webkit-background-clip:text;background-clip:text}.search-input[data-v-ae6b8c27]{flex-shrink:0;width:320px}.search-input[data-v-ae6b8c27] .n-input{background:var(--bg-primary);border:1px solid var(--border-primary);border-radius:10px;transition:all .2s}.search-input[data-v-ae6b8c27] .n-input:hover{border-color:var(--border-secondary);box-shadow:var(--shadow-sm)}.search-input[data-v-ae6b8c27] .n-input:focus-within{border-color:#18a058;box-shadow:0 0 0 3px #18a0581a}.content[data-v-ae6b8c27]{background:var(--gradient-bg);flex:1;padding:20px 24px 24px;overflow-y:auto}.loading-container[data-v-ae6b8c27]{justify-content:center;align-items:center;min-height:400px;display:flex}.loading-container.compact[data-v-ae6b8c27]{min-height:180px}.projects-grid[data-v-ae6b8c27]{grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:12px;display:grid}.list-pagination[data-v-ae6b8c27]{justify-content:center;margin:24px 0 8px}.ghost[data-v-ae6b8c27]{opacity:.4}.chosen[data-v-ae6b8c27]{transform:scale(1.05);cursor:move!important;box-shadow:0 8px 24px #0003!important}.drag[data-v-ae6b8c27]{opacity:.8;transform:rotate(2deg);box-shadow:0 12px 32px #00000040!important}.search-hint[data-v-ae6b8c27]{border:1px solid var(--border-primary);z-index:10;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);opacity:.8;background:#ffffffe6;border-radius:8px;padding:10px 14px;transition:all .2s;position:fixed;bottom:24px;left:24px;box-shadow:0 4px 12px #00000014}[data-theme=dark] .search-hint[data-v-ae6b8c27]{background:#1e293bf2;border:1px solid #47556999;box-shadow:0 4px 16px #0006}.search-hint[data-v-ae6b8c27]:hover{opacity:1;transform:translateY(-2px);box-shadow:0 6px 16px #0000001f}[data-theme=dark] .search-hint[data-v-ae6b8c27]:hover{box-shadow:0 6px 20px #00000080}.search-hint kbd[data-v-ae6b8c27]{color:var(--text-secondary);background:var(--bg-primary);border:1px solid var(--border-secondary);box-shadow:0 2px 0 var(--border-primary), 0 1px 3px #0000001a;border-radius:4px;padding:4px 8px;font-family:SF Mono,Monaco,monospace;font-size:12px;font-weight:600;line-height:1.4;display:inline-block}[data-theme=dark] .search-hint kbd[data-v-ae6b8c27]{color:#e2e8f0;background:#33415599;border:1px solid #475569cc;box-shadow:0 2px #1e293bcc,0 1px 4px #0006}.search-result-item[data-v-ae6b8c27]{border:1px solid var(--border-primary);background:var(--bg-elevated);border-radius:6px;margin-bottom:16px;padding:12px}.search-result-header[data-v-ae6b8c27]{justify-content:space-between;align-items:center;margin-bottom:8px;display:flex}.search-result-title[data-v-ae6b8c27]{align-items:center;gap:8px;display:flex}.search-match[data-v-ae6b8c27]{background:var(--bg-secondary);border-radius:4px;align-items:flex-start;gap:8px;margin-top:6px;padding:6px;display:flex}.search-match-text[data-v-ae6b8c27]{flex:1;line-height:1.6}
@@ -1 +0,0 @@
1
- import{i as e,s as a,t as s}from"./_plugin-vue_export-helper-BeLZJZij.js";import{C as t,D as l,K as i,O as n,S as r,W as c,Z as u,_t as o,at as d,b as p,et as v,g as m,ht as f,mt as y,st as g,w as b,x as h}from"./vue-vendor-BqZbbXHA.js";import{n as k}from"./client-UDwXBP9i.js";import{$ as _,Mt as w,Pt as z,S as P,bt as C,ct as j,et as x,ft as B,r as I,rt as D,z as U}from"./icons-DmFe4b5j.js";import{n as $,t as q}from"./useResponsiveDrawer-DZd5rNk5.js";import{t as O}from"./DrawerContent-ChXgZ1Xm.js";import{$ as A,F as M,I as S,M as T,N as E,Q as L,dt as V,jt as W,mt as F}from"./index-Cmmwj3Fx.js";import{t as Z}from"./MarkdownEditor-BMMUufSc.js";var K={class:"form-header"},N={class:"form-container"},Q={class:"form-section"},R={class:"section-title"},G={class:"form-item"},H={key:0,class:"form-error"},J={class:"form-item"},X={class:"form-item"},Y={class:"form-section"},ee={class:"section-title"},ae={class:"apps-toggles"},se={class:"app-name"},te={key:0,class:"platform-empty"},le={class:"form-section content-section"},ie={class:"section-title"},ne={class:"form-footer"},re=s({__name:"PromptsFormDrawer",props:{visible:{type:Boolean,default:!1},editingPreset:{type:Object,default:null},existingIds:{type:Array,default:()=>[]},platforms:{type:Array,default:()=>[]}},emits:["update:visible","saved"],setup(s,{emit:f}){const{drawerWidth:_}=q(600),z=s,P=f,C=p({get:()=>z.visible,set:e=>P("update:visible",e)}),B=p(()=>!!z.editingPreset),{byCapability:I}=W(),D=p(()=>z.platforms.length>0?z.platforms:I("prompts"));function A(){return Object.fromEntries(D.value.map(e=>[e.key,!0]))}const S=g(!1),T=g(""),L=d({id:"",name:"",description:"",content:"",apps:{}});async function F(){if(L.id.trim()?/^[a-zA-Z0-9_-]+$/.test(L.id)?!B.value&&z.existingIds.includes(L.id)?(T.value="该 ID 已被使用",0):(T.value="",1):(T.value="ID 只能包含字母、数字、下划线和连字符",0):(T.value="预设 ID 不能为空",0))if(L.name.trim()){S.value=!0;try{const e={id:L.id.trim(),name:L.name.trim(),description:L.description.trim(),content:L.content,apps:B.value?{...L.apps}:Object.fromEntries(D.value.map(e=>[e.key,!0===L.apps[e.key]]))};z.editingPreset?.isBuiltin&&(e.isBuiltin=!0),(await async function(e){return(await k.post("/prompts/presets",e)).data}(e)).success&&(E.success(B.value?"保存成功":"创建成功"),P("saved"),C.value=!1)}catch(e){E.error("保存失败: "+e.message)}finally{S.value=!1}}else E.error("预设名称不能为空")}function re(){C.value=!1}return u(()=>z.visible,e=>{e&&(z.editingPreset?(L.id=z.editingPreset.id||"",L.name=z.editingPreset.name||"",L.description=z.editingPreset.description||"",L.content=z.editingPreset.content||"",L.apps=z.editingPreset.apps?{...z.editingPreset.apps}:A()):(L.id="",L.name="",L.description="",L.content="",L.apps=A()),T.value="")}),(u,d)=>(c(),r(y($),{show:C.value,"onUpdate:show":d[4]||(d[4]=e=>C.value=e),width:y(_),placement:"right","show-mask":!0},{default:v(()=>[n(y(O),{closable:"","native-scrollbar":!1},{header:v(()=>[h("div",K,[n(y(e),{size:18,class:"header-icon"},{default:v(()=>[n(y(x))]),_:1}),h("span",null,o(B.value?"编辑预设":"新建预设"),1)])]),footer:v(()=>[h("div",ne,[n(y(a),{onClick:re},{default:v(()=>[...d[12]||(d[12]=[l("取消",-1)])]),_:1}),n(y(a),{type:"primary",onClick:F,loading:S.value},{default:v(()=>[l(o(B.value?"保存":"创建"),1)]),_:1},8,["loading"])])]),default:v(()=>[h("div",N,[h("div",Q,[h("div",R,[n(y(e),{size:16},{default:v(()=>[n(y(U))]),_:1}),d[5]||(d[5]=h("span",null,"基本信息",-1))]),h("div",G,[d[6]||(d[6]=h("label",{class:"form-label"},[l("预设 ID "),h("span",{class:"required"},"*")],-1)),n(y(V),{value:L.id,"onUpdate:value":d[0]||(d[0]=e=>L.id=e),placeholder:"唯一标识符,如 my-preset",disabled:B.value&&s.editingPreset?.isBuiltin},null,8,["value","disabled"]),T.value?(c(),b("p",H,o(T.value),1)):t("",!0)]),h("div",J,[d[7]||(d[7]=h("label",{class:"form-label"},[l("名称 "),h("span",{class:"required"},"*")],-1)),n(y(V),{value:L.name,"onUpdate:value":d[1]||(d[1]=e=>L.name=e),placeholder:"预设名称"},null,8,["value"])]),h("div",X,[d[8]||(d[8]=h("label",{class:"form-label"},"描述",-1)),n(y(V),{value:L.description,"onUpdate:value":d[2]||(d[2]=e=>L.description=e),placeholder:"简短描述这个预设的用途"},null,8,["value"])])]),h("div",Y,[h("div",ee,[n(y(e),{size:16},{default:v(()=>[n(y(w))]),_:1}),d[9]||(d[9]=h("span",null,"生效范围",-1))]),h("div",ae,[(c(!0),b(m,null,i(D.value,e=>(c(),b("label",{key:e.key,class:"app-toggle"},[n(y(M),{value:L.apps[e.key],"onUpdate:value":a=>L.apps[e.key]=a},null,8,["value","onUpdate:value"]),h("span",se,o(e.promptLabel||e.label||e.title||e.key),1)]))),128)),0===D.value.length?(c(),b("span",te," 当前没有可用的 Prompt 平台 ")):t("",!0)])]),h("div",le,[h("div",ie,[n(y(e),{size:16},{default:v(()=>[n(y(j))]),_:1}),d[10]||(d[10]=h("span",null,"提示词内容",-1)),d[11]||(d[11]=h("span",{class:"content-hint"},"支持 Markdown 格式",-1))]),n(Z,{modelValue:L.content,"onUpdate:modelValue":d[3]||(d[3]=e=>L.content=e),rows:16,"min-height":300,placeholder:"# 系统提示词\n\n在这里编写你的系统提示词..."},null,8,["modelValue"])])])]),_:1})]),_:1},8,["show","width"]))}},[["__scopeId","data-v-1e68a77e"]]),ce={class:"drawer-header"},ue={class:"header-title"},oe={class:"prompts-container"},de={class:"status-card"},pe={class:"status-info"},ve={class:"status-text"},me={class:"status-value"},fe={class:"status-actions"},ye={class:"stats-bar"},ge={class:"stats-text"},be={class:"preset-list"},he={key:0,class:"empty-state"},ke={key:1,class:"preset-cards"},_e={class:"card-header"},we={class:"card-title"},ze={class:"preset-name"},Pe={class:"card-actions"},Ce={key:0,class:"card-desc"},je={class:"card-apps"},xe={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:w}=q(720),j=s,U=d,M=p({get:()=>j.visible,set:e=>U("update:visible",e)}),V=g(!1),Z=g({}),K=g(null),N=g(!1),Q=g(null),R=g(null),G=g(!1),{byCapability:H}=W(),J=p(()=>H("prompts")),X=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===K.value?-1:a.id===K.value?1:(a.updatedAt||0)-(e.updatedAt||0)),[...a,...s]}),Y=p(()=>X.value.length),ee=p(()=>Object.keys(Z.value)),ae=p(()=>K.value?Z.value[K.value]:null),se=p(()=>{const e=X.value;return{builtin:e.filter(e=>e.isBuiltin).length,custom:e.filter(e=>!e.isBuiltin).length}}),te=p(()=>J.value.map(e=>({label:`从 ${e.promptLabel||e.label||e.title||e.key} 导入`,key:e.key})));function le(e){if(!e)return"";let a=e.split("\n").slice(0,4).join("\n");return e.split("\n").length>4&&(a+="\n..."),a.substring(0,200)}async function ie(){V.value=!0;try{const e=await async function(){return(await k.get("/prompts/presets")).data}();e.success&&(Z.value=e.presets,K.value=e.activePresetId)}catch(e){E.error("加载预设失败")}finally{V.value=!1}}async function ne(e){R.value=e.id;try{(await async function(e){return(await k.post(`/prompts/presets/${e}/activate`)).data}(e.id)).success&&(K.value=e.id,E.success(`已激活预设 "${e.name}"`))}catch(a){E.error("激活失败: "+a.message)}finally{R.value=null}}async function Ie(){T.warning({title:"移除提示词",content:"确定要移除当前激活的提示词吗?这将删除各平台的提示词文件。",positiveText:"移除",negativeText:"取消",onPositiveClick:async()=>{G.value=!0;try{(await async function(){return(await k.post("/prompts/deactivate")).data}()).success&&(K.value=null,E.success("已移除提示词"))}catch(e){E.error("移除失败: "+e.message)}finally{G.value=!1}}})}function De(e){T.warning({title:"删除确认",content:`确定要删除预设 "${e.name}" 吗?此操作不可恢复。`,positiveText:"删除",negativeText:"取消",onPositiveClick:async()=>{try{(await async function(e){return(await k.delete(`/prompts/presets/${e}`)).data}(e.id)).success&&(delete Z.value[e.id],E.success("删除成功"))}catch(a){E.error("删除失败: "+a.message)}}})}async function Ue(e){try{const a=await async function(e,a){return(await k.post(`/prompts/import/${e}`,{name:a})).data}(e);a.success&&(Z.value[a.preset.id]=a.preset,E.success(a.message))}catch(a){E.error("导入失败: "+a.message)}}function $e(){Q.value=null,N.value=!0}function qe(){ie()}return u(()=>j.visible,e=>{e&&ie()},{immediate:!0}),(s,u)=>(c(),b(m,null,[n(y($),{show:M.value,"onUpdate:show":u[0]||(u[0]=e=>M.value=e),width:y(w),placement:"right","show-mask":!0},{default:v(()=>[n(y(O),{title:"Prompts 管理",closable:"","native-scrollbar":!1},{header:v(()=>[h("div",ce,[h("div",ue,[n(y(e),{size:20,class:"header-icon"},{default:v(()=>[n(y(x))]),_:1}),u[2]||(u[2]=h("span",null,"Prompts 管理",-1))])])]),default:v(()=>[h("div",oe,[h("div",de,[h("div",pe,[ae.value?(c(),b(m,{key:0},[n(y(e),{class:"status-icon active",size:18},{default:v(()=>[n(y(C))]),_:1}),h("div",ve,[u[3]||(u[3]=h("span",{class:"status-label"},"当前激活:",-1)),h("span",me,o(ae.value.name),1)])],64)):(c(),b(m,{key:1},[n(y(e),{class:"status-icon inactive",size:18},{default:v(()=>[n(y(P))]),_:1}),u[4]||(u[4]=h("div",{class:"status-text"},[h("span",{class:"status-label"},"未激活任何提示词")],-1))],64))]),h("div",fe,[n(y(L),{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(_))]),_:1})]),default:v(()=>[u[5]||(u[5]=l(" 导入 ",-1))]),_:1})]),_:1},8,["options"]),n(y(a),{size:"small",tertiary:"",type:"primary",class:"action-btn",onClick:$e},{icon:v(()=>[n(y(e),{size:14},{default:v(()=>[n(y(z))]),_:1})]),default:v(()=>[u[6]||(u[6]=l(" 新建 ",-1))]),_:1}),ae.value?(c(),r(y(A),{key:0,trigger:"hover"},{trigger:v(()=>[n(y(a),{size:"small",quaternary:"",class:"action-btn remove-btn",onClick:Ie,loading:G.value},{icon:v(()=>[n(y(e),{size:16},{default:v(()=>[n(y(B))]),_:1})]),default:v(()=>[u[7]||(u[7]=l(" 移除 ",-1))]),_:1},8,["loading"])]),default:v(()=>[u[8]||(u[8]=l(" 删除各平台的提示词文件 ",-1))]),_:1})):t("",!0)])]),h("div",ye,[h("span",ge,[l(" 共 "+o(Y.value)+" 个预设 ",1),Y.value>0?(c(),b(m,{key:0},[l(" · 自定义: "+o(se.value.custom)+" · 内置模板: "+o(se.value.builtin),1)],64)):t("",!0)])]),h("div",be,[n(y(S),{show:V.value},{default:v(()=>[0!==X.value.length||V.value?(c(),b("div",ke,[(c(!0),b(m,null,i(X.value,s=>(c(),b("div",{key:s.id,class:f(["preset-card",{active:s.id===K.value}])},[h("div",_e,[h("div",we,[s.id===K.value?(c(),r(y(e),{key:0,class:"active-icon",size:16},{default:v(()=>[n(y(C))]),_:1})):t("",!0),h("span",ze,o(s.name),1),s.isBuiltin?(c(),r(y(F),{key:1,size:"tiny",bordered:!1,type:"info"},{default:v(()=>[...u[11]||(u[11]=[l("模板",-1)])]),_:1})):t("",!0),s.isImported?(c(),r(y(F),{key:2,size:"tiny",bordered:!1,type:"warning"},{default:v(()=>[...u[12]||(u[12]=[l("已导入",-1)])]),_:1})):t("",!0)]),h("div",Pe,[s.id!==K.value?(c(),r(y(a),{key:0,size:"tiny",type:"primary",onClick:e=>ne(s),loading:R.value===s.id},{default:v(()=>[...u[13]||(u[13]=[l(" 激活 ",-1)])]),_:1},8,["onClick","loading"])):t("",!0),n(y(a),{quaternary:"",size:"tiny",onClick:e=>function(e){Q.value=e,N.value=!0}(s)},{icon:v(()=>[n(y(e),null,{default:v(()=>[n(y(D))]),_:1})]),_:1},8,["onClick"]),s.isBuiltin?t("",!0):(c(),r(y(a),{key:1,quaternary:"",size:"tiny",onClick:e=>De(s)},{icon:v(()=>[n(y(e),null,{default:v(()=>[n(y(I))]),_:1})]),_:1},8,["onClick"]))])]),s.description?(c(),b("p",Ce,o(s.description),1)):t("",!0),h("div",je,[u[14]||(u[14]=h("span",{class:"apps-label"},"生效范围:",-1)),(c(!0),b(m,null,i(J.value,e=>(c(),r(y(F),{key:e.key,type:s.apps?.[e.key]?"success":"default",size:"tiny",bordered:!1},{default:v(()=>[l(o(e.promptLabel||e.label||e.title||e.key),1)]),_:2},1032,["type"]))),128))]),h("div",xe,[h("pre",Be,o(le(s.content)),1)])],2))),128))])):(c(),b("div",he,[n(y(e),{size:48,class:"empty-icon"},{default:v(()=>[n(y(x))]),_:1}),u[9]||(u[9]=h("p",{class:"empty-title"},"暂无预设",-1)),u[10]||(u[10]=h("p",{class:"empty-desc"},'点击上方"新建"按钮创建系统提示词预设',-1))]))]),_:1},8,["show"])])])]),_:1})]),_:1},8,["show","width"]),n(re,{visible:N.value,"onUpdate:visible":u[1]||(u[1]=e=>N.value=e),"editing-preset":Q.value,"existing-ids":ee.value,platforms:J.value,onSaved:qe},null,8,["visible","editing-preset","existing-ids","platforms"])],64))}},[["__scopeId","data-v-61810a34"]]);export{Ie as default};
@@ -1 +0,0 @@
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{St as f}from"./icons-DmFe4b5j.js";import{n as w,t as y}from"./useResponsiveDrawer-DZd5rNk5.js";import{t as g}from"./DrawerContent-ChXgZ1Xm.js";import{I as j,M as _,N as k,dt as b,gt as x}from"./index-Cmmwj3Fx.js";import{m as C,n as I,o as S,t as D}from"./sessions-D4yQtfKb.js";import{t as M}from"./SessionCard-BUgjHQwX.js";import{n as N}from"./session-visibility-BAmxh3cK.js";var O=e({default:()=>z}),P={key:0,class:"loading-container"},R={key:1,class:"sessions-list"},z=a({__name:"RecentSessionsDrawer",props:{visible:{type:Boolean,default:!1},channel:{type:String,default:"claude"}},emits:["update:visible"],setup(e,{emit:a}){const{drawerWidth:O}=y(720),z=e,A=a,K=h(!1),T=h([]),U=h(!1),W=u(()=>z.channel);async function B(){U.value=!0;try{const e=await S(10,z.channel);T.value=N(e.sessions)}catch(e){k.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),k.success("别名设置成功")):(await I(e.sessionId),k.success("别名已删除")),await B()}catch(n){k.error("操作失败: "+n.message)}}async function G(e){try{const{copyResult:s}=await D(e.projectName,e.sessionId,z.channel);if("manual"===s?.method)return void k.warning("自动复制失败,已弹出手动复制框");k.success("启动命令已复制到剪贴板")}catch(s){k.error("复制失败: "+s.message)}}return c(()=>z.visible,e=>{K.value=e,e&&B()},{immediate:!0}),c(K,e=>{A("update:visible",e)}),c(()=>z.channel,()=>{K.value&&B()}),(e,a)=>(r(),l(p(w),{show:K.value,"onUpdate:show":a[0]||(a[0]=e=>K.value=e),width:p(O),placement:"right","show-close":!0},{default:d(()=>[o(p(g),{title:"claude"===z.channel?"Claude 最新对话":"codex"===z.channel?"Codex 最新对话":"gemini"===z.channel?"Gemini 最新对话":"opencode"===z.channel?"OpenCode 最新对话":"omp"===z.channel?"OMP 最新对话":"最新对话","native-scrollbar":!1,closable:""},{default:d(()=>[U.value?(r(),v("div",P,[o(p(j),{size:"medium"},{description:d(()=>[...a[1]||(a[1]=[t("加载中...",-1)])]),_:1})])):T.value.length>0?(r(),v("div",R,[(r(!0),v(m,null,n(T.value,e=>(r(),l(M,{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(x),{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{O as n,z as t};
@@ -1 +0,0 @@
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 m,w as p,x as h}from"./vue-vendor-BqZbbXHA.js";import{Dt as _,T as y,W as k,a as v,r as g,tt as M,wt as j}from"./icons-DmFe4b5j.js";import{$ as z,mt as $}from"./index-Cmmwj3Fx.js";var w={class:"session-left"},B={class:"session-icon"},D={class:"session-info"},F={class:"session-header"},b={class:"session-title-row"},x={class:"session-title"},C={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,W=m(!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,m)=>(n(),p("div",{class:"session-item",onMouseenter:m[4]||(m[4]=s=>W.value=!0),onMouseleave:m[5]||(m[5]=s=>W.value=!1)},[h("div",w,[h("div",B,[i(c(s),{size:"24",color:"#18a058"},{default:u(()=>[i(c(j))]),_:1})]),h("div",D,[h("div",F,[h("div",b,[a.showProject&&a.session.projectDisplayName?(n(),l(c($),{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",x,r(G.value),1),a.session.forkedFrom?(n(),l(c(z),{key:1,placement:"top"},{trigger:u(()=>[i(c($),{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(()=>[m[6]||(m[6]=t(" Fork ",-1))]),_:1})]),default:u(()=>[h("span",null,"Fork 自 "+r(a.session.forkedFrom),1)]),_:1})):o("",!0)]),h("div",C,[h("span",P,[i(c(s),{size:"14"},{default:u(()=>[i(c(_))]),_:1}),t(" "+r(K(a.session.mtime)),1)]),i(c($),{size:"small",bordered:!1,type:"info"},{icon:u(()=>[i(c(s),null,{default:u(()=>[i(c(M))]),_:1})]),default:u(()=>[t(" "+r(L(a.session.size)),1)]),_:1}),a.session.gitBranch?(n(),l(c($),{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(),p("div",S,r(a.session.firstMessage),1)):o("",!0),a.showProject&&a.session.projectFullPath?(n(),p("div",I," 路径: "+r(a.session.projectFullPath),1)):o("",!0)])]),h("div",N,[i(c(e),{size:"small",onClick:m[0]||(m[0]=s=>d.$emit("set-alias",a.session))},{icon:u(()=>[i(c(s),null,{default:u(()=>[i(c(y))]),_:1})]),default:u(()=>[m[7]||(m[7]=t(" 别名 ",-1))]),_:1}),i(c(e),{type:"primary",size:"small",onClick:m[1]||(m[1]=s=>d.$emit("launch",a.session))},{icon:u(()=>[i(c(s),null,{default:u(()=>[i(c(v))]),_:1})]),default:u(()=>[m[8]||(m[8]=t(" 使用对话 ",-1))]),_:1}),a.hideFork?o("",!0):(n(),l(c(e),{key:0,size:"small",onClick:m[2]||(m[2]=s=>d.$emit("fork",a.session))},{icon:u(()=>[i(c(s),null,{default:u(()=>[i(c(k))]),_:1})]),default:u(()=>[m[9]||(m[9]=t(" Fork ",-1))]),_:1})),a.hideDelete?o("",!0):(n(),l(c(e),{key:1,size:"small",type:"error",onClick:m[3]||(m[3]=s=>d.$emit("delete",a.session))},{icon:u(()=>[i(c(s),null,{default:u(()=>[i(c(g))]),_:1})]),_:1})),f(d.$slots,"actions-extra",{},void 0,!0)])],32))}},[["__scopeId","data-v-32d1b310"]]);export{q as t};
@@ -1 +0,0 @@
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,H as i,I as n,K as o,O as r,S as u,V as c,W as d,Z as v,_t as p,b as f,et as m,f as h,g as y,ht as g,i as k,m as _,mt as w,p as j,r as b,st as C,tt as P,w as I,x}from"./vue-vendor-BqZbbXHA.js";import{r as z}from"./platforms-DWXgmy2w.js";import{W as S,_ as M,a as N,et as $,jt as F,l as U,r as L,rt as T,u as A,wt as B}from"./icons-DmFe4b5j.js";import{t as D}from"./use-message-DqCwefG6.js";import{S as E,l as K}from"./light-0eavxNvt.js";import{c as O,s as q}from"./AssetPathField-DyniM0pF.js";import{n as W,t as H}from"./headers-BqDmkMjy.js";import{t as R}from"./McpFormDrawer-ByvS18od.js";import{n as G,t as Z}from"./useResponsiveDrawer-DZd5rNk5.js";import{t as V}from"./DrawerContent-ChXgZ1Xm.js";import{t as J}from"./SkillsPanel-BKIVOj7n.js";import{$ as Q,I as X,K as Y,M as ee,N as ae,P as se,_ as te,dt as le,ft as ie,gt as ne,mt as oe,rt as re,st as ue}from"./index-Cmmwj3Fx.js";import{c as ce,f as de,t as ve}from"./sessions-D4yQtfKb.js";import pe from"./ChatHistoryDrawer-CrfS0KYV.js";import{t as fe}from"./sessions-DqlbocLJ.js";import{i as me,l as he,n as ye,o as ge,r as ke,t as _e}from"./project-config-B2baPzYL.js";var we={class:"project-instruction-panel"},je={key:0,class:"unsupported-state"},be={class:"resource-path"},Ce={__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:s}){const i=e,n=s,o=D(),c=E(),f=C(i.instruction.content||""),h=C(!1),g=C(!1);async function k(){h.value=!0;try{const e=await ge(i.projectPath,i.platform,f.value);f.value=e.content??f.value,n("updated",e),o.success("项目指令已保存")}catch(e){o.error(`保存项目指令失败:${e.message}`)}finally{h.value=!1}}function _(){c.warning({title:"删除项目指令",content:`确定删除 ${i.instruction.path} 吗?`,positiveText:"删除",negativeText:"取消",onPositiveClick:async()=>{g.value=!0;try{const e=await _e(i.projectPath,i.platform);f.value="",n("updated",e),o.success("项目指令已删除")}catch(e){o.error(`删除项目指令失败:${e.message}`)}finally{g.value=!1}}})}return v(()=>i.instruction,e=>{f.value=e?.content||""},{deep:!0}),(s,i)=>(d(),I("div",we,[e.instruction?.supported?(d(),I(y,{key:1},[x("div",be,"目标文件:"+p(e.instruction.path),1),r(w(le),{value:f.value,"onUpdate:value":i[0]||(i[0]=e=>f.value=e),type:"textarea",rows:16,placeholder:"输入项目指令",disabled:h.value},null,8,["value","disabled"]),r(w(Y),{justify:"end",class:"actions"},{default:m(()=>[e.instruction.exists?(d(),u(w(a),{key:0,"data-action":"delete-instruction",type:"error",secondary:"",loading:g.value,onClick:_},{default:m(()=>[...i[1]||(i[1]=[l(" 删除文件 ",-1)])]),_:1},8,["loading"])):t("",!0),r(w(a),{"data-action":"save-instruction",type:"primary",loading:h.value,onClick:k},{default:m(()=>[...i[2]||(i[2]=[l(" 保存 ",-1)])]),_:1},8,["loading"])]),_:1}),r(w(se),{depth:"3",class:"hint"},{default:m(()=>[...i[3]||(i[3]=[l(" 写入项目原生文件;修改后通常需要重新启动对应 CLI。 ",-1)])]),_:1})],64)):(d(),I("div",je," 当前平台不提供项目指令文件 "))]))}},Pe=s(Ce,[["__scopeId","data-v-f2f46409"]]),Ie={class:"project-mcp-panel"},xe={class:"panel-toolbar"},ze={class:"resource-path"},Se={key:2,class:"server-list"},Me={class:"server-info"},Ne={class:"server-title"},$e={class:"server-spec"},Fe={__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:s}){const i=e,n=s,c=D(),h=E(),g=C(!1),k=C(null),_=C(""),j=C(i.mcp),b=f(()=>j.value||i.mcp||{servers:[]}),P=f(()=>Array.isArray(b.value?.servers)?b.value.servers:[]),z=f(()=>P.value.some(e=>{const a=e.server||{};return Object.keys(a.env||{}).length>0||Object.keys(a.headers||{}).length>0}));function S(e){const a=e.server||{};return"stdio"===a.type?`${a.command||""} ${(a.args||[]).join(" ")}`.trim():a.url||a.type||"MCP"}function M(){k.value=null,g.value=!0}async function N(){g.value=!1,k.value=null,await $(),n("updated")}async function $(){const e=await me(i.projectPath,i.platform);j.value=e}return v(()=>i.mcp,e=>{j.value=e},{deep:!0}),v([()=>i.projectPath,()=>i.platform],()=>{i.projectPath&&i.platform&&$().catch(e=>c.error(`加载项目 MCP 失败:${e.message}`))}),(s,v)=>(d(),I("div",Ie,[x("div",xe,[x("span",ze,"目标文件:"+p(b.value?.path||"当前平台未声明"),1),r(w(a),{size:"small",type:"primary",onClick:M},{default:m(()=>[...v[1]||(v[1]=[l(" 添加 MCP ",-1)])]),_:1})]),z.value?(d(),u(w(ie),{key:0,type:"warning",bordered:!1,style:{"margin-bottom":"12px"}},{default:m(()=>[...v[2]||(v[2]=[l(" 项目 MCP 配置中的静态密钥可能随项目进入 Git,请优先使用环境变量引用。 ",-1)])]),_:1})):t("",!0),0===P.value.length?(d(),u(w(ne),{key:1,description:"暂无项目 MCP 服务器"})):(d(),I("div",Se,[(d(!0),I(y,null,o(P.value,e=>(d(),I("div",{key:e.id,class:"server-row"},[x("div",Me,[x("div",Ne,p(e.id),1),x("div",$e,p(S(e)),1)]),r(w(Y),{size:"small"},{default:m(()=>[r(w(a),{size:"tiny",loading:_.value===e.id,onClick:a=>async function(e){_.value=e.id;try{const a=await he(i.projectPath,i.platform,e.id);a.success?c.success(`${e.id} 连接成功`):c.error(a.message||`${e.id} 连接失败`)}catch(a){c.error(`测试失败:${a.message}`)}finally{_.value=""}}(e)},{default:m(()=>[...v[3]||(v[3]=[l("测试",-1)])]),_:1},8,["loading","onClick"]),r(w(a),{size:"tiny",disabled:e.external,onClick:a=>function(e){k.value={id:e.id,...e},g.value=!0}(e)},{default:m(()=>[...v[4]||(v[4]=[l("编辑",-1)])]),_:1},8,["disabled","onClick"]),r(w(a),{size:"tiny",type:"error",secondary:"",disabled:e.external,onClick:a=>function(e){h.warning({title:"移除项目 MCP",content:`确定从当前项目移除 ${e.id} 吗?用户级配置不会被删除。`,positiveText:"移除",negativeText:"取消",onPositiveClick:async()=>{try{await ye(i.projectPath,i.platform,e.id),await $(),n("updated"),c.success("项目 MCP 已移除")}catch(a){c.error(`移除失败:${a.message}`)}}})}(e)},{default:m(()=>[...v[5]||(v[5]=[l("移除",-1)])]),_:1},8,["disabled","onClick"])]),_:2},1024)]))),128))])),r(R,{visible:g.value,"onUpdate:visible":v[0]||(v[0]=e=>g.value=e),"editing-server":k.value,"existing-ids":P.value.map(e=>e.id),scope:"project","project-path":e.projectPath,platform:e.platform,onSaved:N},null,8,["visible","editing-server","existing-ids","project-path","platform"])]))}},Ue=s(Fe,[["__scopeId","data-v-1ebbb765"]]),Le={class:"project-config-content"},Te={class:"project-config-header"},Ae={key:0,class:"unsupported-state"},Be={key:0,class:"unsupported-state"},De=s({__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 s=e,t=a,{drawerWidth:i}=Z(760),n=f({get:()=>s.show,set:e=>t("update:show",e)}),o=[{label:"Claude",value:"claude"},{label:"Codex",value:"codex"},{label:"Gemini",value:"gemini"},{label:"OpenCode",value:"opencode"},{label:"OMP",value:"omp"}],h=C(s.platform||"claude"),y=C("instruction"),g=C(null),k=C(!1),_=C(0);async function j(){if(!s.projectPath||!h.value)return;const e=++_.value;k.value=!0;try{const a=await ke(s.projectPath,h.value);if(e!==_.value)return;g.value=a}finally{e===_.value&&(k.value=!1)}}return v(n,e=>{e?(h.value=s.platform||"claude",y.value="instruction",j()):_.value+=1}),v([()=>s.projectPath,()=>s.platform,h],([e,a],s)=>{n.value&&e&&a&&(a===s?.[1]&&e===s?.[0]||j())}),c(()=>{n.value&&j()}),(a,s)=>(d(),u(w(G),{show:n.value,"onUpdate:show":s[2]||(s[2]=e=>n.value=e),width:w(i),placement:"right","show-mask":!0},{default:m(()=>[r(w(V),{title:"项目配置",closable:"","native-scrollbar":!1},{default:m(()=>[x("div",Le,[x("div",Te,[x("div",null,[s[3]||(s[3]=x("div",{class:"project-config-title"},"当前项目",-1)),r(w(se),{depth:"3",class:"project-path"},{default:m(()=>[l(p(e.projectPath),1)]),_:1})]),r(w(re),{value:h.value,"onUpdate:value":s[0]||(s[0]=e=>h.value=e),size:"small",options:o,disabled:k.value,style:{width:"130px"}},null,8,["value","disabled"])]),r(w(X),{show:k.value},{default:m(()=>[r(w(q),{value:y.value,"onUpdate:value":s[1]||(s[1]=e=>y.value=e),type:"line",animated:""},{default:m(()=>[r(w(O),{name:"instruction",tab:"项目指令"},{default:m(()=>[r(Pe,{"project-path":e.projectPath,platform:h.value,instruction:g.value?.instruction,onUpdated:j},null,8,["project-path","platform","instruction"])]),_:1}),r(w(O),{name:"skills",tab:"Skills"},{default:m(()=>[!1===g.value?.capabilities?.skills?(d(),I("div",Ae," 当前平台不提供项目 Skills ")):(d(),u(J,{key:1,platform:h.value,"project-path":e.projectPath,scope:"project","in-drawer":"","drawer-visible":n.value},null,8,["platform","project-path","drawer-visible"]))]),_:1}),r(w(O),{name:"mcp",tab:"MCP"},{default:m(()=>[!1===g.value?.capabilities?.mcp?(d(),I("div",Be," 当前平台不提供项目 MCP ")):(d(),u(Ue,{key:1,"project-path":e.projectPath,platform:h.value,mcp:g.value?.mcp,onUpdated:j},null,8,["project-path","platform","mcp"]))]),_:1})]),_:1},8,["value"])]),_:1},8,["show"])])]),_:1})]),_:1},8,["show","width"]))}},[["__scopeId","data-v-e9a405fe"]]),Ee={class:"session-list-container"},Ke={class:"header"},Oe={class:"title-bar"},qe={class:"title-section"},We={class:"title-with-count"},He={class:"header-actions"},Re={key:0,class:"loading-container"},Ge={key:1,class:"loading-container compact"},Ze={key:3,class:"sessions-list"},Ve=["onMouseenter","onClick"],Je={class:"session-left"},Qe={class:"session-icon"},Xe={class:"session-info"},Ye={class:"session-header"},ea={class:"session-title-row"},aa={class:"session-title"},sa={class:"session-meta"},ta={class:"session-right"},la={class:"session-tags-area"},ia={key:0,class:"session-actions"},na={key:0,style:{"max-height":"70vh","overflow-y":"auto"}},oa={class:"search-result-header"},ra={class:"search-result-title"},ua="__full__",ca=s({__name:"SessionList",props:{projectName:{type:String,required:!0}},setup(s){const D=s,E=k(),O=b(),q=fe(),{addFavorite:R,removeFavorite:G,isFavorite:Z}=te(),V=f(()=>z(O)),J=C(D.projectName),me=f(()=>J.value||D.projectName),he=C(""),ye=C(null),ge=C(!1),ke=C(null),_e=C(""),we=C(null),je=C([]),be=C(1),Ce=C(null),Pe=C(!1),Ie=C(!1),xe=C(null),ze=C(!1),Se=C(!1),Me=C([]),Ne=C(!1),$e=C(!1),Fe=C(null),Ue=C(""),Le=C(ua),Te=C(!1),Ae=C(!1),Be=C([]),ca=C(!1),da=C(""),va=C(""),pa=C(null);function fa(e){return"string"==typeof e&&(e.startsWith("/")||/^[A-Za-z]:[\\/]/.test(e)||e.startsWith("\\\\"))}const ma=f(()=>{const e=me.value;return q.projects.find(a=>a.name===e)||q.projects.find(e=>e.displayName===D.projectName||e.fullPath===D.projectName||e.path===D.projectName)||null}),ha=f(()=>[q.currentProjectInfo?.fullPath,q.currentProjectInfo?.path,ma.value?.fullPath,ma.value?.path].find(fa)||""),ya=f(()=>q.currentProjectInfo?.displayName||ma.value?.displayName||D.projectName),ga=f(()=>ha.value||q.currentProjectInfo?.fullPath||ma.value?.fullPath||ma.value?.path||me.value),ka=f(()=>new Set(Me.value)),_a=f(()=>Me.value.length),wa=f(()=>je.value.length>0&&je.value.every(e=>ka.value.has(e.sessionId))),ja=f(()=>_a.value>0&&!wa.value);async function ba(){q.projects.length||await q.fetchProjects();const e=q.projects.find(e=>e.name===D.projectName);if(e)return J.value=e.name,e.name;const a=q.projects.find(e=>e.displayName===D.projectName||e.fullPath===D.projectName||e.path===D.projectName);return a?(J.value=a.name,a.name!==D.projectName&&await E.replace({name:"cli-sessions",params:{platform:V.value,projectName:a.name}}),a.name):(J.value=D.projectName,D.projectName)}async function Ca(e={}){const a=await ba(),s=e.page??be.value,t=e.limit??q.sessionsPagination.limit;await q.fetchSessions(a,{page:s,limit:t,...e})}async function Pa(e){be.value=e,await Ca({page:e})}function Ia(){E.push({name:"cli-projects",params:{platform:V.value}})}async function xa(){if(he.value){ze.value=!0;try{const e=await de(me.value,he.value,35,V.value);Ce.value=e,Pe.value=!0}catch(e){ae.error("搜索失败: "+e.message)}finally{ze.value=!1}}}function za(){Se.value=!0,we.value=null}function Sa(){Se.value=!1,Me.value=[],we.value=null}function Ma(e){return ka.value.has(e)}function Na(e,a=!Ma(e)){const s=new Set(Me.value);a?s.add(e):s.delete(e),Me.value=Array.from(s)}function $a(e){Me.value=e?je.value.map(e=>e.sessionId):[]}function Fa(e){Se.value?Na(e.sessionId):function(e){da.value=e.sessionId,va.value=e.alias||"",ca.value=!0,n(()=>{pa.value?.open()})}(e)}async function Ua(){if(ke.value)try{const e=ke.value.sessionId;_e.value?(await q.setAlias(e,_e.value),ae.success("别名设置成功")):(await q.deleteAlias(e),ae.success("别名已删除")),ge.value=!1,ke.value=null,_e.value=""}catch(e){ae.error("操作失败: "+e.message)}}function La(){$e.value=!1,Fe.value=null,Ue.value="",Le.value=ua,Be.value=[],Te.value=!1,Ae.value=!1}async function Ta(){if(Fe.value)try{Ae.value=!0,await q.forkSession(Fe.value.sessionId,{afterUserMessageNumber:Le.value===ua?null:Le.value,alias:Ue.value?.trim()||void 0}),ae.success("Fork 成功!"),La()}catch(e){ae.error("Fork 失败: "+e.message)}finally{Ae.value=!1}}function Aa(e){ae.error(e)}function Ba(e){const a=new Set((e||[]).filter(Boolean));0!==a.size&&(Me.value=Me.value.filter(e=>!a.has(e)),da.value&&a.has(da.value)&&(ca.value=!1,da.value="",va.value=""))}async function Da(e){try{const{copyResult:a}=await ve(me.value,e,V.value);if("manual"===a?.method)return void ae.warning("自动复制失败,已弹出手动复制框");ae.success("启动命令已复制到剪贴板")}catch(a){ae.error("复制失败: "+a.message)}}function Ea(){if(0===_a.value)return void ae.warning("请先选择要删除的会话");const e=[...Me.value];ee.warning({title:"批量删除会话",content:`确定要删除选中的 ${e.length} 个会话吗?此操作不可恢复!`,positiveText:"确定删除",negativeText:"取消",onPositiveClick:async()=>{Ne.value=!0;try{const a=await q.deleteSessions(e);if(Ba(a.deletedSessionIds),0===a.failed.length)return ae.success(`已删除 ${a.deletedSessionIds.length} 个会话`),void Sa();Me.value=a.failed.map(e=>e.sessionId),a.deletedSessionIds.length>0?ae.warning(`已删除 ${a.deletedSessionIds.length} 个会话,${a.failed.length} 个删除失败`):ae.error(`删除失败: ${a.failed[0].error.message}`)}finally{Ne.value=!1}}})}function Ka(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 Oa(e,a){if(!a||!e)return e;const s=new RegExp(`(${a})`,"gi");return e.replace(s,'<mark style="background-color: #ffd700; padding: 2px 4px; border-radius: 2px; font-weight: 600;">$1</mark>')}function qa(e,a=80){return e?e.length>a?e.substring(0,a)+"...":e:""}v(()=>q.sessionsWithAlias,e=>{je.value=[...e];const a=new Set(e.map(e=>e.sessionId));Me.value=Me.value.filter(e=>a.has(e)),Se.value&&0===e.length&&Sa()},{immediate:!0});let Wa=0,Ha=!1;async function Ra(){if("visible"!==document.visibilityState||Ha)return;const e=Date.now();if(!(e-Wa<3e4)){Ha=!0,Wa=e;try{const e=xe.value?.scrollTop||0,a=await ba();await q.fetchSessions(a,{page:be.value,limit:q.sessionsPagination.limit,force:!0,silent:!0,fresh:!0}),await n(),xe.value&&(xe.value.scrollTop=e)}finally{Ha=!1}}}function Ga(){"visible"===document.visibilityState&&Ra().catch(()=>{})}function Za(){Ra().catch(()=>{})}function Va(e){(e.metaKey||e.ctrlKey)&&"k"===String(e.key).toLowerCase()&&(e.preventDefault(),ye.value?.querySelector?.("input")?.focus?.())}return v([V,()=>D.projectName],([e])=>{Ie.value=!1,Sa(),q.setChannel(e),be.value=1,Ca()},{immediate:!0}),c(()=>{document.addEventListener("visibilitychange",Ga),window.addEventListener("focus",Za),document.addEventListener("keydown",Va)}),i(()=>{document.removeEventListener("visibilitychange",Ga),window.removeEventListener("focus",Za),document.removeEventListener("keydown",Va)}),(s,i)=>(d(),I("div",Ee,[x("div",Ke,[x("div",Oe,[r(w(a),{size:"small",onClick:Ia,class:"back-button"},{icon:m(()=>[r(w(e),{size:"18"},{default:m(()=>[r(w(F))]),_:1})]),_:1}),x("div",qe,[x("div",We,[r(w(H),null,{default:m(()=>[l(p(ya.value),1)]),_:1}),r(w(se),{depth:"3",class:"session-count"},{default:m(()=>[l("("+p(w(q).sessionsPagination.total)+" 个对话)",1)]),_:1}),r(w(oe),{size:"small",bordered:!1,type:"info",class:"total-size-tag"},{default:m(()=>[l(p(Ka(w(q).totalSize)),1)]),_:1}),x("div",He,[Se.value?(d(),I(y,{key:0},[r(w(ue),{checked:wa.value,indeterminate:ja.value,disabled:0===je.value.length||Ne.value,"onUpdate:checked":$a},{default:m(()=>[...i[14]||(i[14]=[l(" 全选 ",-1)])]),_:1},8,["checked","indeterminate","disabled"]),r(w(se),{depth:"3"},{default:m(()=>[l("已选 "+p(_a.value)+" 个",1)]),_:1}),r(w(a),{size:"small",type:"error",disabled:0===_a.value,loading:Ne.value,onClick:Ea},{icon:m(()=>[r(w(e),null,{default:m(()=>[r(w(L))]),_:1})]),default:m(()=>[i[15]||(i[15]=l(" 删除 ",-1))]),_:1},8,["disabled","loading"]),r(w(a),{size:"small",disabled:Ne.value,onClick:Sa},{default:m(()=>[...i[16]||(i[16]=[l(" 完成 ",-1)])]),_:1},8,["disabled"])],64)):(d(),I(y,{key:1},[r(w(a),{size:"small",type:"error",secondary:"",onClick:za},{icon:m(()=>[r(w(e),null,{default:m(()=>[r(w(L))]),_:1})]),default:m(()=>[i[17]||(i[17]=l(" 管理 ",-1))]),_:1}),r(w(a),{size:"small",type:"primary",secondary:"",disabled:!ha.value,onClick:i[0]||(i[0]=e=>Ie.value=!0)},{default:m(()=>[...i[18]||(i[18]=[l(" 项目配置 ",-1)])]),_:1},8,["disabled"])],64))])]),r(w(se),{depth:"3",class:"project-path"},{default:m(()=>[l(p(ga.value),1)]),_:1})]),x("div",{ref_key:"searchInputContainer",ref:ye,class:"search-input-container"},[r(w(le),{value:he.value,"onUpdate:value":i[1]||(i[1]=e=>he.value=e),placeholder:"搜索会话...(Cmd/Ctrl+K)",clearable:"",class:"search-input",onKeyup:j(xa,["enter"]),disabled:ze.value},{prefix:m(()=>[r(w(e),null,{default:m(()=>[r(w(M))]),_:1})]),suffix:m(()=>[r(w(a),{text:"",onClick:xa,disabled:!he.value||ze.value,loading:ze.value},{default:m(()=>[...i[19]||(i[19]=[l(" 搜索 ",-1)])]),_:1},8,["disabled","loading"])]),_:1},8,["value","disabled"])],512)])]),x("div",{class:"content",ref_key:"contentEl",ref:xe},[w(q).loading&&0===w(q).sessions.length&&!w(q).sessionsPending?(d(),I("div",Re,[r(w(X),{size:"large"},{description:m(()=>[...i[20]||(i[20]=[l(" 加载会话列表... ",-1)])]),_:1})])):w(q).sessionsPending?(d(),I("div",Ge,[r(w(X),{size:"small"},{description:m(()=>[...i[21]||(i[21]=[l(" 正在生成会话列表... ",-1)])]),_:1})])):w(q).error&&0===w(q).sessions.length?(d(),u(w(ie),{key:2,type:"error",title:"加载失败",style:{"margin-bottom":"16px"}},{default:m(()=>[l(p(w(q).error),1)]),_:1})):je.value.length>0?(d(),I("div",Ze,[(d(!0),I(y,null,o(je.value,s=>(d(),I("div",{key:s.sessionId},[x("div",{class:g(["session-item",{"session-item-selected":Ma(s.sessionId),"session-item-selection-mode":Se.value}]),onMouseenter:e=>we.value=s.sessionId,onMouseleave:i[3]||(i[3]=e=>we.value=null),onClick:e=>Fa(s)},[Se.value?(d(),I("div",{key:0,class:"selection-checkbox",onClick:i[2]||(i[2]=_(()=>{},["stop"]))},[r(w(ue),{checked:Ma(s.sessionId),"onUpdate:checked":e=>Na(s.sessionId,e)},null,8,["checked","onUpdate:checked"])])):t("",!0),x("div",Je,[x("div",Qe,[r(w(e),{size:"24",color:"#18a058"},{default:m(()=>[r(w(B))]),_:1})]),x("div",Xe,[x("div",Ye,[x("div",ea,[x("span",aa,p(s.alias?`${s.alias} (${s.sessionId.substring(0,8)})`:s.sessionId),1),s.forkedFrom?(d(),u(w(Q),{key:0,placement:"top"},{trigger:m(()=>[r(w(oe),{size:"small",type:"warning",bordered:!1,style:{"margin-left":"8px",cursor:"help"}},{icon:m(()=>[r(w(e),null,{default:m(()=>[r(w(S))]),_:1})]),default:m(()=>[i[22]||(i[22]=l(" Fork ",-1))]),_:1})]),default:m(()=>[l(" Fork 自: "+p(s.forkedFrom),1)]),_:2},1024)):t("",!0)])]),x("div",sa,[r(w(se),{depth:"3"},{default:m(()=>{return[l(p((e=s.mtime,e?new Date(e).toLocaleString("zh-CN"):"")),1)];var e}),_:2},1024),r(w(se),{depth:"3"},{default:m(()=>[...i[23]||(i[23]=[l("•",-1)])]),_:1}),r(w(oe),{size:"small",bordered:!1},{default:m(()=>[l(p(Ka(s.size)),1)]),_:2},1024)]),s.firstMessage?(d(),u(w(se),{key:0,depth:"3",class:"session-message"},{default:m(()=>[l(p(qa(s.firstMessage,80)),1)]),_:2},1024)):s.gitBranch||s.summary?t("",!0):(d(),u(w(se),{key:1,depth:"3",class:"session-message session-message-empty"},{default:m(()=>[...i[24]||(i[24]=[l(" 暂未读取到对话内容 ",-1)])]),_:1}))])]),x("div",ta,[x("div",la,[s.gitBranch?(d(),u(w(oe),{key:0,size:"small",type:"info",bordered:!1},{icon:m(()=>[r(w(e),null,{default:m(()=>[r(w(S))]),_:1})]),default:m(()=>[l(" "+p(s.gitBranch),1)]),_:2},1024)):t("",!0)]),Se.value?t("",!0):(d(),I("div",ia,[r(w(Y),null,{default:m(()=>[P(r(w(a),{size:"small",type:"error",onClick:_(e=>{return a=s.sessionId,void ee.warning({title:"删除会话",content:"确定要删除这个会话吗?此操作不可恢复!",positiveText:"确定删除",negativeText:"取消",onPositiveClick:async()=>{try{await q.deleteSession(a),Ba([a]),ae.success("会话已删除")}catch(e){ae.error("删除失败: "+e.message)}}});var a},["stop"])},{icon:m(()=>[r(w(e),null,{default:m(()=>[r(w(L))]),_:1})]),default:m(()=>[i[25]||(i[25]=l(" 删除 ",-1))]),_:1},8,["onClick"]),[[h,we.value===s.sessionId]]),r(w(a),{size:"small",onClick:_(e=>function(e){ke.value=e,_e.value=e.alias||"",ge.value=!0}(s),["stop"])},{icon:m(()=>[r(w(e),null,{default:m(()=>[r(w(T))]),_:1})]),default:m(()=>[i[26]||(i[26]=l(" 别名 ",-1))]),_:1},8,["onClick"]),r(w(a),{size:"small",type:w(Z)(V.value,me.value,s.sessionId)?"warning":"default",onClick:_(e=>async function(e){const a=V.value,s=Z(a,me.value,e.sessionId);try{if(s)await G(a,me.value,e.sessionId),ae.success("已取消收藏");else{const s={sessionId:e.sessionId,projectName:me.value,projectDisplayName:ya.value,projectFullPath:ga.value,alias:e.alias||"",firstMessage:e.firstMessage||"",mtime:e.mtime,size:e.size,gitBranch:e.gitBranch||"",forkedFrom:e.forkedFrom||""};await R(a,s),ae.success("已添加到收藏")}}catch(t){ae.error("操作失败: "+t.message)}}(s),["stop"])},{icon:m(()=>[r(w(e),null,{default:m(()=>[w(Z)(V.value,me.value,s.sessionId)?(d(),u(w(A),{key:0})):(d(),u(w(U),{key:1}))]),_:2},1024)]),default:m(()=>[l(" "+p(w(Z)(V.value,me.value,s.sessionId)?"已收藏":"收藏"),1)]),_:2},1032,["type","onClick"]),"opencode"!==V.value?(d(),u(w(a),{key:0,size:"small",onClick:_(e=>async function(e){if("opencode"!==V.value)try{const a=je.value.find(a=>a.sessionId===e);Fe.value=a||{sessionId:e},Ue.value="",Le.value=ua,Be.value=[{label:"完整会话末尾(保留全部消息)",value:ua}],$e.value=!0,Te.value=!0;const s=await ce(me.value,e,V.value),t=Array.isArray(s?.items)?s.items:[];Be.value=[{label:"完整会话末尾(保留全部消息)",value:ua},...t.map(e=>({label:`保留到第 ${e.userMessageNumber} 条用户消息这一轮 · ${e.preview}`,value:e.userMessageNumber}))]}catch(a){ae.error("加载 Fork 位置失败: "+a.message),La()}finally{Te.value=!1}else ae.warning("OpenCode 当前不支持该 Fork 操作")}(s.sessionId),["stop"])},{icon:m(()=>[r(w(e),null,{default:m(()=>[r(w(S))]),_:1})]),default:m(()=>[i[27]||(i[27]=l(" Fork ",-1))]),_:1},8,["onClick"])):t("",!0),r(w(a),{size:"small",type:"primary",onClick:_(e=>Da(s.sessionId),["stop"])},{icon:m(()=>[r(w(e),null,{default:m(()=>[r(w(N))]),_:1})]),default:m(()=>[i[28]||(i[28]=l(" 使用对话 ",-1))]),_:1},8,["onClick"])]),_:2},1024)]))])],42,Ve)]))),128))])):t("",!0),w(q).sessionsPagination.total>w(q).sessionsPagination.limit?(d(),u(w(W),{key:4,page:be.value,"onUpdate:page":[i[4]||(i[4]=e=>be.value=e),Pa],"page-count":Math.ceil(w(q).sessionsPagination.total/w(q).sessionsPagination.limit),"page-size":w(q).sessionsPagination.limit,"show-quick-jumper":"",class:"list-pagination"},null,8,["page","page-count","page-size"])):t("",!0),w(q).loading||w(q).error||w(q).sessionsPending||0!==je.value.length?t("",!0):(d(),u(w(ne),{key:5,description:he.value?"当前页没有匹配的会话":"没有找到会话",style:{"margin-top":"60px"}},{icon:m(()=>[r(w(e),null,{default:m(()=>[r(w($))]),_:1})]),_:1},8,["description"]))],512),r(w(K),{show:ge.value,"onUpdate:show":i[7]||(i[7]=e=>ge.value=e),preset:"dialog",title:"设置别名"},{action:m(()=>[r(w(Y),null,{default:m(()=>[r(w(a),{onClick:i[6]||(i[6]=e=>ge.value=!1)},{default:m(()=>[...i[29]||(i[29]=[l("取消",-1)])]),_:1}),r(w(a),{type:"primary",onClick:Ua},{default:m(()=>[...i[30]||(i[30]=[l("确定",-1)])]),_:1})]),_:1})]),default:m(()=>[r(w(le),{value:_e.value,"onUpdate:value":i[5]||(i[5]=e=>_e.value=e),placeholder:"输入别名(留空删除)",onKeyup:j(Ua,["enter"])},null,8,["value"])]),_:1},8,["show"]),r(w(K),{show:$e.value,"onUpdate:show":i[10]||(i[10]=e=>$e.value=e),preset:"dialog",title:"Fork 对话"},{action:m(()=>[r(w(Y),null,{default:m(()=>[r(w(a),{disabled:Ae.value,onClick:La},{default:m(()=>[...i[32]||(i[32]=[l("取消",-1)])]),_:1},8,["disabled"]),r(w(a),{type:"primary",loading:Ae.value,onClick:Ta},{default:m(()=>[...i[33]||(i[33]=[l(" 确认 Fork ",-1)])]),_:1},8,["loading"])]),_:1})]),default:m(()=>[r(w(Y),{vertical:"",size:14},{default:m(()=>[r(w(se),{depth:"3"},{default:m(()=>[...i[31]||(i[31]=[l(" 可选择保留到第几条用户消息所在轮次;会包含这条消息后 AI 的完整输出。 ",-1)])]),_:1}),r(w(re),{value:Le.value,"onUpdate:value":i[8]||(i[8]=e=>Le.value=e),options:Be.value,loading:Te.value,clearable:"",placeholder:"选择保留到哪一轮(默认完整会话)"},null,8,["value","options","loading"]),r(w(le),{value:Ue.value,"onUpdate:value":i[9]||(i[9]=e=>Ue.value=e),placeholder:"输入新会话别名(可选)",maxlength:"120"},null,8,["value"])]),_:1})]),_:1},8,["show"]),r(w(K),{show:Pe.value,"onUpdate:show":i[11]||(i[11]=e=>Pe.value=e),preset:"card",title:"搜索结果",style:{width:"1200px"}},{default:m(()=>[Ce.value?(d(),I("div",na,[r(w(ie),{type:"info",style:{"margin-bottom":"16px"}},{default:m(()=>[l(' 关键词 "'+p(Ce.value.keyword)+'" 共找到 '+p(Ce.value.totalMatches)+" 处匹配 ",1)]),_:1}),(d(!0),I(y,null,o(Ce.value.sessions,s=>(d(),I("div",{key:s.sessionId,class:"search-result-item"},[x("div",oa,[x("div",ra,[r(w(se),{strong:""},{default:m(()=>[l(p(s.alias?`${s.alias} (${s.sessionId.substring(0,8)})`:s.sessionId.substring(0,8)),1)]),_:2},1024),r(w(oe),{size:"small",bordered:!1},{default:m(()=>[l(p(s.matchCount)+" 个匹配",1)]),_:2},1024)]),r(w(a),{size:"small",type:"primary",onClick:e=>Da(s.sessionId)},{icon:m(()=>[r(w(e),null,{default:m(()=>[r(w(N))]),_:1})]),default:m(()=>[i[34]||(i[34]=l(" 使用对话 ",-1))]),_:1},8,["onClick"])]),(d(!0),I(y,null,o(s.matches,(e,a)=>(d(),I("div",{key:a,class:"search-match"},[r(w(oe),{size:"tiny",type:"user"===e.role?"info":"success",bordered:!1},{default:m(()=>[l(p("user"===e.role?"用户":"助手"),1)]),_:2},1032,["type"]),r(w(se),{depth:"3",class:"search-match-text",innerHTML:Oa(e.context,Ce.value.keyword)},null,8,["innerHTML"])]))),128))]))),128)),0===Ce.value.sessions.length?(d(),u(w(ne),{key:0,description:"没有找到匹配的内容"})):t("",!0)])):t("",!0)]),_:1},8,["show"]),da.value?(d(),u(pe,{key:0,ref_key:"chatHistoryRef",ref:pa,show:ca.value,"onUpdate:show":i[12]||(i[12]=e=>ca.value=e),"project-name":me.value,"session-id":da.value,"session-alias":va.value,channel:V.value,onError:Aa},null,8,["show","project-name","session-id","session-alias","channel"])):t("",!0),r(De,{show:Ie.value,"onUpdate:show":i[13]||(i[13]=e=>Ie.value=e),"project-path":ha.value,platform:V.value},null,8,["show","project-path","platform"])]))}},[["__scopeId","data-v-66cfe9c9"]]);export{ca as default};
@@ -1 +0,0 @@
1
- import{E as e,F as a,I as t,Mt as l,N as s,P as n,bt as i,gn as o,gt as r,hn as u,ht as d,i as c,m as p,p as v,s as f,t as m,vn as y,xn as g,xt as h,yn as b}from"./_plugin-vue_export-helper-BeLZJZij.js";import{A as w,C as x,D as k,I as _,K as z,M as C,O as P,S,V as O,W as U,Y as j,Z as I,_t as N,b as A,dt as L,et as $,f as B,g as T,ht as M,l as E,m as D,mt as R,rt as W,st as Y,tt as J,u as F,w as q,x as V}from"./vue-vendor-BqZbbXHA.js";import{n as H}from"./client-UDwXBP9i.js";import{a as X,c as K,l as Z,o as G,t as Q,u as ee}from"./platforms-DWXgmy2w.js";import{F as ae,M as te,P as le,Pt as se,bt as ne,f as ie,gt as oe,h as re,m as ue,r as de,s as ce,st as pe,t as ve,v as fe,vt as me,yt as ye}from"./icons-DmFe4b5j.js";import{h as ge}from"./use-message-DqCwefG6.js";import{l as he}from"./light-0eavxNvt.js";import{t as be}from"./Divider-DsdbkHrG.js";import{n as we,t as xe}from"./useResponsiveDrawer-DZd5rNk5.js";import{t as ke}from"./DrawerContent-ChXgZ1Xm.js";import{A as _e,Dt as ze,F as Ce,I as Pe,K as Se,N as Oe,P as Ue,R as je,dt as Ie,et as Ne,ft as Ae,gt as Le,j as $e,lt as Be,mt as Te,rt as Me,st as Ee,tt as De,y as Re}from"./index-Cmmwj3Fx.js";var We=w({name:"SlotMachineNumber",props:{clsPrefix:{type:String,required:!0},value:{type:[Number,String],required:!0},oldOriginalNumber:{type:Number,default:void 0},newOriginalNumber:{type:Number,default:void 0}},setup(e){const a=Y(null),t=Y(e.value),l=Y(e.value),s=Y("up"),n=Y(!1),i=A(()=>n.value?`${e.clsPrefix}-base-slot-machine-current-number--${s.value}-scroll`:null),o=A(()=>n.value?`${e.clsPrefix}-base-slot-machine-old-number--${s.value}-scroll`:null);function r(){const a=e.newOriginalNumber,t=e.oldOriginalNumber;void 0!==t&&void 0!==a&&(a>t?u("up"):t>a&&u("down"))}function u(e){s.value=e,n.value=!1,_(()=>{var e;null===(e=a.value)||void 0===e||e.offsetWidth,n.value=!0})}return I(L(e,"value"),(e,a)=>{t.value=a,l.value=e,_(r)}),()=>{const{clsPrefix:s}=e;return C("span",{ref:a,class:`${s}-base-slot-machine-number`},null!==t.value?C("span",{class:[`${s}-base-slot-machine-old-number ${s}-base-slot-machine-old-number--top`,o.value]},t.value):null,C("span",{class:[`${s}-base-slot-machine-current-number`,i.value]},C("span",{ref:"numberWrapper",class:[`${s}-base-slot-machine-current-number__inner`,"number"!=typeof e.value&&`${s}-base-slot-machine-current-number__inner--not-number`]},l.value)),null!==t.value?C("span",{class:[`${s}-base-slot-machine-old-number ${s}-base-slot-machine-old-number--bottom`,o.value]},t.value):null)}}}),{cubicBezierEaseOut:Ye}=a;var Je=u([u("@keyframes n-base-slot-machine-fade-up-in","\n from {\n transform: translateY(60%);\n opacity: 0;\n }\n to {\n transform: translateY(0);\n opacity: 1;\n }\n "),u("@keyframes n-base-slot-machine-fade-down-in","\n from {\n transform: translateY(-60%);\n opacity: 0;\n }\n to {\n transform: translateY(0);\n opacity: 1;\n }\n "),u("@keyframes n-base-slot-machine-fade-up-out","\n from {\n transform: translateY(0%);\n opacity: 1;\n }\n to {\n transform: translateY(-60%);\n opacity: 0;\n }\n "),u("@keyframes n-base-slot-machine-fade-down-out","\n from {\n transform: translateY(0%);\n opacity: 1;\n }\n to {\n transform: translateY(60%);\n opacity: 0;\n }\n "),o("base-slot-machine","\n overflow: hidden;\n white-space: nowrap;\n display: inline-block;\n height: 18px;\n line-height: 18px;\n ",[o("base-slot-machine-number","\n display: inline-block;\n position: relative;\n height: 18px;\n width: .6em;\n max-width: .6em;\n ",[function({duration:e=".2s"}={}){return[u("&.fade-up-width-expand-transition-leave-active",{transition:`\n opacity ${e} ${Ye},\n max-width ${e} ${Ye},\n transform ${e} ${Ye}\n `}),u("&.fade-up-width-expand-transition-enter-active",{transition:`\n opacity ${e} ${Ye},\n max-width ${e} ${Ye},\n transform ${e} ${Ye}\n `}),u("&.fade-up-width-expand-transition-enter-to",{opacity:1,transform:"translateX(0) translateY(0)"}),u("&.fade-up-width-expand-transition-enter-from",{maxWidth:"0 !important",opacity:0,transform:"translateY(60%)"}),u("&.fade-up-width-expand-transition-leave-from",{opacity:1,transform:"translateY(0)"}),u("&.fade-up-width-expand-transition-leave-to",{maxWidth:"0 !important",opacity:0,transform:"translateY(60%)"})]}({duration:".2s"}),p({duration:".2s",delay:"0s"}),o("base-slot-machine-old-number","\n display: inline-block;\n opacity: 0;\n position: absolute;\n left: 0;\n right: 0;\n ",[b("top",{transform:"translateY(-100%)"}),b("bottom",{transform:"translateY(100%)"}),b("down-scroll",{animation:"n-base-slot-machine-fade-down-out .2s cubic-bezier(0, 0, .2, 1)",animationIterationCount:1}),b("up-scroll",{animation:"n-base-slot-machine-fade-up-out .2s cubic-bezier(0, 0, .2, 1)",animationIterationCount:1})]),o("base-slot-machine-current-number","\n display: inline-block;\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n right: 0;\n opacity: 1;\n transform: translateY(0);\n width: .6em;\n ",[b("down-scroll",{animation:"n-base-slot-machine-fade-down-in .2s cubic-bezier(0, 0, .2, 1)",animationIterationCount:1}),b("up-scroll",{animation:"n-base-slot-machine-fade-up-in .2s cubic-bezier(0, 0, .2, 1)",animationIterationCount:1}),y("inner","\n display: inline-block;\n position: absolute;\n right: 0;\n top: 0;\n width: .6em;\n ",[b("not-number","\n right: unset;\n left: 0;\n ")])])])])]),Fe=w({name:"BaseSlotMachine",props:{clsPrefix:{type:String,required:!0},value:{type:[Number,String],default:0},max:{type:Number,default:void 0},appeared:{type:Boolean,required:!0}},setup(a){n("-base-slot-machine",Je,L(a,"clsPrefix"));const t=Y(),l=Y(),s=A(()=>{if("string"==typeof a.value)return[];if(a.value<1)return[0];const e=[];let t=a.value;for(void 0!==a.max&&(t=Math.min(a.max,t));t>=1;)e.push(t%10),t/=10,t=Math.floor(t);return e.reverse(),e});return I(L(a,"value"),(e,a)=>{"string"==typeof e?(l.value=void 0,t.value=void 0):"string"==typeof a?(l.value=e,t.value=void 0):(l.value=e,t.value=a)}),()=>{const{value:n,clsPrefix:i}=a;return"number"==typeof n?C("span",{class:`${i}-base-slot-machine`},C(F,{name:"fade-up-width-expand-transition",tag:"span"},{default:()=>s.value.map((e,a)=>C(We,{clsPrefix:i,key:s.value.length-a-1,oldOriginalNumber:t.value,newOriginalNumber:l.value,value:e}))}),C(e,{key:"+",width:!0},{default:()=>void 0!==a.max&&a.max<n?C(We,{clsPrefix:i,value:"+"}):null})):C("span",{class:`${i}-base-slot-machine`},n)}}}),qe=u([u("@keyframes badge-wave-spread",{from:{boxShadow:"0 0 0.5px 0px var(--n-ripple-color)",opacity:.6},to:{boxShadow:"0 0 0.5px 4.5px var(--n-ripple-color)",opacity:0}}),o("badge","\n display: inline-flex;\n position: relative;\n vertical-align: middle;\n font-family: var(--n-font-family);\n ",[b("as-is",[o("badge-sup",{position:"static",transform:"translateX(0)"},[ge({transformOrigin:"left bottom",originalTransform:"translateX(0)"})])]),b("dot",[o("badge-sup","\n height: 8px;\n width: 8px;\n padding: 0;\n min-width: 8px;\n left: 100%;\n bottom: calc(100% - 4px);\n ",[u("::before","border-radius: 4px;")])]),o("badge-sup","\n background: var(--n-color);\n transition:\n background-color .3s var(--n-bezier),\n color .3s var(--n-bezier);\n color: #FFF;\n position: absolute;\n height: 18px;\n line-height: 18px;\n border-radius: 9px;\n padding: 0 6px;\n text-align: center;\n font-size: var(--n-font-size);\n transform: translateX(-50%);\n left: 100%;\n bottom: calc(100% - 9px);\n font-variant-numeric: tabular-nums;\n z-index: 2;\n display: flex;\n align-items: center;\n ",[ge({transformOrigin:"left bottom",originalTransform:"translateX(-50%)"}),o("base-wave",{zIndex:1,animationDuration:"2s",animationIterationCount:"infinite",animationDelay:"1s",animationTimingFunction:"var(--n-ripple-bezier)",animationName:"badge-wave-spread"}),u("&::before",'\n opacity: 0;\n transform: scale(1);\n border-radius: 9px;\n content: "";\n position: absolute;\n left: 0;\n right: 0;\n top: 0;\n bottom: 0;\n ')])])]),Ve=w({name:"Badge",props:Object.assign(Object.assign({},s.props),{value:[String,Number],max:Number,dot:Boolean,type:{type:String,default:"default"},show:{type:Boolean,default:!0},showZero:Boolean,processing:Boolean,color:String,offset:Array}),setup(e,{slots:a}){const{mergedClsPrefixRef:n,inlineThemeDisabled:o,mergedRtlRef:u}=r(e),c=s("Badge","-badge",qe,Be,e,n),p=Y(!1),v=A(()=>e.show&&(e.dot||void 0!==e.value&&!(!e.showZero&&Number(e.value)<=0)||!i(a.value)));O(()=>{v.value&&(p.value=!0)});const f=t("Badge",u,n),m=A(()=>{const{type:a,color:t}=e,{common:{cubicBezierEaseInOut:l,cubicBezierEaseOut:s},self:{[g("color",a)]:n,fontFamily:i,fontSize:o}}=c.value;return{"--n-font-size":o,"--n-font-family":i,"--n-color":t||n,"--n-ripple-color":t||n,"--n-bezier":l,"--n-ripple-bezier":s}}),y=o?d("badge",A(()=>{let a="";const{type:t,color:s}=e;return t&&(a+=t[0]),s&&(a+=l(s)),a}),m,e):void 0,h=A(()=>{const{offset:a}=e;if(!a)return;const[t,l]=a,s="number"==typeof t?`${t}px`:t,n="number"==typeof l?`${l}px`:l;return{transform:`translate(calc(${(null==f?void 0:f.value)?"50%":"-50%"} + ${s}), ${n})`}});return{rtlEnabled:f,mergedClsPrefix:n,appeared:p,showBadge:v,handleAfterEnter:()=>{p.value=!0},handleAfterLeave:()=>{p.value=!1},cssVars:o?void 0:m,themeClass:null==y?void 0:y.themeClass,onRender:null==y?void 0:y.onRender,offsetStyle:h}},render(){var e;const{mergedClsPrefix:a,onRender:t,themeClass:l,$slots:s}=this;null==t||t();const n=null===(e=s.default)||void 0===e?void 0:e.call(s);return C("div",{class:[`${a}-badge`,this.rtlEnabled&&`${a}-badge--rtl`,l,{[`${a}-badge--dot`]:this.dot,[`${a}-badge--as-is`]:!n}],style:this.cssVars},n,C(E,{name:"fade-in-scale-up-transition",onAfterEnter:this.handleAfterEnter,onAfterLeave:this.handleAfterLeave},{default:()=>this.showBadge?C("sup",{class:`${a}-badge-sup`,title:ze(this.value),style:this.offsetStyle},h(s.value,()=>[this.dot?null:C(Fe,{clsPrefix:a,appeared:this.appeared,max:this.max,value:this.value})]),this.processing?C(v,{clsPrefix:a}):null):null}))}}),He={class:"remote-provider-fields"},Xe={class:"remote-field-label"},Ke=m({__name:"RemoteProviderFields",props:{provider:{type:Object,required:!0},definition:{type:Object,default:null}},setup(e){const a=e,t=A(()=>Array.isArray(a.definition?.fields)?a.definition.fields:[]);function l(e){const t=e?.visibleWhen;return!t||"object"!=typeof t||a.provider?.config?.[t.key]===t.equals}function s(e){return"secret"===e.type?"password":"text"}return(a,n)=>(U(),q("div",He,[(U(!0),q(T,null,z(t.value,a=>J((U(),q("div",{key:a.key,class:M(["remote-field",{"remote-field-wide":!0===a.wide}])},[V("span",Xe,N(a.label),1),"select"===a.type?(U(),S(R(Me),{key:0,value:e.provider.config[a.key],"onUpdate:value":t=>e.provider.config[a.key]=t,size:"small",options:a.options||[],placeholder:a.placeholder},null,8,["value","onUpdate:value","options","placeholder"])):(U(),S(R(Ie),{key:1,value:e.provider.config[a.key],"onUpdate:value":t=>e.provider.config[a.key]=t,size:"small",type:s(a),"show-password-on":"secret"===a.type?"click":void 0,placeholder:a.placeholder},null,8,["value","onUpdate:value","type","show-password-on","placeholder"]))],2)),[[B,l(a)]])),128))]))}},[["__scopeId","data-v-44913e2a"]]);var Ze={class:"settings-container"},Ge={class:"settings-sidebar"},Qe={class:"sidebar-header"},ea={class:"settings-menu"},aa=["onClick"],ta={class:"menu-label"},la={class:"settings-content"},sa={class:"settings-panel"},na={class:"panel-header"},ia={class:"panel-title-row"},oa={class:"panel-body"},ra={class:"setting-group"},ua={class:"setting-item"},da={class:"setting-label"},ca={class:"visibility-options"},pa={class:"visibility-item"},va={class:"visibility-info"},fa={class:"visibility-item"},ma={class:"visibility-info"},ya={class:"visibility-item"},ga={class:"visibility-info"},ha={class:"setting-item"},ba={class:"setting-label"},wa={class:"home-cli-settings"},xa={class:"platform-catalog-list"},ka={key:0,class:"platform-order-actions"},_a={class:"home-cli-actions"},za={class:"setting-item"},Ca={class:"setting-label"},Pa={class:"simple-theme-options"},Sa={class:"theme-text"},Oa={key:0,class:"theme-check"},Ua={class:"theme-text"},ja={key:0,class:"theme-check"},Ia={class:"settings-panel"},Na={class:"panel-header"},Aa={class:"panel-title-row"},La={class:"panel-body"},$a={class:"setting-group"},Ba={class:"setting-item"},Ta={class:"setting-label"},Ma={class:"notification-options"},Ea={class:"visibility-item"},Da={class:"visibility-info"},Ra={key:1,class:"notification-type-section"},Wa={class:"radio-content"},Ya={class:"radio-content"},Ja={class:"radio-content"},Fa={style:{"font-size":"13px"}},qa={class:"setting-item"},Va={class:"setting-label"},Ha={class:"notification-options"},Xa={class:"remote-provider-toolbar"},Ka={class:"remote-provider-header"},Za={class:"remote-provider-title-row"},Ga={class:"remote-provider-avatar"},Qa={class:"remote-provider-title"},et={class:"remote-provider-name-row"},at={class:"remote-provider-fields"},tt={class:"remote-field remote-field-wide"},lt={class:"remote-fields-descriptor"},st={class:"remote-provider-actions"},nt={class:"panel-footer"},it={class:"settings-panel"},ot={class:"panel-header"},rt={class:"panel-title-row"},ut={class:"panel-body"},dt={class:"setting-group"},ct={class:"setting-item"},pt={class:"setting-label"},vt={class:"ports-grid"},ft={class:"setting-item"},mt={class:"setting-label"},yt={class:"advanced-options"},gt={class:"option-field"},ht={class:"option-label"},bt={class:"setting-item"},wt={class:"setting-label"},xt={class:"advanced-options"},kt={class:"option-field"},_t={class:"option-label"},zt={class:"option-field"},Ct={class:"option-label"},Pt={class:"option-field"},St={class:"option-label"},Ot={class:"option-field"},Ut={class:"option-label"},jt={class:"setting-item"},It={class:"setting-label"},Nt={style:{"margin-top":"16px"}},At={style:{background:"var(--bg-secondary)",padding:"16px","border-radius":"8px","border-left":"3px solid var(--border-secondary)"}},Lt={style:{display:"flex","align-items":"center",gap:"12px","margin-bottom":"12px"}},$t={class:"panel-footer"},Bt={class:"settings-panel"},Tt={class:"panel-header"},Mt={class:"panel-title-row"},Et={class:"panel-body"},Dt={class:"setting-group"},Rt={class:"setting-item"},Wt={class:"setting-label"},Yt={class:"security-status"},Jt={class:"setting-item"},Ft={class:"setting-label"},qt={class:"security-form"},Vt={class:"panel-footer"},Ht={class:"settings-panel"},Xt={class:"panel-header"},Kt={class:"panel-title-row"},Zt={class:"panel-body"},Gt={class:"setting-item",style:{"margin-bottom":"12px"}},Qt={class:"model-meta-section"},el={class:"speed-test-defaults"},al={class:"speed-test-default-label"},tl={class:"model-toolbar"},ll={class:"model-filter-row"},sl={key:0,class:"setting-item"},nl={key:1,class:"model-list"},il=["onClick"],ol={class:"model-card-id"},rl={key:0,class:"model-card-body"},ul={class:"model-meta-editor"},dl={class:"model-meta-section"},cl={style:{display:"grid","grid-template-columns":"1fr 1fr",gap:"8px"}},pl={class:"model-meta-section",style:{"margin-top":"8px"}},vl={style:{display:"grid","grid-template-columns":"1fr 1fr",gap:"8px"}},fl={class:"panel-footer"},ml={style:{display:"grid","grid-template-columns":"1fr 1fr",gap:"12px"}},yl={style:{display:"grid","grid-template-columns":"1fr 1fr",gap:"12px"}},gl={style:{display:"grid","grid-template-columns":"1fr 1fr",gap:"12px"}},hl=m({__name:"SettingsDrawer",props:{visible:{type:Boolean,default:!1}},emits:["update:visible"],setup(e,{emit:a}){const{drawerWidth:t,isMobile:l}=xe(720),s=Q(),{uiConfig:n}=X();async function i(e){return(await H.post("/settings/model-settings",e)).data}async function o(e){return(await H.delete(`/settings/model-settings/${encodeURIComponent(e)}`)).data}const r=e,u=a,d=A({get:()=>r.visible,set:e=>u("update:visible",e)}),p=Y("appearance"),{isDark:v,toggleTheme:m}=Re(),y=Y(!0),g=Y(!0),h=Y(!1),b=Y({webUI:19999}),w=Y({webUI:19999}),_=A(()=>[{key:"webUI",label:"Web UI",defaultPort:19999},...s.all.filter(e=>e.portKey&&Number.isFinite(e.defaultPort)).sort((e,a)=>(e.sortOrder||0)-(a.sortOrder||0)).map(e=>({key:e.portKey,label:e.portLabel||e.label||e.key,defaultPort:e.defaultPort}))]),C=Y(!1),L=Y([...G]),E=Y([...G]),F=Y(!1),ge=Y(!1),ze=Y(!1),Be=A(()=>ge.value?"[v] 已启用":"未启用"),We=A(()=>ge.value?"重启电脑时 coding-tool-x 会自动启动。如需禁用,点击下方按钮":"启用后,重启电脑时 coding-tool-x 会自动启动");function Ye(e={}){const a=(e?.omp&&"object"==typeof e.omp&&!Array.isArray(e.omp)?e.omp:null)||e,t=Number.isInteger(a.intervalSeconds)&&a.intervalSeconds>=1&&a.intervalSeconds<=60?a.intervalSeconds:5;return{enabled:"boolean"!=typeof a.enabled||a.enabled,intervalSeconds:t}}function Je(e={}){return{maxLogs:e.maxLogs??100,statsInterval:e.statsInterval??30,enableSessionBinding:!1!==e.enableSessionBinding,nativeCliLogs:Ye(e.nativeCliLogs)}}const Fe=Y(Je()),qe=Y(Je()),He=Y([]),Xe=Y([]);function hl(e={}){const a=String(e.key||"").trim();return a?{key:a,label:String(e.label||a),description:"string"==typeof e.description?e.description:"",implementation:"string"==typeof e.implementation?e.implementation:"",externalMessage:"string"==typeof e.externalMessage?e.externalMessage:"",hints:Array.isArray(e.hints)?e.hints.filter(e=>"string"==typeof e):[]}:null}function bl(e={}){return{enabled:!0===e.enabled,type:"dialog"===e.type||"browser"===e.type?e.type:"notification",external:!0===e.external}}function wl(e,a=Xe.value){return a.find(a=>a.type===e)||null}function xl(e){return wl(e)?.label||e||"远程通知"}function kl(e){const a=xl(e).trim();return Array.from(a)[0]||"通"}function _l(e={},a=He.value,t=Xe.value){const l={enabled:e?.stopHook?.enabled,type:e?.stopHook?.type},s=e.platforms&&"object"==typeof e.platforms&&!Array.isArray(e.platforms)?e.platforms:{};return{platforms:Object.fromEntries(a.map(e=>[e.key,bl(s[e.key]||("claude"===e.key?l:{}))])),remoteNotifications:{providers:Array.isArray(e?.remoteNotifications?.providers)?e.remoteNotifications.providers.map(e=>function(e={},a=Xe.value){const t=String(e.type||"").trim(),l=wl(t,a)||a[0],s=l?.type||t;if(!s)return null;const n=l?.defaults&&"object"==typeof l.defaults?l.defaults:{};return{id:e.id||`${s}-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,type:s,name:e.name||l?.label||s,enabled:!0===e.enabled,config:{...n,...e.config&&"object"==typeof e.config?e.config:{}}}}(e,t)).filter(Boolean):[]}}}const zl=Y(_l()),Cl=Y(_l()),Pl=Y(!1),Sl=Y(""),Ol=Y(""),Ul=A(()=>Xe.value.map(e=>({label:e.label||e.type,value:e.type}))),jl=Y(""),Il=Y("default"),Nl=A(()=>"undefined"!=typeof window&&"undefined"!=typeof Notification&&(!!window.isSecureContext||["localhost","127.0.0.1","::1"].includes(window.location.hostname))),Al=A(()=>Nl.value?"granted"===Il.value?"已授权":"denied"===Il.value?"已被浏览器拒绝,请在浏览器站点设置里重新开启":"尚未授权,保存时会请求浏览器权限":"当前环境不支持浏览器通知,请使用 localhost 或 HTTPS 页面");function Ll(e="notification"){if("browser"===e)return"浏览器通知";if("dialog"===e)return"确认式弹窗";switch(jl.value){case"win32":return"右上角悬浮卡片";case"darwin":return"角落横幅通知";case"linux":return"桌面环境通知";default:return"轻提醒卡片"}}function $l(e="notification"){return"browser"===e?Nl.value?"granted"===Il.value?"通过当前打开的 Web 页面显示浏览器原生通知":"denied"===Il.value?"浏览器通知权限已被拒绝,需要先在浏览器中重新授权":"通过当前打开的 Web 页面显示原生通知,保存时会请求权限":"当前页面环境不支持浏览器通知":"dialog"===e?"强制提醒,需要手动点击确认才能关闭":"win32"===jl.value?"轻量提醒,几秒后自动消失,带提示音(Windows 使用系统 Toast 风格提醒)":"轻量提醒,几秒后自动消失,带提示音"}function Bl(){"undefined"!=typeof Notification?Il.value=Notification.permission:Il.value="unsupported"}function Tl(){const e=function(e=Xe.value[0]?.type){const a=wl(e);return a?{id:`${e}-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,type:e,name:xl(e),enabled:!1,config:{...a.defaults&&"object"==typeof a.defaults?a.defaults:{}}}:null}(Ol.value);e&&zl.value.remoteNotifications.providers.push(e)}const Ml=Y({hasPassword:!1}),El=Y(!1),Dl=Y(!1),Rl=Y({currentPassword:"",newPassword:"",confirmPassword:""}),Wl=Y(!1),Yl=A(()=>{const e=Rl.value.currentPassword.trim(),a=Rl.value.newPassword,t=Rl.value.confirmPassword;return Ml.value.hasPassword&&!e?"请输入当前密码":a?a.length<4?"新密码至少需要 4 位":t&&a!==t?"两次输入的新密码不一致":"":""}),Jl=A(()=>{const e=Rl.value;return(!Ml.value.hasPassword||Boolean(e.currentPassword.trim()))&&e.newPassword.length>=4&&e.newPassword===e.confirmPassword});let Fl=null;const ql=Y({name:"Models.dev",url:"",lastUpdated:""}),Vl=Y(!1),Hl=Y(!1),Xl=Y({}),Kl=Y({}),Zl=Y({}),Gl=Y(""),Ql=Y("all"),es=Y(!1),as=Y({modelId:"",context:128e3,output:8192,inputPrice:0,outputPrice:0,cacheCreationPrice:0,cacheReadPrice:0}),ts=Y(new Set),ls=Y({}),ss=Y({}),ns=A(()=>Object.keys(ls.value).map(e=>{const a="function"==typeof s.get?s.get(e):null;return{key:e,label:a?.label||a?.title||e}})),is=Y(new Set),os=A(()=>Object.keys(Zl.value).length>0),rs=A(()=>os.value||JSON.stringify(ls.value)!==JSON.stringify(ss.value)),us=A(()=>{const e=String(as.value.modelId||"").trim();if(!e)return"请输入模型 ID";const a=Object.keys(Xl.value).find(a=>a.toLowerCase()===e.toLowerCase());return a?`模型已存在:${a}`:!Number.isFinite(as.value.context)||as.value.context<=0?"Context 窗口必须为正数":!Number.isFinite(as.value.output)||as.value.output<=0?"Max Output 必须为正数":as.value.inputPrice<0||as.value.outputPrice<0||as.value.cacheCreationPrice<0||as.value.cacheReadPrice<0?"价格不能为负数":""});function ds(){as.value={modelId:"",context:128e3,output:8192,inputPrice:0,outputPrice:0,cacheCreationPrice:0,cacheReadPrice:0},es.value=!0}function cs(){es.value=!1}function ps(){if(us.value)return;const e=String(as.value.modelId||"").trim(),a={limit:{context:as.value.context,output:as.value.output},pricing:{input:as.value.inputPrice,output:as.value.outputPrice,cacheCreation:as.value.cacheCreationPrice,cacheRead:as.value.cacheReadPrice}};Xl.value[e]=a,Zl.value[e]={limit:{...a.limit},pricing:{...a.pricing}},Gl.value=e,es.value=!1,Oe.success("模型已新增,请点击“保存设置”使其生效")}function vs(e){return ts.value.has(e)}function fs(e){return!vs(e)}const ms={claude:"claude",openai:"codex",gemini:"gemini"},ys=A(()=>{const e=Object.keys(Xl.value),a=Gl.value.trim().toLowerCase(),t=Ql.value,l=ms[t];return e.filter(e=>{if(a&&!e.toLowerCase().includes(a))return!1;const s=Xl.value[e];return"compatible"===t?!!Array.isArray(s?.toolTypes)&&(s.toolTypes.includes("opencode")||s.toolTypes.includes("omp")):l?Array.isArray(s?.toolTypes)?s.toolTypes.includes(l):gs(e,s)===l:"overrides"!==t||!!Kl.value[e]})});function gs(e,a=Xl.value[e]){const t=String(e||"").trim().toLowerCase(),l=hs(a);return l.length>0?l[0]:t.startsWith("claude-")?"claude":t.startsWith("gemini-")?"gemini":t.startsWith("gpt-")||t.startsWith("o1")||t.startsWith("o3")||t.startsWith("o4")?"codex":""}function hs(e={}){return Array.isArray(e?.toolTypes)?[...new Set(e.toolTypes.filter(e=>"string"==typeof e).map(e=>e.trim()).filter(Boolean))]:[]}const bs=A(()=>{const e=Object.fromEntries(ns.value.map(e=>[e.key,[]]));for(const[a,t]of Object.entries(Xl.value||{})){if(!t||"object"!=typeof t||!t.limit||!t.pricing)continue;const l=hs(t),s=l.length>0?"":gs(a,t);for(const t of l.length>0?l:[s])t&&e[t]&&e[t].push({label:a,value:a})}for(const a of Object.keys(e))e[a].sort((e,a)=>e.label.localeCompare(a.label));for(const a of ns.value){const t=String(ls.value[a.key]||"").trim();t&&e[a.key]&&(e[a.key].some(e=>e.value===t)||e[a.key].push({label:`${t}(自定义)`,value:t}))}return e});function ws(e,a,t){return void 0!==Zl.value[e]?.[a]?.[t]?Zl.value[e][a][t]:Xl.value[e]?.[a]?.[t]??null}function xs(e,a,t,l){if(!Zl.value[e]){const a=Xl.value[e]||{};Zl.value[e]={limit:{...a.limit||{}},pricing:{...a.pricing||{}}}}Zl.value[e][a]||(Zl.value[e][a]={}),Zl.value[e][a][t]=l}async function ks(){Vl.value=!0;try{const e=await async function(){return(await H.get("/settings/model-settings")).data}(),a=e.metadataSource||{};ql.value={name:a.name||"Models.dev",url:a.url||"",lastUpdated:a.lastUpdated||""},Xl.value=e.models&&"object"==typeof e.models&&!Array.isArray(e.models)?e.models:{};const t=e.overrides??e.modelMetadataOverrides;Kl.value={...t&&"object"==typeof t&&!Array.isArray(t)?t:{}};const l=Array.isArray(e.builtinModelIds)?e.builtinModelIds:Object.keys(Xl.value);ts.value=new Set(l.filter(e=>"string"==typeof e&&e.trim())),ls.value=Object.fromEntries(Object.entries(e.defaultSpeedTestModels||{}).filter(([,e])=>"string"==typeof e&&e.trim())),function(){const e={...ls.value};let a=!1;for(const t of ns.value){const l=bs.value[t.key]||[];0!==l.length&&(new Set(l.map(e=>e.value)).has(e[t.key])||(e[t.key]=l[0].value,a=!0))}a&&(ls.value=e)}(),ss.value={...ls.value},Zl.value={}}catch(e){}finally{Vl.value=!1}}async function _s(){Hl.value=!0;try{const e={...Kl.value};for(const[a,t]of Object.entries(Zl.value)){const l=e[a]||{};e[a]={limit:{...l.limit||{},...t.limit||{}},pricing:{...l.pricing||{},...t.pricing||{}}}}await i({overrides:e,defaultSpeedTestModels:ls.value}),Kl.value=e,ss.value={...ls.value},Zl.value={},await ks(),Oe.success("模型设置已保存")}catch(e){Oe.error("保存失败:"+e.message)}finally{Hl.value=!1}}async function zs(){try{await i({overrides:{},defaultSpeedTestModels:ls.value}),Kl.value={},Zl.value={},await ks(),Oe.success("全部模型设置已重置为内置默认值")}catch(e){Oe.error("重置失败:"+e.message)}}const Cs=A(()=>{const e=Object.keys(b.value).some(e=>b.value[e]!==w.value[e]),a=Fe.value.nativeCliLogs.enabled!==qe.value.nativeCliLogs.enabled||Fe.value.nativeCliLogs.intervalSeconds!==qe.value.nativeCliLogs.intervalSeconds;return e||Fe.value.maxLogs!==qe.value.maxLogs||Fe.value.statsInterval!==qe.value.statsInterval||Fe.value.enableSessionBinding!==qe.value.enableSessionBinding||a}),Ps=A(()=>[{key:"appearance",label:"外观设置",icon:W(pe)},{key:"notification",label:"通知设置",icon:W(le)},{key:"advanced",label:"高级设置",icon:W(te)},{key:"security",label:"安全设置",icon:W(ue)},{key:"model-settings",label:"模型设置",icon:W(ie)}]),Ss=A(()=>{const e=Array.isArray(s.all)?s.all:[],a=new Map(e.map(e=>[e.key,e])),t=L.value.map(e=>a.get(e)).filter(Boolean),l=new Set(t.map(e=>e.key)),n=e.filter(e=>!l.has(e.key));return[...t,...n]});function Os(e){return String(e||"").trim().toLowerCase()}function Us(e=He.value){const a=new Set((Array.isArray(s.all)?s.all:[]).map(e=>Os(e.key)).filter(Boolean)),t=new Set(L.value.map(Os).filter(Boolean));return e.filter(e=>{const l=Os(e.key);return!a.has(l)||t.has(l)})}const js=A(()=>Us());const Is=A(()=>JSON.stringify(L.value)!==JSON.stringify(E.value));function Ns(e){return L.value.indexOf(e)}function As(e,a){const t=Ns(e),l=t+a;if(t<0||l<0||l>=L.value.length)return;const s=[...L.value],[n]=s.splice(t,1);s.splice(l,0,n),L.value=s}function Ls(){L.value=[...G]}async function $s(){try{const e=await K();if(e.success&&e.config){y.value=!1!==e.config.panelVisibility?.showChannels,g.value=!1!==e.config.panelVisibility?.showLogs,h.value=!0===e.config.channelBalance?.showRemaining;const a=Array.isArray(e.config.enabledCliPlatforms)?e.config.enabledCliPlatforms:G;L.value=[...a],E.value=[...a]}}catch(e){}}async function Bs(){F.value=!0;try{const e=await Z({enabledCliPlatforms:[...L.value]});if(!e.success)throw new Error(e.message||"保存失败");const a=Array.isArray(e.config?.enabledCliPlatforms)?[...e.config.enabledCliPlatforms]:[...L.value];L.value=[...a],E.value=[...a],n.value={...n.value,enabledCliPlatforms:[...a]},window.dispatchEvent(new CustomEvent("enabled-cli-platforms-change",{detail:{enabledCliPlatforms:[...a]}})),Oe.success("首页 CLI 显示已保存")}catch(e){Oe.error("保存失败: "+e.message)}finally{F.value=!1}}async function Ts(){try{await ee("panelVisibility","showChannels",y.value),await ee("panelVisibility","showLogs",g.value),await ee("channelBalance","showRemaining",h.value)}catch(e){}}function Ms(e){y.value=e,Ts(),window.dispatchEvent(new CustomEvent("panel-visibility-change",{detail:{showChannels:e,showLogs:g.value}}))}function Es(e){g.value=e,Ts(),window.dispatchEvent(new CustomEvent("panel-visibility-change",{detail:{showChannels:y.value,showLogs:e}}))}function Ds(e){h.value=e,Ts(),window.dispatchEvent(new CustomEvent("channel-balance-visibility-change",{detail:{showRemaining:e}}))}async function Rs(e){try{(await fetch("/api/config/advanced",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({ports:b.value,maxLogs:Fe.value.maxLogs,statsInterval:Fe.value.statsInterval,enableSessionBinding:e,nativeCliLogs:Fe.value.nativeCliLogs})})).ok?(qe.value=Je(Fe.value),Oe.success(e?"会话绑定已开启":"会话绑定已关闭")):(Fe.value.enableSessionBinding=!e,Oe.error("保存失���"))}catch(a){Fe.value.enableSessionBinding=!e,Oe.error("保存失败: "+a.message)}}function Ws(e={}){const a=function(e={}){const a=Array.isArray(e.platformDefinitions)?e.platformDefinitions.map(hl).filter(Boolean):[];if(a.length>0)return a;const t=e.platforms&&"object"==typeof e.platforms&&!Array.isArray(e.platforms)?e.platforms:{},l=Object.keys(t);return 0===l.length&&e.stopHook&&"object"==typeof e.stopHook&&l.push("claude"),l.map(e=>hl({key:e,label:e})).filter(Boolean)}(e),t=function(e={}){const a=Array.isArray(e.remoteProviderTypes)?e.remoteProviderTypes.map(e=>({...e,type:String(e?.type||"").trim()})).filter(e=>e.type):[],t=new Set(a.map(e=>e.type)),l=Array.isArray(e.remoteNotifications?.providers)?e.remoteNotifications.providers:[];for(const s of l){const e=String(s?.type||"").trim();e&&!t.has(e)&&(a.push({type:e,label:e,description:"",hint:"",defaults:{},fields:[]}),t.add(e))}return a}(e);return He.value=a,Xe.value=t,t.some(e=>e.type===Ol.value)||(Ol.value=t[0]?.type||""),{definitions:a,providerDefinitions:t}}async function Ys(){try{const e=await fetch("/api/hooks");if(e.ok){const a=await e.json(),{definitions:t,providerDefinitions:l}=Ws(a),s=_l(a,Us(t),l);zl.value=s,Cl.value=JSON.parse(JSON.stringify(s)),jl.value=a.platform||"",Bl()}}catch(e){}}async function Js(){Pl.value=!0;try{const e=new Set(js.value.map(e=>e.key));Object.entries(zl.value.platforms||{}).filter(([a])=>e.has(a)).some(([,e])=>!0===e?.enabled&&"browser"===e.type)&&await async function(){if(!Nl.value)throw new Error("当前页面环境不支持浏览器通知,请改用 HTTPS 或 localhost 页面");if(Bl(),"granted"===Il.value)return;const e=await Notification.requestPermission();if(Il.value=e,"granted"!==e)throw new Error("浏览器通知权限未授予")}();const a=await fetch("/api/hooks",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({platforms:Object.fromEntries(Object.entries(zl.value.platforms||{}).filter(([a])=>e.has(a)).map(([e,a])=>[e,{enabled:a.enabled,type:a.type}])),remoteNotifications:{providers:zl.value.remoteNotifications.providers}})});if(a.ok){const e=await a.json(),{definitions:t,providerDefinitions:l}=Ws(e),s=_l(e,Us(t),l);zl.value=s,Cl.value=JSON.parse(JSON.stringify(s)),jl.value=e.platform||jl.value,Oe.success("通知设置已保存")}else{const e=await a.json();Oe.error("保存失败:"+(e.error||"未知错误"))}}catch(e){Oe.error("保存失败:"+e.message)}finally{Pl.value=!1}}function Fs(){Rl.value={currentPassword:"",newPassword:"",confirmPassword:""}}async function qs(e=!1){return Dl.value&&Fl?Fl:El.value&&!e?Promise.resolve():(Dl.value=!0,Fl=(async()=>{try{const e=await _e();e.success&&(Ml.value={hasPassword:Boolean(e.hasPassword)},El.value=!0)}catch(e){}finally{Dl.value=!1,Fl=null}})(),Fl)}async function Vs(){if(!Jl.value)return void Oe.warning("请完善密码信息");const e=Ml.value.hasPassword;Wl.value=!0;try{const a={newPassword:Rl.value.newPassword};Ml.value.hasPassword&&(a.currentPassword=Rl.value.currentPassword);const t=await $e(a);t.success?(Ml.value.hasPassword=!0,El.value=!0,Fs(),Oe.success(e?"密码已更新":"密码已设置")):Oe.error(t.error||"保存失败")}catch(a){Oe.error(a.response?.data?.error||"保存失败")}finally{Wl.value=!1}}async function Hs(){C.value=!0;try{const e=await fetch("/api/config/advanced",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({ports:b.value,maxLogs:Fe.value.maxLogs,statsInterval:Fe.value.statsInterval,enableSessionBinding:Fe.value.enableSessionBinding,nativeCliLogs:Fe.value.nativeCliLogs})});if(e.ok)w.value={...b.value},qe.value=Je(Fe.value),window.dispatchEvent(new CustomEvent("advanced-config-change",{detail:{maxLogs:Fe.value.maxLogs,statsInterval:Fe.value.statsInterval}})),Oe.success("配置已保存,端口修改需要重启服务器生效;OMP 原生会话日志配置立即生效");else{const a=await e.json();Oe.error("保存失败:"+(a.error||"未知错误"))}}catch(e){Oe.error("保存失败:"+e.message)}finally{C.value=!1}}async function Xs(){try{const e=await async function(){return(await H.get("/pm2-autostart")).data}();e&&e.success?ge.value=e.data?.enabled||!1:ge.value=!1}catch(e){ge.value=!1}}async function Ks(){ze.value=!0;try{const e=await async function(){return(await H.post("/pm2-autostart",{action:"enable"})).data}();if(e.success)ge.value=!0,Oe.success("开机自启已启用");else{const a=e.message||"未知错误";a.includes("暂无运行中的进程")||a.includes("请先启动")?Oe.warning(a):Oe.error(a)}}catch(e){Oe.error(e.message||"启用失败:未知错误")}finally{ze.value=!1}}async function Zs(){ze.value=!0;try{const e=await async function(){return(await H.post("/pm2-autostart",{action:"disable"})).data}();if(e.success)ge.value=!1,Oe.success("开机自启已禁用");else{const a=e.message||"未知错误";a.includes("未启用")||a.includes("不存在")?Oe.warning(a):Oe.error(a)}}catch(e){Oe.error(e.message||"禁用失败:未知错误")}finally{ze.value=!1}}return O(()=>{"function"==typeof s.load&&s.load(),$s(),qs(),ks(),r.visible&&Ys()}),I(d,e=>{e?($s(),async function(){try{"function"==typeof s.load&&await s.load();const e=await fetch("/api/config/advanced");if(e.ok){const a=await e.json(),t={};for(const e of _.value)t[e.key]=a.ports?.[e.key]||e.defaultPort;b.value=t,w.value={...b.value},Fe.value=Je({maxLogs:a.maxLogs||100,statsInterval:a.statsInterval||30,enableSessionBinding:!1!==a.enableSessionBinding,nativeCliLogs:a.nativeCliLogs}),qe.value=Je(Fe.value)}}catch(e){}}(),Xs(),Ys(),ks(),qs(!0)):Fs()}),I(p,(e,a)=>{"security"===e&&qs(),"security"===a&&"security"!==e&&Fs()}),(e,a)=>(U(),S(R(we),{show:d.value,"onUpdate:show":a[25]||(a[25]=e=>d.value=e),width:R(t),placement:"right","show-mask":!0},{default:$(()=>[P(R(ke),{"show-header":!1,closable:"","native-scrollbar":!1},{default:$(()=>[V("div",Ze,[V("div",Ge,[V("div",Qe,[P(R(c),{size:"20",color:"var(--text-secondary)"},{default:$(()=>[P(R(re))]),_:1}),a[26]||(a[26]=V("span",{class:"sidebar-title"},"设置分类",-1))]),V("div",ea,[(U(!0),q(T,null,z(Ps.value,e=>(U(),q("div",{key:e.key,class:M(["menu-item",{active:p.value===e.key}]),onClick:a=>p.value=e.key},[P(R(c),{size:18,class:"menu-icon"},{default:$(()=>[(U(),S(j(e.icon)))]),_:2},1024),V("span",ta,N(e.label),1),e.badge?(U(),S(R(Ve),{key:0,value:e.badge,type:e.badgeType||"info","show-zero":!1},null,8,["value","type"])):x("",!0)],10,aa))),128))])]),V("div",la,[J(V("div",sa,[V("div",na,[V("div",ia,[P(R(c),{size:"24",color:"var(--text-secondary)"},{default:$(()=>[P(R(pe))]),_:1}),V("div",null,[a[28]||(a[28]=V("h3",{class:"panel-title"},"外观设置",-1)),P(R(Ue),{depth:"3",class:"panel-subtitle"},{default:$(()=>[...a[27]||(a[27]=[k("自定义界面外观和主题",-1)])]),_:1})])])]),V("div",oa,[V("div",ra,[V("div",ua,[V("div",da,[P(R(Ue),{strong:""},{default:$(()=>[...a[29]||(a[29]=[k("面板显示",-1)])]),_:1}),P(R(Ue),{depth:"3",style:{"font-size":"13px","margin-top":"4px"}},{default:$(()=>[...a[30]||(a[30]=[k(" 控制右侧面板中各个区域的显示 ",-1)])]),_:1})]),V("div",ca,[V("div",pa,[V("div",va,[P(R(Ue),{strong:""},{default:$(()=>[...a[31]||(a[31]=[k("显示渠道列表",-1)])]),_:1}),P(R(Ue),{depth:"3",style:{"font-size":"13px"}},{default:$(()=>[...a[32]||(a[32]=[k(" 在右侧面板显示 API 渠道管理区域 ",-1)])]),_:1})]),P(R(Ce),{value:y.value,"onUpdate:value":Ms},null,8,["value"])]),V("div",fa,[V("div",ma,[P(R(Ue),{strong:""},{default:$(()=>[...a[33]||(a[33]=[k("显示实时日志",-1)])]),_:1}),P(R(Ue),{depth:"3",style:{"font-size":"13px"}},{default:$(()=>[...a[34]||(a[34]=[k(" 在 Dashboard 显示实时日志区域 ",-1)])]),_:1})]),P(R(Ce),{value:g.value,"onUpdate:value":Es},null,8,["value"])]),V("div",ya,[V("div",ga,[P(R(Ue),{strong:""},{default:$(()=>[...a[35]||(a[35]=[k("显示剩余金额",-1)])]),_:1}),P(R(Ue),{depth:"3",style:{"font-size":"13px"}},{default:$(()=>[...a[36]||(a[36]=[k(" 在渠道卡片显示可识别 API 网关的余额 ",-1)])]),_:1})]),P(R(Ce),{value:h.value,"onUpdate:value":Ds},null,8,["value"])])])]),P(R(be)),V("div",ha,[V("div",ba,[P(R(Ue),{strong:""},{default:$(()=>[...a[37]||(a[37]=[k("首页 CLI 显示",-1)])]),_:1}),P(R(Ue),{depth:"3",style:{"font-size":"13px","margin-top":"4px"}},{default:$(()=>[...a[38]||(a[38]=[k(" 从已注册的平台目录中选择并排序首页显示的 CLI ",-1)])]),_:1})]),V("div",wa,[V("div",xa,[(U(!0),q(T,null,z(Ss.value,e=>(U(),q("div",{key:e.key,class:"platform-catalog-item"},[P(R(Ee),{checked:L.value.includes(e.key),"onUpdate:checked":a=>function(e,a){const t=L.value.filter(a=>a!==e);a&&t.push(e),L.value=t}(e.key,a)},{default:$(()=>[k(N(e.label||e.title||e.key),1)]),_:2},1032,["checked","onUpdate:checked"]),L.value.includes(e.key)?(U(),q("div",ka,[P(R(f),{text:"",size:"small",disabled:0===Ns(e.key),"aria-label":"上移",onClick:a=>As(e.key,-1)},{icon:$(()=>[P(R(c),null,{default:$(()=>[P(R(oe))]),_:1})]),_:1},8,["disabled","onClick"]),P(R(f),{text:"",size:"small",disabled:Ns(e.key)===L.value.length-1,"aria-label":"下移",onClick:a=>As(e.key,1)},{icon:$(()=>[P(R(c),null,{default:$(()=>[P(R(ye))]),_:1})]),_:1},8,["disabled","onClick"])])):x("",!0)]))),128))]),V("div",_a,[P(R(f),{size:"small",onClick:Ls},{default:$(()=>[...a[39]||(a[39]=[k("恢复默认显示",-1)])]),_:1}),P(R(f),{type:"primary",size:"small",loading:F.value,disabled:!Is.value,onClick:Bs},{default:$(()=>[...a[40]||(a[40]=[k(" 保存首页显示 ",-1)])]),_:1},8,["loading","disabled"])])])]),P(R(be)),V("div",za,[V("div",Ca,[P(R(Ue),{strong:""},{default:$(()=>[...a[41]||(a[41]=[k("界面主题",-1)])]),_:1}),P(R(Ue),{depth:"3",style:{"font-size":"13px","margin-top":"4px"}},{default:$(()=>[...a[42]||(a[42]=[k(" 选择你喜欢的界面主题风格 ",-1)])]),_:1})]),V("div",Pa,[V("div",{class:M(["simple-theme-item",{active:!R(v)}]),onClick:a[0]||(a[0]=e=>R(v)&&R(m)())},[P(R(c),{size:20,class:"theme-icon"},{default:$(()=>[P(R(ce))]),_:1}),V("div",Sa,[P(R(Ue),{strong:""},{default:$(()=>[...a[43]||(a[43]=[k("亮色模式",-1)])]),_:1}),P(R(Ue),{depth:"3",style:{"font-size":"12px"}},{default:$(()=>[...a[44]||(a[44]=[k("经典的浅色主题",-1)])]),_:1})]),R(v)?x("",!0):(U(),q("div",Oa,[P(R(c),{size:20,color:"#18a058"},{default:$(()=>[P(R(ne))]),_:1})]))],2),V("div",{class:M(["simple-theme-item",{active:R(v)}]),onClick:a[1]||(a[1]=e=>!R(v)&&R(m)())},[P(R(c),{size:20,class:"theme-icon"},{default:$(()=>[P(R(ae))]),_:1}),V("div",Ua,[P(R(Ue),{strong:""},{default:$(()=>[...a[45]||(a[45]=[k("暗色模式",-1)])]),_:1}),P(R(Ue),{depth:"3",style:{"font-size":"12px"}},{default:$(()=>[...a[46]||(a[46]=[k("护眼的深色主题",-1)])]),_:1})]),R(v)?(U(),q("div",ja,[P(R(c),{size:20,color:"#18a058"},{default:$(()=>[P(R(ne))]),_:1})])):x("",!0)],2)])])])])],512),[[B,"appearance"===p.value]]),J(V("div",Ia,[V("div",Na,[V("div",Aa,[P(R(c),{size:"24",color:"var(--text-secondary)"},{default:$(()=>[P(R(le))]),_:1}),V("div",null,[a[48]||(a[48]=V("h3",{class:"panel-title"},"通知设置",-1)),P(R(Ue),{depth:"3",class:"panel-subtitle"},{default:$(()=>[...a[47]||(a[47]=[k("配置任务完成时的系统通知",-1)])]),_:1})])])]),V("div",La,[V("div",$a,[(U(!0),q(T,null,z(js.value,(e,t)=>(U(),q(T,{key:e.key},[V("div",Ba,[V("div",Ta,[P(R(Ue),{strong:""},{default:$(()=>[k(N(e.label),1)]),_:2},1024),P(R(Ue),{depth:"3",style:{"font-size":"13px","margin-top":"4px"}},{default:$(()=>[k(N(e.description),1)]),_:2},1024)]),V("div",Ma,[V("div",Ea,[V("div",Da,[P(R(Ue),{strong:""},{default:$(()=>[...a[49]||(a[49]=[k("启用任务完成通知",-1)])]),_:1}),P(R(Ue),{depth:"3",style:{"font-size":"13px"}},{default:$(()=>[k(N(e.implementation),1)]),_:2},1024)]),P(R(Ce),{value:zl.value.platforms[e.key].enabled,"onUpdate:value":a=>zl.value.platforms[e.key].enabled=a},null,8,["value","onUpdate:value"])]),zl.value.platforms[e.key].external?(U(),S(R(Ae),{key:0,type:"warning",bordered:!1,style:{"margin-top":"16px"}},{default:$(()=>[k(N(e.externalMessage),1)]),_:2},1024)):x("",!0),zl.value.platforms[e.key].enabled?(U(),q("div",Ra,[P(R(Ue),{depth:"2",style:{"font-size":"13px","margin-bottom":"12px",display:"block"}},{default:$(()=>[...a[50]||(a[50]=[k(" 选择通知方式 ",-1)])]),_:1}),P(R(Ne),{value:zl.value.platforms[e.key].type,"onUpdate:value":a=>zl.value.platforms[e.key].type=a},{default:$(()=>[P(R(Se),{vertical:""},{default:$(()=>[P(R(De),{value:"notification"},{default:$(()=>[V("div",Wa,[P(R(Ue),{strong:""},{default:$(()=>[k(N(Ll("notification")),1)]),_:1}),P(R(Ue),{depth:"3",style:{"font-size":"12px",display:"block"}},{default:$(()=>[k(N($l("notification")),1)]),_:1})])]),_:1}),P(R(De),{value:"browser",disabled:!Nl.value},{default:$(()=>[V("div",Ya,[P(R(Ue),{strong:""},{default:$(()=>[k(N(Ll("browser")),1)]),_:1}),P(R(Ue),{depth:"3",style:{"font-size":"12px",display:"block"}},{default:$(()=>[k(N($l("browser")),1)]),_:1})])]),_:1},8,["disabled"]),P(R(De),{value:"dialog"},{default:$(()=>[V("div",Ja,[P(R(Ue),{strong:""},{default:$(()=>[k(N(Ll("dialog")),1)]),_:1}),P(R(Ue),{depth:"3",style:{"font-size":"12px",display:"block"}},{default:$(()=>[k(N($l("dialog")),1)]),_:1})])]),_:1})]),_:1})]),_:1},8,["value","onUpdate:value"]),"claude"===e.key&&"darwin"===jl.value?(U(),S(R(Ae),{key:0,type:"info",bordered:!1,style:{"margin-top":"16px"},"show-icon":!1},{default:$(()=>[V("div",Fa,[P(R(Ue),{strong:""},{default:$(()=>[...a[51]||(a[51]=[k("[TIP] 更好的通知体验",-1)])]),_:1}),P(R(Ue),{depth:"3",style:{display:"block","margin-top":"4px","font-size":"12px"}},{default:$(()=>[...a[52]||(a[52]=[k(" 安装 terminal-notifier 后,点击通知可自动打开终端 ",-1)])]),_:1}),P(R(Ue),{code:"",style:{display:"block","margin-top":"8px","font-size":"12px"}},{default:$(()=>[...a[53]||(a[53]=[k(" brew install terminal-notifier ",-1)])]),_:1})])]),_:1})):x("",!0),"browser"===zl.value.platforms[e.key].type?(U(),S(R(Ae),{key:1,type:"info",bordered:!1,style:{"margin-top":"16px"}},{default:$(()=>[k(" 当前权限状态:"+N(Al.value),1)]),_:1})):x("",!0)])):x("",!0)])]),t<js.value.length-1?(U(),S(R(be),{key:0})):x("",!0)],64))),128)),P(R(be)),V("div",qa,[V("div",Va,[P(R(Ue),{strong:""},{default:$(()=>[...a[54]||(a[54]=[k("远程通知渠道",-1)])]),_:1}),P(R(Ue),{depth:"3",style:{"font-size":"13px","margin-top":"4px"}},{default:$(()=>[...a[55]||(a[55]=[k(" 支持服务端注册的远程通知渠道 ",-1)])]),_:1})]),V("div",Ha,[V("div",Xa,[P(R(Me),{value:Ol.value,"onUpdate:value":a[2]||(a[2]=e=>Ol.value=e),options:Ul.value,size:"small",style:{"max-width":"220px"}},null,8,["value","options"]),P(R(f),{size:"small",secondary:"",type:"primary",onClick:Tl},{icon:$(()=>[P(R(c),null,{default:$(()=>[P(R(se))]),_:1})]),default:$(()=>[a[56]||(a[56]=k(" 添加渠道 ",-1))]),_:1})]),0===zl.value.remoteNotifications.providers.length?(U(),S(R(Le),{key:0,description:"还没有远程通知渠道",style:{padding:"20px 0"}})):x("",!0),(U(!0),q(T,null,z(zl.value.remoteNotifications.providers,e=>(U(),q("div",{key:e.id,class:"remote-provider-card"},[V("div",Ka,[V("div",Za,[V("div",Ga,N(kl(e.type)),1),V("div",Qa,[V("div",et,[P(R(Ue),{strong:""},{default:$(()=>[k(N(e.name||xl(e.type)),1)]),_:2},1024),P(R(Te),{size:"tiny",bordered:!1,type:e.enabled?"success":"default"},{default:$(()=>[k(N(e.enabled?"已启用":"未启用"),1)]),_:2},1032,["type"])]),P(R(Ue),{depth:"3",style:{"font-size":"12px",display:"block"}},{default:$(()=>{return[k(N((a=e.type,wl(a)?.description||"")),1)];var a}),_:2},1024)])]),P(R(Se),{size:"small",align:"center"},{default:$(()=>[P(R(Ce),{value:e.enabled,"onUpdate:value":a=>e.enabled=a,size:"small"},null,8,["value","onUpdate:value"]),P(R(f),{size:"small",quaternary:"",circle:"",type:"error",onClick:a=>{return t=e.id,void(zl.value.remoteNotifications.providers=zl.value.remoteNotifications.providers.filter(e=>e.id!==t));var t}},{icon:$(()=>[P(R(c),null,{default:$(()=>[P(R(de))]),_:1})]),_:1},8,["onClick"])]),_:2},1024)]),V("div",at,[V("div",tt,[a[57]||(a[57]=V("span",{class:"remote-field-label"},"渠道名称",-1)),P(R(Ie),{value:e.name,"onUpdate:value":a=>e.name=a,size:"small",placeholder:"例如:我的飞书"},null,8,["value","onUpdate:value"])]),V("div",lt,[P(Ke,{provider:e,definition:wl(e.type)},null,8,["provider","definition"])])]),V("div",st,[P(R(f),{size:"small",secondary:"",loading:Sl.value===e.id,onClick:a=>async function(e){Sl.value=e.id;try{const a=await fetch("/api/hooks/test",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider:e})}),t=await a.json().catch(()=>({}));if(!a.ok)throw new Error(t.error||"测试通知发送失败");Oe.success(t.message||"测试通知已发送")}catch(a){Oe.error("测试失败:"+a.message)}finally{Sl.value=""}}(e)},{default:$(()=>[...a[58]||(a[58]=[k(" 测试 ",-1)])]),_:1},8,["loading","onClick"]),P(R(Ue),{depth:"3",style:{"font-size":"12px"}},{default:$(()=>{return[k(N((a=e.type,wl(a)?.hint||"")),1)];var a}),_:2},1024)])]))),128))])])])]),V("div",nt,[P(R(Se),{justify:"end"},{default:$(()=>[P(R(f),{size:"large",onClick:a[3]||(a[3]=e=>d.value=!1)},{default:$(()=>[...a[59]||(a[59]=[k(" 取消 ",-1)])]),_:1}),P(R(f),{type:"primary",size:"large",loading:Pl.value,disabled:JSON.stringify(zl.value)===JSON.stringify(Cl.value),onClick:Js},{icon:$(()=>[P(R(c),null,{default:$(()=>[P(R(fe))]),_:1})]),default:$(()=>[a[60]||(a[60]=k(" 保存设置 ",-1))]),_:1},8,["loading","disabled"])]),_:1})])],512),[[B,"notification"===p.value]]),J(V("div",it,[V("div",ot,[V("div",rt,[P(R(c),{size:"24",color:"var(--text-secondary)"},{default:$(()=>[P(R(te))]),_:1}),V("div",null,[a[62]||(a[62]=V("h3",{class:"panel-title"},"高级设置",-1)),P(R(Ue),{depth:"3",class:"panel-subtitle"},{default:$(()=>[...a[61]||(a[61]=[k("端口配置和高级选项",-1)])]),_:1})])])]),V("div",ut,[V("div",dt,[V("div",ct,[V("div",pt,[P(R(Ue),{strong:""},{default:$(()=>[...a[63]||(a[63]=[k("端口配置",-1)])]),_:1}),P(R(Ue),{depth:"3",style:{"font-size":"13px","margin-top":"4px"}},{default:$(()=>[...a[64]||(a[64]=[k(" 修改后需要重启服务器才能生效 ",-1)])]),_:1})]),V("div",vt,[(U(!0),q(T,null,z(_.value,e=>(U(),q("div",{key:e.key,class:"port-field"},[P(R(Ue),{depth:"3",style:{"font-size":"13px","margin-bottom":"6px"}},{default:$(()=>[k(N(e.label),1)]),_:2},1024),P(R(je),{value:b.value[e.key],"onUpdate:value":a=>b.value[e.key]=a,min:1024,max:65535,"show-button":!1,placeholder:String(e.defaultPort)},{prefix:$(()=>[P(R(c),null,{default:$(()=>[P(R(te))]),_:1})]),_:1},8,["value","onUpdate:value","placeholder"])]))),128))])]),P(R(be)),V("div",ft,[V("div",mt,[P(R(Ue),{strong:""},{default:$(()=>[...a[65]||(a[65]=[k("负载均衡",-1)])]),_:1}),P(R(Ue),{depth:"3",style:{"font-size":"13px","margin-top":"4px"}},{default:$(()=>[...a[66]||(a[66]=[k(" 多渠道负载均衡时的分配策略 ",-1)])]),_:1})]),V("div",yt,[V("div",gt,[V("div",ht,[P(R(Ue),{depth:"2",style:{"font-size":"13px"}},{default:$(()=>[...a[67]||(a[67]=[k("多渠道负载会话绑定",-1)])]),_:1}),P(R(Ue),{depth:"3",style:{"font-size":"12px"}},{default:$(()=>[...a[68]||(a[68]=[k("开启后同一对话始终使用同一渠道,保证上下文连续性",-1)])]),_:1})]),P(R(Ce),{value:Fe.value.enableSessionBinding,"onUpdate:value":[a[4]||(a[4]=e=>Fe.value.enableSessionBinding=e),Rs],size:"medium"},null,8,["value"])])])]),P(R(be)),V("div",bt,[V("div",wt,[P(R(Ue),{strong:""},{default:$(()=>[...a[69]||(a[69]=[k("日志和性能",-1)])]),_:1}),P(R(Ue),{depth:"3",style:{"font-size":"13px","margin-top":"4px"}},{default:$(()=>[...a[70]||(a[70]=[k(" 控制日志显示和数据刷新行为 ",-1)])]),_:1})]),V("div",xt,[V("div",kt,[V("div",_t,[P(R(Ue),{depth:"2",style:{"font-size":"13px"}},{default:$(()=>[...a[71]||(a[71]=[k("实时日志保留数量",-1)])]),_:1}),P(R(Ue),{depth:"3",style:{"font-size":"12px"}},{default:$(()=>[...a[72]||(a[72]=[k("超过此数量将自动清理旧日志",-1)])]),_:1})]),P(R(je),{value:Fe.value.maxLogs,"onUpdate:value":a[5]||(a[5]=e=>Fe.value.maxLogs=e),min:50,max:500,step:10,style:{width:"140px"}},{suffix:$(()=>[P(R(Ue),{depth:"3",style:{"font-size":"12px"}},{default:$(()=>[...a[73]||(a[73]=[k("条",-1)])]),_:1})]),_:1},8,["value"])]),V("div",zt,[V("div",Ct,[P(R(Ue),{depth:"2",style:{"font-size":"13px"}},{default:$(()=>[...a[74]||(a[74]=[k("统计数据刷新间隔",-1)])]),_:1}),P(R(Ue),{depth:"3",style:{"font-size":"12px"}},{default:$(()=>[...a[75]||(a[75]=[k("自动刷新今日统计的时间间隔",-1)])]),_:1})]),P(R(je),{value:Fe.value.statsInterval,"onUpdate:value":a[6]||(a[6]=e=>Fe.value.statsInterval=e),min:10,max:300,step:5,style:{width:"140px"}},{suffix:$(()=>[P(R(Ue),{depth:"3",style:{"font-size":"12px"}},{default:$(()=>[...a[76]||(a[76]=[k("秒",-1)])]),_:1})]),_:1},8,["value"])]),V("div",Pt,[V("div",St,[P(R(Ue),{depth:"2",style:{"font-size":"13px"}},{default:$(()=>[...a[77]||(a[77]=[k("CLI 原生会话日志",-1)])]),_:1}),P(R(Ue),{depth:"3",style:{"font-size":"12px"}},{default:$(()=>[...a[78]||(a[78]=[k("读取各 CLI 工具自己的会话日志,配置保存后立即生效",-1)])]),_:1})]),P(R(Ce),{value:Fe.value.nativeCliLogs.enabled,"onUpdate:value":a[7]||(a[7]=e=>Fe.value.nativeCliLogs.enabled=e),size:"medium"},null,8,["value"])]),V("div",Ot,[V("div",Ut,[P(R(Ue),{depth:"2",style:{"font-size":"13px"}},{default:$(()=>[...a[79]||(a[79]=[k("CLI 原生日志读取间隔",-1)])]),_:1}),P(R(Ue),{depth:"3",style:{"font-size":"12px"}},{default:$(()=>[...a[80]||(a[80]=[k("轮询原生会话日志的时间间隔",-1)])]),_:1})]),P(R(je),{value:Fe.value.nativeCliLogs.intervalSeconds,"onUpdate:value":a[8]||(a[8]=e=>Fe.value.nativeCliLogs.intervalSeconds=e),min:1,max:60,step:1,style:{width:"140px"}},{suffix:$(()=>[P(R(Ue),{depth:"3",style:{"font-size":"12px"}},{default:$(()=>[...a[81]||(a[81]=[k("秒",-1)])]),_:1})]),_:1},8,["value"])])])]),P(R(be)),V("div",jt,[V("div",It,[P(R(Ue),{strong:""},{default:$(()=>[...a[82]||(a[82]=[k("开机自启",-1)])]),_:1}),P(R(Ue),{depth:"3",style:{"font-size":"13px","margin-top":"4px"}},{default:$(()=>[...a[83]||(a[83]=[k(" 启用此选项后,重启电脑时 coding-tool-x 会自动启动 ",-1)])]),_:1})]),V("div",Nt,[V("div",At,[V("div",Lt,[P(R(Ue),{strong:"",style:{flex:"1"}},{default:$(()=>[k(N(Be.value),1)]),_:1}),ge.value?(U(),S(R(f),{key:1,type:"warning",size:"small",loading:ze.value,onClick:Zs},{icon:$(()=>[P(R(c),null,{default:$(()=>[P(R(ve))]),_:1})]),default:$(()=>[a[85]||(a[85]=k(" 禁用自启 ",-1))]),_:1},8,["loading"])):(U(),S(R(f),{key:0,type:"primary",size:"small",loading:ze.value,onClick:Ks},{icon:$(()=>[P(R(c),null,{default:$(()=>[P(R(ne))]),_:1})]),default:$(()=>[a[84]||(a[84]=k(" 启用自启 ",-1))]),_:1},8,["loading"]))]),P(R(Ue),{depth:"3",style:{"font-size":"12px"}},{default:$(()=>[k(N(We.value),1)]),_:1})])])])])]),V("div",$t,[P(R(Se),{justify:"end"},{default:$(()=>[P(R(f),{size:"large",onClick:a[9]||(a[9]=e=>d.value=!1)},{default:$(()=>[...a[86]||(a[86]=[k(" 取消 ",-1)])]),_:1}),P(R(f),{type:"primary",size:"large",loading:C.value,disabled:!Cs.value,onClick:Hs},{icon:$(()=>[P(R(c),null,{default:$(()=>[P(R(fe))]),_:1})]),default:$(()=>[a[87]||(a[87]=k(" 保存端口配置 ",-1))]),_:1},8,["loading","disabled"])]),_:1})])],512),[[B,"advanced"===p.value]]),J(V("div",Bt,[V("div",Tt,[V("div",Mt,[P(R(c),{size:"24",color:"var(--text-secondary)"},{default:$(()=>[P(R(ue))]),_:1}),V("div",null,[a[89]||(a[89]=V("h3",{class:"panel-title"},"安全设置",-1)),P(R(Ue),{depth:"3",class:"panel-subtitle"},{default:$(()=>[...a[88]||(a[88]=[k("设置访问密码,保护面板访问",-1)])]),_:1})])])]),V("div",Et,[V("div",Dt,[V("div",Rt,[V("div",Wt,[P(R(Ue),{strong:""},{default:$(()=>[...a[90]||(a[90]=[k("访问保护",-1)])]),_:1}),P(R(Ue),{depth:"3",style:{"font-size":"13px","margin-top":"4px"}},{default:$(()=>[...a[91]||(a[91]=[k(" 启用后,重新打开面板时需要先输入访问密码 ",-1)])]),_:1})]),V("div",Yt,[Ml.value.hasPassword?(U(),S(R(Te),{key:0,type:"success",bordered:!1},{default:$(()=>[...a[92]||(a[92]=[k(" 已启用 ",-1)])]),_:1})):(U(),S(R(Te),{key:1,type:"warning",bordered:!1},{default:$(()=>[...a[93]||(a[93]=[k(" 未启用 ",-1)])]),_:1}))])]),P(R(be)),V("div",Jt,[V("div",Ft,[P(R(Ue),{strong:""},{default:$(()=>[k(N(Ml.value.hasPassword?"修改密码":"设置密码"),1)]),_:1}),P(R(Ue),{depth:"3",style:{"font-size":"13px","margin-top":"4px"}},{default:$(()=>[...a[94]||(a[94]=[k(" 密码至少 4 位,建议包含数字与字母 ",-1)])]),_:1}),P(R(Ue),{depth:"3",style:{"font-size":"12px","margin-top":"4px"}},{default:$(()=>[a[96]||(a[96]=k(" 忘记密码可在终端执行 ",-1)),P(R(Ue),{code:""},{default:$(()=>[...a[95]||(a[95]=[k("ctx security reset",-1)])]),_:1}),a[97]||(a[97]=k(" 关闭密码 ",-1))]),_:1})]),V("div",qt,[Ml.value.hasPassword?(U(),S(R(Ie),{key:0,value:Rl.value.currentPassword,"onUpdate:value":a[10]||(a[10]=e=>Rl.value.currentPassword=e),type:"password",placeholder:"当前密码","show-password-on":"click"},null,8,["value"])):x("",!0),P(R(Ie),{value:Rl.value.newPassword,"onUpdate:value":a[11]||(a[11]=e=>Rl.value.newPassword=e),type:"password",placeholder:"新密码","show-password-on":"click"},null,8,["value"]),P(R(Ie),{value:Rl.value.confirmPassword,"onUpdate:value":a[12]||(a[12]=e=>Rl.value.confirmPassword=e),type:"password",placeholder:"确认新密码","show-password-on":"click"},null,8,["value"]),Yl.value?(U(),S(R(Ue),{key:1,depth:"3",class:"security-error"},{default:$(()=>[k(N(Yl.value),1)]),_:1})):x("",!0)])])])]),V("div",Vt,[P(R(Se),{justify:"end"},{default:$(()=>[P(R(f),{size:"large",onClick:a[13]||(a[13]=e=>d.value=!1)},{default:$(()=>[...a[98]||(a[98]=[k(" 取消 ",-1)])]),_:1}),P(R(f),{type:"primary",size:"large",loading:Wl.value,disabled:!Jl.value,onClick:Vs},{icon:$(()=>[P(R(c),null,{default:$(()=>[P(R(fe))]),_:1})]),default:$(()=>[a[99]||(a[99]=k(" 保存密码 ",-1))]),_:1},8,["loading","disabled"])]),_:1})])],512),[[B,"security"===p.value]]),J(V("div",Ht,[V("div",Xt,[V("div",Kt,[P(R(c),{size:"24",color:"var(--text-secondary)"},{default:$(()=>[P(R(ie))]),_:1}),V("div",null,[a[101]||(a[101]=V("h3",{class:"panel-title"},"模型设置",-1)),P(R(Ue),{depth:"3",class:"panel-subtitle"},{default:$(()=>[...a[100]||(a[100]=[k("管理默认测速模型、模型上下文窗口和定价信息",-1)])]),_:1}),P(R(Ue),{depth:"3",class:"panel-subtitle"},{default:$(()=>[k(" 价格来源:Models.dev 参考价格(离线快照) · "+N(ql.value.lastUpdated||"日期未知"),1)]),_:1})])])]),V("div",Zt,[P(R(Pe),{show:Vl.value},{default:$(()=>[V("div",Gt,[V("div",Qt,[P(R(Ue),{strong:"",style:{"font-size":"12px",display:"block","margin-bottom":"8px"}},{default:$(()=>[...a[102]||(a[102]=[k("默认测速模型",-1)])]),_:1}),V("div",el,[(U(!0),q(T,null,z(ns.value,e=>(U(),q("div",{key:e.key,class:"speed-test-default-row"},[V("div",al,[P(R(Ue),{depth:"3",style:{"font-size":"12px"}},{default:$(()=>[k(N(e.label),1)]),_:2},1024)]),P(R(Me),{value:ls.value[e.key],"onUpdate:value":a=>ls.value[e.key]=a,options:bs.value[e.key],placeholder:`选择或输入${e.label}默认测速模型`,disabled:0===(bs.value[e.key]||[]).length,size:"small",filterable:"",tag:""},null,8,["value","onUpdate:value","options","placeholder","disabled"])]))),128))])])]),V("div",tl,[P(R(Ie),{value:Gl.value,"onUpdate:value":a[14]||(a[14]=e=>Gl.value=e),placeholder:"搜索模型 ID...",clearable:"",size:"small",style:{flex:"1","min-width":"0"}},null,8,["value"]),P(R(f),{size:"small",type:"primary",onClick:ds},{icon:$(()=>[P(R(c),null,{default:$(()=>[P(R(se))]),_:1})]),default:$(()=>[a[103]||(a[103]=k(" 新增 ",-1))]),_:1})]),V("div",ll,[P(R(Ne),{value:Ql.value,"onUpdate:value":a[15]||(a[15]=e=>Ql.value=e),size:"small"},{default:$(()=>[P(R(De),{value:"all"},{default:$(()=>[...a[104]||(a[104]=[k("全部",-1)])]),_:1}),P(R(De),{value:"claude"},{default:$(()=>[...a[105]||(a[105]=[k("Claude",-1)])]),_:1}),P(R(De),{value:"openai"},{default:$(()=>[...a[106]||(a[106]=[k("OpenAI",-1)])]),_:1}),P(R(De),{value:"gemini"},{default:$(()=>[...a[107]||(a[107]=[k("Gemini",-1)])]),_:1}),P(R(De),{value:"compatible"},{default:$(()=>[...a[108]||(a[108]=[k("OpenCode / OMP",-1)])]),_:1}),P(R(De),{value:"overrides"},{default:$(()=>[...a[109]||(a[109]=[k("自定义",-1)])]),_:1})]),_:1},8,["value"])]),0===ys.value.length?(U(),q("div",sl,[P(R(Le),{description:"没有匹配的模型"})])):(U(),q("div",nl,[(U(!0),q(T,null,z(ys.value,e=>(U(),q("div",{key:e,class:M(["model-card",{expanded:is.value.has(e)}])},[V("div",{class:"model-card-header",onClick:a=>(e=>{is.value.has(e)?is.value.delete(e):is.value.add(e),is.value=new Set(is.value)})(e)},[P(R(c),{size:"14",class:"expand-icon"},{default:$(()=>[P(R(me))]),_:1}),V("span",ol,N(e),1),Kl.value[e]?(U(),S(R(Te),{key:0,type:"warning",size:"tiny",bordered:!1},{default:$(()=>[...a[110]||(a[110]=[k("自定义",-1)])]),_:1})):x("",!0),V("div",{class:"model-card-actions",onClick:a[16]||(a[16]=D(()=>{},["stop"]))},[Kl.value[e]&&vs(e)?(U(),S(R(f),{key:0,size:"tiny",quaternary:"",type:"warning",onClick:a=>async function(e){try{await o(e),delete Kl.value[e],delete Zl.value[e],await ks(),Oe.success(`${e} 已重置为内置默认值`)}catch(a){Oe.error("重置失败:"+a.message)}}(e)},{default:$(()=>[...a[111]||(a[111]=[k(" 重置 ",-1)])]),_:1},8,["onClick"])):x("",!0),fs(e)?(U(),S(R(f),{key:1,size:"tiny",quaternary:"",type:"error",onClick:a=>async function(e){try{const a=!!Kl.value[e];a&&(await o(e),delete Kl.value[e]),delete Zl.value[e],fs(e)?delete Xl.value[e]:a&&await ks(),Oe.success(`已删除模型:${e}`)}catch(a){Oe.error("删除失败:"+a.message)}}(e)},{default:$(()=>[...a[112]||(a[112]=[k(" 删除 ",-1)])]),_:1},8,["onClick"])):x("",!0)])],8,il),is.value.has(e)?(U(),q("div",rl,[V("div",ul,[V("div",dl,[P(R(Ue),{strong:"",style:{"font-size":"12px",display:"block","margin-bottom":"8px"}},{default:$(()=>[...a[113]||(a[113]=[k("上下文限制",-1)])]),_:1}),V("div",cl,[V("div",null,[P(R(Ue),{depth:"3",style:{"font-size":"11px"}},{default:$(()=>[...a[114]||(a[114]=[k("Context 窗口 (tokens)",-1)])]),_:1}),P(R(je),{value:ws(e,"limit","context"),"onUpdate:value":a=>xs(e,"limit","context",a),min:1e3,step:1e3,size:"small","show-button":!1,style:{width:"100%"}},null,8,["value","onUpdate:value"])]),V("div",null,[P(R(Ue),{depth:"3",style:{"font-size":"11px"}},{default:$(()=>[...a[115]||(a[115]=[k("Max Output (tokens)",-1)])]),_:1}),P(R(je),{value:ws(e,"limit","output"),"onUpdate:value":a=>xs(e,"limit","output",a),min:100,step:1e3,size:"small","show-button":!1,style:{width:"100%"}},null,8,["value","onUpdate:value"])])])]),V("div",pl,[P(R(Ue),{strong:"",style:{"font-size":"12px",display:"block","margin-bottom":"8px"}},{default:$(()=>[...a[116]||(a[116]=[k("定价(USD / 百万 tokens)",-1)])]),_:1}),V("div",vl,[V("div",null,[P(R(Ue),{depth:"3",style:{"font-size":"11px"}},{default:$(()=>[...a[117]||(a[117]=[k("输入价格",-1)])]),_:1}),P(R(je),{value:ws(e,"pricing","input"),"onUpdate:value":a=>xs(e,"pricing","input",a),min:0,step:.1,precision:4,size:"small","show-button":!1,style:{width:"100%"}},null,8,["value","onUpdate:value"])]),V("div",null,[P(R(Ue),{depth:"3",style:{"font-size":"11px"}},{default:$(()=>[...a[118]||(a[118]=[k("输出价格",-1)])]),_:1}),P(R(je),{value:ws(e,"pricing","output"),"onUpdate:value":a=>xs(e,"pricing","output",a),min:0,step:.1,precision:4,size:"small","show-button":!1,style:{width:"100%"}},null,8,["value","onUpdate:value"])]),V("div",null,[P(R(Ue),{depth:"3",style:{"font-size":"11px"}},{default:$(()=>[...a[119]||(a[119]=[k("缓存写入价格",-1)])]),_:1}),P(R(je),{value:ws(e,"pricing","cacheCreation"),"onUpdate:value":a=>xs(e,"pricing","cacheCreation",a),min:0,step:.1,precision:4,size:"small","show-button":!1,style:{width:"100%"}},null,8,["value","onUpdate:value"])]),V("div",null,[P(R(Ue),{depth:"3",style:{"font-size":"11px"}},{default:$(()=>[...a[120]||(a[120]=[k("缓存读取价格",-1)])]),_:1}),P(R(je),{value:ws(e,"pricing","cacheRead"),"onUpdate:value":a=>xs(e,"pricing","cacheRead",a),min:0,step:.01,precision:4,size:"small","show-button":!1,style:{width:"100%"}},null,8,["value","onUpdate:value"])])])])])])):x("",!0)],2))),128))]))]),_:1},8,["show"])]),V("div",fl,[P(R(Se),{justify:"end"},{default:$(()=>[P(R(f),{size:"large",onClick:zs,disabled:0===Object.keys(Kl.value).length},{default:$(()=>[...a[121]||(a[121]=[k(" 重置全部 ",-1)])]),_:1},8,["disabled"]),P(R(f),{type:"primary",size:"large",loading:Hl.value,disabled:!rs.value,onClick:_s},{icon:$(()=>[P(R(c),null,{default:$(()=>[P(R(fe))]),_:1})]),default:$(()=>[a[122]||(a[122]=k(" 保存设置 ",-1))]),_:1},8,["loading","disabled"])]),_:1})])],512),[[B,"model-settings"===p.value]])])]),P(R(he),{show:es.value,"onUpdate:show":a[24]||(a[24]=e=>es.value=e),preset:"card",title:"新增模型设置",style:{width:"560px"},"mask-closable":!1},{default:$(()=>[P(R(Se),{vertical:"",size:12},{default:$(()=>[V("div",null,[P(R(Ue),{depth:"3",style:{"font-size":"12px"}},{default:$(()=>[...a[123]||(a[123]=[k("模型 ID",-1)])]),_:1}),P(R(Ie),{value:as.value.modelId,"onUpdate:value":a[17]||(a[17]=e=>as.value.modelId=e),placeholder:"例如:gpt-4.1-mini",clearable:""},null,8,["value"])]),V("div",ml,[V("div",null,[P(R(Ue),{depth:"3",style:{"font-size":"12px"}},{default:$(()=>[...a[124]||(a[124]=[k("Context 窗口",-1)])]),_:1}),P(R(je),{value:as.value.context,"onUpdate:value":a[18]||(a[18]=e=>as.value.context=e),min:1e3,step:1e3,"show-button":!1,style:{width:"100%"}},null,8,["value"])]),V("div",null,[P(R(Ue),{depth:"3",style:{"font-size":"12px"}},{default:$(()=>[...a[125]||(a[125]=[k("Max Output",-1)])]),_:1}),P(R(je),{value:as.value.output,"onUpdate:value":a[19]||(a[19]=e=>as.value.output=e),min:100,step:100,"show-button":!1,style:{width:"100%"}},null,8,["value"])])]),V("div",yl,[V("div",null,[P(R(Ue),{depth:"3",style:{"font-size":"12px"}},{default:$(()=>[...a[126]||(a[126]=[k("输入价格",-1)])]),_:1}),P(R(je),{value:as.value.inputPrice,"onUpdate:value":a[20]||(a[20]=e=>as.value.inputPrice=e),min:0,step:.1,precision:4,"show-button":!1,style:{width:"100%"}},null,8,["value"])]),V("div",null,[P(R(Ue),{depth:"3",style:{"font-size":"12px"}},{default:$(()=>[...a[127]||(a[127]=[k("输出价格",-1)])]),_:1}),P(R(je),{value:as.value.outputPrice,"onUpdate:value":a[21]||(a[21]=e=>as.value.outputPrice=e),min:0,step:.1,precision:4,"show-button":!1,style:{width:"100%"}},null,8,["value"])])]),V("div",gl,[V("div",null,[P(R(Ue),{depth:"3",style:{"font-size":"12px"}},{default:$(()=>[...a[128]||(a[128]=[k("缓存写入价格",-1)])]),_:1}),P(R(je),{value:as.value.cacheCreationPrice,"onUpdate:value":a[22]||(a[22]=e=>as.value.cacheCreationPrice=e),min:0,step:.1,precision:4,"show-button":!1,style:{width:"100%"}},null,8,["value"])]),V("div",null,[P(R(Ue),{depth:"3",style:{"font-size":"12px"}},{default:$(()=>[...a[129]||(a[129]=[k("缓存读取价格",-1)])]),_:1}),P(R(je),{value:as.value.cacheReadPrice,"onUpdate:value":a[23]||(a[23]=e=>as.value.cacheReadPrice=e),min:0,step:.01,precision:4,"show-button":!1,style:{width:"100%"}},null,8,["value"])])]),us.value?(U(),S(R(Ue),{key:0,depth:"3",class:"security-error"},{default:$(()=>[k(N(us.value),1)]),_:1})):x("",!0),P(R(Se),{justify:"end"},{default:$(()=>[P(R(f),{onClick:cs},{default:$(()=>[...a[130]||(a[130]=[k("取消",-1)])]),_:1}),P(R(f),{type:"primary",disabled:!!us.value,onClick:ps},{default:$(()=>[...a[131]||(a[131]=[k(" 新增 ",-1)])]),_:1},8,["disabled"])]),_:1})]),_:1})]),_:1},8,["show"])]),_:1})]),_:1},8,["show","width"]))}},[["__scopeId","data-v-f0261ba5"]]);export{hl as default};