chainlesschain 0.161.11 → 0.162.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 (184) hide show
  1. package/package.json +4 -1
  2. package/src/assets/web-panel/.build-hash +1 -1
  3. package/src/assets/web-panel/assets/{AIOps-Cv7DnNSv.js → AIOps-Dn8q-Cu4.js} +1 -1
  4. package/src/assets/web-panel/assets/{ActionButton-B1m9njbz.js → ActionButton-BePEVs4O.js} +1 -1
  5. package/src/assets/web-panel/assets/{Analytics-CU5lrpIq.js → Analytics-CKp-5Gi0.js} +1 -1
  6. package/src/assets/web-panel/assets/AppLayout-BSudqld0.js +3 -0
  7. package/src/assets/web-panel/assets/{AppLayout-BpbfrB7k.css → AppLayout-DBgtkmP7.css} +1 -1
  8. package/src/assets/web-panel/assets/{Audit-DUkzhAbX.js → Audit-iefpSeRG.js} +1 -1
  9. package/src/assets/web-panel/assets/{Backup-L1i5rG4e.js → Backup-Ce43ZIhD.js} +1 -1
  10. package/src/assets/web-panel/assets/BaseInput-BvGiwRav.js +1 -0
  11. package/src/assets/web-panel/assets/{Chat-ySuja9_N.js → Chat-BAaQg-Oc.js} +1 -1
  12. package/src/assets/web-panel/assets/{Checkbox-5jHkbotn.js → Checkbox-Dvn8uxKO.js} +1 -1
  13. package/src/assets/web-panel/assets/{Codegen-CpTSti2I.js → Codegen-CTcZCayj.js} +1 -1
  14. package/src/assets/web-panel/assets/{Col-C5SJSGcO.js → Col-CBFpGgb5.js} +1 -1
  15. package/src/assets/web-panel/assets/{Community-0PMz9hPX.js → Community-DmCYaV9M.js} +1 -1
  16. package/src/assets/web-panel/assets/Compact-DnOD5uMF.js +1 -0
  17. package/src/assets/web-panel/assets/{Compliance-BEVqh-i7.js → Compliance-u53e9lg-.js} +1 -1
  18. package/src/assets/web-panel/assets/{Cowork-C_UEYiR5.js → Cowork-CL5ohuXH.js} +1 -1
  19. package/src/assets/web-panel/assets/{Cron-B4f0_E2W.js → Cron-DubcmRgt.js} +1 -1
  20. package/src/assets/web-panel/assets/{Crosschain-CZT6FKhl.js → Crosschain-BWXcUXc3.js} +1 -1
  21. package/src/assets/web-panel/assets/{DID-LDSJdg_E.js → DID-Cw0i8WjE.js} +1 -1
  22. package/src/assets/web-panel/assets/{Dashboard-CczHBzZy.js → Dashboard-BbofvIWH.js} +2 -2
  23. package/src/assets/web-panel/assets/{Dropdown-KJXQPCdN.js → Dropdown-DN6ur5xV.js} +1 -1
  24. package/src/assets/web-panel/assets/Federation-CA-rIdkY.js +1 -0
  25. package/src/assets/web-panel/assets/{FormItemContext-CenKDKRv.js → FormItemContext-D_HGU4aA.js} +1 -1
  26. package/src/assets/web-panel/assets/{Git-Ck3yvIOj.js → Git-CBWFs6Uk.js} +1 -1
  27. package/src/assets/web-panel/assets/{Governance-C-Wqvp5q.js → Governance-Cx6PTC43.js} +1 -1
  28. package/src/assets/web-panel/assets/{Inference-D1Q4GQsE.js → Inference-Ubk1VstS.js} +1 -1
  29. package/src/assets/web-panel/assets/{KnowledgeGraph-6-id5kqA.js → KnowledgeGraph-DTB10MYO.js} +1 -1
  30. package/src/assets/web-panel/assets/{Logs-BIrBldyi.js → Logs-Tfk4FBVC.js} +1 -1
  31. package/src/assets/web-panel/assets/{Marketplace-DuEYH2k1.js → Marketplace-BAsztG4O.js} +1 -1
  32. package/src/assets/web-panel/assets/{McpTools-CJyrjpOa.js → McpTools-DliPfvuK.js} +1 -1
  33. package/src/assets/web-panel/assets/{Memory-25VBuGGA.js → Memory-hkw6Xwyv.js} +1 -1
  34. package/src/assets/web-panel/assets/{MobileBridge-DDepR_yK.js → MobileBridge-eeNMFGj6.js} +1 -1
  35. package/src/assets/web-panel/assets/{Mtc-B52jkX63.js → Mtc-BP3Riowm.js} +1 -1
  36. package/src/assets/web-panel/assets/{MtcAudit-BimrvH_0.js → MtcAudit-DvD7pE7V.js} +6 -6
  37. package/src/assets/web-panel/assets/Multisig-CPtc-fVL.js +7 -0
  38. package/src/assets/web-panel/assets/Multisig-kwPDnXnl.css +1 -0
  39. package/src/assets/web-panel/assets/{NLProgramming-D9sqtzgg.js → NLProgramming-1y__Epjg.js} +1 -1
  40. package/src/assets/web-panel/assets/{Notes-BtaoLR6l.js → Notes-CEvJqMP8.js} +1 -1
  41. package/src/assets/web-panel/assets/{NotificationSettings-DGc4Pnhc.js → NotificationSettings-wmCYm99r.js} +1 -1
  42. package/src/assets/web-panel/assets/{Organization-CH8YH1WC.js → Organization-CSoz8gGr.js} +1 -1
  43. package/src/assets/web-panel/assets/{Overflow-BEfCQNlN.js → Overflow-kf1mnFrM.js} +1 -1
  44. package/src/assets/web-panel/assets/{OverrideContext-DYxbd09I.js → OverrideContext-x9ZzjLwk.js} +1 -1
  45. package/src/assets/web-panel/assets/{P2P-Bp_HTJ00.js → P2P-C4GfXJ8Z.js} +1 -1
  46. package/src/assets/web-panel/assets/{Permissions-UHQF_4gL.js → Permissions-CW1Mn95X.js} +1 -1
  47. package/src/assets/web-panel/assets/{Pipeline-yCVADMbj.js → Pipeline-CM1ppddn.js} +1 -1
  48. package/src/assets/web-panel/assets/{Privacy-C1oNG_1P.js → Privacy-DuAY5fEm.js} +1 -1
  49. package/src/assets/web-panel/assets/{ProjectInit-DMW2d6Cb.js → ProjectInit-C72779b6.js} +2 -2
  50. package/src/assets/web-panel/assets/{ProjectSettings-5G8pJeC_.js → ProjectSettings-CAilXWam.js} +1 -1
  51. package/src/assets/web-panel/assets/Projects-0OrfK90x.css +1 -0
  52. package/src/assets/web-panel/assets/Projects-DTIlVTkF.js +1 -0
  53. package/src/assets/web-panel/assets/{Providers-CL_oE5tl.js → Providers-Cf6Yv8bu.js} +1 -1
  54. package/src/assets/web-panel/assets/{QuickAsk-BV38kJpn.js → QuickAsk-CK1_VVzw.js} +1 -1
  55. package/src/assets/web-panel/assets/{Recommend-SAj9Q6gO.js → Recommend-QBC7KgvR.js} +1 -1
  56. package/src/assets/web-panel/assets/{Reputation-1kCD0gaB.js → Reputation-ju6lWzMM.js} +1 -1
  57. package/src/assets/web-panel/assets/Row-DQwipGEm.js +1 -0
  58. package/src/assets/web-panel/assets/{RssFeed-CAJCjHjh.js → RssFeed-DkLGmeLW.js} +1 -1
  59. package/src/assets/web-panel/assets/{Search-cvcqK6k5.js → Search-YYhitzkt.js} +1 -1
  60. package/src/assets/web-panel/assets/{Security-CQg7wTKN.js → Security-DEllaBqe.js} +1 -1
  61. package/src/assets/web-panel/assets/{Services-CsUFvNqx.js → Services-BgPHBq9S.js} +2 -2
  62. package/src/assets/web-panel/assets/{Skeleton-xBd6cpeg.js → Skeleton-DHEyJI7c.js} +1 -1
  63. package/src/assets/web-panel/assets/{Skills-CaroVcXP.js → Skills-c212vgf3.js} +1 -1
  64. package/src/assets/web-panel/assets/{Sla-BtpCM7Ko.js → Sla-COqhw_no.js} +1 -1
  65. package/src/assets/web-panel/assets/{SpeechSettings-BqMJfygi.js → SpeechSettings-Bmds06su.js} +1 -1
  66. package/src/assets/web-panel/assets/{SyncSettings-CZouEnTT.js → SyncSettings-Bx1_A34Y.js} +1 -1
  67. package/src/assets/web-panel/assets/{Tasks-CXRSaKbt.js → Tasks-B0Lo_9aN.js} +1 -1
  68. package/src/assets/web-panel/assets/{Templates-DJY8TQ5i.js → Templates-D0RcpfuW.js} +1 -1
  69. package/src/assets/web-panel/assets/{Tenant-BvR-WVDe.js → Tenant-G0yVctLy.js} +1 -1
  70. package/src/assets/web-panel/assets/Terminal-DqgLtK3c.js +3 -0
  71. package/src/assets/web-panel/assets/Terminal-G1DrFtKr.css +1 -0
  72. package/src/assets/web-panel/assets/{Tokens-BvsTsita.js → Tokens-Cdt0aqCc.js} +1 -1
  73. package/src/assets/web-panel/assets/{Trigger-BpAXwpX5.js → Trigger-DFbfZFuJ.js} +1 -1
  74. package/src/assets/web-panel/assets/{Trust-CQn3-pr1.js → Trust-BQXsWPz6.js} +1 -1
  75. package/src/assets/web-panel/assets/{UkeySign-mdcVVgmW.js → UkeySign-DBem5Xkj.js} +1 -1
  76. package/src/assets/web-panel/assets/{VideoEditing-B64a6mxs.js → VideoEditing-B1yipKKv.js} +1 -1
  77. package/src/assets/web-panel/assets/{Wallet-CD6sh797.js → Wallet-iPJtU5QZ.js} +4 -4
  78. package/src/assets/web-panel/assets/{WebAuthn-CBMAhuJk.js → WebAuthn-HLb9srUL.js} +1 -1
  79. package/src/assets/web-panel/assets/{WorkflowEditor-BL2e4pEf.js → WorkflowEditor-BSqXL8GD.js} +1 -1
  80. package/src/assets/web-panel/assets/addon-fit-CK6X9sAG.js +1 -0
  81. package/src/assets/web-panel/assets/{chat-D0R75-Vf.js → chat-D_J-ZVBh.js} +1 -1
  82. package/src/assets/web-panel/assets/{collapseMotion-CZQhO80h.js → collapseMotion-CjFH_Jop.js} +1 -1
  83. package/src/assets/web-panel/assets/{colors-Z5R3KUYW.js → colors-B126JcB4.js} +1 -1
  84. package/src/assets/web-panel/assets/{compact-item-Buyen0aR.js → compact-item-Bw5EEKw4.js} +1 -1
  85. package/src/assets/web-panel/assets/{createContext-D9l1X-OX.js → createContext-xLJXI46O.js} +1 -1
  86. package/src/assets/web-panel/assets/{echarts-TwhxblyG.js → echarts-Bq-n0MtJ.js} +1 -1
  87. package/src/assets/web-panel/assets/{hasIn-DV4wtumO.js → hasIn-K8QCNlyy.js} +1 -1
  88. package/src/assets/web-panel/assets/{icons-Q99MnhG8.js → icons-NT6gy8Ee.js} +2 -2
  89. package/src/assets/web-panel/assets/{index--pPzkOu2.js → index-85lab9HJ.js} +1 -1
  90. package/src/assets/web-panel/assets/{index-BSXvEQFS.js → index-B9ztiTnX.js} +1 -1
  91. package/src/assets/web-panel/assets/index-BEYypR_d.js +1 -0
  92. package/src/assets/web-panel/assets/{index-C4m8PjHn.js → index-BQ_NIMQS.js} +1 -1
  93. package/src/assets/web-panel/assets/{index-BAf0-ayI.js → index-BSgvvXgq.js} +2 -2
  94. package/src/assets/web-panel/assets/{index-RpJYGfg0.js → index-BWUG9yVI.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-Cs7GKmFk.js → index-B_PqXUkT.js} +6 -6
  96. package/src/assets/web-panel/assets/index-BaXXyyT0.js +21 -0
  97. package/src/assets/web-panel/assets/index-Bptjq-wQ.js +1 -0
  98. package/src/assets/web-panel/assets/{index-CpemtT_B.js → index-BsbKjK1o.js} +2 -2
  99. package/src/assets/web-panel/assets/{index-Cs2QeQFi.js → index-Bv9odL87.js} +2 -2
  100. package/src/assets/web-panel/assets/{index-0P8ZPtKp.js → index-C2CgD7TN.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-CprQ5h5e.js → index-COCq6xuZ.js} +1 -1
  102. package/src/assets/web-panel/assets/index-CVeuzjxG.js +55 -0
  103. package/src/assets/web-panel/assets/index-CWBajOcE.js +3 -0
  104. package/src/assets/web-panel/assets/{index-CT46jhtC.js → index-CvAey6iD.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-Z-i_sfIN.js → index-DFPVNSby.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-CoV9UGnc.js → index-DFwF_JeQ.js} +2 -2
  107. package/src/assets/web-panel/assets/{index-DO9gd9wz.js → index-DLZZi1Km.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-BRWO_MUe.js → index-DY5Oc3z6.js} +4 -4
  109. package/src/assets/web-panel/assets/index-DZWfmuM2.js +1 -0
  110. package/src/assets/web-panel/assets/{index-CRvOaSuy.js → index-DZcij18m.js} +2 -2
  111. package/src/assets/web-panel/assets/{index-BLDanIEV.js → index-Da7bZewp.js} +1 -1
  112. package/src/assets/web-panel/assets/index-DdMzLeDn.js +1 -0
  113. package/src/assets/web-panel/assets/index-Dj8BNg-z.js +1 -0
  114. package/src/assets/web-panel/assets/index-DlX09aXr.js +1 -0
  115. package/src/assets/web-panel/assets/{index-CHs1Rtgi.js → index-DrfiELFa.js} +2 -2
  116. package/src/assets/web-panel/assets/{index-DMcK4Son.js → index-Dt0Tp8TS.js} +1 -1
  117. package/src/assets/web-panel/assets/index-DvNCyE3A.js +13 -0
  118. package/src/assets/web-panel/assets/{index-vSjbNv8F.js → index-LZYGhjVr.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-AXmFZTsT.js → index-fMwtau_-.js} +2 -2
  120. package/src/assets/web-panel/assets/{index-D_g5wyjB.js → index-mqHxeING.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-DBBX0xZN.js → index-mzNWO8Yy.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-UAkLBWLE.js → index-p3d5_s7V.js} +2 -2
  123. package/src/assets/web-panel/assets/{index-BBFrPlY4.js → index-qJbfToeQ.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-DtRv6Tqv.js → index-sAfwWh0R.js} +8 -8
  125. package/src/assets/web-panel/assets/index-xJkPbv0L.js +12 -0
  126. package/src/assets/web-panel/assets/index-yhA-qP4Y.js +1 -0
  127. package/src/assets/web-panel/assets/index-zEr6BW9X.js +1 -0
  128. package/src/assets/web-panel/assets/{initDefaultProps-C5tyEoyp.js → initDefaultProps-CacwmJft.js} +1 -1
  129. package/src/assets/web-panel/assets/{motion-By5VpSMZ.js → motion-BWrP7Lz6.js} +2 -2
  130. package/src/assets/web-panel/assets/{move-CNRFLi9k.js → move-imnbiy1n.js} +1 -1
  131. package/src/assets/web-panel/assets/{omit-DYc7DRhT.js → omit-BlaOv91I.js} +1 -1
  132. package/src/assets/web-panel/assets/{pickAttrs-D667btUF.js → pickAttrs-DUGKp0ro.js} +1 -1
  133. package/src/assets/web-panel/assets/{placementArrow-Ce-Y2-Qq.js → placementArrow-P0ZA4yAK.js} +1 -1
  134. package/src/assets/web-panel/assets/responsiveObserve-CZz-M9cI.js +1 -0
  135. package/src/assets/web-panel/assets/{slide-CyKGKfJ8.js → slide-BEnICwoX.js} +1 -1
  136. package/src/assets/web-panel/assets/{statusUtils-DffXAKmJ.js → statusUtils-DdYKRSiH.js} +1 -1
  137. package/src/assets/web-panel/assets/{styleChecker-CeeSLisW.js → styleChecker-DgUxvOQt.js} +1 -1
  138. package/src/assets/web-panel/assets/useFlexGapSupport-BUEmeWdR.js +1 -0
  139. package/src/assets/web-panel/assets/{useFs--Vkrwu51.js → useFs-BXsj6Z5e.js} +1 -1
  140. package/src/assets/web-panel/assets/{useMergedState-D3PX36GT.js → useMergedState-O7QXt4P5.js} +1 -1
  141. package/src/assets/web-panel/assets/{useRefs-opfcK7Pm.js → useRefs-0J6m8UWN.js} +1 -1
  142. package/src/assets/web-panel/assets/{useState-Cp5WlLTS.js → useState-CSzR8F8O.js} +1 -1
  143. package/src/assets/web-panel/assets/{vendor-BVLz_z7V.js → vendor-M5lGV-wr.js} +1 -1
  144. package/src/assets/web-panel/assets/{vnode-ChnNrJNw.js → vnode-B3Pp583L.js} +1 -1
  145. package/src/assets/web-panel/assets/xterm-BZcWGsqw.js +9 -0
  146. package/src/assets/web-panel/assets/xterm-DFuMZ0ql.css +1 -0
  147. package/src/assets/web-panel/assets/{zoom-DE1Teifl.js → zoom-D-LYfiQh.js} +1 -1
  148. package/src/assets/web-panel/index.html +3 -3
  149. package/src/commands/crosschain.js +403 -1
  150. package/src/commands/pair.js +291 -0
  151. package/src/gateways/terminal/PtyManager.js +248 -0
  152. package/src/gateways/terminal/RingBuffer.js +61 -0
  153. package/src/gateways/terminal/terminal-handlers.js +121 -0
  154. package/src/gateways/ws/topic-handler-attachment.js +211 -0
  155. package/src/index.js +2 -0
  156. package/src/lib/cross-chain-mtc.js +275 -6
  157. package/src/lib/cross-chain.js +48 -2
  158. package/src/lib/lan-pairing-preflight.js +425 -0
  159. package/src/lib/lan-pairing-tokens.js +264 -0
  160. package/src/runtime/agent-runtime.js +33 -0
  161. package/src/assets/web-panel/assets/AppLayout-CrQBcjC1.js +0 -3
  162. package/src/assets/web-panel/assets/BaseInput-CQSPRZVh.js +0 -1
  163. package/src/assets/web-panel/assets/Compact-CwrJK_94.js +0 -1
  164. package/src/assets/web-panel/assets/Federation-Bu085RVF.js +0 -1
  165. package/src/assets/web-panel/assets/Multisig-D-IuEDLa.css +0 -1
  166. package/src/assets/web-panel/assets/Multisig-DWsGuuyz.js +0 -1
  167. package/src/assets/web-panel/assets/Projects-BpLpgCga.js +0 -1
  168. package/src/assets/web-panel/assets/Projects-C34BWmmy.css +0 -1
  169. package/src/assets/web-panel/assets/Row-CUF6ofec.js +0 -1
  170. package/src/assets/web-panel/assets/index-BBvRNeKy.js +0 -1
  171. package/src/assets/web-panel/assets/index-BJzerWCW.js +0 -1
  172. package/src/assets/web-panel/assets/index-BbZ_pXN3.js +0 -1
  173. package/src/assets/web-panel/assets/index-BloaIh8i.js +0 -1
  174. package/src/assets/web-panel/assets/index-C1u_F_WR.js +0 -12
  175. package/src/assets/web-panel/assets/index-CHPsWSeL.js +0 -1
  176. package/src/assets/web-panel/assets/index-CLk9-Adx.js +0 -13
  177. package/src/assets/web-panel/assets/index-Cyal1Os0.js +0 -1
  178. package/src/assets/web-panel/assets/index-DYq0yh8a.js +0 -1
  179. package/src/assets/web-panel/assets/index-KvlSpGws.js +0 -21
  180. package/src/assets/web-panel/assets/index-WbY1RGjg.js +0 -3
  181. package/src/assets/web-panel/assets/index-cTf60nCj.js +0 -1
  182. package/src/assets/web-panel/assets/index-ry4j00pG.js +0 -55
  183. package/src/assets/web-panel/assets/responsiveObserve-BzzJzAds.js +0 -1
  184. package/src/assets/web-panel/assets/useFlexGapSupport-CCzODKgI.js +0 -1
