coding-tool-x 3.8.7 → 3.8.9

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 (143) hide show
  1. package/README.md +2 -2
  2. package/dist/web/assets/{AgentsDrawer-C7ePByZx.js → AgentsDrawer-Cj5CJ4d9.js} +1 -1
  3. package/dist/web/assets/Analytics-1doS-8uC.js +1 -0
  4. package/dist/web/assets/AssetPathField-C9TOPl7o.js +1 -0
  5. package/dist/web/assets/{ChatHistoryDrawer-Ccl4rhdz.js → ChatHistoryDrawer-BTmQ1aQr.js} +1 -1
  6. package/dist/web/assets/{CollapseItem-MxG_UD4o.js → CollapseItem-CwqJk3bE.js} +1 -1
  7. package/dist/web/assets/{CommandsDrawer-DWbaxHRZ.js → CommandsDrawer-CaZWDI_G.js} +1 -1
  8. package/dist/web/assets/ConfigExportDrawer-C3vSZEsS.js +1 -0
  9. package/dist/web/assets/{ConfigTemplates-AiRPv2cd.js → ConfigTemplates-gyERg9iC.js} +1 -1
  10. package/dist/web/assets/{ConfigTemplatesDrawer-CKMFsfEF.js → ConfigTemplatesDrawer-B17RqFi4.js} +1 -1
  11. package/dist/web/assets/{ConfigTemplatesPanel-Cvbnkvpt.js → ConfigTemplatesPanel-DKIC_FqG.js} +1 -1
  12. package/dist/web/assets/{Divider-D28g1gwj.js → Divider-DsdbkHrG.js} +1 -1
  13. package/dist/web/assets/{FavoritesDrawer-DA-dR_vP.js → FavoritesDrawer-DaziQmBp.js} +1 -1
  14. package/dist/web/assets/Forward-DLCL7aMY.js +1 -0
  15. package/dist/web/assets/{GatewayConvertDrawer-402_raGb.js → GatewayConvertDrawer-OMgWUUSc.js} +1 -1
  16. package/dist/web/assets/Home-DOSUTfrE.js +1 -0
  17. package/dist/web/assets/{MarkdownEditor-BvkDECwH.js → MarkdownEditor-9TTwTS-U.js} +1 -1
  18. package/dist/web/assets/McpDrawer-I8rl8lGH.js +1 -0
  19. package/dist/web/assets/{McpFormDrawer-DPMnyt5L.js → McpFormDrawer-DEP3C7ut.js} +1 -1
  20. package/dist/web/assets/{PluginManager-FKVeugr4.js → PluginManager-BuRcWuBj.js} +1 -1
  21. package/dist/web/assets/{PluginsDrawer-MvM1R55d.js → PluginsDrawer-_zZENaQn.js} +1 -1
  22. package/dist/web/assets/PluginsPanel-Bs5qZ-TK.js +1 -0
  23. package/dist/web/assets/PluginsPanel-CzGMK-Ap.css +1 -0
  24. package/dist/web/assets/ProjectList-BSxuL2td.js +1 -0
  25. package/dist/web/assets/{ProjectList-677RLZ8O.css → ProjectList-VbIYSHbH.css} +1 -1
  26. package/dist/web/assets/PromptsDrawer-CoZ-ZtsY.js +1 -0
  27. package/dist/web/assets/RecentSessionsDrawer-B_17aJBG.js +1 -0
  28. package/dist/web/assets/RecentSessionsDrawer-yrAD4p1A.css +1 -0
  29. package/dist/web/assets/SessionCard-BL_x0d3t.js +1 -0
  30. package/dist/web/assets/SessionList-DhRYZ6vl.js +1 -0
  31. package/dist/web/assets/SessionList-qG_XpPBJ.css +1 -0
  32. package/dist/web/assets/{SettingsDrawer-lMjttbkD.js → SettingsDrawer-fYb0DU7X.js} +1 -1
  33. package/dist/web/assets/SkillManager-S698Hns8.js +1 -0
  34. package/dist/web/assets/{SkillsDrawer-DF6JsSyj.js → SkillsDrawer-Ms4lPCow.js} +1 -1
  35. package/dist/web/assets/{SkillsPanel-B3Nm5j32.css → SkillsPanel-C4ke56nF.css} +1 -1
  36. package/dist/web/assets/SkillsPanel-rqnqAOGL.js +1 -0
  37. package/dist/web/assets/{SpeedTestDrawer-BaZkZqPP.js → SpeedTestDrawer-Bbn38SfV.js} +1 -1
  38. package/dist/web/assets/Upload-CdyVHxCI.js +1 -0
  39. package/dist/web/assets/{WorkspaceDrawer-BFSwZ5yU.js → WorkspaceDrawer-L7HJRc6u.js} +1 -1
  40. package/dist/web/assets/{WorkspaceManager-BHL1uYct.js → WorkspaceManager-DsoNg2z8.js} +1 -1
  41. package/dist/web/assets/{WorkspacePanel-B5PooBtg.js → WorkspacePanel-Be8PVZah.js} +1 -1
  42. package/dist/web/assets/{headers-cf-QapUq.js → headers-B5JWGn3v.js} +1 -1
  43. package/dist/web/assets/{icons-B2Vg-IOC.js → icons-DmFe4b5j.js} +1 -1
  44. package/dist/web/assets/{index-BohDDAy_.css → index-3Lp6z8TQ.css} +1 -1
  45. package/dist/web/assets/index-BKlAWTH-.js +2 -0
  46. package/dist/web/assets/{light-Cp0t7v32.js → light-0eavxNvt.js} +1 -1
  47. package/dist/web/assets/platforms-BmzzwnSw.js +1 -0
  48. package/dist/web/assets/platforms-DWXgmy2w.js +1 -0
  49. package/dist/web/assets/session-visibility-BAmxh3cK.js +1 -0
  50. package/dist/web/assets/sessions-CC0j-KH_.js +1 -0
  51. package/dist/web/assets/sessions-D4yQtfKb.js +1 -0
  52. package/dist/web/assets/use-message-DqCwefG6.js +1 -0
  53. package/dist/web/assets/{useResponsiveDrawer-D-DDpbnI.js → useResponsiveDrawer-V_onl9NV.js} +1 -1
  54. package/dist/web/index.html +7 -7
  55. package/package.json +1 -1
  56. package/src/commands/daemon.js +27 -4
  57. package/src/commands/search.js +17 -2
  58. package/src/config/paths.js +2 -0
  59. package/src/platforms/channel-auth-registry.js +36 -6
  60. package/src/platforms/channel-auth-service.js +12 -2
  61. package/src/platforms/driver-registry.js +9 -1
  62. package/src/platforms/drivers/claude/session-history-adapter.js +72 -1
  63. package/src/platforms/drivers/claude/sessions-implementation.js +49 -7
  64. package/src/platforms/drivers/claude/sessions.js +30 -6
  65. package/src/platforms/drivers/codex/parser.js +57 -1
  66. package/src/platforms/drivers/codex/session-history-adapter.js +8 -2
  67. package/src/platforms/drivers/codex/sessions-implementation.js +25 -3
  68. package/src/platforms/drivers/codex/sessions.js +18 -1
  69. package/src/platforms/drivers/dsh/api-operations.js +396 -0
  70. package/src/platforms/drivers/dsh/channels-implementation.js +458 -0
  71. package/src/platforms/drivers/dsh/channels.js +191 -0
  72. package/src/platforms/drivers/dsh/common.js +571 -0
  73. package/src/platforms/drivers/dsh/native-config.js +93 -0
  74. package/src/platforms/drivers/dsh/native-logs.js +116 -0
  75. package/src/platforms/drivers/dsh/plugin-manager.js +117 -0
  76. package/src/platforms/drivers/dsh/projects.js +23 -0
  77. package/src/platforms/drivers/dsh/proxy-implementation.js +260 -0
  78. package/src/platforms/drivers/dsh/proxy.js +23 -0
  79. package/src/platforms/drivers/dsh/resources.js +346 -0
  80. package/src/platforms/drivers/dsh/sessions.js +587 -0
  81. package/src/platforms/drivers/dsh/statistics-implementation.js +238 -0
  82. package/src/platforms/drivers/dsh/statistics.js +24 -0
  83. package/src/platforms/drivers/gemini/session-history-adapter.js +49 -1
  84. package/src/platforms/drivers/gemini/sessions-implementation.js +46 -1
  85. package/src/platforms/drivers/gemini/sessions.js +2 -1
  86. package/src/platforms/drivers/omp/prompts.js +58 -2
  87. package/src/platforms/drivers/omp/proxy-implementation.js +25 -1
  88. package/src/platforms/drivers/omp/session-history-adapter.js +42 -1
  89. package/src/platforms/drivers/omp/sessions-implementation.js +51 -3
  90. package/src/platforms/drivers/omp/sessions.js +33 -2
  91. package/src/platforms/drivers/opencode/channels-implementation.js +25 -22
  92. package/src/platforms/drivers/opencode/channels.js +6 -1
  93. package/src/platforms/drivers/opencode/sessions-implementation.js +89 -9
  94. package/src/platforms/drivers/opencode/sessions.js +37 -1
  95. package/src/platforms/manifest-schema.js +43 -3
  96. package/src/platforms/manifests/dsh.json +542 -0
  97. package/src/platforms/manifests/omp.json +2 -1
  98. package/src/platforms/manifests/opencode.json +28 -0
  99. package/src/platforms/native-oauth-adapters.js +318 -18
  100. package/src/platforms/oauth-credentials-service.js +344 -13
  101. package/src/platforms/path-resolver.js +2 -0
  102. package/src/platforms/platform-path-context.js +12 -2
  103. package/src/platforms/registry.js +16 -1
  104. package/src/platforms/runtime.js +5 -0
  105. package/src/platforms/session-history-adapters.js +1 -0
  106. package/src/server/api/platform-api-config.js +23 -2
  107. package/src/server/api/platform-route-factory.js +9 -2
  108. package/src/server/api/platforms.js +19 -1
  109. package/src/server/api/plugins.js +108 -13
  110. package/src/server/index.js +35 -1
  111. package/src/server/services/config-registry-service.js +10 -1
  112. package/src/server/services/config-templates-service.js +1 -0
  113. package/src/server/services/plugins-service.js +474 -103
  114. package/src/server/services/session-history-index.js +900 -140
  115. package/src/server/services/session-history-worker.js +3 -1
  116. package/src/server/services/skill-service.js +214 -7
  117. package/src/server/services/usage-log-utils.js +1 -0
  118. package/src/server/services/workspace-service.js +39 -10
  119. package/src/shared/driver-factories/api.js +22 -6
  120. package/src/shared/driver-factories/projects.js +8 -0
  121. package/dist/web/assets/Analytics-BVG6ehFv.js +0 -1
  122. package/dist/web/assets/AssetPathField-BZI9NvEr.js +0 -1
  123. package/dist/web/assets/ConfigExportDrawer-DrawKwxE.js +0 -1
  124. package/dist/web/assets/Home-CTF8ZWKW.js +0 -1
  125. package/dist/web/assets/McpDrawer-DZGHkuDm.js +0 -1
  126. package/dist/web/assets/PluginsPanel-CKuBs38B.js +0 -1
  127. package/dist/web/assets/PluginsPanel-D6ZqITcR.css +0 -1
  128. package/dist/web/assets/ProjectList-tsjwjXV1.js +0 -1
  129. package/dist/web/assets/PromptsDrawer-B-X9ci8n.js +0 -1
  130. package/dist/web/assets/RecentSessionsDrawer-CKFsOYDM.css +0 -1
  131. package/dist/web/assets/RecentSessionsDrawer-wLktMF_c.js +0 -1
  132. package/dist/web/assets/SessionCard-DkJPy0TY.js +0 -1
  133. package/dist/web/assets/SessionList-BpYRz1cX.css +0 -1
  134. package/dist/web/assets/SessionList-Gzhh4FOZ.js +0 -1
  135. package/dist/web/assets/SkillManager-CzFxWxx-.js +0 -1
  136. package/dist/web/assets/SkillsPanel--lLEts9y.js +0 -1
  137. package/dist/web/assets/Upload-BEQ-3Kqq.js +0 -1
  138. package/dist/web/assets/index-BFInlZGI.js +0 -2
  139. package/dist/web/assets/platforms-CBkB45JP.js +0 -1
  140. package/dist/web/assets/platforms-FTpjxAT6.js +0 -1
  141. package/dist/web/assets/sessions-Cmy31slD.js +0 -1
  142. package/dist/web/assets/sessions-yC_oVVh8.js +0 -1
  143. package/dist/web/assets/use-message-DoLM8C1C.js +0 -1
