chainlesschain 0.162.180 → 0.162.181
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 +6 -3
- package/src/assets/web-panel/.build-hash +1 -1
- package/src/assets/web-panel/assets/{AIOps-D_TIL54O.js → AIOps-cq0dwbnf.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-eQwy9r-f.js → ActionButton-CvcgGl3w.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-D2eNuDgT.js → Analytics-hM2-jFqg.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-CFhwOFsf.js → AppLayout-B9_Gsd_g.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-CJUMw6PB.js → Artifacts-B7bu52Og.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-CDB9V58o.js → Audit-DThfDgqB.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-TBppYFjN.js → BackgroundAgents-DjlFiD4v.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-CYEOUpzJ.js → Backup-CK9xJKnG.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-C88fFT2u.js → BaseInput-DEiSU8K8.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-mkr1vC3N.js → Chat-CpT96czj.js} +6 -6
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-C7bofJuA.js → ChatBubbleRenderer-BKPPNmZI.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-CVU4xqti.js → Checkbox-C1GfDnO0.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-rrNcByz3.js → Codegen-3DAKgiLx.js} +1 -1
- package/src/assets/web-panel/assets/{Col-Cqu-zCvh.js → Col-74cOwZU1.js} +1 -1
- package/src/assets/web-panel/assets/{Community-RGRlSgXV.js → Community-tn9Kkz9j.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-DBm6epOK.js → Compact-BcoXH7m4.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-BgKw5iaW.js → Compliance-DIPGUBgi.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-BqQcNO3Z.js → Cowork-doD5_91c.js} +2 -2
- package/src/assets/web-panel/assets/{Cron-DO5gTFNb.js → Cron-C-IDvubz.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-B8hbJNuN.js → Crosschain-CdcCoBdj.js} +1 -1
- package/src/assets/web-panel/assets/{DID-B08bFJ2C.js → DID-DdH5aMMA.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-xNdy_ifo.js → Dashboard-DHLA4mm0.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-D-KIZgWL.js → Dropdown-dEeCt7Md.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-DKCvsaGo.js → EmailListRenderer-BMaecFv9.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-D_cfqama.js → FamilyGuardDashboard-DUaUukTN.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-B-UqQD68.js → Federation-CMBE0_rp.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-BWWvWuJW.js → FormItemContext-PG-JDbXq.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-CPchx6N7.js → GenericCardRenderer-Bcb0p88m.js} +1 -1
- package/src/assets/web-panel/assets/{Git-Vx4co9Ff.js → Git-Bgv15myB.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-D4x0pp_m.js → Governance-DB8YTArI.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-T3KvwPYR.js → Inference-BQMwCWaS.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-Ddv3KUv3.js → KnowledgeGraph-B1_ZziiB.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-DfH-Dkae.js → Logs-DovEEnt_.js} +2 -2
- package/src/assets/web-panel/assets/{MarkdownRenderer-DHW3PbCq.js → MarkdownRenderer-D201OL4T.js} +1 -1
- package/src/assets/web-panel/assets/{Marketplace-tjgb0R3D.js → Marketplace-BlCXSpyB.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-DHAk5nYX.js → McpTools-CsCR09Wj.js} +5 -5
- package/src/assets/web-panel/assets/{Memory-A2Yx7thM.js → Memory-CBVRLKno.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-BEmTVfN5.js → MobileBridge-C9OIafgA.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-DuFHUgE4.js → MobileProjects-D_zoJ8Xs.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-BDSll0OZ.js → Mtc-vE-HdvLj.js} +4 -4
- package/src/assets/web-panel/assets/{MtcAudit-CuBvluaS.js → MtcAudit-CPLaekCd.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-BmXAA-Sb.js → Multisig-C_UP9C2o.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-ci2stZAe.js → NLProgramming-2nODJcU1.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-D-1RpqnS.js → Notes-BhE-SJGu.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-C0GyitIT.js → NotificationSettings-D21q7BNU.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-U2bN-hj5.js → OrderTableRenderer-0b62GYOD.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-BNZgpPci.js → Organization-CEqmw_sb.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-CDidKmUN.js → Overflow-MW-gMDO_.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-BnreBaXq.js → P2P-CY0hjI_G.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-DwJUxO9j.js → PdhVaultBrowser-BbWh7Man.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-BQGgJPH0.js → Permissions-ChqEA_4Q.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-k_fSkCwL.js → PersonalDataHub-B3YrbYfD.js} +5 -5
- package/src/assets/web-panel/assets/{Pipeline-WGqKMqau.js → Pipeline-B8WBhhlW.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-DtHj9Ymq.js → Privacy-Cmb0PXNx.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-B3wH2SFC.js → ProjectInit-hF6zW3Nz.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-Cd0cgcA1.js → ProjectSettings-BFSVfpW0.js} +2 -2
- package/src/assets/web-panel/assets/Projects-DAWkVFkc.js +1 -0
- package/src/assets/web-panel/assets/{Providers-DTpxEXur.js → Providers-B8yux8Dx.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-B2v6gR-C.js → QrScannerModal-N76cQluO.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-D3Nr9xXR.js → QuickAsk-ClvZ0KYR.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-C9inoMky.js → Recommend-B-GfgBpT.js} +1 -1
- package/src/assets/web-panel/assets/RemoteSession-mlglCdQi.js +5 -0
- package/src/assets/web-panel/assets/{Reputation-41KFG646.js → Reputation-DJIZzQeG.js} +1 -1
- package/src/assets/web-panel/assets/{Row-DqAaqqCv.js → Row-COzxu_bb.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-CMDpCDKc.js → RssFeed-CoYsJQuE.js} +3 -3
- package/src/assets/web-panel/assets/{Search-B6mtegNL.js → Search-DC77Mq9S.js} +1 -1
- package/src/assets/web-panel/assets/{Security-BaePFVZ8.js → Security-Loy2EdMO.js} +3 -3
- package/src/assets/web-panel/assets/{Services-DeG3Qscl.js → Services-GUD07Eu0.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-D_QP7F90.js → Skeleton-DWzkptYU.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-DLGyUgIA.js → Skills-CEDn1r-Z.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-BN2pxW1Q.js → Sla-ub_k4pXh.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-BWsZPd8B.js → SpeechSettings-D7HLX9CA.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-VOZRPODW.js → SyncSettings-DbwOvl6m.js} +2 -2
- package/src/assets/web-panel/assets/Tasks-CBQzoAu5.js +1 -0
- package/src/assets/web-panel/assets/{Templates-eJSob-q0.js → Templates-BNVeIhud.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-Bdwk8Rwy.js → Tenant-PS9AzhXU.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-CsMLKIoV.js → Terminal-Cgb4eLB_.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-D5qkbPKT.js → TimelineRenderer-CrmXMOkg.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-DKgwn8hI.js → Tokens-DD-VDHw1.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-HlEHniGM.js → Trigger-BsoN_n-n.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-CdPcsBpN.js → Trust-n8LmN4ZV.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-vAdXd-vG.js → UkeySign-C9_7MImA.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-9hHBYFnH.js → VideoEditing-DyBteNgn.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-Dxh5d1yR.js → Wallet-BS5ixeXI.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-BsFmLHkp.js → WebAuthn-spc4UImU.js} +3 -3
- package/src/assets/web-panel/assets/{WorkflowEditor-Cn0OIwLn.js → WorkflowEditor-D7iVvaBO.js} +1 -1
- package/src/assets/web-panel/assets/chat-6CmBkHrL.js +1 -0
- package/src/assets/web-panel/assets/{colors-Du9jzLN0.js → colors-BGoCLkxI.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-DhEscfzw.js → compact-item-fYZBetMO.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-CwzEfF3i.js → createContext-BeM-1UVj.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-BzPwHnw8.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-DT_GSE6J.js → hasIn-CE7ZuEnV.js} +1 -1
- package/src/assets/web-panel/assets/{index-53z1YUxX.js → index--lap6cf7.js} +1 -1
- package/src/assets/web-panel/assets/{index-NA2oBLSB.js → index-ATcSr_2O.js} +1 -1
- package/src/assets/web-panel/assets/{index-DWL3SYN3.js → index-B2U-ObMq.js} +1 -1
- package/src/assets/web-panel/assets/{index-D-QkW1fp.js → index-B3CDgvNW.js} +1 -1
- package/src/assets/web-panel/assets/{index-BF-ZCVGE.js → index-B4wiTEOM.js} +1 -1
- package/src/assets/web-panel/assets/{index-D4kZoXNr.js → index-B8BsdNV_.js} +1 -1
- package/src/assets/web-panel/assets/{index-DnVVYKCE.js → index-BEVm0lCS.js} +10 -10
- package/src/assets/web-panel/assets/{index-DfRDyY1q.js → index-BNZDILcO.js} +1 -1
- package/src/assets/web-panel/assets/{index-B8s5FxJY.js → index-BU_2qiDk.js} +1 -1
- package/src/assets/web-panel/assets/{index-BnHhFnwt.js → index-BV551878.js} +1 -1
- package/src/assets/web-panel/assets/{index-DhXay17G.js → index-BfPL-m46.js} +1 -1
- package/src/assets/web-panel/assets/{index-B6QDWRLk.js → index-BowH1eLQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-DN60VBn5.js → index-BsMfoaeo.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cnok8mhZ.js → index-BunaQCa0.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dny_ZnAO.js → index-C0v6YKKO.js} +1 -1
- package/src/assets/web-panel/assets/{index-D8gt0j7r.js → index-C4SJVjs4.js} +1 -1
- package/src/assets/web-panel/assets/{index-Mobw3PHs.js → index-C9Y3k0HI.js} +1 -1
- package/src/assets/web-panel/assets/{index-CAVW0cWM.js → index-CIpVrf5P.js} +1 -1
- package/src/assets/web-panel/assets/{index-CyEhUJcu.js → index-CRLjEP1H.js} +1 -1
- package/src/assets/web-panel/assets/{index-DzjzrOli.js → index-CRnUE8Cb.js} +1 -1
- package/src/assets/web-panel/assets/{index-D5IytTND.js → index-Cip8emOQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-BQWENaZf.js → index-CpIGIB85.js} +1 -1
- package/src/assets/web-panel/assets/{index-CQWxDOvM.js → index-D1r9tT3J.js} +1 -1
- package/src/assets/web-panel/assets/{index-BrkJ7JPm.js → index-DT3zPSVX.js} +1 -1
- package/src/assets/web-panel/assets/index-DacrAdc-.js +1 -0
- package/src/assets/web-panel/assets/{index-BFD0cEna.js → index-De0quFDw.js} +1 -1
- package/src/assets/web-panel/assets/{index-v5HLYCVa.js → index-DoXk5KJ8.js} +1 -1
- package/src/assets/web-panel/assets/{index-DtRwLhee.js → index-DsvfrESp.js} +1 -1
- package/src/assets/web-panel/assets/{index-BgSR2WMG.js → index-Dw1PyYPm.js} +1 -1
- package/src/assets/web-panel/assets/index-EHzNJozo.js +1 -0
- package/src/assets/web-panel/assets/{index-CGvgnfl9.js → index-MtOuq2i6.js} +1 -1
- package/src/assets/web-panel/assets/{index-1LoutPJd.js → index-Puq6Luf1.js} +1 -1
- package/src/assets/web-panel/assets/{index-tND8-TDU.js → index-QIpnpZgz.js} +1 -1
- package/src/assets/web-panel/assets/{index-D3llLkYM.js → index-RMZ8a7Yt.js} +1 -1
- package/src/assets/web-panel/assets/{index-C4SN3by5.js → index-WUrJ6S1j.js} +1 -1
- package/src/assets/web-panel/assets/{index-VeHs6qH0.js → index-YjcumOZ4.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cc9aPkv-.js → index-lJBjB1QX.js} +1 -1
- package/src/assets/web-panel/assets/{index-BIYTjbv_.js → index-ukg99D1V.js} +1 -1
- package/src/assets/web-panel/assets/{index-gFjYdstW.js → index-zb7rVOhV.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-Cvt59c10.js → initDefaultProps-CYHMs1ag.js} +1 -1
- package/src/assets/web-panel/assets/{motion-D15pPEzl.js → motion-DDB2Ffk5.js} +1 -1
- package/src/assets/web-panel/assets/{move-N55KeXJ7.js → move-Bg3cD-dX.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-CyFO1bYP.js → mtc-parser-B5nedjTS.js} +1 -1
- package/src/assets/web-panel/assets/{omit-B5IXfxU2.js → omit-BHyuUILu.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-CpVqsulV.js → pickAttrs-C9YQnEN9.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-ME36sMF3.js → placementArrow-DBUFYUe7.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-BXAIR1r-.js → responsiveObserve-nBs2Obnk.js} +1 -1
- package/src/assets/web-panel/assets/{slide-BkOX3-Dp.js → slide-DkCEaXNU.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-Cy4Aklpt.js → statusUtils-aqE1Wi6U.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-gUd2T206.js → styleChecker-CN5bhfHB.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-CaVD4o99.js → useFlexGapSupport-B_oX_kvJ.js} +1 -1
- package/src/assets/web-panel/assets/{useFs--pFGl0KD.js → useFs-rCuXHeme.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-D45iP86i.js → usePersonalDataHub-DZR9Abyd.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-BayoChH_.js → vnode-ConCYQlX.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-CpP38poi.js → zoom-CUdDxG5M.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/commands/agent.js +4 -1
- package/src/commands/background-session.js +2 -1
- package/src/commands/context.js +69 -2
- package/src/data/changelog.json +13 -0
- package/src/gateways/ws/background-agent-protocol.js +38 -0
- package/src/gateways/ws/message-dispatcher.js +1 -0
- package/src/gateways/ws/remote-session-protocol.js +65 -6
- package/src/gateways/ws/ws-server.js +8 -1
- package/src/harness/feature-flags.js +15 -8
- package/src/harness/mcp-client.js +618 -43
- package/src/lazy-dispatch.js +30 -1
- package/src/lib/agent-authority.js +22 -0
- package/src/lib/agent-core.js +2 -0
- package/src/lib/agent-sandbox.js +161 -0
- package/src/lib/agent-team/team-runner.js +22 -0
- package/src/lib/artifact-store.js +35 -0
- package/src/lib/async-hook-supervisor.cjs +13 -2
- package/src/lib/audit-mtc.js +3 -2
- package/src/lib/background-agent-supervisor.js +104 -3
- package/src/lib/background-interaction-journal.js +407 -0
- package/src/lib/background-interaction-resolver.js +23 -34
- package/src/lib/background-session-transport.js +12 -2
- package/src/lib/capability-manifest.js +41 -3
- package/src/lib/capability-negotiation.js +1 -1
- package/src/lib/channels/channel-manager.js +33 -0
- package/src/lib/channels/telegram-channel.js +23 -5
- package/src/lib/channels/webhook-channel.js +38 -15
- package/src/lib/chrome-connector.js +169 -23
- package/src/lib/config-manager.js +23 -9
- package/src/lib/context-breakdown.js +31 -0
- package/src/lib/cowork-cron.js +274 -32
- package/src/lib/cross-chain-mtc.js +3 -2
- package/src/lib/durable-security-store.js +124 -0
- package/src/lib/event-runtime-host.js +67 -6
- package/src/lib/event-runtime-store.js +163 -0
- package/src/lib/goal-store.js +32 -12
- package/src/lib/headless-manifest.js +2 -1
- package/src/lib/hook-environment.cjs +58 -0
- package/src/lib/hook-manager.js +12 -5
- package/src/lib/hook-runner.cjs +122 -28
- package/src/lib/hook-runner.js +1 -0
- package/src/lib/hooks-v2-producers.js +36 -0
- package/src/lib/hooks-v2-runtime.js +329 -52
- package/src/lib/interaction-adapter.js +60 -19
- package/src/lib/interaction-binding.js +64 -0
- package/src/lib/json-schema-output.js +439 -14
- package/src/lib/json-schema-validate.js +514 -883
- package/src/lib/lan-pairing-tokens.js +115 -57
- package/src/lib/lsp/__tests__/lsp-client.test.js +32 -0
- package/src/lib/lsp/__tests__/lsp-manager.test.js +25 -0
- package/src/lib/lsp/lsp-client.js +4 -0
- package/src/lib/lsp/lsp-manager.js +3 -0
- package/src/lib/lsp/lsp-server-registry.js +18 -0
- package/src/lib/mcp-client.js +1 -0
- package/src/lib/mcp-oauth.js +35 -21
- package/src/lib/packer/pkg-config-generator.js +1 -0
- package/src/lib/permission-decision.js +99 -0
- package/src/lib/plugin-monitor-supervisor.js +3 -0
- package/src/lib/plugin-runtime/capabilities.js +50 -0
- package/src/lib/plugin-runtime/capability-consent.js +42 -35
- package/src/lib/plugin-runtime/hooks.js +36 -9
- package/src/lib/plugin-runtime/install.js +23 -7
- package/src/lib/plugin-runtime/lsp.js +4 -0
- package/src/lib/plugin-runtime/manifest.js +50 -2
- package/src/lib/plugin-runtime/mcp.js +30 -5
- package/src/lib/plugin-runtime/monitors.js +11 -0
- package/src/lib/plugin-runtime/plugin-options.js +94 -38
- package/src/lib/plugin-runtime/policy.js +29 -2
- package/src/lib/plugin-runtime/sandbox-policy.js +84 -0
- package/src/lib/plugin-runtime/scopes.js +7 -3
- package/src/lib/plugin-runtime/trust.js +36 -31
- package/src/lib/process-execution-broker/credential-agent.js +114 -16
- package/src/lib/process-execution-broker/credential-transport-worker.js +312 -0
- package/src/lib/process-execution-broker/credential-transport.js +378 -0
- package/src/lib/process-execution-broker/index.js +408 -19
- package/src/lib/process-execution-broker/platform-sandbox.js +561 -21
- package/src/lib/process-execution-broker/windows-sandbox.ps1 +999 -0
- package/src/lib/project-mcp-trust.js +21 -26
- package/src/lib/protocol-replay.js +19 -12
- package/src/lib/settings-hooks.cjs +13 -0
- package/src/lib/skill-loader.js +83 -10
- package/src/lib/sync-credentials.js +5 -4
- package/src/lib/turn-binding.js +8 -6
- package/src/repl/agent-repl.js +113 -28
- package/src/repl/repl-turn-binding.js +5 -2
- package/src/runtime/agent-core.js +331 -26
- package/src/runtime/coding-agent-contract-shared.cjs +3 -3
- package/src/runtime/headless-runner.js +101 -4
- package/src/runtime/headless-stream.js +209 -23
- package/src/runtime/mcp-config.js +29 -17
- package/src/runtime/policies/agent-policy.js +2 -0
- package/src/workers/background-agent-worker.js +128 -13
- package/src/assets/web-panel/assets/Projects-BbgmyQnS.js +0 -1
- package/src/assets/web-panel/assets/RemoteSession-Bqk3EYSu.js +0 -4
- package/src/assets/web-panel/assets/Tasks-3bDAUz8K.js +0 -1
- package/src/assets/web-panel/assets/chat-CJ19O6Dh.js +0 -1
- package/src/assets/web-panel/assets/devWarning-BBMFnsja.js +0 -1
- package/src/assets/web-panel/assets/index-Do8JMV4N.js +0 -1
- package/src/assets/web-panel/assets/index-UYAJ6iNM.js +0 -1
package/src/assets/web-panel/assets/{PersonalDataHub-k_fSkCwL.js → PersonalDataHub-B3YrbYfD.js}
RENAMED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import{I as _,P as i,S as b,K as o,c as a,J as h,U as k,F as
|
|
2
|
-
请手动输入运行 ChainlessChain 主机上的绝对${r}目录路径(不是浏览器所在设备的路径)。该目录将由主机端直接读取;留空取消:`}function Yn(r){return typeof r!="string"||r.length===0?!1:r.startsWith("/")||/^[A-Za-z]:[\\/]/u.test(r)}async function Bt({pickDirectoryResult:r,prompt:t,title:u,directoryKind:e}){const R=await r({title:u});if(R?.status==="selected")return{...R,manual:!1};if(R?.status==="cancelled")return{status:"cancelled",path:null,manual:!1};const P=t(Vn(e));return typeof P!="string"||P.length===0?{status:"cancelled",path:null,manual:!0}:Yn(P)?{status:"selected",path:P,manual:!0}:{status:"invalid",path:null,manual:!0,reason:"HOST_ABSOLUTE_PATH_REQUIRED"}}const Qn=Object.freeze(["events","persons","places","items","topics"]);function ae(r){return Number.isFinite(r)&&r>0?r:0}function je(r){return Number.isFinite(r)&&r>0?r:null}function Re(r){return Number.isFinite(r)&&r>=0?r:null}function Gn(r){const t=r?.entityCounts;return!t||typeof t!="object"?0:Qn.reduce((u,e)=>u+ae(t[e]),0)}function se(r){const t=!!r&&typeof r=="object",u=t&&typeof r.status=="string"?r.status:"invalid",e=Gn(r),R=ae(r?.rawCount),P=ae(r?.archivedRawCount),g=ae(r?.archiveFailureCount),S=ae(r?.invalidCount),v=r?.watermarkDeferred===!0,O=typeof r?.checkpointCommitted=="boolean"?r.checkpointCommitted:null,x={archivedRawCount:P,archiveFailureCount:g,checkpointCommitted:O},U={pageBudget:je(r?.pageBudget),nextPageBudget:je(r?.nextPageBudget),scanDeferredCount:ae(r?.scanDeferredCount),watermarkLookbackMs:ae(r?.watermarkLookbackMs),collectionSinceWatermark:typeof r?.collectionSinceWatermark=="string"?r.collectionSinceWatermark:null},N={attemptCount:ae(r?.attemptCount),retryCount:ae(r?.retryCount),totalRetryDelayMs:ae(r?.totalRetryDelayMs),retryExhausted:r?.retryExhausted===!0,retryAfterMs:je(r?.retryAfterMs),rateLimitReason:typeof r?.rateLimitReason=="string"?r.rateLimitReason:null,rateLimitRemainingMinute:Re(r?.rateLimitRemainingMinute),rateLimitRemainingDay:Re(r?.rateLimitRemainingDay),sourceRequestCount:ae(r?.sourceRequestCount),sourceRequestThrottleMs:ae(r?.sourceRequestThrottleMs),sourceRequestRateLimitRemainingMinute:Re(r?.sourceRequestRateLimitRemainingMinute),sourceRequestRateLimitRemainingDay:Re(r?.sourceRequestRateLimitRemainingDay)};return t&&u==="skipped"?{kind:"skipped",level:"info",completed:!0,status:u,total:e,rawCount:R,...x,...U,...N,invalidCount:S,error:null,skipReason:r.skipReason||"NOT_READY",skipMessage:r.skipMessage||"来源当前未就绪"}:!t||u!=="ok"?{kind:"failed",level:"error",completed:!1,status:u,total:e,rawCount:R,...x,...U,...N,invalidCount:S,error:t&&typeof r.error=="string"&&r.error.trim()||(u==="invalid"?"未收到有效同步报告":`同步状态:${u}`)}:v||g>0||O===!1||S>0||R>0&&e===0?{kind:"partial",level:"warning",completed:!0,status:u,total:e,rawCount:R,...x,...U,...N,invalidCount:S,watermarkDeferred:v,error:null}:e===0?{kind:"empty",level:"info",completed:!0,status:u,total:e,rawCount:R,...x,...U,...N,invalidCount:S,error:null}:{kind:"success",level:"success",completed:!0,status:u,total:e,rawCount:R,...x,...U,...N,invalidCount:S,watermarkDeferred:v,error:null}}function Nt(r){if(!Array.isArray(r))return{level:"error",completed:!1,totalReports:0,totalEntities:0,success:0,empty:0,partial:0,skipped:0,failed:1,analyses:[]};const t=r.map(se),u={level:"success",completed:!0,totalReports:t.length,totalEntities:t.reduce((e,R)=>e+R.total,0),success:t.filter(e=>e.kind==="success").length,empty:t.filter(e=>e.kind==="empty").length,partial:t.filter(e=>e.kind==="partial").length,skipped:t.filter(e=>e.kind==="skipped").length,failed:t.filter(e=>e.kind==="failed").length,analyses:t};return u.failed>0?(u.level=u.failed===u.totalReports?"error":"warning",u.completed=!1):u.partial>0?u.level="warning":(u.skipped>0||u.success===0)&&(u.level="info"),u}function zt(r){return!Array.isArray(r)||r.length===0?null:r.find(t=>se(t).kind==="failed")||r.find(t=>se(t).kind==="partial")||r.find(t=>se(t).kind==="skipped")||r[r.length-1]}const xe=Object.freeze({"system-data-android":Object.freeze([Object.freeze({key:"contacts",label:"联系人",hint:"~767 条"}),Object.freeze({key:"apps",label:"已安装应用",hint:"~176 个"}),Object.freeze({key:"sms",label:"短信内容",hint:"~2400 条 · 高敏感",sensitive:!0}),Object.freeze({key:"calls",label:"通话记录",hint:"~18000 条 · 包含号码",sensitive:!0}),Object.freeze({key:"media",label:"媒体文件元数据",hint:"照片 / 视频 / 下载 / 文档 · 高敏感",sensitive:!0})])}),Qe=Object.freeze(Object.fromEntries(Object.entries(xe).map(([r,t])=>[r,Object.freeze(Object.fromEntries(t.map(({key:u})=>[u,!0])))])));function Ve(){return Object.fromEntries(Object.entries(Qe).map(([r,t])=>[r,{...t}]))}function Ft(r,t){const u=xe[r];if(!u)return{};const e=t?.[r]||{};return{include:Object.fromEntries(u.map(({key:P})=>[P,e[P]!==!1]))}}const Xn={__name:"AIChatWizard",props:{open:{type:Boolean,default:!1},existingAccounts:{type:Array,default:()=>[]}},emits:["update:open","registered"],setup(r,{expose:t,emit:u}){t();const e=r,R=u,P=[{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}],g=ke(),S=T(1),v=T(null),O=T(""),x=T(null),U=T(null),N=T(null),M=ne({open:!1,probe:!1,register:!1}),Y=Z(()=>P.find(E=>E.vendor===v.value)||{}),z=Z(()=>S.value===1?"选择一家 AI 服务商":S.value===2?x.value?.fallbackMode==="paste"?"在外部浏览器登录,把 cookie 粘贴到下面":"在内嵌浏览器登录,主进程自动读取 cookie":"校验并写入本地加密 vault"),B=Z(()=>{const E=U.value;return E?E.reason==="UNKNOWN_VENDOR"?"未知厂商 — 请刷新页面或重选":E.reason==="PASTE_REQUIRED"?"请先粘贴 cookie 字符串":E.missingRequired?.length?`缺关键 cookie: ${E.missingRequired.join(", ")}`:E.reason||"cookie 校验失败":""}),G=Z(()=>{const E=N.value;return E?E.reason==="REQUIRED_COOKIES_MISSING"?`缺关键 cookie: ${(E.missingRequired||[]).join(", ")}`:E.reason==="VALIDATE_COOKIE_FAILED"?"厂商拒绝该 cookie(可能已过期或被风控)":E.reason==="ADAPTER_THREW"?`Adapter 抛错: ${E.error||"网络错误"}`:E.reason==="UNKNOWN_VENDOR"?"未知厂商":E.reason||"注册失败":"未知错误"});function H(E){return e.existingAccounts.some(K=>K&&K.vendor===E)}function F(E){return e.existingAccounts.find(K=>K&&K.vendor===E)||null}function ie(E){const K=F(E);return K?K.lastHealth?K.lastHealth.ok?"ok":K.lastHealth.reason==="SPEC_VERSION_MISMATCH"?"mismatch":"fail":"unknown":null}function D(E){const K=F(E);if(!K||!K.lastHealth||K.lastHealth.ok)return"";const J=K.lastHealth.reason;return J?J==="SPEC_VERSION_MISMATCH"?"cookie 规格已升级,请重新登录":J==="ADAPTER_THREW"?"上次校验抛错,建议稍后重试":J==="COOKIE_EXPIRED"?"Cookie 已过期,请重新登录":J:"Cookie 校验失败,建议重新登录"}async function $(E){try{(await g.unregisterAichat(E))?.ok&&R("registered",{vendor:E,accountId:null,unregistered:!0})}catch(K){N.value={ok:!1,reason:K?.message||"UNREGISTER_FAILED"}}}function de(E){v.value=E}async function oe(){if(v.value){M.open=!0,x.value=null,U.value=null,O.value="";try{if(x.value=await g.openAichatLogin(v.value),!x.value?.ok)return;S.value=2}catch(E){x.value={ok:!1,reason:E?.message||"OPEN_FAILED"}}finally{M.open=!1}}}async function be(){M.probe=!0,U.value=null;try{const E=O.value.trim(),K=E||void 0;U.value=await g.probeAichatCookies(v.value,K)}catch(E){U.value={ok:!1,reason:E?.message||"PROBE_FAILED"}}finally{M.probe=!1}}async function X(){if(U.value?.ok){M.register=!0;try{N.value=await g.registerAichatVendor(v.value,U.value.cookies),S.value=3,N.value?.ok&&R("registered",{vendor:v.value,accountId:N.value.accountId})}catch(E){N.value={ok:!1,reason:E?.message||"REGISTER_FAILED"},S.value=3}finally{M.register=!1}}}function ee(){S.value=1,v.value=null,O.value="",x.value=null,U.value=null,N.value=null}function le(){ee(),R("update:open",!1)}ve(()=>e.open,E=>{E&&ee()});const fe={props:e,emit:R,vendors:P,hub:g,step:S,selectedVendor:v,cookieHeader:O,openResult:x,probeResult:U,registerResult:N,loading:M,currentVendorMeta:Y,stepDescription:z,probeFailMessage:B,registerFailMessage:G,isRegistered:H,_entry:F,healthOf:ie,healthReasonOf:D,onUnregister:$,pickVendor:de,startLoginFlow:oe,runProbe:be,runRegister:X,restartFlow:ee,resetWizard:le,ref:T,reactive:ne,computed:Z,watch:ve,get usePersonalDataHub(){return ke}};return Object.defineProperty(fe,"__isScriptSetup",{enumerable:!1,value:!0}),fe}},Zn={key:0},Jn={class:"vendor-head"},$n={class:"hint"},eo={class:"hint",style:{"margin-top":"4px"}},to={key:0,class:"hint",style:{"margin-top":"4px",color:"#ff4d4f"}},no={key:1},oo={class:"hint"},ao=["href"],ro={class:"howto"},io=["href"],lo={key:3,style:{"margin-top":"8px"}},so={key:2,class:"kv",style:{"margin-top":"4px"}},co={key:3,class:"kv",style:{"margin-top":"4px",color:"#ff4d4f"}},uo={key:2};function fo(r,t,u,e,R,P){const g=_("a-alert"),S=_("a-tag"),v=_("a-button"),O=_("a-popconfirm"),x=_("a-card"),U=_("a-col"),N=_("a-row"),M=_("a-collapse-panel"),Y=_("a-collapse"),z=_("a-textarea"),B=_("a-form-item"),G=_("a-form"),H=_("a-result"),F=_("a-space"),ie=_("a-drawer");return i(),b(ie,{open:u.open,title:"添加 AI 对话账号",placement:"right",width:640,"destroy-on-close":!0,"onUpdate:open":t[4]||(t[4]=D=>e.emit("update:open",D)),onClose:e.resetWizard},{footer:o(()=>[a(F,{style:{float:"right"}},{default:o(()=>[e.step>1&&e.step<3?(i(),b(v,{key:0,onClick:t[3]||(t[3]=D=>e.step=e.step-1)},{default:o(()=>[...t[22]||(t[22]=[l("上一步",-1)])]),_:1})):m("v-if",!0),a(v,{onClick:e.resetWizard},{default:o(()=>[...t[23]||(t[23]=[l("取消",-1)])]),_:1}),e.step===1?(i(),b(v,{key:1,type:"primary",disabled:!e.selectedVendor,loading:e.loading.open,onClick:e.startLoginFlow},{default:o(()=>[...t[24]||(t[24]=[l(" 下一步 ",-1)])]),_:1},8,["disabled","loading"])):m("v-if",!0),e.step===2&&e.openResult?.fallbackMode==="paste"?(i(),b(v,{key:2,loading:e.loading.probe,disabled:!e.cookieHeader.trim(),onClick:e.runProbe},{default:o(()=>[...t[25]||(t[25]=[l(" 检测 cookie ",-1)])]),_:1},8,["loading","disabled"])):m("v-if",!0),e.step===2&&e.openResult?.fallbackMode!=="paste"?(i(),b(v,{key:3,loading:e.loading.probe,onClick:e.runProbe},{default:o(()=>[...t[26]||(t[26]=[l(" 检测 cookie ",-1)])]),_:1},8,["loading"])):m("v-if",!0),e.step===2?(i(),b(v,{key:4,type:"primary",loading:e.loading.register,disabled:!e.probeResult?.ok,onClick:e.runRegister},{default:o(()=>[...t[27]||(t[27]=[l(" 注册 ",-1)])]),_:1},8,["loading","disabled"])):m("v-if",!0)]),_:1})]),default:o(()=>[a(g,{message:`第 ${e.step} / 3 步`,description:e.stepDescription,type:"info","show-icon":"",style:{"margin-bottom":"16px"}},null,8,["message","description"]),e.step===1?(i(),h("div",Zn,[t[10]||(t[10]=k("p",{class:"hint"}," 选择要接入的 AI 服务商。登录后将本地读取 cookie 同步对话历史;cookie 仅落本机加密文件,不上传任何云端。 ",-1)),a(N,{gutter:[12,12]},{default:o(()=>[(i(),h(V,null,re(e.vendors,D=>a(U,{xs:24,sm:12,md:8,key:D.vendor},{default:o(()=>[a(x,{size:"small",hoverable:"",class:Ht(["vendor-card",{selected:e.selectedVendor===D.vendor}]),onClick:$=>e.pickVendor(D.vendor)},{default:o(()=>[k("div",Jn,[k("strong",null,p(D.displayName),1),e.healthOf(D.vendor)==="fail"?(i(),b(S,{key:0,color:"red"},{default:o(()=>[...t[5]||(t[5]=[l("🔴 重新登录",-1)])]),_:1})):e.healthOf(D.vendor)==="mismatch"?(i(),b(S,{key:1,color:"orange"},{default:o(()=>[...t[6]||(t[6]=[l("⚠ 规格升级",-1)])]),_:1})):e.healthOf(D.vendor)==="unknown"?(i(),b(S,{key:2,color:"blue"},{default:o(()=>[...t[7]||(t[7]=[l("已接入·待巡检",-1)])]),_:1})):e.healthOf(D.vendor)==="ok"?(i(),b(S,{key:3,color:"green"},{default:o(()=>[...t[8]||(t[8]=[l("✓ 已接入",-1)])]),_:1})):m("v-if",!0)]),k("div",$n,p(D.notes),1),k("div",eo,[a(S,{color:"default"},{default:o(()=>[l(p(D.requiredCookies.length)+" 必需 cookie",1)]),_:2},1024),a(S,{color:"default"},{default:o(()=>[l("过期约 "+p(D.cookieMaxAgeHintDays)+" 天",1)]),_:2},1024)]),e.isRegistered(D.vendor)&&e.healthReasonOf(D.vendor)?(i(),h("div",to,p(e.healthReasonOf(D.vendor)),1)):m("v-if",!0),e.isRegistered(D.vendor)?(i(),h("div",{key:1,class:"vendor-actions",onClick:t[0]||(t[0]=Kt(()=>{},["stop"]))},[a(O,{title:"注销该 AI 对话来源?历史事件仍可在 vault 中查询。","ok-text":"注销","cancel-text":"取消",onConfirm:$=>e.onUnregister(D.vendor)},{default:o(()=>[a(v,{size:"small",type:"text",danger:""},{default:o(()=>[...t[9]||(t[9]=[l("注销",-1)])]),_:1})]),_:1},8,["onConfirm"])])):m("v-if",!0)]),_:2},1032,["class","onClick"])]),_:2},1024)),64))]),_:1})])):m("v-if",!0),e.step===2&&e.openResult?(i(),h("div",no,[k("p",oo,[k("strong",null,p(e.currentVendorMeta.displayName),1),t[11]||(t[11]=l(" · ",-1)),k("a",{href:e.openResult.loginUrl,target:"_blank",rel:"noopener noreferrer"},p(e.openResult.loginUrl),9,ao)]),e.openResult.fallbackMode==="paste"?(i(),b(g,{key:0,message:e.openResult.helpText||"请在外部浏览器登录后从开发者工具复制全部 cookie 字符串粘贴到下方。",type:"warning","show-icon":"",style:{"margin-bottom":"12px"}},null,8,["message"])):(i(),b(g,{key:1,message:"桌面端:请在弹出的内嵌浏览器窗口登录后点击 “检测 cookie”。",type:"info","show-icon":"",style:{"margin-bottom":"12px"}})),e.openResult.fallbackMode==="paste"?(i(),b(Y,{key:2,bordered:!1,style:{"margin-bottom":"12px"}},{default:o(()=>[a(M,{key:"howto",header:"如何获取 cookie 字符串?"},{default:o(()=>[k("ol",ro,[k("li",null,[t[12]||(t[12]=l("用 Chrome / Edge 打开 ",-1)),k("a",{href:e.openResult.loginUrl,target:"_blank"},p(e.openResult.loginUrl),9,io)]),t[13]||(t[13]=k("li",null,"完成登录,进入对话页",-1)),t[14]||(t[14]=k("li",null,[l("按 "),k("kbd",null,"F12"),l(" 打开开发者工具 → "),k("strong",null,"Application"),l(" → "),k("strong",null,"Cookies")],-1)),t[15]||(t[15]=k("li",null,"选中域名 → 全选所有 cookie 行 → 用扩展(如 EditThisCookie)导出 “name=value; …” 串",-1)),t[16]||(t[16]=k("li",null,[l("或在 Console 执行 "),k("code",null,"document.cookie"),l(" 复制结果(注意:HTTP-Only cookie 取不到,仍需 Application 面板)")],-1)),t[17]||(t[17]=k("li",null,"粘贴到下方文本框,点 “检测 cookie”",-1))])]),_:1})]),_:1})):m("v-if",!0),a(G,{layout:"vertical"},{default:o(()=>[a(B,{label:"Cookie 字符串"},{default:o(()=>[a(z,{value:e.cookieHeader,"onUpdate:value":t[1]||(t[1]=D=>e.cookieHeader=D),rows:6,placeholder:"name1=value1; name2=value2; name3=value3 …",autocomplete:"off"},null,8,["value"])]),_:1})]),_:1}),e.probeResult?(i(),h("div",lo,[e.probeResult.ok?(i(),b(g,{key:0,type:"success","show-icon":"",message:`已识别 ${e.probeResult.foundRequired.length} 个必需 cookie + ${e.probeResult.foundOptional.length} 个可选 cookie`},null,8,["message"])):(i(),b(g,{key:1,type:"error","show-icon":"",message:e.probeFailMessage},null,8,["message"])),e.probeResult.foundRequired?.length?(i(),h("div",so," ✓ "+p(e.probeResult.foundRequired.join(", ")),1)):m("v-if",!0),e.probeResult.missingRequired?.length?(i(),h("div",co," 缺失: "+p(e.probeResult.missingRequired.join(", ")),1)):m("v-if",!0)])):m("v-if",!0)])):m("v-if",!0),e.step===3?(i(),h("div",uo,[e.registerResult?.ok?(i(),b(H,{key:0,status:"success",title:`${e.currentVendorMeta.displayName} 已接入`,"sub-title":`accountId: ${e.registerResult.accountId} · userId: ${e.registerResult.validation?.userId||"匿名"}`},{extra:o(()=>[a(v,{type:"primary",onClick:e.resetWizard},{default:o(()=>[...t[18]||(t[18]=[l("完成",-1)])]),_:1}),a(v,{onClick:e.restartFlow},{default:o(()=>[...t[19]||(t[19]=[l("再加一家",-1)])]),_:1})]),_:1},8,["title","sub-title"])):(i(),b(H,{key:1,status:"error",title:"接入失败","sub-title":e.registerFailMessage},{extra:o(()=>[a(v,{type:"primary",onClick:t[2]||(t[2]=D=>e.step=2)},{default:o(()=>[...t[20]||(t[20]=[l("返回粘贴 cookie",-1)])]),_:1}),a(v,{onClick:e.restartFlow},{default:o(()=>[...t[21]||(t[21]=[l("选其他厂商",-1)])]),_:1})]),_:1},8,["sub-title"]))])):m("v-if",!0)]),_:1},8,["open"])}const po=Le(Xn,[["render",fo],["__scopeId","data-v-4ed94be5"],["__file","/tmp/cc-web-panel-9tmCqb/repo/packages/web-panel/src/components/AIChatWizard.vue"]]),mo={__name:"PdhOAuthCollectorDrawer",props:{open:{type:Boolean,default:!1},source:{type:Object,default:null}},emits:["update:open","collect"],setup(r,{expose:t,emit:u}){t();const e=r,R=u,P=ne({accessToken:"",accountId:"",dir:"",driveId:"",parentId:"0",appId:"",appKey:"",recursive:!0}),g=Z(()=>Pe(e.source)),S=Z(()=>e.source?.name==="doc-baidu-netdisk"?"百度网盘 OAuth 采集":e.source?.name==="doc-wps"?"WPS OAuth 采集":"OAuth 授权采集"),v=Z(()=>qe(e.source,P)!==null);function O(){P.accessToken="",P.accountId="",P.dir="",P.driveId="",P.parentId="0",P.appId="",P.appKey="",P.recursive=!0}function x(){O(),R("update:open",!1)}function U(){const M=qe(e.source,P);if(!M)return;const Y=e.source.name;O(),R("update:open",!1),R("collect",{name:Y,options:M})}ve(()=>[e.open,e.source?.name],([M])=>{M&&O()}),Ct(O);const N={props:e,emit:R,form:P,spec:g,title:S,canSubmit:v,resetForm:O,close:x,submit:U,computed:Z,onBeforeUnmount:Ct,reactive:ne,watch:ve,get oauthCollectionOptions(){return qe},get oauthCollectionSpec(){return Pe}};return Object.defineProperty(N,"__isScriptSetup",{enumerable:!1,value:!0}),N}};function yo(r,t,u,e,R,P){const g=_("a-alert"),S=_("a-input-password"),v=_("a-input"),O=_("a-form-item"),x=_("a-checkbox"),U=_("a-form"),N=_("a-empty"),M=_("a-button"),Y=_("a-space"),z=_("a-drawer");return i(),b(z,{open:u.open,title:e.title,placement:"right",width:"520","destroy-on-close":!0,onClose:e.close},{footer:o(()=>[a(Y,null,{default:o(()=>[a(M,{onClick:e.close},{default:o(()=>[...t[2]||(t[2]=[l("取消",-1)])]),_:1}),a(M,{type:"primary",disabled:!e.canSubmit,onClick:e.submit},{default:o(()=>[...t[3]||(t[3]=[l(" 开始采集 ",-1)])]),_:1},8,["disabled"])]),_:1})]),default:o(()=>[a(g,{type:"info","show-icon":"",message:"凭据仅用于本次官方 API 采集",description:"access token 与 App Key 不会写入本地配置、数据中台、审计日志或同步水位。提交后表单会立即清空。",style:{"margin-bottom":"16px"}}),e.spec?(i(),b(U,{key:0,layout:"vertical",model:e.form},{default:o(()=>[(i(!0),h(V,null,re(e.spec.fields,B=>(i(),b(O,{key:B.key,label:B.label,required:B.required===!0},{default:o(()=>[B.secret?(i(),b(S,{key:0,value:e.form[B.key],"onUpdate:value":G=>e.form[B.key]=G,"data-field":B.key,placeholder:B.placeholder,autocomplete:"new-password",spellcheck:!1},null,8,["value","onUpdate:value","data-field","placeholder"])):(i(),b(v,{key:1,value:e.form[B.key],"onUpdate:value":G=>e.form[B.key]=G,"data-field":B.key,placeholder:B.placeholder,autocomplete:"off",spellcheck:!1},null,8,["value","onUpdate:value","data-field","placeholder"]))]),_:2},1032,["label","required"]))),128)),a(O,{label:"扫描范围"},{default:o(()=>[a(x,{checked:e.form.recursive,"onUpdate:checked":t[0]||(t[0]=B=>e.form.recursive=B)},{default:o(()=>[...t[1]||(t[1]=[l(" 递归采集子目录 ",-1)])]),_:1},8,["checked"])]),_:1}),u.source?.name==="doc-wps"?(i(),b(g,{key:0,type:"warning","show-icon":"",message:"App ID 与 App Key 必须同时填写或同时留空"})):m("v-if",!0)]),_:1},8,["model"])):(i(),b(N,{key:1,description:"该来源没有可用的 OAuth 采集配置"}))]),_:1},8,["open","title"])}const go=Le(mo,[["render",yo],["__file","/tmp/cc-web-panel-9tmCqb/repo/packages/web-panel/src/components/PdhOAuthCollectorDrawer.vue"]]),vo={__name:"WechatWizard",props:{open:{type:Boolean,default:!1}},emits:["update:open","registered"],setup(r,{expose:t,emit:u}){t();const e=r,R=u,P=ke(),g=T(1),S=T(null),v=ne({uin:"",dbPath:"",wechatDataPath:"",forceProvider:null}),O=T(null),x=ne({probe:!1,register:!1}),U=Z(()=>g.value===1?"探测设备 + WeChat 版本,确认可用的 keyProvider":g.value===2?"填 UIN 与已 adb-pull 的本地路径":"bootstrap 注册 + 持久化 wechat-accounts.json"),N=Z(()=>{const H=O.value;return H?H.reason==="ENV_UNSUPPORTED"?H.message||"env-probe 拒绝 — 请回到第 1 步看 reasons":H.reason==="MD5_NEEDS_WECHAT_DATA_PATH"?"MD5 路径需要 wechatDataPath":H.reason==="FRIDA_NEEDS_WXID"?"Frida 路径需要 account.uin / wxid":H.reason==="ADAPTER_CTOR_FAILED"?`Adapter ctor 抛错: ${H.message||""}`:H.reason==="BOOTSTRAP_THREW"?`Bootstrap 抛错: ${H.message||""}`:H.reason==="UIN_REQUIRED"?"UIN 不能为空":H.message||H.reason||"注册失败":"未知错误"});async function M(){x.probe=!0;try{S.value=await P.probeWechatEnv()}catch(H){S.value={ok:!1,suggestedKeyProvider:"unsupported",reasons:[H?.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 Y(){x.register=!0;try{O.value=await P.registerWechat({account:{uin:v.uin},dbPath:v.dbPath||null,wechatDataPath:v.wechatDataPath||null,keyProviderOverride:v.forceProvider}),g.value=3,O.value?.ok&&R("registered",{uin:v.uin,chosenKeyProvider:O.value.chosenKeyProvider})}catch(H){O.value={ok:!1,reason:"BOOTSTRAP_THREW",message:H?.message||"RPC failed"},g.value=3}finally{x.register=!1}}function z(){g.value=1,S.value=null,v.uin="",v.dbPath="",v.wechatDataPath="",v.forceProvider=null,O.value=null}function B(){z(),R("update:open",!1)}ve(()=>e.open,H=>{H&&z()});const G={props:e,emit:R,hub:P,step:g,probe:S,form:v,registerResult:O,loading:x,stepDescription:U,registerFailMessage:N,runProbe:M,runRegister:Y,restartFlow:z,resetWizard:B,ref:T,reactive:ne,computed:Z,watch:ve,get usePersonalDataHub(){return ke}};return Object.defineProperty(G,"__isScriptSetup",{enumerable:!1,value:!0}),G}},ko={key:0},_o={key:0,class:"probe-result"},bo={key:0,class:"kv"},ho={key:0,class:"kv"},Ao={key:1},Oo={key:2},Co={key:2,style:{"margin-top":"12px"}};function wo(r,t,u,e,R,P){const g=_("a-alert"),S=_("a-button"),v=_("a-tag"),O=_("a-descriptions-item"),x=_("a-descriptions"),U=_("a-input"),N=_("a-form-item"),M=_("a-radio"),Y=_("a-radio-group"),z=_("a-form"),B=_("a-result"),G=_("a-space"),H=_("a-drawer");return i(),b(H,{open:u.open,title:"添加 WeChat 账号",placement:"right",width:640,"destroy-on-close":!0,"onUpdate:open":t[8]||(t[8]=F=>e.emit("update:open",F)),onClose:e.resetWizard},{footer:o(()=>[a(G,{style:{float:"right"}},{default:o(()=>[e.step>1&&e.step<3?(i(),b(S,{key:0,onClick:t[6]||(t[6]=F=>e.step=e.step-1)},{default:o(()=>[...t[21]||(t[21]=[l("上一步",-1)])]),_:1})):m("v-if",!0),a(S,{onClick:e.resetWizard},{default:o(()=>[...t[22]||(t[22]=[l("取消",-1)])]),_:1}),e.step===1?(i(),b(S,{key:1,type:"primary",disabled:!e.probe||e.probe.suggestedKeyProvider==="unsupported",onClick:t[7]||(t[7]=F=>e.step=2)},{default:o(()=>[...t[23]||(t[23]=[l(" 下一步 ",-1)])]),_:1},8,["disabled"])):m("v-if",!0),e.step===2?(i(),b(S,{key:2,type:"primary",loading:e.loading.register,disabled:!e.form.uin||e.probe?.suggestedKeyProvider==="md5"&&!e.form.wechatDataPath,onClick:e.runRegister},{default:o(()=>[...t[24]||(t[24]=[l(" 注册 ",-1)])]),_:1},8,["loading","disabled"])):m("v-if",!0)]),_:1})]),default:o(()=>[a(g,{message:`第 ${e.step} / 3 步`,description:e.stepDescription,type:"info","show-icon":"",style:{"margin-bottom":"16px"}},null,8,["message","description"]),e.step===1?(i(),h("div",ko,[t[11]||(t[11]=k("p",{class:"hint"},[l(" 请用 USB 连接 Android 设备(开启 USB 调试)。WeChat ≥ 8.0 需要 root + frida-server。 探测仅读取 "),k("code",null,"adb shell"),l(" 命令输出,不写入任何东西。 ")],-1)),a(S,{type:"primary",loading:e.loading.probe,onClick:e.runProbe,style:{"margin-bottom":"12px"}},{default:o(()=>[...t[9]||(t[9]=[l(" 🔍 探测环境 ",-1)])]),_:1},8,["loading"]),e.probe?(i(),h("div",_o,[a(x,{column:1,size:"small",bordered:""},{default:o(()=>[a(O,{label:"suggestedKeyProvider"},{default:o(()=>[a(v,{color:e.probe.suggestedKeyProvider==="unsupported"?"red":"green"},{default:o(()=>[l(p(e.probe.suggestedKeyProvider),1)]),_:1},8,["color"])]),_:1}),a(O,{label:"adb 设备"},{default:o(()=>[a(v,{color:e.probe.device.reachable?"green":"red"},{default:o(()=>[l(p(e.probe.device.reachable?"已连接":"未连接"),1)]),_:1},8,["color"]),e.probe.device.serial?(i(),h("span",bo,p(e.probe.device.serial)+" · abi="+p(e.probe.device.abi||"?"),1)):m("v-if",!0)]),_:1}),a(O,{label:"root"},{default:o(()=>[a(v,{color:e.probe.root.detected?"green":"default"},{default:o(()=>[l(p(e.probe.root.detected?"已 root":"未 root"),1)]),_:1},8,["color"]),e.probe.root.magiskInstalled?(i(),b(v,{key:0,color:"blue"},{default:o(()=>[...t[10]||(t[10]=[l("Magisk",-1)])]),_:1})):m("v-if",!0)]),_:1}),a(O,{label:"frida-server"},{default:o(()=>[a(v,{color:e.probe.frida.serverRunning?"green":"default"},{default:o(()=>[l(p(e.probe.frida.serverRunning?"运行中":"未运行"),1)]),_:1},8,["color"]),e.probe.frida.port?(i(),h("span",ho," :"+p(e.probe.frida.port),1)):m("v-if",!0)]),_:1}),a(O,{label:"WeChat"},{default:o(()=>[a(v,{color:e.probe.wechat.installed?"green":"red"},{default:o(()=>[l(p(e.probe.wechat.installed?e.probe.wechat.versionName:"未安装"),1)]),_:1},8,["color"])]),_:1})]),_:1}),(i(!0),h(V,null,re(e.probe.reasons||[],F=>(i(),b(g,{key:F,message:F,type:"info","show-icon":"",style:{"margin-top":"8px"}},null,8,["message"]))),128)),(i(!0),h(V,null,re(e.probe.warnings||[],F=>(i(),b(g,{key:F,message:F,type:"warning","show-icon":"",style:{"margin-top":"8px"}},null,8,["message"]))),128))])):m("v-if",!0)])):m("v-if",!0),e.step===2?(i(),h("div",Ao,[t[16]||(t[16]=k("p",{class:"hint"},[l(" 填写从 adb pull 拉下来的本地路径。MD5 路径(7.x)需要 "),k("code",null,"wechatDataPath"),l("; Frida 路径(8.0+)需要设备运行 frida-server。 ")],-1)),a(z,{layout:"vertical"},{default:o(()=>[a(N,{label:"UIN / wxid",required:""},{default:o(()=>[a(U,{value:e.form.uin,"onUpdate:value":t[0]||(t[0]=F=>e.form.uin=F),placeholder:"WeChat 数字 UIN 或 wxid"},null,8,["value"])]),_:1}),a(N,{label:"dbPath(已拉下的 EnMicroMsg.db 本地路径)"},{default:o(()=>[a(U,{value:e.form.dbPath,"onUpdate:value":t[1]||(t[1]=F=>e.form.dbPath=F),placeholder:"C:\\\\users\\\\me\\\\pull\\\\EnMicroMsg.db"},null,8,["value"])]),_:1}),a(N,{label:"wechatDataPath(已拉下的 /data/data/com.tencent.mm/ 目录)"},{default:o(()=>[a(U,{value:e.form.wechatDataPath,"onUpdate:value":t[2]||(t[2]=F=>e.form.wechatDataPath=F),placeholder:"C:\\\\users\\\\me\\\\pull\\\\com.tencent.mm"},null,8,["value"]),t[12]||(t[12]=k("div",{class:"hint"},"MD5 路径必填;Frida 路径可空",-1))]),_:1}),a(N,{label:"强制 keyProvider(覆盖 env-probe 建议)"},{default:o(()=>[a(Y,{value:e.form.forceProvider,"onUpdate:value":t[3]||(t[3]=F=>e.form.forceProvider=F)},{default:o(()=>[a(M,{value:null},{default:o(()=>[...t[13]||(t[13]=[l("自动(推荐)",-1)])]),_:1}),a(M,{value:"md5"},{default:o(()=>[...t[14]||(t[14]=[l("md5",-1)])]),_:1}),a(M,{value:"frida"},{default:o(()=>[...t[15]||(t[15]=[l("frida",-1)])]),_:1})]),_:1},8,["value"])]),_:1})]),_:1})])):m("v-if",!0),e.step===3?(i(),h("div",Oo,[e.registerResult?.ok?(i(),b(B,{key:0,status:"success",title:`WeChat 已接入 (uin=${e.form.uin})`,"sub-title":`provider=${e.registerResult.chosenKeyProvider} · sensitivity=${e.registerResult.sensitivity}`},{extra:o(()=>[a(S,{type:"primary",onClick:e.resetWizard},{default:o(()=>[...t[17]||(t[17]=[l("完成",-1)])]),_:1}),a(S,{onClick:e.restartFlow},{default:o(()=>[...t[18]||(t[18]=[l("再加一个",-1)])]),_:1})]),_:1},8,["title","sub-title"])):(i(),b(B,{key:1,status:"error",title:"接入失败","sub-title":e.registerFailMessage},In({_:2},[e.registerResult?.probe?.reasons?.length?{name:"extra",fn:o(()=>[a(S,{onClick:t[4]||(t[4]=F=>e.step=1)},{default:o(()=>[...t[19]||(t[19]=[l("返回检查环境",-1)])]),_:1}),a(S,{onClick:t[5]||(t[5]=F=>e.step=2)},{default:o(()=>[...t[20]||(t[20]=[l("返回修改路径",-1)])]),_:1})]),key:"0"}:void 0]),1032,["sub-title"])),e.registerResult?.probe?.reasons?.length?(i(),h("div",Co,[(i(!0),h(V,null,re(e.registerResult.probe.reasons,F=>(i(),b(g,{key:F,message:F,type:"warning","show-icon":"",style:{"margin-bottom":"4px"}},null,8,["message"]))),128))])):m("v-if",!0)])):m("v-if",!0)]),_:1},8,["open"])}const So=Le(vo,[["render",wo],["__scopeId","data-v-2f50c8a7"],["__file","/tmp/cc-web-panel-9tmCqb/repo/packages/web-panel/src/components/WechatWizard.vue"]]),Ye="pdh.syncIncludeOptions.v1",Io={__name:"PersonalDataHub",setup(r,{expose:t}){const u=ke(),e=T(null),R=T(null),P=T([]),g=T({}),S=T(""),v=T(null),O=T(""),x=T(!1),U=T(!1),N=T([]),M=T(null);function Y(){try{const n=localStorage.getItem(Ye);if(!n)return Ve();const c=JSON.parse(n);return{"system-data-android":{...Qe["system-data-android"],...c["system-data-android"]||{}}}}catch{return Ve()}}const z=ne(Y());function B(){try{localStorage.setItem(Ye,JSON.stringify(z)),console.log("[PDH-include] persisted:",JSON.stringify(z))}catch(n){console.warn("[PDH-include] persist failed:",n&&n.message)}}const G=T({});function H(n){return Object.prototype.hasOwnProperty.call(xe,n)}function F(n,c,d){const f=d&&d.target?!!d.target.checked:!!d;console.log("[PDH-include] toggle",n,c,"=>",f),z[n]||(z[n]={}),z[n][c]=f,B()}const ie=T(!1),D=ne({provider:"qq",email:"",authCode:"",host:"",port:993,pdfPasswordHints:{idCardLast6:"",phoneLast6:"",cardLast6:""}}),$=T(null),de=T(!1),oe=T(null),be=T([]),X=T(!1),ee=T(null),le=T(null),fe=[{name:"analysis.spending",label:"消费分析",icon:St,description:"总支出 / 商家排行 / 月度趋势"},{name:"analysis.relations",label:"人际关系",icon:It,description:"与每个人的互动频率 / 主动比例"},{name:"analysis.footprint",label:"足迹",icon:Dt,description:"常去地点 / 出行模式"},{name:"analysis.interests",label:"兴趣画像",icon:Et,description:"从购买 / 浏览 / 收藏抽兴趣"},{name:"analysis.timeline",label:"时间线",icon:Rt,description:"跨源事件串成故事"}],E=T(!1),K=T([]),J=ne({queue:{pending:0},mergeGroups:0,reviewQueue:0}),Ue=T(!1),Ce=T([]);function we(n){n?.unregistered?y.success(`已注销 ${n.vendor}`):y.success(`已接入 ${n.vendor}`),q()}const Se=T(!1);function Me(n){y.success(`WeChat 已接入 (uin=${n.uin}, provider=${n.chosenKeyProvider})`),q()}const Be=T(!1),s=ne({email:"",zipPassword:"",filePath:""}),C=T(null),w=ne({active:!1,batchMode:!1,adapter:"",phase:"",mailbox:"",current:0,total:0,attempt:1,errorMessage:""}),A=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,bilibiliAdbSync:!1,bilibiliAdbDoctor:!1,douyinAdbSync:!1,weiboAdbSync:!1,xhsAdbSync:!1,toutiaoAdbSync:!1,kuaishouAdbSync:!1,bridgeDoctor:!1}),Ge=T(null);function Ne(n){switch(n){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 Xe(n){switch(n){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 Ze(n){switch(n){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 Je(n){switch(n){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 $e(){if(!A.xhsAdbSync){A.xhsAdbSync=!0;try{const n=await u.xhsAdbSync({});if(!n||!n.ok){const I=n&&n.reason||"SYNC_FAILED",L=Je(I),j=n&&n.message||"";y.error({content:`Xhs ADB 同步失败:${L}`,description:j,duration:8});return}const c=n.report||{},d=c.xhs||{},f=d.eventCounts||{};d.meFetchFailed?y.warning({content:"Xhs 同步未拉到 user_id — /user/me 返空 data",description:`lastErrorCode=${d.lastErrorCode}, ${d.lastErrorMessage||""}。可能 cookie 已过期或 web_session 缺失,请在手机重新登录。`,duration:10}):d.lastErrorCode===461?y.warning({content:"Xhs X-S 签名被拒 (461) — 部分接口未抓到",description:`命中 ${f.total||0} events。我们的 X-S 算法 best-effort (~60% GET / <30% POST hit),461 在 POST 较常见。稍后重试 (X-S 算法可能 4-8 周 rotate)。`,duration:10}):d.lastErrorCode?y.warning({content:`Xhs 同步部分完成 (${f.total||0} events)`,description:`lastErrorCode=${d.lastErrorCode}, ${d.lastErrorMessage||""}`,duration:8}):y.success(`Xhs 同步成功:notes=${f.note||0} / liked=${f.liked||0} / follow=${f.follow||0} (total=${f.total||0})${d.nickname?" ["+d.nickname+"]":""}`),M.value=c,q()}catch(n){y.error({content:"Xhs ADB 同步异常",description:n&&n.message?n.message:String(n),duration:8})}finally{A.xhsAdbSync=!1}}}function et(n){switch(n){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 tt(){if(!A.toutiaoAdbSync){A.toutiaoAdbSync=!0;try{const n=await u.toutiaoAdbSync({});if(!n||!n.ok){const I=n&&n.reason||"SYNC_FAILED",L=et(I),j=n&&n.message||"";y.error({content:`Toutiao ADB 同步失败:${L}`,description:j,duration:8});return}const c=n.report||{},d=c.toutiao||{},f=d.eventCounts||{};d.profileFetchFailed?y.warning({content:"Toutiao 同步未拉到 user_id — passport/info/v2 返失败",description:`lastErrorCode=${d.lastErrorCode}, ${d.lastErrorMessage||""}。可能 cookie 已过期或 sessionid 缺失,请在手机重新登录。`,duration:10}):d.signProviderUsed==="none"&&f.feed===0&&f.collection===0&&f.search===0?y.warning({content:`Toutiao 同步仅获取了 profile (${f.profile||0} event)`,description:"当前 web-shell 上下文不支持 _signature 签名(仅 desktop app 提供 ToutiaoSignBridge)。打开桌面 app 同步可获取 feed / collection / search。",duration:12}):d.lastErrorCode?y.warning({content:`Toutiao 同步部分完成 (${f.total||0} events)`,description:`lastErrorCode=${d.lastErrorCode}, ${d.lastErrorMessage||""}`,duration:8}):y.success(`Toutiao 同步成功:profile=${f.profile||0} / feed=${f.feed||0} / collection=${f.collection||0} / search=${f.search||0} (total=${f.total||0})${d.nickname?" ["+d.nickname+"]":""}`),M.value=c,q()}catch(n){y.error({content:"Toutiao ADB 同步异常",description:n&&n.message?n.message:String(n),duration:8})}finally{A.toutiaoAdbSync=!1}}}function nt(n){switch(n){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 ot(){if(!A.kuaishouAdbSync){A.kuaishouAdbSync=!0;try{const n=await u.kuaishouAdbSync({});if(!n||!n.ok){const I=n&&n.reason||"SYNC_FAILED",L=nt(I),j=n&&n.message||"";y.error({content:`Kuaishou ADB 同步失败:${L}`,description:j,duration:8});return}const c=n.report||{},d=c.kuaishou||{},f=d.eventCounts||{};d.profileFetchFailed?y.warning({content:"Kuaishou 同步 cookie 缺 api_ph payload",description:`lastErrorCode=${d.lastErrorCode}, ${d.lastErrorMessage||""}。可能 cookie 已过期或登录态不完整(仅有 userId 但没有 api_ph),请在手机重新登录。`,duration:10}):d.signProviderUsed==="none"&&f.watch===0&&f.collect===0&&f.search===0?y.warning({content:`Kuaishou 同步仅获取了 profile (${f.profile||0} event)`,description:"当前 web-shell 上下文不支持 __NS_sig3 签名(仅 desktop app 提供 KuaishouSignBridge)。打开桌面 app 同步可获取 watch / collect / search。",duration:12}):d.lastErrorCode?y.warning({content:`Kuaishou 同步部分完成 (${f.total||0} events)`,description:`lastErrorCode=${d.lastErrorCode}, ${d.lastErrorMessage||""}`,duration:8}):y.success(`Kuaishou 同步成功:profile=${f.profile||0} / watch=${f.watch||0} / collect=${f.collect||0} / search=${f.search||0} (total=${f.total||0})${d.nickname?" ["+d.nickname+"]":""}`),M.value=c,q()}catch(n){y.error({content:"Kuaishou ADB 同步异常",description:n&&n.message?n.message:String(n),duration:8})}finally{A.kuaishouAdbSync=!1}}}async function qt(){if(!A.bridgeDoctor){A.bridgeDoctor=!0;try{const n=await u.bridgeDoctor();if(!n||!n.ok){const Q=n&&n.reason||"BRIDGE_DOCTOR_FAILED",te=n&&n.message||"";Q==="MODULE_LOAD_FAILED"?y.error({content:"Bridge doctor 不可用",description:"当前上下文不是 Electron desktop app(cli / web-shell-only 无 sign-bridge 模块)。请从桌面 app 运行此诊断。",duration:10}):y.error({content:`Bridge doctor 失败:${Q}`,description:te,duration:8});return}const c=n.results||{},d=["xhs","toutiao","kuaishou"],f=d.filter(Q=>c[Q]&&c[Q].anyCandidatePresent).length,I=d.length,L=[];for(const Q of d){const te=c[Q];if(!te||!te.ok){L.push(`${Q}: ✗ ${te&&te.error?te.error:"unknown error"}`);continue}const Ae=te.candidates||{},Oe=Object.keys(Ae).filter(Sn=>Ae[Sn]===!0),ge=Object.keys(Ae).length,Cn=te.anyCandidatePresent?"✓":"⚠",wn=te.anyCandidatePresent?`${Oe.length}/${ge} candidate(s): ${Oe.join(", ")}`:`0/${ge} candidates (rotation? 需更新 buildSignScript)`;L.push(`${Q}: ${Cn} ${wn} (warmUp=${te.warmUpMs}ms, probe=${te.probeMs}ms)`)}(f===I?y.success:f===0?y.error:y.warning)({content:`Bridge doctor: ${f}/${I} 平台签名可用`,description:L.join(`
|
|
3
|
-
`),duration:15}),Ge.value=n}catch(n){y.error({content:"Bridge doctor 异常",description:n&&n.message?n.message:String(n),duration:8})}finally{A.bridgeDoctor=!1}}}async function at(){if(!A.weiboAdbSync){A.weiboAdbSync=!0;try{const n=await u.weiboAdbSync({});if(!n||!n.ok){const I=n&&n.reason||"SYNC_FAILED",L=Ze(I),j=n&&n.message||"";y.error({content:`Weibo ADB 同步失败:${L}`,description:j,duration:8});return}const c=n.report||{},d=c.weibo||{},f=d.eventCounts||{};d.uidFetchFailed?y.warning({content:"Weibo 同步未拉到 UID — /api/config 返 login=false",description:`lastErrorCode=${d.lastErrorCode}, ${d.lastErrorMessage||""}。可能 cookie 已过期 (请在手机重新登录) 或微博触发 anti-bot redirect。事件数 0,未入 vault。`,duration:10}):d.lastErrorCode?y.warning({content:`Weibo 同步部分完成 (${f.total||0} events)`,description:`lastErrorCode=${d.lastErrorCode}, ${d.lastErrorMessage||""} — 部分接口受反爬限制,稍后重试可补齐`,duration:8}):y.success(`Weibo 同步成功:posts=${f.post||0} / fav=${f.favourite||0} / follow=${f.follow||0} (total=${f.total||0})`),M.value=c,q()}catch(n){y.error({content:"Weibo ADB 同步异常",description:n&&n.message?n.message:String(n),duration:8})}finally{A.weiboAdbSync=!1}}}async function rt(){if(!A.douyinAdbSync){A.douyinAdbSync=!0;try{const n=await u.douyinAdbSync({});if(!n||!n.ok){const L=n&&n.reason||"SYNC_FAILED",j=Xe(L),Q=n&&n.message||"";y.error({content:`Douyin ADB 同步失败:${j}`,description:Q,duration:8});return}const c=n.report||{},d=c.douyin||{},f=d.eventCounts||{},I=d.parserDiagnostic||{};if(!I.hadMsgTable&&!I.hadSimpleUserTable)y.warning({content:"Douyin 同步完成但 0 events",description:"msg 和 SIMPLE_USER 表都未在 IM 数据库中找到 — 抖音 App 版本可能用了不同 schema",duration:10});else if(!I.hadMsgTable||!I.hadSimpleUserTable){const L=[];I.hadMsgTable||L.push("msg (私信)"),I.hadSimpleUserTable||L.push("SIMPLE_USER (联系人)"),y.warning({content:`Douyin 部分同步:msg=${f.message||0} contacts=${f.contact||0}`,description:`${L.join("、")} 表未找到,未入库部分数据`,duration:8})}else y.success(`Douyin 同步成功:messages=${f.message||0} contacts=${f.contact||0} (total=${f.total||0})`);M.value=c,q()}catch(n){y.error({content:"Douyin ADB 同步异常",description:n&&n.message?n.message:String(n),duration:8})}finally{A.douyinAdbSync=!1}}}async function jt(){if(!A.bilibiliAdbDoctor){A.bilibiliAdbDoctor=!0;try{const n=await u.bilibiliAdbDoctor();if(!n||!n.ok){const d=n&&n.reason||"PROBE_FAILED",f=Ne(d),I=n&&n.message||"";y.error({content:`Bilibili 诊断失败:${f}`,description:I,duration:8});return}const c=n.cookieDiagnostic||{};c.hadEncrypted?y.warning({content:`Bilibili 环境就绪 (uid=${n.uid}) — 但发现 Keystore 加密 cookie`,description:`cookies 数=${c.cookieCount||"?"}; 部分行使用 Android Keystore 加密 (跳过)。可能是较新 Bilibili App + Android 14+。可继续同步,但可能数据不全。`,duration:10}):y.success(`Bilibili 环境就绪 — uid=${n.uid}, 找到 ${c.cookieCount||"?"} 个 cookie,可以同步`)}catch(n){y.error({content:"Bilibili 诊断异常",description:n&&n.message?n.message:String(n),duration:8})}finally{A.bilibiliAdbDoctor=!1}}}async function it(){if(!A.bilibiliAdbSync){A.bilibiliAdbSync=!0;try{const n=await u.bilibiliAdbSync({});if(!n||!n.ok){const I=n&&n.reason||"SYNC_FAILED",L=Ne(I),j=n&&n.message||"";y.error({content:`Bilibili ADB 同步失败:${L}`,description:j,duration:8});return}const c=n.report||{},d=c.bilibili||{},f=d.eventCounts||{};d.lastErrorCode?y.warning({content:`Bilibili 同步部分完成 (${f.total||0} events)`,description:`lastErrorCode=${d.lastErrorCode}, ${d.lastErrorMessage||""} — 部分接口受反爬限制,稍后重试可补齐`,duration:8}):y.success(`Bilibili 同步成功:history=${f.history||0} / fav=${f.favourite||0} / dyn=${f.dynamic||0} / follow=${f.follow||0} (total=${f.total||0})`),M.value=c,q()}catch(n){y.error({content:"Bilibili ADB 同步异常",description:n&&n.message?n.message:String(n),duration:8})}finally{A.bilibiliAdbSync=!1}}}const Vt=[{title:"名称",dataIndex:"name",key:"name",width:140},{title:"版本",dataIndex:"version",key:"version",width:70},{title:"就绪状态",key:"readiness",width:220},{title:"能力",key:"capabilities"},{title:"敏感度",key:"sensitivity",width:140},{title:"操作",key:"actions",width:160,align:"right"}];function ze(n){return g.value[n]||null}function Ie(n){const c=P.value.find(f=>f.name===n)||{},d=ze(n)||{};return{...c,...d,name:n,capabilities:d.capabilities||c.capabilities||[]}}const pe=T(!1),De=T(null);function Fe(n){De.value=Ie(n),pe.value=!0}async function Yt(){const n=De.value?.name;await q(),n&&(De.value=Ie(n))}const lt={ready:"green",needs_setup:"orange",unavailable:"default",error:"red"};function Qt(n){return lt[n]||"default"}const st={ready:"可采集",needs_setup:"待配置",unavailable:"不支持",error:"异常"};function Gt(n){return n?st[n.status]||n.status:"检测中"}const dt={local:"本机直采",snapshot:"需手机采集",device:"需 root/本地解密",credential:"需登录授权",platform:"平台限制"};function Xt(n){return dt[n]||n||""}const ct=new Set(["wechat-pc","qq-pc","dingtalk-pc","feishu-pc","messaging-whatsapp"]),ut=new Set(["alipay-bill"]),ft=Object.freeze({"social-bilibili":it,"social-weibo":at,"social-douyin":rt,"social-xiaohongshu":$e,"social-toutiao":tt,"social-kuaishou":ot});function pt(n){return _e(n)}function Zt(n){return Tt(n)}function Jt(n){return xt(n)}function $t(n){return Lt(n)}async function en(n){const c=Ie(n),d=pt(c);if(d==="file"){const f=await u.pickFile({title:`选择 ${c&&c.guide?c.guide.displayName:n} 的数据文件`});if(!f){y.info("已取消选择文件");return}let I,L;ct.has(n)?I=window.prompt("如数据库已解密为明文,直接确定即可;若为加密库,请粘贴密钥或输入密钥文件路径:")||void 0:ut.has(n)&&/\.zip$/i.test(f)&&(L=window.prompt("请输入支付宝账单 ZIP 密码;如该 ZIP 未加密可直接确定:")||void 0),await mt(n,f,{key:I,zipPassword:L})}else if(d==="directory"){const f=Array.isArray(c?.capabilities)?c.capabilities:[],I=f.includes("sync:scan-directory"),L=!I&&f.includes("sync:profile-directory"),j=I?"扫描":L?"配置":"导出",Q=await Bt({pickDirectoryResult:ge=>u.pickDirectoryResult(ge),prompt:ge=>window.prompt(ge),title:`选择 ${c&&c.guide?c.guide.displayName:n} 的本地${j}目录`,directoryKind:j});if(Q.status==="cancelled"){y.info(Q.manual?"已取消输入主机目录":"已取消选择目录");return}if(Q.status==="invalid"){y.warning("请输入 ChainlessChain 主机上的绝对目录路径;相对路径不会用于采集");return}const te=Q.path;Q.manual&&y.info("将从运行 ChainlessChain 的主机读取手工指定目录");const Ae=L||I?null:(window.prompt("请输入一个稳定的本地账号标识,用于隔离同步水位(原文不会写入数据中台):")||"").trim(),Oe=Mt(c,te,Ae);if(!Oe){y.info("已取消:需要本地账号标识才能安全隔离同步水位");return}await yt(n,Oe)}else if(d==="cookie"){const f=window.prompt("粘贴登录态 Cookie(在已登录的网页 DevTools → Application → Cookies 复制,或整条 Cookie 请求头):");if(!f||!f.trim()){y.info("已取消");return}const I=window.prompt("输入该平台账号的稳定标识(若接口需要用户名/UID,请填写真实平台标识;否则可用本地别名。只会持久化其哈希同步水位):");if(!I||!I.trim()){y.info("已取消:需要账号标识才能安全隔离同步水位");return}let L;if(Te(c)&&(L=window.prompt("粘贴本次授权会话中捕获的滴滴订单接口 HTTPS URL(仅允许 xiaojukeji.com 官方域名,不会保存):"),!L||!L.trim())){y.info("已取消:该数据源需要本次使用的 HTTPS 订单接口");return}const j=Ut(c,f,I,L);if(!j){y.error("采集参数无效:请检查 Cookie、账号标识和 HTTPS 接口");return}await He(n,j)}else if(d==="oauth")ee.value=c,X.value=!0;else if(d==="adb"){const f=ft[n];if(!f){Fe(n);return}A.sync[n]=!0;try{await f()}finally{A.sync[n]=!1}}else d==="sync"?(await vt(n))?.completed&&(pe.value=!1):Fe(n)}async function tn({name:n,options:c}){await He(n,c)}async function He(n,c){A.sync[n]=!0,me(n);try{let d;typeof u.syncAdapterStream=="function"?d=await u.syncAdapterStream(n,c,ye):d=await u.syncAdapter(n,c),he(n,d,"采集").completed&&(pe.value=!1),await q()}catch(d){y.error(`采集 ${n} 失败: ${d.message}`)}finally{A.sync[n]=!1,w.active=!1}}async function mt(n,c,d={}){A.sync[n]=!0,me(n);try{const f={inputPath:c};d.key&&(f.key=d.key),d.zipPassword&&(f.zipPassword=d.zipPassword);let I;typeof u.syncAdapterStream=="function"?I=await u.syncAdapterStream(n,f,ye):I=await u.syncAdapter(n,f),he(n,I,"采集").completed&&(pe.value=!1),await q()}catch(f){y.error(`采集 ${n} 失败: ${f.message}`)}finally{A.sync[n]=!1,w.active=!1}}async function yt(n,c){A.sync[n]=!0,me(n);try{const d={...c};let f;typeof u.syncAdapterStream=="function"?f=await u.syncAdapterStream(n,d,ye):f=await u.syncAdapter(n,d),he(n,f,"采集").completed&&(pe.value=!1),await q()}catch(d){y.error(`采集 ${n} 失败: ${d.message}`)}finally{A.sync[n]=!1,w.active=!1}}const nn=Z(()=>{const n=P.value||[];if(!n.length)return null;let c=0;for(const d of n){const f=ze(d.name);f&&f.ready&&(c+=1)}return{ready:c,total:n.length}}),on=[{title:"时间",key:"at",dataIndex:"at",width:170},{title:"动作",dataIndex:"action",key:"action",width:200},{title:"详情",key:"details"}],an=[{title:"日期",key:"occurredAt",width:100},{title:"描述",dataIndex:"description",key:"description"},{title:"金额",key:"amount",width:140,align:"right"}];function rn(n){return n==="high"?"red":n==="medium"?"orange":"default"}function ln(n){if(!n)return"";if(n.status==="skipped")return`${n.skipReason||"NOT_READY"}:${n.skipMessage||"来源当前未就绪"}`;const c=n.entityCounts||{},d=`events=${c.events??0} persons=${c.persons??0} places=${c.places??0} items=${c.items??0} topics=${c.topics??0} | raw=${n.rawCount??0} invalid=${n.invalidCount??0} | KG triples=${n.kgTripleCount??0} RAG docs=${n.ragDocCount??0} | ${n.durationMs??0}ms`;return n.error?`${d} · 错误: ${n.error}`:d}function sn(n){return se(n).level}function dn(n){const c=se(n),d=n?.adapter||"未知来源",f={success:"成功",empty:"无新数据",partial:"部分有效",skipped:"已跳过",failed:"失败"}[c.kind];return`同步 ${d}: ${f}`}function he(n,c,d="同步"){const f=c&&typeof c=="object"?c:{adapter:n,status:"error",rawCount:0,invalidCount:0,entityCounts:{},error:"未收到有效同步报告"};M.value=f;const I=se(f),L=f.adapter||n;if(I.kind==="failed")y.error(`${d} ${L} 失败:${I.error}`);else if(I.kind==="skipped")y.info(`${d}已跳过:${L},${I.skipMessage}`);else if(I.kind==="partial"){const j=I.watermarkDeferred?`本次入库 ${I.total} 条,但分页窗口尚未扫描完,水位未推进;扩大采集窗口后可安全续扫`:I.total>0?`入库 ${I.total} 条,${I.invalidCount} 条无效`:`读取 ${I.rawCount} 条,但没有形成有效数据`;y.warning(`${d}部分完成:${L},${j}`)}else I.kind==="empty"?y.info(`${d}完成:${L},未发现新数据`):y.success(`${d}完成:${L} 入库 ${I.total} 条`);return I}function gt(n){const c=Nt(n);M.value=zt(n);const d=`同步 ${c.totalReports} 个来源:${c.success} 成功,${c.empty} 无新数据,${c.partial} 部分有效,${c.skipped} 已跳过,${c.failed} 失败,共入库 ${c.totalEntities} 条`;return c.level==="error"?y.error(d):c.level==="warning"?y.warning(d):c.level==="info"?y.info(d):y.success(d),c}async function q(){A.refresh=!0;try{e.value=await u.health(),R.value=await u.stats(),P.value=await u.listAdapters();try{const n=await u.adapterReadiness(),c={};for(const d of Array.isArray(n)?n:[])c[d.name]=d;g.value=c}catch{}try{Ce.value=await u.listAichatAccounts()}catch{}}catch(n){y.error("刷新失败: "+n.message)}finally{A.refresh=!1}}async function cn(){if(S.value.trim()){A.ask=!0,O.value="",v.value=null;try{v.value=await u.ask(S.value.trim(),{acceptNonLocal:x.value})}catch(n){O.value=n.message}finally{A.ask=!1}}}async function un(){A.addMock=!0;try{await u.registerMock({count:30,seed:Date.now()%1e3}),await q(),y.success("MockAdapter 已注册(30 条 mock 数据 ready 同步)")}catch(n){y.error("注册失败: "+n.message)}finally{A.addMock=!1}}function me(n="",c=!1){w.active=!0,w.batchMode=c,w.adapter=n,w.phase="starting",w.mailbox="",w.current=0,w.total=0,w.attempt=1,w.errorMessage=""}function ye(n){if(n){if(n.kind==="sync.batch.start"){w.batchMode=!0,w.adapter="(all)",w.phase="preparing",w.current=n.current||0,w.total=n.total||0;return}if(n.kind==="sync.batch.progress"){w.batchMode=!0,w.adapter=n.adapter||"(all)",w.phase=n.status||"completed",w.current=n.current||0,w.total=n.total||w.total;return}if(n.kind==="sync.batch.done"){w.batchMode=!0,w.adapter="(all)",w.phase="done",w.current=n.current||0,w.total=n.total||w.total;return}n.adapter&&(w.adapter=n.adapter),n.phase&&(w.phase=n.phase),w.batchMode||(typeof n.current=="number"&&(w.current=n.current),typeof n.total=="number"&&(w.total=n.total)),typeof n.attempt=="number"&&(w.attempt=n.attempt),n.mailbox&&(w.mailbox=n.mailbox),n.phase==="error"&&(w.errorMessage=n.message||"sync error")}}async function vt(n){A.sync[n]=!0,me(n);try{const c=Ft(n,z);let d;typeof u.syncAdapterStream=="function"?d=await u.syncAdapterStream(n,c,ye):d=await u.syncAdapter(n,c);const f=he(n,d);return await q(),f}catch(c){return y.error(`同步 ${n} 失败: ${c.message}`),null}finally{A.sync[n]=!1,w.active=!1}}async function fn(){A.syncAll=!0,me("(all)",!0);try{const n=typeof u.syncAllStream=="function"?await u.syncAllStream({readyOnly:!0},ye):await u.syncAll({readyOnly:!0});gt(n),await q()}catch(n){y.error("同步失败: "+n.message)}finally{A.syncAll=!1,w.active=!1}}async function pn(n){try{await u.unregister(n),await q()}catch(c){y.error("移除失败: "+c.message)}}async function mn(n){if(n){A.audit=!0;try{N.value=await u.recentAudit({limit:200})}catch(c){y.error("审计日志加载失败: "+c.message)}finally{A.audit=!1}}}const Ke=Z(()=>!(!D.email||!D.email.includes("@")||!D.authCode||D.authCode.length<4||D.provider==="custom"&&!D.host));function yn(n){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"}[n]||"请输入服务商授权码(不是登录密码)"}function kt(){D.provider="qq",D.email="",D.authCode="",D.host="",D.port=993,D.pdfPasswordHints={idCardLast6:"",phoneLast6:"",cardLast6:""},$.value=null}function We(){const n={provider:D.provider,email:D.email.trim(),authCode:D.authCode};return D.provider==="custom"&&(n.host=D.host.trim(),n.port=D.port||993,n.secure=!0),n}function _t(){const n={};for(const c of Object.keys(D.pdfPasswordHints)){const d=D.pdfPasswordHints[c];typeof d=="string"&&d.trim().length>0&&(n[c]=d.trim())}return Object.keys(n).length>0?n:null}async function gn(){if(Ke.value){A.testEmail=!0,$.value=null;try{$.value=await u.testEmailAuth(We())}catch(n){$.value={ok:!1,error:n.message}}finally{A.testEmail=!1}}}async function vn(){if(!(!Ke.value||!$.value?.ok)){A.saveEmail=!0;try{const n={},c=_t();c&&(n.pdfPasswordHints=c),await u.registerEmail(We(),n),y.success("邮箱账号已注册"),ie.value=!1,kt(),await q()}catch(n){y.error("保存失败: "+n.message)}finally{A.saveEmail=!1}}}const bt=Z(()=>!(!s.email||!s.email.includes("@")||!s.filePath||s.filePath.length<3));function kn(){s.email="",s.zipPassword="",s.filePath="",C.value=null}async function _n(){if(bt.value){A.importAlipay=!0,C.value=null;try{await u.registerAlipay({email:s.email.trim(),zipPassword:s.zipPassword||void 0});const c=/\.zip$/i.test(s.filePath)?{zipPath:s.filePath,zipPassword:s.zipPassword||void 0}:{csvPath:s.filePath};C.value=await u.importAlipayBill(c),C.value?.status==="ok"?(y.success(`导入成功 — ${C.value.entityCounts?.events||0} 笔交易`),await q()):y.error("导入失败: "+(C.value?.error||C.value?.status))}catch(n){C.value={status:"error",error:n.message},y.error("导入失败: "+n.message)}finally{A.importAlipay=!1}}}async function ht(n){if(n){A.eventDetail=!0,de.value=!0;try{oe.value=await u.eventDetail(n)}catch(c){oe.value=null,y.error("事件详情加载失败: "+c.message)}finally{A.eventDetail=!1}}}t({showEventDetail:ht});async function bn(n){A.skill=!0,le.value=null;try{le.value=await u.runSkill(n,{})}catch(c){y.error(`${n} 失败: ${c.message}`)}finally{A.skill=!1}}async function Ee(){A.reviewQueue=!0;try{K.value=await u.reviewQueueList(50);const n=await u.resolverStats();Object.assign(J,n)}catch(n){y.error("待消歧加载失败: "+n.message)}finally{A.reviewQueue=!1}}async function hn(){E.value=!0,await Ee()}async function An(n,c){try{await u.reviewDecision(n,c),y.success(`已记录决策: ${c}`),await Ee()}catch(d){y.error("决策失败: "+d.message)}}async function On(){A.resolverDrain=!0;try{const n=await u.resolverDrain(20);y.success(`drain 完成 — same=${n.same} different=${n.different} review=${n.review}`),await Ee()}catch(n){y.error("drain 失败: "+n.message)}finally{A.resolverDrain=!1}}async function At(){try{const n=await u.resolverStats();Object.assign(J,n)}catch{}}wt(()=>{q(),At()});const Ot={hub:u,health:e,stats:R,adapters:P,readinessMap:g,askInput:S,askResult:v,askError:O,acceptNonLocal:x,auditOpen:U,auditRows:N,lastSync:M,SYNC_INCLUDE_STORAGE_KEY:Ye,_loadSyncInclude:Y,syncIncludeOptions:z,persistSyncInclude:B,includePopoverOpen:G,adapterHasIncludeToggles:H,onIncludeKindToggle:F,emailConfigOpen:ie,emailForm:D,emailTestResult:$,eventDetailOpen:de,eventDetail:oe,emailAccounts:be,oauthCollectorOpen:X,oauthCollectorTarget:ee,skillResult:le,analysisSkills:fe,reviewQueueOpen:E,reviewRows:K,resolverStats:J,aichatWizardOpen:Ue,aichatAccounts:Ce,onAichatRegistered:we,wechatWizardOpen:Se,onWechatRegistered:Me,alipayConfigOpen:Be,alipayForm:s,alipayResult:C,syncProgress:w,loading:A,bridgeDoctorReport:Ge,bilibiliReasonMessage:Ne,douyinReasonMessage:Xe,weiboReasonMessage:Ze,xhsReasonMessage:Je,xhsAdbSync:$e,toutiaoReasonMessage:et,toutiaoAdbSync:tt,kuaishouReasonMessage:nt,kuaishouAdbSync:ot,bridgeDoctor:qt,weiboAdbSync:at,douyinAdbSync:rt,bilibiliAdbDoctor:jt,bilibiliAdbSync:it,adapterColumns:Vt,readinessOf:ze,adapterDescriptor:Ie,guideDrawerOpen:pe,guideTarget:De,openGuide:Fe,recheckGuideTarget:Yt,READINESS_STATUS_COLOR:lt,readinessStatusColor:Qt,READINESS_STATUS_LABEL:st,readinessStatusLabel:Gt,READINESS_CATEGORY_LABEL:dt,readinessCategoryLabel:Xt,KEYED_FILE_ADAPTERS:ct,PASSWORD_FILE_ADAPTERS:ut,ADB_COLLECT_ACTIONS:ft,collectMode:pt,collectActionLabel:Zt,collectButtonLabel:Jt,collectActionDescription:$t,oneClickCollect:en,collectViaOAuth:tn,collectViaRuntimeOptions:He,collectViaFile:mt,collectViaDirectory:yt,readinessSummary:nn,auditColumns:on,transactionColumns:an,sensitivityColor:rn,syncSummary:ln,syncAlertType:sn,syncAlertMessage:dn,presentSyncReport:he,presentSyncAll:gt,refresh:q,ask:cn,addMock:un,resetSyncProgress:me,handleSyncEvent:ye,syncOne:vt,syncAll:fn,unregisterAdapter:pn,loadAudit:mn,emailFormValid:Ke,providerAuthHint:yn,resetEmailForm:kt,buildEmailAccountPayload:We,buildPdfHints:_t,testEmailAuth:gn,saveEmail:vn,alipayFormValid:bt,resetAlipayForm:kn,importAlipay:_n,showEventDetail:ht,runSkill:bn,loadReviewQueue:Ee,openReviewQueue:hn,decideReview:An,drainResolver:On,loadResolverStats:At,ref:T,reactive:ne,onMounted:wt,computed:Z,get message(){return y},get ReloadOutlined(){return Hn},get FileSearchOutlined(){return Fn},get MessageOutlined(){return zn},get SendOutlined(){return Nn},get AppstoreOutlined(){return Bn},get MailOutlined(){return Mn},get InfoCircleOutlined(){return Un},get WalletOutlined(){return Ln},get LinkOutlined(){return xn},get BulbOutlined(){return Tn},get DollarOutlined(){return St},get TeamOutlined(){return It},get EnvironmentOutlined(){return Dt},get HeartOutlined(){return Et},get ClockCircleOutlined(){return Rt},get RobotOutlined(){return Pn},get WechatOutlined(){return Rn},get usePersonalDataHub(){return ke},get resolveCollectionMode(){return _e},get getCollectionActionLabel(){return Tt},get getCollectionButtonLabel(){return xt},get getCollectionActionDescription(){return Lt},get cookieCollectionOptions(){return Ut},get directoryCollectionOptions(){return Mt},get requiresExplicitSourceUrl(){return Te},get chooseHostDirectory(){return Bt},get analyzeSyncReport(){return se},get analyzeSyncReports(){return Nt},get selectImportantSyncReport(){return zt},get buildSyncIncludeOptions(){return Ft},get createDefaultSyncInclude(){return Ve},get DEFAULT_SYNC_INCLUDE(){return Qe},get INCLUDE_KIND_META(){return xe},AIChatWizard:po,PdhOAuthCollectorDrawer:go,WechatWizard:So};return Object.defineProperty(Ot,"__isScriptSetup",{enumerable:!1,value:!0}),Ot}},Do={class:"pdh-page"},Eo={class:"pdh-header"},Ro={class:"kv"},Po={key:0,class:"kv"},To={key:1,class:"kv"},xo={class:"kv"},Lo={key:0,class:"kv hint"},Uo={style:{"margin-top":"12px",display:"flex","justify-content":"space-between","align-items":"center"}},Mo={key:0,style:{"margin-top":"12px"}},Bo={key:1,style:{"margin-top":"12px"}},No={class:"answer"},zo={style:{"margin-top":"8px","font-size":"12px",color:"var(--text-color-secondary, #888)"}},Fo={key:2,style:{"margin-top":"8px"}},Ho={style:{display:"flex","align-items":"center",gap:"8px"}},Ko={class:"hint",style:{"margin-top":"4px"}},Wo={key:0,style:{"margin-top":"16px"}},qo={class:"json-pre",style:{"max-height":"300px",overflow:"auto"}},jo={key:0,style:{"margin-top":"8px"}},Vo={key:0,style:{"margin-top":"4px",opacity:"0.85"}},Yo={key:1,style:{"margin-top":"4px",color:"#ffb3b3"}},Qo={style:{color:"#999","font-size":"12px","margin-left":"2px"}},Go={key:0,style:{color:"#8c8c8c","font-size":"12px","margin-top":"2px","line-height":"1.4"}},Xo={style:{"min-width":"220px"}},Zo={style:{color:"#999","font-size":"12px","margin-left":"4px"}},Jo={key:2,style:{"margin-top":"12px"}},$o={class:"kv",style:{"margin-bottom":"4px"}},ea={key:0,style:{color:"#faad14"}},ta={key:2,class:"kv hint"},na={key:3,class:"kv hint",style:{color:"#ff4d4f"}},oa={key:3,style:{"margin-top":"12px"}},aa={key:2,style:{"margin-top":"8px"}},ra={key:1},ia={style:{"margin-left":"8px"}},la={key:3,class:"json-pre"},sa={style:{"margin-left":"6px"}},da={key:0,style:{"margin-left":"6px"}},ca={key:0,class:"hint",style:{"margin-top":"4px"}},ua={key:0,style:{"margin-top":"8px"}},fa={style:{"margin-bottom":"12px"}},pa={class:"hint"},ma={class:"kv"},ya={class:"kv",style:{"margin-top":"4px"}},ga={class:"kv"},va={key:0,class:"hint",style:{"margin-top":"4px"}},ka={key:1,style:{"font-size":"11px"}},_a={style:{"font-weight":"600","margin-bottom":"8px"}},ba={style:{margin:"0","padding-left":"20px","line-height":"1.9"}},ha={key:0,style:{"margin-top":"6px","font-size":"12px",color:"#52c41a"}},Aa={style:{"font-size":"12px",color:"#999"}};function Oa(r,t,u,e,R,P){const g=_("a-button"),S=_("a-badge"),v=_("a-space"),O=_("a-tag"),x=_("a-card"),U=_("a-col"),N=_("a-row"),M=_("a-textarea"),Y=_("a-checkbox"),z=_("a-alert"),B=_("a-divider"),G=_("a-spin"),H=_("a-tooltip"),F=_("a-popover"),ie=_("a-popconfirm"),D=_("a-table"),$=_("a-empty"),de=_("a-progress"),oe=_("a-select-option"),be=_("a-select"),X=_("a-form-item"),ee=_("a-input"),le=_("a-input-password"),fe=_("a-input-number"),E=_("a-form"),K=_("a-drawer"),J=_("a-descriptions-item"),Ue=_("a-descriptions"),Ce=_("a-list-item-meta"),we=_("a-list-item"),Se=_("a-list"),Me=_("a-collapse-panel"),Be=_("a-collapse");return i(),h("div",Do,[m(" Page header "),k("div",Eo,[t[33]||(t[33]=k("div",null,[k("h2",{class:"page-title"},"个人数据中台"),k("p",{class:"page-sub"}," 让数据回归个人 — 各 app 数据本地加密落盘,本地 LLM 跨源分析,零云端外传。 ")],-1)),a(v,null,{default:o(()=>[a(g,{loading:e.loading.refresh,onClick:e.refresh},{icon:o(()=>[a(e.ReloadOutlined)]),default:o(()=>[t[30]||(t[30]=l(" 刷新 ",-1))]),_:1},8,["loading"]),a(S,{count:e.resolverStats.reviewQueue,offset:[0,0]},{default:o(()=>[a(g,{type:"primary",ghost:"",onClick:e.openReviewQueue},{icon:o(()=>[a(e.LinkOutlined)]),default:o(()=>[t[31]||(t[31]=l(" 待消歧 ",-1))]),_:1})]),_:1},8,["count"]),a(g,{type:"primary",ghost:"",onClick:t[0]||(t[0]=s=>e.auditOpen=!0)},{icon:o(()=>[a(e.FileSearchOutlined)]),default:o(()=>[t[32]||(t[32]=l(" 审计日志 ",-1))]),_:1})]),_:1})]),m(" Health row "),a(N,{gutter:16,style:{"margin-bottom":"16px"}},{default:o(()=>[a(U,{xs:24,sm:12,md:6},{default:o(()=>[a(x,{size:"small",title:"Vault"},{extra:o(()=>[a(O,{color:e.health?.vault?.ok?"green":"red"},{default:o(()=>[l(p(e.health?.vault?.ok?"正常":"未就绪"),1)]),_:1},8,["color"])]),default:o(()=>[k("div",Ro," schema v"+p(e.health?.vault?.schemaVersion??"?"),1),e.stats?.vault?(i(),h("div",Po," 事件 "+p(e.stats.vault.events)+" · 联系人 "+p(e.stats.vault.persons),1)):m("v-if",!0),e.stats?.vault?(i(),h("div",To," 地点 "+p(e.stats.vault.places)+" · 商品 "+p(e.stats.vault.items)+" · 主题 "+p(e.stats.vault.topics),1)):m("v-if",!0)]),_:1})]),_:1}),a(U,{xs:24,sm:12,md:6},{default:o(()=>[a(x,{size:"small",title:"本地 LLM"},{extra:o(()=>[a(O,{color:e.health?.llm?.ok?e.health.llm.isLocal?"green":"orange":"red"},{default:o(()=>[l(p(e.health?.llm?.ok?e.health.llm.isLocal?"本地":"非本地":"未就绪"),1)]),_:1},8,["color"])]),default:o(()=>[k("div",xo,p(e.health?.llm?.name||"—"),1),e.health?.llm?.ok&&!e.health.llm.isLocal?(i(),h("div",Lo," ⚠️ 非本地 — ask 会被隐私 gate 拒绝,除非显式 acceptNonLocal ")):m("v-if",!0)]),_:1})]),_:1}),a(U,{xs:24,sm:12,md:6},{default:o(()=>[a(x,{size:"small",title:"KG 索引"},{extra:o(()=>[a(O,{color:e.health?.kgSink?.ok?"green":"default"},{default:o(()=>[l(p(e.health?.kgSink?.ok?"已连接":"不可用"),1)]),_:1},8,["color"])]),default:o(()=>[t[34]||(t[34]=k("div",{class:"kv"}," events / persons → cc knowledge-graph 实体 + 关系 ",-1))]),_:1})]),_:1}),a(U,{xs:24,sm:12,md:6},{default:o(()=>[a(x,{size:"small",title:"RAG 索引"},{extra:o(()=>[a(O,{color:e.health?.ragSink?.ok?"green":"default"},{default:o(()=>[l(p(e.health?.ragSink?.ok?"已连接":"不可用"),1)]),_:1},8,["color"])]),default:o(()=>[t[35]||(t[35]=k("div",{class:"kv"},"文本 → BM25(vector 留待后续 phase)",-1))]),_:1})]),_:1})]),_:1}),m(" Ask box "),a(x,{style:{"margin-bottom":"16px"}},{title:o(()=>[a(v,null,{default:o(()=>[a(e.MessageOutlined),t[36]||(t[36]=k("span",null,"问我数据",-1))]),_:1})]),default:o(()=>[a(M,{value:e.askInput,"onUpdate:value":t[1]||(t[1]=s=>e.askInput=s),rows:2,placeholder:"例:上个月在淘宝总共花了多少?/我妈生日那周买了啥送哪儿?",onKeydown:Dn(Kt(e.ask,["exact","prevent"]),["enter"])},null,8,["value","onKeydown"]),k("div",Uo,[a(Y,{checked:e.acceptNonLocal,"onUpdate:checked":t[2]||(t[2]=s=>e.acceptNonLocal=s)},{default:o(()=>[...t[37]||(t[37]=[l("允许非本地 LLM (volcengine / anthropic 等)",-1)])]),_:1},8,["checked"]),a(g,{type:"primary",loading:e.loading.ask,disabled:!e.askInput.trim(),onClick:e.ask},{icon:o(()=>[a(e.SendOutlined)]),default:o(()=>[t[38]||(t[38]=l(" 提问 ",-1))]),_:1},8,["loading","disabled"])]),e.askError?(i(),h("div",Mo,[a(z,{type:"error","show-icon":"",message:e.askError},null,8,["message"])])):m("v-if",!0),e.askResult?(i(),h("div",Bo,[e.askResult.warning==="no-facts"?(i(),b(z,{key:0,type:"warning","show-icon":"",message:"vault 里没找到匹配的事件('no-facts')—— 先同步几个 adapter 让数据进 vault",style:{"margin-bottom":"12px"}})):e.askResult.warning==="hallucinated-citations"?(i(),b(z,{key:1,type:"warning","show-icon":"",message:`LLM 引用了 ${e.askResult.hallucinatedCitations?.length||0} 个不存在的 event id —— 模型在编造`,style:{"margin-bottom":"12px"}},null,8,["message"])):m("v-if",!0),k("div",No,p(e.askResult.answer),1),k("div",zo," 引用 "+p(e.askResult.citations?.length||0)+" 条事实 · "+p(e.askResult.facts?.length||0)+" facts 入 prompt · "+p(e.askResult.durationMs)+"ms · "+p(e.askResult.model),1),e.askResult.citations?.length?(i(),h("div",Fo,[t[39]||(t[39]=k("span",{style:{"font-size":"12px",color:"var(--text-color-secondary, #888)"}},"事件链接(点击查看明细 / PDF 解密结果):",-1)),a(v,{style:{"margin-top":"4px"},wrap:""},{default:o(()=>[(i(!0),h(V,null,re(e.askResult.citations,s=>(i(),b(O,{key:s,color:"blue",style:{cursor:"pointer"},onClick:C=>e.showEventDetail(s)},{default:o(()=>[l(p(s),1)]),_:2},1032,["onClick"]))),128))]),_:1})])):m("v-if",!0)])):m("v-if",!0)]),_:1}),m(" Phase 11 — Analysis Skills cards "),a(x,{style:{"margin-bottom":"16px"}},{title:o(()=>[a(v,null,{default:o(()=>[a(e.BulbOutlined),t[40]||(t[40]=k("span",null,"分析 skill (Phase 11)",-1))]),_:1})]),extra:o(()=>[a(O,{color:"purple"},{default:o(()=>[...t[41]||(t[41]=[l("5 内置",-1)])]),_:1})]),default:o(()=>[a(N,{gutter:[12,12]},{default:o(()=>[(i(),h(V,null,re(e.analysisSkills,s=>a(U,{xs:24,sm:12,md:8,key:s.name},{default:o(()=>[a(x,{size:"small",hoverable:"",onClick:C=>e.runSkill(s.name)},{default:o(()=>[k("div",Ho,[(i(),b(En(s.icon),{style:{"font-size":"18px",color:"#722ed1"}})),k("strong",null,p(s.label),1)]),k("div",Ko,p(s.description),1)]),_:2},1032,["onClick"])]),_:2},1024)),64))]),_:1}),e.skillResult?(i(),h("div",Wo,[a(B,{plain:"",orientation:"left"},{default:o(()=>[l(p(e.skillResult.skill)+" 结果",1)]),_:1}),a(G,{spinning:e.loading.skill},{default:o(()=>[k("pre",qo,p(JSON.stringify(e.skillResult,null,2)),1),e.skillResult.llm_commentary||e.skillResult.llm_narrative?(i(),h("div",jo,[a(z,{type:"info",message:e.skillResult.llm_commentary||e.skillResult.llm_narrative},null,8,["message"])])):m("v-if",!0)]),_:1},8,["spinning"])])):m("v-if",!0)]),_:1}),m(" Adapters "),a(x,{style:{"margin-bottom":"16px"}},{title:o(()=>[a(v,null,{default:o(()=>[a(e.AppstoreOutlined),t[42]||(t[42]=k("span",null,"Adapters",-1)),e.readinessSummary?(i(),b(O,{key:0,color:e.readinessSummary.ready===e.readinessSummary.total?"green":"orange"},{default:o(()=>[l(p(e.readinessSummary.ready)+"/"+p(e.readinessSummary.total)+" 可采集 ",1)]),_:1},8,["color"])):m("v-if",!0)]),_:1})]),extra:o(()=>[a(v,null,{default:o(()=>[a(g,{onClick:t[3]||(t[3]=s=>e.emailConfigOpen=!0)},{icon:o(()=>[a(e.MailOutlined)]),default:o(()=>[t[43]||(t[43]=l(" 添加邮箱账号 ",-1))]),_:1}),a(g,{onClick:t[4]||(t[4]=s=>e.alipayConfigOpen=!0)},{icon:o(()=>[a(e.WalletOutlined)]),default:o(()=>[t[44]||(t[44]=l(" 导入支付宝账单 ",-1))]),_:1}),a(g,{onClick:t[5]||(t[5]=s=>e.aichatWizardOpen=!0)},{icon:o(()=>[a(e.RobotOutlined)]),default:o(()=>[t[45]||(t[45]=l(" 添加 AI 对话账号 ",-1))]),_:1}),a(g,{onClick:t[6]||(t[6]=s=>e.wechatWizardOpen=!0)},{icon:o(()=>[a(e.WechatOutlined)]),default:o(()=>[t[46]||(t[46]=l(" 添加 WeChat ",-1))]),_:1}),a(g,{onClick:e.bilibiliAdbDoctor,loading:e.loading.bilibiliAdbDoctor},{default:o(()=>[...t[47]||(t[47]=[l(" 诊断 Bilibili ADB ",-1)])]),_:1},8,["loading"]),a(g,{onClick:e.bilibiliAdbSync,loading:e.loading.bilibiliAdbSync},{default:o(()=>[...t[48]||(t[48]=[l(" 通过 PC ADB 同步 Bilibili ",-1)])]),_:1},8,["loading"]),a(g,{onClick:e.weiboAdbSync,loading:e.loading.weiboAdbSync},{default:o(()=>[...t[49]||(t[49]=[l(" 通过 PC ADB 同步 Weibo ",-1)])]),_:1},8,["loading"]),a(g,{onClick:e.xhsAdbSync,loading:e.loading.xhsAdbSync},{default:o(()=>[...t[50]||(t[50]=[l(" 通过 PC ADB 同步 Xhs ",-1)])]),_:1},8,["loading"]),a(g,{onClick:e.toutiaoAdbSync,loading:e.loading.toutiaoAdbSync},{default:o(()=>[...t[51]||(t[51]=[l(" 通过 PC ADB 同步 Toutiao ",-1)])]),_:1},8,["loading"]),a(g,{onClick:e.kuaishouAdbSync,loading:e.loading.kuaishouAdbSync},{default:o(()=>[...t[52]||(t[52]=[l(" 通过 PC ADB 同步 Kuaishou ",-1)])]),_:1},8,["loading"]),a(g,{onClick:e.bridgeDoctor,loading:e.loading.bridgeDoctor},{default:o(()=>[...t[53]||(t[53]=[l(" 诊断签名 Bridges ",-1)])]),_:1},8,["loading"]),a(g,{onClick:e.douyinAdbSync,loading:e.loading.douyinAdbSync},{default:o(()=>[...t[54]||(t[54]=[l(" 通过 PC ADB 同步 Douyin ",-1)])]),_:1},8,["loading"]),a(g,{onClick:e.addMock,loading:e.loading.addMock},{default:o(()=>[...t[55]||(t[55]=[l(" 注册 MockAdapter(开发) ",-1)])]),_:1},8,["loading"]),a(g,{type:"primary",onClick:e.syncAll,loading:e.loading.syncAll,disabled:!e.adapters.length},{default:o(()=>[...t[56]||(t[56]=[l(" 同步全部 ",-1)])]),_:1},8,["loading","disabled"])]),_:1})]),default:o(()=>[e.adapters.length?(i(),b(D,{key:0,columns:e.adapterColumns,"data-source":e.adapters,pagination:!1,"row-key":s=>s.name,size:"middle"},{bodyCell:o(({column:s,record:C})=>[s.key==="readiness"?(i(),h(V,{key:0},[e.readinessOf(C.name)?(i(),h(V,{key:0},[a(H,null,{title:o(()=>[k("div",null,p(e.readinessOf(C.name).message),1),e.readinessOf(C.name).actionHint?(i(),h("div",Vo," → "+p(e.readinessOf(C.name).actionHint),1)):m("v-if",!0),e.readinessOf(C.name).lastError?(i(),h("div",Yo," 上次同步错误: "+p(e.readinessOf(C.name).lastError),1)):m("v-if",!0)]),default:o(()=>[a(O,{color:e.readinessStatusColor(e.readinessOf(C.name).status)},{default:o(()=>[l(p(e.readinessStatusLabel(e.readinessOf(C.name))),1)]),_:2},1032,["color"])]),_:2},1024),k("span",Qo,p(e.readinessCategoryLabel(e.readinessOf(C.name).category)),1),m(` inline reason for the non-ready rows so the user doesn't
|
|
4
|
-
have to hover to learn why a source can't collect `),e.readinessOf(C.name).ready?m("v-if",!0):(i(),h("div",Go,p(e.readinessOf(C.name).message),1))],64)):(i(),b(O,{key:1,color:"default"},{default:o(()=>[...t[57]||(t[57]=[l("检测中",-1)])]),_:1}))],64)):s.key==="sensitivity"?(i(),h(
|
|
1
|
+
import{I as _,P as i,S as b,K as o,c as a,J as h,U as k,F as Y,Z as re,_ as Ht,R as p,Q as l,V as m,a2 as Kt,w as ve,b as Z,a as ne,r as T,f as Ct,a5 as In,o as wt,a1 as Dn,a0 as En}from"./vendor-Bn1JzzAn.js";import{u as ke}from"./usePersonalDataHub-DZR9Abyd.js";import{_ as Le,d as y}from"./index-BEVm0lCS.js";import{aD as St,O as It,aE as Dt,aF as Et,a1 as Rt,aG as Rn,ag as Pn,p as Tn,aC as xn,W as Ln,e as Un,aH as Mn,aa as Bn,am as Nn,ac as zn,n as Fn,R as Hn}from"./icons-DG5UD-6K.js";import"./useShellMode-CgR0wCYM.js";const W=Object.freeze({SYNC:"sync",FILE:"file",DIRECTORY:"directory",COOKIE:"cookie",OAUTH:"oauth",ADB:"adb",SETUP:"setup"}),Kn=new Set(["social-bilibili","social-weibo","social-douyin","social-xiaohongshu","social-toutiao","social-kuaishou"]),Wt=new Set(["travel-didi-consumer"]),Wn=new Set(["sync:file-import","sync:snapshot","sync:sqlite"]),jn=new Set(["sync:cookie","sync:cookie-api"]),Pt=Object.freeze({"doc-baidu-netdisk":Object.freeze({fields:Object.freeze([Object.freeze({key:"accessToken",label:"OAuth access token",placeholder:"百度网盘开放平台 access token",required:!0,secret:!0}),Object.freeze({key:"accountId",label:"稳定账号标识",placeholder:"仅用于生成隔离水位的哈希作用域",required:!0}),Object.freeze({key:"dir",label:"应用目录",placeholder:"/apps/你的应用目录",required:!0})])}),"doc-wps":Object.freeze({fields:Object.freeze([Object.freeze({key:"accessToken",label:"OAuth access token",placeholder:"WPS 365 用户授权 access token",required:!0,secret:!0}),Object.freeze({key:"accountId",label:"稳定账号标识",placeholder:"仅用于生成隔离水位的哈希作用域",required:!0}),Object.freeze({key:"driveId",label:"云盘 ID",placeholder:"WPS driveId",required:!0}),Object.freeze({key:"parentId",label:"起始目录 ID",placeholder:"默认 0(根目录)",defaultValue:"0"}),Object.freeze({key:"appId",label:"KSO-1 App ID(可选)",placeholder:"启用接口签名时填写"}),Object.freeze({key:"appKey",label:"KSO-1 App Key(可选)",placeholder:"必须与 App ID 同时填写",secret:!0})])})}),qn=new Set(["NO_KEY_PROVIDER","EMPTY_KEY","KEY_PROVIDER_THREW","ENV_UNSUPPORTED","CUSTOM_FETCH_REQUIRED"]);function ue(r){return Array.isArray(r?.capabilities)?r.capabilities:[]}function Pe(r){return!r||!ue(r).includes("sync:oauth-api")||!Object.prototype.hasOwnProperty.call(Pt,r.name)?null:Pt[r.name]}function _e(r){if(!r||typeof r!="object")return W.SETUP;if(Kn.has(r.name))return W.ADB;const t=ue(r);return t.includes("sync:scan-directory")?W.DIRECTORY:r.ready===!0?W.SYNC:qn.has(r.reason)?W.SETUP:t.some(u=>jn.has(u))||Wt.has(r.name)&&t.includes("sync:custom-cookie-api")?W.COOKIE:Pe(r)?W.OAUTH:t.includes("sync:scan-directory")||t.includes("sync:export-directory")||t.includes("sync:profile-directory")?W.DIRECTORY:t.some(u=>Wn.has(u))?W.FILE:r.ready==null&&r.category==="local"?W.SYNC:W.SETUP}function Tt(r){switch(_e(r)){case W.FILE:return"📂 选择文件采集";case W.DIRECTORY:return ue(r).includes("sync:scan-directory")?"📁 选择扫描目录":ue(r).includes("sync:profile-directory")?"📁 选择配置目录":"📁 选择导出目录";case W.COOKIE:return"🔑 登录采集";case W.OAUTH:return"🔐 OAuth 授权采集";case W.ADB:return"📱 USB 一键采集";case W.SYNC:return"⚡ 立即采集";default:return"查看采集步骤"}}function xt(r){switch(_e(r)){case W.FILE:return"📂 采集";case W.DIRECTORY:return"📁 采集";case W.COOKIE:return"🔑 采集";case W.OAUTH:return"🔐 授权采集";case W.ADB:return"📱 采集";case W.SYNC:return"采集";default:return"查看步骤"}}function Lt(r){if(_e(r)===W.COOKIE&&Te(r))return"粘贴登录 Cookie、稳定账号标识和本次使用的滴滴 HTTPS 订单接口后采集入库";switch(_e(r)){case W.FILE:return"选择导出或解密好的文件,自动入库";case W.DIRECTORY:return ue(r).includes("sync:scan-directory")?"选择本地目录,仅采集其中的文件活动元数据":ue(r).includes("sync:profile-directory")?"选择本地配置目录,读取其中的数据文件":"选择本地导出目录,递归扫描支持的文件";case W.COOKIE:return"粘贴当前登录 Cookie 后采集入库";case W.OAUTH:return"临时输入官方 OAuth 凭据后采集;凭据不会保存到本地配置、数据中台或同步水位";case W.ADB:return"连接已授权的 Android 手机后自动采集";case W.SYNC:return"复用当前配置,直接采集入库";default:return"先按上述步骤完成采集配置"}}function Te(r){return Wt.has(r?.name)}function ce(r,t,{normalize:u=!1}={}){if(typeof r!="string")return"";const e=(u?r.normalize("NFKC"):r).trim();return!e||e.length>t||/[\0\r\n]/u.test(e)?"":e}function je(r,t={}){if(!Pe(r))return null;const u=ce(t.accessToken,16*1024),e=ce(t.accountId,1024,{normalize:!0});if(!u||!e)return null;if(r.name==="doc-baidu-netdisk"){const R=ce(t.dir,4096,{normalize:!0});return/^\/apps\/[^/\0\r\n]+(?:\/[^\0\r\n]*)?$/u.test(R)?{accessToken:u,accountId:e,dir:R,recursive:t.recursive!==!1}:null}if(r.name==="doc-wps"){const R=ce(t.driveId,1024,{normalize:!0}),P=ce(t.parentId,1024,{normalize:!0})||"0",g=ce(t.appId,1024,{normalize:!0}),S=ce(t.appKey,16*1024);return!R||!!g!=!!S?null:{accessToken:u,accountId:e,driveId:R,parentId:P,recursive:t.recursive!==!1,...g?{appId:g,appKey:S}:{}}}return null}function Ut(r,t,u,e){const R=typeof t=="string"?t.trim():"",P=typeof u=="string"?u.trim():"";if(!R||!P)return null;const g={cookie:R,accountId:P};if(!Te(r))return g;const S=typeof e=="string"?e.trim():"";if(!S)return null;try{const v=new URL(S);if(v.protocol!=="https:"||v.username||v.password||v.hash||v.port&&v.port!=="443"||!(v.hostname==="xiaojukeji.com"||v.hostname.endsWith(".xiaojukeji.com")))return null;g.sourceUrl=v.href}catch{return null}return g}function Mt(r,t,u){if(typeof t!="string"||t.length===0)return null;const e=ue(r);if(e.includes("sync:scan-directory"))return{roots:[t]};if(e.includes("sync:profile-directory"))return{profilePath:t};if(e.includes("sync:export-directory")){const R=typeof u=="string"?u.trim():"";return R?{exportDir:t,accountId:R}:null}return null}function Yn(r="数据"){return`当前 Web/CLI 宿主不支持原生目录选择器。
|
|
2
|
+
请手动输入运行 ChainlessChain 主机上的绝对${r}目录路径(不是浏览器所在设备的路径)。该目录将由主机端直接读取;留空取消:`}function Vn(r){return typeof r!="string"||r.length===0?!1:r.startsWith("/")||/^[A-Za-z]:[\\/]/u.test(r)}async function Bt({pickDirectoryResult:r,prompt:t,title:u,directoryKind:e}){const R=await r({title:u});if(R?.status==="selected")return{...R,manual:!1};if(R?.status==="cancelled")return{status:"cancelled",path:null,manual:!1};const P=t(Yn(e));return typeof P!="string"||P.length===0?{status:"cancelled",path:null,manual:!0}:Vn(P)?{status:"selected",path:P,manual:!0}:{status:"invalid",path:null,manual:!0,reason:"HOST_ABSOLUTE_PATH_REQUIRED"}}const Qn=Object.freeze(["events","persons","places","items","topics"]);function ae(r){return Number.isFinite(r)&&r>0?r:0}function qe(r){return Number.isFinite(r)&&r>0?r:null}function Re(r){return Number.isFinite(r)&&r>=0?r:null}function Gn(r){const t=r?.entityCounts;return!t||typeof t!="object"?0:Qn.reduce((u,e)=>u+ae(t[e]),0)}function se(r){const t=!!r&&typeof r=="object",u=t&&typeof r.status=="string"?r.status:"invalid",e=Gn(r),R=ae(r?.rawCount),P=ae(r?.archivedRawCount),g=ae(r?.archiveFailureCount),S=ae(r?.invalidCount),v=r?.watermarkDeferred===!0,O=typeof r?.checkpointCommitted=="boolean"?r.checkpointCommitted:null,x={archivedRawCount:P,archiveFailureCount:g,checkpointCommitted:O},U={pageBudget:qe(r?.pageBudget),nextPageBudget:qe(r?.nextPageBudget),scanDeferredCount:ae(r?.scanDeferredCount),watermarkLookbackMs:ae(r?.watermarkLookbackMs),collectionSinceWatermark:typeof r?.collectionSinceWatermark=="string"?r.collectionSinceWatermark:null},N={attemptCount:ae(r?.attemptCount),retryCount:ae(r?.retryCount),totalRetryDelayMs:ae(r?.totalRetryDelayMs),retryExhausted:r?.retryExhausted===!0,retryAfterMs:qe(r?.retryAfterMs),rateLimitReason:typeof r?.rateLimitReason=="string"?r.rateLimitReason:null,rateLimitRemainingMinute:Re(r?.rateLimitRemainingMinute),rateLimitRemainingDay:Re(r?.rateLimitRemainingDay),sourceRequestCount:ae(r?.sourceRequestCount),sourceRequestThrottleMs:ae(r?.sourceRequestThrottleMs),sourceRequestRateLimitRemainingMinute:Re(r?.sourceRequestRateLimitRemainingMinute),sourceRequestRateLimitRemainingDay:Re(r?.sourceRequestRateLimitRemainingDay)};return t&&u==="skipped"?{kind:"skipped",level:"info",completed:!0,status:u,total:e,rawCount:R,...x,...U,...N,invalidCount:S,error:null,skipReason:r.skipReason||"NOT_READY",skipMessage:r.skipMessage||"来源当前未就绪"}:!t||u!=="ok"?{kind:"failed",level:"error",completed:!1,status:u,total:e,rawCount:R,...x,...U,...N,invalidCount:S,error:t&&typeof r.error=="string"&&r.error.trim()||(u==="invalid"?"未收到有效同步报告":`同步状态:${u}`)}:v||g>0||O===!1||S>0||R>0&&e===0?{kind:"partial",level:"warning",completed:!0,status:u,total:e,rawCount:R,...x,...U,...N,invalidCount:S,watermarkDeferred:v,error:null}:e===0?{kind:"empty",level:"info",completed:!0,status:u,total:e,rawCount:R,...x,...U,...N,invalidCount:S,error:null}:{kind:"success",level:"success",completed:!0,status:u,total:e,rawCount:R,...x,...U,...N,invalidCount:S,watermarkDeferred:v,error:null}}function Nt(r){if(!Array.isArray(r))return{level:"error",completed:!1,totalReports:0,totalEntities:0,success:0,empty:0,partial:0,skipped:0,failed:1,analyses:[]};const t=r.map(se),u={level:"success",completed:!0,totalReports:t.length,totalEntities:t.reduce((e,R)=>e+R.total,0),success:t.filter(e=>e.kind==="success").length,empty:t.filter(e=>e.kind==="empty").length,partial:t.filter(e=>e.kind==="partial").length,skipped:t.filter(e=>e.kind==="skipped").length,failed:t.filter(e=>e.kind==="failed").length,analyses:t};return u.failed>0?(u.level=u.failed===u.totalReports?"error":"warning",u.completed=!1):u.partial>0?u.level="warning":(u.skipped>0||u.success===0)&&(u.level="info"),u}function zt(r){return!Array.isArray(r)||r.length===0?null:r.find(t=>se(t).kind==="failed")||r.find(t=>se(t).kind==="partial")||r.find(t=>se(t).kind==="skipped")||r[r.length-1]}const xe=Object.freeze({"system-data-android":Object.freeze([Object.freeze({key:"contacts",label:"联系人",hint:"~767 条"}),Object.freeze({key:"apps",label:"已安装应用",hint:"~176 个"}),Object.freeze({key:"sms",label:"短信内容",hint:"~2400 条 · 高敏感",sensitive:!0}),Object.freeze({key:"calls",label:"通话记录",hint:"~18000 条 · 包含号码",sensitive:!0}),Object.freeze({key:"media",label:"媒体文件元数据",hint:"照片 / 视频 / 下载 / 文档 · 高敏感",sensitive:!0})])}),Qe=Object.freeze(Object.fromEntries(Object.entries(xe).map(([r,t])=>[r,Object.freeze(Object.fromEntries(t.map(({key:u})=>[u,!0])))])));function Ye(){return Object.fromEntries(Object.entries(Qe).map(([r,t])=>[r,{...t}]))}function Ft(r,t){const u=xe[r];if(!u)return{};const e=t?.[r]||{};return{include:Object.fromEntries(u.map(({key:P})=>[P,e[P]!==!1]))}}const Xn={__name:"AIChatWizard",props:{open:{type:Boolean,default:!1},existingAccounts:{type:Array,default:()=>[]}},emits:["update:open","registered"],setup(r,{expose:t,emit:u}){t();const e=r,R=u,P=[{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}],g=ke(),S=T(1),v=T(null),O=T(""),x=T(null),U=T(null),N=T(null),M=ne({open:!1,probe:!1,register:!1}),V=Z(()=>P.find(E=>E.vendor===v.value)||{}),z=Z(()=>S.value===1?"选择一家 AI 服务商":S.value===2?x.value?.fallbackMode==="paste"?"在外部浏览器登录,把 cookie 粘贴到下面":"在内嵌浏览器登录,主进程自动读取 cookie":"校验并写入本地加密 vault"),B=Z(()=>{const E=U.value;return E?E.reason==="UNKNOWN_VENDOR"?"未知厂商 — 请刷新页面或重选":E.reason==="PASTE_REQUIRED"?"请先粘贴 cookie 字符串":E.missingRequired?.length?`缺关键 cookie: ${E.missingRequired.join(", ")}`:E.reason||"cookie 校验失败":""}),G=Z(()=>{const E=N.value;return E?E.reason==="REQUIRED_COOKIES_MISSING"?`缺关键 cookie: ${(E.missingRequired||[]).join(", ")}`:E.reason==="VALIDATE_COOKIE_FAILED"?"厂商拒绝该 cookie(可能已过期或被风控)":E.reason==="ADAPTER_THREW"?`Adapter 抛错: ${E.error||"网络错误"}`:E.reason==="UNKNOWN_VENDOR"?"未知厂商":E.reason||"注册失败":"未知错误"});function H(E){return e.existingAccounts.some(K=>K&&K.vendor===E)}function F(E){return e.existingAccounts.find(K=>K&&K.vendor===E)||null}function ie(E){const K=F(E);return K?K.lastHealth?K.lastHealth.ok?"ok":K.lastHealth.reason==="SPEC_VERSION_MISMATCH"?"mismatch":"fail":"unknown":null}function D(E){const K=F(E);if(!K||!K.lastHealth||K.lastHealth.ok)return"";const J=K.lastHealth.reason;return J?J==="SPEC_VERSION_MISMATCH"?"cookie 规格已升级,请重新登录":J==="ADAPTER_THREW"?"上次校验抛错,建议稍后重试":J==="COOKIE_EXPIRED"?"Cookie 已过期,请重新登录":J:"Cookie 校验失败,建议重新登录"}async function $(E){try{(await g.unregisterAichat(E))?.ok&&R("registered",{vendor:E,accountId:null,unregistered:!0})}catch(K){N.value={ok:!1,reason:K?.message||"UNREGISTER_FAILED"}}}function de(E){v.value=E}async function oe(){if(v.value){M.open=!0,x.value=null,U.value=null,O.value="";try{if(x.value=await g.openAichatLogin(v.value),!x.value?.ok)return;S.value=2}catch(E){x.value={ok:!1,reason:E?.message||"OPEN_FAILED"}}finally{M.open=!1}}}async function be(){M.probe=!0,U.value=null;try{const E=O.value.trim(),K=E||void 0;U.value=await g.probeAichatCookies(v.value,K)}catch(E){U.value={ok:!1,reason:E?.message||"PROBE_FAILED"}}finally{M.probe=!1}}async function X(){if(U.value?.ok){M.register=!0;try{N.value=await g.registerAichatVendor(v.value,U.value.cookies),S.value=3,N.value?.ok&&R("registered",{vendor:v.value,accountId:N.value.accountId})}catch(E){N.value={ok:!1,reason:E?.message||"REGISTER_FAILED"},S.value=3}finally{M.register=!1}}}function ee(){S.value=1,v.value=null,O.value="",x.value=null,U.value=null,N.value=null}function le(){ee(),R("update:open",!1)}ve(()=>e.open,E=>{E&&ee()});const fe={props:e,emit:R,vendors:P,hub:g,step:S,selectedVendor:v,cookieHeader:O,openResult:x,probeResult:U,registerResult:N,loading:M,currentVendorMeta:V,stepDescription:z,probeFailMessage:B,registerFailMessage:G,isRegistered:H,_entry:F,healthOf:ie,healthReasonOf:D,onUnregister:$,pickVendor:de,startLoginFlow:oe,runProbe:be,runRegister:X,restartFlow:ee,resetWizard:le,ref:T,reactive:ne,computed:Z,watch:ve,get usePersonalDataHub(){return ke}};return Object.defineProperty(fe,"__isScriptSetup",{enumerable:!1,value:!0}),fe}},Zn={key:0},Jn={class:"vendor-head"},$n={class:"hint"},eo={class:"hint",style:{"margin-top":"4px"}},to={key:0,class:"hint",style:{"margin-top":"4px",color:"#ff4d4f"}},no={key:1},oo={class:"hint"},ao=["href"],ro={class:"howto"},io=["href"],lo={key:3,style:{"margin-top":"8px"}},so={key:2,class:"kv",style:{"margin-top":"4px"}},co={key:3,class:"kv",style:{"margin-top":"4px",color:"#ff4d4f"}},uo={key:2};function fo(r,t,u,e,R,P){const g=_("a-alert"),S=_("a-tag"),v=_("a-button"),O=_("a-popconfirm"),x=_("a-card"),U=_("a-col"),N=_("a-row"),M=_("a-collapse-panel"),V=_("a-collapse"),z=_("a-textarea"),B=_("a-form-item"),G=_("a-form"),H=_("a-result"),F=_("a-space"),ie=_("a-drawer");return i(),b(ie,{open:u.open,title:"添加 AI 对话账号",placement:"right",width:640,"destroy-on-close":!0,"onUpdate:open":t[4]||(t[4]=D=>e.emit("update:open",D)),onClose:e.resetWizard},{footer:o(()=>[a(F,{style:{float:"right"}},{default:o(()=>[e.step>1&&e.step<3?(i(),b(v,{key:0,onClick:t[3]||(t[3]=D=>e.step=e.step-1)},{default:o(()=>[...t[22]||(t[22]=[l("上一步",-1)])]),_:1})):m("v-if",!0),a(v,{onClick:e.resetWizard},{default:o(()=>[...t[23]||(t[23]=[l("取消",-1)])]),_:1}),e.step===1?(i(),b(v,{key:1,type:"primary",disabled:!e.selectedVendor,loading:e.loading.open,onClick:e.startLoginFlow},{default:o(()=>[...t[24]||(t[24]=[l(" 下一步 ",-1)])]),_:1},8,["disabled","loading"])):m("v-if",!0),e.step===2&&e.openResult?.fallbackMode==="paste"?(i(),b(v,{key:2,loading:e.loading.probe,disabled:!e.cookieHeader.trim(),onClick:e.runProbe},{default:o(()=>[...t[25]||(t[25]=[l(" 检测 cookie ",-1)])]),_:1},8,["loading","disabled"])):m("v-if",!0),e.step===2&&e.openResult?.fallbackMode!=="paste"?(i(),b(v,{key:3,loading:e.loading.probe,onClick:e.runProbe},{default:o(()=>[...t[26]||(t[26]=[l(" 检测 cookie ",-1)])]),_:1},8,["loading"])):m("v-if",!0),e.step===2?(i(),b(v,{key:4,type:"primary",loading:e.loading.register,disabled:!e.probeResult?.ok,onClick:e.runRegister},{default:o(()=>[...t[27]||(t[27]=[l(" 注册 ",-1)])]),_:1},8,["loading","disabled"])):m("v-if",!0)]),_:1})]),default:o(()=>[a(g,{message:`第 ${e.step} / 3 步`,description:e.stepDescription,type:"info","show-icon":"",style:{"margin-bottom":"16px"}},null,8,["message","description"]),e.step===1?(i(),h("div",Zn,[t[10]||(t[10]=k("p",{class:"hint"}," 选择要接入的 AI 服务商。登录后将本地读取 cookie 同步对话历史;cookie 仅落本机加密文件,不上传任何云端。 ",-1)),a(N,{gutter:[12,12]},{default:o(()=>[(i(),h(Y,null,re(e.vendors,D=>a(U,{xs:24,sm:12,md:8,key:D.vendor},{default:o(()=>[a(x,{size:"small",hoverable:"",class:Ht(["vendor-card",{selected:e.selectedVendor===D.vendor}]),onClick:$=>e.pickVendor(D.vendor)},{default:o(()=>[k("div",Jn,[k("strong",null,p(D.displayName),1),e.healthOf(D.vendor)==="fail"?(i(),b(S,{key:0,color:"red"},{default:o(()=>[...t[5]||(t[5]=[l("🔴 重新登录",-1)])]),_:1})):e.healthOf(D.vendor)==="mismatch"?(i(),b(S,{key:1,color:"orange"},{default:o(()=>[...t[6]||(t[6]=[l("⚠ 规格升级",-1)])]),_:1})):e.healthOf(D.vendor)==="unknown"?(i(),b(S,{key:2,color:"blue"},{default:o(()=>[...t[7]||(t[7]=[l("已接入·待巡检",-1)])]),_:1})):e.healthOf(D.vendor)==="ok"?(i(),b(S,{key:3,color:"green"},{default:o(()=>[...t[8]||(t[8]=[l("✓ 已接入",-1)])]),_:1})):m("v-if",!0)]),k("div",$n,p(D.notes),1),k("div",eo,[a(S,{color:"default"},{default:o(()=>[l(p(D.requiredCookies.length)+" 必需 cookie",1)]),_:2},1024),a(S,{color:"default"},{default:o(()=>[l("过期约 "+p(D.cookieMaxAgeHintDays)+" 天",1)]),_:2},1024)]),e.isRegistered(D.vendor)&&e.healthReasonOf(D.vendor)?(i(),h("div",to,p(e.healthReasonOf(D.vendor)),1)):m("v-if",!0),e.isRegistered(D.vendor)?(i(),h("div",{key:1,class:"vendor-actions",onClick:t[0]||(t[0]=Kt(()=>{},["stop"]))},[a(O,{title:"注销该 AI 对话来源?历史事件仍可在 vault 中查询。","ok-text":"注销","cancel-text":"取消",onConfirm:$=>e.onUnregister(D.vendor)},{default:o(()=>[a(v,{size:"small",type:"text",danger:""},{default:o(()=>[...t[9]||(t[9]=[l("注销",-1)])]),_:1})]),_:1},8,["onConfirm"])])):m("v-if",!0)]),_:2},1032,["class","onClick"])]),_:2},1024)),64))]),_:1})])):m("v-if",!0),e.step===2&&e.openResult?(i(),h("div",no,[k("p",oo,[k("strong",null,p(e.currentVendorMeta.displayName),1),t[11]||(t[11]=l(" · ",-1)),k("a",{href:e.openResult.loginUrl,target:"_blank",rel:"noopener noreferrer"},p(e.openResult.loginUrl),9,ao)]),e.openResult.fallbackMode==="paste"?(i(),b(g,{key:0,message:e.openResult.helpText||"请在外部浏览器登录后从开发者工具复制全部 cookie 字符串粘贴到下方。",type:"warning","show-icon":"",style:{"margin-bottom":"12px"}},null,8,["message"])):(i(),b(g,{key:1,message:"桌面端:请在弹出的内嵌浏览器窗口登录后点击 “检测 cookie”。",type:"info","show-icon":"",style:{"margin-bottom":"12px"}})),e.openResult.fallbackMode==="paste"?(i(),b(V,{key:2,bordered:!1,style:{"margin-bottom":"12px"}},{default:o(()=>[a(M,{key:"howto",header:"如何获取 cookie 字符串?"},{default:o(()=>[k("ol",ro,[k("li",null,[t[12]||(t[12]=l("用 Chrome / Edge 打开 ",-1)),k("a",{href:e.openResult.loginUrl,target:"_blank"},p(e.openResult.loginUrl),9,io)]),t[13]||(t[13]=k("li",null,"完成登录,进入对话页",-1)),t[14]||(t[14]=k("li",null,[l("按 "),k("kbd",null,"F12"),l(" 打开开发者工具 → "),k("strong",null,"Application"),l(" → "),k("strong",null,"Cookies")],-1)),t[15]||(t[15]=k("li",null,"选中域名 → 全选所有 cookie 行 → 用扩展(如 EditThisCookie)导出 “name=value; …” 串",-1)),t[16]||(t[16]=k("li",null,[l("或在 Console 执行 "),k("code",null,"document.cookie"),l(" 复制结果(注意:HTTP-Only cookie 取不到,仍需 Application 面板)")],-1)),t[17]||(t[17]=k("li",null,"粘贴到下方文本框,点 “检测 cookie”",-1))])]),_:1})]),_:1})):m("v-if",!0),a(G,{layout:"vertical"},{default:o(()=>[a(B,{label:"Cookie 字符串"},{default:o(()=>[a(z,{value:e.cookieHeader,"onUpdate:value":t[1]||(t[1]=D=>e.cookieHeader=D),rows:6,placeholder:"name1=value1; name2=value2; name3=value3 …",autocomplete:"off"},null,8,["value"])]),_:1})]),_:1}),e.probeResult?(i(),h("div",lo,[e.probeResult.ok?(i(),b(g,{key:0,type:"success","show-icon":"",message:`已识别 ${e.probeResult.foundRequired.length} 个必需 cookie + ${e.probeResult.foundOptional.length} 个可选 cookie`},null,8,["message"])):(i(),b(g,{key:1,type:"error","show-icon":"",message:e.probeFailMessage},null,8,["message"])),e.probeResult.foundRequired?.length?(i(),h("div",so," ✓ "+p(e.probeResult.foundRequired.join(", ")),1)):m("v-if",!0),e.probeResult.missingRequired?.length?(i(),h("div",co," 缺失: "+p(e.probeResult.missingRequired.join(", ")),1)):m("v-if",!0)])):m("v-if",!0)])):m("v-if",!0),e.step===3?(i(),h("div",uo,[e.registerResult?.ok?(i(),b(H,{key:0,status:"success",title:`${e.currentVendorMeta.displayName} 已接入`,"sub-title":`accountId: ${e.registerResult.accountId} · userId: ${e.registerResult.validation?.userId||"匿名"}`},{extra:o(()=>[a(v,{type:"primary",onClick:e.resetWizard},{default:o(()=>[...t[18]||(t[18]=[l("完成",-1)])]),_:1}),a(v,{onClick:e.restartFlow},{default:o(()=>[...t[19]||(t[19]=[l("再加一家",-1)])]),_:1})]),_:1},8,["title","sub-title"])):(i(),b(H,{key:1,status:"error",title:"接入失败","sub-title":e.registerFailMessage},{extra:o(()=>[a(v,{type:"primary",onClick:t[2]||(t[2]=D=>e.step=2)},{default:o(()=>[...t[20]||(t[20]=[l("返回粘贴 cookie",-1)])]),_:1}),a(v,{onClick:e.restartFlow},{default:o(()=>[...t[21]||(t[21]=[l("选其他厂商",-1)])]),_:1})]),_:1},8,["sub-title"]))])):m("v-if",!0)]),_:1},8,["open"])}const po=Le(Xn,[["render",fo],["__scopeId","data-v-4ed94be5"],["__file","/tmp/cc-web-panel-8U3FtY/repo/packages/web-panel/src/components/AIChatWizard.vue"]]),mo={__name:"PdhOAuthCollectorDrawer",props:{open:{type:Boolean,default:!1},source:{type:Object,default:null}},emits:["update:open","collect"],setup(r,{expose:t,emit:u}){t();const e=r,R=u,P=ne({accessToken:"",accountId:"",dir:"",driveId:"",parentId:"0",appId:"",appKey:"",recursive:!0}),g=Z(()=>Pe(e.source)),S=Z(()=>e.source?.name==="doc-baidu-netdisk"?"百度网盘 OAuth 采集":e.source?.name==="doc-wps"?"WPS OAuth 采集":"OAuth 授权采集"),v=Z(()=>je(e.source,P)!==null);function O(){P.accessToken="",P.accountId="",P.dir="",P.driveId="",P.parentId="0",P.appId="",P.appKey="",P.recursive=!0}function x(){O(),R("update:open",!1)}function U(){const M=je(e.source,P);if(!M)return;const V=e.source.name;O(),R("update:open",!1),R("collect",{name:V,options:M})}ve(()=>[e.open,e.source?.name],([M])=>{M&&O()}),Ct(O);const N={props:e,emit:R,form:P,spec:g,title:S,canSubmit:v,resetForm:O,close:x,submit:U,computed:Z,onBeforeUnmount:Ct,reactive:ne,watch:ve,get oauthCollectionOptions(){return je},get oauthCollectionSpec(){return Pe}};return Object.defineProperty(N,"__isScriptSetup",{enumerable:!1,value:!0}),N}};function yo(r,t,u,e,R,P){const g=_("a-alert"),S=_("a-input-password"),v=_("a-input"),O=_("a-form-item"),x=_("a-checkbox"),U=_("a-form"),N=_("a-empty"),M=_("a-button"),V=_("a-space"),z=_("a-drawer");return i(),b(z,{open:u.open,title:e.title,placement:"right",width:"520","destroy-on-close":!0,onClose:e.close},{footer:o(()=>[a(V,null,{default:o(()=>[a(M,{onClick:e.close},{default:o(()=>[...t[2]||(t[2]=[l("取消",-1)])]),_:1}),a(M,{type:"primary",disabled:!e.canSubmit,onClick:e.submit},{default:o(()=>[...t[3]||(t[3]=[l(" 开始采集 ",-1)])]),_:1},8,["disabled"])]),_:1})]),default:o(()=>[a(g,{type:"info","show-icon":"",message:"凭据仅用于本次官方 API 采集",description:"access token 与 App Key 不会写入本地配置、数据中台、审计日志或同步水位。提交后表单会立即清空。",style:{"margin-bottom":"16px"}}),e.spec?(i(),b(U,{key:0,layout:"vertical",model:e.form},{default:o(()=>[(i(!0),h(Y,null,re(e.spec.fields,B=>(i(),b(O,{key:B.key,label:B.label,required:B.required===!0},{default:o(()=>[B.secret?(i(),b(S,{key:0,value:e.form[B.key],"onUpdate:value":G=>e.form[B.key]=G,"data-field":B.key,placeholder:B.placeholder,autocomplete:"new-password",spellcheck:!1},null,8,["value","onUpdate:value","data-field","placeholder"])):(i(),b(v,{key:1,value:e.form[B.key],"onUpdate:value":G=>e.form[B.key]=G,"data-field":B.key,placeholder:B.placeholder,autocomplete:"off",spellcheck:!1},null,8,["value","onUpdate:value","data-field","placeholder"]))]),_:2},1032,["label","required"]))),128)),a(O,{label:"扫描范围"},{default:o(()=>[a(x,{checked:e.form.recursive,"onUpdate:checked":t[0]||(t[0]=B=>e.form.recursive=B)},{default:o(()=>[...t[1]||(t[1]=[l(" 递归采集子目录 ",-1)])]),_:1},8,["checked"])]),_:1}),u.source?.name==="doc-wps"?(i(),b(g,{key:0,type:"warning","show-icon":"",message:"App ID 与 App Key 必须同时填写或同时留空"})):m("v-if",!0)]),_:1},8,["model"])):(i(),b(N,{key:1,description:"该来源没有可用的 OAuth 采集配置"}))]),_:1},8,["open","title"])}const go=Le(mo,[["render",yo],["__file","/tmp/cc-web-panel-8U3FtY/repo/packages/web-panel/src/components/PdhOAuthCollectorDrawer.vue"]]),vo={__name:"WechatWizard",props:{open:{type:Boolean,default:!1}},emits:["update:open","registered"],setup(r,{expose:t,emit:u}){t();const e=r,R=u,P=ke(),g=T(1),S=T(null),v=ne({uin:"",dbPath:"",wechatDataPath:"",forceProvider:null}),O=T(null),x=ne({probe:!1,register:!1}),U=Z(()=>g.value===1?"探测设备 + WeChat 版本,确认可用的 keyProvider":g.value===2?"填 UIN 与已 adb-pull 的本地路径":"bootstrap 注册 + 持久化 wechat-accounts.json"),N=Z(()=>{const H=O.value;return H?H.reason==="ENV_UNSUPPORTED"?H.message||"env-probe 拒绝 — 请回到第 1 步看 reasons":H.reason==="MD5_NEEDS_WECHAT_DATA_PATH"?"MD5 路径需要 wechatDataPath":H.reason==="FRIDA_NEEDS_WXID"?"Frida 路径需要 account.uin / wxid":H.reason==="ADAPTER_CTOR_FAILED"?`Adapter ctor 抛错: ${H.message||""}`:H.reason==="BOOTSTRAP_THREW"?`Bootstrap 抛错: ${H.message||""}`:H.reason==="UIN_REQUIRED"?"UIN 不能为空":H.message||H.reason||"注册失败":"未知错误"});async function M(){x.probe=!0;try{S.value=await P.probeWechatEnv()}catch(H){S.value={ok:!1,suggestedKeyProvider:"unsupported",reasons:[H?.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 V(){x.register=!0;try{O.value=await P.registerWechat({account:{uin:v.uin},dbPath:v.dbPath||null,wechatDataPath:v.wechatDataPath||null,keyProviderOverride:v.forceProvider}),g.value=3,O.value?.ok&&R("registered",{uin:v.uin,chosenKeyProvider:O.value.chosenKeyProvider})}catch(H){O.value={ok:!1,reason:"BOOTSTRAP_THREW",message:H?.message||"RPC failed"},g.value=3}finally{x.register=!1}}function z(){g.value=1,S.value=null,v.uin="",v.dbPath="",v.wechatDataPath="",v.forceProvider=null,O.value=null}function B(){z(),R("update:open",!1)}ve(()=>e.open,H=>{H&&z()});const G={props:e,emit:R,hub:P,step:g,probe:S,form:v,registerResult:O,loading:x,stepDescription:U,registerFailMessage:N,runProbe:M,runRegister:V,restartFlow:z,resetWizard:B,ref:T,reactive:ne,computed:Z,watch:ve,get usePersonalDataHub(){return ke}};return Object.defineProperty(G,"__isScriptSetup",{enumerable:!1,value:!0}),G}},ko={key:0},_o={key:0,class:"probe-result"},bo={key:0,class:"kv"},ho={key:0,class:"kv"},Ao={key:1},Oo={key:2},Co={key:2,style:{"margin-top":"12px"}};function wo(r,t,u,e,R,P){const g=_("a-alert"),S=_("a-button"),v=_("a-tag"),O=_("a-descriptions-item"),x=_("a-descriptions"),U=_("a-input"),N=_("a-form-item"),M=_("a-radio"),V=_("a-radio-group"),z=_("a-form"),B=_("a-result"),G=_("a-space"),H=_("a-drawer");return i(),b(H,{open:u.open,title:"添加 WeChat 账号",placement:"right",width:640,"destroy-on-close":!0,"onUpdate:open":t[8]||(t[8]=F=>e.emit("update:open",F)),onClose:e.resetWizard},{footer:o(()=>[a(G,{style:{float:"right"}},{default:o(()=>[e.step>1&&e.step<3?(i(),b(S,{key:0,onClick:t[6]||(t[6]=F=>e.step=e.step-1)},{default:o(()=>[...t[21]||(t[21]=[l("上一步",-1)])]),_:1})):m("v-if",!0),a(S,{onClick:e.resetWizard},{default:o(()=>[...t[22]||(t[22]=[l("取消",-1)])]),_:1}),e.step===1?(i(),b(S,{key:1,type:"primary",disabled:!e.probe||e.probe.suggestedKeyProvider==="unsupported",onClick:t[7]||(t[7]=F=>e.step=2)},{default:o(()=>[...t[23]||(t[23]=[l(" 下一步 ",-1)])]),_:1},8,["disabled"])):m("v-if",!0),e.step===2?(i(),b(S,{key:2,type:"primary",loading:e.loading.register,disabled:!e.form.uin||e.probe?.suggestedKeyProvider==="md5"&&!e.form.wechatDataPath,onClick:e.runRegister},{default:o(()=>[...t[24]||(t[24]=[l(" 注册 ",-1)])]),_:1},8,["loading","disabled"])):m("v-if",!0)]),_:1})]),default:o(()=>[a(g,{message:`第 ${e.step} / 3 步`,description:e.stepDescription,type:"info","show-icon":"",style:{"margin-bottom":"16px"}},null,8,["message","description"]),e.step===1?(i(),h("div",ko,[t[11]||(t[11]=k("p",{class:"hint"},[l(" 请用 USB 连接 Android 设备(开启 USB 调试)。WeChat ≥ 8.0 需要 root + frida-server。 探测仅读取 "),k("code",null,"adb shell"),l(" 命令输出,不写入任何东西。 ")],-1)),a(S,{type:"primary",loading:e.loading.probe,onClick:e.runProbe,style:{"margin-bottom":"12px"}},{default:o(()=>[...t[9]||(t[9]=[l(" 🔍 探测环境 ",-1)])]),_:1},8,["loading"]),e.probe?(i(),h("div",_o,[a(x,{column:1,size:"small",bordered:""},{default:o(()=>[a(O,{label:"suggestedKeyProvider"},{default:o(()=>[a(v,{color:e.probe.suggestedKeyProvider==="unsupported"?"red":"green"},{default:o(()=>[l(p(e.probe.suggestedKeyProvider),1)]),_:1},8,["color"])]),_:1}),a(O,{label:"adb 设备"},{default:o(()=>[a(v,{color:e.probe.device.reachable?"green":"red"},{default:o(()=>[l(p(e.probe.device.reachable?"已连接":"未连接"),1)]),_:1},8,["color"]),e.probe.device.serial?(i(),h("span",bo,p(e.probe.device.serial)+" · abi="+p(e.probe.device.abi||"?"),1)):m("v-if",!0)]),_:1}),a(O,{label:"root"},{default:o(()=>[a(v,{color:e.probe.root.detected?"green":"default"},{default:o(()=>[l(p(e.probe.root.detected?"已 root":"未 root"),1)]),_:1},8,["color"]),e.probe.root.magiskInstalled?(i(),b(v,{key:0,color:"blue"},{default:o(()=>[...t[10]||(t[10]=[l("Magisk",-1)])]),_:1})):m("v-if",!0)]),_:1}),a(O,{label:"frida-server"},{default:o(()=>[a(v,{color:e.probe.frida.serverRunning?"green":"default"},{default:o(()=>[l(p(e.probe.frida.serverRunning?"运行中":"未运行"),1)]),_:1},8,["color"]),e.probe.frida.port?(i(),h("span",ho," :"+p(e.probe.frida.port),1)):m("v-if",!0)]),_:1}),a(O,{label:"WeChat"},{default:o(()=>[a(v,{color:e.probe.wechat.installed?"green":"red"},{default:o(()=>[l(p(e.probe.wechat.installed?e.probe.wechat.versionName:"未安装"),1)]),_:1},8,["color"])]),_:1})]),_:1}),(i(!0),h(Y,null,re(e.probe.reasons||[],F=>(i(),b(g,{key:F,message:F,type:"info","show-icon":"",style:{"margin-top":"8px"}},null,8,["message"]))),128)),(i(!0),h(Y,null,re(e.probe.warnings||[],F=>(i(),b(g,{key:F,message:F,type:"warning","show-icon":"",style:{"margin-top":"8px"}},null,8,["message"]))),128))])):m("v-if",!0)])):m("v-if",!0),e.step===2?(i(),h("div",Ao,[t[16]||(t[16]=k("p",{class:"hint"},[l(" 填写从 adb pull 拉下来的本地路径。MD5 路径(7.x)需要 "),k("code",null,"wechatDataPath"),l("; Frida 路径(8.0+)需要设备运行 frida-server。 ")],-1)),a(z,{layout:"vertical"},{default:o(()=>[a(N,{label:"UIN / wxid",required:""},{default:o(()=>[a(U,{value:e.form.uin,"onUpdate:value":t[0]||(t[0]=F=>e.form.uin=F),placeholder:"WeChat 数字 UIN 或 wxid"},null,8,["value"])]),_:1}),a(N,{label:"dbPath(已拉下的 EnMicroMsg.db 本地路径)"},{default:o(()=>[a(U,{value:e.form.dbPath,"onUpdate:value":t[1]||(t[1]=F=>e.form.dbPath=F),placeholder:"C:\\\\users\\\\me\\\\pull\\\\EnMicroMsg.db"},null,8,["value"])]),_:1}),a(N,{label:"wechatDataPath(已拉下的 /data/data/com.tencent.mm/ 目录)"},{default:o(()=>[a(U,{value:e.form.wechatDataPath,"onUpdate:value":t[2]||(t[2]=F=>e.form.wechatDataPath=F),placeholder:"C:\\\\users\\\\me\\\\pull\\\\com.tencent.mm"},null,8,["value"]),t[12]||(t[12]=k("div",{class:"hint"},"MD5 路径必填;Frida 路径可空",-1))]),_:1}),a(N,{label:"强制 keyProvider(覆盖 env-probe 建议)"},{default:o(()=>[a(V,{value:e.form.forceProvider,"onUpdate:value":t[3]||(t[3]=F=>e.form.forceProvider=F)},{default:o(()=>[a(M,{value:null},{default:o(()=>[...t[13]||(t[13]=[l("自动(推荐)",-1)])]),_:1}),a(M,{value:"md5"},{default:o(()=>[...t[14]||(t[14]=[l("md5",-1)])]),_:1}),a(M,{value:"frida"},{default:o(()=>[...t[15]||(t[15]=[l("frida",-1)])]),_:1})]),_:1},8,["value"])]),_:1})]),_:1})])):m("v-if",!0),e.step===3?(i(),h("div",Oo,[e.registerResult?.ok?(i(),b(B,{key:0,status:"success",title:`WeChat 已接入 (uin=${e.form.uin})`,"sub-title":`provider=${e.registerResult.chosenKeyProvider} · sensitivity=${e.registerResult.sensitivity}`},{extra:o(()=>[a(S,{type:"primary",onClick:e.resetWizard},{default:o(()=>[...t[17]||(t[17]=[l("完成",-1)])]),_:1}),a(S,{onClick:e.restartFlow},{default:o(()=>[...t[18]||(t[18]=[l("再加一个",-1)])]),_:1})]),_:1},8,["title","sub-title"])):(i(),b(B,{key:1,status:"error",title:"接入失败","sub-title":e.registerFailMessage},In({_:2},[e.registerResult?.probe?.reasons?.length?{name:"extra",fn:o(()=>[a(S,{onClick:t[4]||(t[4]=F=>e.step=1)},{default:o(()=>[...t[19]||(t[19]=[l("返回检查环境",-1)])]),_:1}),a(S,{onClick:t[5]||(t[5]=F=>e.step=2)},{default:o(()=>[...t[20]||(t[20]=[l("返回修改路径",-1)])]),_:1})]),key:"0"}:void 0]),1032,["sub-title"])),e.registerResult?.probe?.reasons?.length?(i(),h("div",Co,[(i(!0),h(Y,null,re(e.registerResult.probe.reasons,F=>(i(),b(g,{key:F,message:F,type:"warning","show-icon":"",style:{"margin-bottom":"4px"}},null,8,["message"]))),128))])):m("v-if",!0)])):m("v-if",!0)]),_:1},8,["open"])}const So=Le(vo,[["render",wo],["__scopeId","data-v-2f50c8a7"],["__file","/tmp/cc-web-panel-8U3FtY/repo/packages/web-panel/src/components/WechatWizard.vue"]]),Ve="pdh.syncIncludeOptions.v1",Io={__name:"PersonalDataHub",setup(r,{expose:t}){const u=ke(),e=T(null),R=T(null),P=T([]),g=T({}),S=T(""),v=T(null),O=T(""),x=T(!1),U=T(!1),N=T([]),M=T(null);function V(){try{const n=localStorage.getItem(Ve);if(!n)return Ye();const c=JSON.parse(n);return{"system-data-android":{...Qe["system-data-android"],...c["system-data-android"]||{}}}}catch{return Ye()}}const z=ne(V());function B(){try{localStorage.setItem(Ve,JSON.stringify(z)),console.log("[PDH-include] persisted:",JSON.stringify(z))}catch(n){console.warn("[PDH-include] persist failed:",n&&n.message)}}const G=T({});function H(n){return Object.prototype.hasOwnProperty.call(xe,n)}function F(n,c,d){const f=d&&d.target?!!d.target.checked:!!d;console.log("[PDH-include] toggle",n,c,"=>",f),z[n]||(z[n]={}),z[n][c]=f,B()}const ie=T(!1),D=ne({provider:"qq",email:"",authCode:"",host:"",port:993,pdfPasswordHints:{idCardLast6:"",phoneLast6:"",cardLast6:""}}),$=T(null),de=T(!1),oe=T(null),be=T([]),X=T(!1),ee=T(null),le=T(null),fe=[{name:"analysis.spending",label:"消费分析",icon:St,description:"总支出 / 商家排行 / 月度趋势"},{name:"analysis.relations",label:"人际关系",icon:It,description:"与每个人的互动频率 / 主动比例"},{name:"analysis.footprint",label:"足迹",icon:Dt,description:"常去地点 / 出行模式"},{name:"analysis.interests",label:"兴趣画像",icon:Et,description:"从购买 / 浏览 / 收藏抽兴趣"},{name:"analysis.timeline",label:"时间线",icon:Rt,description:"跨源事件串成故事"}],E=T(!1),K=T([]),J=ne({queue:{pending:0},mergeGroups:0,reviewQueue:0}),Ue=T(!1),Ce=T([]);function we(n){n?.unregistered?y.success(`已注销 ${n.vendor}`):y.success(`已接入 ${n.vendor}`),j()}const Se=T(!1);function Me(n){y.success(`WeChat 已接入 (uin=${n.uin}, provider=${n.chosenKeyProvider})`),j()}const Be=T(!1),s=ne({email:"",zipPassword:"",filePath:""}),C=T(null),w=ne({active:!1,batchMode:!1,adapter:"",phase:"",mailbox:"",current:0,total:0,attempt:1,errorMessage:""}),A=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,bilibiliAdbSync:!1,bilibiliAdbDoctor:!1,douyinAdbSync:!1,weiboAdbSync:!1,xhsAdbSync:!1,toutiaoAdbSync:!1,kuaishouAdbSync:!1,bridgeDoctor:!1}),Ge=T(null);function Ne(n){switch(n){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 Xe(n){switch(n){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 Ze(n){switch(n){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 Je(n){switch(n){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 $e(){if(!A.xhsAdbSync){A.xhsAdbSync=!0;try{const n=await u.xhsAdbSync({});if(!n||!n.ok){const I=n&&n.reason||"SYNC_FAILED",L=Je(I),q=n&&n.message||"";y.error({content:`Xhs ADB 同步失败:${L}`,description:q,duration:8});return}const c=n.report||{},d=c.xhs||{},f=d.eventCounts||{};d.meFetchFailed?y.warning({content:"Xhs 同步未拉到 user_id — /user/me 返空 data",description:`lastErrorCode=${d.lastErrorCode}, ${d.lastErrorMessage||""}。可能 cookie 已过期或 web_session 缺失,请在手机重新登录。`,duration:10}):d.lastErrorCode===461?y.warning({content:"Xhs X-S 签名被拒 (461) — 部分接口未抓到",description:`命中 ${f.total||0} events。我们的 X-S 算法 best-effort (~60% GET / <30% POST hit),461 在 POST 较常见。稍后重试 (X-S 算法可能 4-8 周 rotate)。`,duration:10}):d.lastErrorCode?y.warning({content:`Xhs 同步部分完成 (${f.total||0} events)`,description:`lastErrorCode=${d.lastErrorCode}, ${d.lastErrorMessage||""}`,duration:8}):y.success(`Xhs 同步成功:notes=${f.note||0} / liked=${f.liked||0} / follow=${f.follow||0} (total=${f.total||0})${d.nickname?" ["+d.nickname+"]":""}`),M.value=c,j()}catch(n){y.error({content:"Xhs ADB 同步异常",description:n&&n.message?n.message:String(n),duration:8})}finally{A.xhsAdbSync=!1}}}function et(n){switch(n){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 tt(){if(!A.toutiaoAdbSync){A.toutiaoAdbSync=!0;try{const n=await u.toutiaoAdbSync({});if(!n||!n.ok){const I=n&&n.reason||"SYNC_FAILED",L=et(I),q=n&&n.message||"";y.error({content:`Toutiao ADB 同步失败:${L}`,description:q,duration:8});return}const c=n.report||{},d=c.toutiao||{},f=d.eventCounts||{};d.profileFetchFailed?y.warning({content:"Toutiao 同步未拉到 user_id — passport/info/v2 返失败",description:`lastErrorCode=${d.lastErrorCode}, ${d.lastErrorMessage||""}。可能 cookie 已过期或 sessionid 缺失,请在手机重新登录。`,duration:10}):d.signProviderUsed==="none"&&f.feed===0&&f.collection===0&&f.search===0?y.warning({content:`Toutiao 同步仅获取了 profile (${f.profile||0} event)`,description:"当前 web-shell 上下文不支持 _signature 签名(仅 desktop app 提供 ToutiaoSignBridge)。打开桌面 app 同步可获取 feed / collection / search。",duration:12}):d.lastErrorCode?y.warning({content:`Toutiao 同步部分完成 (${f.total||0} events)`,description:`lastErrorCode=${d.lastErrorCode}, ${d.lastErrorMessage||""}`,duration:8}):y.success(`Toutiao 同步成功:profile=${f.profile||0} / feed=${f.feed||0} / collection=${f.collection||0} / search=${f.search||0} (total=${f.total||0})${d.nickname?" ["+d.nickname+"]":""}`),M.value=c,j()}catch(n){y.error({content:"Toutiao ADB 同步异常",description:n&&n.message?n.message:String(n),duration:8})}finally{A.toutiaoAdbSync=!1}}}function nt(n){switch(n){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 ot(){if(!A.kuaishouAdbSync){A.kuaishouAdbSync=!0;try{const n=await u.kuaishouAdbSync({});if(!n||!n.ok){const I=n&&n.reason||"SYNC_FAILED",L=nt(I),q=n&&n.message||"";y.error({content:`Kuaishou ADB 同步失败:${L}`,description:q,duration:8});return}const c=n.report||{},d=c.kuaishou||{},f=d.eventCounts||{};d.profileFetchFailed?y.warning({content:"Kuaishou 同步 cookie 缺 api_ph payload",description:`lastErrorCode=${d.lastErrorCode}, ${d.lastErrorMessage||""}。可能 cookie 已过期或登录态不完整(仅有 userId 但没有 api_ph),请在手机重新登录。`,duration:10}):d.signProviderUsed==="none"&&f.watch===0&&f.collect===0&&f.search===0?y.warning({content:`Kuaishou 同步仅获取了 profile (${f.profile||0} event)`,description:"当前 web-shell 上下文不支持 __NS_sig3 签名(仅 desktop app 提供 KuaishouSignBridge)。打开桌面 app 同步可获取 watch / collect / search。",duration:12}):d.lastErrorCode?y.warning({content:`Kuaishou 同步部分完成 (${f.total||0} events)`,description:`lastErrorCode=${d.lastErrorCode}, ${d.lastErrorMessage||""}`,duration:8}):y.success(`Kuaishou 同步成功:profile=${f.profile||0} / watch=${f.watch||0} / collect=${f.collect||0} / search=${f.search||0} (total=${f.total||0})${d.nickname?" ["+d.nickname+"]":""}`),M.value=c,j()}catch(n){y.error({content:"Kuaishou ADB 同步异常",description:n&&n.message?n.message:String(n),duration:8})}finally{A.kuaishouAdbSync=!1}}}async function jt(){if(!A.bridgeDoctor){A.bridgeDoctor=!0;try{const n=await u.bridgeDoctor();if(!n||!n.ok){const Q=n&&n.reason||"BRIDGE_DOCTOR_FAILED",te=n&&n.message||"";Q==="MODULE_LOAD_FAILED"?y.error({content:"Bridge doctor 不可用",description:"当前上下文不是 Electron desktop app(cli / web-shell-only 无 sign-bridge 模块)。请从桌面 app 运行此诊断。",duration:10}):y.error({content:`Bridge doctor 失败:${Q}`,description:te,duration:8});return}const c=n.results||{},d=["xhs","toutiao","kuaishou"],f=d.filter(Q=>c[Q]&&c[Q].anyCandidatePresent).length,I=d.length,L=[];for(const Q of d){const te=c[Q];if(!te||!te.ok){L.push(`${Q}: ✗ ${te&&te.error?te.error:"unknown error"}`);continue}const Ae=te.candidates||{},Oe=Object.keys(Ae).filter(Sn=>Ae[Sn]===!0),ge=Object.keys(Ae).length,Cn=te.anyCandidatePresent?"✓":"⚠",wn=te.anyCandidatePresent?`${Oe.length}/${ge} candidate(s): ${Oe.join(", ")}`:`0/${ge} candidates (rotation? 需更新 buildSignScript)`;L.push(`${Q}: ${Cn} ${wn} (warmUp=${te.warmUpMs}ms, probe=${te.probeMs}ms)`)}(f===I?y.success:f===0?y.error:y.warning)({content:`Bridge doctor: ${f}/${I} 平台签名可用`,description:L.join(`
|
|
3
|
+
`),duration:15}),Ge.value=n}catch(n){y.error({content:"Bridge doctor 异常",description:n&&n.message?n.message:String(n),duration:8})}finally{A.bridgeDoctor=!1}}}async function at(){if(!A.weiboAdbSync){A.weiboAdbSync=!0;try{const n=await u.weiboAdbSync({});if(!n||!n.ok){const I=n&&n.reason||"SYNC_FAILED",L=Ze(I),q=n&&n.message||"";y.error({content:`Weibo ADB 同步失败:${L}`,description:q,duration:8});return}const c=n.report||{},d=c.weibo||{},f=d.eventCounts||{};d.uidFetchFailed?y.warning({content:"Weibo 同步未拉到 UID — /api/config 返 login=false",description:`lastErrorCode=${d.lastErrorCode}, ${d.lastErrorMessage||""}。可能 cookie 已过期 (请在手机重新登录) 或微博触发 anti-bot redirect。事件数 0,未入 vault。`,duration:10}):d.lastErrorCode?y.warning({content:`Weibo 同步部分完成 (${f.total||0} events)`,description:`lastErrorCode=${d.lastErrorCode}, ${d.lastErrorMessage||""} — 部分接口受反爬限制,稍后重试可补齐`,duration:8}):y.success(`Weibo 同步成功:posts=${f.post||0} / fav=${f.favourite||0} / follow=${f.follow||0} (total=${f.total||0})`),M.value=c,j()}catch(n){y.error({content:"Weibo ADB 同步异常",description:n&&n.message?n.message:String(n),duration:8})}finally{A.weiboAdbSync=!1}}}async function rt(){if(!A.douyinAdbSync){A.douyinAdbSync=!0;try{const n=await u.douyinAdbSync({});if(!n||!n.ok){const L=n&&n.reason||"SYNC_FAILED",q=Xe(L),Q=n&&n.message||"";y.error({content:`Douyin ADB 同步失败:${q}`,description:Q,duration:8});return}const c=n.report||{},d=c.douyin||{},f=d.eventCounts||{},I=d.parserDiagnostic||{};if(!I.hadMsgTable&&!I.hadSimpleUserTable)y.warning({content:"Douyin 同步完成但 0 events",description:"msg 和 SIMPLE_USER 表都未在 IM 数据库中找到 — 抖音 App 版本可能用了不同 schema",duration:10});else if(!I.hadMsgTable||!I.hadSimpleUserTable){const L=[];I.hadMsgTable||L.push("msg (私信)"),I.hadSimpleUserTable||L.push("SIMPLE_USER (联系人)"),y.warning({content:`Douyin 部分同步:msg=${f.message||0} contacts=${f.contact||0}`,description:`${L.join("、")} 表未找到,未入库部分数据`,duration:8})}else y.success(`Douyin 同步成功:messages=${f.message||0} contacts=${f.contact||0} (total=${f.total||0})`);M.value=c,j()}catch(n){y.error({content:"Douyin ADB 同步异常",description:n&&n.message?n.message:String(n),duration:8})}finally{A.douyinAdbSync=!1}}}async function qt(){if(!A.bilibiliAdbDoctor){A.bilibiliAdbDoctor=!0;try{const n=await u.bilibiliAdbDoctor();if(!n||!n.ok){const d=n&&n.reason||"PROBE_FAILED",f=Ne(d),I=n&&n.message||"";y.error({content:`Bilibili 诊断失败:${f}`,description:I,duration:8});return}const c=n.cookieDiagnostic||{};c.hadEncrypted?y.warning({content:`Bilibili 环境就绪 (uid=${n.uid}) — 但发现 Keystore 加密 cookie`,description:`cookies 数=${c.cookieCount||"?"}; 部分行使用 Android Keystore 加密 (跳过)。可能是较新 Bilibili App + Android 14+。可继续同步,但可能数据不全。`,duration:10}):y.success(`Bilibili 环境就绪 — uid=${n.uid}, 找到 ${c.cookieCount||"?"} 个 cookie,可以同步`)}catch(n){y.error({content:"Bilibili 诊断异常",description:n&&n.message?n.message:String(n),duration:8})}finally{A.bilibiliAdbDoctor=!1}}}async function it(){if(!A.bilibiliAdbSync){A.bilibiliAdbSync=!0;try{const n=await u.bilibiliAdbSync({});if(!n||!n.ok){const I=n&&n.reason||"SYNC_FAILED",L=Ne(I),q=n&&n.message||"";y.error({content:`Bilibili ADB 同步失败:${L}`,description:q,duration:8});return}const c=n.report||{},d=c.bilibili||{},f=d.eventCounts||{};d.lastErrorCode?y.warning({content:`Bilibili 同步部分完成 (${f.total||0} events)`,description:`lastErrorCode=${d.lastErrorCode}, ${d.lastErrorMessage||""} — 部分接口受反爬限制,稍后重试可补齐`,duration:8}):y.success(`Bilibili 同步成功:history=${f.history||0} / fav=${f.favourite||0} / dyn=${f.dynamic||0} / follow=${f.follow||0} (total=${f.total||0})`),M.value=c,j()}catch(n){y.error({content:"Bilibili ADB 同步异常",description:n&&n.message?n.message:String(n),duration:8})}finally{A.bilibiliAdbSync=!1}}}const Yt=[{title:"名称",dataIndex:"name",key:"name",width:140},{title:"版本",dataIndex:"version",key:"version",width:70},{title:"就绪状态",key:"readiness",width:220},{title:"能力",key:"capabilities"},{title:"敏感度",key:"sensitivity",width:140},{title:"操作",key:"actions",width:160,align:"right"}];function ze(n){return g.value[n]||null}function Ie(n){const c=P.value.find(f=>f.name===n)||{},d=ze(n)||{};return{...c,...d,name:n,capabilities:d.capabilities||c.capabilities||[]}}const pe=T(!1),De=T(null);function Fe(n){De.value=Ie(n),pe.value=!0}async function Vt(){const n=De.value?.name;await j(),n&&(De.value=Ie(n))}const lt={ready:"green",needs_setup:"orange",unavailable:"default",error:"red"};function Qt(n){return lt[n]||"default"}const st={ready:"可采集",needs_setup:"待配置",unavailable:"不支持",error:"异常"};function Gt(n){return n?st[n.status]||n.status:"检测中"}const dt={local:"本机直采",snapshot:"需手机采集",device:"需 root/本地解密",credential:"需登录授权",platform:"平台限制"};function Xt(n){return dt[n]||n||""}const ct=new Set(["wechat-pc","qq-pc","dingtalk-pc","feishu-pc","messaging-whatsapp"]),ut=new Set(["alipay-bill"]),ft=Object.freeze({"social-bilibili":it,"social-weibo":at,"social-douyin":rt,"social-xiaohongshu":$e,"social-toutiao":tt,"social-kuaishou":ot});function pt(n){return _e(n)}function Zt(n){return Tt(n)}function Jt(n){return xt(n)}function $t(n){return Lt(n)}async function en(n){const c=Ie(n),d=pt(c);if(d==="file"){const f=await u.pickFile({title:`选择 ${c&&c.guide?c.guide.displayName:n} 的数据文件`});if(!f){y.info("已取消选择文件");return}let I,L;ct.has(n)?I=window.prompt("如数据库已解密为明文,直接确定即可;若为加密库,请粘贴密钥或输入密钥文件路径:")||void 0:ut.has(n)&&/\.zip$/i.test(f)&&(L=window.prompt("请输入支付宝账单 ZIP 密码;如该 ZIP 未加密可直接确定:")||void 0),await mt(n,f,{key:I,zipPassword:L})}else if(d==="directory"){const f=Array.isArray(c?.capabilities)?c.capabilities:[],I=f.includes("sync:scan-directory"),L=!I&&f.includes("sync:profile-directory"),q=I?"扫描":L?"配置":"导出",Q=await Bt({pickDirectoryResult:ge=>u.pickDirectoryResult(ge),prompt:ge=>window.prompt(ge),title:`选择 ${c&&c.guide?c.guide.displayName:n} 的本地${q}目录`,directoryKind:q});if(Q.status==="cancelled"){y.info(Q.manual?"已取消输入主机目录":"已取消选择目录");return}if(Q.status==="invalid"){y.warning("请输入 ChainlessChain 主机上的绝对目录路径;相对路径不会用于采集");return}const te=Q.path;Q.manual&&y.info("将从运行 ChainlessChain 的主机读取手工指定目录");const Ae=L||I?null:(window.prompt("请输入一个稳定的本地账号标识,用于隔离同步水位(原文不会写入数据中台):")||"").trim(),Oe=Mt(c,te,Ae);if(!Oe){y.info("已取消:需要本地账号标识才能安全隔离同步水位");return}await yt(n,Oe)}else if(d==="cookie"){const f=window.prompt("粘贴登录态 Cookie(在已登录的网页 DevTools → Application → Cookies 复制,或整条 Cookie 请求头):");if(!f||!f.trim()){y.info("已取消");return}const I=window.prompt("输入该平台账号的稳定标识(若接口需要用户名/UID,请填写真实平台标识;否则可用本地别名。只会持久化其哈希同步水位):");if(!I||!I.trim()){y.info("已取消:需要账号标识才能安全隔离同步水位");return}let L;if(Te(c)&&(L=window.prompt("粘贴本次授权会话中捕获的滴滴订单接口 HTTPS URL(仅允许 xiaojukeji.com 官方域名,不会保存):"),!L||!L.trim())){y.info("已取消:该数据源需要本次使用的 HTTPS 订单接口");return}const q=Ut(c,f,I,L);if(!q){y.error("采集参数无效:请检查 Cookie、账号标识和 HTTPS 接口");return}await He(n,q)}else if(d==="oauth")ee.value=c,X.value=!0;else if(d==="adb"){const f=ft[n];if(!f){Fe(n);return}A.sync[n]=!0;try{await f()}finally{A.sync[n]=!1}}else d==="sync"?(await vt(n))?.completed&&(pe.value=!1):Fe(n)}async function tn({name:n,options:c}){await He(n,c)}async function He(n,c){A.sync[n]=!0,me(n);try{let d;typeof u.syncAdapterStream=="function"?d=await u.syncAdapterStream(n,c,ye):d=await u.syncAdapter(n,c),he(n,d,"采集").completed&&(pe.value=!1),await j()}catch(d){y.error(`采集 ${n} 失败: ${d.message}`)}finally{A.sync[n]=!1,w.active=!1}}async function mt(n,c,d={}){A.sync[n]=!0,me(n);try{const f={inputPath:c};d.key&&(f.key=d.key),d.zipPassword&&(f.zipPassword=d.zipPassword);let I;typeof u.syncAdapterStream=="function"?I=await u.syncAdapterStream(n,f,ye):I=await u.syncAdapter(n,f),he(n,I,"采集").completed&&(pe.value=!1),await j()}catch(f){y.error(`采集 ${n} 失败: ${f.message}`)}finally{A.sync[n]=!1,w.active=!1}}async function yt(n,c){A.sync[n]=!0,me(n);try{const d={...c};let f;typeof u.syncAdapterStream=="function"?f=await u.syncAdapterStream(n,d,ye):f=await u.syncAdapter(n,d),he(n,f,"采集").completed&&(pe.value=!1),await j()}catch(d){y.error(`采集 ${n} 失败: ${d.message}`)}finally{A.sync[n]=!1,w.active=!1}}const nn=Z(()=>{const n=P.value||[];if(!n.length)return null;let c=0;for(const d of n){const f=ze(d.name);f&&f.ready&&(c+=1)}return{ready:c,total:n.length}}),on=[{title:"时间",key:"at",dataIndex:"at",width:170},{title:"动作",dataIndex:"action",key:"action",width:200},{title:"详情",key:"details"}],an=[{title:"日期",key:"occurredAt",width:100},{title:"描述",dataIndex:"description",key:"description"},{title:"金额",key:"amount",width:140,align:"right"}];function rn(n){return n==="high"?"red":n==="medium"?"orange":"default"}function ln(n){if(!n)return"";if(n.status==="skipped")return`${n.skipReason||"NOT_READY"}:${n.skipMessage||"来源当前未就绪"}`;const c=n.entityCounts||{},d=`events=${c.events??0} persons=${c.persons??0} places=${c.places??0} items=${c.items??0} topics=${c.topics??0} | raw=${n.rawCount??0} invalid=${n.invalidCount??0} | KG triples=${n.kgTripleCount??0} RAG docs=${n.ragDocCount??0} | ${n.durationMs??0}ms`;return n.error?`${d} · 错误: ${n.error}`:d}function sn(n){return se(n).level}function dn(n){const c=se(n),d=n?.adapter||"未知来源",f={success:"成功",empty:"无新数据",partial:"部分有效",skipped:"已跳过",failed:"失败"}[c.kind];return`同步 ${d}: ${f}`}function he(n,c,d="同步"){const f=c&&typeof c=="object"?c:{adapter:n,status:"error",rawCount:0,invalidCount:0,entityCounts:{},error:"未收到有效同步报告"};M.value=f;const I=se(f),L=f.adapter||n;if(I.kind==="failed")y.error(`${d} ${L} 失败:${I.error}`);else if(I.kind==="skipped")y.info(`${d}已跳过:${L},${I.skipMessage}`);else if(I.kind==="partial"){const q=I.watermarkDeferred?`本次入库 ${I.total} 条,但分页窗口尚未扫描完,水位未推进;扩大采集窗口后可安全续扫`:I.total>0?`入库 ${I.total} 条,${I.invalidCount} 条无效`:`读取 ${I.rawCount} 条,但没有形成有效数据`;y.warning(`${d}部分完成:${L},${q}`)}else I.kind==="empty"?y.info(`${d}完成:${L},未发现新数据`):y.success(`${d}完成:${L} 入库 ${I.total} 条`);return I}function gt(n){const c=Nt(n);M.value=zt(n);const d=`同步 ${c.totalReports} 个来源:${c.success} 成功,${c.empty} 无新数据,${c.partial} 部分有效,${c.skipped} 已跳过,${c.failed} 失败,共入库 ${c.totalEntities} 条`;return c.level==="error"?y.error(d):c.level==="warning"?y.warning(d):c.level==="info"?y.info(d):y.success(d),c}async function j(){A.refresh=!0;try{e.value=await u.health(),R.value=await u.stats(),P.value=await u.listAdapters();try{const n=await u.adapterReadiness(),c={};for(const d of Array.isArray(n)?n:[])c[d.name]=d;g.value=c}catch{}try{Ce.value=await u.listAichatAccounts()}catch{}}catch(n){y.error("刷新失败: "+n.message)}finally{A.refresh=!1}}async function cn(){if(S.value.trim()){A.ask=!0,O.value="",v.value=null;try{v.value=await u.ask(S.value.trim(),{acceptNonLocal:x.value})}catch(n){O.value=n.message}finally{A.ask=!1}}}async function un(){A.addMock=!0;try{await u.registerMock({count:30,seed:Date.now()%1e3}),await j(),y.success("MockAdapter 已注册(30 条 mock 数据 ready 同步)")}catch(n){y.error("注册失败: "+n.message)}finally{A.addMock=!1}}function me(n="",c=!1){w.active=!0,w.batchMode=c,w.adapter=n,w.phase="starting",w.mailbox="",w.current=0,w.total=0,w.attempt=1,w.errorMessage=""}function ye(n){if(n){if(n.kind==="sync.batch.start"){w.batchMode=!0,w.adapter="(all)",w.phase="preparing",w.current=n.current||0,w.total=n.total||0;return}if(n.kind==="sync.batch.progress"){w.batchMode=!0,w.adapter=n.adapter||"(all)",w.phase=n.status||"completed",w.current=n.current||0,w.total=n.total||w.total;return}if(n.kind==="sync.batch.done"){w.batchMode=!0,w.adapter="(all)",w.phase="done",w.current=n.current||0,w.total=n.total||w.total;return}n.adapter&&(w.adapter=n.adapter),n.phase&&(w.phase=n.phase),w.batchMode||(typeof n.current=="number"&&(w.current=n.current),typeof n.total=="number"&&(w.total=n.total)),typeof n.attempt=="number"&&(w.attempt=n.attempt),n.mailbox&&(w.mailbox=n.mailbox),n.phase==="error"&&(w.errorMessage=n.message||"sync error")}}async function vt(n){A.sync[n]=!0,me(n);try{const c=Ft(n,z);let d;typeof u.syncAdapterStream=="function"?d=await u.syncAdapterStream(n,c,ye):d=await u.syncAdapter(n,c);const f=he(n,d);return await j(),f}catch(c){return y.error(`同步 ${n} 失败: ${c.message}`),null}finally{A.sync[n]=!1,w.active=!1}}async function fn(){A.syncAll=!0,me("(all)",!0);try{const n=typeof u.syncAllStream=="function"?await u.syncAllStream({readyOnly:!0},ye):await u.syncAll({readyOnly:!0});gt(n),await j()}catch(n){y.error("同步失败: "+n.message)}finally{A.syncAll=!1,w.active=!1}}async function pn(n){try{await u.unregister(n),await j()}catch(c){y.error("移除失败: "+c.message)}}async function mn(n){if(n){A.audit=!0;try{N.value=await u.recentAudit({limit:200})}catch(c){y.error("审计日志加载失败: "+c.message)}finally{A.audit=!1}}}const Ke=Z(()=>!(!D.email||!D.email.includes("@")||!D.authCode||D.authCode.length<4||D.provider==="custom"&&!D.host));function yn(n){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"}[n]||"请输入服务商授权码(不是登录密码)"}function kt(){D.provider="qq",D.email="",D.authCode="",D.host="",D.port=993,D.pdfPasswordHints={idCardLast6:"",phoneLast6:"",cardLast6:""},$.value=null}function We(){const n={provider:D.provider,email:D.email.trim(),authCode:D.authCode};return D.provider==="custom"&&(n.host=D.host.trim(),n.port=D.port||993,n.secure=!0),n}function _t(){const n={};for(const c of Object.keys(D.pdfPasswordHints)){const d=D.pdfPasswordHints[c];typeof d=="string"&&d.trim().length>0&&(n[c]=d.trim())}return Object.keys(n).length>0?n:null}async function gn(){if(Ke.value){A.testEmail=!0,$.value=null;try{$.value=await u.testEmailAuth(We())}catch(n){$.value={ok:!1,error:n.message}}finally{A.testEmail=!1}}}async function vn(){if(!(!Ke.value||!$.value?.ok)){A.saveEmail=!0;try{const n={},c=_t();c&&(n.pdfPasswordHints=c),await u.registerEmail(We(),n),y.success("邮箱账号已注册"),ie.value=!1,kt(),await j()}catch(n){y.error("保存失败: "+n.message)}finally{A.saveEmail=!1}}}const bt=Z(()=>!(!s.email||!s.email.includes("@")||!s.filePath||s.filePath.length<3));function kn(){s.email="",s.zipPassword="",s.filePath="",C.value=null}async function _n(){if(bt.value){A.importAlipay=!0,C.value=null;try{await u.registerAlipay({email:s.email.trim(),zipPassword:s.zipPassword||void 0});const c=/\.zip$/i.test(s.filePath)?{zipPath:s.filePath,zipPassword:s.zipPassword||void 0}:{csvPath:s.filePath};C.value=await u.importAlipayBill(c),C.value?.status==="ok"?(y.success(`导入成功 — ${C.value.entityCounts?.events||0} 笔交易`),await j()):y.error("导入失败: "+(C.value?.error||C.value?.status))}catch(n){C.value={status:"error",error:n.message},y.error("导入失败: "+n.message)}finally{A.importAlipay=!1}}}async function ht(n){if(n){A.eventDetail=!0,de.value=!0;try{oe.value=await u.eventDetail(n)}catch(c){oe.value=null,y.error("事件详情加载失败: "+c.message)}finally{A.eventDetail=!1}}}t({showEventDetail:ht});async function bn(n){A.skill=!0,le.value=null;try{le.value=await u.runSkill(n,{})}catch(c){y.error(`${n} 失败: ${c.message}`)}finally{A.skill=!1}}async function Ee(){A.reviewQueue=!0;try{K.value=await u.reviewQueueList(50);const n=await u.resolverStats();Object.assign(J,n)}catch(n){y.error("待消歧加载失败: "+n.message)}finally{A.reviewQueue=!1}}async function hn(){E.value=!0,await Ee()}async function An(n,c){try{await u.reviewDecision(n,c),y.success(`已记录决策: ${c}`),await Ee()}catch(d){y.error("决策失败: "+d.message)}}async function On(){A.resolverDrain=!0;try{const n=await u.resolverDrain(20);y.success(`drain 完成 — same=${n.same} different=${n.different} review=${n.review}`),await Ee()}catch(n){y.error("drain 失败: "+n.message)}finally{A.resolverDrain=!1}}async function At(){try{const n=await u.resolverStats();Object.assign(J,n)}catch{}}wt(()=>{j(),At()});const Ot={hub:u,health:e,stats:R,adapters:P,readinessMap:g,askInput:S,askResult:v,askError:O,acceptNonLocal:x,auditOpen:U,auditRows:N,lastSync:M,SYNC_INCLUDE_STORAGE_KEY:Ve,_loadSyncInclude:V,syncIncludeOptions:z,persistSyncInclude:B,includePopoverOpen:G,adapterHasIncludeToggles:H,onIncludeKindToggle:F,emailConfigOpen:ie,emailForm:D,emailTestResult:$,eventDetailOpen:de,eventDetail:oe,emailAccounts:be,oauthCollectorOpen:X,oauthCollectorTarget:ee,skillResult:le,analysisSkills:fe,reviewQueueOpen:E,reviewRows:K,resolverStats:J,aichatWizardOpen:Ue,aichatAccounts:Ce,onAichatRegistered:we,wechatWizardOpen:Se,onWechatRegistered:Me,alipayConfigOpen:Be,alipayForm:s,alipayResult:C,syncProgress:w,loading:A,bridgeDoctorReport:Ge,bilibiliReasonMessage:Ne,douyinReasonMessage:Xe,weiboReasonMessage:Ze,xhsReasonMessage:Je,xhsAdbSync:$e,toutiaoReasonMessage:et,toutiaoAdbSync:tt,kuaishouReasonMessage:nt,kuaishouAdbSync:ot,bridgeDoctor:jt,weiboAdbSync:at,douyinAdbSync:rt,bilibiliAdbDoctor:qt,bilibiliAdbSync:it,adapterColumns:Yt,readinessOf:ze,adapterDescriptor:Ie,guideDrawerOpen:pe,guideTarget:De,openGuide:Fe,recheckGuideTarget:Vt,READINESS_STATUS_COLOR:lt,readinessStatusColor:Qt,READINESS_STATUS_LABEL:st,readinessStatusLabel:Gt,READINESS_CATEGORY_LABEL:dt,readinessCategoryLabel:Xt,KEYED_FILE_ADAPTERS:ct,PASSWORD_FILE_ADAPTERS:ut,ADB_COLLECT_ACTIONS:ft,collectMode:pt,collectActionLabel:Zt,collectButtonLabel:Jt,collectActionDescription:$t,oneClickCollect:en,collectViaOAuth:tn,collectViaRuntimeOptions:He,collectViaFile:mt,collectViaDirectory:yt,readinessSummary:nn,auditColumns:on,transactionColumns:an,sensitivityColor:rn,syncSummary:ln,syncAlertType:sn,syncAlertMessage:dn,presentSyncReport:he,presentSyncAll:gt,refresh:j,ask:cn,addMock:un,resetSyncProgress:me,handleSyncEvent:ye,syncOne:vt,syncAll:fn,unregisterAdapter:pn,loadAudit:mn,emailFormValid:Ke,providerAuthHint:yn,resetEmailForm:kt,buildEmailAccountPayload:We,buildPdfHints:_t,testEmailAuth:gn,saveEmail:vn,alipayFormValid:bt,resetAlipayForm:kn,importAlipay:_n,showEventDetail:ht,runSkill:bn,loadReviewQueue:Ee,openReviewQueue:hn,decideReview:An,drainResolver:On,loadResolverStats:At,ref:T,reactive:ne,onMounted:wt,computed:Z,get message(){return y},get ReloadOutlined(){return Hn},get FileSearchOutlined(){return Fn},get MessageOutlined(){return zn},get SendOutlined(){return Nn},get AppstoreOutlined(){return Bn},get MailOutlined(){return Mn},get InfoCircleOutlined(){return Un},get WalletOutlined(){return Ln},get LinkOutlined(){return xn},get BulbOutlined(){return Tn},get DollarOutlined(){return St},get TeamOutlined(){return It},get EnvironmentOutlined(){return Dt},get HeartOutlined(){return Et},get ClockCircleOutlined(){return Rt},get RobotOutlined(){return Pn},get WechatOutlined(){return Rn},get usePersonalDataHub(){return ke},get resolveCollectionMode(){return _e},get getCollectionActionLabel(){return Tt},get getCollectionButtonLabel(){return xt},get getCollectionActionDescription(){return Lt},get cookieCollectionOptions(){return Ut},get directoryCollectionOptions(){return Mt},get requiresExplicitSourceUrl(){return Te},get chooseHostDirectory(){return Bt},get analyzeSyncReport(){return se},get analyzeSyncReports(){return Nt},get selectImportantSyncReport(){return zt},get buildSyncIncludeOptions(){return Ft},get createDefaultSyncInclude(){return Ye},get DEFAULT_SYNC_INCLUDE(){return Qe},get INCLUDE_KIND_META(){return xe},AIChatWizard:po,PdhOAuthCollectorDrawer:go,WechatWizard:So};return Object.defineProperty(Ot,"__isScriptSetup",{enumerable:!1,value:!0}),Ot}},Do={class:"pdh-page"},Eo={class:"pdh-header"},Ro={class:"kv"},Po={key:0,class:"kv"},To={key:1,class:"kv"},xo={class:"kv"},Lo={key:0,class:"kv hint"},Uo={style:{"margin-top":"12px",display:"flex","justify-content":"space-between","align-items":"center"}},Mo={key:0,style:{"margin-top":"12px"}},Bo={key:1,style:{"margin-top":"12px"}},No={class:"answer"},zo={style:{"margin-top":"8px","font-size":"12px",color:"var(--text-color-secondary, #888)"}},Fo={key:2,style:{"margin-top":"8px"}},Ho={style:{display:"flex","align-items":"center",gap:"8px"}},Ko={class:"hint",style:{"margin-top":"4px"}},Wo={key:0,style:{"margin-top":"16px"}},jo={class:"json-pre",style:{"max-height":"300px",overflow:"auto"}},qo={key:0,style:{"margin-top":"8px"}},Yo={key:0,style:{"margin-top":"4px",opacity:"0.85"}},Vo={key:1,style:{"margin-top":"4px",color:"#ffb3b3"}},Qo={style:{color:"#999","font-size":"12px","margin-left":"2px"}},Go={key:0,style:{color:"#8c8c8c","font-size":"12px","margin-top":"2px","line-height":"1.4"}},Xo={style:{"min-width":"220px"}},Zo={style:{color:"#999","font-size":"12px","margin-left":"4px"}},Jo={key:2,style:{"margin-top":"12px"}},$o={class:"kv",style:{"margin-bottom":"4px"}},ea={key:0,style:{color:"#faad14"}},ta={key:2,class:"kv hint"},na={key:3,class:"kv hint",style:{color:"#ff4d4f"}},oa={key:3,style:{"margin-top":"12px"}},aa={key:2,style:{"margin-top":"8px"}},ra={key:1},ia={style:{"margin-left":"8px"}},la={key:3,class:"json-pre"},sa={style:{"margin-left":"6px"}},da={key:0,style:{"margin-left":"6px"}},ca={key:0,class:"hint",style:{"margin-top":"4px"}},ua={key:0,style:{"margin-top":"8px"}},fa={style:{"margin-bottom":"12px"}},pa={class:"hint"},ma={class:"kv"},ya={class:"kv",style:{"margin-top":"4px"}},ga={class:"kv"},va={key:0,class:"hint",style:{"margin-top":"4px"}},ka={key:1,style:{"font-size":"11px"}},_a={style:{"font-weight":"600","margin-bottom":"8px"}},ba={style:{margin:"0","padding-left":"20px","line-height":"1.9"}},ha={key:0,style:{"margin-top":"6px","font-size":"12px",color:"#52c41a"}},Aa={style:{"font-size":"12px",color:"#999"}};function Oa(r,t,u,e,R,P){const g=_("a-button"),S=_("a-badge"),v=_("a-space"),O=_("a-tag"),x=_("a-card"),U=_("a-col"),N=_("a-row"),M=_("a-textarea"),V=_("a-checkbox"),z=_("a-alert"),B=_("a-divider"),G=_("a-spin"),H=_("a-tooltip"),F=_("a-popover"),ie=_("a-popconfirm"),D=_("a-table"),$=_("a-empty"),de=_("a-progress"),oe=_("a-select-option"),be=_("a-select"),X=_("a-form-item"),ee=_("a-input"),le=_("a-input-password"),fe=_("a-input-number"),E=_("a-form"),K=_("a-drawer"),J=_("a-descriptions-item"),Ue=_("a-descriptions"),Ce=_("a-list-item-meta"),we=_("a-list-item"),Se=_("a-list"),Me=_("a-collapse-panel"),Be=_("a-collapse");return i(),h("div",Do,[m(" Page header "),k("div",Eo,[t[33]||(t[33]=k("div",null,[k("h2",{class:"page-title"},"个人数据中台"),k("p",{class:"page-sub"}," 让数据回归个人 — 各 app 数据本地加密落盘,本地 LLM 跨源分析,零云端外传。 ")],-1)),a(v,null,{default:o(()=>[a(g,{loading:e.loading.refresh,onClick:e.refresh},{icon:o(()=>[a(e.ReloadOutlined)]),default:o(()=>[t[30]||(t[30]=l(" 刷新 ",-1))]),_:1},8,["loading"]),a(S,{count:e.resolverStats.reviewQueue,offset:[0,0]},{default:o(()=>[a(g,{type:"primary",ghost:"",onClick:e.openReviewQueue},{icon:o(()=>[a(e.LinkOutlined)]),default:o(()=>[t[31]||(t[31]=l(" 待消歧 ",-1))]),_:1})]),_:1},8,["count"]),a(g,{type:"primary",ghost:"",onClick:t[0]||(t[0]=s=>e.auditOpen=!0)},{icon:o(()=>[a(e.FileSearchOutlined)]),default:o(()=>[t[32]||(t[32]=l(" 审计日志 ",-1))]),_:1})]),_:1})]),m(" Health row "),a(N,{gutter:16,style:{"margin-bottom":"16px"}},{default:o(()=>[a(U,{xs:24,sm:12,md:6},{default:o(()=>[a(x,{size:"small",title:"Vault"},{extra:o(()=>[a(O,{color:e.health?.vault?.ok?"green":"red"},{default:o(()=>[l(p(e.health?.vault?.ok?"正常":"未就绪"),1)]),_:1},8,["color"])]),default:o(()=>[k("div",Ro," schema v"+p(e.health?.vault?.schemaVersion??"?"),1),e.stats?.vault?(i(),h("div",Po," 事件 "+p(e.stats.vault.events)+" · 联系人 "+p(e.stats.vault.persons),1)):m("v-if",!0),e.stats?.vault?(i(),h("div",To," 地点 "+p(e.stats.vault.places)+" · 商品 "+p(e.stats.vault.items)+" · 主题 "+p(e.stats.vault.topics),1)):m("v-if",!0)]),_:1})]),_:1}),a(U,{xs:24,sm:12,md:6},{default:o(()=>[a(x,{size:"small",title:"本地 LLM"},{extra:o(()=>[a(O,{color:e.health?.llm?.ok?e.health.llm.isLocal?"green":"orange":"red"},{default:o(()=>[l(p(e.health?.llm?.ok?e.health.llm.isLocal?"本地":"非本地":"未就绪"),1)]),_:1},8,["color"])]),default:o(()=>[k("div",xo,p(e.health?.llm?.name||"—"),1),e.health?.llm?.ok&&!e.health.llm.isLocal?(i(),h("div",Lo," ⚠️ 非本地 — ask 会被隐私 gate 拒绝,除非显式 acceptNonLocal ")):m("v-if",!0)]),_:1})]),_:1}),a(U,{xs:24,sm:12,md:6},{default:o(()=>[a(x,{size:"small",title:"KG 索引"},{extra:o(()=>[a(O,{color:e.health?.kgSink?.ok?"green":"default"},{default:o(()=>[l(p(e.health?.kgSink?.ok?"已连接":"不可用"),1)]),_:1},8,["color"])]),default:o(()=>[t[34]||(t[34]=k("div",{class:"kv"}," events / persons → cc knowledge-graph 实体 + 关系 ",-1))]),_:1})]),_:1}),a(U,{xs:24,sm:12,md:6},{default:o(()=>[a(x,{size:"small",title:"RAG 索引"},{extra:o(()=>[a(O,{color:e.health?.ragSink?.ok?"green":"default"},{default:o(()=>[l(p(e.health?.ragSink?.ok?"已连接":"不可用"),1)]),_:1},8,["color"])]),default:o(()=>[t[35]||(t[35]=k("div",{class:"kv"},"文本 → BM25(vector 留待后续 phase)",-1))]),_:1})]),_:1})]),_:1}),m(" Ask box "),a(x,{style:{"margin-bottom":"16px"}},{title:o(()=>[a(v,null,{default:o(()=>[a(e.MessageOutlined),t[36]||(t[36]=k("span",null,"问我数据",-1))]),_:1})]),default:o(()=>[a(M,{value:e.askInput,"onUpdate:value":t[1]||(t[1]=s=>e.askInput=s),rows:2,placeholder:"例:上个月在淘宝总共花了多少?/我妈生日那周买了啥送哪儿?",onKeydown:Dn(Kt(e.ask,["exact","prevent"]),["enter"])},null,8,["value","onKeydown"]),k("div",Uo,[a(V,{checked:e.acceptNonLocal,"onUpdate:checked":t[2]||(t[2]=s=>e.acceptNonLocal=s)},{default:o(()=>[...t[37]||(t[37]=[l("允许非本地 LLM (volcengine / anthropic 等)",-1)])]),_:1},8,["checked"]),a(g,{type:"primary",loading:e.loading.ask,disabled:!e.askInput.trim(),onClick:e.ask},{icon:o(()=>[a(e.SendOutlined)]),default:o(()=>[t[38]||(t[38]=l(" 提问 ",-1))]),_:1},8,["loading","disabled"])]),e.askError?(i(),h("div",Mo,[a(z,{type:"error","show-icon":"",message:e.askError},null,8,["message"])])):m("v-if",!0),e.askResult?(i(),h("div",Bo,[e.askResult.warning==="no-facts"?(i(),b(z,{key:0,type:"warning","show-icon":"",message:"vault 里没找到匹配的事件('no-facts')—— 先同步几个 adapter 让数据进 vault",style:{"margin-bottom":"12px"}})):e.askResult.warning==="hallucinated-citations"?(i(),b(z,{key:1,type:"warning","show-icon":"",message:`LLM 引用了 ${e.askResult.hallucinatedCitations?.length||0} 个不存在的 event id —— 模型在编造`,style:{"margin-bottom":"12px"}},null,8,["message"])):m("v-if",!0),k("div",No,p(e.askResult.answer),1),k("div",zo," 引用 "+p(e.askResult.citations?.length||0)+" 条事实 · "+p(e.askResult.facts?.length||0)+" facts 入 prompt · "+p(e.askResult.durationMs)+"ms · "+p(e.askResult.model),1),e.askResult.citations?.length?(i(),h("div",Fo,[t[39]||(t[39]=k("span",{style:{"font-size":"12px",color:"var(--text-color-secondary, #888)"}},"事件链接(点击查看明细 / PDF 解密结果):",-1)),a(v,{style:{"margin-top":"4px"},wrap:""},{default:o(()=>[(i(!0),h(Y,null,re(e.askResult.citations,s=>(i(),b(O,{key:s,color:"blue",style:{cursor:"pointer"},onClick:C=>e.showEventDetail(s)},{default:o(()=>[l(p(s),1)]),_:2},1032,["onClick"]))),128))]),_:1})])):m("v-if",!0)])):m("v-if",!0)]),_:1}),m(" Phase 11 — Analysis Skills cards "),a(x,{style:{"margin-bottom":"16px"}},{title:o(()=>[a(v,null,{default:o(()=>[a(e.BulbOutlined),t[40]||(t[40]=k("span",null,"分析 skill (Phase 11)",-1))]),_:1})]),extra:o(()=>[a(O,{color:"purple"},{default:o(()=>[...t[41]||(t[41]=[l("5 内置",-1)])]),_:1})]),default:o(()=>[a(N,{gutter:[12,12]},{default:o(()=>[(i(),h(Y,null,re(e.analysisSkills,s=>a(U,{xs:24,sm:12,md:8,key:s.name},{default:o(()=>[a(x,{size:"small",hoverable:"",onClick:C=>e.runSkill(s.name)},{default:o(()=>[k("div",Ho,[(i(),b(En(s.icon),{style:{"font-size":"18px",color:"#722ed1"}})),k("strong",null,p(s.label),1)]),k("div",Ko,p(s.description),1)]),_:2},1032,["onClick"])]),_:2},1024)),64))]),_:1}),e.skillResult?(i(),h("div",Wo,[a(B,{plain:"",orientation:"left"},{default:o(()=>[l(p(e.skillResult.skill)+" 结果",1)]),_:1}),a(G,{spinning:e.loading.skill},{default:o(()=>[k("pre",jo,p(JSON.stringify(e.skillResult,null,2)),1),e.skillResult.llm_commentary||e.skillResult.llm_narrative?(i(),h("div",qo,[a(z,{type:"info",message:e.skillResult.llm_commentary||e.skillResult.llm_narrative},null,8,["message"])])):m("v-if",!0)]),_:1},8,["spinning"])])):m("v-if",!0)]),_:1}),m(" Adapters "),a(x,{style:{"margin-bottom":"16px"}},{title:o(()=>[a(v,null,{default:o(()=>[a(e.AppstoreOutlined),t[42]||(t[42]=k("span",null,"Adapters",-1)),e.readinessSummary?(i(),b(O,{key:0,color:e.readinessSummary.ready===e.readinessSummary.total?"green":"orange"},{default:o(()=>[l(p(e.readinessSummary.ready)+"/"+p(e.readinessSummary.total)+" 可采集 ",1)]),_:1},8,["color"])):m("v-if",!0)]),_:1})]),extra:o(()=>[a(v,null,{default:o(()=>[a(g,{onClick:t[3]||(t[3]=s=>e.emailConfigOpen=!0)},{icon:o(()=>[a(e.MailOutlined)]),default:o(()=>[t[43]||(t[43]=l(" 添加邮箱账号 ",-1))]),_:1}),a(g,{onClick:t[4]||(t[4]=s=>e.alipayConfigOpen=!0)},{icon:o(()=>[a(e.WalletOutlined)]),default:o(()=>[t[44]||(t[44]=l(" 导入支付宝账单 ",-1))]),_:1}),a(g,{onClick:t[5]||(t[5]=s=>e.aichatWizardOpen=!0)},{icon:o(()=>[a(e.RobotOutlined)]),default:o(()=>[t[45]||(t[45]=l(" 添加 AI 对话账号 ",-1))]),_:1}),a(g,{onClick:t[6]||(t[6]=s=>e.wechatWizardOpen=!0)},{icon:o(()=>[a(e.WechatOutlined)]),default:o(()=>[t[46]||(t[46]=l(" 添加 WeChat ",-1))]),_:1}),a(g,{onClick:e.bilibiliAdbDoctor,loading:e.loading.bilibiliAdbDoctor},{default:o(()=>[...t[47]||(t[47]=[l(" 诊断 Bilibili ADB ",-1)])]),_:1},8,["loading"]),a(g,{onClick:e.bilibiliAdbSync,loading:e.loading.bilibiliAdbSync},{default:o(()=>[...t[48]||(t[48]=[l(" 通过 PC ADB 同步 Bilibili ",-1)])]),_:1},8,["loading"]),a(g,{onClick:e.weiboAdbSync,loading:e.loading.weiboAdbSync},{default:o(()=>[...t[49]||(t[49]=[l(" 通过 PC ADB 同步 Weibo ",-1)])]),_:1},8,["loading"]),a(g,{onClick:e.xhsAdbSync,loading:e.loading.xhsAdbSync},{default:o(()=>[...t[50]||(t[50]=[l(" 通过 PC ADB 同步 Xhs ",-1)])]),_:1},8,["loading"]),a(g,{onClick:e.toutiaoAdbSync,loading:e.loading.toutiaoAdbSync},{default:o(()=>[...t[51]||(t[51]=[l(" 通过 PC ADB 同步 Toutiao ",-1)])]),_:1},8,["loading"]),a(g,{onClick:e.kuaishouAdbSync,loading:e.loading.kuaishouAdbSync},{default:o(()=>[...t[52]||(t[52]=[l(" 通过 PC ADB 同步 Kuaishou ",-1)])]),_:1},8,["loading"]),a(g,{onClick:e.bridgeDoctor,loading:e.loading.bridgeDoctor},{default:o(()=>[...t[53]||(t[53]=[l(" 诊断签名 Bridges ",-1)])]),_:1},8,["loading"]),a(g,{onClick:e.douyinAdbSync,loading:e.loading.douyinAdbSync},{default:o(()=>[...t[54]||(t[54]=[l(" 通过 PC ADB 同步 Douyin ",-1)])]),_:1},8,["loading"]),a(g,{onClick:e.addMock,loading:e.loading.addMock},{default:o(()=>[...t[55]||(t[55]=[l(" 注册 MockAdapter(开发) ",-1)])]),_:1},8,["loading"]),a(g,{type:"primary",onClick:e.syncAll,loading:e.loading.syncAll,disabled:!e.adapters.length},{default:o(()=>[...t[56]||(t[56]=[l(" 同步全部 ",-1)])]),_:1},8,["loading","disabled"])]),_:1})]),default:o(()=>[e.adapters.length?(i(),b(D,{key:0,columns:e.adapterColumns,"data-source":e.adapters,pagination:!1,"row-key":s=>s.name,size:"middle"},{bodyCell:o(({column:s,record:C})=>[s.key==="readiness"?(i(),h(Y,{key:0},[e.readinessOf(C.name)?(i(),h(Y,{key:0},[a(H,null,{title:o(()=>[k("div",null,p(e.readinessOf(C.name).message),1),e.readinessOf(C.name).actionHint?(i(),h("div",Yo," → "+p(e.readinessOf(C.name).actionHint),1)):m("v-if",!0),e.readinessOf(C.name).lastError?(i(),h("div",Vo," 上次同步错误: "+p(e.readinessOf(C.name).lastError),1)):m("v-if",!0)]),default:o(()=>[a(O,{color:e.readinessStatusColor(e.readinessOf(C.name).status)},{default:o(()=>[l(p(e.readinessStatusLabel(e.readinessOf(C.name))),1)]),_:2},1032,["color"])]),_:2},1024),k("span",Qo,p(e.readinessCategoryLabel(e.readinessOf(C.name).category)),1),m(` inline reason for the non-ready rows so the user doesn't
|
|
4
|
+
have to hover to learn why a source can't collect `),e.readinessOf(C.name).ready?m("v-if",!0):(i(),h("div",Go,p(e.readinessOf(C.name).message),1))],64)):(i(),b(O,{key:1,color:"default"},{default:o(()=>[...t[57]||(t[57]=[l("检测中",-1)])]),_:1}))],64)):s.key==="sensitivity"?(i(),h(Y,{key:1},[a(O,{color:e.sensitivityColor(C.sensitivity)},{default:o(()=>[l(p(C.sensitivity),1)]),_:2},1032,["color"]),C.legalGate?(i(),b(O,{key:0,color:"red",style:{"margin-left":"4px"}},{default:o(()=>[...t[58]||(t[58]=[l("需法律确认",-1)])]),_:1})):m("v-if",!0)],64)):s.key==="capabilities"?(i(!0),h(Y,{key:2},re(C.capabilities,w=>(i(),b(O,{key:w,style:{"margin-right":"4px"}},{default:o(()=>[l(p(w),1)]),_:2},1024))),128)):s.key==="actions"?(i(),b(v,{key:3},{default:o(()=>[a(g,{size:"small",type:"link",onClick:w=>e.openGuide(C.name)},{default:o(()=>[...t[59]||(t[59]=[l(" 如何导入 ",-1)])]),_:1},8,["onClick"]),m(` Capability/readiness-driven primary action: file picker,
|
|
5
5
|
Cookie prompt, dedicated ADB pull, direct sync, or guide. `),a(g,{size:"small",type:"primary",title:e.collectActionLabel(e.adapterDescriptor(C.name)),loading:e.loading.sync[C.name],onClick:w=>e.oneClickCollect(C.name)},{default:o(()=>[l(p(e.collectButtonLabel(e.adapterDescriptor(C.name))),1)]),_:2},1032,["title","loading","onClick"]),m(` Per-kind include toggles (only adapters with multi-kind
|
|
6
6
|
bridge output show this — currently just system-data-android).
|
|
7
7
|
Popover content is a checkbox group writing into
|
|
8
8
|
syncIncludeOptions[record.name]; changes auto-persist to
|
|
9
|
-
localStorage so the user's privacy choice survives reloads. `),e.adapterHasIncludeToggles(C.name)?(i(),b(F,{key:0,open:e.includePopoverOpen[C.name],"onUpdate:open":w=>e.includePopoverOpen[C.name]=w,trigger:"click",placement:"left",title:`${C.name} 采集范围`},{content:o(()=>[k("div",Xo,[(i(!0),h(V,null,re(e.INCLUDE_KIND_META[C.name],w=>(i(),h("div",{key:w.key,style:{margin:"6px 0"}},[a(Y,{checked:e.syncIncludeOptions[C.name][w.key]!==!1,onChange:A=>e.onIncludeKindToggle(C.name,w.key,A)},{default:o(()=>[l(p(w.label)+" ",1),k("span",Zo,p(w.hint),1),w.sensitive?(i(),b(O,{key:0,color:"orange",size:"small",style:{"margin-left":"4px"}},{default:o(()=>[...t[60]||(t[60]=[l("敏感",-1)])]),_:1})):m("v-if",!0)]),_:2},1032,["checked","onChange"])]))),128)),t[61]||(t[61]=k("div",{style:{"margin-top":"8px","font-size":"11px",color:"#999"}}," 取消勾选的数据本次同步不会拉取入库 ",-1))])]),default:o(()=>[a(g,{size:"small",title:"选择采集范围"},{default:o(()=>[...t[62]||(t[62]=[l("⚙",-1)])]),_:1})]),_:2},1032,["open","onUpdate:open","title"])):m("v-if",!0),a(ie,{title:`从注册表移除 ${C.name}?(vault 数据不会删除)`,onConfirm:w=>e.unregisterAdapter(C.name)},{default:o(()=>[a(g,{size:"small",danger:""},{default:o(()=>[...t[63]||(t[63]=[l("移除",-1)])]),_:1})]),_:1},8,["title","onConfirm"])]),_:2},1024)):m("v-if",!0)]),_:1},8,["data-source","row-key"])):(i(),b($,{key:1,description:"无已注册 adapter — 点上方按钮注册 MockAdapter 看效果"})),e.syncProgress.active?(i(),h("div",Jo,[a(x,{size:"small",bordered:!0},{default:o(()=>[k("div",$o,[t[64]||(t[64]=k("strong",null,"同步进行中",-1)),l(" · "+p(e.syncProgress.adapter)+" · "+p(e.syncProgress.phase||"...")+" ",1),e.syncProgress.attempt&&e.syncProgress.attempt>1?(i(),h("span",ea," (重试 #"+p(e.syncProgress.attempt)+") ",1)):m("v-if",!0)]),e.syncProgress.total>0?(i(),b(de,{key:0,percent:Math.round(e.syncProgress.current/e.syncProgress.total*100),status:e.syncProgress.errorMessage?"exception":"active",size:"small"},null,8,["percent","status"])):(i(),b(de,{key:1,percent:0,status:"active",size:"small"})),e.syncProgress.mailbox?(i(),h("div",ta," 邮箱 "+p(e.syncProgress.mailbox)+" · "+p(e.syncProgress.current)+" / "+p(e.syncProgress.total),1)):m("v-if",!0),e.syncProgress.errorMessage?(i(),h("div",na,p(e.syncProgress.errorMessage),1)):m("v-if",!0)]),_:1})])):m("v-if",!0),e.lastSync?(i(),h("div",oa,[a(z,{type:e.syncAlertType(e.lastSync),"show-icon":"",message:e.syncAlertMessage(e.lastSync),description:e.syncSummary(e.lastSync)},null,8,["type","message","description"])])):m("v-if",!0)]),_:1}),m(" Email config drawer (Phase 5.6) "),a(e.PdhOAuthCollectorDrawer,{open:e.oauthCollectorOpen,"onUpdate:open":t[7]||(t[7]=s=>e.oauthCollectorOpen=s),source:e.oauthCollectorTarget,onCollect:e.collectViaOAuth},null,8,["open","source"]),a(K,{open:e.emailConfigOpen,"onUpdate:open":t[17]||(t[17]=s=>e.emailConfigOpen=s),title:"添加邮箱账号",placement:"right",width:"560","destroy-on-close":!0,onClose:e.resetEmailForm},{footer:o(()=>[a(v,null,{default:o(()=>[a(g,{onClick:t[16]||(t[16]=s=>e.emailConfigOpen=!1)},{default:o(()=>[...t[74]||(t[74]=[l("取消",-1)])]),_:1}),a(g,{loading:e.loading.testEmail,disabled:!e.emailFormValid,onClick:e.testEmailAuth},{default:o(()=>[...t[75]||(t[75]=[l(" 测试连接 ",-1)])]),_:1},8,["loading","disabled"]),a(g,{type:"primary",loading:e.loading.saveEmail,disabled:!e.emailFormValid||!e.emailTestResult?.ok,onClick:e.saveEmail},{default:o(()=>[...t[76]||(t[76]=[l(" 保存并注册 ",-1)])]),_:1},8,["loading","disabled"])]),_:1})]),default:o(()=>[a(z,{message:"数据回归个人 — 凭证落本地加密文件(与 vault 主密钥同目录),同步动作 100% 本地。",type:"info","show-icon":"",style:{"margin-bottom":"16px"}}),a(E,{layout:"vertical",model:e.emailForm},{default:o(()=>[a(X,{label:"邮箱服务商",required:""},{default:o(()=>[a(be,{value:e.emailForm.provider,"onUpdate:value":t[8]||(t[8]=s=>e.emailForm.provider=s),placeholder:"选择服务商"},{default:o(()=>[a(oe,{value:"qq"},{default:o(()=>[...t[65]||(t[65]=[l("QQ 邮箱 (imap.qq.com)",-1)])]),_:1}),a(oe,{value:"163"},{default:o(()=>[...t[66]||(t[66]=[l("网易邮箱 163/126",-1)])]),_:1}),a(oe,{value:"189"},{default:o(()=>[...t[67]||(t[67]=[l("189 邮箱",-1)])]),_:1}),a(oe,{value:"outlook"},{default:o(()=>[...t[68]||(t[68]=[l("Outlook / Hotmail",-1)])]),_:1}),a(oe,{value:"gmail"},{default:o(()=>[...t[69]||(t[69]=[l("Gmail",-1)])]),_:1}),a(oe,{value:"custom"},{default:o(()=>[...t[70]||(t[70]=[l("自定义 IMAP",-1)])]),_:1})]),_:1},8,["value"])]),_:1}),a(X,{label:"邮箱地址",required:""},{default:o(()=>[a(ee,{value:e.emailForm.email,"onUpdate:value":t[9]||(t[9]=s=>e.emailForm.email=s),placeholder:"you@qq.com",autocomplete:"off"},null,8,["value"])]),_:1}),a(X,{required:""},{label:o(()=>[a(v,null,{default:o(()=>[t[71]||(t[71]=k("span",null,"授权码(非登录密码)",-1)),a(H,{title:e.providerAuthHint(e.emailForm.provider)},{default:o(()=>[a(e.InfoCircleOutlined,{style:{color:"#888"}})]),_:1},8,["title"])]),_:1})]),default:o(()=>[a(le,{value:e.emailForm.authCode,"onUpdate:value":t[10]||(t[10]=s=>e.emailForm.authCode=s),placeholder:"例:QQ 邮箱 设置 → 账户 → 开启 IMAP/SMTP → 生成的授权码",autocomplete:"off"},null,8,["value"])]),_:1}),e.emailForm.provider==="custom"?(i(),b(X,{key:0,label:"IMAP host"},{default:o(()=>[a(ee,{value:e.emailForm.host,"onUpdate:value":t[11]||(t[11]=s=>e.emailForm.host=s),placeholder:"mail.example.com"},null,8,["value"])]),_:1})):m("v-if",!0),e.emailForm.provider==="custom"?(i(),b(X,{key:1,label:"端口"},{default:o(()=>[a(fe,{value:e.emailForm.port,"onUpdate:value":t[12]||(t[12]=s=>e.emailForm.port=s),min:1,max:65535,"default-value":993},null,8,["value"])]),_:1})):m("v-if",!0),a(B,{orientation:"left",plain:""},{default:o(()=>[...t[72]||(t[72]=[l("PDF 账单解密提示(可选)",-1)])]),_:1}),t[73]||(t[73]=k("p",{class:"hint"}," 银行 PDF 月结大多加密;提供几个常用候选项让 Phase 5.5 自动解锁: ",-1)),a(X,{label:"身份证后 6 位"},{default:o(()=>[a(ee,{value:e.emailForm.pdfPasswordHints.idCardLast6,"onUpdate:value":t[13]||(t[13]=s=>e.emailForm.pdfPasswordHints.idCardLast6=s),placeholder:"123456",autocomplete:"off"},null,8,["value"])]),_:1}),a(X,{label:"手机后 6 位"},{default:o(()=>[a(ee,{value:e.emailForm.pdfPasswordHints.phoneLast6,"onUpdate:value":t[14]||(t[14]=s=>e.emailForm.pdfPasswordHints.phoneLast6=s),placeholder:"123456",autocomplete:"off"},null,8,["value"])]),_:1}),a(X,{label:"信用卡尾 6 位"},{default:o(()=>[a(ee,{value:e.emailForm.pdfPasswordHints.cardLast6,"onUpdate:value":t[15]||(t[15]=s=>e.emailForm.pdfPasswordHints.cardLast6=s),placeholder:"123456",autocomplete:"off"},null,8,["value"])]),_:1}),e.emailTestResult?(i(),h("div",aa,[a(z,{type:e.emailTestResult.ok?"success":"error","show-icon":"",message:e.emailTestResult.ok?"凭证有效 — 可以保存":`认证失败: ${e.emailTestResult.reason||e.emailTestResult.error}`},null,8,["type","message"])])):m("v-if",!0)]),_:1},8,["model"])]),_:1},8,["open"]),m(" Event detail drawer (Phase 5.6) "),a(K,{open:e.eventDetailOpen,"onUpdate:open":t[18]||(t[18]=s=>e.eventDetailOpen=s),title:e.eventDetail?`事件 ${e.eventDetail.event.id}`:"加载中...",placement:"right",width:"640","destroy-on-close":!0},{default:o(()=>[e.eventDetail?(i(),h(V,{key:0},[a(Ue,{column:1,size:"small",bordered:""},{default:o(()=>[a(J,{label:"类型"},{default:o(()=>[l(p(e.eventDetail.event.subtype),1)]),_:1}),a(J,{label:"发生于"},{default:o(()=>[l(p(new Date(e.eventDetail.event.occurredAt).toLocaleString()),1)]),_:1}),a(J,{label:"actor"},{default:o(()=>[l(p(e.eventDetail.event.actor),1)]),_:1}),e.eventDetail.event.content?.title?(i(),b(J,{key:0,label:"标题"},{default:o(()=>[l(p(e.eventDetail.event.content.title),1)]),_:1})):m("v-if",!0),e.eventDetail.event.source?.adapter?(i(),b(J,{key:1,label:"来源 adapter"},{default:o(()=>[l(p(e.eventDetail.event.source.adapter)+" @ v"+p(e.eventDetail.event.source.adapterVersion),1)]),_:1})):m("v-if",!0)]),_:1}),e.eventDetail.classification?(i(),b(B,{key:0,orientation:"left",plain:""},{default:o(()=>[...t[77]||(t[77]=[l("分类",-1)])]),_:1})):m("v-if",!0),e.eventDetail.classification?(i(),h("div",ra,[a(O,{color:"blue"},{default:o(()=>[l(p(e.eventDetail.classification.category),1)]),_:1}),a(O,null,{default:o(()=>[l(p(e.eventDetail.classification.layer),1)]),_:1}),k("span",ia,"置信 "+p(Math.round((e.eventDetail.classification.confidence||0)*100))+"%",1)])):m("v-if",!0),e.eventDetail.extraction?(i(),b(B,{key:2,orientation:"left",plain:""},{default:o(()=>[l("结构化字段("+p(e.eventDetail.extraction.template)+")",1)]),_:1})):m("v-if",!0),e.eventDetail.extraction?(i(),h("pre",la,p(JSON.stringify(e.eventDetail.extraction.fields,null,2)),1)):m("v-if",!0),e.eventDetail.extraction?.pdfExtraction?(i(),b(B,{key:4,orientation:"left",plain:""},{default:o(()=>[...t[78]||(t[78]=[l("PDF 解密 / 解析",-1)])]),_:1})):m("v-if",!0),e.eventDetail.extraction?.pdfExtraction?(i(),b(Se,{key:5,"data-source":e.eventDetail.extraction.pdfExtraction,size:"small"},{renderItem:o(({item:s})=>[a(we,null,{default:o(()=>[a(Ce,{title:s.filename},{description:o(()=>[k("div",null,[a(O,{color:s.decrypted?"green":"red"},{default:o(()=>[l(p(s.decrypted?"已解密":"解密失败"),1)]),_:2},1032,["color"]),k("span",sa,"尝试 "+p(s.attempted)+" 次",1),s.transactionsExtracted!=null?(i(),h("span",da," · 提取 "+p(s.transactionsExtracted)+" 条交易 ",1)):m("v-if",!0)]),s.error?(i(),h("div",ca,p(s.error),1)):m("v-if",!0)]),_:2},1032,["title"])]),_:2},1024)]),_:1},8,["data-source"])):m("v-if",!0),e.eventDetail.extraction?.fields?.transactions?.length?(i(),h(V,{key:6},[a(B,{orientation:"left",plain:""},{default:o(()=>[...t[79]||(t[79]=[l("交易明细",-1)])]),_:1}),a(D,{columns:e.transactionColumns,"data-source":e.eventDetail.extraction.fields.transactions,pagination:{pageSize:10,size:"small"},"row-key":(s,C)=>C,size:"small"},{bodyCell:o(({column:s,record:C})=>[s.key==="occurredAt"?(i(),h(V,{key:0},[l(p(new Date(C.occurredAtMs).toLocaleDateString()),1)],64)):s.key==="amount"?(i(),h("span",{key:1,class:Ht(C.amount.direction==="in"?"amount-in":"amount-out")},p(C.amount.direction==="in"?"+":"-")+p(C.amount.value.toFixed(2))+" "+p(C.amount.currency),3)):m("v-if",!0)]),_:1},8,["data-source","row-key"])],64)):m("v-if",!0)],64)):(i(),b($,{key:1,description:"无事件数据"}))]),_:1},8,["open","title"]),m(" Alipay import drawer (Phase 6) "),a(K,{open:e.alipayConfigOpen,"onUpdate:open":t[23]||(t[23]=s=>e.alipayConfigOpen=s),title:"导入支付宝账单",placement:"right",width:"560","destroy-on-close":!0,onClose:e.resetAlipayForm},{footer:o(()=>[a(v,null,{default:o(()=>[a(g,{onClick:t[22]||(t[22]=s=>e.alipayConfigOpen=!1)},{default:o(()=>[...t[85]||(t[85]=[l("关闭",-1)])]),_:1}),a(g,{type:"primary",loading:e.loading.importAlipay,disabled:!e.alipayFormValid,onClick:e.importAlipay},{default:o(()=>[...t[86]||(t[86]=[l(" 注册账户 + 导入 ",-1)])]),_:1},8,["loading","disabled"])]),_:1})]),default:o(()=>[a(z,{message:"支付宝官方导出 CSV — 服务器侧全量、稳定无风控。3 分钟拿到 12 个月流水。",type:"info","show-icon":"",style:{"margin-bottom":"16px"}}),a(Be,{bordered:!1,style:{"margin-bottom":"12px"}},{default:o(()=>[a(Me,{header:"如何导出账单(首次必看)"},{default:o(()=>[...t[80]||(t[80]=[k("ol",{style:{"padding-left":"18px","font-size":"13px"}},[k("li",null,"支付宝 app → 我的 → 账单 → 右上角 ⋯"),k("li",null,'点 "开具交易流水证明"'),k("li",null,"选月份范围(最长 12 个月)"),k("li",null,'用途选 "个人对账"'),k("li",null,"发送到你的绑定邮箱"),k("li",null,[l("从邮箱下载 "),k("code",null,"alipay_record_*.zip")]),k("li",null,"解压密码 = 你的身份证后 6 位")],-1)])]),_:1})]),_:1}),a(E,{layout:"vertical",model:e.alipayForm},{default:o(()=>[a(X,{label:"支付宝绑定邮箱(账户标识)",required:""},{default:o(()=>[a(ee,{value:e.alipayForm.email,"onUpdate:value":t[19]||(t[19]=s=>e.alipayForm.email=s),placeholder:"alipay-bound@example.com",autocomplete:"off"},null,8,["value"])]),_:1}),a(X,null,{label:o(()=>[a(v,null,{default:o(()=>[t[81]||(t[81]=k("span",null,"ZIP 密码(身份证后 6 位)",-1)),a(H,{title:"支付宝 ZIP 默认密码 = 身份证号后 6 位。也支持自定义密码。"},{default:o(()=>[a(e.InfoCircleOutlined,{style:{color:"#888"}})]),_:1})]),_:1})]),default:o(()=>[a(le,{value:e.alipayForm.zipPassword,"onUpdate:value":t[20]||(t[20]=s=>e.alipayForm.zipPassword=s),placeholder:"例:123456",autocomplete:"off"},null,8,["value"]),t[82]||(t[82]=k("div",{class:"hint",style:{"margin-top":"4px"}}," 空白则解析时再问,或导入的 ZIP 未加密。 ",-1))]),_:1}),a(B,{orientation:"left",plain:""},{default:o(()=>[...t[83]||(t[83]=[l("选择文件",-1)])]),_:1}),a(X,{label:"ZIP 或 CSV 文件路径"},{default:o(()=>[a(ee,{value:e.alipayForm.filePath,"onUpdate:value":t[21]||(t[21]=s=>e.alipayForm.filePath=s),placeholder:"C:\\\\Users\\\\you\\\\Downloads\\\\alipay_record_xxx.zip","allow-clear":""},null,8,["value"]),t[84]||(t[84]=k("div",{class:"hint",style:{"margin-top":"4px"}}," 桌面版可通过 Electron 文件选择器自动填充;web-shell 复制完整路径。 ",-1))]),_:1}),e.alipayResult?(i(),h("div",ua,[a(z,{type:e.alipayResult.status==="ok"?"success":"error","show-icon":"",message:e.alipayResult.status==="ok"?`导入成功 — ${e.alipayResult.entityCounts?.events||0} 笔交易`:`导入失败: ${e.alipayResult.error||e.alipayResult.status}`,description:e.alipayResult.status==="ok"?`${e.alipayResult.entityCounts?.persons||0} 个交易对方 · ${e.alipayResult.kgTripleCount||0} KG triples · ${e.alipayResult.durationMs||0}ms`:null},null,8,["type","message","description"])])):m("v-if",!0)]),_:1},8,["model"])]),_:1},8,["open"]),m(" Phase 8.7 — Review queue drawer (待消歧) "),a(K,{open:e.reviewQueueOpen,"onUpdate:open":t[24]||(t[24]=s=>e.reviewQueueOpen=s),title:"待消歧(EntityResolver 模糊判定)",placement:"right",width:"640","destroy-on-close":!0},{default:o(()=>[e.reviewRows.length===0&&!e.loading.reviewQueue?(i(),b(z,{key:0,type:"success","show-icon":"",message:"无待消歧 pair — 所有跨源 Person 已确定。",style:{"margin-bottom":"12px"}})):m("v-if",!0),k("div",fa,[a(v,null,{default:o(()=>[a(g,{loading:e.loading.reviewQueue,onClick:e.loadReviewQueue},{icon:o(()=>[a(e.ReloadOutlined)]),default:o(()=>[t[87]||(t[87]=l(" 刷新 ",-1))]),_:1},8,["loading"]),a(g,{loading:e.loading.resolverDrain,onClick:e.drainResolver},{default:o(()=>[...t[88]||(t[88]=[l(" 手动 drain 队列 ",-1)])]),_:1},8,["loading"]),k("span",pa," queue: "+p(e.resolverStats.queue?.pending||0)+" pending · "+p(e.resolverStats.mergeGroups||0)+" groups ",1)]),_:1})]),a(Se,{"data-source":e.reviewRows,pagination:{pageSize:5,size:"small"},size:"small"},{renderItem:o(({item:s})=>[a(we,null,{default:o(()=>[a(x,{size:"small",style:{width:"100%"}},{default:o(()=>[k("div",ma,[k("strong",null,"Pair #"+p(s.id),1),s.embed_sim?(i(),b(O,{key:0,color:"blue",style:{"margin-left":"8px"}},{default:o(()=>[l(" sim "+p(Number(s.embed_sim).toFixed(2)),1)]),_:2},1024)):m("v-if",!0),s.llm_verdict?(i(),b(O,{key:1,color:s.llm_verdict==="yes"?"green":s.llm_verdict==="no"?"red":"orange",style:{"margin-left":"4px"}},{default:o(()=>[l(" LLM: "+p(s.llm_verdict),1)]),_:2},1032,["color"])):m("v-if",!0)]),k("div",ya," A: "+p(s.a_person_id),1),k("div",ga,"B: "+p(s.b_person_id),1),s.llm_reason?(i(),h("div",va," LLM 理由: "+p(s.llm_reason),1)):m("v-if",!0),a(v,{style:{"margin-top":"8px"}},{default:o(()=>[a(g,{size:"small",type:"primary",onClick:C=>e.decideReview(s.id,"same")},{default:o(()=>[...t[89]||(t[89]=[l("同一人",-1)])]),_:1},8,["onClick"]),a(g,{size:"small",danger:"",onClick:C=>e.decideReview(s.id,"different")},{default:o(()=>[...t[90]||(t[90]=[l("不同人",-1)])]),_:1},8,["onClick"]),a(g,{size:"small",onClick:C=>e.decideReview(s.id,"skip")},{default:o(()=>[...t[91]||(t[91]=[l("跳过",-1)])]),_:1},8,["onClick"])]),_:2},1024)]),_:2},1024)]),_:2},1024)]),_:1},8,["data-source"])]),_:1},8,["open"]),m(" Audit drawer "),a(K,{open:e.auditOpen,"onUpdate:open":t[25]||(t[25]=s=>e.auditOpen=s),title:"审计日志(数据 lineage)",placement:"right",width:"600",onAfterOpenChange:e.loadAudit},{default:o(()=>[a(D,{columns:e.auditColumns,"data-source":e.auditRows,pagination:{pageSize:20,size:"small"},"row-key":s=>s.id,size:"small"},{bodyCell:o(({column:s,record:C})=>[s.key==="at"?(i(),h(V,{key:0},[l(p(new Date(C.at).toLocaleString()),1)],64)):s.key==="details"?(i(),h("code",ka,p(C.details||"—"),1)):m("v-if",!0)]),_:1},8,["data-source","row-key"])]),_:1},8,["open"]),m(" Phase 10.3 — AIChat WebView 鉴权向导 "),a(e.AIChatWizard,{open:e.aichatWizardOpen,"onUpdate:open":t[26]||(t[26]=s=>e.aichatWizardOpen=s),"existing-accounts":e.aichatAccounts,onRegistered:e.onAichatRegistered},null,8,["open","existing-accounts"]),m(" Phase 12.6.10 — WeChat env-probe + register 向导 "),a(e.WechatWizard,{open:e.wechatWizardOpen,"onUpdate:open":t[27]||(t[27]=s=>e.wechatWizardOpen=s),onRegistered:e.onWechatRegistered},null,8,["open"]),m(" 如何导入 — per-source onboarding guide "),a(K,{open:e.guideDrawerOpen,"onUpdate:open":t[29]||(t[29]=s=>e.guideDrawerOpen=s),title:e.guideTarget&&e.guideTarget.guide?`如何导入:${e.guideTarget.guide.displayName}`:"如何导入",width:"520",placement:"right"},{default:o(()=>[e.guideTarget&&e.guideTarget.guide?(i(),h(V,{key:0},[a(v,{style:{"margin-bottom":"12px"},wrap:""},{default:o(()=>[a(O,{color:e.readinessStatusColor(e.guideTarget.status)},{default:o(()=>[l(p(e.readinessStatusLabel(e.guideTarget)),1)]),_:1},8,["color"]),a(O,null,{default:o(()=>[l(p(e.readinessCategoryLabel(e.guideTarget.guide.category)),1)]),_:1})]),_:1}),a(z,{type:"info",message:e.guideTarget.guide.summary,"show-icon":"",style:{"margin-bottom":"8px"}},null,8,["message"]),!e.guideTarget.ready&&e.guideTarget.message?(i(),b(z,{key:0,type:"warning",message:`当前状态:${e.guideTarget.message}`,"show-icon":"",style:{"margin-bottom":"16px"}},null,8,["message"])):m("v-if",!0),(i(!0),h(V,null,re(e.guideTarget.guide.methods,(s,C)=>(i(),h("div",{key:C,style:{"margin-bottom":"20px"}},[k("div",_a,[l(p(s.label)+" ",1),s.recommended?(i(),b(O,{key:0,color:"green",style:{"margin-left":"6px"}},{default:o(()=>[...t[92]||(t[92]=[l("推荐",-1)])]),_:1})):m("v-if",!0)]),k("ol",ba,[(i(!0),h(V,null,re(s.steps,(w,A)=>(i(),h("li",{key:A},p(w),1))),128))]),s.note?(i(),h("div",ha,p(s.note),1)):m("v-if",!0)]))),128)),a(B,{style:{margin:"12px 0"}}),a(v,null,{default:o(()=>[e.collectMode(e.guideTarget)!=="setup"?(i(),b(g,{key:0,type:"primary",size:"large",loading:e.loading.sync[e.guideTarget.name],onClick:t[28]||(t[28]=s=>e.oneClickCollect(e.guideTarget.name))},{default:o(()=>[l(p(e.collectActionLabel(e.guideTarget)),1)]),_:1},8,["loading"])):(i(),b(g,{key:1,type:"primary",size:"large",loading:e.loading.refresh,onClick:e.recheckGuideTarget},{default:o(()=>[...t[93]||(t[93]=[l(" 重新检测 ",-1)])]),_:1},8,["loading"])),k("span",Aa,p(e.collectActionDescription(e.guideTarget)),1)]),_:1})],64)):(i(),b($,{key:1,description:"该数据源暂无导入指引"}))]),_:1},8,["open","title"])])}const Ea=Le(Io,[["render",Oa],["__scopeId","data-v-92d13942"],["__file","/tmp/cc-web-panel-9tmCqb/repo/packages/web-panel/src/views/PersonalDataHub.vue"]]);export{Ea as default};
|
|
9
|
+
localStorage so the user's privacy choice survives reloads. `),e.adapterHasIncludeToggles(C.name)?(i(),b(F,{key:0,open:e.includePopoverOpen[C.name],"onUpdate:open":w=>e.includePopoverOpen[C.name]=w,trigger:"click",placement:"left",title:`${C.name} 采集范围`},{content:o(()=>[k("div",Xo,[(i(!0),h(Y,null,re(e.INCLUDE_KIND_META[C.name],w=>(i(),h("div",{key:w.key,style:{margin:"6px 0"}},[a(V,{checked:e.syncIncludeOptions[C.name][w.key]!==!1,onChange:A=>e.onIncludeKindToggle(C.name,w.key,A)},{default:o(()=>[l(p(w.label)+" ",1),k("span",Zo,p(w.hint),1),w.sensitive?(i(),b(O,{key:0,color:"orange",size:"small",style:{"margin-left":"4px"}},{default:o(()=>[...t[60]||(t[60]=[l("敏感",-1)])]),_:1})):m("v-if",!0)]),_:2},1032,["checked","onChange"])]))),128)),t[61]||(t[61]=k("div",{style:{"margin-top":"8px","font-size":"11px",color:"#999"}}," 取消勾选的数据本次同步不会拉取入库 ",-1))])]),default:o(()=>[a(g,{size:"small",title:"选择采集范围"},{default:o(()=>[...t[62]||(t[62]=[l("⚙",-1)])]),_:1})]),_:2},1032,["open","onUpdate:open","title"])):m("v-if",!0),a(ie,{title:`从注册表移除 ${C.name}?(vault 数据不会删除)`,onConfirm:w=>e.unregisterAdapter(C.name)},{default:o(()=>[a(g,{size:"small",danger:""},{default:o(()=>[...t[63]||(t[63]=[l("移除",-1)])]),_:1})]),_:1},8,["title","onConfirm"])]),_:2},1024)):m("v-if",!0)]),_:1},8,["data-source","row-key"])):(i(),b($,{key:1,description:"无已注册 adapter — 点上方按钮注册 MockAdapter 看效果"})),e.syncProgress.active?(i(),h("div",Jo,[a(x,{size:"small",bordered:!0},{default:o(()=>[k("div",$o,[t[64]||(t[64]=k("strong",null,"同步进行中",-1)),l(" · "+p(e.syncProgress.adapter)+" · "+p(e.syncProgress.phase||"...")+" ",1),e.syncProgress.attempt&&e.syncProgress.attempt>1?(i(),h("span",ea," (重试 #"+p(e.syncProgress.attempt)+") ",1)):m("v-if",!0)]),e.syncProgress.total>0?(i(),b(de,{key:0,percent:Math.round(e.syncProgress.current/e.syncProgress.total*100),status:e.syncProgress.errorMessage?"exception":"active",size:"small"},null,8,["percent","status"])):(i(),b(de,{key:1,percent:0,status:"active",size:"small"})),e.syncProgress.mailbox?(i(),h("div",ta," 邮箱 "+p(e.syncProgress.mailbox)+" · "+p(e.syncProgress.current)+" / "+p(e.syncProgress.total),1)):m("v-if",!0),e.syncProgress.errorMessage?(i(),h("div",na,p(e.syncProgress.errorMessage),1)):m("v-if",!0)]),_:1})])):m("v-if",!0),e.lastSync?(i(),h("div",oa,[a(z,{type:e.syncAlertType(e.lastSync),"show-icon":"",message:e.syncAlertMessage(e.lastSync),description:e.syncSummary(e.lastSync)},null,8,["type","message","description"])])):m("v-if",!0)]),_:1}),m(" Email config drawer (Phase 5.6) "),a(e.PdhOAuthCollectorDrawer,{open:e.oauthCollectorOpen,"onUpdate:open":t[7]||(t[7]=s=>e.oauthCollectorOpen=s),source:e.oauthCollectorTarget,onCollect:e.collectViaOAuth},null,8,["open","source"]),a(K,{open:e.emailConfigOpen,"onUpdate:open":t[17]||(t[17]=s=>e.emailConfigOpen=s),title:"添加邮箱账号",placement:"right",width:"560","destroy-on-close":!0,onClose:e.resetEmailForm},{footer:o(()=>[a(v,null,{default:o(()=>[a(g,{onClick:t[16]||(t[16]=s=>e.emailConfigOpen=!1)},{default:o(()=>[...t[74]||(t[74]=[l("取消",-1)])]),_:1}),a(g,{loading:e.loading.testEmail,disabled:!e.emailFormValid,onClick:e.testEmailAuth},{default:o(()=>[...t[75]||(t[75]=[l(" 测试连接 ",-1)])]),_:1},8,["loading","disabled"]),a(g,{type:"primary",loading:e.loading.saveEmail,disabled:!e.emailFormValid||!e.emailTestResult?.ok,onClick:e.saveEmail},{default:o(()=>[...t[76]||(t[76]=[l(" 保存并注册 ",-1)])]),_:1},8,["loading","disabled"])]),_:1})]),default:o(()=>[a(z,{message:"数据回归个人 — 凭证落本地加密文件(与 vault 主密钥同目录),同步动作 100% 本地。",type:"info","show-icon":"",style:{"margin-bottom":"16px"}}),a(E,{layout:"vertical",model:e.emailForm},{default:o(()=>[a(X,{label:"邮箱服务商",required:""},{default:o(()=>[a(be,{value:e.emailForm.provider,"onUpdate:value":t[8]||(t[8]=s=>e.emailForm.provider=s),placeholder:"选择服务商"},{default:o(()=>[a(oe,{value:"qq"},{default:o(()=>[...t[65]||(t[65]=[l("QQ 邮箱 (imap.qq.com)",-1)])]),_:1}),a(oe,{value:"163"},{default:o(()=>[...t[66]||(t[66]=[l("网易邮箱 163/126",-1)])]),_:1}),a(oe,{value:"189"},{default:o(()=>[...t[67]||(t[67]=[l("189 邮箱",-1)])]),_:1}),a(oe,{value:"outlook"},{default:o(()=>[...t[68]||(t[68]=[l("Outlook / Hotmail",-1)])]),_:1}),a(oe,{value:"gmail"},{default:o(()=>[...t[69]||(t[69]=[l("Gmail",-1)])]),_:1}),a(oe,{value:"custom"},{default:o(()=>[...t[70]||(t[70]=[l("自定义 IMAP",-1)])]),_:1})]),_:1},8,["value"])]),_:1}),a(X,{label:"邮箱地址",required:""},{default:o(()=>[a(ee,{value:e.emailForm.email,"onUpdate:value":t[9]||(t[9]=s=>e.emailForm.email=s),placeholder:"you@qq.com",autocomplete:"off"},null,8,["value"])]),_:1}),a(X,{required:""},{label:o(()=>[a(v,null,{default:o(()=>[t[71]||(t[71]=k("span",null,"授权码(非登录密码)",-1)),a(H,{title:e.providerAuthHint(e.emailForm.provider)},{default:o(()=>[a(e.InfoCircleOutlined,{style:{color:"#888"}})]),_:1},8,["title"])]),_:1})]),default:o(()=>[a(le,{value:e.emailForm.authCode,"onUpdate:value":t[10]||(t[10]=s=>e.emailForm.authCode=s),placeholder:"例:QQ 邮箱 设置 → 账户 → 开启 IMAP/SMTP → 生成的授权码",autocomplete:"off"},null,8,["value"])]),_:1}),e.emailForm.provider==="custom"?(i(),b(X,{key:0,label:"IMAP host"},{default:o(()=>[a(ee,{value:e.emailForm.host,"onUpdate:value":t[11]||(t[11]=s=>e.emailForm.host=s),placeholder:"mail.example.com"},null,8,["value"])]),_:1})):m("v-if",!0),e.emailForm.provider==="custom"?(i(),b(X,{key:1,label:"端口"},{default:o(()=>[a(fe,{value:e.emailForm.port,"onUpdate:value":t[12]||(t[12]=s=>e.emailForm.port=s),min:1,max:65535,"default-value":993},null,8,["value"])]),_:1})):m("v-if",!0),a(B,{orientation:"left",plain:""},{default:o(()=>[...t[72]||(t[72]=[l("PDF 账单解密提示(可选)",-1)])]),_:1}),t[73]||(t[73]=k("p",{class:"hint"}," 银行 PDF 月结大多加密;提供几个常用候选项让 Phase 5.5 自动解锁: ",-1)),a(X,{label:"身份证后 6 位"},{default:o(()=>[a(ee,{value:e.emailForm.pdfPasswordHints.idCardLast6,"onUpdate:value":t[13]||(t[13]=s=>e.emailForm.pdfPasswordHints.idCardLast6=s),placeholder:"123456",autocomplete:"off"},null,8,["value"])]),_:1}),a(X,{label:"手机后 6 位"},{default:o(()=>[a(ee,{value:e.emailForm.pdfPasswordHints.phoneLast6,"onUpdate:value":t[14]||(t[14]=s=>e.emailForm.pdfPasswordHints.phoneLast6=s),placeholder:"123456",autocomplete:"off"},null,8,["value"])]),_:1}),a(X,{label:"信用卡尾 6 位"},{default:o(()=>[a(ee,{value:e.emailForm.pdfPasswordHints.cardLast6,"onUpdate:value":t[15]||(t[15]=s=>e.emailForm.pdfPasswordHints.cardLast6=s),placeholder:"123456",autocomplete:"off"},null,8,["value"])]),_:1}),e.emailTestResult?(i(),h("div",aa,[a(z,{type:e.emailTestResult.ok?"success":"error","show-icon":"",message:e.emailTestResult.ok?"凭证有效 — 可以保存":`认证失败: ${e.emailTestResult.reason||e.emailTestResult.error}`},null,8,["type","message"])])):m("v-if",!0)]),_:1},8,["model"])]),_:1},8,["open"]),m(" Event detail drawer (Phase 5.6) "),a(K,{open:e.eventDetailOpen,"onUpdate:open":t[18]||(t[18]=s=>e.eventDetailOpen=s),title:e.eventDetail?`事件 ${e.eventDetail.event.id}`:"加载中...",placement:"right",width:"640","destroy-on-close":!0},{default:o(()=>[e.eventDetail?(i(),h(Y,{key:0},[a(Ue,{column:1,size:"small",bordered:""},{default:o(()=>[a(J,{label:"类型"},{default:o(()=>[l(p(e.eventDetail.event.subtype),1)]),_:1}),a(J,{label:"发生于"},{default:o(()=>[l(p(new Date(e.eventDetail.event.occurredAt).toLocaleString()),1)]),_:1}),a(J,{label:"actor"},{default:o(()=>[l(p(e.eventDetail.event.actor),1)]),_:1}),e.eventDetail.event.content?.title?(i(),b(J,{key:0,label:"标题"},{default:o(()=>[l(p(e.eventDetail.event.content.title),1)]),_:1})):m("v-if",!0),e.eventDetail.event.source?.adapter?(i(),b(J,{key:1,label:"来源 adapter"},{default:o(()=>[l(p(e.eventDetail.event.source.adapter)+" @ v"+p(e.eventDetail.event.source.adapterVersion),1)]),_:1})):m("v-if",!0)]),_:1}),e.eventDetail.classification?(i(),b(B,{key:0,orientation:"left",plain:""},{default:o(()=>[...t[77]||(t[77]=[l("分类",-1)])]),_:1})):m("v-if",!0),e.eventDetail.classification?(i(),h("div",ra,[a(O,{color:"blue"},{default:o(()=>[l(p(e.eventDetail.classification.category),1)]),_:1}),a(O,null,{default:o(()=>[l(p(e.eventDetail.classification.layer),1)]),_:1}),k("span",ia,"置信 "+p(Math.round((e.eventDetail.classification.confidence||0)*100))+"%",1)])):m("v-if",!0),e.eventDetail.extraction?(i(),b(B,{key:2,orientation:"left",plain:""},{default:o(()=>[l("结构化字段("+p(e.eventDetail.extraction.template)+")",1)]),_:1})):m("v-if",!0),e.eventDetail.extraction?(i(),h("pre",la,p(JSON.stringify(e.eventDetail.extraction.fields,null,2)),1)):m("v-if",!0),e.eventDetail.extraction?.pdfExtraction?(i(),b(B,{key:4,orientation:"left",plain:""},{default:o(()=>[...t[78]||(t[78]=[l("PDF 解密 / 解析",-1)])]),_:1})):m("v-if",!0),e.eventDetail.extraction?.pdfExtraction?(i(),b(Se,{key:5,"data-source":e.eventDetail.extraction.pdfExtraction,size:"small"},{renderItem:o(({item:s})=>[a(we,null,{default:o(()=>[a(Ce,{title:s.filename},{description:o(()=>[k("div",null,[a(O,{color:s.decrypted?"green":"red"},{default:o(()=>[l(p(s.decrypted?"已解密":"解密失败"),1)]),_:2},1032,["color"]),k("span",sa,"尝试 "+p(s.attempted)+" 次",1),s.transactionsExtracted!=null?(i(),h("span",da," · 提取 "+p(s.transactionsExtracted)+" 条交易 ",1)):m("v-if",!0)]),s.error?(i(),h("div",ca,p(s.error),1)):m("v-if",!0)]),_:2},1032,["title"])]),_:2},1024)]),_:1},8,["data-source"])):m("v-if",!0),e.eventDetail.extraction?.fields?.transactions?.length?(i(),h(Y,{key:6},[a(B,{orientation:"left",plain:""},{default:o(()=>[...t[79]||(t[79]=[l("交易明细",-1)])]),_:1}),a(D,{columns:e.transactionColumns,"data-source":e.eventDetail.extraction.fields.transactions,pagination:{pageSize:10,size:"small"},"row-key":(s,C)=>C,size:"small"},{bodyCell:o(({column:s,record:C})=>[s.key==="occurredAt"?(i(),h(Y,{key:0},[l(p(new Date(C.occurredAtMs).toLocaleDateString()),1)],64)):s.key==="amount"?(i(),h("span",{key:1,class:Ht(C.amount.direction==="in"?"amount-in":"amount-out")},p(C.amount.direction==="in"?"+":"-")+p(C.amount.value.toFixed(2))+" "+p(C.amount.currency),3)):m("v-if",!0)]),_:1},8,["data-source","row-key"])],64)):m("v-if",!0)],64)):(i(),b($,{key:1,description:"无事件数据"}))]),_:1},8,["open","title"]),m(" Alipay import drawer (Phase 6) "),a(K,{open:e.alipayConfigOpen,"onUpdate:open":t[23]||(t[23]=s=>e.alipayConfigOpen=s),title:"导入支付宝账单",placement:"right",width:"560","destroy-on-close":!0,onClose:e.resetAlipayForm},{footer:o(()=>[a(v,null,{default:o(()=>[a(g,{onClick:t[22]||(t[22]=s=>e.alipayConfigOpen=!1)},{default:o(()=>[...t[85]||(t[85]=[l("关闭",-1)])]),_:1}),a(g,{type:"primary",loading:e.loading.importAlipay,disabled:!e.alipayFormValid,onClick:e.importAlipay},{default:o(()=>[...t[86]||(t[86]=[l(" 注册账户 + 导入 ",-1)])]),_:1},8,["loading","disabled"])]),_:1})]),default:o(()=>[a(z,{message:"支付宝官方导出 CSV — 服务器侧全量、稳定无风控。3 分钟拿到 12 个月流水。",type:"info","show-icon":"",style:{"margin-bottom":"16px"}}),a(Be,{bordered:!1,style:{"margin-bottom":"12px"}},{default:o(()=>[a(Me,{header:"如何导出账单(首次必看)"},{default:o(()=>[...t[80]||(t[80]=[k("ol",{style:{"padding-left":"18px","font-size":"13px"}},[k("li",null,"支付宝 app → 我的 → 账单 → 右上角 ⋯"),k("li",null,'点 "开具交易流水证明"'),k("li",null,"选月份范围(最长 12 个月)"),k("li",null,'用途选 "个人对账"'),k("li",null,"发送到你的绑定邮箱"),k("li",null,[l("从邮箱下载 "),k("code",null,"alipay_record_*.zip")]),k("li",null,"解压密码 = 你的身份证后 6 位")],-1)])]),_:1})]),_:1}),a(E,{layout:"vertical",model:e.alipayForm},{default:o(()=>[a(X,{label:"支付宝绑定邮箱(账户标识)",required:""},{default:o(()=>[a(ee,{value:e.alipayForm.email,"onUpdate:value":t[19]||(t[19]=s=>e.alipayForm.email=s),placeholder:"alipay-bound@example.com",autocomplete:"off"},null,8,["value"])]),_:1}),a(X,null,{label:o(()=>[a(v,null,{default:o(()=>[t[81]||(t[81]=k("span",null,"ZIP 密码(身份证后 6 位)",-1)),a(H,{title:"支付宝 ZIP 默认密码 = 身份证号后 6 位。也支持自定义密码。"},{default:o(()=>[a(e.InfoCircleOutlined,{style:{color:"#888"}})]),_:1})]),_:1})]),default:o(()=>[a(le,{value:e.alipayForm.zipPassword,"onUpdate:value":t[20]||(t[20]=s=>e.alipayForm.zipPassword=s),placeholder:"例:123456",autocomplete:"off"},null,8,["value"]),t[82]||(t[82]=k("div",{class:"hint",style:{"margin-top":"4px"}}," 空白则解析时再问,或导入的 ZIP 未加密。 ",-1))]),_:1}),a(B,{orientation:"left",plain:""},{default:o(()=>[...t[83]||(t[83]=[l("选择文件",-1)])]),_:1}),a(X,{label:"ZIP 或 CSV 文件路径"},{default:o(()=>[a(ee,{value:e.alipayForm.filePath,"onUpdate:value":t[21]||(t[21]=s=>e.alipayForm.filePath=s),placeholder:"C:\\\\Users\\\\you\\\\Downloads\\\\alipay_record_xxx.zip","allow-clear":""},null,8,["value"]),t[84]||(t[84]=k("div",{class:"hint",style:{"margin-top":"4px"}}," 桌面版可通过 Electron 文件选择器自动填充;web-shell 复制完整路径。 ",-1))]),_:1}),e.alipayResult?(i(),h("div",ua,[a(z,{type:e.alipayResult.status==="ok"?"success":"error","show-icon":"",message:e.alipayResult.status==="ok"?`导入成功 — ${e.alipayResult.entityCounts?.events||0} 笔交易`:`导入失败: ${e.alipayResult.error||e.alipayResult.status}`,description:e.alipayResult.status==="ok"?`${e.alipayResult.entityCounts?.persons||0} 个交易对方 · ${e.alipayResult.kgTripleCount||0} KG triples · ${e.alipayResult.durationMs||0}ms`:null},null,8,["type","message","description"])])):m("v-if",!0)]),_:1},8,["model"])]),_:1},8,["open"]),m(" Phase 8.7 — Review queue drawer (待消歧) "),a(K,{open:e.reviewQueueOpen,"onUpdate:open":t[24]||(t[24]=s=>e.reviewQueueOpen=s),title:"待消歧(EntityResolver 模糊判定)",placement:"right",width:"640","destroy-on-close":!0},{default:o(()=>[e.reviewRows.length===0&&!e.loading.reviewQueue?(i(),b(z,{key:0,type:"success","show-icon":"",message:"无待消歧 pair — 所有跨源 Person 已确定。",style:{"margin-bottom":"12px"}})):m("v-if",!0),k("div",fa,[a(v,null,{default:o(()=>[a(g,{loading:e.loading.reviewQueue,onClick:e.loadReviewQueue},{icon:o(()=>[a(e.ReloadOutlined)]),default:o(()=>[t[87]||(t[87]=l(" 刷新 ",-1))]),_:1},8,["loading"]),a(g,{loading:e.loading.resolverDrain,onClick:e.drainResolver},{default:o(()=>[...t[88]||(t[88]=[l(" 手动 drain 队列 ",-1)])]),_:1},8,["loading"]),k("span",pa," queue: "+p(e.resolverStats.queue?.pending||0)+" pending · "+p(e.resolverStats.mergeGroups||0)+" groups ",1)]),_:1})]),a(Se,{"data-source":e.reviewRows,pagination:{pageSize:5,size:"small"},size:"small"},{renderItem:o(({item:s})=>[a(we,null,{default:o(()=>[a(x,{size:"small",style:{width:"100%"}},{default:o(()=>[k("div",ma,[k("strong",null,"Pair #"+p(s.id),1),s.embed_sim?(i(),b(O,{key:0,color:"blue",style:{"margin-left":"8px"}},{default:o(()=>[l(" sim "+p(Number(s.embed_sim).toFixed(2)),1)]),_:2},1024)):m("v-if",!0),s.llm_verdict?(i(),b(O,{key:1,color:s.llm_verdict==="yes"?"green":s.llm_verdict==="no"?"red":"orange",style:{"margin-left":"4px"}},{default:o(()=>[l(" LLM: "+p(s.llm_verdict),1)]),_:2},1032,["color"])):m("v-if",!0)]),k("div",ya," A: "+p(s.a_person_id),1),k("div",ga,"B: "+p(s.b_person_id),1),s.llm_reason?(i(),h("div",va," LLM 理由: "+p(s.llm_reason),1)):m("v-if",!0),a(v,{style:{"margin-top":"8px"}},{default:o(()=>[a(g,{size:"small",type:"primary",onClick:C=>e.decideReview(s.id,"same")},{default:o(()=>[...t[89]||(t[89]=[l("同一人",-1)])]),_:1},8,["onClick"]),a(g,{size:"small",danger:"",onClick:C=>e.decideReview(s.id,"different")},{default:o(()=>[...t[90]||(t[90]=[l("不同人",-1)])]),_:1},8,["onClick"]),a(g,{size:"small",onClick:C=>e.decideReview(s.id,"skip")},{default:o(()=>[...t[91]||(t[91]=[l("跳过",-1)])]),_:1},8,["onClick"])]),_:2},1024)]),_:2},1024)]),_:2},1024)]),_:1},8,["data-source"])]),_:1},8,["open"]),m(" Audit drawer "),a(K,{open:e.auditOpen,"onUpdate:open":t[25]||(t[25]=s=>e.auditOpen=s),title:"审计日志(数据 lineage)",placement:"right",width:"600",onAfterOpenChange:e.loadAudit},{default:o(()=>[a(D,{columns:e.auditColumns,"data-source":e.auditRows,pagination:{pageSize:20,size:"small"},"row-key":s=>s.id,size:"small"},{bodyCell:o(({column:s,record:C})=>[s.key==="at"?(i(),h(Y,{key:0},[l(p(new Date(C.at).toLocaleString()),1)],64)):s.key==="details"?(i(),h("code",ka,p(C.details||"—"),1)):m("v-if",!0)]),_:1},8,["data-source","row-key"])]),_:1},8,["open"]),m(" Phase 10.3 — AIChat WebView 鉴权向导 "),a(e.AIChatWizard,{open:e.aichatWizardOpen,"onUpdate:open":t[26]||(t[26]=s=>e.aichatWizardOpen=s),"existing-accounts":e.aichatAccounts,onRegistered:e.onAichatRegistered},null,8,["open","existing-accounts"]),m(" Phase 12.6.10 — WeChat env-probe + register 向导 "),a(e.WechatWizard,{open:e.wechatWizardOpen,"onUpdate:open":t[27]||(t[27]=s=>e.wechatWizardOpen=s),onRegistered:e.onWechatRegistered},null,8,["open"]),m(" 如何导入 — per-source onboarding guide "),a(K,{open:e.guideDrawerOpen,"onUpdate:open":t[29]||(t[29]=s=>e.guideDrawerOpen=s),title:e.guideTarget&&e.guideTarget.guide?`如何导入:${e.guideTarget.guide.displayName}`:"如何导入",width:"520",placement:"right"},{default:o(()=>[e.guideTarget&&e.guideTarget.guide?(i(),h(Y,{key:0},[a(v,{style:{"margin-bottom":"12px"},wrap:""},{default:o(()=>[a(O,{color:e.readinessStatusColor(e.guideTarget.status)},{default:o(()=>[l(p(e.readinessStatusLabel(e.guideTarget)),1)]),_:1},8,["color"]),a(O,null,{default:o(()=>[l(p(e.readinessCategoryLabel(e.guideTarget.guide.category)),1)]),_:1})]),_:1}),a(z,{type:"info",message:e.guideTarget.guide.summary,"show-icon":"",style:{"margin-bottom":"8px"}},null,8,["message"]),!e.guideTarget.ready&&e.guideTarget.message?(i(),b(z,{key:0,type:"warning",message:`当前状态:${e.guideTarget.message}`,"show-icon":"",style:{"margin-bottom":"16px"}},null,8,["message"])):m("v-if",!0),(i(!0),h(Y,null,re(e.guideTarget.guide.methods,(s,C)=>(i(),h("div",{key:C,style:{"margin-bottom":"20px"}},[k("div",_a,[l(p(s.label)+" ",1),s.recommended?(i(),b(O,{key:0,color:"green",style:{"margin-left":"6px"}},{default:o(()=>[...t[92]||(t[92]=[l("推荐",-1)])]),_:1})):m("v-if",!0)]),k("ol",ba,[(i(!0),h(Y,null,re(s.steps,(w,A)=>(i(),h("li",{key:A},p(w),1))),128))]),s.note?(i(),h("div",ha,p(s.note),1)):m("v-if",!0)]))),128)),a(B,{style:{margin:"12px 0"}}),a(v,null,{default:o(()=>[e.collectMode(e.guideTarget)!=="setup"?(i(),b(g,{key:0,type:"primary",size:"large",loading:e.loading.sync[e.guideTarget.name],onClick:t[28]||(t[28]=s=>e.oneClickCollect(e.guideTarget.name))},{default:o(()=>[l(p(e.collectActionLabel(e.guideTarget)),1)]),_:1},8,["loading"])):(i(),b(g,{key:1,type:"primary",size:"large",loading:e.loading.refresh,onClick:e.recheckGuideTarget},{default:o(()=>[...t[93]||(t[93]=[l(" 重新检测 ",-1)])]),_:1},8,["loading"])),k("span",Aa,p(e.collectActionDescription(e.guideTarget)),1)]),_:1})],64)):(i(),b($,{key:1,description:"该数据源暂无导入指引"}))]),_:1},8,["open","title"])])}const Ea=Le(Io,[["render",Oa],["__scopeId","data-v-92d13942"],["__file","/tmp/cc-web-panel-8U3FtY/repo/packages/web-panel/src/views/PersonalDataHub.vue"]]);export{Ea as default};
|