chainlesschain 0.162.11 → 0.162.13
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/README.md +30 -25
- package/package.json +4 -1
- package/src/assets/web-panel/.build-hash +1 -1
- package/src/assets/web-panel/assets/{AIOps-ebtJGjAG.js → AIOps-Bq_zxhCr.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-CypkRN-G.js → ActionButton-CaevDm9t.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-B2JMlIng.js → Analytics-B0gOmwPw.js} +1 -1
- package/src/assets/web-panel/assets/{AppLayout-B8QQ4pk7.js → AppLayout-DWhZiV0Q.js} +2 -2
- package/src/assets/web-panel/assets/{Audit-BoYaAyFa.js → Audit-ZuZJBCxo.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-BfackGZ5.js → Backup-CX7jhH5l.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-C06FUpDz.js → BaseInput-CVLx7HVq.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-BWxMkBYZ.js → Chat-C6yL5tRD.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-XJMvS3PV.js → Checkbox-BePhbqVq.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-CzR462RK.js → Codegen-B5E4x1Lm.js} +1 -1
- package/src/assets/web-panel/assets/{Col-BQHpLNCA.js → Col-CWhNU6A7.js} +1 -1
- package/src/assets/web-panel/assets/{Community-BWRRbJYd.js → Community-mSEAuJhp.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-BunoKIy9.js → Compact-DSudHzX3.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-CtJfZctm.js → Compliance-CxJLYjyn.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-ER5-_bod.js → Cowork-C-trppQj.js} +1 -1
- package/src/assets/web-panel/assets/{Cron-C80jYBw1.js → Cron-_Ij4v5fY.js} +1 -1
- package/src/assets/web-panel/assets/{Crosschain-fEMlCNsL.js → Crosschain-eLHXzp5T.js} +1 -1
- package/src/assets/web-panel/assets/{DID-BZpctKmU.js → DID-BP04AUUB.js} +1 -1
- package/src/assets/web-panel/assets/{Dashboard-RQhZmLi4.js → Dashboard-CzEeQv62.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-CrpwS84l.js → Dropdown-C_SGOB22.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-BEQyZtdR.js → Federation-BgaP4BOv.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-DCwvl6Vh.js → FormItemContext-BxGLLt9r.js} +1 -1
- package/src/assets/web-panel/assets/{Git-6FihOxMK.js → Git-Bt_uM_Gw.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-DlBLHSlJ.js → Governance-N2-0RG_o.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-DdSokzV0.js → Inference-eS3g-CzP.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-bg8GBHMr.js → KnowledgeGraph-CUuvNVah.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-DdFYdLQ-.js → Logs-wPbwEt2r.js} +1 -1
- package/src/assets/web-panel/assets/{Marketplace-DjnlAeYF.js → Marketplace-DH91kTwo.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-Czs41YUh.js → McpTools-D-GyyBrI.js} +1 -1
- package/src/assets/web-panel/assets/{Memory-CX0b3c8D.js → Memory-BOtUy-tw.js} +1 -1
- package/src/assets/web-panel/assets/{MobileBridge-BoFGb9Mm.js → MobileBridge-DIP__XQd.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-B8qQ9H-0.js → MobileProjects-1nqr1UsU.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-CRF1NLae.js → Mtc-CCE0x7h2.js} +1 -1
- package/src/assets/web-panel/assets/{MtcAudit-CdCm70cJ.js → MtcAudit-BBkz0XUO.js} +1 -1
- package/src/assets/web-panel/assets/{Multisig-yoZlpq2Y.js → Multisig-CIKSJvTY.js} +2 -2
- package/src/assets/web-panel/assets/{NLProgramming-hFCgqDxJ.js → NLProgramming-BDkgeFcq.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-DC8pnxs-.js → Notes-ONiUxfN1.js} +1 -1
- package/src/assets/web-panel/assets/{NotificationSettings-DDVg5Nc8.js → NotificationSettings-CGcyKEIe.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-0YCtAFMS.js → Organization-BZtMYBJt.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-DhPLoAdz.js → Overflow-C4LfFZAI.js} +1 -1
- package/src/assets/web-panel/assets/{OverrideContext-x9ZzjLwk.js → OverrideContext-C_4H9tGA.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-BWpuJhkD.js → P2P-D71Cpk-m.js} +1 -1
- package/src/assets/web-panel/assets/{Permissions-B4IrizO9.js → Permissions-DRGYF29v.js} +1 -1
- package/src/assets/web-panel/assets/PersonalDataHub-CfRYoIua.js +1 -0
- package/src/assets/web-panel/assets/PersonalDataHub-Dvaa8niQ.css +1 -0
- package/src/assets/web-panel/assets/{Pipeline-M65jR6sq.js → Pipeline-BOyp0_Qo.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-BeO8zLup.js → Privacy-a_AcphvF.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-Ck_ZjrVZ.js → ProjectInit-CFu1grYt.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectSettings-ijn-97s0.js → ProjectSettings-p54Eivhh.js} +1 -1
- package/src/assets/web-panel/assets/{Projects-BsNBemeh.js → Projects-DkB88XAu.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-CI7UxKVO.js → Providers-EK7f8DEd.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-dE2M1KOB.js → QuickAsk-CpO0w3iP.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-B30EgbKS.js → Recommend-BUJVQdv9.js} +1 -1
- package/src/assets/web-panel/assets/{Reputation-CV6n7wMx.js → Reputation-kU2fOuZt.js} +1 -1
- package/src/assets/web-panel/assets/{Row-DSaoTjlN.js → Row-oGWRbk6g.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-_NgBmHaC.js → RssFeed-saC_46Yo.js} +1 -1
- package/src/assets/web-panel/assets/{Search-B341ooTV.js → Search-CjtRqFUu.js} +1 -1
- package/src/assets/web-panel/assets/{Security-CqCQD8hf.js → Security-BX0NBVfQ.js} +1 -1
- package/src/assets/web-panel/assets/{Services-Cju_95rB.js → Services-Bgxsnei_.js} +1 -1
- package/src/assets/web-panel/assets/{Skeleton-kh_uW22l.js → Skeleton-CwBb3k2a.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-BVRPgciI.js → Skills-CZCMYH6Z.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-y-vKFYkI.js → Sla-Djy1uHnZ.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-BXJm9zyo.js → SpeechSettings-CGUI_Uyh.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-BmHZR-Kv.js → SyncSettings-DK2CKHRD.js} +1 -1
- package/src/assets/web-panel/assets/{Tasks-C7zmYW9f.js → Tasks-BKiOzeIO.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-DVEG7FdA.js → Templates-CnQpleXj.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-CpvjzPCo.js → Tenant-DwKz0cjm.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-D_Wpp2iE.js → Terminal-A7t_wsR8.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-QBrjdNqi.js → Tokens-BqYY9l44.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-BhR_VEvQ.js → Trigger-BI4bXFmi.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-C0xhM2lC.js → Trust-yMynKTRG.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-BnyP-W3-.js → UkeySign-Br4IScM6.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-C5Y8MyEK.js → VideoEditing-CWcThGsP.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-DzCPCQNF.js → Wallet-CZcAtjxj.js} +1 -1
- package/src/assets/web-panel/assets/{WebAuthn-6X5bLtHU.js → WebAuthn-BnTZFMA0.js} +3 -3
- package/src/assets/web-panel/assets/{WorkflowEditor-ekS27G9f.js → WorkflowEditor-N7gGz3_n.js} +1 -1
- package/src/assets/web-panel/assets/{chat-BikodUwh.js → chat-D175ZIO0.js} +1 -1
- package/src/assets/web-panel/assets/{collapseMotion-CjFH_Jop.js → collapseMotion-DfnRZex1.js} +1 -1
- package/src/assets/web-panel/assets/{colors-8yIg5K7E.js → colors-LKhZyttv.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-MLWo5-GY.js → compact-item-CsJSebxT.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-nir7ccDv.js → createContext-BJ_CPYFC.js} +1 -1
- package/src/assets/web-panel/assets/{echarts-Bq-n0MtJ.js → echarts-Dj_pBaVI.js} +1 -1
- package/src/assets/web-panel/assets/{hasIn-DxUIHW2P.js → hasIn-CzD3IqH8.js} +1 -1
- package/src/assets/web-panel/assets/{icons-CLQTHa5-.js → icons-BOPtEWK4.js} +4 -4
- package/src/assets/web-panel/assets/{index-vVrIg9Jk.js → index-6qPbrYF7.js} +1 -1
- package/src/assets/web-panel/assets/{index-CCGf6IJj.js → index-B7UYymse.js} +1 -1
- package/src/assets/web-panel/assets/{index-DSjWvxVr.js → index-BDSZDDb2.js} +4 -4
- package/src/assets/web-panel/assets/{index-BURKtxBq.js → index-BEDFHKO3.js} +1 -1
- package/src/assets/web-panel/assets/{index-q3Lr2UzW.js → index-BMvdoiFr.js} +1 -1
- package/src/assets/web-panel/assets/{index-BgQtoOHc.js → index-BNVLVzN5.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bn5VWKW1.js → index-BSNibAqz.js} +1 -1
- package/src/assets/web-panel/assets/{index-4SFekeAy.js → index-BV-__mlC.js} +1 -1
- package/src/assets/web-panel/assets/{index-CfeuuE7v.js → index-BXH9ujMW.js} +1 -1
- package/src/assets/web-panel/assets/{index-h05fIj9Q.js → index-BZluCuTH.js} +1 -1
- package/src/assets/web-panel/assets/{index-9Y0IyfeM.js → index-BhiZDGg7.js} +1 -1
- package/src/assets/web-panel/assets/{index-BkMtxzcM.js → index-BjOrt4vw.js} +1 -1
- package/src/assets/web-panel/assets/{index-DOIryna2.js → index-BmJdof_c.js} +2 -2
- package/src/assets/web-panel/assets/{index-TB5vrA0Z.js → index-BsirlkJ0.js} +1 -1
- package/src/assets/web-panel/assets/{index-BgHPrMXP.js → index-BvF2tC6C.js} +1 -1
- package/src/assets/web-panel/assets/{index-BSIaRmzU.js → index-C2HBKw07.js} +1 -1
- package/src/assets/web-panel/assets/{index-CkSN2Ki_.js → index-CKjBAdm0.js} +1 -1
- package/src/assets/web-panel/assets/{index-DLiexKJ2.js → index-CRGNuUIM.js} +1 -1
- package/src/assets/web-panel/assets/{index-CeX-HLIi.js → index-CTIkCKav.js} +1 -1
- package/src/assets/web-panel/assets/index-CY1mQA2I.js +1 -0
- package/src/assets/web-panel/assets/{index-78olN7S9.js → index-CyHdYUeZ.js} +1 -1
- package/src/assets/web-panel/assets/{index-BcyG-9vV.js → index-D401L3yx.js} +1 -1
- package/src/assets/web-panel/assets/{index-C_W1kVtY.js → index-D5IZCkZG.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bpa9senE.js → index-D7ZcBI5s.js} +1 -1
- package/src/assets/web-panel/assets/{index-dgZZAsxo.js → index-D8kltMTW.js} +1 -1
- package/src/assets/web-panel/assets/index-D9nXHfUB.js +1 -0
- package/src/assets/web-panel/assets/{index-DkIon-Gv.js → index-DJVkBmSc.js} +1 -1
- package/src/assets/web-panel/assets/{index-C-UB9bYd.js → index-DM3uBEWD.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dx5xZmzt.js → index-DOO73rHE.js} +1 -1
- package/src/assets/web-panel/assets/{index-DVLJ1iGu.js → index-DXp1jVsK.js} +1 -1
- package/src/assets/web-panel/assets/{index-S8mYImvf.js → index-Dd7dICwB.js} +1 -1
- package/src/assets/web-panel/assets/{index-SUYLhwZI.js → index-Dm-3kvtD.js} +1 -1
- package/src/assets/web-panel/assets/{index-C_Xi08tu.js → index-DnPt5OdD.js} +1 -1
- package/src/assets/web-panel/assets/{index-hu-wjfWv.js → index-E7t1hAnk.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cp-YnzHN.js → index-JTX9A7w0.js} +1 -1
- package/src/assets/web-panel/assets/{index-8qrwsaKy.js → index-Kn-Of5ew.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dl-O2OkQ.js → index-R1cFADfk.js} +1 -1
- package/src/assets/web-panel/assets/{index-yfNusVbo.js → index-RIO4JKMP.js} +1 -1
- package/src/assets/web-panel/assets/{index-DDmc4cig.js → index-uTEVWPYA.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-xUjF_bq0.js → initDefaultProps-CBW0okek.js} +1 -1
- package/src/assets/web-panel/assets/{motion-B019-Q6h.js → motion-DGAffQ0Z.js} +1 -1
- package/src/assets/web-panel/assets/{move-D2XYj_gA.js → move-DFJ0-5IW.js} +1 -1
- package/src/assets/web-panel/assets/{omit-AIzzlguv.js → omit-AvrDghg1.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-CRkEQaLs.js → pickAttrs-D7csw9i1.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-s4kAStH6.js → placementArrow-hZ6Lg6kG.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-BCsWrTkb.js → responsiveObserve-DLLx5VvS.js} +1 -1
- package/src/assets/web-panel/assets/{slide-B_Hggtvv.js → slide-BaRIT3ev.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-DnNf15VW.js → statusUtils-Cdjyuhrz.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-CSQdy9SQ.js → styleChecker-CbrNybTt.js} +1 -1
- package/src/assets/web-panel/assets/useFlexGapSupport-B8gAhiRC.js +1 -0
- package/src/assets/web-panel/assets/{useFs-D78PlgeG.js → useFs-BZPy4ICP.js} +1 -1
- package/src/assets/web-panel/assets/{useMergedState-O7QXt4P5.js → useMergedState-WwedrFR0.js} +1 -1
- package/src/assets/web-panel/assets/{useRefs-0J6m8UWN.js → useRefs-Cdq8EWeF.js} +1 -1
- package/src/assets/web-panel/assets/{useState-CSzR8F8O.js → useState-DGS1NOyn.js} +1 -1
- package/src/assets/web-panel/assets/{vendor-M5lGV-wr.js → vendor-DhFY8mDK.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-BTMmpsWu.js → vnode-6Y0NDMVv.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-CwOTbvKc.js → zoom-DTbMGsSH.js} +1 -1
- package/src/assets/web-panel/index.html +3 -3
- package/src/commands/__tests__/hub-aichat.test.js +277 -0
- package/src/commands/__tests__/hub-wechat.test.js +243 -0
- package/src/commands/hub.js +881 -0
- package/src/commands/sync-providers.js +436 -0
- package/src/gateways/ws/personal-data-hub-protocol.js +68 -0
- package/src/index.js +6 -0
- package/src/lib/__tests__/personal-data-hub-aichat-wizard.test.js +209 -0
- package/src/lib/__tests__/sync-credentials.test.js +265 -0
- package/src/lib/__tests__/sync-engine-cli.test.js +293 -0
- package/src/lib/personal-data-hub-aichat-wizard.js +242 -0
- package/src/lib/personal-data-hub-wiring.js +189 -0
- package/src/lib/sync-cli-db.js +194 -0
- package/src/lib/sync-credentials.js +225 -0
- package/src/lib/sync-engine-cli.js +406 -0
- package/src/lib/sync-oss-client.js +273 -0
- package/src/lib/sync-webdav-client.js +194 -0
- package/src/assets/web-panel/assets/PersonalDataHub-BK7I0Rsb.css +0 -1
- package/src/assets/web-panel/assets/PersonalDataHub-ZbziiUr6.js +0 -1
- package/src/assets/web-panel/assets/index-BeA3spHc.js +0 -1
- package/src/assets/web-panel/assets/index-DoLRjAoc.js +0 -1
- package/src/assets/web-panel/assets/useFlexGapSupport-Bt-T27Pf.js +0 -1
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebDAV client for CLI (Phase 3c follow-up Phase 2).
|
|
3
|
+
*
|
|
4
|
+
* ESM port of desktop-app-vue/src/main/sync/webdav-client.js — same API:
|
|
5
|
+
* testConnection / putFile / deleteFile / getEtag / listRemote
|
|
6
|
+
*
|
|
7
|
+
* Lazy-imports `webdav` v5 (ESM-only) so the CLI doesn't pay the cost
|
|
8
|
+
* for non-sync commands. Test seam `_setWebdavLoaderForTest` injects
|
|
9
|
+
* a fake module without touching the real binding.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
"use strict";
|
|
13
|
+
|
|
14
|
+
const RETRY_MAX = 3;
|
|
15
|
+
const RETRY_BASE_MS = 500;
|
|
16
|
+
const RETRY_MAX_MS = 8000;
|
|
17
|
+
|
|
18
|
+
let _webdavLoader = async () => await import("webdav");
|
|
19
|
+
|
|
20
|
+
function _setWebdavLoaderForTest(loader) {
|
|
21
|
+
_webdavLoader = loader;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function _resetWebdavLoaderForTest() {
|
|
25
|
+
_webdavLoader = async () => await import("webdav");
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function _isRetriable(status) {
|
|
29
|
+
return status === 429 || (status >= 500 && status < 600);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function _backoffMs(attempt) {
|
|
33
|
+
const base = RETRY_BASE_MS * Math.pow(2, attempt - 1);
|
|
34
|
+
const jitter = Math.random() * 0.3 * base;
|
|
35
|
+
return Math.min(RETRY_MAX_MS, Math.floor(base + jitter));
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function _sleep(ms) {
|
|
39
|
+
return new Promise((res) => setTimeout(res, ms));
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function _extractStatus(err) {
|
|
43
|
+
return err?.status ?? err?.response?.status ?? err?.statusCode ?? null;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
class WebDAVClient {
|
|
47
|
+
constructor(opts = {}) {
|
|
48
|
+
this.url = String(opts.url || "").trim();
|
|
49
|
+
this.username = opts.username || "";
|
|
50
|
+
this.password = opts.password || "";
|
|
51
|
+
this.remotePath = (opts.remotePath || "/").replace(/\/+$/, "") || "/";
|
|
52
|
+
this._client = null;
|
|
53
|
+
if (!this.url) throw new Error("WebDAVClient: url 必填");
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
async _ensureClient() {
|
|
57
|
+
if (this._client) return this._client;
|
|
58
|
+
const mod = await _webdavLoader();
|
|
59
|
+
const createClient = mod.createClient || mod.default?.createClient;
|
|
60
|
+
if (typeof createClient !== "function") {
|
|
61
|
+
throw new Error("webdav module missing createClient");
|
|
62
|
+
}
|
|
63
|
+
this._client = createClient(this.url, {
|
|
64
|
+
username: this.username,
|
|
65
|
+
password: this.password,
|
|
66
|
+
});
|
|
67
|
+
return this._client;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
_resolveRemote(filename) {
|
|
71
|
+
const safe = String(filename || "").replace(/^\/+/, "");
|
|
72
|
+
return `${this.remotePath}/${safe}`.replace(/\/{2,}/g, "/");
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
async _withRetry(label, fn) {
|
|
76
|
+
let lastErr;
|
|
77
|
+
for (let attempt = 1; attempt <= RETRY_MAX; attempt++) {
|
|
78
|
+
try {
|
|
79
|
+
return await fn();
|
|
80
|
+
} catch (err) {
|
|
81
|
+
lastErr = err;
|
|
82
|
+
const status = _extractStatus(err);
|
|
83
|
+
if (!_isRetriable(status) || attempt === RETRY_MAX) throw err;
|
|
84
|
+
await _sleep(_backoffMs(attempt));
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
throw lastErr;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
async testConnection() {
|
|
91
|
+
try {
|
|
92
|
+
const client = await this._ensureClient();
|
|
93
|
+
await this._withRetry("testConnection", () =>
|
|
94
|
+
client.stat(this.remotePath),
|
|
95
|
+
);
|
|
96
|
+
return { ok: true };
|
|
97
|
+
} catch (err) {
|
|
98
|
+
const status = _extractStatus(err);
|
|
99
|
+
if (status === 404) {
|
|
100
|
+
return {
|
|
101
|
+
ok: false,
|
|
102
|
+
status,
|
|
103
|
+
error: `远端路径 ${this.remotePath} 不存在;请先在网盘里创建`,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
if (status === 401 || status === 403) {
|
|
107
|
+
return {
|
|
108
|
+
ok: false,
|
|
109
|
+
status,
|
|
110
|
+
error: "认证失败(用户名 / 密码错误,或账户无权限)",
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
return { ok: false, status, error: err?.message || String(err) };
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
async putFile(filename, content, etag = null) {
|
|
118
|
+
const target = this._resolveRemote(filename);
|
|
119
|
+
try {
|
|
120
|
+
const client = await this._ensureClient();
|
|
121
|
+
const headers = {};
|
|
122
|
+
if (etag) headers["If-Match"] = etag;
|
|
123
|
+
const res = await this._withRetry("putFile", () =>
|
|
124
|
+
client.putFileContents(target, content, { overwrite: true, headers }),
|
|
125
|
+
);
|
|
126
|
+
let newEtag = null;
|
|
127
|
+
try {
|
|
128
|
+
const stat = await client.stat(target);
|
|
129
|
+
newEtag = stat?.etag ?? stat?.props?.getetag ?? null;
|
|
130
|
+
} catch (_e) {
|
|
131
|
+
/* non-fatal */
|
|
132
|
+
}
|
|
133
|
+
return { ok: true, etag: newEtag, raw: res };
|
|
134
|
+
} catch (err) {
|
|
135
|
+
const status = _extractStatus(err);
|
|
136
|
+
if (status === 412) return { ok: false, conflict: true, status };
|
|
137
|
+
return { ok: false, error: err?.message || String(err), status };
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
async deleteFile(filename, etag = null) {
|
|
142
|
+
const target = this._resolveRemote(filename);
|
|
143
|
+
try {
|
|
144
|
+
const client = await this._ensureClient();
|
|
145
|
+
const headers = {};
|
|
146
|
+
if (etag) headers["If-Match"] = etag;
|
|
147
|
+
await this._withRetry("deleteFile", () =>
|
|
148
|
+
client.deleteFile(target, { headers }),
|
|
149
|
+
);
|
|
150
|
+
return { ok: true };
|
|
151
|
+
} catch (err) {
|
|
152
|
+
const status = _extractStatus(err);
|
|
153
|
+
if (status === 404) return { ok: true, alreadyAbsent: true };
|
|
154
|
+
if (status === 412) return { ok: false, conflict: true, status };
|
|
155
|
+
return { ok: false, error: err?.message || String(err), status };
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
async getEtag(filename) {
|
|
160
|
+
const target = this._resolveRemote(filename);
|
|
161
|
+
try {
|
|
162
|
+
const client = await this._ensureClient();
|
|
163
|
+
const stat = await this._withRetry("getEtag", () => client.stat(target));
|
|
164
|
+
return stat?.etag ?? stat?.props?.getetag ?? null;
|
|
165
|
+
} catch (err) {
|
|
166
|
+
if (_extractStatus(err) === 404) return null;
|
|
167
|
+
throw err;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
async listRemote(subPath = "") {
|
|
172
|
+
const target = this._resolveRemote(subPath);
|
|
173
|
+
const client = await this._ensureClient();
|
|
174
|
+
const items = await this._withRetry("listRemote", () =>
|
|
175
|
+
client.getDirectoryContents(target),
|
|
176
|
+
);
|
|
177
|
+
return (items || [])
|
|
178
|
+
.filter((it) => it && it.type === "file" && it.basename?.endsWith(".md"))
|
|
179
|
+
.map((it) => ({
|
|
180
|
+
filename: it.basename,
|
|
181
|
+
etag: it.etag ?? null,
|
|
182
|
+
size: it.size ?? 0,
|
|
183
|
+
lastmod: it.lastmod ?? null,
|
|
184
|
+
}));
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
export {
|
|
189
|
+
WebDAVClient,
|
|
190
|
+
RETRY_MAX,
|
|
191
|
+
RETRY_BASE_MS,
|
|
192
|
+
_setWebdavLoaderForTest,
|
|
193
|
+
_resetWebdavLoaderForTest,
|
|
194
|
+
};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
.pdh-page[data-v-60393590]{padding:16px;max-width:1400px;margin:0 auto}.pdh-header[data-v-60393590]{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:24px;gap:16px;flex-wrap:wrap}.page-title[data-v-60393590]{margin:0 0 4px;font-size:22px;font-weight:600}.page-sub[data-v-60393590]{margin:0;color:var(--text-color-secondary, #888);font-size:13px}.kv[data-v-60393590]{font-size:13px;color:var(--text-color, #333);line-height:1.6}.kv.hint[data-v-60393590]{color:#faad14;font-size:12px;margin-top:4px}.answer[data-v-60393590]{white-space:pre-wrap;font-size:14px;line-height:1.7;background:var(--bg-elevated, #fafafa);padding:12px;border-radius:6px;border-left:3px solid #1677ff}.hint[data-v-60393590]{color:var(--text-color-secondary, #888);font-size:12px}.json-pre[data-v-60393590]{font-size:12px;background:var(--bg-elevated, #fafafa);padding:10px;border-radius:4px;max-height:280px;overflow:auto}.amount-in[data-v-60393590]{color:#52c41a;font-weight:600}.amount-out[data-v-60393590]{color:#ff4d4f;font-weight:600}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{o as ut,M as g,R as u,c as a,N as t,K as y,r as M,a as ee,L as r,O as i,u as D,P as o,S as f,a0 as dt,a1 as pt,Q as h,F as H,Y as de,$ as ct,Z as ft,f as Me}from"./vendor-M5lGV-wr.js";import{u as mt,_ as vt,d as A}from"./index-DSjWvxVr.js";import{R as $e,aA as yt,O as gt,ak as _t,h as kt,aB as wt,Q as bt,aC as ht,aD as xt,y as Ct,q as Pt,aE as At,a2 as Mt,m as $t,e as ze}from"./icons-CLQTHa5-.js";function pe(w){if(!w)return w;if(w.error)throw new Error(w.error);return w.result!==void 0?w.result:w}function Se(w,m,s,d,x){return typeof w.onMessage!="function"||typeof w._send!="function"?w.sendRaw({type:m,...s},x).then(pe):new Promise((V,Q)=>{const C=typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():`${Date.now()}-${Math.random().toString(36).slice(2)}`,B=`${m}.event`,j=`${m}.end`;let G=setTimeout(()=>{w.offMessage&&w.offMessage(C),Q(new Error(`stream timeout (${x}ms): ${m}`))},x);const F=w.onMessage(C,$=>{if(!(!$||$.id!==C)){if($.type===B&&typeof d=="function"){try{d($.event||$)}catch{}return}if($.type===j){clearTimeout(G),typeof F=="function"?F():w.offMessage&&w.offMessage(C),V(pe($));return}$.type==="error"&&(clearTimeout(G),typeof F=="function"?F():w.offMessage&&w.offMessage(C),Q(new Error($.message||"stream error")))}});w._send({id:C,type:m,...s})})}function zt(){const w=mt(),m=(s,d={},x=3e4)=>w.sendRaw({type:s,...d},x).then(pe);return{async health(){return await m("personal-data-hub.health",{},8e3)},async stats(){return await m("personal-data-hub.stats",{},8e3)},async listAdapters(){return await m("personal-data-hub.list-adapters",{},5e3)},async syncAdapter(s,d={}){return await m("personal-data-hub.sync-adapter",{name:s,options:d},12e4)},async syncAll(s={}){return await m("personal-data-hub.sync-all",{options:s},6e5)},async registerMock({name:s="mock",count:d=20,seed:x=1}={}){return await m("personal-data-hub.register-mock",{name:s,count:d,seed:x})},async unregister(s){return await m("personal-data-hub.unregister",{name:s})},async ask(s,d={}){return await m("personal-data-hub.ask",{question:s,options:d},18e4)},async queryEvents(s={}){return await m("personal-data-hub.query-events",s,1e4)},async recentAudit(s={}){return await m("personal-data-hub.recent-audit",s,1e4)},async testEmailAuth(s){return await m("personal-data-hub.test-email-auth",{account:s},3e4)},async registerEmail(s,d={}){return await m("personal-data-hub.register-email",{account:s,opts:d},15e3)},async unregisterEmail(s){return await m("personal-data-hub.unregister-email",{email:s},5e3)},async listEmailAccounts(){return await m("personal-data-hub.list-email-accounts",{},5e3)},async eventDetail(s){return await m("personal-data-hub.event-detail",{eventId:s},5e3)},async syncAdapterStream(s,d={},x){return await Se(w,"personal-data-hub.sync-adapter-stream",{name:s,options:d},x,6e5)},async syncAllStream(s={},d){return await Se(w,"personal-data-hub.sync-all-stream",{options:s},d,9e5)},async registerAlipay(s,d={}){return await m("personal-data-hub.register-alipay",{account:s,opts:d},15e3)},async unregisterAlipay(s){return await m("personal-data-hub.unregister-alipay",{email:s},5e3)},async listAlipayAccounts(){return await m("personal-data-hub.list-alipay-accounts",{},5e3)},async importAlipayBill({zipPath:s,csvPath:d,zipPassword:x}={}){return await m("personal-data-hub.import-alipay-bill",{zipPath:s,csvPath:d,zipPassword:x},3e5)},async reviewQueueList(s=50){return await m("personal-data-hub.review-queue-list",{limit:s},5e3)},async reviewDecision(s,d){return await m("personal-data-hub.review-decision",{reviewId:s,decision:d},5e3)},async manualMerge(s,d){return await m("personal-data-hub.manual-merge",{aId:s,bId:d},5e3)},async manualUnmerge(s){return await m("personal-data-hub.manual-unmerge",{personId:s},5e3)},async resolverDrain(s=50){return await m("personal-data-hub.resolver-drain",{limit:s},18e4)},async resolverStats(){return await m("personal-data-hub.resolver-stats",{},5e3)},async skillsList(){return await m("personal-data-hub.skills-list",{},5e3)},async runSkill(s,d={}){return await m("personal-data-hub.run-skill",{name:s,options:d},12e4)}}}const St={class:"pdh-page"},Lt={class:"pdh-header"},Dt={class:"kv"},Et={key:0,class:"kv"},Ot={key:1,class:"kv"},Ut={class:"kv"},qt={key:0,class:"kv hint"},It={style:{"margin-top":"12px",display:"flex","justify-content":"space-between","align-items":"center"}},Qt={key:0,style:{"margin-top":"12px"}},Rt={key:1,style:{"margin-top":"12px"}},Ht={class:"answer"},Ft={style:{"margin-top":"8px","font-size":"12px",color:"var(--text-color-secondary, #888)"}},Tt={key:2,style:{"margin-top":"8px"}},Nt={style:{display:"flex","align-items":"center",gap:"8px"}},Vt={class:"hint",style:{"margin-top":"4px"}},Bt={key:0,style:{"margin-top":"16px"}},Gt={class:"json-pre",style:{"max-height":"300px",overflow:"auto"}},Kt={key:0,style:{"margin-top":"8px"}},Zt={key:2,style:{"margin-top":"12px"}},jt={class:"kv",style:{"margin-bottom":"4px"}},Jt={key:0,style:{color:"#faad14"}},Wt={key:2,class:"kv hint"},Yt={key:3,class:"kv hint",style:{color:"#ff4d4f"}},Xt={key:3,style:{"margin-top":"12px"}},ea={key:2,style:{"margin-top":"8px"}},ta={key:1},aa={style:{"margin-left":"8px"}},la={key:3,class:"json-pre"},na={style:{"margin-left":"6px"}},sa={key:0,style:{"margin-left":"6px"}},oa={key:0,class:"hint",style:{"margin-top":"4px"}},ia={key:0,style:{"margin-top":"8px"}},ra={style:{"margin-bottom":"12px"}},ua={class:"hint"},da={class:"kv"},pa={class:"kv",style:{"margin-top":"4px"}},ca={class:"kv"},fa={key:0,class:"hint",style:{"margin-top":"4px"}},ma={key:1,style:{"font-size":"11px"}},va={__name:"PersonalDataHub",setup(w,{expose:m}){const s=zt(),d=M(null),x=M(null),V=M([]),Q=M(""),C=M(null),B=M(""),j=M(!1),G=M(!1),F=M([]),$=M(null),K=M(!1),p=ee({provider:"qq",email:"",authCode:"",host:"",port:993,pdfPasswordHints:{idCardLast6:"",phoneLast6:"",cardLast6:""}}),E=M(null),se=M(!1),_=M(null),I=M(null),Le=[{name:"analysis.spending",label:"消费分析",icon:wt,description:"总支出 / 商家排行 / 月度趋势"},{name:"analysis.relations",label:"人际关系",icon:bt,description:"与每个人的互动频率 / 主动比例"},{name:"analysis.footprint",label:"足迹",icon:ht,description:"常去地点 / 出行模式"},{name:"analysis.interests",label:"兴趣画像",icon:xt,description:"从购买 / 浏览 / 收藏抽兴趣"},{name:"analysis.timeline",label:"时间线",icon:Ct,description:"跨源事件串成故事"}],oe=M(!1),ie=M([]),J=ee({queue:{pending:0},mergeGroups:0,reviewQueue:0}),te=M(!1),P=ee({email:"",zipPassword:"",filePath:""}),z=M(null),v=ee({active:!1,adapter:"",phase:"",mailbox:"",current:0,total:0,attempt:1,errorMessage:""}),c=ee({refresh:!1,ask:!1,addMock:!1,syncAll:!1,sync:{},audit:!1,testEmail:!1,saveEmail:!1,eventDetail:!1,importAlipay:!1,reviewQueue:!1,resolverDrain:!1,skill:!1}),De=[{title:"名称",dataIndex:"name",key:"name",width:140},{title:"版本",dataIndex:"version",key:"version",width:80},{title:"能力",key:"capabilities"},{title:"敏感度",key:"sensitivity",width:140},{title:"操作",key:"actions",width:160,align:"right"}],Ee=[{title:"时间",key:"at",dataIndex:"at",width:170},{title:"动作",dataIndex:"action",key:"action",width:200},{title:"详情",key:"details"}],Oe=[{title:"日期",key:"occurredAt",width:100},{title:"描述",dataIndex:"description",key:"description"},{title:"金额",key:"amount",width:140,align:"right"}];function Ue(l){return l==="high"?"red":l==="medium"?"orange":"default"}function qe(l){if(!l)return"";const e=l.entityCounts||{};return`events=${e.events??0} persons=${e.persons??0} | raw=${l.rawCount??0} invalid=${l.invalidCount??0} | KG triples=${l.kgTripleCount??0} RAG docs=${l.ragDocCount??0} | ${l.durationMs??0}ms`}async function R(){c.refresh=!0;try{d.value=await s.health(),x.value=await s.stats(),V.value=await s.listAdapters()}catch(l){A.error("刷新失败: "+l.message)}finally{c.refresh=!1}}async function ce(){if(Q.value.trim()){c.ask=!0,B.value="",C.value=null;try{C.value=await s.ask(Q.value.trim(),{acceptNonLocal:j.value})}catch(l){B.value=l.message}finally{c.ask=!1}}}async function Ie(){c.addMock=!0;try{await s.registerMock({count:30,seed:Date.now()%1e3}),await R(),A.success("MockAdapter 已注册(30 条 mock 数据 ready 同步)")}catch(l){A.error("注册失败: "+l.message)}finally{c.addMock=!1}}function fe(l=""){v.active=!0,v.adapter=l,v.phase="starting",v.mailbox="",v.current=0,v.total=0,v.attempt=1,v.errorMessage=""}function me(l){l&&(l.adapter&&(v.adapter=l.adapter),l.phase&&(v.phase=l.phase),typeof l.current=="number"&&(v.current=l.current),typeof l.total=="number"&&(v.total=l.total),typeof l.attempt=="number"&&(v.attempt=l.attempt),l.mailbox&&(v.mailbox=l.mailbox),l.phase==="error"&&(v.errorMessage=l.message||"sync error"))}async function Qe(l){c.sync[l]=!0,fe(l);try{typeof s.syncAdapterStream=="function"?$.value=await s.syncAdapterStream(l,{},me):$.value=await s.syncAdapter(l),await R()}catch(e){A.error(`同步 ${l} 失败: ${e.message}`)}finally{c.sync[l]=!1,v.active=!1}}async function Re(){c.syncAll=!0,fe("(all)");try{const l=typeof s.syncAllStream=="function"?await s.syncAllStream({},me):await s.syncAll();$.value=l?.[l.length-1]||null,await R(),A.success(`已同步 ${l?.length||0} 个 adapter`)}catch(l){A.error("同步失败: "+l.message)}finally{c.syncAll=!1,v.active=!1}}async function He(l){try{await s.unregister(l),await R()}catch(e){A.error("移除失败: "+e.message)}}async function Fe(l){if(l){c.audit=!0;try{F.value=await s.recentAudit({limit:200})}catch(e){A.error("审计日志加载失败: "+e.message)}finally{c.audit=!1}}}const ae=Me(()=>!(!p.email||!p.email.includes("@")||!p.authCode||p.authCode.length<4||p.provider==="custom"&&!p.host));function Te(l){return{qq:"QQ: 邮箱 → 设置 → 账户 → IMAP/SMTP → 开启 → 生成授权码",163:"163: 邮箱 → 设置 → POP3/SMTP/IMAP → 开启 IMAP/SMTP 服务 → 授权密码",189:"189: 设置 → 第三方客户端授权码",outlook:"Outlook: account.microsoft.com/security → App password",gmail:"Gmail: myaccount.google.com/apppasswords (需开启 2FA)",custom:"联系你的邮箱管理员获取 IMAP 端点 + app-password"}[l]||"请输入服务商授权码(不是登录密码)"}function ve(){p.provider="qq",p.email="",p.authCode="",p.host="",p.port=993,p.pdfPasswordHints={idCardLast6:"",phoneLast6:"",cardLast6:""},E.value=null}function ye(){const l={provider:p.provider,email:p.email.trim(),authCode:p.authCode};return p.provider==="custom"&&(l.host=p.host.trim(),l.port=p.port||993,l.secure=!0),l}function Ne(){const l={};for(const e of Object.keys(p.pdfPasswordHints)){const k=p.pdfPasswordHints[e];typeof k=="string"&&k.trim().length>0&&(l[e]=k.trim())}return Object.keys(l).length>0?l:null}async function Ve(){if(ae.value){c.testEmail=!0,E.value=null;try{E.value=await s.testEmailAuth(ye())}catch(l){E.value={ok:!1,error:l.message}}finally{c.testEmail=!1}}}async function Be(){if(!(!ae.value||!E.value?.ok)){c.saveEmail=!0;try{const l={},e=Ne();e&&(l.pdfPasswordHints=e),await s.registerEmail(ye(),l),A.success("邮箱账号已注册"),K.value=!1,ve(),await R()}catch(l){A.error("保存失败: "+l.message)}finally{c.saveEmail=!1}}}const ge=Me(()=>!(!P.email||!P.email.includes("@")||!P.filePath||P.filePath.length<3));function Ge(){P.email="",P.zipPassword="",P.filePath="",z.value=null}async function Ke(){if(ge.value){c.importAlipay=!0,z.value=null;try{await s.registerAlipay({email:P.email.trim(),zipPassword:P.zipPassword||void 0});const e=/\.zip$/i.test(P.filePath)?{zipPath:P.filePath,zipPassword:P.zipPassword||void 0}:{csvPath:P.filePath};z.value=await s.importAlipayBill(e),z.value?.status==="ok"?(A.success(`导入成功 — ${z.value.entityCounts?.events||0} 笔交易`),await R()):A.error("导入失败: "+(z.value?.error||z.value?.status))}catch(l){z.value={status:"error",error:l.message},A.error("导入失败: "+l.message)}finally{c.importAlipay=!1}}}async function _e(l){if(l){c.eventDetail=!0,se.value=!0;try{_.value=await s.eventDetail(l)}catch(e){_.value=null,A.error("事件详情加载失败: "+e.message)}finally{c.eventDetail=!1}}}m({showEventDetail:_e});async function Ze(l){c.skill=!0,I.value=null;try{I.value=await s.runSkill(l,{})}catch(e){A.error(`${l} 失败: ${e.message}`)}finally{c.skill=!1}}async function le(){c.reviewQueue=!0;try{ie.value=await s.reviewQueueList(50);const l=await s.resolverStats();Object.assign(J,l)}catch(l){A.error("待消歧加载失败: "+l.message)}finally{c.reviewQueue=!1}}async function je(){oe.value=!0,await le()}async function re(l,e){try{await s.reviewDecision(l,e),A.success(`已记录决策: ${e}`),await le()}catch(k){A.error("决策失败: "+k.message)}}async function Je(){c.resolverDrain=!0;try{const l=await s.resolverDrain(20);A.success(`drain 完成 — same=${l.same} different=${l.different} review=${l.review}`),await le()}catch(l){A.error("drain 失败: "+l.message)}finally{c.resolverDrain=!1}}async function We(){try{const l=await s.resolverStats();Object.assign(J,l)}catch{}}return ut(()=>{R(),We()}),(l,e)=>{const k=y("a-button"),Ye=y("a-badge"),L=y("a-space"),S=y("a-tag"),U=y("a-card"),W=y("a-col"),ke=y("a-row"),Xe=y("a-textarea"),et=y("a-checkbox"),q=y("a-alert"),T=y("a-divider"),tt=y("a-spin"),at=y("a-popconfirm"),ue=y("a-table"),we=y("a-empty"),be=y("a-progress"),Z=y("a-select-option"),lt=y("a-select"),O=y("a-form-item"),N=y("a-input"),he=y("a-tooltip"),xe=y("a-input-password"),nt=y("a-input-number"),Ce=y("a-form"),Y=y("a-drawer"),X=y("a-descriptions-item"),st=y("a-descriptions"),ot=y("a-list-item-meta"),Pe=y("a-list-item"),Ae=y("a-list"),it=y("a-collapse-panel"),rt=y("a-collapse");return r(),g("div",St,[u("div",Lt,[e[26]||(e[26]=u("div",null,[u("h2",{class:"page-title"},"个人数据中台"),u("p",{class:"page-sub"}," 让数据回归个人 — 各 app 数据本地加密落盘,本地 LLM 跨源分析,零云端外传。 ")],-1)),a(L,null,{default:t(()=>[a(k,{loading:c.refresh,onClick:R},{icon:t(()=>[a(D($e))]),default:t(()=>[e[23]||(e[23]=i(" 刷新 ",-1))]),_:1},8,["loading"]),a(Ye,{count:J.reviewQueue,offset:[0,0]},{default:t(()=>[a(k,{type:"primary",ghost:"",onClick:je},{icon:t(()=>[a(D(yt))]),default:t(()=>[e[24]||(e[24]=i(" 待消歧 ",-1))]),_:1})]),_:1},8,["count"]),a(k,{type:"primary",ghost:"",onClick:e[0]||(e[0]=n=>G.value=!0)},{icon:t(()=>[a(D(gt))]),default:t(()=>[e[25]||(e[25]=i(" 审计日志 ",-1))]),_:1})]),_:1})]),a(ke,{gutter:16,style:{"margin-bottom":"16px"}},{default:t(()=>[a(W,{xs:24,sm:12,md:6},{default:t(()=>[a(U,{size:"small",title:"Vault"},{extra:t(()=>[a(S,{color:d.value?.vault?.ok?"green":"red"},{default:t(()=>[i(o(d.value?.vault?.ok?"正常":"未就绪"),1)]),_:1},8,["color"])]),default:t(()=>[u("div",Dt,"schema v"+o(d.value?.vault?.schemaVersion??"?"),1),x.value?.vault?(r(),g("div",Et," 事件 "+o(x.value.vault.events)+" · 联系人 "+o(x.value.vault.persons),1)):f("",!0),x.value?.vault?(r(),g("div",Ot," 地点 "+o(x.value.vault.places)+" · 商品 "+o(x.value.vault.items)+" · 主题 "+o(x.value.vault.topics),1)):f("",!0)]),_:1})]),_:1}),a(W,{xs:24,sm:12,md:6},{default:t(()=>[a(U,{size:"small",title:"本地 LLM"},{extra:t(()=>[a(S,{color:d.value?.llm?.ok?d.value.llm.isLocal?"green":"orange":"red"},{default:t(()=>[i(o(d.value?.llm?.ok?d.value.llm.isLocal?"本地":"非本地":"未就绪"),1)]),_:1},8,["color"])]),default:t(()=>[u("div",Ut,o(d.value?.llm?.name||"—"),1),d.value?.llm?.ok&&!d.value.llm.isLocal?(r(),g("div",qt," ⚠️ 非本地 — ask 会被隐私 gate 拒绝,除非显式 acceptNonLocal ")):f("",!0)]),_:1})]),_:1}),a(W,{xs:24,sm:12,md:6},{default:t(()=>[a(U,{size:"small",title:"KG 索引"},{extra:t(()=>[a(S,{color:d.value?.kgSink?.ok?"green":"default"},{default:t(()=>[i(o(d.value?.kgSink?.ok?"已连接":"不可用"),1)]),_:1},8,["color"])]),default:t(()=>[e[27]||(e[27]=u("div",{class:"kv"},"events / persons → cc knowledge-graph 实体 + 关系",-1))]),_:1})]),_:1}),a(W,{xs:24,sm:12,md:6},{default:t(()=>[a(U,{size:"small",title:"RAG 索引"},{extra:t(()=>[a(S,{color:d.value?.ragSink?.ok?"green":"default"},{default:t(()=>[i(o(d.value?.ragSink?.ok?"已连接":"不可用"),1)]),_:1},8,["color"])]),default:t(()=>[e[28]||(e[28]=u("div",{class:"kv"},"文本 → BM25(vector 留待后续 phase)",-1))]),_:1})]),_:1})]),_:1}),a(U,{style:{"margin-bottom":"16px"}},{title:t(()=>[a(L,null,{default:t(()=>[a(D(kt)),e[29]||(e[29]=u("span",null,"问我数据",-1))]),_:1})]),default:t(()=>[a(Xe,{value:Q.value,"onUpdate:value":e[1]||(e[1]=n=>Q.value=n),rows:2,placeholder:"例:上个月在淘宝总共花了多少?/我妈生日那周买了啥送哪儿?",onKeydown:dt(pt(ce,["exact","prevent"]),["enter"])},null,8,["value","onKeydown"]),u("div",It,[a(et,{checked:j.value,"onUpdate:checked":e[2]||(e[2]=n=>j.value=n)},{default:t(()=>[...e[30]||(e[30]=[i("允许非本地 LLM (volcengine / anthropic 等)",-1)])]),_:1},8,["checked"]),a(k,{type:"primary",loading:c.ask,disabled:!Q.value.trim(),onClick:ce},{icon:t(()=>[a(D(_t))]),default:t(()=>[e[31]||(e[31]=i(" 提问 ",-1))]),_:1},8,["loading","disabled"])]),B.value?(r(),g("div",Qt,[a(q,{type:"error","show-icon":"",message:B.value},null,8,["message"])])):f("",!0),C.value?(r(),g("div",Rt,[C.value.warning==="no-facts"?(r(),h(q,{key:0,type:"warning","show-icon":"",message:"vault 里没找到匹配的事件('no-facts')—— 先同步几个 adapter 让数据进 vault",style:{"margin-bottom":"12px"}})):C.value.warning==="hallucinated-citations"?(r(),h(q,{key:1,type:"warning","show-icon":"",message:`LLM 引用了 ${C.value.hallucinatedCitations?.length||0} 个不存在的 event id —— 模型在编造`,style:{"margin-bottom":"12px"}},null,8,["message"])):f("",!0),u("div",Ht,o(C.value.answer),1),u("div",Ft," 引用 "+o(C.value.citations?.length||0)+" 条事实 · "+o(C.value.facts?.length||0)+" facts 入 prompt · "+o(C.value.durationMs)+"ms · "+o(C.value.model),1),C.value.citations?.length?(r(),g("div",Tt,[e[32]||(e[32]=u("span",{style:{"font-size":"12px",color:"var(--text-color-secondary, #888)"}},"事件链接(点击查看明细 / PDF 解密结果):",-1)),a(L,{style:{"margin-top":"4px"},wrap:""},{default:t(()=>[(r(!0),g(H,null,de(C.value.citations,n=>(r(),h(S,{key:n,color:"blue",style:{cursor:"pointer"},onClick:b=>_e(n)},{default:t(()=>[i(o(n),1)]),_:2},1032,["onClick"]))),128))]),_:1})])):f("",!0)])):f("",!0)]),_:1}),a(U,{style:{"margin-bottom":"16px"}},{title:t(()=>[a(L,null,{default:t(()=>[a(D(Pt)),e[33]||(e[33]=u("span",null,"分析 skill (Phase 11)",-1))]),_:1})]),extra:t(()=>[a(S,{color:"purple"},{default:t(()=>[...e[34]||(e[34]=[i("5 内置",-1)])]),_:1})]),default:t(()=>[a(ke,{gutter:[12,12]},{default:t(()=>[(r(),g(H,null,de(Le,n=>a(W,{xs:24,sm:12,md:8,key:n.name},{default:t(()=>[a(U,{size:"small",hoverable:"",onClick:b=>Ze(n.name)},{default:t(()=>[u("div",Nt,[(r(),h(ct(n.icon),{style:{"font-size":"18px",color:"#722ed1"}})),u("strong",null,o(n.label),1)]),u("div",Vt,o(n.description),1)]),_:2},1032,["onClick"])]),_:2},1024)),64))]),_:1}),I.value?(r(),g("div",Bt,[a(T,{plain:"",orientation:"left"},{default:t(()=>[i(o(I.value.skill)+" 结果",1)]),_:1}),a(tt,{spinning:c.skill},{default:t(()=>[u("pre",Gt,o(JSON.stringify(I.value,null,2)),1),I.value.llm_commentary||I.value.llm_narrative?(r(),g("div",Kt,[a(q,{type:"info",message:I.value.llm_commentary||I.value.llm_narrative},null,8,["message"])])):f("",!0)]),_:1},8,["spinning"])])):f("",!0)]),_:1}),a(U,{style:{"margin-bottom":"16px"}},{title:t(()=>[a(L,null,{default:t(()=>[a(D($t)),e[35]||(e[35]=u("span",null,"Adapters",-1))]),_:1})]),extra:t(()=>[a(L,null,{default:t(()=>[a(k,{onClick:e[3]||(e[3]=n=>K.value=!0)},{icon:t(()=>[a(D(At))]),default:t(()=>[e[36]||(e[36]=i(" 添加邮箱账号 ",-1))]),_:1}),a(k,{onClick:e[4]||(e[4]=n=>te.value=!0)},{icon:t(()=>[a(D(Mt))]),default:t(()=>[e[37]||(e[37]=i(" 导入支付宝账单 ",-1))]),_:1}),a(k,{onClick:Ie,loading:c.addMock},{default:t(()=>[...e[38]||(e[38]=[i(" 注册 MockAdapter(开发) ",-1)])]),_:1},8,["loading"]),a(k,{type:"primary",onClick:Re,loading:c.syncAll,disabled:!V.value.length},{default:t(()=>[...e[39]||(e[39]=[i(" 同步全部 ",-1)])]),_:1},8,["loading","disabled"])]),_:1})]),default:t(()=>[V.value.length?(r(),h(ue,{key:0,columns:De,"data-source":V.value,pagination:!1,"row-key":n=>n.name,size:"middle"},{bodyCell:t(({column:n,record:b})=>[n.key==="sensitivity"?(r(),g(H,{key:0},[a(S,{color:Ue(b.sensitivity)},{default:t(()=>[i(o(b.sensitivity),1)]),_:2},1032,["color"]),b.legalGate?(r(),h(S,{key:0,color:"red",style:{"margin-left":"4px"}},{default:t(()=>[...e[40]||(e[40]=[i("需法律确认",-1)])]),_:1})):f("",!0)],64)):n.key==="capabilities"?(r(!0),g(H,{key:1},de(b.capabilities,ne=>(r(),h(S,{key:ne,style:{"margin-right":"4px"}},{default:t(()=>[i(o(ne),1)]),_:2},1024))),128)):n.key==="actions"?(r(),h(L,{key:2},{default:t(()=>[a(k,{size:"small",loading:c.sync[b.name],onClick:ne=>Qe(b.name)},{default:t(()=>[...e[41]||(e[41]=[i(" 同步 ",-1)])]),_:1},8,["loading","onClick"]),a(at,{title:`从注册表移除 ${b.name}?(vault 数据不会删除)`,onConfirm:ne=>He(b.name)},{default:t(()=>[a(k,{size:"small",danger:""},{default:t(()=>[...e[42]||(e[42]=[i("移除",-1)])]),_:1})]),_:1},8,["title","onConfirm"])]),_:2},1024)):f("",!0)]),_:1},8,["data-source","row-key"])):(r(),h(we,{key:1,description:"无已注册 adapter — 点上方按钮注册 MockAdapter 看效果"})),v.active?(r(),g("div",Zt,[a(U,{size:"small",bordered:!0},{default:t(()=>[u("div",jt,[e[43]||(e[43]=u("strong",null,"同步进行中",-1)),i(" · "+o(v.adapter)+" · "+o(v.phase||"...")+" ",1),v.attempt&&v.attempt>1?(r(),g("span",Jt," (重试 #"+o(v.attempt)+") ",1)):f("",!0)]),v.total>0?(r(),h(be,{key:0,percent:Math.round(v.current/v.total*100),status:v.errorMessage?"exception":"active",size:"small"},null,8,["percent","status"])):(r(),h(be,{key:1,percent:0,status:"active",size:"small"})),v.mailbox?(r(),g("div",Wt," 邮箱 "+o(v.mailbox)+" · "+o(v.current)+" / "+o(v.total),1)):f("",!0),v.errorMessage?(r(),g("div",Yt,o(v.errorMessage),1)):f("",!0)]),_:1})])):f("",!0),$.value?(r(),g("div",Xt,[a(q,{type:$.value.status==="ok"?"success":"error","show-icon":"",message:`同步 ${$.value.adapter}: ${$.value.status}`,description:qe($.value)},null,8,["type","message","description"])])):f("",!0)]),_:1}),a(Y,{open:K.value,"onUpdate:open":e[14]||(e[14]=n=>K.value=n),title:"添加邮箱账号",placement:"right",width:"560","destroy-on-close":!0,onClose:ve},{footer:t(()=>[a(L,null,{default:t(()=>[a(k,{onClick:e[13]||(e[13]=n=>K.value=!1)},{default:t(()=>[...e[53]||(e[53]=[i("取消",-1)])]),_:1}),a(k,{loading:c.testEmail,disabled:!ae.value,onClick:Ve},{default:t(()=>[...e[54]||(e[54]=[i(" 测试连接 ",-1)])]),_:1},8,["loading","disabled"]),a(k,{type:"primary",loading:c.saveEmail,disabled:!ae.value||!E.value?.ok,onClick:Be},{default:t(()=>[...e[55]||(e[55]=[i(" 保存并注册 ",-1)])]),_:1},8,["loading","disabled"])]),_:1})]),default:t(()=>[a(q,{message:"数据回归个人 — 凭证落本地加密文件(与 vault 主密钥同目录),同步动作 100% 本地。",type:"info","show-icon":"",style:{"margin-bottom":"16px"}}),a(Ce,{layout:"vertical",model:p},{default:t(()=>[a(O,{label:"邮箱服务商",required:""},{default:t(()=>[a(lt,{value:p.provider,"onUpdate:value":e[5]||(e[5]=n=>p.provider=n),placeholder:"选择服务商"},{default:t(()=>[a(Z,{value:"qq"},{default:t(()=>[...e[44]||(e[44]=[i("QQ 邮箱 (imap.qq.com)",-1)])]),_:1}),a(Z,{value:"163"},{default:t(()=>[...e[45]||(e[45]=[i("网易邮箱 163/126",-1)])]),_:1}),a(Z,{value:"189"},{default:t(()=>[...e[46]||(e[46]=[i("189 邮箱",-1)])]),_:1}),a(Z,{value:"outlook"},{default:t(()=>[...e[47]||(e[47]=[i("Outlook / Hotmail",-1)])]),_:1}),a(Z,{value:"gmail"},{default:t(()=>[...e[48]||(e[48]=[i("Gmail",-1)])]),_:1}),a(Z,{value:"custom"},{default:t(()=>[...e[49]||(e[49]=[i("自定义 IMAP",-1)])]),_:1})]),_:1},8,["value"])]),_:1}),a(O,{label:"邮箱地址",required:""},{default:t(()=>[a(N,{value:p.email,"onUpdate:value":e[6]||(e[6]=n=>p.email=n),placeholder:"you@qq.com",autocomplete:"off"},null,8,["value"])]),_:1}),a(O,{required:""},{label:t(()=>[a(L,null,{default:t(()=>[e[50]||(e[50]=u("span",null,"授权码(非登录密码)",-1)),a(he,{title:Te(p.provider)},{default:t(()=>[a(D(ze),{style:{color:"#888"}})]),_:1},8,["title"])]),_:1})]),default:t(()=>[a(xe,{value:p.authCode,"onUpdate:value":e[7]||(e[7]=n=>p.authCode=n),placeholder:"例:QQ 邮箱 设置 → 账户 → 开启 IMAP/SMTP → 生成的授权码",autocomplete:"off"},null,8,["value"])]),_:1}),p.provider==="custom"?(r(),h(O,{key:0,label:"IMAP host"},{default:t(()=>[a(N,{value:p.host,"onUpdate:value":e[8]||(e[8]=n=>p.host=n),placeholder:"mail.example.com"},null,8,["value"])]),_:1})):f("",!0),p.provider==="custom"?(r(),h(O,{key:1,label:"端口"},{default:t(()=>[a(nt,{value:p.port,"onUpdate:value":e[9]||(e[9]=n=>p.port=n),min:1,max:65535,"default-value":993},null,8,["value"])]),_:1})):f("",!0),a(T,{orientation:"left",plain:""},{default:t(()=>[...e[51]||(e[51]=[i("PDF 账单解密提示(可选)",-1)])]),_:1}),e[52]||(e[52]=u("p",{class:"hint"},"银行 PDF 月结大多加密;提供几个常用候选项让 Phase 5.5 自动解锁:",-1)),a(O,{label:"身份证后 6 位"},{default:t(()=>[a(N,{value:p.pdfPasswordHints.idCardLast6,"onUpdate:value":e[10]||(e[10]=n=>p.pdfPasswordHints.idCardLast6=n),placeholder:"123456",autocomplete:"off"},null,8,["value"])]),_:1}),a(O,{label:"手机后 6 位"},{default:t(()=>[a(N,{value:p.pdfPasswordHints.phoneLast6,"onUpdate:value":e[11]||(e[11]=n=>p.pdfPasswordHints.phoneLast6=n),placeholder:"123456",autocomplete:"off"},null,8,["value"])]),_:1}),a(O,{label:"信用卡尾 6 位"},{default:t(()=>[a(N,{value:p.pdfPasswordHints.cardLast6,"onUpdate:value":e[12]||(e[12]=n=>p.pdfPasswordHints.cardLast6=n),placeholder:"123456",autocomplete:"off"},null,8,["value"])]),_:1}),E.value?(r(),g("div",ea,[a(q,{type:E.value.ok?"success":"error","show-icon":"",message:E.value.ok?"凭证有效 — 可以保存":`认证失败: ${E.value.reason||E.value.error}`},null,8,["type","message"])])):f("",!0)]),_:1},8,["model"])]),_:1},8,["open"]),a(Y,{open:se.value,"onUpdate:open":e[15]||(e[15]=n=>se.value=n),title:_.value?`事件 ${_.value.event.id}`:"加载中...",placement:"right",width:"640","destroy-on-close":!0},{default:t(()=>[_.value?(r(),g(H,{key:0},[a(st,{column:1,size:"small",bordered:""},{default:t(()=>[a(X,{label:"类型"},{default:t(()=>[i(o(_.value.event.subtype),1)]),_:1}),a(X,{label:"发生于"},{default:t(()=>[i(o(new Date(_.value.event.occurredAt).toLocaleString()),1)]),_:1}),a(X,{label:"actor"},{default:t(()=>[i(o(_.value.event.actor),1)]),_:1}),_.value.event.content?.title?(r(),h(X,{key:0,label:"标题"},{default:t(()=>[i(o(_.value.event.content.title),1)]),_:1})):f("",!0),_.value.event.source?.adapter?(r(),h(X,{key:1,label:"来源 adapter"},{default:t(()=>[i(o(_.value.event.source.adapter)+" @ v"+o(_.value.event.source.adapterVersion),1)]),_:1})):f("",!0)]),_:1}),_.value.classification?(r(),h(T,{key:0,orientation:"left",plain:""},{default:t(()=>[...e[56]||(e[56]=[i("分类",-1)])]),_:1})):f("",!0),_.value.classification?(r(),g("div",ta,[a(S,{color:"blue"},{default:t(()=>[i(o(_.value.classification.category),1)]),_:1}),a(S,null,{default:t(()=>[i(o(_.value.classification.layer),1)]),_:1}),u("span",aa,"置信 "+o(Math.round((_.value.classification.confidence||0)*100))+"%",1)])):f("",!0),_.value.extraction?(r(),h(T,{key:2,orientation:"left",plain:""},{default:t(()=>[i("结构化字段("+o(_.value.extraction.template)+")",1)]),_:1})):f("",!0),_.value.extraction?(r(),g("pre",la,o(JSON.stringify(_.value.extraction.fields,null,2)),1)):f("",!0),_.value.extraction?.pdfExtraction?(r(),h(T,{key:4,orientation:"left",plain:""},{default:t(()=>[...e[57]||(e[57]=[i("PDF 解密 / 解析",-1)])]),_:1})):f("",!0),_.value.extraction?.pdfExtraction?(r(),h(Ae,{key:5,"data-source":_.value.extraction.pdfExtraction,size:"small"},{renderItem:t(({item:n})=>[a(Pe,null,{default:t(()=>[a(ot,{title:n.filename},{description:t(()=>[u("div",null,[a(S,{color:n.decrypted?"green":"red"},{default:t(()=>[i(o(n.decrypted?"已解密":"解密失败"),1)]),_:2},1032,["color"]),u("span",na,"尝试 "+o(n.attempted)+" 次",1),n.transactionsExtracted!=null?(r(),g("span",sa," · 提取 "+o(n.transactionsExtracted)+" 条交易 ",1)):f("",!0)]),n.error?(r(),g("div",oa,o(n.error),1)):f("",!0)]),_:2},1032,["title"])]),_:2},1024)]),_:1},8,["data-source"])):f("",!0),_.value.extraction?.fields?.transactions?.length?(r(),g(H,{key:6},[a(T,{orientation:"left",plain:""},{default:t(()=>[...e[58]||(e[58]=[i("交易明细",-1)])]),_:1}),a(ue,{columns:Oe,"data-source":_.value.extraction.fields.transactions,pagination:{pageSize:10,size:"small"},"row-key":(n,b)=>b,size:"small"},{bodyCell:t(({column:n,record:b})=>[n.key==="occurredAt"?(r(),g(H,{key:0},[i(o(new Date(b.occurredAtMs).toLocaleDateString()),1)],64)):n.key==="amount"?(r(),g("span",{key:1,class:ft(b.amount.direction==="in"?"amount-in":"amount-out")},o(b.amount.direction==="in"?"+":"-")+o(b.amount.value.toFixed(2))+" "+o(b.amount.currency),3)):f("",!0)]),_:1},8,["data-source","row-key"])],64)):f("",!0)],64)):(r(),h(we,{key:1,description:"无事件数据"}))]),_:1},8,["open","title"]),a(Y,{open:te.value,"onUpdate:open":e[20]||(e[20]=n=>te.value=n),title:"导入支付宝账单",placement:"right",width:"560","destroy-on-close":!0,onClose:Ge},{footer:t(()=>[a(L,null,{default:t(()=>[a(k,{onClick:e[19]||(e[19]=n=>te.value=!1)},{default:t(()=>[...e[64]||(e[64]=[i("关闭",-1)])]),_:1}),a(k,{type:"primary",loading:c.importAlipay,disabled:!ge.value,onClick:Ke},{default:t(()=>[...e[65]||(e[65]=[i(" 注册账户 + 导入 ",-1)])]),_:1},8,["loading","disabled"])]),_:1})]),default:t(()=>[a(q,{message:"支付宝官方导出 CSV — 服务器侧全量、稳定无风控。3 分钟拿到 12 个月流水。",type:"info","show-icon":"",style:{"margin-bottom":"16px"}}),a(rt,{bordered:!1,style:{"margin-bottom":"12px"}},{default:t(()=>[a(it,{header:"如何导出账单(首次必看)"},{default:t(()=>[...e[59]||(e[59]=[u("ol",{style:{"padding-left":"18px","font-size":"13px"}},[u("li",null,"支付宝 app → 我的 → 账单 → 右上角 ⋯"),u("li",null,'点 "开具交易流水证明"'),u("li",null,"选月份范围(最长 12 个月)"),u("li",null,'用途选 "个人对账"'),u("li",null,"发送到你的绑定邮箱"),u("li",null,[i("从邮箱下载 "),u("code",null,"alipay_record_*.zip")]),u("li",null,"解压密码 = 你的身份证后 6 位")],-1)])]),_:1})]),_:1}),a(Ce,{layout:"vertical",model:P},{default:t(()=>[a(O,{label:"支付宝绑定邮箱(账户标识)",required:""},{default:t(()=>[a(N,{value:P.email,"onUpdate:value":e[16]||(e[16]=n=>P.email=n),placeholder:"alipay-bound@example.com",autocomplete:"off"},null,8,["value"])]),_:1}),a(O,null,{label:t(()=>[a(L,null,{default:t(()=>[e[60]||(e[60]=u("span",null,"ZIP 密码(身份证后 6 位)",-1)),a(he,{title:"支付宝 ZIP 默认密码 = 身份证号后 6 位。也支持自定义密码。"},{default:t(()=>[a(D(ze),{style:{color:"#888"}})]),_:1})]),_:1})]),default:t(()=>[a(xe,{value:P.zipPassword,"onUpdate:value":e[17]||(e[17]=n=>P.zipPassword=n),placeholder:"例:123456",autocomplete:"off"},null,8,["value"]),e[61]||(e[61]=u("div",{class:"hint",style:{"margin-top":"4px"}}," 空白则解析时再问,或导入的 ZIP 未加密。 ",-1))]),_:1}),a(T,{orientation:"left",plain:""},{default:t(()=>[...e[62]||(e[62]=[i("选择文件",-1)])]),_:1}),a(O,{label:"ZIP 或 CSV 文件路径"},{default:t(()=>[a(N,{value:P.filePath,"onUpdate:value":e[18]||(e[18]=n=>P.filePath=n),placeholder:"C:\\\\Users\\\\you\\\\Downloads\\\\alipay_record_xxx.zip","allow-clear":""},null,8,["value"]),e[63]||(e[63]=u("div",{class:"hint",style:{"margin-top":"4px"}}," 桌面版可通过 Electron 文件选择器自动填充;web-shell 复制完整路径。 ",-1))]),_:1}),z.value?(r(),g("div",ia,[a(q,{type:z.value.status==="ok"?"success":"error","show-icon":"",message:z.value.status==="ok"?`导入成功 — ${z.value.entityCounts?.events||0} 笔交易`:`导入失败: ${z.value.error||z.value.status}`,description:z.value.status==="ok"?`${z.value.entityCounts?.persons||0} 个交易对方 · ${z.value.kgTripleCount||0} KG triples · ${z.value.durationMs||0}ms`:null},null,8,["type","message","description"])])):f("",!0)]),_:1},8,["model"])]),_:1},8,["open"]),a(Y,{open:oe.value,"onUpdate:open":e[21]||(e[21]=n=>oe.value=n),title:"待消歧(EntityResolver 模糊判定)",placement:"right",width:"640","destroy-on-close":!0},{default:t(()=>[ie.value.length===0&&!c.reviewQueue?(r(),h(q,{key:0,type:"success","show-icon":"",message:"无待消歧 pair — 所有跨源 Person 已确定。",style:{"margin-bottom":"12px"}})):f("",!0),u("div",ra,[a(L,null,{default:t(()=>[a(k,{loading:c.reviewQueue,onClick:le},{icon:t(()=>[a(D($e))]),default:t(()=>[e[66]||(e[66]=i(" 刷新 ",-1))]),_:1},8,["loading"]),a(k,{loading:c.resolverDrain,onClick:Je},{default:t(()=>[...e[67]||(e[67]=[i(" 手动 drain 队列 ",-1)])]),_:1},8,["loading"]),u("span",ua," queue: "+o(J.queue?.pending||0)+" pending · "+o(J.mergeGroups||0)+" groups ",1)]),_:1})]),a(Ae,{"data-source":ie.value,pagination:{pageSize:5,size:"small"},size:"small"},{renderItem:t(({item:n})=>[a(Pe,null,{default:t(()=>[a(U,{size:"small",style:{width:"100%"}},{default:t(()=>[u("div",da,[u("strong",null,"Pair #"+o(n.id),1),n.embed_sim?(r(),h(S,{key:0,color:"blue",style:{"margin-left":"8px"}},{default:t(()=>[i(" sim "+o(Number(n.embed_sim).toFixed(2)),1)]),_:2},1024)):f("",!0),n.llm_verdict?(r(),h(S,{key:1,color:n.llm_verdict==="yes"?"green":n.llm_verdict==="no"?"red":"orange",style:{"margin-left":"4px"}},{default:t(()=>[i(" LLM: "+o(n.llm_verdict),1)]),_:2},1032,["color"])):f("",!0)]),u("div",pa,"A: "+o(n.a_person_id),1),u("div",ca,"B: "+o(n.b_person_id),1),n.llm_reason?(r(),g("div",fa," LLM 理由: "+o(n.llm_reason),1)):f("",!0),a(L,{style:{"margin-top":"8px"}},{default:t(()=>[a(k,{size:"small",type:"primary",onClick:b=>re(n.id,"same")},{default:t(()=>[...e[68]||(e[68]=[i("同一人",-1)])]),_:1},8,["onClick"]),a(k,{size:"small",danger:"",onClick:b=>re(n.id,"different")},{default:t(()=>[...e[69]||(e[69]=[i("不同人",-1)])]),_:1},8,["onClick"]),a(k,{size:"small",onClick:b=>re(n.id,"skip")},{default:t(()=>[...e[70]||(e[70]=[i("跳过",-1)])]),_:1},8,["onClick"])]),_:2},1024)]),_:2},1024)]),_:2},1024)]),_:1},8,["data-source"])]),_:1},8,["open"]),a(Y,{open:G.value,"onUpdate:open":e[22]||(e[22]=n=>G.value=n),title:"审计日志(数据 lineage)",placement:"right",width:"600",onAfterOpenChange:Fe},{default:t(()=>[a(ue,{columns:Ee,"data-source":F.value,pagination:{pageSize:20,size:"small"},"row-key":n=>n.id,size:"small"},{bodyCell:t(({column:n,record:b})=>[n.key==="at"?(r(),g(H,{key:0},[i(o(new Date(b.at).toLocaleString()),1)],64)):n.key==="details"?(r(),g("code",ma,o(b.details||"—"),1)):f("",!0)]),_:1},8,["data-source","row-key"])]),_:1},8,["open"])])}}},ka=vt(va,[["__scopeId","data-v-60393590"]]);export{ka as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{A as o}from"./Row-DSaoTjlN.js";import{S as t}from"./index-DSjWvxVr.js";import"./responsiveObserve-BCsWrTkb.js";import"./vendor-M5lGV-wr.js";import"./useFlexGapSupport-Bt-T27Pf.js";import"./styleChecker-CSQdy9SQ.js";import"./index-h05fIj9Q.js";import"./icons-CLQTHa5-.js";const l=t(o);export{l as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{C as o}from"./Col-BQHpLNCA.js";import{S as t}from"./index-DSjWvxVr.js";import"./index-h05fIj9Q.js";import"./vendor-M5lGV-wr.js";import"./icons-CLQTHa5-.js";const s=t(o);export{s as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{d as o}from"./styleChecker-CSQdy9SQ.js";import{o as t,s}from"./vendor-M5lGV-wr.js";const r=(()=>{const e=s(!1);return t(()=>{e.value=o()}),e});export{r as u};
|