chainlesschain 0.158.0 → 0.159.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (179) hide show
  1. package/package.json +1 -1
  2. package/src/assets/web-panel/.build-hash +1 -1
  3. package/src/assets/web-panel/assets/{AIOps-9QEKGr43.js → AIOps-ztGJppiG.js} +1 -1
  4. package/src/assets/web-panel/assets/{ActionButton-BQElVBgD.js → ActionButton-DCuat-R-.js} +1 -1
  5. package/src/assets/web-panel/assets/{Analytics-DbZbFR_a.js → Analytics-m_EtU-RR.js} +2 -2
  6. package/src/assets/web-panel/assets/AppLayout-8HizVjee.css +1 -0
  7. package/src/assets/web-panel/assets/AppLayout-Crz8jbEC.js +1 -0
  8. package/src/assets/web-panel/assets/Audit-CNLWjMXN.js +1 -0
  9. package/src/assets/web-panel/assets/Audit-kU7vbN-D.css +1 -0
  10. package/src/assets/web-panel/assets/Backup-CggaSq9O.js +1 -0
  11. package/src/assets/web-panel/assets/Backup-DxLiJzmk.css +1 -0
  12. package/src/assets/web-panel/assets/{BaseInput-60t9IMEz.js → BaseInput-BssiYvl6.js} +1 -1
  13. package/src/assets/web-panel/assets/{Chat-3Kj2JQP4.js → Chat-tuVfpQUO.js} +1 -1
  14. package/src/assets/web-panel/assets/{Checkbox-Ba1Rf2Ea.js → Checkbox-BUUkXdQg.js} +1 -1
  15. package/src/assets/web-panel/assets/{Codegen-WiYmL3oB.js → Codegen-CHu-7YGr.js} +1 -1
  16. package/src/assets/web-panel/assets/{Col-D2zhpSqE.js → Col-2IaMFwmX.js} +1 -1
  17. package/src/assets/web-panel/assets/{Community-DgqmUGwT.js → Community-CYL7Fvjq.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compact-D_dbJDbi.js → Compact-5yRVELhA.js} +1 -1
  19. package/src/assets/web-panel/assets/{Compliance-BVcVb-e2.js → Compliance-CKuIDJHK.js} +1 -1
  20. package/src/assets/web-panel/assets/{Cowork-pgKzBNDo.js → Cowork-CFkkMMDK.js} +4 -4
  21. package/src/assets/web-panel/assets/{Cron-Cs5QaKTP.js → Cron-DIfkI7vf.js} +2 -2
  22. package/src/assets/web-panel/assets/{Crosschain-pjWfIM8s.js → Crosschain-BkjY-lst.js} +1 -1
  23. package/src/assets/web-panel/assets/{DID-DQtsjz3X.js → DID-ChzRkgNy.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dashboard-sqj42zKx.js → Dashboard-DKrbXVNn.js} +2 -2
  25. package/src/assets/web-panel/assets/{Dropdown-BM_ljd87.js → Dropdown-BYGoxH1z.js} +1 -1
  26. package/src/assets/web-panel/assets/{Federation-CId-3zn6.js → Federation-B8QX-IaA.js} +1 -1
  27. package/src/assets/web-panel/assets/{FormItemContext-CnzbixSE.js → FormItemContext-Be6TSNxz.js} +1 -1
  28. package/src/assets/web-panel/assets/{Git-B38QeOPF.js → Git-BBnGgbBR.js} +2 -2
  29. package/src/assets/web-panel/assets/{Governance-DrGkAjd1.js → Governance-CxUHZMsp.js} +1 -1
  30. package/src/assets/web-panel/assets/{Inference-BjkHB4sD.js → Inference-BlnOG71q.js} +1 -1
  31. package/src/assets/web-panel/assets/{KnowledgeGraph-Trs1XJFK.js → KnowledgeGraph-vkVq38kC.js} +1 -1
  32. package/src/assets/web-panel/assets/{Logs-B39LUZs9.js → Logs-Bxx7WARH.js} +2 -2
  33. package/src/assets/web-panel/assets/{Marketplace-BnpOoITi.js → Marketplace-Bh8ExT9_.js} +1 -1
  34. package/src/assets/web-panel/assets/McpTools-CTQrNVAQ.css +1 -0
  35. package/src/assets/web-panel/assets/McpTools-Djj_a3ko.js +5 -0
  36. package/src/assets/web-panel/assets/{Memory-BHXHpldt.js → Memory-DlgNgAov.js} +2 -2
  37. package/src/assets/web-panel/assets/{NLProgramming-B3BALajs.js → NLProgramming-BN3jaoen.js} +1 -1
  38. package/src/assets/web-panel/assets/Notes-DKkPfXlY.css +1 -0
  39. package/src/assets/web-panel/assets/Notes-De7mIkkV.js +7 -0
  40. package/src/assets/web-panel/assets/{Organization-CQ1X722j.js → Organization-B-98mdK2.js} +4 -4
  41. package/src/assets/web-panel/assets/{Overflow-DHKu8e8g.js → Overflow-G0I8IlY3.js} +1 -1
  42. package/src/assets/web-panel/assets/{OverrideContext-DEW2m7K6.js → OverrideContext-GHsJf9ok.js} +1 -1
  43. package/src/assets/web-panel/assets/{P2P-BflX74Hm.js → P2P-DIUgHZ1z.js} +2 -2
  44. package/src/assets/web-panel/assets/{Permissions-B2XrAUBW.js → Permissions-B8XycCVk.js} +4 -4
  45. package/src/assets/web-panel/assets/{Pipeline-C0K9-DnR.js → Pipeline-cUpETlXS.js} +1 -1
  46. package/src/assets/web-panel/assets/Portal-SsPhn64D.js +1 -0
  47. package/src/assets/web-panel/assets/Privacy-B6J89UBw.js +1 -0
  48. package/src/assets/web-panel/assets/{ProjectSettings-C34C7hFt.js → ProjectSettings-2Ftw0zt_.js} +2 -2
  49. package/src/assets/web-panel/assets/{Projects-DLvUzeIB.js → Projects-CcOdFpgr.js} +2 -2
  50. package/src/assets/web-panel/assets/{Providers-BFiMVWaM.js → Providers-D0r2qSf-.js} +2 -2
  51. package/src/assets/web-panel/assets/QuickAsk-CwsPpfkq.js +1 -0
  52. package/src/assets/web-panel/assets/{Recommend-BmUhysGC.js → Recommend-BYEDetJm.js} +1 -1
  53. package/src/assets/web-panel/assets/{Reputation-BlfSvJww.js → Reputation-Bli4hBGH.js} +1 -1
  54. package/src/assets/web-panel/assets/{Row-Dl74576S.js → Row-DTW9_BYi.js} +1 -1
  55. package/src/assets/web-panel/assets/{RssFeed-9_MkDUxZ.js → RssFeed-kwj_himl.js} +3 -3
  56. package/src/assets/web-panel/assets/{Search-CSRY_TYa.js → Search-DymcqASO.js} +1 -1
  57. package/src/assets/web-panel/assets/{Security-DfDoKfkl.js → Security-Bh3yvyNN.js} +3 -3
  58. package/src/assets/web-panel/assets/{Services-7Blny0Jc.js → Services-O4UZaYur.js} +2 -2
  59. package/src/assets/web-panel/assets/{Skeleton-6CF_3QUY.js → Skeleton-B82oQZTz.js} +1 -1
  60. package/src/assets/web-panel/assets/Skills-BfkrC05g.js +1 -0
  61. package/src/assets/web-panel/assets/{Sla-B93c8j92.js → Sla-DEs5XCIf.js} +1 -1
  62. package/src/assets/web-panel/assets/SpeechSettings-BWMhb10j.js +1 -0
  63. package/src/assets/web-panel/assets/SpeechSettings-CiKvsIyV.css +1 -0
  64. package/src/assets/web-panel/assets/{Tasks-Db9TRjE7.js → Tasks-CIBUb9M1.js} +1 -1
  65. package/src/assets/web-panel/assets/Templates-DAkzr0xS.css +1 -0
  66. package/src/assets/web-panel/assets/Templates-iqSuJY-O.js +1 -0
  67. package/src/assets/web-panel/assets/{Tenant-BXS8s6vl.js → Tenant-CLqZjkVq.js} +1 -1
  68. package/src/assets/web-panel/assets/{Tokens-CvmTVU7E.js → Tokens-Bwz8aQtK.js} +1 -1
  69. package/src/assets/web-panel/assets/Trigger-CxnChVoS.js +1 -0
  70. package/src/assets/web-panel/assets/{Trust-HMz40LfZ.js → Trust-Bp23lyZl.js} +1 -1
  71. package/src/assets/web-panel/assets/UkeySign-_VAMquoh.js +1 -0
  72. package/src/assets/web-panel/assets/{VideoEditing-DEhH42sI.js → VideoEditing-Bxqwg4zW.js} +1 -1
  73. package/src/assets/web-panel/assets/{Wallet-AGwfOdTM.js → Wallet-Cvht6Yrh.js} +4 -4
  74. package/src/assets/web-panel/assets/{WebAuthn-DK5tKWul.js → WebAuthn-DD4EomJu.js} +4 -4
  75. package/src/assets/web-panel/assets/WorkflowEditor-CEKNTS5G.css +1 -0
  76. package/src/assets/web-panel/assets/WorkflowEditor-CJy5e0fl.js +1 -0
  77. package/src/assets/web-panel/assets/{chat-CVn-r3oV.js → chat-DY27mJje.js} +1 -1
  78. package/src/assets/web-panel/assets/{collapseMotion-D3P4mRvK.js → collapseMotion-CyadT_6x.js} +1 -1
  79. package/src/assets/web-panel/assets/{colors-BiB5aDao.js → colors-B7fDvuJc.js} +1 -1
  80. package/src/assets/web-panel/assets/{compact-item-CHderV9n.js → compact-item-DgthOVXi.js} +1 -1
  81. package/src/assets/web-panel/assets/{createContext-DMZ-5dy2.js → createContext-Blw2vgkG.js} +1 -1
  82. package/src/assets/web-panel/assets/{hasIn-BKDBYP3s.js → hasIn-BfL1HJZl.js} +1 -1
  83. package/src/assets/web-panel/assets/{icons-ukMaZ3tx.js → icons-CJACPYXu.js} +4 -4
  84. package/src/assets/web-panel/assets/{index-DvI8Xtzv.js → index-00RNC3ZQ.js} +2 -2
  85. package/src/assets/web-panel/assets/{index-BlXskar6.js → index-B9B9Zbf3.js} +1 -1
  86. package/src/assets/web-panel/assets/index-BAsMNMbh.js +1 -0
  87. package/src/assets/web-panel/assets/{index-BfKFNptm.js → index-BB5y5Y0z.js} +3 -3
  88. package/src/assets/web-panel/assets/{index-CBYNsy51.js → index-BHnaIQEm.js} +1 -1
  89. package/src/assets/web-panel/assets/index-BVjDIZQ4.js +1 -0
  90. package/src/assets/web-panel/assets/index-BZeRnzuY.js +55 -0
  91. package/src/assets/web-panel/assets/{index-BgDX-tzO.js → index-BZfoAtZC.js} +1 -1
  92. package/src/assets/web-panel/assets/index-Bl2nXm2J.js +13 -0
  93. package/src/assets/web-panel/assets/{index-B7fivpG2.js → index-BsleJWGy.js} +2 -2
  94. package/src/assets/web-panel/assets/{index-7fxCGMoL.js → index-BuEOhTAw.js} +5 -5
  95. package/src/assets/web-panel/assets/{index-BRRFK-im.js → index-Bw1dwHWm.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-BBk2e7vJ.js → index-Bw_UV2ez.js} +1 -1
  97. package/src/assets/web-panel/assets/index-C8GYpC65.js +1 -0
  98. package/src/assets/web-panel/assets/{index-BVOI707f.js → index-CBHlKa-J.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-CEpcKl17.js → index-CL-7KCFI.js} +2 -2
  100. package/src/assets/web-panel/assets/{index-BBWUR4u4.js → index-CiN4NEAa.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-DtDFSCfE.js → index-CqjUUbil.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-DvfAkHw8.js → index-Cqtt1N0F.js} +1 -1
  103. package/src/assets/web-panel/assets/index-D1QP9Ue1.js +1 -0
  104. package/src/assets/web-panel/assets/index-D6BUjL6I.js +1 -0
  105. package/src/assets/web-panel/assets/{index-BadelvSE.js → index-DN7ywgBJ.js} +1 -1
  106. package/src/assets/web-panel/assets/index-DasW8LIs.js +1 -0
  107. package/src/assets/web-panel/assets/{index-D3lD9wgX.js → index-Dd9McFt_.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-DZ8MjPLC.js → index-DdzLEdL6.js} +1 -1
  109. package/src/assets/web-panel/assets/index-DhML6F3z.js +1 -0
  110. package/src/assets/web-panel/assets/{index-Ncxqj2UN.js → index-DjN0nHiV.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-7pqZqPD2.js → index-DjhWpiZW.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-BryAkWUJ.js → index-DouFuKIR.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-CUT3Nmzx.js → index-DyRzaN4b.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-BjSojphX.js → index-DzWwjWYN.js} +1 -1
  115. package/src/assets/web-panel/assets/index-Dza_w3kG.js +1 -0
  116. package/src/assets/web-panel/assets/{index-AIdelwOe.js → index-Q4qgOtOe.js} +1 -1
  117. package/src/assets/web-panel/assets/index-Vit9TJBu.js +36 -0
  118. package/src/assets/web-panel/assets/{index-_sntSncx.js → index-lkJllVbJ.js} +3 -3
  119. package/src/assets/web-panel/assets/{index-CbpCY2ch.js → index-uMWaXVtR.js} +2 -2
  120. package/src/assets/web-panel/assets/{index-uujjC_4g.js → index-uwh_ikIt.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-C1p_dZw0.js → index-x8iHfZRd.js} +3 -3
  122. package/src/assets/web-panel/assets/{initDefaultProps-B2vQoQga.js → initDefaultProps-BeWIEzBr.js} +1 -1
  123. package/src/assets/web-panel/assets/{motion-D2eluOJu.js → motion-CIQOKmi6.js} +3 -3
  124. package/src/assets/web-panel/assets/{move-CgcvSoZ7.js → move-ZgRPlBji.js} +1 -1
  125. package/src/assets/web-panel/assets/{omit-DvLh7wH1.js → omit-BS0H_YEP.js} +1 -1
  126. package/src/assets/web-panel/assets/{pickAttrs-BsseBclw.js → pickAttrs-BOGgGau8.js} +1 -1
  127. package/src/assets/web-panel/assets/{placementArrow-XLLtr9qD.js → placementArrow--c5TQkDQ.js} +1 -1
  128. package/src/assets/web-panel/assets/{responsiveObserve-ByCb5zZK.js → responsiveObserve-CrHOX7jp.js} +1 -1
  129. package/src/assets/web-panel/assets/{slide-CeP5JCiZ.js → slide-Dd2mJUD0.js} +1 -1
  130. package/src/assets/web-panel/assets/{statusUtils-DMVoo96t.js → statusUtils-5QFvAofV.js} +1 -1
  131. package/src/assets/web-panel/assets/{styleChecker-Cz5mJgc8.js → styleChecker-CiDrXnbi.js} +1 -1
  132. package/src/assets/web-panel/assets/{transition-DSe9CgZe.js → transition-CVd2ueaJ.js} +1 -1
  133. package/src/assets/web-panel/assets/{useConfigInject-DCcT0grw.js → useConfigInject-DIkkDpt1.js} +2 -2
  134. package/src/assets/web-panel/assets/useFlexGapSupport-rrtj6f1h.js +1 -0
  135. package/src/assets/web-panel/assets/useFs-CK8VYPus.js +1 -0
  136. package/src/assets/web-panel/assets/{useMergedState-DbHXwBgv.js → useMergedState-CLY-UHry.js} +1 -1
  137. package/src/assets/web-panel/assets/{useRefs-DRyTVik7.js → useRefs-HzOoMkZk.js} +1 -1
  138. package/src/assets/web-panel/assets/useShellMode-CgR0wCYM.js +1 -0
  139. package/src/assets/web-panel/assets/{useState-DoAhV80c.js → useState-yWVBuz1S.js} +1 -1
  140. package/src/assets/web-panel/assets/{vendor-BVetwVfk.js → vendor-D0Qjn73K.js} +1 -1
  141. package/src/assets/web-panel/assets/vnode-xRp-KMjS.js +1 -0
  142. package/src/assets/web-panel/assets/ws-4ur1fGsk.js +1 -0
  143. package/src/assets/web-panel/assets/{zoom-CDfM_sRk.js → zoom-CrI_kdTW.js} +1 -1
  144. package/src/assets/web-panel/index.html +3 -3
  145. package/src/gateways/ws/ws-session-gateway.js +12 -1
  146. package/src/lib/listen-with-port-fallback.js +103 -0
  147. package/src/runtime/agent-runtime.js +80 -18
  148. package/src/assets/web-panel/assets/AppLayout-BbfBwVfE.js +0 -1
  149. package/src/assets/web-panel/assets/AppLayout-CKMl4NLf.css +0 -1
  150. package/src/assets/web-panel/assets/Audit-DzddAZVx.js +0 -1
  151. package/src/assets/web-panel/assets/Audit-L4_ApS01.css +0 -1
  152. package/src/assets/web-panel/assets/Backup-D46qSgzQ.js +0 -1
  153. package/src/assets/web-panel/assets/Backup-fZqtfC1m.css +0 -1
  154. package/src/assets/web-panel/assets/McpTools-CyhSLDwf.css +0 -1
  155. package/src/assets/web-panel/assets/McpTools-DbwkdBUE.js +0 -4
  156. package/src/assets/web-panel/assets/Notes-BG69sJKi.css +0 -1
  157. package/src/assets/web-panel/assets/Notes-u6lLTv0t.js +0 -2
  158. package/src/assets/web-panel/assets/Portal-CHsntPCQ.js +0 -1
  159. package/src/assets/web-panel/assets/Privacy-BKPoZngH.js +0 -1
  160. package/src/assets/web-panel/assets/Skills-DowQcRe1.js +0 -1
  161. package/src/assets/web-panel/assets/Templates-DJ_hvs5c.js +0 -1
  162. package/src/assets/web-panel/assets/Templates-DOY_oZnm.css +0 -1
  163. package/src/assets/web-panel/assets/Trigger-BenSsaoN.js +0 -1
  164. package/src/assets/web-panel/assets/WorkflowEditor-D5bX6woe.css +0 -1
  165. package/src/assets/web-panel/assets/WorkflowEditor-vlujdL6I.js +0 -1
  166. package/src/assets/web-panel/assets/index-A4RpHMOa.js +0 -1
  167. package/src/assets/web-panel/assets/index-B5oebI6W.js +0 -1
  168. package/src/assets/web-panel/assets/index-D3PGpBPm.js +0 -1
  169. package/src/assets/web-panel/assets/index-D5Beu9ZA.js +0 -1
  170. package/src/assets/web-panel/assets/index-DRRzH4Ge.js +0 -13
  171. package/src/assets/web-panel/assets/index-DRcTAUJA.js +0 -1
  172. package/src/assets/web-panel/assets/index-DfcXDy2A.js +0 -36
  173. package/src/assets/web-panel/assets/index-DyXslU_B.js +0 -1
  174. package/src/assets/web-panel/assets/index-MoLxDrkb.js +0 -55
  175. package/src/assets/web-panel/assets/index-YgC7QI1N.js +0 -1
  176. package/src/assets/web-panel/assets/index-yMt4C1Gh.js +0 -1
  177. package/src/assets/web-panel/assets/useFlexGapSupport-BZkoDuF3.js +0 -1
  178. package/src/assets/web-panel/assets/vnode-Dexy2NN9.js +0 -1
  179. package/src/assets/web-panel/assets/ws-Bv7YH0VB.js +0 -1
