chainlesschain 0.162.176 → 0.162.178
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -0
- package/package.json +1 -1
- package/src/assets/web-panel/.build-hash +1 -1
- package/src/assets/web-panel/assets/{AIOps-BDLu5Elz.js → AIOps-DRftcSue.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-DH5us-CK.js → ActionButton-BFvUaMKR.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-BZ0u8IFG.js → Analytics-C0-Rru4P.js} +3 -3
- package/src/assets/web-panel/assets/AppLayout-bx-BCljj.js +9 -0
- package/src/assets/web-panel/assets/{Artifacts-Br2YBbh_.js → Artifacts-DAJ8B3Un.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-C3C6a482.js → Audit-hOk4L1lr.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-CzHvebcj.js → BackgroundAgents-3pbDpM9z.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-DZNHYDFd.js → Backup-BtziGDn9.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-VRiC4fIx.js → BaseInput-kmshphJ3.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-Cm08WWAD.js → Chat-d7tGSosA.js} +5 -5
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-CGHYrugQ.js → ChatBubbleRenderer-p-_PBpX_.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-DtByk7d7.js → Checkbox-C4Eh4Tz5.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-CphXXOfD.js → Codegen-r7gmhZyA.js} +1 -1
- package/src/assets/web-panel/assets/{Col-Hz86TnLR.js → Col-U7mDaGlL.js} +1 -1
- package/src/assets/web-panel/assets/{Community-HP03ltpD.js → Community-Bpu8aH1T.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-B_N1mqQz.js → Compact-CHb2XBJe.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-CVztRpi8.js → Compliance-Cn_r4dey.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-wUVOyZih.js → Cowork-CdMWfDcz.js} +4 -4
- package/src/assets/web-panel/assets/{Cron-DW5TLJKw.js → Cron-BtnREHWy.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-CrAFGhWH.js → Crosschain-BKI9TSzr.js} +1 -1
- package/src/assets/web-panel/assets/{DID-pA-oD8ke.js → DID-pkNubzzJ.js} +2 -2
- package/src/assets/web-panel/assets/Dashboard-1rrz1snN.js +3 -0
- package/src/assets/web-panel/assets/{Dropdown-EweJcsek.js → Dropdown-DLyFVxDc.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-C9xVLPG4.js → EmailListRenderer-CtUWfYVq.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-CDcEEqlu.js → FamilyGuardDashboard-B8eX2Qe4.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-DtZda9A_.js → Federation-D8lsDGus.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-CiYdcVz3.js → FormItemContext-CRYt_aIw.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-DA13uwA0.js → GenericCardRenderer-ClKzY8_N.js} +1 -1
- package/src/assets/web-panel/assets/{Git-DzRhZD1O.js → Git-BXj5Dney.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-D5RMgOSb.js → Governance-Cm-I8RMz.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-BgrPfSNk.js → Inference-CPvbhvgt.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-DzjnD571.js → KnowledgeGraph-sYNDZaoi.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-BhWzVDtN.js → Logs-BZY_3CRZ.js} +2 -2
- package/src/assets/web-panel/assets/{MarkdownRenderer-BDape9cx.js → MarkdownRenderer-up0BW6pv.js} +1 -1
- package/src/assets/web-panel/assets/{Marketplace-DJtL5GV7.js → Marketplace-C5MEJ2Qe.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-CZcQygI7.js → McpTools-ihdrn43I.js} +5 -5
- package/src/assets/web-panel/assets/{Memory-DUWSDUUu.js → Memory-Br8bPMlh.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-BTwq2WKY.js → MobileBridge-BNntgrYW.js} +1 -1
- package/src/assets/web-panel/assets/MobileProjects-BdV915mw.js +1 -0
- package/src/assets/web-panel/assets/{Mtc-BiGugEQm.js → Mtc-A3wDmlqL.js} +5 -5
- package/src/assets/web-panel/assets/{MtcAudit-DY7a6gUe.js → MtcAudit-CF-mBLWM.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-BQbDu_w7.js → Multisig-Iy2k_MSo.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-CM2wXTLv.js → NLProgramming-kk0W7HUb.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-DI6gGs1v.js → Notes-B5u5t_4S.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-BsZOLWAB.js → NotificationSettings-BN0POf6_.js} +1 -1
- package/src/assets/web-panel/assets/OrderTableRenderer-CHkSUrXB.js +1 -0
- package/src/assets/web-panel/assets/{Organization-Cds0_tXr.js → Organization-DwWQESuN.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-WunYMD87.js → Overflow-DG6klrcC.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-Bo6j4DDv.js → P2P-BwJcKkgZ.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-Bh2XPD5f.js → PdhVaultBrowser-BwOHG0in.js} +5 -5
- package/src/assets/web-panel/assets/{Permissions-EMvMMC8N.js → Permissions-CGMXe4TX.js} +4 -4
- package/src/assets/web-panel/assets/PersonalDataHub-ziYqg7-A.js +8 -0
- package/src/assets/web-panel/assets/{Pipeline-BOx8HOgL.js → Pipeline-BzJfeoGt.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-tBeTVQVM.js → Privacy-DLh3Bblx.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-CVYg1W4M.js → ProjectInit-USVWW36c.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-Dvt5I7y1.js → ProjectSettings-CiiOn62h.js} +2 -2
- package/src/assets/web-panel/assets/Projects-6V-PNmcA.js +1 -0
- package/src/assets/web-panel/assets/{Providers-Ct8xqY-E.js → Providers-CBPWWzpu.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-Cni8Ooja.js → QrScannerModal-QVwoRUq3.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-BJVLKdxr.js → QuickAsk-CXnR-2Vn.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-DPG8Rbbm.js → Recommend-ClaNzjmF.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-DsdR7dCt.js → RemoteSession-C3rGw8vJ.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-Csg1YM-b.js → Reputation-Ci-OWAoP.js} +1 -1
- package/src/assets/web-panel/assets/{Row-D9DoFoEf.js → Row-DRhAwXOS.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-BsvKrXMS.js → RssFeed-BQLJQ2_y.js} +3 -3
- package/src/assets/web-panel/assets/{Search-DFUStfgQ.js → Search-QQUpkfFd.js} +1 -1
- package/src/assets/web-panel/assets/{Security-ILg1zxdK.js → Security-DdXKzuKT.js} +4 -4
- package/src/assets/web-panel/assets/{Services-Dd41PCaY.js → Services-x2Zh62Qd.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-Bzo1cN80.js → Skeleton-GdY4KwRz.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-BDHh17P0.js → Skills-Bv4tY1Fd.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-jl7UTiRY.js → Sla-C3QnM-11.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-BePa-RF6.js → SpeechSettings-Bl3ytvmI.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-DiqqDKGZ.js → SyncSettings-Wp9IwTsP.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-DYQ_6lxj.js → Tasks-CF3rIrDe.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-JiDeI06L.js → Templates-CGfvVVM9.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-hhgI6zwS.js → Tenant-CVXmwQ3U.js} +1 -1
- package/src/assets/web-panel/assets/Terminal-bvwrt03E.js +3 -0
- package/src/assets/web-panel/assets/{TimelineRenderer-B8uB5Llk.js → TimelineRenderer-D0g74KhH.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-C3b_6r2z.js → Tokens-BH4IwzlT.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-tIP7HKVe.js → Trigger-DJOpM533.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-vjoc11vJ.js → Trust-B43EPRLr.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-DUPBnGuH.js → UkeySign-BmBFG-em.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-CBvhUY5T.js → VideoEditing-n9oJwB8k.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-DUaQ0uA5.js → Wallet-D5QeivHp.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-DllSivjE.js → WebAuthn-DcNy7igO.js} +5 -5
- package/src/assets/web-panel/assets/{WorkflowEditor-xc8D3uO6.js → WorkflowEditor-BVjc7-5-.js} +1 -1
- package/src/assets/web-panel/assets/{chat-BVicU7oA.js → chat-Dy5Tfj3m.js} +1 -1
- package/src/assets/web-panel/assets/{colors-DJzLmhLm.js → colors-C4c2CNZU.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-BvYRfThE.js → compact-item-DPa3O5vN.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-DGXxCBKR.js → createContext-TLcfNA6_.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-BAwdDA_5.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-SBDJB1y4.js → hasIn-D41LVFkp.js} +1 -1
- package/src/assets/web-panel/assets/{index-D7HimK0M.js → index-0oevYjfT.js} +1 -1
- package/src/assets/web-panel/assets/{index-DCdRAgjy.js → index-388pLGJ1.js} +1 -1
- package/src/assets/web-panel/assets/{index-BO1itZaY.js → index-B8nLBZbv.js} +3 -3
- package/src/assets/web-panel/assets/{index-DvUTDYXX.js → index-BPTGAjee.js} +1 -1
- package/src/assets/web-panel/assets/{index-hxTODbM1.js → index-BPtrOBmW.js} +1 -1
- package/src/assets/web-panel/assets/{index-wcCL-miV.js → index-BQiIxHBy.js} +1 -1
- package/src/assets/web-panel/assets/{index-CKyEivf8.js → index-BSM1cHVK.js} +1 -1
- package/src/assets/web-panel/assets/{index-BJZf9DhV.js → index-BYPr9fkz.js} +1 -1
- package/src/assets/web-panel/assets/{index-DHVLJ8q0.js → index-BsQ7Ev6i.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cs2rmLFt.js → index-Btk9qLL2.js} +1 -1
- package/src/assets/web-panel/assets/{index-z1ZylsLq.js → index-BvmziZSG.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cf-O_g_8.js → index-BvopLC_T.js} +1 -1
- package/src/assets/web-panel/assets/{index-DMarmfrv.js → index-C7xhTVyP.js} +1 -1
- package/src/assets/web-panel/assets/{index-CoJAO1Lm.js → index-CNk_ZooP.js} +1 -1
- package/src/assets/web-panel/assets/{index-9gdI7uUW.js → index-CQrEHoOG.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bf-ctERC.js → index-CSxex23J.js} +1 -1
- package/src/assets/web-panel/assets/{index-MjC4G09d.js → index-CVjgm992.js} +1 -1
- package/src/assets/web-panel/assets/{index-e4fXH_WO.js → index-CWK4zOPe.js} +1 -1
- package/src/assets/web-panel/assets/{index-xfluRkCT.js → index-CX0VsoP4.js} +1 -1
- package/src/assets/web-panel/assets/{index-DRfiXB_p.js → index-CXl0YPNG.js} +1 -1
- package/src/assets/web-panel/assets/{index-d5BVd-cL.js → index-Cip7LWml.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dm_77jgR.js → index-Cq_hlWNt.js} +1 -1
- package/src/assets/web-panel/assets/{index-YJkzy8ZF.js → index-CzZ49YZL.js} +1 -1
- package/src/assets/web-panel/assets/{index-CtwqO5qo.js → index-D2Nkivlm.js} +1 -1
- package/src/assets/web-panel/assets/{index-BYqz4Wrr.js → index-DBUgRs4D.js} +1 -1
- package/src/assets/web-panel/assets/index-DEjVkdzq.js +1 -0
- package/src/assets/web-panel/assets/{index-CdGY9P8a.js → index-DNsBj2Ob.js} +1 -1
- package/src/assets/web-panel/assets/{index-DonCnfMr.js → index-Di4X8cfI.js} +1 -1
- package/src/assets/web-panel/assets/{index-1SdDS6lR.js → index-DljFsVGI.js} +1 -1
- package/src/assets/web-panel/assets/{index-DnjPdvR6.js → index-Korc3QIe.js} +1 -1
- package/src/assets/web-panel/assets/index-LMOc5xrS.js +1 -0
- package/src/assets/web-panel/assets/{index-VMfwIH5G.js → index-MKZDje0H.js} +1 -1
- package/src/assets/web-panel/assets/{index-DKrvvWm4.js → index-OHAfRu_3.js} +1 -1
- package/src/assets/web-panel/assets/{index-FxZzRyE1.js → index-WEJr8PL5.js} +1 -1
- package/src/assets/web-panel/assets/{index-Crk5NTb0.js → index-WinCp6du.js} +1 -1
- package/src/assets/web-panel/assets/{index-DCqRS6da.js → index-Yjr6cqSK.js} +1 -1
- package/src/assets/web-panel/assets/{index-BTrBGBJs.js → index-iQ6gtFih.js} +1 -1
- package/src/assets/web-panel/assets/{index-lpaGoTH3.js → index-pt3s7yvV.js} +1 -1
- package/src/assets/web-panel/assets/{index-CloCgBUR.js → index-tQ3igERQ.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-C1zO1KnY.js → initDefaultProps-BFZu87WZ.js} +1 -1
- package/src/assets/web-panel/assets/{motion-CWLtEGmC.js → motion-DJIo7qvt.js} +1 -1
- package/src/assets/web-panel/assets/{move-DzD_C3Vm.js → move-Cfr5qknL.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-D880PYJl.js → mtc-parser-Bgc-OadH.js} +1 -1
- package/src/assets/web-panel/assets/{omit-CFR_z2ov.js → omit-X3WI-TNp.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-srIhgrSC.js → pickAttrs-pJhU9IxK.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-C1rXpibP.js → placementArrow-BNg_Vj3T.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-C30gRcSS.js → responsiveObserve-TeSEGQ5-.js} +1 -1
- package/src/assets/web-panel/assets/{slide-CvtKiMfV.js → slide-D_t_P0bv.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-DNHO7ITG.js → statusUtils-DrrIMwAT.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-Dt_Sl-g4.js → styleChecker-BjZCuFRm.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-Cjev42Gh.js → useFlexGapSupport-rTFdlqdQ.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-Baxglj2V.js → useFs-BidCpfLX.js} +1 -1
- package/src/assets/web-panel/assets/usePersonalDataHub-C5mHttA9.js +1 -0
- package/src/assets/web-panel/assets/{vnode-mIRkdT7o.js → vnode-BrbcRiHZ.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-HzI5DlH_.js → zoom-PISX7AkR.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/commands/__tests__/hub-wechat.test.js +45 -0
- package/src/commands/agenda.js +22 -6
- package/src/commands/agent.js +3 -3
- package/src/commands/background-session.js +16 -6
- package/src/commands/batch.js +79 -27
- package/src/commands/changelog.js +15 -4
- package/src/commands/context.js +33 -1
- package/src/commands/eval.js +21 -6
- package/src/commands/hook.js +2 -2
- package/src/commands/hub.js +473 -39
- package/src/commands/init.js +212 -110
- package/src/commands/llm.js +22 -6
- package/src/commands/loop.js +9 -2
- package/src/commands/skill.js +13 -1
- package/src/commands/statusline.js +3 -3
- package/src/data/changelog.json +53 -5
- package/src/gateways/ws/personal-data-hub-protocol.js +22 -2
- package/src/harness/background-task-manager.js +18 -6
- package/src/harness/background-task-worker.js +11 -18
- package/src/harness/golden-transcript.js +3 -0
- package/src/harness/mcp-client.js +9 -15
- package/src/harness/worktree-isolator.js +18 -21
- package/src/index.js +18 -7
- package/src/lib/agent-core.js +5 -0
- package/src/lib/agent-ipc-bus.js +12 -3
- package/src/lib/agent-team/team-worktree.js +28 -6
- package/src/lib/agent-worktree.js +20 -19
- package/src/lib/approval-authority-store.js +891 -0
- package/src/lib/async-hook-supervisor.cjs +134 -24
- package/src/lib/async-hook-supervisor.js +47 -0
- package/src/lib/background-agent-supervisor.js +35 -12
- package/src/lib/background-interaction-resolver.js +399 -54
- package/src/lib/background-session-transport.js +3 -1
- package/src/lib/background-task-manager.js +5 -1
- package/src/lib/changelog.js +57 -0
- package/src/lib/chrome-connector.js +6 -2
- package/src/lib/claude-code-bridge.js +24 -8
- package/src/lib/cli-anything-bridge.js +82 -25
- package/src/lib/context-breakdown.js +82 -3
- package/src/lib/doctor-checkup.js +18 -6
- package/src/lib/eval/tasks.js +25 -31
- package/src/lib/event-runtime-host.js +225 -0
- package/src/lib/event-runtime-store.js +102 -21
- package/src/lib/event-runtime-worker.js +70 -2
- package/src/lib/hook-runner.cjs +71 -36
- package/src/lib/hook-runner.js +55 -0
- package/src/lib/hooks-v2-producers.js +33 -8
- package/src/lib/hooks-v2-runtime.js +360 -40
- package/src/lib/host-adb-bridge.js +18 -3
- package/src/lib/interaction-adapter.js +66 -0
- package/src/lib/lsp/__tests__/benchmark.test.js +61 -0
- package/src/lib/lsp/__tests__/lsp-client.test.js +6 -1
- package/src/lib/lsp/benchmark.js +20 -4
- package/src/lib/lsp/lsp-client.js +6 -4
- package/src/lib/lsp/lsp-server-registry.js +0 -2
- package/src/lib/operation-fingerprint.js +107 -2
- package/src/lib/orchestrator.js +8 -2
- package/src/lib/packer/pack-update-applier.js +14 -2
- package/src/lib/packer/smoke-runner.js +18 -5
- package/src/lib/paths.js +1 -1
- package/src/lib/pdh-dedicated-batch-collectors.js +124 -0
- package/src/lib/personal-data-hub-wiring.js +327 -52
- package/src/lib/plugin-monitor-supervisor.js +20 -13
- package/src/lib/plugin-runtime/install.js +10 -3
- package/src/lib/process-execution-broker/credential-agent.js +954 -111
- package/src/lib/process-execution-broker/index.js +369 -85
- package/src/lib/process-execution-broker/platform-sandbox.js +320 -140
- package/src/lib/provider-http-error.js +94 -0
- package/src/lib/remote-approval-bridge.js +222 -26
- package/src/lib/repl-bang-memorize.js +10 -2
- package/src/lib/repl-goal.js +19 -2
- package/src/lib/settings-hook-events.cjs +13 -8
- package/src/lib/settings-hook-events.js +20 -0
- package/src/lib/side-effect-ledger-store.js +65 -14
- package/src/lib/skill-loader.js +215 -12
- package/src/lib/skill-packs/generator.js +18 -9
- package/src/lib/skill-process-broker.js +85 -0
- package/src/lib/slash-commands.js +10 -2
- package/src/lib/status-line.cjs +28 -7
- package/src/lib/status-line.js +33 -0
- package/src/lib/sub-agent-context.js +42 -0
- package/src/lib/turn-binding-store.js +64 -15
- package/src/lib/turn-binding.js +85 -16
- package/src/repl/agent-repl.js +88 -49
- package/src/repl/remote-approval.js +13 -13
- package/src/repl/repl-turn-binding.js +46 -16
- package/src/runtime/agent-core.js +419 -84
- package/src/runtime/coding-agent-contract-shared.cjs +16 -0
- package/src/runtime/headless-runner.js +172 -44
- package/src/runtime/headless-stream.js +221 -11
- package/src/runtime/session-slash-commands.js +506 -0
- package/src/skills/video-editing/extractors/audio-extractor.js +13 -5
- package/src/skills/video-editing/extractors/video-extractor.js +13 -3
- package/src/skills/video-editing/media-process.js +20 -0
- package/src/skills/video-editing/render/audio-mix.js +13 -3
- package/src/skills/video-editing/render/ffmpeg-concat.js +7 -2
- package/src/skills/video-editing/render/ffmpeg-extract.js +7 -2
- package/src/workers/background-agent-worker.js +76 -40
- package/src/assets/web-panel/assets/AppLayout-Duu8xR14.js +0 -9
- package/src/assets/web-panel/assets/Dashboard-CXrd5gAw.js +0 -3
- package/src/assets/web-panel/assets/MobileProjects-NZvvfDME.js +0 -1
- package/src/assets/web-panel/assets/OrderTableRenderer-C48mu09U.js +0 -1
- package/src/assets/web-panel/assets/PersonalDataHub-AX3ypUDV.js +0 -9
- package/src/assets/web-panel/assets/Projects-Cc7FC9-e.js +0 -1
- package/src/assets/web-panel/assets/Terminal-CjTZPa37.js +0 -3
- package/src/assets/web-panel/assets/devWarning-BT46Y_QI.js +0 -1
- package/src/assets/web-panel/assets/index-B7nuIywP.js +0 -1
- package/src/assets/web-panel/assets/index-ycwAfC-i.js +0 -1
- package/src/assets/web-panel/assets/usePersonalDataHub-B4NkcLaP.js +0 -1
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import{I as A,P as r,S as h,K as a,c as o,J as _,U as y,F as V,Z as re,_ as St,R as u,Q as i,V as f,a2 as Dt,w as Oe,b as ae,a as ne,r as I,a5 as un,o as gt,a1 as cn,a0 as fn}from"./vendor-Bn1JzzAn.js";import{u as fe}from"./usePersonalDataHub-C5mHttA9.js";import{_ as Be,d as p}from"./index-B8nLBZbv.js";import{aD as yt,O as vt,aE as kt,aF as _t,a1 as bt,aG as mn,ag as pn,p as gn,aC as yn,W as vn,e as kn,aH as _n,aa as bn,am as An,ac as hn,n as wn,R as Cn}from"./icons-DG5UD-6K.js";const W=Object.freeze({SYNC:"sync",FILE:"file",COOKIE:"cookie",ADB:"adb",SETUP:"setup"}),On=new Set(["social-bilibili","social-weibo","social-douyin","social-xiaohongshu","social-toutiao","social-kuaishou"]),Sn=new Set(["sync:file-import","sync:snapshot","sync:sqlite"]),Dn=new Set(["NO_KEY_PROVIDER","EMPTY_KEY","KEY_PROVIDER_THREW","ENV_UNSUPPORTED"]);function En(m){return Array.isArray(m?.capabilities)?m.capabilities:[]}function ye(m){if(!m||typeof m!="object")return W.SETUP;if(On.has(m.name))return W.ADB;if(m.ready===!0)return W.SYNC;const t=En(m);return Dn.has(m.reason)?W.SETUP:t.includes("sync:cookie")?W.COOKIE:t.some(g=>Sn.has(g))?W.FILE:m.ready==null&&m.category==="local"?W.SYNC:W.SETUP}function At(m){switch(ye(m)){case W.FILE:return"📂 选择文件采集";case W.COOKIE:return"🔑 登录采集";case W.ADB:return"📱 USB 一键采集";case W.SYNC:return"⚡ 立即采集";default:return"查看采集步骤"}}function ht(m){switch(ye(m)){case W.FILE:return"📂 采集";case W.COOKIE:return"🔑 采集";case W.ADB:return"📱 采集";case W.SYNC:return"采集";default:return"查看步骤"}}function wt(m){switch(ye(m)){case W.FILE:return"选择导出或解密好的文件,自动入库";case W.COOKIE:return"粘贴当前登录 Cookie 后采集入库";case W.ADB:return"连接已授权的 Android 手机后自动采集";case W.SYNC:return"复用当前配置,直接采集入库";default:return"先按上述步骤完成采集配置"}}const In=Object.freeze(["events","persons","places","items","topics"]);function te(m){return Number.isFinite(m)&&m>0?m:0}function Me(m){return Number.isFinite(m)&&m>0?m:null}function Ce(m){return Number.isFinite(m)&&m>=0?m:null}function Rn(m){const t=m?.entityCounts;return!t||typeof t!="object"?0:In.reduce((g,e)=>g+te(t[e]),0)}function se(m){const t=!!m&&typeof m=="object",g=t&&typeof m.status=="string"?m.status:"invalid",e=Rn(m),K=te(m?.rawCount),Q=te(m?.archivedRawCount),v=te(m?.archiveFailureCount),E=te(m?.invalidCount),k=m?.watermarkDeferred===!0,O=typeof m?.checkpointCommitted=="boolean"?m.checkpointCommitted:null,R={archivedRawCount:Q,archiveFailureCount:v,checkpointCommitted:O},T={pageBudget:Me(m?.pageBudget),nextPageBudget:Me(m?.nextPageBudget),scanDeferredCount:te(m?.scanDeferredCount),watermarkLookbackMs:te(m?.watermarkLookbackMs),collectionSinceWatermark:typeof m?.collectionSinceWatermark=="string"?m.collectionSinceWatermark:null},U={attemptCount:te(m?.attemptCount),retryCount:te(m?.retryCount),totalRetryDelayMs:te(m?.totalRetryDelayMs),retryExhausted:m?.retryExhausted===!0,retryAfterMs:Me(m?.retryAfterMs),rateLimitReason:typeof m?.rateLimitReason=="string"?m.rateLimitReason:null,rateLimitRemainingMinute:Ce(m?.rateLimitRemainingMinute),rateLimitRemainingDay:Ce(m?.rateLimitRemainingDay),sourceRequestCount:te(m?.sourceRequestCount),sourceRequestThrottleMs:te(m?.sourceRequestThrottleMs),sourceRequestRateLimitRemainingMinute:Ce(m?.sourceRequestRateLimitRemainingMinute),sourceRequestRateLimitRemainingDay:Ce(m?.sourceRequestRateLimitRemainingDay)};return t&&g==="skipped"?{kind:"skipped",level:"info",completed:!0,status:g,total:e,rawCount:K,...R,...T,...U,invalidCount:E,error:null,skipReason:m.skipReason||"NOT_READY",skipMessage:m.skipMessage||"来源当前未就绪"}:!t||g!=="ok"?{kind:"failed",level:"error",completed:!1,status:g,total:e,rawCount:K,...R,...T,...U,invalidCount:E,error:t&&typeof m.error=="string"&&m.error.trim()||(g==="invalid"?"未收到有效同步报告":`同步状态:${g}`)}:k||v>0||O===!1||E>0||K>0&&e===0?{kind:"partial",level:"warning",completed:!0,status:g,total:e,rawCount:K,...R,...T,...U,invalidCount:E,watermarkDeferred:k,error:null}:e===0?{kind:"empty",level:"info",completed:!0,status:g,total:e,rawCount:K,...R,...T,...U,invalidCount:E,error:null}:{kind:"success",level:"success",completed:!0,status:g,total:e,rawCount:K,...R,...T,...U,invalidCount:E,watermarkDeferred:k,error:null}}function Ct(m){if(!Array.isArray(m))return{level:"error",completed:!1,totalReports:0,totalEntities:0,success:0,empty:0,partial:0,skipped:0,failed:1,analyses:[]};const t=m.map(se),g={level:"success",completed:!0,totalReports:t.length,totalEntities:t.reduce((e,K)=>e+K.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 g.failed>0?(g.level=g.failed===g.totalReports?"error":"warning",g.completed=!1):g.partial>0?g.level="warning":(g.skipped>0||g.success===0)&&(g.level="info"),g}function Ot(m){return!Array.isArray(m)||m.length===0?null:m.find(t=>se(t).kind==="failed")||m.find(t=>se(t).kind==="partial")||m.find(t=>se(t).kind==="skipped")||m[m.length-1]}const Pn={__name:"AIChatWizard",props:{open:{type:Boolean,default:!1},existingAccounts:{type:Array,default:()=>[]}},emits:["update:open","registered"],setup(m,{expose:t,emit:g}){t();const e=m,K=g,Q=[{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}],v=fe(),E=I(1),k=I(null),O=I(""),R=I(null),T=I(null),U=I(null),N=ne({open:!1,probe:!1,register:!1}),j=ae(()=>Q.find(S=>S.vendor===k.value)||{}),H=ae(()=>E.value===1?"选择一家 AI 服务商":E.value===2?R.value?.fallbackMode==="paste"?"在外部浏览器登录,把 cookie 粘贴到下面":"在内嵌浏览器登录,主进程自动读取 cookie":"校验并写入本地加密 vault"),z=ae(()=>{const S=T.value;return S?S.reason==="UNKNOWN_VENDOR"?"未知厂商 — 请刷新页面或重选":S.reason==="PASTE_REQUIRED"?"请先粘贴 cookie 字符串":S.missingRequired?.length?`缺关键 cookie: ${S.missingRequired.join(", ")}`:S.reason||"cookie 校验失败":""}),Z=ae(()=>{const S=U.value;return S?S.reason==="REQUIRED_COOKIES_MISSING"?`缺关键 cookie: ${(S.missingRequired||[]).join(", ")}`:S.reason==="VALIDATE_COOKIE_FAILED"?"厂商拒绝该 cookie(可能已过期或被风控)":S.reason==="ADAPTER_THREW"?`Adapter 抛错: ${S.error||"网络错误"}`:S.reason==="UNKNOWN_VENDOR"?"未知厂商":S.reason||"注册失败":"未知错误"});function x(S){return e.existingAccounts.some(M=>M&&M.vendor===S)}function P(S){return e.existingAccounts.find(M=>M&&M.vendor===S)||null}function de(S){const M=P(S);return M?M.lastHealth?M.lastHealth.ok?"ok":M.lastHealth.reason==="SPEC_VERSION_MISMATCH"?"mismatch":"fail":"unknown":null}function L(S){const M=P(S);if(!M||!M.lastHealth||M.lastHealth.ok)return"";const X=M.lastHealth.reason;return X?X==="SPEC_VERSION_MISMATCH"?"cookie 规格已升级,请重新登录":X==="ADAPTER_THREW"?"上次校验抛错,建议稍后重试":X==="COOKIE_EXPIRED"?"Cookie 已过期,请重新登录":X:"Cookie 校验失败,建议重新登录"}async function ie(S){try{(await v.unregisterAichat(S))?.ok&&K("registered",{vendor:S,accountId:null,unregistered:!0})}catch(M){U.value={ok:!1,reason:M?.message||"UNREGISTER_FAILED"}}}function F(S){k.value=S}async function G(){if(k.value){N.open=!0,R.value=null,T.value=null,O.value="";try{if(R.value=await v.openAichatLogin(k.value),!R.value?.ok)return;E.value=2}catch(S){R.value={ok:!1,reason:S?.message||"OPEN_FAILED"}}finally{N.open=!1}}}async function ue(){N.probe=!0,T.value=null;try{const S=O.value.trim(),M=S||void 0;T.value=await v.probeAichatCookies(k.value,M)}catch(S){T.value={ok:!1,reason:S?.message||"PROBE_FAILED"}}finally{N.probe=!1}}async function Y(){if(T.value?.ok){N.register=!0;try{U.value=await v.registerAichatVendor(k.value,T.value.cookies),E.value=3,U.value?.ok&&K("registered",{vendor:k.value,accountId:U.value.accountId})}catch(S){U.value={ok:!1,reason:S?.message||"REGISTER_FAILED"},E.value=3}finally{N.register=!1}}}function $(){E.value=1,k.value=null,O.value="",R.value=null,T.value=null,U.value=null}function le(){$(),K("update:open",!1)}Oe(()=>e.open,S=>{S&&$()});const ce={props:e,emit:K,vendors:Q,hub:v,step:E,selectedVendor:k,cookieHeader:O,openResult:R,probeResult:T,registerResult:U,loading:N,currentVendorMeta:j,stepDescription:H,probeFailMessage:z,registerFailMessage:Z,isRegistered:x,_entry:P,healthOf:de,healthReasonOf:L,onUnregister:ie,pickVendor:F,startLoginFlow:G,runProbe:ue,runRegister:Y,restartFlow:$,resetWizard:le,ref:I,reactive:ne,computed:ae,watch:Oe,get usePersonalDataHub(){return fe}};return Object.defineProperty(ce,"__isScriptSetup",{enumerable:!1,value:!0}),ce}},Tn={key:0},xn={class:"vendor-head"},Ln={class:"hint"},Mn={class:"hint",style:{"margin-top":"4px"}},Un={key:0,class:"hint",style:{"margin-top":"4px",color:"#ff4d4f"}},Bn={key:1},Nn={class:"hint"},Fn=["href"],Hn={class:"howto"},zn=["href"],Kn={key:3,style:{"margin-top":"8px"}},Wn={key:2,class:"kv",style:{"margin-top":"4px"}},qn={key:3,class:"kv",style:{"margin-top":"4px",color:"#ff4d4f"}},Vn={key:2};function Yn(m,t,g,e,K,Q){const v=A("a-alert"),E=A("a-tag"),k=A("a-button"),O=A("a-popconfirm"),R=A("a-card"),T=A("a-col"),U=A("a-row"),N=A("a-collapse-panel"),j=A("a-collapse"),H=A("a-textarea"),z=A("a-form-item"),Z=A("a-form"),x=A("a-result"),P=A("a-space"),de=A("a-drawer");return r(),h(de,{open:g.open,title:"添加 AI 对话账号",placement:"right",width:640,"destroy-on-close":!0,"onUpdate:open":t[4]||(t[4]=L=>e.emit("update:open",L)),onClose:e.resetWizard},{footer:a(()=>[o(P,{style:{float:"right"}},{default:a(()=>[e.step>1&&e.step<3?(r(),h(k,{key:0,onClick:t[3]||(t[3]=L=>e.step=e.step-1)},{default:a(()=>[...t[22]||(t[22]=[i("上一步",-1)])]),_:1})):f("v-if",!0),o(k,{onClick:e.resetWizard},{default:a(()=>[...t[23]||(t[23]=[i("取消",-1)])]),_:1}),e.step===1?(r(),h(k,{key:1,type:"primary",disabled:!e.selectedVendor,loading:e.loading.open,onClick:e.startLoginFlow},{default:a(()=>[...t[24]||(t[24]=[i(" 下一步 ",-1)])]),_:1},8,["disabled","loading"])):f("v-if",!0),e.step===2&&e.openResult?.fallbackMode==="paste"?(r(),h(k,{key:2,loading:e.loading.probe,disabled:!e.cookieHeader.trim(),onClick:e.runProbe},{default:a(()=>[...t[25]||(t[25]=[i(" 检测 cookie ",-1)])]),_:1},8,["loading","disabled"])):f("v-if",!0),e.step===2&&e.openResult?.fallbackMode!=="paste"?(r(),h(k,{key:3,loading:e.loading.probe,onClick:e.runProbe},{default:a(()=>[...t[26]||(t[26]=[i(" 检测 cookie ",-1)])]),_:1},8,["loading"])):f("v-if",!0),e.step===2?(r(),h(k,{key:4,type:"primary",loading:e.loading.register,disabled:!e.probeResult?.ok,onClick:e.runRegister},{default:a(()=>[...t[27]||(t[27]=[i(" 注册 ",-1)])]),_:1},8,["loading","disabled"])):f("v-if",!0)]),_:1})]),default:a(()=>[o(v,{message:`第 ${e.step} / 3 步`,description:e.stepDescription,type:"info","show-icon":"",style:{"margin-bottom":"16px"}},null,8,["message","description"]),e.step===1?(r(),_("div",Tn,[t[10]||(t[10]=y("p",{class:"hint"}," 选择要接入的 AI 服务商。登录后将本地读取 cookie 同步对话历史;cookie 仅落本机加密文件,不上传任何云端。 ",-1)),o(U,{gutter:[12,12]},{default:a(()=>[(r(),_(V,null,re(e.vendors,L=>o(T,{xs:24,sm:12,md:8,key:L.vendor},{default:a(()=>[o(R,{size:"small",hoverable:"",class:St(["vendor-card",{selected:e.selectedVendor===L.vendor}]),onClick:ie=>e.pickVendor(L.vendor)},{default:a(()=>[y("div",xn,[y("strong",null,u(L.displayName),1),e.healthOf(L.vendor)==="fail"?(r(),h(E,{key:0,color:"red"},{default:a(()=>[...t[5]||(t[5]=[i("🔴 重新登录",-1)])]),_:1})):e.healthOf(L.vendor)==="mismatch"?(r(),h(E,{key:1,color:"orange"},{default:a(()=>[...t[6]||(t[6]=[i("⚠ 规格升级",-1)])]),_:1})):e.healthOf(L.vendor)==="unknown"?(r(),h(E,{key:2,color:"blue"},{default:a(()=>[...t[7]||(t[7]=[i("已接入·待巡检",-1)])]),_:1})):e.healthOf(L.vendor)==="ok"?(r(),h(E,{key:3,color:"green"},{default:a(()=>[...t[8]||(t[8]=[i("✓ 已接入",-1)])]),_:1})):f("v-if",!0)]),y("div",Ln,u(L.notes),1),y("div",Mn,[o(E,{color:"default"},{default:a(()=>[i(u(L.requiredCookies.length)+" 必需 cookie",1)]),_:2},1024),o(E,{color:"default"},{default:a(()=>[i("过期约 "+u(L.cookieMaxAgeHintDays)+" 天",1)]),_:2},1024)]),e.isRegistered(L.vendor)&&e.healthReasonOf(L.vendor)?(r(),_("div",Un,u(e.healthReasonOf(L.vendor)),1)):f("v-if",!0),e.isRegistered(L.vendor)?(r(),_("div",{key:1,class:"vendor-actions",onClick:t[0]||(t[0]=Dt(()=>{},["stop"]))},[o(O,{title:"注销该 AI 对话来源?历史事件仍可在 vault 中查询。","ok-text":"注销","cancel-text":"取消",onConfirm:ie=>e.onUnregister(L.vendor)},{default:a(()=>[o(k,{size:"small",type:"text",danger:""},{default:a(()=>[...t[9]||(t[9]=[i("注销",-1)])]),_:1})]),_:1},8,["onConfirm"])])):f("v-if",!0)]),_:2},1032,["class","onClick"])]),_:2},1024)),64))]),_:1})])):f("v-if",!0),e.step===2&&e.openResult?(r(),_("div",Bn,[y("p",Nn,[y("strong",null,u(e.currentVendorMeta.displayName),1),t[11]||(t[11]=i(" · ",-1)),y("a",{href:e.openResult.loginUrl,target:"_blank",rel:"noopener noreferrer"},u(e.openResult.loginUrl),9,Fn)]),e.openResult.fallbackMode==="paste"?(r(),h(v,{key:0,message:e.openResult.helpText||"请在外部浏览器登录后从开发者工具复制全部 cookie 字符串粘贴到下方。",type:"warning","show-icon":"",style:{"margin-bottom":"12px"}},null,8,["message"])):(r(),h(v,{key:1,message:"桌面端:请在弹出的内嵌浏览器窗口登录后点击 “检测 cookie”。",type:"info","show-icon":"",style:{"margin-bottom":"12px"}})),e.openResult.fallbackMode==="paste"?(r(),h(j,{key:2,bordered:!1,style:{"margin-bottom":"12px"}},{default:a(()=>[o(N,{key:"howto",header:"如何获取 cookie 字符串?"},{default:a(()=>[y("ol",Hn,[y("li",null,[t[12]||(t[12]=i("用 Chrome / Edge 打开 ",-1)),y("a",{href:e.openResult.loginUrl,target:"_blank"},u(e.openResult.loginUrl),9,zn)]),t[13]||(t[13]=y("li",null,"完成登录,进入对话页",-1)),t[14]||(t[14]=y("li",null,[i("按 "),y("kbd",null,"F12"),i(" 打开开发者工具 → "),y("strong",null,"Application"),i(" → "),y("strong",null,"Cookies")],-1)),t[15]||(t[15]=y("li",null,"选中域名 → 全选所有 cookie 行 → 用扩展(如 EditThisCookie)导出 “name=value; …” 串",-1)),t[16]||(t[16]=y("li",null,[i("或在 Console 执行 "),y("code",null,"document.cookie"),i(" 复制结果(注意:HTTP-Only cookie 取不到,仍需 Application 面板)")],-1)),t[17]||(t[17]=y("li",null,"粘贴到下方文本框,点 “检测 cookie”",-1))])]),_:1})]),_:1})):f("v-if",!0),o(Z,{layout:"vertical"},{default:a(()=>[o(z,{label:"Cookie 字符串"},{default:a(()=>[o(H,{value:e.cookieHeader,"onUpdate:value":t[1]||(t[1]=L=>e.cookieHeader=L),rows:6,placeholder:"name1=value1; name2=value2; name3=value3 …",autocomplete:"off"},null,8,["value"])]),_:1})]),_:1}),e.probeResult?(r(),_("div",Kn,[e.probeResult.ok?(r(),h(v,{key:0,type:"success","show-icon":"",message:`已识别 ${e.probeResult.foundRequired.length} 个必需 cookie + ${e.probeResult.foundOptional.length} 个可选 cookie`},null,8,["message"])):(r(),h(v,{key:1,type:"error","show-icon":"",message:e.probeFailMessage},null,8,["message"])),e.probeResult.foundRequired?.length?(r(),_("div",Wn," ✓ "+u(e.probeResult.foundRequired.join(", ")),1)):f("v-if",!0),e.probeResult.missingRequired?.length?(r(),_("div",qn," 缺失: "+u(e.probeResult.missingRequired.join(", ")),1)):f("v-if",!0)])):f("v-if",!0)])):f("v-if",!0),e.step===3?(r(),_("div",Vn,[e.registerResult?.ok?(r(),h(x,{key:0,status:"success",title:`${e.currentVendorMeta.displayName} 已接入`,"sub-title":`accountId: ${e.registerResult.accountId} · userId: ${e.registerResult.validation?.userId||"匿名"}`},{extra:a(()=>[o(k,{type:"primary",onClick:e.resetWizard},{default:a(()=>[...t[18]||(t[18]=[i("完成",-1)])]),_:1}),o(k,{onClick:e.restartFlow},{default:a(()=>[...t[19]||(t[19]=[i("再加一家",-1)])]),_:1})]),_:1},8,["title","sub-title"])):(r(),h(x,{key:1,status:"error",title:"接入失败","sub-title":e.registerFailMessage},{extra:a(()=>[o(k,{type:"primary",onClick:t[2]||(t[2]=L=>e.step=2)},{default:a(()=>[...t[20]||(t[20]=[i("返回粘贴 cookie",-1)])]),_:1}),o(k,{onClick:e.restartFlow},{default:a(()=>[...t[21]||(t[21]=[i("选其他厂商",-1)])]),_:1})]),_:1},8,["sub-title"]))])):f("v-if",!0)]),_:1},8,["open"])}const Qn=Be(Pn,[["render",Yn],["__scopeId","data-v-4ed94be5"],["__file","/tmp/cc-web-panel-XqKUIo/repo/packages/web-panel/src/components/AIChatWizard.vue"]]),jn={__name:"WechatWizard",props:{open:{type:Boolean,default:!1}},emits:["update:open","registered"],setup(m,{expose:t,emit:g}){t();const e=m,K=g,Q=fe(),v=I(1),E=I(null),k=ne({uin:"",dbPath:"",wechatDataPath:"",forceProvider:null}),O=I(null),R=ne({probe:!1,register:!1}),T=ae(()=>v.value===1?"探测设备 + WeChat 版本,确认可用的 keyProvider":v.value===2?"填 UIN 与已 adb-pull 的本地路径":"bootstrap 注册 + 持久化 wechat-accounts.json"),U=ae(()=>{const x=O.value;return x?x.reason==="ENV_UNSUPPORTED"?x.message||"env-probe 拒绝 — 请回到第 1 步看 reasons":x.reason==="MD5_NEEDS_WECHAT_DATA_PATH"?"MD5 路径需要 wechatDataPath":x.reason==="FRIDA_NEEDS_WXID"?"Frida 路径需要 account.uin / wxid":x.reason==="ADAPTER_CTOR_FAILED"?`Adapter ctor 抛错: ${x.message||""}`:x.reason==="BOOTSTRAP_THREW"?`Bootstrap 抛错: ${x.message||""}`:x.reason==="UIN_REQUIRED"?"UIN 不能为空":x.message||x.reason||"注册失败":"未知错误"});async function N(){R.probe=!0;try{E.value=await Q.probeWechatEnv()}catch(x){E.value={ok:!1,suggestedKeyProvider:"unsupported",reasons:[x?.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{R.probe=!1}}async function j(){R.register=!0;try{O.value=await Q.registerWechat({account:{uin:k.uin},dbPath:k.dbPath||null,wechatDataPath:k.wechatDataPath||null,keyProviderOverride:k.forceProvider}),v.value=3,O.value?.ok&&K("registered",{uin:k.uin,chosenKeyProvider:O.value.chosenKeyProvider})}catch(x){O.value={ok:!1,reason:"BOOTSTRAP_THREW",message:x?.message||"RPC failed"},v.value=3}finally{R.register=!1}}function H(){v.value=1,E.value=null,k.uin="",k.dbPath="",k.wechatDataPath="",k.forceProvider=null,O.value=null}function z(){H(),K("update:open",!1)}Oe(()=>e.open,x=>{x&&H()});const Z={props:e,emit:K,hub:Q,step:v,probe:E,form:k,registerResult:O,loading:R,stepDescription:T,registerFailMessage:U,runProbe:N,runRegister:j,restartFlow:H,resetWizard:z,ref:I,reactive:ne,computed:ae,watch:Oe,get usePersonalDataHub(){return fe}};return Object.defineProperty(Z,"__isScriptSetup",{enumerable:!1,value:!0}),Z}},Gn={key:0},Xn={key:0,class:"probe-result"},Jn={key:0,class:"kv"},Zn={key:0,class:"kv"},$n={key:1},ea={key:2},ta={key:2,style:{"margin-top":"12px"}};function na(m,t,g,e,K,Q){const v=A("a-alert"),E=A("a-button"),k=A("a-tag"),O=A("a-descriptions-item"),R=A("a-descriptions"),T=A("a-input"),U=A("a-form-item"),N=A("a-radio"),j=A("a-radio-group"),H=A("a-form"),z=A("a-result"),Z=A("a-space"),x=A("a-drawer");return r(),h(x,{open:g.open,title:"添加 WeChat 账号",placement:"right",width:640,"destroy-on-close":!0,"onUpdate:open":t[8]||(t[8]=P=>e.emit("update:open",P)),onClose:e.resetWizard},{footer:a(()=>[o(Z,{style:{float:"right"}},{default:a(()=>[e.step>1&&e.step<3?(r(),h(E,{key:0,onClick:t[6]||(t[6]=P=>e.step=e.step-1)},{default:a(()=>[...t[21]||(t[21]=[i("上一步",-1)])]),_:1})):f("v-if",!0),o(E,{onClick:e.resetWizard},{default:a(()=>[...t[22]||(t[22]=[i("取消",-1)])]),_:1}),e.step===1?(r(),h(E,{key:1,type:"primary",disabled:!e.probe||e.probe.suggestedKeyProvider==="unsupported",onClick:t[7]||(t[7]=P=>e.step=2)},{default:a(()=>[...t[23]||(t[23]=[i(" 下一步 ",-1)])]),_:1},8,["disabled"])):f("v-if",!0),e.step===2?(r(),h(E,{key:2,type:"primary",loading:e.loading.register,disabled:!e.form.uin||e.probe?.suggestedKeyProvider==="md5"&&!e.form.wechatDataPath,onClick:e.runRegister},{default:a(()=>[...t[24]||(t[24]=[i(" 注册 ",-1)])]),_:1},8,["loading","disabled"])):f("v-if",!0)]),_:1})]),default:a(()=>[o(v,{message:`第 ${e.step} / 3 步`,description:e.stepDescription,type:"info","show-icon":"",style:{"margin-bottom":"16px"}},null,8,["message","description"]),e.step===1?(r(),_("div",Gn,[t[11]||(t[11]=y("p",{class:"hint"},[i(" 请用 USB 连接 Android 设备(开启 USB 调试)。WeChat ≥ 8.0 需要 root + frida-server。 探测仅读取 "),y("code",null,"adb shell"),i(" 命令输出,不写入任何东西。 ")],-1)),o(E,{type:"primary",loading:e.loading.probe,onClick:e.runProbe,style:{"margin-bottom":"12px"}},{default:a(()=>[...t[9]||(t[9]=[i(" 🔍 探测环境 ",-1)])]),_:1},8,["loading"]),e.probe?(r(),_("div",Xn,[o(R,{column:1,size:"small",bordered:""},{default:a(()=>[o(O,{label:"suggestedKeyProvider"},{default:a(()=>[o(k,{color:e.probe.suggestedKeyProvider==="unsupported"?"red":"green"},{default:a(()=>[i(u(e.probe.suggestedKeyProvider),1)]),_:1},8,["color"])]),_:1}),o(O,{label:"adb 设备"},{default:a(()=>[o(k,{color:e.probe.device.reachable?"green":"red"},{default:a(()=>[i(u(e.probe.device.reachable?"已连接":"未连接"),1)]),_:1},8,["color"]),e.probe.device.serial?(r(),_("span",Jn,u(e.probe.device.serial)+" · abi="+u(e.probe.device.abi||"?"),1)):f("v-if",!0)]),_:1}),o(O,{label:"root"},{default:a(()=>[o(k,{color:e.probe.root.detected?"green":"default"},{default:a(()=>[i(u(e.probe.root.detected?"已 root":"未 root"),1)]),_:1},8,["color"]),e.probe.root.magiskInstalled?(r(),h(k,{key:0,color:"blue"},{default:a(()=>[...t[10]||(t[10]=[i("Magisk",-1)])]),_:1})):f("v-if",!0)]),_:1}),o(O,{label:"frida-server"},{default:a(()=>[o(k,{color:e.probe.frida.serverRunning?"green":"default"},{default:a(()=>[i(u(e.probe.frida.serverRunning?"运行中":"未运行"),1)]),_:1},8,["color"]),e.probe.frida.port?(r(),_("span",Zn," :"+u(e.probe.frida.port),1)):f("v-if",!0)]),_:1}),o(O,{label:"WeChat"},{default:a(()=>[o(k,{color:e.probe.wechat.installed?"green":"red"},{default:a(()=>[i(u(e.probe.wechat.installed?e.probe.wechat.versionName:"未安装"),1)]),_:1},8,["color"])]),_:1})]),_:1}),(r(!0),_(V,null,re(e.probe.reasons||[],P=>(r(),h(v,{key:P,message:P,type:"info","show-icon":"",style:{"margin-top":"8px"}},null,8,["message"]))),128)),(r(!0),_(V,null,re(e.probe.warnings||[],P=>(r(),h(v,{key:P,message:P,type:"warning","show-icon":"",style:{"margin-top":"8px"}},null,8,["message"]))),128))])):f("v-if",!0)])):f("v-if",!0),e.step===2?(r(),_("div",$n,[t[16]||(t[16]=y("p",{class:"hint"},[i(" 填写从 adb pull 拉下来的本地路径。MD5 路径(7.x)需要 "),y("code",null,"wechatDataPath"),i("; Frida 路径(8.0+)需要设备运行 frida-server。 ")],-1)),o(H,{layout:"vertical"},{default:a(()=>[o(U,{label:"UIN / wxid",required:""},{default:a(()=>[o(T,{value:e.form.uin,"onUpdate:value":t[0]||(t[0]=P=>e.form.uin=P),placeholder:"WeChat 数字 UIN 或 wxid"},null,8,["value"])]),_:1}),o(U,{label:"dbPath(已拉下的 EnMicroMsg.db 本地路径)"},{default:a(()=>[o(T,{value:e.form.dbPath,"onUpdate:value":t[1]||(t[1]=P=>e.form.dbPath=P),placeholder:"C:\\\\users\\\\me\\\\pull\\\\EnMicroMsg.db"},null,8,["value"])]),_:1}),o(U,{label:"wechatDataPath(已拉下的 /data/data/com.tencent.mm/ 目录)"},{default:a(()=>[o(T,{value:e.form.wechatDataPath,"onUpdate:value":t[2]||(t[2]=P=>e.form.wechatDataPath=P),placeholder:"C:\\\\users\\\\me\\\\pull\\\\com.tencent.mm"},null,8,["value"]),t[12]||(t[12]=y("div",{class:"hint"},"MD5 路径必填;Frida 路径可空",-1))]),_:1}),o(U,{label:"强制 keyProvider(覆盖 env-probe 建议)"},{default:a(()=>[o(j,{value:e.form.forceProvider,"onUpdate:value":t[3]||(t[3]=P=>e.form.forceProvider=P)},{default:a(()=>[o(N,{value:null},{default:a(()=>[...t[13]||(t[13]=[i("自动(推荐)",-1)])]),_:1}),o(N,{value:"md5"},{default:a(()=>[...t[14]||(t[14]=[i("md5",-1)])]),_:1}),o(N,{value:"frida"},{default:a(()=>[...t[15]||(t[15]=[i("frida",-1)])]),_:1})]),_:1},8,["value"])]),_:1})]),_:1})])):f("v-if",!0),e.step===3?(r(),_("div",ea,[e.registerResult?.ok?(r(),h(z,{key:0,status:"success",title:`WeChat 已接入 (uin=${e.form.uin})`,"sub-title":`provider=${e.registerResult.chosenKeyProvider} · sensitivity=${e.registerResult.sensitivity}`},{extra:a(()=>[o(E,{type:"primary",onClick:e.resetWizard},{default:a(()=>[...t[17]||(t[17]=[i("完成",-1)])]),_:1}),o(E,{onClick:e.restartFlow},{default:a(()=>[...t[18]||(t[18]=[i("再加一个",-1)])]),_:1})]),_:1},8,["title","sub-title"])):(r(),h(z,{key:1,status:"error",title:"接入失败","sub-title":e.registerFailMessage},un({_:2},[e.registerResult?.probe?.reasons?.length?{name:"extra",fn:a(()=>[o(E,{onClick:t[4]||(t[4]=P=>e.step=1)},{default:a(()=>[...t[19]||(t[19]=[i("返回检查环境",-1)])]),_:1}),o(E,{onClick:t[5]||(t[5]=P=>e.step=2)},{default:a(()=>[...t[20]||(t[20]=[i("返回修改路径",-1)])]),_:1})]),key:"0"}:void 0]),1032,["sub-title"])),e.registerResult?.probe?.reasons?.length?(r(),_("div",ta,[(r(!0),_(V,null,re(e.registerResult.probe.reasons,P=>(r(),h(v,{key:P,message:P,type:"warning","show-icon":"",style:{"margin-bottom":"4px"}},null,8,["message"]))),128))])):f("v-if",!0)])):f("v-if",!0)]),_:1},8,["open"])}const aa=Be(jn,[["render",na],["__scopeId","data-v-2f50c8a7"],["__file","/tmp/cc-web-panel-XqKUIo/repo/packages/web-panel/src/components/WechatWizard.vue"]]),Ue="pdh.syncIncludeOptions.v1",oa={__name:"PersonalDataHub",setup(m,{expose:t}){const g=fe(),e=I(null),K=I(null),Q=I([]),v=I({}),E=I(""),k=I(null),O=I(""),R=I(!1),T=I(!1),U=I([]),N=I(null),j={"system-data-android":{contacts:!0,apps:!0,sms:!0,calls:!0}};function H(){try{const n=localStorage.getItem(Ue);if(!n)return JSON.parse(JSON.stringify(j));const d=JSON.parse(n);return{"system-data-android":{...j["system-data-android"],...d["system-data-android"]||{}}}}catch{return JSON.parse(JSON.stringify(j))}}const z=ne(H());function Z(){try{localStorage.setItem(Ue,JSON.stringify(z)),console.log("[PDH-include] persisted:",JSON.stringify(z))}catch(n){console.warn("[PDH-include] persist failed:",n&&n.message)}}const x=I({}),P={"system-data-android":[{key:"contacts",label:"联系人",hint:"~767 条"},{key:"apps",label:"已安装应用",hint:"~176 个"},{key:"sms",label:"短信内容",hint:"~2400 条 · 高敏感",sensitive:!0},{key:"calls",label:"通话记录",hint:"~18000 条 · 包含号码",sensitive:!0}]};function de(n){return Object.prototype.hasOwnProperty.call(P,n)}function L(n,d,s){const c=s&&s.target?!!s.target.checked:!!s;console.log("[PDH-include] toggle",n,d,"=>",c),z[n]||(z[n]={}),z[n][d]=c,Z()}const ie=I(!1),F=ne({provider:"qq",email:"",authCode:"",host:"",port:993,pdfPasswordHints:{idCardLast6:"",phoneLast6:"",cardLast6:""}}),G=I(null),ue=I(!1),Y=I(null),$=I([]),le=I(null),ce=[{name:"analysis.spending",label:"消费分析",icon:yt,description:"总支出 / 商家排行 / 月度趋势"},{name:"analysis.relations",label:"人际关系",icon:vt,description:"与每个人的互动频率 / 主动比例"},{name:"analysis.footprint",label:"足迹",icon:kt,description:"常去地点 / 出行模式"},{name:"analysis.interests",label:"兴趣画像",icon:_t,description:"从购买 / 浏览 / 收藏抽兴趣"},{name:"analysis.timeline",label:"时间线",icon:bt,description:"跨源事件串成故事"}],S=I(!1),M=I([]),X=ne({queue:{pending:0},mergeGroups:0,reviewQueue:0}),Se=I(!1),ve=I([]);function ke(n){n?.unregistered?p.success(`已注销 ${n.vendor}`):p.success(`已接入 ${n.vendor}`),q()}const _e=I(!1);function De(n){p.success(`WeChat 已接入 (uin=${n.uin}, provider=${n.chosenKeyProvider})`),q()}const Ee=I(!1),l=ne({email:"",zipPassword:"",filePath:""}),w=I(null),C=ne({active:!1,batchMode:!1,adapter:"",phase:"",mailbox:"",current:0,total:0,attempt:1,errorMessage:""}),b=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}),Ne=I(null);function Ie(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 Fe(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 He(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 ze(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 Ke(){if(!b.xhsAdbSync){b.xhsAdbSync=!0;try{const n=await g.xhsAdbSync({});if(!n||!n.ok){const D=n&&n.reason||"SYNC_FAILED",B=ze(D),J=n&&n.message||"";p.error({content:`Xhs ADB 同步失败:${B}`,description:J,duration:8});return}const d=n.report||{},s=d.xhs||{},c=s.eventCounts||{};s.meFetchFailed?p.warning({content:"Xhs 同步未拉到 user_id — /user/me 返空 data",description:`lastErrorCode=${s.lastErrorCode}, ${s.lastErrorMessage||""}。可能 cookie 已过期或 web_session 缺失,请在手机重新登录。`,duration:10}):s.lastErrorCode===461?p.warning({content:"Xhs X-S 签名被拒 (461) — 部分接口未抓到",description:`命中 ${c.total||0} events。我们的 X-S 算法 best-effort (~60% GET / <30% POST hit),461 在 POST 较常见。稍后重试 (X-S 算法可能 4-8 周 rotate)。`,duration:10}):s.lastErrorCode?p.warning({content:`Xhs 同步部分完成 (${c.total||0} events)`,description:`lastErrorCode=${s.lastErrorCode}, ${s.lastErrorMessage||""}`,duration:8}):p.success(`Xhs 同步成功:notes=${c.note||0} / liked=${c.liked||0} / follow=${c.follow||0} (total=${c.total||0})${s.nickname?" ["+s.nickname+"]":""}`),N.value=d,q()}catch(n){p.error({content:"Xhs ADB 同步异常",description:n&&n.message?n.message:String(n),duration:8})}finally{b.xhsAdbSync=!1}}}function We(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 qe(){if(!b.toutiaoAdbSync){b.toutiaoAdbSync=!0;try{const n=await g.toutiaoAdbSync({});if(!n||!n.ok){const D=n&&n.reason||"SYNC_FAILED",B=We(D),J=n&&n.message||"";p.error({content:`Toutiao ADB 同步失败:${B}`,description:J,duration:8});return}const d=n.report||{},s=d.toutiao||{},c=s.eventCounts||{};s.profileFetchFailed?p.warning({content:"Toutiao 同步未拉到 user_id — passport/info/v2 返失败",description:`lastErrorCode=${s.lastErrorCode}, ${s.lastErrorMessage||""}。可能 cookie 已过期或 sessionid 缺失,请在手机重新登录。`,duration:10}):s.signProviderUsed==="none"&&c.feed===0&&c.collection===0&&c.search===0?p.warning({content:`Toutiao 同步仅获取了 profile (${c.profile||0} event)`,description:"当前 web-shell 上下文不支持 _signature 签名(仅 desktop app 提供 ToutiaoSignBridge)。打开桌面 app 同步可获取 feed / collection / search。",duration:12}):s.lastErrorCode?p.warning({content:`Toutiao 同步部分完成 (${c.total||0} events)`,description:`lastErrorCode=${s.lastErrorCode}, ${s.lastErrorMessage||""}`,duration:8}):p.success(`Toutiao 同步成功:profile=${c.profile||0} / feed=${c.feed||0} / collection=${c.collection||0} / search=${c.search||0} (total=${c.total||0})${s.nickname?" ["+s.nickname+"]":""}`),N.value=d,q()}catch(n){p.error({content:"Toutiao ADB 同步异常",description:n&&n.message?n.message:String(n),duration:8})}finally{b.toutiaoAdbSync=!1}}}function Ve(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 Ye(){if(!b.kuaishouAdbSync){b.kuaishouAdbSync=!0;try{const n=await g.kuaishouAdbSync({});if(!n||!n.ok){const D=n&&n.reason||"SYNC_FAILED",B=Ve(D),J=n&&n.message||"";p.error({content:`Kuaishou ADB 同步失败:${B}`,description:J,duration:8});return}const d=n.report||{},s=d.kuaishou||{},c=s.eventCounts||{};s.profileFetchFailed?p.warning({content:"Kuaishou 同步 cookie 缺 api_ph payload",description:`lastErrorCode=${s.lastErrorCode}, ${s.lastErrorMessage||""}。可能 cookie 已过期或登录态不完整(仅有 userId 但没有 api_ph),请在手机重新登录。`,duration:10}):s.signProviderUsed==="none"&&c.watch===0&&c.collect===0&&c.search===0?p.warning({content:`Kuaishou 同步仅获取了 profile (${c.profile||0} event)`,description:"当前 web-shell 上下文不支持 __NS_sig3 签名(仅 desktop app 提供 KuaishouSignBridge)。打开桌面 app 同步可获取 watch / collect / search。",duration:12}):s.lastErrorCode?p.warning({content:`Kuaishou 同步部分完成 (${c.total||0} events)`,description:`lastErrorCode=${s.lastErrorCode}, ${s.lastErrorMessage||""}`,duration:8}):p.success(`Kuaishou 同步成功:profile=${c.profile||0} / watch=${c.watch||0} / collect=${c.collect||0} / search=${c.search||0} (total=${c.total||0})${s.nickname?" ["+s.nickname+"]":""}`),N.value=d,q()}catch(n){p.error({content:"Kuaishou ADB 同步异常",description:n&&n.message?n.message:String(n),duration:8})}finally{b.kuaishouAdbSync=!1}}}async function Et(){if(!b.bridgeDoctor){b.bridgeDoctor=!0;try{const n=await g.bridgeDoctor();if(!n||!n.ok){const oe=n&&n.reason||"BRIDGE_DOCTOR_FAILED",ee=n&&n.message||"";oe==="MODULE_LOAD_FAILED"?p.error({content:"Bridge doctor 不可用",description:"当前上下文不是 Electron desktop app(cli / web-shell-only 无 sign-bridge 模块)。请从桌面 app 运行此诊断。",duration:10}):p.error({content:`Bridge doctor 失败:${oe}`,description:ee,duration:8});return}const d=n.results||{},s=["xhs","toutiao","kuaishou"],c=s.filter(oe=>d[oe]&&d[oe].anyCandidatePresent).length,D=s.length,B=[];for(const oe of s){const ee=d[oe];if(!ee||!ee.ok){B.push(`${oe}: ✗ ${ee&&ee.error?ee.error:"unknown error"}`);continue}const Le=ee.candidates||{},mt=Object.keys(Le).filter(dn=>Le[dn]===!0),pt=Object.keys(Le).length,ln=ee.anyCandidatePresent?"✓":"⚠",sn=ee.anyCandidatePresent?`${mt.length}/${pt} candidate(s): ${mt.join(", ")}`:`0/${pt} candidates (rotation? 需更新 buildSignScript)`;B.push(`${oe}: ${ln} ${sn} (warmUp=${ee.warmUpMs}ms, probe=${ee.probeMs}ms)`)}(c===D?p.success:c===0?p.error:p.warning)({content:`Bridge doctor: ${c}/${D} 平台签名可用`,description:B.join(`
|
|
2
|
+
`),duration:15}),Ne.value=n}catch(n){p.error({content:"Bridge doctor 异常",description:n&&n.message?n.message:String(n),duration:8})}finally{b.bridgeDoctor=!1}}}async function Qe(){if(!b.weiboAdbSync){b.weiboAdbSync=!0;try{const n=await g.weiboAdbSync({});if(!n||!n.ok){const D=n&&n.reason||"SYNC_FAILED",B=He(D),J=n&&n.message||"";p.error({content:`Weibo ADB 同步失败:${B}`,description:J,duration:8});return}const d=n.report||{},s=d.weibo||{},c=s.eventCounts||{};s.uidFetchFailed?p.warning({content:"Weibo 同步未拉到 UID — /api/config 返 login=false",description:`lastErrorCode=${s.lastErrorCode}, ${s.lastErrorMessage||""}。可能 cookie 已过期 (请在手机重新登录) 或微博触发 anti-bot redirect。事件数 0,未入 vault。`,duration:10}):s.lastErrorCode?p.warning({content:`Weibo 同步部分完成 (${c.total||0} events)`,description:`lastErrorCode=${s.lastErrorCode}, ${s.lastErrorMessage||""} — 部分接口受反爬限制,稍后重试可补齐`,duration:8}):p.success(`Weibo 同步成功:posts=${c.post||0} / fav=${c.favourite||0} / follow=${c.follow||0} (total=${c.total||0})`),N.value=d,q()}catch(n){p.error({content:"Weibo ADB 同步异常",description:n&&n.message?n.message:String(n),duration:8})}finally{b.weiboAdbSync=!1}}}async function je(){if(!b.douyinAdbSync){b.douyinAdbSync=!0;try{const n=await g.douyinAdbSync({});if(!n||!n.ok){const B=n&&n.reason||"SYNC_FAILED",J=Fe(B),oe=n&&n.message||"";p.error({content:`Douyin ADB 同步失败:${J}`,description:oe,duration:8});return}const d=n.report||{},s=d.douyin||{},c=s.eventCounts||{},D=s.parserDiagnostic||{};if(!D.hadMsgTable&&!D.hadSimpleUserTable)p.warning({content:"Douyin 同步完成但 0 events",description:"msg 和 SIMPLE_USER 表都未在 IM 数据库中找到 — 抖音 App 版本可能用了不同 schema",duration:10});else if(!D.hadMsgTable||!D.hadSimpleUserTable){const B=[];D.hadMsgTable||B.push("msg (私信)"),D.hadSimpleUserTable||B.push("SIMPLE_USER (联系人)"),p.warning({content:`Douyin 部分同步:msg=${c.message||0} contacts=${c.contact||0}`,description:`${B.join("、")} 表未找到,未入库部分数据`,duration:8})}else p.success(`Douyin 同步成功:messages=${c.message||0} contacts=${c.contact||0} (total=${c.total||0})`);N.value=d,q()}catch(n){p.error({content:"Douyin ADB 同步异常",description:n&&n.message?n.message:String(n),duration:8})}finally{b.douyinAdbSync=!1}}}async function It(){if(!b.bilibiliAdbDoctor){b.bilibiliAdbDoctor=!0;try{const n=await g.bilibiliAdbDoctor();if(!n||!n.ok){const s=n&&n.reason||"PROBE_FAILED",c=Ie(s),D=n&&n.message||"";p.error({content:`Bilibili 诊断失败:${c}`,description:D,duration:8});return}const d=n.cookieDiagnostic||{};d.hadEncrypted?p.warning({content:`Bilibili 环境就绪 (uid=${n.uid}) — 但发现 Keystore 加密 cookie`,description:`cookies 数=${d.cookieCount||"?"}; 部分行使用 Android Keystore 加密 (跳过)。可能是较新 Bilibili App + Android 14+。可继续同步,但可能数据不全。`,duration:10}):p.success(`Bilibili 环境就绪 — uid=${n.uid}, 找到 ${d.cookieCount||"?"} 个 cookie,可以同步`)}catch(n){p.error({content:"Bilibili 诊断异常",description:n&&n.message?n.message:String(n),duration:8})}finally{b.bilibiliAdbDoctor=!1}}}async function Ge(){if(!b.bilibiliAdbSync){b.bilibiliAdbSync=!0;try{const n=await g.bilibiliAdbSync({});if(!n||!n.ok){const D=n&&n.reason||"SYNC_FAILED",B=Ie(D),J=n&&n.message||"";p.error({content:`Bilibili ADB 同步失败:${B}`,description:J,duration:8});return}const d=n.report||{},s=d.bilibili||{},c=s.eventCounts||{};s.lastErrorCode?p.warning({content:`Bilibili 同步部分完成 (${c.total||0} events)`,description:`lastErrorCode=${s.lastErrorCode}, ${s.lastErrorMessage||""} — 部分接口受反爬限制,稍后重试可补齐`,duration:8}):p.success(`Bilibili 同步成功:history=${c.history||0} / fav=${c.favourite||0} / dyn=${c.dynamic||0} / follow=${c.follow||0} (total=${c.total||0})`),N.value=d,q()}catch(n){p.error({content:"Bilibili ADB 同步异常",description:n&&n.message?n.message:String(n),duration:8})}finally{b.bilibiliAdbSync=!1}}}const Rt=[{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 Re(n){return v.value[n]||null}function be(n){const d=Q.value.find(c=>c.name===n)||{},s=Re(n)||{};return{...d,...s,name:n,capabilities:s.capabilities||d.capabilities||[]}}const me=I(!1),Ae=I(null);function Pe(n){Ae.value=be(n),me.value=!0}async function Pt(){const n=Ae.value?.name;await q(),n&&(Ae.value=be(n))}const Xe={ready:"green",needs_setup:"orange",unavailable:"default",error:"red"};function Tt(n){return Xe[n]||"default"}const Je={ready:"可采集",needs_setup:"待配置",unavailable:"不支持",error:"异常"};function xt(n){return n?Je[n.status]||n.status:"检测中"}const Ze={local:"本机直采",snapshot:"需手机采集",device:"需 root/本地解密",credential:"需登录授权",platform:"平台限制"};function Lt(n){return Ze[n]||n||""}const $e=new Set(["wechat-pc","qq-pc","dingtalk-pc","feishu-pc","messaging-whatsapp"]),et=new Set(["alipay-bill"]),tt=Object.freeze({"social-bilibili":Ge,"social-weibo":Qe,"social-douyin":je,"social-xiaohongshu":Ke,"social-toutiao":qe,"social-kuaishou":Ye});function nt(n){return ye(n)}function Mt(n){return At(n)}function Ut(n){return ht(n)}function Bt(n){return wt(n)}async function Nt(n){const d=be(n),s=nt(d);if(s==="file"){const c=await g.pickFile({title:`选择 ${d&&d.guide?d.guide.displayName:n} 的数据文件`});if(!c){p.info("已取消选择文件");return}let D,B;$e.has(n)?D=window.prompt("如数据库已解密为明文,直接确定即可;若为加密库,请粘贴密钥或输入密钥文件路径:")||void 0:et.has(n)&&/\.zip$/i.test(c)&&(B=window.prompt("请输入支付宝账单 ZIP 密码;如该 ZIP 未加密可直接确定:")||void 0),await ot(n,c,{key:D,zipPassword:B})}else if(s==="cookie"){const c=window.prompt("粘贴登录态 Cookie(在已登录的网页 DevTools → Application → Cookies 复制,或整条 Cookie 请求头):");if(!c||!c.trim()){p.info("已取消");return}await at(n,c.trim())}else if(s==="adb"){const c=tt[n];if(!c){Pe(n);return}b.sync[n]=!0;try{await c()}finally{b.sync[n]=!1}}else s==="sync"?(await rt(n))?.completed&&(me.value=!1):Pe(n)}async function at(n,d){b.sync[n]=!0,pe(n);try{const s={cookie:d};let c;typeof g.syncAdapterStream=="function"?c=await g.syncAdapterStream(n,s,ge):c=await g.syncAdapter(n,s),he(n,c,"采集").completed&&(me.value=!1),await q()}catch(s){p.error(`采集 ${n} 失败: ${s.message}`)}finally{b.sync[n]=!1,C.active=!1}}async function ot(n,d,s={}){b.sync[n]=!0,pe(n);try{const c={inputPath:d};s.key&&(c.key=s.key),s.zipPassword&&(c.zipPassword=s.zipPassword);let D;typeof g.syncAdapterStream=="function"?D=await g.syncAdapterStream(n,c,ge):D=await g.syncAdapter(n,c),he(n,D,"采集").completed&&(me.value=!1),await q()}catch(c){p.error(`采集 ${n} 失败: ${c.message}`)}finally{b.sync[n]=!1,C.active=!1}}const Ft=ae(()=>{const n=Q.value||[];if(!n.length)return null;let d=0;for(const s of n){const c=Re(s.name);c&&c.ready&&(d+=1)}return{ready:d,total:n.length}}),Ht=[{title:"时间",key:"at",dataIndex:"at",width:170},{title:"动作",dataIndex:"action",key:"action",width:200},{title:"详情",key:"details"}],zt=[{title:"日期",key:"occurredAt",width:100},{title:"描述",dataIndex:"description",key:"description"},{title:"金额",key:"amount",width:140,align:"right"}];function Kt(n){return n==="high"?"red":n==="medium"?"orange":"default"}function Wt(n){if(!n)return"";if(n.status==="skipped")return`${n.skipReason||"NOT_READY"}:${n.skipMessage||"来源当前未就绪"}`;const d=n.entityCounts||{},s=`events=${d.events??0} persons=${d.persons??0} places=${d.places??0} items=${d.items??0} topics=${d.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?`${s} · 错误: ${n.error}`:s}function qt(n){return se(n).level}function Vt(n){const d=se(n),s=n?.adapter||"未知来源",c={success:"成功",empty:"无新数据",partial:"部分有效",skipped:"已跳过",failed:"失败"}[d.kind];return`同步 ${s}: ${c}`}function he(n,d,s="同步"){const c=d&&typeof d=="object"?d:{adapter:n,status:"error",rawCount:0,invalidCount:0,entityCounts:{},error:"未收到有效同步报告"};N.value=c;const D=se(c),B=c.adapter||n;if(D.kind==="failed")p.error(`${s} ${B} 失败:${D.error}`);else if(D.kind==="skipped")p.info(`${s}已跳过:${B},${D.skipMessage}`);else if(D.kind==="partial"){const J=D.watermarkDeferred?`本次入库 ${D.total} 条,但分页窗口尚未扫描完,水位未推进;扩大采集窗口后可安全续扫`:D.total>0?`入库 ${D.total} 条,${D.invalidCount} 条无效`:`读取 ${D.rawCount} 条,但没有形成有效数据`;p.warning(`${s}部分完成:${B},${J}`)}else D.kind==="empty"?p.info(`${s}完成:${B},未发现新数据`):p.success(`${s}完成:${B} 入库 ${D.total} 条`);return D}function it(n){const d=Ct(n);N.value=Ot(n);const s=`同步 ${d.totalReports} 个来源:${d.success} 成功,${d.empty} 无新数据,${d.partial} 部分有效,${d.skipped} 已跳过,${d.failed} 失败,共入库 ${d.totalEntities} 条`;return d.level==="error"?p.error(s):d.level==="warning"?p.warning(s):d.level==="info"?p.info(s):p.success(s),d}async function q(){b.refresh=!0;try{e.value=await g.health(),K.value=await g.stats(),Q.value=await g.listAdapters();try{const n=await g.adapterReadiness(),d={};for(const s of Array.isArray(n)?n:[])d[s.name]=s;v.value=d}catch{}try{ve.value=await g.listAichatAccounts()}catch{}}catch(n){p.error("刷新失败: "+n.message)}finally{b.refresh=!1}}async function Yt(){if(E.value.trim()){b.ask=!0,O.value="",k.value=null;try{k.value=await g.ask(E.value.trim(),{acceptNonLocal:R.value})}catch(n){O.value=n.message}finally{b.ask=!1}}}async function Qt(){b.addMock=!0;try{await g.registerMock({count:30,seed:Date.now()%1e3}),await q(),p.success("MockAdapter 已注册(30 条 mock 数据 ready 同步)")}catch(n){p.error("注册失败: "+n.message)}finally{b.addMock=!1}}function pe(n="",d=!1){C.active=!0,C.batchMode=d,C.adapter=n,C.phase="starting",C.mailbox="",C.current=0,C.total=0,C.attempt=1,C.errorMessage=""}function ge(n){if(n){if(n.kind==="sync.batch.start"){C.batchMode=!0,C.adapter="(all)",C.phase="preparing",C.current=n.current||0,C.total=n.total||0;return}if(n.kind==="sync.batch.progress"){C.batchMode=!0,C.adapter=n.adapter||"(all)",C.phase=n.status||"completed",C.current=n.current||0,C.total=n.total||C.total;return}if(n.kind==="sync.batch.done"){C.batchMode=!0,C.adapter="(all)",C.phase="done",C.current=n.current||0,C.total=n.total||C.total;return}n.adapter&&(C.adapter=n.adapter),n.phase&&(C.phase=n.phase),C.batchMode||(typeof n.current=="number"&&(C.current=n.current),typeof n.total=="number"&&(C.total=n.total)),typeof n.attempt=="number"&&(C.attempt=n.attempt),n.mailbox&&(C.mailbox=n.mailbox),n.phase==="error"&&(C.errorMessage=n.message||"sync error")}}async function rt(n){b.sync[n]=!0,pe(n);try{const d=z[n],s=d?{include:{...d}}:{};let c;typeof g.syncAdapterStream=="function"?c=await g.syncAdapterStream(n,s,ge):c=await g.syncAdapter(n,s);const D=he(n,c);return await q(),D}catch(d){return p.error(`同步 ${n} 失败: ${d.message}`),null}finally{b.sync[n]=!1,C.active=!1}}async function jt(){b.syncAll=!0,pe("(all)",!0);try{const n=typeof g.syncAllStream=="function"?await g.syncAllStream({readyOnly:!0},ge):await g.syncAll({readyOnly:!0});it(n),await q()}catch(n){p.error("同步失败: "+n.message)}finally{b.syncAll=!1,C.active=!1}}async function Gt(n){try{await g.unregister(n),await q()}catch(d){p.error("移除失败: "+d.message)}}async function Xt(n){if(n){b.audit=!0;try{U.value=await g.recentAudit({limit:200})}catch(d){p.error("审计日志加载失败: "+d.message)}finally{b.audit=!1}}}const Te=ae(()=>!(!F.email||!F.email.includes("@")||!F.authCode||F.authCode.length<4||F.provider==="custom"&&!F.host));function Jt(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 lt(){F.provider="qq",F.email="",F.authCode="",F.host="",F.port=993,F.pdfPasswordHints={idCardLast6:"",phoneLast6:"",cardLast6:""},G.value=null}function xe(){const n={provider:F.provider,email:F.email.trim(),authCode:F.authCode};return F.provider==="custom"&&(n.host=F.host.trim(),n.port=F.port||993,n.secure=!0),n}function st(){const n={};for(const d of Object.keys(F.pdfPasswordHints)){const s=F.pdfPasswordHints[d];typeof s=="string"&&s.trim().length>0&&(n[d]=s.trim())}return Object.keys(n).length>0?n:null}async function Zt(){if(Te.value){b.testEmail=!0,G.value=null;try{G.value=await g.testEmailAuth(xe())}catch(n){G.value={ok:!1,error:n.message}}finally{b.testEmail=!1}}}async function $t(){if(!(!Te.value||!G.value?.ok)){b.saveEmail=!0;try{const n={},d=st();d&&(n.pdfPasswordHints=d),await g.registerEmail(xe(),n),p.success("邮箱账号已注册"),ie.value=!1,lt(),await q()}catch(n){p.error("保存失败: "+n.message)}finally{b.saveEmail=!1}}}const dt=ae(()=>!(!l.email||!l.email.includes("@")||!l.filePath||l.filePath.length<3));function en(){l.email="",l.zipPassword="",l.filePath="",w.value=null}async function tn(){if(dt.value){b.importAlipay=!0,w.value=null;try{await g.registerAlipay({email:l.email.trim(),zipPassword:l.zipPassword||void 0});const d=/\.zip$/i.test(l.filePath)?{zipPath:l.filePath,zipPassword:l.zipPassword||void 0}:{csvPath:l.filePath};w.value=await g.importAlipayBill(d),w.value?.status==="ok"?(p.success(`导入成功 — ${w.value.entityCounts?.events||0} 笔交易`),await q()):p.error("导入失败: "+(w.value?.error||w.value?.status))}catch(n){w.value={status:"error",error:n.message},p.error("导入失败: "+n.message)}finally{b.importAlipay=!1}}}async function ut(n){if(n){b.eventDetail=!0,ue.value=!0;try{Y.value=await g.eventDetail(n)}catch(d){Y.value=null,p.error("事件详情加载失败: "+d.message)}finally{b.eventDetail=!1}}}t({showEventDetail:ut});async function nn(n){b.skill=!0,le.value=null;try{le.value=await g.runSkill(n,{})}catch(d){p.error(`${n} 失败: ${d.message}`)}finally{b.skill=!1}}async function we(){b.reviewQueue=!0;try{M.value=await g.reviewQueueList(50);const n=await g.resolverStats();Object.assign(X,n)}catch(n){p.error("待消歧加载失败: "+n.message)}finally{b.reviewQueue=!1}}async function an(){S.value=!0,await we()}async function on(n,d){try{await g.reviewDecision(n,d),p.success(`已记录决策: ${d}`),await we()}catch(s){p.error("决策失败: "+s.message)}}async function rn(){b.resolverDrain=!0;try{const n=await g.resolverDrain(20);p.success(`drain 完成 — same=${n.same} different=${n.different} review=${n.review}`),await we()}catch(n){p.error("drain 失败: "+n.message)}finally{b.resolverDrain=!1}}async function ct(){try{const n=await g.resolverStats();Object.assign(X,n)}catch{}}gt(()=>{q(),ct()});const ft={hub:g,health:e,stats:K,adapters:Q,readinessMap:v,askInput:E,askResult:k,askError:O,acceptNonLocal:R,auditOpen:T,auditRows:U,lastSync:N,SYNC_INCLUDE_STORAGE_KEY:Ue,DEFAULT_SYNC_INCLUDE:j,_loadSyncInclude:H,syncIncludeOptions:z,persistSyncInclude:Z,includePopoverOpen:x,INCLUDE_KIND_META:P,adapterHasIncludeToggles:de,onIncludeKindToggle:L,emailConfigOpen:ie,emailForm:F,emailTestResult:G,eventDetailOpen:ue,eventDetail:Y,emailAccounts:$,skillResult:le,analysisSkills:ce,reviewQueueOpen:S,reviewRows:M,resolverStats:X,aichatWizardOpen:Se,aichatAccounts:ve,onAichatRegistered:ke,wechatWizardOpen:_e,onWechatRegistered:De,alipayConfigOpen:Ee,alipayForm:l,alipayResult:w,syncProgress:C,loading:b,bridgeDoctorReport:Ne,bilibiliReasonMessage:Ie,douyinReasonMessage:Fe,weiboReasonMessage:He,xhsReasonMessage:ze,xhsAdbSync:Ke,toutiaoReasonMessage:We,toutiaoAdbSync:qe,kuaishouReasonMessage:Ve,kuaishouAdbSync:Ye,bridgeDoctor:Et,weiboAdbSync:Qe,douyinAdbSync:je,bilibiliAdbDoctor:It,bilibiliAdbSync:Ge,adapterColumns:Rt,readinessOf:Re,adapterDescriptor:be,guideDrawerOpen:me,guideTarget:Ae,openGuide:Pe,recheckGuideTarget:Pt,READINESS_STATUS_COLOR:Xe,readinessStatusColor:Tt,READINESS_STATUS_LABEL:Je,readinessStatusLabel:xt,READINESS_CATEGORY_LABEL:Ze,readinessCategoryLabel:Lt,KEYED_FILE_ADAPTERS:$e,PASSWORD_FILE_ADAPTERS:et,ADB_COLLECT_ACTIONS:tt,collectMode:nt,collectActionLabel:Mt,collectButtonLabel:Ut,collectActionDescription:Bt,oneClickCollect:Nt,collectViaCookie:at,collectViaFile:ot,readinessSummary:Ft,auditColumns:Ht,transactionColumns:zt,sensitivityColor:Kt,syncSummary:Wt,syncAlertType:qt,syncAlertMessage:Vt,presentSyncReport:he,presentSyncAll:it,refresh:q,ask:Yt,addMock:Qt,resetSyncProgress:pe,handleSyncEvent:ge,syncOne:rt,syncAll:jt,unregisterAdapter:Gt,loadAudit:Xt,emailFormValid:Te,providerAuthHint:Jt,resetEmailForm:lt,buildEmailAccountPayload:xe,buildPdfHints:st,testEmailAuth:Zt,saveEmail:$t,alipayFormValid:dt,resetAlipayForm:en,importAlipay:tn,showEventDetail:ut,runSkill:nn,loadReviewQueue:we,openReviewQueue:an,decideReview:on,drainResolver:rn,loadResolverStats:ct,ref:I,reactive:ne,onMounted:gt,computed:ae,get message(){return p},get ReloadOutlined(){return Cn},get FileSearchOutlined(){return wn},get MessageOutlined(){return hn},get SendOutlined(){return An},get AppstoreOutlined(){return bn},get MailOutlined(){return _n},get InfoCircleOutlined(){return kn},get WalletOutlined(){return vn},get LinkOutlined(){return yn},get BulbOutlined(){return gn},get DollarOutlined(){return yt},get TeamOutlined(){return vt},get EnvironmentOutlined(){return kt},get HeartOutlined(){return _t},get ClockCircleOutlined(){return bt},get RobotOutlined(){return pn},get WechatOutlined(){return mn},get usePersonalDataHub(){return fe},get resolveCollectionMode(){return ye},get getCollectionActionLabel(){return At},get getCollectionButtonLabel(){return ht},get getCollectionActionDescription(){return wt},get analyzeSyncReport(){return se},get analyzeSyncReports(){return Ct},get selectImportantSyncReport(){return Ot},AIChatWizard:Qn,WechatWizard:aa};return Object.defineProperty(ft,"__isScriptSetup",{enumerable:!1,value:!0}),ft}},ia={class:"pdh-page"},ra={class:"pdh-header"},la={class:"kv"},sa={key:0,class:"kv"},da={key:1,class:"kv"},ua={class:"kv"},ca={key:0,class:"kv hint"},fa={style:{"margin-top":"12px",display:"flex","justify-content":"space-between","align-items":"center"}},ma={key:0,style:{"margin-top":"12px"}},pa={key:1,style:{"margin-top":"12px"}},ga={class:"answer"},ya={style:{"margin-top":"8px","font-size":"12px",color:"var(--text-color-secondary, #888)"}},va={key:2,style:{"margin-top":"8px"}},ka={style:{display:"flex","align-items":"center",gap:"8px"}},_a={class:"hint",style:{"margin-top":"4px"}},ba={key:0,style:{"margin-top":"16px"}},Aa={class:"json-pre",style:{"max-height":"300px",overflow:"auto"}},ha={key:0,style:{"margin-top":"8px"}},wa={key:0,style:{"margin-top":"4px",opacity:"0.85"}},Ca={key:1,style:{"margin-top":"4px",color:"#ffb3b3"}},Oa={style:{color:"#999","font-size":"12px","margin-left":"2px"}},Sa={key:0,style:{color:"#8c8c8c","font-size":"12px","margin-top":"2px","line-height":"1.4"}},Da={style:{"min-width":"220px"}},Ea={style:{color:"#999","font-size":"12px","margin-left":"4px"}},Ia={key:2,style:{"margin-top":"12px"}},Ra={class:"kv",style:{"margin-bottom":"4px"}},Pa={key:0,style:{color:"#faad14"}},Ta={key:2,class:"kv hint"},xa={key:3,class:"kv hint",style:{color:"#ff4d4f"}},La={key:3,style:{"margin-top":"12px"}},Ma={key:2,style:{"margin-top":"8px"}},Ua={key:1},Ba={style:{"margin-left":"8px"}},Na={key:3,class:"json-pre"},Fa={style:{"margin-left":"6px"}},Ha={key:0,style:{"margin-left":"6px"}},za={key:0,class:"hint",style:{"margin-top":"4px"}},Ka={key:0,style:{"margin-top":"8px"}},Wa={style:{"margin-bottom":"12px"}},qa={class:"hint"},Va={class:"kv"},Ya={class:"kv",style:{"margin-top":"4px"}},Qa={class:"kv"},ja={key:0,class:"hint",style:{"margin-top":"4px"}},Ga={key:1,style:{"font-size":"11px"}},Xa={style:{"font-weight":"600","margin-bottom":"8px"}},Ja={style:{margin:"0","padding-left":"20px","line-height":"1.9"}},Za={key:0,style:{"margin-top":"6px","font-size":"12px",color:"#52c41a"}},$a={style:{"font-size":"12px",color:"#999"}};function eo(m,t,g,e,K,Q){const v=A("a-button"),E=A("a-badge"),k=A("a-space"),O=A("a-tag"),R=A("a-card"),T=A("a-col"),U=A("a-row"),N=A("a-textarea"),j=A("a-checkbox"),H=A("a-alert"),z=A("a-divider"),Z=A("a-spin"),x=A("a-tooltip"),P=A("a-popover"),de=A("a-popconfirm"),L=A("a-table"),ie=A("a-empty"),F=A("a-progress"),G=A("a-select-option"),ue=A("a-select"),Y=A("a-form-item"),$=A("a-input"),le=A("a-input-password"),ce=A("a-input-number"),S=A("a-form"),M=A("a-drawer"),X=A("a-descriptions-item"),Se=A("a-descriptions"),ve=A("a-list-item-meta"),ke=A("a-list-item"),_e=A("a-list"),De=A("a-collapse-panel"),Ee=A("a-collapse");return r(),_("div",ia,[f(" Page header "),y("div",ra,[t[32]||(t[32]=y("div",null,[y("h2",{class:"page-title"},"个人数据中台"),y("p",{class:"page-sub"}," 让数据回归个人 — 各 app 数据本地加密落盘,本地 LLM 跨源分析,零云端外传。 ")],-1)),o(k,null,{default:a(()=>[o(v,{loading:e.loading.refresh,onClick:e.refresh},{icon:a(()=>[o(e.ReloadOutlined)]),default:a(()=>[t[29]||(t[29]=i(" 刷新 ",-1))]),_:1},8,["loading"]),o(E,{count:e.resolverStats.reviewQueue,offset:[0,0]},{default:a(()=>[o(v,{type:"primary",ghost:"",onClick:e.openReviewQueue},{icon:a(()=>[o(e.LinkOutlined)]),default:a(()=>[t[30]||(t[30]=i(" 待消歧 ",-1))]),_:1})]),_:1},8,["count"]),o(v,{type:"primary",ghost:"",onClick:t[0]||(t[0]=l=>e.auditOpen=!0)},{icon:a(()=>[o(e.FileSearchOutlined)]),default:a(()=>[t[31]||(t[31]=i(" 审计日志 ",-1))]),_:1})]),_:1})]),f(" Health row "),o(U,{gutter:16,style:{"margin-bottom":"16px"}},{default:a(()=>[o(T,{xs:24,sm:12,md:6},{default:a(()=>[o(R,{size:"small",title:"Vault"},{extra:a(()=>[o(O,{color:e.health?.vault?.ok?"green":"red"},{default:a(()=>[i(u(e.health?.vault?.ok?"正常":"未就绪"),1)]),_:1},8,["color"])]),default:a(()=>[y("div",la," schema v"+u(e.health?.vault?.schemaVersion??"?"),1),e.stats?.vault?(r(),_("div",sa," 事件 "+u(e.stats.vault.events)+" · 联系人 "+u(e.stats.vault.persons),1)):f("v-if",!0),e.stats?.vault?(r(),_("div",da," 地点 "+u(e.stats.vault.places)+" · 商品 "+u(e.stats.vault.items)+" · 主题 "+u(e.stats.vault.topics),1)):f("v-if",!0)]),_:1})]),_:1}),o(T,{xs:24,sm:12,md:6},{default:a(()=>[o(R,{size:"small",title:"本地 LLM"},{extra:a(()=>[o(O,{color:e.health?.llm?.ok?e.health.llm.isLocal?"green":"orange":"red"},{default:a(()=>[i(u(e.health?.llm?.ok?e.health.llm.isLocal?"本地":"非本地":"未就绪"),1)]),_:1},8,["color"])]),default:a(()=>[y("div",ua,u(e.health?.llm?.name||"—"),1),e.health?.llm?.ok&&!e.health.llm.isLocal?(r(),_("div",ca," ⚠️ 非本地 — ask 会被隐私 gate 拒绝,除非显式 acceptNonLocal ")):f("v-if",!0)]),_:1})]),_:1}),o(T,{xs:24,sm:12,md:6},{default:a(()=>[o(R,{size:"small",title:"KG 索引"},{extra:a(()=>[o(O,{color:e.health?.kgSink?.ok?"green":"default"},{default:a(()=>[i(u(e.health?.kgSink?.ok?"已连接":"不可用"),1)]),_:1},8,["color"])]),default:a(()=>[t[33]||(t[33]=y("div",{class:"kv"}," events / persons → cc knowledge-graph 实体 + 关系 ",-1))]),_:1})]),_:1}),o(T,{xs:24,sm:12,md:6},{default:a(()=>[o(R,{size:"small",title:"RAG 索引"},{extra:a(()=>[o(O,{color:e.health?.ragSink?.ok?"green":"default"},{default:a(()=>[i(u(e.health?.ragSink?.ok?"已连接":"不可用"),1)]),_:1},8,["color"])]),default:a(()=>[t[34]||(t[34]=y("div",{class:"kv"},"文本 → BM25(vector 留待后续 phase)",-1))]),_:1})]),_:1})]),_:1}),f(" Ask box "),o(R,{style:{"margin-bottom":"16px"}},{title:a(()=>[o(k,null,{default:a(()=>[o(e.MessageOutlined),t[35]||(t[35]=y("span",null,"问我数据",-1))]),_:1})]),default:a(()=>[o(N,{value:e.askInput,"onUpdate:value":t[1]||(t[1]=l=>e.askInput=l),rows:2,placeholder:"例:上个月在淘宝总共花了多少?/我妈生日那周买了啥送哪儿?",onKeydown:cn(Dt(e.ask,["exact","prevent"]),["enter"])},null,8,["value","onKeydown"]),y("div",fa,[o(j,{checked:e.acceptNonLocal,"onUpdate:checked":t[2]||(t[2]=l=>e.acceptNonLocal=l)},{default:a(()=>[...t[36]||(t[36]=[i("允许非本地 LLM (volcengine / anthropic 等)",-1)])]),_:1},8,["checked"]),o(v,{type:"primary",loading:e.loading.ask,disabled:!e.askInput.trim(),onClick:e.ask},{icon:a(()=>[o(e.SendOutlined)]),default:a(()=>[t[37]||(t[37]=i(" 提问 ",-1))]),_:1},8,["loading","disabled"])]),e.askError?(r(),_("div",ma,[o(H,{type:"error","show-icon":"",message:e.askError},null,8,["message"])])):f("v-if",!0),e.askResult?(r(),_("div",pa,[e.askResult.warning==="no-facts"?(r(),h(H,{key:0,type:"warning","show-icon":"",message:"vault 里没找到匹配的事件('no-facts')—— 先同步几个 adapter 让数据进 vault",style:{"margin-bottom":"12px"}})):e.askResult.warning==="hallucinated-citations"?(r(),h(H,{key:1,type:"warning","show-icon":"",message:`LLM 引用了 ${e.askResult.hallucinatedCitations?.length||0} 个不存在的 event id —— 模型在编造`,style:{"margin-bottom":"12px"}},null,8,["message"])):f("v-if",!0),y("div",ga,u(e.askResult.answer),1),y("div",ya," 引用 "+u(e.askResult.citations?.length||0)+" 条事实 · "+u(e.askResult.facts?.length||0)+" facts 入 prompt · "+u(e.askResult.durationMs)+"ms · "+u(e.askResult.model),1),e.askResult.citations?.length?(r(),_("div",va,[t[38]||(t[38]=y("span",{style:{"font-size":"12px",color:"var(--text-color-secondary, #888)"}},"事件链接(点击查看明细 / PDF 解密结果):",-1)),o(k,{style:{"margin-top":"4px"},wrap:""},{default:a(()=>[(r(!0),_(V,null,re(e.askResult.citations,l=>(r(),h(O,{key:l,color:"blue",style:{cursor:"pointer"},onClick:w=>e.showEventDetail(l)},{default:a(()=>[i(u(l),1)]),_:2},1032,["onClick"]))),128))]),_:1})])):f("v-if",!0)])):f("v-if",!0)]),_:1}),f(" Phase 11 — Analysis Skills cards "),o(R,{style:{"margin-bottom":"16px"}},{title:a(()=>[o(k,null,{default:a(()=>[o(e.BulbOutlined),t[39]||(t[39]=y("span",null,"分析 skill (Phase 11)",-1))]),_:1})]),extra:a(()=>[o(O,{color:"purple"},{default:a(()=>[...t[40]||(t[40]=[i("5 内置",-1)])]),_:1})]),default:a(()=>[o(U,{gutter:[12,12]},{default:a(()=>[(r(),_(V,null,re(e.analysisSkills,l=>o(T,{xs:24,sm:12,md:8,key:l.name},{default:a(()=>[o(R,{size:"small",hoverable:"",onClick:w=>e.runSkill(l.name)},{default:a(()=>[y("div",ka,[(r(),h(fn(l.icon),{style:{"font-size":"18px",color:"#722ed1"}})),y("strong",null,u(l.label),1)]),y("div",_a,u(l.description),1)]),_:2},1032,["onClick"])]),_:2},1024)),64))]),_:1}),e.skillResult?(r(),_("div",ba,[o(z,{plain:"",orientation:"left"},{default:a(()=>[i(u(e.skillResult.skill)+" 结果",1)]),_:1}),o(Z,{spinning:e.loading.skill},{default:a(()=>[y("pre",Aa,u(JSON.stringify(e.skillResult,null,2)),1),e.skillResult.llm_commentary||e.skillResult.llm_narrative?(r(),_("div",ha,[o(H,{type:"info",message:e.skillResult.llm_commentary||e.skillResult.llm_narrative},null,8,["message"])])):f("v-if",!0)]),_:1},8,["spinning"])])):f("v-if",!0)]),_:1}),f(" Adapters "),o(R,{style:{"margin-bottom":"16px"}},{title:a(()=>[o(k,null,{default:a(()=>[o(e.AppstoreOutlined),t[41]||(t[41]=y("span",null,"Adapters",-1)),e.readinessSummary?(r(),h(O,{key:0,color:e.readinessSummary.ready===e.readinessSummary.total?"green":"orange"},{default:a(()=>[i(u(e.readinessSummary.ready)+"/"+u(e.readinessSummary.total)+" 可采集 ",1)]),_:1},8,["color"])):f("v-if",!0)]),_:1})]),extra:a(()=>[o(k,null,{default:a(()=>[o(v,{onClick:t[3]||(t[3]=l=>e.emailConfigOpen=!0)},{icon:a(()=>[o(e.MailOutlined)]),default:a(()=>[t[42]||(t[42]=i(" 添加邮箱账号 ",-1))]),_:1}),o(v,{onClick:t[4]||(t[4]=l=>e.alipayConfigOpen=!0)},{icon:a(()=>[o(e.WalletOutlined)]),default:a(()=>[t[43]||(t[43]=i(" 导入支付宝账单 ",-1))]),_:1}),o(v,{onClick:t[5]||(t[5]=l=>e.aichatWizardOpen=!0)},{icon:a(()=>[o(e.RobotOutlined)]),default:a(()=>[t[44]||(t[44]=i(" 添加 AI 对话账号 ",-1))]),_:1}),o(v,{onClick:t[6]||(t[6]=l=>e.wechatWizardOpen=!0)},{icon:a(()=>[o(e.WechatOutlined)]),default:a(()=>[t[45]||(t[45]=i(" 添加 WeChat ",-1))]),_:1}),o(v,{onClick:e.bilibiliAdbDoctor,loading:e.loading.bilibiliAdbDoctor},{default:a(()=>[...t[46]||(t[46]=[i(" 诊断 Bilibili ADB ",-1)])]),_:1},8,["loading"]),o(v,{onClick:e.bilibiliAdbSync,loading:e.loading.bilibiliAdbSync},{default:a(()=>[...t[47]||(t[47]=[i(" 通过 PC ADB 同步 Bilibili ",-1)])]),_:1},8,["loading"]),o(v,{onClick:e.weiboAdbSync,loading:e.loading.weiboAdbSync},{default:a(()=>[...t[48]||(t[48]=[i(" 通过 PC ADB 同步 Weibo ",-1)])]),_:1},8,["loading"]),o(v,{onClick:e.xhsAdbSync,loading:e.loading.xhsAdbSync},{default:a(()=>[...t[49]||(t[49]=[i(" 通过 PC ADB 同步 Xhs ",-1)])]),_:1},8,["loading"]),o(v,{onClick:e.toutiaoAdbSync,loading:e.loading.toutiaoAdbSync},{default:a(()=>[...t[50]||(t[50]=[i(" 通过 PC ADB 同步 Toutiao ",-1)])]),_:1},8,["loading"]),o(v,{onClick:e.kuaishouAdbSync,loading:e.loading.kuaishouAdbSync},{default:a(()=>[...t[51]||(t[51]=[i(" 通过 PC ADB 同步 Kuaishou ",-1)])]),_:1},8,["loading"]),o(v,{onClick:e.bridgeDoctor,loading:e.loading.bridgeDoctor},{default:a(()=>[...t[52]||(t[52]=[i(" 诊断签名 Bridges ",-1)])]),_:1},8,["loading"]),o(v,{onClick:e.douyinAdbSync,loading:e.loading.douyinAdbSync},{default:a(()=>[...t[53]||(t[53]=[i(" 通过 PC ADB 同步 Douyin ",-1)])]),_:1},8,["loading"]),o(v,{onClick:e.addMock,loading:e.loading.addMock},{default:a(()=>[...t[54]||(t[54]=[i(" 注册 MockAdapter(开发) ",-1)])]),_:1},8,["loading"]),o(v,{type:"primary",onClick:e.syncAll,loading:e.loading.syncAll,disabled:!e.adapters.length},{default:a(()=>[...t[55]||(t[55]=[i(" 同步全部 ",-1)])]),_:1},8,["loading","disabled"])]),_:1})]),default:a(()=>[e.adapters.length?(r(),h(L,{key:0,columns:e.adapterColumns,"data-source":e.adapters,pagination:!1,"row-key":l=>l.name,size:"middle"},{bodyCell:a(({column:l,record:w})=>[l.key==="readiness"?(r(),_(V,{key:0},[e.readinessOf(w.name)?(r(),_(V,{key:0},[o(x,null,{title:a(()=>[y("div",null,u(e.readinessOf(w.name).message),1),e.readinessOf(w.name).actionHint?(r(),_("div",wa," → "+u(e.readinessOf(w.name).actionHint),1)):f("v-if",!0),e.readinessOf(w.name).lastError?(r(),_("div",Ca," 上次同步错误: "+u(e.readinessOf(w.name).lastError),1)):f("v-if",!0)]),default:a(()=>[o(O,{color:e.readinessStatusColor(e.readinessOf(w.name).status)},{default:a(()=>[i(u(e.readinessStatusLabel(e.readinessOf(w.name))),1)]),_:2},1032,["color"])]),_:2},1024),y("span",Oa,u(e.readinessCategoryLabel(e.readinessOf(w.name).category)),1),f(` inline reason for the non-ready rows so the user doesn't
|
|
3
|
+
have to hover to learn why a source can't collect `),e.readinessOf(w.name).ready?f("v-if",!0):(r(),_("div",Sa,u(e.readinessOf(w.name).message),1))],64)):(r(),h(O,{key:1,color:"default"},{default:a(()=>[...t[56]||(t[56]=[i("检测中",-1)])]),_:1}))],64)):l.key==="sensitivity"?(r(),_(V,{key:1},[o(O,{color:e.sensitivityColor(w.sensitivity)},{default:a(()=>[i(u(w.sensitivity),1)]),_:2},1032,["color"]),w.legalGate?(r(),h(O,{key:0,color:"red",style:{"margin-left":"4px"}},{default:a(()=>[...t[57]||(t[57]=[i("需法律确认",-1)])]),_:1})):f("v-if",!0)],64)):l.key==="capabilities"?(r(!0),_(V,{key:2},re(w.capabilities,C=>(r(),h(O,{key:C,style:{"margin-right":"4px"}},{default:a(()=>[i(u(C),1)]),_:2},1024))),128)):l.key==="actions"?(r(),h(k,{key:3},{default:a(()=>[o(v,{size:"small",type:"link",onClick:C=>e.openGuide(w.name)},{default:a(()=>[...t[58]||(t[58]=[i(" 如何导入 ",-1)])]),_:1},8,["onClick"]),f(` Capability/readiness-driven primary action: file picker,
|
|
4
|
+
Cookie prompt, dedicated ADB pull, direct sync, or guide. `),o(v,{size:"small",type:"primary",title:e.collectActionLabel(e.adapterDescriptor(w.name)),loading:e.loading.sync[w.name],onClick:C=>e.oneClickCollect(w.name)},{default:a(()=>[i(u(e.collectButtonLabel(e.adapterDescriptor(w.name))),1)]),_:2},1032,["title","loading","onClick"]),f(` Per-kind include toggles (only adapters with multi-kind
|
|
5
|
+
bridge output show this — currently just system-data-android).
|
|
6
|
+
Popover content is a checkbox group writing into
|
|
7
|
+
syncIncludeOptions[record.name]; changes auto-persist to
|
|
8
|
+
localStorage so the user's privacy choice survives reloads. `),e.adapterHasIncludeToggles(w.name)?(r(),h(P,{key:0,open:e.includePopoverOpen[w.name],"onUpdate:open":C=>e.includePopoverOpen[w.name]=C,trigger:"click",placement:"left",title:`${w.name} 采集范围`},{content:a(()=>[y("div",Da,[(r(!0),_(V,null,re(e.INCLUDE_KIND_META[w.name],C=>(r(),_("div",{key:C.key,style:{margin:"6px 0"}},[o(j,{checked:e.syncIncludeOptions[w.name][C.key]!==!1,onChange:b=>e.onIncludeKindToggle(w.name,C.key,b)},{default:a(()=>[i(u(C.label)+" ",1),y("span",Ea,u(C.hint),1),C.sensitive?(r(),h(O,{key:0,color:"orange",size:"small",style:{"margin-left":"4px"}},{default:a(()=>[...t[59]||(t[59]=[i("敏感",-1)])]),_:1})):f("v-if",!0)]),_:2},1032,["checked","onChange"])]))),128)),t[60]||(t[60]=y("div",{style:{"margin-top":"8px","font-size":"11px",color:"#999"}}," 取消勾选的数据本次同步不会拉取入库 ",-1))])]),default:a(()=>[o(v,{size:"small",title:"选择采集范围"},{default:a(()=>[...t[61]||(t[61]=[i("⚙",-1)])]),_:1})]),_:2},1032,["open","onUpdate:open","title"])):f("v-if",!0),o(de,{title:`从注册表移除 ${w.name}?(vault 数据不会删除)`,onConfirm:C=>e.unregisterAdapter(w.name)},{default:a(()=>[o(v,{size:"small",danger:""},{default:a(()=>[...t[62]||(t[62]=[i("移除",-1)])]),_:1})]),_:1},8,["title","onConfirm"])]),_:2},1024)):f("v-if",!0)]),_:1},8,["data-source","row-key"])):(r(),h(ie,{key:1,description:"无已注册 adapter — 点上方按钮注册 MockAdapter 看效果"})),e.syncProgress.active?(r(),_("div",Ia,[o(R,{size:"small",bordered:!0},{default:a(()=>[y("div",Ra,[t[63]||(t[63]=y("strong",null,"同步进行中",-1)),i(" · "+u(e.syncProgress.adapter)+" · "+u(e.syncProgress.phase||"...")+" ",1),e.syncProgress.attempt&&e.syncProgress.attempt>1?(r(),_("span",Pa," (重试 #"+u(e.syncProgress.attempt)+") ",1)):f("v-if",!0)]),e.syncProgress.total>0?(r(),h(F,{key:0,percent:Math.round(e.syncProgress.current/e.syncProgress.total*100),status:e.syncProgress.errorMessage?"exception":"active",size:"small"},null,8,["percent","status"])):(r(),h(F,{key:1,percent:0,status:"active",size:"small"})),e.syncProgress.mailbox?(r(),_("div",Ta," 邮箱 "+u(e.syncProgress.mailbox)+" · "+u(e.syncProgress.current)+" / "+u(e.syncProgress.total),1)):f("v-if",!0),e.syncProgress.errorMessage?(r(),_("div",xa,u(e.syncProgress.errorMessage),1)):f("v-if",!0)]),_:1})])):f("v-if",!0),e.lastSync?(r(),_("div",La,[o(H,{type:e.syncAlertType(e.lastSync),"show-icon":"",message:e.syncAlertMessage(e.lastSync),description:e.syncSummary(e.lastSync)},null,8,["type","message","description"])])):f("v-if",!0)]),_:1}),f(" Email config drawer (Phase 5.6) "),o(M,{open:e.emailConfigOpen,"onUpdate:open":t[16]||(t[16]=l=>e.emailConfigOpen=l),title:"添加邮箱账号",placement:"right",width:"560","destroy-on-close":!0,onClose:e.resetEmailForm},{footer:a(()=>[o(k,null,{default:a(()=>[o(v,{onClick:t[15]||(t[15]=l=>e.emailConfigOpen=!1)},{default:a(()=>[...t[73]||(t[73]=[i("取消",-1)])]),_:1}),o(v,{loading:e.loading.testEmail,disabled:!e.emailFormValid,onClick:e.testEmailAuth},{default:a(()=>[...t[74]||(t[74]=[i(" 测试连接 ",-1)])]),_:1},8,["loading","disabled"]),o(v,{type:"primary",loading:e.loading.saveEmail,disabled:!e.emailFormValid||!e.emailTestResult?.ok,onClick:e.saveEmail},{default:a(()=>[...t[75]||(t[75]=[i(" 保存并注册 ",-1)])]),_:1},8,["loading","disabled"])]),_:1})]),default:a(()=>[o(H,{message:"数据回归个人 — 凭证落本地加密文件(与 vault 主密钥同目录),同步动作 100% 本地。",type:"info","show-icon":"",style:{"margin-bottom":"16px"}}),o(S,{layout:"vertical",model:e.emailForm},{default:a(()=>[o(Y,{label:"邮箱服务商",required:""},{default:a(()=>[o(ue,{value:e.emailForm.provider,"onUpdate:value":t[7]||(t[7]=l=>e.emailForm.provider=l),placeholder:"选择服务商"},{default:a(()=>[o(G,{value:"qq"},{default:a(()=>[...t[64]||(t[64]=[i("QQ 邮箱 (imap.qq.com)",-1)])]),_:1}),o(G,{value:"163"},{default:a(()=>[...t[65]||(t[65]=[i("网易邮箱 163/126",-1)])]),_:1}),o(G,{value:"189"},{default:a(()=>[...t[66]||(t[66]=[i("189 邮箱",-1)])]),_:1}),o(G,{value:"outlook"},{default:a(()=>[...t[67]||(t[67]=[i("Outlook / Hotmail",-1)])]),_:1}),o(G,{value:"gmail"},{default:a(()=>[...t[68]||(t[68]=[i("Gmail",-1)])]),_:1}),o(G,{value:"custom"},{default:a(()=>[...t[69]||(t[69]=[i("自定义 IMAP",-1)])]),_:1})]),_:1},8,["value"])]),_:1}),o(Y,{label:"邮箱地址",required:""},{default:a(()=>[o($,{value:e.emailForm.email,"onUpdate:value":t[8]||(t[8]=l=>e.emailForm.email=l),placeholder:"you@qq.com",autocomplete:"off"},null,8,["value"])]),_:1}),o(Y,{required:""},{label:a(()=>[o(k,null,{default:a(()=>[t[70]||(t[70]=y("span",null,"授权码(非登录密码)",-1)),o(x,{title:e.providerAuthHint(e.emailForm.provider)},{default:a(()=>[o(e.InfoCircleOutlined,{style:{color:"#888"}})]),_:1},8,["title"])]),_:1})]),default:a(()=>[o(le,{value:e.emailForm.authCode,"onUpdate:value":t[9]||(t[9]=l=>e.emailForm.authCode=l),placeholder:"例:QQ 邮箱 设置 → 账户 → 开启 IMAP/SMTP → 生成的授权码",autocomplete:"off"},null,8,["value"])]),_:1}),e.emailForm.provider==="custom"?(r(),h(Y,{key:0,label:"IMAP host"},{default:a(()=>[o($,{value:e.emailForm.host,"onUpdate:value":t[10]||(t[10]=l=>e.emailForm.host=l),placeholder:"mail.example.com"},null,8,["value"])]),_:1})):f("v-if",!0),e.emailForm.provider==="custom"?(r(),h(Y,{key:1,label:"端口"},{default:a(()=>[o(ce,{value:e.emailForm.port,"onUpdate:value":t[11]||(t[11]=l=>e.emailForm.port=l),min:1,max:65535,"default-value":993},null,8,["value"])]),_:1})):f("v-if",!0),o(z,{orientation:"left",plain:""},{default:a(()=>[...t[71]||(t[71]=[i("PDF 账单解密提示(可选)",-1)])]),_:1}),t[72]||(t[72]=y("p",{class:"hint"}," 银行 PDF 月结大多加密;提供几个常用候选项让 Phase 5.5 自动解锁: ",-1)),o(Y,{label:"身份证后 6 位"},{default:a(()=>[o($,{value:e.emailForm.pdfPasswordHints.idCardLast6,"onUpdate:value":t[12]||(t[12]=l=>e.emailForm.pdfPasswordHints.idCardLast6=l),placeholder:"123456",autocomplete:"off"},null,8,["value"])]),_:1}),o(Y,{label:"手机后 6 位"},{default:a(()=>[o($,{value:e.emailForm.pdfPasswordHints.phoneLast6,"onUpdate:value":t[13]||(t[13]=l=>e.emailForm.pdfPasswordHints.phoneLast6=l),placeholder:"123456",autocomplete:"off"},null,8,["value"])]),_:1}),o(Y,{label:"信用卡尾 6 位"},{default:a(()=>[o($,{value:e.emailForm.pdfPasswordHints.cardLast6,"onUpdate:value":t[14]||(t[14]=l=>e.emailForm.pdfPasswordHints.cardLast6=l),placeholder:"123456",autocomplete:"off"},null,8,["value"])]),_:1}),e.emailTestResult?(r(),_("div",Ma,[o(H,{type:e.emailTestResult.ok?"success":"error","show-icon":"",message:e.emailTestResult.ok?"凭证有效 — 可以保存":`认证失败: ${e.emailTestResult.reason||e.emailTestResult.error}`},null,8,["type","message"])])):f("v-if",!0)]),_:1},8,["model"])]),_:1},8,["open"]),f(" Event detail drawer (Phase 5.6) "),o(M,{open:e.eventDetailOpen,"onUpdate:open":t[17]||(t[17]=l=>e.eventDetailOpen=l),title:e.eventDetail?`事件 ${e.eventDetail.event.id}`:"加载中...",placement:"right",width:"640","destroy-on-close":!0},{default:a(()=>[e.eventDetail?(r(),_(V,{key:0},[o(Se,{column:1,size:"small",bordered:""},{default:a(()=>[o(X,{label:"类型"},{default:a(()=>[i(u(e.eventDetail.event.subtype),1)]),_:1}),o(X,{label:"发生于"},{default:a(()=>[i(u(new Date(e.eventDetail.event.occurredAt).toLocaleString()),1)]),_:1}),o(X,{label:"actor"},{default:a(()=>[i(u(e.eventDetail.event.actor),1)]),_:1}),e.eventDetail.event.content?.title?(r(),h(X,{key:0,label:"标题"},{default:a(()=>[i(u(e.eventDetail.event.content.title),1)]),_:1})):f("v-if",!0),e.eventDetail.event.source?.adapter?(r(),h(X,{key:1,label:"来源 adapter"},{default:a(()=>[i(u(e.eventDetail.event.source.adapter)+" @ v"+u(e.eventDetail.event.source.adapterVersion),1)]),_:1})):f("v-if",!0)]),_:1}),e.eventDetail.classification?(r(),h(z,{key:0,orientation:"left",plain:""},{default:a(()=>[...t[76]||(t[76]=[i("分类",-1)])]),_:1})):f("v-if",!0),e.eventDetail.classification?(r(),_("div",Ua,[o(O,{color:"blue"},{default:a(()=>[i(u(e.eventDetail.classification.category),1)]),_:1}),o(O,null,{default:a(()=>[i(u(e.eventDetail.classification.layer),1)]),_:1}),y("span",Ba,"置信 "+u(Math.round((e.eventDetail.classification.confidence||0)*100))+"%",1)])):f("v-if",!0),e.eventDetail.extraction?(r(),h(z,{key:2,orientation:"left",plain:""},{default:a(()=>[i("结构化字段("+u(e.eventDetail.extraction.template)+")",1)]),_:1})):f("v-if",!0),e.eventDetail.extraction?(r(),_("pre",Na,u(JSON.stringify(e.eventDetail.extraction.fields,null,2)),1)):f("v-if",!0),e.eventDetail.extraction?.pdfExtraction?(r(),h(z,{key:4,orientation:"left",plain:""},{default:a(()=>[...t[77]||(t[77]=[i("PDF 解密 / 解析",-1)])]),_:1})):f("v-if",!0),e.eventDetail.extraction?.pdfExtraction?(r(),h(_e,{key:5,"data-source":e.eventDetail.extraction.pdfExtraction,size:"small"},{renderItem:a(({item:l})=>[o(ke,null,{default:a(()=>[o(ve,{title:l.filename},{description:a(()=>[y("div",null,[o(O,{color:l.decrypted?"green":"red"},{default:a(()=>[i(u(l.decrypted?"已解密":"解密失败"),1)]),_:2},1032,["color"]),y("span",Fa,"尝试 "+u(l.attempted)+" 次",1),l.transactionsExtracted!=null?(r(),_("span",Ha," · 提取 "+u(l.transactionsExtracted)+" 条交易 ",1)):f("v-if",!0)]),l.error?(r(),_("div",za,u(l.error),1)):f("v-if",!0)]),_:2},1032,["title"])]),_:2},1024)]),_:1},8,["data-source"])):f("v-if",!0),e.eventDetail.extraction?.fields?.transactions?.length?(r(),_(V,{key:6},[o(z,{orientation:"left",plain:""},{default:a(()=>[...t[78]||(t[78]=[i("交易明细",-1)])]),_:1}),o(L,{columns:e.transactionColumns,"data-source":e.eventDetail.extraction.fields.transactions,pagination:{pageSize:10,size:"small"},"row-key":(l,w)=>w,size:"small"},{bodyCell:a(({column:l,record:w})=>[l.key==="occurredAt"?(r(),_(V,{key:0},[i(u(new Date(w.occurredAtMs).toLocaleDateString()),1)],64)):l.key==="amount"?(r(),_("span",{key:1,class:St(w.amount.direction==="in"?"amount-in":"amount-out")},u(w.amount.direction==="in"?"+":"-")+u(w.amount.value.toFixed(2))+" "+u(w.amount.currency),3)):f("v-if",!0)]),_:1},8,["data-source","row-key"])],64)):f("v-if",!0)],64)):(r(),h(ie,{key:1,description:"无事件数据"}))]),_:1},8,["open","title"]),f(" Alipay import drawer (Phase 6) "),o(M,{open:e.alipayConfigOpen,"onUpdate:open":t[22]||(t[22]=l=>e.alipayConfigOpen=l),title:"导入支付宝账单",placement:"right",width:"560","destroy-on-close":!0,onClose:e.resetAlipayForm},{footer:a(()=>[o(k,null,{default:a(()=>[o(v,{onClick:t[21]||(t[21]=l=>e.alipayConfigOpen=!1)},{default:a(()=>[...t[84]||(t[84]=[i("关闭",-1)])]),_:1}),o(v,{type:"primary",loading:e.loading.importAlipay,disabled:!e.alipayFormValid,onClick:e.importAlipay},{default:a(()=>[...t[85]||(t[85]=[i(" 注册账户 + 导入 ",-1)])]),_:1},8,["loading","disabled"])]),_:1})]),default:a(()=>[o(H,{message:"支付宝官方导出 CSV — 服务器侧全量、稳定无风控。3 分钟拿到 12 个月流水。",type:"info","show-icon":"",style:{"margin-bottom":"16px"}}),o(Ee,{bordered:!1,style:{"margin-bottom":"12px"}},{default:a(()=>[o(De,{header:"如何导出账单(首次必看)"},{default:a(()=>[...t[79]||(t[79]=[y("ol",{style:{"padding-left":"18px","font-size":"13px"}},[y("li",null,"支付宝 app → 我的 → 账单 → 右上角 ⋯"),y("li",null,'点 "开具交易流水证明"'),y("li",null,"选月份范围(最长 12 个月)"),y("li",null,'用途选 "个人对账"'),y("li",null,"发送到你的绑定邮箱"),y("li",null,[i("从邮箱下载 "),y("code",null,"alipay_record_*.zip")]),y("li",null,"解压密码 = 你的身份证后 6 位")],-1)])]),_:1})]),_:1}),o(S,{layout:"vertical",model:e.alipayForm},{default:a(()=>[o(Y,{label:"支付宝绑定邮箱(账户标识)",required:""},{default:a(()=>[o($,{value:e.alipayForm.email,"onUpdate:value":t[18]||(t[18]=l=>e.alipayForm.email=l),placeholder:"alipay-bound@example.com",autocomplete:"off"},null,8,["value"])]),_:1}),o(Y,null,{label:a(()=>[o(k,null,{default:a(()=>[t[80]||(t[80]=y("span",null,"ZIP 密码(身份证后 6 位)",-1)),o(x,{title:"支付宝 ZIP 默认密码 = 身份证号后 6 位。也支持自定义密码。"},{default:a(()=>[o(e.InfoCircleOutlined,{style:{color:"#888"}})]),_:1})]),_:1})]),default:a(()=>[o(le,{value:e.alipayForm.zipPassword,"onUpdate:value":t[19]||(t[19]=l=>e.alipayForm.zipPassword=l),placeholder:"例:123456",autocomplete:"off"},null,8,["value"]),t[81]||(t[81]=y("div",{class:"hint",style:{"margin-top":"4px"}}," 空白则解析时再问,或导入的 ZIP 未加密。 ",-1))]),_:1}),o(z,{orientation:"left",plain:""},{default:a(()=>[...t[82]||(t[82]=[i("选择文件",-1)])]),_:1}),o(Y,{label:"ZIP 或 CSV 文件路径"},{default:a(()=>[o($,{value:e.alipayForm.filePath,"onUpdate:value":t[20]||(t[20]=l=>e.alipayForm.filePath=l),placeholder:"C:\\\\Users\\\\you\\\\Downloads\\\\alipay_record_xxx.zip","allow-clear":""},null,8,["value"]),t[83]||(t[83]=y("div",{class:"hint",style:{"margin-top":"4px"}}," 桌面版可通过 Electron 文件选择器自动填充;web-shell 复制完整路径。 ",-1))]),_:1}),e.alipayResult?(r(),_("div",Ka,[o(H,{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"])])):f("v-if",!0)]),_:1},8,["model"])]),_:1},8,["open"]),f(" Phase 8.7 — Review queue drawer (待消歧) "),o(M,{open:e.reviewQueueOpen,"onUpdate:open":t[23]||(t[23]=l=>e.reviewQueueOpen=l),title:"待消歧(EntityResolver 模糊判定)",placement:"right",width:"640","destroy-on-close":!0},{default:a(()=>[e.reviewRows.length===0&&!e.loading.reviewQueue?(r(),h(H,{key:0,type:"success","show-icon":"",message:"无待消歧 pair — 所有跨源 Person 已确定。",style:{"margin-bottom":"12px"}})):f("v-if",!0),y("div",Wa,[o(k,null,{default:a(()=>[o(v,{loading:e.loading.reviewQueue,onClick:e.loadReviewQueue},{icon:a(()=>[o(e.ReloadOutlined)]),default:a(()=>[t[86]||(t[86]=i(" 刷新 ",-1))]),_:1},8,["loading"]),o(v,{loading:e.loading.resolverDrain,onClick:e.drainResolver},{default:a(()=>[...t[87]||(t[87]=[i(" 手动 drain 队列 ",-1)])]),_:1},8,["loading"]),y("span",qa," queue: "+u(e.resolverStats.queue?.pending||0)+" pending · "+u(e.resolverStats.mergeGroups||0)+" groups ",1)]),_:1})]),o(_e,{"data-source":e.reviewRows,pagination:{pageSize:5,size:"small"},size:"small"},{renderItem:a(({item:l})=>[o(ke,null,{default:a(()=>[o(R,{size:"small",style:{width:"100%"}},{default:a(()=>[y("div",Va,[y("strong",null,"Pair #"+u(l.id),1),l.embed_sim?(r(),h(O,{key:0,color:"blue",style:{"margin-left":"8px"}},{default:a(()=>[i(" sim "+u(Number(l.embed_sim).toFixed(2)),1)]),_:2},1024)):f("v-if",!0),l.llm_verdict?(r(),h(O,{key:1,color:l.llm_verdict==="yes"?"green":l.llm_verdict==="no"?"red":"orange",style:{"margin-left":"4px"}},{default:a(()=>[i(" LLM: "+u(l.llm_verdict),1)]),_:2},1032,["color"])):f("v-if",!0)]),y("div",Ya," A: "+u(l.a_person_id),1),y("div",Qa,"B: "+u(l.b_person_id),1),l.llm_reason?(r(),_("div",ja," LLM 理由: "+u(l.llm_reason),1)):f("v-if",!0),o(k,{style:{"margin-top":"8px"}},{default:a(()=>[o(v,{size:"small",type:"primary",onClick:w=>e.decideReview(l.id,"same")},{default:a(()=>[...t[88]||(t[88]=[i("同一人",-1)])]),_:1},8,["onClick"]),o(v,{size:"small",danger:"",onClick:w=>e.decideReview(l.id,"different")},{default:a(()=>[...t[89]||(t[89]=[i("不同人",-1)])]),_:1},8,["onClick"]),o(v,{size:"small",onClick:w=>e.decideReview(l.id,"skip")},{default:a(()=>[...t[90]||(t[90]=[i("跳过",-1)])]),_:1},8,["onClick"])]),_:2},1024)]),_:2},1024)]),_:2},1024)]),_:1},8,["data-source"])]),_:1},8,["open"]),f(" Audit drawer "),o(M,{open:e.auditOpen,"onUpdate:open":t[24]||(t[24]=l=>e.auditOpen=l),title:"审计日志(数据 lineage)",placement:"right",width:"600",onAfterOpenChange:e.loadAudit},{default:a(()=>[o(L,{columns:e.auditColumns,"data-source":e.auditRows,pagination:{pageSize:20,size:"small"},"row-key":l=>l.id,size:"small"},{bodyCell:a(({column:l,record:w})=>[l.key==="at"?(r(),_(V,{key:0},[i(u(new Date(w.at).toLocaleString()),1)],64)):l.key==="details"?(r(),_("code",Ga,u(w.details||"—"),1)):f("v-if",!0)]),_:1},8,["data-source","row-key"])]),_:1},8,["open"]),f(" Phase 10.3 — AIChat WebView 鉴权向导 "),o(e.AIChatWizard,{open:e.aichatWizardOpen,"onUpdate:open":t[25]||(t[25]=l=>e.aichatWizardOpen=l),"existing-accounts":e.aichatAccounts,onRegistered:e.onAichatRegistered},null,8,["open","existing-accounts"]),f(" Phase 12.6.10 — WeChat env-probe + register 向导 "),o(e.WechatWizard,{open:e.wechatWizardOpen,"onUpdate:open":t[26]||(t[26]=l=>e.wechatWizardOpen=l),onRegistered:e.onWechatRegistered},null,8,["open"]),f(" 如何导入 — per-source onboarding guide "),o(M,{open:e.guideDrawerOpen,"onUpdate:open":t[28]||(t[28]=l=>e.guideDrawerOpen=l),title:e.guideTarget&&e.guideTarget.guide?`如何导入:${e.guideTarget.guide.displayName}`:"如何导入",width:"520",placement:"right"},{default:a(()=>[e.guideTarget&&e.guideTarget.guide?(r(),_(V,{key:0},[o(k,{style:{"margin-bottom":"12px"},wrap:""},{default:a(()=>[o(O,{color:e.readinessStatusColor(e.guideTarget.status)},{default:a(()=>[i(u(e.readinessStatusLabel(e.guideTarget)),1)]),_:1},8,["color"]),o(O,null,{default:a(()=>[i(u(e.readinessCategoryLabel(e.guideTarget.guide.category)),1)]),_:1})]),_:1}),o(H,{type:"info",message:e.guideTarget.guide.summary,"show-icon":"",style:{"margin-bottom":"8px"}},null,8,["message"]),!e.guideTarget.ready&&e.guideTarget.message?(r(),h(H,{key:0,type:"warning",message:`当前状态:${e.guideTarget.message}`,"show-icon":"",style:{"margin-bottom":"16px"}},null,8,["message"])):f("v-if",!0),(r(!0),_(V,null,re(e.guideTarget.guide.methods,(l,w)=>(r(),_("div",{key:w,style:{"margin-bottom":"20px"}},[y("div",Xa,[i(u(l.label)+" ",1),l.recommended?(r(),h(O,{key:0,color:"green",style:{"margin-left":"6px"}},{default:a(()=>[...t[91]||(t[91]=[i("推荐",-1)])]),_:1})):f("v-if",!0)]),y("ol",Ja,[(r(!0),_(V,null,re(l.steps,(C,b)=>(r(),_("li",{key:b},u(C),1))),128))]),l.note?(r(),_("div",Za,u(l.note),1)):f("v-if",!0)]))),128)),o(z,{style:{margin:"12px 0"}}),o(k,null,{default:a(()=>[e.collectMode(e.guideTarget)!=="setup"?(r(),h(v,{key:0,type:"primary",size:"large",loading:e.loading.sync[e.guideTarget.name],onClick:t[27]||(t[27]=l=>e.oneClickCollect(e.guideTarget.name))},{default:a(()=>[i(u(e.collectActionLabel(e.guideTarget)),1)]),_:1},8,["loading"])):(r(),h(v,{key:1,type:"primary",size:"large",loading:e.loading.refresh,onClick:e.recheckGuideTarget},{default:a(()=>[...t[92]||(t[92]=[i(" 重新检测 ",-1)])]),_:1},8,["loading"])),y("span",$a,u(e.collectActionDescription(e.guideTarget)),1)]),_:1})],64)):(r(),h(ie,{key:1,description:"该数据源暂无导入指引"}))]),_:1},8,["open","title"])])}const io=Be(oa,[["render",eo],["__scopeId","data-v-92d13942"],["__file","/tmp/cc-web-panel-XqKUIo/repo/packages/web-panel/src/views/PersonalDataHub.vue"]]);export{io as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{I as m,J as b,U as v,R as p,c as i,K as n,V as d,S as g,o as pe,a as ce,b as H,r as A,P as r,Q as f,F as x,Z as F,_ as Te}from"./vendor-Bn1JzzAn.js";import{Y as Oe,t as W,_ as Le,u as ue,b as de,d as h}from"./index-BO1itZaY.js";import{a1 as ze,d as Be,L as Ee,f as Fe,Z as De,aV as Re,G as Me,a5 as Ne,H as je,aq as we,$ as Ie,at as Ge,R as Ue}from"./icons-DG5UD-6K.js";const be=Object.freeze(["pending","running","paused","completed","failed","cancelled"]),Je=Object.freeze(["pending","running","gate-waiting","completed","failed","skipped"]),qe=Object.freeze(["requirement","architecture","code-generation","testing","code-review","deploy","monitoring"]),_e=Object.freeze(["feature","bugfix","refactor","security-audit"]),Ve=Object.freeze(["git-pr","docker","npm-publish","local","staging","custom"]),Ke=Object.freeze(["code-review","deploy"]);function M(t,o=0){return typeof t=="number"&&Number.isFinite(t)?t:o}function ie(t){if(!t)return{noDb:!1,error:""};const o=Oe(t),s=/No database/i.test(o);return{noDb:s,error:s?"No database":""}}function He(t,o=0){if(!t||typeof t!="object")return null;const s=t.id||"";return s?{key:s,id:s,pipelineId:String(t.pipelineId||""),stageIndex:M(t.stageIndex,o),name:String(t.name||""),status:String(t.status||"pending").toLowerCase(),gateRequired:!!t.gateRequired,gateApproved:!!t.gateApproved,gateRejectReason:t.gateRejectReason||"",input:t.input??null,output:t.output??null,errorMessage:t.errorMessage||"",startedAt:t.startedAt??null,completedAt:t.completedAt??null,_idx:o}:null}function We(t,o=0){if(!t||typeof t!="object")return null;const s=t.id||"";if(!s)return null;const e=Array.isArray(t.stages)?t.stages.map(He).filter(Boolean):[];return{key:s,id:s,name:t.name||"",template:String(t.template||""),config:t.config??null,status:String(t.status||"pending").toLowerCase(),currentStage:M(t.currentStage,0),result:t.result??null,errorMessage:t.errorMessage||"",createdAt:t.createdAt??null,updatedAt:t.updatedAt??null,startedAt:t.startedAt??null,completedAt:t.completedAt??null,stages:e,_idx:o}}function fe(t){const o=W(t);return Array.isArray(o)?o.map(We).filter(Boolean):[]}function Ye(t,o=0){if(!t||typeof t!="object")return null;const s=t.id||"";return s?{key:s,id:s,pipelineId:String(t.pipelineId||""),strategy:String(t.strategy||"").toLowerCase(),config:t.config??null,status:String(t.status||"pending").toLowerCase(),result:t.result??null,errorMessage:t.errorMessage||"",rolledBackAt:t.rolledBackAt??null,rollbackReason:t.rollbackReason||"",createdAt:t.createdAt??null,completedAt:t.completedAt??null,_idx:o}:null}function ge(t){const o=W(t);return Array.isArray(o)?o.map(Ye).filter(Boolean):[]}function Ze(t,o=0){if(!t||typeof t!="object")return null;const s=t.name||"";return s?{key:s,name:s,description:String(t.description||""),stages:Array.isArray(t.stages)?t.stages.filter(e=>typeof e=="string"):[],gateStages:Array.isArray(t.gateStages)?t.gateStages.filter(e=>typeof e=="string"):[],_idx:o}:null}function me(t){const o=W(t);return Array.isArray(o)?o.map(Ze).filter(Boolean):[]}const Qe={totalPipelines:0,pipelinesByTemplate:{},pipelinesByStatus:{},totalStages:0,stagesByStatus:{},totalArtifacts:0,totalDeploys:0,deploysByStrategy:{}};function ye(t){const o=JSON.parse(JSON.stringify(Qe));for(const e of _e)o.pipelinesByTemplate[e]=0;for(const e of be)o.pipelinesByStatus[e]=0;for(const e of Je)o.stagesByStatus[e]=0;for(const e of Ve)o.deploysByStrategy[e]=0;const s=W(t);if(!s||typeof s!="object"||Array.isArray(s))return o;if(o.totalPipelines=M(s.totalPipelines,0),o.totalStages=M(s.totalStages,0),o.totalArtifacts=M(s.totalArtifacts,0),o.totalDeploys=M(s.totalDeploys,0),s.pipelinesByTemplate&&typeof s.pipelinesByTemplate=="object")for(const[e,_]of Object.entries(s.pipelinesByTemplate))typeof _=="number"&&Number.isFinite(_)&&(o.pipelinesByTemplate[e]=_);if(s.pipelinesByStatus&&typeof s.pipelinesByStatus=="object")for(const[e,_]of Object.entries(s.pipelinesByStatus))typeof _=="number"&&Number.isFinite(_)&&(o.pipelinesByStatus[e]=_);if(s.stagesByStatus&&typeof s.stagesByStatus=="object")for(const[e,_]of Object.entries(s.stagesByStatus))typeof _=="number"&&Number.isFinite(_)&&(o.stagesByStatus[e]=_);if(s.deploysByStrategy&&typeof s.deploysByStrategy=="object")for(const[e,_]of Object.entries(s.deploysByStrategy))typeof _=="number"&&Number.isFinite(_)&&(o.deploysByStrategy[e]=_);return o}function Xe(t){if(t==null||t==="")return"—";const o=typeof t=="number"?new Date(t):new Date(String(t));return isNaN(o.getTime())?String(t):o.toLocaleString("zh-CN",{hour12:!1})}const $e={__name:"Pipeline",setup(t,{expose:o}){o();const s=ue(),{t:e}=de(),_=A(!1),I=A(!1),C=A([]),G=A([]),U=A([]),L=A({totalPipelines:0,pipelinesByTemplate:{},pipelinesByStatus:{},totalStages:0,stagesByStatus:{},totalArtifacts:0,totalDeploys:0,deploysByStrategy:{}}),P=A({noDb:!1,error:""}),z=A("pipelines"),D=A(""),B=A(""),N=A(!1),S=A(!1),k=ce({template:"feature",name:"",configJson:""}),J=A(null),q=H(()=>[{title:e("pipeline.cols.name"),key:"name"},{title:e("pipeline.cols.template"),key:"template",width:"110px"},{title:e("pipeline.cols.progress"),key:"progress",width:"160px"},{title:e("pipeline.cols.currentStage"),key:"currentStage",width:"140px"},{title:e("pipeline.cols.status"),key:"status",width:"110px"},{title:e("pipeline.cols.createdAt"),key:"createdAt",width:"160px"},{title:e("pipeline.cols.action"),key:"action",width:"260px"}]),j=H(()=>[{title:e("pipeline.cols.pipeline"),key:"pipeline",width:"180px"},{title:e("pipeline.cols.strategy"),key:"strategy",width:"120px"},{title:e("pipeline.cols.status"),key:"status",width:"110px"},{title:e("pipeline.cols.createdAt"),key:"createdAt"}]),Y=H(()=>{let a=C.value;return D.value&&(a=a.filter(u=>u.template===D.value)),B.value&&(a=a.filter(u=>u.status===B.value)),a});function Z(a){const u=`pipeline.templateLabels.${a}`,y=e(u);return y===u?a:y}function Q(a){return{feature:"green",bugfix:"red",refactor:"purple","security-audit":"volcano"}[a]||"default"}function w(a){const u=`pipeline.stageLabels.${a}`,y=e(u);return y===u?a:y}function X(a){const u=`pipeline.pipelineStatusLabels.${a}`,y=e(u);return y===u?a:y}function $(a){return{pending:"default",running:"processing",paused:"orange",completed:"green",failed:"red",cancelled:"default"}[a]||"default"}function ee(a){const u=`pipeline.stageStatusLabels.${a}`,y=e(u);return y===u?a:y}function V(a){return{pending:"default",running:"processing","gate-waiting":"gold",completed:"green",failed:"red",skipped:"default"}[a]||"default"}function E(a){const u=`pipeline.deployStatusLabels.${a}`,y=e(u);return y===u?a:y}function te(a){return{pending:"default",running:"processing",succeeded:"green",failed:"red","rolled-back":"orange"}[a]||"default"}function le(a){return{"git-pr":"blue",docker:"cyan","npm-publish":"magenta",local:"default",staging:"orange",custom:"purple"}[a]||"default"}function ae(a){return{pending:"gray",running:"blue","gate-waiting":"gold",completed:"green",failed:"red",skipped:"gray"}[a]||"gray"}function l(a){if(!a.stages.length)return 0;const u=a.stages.filter(y=>y.status==="completed").length;return Math.round(100*u/a.stages.length)}function c(a){if(!a.stages.length)return null;const u=Math.min(a.currentStage,a.stages.length-1);return a.stages[u]||null}function T(a){if(a.status!=="running")return!1;const u=c(a);return u&&u.status==="gate-waiting"&&u.gateRequired&&!u.gateApproved}function ve(a){return a.status==="pending"||a.status==="running"||a.status==="paused"}async function K(){_.value=!0,P.value={noDb:!1,error:""};try{const[a,u,y,O]=await Promise.all([s.execute("pipeline list",1e4).catch(()=>({output:""})),s.execute("pipeline deploys",1e4).catch(()=>({output:""})),s.execute("pipeline templates",8e3).catch(()=>({output:""})),s.execute("pipeline stats",8e3).catch(()=>({output:""}))]),se=[a,u,O].map(ne=>ie(ne.output)).find(ne=>ne.noDb);se&&(P.value=se),C.value=fe(a.output),G.value=ge(u.output),U.value=me(y.output),L.value=ye(O.output)}catch(a){h.error(e("pipeline.msg.loadFailed")+": "+(a?.message||a))}finally{_.value=!1}}async function ke(){if(!k.template){h.warning(e("pipeline.msg.selectTemplate"));return}if(k.configJson.trim())try{JSON.parse(k.configJson)}catch{h.warning(e("pipeline.msg.badConfigJson"));return}I.value=!0;try{const a=[`pipeline create --template ${k.template}`];k.name.trim()&&a.push(`--name "${k.name.trim().replace(/"/g,'\\"')}"`),k.configJson.trim()&&a.push(`--config '${k.configJson.trim().replace(/'/g,"'\\''")}'`);const{output:u}=await s.execute(a.join(" "),1e4);if(ie(u).noDb){h.error(e("pipeline.msg.needCcInit"));return}if(/error|Error|失败/i.test(u)&&!/"id"/.test(u)){h.error(e("pipeline.msg.createFailed")+": "+u.slice(0,120));return}h.success(e("pipeline.msg.createSuccess")),N.value=!1,oe(),await K()}catch(a){h.error(e("pipeline.msg.createFailed")+": "+(a?.message||a))}finally{I.value=!1}}async function Se(a){await R(a,`pipeline start ${a.id}`,e("pipeline.msg.started"))}async function Ae(a){await R(a,`pipeline pause ${a.id}`,e("pipeline.msg.paused"))}async function Ce(a){await R(a,`pipeline resume ${a.id}`,e("pipeline.msg.resumed"))}async function Pe(a){await R(a,`pipeline approve ${a.id}`,e("pipeline.msg.gateApproved"))}async function xe(a){await R(a,`pipeline cancel ${a.id}`,e("pipeline.msg.cancelled"))}async function R(a,u,y){try{const{output:O}=await s.execute(u,8e3);if(/error|Error|失败/i.test(O)&&!/"id"/.test(O)){h.error(e("pipeline.msg.actionFailed")+": "+O.slice(0,120));return}h.success(y),await K()}catch(O){h.error(e("pipeline.msg.actionFailed")+": "+(O?.message||O))}}function he(a){J.value=a,S.value=!0}function oe(){k.template="feature",k.name="",k.configJson=""}pe(K);const re={ws:s,t:e,loading:_,creating:I,pipelines:C,deploys:G,templates:U,stats:L,errorState:P,activeTab:z,templateFilter:D,statusFilter:B,showCreateModal:N,showDetailsModal:S,createForm:k,currentPipeline:J,pipelineColumns:q,deployColumns:j,filteredPipelines:Y,templateLabel:Z,templateColor:Q,stageLabel:w,pipelineStatusLabel:X,pipelineStatusColor:$,stageStatusLabel:ee,stageStatusColor:V,deployStatusLabel:E,deployStatusColor:te,strategyColor:le,timelineColor:ae,pipelineProgress:l,currentStageRecord:c,needsApproval:T,canCancel:ve,loadAll:K,createPipeline:ke,startPipeline:Se,pausePipeline:Ae,resumePipeline:Ce,approveGate:Pe,cancelPipeline:xe,runPipelineAction:R,viewPipelineDetails:he,resetCreateForm:oe,ref:A,computed:H,onMounted:pe,reactive:ce,get ReloadOutlined(){return Ue},get PlusOutlined(){return Ge},get ApartmentOutlined(){return Ie},get PlayCircleOutlined(){return we},get BlockOutlined(){return je},get FileTextOutlined(){return Ne},get CloudUploadOutlined(){return Me},get ArrowRightOutlined(){return Re},get LockOutlined(){return De},get CheckCircleOutlined(){return Fe},get LoadingOutlined(){return Ee},get CloseCircleOutlined(){return Be},get ClockCircleOutlined(){return ze},get message(){return h},get useI18n(){return de},get useWsStore(){return ue},get parsePipelines(){return fe},get parseDeploys(){return ge},get parseTemplates(){return me},get parseStats(){return ye},get detectPipelineError(){return ie},get formatPipelineTime(){return Xe},get PIPELINE_STATUSES(){return be},get STAGE_NAMES(){return qe},get TEMPLATES(){return _e},get GATE_STAGES(){return Ke}};return Object.defineProperty(re,"__isScriptSetup",{enumerable:!1,value:!0}),re}},et={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},tt={class:"page-title"},lt={class:"page-sub"},at={class:"stage-flow"},nt={class:"stage-idx"},it={class:"filter-bar"},ot={style:{color:"var(--text-primary)","font-weight":"500"}},rt={style:{color:"var(--text-secondary)","font-size":"11px","font-family":"monospace","margin-top":"2px"}},st={key:1,style:{color:"var(--text-muted)"}},pt={key:5,style:{color:"var(--text-secondary)","font-size":"11px"}},ct={style:{padding:"40px",color:"var(--text-muted)","text-align":"center"}},ut={key:0,style:{color:"var(--text-primary)","font-family":"monospace","font-size":"12px"}},dt={key:3,style:{color:"var(--text-secondary)","font-size":"11px"}},ft={style:{padding:"40px",color:"var(--text-muted)","text-align":"center"}},gt={style:{color:"var(--text-secondary)","font-size":"12px",margin:"0 0 10px"}},mt={class:"tpl-stages"},yt={key:0,style:{"padding-top":"8px"}},bt={style:{color:"var(--text-primary)","font-size":"13px",margin:"20px 0 10px"}},_t={style:{display:"flex","align-items":"center",gap:"8px","flex-wrap":"wrap"}},vt={style:{color:"var(--text-primary)","font-weight":"500"}},kt={key:0,style:{color:"#52c41a","margin-left":"4px"}},St={key:0,style:{color:"#ff4d4f","font-size":"11px","margin-top":"4px"}},At={key:1,style:{color:"var(--text-secondary)","font-size":"11px","margin-top":"2px"}},Ct={key:0};function Pt(t,o,s,e,_,I){const C=m("a-button"),G=m("a-space"),U=m("a-alert"),L=m("a-statistic"),P=m("a-card"),z=m("a-col"),D=m("a-row"),B=m("a-radio-button"),N=m("a-radio-group"),S=m("a-tag"),k=m("a-progress"),J=m("a-popconfirm"),q=m("a-table"),j=m("a-tab-pane"),Y=m("a-tabs"),Z=m("a-select-option"),Q=m("a-select"),w=m("a-form-item"),X=m("a-input"),$=m("a-textarea"),ee=m("a-form"),V=m("a-modal"),E=m("a-descriptions-item"),te=m("a-descriptions"),le=m("a-timeline-item"),ae=m("a-timeline");return r(),b("div",null,[v("div",et,[v("div",null,[v("h2",tt,p(t.$t("pipeline.title")),1),v("p",lt,p(t.$t("pipeline.subtitle")),1)]),i(G,null,{default:n(()=>[i(C,{loading:e.loading,onClick:e.loadAll},{icon:n(()=>[i(e.ReloadOutlined)]),default:n(()=>[f(" "+p(t.$t("pipeline.refresh")),1)]),_:1},8,["loading"]),i(C,{type:"primary",onClick:o[0]||(o[0]=l=>e.showCreateModal=!0)},{icon:n(()=>[i(e.PlusOutlined)]),default:n(()=>[f(" "+p(t.$t("pipeline.create")),1)]),_:1})]),_:1})]),d(" noDb banner "),e.errorState.noDb?(r(),g(U,{key:0,type:"info","show-icon":"",message:t.$t("pipeline.noDb.message"),description:t.$t("pipeline.noDb.description"),style:{"margin-bottom":"16px"}},null,8,["message","description"])):d("v-if",!0),d(" Stat cards "),i(D,{gutter:[16,16],style:{"margin-bottom":"20px"}},{default:n(()=>[i(z,{xs:12,sm:8,lg:5},{default:n(()=>[i(P,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:n(()=>[i(L,{title:t.$t("pipeline.stats.totalPipelines"),value:e.stats.totalPipelines,"value-style":{color:"#1677ff",fontSize:"20px"}},{prefix:n(()=>[i(e.ApartmentOutlined)]),_:1},8,["title","value"])]),_:1})]),_:1}),i(z,{xs:12,sm:8,lg:5},{default:n(()=>[i(P,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:n(()=>[i(L,{title:t.$t("pipeline.stats.running"),value:e.stats.pipelinesByStatus.running||0,"value-style":{color:(e.stats.pipelinesByStatus.running||0)>0?"#52c41a":"#888",fontSize:"20px"}},{prefix:n(()=>[i(e.PlayCircleOutlined)]),_:1},8,["title","value","value-style"])]),_:1})]),_:1}),i(z,{xs:12,sm:8,lg:5},{default:n(()=>[i(P,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:n(()=>[i(L,{title:t.$t("pipeline.stats.totalStages"),value:e.stats.totalStages,"value-style":{color:"#722ed1",fontSize:"20px"}},{prefix:n(()=>[i(e.BlockOutlined)]),_:1},8,["title","value"])]),_:1})]),_:1}),i(z,{xs:12,sm:8,lg:5},{default:n(()=>[i(P,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:n(()=>[i(L,{title:t.$t("pipeline.stats.totalArtifacts"),value:e.stats.totalArtifacts,"value-style":{color:"#13c2c2",fontSize:"20px"}},{prefix:n(()=>[i(e.FileTextOutlined)]),_:1},8,["title","value"])]),_:1})]),_:1}),i(z,{xs:24,sm:8,lg:4},{default:n(()=>[i(P,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:n(()=>[i(L,{title:t.$t("pipeline.stats.totalDeploys"),value:e.stats.totalDeploys,"value-style":{color:"#faad14",fontSize:"20px"}},{prefix:n(()=>[i(e.CloudUploadOutlined)]),_:1},8,["title","value"])]),_:1})]),_:1})]),_:1}),d(" Stages catalogue "),i(P,{title:t.$t("pipeline.stagesCardTitle"),size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"20px"},"body-style":{padding:"12px 16px"}},{default:n(()=>[v("div",at,[(r(!0),b(x,null,F(e.STAGE_NAMES,(l,c)=>(r(),b(x,{key:l},[v("span",{class:Te(["stage-pill",{"is-gate":e.GATE_STAGES.includes(l)}])},[v("span",nt,p(c+1),1),f(" "+p(e.stageLabel(l))+" ",1),e.GATE_STAGES.includes(l)?(r(),g(e.LockOutlined,{key:0,class:"gate-icon"})):d("v-if",!0)],2),c<e.STAGE_NAMES.length-1?(r(),g(e.ArrowRightOutlined,{key:0,class:"stage-arrow"})):d("v-if",!0)],64))),128))])]),_:1},8,["title"]),d(" Tabs "),i(Y,{activeKey:e.activeTab,"onUpdate:activeKey":o[3]||(o[3]=l=>e.activeTab=l),class:"pipeline-tabs"},{default:n(()=>[d(" ── Pipelines tab ─────────────────────────────────────────── "),i(j,{key:"pipelines",tab:t.$t("pipeline.tabs.pipelines")},{default:n(()=>[v("div",it,[i(N,{value:e.templateFilter,"onUpdate:value":o[1]||(o[1]=l=>e.templateFilter=l),size:"small","button-style":"solid"},{default:n(()=>[i(B,{value:""},{default:n(()=>[f(p(t.$t("pipeline.filters.allTemplates")),1)]),_:1}),(r(!0),b(x,null,F(e.TEMPLATES,l=>(r(),g(B,{key:l,value:l},{default:n(()=>[f(p(e.templateLabel(l)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"]),i(N,{value:e.statusFilter,"onUpdate:value":o[2]||(o[2]=l=>e.statusFilter=l),size:"small"},{default:n(()=>[i(B,{value:""},{default:n(()=>[f(p(t.$t("pipeline.filters.allStatuses")),1)]),_:1}),(r(!0),b(x,null,F(e.PIPELINE_STATUSES,l=>(r(),g(B,{key:l,value:l},{default:n(()=>[f(p(e.pipelineStatusLabel(l)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),i(q,{columns:e.pipelineColumns,"data-source":e.filteredPipelines,pagination:{pageSize:20,showTotal:l=>t.$t("pipeline.table.totalSuffix",{n:l})},size:"small",loading:e.loading,style:{background:"var(--bg-card)"}},{bodyCell:n(({column:l,record:c})=>[l.key==="name"?(r(),b(x,{key:0},[v("span",ot,p(c.name||t.$t("pipeline.table.unnamed")),1),v("div",rt,p(c.id.slice(0,16)),1)],64)):d("v-if",!0),l.key==="template"?(r(),g(S,{key:1,color:e.templateColor(c.template)},{default:n(()=>[f(p(e.templateLabel(c.template)),1)]),_:2},1032,["color"])):d("v-if",!0),l.key==="progress"?(r(),g(k,{key:2,percent:e.pipelineProgress(c),size:"small",status:c.status==="failed"?"exception":c.status==="completed"?"success":"active",format:()=>`${c.currentStage}/${c.stages.length}`},null,8,["percent","status","format"])):d("v-if",!0),l.key==="currentStage"?(r(),b(x,{key:3},[e.currentStageRecord(c)?(r(),g(S,{key:0,color:e.stageStatusColor(e.currentStageRecord(c).status)},{default:n(()=>[f(p(e.stageLabel(e.currentStageRecord(c).name)),1)]),_:2},1032,["color"])):(r(),b("span",st,"—"))],64)):d("v-if",!0),l.key==="status"?(r(),g(S,{key:4,color:e.pipelineStatusColor(c.status)},{default:n(()=>[f(p(e.pipelineStatusLabel(c.status)),1)]),_:2},1032,["color"])):d("v-if",!0),l.key==="createdAt"?(r(),b("span",pt,p(e.formatPipelineTime(c.createdAt)),1)):d("v-if",!0),l.key==="action"?(r(),b(x,{key:6},[i(C,{size:"small",type:"link",onClick:T=>e.viewPipelineDetails(c)},{default:n(()=>[f(p(t.$t("pipeline.table.actions.details")),1)]),_:1},8,["onClick"]),c.status==="pending"?(r(),g(C,{key:0,size:"small",type:"link",onClick:T=>e.startPipeline(c)},{default:n(()=>[f(p(t.$t("pipeline.table.actions.start")),1)]),_:1},8,["onClick"])):d("v-if",!0),c.status==="running"?(r(),g(C,{key:1,size:"small",type:"link",onClick:T=>e.pausePipeline(c)},{default:n(()=>[f(p(t.$t("pipeline.table.actions.pause")),1)]),_:1},8,["onClick"])):d("v-if",!0),c.status==="paused"?(r(),g(C,{key:2,size:"small",type:"link",onClick:T=>e.resumePipeline(c)},{default:n(()=>[f(p(t.$t("pipeline.table.actions.resume")),1)]),_:1},8,["onClick"])):d("v-if",!0),e.needsApproval(c)?(r(),g(C,{key:3,size:"small",type:"link",style:{color:"#52c41a"},onClick:T=>e.approveGate(c)},{default:n(()=>[f(p(t.$t("pipeline.table.actions.approveGate")),1)]),_:1},8,["onClick"])):d("v-if",!0),e.canCancel(c)?(r(),g(J,{key:4,title:t.$t("pipeline.table.cancelConfirm"),"ok-text":t.$t("pipeline.table.cancelOk"),"cancel-text":t.$t("pipeline.table.cancelBack"),onConfirm:T=>e.cancelPipeline(c)},{default:n(()=>[i(C,{size:"small",type:"link",danger:""},{default:n(()=>[f(p(t.$t("pipeline.table.actions.cancel")),1)]),_:1})]),_:1},8,["title","ok-text","cancel-text","onConfirm"])):d("v-if",!0)],64)):d("v-if",!0)]),emptyText:n(()=>[v("div",ct,[i(e.ApartmentOutlined,{style:{"font-size":"36px","margin-bottom":"10px",display:"block"}}),f(" "+p(e.templateFilter||e.statusFilter?t.$t("pipeline.table.emptyFiltered"):t.$t("pipeline.table.empty")),1)])]),_:1},8,["columns","data-source","pagination","loading"])]),_:1},8,["tab"]),d(" ── Deploys tab ───────────────────────────────────────────── "),i(j,{key:"deploys",tab:t.$t("pipeline.tabs.deploys")},{default:n(()=>[i(q,{columns:e.deployColumns,"data-source":e.deploys,pagination:{pageSize:20,showTotal:l=>t.$t("pipeline.table.totalSuffix",{n:l})},size:"small",loading:e.loading,style:{background:"var(--bg-card)"}},{bodyCell:n(({column:l,record:c})=>[l.key==="pipeline"?(r(),b("span",ut,p(c.pipelineId.slice(0,12)),1)):d("v-if",!0),l.key==="strategy"?(r(),g(S,{key:1,color:e.strategyColor(c.strategy),style:{"font-family":"monospace"}},{default:n(()=>[f(p(c.strategy),1)]),_:2},1032,["color"])):d("v-if",!0),l.key==="status"?(r(),g(S,{key:2,color:e.deployStatusColor(c.status)},{default:n(()=>[f(p(e.deployStatusLabel(c.status)),1)]),_:2},1032,["color"])):d("v-if",!0),l.key==="createdAt"?(r(),b("span",dt,p(e.formatPipelineTime(c.createdAt)),1)):d("v-if",!0)]),emptyText:n(()=>[v("div",ft,[i(e.CloudUploadOutlined,{style:{"font-size":"36px","margin-bottom":"10px",display:"block"}}),f(" "+p(t.$t("pipeline.table.emptyDeploys")),1)])]),_:1},8,["columns","data-source","pagination","loading"])]),_:1},8,["tab"]),d(" ── Templates tab ─────────────────────────────────────────── "),i(j,{key:"templates",tab:t.$t("pipeline.tabs.templates")},{default:n(()=>[i(D,{gutter:[16,16]},{default:n(()=>[(r(!0),b(x,null,F(e.templates,l=>(r(),g(z,{key:l.name,xs:24,sm:12,lg:12},{default:n(()=>[i(P,{title:e.templateLabel(l.name),size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{extra:n(()=>[i(S,{color:e.templateColor(l.name)},{default:n(()=>[f(p(l.name),1)]),_:2},1032,["color"])]),default:n(()=>[v("p",gt,p(l.description),1),v("div",mt,[(r(!0),b(x,null,F(l.stages,(c,T)=>(r(),g(S,{key:c,color:l.gateStages.includes(c)?"gold":"blue",style:{"font-size":"11px"}},{default:n(()=>[f(p(T+1)+". "+p(e.stageLabel(c))+" ",1),l.gateStages.includes(c)?(r(),g(e.LockOutlined,{key:0,style:{"font-size":"10px","margin-left":"2px"}})):d("v-if",!0)]),_:2},1032,["color"]))),128))])]),_:2},1032,["title"])]),_:2},1024))),128))]),_:1})]),_:1},8,["tab"])]),_:1},8,["activeKey"]),d(" ── Create pipeline modal ────────────────────────────────── "),i(V,{open:e.showCreateModal,"onUpdate:open":o[7]||(o[7]=l=>e.showCreateModal=l),title:t.$t("pipeline.create_modal.title"),"confirm-loading":e.creating,width:540,"ok-text":t.$t("pipeline.create_modal.ok"),"cancel-text":t.$t("pipeline.create_modal.cancel"),onOk:e.createPipeline,onCancel:e.resetCreateForm},{default:n(()=>[i(ee,{"label-col":{span:5},"wrapper-col":{span:19},style:{"margin-top":"16px"}},{default:n(()=>[i(w,{label:t.$t("pipeline.create_modal.templateLabel"),required:""},{default:n(()=>[i(Q,{value:e.createForm.template,"onUpdate:value":o[4]||(o[4]=l=>e.createForm.template=l)},{default:n(()=>[(r(!0),b(x,null,F(e.TEMPLATES,l=>(r(),g(Z,{key:l,value:l},{default:n(()=>[f(p(e.templateLabel(l)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),_:1},8,["label"]),i(w,{label:t.$t("pipeline.create_modal.nameLabel")},{default:n(()=>[i(X,{value:e.createForm.name,"onUpdate:value":o[5]||(o[5]=l=>e.createForm.name=l),placeholder:t.$t("pipeline.create_modal.namePlaceholder")},null,8,["value","placeholder"])]),_:1},8,["label"]),i(w,{label:t.$t("pipeline.create_modal.configLabel")},{default:n(()=>[i($,{value:e.createForm.configJson,"onUpdate:value":o[6]||(o[6]=l=>e.createForm.configJson=l),placeholder:t.$t("pipeline.create_modal.configPlaceholder"),"auto-size":{minRows:2,maxRows:5}},null,8,["value","placeholder"])]),_:1},8,["label"])]),_:1})]),_:1},8,["open","title","confirm-loading","ok-text","cancel-text"]),d(" ── Pipeline details modal ───────────────────────────────── "),i(V,{open:e.showDetailsModal,"onUpdate:open":o[8]||(o[8]=l=>e.showDetailsModal=l),title:t.$t("pipeline.details.title",{label:e.currentPipeline?.name||e.currentPipeline?.id?.slice(0,12)||""}),width:780,footer:null},{default:n(()=>[e.currentPipeline?(r(),b("div",yt,[i(te,{column:2,size:"small",bordered:""},{default:n(()=>[i(E,{label:t.$t("pipeline.details.template")},{default:n(()=>[i(S,{color:e.templateColor(e.currentPipeline.template)},{default:n(()=>[f(p(e.templateLabel(e.currentPipeline.template)),1)]),_:1},8,["color"])]),_:1},8,["label"]),i(E,{label:t.$t("pipeline.details.status")},{default:n(()=>[i(S,{color:e.pipelineStatusColor(e.currentPipeline.status)},{default:n(()=>[f(p(e.pipelineStatusLabel(e.currentPipeline.status)),1)]),_:1},8,["color"])]),_:1},8,["label"]),i(E,{label:t.$t("pipeline.details.progress"),span:2},{default:n(()=>[i(k,{percent:e.pipelineProgress(e.currentPipeline),status:e.currentPipeline.status==="failed"?"exception":e.currentPipeline.status==="completed"?"success":"active",size:"small"},null,8,["percent","status"])]),_:1},8,["label"]),i(E,{label:t.$t("pipeline.details.createdAt")},{default:n(()=>[f(p(e.formatPipelineTime(e.currentPipeline.createdAt)),1)]),_:1},8,["label"]),i(E,{label:t.$t("pipeline.details.startedAt")},{default:n(()=>[f(p(e.formatPipelineTime(e.currentPipeline.startedAt)),1)]),_:1},8,["label"])]),_:1}),v("h4",bt,p(t.$t("pipeline.details.stagesHeader")),1),i(ae,{mode:"left"},{default:n(()=>[(r(!0),b(x,null,F(e.currentPipeline.stages,l=>(r(),g(le,{key:l.id,color:e.timelineColor(l.status)},{dot:n(()=>[l.status==="completed"?(r(),g(e.CheckCircleOutlined,{key:0,style:{color:"#52c41a"}})):l.status==="running"?(r(),g(e.LoadingOutlined,{key:1,style:{color:"#1677ff"}})):l.status==="failed"?(r(),g(e.CloseCircleOutlined,{key:2,style:{color:"#ff4d4f"}})):l.status==="gate-waiting"?(r(),g(e.LockOutlined,{key:3,style:{color:"#faad14"}})):(r(),g(e.ClockCircleOutlined,{key:4,style:{color:"var(--text-muted)"}}))]),default:n(()=>[v("div",_t,[v("span",vt,p(l.stageIndex+1)+". "+p(e.stageLabel(l.name)),1),i(S,{color:e.stageStatusColor(l.status),style:{"font-size":"11px"}},{default:n(()=>[f(p(e.stageStatusLabel(l.status)),1)]),_:2},1032,["color"]),l.gateRequired?(r(),g(S,{key:0,color:"gold",style:{"font-size":"10px"}},{default:n(()=>[i(e.LockOutlined),f(" "+p(t.$t("pipeline.details.needsApproval"))+" ",1),l.gateApproved?(r(),b("span",kt,p(t.$t("pipeline.details.approved")),1)):d("v-if",!0)]),_:2},1024)):d("v-if",!0)]),l.errorMessage?(r(),b("div",St,p(t.$t("pipeline.details.errorPrefix"))+" "+p(l.errorMessage),1)):d("v-if",!0),l.startedAt?(r(),b("div",At,[f(p(e.formatPipelineTime(l.startedAt))+" ",1),l.completedAt?(r(),b("span",Ct," → "+p(e.formatPipelineTime(l.completedAt)),1)):d("v-if",!0)])):d("v-if",!0)]),_:2},1032,["color"]))),128))]),_:1})])):d("v-if",!0)]),_:1},8,["open","title"])])}const Ot=Le($e,[["render",Pt],["__scopeId","data-v-ee23c547"],["__file","/tmp/cc-web-panel-B0L6GV/repo/packages/web-panel/src/views/Pipeline.vue"]]);export{Ot as default};
|
|
1
|
+
import{I as m,J as b,U as v,R as p,c as i,K as n,V as d,S as g,o as pe,a as ce,b as H,r as A,P as r,Q as f,F as x,Z as F,_ as Te}from"./vendor-Bn1JzzAn.js";import{Y as Oe,t as W,_ as Le,u as ue,b as de,d as h}from"./index-B8nLBZbv.js";import{a1 as ze,d as Be,L as Ee,f as Fe,Z as De,aV as Re,G as Me,a5 as Ne,H as je,aq as we,$ as Ie,at as Ue,R as Ge}from"./icons-DG5UD-6K.js";const be=Object.freeze(["pending","running","paused","completed","failed","cancelled"]),Je=Object.freeze(["pending","running","gate-waiting","completed","failed","skipped"]),qe=Object.freeze(["requirement","architecture","code-generation","testing","code-review","deploy","monitoring"]),_e=Object.freeze(["feature","bugfix","refactor","security-audit"]),Ve=Object.freeze(["git-pr","docker","npm-publish","local","staging","custom"]),Ke=Object.freeze(["code-review","deploy"]);function M(t,o=0){return typeof t=="number"&&Number.isFinite(t)?t:o}function ie(t){if(!t)return{noDb:!1,error:""};const o=Oe(t),s=/No database/i.test(o);return{noDb:s,error:s?"No database":""}}function He(t,o=0){if(!t||typeof t!="object")return null;const s=t.id||"";return s?{key:s,id:s,pipelineId:String(t.pipelineId||""),stageIndex:M(t.stageIndex,o),name:String(t.name||""),status:String(t.status||"pending").toLowerCase(),gateRequired:!!t.gateRequired,gateApproved:!!t.gateApproved,gateRejectReason:t.gateRejectReason||"",input:t.input??null,output:t.output??null,errorMessage:t.errorMessage||"",startedAt:t.startedAt??null,completedAt:t.completedAt??null,_idx:o}:null}function We(t,o=0){if(!t||typeof t!="object")return null;const s=t.id||"";if(!s)return null;const e=Array.isArray(t.stages)?t.stages.map(He).filter(Boolean):[];return{key:s,id:s,name:t.name||"",template:String(t.template||""),config:t.config??null,status:String(t.status||"pending").toLowerCase(),currentStage:M(t.currentStage,0),result:t.result??null,errorMessage:t.errorMessage||"",createdAt:t.createdAt??null,updatedAt:t.updatedAt??null,startedAt:t.startedAt??null,completedAt:t.completedAt??null,stages:e,_idx:o}}function fe(t){const o=W(t);return Array.isArray(o)?o.map(We).filter(Boolean):[]}function Ye(t,o=0){if(!t||typeof t!="object")return null;const s=t.id||"";return s?{key:s,id:s,pipelineId:String(t.pipelineId||""),strategy:String(t.strategy||"").toLowerCase(),config:t.config??null,status:String(t.status||"pending").toLowerCase(),result:t.result??null,errorMessage:t.errorMessage||"",rolledBackAt:t.rolledBackAt??null,rollbackReason:t.rollbackReason||"",createdAt:t.createdAt??null,completedAt:t.completedAt??null,_idx:o}:null}function ge(t){const o=W(t);return Array.isArray(o)?o.map(Ye).filter(Boolean):[]}function Ze(t,o=0){if(!t||typeof t!="object")return null;const s=t.name||"";return s?{key:s,name:s,description:String(t.description||""),stages:Array.isArray(t.stages)?t.stages.filter(e=>typeof e=="string"):[],gateStages:Array.isArray(t.gateStages)?t.gateStages.filter(e=>typeof e=="string"):[],_idx:o}:null}function me(t){const o=W(t);return Array.isArray(o)?o.map(Ze).filter(Boolean):[]}const Qe={totalPipelines:0,pipelinesByTemplate:{},pipelinesByStatus:{},totalStages:0,stagesByStatus:{},totalArtifacts:0,totalDeploys:0,deploysByStrategy:{}};function ye(t){const o=JSON.parse(JSON.stringify(Qe));for(const e of _e)o.pipelinesByTemplate[e]=0;for(const e of be)o.pipelinesByStatus[e]=0;for(const e of Je)o.stagesByStatus[e]=0;for(const e of Ve)o.deploysByStrategy[e]=0;const s=W(t);if(!s||typeof s!="object"||Array.isArray(s))return o;if(o.totalPipelines=M(s.totalPipelines,0),o.totalStages=M(s.totalStages,0),o.totalArtifacts=M(s.totalArtifacts,0),o.totalDeploys=M(s.totalDeploys,0),s.pipelinesByTemplate&&typeof s.pipelinesByTemplate=="object")for(const[e,_]of Object.entries(s.pipelinesByTemplate))typeof _=="number"&&Number.isFinite(_)&&(o.pipelinesByTemplate[e]=_);if(s.pipelinesByStatus&&typeof s.pipelinesByStatus=="object")for(const[e,_]of Object.entries(s.pipelinesByStatus))typeof _=="number"&&Number.isFinite(_)&&(o.pipelinesByStatus[e]=_);if(s.stagesByStatus&&typeof s.stagesByStatus=="object")for(const[e,_]of Object.entries(s.stagesByStatus))typeof _=="number"&&Number.isFinite(_)&&(o.stagesByStatus[e]=_);if(s.deploysByStrategy&&typeof s.deploysByStrategy=="object")for(const[e,_]of Object.entries(s.deploysByStrategy))typeof _=="number"&&Number.isFinite(_)&&(o.deploysByStrategy[e]=_);return o}function Xe(t){if(t==null||t==="")return"—";const o=typeof t=="number"?new Date(t):new Date(String(t));return isNaN(o.getTime())?String(t):o.toLocaleString("zh-CN",{hour12:!1})}const $e={__name:"Pipeline",setup(t,{expose:o}){o();const s=ue(),{t:e}=de(),_=A(!1),I=A(!1),C=A([]),U=A([]),G=A([]),L=A({totalPipelines:0,pipelinesByTemplate:{},pipelinesByStatus:{},totalStages:0,stagesByStatus:{},totalArtifacts:0,totalDeploys:0,deploysByStrategy:{}}),P=A({noDb:!1,error:""}),z=A("pipelines"),D=A(""),B=A(""),N=A(!1),S=A(!1),k=ce({template:"feature",name:"",configJson:""}),J=A(null),q=H(()=>[{title:e("pipeline.cols.name"),key:"name"},{title:e("pipeline.cols.template"),key:"template",width:"110px"},{title:e("pipeline.cols.progress"),key:"progress",width:"160px"},{title:e("pipeline.cols.currentStage"),key:"currentStage",width:"140px"},{title:e("pipeline.cols.status"),key:"status",width:"110px"},{title:e("pipeline.cols.createdAt"),key:"createdAt",width:"160px"},{title:e("pipeline.cols.action"),key:"action",width:"260px"}]),j=H(()=>[{title:e("pipeline.cols.pipeline"),key:"pipeline",width:"180px"},{title:e("pipeline.cols.strategy"),key:"strategy",width:"120px"},{title:e("pipeline.cols.status"),key:"status",width:"110px"},{title:e("pipeline.cols.createdAt"),key:"createdAt"}]),Y=H(()=>{let a=C.value;return D.value&&(a=a.filter(u=>u.template===D.value)),B.value&&(a=a.filter(u=>u.status===B.value)),a});function Z(a){const u=`pipeline.templateLabels.${a}`,y=e(u);return y===u?a:y}function Q(a){return{feature:"green",bugfix:"red",refactor:"purple","security-audit":"volcano"}[a]||"default"}function w(a){const u=`pipeline.stageLabels.${a}`,y=e(u);return y===u?a:y}function X(a){const u=`pipeline.pipelineStatusLabels.${a}`,y=e(u);return y===u?a:y}function $(a){return{pending:"default",running:"processing",paused:"orange",completed:"green",failed:"red",cancelled:"default"}[a]||"default"}function ee(a){const u=`pipeline.stageStatusLabels.${a}`,y=e(u);return y===u?a:y}function V(a){return{pending:"default",running:"processing","gate-waiting":"gold",completed:"green",failed:"red",skipped:"default"}[a]||"default"}function E(a){const u=`pipeline.deployStatusLabels.${a}`,y=e(u);return y===u?a:y}function te(a){return{pending:"default",running:"processing",succeeded:"green",failed:"red","rolled-back":"orange"}[a]||"default"}function le(a){return{"git-pr":"blue",docker:"cyan","npm-publish":"magenta",local:"default",staging:"orange",custom:"purple"}[a]||"default"}function ae(a){return{pending:"gray",running:"blue","gate-waiting":"gold",completed:"green",failed:"red",skipped:"gray"}[a]||"gray"}function l(a){if(!a.stages.length)return 0;const u=a.stages.filter(y=>y.status==="completed").length;return Math.round(100*u/a.stages.length)}function c(a){if(!a.stages.length)return null;const u=Math.min(a.currentStage,a.stages.length-1);return a.stages[u]||null}function T(a){if(a.status!=="running")return!1;const u=c(a);return u&&u.status==="gate-waiting"&&u.gateRequired&&!u.gateApproved}function ve(a){return a.status==="pending"||a.status==="running"||a.status==="paused"}async function K(){_.value=!0,P.value={noDb:!1,error:""};try{const[a,u,y,O]=await Promise.all([s.execute("pipeline list",1e4).catch(()=>({output:""})),s.execute("pipeline deploys",1e4).catch(()=>({output:""})),s.execute("pipeline templates",8e3).catch(()=>({output:""})),s.execute("pipeline stats",8e3).catch(()=>({output:""}))]),se=[a,u,O].map(ne=>ie(ne.output)).find(ne=>ne.noDb);se&&(P.value=se),C.value=fe(a.output),U.value=ge(u.output),G.value=me(y.output),L.value=ye(O.output)}catch(a){h.error(e("pipeline.msg.loadFailed")+": "+(a?.message||a))}finally{_.value=!1}}async function ke(){if(!k.template){h.warning(e("pipeline.msg.selectTemplate"));return}if(k.configJson.trim())try{JSON.parse(k.configJson)}catch{h.warning(e("pipeline.msg.badConfigJson"));return}I.value=!0;try{const a=[`pipeline create --template ${k.template}`];k.name.trim()&&a.push(`--name "${k.name.trim().replace(/"/g,'\\"')}"`),k.configJson.trim()&&a.push(`--config '${k.configJson.trim().replace(/'/g,"'\\''")}'`);const{output:u}=await s.execute(a.join(" "),1e4);if(ie(u).noDb){h.error(e("pipeline.msg.needCcInit"));return}if(/error|Error|失败/i.test(u)&&!/"id"/.test(u)){h.error(e("pipeline.msg.createFailed")+": "+u.slice(0,120));return}h.success(e("pipeline.msg.createSuccess")),N.value=!1,oe(),await K()}catch(a){h.error(e("pipeline.msg.createFailed")+": "+(a?.message||a))}finally{I.value=!1}}async function Se(a){await R(a,`pipeline start ${a.id}`,e("pipeline.msg.started"))}async function Ae(a){await R(a,`pipeline pause ${a.id}`,e("pipeline.msg.paused"))}async function Ce(a){await R(a,`pipeline resume ${a.id}`,e("pipeline.msg.resumed"))}async function Pe(a){await R(a,`pipeline approve ${a.id}`,e("pipeline.msg.gateApproved"))}async function xe(a){await R(a,`pipeline cancel ${a.id}`,e("pipeline.msg.cancelled"))}async function R(a,u,y){try{const{output:O}=await s.execute(u,8e3);if(/error|Error|失败/i.test(O)&&!/"id"/.test(O)){h.error(e("pipeline.msg.actionFailed")+": "+O.slice(0,120));return}h.success(y),await K()}catch(O){h.error(e("pipeline.msg.actionFailed")+": "+(O?.message||O))}}function he(a){J.value=a,S.value=!0}function oe(){k.template="feature",k.name="",k.configJson=""}pe(K);const re={ws:s,t:e,loading:_,creating:I,pipelines:C,deploys:U,templates:G,stats:L,errorState:P,activeTab:z,templateFilter:D,statusFilter:B,showCreateModal:N,showDetailsModal:S,createForm:k,currentPipeline:J,pipelineColumns:q,deployColumns:j,filteredPipelines:Y,templateLabel:Z,templateColor:Q,stageLabel:w,pipelineStatusLabel:X,pipelineStatusColor:$,stageStatusLabel:ee,stageStatusColor:V,deployStatusLabel:E,deployStatusColor:te,strategyColor:le,timelineColor:ae,pipelineProgress:l,currentStageRecord:c,needsApproval:T,canCancel:ve,loadAll:K,createPipeline:ke,startPipeline:Se,pausePipeline:Ae,resumePipeline:Ce,approveGate:Pe,cancelPipeline:xe,runPipelineAction:R,viewPipelineDetails:he,resetCreateForm:oe,ref:A,computed:H,onMounted:pe,reactive:ce,get ReloadOutlined(){return Ge},get PlusOutlined(){return Ue},get ApartmentOutlined(){return Ie},get PlayCircleOutlined(){return we},get BlockOutlined(){return je},get FileTextOutlined(){return Ne},get CloudUploadOutlined(){return Me},get ArrowRightOutlined(){return Re},get LockOutlined(){return De},get CheckCircleOutlined(){return Fe},get LoadingOutlined(){return Ee},get CloseCircleOutlined(){return Be},get ClockCircleOutlined(){return ze},get message(){return h},get useI18n(){return de},get useWsStore(){return ue},get parsePipelines(){return fe},get parseDeploys(){return ge},get parseTemplates(){return me},get parseStats(){return ye},get detectPipelineError(){return ie},get formatPipelineTime(){return Xe},get PIPELINE_STATUSES(){return be},get STAGE_NAMES(){return qe},get TEMPLATES(){return _e},get GATE_STAGES(){return Ke}};return Object.defineProperty(re,"__isScriptSetup",{enumerable:!1,value:!0}),re}},et={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},tt={class:"page-title"},lt={class:"page-sub"},at={class:"stage-flow"},nt={class:"stage-idx"},it={class:"filter-bar"},ot={style:{color:"var(--text-primary)","font-weight":"500"}},rt={style:{color:"var(--text-secondary)","font-size":"11px","font-family":"monospace","margin-top":"2px"}},st={key:1,style:{color:"var(--text-muted)"}},pt={key:5,style:{color:"var(--text-secondary)","font-size":"11px"}},ct={style:{padding:"40px",color:"var(--text-muted)","text-align":"center"}},ut={key:0,style:{color:"var(--text-primary)","font-family":"monospace","font-size":"12px"}},dt={key:3,style:{color:"var(--text-secondary)","font-size":"11px"}},ft={style:{padding:"40px",color:"var(--text-muted)","text-align":"center"}},gt={style:{color:"var(--text-secondary)","font-size":"12px",margin:"0 0 10px"}},mt={class:"tpl-stages"},yt={key:0,style:{"padding-top":"8px"}},bt={style:{color:"var(--text-primary)","font-size":"13px",margin:"20px 0 10px"}},_t={style:{display:"flex","align-items":"center",gap:"8px","flex-wrap":"wrap"}},vt={style:{color:"var(--text-primary)","font-weight":"500"}},kt={key:0,style:{color:"#52c41a","margin-left":"4px"}},St={key:0,style:{color:"#ff4d4f","font-size":"11px","margin-top":"4px"}},At={key:1,style:{color:"var(--text-secondary)","font-size":"11px","margin-top":"2px"}},Ct={key:0};function Pt(t,o,s,e,_,I){const C=m("a-button"),U=m("a-space"),G=m("a-alert"),L=m("a-statistic"),P=m("a-card"),z=m("a-col"),D=m("a-row"),B=m("a-radio-button"),N=m("a-radio-group"),S=m("a-tag"),k=m("a-progress"),J=m("a-popconfirm"),q=m("a-table"),j=m("a-tab-pane"),Y=m("a-tabs"),Z=m("a-select-option"),Q=m("a-select"),w=m("a-form-item"),X=m("a-input"),$=m("a-textarea"),ee=m("a-form"),V=m("a-modal"),E=m("a-descriptions-item"),te=m("a-descriptions"),le=m("a-timeline-item"),ae=m("a-timeline");return r(),b("div",null,[v("div",et,[v("div",null,[v("h2",tt,p(t.$t("pipeline.title")),1),v("p",lt,p(t.$t("pipeline.subtitle")),1)]),i(U,null,{default:n(()=>[i(C,{loading:e.loading,onClick:e.loadAll},{icon:n(()=>[i(e.ReloadOutlined)]),default:n(()=>[f(" "+p(t.$t("pipeline.refresh")),1)]),_:1},8,["loading"]),i(C,{type:"primary",onClick:o[0]||(o[0]=l=>e.showCreateModal=!0)},{icon:n(()=>[i(e.PlusOutlined)]),default:n(()=>[f(" "+p(t.$t("pipeline.create")),1)]),_:1})]),_:1})]),d(" noDb banner "),e.errorState.noDb?(r(),g(G,{key:0,type:"info","show-icon":"",message:t.$t("pipeline.noDb.message"),description:t.$t("pipeline.noDb.description"),style:{"margin-bottom":"16px"}},null,8,["message","description"])):d("v-if",!0),d(" Stat cards "),i(D,{gutter:[16,16],style:{"margin-bottom":"20px"}},{default:n(()=>[i(z,{xs:12,sm:8,lg:5},{default:n(()=>[i(P,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:n(()=>[i(L,{title:t.$t("pipeline.stats.totalPipelines"),value:e.stats.totalPipelines,"value-style":{color:"#1677ff",fontSize:"20px"}},{prefix:n(()=>[i(e.ApartmentOutlined)]),_:1},8,["title","value"])]),_:1})]),_:1}),i(z,{xs:12,sm:8,lg:5},{default:n(()=>[i(P,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:n(()=>[i(L,{title:t.$t("pipeline.stats.running"),value:e.stats.pipelinesByStatus.running||0,"value-style":{color:(e.stats.pipelinesByStatus.running||0)>0?"#52c41a":"#888",fontSize:"20px"}},{prefix:n(()=>[i(e.PlayCircleOutlined)]),_:1},8,["title","value","value-style"])]),_:1})]),_:1}),i(z,{xs:12,sm:8,lg:5},{default:n(()=>[i(P,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:n(()=>[i(L,{title:t.$t("pipeline.stats.totalStages"),value:e.stats.totalStages,"value-style":{color:"#722ed1",fontSize:"20px"}},{prefix:n(()=>[i(e.BlockOutlined)]),_:1},8,["title","value"])]),_:1})]),_:1}),i(z,{xs:12,sm:8,lg:5},{default:n(()=>[i(P,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:n(()=>[i(L,{title:t.$t("pipeline.stats.totalArtifacts"),value:e.stats.totalArtifacts,"value-style":{color:"#13c2c2",fontSize:"20px"}},{prefix:n(()=>[i(e.FileTextOutlined)]),_:1},8,["title","value"])]),_:1})]),_:1}),i(z,{xs:24,sm:8,lg:4},{default:n(()=>[i(P,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:n(()=>[i(L,{title:t.$t("pipeline.stats.totalDeploys"),value:e.stats.totalDeploys,"value-style":{color:"#faad14",fontSize:"20px"}},{prefix:n(()=>[i(e.CloudUploadOutlined)]),_:1},8,["title","value"])]),_:1})]),_:1})]),_:1}),d(" Stages catalogue "),i(P,{title:t.$t("pipeline.stagesCardTitle"),size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"20px"},"body-style":{padding:"12px 16px"}},{default:n(()=>[v("div",at,[(r(!0),b(x,null,F(e.STAGE_NAMES,(l,c)=>(r(),b(x,{key:l},[v("span",{class:Te(["stage-pill",{"is-gate":e.GATE_STAGES.includes(l)}])},[v("span",nt,p(c+1),1),f(" "+p(e.stageLabel(l))+" ",1),e.GATE_STAGES.includes(l)?(r(),g(e.LockOutlined,{key:0,class:"gate-icon"})):d("v-if",!0)],2),c<e.STAGE_NAMES.length-1?(r(),g(e.ArrowRightOutlined,{key:0,class:"stage-arrow"})):d("v-if",!0)],64))),128))])]),_:1},8,["title"]),d(" Tabs "),i(Y,{activeKey:e.activeTab,"onUpdate:activeKey":o[3]||(o[3]=l=>e.activeTab=l),class:"pipeline-tabs"},{default:n(()=>[d(" ── Pipelines tab ─────────────────────────────────────────── "),i(j,{key:"pipelines",tab:t.$t("pipeline.tabs.pipelines")},{default:n(()=>[v("div",it,[i(N,{value:e.templateFilter,"onUpdate:value":o[1]||(o[1]=l=>e.templateFilter=l),size:"small","button-style":"solid"},{default:n(()=>[i(B,{value:""},{default:n(()=>[f(p(t.$t("pipeline.filters.allTemplates")),1)]),_:1}),(r(!0),b(x,null,F(e.TEMPLATES,l=>(r(),g(B,{key:l,value:l},{default:n(()=>[f(p(e.templateLabel(l)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"]),i(N,{value:e.statusFilter,"onUpdate:value":o[2]||(o[2]=l=>e.statusFilter=l),size:"small"},{default:n(()=>[i(B,{value:""},{default:n(()=>[f(p(t.$t("pipeline.filters.allStatuses")),1)]),_:1}),(r(!0),b(x,null,F(e.PIPELINE_STATUSES,l=>(r(),g(B,{key:l,value:l},{default:n(()=>[f(p(e.pipelineStatusLabel(l)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),i(q,{columns:e.pipelineColumns,"data-source":e.filteredPipelines,pagination:{pageSize:20,showTotal:l=>t.$t("pipeline.table.totalSuffix",{n:l})},size:"small",loading:e.loading,style:{background:"var(--bg-card)"}},{bodyCell:n(({column:l,record:c})=>[l.key==="name"?(r(),b(x,{key:0},[v("span",ot,p(c.name||t.$t("pipeline.table.unnamed")),1),v("div",rt,p(c.id.slice(0,16)),1)],64)):d("v-if",!0),l.key==="template"?(r(),g(S,{key:1,color:e.templateColor(c.template)},{default:n(()=>[f(p(e.templateLabel(c.template)),1)]),_:2},1032,["color"])):d("v-if",!0),l.key==="progress"?(r(),g(k,{key:2,percent:e.pipelineProgress(c),size:"small",status:c.status==="failed"?"exception":c.status==="completed"?"success":"active",format:()=>`${c.currentStage}/${c.stages.length}`},null,8,["percent","status","format"])):d("v-if",!0),l.key==="currentStage"?(r(),b(x,{key:3},[e.currentStageRecord(c)?(r(),g(S,{key:0,color:e.stageStatusColor(e.currentStageRecord(c).status)},{default:n(()=>[f(p(e.stageLabel(e.currentStageRecord(c).name)),1)]),_:2},1032,["color"])):(r(),b("span",st,"—"))],64)):d("v-if",!0),l.key==="status"?(r(),g(S,{key:4,color:e.pipelineStatusColor(c.status)},{default:n(()=>[f(p(e.pipelineStatusLabel(c.status)),1)]),_:2},1032,["color"])):d("v-if",!0),l.key==="createdAt"?(r(),b("span",pt,p(e.formatPipelineTime(c.createdAt)),1)):d("v-if",!0),l.key==="action"?(r(),b(x,{key:6},[i(C,{size:"small",type:"link",onClick:T=>e.viewPipelineDetails(c)},{default:n(()=>[f(p(t.$t("pipeline.table.actions.details")),1)]),_:1},8,["onClick"]),c.status==="pending"?(r(),g(C,{key:0,size:"small",type:"link",onClick:T=>e.startPipeline(c)},{default:n(()=>[f(p(t.$t("pipeline.table.actions.start")),1)]),_:1},8,["onClick"])):d("v-if",!0),c.status==="running"?(r(),g(C,{key:1,size:"small",type:"link",onClick:T=>e.pausePipeline(c)},{default:n(()=>[f(p(t.$t("pipeline.table.actions.pause")),1)]),_:1},8,["onClick"])):d("v-if",!0),c.status==="paused"?(r(),g(C,{key:2,size:"small",type:"link",onClick:T=>e.resumePipeline(c)},{default:n(()=>[f(p(t.$t("pipeline.table.actions.resume")),1)]),_:1},8,["onClick"])):d("v-if",!0),e.needsApproval(c)?(r(),g(C,{key:3,size:"small",type:"link",style:{color:"#52c41a"},onClick:T=>e.approveGate(c)},{default:n(()=>[f(p(t.$t("pipeline.table.actions.approveGate")),1)]),_:1},8,["onClick"])):d("v-if",!0),e.canCancel(c)?(r(),g(J,{key:4,title:t.$t("pipeline.table.cancelConfirm"),"ok-text":t.$t("pipeline.table.cancelOk"),"cancel-text":t.$t("pipeline.table.cancelBack"),onConfirm:T=>e.cancelPipeline(c)},{default:n(()=>[i(C,{size:"small",type:"link",danger:""},{default:n(()=>[f(p(t.$t("pipeline.table.actions.cancel")),1)]),_:1})]),_:1},8,["title","ok-text","cancel-text","onConfirm"])):d("v-if",!0)],64)):d("v-if",!0)]),emptyText:n(()=>[v("div",ct,[i(e.ApartmentOutlined,{style:{"font-size":"36px","margin-bottom":"10px",display:"block"}}),f(" "+p(e.templateFilter||e.statusFilter?t.$t("pipeline.table.emptyFiltered"):t.$t("pipeline.table.empty")),1)])]),_:1},8,["columns","data-source","pagination","loading"])]),_:1},8,["tab"]),d(" ── Deploys tab ───────────────────────────────────────────── "),i(j,{key:"deploys",tab:t.$t("pipeline.tabs.deploys")},{default:n(()=>[i(q,{columns:e.deployColumns,"data-source":e.deploys,pagination:{pageSize:20,showTotal:l=>t.$t("pipeline.table.totalSuffix",{n:l})},size:"small",loading:e.loading,style:{background:"var(--bg-card)"}},{bodyCell:n(({column:l,record:c})=>[l.key==="pipeline"?(r(),b("span",ut,p(c.pipelineId.slice(0,12)),1)):d("v-if",!0),l.key==="strategy"?(r(),g(S,{key:1,color:e.strategyColor(c.strategy),style:{"font-family":"monospace"}},{default:n(()=>[f(p(c.strategy),1)]),_:2},1032,["color"])):d("v-if",!0),l.key==="status"?(r(),g(S,{key:2,color:e.deployStatusColor(c.status)},{default:n(()=>[f(p(e.deployStatusLabel(c.status)),1)]),_:2},1032,["color"])):d("v-if",!0),l.key==="createdAt"?(r(),b("span",dt,p(e.formatPipelineTime(c.createdAt)),1)):d("v-if",!0)]),emptyText:n(()=>[v("div",ft,[i(e.CloudUploadOutlined,{style:{"font-size":"36px","margin-bottom":"10px",display:"block"}}),f(" "+p(t.$t("pipeline.table.emptyDeploys")),1)])]),_:1},8,["columns","data-source","pagination","loading"])]),_:1},8,["tab"]),d(" ── Templates tab ─────────────────────────────────────────── "),i(j,{key:"templates",tab:t.$t("pipeline.tabs.templates")},{default:n(()=>[i(D,{gutter:[16,16]},{default:n(()=>[(r(!0),b(x,null,F(e.templates,l=>(r(),g(z,{key:l.name,xs:24,sm:12,lg:12},{default:n(()=>[i(P,{title:e.templateLabel(l.name),size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{extra:n(()=>[i(S,{color:e.templateColor(l.name)},{default:n(()=>[f(p(l.name),1)]),_:2},1032,["color"])]),default:n(()=>[v("p",gt,p(l.description),1),v("div",mt,[(r(!0),b(x,null,F(l.stages,(c,T)=>(r(),g(S,{key:c,color:l.gateStages.includes(c)?"gold":"blue",style:{"font-size":"11px"}},{default:n(()=>[f(p(T+1)+". "+p(e.stageLabel(c))+" ",1),l.gateStages.includes(c)?(r(),g(e.LockOutlined,{key:0,style:{"font-size":"10px","margin-left":"2px"}})):d("v-if",!0)]),_:2},1032,["color"]))),128))])]),_:2},1032,["title"])]),_:2},1024))),128))]),_:1})]),_:1},8,["tab"])]),_:1},8,["activeKey"]),d(" ── Create pipeline modal ────────────────────────────────── "),i(V,{open:e.showCreateModal,"onUpdate:open":o[7]||(o[7]=l=>e.showCreateModal=l),title:t.$t("pipeline.create_modal.title"),"confirm-loading":e.creating,width:540,"ok-text":t.$t("pipeline.create_modal.ok"),"cancel-text":t.$t("pipeline.create_modal.cancel"),onOk:e.createPipeline,onCancel:e.resetCreateForm},{default:n(()=>[i(ee,{"label-col":{span:5},"wrapper-col":{span:19},style:{"margin-top":"16px"}},{default:n(()=>[i(w,{label:t.$t("pipeline.create_modal.templateLabel"),required:""},{default:n(()=>[i(Q,{value:e.createForm.template,"onUpdate:value":o[4]||(o[4]=l=>e.createForm.template=l)},{default:n(()=>[(r(!0),b(x,null,F(e.TEMPLATES,l=>(r(),g(Z,{key:l,value:l},{default:n(()=>[f(p(e.templateLabel(l)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),_:1},8,["label"]),i(w,{label:t.$t("pipeline.create_modal.nameLabel")},{default:n(()=>[i(X,{value:e.createForm.name,"onUpdate:value":o[5]||(o[5]=l=>e.createForm.name=l),placeholder:t.$t("pipeline.create_modal.namePlaceholder")},null,8,["value","placeholder"])]),_:1},8,["label"]),i(w,{label:t.$t("pipeline.create_modal.configLabel")},{default:n(()=>[i($,{value:e.createForm.configJson,"onUpdate:value":o[6]||(o[6]=l=>e.createForm.configJson=l),placeholder:t.$t("pipeline.create_modal.configPlaceholder"),"auto-size":{minRows:2,maxRows:5}},null,8,["value","placeholder"])]),_:1},8,["label"])]),_:1})]),_:1},8,["open","title","confirm-loading","ok-text","cancel-text"]),d(" ── Pipeline details modal ───────────────────────────────── "),i(V,{open:e.showDetailsModal,"onUpdate:open":o[8]||(o[8]=l=>e.showDetailsModal=l),title:t.$t("pipeline.details.title",{label:e.currentPipeline?.name||e.currentPipeline?.id?.slice(0,12)||""}),width:780,footer:null},{default:n(()=>[e.currentPipeline?(r(),b("div",yt,[i(te,{column:2,size:"small",bordered:""},{default:n(()=>[i(E,{label:t.$t("pipeline.details.template")},{default:n(()=>[i(S,{color:e.templateColor(e.currentPipeline.template)},{default:n(()=>[f(p(e.templateLabel(e.currentPipeline.template)),1)]),_:1},8,["color"])]),_:1},8,["label"]),i(E,{label:t.$t("pipeline.details.status")},{default:n(()=>[i(S,{color:e.pipelineStatusColor(e.currentPipeline.status)},{default:n(()=>[f(p(e.pipelineStatusLabel(e.currentPipeline.status)),1)]),_:1},8,["color"])]),_:1},8,["label"]),i(E,{label:t.$t("pipeline.details.progress"),span:2},{default:n(()=>[i(k,{percent:e.pipelineProgress(e.currentPipeline),status:e.currentPipeline.status==="failed"?"exception":e.currentPipeline.status==="completed"?"success":"active",size:"small"},null,8,["percent","status"])]),_:1},8,["label"]),i(E,{label:t.$t("pipeline.details.createdAt")},{default:n(()=>[f(p(e.formatPipelineTime(e.currentPipeline.createdAt)),1)]),_:1},8,["label"]),i(E,{label:t.$t("pipeline.details.startedAt")},{default:n(()=>[f(p(e.formatPipelineTime(e.currentPipeline.startedAt)),1)]),_:1},8,["label"])]),_:1}),v("h4",bt,p(t.$t("pipeline.details.stagesHeader")),1),i(ae,{mode:"left"},{default:n(()=>[(r(!0),b(x,null,F(e.currentPipeline.stages,l=>(r(),g(le,{key:l.id,color:e.timelineColor(l.status)},{dot:n(()=>[l.status==="completed"?(r(),g(e.CheckCircleOutlined,{key:0,style:{color:"#52c41a"}})):l.status==="running"?(r(),g(e.LoadingOutlined,{key:1,style:{color:"#1677ff"}})):l.status==="failed"?(r(),g(e.CloseCircleOutlined,{key:2,style:{color:"#ff4d4f"}})):l.status==="gate-waiting"?(r(),g(e.LockOutlined,{key:3,style:{color:"#faad14"}})):(r(),g(e.ClockCircleOutlined,{key:4,style:{color:"var(--text-muted)"}}))]),default:n(()=>[v("div",_t,[v("span",vt,p(l.stageIndex+1)+". "+p(e.stageLabel(l.name)),1),i(S,{color:e.stageStatusColor(l.status),style:{"font-size":"11px"}},{default:n(()=>[f(p(e.stageStatusLabel(l.status)),1)]),_:2},1032,["color"]),l.gateRequired?(r(),g(S,{key:0,color:"gold",style:{"font-size":"10px"}},{default:n(()=>[i(e.LockOutlined),f(" "+p(t.$t("pipeline.details.needsApproval"))+" ",1),l.gateApproved?(r(),b("span",kt,p(t.$t("pipeline.details.approved")),1)):d("v-if",!0)]),_:2},1024)):d("v-if",!0)]),l.errorMessage?(r(),b("div",St,p(t.$t("pipeline.details.errorPrefix"))+" "+p(l.errorMessage),1)):d("v-if",!0),l.startedAt?(r(),b("div",At,[f(p(e.formatPipelineTime(l.startedAt))+" ",1),l.completedAt?(r(),b("span",Ct," → "+p(e.formatPipelineTime(l.completedAt)),1)):d("v-if",!0)])):d("v-if",!0)]),_:2},1032,["color"]))),128))]),_:1})])):d("v-if",!0)]),_:1},8,["open","title"])])}const Ot=Le($e,[["render",Pt],["__scopeId","data-v-ee23c547"],["__file","/tmp/cc-web-panel-XqKUIo/repo/packages/web-panel/src/views/Pipeline.vue"]]);export{Ot as default};
|