chainlesschain 0.162.1 → 0.162.3

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 (156) hide show
  1. package/package.json +2 -1
  2. package/src/assets/web-panel/.build-hash +1 -1
  3. package/src/assets/web-panel/assets/{AIOps-5A54O3wF.js → AIOps-BHcJlF4M.js} +1 -1
  4. package/src/assets/web-panel/assets/{ActionButton-epuY2GkZ.js → ActionButton-QNqNYP_E.js} +1 -1
  5. package/src/assets/web-panel/assets/{Analytics-CIdxw7T5.js → Analytics-DWrmU2MM.js} +2 -2
  6. package/src/assets/web-panel/assets/AppLayout-0BXhjvFX.js +3 -0
  7. package/src/assets/web-panel/assets/{AppLayout-DBgtkmP7.css → AppLayout-BLCe1k8m.css} +1 -1
  8. package/src/assets/web-panel/assets/{Audit-D95nRcdZ.js → Audit-Cns_OJ3y.js} +1 -1
  9. package/src/assets/web-panel/assets/{Backup-Cmw7ZTJD.js → Backup-BWXKm8S2.js} +1 -1
  10. package/src/assets/web-panel/assets/{BaseInput-DgCEAL_E.js → BaseInput-DMtM90I4.js} +1 -1
  11. package/src/assets/web-panel/assets/{Chat-DAQAzZsA.js → Chat-CPSQIJkd.js} +1 -1
  12. package/src/assets/web-panel/assets/{Checkbox-GRxUANnE.js → Checkbox-CdoTzEcu.js} +1 -1
  13. package/src/assets/web-panel/assets/{Codegen--6KIDt1W.js → Codegen-DiMm-2CJ.js} +1 -1
  14. package/src/assets/web-panel/assets/{Col-3s6dxuMx.js → Col-Dw8uRsh8.js} +1 -1
  15. package/src/assets/web-panel/assets/{Community-D60pkEBz.js → Community-DF6oPrrt.js} +1 -1
  16. package/src/assets/web-panel/assets/{Compact-CQR4QsWP.js → Compact-DDeBOvFc.js} +1 -1
  17. package/src/assets/web-panel/assets/Compliance-cpcX8foc.js +1 -0
  18. package/src/assets/web-panel/assets/{Cowork-Yrrf_Vuu.js → Cowork-BnF4dCvO.js} +3 -3
  19. package/src/assets/web-panel/assets/{Cron-DSuuSKIQ.js → Cron-CNm5yzGt.js} +2 -2
  20. package/src/assets/web-panel/assets/{Crosschain-Dub0G9i4.js → Crosschain-1fdaoWnO.js} +1 -1
  21. package/src/assets/web-panel/assets/{DID-CbpCGV51.js → DID-CgWgrQjr.js} +2 -2
  22. package/src/assets/web-panel/assets/{Dashboard-D29e0y01.js → Dashboard-dGcTq_hg.js} +2 -2
  23. package/src/assets/web-panel/assets/{Dropdown-DZY7X5v2.js → Dropdown-CMcWp2f1.js} +1 -1
  24. package/src/assets/web-panel/assets/{Federation-dmrLzzMB.js → Federation-BVmtVOzD.js} +1 -1
  25. package/src/assets/web-panel/assets/{FormItemContext-EopsCGez.js → FormItemContext-BTuMR6zf.js} +1 -1
  26. package/src/assets/web-panel/assets/{Git-D3mb4RhK.js → Git-2itzzOWU.js} +2 -2
  27. package/src/assets/web-panel/assets/{Governance-8v034-Nr.js → Governance-BD5nFtjx.js} +1 -1
  28. package/src/assets/web-panel/assets/{Inference-Ddl-HQwQ.js → Inference-BqTjotuw.js} +1 -1
  29. package/src/assets/web-panel/assets/KnowledgeGraph-CkJCUp_X.js +1 -0
  30. package/src/assets/web-panel/assets/{Logs-Bsu6lYQe.js → Logs-BezIQuu3.js} +1 -1
  31. package/src/assets/web-panel/assets/{Marketplace-Iyf2Xc23.js → Marketplace-BQi8NC94.js} +1 -1
  32. package/src/assets/web-panel/assets/{McpTools-ljVE1lIN.js → McpTools-UDm4tI8g.js} +1 -1
  33. package/src/assets/web-panel/assets/{Memory-Ca48TtDU.js → Memory-b3k3SJXP.js} +2 -2
  34. package/src/assets/web-panel/assets/{MobileBridge-DZ3Ar6da.js → MobileBridge-CHysUGzj.js} +1 -1
  35. package/src/assets/web-panel/assets/MobileProjects-Ceaxrqzc.css +1 -0
  36. package/src/assets/web-panel/assets/MobileProjects-H5DjqNIw.js +1 -0
  37. package/src/assets/web-panel/assets/{Mtc-CRjBnVAT.js → Mtc-B-kn2cbZ.js} +4 -4
  38. package/src/assets/web-panel/assets/{MtcAudit-CEC2eKez.js → MtcAudit-BSeDGJAO.js} +1 -1
  39. package/src/assets/web-panel/assets/{Multisig-BHoQvNeL.js → Multisig-BSwWbNCn.js} +2 -2
  40. package/src/assets/web-panel/assets/{NLProgramming-9e5hIFvL.js → NLProgramming-B7fTKT9-.js} +1 -1
  41. package/src/assets/web-panel/assets/{Notes-BEhZRadw.js → Notes-CE7Dxyik.js} +3 -3
  42. package/src/assets/web-panel/assets/{NotificationSettings-CzPbT9UE.js → NotificationSettings-BrWPb12X.js} +1 -1
  43. package/src/assets/web-panel/assets/{Organization-CvFg4VAr.js → Organization-BvMcmpZ-.js} +4 -4
  44. package/src/assets/web-panel/assets/{Overflow-Cm7ISeJl.js → Overflow-9VpUiyX3.js} +1 -1
  45. package/src/assets/web-panel/assets/{P2P-BWN-wdfH.js → P2P-CZiZLuH6.js} +2 -2
  46. package/src/assets/web-panel/assets/{Permissions-C4vKkP_t.js → Permissions-7xPYU8o3.js} +4 -4
  47. package/src/assets/web-panel/assets/PersonalDataHub-BoAsj3rP.js +1 -0
  48. package/src/assets/web-panel/assets/PersonalDataHub-C5HcGC5x.css +1 -0
  49. package/src/assets/web-panel/assets/{Pipeline-DQCShDeT.js → Pipeline-BXmWkBtJ.js} +1 -1
  50. package/src/assets/web-panel/assets/{Privacy-Nc7LlSr3.js → Privacy-Bowi-wqF.js} +1 -1
  51. package/src/assets/web-panel/assets/{ProjectInit-DDkqXAED.js → ProjectInit-BW1Xj7_l.js} +2 -2
  52. package/src/assets/web-panel/assets/{ProjectSettings-ia6GQr6A.js → ProjectSettings-pDbBvJFG.js} +1 -1
  53. package/src/assets/web-panel/assets/Projects-BX-SG9R4.css +1 -0
  54. package/src/assets/web-panel/assets/Projects-D32hRs2K.js +1 -0
  55. package/src/assets/web-panel/assets/{Providers-EwarbUb8.js → Providers-fvnKRdFc.js} +1 -1
  56. package/src/assets/web-panel/assets/{QuickAsk-BAHQBw0d.js → QuickAsk-DBZrimTb.js} +1 -1
  57. package/src/assets/web-panel/assets/Recommend-B_leuPdE.js +1 -0
  58. package/src/assets/web-panel/assets/{Reputation-ai0gRNpj.js → Reputation-9YJu2Q0s.js} +1 -1
  59. package/src/assets/web-panel/assets/{Row-BWLfAhHC.js → Row-BwDaJw-R.js} +1 -1
  60. package/src/assets/web-panel/assets/{RssFeed-CnuRtiQH.js → RssFeed-CCwGtGbs.js} +3 -3
  61. package/src/assets/web-panel/assets/{Search-Da0CvI_2.js → Search-CLdXqpfz.js} +1 -1
  62. package/src/assets/web-panel/assets/{Security-DEFeOeUv.js → Security-_It0GsWS.js} +3 -3
  63. package/src/assets/web-panel/assets/Services-jBxBWGGT.js +2 -0
  64. package/src/assets/web-panel/assets/{Skeleton-DlRaGj_n.js → Skeleton-DR_EuFFW.js} +1 -1
  65. package/src/assets/web-panel/assets/{Skills-fjlZrsYq.js → Skills-DsHcMNEk.js} +1 -1
  66. package/src/assets/web-panel/assets/{Sla-DNSDuEt2.js → Sla-Be0UaX-h.js} +1 -1
  67. package/src/assets/web-panel/assets/{SpeechSettings-Bj0t-JCf.js → SpeechSettings-uUhDyyHj.js} +1 -1
  68. package/src/assets/web-panel/assets/{SyncSettings-uO7Gy-BB.js → SyncSettings-CUAwaSnj.js} +1 -1
  69. package/src/assets/web-panel/assets/{Tasks-BSjsO-m8.js → Tasks-CUVZww9Q.js} +1 -1
  70. package/src/assets/web-panel/assets/{Templates-B03SSuXn.js → Templates-WLZcNzJ_.js} +1 -1
  71. package/src/assets/web-panel/assets/{Tenant-CTCPIBzq.js → Tenant-FgN0uYm6.js} +1 -1
  72. package/src/assets/web-panel/assets/Terminal-BzLHjHyj.js +3 -0
  73. package/src/assets/web-panel/assets/Tokens-z7lyRr40.js +1 -0
  74. package/src/assets/web-panel/assets/{Trigger-kYPQmm6P.js → Trigger-HxLdC9ne.js} +1 -1
  75. package/src/assets/web-panel/assets/{Trust-mt-MiBeI.js → Trust-DggmMxpI.js} +1 -1
  76. package/src/assets/web-panel/assets/{UkeySign-DBi8jgXw.js → UkeySign-BO-pKTZ_.js} +1 -1
  77. package/src/assets/web-panel/assets/{VideoEditing-CINSMEf5.js → VideoEditing-DdLdJ9Ps.js} +1 -1
  78. package/src/assets/web-panel/assets/{Wallet-DCVMgW0U.js → Wallet-F8EfdQDN.js} +4 -4
  79. package/src/assets/web-panel/assets/{WebAuthn-C9OjbTBs.js → WebAuthn-Bi2Kf8Ev.js} +5 -5
  80. package/src/assets/web-panel/assets/{WorkflowEditor-LM1HJs-S.js → WorkflowEditor-DUHk4Y0A.js} +1 -1
  81. package/src/assets/web-panel/assets/{chat-Dz68Ixdp.js → chat-BMz8ik6R.js} +1 -1
  82. package/src/assets/web-panel/assets/{colors-qf63Eax9.js → colors-DTTx1bVY.js} +1 -1
  83. package/src/assets/web-panel/assets/{compact-item-r4YWRFGQ.js → compact-item-BjZyyKpa.js} +1 -1
  84. package/src/assets/web-panel/assets/{createContext-C8Lwrn-C.js → createContext-D0Ztn7R_.js} +1 -1
  85. package/src/assets/web-panel/assets/{hasIn-DsPi2kPP.js → hasIn-BeXm1bJ2.js} +1 -1
  86. package/src/assets/web-panel/assets/{icons-NT6gy8Ee.js → icons-BFHq5fEF.js} +4 -4
  87. package/src/assets/web-panel/assets/{index-C8SY0_S8.js → index-BDRzvi5v.js} +1 -1
  88. package/src/assets/web-panel/assets/{index-BfdIkZnT.js → index-BDmMBKM_.js} +1 -1
  89. package/src/assets/web-panel/assets/{index-BxNXO95B.js → index-BHuIMHcS.js} +1 -1
  90. package/src/assets/web-panel/assets/{index-C2OFaKmx.js → index-BODKOjRZ.js} +1 -1
  91. package/src/assets/web-panel/assets/{index-Bz1O2KhE.js → index-BUFpZk0I.js} +1 -1
  92. package/src/assets/web-panel/assets/{index-qcVx0s-M.js → index-BWRsbH6v.js} +1 -1
  93. package/src/assets/web-panel/assets/{index-CEbbycgJ.js → index-B_juAGfN.js} +4 -4
  94. package/src/assets/web-panel/assets/{index-B8gs4g1v.js → index-BiAjZ9Iq.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-DGXVjiyF.js → index-BxIq_rps.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-CSCb-EY9.js → index-By4zsU8r.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-BFV6aAoX.js → index-C6Isxhje.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-1xqIvVM5.js → index-CGudWWwE.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-C3VVwJcn.js → index-CobyvwP0.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-cTFVNgoS.js → index-CqkwXe3s.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-BtCSUUKm.js → index-CuDNPqlD.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-Cw48kkkH.js → index-D-niPBwZ.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-BzzFMBIM.js → index-D1CV-6q1.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-B0KxtBNy.js → index-D1coHqyT.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-CY5X4uXO.js → index-DB1i3Cfr.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-D2BR3WQ-.js → index-DIoinlAY.js} +1 -1
  107. package/src/assets/web-panel/assets/index-DJOgV0SI.js +1 -0
  108. package/src/assets/web-panel/assets/{index-BKEl9Ahm.js → index-DLDHcuz4.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-CqmyLTa_.js → index-DLJnAsec.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-D4XgKgOF.js → index-DMvkBq2d.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-LQYz2tRO.js → index-DRNxWV3i.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-BjPHuhxG.js → index-DTzwBmBS.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-CINVudo7.js → index-DXSXIknb.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-DycrmZ_r.js → index-Da_XUjv2.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-CKRXnUTD.js → index-DfxUN2LB.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-DBpVVgRI.js → index-DnATlZR7.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-D0mFFS7Y.js → index-Dx7XPVkb.js} +1 -1
  118. package/src/assets/web-panel/assets/index-FpewH8xy.js +1 -0
  119. package/src/assets/web-panel/assets/{index-qLyVEtRM.js → index-JTN4jzka.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-CCCX2ZSH.js → index-NppMuZBM.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-DQSweK5-.js → index-OjH2wDtW.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-5nOMJaLt.js → index-aBdRRXWO.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-DXBc_lyR.js → index-nwkYgoRS.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-wVpfPJXE.js → index-tUIluCPu.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-I55BAmVG.js → index-xN0WCVmC.js} +1 -1
  126. package/src/assets/web-panel/assets/{initDefaultProps-CAgx2aHm.js → initDefaultProps-DE_gVS_i.js} +1 -1
  127. package/src/assets/web-panel/assets/{motion-DFuREFOd.js → motion-BiRUGscQ.js} +1 -1
  128. package/src/assets/web-panel/assets/{move-DfcQIXuy.js → move-DMEzVMJZ.js} +1 -1
  129. package/src/assets/web-panel/assets/{omit-BFZV2hmZ.js → omit-DBh74Ui4.js} +1 -1
  130. package/src/assets/web-panel/assets/{pickAttrs-D98WQSur.js → pickAttrs-D6PQbWuo.js} +1 -1
  131. package/src/assets/web-panel/assets/{placementArrow-BlP2AN9q.js → placementArrow-BYkdt9jF.js} +1 -1
  132. package/src/assets/web-panel/assets/{responsiveObserve-DuI2xGQd.js → responsiveObserve-C2ES6P0V.js} +1 -1
  133. package/src/assets/web-panel/assets/{slide-DSvqah_S.js → slide-zGdjevxe.js} +1 -1
  134. package/src/assets/web-panel/assets/{statusUtils-B-96ZLWF.js → statusUtils-Cf6eRpR7.js} +1 -1
  135. package/src/assets/web-panel/assets/{styleChecker-Br0YrCOO.js → styleChecker-DZZx_bHs.js} +1 -1
  136. package/src/assets/web-panel/assets/{useFlexGapSupport-BD4Xr9XU.js → useFlexGapSupport-B6q6zt9X.js} +1 -1
  137. package/src/assets/web-panel/assets/{useFs-Ch5L3BnA.js → useFs-DjaBUk_P.js} +1 -1
  138. package/src/assets/web-panel/assets/{vnode-BQi3uWRC.js → vnode-CDF4X084.js} +1 -1
  139. package/src/assets/web-panel/assets/{zoom-DaW-jbu7.js → zoom-C9FCvBpV.js} +1 -1
  140. package/src/assets/web-panel/index.html +2 -2
  141. package/src/commands/ui.js +21 -3
  142. package/src/gateways/ws/message-dispatcher.js +34 -0
  143. package/src/gateways/ws/personal-data-hub-protocol.js +133 -0
  144. package/src/lib/personal-data-hub-wiring.js +310 -0
  145. package/src/runtime/agent-runtime.js +85 -11
  146. package/src/assets/web-panel/assets/AppLayout-xR6YUHsS.js +0 -3
  147. package/src/assets/web-panel/assets/Compliance-KySNEhMK.js +0 -1
  148. package/src/assets/web-panel/assets/KnowledgeGraph-DrRruyud.js +0 -1
  149. package/src/assets/web-panel/assets/Projects-0OrfK90x.css +0 -1
  150. package/src/assets/web-panel/assets/Projects-CNqXa5XY.js +0 -1
  151. package/src/assets/web-panel/assets/Recommend-Ccgu6elV.js +0 -1
  152. package/src/assets/web-panel/assets/Services-CsfvCqCH.js +0 -2
  153. package/src/assets/web-panel/assets/Terminal-CQZcdArx.js +0 -3
  154. package/src/assets/web-panel/assets/Tokens-CsNJIdNl.js +0 -1
  155. package/src/assets/web-panel/assets/index-B3blziag.js +0 -1
  156. package/src/assets/web-panel/assets/index-D1XYuPHf.js +0 -1