@@ -0,0 +1 @@
1
+ .project-instruction-panel[data-v-f2f46409]{flex-direction:column;gap:12px;display:flex}.resource-path[data-v-f2f46409]{color:var(--text-tertiary);font-family:monospace;font-size:12px}.actions[data-v-f2f46409]{margin-top:4px}.hint[data-v-f2f46409]{font-size:11px}.unsupported-state[data-v-f2f46409]{color:var(--text-tertiary);text-align:center;padding:28px 12px}.project-mcp-panel[data-v-1ebbb765]{flex-direction:column;min-height:220px;display:flex}.panel-toolbar[data-v-1ebbb765]{justify-content:space-between;align-items:center;gap:12px;margin-bottom:12px;display:flex}.resource-path[data-v-1ebbb765]{color:var(--text-tertiary);font-family:monospace;font-size:11px}.server-list[data-v-1ebbb765]{flex-direction:column;gap:8px;display:flex}.server-row[data-v-1ebbb765]{border:1px solid var(--border-primary);border-radius:6px;align-items:center;gap:12px;padding:10px;display:flex}.server-info[data-v-1ebbb765]{flex:1;min-width:0}.server-title[data-v-1ebbb765]{color:var(--text-primary);font-size:13px;font-weight:600}.server-spec[data-v-1ebbb765]{color:var(--text-tertiary);text-overflow:ellipsis;white-space:nowrap;margin-top:3px;font-family:monospace;font-size:11px;overflow:hidden}.project-config-content[data-v-e9a405fe]{padding:2px 0 12px}.project-config-header[data-v-e9a405fe]{justify-content:space-between;align-items:center;gap:12px;margin-bottom:14px;display:flex}.project-config-title[data-v-e9a405fe]{color:var(--text-primary);margin-bottom:4px;font-size:14px;font-weight:600}.project-path[data-v-e9a405fe]{text-overflow:ellipsis;white-space:nowrap;max-width:520px;font-family:monospace;font-size:11px;display:block;overflow:hidden}.unsupported-state[data-v-e9a405fe]{color:var(--text-tertiary);text-align:center;padding:36px 12px}.session-list-container[data-v-66cfe9c9]{box-sizing:border-box;flex-direction:column;width:100%;height:100%;display:flex}.header[data-v-66cfe9c9]{background:var(--bg-primary);border-bottom:1px solid var(--border-primary);flex-shrink:0;padding:24px 24px 16px}.content[data-v-66cfe9c9]{flex:1;padding:16px 24px 24px;overflow:hidden auto}.sessions-list[data-v-66cfe9c9]{position:relative;overflow:hidden}.back-button[data-v-66cfe9c9]{flex-shrink:0;margin-right:12px}.title-bar[data-v-66cfe9c9]{align-items:center;gap:16px;display:flex}.title-section[data-v-66cfe9c9]{flex:1;min-width:0}.title-with-count[data-v-66cfe9c9]{flex-wrap:wrap;align-items:center;gap:8px;margin-bottom:2px;display:flex}.title-section h2[data-v-66cfe9c9]{margin:0;font-size:20px}.session-count[data-v-66cfe9c9]{color:#666;font-size:14px}.total-size-tag[data-v-66cfe9c9]{margin-left:8px}.project-path[data-v-66cfe9c9]{color:#666;margin-bottom:2px;font-size:13px;display:block}.header-actions[data-v-66cfe9c9]{align-items:center;gap:12px;margin-left:4px;display:flex}.search-input[data-v-66cfe9c9]{flex-shrink:0;width:320px}.loading-container[data-v-66cfe9c9]{justify-content:center;align-items:center;min-height:400px;display:flex}.loading-container.compact[data-v-66cfe9c9]{min-height:180px}.session-item[data-v-66cfe9c9]{background:var(--bg-primary);border:1px solid var(--border-primary);cursor:pointer;border-radius:8px;align-items:center;gap:12px;margin-bottom:8px;padding:16px;transition:all .2s;display:flex}.session-item[data-v-66cfe9c9]:hover{border-color:#18a058;box-shadow:0 2px 8px #18a0581a}.session-item-selection-mode[data-v-66cfe9c9]{cursor:default}.session-item-selected[data-v-66cfe9c9]{background:#18a0580a;border-color:#18a058;box-shadow:0 0 0 2px #18a0581f}.selection-checkbox[data-v-66cfe9c9]{justify-content:center;align-items:center;width:24px;min-width:24px;display:flex}.session-left[data-v-66cfe9c9]{flex:1;align-items:center;gap:16px;min-width:0;display:flex}.session-icon[data-v-66cfe9c9]{flex-shrink:0}.session-info[data-v-66cfe9c9]{flex:1;min-width:0}.session-header[data-v-66cfe9c9]{align-items:center;margin-bottom:6px;display:flex}.session-title-row[data-v-66cfe9c9]{align-items:center;gap:8px;display:flex}.session-title[data-v-66cfe9c9]{text-overflow:ellipsis;white-space:nowrap;flex-shrink:1;min-width:0;font-size:15px;font-weight:600;overflow:hidden}.session-meta[data-v-66cfe9c9]{align-items:center;gap:8px;margin-bottom:6px;font-size:13px;display:flex}.session-message[data-v-66cfe9c9]{text-overflow:ellipsis;white-space:nowrap;max-width:600px;font-size:13px;display:block;overflow:hidden}.session-message-empty[data-v-66cfe9c9]{opacity:.5;font-style:italic}.session-right[data-v-66cfe9c9]{flex-direction:column;flex-shrink:0;justify-content:flex-start;align-items:flex-end;gap:12px;min-width:280px;display:flex}.session-tags-area[data-v-66cfe9c9]{justify-content:flex-end;align-items:flex-start;min-height:24px;display:flex}.session-actions[data-v-66cfe9c9]{align-items:center;margin-top:auto;display:flex}.list-pagination[data-v-66cfe9c9]{justify-content:center;margin:20px 0 4px;display:flex}.search-result-item[data-v-66cfe9c9]{border:1px solid var(--border-primary);background:var(--bg-elevated);border-radius:6px;margin-bottom:16px;padding:12px}.search-result-header[data-v-66cfe9c9]{justify-content:space-between;align-items:center;margin-bottom:8px;display:flex}.search-result-title[data-v-66cfe9c9]{align-items:center;gap:8px;display:flex}.search-match[data-v-66cfe9c9]{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-66cfe9c9]{flex:1;line-height:1.6}
@@ -1 +1 @@
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 R,mt as D,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-CBkB45JP.js";import{F as ae,Ft as te,I as le,N as se,_t as ne,bt as ie,ct as oe,f as re,h as ue,m as de,r as ce,s as pe,t as ve,v as fe,xt as me,yt as ye}from"./icons-B2Vg-IOC.js";import{f as ge}from"./use-message-DoLM8C1C.js";import{l as he}from"./light-Cp0t7v32.js";import{t as be}from"./Divider-D28g1gwj.js";import{n as we,t as xe}from"./useResponsiveDrawer-D-DDpbnI.js";import{t as ke}from"./DrawerContent-ChXgZ1Xm.js";import{A as _e,F as ze,I as Ce,K as Pe,N as Se,P as Oe,R as Ue,at as je,ct as Ie,dt as Ne,et as Ae,j as Le,lt as $e,nt as Be,pt as Te,st as Me,tt as Ee,xt as Re,y as De}from"./index-BFInlZGI.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,Me,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:Re(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(D(Be),{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(D(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"},Ra={class:"visibility-info"},Da={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"},Rt={class:"setting-group"},Dt={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}=De(),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),Me=Y(!1),Re=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),Rl=Y(!1),Dl=Y({currentPassword:"",newPassword:"",confirmPassword:""}),Wl=Y(!1),Yl=A(()=>{const e=Dl.value.currentPassword.trim(),a=Dl.value.newPassword,t=Dl.value.confirmPassword;return Ml.value.hasPassword&&!e?"请输入当前密码":a?a.length<4?"新密码至少需要 4 位":t&&a!==t?"两次输入的新密码不一致":"":""}),Jl=A(()=>{const e=Dl.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,Se.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(),Se.success("模型设置已保存")}catch(e){Se.error("保存失败:"+e.message)}finally{Hl.value=!1}}async function zs(){try{await i({overrides:{},defaultSpeedTestModels:ls.value}),Kl.value={},Zl.value={},await ks(),Se.success("全部模型设置已重置为内置默认值")}catch(e){Se.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(oe)},{key:"notification",label:"通知设置",icon:W(ae)},{key:"advanced",label:"高级设置",icon:W(se)},{key:"security",label:"安全设置",icon:W(de)},{key:"model-settings",label:"模型设置",icon:W(re)}]),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]}})),Se.success("首页 CLI 显示已保存")}catch(e){Se.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 Rs(e){h.value=e,Ts(),window.dispatchEvent(new CustomEvent("channel-balance-visibility-change",{detail:{showRemaining:e}}))}async function Ds(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),Se.success(e?"会话绑定已开启":"会话绑定已关闭")):(Fe.value.enableSessionBinding=!e,Se.error("保存失���"))}catch(a){Fe.value.enableSessionBinding=!e,Se.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,Se.success("通知设置已保存")}else{const e=await a.json();Se.error("保存失败:"+(e.error||"未知错误"))}}catch(e){Se.error("保存失败:"+e.message)}finally{Pl.value=!1}}function Fs(){Dl.value={currentPassword:"",newPassword:"",confirmPassword:""}}async function qs(e=!1){return Rl.value&&Fl?Fl:El.value&&!e?Promise.resolve():(Rl.value=!0,Fl=(async()=>{try{const e=await _e();e.success&&(Ml.value={hasPassword:Boolean(e.hasPassword)},El.value=!0)}catch(e){}finally{Rl.value=!1,Fl=null}})(),Fl)}async function Vs(){if(!Jl.value)return void Se.warning("请完善密码信息");const e=Ml.value.hasPassword;Wl.value=!0;try{const a={newPassword:Dl.value.newPassword};Ml.value.hasPassword&&(a.currentPassword=Dl.value.currentPassword);const t=await Le(a);t.success?(Ml.value.hasPassword=!0,El.value=!0,Fs(),Se.success(e?"密码已更新":"密码已设置")):Se.error(t.error||"保存失败")}catch(a){Se.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}})),Se.success("配置已保存,端口修改需要重启服务器生效;OMP 原生会话日志配置立即生效");else{const a=await e.json();Se.error("保存失败:"+(a.error||"未知错误"))}}catch(e){Se.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(){Me.value=!0;try{const e=await async function(){return(await H.post("/pm2-autostart",{action:"enable"})).data}();if(e.success)ge.value=!0,Se.success("开机自启已启用");else{const a=e.message||"未知错误";a.includes("暂无运行中的进程")||a.includes("请先启动")?Se.warning(a):Se.error(a)}}catch(e){Se.error(e.message||"启用失败:未知错误")}finally{Me.value=!1}}async function Zs(){Me.value=!0;try{const e=await async function(){return(await H.post("/pm2-autostart",{action:"disable"})).data}();if(e.success)ge.value=!1,Se.success("开机自启已禁用");else{const a=e.message||"未知错误";a.includes("未启用")||a.includes("不存在")?Se.warning(a):Se.error(a)}}catch(e){Se.error(e.message||"禁用失败:未知错误")}finally{Me.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(D(we),{show:d.value,"onUpdate:show":a[25]||(a[25]=e=>d.value=e),width:D(t),placement:"right","show-mask":!0},{default:$(()=>[P(D(ke),{"show-header":!1,closable:"","native-scrollbar":!1},{default:$(()=>[V("div",Ze,[V("div",Ge,[V("div",Qe,[P(D(c),{size:"20",color:"var(--text-secondary)"},{default:$(()=>[P(D(ue))]),_: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(D(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(D(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(D(c),{size:"24",color:"var(--text-secondary)"},{default:$(()=>[P(D(oe))]),_:1}),V("div",null,[a[28]||(a[28]=V("h3",{class:"panel-title"},"外观设置",-1)),P(D(Oe),{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(D(Oe),{strong:""},{default:$(()=>[...a[29]||(a[29]=[k("面板显示",-1)])]),_:1}),P(D(Oe),{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(D(Oe),{strong:""},{default:$(()=>[...a[31]||(a[31]=[k("显示渠道列表",-1)])]),_:1}),P(D(Oe),{depth:"3",style:{"font-size":"13px"}},{default:$(()=>[...a[32]||(a[32]=[k(" 在右侧面板显示 API 渠道管理区域 ",-1)])]),_:1})]),P(D(ze),{value:y.value,"onUpdate:value":Ms},null,8,["value"])]),V("div",fa,[V("div",ma,[P(D(Oe),{strong:""},{default:$(()=>[...a[33]||(a[33]=[k("显示实时日志",-1)])]),_:1}),P(D(Oe),{depth:"3",style:{"font-size":"13px"}},{default:$(()=>[...a[34]||(a[34]=[k(" 在 Dashboard 显示实时日志区域 ",-1)])]),_:1})]),P(D(ze),{value:g.value,"onUpdate:value":Es},null,8,["value"])]),V("div",ya,[V("div",ga,[P(D(Oe),{strong:""},{default:$(()=>[...a[35]||(a[35]=[k("显示剩余金额",-1)])]),_:1}),P(D(Oe),{depth:"3",style:{"font-size":"13px"}},{default:$(()=>[...a[36]||(a[36]=[k(" 在渠道卡片显示可识别 API 网关的余额 ",-1)])]),_:1})]),P(D(ze),{value:h.value,"onUpdate:value":Rs},null,8,["value"])])])]),P(D(be)),V("div",ha,[V("div",ba,[P(D(Oe),{strong:""},{default:$(()=>[...a[37]||(a[37]=[k("首页 CLI 显示",-1)])]),_:1}),P(D(Oe),{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(D(je),{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(D(f),{text:"",size:"small",disabled:0===Ns(e.key),"aria-label":"上移",onClick:a=>As(e.key,-1)},{icon:$(()=>[P(D(c),null,{default:$(()=>[P(D(ne))]),_:1})]),_:1},8,["disabled","onClick"]),P(D(f),{text:"",size:"small",disabled:Ns(e.key)===L.value.length-1,"aria-label":"下移",onClick:a=>As(e.key,1)},{icon:$(()=>[P(D(c),null,{default:$(()=>[P(D(ie))]),_:1})]),_:1},8,["disabled","onClick"])])):x("",!0)]))),128))]),V("div",_a,[P(D(f),{size:"small",onClick:Ls},{default:$(()=>[...a[39]||(a[39]=[k("恢复默认显示",-1)])]),_:1}),P(D(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(D(be)),V("div",za,[V("div",Ca,[P(D(Oe),{strong:""},{default:$(()=>[...a[41]||(a[41]=[k("界面主题",-1)])]),_:1}),P(D(Oe),{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:!D(v)}]),onClick:a[0]||(a[0]=e=>D(v)&&D(m)())},[P(D(c),{size:20,class:"theme-icon"},{default:$(()=>[P(D(pe))]),_:1}),V("div",Sa,[P(D(Oe),{strong:""},{default:$(()=>[...a[43]||(a[43]=[k("亮色模式",-1)])]),_:1}),P(D(Oe),{depth:"3",style:{"font-size":"12px"}},{default:$(()=>[...a[44]||(a[44]=[k("经典的浅色主题",-1)])]),_:1})]),D(v)?x("",!0):(U(),q("div",Oa,[P(D(c),{size:20,color:"#18a058"},{default:$(()=>[P(D(me))]),_:1})]))],2),V("div",{class:M(["simple-theme-item",{active:D(v)}]),onClick:a[1]||(a[1]=e=>!D(v)&&D(m)())},[P(D(c),{size:20,class:"theme-icon"},{default:$(()=>[P(D(le))]),_:1}),V("div",Ua,[P(D(Oe),{strong:""},{default:$(()=>[...a[45]||(a[45]=[k("暗色模式",-1)])]),_:1}),P(D(Oe),{depth:"3",style:{"font-size":"12px"}},{default:$(()=>[...a[46]||(a[46]=[k("护眼的深色主题",-1)])]),_:1})]),D(v)?(U(),q("div",ja,[P(D(c),{size:20,color:"#18a058"},{default:$(()=>[P(D(me))]),_:1})])):x("",!0)],2)])])])])],512),[[B,"appearance"===p.value]]),J(V("div",Ia,[V("div",Na,[V("div",Aa,[P(D(c),{size:"24",color:"var(--text-secondary)"},{default:$(()=>[P(D(ae))]),_:1}),V("div",null,[a[48]||(a[48]=V("h3",{class:"panel-title"},"通知设置",-1)),P(D(Oe),{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(D(Oe),{strong:""},{default:$(()=>[k(N(e.label),1)]),_:2},1024),P(D(Oe),{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",Ra,[P(D(Oe),{strong:""},{default:$(()=>[...a[49]||(a[49]=[k("启用任务完成通知",-1)])]),_:1}),P(D(Oe),{depth:"3",style:{"font-size":"13px"}},{default:$(()=>[k(N(e.implementation),1)]),_:2},1024)]),P(D(ze),{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(D($e),{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",Da,[P(D(Oe),{depth:"2",style:{"font-size":"13px","margin-bottom":"12px",display:"block"}},{default:$(()=>[...a[50]||(a[50]=[k(" 选择通知方式 ",-1)])]),_:1}),P(D(Ae),{value:zl.value.platforms[e.key].type,"onUpdate:value":a=>zl.value.platforms[e.key].type=a},{default:$(()=>[P(D(Pe),{vertical:""},{default:$(()=>[P(D(Ee),{value:"notification"},{default:$(()=>[V("div",Wa,[P(D(Oe),{strong:""},{default:$(()=>[k(N(Ll("notification")),1)]),_:1}),P(D(Oe),{depth:"3",style:{"font-size":"12px",display:"block"}},{default:$(()=>[k(N($l("notification")),1)]),_:1})])]),_:1}),P(D(Ee),{value:"browser",disabled:!Nl.value},{default:$(()=>[V("div",Ya,[P(D(Oe),{strong:""},{default:$(()=>[k(N(Ll("browser")),1)]),_:1}),P(D(Oe),{depth:"3",style:{"font-size":"12px",display:"block"}},{default:$(()=>[k(N($l("browser")),1)]),_:1})])]),_:1},8,["disabled"]),P(D(Ee),{value:"dialog"},{default:$(()=>[V("div",Ja,[P(D(Oe),{strong:""},{default:$(()=>[k(N(Ll("dialog")),1)]),_:1}),P(D(Oe),{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(D($e),{key:0,type:"info",bordered:!1,style:{"margin-top":"16px"},"show-icon":!1},{default:$(()=>[V("div",Fa,[P(D(Oe),{strong:""},{default:$(()=>[...a[51]||(a[51]=[k("[TIP] 更好的通知体验",-1)])]),_:1}),P(D(Oe),{depth:"3",style:{display:"block","margin-top":"4px","font-size":"12px"}},{default:$(()=>[...a[52]||(a[52]=[k(" 安装 terminal-notifier 后,点击通知可自动打开终端 ",-1)])]),_:1}),P(D(Oe),{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(D($e),{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(D(be),{key:0})):x("",!0)],64))),128)),P(D(be)),V("div",qa,[V("div",Va,[P(D(Oe),{strong:""},{default:$(()=>[...a[54]||(a[54]=[k("远程通知渠道",-1)])]),_:1}),P(D(Oe),{depth:"3",style:{"font-size":"13px","margin-top":"4px"}},{default:$(()=>[...a[55]||(a[55]=[k(" 支持服务端注册的远程通知渠道 ",-1)])]),_:1})]),V("div",Ha,[V("div",Xa,[P(D(Be),{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(D(f),{size:"small",secondary:"",type:"primary",onClick:Tl},{icon:$(()=>[P(D(c),null,{default:$(()=>[P(D(te))]),_:1})]),default:$(()=>[a[56]||(a[56]=k(" 添加渠道 ",-1))]),_:1})]),0===zl.value.remoteNotifications.providers.length?(U(),S(D(Te),{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(D(Oe),{strong:""},{default:$(()=>[k(N(e.name||xl(e.type)),1)]),_:2},1024),P(D(Ne),{size:"tiny",bordered:!1,type:e.enabled?"success":"default"},{default:$(()=>[k(N(e.enabled?"已启用":"未启用"),1)]),_:2},1032,["type"])]),P(D(Oe),{depth:"3",style:{"font-size":"12px",display:"block"}},{default:$(()=>{return[k(N((a=e.type,wl(a)?.description||"")),1)];var a}),_:2},1024)])]),P(D(Pe),{size:"small",align:"center"},{default:$(()=>[P(D(ze),{value:e.enabled,"onUpdate:value":a=>e.enabled=a,size:"small"},null,8,["value","onUpdate:value"]),P(D(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(D(c),null,{default:$(()=>[P(D(ce))]),_:1})]),_:1},8,["onClick"])]),_:2},1024)]),V("div",at,[V("div",tt,[a[57]||(a[57]=V("span",{class:"remote-field-label"},"渠道名称",-1)),P(D(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(D(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||"测试通知发送失败");Se.success(t.message||"测试通知已发送")}catch(a){Se.error("测试失败:"+a.message)}finally{Sl.value=""}}(e)},{default:$(()=>[...a[58]||(a[58]=[k(" 测试 ",-1)])]),_:1},8,["loading","onClick"]),P(D(Oe),{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(D(Pe),{justify:"end"},{default:$(()=>[P(D(f),{size:"large",onClick:a[3]||(a[3]=e=>d.value=!1)},{default:$(()=>[...a[59]||(a[59]=[k(" 取消 ",-1)])]),_:1}),P(D(f),{type:"primary",size:"large",loading:Pl.value,disabled:JSON.stringify(zl.value)===JSON.stringify(Cl.value),onClick:Js},{icon:$(()=>[P(D(c),null,{default:$(()=>[P(D(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(D(c),{size:"24",color:"var(--text-secondary)"},{default:$(()=>[P(D(se))]),_:1}),V("div",null,[a[62]||(a[62]=V("h3",{class:"panel-title"},"高级设置",-1)),P(D(Oe),{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(D(Oe),{strong:""},{default:$(()=>[...a[63]||(a[63]=[k("端口配置",-1)])]),_:1}),P(D(Oe),{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(D(Oe),{depth:"3",style:{"font-size":"13px","margin-bottom":"6px"}},{default:$(()=>[k(N(e.label),1)]),_:2},1024),P(D(Ue),{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(D(c),null,{default:$(()=>[P(D(se))]),_:1})]),_:1},8,["value","onUpdate:value","placeholder"])]))),128))])]),P(D(be)),V("div",ft,[V("div",mt,[P(D(Oe),{strong:""},{default:$(()=>[...a[65]||(a[65]=[k("负载均衡",-1)])]),_:1}),P(D(Oe),{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(D(Oe),{depth:"2",style:{"font-size":"13px"}},{default:$(()=>[...a[67]||(a[67]=[k("多渠道负载会话绑定",-1)])]),_:1}),P(D(Oe),{depth:"3",style:{"font-size":"12px"}},{default:$(()=>[...a[68]||(a[68]=[k("开启后同一对话始终使用同一渠道,保证上下文连续性",-1)])]),_:1})]),P(D(ze),{value:Fe.value.enableSessionBinding,"onUpdate:value":[a[4]||(a[4]=e=>Fe.value.enableSessionBinding=e),Ds],size:"medium"},null,8,["value"])])])]),P(D(be)),V("div",bt,[V("div",wt,[P(D(Oe),{strong:""},{default:$(()=>[...a[69]||(a[69]=[k("日志和性能",-1)])]),_:1}),P(D(Oe),{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(D(Oe),{depth:"2",style:{"font-size":"13px"}},{default:$(()=>[...a[71]||(a[71]=[k("实时日志保留数量",-1)])]),_:1}),P(D(Oe),{depth:"3",style:{"font-size":"12px"}},{default:$(()=>[...a[72]||(a[72]=[k("超过此数量将自动清理旧日志",-1)])]),_:1})]),P(D(Ue),{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(D(Oe),{depth:"3",style:{"font-size":"12px"}},{default:$(()=>[...a[73]||(a[73]=[k("条",-1)])]),_:1})]),_:1},8,["value"])]),V("div",zt,[V("div",Ct,[P(D(Oe),{depth:"2",style:{"font-size":"13px"}},{default:$(()=>[...a[74]||(a[74]=[k("统计数据刷新间隔",-1)])]),_:1}),P(D(Oe),{depth:"3",style:{"font-size":"12px"}},{default:$(()=>[...a[75]||(a[75]=[k("自动刷新今日统计的时间间隔",-1)])]),_:1})]),P(D(Ue),{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(D(Oe),{depth:"3",style:{"font-size":"12px"}},{default:$(()=>[...a[76]||(a[76]=[k("秒",-1)])]),_:1})]),_:1},8,["value"])]),V("div",Pt,[V("div",St,[P(D(Oe),{depth:"2",style:{"font-size":"13px"}},{default:$(()=>[...a[77]||(a[77]=[k("CLI 原生会话日志",-1)])]),_:1}),P(D(Oe),{depth:"3",style:{"font-size":"12px"}},{default:$(()=>[...a[78]||(a[78]=[k("读取各 CLI 工具自己的会话日志,配置保存后立即生效",-1)])]),_:1})]),P(D(ze),{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(D(Oe),{depth:"2",style:{"font-size":"13px"}},{default:$(()=>[...a[79]||(a[79]=[k("CLI 原生日志读取间隔",-1)])]),_:1}),P(D(Oe),{depth:"3",style:{"font-size":"12px"}},{default:$(()=>[...a[80]||(a[80]=[k("轮询原生会话日志的时间间隔",-1)])]),_:1})]),P(D(Ue),{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(D(Oe),{depth:"3",style:{"font-size":"12px"}},{default:$(()=>[...a[81]||(a[81]=[k("秒",-1)])]),_:1})]),_:1},8,["value"])])])]),P(D(be)),V("div",jt,[V("div",It,[P(D(Oe),{strong:""},{default:$(()=>[...a[82]||(a[82]=[k("开机自启",-1)])]),_:1}),P(D(Oe),{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(D(Oe),{strong:"",style:{flex:"1"}},{default:$(()=>[k(N(Re.value),1)]),_:1}),ge.value?(U(),S(D(f),{key:1,type:"warning",size:"small",loading:Me.value,onClick:Zs},{icon:$(()=>[P(D(c),null,{default:$(()=>[P(D(ve))]),_:1})]),default:$(()=>[a[85]||(a[85]=k(" 禁用自启 ",-1))]),_:1},8,["loading"])):(U(),S(D(f),{key:0,type:"primary",size:"small",loading:Me.value,onClick:Ks},{icon:$(()=>[P(D(c),null,{default:$(()=>[P(D(me))]),_:1})]),default:$(()=>[a[84]||(a[84]=k(" 启用自启 ",-1))]),_:1},8,["loading"]))]),P(D(Oe),{depth:"3",style:{"font-size":"12px"}},{default:$(()=>[k(N(We.value),1)]),_:1})])])])])]),V("div",$t,[P(D(Pe),{justify:"end"},{default:$(()=>[P(D(f),{size:"large",onClick:a[9]||(a[9]=e=>d.value=!1)},{default:$(()=>[...a[86]||(a[86]=[k(" 取消 ",-1)])]),_:1}),P(D(f),{type:"primary",size:"large",loading:C.value,disabled:!Cs.value,onClick:Hs},{icon:$(()=>[P(D(c),null,{default:$(()=>[P(D(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(D(c),{size:"24",color:"var(--text-secondary)"},{default:$(()=>[P(D(de))]),_:1}),V("div",null,[a[89]||(a[89]=V("h3",{class:"panel-title"},"安全设置",-1)),P(D(Oe),{depth:"3",class:"panel-subtitle"},{default:$(()=>[...a[88]||(a[88]=[k("设置访问密码,保护面板访问",-1)])]),_:1})])])]),V("div",Et,[V("div",Rt,[V("div",Dt,[V("div",Wt,[P(D(Oe),{strong:""},{default:$(()=>[...a[90]||(a[90]=[k("访问保护",-1)])]),_:1}),P(D(Oe),{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(D(Ne),{key:0,type:"success",bordered:!1},{default:$(()=>[...a[92]||(a[92]=[k(" 已启用 ",-1)])]),_:1})):(U(),S(D(Ne),{key:1,type:"warning",bordered:!1},{default:$(()=>[...a[93]||(a[93]=[k(" 未启用 ",-1)])]),_:1}))])]),P(D(be)),V("div",Jt,[V("div",Ft,[P(D(Oe),{strong:""},{default:$(()=>[k(N(Ml.value.hasPassword?"修改密码":"设置密码"),1)]),_:1}),P(D(Oe),{depth:"3",style:{"font-size":"13px","margin-top":"4px"}},{default:$(()=>[...a[94]||(a[94]=[k(" 密码至少 4 位,建议包含数字与字母 ",-1)])]),_:1}),P(D(Oe),{depth:"3",style:{"font-size":"12px","margin-top":"4px"}},{default:$(()=>[a[96]||(a[96]=k(" 忘记密码可在终端执行 ",-1)),P(D(Oe),{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(D(Ie),{key:0,value:Dl.value.currentPassword,"onUpdate:value":a[10]||(a[10]=e=>Dl.value.currentPassword=e),type:"password",placeholder:"当前密码","show-password-on":"click"},null,8,["value"])):x("",!0),P(D(Ie),{value:Dl.value.newPassword,"onUpdate:value":a[11]||(a[11]=e=>Dl.value.newPassword=e),type:"password",placeholder:"新密码","show-password-on":"click"},null,8,["value"]),P(D(Ie),{value:Dl.value.confirmPassword,"onUpdate:value":a[12]||(a[12]=e=>Dl.value.confirmPassword=e),type:"password",placeholder:"确认新密码","show-password-on":"click"},null,8,["value"]),Yl.value?(U(),S(D(Oe),{key:1,depth:"3",class:"security-error"},{default:$(()=>[k(N(Yl.value),1)]),_:1})):x("",!0)])])])]),V("div",Vt,[P(D(Pe),{justify:"end"},{default:$(()=>[P(D(f),{size:"large",onClick:a[13]||(a[13]=e=>d.value=!1)},{default:$(()=>[...a[98]||(a[98]=[k(" 取消 ",-1)])]),_:1}),P(D(f),{type:"primary",size:"large",loading:Wl.value,disabled:!Jl.value,onClick:Vs},{icon:$(()=>[P(D(c),null,{default:$(()=>[P(D(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(D(c),{size:"24",color:"var(--text-secondary)"},{default:$(()=>[P(D(re))]),_:1}),V("div",null,[a[101]||(a[101]=V("h3",{class:"panel-title"},"模型设置",-1)),P(D(Oe),{depth:"3",class:"panel-subtitle"},{default:$(()=>[...a[100]||(a[100]=[k("管理默认测速模型、模型上下文窗口和定价信息",-1)])]),_:1}),P(D(Oe),{depth:"3",class:"panel-subtitle"},{default:$(()=>[k(" 价格来源:Models.dev 参考价格(离线快照) · "+N(ql.value.lastUpdated||"日期未知"),1)]),_:1})])])]),V("div",Zt,[P(D(Ce),{show:Vl.value},{default:$(()=>[V("div",Gt,[V("div",Qt,[P(D(Oe),{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(D(Oe),{depth:"3",style:{"font-size":"12px"}},{default:$(()=>[k(N(e.label),1)]),_:2},1024)]),P(D(Be),{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(D(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(D(f),{size:"small",type:"primary",onClick:ds},{icon:$(()=>[P(D(c),null,{default:$(()=>[P(D(te))]),_:1})]),default:$(()=>[a[103]||(a[103]=k(" 新增 ",-1))]),_:1})]),V("div",ll,[P(D(Ae),{value:Ql.value,"onUpdate:value":a[15]||(a[15]=e=>Ql.value=e),size:"small"},{default:$(()=>[P(D(Ee),{value:"all"},{default:$(()=>[...a[104]||(a[104]=[k("全部",-1)])]),_:1}),P(D(Ee),{value:"claude"},{default:$(()=>[...a[105]||(a[105]=[k("Claude",-1)])]),_:1}),P(D(Ee),{value:"openai"},{default:$(()=>[...a[106]||(a[106]=[k("OpenAI",-1)])]),_:1}),P(D(Ee),{value:"gemini"},{default:$(()=>[...a[107]||(a[107]=[k("Gemini",-1)])]),_:1}),P(D(Ee),{value:"compatible"},{default:$(()=>[...a[108]||(a[108]=[k("OpenCode / OMP",-1)])]),_:1}),P(D(Ee),{value:"overrides"},{default:$(()=>[...a[109]||(a[109]=[k("自定义",-1)])]),_:1})]),_:1},8,["value"])]),0===ys.value.length?(U(),q("div",sl,[P(D(Te),{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(D(c),{size:"14",class:"expand-icon"},{default:$(()=>[P(D(ye))]),_:1}),V("span",ol,N(e),1),Kl.value[e]?(U(),S(D(Ne),{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]=R(()=>{},["stop"]))},[Kl.value[e]&&vs(e)?(U(),S(D(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(),Se.success(`${e} 已重置为内置默认值`)}catch(a){Se.error("重置失败:"+a.message)}}(e)},{default:$(()=>[...a[111]||(a[111]=[k(" 重置 ",-1)])]),_:1},8,["onClick"])):x("",!0),fs(e)?(U(),S(D(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(),Se.success(`已删除模型:${e}`)}catch(a){Se.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(D(Oe),{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(D(Oe),{depth:"3",style:{"font-size":"11px"}},{default:$(()=>[...a[114]||(a[114]=[k("Context 窗口 (tokens)",-1)])]),_:1}),P(D(Ue),{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(D(Oe),{depth:"3",style:{"font-size":"11px"}},{default:$(()=>[...a[115]||(a[115]=[k("Max Output (tokens)",-1)])]),_:1}),P(D(Ue),{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(D(Oe),{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(D(Oe),{depth:"3",style:{"font-size":"11px"}},{default:$(()=>[...a[117]||(a[117]=[k("输入价格",-1)])]),_:1}),P(D(Ue),{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(D(Oe),{depth:"3",style:{"font-size":"11px"}},{default:$(()=>[...a[118]||(a[118]=[k("输出价格",-1)])]),_:1}),P(D(Ue),{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(D(Oe),{depth:"3",style:{"font-size":"11px"}},{default:$(()=>[...a[119]||(a[119]=[k("缓存写入价格",-1)])]),_:1}),P(D(Ue),{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(D(Oe),{depth:"3",style:{"font-size":"11px"}},{default:$(()=>[...a[120]||(a[120]=[k("缓存读取价格",-1)])]),_:1}),P(D(Ue),{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(D(Pe),{justify:"end"},{default:$(()=>[P(D(f),{size:"large",onClick:zs,disabled:0===Object.keys(Kl.value).length},{default:$(()=>[...a[121]||(a[121]=[k(" 重置全部 ",-1)])]),_:1},8,["disabled"]),P(D(f),{type:"primary",size:"large",loading:Hl.value,disabled:!rs.value,onClick:_s},{icon:$(()=>[P(D(c),null,{default:$(()=>[P(D(fe))]),_:1})]),default:$(()=>[a[122]||(a[122]=k(" 保存设置 ",-1))]),_:1},8,["loading","disabled"])]),_:1})])],512),[[B,"model-settings"===p.value]])])]),P(D(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(D(Pe),{vertical:"",size:12},{default:$(()=>[V("div",null,[P(D(Oe),{depth:"3",style:{"font-size":"12px"}},{default:$(()=>[...a[123]||(a[123]=[k("模型 ID",-1)])]),_:1}),P(D(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(D(Oe),{depth:"3",style:{"font-size":"12px"}},{default:$(()=>[...a[124]||(a[124]=[k("Context 窗口",-1)])]),_:1}),P(D(Ue),{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(D(Oe),{depth:"3",style:{"font-size":"12px"}},{default:$(()=>[...a[125]||(a[125]=[k("Max Output",-1)])]),_:1}),P(D(Ue),{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(D(Oe),{depth:"3",style:{"font-size":"12px"}},{default:$(()=>[...a[126]||(a[126]=[k("输入价格",-1)])]),_:1}),P(D(Ue),{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(D(Oe),{depth:"3",style:{"font-size":"12px"}},{default:$(()=>[...a[127]||(a[127]=[k("输出价格",-1)])]),_:1}),P(D(Ue),{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(D(Oe),{depth:"3",style:{"font-size":"12px"}},{default:$(()=>[...a[128]||(a[128]=[k("缓存写入价格",-1)])]),_:1}),P(D(Ue),{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(D(Oe),{depth:"3",style:{"font-size":"12px"}},{default:$(()=>[...a[129]||(a[129]=[k("缓存读取价格",-1)])]),_:1}),P(D(Ue),{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(D(Oe),{key:0,depth:"3",class:"security-error"},{default:$(()=>[k(N(us.value),1)]),_:1})):x("",!0),P(D(Pe),{justify:"end"},{default:$(()=>[P(D(f),{onClick:cs},{default:$(()=>[...a[130]||(a[130]=[k("取消",-1)])]),_:1}),P(D(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};
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-V_onl9NV.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-BKlAWTH-.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};
@@ -0,0 +1 @@
1
+ import{t as a}from"./_plugin-vue_export-helper-BeLZJZij.js";import{O as r,W as e,b as s,et as l,mt as t,r as o,w as i}from"./vue-vendor-BqZbbXHA.js";import{O as m}from"./light-0eavxNvt.js";import{t as p}from"./SkillsPanel-rqnqAOGL.js";import{jt as u}from"./index-BKlAWTH-.js";var f={class:"skill-manager"},n=a({__name:"SkillManager",setup(a){const n=o(),{byCapability:d}=u(),v=s(()=>d("skills").map(a=>a.key)),y=s(()=>{const a=Array.isArray(n.query.platform)?n.query.platform[0]:n.query.platform;return v.value.includes(a)?a:""});return(a,s)=>(e(),i("div",f,[r(t(m),{title:"Skills 技能管理",bordered:!1},{default:l(()=>[r(p,{"in-drawer":!1,"hide-back":!0,platform:y.value},null,8,["platform"])]),_:1})]))}},[["__scopeId","data-v-350fb0fd"]]);export{n as default};
@@ -1 +1 @@
1
- import{t as e}from"./_plugin-vue_export-helper-BeLZJZij.js";import{O as a,S as t,W as r,b as s,et as l,mt as o,x as i}from"./vue-vendor-BqZbbXHA.js";import{n as p,t as d}from"./useResponsiveDrawer-D-DDpbnI.js";import{t as n}from"./DrawerContent-ChXgZ1Xm.js";import{t as m}from"./SkillsPanel--lLEts9y.js";var u=e({__name:"SkillsDrawer",props:{visible:{type:Boolean,default:!1},platform:{type:String,default:""},projectPath:{type:String,default:""}},emits:["update:visible"],setup(e,{emit:u}){const f=e,v=u,{drawerWidth:c}=d(720),h=s({get:()=>f.visible,set:e=>v("update:visible",e)}),w={padding:0,display:"flex",flexDirection:"column",overflow:"hidden"};return(e,s)=>(r(),t(o(p),{show:h.value,"onUpdate:show":s[1]||(s[1]=e=>h.value=e),width:o(c),placement:"right","mask-closable":!0},{default:l(()=>[a(o(n),{closable:"","native-scrollbar":!1,"body-content-style":w},{header:l(()=>[...s[2]||(s[2]=[i("div",{class:"drawer-header"},"技能管理",-1)])]),default:l(()=>[a(m,{"in-drawer":!0,"hide-back":!0,"drawer-visible":h.value,platform:f.platform,"project-path":f.projectPath,onBack:s[0]||(s[0]=e=>h.value=!1)},null,8,["drawer-visible","platform","project-path"])]),_:1})]),_:1},8,["show","width"]))}},[["__scopeId","data-v-a4957f96"]]);export{u as default};
1
+ import{t as e}from"./_plugin-vue_export-helper-BeLZJZij.js";import{O as a,S as t,W as r,b as s,et as l,mt as o,x as i}from"./vue-vendor-BqZbbXHA.js";import{n as p,t as d}from"./useResponsiveDrawer-V_onl9NV.js";import{t as n}from"./DrawerContent-ChXgZ1Xm.js";import{t as m}from"./SkillsPanel-rqnqAOGL.js";var u=e({__name:"SkillsDrawer",props:{visible:{type:Boolean,default:!1},platform:{type:String,default:""},projectPath:{type:String,default:""}},emits:["update:visible"],setup(e,{emit:u}){const f=e,v=u,{drawerWidth:c}=d(720),h=s({get:()=>f.visible,set:e=>v("update:visible",e)}),w={padding:0,display:"flex",flexDirection:"column",overflow:"hidden"};return(e,s)=>(r(),t(o(p),{show:h.value,"onUpdate:show":s[1]||(s[1]=e=>h.value=e),width:o(c),placement:"right","mask-closable":!0},{default:l(()=>[a(o(n),{closable:"","native-scrollbar":!1,"body-content-style":w},{header:l(()=>[...s[2]||(s[2]=[i("div",{class:"drawer-header"},"技能管理",-1)])]),default:l(()=>[a(m,{"in-drawer":!0,"hide-back":!0,"drawer-visible":h.value,platform:f.platform,"project-path":f.projectPath,onBack:s[0]||(s[0]=e=>h.value=!1)},null,8,["drawer-visible","platform","project-path"])]),_:1})]),_:1},8,["show","width"]))}},[["__scopeId","data-v-a4957f96"]]);export{u as default};
@@ -1 +1 @@
1
- .source-item[data-v-f428a4a6]{max-width:100%}.repo-manager[data-v-059e6be9]{flex-direction:column;gap:16px;display:flex}.repo-list[data-v-059e6be9]{flex-direction:column;gap:8px;display:flex}.repo-item[data-v-059e6be9]{background:var(--bg-tertiary);border-radius:6px;justify-content:space-between;align-items:flex-start;padding:10px 12px;display:flex}.repo-main[data-v-059e6be9]{align-items:flex-start;gap:10px;display:flex}.repo-info[data-v-059e6be9]{flex-direction:column;gap:4px;display:flex}.repo-name-row[data-v-059e6be9]{flex-wrap:wrap;align-items:center;gap:6px;display:flex}.repo-name[data-v-059e6be9]{color:var(--text-primary);font-size:13px;font-weight:500}.repo-branch[data-v-059e6be9],.repo-auth-hint[data-v-059e6be9]{color:var(--text-tertiary);font-size:11px}.repo-actions[data-v-059e6be9]{flex-shrink:0;align-items:center;gap:8px;padding-left:12px;display:flex}.empty-hint[data-v-059e6be9]{text-align:center;color:var(--text-tertiary);padding:20px;font-size:13px}.add-repo[data-v-059e6be9]{border-top:1px solid var(--border-primary);padding-top:8px}.add-title[data-v-059e6be9]{color:var(--text-primary);margin-bottom:10px;font-size:13px;font-weight:500}.add-form[data-v-059e6be9]{gap:8px;display:flex}.repo-input[data-v-059e6be9]{flex:1}.branch-input[data-v-059e6be9]{width:80px}.add-hint[data-v-059e6be9]{color:var(--text-tertiary);margin-top:6px;font-size:11px}.tips[data-v-059e6be9]{padding-top:8px}.recommended[data-v-059e6be9]{border-top:1px solid var(--border-primary);padding-top:12px}.recommended-title[data-v-059e6be9]{color:var(--text-primary);align-items:center;gap:6px;margin-bottom:10px;font-size:13px;font-weight:500;display:flex}.recommended-title[data-v-059e6be9]:before{content:"";background:#18a058;border-radius:2px;width:3px;height:14px}.recommended-list[data-v-059e6be9]{flex-direction:column;gap:6px;display:flex}.recommended-item[data-v-059e6be9]{background:var(--bg-tertiary);cursor:pointer;border-radius:5px;justify-content:space-between;align-items:center;padding:8px 10px;transition:all .15s;display:flex}.recommended-item[data-v-059e6be9]:not(.added):hover{background:var(--bg-secondary);box-shadow:0 2px 8px #18a0581a}.recommended-item.added[data-v-059e6be9]{cursor:default;opacity:.6;background:var(--bg-secondary)}.rec-info[data-v-059e6be9]{flex-direction:column;gap:2px;display:flex}.rec-name[data-v-059e6be9]{color:var(--text-primary);font-size:12px;font-weight:500}.rec-desc[data-v-059e6be9]{color:var(--text-tertiary);font-size:11px}.add-icon[data-v-059e6be9]{color:#18a058}.auth-manager[data-v-059e6be9]{flex-direction:column;gap:14px;display:flex}.auth-meta[data-v-059e6be9]{background:var(--bg-tertiary);border-radius:8px;flex-direction:column;gap:8px;padding:10px 12px;display:flex}.auth-meta-row[data-v-059e6be9]{justify-content:space-between;align-items:flex-start;gap:12px;display:flex}.auth-label[data-v-059e6be9]{color:var(--text-tertiary);font-size:12px}.auth-value[data-v-059e6be9]{color:var(--text-primary);text-align:right;word-break:break-all;font-size:12px}.auth-footnote[data-v-059e6be9]{color:var(--text-tertiary);font-size:11px}.auth-actions[data-v-059e6be9]{justify-content:flex-end;gap:8px;display:flex}.modal-footer[data-v-d5c75ec8]{justify-content:flex-end;gap:12px;display:flex}.file-list[data-v-d5c75ec8]{flex-direction:column;gap:8px;width:100%;display:flex}.file-item[data-v-d5c75ec8]{justify-content:space-between;align-items:center;display:flex}.file-info[data-v-d5c75ec8]{align-items:center;gap:8px;display:flex}.file-icon[data-v-d5c75ec8]{color:var(--n-text-color-3)}.file-path[data-v-d5c75ec8]{font-family:monospace;font-size:13px}.file-size[data-v-d5c75ec8]{color:var(--n-text-color-3);font-size:12px}.file-actions[data-v-d5c75ec8]{gap:8px;display:flex}.skill-md[data-v-d5c75ec8]{border-color:var(--n-primary-color)}.scan-settings[data-v-c6883975]{flex-direction:column;display:flex}.section-title[data-v-c6883975]{color:var(--text-secondary);margin-bottom:8px;font-size:13px;font-weight:600}.setting-row[data-v-c6883975]{border-bottom:1px solid var(--border-light);justify-content:space-between;align-items:center;gap:20px;padding:12px 0;display:flex}.setting-row[data-v-c6883975]:last-child{border-bottom:0}.setting-copy[data-v-c6883975]{min-width:0}.setting-label[data-v-c6883975]{color:var(--text-primary);font-weight:500}.setting-description[data-v-c6883975]{color:var(--text-tertiary);margin-top:3px;font-size:12px;line-height:1.45}.modal-actions[data-v-c6883975]{justify-content:flex-end;gap:8px;display:flex}.back-btn[data-v-4b8f10ec]{padding:4px}.action-btn[data-v-4b8f10ec]{padding:4px 8px}
1
+ .source-item[data-v-f428a4a6]{max-width:100%}.repo-manager[data-v-059e6be9]{flex-direction:column;gap:16px;display:flex}.repo-list[data-v-059e6be9]{flex-direction:column;gap:8px;display:flex}.repo-item[data-v-059e6be9]{background:var(--bg-tertiary);border-radius:6px;justify-content:space-between;align-items:flex-start;padding:10px 12px;display:flex}.repo-main[data-v-059e6be9]{align-items:flex-start;gap:10px;display:flex}.repo-info[data-v-059e6be9]{flex-direction:column;gap:4px;display:flex}.repo-name-row[data-v-059e6be9]{flex-wrap:wrap;align-items:center;gap:6px;display:flex}.repo-name[data-v-059e6be9]{color:var(--text-primary);font-size:13px;font-weight:500}.repo-branch[data-v-059e6be9],.repo-auth-hint[data-v-059e6be9]{color:var(--text-tertiary);font-size:11px}.repo-actions[data-v-059e6be9]{flex-shrink:0;align-items:center;gap:8px;padding-left:12px;display:flex}.empty-hint[data-v-059e6be9]{text-align:center;color:var(--text-tertiary);padding:20px;font-size:13px}.add-repo[data-v-059e6be9]{border-top:1px solid var(--border-primary);padding-top:8px}.add-title[data-v-059e6be9]{color:var(--text-primary);margin-bottom:10px;font-size:13px;font-weight:500}.add-form[data-v-059e6be9]{gap:8px;display:flex}.repo-input[data-v-059e6be9]{flex:1}.branch-input[data-v-059e6be9]{width:80px}.add-hint[data-v-059e6be9]{color:var(--text-tertiary);margin-top:6px;font-size:11px}.tips[data-v-059e6be9]{padding-top:8px}.recommended[data-v-059e6be9]{border-top:1px solid var(--border-primary);padding-top:12px}.recommended-title[data-v-059e6be9]{color:var(--text-primary);align-items:center;gap:6px;margin-bottom:10px;font-size:13px;font-weight:500;display:flex}.recommended-title[data-v-059e6be9]:before{content:"";background:#18a058;border-radius:2px;width:3px;height:14px}.recommended-list[data-v-059e6be9]{flex-direction:column;gap:6px;display:flex}.recommended-item[data-v-059e6be9]{background:var(--bg-tertiary);cursor:pointer;border-radius:5px;justify-content:space-between;align-items:center;padding:8px 10px;transition:all .15s;display:flex}.recommended-item[data-v-059e6be9]:not(.added):hover{background:var(--bg-secondary);box-shadow:0 2px 8px #18a0581a}.recommended-item.added[data-v-059e6be9]{cursor:default;opacity:.6;background:var(--bg-secondary)}.rec-info[data-v-059e6be9]{flex-direction:column;gap:2px;display:flex}.rec-name[data-v-059e6be9]{color:var(--text-primary);font-size:12px;font-weight:500}.rec-desc[data-v-059e6be9]{color:var(--text-tertiary);font-size:11px}.add-icon[data-v-059e6be9]{color:#18a058}.auth-manager[data-v-059e6be9]{flex-direction:column;gap:14px;display:flex}.auth-meta[data-v-059e6be9]{background:var(--bg-tertiary);border-radius:8px;flex-direction:column;gap:8px;padding:10px 12px;display:flex}.auth-meta-row[data-v-059e6be9]{justify-content:space-between;align-items:flex-start;gap:12px;display:flex}.auth-label[data-v-059e6be9]{color:var(--text-tertiary);font-size:12px}.auth-value[data-v-059e6be9]{color:var(--text-primary);text-align:right;word-break:break-all;font-size:12px}.auth-footnote[data-v-059e6be9]{color:var(--text-tertiary);font-size:11px}.auth-actions[data-v-059e6be9]{justify-content:flex-end;gap:8px;display:flex}.modal-footer[data-v-d5c75ec8]{justify-content:flex-end;gap:12px;display:flex}.file-list[data-v-d5c75ec8]{flex-direction:column;gap:8px;width:100%;display:flex}.file-item[data-v-d5c75ec8]{justify-content:space-between;align-items:center;display:flex}.file-info[data-v-d5c75ec8]{align-items:center;gap:8px;display:flex}.file-icon[data-v-d5c75ec8]{color:var(--n-text-color-3)}.file-path[data-v-d5c75ec8]{font-family:monospace;font-size:13px}.file-size[data-v-d5c75ec8]{color:var(--n-text-color-3);font-size:12px}.file-actions[data-v-d5c75ec8]{gap:8px;display:flex}.skill-md[data-v-d5c75ec8]{border-color:var(--n-primary-color)}.scan-settings[data-v-c6883975]{flex-direction:column;display:flex}.section-title[data-v-c6883975]{color:var(--text-secondary);margin-bottom:8px;font-size:13px;font-weight:600}.setting-row[data-v-c6883975]{border-bottom:1px solid var(--border-light);justify-content:space-between;align-items:center;gap:20px;padding:12px 0;display:flex}.setting-row[data-v-c6883975]:last-child{border-bottom:0}.setting-copy[data-v-c6883975]{min-width:0}.setting-label[data-v-c6883975]{color:var(--text-primary);font-weight:500}.setting-description[data-v-c6883975]{color:var(--text-tertiary);margin-top:3px;font-size:12px;line-height:1.45}.modal-actions[data-v-c6883975]{justify-content:flex-end;gap:8px;display:flex}.back-btn[data-v-efda7d55]{padding:4px}.action-btn[data-v-efda7d55]{padding:4px 8px}
@@ -0,0 +1 @@
1
+ import{N as e,gn as a,gt as l,hn as t,ht as s,i,s as r,t as o}from"./_plugin-vue_export-helper-BeLZJZij.js";import{A as n,C as u,D as c,K as d,M as v,O as p,S as f,V as m,W as y,Z as b,_t as h,at as k,b as g,et as w,g as _,ht as j,m as C,mt as P,p as S,r as x,st as z,w as U,x as L}from"./vue-vendor-BqZbbXHA.js";import{r as $,s as T,t as O}from"./platforms-DWXgmy2w.js";import{C as B,K,Nt as G,Pt as A,W as E,X as M,_ as H,dt as I,et as D,h as N,it as R,jt as q,q as V,tt as F,z as W}from"./icons-DmFe4b5j.js";import{t as J}from"./use-message-DqCwefG6.js";import{O as Z,l as Q,n as X}from"./light-0eavxNvt.js";import{c as Y,n as ee,s as ae,t as le}from"./AssetPathField-C9TOPl7o.js";import{n as te,t as se}from"./Upload-CdyVHxCI.js";import{n as ie,t as re}from"./useResponsiveDrawer-V_onl9NV.js";import{t as oe}from"./DrawerContent-ChXgZ1Xm.js";import{B as ne,F as ue,I as ce,K as de,N as ve,P as pe,V as fe,a as me,c as ye,d as be,dt as he,f as ke,ft as ge,gt as we,h as _e,i as je,jt as Ce,l as Pe,m as Se,mt as xe,n as ze,o as Ue,p as Le,r as $e,rt as Te,s as Oe,t as Be,u as Ke}from"./index-BKlAWTH-.js";import{t as Ge}from"./clipboard-B46yyoz_.js";import{t as Ae}from"./markdown-u082bbtj.js";import{t as Ee}from"./MarkdownEditor-9TTwTS-U.js";import{a as Me,c as He}from"./project-config-B2baPzYL.js";import{n as Ie,t as De}from"./skill-repo-input-B_fkGlUK.js";var Ne=a("p","\n box-sizing: border-box;\n transition: color .3s var(--n-bezier);\n margin: var(--n-margin);\n font-size: var(--n-font-size);\n line-height: var(--n-line-height);\n color: var(--n-text-color);\n",[t("&:first-child","margin-top: 0;"),t("&:last-child","margin-bottom: 0;")]),Re=n({name:"P",props:Object.assign(Object.assign({},e.props),{depth:[String,Number]}),setup(a){const{mergedClsPrefixRef:t,inlineThemeDisabled:i}=l(a),r=e("Typography","-p",Ne,X,a,t),o=g(()=>{const{depth:e}=a,l=e||"1",{common:{cubicBezierEaseInOut:t},self:{pFontSize:s,pLineHeight:i,pMargin:o,pTextColor:n,[`pTextColor${l}Depth`]:u}}=r.value;return{"--n-bezier":t,"--n-font-size":s,"--n-line-height":i,"--n-margin":o,"--n-text-color":void 0===e?n:u}}),n=i?s("p",g(()=>`${a.depth||""}`),o,a):void 0;return{mergedClsPrefix:t,cssVars:i?void 0:o,themeClass:null==n?void 0:n.themeClass,onRender:null==n?void 0:n.onRender}},render(){var e;return null===(e=this.onRender)||void 0===e||e.call(this),v("p",{class:[`${this.mergedClsPrefix}-p`,this.themeClass],style:this.cssVars},this.$slots)}});function qe(e={}){return Boolean(e?.isLocal||"local"===e?.source)}function Ve(e={}){return Boolean("local-repo"===e?.source||"local"===e?.repoProvider||e?.repoLocalPath)}function Fe(e={}){return Boolean("gitlab"===e?.repoProvider||e?.repoProjectPath)}function We(e={}){return Boolean("github"===e?.repoProvider||(e?.repoOwner||e?.repoName)&&!Fe(e)&&!Ve(e))}function Je(e={}){return e?.protected||"system-installed"===e?.source?"系统":e?.sourceProvider?`${{native:"OMP 原生","omp-plugins":"OMP 插件",claude:"Claude","claude-plugins":"Claude 插件",agents:"Agents",codex:"Codex",opencode:"OpenCode",github:"GitHub",gitlab:"GitLab","local-repo":"本地仓库",remote:"远端",custom:"自定义","cc-tool":"本地技能"}[e.sourceProvider]||e.sourceProvider} · ${"project"===e.sourceScope?"项目":"全局"}`:"native-installed"===e?.source?"原生":Ve(e)?"本地仓库":qe(e)?"本地技能":Fe(e)?"GitLab":We(e)?"GitHub":""}function Ze(e={}){return qe(e)&&!Ve(e)?"":Ve(e)?e?.repoLocalPath||"":Fe(e)?e?.repoProjectPath||[e?.repoOwner,e?.repoName].filter(Boolean).join("/"):We(e)?[e?.repoOwner,e?.repoName].filter(Boolean).join("/"):""}function Qe(e={}){return qe(e)||Ve(e)?null:e?.readmeUrl||e?.repoUrl||null}function Xe(e={}){return Fe(e)?"GitLab":We(e)?"GitHub":"仓库"}function Ye(e={}){const a=Je(e),l=Ze(e);return a&&l?`${a} · ${l}`:a||"未知来源"}var ea={class:"asset-card-main"},aa={class:"asset-card-top"},la={class:"asset-card-title-stack"},ta={class:"asset-card-title-row"},sa={class:"asset-name"},ia={class:"asset-tags"},ra={key:0,class:"asset-description"},oa={class:"asset-meta"},na={class:"asset-meta-item mono"},ua=["title"],ca=["href"],da=o({__name:"SkillCard",props:{skill:{type:Object,required:!0},toggling:{type:Boolean,default:!1},panelScope:{type:String,default:"user"}},emits:["click","toggle","approve"],setup:e=>(a,l)=>{return y(),U("div",{class:j(["skill-card asset-card",{"is-enabled":e.skill.enabled,"is-protected":e.skill.protected}]),onClick:l[4]||(l[4]=l=>a.$emit("click",e.skill))},[L("div",ea,[L("div",aa,[L("div",la,[L("div",ta,[L("span",{class:j(["asset-status-dot",{active:e.skill.enabled}])},null,2),L("span",sa,h(e.skill.name),1)]),L("div",ia,[e.skill.enabled?(y(),f(P(xe),{key:0,type:"success",size:"tiny",bordered:!1},{default:w(()=>[...l[5]||(l[5]=[c("已启用",-1)])]),_:1})):(y(),f(P(xe),{key:1,type:"default",size:"tiny",bordered:!1},{default:w(()=>[...l[6]||(l[6]=[c("已关闭",-1)])]),_:1})),e.skill.cached?(y(),f(P(xe),{key:2,type:"info",size:"tiny",bordered:!1},{default:w(()=>[...l[7]||(l[7]=[c("已缓存",-1)])]),_:1})):u("",!0),"approved"===e.skill.trust?(y(),f(P(xe),{key:3,type:"success",size:"tiny",bordered:!1},{default:w(()=>[...l[8]||(l[8]=[c("已批准",-1)])]),_:1})):u("",!0),"blocked"===e.skill.trust?(y(),f(P(xe),{key:4,type:"error",size:"tiny",bordered:!1},{default:w(()=>[...l[9]||(l[9]=[c("已阻止",-1)])]),_:1})):u("",!0),"pending"===e.skill.trust?(y(),f(P(xe),{key:5,type:"warning",size:"tiny",bordered:!1},{default:w(()=>[...l[10]||(l[10]=[c("待审批",-1)])]),_:1})):u("",!0),"needs_review"===e.skill.trust?(y(),f(P(xe),{key:6,type:"warning",size:"tiny",bordered:!1},{default:w(()=>[...l[11]||(l[11]=[c("需复审",-1)])]),_:1})):u("",!0),e.skill.protected?(y(),f(P(xe),{key:7,type:"default",size:"tiny",bordered:!1},{default:w(()=>[...l[12]||(l[12]=[c("受保护",-1)])]),_:1})):u("",!0),"unsupported"===e.skill.projection?.state?(y(),f(P(xe),{key:8,type:"warning",size:"tiny",bordered:!1},{default:w(()=>[...l[13]||(l[13]=[c("不支持投影",-1)])]),_:1})):u("",!0),P(Je)(e.skill)?(y(),f(P(xe),{key:9,type:"info",size:"tiny",bordered:!1},{default:w(()=>[c(h(P(Je)(e.skill)),1)]),_:1})):u("",!0)])])]),e.skill.description?(y(),U("div",ra,h((t=e.skill.description,s=120,t?.length>s?t.slice(0,s)+"...":t)),1)):u("",!0),L("div",oa,[L("span",na,h(e.skill.directory),1),P(Ze)(e.skill)?(y(),U("span",{key:0,class:"asset-meta-item source-item",title:P(Ze)(e.skill)},h(P(Ze)(e.skill)),9,ua)):u("",!0),P(Qe)(e.skill)?(y(),U("a",{key:1,class:"asset-link",href:P(Qe)(e.skill),target:"_blank",rel:"noopener noreferrer",onClick:l[0]||(l[0]=C(()=>{},["stop"]))},h(P(Xe)(e.skill)),9,ca)):u("",!0)])]),L("div",{class:"asset-card-actions",onClick:l[3]||(l[3]=C(()=>{},["stop"]))},[!["pending","needs_review"].includes(e.skill.trust)||"project"===e.panelScope&&"project"!==e.skill.sourceScope?u("",!0):(y(),f(P(r),{key:0,size:"small",tertiary:"",type:"warning",onClick:l[1]||(l[1]=l=>a.$emit("approve",e.skill))},{default:w(()=>[...l[14]||(l[14]=[c("审批",-1)])]),_:1})),p(P(ue),{value:e.skill.enabled,loading:e.toggling,disabled:e.skill.protected||e.skill.readonly||!1===e.skill.managed||!e.skill.cached||"approved"!==e.skill.trust||"unsupported"===e.skill.projection?.state||"project"===e.panelScope&&"project"!==e.skill.sourceScope,"aria-label":`${e.skill.name} 开关`,"onUpdate:value":l[2]||(l[2]=l=>a.$emit("toggle",e.skill,l))},null,8,["value","loading","disabled","aria-label"])])],2);var t,s}},[["__scopeId","data-v-f428a4a6"]]),va={class:"repo-manager"},pa={class:"repo-list"},fa={class:"repo-main"},ma={class:"repo-info"},ya={class:"repo-name-row"},ba={class:"repo-name"},ha={class:"repo-branch"},ka={key:0,class:"repo-auth-hint"},ga={class:"repo-actions"},wa={key:0,class:"empty-hint"},_a={class:"add-repo"},ja={class:"add-form"},Ca={class:"tips"},Pa={class:"recommended"},Sa={class:"recommended-list"},xa=["onClick"],za={class:"rec-info"},Ua={class:"rec-name"},La={class:"rec-desc"},$a={key:0,class:"auth-manager"},Ta={class:"auth-meta"},Oa={class:"auth-meta-row"},Ba={class:"auth-value"},Ka={class:"auth-meta-row"},Ga={class:"auth-value"},Aa={class:"auth-meta-row"},Ea={class:"auth-value"},Ma={class:"auth-actions"},Ha=o({__name:"SkillRepoManager",props:{visible:Boolean,platform:{type:String,default:"claude"}},emits:["update:visible","updated"],setup(e,{emit:a}){const l=e,t=a,s=g({get:()=>l.visible,set:e=>t("update:visible",e)}),o=z([]),n=z(!1),v=z(!1),k=z(!1),C=z(null),x=z(!1),$=z(!1),T=z({token:""}),O=z({input:"",branch:"main"}),B=g(()=>C.value?("gitlab"===C.value.provider?"GitLab":"GitHub")+" 仓库认证":"仓库认证"),K=g(()=>"codex"===l.platform?[{provider:"github",owner:"openai",name:"skills",description:"Codex 官方技能库",branch:"main",directory:"skills/.curated"}]:"opencode"===l.platform?[{provider:"github",owner:"Shakudo-io",name:"opencode-skills",description:"OpenCode 官方技能库(46个技能)",branch:"main",directory:""}]:"gemini"===l.platform?[{provider:"github",owner:"google-gemini",name:"gemini-cli",description:"Gemini 官方技能库",branch:"main",directory:".gemini/skills"}]:[{provider:"github",owner:"anthropics",name:"skills",description:"官方技能库",branch:"main",directory:"skills"},{provider:"github",owner:"ComposioHQ",name:"awesome-claude-skills",description:"社区精选",branch:"master"},{provider:"github",owner:"cexll",name:"myclaude",description:"多智能体工作流",branch:"master"}]);function G(e){const a=e.provider||(e.localPath?"local":e.projectPath?"gitlab":"github"),l=De(e.directory),t=e.branch||"main";return"local"===a?`local:${e.localPath||""}::${l}`:"gitlab"===a?`gitlab:${e.host||"https://gitlab.com"}::${e.projectPath||""}::${t}::${l}`:`github:${e.host||"https://github.com"}::${e.owner||""}/${e.name||""}::${t}::${l}`}function E(e){return"local"===e.provider?e.localPath||e.name||"本地仓库":"gitlab"===e.provider&&e.projectPath||[e.owner,e.name].filter(Boolean).join("/")}function M(e){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 H(e){return"github"===e?.provider||"gitlab"===e?.provider}function I(e){return H(e)?e.hasToken?`仓库 Token: ${e.tokenPreview||"已配置"}`:"gitlab"===e.provider?"未配置仓库 Token,将回退到全局 Token、glab 或 git credential":"未配置仓库 Token,可选配置后优先用于 GitHub API 访问":""}function D(){k.value=!1,C.value=null,T.value.token="",x.value=!1,$.value=!1}const N=g(()=>Ie(O.value.input)),R=g(()=>!!N.value);async function q(){n.value=!0;try{const e=await Oe(l.platform);e.success&&(o.value=e.repos||[])}catch(e){ve.error("加载仓库失败: "+e.message)}finally{n.value=!1}}async function V(){if(!R.value)return;const e=N.value;v.value=!0;try{const a=await Be({...e,branch:O.value.branch||"main",enabled:!0},l.platform);a.success&&(o.value=a.repos,O.value.input="",O.value.branch="main",ve.success("仓库已保存,请手动点击“刷新远端”获取 Skill"),t("updated"))}catch(a){ve.error("添加失败: "+a.message)}finally{v.value=!1}}async function F(){const e=C.value,a=T.value.token.trim();if(e&&a){x.value=!0;try{const s=await _e(e,{token:a},l.platform);s.success&&(o.value=s.repos||[],ve.success("仓库 Token 已保存"),t("updated"),D())}catch(s){ve.error("保存 Token 失败: "+s.message)}finally{x.value=!1}}}async function W(){const e=C.value;if(e){$.value=!0;try{const a=await _e(e,{clearToken:!0},l.platform);a.success&&(o.value=a.repos||[],ve.success("仓库 Token 已清除"),t("updated"),D())}catch(a){ve.error("清除 Token 失败: "+a.message)}finally{$.value=!1}}}function J(e){const a=G(e);return o.value.some(e=>G(e)===a)}function Z(){D(),t("update:visible",!1)}return b(()=>l.visible,e=>{e&&q()}),b(()=>l.platform,()=>{l.visible&&q()}),m(()=>{l.visible&&q()}),(e,a)=>(y(),U(_,null,[p(P(Q),{show:s.value,"onUpdate:show":a[2]||(a[2]=e=>s.value=e),preset:"card",title:"技能仓库管理",bordered:!1,closable:!0,style:{width:"480px","max-width":"90vw"},onClose:Z},{default:w(()=>[L("div",va,[L("div",pa,[p(P(ce),{show:n.value},{default:w(()=>[(y(!0),U(_,null,d(o.value,e=>(y(),U("div",{key:e.id||`${e.owner}/${e.name}/${e.directory||""}`,class:"repo-item"},[L("div",fa,[p(P(ue),{value:e.enabled,size:"small","onUpdate:value":a=>async function(e,a){try{const s=await Le(e,a,l.platform);s.success&&(o.value=s.repos,t("updated"))}catch(s){ve.error("操作失败: "+s.message)}}(e,a)},null,8,["value","onUpdate:value"]),L("div",ma,[L("div",ya,[L("div",ba,h(E(e)),1),H(e)?(y(),f(P(xe),{key:0,size:"tiny",type:e.hasToken?"success":"default",bordered:!1},{default:w(()=>[c(h(e.hasToken?"已配 Token":"未配 Token"),1)]),_:2},1032,["type"])):u("",!0)]),L("div",ha,h(M(e)),1),H(e)?(y(),U("div",ka,h(I(e)),1)):u("",!0)])]),L("div",ga,[H(e)?(y(),f(P(r),{key:0,text:"",type:"primary",size:"tiny",focusable:!1,onClick:a=>function(e){H(e)&&(C.value=e,T.value.token="",k.value=!0)}(e)},{default:w(()=>[...a[5]||(a[5]=[c(" 认证 ",-1)])]),_:1},8,["onClick"])):u("",!0),p(P(r),{text:"",type:"error",size:"tiny",focusable:!1,onClick:a=>async function(e){try{const a=await Ke(e,l.platform);a.success&&(o.value=a.repos,ve.success("仓库已删除"),t("updated"))}catch(a){ve.error("删除失败: "+a.message)}}(e)},{default:w(()=>[...a[6]||(a[6]=[c(" 删除 ",-1)])]),_:1},8,["onClick"])])]))),128)),0===o.value.length?(y(),U("div",wa," 暂无仓库,请添加 ")):u("",!0)]),_:1},8,["show"])]),L("div",_a,[a[8]||(a[8]=L("div",{class:"add-title"},"添加仓库",-1)),L("div",ja,[p(P(he),{value:O.value.input,"onUpdate:value":a[0]||(a[0]=e=>O.value.input=e),placeholder:"GitHub/GitLab 仓库地址,或本地路径",size:"small",class:"repo-input",onKeyup:S(V,["enter"])},null,8,["value"]),p(P(he),{value:O.value.branch,"onUpdate:value":a[1]||(a[1]=e=>O.value.branch=e),placeholder:"分支(本地可忽略)",size:"small",class:"branch-input"},null,8,["value"]),p(P(r),{type:"primary",size:"small",disabled:!R.value,loading:v.value,focusable:!1,onClick:V},{default:w(()=>[...a[7]||(a[7]=[c(" 添加 ",-1)])]),_:1},8,["disabled","loading"])]),a[9]||(a[9]=L("div",{class:"add-hint"}," 支持 `owner/repo`、GitHub/GitLab URL 或 SSH、以及本地路径 ",-1))]),L("div",Ca,[p(P(ge),{type:"info",bordered:!1,size:"small"},{default:w(()=>[...a[10]||(a[10]=[c(" 支持 GitHub、GitLab 和本地仓库路径;远程仓库可按仓库单独配置 Token。 ",-1)])]),_:1})]),L("div",Pa,[a[12]||(a[12]=L("div",{class:"recommended-title"},"推荐仓库",-1)),L("div",Sa,[(y(!0),U(_,null,d(K.value,e=>(y(),U("div",{key:e.id||`${e.owner}/${e.name}/${e.directory||""}`,class:j(["recommended-item",{added:J(e)}]),onClick:a=>!J(e)&&async function(e){v.value=!0;try{const a=await Be({...e,branch:e.branch||"main",directory:e.directory||"",enabled:!0},l.platform);a.success&&(ve.success("仓库已保存,请手动点击“刷新远端”获取 Skill"),o.value=a.repos,t("updated"))}catch(a){ve.error("添加失败: "+a.message)}finally{v.value=!1}}(e)},[L("div",za,[L("span",Ua,h(E(e)),1),L("span",La,h(e.description),1)]),J(e)?(y(),f(P(xe),{key:0,size:"tiny",type:"success",bordered:!1},{default:w(()=>[...a[11]||(a[11]=[c(" 已添加 ",-1)])]),_:1})):(y(),f(P(i),{key:1,class:"add-icon"},{default:w(()=>[p(P(A))]),_:1}))],10,xa))),128))])])])]),_:1},8,["show"]),p(P(Q),{show:k.value,"onUpdate:show":a[4]||(a[4]=e=>k.value=e),preset:"card",title:B.value,bordered:!1,style:{width:"460px","max-width":"92vw"},onClose:D},{default:w(()=>[C.value?(y(),U("div",$a,[p(P(ge),{type:"info",bordered:!1,size:"small"},{default:w(()=>{return[c(h((e=C.value,"gitlab"===e?.provider?"私有 GitLab 仓库建议配置仓库级 Private Token;保存后会优先使用当前仓库 Token,再回退到全局环境变量、glab 和 git credential。":"GitHub 仓库可选配置 Personal Access Token;保存后会优先使用当前仓库 Token,再回退到全局环境变量、gh 和 git credential。")),1)];var e}),_:1}),L("div",Ta,[L("div",Oa,[a[13]||(a[13]=L("span",{class:"auth-label"},"仓库",-1)),L("span",Ba,h(E(C.value)),1)]),L("div",Ka,[a[14]||(a[14]=L("span",{class:"auth-label"},"来源",-1)),L("span",Ga,h("gitlab"===C.value.provider?"GitLab":"GitHub"),1)]),L("div",Aa,[a[15]||(a[15]=L("span",{class:"auth-label"},"当前状态",-1)),L("span",Ea,h(C.value.hasToken?`已配置 ${C.value.tokenPreview||""}`:"未配置仓库 Token"),1)])]),p(P(he),{value:T.value.token,"onUpdate:value":a[3]||(a[3]=e=>T.value.token=e),type:"password","show-password-on":"click",clearable:"",placeholder:"输入此仓库专属 Token",onKeyup:S(F,["enter"])},null,8,["value"]),a[19]||(a[19]=L("div",{class:"auth-footnote"}," 仓库 Token 会优先于全局环境变量、CLI 登录和系统 Git 凭据。 ",-1)),L("div",Ma,[p(P(r),{focusable:!1,onClick:D},{default:w(()=>[...a[16]||(a[16]=[c(" 取消 ",-1)])]),_:1}),C.value.hasToken?(y(),f(P(r),{key:0,type:"warning",secondary:"",focusable:!1,loading:$.value,onClick:W},{default:w(()=>[...a[17]||(a[17]=[c(" 清除 Token ",-1)])]),_:1},8,["loading"])):u("",!0),p(P(r),{type:"primary",focusable:!1,disabled:!T.value.token.trim(),loading:x.value,onClick:F},{default:w(()=>[...a[18]||(a[18]=[c(" 保存 Token ",-1)])]),_:1},8,["disabled","loading"])])])):u("",!0)]),_:1},8,["show","title"])],64))}},[["__scopeId","data-v-059e6be9"]]),Ia={style:{"margin-bottom":"12px"}},Da={class:"file-list"},Na={class:"file-item"},Ra={class:"file-info"},qa={class:"file-path"},Va={key:1,class:"file-size"},Fa={class:"file-actions"},Wa={class:"modal-footer"},Ja=o({__name:"SkillCreateModal",props:{visible:Boolean,platform:{type:String,default:"claude"},scope:{type:String,default:"user"},projectPath:{type:String,default:""}},emits:["update:visible","created"],setup(e,{emit:a}){const l=e,t=g(()=>({...l.projectPath?{cwd:l.projectPath}:{},...l.scope&&"user"!==l.scope?{scope:l.scope}:{}})),s=a,o=g({get:()=>l.visible,set:e=>s("update:visible",e)}),n=z("simple"),v=z(null),m=z({directory:"",name:"",description:"",content:""}),k={directory:[{required:!0,message:"请输入目录名称",trigger:"blur"},{pattern:/^[a-zA-Z0-9_-]+$/,message:"只能包含英文、数字、横杠和下划线",trigger:"blur"}],content:[{required:!0,message:"请输入技能内容",trigger:"blur"}]},C=z(null),S=z({directory:"",files:[]}),x={directory:[{required:!0,message:"请输入目录名称",trigger:"blur"},{pattern:/^[a-zA-Z0-9_-]+$/,message:"只能包含英文、数字、横杠和下划线",trigger:"blur"}]},$=z(!1),T=z(!1),O=z(null),B=z(""),G=z(-1),E=z(!1),M=z(""),H=z(""),I=g(()=>S.value.files.some(e=>"SKILL.md"===e.path));function N(e){const a=e.toLowerCase().substring(e.lastIndexOf("."));return[".md",".txt",".json",".js",".ts",".py",".sh",".yaml",".yml",".toml",".xml",".html",".css"].includes(a)}function R({file:e}){return!0}async function q({file:e,onFinish:a,onError:l}){try{const t=new FileReader;t.onload=l=>{const t=N(e.name);let s=e.name;e.file?.webkitRelativePath&&(s=e.file.webkitRelativePath.split("/").slice(1).join("/")),S.value.files.push({path:s,content:t?l.target.result:btoa(l.target.result),isBase64:!t,size:e.file.size}),a()},t.onerror=l,N(e.name)?t.readAsText(e.file):t.readAsBinaryString(e.file)}catch(t){l()}}function W(){G.value>=0&&(S.value.files[G.value].content=B.value),T.value=!1,O.value=null,B.value="",G.value=-1}function J(){M.value.trim()?S.value.files.some(e=>e.path===M.value)?ve.warning("文件已存在"):(S.value.files.push({path:M.value,content:H.value,isBase64:!1,size:new Blob([H.value]).size}),E.value=!1,M.value="",H.value=""):ve.warning("请输入文件路径")}function X(){const e=`---\nname: "${S.value.directory||"我的技能"}"\ndescription: "技能描述"\n---\n\n# 技能指令\n\n在这里编写你的技能内容...\n`;S.value.files.unshift({path:"SKILL.md",content:e,isBase64:!1,size:new Blob([e]).size})}async function ee(){"simple"===n.value?await async function(){try{await(v.value?.validate())}catch(e){return}$.value=!0;try{const e=await ze({name:m.value.name||m.value.directory,directory:m.value.directory,description:m.value.description,content:m.value.content,...t.value},l.platform);e.success?(ve.success("技能已缓存,当前为关闭状态,审批后可启用"),s("created"),le()):ve.error(e.message||"创建失败")}catch(e){ve.error("创建失败: "+(e.response?.data?.message||e.message))}finally{$.value=!1}}():await async function(){try{await(C.value?.validate())}catch(e){return}if(!I.value)return void ve.error("必须包含 SKILL.md 文件");$.value=!0;try{const e=await $e({directory:S.value.directory,files:S.value.files.map(e=>({path:e.path,content:e.content,isBase64:e.isBase64})),...t.value},l.platform);e.success?(ve.success(`技能已缓存,当前为关闭状态,包含 ${e.fileCount} 个文件`),s("created"),le()):ve.error(e.message||"创建失败")}catch(e){ve.error("创建失败: "+(e.response?.data?.message||e.message))}finally{$.value=!1}}()}function le(){s("update:visible",!1)}return b(()=>l.visible,e=>{e||(n.value="simple",m.value={directory:"",name:"",description:"",content:""},S.value={directory:"",files:[]},O.value=null,B.value="",G.value=-1,M.value="",H.value="")}),(e,a)=>(y(),f(P(Q),{show:o.value,"onUpdate:show":a[14]||(a[14]=e=>o.value=e),preset:"card",title:"创建自定义技能",bordered:!1,closable:!0,style:{width:"680px","max-width":"90vw"},onClose:le},{footer:w(()=>[L("div",Wa,[p(P(r),{onClick:le},{default:w(()=>[...a[24]||(a[24]=[c("取消",-1)])]),_:1}),p(P(r),{type:"primary",loading:$.value,onClick:ee},{default:w(()=>[...a[25]||(a[25]=[c(" 创建 ",-1)])]),_:1},8,["loading"])])]),default:w(()=>[p(P(ae),{value:n.value,"onUpdate:value":a[6]||(a[6]=e=>n.value=e),type:"line",animated:""},{default:w(()=>[p(P(Y),{name:"simple",tab:"简单模式"},{default:w(()=>[p(P(fe),{ref_key:"simpleFormRef",ref:v,model:m.value,rules:k,"label-placement":"top","label-width":"auto"},{default:w(()=>[p(P(ne),{label:"目录名称",path:"directory"},{feedback:w(()=>[...a[15]||(a[15]=[c(" 只能包含英文、数字、横杠和下划线 ",-1)])]),default:w(()=>[p(P(he),{value:m.value.directory,"onUpdate:value":a[0]||(a[0]=e=>m.value.directory=e),placeholder:"例如: my-custom-skill",maxlength:50},null,8,["value"])]),_:1}),p(P(ne),{label:"技能名称",path:"name"},{default:w(()=>[p(P(he),{value:m.value.name,"onUpdate:value":a[1]||(a[1]=e=>m.value.name=e),placeholder:"显示名称,可以是中文",maxlength:100},null,8,["value"])]),_:1}),p(P(ne),{label:"描述",path:"description"},{default:w(()=>[p(P(he),{value:m.value.description,"onUpdate:value":a[2]||(a[2]=e=>m.value.description=e),type:"textarea",placeholder:"简短描述这个技能的用途",rows:2,maxlength:200},null,8,["value"])]),_:1}),p(P(ne),{label:"技能内容 (提示词,支持 Markdown)",path:"content"},{default:w(()=>[p(Ee,{modelValue:m.value.content,"onUpdate:modelValue":a[3]||(a[3]=e=>m.value.content=e),rows:10,"min-height":200,placeholder:"输入技能的详细指令内容,支持 Markdown 格式..."},null,8,["modelValue"])]),_:1})]),_:1},8,["model"])]),_:1}),p(P(Y),{name:"advanced",tab:"高级模式 (多文件)"},{default:w(()=>[p(P(fe),{ref_key:"advancedFormRef",ref:C,model:S.value,rules:x,"label-placement":"top","label-width":"auto"},{default:w(()=>[p(P(ne),{label:"目录名称",path:"directory"},{feedback:w(()=>[...a[16]||(a[16]=[c(" 只能包含英文、数字、横杠和下划线 ",-1)])]),default:w(()=>[p(P(he),{value:S.value.directory,"onUpdate:value":a[4]||(a[4]=e=>S.value.directory=e),placeholder:"例如: my-custom-skill",maxlength:50},null,8,["value"])]),_:1}),p(P(ne),{label:"文件上传"},{default:w(()=>[p(P(se),{multiple:"","directory-dnd":"","show-file-list":!1,"custom-request":q,onBeforeUpload:R},{default:w(()=>[p(P(te),null,{default:w(()=>[L("div",Ia,[p(P(i),{size:"48",depth:3},{default:w(()=>[p(P(V))]),_:1})]),p(P(pe),{style:{"font-size":"16px"}},{default:w(()=>[...a[17]||(a[17]=[c(" 拖放文件或文件夹到此处,或点击选择 ",-1)])]),_:1}),p(P(Re),{depth:"3",style:{margin:"8px 0 0 0"}},{default:w(()=>[...a[18]||(a[18]=[c(" 必须包含 SKILL.md 文件 ",-1)])]),_:1})]),_:1})]),_:1})]),_:1}),S.value.files.length>0?(y(),f(P(ne),{key:0,label:"已添加的文件"},{default:w(()=>[L("div",Da,[(y(!0),U(_,null,d(S.value.files,(e,l)=>(y(),f(P(Z),{key:e.path,size:"small",class:j({"skill-md":"SKILL.md"===e.path})},{default:w(()=>{return[L("div",Na,[L("div",Ra,[p(P(i),{size:16,class:"file-icon"},{default:w(()=>[e.isDirectory?(y(),f(P(K),{key:1})):(y(),f(P(F),{key:0}))]),_:2},1024),L("span",qa,h(e.path),1),"SKILL.md"===e.path?(y(),f(P(xe),{key:0,size:"small",type:"primary"},{default:w(()=>[...a[19]||(a[19]=[c("必需",-1)])]),_:1})):u("",!0),e.size?(y(),U("span",Va,h((t=e.size,t<1024?t+" B":t<1048576?(t/1024).toFixed(1)+" KB":(t/1048576).toFixed(1)+" MB")),1)):u("",!0)]),L("div",Fa,[N(e.path)?(y(),f(P(r),{key:0,size:"small",text:"",onClick:e=>function(e){const a=S.value.files[e];O.value=a,B.value=a.content,G.value=e,T.value=!0}(l)},{default:w(()=>[...a[20]||(a[20]=[c(" 编辑 ",-1)])]),_:1},8,["onClick"])):u("",!0),"SKILL.md"!==e.path?(y(),f(P(r),{key:1,size:"small",text:"",type:"error",onClick:e=>function(e){S.value.files.splice(e,1)}(l)},{default:w(()=>[...a[21]||(a[21]=[c(" 删除 ",-1)])]),_:1},8,["onClick"])):u("",!0)])])];var t}),_:2},1032,["class"]))),128))])]),_:1})):u("",!0),p(P(ne),null,{default:w(()=>[p(P(de),null,{default:w(()=>[p(P(r),{onClick:a[5]||(a[5]=e=>E.value=!0)},{icon:w(()=>[p(P(i),null,{default:w(()=>[p(P(A))]),_:1})]),default:w(()=>[a[22]||(a[22]=c(" 添加文件 ",-1))]),_:1}),I.value?u("",!0):(y(),f(P(r),{key:0,onClick:X},{icon:w(()=>[p(P(i),null,{default:w(()=>[p(P(D))]),_:1})]),default:w(()=>[a[23]||(a[23]=c(" 添加 SKILL.md 模板 ",-1))]),_:1}))]),_:1})]),_:1})]),_:1},8,["model"])]),_:1})]),_:1},8,["value"]),p(P(Q),{show:T.value,"onUpdate:show":a[9]||(a[9]=e=>T.value=e),preset:"card",title:"编辑文件",style:{width:"600px","max-width":"90vw"}},{footer:w(()=>[p(P(de),{justify:"end"},{default:w(()=>[p(P(r),{onClick:a[8]||(a[8]=e=>T.value=!1)},{default:w(()=>[...a[26]||(a[26]=[c("取消",-1)])]),_:1}),p(P(r),{type:"primary",onClick:W},{default:w(()=>[...a[27]||(a[27]=[c("保存",-1)])]),_:1})]),_:1})]),default:w(()=>[p(P(ne),{label:O.value?.path||"文件内容"},{default:w(()=>[p(P(he),{value:B.value,"onUpdate:value":a[7]||(a[7]=e=>B.value=e),type:"textarea",rows:15,placeholder:"输入文件内容...",style:{"font-family":"monospace"}},null,8,["value"])]),_:1},8,["label"])]),_:1},8,["show"]),p(P(Q),{show:E.value,"onUpdate:show":a[13]||(a[13]=e=>E.value=e),preset:"card",title:"添加新文件",style:{width:"600px","max-width":"90vw"}},{footer:w(()=>[p(P(de),{justify:"end"},{default:w(()=>[p(P(r),{onClick:a[12]||(a[12]=e=>E.value=!1)},{default:w(()=>[...a[29]||(a[29]=[c("取消",-1)])]),_:1}),p(P(r),{type:"primary",onClick:J},{default:w(()=>[...a[30]||(a[30]=[c("添加",-1)])]),_:1})]),_:1})]),default:w(()=>[p(P(fe),{"label-placement":"top"},{default:w(()=>[p(P(ne),{label:"文件路径"},{feedback:w(()=>[...a[28]||(a[28]=[c(" 可以包含子目录,如 scripts/helper.sh ",-1)])]),default:w(()=>[p(P(he),{value:M.value,"onUpdate:value":a[10]||(a[10]=e=>M.value=e),placeholder:"例如: scripts/helper.sh 或 README.md"},null,8,["value"])]),_:1}),p(P(ne),{label:"文件内容"},{default:w(()=>[p(P(he),{value:H.value,"onUpdate:value":a[11]||(a[11]=e=>H.value=e),type:"textarea",rows:10,placeholder:"输入文件内容...",style:{"font-family":"monospace"}},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["show"])]),_:1},8,["show"]))}},[["__scopeId","data-v-d5c75ec8"]]),Za={class:"asset-detail-drawer-header"},Qa={class:"asset-detail-identity"},Xa={class:"asset-detail-heading"},Ya={class:"asset-detail-name"},el={class:"asset-detail-meta"},al={key:3,class:"asset-detail-subtle"},ll={class:"asset-detail-body"},tl={key:0,class:"asset-detail-loading"},sl={key:1,class:"asset-detail-error"},il={class:"asset-detail-container"},rl={class:"asset-detail-info-section"},ol={class:"asset-detail-description"},nl={key:0,class:"asset-detail-info-section"},ul={class:"asset-detail-box"},cl=["href"],dl={key:1},vl={class:"asset-detail-info-section"},pl={class:"asset-detail-actions"},fl=["innerHTML"],ml={key:1,class:"asset-detail-empty"},yl={__name:"SkillDetailDrawer",props:{visible:{type:Boolean,default:!1},skill:{type:Object,default:null},platform:{type:String,default:"claude"},scope:{type:String,default:"user"},projectPath:{type:String,default:""}},emits:["update:visible","updated"],setup(e,{emit:a}){const{drawerWidth:l}=re(600),t=e,s=a,o=g({get:()=>t.visible,set:e=>s("update:visible",e)}),n=z(!1),d=z(""),v=z(null),m=z(!1),k=z(0),_={height:"100%",minHeight:0,overflow:"hidden"};function j(e){const a=String(e);if("undefined"==typeof document)return a.replace(/<script\b[^>]*>[\s\S]*?<\/script>/gi,"").replace(/<style\b[^>]*>[\s\S]*?<\/style>/gi,"").replace(/\son[a-z]+\s*=\s*(['"])[\s\S]*?\1/gi,"").replace(/\s(?:href|src)\s*=\s*(['"])\s*(?:javascript|vbscript|data):[\s\S]*?\1/gi,"");const l=new Set(["a","abbr","b","blockquote","br","code","del","div","em","h1","h2","h3","h4","h5","h6","hr","i","img","input","li","ol","p","pre","span","strong","sub","sup","table","tbody","td","tfoot","th","thead","tr","ul"]),t=new Set(["alt","checked","class","disabled","href","id","rel","src","target","title","type"]),s=(e,a)=>{const l=String(e||"").trim();return!(!l.startsWith("#")&&!l.startsWith("/"))||(!("a"!==a||!/^mailto:/i.test(l))||/^https?:\/\//i.test(l))},i=document.createElement("template");return i.innerHTML=a,i.content.querySelectorAll("*").forEach(e=>{const a=e.tagName.toLowerCase();if(l.has(a))for(const l of[...e.attributes]){const i=l.name.toLowerCase();t.has(i)&&!/^on/i.test(i)?"href"!==i&&"src"!==i||s(l.value,a)||e.removeAttribute(l.name):e.removeAttribute(l.name)}else e.remove()}),i.innerHTML}const C=g(()=>{if(!v.value?.content)return"";try{return j(Ae(v.value.content,{breaks:!0,gfm:!0}))}catch{return j(v.value.content)}}),S=g(()=>v.value?Ze(v.value):""),x=g(()=>v.value?Qe(v.value):""),$=g(()=>v.value?Xe(v.value):""),T=g(()=>v.value?.installPath||v.value?.path||v.value?.fullPath||""),O=g(()=>({...t.projectPath?{cwd:t.projectPath}:{},...t.scope&&"user"!==t.scope?{scope:t.scope}:{}}));async function B(){if(!t.skill?.directory)return;const e=++k.value;n.value=!0,d.value="";try{const l=await me(t.skill.directory,t.platform,(a=t.skill,{id:a.repoId,provider:a.repoProvider,host:a.repoHost,owner:a.repoOwner,name:a.repoName,branch:a.repoBranch||"main",directory:a.repoDirectory||"",projectPath:a.repoProjectPath,localPath:a.repoLocalPath,repoUrl:a.repoUrl}),t.skill.fullDirectory||null,O.value);if(e!==k.value)return;l.success?v.value={...t.skill,...l,source:l.source||t.skill?.source,repoProvider:l.repoProvider||t.skill?.repoProvider,repoOwner:l.repoOwner||t.skill?.repoOwner,repoName:l.repoName||t.skill?.repoName,repoProjectPath:l.repoProjectPath||t.skill?.repoProjectPath,repoLocalPath:l.repoLocalPath||t.skill?.repoLocalPath,repoUrl:l.repoUrl||t.skill?.repoUrl}:d.value=l.message||"加载失败"}catch(l){if(e!==k.value)return;d.value=l.response?.data?.message||l.message||"加载失败"}finally{e===k.value&&(n.value=!1)}var a}async function K(){if(!m.value&&v.value&&v.value.controlKey&&!v.value.protected&&!v.value.readonly&&!1!==v.value.managed&&"approved"===v.value.trust&&"unsupported"!==v.value.projection?.state&&v.value.cached&&("project"!==t.scope||"project"===v.value.sourceScope)){m.value=!0;try{const e="project"===t.scope?await He(t.projectPath,t.platform,v.value.controlKey,!v.value.enabled):await ke(v.value.controlKey,!v.value.enabled,t.platform,O.value);if("needs_approval"===e.status)return void ve.warning("该技能需要先审批");if("unsupported"===e.status)return void ve.error("当前平台不支持安全投影");if("conflict"===e.status)return void ve.warning("目标 Skill 目录已被其他来源占用");if("projection_failed"===e.status)return void ve.error(e.lastError||"Skill 投影失败");v.value.enabled=e.enabled,v.value.projection=e.projection||v.value.projection,ve.success(e.enabled?"技能已启用":"技能已关闭"),s("updated")}catch(e){ve.error("切换失败: "+(e.response?.data?.message||e.message))}finally{m.value=!1}}}async function A(){if(v.value?.controlKey&&["pending","needs_review"].includes(v.value.trust)){m.value=!0;try{const e=await be(v.value.controlKey,"approved",t.platform,O.value);v.value.trust=e.trust,ve.success("技能已批准,当前仍保持关闭"),s("updated")}catch(e){ve.error("审批失败: "+(e.response?.data?.message||e.message))}finally{m.value=!1}}}async function H(){if(v.value?.content)try{if("manual"===(await Ge(v.value.content))?.method)return void ve.warning("自动复制失败,已弹出手动复制框");ve.success("已复制到剪贴板")}catch{ve.error("复制失败")}}return b(()=>[t.visible,t.skill],([e,a])=>{e&&a?B():(k.value+=1,n.value=!1,v.value=null,d.value="")}),(a,t)=>(y(),f(P(ie),{show:o.value,"onUpdate:show":t[0]||(t[0]=e=>o.value=e),width:P(l),placement:"right","show-mask":!0},{default:w(()=>[p(P(oe),{closable:"","native-scrollbar":!1,"body-content-style":_},{header:w(()=>[L("div",Za,[L("div",Qa,[p(P(i),{size:20,class:"asset-detail-icon"},{default:w(()=>[p(P(M))]),_:1}),L("div",Xa,[L("span",Ya,h(v.value?.name||e.skill?.name||"技能详情"),1),L("div",el,[v.value?.enabled?(y(),f(P(xe),{key:0,type:"success",size:"tiny",bordered:!1},{default:w(()=>[...t[1]||(t[1]=[c("已启用",-1)])]),_:1})):(y(),f(P(xe),{key:1,type:"default",size:"tiny",bordered:!1},{default:w(()=>[...t[2]||(t[2]=[c("已关闭",-1)])]),_:1})),v.value?.protected?(y(),f(P(xe),{key:2,type:"default",size:"tiny",bordered:!1},{default:w(()=>[...t[3]||(t[3]=[c("受保护",-1)])]),_:1})):u("",!0),v.value?(y(),U("span",al,h(P(Ye)(v.value)),1)):u("",!0)])])])])]),default:w(()=>[L("div",ll,[n.value?(y(),U("div",tl,[p(P(ce),{size:"medium"}),t[4]||(t[4]=L("p",null,"加载技能详情中...",-1))])):d.value?(y(),U("div",sl,[p(P(i),{size:44,class:"asset-detail-error-icon"},{default:w(()=>[p(P(G))]),_:1}),L("p",null,h(d.value),1),p(P(r),{size:"small",onClick:B},{default:w(()=>[...t[5]||(t[5]=[c("重试",-1)])]),_:1})])):v.value?(y(),f(P(ae),{key:2,type:"line",animated:"",class:"asset-detail-tabs"},{default:w(()=>[p(P(Y),{name:"overview",tab:"概览"},{default:w(()=>[L("div",il,[L("div",rl,[t[6]||(t[6]=L("h3",{class:"asset-detail-section-title"},"描述",-1)),L("p",ol,h(v.value.description||"暂无描述"),1)]),p(le,{path:T.value},null,8,["path"]),S.value||x.value?(y(),U("div",nl,[t[7]||(t[7]=L("h3",{class:"asset-detail-section-title"},"来源",-1)),L("div",ul,[p(P(i),{size:16},{default:w(()=>[p(P(E))]),_:1}),x.value?(y(),U("a",{key:0,class:"asset-detail-link",href:x.value,target:"_blank",rel:"noopener noreferrer"},h($.value),9,cl)):(y(),U("code",dl,h(S.value),1))])])):u("",!0),L("div",vl,[t[12]||(t[12]=L("h3",{class:"asset-detail-section-title"},"操作",-1)),L("div",pl,[!v.value.controlKey||"approved"!==v.value.trust||!v.value.cached||v.value.protected||"unsupported"===v.value.projection?.state||"project"===e.scope&&"project"!==v.value.sourceScope?v.value.controlKey&&["pending","needs_review"].includes(v.value.trust)&&("project"!==e.scope||"project"===v.value.sourceScope)?(y(),f(P(r),{key:1,tertiary:"",type:"warning",size:"small",loading:m.value,onClick:A},{default:w(()=>[...t[8]||(t[8]=[c(" 审批 ",-1)])]),_:1},8,["loading"])):v.value.protected?(y(),f(P(r),{key:2,tertiary:"",size:"small",disabled:""},{default:w(()=>[...t[9]||(t[9]=[c(" 受保护 ",-1)])]),_:1})):"unsupported"===v.value.projection?.state?(y(),f(P(r),{key:3,tertiary:"",size:"small",disabled:""},{default:w(()=>[...t[10]||(t[10]=[c(" 不支持投影 ",-1)])]),_:1})):["pending","needs_review"].includes(v.value.trust)?(y(),f(P(r),{key:4,tertiary:"",size:"small",disabled:""},{default:w(()=>[c(h("needs_review"===v.value.trust?"需复审":"待审批"),1)]),_:1})):u("",!0):(y(),f(P(r),{key:0,type:"primary",size:"small",loading:m.value,onClick:K},{default:w(()=>[c(h(v.value.enabled?"关闭此技能":"启用此技能"),1)]),_:1},8,["loading"])),p(P(r),{text:"",size:"small",disabled:!v.value.content,onClick:H},{icon:w(()=>[p(P(i),null,{default:w(()=>[p(P(R))]),_:1})]),default:w(()=>[t[11]||(t[11]=c(" 复制内容 ",-1))]),_:1},8,["disabled"])])])])]),_:1}),p(P(Y),{name:"content",tab:"内容"},{default:w(()=>[v.value.content?(y(),U("div",{key:0,class:"asset-detail-content",innerHTML:C.value},null,8,fl)):(y(),U("div",ml,[p(P(i),{size:44,class:"asset-detail-empty-icon"},{default:w(()=>[p(P(D))]),_:1}),t[13]||(t[13]=L("p",null,"暂无技能内容",-1))]))]),_:1})]),_:1})):u("",!0)])]),_:1})]),_:1},8,["show","width"]))}},bl=["enableCodexUser","enableClaudeUser","enablePiUser","enablePiProject"];function hl(e){if(null===e||"object"!=typeof e)return!1;const a=Object.getPrototypeOf(e);return a===Object.prototype||null===a}function kl(e){if(!hl(e)||!0!==e.success)throw new Error("响应未明确标记成功");if(!hl(e.settings)||!bl.every(a=>"boolean"==typeof e.settings[a]))throw new Error("响应 settings 必须包含四个布尔字段");return Object.fromEntries(bl.map(a=>[a,e.settings[a]]))}function gl(e){return"omp"===e}async function wl(e,a){return function(e,a){const l=kl(e);if(!bl.every(e=>l[e]===a[e]))throw new Error("响应 settings 与提交值不一致");return l}(await a(e),e)}var _l={key:1,class:"scan-settings"},jl={class:"setting-copy"},Cl=["id"],Pl={class:"setting-description"},Sl={class:"modal-actions"},xl=o({__name:"OmpSkillSettingsModal",props:{visible:Boolean,operationToken:{type:Number,default:0}},emits:["update:visible","saved"],setup(e,{emit:a}){const l=e,t=a,s=J(),i=z(!1),o=z(!1),n=z(""),u=bl,v=k(Object.fromEntries(u.map(e=>[e,!0])));let m=0,j=0;const C=[{key:"enableCodexUser",label:"Codex 用户",description:"扫描 Codex 用户技能目录"},{key:"enableClaudeUser",label:"Claude 用户与插件",description:"扫描 Claude 用户目录和插件技能"},{key:"enablePiUser",label:"OMP 用户与插件",description:"扫描 OMP 用户目录和插件技能"},{key:"enablePiProject",label:"当前项目 .omp/skills",description:"扫描当前项目的 OMP 技能目录"}],S=g({get:()=>l.visible,set:e=>{o.value||t("update:visible",e)}});function x(e){try{if(e instanceof Error)return e.message;if("string"==typeof e)return e;if(null==e)return"未知错误";if("object"==typeof e&&"string"==typeof e.message)return e.message}catch{}try{const a=JSON.stringify(e);if("string"==typeof a)return a}catch{}try{return String(e)}catch{return"未知错误"}}async function $(){const e=++m;i.value=!0,n.value="";try{const a=kl(await je());if(e!==m||!l.visible)return;Object.assign(v,a)}catch(a){if(e!==m||!l.visible)return;n.value=`加载技能扫描设置失败: ${x(a)}`,s.error(n.value)}finally{e===m&&(i.value=!1)}}async function T(){if(i.value||o.value||n.value)return;const e=++j,a=l.operationToken,r=Object.fromEntries(u.map(e=>[e,v[e]]));o.value=!0;try{const s=await wl(r,Se);if(e!==j||a!==l.operationToken||!l.visible)return;t("saved",s,a)}catch(c){if(e!==j||a!==l.operationToken||!l.visible)return;s.error(`保存技能扫描设置失败: ${x(c)}`)}finally{e===j&&a===l.operationToken&&l.visible&&(o.value=!1)}}return b(()=>l.visible,e=>{e?$():(m+=1,j+=1,o.value=!1,i.value=!1,n.value="")},{immediate:!0}),(e,a)=>(y(),f(P(Q),{show:S.value,"onUpdate:show":a[1]||(a[1]=e=>S.value=e),preset:"card",title:"技能扫描设置",bordered:!1,closable:!o.value,"mask-closable":!o.value,"close-on-esc":!o.value,style:{width:"420px","max-width":"92vw"}},{footer:w(()=>[L("div",Sl,[p(P(r),{disabled:o.value,onClick:a[0]||(a[0]=e=>S.value=!1)},{default:w(()=>[...a[4]||(a[4]=[c("取消",-1)])]),_:1},8,["disabled"]),p(P(r),{type:"primary",loading:o.value,disabled:i.value||o.value||!!n.value,onClick:T},{default:w(()=>[...a[5]||(a[5]=[c(" 保存 ",-1)])]),_:1},8,["loading","disabled"])])]),default:w(()=>[p(P(ce),{show:i.value},{default:w(()=>[n.value?(y(),f(P(ge),{key:0,type:"error","show-icon":!0},{action:w(()=>[p(P(r),{size:"small",disabled:i.value||o.value,onClick:$},{default:w(()=>[...a[2]||(a[2]=[c("重试",-1)])]),_:1},8,["disabled"])]),default:w(()=>[c(h(n.value)+" ",1)]),_:1})):(y(),U("div",_l,[a[3]||(a[3]=L("div",{class:"section-title"},"扫描来源",-1)),(y(),U(_,null,d(C,e=>L("div",{key:e.key,class:"setting-row"},[L("div",jl,[L("div",{id:`${e.key}-label`,class:"setting-label"},h(e.label),9,Cl),L("div",Pl,h(e.description),1)]),p(P(ue),{value:v[e.key],"onUpdate:value":a=>v[e.key]=a,disabled:i.value||o.value,"aria-labelledby":`${e.key}-label`},null,8,["value","onUpdate:value","disabled","aria-labelledby"])])),64))]))]),_:1},8,["show"])]),_:1},8,["show","closable","mask-closable","close-on-esc"]))}},[["__scopeId","data-v-c6883975"]]),zl={key:0,class:"asset-panel-header"},Ul={class:"asset-title-group"},Ll={class:"asset-heading"},$l={class:"asset-title-row"},Tl={class:"asset-platform-pill"},Ol={key:0,class:"asset-action-row"},Bl={key:1,class:"asset-drawer-toolbar"},Kl={key:0,class:"asset-action-row"},Gl={class:"asset-summary"},Al={class:"asset-summary-item"},El={class:"asset-summary-value"},Ml={class:"asset-summary-item"},Hl={class:"asset-summary-value"},Il={class:"asset-summary-item"},Dl={class:"asset-summary-value"},Nl={class:"asset-filter-bar"},Rl={class:"asset-panel-content"},ql={key:0,class:"asset-empty"},Vl={class:"asset-list"},Fl={key:2,class:"asset-footer"},Wl={key:3,class:"asset-refresh-status"},Jl={key:0},Zl={key:1},Ql=o({__name:"SkillsPanel",props:{inDrawer:{type:Boolean,default:!1},hideBack:{type:Boolean,default:!1},drawerVisible:{type:Boolean,default:!1},platform:{type:String,default:""},projectPath:{type:String,default:""},scope:{type:String,default:"user"}},emits:["back","updated"],setup(e){const a=e,l=x(),t=O(),s=J(),o=z(!1),n=z([]),v=z(""),k=z("all"),C=z(!1),S=z(!1),K=z(!1),G=z(!1),D=z(0),R=z(null),V=z({}),F=z(!1),Z=z(null),Q=z(!1),X=z(0),Y=z(0),{byCapability:ae}=Ce(),le=g(()=>ae("skills").map(e=>e.key)),te=g(()=>le.value.includes(de.value)),se=g(()=>t.get(de.value)||T(de.value)),ie=g(()=>se.value?.resourceActions?.skills||{}),re=g(()=>!1!==ie.value.create),oe=g(()=>!1!==ie.value.repositories),ne=g(()=>!1!==ie.value.import),ue=g(()=>!1!==ie.value.refresh),de=g(()=>String(a.platform||$(l)||"claude").trim().toLowerCase()),ve=g(()=>({...a.projectPath?{cwd:a.projectPath}:{},...a.scope&&"user"!==a.scope?{scope:a.scope}:{}})),pe=g(()=>gl(de.value)),fe=g(()=>{const e=t.get(de.value)||T(de.value);return e.label||e.title||"Claude Code"}),me=[{label:"全部",value:"all"},{label:"已启用",value:"enabled"},{label:"已关闭",value:"disabled"},{label:"待审批 / 需复审",value:"pending"}],ge=g(()=>n.value.filter(e=>e.enabled).length),_e=g(()=>({never_fetched:"从未刷新",queued:"排队中",running:"刷新中",succeeded:"已完成",partial:"部分成功",failed:"失败",interrupted:"已中断",idle:"已完成"}[Z.value?.status||Z.value?.state]||"")),je=g(()=>n.value.filter(e=>["pending","needs_review"].includes(e.trust)).length),Se=g(()=>{let e=n.value;if("enabled"===k.value?e=e.filter(e=>e.enabled):"disabled"===k.value?e=e.filter(e=>!e.enabled):"pending"===k.value&&(e=e.filter(e=>["pending","needs_review"].includes(e.trust))),v.value.trim()){const a=v.value.toLowerCase();e=e.filter(e=>e.name?.toLowerCase().includes(a)||e.description?.toLowerCase().includes(a))}return[...e].sort((e,a)=>e.enabled===a.enabled?0:e.enabled?-1:1)}),xe=g(()=>v.value?"没有匹配的技能":"enabled"===k.value?"暂无已启用的技能":"disabled"===k.value?"暂无已关闭的技能":"pending"===k.value?"暂无待审批的技能":te.value?re.value||oe.value||ue.value?"暂无可用技能,请配置仓库源":`${fe.value} 当前没有可管理的技能`:`${fe.value} 暂未提供 Skills 能力`);async function ze({notifyError:e=!0}={}){const l=++X.value,t=de.value;if(!te.value)return n.value=[],o.value=!1,!1;o.value=!0;try{const e="project"===a.scope?await Me(a.projectPath,t):await ye(t,ve.value),s="project"===a.scope?[...Array.isArray(e?.project)?e.project:[],...Array.isArray(e?.inherited)?e.inherited:[]]:function(e){if(!hl(e))throw new Error("技能列表响应必须是普通对象");if(!0!==e.success)throw new Error("string"==typeof e.message&&e.message?e.message:"技能列表响应未明确标记成功");if(!Array.isArray(e.skills))throw new Error("技能列表响应 skills 必须是数组");return e.skills}(e);return l===X.value&&t===de.value&&(n.value=s,Z.value=e.refresh||null,!0)}catch(i){return l!==X.value||t!==de.value||e&&s.error("加载技能失败: "+(i?.message||String(i))),!1}finally{l===X.value&&t===de.value&&(o.value=!1)}}async function Le(){if(te.value&&ne.value&&"claude"===de.value){Q.value=!0;try{const e=await ee("skills");e.success?(s.success(`成功导入 ${e.imported} 个技能`),await ze()):s.error(e.message||"导入失败")}catch(e){s.error("导入失败: "+e.message)}finally{Q.value=!1}}}async function $e(e,l){if(!te.value)return;if(!e.controlKey||e.protected||e.readonly||!1===e.managed||"project"===a.scope&&"project"!==e.sourceScope)return;if(l&&"approved"!==e.trust)return void s.warning("blocked"===e.trust?"该技能已被阻止":"该技能需要先审批");if("unsupported"===e.projection?.state)return void s.error("当前平台不支持安全投影,无法切换该项目技能");if(l&&!e.cached)return void s.warning("该技能尚无完整缓存,请先手动刷新远端");const t=e.controlKey;V.value[t]=!0;try{const i="project"===a.scope?await He(a.projectPath,de.value,t,l):await ke(t,l,de.value,ve.value);if("needs_approval"===i.status)return void s.warning("该技能需要先审批");if("blocked"===i.status)return void s.error("该技能已被阻止");if("unsupported"===i.status)return void s.error("当前平台不支持安全投影");if("conflict"===i.status)return void s.warning("目标 Skill 目录已被其他来源占用");if("projection_failed"===i.status)return void s.error(i.lastError||"Skill 投影失败");const r=n.value.find(e=>e.controlKey===t);r&&(r.enabled=i.enabled,r.installed=i.enabled,r.projection=i.projection||r.projection),s.success(l?`技能 "${e.name}" 已启用`:`技能 "${e.name}" 已关闭`)}catch(i){s.error("切换失败: "+(i.response?.data?.message||i.message))}finally{delete V.value[t]}}async function Oe(e){if(!te.value)return;if(!e.controlKey||!["pending","needs_review"].includes(e.trust))return;if("project"===a.scope&&"project"!==e.sourceScope)return;const l=e.controlKey;V.value[l]=!0;try{const a=await be(l,"approved",de.value,ve.value),t=n.value.find(e=>e.controlKey===l);t&&(t.trust=a.trust),s.success(`技能 "${e.name}" 已批准,当前仍保持关闭`)}catch(t){s.error("审批失败: "+(t.response?.data?.message||t.message))}finally{delete V.value[l]}}async function Be(){if(!te.value||!ue.value||F.value)return;const e=Y.value,l=JSON.stringify({platform:de.value,scope:a.scope||"user",projectPath:a.projectPath||""}),t=()=>e===Y.value&&l===JSON.stringify({platform:de.value,scope:a.scope||"user",projectPath:a.projectPath||""});F.value=!0;try{const e=de.value,a=await Pe(e,ve.value);if(!t())return;Z.value=a.task||null;let l=a.task;for(;l&&["queued","running"].includes(l.status);){await new Promise(e=>setTimeout(e,250));const e=await Ue(l.id,{...ve.value,platform:de.value});if(!t())return;l=e.task,Z.value=l}if(!t())return;"failed"===l?.status?s.error(l.error||"远端刷新失败"):"partial"===l?.status?s.warning("远端刷新部分成功"):s.success("远端 Skill 刷新完成"),await ze()}catch(i){t()&&s.error("刷新失败: "+(i.response?.data?.message||i.message))}finally{t()&&(F.value=!1)}}function Ke(){pe.value&&(D.value+=1,G.value=!0)}async function Ge(e,a){if("omp"!==de.value||!G.value||a!==D.value)return;const l=de.value;G.value=!1;const t=await async function(e,a){return e(),a({notifyError:!1})}(()=>{},ze);l===de.value&&a===D.value&&(t?s.success("技能扫描设置已保存"):s.error("设置已保存,但技能列表刷新失败"))}function Ae(e){R.value=e,K.value=!0}return m(()=>{a.inDrawer&&!a.drawerVisible||ze()}),b(()=>a.drawerVisible,e=>{e&&ze()}),b([()=>de.value,()=>a.scope,()=>a.projectPath],([e])=>{Y.value+=1,F.value=!1,Z.value=null,D.value+=1,gl(e)||(G.value=!1),ze()}),(l,t)=>(y(),U("div",{class:j(["skills-panel asset-panel",{"in-drawer":e.inDrawer}])},[e.inDrawer?u("",!0):(y(),U("div",zl,[L("div",Ul,[e.hideBack?u("",!0):(y(),f(P(r),{key:0,text:"",onClick:t[0]||(t[0]=e=>l.$emit("back")),class:"back-btn"},{icon:w(()=>[p(P(i),null,{default:w(()=>[p(P(q))]),_:1})]),_:1})),L("div",Ll,[L("div",$l,[t[12]||(t[12]=L("span",{class:"asset-title"},"技能管理",-1)),L("span",Tl,h(fe.value),1)]),t[13]||(t[13]=L("div",{class:"asset-subtitle"},"缓存并控制当前平台可用的技能",-1))])]),te.value?(y(),U("div",Ol,[re.value?(y(),f(P(r),{key:0,text:"",focusable:!1,onClick:t[1]||(t[1]=e=>S.value=!0),class:"action-btn"},{icon:w(()=>[p(P(i),null,{default:w(()=>[p(P(A))]),_:1})]),default:w(()=>[t[14]||(t[14]=c(" 创建 ",-1))]),_:1})):u("",!0),oe.value?(y(),f(P(r),{key:1,text:"",focusable:!1,onClick:t[2]||(t[2]=e=>C.value=!0),class:"action-btn"},{icon:w(()=>[p(P(i),null,{default:w(()=>[p(P(E))]),_:1})]),default:w(()=>[t[15]||(t[15]=c(" 仓库 ",-1))]),_:1})):u("",!0),ne.value?(y(),f(P(r),{key:2,text:"",focusable:!1,onClick:Le,loading:Q.value,disabled:"claude"!==de.value,class:"action-btn"},{icon:w(()=>[p(P(i),null,{default:w(()=>[p(P(I))]),_:1})]),default:w(()=>[t[16]||(t[16]=c(" 导入 ",-1))]),_:1},8,["loading","disabled"])):u("",!0),pe.value?(y(),f(P(r),{key:3,text:"","aria-label":"OMP 技能设置",onClick:Ke,class:"action-btn"},{icon:w(()=>[p(P(i),null,{default:w(()=>[p(P(N))]),_:1})]),default:w(()=>[t[17]||(t[17]=c(" 设置 ",-1))]),_:1})):u("",!0),ue.value?(y(),f(P(r),{key:4,text:"",focusable:!1,onClick:Be,loading:F.value||o.value,class:"action-btn"},{icon:w(()=>[p(P(i),null,{default:w(()=>[p(P(B))]),_:1})]),default:w(()=>[t[18]||(t[18]=c(" 刷新远端 ",-1))]),_:1},8,["loading"])):u("",!0)])):u("",!0)])),e.inDrawer?(y(),U("div",Bl,[te.value?(y(),U("div",Kl,[re.value?(y(),f(P(r),{key:0,text:"",focusable:!1,onClick:t[3]||(t[3]=e=>S.value=!0),class:"action-btn"},{icon:w(()=>[p(P(i),null,{default:w(()=>[p(P(A))]),_:1})]),default:w(()=>[t[19]||(t[19]=c(" 创建 ",-1))]),_:1})):u("",!0),oe.value?(y(),f(P(r),{key:1,text:"",focusable:!1,onClick:t[4]||(t[4]=e=>C.value=!0),class:"action-btn"},{icon:w(()=>[p(P(i),null,{default:w(()=>[p(P(E))]),_:1})]),default:w(()=>[t[20]||(t[20]=c(" 仓库 ",-1))]),_:1})):u("",!0),ne.value?(y(),f(P(r),{key:2,text:"",focusable:!1,onClick:Le,loading:Q.value,disabled:"claude"!==de.value,class:"action-btn"},{icon:w(()=>[p(P(i),null,{default:w(()=>[p(P(I))]),_:1})]),default:w(()=>[t[21]||(t[21]=c(" 导入 ",-1))]),_:1},8,["loading","disabled"])):u("",!0),pe.value?(y(),f(P(r),{key:3,text:"","aria-label":"OMP 技能设置",onClick:Ke,class:"action-btn"},{icon:w(()=>[p(P(i),null,{default:w(()=>[p(P(N))]),_:1})]),default:w(()=>[t[22]||(t[22]=c(" 设置 ",-1))]),_:1})):u("",!0),ue.value?(y(),f(P(r),{key:4,text:"",focusable:!1,onClick:Be,loading:F.value||o.value,class:"action-btn"},{icon:w(()=>[p(P(i),null,{default:w(()=>[p(P(B))]),_:1})]),default:w(()=>[t[23]||(t[23]=c(" 刷新远端 ",-1))]),_:1},8,["loading"])):u("",!0)])):u("",!0)])):u("",!0),L("div",Gl,[L("span",Al,[t[24]||(t[24]=L("span",{class:"asset-summary-label"},"全部",-1)),L("span",El,h(n.value.length),1)]),L("span",Ml,[t[25]||(t[25]=L("span",{class:"asset-summary-label"},"已启用",-1)),L("span",Hl,h(ge.value),1)]),L("span",Il,[t[26]||(t[26]=L("span",{class:"asset-summary-label"},"待审批",-1)),L("span",Dl,h(je.value),1)])]),L("div",Nl,[p(P(he),{value:v.value,"onUpdate:value":t[5]||(t[5]=e=>v.value=e),placeholder:"搜索技能名称或描述",clearable:"",size:"small",class:"asset-search"},{prefix:w(()=>[p(P(i),null,{default:w(()=>[p(P(H))]),_:1})]),_:1},8,["value"]),p(P(Te),{value:k.value,"onUpdate:value":t[6]||(t[6]=e=>k.value=e),options:me,size:"small",class:"asset-filter"},null,8,["value"])]),L("div",Rl,[p(P(ce),{show:o.value},{default:w(()=>[0!==Se.value.length||o.value?u("",!0):(y(),U("div",ql,[p(P(we),{description:xe.value},{icon:w(()=>[p(P(i),{size:"48",color:"var(--text-quaternary)"},{default:w(()=>[p(P(M))]),_:1})]),extra:w(()=>[te.value&&oe.value&&0===n.value.length?(y(),f(P(r),{key:0,size:"small",onClick:t[7]||(t[7]=e=>C.value=!0)},{default:w(()=>[...t[27]||(t[27]=[c("配置仓库源",-1)])]),_:1})):u("",!0)]),_:1},8,["description"])])),L("div",Vl,[(y(!0),U(_,null,d(Se.value,e=>(y(),f(da,{key:e.controlKey||e.key,skill:e,toggling:!!V.value[e.controlKey||e.key],"panel-scope":a.scope,onClick:Ae,onToggle:$e,onApprove:Oe},null,8,["skill","toggling","panel-scope"]))),128))])]),_:1},8,["show"])]),ue.value?(y(),U("div",Fl,[p(P(i),{size:"14",class:"asset-info-icon"},{default:w(()=>[p(P(W))]),_:1}),L("span",null,"开关变更后需重启 "+h(fe.value)+" 生效;远端刷新只在手动点击后执行",1)])):u("",!0),_e.value?(y(),U("div",Wl,[c(" 刷新任务:"+h(_e.value)+" ",1),void 0!==Z.value?.fetchedSkills?(y(),U("span",Jl," · 已处理 "+h(Z.value.fetchedSkills)+" 个 Skill",1)):u("",!0),Z.value?.failedRepos?.length?(y(),U("span",Zl," · 失败仓库 "+h(Z.value.failedRepos.length),1)):u("",!0)])):u("",!0),p(Ha,{visible:C.value,"onUpdate:visible":t[8]||(t[8]=e=>C.value=e),platform:de.value,onUpdated:ze},null,8,["visible","platform"]),p(Ja,{visible:S.value,"onUpdate:visible":t[9]||(t[9]=e=>S.value=e),platform:de.value,scope:a.scope,"project-path":a.projectPath,onCreated:ze},null,8,["visible","platform","scope","project-path"]),p(yl,{visible:K.value,"onUpdate:visible":t[10]||(t[10]=e=>K.value=e),skill:R.value,platform:de.value,scope:a.scope,"project-path":a.projectPath,onUpdated:ze},null,8,["visible","skill","platform","scope","project-path"]),p(xl,{visible:G.value,"onUpdate:visible":t[11]||(t[11]=e=>G.value=e),"operation-token":D.value,onSaved:Ge},null,8,["visible","operation-token"])],2))}},[["__scopeId","data-v-efda7d55"]]);export{Ql as t};