@@ -0,0 +1,264 @@
1
+ /**
2
+ * #21 A.1 PR2 — Pairing token issuer + persistent store.
3
+ *
4
+ * Pre-generates pairing tokens compatible with the existing Electron
5
+ * `device-pairing-handler.js` QR data format. Use case: SSH-only Linux
6
+ * dev box / CI runner where the user wants to:
7
+ *
8
+ * 1. SSH into the box and run `cc pair token generate --did did:cc:foo`
9
+ * 2. Copy/paste the 6-digit code or scan ASCII QR
10
+ * 3. Use it on mobile / Electron client to complete pairing
11
+ *
12
+ * PR2 ships only token issuance + management. The actual signaling
13
+ * server that listens for mobile→PC confirmation stays in Electron's
14
+ * path (or future PR3 for a headless signaling server).
15
+ *
16
+ * Storage: `~/.chainlesschain/pairing-tokens.json` — simple JSON list of
17
+ * `{ code, did, expiresAtMs, createdAtMs, deviceInfo, status }`.
18
+ * Status: "pending" / "consumed" / "revoked" / "expired".
19
+ *
20
+ * Compatibility: token QR shape matches what `device-pairing-handler.js`
21
+ * `handleQRCodeScan()` expects:
22
+ * { type: "device-pairing", code: "######",
23
+ * did: "did:cc:...", deviceInfo: { ... }, timestamp: <ms> }
24
+ *
25
+ * Spike doc: docs/design/A1_Linux_Native_Pairing_spike.md §2 PR2
26
+ *
27
+ * @module lib/lan-pairing-tokens
28
+ * @version 0.1.0 (#21 A.1 PR2)
29
+ */
30
+
31
+ import fs from "node:fs";
32
+ import path from "node:path";
33
+ import os from "node:os";
34
+ import crypto from "node:crypto";
35
+ import { getHomeDir } from "./paths.js";
36
+
37
+ /** Token lifetime — mirrors device-pairing-handler.js pairingTimeout (5 min). */
38
+ const DEFAULT_TTL_MS = 5 * 60 * 1000;
39
+
40
+ /** Token QR type — must match device-pairing-handler.js validation. */
41
+ const QR_TYPE = "device-pairing";
42
+
43
+ const STATUS = Object.freeze({
44
+ PENDING: "pending",
45
+ CONSUMED: "consumed",
46
+ REVOKED: "revoked",
47
+ EXPIRED: "expired",
48
+ });
49
+
50
+ /**
51
+ * Path to the token store file. Caller may override for tests.
52
+ */
53
+ export function defaultTokenStorePath() {
54
+ return path.join(getHomeDir(), "pairing-tokens.json");
55
+ }
56
+
57
+ /**
58
+ * Generate a 6-digit pairing code. Uses crypto.randomInt for unbiased
59
+ * uniform distribution (Math.random would be acceptable too but crypto
60
+ * is cheap on this size).
61
+ */
62
+ export function generatePairingCode() {
63
+ // 100000 inclusive, 1000000 exclusive → always 6 digits no leading zero loss.
64
+ return String(crypto.randomInt(100000, 1000000));
65
+ }
66
+
67
+ /**
68
+ * Build a token's QR data payload that matches the Electron handler's
69
+ * expected shape (handleQRCodeScan in device-pairing-handler.js).
70
+ *
71
+ * @param {{ did: string, deviceInfo?: object }} input
72
+ * @returns {{ code, qrData, expiresAtMs, createdAtMs, status }}
73
+ */
74
+ export function buildToken({ did, deviceInfo } = {}) {
75
+ if (typeof did !== "string" || !did) {
76
+ const e = new Error("buildToken: did required");
77
+ e.code = "INVALID_ARGS";
78
+ throw e;
79
+ }
80
+ const now = Date.now();
81
+ const code = generatePairingCode();
82
+ const qrData = {
83
+ type: QR_TYPE,
84
+ code,
85
+ did,
86
+ deviceInfo: deviceInfo || {
87
+ deviceId: `cli-${os.hostname() || "unknown"}-${now}`,
88
+ name: os.hostname() || "ChainlessChain CLI",
89
+ platform: os.platform(),
90
+ version: process.env.npm_package_version || "0.1.0",
91
+ },
92
+ timestamp: now,
93
+ };
94
+ return {
95
+ code,
96
+ qrData,
97
+ expiresAtMs: now + DEFAULT_TTL_MS,
98
+ createdAtMs: now,
99
+ status: STATUS.PENDING,
100
+ };
101
+ }
102
+
103
+ /**
104
+ * Read the token store. Returns `{ schema, tokens: [...] }`. Creates
105
+ * an empty store if file doesn't exist. Tolerates malformed JSON by
106
+ * returning an empty store + caller can choose to log.
107
+ *
108
+ * @param {string} [filePath]
109
+ * @returns {{ schema: string, tokens: Array }}
110
+ */
111
+ export function readTokens(filePath = defaultTokenStorePath()) {
112
+ if (!fs.existsSync(filePath)) {
113
+ return { schema: "cc-pairing-tokens/v1", tokens: [] };
114
+ }
115
+ try {
116
+ const raw = fs.readFileSync(filePath, "utf-8");
117
+ const parsed = JSON.parse(raw);
118
+ if (parsed && typeof parsed === "object" && Array.isArray(parsed.tokens)) {
119
+ return {
120
+ schema: parsed.schema || "cc-pairing-tokens/v1",
121
+ tokens: parsed.tokens,
122
+ };
123
+ }
124
+ return { schema: "cc-pairing-tokens/v1", tokens: [] };
125
+ } catch (_err) {
126
+ // Malformed → return empty (don't crash CLI; user can `revoke --all`).
127
+ return { schema: "cc-pairing-tokens/v1", tokens: [] };
128
+ }
129
+ }
130
+
131
+ /**
132
+ * Atomically write the token store. Creates parent dir if missing.
133
+ *
134
+ * @param {{ schema?: string, tokens: Array }} state
135
+ * @param {string} [filePath]
136
+ */
137
+ export function writeTokens(state, filePath = defaultTokenStorePath()) {
138
+ const dir = path.dirname(filePath);
139
+ if (!fs.existsSync(dir)) {
140
+ fs.mkdirSync(dir, { recursive: true });
141
+ }
142
+ const toWrite = {
143
+ schema: state.schema || "cc-pairing-tokens/v1",
144
+ tokens: state.tokens || [],
145
+ };
146
+ // Write to temp + rename for atomicity (avoid partial reads).
147
+ const tmp = filePath + ".tmp";
148
+ fs.writeFileSync(tmp, JSON.stringify(toWrite, null, 2), "utf-8");
149
+ fs.renameSync(tmp, filePath);
150
+ }
151
+
152
+ /**
153
+ * Append a new token to the store. Mark prior pending tokens for the
154
+ * same DID as REVOKED (one-active-token-per-DID invariant — prevents
155
+ * stale codes leaking into mobile scans).
156
+ *
157
+ * @param {{ did, deviceInfo? }} input
158
+ * @param {string} [filePath]
159
+ * @returns {object} the newly-stored token (with status PENDING)
160
+ */
161
+ export function addToken(input, filePath = defaultTokenStorePath()) {
162
+ const token = buildToken(input);
163
+ const state = readTokens(filePath);
164
+ // Invalidate prior pending tokens for the same DID.
165
+ state.tokens = state.tokens.map((t) => {
166
+ if (t.qrData?.did === input.did && t.status === STATUS.PENDING) {
167
+ return { ...t, status: STATUS.REVOKED, revokedAtMs: Date.now() };
168
+ }
169
+ return t;
170
+ });
171
+ state.tokens.push(token);
172
+ writeTokens(state, filePath);
173
+ return token;
174
+ }
175
+
176
+ /**
177
+ * Mark expired tokens. Returns the count touched. Caller can run this
178
+ * before `list` to keep status accurate.
179
+ */
180
+ export function sweepExpired(filePath = defaultTokenStorePath()) {
181
+ const state = readTokens(filePath);
182
+ const now = Date.now();
183
+ let touched = 0;
184
+ state.tokens = state.tokens.map((t) => {
185
+ if (t.status === STATUS.PENDING && t.expiresAtMs <= now) {
186
+ touched += 1;
187
+ return { ...t, status: STATUS.EXPIRED, expiredAtMs: now };
188
+ }
189
+ return t;
190
+ });
191
+ if (touched > 0) writeTokens(state, filePath);
192
+ return touched;
193
+ }
194
+
195
+ /**
196
+ * List tokens. Optional filter by status. Tokens returned newest-first.
197
+ */
198
+ export function listTokens(
199
+ { status, did } = {},
200
+ filePath = defaultTokenStorePath(),
201
+ ) {
202
+ sweepExpired(filePath);
203
+ const state = readTokens(filePath);
204
+ let tokens = state.tokens;
205
+ if (status) tokens = tokens.filter((t) => t.status === status);
206
+ if (did) tokens = tokens.filter((t) => t.qrData?.did === did);
207
+ return tokens
208
+ .slice()
209
+ .sort((a, b) => (b.createdAtMs || 0) - (a.createdAtMs || 0));
210
+ }
211
+
212
+ /**
213
+ * Look up a token by 6-digit code. Returns null when not found.
214
+ */
215
+ export function findToken(code, filePath = defaultTokenStorePath()) {
216
+ if (typeof code !== "string" || !code) return null;
217
+ sweepExpired(filePath);
218
+ const state = readTokens(filePath);
219
+ return state.tokens.find((t) => t.code === code) || null;
220
+ }
221
+
222
+ /**
223
+ * Revoke a token by code. Idempotent — returns `{revoked: false}` when
224
+ * not found or already non-pending.
225
+ */
226
+ export function revokeToken(code, filePath = defaultTokenStorePath()) {
227
+ const state = readTokens(filePath);
228
+ const i = state.tokens.findIndex((t) => t.code === code);
229
+ if (i < 0) return { revoked: false, reason: "not_found" };
230
+ const t = state.tokens[i];
231
+ if (t.status !== STATUS.PENDING) {
232
+ return { revoked: false, reason: `not_pending(${t.status})` };
233
+ }
234
+ state.tokens[i] = {
235
+ ...t,
236
+ status: STATUS.REVOKED,
237
+ revokedAtMs: Date.now(),
238
+ };
239
+ writeTokens(state, filePath);
240
+ return { revoked: true, token: state.tokens[i] };
241
+ }
242
+
243
+ /**
244
+ * Mark a token as consumed. Caller (e.g. signaling listener in PR3) calls
245
+ * this after the mobile successfully connects.
246
+ */
247
+ export function markConsumed(code, filePath = defaultTokenStorePath()) {
248
+ const state = readTokens(filePath);
249
+ const i = state.tokens.findIndex((t) => t.code === code);
250
+ if (i < 0) return { consumed: false, reason: "not_found" };
251
+ const t = state.tokens[i];
252
+ if (t.status !== STATUS.PENDING) {
253
+ return { consumed: false, reason: `not_pending(${t.status})` };
254
+ }
255
+ state.tokens[i] = {
256
+ ...t,
257
+ status: STATUS.CONSUMED,
258
+ consumedAtMs: Date.now(),
259
+ };
260
+ writeTokens(state, filePath);
261
+ return { consumed: true, token: state.tokens[i] };
262
+ }
263
+
264
+ export { STATUS, QR_TYPE, DEFAULT_TTL_MS };
@@ -15,6 +15,9 @@ import { startAgentRepl } from "../gateways/repl/agent-repl.js";
15
15
  import { startChatRepl } from "../gateways/repl/chat-repl.js";
16
16
  import { ChainlessChainWSServer } from "../gateways/ws/ws-server.js";
17
17
  import { WSSessionManager } from "../gateways/ws/ws-session-gateway.js";
18
+ import { attachTopicHandlers } from "../gateways/ws/topic-handler-attachment.js";
19
+ import { PtyManager } from "../gateways/terminal/PtyManager.js";
20
+ import { createTerminalHandlers } from "../gateways/terminal/terminal-handlers.js";
18
21
  import { createWebUIServer } from "../gateways/ui/web-ui-server.js";
19
22
  import { MCPClient, MCPServerConfig } from "../harness/mcp-client.js";
20
23
  import sharedManagedToolPolicy from "./coding-agent-managed-tool-policy.cjs";