@@ -0,0 +1,310 @@
1
+ /**
2
+ * Personal Data Hub — CLI / web-shell wiring.
3
+ *
4
+ * Mirror of desktop-app-vue/src/main/personal-data-hub/wiring.js so the
5
+ * SAME vault is reachable from both the Electron app's IPC channels AND
6
+ * the `cc ui` / `cc serve` web-shell's WS topics. Per memory
7
+ * feedback_cross_shell_feature_pattern: any new feature must be reachable
8
+ * via both gateways or the SPA's behavior diverges across shells.
9
+ *
10
+ * Shared vault path: getElectronUserDataDir() + "/.chainlesschain/hub/"
11
+ * — resolves to the same directory that the Electron app uses, so opening
12
+ * either shell sees the same data. Only ONE process should hold the vault
13
+ * at a time (SQLite WAL allows multi-reader / single-writer, but for v0
14
+ * we assume serial access — Phase 4 will add a file-lock).
15
+ *
16
+ * LLM wiring: cli has no llm-manager singleton — it relies on
17
+ * lib/llm-providers.js + per-command HTTP calls. v0 cli-side hub uses a
18
+ * direct OllamaClient (the hub's standalone fallback). To use the same
19
+ * provider the desktop app uses (Volcengine etc.), pass a custom chat
20
+ * function via the env var CC_HUB_LLM_BASE (Ollama URL) or wire it later
21
+ * when cli ↔ desktop LLM sharing is figured out.
22
+ *
23
+ * KG / RAG wiring: same cli modules the desktop uses via dynamic import —
24
+ * but here we're already in cli, so direct import works.
25
+ */
26
+
27
+ import { join } from "node:path";
28
+ import { mkdirSync } from "node:fs";
29
+ // Hub package is CJS; in ESM we default-import then destructure (Node 22
30
+ // won't let us name-import a CJS module unless it ships a separate ESM
31
+ // shim, which we don't).
32
+ import hub from "@chainlesschain/personal-data-hub";
33
+ const {
34
+ LocalVault,
35
+ AdapterRegistry,
36
+ AnalysisEngine,
37
+ MockAdapter,
38
+ OllamaClient,
39
+ CcKgSink,
40
+ CcRagSink,
41
+ FileKeyProvider,
42
+ generateKeyHex,
43
+ EmailAdapter,
44
+ } = hub;
45
+ import { readFileSync, writeFileSync, existsSync } from "node:fs";
46
+ import { getElectronUserDataDir } from "./paths.js";
47
+
48
+ // ─── Lazy ESM imports of cli KG / BM25 ───────────────────────────────────
49
+
50
+ let _kgMod = null;
51
+ async function loadKg() {
52
+ if (_kgMod) return _kgMod;
53
+ try {
54
+ _kgMod = await import("./knowledge-graph.js");
55
+ } catch (_err) {
56
+ _kgMod = null;
57
+ }
58
+ return _kgMod;
59
+ }
60
+
61
+ let _bm25Mod = null;
62
+ async function loadBm25() {
63
+ if (_bm25Mod) return _bm25Mod;
64
+ try {
65
+ _bm25Mod = await import("./bm25-search.js");
66
+ } catch (_err) {
67
+ _bm25Mod = null;
68
+ }
69
+ return _bm25Mod;
70
+ }
71
+
72
+ // ─── Hub singleton (CLI process scope) ───────────────────────────────────
73
+
74
+ let _hub = null;
75
+ let _initPromise = null;
76
+ let _bm25 = null;
77
+
78
+ export function resolveHubDir() {
79
+ return join(getElectronUserDataDir(), ".chainlesschain", "hub");
80
+ }
81
+
82
+ async function initHub() {
83
+ const hubDir = resolveHubDir();
84
+ mkdirSync(hubDir, { recursive: true });
85
+ mkdirSync(join(hubDir, "keys"), { recursive: true });
86
+
87
+ const keyProvider = new FileKeyProvider(join(hubDir, "keys"));
88
+ const KEY_NAME = "vault:default";
89
+ let key = await keyProvider.get(KEY_NAME);
90
+ if (!key) {
91
+ key = generateKeyHex();
92
+ await keyProvider.set(KEY_NAME, key);
93
+ }
94
+
95
+ const vault = new LocalVault({ path: join(hubDir, "vault.db"), key });
96
+ vault.open();
97
+
98
+ // LLM: standalone OllamaClient — connects to localhost:11434.
99
+ // Override via env CC_HUB_OLLAMA_URL / CC_HUB_OLLAMA_MODEL.
100
+ const llm = new OllamaClient({
101
+ baseUrl: process.env.CC_HUB_OLLAMA_URL || "http://localhost:11434",
102
+ model: process.env.CC_HUB_OLLAMA_MODEL || "qwen2.5:7b-instruct",
103
+ });
104
+
105
+ // KG sink — direct ESM import works here.
106
+ let kgSink = null;
107
+ const kgMod = await loadKg();
108
+ if (
109
+ kgMod &&
110
+ typeof kgMod.addEntity === "function" &&
111
+ typeof kgMod.addRelation === "function"
112
+ ) {
113
+ kgSink = new CcKgSink({
114
+ addEntity: kgMod.addEntity,
115
+ addRelation: kgMod.addRelation,
116
+ db: null,
117
+ });
118
+ }
119
+
120
+ // RAG sink — instantiate a BM25 per hub.
121
+ let ragSink = null;
122
+ const bm25Mod = await loadBm25();
123
+ if (bm25Mod && typeof bm25Mod.BM25Search === "function") {
124
+ _bm25 = new bm25Mod.BM25Search({ language: "auto" });
125
+ ragSink = new CcRagSink({ bm25: _bm25 });
126
+ }
127
+
128
+ const registry = new AdapterRegistry({
129
+ vault,
130
+ kgSink: kgSink ? kgSink.write.bind(kgSink) : null,
131
+ ragSink: ragSink ? ragSink.write.bind(ragSink) : null,
132
+ });
133
+
134
+ const engine = new AnalysisEngine({
135
+ vault,
136
+ llm,
137
+ ragRetriever: _bm25
138
+ ? async (question) => {
139
+ try {
140
+ const hits = _bm25.search(question, { topK: 10 });
141
+ return Array.isArray(hits)
142
+ ? hits
143
+ .map((h) => ({
144
+ id: h.id || (h.doc && h.doc.id),
145
+ text: "",
146
+ metadata: {},
147
+ }))
148
+ .filter((d) => d.id)
149
+ : [];
150
+ } catch (_e) {
151
+ return [];
152
+ }
153
+ }
154
+ : null,
155
+ });
156
+
157
+ // Phase 5.6: auto-register persisted email accounts.
158
+ const emailAccountsPath = join(hubDir, "email-accounts.json");
159
+ const emailAccounts = loadEmailAccounts(emailAccountsPath);
160
+ for (const cfg of emailAccounts) {
161
+ try {
162
+ const adapter = new EmailAdapter({
163
+ account: cfg.account,
164
+ ...(cfg.opts || {}),
165
+ });
166
+ registry.register(adapter);
167
+ } catch (_err) {
168
+ // Continue boot even if one config is corrupt
169
+ }
170
+ }
171
+
172
+ return {
173
+ vault,
174
+ registry,
175
+ engine,
176
+ llm,
177
+ kgSink,
178
+ ragSink,
179
+ hubDir,
180
+ keyProvider,
181
+ emailAccountsPath,
182
+ bm25: _bm25,
183
+ registerMockAdapter(opts = {}) {
184
+ if (registry.has(opts.name || "mock"))
185
+ return registry.get(opts.name || "mock");
186
+ const adapter = new MockAdapter(opts);
187
+ registry.register(adapter);
188
+ return adapter;
189
+ },
190
+
191
+ /** Phase 5.6 — see desktop wiring for full doc */
192
+ async testEmailAuth({ account }) {
193
+ if (!account || typeof account !== "object")
194
+ throw new Error("account required");
195
+ const adapter = new EmailAdapter({ account });
196
+ return await adapter.authenticate();
197
+ },
198
+
199
+ async registerEmailAdapter({ account, opts = {} } = {}) {
200
+ if (!account || typeof account !== "object")
201
+ throw new Error("account required");
202
+ const adapter = new EmailAdapter({ account, ...opts });
203
+ if (registry.has(adapter.name)) {
204
+ throw new Error(`adapter name "${adapter.name}" already registered`);
205
+ }
206
+ registry.register(adapter);
207
+ const accounts = loadEmailAccounts(emailAccountsPath);
208
+ const next = accounts.filter((c) => c.account.email !== account.email);
209
+ next.push({ account, opts, registeredAt: Date.now() });
210
+ saveEmailAccounts(emailAccountsPath, next);
211
+ return {
212
+ name: adapter.name,
213
+ version: adapter.version,
214
+ capabilities: adapter.capabilities,
215
+ sensitivity: adapter.dataDisclosure.sensitivity,
216
+ };
217
+ },
218
+
219
+ async unregisterEmailAdapter(emailAddress) {
220
+ const accounts = loadEmailAccounts(emailAccountsPath);
221
+ const target = accounts.find((c) => c.account.email === emailAddress);
222
+ const next = accounts.filter((c) => c.account.email !== emailAddress);
223
+ saveEmailAccounts(emailAccountsPath, next);
224
+ if (target) registry.unregister("email-imap");
225
+ return { ok: true, removed: !!target };
226
+ },
227
+
228
+ listEmailAccounts() {
229
+ return loadEmailAccounts(emailAccountsPath).map((c) => ({
230
+ email: c.account.email,
231
+ provider: c.account.provider,
232
+ folders: c.account.folders || null,
233
+ registeredAt: c.registeredAt || null,
234
+ pdfPasswordHints:
235
+ c.opts && c.opts.pdfPasswordHints
236
+ ? Object.keys(c.opts.pdfPasswordHints)
237
+ : [],
238
+ }));
239
+ },
240
+
241
+ eventDetail(eventId) {
242
+ const ev = vault.getEvent ? vault.getEvent(eventId) : null;
243
+ if (!ev) return null;
244
+ return {
245
+ event: ev,
246
+ classification:
247
+ ev.extra && ev.extra.classification ? ev.extra.classification : null,
248
+ extraction:
249
+ ev.extra && ev.extra.fields
250
+ ? {
251
+ template: ev.extra.extractionTemplate,
252
+ confidence: ev.extra.extractionConfidence,
253
+ fields: ev.extra.fields,
254
+ warnings: ev.extra.extractionWarnings || [],
255
+ pdfExtraction: ev.extra.pdfExtraction || null,
256
+ }
257
+ : null,
258
+ };
259
+ },
260
+ };
261
+ }
262
+
263
+ // ─── Email account persistence (Phase 5.6) ───────────────────────────────
264
+
265
+ function loadEmailAccounts(filePath) {
266
+ try {
267
+ if (!existsSync(filePath)) return [];
268
+ const raw = readFileSync(filePath, "utf-8");
269
+ const parsed = JSON.parse(raw);
270
+ return Array.isArray(parsed) ? parsed : [];
271
+ } catch (_err) {
272
+ return [];
273
+ }
274
+ }
275
+
276
+ function saveEmailAccounts(filePath, accounts) {
277
+ writeFileSync(filePath, JSON.stringify(accounts, null, 2), {
278
+ encoding: "utf-8",
279
+ mode: 0o600,
280
+ });
281
+ }
282
+
283
+ export async function getHub() {
284
+ if (_hub) return _hub;
285
+ if (!_initPromise) {
286
+ _initPromise = initHub()
287
+ .then((h) => {
288
+ _hub = h;
289
+ return h;
290
+ })
291
+ .catch((err) => {
292
+ _initPromise = null;
293
+ throw err;
294
+ });
295
+ }
296
+ return _initPromise;
297
+ }
298
+
299
+ export function close() {
300
+ if (_hub && _hub.vault) {
301
+ try {
302
+ _hub.vault.close();
303
+ } catch (_e) {}
304
+ }
305
+ _hub = null;
306
+ _initPromise = null;
307
+ _bm25 = null;
308
+ _kgMod = null;
309
+ _bm25Mod = null;
310
+ }
@@ -626,6 +626,41 @@ export class AgentRuntime {
626
626
  runtimeLogger.log(
627
627
  ` Auth: ${this.policy.token ? chalk.green("enabled") : chalk.yellow("disabled")}`,
628
628
  );
629
+ // When bound to 0.0.0.0 the user needs a reachable URL — enumerate the
630
+ // non-loopback IPv4 addresses (typically wlan0 on Android, eth0 on a
631
+ // server) so they can copy/paste the full URL onto another device. Also
632
+ // print the auth token here when present so the user doesn't have to dig
633
+ // it out of env vars. NB: this is local-network display only; we never
634
+ // leak the token over the wire beyond ws/http to clients holding it.
635
+ if (host === "0.0.0.0") {
636
+ try {
637
+ const os = await import("os");
638
+ const ifaces = os.networkInterfaces();
639
+ const lanUrls = [];
640
+ for (const [, addrs] of Object.entries(ifaces)) {
641
+ for (const a of addrs || []) {
642
+ if (a.family === "IPv4" && !a.internal) {
643
+ lanUrls.push(`http://${a.address}:${actualHttpPort}`);
644
+ }
645
+ }
646
+ }
647
+ if (lanUrls.length > 0) {
648
+ runtimeLogger.log("");
649
+ runtimeLogger.log(chalk.bold(" LAN access:"));
650
+ for (const u of lanUrls) {
651
+ runtimeLogger.log(` ${chalk.cyan(u)}`);
652
+ }
653
+ }
654
+ } catch (_err) {
655
+ // Best-effort — keep banner working even if os import fails.
656
+ }
657
+ }
658
+ if (this.policy.token) {
659
+ runtimeLogger.log("");
660
+ runtimeLogger.log(
661
+ ` Token: ${chalk.yellow(this.policy.token)} ${chalk.dim("(append as ?token=<TOKEN> or paste into login screen)")}`,
662
+ );
663
+ }
629
664
  runtimeLogger.log("");
630
665
  runtimeLogger.log(chalk.dim(" Press Ctrl+C to stop"));
631
666
  runtimeLogger.log("");
@@ -634,20 +669,59 @@ export class AgentRuntime {
634
669
  this.deps.openBrowser(uiUrl);
635
670
  }
636
671
 
672
+ // Force-exit after this deadline if graceful shutdown stalls (typically
673
+ // httpServer.close hanging on persistent keep-alive / WS connections,
674
+ // which is exactly what makes Ctrl+C feel dead on Android local terminal
675
+ // — the pty never sees the prompt return because node never exits).
676
+ const SHUTDOWN_TIMEOUT_MS = 2000;
677
+ let shuttingDown = false;
637
678
  const shutdown = async () => {
679
+ if (shuttingDown) {
680
+ // Second Ctrl+C while still draining — escalate immediately.
681
+ runtimeLogger.log(chalk.red("\nForce-exiting..."));
682
+ process.exit(130);
683
+ }
684
+ shuttingDown = true;
638
685
  runtimeLogger.log("\n" + chalk.yellow("Shutting down UI server..."));
639
- if (mcpClient && typeof mcpClient.disconnectAll === "function") {
640
- await mcpClient.disconnectAll().catch(() => undefined);
686
+ // NB: do NOT unref() this timer. With unref(), if every other handle
687
+ // clears before the timer fires, the event loop exits and force-exit
688
+ // never runs — exactly the bug we hit on Xiaomi 24115RA8EC 2026-05-19:
689
+ // SIGINT → handler logged "Shutting down" → never exited. We WANT this
690
+ // timer to keep the loop alive through the SHUTDOWN_TIMEOUT_MS window.
691
+ // clearTimeout in the success branches handles graceful exits.
692
+ const forceExit = setTimeout(() => {
693
+ runtimeLogger.log(
694
+ chalk.red(
695
+ `Graceful shutdown stalled after ${SHUTDOWN_TIMEOUT_MS}ms, force-exiting`,
696
+ ),
697
+ );
698
+ process.exit(130);
699
+ }, SHUTDOWN_TIMEOUT_MS);
700
+ try {
701
+ if (mcpClient && typeof mcpClient.disconnectAll === "function") {
702
+ await mcpClient.disconnectAll().catch(() => undefined);
703
+ }
704
+ // Kill all PTY sessions before WS so the SPA gets clean terminal.exit
705
+ // frames; without this, node-pty children would outlive cc ui until
706
+ // their OS parent (the cc ui process) actually exits.
707
+ this._terminalCleanup?.();
708
+ // Force-close any persistent HTTP keep-alive / WS upgrades; without
709
+ // this, httpServer.close waits for every browser tab to close its
710
+ // socket before resolving — which never happens until the user
711
+ // manually closes the tab.
712
+ if (typeof httpServer.closeAllConnections === "function") {
713
+ httpServer.closeAllConnections();
714
+ }
715
+ await Promise.all([
716
+ new Promise((resolve) => httpServer.close(resolve)),
717
+ wsServer.stop(),
718
+ ]);
719
+ clearTimeout(forceExit);
720
+ process.exit(0);
721
+ } catch (_err) {
722
+ clearTimeout(forceExit);
723
+ process.exit(1);
641
724
  }
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?.();
646
- await Promise.all([
647
- new Promise((resolve) => httpServer.close(resolve)),
648
- wsServer.stop(),
649
- ]);
650
- process.exit(0);
651
725
  };
652
726
 
653
727
  process.on("SIGINT", shutdown);
@@ -1,3 +0,0 @@
1
- import{f as O,r as K,o as _e,x as pt,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 ot,Z as J,S as I,I as nt,e as yt,_ as mt,w as ft,H as _t,$ as kt}from"./vendor-M5lGV-wr.js";import{u as ke,_ as ge,E as gt,a as vt,b as ht,T as bt,c as wt,d as G}from"./index-CEbbycgJ.js";import{u as q}from"./useShellMode-CgR0wCYM.js";import{B as me,R as $t,M as fe,F as Y,G as ee,D as te,h as he,i as ae,j as be,k as oe,A as we,N as $e,l as Le,m as Oe,n as Se,o as Ce,S as Ee,p as Re,q as Ae,r as ne,s as Ne,t as Te,u as je,v as Be,w as Me,x as Ie,y as Pe,P as Ue,z as se,K as ie,H as D,J as De,O as le,Q as Ke,U as ze,W as Fe,V as ye,X as re,Y as Ve,Z as qe,_ as ce,$ 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 et,a9 as Lt,aa as tt,e as Ot}from"./icons-NT6gy8Ee.js";import St from"./index-Cw48kkkH.js";import"./KeyCode-D63Tfrq7.js";import"./omit-BFZV2hmZ.js";import"./pickAttrs-D98WQSur.js";import"./initDefaultProps-CAgx2aHm.js";import"./motion-DFuREFOd.js";import"./raf-Deuc0E8-.js";import"./index-BzzFMBIM.js";import"./index-C3VVwJcn.js";import"./isVisible-C7tPsqfj.js";import"./useState-CSzR8F8O.js";import"./devWarning-CNIS3FrJ.js";import"./warning-Pq00owYb.js";import"./compact-item-r4YWRFGQ.js";import"./createContext-C8Lwrn-C.js";import"./Compact-CQR4QsWP.js";import"./_getTag-BVc6NQ_K.js";import"./styleChecker-Br0YrCOO.js";import"./zoom-DaW-jbu7.js";import"./ActionButton-epuY2GkZ.js";import"./vnode-BQi3uWRC.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=ke();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()}_e(()=>{window.addEventListener("cc:open-notification-drawer",y)}),pt(()=>{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(me))])]),_: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($t))]),_: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(gt).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,ot(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=ge(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=nt(),k=ke(),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 _e(()=>{y(),b=setInterval(y,5e3)}),yt(()=>{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(fe),{style:mt({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=ge(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"},at="cc.web-panel.sidebar.openKeys",ma={__name:"AppLayout",setup(h){const j=nt(),E=_t(),k=ke(),S=vt(),{t:b}=ht(),r=q(),u=K(!1),_=window.__CC_CONFIG__||{},y=O(()=>_.mode==="project"),w="v5.0.3.57",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(at);if(n){const p=JSON.parse(n);if(Array.isArray(p))return p.filter(o=>$.includes(o))}}catch{}return[...$]}const m=K(A());ft(m,n=>{try{localStorage.setItem(at,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}=wt();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 _e(()=>k.connect()),(n,p)=>{const o=d("a-menu-item"),M=d("a-sub-menu"),F=d("a-menu-divider"),st=d("a-menu"),it=d("a-badge"),lt=d("a-layout-sider"),X=d("a-tooltip"),rt=d("a-tag"),ct=d("a-layout-header"),ut=d("router-view"),dt=d("a-layout-content"),ve=d("a-layout");return c(),C(ve,{class:"app-root"},{default:t(()=>[e(lt,{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(st,{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(he))]),_:1}),e(o,{key:"quick-ask"},{icon:t(()=>[e(a(ae))]),_:1}),e(o,{key:"cowork"},{icon:t(()=>[e(a(be))]),_:1}),e(o,{key:"services"},{icon:t(()=>[e(a(oe))]),_:1}),e(o,{key:"aiops"},{icon:t(()=>[e(a(we))]),_:1}),e(o,{key:"tokens"},{icon:t(()=>[e(a($e))]),_:1}),e(o,{key:"logs"},{icon:t(()=>[e(a(Le))]),_:1}),e(F,{class:"divider-sm"}),e(o,{key:"skills"},{icon:t(()=>[e(a(Oe))]),_:1}),e(o,{key:"providers"},{icon:t(()=>[e(a(Se))]),_:1}),e(o,{key:"mcp"},{icon:t(()=>[e(a(Ce))]),_:1}),e(o,{key:"project-settings"},{icon:t(()=>[e(a(Y))]),_:1}),e(o,{key:"speech-settings"},{icon:t(()=>[e(a(Ee))]),_:1}),e(o,{key:"notification-settings"},{icon:t(()=>[e(a(me))]),_:1}),e(o,{key:"sync-settings"},{icon:t(()=>[e(a(Re))]),_:1}),e(o,{key:"nlprog"},{icon:t(()=>[e(a(Ae))]),_:1}),e(o,{key:"codegen"},{icon:t(()=>[e(a(ne))]),_:1}),e(F,{class:"divider-sm"}),e(o,{key:"notes"},{icon:t(()=>[e(a(Ne))]),_:1}),e(o,{key:"search"},{icon:t(()=>[e(a(Te))]),_:1}),e(o,{key:"memory"},{icon:t(()=>[e(a(je))]),_:1}),e(o,{key:"knowledge"},{icon:t(()=>[e(a(Be))]),_:1}),e(o,{key:"marketplace"},{icon:t(()=>[e(a(Me))]),_:1}),e(o,{key:"cron"},{icon:t(()=>[e(a(Ie))]),_:1}),e(o,{key:"workflow"},{icon:t(()=>[e(a(Pe))]),_:1}),e(o,{key:"pipeline"},{icon:t(()=>[e(a(Ue))]),_: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(De))]),_: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(Ke))]),_:1}),e(o,{key:"permissions"},{icon:t(()=>[e(a(ze))]),_:1}),e(o,{key:"p2p"},{icon:t(()=>[e(a(Fe))]),_:1}),e(o,{key:"mobile-bridge"},{icon:t(()=>[e(a(fe))]),_:1}),e(o,{key:"terminal"},{icon:t(()=>[e(a(ye))]),_: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(Ve))]),_:1}),e(o,{key:"crosschain"},{icon:t(()=>[e(a(qe))]),_: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(We))]),_:1}),e(o,{key:"federation"},{icon:t(()=>[e(a(He))]),_:1}),e(F,{class:"divider-sm"}),e(o,{key:"wallet"},{icon:t(()=>[e(a(Je))]),_:1}),e(o,{key:"organization"},{icon:t(()=>[e(a(le))]),_:1}),e(o,{key:"tenant"},{icon:t(()=>[e(a(Ge))]),_:1}),e(o,{key:"sla"},{icon:t(()=>[e(a(te))]),_:1}),e(o,{key:"analytics"},{icon:t(()=>[e(a(Ye))]),_:1}),e(o,{key:"templates"},{icon:t(()=>[e(a(Ze))]),_:1}),e(F,{class:"divider-sm"}),e(o,{key:"community"},{icon:t(()=>[e(a(Qe))]),_:1}),e(o,{key:"governance"},{icon:t(()=>[e(a(Xe))]),_:1}),e(o,{key:"reputation"},{icon:t(()=>[e(a(xe))]),_:1}),e(o,{key:"recommend"},{icon:t(()=>[e(a(et))]),_:1}),e(F,{class:"divider-sm"}),e(o,{key:"rssfeed"},{icon:t(()=>[e(a(tt))]),_: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(he))]),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(be))]),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(we))]),default:t(()=>[i(s(n.$t("appLayout.items.aiops")),1)]),_:1}),e(o,{key:"tokens"},{icon:t(()=>[e(a($e))]),default:t(()=>[i(s(n.$t("appLayout.items.tokens")),1)]),_:1}),e(o,{key:"logs"},{icon:t(()=>[e(a(Le))]),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(Oe))]),default:t(()=>[i(s(n.$t("appLayout.items.skills")),1)]),_:1}),e(o,{key:"providers"},{icon:t(()=>[e(a(Se))]),default:t(()=>[i(s(n.$t("appLayout.items.providers")),1)]),_:1}),e(o,{key:"mcp"},{icon:t(()=>[e(a(Ce))]),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(Ee))]),default:t(()=>[i(s(n.$t("appLayout.items.speechSettings")),1)]),_:1}),e(o,{key:"notification-settings"},{icon:t(()=>[e(a(me))]),default:t(()=>[i(s(n.$t("appLayout.items.notificationSettings")),1)]),_:1}),e(o,{key:"sync-settings"},{icon:t(()=>[e(a(Re))]),default:t(()=>[i(s(n.$t("appLayout.items.syncSettings")),1)]),_:1}),e(o,{key:"nlprog"},{icon:t(()=>[e(a(Ae))]),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(Ne))]),default:t(()=>[i(s(n.$t("appLayout.items.notes")),1)]),_:1}),e(o,{key:"search"},{icon:t(()=>[e(a(Te))]),default:t(()=>[i(s(n.$t("appLayout.items.search")),1)]),_:1}),e(o,{key:"memory"},{icon:t(()=>[e(a(je))]),default:t(()=>[i(s(n.$t("appLayout.items.memory")),1)]),_:1}),e(o,{key:"knowledge"},{icon:t(()=>[e(a(Be))]),default:t(()=>[i(s(n.$t("appLayout.items.knowledge")),1)]),_:1}),e(o,{key:"marketplace"},{icon:t(()=>[e(a(Me))]),default:t(()=>[i(s(n.$t("appLayout.items.marketplace")),1)]),_:1}),e(o,{key:"cron"},{icon:t(()=>[e(a(Ie))]),default:t(()=>[i(s(n.$t("appLayout.items.cron")),1)]),_:1}),e(o,{key:"workflow"},{icon:t(()=>[e(a(Pe))]),default:t(()=>[i(s(n.$t("appLayout.items.workflow")),1)]),_:1}),e(o,{key:"pipeline"},{icon:t(()=>[e(a(Ue))]),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(De))]),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(Ke))]),default:t(()=>[i(s(n.$t("appLayout.items.did")),1)]),_:1}),e(o,{key:"permissions"},{icon:t(()=>[e(a(ze))]),default:t(()=>[i(s(n.$t("appLayout.items.permissions")),1)]),_:1}),e(o,{key:"p2p"},{icon:t(()=>[e(a(Fe))]),default:t(()=>[i(s(n.$t("appLayout.items.p2p")),1)]),_:1}),e(o,{key:"mobile-bridge"},{icon:t(()=>[e(a(fe))]),default:t(()=>[i(s(n.$t("appLayout.items.mobileBridge","移动桥")),1)]),_:1}),e(o,{key:"terminal"},{icon:t(()=>[e(a(ye))]),default:t(()=>[i(s(n.$t("appLayout.items.terminal","远程终端")),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(Ve))]),default:t(()=>[i(s(n.$t("appLayout.items.projects")),1)]),_:1}),e(o,{key:"crosschain"},{icon:t(()=>[e(a(qe))]),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(We))]),default:t(()=>[i(s(n.$t("appLayout.items.inference")),1)]),_:1}),e(o,{key:"federation"},{icon:t(()=>[e(a(He))]),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(Je))]),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(Ge))]),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(Ye))]),default:t(()=>[i(s(n.$t("appLayout.items.analytics")),1)]),_:1}),e(o,{key:"templates"},{icon:t(()=>[e(a(Ze))]),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(Qe))]),default:t(()=>[i(s(n.$t("appLayout.items.community")),1)]),_:1}),e(o,{key:"governance"},{icon:t(()=>[e(a(Xe))]),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(et))]),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(Lt))]),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(tt))]),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(it,{status:B.value},null,8,["status"]),u.value?I("",!0):(c(),g("span",ia,s(z.value),1))],2)]),_:1},8,["collapsed"]),e(ve,{class:"main-area"},{default:t(()=>[e(ct,{class:"app-header"},{default:t(()=>[l("div",la,[l("div",{class:J(["scope-tag",y.value?"project":"global"])},[(c(),C(kt(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(Ot),{class:"info-icon"})]),_:1},8,["title"])):I("",!0)],2)]),l("div",ra,[l("div",ca,[(c(!0),g(V,null,ot(a(bt),(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(ye))])]),_:1},8,["title"])):I("",!0),e(rt,{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(dt,{class:"page-content"},{default:t(()=>[e(ut)]),_:1})]),_:1})]),_:1})}}},za=ge(ma,[["__scopeId","data-v-b8fbdb22"]]);export{za as default};
@@ -1 +0,0 @@
1
- import{_ as qe,u as Ee,b as Ie,d as v}from"./index-CEbbycgJ.js";import{s as Me}from"./community-parser-CO25nZFt.js";import{R as Pe,aq as De,aZ as Ke,aH as Ve,aY as Ye,z as de,a4 as Je,ai as me,ak as We,A as He}from"./icons-NT6gy8Ee.js";import{o as Qe,M as p,R as b,P as r,c as a,N as l,Q as h,S as m,K as d,r as g,L as c,O as f,u as _,F,Y as M,_ as ye,f as w,a as le}from"./vendor-M5lGV-wr.js";function P(t){const i=Me(t);if(!i)return null;try{return JSON.parse(i)}catch{}const n=i.match(/\{[\s\S]*\}|\[[\s\S]*\]/);if(!n)return null;try{return JSON.parse(n[0])}catch{return null}}const Ze=Object.freeze(["file-md5","file-sha1","file-sha256","file-sha512","ipv4","ipv6","domain","url","email"]);function S(t,i=0){return typeof t=="number"&&Number.isFinite(t)?t:i}function fe(t,i=0){if(!t||typeof t!="object")return null;const n=t.id||"";if(!n)return null;const z=Array.isArray(t.labels)?t.labels:[];return{key:n,id:n,type:String(t.type||""),value:String(t.value||""),labels:z,confidence:t.confidence!=null?S(t.confidence,null):null,sourceId:t.sourceId??t.source_id??null,sourceName:t.sourceName??t.source_name??null,validFrom:t.validFrom??t.valid_from??null,validUntil:t.validUntil??t.valid_until??null,firstSeenAt:t.firstSeenAt??t.first_seen_at??null,lastSeenAt:t.lastSeenAt??t.last_seen_at??null,_idx:i}}function Ge(t){const i=P(t);return Array.isArray(i)?i.map(fe).filter(Boolean):[]}function Xe(t){const i=P(t);return!i||typeof i!="object"||Array.isArray(i)?null:{matched:!!i.matched,type:String(i.type||"unknown"),indicator:i.indicator?fe(i.indicator):null}}function et(t){const i={total:0,byType:{}},n=P(t);if(!n||typeof n!="object"||Array.isArray(n))return i;if(i.total=S(n.total,0),n.byType&&typeof n.byType=="object")for(const[z,O]of Object.entries(n.byType))typeof O=="number"&&Number.isFinite(O)&&(i.byType[z]=O);return i}function tt(t,i=0){if(!t||typeof t!="object")return null;const n=t.entity||"";return n?{key:n,entity:n,eventCount:S(t.eventCount??t.event_count,0),failureRate:S(t.failureRate??t.failure_rate,0),uniqueResources:S(t.uniqueResources??t.unique_resources,0),uniqueActions:S(t.uniqueActions??t.unique_actions,0),burstiness:S(t.burstiness,0),riskScore:S(t.riskScore??t.risk_score,0),_idx:i}:null}function at(t){const i=P(t);return Array.isArray(i)?i.map(tt).filter(Boolean):[]}function lt(t,i=0){return!t||typeof t!="object"?null:{key:i,score:S(t.score,0),reasons:Array.isArray(t.reasons)?t.reasons:[],event:t.event&&typeof t.event=="object"?t.event:null,_idx:i}}function ot(t){const i=P(t);return Array.isArray(i)?i.map(lt).filter(Boolean):[]}function oe(t){if(!t)return{noAuditLog:!1,error:""};const i=/no such table:\s*audit_log/i.test(t),n=t.match(/Failed:\s*(.+?)(?:\r?\n|$)/i);return{noAuditLog:i,error:n?n[1].trim():""}}function nt(t){if(t==null||t==="")return"—";const i=typeof t=="number"?new Date(t):new Date(String(t));return isNaN(i.getTime())?String(t):i.toLocaleString("zh-CN",{hour12:!1})}const it={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},st={class:"page-title"},rt={class:"page-sub"},ct={class:"filter-bar"},ut={key:1,style:{color:"var(--text-primary)","font-family":"monospace","font-size":"12px","word-break":"break-all"}},pt={key:0,style:{color:"var(--text-muted)"}},dt={key:1,style:{color:"var(--text-muted)"}},mt={key:0,style:{color:"var(--text-secondary)","font-size":"12px"}},yt={key:1,style:{color:"var(--text-muted)"}},ft={key:5,style:{color:"var(--text-secondary)","font-size":"11px"}},vt={style:{padding:"40px",color:"var(--text-muted)","text-align":"center"}},bt={style:{color:"var(--text-primary)",margin:"16px 0 8px","font-size":"14px"}},gt={key:0,style:{color:"var(--text-primary)","font-family":"monospace","font-weight":"500"}},ht={key:2,style:{color:"var(--text-secondary)"}},_t={key:5,style:{color:"var(--text-secondary)","font-family":"monospace","font-size":"11px"}},kt={style:{padding:"30px",color:"var(--text-muted)","text-align":"center"}},xt={key:2,style:{color:"var(--text-primary)",margin:"24px 0 8px","font-size":"14px"}},$t={style:{flex:"1"}},zt={style:{display:"flex",gap:"8px","align-items":"center"}},St={key:0,style:{color:"var(--text-primary)","font-family":"monospace","font-size":"12px"}},At={key:1,style:{color:"var(--text-secondary)","font-size":"11px"}},Tt={key:0,style:{"margin-top":"4px"}},Ct={style:{"margin-top":"8px","font-size":"12px",color:"var(--text-secondary)"}},Ft={key:0,style:{"margin-top":"12px","font-size":"12px"}},Ot={style:{color:"var(--text-secondary)"}},Rt={style:{color:"var(--text-secondary)"}},jt={key:0,style:{"margin-top":"4px"}},Lt={style:{color:"var(--text-secondary)","font-size":"12px",margin:"0"}},Nt={style:{color:"var(--text-secondary)","font-size":"12px",margin:"0"}},wt={__name:"Compliance",setup(t){const i=Ee(),{t:n}=Ie(),z=g(!1),O=g(!1),Y=g(!1),J=g(!1),W=g([]),U=g({total:0,byType:{}}),B=g([]),R=g([]),A=g({noAuditLog:!1,error:""}),D=g("threat"),K=g(""),H=g(!1),q=g(!1),E=g(!1),Q=le({observable:""}),k=g(null),T=le({entity:"",days:30}),x=le({entity:"",threshold:.7,days:1}),ve=w(()=>[{title:n("compliance.cols.type"),key:"type",width:"120px"},{title:n("compliance.cols.value"),key:"value"},{title:n("compliance.cols.labels"),key:"labels",width:"160px"},{title:n("compliance.cols.confidence"),key:"confidence",width:"90px"},{title:n("compliance.cols.source"),key:"source",width:"160px"},{title:n("compliance.cols.lastSeen"),key:"lastSeen",width:"160px"},{title:n("compliance.cols.action"),key:"action",width:"90px"}]),be=w(()=>[{title:n("compliance.cols.entity"),key:"entity",width:"180px"},{title:n("compliance.cols.riskScore"),key:"riskScore"},{title:n("compliance.cols.eventCount"),key:"eventCount",width:"90px"},{title:n("compliance.cols.failureRate"),key:"failureRate",width:"90px"},{title:n("compliance.cols.uniqueResources"),key:"uniqueResources",width:"90px"},{title:n("compliance.cols.burstiness"),key:"burstiness",width:"90px"}]),ge=w(()=>K.value?W.value.filter(e=>e.type===K.value):W.value),he=w(()=>Object.keys(U.value.byType).length),_e=w(()=>Object.entries(U.value.byType).sort((e,s)=>s[1]-e[1])),ne=w(()=>B.value.filter(e=>e.riskScore>=70).length),ke={ipv4:"blue",ipv6:"cyan",domain:"purple",url:"magenta",email:"gold","file-md5":"orange","file-sha1":"orange","file-sha256":"red","file-sha512":"red",unknown:"default"};function Z(e){return ke[e]||"default"}function xe(e){return e>=80?"#ff4d4f":e>=50?"#faad14":"#52c41a"}function ie(e){return e>=70?"#ff4d4f":e>=40?"#faad14":"#52c41a"}function $e(e,s){return e?e.length>s?e.slice(0,s)+"...":e:""}function ze({key:e}){e==="match"?(k.value=null,H.value=!0):e==="ueba-build"?q.value=!0:e==="ueba-analyze"&&(E.value=!0)}async function V(){z.value=!0;try{const[e,s,y]=await Promise.all([i.execute("compliance threat-intel list --limit 200 --json",1e4).catch(()=>({output:""})),i.execute("compliance threat-intel stats --json",8e3).catch(()=>({output:""})),i.execute("compliance ueba top --top-k 20 --json",1e4).catch(()=>({output:""}))]);W.value=Ge(e.output),U.value=et(s.output),A.value=oe(y.output),B.value=A.value.noAuditLog?[]:at(y.output)}catch(e){v.error(n("compliance.msg.loadFailed")+": "+(e?.message||e))}finally{z.value=!1}}async function Se(){const e=Q.observable.trim();if(!e){v.warning(n("compliance.msg.matchEmpty"));return}O.value=!0,k.value=null;try{const s=`compliance threat-intel match "${e.replace(/"/g,'\\"')}" --json`,{output:y}=await i.execute(s,8e3),$=Xe(y);if(!$){v.error(n("compliance.msg.matchFailed")+": "+y.slice(0,120));return}k.value=$,$.matched?v.warning(n("compliance.msg.matchHit",{type:$.type})):$.type==="unknown"?v.info(n("compliance.msg.matchUnknownType")):v.success(n("compliance.msg.matchMiss",{type:$.type}))}catch(s){v.error(n("compliance.msg.matchFailed")+": "+(s?.message||s))}finally{O.value=!1}}async function Ae(e){try{const s=`compliance threat-intel remove ${e.type} "${e.value.replace(/"/g,'\\"')}" --json`,{output:y}=await i.execute(s,8e3);if(/error|失败/i.test(y)&&!/"removed"/.test(y)){v.error(n("compliance.msg.deleteFailed")+": "+y.slice(0,120));return}v.success(n("compliance.msg.deleteSuccess")),await V()}catch(s){v.error(n("compliance.msg.deleteFailed")+": "+(s?.message||s))}}async function Te(){Y.value=!0;try{const e=["compliance ueba baseline"];T.entity.trim()&&e.push(`--entity "${T.entity.trim().replace(/"/g,'\\"')}"`),T.days!=null&&e.push(`--days ${T.days}`),e.push("--json");const{output:s}=await i.execute(e.join(" "),3e4),y=oe(s);if(y.noAuditLog){A.value=y,v.warning(n("compliance.msg.auditEmptyBuild")),q.value=!1;return}if(y.error){v.error(n("compliance.msg.buildFailed")+": "+y.error);return}v.success(n("compliance.msg.buildSuccess")),q.value=!1,D.value="ueba",await V()}catch(e){v.error(n("compliance.msg.buildFailed")+": "+(e?.message||e))}finally{Y.value=!1}}async function Ce(){J.value=!0;try{const e=["compliance ueba analyze"];x.entity.trim()&&e.push(`--entity "${x.entity.trim().replace(/"/g,'\\"')}"`),x.threshold!=null&&e.push(`--threshold ${x.threshold}`),x.days!=null&&e.push(`--days ${x.days}`),e.push("--json");const{output:s}=await i.execute(e.join(" "),3e4),y=oe(s);if(y.noAuditLog){A.value=y,v.warning(n("compliance.msg.auditEmptyAnalyze")),E.value=!1;return}if(y.error&&!s.includes("[")){v.error(n("compliance.msg.analyzeFailed")+": "+y.error);return}R.value=ot(s),v.success(n("compliance.msg.analyzeSuccess",{n:R.value.length})),E.value=!1,D.value="ueba"}catch(e){v.error(n("compliance.msg.analyzeFailed")+": "+(e?.message||e))}finally{J.value=!1}}return Qe(V),(e,s)=>{const y=d("a-button"),$=d("a-menu-item"),Fe=d("a-menu"),Oe=d("a-dropdown"),se=d("a-space"),L=d("a-statistic"),j=d("a-card"),I=d("a-col"),Re=d("a-row"),C=d("a-tag"),re=d("a-radio-button"),je=d("a-radio-group"),Le=d("a-popconfirm"),ce=d("a-table"),ue=d("a-tab-pane"),pe=d("a-alert"),Ne=d("a-progress"),we=d("a-list-item"),Ue=d("a-list"),Be=d("a-tabs"),G=d("a-input"),N=d("a-form-item"),X=d("a-form"),ee=d("a-modal"),te=d("a-input-number");return c(),p("div",null,[b("div",it,[b("div",null,[b("h2",st,r(e.$t("compliance.title")),1),b("p",rt,r(e.$t("compliance.subtitle")),1)]),a(se,null,{default:l(()=>[a(y,{loading:z.value,onClick:V},{icon:l(()=>[a(_(Pe))]),default:l(()=>[f(" "+r(e.$t("compliance.refresh")),1)]),_:1},8,["loading"]),a(Oe,{trigger:["click"]},{overlay:l(()=>[a(Fe,{onClick:ze},{default:l(()=>[a($,{key:"match"},{default:l(()=>[a(_(Ke)),f(" "+r(e.$t("compliance.actions.match")),1)]),_:1}),a($,{key:"ueba-build"},{default:l(()=>[a(_(Ve)),f(" "+r(e.$t("compliance.actions.uebaBuild")),1)]),_:1}),a($,{key:"ueba-analyze"},{default:l(()=>[a(_(Ye)),f(" "+r(e.$t("compliance.actions.uebaAnalyze")),1)]),_:1})]),_:1})]),default:l(()=>[a(y,{type:"primary"},{icon:l(()=>[a(_(De))]),default:l(()=>[f(" "+r(e.$t("compliance.actionDropdown")),1)]),_:1})]),_:1})]),_:1})]),a(Re,{gutter:[16,16],style:{"margin-bottom":"20px"}},{default:l(()=>[a(I,{xs:12,sm:8,lg:5},{default:l(()=>[a(j,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:l(()=>[a(L,{title:e.$t("compliance.stats.iocTotal"),value:U.value.total,"value-style":{color:"#1677ff",fontSize:"20px"}},{prefix:l(()=>[a(_(de))]),_:1},8,["title","value"])]),_:1})]),_:1}),a(I,{xs:12,sm:8,lg:5},{default:l(()=>[a(j,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:l(()=>[a(L,{title:e.$t("compliance.stats.iocTypes"),value:he.value,"value-style":{color:"#13c2c2",fontSize:"20px"}},{prefix:l(()=>[a(_(Je))]),_:1},8,["title","value"])]),_:1})]),_:1}),a(I,{xs:12,sm:8,lg:5},{default:l(()=>[a(j,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:l(()=>[a(L,{title:e.$t("compliance.stats.riskEntities"),value:B.value.length,"value-style":{color:"#722ed1",fontSize:"20px"}},{prefix:l(()=>[a(_(me))]),_:1},8,["title","value"])]),_:1})]),_:1}),a(I,{xs:12,sm:8,lg:5},{default:l(()=>[a(j,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:l(()=>[a(L,{title:e.$t("compliance.stats.highRisk"),value:ne.value,"value-style":{color:ne.value>0?"#ff4d4f":"#52c41a",fontSize:"20px"}},{prefix:l(()=>[a(_(We))]),_:1},8,["title","value","value-style"])]),_:1})]),_:1}),a(I,{xs:24,sm:8,lg:4},{default:l(()=>[a(j,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:l(()=>[a(L,{title:e.$t("compliance.stats.recentAnomalies"),value:R.value.length,"value-style":{color:"#faad14",fontSize:"20px"}},{prefix:l(()=>[a(_(He))]),_:1},8,["title","value"])]),_:1})]),_:1})]),_:1}),U.value.total>0?(c(),h(j,{key:0,title:e.$t("compliance.typeBreakdown"),size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"20px"},"body-style":{padding:"12px 16px"}},{default:l(()=>[a(se,{size:[12,8],wrap:""},{default:l(()=>[(c(!0),p(F,null,M(_e.value,([o,u])=>(c(),h(C,{key:o,color:Z(o)},{default:l(()=>[f(r(o)+": "+r(u),1)]),_:2},1032,["color"]))),128))]),_:1})]),_:1},8,["title"])):m("",!0),a(Be,{activeKey:D.value,"onUpdate:activeKey":s[1]||(s[1]=o=>D.value=o),class:"compliance-tabs"},{default:l(()=>[a(ue,{key:"threat",tab:e.$t("compliance.tabs.threat")},{default:l(()=>[b("div",ct,[a(je,{value:K.value,"onUpdate:value":s[0]||(s[0]=o=>K.value=o),size:"small"},{default:l(()=>[a(re,{value:""},{default:l(()=>[f(r(e.$t("compliance.filter.all")),1)]),_:1}),(c(!0),p(F,null,M(_(Ze),o=>(c(),h(re,{key:o,value:o},{default:l(()=>[f(r(o),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),a(ce,{columns:ve.value,"data-source":ge.value,pagination:{pageSize:20,showTotal:o=>e.$t("compliance.table.totalSuffix",{n:o})},size:"small",loading:z.value,style:{background:"var(--bg-card)"}},{bodyCell:l(({column:o,record:u})=>[o.key==="type"?(c(),h(C,{key:0,color:Z(u.type),style:{"font-family":"monospace"}},{default:l(()=>[f(r(u.type),1)]),_:2},1032,["color"])):m("",!0),o.key==="value"?(c(),p("span",ut,r($e(u.value,64)),1)):m("",!0),o.key==="labels"?(c(),p(F,{key:2},[(c(!0),p(F,null,M(u.labels,ae=>(c(),h(C,{key:ae,color:"orange",style:{"font-size":"10px",margin:"1px"}},{default:l(()=>[f(r(ae),1)]),_:2},1024))),128)),u.labels.length?m("",!0):(c(),p("span",pt,"—"))],64)):m("",!0),o.key==="confidence"?(c(),p(F,{key:3},[u.confidence!=null?(c(),p("span",{key:0,style:ye({color:xe(u.confidence),fontWeight:500})},r(u.confidence),5)):(c(),p("span",dt,"—"))],64)):m("",!0),o.key==="source"?(c(),p(F,{key:4},[u.sourceName?(c(),p("span",mt,r(u.sourceName),1)):(c(),p("span",yt,"—"))],64)):m("",!0),o.key==="lastSeen"?(c(),p("span",ft,r(_(nt)(u.lastSeenAt)),1)):m("",!0),o.key==="action"?(c(),h(Le,{key:6,title:e.$t("compliance.table.deleteConfirm"),"ok-text":e.$t("compliance.table.deleteOk"),"cancel-text":e.$t("compliance.table.cancel"),onConfirm:ae=>Ae(u)},{default:l(()=>[a(y,{size:"small",type:"link",danger:""},{default:l(()=>[f(r(e.$t("compliance.table.delete")),1)]),_:1})]),_:1},8,["title","ok-text","cancel-text","onConfirm"])):m("",!0)]),emptyText:l(()=>[b("div",vt,[a(_(de),{style:{"font-size":"36px","margin-bottom":"10px",display:"block"}}),f(" "+r(e.$t("compliance.table.emptyThreatsLine1"))+" ",1),s[11]||(s[11]=b("code",{style:{"font-size":"11px"}},"cc compliance threat-intel import <file.json>",-1))])]),_:1},8,["columns","data-source","pagination","loading"])]),_:1},8,["tab"]),a(ue,{key:"ueba",tab:e.$t("compliance.tabs.ueba")},{default:l(()=>[A.value.noAuditLog?(c(),h(pe,{key:0,type:"info","show-icon":"",message:e.$t("compliance.ueba.noAuditLog"),description:e.$t("compliance.ueba.noAuditLogDesc"),style:{"margin-bottom":"16px"}},null,8,["message","description"])):A.value.error?(c(),h(pe,{key:1,type:"error","show-icon":"",message:e.$t("compliance.ueba.errorMessage",{err:A.value.error}),style:{"margin-bottom":"16px"}},null,8,["message"])):m("",!0),b("h3",bt,r(e.$t("compliance.ueba.topRiskTitle",{count:B.value.length})),1),a(ce,{columns:be.value,"data-source":B.value,pagination:!1,size:"small",loading:z.value,style:{background:"var(--bg-card)"}},{bodyCell:l(({column:o,record:u})=>[o.key==="entity"?(c(),p("span",gt,r(u.entity),1)):m("",!0),o.key==="riskScore"?(c(),h(Ne,{key:1,percent:Math.min(u.riskScore,100),"stroke-color":ie(u.riskScore),size:"small",format:()=>u.riskScore.toFixed(1)},null,8,["percent","stroke-color","format"])):m("",!0),o.key==="eventCount"?(c(),p("span",ht,r(u.eventCount),1)):m("",!0),o.key==="failureRate"?(c(),p("span",{key:3,style:ye({color:u.failureRate>.3?"#ff4d4f":"var(--text-secondary)",fontFamily:"monospace"})},r((u.failureRate*100).toFixed(1))+"% ",5)):m("",!0),o.key==="uniqueResources"?(c(),h(C,{key:4,color:"cyan",style:{"font-size":"11px"}},{default:l(()=>[f(r(u.uniqueResources),1)]),_:2},1024)):m("",!0),o.key==="burstiness"?(c(),p("span",_t,r((u.burstiness*100).toFixed(0))+"% ",1)):m("",!0)]),emptyText:l(()=>[b("div",kt,[a(_(me),{style:{"font-size":"32px","margin-bottom":"8px",display:"block"}}),f(" "+r(A.value.noAuditLog?e.$t("compliance.table.emptyAuditEntities"):e.$t("compliance.table.emptyRiskEntities")),1)])]),_:1},8,["columns","data-source","loading"]),R.value.length?(c(),p("h3",xt,r(e.$t("compliance.ueba.anomalyTitle",{count:R.value.length})),1)):m("",!0),R.value.length?(c(),h(Ue,{key:3,size:"small","data-source":R.value,locale:{emptyText:e.$t("compliance.table.noAnomalies")}},{renderItem:l(({item:o})=>[a(we,{style:{background:"var(--bg-card)",padding:"10px 16px"}},{default:l(()=>[b("div",$t,[b("div",zt,[a(C,{color:ie(o.score*100)},{default:l(()=>[f("score "+r(o.score.toFixed(2)),1)]),_:2},1032,["color"]),o.event?.entity?(c(),p("span",St,r(o.event.entity),1)):m("",!0),o.event?.action?(c(),p("span",At," → "+r(o.event.action),1)):m("",!0)]),o.reasons.length?(c(),p("div",Tt,[(c(!0),p(F,null,M(o.reasons,u=>(c(),h(C,{key:u,color:"volcano",style:{"font-size":"10px",margin:"1px"}},{default:l(()=>[f(r(u),1)]),_:2},1024))),128))])):m("",!0)])]),_:2},1024)]),_:1},8,["data-source","locale"])):m("",!0)]),_:1},8,["tab"])]),_:1},8,["activeKey"]),a(ee,{open:H.value,"onUpdate:open":s[3]||(s[3]=o=>H.value=o),title:e.$t("compliance.match.modalTitle"),"confirm-loading":O.value,width:500,"ok-text":e.$t("compliance.match.ok"),"cancel-text":e.$t("compliance.match.close"),onOk:Se},{default:l(()=>[a(X,{"label-col":{span:5},"wrapper-col":{span:19},style:{"margin-top":"16px"}},{default:l(()=>[a(N,{label:e.$t("compliance.match.label"),required:""},{default:l(()=>[a(G,{value:Q.observable,"onUpdate:value":s[2]||(s[2]=o=>Q.observable=o),placeholder:e.$t("compliance.match.placeholder"),"allow-clear":""},null,8,["value","placeholder"])]),_:1},8,["label"])]),_:1}),k.value?(c(),h(j,{key:0,size:"small",style:{background:"var(--bg-base)","margin-top":"8px"}},{default:l(()=>[a(L,{title:e.$t("compliance.match.result"),value:k.value.matched?e.$t("compliance.match.hit"):e.$t("compliance.match.miss"),"value-style":{color:k.value.matched?"#ff4d4f":"#52c41a"}},null,8,["title","value","value-style"]),b("div",Ct,[f(r(e.$t("compliance.match.detectType"))+" ",1),a(C,{color:Z(k.value.type)},{default:l(()=>[f(r(k.value.type),1)]),_:1},8,["color"])]),k.value.indicator?(c(),p("div",Ft,[b("div",Ot,r(e.$t("compliance.match.sourcePrefix"))+" "+r(k.value.indicator.sourceName||"—"),1),b("div",Rt,r(e.$t("compliance.match.confidencePrefix"))+" "+r(k.value.indicator.confidence??"—"),1),k.value.indicator.labels.length?(c(),p("div",jt,[(c(!0),p(F,null,M(k.value.indicator.labels,o=>(c(),h(C,{key:o,color:"orange",style:{"font-size":"10px"}},{default:l(()=>[f(r(o),1)]),_:2},1024))),128))])):m("",!0)])):m("",!0)]),_:1})):m("",!0)]),_:1},8,["open","title","confirm-loading","ok-text","cancel-text"]),a(ee,{open:q.value,"onUpdate:open":s[6]||(s[6]=o=>q.value=o),title:e.$t("compliance.build.modalTitle"),"confirm-loading":Y.value,width:480,"ok-text":e.$t("compliance.build.ok"),"cancel-text":e.$t("compliance.build.cancel"),onOk:Te},{default:l(()=>[a(X,{"label-col":{span:6},"wrapper-col":{span:18},style:{"margin-top":"16px"}},{default:l(()=>[a(N,{label:e.$t("compliance.build.entityLabel")},{default:l(()=>[a(G,{value:T.entity,"onUpdate:value":s[4]||(s[4]=o=>T.entity=o),placeholder:e.$t("compliance.build.entityPlaceholder")},null,8,["value","placeholder"])]),_:1},8,["label"]),a(N,{label:e.$t("compliance.build.daysLabel")},{default:l(()=>[a(te,{value:T.days,"onUpdate:value":s[5]||(s[5]=o=>T.days=o),min:1,max:365,placeholder:e.$t("compliance.build.daysPlaceholder"),style:{width:"100%"}},null,8,["value","placeholder"])]),_:1},8,["label"])]),_:1}),b("p",Lt,r(e.$t("compliance.build.footnote")),1)]),_:1},8,["open","title","confirm-loading","ok-text","cancel-text"]),a(ee,{open:E.value,"onUpdate:open":s[10]||(s[10]=o=>E.value=o),title:e.$t("compliance.analyze.modalTitle"),"confirm-loading":J.value,width:480,"ok-text":e.$t("compliance.analyze.ok"),"cancel-text":e.$t("compliance.analyze.cancel"),onOk:Ce},{default:l(()=>[a(X,{"label-col":{span:6},"wrapper-col":{span:18},style:{"margin-top":"16px"}},{default:l(()=>[a(N,{label:e.$t("compliance.analyze.entityLabel")},{default:l(()=>[a(G,{value:x.entity,"onUpdate:value":s[7]||(s[7]=o=>x.entity=o),placeholder:e.$t("compliance.analyze.entityPlaceholder")},null,8,["value","placeholder"])]),_:1},8,["label"]),a(N,{label:e.$t("compliance.analyze.thresholdLabel")},{default:l(()=>[a(te,{value:x.threshold,"onUpdate:value":s[8]||(s[8]=o=>x.threshold=o),min:0,max:1,step:.05,style:{width:"100%"}},null,8,["value"])]),_:1},8,["label"]),a(N,{label:e.$t("compliance.analyze.daysLabel")},{default:l(()=>[a(te,{value:x.days,"onUpdate:value":s[9]||(s[9]=o=>x.days=o),min:1,max:30,style:{width:"100%"}},null,8,["value"])]),_:1},8,["label"])]),_:1}),b("p",Nt,r(e.$t("compliance.analyze.footnote")),1)]),_:1},8,["open","title","confirm-loading","ok-text","cancel-text"])])}}},It=qe(wt,[["__scopeId","data-v-81155fa8"]]);export{It as default};
@@ -1 +0,0 @@
1
- import{_ as Be,u as Pe,b as Me,d as h}from"./index-CEbbycgJ.js";import{u as Ne,i as qe,a as Ke,b as Ve,c as Je,d as Ye,E as Qe}from"./echarts-Bq-n0MtJ.js";import{R as We,aq as Ze,az as le,$ as ke,v as He,a3 as Xe}from"./icons-NT6gy8Ee.js";import{o as et,M as m,R as $,P as s,c as t,N as a,Q as R,S as G,K as p,r as v,L as d,O as c,u as S,F as A,Y as L,f as U,a as re}from"./vendor-M5lGV-wr.js";function N(l){if(!l)return null;const i=l.trim();try{return JSON.parse(i)}catch{const n=i.match(/(\[[\s\S]*\]|\{[\s\S]*\})/);if(!n)return null;try{return JSON.parse(n[1])}catch{return null}}}function ie(l,i=0){if(!l||typeof l!="object")return null;const n=l.id||l.entity_id||"";if(!n)return null;const k=Array.isArray(l.tags)?l.tags:typeof l.tags=="string"&&l.tags.length>0?l.tags.split(",").map(_=>_.trim()).filter(Boolean):[];return{key:n,id:n,name:l.name||"",type:l.type||"",tags:k,properties:l.properties&&typeof l.properties=="object"?l.properties:null,createdAt:l.created_at||l.createdAt||"",updatedAt:l.updated_at||l.updatedAt||"",_idx:i}}function _e(l,i=0){if(!l||typeof l!="object")return null;const n=l.id||l.relation_id||"";if(!n)return null;const k=l.sourceId||l.source_id||"",_=l.targetId||l.target_id||"";if(!k||!_)return null;const T=typeof l.weight=="number"?l.weight:typeof l.weight=="string"?parseFloat(l.weight):1;return{key:n,id:n,sourceId:k,targetId:_,relationType:l.relationType||l.relation_type||"",weight:Number.isFinite(T)?T:1,properties:l.properties&&typeof l.properties=="object"?l.properties:null,createdAt:l.created_at||l.createdAt||"",_idx:i}}function tt(l){const i=N(l);return Array.isArray(i)?i.map(ie).filter(Boolean):i&&Array.isArray(i.entities)?i.entities.map(ie).filter(Boolean):[]}function at(l){const i=N(l);return Array.isArray(i)?i.map(_e).filter(Boolean):i&&Array.isArray(i.relations)?i.relations.map(_e).filter(Boolean):[]}function ot(l){const i=N(l);if(!i||typeof i!="object"||Array.isArray(i))return{entityCount:0,relationCount:0,avgDegree:0,density:0,typeDistribution:{},relationTypeDistribution:{}};const n=k=>{const _=typeof k=="number"?k:parseFloat(k);return Number.isFinite(_)?_:0};return{entityCount:n(i.entityCount??i.entity_count),relationCount:n(i.relationCount??i.relation_count),avgDegree:n(i.avgDegree??i.avg_degree),density:n(i.density),typeDistribution:i.typeDistribution||i.type_distribution||{},relationTypeDistribution:i.relationTypeDistribution||i.relation_type_distribution||{}}}function nt(l){const i=N(l);return Array.isArray(i)?i.map((n,k)=>{if(!n||typeof n!="object"||!n.entity)return null;const _=ie(n.entity,k);return _?{key:`${_.id}-${k}`,depth:typeof n.depth=="number"?n.depth:0,entity:_}:null}).filter(Boolean):[]}function lt(l){const i=N(l);return Array.isArray(i)?i.map(n=>!n||typeof n!="object"||!n.name?null:{name:String(n.name),description:String(n.description||"")}).filter(Boolean):[]}function rt(l,i){const n=new Map,k=[];for(const f of l)n.has(f.type)||(n.set(f.type,k.length),k.push({name:f.type||"unknown"}));const _=l.map(f=>({id:f.id,name:f.name||f.id.slice(0,8),category:n.get(f.type)??0,value:1,symbolSize:24})),T=new Set(l.map(f=>f.id)),O=[];for(const f of i)!T.has(f.sourceId)||!T.has(f.targetId)||O.push({source:f.sourceId,target:f.targetId,value:f.relationType,lineStyle:{width:Math.max(1,Math.min(6,f.weight*2))}});return{nodes:_,links:O,categories:k}}const it={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},st={class:"page-title"},dt={class:"page-sub"},ut={key:0,style:{padding:"60px","text-align":"center"}},pt={key:1,style:{height:"540px"}},ct={key:0,style:{color:"#888","font-family":"monospace","font-size":"11px"}},yt={key:1,style:{color:"var(--text-primary)"}},gt={key:0,style:{color:"var(--text-muted)"}},mt={key:0,style:{color:"#888","font-family":"monospace","font-size":"11px"}},ft={key:1,style:{color:"var(--text-muted)"}},ht={key:2,style:{color:"#888","font-family":"monospace","font-size":"11px"}},vt={key:4,style:{color:"var(--text-secondary)","font-family":"monospace"}},kt={key:0,style:{padding:"40px","text-align":"center",color:"var(--text-muted)"}},_t={style:{display:"flex","justify-content":"space-between","margin-bottom":"4px"}},bt={style:{color:"var(--text-secondary)","font-family":"monospace"}},wt={key:0,style:{padding:"40px","text-align":"center",color:"var(--text-muted)"}},Gt={style:{display:"flex","justify-content":"space-between","margin-bottom":"4px"}},$t={style:{color:"var(--text-secondary)","font-family":"monospace"}},xt={style:{color:"var(--text-muted)","font-size":"11px"}},Ct={key:0,style:{padding:"30px","text-align":"center",color:"var(--text-muted)"}},St={style:{"margin-left":"12px",color:"var(--text-primary)"}},Tt={style:{"margin-left":"8px",color:"#888","font-family":"monospace","font-size":"11px"}},Rt={__name:"KnowledgeGraph",setup(l){Ne([qe,Ke,Ve,Je,Ye]);const i=Pe(),{t:n}=Me(),k=v(!1),_=v(!1),T=v(!1),O=v(!1),f=v(!1),Z=v(""),q=v(!1),se=v("graph"),x=v([]),B=v([]),H=v([]),E=v({entityCount:0,relationCount:0,avgDegree:0,density:0,typeDistribution:{},relationTypeDistribution:{}}),K=v(!1),V=v(!1),X=v(!1),b=re({name:"",type:"",tags:""}),y=re({sourceId:"",targetId:"",relationType:"",weight:1}),z=re({maxDepth:3,direction:"out"}),de=v(""),ue=v(""),P=v([]),be=U(()=>[{title:n("knowledgeGraph.entityCols.id"),key:"id",width:"120px"},{title:n("knowledgeGraph.entityCols.name"),key:"name",dataIndex:"name",ellipsis:!0},{title:n("knowledgeGraph.entityCols.type"),key:"type",dataIndex:"type",width:"140px"},{title:n("knowledgeGraph.entityCols.tags"),key:"tags",width:"200px"},{title:n("knowledgeGraph.entityCols.action"),key:"action",width:"160px"}]),we=U(()=>[{title:n("knowledgeGraph.relationCols.source"),key:"source",width:"120px"},{title:"",key:"arrow",width:"40px"},{title:n("knowledgeGraph.relationCols.target"),key:"target",width:"120px"},{title:n("knowledgeGraph.relationCols.relationType"),key:"relationType",width:"160px"},{title:n("knowledgeGraph.relationCols.weight"),key:"weight",width:"100px"}]),Ge={Person:"magenta",Organization:"blue",Project:"cyan",Technology:"geekblue",Document:"gold",Concept:"purple",Event:"volcano"};function ee(e){return Ge[e]||"default"}const $e=U(()=>{const e=new Map;for(const r of x.value)e.set(r.id,r.name||r.id.slice(0,8));return e});function pe(e){return $e.value.get(e)||e.slice(0,12)}function ce(e,r){return String(r?.children?.[0]?.children||"").toLowerCase().includes(String(e).toLowerCase())}const ye=U(()=>{const e=E.value.typeDistribution||{},r=Object.values(e).reduce((u,g)=>u+g,0)||1;return Object.entries(e).map(([u,g])=>({type:u,count:g,percent:Math.round(g/r*100)})).sort((u,g)=>g.count-u.count)}),ge=U(()=>{const e=E.value.relationTypeDistribution||{},r=Object.values(e).reduce((u,g)=>u+g,0)||1;return Object.entries(e).map(([u,g])=>({type:u,count:g,percent:Math.round(g/r*100)})).sort((u,g)=>g.count-u.count)}),xe=U(()=>{const{nodes:e,links:r,categories:u}=rt(x.value,B.value);return{tooltip:{show:!0},legend:[{data:u.map(g=>g.name),textStyle:{color:"#aaa"},bottom:0}],series:[{type:"graph",layout:"force",data:e,links:r,categories:u,roam:!0,label:{show:!0,position:"right",color:"#ddd",fontSize:11},lineStyle:{color:"source",curveness:.1,opacity:.6},emphasis:{focus:"adjacency",lineStyle:{width:4}},force:{repulsion:180,edgeLength:[60,140],gravity:.05}}]}});async function M(){_.value=!0;try{await Promise.all([Ce(),Se(),Te()])}finally{_.value=!1}}async function Ce(){try{const{output:e}=await i.execute("kg list --limit 500 --json",15e3);x.value=tt(e)}catch(e){h.error(n("knowledgeGraph.msg.loadEntitiesFailed")+": "+e.message),x.value=[]}}async function Se(){try{const{output:e}=await i.execute("kg relations --limit 1000 --json",15e3);B.value=at(e)}catch(e){h.error(n("knowledgeGraph.msg.loadRelationsFailed")+": "+e.message),B.value=[]}}async function Te(){try{const{output:e}=await i.execute("kg stats --json",1e4);E.value=ot(e)}catch(e){h.error(n("knowledgeGraph.msg.loadStatsFailed")+": "+e.message)}}async function Re(){if(!(H.value.length>0)){T.value=!0;try{const{output:e}=await i.execute("kg entity-types --json",1e4);H.value=lt(e)}catch(e){h.error(n("knowledgeGraph.msg.loadEntityTypesFailed")+": "+e.message)}finally{T.value=!1}}}async function Ee(){if(!b.name.trim()||!b.type){h.warning(n("knowledgeGraph.msg.addEntityEmpty"));return}O.value=!0;try{let r=`kg add "${b.name.trim().replace(/"/g,'\\"')}" ${b.type} --json`;b.tags.trim()&&(r+=` --tags "${b.tags.trim().replace(/"/g,'\\"')}"`);const{output:u,exitCode:g}=await i.execute(r,15e3);g!==0||/error|失败/i.test(u)?h.error(n("knowledgeGraph.msg.addEntityFailed")+": "+u.slice(0,120)):(h.success(n("knowledgeGraph.msg.addEntitySuccess")),K.value=!1,b.name="",b.type="",b.tags="",await M())}catch(e){h.error(n("knowledgeGraph.msg.addEntityFailed")+": "+e.message)}finally{O.value=!1}}async function Ie(){if(!y.sourceId||!y.targetId||!y.relationType.trim()){h.warning(n("knowledgeGraph.msg.addRelationEmpty"));return}if(y.sourceId===y.targetId){h.warning(n("knowledgeGraph.msg.addRelationSelfLoop"));return}f.value=!0;try{const e=y.relationType.trim().replace(/"/g,'\\"'),r=`kg add-relation ${y.sourceId} ${y.targetId} "${e}" --weight ${y.weight} --json`,{output:u,exitCode:g}=await i.execute(r,15e3);g!==0||/error|失败/i.test(u)?h.error(n("knowledgeGraph.msg.addRelationFailed")+": "+u.slice(0,120)):(h.success(n("knowledgeGraph.msg.addRelationSuccess")),V.value=!1,y.sourceId="",y.targetId="",y.relationType="",y.weight=1,await M())}catch(e){h.error(n("knowledgeGraph.msg.addRelationFailed")+": "+e.message)}finally{f.value=!1}}async function De(e){Z.value=e.id;try{const{output:r,exitCode:u}=await i.execute(`kg remove ${e.id}`,15e3);u!==0||/error|失败/i.test(r)?h.error(n("knowledgeGraph.msg.deleteFailed")+": "+r.slice(0,120)):(h.success(n("knowledgeGraph.msg.deleteSuccess")),await M())}catch(r){h.error(n("knowledgeGraph.msg.deleteFailed")+": "+r.message)}finally{Z.value=""}}function Ae(e){de.value=e.id,ue.value=e.name,P.value=[],X.value=!0}async function Oe(){q.value=!0;try{const e=`kg reason ${de.value} --max-depth ${z.maxDepth} --direction ${z.direction} --json`,{output:r}=await i.execute(e,15e3);P.value=nt(r),P.value.length===0&&h.info(n("knowledgeGraph.msg.reasonEmpty"))}catch(e){h.error(n("knowledgeGraph.msg.reasonFailed")+": "+e.message)}finally{q.value=!1}}return et(()=>{M(),Re()}),(e,r)=>{const u=p("a-button"),g=p("a-space"),J=p("a-statistic"),I=p("a-card"),j=p("a-col"),me=p("a-row"),ze=p("a-alert"),te=p("a-empty"),Y=p("a-tab-pane"),D=p("a-tag"),je=p("a-popconfirm"),fe=p("a-table"),he=p("a-progress"),Fe=p("a-tabs"),ae=p("a-input"),C=p("a-form-item"),F=p("a-select-option"),Q=p("a-select"),oe=p("a-form"),ne=p("a-modal"),ve=p("a-input-number"),Le=p("a-list-item"),Ue=p("a-list");return d(),m("div",null,[$("div",it,[$("div",null,[$("h2",st,s(e.$t("knowledgeGraph.title")),1),$("p",dt,s(e.$t("knowledgeGraph.subtitle")),1)]),t(g,null,{default:a(()=>[t(u,{loading:_.value,onClick:M},{icon:a(()=>[t(S(We))]),default:a(()=>[c(" "+s(e.$t("knowledgeGraph.refresh")),1)]),_:1},8,["loading"]),t(u,{type:"primary",onClick:r[0]||(r[0]=o=>K.value=!0)},{icon:a(()=>[t(S(Ze))]),default:a(()=>[c(" "+s(e.$t("knowledgeGraph.addEntity")),1)]),_:1}),t(u,{onClick:r[1]||(r[1]=o=>V.value=!0),disabled:x.value.length<2},{icon:a(()=>[t(S(le))]),default:a(()=>[c(" "+s(e.$t("knowledgeGraph.addRelation")),1)]),_:1},8,["disabled"])]),_:1})]),t(me,{gutter:[16,16],style:{"margin-bottom":"20px"}},{default:a(()=>[t(j,{xs:24,sm:12,lg:6},{default:a(()=>[t(I,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[t(J,{title:e.$t("knowledgeGraph.stats.entityCount"),value:E.value.entityCount,"value-style":{color:"#1677ff",fontSize:"20px"}},{prefix:a(()=>[t(S(ke))]),_:1},8,["title","value"])]),_:1})]),_:1}),t(j,{xs:24,sm:12,lg:6},{default:a(()=>[t(I,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[t(J,{title:e.$t("knowledgeGraph.stats.relationCount"),value:E.value.relationCount,"value-style":{color:"#52c41a",fontSize:"20px"}},{prefix:a(()=>[t(S(le))]),_:1},8,["title","value"])]),_:1})]),_:1}),t(j,{xs:24,sm:12,lg:6},{default:a(()=>[t(I,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[t(J,{title:e.$t("knowledgeGraph.stats.avgDegree"),value:E.value.avgDegree,precision:2,"value-style":{color:"#faad14",fontSize:"20px"}},null,8,["title","value"])]),_:1})]),_:1}),t(j,{xs:24,sm:12,lg:6},{default:a(()=>[t(I,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[t(J,{title:e.$t("knowledgeGraph.stats.density"),value:E.value.density,precision:4,"value-style":{color:"#722ed1",fontSize:"20px"}},null,8,["title","value"])]),_:1})]),_:1})]),_:1}),k.value?G("",!0):(d(),R(ze,{key:0,message:e.$t("knowledgeGraph.webOnly.message"),description:e.$t("knowledgeGraph.webOnly.description"),type:"info","show-icon":"",closable:"",style:{"margin-bottom":"16px"}},null,8,["message","description"])),t(Fe,{activeKey:se.value,"onUpdate:activeKey":r[2]||(r[2]=o=>se.value=o),type:"card"},{default:a(()=>[t(Y,{key:"graph"},{tab:a(()=>[t(S(He)),c(" "+s(e.$t("knowledgeGraph.tabs.graph")),1)]),default:a(()=>[t(I,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[x.value.length===0?(d(),m("div",ut,[t(te,{description:e.$t("knowledgeGraph.table.emptyGraph")},null,8,["description"])])):(d(),m("div",pt,[t(S(Qe),{option:xe.value,autoresize:""},null,8,["option"])]))]),_:1})]),_:1}),t(Y,{key:"entities"},{tab:a(()=>[t(S(ke)),c(" "+s(e.$t("knowledgeGraph.tabs.entities",{n:x.value.length})),1)]),default:a(()=>[t(fe,{columns:be.value,"data-source":x.value,pagination:{pageSize:20,showTotal:o=>e.$t("knowledgeGraph.table.totalSuffix",{n:o})},size:"small",style:{background:"var(--bg-card)"},"row-class-name":()=>"kg-row"},{bodyCell:a(({column:o,record:w})=>[o.key==="id"?(d(),m("span",ct,s(w.id.slice(0,12)),1)):G("",!0),o.key==="name"?(d(),m("span",yt,s(w.name),1)):G("",!0),o.key==="type"?(d(),R(D,{key:2,color:ee(w.type)},{default:a(()=>[c(s(w.type),1)]),_:2},1032,["color"])):G("",!0),o.key==="tags"?(d(),m(A,{key:3},[(d(!0),m(A,null,L(w.tags,W=>(d(),R(D,{key:W,color:"default"},{default:a(()=>[c(s(W),1)]),_:2},1024))),128)),w.tags.length===0?(d(),m("span",gt,"-")):G("",!0)],64)):G("",!0),o.key==="action"?(d(),R(g,{key:4,size:"small"},{default:a(()=>[t(u,{size:"small",type:"link",onClick:W=>Ae(w)},{default:a(()=>[c(s(e.$t("knowledgeGraph.actions.reason")),1)]),_:1},8,["onClick"]),t(je,{title:e.$t("knowledgeGraph.deleteConfirm.title"),"ok-text":e.$t("knowledgeGraph.deleteConfirm.ok"),"ok-type":"danger","cancel-text":e.$t("knowledgeGraph.deleteConfirm.cancel"),onConfirm:W=>De(w)},{default:a(()=>[t(u,{size:"small",type:"link",danger:"",loading:Z.value===w.id},{default:a(()=>[c(s(e.$t("knowledgeGraph.actions.delete")),1)]),_:1},8,["loading"])]),_:2},1032,["title","ok-text","cancel-text","onConfirm"])]),_:2},1024)):G("",!0)]),emptyText:a(()=>[t(te,{description:e.$t("knowledgeGraph.table.emptyEntities")},null,8,["description"])]),_:1},8,["columns","data-source","pagination"])]),_:1}),t(Y,{key:"relations"},{tab:a(()=>[t(S(le)),c(" "+s(e.$t("knowledgeGraph.tabs.relations",{n:B.value.length})),1)]),default:a(()=>[t(fe,{columns:we.value,"data-source":B.value,pagination:{pageSize:20,showTotal:o=>e.$t("knowledgeGraph.table.totalSuffix",{n:o})},size:"small",style:{background:"var(--bg-card)"},"row-class-name":()=>"kg-row"},{bodyCell:a(({column:o,record:w})=>[o.key==="source"?(d(),m("span",mt,s(pe(w.sourceId)),1)):G("",!0),o.key==="arrow"?(d(),m("span",ft,"→")):G("",!0),o.key==="target"?(d(),m("span",ht,s(pe(w.targetId)),1)):G("",!0),o.key==="relationType"?(d(),R(D,{key:3,color:"cyan"},{default:a(()=>[c(s(w.relationType),1)]),_:2},1024)):G("",!0),o.key==="weight"?(d(),m("span",vt,s(w.weight.toFixed(2)),1)):G("",!0)]),emptyText:a(()=>[t(te,{description:e.$t("knowledgeGraph.table.emptyRelations")},null,8,["description"])]),_:1},8,["columns","data-source","pagination"])]),_:1}),t(Y,{key:"distribution"},{tab:a(()=>[t(S(Xe)),c(" "+s(e.$t("knowledgeGraph.tabs.distribution")),1)]),default:a(()=>[t(me,{gutter:[24,24]},{default:a(()=>[t(j,{xs:24,md:12},{default:a(()=>[t(I,{title:e.$t("knowledgeGraph.distribution.entityTypes"),style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[ye.value.length===0?(d(),m("div",kt,s(e.$t("knowledgeGraph.table.emptyData")),1)):G("",!0),(d(!0),m(A,null,L(ye.value,o=>(d(),m("div",{key:o.type,style:{"margin-bottom":"8px"}},[$("div",_t,[t(D,{color:ee(o.type)},{default:a(()=>[c(s(o.type),1)]),_:2},1032,["color"]),$("span",bt,s(o.count),1)]),t(he,{percent:o.percent,"show-info":!1,"stroke-color":"#1677ff"},null,8,["percent"])]))),128))]),_:1},8,["title"])]),_:1}),t(j,{xs:24,md:12},{default:a(()=>[t(I,{title:e.$t("knowledgeGraph.distribution.relationTypes"),style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[ge.value.length===0?(d(),m("div",wt,s(e.$t("knowledgeGraph.table.emptyData")),1)):G("",!0),(d(!0),m(A,null,L(ge.value,o=>(d(),m("div",{key:o.type,style:{"margin-bottom":"8px"}},[$("div",Gt,[t(D,{color:"cyan"},{default:a(()=>[c(s(o.type),1)]),_:2},1024),$("span",$t,s(o.count),1)]),t(he,{percent:o.percent,"show-info":!1,"stroke-color":"#52c41a"},null,8,["percent"])]))),128))]),_:1},8,["title"])]),_:1})]),_:1})]),_:1})]),_:1},8,["activeKey"]),t(ne,{open:K.value,"onUpdate:open":r[6]||(r[6]=o=>K.value=o),title:e.$t("knowledgeGraph.addEntity_modal.title"),"confirm-loading":O.value,onOk:Ee,"ok-text":e.$t("knowledgeGraph.addEntity_modal.ok"),"cancel-text":e.$t("knowledgeGraph.addEntity_modal.cancel")},{default:a(()=>[t(oe,{"label-col":{span:6},"wrapper-col":{span:18},style:{"margin-top":"16px"}},{default:a(()=>[t(C,{label:e.$t("knowledgeGraph.addEntity_modal.nameLabel"),required:""},{default:a(()=>[t(ae,{value:b.name,"onUpdate:value":r[3]||(r[3]=o=>b.name=o),placeholder:e.$t("knowledgeGraph.addEntity_modal.namePlaceholder")},null,8,["value","placeholder"])]),_:1},8,["label"]),t(C,{label:e.$t("knowledgeGraph.addEntity_modal.typeLabel"),required:""},{default:a(()=>[t(Q,{value:b.type,"onUpdate:value":r[4]||(r[4]=o=>b.type=o),placeholder:e.$t("knowledgeGraph.addEntity_modal.typePlaceholder"),loading:T.value},{default:a(()=>[(d(!0),m(A,null,L(H.value,o=>(d(),R(F,{key:o.name,value:o.name},{default:a(()=>[c(s(o.name)+" ",1),$("span",xt,"— "+s(o.description),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value","placeholder","loading"])]),_:1},8,["label"]),t(C,{label:e.$t("knowledgeGraph.addEntity_modal.tagsLabel")},{default:a(()=>[t(ae,{value:b.tags,"onUpdate:value":r[5]||(r[5]=o=>b.tags=o),placeholder:e.$t("knowledgeGraph.addEntity_modal.tagsPlaceholder")},null,8,["value","placeholder"])]),_:1},8,["label"])]),_:1})]),_:1},8,["open","title","confirm-loading","ok-text","cancel-text"]),t(ne,{open:V.value,"onUpdate:open":r[11]||(r[11]=o=>V.value=o),title:e.$t("knowledgeGraph.addRelation_modal.title"),"confirm-loading":f.value,onOk:Ie,"ok-text":e.$t("knowledgeGraph.addRelation_modal.ok"),"cancel-text":e.$t("knowledgeGraph.addRelation_modal.cancel")},{default:a(()=>[t(oe,{"label-col":{span:6},"wrapper-col":{span:18},style:{"margin-top":"16px"}},{default:a(()=>[t(C,{label:e.$t("knowledgeGraph.addRelation_modal.sourceLabel"),required:""},{default:a(()=>[t(Q,{value:y.sourceId,"onUpdate:value":r[7]||(r[7]=o=>y.sourceId=o),placeholder:e.$t("knowledgeGraph.addRelation_modal.sourcePlaceholder"),"show-search":"","filter-option":ce},{default:a(()=>[(d(!0),m(A,null,L(x.value,o=>(d(),R(F,{key:o.id,value:o.id},{default:a(()=>[c(s(o.name)+" ("+s(o.type)+") ",1)]),_:2},1032,["value"]))),128))]),_:1},8,["value","placeholder"])]),_:1},8,["label"]),t(C,{label:e.$t("knowledgeGraph.addRelation_modal.targetLabel"),required:""},{default:a(()=>[t(Q,{value:y.targetId,"onUpdate:value":r[8]||(r[8]=o=>y.targetId=o),placeholder:e.$t("knowledgeGraph.addRelation_modal.targetPlaceholder"),"show-search":"","filter-option":ce},{default:a(()=>[(d(!0),m(A,null,L(x.value,o=>(d(),R(F,{key:o.id,value:o.id,disabled:o.id===y.sourceId},{default:a(()=>[c(s(o.name)+" ("+s(o.type)+") ",1)]),_:2},1032,["value","disabled"]))),128))]),_:1},8,["value","placeholder"])]),_:1},8,["label"]),t(C,{label:e.$t("knowledgeGraph.addRelation_modal.relationTypeLabel"),required:""},{default:a(()=>[t(ae,{value:y.relationType,"onUpdate:value":r[9]||(r[9]=o=>y.relationType=o),placeholder:e.$t("knowledgeGraph.addRelation_modal.relationTypePlaceholder")},null,8,["value","placeholder"])]),_:1},8,["label"]),t(C,{label:e.$t("knowledgeGraph.addRelation_modal.weightLabel")},{default:a(()=>[t(ve,{value:y.weight,"onUpdate:value":r[10]||(r[10]=o=>y.weight=o),min:.1,max:10,step:.1,style:{width:"100%"}},null,8,["value"])]),_:1},8,["label"])]),_:1})]),_:1},8,["open","title","confirm-loading","ok-text","cancel-text"]),t(ne,{open:X.value,"onUpdate:open":r[14]||(r[14]=o=>X.value=o),title:e.$t("knowledgeGraph.reason_modal.title",{name:ue.value}),width:640,footer:null},{default:a(()=>[t(oe,{layout:"inline",style:{"margin-bottom":"16px"}},{default:a(()=>[t(C,{label:e.$t("knowledgeGraph.reason_modal.maxDepth")},{default:a(()=>[t(ve,{value:z.maxDepth,"onUpdate:value":r[12]||(r[12]=o=>z.maxDepth=o),min:1,max:10},null,8,["value"])]),_:1},8,["label"]),t(C,{label:e.$t("knowledgeGraph.reason_modal.direction")},{default:a(()=>[t(Q,{value:z.direction,"onUpdate:value":r[13]||(r[13]=o=>z.direction=o),style:{width:"100px"}},{default:a(()=>[t(F,{value:"out"},{default:a(()=>[c(s(e.$t("knowledgeGraph.reason_modal.directionOut")),1)]),_:1}),t(F,{value:"in"},{default:a(()=>[c(s(e.$t("knowledgeGraph.reason_modal.directionIn")),1)]),_:1}),t(F,{value:"both"},{default:a(()=>[c(s(e.$t("knowledgeGraph.reason_modal.directionBoth")),1)]),_:1})]),_:1},8,["value"])]),_:1},8,["label"]),t(C,null,{default:a(()=>[t(u,{type:"primary",loading:q.value,onClick:Oe},{default:a(()=>[c(s(e.$t("knowledgeGraph.reason_modal.run")),1)]),_:1},8,["loading"])]),_:1})]),_:1}),P.value.length===0&&!q.value?(d(),m("div",Ct,s(e.$t("knowledgeGraph.reason_modal.hint")),1)):(d(),R(Ue,{key:1,"data-source":P.value,size:"small"},{renderItem:a(({item:o})=>[t(Le,null,{default:a(()=>[t(D,{color:"purple"},{default:a(()=>[c("depth="+s(o.depth),1)]),_:2},1024),t(D,{color:ee(o.entity.type),style:{"margin-left":"8px"}},{default:a(()=>[c(s(o.entity.type),1)]),_:2},1032,["color"]),$("span",St,s(o.entity.name),1),$("span",Tt,s(o.entity.id.slice(0,12)),1)]),_:2},1024)]),_:1},8,["data-source"]))]),_:1},8,["open","title"])])}}},Ot=Be(Rt,[["__scopeId","data-v-d675e73f"]]);export{Ot as default};
@@ -1 +0,0 @@
1
- .page-title[data-v-4f26d5df]{margin:0 0 4px;font-size:20px}.page-sub[data-v-4f26d5df]{margin:0;color:#888;font-size:13px}