chainlesschain 0.162.20 → 0.162.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (156) hide show
  1. package/package.json +2 -2
  2. package/src/assets/web-panel/.build-hash +1 -1
  3. package/src/assets/web-panel/assets/{AIOps-Buh_mYlF.js → AIOps-DEhhAYYj.js} +1 -1
  4. package/src/assets/web-panel/assets/{ActionButton-Dc7c0bZf.js → ActionButton-DEyfUz5F.js} +1 -1
  5. package/src/assets/web-panel/assets/{Analytics-CR9TWfM-.js → Analytics-D1rjS61W.js} +1 -1
  6. package/src/assets/web-panel/assets/{AppLayout-DVfanUep.js → AppLayout-CptFJPy6.js} +2 -2
  7. package/src/assets/web-panel/assets/{Audit-BxojBqRe.js → Audit-BG6KQUHY.js} +1 -1
  8. package/src/assets/web-panel/assets/{Backup-CGkreaK9.js → Backup-D2ikQT54.js} +1 -1
  9. package/src/assets/web-panel/assets/{BaseInput-B-Q2ZGfz.js → BaseInput-BG_d8yMt.js} +1 -1
  10. package/src/assets/web-panel/assets/{Chat-Dd_VC5Av.js → Chat-CcHmGkLY.js} +1 -1
  11. package/src/assets/web-panel/assets/{ChatBubbleRenderer-B64kZfRH.js → ChatBubbleRenderer-DIXrOHbn.js} +1 -1
  12. package/src/assets/web-panel/assets/{Checkbox-NYBD1rCW.js → Checkbox-Bx2h6vT3.js} +1 -1
  13. package/src/assets/web-panel/assets/{Codegen-B3Kqhgv1.js → Codegen-o14zzfuK.js} +1 -1
  14. package/src/assets/web-panel/assets/{Col-2A3Bg2GC.js → Col-HlZjxy7V.js} +1 -1
  15. package/src/assets/web-panel/assets/{Community-C84SkDEJ.js → Community-DXxMflr2.js} +1 -1
  16. package/src/assets/web-panel/assets/{Compact-Crv3pyZJ.js → Compact-DbswbBjd.js} +1 -1
  17. package/src/assets/web-panel/assets/{Compliance-D4qasxoY.js → Compliance-C7Q4Da2p.js} +1 -1
  18. package/src/assets/web-panel/assets/{Cowork-Bfbvysw-.js → Cowork-BLImywOe.js} +1 -1
  19. package/src/assets/web-panel/assets/{Cron-Dkjyiekd.js → Cron-DpXu1G4m.js} +1 -1
  20. package/src/assets/web-panel/assets/{Crosschain-DbJm9Kjd.js → Crosschain-C4qokeJu.js} +1 -1
  21. package/src/assets/web-panel/assets/{DID-C2HI6acG.js → DID-C0BjPiij.js} +1 -1
  22. package/src/assets/web-panel/assets/{Dashboard-BXMY7QVP.js → Dashboard-CsfDXwPl.js} +2 -2
  23. package/src/assets/web-panel/assets/{Dropdown-DcOykpfh.js → Dropdown-CiwMUKrx.js} +1 -1
  24. package/src/assets/web-panel/assets/{EmailListRenderer-Doo52F2M.js → EmailListRenderer-DX7xfm5a.js} +1 -1
  25. package/src/assets/web-panel/assets/{Federation-cHubZT6U.js → Federation-CA4Ibsg0.js} +1 -1
  26. package/src/assets/web-panel/assets/{FormItemContext-B5OVlspi.js → FormItemContext-DvM0lU-7.js} +1 -1
  27. package/src/assets/web-panel/assets/{GenericCardRenderer-OgA46PJq.js → GenericCardRenderer-REjsnTHA.js} +1 -1
  28. package/src/assets/web-panel/assets/{Git-_OKH_JOq.js → Git-ZhnSDQGH.js} +1 -1
  29. package/src/assets/web-panel/assets/{Governance-CTByBwSV.js → Governance-BL8iUV_g.js} +1 -1
  30. package/src/assets/web-panel/assets/{Inference-C0nqgySA.js → Inference-BONrgLk-.js} +1 -1
  31. package/src/assets/web-panel/assets/{KnowledgeGraph-CWW4ZIqH.js → KnowledgeGraph-q9SAz7h7.js} +1 -1
  32. package/src/assets/web-panel/assets/{Logs-DrwqUltr.js → Logs-eHfEFnEZ.js} +1 -1
  33. package/src/assets/web-panel/assets/{Marketplace-LJMRx-dm.js → Marketplace-DzwuVedm.js} +1 -1
  34. package/src/assets/web-panel/assets/{McpTools-F_EjC8j3.js → McpTools-BRoLIeq5.js} +1 -1
  35. package/src/assets/web-panel/assets/{Memory-VonDem9-.js → Memory-DjvAa1Ce.js} +1 -1
  36. package/src/assets/web-panel/assets/{MobileBridge-CUWxIrfb.js → MobileBridge-CGTanjsT.js} +1 -1
  37. package/src/assets/web-panel/assets/{MobileProjects-CGOo70lk.js → MobileProjects-cTccXHwN.js} +1 -1
  38. package/src/assets/web-panel/assets/{Mtc-CqUquFbQ.js → Mtc-CNUe29wS.js} +1 -1
  39. package/src/assets/web-panel/assets/{MtcAudit-CRVusaip.js → MtcAudit-COk24mdH.js} +1 -1
  40. package/src/assets/web-panel/assets/{Multisig-B0o8Mv8T.js → Multisig-CFq2j0BU.js} +1 -1
  41. package/src/assets/web-panel/assets/{NLProgramming-CxQINUhu.js → NLProgramming-dfRr-FGW.js} +1 -1
  42. package/src/assets/web-panel/assets/{Notes-B6Q_apFW.js → Notes-iM4aoXiw.js} +1 -1
  43. package/src/assets/web-panel/assets/{NotificationSettings-DO-lgp6x.js → NotificationSettings-CeVJ-942.js} +1 -1
  44. package/src/assets/web-panel/assets/{OrderTableRenderer-DxoBoMtz.js → OrderTableRenderer-zQ5jvUZI.js} +1 -1
  45. package/src/assets/web-panel/assets/{Organization-DqJ_KawH.js → Organization-CTSWyMGT.js} +1 -1
  46. package/src/assets/web-panel/assets/{Overflow-Cg4iKODM.js → Overflow---n60sAp.js} +1 -1
  47. package/src/assets/web-panel/assets/{P2P-n5GPMrwC.js → P2P-BCQurpAB.js} +1 -1
  48. package/src/assets/web-panel/assets/{PdhVaultBrowser-BdZI0EJs.js → PdhVaultBrowser-C5L1qAc0.js} +2 -2
  49. package/src/assets/web-panel/assets/{Permissions-BjtwAIGb.js → Permissions-I8sgLLE5.js} +1 -1
  50. package/src/assets/web-panel/assets/PersonalDataHub-CEUfFRCj.js +2 -0
  51. package/src/assets/web-panel/assets/{PersonalDataHub-D0ncF92t.css → PersonalDataHub-CO9-IYDY.css} +1 -1
  52. package/src/assets/web-panel/assets/{Pipeline-BZe2-Flj.js → Pipeline-BTBjJaRd.js} +1 -1
  53. package/src/assets/web-panel/assets/{Privacy-OJqMon4c.js → Privacy-aCs44rpW.js} +1 -1
  54. package/src/assets/web-panel/assets/{ProjectInit-Dw-5SMG1.js → ProjectInit-DZ2iIlbN.js} +1 -1
  55. package/src/assets/web-panel/assets/{ProjectSettings-DxqW44cV.js → ProjectSettings-oYUtNgHP.js} +1 -1
  56. package/src/assets/web-panel/assets/{Projects-CPOqs2ec.js → Projects-FonFg0ie.js} +1 -1
  57. package/src/assets/web-panel/assets/{Providers-hBfwscEl.js → Providers-CRmOuabY.js} +1 -1
  58. package/src/assets/web-panel/assets/{QuickAsk-DA3WFFAr.js → QuickAsk-BHd6UZ1A.js} +1 -1
  59. package/src/assets/web-panel/assets/{Recommend-DMpz3URg.js → Recommend-BkzGGuq-.js} +1 -1
  60. package/src/assets/web-panel/assets/{Reputation-6-z56FwC.js → Reputation-Do7cPr9u.js} +1 -1
  61. package/src/assets/web-panel/assets/{Row-CL1Y6SfW.js → Row-D_sR3MmD.js} +1 -1
  62. package/src/assets/web-panel/assets/{RssFeed-BIHU2bMf.js → RssFeed-pWSbZ06l.js} +1 -1
  63. package/src/assets/web-panel/assets/{Search-CRAfuEX-.js → Search-BTL71JSs.js} +1 -1
  64. package/src/assets/web-panel/assets/{Security-CVya3gvH.js → Security-8lbNoqY6.js} +1 -1
  65. package/src/assets/web-panel/assets/{Services-Cxv7_umF.js → Services-yr3QVduo.js} +1 -1
  66. package/src/assets/web-panel/assets/{Skeleton-D_GvsCtv.js → Skeleton-DdnY1ZTz.js} +1 -1
  67. package/src/assets/web-panel/assets/{Skills-DyiEpcvf.js → Skills-fk24WY3D.js} +1 -1
  68. package/src/assets/web-panel/assets/{Sla-wiglQzXV.js → Sla-bOXRT7wR.js} +1 -1
  69. package/src/assets/web-panel/assets/{SpeechSettings-CLtovaa5.js → SpeechSettings-DjonFUbP.js} +1 -1
  70. package/src/assets/web-panel/assets/{SyncSettings-BOgVef1O.js → SyncSettings-C-7HTl6d.js} +1 -1
  71. package/src/assets/web-panel/assets/{Tasks-Ik8AX7-J.js → Tasks-DDohfzFT.js} +1 -1
  72. package/src/assets/web-panel/assets/{Templates-CireiINW.js → Templates-C8PI_WTt.js} +1 -1
  73. package/src/assets/web-panel/assets/{Tenant-t7jF9NkQ.js → Tenant-CIvbeRkn.js} +1 -1
  74. package/src/assets/web-panel/assets/{Terminal-Btq_O951.js → Terminal-BuIPGugj.js} +1 -1
  75. package/src/assets/web-panel/assets/{TimelineRenderer-hC_Piiwy.js → TimelineRenderer-BefCbTxN.js} +1 -1
  76. package/src/assets/web-panel/assets/{Tokens-BTIqA2J1.js → Tokens-gGAeez46.js} +1 -1
  77. package/src/assets/web-panel/assets/{Trigger-Dzv2gJpK.js → Trigger-C_86E2v7.js} +1 -1
  78. package/src/assets/web-panel/assets/{Trust-B13QpWOh.js → Trust-Beg23C1W.js} +1 -1
  79. package/src/assets/web-panel/assets/{UkeySign-CFj3UF4G.js → UkeySign--sGSaISg.js} +1 -1
  80. package/src/assets/web-panel/assets/{VideoEditing-CGMOGTQb.js → VideoEditing-DIsnY6D_.js} +1 -1
  81. package/src/assets/web-panel/assets/{Wallet-BkCJ573Y.js → Wallet-a7ECYY0i.js} +1 -1
  82. package/src/assets/web-panel/assets/{WebAuthn-C8dCrmGH.js → WebAuthn-CsVpkUE8.js} +1 -1
  83. package/src/assets/web-panel/assets/{WorkflowEditor-CclfhxwH.js → WorkflowEditor-BOJ4WTgl.js} +1 -1
  84. package/src/assets/web-panel/assets/{chat-CW_X_A9l.js → chat-ezCR5ZZX.js} +1 -1
  85. package/src/assets/web-panel/assets/{colors-6GtheJb2.js → colors-DSUEQ7GR.js} +1 -1
  86. package/src/assets/web-panel/assets/{compact-item-tz7dJapw.js → compact-item-D4w3DGj_.js} +1 -1
  87. package/src/assets/web-panel/assets/{createContext-CbiGcRCw.js → createContext-B_hvu-NR.js} +1 -1
  88. package/src/assets/web-panel/assets/{hasIn-bmNFD3PH.js → hasIn-FY775Vpc.js} +1 -1
  89. package/src/assets/web-panel/assets/{index-DxHmNJ8S.js → index-1ki6aTIz.js} +1 -1
  90. package/src/assets/web-panel/assets/{index-UId2JAY6.js → index-B3lbDu2b.js} +1 -1
  91. package/src/assets/web-panel/assets/{index-BM4slfDH.js → index-B9LXVosT.js} +1 -1
  92. package/src/assets/web-panel/assets/{index-b7sSMzkC.js → index-BGdchdRx.js} +1 -1
  93. package/src/assets/web-panel/assets/{index-KFdfLxVt.js → index-BGrm33US.js} +1 -1
  94. package/src/assets/web-panel/assets/{index-B9sJpsz3.js → index-BHPD-_s2.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-B6GgMo1k.js → index-BMnGj-Ui.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-B2P1c5yD.js → index-BSp1hSN8.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-S9g45I5s.js → index-BaZmrJ6j.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-Cb33JbDx.js → index-BnvLdkR8.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-CQ7aJ-8s.js → index-BzME19Nh.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-DeoJYTHX.js → index-C0wDzrUK.js} +3 -3
  101. package/src/assets/web-panel/assets/{index-CBNnbQxM.js → index-CAa3LSKI.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-CLk3xgD2.js → index-CE3vDzJj.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-De0xvTEv.js → index-CLp4V3Tb.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-CKP-AZD3.js → index-CNUQnJsg.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-CzIQ0u4e.js → index-CSbCIyga.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-UjxsY00y.js → index-CUNYcWEF.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-CgLF_zD1.js → index-CV-F9a_X.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-C5zlrlPd.js → index-CcvzscCg.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-B3UH6whC.js → index-CdzLJsac.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-CU0MeCwH.js → index-Cug_yoee.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-DxdLksCx.js → index-CxMArAIk.js} +1 -1
  112. package/src/assets/web-panel/assets/index-CzkEIn_T.js +1 -0
  113. package/src/assets/web-panel/assets/index-D2PcvXPP.js +1 -0
  114. package/src/assets/web-panel/assets/{index-DMGJqZ-o.js → index-D6yJ0RMr.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-DaYfMM7r.js → index-DM77-xyl.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-CV9aPPYM.js → index-DfU6zsU8.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-l2VM-W36.js → index-DqsQUPY7.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-DK7ee5hC.js → index-DqxLCUYa.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-DaK59dFw.js → index-DtztktoP.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-Cs5KWviO.js → index-Dz8-7APi.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-Da2RUdcb.js → index-Enin7rzK.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-CYIwY9zQ.js → index-S6A76pR1.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-DvWXdCxl.js → index-ZGJo2fz1.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-Dj1N1idV.js → index-d0HXotWE.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-CTnIkosg.js → index-gAtp_KkQ.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-zP_o4yKV.js → index-mlTTTHla.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-BxCPkuTG.js → index-wWVM6ENX.js} +1 -1
  128. package/src/assets/web-panel/assets/{initDefaultProps-BTGwT0NA.js → initDefaultProps-BoLcNBz9.js} +1 -1
  129. package/src/assets/web-panel/assets/{motion-BheHkG8e.js → motion-ouRvP3eO.js} +1 -1
  130. package/src/assets/web-panel/assets/{move-BkMMNkAw.js → move-BBITvaOV.js} +1 -1
  131. package/src/assets/web-panel/assets/{omit-B9zmSFf6.js → omit-D8Yxdvbb.js} +1 -1
  132. package/src/assets/web-panel/assets/{pickAttrs-CFNBcA5Z.js → pickAttrs-BIUy7mER.js} +1 -1
  133. package/src/assets/web-panel/assets/{placementArrow-B4mvrUYw.js → placementArrow-CrNWpNSF.js} +1 -1
  134. package/src/assets/web-panel/assets/{responsiveObserve-BJqsSjxJ.js → responsiveObserve-aHLPN464.js} +1 -1
  135. package/src/assets/web-panel/assets/{slide-Cj78MXSi.js → slide-2qNtePjk.js} +1 -1
  136. package/src/assets/web-panel/assets/{statusUtils-Bk6ChXAV.js → statusUtils-FAF3iR3R.js} +1 -1
  137. package/src/assets/web-panel/assets/{styleChecker-B_YDSNYf.js → styleChecker-BNFTkrbl.js} +1 -1
  138. package/src/assets/web-panel/assets/{useFlexGapSupport-q90prOQL.js → useFlexGapSupport-BgdPlW7E.js} +1 -1
  139. package/src/assets/web-panel/assets/{useFs-BtpFJ9kI.js → useFs-q1QvAh3f.js} +1 -1
  140. package/src/assets/web-panel/assets/{usePersonalDataHub-C3qhf1sQ.js → usePersonalDataHub-DEZ6cY8C.js} +1 -1
  141. package/src/assets/web-panel/assets/{vnode-Bz2j0JiG.js → vnode-vp6H-NL_.js} +1 -1
  142. package/src/assets/web-panel/assets/{zoom-CzaEtel2.js → zoom-UatfJMw4.js} +1 -1
  143. package/src/assets/web-panel/index.html +1 -1
  144. package/src/commands/__tests__/hub-bilibili-adb-sync.test.js +350 -0
  145. package/src/commands/__tests__/hub-douyin-adb-sync.test.js +199 -0
  146. package/src/commands/__tests__/hub-kuaishou-adb-sync.test.js +161 -0
  147. package/src/commands/__tests__/hub-toutiao-adb-sync.test.js +158 -0
  148. package/src/commands/__tests__/hub-weibo-adb-sync.test.js +163 -0
  149. package/src/commands/__tests__/hub-xhs-adb-sync.test.js +155 -0
  150. package/src/commands/hub.js +883 -0
  151. package/src/gateways/ws/personal-data-hub-protocol.js +84 -0
  152. package/src/lib/host-adb-bridge.js +77 -1
  153. package/src/lib/personal-data-hub-wiring.js +471 -12
  154. package/src/assets/web-panel/assets/PersonalDataHub-Bsf3Wh6n.js +0 -1
  155. package/src/assets/web-panel/assets/index-BFkZAdio.js +0 -1
  156. package/src/assets/web-panel/assets/index-BhgINPAH.js +0 -1