@@ -525,6 +528,32 @@ export class AgentRuntime {
525
528
 
526
529
  const actualWsPort = wsServer.port;
527
530
 
531
+ // Plan A remote-terminal mirror (cc ui parity with desktop web-shell):
532
+ // attach terminal.* topic handlers to the freshly-started server. The
533
+ // attachTopicHandlers helper mutates server._dispatcher to route
534
+ // matching topics through `terminalHandlers.handlers`, falling back to
535
+ // the original CLI dispatcher for everything else.
536
+ const wsBroadcastRef = { current: null };
537
+ const ptyManager = new PtyManager();
538
+ const terminal = createTerminalHandlers({
539
+ ptyManager,
540
+ broadcast: (frame) => wsBroadcastRef.current?.(frame),
541
+ });
542
+ const attached = attachTopicHandlers(wsServer, {
543
+ handlers: terminal.handlers,
544
+ });
545
+ wsBroadcastRef.current = attached.broadcast;
546
+ terminal.attachServerEvents();
547
+ // Stash for SIGINT cleanup below (PtyManager.shutdown kills all PTYs;
548
+ // important on Ctrl+C so node-pty children don't outlive cc ui).
549
+ this._terminalCleanup = () => {
550
+ try {
551
+ ptyManager.shutdown();
552
+ } catch {
553
+ /* best effort during teardown */
554
+ }
555
+ };
556
+
528
557
  const httpServer = this.deps.createWebServer({
529
558
  wsPort: actualWsPort,
530
559
  wsToken: this.policy.token,
@@ -610,6 +639,10 @@ export class AgentRuntime {
610
639
  if (mcpClient && typeof mcpClient.disconnectAll === "function") {
611
640
  await mcpClient.disconnectAll().catch(() => undefined);
612
641
  }
642
+ // Kill all PTY sessions before WS so the SPA gets clean terminal.exit
643
+ // frames; without this, node-pty children would outlive cc ui until
644
+ // their OS parent (the cc ui process) actually exits.
645
+ this._terminalCleanup?.();
613
646
  await Promise.all([
614
647
  new Promise((resolve) => httpServer.close(resolve)),
615
648
  wsServer.stop(),
@@ -1,3 +0,0 @@
1
- import{f as O,r as K,o as fe,x as dt,K as d,L as c,M as g,c as e,N as t,u as a,R as l,O as i,P as s,Q as C,F as V,Y as at,Z as J,S as I,I as ot,e as pt,_ as yt,w as mt,H as ft,$ as _t}from"./vendor-BVLz_z7V.js";import{u as _e,_ as ke,E as kt,a as gt,b as vt,T as ht,c as bt,d as G}from"./index-BRWO_MUe.js";import{u as q}from"./useShellMode-CgR0wCYM.js";import{B as ye,R as wt,M as me,F as Y,G as ee,D as te,h as ve,i as ae,j as he,k as oe,A as be,N as we,l as $e,m as Le,n as Oe,o as Se,S as Ce,p as Ee,q as Re,r as ne,s as Ae,t as Ne,u as Te,v as je,w as Be,x as Me,y as Ie,P as Pe,z as se,K as ie,H as D,J as Ue,O as le,Q as De,U as Ke,W as ze,V as re,X as Fe,Y as Ve,Z as ce,_ as qe,$ as We,a0 as He,a1 as Je,a2 as Ge,a3 as Ye,a4 as Ze,a5 as Qe,a6 as Xe,a7 as xe,a8 as $t,a9 as et,e as Lt,aa as Ot}from"./icons-Q99MnhG8.js";import St from"./index-D_g5wyjB.js";import"./KeyCode-D63Tfrq7.js";import"./omit-DYc7DRhT.js";import"./pickAttrs-D667btUF.js";import"./initDefaultProps-C5tyEoyp.js";import"./motion-By5VpSMZ.js";import"./raf-Deuc0E8-.js";import"./index-RpJYGfg0.js";import"./index-DYq0yh8a.js";import"./isVisible-C7tPsqfj.js";import"./useState-Cp5WlLTS.js";import"./devWarning-CNIS3FrJ.js";import"./warning-Pq00owYb.js";import"./compact-item-Buyen0aR.js";import"./createContext-D9l1X-OX.js";import"./Compact-CwrJK_94.js";import"./_getTag-BVc6NQ_K.js";import"./styleChecker-CeeSLisW.js";import"./zoom-DE1Teifl.js";import"./ActionButton-B1m9njbz.js";import"./vnode-ChnNrJNw.js";const Ct=""+new URL("logo-DBCYUiWP.png",import.meta.url).href,L={notifications:K([]),unreadCount:K(0)};function Z(h){if(h&&h.ok===!1)throw new Error(h.error||"notification handler failed");return h?.result??h}function Et(){const h=_e();async function j({limit:r=50,offset:u=0,isRead:_}={}){if(!q().isEmbedded)return L.notifications.value=[],L.unreadCount.value=0,L.notifications.value;const y=await h.sendRaw({type:"notification.list",limit:r,offset:u,isRead:_},15e3),w=Z(y);if(w?.success===!1)throw new Error(w.error||"notification.list failed");return L.notifications.value=Array.isArray(w?.notifications)?w.notifications:[],await E(),L.notifications.value}async function E(){if(!q().isEmbedded)return L.unreadCount.value=0,0;const r=await h.sendRaw({type:"notification.unread-count"},1e4),u=Z(r);return L.unreadCount.value=Number(u?.count)||0,L.unreadCount.value}async function k(r){if(r==null||r==="")throw new Error("id is required");if(!q().isEmbedded)return;const u=await h.sendRaw({type:"notification.mark-read",id:r},1e4),_=Z(u);if(_?.success===!1)throw new Error(_.error||"notification.mark-read failed");const y=L.notifications.value.find(w=>w.id===r);y&&(y.is_read=1),await E()}async function S(){if(!q().isEmbedded)return;const r=await h.sendRaw({type:"notification.mark-all-read"},1e4),u=Z(r);if(u?.success===!1)throw new Error(u.error||"notification.mark-all-read failed");for(const _ of L.notifications.value)_.is_read=1;L.unreadCount.value=0}async function b(r,u=""){if(!q().isEmbedded)throw new Error("桌面通知仅在嵌入式 web-shell 中可用");const _=await h.sendRaw({type:"notification.send-desktop",title:r,body:u},1e4),y=Z(_);if(y?.success===!1)throw new Error(y.error||"notification.send-desktop failed")}return{notifications:O(()=>L.notifications.value),unreadCount:O(()=>L.unreadCount.value),refresh:j,refreshUnreadCount:E,markRead:k,markAllRead:S,sendDesktop:b}}const Rt={class:"notif-toolbar"},At={class:"notif-body"},Nt={key:2,class:"notif-list"},Tt=["onClick"],jt={class:"notif-row"},Bt={class:"notif-title"},Mt={class:"notif-time"},It={key:0,class:"notif-message"},Pt={__name:"NotificationBell",setup(h){const j=K(!1),E=K("all"),k=K(!1),{notifications:S,unreadCount:b,refresh:r,markRead:u,markAllRead:_}=Et();function y(){N()}fe(()=>{window.addEventListener("cc:open-notification-drawer",y)}),dt(()=>{window.removeEventListener("cc:open-notification-drawer",y)});const w=O(()=>E.value==="unread"?S.value.filter(m=>!m.is_read):S.value);async function R(){if(q().isEmbedded){k.value=!0;try{await r({limit:100})}catch{}finally{k.value=!1}}}async function N(){j.value=!0,await R()}async function T(m){if(!m.is_read)try{await u(m.id)}catch{}}async function $(){try{await _()}catch(m){console.warn("[NotificationBell] markAllRead failed:",m?.message||m)}}function A(m){if(!m)return"";const f=typeof m=="string"?Date.parse(m):Number(m);if(!Number.isFinite(f))return String(m);const B=Date.now()-f,z=6e4,P=60*z,W=24*P;return B<z?"刚刚":B<P?`${Math.floor(B/z)} 分钟前`:B<W?`${Math.floor(B/P)} 小时前`:new Date(f).toLocaleDateString()}return(m,f)=>{const B=d("a-badge"),z=d("a-tooltip"),P=d("a-radio-button"),W=d("a-radio-group"),H=d("a-space"),Q=d("a-button"),ue=d("a-empty"),de=d("a-spin"),pe=d("a-drawer");return c(),g(V,null,[e(z,{title:"通知"},{default:t(()=>[e(B,{count:a(b),"overflow-count":99,offset:[-4,4]},{default:t(()=>[l("button",{type:"button",class:"notif-bell-btn","aria-label":"通知",onClick:N},[e(a(ye))])]),_:1},8,["count"])]),_:1}),e(pe,{open:j.value,"onUpdate:open":f[1]||(f[1]=v=>j.value=v),title:"通知中心",placement:"right",width:400,"body-style":{padding:0}},{default:t(()=>[l("div",Rt,[e(H,null,{default:t(()=>[e(W,{value:E.value,"onUpdate:value":f[0]||(f[0]=v=>E.value=v),size:"small","button-style":"solid"},{default:t(()=>[e(P,{value:"all"},{default:t(()=>[i("全部 ("+s(a(S).length)+")",1)]),_:1}),e(P,{value:"unread"},{default:t(()=>[i("未读 ("+s(a(b))+")",1)]),_:1})]),_:1},8,["value"])]),_:1}),e(H,null,{default:t(()=>[e(Q,{size:"small",loading:k.value,onClick:R},{icon:t(()=>[e(a(wt))]),_:1},8,["loading"]),e(Q,{size:"small",disabled:a(b)===0,onClick:$},{default:t(()=>[...f[2]||(f[2]=[i(" 全部已读 ",-1)])]),_:1},8,["disabled"])]),_:1})]),l("div",At,[!k.value&&w.value.length===0?(c(),C(ue,{key:0,description:"暂无通知",image:a(kt).PRESENTED_IMAGE_SIMPLE,style:{padding:"60px 0"}},null,8,["image"])):k.value?(c(),C(de,{key:1,style:{display:"block",padding:"60px"}})):(c(),g("ul",Nt,[(c(!0),g(V,null,at(w.value,v=>(c(),g("li",{key:v.id,class:J(["notif-item",{unread:!v.is_read}]),onClick:n=>T(v)},[l("div",jt,[l("div",Bt,s(v.title||v.message||"(无标题)"),1),l("span",Mt,s(A(v.created_at)),1)]),v.message&&v.title?(c(),g("div",It,s(v.message),1)):I("",!0)],10,Tt))),128))]))])]),_:1},8,["open"])],64)}}},Ut=ke(Pt,[["__scopeId","data-v-af539070"]]),Dt={key:0,class:"mbh-count"},Kt={__name:"MobileBridgeHeaderStatus",setup(h){function j(R){if(!R)return[];try{return JSON.parse(R)}catch{}const N=String(R).split(`
2
- `),T=N.findIndex($=>{const A=$.trim();if(!A)return!1;const m=A[0];if(m!=="["&&m!=="{")return!1;if(A.length===1)return!0;const f=A[1];return!(f>="A"&&f<="Z"||f>="a"&&f<="z")});if(T<0)return[];for(let $=N.length-1;$>=T;$--){const A=N[$].trim();if(/^[\]\}]/.test(A)&&!/^[\]\}][A-Za-z]/.test(A))try{return JSON.parse(N.slice(T,$+1).join(`
3
- `))}catch{return[]}}return[]}const E=ot(),k=_e(),S=K([]);let b=null;const r=O(()=>S.value.length),u=O(()=>r.value===0?"var(--text-muted, #999)":"#52c41a"),_=O(()=>r.value===0?"尚未配对任何手机 — 点击进入配对":`已配对 ${r.value} 台手机 — 点击进入管理`);async function y(){if(k.status==="connected")try{const{output:R}=await k.execute("p2p devices --type mobile --json",1e4);S.value=j(R)||[]}catch{}}function w(){E.push("/mobile-bridge")}return fe(()=>{y(),b=setInterval(y,5e3)}),pt(()=>{b&&(clearInterval(b),b=null)}),(R,N)=>{const T=d("a-badge"),$=d("a-tooltip");return c(),C($,{title:_.value},{default:t(()=>[e(T,{count:r.value,"show-zero":!1,"overflow-count":9,offset:[-2,4]},{default:t(()=>[l("button",{type:"button",class:J(["mbh-btn",{"mbh-btn--active":r.value>0}]),onClick:w},[e(a(me),{style:yt({color:u.value,fontSize:"14px"})},null,8,["style"]),r.value>0?(c(),g("span",Dt,s(r.value),1)):I("",!0)],2)]),_:1},8,["count"])]),_:1},8,["title"])}}},zt=ke(Kt,[["__scopeId","data-v-05eb475d"]]),Ft=["src"],Vt={key:0,class:"logo-text"},qt={key:0,class:"mode-banner project"},Wt={class:"banner-info"},Ht={class:"banner-name"},Jt={class:"banner-sub"},Gt={key:1,class:"mode-banner global"},Yt={class:"banner-name"},Zt=["title"],Qt={class:"group-label"},Xt={class:"group-label"},xt={class:"group-label"},ea={class:"group-label"},ta={class:"group-label"},aa={class:"group-label"},oa={class:"group-label"},na={class:"group-label"},sa={class:"group-label"},ia={key:0,class:"footer-text"},la={class:"header-left"},ra={class:"header-right"},ca={class:"theme-switcher"},ua=["data-theme-key","onClick"],da=["data-locale"],pa={class:"lang-switch-label"},ya={class:"version-tag"},tt="cc.web-panel.sidebar.openKeys",ma={__name:"AppLayout",setup(h){const j=ot(),E=ft(),k=_e(),S=gt(),{t:b}=vt(),r=q(),u=K(!1),_=window.__CC_CONFIG__||{},y=O(()=>_.mode==="project"),w="v5.0.3.51",R=O(()=>S.current),N=O(()=>S.config.vars["--menu-mode"]),T=O(()=>{const n=E.name?.toLowerCase()||"dashboard";return[{mcptools:"mcp",quickask:"quick-ask",ukeysign:"ukey-sign"}[n]||n]}),$=["g-overview","g-config","g-data","g-advanced","g-enterprise","g-social","g-media","g-extension"];function A(){try{const n=localStorage.getItem(tt);if(n){const p=JSON.parse(n);if(Array.isArray(p))return p.filter(o=>$.includes(o))}}catch{}return[...$]}const m=K(A());mt(m,n=>{try{localStorage.setItem(tt,JSON.stringify(n))}catch{}},{deep:!0});const f=O(()=>k.status),B=O(()=>({connected:"success",connecting:"processing",error:"error",disconnected:"default"})[k.status]||"default"),z=O(()=>{const n=`appLayout.footerStatus.${k.status}`,p=b(n);return p===n?b("appLayout.footerStatus.unknown"):p});function P(n){S.setTheme(n)}const{current:W,supported:H,setLocale:Q}=bt();function ue(){const n=H[(H.indexOf(W.value)+1)%H.length];Q(n)}async function de(n){try{const p=await k.sendRaw({type:"window.open",role:n},1e4);if(p?.ok===!1){G.error(`打开失败:${p.error||"未知"}`);return}const o=p?.result??p;o?.reason==="role_reserved"?G.warning("该窗口角色被保留"):o?.reason}catch(p){G.error(`打开桌面窗口失败:${p.message||p}`)}}async function pe(){St.confirm({title:"切换到桌面壳?",content:"回到 V5/V6 桌面壳。完整 electronAPI 表面(UKey 硬件 / 原生对话框 / 系统设置等)会重新可用,但失去 web-panel 的 SPA 体验。保存后需要重启应用才生效。",okText:"切换并重启",cancelText:"取消",centered:!0,async onOk(){try{const n=await k.sendRaw({type:"shell.switch",target:"desktop"},5e3);if(n?.ok===!1)throw new Error(n.error||"shell.switch returned failure");G.loading({content:"正在重启…",duration:0})}catch(n){const p=n instanceof Error?n.message:String(n);G.error("切换失败:"+p)}}})}function v({key:n}){if(typeof n=="string"&&n.startsWith("desktop:")){de(n);return}j.push({mcp:"/mcp"}[n]||`/${n}`)}return fe(()=>k.connect()),(n,p)=>{const o=d("a-menu-item"),M=d("a-sub-menu"),F=d("a-menu-divider"),nt=d("a-menu"),st=d("a-badge"),it=d("a-layout-sider"),X=d("a-tooltip"),lt=d("a-tag"),rt=d("a-layout-header"),ct=d("router-view"),ut=d("a-layout-content"),ge=d("a-layout");return c(),C(ge,{class:"app-root"},{default:t(()=>[e(it,{collapsed:u.value,"onUpdate:collapsed":p[2]||(p[2]=U=>u.value=U),collapsible:"","collapsed-width":56,width:216,class:"sidebar"},{default:t(()=>[l("div",{class:J(["logo",{collapsed:u.value}])},[l("img",{src:a(Ct),alt:"ChainlessChain",class:"logo-icon"},null,8,Ft),u.value?I("",!0):(c(),g("span",Vt,"ChainlessChain"))],2),u.value?(c(),g("div",{key:1,class:"mode-icon-sm",title:y.value?a(_).projectName:n.$t("appLayout.scope.global")},[y.value?(c(),C(a(Y),{key:0,style:{color:"#1677ff"}})):(c(),C(a(ee),{key:1,style:{color:"#722ed1"}}))],8,Zt)):(c(),g(V,{key:0},[y.value?(c(),g("div",qt,[e(a(Y),{class:"banner-icon"}),l("div",Wt,[l("div",Ht,s(a(_).projectName||n.$t("appLayout.scope.fallbackProject")),1),l("div",Jt,s(n.$t("appLayout.scope.projectPanel")),1)])])):(c(),g("div",Gt,[e(a(ee),{class:"banner-icon"}),l("span",Yt,s(n.$t("appLayout.scope.global")),1)]))],64)),e(nt,{selectedKeys:T.value,"onUpdate:selectedKeys":p[0]||(p[0]=U=>T.value=U),openKeys:m.value,"onUpdate:openKeys":p[1]||(p[1]=U=>m.value=U),theme:N.value,mode:"inline","inline-collapsed":u.value,class:"side-menu",onClick:v},{default:t(()=>[u.value?(c(),g(V,{key:1},[e(o,{key:"dashboard"},{icon:t(()=>[e(a(te))]),_:1}),e(o,{key:"chat"},{icon:t(()=>[e(a(ve))]),_:1}),e(o,{key:"quick-ask"},{icon:t(()=>[e(a(ae))]),_:1}),e(o,{key:"cowork"},{icon:t(()=>[e(a(he))]),_:1}),e(o,{key:"services"},{icon:t(()=>[e(a(oe))]),_:1}),e(o,{key:"aiops"},{icon:t(()=>[e(a(be))]),_:1}),e(o,{key:"tokens"},{icon:t(()=>[e(a(we))]),_:1}),e(o,{key:"logs"},{icon:t(()=>[e(a($e))]),_:1}),e(F,{class:"divider-sm"}),e(o,{key:"skills"},{icon:t(()=>[e(a(Le))]),_:1}),e(o,{key:"providers"},{icon:t(()=>[e(a(Oe))]),_:1}),e(o,{key:"mcp"},{icon:t(()=>[e(a(Se))]),_:1}),e(o,{key:"project-settings"},{icon:t(()=>[e(a(Y))]),_:1}),e(o,{key:"speech-settings"},{icon:t(()=>[e(a(Ce))]),_:1}),e(o,{key:"notification-settings"},{icon:t(()=>[e(a(ye))]),_:1}),e(o,{key:"sync-settings"},{icon:t(()=>[e(a(Ee))]),_:1}),e(o,{key:"nlprog"},{icon:t(()=>[e(a(Re))]),_:1}),e(o,{key:"codegen"},{icon:t(()=>[e(a(ne))]),_:1}),e(F,{class:"divider-sm"}),e(o,{key:"notes"},{icon:t(()=>[e(a(Ae))]),_:1}),e(o,{key:"search"},{icon:t(()=>[e(a(Ne))]),_:1}),e(o,{key:"memory"},{icon:t(()=>[e(a(Te))]),_:1}),e(o,{key:"knowledge"},{icon:t(()=>[e(a(je))]),_:1}),e(o,{key:"marketplace"},{icon:t(()=>[e(a(Be))]),_:1}),e(o,{key:"cron"},{icon:t(()=>[e(a(Me))]),_:1}),e(o,{key:"workflow"},{icon:t(()=>[e(a(Ie))]),_:1}),e(o,{key:"pipeline"},{icon:t(()=>[e(a(Pe))]),_:1}),e(o,{key:"tasks"},{icon:t(()=>[e(a(ae))]),_:1}),e(F,{class:"divider-sm"}),e(o,{key:"security"},{icon:t(()=>[e(a(se))]),_:1}),e(o,{key:"ukey-sign"},{icon:t(()=>[e(a(ie))]),_:1}),e(o,{key:"trust"},{icon:t(()=>[e(a(D))]),_:1}),e(o,{key:"audit"},{icon:t(()=>[e(a(Ue))]),_:1}),e(o,{key:"mtc"},{icon:t(()=>[e(a(D))]),_:1}),e(o,{key:"mtc-audit"},{icon:t(()=>[e(a(D))]),_:1}),e(o,{key:"multisig"},{icon:t(()=>[e(a(le))]),_:1}),e(o,{key:"did"},{icon:t(()=>[e(a(De))]),_:1}),e(o,{key:"permissions"},{icon:t(()=>[e(a(Ke))]),_:1}),e(o,{key:"p2p"},{icon:t(()=>[e(a(ze))]),_:1}),e(o,{key:"mobile-bridge"},{icon:t(()=>[e(a(me))]),_:1}),e(o,{key:"backup"},{icon:t(()=>[e(a(re))]),_:1}),e(o,{key:"git"},{icon:t(()=>[e(a(ne))]),_:1}),e(o,{key:"projects"},{icon:t(()=>[e(a(Fe))]),_:1}),e(o,{key:"crosschain"},{icon:t(()=>[e(a(Ve))]),_:1}),e(o,{key:"compliance"},{icon:t(()=>[e(a(D))]),_:1}),e(o,{key:"privacy"},{icon:t(()=>[e(a(ce))]),_:1}),e(o,{key:"inference"},{icon:t(()=>[e(a(qe))]),_:1}),e(o,{key:"federation"},{icon:t(()=>[e(a(We))]),_:1}),e(F,{class:"divider-sm"}),e(o,{key:"wallet"},{icon:t(()=>[e(a(He))]),_:1}),e(o,{key:"organization"},{icon:t(()=>[e(a(le))]),_:1}),e(o,{key:"tenant"},{icon:t(()=>[e(a(Je))]),_:1}),e(o,{key:"sla"},{icon:t(()=>[e(a(te))]),_:1}),e(o,{key:"analytics"},{icon:t(()=>[e(a(Ge))]),_:1}),e(o,{key:"templates"},{icon:t(()=>[e(a(Ye))]),_:1}),e(F,{class:"divider-sm"}),e(o,{key:"community"},{icon:t(()=>[e(a(Ze))]),_:1}),e(o,{key:"governance"},{icon:t(()=>[e(a(Qe))]),_:1}),e(o,{key:"reputation"},{icon:t(()=>[e(a(Xe))]),_:1}),e(o,{key:"recommend"},{icon:t(()=>[e(a(xe))]),_:1}),e(F,{class:"divider-sm"}),e(o,{key:"rssfeed"},{icon:t(()=>[e(a(et))]),_:1}),e(o,{key:"webauthn"},{icon:t(()=>[e(a(ie))]),_:1}),a(r).isEmbedded?(c(),g(V,{key:0},[e(F,{class:"divider-sm"}),e(o,{key:"desktop:hardware-wallet"},{icon:t(()=>[e(a(se))]),_:1}),e(o,{key:"desktop:backup-dashboard"},{icon:t(()=>[e(a(re))]),_:1}),e(o,{key:"desktop:llm-test-chat"},{icon:t(()=>[e(a(ce))]),_:1}),e(o,{key:"desktop:settings"},{icon:t(()=>[e(a(oe))]),_:1})],64)):I("",!0)],64)):(c(),g(V,{key:0},[e(M,{key:"g-overview"},{title:t(()=>[l("span",Qt,s(n.$t("appLayout.groups.overview")),1)]),default:t(()=>[e(o,{key:"dashboard"},{icon:t(()=>[e(a(te))]),default:t(()=>[i(s(n.$t("appLayout.items.dashboard")),1)]),_:1}),e(o,{key:"chat"},{icon:t(()=>[e(a(ve))]),default:t(()=>[i(s(n.$t("appLayout.items.chat")),1)]),_:1}),e(o,{key:"quick-ask"},{icon:t(()=>[e(a(ae))]),default:t(()=>[i(s(n.$t("appLayout.items.quickAsk")),1)]),_:1}),e(o,{key:"cowork"},{icon:t(()=>[e(a(he))]),default:t(()=>[i(s(n.$t("appLayout.items.cowork")),1)]),_:1}),e(o,{key:"services"},{icon:t(()=>[e(a(oe))]),default:t(()=>[i(s(n.$t("appLayout.items.services")),1)]),_:1}),e(o,{key:"aiops"},{icon:t(()=>[e(a(be))]),default:t(()=>[i(s(n.$t("appLayout.items.aiops")),1)]),_:1}),e(o,{key:"tokens"},{icon:t(()=>[e(a(we))]),default:t(()=>[i(s(n.$t("appLayout.items.tokens")),1)]),_:1}),e(o,{key:"logs"},{icon:t(()=>[e(a($e))]),default:t(()=>[i(s(n.$t("appLayout.items.logs")),1)]),_:1})]),_:1}),e(M,{key:"g-config"},{title:t(()=>[l("span",Xt,s(n.$t("appLayout.groups.config")),1)]),default:t(()=>[e(o,{key:"skills"},{icon:t(()=>[e(a(Le))]),default:t(()=>[i(s(n.$t("appLayout.items.skills")),1)]),_:1}),e(o,{key:"providers"},{icon:t(()=>[e(a(Oe))]),default:t(()=>[i(s(n.$t("appLayout.items.providers")),1)]),_:1}),e(o,{key:"mcp"},{icon:t(()=>[e(a(Se))]),default:t(()=>[i(s(n.$t("appLayout.items.mcp")),1)]),_:1}),e(o,{key:"project-settings"},{icon:t(()=>[e(a(Y))]),default:t(()=>[i(s(n.$t("appLayout.items.projectSettings")),1)]),_:1}),e(o,{key:"speech-settings"},{icon:t(()=>[e(a(Ce))]),default:t(()=>[i(s(n.$t("appLayout.items.speechSettings")),1)]),_:1}),e(o,{key:"notification-settings"},{icon:t(()=>[e(a(ye))]),default:t(()=>[i(s(n.$t("appLayout.items.notificationSettings")),1)]),_:1}),e(o,{key:"sync-settings"},{icon:t(()=>[e(a(Ee))]),default:t(()=>[i(s(n.$t("appLayout.items.syncSettings")),1)]),_:1}),e(o,{key:"nlprog"},{icon:t(()=>[e(a(Re))]),default:t(()=>[i(s(n.$t("appLayout.items.nlprog")),1)]),_:1}),e(o,{key:"codegen"},{icon:t(()=>[e(a(ne))]),default:t(()=>[i(s(n.$t("appLayout.items.codegen")),1)]),_:1})]),_:1}),e(M,{key:"g-data"},{title:t(()=>[l("span",xt,s(n.$t("appLayout.groups.data")),1)]),default:t(()=>[e(o,{key:"notes"},{icon:t(()=>[e(a(Ae))]),default:t(()=>[i(s(n.$t("appLayout.items.notes")),1)]),_:1}),e(o,{key:"search"},{icon:t(()=>[e(a(Ne))]),default:t(()=>[i(s(n.$t("appLayout.items.search")),1)]),_:1}),e(o,{key:"memory"},{icon:t(()=>[e(a(Te))]),default:t(()=>[i(s(n.$t("appLayout.items.memory")),1)]),_:1}),e(o,{key:"knowledge"},{icon:t(()=>[e(a(je))]),default:t(()=>[i(s(n.$t("appLayout.items.knowledge")),1)]),_:1}),e(o,{key:"marketplace"},{icon:t(()=>[e(a(Be))]),default:t(()=>[i(s(n.$t("appLayout.items.marketplace")),1)]),_:1}),e(o,{key:"cron"},{icon:t(()=>[e(a(Me))]),default:t(()=>[i(s(n.$t("appLayout.items.cron")),1)]),_:1}),e(o,{key:"workflow"},{icon:t(()=>[e(a(Ie))]),default:t(()=>[i(s(n.$t("appLayout.items.workflow")),1)]),_:1}),e(o,{key:"pipeline"},{icon:t(()=>[e(a(Pe))]),default:t(()=>[i(s(n.$t("appLayout.items.pipeline")),1)]),_:1}),e(o,{key:"tasks"},{icon:t(()=>[e(a(ae))]),default:t(()=>[i(s(n.$t("appLayout.items.tasks")),1)]),_:1})]),_:1}),e(M,{key:"g-advanced"},{title:t(()=>[l("span",ea,s(n.$t("appLayout.groups.advanced")),1)]),default:t(()=>[e(o,{key:"security"},{icon:t(()=>[e(a(se))]),default:t(()=>[i(s(n.$t("appLayout.items.security")),1)]),_:1}),e(o,{key:"ukey-sign"},{icon:t(()=>[e(a(ie))]),default:t(()=>[i(s(n.$t("appLayout.items.ukeySign")),1)]),_:1}),e(o,{key:"trust"},{icon:t(()=>[e(a(D))]),default:t(()=>[i(s(n.$t("appLayout.items.trust")),1)]),_:1}),e(o,{key:"audit"},{icon:t(()=>[e(a(Ue))]),default:t(()=>[i(s(n.$t("appLayout.items.audit")),1)]),_:1}),e(o,{key:"mtc"},{icon:t(()=>[e(a(D))]),default:t(()=>[i(s(n.$t("appLayout.items.mtc")),1)]),_:1}),e(o,{key:"mtc-audit"},{icon:t(()=>[e(a(D))]),default:t(()=>[i(s(n.$t("appLayout.items.mtcAudit","MTC 审计")),1)]),_:1}),e(o,{key:"multisig"},{icon:t(()=>[e(a(le))]),default:t(()=>[i(s(n.$t("appLayout.items.multisig","M-of-N 多签")),1)]),_:1}),e(o,{key:"did"},{icon:t(()=>[e(a(De))]),default:t(()=>[i(s(n.$t("appLayout.items.did")),1)]),_:1}),e(o,{key:"permissions"},{icon:t(()=>[e(a(Ke))]),default:t(()=>[i(s(n.$t("appLayout.items.permissions")),1)]),_:1}),e(o,{key:"p2p"},{icon:t(()=>[e(a(ze))]),default:t(()=>[i(s(n.$t("appLayout.items.p2p")),1)]),_:1}),e(o,{key:"mobile-bridge"},{icon:t(()=>[e(a(me))]),default:t(()=>[i(s(n.$t("appLayout.items.mobileBridge","移动桥")),1)]),_:1}),e(o,{key:"backup"},{icon:t(()=>[e(a(re))]),default:t(()=>[i(s(n.$t("appLayout.items.backup")),1)]),_:1}),e(o,{key:"git"},{icon:t(()=>[e(a(ne))]),default:t(()=>[i(s(n.$t("appLayout.items.git")),1)]),_:1}),e(o,{key:"projects"},{icon:t(()=>[e(a(Fe))]),default:t(()=>[i(s(n.$t("appLayout.items.projects")),1)]),_:1}),e(o,{key:"crosschain"},{icon:t(()=>[e(a(Ve))]),default:t(()=>[i(s(n.$t("appLayout.items.crosschain")),1)]),_:1}),e(o,{key:"compliance"},{icon:t(()=>[e(a(D))]),default:t(()=>[i(s(n.$t("appLayout.items.compliance")),1)]),_:1}),e(o,{key:"privacy"},{icon:t(()=>[e(a(ce))]),default:t(()=>[i(s(n.$t("appLayout.items.privacy")),1)]),_:1}),e(o,{key:"inference"},{icon:t(()=>[e(a(qe))]),default:t(()=>[i(s(n.$t("appLayout.items.inference")),1)]),_:1}),e(o,{key:"federation"},{icon:t(()=>[e(a(We))]),default:t(()=>[i(s(n.$t("appLayout.items.federation")),1)]),_:1})]),_:1}),e(M,{key:"g-enterprise"},{title:t(()=>[l("span",ta,s(n.$t("appLayout.groups.enterprise")),1)]),default:t(()=>[e(o,{key:"wallet"},{icon:t(()=>[e(a(He))]),default:t(()=>[i(s(n.$t("appLayout.items.wallet")),1)]),_:1}),e(o,{key:"organization"},{icon:t(()=>[e(a(le))]),default:t(()=>[i(s(n.$t("appLayout.items.organization")),1)]),_:1}),e(o,{key:"tenant"},{icon:t(()=>[e(a(Je))]),default:t(()=>[i(s(n.$t("appLayout.items.tenant")),1)]),_:1}),e(o,{key:"sla"},{icon:t(()=>[e(a(te))]),default:t(()=>[i(s(n.$t("appLayout.items.sla")),1)]),_:1}),e(o,{key:"analytics"},{icon:t(()=>[e(a(Ge))]),default:t(()=>[i(s(n.$t("appLayout.items.analytics")),1)]),_:1}),e(o,{key:"templates"},{icon:t(()=>[e(a(Ye))]),default:t(()=>[i(s(n.$t("appLayout.items.templates")),1)]),_:1})]),_:1}),e(M,{key:"g-social"},{title:t(()=>[l("span",aa,s(n.$t("appLayout.groups.social")),1)]),default:t(()=>[e(o,{key:"community"},{icon:t(()=>[e(a(Ze))]),default:t(()=>[i(s(n.$t("appLayout.items.community")),1)]),_:1}),e(o,{key:"governance"},{icon:t(()=>[e(a(Qe))]),default:t(()=>[i(s(n.$t("appLayout.items.governance")),1)]),_:1}),e(o,{key:"reputation"},{icon:t(()=>[e(a(Xe))]),default:t(()=>[i(s(n.$t("appLayout.items.reputation")),1)]),_:1}),e(o,{key:"recommend"},{icon:t(()=>[e(a(xe))]),default:t(()=>[i(s(n.$t("appLayout.items.recommend")),1)]),_:1})]),_:1}),e(M,{key:"g-media"},{title:t(()=>[l("span",oa,s(n.$t("appLayout.groups.media")),1)]),default:t(()=>[e(o,{key:"video"},{icon:t(()=>[e(a($t))]),default:t(()=>[i(s(n.$t("appLayout.items.video")),1)]),_:1})]),_:1}),e(M,{key:"g-extension"},{title:t(()=>[l("span",na,s(n.$t("appLayout.groups.extension")),1)]),default:t(()=>[e(o,{key:"rssfeed"},{icon:t(()=>[e(a(et))]),default:t(()=>[i(s(n.$t("appLayout.items.rssfeed")),1)]),_:1}),e(o,{key:"webauthn"},{icon:t(()=>[e(a(ie))]),default:t(()=>[i(s(n.$t("appLayout.items.webauthn")),1)]),_:1})]),_:1}),a(r).isEmbedded?(c(),C(M,{key:"g-desktop"},{title:t(()=>[l("span",sa,s(n.$t("appLayout.groups.desktop")),1)]),default:t(()=>[e(o,{key:"desktop:hardware-wallet"},{icon:t(()=>[e(a(se))]),default:t(()=>[i(s(n.$t("appLayout.items.desktopHardware")),1)]),_:1}),e(o,{key:"desktop:backup-dashboard"},{icon:t(()=>[e(a(re))]),default:t(()=>[i(s(n.$t("appLayout.items.desktopBackup")),1)]),_:1}),e(o,{key:"desktop:llm-test-chat"},{icon:t(()=>[e(a(ce))]),default:t(()=>[i(s(n.$t("appLayout.items.desktopLlmTest")),1)]),_:1}),e(o,{key:"desktop:settings"},{icon:t(()=>[e(a(oe))]),default:t(()=>[i(s(n.$t("appLayout.items.desktopSettings")),1)]),_:1})]),_:1})):I("",!0)],64))]),_:1},8,["selectedKeys","openKeys","theme","inline-collapsed"]),l("div",{class:J(["sidebar-footer",{collapsed:u.value}])},[e(st,{status:B.value},null,8,["status"]),u.value?I("",!0):(c(),g("span",ia,s(z.value),1))],2)]),_:1},8,["collapsed"]),e(ge,{class:"main-area"},{default:t(()=>[e(rt,{class:"app-header"},{default:t(()=>[l("div",la,[l("div",{class:J(["scope-tag",y.value?"project":"global"])},[(c(),C(_t(y.value?a(Y):a(ee)))),l("span",null,s(y.value?a(_).projectName||n.$t("appLayout.scope.fallbackProject"):n.$t("appLayout.scope.global")),1),y.value&&a(_).projectRoot?(c(),C(X,{key:0,title:a(_).projectRoot},{default:t(()=>[e(a(Lt),{class:"info-icon"})]),_:1},8,["title"])):I("",!0)],2)]),l("div",ra,[l("div",ca,[(c(!0),g(V,null,at(a(ht),(U,x)=>(c(),C(X,{key:x,title:U.label},{default:t(()=>[l("button",{class:J(["theme-btn",{active:R.value===x}]),"data-theme-key":x,onClick:fa=>P(x)},s(U.icon),11,ua)]),_:2},1032,["title"]))),128))]),e(X,{title:n.$t("language.label")},{default:t(()=>[l("button",{class:"lang-switch-btn","data-locale":a(W),onClick:ue},[e(a(ee),{class:"lang-switch-icon"}),l("span",pa,s(n.$t("language.switch")),1)],8,da)]),_:1},8,["title"]),e(zt),a(r).isEmbedded?(c(),C(Ut,{key:0})):I("",!0),l("span",ya,s(a(w)),1),a(r).isEmbedded?(c(),C(X,{key:1,title:n.$t("appLayout.shellSwitch")},{default:t(()=>[l("button",{type:"button",class:"shell-switch-btn",onClick:pe},[e(a(Ot))])]),_:1},8,["title"])):I("",!0),e(lt,{color:f.value==="connected"?"green":f.value==="connecting"?"orange":"red",class:"ws-tag"},{default:t(()=>[i(s(f.value==="connected"?n.$t("appLayout.wsStatus.connected"):f.value==="connecting"?n.$t("appLayout.wsStatus.connecting"):n.$t("appLayout.wsStatus.disconnected")),1)]),_:1},8,["color"])])]),_:1}),e(ut,{class:"page-content"},{default:t(()=>[e(ct)]),_:1})]),_:1})]),_:1})}}},za=ke(ma,[["__scopeId","data-v-bc1f16e9"]]);export{za as default};
@@ -1 +0,0 @@
1
- import{P as s,e as f}from"./index-BRWO_MUe.js";import{d as w,c as O,s as h,w as k,f as b,r as S}from"./vendor-BVLz_z7V.js";var z=function(n,u){var o={};for(var t in n)Object.prototype.hasOwnProperty.call(n,t)&&u.indexOf(t)<0&&(o[t]=n[t]);if(n!=null&&typeof Object.getOwnPropertySymbols=="function")for(var r=0,t=Object.getOwnPropertySymbols(n);r<t.length;r++)u.indexOf(t[r])<0&&Object.prototype.propertyIsEnumerable.call(n,t[r])&&(o[t[r]]=n[t[r]]);return o};const K=w({compatConfig:{MODE:3},props:{disabled:s.looseBool,type:s.string,value:s.any,tag:{type:String,default:"input"},size:s.string,onChange:Function,onInput:Function,onBlur:Function,onFocus:Function,onKeydown:Function,onCompositionstart:Function,onCompositionend:Function,onKeyup:Function,onPaste:Function,onMousedown:Function},emits:["change","input","blur","keydown","focus","compositionstart","compositionend","keyup","paste","mousedown"],setup(n,u){let{expose:o}=u;const t=h(null);return o({focus:()=>{t.value&&t.value.focus()},blur:()=>{t.value&&t.value.blur()},input:t,setSelectionRange:(l,c,d)=>{var v;(v=t.value)===null||v===void 0||v.setSelectionRange(l,c,d)},select:()=>{var l;(l=t.value)===null||l===void 0||l.select()},getSelectionStart:()=>{var l;return(l=t.value)===null||l===void 0?void 0:l.selectionStart},getSelectionEnd:()=>{var l;return(l=t.value)===null||l===void 0?void 0:l.selectionEnd},getScrollTop:()=>{var l;return(l=t.value)===null||l===void 0?void 0:l.scrollTop}}),()=>{const{tag:l,value:c}=n,d=z(n,["tag","value"]);return O(l,f(f({},d),{},{ref:t,value:c}),null)}}});function D(n){const u=n.getBoundingClientRect(),o=document.documentElement;return{left:u.left+(window.scrollX||o.scrollLeft)-(o.clientLeft||document.body.clientLeft||0),top:u.top+(window.scrollY||o.scrollTop)-(o.clientTop||document.body.clientTop||0)}}function N(n){return Array.prototype.slice.apply(n).map(o=>`${o}: ${n.getPropertyValue(o)};`).join("")}function M(n){return Object.keys(n).reduce((u,o)=>{const t=n[o];return typeof t>"u"||t===null||(u+=`${o}: ${n[o]};`),u},"")}var $=function(n,u){var o={};for(var t in n)Object.prototype.hasOwnProperty.call(n,t)&&u.indexOf(t)<0&&(o[t]=n[t]);if(n!=null&&typeof Object.getOwnPropertySymbols=="function")for(var r=0,t=Object.getOwnPropertySymbols(n);r<t.length;r++)u.indexOf(t[r])<0&&Object.prototype.propertyIsEnumerable.call(n,t[r])&&(o[t[r]]=n[t[r]]);return o};const A=w({compatConfig:{MODE:3},inheritAttrs:!1,props:{disabled:s.looseBool,type:s.string,value:s.any,lazy:s.bool.def(!0),tag:{type:String,default:"input"},size:s.string,style:s.oneOfType([String,Object]),class:s.string},emits:["change","input","blur","keydown","focus","compositionstart","compositionend","keyup","paste","mousedown"],setup(n,u){let{emit:o,attrs:t,expose:r}=u;const a=h(null),y=S(),i=S(!1);k([()=>n.value,i],()=>{i.value||(y.value=n.value)},{immediate:!0});const l=e=>{o("change",e)},c=e=>{i.value=!0,e.target.composing=!0,o("compositionstart",e)},d=e=>{i.value=!1,e.target.composing=!1,o("compositionend",e);const p=document.createEvent("HTMLEvents");p.initEvent("input",!0,!0),e.target.dispatchEvent(p),l(e)},v=e=>{if(i.value&&n.lazy){y.value=e.target.value;return}o("input",e)},_=e=>{o("blur",e)},C=e=>{o("focus",e)},E=()=>{a.value&&a.value.focus()},P=()=>{a.value&&a.value.blur()},j=e=>{o("keydown",e)},F=e=>{o("keyup",e)},T=(e,p,g)=>{var m;(m=a.value)===null||m===void 0||m.setSelectionRange(e,p,g)},B=()=>{var e;(e=a.value)===null||e===void 0||e.select()};r({focus:E,blur:P,input:b(()=>{var e;return(e=a.value)===null||e===void 0?void 0:e.input}),setSelectionRange:T,select:B,getSelectionStart:()=>{var e;return(e=a.value)===null||e===void 0?void 0:e.getSelectionStart()},getSelectionEnd:()=>{var e;return(e=a.value)===null||e===void 0?void 0:e.getSelectionEnd()},getScrollTop:()=>{var e;return(e=a.value)===null||e===void 0?void 0:e.getScrollTop()}});const R=e=>{o("mousedown",e)},x=e=>{o("paste",e)},I=b(()=>n.style&&typeof n.style!="string"?M(n.style):n.style);return()=>{const{style:e,lazy:p}=n,g=$(n,["style","lazy"]);return O(K,f(f(f({},g),t),{},{style:I.value,onInput:v,onChange:l,onBlur:_,onFocus:C,ref:a,value:y.value,onCompositionstart:c,onCompositionend:d,onKeyup:F,onKeydown:j,onPaste:x,onMousedown:R}),null)}}});export{A as B,D as g,N as s};
@@ -1 +0,0 @@
1
- import{k,h,p as j,I as D,e as I,F as S,P as v,N as y}from"./index-BRWO_MUe.js";import{c as N}from"./createContext-D9l1X-OX.js";import{i as A,a as O,b as T,c as _,d as F,g as L,e as w,f as B}from"./_getTag-BVc6NQ_K.js";import{f as s,d as g,c as b}from"./vendor-BVLz_z7V.js";const E=t=>{const{componentCls:o}=t;return{[o]:{display:"inline-flex","&-block":{display:"flex",width:"100%"},"&-vertical":{flexDirection:"column"}}}},H=t=>{const{componentCls:o}=t;return{[o]:{display:"inline-flex","&-rtl":{direction:"rtl"},"&-vertical":{flexDirection:"column"},"&-align":{flexDirection:"column","&-center":{alignItems:"center"},"&-start":{alignItems:"flex-start"},"&-end":{alignItems:"flex-end"},"&-baseline":{alignItems:"baseline"}},[`${o}-item`]:{"&:empty":{display:"none"}}}}},K=k("Space",t=>[H(t),E(t)]);var M="[object Map]",R="[object Set]",V=Object.prototype,q=V.hasOwnProperty;function x(t){if(t==null)return!0;if(A(t)&&(O(t)||typeof t=="string"||typeof t.splice=="function"||T(t)||_(t)||F(t)))return!t.length;var o=L(t);if(o==M||o==R)return!t.size;if(w(t))return!B(t).length;for(var e in t)if(q.call(t,e))return!1;return!0}const G=()=>({compactSize:String,compactDirection:v.oneOf(y("horizontal","vertical")).def("horizontal"),isFirstItem:S(),isLastItem:S()}),i=N(null),Z=(t,o)=>{const e=i.useInject(),a=s(()=>{if(!e||x(e))return"";const{compactDirection:r,isFirstItem:l,isLastItem:n}=e,c=r==="vertical"?"-vertical-":"-";return h({[`${t.value}-compact${c}item`]:!0,[`${t.value}-compact${c}first-item`]:l,[`${t.value}-compact${c}last-item`]:n,[`${t.value}-compact${c}item-rtl`]:o.value==="rtl"})});return{compactSize:s(()=>e?.compactSize),compactDirection:s(()=>e?.compactDirection),compactItemClassnames:a}},tt=g({name:"NoCompactStyle",setup(t,o){let{slots:e}=o;return i.useProvide(null),()=>{var a;return(a=e.default)===null||a===void 0?void 0:a.call(e)}}}),J=()=>({prefixCls:String,size:{type:String},direction:v.oneOf(y("horizontal","vertical")).def("horizontal"),align:v.oneOf(y("start","end","center","baseline")),block:{type:Boolean,default:void 0}}),Q=g({name:"CompactItem",props:G(),setup(t,o){let{slots:e}=o;return i.useProvide(t),()=>{var a;return(a=e.default)===null||a===void 0?void 0:a.call(e)}}}),et=g({name:"ASpaceCompact",inheritAttrs:!1,props:J(),setup(t,o){let{attrs:e,slots:a}=o;const{prefixCls:r,direction:l}=j("space-compact",t),n=i.useInject(),[c,$]=K(r),z=s(()=>h(r.value,$.value,{[`${r.value}-rtl`]:l.value==="rtl",[`${r.value}-block`]:t.block,[`${r.value}-vertical`]:t.direction==="vertical"}));return()=>{var m;const p=D(((m=a.default)===null||m===void 0?void 0:m.call(a))||[]);return p.length===0?null:c(b("div",I(I({},e),{},{class:[z.value,e.class]}),[p.map((u,d)=>{var f;const P=u&&u.key||`${r.value}-item-${d}`,C=!n||x(n);return b(Q,{key:P,compactSize:(f=t.size)!==null&&f!==void 0?f:"middle",compactDirection:t.direction,isFirstItem:d===0&&(C||n?.isFirstItem),isLastItem:d===p.length-1&&(C||n?.isLastItem)},{default:()=>[u]})})]))}}});export{et as C,tt as N,K as a,Z as u};
@@ -1 +0,0 @@
1
- import{_ as et,b as tt,u as at,E as ot,d as h}from"./index-BRWO_MUe.js";import{s as nt}from"./community-parser-CO25nZFt.js";import{R as st,aq as lt,$ as rt,aL as it,n as ut,ak as ct,f as dt,t as ft}from"./icons-Q99MnhG8.js";import{o as pt,M as I,R as A,P as c,u as s,c as t,N as a,K as m,r as x,L as f,O as p,F as D,Y as J,Q as T,S as K,f as R,a as ve}from"./vendor-BVLz_z7V.js";function P(l){const e=nt(l);if(!e)return null;try{return JSON.parse(e)}catch{}const i=e.match(/\{[\s\S]*\}|\[[\s\S]*\]/);if(!i)return null;try{return JSON.parse(i[0])}catch{return null}}const Fe=Object.freeze(["closed","open","half_open"]),be=Object.freeze(["healthy","degraded","unhealthy","unknown"]),$e=Object.freeze(["heartbeat","latency","success_rate","cpu_usage","memory_usage"]);function k(l,e=0){return typeof l=="number"&&Number.isFinite(l)?l:e}function mt(l,e=0){if(!l||typeof l!="object")return null;const i=l.node_id??l.nodeId??"";if(!i)return null;const b=String(l.state||"closed").toLowerCase();return{key:i,nodeId:i,state:b,failureCount:k(l.failure_count??l.failureCount,0),successCount:k(l.success_count??l.successCount,0),failureThreshold:k(l.failure_threshold??l.failureThreshold,0),successThreshold:k(l.success_threshold??l.successThreshold,0),openTimeout:k(l.open_timeout??l.openTimeout,0),lastFailureTime:l.last_failure_time??l.lastFailureTime??null,lastSuccessTime:l.last_success_time??l.lastSuccessTime??null,stateChangedAt:l.state_changed_at??l.stateChangedAt??null,metadata:l.metadata??null,createdAt:l.created_at??l.createdAt??null,updatedAt:l.updated_at??l.updatedAt??null,_idx:e}}function ht(l){const e=P(l);return Array.isArray(e)?e.map(mt).filter(Boolean):[]}function kt(l,e=0){if(!l||typeof l!="object")return null;const i=l.check_id??l.checkId??"";return i?{key:i,checkId:i,nodeId:l.node_id??l.nodeId??"",checkType:String(l.check_type??l.checkType??"").toLowerCase(),status:String(l.status||"unknown").toLowerCase(),metrics:l.metrics??null,checkedAt:l.checked_at??l.checkedAt??null,_idx:e}:null}function yt(l){const e=P(l);return Array.isArray(e)?e.map(kt).filter(Boolean):[]}function vt(l,e=0){if(!l||typeof l!="object")return null;const i=l.nodeId??l.node_id??"";return i?{key:i,nodeId:i,minConnections:k(l.minConnections,0),maxConnections:k(l.maxConnections,0),idleTimeout:k(l.idleTimeout,0),activeConnections:k(l.activeConnections,0),idleConnections:k(l.idleConnections,0),totalCreated:k(l.totalCreated,0),totalDestroyed:k(l.totalDestroyed,0),waitingRequests:k(l.waitingRequests,0),createdAt:l.createdAt??null,_idx:e}:null}function _t(l){const e=P(l);return Array.isArray(e)?e.map(vt).filter(Boolean):[]}function bt(l){const e=P(l);if(!e||typeof e!="object"||Array.isArray(e))return{nodeId:"",status:"unknown",checks:0,latestChecks:[]};const b=(Array.isArray(e.latestChecks)?e.latestChecks:[]).filter(y=>y&&typeof y=="object").map(y=>({checkType:String(y.checkType??y.check_type??"").toLowerCase(),status:String(y.status||"unknown").toLowerCase(),checkedAt:y.checkedAt??y.checked_at??null}));return{nodeId:e.nodeId??e.node_id??"",status:String(e.status||"unknown").toLowerCase(),checks:k(e.checks,0),latestChecks:b}}function _e(l){const e=P(l);if(!e||typeof e!="object"||Array.isArray(e))return{ok:!1,id:null,reason:""};const i=!!(e.registered||e.recorded||e.initialized),b=e.nodeId??e.checkId??null;return{ok:i,id:b?String(b):null,reason:e.reason?String(e.reason):""}}function gt(l){const e=P(l);return!e||typeof e!="object"||Array.isArray(e)?{ok:!1,state:"",previousState:"",failureCount:0,successCount:0,remainingMs:0,reason:""}:{ok:!!(e.updated||e.reset),state:String(e.state||""),previousState:String(e.previousState||""),failureCount:k(e.failureCount,0),successCount:k(e.successCount,0),remainingMs:k(e.remainingMs,0),reason:e.reason?String(e.reason):""}}function Ct(l){const e=P(l);return!e||typeof e!="object"||Array.isArray(e)?{ok:!1,active:0,idle:0,waiting:0,reason:""}:{ok:!!(e.acquired||e.released||e.destroyed),active:k(e.active,0),idle:k(e.idle,0),waiting:k(e.waiting,0),reason:e.reason?String(e.reason):""}}function xt(l){const e=P(l);return!e||typeof e!="object"||Array.isArray(e)?{ok:!1,reason:""}:{ok:!!e.removed,reason:e.reason?String(e.reason):""}}const Tt={circuitBreakers:{total:0,byState:{}},healthChecks:{total:0,byStatus:{}},connectionPools:{total:0,totalActive:0,totalIdle:0,totalConnections:0}};function St(l){const e=JSON.parse(JSON.stringify(Tt));for(const b of Fe)e.circuitBreakers.byState[b]=0;for(const b of be)e.healthChecks.byStatus[b]=0;const i=P(l);if(!i||typeof i!="object"||Array.isArray(i))return e;if(i.circuitBreakers&&typeof i.circuitBreakers=="object"&&(e.circuitBreakers.total=k(i.circuitBreakers.total,0),i.circuitBreakers.byState&&typeof i.circuitBreakers.byState=="object"))for(const[b,y]of Object.entries(i.circuitBreakers.byState))typeof y=="number"&&Number.isFinite(y)&&(e.circuitBreakers.byState[b]=y);if(i.healthChecks&&typeof i.healthChecks=="object"&&(e.healthChecks.total=k(i.healthChecks.total,0),i.healthChecks.byStatus&&typeof i.healthChecks.byStatus=="object"))for(const[b,y]of Object.entries(i.healthChecks.byStatus))typeof y=="number"&&Number.isFinite(y)&&(e.healthChecks.byStatus[b]=y);return i.connectionPools&&typeof i.connectionPools=="object"&&(e.connectionPools.total=k(i.connectionPools.total,0),e.connectionPools.totalActive=k(i.connectionPools.totalActive,0),e.connectionPools.totalIdle=k(i.connectionPools.totalIdle,0),e.connectionPools.totalConnections=k(i.connectionPools.totalConnections,0)),e}function ie(l){if(l==null||l==="")return"—";const e=typeof l=="number"?new Date(l):new Date(String(l));return isNaN(e.getTime())?String(l):e.toLocaleString("zh-CN",{hour12:!1})}const It={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},At={class:"page-title"},wt={class:"page-sub"},zt={class:"stat-sub"},jt={class:"stat-sub"},Pt={class:"stat-sub"},$t={class:"stat-sub"},Ft={class:"filter-bar"},Lt={key:1},Rt={key:2},Bt={key:3,class:"muted"},Ot={class:"filter-bar"},Mt={key:0,style:{"font-family":"monospace","font-size":"12px"}},qt={key:3,class:"muted",style:{"font-family":"monospace","font-size":"11px"}},Ut={key:4,class:"muted"},Nt={key:1,class:"muted"},Et={style:{"font-family":"monospace"}},Ht={style:{"margin-top":"16px"}},Dt={style:{color:"var(--text-primary)","margin-bottom":"8px"}},Jt={key:2,class:"muted"},Kt={__name:"Federation",setup(l){const{t:e}=tt(),i=at(),b=ot.PRESENTED_IMAGE_SIMPLE,y=x(!1),z=x(!1),ue=x(!1),ce=x([]),ge=x([]),Ce=x([]),S=x({circuitBreakers:{total:0,byState:{closed:0,open:0,half_open:0}},healthChecks:{total:0,byStatus:{healthy:0,degraded:0,unhealthy:0,unknown:0}},connectionPools:{total:0,totalActive:0,totalIdle:0,totalConnections:0}}),xe=x("breakers"),V=x(""),G=x(""),Q=x(""),W=x(!1),Y=x(!1),X=x(!1),v=ve({nodeId:"",failureThreshold:5,successThreshold:2,openTimeout:6e4}),g=ve({nodeId:"",checkType:"heartbeat",status:"healthy",metrics:""}),_=ve({nodeId:"",min:5,max:50,idleTimeout:3e5}),Z=x(""),$=x(null),Le=R(()=>[{title:e("federation.breakerColumns.node"),key:"nodeId",dataIndex:"nodeId",width:"200px"},{title:e("federation.breakerColumns.state"),key:"state",width:"100px"},{title:e("federation.breakerColumns.failure"),key:"failure",width:"120px"},{title:e("federation.breakerColumns.success"),key:"success",width:"120px"},{title:e("federation.breakerColumns.openTimeout"),key:"openTimeout",dataIndex:"openTimeout",width:"110px"},{title:e("federation.breakerColumns.updatedAt"),key:"updatedAt",width:"170px"},{title:e("federation.breakerColumns.action"),key:"action",width:"340px"}]),Re=R(()=>[{title:e("federation.checkColumns.id"),key:"checkId",width:"130px"},{title:e("federation.checkColumns.node"),key:"nodeId",dataIndex:"nodeId",width:"180px"},{title:e("federation.checkColumns.metric"),key:"checkType",width:"120px"},{title:e("federation.checkColumns.status"),key:"status",width:"100px"},{title:e("federation.checkColumns.metrics"),key:"metrics"},{title:e("federation.checkColumns.checkedAt"),key:"checkedAt",width:"170px"}]),Be=R(()=>[{title:e("federation.poolColumns.node"),key:"nodeId",dataIndex:"nodeId",width:"200px"},{title:e("federation.poolColumns.active"),key:"activeConnections",dataIndex:"activeConnections",width:"90px"},{title:e("federation.poolColumns.idle"),key:"idleConnections",dataIndex:"idleConnections",width:"90px"},{title:e("federation.poolColumns.max"),key:"maxConnections",dataIndex:"maxConnections",width:"90px"},{title:e("federation.poolColumns.utilization"),key:"utilization",width:"160px"},{title:e("federation.poolColumns.waiting"),key:"waitingRequests",dataIndex:"waitingRequests",width:"90px"},{title:e("federation.poolColumns.totalCreated"),key:"totalCreated",dataIndex:"totalCreated",width:"90px"},{title:e("federation.poolColumns.createdAt"),key:"createdAt",width:"170px"},{title:e("federation.poolColumns.action"),key:"action",width:"240px"}]),Oe=R(()=>[{title:e("federation.latestColumns.metric"),key:"checkType",width:"160px"},{title:e("federation.latestColumns.status"),key:"status",width:"120px"},{title:e("federation.latestColumns.checkedAt"),key:"checkedAt"}]),Me=R(()=>V.value?ce.value.filter(r=>r.state===V.value):ce.value),qe=R(()=>{let r=ge.value;return G.value&&(r=r.filter(n=>n.checkType===G.value)),Q.value&&(r=r.filter(n=>n.status===Q.value)),r}),Te=R(()=>(S.value.circuitBreakers.byState.open||0)+(S.value.circuitBreakers.byState.half_open||0)),Se=R(()=>{const r=S.value.circuitBreakers.total;return r?(S.value.circuitBreakers.byState.closed||0)/r*100:100});function Ie(r){return r.maxConnections?Math.round(r.activeConnections/r.maxConnections*100):0}function ee(r){const n=`federation.state.${r}`,u=e(n);return u===n?r:u}function Ue(r){return{closed:"green",open:"red",half_open:"gold"}[r]||"default"}function te(r){const n=`federation.metric.${r}`,u=e(n);return u===n?r:u}function N(r){const n=`federation.health.${r}`,u=e(n);return u===n?r:u}function de(r){return{healthy:"green",degraded:"gold",unhealthy:"red",unknown:"default"}[r]||"default"}function Ae(r){return r>=95?"#52c41a":r>=80?"#1677ff":r>=60?"#faad14":"#ff4d4f"}function Ne(r,n){return r?r.length<=n?r:r.slice(0,n)+"…":""}function F(r){return`"${String(r).replace(/"/g,'\\"')}"`}async function L(){y.value=!0;try{const[r,n,u,j]=await Promise.all([i.execute("federation breakers --limit 200 --json",1e4).catch(()=>({output:""})),i.execute("federation checks --limit 200 --json",1e4).catch(()=>({output:""})),i.execute("federation pools --json",8e3).catch(()=>({output:""})),i.execute("federation stats --json",8e3).catch(()=>({output:""}))]);ce.value=ht(r.output),ge.value=yt(n.output),Ce.value=_t(u.output),S.value=St(j.output)}catch(r){h.error(e("federation.messages.loadFailed",{err:r?.message||r}))}finally{y.value=!1}}async function Ee(){if(!v.nodeId.trim()){h.warning(e("federation.messages.nodeIdRequired"));return}z.value=!0;try{const r=[`federation register ${F(v.nodeId.trim())}`];v.failureThreshold&&r.push(`-f ${v.failureThreshold}`),v.successThreshold&&r.push(`-s ${v.successThreshold}`),v.openTimeout&&r.push(`-t ${v.openTimeout}`),r.push("--json");const{output:n}=await i.execute(r.join(" "),1e4),u=_e(n);if(!u.ok){h.error(e("federation.messages.registerFailed",{err:u.reason||n.slice(0,120)}));return}h.success(e("federation.messages.registerOk",{id:u.id})),W.value=!1,Ke(),await L()}catch(r){h.error(e("federation.messages.registerFailed",{err:r?.message||r}))}finally{z.value=!1}}async function He(){if(!g.nodeId.trim()){h.warning(e("federation.messages.nodeIdRequired"));return}z.value=!0;try{const r=[`federation check ${F(g.nodeId.trim())}`];r.push(`-t ${g.checkType}`),r.push(`-s ${g.status}`),g.metrics.trim()&&r.push(`-m ${F(g.metrics.trim())}`),r.push("--json");const{output:n}=await i.execute(r.join(" "),1e4),u=_e(n);if(!u.ok){h.error(e("federation.messages.checkFailed",{err:u.reason||n.slice(0,120)}));return}h.success(e("federation.messages.checkOk",{id:u.id?.slice(0,8)})),Y.value=!1,Ve(),await L()}catch(r){h.error(e("federation.messages.checkFailed",{err:r?.message||r}))}finally{z.value=!1}}async function De(){if(!_.nodeId.trim()){h.warning(e("federation.messages.nodeIdRequired"));return}z.value=!0;try{const r=[`federation pool-init ${F(_.nodeId.trim())}`];_.min&&r.push(`--min ${_.min}`),_.max&&r.push(`--max ${_.max}`),_.idleTimeout&&r.push(`--idle-timeout ${_.idleTimeout}`),r.push("--json");const{output:n}=await i.execute(r.join(" "),1e4),u=_e(n);if(!u.ok){h.error(e("federation.messages.poolFailed",{err:u.reason||n.slice(0,120)}));return}h.success(e("federation.messages.poolOk",{id:u.id})),X.value=!1,Ge(),await L()}catch(r){h.error(e("federation.messages.poolFailed",{err:r?.message||r}))}finally{z.value=!1}}async function ae(r,n){try{const u=`federation ${n} ${F(r.nodeId)} --json`,{output:j}=await i.execute(u,8e3),C=gt(j);if(!C.ok){h.warning(C.remainingMs?e("federation.messages.operationCooldown",{ms:C.remainingMs}):C.reason||e("federation.messages.operationNoEffect"));return}C.previousState&&C.state&&C.previousState!==C.state?h.success(e("federation.messages.transitionMsg",{from:ee(C.previousState),to:ee(C.state)})):h.success(e(n==="reset"?"federation.messages.resetMsg":"federation.messages.recordedMsg")),await L()}catch(u){h.error(e("federation.messages.operationFailed",{err:u?.message||u}))}}async function Je(r){try{const{output:n}=await i.execute(`federation remove ${F(r.nodeId)} --json`,8e3),u=xt(n);if(!u.ok){h.error(e("federation.messages.removeFailed",{err:u.reason||n.slice(0,120)}));return}h.success(e("federation.messages.removeOk")),await L()}catch(n){h.error(e("federation.messages.removeFailed",{err:n?.message||n}))}}async function fe(r,n){try{const u={acquire:"pool-acquire",release:"pool-release",destroy:"pool-destroy"}[n],{output:j}=await i.execute(`federation ${u} ${F(r.nodeId)} --json`,8e3),C=Ct(j);if(!C.ok){h.warning(C.reason||e("federation.messages.operationNoEffect"));return}if(n==="destroy")h.success(e("federation.messages.destroyMsg"));else{const pe=n==="acquire"?"federation.messages.acquireMsg":"federation.messages.releaseMsg";h.success(e(pe,{active:C.active,idle:C.idle}))}await L()}catch(u){h.error(e("federation.messages.operationFailed",{err:u?.message||u}))}}async function we(){if(!Z.value.trim()){h.warning(e("federation.messages.nodeIdRequired"));return}ue.value=!0;try{const{output:r}=await i.execute(`federation node-health ${F(Z.value.trim())} --json`,8e3);$.value=bt(r)}catch(r){h.error(e("federation.messages.queryFailed",{err:r?.message||r}))}finally{ue.value=!1}}function Ke(){v.nodeId="",v.failureThreshold=5,v.successThreshold=2,v.openTimeout=6e4}function Ve(){g.nodeId="",g.checkType="heartbeat",g.status="healthy",g.metrics=""}function Ge(){_.nodeId="",_.min=5,_.max=50,_.idleTimeout=3e5}return pt(L),(r,n)=>{const u=m("a-button"),j=m("a-menu-item"),C=m("a-menu"),pe=m("a-dropdown"),oe=m("a-space"),E=m("a-statistic"),B=m("a-card"),H=m("a-col"),Qe=m("a-row"),M=m("a-radio-button"),me=m("a-radio-group"),q=m("a-tag"),ze=m("a-popconfirm"),ne=m("a-empty"),se=m("a-table"),le=m("a-tab-pane"),We=m("a-progress"),re=m("a-input"),he=m("a-descriptions-item"),Ye=m("a-descriptions"),Xe=m("a-tabs"),w=m("a-form-item"),U=m("a-input-number"),ke=m("a-form"),ye=m("a-modal"),je=m("a-select-option"),Pe=m("a-select"),Ze=m("a-textarea");return f(),I("div",null,[A("div",It,[A("div",null,[A("h2",At,c(s(e)("federation.title")),1),A("p",wt,c(s(e)("federation.subtitle")),1)]),t(oe,null,{default:a(()=>[t(u,{loading:y.value,onClick:L},{icon:a(()=>[t(s(st))]),default:a(()=>[p(" "+c(s(e)("federation.refresh")),1)]),_:1},8,["loading"]),t(pe,null,{overlay:a(()=>[t(C,null,{default:a(()=>[t(j,{key:"register",onClick:n[0]||(n[0]=o=>W.value=!0)},{default:a(()=>[p(c(s(e)("federation.newMenu.register")),1)]),_:1}),t(j,{key:"check",onClick:n[1]||(n[1]=o=>Y.value=!0)},{default:a(()=>[p(c(s(e)("federation.newMenu.check")),1)]),_:1}),t(j,{key:"pool",onClick:n[2]||(n[2]=o=>X.value=!0)},{default:a(()=>[p(c(s(e)("federation.newMenu.pool")),1)]),_:1})]),_:1})]),default:a(()=>[t(u,{type:"primary"},{icon:a(()=>[t(s(lt))]),default:a(()=>[p(" "+c(s(e)("federation.newDropdown")),1)]),_:1})]),_:1})]),_:1})]),t(Qe,{gutter:[16,16],style:{"margin-bottom":"20px"}},{default:a(()=>[t(H,{xs:12,sm:8,lg:5},{default:a(()=>[t(B,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[t(E,{title:s(e)("federation.stats.breakers"),value:S.value.circuitBreakers.total,"value-style":{color:"#1677ff",fontSize:"20px"}},{prefix:a(()=>[t(s(rt))]),_:1},8,["title","value"]),A("div",zt,c(s(e)("federation.stats.breakerSub",{closed:S.value.circuitBreakers.byState.closed||0,open:S.value.circuitBreakers.byState.open||0})),1)]),_:1})]),_:1}),t(H,{xs:12,sm:8,lg:5},{default:a(()=>[t(B,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[t(E,{title:s(e)("federation.stats.checks"),value:S.value.healthChecks.total,"value-style":{color:"#52c41a",fontSize:"20px"}},{prefix:a(()=>[t(s(it))]),_:1},8,["title","value"]),A("div",jt,c(s(e)("federation.stats.checkSub",{healthy:S.value.healthChecks.byStatus.healthy||0,unhealthy:S.value.healthChecks.byStatus.unhealthy||0})),1)]),_:1})]),_:1}),t(H,{xs:12,sm:8,lg:5},{default:a(()=>[t(B,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[t(E,{title:s(e)("federation.stats.pools"),value:S.value.connectionPools.total,"value-style":{color:"#13c2c2",fontSize:"20px"}},{prefix:a(()=>[t(s(ut))]),_:1},8,["title","value"]),A("div",Pt,c(s(e)("federation.stats.poolSub",{active:S.value.connectionPools.totalActive,idle:S.value.connectionPools.totalIdle})),1)]),_:1})]),_:1}),t(H,{xs:12,sm:8,lg:5},{default:a(()=>[t(B,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[t(E,{title:s(e)("federation.stats.degraded"),value:Te.value,"value-style":{color:Te.value>0?"#faad14":"#8c8c8c",fontSize:"20px"}},{prefix:a(()=>[t(s(ct))]),_:1},8,["title","value","value-style"]),A("div",$t,c(s(e)("federation.stats.degradedSub",{halfOpen:S.value.circuitBreakers.byState.half_open||0})),1)]),_:1})]),_:1}),t(H,{xs:24,sm:8,lg:4},{default:a(()=>[t(B,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[t(E,{title:s(e)("federation.stats.availability"),value:Se.value,suffix:"%",precision:0,"value-style":{color:Ae(Se.value),fontSize:"20px"}},{prefix:a(()=>[t(s(dt))]),_:1},8,["title","value","value-style"])]),_:1})]),_:1})]),_:1}),t(Xe,{activeKey:xe.value,"onUpdate:activeKey":n[7]||(n[7]=o=>xe.value=o),class:"fed-tabs"},{default:a(()=>[t(le,{key:"breakers",tab:s(e)("federation.tabs.breakers")},{default:a(()=>[A("div",Ft,[t(me,{value:V.value,"onUpdate:value":n[3]||(n[3]=o=>V.value=o),size:"small","button-style":"solid"},{default:a(()=>[t(M,{value:""},{default:a(()=>[p(c(s(e)("federation.filter.allStates")),1)]),_:1}),(f(!0),I(D,null,J(s(Fe),o=>(f(),T(M,{key:o,value:o},{default:a(()=>[p(c(ee(o)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),t(se,{columns:Le.value,"data-source":Me.value,pagination:{pageSize:20,showTotal:o=>s(e)("federation.totals.rows",{count:o})},size:"small",loading:y.value,"row-key":"key",style:{background:"var(--bg-card)"}},{bodyCell:a(({column:o,record:d})=>[o.key==="state"?(f(),T(q,{key:0,color:Ue(d.state)},{default:a(()=>[p(c(ee(d.state)),1)]),_:2},1032,["color"])):o.key==="failure"?(f(),I("span",Lt,c(d.failureCount)+" / "+c(d.failureThreshold),1)):o.key==="success"?(f(),I("span",Rt,c(d.successCount)+" / "+c(d.successThreshold),1)):o.key==="updatedAt"?(f(),I("span",Bt,c(s(ie)(d.updatedAt)),1)):o.key==="action"?(f(),T(oe,{key:4,size:4},{default:a(()=>[t(u,{size:"small",danger:"",onClick:O=>ae(d,"failure")},{default:a(()=>[p(c(s(e)("federation.breakerActions.failure")),1)]),_:1},8,["onClick"]),t(u,{size:"small",onClick:O=>ae(d,"success")},{default:a(()=>[p(c(s(e)("federation.breakerActions.success")),1)]),_:1},8,["onClick"]),t(u,{size:"small",type:"dashed",onClick:O=>ae(d,"half-open")},{default:a(()=>[p(c(s(e)("federation.breakerActions.halfOpen")),1)]),_:1},8,["onClick"]),t(u,{size:"small",onClick:O=>ae(d,"reset")},{default:a(()=>[p(c(s(e)("federation.breakerActions.reset")),1)]),_:1},8,["onClick"]),t(ze,{title:s(e)("federation.breakerActions.removeConfirm"),onConfirm:O=>Je(d)},{default:a(()=>[t(u,{size:"small",danger:"",type:"text"},{default:a(()=>[p(c(s(e)("federation.breakerActions.remove")),1)]),_:1})]),_:1},8,["title","onConfirm"])]),_:2},1024)):K("",!0)]),emptyText:a(()=>[t(ne,{image:s(b),description:s(e)("federation.empty.breakers")},null,8,["image","description"])]),_:1},8,["columns","data-source","pagination","loading"])]),_:1},8,["tab"]),t(le,{key:"checks",tab:s(e)("federation.tabs.checks")},{default:a(()=>[A("div",Ot,[t(me,{value:G.value,"onUpdate:value":n[4]||(n[4]=o=>G.value=o),size:"small","button-style":"solid"},{default:a(()=>[t(M,{value:""},{default:a(()=>[p(c(s(e)("federation.filter.allMetrics")),1)]),_:1}),(f(!0),I(D,null,J(s($e),o=>(f(),T(M,{key:o,value:o},{default:a(()=>[p(c(te(o)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"]),t(me,{value:Q.value,"onUpdate:value":n[5]||(n[5]=o=>Q.value=o),size:"small"},{default:a(()=>[t(M,{value:""},{default:a(()=>[p(c(s(e)("federation.filter.allStates")),1)]),_:1}),(f(!0),I(D,null,J(s(be),o=>(f(),T(M,{key:o,value:o},{default:a(()=>[p(c(N(o)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),t(se,{columns:Re.value,"data-source":qe.value,pagination:{pageSize:20,showTotal:o=>s(e)("federation.totals.rows",{count:o})},size:"small",loading:y.value,"row-key":"key",style:{background:"var(--bg-card)"}},{bodyCell:a(({column:o,record:d})=>[o.key==="checkId"?(f(),I("span",Mt,c(d.checkId.slice(0,12)),1)):o.key==="checkType"?(f(),T(q,{key:1,color:"blue"},{default:a(()=>[p(c(te(d.checkType)),1)]),_:2},1024)):o.key==="status"?(f(),T(q,{key:2,color:de(d.status)},{default:a(()=>[p(c(N(d.status)),1)]),_:2},1032,["color"])):o.key==="metrics"?(f(),I("span",qt,c(Ne(d.metrics||"",50)),1)):o.key==="checkedAt"?(f(),I("span",Ut,c(s(ie)(d.checkedAt)),1)):K("",!0)]),emptyText:a(()=>[t(ne,{image:s(b),description:s(e)("federation.empty.checks")},null,8,["image","description"])]),_:1},8,["columns","data-source","pagination","loading"])]),_:1},8,["tab"]),t(le,{key:"pools",tab:s(e)("federation.tabs.pools")},{default:a(()=>[t(se,{columns:Be.value,"data-source":Ce.value,pagination:{pageSize:20,showTotal:o=>s(e)("federation.totals.rows",{count:o})},size:"small",loading:y.value,"row-key":"key",style:{background:"var(--bg-card)"}},{bodyCell:a(({column:o,record:d})=>[o.key==="utilization"?(f(),T(We,{key:0,percent:Ie(d),"stroke-color":Ae(Ie(d)),size:"small"},null,8,["percent","stroke-color"])):o.key==="createdAt"?(f(),I("span",Nt,c(s(ie)(d.createdAt)),1)):o.key==="action"?(f(),T(oe,{key:2,size:4},{default:a(()=>[t(u,{size:"small",type:"primary",onClick:O=>fe(d,"acquire")},{default:a(()=>[p(c(s(e)("federation.poolActions.acquire")),1)]),_:1},8,["onClick"]),t(u,{size:"small",onClick:O=>fe(d,"release")},{default:a(()=>[p(c(s(e)("federation.poolActions.release")),1)]),_:1},8,["onClick"]),t(ze,{title:s(e)("federation.poolActions.destroyConfirm"),onConfirm:O=>fe(d,"destroy")},{default:a(()=>[t(u,{size:"small",danger:"",type:"text"},{default:a(()=>[p(c(s(e)("federation.poolActions.destroy")),1)]),_:1})]),_:1},8,["title","onConfirm"])]),_:2},1024)):K("",!0)]),emptyText:a(()=>[t(ne,{image:s(b),description:s(e)("federation.empty.pools")},null,8,["image","description"])]),_:1},8,["columns","data-source","pagination","loading"])]),_:1},8,["tab"]),t(le,{key:"node-health",tab:s(e)("federation.tabs.nodeHealth")},{default:a(()=>[t(B,{style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"16px"}},{default:a(()=>[t(oe,null,{default:a(()=>[t(re,{value:Z.value,"onUpdate:value":n[6]||(n[6]=o=>Z.value=o),placeholder:s(e)("federation.nodeHealth.inputPlaceholder"),style:{width:"240px"},"allow-clear":"",onPressEnter:we},null,8,["value","placeholder"]),t(u,{type:"primary",loading:ue.value,onClick:we},{icon:a(()=>[t(s(ft))]),default:a(()=>[p(" "+c(s(e)("federation.nodeHealth.query")),1)]),_:1},8,["loading"])]),_:1})]),_:1}),$.value?(f(),T(B,{key:0,style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[t(Ye,{column:3,size:"small",bordered:""},{default:a(()=>[t(he,{label:s(e)("federation.nodeHealth.node")},{default:a(()=>[A("span",Et,c($.value.nodeId),1)]),_:1},8,["label"]),t(he,{label:s(e)("federation.nodeHealth.status")},{default:a(()=>[t(q,{color:de($.value.status)},{default:a(()=>[p(c(N($.value.status)),1)]),_:1},8,["color"])]),_:1},8,["label"]),t(he,{label:s(e)("federation.nodeHealth.checkCount")},{default:a(()=>[p(c($.value.checks),1)]),_:1},8,["label"])]),_:1}),A("div",Ht,[A("h4",Dt,c(s(e)("federation.nodeHealth.latestTitle")),1),$.value.latestChecks.length?(f(),T(se,{key:1,columns:Oe.value,"data-source":$.value.latestChecks,pagination:!1,size:"small","row-key":"checkType",style:{background:"var(--bg-card)"}},{bodyCell:a(({column:o,record:d})=>[o.key==="checkType"?(f(),T(q,{key:0,color:"blue"},{default:a(()=>[p(c(te(d.checkType)),1)]),_:2},1024)):o.key==="status"?(f(),T(q,{key:1,color:de(d.status)},{default:a(()=>[p(c(N(d.status)),1)]),_:2},1032,["color"])):o.key==="checkedAt"?(f(),I("span",Jt,c(s(ie)(d.checkedAt)),1)):K("",!0)]),_:1},8,["columns","data-source"])):(f(),T(ne,{key:0,image:s(b),description:s(e)("federation.empty.noLatest")},null,8,["image","description"]))])]),_:1})):K("",!0)]),_:1},8,["tab"])]),_:1},8,["activeKey"]),t(ye,{open:W.value,"onUpdate:open":n[12]||(n[12]=o=>W.value=o),title:s(e)("federation.register.title"),"confirm-loading":z.value,onOk:Ee},{default:a(()=>[t(ke,{layout:"vertical"},{default:a(()=>[t(w,{label:s(e)("federation.register.nodeIdLabel"),required:""},{default:a(()=>[t(re,{value:v.nodeId,"onUpdate:value":n[8]||(n[8]=o=>v.nodeId=o),placeholder:s(e)("federation.register.nodeIdPlaceholder")},null,8,["value","placeholder"])]),_:1},8,["label"]),t(w,{label:s(e)("federation.register.failureThresholdLabel")},{default:a(()=>[t(U,{value:v.failureThreshold,"onUpdate:value":n[9]||(n[9]=o=>v.failureThreshold=o),min:1,max:100,style:{width:"100%"}},null,8,["value"])]),_:1},8,["label"]),t(w,{label:s(e)("federation.register.successThresholdLabel")},{default:a(()=>[t(U,{value:v.successThreshold,"onUpdate:value":n[10]||(n[10]=o=>v.successThreshold=o),min:1,max:100,style:{width:"100%"}},null,8,["value"])]),_:1},8,["label"]),t(w,{label:s(e)("federation.register.openTimeoutLabel")},{default:a(()=>[t(U,{value:v.openTimeout,"onUpdate:value":n[11]||(n[11]=o=>v.openTimeout=o),min:1e3,step:1e3,style:{width:"100%"}},null,8,["value"])]),_:1},8,["label"])]),_:1})]),_:1},8,["open","title","confirm-loading"]),t(ye,{open:Y.value,"onUpdate:open":n[17]||(n[17]=o=>Y.value=o),title:s(e)("federation.check.title"),"confirm-loading":z.value,onOk:He},{default:a(()=>[t(ke,{layout:"vertical"},{default:a(()=>[t(w,{label:s(e)("federation.check.nodeIdLabel"),required:""},{default:a(()=>[t(re,{value:g.nodeId,"onUpdate:value":n[13]||(n[13]=o=>g.nodeId=o),placeholder:s(e)("federation.check.nodeIdPlaceholder")},null,8,["value","placeholder"])]),_:1},8,["label"]),t(w,{label:s(e)("federation.check.metricLabel"),required:""},{default:a(()=>[t(Pe,{value:g.checkType,"onUpdate:value":n[14]||(n[14]=o=>g.checkType=o)},{default:a(()=>[(f(!0),I(D,null,J(s($e),o=>(f(),T(je,{key:o,value:o},{default:a(()=>[p(c(te(o)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),_:1},8,["label"]),t(w,{label:s(e)("federation.check.statusLabel"),required:""},{default:a(()=>[t(Pe,{value:g.status,"onUpdate:value":n[15]||(n[15]=o=>g.status=o)},{default:a(()=>[(f(!0),I(D,null,J(s(be),o=>(f(),T(je,{key:o,value:o},{default:a(()=>[p(c(N(o)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),_:1},8,["label"]),t(w,{label:s(e)("federation.check.metricsLabel")},{default:a(()=>[t(Ze,{value:g.metrics,"onUpdate:value":n[16]||(n[16]=o=>g.metrics=o),rows:3,placeholder:s(e)("federation.check.metricsPlaceholder")},null,8,["value","placeholder"])]),_:1},8,["label"])]),_:1})]),_:1},8,["open","title","confirm-loading"]),t(ye,{open:X.value,"onUpdate:open":n[22]||(n[22]=o=>X.value=o),title:s(e)("federation.pool.title"),"confirm-loading":z.value,onOk:De},{default:a(()=>[t(ke,{layout:"vertical"},{default:a(()=>[t(w,{label:s(e)("federation.pool.nodeIdLabel"),required:""},{default:a(()=>[t(re,{value:_.nodeId,"onUpdate:value":n[18]||(n[18]=o=>_.nodeId=o),placeholder:s(e)("federation.pool.nodeIdPlaceholder")},null,8,["value","placeholder"])]),_:1},8,["label"]),t(w,{label:s(e)("federation.pool.minLabel")},{default:a(()=>[t(U,{value:_.min,"onUpdate:value":n[19]||(n[19]=o=>_.min=o),min:1,max:500,style:{width:"100%"}},null,8,["value"])]),_:1},8,["label"]),t(w,{label:s(e)("federation.pool.maxLabel")},{default:a(()=>[t(U,{value:_.max,"onUpdate:value":n[20]||(n[20]=o=>_.max=o),min:1,max:500,style:{width:"100%"}},null,8,["value"])]),_:1},8,["label"]),t(w,{label:s(e)("federation.pool.idleTimeoutLabel")},{default:a(()=>[t(U,{value:_.idleTimeout,"onUpdate:value":n[21]||(n[21]=o=>_.idleTimeout=o),min:1e3,step:1e3,style:{width:"100%"}},null,8,["value"])]),_:1},8,["label"])]),_:1})]),_:1},8,["open","title","confirm-loading"])])}}},Yt=et(Kt,[["__scopeId","data-v-45647e41"]]);export{Yt as default};
@@ -1 +0,0 @@
1
- .page-title[data-v-14541f7e]{font-size:22px;font-weight:600;margin:0;color:var(--text-primary)}.page-sub[data-v-14541f7e]{font-size:13px;color:var(--text-secondary);margin:4px 0 0}.filter-bar[data-v-14541f7e]{display:flex;align-items:center;margin-bottom:16px}.multisig-row[data-v-14541f7e]{cursor:pointer}.multisig-row[data-v-14541f7e]:hover{background:var(--bg-hover, rgba(22, 119, 255, .05))}
@@ -1 +0,0 @@
1
- import{o as _e,M as O,R as y,c as a,N as t,K as i,r as k,L as p,O as s,u as b,P as r,Q as c,_ as ye,a1 as F,S as x,F as ve,Y as ge,f as Y}from"./vendor-BVLz_z7V.js";import{_ as be,u as ke,d as m}from"./index-BRWO_MUe.js";import{u as xe}from"./useShellMode-CgR0wCYM.js";import{R as we,x as G,l as he,aE as Ce,f as X,d as ze,c as Me}from"./icons-Q99MnhG8.js";import Se from"./index-D_g5wyjB.js";import"./KeyCode-D63Tfrq7.js";import"./omit-DYc7DRhT.js";import"./pickAttrs-D667btUF.js";import"./initDefaultProps-C5tyEoyp.js";import"./motion-By5VpSMZ.js";import"./raf-Deuc0E8-.js";import"./index-RpJYGfg0.js";import"./index-DYq0yh8a.js";import"./isVisible-C7tPsqfj.js";import"./useState-Cp5WlLTS.js";import"./devWarning-CNIS3FrJ.js";import"./warning-Pq00owYb.js";import"./compact-item-Buyen0aR.js";import"./createContext-D9l1X-OX.js";import"./Compact-CwrJK_94.js";import"./_getTag-BVc6NQ_K.js";import"./styleChecker-CeeSLisW.js";import"./zoom-DE1Teifl.js";import"./ActionButton-B1m9njbz.js";import"./vnode-ChnNrJNw.js";const $e={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},De={class:"filter-bar"},Ae={key:0,style:{"font-size":"12px"}},Ie={style:{margin:"0 0 8px 0"}},Le={style:{"margin-left":"8px",color:"var(--text-secondary)"}},Oe={style:{"margin-top":"8px"}},je={style:{cursor:"pointer",color:"var(--text-secondary)"}},Fe={key:0},Ne={style:{margin:"0","max-height":"240px",overflow:"auto","font-size":"12px"}},Te={style:{margin:"16px 0 8px 0"}},Pe={style:{"font-size":"12px"}},Be={__name:"Multisig",setup(Ee){const N=ke(),{isEmbedded:Z}=xe();async function w(l,e,d,f=8e3){if(Z){const _=await N.sendRaw({type:l,...e},f);if(!_?.ok){const g=_?.error;throw new Error(typeof g=="string"?g:g?.message||`${l} failed`)}return _.result}return N.executeJson(d,f)}const D=k(!1),A=k([]),j=k([]),T=k("proposals"),I=k(""),L=k(""),h=k(!1),n=k(null),ee=[{title:"ID",key:"id",width:200},{title:"Domain",dataIndex:"domain",width:220},{title:"状态",key:"state",width:110},{title:"阈值",key:"sigs",width:80},{title:"创建",key:"createdAt",width:140},{title:"过期",key:"expiresAt",width:140},{title:"操作",key:"actions",width:240,fixed:"right"}],te=[{title:"DID",dataIndex:"did"},{title:"Alg",dataIndex:"alg",width:200}],$=Y(()=>{const l={pending:0,reached:0,consumed:0,cancelled:0,expired:0};for(const e of A.value)l[e.state]!==void 0&&(l[e.state]+=1);return l}),ae=Y(()=>A.value.filter(l=>!(I.value&&l.state!==I.value||L.value&&!l.domain.toLowerCase().includes(L.value.toLowerCase()))));function P(l){switch(l){case"pending":return"gold";case"reached":return"cyan";case"consumed":return"green";case"cancelled":return"default";case"expired":return"red";default:return"default"}}function B(l){const e=l-Date.now(),d=Math.abs(e)/6e4;if(d<60)return e>0?`${Math.round(d)} 分钟后`:`${Math.round(d)} 分钟前`;const f=d/60;if(f<24)return e>0?`${Math.round(f)} 小时后`:`${Math.round(f)} 小时前`;const _=f/24;return e>0?`${Math.round(_)} 天后`:`${Math.round(_)} 天前`}async function C(){D.value=!0;try{const[l,e]=await Promise.all([w("multisig.list",{limit:500},"multisig list --limit 500 --json",1e4).catch(()=>[]),Promise.all(["marketplace.purchase","did.rotate","crosschain.outbound"].map(async d=>{try{const f=await w("multisig.policy.show",{domain:d},`multisig policy show ${d} --json`,8e3);return{domain:d,policy:f,updatedAtMs:Date.now()}}catch{return null}})).then(d=>d.filter(Boolean))]);A.value=Array.isArray(l)?l:[],j.value=Array.isArray(e)?e:[]}catch(l){m.error("加载失败: "+(l.message||l))}finally{D.value=!1}}async function E(l){try{const e=await w("multisig.show",{proposalId:l.id},`multisig show ${l.id} --json`,8e3);n.value=e,h.value=!0}catch(e){m.error("加载详情失败: "+(e.message||e))}}function le(l){return{onClick:()=>E(l)}}async function R(l){Se.confirm({title:`取消提案 ${l.id.slice(0,12)}…?`,content:"已签名的成员需要重新发起新提案。此操作不可撤销。",okText:"取消提案",okType:"danger",cancelText:"保持",onOk:async()=>{try{const e=await w("multisig.cancel",{proposalId:l.id,reason:"web-shell"},`multisig cancel ${l.id} --reason web-shell --json`,8e3);e.ok?(m.success("提案已取消"),h.value=!1,await C()):m.error("取消失败: "+e.reason)}catch(e){m.error(e.message||String(e))}}})}async function K(l){try{const e=await w("marketplace.consume",{proposalId:l.id},`marketplace consume ${l.id} --json`,1e4);e.status==="consumed"?(m.success(`订单 ${e.order.itemId} 已执行 (¥${(e.order.amountFen/100).toFixed(2)})`),h.value=!1,await C()):m.error("执行失败: "+(e.reason||JSON.stringify(e)))}catch(e){m.error(e.message||String(e))}}async function oe(l){try{const e=await w("multisig.finalize",{proposalId:l.id},`multisig finalize ${l.id} --json`,8e3);e.ok?(m.success("提案已 finalize"),h.value=!1,await C()):m.error("Finalize 失败: "+e.reason)}catch(e){m.error(e.message||String(e))}}async function se(){try{const l=await w("multisig.sweep",{},"multisig sweep --json",8e3);l.expired===0?m.info("无过期提案"):(m.success(`已标记 ${l.expired} 条提案为过期`),await C())}catch(l){m.error(l.message||String(l))}}return _e(C),(l,e)=>{const d=i("a-button"),f=i("a-space"),_=i("a-statistic"),g=i("a-card"),z=i("a-col"),ne=i("a-row"),M=i("a-radio-button"),re=i("a-radio-group"),ie=i("a-input-search"),S=i("a-tag"),U=i("a-tooltip"),q=i("a-table"),J=i("a-tab-pane"),ue=i("a-empty"),v=i("a-descriptions-item"),V=i("a-descriptions"),Q=i("a-list-item"),W=i("a-list"),de=i("a-tabs"),pe=i("a-list-item-meta"),ce=i("a-divider"),me=i("a-alert"),fe=i("a-drawer");return p(),O("div",null,[y("div",$e,[e[9]||(e[9]=y("div",null,[y("h2",{class:"page-title"},"M-of-N 多签"),y("p",{class:"page-sub"},"marketplace.purchase 大额、DID 关键操作、跨链桥 outbound 的联合签名审批")],-1)),a(f,null,{default:t(()=>[a(d,{loading:D.value,onClick:C},{icon:t(()=>[a(b(we))]),default:t(()=>[e[7]||(e[7]=s(" 刷新 ",-1))]),_:1},8,["loading"]),a(d,{onClick:se},{icon:t(()=>[a(b(G))]),default:t(()=>[e[8]||(e[8]=s(" 扫过期 ",-1))]),_:1})]),_:1})]),a(ne,{gutter:[16,16],style:{"margin-bottom":"20px"}},{default:t(()=>[a(z,{xs:12,sm:8,lg:4},{default:t(()=>[a(g,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:t(()=>[a(_,{title:"总提案",value:A.value.length,"value-style":{color:"#1677ff",fontSize:"20px"}},{prefix:t(()=>[a(b(he))]),_:1},8,["value"])]),_:1})]),_:1}),a(z,{xs:12,sm:8,lg:4},{default:t(()=>[a(g,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:t(()=>[a(_,{title:"待签",value:$.value.pending,"value-style":{color:"#faad14",fontSize:"20px"}},{prefix:t(()=>[a(b(G))]),_:1},8,["value"])]),_:1})]),_:1}),a(z,{xs:12,sm:8,lg:4},{default:t(()=>[a(g,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:t(()=>[a(_,{title:"已达阈值",value:$.value.reached,"value-style":{color:"#13c2c2",fontSize:"20px"}},{prefix:t(()=>[a(b(Ce))]),_:1},8,["value"])]),_:1})]),_:1}),a(z,{xs:12,sm:8,lg:4},{default:t(()=>[a(g,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:t(()=>[a(_,{title:"已执行",value:$.value.consumed,"value-style":{color:"#52c41a",fontSize:"20px"}},{prefix:t(()=>[a(b(X))]),_:1},8,["value"])]),_:1})]),_:1}),a(z,{xs:12,sm:8,lg:4},{default:t(()=>[a(g,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:t(()=>[a(_,{title:"已取消",value:$.value.cancelled,"value-style":{color:"#8c8c8c",fontSize:"20px"}},{prefix:t(()=>[a(b(ze))]),_:1},8,["value"])]),_:1})]),_:1}),a(z,{xs:12,sm:8,lg:4},{default:t(()=>[a(g,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:t(()=>[a(_,{title:"已过期",value:$.value.expired,"value-style":{color:"#ff4d4f",fontSize:"20px"}},{prefix:t(()=>[a(b(Me))]),_:1},8,["value"])]),_:1})]),_:1})]),_:1}),a(de,{activeKey:T.value,"onUpdate:activeKey":e[2]||(e[2]=o=>T.value=o)},{default:t(()=>[a(J,{key:"proposals",tab:"提案列表"},{default:t(()=>[y("div",De,[a(re,{value:I.value,"onUpdate:value":e[0]||(e[0]=o=>I.value=o),size:"small","button-style":"solid"},{default:t(()=>[a(M,{value:""},{default:t(()=>[...e[10]||(e[10]=[s("全部",-1)])]),_:1}),a(M,{value:"pending"},{default:t(()=>[...e[11]||(e[11]=[s("待签",-1)])]),_:1}),a(M,{value:"reached"},{default:t(()=>[...e[12]||(e[12]=[s("已达阈值",-1)])]),_:1}),a(M,{value:"consumed"},{default:t(()=>[...e[13]||(e[13]=[s("已执行",-1)])]),_:1}),a(M,{value:"cancelled"},{default:t(()=>[...e[14]||(e[14]=[s("已取消",-1)])]),_:1}),a(M,{value:"expired"},{default:t(()=>[...e[15]||(e[15]=[s("已过期",-1)])]),_:1})]),_:1},8,["value"]),a(ie,{value:L.value,"onUpdate:value":e[1]||(e[1]=o=>L.value=o),placeholder:"按 domain 过滤 (marketplace.purchase 等)","allow-clear":"",style:{"max-width":"360px","margin-left":"12px"}},null,8,["value"])]),a(q,{columns:ee,"data-source":ae.value,loading:D.value,pagination:{pageSize:20,showSizeChanger:!0,pageSizeOptions:["10","20","50","100"]},"row-key":"id",size:"middle",onRowClick:le,"row-class-name":()=>"multisig-row"},{bodyCell:t(({column:o,record:u})=>[o.key==="id"?(p(),O("code",Ae,r(u.id.slice(0,16))+"…",1)):o.key==="state"?(p(),c(S,{key:1,color:P(u.state)},{default:t(()=>[s(r(u.state),1)]),_:2},1032,["color"])):o.key==="sigs"?(p(),c(S,{key:2,color:u.n===u.m?"cyan":"default"},{default:t(()=>[s(r(u.m)+"/"+r(u.n),1)]),_:2},1032,["color"])):o.key==="createdAt"?(p(),c(U,{key:3,title:new Date(u.createdAtMs).toLocaleString()},{default:t(()=>[s(r(B(u.createdAtMs)),1)]),_:2},1032,["title"])):o.key==="expiresAt"?(p(),c(U,{key:4,title:new Date(u.expiresAtMs).toLocaleString()},{default:t(()=>[y("span",{style:ye({color:u.expiresAtMs<Date.now()?"#ff4d4f":"inherit"})},r(B(u.expiresAtMs)),5)]),_:2},1032,["title"])):o.key==="actions"?(p(),c(f,{key:5,size:"small"},{default:t(()=>[a(d,{size:"small",onClick:F(H=>E(u),["stop"])},{default:t(()=>[...e[16]||(e[16]=[s("详情",-1)])]),_:1},8,["onClick"]),u.state==="pending"||u.state==="reached"?(p(),c(d,{key:0,size:"small",danger:"",onClick:F(H=>R(u),["stop"])},{default:t(()=>[...e[17]||(e[17]=[s("取消",-1)])]),_:1},8,["onClick"])):x("",!0),u.state==="reached"&&u.domain==="marketplace.purchase"?(p(),c(d,{key:1,size:"small",type:"primary",onClick:F(H=>K(u),["stop"])},{default:t(()=>[...e[18]||(e[18]=[s("执行购买",-1)])]),_:1},8,["onClick"])):x("",!0)]),_:2},1024)):x("",!0)]),_:1},8,["data-source","loading"])]),_:1}),a(J,{key:"policies",tab:"域策略"},{default:t(()=>[j.value.length===0?(p(),c(ue,{key:0,description:"暂无域策略 — 用 CLI 配置: cc multisig policy set <domain> --m <M> --members <json>"})):(p(),c(W,{key:1,"data-source":j.value,"item-layout":"vertical"},{renderItem:t(({item:o})=>[a(Q,null,{default:t(()=>[a(g,null,{default:t(()=>[y("h4",Ie,[a(S,{color:"purple"},{default:t(()=>[s(r(o.domain),1)]),_:2},1024),y("span",Le,[s(r(o.policy.m)+"-of-"+r(o.policy.members.length)+" ",1),o.policy.requirePqc?(p(),c(S,{key:0,color:"orange",style:{"margin-left":"8px"}},{default:t(()=>[...e[19]||(e[19]=[s("requirePQC",-1)])]),_:1})):x("",!0)])]),a(V,{size:"small",column:2},{default:t(()=>[a(v,{label:"阈值 M"},{default:t(()=>[s(r(o.policy.m),1)]),_:2},1024),a(v,{label:"成员数 N"},{default:t(()=>[s(r(o.policy.members.length),1)]),_:2},1024),a(v,{label:"算法"},{default:t(()=>[(p(!0),O(ve,null,ge(o.policy.algorithms||[],u=>(p(),c(S,{key:u,size:"small"},{default:t(()=>[s(r(u),1)]),_:2},1024))),128))]),_:2},1024),a(v,{label:"默认有效期"},{default:t(()=>[s(r(Math.round((o.policy.defaultExpiryMs||864e5)/1e3/60/60))+"h ",1)]),_:2},1024)]),_:2},1024),y("details",Oe,[y("summary",je,"展开成员列表 ("+r(o.policy.members.length)+")",1),a(q,{columns:te,"data-source":o.policy.members,pagination:!1,size:"small","row-key":"did",style:{"margin-top":"8px"}},null,8,["data-source"])])]),_:2},1024)]),_:2},1024)]),_:1},8,["data-source"]))]),_:1})]),_:1},8,["activeKey"]),a(fe,{open:h.value,"onUpdate:open":e[6]||(e[6]=o=>h.value=o),title:n.value?`提案 ${n.value.proposal.id}`:"提案详情",width:"640","destroy-on-close":""},{default:t(()=>[n.value?(p(),O("div",Fe,[a(V,{column:1,bordered:"",size:"small"},{default:t(()=>[a(v,{label:"Domain"},{default:t(()=>[s(r(n.value.proposal.domain),1)]),_:1}),a(v,{label:"状态"},{default:t(()=>[a(S,{color:P(n.value.proposal.state)},{default:t(()=>[s(r(n.value.proposal.state),1)]),_:1},8,["color"])]),_:1}),a(v,{label:"阈值"},{default:t(()=>[s(r(n.value.proposal.thresholdM)+"-of-"+r(n.value.proposal.memberSet.length),1)]),_:1}),a(v,{label:"已签 / 需签"},{default:t(()=>[s(r(n.value.signatures.length)+" / "+r(n.value.proposal.thresholdM),1)]),_:1}),a(v,{label:"发起方"},{default:t(()=>[s(r(n.value.proposal.initiatorDid),1)]),_:1}),a(v,{label:"创建时间"},{default:t(()=>[s(r(new Date(n.value.proposal.createdAtMs).toLocaleString()),1)]),_:1}),a(v,{label:"过期时间"},{default:t(()=>[s(r(new Date(n.value.proposal.expiresAtMs).toLocaleString()),1)]),_:1}),a(v,{label:"Payload"},{default:t(()=>[y("pre",Ne,r(n.value.proposal.payload?JSON.stringify(n.value.proposal.payload,null,2):n.value.proposal.payloadJcs),1)]),_:1})]),_:1}),y("h4",Te,"签名列表 ("+r(n.value.signatures.length)+")",1),a(W,{"data-source":n.value.signatures,size:"small"},{renderItem:t(({item:o})=>[a(Q,null,{default:t(()=>[a(pe,null,{title:t(()=>[a(b(X),{style:{color:"#52c41a","margin-right":"6px"}}),y("code",Pe,r(o.signerDid),1)]),description:t(()=>[s(r(o.alg)+" — "+r(new Date(o.signedAtMs).toLocaleString()),1)]),_:2},1024)]),_:2},1024)]),_:1},8,["data-source"]),a(ce),a(me,{message:"签名 / 执行操作需通过 CLI 提供私钥",description:"Web shell 不直接持有私钥(v1.3 接 Unified KeyStore)。本面板用于查看提案状态,操作请用:cc multisig sign / cancel,或 cc marketplace consume。",type:"info","show-icon":"",style:{"margin-bottom":"12px"}}),a(f,null,{default:t(()=>[n.value.proposal.state==="pending"||n.value.proposal.state==="reached"?(p(),c(d,{key:0,danger:"",onClick:e[3]||(e[3]=o=>R(n.value.proposal))},{default:t(()=>[...e[20]||(e[20]=[s("取消提案",-1)])]),_:1})):x("",!0),n.value.proposal.state==="reached"&&n.value.proposal.domain==="marketplace.purchase"?(p(),c(d,{key:1,type:"primary",onClick:e[4]||(e[4]=o=>K(n.value.proposal))},{default:t(()=>[...e[21]||(e[21]=[s("执行购买 (cc marketplace consume)",-1)])]),_:1})):x("",!0),n.value.proposal.state==="reached"&&n.value.proposal.domain!=="marketplace.purchase"?(p(),c(d,{key:2,type:"primary",onClick:e[5]||(e[5]=o=>oe(n.value.proposal))},{default:t(()=>[...e[22]||(e[22]=[s("finalize (cc multisig finalize)",-1)])]),_:1})):x("",!0)]),_:1})])):x("",!0)]),_:1},8,["open","title"])])}}},ct=be(Be,[["__scopeId","data-v-14541f7e"]]);export{ct as default};
@@ -1 +0,0 @@
1
- import{o as we,M as y,R as g,O as o,c as t,N as a,Q as _,S as z,K as n,r as f,f as G,L as i,u as S,P as u,F as H,a1 as xe}from"./vendor-BVLz_z7V.js";import{_ as je,u as Ce,d as k}from"./index-BRWO_MUe.js";import{u as ze}from"./useShellMode-CgR0wCYM.js";import{R as Se,aq as Pe,F as Oe,f as $e,l as Fe,aE as Ie}from"./icons-Q99MnhG8.js";const Ue={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},Ae={class:"page-sub"},Le={class:"filter-bar",style:{"margin-bottom":"12px",display:"flex",gap:"12px","align-items":"center"}},Be={key:0,style:{"font-size":"12px",color:"#888"}},De={key:0,style:{color:"#888","font-size":"12px"}},Ne={key:0},Re={key:1,style:{color:"#888"}},Ee={key:0,style:{color:"#888","font-size":"12px"}},Te={__name:"Projects",setup(Ve){const M=Ce(),{isEmbedded:X}=ze();async function $(l,e,q,w=8e3){if(X){const j=await M.sendRaw({type:l,...e},w);if(!j?.ok){const m=j?.error;throw new Error(typeof m=="string"?m:m?.message||`${l} failed`)}return j.result}return M.executeJson(q,w)}const x=f(!1),b=f([]),F=f(""),I=f(""),U=f(!1),r=f(null),P=f([]),A=f(!1),L=f(!1),E=f(!1),d=f({name:"",description:"",type:"document",rootPath:""}),Y=[{title:"ID",key:"id",width:110},{title:"名称",key:"name"},{title:"类型",key:"project_type",width:120},{title:"状态",key:"status",width:100},{title:"同步",key:"sync_status",width:100},{title:"更新",key:"updated_at",width:160},{title:"操作",key:"actions",width:180,fixed:"right"}],T=G(()=>{const l={active:0,draft:0,completed:0,archived:0};for(const e of b.value)l[e.status]!==void 0&&(l[e.status]+=1);return l}),Z=G(()=>b.value.filter(l=>!(F.value&&l.status!==F.value||I.value&&!l.name.toLowerCase().includes(I.value.toLowerCase()))));function W(l){switch(l){case"active":return"green";case"draft":return"default";case"completed":return"cyan";case"archived":return"gold";default:return"default"}}function J(l){switch(l){case"synced":return"green";case"pending":return"orange";case"conflict":return"red";case"error":return"red";default:return"default"}}function V(l){return!l&&l!==0?"-":new Date(typeof l=="number"?l:parseInt(l,10)).toLocaleString("zh-CN",{hour12:!1})}async function B(){x.value=!0;try{const l=await $("project.list",{limit:500},"project list --limit 500 --json",1e4);b.value=Array.isArray(l?.projects)?l.projects:Array.isArray(l)?l:[]}catch(l){k.error("加载失败: "+(l.message||l)),b.value=[]}finally{x.value=!1}}function h(l){return{onClick:()=>K(l)}}async function K(l){r.value=l,U.value=!0,A.value=!0,P.value=[];try{const e=await $("project.listFiles",{projectId:l.id,limit:200},`project list-files ${l.id} --json`,8e3);P.value=Array.isArray(e?.files)?e.files:[]}catch{P.value=[]}finally{A.value=!1}}async function ee(l){try{(await $("project.delete",{id:l.id},`project delete ${l.id} --json`,8e3))?.ok?(k.success(`已删除项目 '${l.name}'`),U.value=!1,await B()):k.error("删除失败")}catch(e){k.error(e.message||String(e))}}function te(){d.value={name:"",description:"",type:"document",rootPath:""},L.value=!0}async function ae(){if(!d.value.name.trim()){k.warning("请输入项目名称");return}E.value=!0;try{const l=await $("project.init",{name:d.value.name.trim(),description:d.value.description||null,type:d.value.type,rootPath:d.value.rootPath||null},`project init "${d.value.name.trim()}" --type ${d.value.type} --json`,8e3);l?.id?(k.success(`已创建项目 '${l.name}'`),L.value=!1,await B()):k.error("创建失败")}catch(l){k.error(l.message||String(l))}finally{E.value=!1}}return we(()=>{B()}),(l,e)=>{const q=n("router-link"),w=n("a-button"),j=n("a-space"),m=n("a-statistic"),D=n("a-card"),N=n("a-col"),le=n("a-row"),O=n("a-radio-button"),oe=n("a-radio-group"),ne=n("a-input-search"),se=n("a-alert"),C=n("a-tag"),ue=n("a-popconfirm"),re=n("a-table"),c=n("a-descriptions-item"),ie=n("a-descriptions"),de=n("a-divider"),pe=n("a-empty"),ce=n("a-list-item"),fe=n("a-list"),ve=n("a-spin"),_e=n("a-drawer"),Q=n("a-input"),R=n("a-form-item"),me=n("a-textarea"),v=n("a-select-option"),ye=n("a-select"),ge=n("a-form"),ke=n("a-modal");return i(),y("div",null,[g("div",Ue,[g("div",null,[e[12]||(e[12]=g("h2",{class:"page-title"},"项目",-1)),g("p",Ae,[e[10]||(e[10]=o("桌面 / CLI / 手机 三端共享同一份项目数据,Phase 3d sync 自动同步 (",-1)),t(q,{to:"/project-init"},{default:a(()=>[...e[9]||(e[9]=[o("项目初始化 / 环境设置",-1)])]),_:1}),e[11]||(e[11]=o(")",-1))])]),t(j,null,{default:a(()=>[t(w,{loading:x.value,onClick:B},{icon:a(()=>[t(S(Se))]),default:a(()=>[e[13]||(e[13]=o(" 刷新 ",-1))]),_:1},8,["loading"]),t(w,{type:"primary",onClick:te},{icon:a(()=>[t(S(Pe))]),default:a(()=>[e[14]||(e[14]=o(" 新建项目 ",-1))]),_:1})]),_:1})]),t(le,{gutter:[16,16],style:{"margin-bottom":"20px"}},{default:a(()=>[t(N,{xs:12,sm:8,lg:6},{default:a(()=>[t(D,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[t(m,{title:"总项目",value:b.value.length,"value-style":{color:"#1677ff",fontSize:"20px"}},{prefix:a(()=>[t(S(Oe))]),_:1},8,["value"])]),_:1})]),_:1}),t(N,{xs:12,sm:8,lg:6},{default:a(()=>[t(D,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[t(m,{title:"活跃",value:T.value.active,"value-style":{color:"#52c41a",fontSize:"20px"}},{prefix:a(()=>[t(S($e))]),_:1},8,["value"])]),_:1})]),_:1}),t(N,{xs:12,sm:8,lg:6},{default:a(()=>[t(D,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[t(m,{title:"草稿",value:T.value.draft,"value-style":{color:"#8c8c8c",fontSize:"20px"}},{prefix:a(()=>[t(S(Fe))]),_:1},8,["value"])]),_:1})]),_:1}),t(N,{xs:12,sm:8,lg:6},{default:a(()=>[t(D,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[t(m,{title:"已完成",value:T.value.completed,"value-style":{color:"#13c2c2",fontSize:"20px"}},{prefix:a(()=>[t(S(Ie))]),_:1},8,["value"])]),_:1})]),_:1})]),_:1}),g("div",Le,[t(oe,{value:F.value,"onUpdate:value":e[0]||(e[0]=s=>F.value=s),size:"small","button-style":"solid"},{default:a(()=>[t(O,{value:""},{default:a(()=>[...e[15]||(e[15]=[o("全部",-1)])]),_:1}),t(O,{value:"active"},{default:a(()=>[...e[16]||(e[16]=[o("活跃",-1)])]),_:1}),t(O,{value:"draft"},{default:a(()=>[...e[17]||(e[17]=[o("草稿",-1)])]),_:1}),t(O,{value:"completed"},{default:a(()=>[...e[18]||(e[18]=[o("已完成",-1)])]),_:1}),t(O,{value:"archived"},{default:a(()=>[...e[19]||(e[19]=[o("已归档",-1)])]),_:1})]),_:1},8,["value"]),t(ne,{value:I.value,"onUpdate:value":e[1]||(e[1]=s=>I.value=s),placeholder:"按名称过滤",style:{"max-width":"260px"},"allow-clear":""},null,8,["value"])]),!b.value.length&&!x.value?(i(),_(se,{key:0,type:"info",message:"还没有项目",description:'运行 `cc project init <name>` 或点击右上角"新建项目"按钮创建。桌面 / CLI / 手机三端共享同一份数据。',"show-icon":"",style:{"margin-bottom":"16px"}})):z("",!0),b.value.length||x.value?(i(),_(re,{key:1,columns:Y,"data-source":Z.value,loading:x.value,pagination:{pageSize:20,showSizeChanger:!0},"row-key":"id","custom-row":h},{bodyCell:a(({column:s,record:p})=>[s.key==="id"?(i(),y("code",Be,u(p.id.slice(0,8))+"…",1)):s.key==="name"?(i(),y(H,{key:1},[g("strong",null,u(p.name),1),p.description?(i(),y("div",De,u(p.description),1)):z("",!0)],64)):s.key==="project_type"?(i(),_(C,{key:2},{default:a(()=>[o(u(p.project_type),1)]),_:2},1024)):s.key==="status"?(i(),_(C,{key:3,color:W(p.status)},{default:a(()=>[o(u(p.status),1)]),_:2},1032,["color"])):s.key==="sync_status"?(i(),_(C,{key:4,color:J(p.sync_status)},{default:a(()=>[o(u(p.sync_status||"unknown"),1)]),_:2},1032,["color"])):s.key==="updated_at"?(i(),y(H,{key:5},[o(u(V(p.updated_at)),1)],64)):s.key==="actions"?(i(),_(j,{key:6,onClick:e[2]||(e[2]=xe(()=>{},["stop"]))},{default:a(()=>[t(w,{size:"small",onClick:be=>K(p)},{default:a(()=>[...e[20]||(e[20]=[o("详情",-1)])]),_:1},8,["onClick"]),t(ue,{title:`删除项目 '${p.name}' ?`,"ok-text":"删除","ok-type":"danger","cancel-text":"取消",onConfirm:be=>ee(p)},{default:a(()=>[t(w,{size:"small",danger:""},{default:a(()=>[...e[21]||(e[21]=[o("删除",-1)])]),_:1})]),_:1},8,["title","onConfirm"])]),_:2},1024)):z("",!0)]),_:1},8,["data-source","loading"])):z("",!0),t(_e,{open:U.value,"onUpdate:open":e[3]||(e[3]=s=>U.value=s),title:r.value?.name||"项目详情",width:"640",placement:"right"},{default:a(()=>[r.value?(i(),_(ie,{key:0,column:1,bordered:"",size:"small"},{default:a(()=>[t(c,{label:"ID"},{default:a(()=>[g("code",null,u(r.value.id),1)]),_:1}),t(c,{label:"名称"},{default:a(()=>[o(u(r.value.name),1)]),_:1}),t(c,{label:"描述"},{default:a(()=>[o(u(r.value.description||"-"),1)]),_:1}),t(c,{label:"类型"},{default:a(()=>[t(C,null,{default:a(()=>[o(u(r.value.project_type),1)]),_:1})]),_:1}),t(c,{label:"状态"},{default:a(()=>[t(C,{color:W(r.value.status)},{default:a(()=>[o(u(r.value.status),1)]),_:1},8,["color"])]),_:1}),t(c,{label:"同步状态"},{default:a(()=>[t(C,{color:J(r.value.sync_status)},{default:a(()=>[o(u(r.value.sync_status||"unknown"),1)]),_:1},8,["color"])]),_:1}),t(c,{label:"用户"},{default:a(()=>[o(u(r.value.user_id),1)]),_:1}),t(c,{label:"根路径"},{default:a(()=>[r.value.root_path?(i(),y("code",Ne,u(r.value.root_path),1)):(i(),y("span",Re,"(无)"))]),_:1}),t(c,{label:"文件数"},{default:a(()=>[o(u(r.value.file_count||0),1)]),_:1}),t(c,{label:"创建"},{default:a(()=>[o(u(V(r.value.created_at)),1)]),_:1}),t(c,{label:"更新"},{default:a(()=>[o(u(V(r.value.updated_at)),1)]),_:1})]),_:1})):z("",!0),t(de,null,{default:a(()=>[...e[22]||(e[22]=[o("文件",-1)])]),_:1}),t(ve,{spinning:A.value},{default:a(()=>[!P.value.length&&!A.value?(i(),_(pe,{key:0,description:"无文件 (仅元数据项目)"})):(i(),_(fe,{key:1,size:"small","data-source":P.value},{renderItem:a(({item:s})=>[t(ce,null,{extra:a(()=>[s.file_size?(i(),y("span",Ee,u(s.file_size)+" B",1)):z("",!0)]),default:a(()=>[g("span",null,u(s.is_folder?"📁":"📄")+" "+u(s.file_path),1)]),_:2},1024)]),_:1},8,["data-source"]))]),_:1},8,["spinning"])]),_:1},8,["open","title"]),t(ke,{open:L.value,"onUpdate:open":e[8]||(e[8]=s=>L.value=s),title:"新建项目","confirm-loading":E.value,"ok-text":"创建","cancel-text":"取消",onOk:ae},{default:a(()=>[t(ge,{layout:"vertical"},{default:a(()=>[t(R,{label:"项目名称",required:""},{default:a(()=>[t(Q,{value:d.value.name,"onUpdate:value":e[4]||(e[4]=s=>d.value.name=s),placeholder:"例如:旅行计划-上海"},null,8,["value"])]),_:1}),t(R,{label:"描述"},{default:a(()=>[t(me,{value:d.value.description,"onUpdate:value":e[5]||(e[5]=s=>d.value.description=s),rows:2},null,8,["value"])]),_:1}),t(R,{label:"类型"},{default:a(()=>[t(ye,{value:d.value.type,"onUpdate:value":e[6]||(e[6]=s=>d.value.type=s)},{default:a(()=>[t(v,{value:"document"},{default:a(()=>[...e[23]||(e[23]=[o("文档 (document)",-1)])]),_:1}),t(v,{value:"data"},{default:a(()=>[...e[24]||(e[24]=[o("数据 (data)",-1)])]),_:1}),t(v,{value:"web"},{default:a(()=>[...e[25]||(e[25]=[o("Web",-1)])]),_:1}),t(v,{value:"app"},{default:a(()=>[...e[26]||(e[26]=[o("应用 (app)",-1)])]),_:1}),t(v,{value:"presentation"},{default:a(()=>[...e[27]||(e[27]=[o("演示文稿",-1)])]),_:1}),t(v,{value:"spreadsheet"},{default:a(()=>[...e[28]||(e[28]=[o("表格",-1)])]),_:1}),t(v,{value:"design"},{default:a(()=>[...e[29]||(e[29]=[o("设计",-1)])]),_:1}),t(v,{value:"code"},{default:a(()=>[...e[30]||(e[30]=[o("代码",-1)])]),_:1}),t(v,{value:"workflow"},{default:a(()=>[...e[31]||(e[31]=[o("工作流",-1)])]),_:1}),t(v,{value:"knowledge"},{default:a(()=>[...e[32]||(e[32]=[o("知识库",-1)])]),_:1})]),_:1},8,["value"])]),_:1}),t(R,{label:"根路径 (可选)"},{default:a(()=>[t(Q,{value:d.value.rootPath,"onUpdate:value":e[7]||(e[7]=s=>d.value.rootPath=s),placeholder:"留空则仅元数据"},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"])])}}},Ke=je(Te,[["__scopeId","data-v-597f34ed"]]);export{Ke as default};
@@ -1 +0,0 @@
1
- .page-title[data-v-597f34ed]{margin:0 0 4px;font-size:20px}.page-sub[data-v-597f34ed]{margin:0;color:#888;font-size:13px}
@@ -1 +0,0 @@
1
- import{p as z,e as S,f as $,$ as f,h as N}from"./index-BRWO_MUe.js";import{u as _,r as u}from"./responsiveObserve-BzzJzAds.js";import{u as E}from"./useFlexGapSupport-CCzODKgI.js";import{u as F,a as I}from"./index-BLDanIEV.js";import{d as M,o as T,e as V,c as D,r as h,f as o}from"./vendor-BVLz_z7V.js";const J=()=>({align:f([String,Object]),justify:f([String,Object]),prefixCls:String,gutter:f([Number,Array,Object],0),wrap:{type:Boolean,default:void 0}}),P=M({compatConfig:{MODE:3},name:"ARow",inheritAttrs:!1,props:J(),setup(s,G){let{slots:d,attrs:l}=G;const{prefixCls:a,direction:R}=z("row",s),[O,C]=F(a);let m;const v=_(),p=h({xs:!0,sm:!0,md:!0,lg:!0,xl:!0,xxl:!0}),y=h({xs:!1,sm:!1,md:!1,lg:!1,xl:!1,xxl:!1}),g=e=>o(()=>{if(typeof s[e]=="string")return s[e];if(typeof s[e]!="object")return"";for(let t=0;t<u.length;t++){const n=u[t];if(!y.value[n])continue;const r=s[e][n];if(r!==void 0)return r}return""}),b=g("align"),x=g("justify"),w=E();T(()=>{m=v.value.subscribe(e=>{y.value=e;const t=s.gutter||0;(!Array.isArray(t)&&typeof t=="object"||Array.isArray(t)&&(typeof t[0]=="object"||typeof t[1]=="object"))&&(p.value=e)})}),V(()=>{v.value.unsubscribe(m)});const A=o(()=>{const e=[void 0,void 0],{gutter:t=0}=s;return(Array.isArray(t)?t:[t,void 0]).forEach((r,j)=>{if(typeof r=="object")for(let i=0;i<u.length;i++){const c=u[i];if(p.value[c]&&r[c]!==void 0){e[j]=r[c];break}}else e[j]=r}),e});I({gutter:A,supportFlexGap:w,wrap:o(()=>s.wrap)});const k=o(()=>N(a.value,{[`${a.value}-no-wrap`]:s.wrap===!1,[`${a.value}-${x.value}`]:x.value,[`${a.value}-${b.value}`]:b.value,[`${a.value}-rtl`]:R.value==="rtl"},l.class,C.value)),B=o(()=>{const e=A.value,t={},n=e[0]!=null&&e[0]>0?`${e[0]/-2}px`:void 0,r=e[1]!=null&&e[1]>0?`${e[1]/-2}px`:void 0;return n&&(t.marginLeft=n,t.marginRight=n),w.value?t.rowGap=`${e[1]}px`:r&&(t.marginTop=r,t.marginBottom=r),t});return()=>{var e;return O(D("div",S(S({},l),{},{class:k.value,style:$($({},B.value),l.style)}),[(e=d.default)===null||e===void 0?void 0:e.call(d)]))}}});export{P as A};
@@ -1 +0,0 @@
1
- import{C as o}from"./Col-C5SJSGcO.js";import{R as t}from"./index-BRWO_MUe.js";import"./index-BLDanIEV.js";import"./vendor-BVLz_z7V.js";import"./icons-Q99MnhG8.js";const s=t(o);export{s as default};
@@ -1 +0,0 @@
1
- import{k as j,m as M,f as p,r as O,p as U,e as y,F as A,ac as $,a4 as B,U as P,$ as N}from"./index-BRWO_MUe.js";import{i as R}from"./initDefaultProps-C5tyEoyp.js";import{c as m,d as _,o as L,q as V,e as X,r as D}from"./vendor-BVLz_z7V.js";import{S as q}from"./Skeleton-xBd6cpeg.js";import{o as Y}from"./omit-DYc7DRhT.js";import"./icons-Q99MnhG8.js";const k=t=>{const{value:n,formatter:e,precision:a,decimalSeparator:s,groupSeparator:u="",prefixCls:r}=t;let c;if(typeof e=="function")c=e({value:n});else{const i=String(n),f=i.match(/^(-?)(\d*)(\.(\d+))?$/);if(!f)c=i;else{const d=f[1];let o=f[2]||"0",l=f[4]||"";o=o.replace(/\B(?=(\d{3})+(?!\d))/g,u),typeof a=="number"&&(l=l.padEnd(a,"0").slice(0,a>0?a:0)),l&&(l=`${s}${l}`),c=[m("span",{key:"int",class:`${r}-content-value-int`},[d,o]),l&&m("span",{key:"decimal",class:`${r}-content-value-decimal`},[l])]}}return m("span",{class:`${r}-content-value`},[c])};k.displayName="StatisticNumber";const G=t=>{const{componentCls:n,marginXXS:e,padding:a,colorTextDescription:s,statisticTitleFontSize:u,colorTextHeading:r,statisticContentFontSize:c,statisticFontFamily:i}=t;return{[`${n}`]:p(p({},O(t)),{[`${n}-title`]:{marginBottom:e,color:s,fontSize:u},[`${n}-skeleton`]:{paddingTop:a},[`${n}-content`]:{color:r,fontSize:c,fontFamily:i,[`${n}-content-value`]:{display:"inline-block",direction:"ltr"},[`${n}-content-prefix, ${n}-content-suffix`]:{display:"inline-block"},[`${n}-content-prefix`]:{marginInlineEnd:e},[`${n}-content-suffix`]:{marginInlineStart:e}}})}},J=j("Statistic",t=>{const{fontSizeHeading3:n,fontSize:e,fontFamily:a}=t,s=M(t,{statisticTitleFontSize:e,statisticContentFontSize:n,statisticFontFamily:a});return[G(s)]}),z=()=>({prefixCls:String,decimalSeparator:String,groupSeparator:String,format:String,value:N([Number,String,Object]),valueStyle:{type:Object,default:void 0},valueRender:P(),formatter:B(),precision:Number,prefix:$(),suffix:$(),title:$(),loading:A()}),v=_({compatConfig:{MODE:3},name:"AStatistic",inheritAttrs:!1,props:R(z(),{decimalSeparator:".",groupSeparator:",",loading:!1}),slots:Object,setup(t,n){let{slots:e,attrs:a}=n;const{prefixCls:s,direction:u}=U("statistic",t),[r,c]=J(s);return()=>{var i,f,d,o,l,g,S;const{value:E=0,valueStyle:H,valueRender:T}=t,x=s.value,h=(i=t.title)!==null&&i!==void 0?i:(f=e.title)===null||f===void 0?void 0:f.call(e),F=(d=t.prefix)!==null&&d!==void 0?d:(o=e.prefix)===null||o===void 0?void 0:o.call(e),b=(l=t.suffix)!==null&&l!==void 0?l:(g=e.suffix)===null||g===void 0?void 0:g.call(e),I=(S=t.formatter)!==null&&S!==void 0?S:e.formatter;let C=m(k,y({"data-for-update":Date.now()},p(p({},t),{prefixCls:x,value:E,formatter:I})),null);return T&&(C=T(C)),r(m("div",y(y({},a),{},{class:[x,{[`${x}-rtl`]:u.value==="rtl"},a.class,c.value]}),[h&&m("div",{class:`${x}-title`},[h]),m(q,{paragraph:!1,loading:t.loading},{default:()=>[m("div",{style:H,class:`${x}-content`},[F&&m("span",{class:`${x}-content-prefix`},[F]),C,b&&m("span",{class:`${x}-content-suffix`},[b])])]})]))}}}),K=[["Y",1e3*60*60*24*365],["M",1e3*60*60*24*30],["D",1e3*60*60*24],["H",1e3*60*60],["m",1e3*60],["s",1e3],["S",1]];function Q(t,n){let e=t;const a=/\[[^\]]*]/g,s=(n.match(a)||[]).map(i=>i.slice(1,-1)),u=n.replace(a,"[]"),r=K.reduce((i,f)=>{let[d,o]=f;if(i.includes(d)){const l=Math.floor(e/o);return e-=l*o,i.replace(new RegExp(`${d}+`,"g"),g=>{const S=g.length;return l.toString().padStart(S,"0")})}return i},u);let c=0;return r.replace(a,()=>{const i=s[c];return c+=1,i})}function W(t,n){const{format:e=""}=n,a=new Date(t).getTime(),s=Date.now(),u=Math.max(a-s,0);return Q(u,e)}const Z=1e3/30;function w(t){return new Date(t).getTime()}const tt=()=>p(p({},z()),{value:N([Number,String,Object]),format:String,onFinish:Function,onChange:Function}),et=_({compatConfig:{MODE:3},name:"AStatisticCountdown",props:R(tt(),{format:"HH:mm:ss"}),setup(t,n){let{emit:e,slots:a}=n;const s=D(),u=D(),r=()=>{const{value:o}=t;w(o)>=Date.now()?c():i()},c=()=>{if(s.value)return;const o=w(t.value);s.value=setInterval(()=>{u.value.$forceUpdate(),o>Date.now()&&e("change",o-Date.now()),r()},Z)},i=()=>{const{value:o}=t;s.value&&(clearInterval(s.value),s.value=void 0,w(o)<Date.now()&&e("finish"))},f=o=>{let{value:l,config:g}=o;const{format:S}=t;return W(l,p(p({},g),{format:S}))},d=o=>o;return L(()=>{r()}),V(()=>{r()}),X(()=>{i()}),()=>{const o=t.value;return m(v,y({ref:u},p(p({},Y(t,["onFinish","onChange"])),{value:o,valueRender:d,formatter:f})),a)}}});v.Countdown=et;v.install=function(t){return t.component(v.name,v),t.component(v.Countdown.name,v.Countdown),t};const rt=v.Countdown;export{rt as StatisticCountdown,v as default};