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.
- package/package.json +2 -1
- package/src/assets/web-panel/.build-hash +1 -1
- package/src/assets/web-panel/assets/{AIOps-5A54O3wF.js → AIOps-BHcJlF4M.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-epuY2GkZ.js → ActionButton-QNqNYP_E.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-CIdxw7T5.js → Analytics-DWrmU2MM.js} +2 -2
- package/src/assets/web-panel/assets/AppLayout-0BXhjvFX.js +3 -0
- package/src/assets/web-panel/assets/{AppLayout-DBgtkmP7.css → AppLayout-BLCe1k8m.css} +1 -1
- package/src/assets/web-panel/assets/{Audit-D95nRcdZ.js → Audit-Cns_OJ3y.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-Cmw7ZTJD.js → Backup-BWXKm8S2.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-DgCEAL_E.js → BaseInput-DMtM90I4.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-DAQAzZsA.js → Chat-CPSQIJkd.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-GRxUANnE.js → Checkbox-CdoTzEcu.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen--6KIDt1W.js → Codegen-DiMm-2CJ.js} +1 -1
- package/src/assets/web-panel/assets/{Col-3s6dxuMx.js → Col-Dw8uRsh8.js} +1 -1
- package/src/assets/web-panel/assets/{Community-D60pkEBz.js → Community-DF6oPrrt.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-CQR4QsWP.js → Compact-DDeBOvFc.js} +1 -1
- package/src/assets/web-panel/assets/Compliance-cpcX8foc.js +1 -0
- package/src/assets/web-panel/assets/{Cowork-Yrrf_Vuu.js → Cowork-BnF4dCvO.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-DSuuSKIQ.js → Cron-CNm5yzGt.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-Dub0G9i4.js → Crosschain-1fdaoWnO.js} +1 -1
- package/src/assets/web-panel/assets/{DID-CbpCGV51.js → DID-CgWgrQjr.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-D29e0y01.js → Dashboard-dGcTq_hg.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-DZY7X5v2.js → Dropdown-CMcWp2f1.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-dmrLzzMB.js → Federation-BVmtVOzD.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-EopsCGez.js → FormItemContext-BTuMR6zf.js} +1 -1
- package/src/assets/web-panel/assets/{Git-D3mb4RhK.js → Git-2itzzOWU.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-8v034-Nr.js → Governance-BD5nFtjx.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-Ddl-HQwQ.js → Inference-BqTjotuw.js} +1 -1
- package/src/assets/web-panel/assets/KnowledgeGraph-CkJCUp_X.js +1 -0
- package/src/assets/web-panel/assets/{Logs-Bsu6lYQe.js → Logs-BezIQuu3.js} +1 -1
- package/src/assets/web-panel/assets/{Marketplace-Iyf2Xc23.js → Marketplace-BQi8NC94.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-ljVE1lIN.js → McpTools-UDm4tI8g.js} +1 -1
- package/src/assets/web-panel/assets/{Memory-Ca48TtDU.js → Memory-b3k3SJXP.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-DZ3Ar6da.js → MobileBridge-CHysUGzj.js} +1 -1
- package/src/assets/web-panel/assets/MobileProjects-Ceaxrqzc.css +1 -0
- package/src/assets/web-panel/assets/MobileProjects-H5DjqNIw.js +1 -0
- package/src/assets/web-panel/assets/{Mtc-CRjBnVAT.js → Mtc-B-kn2cbZ.js} +4 -4
- package/src/assets/web-panel/assets/{MtcAudit-CEC2eKez.js → MtcAudit-BSeDGJAO.js} +1 -1
- package/src/assets/web-panel/assets/{Multisig-BHoQvNeL.js → Multisig-BSwWbNCn.js} +2 -2
- package/src/assets/web-panel/assets/{NLProgramming-9e5hIFvL.js → NLProgramming-B7fTKT9-.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-BEhZRadw.js → Notes-CE7Dxyik.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-CzPbT9UE.js → NotificationSettings-BrWPb12X.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-CvFg4VAr.js → Organization-BvMcmpZ-.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-Cm7ISeJl.js → Overflow-9VpUiyX3.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-BWN-wdfH.js → P2P-CZiZLuH6.js} +2 -2
- package/src/assets/web-panel/assets/{Permissions-C4vKkP_t.js → Permissions-7xPYU8o3.js} +4 -4
- package/src/assets/web-panel/assets/PersonalDataHub-BoAsj3rP.js +1 -0
- package/src/assets/web-panel/assets/PersonalDataHub-C5HcGC5x.css +1 -0
- package/src/assets/web-panel/assets/{Pipeline-DQCShDeT.js → Pipeline-BXmWkBtJ.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-Nc7LlSr3.js → Privacy-Bowi-wqF.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-DDkqXAED.js → ProjectInit-BW1Xj7_l.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-ia6GQr6A.js → ProjectSettings-pDbBvJFG.js} +1 -1
- package/src/assets/web-panel/assets/Projects-BX-SG9R4.css +1 -0
- package/src/assets/web-panel/assets/Projects-D32hRs2K.js +1 -0
- package/src/assets/web-panel/assets/{Providers-EwarbUb8.js → Providers-fvnKRdFc.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-BAHQBw0d.js → QuickAsk-DBZrimTb.js} +1 -1
- package/src/assets/web-panel/assets/Recommend-B_leuPdE.js +1 -0
- package/src/assets/web-panel/assets/{Reputation-ai0gRNpj.js → Reputation-9YJu2Q0s.js} +1 -1
- package/src/assets/web-panel/assets/{Row-BWLfAhHC.js → Row-BwDaJw-R.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-CnuRtiQH.js → RssFeed-CCwGtGbs.js} +3 -3
- package/src/assets/web-panel/assets/{Search-Da0CvI_2.js → Search-CLdXqpfz.js} +1 -1
- package/src/assets/web-panel/assets/{Security-DEFeOeUv.js → Security-_It0GsWS.js} +3 -3
- package/src/assets/web-panel/assets/Services-jBxBWGGT.js +2 -0
- package/src/assets/web-panel/assets/{Skeleton-DlRaGj_n.js → Skeleton-DR_EuFFW.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-fjlZrsYq.js → Skills-DsHcMNEk.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-DNSDuEt2.js → Sla-Be0UaX-h.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-Bj0t-JCf.js → SpeechSettings-uUhDyyHj.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-uO7Gy-BB.js → SyncSettings-CUAwaSnj.js} +1 -1
- package/src/assets/web-panel/assets/{Tasks-BSjsO-m8.js → Tasks-CUVZww9Q.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-B03SSuXn.js → Templates-WLZcNzJ_.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-CTCPIBzq.js → Tenant-FgN0uYm6.js} +1 -1
- package/src/assets/web-panel/assets/Terminal-BzLHjHyj.js +3 -0
- package/src/assets/web-panel/assets/Tokens-z7lyRr40.js +1 -0
- package/src/assets/web-panel/assets/{Trigger-kYPQmm6P.js → Trigger-HxLdC9ne.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-mt-MiBeI.js → Trust-DggmMxpI.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-DBi8jgXw.js → UkeySign-BO-pKTZ_.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-CINSMEf5.js → VideoEditing-DdLdJ9Ps.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-DCVMgW0U.js → Wallet-F8EfdQDN.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-C9OjbTBs.js → WebAuthn-Bi2Kf8Ev.js} +5 -5
- package/src/assets/web-panel/assets/{WorkflowEditor-LM1HJs-S.js → WorkflowEditor-DUHk4Y0A.js} +1 -1
- package/src/assets/web-panel/assets/{chat-Dz68Ixdp.js → chat-BMz8ik6R.js} +1 -1
- package/src/assets/web-panel/assets/{colors-qf63Eax9.js → colors-DTTx1bVY.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-r4YWRFGQ.js → compact-item-BjZyyKpa.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-C8Lwrn-C.js → createContext-D0Ztn7R_.js} +1 -1
- package/src/assets/web-panel/assets/{hasIn-DsPi2kPP.js → hasIn-BeXm1bJ2.js} +1 -1
- package/src/assets/web-panel/assets/{icons-NT6gy8Ee.js → icons-BFHq5fEF.js} +4 -4
- package/src/assets/web-panel/assets/{index-C8SY0_S8.js → index-BDRzvi5v.js} +1 -1
- package/src/assets/web-panel/assets/{index-BfdIkZnT.js → index-BDmMBKM_.js} +1 -1
- package/src/assets/web-panel/assets/{index-BxNXO95B.js → index-BHuIMHcS.js} +1 -1
- package/src/assets/web-panel/assets/{index-C2OFaKmx.js → index-BODKOjRZ.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bz1O2KhE.js → index-BUFpZk0I.js} +1 -1
- package/src/assets/web-panel/assets/{index-qcVx0s-M.js → index-BWRsbH6v.js} +1 -1
- package/src/assets/web-panel/assets/{index-CEbbycgJ.js → index-B_juAGfN.js} +4 -4
- package/src/assets/web-panel/assets/{index-B8gs4g1v.js → index-BiAjZ9Iq.js} +1 -1
- package/src/assets/web-panel/assets/{index-DGXVjiyF.js → index-BxIq_rps.js} +1 -1
- package/src/assets/web-panel/assets/{index-CSCb-EY9.js → index-By4zsU8r.js} +1 -1
- package/src/assets/web-panel/assets/{index-BFV6aAoX.js → index-C6Isxhje.js} +1 -1
- package/src/assets/web-panel/assets/{index-1xqIvVM5.js → index-CGudWWwE.js} +1 -1
- package/src/assets/web-panel/assets/{index-C3VVwJcn.js → index-CobyvwP0.js} +1 -1
- package/src/assets/web-panel/assets/{index-cTFVNgoS.js → index-CqkwXe3s.js} +1 -1
- package/src/assets/web-panel/assets/{index-BtCSUUKm.js → index-CuDNPqlD.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cw48kkkH.js → index-D-niPBwZ.js} +1 -1
- package/src/assets/web-panel/assets/{index-BzzFMBIM.js → index-D1CV-6q1.js} +1 -1
- package/src/assets/web-panel/assets/{index-B0KxtBNy.js → index-D1coHqyT.js} +1 -1
- package/src/assets/web-panel/assets/{index-CY5X4uXO.js → index-DB1i3Cfr.js} +1 -1
- package/src/assets/web-panel/assets/{index-D2BR3WQ-.js → index-DIoinlAY.js} +1 -1
- package/src/assets/web-panel/assets/index-DJOgV0SI.js +1 -0
- package/src/assets/web-panel/assets/{index-BKEl9Ahm.js → index-DLDHcuz4.js} +1 -1
- package/src/assets/web-panel/assets/{index-CqmyLTa_.js → index-DLJnAsec.js} +1 -1
- package/src/assets/web-panel/assets/{index-D4XgKgOF.js → index-DMvkBq2d.js} +1 -1
- package/src/assets/web-panel/assets/{index-LQYz2tRO.js → index-DRNxWV3i.js} +1 -1
- package/src/assets/web-panel/assets/{index-BjPHuhxG.js → index-DTzwBmBS.js} +1 -1
- package/src/assets/web-panel/assets/{index-CINVudo7.js → index-DXSXIknb.js} +1 -1
- package/src/assets/web-panel/assets/{index-DycrmZ_r.js → index-Da_XUjv2.js} +1 -1
- package/src/assets/web-panel/assets/{index-CKRXnUTD.js → index-DfxUN2LB.js} +1 -1
- package/src/assets/web-panel/assets/{index-DBpVVgRI.js → index-DnATlZR7.js} +1 -1
- package/src/assets/web-panel/assets/{index-D0mFFS7Y.js → index-Dx7XPVkb.js} +1 -1
- package/src/assets/web-panel/assets/index-FpewH8xy.js +1 -0
- package/src/assets/web-panel/assets/{index-qLyVEtRM.js → index-JTN4jzka.js} +1 -1
- package/src/assets/web-panel/assets/{index-CCCX2ZSH.js → index-NppMuZBM.js} +1 -1
- package/src/assets/web-panel/assets/{index-DQSweK5-.js → index-OjH2wDtW.js} +1 -1
- package/src/assets/web-panel/assets/{index-5nOMJaLt.js → index-aBdRRXWO.js} +1 -1
- package/src/assets/web-panel/assets/{index-DXBc_lyR.js → index-nwkYgoRS.js} +1 -1
- package/src/assets/web-panel/assets/{index-wVpfPJXE.js → index-tUIluCPu.js} +1 -1
- package/src/assets/web-panel/assets/{index-I55BAmVG.js → index-xN0WCVmC.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-CAgx2aHm.js → initDefaultProps-DE_gVS_i.js} +1 -1
- package/src/assets/web-panel/assets/{motion-DFuREFOd.js → motion-BiRUGscQ.js} +1 -1
- package/src/assets/web-panel/assets/{move-DfcQIXuy.js → move-DMEzVMJZ.js} +1 -1
- package/src/assets/web-panel/assets/{omit-BFZV2hmZ.js → omit-DBh74Ui4.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-D98WQSur.js → pickAttrs-D6PQbWuo.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-BlP2AN9q.js → placementArrow-BYkdt9jF.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-DuI2xGQd.js → responsiveObserve-C2ES6P0V.js} +1 -1
- package/src/assets/web-panel/assets/{slide-DSvqah_S.js → slide-zGdjevxe.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-B-96ZLWF.js → statusUtils-Cf6eRpR7.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-Br0YrCOO.js → styleChecker-DZZx_bHs.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-BD4Xr9XU.js → useFlexGapSupport-B6q6zt9X.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-Ch5L3BnA.js → useFs-DjaBUk_P.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-BQi3uWRC.js → vnode-CDF4X084.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-DaW-jbu7.js → zoom-C9FCvBpV.js} +1 -1
- package/src/assets/web-panel/index.html +2 -2
- package/src/commands/ui.js +21 -3
- package/src/gateways/ws/message-dispatcher.js +34 -0
- package/src/gateways/ws/personal-data-hub-protocol.js +133 -0
- package/src/lib/personal-data-hub-wiring.js +310 -0
- package/src/runtime/agent-runtime.js +85 -11
- package/src/assets/web-panel/assets/AppLayout-xR6YUHsS.js +0 -3
- package/src/assets/web-panel/assets/Compliance-KySNEhMK.js +0 -1
- package/src/assets/web-panel/assets/KnowledgeGraph-DrRruyud.js +0 -1
- package/src/assets/web-panel/assets/Projects-0OrfK90x.css +0 -1
- package/src/assets/web-panel/assets/Projects-CNqXa5XY.js +0 -1
- package/src/assets/web-panel/assets/Recommend-Ccgu6elV.js +0 -1
- package/src/assets/web-panel/assets/Services-CsfvCqCH.js +0 -2
- package/src/assets/web-panel/assets/Terminal-CQZcdArx.js +0 -3
- package/src/assets/web-panel/assets/Tokens-CsNJIdNl.js +0 -1
- package/src/assets/web-panel/assets/index-B3blziag.js +0 -1
- 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
|
-
|
|
640
|
-
|
|
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}
|