@@ -1 +0,0 @@
1
- import{w as Xe,L as n,Q as m,N as e,c as a,M as f,R as u,F as Z,Y as ie,Z as et,P as r,O as o,S as d,a1 as tt,f as re,r as h,K as p,a as ne,a4 as Dt,o as Et,u as V,a0 as It,$ as Mt}from"./vendor-DhFY8mDK.js";import{u as Oe}from"./usePersonalDataHub-C3qhf1sQ.js";import{_ as Se,d as R}from"./index-DeoJYTHX.js";import{R as Je,aB as Ot,O as St,al as Rt,h as zt,aC as Nt,Q as Ut,aD as Lt,aE as Ht,y as Tt,q as qt,aF as Ft,a3 as Wt,ad as Kt,aG as Qt,m as Vt,e as Ze}from"./icons-AILO5ZcK.js";const Bt={key:0},Gt={class:"vendor-head"},jt={class:"hint"},Jt={class:"hint",style:{"margin-top":"4px"}},Zt={key:0,class:"hint",style:{"margin-top":"4px",color:"#ff4d4f"}},Yt={key:1},Xt={class:"hint"},ea=["href"],ta={class:"howto"},aa=["href"],la={key:3,style:{"margin-top":"8px"}},oa={key:2,class:"kv",style:{"margin-top":"4px"}},na={key:3,class:"kv",style:{"margin-top":"4px",color:"#ff4d4f"}},sa={key:2},ia={__name:"AIChatWizard",props:{open:{type:Boolean,default:!1},existingAccounts:{type:Array,default:()=>[]}},emits:["update:open","registered"],setup(ce,{emit:ye}){const P=ce,E=ye,K=[{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}],$=Oe(),c=h(1),g=h(null),I=h(""),D=h(null),O=h(null),F=h(null),N=ne({open:!1,probe:!1,register:!1}),se=re(()=>K.find(y=>y.vendor===g.value)||{}),ue=re(()=>c.value===1?"选择一家 AI 服务商":c.value===2?D.value?.fallbackMode==="paste"?"在外部浏览器登录,把 cookie 粘贴到下面":"在内嵌浏览器登录,主进程自动读取 cookie":"校验并写入本地加密 vault"),B=re(()=>{const y=O.value;return y?y.reason==="UNKNOWN_VENDOR"?"未知厂商 — 请刷新页面或重选":y.reason==="PASTE_REQUIRED"?"请先粘贴 cookie 字符串":y.missingRequired?.length?`缺关键 cookie: ${y.missingRequired.join(", ")}`:y.reason||"cookie 校验失败":""}),S=re(()=>{const y=F.value;return y?y.reason==="REQUIRED_COOKIES_MISSING"?`缺关键 cookie: ${(y.missingRequired||[]).join(", ")}`:y.reason==="VALIDATE_COOKIE_FAILED"?"厂商拒绝该 cookie(可能已过期或被风控)":y.reason==="ADAPTER_THREW"?`Adapter 抛错: ${y.error||"网络错误"}`:y.reason==="UNKNOWN_VENDOR"?"未知厂商":y.reason||"注册失败":"未知错误"});function v(y){return P.existingAccounts.some(i=>i&&i.vendor===y)}function ae(y){return P.existingAccounts.find(i=>i&&i.vendor===y)||null}function T(y){const i=ae(y);return i?i.lastHealth?i.lastHealth.ok?"ok":i.lastHealth.reason==="SPEC_VERSION_MISMATCH"?"mismatch":"fail":"unknown":null}function X(y){const i=ae(y);if(!i||!i.lastHealth||i.lastHealth.ok)return"";const L=i.lastHealth.reason;return L?L==="SPEC_VERSION_MISMATCH"?"cookie 规格已升级,请重新登录":L==="ADAPTER_THREW"?"上次校验抛错,建议稍后重试":L==="COOKIE_EXPIRED"?"Cookie 已过期,请重新登录":L:"Cookie 校验失败,建议重新登录"}async function G(y){try{(await $.unregisterAichat(y))?.ok&&E("registered",{vendor:y,accountId:null,unregistered:!0})}catch(i){F.value={ok:!1,reason:i?.message||"UNREGISTER_FAILED"}}}function k(y){g.value=y}async function H(){if(g.value){N.open=!0,D.value=null,O.value=null,I.value="";try{if(D.value=await $.openAichatLogin(g.value),!D.value?.ok)return;c.value=2}catch(y){D.value={ok:!1,reason:y?.message||"OPEN_FAILED"}}finally{N.open=!1}}}async function ee(){N.probe=!0,O.value=null;try{const y=I.value.trim(),i=y||void 0;O.value=await $.probeAichatCookies(g.value,i)}catch(y){O.value={ok:!1,reason:y?.message||"PROBE_FAILED"}}finally{N.probe=!1}}async function x(){if(O.value?.ok){N.register=!0;try{F.value=await $.registerAichatVendor(g.value,O.value.cookies),c.value=3,F.value?.ok&&E("registered",{vendor:g.value,accountId:F.value.accountId})}catch(y){F.value={ok:!1,reason:y?.message||"REGISTER_FAILED"},c.value=3}finally{N.register=!1}}}function q(){c.value=1,g.value=null,I.value="",D.value=null,O.value=null,F.value=null}function de(){q(),E("update:open",!1)}return Xe(()=>P.open,y=>{y&&q()}),(y,i)=>{const L=p("a-alert"),C=p("a-tag"),Q=p("a-button"),Pe=p("a-popconfirm"),ge=p("a-card"),Ae=p("a-col"),fe=p("a-row"),z=p("a-collapse-panel"),U=p("a-collapse"),w=p("a-textarea"),_=p("a-form-item"),$e=p("a-form"),we=p("a-result"),De=p("a-space"),Ee=p("a-drawer");return n(),m(Ee,{open:ce.open,title:"添加 AI 对话账号",placement:"right",width:640,"destroy-on-close":!0,"onUpdate:open":i[4]||(i[4]=M=>E("update:open",M)),onClose:de},{footer:e(()=>[a(De,{style:{float:"right"}},{default:e(()=>[c.value>1&&c.value<3?(n(),m(Q,{key:0,onClick:i[3]||(i[3]=M=>c.value=c.value-1)},{default:e(()=>[...i[22]||(i[22]=[o("上一步",-1)])]),_:1})):d("",!0),a(Q,{onClick:de},{default:e(()=>[...i[23]||(i[23]=[o("取消",-1)])]),_:1}),c.value===1?(n(),m(Q,{key:1,type:"primary",disabled:!g.value,loading:N.open,onClick:H},{default:e(()=>[...i[24]||(i[24]=[o(" 下一步 ",-1)])]),_:1},8,["disabled","loading"])):d("",!0),c.value===2&&D.value?.fallbackMode==="paste"?(n(),m(Q,{key:2,loading:N.probe,disabled:!I.value.trim(),onClick:ee},{default:e(()=>[...i[25]||(i[25]=[o(" 检测 cookie ",-1)])]),_:1},8,["loading","disabled"])):d("",!0),c.value===2&&D.value?.fallbackMode!=="paste"?(n(),m(Q,{key:3,loading:N.probe,onClick:ee},{default:e(()=>[...i[26]||(i[26]=[o(" 检测 cookie ",-1)])]),_:1},8,["loading"])):d("",!0),c.value===2?(n(),m(Q,{key:4,type:"primary",loading:N.register,disabled:!O.value?.ok,onClick:x},{default:e(()=>[...i[27]||(i[27]=[o(" 注册 ",-1)])]),_:1},8,["loading","disabled"])):d("",!0)]),_:1})]),default:e(()=>[a(L,{message:`第 ${c.value} / 3 步`,description:ue.value,type:"info","show-icon":"",style:{"margin-bottom":"16px"}},null,8,["message","description"]),c.value===1?(n(),f("div",Bt,[i[10]||(i[10]=u("p",{class:"hint"}," 选择要接入的 AI 服务商。登录后将本地读取 cookie 同步对话历史;cookie 仅落本机加密文件,不上传任何云端。 ",-1)),a(fe,{gutter:[12,12]},{default:e(()=>[(n(),f(Z,null,ie(K,M=>a(Ae,{xs:24,sm:12,md:8,key:M.vendor},{default:e(()=>[a(ge,{size:"small",hoverable:"",class:et(["vendor-card",{selected:g.value===M.vendor}]),onClick:Y=>k(M.vendor)},{default:e(()=>[u("div",Gt,[u("strong",null,r(M.displayName),1),T(M.vendor)==="fail"?(n(),m(C,{key:0,color:"red"},{default:e(()=>[...i[5]||(i[5]=[o("🔴 重新登录",-1)])]),_:1})):T(M.vendor)==="mismatch"?(n(),m(C,{key:1,color:"orange"},{default:e(()=>[...i[6]||(i[6]=[o("⚠ 规格升级",-1)])]),_:1})):T(M.vendor)==="unknown"?(n(),m(C,{key:2,color:"blue"},{default:e(()=>[...i[7]||(i[7]=[o("已接入·待巡检",-1)])]),_:1})):T(M.vendor)==="ok"?(n(),m(C,{key:3,color:"green"},{default:e(()=>[...i[8]||(i[8]=[o("✓ 已接入",-1)])]),_:1})):d("",!0)]),u("div",jt,r(M.notes),1),u("div",Jt,[a(C,{color:"default"},{default:e(()=>[o(r(M.requiredCookies.length)+" 必需 cookie",1)]),_:2},1024),a(C,{color:"default"},{default:e(()=>[o("过期约 "+r(M.cookieMaxAgeHintDays)+" 天",1)]),_:2},1024)]),v(M.vendor)&&X(M.vendor)?(n(),f("div",Zt,r(X(M.vendor)),1)):d("",!0),v(M.vendor)?(n(),f("div",{key:1,class:"vendor-actions",onClick:i[0]||(i[0]=tt(()=>{},["stop"]))},[a(Pe,{title:"注销该 AI 对话来源?历史事件仍可在 vault 中查询。","ok-text":"注销","cancel-text":"取消",onConfirm:Y=>G(M.vendor)},{default:e(()=>[a(Q,{size:"small",type:"text",danger:""},{default:e(()=>[...i[9]||(i[9]=[o("注销",-1)])]),_:1})]),_:1},8,["onConfirm"])])):d("",!0)]),_:2},1032,["class","onClick"])]),_:2},1024)),64))]),_:1})])):d("",!0),c.value===2&&D.value?(n(),f("div",Yt,[u("p",Xt,[u("strong",null,r(se.value.displayName),1),i[11]||(i[11]=o(" · ",-1)),u("a",{href:D.value.loginUrl,target:"_blank",rel:"noopener noreferrer"},r(D.value.loginUrl),9,ea)]),D.value.fallbackMode==="paste"?(n(),m(L,{key:0,message:D.value.helpText||"请在外部浏览器登录后从开发者工具复制全部 cookie 字符串粘贴到下方。",type:"warning","show-icon":"",style:{"margin-bottom":"12px"}},null,8,["message"])):(n(),m(L,{key:1,message:"桌面端:请在弹出的内嵌浏览器窗口登录后点击 “检测 cookie”。",type:"info","show-icon":"",style:{"margin-bottom":"12px"}})),D.value.fallbackMode==="paste"?(n(),m(U,{key:2,bordered:!1,style:{"margin-bottom":"12px"}},{default:e(()=>[a(z,{key:"howto",header:"如何获取 cookie 字符串?"},{default:e(()=>[u("ol",ta,[u("li",null,[i[12]||(i[12]=o("用 Chrome / Edge 打开 ",-1)),u("a",{href:D.value.loginUrl,target:"_blank"},r(D.value.loginUrl),9,aa)]),i[13]||(i[13]=u("li",null,"完成登录,进入对话页",-1)),i[14]||(i[14]=u("li",null,[o("按 "),u("kbd",null,"F12"),o(" 打开开发者工具 → "),u("strong",null,"Application"),o(" → "),u("strong",null,"Cookies")],-1)),i[15]||(i[15]=u("li",null,"选中域名 → 全选所有 cookie 行 → 用扩展(如 EditThisCookie)导出 “name=value; …” 串",-1)),i[16]||(i[16]=u("li",null,[o("或在 Console 执行 "),u("code",null,"document.cookie"),o(" 复制结果(注意:HTTP-Only cookie 取不到,仍需 Application 面板)")],-1)),i[17]||(i[17]=u("li",null,"粘贴到下方文本框,点 “检测 cookie”",-1))])]),_:1})]),_:1})):d("",!0),a($e,{layout:"vertical"},{default:e(()=>[a(_,{label:"Cookie 字符串"},{default:e(()=>[a(w,{value:I.value,"onUpdate:value":i[1]||(i[1]=M=>I.value=M),rows:6,placeholder:"name1=value1; name2=value2; name3=value3 …",autocomplete:"off"},null,8,["value"])]),_:1})]),_:1}),O.value?(n(),f("div",la,[O.value.ok?(n(),m(L,{key:0,type:"success","show-icon":"",message:`已识别 ${O.value.foundRequired.length} 个必需 cookie + ${O.value.foundOptional.length} 个可选 cookie`},null,8,["message"])):(n(),m(L,{key:1,type:"error","show-icon":"",message:B.value},null,8,["message"])),O.value.foundRequired?.length?(n(),f("div",oa," ✓ "+r(O.value.foundRequired.join(", ")),1)):d("",!0),O.value.missingRequired?.length?(n(),f("div",na," 缺失: "+r(O.value.missingRequired.join(", ")),1)):d("",!0)])):d("",!0)])):d("",!0),c.value===3?(n(),f("div",sa,[F.value?.ok?(n(),m(we,{key:0,status:"success",title:`${se.value.displayName} 已接入`,"sub-title":`accountId: ${F.value.accountId} · userId: ${F.value.validation?.userId||"匿名"}`},{extra:e(()=>[a(Q,{type:"primary",onClick:de},{default:e(()=>[...i[18]||(i[18]=[o("完成",-1)])]),_:1}),a(Q,{onClick:q},{default:e(()=>[...i[19]||(i[19]=[o("再加一家",-1)])]),_:1})]),_:1},8,["title","sub-title"])):(n(),m(we,{key:1,status:"error",title:"接入失败","sub-title":S.value},{extra:e(()=>[a(Q,{type:"primary",onClick:i[2]||(i[2]=M=>c.value=2)},{default:e(()=>[...i[20]||(i[20]=[o("返回粘贴 cookie",-1)])]),_:1}),a(Q,{onClick:q},{default:e(()=>[...i[21]||(i[21]=[o("选其他厂商",-1)])]),_:1})]),_:1},8,["sub-title"]))])):d("",!0)]),_:1},8,["open"])}}},ra=Se(ia,[["__scopeId","data-v-a608230c"]]),ua={key:0},da={key:0,class:"probe-result"},pa={key:0,class:"kv"},va={key:0,class:"kv"},ca={key:1},fa={key:2},ma={key:2,style:{"margin-top":"12px"}},ya={__name:"WechatWizard",props:{open:{type:Boolean,default:!1}},emits:["update:open","registered"],setup(ce,{emit:ye}){const P=ce,E=ye,K=Oe(),$=h(1),c=h(null),g=ne({uin:"",dbPath:"",wechatDataPath:"",forceProvider:null}),I=h(null),D=ne({probe:!1,register:!1}),O=re(()=>$.value===1?"探测设备 + WeChat 版本,确认可用的 keyProvider":$.value===2?"填 UIN 与已 adb-pull 的本地路径":"bootstrap 注册 + 持久化 wechat-accounts.json"),F=re(()=>{const S=I.value;return S?S.reason==="ENV_UNSUPPORTED"?S.message||"env-probe 拒绝 — 请回到第 1 步看 reasons":S.reason==="MD5_NEEDS_WECHAT_DATA_PATH"?"MD5 路径需要 wechatDataPath":S.reason==="FRIDA_NEEDS_WXID"?"Frida 路径需要 account.uin / wxid":S.reason==="ADAPTER_CTOR_FAILED"?`Adapter ctor 抛错: ${S.message||""}`:S.reason==="BOOTSTRAP_THREW"?`Bootstrap 抛错: ${S.message||""}`:S.reason==="UIN_REQUIRED"?"UIN 不能为空":S.message||S.reason||"注册失败":"未知错误"});async function N(){D.probe=!0;try{c.value=await K.probeWechatEnv()}catch(S){c.value={ok:!1,suggestedKeyProvider:"unsupported",reasons:[S?.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{D.probe=!1}}async function se(){D.register=!0;try{I.value=await K.registerWechat({account:{uin:g.uin},dbPath:g.dbPath||null,wechatDataPath:g.wechatDataPath||null,keyProviderOverride:g.forceProvider}),$.value=3,I.value?.ok&&E("registered",{uin:g.uin,chosenKeyProvider:I.value.chosenKeyProvider})}catch(S){I.value={ok:!1,reason:"BOOTSTRAP_THREW",message:S?.message||"RPC failed"},$.value=3}finally{D.register=!1}}function ue(){$.value=1,c.value=null,g.uin="",g.dbPath="",g.wechatDataPath="",g.forceProvider=null,I.value=null}function B(){ue(),E("update:open",!1)}return Xe(()=>P.open,S=>{S&&ue()}),(S,v)=>{const ae=p("a-alert"),T=p("a-button"),X=p("a-tag"),G=p("a-descriptions-item"),k=p("a-descriptions"),H=p("a-input"),ee=p("a-form-item"),x=p("a-radio"),q=p("a-radio-group"),de=p("a-form"),y=p("a-result"),i=p("a-space"),L=p("a-drawer");return n(),m(L,{open:ce.open,title:"添加 WeChat 账号",placement:"right",width:640,"destroy-on-close":!0,"onUpdate:open":v[8]||(v[8]=C=>E("update:open",C)),onClose:B},{footer:e(()=>[a(i,{style:{float:"right"}},{default:e(()=>[$.value>1&&$.value<3?(n(),m(T,{key:0,onClick:v[6]||(v[6]=C=>$.value=$.value-1)},{default:e(()=>[...v[21]||(v[21]=[o("上一步",-1)])]),_:1})):d("",!0),a(T,{onClick:B},{default:e(()=>[...v[22]||(v[22]=[o("取消",-1)])]),_:1}),$.value===1?(n(),m(T,{key:1,type:"primary",disabled:!c.value||c.value.suggestedKeyProvider==="unsupported",onClick:v[7]||(v[7]=C=>$.value=2)},{default:e(()=>[...v[23]||(v[23]=[o(" 下一步 ",-1)])]),_:1},8,["disabled"])):d("",!0),$.value===2?(n(),m(T,{key:2,type:"primary",loading:D.register,disabled:!g.uin||c.value?.suggestedKeyProvider==="md5"&&!g.wechatDataPath,onClick:se},{default:e(()=>[...v[24]||(v[24]=[o(" 注册 ",-1)])]),_:1},8,["loading","disabled"])):d("",!0)]),_:1})]),default:e(()=>[a(ae,{message:`第 ${$.value} / 3 步`,description:O.value,type:"info","show-icon":"",style:{"margin-bottom":"16px"}},null,8,["message","description"]),$.value===1?(n(),f("div",ua,[v[11]||(v[11]=u("p",{class:"hint"},[o(" 请用 USB 连接 Android 设备(开启 USB 调试)。WeChat ≥ 8.0 需要 root + frida-server。 探测仅读取 "),u("code",null,"adb shell"),o(" 命令输出,不写入任何东西。 ")],-1)),a(T,{type:"primary",loading:D.probe,onClick:N,style:{"margin-bottom":"12px"}},{default:e(()=>[...v[9]||(v[9]=[o(" 🔍 探测环境 ",-1)])]),_:1},8,["loading"]),c.value?(n(),f("div",da,[a(k,{column:1,size:"small",bordered:""},{default:e(()=>[a(G,{label:"suggestedKeyProvider"},{default:e(()=>[a(X,{color:c.value.suggestedKeyProvider==="unsupported"?"red":"green"},{default:e(()=>[o(r(c.value.suggestedKeyProvider),1)]),_:1},8,["color"])]),_:1}),a(G,{label:"adb 设备"},{default:e(()=>[a(X,{color:c.value.device.reachable?"green":"red"},{default:e(()=>[o(r(c.value.device.reachable?"已连接":"未连接"),1)]),_:1},8,["color"]),c.value.device.serial?(n(),f("span",pa,r(c.value.device.serial)+" · abi="+r(c.value.device.abi||"?"),1)):d("",!0)]),_:1}),a(G,{label:"root"},{default:e(()=>[a(X,{color:c.value.root.detected?"green":"default"},{default:e(()=>[o(r(c.value.root.detected?"已 root":"未 root"),1)]),_:1},8,["color"]),c.value.root.magiskInstalled?(n(),m(X,{key:0,color:"blue"},{default:e(()=>[...v[10]||(v[10]=[o("Magisk",-1)])]),_:1})):d("",!0)]),_:1}),a(G,{label:"frida-server"},{default:e(()=>[a(X,{color:c.value.frida.serverRunning?"green":"default"},{default:e(()=>[o(r(c.value.frida.serverRunning?"运行中":"未运行"),1)]),_:1},8,["color"]),c.value.frida.port?(n(),f("span",va," :"+r(c.value.frida.port),1)):d("",!0)]),_:1}),a(G,{label:"WeChat"},{default:e(()=>[a(X,{color:c.value.wechat.installed?"green":"red"},{default:e(()=>[o(r(c.value.wechat.installed?c.value.wechat.versionName:"未安装"),1)]),_:1},8,["color"])]),_:1})]),_:1}),(n(!0),f(Z,null,ie(c.value.reasons||[],C=>(n(),m(ae,{key:C,message:C,type:"info","show-icon":"",style:{"margin-top":"8px"}},null,8,["message"]))),128)),(n(!0),f(Z,null,ie(c.value.warnings||[],C=>(n(),m(ae,{key:C,message:C,type:"warning","show-icon":"",style:{"margin-top":"8px"}},null,8,["message"]))),128))])):d("",!0)])):d("",!0),$.value===2?(n(),f("div",ca,[v[16]||(v[16]=u("p",{class:"hint"},[o(" 填写从 adb pull 拉下来的本地路径。MD5 路径(7.x)需要 "),u("code",null,"wechatDataPath"),o("; Frida 路径(8.0+)需要设备运行 frida-server。 ")],-1)),a(de,{layout:"vertical"},{default:e(()=>[a(ee,{label:"UIN / wxid",required:""},{default:e(()=>[a(H,{value:g.uin,"onUpdate:value":v[0]||(v[0]=C=>g.uin=C),placeholder:"WeChat 数字 UIN 或 wxid"},null,8,["value"])]),_:1}),a(ee,{label:"dbPath(已拉下的 EnMicroMsg.db 本地路径)"},{default:e(()=>[a(H,{value:g.dbPath,"onUpdate:value":v[1]||(v[1]=C=>g.dbPath=C),placeholder:"C:\\\\users\\\\me\\\\pull\\\\EnMicroMsg.db"},null,8,["value"])]),_:1}),a(ee,{label:"wechatDataPath(已拉下的 /data/data/com.tencent.mm/ 目录)"},{default:e(()=>[a(H,{value:g.wechatDataPath,"onUpdate:value":v[2]||(v[2]=C=>g.wechatDataPath=C),placeholder:"C:\\\\users\\\\me\\\\pull\\\\com.tencent.mm"},null,8,["value"]),v[12]||(v[12]=u("div",{class:"hint"},"MD5 路径必填;Frida 路径可空",-1))]),_:1}),a(ee,{label:"强制 keyProvider(覆盖 env-probe 建议)"},{default:e(()=>[a(q,{value:g.forceProvider,"onUpdate:value":v[3]||(v[3]=C=>g.forceProvider=C)},{default:e(()=>[a(x,{value:null},{default:e(()=>[...v[13]||(v[13]=[o("自动(推荐)",-1)])]),_:1}),a(x,{value:"md5"},{default:e(()=>[...v[14]||(v[14]=[o("md5",-1)])]),_:1}),a(x,{value:"frida"},{default:e(()=>[...v[15]||(v[15]=[o("frida",-1)])]),_:1})]),_:1},8,["value"])]),_:1})]),_:1})])):d("",!0),$.value===3?(n(),f("div",fa,[I.value?.ok?(n(),m(y,{key:0,status:"success",title:`WeChat 已接入 (uin=${g.uin})`,"sub-title":`provider=${I.value.chosenKeyProvider} · sensitivity=${I.value.sensitivity}`},{extra:e(()=>[a(T,{type:"primary",onClick:B},{default:e(()=>[...v[17]||(v[17]=[o("完成",-1)])]),_:1}),a(T,{onClick:ue},{default:e(()=>[...v[18]||(v[18]=[o("再加一个",-1)])]),_:1})]),_:1},8,["title","sub-title"])):(n(),m(y,{key:1,status:"error",title:"接入失败","sub-title":F.value},Dt({_:2},[I.value?.probe?.reasons?.length?{name:"extra",fn:e(()=>[a(T,{onClick:v[4]||(v[4]=C=>$.value=1)},{default:e(()=>[...v[19]||(v[19]=[o("返回检查环境",-1)])]),_:1}),a(T,{onClick:v[5]||(v[5]=C=>$.value=2)},{default:e(()=>[...v[20]||(v[20]=[o("返回修改路径",-1)])]),_:1})]),key:"0"}:void 0]),1032,["sub-title"])),I.value?.probe?.reasons?.length?(n(),f("div",ma,[(n(!0),f(Z,null,ie(I.value.probe.reasons,C=>(n(),m(ae,{key:C,message:C,type:"warning","show-icon":"",style:{"margin-bottom":"4px"}},null,8,["message"]))),128))])):d("",!0)])):d("",!0)]),_:1},8,["open"])}}},ga=Se(ya,[["__scopeId","data-v-c7327e24"]]),ka={class:"pdh-page"},_a={class:"pdh-header"},ba={class:"kv"},wa={key:0,class:"kv"},xa={key:1,class:"kv"},Ca={class:"kv"},ha={key:0,class:"kv hint"},Pa={style:{"margin-top":"12px",display:"flex","justify-content":"space-between","align-items":"center"}},Aa={key:0,style:{"margin-top":"12px"}},$a={key:1,style:{"margin-top":"12px"}},Da={class:"answer"},Ea={style:{"margin-top":"8px","font-size":"12px",color:"var(--text-color-secondary, #888)"}},Ia={key:2,style:{"margin-top":"8px"}},Ma={style:{display:"flex","align-items":"center",gap:"8px"}},Oa={class:"hint",style:{"margin-top":"4px"}},Sa={key:0,style:{"margin-top":"16px"}},Ra={class:"json-pre",style:{"max-height":"300px",overflow:"auto"}},za={key:0,style:{"margin-top":"8px"}},Na={style:{"min-width":"220px"}},Ua={style:{color:"#999","font-size":"12px","margin-left":"4px"}},La={key:2,style:{"margin-top":"12px"}},Ha={class:"kv",style:{"margin-bottom":"4px"}},Ta={key:0,style:{color:"#faad14"}},qa={key:2,class:"kv hint"},Fa={key:3,class:"kv hint",style:{color:"#ff4d4f"}},Wa={key:3,style:{"margin-top":"12px"}},Ka={key:2,style:{"margin-top":"8px"}},Qa={key:1},Va={style:{"margin-left":"8px"}},Ba={key:3,class:"json-pre"},Ga={style:{"margin-left":"6px"}},ja={key:0,style:{"margin-left":"6px"}},Ja={key:0,class:"hint",style:{"margin-top":"4px"}},Za={key:0,style:{"margin-top":"8px"}},Ya={style:{"margin-bottom":"12px"}},Xa={class:"hint"},el={class:"kv"},tl={class:"kv",style:{"margin-top":"4px"}},al={class:"kv"},ll={key:0,class:"hint",style:{"margin-top":"4px"}},ol={key:1,style:{"font-size":"11px"}},Ye="pdh.syncIncludeOptions.v1",nl={__name:"PersonalDataHub",setup(ce,{expose:ye}){const P=Oe(),E=h(null),K=h(null),$=h([]),c=h(""),g=h(null),I=h(""),D=h(!1),O=h(!1),F=h([]),N=h(null),se={"system-data-android":{contacts:!0,apps:!0,sms:!0,calls:!0}};function ue(){try{const l=localStorage.getItem(Ye);if(!l)return JSON.parse(JSON.stringify(se));const t=JSON.parse(l);return{"system-data-android":{...se["system-data-android"],...t["system-data-android"]||{}}}}catch{return JSON.parse(JSON.stringify(se))}}const B=ne(ue());function S(){try{localStorage.setItem(Ye,JSON.stringify(B)),console.log("[PDH-include] persisted:",JSON.stringify(B))}catch(l){console.warn("[PDH-include] persist failed:",l&&l.message)}}const v=h({}),ae={"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 T(l){return Object.prototype.hasOwnProperty.call(ae,l)}function X(l,t,b){const he=b&&b.target?!!b.target.checked:!!b;console.log("[PDH-include] toggle",l,t,"=>",he),B[l]||(B[l]={}),B[l][t]=he,S()}const G=h(!1),k=ne({provider:"qq",email:"",authCode:"",host:"",port:993,pdfPasswordHints:{idCardLast6:"",phoneLast6:"",cardLast6:""}}),H=h(null),ee=h(!1),x=h(null),q=h(null),de=[{name:"analysis.spending",label:"消费分析",icon:Nt,description:"总支出 / 商家排行 / 月度趋势"},{name:"analysis.relations",label:"人际关系",icon:Ut,description:"与每个人的互动频率 / 主动比例"},{name:"analysis.footprint",label:"足迹",icon:Lt,description:"常去地点 / 出行模式"},{name:"analysis.interests",label:"兴趣画像",icon:Ht,description:"从购买 / 浏览 / 收藏抽兴趣"},{name:"analysis.timeline",label:"时间线",icon:Tt,description:"跨源事件串成故事"}],y=h(!1),i=h([]),L=ne({queue:{pending:0},mergeGroups:0,reviewQueue:0}),C=h(!1),Q=h([]);function Pe(l){l?.unregistered?R.success(`已注销 ${l.vendor}`):R.success(`已接入 ${l.vendor}`),Y()}const ge=h(!1);function Ae(l){R.success(`WeChat 已接入 (uin=${l.uin}, provider=${l.chosenKeyProvider})`),Y()}const fe=h(!1),z=ne({email:"",zipPassword:"",filePath:""}),U=h(null),w=ne({active:!1,adapter:"",phase:"",mailbox:"",current:0,total:0,attempt:1,errorMessage:""}),_=ne({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}),$e=[{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"}],we=[{title:"时间",key:"at",dataIndex:"at",width:170},{title:"动作",dataIndex:"action",key:"action",width:200},{title:"详情",key:"details"}],De=[{title:"日期",key:"occurredAt",width:100},{title:"描述",dataIndex:"description",key:"description"},{title:"金额",key:"amount",width:140,align:"right"}];function Ee(l){return l==="high"?"red":l==="medium"?"orange":"default"}function M(l){if(!l)return"";const t=l.entityCounts||{},b=`events=${t.events??0} persons=${t.persons??0} | raw=${l.rawCount??0} invalid=${l.invalidCount??0} | KG triples=${l.kgTripleCount??0} RAG docs=${l.ragDocCount??0} | ${l.durationMs??0}ms`;return l.error?`${b} · 错误: ${l.error}`:b}async function Y(){_.refresh=!0;try{E.value=await P.health(),K.value=await P.stats(),$.value=await P.listAdapters();try{Q.value=await P.listAichatAccounts()}catch{}}catch(l){R.error("刷新失败: "+l.message)}finally{_.refresh=!1}}async function Re(){if(c.value.trim()){_.ask=!0,I.value="",g.value=null;try{g.value=await P.ask(c.value.trim(),{acceptNonLocal:D.value})}catch(l){I.value=l.message}finally{_.ask=!1}}}async function at(){_.addMock=!0;try{await P.registerMock({count:30,seed:Date.now()%1e3}),await Y(),R.success("MockAdapter 已注册(30 条 mock 数据 ready 同步)")}catch(l){R.error("注册失败: "+l.message)}finally{_.addMock=!1}}function ze(l=""){w.active=!0,w.adapter=l,w.phase="starting",w.mailbox="",w.current=0,w.total=0,w.attempt=1,w.errorMessage=""}function Ne(l){l&&(l.adapter&&(w.adapter=l.adapter),l.phase&&(w.phase=l.phase),typeof l.current=="number"&&(w.current=l.current),typeof l.total=="number"&&(w.total=l.total),typeof l.attempt=="number"&&(w.attempt=l.attempt),l.mailbox&&(w.mailbox=l.mailbox),l.phase==="error"&&(w.errorMessage=l.message||"sync error"))}async function lt(l){_.sync[l]=!0,ze(l);try{const t=B[l],b=t?{include:{...t}}:{};typeof P.syncAdapterStream=="function"?N.value=await P.syncAdapterStream(l,b,Ne):N.value=await P.syncAdapter(l,b),await Y()}catch(t){R.error(`同步 ${l} 失败: ${t.message}`)}finally{_.sync[l]=!1,w.active=!1}}async function ot(){_.syncAll=!0,ze("(all)");try{const l=typeof P.syncAllStream=="function"?await P.syncAllStream({},Ne):await P.syncAll();N.value=l?.[l.length-1]||null,await Y(),R.success(`已同步 ${l?.length||0} 个 adapter`)}catch(l){R.error("同步失败: "+l.message)}finally{_.syncAll=!1,w.active=!1}}async function nt(l){try{await P.unregister(l),await Y()}catch(t){R.error("移除失败: "+t.message)}}async function st(l){if(l){_.audit=!0;try{F.value=await P.recentAudit({limit:200})}catch(t){R.error("审计日志加载失败: "+t.message)}finally{_.audit=!1}}}const xe=re(()=>!(!k.email||!k.email.includes("@")||!k.authCode||k.authCode.length<4||k.provider==="custom"&&!k.host));function it(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 Ue(){k.provider="qq",k.email="",k.authCode="",k.host="",k.port=993,k.pdfPasswordHints={idCardLast6:"",phoneLast6:"",cardLast6:""},H.value=null}function Le(){const l={provider:k.provider,email:k.email.trim(),authCode:k.authCode};return k.provider==="custom"&&(l.host=k.host.trim(),l.port=k.port||993,l.secure=!0),l}function rt(){const l={};for(const t of Object.keys(k.pdfPasswordHints)){const b=k.pdfPasswordHints[t];typeof b=="string"&&b.trim().length>0&&(l[t]=b.trim())}return Object.keys(l).length>0?l:null}async function ut(){if(xe.value){_.testEmail=!0,H.value=null;try{H.value=await P.testEmailAuth(Le())}catch(l){H.value={ok:!1,error:l.message}}finally{_.testEmail=!1}}}async function dt(){if(!(!xe.value||!H.value?.ok)){_.saveEmail=!0;try{const l={},t=rt();t&&(l.pdfPasswordHints=t),await P.registerEmail(Le(),l),R.success("邮箱账号已注册"),G.value=!1,Ue(),await Y()}catch(l){R.error("保存失败: "+l.message)}finally{_.saveEmail=!1}}}const He=re(()=>!(!z.email||!z.email.includes("@")||!z.filePath||z.filePath.length<3));function pt(){z.email="",z.zipPassword="",z.filePath="",U.value=null}async function vt(){if(He.value){_.importAlipay=!0,U.value=null;try{await P.registerAlipay({email:z.email.trim(),zipPassword:z.zipPassword||void 0});const t=/\.zip$/i.test(z.filePath)?{zipPath:z.filePath,zipPassword:z.zipPassword||void 0}:{csvPath:z.filePath};U.value=await P.importAlipayBill(t),U.value?.status==="ok"?(R.success(`导入成功 — ${U.value.entityCounts?.events||0} 笔交易`),await Y()):R.error("导入失败: "+(U.value?.error||U.value?.status))}catch(l){U.value={status:"error",error:l.message},R.error("导入失败: "+l.message)}finally{_.importAlipay=!1}}}async function Te(l){if(l){_.eventDetail=!0,ee.value=!0;try{x.value=await P.eventDetail(l)}catch(t){x.value=null,R.error("事件详情加载失败: "+t.message)}finally{_.eventDetail=!1}}}ye({showEventDetail:Te});async function ct(l){_.skill=!0,q.value=null;try{q.value=await P.runSkill(l,{})}catch(t){R.error(`${l} 失败: ${t.message}`)}finally{_.skill=!1}}async function Ce(){_.reviewQueue=!0;try{i.value=await P.reviewQueueList(50);const l=await P.resolverStats();Object.assign(L,l)}catch(l){R.error("待消歧加载失败: "+l.message)}finally{_.reviewQueue=!1}}async function ft(){y.value=!0,await Ce()}async function Ie(l,t){try{await P.reviewDecision(l,t),R.success(`已记录决策: ${t}`),await Ce()}catch(b){R.error("决策失败: "+b.message)}}async function mt(){_.resolverDrain=!0;try{const l=await P.resolverDrain(20);R.success(`drain 完成 — same=${l.same} different=${l.different} review=${l.review}`),await Ce()}catch(l){R.error("drain 失败: "+l.message)}finally{_.resolverDrain=!1}}async function yt(){try{const l=await P.resolverStats();Object.assign(L,l)}catch{}}return Et(()=>{Y(),yt()}),(l,t)=>{const b=p("a-button"),he=p("a-badge"),j=p("a-space"),W=p("a-tag"),le=p("a-card"),ke=p("a-col"),qe=p("a-row"),gt=p("a-textarea"),Fe=p("a-checkbox"),oe=p("a-alert"),pe=p("a-divider"),kt=p("a-spin"),_t=p("a-popover"),bt=p("a-popconfirm"),Me=p("a-table"),We=p("a-empty"),Ke=p("a-progress"),me=p("a-select-option"),wt=p("a-select"),te=p("a-form-item"),ve=p("a-input"),Qe=p("a-tooltip"),Ve=p("a-input-password"),xt=p("a-input-number"),Be=p("a-form"),_e=p("a-drawer"),be=p("a-descriptions-item"),Ct=p("a-descriptions"),ht=p("a-list-item-meta"),Ge=p("a-list-item"),je=p("a-list"),Pt=p("a-collapse-panel"),At=p("a-collapse");return n(),f("div",ka,[u("div",_a,[t[30]||(t[30]=u("div",null,[u("h2",{class:"page-title"},"个人数据中台"),u("p",{class:"page-sub"}," 让数据回归个人 — 各 app 数据本地加密落盘,本地 LLM 跨源分析,零云端外传。 ")],-1)),a(j,null,{default:e(()=>[a(b,{loading:_.refresh,onClick:Y},{icon:e(()=>[a(V(Je))]),default:e(()=>[t[27]||(t[27]=o(" 刷新 ",-1))]),_:1},8,["loading"]),a(he,{count:L.reviewQueue,offset:[0,0]},{default:e(()=>[a(b,{type:"primary",ghost:"",onClick:ft},{icon:e(()=>[a(V(Ot))]),default:e(()=>[t[28]||(t[28]=o(" 待消歧 ",-1))]),_:1})]),_:1},8,["count"]),a(b,{type:"primary",ghost:"",onClick:t[0]||(t[0]=s=>O.value=!0)},{icon:e(()=>[a(V(St))]),default:e(()=>[t[29]||(t[29]=o(" 审计日志 ",-1))]),_:1})]),_:1})]),a(qe,{gutter:16,style:{"margin-bottom":"16px"}},{default:e(()=>[a(ke,{xs:24,sm:12,md:6},{default:e(()=>[a(le,{size:"small",title:"Vault"},{extra:e(()=>[a(W,{color:E.value?.vault?.ok?"green":"red"},{default:e(()=>[o(r(E.value?.vault?.ok?"正常":"未就绪"),1)]),_:1},8,["color"])]),default:e(()=>[u("div",ba,"schema v"+r(E.value?.vault?.schemaVersion??"?"),1),K.value?.vault?(n(),f("div",wa," 事件 "+r(K.value.vault.events)+" · 联系人 "+r(K.value.vault.persons),1)):d("",!0),K.value?.vault?(n(),f("div",xa," 地点 "+r(K.value.vault.places)+" · 商品 "+r(K.value.vault.items)+" · 主题 "+r(K.value.vault.topics),1)):d("",!0)]),_:1})]),_:1}),a(ke,{xs:24,sm:12,md:6},{default:e(()=>[a(le,{size:"small",title:"本地 LLM"},{extra:e(()=>[a(W,{color:E.value?.llm?.ok?E.value.llm.isLocal?"green":"orange":"red"},{default:e(()=>[o(r(E.value?.llm?.ok?E.value.llm.isLocal?"本地":"非本地":"未就绪"),1)]),_:1},8,["color"])]),default:e(()=>[u("div",Ca,r(E.value?.llm?.name||"—"),1),E.value?.llm?.ok&&!E.value.llm.isLocal?(n(),f("div",ha," ⚠️ 非本地 — ask 会被隐私 gate 拒绝,除非显式 acceptNonLocal ")):d("",!0)]),_:1})]),_:1}),a(ke,{xs:24,sm:12,md:6},{default:e(()=>[a(le,{size:"small",title:"KG 索引"},{extra:e(()=>[a(W,{color:E.value?.kgSink?.ok?"green":"default"},{default:e(()=>[o(r(E.value?.kgSink?.ok?"已连接":"不可用"),1)]),_:1},8,["color"])]),default:e(()=>[t[31]||(t[31]=u("div",{class:"kv"},"events / persons → cc knowledge-graph 实体 + 关系",-1))]),_:1})]),_:1}),a(ke,{xs:24,sm:12,md:6},{default:e(()=>[a(le,{size:"small",title:"RAG 索引"},{extra:e(()=>[a(W,{color:E.value?.ragSink?.ok?"green":"default"},{default:e(()=>[o(r(E.value?.ragSink?.ok?"已连接":"不可用"),1)]),_:1},8,["color"])]),default:e(()=>[t[32]||(t[32]=u("div",{class:"kv"},"文本 → BM25(vector 留待后续 phase)",-1))]),_:1})]),_:1})]),_:1}),a(le,{style:{"margin-bottom":"16px"}},{title:e(()=>[a(j,null,{default:e(()=>[a(V(zt)),t[33]||(t[33]=u("span",null,"问我数据",-1))]),_:1})]),default:e(()=>[a(gt,{value:c.value,"onUpdate:value":t[1]||(t[1]=s=>c.value=s),rows:2,placeholder:"例:上个月在淘宝总共花了多少?/我妈生日那周买了啥送哪儿?",onKeydown:It(tt(Re,["exact","prevent"]),["enter"])},null,8,["value","onKeydown"]),u("div",Pa,[a(Fe,{checked:D.value,"onUpdate:checked":t[2]||(t[2]=s=>D.value=s)},{default:e(()=>[...t[34]||(t[34]=[o("允许非本地 LLM (volcengine / anthropic 等)",-1)])]),_:1},8,["checked"]),a(b,{type:"primary",loading:_.ask,disabled:!c.value.trim(),onClick:Re},{icon:e(()=>[a(V(Rt))]),default:e(()=>[t[35]||(t[35]=o(" 提问 ",-1))]),_:1},8,["loading","disabled"])]),I.value?(n(),f("div",Aa,[a(oe,{type:"error","show-icon":"",message:I.value},null,8,["message"])])):d("",!0),g.value?(n(),f("div",$a,[g.value.warning==="no-facts"?(n(),m(oe,{key:0,type:"warning","show-icon":"",message:"vault 里没找到匹配的事件('no-facts')—— 先同步几个 adapter 让数据进 vault",style:{"margin-bottom":"12px"}})):g.value.warning==="hallucinated-citations"?(n(),m(oe,{key:1,type:"warning","show-icon":"",message:`LLM 引用了 ${g.value.hallucinatedCitations?.length||0} 个不存在的 event id —— 模型在编造`,style:{"margin-bottom":"12px"}},null,8,["message"])):d("",!0),u("div",Da,r(g.value.answer),1),u("div",Ea," 引用 "+r(g.value.citations?.length||0)+" 条事实 · "+r(g.value.facts?.length||0)+" facts 入 prompt · "+r(g.value.durationMs)+"ms · "+r(g.value.model),1),g.value.citations?.length?(n(),f("div",Ia,[t[36]||(t[36]=u("span",{style:{"font-size":"12px",color:"var(--text-color-secondary, #888)"}},"事件链接(点击查看明细 / PDF 解密结果):",-1)),a(j,{style:{"margin-top":"4px"},wrap:""},{default:e(()=>[(n(!0),f(Z,null,ie(g.value.citations,s=>(n(),m(W,{key:s,color:"blue",style:{cursor:"pointer"},onClick:A=>Te(s)},{default:e(()=>[o(r(s),1)]),_:2},1032,["onClick"]))),128))]),_:1})])):d("",!0)])):d("",!0)]),_:1}),a(le,{style:{"margin-bottom":"16px"}},{title:e(()=>[a(j,null,{default:e(()=>[a(V(qt)),t[37]||(t[37]=u("span",null,"分析 skill (Phase 11)",-1))]),_:1})]),extra:e(()=>[a(W,{color:"purple"},{default:e(()=>[...t[38]||(t[38]=[o("5 内置",-1)])]),_:1})]),default:e(()=>[a(qe,{gutter:[12,12]},{default:e(()=>[(n(),f(Z,null,ie(de,s=>a(ke,{xs:24,sm:12,md:8,key:s.name},{default:e(()=>[a(le,{size:"small",hoverable:"",onClick:A=>ct(s.name)},{default:e(()=>[u("div",Ma,[(n(),m(Mt(s.icon),{style:{"font-size":"18px",color:"#722ed1"}})),u("strong",null,r(s.label),1)]),u("div",Oa,r(s.description),1)]),_:2},1032,["onClick"])]),_:2},1024)),64))]),_:1}),q.value?(n(),f("div",Sa,[a(pe,{plain:"",orientation:"left"},{default:e(()=>[o(r(q.value.skill)+" 结果",1)]),_:1}),a(kt,{spinning:_.skill},{default:e(()=>[u("pre",Ra,r(JSON.stringify(q.value,null,2)),1),q.value.llm_commentary||q.value.llm_narrative?(n(),f("div",za,[a(oe,{type:"info",message:q.value.llm_commentary||q.value.llm_narrative},null,8,["message"])])):d("",!0)]),_:1},8,["spinning"])])):d("",!0)]),_:1}),a(le,{style:{"margin-bottom":"16px"}},{title:e(()=>[a(j,null,{default:e(()=>[a(V(Vt)),t[39]||(t[39]=u("span",null,"Adapters",-1))]),_:1})]),extra:e(()=>[a(j,null,{default:e(()=>[a(b,{onClick:t[3]||(t[3]=s=>G.value=!0)},{icon:e(()=>[a(V(Ft))]),default:e(()=>[t[40]||(t[40]=o(" 添加邮箱账号 ",-1))]),_:1}),a(b,{onClick:t[4]||(t[4]=s=>fe.value=!0)},{icon:e(()=>[a(V(Wt))]),default:e(()=>[t[41]||(t[41]=o(" 导入支付宝账单 ",-1))]),_:1}),a(b,{onClick:t[5]||(t[5]=s=>C.value=!0)},{icon:e(()=>[a(V(Kt))]),default:e(()=>[t[42]||(t[42]=o(" 添加 AI 对话账号 ",-1))]),_:1}),a(b,{onClick:t[6]||(t[6]=s=>ge.value=!0)},{icon:e(()=>[a(V(Qt))]),default:e(()=>[t[43]||(t[43]=o(" 添加 WeChat ",-1))]),_:1}),a(b,{onClick:at,loading:_.addMock},{default:e(()=>[...t[44]||(t[44]=[o(" 注册 MockAdapter(开发) ",-1)])]),_:1},8,["loading"]),a(b,{type:"primary",onClick:ot,loading:_.syncAll,disabled:!$.value.length},{default:e(()=>[...t[45]||(t[45]=[o(" 同步全部 ",-1)])]),_:1},8,["loading","disabled"])]),_:1})]),default:e(()=>[$.value.length?(n(),m(Me,{key:0,columns:$e,"data-source":$.value,pagination:!1,"row-key":s=>s.name,size:"middle"},{bodyCell:e(({column:s,record:A})=>[s.key==="sensitivity"?(n(),f(Z,{key:0},[a(W,{color:Ee(A.sensitivity)},{default:e(()=>[o(r(A.sensitivity),1)]),_:2},1032,["color"]),A.legalGate?(n(),m(W,{key:0,color:"red",style:{"margin-left":"4px"}},{default:e(()=>[...t[46]||(t[46]=[o("需法律确认",-1)])]),_:1})):d("",!0)],64)):s.key==="capabilities"?(n(!0),f(Z,{key:1},ie(A.capabilities,J=>(n(),m(W,{key:J,style:{"margin-right":"4px"}},{default:e(()=>[o(r(J),1)]),_:2},1024))),128)):s.key==="actions"?(n(),m(j,{key:2},{default:e(()=>[a(b,{size:"small",loading:_.sync[A.name],onClick:J=>lt(A.name)},{default:e(()=>[...t[47]||(t[47]=[o(" 同步 ",-1)])]),_:1},8,["loading","onClick"]),T(A.name)?(n(),m(_t,{key:0,open:v.value[A.name],"onUpdate:open":J=>v.value[A.name]=J,trigger:"click",placement:"left",title:`${A.name} 采集范围`},{content:e(()=>[u("div",Na,[(n(!0),f(Z,null,ie(ae[A.name],J=>(n(),f("div",{key:J.key,style:{margin:"6px 0"}},[a(Fe,{checked:B[A.name][J.key]!==!1,onChange:$t=>X(A.name,J.key,$t)},{default:e(()=>[o(r(J.label)+" ",1),u("span",Ua,r(J.hint),1),J.sensitive?(n(),m(W,{key:0,color:"orange",size:"small",style:{"margin-left":"4px"}},{default:e(()=>[...t[48]||(t[48]=[o("敏感",-1)])]),_:1})):d("",!0)]),_:2},1032,["checked","onChange"])]))),128)),t[49]||(t[49]=u("div",{style:{"margin-top":"8px","font-size":"11px",color:"#999"}}," 取消勾选的数据本次同步不会拉取入库 ",-1))])]),default:e(()=>[a(b,{size:"small",title:"选择采集范围"},{default:e(()=>[...t[50]||(t[50]=[o("⚙",-1)])]),_:1})]),_:2},1032,["open","onUpdate:open","title"])):d("",!0),a(bt,{title:`从注册表移除 ${A.name}?(vault 数据不会删除)`,onConfirm:J=>nt(A.name)},{default:e(()=>[a(b,{size:"small",danger:""},{default:e(()=>[...t[51]||(t[51]=[o("移除",-1)])]),_:1})]),_:1},8,["title","onConfirm"])]),_:2},1024)):d("",!0)]),_:1},8,["data-source","row-key"])):(n(),m(We,{key:1,description:"无已注册 adapter — 点上方按钮注册 MockAdapter 看效果"})),w.active?(n(),f("div",La,[a(le,{size:"small",bordered:!0},{default:e(()=>[u("div",Ha,[t[52]||(t[52]=u("strong",null,"同步进行中",-1)),o(" · "+r(w.adapter)+" · "+r(w.phase||"...")+" ",1),w.attempt&&w.attempt>1?(n(),f("span",Ta," (重试 #"+r(w.attempt)+") ",1)):d("",!0)]),w.total>0?(n(),m(Ke,{key:0,percent:Math.round(w.current/w.total*100),status:w.errorMessage?"exception":"active",size:"small"},null,8,["percent","status"])):(n(),m(Ke,{key:1,percent:0,status:"active",size:"small"})),w.mailbox?(n(),f("div",qa," 邮箱 "+r(w.mailbox)+" · "+r(w.current)+" / "+r(w.total),1)):d("",!0),w.errorMessage?(n(),f("div",Fa,r(w.errorMessage),1)):d("",!0)]),_:1})])):d("",!0),N.value?(n(),f("div",Wa,[a(oe,{type:N.value.status==="ok"?"success":"error","show-icon":"",message:`同步 ${N.value.adapter}: ${N.value.status}`,description:M(N.value)},null,8,["type","message","description"])])):d("",!0)]),_:1}),a(_e,{open:G.value,"onUpdate:open":t[16]||(t[16]=s=>G.value=s),title:"添加邮箱账号",placement:"right",width:"560","destroy-on-close":!0,onClose:Ue},{footer:e(()=>[a(j,null,{default:e(()=>[a(b,{onClick:t[15]||(t[15]=s=>G.value=!1)},{default:e(()=>[...t[62]||(t[62]=[o("取消",-1)])]),_:1}),a(b,{loading:_.testEmail,disabled:!xe.value,onClick:ut},{default:e(()=>[...t[63]||(t[63]=[o(" 测试连接 ",-1)])]),_:1},8,["loading","disabled"]),a(b,{type:"primary",loading:_.saveEmail,disabled:!xe.value||!H.value?.ok,onClick:dt},{default:e(()=>[...t[64]||(t[64]=[o(" 保存并注册 ",-1)])]),_:1},8,["loading","disabled"])]),_:1})]),default:e(()=>[a(oe,{message:"数据回归个人 — 凭证落本地加密文件(与 vault 主密钥同目录),同步动作 100% 本地。",type:"info","show-icon":"",style:{"margin-bottom":"16px"}}),a(Be,{layout:"vertical",model:k},{default:e(()=>[a(te,{label:"邮箱服务商",required:""},{default:e(()=>[a(wt,{value:k.provider,"onUpdate:value":t[7]||(t[7]=s=>k.provider=s),placeholder:"选择服务商"},{default:e(()=>[a(me,{value:"qq"},{default:e(()=>[...t[53]||(t[53]=[o("QQ 邮箱 (imap.qq.com)",-1)])]),_:1}),a(me,{value:"163"},{default:e(()=>[...t[54]||(t[54]=[o("网易邮箱 163/126",-1)])]),_:1}),a(me,{value:"189"},{default:e(()=>[...t[55]||(t[55]=[o("189 邮箱",-1)])]),_:1}),a(me,{value:"outlook"},{default:e(()=>[...t[56]||(t[56]=[o("Outlook / Hotmail",-1)])]),_:1}),a(me,{value:"gmail"},{default:e(()=>[...t[57]||(t[57]=[o("Gmail",-1)])]),_:1}),a(me,{value:"custom"},{default:e(()=>[...t[58]||(t[58]=[o("自定义 IMAP",-1)])]),_:1})]),_:1},8,["value"])]),_:1}),a(te,{label:"邮箱地址",required:""},{default:e(()=>[a(ve,{value:k.email,"onUpdate:value":t[8]||(t[8]=s=>k.email=s),placeholder:"you@qq.com",autocomplete:"off"},null,8,["value"])]),_:1}),a(te,{required:""},{label:e(()=>[a(j,null,{default:e(()=>[t[59]||(t[59]=u("span",null,"授权码(非登录密码)",-1)),a(Qe,{title:it(k.provider)},{default:e(()=>[a(V(Ze),{style:{color:"#888"}})]),_:1},8,["title"])]),_:1})]),default:e(()=>[a(Ve,{value:k.authCode,"onUpdate:value":t[9]||(t[9]=s=>k.authCode=s),placeholder:"例:QQ 邮箱 设置 → 账户 → 开启 IMAP/SMTP → 生成的授权码",autocomplete:"off"},null,8,["value"])]),_:1}),k.provider==="custom"?(n(),m(te,{key:0,label:"IMAP host"},{default:e(()=>[a(ve,{value:k.host,"onUpdate:value":t[10]||(t[10]=s=>k.host=s),placeholder:"mail.example.com"},null,8,["value"])]),_:1})):d("",!0),k.provider==="custom"?(n(),m(te,{key:1,label:"端口"},{default:e(()=>[a(xt,{value:k.port,"onUpdate:value":t[11]||(t[11]=s=>k.port=s),min:1,max:65535,"default-value":993},null,8,["value"])]),_:1})):d("",!0),a(pe,{orientation:"left",plain:""},{default:e(()=>[...t[60]||(t[60]=[o("PDF 账单解密提示(可选)",-1)])]),_:1}),t[61]||(t[61]=u("p",{class:"hint"},"银行 PDF 月结大多加密;提供几个常用候选项让 Phase 5.5 自动解锁:",-1)),a(te,{label:"身份证后 6 位"},{default:e(()=>[a(ve,{value:k.pdfPasswordHints.idCardLast6,"onUpdate:value":t[12]||(t[12]=s=>k.pdfPasswordHints.idCardLast6=s),placeholder:"123456",autocomplete:"off"},null,8,["value"])]),_:1}),a(te,{label:"手机后 6 位"},{default:e(()=>[a(ve,{value:k.pdfPasswordHints.phoneLast6,"onUpdate:value":t[13]||(t[13]=s=>k.pdfPasswordHints.phoneLast6=s),placeholder:"123456",autocomplete:"off"},null,8,["value"])]),_:1}),a(te,{label:"信用卡尾 6 位"},{default:e(()=>[a(ve,{value:k.pdfPasswordHints.cardLast6,"onUpdate:value":t[14]||(t[14]=s=>k.pdfPasswordHints.cardLast6=s),placeholder:"123456",autocomplete:"off"},null,8,["value"])]),_:1}),H.value?(n(),f("div",Ka,[a(oe,{type:H.value.ok?"success":"error","show-icon":"",message:H.value.ok?"凭证有效 — 可以保存":`认证失败: ${H.value.reason||H.value.error}`},null,8,["type","message"])])):d("",!0)]),_:1},8,["model"])]),_:1},8,["open"]),a(_e,{open:ee.value,"onUpdate:open":t[17]||(t[17]=s=>ee.value=s),title:x.value?`事件 ${x.value.event.id}`:"加载中...",placement:"right",width:"640","destroy-on-close":!0},{default:e(()=>[x.value?(n(),f(Z,{key:0},[a(Ct,{column:1,size:"small",bordered:""},{default:e(()=>[a(be,{label:"类型"},{default:e(()=>[o(r(x.value.event.subtype),1)]),_:1}),a(be,{label:"发生于"},{default:e(()=>[o(r(new Date(x.value.event.occurredAt).toLocaleString()),1)]),_:1}),a(be,{label:"actor"},{default:e(()=>[o(r(x.value.event.actor),1)]),_:1}),x.value.event.content?.title?(n(),m(be,{key:0,label:"标题"},{default:e(()=>[o(r(x.value.event.content.title),1)]),_:1})):d("",!0),x.value.event.source?.adapter?(n(),m(be,{key:1,label:"来源 adapter"},{default:e(()=>[o(r(x.value.event.source.adapter)+" @ v"+r(x.value.event.source.adapterVersion),1)]),_:1})):d("",!0)]),_:1}),x.value.classification?(n(),m(pe,{key:0,orientation:"left",plain:""},{default:e(()=>[...t[65]||(t[65]=[o("分类",-1)])]),_:1})):d("",!0),x.value.classification?(n(),f("div",Qa,[a(W,{color:"blue"},{default:e(()=>[o(r(x.value.classification.category),1)]),_:1}),a(W,null,{default:e(()=>[o(r(x.value.classification.layer),1)]),_:1}),u("span",Va,"置信 "+r(Math.round((x.value.classification.confidence||0)*100))+"%",1)])):d("",!0),x.value.extraction?(n(),m(pe,{key:2,orientation:"left",plain:""},{default:e(()=>[o("结构化字段("+r(x.value.extraction.template)+")",1)]),_:1})):d("",!0),x.value.extraction?(n(),f("pre",Ba,r(JSON.stringify(x.value.extraction.fields,null,2)),1)):d("",!0),x.value.extraction?.pdfExtraction?(n(),m(pe,{key:4,orientation:"left",plain:""},{default:e(()=>[...t[66]||(t[66]=[o("PDF 解密 / 解析",-1)])]),_:1})):d("",!0),x.value.extraction?.pdfExtraction?(n(),m(je,{key:5,"data-source":x.value.extraction.pdfExtraction,size:"small"},{renderItem:e(({item:s})=>[a(Ge,null,{default:e(()=>[a(ht,{title:s.filename},{description:e(()=>[u("div",null,[a(W,{color:s.decrypted?"green":"red"},{default:e(()=>[o(r(s.decrypted?"已解密":"解密失败"),1)]),_:2},1032,["color"]),u("span",Ga,"尝试 "+r(s.attempted)+" 次",1),s.transactionsExtracted!=null?(n(),f("span",ja," · 提取 "+r(s.transactionsExtracted)+" 条交易 ",1)):d("",!0)]),s.error?(n(),f("div",Ja,r(s.error),1)):d("",!0)]),_:2},1032,["title"])]),_:2},1024)]),_:1},8,["data-source"])):d("",!0),x.value.extraction?.fields?.transactions?.length?(n(),f(Z,{key:6},[a(pe,{orientation:"left",plain:""},{default:e(()=>[...t[67]||(t[67]=[o("交易明细",-1)])]),_:1}),a(Me,{columns:De,"data-source":x.value.extraction.fields.transactions,pagination:{pageSize:10,size:"small"},"row-key":(s,A)=>A,size:"small"},{bodyCell:e(({column:s,record:A})=>[s.key==="occurredAt"?(n(),f(Z,{key:0},[o(r(new Date(A.occurredAtMs).toLocaleDateString()),1)],64)):s.key==="amount"?(n(),f("span",{key:1,class:et(A.amount.direction==="in"?"amount-in":"amount-out")},r(A.amount.direction==="in"?"+":"-")+r(A.amount.value.toFixed(2))+" "+r(A.amount.currency),3)):d("",!0)]),_:1},8,["data-source","row-key"])],64)):d("",!0)],64)):(n(),m(We,{key:1,description:"无事件数据"}))]),_:1},8,["open","title"]),a(_e,{open:fe.value,"onUpdate:open":t[22]||(t[22]=s=>fe.value=s),title:"导入支付宝账单",placement:"right",width:"560","destroy-on-close":!0,onClose:pt},{footer:e(()=>[a(j,null,{default:e(()=>[a(b,{onClick:t[21]||(t[21]=s=>fe.value=!1)},{default:e(()=>[...t[73]||(t[73]=[o("关闭",-1)])]),_:1}),a(b,{type:"primary",loading:_.importAlipay,disabled:!He.value,onClick:vt},{default:e(()=>[...t[74]||(t[74]=[o(" 注册账户 + 导入 ",-1)])]),_:1},8,["loading","disabled"])]),_:1})]),default:e(()=>[a(oe,{message:"支付宝官方导出 CSV — 服务器侧全量、稳定无风控。3 分钟拿到 12 个月流水。",type:"info","show-icon":"",style:{"margin-bottom":"16px"}}),a(At,{bordered:!1,style:{"margin-bottom":"12px"}},{default:e(()=>[a(Pt,{header:"如何导出账单(首次必看)"},{default:e(()=>[...t[68]||(t[68]=[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,[o("从邮箱下载 "),u("code",null,"alipay_record_*.zip")]),u("li",null,"解压密码 = 你的身份证后 6 位")],-1)])]),_:1})]),_:1}),a(Be,{layout:"vertical",model:z},{default:e(()=>[a(te,{label:"支付宝绑定邮箱(账户标识)",required:""},{default:e(()=>[a(ve,{value:z.email,"onUpdate:value":t[18]||(t[18]=s=>z.email=s),placeholder:"alipay-bound@example.com",autocomplete:"off"},null,8,["value"])]),_:1}),a(te,null,{label:e(()=>[a(j,null,{default:e(()=>[t[69]||(t[69]=u("span",null,"ZIP 密码(身份证后 6 位)",-1)),a(Qe,{title:"支付宝 ZIP 默认密码 = 身份证号后 6 位。也支持自定义密码。"},{default:e(()=>[a(V(Ze),{style:{color:"#888"}})]),_:1})]),_:1})]),default:e(()=>[a(Ve,{value:z.zipPassword,"onUpdate:value":t[19]||(t[19]=s=>z.zipPassword=s),placeholder:"例:123456",autocomplete:"off"},null,8,["value"]),t[70]||(t[70]=u("div",{class:"hint",style:{"margin-top":"4px"}}," 空白则解析时再问,或导入的 ZIP 未加密。 ",-1))]),_:1}),a(pe,{orientation:"left",plain:""},{default:e(()=>[...t[71]||(t[71]=[o("选择文件",-1)])]),_:1}),a(te,{label:"ZIP 或 CSV 文件路径"},{default:e(()=>[a(ve,{value:z.filePath,"onUpdate:value":t[20]||(t[20]=s=>z.filePath=s),placeholder:"C:\\\\Users\\\\you\\\\Downloads\\\\alipay_record_xxx.zip","allow-clear":""},null,8,["value"]),t[72]||(t[72]=u("div",{class:"hint",style:{"margin-top":"4px"}}," 桌面版可通过 Electron 文件选择器自动填充;web-shell 复制完整路径。 ",-1))]),_:1}),U.value?(n(),f("div",Za,[a(oe,{type:U.value.status==="ok"?"success":"error","show-icon":"",message:U.value.status==="ok"?`导入成功 — ${U.value.entityCounts?.events||0} 笔交易`:`导入失败: ${U.value.error||U.value.status}`,description:U.value.status==="ok"?`${U.value.entityCounts?.persons||0} 个交易对方 · ${U.value.kgTripleCount||0} KG triples · ${U.value.durationMs||0}ms`:null},null,8,["type","message","description"])])):d("",!0)]),_:1},8,["model"])]),_:1},8,["open"]),a(_e,{open:y.value,"onUpdate:open":t[23]||(t[23]=s=>y.value=s),title:"待消歧(EntityResolver 模糊判定)",placement:"right",width:"640","destroy-on-close":!0},{default:e(()=>[i.value.length===0&&!_.reviewQueue?(n(),m(oe,{key:0,type:"success","show-icon":"",message:"无待消歧 pair — 所有跨源 Person 已确定。",style:{"margin-bottom":"12px"}})):d("",!0),u("div",Ya,[a(j,null,{default:e(()=>[a(b,{loading:_.reviewQueue,onClick:Ce},{icon:e(()=>[a(V(Je))]),default:e(()=>[t[75]||(t[75]=o(" 刷新 ",-1))]),_:1},8,["loading"]),a(b,{loading:_.resolverDrain,onClick:mt},{default:e(()=>[...t[76]||(t[76]=[o(" 手动 drain 队列 ",-1)])]),_:1},8,["loading"]),u("span",Xa," queue: "+r(L.queue?.pending||0)+" pending · "+r(L.mergeGroups||0)+" groups ",1)]),_:1})]),a(je,{"data-source":i.value,pagination:{pageSize:5,size:"small"},size:"small"},{renderItem:e(({item:s})=>[a(Ge,null,{default:e(()=>[a(le,{size:"small",style:{width:"100%"}},{default:e(()=>[u("div",el,[u("strong",null,"Pair #"+r(s.id),1),s.embed_sim?(n(),m(W,{key:0,color:"blue",style:{"margin-left":"8px"}},{default:e(()=>[o(" sim "+r(Number(s.embed_sim).toFixed(2)),1)]),_:2},1024)):d("",!0),s.llm_verdict?(n(),m(W,{key:1,color:s.llm_verdict==="yes"?"green":s.llm_verdict==="no"?"red":"orange",style:{"margin-left":"4px"}},{default:e(()=>[o(" LLM: "+r(s.llm_verdict),1)]),_:2},1032,["color"])):d("",!0)]),u("div",tl,"A: "+r(s.a_person_id),1),u("div",al,"B: "+r(s.b_person_id),1),s.llm_reason?(n(),f("div",ll," LLM 理由: "+r(s.llm_reason),1)):d("",!0),a(j,{style:{"margin-top":"8px"}},{default:e(()=>[a(b,{size:"small",type:"primary",onClick:A=>Ie(s.id,"same")},{default:e(()=>[...t[77]||(t[77]=[o("同一人",-1)])]),_:1},8,["onClick"]),a(b,{size:"small",danger:"",onClick:A=>Ie(s.id,"different")},{default:e(()=>[...t[78]||(t[78]=[o("不同人",-1)])]),_:1},8,["onClick"]),a(b,{size:"small",onClick:A=>Ie(s.id,"skip")},{default:e(()=>[...t[79]||(t[79]=[o("跳过",-1)])]),_:1},8,["onClick"])]),_:2},1024)]),_:2},1024)]),_:2},1024)]),_:1},8,["data-source"])]),_:1},8,["open"]),a(_e,{open:O.value,"onUpdate:open":t[24]||(t[24]=s=>O.value=s),title:"审计日志(数据 lineage)",placement:"right",width:"600",onAfterOpenChange:st},{default:e(()=>[a(Me,{columns:we,"data-source":F.value,pagination:{pageSize:20,size:"small"},"row-key":s=>s.id,size:"small"},{bodyCell:e(({column:s,record:A})=>[s.key==="at"?(n(),f(Z,{key:0},[o(r(new Date(A.at).toLocaleString()),1)],64)):s.key==="details"?(n(),f("code",ol,r(A.details||"—"),1)):d("",!0)]),_:1},8,["data-source","row-key"])]),_:1},8,["open"]),a(ra,{open:C.value,"onUpdate:open":t[25]||(t[25]=s=>C.value=s),"existing-accounts":Q.value,onRegistered:Pe},null,8,["open","existing-accounts"]),a(ga,{open:ge.value,"onUpdate:open":t[26]||(t[26]=s=>ge.value=s),onRegistered:Ae},null,8,["open"])])}}},dl=Se(nl,[["__scopeId","data-v-5d6ede6d"]]);export{dl as default};
@@ -1 +0,0 @@
1
- import{C as o}from"./Col-2A3Bg2GC.js";import{S as t}from"./index-DeoJYTHX.js";import"./index-B9sJpsz3.js";import"./vendor-DhFY8mDK.js";import"./icons-AILO5ZcK.js";const s=t(o);export{s as default};
@@ -1 +0,0 @@
1
- import{A as o}from"./Row-CL1Y6SfW.js";import{S as t}from"./index-DeoJYTHX.js";import"./responsiveObserve-BJqsSjxJ.js";import"./vendor-DhFY8mDK.js";import"./useFlexGapSupport-q90prOQL.js";import"./styleChecker-B_YDSNYf.js";import"./index-B9sJpsz3.js";import"./icons-AILO5ZcK.js";const l=t(o);export{l as default};