@@ -0,0 +1 @@
1
+ import{k as Q,r as P,j as K}from"./vendor-D0Qjn73K.js";let V=0;const S=()=>`wp-${++V}`,W=new Set;function w(t,s={},o={}){return{type:t,kind:o.kind||"server",sessionId:o.sessionId||s.sessionId||null,timestamp:o.timestamp||Date.now(),payload:s}}function X(t){const s=t?.type,o=t?.payload||{};switch(s){case"task:notification":return w("task:notification",{task:t.task||o.task},{kind:"server"});case"session-created":case"session.started":return w("session:start",{sessionId:t.sessionId||o.sessionId,sessionType:t.sessionType||o.sessionType||null,record:t.record||o.record||{id:t.sessionId||o.sessionId,type:t.sessionType||o.sessionType||null,status:"created",history:[],messageCount:0}},{kind:"server",sessionId:t.sessionId||o.sessionId});case"session-resumed":case"session.resumed":{const f=t.sessionId||o.sessionId,c=t.history||o.history||[];return w("session:resume",{sessionId:f,history:c,historyCount:Array.isArray(c)?c.length:0,record:t.record||o.record||{id:f,type:null,status:"resumed",history:c,messageCount:Array.isArray(c)?c.length:0}},{kind:"server",sessionId:f})}case"worktree-diff":case"worktree.diff":return w("worktree:diff:ready",{requestId:t.requestId||t.id||null,record:t.record||o.record||{branch:t.branch||o.branch||null,summary:t.summary||o.summary||null,previewEntrypoints:[{type:"worktree-diff",branch:t.branch||o.branch||null}]}},{kind:"server"});case"worktree-merged":case"worktree.merged":return w("worktree:merge:completed",{requestId:t.requestId||t.id||null,record:t.record||o.record||{branch:t.branch||o.branch||null,summary:t.summary||o.summary||null,conflicts:t.conflicts||o.conflicts||[],previewEntrypoints:t.previewEntrypoints||o.previewEntrypoints||[]}},{kind:"server"});case"compression-stats":case"context.compaction.completed":return w("compression:summary",{requestId:t.requestId||t.id||null,summary:t.summary||o.summary||{}},{kind:"server"});default:return null}}function M(t,s=null){W.forEach(o=>o(t,s||t))}function Y(t){if(!t)return null;const s=t.record||{id:t.id||null,type:t.type||null,provider:t.provider||null,model:t.model||null,projectRoot:t.projectRoot||null,messageCount:t.messageCount??0,history:t.history||[],status:t.status||null};return{...t,id:t.id||s.id,type:t.type||s.type,provider:t.provider||s.provider,model:t.model||s.model,projectRoot:t.projectRoot||s.projectRoot,messageCount:t.messageCount??s.messageCount??0,status:t.status||s.status||null,record:s}}const g=Q("ws",()=>{const t=P(null),s=P("disconnected"),o=P(null),f=new Map,c=new Map;let m=null,b=1e3,I=!1;const k=window.__CC_CONFIG__||{},R=K(()=>`ws://${k.wsHost||"127.0.0.1"}:${k.wsPort||18800}`);function C(){if(!(t.value?.readyState===WebSocket.OPEN||t.value?.readyState===WebSocket.CONNECTING)){clearTimeout(m),m=null,I=!1,s.value="connecting",o.value=null;try{const e=new WebSocket(R.value);t.value=e,e.onopen=()=>{b=1e3,k.wsToken?v({type:"auth",id:S(),token:k.wsToken}).then(()=>{s.value="connected"}).catch(()=>{s.value="connected"}):s.value="connected"},e.onmessage=n=>{let r;try{r=JSON.parse(n.data)}catch{return}A(r)},e.onerror=()=>{o.value="WebSocket error",s.value="error"},e.onclose=()=>{if(s.value="disconnected",t.value=null,f.forEach(({reject:n})=>n(new Error("WebSocket closed"))),f.clear(),y.forEach(({reject:n,clear:r})=>{try{r()}catch{}n(new Error("WebSocket closed"))}),y.clear(),I){I=!1,m=null;return}m=setTimeout(()=>{b=Math.min(b*2,3e4),m=null,C()},b)}}catch(e){s.value="error",o.value=e.message}}}function q(){clearTimeout(m),m=null,I=!0,t.value?.close(),t.value=null,s.value="disconnected"}function J(e){if(!e.version&&!e.payload)return e;const n=e.payload||{};return{...e,...n,type:e.type,sessionId:e.sessionId||n.sessionId||null}}function A(e){const{type:n}=e,r=e.requestId||e.id;let i=!1;if(r&&y.has(r)&&typeof n=="string"){const u=y.get(r);if(n.endsWith(".chunk")){try{u.onChunk(e.chunk)}catch{}return u.rearm(),!0}if(n.endsWith(".result"))return y.delete(r),u.clear(),e.ok===!1?u.reject(new Error(e.error||"Stream error")):u.resolve(e.result??null),!0}if(r&&f.has(r)){const{resolve:u,reject:d,timeout:l}=f.get(r);clearTimeout(l),f.delete(r),i=!0;const h=J(e);h.id=r,n==="error"?d(new Error(h.message||"Unknown error")):u(h)}const a=e.sessionId||e.payload&&e.payload.sessionId||null;if(a&&c.has(a)){const u=J(e);c.get(a).forEach(l=>l(u))}O.forEach(u=>u(e));const p=X(e);return p&&M(p,e),i}const O=new Set;function $(e){return O.add(e),()=>O.delete(e)}function _(e){return W.add(e),()=>W.delete(e)}function j(e,n){return c.has(e)||c.set(e,new Set),c.get(e).add(n),()=>{c.get(e)?.delete(n),c.get(e)?.size===0&&c.delete(e)}}function v(e,n=15e3){return new Promise((r,i)=>{if(t.value?.readyState!==WebSocket.OPEN){i(new Error("WebSocket not connected"));return}const a=e.id||S(),p=setTimeout(()=>{f.delete(a),i(new Error("Request timeout"))},n);f.set(a,{resolve:r,reject:i,timeout:p}),t.value.send(JSON.stringify({...e,id:a}))})}const y=new Map;function D(e,n={}){return new Promise((r,i)=>{if(t.value?.readyState!==WebSocket.OPEN){i(new Error("WebSocket not connected"));return}const a=e.id||S(),p=n.idleMs??3e4,u=typeof n.onChunk=="function"?n.onChunk:()=>{},d=n.signal;if(d?.aborted){const N=d.reason instanceof Error?d.reason:new Error("aborted");i(N);return}let l=null;const h=()=>{p&&(l&&clearTimeout(l),l=setTimeout(()=>{y.has(a)&&(y.delete(a),i(new Error("Stream idle timeout")))},p))},T=()=>{if(!y.has(a))return;y.delete(a),l&&(clearTimeout(l),l=null);try{t.value?.readyState===WebSocket.OPEN&&t.value.send(JSON.stringify({type:`${e.type}.cancel`,id:a}))}catch{}const N=d?.reason instanceof Error?d.reason:new Error("aborted");i(N)};y.set(a,{onChunk:u,resolve:r,reject:i,clear:()=>{if(l&&clearTimeout(l),l=null,d&&T)try{d.removeEventListener("abort",T)}catch{}},rearm:h}),h(),d&&d.addEventListener("abort",T,{once:!0}),t.value.send(JSON.stringify({...e,id:a}))})}function E(e=8e3){return s.value==="connected"?Promise.resolve():new Promise((n,r)=>{const i=Date.now()+e,a=()=>{if(s.value==="connected")return n();if(s.value==="error"||Date.now()>=i)return r(new Error(`WS not ready: ${s.value}`));setTimeout(a,150)};s.value==="disconnected"&&C(),a()})}async function x(e,n=3e4){await E(8e3);const r=await v({type:"execute",command:e},n),i=r.output??r.stdout??"",a=r.stderr??"";return{output:i||a,exitCode:r.exitCode??0}}async function H(e,n=3e4){const{output:r,exitCode:i}=await x(e,n);if(i!==0)throw new Error(`Command failed: ${r}`);try{return JSON.parse(r.trim())}catch{const a=r.match(/\{[\s\S]*\}|\[[\s\S]*\]/);if(a)return JSON.parse(a[0]);throw new Error(`Invalid JSON output: ${r.slice(0,200)}`)}}async function z(e="chat",n=null,r={}){await E(8e3);const a={type:"session-create",id:S(),sessionType:e,projectRoot:n||k.projectRoot||null};return r.systemPromptExtension&&(a.systemPromptExtension=r.systemPromptExtension),Array.isArray(r.shellPolicyOverrides)&&r.shellPolicyOverrides.length&&(a.shellPolicyOverrides=r.shellPolicyOverrides),(await v(a)).sessionId}function G(e,n){t.value?.readyState===WebSocket.OPEN&&t.value.send(JSON.stringify({type:"session-message",id:S(),sessionId:e,content:n}))}function L(e,n,r){t.value?.readyState===WebSocket.OPEN&&t.value.send(JSON.stringify({type:"session-answer",id:S(),sessionId:e,requestId:n,answer:r}))}async function U(){return await E(8e3),((await v({type:"session-list"},1e4)).sessions||[]).map(Y).filter(Boolean)}async function B(e){try{await v({type:"session-close",sessionId:e},5e3),M(w("session:end",{sessionId:e},{kind:"server",sessionId:e}),{type:"result",sessionId:e,success:!0})}catch{}}async function F(e){return await E(8e3),await v({type:"session-resume",sessionId:e},1e4)}return{status:s,error:o,wsUrl:R,connect:C,disconnect:q,waitConnected:E,onMessage:$,onRuntimeEvent:_,onSession:j,sendRaw:v,sendStream:D,execute:x,executeJson:H,createSession:z,resumeSession:F,sendSessionMessage:G,answerQuestion:L,listSessions:U,closeSession:B}});export{g as u};
@@ -1,4 +1,4 @@
1
- import{K as o}from"./Keyframes-C7fCrnlS.js";import{i as f}from"./motion-D2eluOJu.js";const c=new o("antZoomIn",{"0%":{transform:"scale(0.2)",opacity:0},"100%":{transform:"scale(1)",opacity:1}}),y=new o("antZoomOut",{"0%":{transform:"scale(1)"},"100%":{transform:"scale(0.2)",opacity:0}}),a=new o("antZoomBigIn",{"0%":{transform:"scale(0.8)",opacity:0},"100%":{transform:"scale(1)",opacity:1}}),s=new o("antZoomBigOut",{"0%":{transform:"scale(1)"},"100%":{transform:"scale(0.8)",opacity:0}}),g=new o("antZoomUpIn",{"0%":{transform:"scale(0.8)",transformOrigin:"50% 0%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"50% 0%"}}),O=new o("antZoomUpOut",{"0%":{transform:"scale(1)",transformOrigin:"50% 0%"},"100%":{transform:"scale(0.8)",transformOrigin:"50% 0%",opacity:0}}),l=new o("antZoomLeftIn",{"0%":{transform:"scale(0.8)",transformOrigin:"0% 50%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"0% 50%"}}),u=new o("antZoomLeftOut",{"0%":{transform:"scale(1)",transformOrigin:"0% 50%"},"100%":{transform:"scale(0.8)",transformOrigin:"0% 50%",opacity:0}}),p=new o("antZoomRightIn",{"0%":{transform:"scale(0.8)",transformOrigin:"100% 50%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"100% 50%"}}),z=new o("antZoomRightOut",{"0%":{transform:"scale(1)",transformOrigin:"100% 50%"},"100%":{transform:"scale(0.8)",transformOrigin:"100% 50%",opacity:0}}),K=new o("antZoomDownIn",{"0%":{transform:"scale(0.8)",transformOrigin:"50% 100%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"50% 100%"}}),w=new o("antZoomDownOut",{"0%":{transform:"scale(1)",transformOrigin:"50% 100%"},"100%":{transform:"scale(0.8)",transformOrigin:"50% 100%",opacity:0}}),I={zoom:{inKeyframes:c,outKeyframes:y},"zoom-big":{inKeyframes:a,outKeyframes:s},"zoom-big-fast":{inKeyframes:a,outKeyframes:s},"zoom-left":{inKeyframes:l,outKeyframes:u},"zoom-right":{inKeyframes:p,outKeyframes:z},"zoom-up":{inKeyframes:g,outKeyframes:O},"zoom-down":{inKeyframes:K,outKeyframes:w}},h=(n,r)=>{const{antCls:m}=n,t=`${m}-${r}`,{inKeyframes:i,outKeyframes:e}=I[r];return[f(t,i,e,r==="zoom-big-fast"?n.motionDurationFast:n.motionDurationMid),{[`
1
+ import{K as o}from"./Keyframes-C7fCrnlS.js";import{i as f}from"./motion-CIQOKmi6.js";const c=new o("antZoomIn",{"0%":{transform:"scale(0.2)",opacity:0},"100%":{transform:"scale(1)",opacity:1}}),y=new o("antZoomOut",{"0%":{transform:"scale(1)"},"100%":{transform:"scale(0.2)",opacity:0}}),a=new o("antZoomBigIn",{"0%":{transform:"scale(0.8)",opacity:0},"100%":{transform:"scale(1)",opacity:1}}),s=new o("antZoomBigOut",{"0%":{transform:"scale(1)"},"100%":{transform:"scale(0.8)",opacity:0}}),g=new o("antZoomUpIn",{"0%":{transform:"scale(0.8)",transformOrigin:"50% 0%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"50% 0%"}}),O=new o("antZoomUpOut",{"0%":{transform:"scale(1)",transformOrigin:"50% 0%"},"100%":{transform:"scale(0.8)",transformOrigin:"50% 0%",opacity:0}}),l=new o("antZoomLeftIn",{"0%":{transform:"scale(0.8)",transformOrigin:"0% 50%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"0% 50%"}}),u=new o("antZoomLeftOut",{"0%":{transform:"scale(1)",transformOrigin:"0% 50%"},"100%":{transform:"scale(0.8)",transformOrigin:"0% 50%",opacity:0}}),p=new o("antZoomRightIn",{"0%":{transform:"scale(0.8)",transformOrigin:"100% 50%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"100% 50%"}}),z=new o("antZoomRightOut",{"0%":{transform:"scale(1)",transformOrigin:"100% 50%"},"100%":{transform:"scale(0.8)",transformOrigin:"100% 50%",opacity:0}}),K=new o("antZoomDownIn",{"0%":{transform:"scale(0.8)",transformOrigin:"50% 100%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"50% 100%"}}),w=new o("antZoomDownOut",{"0%":{transform:"scale(1)",transformOrigin:"50% 100%"},"100%":{transform:"scale(0.8)",transformOrigin:"50% 100%",opacity:0}}),I={zoom:{inKeyframes:c,outKeyframes:y},"zoom-big":{inKeyframes:a,outKeyframes:s},"zoom-big-fast":{inKeyframes:a,outKeyframes:s},"zoom-left":{inKeyframes:l,outKeyframes:u},"zoom-right":{inKeyframes:p,outKeyframes:z},"zoom-up":{inKeyframes:g,outKeyframes:O},"zoom-down":{inKeyframes:K,outKeyframes:w}},h=(n,r)=>{const{antCls:m}=n,t=`${m}-${r}`,{inKeyframes:i,outKeyframes:e}=I[r];return[f(t,i,e,r==="zoom-big-fast"?n.motionDurationFast:n.motionDurationMid),{[`
2
2
  ${t}-enter,
3
3
  ${t}-appear
4
4
  `]:{transform:"scale(0)",opacity:0,animationTimingFunction:n.motionEaseOutCirc,"&-prepare":{transform:"none"}},[`${t}-leave`]:{animationTimingFunction:n.motionEaseInOutCirc}}]};export{h as i,c as z};
@@ -8,9 +8,9 @@
8
8
  // Injected by web-ui-server.js at serve time
9
9
  window.__CC_CONFIG__ = __CC_CONFIG_PLACEHOLDER__;
10
10
  </script>
11
- <script type="module" crossorigin src="./assets/index-DfcXDy2A.js"></script>
12
- <link rel="modulepreload" crossorigin href="./assets/vendor-BVetwVfk.js">
13
- <link rel="modulepreload" crossorigin href="./assets/icons-ukMaZ3tx.js">
11
+ <script type="module" crossorigin src="./assets/index-Vit9TJBu.js"></script>
12
+ <link rel="modulepreload" crossorigin href="./assets/vendor-D0Qjn73K.js">
13
+ <link rel="modulepreload" crossorigin href="./assets/icons-CJACPYXu.js">
14
14
  <link rel="stylesheet" crossorigin href="./assets/index-CyGyEIVX.css">
15
15
  </head>
16
16
  <body>
@@ -581,13 +581,19 @@ export class WSSessionManager {
581
581
  });
582
582
  }
583
583
 
584
- // DB sessions (exclude already-listed in-memory ones)
584
+ // DB sessions (exclude already-listed in-memory ones AND closed ones —
585
+ // closeSession persists `status: "closed"` to metadata before deleting
586
+ // from in-memory; without this filter the closed session keeps showing
587
+ // up in `session-list`, contradicting the contract).
585
588
  if (this.db) {
586
589
  try {
587
590
  const dbSessions = dbListSessions(this.db, { limit: 20 });
588
591
  const inMemoryIds = new Set(this.sessions.keys());
589
592
  for (const dbs of dbSessions) {
590
593
  const metadata = this._normalizeSessionMetadata(dbs.metadata);
594
+ if (metadata && metadata.status === "closed") {
595
+ continue;
596
+ }
591
597
  if (!inMemoryIds.has(dbs.id)) {
592
598
  results.push({
593
599
  id: dbs.id,
@@ -1289,6 +1295,11 @@ export class WSSessionManager {
1289
1295
  return {
1290
1296
  version: 1,
1291
1297
  sessionType: session.type || "agent",
1298
+ // Persist status so listSessions can exclude closed sessions when
1299
+ // re-hydrating from DB. Without this, a closed session keeps
1300
+ // showing up in `session-list` because closeSession deletes from
1301
+ // in-memory map BEFORE the DB row is filtered.
1302
+ status: session.status || "active",
1292
1303
  projectRoot: session.projectRoot || null,
1293
1304
  baseProjectRoot: session.baseProjectRoot || session.projectRoot || null,
1294
1305
  baseUrl: session.baseUrl || null,
@@ -0,0 +1,103 @@
1
+ /**
2
+ * listen-with-port-fallback.js
3
+ *
4
+ * Try to bind a server on the preferred port. If that port is taken
5
+ * (EADDRINUSE), walk through adjacent ports up to `maxAttempts`. If
6
+ * every adjacent port is also taken, fall back once more to port 0
7
+ * (OS-assigned ephemeral). Surfaces the actually bound port so the
8
+ * caller can log it / propagate it to dependent servers (e.g. the
9
+ * HTTP server's `__CC_CONFIG__.wsPort` injection).
10
+ *
11
+ * Used by `cc ui`'s startUiServer for both the WS and HTTP servers
12
+ * — port collisions are common during development (multiple `cc ui`
13
+ * instances, prior crashes that left listeners orphaned, the desktop
14
+ * web-shell already running, etc.) and crashing on EADDRINUSE makes
15
+ * for poor UX.
16
+ */
17
+
18
+ /**
19
+ * @template T
20
+ * @param {(port: number) => Promise<T>} listenFn
21
+ * Per-attempt binder. Must reject with `err.code === "EADDRINUSE"` on
22
+ * conflict; any other error propagates immediately. Resolved value is
23
+ * passed through verbatim so the caller can pull the actual port from
24
+ * their server handle (the listenFn is expected to readback the bound
25
+ * port from `address()` after listen — see ws-server.js for the pattern).
26
+ *
27
+ * @param {number} preferred
28
+ * First port to attempt. Must be in [1, 65535]; pass 0 to skip the
29
+ * sequential walk and go straight to OS-assigned.
30
+ *
31
+ * @param {object} [opts]
32
+ * @param {number} [opts.maxAttempts=20]
33
+ * How many sequential adjacent ports to try after `preferred` (so the
34
+ * walk covers `preferred`, `preferred+1`, …, `preferred + maxAttempts - 1`).
35
+ * @param {(msg: string) => void} [opts.onFallback]
36
+ * Optional notifier called once when the preferred port is taken,
37
+ * with a human-readable message summarising the fallback decision.
38
+ *
39
+ * @returns {Promise<T>} the listenFn's resolved value for the port that bound.
40
+ */
41
+ export async function listenWithPortFallback(listenFn, preferred, opts = {}) {
42
+ const { maxAttempts = 20, onFallback } = opts;
43
+
44
+ if (typeof listenFn !== "function") {
45
+ throw new TypeError("listenWithPortFallback: listenFn must be a function");
46
+ }
47
+ if (!Number.isInteger(preferred) || preferred < 0 || preferred > 65535) {
48
+ throw new RangeError(
49
+ `listenWithPortFallback: preferred port out of range: ${preferred}`,
50
+ );
51
+ }
52
+
53
+ // preferred === 0 means caller already wants OS-assigned, no fallback needed.
54
+ if (preferred === 0) {
55
+ return listenFn(0);
56
+ }
57
+
58
+ const upper = Math.min(preferred + maxAttempts, 65536);
59
+ const tried = [];
60
+
61
+ for (let port = preferred; port < upper; port++) {
62
+ try {
63
+ const result = await listenFn(port);
64
+ if (port !== preferred && typeof onFallback === "function") {
65
+ try {
66
+ onFallback(
67
+ `Port ${preferred} in use; bound on ${port} instead (tried ${tried.join(", ")}).`,
68
+ );
69
+ } catch {
70
+ /* swallow — onFallback is informational */
71
+ }
72
+ }
73
+ return result;
74
+ } catch (err) {
75
+ if (err && err.code === "EADDRINUSE") {
76
+ tried.push(port);
77
+ continue;
78
+ }
79
+ throw err;
80
+ }
81
+ }
82
+
83
+ // All sequential ports busy — final fallback to OS-assigned.
84
+ if (typeof onFallback === "function") {
85
+ try {
86
+ onFallback(
87
+ `Ports ${tried.join(", ")} all in use; falling back to OS-assigned port.`,
88
+ );
89
+ } catch {
90
+ /* swallow */
91
+ }
92
+ }
93
+ try {
94
+ return await listenFn(0);
95
+ } catch (err) {
96
+ if (err && err.code === "EADDRINUSE") {
97
+ throw new Error(
98
+ `Could not bind any port. Tried: ${tried.join(", ")} and OS-assigned. Last error: ${err.message}`,
99
+ );
100
+ }
101
+ throw err;
102
+ }
103
+ }
@@ -9,6 +9,7 @@ import {
9
9
  import { createRuntimeContext } from "./runtime-context.js";
10
10
  import { createAgentTurnRecord } from "./contracts/agent-turn.js";
11
11
  import { logger } from "../lib/logger.js";
12
+ import { listenWithPortFallback } from "../lib/listen-with-port-fallback.js";
12
13
  import { bootstrap } from "./bootstrap.js";
13
14
  import { startAgentRepl } from "../gateways/repl/agent-repl.js";
14
15
  import { startChatRepl } from "../gateways/repl/chat-repl.js";
@@ -477,18 +478,55 @@ export class AgentRuntime {
477
478
  mcpServerRegistry: this.deps.mcpServerRegistry,
478
479
  });
479
480
 
480
- const wsServer = this.deps.createServer({
481
- port: wsPort,
482
- host,
483
- token: this.policy.token,
484
- maxConnections: 20,
485
- timeout: 60000,
486
- sessionManager,
487
- });
488
- await wsServer.start();
481
+ // Bind the WS server with port-fallback so multiple `cc ui` instances
482
+ // (or a desktop web-shell already running on 18800) don't crash this
483
+ // one. listenWithPortFallback walks preferred → +20 adjacent → OS-
484
+ // assigned. The WS server's listen handler updates `wsServer.port` to
485
+ // the actual bound port; we read that back for the HTTP injection.
486
+ let wsServer = null;
487
+ await listenWithPortFallback(
488
+ async (port) => {
489
+ const candidate = this.deps.createServer({
490
+ port,
491
+ host,
492
+ token: this.policy.token,
493
+ maxConnections: 20,
494
+ timeout: 60000,
495
+ sessionManager,
496
+ });
497
+ // ChainlessChainWSServer extends EventEmitter and emits "error"
498
+ // synchronously on bind failure (in addition to rejecting start()).
499
+ // Without a listener Node throws "Unhandled 'error' event" before
500
+ // our reject can settle — crashing the whole process before
501
+ // listenWithPortFallback can catch EADDRINUSE and try the next port.
502
+ // Attach a no-op so the rejection from start() is the single
503
+ // source of failure visibility.
504
+ candidate.on("error", () => {});
505
+ try {
506
+ await candidate.start();
507
+ } catch (err) {
508
+ // Best-effort cleanup so the failed candidate doesn't leak
509
+ // listeners before we retry on the next port.
510
+ try {
511
+ await candidate.stop();
512
+ } catch {
513
+ /* candidate never bound */
514
+ }
515
+ throw err;
516
+ }
517
+ wsServer = candidate;
518
+ return candidate;
519
+ },
520
+ wsPort,
521
+ {
522
+ onFallback: (msg) => runtimeLogger.log(chalk.yellow(` [WS] ${msg}`)),
523
+ },
524
+ );
525
+
526
+ const actualWsPort = wsServer.port;
489
527
 
490
528
  const httpServer = this.deps.createWebServer({
491
- wsPort,
529
+ wsPort: actualWsPort,
492
530
  wsToken: this.policy.token,
493
531
  wsHost: host === "0.0.0.0" ? "127.0.0.1" : host,
494
532
  projectRoot,
@@ -498,12 +536,34 @@ export class AgentRuntime {
498
536
  uiMode: this.policy.uiMode,
499
537
  });
500
538
 
501
- await new Promise((resolve, reject) => {
502
- httpServer.listen(httpPort, host, () => resolve());
503
- httpServer.on("error", reject);
504
- });
539
+ // Same fallback for HTTP. http.Server.listen takes (port, host, cb)
540
+ // and emits "error" once on bind failure; race them and surface the
541
+ // bound port back to the helper so it can decide whether to retry.
542
+ const actualHttpPort = await listenWithPortFallback(
543
+ (port) =>
544
+ new Promise((resolve, reject) => {
545
+ const onError = (err) => {
546
+ httpServer.removeListener("listening", onListening);
547
+ reject(err);
548
+ };
549
+ const onListening = () => {
550
+ httpServer.removeListener("error", onError);
551
+ const addr = httpServer.address();
552
+ const bound =
553
+ addr && typeof addr === "object" && addr.port ? addr.port : port;
554
+ resolve(bound);
555
+ };
556
+ httpServer.once("error", onError);
557
+ httpServer.once("listening", onListening);
558
+ httpServer.listen(port, host);
559
+ }),
560
+ httpPort,
561
+ {
562
+ onFallback: (msg) => runtimeLogger.log(chalk.yellow(` [HTTP] ${msg}`)),
563
+ },
564
+ );
505
565
 
506
- const uiUrl = `http://${host === "0.0.0.0" ? "127.0.0.1" : host}:${httpPort}`;
566
+ const uiUrl = `http://${host === "0.0.0.0" ? "127.0.0.1" : host}:${actualHttpPort}`;
507
567
 
508
568
  this.emit(RUNTIME_EVENTS.RUNTIME_START, {
509
569
  kind: this.kind,
@@ -511,8 +571,8 @@ export class AgentRuntime {
511
571
  });
512
572
  this.emit(RUNTIME_EVENTS.SERVER_START, {
513
573
  host,
514
- port: httpPort,
515
- wsPort,
574
+ port: actualHttpPort,
575
+ wsPort: actualWsPort,
516
576
  mode,
517
577
  projectRoot,
518
578
  });
@@ -531,7 +591,9 @@ export class AgentRuntime {
531
591
  runtimeLogger.log(` Mode: ${chalk.cyan("global")}`);
532
592
  }
533
593
  runtimeLogger.log(` UI: ${chalk.cyan(uiUrl)}`);
534
- runtimeLogger.log(` WS: ${chalk.dim(`ws://${host}:${wsPort}`)}`);
594
+ runtimeLogger.log(
595
+ ` WS: ${chalk.dim(`ws://${host}:${actualWsPort}`)}`,
596
+ );
535
597
  runtimeLogger.log(
536
598
  ` Auth: ${this.policy.token ? chalk.green("enabled") : chalk.yellow("disabled")}`,
537
599
  );
@@ -1 +0,0 @@
1
- import{r as D,w as ze,l as Je,m as g,x as t,q as u,B as He,C as Ye,v as a,c as e,D as i,E as S,u as n,F as y,G as B,H as A,I as v,J as l,K as qe,L as $e,j as m}from"./vendor-BVetwVfk.js";import{u as Qe}from"./ws-Bv7YH0VB.js";import{u as Xe,T as Ze}from"./index-DfcXDy2A.js";import{_ as he}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{F as O,G as N,D as j,M as E,R as F,C as G,A as M,N as V,a as W,b as z,c as J,d as H,B as Y,e as K,f as q,S as $,h as Q,i as X,j as Z,k as h,l as ee,P as te,m as oe,n as ne,o as L,p as se,I as le,L as ie,W as ae,q as de,r as ue,s as re,E as ye,t as pe,u as ke,v as ce,w as me,x as fe,y as _e,z as ge,U as ve,H as Oe,J as be,K as we,V as et,O as Ce,Q as Se,X as tt}from"./icons-ukMaZ3tx.js";const ot=["src"],nt={key:0,class:"logo-text"},st={key:0,class:"mode-banner project"},lt={class:"banner-info"},it={class:"banner-name"},at={key:1,class:"mode-banner global"},dt=["title"],ut={key:0,class:"footer-text"},rt={class:"header-left"},yt={class:"header-right"},pt={class:"theme-switcher"},kt=["data-theme-key","onClick"],ct={class:"version-tag"},Ae="cc.web-panel.sidebar.openKeys",mt={__name:"AppLayout",setup(ft){const je=He(),Ke=Ye(),b=Qe(),T=Xe(),r=D(!1),f=window.__CC_CONFIG__||{},c=m(()=>f.mode==="project"),Le="v5.0.3.1",Te=new URL(""+new URL("logo-DBCYUiWP.png",import.meta.url).href,import.meta.url).href,xe=m(()=>T.current),Be=m(()=>T.config.vars["--menu-mode"]),R=m(()=>{const d=Ke.name?.toLowerCase()||"dashboard";return[{mcptools:"mcp"}[d]||d]}),I=["g-overview","g-config","g-data","g-advanced","g-enterprise","g-social","g-media","g-extension"];function Ne(){try{const d=localStorage.getItem(Ae);if(d){const o=JSON.parse(d);if(Array.isArray(o))return o.filter(s=>I.includes(s))}}catch{}return[...I]}const x=D(Ne());ze(x,d=>{try{localStorage.setItem(Ae,JSON.stringify(d))}catch{}},{deep:!0});const w=m(()=>b.status),Re=m(()=>({connected:"success",connecting:"processing",error:"error",disconnected:"default"})[b.status]||"default"),Ie=m(()=>({connected:"已连接",connecting:"连接中...",error:"连接错误",disconnected:"未连接"})[b.status]||"未知");function Ue(d){T.setTheme(d)}function Pe({key:d}){je.push({mcp:"/mcp"}[d]||`/${d}`)}return Je(()=>b.connect()),(d,o)=>{const s=u("a-menu-item"),p=u("a-sub-menu"),_=u("a-menu-divider"),De=u("a-menu"),Ee=u("a-badge"),Fe=u("a-layout-sider"),U=u("a-tooltip"),Ge=u("a-tag"),Me=u("a-layout-header"),Ve=u("router-view"),We=u("a-layout-content"),P=u("a-layout");return a(),g(P,{class:"app-root"},{default:t(()=>[e(Fe,{collapsed:r.value,"onUpdate:collapsed":o[2]||(o[2]=k=>r.value=k),collapsible:"","collapsed-width":56,width:216,class:"sidebar"},{default:t(()=>[i("div",{class:S(["logo",{collapsed:r.value}])},[i("img",{src:n(Te),alt:"ChainlessChain",class:"logo-icon"},null,8,ot),r.value?B("",!0):(a(),y("span",nt,"ChainlessChain"))],2),r.value?(a(),y("div",{key:1,class:"mode-icon-sm",title:c.value?n(f).projectName:"全局模式"},[c.value?(a(),g(n(O),{key:0,style:{color:"#1677ff"}})):(a(),g(n(N),{key:1,style:{color:"#722ed1"}}))],8,dt)):(a(),y(A,{key:0},[c.value?(a(),y("div",st,[e(n(O),{class:"banner-icon"}),i("div",lt,[i("div",it,v(n(f).projectName||"项目"),1),o[3]||(o[3]=i("div",{class:"banner-sub"},"项目级面板",-1))])])):(a(),y("div",at,[e(n(N),{class:"banner-icon"}),o[4]||(o[4]=i("span",{class:"banner-name"},"全局模式",-1))]))],64)),e(De,{selectedKeys:R.value,"onUpdate:selectedKeys":o[0]||(o[0]=k=>R.value=k),openKeys:x.value,"onUpdate:openKeys":o[1]||(o[1]=k=>x.value=k),theme:Be.value,mode:"inline","inline-collapsed":r.value,class:"side-menu",onClick:Pe},{default:t(()=>[r.value?(a(),y(A,{key:1},[e(s,{key:"dashboard"},{icon:t(()=>[e(n(j))]),_:1}),e(s,{key:"chat"},{icon:t(()=>[e(n(E))]),_:1}),e(s,{key:"cowork"},{icon:t(()=>[e(n(F))]),_:1}),e(s,{key:"services"},{icon:t(()=>[e(n(G))]),_:1}),e(s,{key:"aiops"},{icon:t(()=>[e(n(M))]),_:1}),e(s,{key:"tokens"},{icon:t(()=>[e(n(V))]),_:1}),e(s,{key:"logs"},{icon:t(()=>[e(n(W))]),_:1}),e(_,{class:"divider-sm"}),e(s,{key:"skills"},{icon:t(()=>[e(n(z))]),_:1}),e(s,{key:"providers"},{icon:t(()=>[e(n(J))]),_:1}),e(s,{key:"mcp"},{icon:t(()=>[e(n(H))]),_:1}),e(s,{key:"project-settings"},{icon:t(()=>[e(n(O))]),_:1}),e(s,{key:"nlprog"},{icon:t(()=>[e(n(Y))]),_:1}),e(s,{key:"codegen"},{icon:t(()=>[e(n(K))]),_:1}),e(_,{class:"divider-sm"}),e(s,{key:"notes"},{icon:t(()=>[e(n(q))]),_:1}),e(s,{key:"search"},{icon:t(()=>[e(n($))]),_:1}),e(s,{key:"memory"},{icon:t(()=>[e(n(Q))]),_:1}),e(s,{key:"knowledge"},{icon:t(()=>[e(n(X))]),_:1}),e(s,{key:"marketplace"},{icon:t(()=>[e(n(Z))]),_:1}),e(s,{key:"cron"},{icon:t(()=>[e(n(h))]),_:1}),e(s,{key:"workflow"},{icon:t(()=>[e(n(ee))]),_:1}),e(s,{key:"pipeline"},{icon:t(()=>[e(n(te))]),_:1}),e(s,{key:"tasks"},{icon:t(()=>[e(n(oe))]),_:1}),e(_,{class:"divider-sm"}),e(s,{key:"security"},{icon:t(()=>[e(n(ne))]),_:1}),e(s,{key:"trust"},{icon:t(()=>[e(n(L))]),_:1}),e(s,{key:"audit"},{icon:t(()=>[e(n(se))]),_:1}),e(s,{key:"did"},{icon:t(()=>[e(n(le))]),_:1}),e(s,{key:"permissions"},{icon:t(()=>[e(n(ie))]),_:1}),e(s,{key:"p2p"},{icon:t(()=>[e(n(ae))]),_:1}),e(s,{key:"backup"},{icon:t(()=>[e(n(de))]),_:1}),e(s,{key:"git"},{icon:t(()=>[e(n(K))]),_:1}),e(s,{key:"projects"},{icon:t(()=>[e(n(ue))]),_:1}),e(s,{key:"crosschain"},{icon:t(()=>[e(n(re))]),_:1}),e(s,{key:"compliance"},{icon:t(()=>[e(n(L))]),_:1}),e(s,{key:"privacy"},{icon:t(()=>[e(n(ye))]),_:1}),e(s,{key:"inference"},{icon:t(()=>[e(n(pe))]),_:1}),e(s,{key:"federation"},{icon:t(()=>[e(n(ke))]),_:1}),e(_,{class:"divider-sm"}),e(s,{key:"wallet"},{icon:t(()=>[e(n(ce))]),_:1}),e(s,{key:"organization"},{icon:t(()=>[e(n(me))]),_:1}),e(s,{key:"tenant"},{icon:t(()=>[e(n(fe))]),_:1}),e(s,{key:"sla"},{icon:t(()=>[e(n(j))]),_:1}),e(s,{key:"analytics"},{icon:t(()=>[e(n(_e))]),_:1}),e(s,{key:"templates"},{icon:t(()=>[e(n(ge))]),_:1}),e(_,{class:"divider-sm"}),e(s,{key:"community"},{icon:t(()=>[e(n(ve))]),_:1}),e(s,{key:"governance"},{icon:t(()=>[e(n(Oe))]),_:1}),e(s,{key:"reputation"},{icon:t(()=>[e(n(be))]),_:1}),e(s,{key:"recommend"},{icon:t(()=>[e(n(we))]),_:1}),e(_,{class:"divider-sm"}),e(s,{key:"rssfeed"},{icon:t(()=>[e(n(Ce))]),_:1}),e(s,{key:"webauthn"},{icon:t(()=>[e(n(Se))]),_:1})],64)):(a(),y(A,{key:0},[e(p,{key:"g-overview"},{title:t(()=>[...o[5]||(o[5]=[i("span",{class:"group-label"},"概 览",-1)])]),default:t(()=>[e(s,{key:"dashboard"},{icon:t(()=>[e(n(j))]),default:t(()=>[o[6]||(o[6]=l("仪表板",-1))]),_:1}),e(s,{key:"chat"},{icon:t(()=>[e(n(E))]),default:t(()=>[o[7]||(o[7]=l("AI 对话",-1))]),_:1}),e(s,{key:"cowork"},{icon:t(()=>[e(n(F))]),default:t(()=>[o[8]||(o[8]=l("日常协作",-1))]),_:1}),e(s,{key:"services"},{icon:t(()=>[e(n(G))]),default:t(()=>[o[9]||(o[9]=l("服务管理",-1))]),_:1}),e(s,{key:"aiops"},{icon:t(()=>[e(n(M))]),default:t(()=>[o[10]||(o[10]=l("AIOps",-1))]),_:1}),e(s,{key:"tokens"},{icon:t(()=>[e(n(V))]),default:t(()=>[o[11]||(o[11]=l("Token 用量",-1))]),_:1}),e(s,{key:"logs"},{icon:t(()=>[e(n(W))]),default:t(()=>[o[12]||(o[12]=l("日志查看",-1))]),_:1})]),_:1}),e(p,{key:"g-config"},{title:t(()=>[...o[13]||(o[13]=[i("span",{class:"group-label"},"配 置",-1)])]),default:t(()=>[e(s,{key:"skills"},{icon:t(()=>[e(n(z))]),default:t(()=>[o[14]||(o[14]=l("技能管理",-1))]),_:1}),e(s,{key:"providers"},{icon:t(()=>[e(n(J))]),default:t(()=>[o[15]||(o[15]=l("LLM 配置",-1))]),_:1}),e(s,{key:"mcp"},{icon:t(()=>[e(n(H))]),default:t(()=>[o[16]||(o[16]=l("MCP 工具",-1))]),_:1}),e(s,{key:"project-settings"},{icon:t(()=>[e(n(O))]),default:t(()=>[o[17]||(o[17]=l("项目存储",-1))]),_:1}),e(s,{key:"nlprog"},{icon:t(()=>[e(n(Y))]),default:t(()=>[o[18]||(o[18]=l("自然语言编程",-1))]),_:1}),e(s,{key:"codegen"},{icon:t(()=>[e(n(K))]),default:t(()=>[o[19]||(o[19]=l("代码生成",-1))]),_:1})]),_:1}),e(p,{key:"g-data"},{title:t(()=>[...o[20]||(o[20]=[i("span",{class:"group-label"},"数 据",-1)])]),default:t(()=>[e(s,{key:"notes"},{icon:t(()=>[e(n(q))]),default:t(()=>[o[21]||(o[21]=l("笔记管理",-1))]),_:1}),e(s,{key:"search"},{icon:t(()=>[e(n($))]),default:t(()=>[o[22]||(o[22]=l("RAG 搜索",-1))]),_:1}),e(s,{key:"memory"},{icon:t(()=>[e(n(Q))]),default:t(()=>[o[23]||(o[23]=l("记忆文件",-1))]),_:1}),e(s,{key:"knowledge"},{icon:t(()=>[e(n(X))]),default:t(()=>[o[24]||(o[24]=l("知识图谱",-1))]),_:1}),e(s,{key:"marketplace"},{icon:t(()=>[e(n(Z))]),default:t(()=>[o[25]||(o[25]=l("技能市场",-1))]),_:1}),e(s,{key:"cron"},{icon:t(()=>[e(n(h))]),default:t(()=>[o[26]||(o[26]=l("定时任务",-1))]),_:1}),e(s,{key:"workflow"},{icon:t(()=>[e(n(ee))]),default:t(()=>[o[27]||(o[27]=l("工作流编辑",-1))]),_:1}),e(s,{key:"pipeline"},{icon:t(()=>[e(n(te))]),default:t(()=>[o[28]||(o[28]=l("开发流水线",-1))]),_:1}),e(s,{key:"tasks"},{icon:t(()=>[e(n(oe))]),default:t(()=>[o[29]||(o[29]=l("后台任务",-1))]),_:1})]),_:1}),e(p,{key:"g-advanced"},{title:t(()=>[...o[30]||(o[30]=[i("span",{class:"group-label"},"高 级",-1)])]),default:t(()=>[e(s,{key:"security"},{icon:t(()=>[e(n(ne))]),default:t(()=>[o[31]||(o[31]=l("安全中心",-1))]),_:1}),e(s,{key:"trust"},{icon:t(()=>[e(n(L))]),default:t(()=>[o[32]||(o[32]=l("信任与安全",-1))]),_:1}),e(s,{key:"audit"},{icon:t(()=>[e(n(se))]),default:t(()=>[o[33]||(o[33]=l("审计日志",-1))]),_:1}),e(s,{key:"did"},{icon:t(()=>[e(n(le))]),default:t(()=>[o[34]||(o[34]=l("DID 身份",-1))]),_:1}),e(s,{key:"permissions"},{icon:t(()=>[e(n(ie))]),default:t(()=>[o[35]||(o[35]=l("权限管理",-1))]),_:1}),e(s,{key:"p2p"},{icon:t(()=>[e(n(ae))]),default:t(()=>[o[36]||(o[36]=l("P2P 网络",-1))]),_:1}),e(s,{key:"backup"},{icon:t(()=>[e(n(de))]),default:t(()=>[o[37]||(o[37]=l("备份同步",-1))]),_:1}),e(s,{key:"git"},{icon:t(()=>[e(n(K))]),default:t(()=>[o[38]||(o[38]=l("Git 与数据",-1))]),_:1}),e(s,{key:"projects"},{icon:t(()=>[e(n(ue))]),default:t(()=>[o[39]||(o[39]=l("项目管理",-1))]),_:1}),e(s,{key:"crosschain"},{icon:t(()=>[e(n(re))]),default:t(()=>[o[40]||(o[40]=l("跨链桥",-1))]),_:1}),e(s,{key:"compliance"},{icon:t(()=>[e(n(L))]),default:t(()=>[o[41]||(o[41]=l("合规与情报",-1))]),_:1}),e(s,{key:"privacy"},{icon:t(()=>[e(n(ye))]),default:t(()=>[o[42]||(o[42]=l("隐私计算",-1))]),_:1}),e(s,{key:"inference"},{icon:t(()=>[e(n(pe))]),default:t(()=>[o[43]||(o[43]=l("推理网络",-1))]),_:1}),e(s,{key:"federation"},{icon:t(()=>[e(n(ke))]),default:t(()=>[o[44]||(o[44]=l("联邦强化",-1))]),_:1})]),_:1}),e(p,{key:"g-enterprise"},{title:t(()=>[...o[45]||(o[45]=[i("span",{class:"group-label"},"企 业",-1)])]),default:t(()=>[e(s,{key:"wallet"},{icon:t(()=>[e(n(ce))]),default:t(()=>[o[46]||(o[46]=l("钱包管理",-1))]),_:1}),e(s,{key:"organization"},{icon:t(()=>[e(n(me))]),default:t(()=>[o[47]||(o[47]=l("组织管理",-1))]),_:1}),e(s,{key:"tenant"},{icon:t(()=>[e(n(fe))]),default:t(()=>[o[48]||(o[48]=l("多租户 SaaS",-1))]),_:1}),e(s,{key:"sla"},{icon:t(()=>[e(n(j))]),default:t(()=>[o[49]||(o[49]=l("SLA 管理",-1))]),_:1}),e(s,{key:"analytics"},{icon:t(()=>[e(n(_e))]),default:t(()=>[o[50]||(o[50]=l("使用分析",-1))]),_:1}),e(s,{key:"templates"},{icon:t(()=>[e(n(ge))]),default:t(()=>[o[51]||(o[51]=l("模板中心",-1))]),_:1})]),_:1}),e(p,{key:"g-social"},{title:t(()=>[...o[52]||(o[52]=[i("span",{class:"group-label"},"社 交",-1)])]),default:t(()=>[e(s,{key:"community"},{icon:t(()=>[e(n(ve))]),default:t(()=>[o[53]||(o[53]=l("社区",-1))]),_:1}),e(s,{key:"governance"},{icon:t(()=>[e(n(Oe))]),default:t(()=>[o[54]||(o[54]=l("社区治理",-1))]),_:1}),e(s,{key:"reputation"},{icon:t(()=>[e(n(be))]),default:t(()=>[o[55]||(o[55]=l("声誉优化",-1))]),_:1}),e(s,{key:"recommend"},{icon:t(()=>[e(n(we))]),default:t(()=>[o[56]||(o[56]=l("智能推荐",-1))]),_:1})]),_:1}),e(p,{key:"g-media"},{title:t(()=>[...o[57]||(o[57]=[i("span",{class:"group-label"},"媒 体",-1)])]),default:t(()=>[e(s,{key:"video"},{icon:t(()=>[e(n(et))]),default:t(()=>[o[58]||(o[58]=l("视频剪辑",-1))]),_:1})]),_:1}),e(p,{key:"g-extension"},{title:t(()=>[...o[59]||(o[59]=[i("span",{class:"group-label"},"扩 展",-1)])]),default:t(()=>[e(s,{key:"rssfeed"},{icon:t(()=>[e(n(Ce))]),default:t(()=>[o[60]||(o[60]=l("RSS 订阅",-1))]),_:1}),e(s,{key:"webauthn"},{icon:t(()=>[e(n(Se))]),default:t(()=>[o[61]||(o[61]=l("身份认证",-1))]),_:1})]),_:1})],64))]),_:1},8,["selectedKeys","openKeys","theme","inline-collapsed"]),i("div",{class:S(["sidebar-footer",{collapsed:r.value}])},[e(Ee,{status:Re.value},null,8,["status"]),r.value?B("",!0):(a(),y("span",ut,v(Ie.value),1))],2)]),_:1},8,["collapsed"]),e(P,{class:"main-area"},{default:t(()=>[e(Me,{class:"app-header"},{default:t(()=>[i("div",rt,[i("div",{class:S(["scope-tag",c.value?"project":"global"])},[(a(),g(qe(c.value?n(O):n(N)))),i("span",null,v(c.value?n(f).projectName||"项目":"全局模式"),1),c.value&&n(f).projectRoot?(a(),g(U,{key:0,title:n(f).projectRoot},{default:t(()=>[e(n(tt),{class:"info-icon"})]),_:1},8,["title"])):B("",!0)],2)]),i("div",yt,[i("div",pt,[(a(!0),y(A,null,$e(n(Ze),(k,C)=>(a(),g(U,{key:C,title:k.label},{default:t(()=>[i("button",{class:S(["theme-btn",{active:xe.value===C}]),"data-theme-key":C,onClick:_t=>Ue(C)},v(k.icon),11,kt)]),_:2},1032,["title"]))),128))]),i("span",ct,v(n(Le)),1),e(Ge,{color:w.value==="connected"?"green":w.value==="connecting"?"orange":"red",class:"ws-tag"},{default:t(()=>[l(v(w.value==="connected"?"已连接":w.value==="connecting"?"连接中":"断开"),1)]),_:1},8,["color"])])]),_:1}),e(We,{class:"page-content"},{default:t(()=>[e(Ve)]),_:1})]),_:1})]),_:1})}}},Ct=he(mt,[["__scopeId","data-v-e0966d68"]]);export{Ct as default};
@@ -1 +0,0 @@
1
- .app-root[data-v-e0966d68]{height:100vh;background:var(--bg-base);overflow:hidden}.sidebar[data-v-e0966d68]{background:var(--bg-sidebar)!important;border-right:1px solid var(--border-color);transition:background .25s;height:100vh}[data-v-e0966d68] .ant-layout-sider-children{display:flex;flex-direction:column;overflow:hidden;height:100%}.main-area[data-v-e0966d68]{background:var(--bg-base);height:100vh;display:flex;flex-direction:column}.logo[data-v-e0966d68]{height:52px;display:flex;align-items:center;padding:0 18px;gap:10px;border-bottom:1px solid var(--border-color);overflow:hidden;white-space:nowrap;flex-shrink:0}.logo.collapsed[data-v-e0966d68]{padding:0;justify-content:center}.logo-icon[data-v-e0966d68]{width:24px;height:24px;flex-shrink:0;object-fit:contain}.logo-text[data-v-e0966d68]{color:var(--logo-text);font-weight:700;font-size:14px;letter-spacing:.01em}.mode-banner[data-v-e0966d68]{display:flex;align-items:center;gap:8px;padding:7px 10px;margin:8px 8px 4px;border-radius:7px;overflow:hidden}.mode-banner.project[data-v-e0966d68]{background:#1677ff1a;border:1px solid rgba(22,119,255,.2)}.mode-banner.global[data-v-e0966d68]{background:#722ed11a;border:1px solid rgba(114,46,209,.2)}.banner-icon[data-v-e0966d68]{font-size:13px;flex-shrink:0;color:#1677ff}.mode-banner.global .banner-icon[data-v-e0966d68]{color:#722ed1}.banner-info[data-v-e0966d68]{flex:1;min-width:0}.banner-name[data-v-e0966d68]{font-size:12px;font-weight:600;color:var(--text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.banner-sub[data-v-e0966d68]{font-size:10px;color:#1677ff;margin-top:1px}.mode-banner.global .banner-name[data-v-e0966d68]{color:#c084fc}.mode-icon-sm[data-v-e0966d68]{display:flex;justify-content:center;padding:8px 0;font-size:14px}.side-menu[data-v-e0966d68]{border:none!important;margin-top:2px;-webkit-user-select:none;user-select:none;background:transparent!important;flex:1;overflow-y:auto;overflow-x:hidden}.group-label[data-v-e0966d68]{color:var(--group-title);font-size:10px;font-weight:700;letter-spacing:.12em;padding-left:6px}[data-v-e0966d68] .ant-menu-item-group-title{padding:8px 16px 2px!important}[data-v-e0966d68] .ant-menu-item{height:38px!important;line-height:38px!important;margin:1px 4px!important;border-radius:6px!important}.divider-sm[data-v-e0966d68]{margin:4px 0!important}.sidebar-footer[data-v-e0966d68]{flex-shrink:0;padding:8px 18px;display:flex;align-items:center;gap:8px;border-top:1px solid var(--border-color)}.sidebar-footer.collapsed[data-v-e0966d68]{justify-content:center;padding:8px 0}.footer-text[data-v-e0966d68]{color:var(--text-secondary);font-size:11px}.app-header[data-v-e0966d68]{background:var(--bg-header)!important;padding:0 20px!important;border-bottom:1px solid var(--border-color);height:50px!important;line-height:50px!important;display:flex!important;align-items:center!important;justify-content:space-between!important;box-shadow:0 1px 4px #0000000f}.header-left[data-v-e0966d68],.header-right[data-v-e0966d68]{display:flex;align-items:center;gap:10px}.scope-tag[data-v-e0966d68]{display:flex;align-items:center;gap:5px;padding:3px 10px;border-radius:5px;font-size:12px;font-weight:500}.scope-tag.project[data-v-e0966d68]{background:#1677ff1a;color:#1677ff;border:1px solid rgba(22,119,255,.2)}.scope-tag.global[data-v-e0966d68]{background:#722ed11a;color:#722ed1;border:1px solid rgba(114,46,209,.2)}.info-icon[data-v-e0966d68]{opacity:.45;cursor:help;margin-left:2px}.theme-switcher[data-v-e0966d68]{display:flex;align-items:center;gap:4px;background:var(--bg-card);border:1px solid var(--border-color);border-radius:20px;padding:3px 6px}.theme-btn[data-v-e0966d68]{width:26px;height:26px;border:none;border-radius:50%;cursor:pointer;background:transparent;font-size:14px;line-height:1;display:flex;align-items:center;justify-content:center;transition:background .15s,transform .15s;opacity:.55}.theme-btn[data-v-e0966d68]:hover{opacity:.9;transform:scale(1.15);background:var(--bg-card-hover)}.theme-btn.active[data-v-e0966d68]{opacity:1;transform:scale(1.1);background:var(--bg-card-hover);outline:2px solid var(--text-secondary)}.version-tag[data-v-e0966d68]{color:var(--text-muted);font-size:11px}.ws-tag[data-v-e0966d68]{margin:0!important;font-size:11px}.page-content[data-v-e0966d68]{padding:24px;overflow:auto;background:var(--bg-base);flex:1;min-height:0}
@@ -1 +0,0 @@
1
- import{u as ze}from"./ws-Bv7YH0VB.js";import{s as ie}from"./community-parser-CO25nZFt.js";import{_ as Ae}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{a as E}from"./index-BfKFNptm.js";import{Y as Ce,aC as Re,p as se,aw as Oe,aD as De,A as we,aa as Ne}from"./icons-ukMaZ3tx.js";import{l as Ee,F as f,D as _,c as t,x as e,m as h,G as b,q as v,r as L,v as r,J as y,u as g,H as C,L as j,N as je,I as c,j as Y}from"./vendor-BVetwVfk.js";import"./index-DfcXDy2A.js";import"./useConfigInject-DCcT0grw.js";import"./transition-DSe9CgZe.js";import"./Keyframes-C7fCrnlS.js";import"./Portal-CHsntPCQ.js";import"./index-U4Zd5IK6.js";function ue(s){const n=ie(s);if(!n)return null;try{return JSON.parse(n)}catch{}const i=n.match(/\{[\s\S]*\}|\[[\s\S]*\]/);if(!i)return null;try{return JSON.parse(i[0])}catch{return null}}const B=Object.freeze(["auth","permission","data","system","file","did","crypto","api"]),H=Object.freeze(["low","medium","high","critical"]);function G(s,n=0){return typeof s=="number"&&Number.isFinite(s)?s:n}function re(s){if(!s)return{noDb:!1,error:""};const n=ie(s),i=/Database not available/i.test(n);return{noDb:i,error:i?"Database not available":""}}function Ie(s,n=0){if(!s||typeof s!="object")return null;const i=s.id||"";if(!i)return null;let p=s.details;if(typeof p=="string"&&p)try{p=JSON.parse(p)}catch{}const u=typeof s.success=="boolean"?s.success:s.success===1||s.success==="1"||s.success===!0;return{key:i,id:i,eventType:String(s.event_type??s.eventType??"").toLowerCase(),operation:String(s.operation||""),actor:s.actor??"",target:s.target??"",details:p??null,riskLevel:String(s.risk_level??s.riskLevel??"low").toLowerCase(),ipAddress:s.ip_address??s.ipAddress??"",userAgent:s.user_agent??s.userAgent??"",success:u,errorMessage:s.error_message??s.errorMessage??"",createdAt:s.created_at??s.createdAt??"",_idx:n}}function Ue(s){const n=ue(s);return Array.isArray(n)?n.map(Ie).filter(Boolean):[]}const Fe={total:0,failures:0,highRisk:0,byEventType:{},byRiskLevel:{}};function Je(s){const n=JSON.parse(JSON.stringify(Fe));for(const p of B)n.byEventType[p]=0;for(const p of H)n.byRiskLevel[p]=0;const i=ue(s);if(!i||typeof i!="object"||Array.isArray(i))return n;if(n.total=G(i.total,0),n.failures=G(i.failures,0),n.highRisk=G(i.highRisk,0),i.byEventType&&typeof i.byEventType=="object")for(const[p,u]of Object.entries(i.byEventType))typeof u=="number"&&Number.isFinite(u)&&(n.byEventType[p]=u);if(i.byRiskLevel&&typeof i.byRiskLevel=="object")for(const[p,u]of Object.entries(i.byRiskLevel))typeof u=="number"&&Number.isFinite(u)&&(n.byRiskLevel[p]=u);return n}function ne(s){if(s==null||s==="")return"—";const n=String(s),i=n.includes(" ")&&!n.includes("T")?n.replace(" ","T")+"Z":n,p=new Date(i);return isNaN(p.getTime())?n:p.toLocaleString("zh-CN",{hour12:!1})}const Me={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},Be={class:"type-name"},Ve={class:"type-count"},$e={class:"filter-bar"},Ke={key:0,style:{color:"var(--text-secondary)","font-size":"11px","font-family":"monospace"}},Pe={style:{color:"var(--text-primary)","font-weight":"500","font-family":"monospace","font-size":"12px"}},We={key:0,style:{color:"#ff4d4f","font-size":"11px","margin-top":"2px"}},qe={key:0,style:{color:"var(--text-secondary)","font-size":"12px"}},Ye={key:1,style:{color:"var(--text-muted)"}},Ge={key:0,style:{color:"var(--text-secondary)","font-size":"12px","font-family":"monospace"}},He={key:1,style:{color:"var(--text-muted)"}},Ze={style:{padding:"40px",color:"var(--text-muted)","text-align":"center"}},Qe={key:0,style:{"padding-top":"8px"}},Xe={style:{"font-family":"monospace","font-size":"12px"}},et={style:{"margin-left":"8px",color:"var(--text-secondary)","font-size":"12px"}},tt={style:{"font-family":"monospace"}},ot={key:0,style:{"font-family":"monospace","font-size":"12px"}},at={key:1,style:{color:"var(--text-muted)"}},lt={key:0,style:{"font-family":"monospace","font-size":"12px"}},st={key:1,style:{color:"var(--text-muted)"}},rt={style:{"font-family":"monospace","font-size":"12px"}},nt={style:{"font-family":"monospace","font-size":"11px"}},it={style:{color:"#ff4d4f"}},ut={class:"details-pre"},ct={__name:"Audit",setup(s){const n=ze(),i=L(!1),p=L([]),u=L({total:0,failures:0,highRisk:0,byEventType:{},byRiskLevel:{}}),V=L({noDb:!1,error:""}),Z=L("events"),I=L(""),O=L(""),D=L(""),w=L(""),U=L(!1),$=L(!1),d=L(null),ce=[{title:"时间",key:"createdAt",width:"160px"},{title:"类型",key:"eventType",width:"110px"},{title:"操作",key:"operation"},{title:"角色",key:"actor",width:"140px"},{title:"目标",key:"target",width:"180px"},{title:"风险",key:"riskLevel",width:"90px"},{title:"状态",key:"success",width:"80px"},{title:"操作",key:"action",width:"80px"}],K=Y(()=>u.value.total?(u.value.total-u.value.failures)/u.value.total*100:100),de=Y(()=>!!(O.value||D.value||w.value||U.value)),fe=Y(()=>{let o=p.value;if(D.value&&(o=o.filter(l=>l.eventType===D.value)),w.value&&(o=o.filter(l=>l.riskLevel===w.value)),U.value&&(o=o.filter(l=>!l.success)),O.value){const l=O.value.toLowerCase();o=o.filter(k=>(k.operation||"").toLowerCase().includes(l)||(k.actor||"").toLowerCase().includes(l)||(k.target||"").toLowerCase().includes(l))}return o});function P(o){return{auth:"认证",permission:"权限",data:"数据",system:"系统",file:"文件",did:"DID",crypto:"加密",api:"API"}[o]||o}function F(o){return{auth:"blue",permission:"purple",data:"cyan",system:"default",file:"green",did:"gold",crypto:"magenta",api:"volcano"}[o]||"default"}function Q(o){return{auth:"#1677ff",permission:"#722ed1",data:"#13c2c2",system:"#888",file:"#52c41a",did:"#faad14",crypto:"#eb2f96",api:"#fa541c"}[o]||"#888"}function J(o){return{low:"低",medium:"中",high:"高",critical:"关键"}[o]||o}function W(o){return{low:"default",medium:"gold",high:"orange",critical:"red"}[o]||"default"}function pe(o){return{low:"#888",medium:"#faad14",high:"#fa8c16",critical:"#ff4d4f"}[o]||"#888"}function X(o,l){return l?Math.round(o/l*100):0}function ve(o,l){return o?o.length<=l?o:o.slice(0,l)+"…":""}function ye(o){if(typeof o=="string")return o;try{return JSON.stringify(o,null,2)}catch{return String(o)}}let ee=null;function _e(){clearTimeout(ee),ee=setTimeout(()=>{O.value=I.value.trim()},300)}function me(){O.value=I.value.trim()}async function te(){i.value=!0,V.value={noDb:!1,error:""};try{const[o,l]=await Promise.all([n.execute("audit log --json -n 200",12e3).catch(()=>({output:""})),n.execute("audit stats --json",8e3).catch(()=>({output:""}))]),k=[o,l].map(T=>re(T.output)).find(T=>T.noDb);k&&(V.value=k),p.value=Ue(o.output),u.value=Je(l.output)}catch(o){E.error("加载审计日志失败: "+(o?.message||o))}finally{i.value=!1}}function be(o){d.value=o,$.value=!0}async function ge(){try{const{output:o}=await n.execute("audit export -f json -n 10000",2e4);if(re(o).noDb){E.error("需要先 cc init 初始化项目");return}if(!o.trim().startsWith("[")){E.error("导出失败: "+o.slice(0,120));return}const k=new Blob([o.trim()],{type:"application/json"}),T=URL.createObjectURL(k),R=document.createElement("a");R.href=T,R.download=`audit-${new Date().toISOString().slice(0,10)}.json`,document.body.appendChild(R),R.click(),document.body.removeChild(R),URL.revokeObjectURL(T),E.success("已导出到下载文件夹")}catch(o){E.error("导出失败: "+(o?.message||o))}}return Ee(te),(o,l)=>{const k=v("a-button"),T=v("a-space"),R=v("a-alert"),N=v("a-statistic"),z=v("a-card"),A=v("a-col"),q=v("a-row"),S=v("a-tag"),ke=v("a-input-search"),M=v("a-radio-button"),oe=v("a-radio-group"),xe=v("a-checkbox"),he=v("a-table"),ae=v("a-tab-pane"),le=v("a-progress"),Le=v("a-tabs"),x=v("a-descriptions-item"),Se=v("a-descriptions"),Te=v("a-modal");return r(),f("div",null,[_("div",Me,[l[8]||(l[8]=_("div",null,[_("h2",{class:"page-title"},"审计日志"),_("p",{class:"page-sub"},"安全事件追踪 · 风险评估 · 合规导出")],-1)),t(T,null,{default:e(()=>[t(k,{loading:i.value,onClick:te},{icon:e(()=>[t(g(Ce))]),default:e(()=>[l[6]||(l[6]=y(" 刷新 ",-1))]),_:1},8,["loading"]),t(k,{onClick:ge},{icon:e(()=>[t(g(Re))]),default:e(()=>[l[7]||(l[7]=y(" 导出 JSON ",-1))]),_:1})]),_:1})]),V.value.noDb?(r(),h(R,{key:0,type:"info","show-icon":"",message:"该模块需要项目级数据库",description:"`cc audit ...` 命令仅在 chainlesschain 项目目录下可用。请先运行 `cc init` 初始化项目,或在已初始化的目录启动 `cc serve`。",style:{"margin-bottom":"16px"}})):b("",!0),t(q,{gutter:[16,16],style:{"margin-bottom":"20px"}},{default:e(()=>[t(A,{xs:12,sm:8,lg:5},{default:e(()=>[t(z,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:e(()=>[t(N,{title:"事件总数",value:u.value.total,"value-style":{color:"#1677ff",fontSize:"20px"}},{prefix:e(()=>[t(g(se))]),_:1},8,["value"])]),_:1})]),_:1}),t(A,{xs:12,sm:8,lg:5},{default:e(()=>[t(z,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:e(()=>[t(N,{title:"失败次数",value:u.value.failures,"value-style":{color:u.value.failures>0?"#ff4d4f":"#52c41a",fontSize:"20px"}},{prefix:e(()=>[t(g(Oe))]),_:1},8,["value","value-style"])]),_:1})]),_:1}),t(A,{xs:12,sm:8,lg:5},{default:e(()=>[t(z,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:e(()=>[t(N,{title:"高风险",value:u.value.highRisk,"value-style":{color:u.value.highRisk>0?"#fa8c16":"#52c41a",fontSize:"20px"}},{prefix:e(()=>[t(g(De))]),_:1},8,["value","value-style"])]),_:1})]),_:1}),t(A,{xs:12,sm:8,lg:5},{default:e(()=>[t(z,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:e(()=>[t(N,{title:"关键事件",value:u.value.byRiskLevel.critical||0,"value-style":{color:(u.value.byRiskLevel.critical||0)>0?"#ff4d4f":"#888",fontSize:"20px"}},{prefix:e(()=>[t(g(we))]),_:1},8,["value","value-style"])]),_:1})]),_:1}),t(A,{xs:24,sm:8,lg:4},{default:e(()=>[t(z,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:e(()=>[t(N,{title:"成功率",value:K.value,suffix:"%",precision:1,"value-style":{color:K.value>=95?"#52c41a":K.value>=80?"#faad14":"#ff4d4f",fontSize:"20px"}},{prefix:e(()=>[t(g(Ne))]),_:1},8,["value","value-style"])]),_:1})]),_:1})]),_:1}),t(z,{title:"事件类型",size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"20px"},"body-style":{padding:"12px 16px"}},{default:e(()=>[t(q,{gutter:[12,12]},{default:e(()=>[(r(!0),f(C,null,j(g(B),a=>(r(),h(A,{key:a,xs:12,sm:8,lg:3},{default:e(()=>[_("div",{class:"type-pill",style:je({borderLeftColor:Q(a)})},[t(S,{color:F(a),style:{"font-family":"monospace","font-size":"11px"}},{default:e(()=>[y(c(a),1)]),_:2},1032,["color"]),_("div",Be,c(P(a)),1),_("div",Ve,c(u.value.byEventType[a]||0),1)],4)]),_:2},1024))),128))]),_:1})]),_:1}),t(Le,{activeKey:Z.value,"onUpdate:activeKey":l[4]||(l[4]=a=>Z.value=a),class:"audit-tabs"},{default:e(()=>[t(ae,{key:"events",tab:"事件流"},{default:e(()=>[_("div",$e,[t(ke,{value:I.value,"onUpdate:value":l[0]||(l[0]=a=>I.value=a),placeholder:"搜索操作 / 角色 / 目标...","allow-clear":"",style:{"max-width":"280px"},onSearch:me,onInput:_e},null,8,["value"]),t(oe,{value:D.value,"onUpdate:value":l[1]||(l[1]=a=>D.value=a),size:"small","button-style":"solid"},{default:e(()=>[t(M,{value:""},{default:e(()=>[...l[9]||(l[9]=[y("全部类型",-1)])]),_:1}),(r(!0),f(C,null,j(g(B),a=>(r(),h(M,{key:a,value:a},{default:e(()=>[y(c(P(a)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"]),t(oe,{value:w.value,"onUpdate:value":l[2]||(l[2]=a=>w.value=a),size:"small"},{default:e(()=>[t(M,{value:""},{default:e(()=>[...l[10]||(l[10]=[y("全部风险",-1)])]),_:1}),(r(!0),f(C,null,j(g(H),a=>(r(),h(M,{key:a,value:a},{default:e(()=>[y(c(J(a)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"]),t(xe,{checked:U.value,"onUpdate:checked":l[3]||(l[3]=a=>U.value=a)},{default:e(()=>[...l[11]||(l[11]=[y("仅失败",-1)])]),_:1},8,["checked"])]),t(he,{columns:ce,"data-source":fe.value,pagination:{pageSize:20,showTotal:a=>`共 ${a} 条`},size:"small",loading:i.value,style:{background:"var(--bg-card)"}},{bodyCell:e(({column:a,record:m})=>[a.key==="createdAt"?(r(),f("span",Ke,c(g(ne)(m.createdAt)),1)):b("",!0),a.key==="eventType"?(r(),h(S,{key:1,color:F(m.eventType),style:{"font-family":"monospace"}},{default:e(()=>[y(c(m.eventType),1)]),_:2},1032,["color"])):b("",!0),a.key==="operation"?(r(),f(C,{key:2},[_("span",Pe,c(m.operation),1),m.errorMessage?(r(),f("div",We,c(m.errorMessage),1)):b("",!0)],64)):b("",!0),a.key==="actor"?(r(),f(C,{key:3},[m.actor?(r(),f("span",qe,c(m.actor),1)):(r(),f("span",Ye,"—"))],64)):b("",!0),a.key==="target"?(r(),f(C,{key:4},[m.target?(r(),f("span",Ge,c(ve(m.target,32)),1)):(r(),f("span",He,"—"))],64)):b("",!0),a.key==="riskLevel"?(r(),h(S,{key:5,color:W(m.riskLevel)},{default:e(()=>[y(c(J(m.riskLevel)),1)]),_:2},1032,["color"])):b("",!0),a.key==="success"?(r(),h(S,{key:6,color:m.success?"green":"red"},{default:e(()=>[y(c(m.success?"OK":"FAIL"),1)]),_:2},1032,["color"])):b("",!0),a.key==="action"?(r(),h(k,{key:7,size:"small",type:"link",onClick:dt=>be(m)},{default:e(()=>[...l[12]||(l[12]=[y("详情",-1)])]),_:1},8,["onClick"])):b("",!0)]),emptyText:e(()=>[_("div",Ze,[t(g(se),{style:{"font-size":"36px","margin-bottom":"10px",display:"block"}}),y(" "+c(de.value?"没有符合条件的事件":"暂无审计事件"),1)])]),_:1},8,["data-source","pagination","loading"])]),_:1}),t(ae,{key:"breakdown",tab:"分布统计"},{default:e(()=>[t(q,{gutter:[16,16]},{default:e(()=>[t(A,{xs:24,lg:12},{default:e(()=>[t(z,{title:"按事件类型",size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:e(()=>[(r(!0),f(C,null,j(g(B),a=>(r(),f("div",{key:a,class:"bd-row"},[t(S,{color:F(a),style:{"min-width":"80px","text-align":"center","font-family":"monospace"}},{default:e(()=>[y(c(a),1)]),_:2},1032,["color"]),t(le,{percent:X(u.value.byEventType[a]||0,u.value.total),"stroke-color":Q(a),format:()=>`${u.value.byEventType[a]||0}`,size:"small",style:{flex:"1","margin-left":"12px"}},null,8,["percent","stroke-color","format"])]))),128))]),_:1})]),_:1}),t(A,{xs:24,lg:12},{default:e(()=>[t(z,{title:"按风险等级",size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:e(()=>[(r(!0),f(C,null,j(g(H),a=>(r(),f("div",{key:a,class:"bd-row"},[t(S,{color:W(a),style:{"min-width":"80px","text-align":"center"}},{default:e(()=>[y(c(J(a)),1)]),_:2},1032,["color"]),t(le,{percent:X(u.value.byRiskLevel[a]||0,u.value.total),"stroke-color":pe(a),format:()=>`${u.value.byRiskLevel[a]||0}`,size:"small",style:{flex:"1","margin-left":"12px"}},null,8,["percent","stroke-color","format"])]))),128))]),_:1})]),_:1})]),_:1})]),_:1})]),_:1},8,["activeKey"]),t(Te,{open:$.value,"onUpdate:open":l[5]||(l[5]=a=>$.value=a),title:`事件详情:${d.value?.id?.slice(0,8)||""}`,width:720,footer:null},{default:e(()=>[d.value?(r(),f("div",Qe,[t(Se,{column:2,size:"small",bordered:""},{default:e(()=>[t(x,{label:"ID",span:2},{default:e(()=>[_("span",Xe,c(d.value.id),1)]),_:1}),t(x,{label:"事件类型"},{default:e(()=>[t(S,{color:F(d.value.eventType),style:{"font-family":"monospace"}},{default:e(()=>[y(c(d.value.eventType),1)]),_:1},8,["color"]),_("span",et,c(P(d.value.eventType)),1)]),_:1}),t(x,{label:"风险等级"},{default:e(()=>[t(S,{color:W(d.value.riskLevel)},{default:e(()=>[y(c(J(d.value.riskLevel)),1)]),_:1},8,["color"])]),_:1}),t(x,{label:"操作",span:2},{default:e(()=>[_("span",tt,c(d.value.operation),1)]),_:1}),t(x,{label:"状态"},{default:e(()=>[t(S,{color:d.value.success?"green":"red"},{default:e(()=>[y(c(d.value.success?"成功":"失败"),1)]),_:1},8,["color"])]),_:1}),t(x,{label:"时间"},{default:e(()=>[y(c(g(ne)(d.value.createdAt)),1)]),_:1}),t(x,{label:"角色"},{default:e(()=>[d.value.actor?(r(),f("span",ot,c(d.value.actor),1)):(r(),f("span",at,"—"))]),_:1}),t(x,{label:"目标"},{default:e(()=>[d.value.target?(r(),f("span",lt,c(d.value.target),1)):(r(),f("span",st,"—"))]),_:1}),d.value.ipAddress?(r(),h(x,{key:0,label:"IP"},{default:e(()=>[_("span",rt,c(d.value.ipAddress),1)]),_:1})):b("",!0),d.value.userAgent?(r(),h(x,{key:1,label:"User-Agent"},{default:e(()=>[_("span",nt,c(d.value.userAgent),1)]),_:1})):b("",!0),d.value.errorMessage?(r(),h(x,{key:2,label:"错误信息",span:2},{default:e(()=>[_("span",it,c(d.value.errorMessage),1)]),_:1})):b("",!0),d.value.details?(r(),h(x,{key:3,label:"详细信息",span:2},{default:e(()=>[_("pre",ut,c(ye(d.value.details)),1)]),_:1})):b("",!0)]),_:1})])):b("",!0)]),_:1},8,["open","title"])])}}},St=Ae(ct,[["__scopeId","data-v-345c408a"]]);export{St as default};
@@ -1 +0,0 @@
1
- .page-title[data-v-345c408a]{margin:0;color:var(--text-primary);font-size:22px;font-weight:600}.page-sub[data-v-345c408a]{margin:4px 0 0;color:var(--text-secondary);font-size:13px}.audit-tabs[data-v-345c408a] .ant-tabs-nav{margin-bottom:16px}.filter-bar[data-v-345c408a]{display:flex;align-items:center;gap:12px;margin-bottom:12px;flex-wrap:wrap}.type-pill[data-v-345c408a]{padding:8px 10px;border-radius:6px;background:#1677ff0a;border:1px solid var(--border-color);border-left:3px solid #1677ff;height:100%;text-align:center}.type-name[data-v-345c408a]{color:var(--text-primary);font-size:12px;margin-top:4px}.type-count[data-v-345c408a]{color:var(--text-primary);font-size:18px;font-weight:600;margin-top:2px}.bd-row[data-v-345c408a]{display:flex;align-items:center;margin-bottom:8px}.details-pre[data-v-345c408a]{margin:0;padding:8px 10px;background:var(--bg-base);border:1px solid var(--border-color);border-radius:4px;font-size:11px;max-height:300px;overflow:auto;color:var(--text-primary)}
@@ -1 +0,0 @@
1
- import{u as Me}from"./ws-Bv7YH0VB.js";import{_ as Ne}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{Y as Le,ac as me,q as re,ae as N,ar as U,ap as Te}from"./icons-ukMaZ3tx.js";import{l as je,F as s,D as p,c as a,x as o,r as n,q as y,v as l,J as f,u as v,m as b,G as r,I as u,H as De}from"./vendor-BVetwVfk.js";const Re={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},Ee={key:0,style:{"text-align":"center",padding:"30px"}},Ue={key:0,style:{"font-family":"monospace",color:"var(--text-muted)","font-size":"12px"}},Je={key:1},Ke={key:2,style:{color:"var(--text-secondary)","font-size":"12px"}},Ve={key:3,style:{"margin-top":"16px"}},qe={style:{background:"var(--bg-base)",border:"1px solid var(--border-color)","border-radius":"6px",padding:"12px",color:"#aaa","font-size":"12px","max-height":"200px","overflow-y":"auto","white-space":"pre-wrap"}},Ge={key:4,style:{"margin-top":"12px",color:"#ff4d4f","font-size":"12px"}},He={key:0,style:{background:"var(--bg-base)",border:"1px solid var(--border-color)","border-radius":"6px",padding:"12px","margin-top":"8px"}},We={style:{"font-family":"monospace"}},Ye={key:0},Qe={key:1,style:{"margin-top":"12px"}},Xe={style:{background:"var(--bg-base)",border:"1px solid var(--border-color)","border-radius":"6px",padding:"12px",color:"#aaa","font-size":"12px","white-space":"pre-wrap"}},Ze={key:0,style:{"text-align":"center",padding:"30px"}},et={key:0,style:{"margin-bottom":"16px"}},tt={style:{background:"var(--bg-base)",border:"1px solid var(--border-color)","border-radius":"6px",padding:"12px",color:"#aaa","font-size":"12px","max-height":"200px","overflow-y":"auto","white-space":"pre-wrap"}},at={key:0,style:{"font-family":"monospace","font-size":"12px"}},ot={key:2,style:{"margin-top":"12px",color:"#ff4d4f","font-size":"12px"}},lt={key:0,style:{"text-align":"center",padding:"30px"}},nt={key:2,style:{"margin-top":"12px",color:"#ff4d4f","font-size":"12px"}},st={key:0,style:{"text-align":"center",padding:"30px"}},rt={key:0,style:{"font-family":"monospace",color:"var(--text-muted)","font-size":"12px"}},it={key:1},ut={key:2},ct={key:3,style:{color:"var(--text-secondary)","font-size":"12px"}},dt={key:3,style:{"margin-top":"12px",color:"#ff4d4f","font-size":"12px"}},pt={key:0,style:{"margin-top":"12px"}},vt={style:{background:"var(--bg-base)",border:"1px solid var(--border-color)","border-radius":"6px",padding:"12px",color:"#aaa","font-size":"12px","white-space":"pre-wrap"}},yt={__name:"Backup",setup(ft){const g=Me(),ie=n("backup"),J=n(!1),K=n(!1),V=n(!1),B=n(""),w=n([]),_=n(""),be=[{title:"备份 ID",key:"id"},{title:"大小",key:"size",width:120},{title:"创建时间",key:"createdAt"},{title:"操作",key:"action",width:100}];async function ue(){K.value=!0,B.value="";try{const{output:t}=await g.execute("backup list --json",15e3),e=M(t);Array.isArray(e)?w.value=e:e&&Array.isArray(e.backups)?w.value=e.backups:(w.value=[],t&&t.trim()&&(_.value=t))}catch(t){B.value=`加载备份列表失败: ${t.message}`}finally{K.value=!1}}async function xe(){V.value=!0,_.value="",B.value="";try{const{output:t}=await g.execute("backup create --json",3e4);_.value=t||"备份已创建",await ue()}catch(t){_.value=`创建备份失败: ${t.message}`}finally{V.value=!1}}const q=n(!1),G=n(!1),k=n(null),z=n("");function _e(t){k.value=t,z.value="",q.value=!0}async function ke(){if(k.value){G.value=!0,z.value="";try{const{output:t}=await g.execute(`backup restore ${k.value.id}`,6e4);z.value=t||"恢复完成"}catch(t){z.value=`恢复失败: ${t.message}`}finally{G.value=!1}}}const H=n(!1),L=n(""),I=n(!1),T=n("未知"),j=n(0),W=n(""),x=n(""),Y=n(!1),Q=n(!1),S=n([]),he=[{title:"文件路径",key:"path"},{title:"冲突类型",key:"type",width:120}];async function X(){H.value=!0,L.value="";try{const{output:t}=await g.execute("sync status --json",15e3),e=M(t);e?(I.value=e.online||e.synced||e.status==="online"||!1,T.value=I.value?"已同步":"未同步",j.value=e.pending??e.pendingChanges??0,W.value=e.lastSync||e.lastSyncTime||""):we(t)}catch(t){L.value=`加载同步状态失败: ${t.message}`}finally{H.value=!1}}function we(t){if(!t){T.value="未知";return}I.value=/synced|online|up.to.date/i.test(t),T.value=I.value?"已同步":"未同步";const e=t.match(/pending[:\s]+(\d+)/i);j.value=e?parseInt(e[1]):0;const c=t.match(/last[:\s]+(.+)/i);c&&(W.value=c[1].trim())}async function ze(){Y.value=!0,x.value="";try{const{output:t}=await g.execute("sync push",3e4);x.value=t||"推送完成",await X()}catch(t){x.value=`推送失败: ${t.message}`}finally{Y.value=!1}}async function Se(){Q.value=!0,x.value="";try{const{output:t}=await g.execute("sync pull",3e4);x.value=t||"拉取完成",await X()}catch(t){x.value=`拉取失败: ${t.message}`}finally{Q.value=!1}}async function Ce(){try{const{output:t}=await g.execute("sync conflicts --json",15e3),e=M(t);Array.isArray(e)?S.value=e:e&&Array.isArray(e.conflicts)?S.value=e.conflicts:S.value=[]}catch{S.value=[]}}const Z=n(!1),D=n(""),C=n(!1),ee=n(""),te=n(!1),O=n(""),A=n([]),Ae=[{title:"CID",key:"cid"},{title:"名称",key:"name"},{title:"大小",key:"size",width:120},{title:"固定时间",key:"pinnedAt"},{title:"操作",key:"action",width:120}];async function Pe(){Z.value=!0,D.value="";try{const{output:t}=await g.execute("ipfs status --json",15e3),e=M(t);if(e)C.value=e.online||e.status==="online"||e.connected||!1,ee.value=e.peerId||e.id||"";else{C.value=t?/online|connected|running/i.test(t):!1;const c=t?t.match(/(?:peer\s*id|id)[:\s]+(\S+)/i):null;ee.value=c?c[1]:""}}catch(t){D.value=`加载 IPFS 状态失败: ${t.message}`}finally{Z.value=!1}}async function ae(){te.value=!0,O.value="";try{const{output:t}=await g.execute("ipfs pins --json",15e3),e=M(t);Array.isArray(e)?A.value=e:e&&Array.isArray(e.pins)?A.value=e.pins:A.value=[]}catch(t){O.value=`加载固定列表失败: ${t.message}`}finally{te.value=!1}}const oe=n(!1),le=n(!1),R=n(""),F=n("");async function ce(){if(R.value.trim()){le.value=!0,F.value="";try{const{output:t}=await g.execute(`ipfs pin "${R.value.trim()}"`,3e4);F.value=t||"固定成功",await ae()}catch(t){F.value=`固定失败: ${t.message}`}finally{le.value=!1}}}async function $e(t){try{await g.execute(`ipfs unpin ${t.cid}`,15e3),await ae()}catch(e){O.value=`取消固定失败: ${e.message}`}}function M(t){if(!t||!t.trim())return null;try{return JSON.parse(t.trim())}catch{const c=t.match(/\{[\s\S]*\}|\[[\s\S]*\]/);if(c)try{return JSON.parse(c[0])}catch{}return null}}function de(t){if(t==null||isNaN(t))return"-";const e=Number(t);if(e===0)return"0 B";const c=["B","KB","MB","GB","TB"],h=Math.floor(Math.log(e)/Math.log(1024));return(e/Math.pow(1024,h)).toFixed(h>0?1:0)+" "+c[h]}async function pe(){J.value=!0;try{await Promise.all([ue(),X(),Ce(),Pe(),ae()])}finally{J.value=!1}}return je(pe),(t,e)=>{const c=y("a-button"),h=y("a-space"),E=y("a-spin"),ve=y("a-empty"),ne=y("a-table"),m=y("a-card"),ye=y("a-modal"),se=y("a-tab-pane"),P=y("a-statistic"),$=y("a-col"),fe=y("a-row"),ge=y("a-tag"),Be=y("a-popconfirm"),Ie=y("a-input"),Oe=y("a-tabs");return l(),s("div",null,[p("div",Re,[e[6]||(e[6]=p("div",null,[p("h2",{class:"page-title"},"备份与同步"),p("p",{class:"page-sub"},"备份管理 / 数据同步 / IPFS")],-1)),a(c,{type:"primary",ghost:"",loading:J.value,onClick:pe},{icon:o(()=>[a(v(Le))]),default:o(()=>[e[5]||(e[5]=f(" 刷新 ",-1))]),_:1},8,["loading"])]),a(Oe,{activeKey:ie.value,"onUpdate:activeKey":e[4]||(e[4]=i=>ie.value=i),type:"card"},{default:o(()=>[a(se,{key:"backup"},{tab:o(()=>[a(v(re)),e[7]||(e[7]=f(" 备份管理",-1))]),default:o(()=>[a(m,{style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"20px"}},{title:o(()=>[a(h,null,{default:o(()=>[a(v(re)),e[8]||(e[8]=p("span",null,"备份操作",-1))]),_:1})]),extra:o(()=>[a(c,{type:"primary",loading:V.value,onClick:xe},{icon:o(()=>[a(v(me))]),default:o(()=>[e[9]||(e[9]=f(" 创建备份 ",-1))]),_:1},8,["loading"])]),default:o(()=>[K.value?(l(),s("div",Ee,[a(E)])):w.value.length===0&&!_.value?(l(),b(ve,{key:1,description:"暂无备份记录"})):r("",!0),w.value.length>0?(l(),b(ne,{key:2,columns:be,"data-source":w.value,pagination:!1,size:"small","row-key":"id"},{bodyCell:o(({column:i,record:d})=>[i.key==="id"?(l(),s("span",Ue,u(d.id.length>20?d.id.slice(0,20)+"...":d.id),1)):r("",!0),i.key==="size"?(l(),s("span",Je,u(de(d.size)),1)):r("",!0),i.key==="createdAt"?(l(),s("span",Ke,u(d.createdAt||"-"),1)):r("",!0),i.key==="action"?(l(),b(c,{key:3,size:"small",type:"link",onClick:Fe=>_e(d)},{default:o(()=>[...e[10]||(e[10]=[f(" 恢复 ",-1)])]),_:1},8,["onClick"])):r("",!0)]),_:1},8,["data-source"])):r("",!0),_.value?(l(),s("div",Ve,[e[11]||(e[11]=p("div",{style:{color:"var(--text-secondary)","font-size":"11px","margin-bottom":"6px"}},"最近操作结果",-1)),p("pre",qe,u(_.value),1)])):r("",!0),B.value?(l(),s("div",Ge,u(B.value),1)):r("",!0)]),_:1}),a(ye,{open:q.value,"onUpdate:open":e[0]||(e[0]=i=>q.value=i),title:"确认恢复备份","ok-text":"确认恢复","cancel-text":"取消","confirm-loading":G.value,onOk:ke,"ok-type":"danger"},{default:o(()=>[e[15]||(e[15]=p("p",{style:{color:"var(--text-secondary)"}}," 确定要恢复以下备份吗?此操作将覆盖当前数据。 ",-1)),k.value?(l(),s("div",He,[p("div",null,[e[12]||(e[12]=p("strong",null,"备份 ID:",-1)),e[13]||(e[13]=f()),p("span",We,u(k.value.id),1)]),k.value.createdAt?(l(),s("div",Ye,[e[14]||(e[14]=p("strong",null,"创建时间:",-1)),f(" "+u(k.value.createdAt),1)])):r("",!0)])):r("",!0),z.value?(l(),s("div",Qe,[p("pre",Xe,u(z.value),1)])):r("",!0)]),_:1},8,["open","confirm-loading"])]),_:1}),a(se,{key:"sync"},{tab:o(()=>[a(v(N)),e[16]||(e[16]=f(" 数据同步",-1))]),default:o(()=>[H.value?(l(),s("div",Ze,[a(E)])):(l(),s(De,{key:1},[a(fe,{gutter:[16,16],style:{"margin-bottom":"20px"}},{default:o(()=>[a($,{xs:24,sm:8},{default:o(()=>[a(m,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:o(()=>[a(P,{title:"同步状态",value:T.value,"value-style":{color:I.value?"#52c41a":"#888",fontSize:"16px"}},{prefix:o(()=>[a(v(N))]),_:1},8,["value","value-style"])]),_:1})]),_:1}),a($,{xs:24,sm:8},{default:o(()=>[a(m,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:o(()=>[a(P,{title:"待同步变更",value:j.value,"value-style":{color:j.value>0?"#faad14":"#52c41a",fontSize:"16px"}},{prefix:o(()=>[a(v(N))]),_:1},8,["value","value-style"])]),_:1})]),_:1}),a($,{xs:24,sm:8},{default:o(()=>[a(m,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:o(()=>[a(P,{title:"最近同步",value:W.value||"无","value-style":{color:"var(--text-secondary)",fontSize:"16px"}},{prefix:o(()=>[a(v(N))]),_:1},8,["value"])]),_:1})]),_:1})]),_:1}),a(h,{style:{"margin-bottom":"16px"}},{default:o(()=>[a(c,{loading:Y.value,onClick:ze,style:{background:"var(--bg-card-hover)","border-color":"var(--border-color)"}},{icon:o(()=>[a(v(re))]),default:o(()=>[e[17]||(e[17]=f(" 推送 ",-1))]),_:1},8,["loading"]),a(c,{loading:Q.value,onClick:Se,style:{background:"var(--bg-card-hover)","border-color":"var(--border-color)"}},{icon:o(()=>[a(v(N))]),default:o(()=>[e[18]||(e[18]=f(" 拉取 ",-1))]),_:1},8,["loading"])]),_:1}),x.value?(l(),s("div",et,[e[19]||(e[19]=p("div",{style:{color:"var(--text-secondary)","font-size":"11px","margin-bottom":"6px"}},"操作结果",-1)),p("pre",tt,u(x.value),1)])):r("",!0),S.value.length>0?(l(),b(m,{key:1,title:"冲突列表",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:o(()=>[a(ne,{columns:he,"data-source":S.value,pagination:!1,size:"small","row-key":"path"},{bodyCell:o(({column:i,record:d})=>[i.key==="path"?(l(),s("span",at,u(d.path),1)):r("",!0),i.key==="type"?(l(),b(ge,{key:1,color:"red"},{default:o(()=>[f(u(d.type||"冲突"),1)]),_:2},1024)):r("",!0)]),_:1},8,["data-source"])]),_:1})):r("",!0)],64)),L.value?(l(),s("div",ot,u(L.value),1)):r("",!0)]),_:1}),a(se,{key:"ipfs"},{tab:o(()=>[a(v(U)),e[20]||(e[20]=f(" IPFS 存储",-1))]),default:o(()=>[a(m,{title:"IPFS 状态",style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"20px"}},{extra:o(()=>[a(ge,{color:C.value?"green":"default"},{default:o(()=>[f(u(C.value?"在线":"离线"),1)]),_:1},8,["color"])]),default:o(()=>[Z.value?(l(),s("div",lt,[a(E)])):(l(),b(fe,{key:1,gutter:[16,16]},{default:o(()=>[a($,{xs:24,sm:8},{default:o(()=>[a(m,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:o(()=>[a(P,{title:"节点状态",value:C.value?"已连接":"未连接","value-style":{color:C.value?"#52c41a":"#888",fontSize:"16px"}},{prefix:o(()=>[a(v(U))]),_:1},8,["value","value-style"])]),_:1})]),_:1}),a($,{xs:24,sm:8},{default:o(()=>[a(m,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:o(()=>[a(P,{title:"已固定文件",value:A.value.length,"value-style":{fontSize:"16px"}},{prefix:o(()=>[a(v(U))]),_:1},8,["value"])]),_:1})]),_:1}),a($,{xs:24,sm:8},{default:o(()=>[a(m,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:o(()=>[a(P,{title:"Peer ID",value:ee.value||"-","value-style":{color:"var(--text-muted)",fontSize:"12px",fontFamily:"monospace"}},{prefix:o(()=>[a(v(U))]),_:1},8,["value"])]),_:1})]),_:1})]),_:1})),D.value?(l(),s("div",nt,u(D.value),1)):r("",!0)]),_:1}),a(m,{title:"固定文件列表",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{extra:o(()=>[a(c,{size:"small",onClick:e[1]||(e[1]=i=>oe.value=!0),style:{background:"var(--bg-card-hover)","border-color":"var(--border-color)"}},{icon:o(()=>[a(v(me))]),default:o(()=>[e[21]||(e[21]=f(" 固定文件 ",-1))]),_:1})]),default:o(()=>[te.value?(l(),s("div",st,[a(E)])):A.value.length===0?(l(),b(ve,{key:1,description:"暂无固定文件"})):(l(),b(ne,{key:2,columns:Ae,"data-source":A.value,pagination:{pageSize:10},size:"small","row-key":"cid"},{bodyCell:o(({column:i,record:d})=>[i.key==="cid"?(l(),s("span",rt,u(d.cid.length>24?d.cid.slice(0,24)+"...":d.cid),1)):r("",!0),i.key==="name"?(l(),s("span",it,u(d.name||"-"),1)):r("",!0),i.key==="size"?(l(),s("span",ut,u(de(d.size)),1)):r("",!0),i.key==="pinnedAt"?(l(),s("span",ct,u(d.pinnedAt||"-"),1)):r("",!0),i.key==="action"?(l(),b(Be,{key:4,title:"确定取消固定?","ok-text":"确定","cancel-text":"取消",onConfirm:Fe=>$e(d)},{default:o(()=>[a(c,{size:"small",type:"link",danger:""},{default:o(()=>[a(v(Te)),e[22]||(e[22]=f(" 取消固定 ",-1))]),_:1})]),_:1},8,["onConfirm"])):r("",!0)]),_:1},8,["data-source"])),O.value?(l(),s("div",dt,u(O.value),1)):r("",!0)]),_:1}),a(ye,{open:oe.value,"onUpdate:open":e[3]||(e[3]=i=>oe.value=i),title:"固定文件到 IPFS","confirm-loading":le.value,onOk:ce,"ok-text":"固定","cancel-text":"取消"},{default:o(()=>[e[23]||(e[23]=p("div",{style:{"margin-bottom":"12px",color:"var(--text-secondary)"}},"请输入要固定的文件路径",-1)),a(Ie,{value:R.value,"onUpdate:value":e[2]||(e[2]=i=>R.value=i),placeholder:"文件路径,例如: /path/to/file.txt",onPressEnter:ce},null,8,["value"]),F.value?(l(),s("div",pt,[p("pre",vt,u(F.value),1)])):r("",!0)]),_:1},8,["open","confirm-loading"])]),_:1})]),_:1},8,["activeKey"])])}}},_t=Ne(yt,[["__scopeId","data-v-3d5d81e6"]]);export{_t as default};
@@ -1 +0,0 @@
1
- [data-v-3d5d81e6] .ant-table{background:transparent}[data-v-3d5d81e6] .ant-tabs-card>.ant-tabs-nav .ant-tabs-tab{background:var(--bg-card);border-color:var(--border-color)}[data-v-3d5d81e6] .ant-tabs-card>.ant-tabs-nav .ant-tabs-tab-active{background:var(--bg-card-hover);border-bottom-color:var(--bg-card-hover)}[data-v-3d5d81e6] .ant-select-selector{background:var(--bg-card)!important;border-color:var(--border-color)!important}
@@ -1 +0,0 @@
1
- .servers-grid[data-v-8a49311e]{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:10px}
@@ -1,4 +0,0 @@
1
- import{u as j}from"./ws-Bv7YH0VB.js";import{_ as R}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{Y as $,d as W,$ as q,aa as D}from"./icons-ukMaZ3tx.js";import{l as E,F as u,D as m,c as o,x as a,r as b,q as d,v as l,J as k,u as v,H as F,L as A,m as C,I as p,G as z,j as G}from"./vendor-BVetwVfk.js";const H={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},J={key:0,style:{"text-align":"center",padding:"30px"}},U={key:1,style:{"text-align":"center",padding:"30px",color:"var(--text-muted)"}},Y={key:2,class:"servers-grid"},K={style:{display:"flex","align-items":"center",gap:"10px","margin-bottom":"6px"}},Q={style:{color:"#e0e0e0","font-weight":"500","font-family":"monospace"}},X={key:0,style:{color:"var(--text-secondary)","font-size":"11px","font-family":"monospace"}},Z={key:1,style:{color:"var(--text-secondary)","font-size":"11px","margin-top":"4px"}},ee={key:0,style:{"text-align":"center",padding:"30px"}},te={key:0,style:{color:"#91caff","font-family":"monospace","font-size":"12px"}},oe={__name:"McpTools",setup(ae){const w=j(),f=b(!1),g=b([]),y=b([]),x=b(""),P=G(()=>{if(!x.value)return y.value;const r=x.value.toLowerCase();return y.value.filter(t=>t.name?.toLowerCase().includes(r)||t.description?.toLowerCase().includes(r))}),T=[{title:"工具名称",key:"name",dataIndex:"name",width:"30%"},{title:"服务器",key:"server",dataIndex:"server",width:"20%"},{title:"描述",dataIndex:"description",ellipsis:!0}];async function M(){f.value=!0;try{const[r,t]=await Promise.all([w.execute("mcp servers",15e3).catch(()=>({output:""})),w.execute("mcp tools",15e3).catch(()=>({output:""}))]);g.value=I(r.output),y.value=L(t.output)}catch(r){console.error("MCP load failed:",r)}finally{f.value=!1}}function I(r){const t=[],_=r.split(`
2
- `);let s=null;for(const i of _){const e=i.trim();if(!e||e.startsWith("─")||e.startsWith("MCP"))continue;const c=e.match(/^[●•]?\s*([a-z][a-z0-9-_]+)\s*$/i)||e.match(/^([a-z][a-z0-9-_]+)\s*[::]/);c?(s&&t.push(s),s={key:c[1],name:c[1],command:"",args:[],description:""}):s&&(e.startsWith("command:")||e.startsWith("Command:")?s.command=e.replace(/^command:\s*/i,"").trim():e.startsWith("args:")||e.startsWith("Args:")?s.args=e.replace(/^args:\s*/i,"").split(",").map(h=>h.trim()):s.description||(s.description=e.slice(0,80)))}return s&&t.push(s),!t.length&&r.trim()&&!r.includes("No MCP")&&r.split(`
3
- `).filter(e=>e.trim()&&!e.includes("─")).slice(0,10).forEach((e,c)=>{t.push({key:c,name:e.trim(),command:"",args:[],description:""})}),t}function L(r){const t=[],_=r.split(`
4
- `);let s="unknown";for(const i of _){const e=i.trim();if(!e||e.startsWith("─"))continue;if(e.match(/^\[/)||e.match(/^Server:/i)){s=e.replace(/[\[\]]/g,"").replace(/^Server:\s*/i,"").trim();continue}const c=e.match(/^[●•]?\s*([a-z][a-z0-9_-]+)\s*[-–]\s*(.+)/i)||e.match(/^[●•]?\s*([a-z][a-z0-9_-]+)$/);c&&t.push({key:t.length,name:c[1],description:c[2]||"",server:s})}return t}return E(M),(r,t)=>{const _=d("a-button"),s=d("a-statistic"),i=d("a-card"),e=d("a-col"),c=d("a-row"),h=d("a-spin"),N=d("a-badge"),B=d("a-input-search"),O=d("a-tag"),V=d("a-table");return l(),u("div",null,[m("div",H,[t[2]||(t[2]=m("div",null,[m("h2",{class:"page-title"},"MCP 工具"),m("p",{class:"page-sub"},"Model Context Protocol — 已挂载工具与服务器")],-1)),o(_,{type:"primary",ghost:"",loading:f.value,onClick:M},{icon:a(()=>[o(v($))]),default:a(()=>[t[1]||(t[1]=k(" 刷新 ",-1))]),_:1},8,["loading"])]),o(c,{gutter:[16,16],style:{"margin-bottom":"20px"}},{default:a(()=>[o(e,{xs:24,sm:8},{default:a(()=>[o(i,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"},size:"small"},{default:a(()=>[o(s,{title:"服务器数量",value:g.value.length,"value-style":"color: #1677ff; font-size: 20px;"},{prefix:a(()=>[o(v(W))]),_:1},8,["value"])]),_:1})]),_:1}),o(e,{xs:24,sm:8},{default:a(()=>[o(i,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"},size:"small"},{default:a(()=>[o(s,{title:"工具数量",value:y.value.length,"value-style":"color: #52c41a; font-size: 20px;"},{prefix:a(()=>[o(v(q))]),_:1},8,["value"])]),_:1})]),_:1}),o(e,{xs:24,sm:8},{default:a(()=>[o(i,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"},size:"small"},{default:a(()=>[o(s,{title:"运行状态",value:"就绪","value-style":"color: #52c41a; font-size: 20px;"},{prefix:a(()=>[o(v(D))]),_:1})]),_:1})]),_:1})]),_:1}),o(i,{title:"已配置服务器",style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"16px"}},{default:a(()=>[f.value?(l(),u("div",J,[o(h)])):g.value.length?(l(),u("div",Y,[(l(!0),u(F,null,A(g.value,n=>(l(),C(i,{key:n.name,size:"small",style:{background:"var(--bg-card-hover)","border-color":"var(--border-color)"}},{default:a(()=>[m("div",K,[o(v(W),{style:{color:"#1677ff"}}),m("span",Q,p(n.name),1),o(N,{status:"success"})]),n.command?(l(),u("div",X,p(n.command)+" "+p(n.args?.join(" ")),1)):z("",!0),n.description?(l(),u("div",Z,p(n.description),1)):z("",!0)]),_:2},1024))),128))])):(l(),u("div",U,[...t[3]||(t[3]=[k(" 暂无 MCP 服务器,使用 ",-1),m("code",{style:{background:"var(--bg-card-hover)",padding:"2px 6px","border-radius":"3px"}},"chainlesschain mcp add",-1),k(" 添加 ",-1)])]))]),_:1}),o(i,{title:"可用工具",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{extra:a(()=>[o(B,{value:x.value,"onUpdate:value":t[0]||(t[0]=n=>x.value=n),placeholder:"搜索工具...","allow-clear":"",size:"small",style:{width:"200px"}},null,8,["value"])]),default:a(()=>[f.value?(l(),u("div",ee,[o(h)])):(l(),C(V,{key:1,columns:T,"data-source":P.value,pagination:{pageSize:15},size:"small"},{bodyCell:a(({column:n,record:S})=>[n.key==="name"?(l(),u("span",te,p(S.name),1)):z("",!0),n.key==="server"?(l(),C(O,{key:1,color:"blue",style:{"font-size":"10px"}},{default:a(()=>[k(p(S.server),1)]),_:2},1024)):z("",!0)]),emptyText:a(()=>[...t[4]||(t[4]=[m("div",{style:{padding:"30px",color:"var(--text-muted)"}},"暂无可用工具",-1)])]),_:1},8,["data-source"]))]),_:1})])}}},ie=R(oe,[["__scopeId","data-v-8a49311e"]]);export{ie as default};
@@ -1 +0,0 @@
1
- [data-v-4630ece9] .note-row:hover td{background:var(--bg-card-hover)!important;cursor:pointer}
@@ -1,2 +0,0 @@
1
- import{u as X}from"./ws-Bv7YH0VB.js";import{_ as Z}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{ac as ee,Y as te,a as ae}from"./icons-ukMaZ3tx.js";import{a as C}from"./index-BfKFNptm.js";import{l as oe,F as v,D as p,I as d,c as o,x as l,m as x,G as _,r as s,q as c,j as le,v as i,J as m,u as j,H as R,L as A}from"./vendor-BVetwVfk.js";import"./index-DfcXDy2A.js";import"./useConfigInject-DCcT0grw.js";import"./transition-DSe9CgZe.js";import"./Keyframes-C7fCrnlS.js";import"./Portal-CHsntPCQ.js";import"./index-U4Zd5IK6.js";const ne={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},se={class:"page-sub"},ie={style:{"margin-bottom":"16px",display:"flex",gap:"10px"}},re={key:0,style:{"text-align":"center",padding:"60px"}},ue={key:0,style:{color:"#e0e0e0","font-weight":"500"}},ce={key:2,style:{color:"var(--text-secondary)","font-size":"12px"}},pe={style:{padding:"40px",color:"var(--text-muted)","text-align":"center"}},de={key:0,style:{"max-height":"60vh","overflow-y":"auto"}},ve={style:{"margin-bottom":"10px"}},me={style:{"white-space":"pre-wrap",color:"#ccc","font-family":"inherit","line-height":"1.7",background:"var(--bg-base)",padding:"16px","border-radius":"6px",border:"1px solid var(--border-color)"}},fe={__name:"Notes",setup(ge){const $=X(),h=s(!1),S=s(!1),z=s(!1),U=s(""),V=s([]),w=s([]),k=s(!1),f=s(""),b=s(!1),W=s(!1),g=s(null),n=s({title:"",content:"",tags:""}),E=le(()=>k.value?w.value:V.value),G=[{title:"标题",dataIndex:"title",key:"title",width:"30%"},{title:"预览",key:"content",ellipsis:!0},{title:"标签",key:"tags",width:"20%"},{title:"操作",key:"actions",width:"80px"}];async function B(){h.value=!0,U.value="";try{const{output:a}=await $.execute("note list",2e4);V.value=q(a)}catch(a){U.value=`加载失败: ${a.message}`}finally{h.value=!1}}function q(a){const e=[],y=a.split(`
2
- `);for(const O of y){const r=O.trim();if(!r||r.startsWith("─")||r.startsWith("Note")||r.match(/^\d+ note/i))continue;const u=r.match(/^(\d+)\.\s+(.+?)(?:\s+\[([^\]]+)\])?\s*(?:-\s*(.*))?$/);u?e.push({key:u[1],id:u[1],title:u[2].trim(),tags:u[3]?u[3].split(",").map(T=>T.trim()):[],preview:(u[4]||"").trim().slice(0,100),content:""}):r.length>2&&!r.startsWith("✖")&&!r.startsWith("[")&&e.push({key:e.length,id:String(e.length),title:r,tags:[],preview:"",content:""})}return e}async function H(){if(!f.value.trim()){L();return}S.value=!0,k.value=!0;try{const{output:a}=await $.execute(`note search "${f.value}"`,15e3);w.value=q(a)}catch{w.value=[]}finally{S.value=!1}}function L(){f.value="",k.value=!1,w.value=[]}async function J(){if(!n.value.title.trim()){C.warning("请输入标题");return}z.value=!0;try{let a=`note add "${n.value.title}"`;n.value.content&&(a+=` -c "${n.value.content.replace(/"/g,'\\"')}"`),n.value.tags&&(a+=` -t "${n.value.tags}"`);const{output:e}=await $.execute(a,15e3);e.includes("✖")||e.toLowerCase().includes("error")?C.error("添加失败: "+e.slice(0,100)):(C.success("笔记已添加"),b.value=!1,n.value={title:"",content:"",tags:""},await B())}catch(a){C.error("添加失败: "+a.message)}finally{z.value=!1}}function P(a){g.value=a,W.value=!0}return oe(B),(a,e)=>{const y=c("a-button"),O=c("a-space"),r=c("a-input-search"),u=c("a-tag"),T=c("a-spin"),Q=c("a-table"),D=c("a-input"),F=c("a-form-item"),Y=c("a-textarea"),K=c("a-form"),M=c("a-modal");return i(),v("div",null,[p("div",ne,[p("div",null,[e[7]||(e[7]=p("h2",{class:"page-title"},"笔记管理",-1)),p("p",se,"个人知识库 · "+d(V.value.length)+" 条笔记",1)]),o(O,null,{default:l(()=>[o(y,{onClick:e[0]||(e[0]=t=>b.value=!0),type:"primary"},{icon:l(()=>[o(j(ee))]),default:l(()=>[e[8]||(e[8]=m(" 新建笔记 ",-1))]),_:1}),o(y,{ghost:"",loading:h.value,onClick:B},{icon:l(()=>[o(j(te))]),default:l(()=>[e[9]||(e[9]=m(" 刷新 ",-1))]),_:1},8,["loading"])]),_:1})]),p("div",ie,[o(r,{value:f.value,"onUpdate:value":e[1]||(e[1]=t=>f.value=t),placeholder:"搜索笔记...","allow-clear":"",style:{"max-width":"400px"},loading:S.value,onSearch:H,onClear:L},null,8,["value","loading"]),k.value?(i(),x(u,{key:0,color:"blue",closable:"",onClose:L},{default:l(()=>[m(" 搜索: "+d(f.value),1)]),_:1})):_("",!0)]),h.value?(i(),v("div",re,[o(T,{size:"large"})])):(i(),x(Q,{key:1,columns:G,"data-source":E.value,pagination:{pageSize:20,showTotal:t=>`共 ${t} 条`},size:"small",style:{background:"var(--bg-card)"},"row-class-name":()=>"note-row"},{bodyCell:l(({column:t,record:N})=>[t.key==="title"?(i(),v("span",ue,d(N.title),1)):_("",!0),t.key==="tags"?(i(!0),v(R,{key:1},A(N.tags,I=>(i(),x(u,{key:I,color:"blue",style:{"font-size":"10px",margin:"1px"}},{default:l(()=>[m(d(I),1)]),_:2},1024))),128)):_("",!0),t.key==="content"?(i(),v("span",ce,d(N.preview),1)):_("",!0),t.key==="actions"?(i(),x(y,{key:3,size:"small",type:"link",onClick:I=>P(N)},{default:l(()=>[...e[10]||(e[10]=[m("查看",-1)])]),_:1},8,["onClick"])):_("",!0)]),emptyText:l(()=>[p("div",pe,[o(j(ae),{style:{"font-size":"40px","margin-bottom":"12px",display:"block"}}),m(" "+d(U.value||'暂无笔记,点击"新建笔记"添加'),1)])]),_:1},8,["data-source","pagination"])),o(M,{open:b.value,"onUpdate:open":e[5]||(e[5]=t=>b.value=t),title:"新建笔记","confirm-loading":z.value,onOk:J},{default:l(()=>[o(K,{"label-col":{span:4},"wrapper-col":{span:20},style:{"margin-top":"16px"}},{default:l(()=>[o(F,{label:"标题",required:""},{default:l(()=>[o(D,{value:n.value.title,"onUpdate:value":e[2]||(e[2]=t=>n.value.title=t),placeholder:"笔记标题"},null,8,["value"])]),_:1}),o(F,{label:"内容"},{default:l(()=>[o(Y,{value:n.value.content,"onUpdate:value":e[3]||(e[3]=t=>n.value.content=t),rows:5,placeholder:"笔记内容..."},null,8,["value"])]),_:1}),o(F,{label:"标签"},{default:l(()=>[o(D,{value:n.value.tags,"onUpdate:value":e[4]||(e[4]=t=>n.value.tags=t),placeholder:"用逗号分隔,如: work,ideas"},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"]),o(M,{open:W.value,"onUpdate:open":e[6]||(e[6]=t=>W.value=t),title:g.value?.title,footer:null,width:"700px"},{default:l(()=>[g.value?(i(),v("div",de,[p("div",ve,[(i(!0),v(R,null,A(g.value.tags,t=>(i(),x(u,{key:t,color:"blue"},{default:l(()=>[m(d(t),1)]),_:2},1024))),128))]),p("pre",me,d(g.value.content||g.value.preview),1)])):_("",!0)]),_:1},8,["open","title"])])}}},ze=Z(fe,[["__scopeId","data-v-4630ece9"]]);export{ze as default};
@@ -1 +0,0 @@
1
- import{P as f}from"./index-U4Zd5IK6.js";import{p as c,i as g,j as l,d as p,Z as m,l as C,w as v,_ as x,n as P,c as h,T as R}from"./vendor-BVetwVfk.js";function S(e){let{prefixCls:s,animation:t,transitionName:o}=e;return t?{name:`${s}-${t}`}:o?{name:o}:{}}const u=Symbol("PortalContextKey"),T=function(e){let s=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{inTriggerContext:!0};c(u,{inTriggerContext:s.inTriggerContext,shouldRender:l(()=>{const{sPopupVisible:t,popupRef:o,forceRender:n,autoDestroy:r}=e||{};let i=!1;return(t||o||n)&&(i=!0),!t&&r&&(i=!1),i})})},y=()=>{T({},{inTriggerContext:!1});const e=g(u,{shouldRender:l(()=>!1),inTriggerContext:!1});return{shouldRender:l(()=>e.shouldRender.value||e.inTriggerContext===!1)}},U=p({compatConfig:{MODE:3},name:"Portal",inheritAttrs:!1,props:{getContainer:f.func.isRequired,didUpdate:Function},setup(e,s){let{slots:t}=s,o=!0,n;const{shouldRender:r}=y();function i(){r.value&&(n=e.getContainer())}m(()=>{o=!1,i()}),C(()=>{n||i()});const d=v(r,()=>{r.value&&!n&&(n=e.getContainer()),n&&d()});return x(()=>{P(()=>{var a;r.value&&((a=e.didUpdate)===null||a===void 0||a.call(e,e))})}),()=>{var a;return r.value?o?(a=t.default)===null||a===void 0?void 0:a.call(t):n?h(R,{to:n},t):null:null}}});export{U as P,S as g,T as u};