chainlesschain 0.162.28 → 0.162.29
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 -2
- package/src/assets/web-panel/.build-hash +1 -1
- package/src/assets/web-panel/assets/{AIOps-BJpLJcb4.js → AIOps-BWWsdf3s.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-7H2keiUd.js → ActionButton-wRdLFzBQ.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-D5jXlBKr.js → Analytics-CU1ellhG.js} +1 -1
- package/src/assets/web-panel/assets/{AppLayout-DleZFgpe.css → AppLayout-9pWRQa_t.css} +1 -1
- package/src/assets/web-panel/assets/AppLayout-cXY-mRTd.js +3 -0
- package/src/assets/web-panel/assets/{Audit-DG6F79Ky.js → Audit-CtQuC6zy.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-DbjXbE0Y.js → Backup-WeATa8CV.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-DpSsCNpF.js → BaseInput-BCu2Cejw.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-CdNaRMh9.js → Chat-Bj0XPlH8.js} +1 -1
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-DZf8Uz-e.js → ChatBubbleRenderer-Bpp2sN9W.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-Bp3BHLCL.js → Checkbox-DoGqmF9g.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-DHoSt0fQ.js → Codegen-PeBhNei5.js} +1 -1
- package/src/assets/web-panel/assets/{Col-ns3mBD4a.js → Col-C-9-jORK.js} +1 -1
- package/src/assets/web-panel/assets/{Community-DV1mT7OV.js → Community-BvaB_Wcs.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-Dse9t2DM.js → Compact-CemvxU3z.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-B4qoNIJZ.js → Compliance-DjquEqsU.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-Ceth1tHo.js → Cowork-Bv6Tm40_.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-BEEFxvkn.js → Cron-D9fPIXV8.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-DWv2VhyT.js → Crosschain-C0WilDBF.js} +1 -1
- package/src/assets/web-panel/assets/{DID-BDPgz_-9.js → DID-CiGeAI1K.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-C00ovbjU.js → Dashboard-zqQuizB8.js} +1 -1
- package/src/assets/web-panel/assets/{Dropdown-BRsMIdMe.js → Dropdown-_Mjb8yOR.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-ixR__zVN.js → EmailListRenderer-C369EVhV.js} +1 -1
- package/src/assets/web-panel/assets/FamilyGuardDashboard-D8WsrCmn.js +1 -0
- package/src/assets/web-panel/assets/FamilyGuardDashboard-Df-D09Q4.css +1 -0
- package/src/assets/web-panel/assets/{Federation-CTqx_W7v.js → Federation-Dq7CrAzj.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-osTx97Qg.js → FormItemContext-C7TvuLVK.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-BjGqcYmH.js → GenericCardRenderer-BJUR1Emh.js} +1 -1
- package/src/assets/web-panel/assets/{Git-oP8J-vJU.js → Git-B5MdAp15.js} +1 -1
- package/src/assets/web-panel/assets/{Governance-baRRVUT3.js → Governance-BIbPWlSM.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-BJv9RIRT.js → Inference-vOz9J05E.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-urHzEIyA.js → KnowledgeGraph-B_vUO-Td.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-DolRJl-U.js → Logs-BwPfxX3p.js} +1 -1
- package/src/assets/web-panel/assets/{Marketplace-D2UVsgpF.js → Marketplace-T5HNwUjX.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-Yd5JqbVW.js → McpTools-CuKeBPxy.js} +1 -1
- package/src/assets/web-panel/assets/{Memory-Dmk1-QZv.js → Memory-DmRW_sTE.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-BU0oWbkq.js → MobileBridge-DK2N_MJA.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-BqS_vUeM.js → MobileProjects-wl3bXCnJ.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-DopMOA8k.js → Mtc-C8e0941i.js} +4 -4
- package/src/assets/web-panel/assets/{MtcAudit-CXu5uROY.js → MtcAudit-Cwigy2IR.js} +1 -1
- package/src/assets/web-panel/assets/{Multisig-BphW6Mdt.js → Multisig-BSfh_ncy.js} +2 -2
- package/src/assets/web-panel/assets/{NLProgramming-BklgesRi.js → NLProgramming-BwzJAfJg.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-CANQbrRq.js → Notes-uilHH6hE.js} +1 -1
- package/src/assets/web-panel/assets/{NotificationSettings-CWSzkcZb.js → NotificationSettings-DvM3DTPW.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-BT5PI7wT.js → OrderTableRenderer-BIEm3hZl.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-5Hqtt2ym.js → Organization-zxWoIwYM.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-DyMWk2Y6.js → Overflow-BFxt7NlK.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-eGxbaV5X.js → P2P-BsbToYKZ.js} +1 -1
- package/src/assets/web-panel/assets/{PdhVaultBrowser-wWHjmRU4.js → PdhVaultBrowser-VU8vfhsS.js} +5 -5
- package/src/assets/web-panel/assets/{Permissions-DFWwuL2q.js → Permissions-C10Sd26B.js} +1 -1
- package/src/assets/web-panel/assets/{PersonalDataHub-CO9-IYDY.css → PersonalDataHub-Bz5u9Gth.css} +1 -1
- package/src/assets/web-panel/assets/PersonalDataHub-edJB7VeU.js +2 -0
- package/src/assets/web-panel/assets/{Pipeline-DliZt2Mv.js → Pipeline-qNmVxn5A.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-ZNOMPGHQ.js → Privacy-h78XF7eO.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-CWk2snFE.js → ProjectInit-C9-vm1no.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectSettings-CoAjW4AL.js → ProjectSettings-DpDNsQTb.js} +1 -1
- package/src/assets/web-panel/assets/{Projects-C6KMgAJt.js → Projects-CwU3W4RD.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-CYqA3mCx.js → Providers-C3KZlUEI.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-Cr-eGAv7.js → QuickAsk-CILvLGze.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-DElC1UQt.js → Recommend-XfFlk3BY.js} +1 -1
- package/src/assets/web-panel/assets/{Reputation-bWKeJttZ.js → Reputation-BqmWvaMD.js} +1 -1
- package/src/assets/web-panel/assets/{Row-DRJDsOPE.js → Row-BEbjCI_X.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-Bp6Tmfev.js → RssFeed-CFukIl-a.js} +1 -1
- package/src/assets/web-panel/assets/{Search-QoWOwCEz.js → Search-dVPkf1o2.js} +1 -1
- package/src/assets/web-panel/assets/{Security-B8j-H_67.js → Security-DlRFaUrn.js} +3 -3
- package/src/assets/web-panel/assets/{Services-bKvYVLGg.js → Services-DKy7AjpA.js} +1 -1
- package/src/assets/web-panel/assets/{Skeleton-CqpVlrnn.js → Skeleton-DL5ebkDK.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-PMfgZ2KF.js → Skills-BEqnpg2j.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-B-Zgl1dF.js → Sla-CZ9_lzPI.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-D6goSbXE.js → SpeechSettings-DVSY_ehZ.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-C2VNylKT.js → SyncSettings-DgvsRpGt.js} +1 -1
- package/src/assets/web-panel/assets/{Tasks-Dx1H9prx.js → Tasks-L5qXKsxK.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-BRu5cbS4.js → Templates-DR4VBx7q.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-DvIQuTba.js → Tenant-jMyaK184.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-B266kmrZ.js → Terminal-DA5gjCiE.js} +1 -1
- package/src/assets/web-panel/assets/{TimelineRenderer-iBpF5BMU.js → TimelineRenderer-BM17JHyr.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-BoG6Zx_M.js → Tokens-CCJIrnhi.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-LqfyMoOL.js → Trigger-Rzs-a8Xf.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-xAoRgKxa.js → Trust-BHeJEfNG.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-CtirepJZ.js → UkeySign-DjcIVRk4.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-6IuStjZ5.js → VideoEditing-BPhptg3q.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-Dk56EY1_.js → Wallet-D_xDgfaz.js} +1 -1
- package/src/assets/web-panel/assets/{WebAuthn-BvPmwWnm.js → WebAuthn-pd961lgM.js} +2 -2
- package/src/assets/web-panel/assets/{WorkflowEditor-Bw6-cx6j.js → WorkflowEditor-BmXDUZ8M.js} +1 -1
- package/src/assets/web-panel/assets/{chat-Cdj1kT2p.js → chat-C7tndXfg.js} +1 -1
- package/src/assets/web-panel/assets/{colors-DeYVkmQB.js → colors-dUAGx-eS.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-YdLwHUnK.js → compact-item-X13u92RU.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-BgVweRe_.js → createContext-BBLoTzN8.js} +1 -1
- package/src/assets/web-panel/assets/{hasIn-BfPrzImU.js → hasIn-DGFXWm7Y.js} +1 -1
- package/src/assets/web-panel/assets/{icons-AILO5ZcK.js → icons--SBOhPAi.js} +1 -1
- package/src/assets/web-panel/assets/{index-DlTYhL0_.js → index-1xUFGcnI.js} +1 -1
- package/src/assets/web-panel/assets/{index-BfLZ_2PS.js → index-4BeUpRaU.js} +1 -1
- package/src/assets/web-panel/assets/{index-DRkpHBkk.js → index-AVHrO1io.js} +1 -1
- package/src/assets/web-panel/assets/{index-BD1wkCPJ.js → index-B2fc2n_u.js} +1 -1
- package/src/assets/web-panel/assets/index-B5aXiiOG.js +1 -0
- package/src/assets/web-panel/assets/{index-BQwckG0J.js → index-B78VsLFL.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dqo4LqpA.js → index-BECv44dY.js} +1 -1
- package/src/assets/web-panel/assets/{index-BW19IY_8.js → index-BGn5-2TK.js} +1 -1
- package/src/assets/web-panel/assets/{index-C5KeLwZA.js → index-BM9IHnrf.js} +1 -1
- package/src/assets/web-panel/assets/{index-D2XbFRiY.js → index-Bewc5jaO.js} +1 -1
- package/src/assets/web-panel/assets/{index-3f7tGA57.js → index-BipKV1Yr.js} +1 -1
- package/src/assets/web-panel/assets/{index-LKKW1K6I.js → index-BlMshk9V.js} +1 -1
- package/src/assets/web-panel/assets/{index-Db7x8taS.js → index-BoWoWh9f.js} +1 -1
- package/src/assets/web-panel/assets/{index-CzUQB78O.js → index-BqX3jeij.js} +1 -1
- package/src/assets/web-panel/assets/{index-YxGhixbd.js → index-Bt79ud6Y.js} +1 -1
- package/src/assets/web-panel/assets/{index-BwWqMM1e.js → index-C14mc-46.js} +1 -1
- package/src/assets/web-panel/assets/{index-BwFGZ0gC.js → index-C54Ydkuz.js} +1 -1
- package/src/assets/web-panel/assets/{index-CHqE69u0.js → index-CBnkvGxd.js} +1 -1
- package/src/assets/web-panel/assets/{index-BCXxYTy1.js → index-CO9Tt0Bo.js} +1 -1
- package/src/assets/web-panel/assets/{index-D5lJG4eM.js → index-CSZvB2uy.js} +1 -1
- package/src/assets/web-panel/assets/{index-CdpvXrvI.js → index-Ced-t9AY.js} +1 -1
- package/src/assets/web-panel/assets/{index-DnbTnTqA.js → index-CjeazYU2.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bq8pMiMX.js → index-Cq-fdWWC.js} +1 -1
- package/src/assets/web-panel/assets/{index-k9Q7n8PP.js → index-CvlrcZKy.js} +1 -1
- package/src/assets/web-panel/assets/{index-wZaESifz.js → index-Cw-TEBru.js} +1 -1
- package/src/assets/web-panel/assets/{index-BH3xc-lf.js → index-CyObfnlZ.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bdaro36b.js → index-D0d2TS5o.js} +11 -11
- package/src/assets/web-panel/assets/{index-CWl44ndZ.js → index-DBfn83eM.js} +1 -1
- package/src/assets/web-panel/assets/{index-D3z7vVsU.js → index-DV3zNhRX.js} +1 -1
- package/src/assets/web-panel/assets/{index-DjjhIPMi.js → index-DW1GR68q.js} +1 -1
- package/src/assets/web-panel/assets/{index-C64Y8_Py.js → index-DZMiVgXE.js} +1 -1
- package/src/assets/web-panel/assets/{index-Br-pkGhZ.js → index-Deh_HoQ3.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cn6Ft9Zm.js → index-DnHElN_A.js} +1 -1
- package/src/assets/web-panel/assets/{index-m-5_Wzm1.js → index-DrH9uW99.js} +1 -1
- package/src/assets/web-panel/assets/{index-BCj6XF7T.js → index-DspW4reY.js} +1 -1
- package/src/assets/web-panel/assets/index-DxUFdvJ5.js +1 -0
- package/src/assets/web-panel/assets/{index-Bu3HR-0d.js → index-La4F-U-s.js} +1 -1
- package/src/assets/web-panel/assets/{index-1D1GHz6V.js → index-azbNWBMo.js} +1 -1
- package/src/assets/web-panel/assets/{index-D6KKj0k2.js → index-squRDiXd.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-BnQhVe4d.js → initDefaultProps-B8zdOlFC.js} +1 -1
- package/src/assets/web-panel/assets/{motion-BNLEv9Xs.js → motion-ChVLXdRp.js} +1 -1
- package/src/assets/web-panel/assets/{move-1kzEwUL4.js → move-BioqdqDn.js} +1 -1
- package/src/assets/web-panel/assets/{omit-BAxRDX2e.js → omit-C1hn14Vc.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-DUNlz8hS.js → pickAttrs-DgVG8oMj.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-C4hgKCO_.js → placementArrow-cJY6hoXZ.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-Dx_PXbJ8.js → responsiveObserve-DbUdURRx.js} +1 -1
- package/src/assets/web-panel/assets/{slide-BZh1EbeV.js → slide-C2OEWnC4.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-BK_Kgswi.js → statusUtils-DghgcGqm.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-k0u8jXS4.js → styleChecker-GoQ7uwU1.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-BtS62yHN.js → useFlexGapSupport-CzD0s7wN.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-C6K_Uzdm.js → useFs-CZCJDMup.js} +1 -1
- package/src/assets/web-panel/assets/usePersonalDataHub-BjAS9b7w.js +1 -0
- package/src/assets/web-panel/assets/{vnode-AyvpNFtY.js → vnode-CnXQ7gJ2.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-CVFICRzk.js → zoom-CzyiNxpd.js} +1 -1
- package/src/assets/web-panel/index.html +2 -2
- package/src/commands/hub.js +91 -6
- package/src/gateways/ws/personal-data-hub-protocol.js +14 -0
- package/src/lib/personal-data-hub-wiring.js +24 -0
- package/src/assets/web-panel/assets/AppLayout-C40opRc7.js +0 -3
- package/src/assets/web-panel/assets/PersonalDataHub-DuRBj5l4.js +0 -2
- package/src/assets/web-panel/assets/index-Cyu-87SR.js +0 -1
- package/src/assets/web-panel/assets/index-D2gby4S0.js +0 -1
- package/src/assets/web-panel/assets/usePersonalDataHub-CzwYxdJv.js +0 -1
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{w as ot,L as l,Q as k,N as a,c as o,M as _,R as c,F as oe,Y as ce,Z as nt,P as u,O as n,S as f,a1 as lt,f as pe,r as O,K as v,a as ue,a4 as Kt,o as Wt,u as J,a0 as qt,$ as Vt}from"./vendor-DhFY8mDK.js";import{u as Ne}from"./usePersonalDataHub-CzwYxdJv.js";import{_ as Re,d as p}from"./index-Bdaro36b.js";import{R as et,aB as Qt,O as Yt,al as Gt,h as Xt,aC as jt,Q as Jt,aD as Zt,aE as ea,y as ta,q as aa,aF as oa,a3 as na,ad as la,aG as sa,m as ra,e as tt}from"./icons-AILO5ZcK.js";const ia={key:0},ua={class:"vendor-head"},da={class:"hint"},ca={class:"hint",style:{"margin-top":"4px"}},pa={key:0,class:"hint",style:{"margin-top":"4px",color:"#ff4d4f"}},fa={key:1},va={class:"hint"},ma=["href"],ya={class:"howto"},ga=["href"],_a={key:3,style:{"margin-top":"8px"}},ka={key:2,class:"kv",style:{"margin-top":"4px"}},ba={key:3,class:"kv",style:{"margin-top":"4px",color:"#ff4d4f"}},Aa={key:2},wa={__name:"AIChatWizard",props:{open:{type:Boolean,default:!1},existingAccounts:{type:Array,default:()=>[]}},emits:["update:open","registered"],setup(ye,{emit:ke}){const C=ye,M=ke,X=[{vendor:"deepseek",displayName:"DeepSeek",notes:"手机号 + 验证码登录",requiredCookies:["userToken"],cookieMaxAgeHintDays:30},{vendor:"kimi",displayName:"Kimi",notes:"手机号验证码登录",requiredCookies:["access_token"],cookieMaxAgeHintDays:30},{vendor:"tongyi",displayName:"通义千问",notes:"阿里云账号 SSO(过期较快)",requiredCookies:["login_aliyunid"],cookieMaxAgeHintDays:7},{vendor:"zhipu",displayName:"智谱清言",notes:"手机号 + 验证码",requiredCookies:["chatglm_token"],cookieMaxAgeHintDays:30},{vendor:"hunyuan",displayName:"腾讯混元",notes:"QQ / 微信 / 手机号",requiredCookies:["hy_token"],cookieMaxAgeHintDays:14},{vendor:"qianfan",displayName:"百度文心",notes:"百度账号",requiredCookies:["BDUSS"],cookieMaxAgeHintDays:7},{vendor:"coze",displayName:"字节扣子 Coze",notes:"字节统一 passport",requiredCookies:["sessionid"],cookieMaxAgeHintDays:14},{vendor:"dreamina",displayName:"即梦 Dreamina",notes:"字节图像生成",requiredCookies:["sessionid"],cookieMaxAgeHintDays:14},{vendor:"doubao",displayName:"豆包 Doubao",notes:"字节文本 AI",requiredCookies:["sessionid"],cookieMaxAgeHintDays:14}],$=Ne(),g=O(1),A=O(null),T=O(""),x=O(null),B=O(null),Y=O(null),U=ue({open:!1,probe:!1,register:!1}),de=pe(()=>X.find(b=>b.vendor===A.value)||{}),fe=pe(()=>g.value===1?"选择一家 AI 服务商":g.value===2?x.value?.fallbackMode==="paste"?"在外部浏览器登录,把 cookie 粘贴到下面":"在内嵌浏览器登录,主进程自动读取 cookie":"校验并写入本地加密 vault"),Z=pe(()=>{const b=B.value;return b?b.reason==="UNKNOWN_VENDOR"?"未知厂商 — 请刷新页面或重选":b.reason==="PASTE_REQUIRED"?"请先粘贴 cookie 字符串":b.missingRequired?.length?`缺关键 cookie: ${b.missingRequired.join(", ")}`:b.reason||"cookie 校验失败":""}),N=pe(()=>{const b=Y.value;return b?b.reason==="REQUIRED_COOKIES_MISSING"?`缺关键 cookie: ${(b.missingRequired||[]).join(", ")}`:b.reason==="VALIDATE_COOKIE_FAILED"?"厂商拒绝该 cookie(可能已过期或被风控)":b.reason==="ADAPTER_THREW"?`Adapter 抛错: ${b.error||"网络错误"}`:b.reason==="UNKNOWN_VENDOR"?"未知厂商":b.reason||"注册失败":"未知错误"});function y(b){return C.existingAccounts.some(i=>i&&i.vendor===b)}function re(b){return C.existingAccounts.find(i=>i&&i.vendor===b)||null}function q(b){const i=re(b);return i?i.lastHealth?i.lastHealth.ok?"ok":i.lastHealth.reason==="SPEC_VERSION_MISMATCH"?"mismatch":"fail":"unknown":null}function ne(b){const i=re(b);if(!i||!i.lastHealth||i.lastHealth.ok)return"";const z=i.lastHealth.reason;return z?z==="SPEC_VERSION_MISMATCH"?"cookie 规格已升级,请重新登录":z==="ADAPTER_THREW"?"上次校验抛错,建议稍后重试":z==="COOKIE_EXPIRED"?"Cookie 已过期,请重新登录":z:"Cookie 校验失败,建议重新登录"}async function ee(b){try{(await $.unregisterAichat(b))?.ok&&M("registered",{vendor:b,accountId:null,unregistered:!0})}catch(i){Y.value={ok:!1,reason:i?.message||"UNREGISTER_FAILED"}}}function w(b){A.value=b}async function K(){if(A.value){U.open=!0,x.value=null,B.value=null,T.value="";try{if(x.value=await $.openAichatLogin(A.value),!x.value?.ok)return;g.value=2}catch(b){x.value={ok:!1,reason:b?.message||"OPEN_FAILED"}}finally{U.open=!1}}}async function le(){U.probe=!0,B.value=null;try{const b=T.value.trim(),i=b||void 0;B.value=await $.probeAichatCookies(A.value,i)}catch(b){B.value={ok:!1,reason:b?.message||"PROBE_FAILED"}}finally{U.probe=!1}}async function S(){if(B.value?.ok){U.register=!0;try{Y.value=await $.registerAichatVendor(A.value,B.value.cookies),g.value=3,Y.value?.ok&&M("registered",{vendor:A.value,accountId:Y.value.accountId})}catch(b){Y.value={ok:!1,reason:b?.message||"REGISTER_FAILED"},g.value=3}finally{U.register=!1}}}function V(){g.value=1,A.value=null,T.value="",x.value=null,B.value=null,Y.value=null}function ve(){V(),M("update:open",!1)}return ot(()=>C.open,b=>{b&&V()}),(b,i)=>{const z=v("a-alert"),h=v("a-tag"),j=v("a-button"),he=v("a-popconfirm"),be=v("a-card"),Oe=v("a-col"),ge=v("a-row"),H=v("a-collapse-panel"),F=v("a-collapse"),I=v("a-textarea"),d=v("a-form-item"),Pe=v("a-form"),Ae=v("a-result"),$e=v("a-space"),xe=v("a-drawer");return l(),k(xe,{open:ye.open,title:"添加 AI 对话账号",placement:"right",width:640,"destroy-on-close":!0,"onUpdate:open":i[4]||(i[4]=L=>M("update:open",L)),onClose:ve},{footer:a(()=>[o($e,{style:{float:"right"}},{default:a(()=>[g.value>1&&g.value<3?(l(),k(j,{key:0,onClick:i[3]||(i[3]=L=>g.value=g.value-1)},{default:a(()=>[...i[22]||(i[22]=[n("上一步",-1)])]),_:1})):f("",!0),o(j,{onClick:ve},{default:a(()=>[...i[23]||(i[23]=[n("取消",-1)])]),_:1}),g.value===1?(l(),k(j,{key:1,type:"primary",disabled:!A.value,loading:U.open,onClick:K},{default:a(()=>[...i[24]||(i[24]=[n(" 下一步 ",-1)])]),_:1},8,["disabled","loading"])):f("",!0),g.value===2&&x.value?.fallbackMode==="paste"?(l(),k(j,{key:2,loading:U.probe,disabled:!T.value.trim(),onClick:le},{default:a(()=>[...i[25]||(i[25]=[n(" 检测 cookie ",-1)])]),_:1},8,["loading","disabled"])):f("",!0),g.value===2&&x.value?.fallbackMode!=="paste"?(l(),k(j,{key:3,loading:U.probe,onClick:le},{default:a(()=>[...i[26]||(i[26]=[n(" 检测 cookie ",-1)])]),_:1},8,["loading"])):f("",!0),g.value===2?(l(),k(j,{key:4,type:"primary",loading:U.register,disabled:!B.value?.ok,onClick:S},{default:a(()=>[...i[27]||(i[27]=[n(" 注册 ",-1)])]),_:1},8,["loading","disabled"])):f("",!0)]),_:1})]),default:a(()=>[o(z,{message:`第 ${g.value} / 3 步`,description:fe.value,type:"info","show-icon":"",style:{"margin-bottom":"16px"}},null,8,["message","description"]),g.value===1?(l(),_("div",ia,[i[10]||(i[10]=c("p",{class:"hint"}," 选择要接入的 AI 服务商。登录后将本地读取 cookie 同步对话历史;cookie 仅落本机加密文件,不上传任何云端。 ",-1)),o(ge,{gutter:[12,12]},{default:a(()=>[(l(),_(oe,null,ce(X,L=>o(Oe,{xs:24,sm:12,md:8,key:L.vendor},{default:a(()=>[o(be,{size:"small",hoverable:"",class:nt(["vendor-card",{selected:A.value===L.vendor}]),onClick:Ue=>w(L.vendor)},{default:a(()=>[c("div",ua,[c("strong",null,u(L.displayName),1),q(L.vendor)==="fail"?(l(),k(h,{key:0,color:"red"},{default:a(()=>[...i[5]||(i[5]=[n("🔴 重新登录",-1)])]),_:1})):q(L.vendor)==="mismatch"?(l(),k(h,{key:1,color:"orange"},{default:a(()=>[...i[6]||(i[6]=[n("⚠ 规格升级",-1)])]),_:1})):q(L.vendor)==="unknown"?(l(),k(h,{key:2,color:"blue"},{default:a(()=>[...i[7]||(i[7]=[n("已接入·待巡检",-1)])]),_:1})):q(L.vendor)==="ok"?(l(),k(h,{key:3,color:"green"},{default:a(()=>[...i[8]||(i[8]=[n("✓ 已接入",-1)])]),_:1})):f("",!0)]),c("div",da,u(L.notes),1),c("div",ca,[o(h,{color:"default"},{default:a(()=>[n(u(L.requiredCookies.length)+" 必需 cookie",1)]),_:2},1024),o(h,{color:"default"},{default:a(()=>[n("过期约 "+u(L.cookieMaxAgeHintDays)+" 天",1)]),_:2},1024)]),y(L.vendor)&&ne(L.vendor)?(l(),_("div",pa,u(ne(L.vendor)),1)):f("",!0),y(L.vendor)?(l(),_("div",{key:1,class:"vendor-actions",onClick:i[0]||(i[0]=lt(()=>{},["stop"]))},[o(he,{title:"注销该 AI 对话来源?历史事件仍可在 vault 中查询。","ok-text":"注销","cancel-text":"取消",onConfirm:Ue=>ee(L.vendor)},{default:a(()=>[o(j,{size:"small",type:"text",danger:""},{default:a(()=>[...i[9]||(i[9]=[n("注销",-1)])]),_:1})]),_:1},8,["onConfirm"])])):f("",!0)]),_:2},1032,["class","onClick"])]),_:2},1024)),64))]),_:1})])):f("",!0),g.value===2&&x.value?(l(),_("div",fa,[c("p",va,[c("strong",null,u(de.value.displayName),1),i[11]||(i[11]=n(" · ",-1)),c("a",{href:x.value.loginUrl,target:"_blank",rel:"noopener noreferrer"},u(x.value.loginUrl),9,ma)]),x.value.fallbackMode==="paste"?(l(),k(z,{key:0,message:x.value.helpText||"请在外部浏览器登录后从开发者工具复制全部 cookie 字符串粘贴到下方。",type:"warning","show-icon":"",style:{"margin-bottom":"12px"}},null,8,["message"])):(l(),k(z,{key:1,message:"桌面端:请在弹出的内嵌浏览器窗口登录后点击 “检测 cookie”。",type:"info","show-icon":"",style:{"margin-bottom":"12px"}})),x.value.fallbackMode==="paste"?(l(),k(F,{key:2,bordered:!1,style:{"margin-bottom":"12px"}},{default:a(()=>[o(H,{key:"howto",header:"如何获取 cookie 字符串?"},{default:a(()=>[c("ol",ya,[c("li",null,[i[12]||(i[12]=n("用 Chrome / Edge 打开 ",-1)),c("a",{href:x.value.loginUrl,target:"_blank"},u(x.value.loginUrl),9,ga)]),i[13]||(i[13]=c("li",null,"完成登录,进入对话页",-1)),i[14]||(i[14]=c("li",null,[n("按 "),c("kbd",null,"F12"),n(" 打开开发者工具 → "),c("strong",null,"Application"),n(" → "),c("strong",null,"Cookies")],-1)),i[15]||(i[15]=c("li",null,"选中域名 → 全选所有 cookie 行 → 用扩展(如 EditThisCookie)导出 “name=value; …” 串",-1)),i[16]||(i[16]=c("li",null,[n("或在 Console 执行 "),c("code",null,"document.cookie"),n(" 复制结果(注意:HTTP-Only cookie 取不到,仍需 Application 面板)")],-1)),i[17]||(i[17]=c("li",null,"粘贴到下方文本框,点 “检测 cookie”",-1))])]),_:1})]),_:1})):f("",!0),o(Pe,{layout:"vertical"},{default:a(()=>[o(d,{label:"Cookie 字符串"},{default:a(()=>[o(I,{value:T.value,"onUpdate:value":i[1]||(i[1]=L=>T.value=L),rows:6,placeholder:"name1=value1; name2=value2; name3=value3 …",autocomplete:"off"},null,8,["value"])]),_:1})]),_:1}),B.value?(l(),_("div",_a,[B.value.ok?(l(),k(z,{key:0,type:"success","show-icon":"",message:`已识别 ${B.value.foundRequired.length} 个必需 cookie + ${B.value.foundOptional.length} 个可选 cookie`},null,8,["message"])):(l(),k(z,{key:1,type:"error","show-icon":"",message:Z.value},null,8,["message"])),B.value.foundRequired?.length?(l(),_("div",ka," ✓ "+u(B.value.foundRequired.join(", ")),1)):f("",!0),B.value.missingRequired?.length?(l(),_("div",ba," 缺失: "+u(B.value.missingRequired.join(", ")),1)):f("",!0)])):f("",!0)])):f("",!0),g.value===3?(l(),_("div",Aa,[Y.value?.ok?(l(),k(Ae,{key:0,status:"success",title:`${de.value.displayName} 已接入`,"sub-title":`accountId: ${Y.value.accountId} · userId: ${Y.value.validation?.userId||"匿名"}`},{extra:a(()=>[o(j,{type:"primary",onClick:ve},{default:a(()=>[...i[18]||(i[18]=[n("完成",-1)])]),_:1}),o(j,{onClick:V},{default:a(()=>[...i[19]||(i[19]=[n("再加一家",-1)])]),_:1})]),_:1},8,["title","sub-title"])):(l(),k(Ae,{key:1,status:"error",title:"接入失败","sub-title":N.value},{extra:a(()=>[o(j,{type:"primary",onClick:i[2]||(i[2]=L=>g.value=2)},{default:a(()=>[...i[20]||(i[20]=[n("返回粘贴 cookie",-1)])]),_:1}),o(j,{onClick:V},{default:a(()=>[...i[21]||(i[21]=[n("选其他厂商",-1)])]),_:1})]),_:1},8,["sub-title"]))])):f("",!0)]),_:1},8,["open"])}}},Ca=Re(wa,[["__scopeId","data-v-a608230c"]]),Ia={key:0},Da={key:0,class:"probe-result"},Ea={key:0,class:"kv"},Sa={key:0,class:"kv"},ha={key:1},Oa={key:2},Pa={key:2,style:{"margin-top":"12px"}},$a={__name:"WechatWizard",props:{open:{type:Boolean,default:!1}},emits:["update:open","registered"],setup(ye,{emit:ke}){const C=ye,M=ke,X=Ne(),$=O(1),g=O(null),A=ue({uin:"",dbPath:"",wechatDataPath:"",forceProvider:null}),T=O(null),x=ue({probe:!1,register:!1}),B=pe(()=>$.value===1?"探测设备 + WeChat 版本,确认可用的 keyProvider":$.value===2?"填 UIN 与已 adb-pull 的本地路径":"bootstrap 注册 + 持久化 wechat-accounts.json"),Y=pe(()=>{const N=T.value;return N?N.reason==="ENV_UNSUPPORTED"?N.message||"env-probe 拒绝 — 请回到第 1 步看 reasons":N.reason==="MD5_NEEDS_WECHAT_DATA_PATH"?"MD5 路径需要 wechatDataPath":N.reason==="FRIDA_NEEDS_WXID"?"Frida 路径需要 account.uin / wxid":N.reason==="ADAPTER_CTOR_FAILED"?`Adapter ctor 抛错: ${N.message||""}`:N.reason==="BOOTSTRAP_THREW"?`Bootstrap 抛错: ${N.message||""}`:N.reason==="UIN_REQUIRED"?"UIN 不能为空":N.message||N.reason||"注册失败":"未知错误"});async function U(){x.probe=!0;try{g.value=await X.probeWechatEnv()}catch(N){g.value={ok:!1,suggestedKeyProvider:"unsupported",reasons:[N?.message||"probe failed"],device:{reachable:!1},root:{detected:!1,magiskInstalled:!1},frida:{serverRunning:!1,port:null},wechat:{installed:!1,versionName:null,majorVersion:null},warnings:[]}}finally{x.probe=!1}}async function de(){x.register=!0;try{T.value=await X.registerWechat({account:{uin:A.uin},dbPath:A.dbPath||null,wechatDataPath:A.wechatDataPath||null,keyProviderOverride:A.forceProvider}),$.value=3,T.value?.ok&&M("registered",{uin:A.uin,chosenKeyProvider:T.value.chosenKeyProvider})}catch(N){T.value={ok:!1,reason:"BOOTSTRAP_THREW",message:N?.message||"RPC failed"},$.value=3}finally{x.register=!1}}function fe(){$.value=1,g.value=null,A.uin="",A.dbPath="",A.wechatDataPath="",A.forceProvider=null,T.value=null}function Z(){fe(),M("update:open",!1)}return ot(()=>C.open,N=>{N&&fe()}),(N,y)=>{const re=v("a-alert"),q=v("a-button"),ne=v("a-tag"),ee=v("a-descriptions-item"),w=v("a-descriptions"),K=v("a-input"),le=v("a-form-item"),S=v("a-radio"),V=v("a-radio-group"),ve=v("a-form"),b=v("a-result"),i=v("a-space"),z=v("a-drawer");return l(),k(z,{open:ye.open,title:"添加 WeChat 账号",placement:"right",width:640,"destroy-on-close":!0,"onUpdate:open":y[8]||(y[8]=h=>M("update:open",h)),onClose:Z},{footer:a(()=>[o(i,{style:{float:"right"}},{default:a(()=>[$.value>1&&$.value<3?(l(),k(q,{key:0,onClick:y[6]||(y[6]=h=>$.value=$.value-1)},{default:a(()=>[...y[21]||(y[21]=[n("上一步",-1)])]),_:1})):f("",!0),o(q,{onClick:Z},{default:a(()=>[...y[22]||(y[22]=[n("取消",-1)])]),_:1}),$.value===1?(l(),k(q,{key:1,type:"primary",disabled:!g.value||g.value.suggestedKeyProvider==="unsupported",onClick:y[7]||(y[7]=h=>$.value=2)},{default:a(()=>[...y[23]||(y[23]=[n(" 下一步 ",-1)])]),_:1},8,["disabled"])):f("",!0),$.value===2?(l(),k(q,{key:2,type:"primary",loading:x.register,disabled:!A.uin||g.value?.suggestedKeyProvider==="md5"&&!A.wechatDataPath,onClick:de},{default:a(()=>[...y[24]||(y[24]=[n(" 注册 ",-1)])]),_:1},8,["loading","disabled"])):f("",!0)]),_:1})]),default:a(()=>[o(re,{message:`第 ${$.value} / 3 步`,description:B.value,type:"info","show-icon":"",style:{"margin-bottom":"16px"}},null,8,["message","description"]),$.value===1?(l(),_("div",Ia,[y[11]||(y[11]=c("p",{class:"hint"},[n(" 请用 USB 连接 Android 设备(开启 USB 调试)。WeChat ≥ 8.0 需要 root + frida-server。 探测仅读取 "),c("code",null,"adb shell"),n(" 命令输出,不写入任何东西。 ")],-1)),o(q,{type:"primary",loading:x.probe,onClick:U,style:{"margin-bottom":"12px"}},{default:a(()=>[...y[9]||(y[9]=[n(" 🔍 探测环境 ",-1)])]),_:1},8,["loading"]),g.value?(l(),_("div",Da,[o(w,{column:1,size:"small",bordered:""},{default:a(()=>[o(ee,{label:"suggestedKeyProvider"},{default:a(()=>[o(ne,{color:g.value.suggestedKeyProvider==="unsupported"?"red":"green"},{default:a(()=>[n(u(g.value.suggestedKeyProvider),1)]),_:1},8,["color"])]),_:1}),o(ee,{label:"adb 设备"},{default:a(()=>[o(ne,{color:g.value.device.reachable?"green":"red"},{default:a(()=>[n(u(g.value.device.reachable?"已连接":"未连接"),1)]),_:1},8,["color"]),g.value.device.serial?(l(),_("span",Ea,u(g.value.device.serial)+" · abi="+u(g.value.device.abi||"?"),1)):f("",!0)]),_:1}),o(ee,{label:"root"},{default:a(()=>[o(ne,{color:g.value.root.detected?"green":"default"},{default:a(()=>[n(u(g.value.root.detected?"已 root":"未 root"),1)]),_:1},8,["color"]),g.value.root.magiskInstalled?(l(),k(ne,{key:0,color:"blue"},{default:a(()=>[...y[10]||(y[10]=[n("Magisk",-1)])]),_:1})):f("",!0)]),_:1}),o(ee,{label:"frida-server"},{default:a(()=>[o(ne,{color:g.value.frida.serverRunning?"green":"default"},{default:a(()=>[n(u(g.value.frida.serverRunning?"运行中":"未运行"),1)]),_:1},8,["color"]),g.value.frida.port?(l(),_("span",Sa," :"+u(g.value.frida.port),1)):f("",!0)]),_:1}),o(ee,{label:"WeChat"},{default:a(()=>[o(ne,{color:g.value.wechat.installed?"green":"red"},{default:a(()=>[n(u(g.value.wechat.installed?g.value.wechat.versionName:"未安装"),1)]),_:1},8,["color"])]),_:1})]),_:1}),(l(!0),_(oe,null,ce(g.value.reasons||[],h=>(l(),k(re,{key:h,message:h,type:"info","show-icon":"",style:{"margin-top":"8px"}},null,8,["message"]))),128)),(l(!0),_(oe,null,ce(g.value.warnings||[],h=>(l(),k(re,{key:h,message:h,type:"warning","show-icon":"",style:{"margin-top":"8px"}},null,8,["message"]))),128))])):f("",!0)])):f("",!0),$.value===2?(l(),_("div",ha,[y[16]||(y[16]=c("p",{class:"hint"},[n(" 填写从 adb pull 拉下来的本地路径。MD5 路径(7.x)需要 "),c("code",null,"wechatDataPath"),n("; Frida 路径(8.0+)需要设备运行 frida-server。 ")],-1)),o(ve,{layout:"vertical"},{default:a(()=>[o(le,{label:"UIN / wxid",required:""},{default:a(()=>[o(K,{value:A.uin,"onUpdate:value":y[0]||(y[0]=h=>A.uin=h),placeholder:"WeChat 数字 UIN 或 wxid"},null,8,["value"])]),_:1}),o(le,{label:"dbPath(已拉下的 EnMicroMsg.db 本地路径)"},{default:a(()=>[o(K,{value:A.dbPath,"onUpdate:value":y[1]||(y[1]=h=>A.dbPath=h),placeholder:"C:\\\\users\\\\me\\\\pull\\\\EnMicroMsg.db"},null,8,["value"])]),_:1}),o(le,{label:"wechatDataPath(已拉下的 /data/data/com.tencent.mm/ 目录)"},{default:a(()=>[o(K,{value:A.wechatDataPath,"onUpdate:value":y[2]||(y[2]=h=>A.wechatDataPath=h),placeholder:"C:\\\\users\\\\me\\\\pull\\\\com.tencent.mm"},null,8,["value"]),y[12]||(y[12]=c("div",{class:"hint"},"MD5 路径必填;Frida 路径可空",-1))]),_:1}),o(le,{label:"强制 keyProvider(覆盖 env-probe 建议)"},{default:a(()=>[o(V,{value:A.forceProvider,"onUpdate:value":y[3]||(y[3]=h=>A.forceProvider=h)},{default:a(()=>[o(S,{value:null},{default:a(()=>[...y[13]||(y[13]=[n("自动(推荐)",-1)])]),_:1}),o(S,{value:"md5"},{default:a(()=>[...y[14]||(y[14]=[n("md5",-1)])]),_:1}),o(S,{value:"frida"},{default:a(()=>[...y[15]||(y[15]=[n("frida",-1)])]),_:1})]),_:1},8,["value"])]),_:1})]),_:1})])):f("",!0),$.value===3?(l(),_("div",Oa,[T.value?.ok?(l(),k(b,{key:0,status:"success",title:`WeChat 已接入 (uin=${A.uin})`,"sub-title":`provider=${T.value.chosenKeyProvider} · sensitivity=${T.value.sensitivity}`},{extra:a(()=>[o(q,{type:"primary",onClick:Z},{default:a(()=>[...y[17]||(y[17]=[n("完成",-1)])]),_:1}),o(q,{onClick:fe},{default:a(()=>[...y[18]||(y[18]=[n("再加一个",-1)])]),_:1})]),_:1},8,["title","sub-title"])):(l(),k(b,{key:1,status:"error",title:"接入失败","sub-title":Y.value},Kt({_:2},[T.value?.probe?.reasons?.length?{name:"extra",fn:a(()=>[o(q,{onClick:y[4]||(y[4]=h=>$.value=1)},{default:a(()=>[...y[19]||(y[19]=[n("返回检查环境",-1)])]),_:1}),o(q,{onClick:y[5]||(y[5]=h=>$.value=2)},{default:a(()=>[...y[20]||(y[20]=[n("返回修改路径",-1)])]),_:1})]),key:"0"}:void 0]),1032,["sub-title"])),T.value?.probe?.reasons?.length?(l(),_("div",Pa,[(l(!0),_(oe,null,ce(T.value.probe.reasons,h=>(l(),k(re,{key:h,message:h,type:"warning","show-icon":"",style:{"margin-bottom":"4px"}},null,8,["message"]))),128))])):f("",!0)])):f("",!0)]),_:1},8,["open"])}}},xa=Re($a,[["__scopeId","data-v-c7327e24"]]),Ua={class:"pdh-page"},Ma={class:"pdh-header"},Ta={class:"kv"},La={key:0,class:"kv"},Ba={key:1,class:"kv"},Na={class:"kv"},Ra={key:0,class:"kv hint"},Ha={style:{"margin-top":"12px",display:"flex","justify-content":"space-between","align-items":"center"}},Fa={key:0,style:{"margin-top":"12px"}},za={key:1,style:{"margin-top":"12px"}},Ka={class:"answer"},Wa={style:{"margin-top":"8px","font-size":"12px",color:"var(--text-color-secondary, #888)"}},qa={key:2,style:{"margin-top":"8px"}},Va={style:{display:"flex","align-items":"center",gap:"8px"}},Qa={class:"hint",style:{"margin-top":"4px"}},Ya={key:0,style:{"margin-top":"16px"}},Ga={class:"json-pre",style:{"max-height":"300px",overflow:"auto"}},Xa={key:0,style:{"margin-top":"8px"}},ja={style:{"min-width":"220px"}},Ja={style:{color:"#999","font-size":"12px","margin-left":"4px"}},Za={key:2,style:{"margin-top":"12px"}},eo={class:"kv",style:{"margin-bottom":"4px"}},to={key:0,style:{color:"#faad14"}},ao={key:2,class:"kv hint"},oo={key:3,class:"kv hint",style:{color:"#ff4d4f"}},no={key:3,style:{"margin-top":"12px"}},lo={key:2,style:{"margin-top":"8px"}},so={key:1},ro={style:{"margin-left":"8px"}},io={key:3,class:"json-pre"},uo={style:{"margin-left":"6px"}},co={key:0,style:{"margin-left":"6px"}},po={key:0,class:"hint",style:{"margin-top":"4px"}},fo={key:0,style:{"margin-top":"8px"}},vo={style:{"margin-bottom":"12px"}},mo={class:"hint"},yo={class:"kv"},go={class:"kv",style:{"margin-top":"4px"}},_o={class:"kv"},ko={key:0,class:"hint",style:{"margin-top":"4px"}},bo={key:1,style:{"font-size":"11px"}},at="pdh.syncIncludeOptions.v1",Ao={__name:"PersonalDataHub",setup(ye,{expose:ke}){const C=Ne(),M=O(null),X=O(null),$=O([]),g=O(""),A=O(null),T=O(""),x=O(!1),B=O(!1),Y=O([]),U=O(null),de={"system-data-android":{contacts:!0,apps:!0,sms:!0,calls:!0}};function fe(){try{const e=localStorage.getItem(at);if(!e)return JSON.parse(JSON.stringify(de));const t=JSON.parse(e);return{"system-data-android":{...de["system-data-android"],...t["system-data-android"]||{}}}}catch{return JSON.parse(JSON.stringify(de))}}const Z=ue(fe());function N(){try{localStorage.setItem(at,JSON.stringify(Z)),console.log("[PDH-include] persisted:",JSON.stringify(Z))}catch(e){console.warn("[PDH-include] persist failed:",e&&e.message)}}const y=O({}),re={"system-data-android":[{key:"contacts",label:"联系人",hint:"~767 条"},{key:"apps",label:"已安装应用",hint:"~176 个"},{key:"sms",label:"短信内容",hint:"~2400 条 · 高敏感",sensitive:!0},{key:"calls",label:"通话记录",hint:"~18000 条 · 包含号码",sensitive:!0}]};function q(e){return Object.prototype.hasOwnProperty.call(re,e)}function ne(e,t,s){const m=s&&s.target?!!s.target.checked:!!s;console.log("[PDH-include] toggle",e,t,"=>",m),Z[e]||(Z[e]={}),Z[e][t]=m,N()}const ee=O(!1),w=ue({provider:"qq",email:"",authCode:"",host:"",port:993,pdfPasswordHints:{idCardLast6:"",phoneLast6:"",cardLast6:""}}),K=O(null),le=O(!1),S=O(null),V=O(null),ve=[{name:"analysis.spending",label:"消费分析",icon:jt,description:"总支出 / 商家排行 / 月度趋势"},{name:"analysis.relations",label:"人际关系",icon:Jt,description:"与每个人的互动频率 / 主动比例"},{name:"analysis.footprint",label:"足迹",icon:Zt,description:"常去地点 / 出行模式"},{name:"analysis.interests",label:"兴趣画像",icon:ea,description:"从购买 / 浏览 / 收藏抽兴趣"},{name:"analysis.timeline",label:"时间线",icon:ta,description:"跨源事件串成故事"}],b=O(!1),i=O([]),z=ue({queue:{pending:0},mergeGroups:0,reviewQueue:0}),h=O(!1),j=O([]);function he(e){e?.unregistered?p.success(`已注销 ${e.vendor}`):p.success(`已接入 ${e.vendor}`),Q()}const be=O(!1);function Oe(e){p.success(`WeChat 已接入 (uin=${e.uin}, provider=${e.chosenKeyProvider})`),Q()}const ge=O(!1),H=ue({email:"",zipPassword:"",filePath:""}),F=O(null),I=ue({active:!1,adapter:"",phase:"",mailbox:"",current:0,total:0,attempt:1,errorMessage:""}),d=ue({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,bilibiliAdbSync:!1,bilibiliAdbDoctor:!1,douyinAdbSync:!1,weiboAdbSync:!1,xhsAdbSync:!1,toutiaoAdbSync:!1,kuaishouAdbSync:!1,bridgeDoctor:!1}),Pe=O(null);function Ae(e){switch(e){case"BRIDGE_UNAVAILABLE":return"adb 未安装或不在 PATH — 请安装 Android Platform Tools 或设置 ADB_PATH 环境变量";case"MODULE_LOAD_FAILED":return"PDH adapter 模块缺失 — 请重装 cc";case"BILIBILI_NO_ROOT":return"手机未 root — Bilibili 正式版 APK 不是 debuggable,需 Magisk root 才能读 Cookies DB";case"BILIBILI_NOT_INSTALLED_OR_NEVER_LOGGED_IN":return"请在手机上安装 Bilibili App 并登录一次,然后重试";case"BILIBILI_COOKIES_INCOMPLETE":return"Cookie 缺关键字段 — 请在手机 Bilibili App 上重新登录";case"BILIBILI_COOKIES_TRUNCATED":return"ADB 流被截断 — 拔插 USB 重试,或检查 `adb logcat` 是否有 MIUI ROM 干扰";case"BILIBILI_NOT_SQLITE":return"ADB 拉回的文件不是 sqlite — 可能 base64 stream 被 MIUI/HyperOS 干扰,拔插 USB 重试";case"BILIBILI_INVALID_UID":return"Cookie 中 DedeUserID 不是正整数 — 请重新登录";default:return"同步失败 — 详见 message 字段"}}function $e(e){switch(e){case"BRIDGE_UNAVAILABLE":return"adb 未安装或不在 PATH — 请安装 Android Platform Tools 或设置 ADB_PATH 环境变量";case"MODULE_LOAD_FAILED":return"PDH adapter 模块缺失 — 请重装 cc";case"DOUYIN_NO_ROOT":return"手机未 root — 抖音正式版 APK 不是 debuggable,需 Magisk root 才能读 IM 数据库";case"DOUYIN_NOT_INSTALLED":return"请在手机上安装抖音 App,然后重试";case"DOUYIN_NO_IM_DB":return"抖音 App 已装但未生成 IM 数据库 — 请登录抖音并打开任一聊天会话后重试";case"DOUYIN_MULTIPLE_USERS":return"此手机登录了多个抖音账号 — 请加 --uid <19位数字> 选一个";case"DOUYIN_UID_NOT_FOUND":return"指定的 uid 不在设备上的抖音账号列表里";case"DOUYIN_PULL_FAILED":return"ADB 流传输失败 — 拔插 USB 重试,或检查 `adb logcat` 是否有 MIUI ROM 干扰";case"DOUYIN_NOT_SQLITE":return"拉回的文件不是 sqlite — 可能 base64 stream 被 MIUI/HyperOS 干扰,拔插 USB 重试";default:return"同步失败 — 详见 message 字段"}}function xe(e){switch(e){case"BRIDGE_UNAVAILABLE":return"adb 未安装或不在 PATH — 请安装 Android Platform Tools 或设置 ADB_PATH 环境变量";case"MODULE_LOAD_FAILED":return"PDH adapter 模块缺失 — 请重装 cc";case"WEIBO_NO_ROOT":return"手机未 root — 微博正式版 APK 不是 debuggable,需 Magisk root 才能读 Cookies DB";case"WEIBO_NOT_INSTALLED":return"请在手机上安装微博 App 并登录一次,然后重试 (或微博使用了非默认 WebView 数据目录)";case"WEIBO_COOKIES_EMPTY":return"ADB 流返 0 字节 — MIUI/HyperOS silent 失败?拔插 USB 重试";case"WEIBO_COOKIES_TRUNCATED":return"ADB 流被截断 — 拔插 USB 重试,或检查 `adb logcat` 是否有 MIUI ROM 干扰";case"WEIBO_NOT_SQLITE":return"拉回的文件不是 sqlite — 可能 base64 stream 被 MIUI 干扰,拔插 USB 重试";case"WEIBO_BASE64_PARSE":return"base64 解码失败 — adb 终端编码问题,请检查 `chcp 65001`";case"WEIBO_COOKIES_INCOMPLETE":return"SUB cookie 缺失 — 请在手机微博 App 上重新登录";default:return"同步失败 — 详见 message 字段"}}function L(e){switch(e){case"BRIDGE_UNAVAILABLE":return"adb 未安装或不在 PATH — 请安装 Android Platform Tools 或设置 ADB_PATH 环境变量";case"MODULE_LOAD_FAILED":return"PDH adapter 模块缺失 — 请重装 cc";case"XHS_NO_ROOT":return"手机未 root — 小红书正式版 APK 不是 debuggable,需 Magisk root 才能读 Cookies DB";case"XHS_NOT_INSTALLED":return"请在手机上安装小红书 App 并登录一次,然后重试";case"XHS_COOKIES_EMPTY":return"ADB 流返 0 字节 — MIUI/HyperOS silent 失败?拔插 USB 重试";case"XHS_COOKIES_TRUNCATED":return"ADB 流被截断 — 拔插 USB 重试,或检查 `adb logcat` 是否有 MIUI ROM 干扰";case"XHS_NOT_SQLITE":return"拉回的文件不是 sqlite — 可能 base64 stream 被 MIUI 干扰,拔插 USB 重试";case"XHS_BASE64_PARSE":return"base64 解码失败 — adb 终端编码问题,请检查 `chcp 65001`";case"XHS_COOKIES_INCOMPLETE":return"a1 或 web_session cookie 缺失 — 请在手机小红书 App 上重新登录 (X-S 签名需要 a1 字段)";default:return"同步失败 — 详见 message 字段"}}async function Ue(){if(!d.xhsAdbSync){d.xhsAdbSync=!0;try{const e=await C.xhsAdbSync({});if(!e||!e.ok){const D=e&&e.reason||"SYNC_FAILED",E=L(D),R=e&&e.message||"";p.error({content:`Xhs ADB 同步失败:${E}`,description:R,duration:8});return}const t=e.report||{},s=t.xhs||{},m=s.eventCounts||{};s.meFetchFailed?p.warning({content:"Xhs 同步未拉到 user_id — /user/me 返空 data",description:`lastErrorCode=${s.lastErrorCode}, ${s.lastErrorMessage||""}。可能 cookie 已过期或 web_session 缺失,请在手机重新登录。`,duration:10}):s.lastErrorCode===461?p.warning({content:"Xhs X-S 签名被拒 (461) — 部分接口未抓到",description:`命中 ${m.total||0} events。我们的 X-S 算法 best-effort (~60% GET / <30% POST hit),461 在 POST 较常见。稍后重试 (X-S 算法可能 4-8 周 rotate)。`,duration:10}):s.lastErrorCode?p.warning({content:`Xhs 同步部分完成 (${m.total||0} events)`,description:`lastErrorCode=${s.lastErrorCode}, ${s.lastErrorMessage||""}`,duration:8}):p.success(`Xhs 同步成功:notes=${m.note||0} / liked=${m.liked||0} / follow=${m.follow||0} (total=${m.total||0})${s.nickname?" ["+s.nickname+"]":""}`),U.value=t,Q()}catch(e){p.error({content:"Xhs ADB 同步异常",description:e&&e.message?e.message:String(e),duration:8})}finally{d.xhsAdbSync=!1}}}function st(e){switch(e){case"BRIDGE_UNAVAILABLE":return"adb 未安装或不在 PATH — 请安装 Android Platform Tools 或设置 ADB_PATH 环境变量";case"MODULE_LOAD_FAILED":return"PDH adapter 模块缺失 — 请重装 cc";case"TOUTIAO_NO_ROOT":return"手机未 root — 头条正式版 APK 不是 debuggable,需 Magisk root 才能读 Cookies DB";case"TOUTIAO_NOT_INSTALLED":return"请在手机上安装今日头条 App(com.ss.android.article.news,不是极速版)并登录后随便点开一篇文章(让 WebView 写入 cookies),再重试";case"TOUTIAO_COOKIES_EMPTY":return"ADB 流返 0 字节 — MIUI/HyperOS silent 失败?拔插 USB 重试";case"TOUTIAO_COOKIES_TRUNCATED":return"ADB 流被截断 — 拔插 USB 重试,或检查 `adb logcat` 是否有 MIUI ROM 干扰";case"TOUTIAO_NOT_SQLITE":return"拉回的文件不是 sqlite — 可能 base64 stream 被 MIUI 干扰,拔插 USB 重试";case"TOUTIAO_BASE64_PARSE":return"base64 解码失败 — adb 终端编码问题,请检查 `chcp 65001`";case"TOUTIAO_COOKIES_INCOMPLETE":return"sessionid / sessionid_ss cookie 缺失 — 请在手机头条 App 上重新登录";default:return"同步失败 — 详见 message 字段"}}async function rt(){if(!d.toutiaoAdbSync){d.toutiaoAdbSync=!0;try{const e=await C.toutiaoAdbSync({});if(!e||!e.ok){const D=e&&e.reason||"SYNC_FAILED",E=st(D),R=e&&e.message||"";p.error({content:`Toutiao ADB 同步失败:${E}`,description:R,duration:8});return}const t=e.report||{},s=t.toutiao||{},m=s.eventCounts||{};s.profileFetchFailed?p.warning({content:"Toutiao 同步未拉到 user_id — passport/info/v2 返失败",description:`lastErrorCode=${s.lastErrorCode}, ${s.lastErrorMessage||""}。可能 cookie 已过期或 sessionid 缺失,请在手机重新登录。`,duration:10}):s.signProviderUsed==="none"&&m.feed===0&&m.collection===0&&m.search===0?p.warning({content:`Toutiao 同步仅获取了 profile (${m.profile||0} event)`,description:"当前 web-shell 上下文不支持 _signature 签名(仅 desktop app 提供 ToutiaoSignBridge)。打开桌面 app 同步可获取 feed / collection / search。",duration:12}):s.lastErrorCode?p.warning({content:`Toutiao 同步部分完成 (${m.total||0} events)`,description:`lastErrorCode=${s.lastErrorCode}, ${s.lastErrorMessage||""}`,duration:8}):p.success(`Toutiao 同步成功:profile=${m.profile||0} / feed=${m.feed||0} / collection=${m.collection||0} / search=${m.search||0} (total=${m.total||0})${s.nickname?" ["+s.nickname+"]":""}`),U.value=t,Q()}catch(e){p.error({content:"Toutiao ADB 同步异常",description:e&&e.message?e.message:String(e),duration:8})}finally{d.toutiaoAdbSync=!1}}}function it(e){switch(e){case"BRIDGE_UNAVAILABLE":return"adb 未安装或不在 PATH — 请安装 Android Platform Tools 或设置 ADB_PATH 环境变量";case"MODULE_LOAD_FAILED":return"PDH adapter 模块缺失 — 请重装 cc";case"KUAISHOU_NO_ROOT":return"手机未 root — 快手正式版 APK 不是 debuggable,需 Magisk root 才能读 Cookies DB";case"KUAISHOU_NOT_INSTALLED":return"请在手机上安装快手 App(com.smile.gifmaker,不是极速版 com.kuaishou.nebula)并登录后随便看一个视频(让 WebView 写入 cookies),再重试";case"KUAISHOU_COOKIES_EMPTY":return"ADB 流返 0 字节 — MIUI/HyperOS silent 失败?拔插 USB 重试";case"KUAISHOU_COOKIES_TRUNCATED":return"ADB 流被截断 — 拔插 USB 重试,或检查 `adb logcat` 是否有 MIUI ROM 干扰";case"KUAISHOU_NOT_SQLITE":return"拉回的文件不是 sqlite — 可能 base64 stream 被 MIUI 干扰,拔插 USB 重试";case"KUAISHOU_BASE64_PARSE":return"base64 解码失败 — adb 终端编码问题,请检查 `chcp 65001`";case"KUAISHOU_COOKIES_INCOMPLETE":return"userId / kuaishou.web.cp.api_ph cookie 缺失 — 请在手机快手 App 上重新登录";default:return"同步失败 — 详见 message 字段"}}async function ut(){if(!d.kuaishouAdbSync){d.kuaishouAdbSync=!0;try{const e=await C.kuaishouAdbSync({});if(!e||!e.ok){const D=e&&e.reason||"SYNC_FAILED",E=it(D),R=e&&e.message||"";p.error({content:`Kuaishou ADB 同步失败:${E}`,description:R,duration:8});return}const t=e.report||{},s=t.kuaishou||{},m=s.eventCounts||{};s.profileFetchFailed?p.warning({content:"Kuaishou 同步 cookie 缺 api_ph payload",description:`lastErrorCode=${s.lastErrorCode}, ${s.lastErrorMessage||""}。可能 cookie 已过期或登录态不完整(仅有 userId 但没有 api_ph),请在手机重新登录。`,duration:10}):s.signProviderUsed==="none"&&m.watch===0&&m.collect===0&&m.search===0?p.warning({content:`Kuaishou 同步仅获取了 profile (${m.profile||0} event)`,description:"当前 web-shell 上下文不支持 __NS_sig3 签名(仅 desktop app 提供 KuaishouSignBridge)。打开桌面 app 同步可获取 watch / collect / search。",duration:12}):s.lastErrorCode?p.warning({content:`Kuaishou 同步部分完成 (${m.total||0} events)`,description:`lastErrorCode=${s.lastErrorCode}, ${s.lastErrorMessage||""}`,duration:8}):p.success(`Kuaishou 同步成功:profile=${m.profile||0} / watch=${m.watch||0} / collect=${m.collect||0} / search=${m.search||0} (total=${m.total||0})${s.nickname?" ["+s.nickname+"]":""}`),U.value=t,Q()}catch(e){p.error({content:"Kuaishou ADB 同步异常",description:e&&e.message?e.message:String(e),duration:8})}finally{d.kuaishouAdbSync=!1}}}async function dt(){if(!d.bridgeDoctor){d.bridgeDoctor=!0;try{const e=await C.bridgeDoctor();if(!e||!e.ok){const W=e&&e.reason||"BRIDGE_DOCTOR_FAILED",G=e&&e.message||"";W==="MODULE_LOAD_FAILED"?p.error({content:"Bridge doctor 不可用",description:"当前上下文不是 Electron desktop app(cli / web-shell-only 无 sign-bridge 模块)。请从桌面 app 运行此诊断。",duration:10}):p.error({content:`Bridge doctor 失败:${W}`,description:G,duration:8});return}const t=e.results||{},s=["xhs","toutiao","kuaishou"],m=s.filter(W=>t[W]&&t[W].anyCandidatePresent).length,D=s.length,E=[];for(const W of s){const G=t[W];if(!G||!G.ok){E.push(`${W}: ✗ ${G&&G.error?G.error:"unknown error"}`);continue}const we=G.candidates||{},Ce=Object.keys(we).filter(Le=>we[Le]===!0),te=Object.keys(we).length,ie=G.anyCandidatePresent?"✓":"⚠",Te=G.anyCandidatePresent?`${Ce.length}/${te} candidate(s): ${Ce.join(", ")}`:`0/${te} candidates (rotation? 需更新 buildSignScript)`;E.push(`${W}: ${ie} ${Te} (warmUp=${G.warmUpMs}ms, probe=${G.probeMs}ms)`)}(m===D?p.success:m===0?p.error:p.warning)({content:`Bridge doctor: ${m}/${D} 平台签名可用`,description:E.join(`
|
|
2
|
-
`),duration:15}),Pe.value=e}catch(e){p.error({content:"Bridge doctor 异常",description:e&&e.message?e.message:String(e),duration:8})}finally{d.bridgeDoctor=!1}}}async function ct(){if(!d.weiboAdbSync){d.weiboAdbSync=!0;try{const e=await C.weiboAdbSync({});if(!e||!e.ok){const D=e&&e.reason||"SYNC_FAILED",E=xe(D),R=e&&e.message||"";p.error({content:`Weibo ADB 同步失败:${E}`,description:R,duration:8});return}const t=e.report||{},s=t.weibo||{},m=s.eventCounts||{};s.uidFetchFailed?p.warning({content:"Weibo 同步未拉到 UID — /api/config 返 login=false",description:`lastErrorCode=${s.lastErrorCode}, ${s.lastErrorMessage||""}。可能 cookie 已过期 (请在手机重新登录) 或微博触发 anti-bot redirect。事件数 0,未入 vault。`,duration:10}):s.lastErrorCode?p.warning({content:`Weibo 同步部分完成 (${m.total||0} events)`,description:`lastErrorCode=${s.lastErrorCode}, ${s.lastErrorMessage||""} — 部分接口受反爬限制,稍后重试可补齐`,duration:8}):p.success(`Weibo 同步成功:posts=${m.post||0} / fav=${m.favourite||0} / follow=${m.follow||0} (total=${m.total||0})`),U.value=t,Q()}catch(e){p.error({content:"Weibo ADB 同步异常",description:e&&e.message?e.message:String(e),duration:8})}finally{d.weiboAdbSync=!1}}}async function pt(){if(!d.douyinAdbSync){d.douyinAdbSync=!0;try{const e=await C.douyinAdbSync({});if(!e||!e.ok){const E=e&&e.reason||"SYNC_FAILED",R=$e(E),W=e&&e.message||"";p.error({content:`Douyin ADB 同步失败:${R}`,description:W,duration:8});return}const t=e.report||{},s=t.douyin||{},m=s.eventCounts||{},D=s.parserDiagnostic||{};if(!D.hadMsgTable&&!D.hadSimpleUserTable)p.warning({content:"Douyin 同步完成但 0 events",description:"msg 和 SIMPLE_USER 表都未在 IM 数据库中找到 — 抖音 App 版本可能用了不同 schema",duration:10});else if(!D.hadMsgTable||!D.hadSimpleUserTable){const E=[];D.hadMsgTable||E.push("msg (私信)"),D.hadSimpleUserTable||E.push("SIMPLE_USER (联系人)"),p.warning({content:`Douyin 部分同步:msg=${m.message||0} contacts=${m.contact||0}`,description:`${E.join("、")} 表未找到,未入库部分数据`,duration:8})}else p.success(`Douyin 同步成功:messages=${m.message||0} contacts=${m.contact||0} (total=${m.total||0})`);U.value=t,Q()}catch(e){p.error({content:"Douyin ADB 同步异常",description:e&&e.message?e.message:String(e),duration:8})}finally{d.douyinAdbSync=!1}}}async function ft(){if(!d.bilibiliAdbDoctor){d.bilibiliAdbDoctor=!0;try{const e=await C.bilibiliAdbDoctor();if(!e||!e.ok){const s=e&&e.reason||"PROBE_FAILED",m=Ae(s),D=e&&e.message||"";p.error({content:`Bilibili 诊断失败:${m}`,description:D,duration:8});return}const t=e.cookieDiagnostic||{};t.hadEncrypted?p.warning({content:`Bilibili 环境就绪 (uid=${e.uid}) — 但发现 Keystore 加密 cookie`,description:`cookies 数=${t.cookieCount||"?"}; 部分行使用 Android Keystore 加密 (跳过)。可能是较新 Bilibili App + Android 14+。可继续同步,但可能数据不全。`,duration:10}):p.success(`Bilibili 环境就绪 — uid=${e.uid}, 找到 ${t.cookieCount||"?"} 个 cookie,可以同步`)}catch(e){p.error({content:"Bilibili 诊断异常",description:e&&e.message?e.message:String(e),duration:8})}finally{d.bilibiliAdbDoctor=!1}}}async function vt(){if(!d.bilibiliAdbSync){d.bilibiliAdbSync=!0;try{const e=await C.bilibiliAdbSync({});if(!e||!e.ok){const D=e&&e.reason||"SYNC_FAILED",E=Ae(D),R=e&&e.message||"";p.error({content:`Bilibili ADB 同步失败:${E}`,description:R,duration:8});return}const t=e.report||{},s=t.bilibili||{},m=s.eventCounts||{};s.lastErrorCode?p.warning({content:`Bilibili 同步部分完成 (${m.total||0} events)`,description:`lastErrorCode=${s.lastErrorCode}, ${s.lastErrorMessage||""} — 部分接口受反爬限制,稍后重试可补齐`,duration:8}):p.success(`Bilibili 同步成功:history=${m.history||0} / fav=${m.favourite||0} / dyn=${m.dynamic||0} / follow=${m.follow||0} (total=${m.total||0})`),U.value=t,Q()}catch(e){p.error({content:"Bilibili ADB 同步异常",description:e&&e.message?e.message:String(e),duration:8})}finally{d.bilibiliAdbSync=!1}}}const mt=[{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"}],yt=[{title:"时间",key:"at",dataIndex:"at",width:170},{title:"动作",dataIndex:"action",key:"action",width:200},{title:"详情",key:"details"}],gt=[{title:"日期",key:"occurredAt",width:100},{title:"描述",dataIndex:"description",key:"description"},{title:"金额",key:"amount",width:140,align:"right"}];function _t(e){return e==="high"?"red":e==="medium"?"orange":"default"}function kt(e){if(!e)return"";const t=e.entityCounts||{},s=`events=${t.events??0} persons=${t.persons??0} | raw=${e.rawCount??0} invalid=${e.invalidCount??0} | KG triples=${e.kgTripleCount??0} RAG docs=${e.ragDocCount??0} | ${e.durationMs??0}ms`;return e.error?`${s} · 错误: ${e.error}`:s}async function Q(){d.refresh=!0;try{M.value=await C.health(),X.value=await C.stats(),$.value=await C.listAdapters();try{j.value=await C.listAichatAccounts()}catch{}}catch(e){p.error("刷新失败: "+e.message)}finally{d.refresh=!1}}async function He(){if(g.value.trim()){d.ask=!0,T.value="",A.value=null;try{A.value=await C.ask(g.value.trim(),{acceptNonLocal:x.value})}catch(e){T.value=e.message}finally{d.ask=!1}}}async function bt(){d.addMock=!0;try{await C.registerMock({count:30,seed:Date.now()%1e3}),await Q(),p.success("MockAdapter 已注册(30 条 mock 数据 ready 同步)")}catch(e){p.error("注册失败: "+e.message)}finally{d.addMock=!1}}function Fe(e=""){I.active=!0,I.adapter=e,I.phase="starting",I.mailbox="",I.current=0,I.total=0,I.attempt=1,I.errorMessage=""}function ze(e){e&&(e.adapter&&(I.adapter=e.adapter),e.phase&&(I.phase=e.phase),typeof e.current=="number"&&(I.current=e.current),typeof e.total=="number"&&(I.total=e.total),typeof e.attempt=="number"&&(I.attempt=e.attempt),e.mailbox&&(I.mailbox=e.mailbox),e.phase==="error"&&(I.errorMessage=e.message||"sync error"))}async function At(e){d.sync[e]=!0,Fe(e);try{const t=Z[e],s=t?{include:{...t}}:{};typeof C.syncAdapterStream=="function"?U.value=await C.syncAdapterStream(e,s,ze):U.value=await C.syncAdapter(e,s),await Q()}catch(t){p.error(`同步 ${e} 失败: ${t.message}`)}finally{d.sync[e]=!1,I.active=!1}}async function wt(){d.syncAll=!0,Fe("(all)");try{const e=typeof C.syncAllStream=="function"?await C.syncAllStream({},ze):await C.syncAll();U.value=e?.[e.length-1]||null,await Q(),p.success(`已同步 ${e?.length||0} 个 adapter`)}catch(e){p.error("同步失败: "+e.message)}finally{d.syncAll=!1,I.active=!1}}async function Ct(e){try{await C.unregister(e),await Q()}catch(t){p.error("移除失败: "+t.message)}}async function It(e){if(e){d.audit=!0;try{Y.value=await C.recentAudit({limit:200})}catch(t){p.error("审计日志加载失败: "+t.message)}finally{d.audit=!1}}}const Ee=pe(()=>!(!w.email||!w.email.includes("@")||!w.authCode||w.authCode.length<4||w.provider==="custom"&&!w.host));function Dt(e){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"}[e]||"请输入服务商授权码(不是登录密码)"}function Ke(){w.provider="qq",w.email="",w.authCode="",w.host="",w.port=993,w.pdfPasswordHints={idCardLast6:"",phoneLast6:"",cardLast6:""},K.value=null}function We(){const e={provider:w.provider,email:w.email.trim(),authCode:w.authCode};return w.provider==="custom"&&(e.host=w.host.trim(),e.port=w.port||993,e.secure=!0),e}function Et(){const e={};for(const t of Object.keys(w.pdfPasswordHints)){const s=w.pdfPasswordHints[t];typeof s=="string"&&s.trim().length>0&&(e[t]=s.trim())}return Object.keys(e).length>0?e:null}async function St(){if(Ee.value){d.testEmail=!0,K.value=null;try{K.value=await C.testEmailAuth(We())}catch(e){K.value={ok:!1,error:e.message}}finally{d.testEmail=!1}}}async function ht(){if(!(!Ee.value||!K.value?.ok)){d.saveEmail=!0;try{const e={},t=Et();t&&(e.pdfPasswordHints=t),await C.registerEmail(We(),e),p.success("邮箱账号已注册"),ee.value=!1,Ke(),await Q()}catch(e){p.error("保存失败: "+e.message)}finally{d.saveEmail=!1}}}const qe=pe(()=>!(!H.email||!H.email.includes("@")||!H.filePath||H.filePath.length<3));function Ot(){H.email="",H.zipPassword="",H.filePath="",F.value=null}async function Pt(){if(qe.value){d.importAlipay=!0,F.value=null;try{await C.registerAlipay({email:H.email.trim(),zipPassword:H.zipPassword||void 0});const t=/\.zip$/i.test(H.filePath)?{zipPath:H.filePath,zipPassword:H.zipPassword||void 0}:{csvPath:H.filePath};F.value=await C.importAlipayBill(t),F.value?.status==="ok"?(p.success(`导入成功 — ${F.value.entityCounts?.events||0} 笔交易`),await Q()):p.error("导入失败: "+(F.value?.error||F.value?.status))}catch(e){F.value={status:"error",error:e.message},p.error("导入失败: "+e.message)}finally{d.importAlipay=!1}}}async function Ve(e){if(e){d.eventDetail=!0,le.value=!0;try{S.value=await C.eventDetail(e)}catch(t){S.value=null,p.error("事件详情加载失败: "+t.message)}finally{d.eventDetail=!1}}}ke({showEventDetail:Ve});async function $t(e){d.skill=!0,V.value=null;try{V.value=await C.runSkill(e,{})}catch(t){p.error(`${e} 失败: ${t.message}`)}finally{d.skill=!1}}async function Se(){d.reviewQueue=!0;try{i.value=await C.reviewQueueList(50);const e=await C.resolverStats();Object.assign(z,e)}catch(e){p.error("待消歧加载失败: "+e.message)}finally{d.reviewQueue=!1}}async function xt(){b.value=!0,await Se()}async function Me(e,t){try{await C.reviewDecision(e,t),p.success(`已记录决策: ${t}`),await Se()}catch(s){p.error("决策失败: "+s.message)}}async function Ut(){d.resolverDrain=!0;try{const e=await C.resolverDrain(20);p.success(`drain 完成 — same=${e.same} different=${e.different} review=${e.review}`),await Se()}catch(e){p.error("drain 失败: "+e.message)}finally{d.resolverDrain=!1}}async function Mt(){try{const e=await C.resolverStats();Object.assign(z,e)}catch{}}return Wt(()=>{Q(),Mt()}),(e,t)=>{const s=v("a-button"),m=v("a-badge"),D=v("a-space"),E=v("a-tag"),R=v("a-card"),W=v("a-col"),G=v("a-row"),we=v("a-textarea"),Ce=v("a-checkbox"),te=v("a-alert"),ie=v("a-divider"),Te=v("a-spin"),Le=v("a-popover"),Tt=v("a-popconfirm"),Be=v("a-table"),Qe=v("a-empty"),Ye=v("a-progress"),_e=v("a-select-option"),Lt=v("a-select"),se=v("a-form-item"),me=v("a-input"),Ge=v("a-tooltip"),Xe=v("a-input-password"),Bt=v("a-input-number"),je=v("a-form"),Ie=v("a-drawer"),De=v("a-descriptions-item"),Nt=v("a-descriptions"),Rt=v("a-list-item-meta"),Je=v("a-list-item"),Ze=v("a-list"),Ht=v("a-collapse-panel"),Ft=v("a-collapse");return l(),_("div",Ua,[c("div",Ma,[t[30]||(t[30]=c("div",null,[c("h2",{class:"page-title"},"个人数据中台"),c("p",{class:"page-sub"}," 让数据回归个人 — 各 app 数据本地加密落盘,本地 LLM 跨源分析,零云端外传。 ")],-1)),o(D,null,{default:a(()=>[o(s,{loading:d.refresh,onClick:Q},{icon:a(()=>[o(J(et))]),default:a(()=>[t[27]||(t[27]=n(" 刷新 ",-1))]),_:1},8,["loading"]),o(m,{count:z.reviewQueue,offset:[0,0]},{default:a(()=>[o(s,{type:"primary",ghost:"",onClick:xt},{icon:a(()=>[o(J(Qt))]),default:a(()=>[t[28]||(t[28]=n(" 待消歧 ",-1))]),_:1})]),_:1},8,["count"]),o(s,{type:"primary",ghost:"",onClick:t[0]||(t[0]=r=>B.value=!0)},{icon:a(()=>[o(J(Yt))]),default:a(()=>[t[29]||(t[29]=n(" 审计日志 ",-1))]),_:1})]),_:1})]),o(G,{gutter:16,style:{"margin-bottom":"16px"}},{default:a(()=>[o(W,{xs:24,sm:12,md:6},{default:a(()=>[o(R,{size:"small",title:"Vault"},{extra:a(()=>[o(E,{color:M.value?.vault?.ok?"green":"red"},{default:a(()=>[n(u(M.value?.vault?.ok?"正常":"未就绪"),1)]),_:1},8,["color"])]),default:a(()=>[c("div",Ta,"schema v"+u(M.value?.vault?.schemaVersion??"?"),1),X.value?.vault?(l(),_("div",La," 事件 "+u(X.value.vault.events)+" · 联系人 "+u(X.value.vault.persons),1)):f("",!0),X.value?.vault?(l(),_("div",Ba," 地点 "+u(X.value.vault.places)+" · 商品 "+u(X.value.vault.items)+" · 主题 "+u(X.value.vault.topics),1)):f("",!0)]),_:1})]),_:1}),o(W,{xs:24,sm:12,md:6},{default:a(()=>[o(R,{size:"small",title:"本地 LLM"},{extra:a(()=>[o(E,{color:M.value?.llm?.ok?M.value.llm.isLocal?"green":"orange":"red"},{default:a(()=>[n(u(M.value?.llm?.ok?M.value.llm.isLocal?"本地":"非本地":"未就绪"),1)]),_:1},8,["color"])]),default:a(()=>[c("div",Na,u(M.value?.llm?.name||"—"),1),M.value?.llm?.ok&&!M.value.llm.isLocal?(l(),_("div",Ra," ⚠️ 非本地 — ask 会被隐私 gate 拒绝,除非显式 acceptNonLocal ")):f("",!0)]),_:1})]),_:1}),o(W,{xs:24,sm:12,md:6},{default:a(()=>[o(R,{size:"small",title:"KG 索引"},{extra:a(()=>[o(E,{color:M.value?.kgSink?.ok?"green":"default"},{default:a(()=>[n(u(M.value?.kgSink?.ok?"已连接":"不可用"),1)]),_:1},8,["color"])]),default:a(()=>[t[31]||(t[31]=c("div",{class:"kv"},"events / persons → cc knowledge-graph 实体 + 关系",-1))]),_:1})]),_:1}),o(W,{xs:24,sm:12,md:6},{default:a(()=>[o(R,{size:"small",title:"RAG 索引"},{extra:a(()=>[o(E,{color:M.value?.ragSink?.ok?"green":"default"},{default:a(()=>[n(u(M.value?.ragSink?.ok?"已连接":"不可用"),1)]),_:1},8,["color"])]),default:a(()=>[t[32]||(t[32]=c("div",{class:"kv"},"文本 → BM25(vector 留待后续 phase)",-1))]),_:1})]),_:1})]),_:1}),o(R,{style:{"margin-bottom":"16px"}},{title:a(()=>[o(D,null,{default:a(()=>[o(J(Xt)),t[33]||(t[33]=c("span",null,"问我数据",-1))]),_:1})]),default:a(()=>[o(we,{value:g.value,"onUpdate:value":t[1]||(t[1]=r=>g.value=r),rows:2,placeholder:"例:上个月在淘宝总共花了多少?/我妈生日那周买了啥送哪儿?",onKeydown:qt(lt(He,["exact","prevent"]),["enter"])},null,8,["value","onKeydown"]),c("div",Ha,[o(Ce,{checked:x.value,"onUpdate:checked":t[2]||(t[2]=r=>x.value=r)},{default:a(()=>[...t[34]||(t[34]=[n("允许非本地 LLM (volcengine / anthropic 等)",-1)])]),_:1},8,["checked"]),o(s,{type:"primary",loading:d.ask,disabled:!g.value.trim(),onClick:He},{icon:a(()=>[o(J(Gt))]),default:a(()=>[t[35]||(t[35]=n(" 提问 ",-1))]),_:1},8,["loading","disabled"])]),T.value?(l(),_("div",Fa,[o(te,{type:"error","show-icon":"",message:T.value},null,8,["message"])])):f("",!0),A.value?(l(),_("div",za,[A.value.warning==="no-facts"?(l(),k(te,{key:0,type:"warning","show-icon":"",message:"vault 里没找到匹配的事件('no-facts')—— 先同步几个 adapter 让数据进 vault",style:{"margin-bottom":"12px"}})):A.value.warning==="hallucinated-citations"?(l(),k(te,{key:1,type:"warning","show-icon":"",message:`LLM 引用了 ${A.value.hallucinatedCitations?.length||0} 个不存在的 event id —— 模型在编造`,style:{"margin-bottom":"12px"}},null,8,["message"])):f("",!0),c("div",Ka,u(A.value.answer),1),c("div",Wa," 引用 "+u(A.value.citations?.length||0)+" 条事实 · "+u(A.value.facts?.length||0)+" facts 入 prompt · "+u(A.value.durationMs)+"ms · "+u(A.value.model),1),A.value.citations?.length?(l(),_("div",qa,[t[36]||(t[36]=c("span",{style:{"font-size":"12px",color:"var(--text-color-secondary, #888)"}},"事件链接(点击查看明细 / PDF 解密结果):",-1)),o(D,{style:{"margin-top":"4px"},wrap:""},{default:a(()=>[(l(!0),_(oe,null,ce(A.value.citations,r=>(l(),k(E,{key:r,color:"blue",style:{cursor:"pointer"},onClick:P=>Ve(r)},{default:a(()=>[n(u(r),1)]),_:2},1032,["onClick"]))),128))]),_:1})])):f("",!0)])):f("",!0)]),_:1}),o(R,{style:{"margin-bottom":"16px"}},{title:a(()=>[o(D,null,{default:a(()=>[o(J(aa)),t[37]||(t[37]=c("span",null,"分析 skill (Phase 11)",-1))]),_:1})]),extra:a(()=>[o(E,{color:"purple"},{default:a(()=>[...t[38]||(t[38]=[n("5 内置",-1)])]),_:1})]),default:a(()=>[o(G,{gutter:[12,12]},{default:a(()=>[(l(),_(oe,null,ce(ve,r=>o(W,{xs:24,sm:12,md:8,key:r.name},{default:a(()=>[o(R,{size:"small",hoverable:"",onClick:P=>$t(r.name)},{default:a(()=>[c("div",Va,[(l(),k(Vt(r.icon),{style:{"font-size":"18px",color:"#722ed1"}})),c("strong",null,u(r.label),1)]),c("div",Qa,u(r.description),1)]),_:2},1032,["onClick"])]),_:2},1024)),64))]),_:1}),V.value?(l(),_("div",Ya,[o(ie,{plain:"",orientation:"left"},{default:a(()=>[n(u(V.value.skill)+" 结果",1)]),_:1}),o(Te,{spinning:d.skill},{default:a(()=>[c("pre",Ga,u(JSON.stringify(V.value,null,2)),1),V.value.llm_commentary||V.value.llm_narrative?(l(),_("div",Xa,[o(te,{type:"info",message:V.value.llm_commentary||V.value.llm_narrative},null,8,["message"])])):f("",!0)]),_:1},8,["spinning"])])):f("",!0)]),_:1}),o(R,{style:{"margin-bottom":"16px"}},{title:a(()=>[o(D,null,{default:a(()=>[o(J(ra)),t[39]||(t[39]=c("span",null,"Adapters",-1))]),_:1})]),extra:a(()=>[o(D,null,{default:a(()=>[o(s,{onClick:t[3]||(t[3]=r=>ee.value=!0)},{icon:a(()=>[o(J(oa))]),default:a(()=>[t[40]||(t[40]=n(" 添加邮箱账号 ",-1))]),_:1}),o(s,{onClick:t[4]||(t[4]=r=>ge.value=!0)},{icon:a(()=>[o(J(na))]),default:a(()=>[t[41]||(t[41]=n(" 导入支付宝账单 ",-1))]),_:1}),o(s,{onClick:t[5]||(t[5]=r=>h.value=!0)},{icon:a(()=>[o(J(la))]),default:a(()=>[t[42]||(t[42]=n(" 添加 AI 对话账号 ",-1))]),_:1}),o(s,{onClick:t[6]||(t[6]=r=>be.value=!0)},{icon:a(()=>[o(J(sa))]),default:a(()=>[t[43]||(t[43]=n(" 添加 WeChat ",-1))]),_:1}),o(s,{onClick:ft,loading:d.bilibiliAdbDoctor},{default:a(()=>[...t[44]||(t[44]=[n(" 诊断 Bilibili ADB ",-1)])]),_:1},8,["loading"]),o(s,{onClick:vt,loading:d.bilibiliAdbSync},{default:a(()=>[...t[45]||(t[45]=[n(" 通过 PC ADB 同步 Bilibili ",-1)])]),_:1},8,["loading"]),o(s,{onClick:ct,loading:d.weiboAdbSync},{default:a(()=>[...t[46]||(t[46]=[n(" 通过 PC ADB 同步 Weibo ",-1)])]),_:1},8,["loading"]),o(s,{onClick:Ue,loading:d.xhsAdbSync},{default:a(()=>[...t[47]||(t[47]=[n(" 通过 PC ADB 同步 Xhs ",-1)])]),_:1},8,["loading"]),o(s,{onClick:rt,loading:d.toutiaoAdbSync},{default:a(()=>[...t[48]||(t[48]=[n(" 通过 PC ADB 同步 Toutiao ",-1)])]),_:1},8,["loading"]),o(s,{onClick:ut,loading:d.kuaishouAdbSync},{default:a(()=>[...t[49]||(t[49]=[n(" 通过 PC ADB 同步 Kuaishou ",-1)])]),_:1},8,["loading"]),o(s,{onClick:dt,loading:d.bridgeDoctor},{default:a(()=>[...t[50]||(t[50]=[n(" 诊断签名 Bridges ",-1)])]),_:1},8,["loading"]),o(s,{onClick:pt,loading:d.douyinAdbSync},{default:a(()=>[...t[51]||(t[51]=[n(" 通过 PC ADB 同步 Douyin ",-1)])]),_:1},8,["loading"]),o(s,{onClick:bt,loading:d.addMock},{default:a(()=>[...t[52]||(t[52]=[n(" 注册 MockAdapter(开发) ",-1)])]),_:1},8,["loading"]),o(s,{type:"primary",onClick:wt,loading:d.syncAll,disabled:!$.value.length},{default:a(()=>[...t[53]||(t[53]=[n(" 同步全部 ",-1)])]),_:1},8,["loading","disabled"])]),_:1})]),default:a(()=>[$.value.length?(l(),k(Be,{key:0,columns:mt,"data-source":$.value,pagination:!1,"row-key":r=>r.name,size:"middle"},{bodyCell:a(({column:r,record:P})=>[r.key==="sensitivity"?(l(),_(oe,{key:0},[o(E,{color:_t(P.sensitivity)},{default:a(()=>[n(u(P.sensitivity),1)]),_:2},1032,["color"]),P.legalGate?(l(),k(E,{key:0,color:"red",style:{"margin-left":"4px"}},{default:a(()=>[...t[54]||(t[54]=[n("需法律确认",-1)])]),_:1})):f("",!0)],64)):r.key==="capabilities"?(l(!0),_(oe,{key:1},ce(P.capabilities,ae=>(l(),k(E,{key:ae,style:{"margin-right":"4px"}},{default:a(()=>[n(u(ae),1)]),_:2},1024))),128)):r.key==="actions"?(l(),k(D,{key:2},{default:a(()=>[o(s,{size:"small",loading:d.sync[P.name],onClick:ae=>At(P.name)},{default:a(()=>[...t[55]||(t[55]=[n(" 同步 ",-1)])]),_:1},8,["loading","onClick"]),q(P.name)?(l(),k(Le,{key:0,open:y.value[P.name],"onUpdate:open":ae=>y.value[P.name]=ae,trigger:"click",placement:"left",title:`${P.name} 采集范围`},{content:a(()=>[c("div",ja,[(l(!0),_(oe,null,ce(re[P.name],ae=>(l(),_("div",{key:ae.key,style:{margin:"6px 0"}},[o(Ce,{checked:Z[P.name][ae.key]!==!1,onChange:zt=>ne(P.name,ae.key,zt)},{default:a(()=>[n(u(ae.label)+" ",1),c("span",Ja,u(ae.hint),1),ae.sensitive?(l(),k(E,{key:0,color:"orange",size:"small",style:{"margin-left":"4px"}},{default:a(()=>[...t[56]||(t[56]=[n("敏感",-1)])]),_:1})):f("",!0)]),_:2},1032,["checked","onChange"])]))),128)),t[57]||(t[57]=c("div",{style:{"margin-top":"8px","font-size":"11px",color:"#999"}}," 取消勾选的数据本次同步不会拉取入库 ",-1))])]),default:a(()=>[o(s,{size:"small",title:"选择采集范围"},{default:a(()=>[...t[58]||(t[58]=[n("⚙",-1)])]),_:1})]),_:2},1032,["open","onUpdate:open","title"])):f("",!0),o(Tt,{title:`从注册表移除 ${P.name}?(vault 数据不会删除)`,onConfirm:ae=>Ct(P.name)},{default:a(()=>[o(s,{size:"small",danger:""},{default:a(()=>[...t[59]||(t[59]=[n("移除",-1)])]),_:1})]),_:1},8,["title","onConfirm"])]),_:2},1024)):f("",!0)]),_:1},8,["data-source","row-key"])):(l(),k(Qe,{key:1,description:"无已注册 adapter — 点上方按钮注册 MockAdapter 看效果"})),I.active?(l(),_("div",Za,[o(R,{size:"small",bordered:!0},{default:a(()=>[c("div",eo,[t[60]||(t[60]=c("strong",null,"同步进行中",-1)),n(" · "+u(I.adapter)+" · "+u(I.phase||"...")+" ",1),I.attempt&&I.attempt>1?(l(),_("span",to," (重试 #"+u(I.attempt)+") ",1)):f("",!0)]),I.total>0?(l(),k(Ye,{key:0,percent:Math.round(I.current/I.total*100),status:I.errorMessage?"exception":"active",size:"small"},null,8,["percent","status"])):(l(),k(Ye,{key:1,percent:0,status:"active",size:"small"})),I.mailbox?(l(),_("div",ao," 邮箱 "+u(I.mailbox)+" · "+u(I.current)+" / "+u(I.total),1)):f("",!0),I.errorMessage?(l(),_("div",oo,u(I.errorMessage),1)):f("",!0)]),_:1})])):f("",!0),U.value?(l(),_("div",no,[o(te,{type:U.value.status==="ok"?"success":"error","show-icon":"",message:`同步 ${U.value.adapter}: ${U.value.status}`,description:kt(U.value)},null,8,["type","message","description"])])):f("",!0)]),_:1}),o(Ie,{open:ee.value,"onUpdate:open":t[16]||(t[16]=r=>ee.value=r),title:"添加邮箱账号",placement:"right",width:"560","destroy-on-close":!0,onClose:Ke},{footer:a(()=>[o(D,null,{default:a(()=>[o(s,{onClick:t[15]||(t[15]=r=>ee.value=!1)},{default:a(()=>[...t[70]||(t[70]=[n("取消",-1)])]),_:1}),o(s,{loading:d.testEmail,disabled:!Ee.value,onClick:St},{default:a(()=>[...t[71]||(t[71]=[n(" 测试连接 ",-1)])]),_:1},8,["loading","disabled"]),o(s,{type:"primary",loading:d.saveEmail,disabled:!Ee.value||!K.value?.ok,onClick:ht},{default:a(()=>[...t[72]||(t[72]=[n(" 保存并注册 ",-1)])]),_:1},8,["loading","disabled"])]),_:1})]),default:a(()=>[o(te,{message:"数据回归个人 — 凭证落本地加密文件(与 vault 主密钥同目录),同步动作 100% 本地。",type:"info","show-icon":"",style:{"margin-bottom":"16px"}}),o(je,{layout:"vertical",model:w},{default:a(()=>[o(se,{label:"邮箱服务商",required:""},{default:a(()=>[o(Lt,{value:w.provider,"onUpdate:value":t[7]||(t[7]=r=>w.provider=r),placeholder:"选择服务商"},{default:a(()=>[o(_e,{value:"qq"},{default:a(()=>[...t[61]||(t[61]=[n("QQ 邮箱 (imap.qq.com)",-1)])]),_:1}),o(_e,{value:"163"},{default:a(()=>[...t[62]||(t[62]=[n("网易邮箱 163/126",-1)])]),_:1}),o(_e,{value:"189"},{default:a(()=>[...t[63]||(t[63]=[n("189 邮箱",-1)])]),_:1}),o(_e,{value:"outlook"},{default:a(()=>[...t[64]||(t[64]=[n("Outlook / Hotmail",-1)])]),_:1}),o(_e,{value:"gmail"},{default:a(()=>[...t[65]||(t[65]=[n("Gmail",-1)])]),_:1}),o(_e,{value:"custom"},{default:a(()=>[...t[66]||(t[66]=[n("自定义 IMAP",-1)])]),_:1})]),_:1},8,["value"])]),_:1}),o(se,{label:"邮箱地址",required:""},{default:a(()=>[o(me,{value:w.email,"onUpdate:value":t[8]||(t[8]=r=>w.email=r),placeholder:"you@qq.com",autocomplete:"off"},null,8,["value"])]),_:1}),o(se,{required:""},{label:a(()=>[o(D,null,{default:a(()=>[t[67]||(t[67]=c("span",null,"授权码(非登录密码)",-1)),o(Ge,{title:Dt(w.provider)},{default:a(()=>[o(J(tt),{style:{color:"#888"}})]),_:1},8,["title"])]),_:1})]),default:a(()=>[o(Xe,{value:w.authCode,"onUpdate:value":t[9]||(t[9]=r=>w.authCode=r),placeholder:"例:QQ 邮箱 设置 → 账户 → 开启 IMAP/SMTP → 生成的授权码",autocomplete:"off"},null,8,["value"])]),_:1}),w.provider==="custom"?(l(),k(se,{key:0,label:"IMAP host"},{default:a(()=>[o(me,{value:w.host,"onUpdate:value":t[10]||(t[10]=r=>w.host=r),placeholder:"mail.example.com"},null,8,["value"])]),_:1})):f("",!0),w.provider==="custom"?(l(),k(se,{key:1,label:"端口"},{default:a(()=>[o(Bt,{value:w.port,"onUpdate:value":t[11]||(t[11]=r=>w.port=r),min:1,max:65535,"default-value":993},null,8,["value"])]),_:1})):f("",!0),o(ie,{orientation:"left",plain:""},{default:a(()=>[...t[68]||(t[68]=[n("PDF 账单解密提示(可选)",-1)])]),_:1}),t[69]||(t[69]=c("p",{class:"hint"},"银行 PDF 月结大多加密;提供几个常用候选项让 Phase 5.5 自动解锁:",-1)),o(se,{label:"身份证后 6 位"},{default:a(()=>[o(me,{value:w.pdfPasswordHints.idCardLast6,"onUpdate:value":t[12]||(t[12]=r=>w.pdfPasswordHints.idCardLast6=r),placeholder:"123456",autocomplete:"off"},null,8,["value"])]),_:1}),o(se,{label:"手机后 6 位"},{default:a(()=>[o(me,{value:w.pdfPasswordHints.phoneLast6,"onUpdate:value":t[13]||(t[13]=r=>w.pdfPasswordHints.phoneLast6=r),placeholder:"123456",autocomplete:"off"},null,8,["value"])]),_:1}),o(se,{label:"信用卡尾 6 位"},{default:a(()=>[o(me,{value:w.pdfPasswordHints.cardLast6,"onUpdate:value":t[14]||(t[14]=r=>w.pdfPasswordHints.cardLast6=r),placeholder:"123456",autocomplete:"off"},null,8,["value"])]),_:1}),K.value?(l(),_("div",lo,[o(te,{type:K.value.ok?"success":"error","show-icon":"",message:K.value.ok?"凭证有效 — 可以保存":`认证失败: ${K.value.reason||K.value.error}`},null,8,["type","message"])])):f("",!0)]),_:1},8,["model"])]),_:1},8,["open"]),o(Ie,{open:le.value,"onUpdate:open":t[17]||(t[17]=r=>le.value=r),title:S.value?`事件 ${S.value.event.id}`:"加载中...",placement:"right",width:"640","destroy-on-close":!0},{default:a(()=>[S.value?(l(),_(oe,{key:0},[o(Nt,{column:1,size:"small",bordered:""},{default:a(()=>[o(De,{label:"类型"},{default:a(()=>[n(u(S.value.event.subtype),1)]),_:1}),o(De,{label:"发生于"},{default:a(()=>[n(u(new Date(S.value.event.occurredAt).toLocaleString()),1)]),_:1}),o(De,{label:"actor"},{default:a(()=>[n(u(S.value.event.actor),1)]),_:1}),S.value.event.content?.title?(l(),k(De,{key:0,label:"标题"},{default:a(()=>[n(u(S.value.event.content.title),1)]),_:1})):f("",!0),S.value.event.source?.adapter?(l(),k(De,{key:1,label:"来源 adapter"},{default:a(()=>[n(u(S.value.event.source.adapter)+" @ v"+u(S.value.event.source.adapterVersion),1)]),_:1})):f("",!0)]),_:1}),S.value.classification?(l(),k(ie,{key:0,orientation:"left",plain:""},{default:a(()=>[...t[73]||(t[73]=[n("分类",-1)])]),_:1})):f("",!0),S.value.classification?(l(),_("div",so,[o(E,{color:"blue"},{default:a(()=>[n(u(S.value.classification.category),1)]),_:1}),o(E,null,{default:a(()=>[n(u(S.value.classification.layer),1)]),_:1}),c("span",ro,"置信 "+u(Math.round((S.value.classification.confidence||0)*100))+"%",1)])):f("",!0),S.value.extraction?(l(),k(ie,{key:2,orientation:"left",plain:""},{default:a(()=>[n("结构化字段("+u(S.value.extraction.template)+")",1)]),_:1})):f("",!0),S.value.extraction?(l(),_("pre",io,u(JSON.stringify(S.value.extraction.fields,null,2)),1)):f("",!0),S.value.extraction?.pdfExtraction?(l(),k(ie,{key:4,orientation:"left",plain:""},{default:a(()=>[...t[74]||(t[74]=[n("PDF 解密 / 解析",-1)])]),_:1})):f("",!0),S.value.extraction?.pdfExtraction?(l(),k(Ze,{key:5,"data-source":S.value.extraction.pdfExtraction,size:"small"},{renderItem:a(({item:r})=>[o(Je,null,{default:a(()=>[o(Rt,{title:r.filename},{description:a(()=>[c("div",null,[o(E,{color:r.decrypted?"green":"red"},{default:a(()=>[n(u(r.decrypted?"已解密":"解密失败"),1)]),_:2},1032,["color"]),c("span",uo,"尝试 "+u(r.attempted)+" 次",1),r.transactionsExtracted!=null?(l(),_("span",co," · 提取 "+u(r.transactionsExtracted)+" 条交易 ",1)):f("",!0)]),r.error?(l(),_("div",po,u(r.error),1)):f("",!0)]),_:2},1032,["title"])]),_:2},1024)]),_:1},8,["data-source"])):f("",!0),S.value.extraction?.fields?.transactions?.length?(l(),_(oe,{key:6},[o(ie,{orientation:"left",plain:""},{default:a(()=>[...t[75]||(t[75]=[n("交易明细",-1)])]),_:1}),o(Be,{columns:gt,"data-source":S.value.extraction.fields.transactions,pagination:{pageSize:10,size:"small"},"row-key":(r,P)=>P,size:"small"},{bodyCell:a(({column:r,record:P})=>[r.key==="occurredAt"?(l(),_(oe,{key:0},[n(u(new Date(P.occurredAtMs).toLocaleDateString()),1)],64)):r.key==="amount"?(l(),_("span",{key:1,class:nt(P.amount.direction==="in"?"amount-in":"amount-out")},u(P.amount.direction==="in"?"+":"-")+u(P.amount.value.toFixed(2))+" "+u(P.amount.currency),3)):f("",!0)]),_:1},8,["data-source","row-key"])],64)):f("",!0)],64)):(l(),k(Qe,{key:1,description:"无事件数据"}))]),_:1},8,["open","title"]),o(Ie,{open:ge.value,"onUpdate:open":t[22]||(t[22]=r=>ge.value=r),title:"导入支付宝账单",placement:"right",width:"560","destroy-on-close":!0,onClose:Ot},{footer:a(()=>[o(D,null,{default:a(()=>[o(s,{onClick:t[21]||(t[21]=r=>ge.value=!1)},{default:a(()=>[...t[81]||(t[81]=[n("关闭",-1)])]),_:1}),o(s,{type:"primary",loading:d.importAlipay,disabled:!qe.value,onClick:Pt},{default:a(()=>[...t[82]||(t[82]=[n(" 注册账户 + 导入 ",-1)])]),_:1},8,["loading","disabled"])]),_:1})]),default:a(()=>[o(te,{message:"支付宝官方导出 CSV — 服务器侧全量、稳定无风控。3 分钟拿到 12 个月流水。",type:"info","show-icon":"",style:{"margin-bottom":"16px"}}),o(Ft,{bordered:!1,style:{"margin-bottom":"12px"}},{default:a(()=>[o(Ht,{header:"如何导出账单(首次必看)"},{default:a(()=>[...t[76]||(t[76]=[c("ol",{style:{"padding-left":"18px","font-size":"13px"}},[c("li",null,"支付宝 app → 我的 → 账单 → 右上角 ⋯"),c("li",null,'点 "开具交易流水证明"'),c("li",null,"选月份范围(最长 12 个月)"),c("li",null,'用途选 "个人对账"'),c("li",null,"发送到你的绑定邮箱"),c("li",null,[n("从邮箱下载 "),c("code",null,"alipay_record_*.zip")]),c("li",null,"解压密码 = 你的身份证后 6 位")],-1)])]),_:1})]),_:1}),o(je,{layout:"vertical",model:H},{default:a(()=>[o(se,{label:"支付宝绑定邮箱(账户标识)",required:""},{default:a(()=>[o(me,{value:H.email,"onUpdate:value":t[18]||(t[18]=r=>H.email=r),placeholder:"alipay-bound@example.com",autocomplete:"off"},null,8,["value"])]),_:1}),o(se,null,{label:a(()=>[o(D,null,{default:a(()=>[t[77]||(t[77]=c("span",null,"ZIP 密码(身份证后 6 位)",-1)),o(Ge,{title:"支付宝 ZIP 默认密码 = 身份证号后 6 位。也支持自定义密码。"},{default:a(()=>[o(J(tt),{style:{color:"#888"}})]),_:1})]),_:1})]),default:a(()=>[o(Xe,{value:H.zipPassword,"onUpdate:value":t[19]||(t[19]=r=>H.zipPassword=r),placeholder:"例:123456",autocomplete:"off"},null,8,["value"]),t[78]||(t[78]=c("div",{class:"hint",style:{"margin-top":"4px"}}," 空白则解析时再问,或导入的 ZIP 未加密。 ",-1))]),_:1}),o(ie,{orientation:"left",plain:""},{default:a(()=>[...t[79]||(t[79]=[n("选择文件",-1)])]),_:1}),o(se,{label:"ZIP 或 CSV 文件路径"},{default:a(()=>[o(me,{value:H.filePath,"onUpdate:value":t[20]||(t[20]=r=>H.filePath=r),placeholder:"C:\\\\Users\\\\you\\\\Downloads\\\\alipay_record_xxx.zip","allow-clear":""},null,8,["value"]),t[80]||(t[80]=c("div",{class:"hint",style:{"margin-top":"4px"}}," 桌面版可通过 Electron 文件选择器自动填充;web-shell 复制完整路径。 ",-1))]),_:1}),F.value?(l(),_("div",fo,[o(te,{type:F.value.status==="ok"?"success":"error","show-icon":"",message:F.value.status==="ok"?`导入成功 — ${F.value.entityCounts?.events||0} 笔交易`:`导入失败: ${F.value.error||F.value.status}`,description:F.value.status==="ok"?`${F.value.entityCounts?.persons||0} 个交易对方 · ${F.value.kgTripleCount||0} KG triples · ${F.value.durationMs||0}ms`:null},null,8,["type","message","description"])])):f("",!0)]),_:1},8,["model"])]),_:1},8,["open"]),o(Ie,{open:b.value,"onUpdate:open":t[23]||(t[23]=r=>b.value=r),title:"待消歧(EntityResolver 模糊判定)",placement:"right",width:"640","destroy-on-close":!0},{default:a(()=>[i.value.length===0&&!d.reviewQueue?(l(),k(te,{key:0,type:"success","show-icon":"",message:"无待消歧 pair — 所有跨源 Person 已确定。",style:{"margin-bottom":"12px"}})):f("",!0),c("div",vo,[o(D,null,{default:a(()=>[o(s,{loading:d.reviewQueue,onClick:Se},{icon:a(()=>[o(J(et))]),default:a(()=>[t[83]||(t[83]=n(" 刷新 ",-1))]),_:1},8,["loading"]),o(s,{loading:d.resolverDrain,onClick:Ut},{default:a(()=>[...t[84]||(t[84]=[n(" 手动 drain 队列 ",-1)])]),_:1},8,["loading"]),c("span",mo," queue: "+u(z.queue?.pending||0)+" pending · "+u(z.mergeGroups||0)+" groups ",1)]),_:1})]),o(Ze,{"data-source":i.value,pagination:{pageSize:5,size:"small"},size:"small"},{renderItem:a(({item:r})=>[o(Je,null,{default:a(()=>[o(R,{size:"small",style:{width:"100%"}},{default:a(()=>[c("div",yo,[c("strong",null,"Pair #"+u(r.id),1),r.embed_sim?(l(),k(E,{key:0,color:"blue",style:{"margin-left":"8px"}},{default:a(()=>[n(" sim "+u(Number(r.embed_sim).toFixed(2)),1)]),_:2},1024)):f("",!0),r.llm_verdict?(l(),k(E,{key:1,color:r.llm_verdict==="yes"?"green":r.llm_verdict==="no"?"red":"orange",style:{"margin-left":"4px"}},{default:a(()=>[n(" LLM: "+u(r.llm_verdict),1)]),_:2},1032,["color"])):f("",!0)]),c("div",go,"A: "+u(r.a_person_id),1),c("div",_o,"B: "+u(r.b_person_id),1),r.llm_reason?(l(),_("div",ko," LLM 理由: "+u(r.llm_reason),1)):f("",!0),o(D,{style:{"margin-top":"8px"}},{default:a(()=>[o(s,{size:"small",type:"primary",onClick:P=>Me(r.id,"same")},{default:a(()=>[...t[85]||(t[85]=[n("同一人",-1)])]),_:1},8,["onClick"]),o(s,{size:"small",danger:"",onClick:P=>Me(r.id,"different")},{default:a(()=>[...t[86]||(t[86]=[n("不同人",-1)])]),_:1},8,["onClick"]),o(s,{size:"small",onClick:P=>Me(r.id,"skip")},{default:a(()=>[...t[87]||(t[87]=[n("跳过",-1)])]),_:1},8,["onClick"])]),_:2},1024)]),_:2},1024)]),_:2},1024)]),_:1},8,["data-source"])]),_:1},8,["open"]),o(Ie,{open:B.value,"onUpdate:open":t[24]||(t[24]=r=>B.value=r),title:"审计日志(数据 lineage)",placement:"right",width:"600",onAfterOpenChange:It},{default:a(()=>[o(Be,{columns:yt,"data-source":Y.value,pagination:{pageSize:20,size:"small"},"row-key":r=>r.id,size:"small"},{bodyCell:a(({column:r,record:P})=>[r.key==="at"?(l(),_(oe,{key:0},[n(u(new Date(P.at).toLocaleString()),1)],64)):r.key==="details"?(l(),_("code",bo,u(P.details||"—"),1)):f("",!0)]),_:1},8,["data-source","row-key"])]),_:1},8,["open"]),o(Ca,{open:h.value,"onUpdate:open":t[25]||(t[25]=r=>h.value=r),"existing-accounts":j.value,onRegistered:he},null,8,["open","existing-accounts"]),o(xa,{open:be.value,"onUpdate:open":t[26]||(t[26]=r=>be.value=r),onRegistered:Oe},null,8,["open"])])}}},Eo=Re(Ao,[["__scopeId","data-v-08d2e73e"]]);export{Eo as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{A as o}from"./Row-DRJDsOPE.js";import{S as t}from"./index-Bdaro36b.js";import"./responsiveObserve-Dx_PXbJ8.js";import"./vendor-DhFY8mDK.js";import"./useFlexGapSupport-BtS62yHN.js";import"./styleChecker-k0u8jXS4.js";import"./index-BwWqMM1e.js";import"./icons-AILO5ZcK.js";const l=t(o);export{l as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{C as o}from"./Col-ns3mBD4a.js";import{S as t}from"./index-Bdaro36b.js";import"./index-BwWqMM1e.js";import"./vendor-DhFY8mDK.js";import"./icons-AILO5ZcK.js";const s=t(o);export{s as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{u as _}from"./index-Bdaro36b.js";function d(r){if(!r)return r;if(r.error)throw new Error(r.error);return r.result!==void 0?r.result:r}function p(r,t,a,e,n){return typeof r.onMessage!="function"||typeof r.sendRaw!="function"?r.sendRaw({type:t,...a},n).then(d):new Promise((u,s)=>{const c=typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():`${Date.now()}-${Math.random().toString(36).slice(2)}`,w=`${t}.event`,m=`${t}.end`;let l=!1,y=()=>{};const o=(i,b)=>{if(!l){l=!0,clearTimeout(g);try{y()}catch{}i(b)}},g=setTimeout(()=>{o(s,new Error(`stream timeout (${n}ms): ${t}`))},n),h=r.onMessage(i=>{if(!(l||!i)&&!(i.id!==c&&i.requestId!==c)){if(i.type===w){if(typeof e=="function")try{e(i.event||i)}catch{}return}if(i.type===m){o(u,d(i));return}i.type==="error"&&o(s,new Error(i.message||"stream error"))}});y=typeof h=="function"?h:()=>{},Promise.resolve(r.sendRaw({id:c,type:t,...a},n)).catch(()=>{})})}function D(){const r=_(),t=(a,e={},n=3e4)=>r.sendRaw({type:a,...e},n).then(d);return{async health(){return await t("personal-data-hub.health",{},8e3)},async stats(){return await t("personal-data-hub.stats",{},8e3)},async listAdapters(){return await t("personal-data-hub.list-adapters",{},5e3)},async syncAdapter(a,e={}){return await t("personal-data-hub.sync-adapter",{name:a,options:e},12e4)},async syncAll(a={}){return await t("personal-data-hub.sync-all",{options:a},6e5)},async registerMock({name:a="mock",count:e=20,seed:n=1}={}){return await t("personal-data-hub.register-mock",{name:a,count:e,seed:n})},async unregister(a){return await t("personal-data-hub.unregister",{name:a})},async ask(a,e={}){return await t("personal-data-hub.ask",{question:a,options:e},18e4)},async queryEvents(a={}){return await t("personal-data-hub.query-events",a,1e4)},async recentAudit(a={}){return await t("personal-data-hub.recent-audit",a,1e4)},async searchEvents(a={}){return await t("personal-data-hub.search-events",a,15e3)},async facetCounts(a={}){return await t("personal-data-hub.facet-counts",a,1e4)},async testEmailAuth(a){return await t("personal-data-hub.test-email-auth",{account:a},3e4)},async registerEmail(a,e={}){return await t("personal-data-hub.register-email",{account:a,opts:e},15e3)},async unregisterEmail(a){return await t("personal-data-hub.unregister-email",{email:a},5e3)},async listEmailAccounts(){return await t("personal-data-hub.list-email-accounts",{},5e3)},async eventDetail(a){return await t("personal-data-hub.event-detail",{eventId:a},5e3)},async syncAdapterStream(a,e={},n){return await p(r,"personal-data-hub.sync-adapter-stream",{name:a,options:e},n,6e5)},async syncAllStream(a={},e){return await p(r,"personal-data-hub.sync-all-stream",{options:a},e,9e5)},async registerAlipay(a,e={}){return await t("personal-data-hub.register-alipay",{account:a,opts:e},15e3)},async unregisterAlipay(a){return await t("personal-data-hub.unregister-alipay",{email:a},5e3)},async listAlipayAccounts(){return await t("personal-data-hub.list-alipay-accounts",{},5e3)},async importAlipayBill({zipPath:a,csvPath:e,zipPassword:n}={}){return await t("personal-data-hub.import-alipay-bill",{zipPath:a,csvPath:e,zipPassword:n},3e5)},async reviewQueueList(a=50){return await t("personal-data-hub.review-queue-list",{limit:a},5e3)},async reviewDecision(a,e){return await t("personal-data-hub.review-decision",{reviewId:a,decision:e},5e3)},async manualMerge(a,e){return await t("personal-data-hub.manual-merge",{aId:a,bId:e},5e3)},async manualUnmerge(a){return await t("personal-data-hub.manual-unmerge",{personId:a},5e3)},async resolverDrain(a=50){return await t("personal-data-hub.resolver-drain",{limit:a},18e4)},async resolverStats(){return await t("personal-data-hub.resolver-stats",{},5e3)},async skillsList(){return await t("personal-data-hub.skills-list",{},5e3)},async runSkill(a,e={}){return await t("personal-data-hub.run-skill",{name:a,options:e},12e4)},async openAichatLogin(a,e={}){return await t("personal-data-hub.aichat-open-login",{vendor:a,opts:e},1e4)},async probeAichatCookies(a,e){return await t("personal-data-hub.aichat-probe-cookies",{vendor:a,cookieHeader:e},1e4)},async registerAichatVendor(a,e,n={}){return await t("personal-data-hub.aichat-register-vendor",{vendor:a,cookies:e,opts:n},3e4)},async rotateAichatLogin(a){return await t("personal-data-hub.aichat-rotate-login",{vendor:a},1e4)},async listAichatAccounts(){return await t("personal-data-hub.list-aichat-accounts",{},5e3)},async unregisterAichat(a){return await t("personal-data-hub.unregister-aichat",{vendor:a},5e3)},async aichatHealthCheckOnce(){return await t("personal-data-hub.aichat-health-check-once",{},3e4)},async probeWechatEnv(){return await t("personal-data-hub.wechat-env-probe",{},15e3)},async registerWechat({account:a,dbPath:e,wechatDataPath:n,fridaOpts:u,keyProviderOverride:s}={}){return await t("personal-data-hub.register-wechat",{account:a,dbPath:e,wechatDataPath:n,fridaOpts:u,keyProviderOverride:s},45e3)},async listWechatAccounts(){return await t("personal-data-hub.list-wechat-accounts",{},5e3)},async unregisterWechat(a){return await t("personal-data-hub.unregister-wechat",{uin:a},5e3)},async bilibiliAdbSync(a={}){return await t("personal-data-hub.bilibili-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},12e4)},async bilibiliAdbDoctor(){return await t("personal-data-hub.bilibili-adb-doctor",{},15e3)},async weiboAdbSync(a={}){return await t("personal-data-hub.weibo-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},6e4)},async xhsAdbSync(a={}){return await t("personal-data-hub.xhs-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},6e4)},async toutiaoAdbSync(a={}){return await t("personal-data-hub.toutiao-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},9e4)},async kuaishouAdbSync(a={}){return await t("personal-data-hub.kuaishou-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},12e4)},async bridgeDoctor(){return await t("personal-data-hub.bridge-doctor",{},6e4)},async douyinAdbSync(a={}){return await t("personal-data-hub.douyin-adb-sync",{uid:a.uid,limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},6e4)}}}export{D as u};
|