chainlesschain 0.162.177 → 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-DT-VPWuN.js → AIOps-DRftcSue.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-DyOreOVN.js → ActionButton-BFvUaMKR.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-DslNsKux.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-DoaAtEcY.js → Artifacts-DAJ8B3Un.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-DPG3WdJ9.js → Audit-hOk4L1lr.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-C_JO6R5G.js → BackgroundAgents-3pbDpM9z.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-Cv3BooyX.js → Backup-BtziGDn9.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-D2uQXWu-.js → BaseInput-kmshphJ3.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-B4Vczyf3.js → Chat-d7tGSosA.js} +5 -5
- package/src/assets/web-panel/assets/ChatBubbleRenderer-p-_PBpX_.js +1 -0
- package/src/assets/web-panel/assets/{Checkbox-qTgk4VeP.js → Checkbox-C4Eh4Tz5.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-DlLWcIzj.js → Codegen-r7gmhZyA.js} +1 -1
- package/src/assets/web-panel/assets/{Col-DNO73qp7.js → Col-U7mDaGlL.js} +1 -1
- package/src/assets/web-panel/assets/{Community-vRDNpc4j.js → Community-Bpu8aH1T.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-CEWtIXni.js → Compact-CHb2XBJe.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-KgYC9Fxi.js → Compliance-Cn_r4dey.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-zj5wvkpT.js → Cowork-CdMWfDcz.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-BLDoCozU.js → Cron-BtnREHWy.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-BYnff4VY.js → Crosschain-BKI9TSzr.js} +1 -1
- package/src/assets/web-panel/assets/{DID-C75VFsVm.js → DID-pkNubzzJ.js} +2 -2
- package/src/assets/web-panel/assets/Dashboard-1rrz1snN.js +3 -0
- package/src/assets/web-panel/assets/{Dropdown-B5dbO4Kx.js → Dropdown-DLyFVxDc.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-BDipZtHJ.js → EmailListRenderer-CtUWfYVq.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-DmIzt8jj.js → FamilyGuardDashboard-B8eX2Qe4.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-D9QOS-uW.js → Federation-D8lsDGus.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-B47HRwAm.js → FormItemContext-CRYt_aIw.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-3R4mXmgV.js → GenericCardRenderer-ClKzY8_N.js} +1 -1
- package/src/assets/web-panel/assets/{Git-DrNXZf1C.js → Git-BXj5Dney.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-BGd7JR98.js → Governance-Cm-I8RMz.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-D-2he1ed.js → Inference-CPvbhvgt.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-C0sHIbK5.js → KnowledgeGraph-sYNDZaoi.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-DiBQO-jL.js → Logs-BZY_3CRZ.js} +2 -2
- package/src/assets/web-panel/assets/{MarkdownRenderer-DL_5eV2D.js → MarkdownRenderer-up0BW6pv.js} +1 -1
- package/src/assets/web-panel/assets/{Marketplace-VR59OdrC.js → Marketplace-C5MEJ2Qe.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-DrPzwSd3.js → McpTools-ihdrn43I.js} +5 -5
- package/src/assets/web-panel/assets/{Memory-CBgKALwQ.js → Memory-Br8bPMlh.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-pQ9Tn-Mn.js → MobileBridge-BNntgrYW.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-mASB6jyj.js → MobileProjects-BdV915mw.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-DTMgE7HC.js → Mtc-A3wDmlqL.js} +2 -2
- package/src/assets/web-panel/assets/{MtcAudit-CwTnCtiL.js → MtcAudit-CF-mBLWM.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-ngm6WU8f.js → Multisig-Iy2k_MSo.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-4YO4Qww9.js → NLProgramming-kk0W7HUb.js} +1 -1
- package/src/assets/web-panel/assets/Notes-B5u5t_4S.js +7 -0
- package/src/assets/web-panel/assets/{NotificationSettings-r2H8yPKb.js → NotificationSettings-BN0POf6_.js} +1 -1
- package/src/assets/web-panel/assets/OrderTableRenderer-CHkSUrXB.js +1 -0
- package/src/assets/web-panel/assets/{Organization-DrO7jRWS.js → Organization-DwWQESuN.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-Cnwu4i4t.js → Overflow-DG6klrcC.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-zi-cDwA_.js → P2P-BwJcKkgZ.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-DBEryDv7.js → PdhVaultBrowser-BwOHG0in.js} +5 -5
- package/src/assets/web-panel/assets/{Permissions-lqXK2C3x.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-Kep5KAGW.js → Pipeline-BzJfeoGt.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-CHdvOAh1.js → Privacy-DLh3Bblx.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-BhKfdwe9.js → ProjectInit-USVWW36c.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-Yavk9K8A.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-Bfym6SQn.js → Providers-CBPWWzpu.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-CLSQcrlR.js → QrScannerModal-QVwoRUq3.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-VPa2WKQN.js → QuickAsk-CXnR-2Vn.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-CGXR8jVU.js → Recommend-ClaNzjmF.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-C_20YfMB.js → RemoteSession-C3rGw8vJ.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-awZh68UV.js → Reputation-Ci-OWAoP.js} +1 -1
- package/src/assets/web-panel/assets/{Row-Ctb4oiYN.js → Row-DRhAwXOS.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-D3sdjvUV.js → RssFeed-BQLJQ2_y.js} +3 -3
- package/src/assets/web-panel/assets/{Search-C-zfA4kT.js → Search-QQUpkfFd.js} +1 -1
- package/src/assets/web-panel/assets/{Security-D9XlmHA3.js → Security-DdXKzuKT.js} +4 -4
- package/src/assets/web-panel/assets/{Services-C3UKnr41.js → Services-x2Zh62Qd.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-BQxagZfF.js → Skeleton-GdY4KwRz.js} +1 -1
- package/src/assets/web-panel/assets/Skills-Bv4tY1Fd.js +1 -0
- package/src/assets/web-panel/assets/{Sla-DveENvek.js → Sla-C3QnM-11.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-BFjXLNgF.js → SpeechSettings-Bl3ytvmI.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-BpHgbaP9.js → SyncSettings-Wp9IwTsP.js} +2 -2
- package/src/assets/web-panel/assets/Tasks-CF3rIrDe.js +1 -0
- package/src/assets/web-panel/assets/{Templates-DEiaoyve.js → Templates-CGfvVVM9.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-ITg774nY.js → Tenant-CVXmwQ3U.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-D3ZBcvnb.js → Terminal-bvwrt03E.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-BsLU6JjU.js → TimelineRenderer-D0g74KhH.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-Cb5Pquc9.js → Tokens-BH4IwzlT.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-Dwfy-m9N.js → Trigger-DJOpM533.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-CnlSRGG0.js → Trust-B43EPRLr.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-Y4TlvKVo.js → UkeySign-BmBFG-em.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-BpKLtTTO.js → VideoEditing-n9oJwB8k.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-LLBzIq8x.js → Wallet-D5QeivHp.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-BeSRiusP.js → WebAuthn-DcNy7igO.js} +4 -4
- package/src/assets/web-panel/assets/{WorkflowEditor-BK_l1tXO.js → WorkflowEditor-BVjc7-5-.js} +1 -1
- package/src/assets/web-panel/assets/{chat-DYd-X7Wg.js → chat-Dy5Tfj3m.js} +1 -1
- package/src/assets/web-panel/assets/{colors-C9uip71j.js → colors-C4c2CNZU.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-JBrfjUP6.js → compact-item-DPa3O5vN.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-D03fbuiq.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-DLQOR6l-.js → hasIn-D41LVFkp.js} +1 -1
- package/src/assets/web-panel/assets/{index-rIxxfdTN.js → index-0oevYjfT.js} +1 -1
- package/src/assets/web-panel/assets/{index-CChaISMb.js → index-388pLGJ1.js} +1 -1
- package/src/assets/web-panel/assets/{index-BfOs_bmg.js → index-B8nLBZbv.js} +3 -3
- package/src/assets/web-panel/assets/{index-D-1SqEpQ.js → index-BPTGAjee.js} +1 -1
- package/src/assets/web-panel/assets/{index-BYv-LWdy.js → index-BPtrOBmW.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cpn19c9k.js → index-BQiIxHBy.js} +1 -1
- package/src/assets/web-panel/assets/{index-BpYKLrUT.js → index-BSM1cHVK.js} +1 -1
- package/src/assets/web-panel/assets/{index-CS63r8h3.js → index-BYPr9fkz.js} +1 -1
- package/src/assets/web-panel/assets/{index-Q7mmL6w4.js → index-BsQ7Ev6i.js} +1 -1
- package/src/assets/web-panel/assets/{index-SO6lgMg0.js → index-Btk9qLL2.js} +1 -1
- package/src/assets/web-panel/assets/{index-iahNhZwm.js → index-BvmziZSG.js} +1 -1
- package/src/assets/web-panel/assets/{index-BnQgRjsm.js → index-BvopLC_T.js} +1 -1
- package/src/assets/web-panel/assets/{index-Ba-Ps_AJ.js → index-C7xhTVyP.js} +1 -1
- package/src/assets/web-panel/assets/{index-BuNFCZCx.js → index-CNk_ZooP.js} +1 -1
- package/src/assets/web-panel/assets/{index-CL0ixCxk.js → index-CQrEHoOG.js} +1 -1
- package/src/assets/web-panel/assets/{index-CChQBM1d.js → index-CSxex23J.js} +1 -1
- package/src/assets/web-panel/assets/{index-5YN7F5bO.js → index-CVjgm992.js} +1 -1
- package/src/assets/web-panel/assets/{index-CwoDpKzW.js → index-CWK4zOPe.js} +1 -1
- package/src/assets/web-panel/assets/{index-BcBZwlnG.js → index-CX0VsoP4.js} +1 -1
- package/src/assets/web-panel/assets/{index-B46YcgsV.js → index-CXl0YPNG.js} +1 -1
- package/src/assets/web-panel/assets/{index-l08afIbV.js → index-Cip7LWml.js} +1 -1
- package/src/assets/web-panel/assets/{index-6GuLRpBQ.js → index-Cq_hlWNt.js} +1 -1
- package/src/assets/web-panel/assets/{index-DYLZY4uh.js → index-CzZ49YZL.js} +1 -1
- package/src/assets/web-panel/assets/{index-B0X76LjX.js → index-D2Nkivlm.js} +1 -1
- package/src/assets/web-panel/assets/{index-BdH9l8wl.js → index-DBUgRs4D.js} +1 -1
- package/src/assets/web-panel/assets/index-DEjVkdzq.js +1 -0
- package/src/assets/web-panel/assets/{index-D4UY5Z60.js → index-DNsBj2Ob.js} +1 -1
- package/src/assets/web-panel/assets/{index-Ce0Bf1YF.js → index-Di4X8cfI.js} +1 -1
- package/src/assets/web-panel/assets/{index-ByHO3SqZ.js → index-DljFsVGI.js} +1 -1
- package/src/assets/web-panel/assets/{index-C2zmOsyD.js → index-Korc3QIe.js} +1 -1
- package/src/assets/web-panel/assets/index-LMOc5xrS.js +1 -0
- package/src/assets/web-panel/assets/{index-BNCdRmWf.js → index-MKZDje0H.js} +1 -1
- package/src/assets/web-panel/assets/{index-D8KvuDz0.js → index-OHAfRu_3.js} +1 -1
- package/src/assets/web-panel/assets/{index-DaokIHt3.js → index-WEJr8PL5.js} +1 -1
- package/src/assets/web-panel/assets/{index-CILVyK3b.js → index-WinCp6du.js} +1 -1
- package/src/assets/web-panel/assets/{index-CVZWiUE_.js → index-Yjr6cqSK.js} +1 -1
- package/src/assets/web-panel/assets/{index-CqWk1FLG.js → index-iQ6gtFih.js} +1 -1
- package/src/assets/web-panel/assets/{index-DNMAAUVk.js → index-pt3s7yvV.js} +1 -1
- package/src/assets/web-panel/assets/{index-Ck17i0OD.js → index-tQ3igERQ.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-CG9z1c6w.js → initDefaultProps-BFZu87WZ.js} +1 -1
- package/src/assets/web-panel/assets/{motion-B1Ky7Zff.js → motion-DJIo7qvt.js} +1 -1
- package/src/assets/web-panel/assets/{move-DME8X2P1.js → move-Cfr5qknL.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-cuJYSWB7.js → mtc-parser-Bgc-OadH.js} +1 -1
- package/src/assets/web-panel/assets/{omit-UI_EE0uZ.js → omit-X3WI-TNp.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-BIoE_Z_V.js → pickAttrs-pJhU9IxK.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-B48-9HKN.js → placementArrow-BNg_Vj3T.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-D7x_GDgD.js → responsiveObserve-TeSEGQ5-.js} +1 -1
- package/src/assets/web-panel/assets/{slide-DjzC5_7m.js → slide-D_t_P0bv.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-C6BIymhh.js → statusUtils-DrrIMwAT.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-B4dGrdD9.js → styleChecker-BjZCuFRm.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-Bken4aNE.js → useFlexGapSupport-rTFdlqdQ.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-BMlqECqv.js → useFs-BidCpfLX.js} +1 -1
- package/src/assets/web-panel/assets/usePersonalDataHub-C5mHttA9.js +1 -0
- package/src/assets/web-panel/assets/{vnode-CKJQmxa0.js → vnode-BrbcRiHZ.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-CaZunuau.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/background-session.js +5 -2
- package/src/commands/context.js +33 -1
- package/src/commands/hub.js +473 -39
- package/src/commands/init.js +212 -110
- package/src/commands/llm.js +22 -6
- package/src/commands/skill.js +11 -1
- package/src/data/changelog.json +76 -270
- package/src/gateways/ws/personal-data-hub-protocol.js +22 -2
- package/src/harness/golden-transcript.js +3 -0
- package/src/index.js +18 -7
- package/src/lib/approval-authority-store.js +891 -0
- package/src/lib/background-interaction-resolver.js +399 -54
- package/src/lib/background-session-transport.js +3 -1
- package/src/lib/context-breakdown.js +82 -3
- 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/hooks-v2-producers.js +33 -8
- package/src/lib/hooks-v2-runtime.js +360 -40
- package/src/lib/interaction-adapter.js +66 -0
- package/src/lib/operation-fingerprint.js +107 -2
- package/src/lib/pdh-dedicated-batch-collectors.js +124 -0
- package/src/lib/personal-data-hub-wiring.js +327 -52
- 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/side-effect-ledger-store.js +65 -14
- package/src/lib/skill-loader.js +215 -12
- package/src/lib/skill-process-broker.js +15 -1
- 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 +40 -6
- package/src/repl/remote-approval.js +13 -13
- package/src/repl/repl-turn-binding.js +46 -16
- package/src/runtime/agent-core.js +286 -35
- package/src/runtime/coding-agent-contract-shared.cjs +16 -0
- package/src/runtime/headless-runner.js +147 -34
- package/src/runtime/headless-stream.js +147 -7
- package/src/workers/background-agent-worker.js +70 -38
- package/src/assets/web-panel/assets/AppLayout-BNJJAYME.js +0 -9
- package/src/assets/web-panel/assets/ChatBubbleRenderer-DE6reP99.js +0 -1
- package/src/assets/web-panel/assets/Dashboard-C4Gutni2.js +0 -3
- package/src/assets/web-panel/assets/Notes-DP1k45mF.js +0 -7
- package/src/assets/web-panel/assets/OrderTableRenderer-CoM_Zw0J.js +0 -1
- package/src/assets/web-panel/assets/PersonalDataHub-b63T3HJM.js +0 -9
- package/src/assets/web-panel/assets/Projects-CN8E_5Mq.js +0 -1
- package/src/assets/web-panel/assets/Skills-q6eb6KPZ.js +0 -1
- package/src/assets/web-panel/assets/Tasks-DvepRb8-.js +0 -1
- package/src/assets/web-panel/assets/devWarning-B8LQ8leS.js +0 -1
- package/src/assets/web-panel/assets/index-Bh8BPtqR.js +0 -1
- package/src/assets/web-panel/assets/index-CeVrHLzZ.js +0 -1
- package/src/assets/web-panel/assets/usePersonalDataHub-DLdrfmMa.js +0 -1
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import{I as v,P as l,S as A,K as a,c as n,J as p,U as m,F as W,Z as ae,_ as it,R as s,Q as i,V as d,a2 as rt,w as _e,b as ee,a as $,r as C,a5 as qt,o as $e,a1 as Vt,a0 as Qt}from"./vendor-Bn1JzzAn.js";import{u as de}from"./usePersonalDataHub-DLdrfmMa.js";import{_ as Ie,d as g}from"./index-BfOs_bmg.js";import{aD as et,O as tt,aE as ot,aF as at,a1 as nt,aG as Gt,ag as Yt,p as jt,aC as Xt,W as Jt,e as Zt,aH as $t,aa as eo,am as to,ac as oo,n as ao,R as no}from"./icons-DG5UD-6K.js";const io={__name:"AIChatWizard",props:{open:{type:Boolean,default:!1},existingAccounts:{type:Array,default:()=>[]}},emits:["update:open","registered"],setup(ie,{expose:t,emit:h}){t();const e=ie,G=h,Y=[{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}],y=de(),I=C(1),_=C(null),O=C(""),P=C(null),U=C(null),F=C(null),D=$({open:!1,probe:!1,register:!1}),q=ee(()=>Y.find(w=>w.vendor===_.value)||{}),B=ee(()=>I.value===1?"选择一家 AI 服务商":I.value===2?P.value?.fallbackMode==="paste"?"在外部浏览器登录,把 cookie 粘贴到下面":"在内嵌浏览器登录,主进程自动读取 cookie":"校验并写入本地加密 vault"),N=ee(()=>{const w=U.value;return w?w.reason==="UNKNOWN_VENDOR"?"未知厂商 — 请刷新页面或重选":w.reason==="PASTE_REQUIRED"?"请先粘贴 cookie 字符串":w.missingRequired?.length?`缺关键 cookie: ${w.missingRequired.join(", ")}`:w.reason||"cookie 校验失败":""}),j=ee(()=>{const w=F.value;return w?w.reason==="REQUIRED_COOKIES_MISSING"?`缺关键 cookie: ${(w.missingRequired||[]).join(", ")}`:w.reason==="VALIDATE_COOKIE_FAILED"?"厂商拒绝该 cookie(可能已过期或被风控)":w.reason==="ADAPTER_THREW"?`Adapter 抛错: ${w.error||"网络错误"}`:w.reason==="UNKNOWN_VENDOR"?"未知厂商":w.reason||"注册失败":"未知错误"});function R(w){return e.existingAccounts.some(L=>L&&L.vendor===w)}function E(w){return e.existingAccounts.find(L=>L&&L.vendor===w)||null}function re(w){const L=E(w);return L?L.lastHealth?L.lastHealth.ok?"ok":L.lastHealth.reason==="SPEC_VERSION_MISMATCH"?"mismatch":"fail":"unknown":null}function T(w){const L=E(w);if(!L||!L.lastHealth||L.lastHealth.ok)return"";const Q=L.lastHealth.reason;return Q?Q==="SPEC_VERSION_MISMATCH"?"cookie 规格已升级,请重新登录":Q==="ADAPTER_THREW"?"上次校验抛错,建议稍后重试":Q==="COOKIE_EXPIRED"?"Cookie 已过期,请重新登录":Q:"Cookie 校验失败,建议重新登录"}async function oe(w){try{(await y.unregisterAichat(w))?.ok&&G("registered",{vendor:w,accountId:null,unregistered:!0})}catch(L){F.value={ok:!1,reason:L?.message||"UNREGISTER_FAILED"}}}function M(w){_.value=w}async function V(){if(_.value){D.open=!0,P.value=null,U.value=null,O.value="";try{if(P.value=await y.openAichatLogin(_.value),!P.value?.ok)return;I.value=2}catch(w){P.value={ok:!1,reason:w?.message||"OPEN_FAILED"}}finally{D.open=!1}}}async function le(){D.probe=!0,U.value=null;try{const w=O.value.trim(),L=w||void 0;U.value=await y.probeAichatCookies(_.value,L)}catch(w){U.value={ok:!1,reason:w?.message||"PROBE_FAILED"}}finally{D.probe=!1}}async function K(){if(U.value?.ok){D.register=!0;try{F.value=await y.registerAichatVendor(_.value,U.value.cookies),I.value=3,F.value?.ok&&G("registered",{vendor:_.value,accountId:F.value.accountId})}catch(w){F.value={ok:!1,reason:w?.message||"REGISTER_FAILED"},I.value=3}finally{D.register=!1}}}function X(){I.value=1,_.value=null,O.value="",P.value=null,U.value=null,F.value=null}function ne(){X(),G("update:open",!1)}_e(()=>e.open,w=>{w&&X()});const se={props:e,emit:G,vendors:Y,hub:y,step:I,selectedVendor:_,cookieHeader:O,openResult:P,probeResult:U,registerResult:F,loading:D,currentVendorMeta:q,stepDescription:B,probeFailMessage:N,registerFailMessage:j,isRegistered:R,_entry:E,healthOf:re,healthReasonOf:T,onUnregister:oe,pickVendor:M,startLoginFlow:V,runProbe:le,runRegister:K,restartFlow:X,resetWizard:ne,ref:C,reactive:$,computed:ee,watch:_e,get usePersonalDataHub(){return de}};return Object.defineProperty(se,"__isScriptSetup",{enumerable:!1,value:!0}),se}},ro={key:0},lo={class:"vendor-head"},so={class:"hint"},uo={class:"hint",style:{"margin-top":"4px"}},co={key:0,class:"hint",style:{"margin-top":"4px",color:"#ff4d4f"}},fo={key:1},mo={class:"hint"},go=["href"],po={class:"howto"},yo=["href"],vo={key:3,style:{"margin-top":"8px"}},_o={key:2,class:"kv",style:{"margin-top":"4px"}},ko={key:3,class:"kv",style:{"margin-top":"4px",color:"#ff4d4f"}},bo={key:2};function Ao(ie,t,h,e,G,Y){const y=v("a-alert"),I=v("a-tag"),_=v("a-button"),O=v("a-popconfirm"),P=v("a-card"),U=v("a-col"),F=v("a-row"),D=v("a-collapse-panel"),q=v("a-collapse"),B=v("a-textarea"),N=v("a-form-item"),j=v("a-form"),R=v("a-result"),E=v("a-space"),re=v("a-drawer");return l(),A(re,{open:h.open,title:"添加 AI 对话账号",placement:"right",width:640,"destroy-on-close":!0,"onUpdate:open":t[4]||(t[4]=T=>e.emit("update:open",T)),onClose:e.resetWizard},{footer:a(()=>[n(E,{style:{float:"right"}},{default:a(()=>[e.step>1&&e.step<3?(l(),A(_,{key:0,onClick:t[3]||(t[3]=T=>e.step=e.step-1)},{default:a(()=>[...t[22]||(t[22]=[i("上一步",-1)])]),_:1})):d("v-if",!0),n(_,{onClick:e.resetWizard},{default:a(()=>[...t[23]||(t[23]=[i("取消",-1)])]),_:1}),e.step===1?(l(),A(_,{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"])):d("v-if",!0),e.step===2&&e.openResult?.fallbackMode==="paste"?(l(),A(_,{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"])):d("v-if",!0),e.step===2&&e.openResult?.fallbackMode!=="paste"?(l(),A(_,{key:3,loading:e.loading.probe,onClick:e.runProbe},{default:a(()=>[...t[26]||(t[26]=[i(" 检测 cookie ",-1)])]),_:1},8,["loading"])):d("v-if",!0),e.step===2?(l(),A(_,{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"])):d("v-if",!0)]),_:1})]),default:a(()=>[n(y,{message:`第 ${e.step} / 3 步`,description:e.stepDescription,type:"info","show-icon":"",style:{"margin-bottom":"16px"}},null,8,["message","description"]),e.step===1?(l(),p("div",ro,[t[10]||(t[10]=m("p",{class:"hint"}," 选择要接入的 AI 服务商。登录后将本地读取 cookie 同步对话历史;cookie 仅落本机加密文件,不上传任何云端。 ",-1)),n(F,{gutter:[12,12]},{default:a(()=>[(l(),p(W,null,ae(e.vendors,T=>n(U,{xs:24,sm:12,md:8,key:T.vendor},{default:a(()=>[n(P,{size:"small",hoverable:"",class:it(["vendor-card",{selected:e.selectedVendor===T.vendor}]),onClick:oe=>e.pickVendor(T.vendor)},{default:a(()=>[m("div",lo,[m("strong",null,s(T.displayName),1),e.healthOf(T.vendor)==="fail"?(l(),A(I,{key:0,color:"red"},{default:a(()=>[...t[5]||(t[5]=[i("🔴 重新登录",-1)])]),_:1})):e.healthOf(T.vendor)==="mismatch"?(l(),A(I,{key:1,color:"orange"},{default:a(()=>[...t[6]||(t[6]=[i("⚠ 规格升级",-1)])]),_:1})):e.healthOf(T.vendor)==="unknown"?(l(),A(I,{key:2,color:"blue"},{default:a(()=>[...t[7]||(t[7]=[i("已接入·待巡检",-1)])]),_:1})):e.healthOf(T.vendor)==="ok"?(l(),A(I,{key:3,color:"green"},{default:a(()=>[...t[8]||(t[8]=[i("✓ 已接入",-1)])]),_:1})):d("v-if",!0)]),m("div",so,s(T.notes),1),m("div",uo,[n(I,{color:"default"},{default:a(()=>[i(s(T.requiredCookies.length)+" 必需 cookie",1)]),_:2},1024),n(I,{color:"default"},{default:a(()=>[i("过期约 "+s(T.cookieMaxAgeHintDays)+" 天",1)]),_:2},1024)]),e.isRegistered(T.vendor)&&e.healthReasonOf(T.vendor)?(l(),p("div",co,s(e.healthReasonOf(T.vendor)),1)):d("v-if",!0),e.isRegistered(T.vendor)?(l(),p("div",{key:1,class:"vendor-actions",onClick:t[0]||(t[0]=rt(()=>{},["stop"]))},[n(O,{title:"注销该 AI 对话来源?历史事件仍可在 vault 中查询。","ok-text":"注销","cancel-text":"取消",onConfirm:oe=>e.onUnregister(T.vendor)},{default:a(()=>[n(_,{size:"small",type:"text",danger:""},{default:a(()=>[...t[9]||(t[9]=[i("注销",-1)])]),_:1})]),_:1},8,["onConfirm"])])):d("v-if",!0)]),_:2},1032,["class","onClick"])]),_:2},1024)),64))]),_:1})])):d("v-if",!0),e.step===2&&e.openResult?(l(),p("div",fo,[m("p",mo,[m("strong",null,s(e.currentVendorMeta.displayName),1),t[11]||(t[11]=i(" · ",-1)),m("a",{href:e.openResult.loginUrl,target:"_blank",rel:"noopener noreferrer"},s(e.openResult.loginUrl),9,go)]),e.openResult.fallbackMode==="paste"?(l(),A(y,{key:0,message:e.openResult.helpText||"请在外部浏览器登录后从开发者工具复制全部 cookie 字符串粘贴到下方。",type:"warning","show-icon":"",style:{"margin-bottom":"12px"}},null,8,["message"])):(l(),A(y,{key:1,message:"桌面端:请在弹出的内嵌浏览器窗口登录后点击 “检测 cookie”。",type:"info","show-icon":"",style:{"margin-bottom":"12px"}})),e.openResult.fallbackMode==="paste"?(l(),A(q,{key:2,bordered:!1,style:{"margin-bottom":"12px"}},{default:a(()=>[n(D,{key:"howto",header:"如何获取 cookie 字符串?"},{default:a(()=>[m("ol",po,[m("li",null,[t[12]||(t[12]=i("用 Chrome / Edge 打开 ",-1)),m("a",{href:e.openResult.loginUrl,target:"_blank"},s(e.openResult.loginUrl),9,yo)]),t[13]||(t[13]=m("li",null,"完成登录,进入对话页",-1)),t[14]||(t[14]=m("li",null,[i("按 "),m("kbd",null,"F12"),i(" 打开开发者工具 → "),m("strong",null,"Application"),i(" → "),m("strong",null,"Cookies")],-1)),t[15]||(t[15]=m("li",null,"选中域名 → 全选所有 cookie 行 → 用扩展(如 EditThisCookie)导出 “name=value; …” 串",-1)),t[16]||(t[16]=m("li",null,[i("或在 Console 执行 "),m("code",null,"document.cookie"),i(" 复制结果(注意:HTTP-Only cookie 取不到,仍需 Application 面板)")],-1)),t[17]||(t[17]=m("li",null,"粘贴到下方文本框,点 “检测 cookie”",-1))])]),_:1})]),_:1})):d("v-if",!0),n(j,{layout:"vertical"},{default:a(()=>[n(N,{label:"Cookie 字符串"},{default:a(()=>[n(B,{value:e.cookieHeader,"onUpdate:value":t[1]||(t[1]=T=>e.cookieHeader=T),rows:6,placeholder:"name1=value1; name2=value2; name3=value3 …",autocomplete:"off"},null,8,["value"])]),_:1})]),_:1}),e.probeResult?(l(),p("div",vo,[e.probeResult.ok?(l(),A(y,{key:0,type:"success","show-icon":"",message:`已识别 ${e.probeResult.foundRequired.length} 个必需 cookie + ${e.probeResult.foundOptional.length} 个可选 cookie`},null,8,["message"])):(l(),A(y,{key:1,type:"error","show-icon":"",message:e.probeFailMessage},null,8,["message"])),e.probeResult.foundRequired?.length?(l(),p("div",_o," ✓ "+s(e.probeResult.foundRequired.join(", ")),1)):d("v-if",!0),e.probeResult.missingRequired?.length?(l(),p("div",ko," 缺失: "+s(e.probeResult.missingRequired.join(", ")),1)):d("v-if",!0)])):d("v-if",!0)])):d("v-if",!0),e.step===3?(l(),p("div",bo,[e.registerResult?.ok?(l(),A(R,{key:0,status:"success",title:`${e.currentVendorMeta.displayName} 已接入`,"sub-title":`accountId: ${e.registerResult.accountId} · userId: ${e.registerResult.validation?.userId||"匿名"}`},{extra:a(()=>[n(_,{type:"primary",onClick:e.resetWizard},{default:a(()=>[...t[18]||(t[18]=[i("完成",-1)])]),_:1}),n(_,{onClick:e.restartFlow},{default:a(()=>[...t[19]||(t[19]=[i("再加一家",-1)])]),_:1})]),_:1},8,["title","sub-title"])):(l(),A(R,{key:1,status:"error",title:"接入失败","sub-title":e.registerFailMessage},{extra:a(()=>[n(_,{type:"primary",onClick:t[2]||(t[2]=T=>e.step=2)},{default:a(()=>[...t[20]||(t[20]=[i("返回粘贴 cookie",-1)])]),_:1}),n(_,{onClick:e.restartFlow},{default:a(()=>[...t[21]||(t[21]=[i("选其他厂商",-1)])]),_:1})]),_:1},8,["sub-title"]))])):d("v-if",!0)]),_:1},8,["open"])}const ho=Ie(io,[["render",Ao],["__scopeId","data-v-4ed94be5"],["__file","/tmp/cc-web-panel-Egsevy/repo/packages/web-panel/src/components/AIChatWizard.vue"]]),wo={__name:"WechatWizard",props:{open:{type:Boolean,default:!1}},emits:["update:open","registered"],setup(ie,{expose:t,emit:h}){t();const e=ie,G=h,Y=de(),y=C(1),I=C(null),_=$({uin:"",dbPath:"",wechatDataPath:"",forceProvider:null}),O=C(null),P=$({probe:!1,register:!1}),U=ee(()=>y.value===1?"探测设备 + WeChat 版本,确认可用的 keyProvider":y.value===2?"填 UIN 与已 adb-pull 的本地路径":"bootstrap 注册 + 持久化 wechat-accounts.json"),F=ee(()=>{const R=O.value;return R?R.reason==="ENV_UNSUPPORTED"?R.message||"env-probe 拒绝 — 请回到第 1 步看 reasons":R.reason==="MD5_NEEDS_WECHAT_DATA_PATH"?"MD5 路径需要 wechatDataPath":R.reason==="FRIDA_NEEDS_WXID"?"Frida 路径需要 account.uin / wxid":R.reason==="ADAPTER_CTOR_FAILED"?`Adapter ctor 抛错: ${R.message||""}`:R.reason==="BOOTSTRAP_THREW"?`Bootstrap 抛错: ${R.message||""}`:R.reason==="UIN_REQUIRED"?"UIN 不能为空":R.message||R.reason||"注册失败":"未知错误"});async function D(){P.probe=!0;try{I.value=await Y.probeWechatEnv()}catch(R){I.value={ok:!1,suggestedKeyProvider:"unsupported",reasons:[R?.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{P.probe=!1}}async function q(){P.register=!0;try{O.value=await Y.registerWechat({account:{uin:_.uin},dbPath:_.dbPath||null,wechatDataPath:_.wechatDataPath||null,keyProviderOverride:_.forceProvider}),y.value=3,O.value?.ok&&G("registered",{uin:_.uin,chosenKeyProvider:O.value.chosenKeyProvider})}catch(R){O.value={ok:!1,reason:"BOOTSTRAP_THREW",message:R?.message||"RPC failed"},y.value=3}finally{P.register=!1}}function B(){y.value=1,I.value=null,_.uin="",_.dbPath="",_.wechatDataPath="",_.forceProvider=null,O.value=null}function N(){B(),G("update:open",!1)}_e(()=>e.open,R=>{R&&B()});const j={props:e,emit:G,hub:Y,step:y,probe:I,form:_,registerResult:O,loading:P,stepDescription:U,registerFailMessage:F,runProbe:D,runRegister:q,restartFlow:B,resetWizard:N,ref:C,reactive:$,computed:ee,watch:_e,get usePersonalDataHub(){return de}};return Object.defineProperty(j,"__isScriptSetup",{enumerable:!1,value:!0}),j}},Oo={key:0},Co={key:0,class:"probe-result"},So={key:0,class:"kv"},Do={key:0,class:"kv"},Io={key:1},Eo={key:2},Po={key:2,style:{"margin-top":"12px"}};function Ro(ie,t,h,e,G,Y){const y=v("a-alert"),I=v("a-button"),_=v("a-tag"),O=v("a-descriptions-item"),P=v("a-descriptions"),U=v("a-input"),F=v("a-form-item"),D=v("a-radio"),q=v("a-radio-group"),B=v("a-form"),N=v("a-result"),j=v("a-space"),R=v("a-drawer");return l(),A(R,{open:h.open,title:"添加 WeChat 账号",placement:"right",width:640,"destroy-on-close":!0,"onUpdate:open":t[8]||(t[8]=E=>e.emit("update:open",E)),onClose:e.resetWizard},{footer:a(()=>[n(j,{style:{float:"right"}},{default:a(()=>[e.step>1&&e.step<3?(l(),A(I,{key:0,onClick:t[6]||(t[6]=E=>e.step=e.step-1)},{default:a(()=>[...t[21]||(t[21]=[i("上一步",-1)])]),_:1})):d("v-if",!0),n(I,{onClick:e.resetWizard},{default:a(()=>[...t[22]||(t[22]=[i("取消",-1)])]),_:1}),e.step===1?(l(),A(I,{key:1,type:"primary",disabled:!e.probe||e.probe.suggestedKeyProvider==="unsupported",onClick:t[7]||(t[7]=E=>e.step=2)},{default:a(()=>[...t[23]||(t[23]=[i(" 下一步 ",-1)])]),_:1},8,["disabled"])):d("v-if",!0),e.step===2?(l(),A(I,{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"])):d("v-if",!0)]),_:1})]),default:a(()=>[n(y,{message:`第 ${e.step} / 3 步`,description:e.stepDescription,type:"info","show-icon":"",style:{"margin-bottom":"16px"}},null,8,["message","description"]),e.step===1?(l(),p("div",Oo,[t[11]||(t[11]=m("p",{class:"hint"},[i(" 请用 USB 连接 Android 设备(开启 USB 调试)。WeChat ≥ 8.0 需要 root + frida-server。 探测仅读取 "),m("code",null,"adb shell"),i(" 命令输出,不写入任何东西。 ")],-1)),n(I,{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?(l(),p("div",Co,[n(P,{column:1,size:"small",bordered:""},{default:a(()=>[n(O,{label:"suggestedKeyProvider"},{default:a(()=>[n(_,{color:e.probe.suggestedKeyProvider==="unsupported"?"red":"green"},{default:a(()=>[i(s(e.probe.suggestedKeyProvider),1)]),_:1},8,["color"])]),_:1}),n(O,{label:"adb 设备"},{default:a(()=>[n(_,{color:e.probe.device.reachable?"green":"red"},{default:a(()=>[i(s(e.probe.device.reachable?"已连接":"未连接"),1)]),_:1},8,["color"]),e.probe.device.serial?(l(),p("span",So,s(e.probe.device.serial)+" · abi="+s(e.probe.device.abi||"?"),1)):d("v-if",!0)]),_:1}),n(O,{label:"root"},{default:a(()=>[n(_,{color:e.probe.root.detected?"green":"default"},{default:a(()=>[i(s(e.probe.root.detected?"已 root":"未 root"),1)]),_:1},8,["color"]),e.probe.root.magiskInstalled?(l(),A(_,{key:0,color:"blue"},{default:a(()=>[...t[10]||(t[10]=[i("Magisk",-1)])]),_:1})):d("v-if",!0)]),_:1}),n(O,{label:"frida-server"},{default:a(()=>[n(_,{color:e.probe.frida.serverRunning?"green":"default"},{default:a(()=>[i(s(e.probe.frida.serverRunning?"运行中":"未运行"),1)]),_:1},8,["color"]),e.probe.frida.port?(l(),p("span",Do," :"+s(e.probe.frida.port),1)):d("v-if",!0)]),_:1}),n(O,{label:"WeChat"},{default:a(()=>[n(_,{color:e.probe.wechat.installed?"green":"red"},{default:a(()=>[i(s(e.probe.wechat.installed?e.probe.wechat.versionName:"未安装"),1)]),_:1},8,["color"])]),_:1})]),_:1}),(l(!0),p(W,null,ae(e.probe.reasons||[],E=>(l(),A(y,{key:E,message:E,type:"info","show-icon":"",style:{"margin-top":"8px"}},null,8,["message"]))),128)),(l(!0),p(W,null,ae(e.probe.warnings||[],E=>(l(),A(y,{key:E,message:E,type:"warning","show-icon":"",style:{"margin-top":"8px"}},null,8,["message"]))),128))])):d("v-if",!0)])):d("v-if",!0),e.step===2?(l(),p("div",Io,[t[16]||(t[16]=m("p",{class:"hint"},[i(" 填写从 adb pull 拉下来的本地路径。MD5 路径(7.x)需要 "),m("code",null,"wechatDataPath"),i("; Frida 路径(8.0+)需要设备运行 frida-server。 ")],-1)),n(B,{layout:"vertical"},{default:a(()=>[n(F,{label:"UIN / wxid",required:""},{default:a(()=>[n(U,{value:e.form.uin,"onUpdate:value":t[0]||(t[0]=E=>e.form.uin=E),placeholder:"WeChat 数字 UIN 或 wxid"},null,8,["value"])]),_:1}),n(F,{label:"dbPath(已拉下的 EnMicroMsg.db 本地路径)"},{default:a(()=>[n(U,{value:e.form.dbPath,"onUpdate:value":t[1]||(t[1]=E=>e.form.dbPath=E),placeholder:"C:\\\\users\\\\me\\\\pull\\\\EnMicroMsg.db"},null,8,["value"])]),_:1}),n(F,{label:"wechatDataPath(已拉下的 /data/data/com.tencent.mm/ 目录)"},{default:a(()=>[n(U,{value:e.form.wechatDataPath,"onUpdate:value":t[2]||(t[2]=E=>e.form.wechatDataPath=E),placeholder:"C:\\\\users\\\\me\\\\pull\\\\com.tencent.mm"},null,8,["value"]),t[12]||(t[12]=m("div",{class:"hint"},"MD5 路径必填;Frida 路径可空",-1))]),_:1}),n(F,{label:"强制 keyProvider(覆盖 env-probe 建议)"},{default:a(()=>[n(q,{value:e.form.forceProvider,"onUpdate:value":t[3]||(t[3]=E=>e.form.forceProvider=E)},{default:a(()=>[n(D,{value:null},{default:a(()=>[...t[13]||(t[13]=[i("自动(推荐)",-1)])]),_:1}),n(D,{value:"md5"},{default:a(()=>[...t[14]||(t[14]=[i("md5",-1)])]),_:1}),n(D,{value:"frida"},{default:a(()=>[...t[15]||(t[15]=[i("frida",-1)])]),_:1})]),_:1},8,["value"])]),_:1})]),_:1})])):d("v-if",!0),e.step===3?(l(),p("div",Eo,[e.registerResult?.ok?(l(),A(N,{key:0,status:"success",title:`WeChat 已接入 (uin=${e.form.uin})`,"sub-title":`provider=${e.registerResult.chosenKeyProvider} · sensitivity=${e.registerResult.sensitivity}`},{extra:a(()=>[n(I,{type:"primary",onClick:e.resetWizard},{default:a(()=>[...t[17]||(t[17]=[i("完成",-1)])]),_:1}),n(I,{onClick:e.restartFlow},{default:a(()=>[...t[18]||(t[18]=[i("再加一个",-1)])]),_:1})]),_:1},8,["title","sub-title"])):(l(),A(N,{key:1,status:"error",title:"接入失败","sub-title":e.registerFailMessage},qt({_:2},[e.registerResult?.probe?.reasons?.length?{name:"extra",fn:a(()=>[n(I,{onClick:t[4]||(t[4]=E=>e.step=1)},{default:a(()=>[...t[19]||(t[19]=[i("返回检查环境",-1)])]),_:1}),n(I,{onClick:t[5]||(t[5]=E=>e.step=2)},{default:a(()=>[...t[20]||(t[20]=[i("返回修改路径",-1)])]),_:1})]),key:"0"}:void 0]),1032,["sub-title"])),e.registerResult?.probe?.reasons?.length?(l(),p("div",Po,[(l(!0),p(W,null,ae(e.registerResult.probe.reasons,E=>(l(),A(y,{key:E,message:E,type:"warning","show-icon":"",style:{"margin-bottom":"4px"}},null,8,["message"]))),128))])):d("v-if",!0)])):d("v-if",!0)]),_:1},8,["open"])}const xo=Ie(wo,[["render",Ro],["__scopeId","data-v-2f50c8a7"],["__file","/tmp/cc-web-panel-Egsevy/repo/packages/web-panel/src/components/WechatWizard.vue"]]),De="pdh.syncIncludeOptions.v1",To={__name:"PersonalDataHub",setup(ie,{expose:t}){const h=de(),e=C(null),G=C(null),Y=C([]),y=C({}),I=C(""),_=C(null),O=C(""),P=C(!1),U=C(!1),F=C([]),D=C(null),q={"system-data-android":{contacts:!0,apps:!0,sms:!0,calls:!0}};function B(){try{const o=localStorage.getItem(De);if(!o)return JSON.parse(JSON.stringify(q));const c=JSON.parse(o);return{"system-data-android":{...q["system-data-android"],...c["system-data-android"]||{}}}}catch{return JSON.parse(JSON.stringify(q))}}const N=$(B());function j(){try{localStorage.setItem(De,JSON.stringify(N)),console.log("[PDH-include] persisted:",JSON.stringify(N))}catch(o){console.warn("[PDH-include] persist failed:",o&&o.message)}}const R=C({}),E={"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 re(o){return Object.prototype.hasOwnProperty.call(E,o)}function T(o,c,u){const f=u&&u.target?!!u.target.checked:!!u;console.log("[PDH-include] toggle",o,c,"=>",f),N[o]||(N[o]={}),N[o][c]=f,j()}const oe=C(!1),M=$({provider:"qq",email:"",authCode:"",host:"",port:993,pdfPasswordHints:{idCardLast6:"",phoneLast6:"",cardLast6:""}}),V=C(null),le=C(!1),K=C(null),X=C([]),ne=C(null),se=[{name:"analysis.spending",label:"消费分析",icon:et,description:"总支出 / 商家排行 / 月度趋势"},{name:"analysis.relations",label:"人际关系",icon:tt,description:"与每个人的互动频率 / 主动比例"},{name:"analysis.footprint",label:"足迹",icon:ot,description:"常去地点 / 出行模式"},{name:"analysis.interests",label:"兴趣画像",icon:at,description:"从购买 / 浏览 / 收藏抽兴趣"},{name:"analysis.timeline",label:"时间线",icon:nt,description:"跨源事件串成故事"}],w=C(!1),L=C([]),Q=$({queue:{pending:0},mergeGroups:0,reviewQueue:0}),ke=C(!1),me=C([]);function ge(o){o?.unregistered?g.success(`已注销 ${o.vendor}`):g.success(`已接入 ${o.vendor}`),z()}const pe=C(!1);function be(o){g.success(`WeChat 已接入 (uin=${o.uin}, provider=${o.chosenKeyProvider})`),z()}const Ae=C(!1),r=$({email:"",zipPassword:"",filePath:""}),k=C(null),S=$({active:!1,adapter:"",phase:"",mailbox:"",current:0,total:0,attempt:1,errorMessage:""}),b=$({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}),Ee=C(null);function he(o){switch(o){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 Pe(o){switch(o){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 Re(o){switch(o){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 xe(o){switch(o){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 lt(){if(!b.xhsAdbSync){b.xhsAdbSync=!0;try{const o=await h.xhsAdbSync({});if(!o||!o.ok){const x=o&&o.reason||"SYNC_FAILED",H=xe(x),J=o&&o.message||"";g.error({content:`Xhs ADB 同步失败:${H}`,description:J,duration:8});return}const c=o.report||{},u=c.xhs||{},f=u.eventCounts||{};u.meFetchFailed?g.warning({content:"Xhs 同步未拉到 user_id — /user/me 返空 data",description:`lastErrorCode=${u.lastErrorCode}, ${u.lastErrorMessage||""}。可能 cookie 已过期或 web_session 缺失,请在手机重新登录。`,duration:10}):u.lastErrorCode===461?g.warning({content:"Xhs X-S 签名被拒 (461) — 部分接口未抓到",description:`命中 ${f.total||0} events。我们的 X-S 算法 best-effort (~60% GET / <30% POST hit),461 在 POST 较常见。稍后重试 (X-S 算法可能 4-8 周 rotate)。`,duration:10}):u.lastErrorCode?g.warning({content:`Xhs 同步部分完成 (${f.total||0} events)`,description:`lastErrorCode=${u.lastErrorCode}, ${u.lastErrorMessage||""}`,duration:8}):g.success(`Xhs 同步成功:notes=${f.note||0} / liked=${f.liked||0} / follow=${f.follow||0} (total=${f.total||0})${u.nickname?" ["+u.nickname+"]":""}`),D.value=c,z()}catch(o){g.error({content:"Xhs ADB 同步异常",description:o&&o.message?o.message:String(o),duration:8})}finally{b.xhsAdbSync=!1}}}function Te(o){switch(o){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 st(){if(!b.toutiaoAdbSync){b.toutiaoAdbSync=!0;try{const o=await h.toutiaoAdbSync({});if(!o||!o.ok){const x=o&&o.reason||"SYNC_FAILED",H=Te(x),J=o&&o.message||"";g.error({content:`Toutiao ADB 同步失败:${H}`,description:J,duration:8});return}const c=o.report||{},u=c.toutiao||{},f=u.eventCounts||{};u.profileFetchFailed?g.warning({content:"Toutiao 同步未拉到 user_id — passport/info/v2 返失败",description:`lastErrorCode=${u.lastErrorCode}, ${u.lastErrorMessage||""}。可能 cookie 已过期或 sessionid 缺失,请在手机重新登录。`,duration:10}):u.signProviderUsed==="none"&&f.feed===0&&f.collection===0&&f.search===0?g.warning({content:`Toutiao 同步仅获取了 profile (${f.profile||0} event)`,description:"当前 web-shell 上下文不支持 _signature 签名(仅 desktop app 提供 ToutiaoSignBridge)。打开桌面 app 同步可获取 feed / collection / search。",duration:12}):u.lastErrorCode?g.warning({content:`Toutiao 同步部分完成 (${f.total||0} events)`,description:`lastErrorCode=${u.lastErrorCode}, ${u.lastErrorMessage||""}`,duration:8}):g.success(`Toutiao 同步成功:profile=${f.profile||0} / feed=${f.feed||0} / collection=${f.collection||0} / search=${f.search||0} (total=${f.total||0})${u.nickname?" ["+u.nickname+"]":""}`),D.value=c,z()}catch(o){g.error({content:"Toutiao ADB 同步异常",description:o&&o.message?o.message:String(o),duration:8})}finally{b.toutiaoAdbSync=!1}}}function Le(o){switch(o){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 dt(){if(!b.kuaishouAdbSync){b.kuaishouAdbSync=!0;try{const o=await h.kuaishouAdbSync({});if(!o||!o.ok){const x=o&&o.reason||"SYNC_FAILED",H=Le(x),J=o&&o.message||"";g.error({content:`Kuaishou ADB 同步失败:${H}`,description:J,duration:8});return}const c=o.report||{},u=c.kuaishou||{},f=u.eventCounts||{};u.profileFetchFailed?g.warning({content:"Kuaishou 同步 cookie 缺 api_ph payload",description:`lastErrorCode=${u.lastErrorCode}, ${u.lastErrorMessage||""}。可能 cookie 已过期或登录态不完整(仅有 userId 但没有 api_ph),请在手机重新登录。`,duration:10}):u.signProviderUsed==="none"&&f.watch===0&&f.collect===0&&f.search===0?g.warning({content:`Kuaishou 同步仅获取了 profile (${f.profile||0} event)`,description:"当前 web-shell 上下文不支持 __NS_sig3 签名(仅 desktop app 提供 KuaishouSignBridge)。打开桌面 app 同步可获取 watch / collect / search。",duration:12}):u.lastErrorCode?g.warning({content:`Kuaishou 同步部分完成 (${f.total||0} events)`,description:`lastErrorCode=${u.lastErrorCode}, ${u.lastErrorMessage||""}`,duration:8}):g.success(`Kuaishou 同步成功:profile=${f.profile||0} / watch=${f.watch||0} / collect=${f.collect||0} / search=${f.search||0} (total=${f.total||0})${u.nickname?" ["+u.nickname+"]":""}`),D.value=c,z()}catch(o){g.error({content:"Kuaishou ADB 同步异常",description:o&&o.message?o.message:String(o),duration:8})}finally{b.kuaishouAdbSync=!1}}}async function ut(){if(!b.bridgeDoctor){b.bridgeDoctor=!0;try{const o=await h.bridgeDoctor();if(!o||!o.ok){const te=o&&o.reason||"BRIDGE_DOCTOR_FAILED",Z=o&&o.message||"";te==="MODULE_LOAD_FAILED"?g.error({content:"Bridge doctor 不可用",description:"当前上下文不是 Electron desktop app(cli / web-shell-only 无 sign-bridge 模块)。请从桌面 app 运行此诊断。",duration:10}):g.error({content:`Bridge doctor 失败:${te}`,description:Z,duration:8});return}const c=o.results||{},u=["xhs","toutiao","kuaishou"],f=u.filter(te=>c[te]&&c[te].anyCandidatePresent).length,x=u.length,H=[];for(const te of u){const Z=c[te];if(!Z||!Z.ok){H.push(`${te}: ✗ ${Z&&Z.error?Z.error:"unknown error"}`);continue}const Se=Z.candidates||{},Je=Object.keys(Se).filter(Kt=>Se[Kt]===!0),Ze=Object.keys(Se).length,zt=Z.anyCandidatePresent?"✓":"⚠",Wt=Z.anyCandidatePresent?`${Je.length}/${Ze} candidate(s): ${Je.join(", ")}`:`0/${Ze} candidates (rotation? 需更新 buildSignScript)`;H.push(`${te}: ${zt} ${Wt} (warmUp=${Z.warmUpMs}ms, probe=${Z.probeMs}ms)`)}(f===x?g.success:f===0?g.error:g.warning)({content:`Bridge doctor: ${f}/${x} 平台签名可用`,description:H.join(`
|
|
2
|
-
`),duration:15}),Ee.value=o}catch(o){g.error({content:"Bridge doctor 异常",description:o&&o.message?o.message:String(o),duration:8})}finally{b.bridgeDoctor=!1}}}async function ct(){if(!b.weiboAdbSync){b.weiboAdbSync=!0;try{const o=await h.weiboAdbSync({});if(!o||!o.ok){const x=o&&o.reason||"SYNC_FAILED",H=Re(x),J=o&&o.message||"";g.error({content:`Weibo ADB 同步失败:${H}`,description:J,duration:8});return}const c=o.report||{},u=c.weibo||{},f=u.eventCounts||{};u.uidFetchFailed?g.warning({content:"Weibo 同步未拉到 UID — /api/config 返 login=false",description:`lastErrorCode=${u.lastErrorCode}, ${u.lastErrorMessage||""}。可能 cookie 已过期 (请在手机重新登录) 或微博触发 anti-bot redirect。事件数 0,未入 vault。`,duration:10}):u.lastErrorCode?g.warning({content:`Weibo 同步部分完成 (${f.total||0} events)`,description:`lastErrorCode=${u.lastErrorCode}, ${u.lastErrorMessage||""} — 部分接口受反爬限制,稍后重试可补齐`,duration:8}):g.success(`Weibo 同步成功:posts=${f.post||0} / fav=${f.favourite||0} / follow=${f.follow||0} (total=${f.total||0})`),D.value=c,z()}catch(o){g.error({content:"Weibo ADB 同步异常",description:o&&o.message?o.message:String(o),duration:8})}finally{b.weiboAdbSync=!1}}}async function ft(){if(!b.douyinAdbSync){b.douyinAdbSync=!0;try{const o=await h.douyinAdbSync({});if(!o||!o.ok){const H=o&&o.reason||"SYNC_FAILED",J=Pe(H),te=o&&o.message||"";g.error({content:`Douyin ADB 同步失败:${J}`,description:te,duration:8});return}const c=o.report||{},u=c.douyin||{},f=u.eventCounts||{},x=u.parserDiagnostic||{};if(!x.hadMsgTable&&!x.hadSimpleUserTable)g.warning({content:"Douyin 同步完成但 0 events",description:"msg 和 SIMPLE_USER 表都未在 IM 数据库中找到 — 抖音 App 版本可能用了不同 schema",duration:10});else if(!x.hadMsgTable||!x.hadSimpleUserTable){const H=[];x.hadMsgTable||H.push("msg (私信)"),x.hadSimpleUserTable||H.push("SIMPLE_USER (联系人)"),g.warning({content:`Douyin 部分同步:msg=${f.message||0} contacts=${f.contact||0}`,description:`${H.join("、")} 表未找到,未入库部分数据`,duration:8})}else g.success(`Douyin 同步成功:messages=${f.message||0} contacts=${f.contact||0} (total=${f.total||0})`);D.value=c,z()}catch(o){g.error({content:"Douyin ADB 同步异常",description:o&&o.message?o.message:String(o),duration:8})}finally{b.douyinAdbSync=!1}}}async function mt(){if(!b.bilibiliAdbDoctor){b.bilibiliAdbDoctor=!0;try{const o=await h.bilibiliAdbDoctor();if(!o||!o.ok){const u=o&&o.reason||"PROBE_FAILED",f=he(u),x=o&&o.message||"";g.error({content:`Bilibili 诊断失败:${f}`,description:x,duration:8});return}const c=o.cookieDiagnostic||{};c.hadEncrypted?g.warning({content:`Bilibili 环境就绪 (uid=${o.uid}) — 但发现 Keystore 加密 cookie`,description:`cookies 数=${c.cookieCount||"?"}; 部分行使用 Android Keystore 加密 (跳过)。可能是较新 Bilibili App + Android 14+。可继续同步,但可能数据不全。`,duration:10}):g.success(`Bilibili 环境就绪 — uid=${o.uid}, 找到 ${c.cookieCount||"?"} 个 cookie,可以同步`)}catch(o){g.error({content:"Bilibili 诊断异常",description:o&&o.message?o.message:String(o),duration:8})}finally{b.bilibiliAdbDoctor=!1}}}async function gt(){if(!b.bilibiliAdbSync){b.bilibiliAdbSync=!0;try{const o=await h.bilibiliAdbSync({});if(!o||!o.ok){const x=o&&o.reason||"SYNC_FAILED",H=he(x),J=o&&o.message||"";g.error({content:`Bilibili ADB 同步失败:${H}`,description:J,duration:8});return}const c=o.report||{},u=c.bilibili||{},f=u.eventCounts||{};u.lastErrorCode?g.warning({content:`Bilibili 同步部分完成 (${f.total||0} events)`,description:`lastErrorCode=${u.lastErrorCode}, ${u.lastErrorMessage||""} — 部分接口受反爬限制,稍后重试可补齐`,duration:8}):g.success(`Bilibili 同步成功:history=${f.history||0} / fav=${f.favourite||0} / dyn=${f.dynamic||0} / follow=${f.follow||0} (total=${f.total||0})`),D.value=c,z()}catch(o){g.error({content:"Bilibili ADB 同步异常",description:o&&o.message?o.message:String(o),duration:8})}finally{b.bilibiliAdbSync=!1}}}const pt=[{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 ye(o){return y.value[o]||null}const ue=C(!1),Me=C(null);function yt(o){const c=ye(o);Me.value=c||{name:o,status:"needs_setup",guide:null},ue.value=!0}const Ue={ready:"green",needs_setup:"orange",unavailable:"default",error:"red"};function vt(o){return Ue[o]||"default"}const Be={ready:"可采集",needs_setup:"待配置",unavailable:"不支持",error:"异常"};function _t(o){return o?Be[o.status]||o.status:"检测中"}const Ne={local:"本机直采",snapshot:"需手机采集",device:"需 root/本地解密",credential:"需登录授权",platform:"平台限制"};function kt(o){return Ne[o]||o||""}const Fe=new Set(["apple-health","alipay-bill","finance-alipay","netease-music","wechat-pc","qq-pc","dingtalk-pc","feishu-pc","social-douyin","messaging-telegram","messaging-whatsapp","travel-amap"]),He=new Set(["wechat-pc","qq-pc","dingtalk-pc","feishu-pc"]),ze=new Set(["weread"]);function we(o){return o?ze.has(o.name)?"cookie":Fe.has(o.name)?"file":o.category==="local"?"sync":"snapshot":"snapshot"}function bt(o){const c=we(o);return c==="file"?"📂 选择文件采集":c==="cookie"?"🔑 登录采集":c==="sync"?"⚡ 立即采集":"立即同步"}async function At(o){const c=ye(o),u=we(c);if(u==="file"){const f=await h.pickFile({title:`选择 ${c&&c.guide?c.guide.displayName:o} 的数据文件`});if(!f){g.info("已取消选择文件");return}let x;He.has(o)&&(x=window.prompt("如该数据库已解密为明文,直接确定即可;若为加密库请粘贴 64 位十六进制密钥:")||void 0),await Ke(o,f,x)}else if(u==="cookie"){const f=window.prompt("粘贴登录态 Cookie(在已登录的网页 DevTools → Application → Cookies 复制,或整条 Cookie 请求头):");if(!f||!f.trim()){g.info("已取消");return}await We(o,f.trim())}else await qe(o),ue.value=!1}async function We(o,c){b.sync[o]=!0,ce(o);try{const u={cookie:c};typeof h.syncAdapterStream=="function"?D.value=await h.syncAdapterStream(o,u,fe):D.value=await h.syncAdapter(o,u);const f=D.value&&D.value.entityCounts||{},x=(f.events||0)+(f.persons||0)+(f.items||0)+(f.topics||0);g.success(`采集完成:${o} 入库 ${x} 条`),ue.value=!1,await z()}catch(u){g.error(`采集 ${o} 失败: ${u.message}`)}finally{b.sync[o]=!1,S.active=!1}}async function Ke(o,c,u){b.sync[o]=!0,ce(o);try{const f={inputPath:c};u&&(f.key=u),typeof h.syncAdapterStream=="function"?D.value=await h.syncAdapterStream(o,f,fe):D.value=await h.syncAdapter(o,f);const x=D.value&&D.value.entityCounts||{},H=(x.events||0)+(x.persons||0)+(x.items||0)+(x.topics||0);g.success(`采集完成:${o} 入库 ${H} 条`),ue.value=!1,await z()}catch(f){g.error(`采集 ${o} 失败: ${f.message}`)}finally{b.sync[o]=!1,S.active=!1}}const ht=ee(()=>{const o=Y.value||[];if(!o.length)return null;let c=0;for(const u of o){const f=ye(u.name);f&&f.ready&&(c+=1)}return{ready:c,total:o.length}}),wt=[{title:"时间",key:"at",dataIndex:"at",width:170},{title:"动作",dataIndex:"action",key:"action",width:200},{title:"详情",key:"details"}],Ot=[{title:"日期",key:"occurredAt",width:100},{title:"描述",dataIndex:"description",key:"description"},{title:"金额",key:"amount",width:140,align:"right"}];function Ct(o){return o==="high"?"red":o==="medium"?"orange":"default"}function St(o){if(!o)return"";const c=o.entityCounts||{},u=`events=${c.events??0} persons=${c.persons??0} | raw=${o.rawCount??0} invalid=${o.invalidCount??0} | KG triples=${o.kgTripleCount??0} RAG docs=${o.ragDocCount??0} | ${o.durationMs??0}ms`;return o.error?`${u} · 错误: ${o.error}`:u}async function z(){b.refresh=!0;try{e.value=await h.health(),G.value=await h.stats(),Y.value=await h.listAdapters();try{const o=await h.adapterReadiness(),c={};for(const u of Array.isArray(o)?o:[])c[u.name]=u;y.value=c}catch{}try{me.value=await h.listAichatAccounts()}catch{}}catch(o){g.error("刷新失败: "+o.message)}finally{b.refresh=!1}}async function Dt(){if(I.value.trim()){b.ask=!0,O.value="",_.value=null;try{_.value=await h.ask(I.value.trim(),{acceptNonLocal:P.value})}catch(o){O.value=o.message}finally{b.ask=!1}}}async function It(){b.addMock=!0;try{await h.registerMock({count:30,seed:Date.now()%1e3}),await z(),g.success("MockAdapter 已注册(30 条 mock 数据 ready 同步)")}catch(o){g.error("注册失败: "+o.message)}finally{b.addMock=!1}}function ce(o=""){S.active=!0,S.adapter=o,S.phase="starting",S.mailbox="",S.current=0,S.total=0,S.attempt=1,S.errorMessage=""}function fe(o){o&&(o.adapter&&(S.adapter=o.adapter),o.phase&&(S.phase=o.phase),typeof o.current=="number"&&(S.current=o.current),typeof o.total=="number"&&(S.total=o.total),typeof o.attempt=="number"&&(S.attempt=o.attempt),o.mailbox&&(S.mailbox=o.mailbox),o.phase==="error"&&(S.errorMessage=o.message||"sync error"))}async function qe(o){b.sync[o]=!0,ce(o);try{const c=N[o],u=c?{include:{...c}}:{};typeof h.syncAdapterStream=="function"?D.value=await h.syncAdapterStream(o,u,fe):D.value=await h.syncAdapter(o,u),await z()}catch(c){g.error(`同步 ${o} 失败: ${c.message}`)}finally{b.sync[o]=!1,S.active=!1}}async function Et(){b.syncAll=!0,ce("(all)");try{const o=typeof h.syncAllStream=="function"?await h.syncAllStream({},fe):await h.syncAll();D.value=o?.[o.length-1]||null,await z(),g.success(`已同步 ${o?.length||0} 个 adapter`)}catch(o){g.error("同步失败: "+o.message)}finally{b.syncAll=!1,S.active=!1}}async function Pt(o){try{await h.unregister(o),await z()}catch(c){g.error("移除失败: "+c.message)}}async function Rt(o){if(o){b.audit=!0;try{F.value=await h.recentAudit({limit:200})}catch(c){g.error("审计日志加载失败: "+c.message)}finally{b.audit=!1}}}const Oe=ee(()=>!(!M.email||!M.email.includes("@")||!M.authCode||M.authCode.length<4||M.provider==="custom"&&!M.host));function xt(o){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"}[o]||"请输入服务商授权码(不是登录密码)"}function Ve(){M.provider="qq",M.email="",M.authCode="",M.host="",M.port=993,M.pdfPasswordHints={idCardLast6:"",phoneLast6:"",cardLast6:""},V.value=null}function Ce(){const o={provider:M.provider,email:M.email.trim(),authCode:M.authCode};return M.provider==="custom"&&(o.host=M.host.trim(),o.port=M.port||993,o.secure=!0),o}function Qe(){const o={};for(const c of Object.keys(M.pdfPasswordHints)){const u=M.pdfPasswordHints[c];typeof u=="string"&&u.trim().length>0&&(o[c]=u.trim())}return Object.keys(o).length>0?o:null}async function Tt(){if(Oe.value){b.testEmail=!0,V.value=null;try{V.value=await h.testEmailAuth(Ce())}catch(o){V.value={ok:!1,error:o.message}}finally{b.testEmail=!1}}}async function Lt(){if(!(!Oe.value||!V.value?.ok)){b.saveEmail=!0;try{const o={},c=Qe();c&&(o.pdfPasswordHints=c),await h.registerEmail(Ce(),o),g.success("邮箱账号已注册"),oe.value=!1,Ve(),await z()}catch(o){g.error("保存失败: "+o.message)}finally{b.saveEmail=!1}}}const Ge=ee(()=>!(!r.email||!r.email.includes("@")||!r.filePath||r.filePath.length<3));function Mt(){r.email="",r.zipPassword="",r.filePath="",k.value=null}async function Ut(){if(Ge.value){b.importAlipay=!0,k.value=null;try{await h.registerAlipay({email:r.email.trim(),zipPassword:r.zipPassword||void 0});const c=/\.zip$/i.test(r.filePath)?{zipPath:r.filePath,zipPassword:r.zipPassword||void 0}:{csvPath:r.filePath};k.value=await h.importAlipayBill(c),k.value?.status==="ok"?(g.success(`导入成功 — ${k.value.entityCounts?.events||0} 笔交易`),await z()):g.error("导入失败: "+(k.value?.error||k.value?.status))}catch(o){k.value={status:"error",error:o.message},g.error("导入失败: "+o.message)}finally{b.importAlipay=!1}}}async function Ye(o){if(o){b.eventDetail=!0,le.value=!0;try{K.value=await h.eventDetail(o)}catch(c){K.value=null,g.error("事件详情加载失败: "+c.message)}finally{b.eventDetail=!1}}}t({showEventDetail:Ye});async function Bt(o){b.skill=!0,ne.value=null;try{ne.value=await h.runSkill(o,{})}catch(c){g.error(`${o} 失败: ${c.message}`)}finally{b.skill=!1}}async function ve(){b.reviewQueue=!0;try{L.value=await h.reviewQueueList(50);const o=await h.resolverStats();Object.assign(Q,o)}catch(o){g.error("待消歧加载失败: "+o.message)}finally{b.reviewQueue=!1}}async function Nt(){w.value=!0,await ve()}async function Ft(o,c){try{await h.reviewDecision(o,c),g.success(`已记录决策: ${c}`),await ve()}catch(u){g.error("决策失败: "+u.message)}}async function Ht(){b.resolverDrain=!0;try{const o=await h.resolverDrain(20);g.success(`drain 完成 — same=${o.same} different=${o.different} review=${o.review}`),await ve()}catch(o){g.error("drain 失败: "+o.message)}finally{b.resolverDrain=!1}}async function je(){try{const o=await h.resolverStats();Object.assign(Q,o)}catch{}}$e(()=>{z(),je()});const Xe={hub:h,health:e,stats:G,adapters:Y,readinessMap:y,askInput:I,askResult:_,askError:O,acceptNonLocal:P,auditOpen:U,auditRows:F,lastSync:D,SYNC_INCLUDE_STORAGE_KEY:De,DEFAULT_SYNC_INCLUDE:q,_loadSyncInclude:B,syncIncludeOptions:N,persistSyncInclude:j,includePopoverOpen:R,INCLUDE_KIND_META:E,adapterHasIncludeToggles:re,onIncludeKindToggle:T,emailConfigOpen:oe,emailForm:M,emailTestResult:V,eventDetailOpen:le,eventDetail:K,emailAccounts:X,skillResult:ne,analysisSkills:se,reviewQueueOpen:w,reviewRows:L,resolverStats:Q,aichatWizardOpen:ke,aichatAccounts:me,onAichatRegistered:ge,wechatWizardOpen:pe,onWechatRegistered:be,alipayConfigOpen:Ae,alipayForm:r,alipayResult:k,syncProgress:S,loading:b,bridgeDoctorReport:Ee,bilibiliReasonMessage:he,douyinReasonMessage:Pe,weiboReasonMessage:Re,xhsReasonMessage:xe,xhsAdbSync:lt,toutiaoReasonMessage:Te,toutiaoAdbSync:st,kuaishouReasonMessage:Le,kuaishouAdbSync:dt,bridgeDoctor:ut,weiboAdbSync:ct,douyinAdbSync:ft,bilibiliAdbDoctor:mt,bilibiliAdbSync:gt,adapterColumns:pt,readinessOf:ye,guideDrawerOpen:ue,guideTarget:Me,openGuide:yt,READINESS_STATUS_COLOR:Ue,readinessStatusColor:vt,READINESS_STATUS_LABEL:Be,readinessStatusLabel:_t,READINESS_CATEGORY_LABEL:Ne,readinessCategoryLabel:kt,FILE_COLLECT_ADAPTERS:Fe,KEYED_FILE_ADAPTERS:He,COOKIE_COLLECT_ADAPTERS:ze,collectMode:we,collectActionLabel:bt,oneClickCollect:At,collectViaCookie:We,collectViaFile:Ke,readinessSummary:ht,auditColumns:wt,transactionColumns:Ot,sensitivityColor:Ct,syncSummary:St,refresh:z,ask:Dt,addMock:It,resetSyncProgress:ce,handleSyncEvent:fe,syncOne:qe,syncAll:Et,unregisterAdapter:Pt,loadAudit:Rt,emailFormValid:Oe,providerAuthHint:xt,resetEmailForm:Ve,buildEmailAccountPayload:Ce,buildPdfHints:Qe,testEmailAuth:Tt,saveEmail:Lt,alipayFormValid:Ge,resetAlipayForm:Mt,importAlipay:Ut,showEventDetail:Ye,runSkill:Bt,loadReviewQueue:ve,openReviewQueue:Nt,decideReview:Ft,drainResolver:Ht,loadResolverStats:je,ref:C,reactive:$,onMounted:$e,computed:ee,get message(){return g},get ReloadOutlined(){return no},get FileSearchOutlined(){return ao},get MessageOutlined(){return oo},get SendOutlined(){return to},get AppstoreOutlined(){return eo},get MailOutlined(){return $t},get InfoCircleOutlined(){return Zt},get WalletOutlined(){return Jt},get LinkOutlined(){return Xt},get BulbOutlined(){return jt},get DollarOutlined(){return et},get TeamOutlined(){return tt},get EnvironmentOutlined(){return ot},get HeartOutlined(){return at},get ClockCircleOutlined(){return nt},get RobotOutlined(){return Yt},get WechatOutlined(){return Gt},get usePersonalDataHub(){return de},AIChatWizard:ho,WechatWizard:xo};return Object.defineProperty(Xe,"__isScriptSetup",{enumerable:!1,value:!0}),Xe}},Lo={class:"pdh-page"},Mo={class:"pdh-header"},Uo={class:"kv"},Bo={key:0,class:"kv"},No={key:1,class:"kv"},Fo={class:"kv"},Ho={key:0,class:"kv hint"},zo={style:{"margin-top":"12px",display:"flex","justify-content":"space-between","align-items":"center"}},Wo={key:0,style:{"margin-top":"12px"}},Ko={key:1,style:{"margin-top":"12px"}},qo={class:"answer"},Vo={style:{"margin-top":"8px","font-size":"12px",color:"var(--text-color-secondary, #888)"}},Qo={key:2,style:{"margin-top":"8px"}},Go={style:{display:"flex","align-items":"center",gap:"8px"}},Yo={class:"hint",style:{"margin-top":"4px"}},jo={key:0,style:{"margin-top":"16px"}},Xo={class:"json-pre",style:{"max-height":"300px",overflow:"auto"}},Jo={key:0,style:{"margin-top":"8px"}},Zo={key:0,style:{"margin-top":"4px",opacity:"0.85"}},$o={key:1,style:{"margin-top":"4px",color:"#ffb3b3"}},ea={style:{color:"#999","font-size":"12px","margin-left":"2px"}},ta={key:0,style:{color:"#8c8c8c","font-size":"12px","margin-top":"2px","line-height":"1.4"}},oa={style:{"min-width":"220px"}},aa={style:{color:"#999","font-size":"12px","margin-left":"4px"}},na={key:2,style:{"margin-top":"12px"}},ia={class:"kv",style:{"margin-bottom":"4px"}},ra={key:0,style:{color:"#faad14"}},la={key:2,class:"kv hint"},sa={key:3,class:"kv hint",style:{color:"#ff4d4f"}},da={key:3,style:{"margin-top":"12px"}},ua={key:2,style:{"margin-top":"8px"}},ca={key:1},fa={style:{"margin-left":"8px"}},ma={key:3,class:"json-pre"},ga={style:{"margin-left":"6px"}},pa={key:0,style:{"margin-left":"6px"}},ya={key:0,class:"hint",style:{"margin-top":"4px"}},va={key:0,style:{"margin-top":"8px"}},_a={style:{"margin-bottom":"12px"}},ka={class:"hint"},ba={class:"kv"},Aa={class:"kv",style:{"margin-top":"4px"}},ha={class:"kv"},wa={key:0,class:"hint",style:{"margin-top":"4px"}},Oa={key:1,style:{"font-size":"11px"}},Ca={style:{"font-weight":"600","margin-bottom":"8px"}},Sa={style:{margin:"0","padding-left":"20px","line-height":"1.9"}},Da={key:0,style:{"margin-top":"6px","font-size":"12px",color:"#52c41a"}},Ia={style:{"font-size":"12px",color:"#999"}};function Ea(ie,t,h,e,G,Y){const y=v("a-button"),I=v("a-badge"),_=v("a-space"),O=v("a-tag"),P=v("a-card"),U=v("a-col"),F=v("a-row"),D=v("a-textarea"),q=v("a-checkbox"),B=v("a-alert"),N=v("a-divider"),j=v("a-spin"),R=v("a-tooltip"),E=v("a-popover"),re=v("a-popconfirm"),T=v("a-table"),oe=v("a-empty"),M=v("a-progress"),V=v("a-select-option"),le=v("a-select"),K=v("a-form-item"),X=v("a-input"),ne=v("a-input-password"),se=v("a-input-number"),w=v("a-form"),L=v("a-drawer"),Q=v("a-descriptions-item"),ke=v("a-descriptions"),me=v("a-list-item-meta"),ge=v("a-list-item"),pe=v("a-list"),be=v("a-collapse-panel"),Ae=v("a-collapse");return l(),p("div",Lo,[d(" Page header "),m("div",Mo,[t[32]||(t[32]=m("div",null,[m("h2",{class:"page-title"},"个人数据中台"),m("p",{class:"page-sub"}," 让数据回归个人 — 各 app 数据本地加密落盘,本地 LLM 跨源分析,零云端外传。 ")],-1)),n(_,null,{default:a(()=>[n(y,{loading:e.loading.refresh,onClick:e.refresh},{icon:a(()=>[n(e.ReloadOutlined)]),default:a(()=>[t[29]||(t[29]=i(" 刷新 ",-1))]),_:1},8,["loading"]),n(I,{count:e.resolverStats.reviewQueue,offset:[0,0]},{default:a(()=>[n(y,{type:"primary",ghost:"",onClick:e.openReviewQueue},{icon:a(()=>[n(e.LinkOutlined)]),default:a(()=>[t[30]||(t[30]=i(" 待消歧 ",-1))]),_:1})]),_:1},8,["count"]),n(y,{type:"primary",ghost:"",onClick:t[0]||(t[0]=r=>e.auditOpen=!0)},{icon:a(()=>[n(e.FileSearchOutlined)]),default:a(()=>[t[31]||(t[31]=i(" 审计日志 ",-1))]),_:1})]),_:1})]),d(" Health row "),n(F,{gutter:16,style:{"margin-bottom":"16px"}},{default:a(()=>[n(U,{xs:24,sm:12,md:6},{default:a(()=>[n(P,{size:"small",title:"Vault"},{extra:a(()=>[n(O,{color:e.health?.vault?.ok?"green":"red"},{default:a(()=>[i(s(e.health?.vault?.ok?"正常":"未就绪"),1)]),_:1},8,["color"])]),default:a(()=>[m("div",Uo,"schema v"+s(e.health?.vault?.schemaVersion??"?"),1),e.stats?.vault?(l(),p("div",Bo," 事件 "+s(e.stats.vault.events)+" · 联系人 "+s(e.stats.vault.persons),1)):d("v-if",!0),e.stats?.vault?(l(),p("div",No," 地点 "+s(e.stats.vault.places)+" · 商品 "+s(e.stats.vault.items)+" · 主题 "+s(e.stats.vault.topics),1)):d("v-if",!0)]),_:1})]),_:1}),n(U,{xs:24,sm:12,md:6},{default:a(()=>[n(P,{size:"small",title:"本地 LLM"},{extra:a(()=>[n(O,{color:e.health?.llm?.ok?e.health.llm.isLocal?"green":"orange":"red"},{default:a(()=>[i(s(e.health?.llm?.ok?e.health.llm.isLocal?"本地":"非本地":"未就绪"),1)]),_:1},8,["color"])]),default:a(()=>[m("div",Fo,s(e.health?.llm?.name||"—"),1),e.health?.llm?.ok&&!e.health.llm.isLocal?(l(),p("div",Ho," ⚠️ 非本地 — ask 会被隐私 gate 拒绝,除非显式 acceptNonLocal ")):d("v-if",!0)]),_:1})]),_:1}),n(U,{xs:24,sm:12,md:6},{default:a(()=>[n(P,{size:"small",title:"KG 索引"},{extra:a(()=>[n(O,{color:e.health?.kgSink?.ok?"green":"default"},{default:a(()=>[i(s(e.health?.kgSink?.ok?"已连接":"不可用"),1)]),_:1},8,["color"])]),default:a(()=>[t[33]||(t[33]=m("div",{class:"kv"},"events / persons → cc knowledge-graph 实体 + 关系",-1))]),_:1})]),_:1}),n(U,{xs:24,sm:12,md:6},{default:a(()=>[n(P,{size:"small",title:"RAG 索引"},{extra:a(()=>[n(O,{color:e.health?.ragSink?.ok?"green":"default"},{default:a(()=>[i(s(e.health?.ragSink?.ok?"已连接":"不可用"),1)]),_:1},8,["color"])]),default:a(()=>[t[34]||(t[34]=m("div",{class:"kv"},"文本 → BM25(vector 留待后续 phase)",-1))]),_:1})]),_:1})]),_:1}),d(" Ask box "),n(P,{style:{"margin-bottom":"16px"}},{title:a(()=>[n(_,null,{default:a(()=>[n(e.MessageOutlined),t[35]||(t[35]=m("span",null,"问我数据",-1))]),_:1})]),default:a(()=>[n(D,{value:e.askInput,"onUpdate:value":t[1]||(t[1]=r=>e.askInput=r),rows:2,placeholder:"例:上个月在淘宝总共花了多少?/我妈生日那周买了啥送哪儿?",onKeydown:Vt(rt(e.ask,["exact","prevent"]),["enter"])},null,8,["value","onKeydown"]),m("div",zo,[n(q,{checked:e.acceptNonLocal,"onUpdate:checked":t[2]||(t[2]=r=>e.acceptNonLocal=r)},{default:a(()=>[...t[36]||(t[36]=[i("允许非本地 LLM (volcengine / anthropic 等)",-1)])]),_:1},8,["checked"]),n(y,{type:"primary",loading:e.loading.ask,disabled:!e.askInput.trim(),onClick:e.ask},{icon:a(()=>[n(e.SendOutlined)]),default:a(()=>[t[37]||(t[37]=i(" 提问 ",-1))]),_:1},8,["loading","disabled"])]),e.askError?(l(),p("div",Wo,[n(B,{type:"error","show-icon":"",message:e.askError},null,8,["message"])])):d("v-if",!0),e.askResult?(l(),p("div",Ko,[e.askResult.warning==="no-facts"?(l(),A(B,{key:0,type:"warning","show-icon":"",message:"vault 里没找到匹配的事件('no-facts')—— 先同步几个 adapter 让数据进 vault",style:{"margin-bottom":"12px"}})):e.askResult.warning==="hallucinated-citations"?(l(),A(B,{key:1,type:"warning","show-icon":"",message:`LLM 引用了 ${e.askResult.hallucinatedCitations?.length||0} 个不存在的 event id —— 模型在编造`,style:{"margin-bottom":"12px"}},null,8,["message"])):d("v-if",!0),m("div",qo,s(e.askResult.answer),1),m("div",Vo," 引用 "+s(e.askResult.citations?.length||0)+" 条事实 · "+s(e.askResult.facts?.length||0)+" facts 入 prompt · "+s(e.askResult.durationMs)+"ms · "+s(e.askResult.model),1),e.askResult.citations?.length?(l(),p("div",Qo,[t[38]||(t[38]=m("span",{style:{"font-size":"12px",color:"var(--text-color-secondary, #888)"}},"事件链接(点击查看明细 / PDF 解密结果):",-1)),n(_,{style:{"margin-top":"4px"},wrap:""},{default:a(()=>[(l(!0),p(W,null,ae(e.askResult.citations,r=>(l(),A(O,{key:r,color:"blue",style:{cursor:"pointer"},onClick:k=>e.showEventDetail(r)},{default:a(()=>[i(s(r),1)]),_:2},1032,["onClick"]))),128))]),_:1})])):d("v-if",!0)])):d("v-if",!0)]),_:1}),d(" Phase 11 — Analysis Skills cards "),n(P,{style:{"margin-bottom":"16px"}},{title:a(()=>[n(_,null,{default:a(()=>[n(e.BulbOutlined),t[39]||(t[39]=m("span",null,"分析 skill (Phase 11)",-1))]),_:1})]),extra:a(()=>[n(O,{color:"purple"},{default:a(()=>[...t[40]||(t[40]=[i("5 内置",-1)])]),_:1})]),default:a(()=>[n(F,{gutter:[12,12]},{default:a(()=>[(l(),p(W,null,ae(e.analysisSkills,r=>n(U,{xs:24,sm:12,md:8,key:r.name},{default:a(()=>[n(P,{size:"small",hoverable:"",onClick:k=>e.runSkill(r.name)},{default:a(()=>[m("div",Go,[(l(),A(Qt(r.icon),{style:{"font-size":"18px",color:"#722ed1"}})),m("strong",null,s(r.label),1)]),m("div",Yo,s(r.description),1)]),_:2},1032,["onClick"])]),_:2},1024)),64))]),_:1}),e.skillResult?(l(),p("div",jo,[n(N,{plain:"",orientation:"left"},{default:a(()=>[i(s(e.skillResult.skill)+" 结果",1)]),_:1}),n(j,{spinning:e.loading.skill},{default:a(()=>[m("pre",Xo,s(JSON.stringify(e.skillResult,null,2)),1),e.skillResult.llm_commentary||e.skillResult.llm_narrative?(l(),p("div",Jo,[n(B,{type:"info",message:e.skillResult.llm_commentary||e.skillResult.llm_narrative},null,8,["message"])])):d("v-if",!0)]),_:1},8,["spinning"])])):d("v-if",!0)]),_:1}),d(" Adapters "),n(P,{style:{"margin-bottom":"16px"}},{title:a(()=>[n(_,null,{default:a(()=>[n(e.AppstoreOutlined),t[41]||(t[41]=m("span",null,"Adapters",-1)),e.readinessSummary?(l(),A(O,{key:0,color:e.readinessSummary.ready===e.readinessSummary.total?"green":"orange"},{default:a(()=>[i(s(e.readinessSummary.ready)+"/"+s(e.readinessSummary.total)+" 可采集 ",1)]),_:1},8,["color"])):d("v-if",!0)]),_:1})]),extra:a(()=>[n(_,null,{default:a(()=>[n(y,{onClick:t[3]||(t[3]=r=>e.emailConfigOpen=!0)},{icon:a(()=>[n(e.MailOutlined)]),default:a(()=>[t[42]||(t[42]=i(" 添加邮箱账号 ",-1))]),_:1}),n(y,{onClick:t[4]||(t[4]=r=>e.alipayConfigOpen=!0)},{icon:a(()=>[n(e.WalletOutlined)]),default:a(()=>[t[43]||(t[43]=i(" 导入支付宝账单 ",-1))]),_:1}),n(y,{onClick:t[5]||(t[5]=r=>e.aichatWizardOpen=!0)},{icon:a(()=>[n(e.RobotOutlined)]),default:a(()=>[t[44]||(t[44]=i(" 添加 AI 对话账号 ",-1))]),_:1}),n(y,{onClick:t[6]||(t[6]=r=>e.wechatWizardOpen=!0)},{icon:a(()=>[n(e.WechatOutlined)]),default:a(()=>[t[45]||(t[45]=i(" 添加 WeChat ",-1))]),_:1}),n(y,{onClick:e.bilibiliAdbDoctor,loading:e.loading.bilibiliAdbDoctor},{default:a(()=>[...t[46]||(t[46]=[i(" 诊断 Bilibili ADB ",-1)])]),_:1},8,["loading"]),n(y,{onClick:e.bilibiliAdbSync,loading:e.loading.bilibiliAdbSync},{default:a(()=>[...t[47]||(t[47]=[i(" 通过 PC ADB 同步 Bilibili ",-1)])]),_:1},8,["loading"]),n(y,{onClick:e.weiboAdbSync,loading:e.loading.weiboAdbSync},{default:a(()=>[...t[48]||(t[48]=[i(" 通过 PC ADB 同步 Weibo ",-1)])]),_:1},8,["loading"]),n(y,{onClick:e.xhsAdbSync,loading:e.loading.xhsAdbSync},{default:a(()=>[...t[49]||(t[49]=[i(" 通过 PC ADB 同步 Xhs ",-1)])]),_:1},8,["loading"]),n(y,{onClick:e.toutiaoAdbSync,loading:e.loading.toutiaoAdbSync},{default:a(()=>[...t[50]||(t[50]=[i(" 通过 PC ADB 同步 Toutiao ",-1)])]),_:1},8,["loading"]),n(y,{onClick:e.kuaishouAdbSync,loading:e.loading.kuaishouAdbSync},{default:a(()=>[...t[51]||(t[51]=[i(" 通过 PC ADB 同步 Kuaishou ",-1)])]),_:1},8,["loading"]),n(y,{onClick:e.bridgeDoctor,loading:e.loading.bridgeDoctor},{default:a(()=>[...t[52]||(t[52]=[i(" 诊断签名 Bridges ",-1)])]),_:1},8,["loading"]),n(y,{onClick:e.douyinAdbSync,loading:e.loading.douyinAdbSync},{default:a(()=>[...t[53]||(t[53]=[i(" 通过 PC ADB 同步 Douyin ",-1)])]),_:1},8,["loading"]),n(y,{onClick:e.addMock,loading:e.loading.addMock},{default:a(()=>[...t[54]||(t[54]=[i(" 注册 MockAdapter(开发) ",-1)])]),_:1},8,["loading"]),n(y,{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?(l(),A(T,{key:0,columns:e.adapterColumns,"data-source":e.adapters,pagination:!1,"row-key":r=>r.name,size:"middle"},{bodyCell:a(({column:r,record:k})=>[r.key==="readiness"?(l(),p(W,{key:0},[e.readinessOf(k.name)?(l(),p(W,{key:0},[n(R,null,{title:a(()=>[m("div",null,s(e.readinessOf(k.name).message),1),e.readinessOf(k.name).actionHint?(l(),p("div",Zo," → "+s(e.readinessOf(k.name).actionHint),1)):d("v-if",!0),e.readinessOf(k.name).lastError?(l(),p("div",$o," 上次同步错误: "+s(e.readinessOf(k.name).lastError),1)):d("v-if",!0)]),default:a(()=>[n(O,{color:e.readinessStatusColor(e.readinessOf(k.name).status)},{default:a(()=>[i(s(e.readinessStatusLabel(e.readinessOf(k.name))),1)]),_:2},1032,["color"])]),_:2},1024),m("span",ea,s(e.readinessCategoryLabel(e.readinessOf(k.name).category)),1),d(` 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(k.name).ready?d("v-if",!0):(l(),p("div",ta,s(e.readinessOf(k.name).message),1))],64)):(l(),A(O,{key:1,color:"default"},{default:a(()=>[...t[56]||(t[56]=[i("检测中",-1)])]),_:1}))],64)):r.key==="sensitivity"?(l(),p(W,{key:1},[n(O,{color:e.sensitivityColor(k.sensitivity)},{default:a(()=>[i(s(k.sensitivity),1)]),_:2},1032,["color"]),k.legalGate?(l(),A(O,{key:0,color:"red",style:{"margin-left":"4px"}},{default:a(()=>[...t[57]||(t[57]=[i("需法律确认",-1)])]),_:1})):d("v-if",!0)],64)):r.key==="capabilities"?(l(!0),p(W,{key:2},ae(k.capabilities,S=>(l(),A(O,{key:S,style:{"margin-right":"4px"}},{default:a(()=>[i(s(S),1)]),_:2},1024))),128)):r.key==="actions"?(l(),A(_,{key:3},{default:a(()=>[n(y,{size:"small",type:"link",onClick:S=>e.openGuide(k.name)},{default:a(()=>[...t[58]||(t[58]=[i(" 如何导入 ",-1)])]),_:1},8,["onClick"]),d(` one-click: file-collect sources open a native picker; local
|
|
4
|
-
sources sync directly; snapshot sources try ADB auto-pull.
|
|
5
|
-
Routing via oneClickCollect so the button is always correct `),n(y,{size:"small",type:"primary",title:e.collectMode(e.readinessOf(k.name)||k)==="file"?"选择文件采集":"采集入库",loading:e.loading.sync[k.name],onClick:S=>e.oneClickCollect(k.name)},{default:a(()=>[i(s(e.collectMode(e.readinessOf(k.name)||k)==="file"?"📂 采集":"采集"),1)]),_:2},1032,["title","loading","onClick"]),d(` Per-kind include toggles (only adapters with multi-kind
|
|
6
|
-
bridge output show this — currently just system-data-android).
|
|
7
|
-
Popover content is a checkbox group writing into
|
|
8
|
-
syncIncludeOptions[record.name]; changes auto-persist to
|
|
9
|
-
localStorage so the user's privacy choice survives reloads. `),e.adapterHasIncludeToggles(k.name)?(l(),A(E,{key:0,open:e.includePopoverOpen[k.name],"onUpdate:open":S=>e.includePopoverOpen[k.name]=S,trigger:"click",placement:"left",title:`${k.name} 采集范围`},{content:a(()=>[m("div",oa,[(l(!0),p(W,null,ae(e.INCLUDE_KIND_META[k.name],S=>(l(),p("div",{key:S.key,style:{margin:"6px 0"}},[n(q,{checked:e.syncIncludeOptions[k.name][S.key]!==!1,onChange:b=>e.onIncludeKindToggle(k.name,S.key,b)},{default:a(()=>[i(s(S.label)+" ",1),m("span",aa,s(S.hint),1),S.sensitive?(l(),A(O,{key:0,color:"orange",size:"small",style:{"margin-left":"4px"}},{default:a(()=>[...t[59]||(t[59]=[i("敏感",-1)])]),_:1})):d("v-if",!0)]),_:2},1032,["checked","onChange"])]))),128)),t[60]||(t[60]=m("div",{style:{"margin-top":"8px","font-size":"11px",color:"#999"}}," 取消勾选的数据本次同步不会拉取入库 ",-1))])]),default:a(()=>[n(y,{size:"small",title:"选择采集范围"},{default:a(()=>[...t[61]||(t[61]=[i("⚙",-1)])]),_:1})]),_:2},1032,["open","onUpdate:open","title"])):d("v-if",!0),n(re,{title:`从注册表移除 ${k.name}?(vault 数据不会删除)`,onConfirm:S=>e.unregisterAdapter(k.name)},{default:a(()=>[n(y,{size:"small",danger:""},{default:a(()=>[...t[62]||(t[62]=[i("移除",-1)])]),_:1})]),_:1},8,["title","onConfirm"])]),_:2},1024)):d("v-if",!0)]),_:1},8,["data-source","row-key"])):(l(),A(oe,{key:1,description:"无已注册 adapter — 点上方按钮注册 MockAdapter 看效果"})),e.syncProgress.active?(l(),p("div",na,[n(P,{size:"small",bordered:!0},{default:a(()=>[m("div",ia,[t[63]||(t[63]=m("strong",null,"同步进行中",-1)),i(" · "+s(e.syncProgress.adapter)+" · "+s(e.syncProgress.phase||"...")+" ",1),e.syncProgress.attempt&&e.syncProgress.attempt>1?(l(),p("span",ra," (重试 #"+s(e.syncProgress.attempt)+") ",1)):d("v-if",!0)]),e.syncProgress.total>0?(l(),A(M,{key:0,percent:Math.round(e.syncProgress.current/e.syncProgress.total*100),status:e.syncProgress.errorMessage?"exception":"active",size:"small"},null,8,["percent","status"])):(l(),A(M,{key:1,percent:0,status:"active",size:"small"})),e.syncProgress.mailbox?(l(),p("div",la," 邮箱 "+s(e.syncProgress.mailbox)+" · "+s(e.syncProgress.current)+" / "+s(e.syncProgress.total),1)):d("v-if",!0),e.syncProgress.errorMessage?(l(),p("div",sa,s(e.syncProgress.errorMessage),1)):d("v-if",!0)]),_:1})])):d("v-if",!0),e.lastSync?(l(),p("div",da,[n(B,{type:e.lastSync.status==="ok"?"success":"error","show-icon":"",message:`同步 ${e.lastSync.adapter}: ${e.lastSync.status}`,description:e.syncSummary(e.lastSync)},null,8,["type","message","description"])])):d("v-if",!0)]),_:1}),d(" Email config drawer (Phase 5.6) "),n(L,{open:e.emailConfigOpen,"onUpdate:open":t[16]||(t[16]=r=>e.emailConfigOpen=r),title:"添加邮箱账号",placement:"right",width:"560","destroy-on-close":!0,onClose:e.resetEmailForm},{footer:a(()=>[n(_,null,{default:a(()=>[n(y,{onClick:t[15]||(t[15]=r=>e.emailConfigOpen=!1)},{default:a(()=>[...t[73]||(t[73]=[i("取消",-1)])]),_:1}),n(y,{loading:e.loading.testEmail,disabled:!e.emailFormValid,onClick:e.testEmailAuth},{default:a(()=>[...t[74]||(t[74]=[i(" 测试连接 ",-1)])]),_:1},8,["loading","disabled"]),n(y,{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(()=>[n(B,{message:"数据回归个人 — 凭证落本地加密文件(与 vault 主密钥同目录),同步动作 100% 本地。",type:"info","show-icon":"",style:{"margin-bottom":"16px"}}),n(w,{layout:"vertical",model:e.emailForm},{default:a(()=>[n(K,{label:"邮箱服务商",required:""},{default:a(()=>[n(le,{value:e.emailForm.provider,"onUpdate:value":t[7]||(t[7]=r=>e.emailForm.provider=r),placeholder:"选择服务商"},{default:a(()=>[n(V,{value:"qq"},{default:a(()=>[...t[64]||(t[64]=[i("QQ 邮箱 (imap.qq.com)",-1)])]),_:1}),n(V,{value:"163"},{default:a(()=>[...t[65]||(t[65]=[i("网易邮箱 163/126",-1)])]),_:1}),n(V,{value:"189"},{default:a(()=>[...t[66]||(t[66]=[i("189 邮箱",-1)])]),_:1}),n(V,{value:"outlook"},{default:a(()=>[...t[67]||(t[67]=[i("Outlook / Hotmail",-1)])]),_:1}),n(V,{value:"gmail"},{default:a(()=>[...t[68]||(t[68]=[i("Gmail",-1)])]),_:1}),n(V,{value:"custom"},{default:a(()=>[...t[69]||(t[69]=[i("自定义 IMAP",-1)])]),_:1})]),_:1},8,["value"])]),_:1}),n(K,{label:"邮箱地址",required:""},{default:a(()=>[n(X,{value:e.emailForm.email,"onUpdate:value":t[8]||(t[8]=r=>e.emailForm.email=r),placeholder:"you@qq.com",autocomplete:"off"},null,8,["value"])]),_:1}),n(K,{required:""},{label:a(()=>[n(_,null,{default:a(()=>[t[70]||(t[70]=m("span",null,"授权码(非登录密码)",-1)),n(R,{title:e.providerAuthHint(e.emailForm.provider)},{default:a(()=>[n(e.InfoCircleOutlined,{style:{color:"#888"}})]),_:1},8,["title"])]),_:1})]),default:a(()=>[n(ne,{value:e.emailForm.authCode,"onUpdate:value":t[9]||(t[9]=r=>e.emailForm.authCode=r),placeholder:"例:QQ 邮箱 设置 → 账户 → 开启 IMAP/SMTP → 生成的授权码",autocomplete:"off"},null,8,["value"])]),_:1}),e.emailForm.provider==="custom"?(l(),A(K,{key:0,label:"IMAP host"},{default:a(()=>[n(X,{value:e.emailForm.host,"onUpdate:value":t[10]||(t[10]=r=>e.emailForm.host=r),placeholder:"mail.example.com"},null,8,["value"])]),_:1})):d("v-if",!0),e.emailForm.provider==="custom"?(l(),A(K,{key:1,label:"端口"},{default:a(()=>[n(se,{value:e.emailForm.port,"onUpdate:value":t[11]||(t[11]=r=>e.emailForm.port=r),min:1,max:65535,"default-value":993},null,8,["value"])]),_:1})):d("v-if",!0),n(N,{orientation:"left",plain:""},{default:a(()=>[...t[71]||(t[71]=[i("PDF 账单解密提示(可选)",-1)])]),_:1}),t[72]||(t[72]=m("p",{class:"hint"},"银行 PDF 月结大多加密;提供几个常用候选项让 Phase 5.5 自动解锁:",-1)),n(K,{label:"身份证后 6 位"},{default:a(()=>[n(X,{value:e.emailForm.pdfPasswordHints.idCardLast6,"onUpdate:value":t[12]||(t[12]=r=>e.emailForm.pdfPasswordHints.idCardLast6=r),placeholder:"123456",autocomplete:"off"},null,8,["value"])]),_:1}),n(K,{label:"手机后 6 位"},{default:a(()=>[n(X,{value:e.emailForm.pdfPasswordHints.phoneLast6,"onUpdate:value":t[13]||(t[13]=r=>e.emailForm.pdfPasswordHints.phoneLast6=r),placeholder:"123456",autocomplete:"off"},null,8,["value"])]),_:1}),n(K,{label:"信用卡尾 6 位"},{default:a(()=>[n(X,{value:e.emailForm.pdfPasswordHints.cardLast6,"onUpdate:value":t[14]||(t[14]=r=>e.emailForm.pdfPasswordHints.cardLast6=r),placeholder:"123456",autocomplete:"off"},null,8,["value"])]),_:1}),e.emailTestResult?(l(),p("div",ua,[n(B,{type:e.emailTestResult.ok?"success":"error","show-icon":"",message:e.emailTestResult.ok?"凭证有效 — 可以保存":`认证失败: ${e.emailTestResult.reason||e.emailTestResult.error}`},null,8,["type","message"])])):d("v-if",!0)]),_:1},8,["model"])]),_:1},8,["open"]),d(" Event detail drawer (Phase 5.6) "),n(L,{open:e.eventDetailOpen,"onUpdate:open":t[17]||(t[17]=r=>e.eventDetailOpen=r),title:e.eventDetail?`事件 ${e.eventDetail.event.id}`:"加载中...",placement:"right",width:"640","destroy-on-close":!0},{default:a(()=>[e.eventDetail?(l(),p(W,{key:0},[n(ke,{column:1,size:"small",bordered:""},{default:a(()=>[n(Q,{label:"类型"},{default:a(()=>[i(s(e.eventDetail.event.subtype),1)]),_:1}),n(Q,{label:"发生于"},{default:a(()=>[i(s(new Date(e.eventDetail.event.occurredAt).toLocaleString()),1)]),_:1}),n(Q,{label:"actor"},{default:a(()=>[i(s(e.eventDetail.event.actor),1)]),_:1}),e.eventDetail.event.content?.title?(l(),A(Q,{key:0,label:"标题"},{default:a(()=>[i(s(e.eventDetail.event.content.title),1)]),_:1})):d("v-if",!0),e.eventDetail.event.source?.adapter?(l(),A(Q,{key:1,label:"来源 adapter"},{default:a(()=>[i(s(e.eventDetail.event.source.adapter)+" @ v"+s(e.eventDetail.event.source.adapterVersion),1)]),_:1})):d("v-if",!0)]),_:1}),e.eventDetail.classification?(l(),A(N,{key:0,orientation:"left",plain:""},{default:a(()=>[...t[76]||(t[76]=[i("分类",-1)])]),_:1})):d("v-if",!0),e.eventDetail.classification?(l(),p("div",ca,[n(O,{color:"blue"},{default:a(()=>[i(s(e.eventDetail.classification.category),1)]),_:1}),n(O,null,{default:a(()=>[i(s(e.eventDetail.classification.layer),1)]),_:1}),m("span",fa,"置信 "+s(Math.round((e.eventDetail.classification.confidence||0)*100))+"%",1)])):d("v-if",!0),e.eventDetail.extraction?(l(),A(N,{key:2,orientation:"left",plain:""},{default:a(()=>[i("结构化字段("+s(e.eventDetail.extraction.template)+")",1)]),_:1})):d("v-if",!0),e.eventDetail.extraction?(l(),p("pre",ma,s(JSON.stringify(e.eventDetail.extraction.fields,null,2)),1)):d("v-if",!0),e.eventDetail.extraction?.pdfExtraction?(l(),A(N,{key:4,orientation:"left",plain:""},{default:a(()=>[...t[77]||(t[77]=[i("PDF 解密 / 解析",-1)])]),_:1})):d("v-if",!0),e.eventDetail.extraction?.pdfExtraction?(l(),A(pe,{key:5,"data-source":e.eventDetail.extraction.pdfExtraction,size:"small"},{renderItem:a(({item:r})=>[n(ge,null,{default:a(()=>[n(me,{title:r.filename},{description:a(()=>[m("div",null,[n(O,{color:r.decrypted?"green":"red"},{default:a(()=>[i(s(r.decrypted?"已解密":"解密失败"),1)]),_:2},1032,["color"]),m("span",ga,"尝试 "+s(r.attempted)+" 次",1),r.transactionsExtracted!=null?(l(),p("span",pa," · 提取 "+s(r.transactionsExtracted)+" 条交易 ",1)):d("v-if",!0)]),r.error?(l(),p("div",ya,s(r.error),1)):d("v-if",!0)]),_:2},1032,["title"])]),_:2},1024)]),_:1},8,["data-source"])):d("v-if",!0),e.eventDetail.extraction?.fields?.transactions?.length?(l(),p(W,{key:6},[n(N,{orientation:"left",plain:""},{default:a(()=>[...t[78]||(t[78]=[i("交易明细",-1)])]),_:1}),n(T,{columns:e.transactionColumns,"data-source":e.eventDetail.extraction.fields.transactions,pagination:{pageSize:10,size:"small"},"row-key":(r,k)=>k,size:"small"},{bodyCell:a(({column:r,record:k})=>[r.key==="occurredAt"?(l(),p(W,{key:0},[i(s(new Date(k.occurredAtMs).toLocaleDateString()),1)],64)):r.key==="amount"?(l(),p("span",{key:1,class:it(k.amount.direction==="in"?"amount-in":"amount-out")},s(k.amount.direction==="in"?"+":"-")+s(k.amount.value.toFixed(2))+" "+s(k.amount.currency),3)):d("v-if",!0)]),_:1},8,["data-source","row-key"])],64)):d("v-if",!0)],64)):(l(),A(oe,{key:1,description:"无事件数据"}))]),_:1},8,["open","title"]),d(" Alipay import drawer (Phase 6) "),n(L,{open:e.alipayConfigOpen,"onUpdate:open":t[22]||(t[22]=r=>e.alipayConfigOpen=r),title:"导入支付宝账单",placement:"right",width:"560","destroy-on-close":!0,onClose:e.resetAlipayForm},{footer:a(()=>[n(_,null,{default:a(()=>[n(y,{onClick:t[21]||(t[21]=r=>e.alipayConfigOpen=!1)},{default:a(()=>[...t[84]||(t[84]=[i("关闭",-1)])]),_:1}),n(y,{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(()=>[n(B,{message:"支付宝官方导出 CSV — 服务器侧全量、稳定无风控。3 分钟拿到 12 个月流水。",type:"info","show-icon":"",style:{"margin-bottom":"16px"}}),n(Ae,{bordered:!1,style:{"margin-bottom":"12px"}},{default:a(()=>[n(be,{header:"如何导出账单(首次必看)"},{default:a(()=>[...t[79]||(t[79]=[m("ol",{style:{"padding-left":"18px","font-size":"13px"}},[m("li",null,"支付宝 app → 我的 → 账单 → 右上角 ⋯"),m("li",null,'点 "开具交易流水证明"'),m("li",null,"选月份范围(最长 12 个月)"),m("li",null,'用途选 "个人对账"'),m("li",null,"发送到你的绑定邮箱"),m("li",null,[i("从邮箱下载 "),m("code",null,"alipay_record_*.zip")]),m("li",null,"解压密码 = 你的身份证后 6 位")],-1)])]),_:1})]),_:1}),n(w,{layout:"vertical",model:e.alipayForm},{default:a(()=>[n(K,{label:"支付宝绑定邮箱(账户标识)",required:""},{default:a(()=>[n(X,{value:e.alipayForm.email,"onUpdate:value":t[18]||(t[18]=r=>e.alipayForm.email=r),placeholder:"alipay-bound@example.com",autocomplete:"off"},null,8,["value"])]),_:1}),n(K,null,{label:a(()=>[n(_,null,{default:a(()=>[t[80]||(t[80]=m("span",null,"ZIP 密码(身份证后 6 位)",-1)),n(R,{title:"支付宝 ZIP 默认密码 = 身份证号后 6 位。也支持自定义密码。"},{default:a(()=>[n(e.InfoCircleOutlined,{style:{color:"#888"}})]),_:1})]),_:1})]),default:a(()=>[n(ne,{value:e.alipayForm.zipPassword,"onUpdate:value":t[19]||(t[19]=r=>e.alipayForm.zipPassword=r),placeholder:"例:123456",autocomplete:"off"},null,8,["value"]),t[81]||(t[81]=m("div",{class:"hint",style:{"margin-top":"4px"}}," 空白则解析时再问,或导入的 ZIP 未加密。 ",-1))]),_:1}),n(N,{orientation:"left",plain:""},{default:a(()=>[...t[82]||(t[82]=[i("选择文件",-1)])]),_:1}),n(K,{label:"ZIP 或 CSV 文件路径"},{default:a(()=>[n(X,{value:e.alipayForm.filePath,"onUpdate:value":t[20]||(t[20]=r=>e.alipayForm.filePath=r),placeholder:"C:\\\\Users\\\\you\\\\Downloads\\\\alipay_record_xxx.zip","allow-clear":""},null,8,["value"]),t[83]||(t[83]=m("div",{class:"hint",style:{"margin-top":"4px"}}," 桌面版可通过 Electron 文件选择器自动填充;web-shell 复制完整路径。 ",-1))]),_:1}),e.alipayResult?(l(),p("div",va,[n(B,{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"])])):d("v-if",!0)]),_:1},8,["model"])]),_:1},8,["open"]),d(" Phase 8.7 — Review queue drawer (待消歧) "),n(L,{open:e.reviewQueueOpen,"onUpdate:open":t[23]||(t[23]=r=>e.reviewQueueOpen=r),title:"待消歧(EntityResolver 模糊判定)",placement:"right",width:"640","destroy-on-close":!0},{default:a(()=>[e.reviewRows.length===0&&!e.loading.reviewQueue?(l(),A(B,{key:0,type:"success","show-icon":"",message:"无待消歧 pair — 所有跨源 Person 已确定。",style:{"margin-bottom":"12px"}})):d("v-if",!0),m("div",_a,[n(_,null,{default:a(()=>[n(y,{loading:e.loading.reviewQueue,onClick:e.loadReviewQueue},{icon:a(()=>[n(e.ReloadOutlined)]),default:a(()=>[t[86]||(t[86]=i(" 刷新 ",-1))]),_:1},8,["loading"]),n(y,{loading:e.loading.resolverDrain,onClick:e.drainResolver},{default:a(()=>[...t[87]||(t[87]=[i(" 手动 drain 队列 ",-1)])]),_:1},8,["loading"]),m("span",ka," queue: "+s(e.resolverStats.queue?.pending||0)+" pending · "+s(e.resolverStats.mergeGroups||0)+" groups ",1)]),_:1})]),n(pe,{"data-source":e.reviewRows,pagination:{pageSize:5,size:"small"},size:"small"},{renderItem:a(({item:r})=>[n(ge,null,{default:a(()=>[n(P,{size:"small",style:{width:"100%"}},{default:a(()=>[m("div",ba,[m("strong",null,"Pair #"+s(r.id),1),r.embed_sim?(l(),A(O,{key:0,color:"blue",style:{"margin-left":"8px"}},{default:a(()=>[i(" sim "+s(Number(r.embed_sim).toFixed(2)),1)]),_:2},1024)):d("v-if",!0),r.llm_verdict?(l(),A(O,{key:1,color:r.llm_verdict==="yes"?"green":r.llm_verdict==="no"?"red":"orange",style:{"margin-left":"4px"}},{default:a(()=>[i(" LLM: "+s(r.llm_verdict),1)]),_:2},1032,["color"])):d("v-if",!0)]),m("div",Aa,"A: "+s(r.a_person_id),1),m("div",ha,"B: "+s(r.b_person_id),1),r.llm_reason?(l(),p("div",wa," LLM 理由: "+s(r.llm_reason),1)):d("v-if",!0),n(_,{style:{"margin-top":"8px"}},{default:a(()=>[n(y,{size:"small",type:"primary",onClick:k=>e.decideReview(r.id,"same")},{default:a(()=>[...t[88]||(t[88]=[i("同一人",-1)])]),_:1},8,["onClick"]),n(y,{size:"small",danger:"",onClick:k=>e.decideReview(r.id,"different")},{default:a(()=>[...t[89]||(t[89]=[i("不同人",-1)])]),_:1},8,["onClick"]),n(y,{size:"small",onClick:k=>e.decideReview(r.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"]),d(" Audit drawer "),n(L,{open:e.auditOpen,"onUpdate:open":t[24]||(t[24]=r=>e.auditOpen=r),title:"审计日志(数据 lineage)",placement:"right",width:"600",onAfterOpenChange:e.loadAudit},{default:a(()=>[n(T,{columns:e.auditColumns,"data-source":e.auditRows,pagination:{pageSize:20,size:"small"},"row-key":r=>r.id,size:"small"},{bodyCell:a(({column:r,record:k})=>[r.key==="at"?(l(),p(W,{key:0},[i(s(new Date(k.at).toLocaleString()),1)],64)):r.key==="details"?(l(),p("code",Oa,s(k.details||"—"),1)):d("v-if",!0)]),_:1},8,["data-source","row-key"])]),_:1},8,["open"]),d(" Phase 10.3 — AIChat WebView 鉴权向导 "),n(e.AIChatWizard,{open:e.aichatWizardOpen,"onUpdate:open":t[25]||(t[25]=r=>e.aichatWizardOpen=r),"existing-accounts":e.aichatAccounts,onRegistered:e.onAichatRegistered},null,8,["open","existing-accounts"]),d(" Phase 12.6.10 — WeChat env-probe + register 向导 "),n(e.WechatWizard,{open:e.wechatWizardOpen,"onUpdate:open":t[26]||(t[26]=r=>e.wechatWizardOpen=r),onRegistered:e.onWechatRegistered},null,8,["open"]),d(" 如何导入 — per-source onboarding guide "),n(L,{open:e.guideDrawerOpen,"onUpdate:open":t[28]||(t[28]=r=>e.guideDrawerOpen=r),title:e.guideTarget&&e.guideTarget.guide?`如何导入:${e.guideTarget.guide.displayName}`:"如何导入",width:"520",placement:"right"},{default:a(()=>[e.guideTarget&&e.guideTarget.guide?(l(),p(W,{key:0},[n(_,{style:{"margin-bottom":"12px"},wrap:""},{default:a(()=>[n(O,{color:e.readinessStatusColor(e.guideTarget.status)},{default:a(()=>[i(s(e.readinessStatusLabel(e.guideTarget)),1)]),_:1},8,["color"]),n(O,null,{default:a(()=>[i(s(e.readinessCategoryLabel(e.guideTarget.guide.category)),1)]),_:1})]),_:1}),n(B,{type:"info",message:e.guideTarget.guide.summary,"show-icon":"",style:{"margin-bottom":"8px"}},null,8,["message"]),!e.guideTarget.ready&&e.guideTarget.message?(l(),A(B,{key:0,type:"warning",message:`当前状态:${e.guideTarget.message}`,"show-icon":"",style:{"margin-bottom":"16px"}},null,8,["message"])):d("v-if",!0),(l(!0),p(W,null,ae(e.guideTarget.guide.methods,(r,k)=>(l(),p("div",{key:k,style:{"margin-bottom":"20px"}},[m("div",Ca,[i(s(r.label)+" ",1),r.recommended?(l(),A(O,{key:0,color:"green",style:{"margin-left":"6px"}},{default:a(()=>[...t[91]||(t[91]=[i("推荐",-1)])]),_:1})):d("v-if",!0)]),m("ol",Sa,[(l(!0),p(W,null,ae(r.steps,(S,b)=>(l(),p("li",{key:b},s(S),1))),128))]),r.note?(l(),p("div",Da,s(r.note),1)):d("v-if",!0)]))),128)),n(N,{style:{margin:"12px 0"}}),n(_,null,{default:a(()=>[n(y,{type:"primary",size:"large",loading:e.loading.sync[e.guideTarget.name],onClick:t[27]||(t[27]=r=>e.oneClickCollect(e.guideTarget.name))},{default:a(()=>[i(s(e.collectActionLabel(e.guideTarget)),1)]),_:1},8,["loading"]),m("span",Ia,s(e.collectMode(e.guideTarget)==="file"?"选择导出/解密好的文件,自动入库":e.collectMode(e.guideTarget)==="sync"?"直接读取本机数据入库":"完成上述步骤后点此入库"),1)]),_:1})],64)):(l(),A(oe,{key:1,description:"该数据源暂无导入指引"}))]),_:1},8,["open","title"])])}const La=Ie(To,[["render",Ea],["__scopeId","data-v-92d13942"],["__file","/tmp/cc-web-panel-Egsevy/repo/packages/web-panel/src/views/PersonalDataHub.vue"]]);export{La as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{I as i,J as I,U,R as s,Q as r,c as t,K as a,V as _,S as x,o as oe,b as ee,r as u,P as p,F as ne,a2 as ge}from"./vendor-Bn1JzzAn.js";import{_ as we,b as re,u as ie,d}from"./index-BfOs_bmg.js";import{u as de}from"./useShellMode-CgR0wCYM.js";import{aN as ke,aO as Fe,aP as be,f as je,a5 as Ce,a8 as xe,at as Oe,R as Se}from"./icons-DG5UD-6K.js";const Pe={__name:"Projects",setup(se,{expose:l}){l();const{t:te}=re(),e=ie(),{isEmbedded:W}=de();async function w(o,f,ye,ae=8e3){if(W){const Z=await e.sendRaw({...f,type:o},ae);if(!Z?.ok){const $=Z?.error;throw new Error(typeof $=="string"?$:$?.message||`${o} failed`)}return Z.result}return e.executeJson(ye,ae)}const B=u(!1),y=u([]),O=u(""),S=u(""),P=u(!1),v=u(null),h=u([]),k=u(!1),E=u(!1),L=u(!1),F=u({name:"",description:"",type:"document",rootPath:""}),z=[{title:"ID",key:"id",width:110},{title:"名称",key:"name"},{title:"类型",key:"project_type",width:120},{title:"状态",key:"status",width:100},{title:"同步",key:"sync_status",width:100},{title:"更新",key:"updated_at",width:160},{title:"操作",key:"actions",width:180,fixed:"right"}],V=ee(()=>{const o={active:0,draft:0,completed:0,archived:0};for(const f of y.value)o[f.status]!==void 0&&(o[f.status]+=1);return o}),J=ee(()=>y.value.filter(o=>!(O.value&&o.status!==O.value||S.value&&!o.name.toLowerCase().includes(S.value.toLowerCase()))));function g(o){switch(o){case"active":return"green";case"draft":return"default";case"completed":return"cyan";case"archived":return"gold";default:return"default"}}function K(o){switch(o){case"synced":return"green";case"pending":return"orange";case"conflict":return"red";case"error":return"red";default:return"default"}}function Q(o){return!o&&o!==0?"-":new Date(typeof o=="number"?o:parseInt(o,10)).toLocaleString("zh-CN",{hour12:!1})}async function C(){B.value=!0;try{const o=await w("project.list",{limit:500},"project list --limit 500 --json",1e4);y.value=Array.isArray(o?.projects)?o.projects:Array.isArray(o)?o:[]}catch(o){d.error("加载失败: "+(o.message||o)),y.value=[]}finally{B.value=!1}}function G(o){return{onClick:()=>M(o)}}async function M(o){v.value=o,P.value=!0,k.value=!0,h.value=[];try{const f=await w("project.listFiles",{projectId:o.id,limit:200},`project list-files ${o.id} --json`,8e3);h.value=Array.isArray(f?.files)?f.files:[]}catch{h.value=[]}finally{k.value=!1}}async function H(o){try{(await w("project.delete",{id:o.id},`project delete ${o.id} --json`,8e3))?.ok?(d.success(`已删除项目 '${o.name}'`),P.value=!1,await C()):d.error("删除失败")}catch(f){d.error(f.message||String(f))}}function X(){F.value={name:"",description:"",type:"document",rootPath:""},E.value=!0}async function T(){if(!F.value.name.trim()){d.warning("请输入项目名称");return}L.value=!0;try{const o=await w("project.init",{name:F.value.name.trim(),description:F.value.description||null,projectType:F.value.type,rootPath:F.value.rootPath||null},`project init "${F.value.name.trim()}" --type ${F.value.type} --json`,8e3);o?.id?(d.success(`已创建项目 '${o.name}'`),E.value=!1,await C()):d.error("创建失败")}catch(o){d.error(o.message||String(o))}finally{L.value=!1}}const b=u(!1),D=u(!1),j=u({path:"",content:""}),A=u(!1),m=u(!1),R=u({path:""}),n=u(!1),c=u(null),q=u(""),Y=u(!1);function ue(){j.value={path:"",content:""},b.value=!0}function ce(){R.value={path:""},A.value=!0}async function N(){if(v.value){k.value=!0;try{const o=await w("project.listFiles",{projectId:v.value.id,limit:200},`project list-files ${v.value.id} --json`,8e3);h.value=Array.isArray(o?.files)?o.files:[]}catch(o){d.error("刷新文件失败: "+(o.message||o))}finally{k.value=!1}}}async function fe(){if(!j.value.path.trim()){d.warning("请输入文件路径");return}if(v.value){D.value=!0;try{const o=await w("project.createFile",{projectId:v.value.id,filePath:j.value.path.trim(),content:j.value.content||""},`project create-file ${v.value.id} "${j.value.path.trim()}" --json`,8e3);o?.id?(d.success(`已创建文件 '${o.file_name}'`),b.value=!1,await N(),await C()):d.error("创建文件失败")}catch(o){d.error(o.message||String(o))}finally{D.value=!1}}}async function pe(){if(!R.value.path.trim()){d.warning("请输入文件夹路径");return}if(v.value){m.value=!0;try{const o=await w("project.createFolder",{projectId:v.value.id,folderPath:R.value.path.trim()},`project create-folder ${v.value.id} "${R.value.path.trim()}" --json`,8e3);o?.id?(d.success(`已创建文件夹 '${o.file_name}'`),A.value=!1,await N(),await C()):d.error("创建文件夹失败")}catch(o){d.error(o.message||String(o))}finally{m.value=!1}}}async function ve(o){try{(await w("project.deleteFile",{fileId:o.id},`project delete-file ${o.id} --json`,8e3))?.deleted?(d.success(`已删除 '${o.file_name}'`),await N(),await C()):d.error("删除失败")}catch(f){d.error(f.message||String(f))}}async function me(o){if(o.is_folder){d.info("文件夹无内容可编辑");return}try{const f=await w("project.getFile",{fileId:o.id},`project get-file ${o.id} --json`,8e3);c.value=o,q.value=f?.content||"",n.value=!0}catch(f){d.error("读取文件失败: "+(f.message||f))}}async function _e(){if(c.value){Y.value=!0;try{(await w("project.writeFile",{fileId:c.value.id,content:q.value},`project write-file ${c.value.id} --json`,8e3))?.id?(d.success("已保存"),n.value=!1,await N()):d.error("保存失败")}catch(o){d.error(o.message||String(o))}finally{Y.value=!1}}}oe(()=>{C()});const le={t:te,ws:e,isEmbedded:W,callProjectTopic:w,loading:B,projects:y,statusFilter:O,nameFilter:S,detailOpen:P,detail:v,files:h,filesLoading:k,createOpen:E,creating:L,newProject:F,columns:z,countByStatus:V,filteredProjects:J,statusColor:g,syncColor:K,formatTime:Q,loadAll:C,onRowClick:G,openDetail:M,onDelete:H,onShowCreate:X,onCreate:T,createFileOpen:b,creatingFile:D,newFile:j,createFolderOpen:A,creatingFolder:m,newFolder:R,editFileOpen:n,editingFile:c,editFileContent:q,savingFile:Y,openCreateFile:ue,openCreateFolder:ce,refreshFiles:N,onCreateFile:fe,onCreateFolder:pe,onDeleteFile:ve,openEditFile:me,onSaveFile:_e,ref:u,computed:ee,onMounted:oe,get ReloadOutlined(){return Se},get PlusOutlined(){return Oe},get FolderOutlined(){return xe},get FileTextOutlined(){return Ce},get CheckCircleOutlined(){return je},get CheckSquareOutlined(){return be},get FileAddOutlined(){return Fe},get FolderAddOutlined(){return ke},get message(){return d},get useI18n(){return re},get useWsStore(){return ie},get useShellMode(){return de}};return Object.defineProperty(le,"__isScriptSetup",{enumerable:!1,value:!0}),le}},ze={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},Ae={class:"page-title"},Ie={class:"page-sub"},Ue={class:"filter-bar",style:{"margin-bottom":"12px",display:"flex",gap:"12px","align-items":"center"}},he={key:0,style:{"font-size":"12px",color:"#888"}},De={key:0,style:{color:"#888","font-size":"12px"}},Re={key:0},Te={key:1,style:{color:"#888"}},Be=["onClick"],Ee={key:0,style:{color:"#888","font-size":"12px"}};function Le(se,l,te,e,W,w){const B=i("router-link"),y=i("a-button"),O=i("a-space"),S=i("a-statistic"),P=i("a-card"),v=i("a-col"),h=i("a-row"),k=i("a-radio-button"),E=i("a-radio-group"),L=i("a-input-search"),F=i("a-alert"),z=i("a-tag"),V=i("a-popconfirm"),J=i("a-table"),g=i("a-descriptions-item"),K=i("a-descriptions"),Q=i("a-divider"),C=i("a-empty"),G=i("a-list-item"),M=i("a-list"),H=i("a-spin"),X=i("a-drawer"),T=i("a-input"),b=i("a-form-item"),D=i("a-textarea"),j=i("a-form"),A=i("a-modal"),m=i("a-select-option"),R=i("a-select");return p(),I("div",null,[U("div",ze,[U("div",null,[U("h2",Ae,s(e.t("projects.title")),1),U("p",Ie,[l[17]||(l[17]=r("桌面 / CLI / 手机 三端共享同一份项目数据,Phase 3d sync 自动同步 (",-1)),t(B,{to:"/project-init"},{default:a(()=>[...l[16]||(l[16]=[r("项目初始化 / 环境设置",-1)])]),_:1}),l[18]||(l[18]=r(")",-1))])]),t(O,null,{default:a(()=>[t(y,{loading:e.loading,onClick:e.loadAll},{icon:a(()=>[t(e.ReloadOutlined)]),default:a(()=>[l[19]||(l[19]=r(" 刷新 ",-1))]),_:1},8,["loading"]),t(y,{type:"primary",onClick:e.onShowCreate},{icon:a(()=>[t(e.PlusOutlined)]),default:a(()=>[l[20]||(l[20]=r(" 新建项目 ",-1))]),_:1})]),_:1})]),_(" Stats "),t(h,{gutter:[16,16],style:{"margin-bottom":"20px"}},{default:a(()=>[t(v,{xs:12,sm:8,lg:6},{default:a(()=>[t(P,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[t(S,{title:"总项目",value:e.projects.length,"value-style":{color:"#1677ff",fontSize:"20px"}},{prefix:a(()=>[t(e.FolderOutlined)]),_:1},8,["value"])]),_:1})]),_:1}),t(v,{xs:12,sm:8,lg:6},{default:a(()=>[t(P,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[t(S,{title:"活跃",value:e.countByStatus.active,"value-style":{color:"#52c41a",fontSize:"20px"}},{prefix:a(()=>[t(e.CheckCircleOutlined)]),_:1},8,["value"])]),_:1})]),_:1}),t(v,{xs:12,sm:8,lg:6},{default:a(()=>[t(P,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[t(S,{title:"草稿",value:e.countByStatus.draft,"value-style":{color:"#8c8c8c",fontSize:"20px"}},{prefix:a(()=>[t(e.FileTextOutlined)]),_:1},8,["value"])]),_:1})]),_:1}),t(v,{xs:12,sm:8,lg:6},{default:a(()=>[t(P,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[t(S,{title:"已完成",value:e.countByStatus.completed,"value-style":{color:"#13c2c2",fontSize:"20px"}},{prefix:a(()=>[t(e.CheckSquareOutlined)]),_:1},8,["value"])]),_:1})]),_:1})]),_:1}),_(" Filter "),U("div",Ue,[t(E,{value:e.statusFilter,"onUpdate:value":l[0]||(l[0]=n=>e.statusFilter=n),size:"small","button-style":"solid"},{default:a(()=>[t(k,{value:""},{default:a(()=>[...l[21]||(l[21]=[r("全部",-1)])]),_:1}),t(k,{value:"active"},{default:a(()=>[...l[22]||(l[22]=[r("活跃",-1)])]),_:1}),t(k,{value:"draft"},{default:a(()=>[...l[23]||(l[23]=[r("草稿",-1)])]),_:1}),t(k,{value:"completed"},{default:a(()=>[...l[24]||(l[24]=[r("已完成",-1)])]),_:1}),t(k,{value:"archived"},{default:a(()=>[...l[25]||(l[25]=[r("已归档",-1)])]),_:1})]),_:1},8,["value"]),t(L,{value:e.nameFilter,"onUpdate:value":l[1]||(l[1]=n=>e.nameFilter=n),placeholder:"按名称过滤",style:{"max-width":"260px"},"allow-clear":""},null,8,["value"])]),!e.projects.length&&!e.loading?(p(),x(F,{key:0,type:"info",message:"还没有项目",description:'运行 `cc project init <name>` 或点击右上角"新建项目"按钮创建。桌面 / CLI / 手机三端共享同一份数据。',"show-icon":"",style:{"margin-bottom":"16px"}})):_("v-if",!0),e.projects.length||e.loading?(p(),x(J,{key:1,columns:e.columns,"data-source":e.filteredProjects,loading:e.loading,pagination:{pageSize:20,showSizeChanger:!0},"row-key":"id","custom-row":e.onRowClick},{bodyCell:a(({column:n,record:c})=>[n.key==="id"?(p(),I("code",he,s(c.id.slice(0,8))+"…",1)):n.key==="name"?(p(),I(ne,{key:1},[U("strong",null,s(c.name),1),c.description?(p(),I("div",De,s(c.description),1)):_("v-if",!0)],64)):n.key==="project_type"?(p(),x(z,{key:2},{default:a(()=>[r(s(c.project_type),1)]),_:2},1024)):n.key==="status"?(p(),x(z,{key:3,color:e.statusColor(c.status)},{default:a(()=>[r(s(c.status),1)]),_:2},1032,["color"])):n.key==="sync_status"?(p(),x(z,{key:4,color:e.syncColor(c.sync_status)},{default:a(()=>[r(s(c.sync_status||"unknown"),1)]),_:2},1032,["color"])):n.key==="updated_at"?(p(),I(ne,{key:5},[r(s(e.formatTime(c.updated_at)),1)],64)):n.key==="actions"?(p(),x(O,{key:6,onClick:l[2]||(l[2]=ge(()=>{},["stop"]))},{default:a(()=>[t(y,{size:"small",onClick:q=>e.openDetail(c)},{default:a(()=>[...l[26]||(l[26]=[r("详情",-1)])]),_:1},8,["onClick"]),t(V,{title:`删除项目 '${c.name}' ?`,"ok-text":"删除","ok-type":"danger","cancel-text":"取消",onConfirm:q=>e.onDelete(c)},{default:a(()=>[t(y,{size:"small",danger:""},{default:a(()=>[...l[27]||(l[27]=[r("删除",-1)])]),_:1})]),_:1},8,["title","onConfirm"])]),_:2},1024)):_("v-if",!0)]),_:1},8,["data-source","loading"])):_("v-if",!0),_(" Detail drawer "),t(X,{open:e.detailOpen,"onUpdate:open":l[3]||(l[3]=n=>e.detailOpen=n),title:e.detail?.name||"项目详情",width:"640",placement:"right"},{default:a(()=>[e.detail?(p(),x(K,{key:0,column:1,bordered:"",size:"small"},{default:a(()=>[t(g,{label:"ID"},{default:a(()=>[U("code",null,s(e.detail.id),1)]),_:1}),t(g,{label:"名称"},{default:a(()=>[r(s(e.detail.name),1)]),_:1}),t(g,{label:"描述"},{default:a(()=>[r(s(e.detail.description||"-"),1)]),_:1}),t(g,{label:"类型"},{default:a(()=>[t(z,null,{default:a(()=>[r(s(e.detail.project_type),1)]),_:1})]),_:1}),t(g,{label:"状态"},{default:a(()=>[t(z,{color:e.statusColor(e.detail.status)},{default:a(()=>[r(s(e.detail.status),1)]),_:1},8,["color"])]),_:1}),t(g,{label:"同步状态"},{default:a(()=>[t(z,{color:e.syncColor(e.detail.sync_status)},{default:a(()=>[r(s(e.detail.sync_status||"unknown"),1)]),_:1},8,["color"])]),_:1}),t(g,{label:"用户"},{default:a(()=>[r(s(e.detail.user_id),1)]),_:1}),t(g,{label:"根路径"},{default:a(()=>[e.detail.root_path?(p(),I("code",Re,s(e.detail.root_path),1)):(p(),I("span",Te,"(无)"))]),_:1}),t(g,{label:"文件数"},{default:a(()=>[r(s(e.detail.file_count||0),1)]),_:1}),t(g,{label:"创建"},{default:a(()=>[r(s(e.formatTime(e.detail.created_at)),1)]),_:1}),t(g,{label:"更新"},{default:a(()=>[r(s(e.formatTime(e.detail.updated_at)),1)]),_:1})]),_:1})):_("v-if",!0),t(Q,null,{default:a(()=>[...l[28]||(l[28]=[r("文件",-1)])]),_:1}),_(" Sub-phase 7.3 (2026-05-17): 文件 CRUD toolbar "),t(O,{style:{"margin-bottom":"12px"}},{default:a(()=>[t(y,{size:"small",type:"primary",disabled:!e.detail,onClick:e.openCreateFile},{default:a(()=>[t(e.FileAddOutlined),l[29]||(l[29]=r(" 新建文件 ",-1))]),_:1},8,["disabled"]),t(y,{size:"small",disabled:!e.detail,onClick:e.openCreateFolder},{default:a(()=>[t(e.FolderAddOutlined),l[30]||(l[30]=r(" 新建文件夹 ",-1))]),_:1},8,["disabled"])]),_:1}),t(H,{spinning:e.filesLoading},{default:a(()=>[!e.files.length&&!e.filesLoading?(p(),x(C,{key:0,description:"无文件 (点上方按钮新建)"})):(p(),x(M,{key:1,size:"small","data-source":e.files},{renderItem:a(({item:n})=>[t(G,null,{extra:a(()=>[t(O,null,{default:a(()=>[n.file_size?(p(),I("span",Ee,s(n.file_size)+" B",1)):_("v-if",!0),t(V,{title:`删除 ${n.is_folder?"文件夹":"文件"} '${n.file_name}' ?`,"ok-text":"删除","ok-type":"danger","cancel-text":"取消",onConfirm:c=>e.onDeleteFile(n)},{default:a(()=>[t(y,{size:"small",danger:""},{default:a(()=>[...l[31]||(l[31]=[r("×",-1)])]),_:1})]),_:1},8,["title","onConfirm"])]),_:2},1024)]),default:a(()=>[U("span",{style:{cursor:"pointer"},onClick:c=>e.openEditFile(n)},s(n.is_folder?"📁":"📄")+" "+s(n.file_path),9,Be)]),_:2},1024)]),_:1},8,["data-source"]))]),_:1},8,["spinning"])]),_:1},8,["open","title"]),_(" Sub-phase 7.3: Create file modal "),t(A,{open:e.createFileOpen,"onUpdate:open":l[6]||(l[6]=n=>e.createFileOpen=n),title:"新建文件","confirm-loading":e.creatingFile,"ok-text":"创建","cancel-text":"取消",onOk:e.onCreateFile},{default:a(()=>[t(j,{layout:"vertical"},{default:a(()=>[t(b,{label:"文件路径(项目内)",required:""},{default:a(()=>[t(T,{value:e.newFile.path,"onUpdate:value":l[4]||(l[4]=n=>e.newFile.path=n),placeholder:"例如 README.md 或 src/main.kt"},null,8,["value"])]),_:1}),t(b,{label:"初始内容(可选)"},{default:a(()=>[t(D,{value:e.newFile.content,"onUpdate:value":l[5]||(l[5]=n=>e.newFile.content=n),rows:6,placeholder:"留空创建空文件"},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"]),_(" Sub-phase 7.3: Create folder modal "),t(A,{open:e.createFolderOpen,"onUpdate:open":l[8]||(l[8]=n=>e.createFolderOpen=n),title:"新建文件夹","confirm-loading":e.creatingFolder,"ok-text":"创建","cancel-text":"取消",onOk:e.onCreateFolder},{default:a(()=>[t(j,{layout:"vertical"},{default:a(()=>[t(b,{label:"文件夹路径(项目内)",required:""},{default:a(()=>[t(T,{value:e.newFolder.path,"onUpdate:value":l[7]||(l[7]=n=>e.newFolder.path=n),placeholder:"例如 src/utils"},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"]),_(" Sub-phase 7.3: Edit file content modal "),t(A,{open:e.editFileOpen,"onUpdate:open":l[10]||(l[10]=n=>e.editFileOpen=n),title:`编辑 ${e.editingFile?.file_name||""}`,"confirm-loading":e.savingFile,"ok-text":"保存","cancel-text":"取消",onOk:e.onSaveFile,width:"720"},{default:a(()=>[t(D,{value:e.editFileContent,"onUpdate:value":l[9]||(l[9]=n=>e.editFileContent=n),rows:18,"auto-size":{minRows:12,maxRows:24},style:{"font-family":"monospace"}},null,8,["value"])]),_:1},8,["open","title","confirm-loading"]),_(" Create modal "),t(A,{open:e.createOpen,"onUpdate:open":l[15]||(l[15]=n=>e.createOpen=n),title:"新建项目","confirm-loading":e.creating,"ok-text":"创建","cancel-text":"取消",onOk:e.onCreate},{default:a(()=>[t(j,{layout:"vertical"},{default:a(()=>[t(b,{label:"项目名称",required:""},{default:a(()=>[t(T,{value:e.newProject.name,"onUpdate:value":l[11]||(l[11]=n=>e.newProject.name=n),placeholder:"例如:旅行计划-上海"},null,8,["value"])]),_:1}),t(b,{label:"描述"},{default:a(()=>[t(D,{value:e.newProject.description,"onUpdate:value":l[12]||(l[12]=n=>e.newProject.description=n),rows:2},null,8,["value"])]),_:1}),t(b,{label:"类型"},{default:a(()=>[t(R,{value:e.newProject.type,"onUpdate:value":l[13]||(l[13]=n=>e.newProject.type=n)},{default:a(()=>[t(m,{value:"document"},{default:a(()=>[...l[32]||(l[32]=[r("文档 (document)",-1)])]),_:1}),t(m,{value:"data"},{default:a(()=>[...l[33]||(l[33]=[r("数据 (data)",-1)])]),_:1}),t(m,{value:"web"},{default:a(()=>[...l[34]||(l[34]=[r("Web",-1)])]),_:1}),t(m,{value:"app"},{default:a(()=>[...l[35]||(l[35]=[r("应用 (app)",-1)])]),_:1}),t(m,{value:"presentation"},{default:a(()=>[...l[36]||(l[36]=[r("演示文稿",-1)])]),_:1}),t(m,{value:"spreadsheet"},{default:a(()=>[...l[37]||(l[37]=[r("表格",-1)])]),_:1}),t(m,{value:"design"},{default:a(()=>[...l[38]||(l[38]=[r("设计",-1)])]),_:1}),t(m,{value:"code"},{default:a(()=>[...l[39]||(l[39]=[r("代码",-1)])]),_:1}),t(m,{value:"workflow"},{default:a(()=>[...l[40]||(l[40]=[r("工作流",-1)])]),_:1}),t(m,{value:"knowledge"},{default:a(()=>[...l[41]||(l[41]=[r("知识库",-1)])]),_:1})]),_:1},8,["value"])]),_:1}),t(b,{label:"根路径 (可选)"},{default:a(()=>[t(T,{value:e.newProject.rootPath,"onUpdate:value":l[14]||(l[14]=n=>e.newProject.rootPath=n),placeholder:"留空则仅元数据"},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"])])}const We=we(Pe,[["render",Le],["__scopeId","data-v-019ac5aa"],["__file","/tmp/cc-web-panel-Egsevy/repo/packages/web-panel/src/views/Projects.vue"]]);export{We as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{E,b as w,r as b,I as m,J as y,U as a,R as g,c as i,K as u,V as h,F as C,Z as L,N as O,o as M,P as p,Q as v,S as R}from"./vendor-Bn1JzzAn.js";import{u as I,_ as q}from"./index-BfOs_bmg.js";import{u as N}from"./useShellMode-CgR0wCYM.js";import{p as P}from"./parsers-UEvh_ShA.js";import{u as z}from"./chat-DYd-X7Wg.js";import{aa as V,aq as j,R as B}from"./icons-DG5UD-6K.js";const A=E("skills",()=>{const _=b(!1),t=b([]),n=b(""),e=b("all"),k=w(()=>{const o=new Set(["all"]);return t.value.forEach(l=>{l.category&&o.add(l.category),l.executionMode&&o.add(l.executionMode)}),[...o]}),S=w(()=>{let o=t.value;if(e.value!=="all"&&(o=o.filter(l=>l.category===e.value||l.executionMode===e.value)),n.value){const l=n.value.toLowerCase();o=o.filter(d=>d.name?.toLowerCase().includes(l)||d.description?.toLowerCase().includes(l)||d.title?.toLowerCase().includes(l))}return o});async function f(){const o=I();_.value=!0;try{if(N().isEmbedded){const c=await o.sendRaw({type:"skill.list"},2e4);c?.ok&&Array.isArray(c.result?.skills)?t.value=c.result.skills:(console.error("skill.list custom topic failed:",c?.error),t.value=[]);return}const{output:l}=await o.execute("skill list",2e4),d=P(l);t.value=d}catch(l){console.error("Failed to load skills:",l)}finally{_.value=!1}}return{loading:_,allSkills:t,searchQuery:n,selectedCategory:e,categories:k,filteredSkills:S,loadSkills:f}}),F={__name:"Skills",setup(_,{expose:t}){t();const n=A(),e=z(),k=O(),S=w(()=>n.categories.filter(r=>r!=="all").slice(0,6));function f(r){return{"built-in":"内置","cli-direct":"CLI",agent:"Agent","llm-query":"LLM",hybrid:"混合",workspace:"工作区",marketplace:"市场"}[r]||r}function o(r){return{"cli-direct":"CLI",agent:"Agent","llm-query":"LLM",hybrid:"混合","built-in":"内置"}[r]||r||"未知"}function l(r){return{"cli-direct":"cyan",agent:"purple","llm-query":"blue",hybrid:"orange","built-in":"green"}[r]||"default"}async function d(r){await e.createSession("agent"),k.push("/chat"),setTimeout(()=>{e.currentSessionId&&e.sendMessage(e.currentSessionId,`/skill run ${r}`)},300)}M(()=>{n.allSkills.length||n.loadSkills()});const c={skillsStore:n,chatStore:e,router:k,displayCategories:S,catLabel:f,modeLabel:o,modeColor:l,runSkill:d,computed:w,onMounted:M,get useRouter(){return O},get ReloadOutlined(){return B},get PlayCircleOutlined(){return j},get AppstoreOutlined(){return V},get useSkillsStore(){return A},get useChatStore(){return z}};return Object.defineProperty(c,"__isScriptSetup",{enumerable:!1,value:!0}),c}},Q={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},U={class:"page-sub"},T={style:{display:"flex",gap:"12px","margin-bottom":"20px","flex-wrap":"wrap"}},D={key:0,style:{"text-align":"center",padding:"60px"}},G={class:"skills-grid"},J={style:{display:"flex","justify-content":"space-between","align-items":"flex-start"}},K={style:{flex:"1","min-width":"0"}},W={style:{"font-weight":"500",color:"#e0e0e0","font-size":"14px","margin-bottom":"4px","font-family":"monospace"}},Z={style:{color:"var(--text-secondary)","font-size":"12px","line-height":"1.5"}},H={style:{"margin-left":"12px","flex-shrink":"0"}},X={style:{"margin-top":"10px",display:"flex","justify-content":"flex-end"}},Y={style:{"text-align":"center",padding:"60px",color:"var(--text-muted)"}};function $(_,t,n,e,k,S){const f=m("a-button"),o=m("a-input-search"),l=m("a-radio-button"),d=m("a-radio-group"),c=m("a-spin"),r=m("a-tag"),x=m("a-card");return p(),y("div",null,[a("div",Q,[a("div",null,[t[3]||(t[3]=a("h2",{class:"page-title"},"技能管理",-1)),a("p",U,g(e.skillsStore.allSkills.length)+" 个可用技能",1)]),i(f,{type:"primary",ghost:"",loading:e.skillsStore.loading,onClick:t[0]||(t[0]=s=>e.skillsStore.loadSkills())},{icon:u(()=>[i(e.ReloadOutlined)]),default:u(()=>[t[4]||(t[4]=v(" 刷新 ",-1))]),_:1},8,["loading"])]),h(" Search & Filter "),a("div",T,[i(o,{value:e.skillsStore.searchQuery,"onUpdate:value":t[1]||(t[1]=s=>e.skillsStore.searchQuery=s),placeholder:"搜索技能名称或描述...",style:{width:"300px"},"allow-clear":""},null,8,["value"]),i(d,{value:e.skillsStore.selectedCategory,"onUpdate:value":t[2]||(t[2]=s=>e.skillsStore.selectedCategory=s),"button-style":"solid"},{default:u(()=>[i(l,{value:"all"},{default:u(()=>[...t[5]||(t[5]=[v("全部",-1)])]),_:1}),(p(!0),y(C,null,L(e.displayCategories,s=>(p(),R(l,{key:s,value:s},{default:u(()=>[v(g(e.catLabel(s)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),h(" Loading State "),e.skillsStore.loading?(p(),y("div",D,[i(c,{size:"large"}),t[6]||(t[6]=a("div",{style:{color:"var(--text-muted)","margin-top":"12px"}},"加载技能中...",-1))])):e.skillsStore.filteredSkills.length?(p(),y(C,{key:1},[h(" Skills Grid "),a("div",G,[(p(!0),y(C,null,L(e.skillsStore.filteredSkills,s=>(p(),R(x,{key:s.name,class:"skill-card",size:"small",hoverable:"",style:{background:"var(--bg-card)","border-color":"var(--border-color)",cursor:"default"}},{default:u(()=>[a("div",J,[a("div",K,[a("div",W,g(s.name),1),a("div",Z,g(s.description||"暂无描述"),1)]),a("div",H,[i(r,{color:e.modeColor(s.executionMode),style:{"font-size":"10px"}},{default:u(()=>[v(g(e.modeLabel(s.executionMode)),1)]),_:2},1032,["color"])])]),a("div",X,[i(f,{size:"small",type:"primary",ghost:"",onClick:ee=>e.runSkill(s.name)},{icon:u(()=>[i(e.PlayCircleOutlined)]),default:u(()=>[t[7]||(t[7]=v(" 运行 ",-1))]),_:1},8,["onClick"])])]),_:2},1024))),128))])],2112)):(p(),y(C,{key:2},[h(" Empty State "),a("div",Y,[i(e.AppstoreOutlined,{style:{"font-size":"48px","margin-bottom":"16px",display:"block"}}),a("div",null,g(e.skillsStore.allSkills.length?"没有匹配的技能":"点击刷新加载技能列表"),1)])],2112))])}const ie=q(F,[["render",$],["__scopeId","data-v-d64d43f5"],["__file","/tmp/cc-web-panel-Egsevy/repo/packages/web-panel/src/views/Skills.vue"]]);export{ie as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{E,b as D,r as R,I as p,J as c,U as _,c as n,K as a,S as C,V as x,o as I,x as V,P as i,Q as k,R as r,F as T,Z as F}from"./vendor-Bn1JzzAn.js";import{u as P,_ as O}from"./index-BfOs_bmg.js";import{R as U}from"./icons-DG5UD-6K.js";const B=E("tasks",()=>{const y=R([]),l=R(!1);let u=null,t=null,d=null;const b=D(()=>y.value.filter(e=>e.status==="running")),v=D(()=>y.value.filter(e=>e.status==="pending")),w=D(()=>y.value.filter(e=>e.status==="completed"||e.status==="failed"||e.status==="timeout"));async function s(){const e=P();l.value=!0;try{const g=await e.sendRaw({type:"tasks-list"});g&&Array.isArray(g.tasks)&&(y.value=g.tasks)}catch{}finally{l.value=!1}}async function m(e){const g=P();try{await g.sendRaw({type:"tasks-stop",taskId:e})}catch{}finally{await s()}}const f=R(null);function h(e=5e3){N(),s(),u=setInterval(s,e),S()}function N(){u&&(clearInterval(u),u=null),t&&(t(),t=null),d&&(clearTimeout(d),d=null)}function S(){const e=P();if(t)return;const g=z=>{z.type==="task:notification"&&z.payload?.task&&(f.value=z.payload.task,s(),d&&clearTimeout(d),d=setTimeout(()=>{f.value=null,d=null},8e3))};t=e.onRuntimeEvent(g)}function A(e){return!e||e<0?"-":e<1e3?`${e}ms`:e<6e4?`${(e/1e3).toFixed(1)}s`:`${(e/6e4).toFixed(1)}m`}function o(e){switch(e){case"running":return"processing";case"pending":return"default";case"completed":return"success";case"failed":return"error";case"timeout":return"warning";default:return"default"}}return{tasks:y,loading:l,running:b,pending:v,completed:w,lastNotification:f,fetchTasks:s,stopTask:m,startPolling:h,stopPolling:N,formatDuration:A,getStatusColor:o}}),L={__name:"Tasks",setup(y,{expose:l}){l();const u=B(),t=[{title:"状态",key:"status",width:90},{title:"描述",key:"description",ellipsis:!0},{title:"类型",dataIndex:"type",width:100},{title:"耗时",key:"duration",width:90},{title:"创建时间",key:"createdAt",width:180},{title:"结果",key:"result",ellipsis:!0},{title:"操作",key:"action",width:80}];function d(s){return s.status==="running"&&s.startedAt?u.formatDuration(Date.now()-s.startedAt):s.completedAt&&s.startedAt?u.formatDuration(s.completedAt-s.startedAt):"-"}function b(s){return s?new Date(s).toLocaleString():"-"}function v(s,m){return s?s.length>m?`${s.slice(0,m)}...`:s:""}I(()=>u.startPolling(5e3)),V(()=>u.stopPolling());const w={store:u,columns:t,getDuration:d,formatTime:b,truncate:v,onMounted:I,onUnmounted:V,get ReloadOutlined(){return U},get useTasksStore(){return B}};return Object.defineProperty(w,"__isScriptSetup",{enumerable:!1,value:!0}),w}},j={class:"page-header"},J={key:0,class:"error-text"},K={key:1},M={class:"task-header"},Q={class:"task-desc"},W={class:"task-id"},Z={class:"task-meta"},q=["title"],G={key:0,class:"error-text"},H={key:1,class:"success-text"},X={key:2,class:"muted-text"};function Y(y,l,u,t,d,b){const v=p("a-button"),w=p("a-space"),s=p("a-alert"),m=p("a-statistic"),f=p("a-card"),h=p("a-col"),N=p("a-row"),S=p("a-tag"),A=p("a-table");return i(),c("div",null,[_("div",j,[l[3]||(l[3]=_("div",null,[_("h2",{class:"page-title"},"后台任务"),_("p",{class:"page-sub"},"查看后台任务队列、实时通知和任务执行结果。")],-1)),n(w,null,{default:a(()=>[n(v,{ghost:"",loading:t.store.loading,onClick:l[0]||(l[0]=o=>t.store.fetchTasks())},{icon:a(()=>[n(t.ReloadOutlined)]),default:a(()=>[l[2]||(l[2]=k(" 刷新 ",-1))]),_:1},8,["loading"])]),_:1})]),t.store.lastNotification?(i(),C(s,{key:0,type:t.store.lastNotification.status==="completed"?"success":"error","show-icon":"",closable:"",class:"banner",onClose:l[1]||(l[1]=o=>t.store.lastNotification=null)},{message:a(()=>[k(" 任务"+r(t.store.lastNotification.status==="completed"?"完成":"结束")+": "+r(t.store.lastNotification.description||t.store.lastNotification.id.slice(0,16)),1)]),description:a(()=>[t.store.lastNotification.error?(i(),c("span",J,r(t.store.lastNotification.error),1)):t.store.lastNotification.result?(i(),c("span",K,r(t.truncate(String(t.store.lastNotification.result),120)),1)):x("v-if",!0)]),_:1},8,["type"])):x("v-if",!0),n(N,{gutter:[16,16],class:"stats-row"},{default:a(()=>[n(h,{xs:12,sm:6},{default:a(()=>[n(f,{class:"stat-card",size:"small"},{default:a(()=>[n(m,{title:"全部任务",value:t.store.tasks.length},null,8,["value"])]),_:1})]),_:1}),n(h,{xs:12,sm:6},{default:a(()=>[n(f,{class:"stat-card",size:"small"},{default:a(()=>[n(m,{title:"运行中",value:t.store.running.length},null,8,["value"])]),_:1})]),_:1}),n(h,{xs:12,sm:6},{default:a(()=>[n(f,{class:"stat-card",size:"small"},{default:a(()=>[n(m,{title:"等待中",value:t.store.pending.length},null,8,["value"])]),_:1})]),_:1}),n(h,{xs:12,sm:6},{default:a(()=>[n(f,{class:"stat-card",size:"small"},{default:a(()=>[n(m,{title:"已完成",value:t.store.completed.length},null,8,["value"])]),_:1})]),_:1})]),_:1}),t.store.running.length>0?(i(),C(f,{key:1,title:"运行中的任务",class:"panel-card",size:"small"},{default:a(()=>[(i(!0),c(T,null,F(t.store.running,o=>(i(),c("div",{key:o.id,class:"task-item running"},[_("div",M,[n(S,{color:t.store.getStatusColor(o.status)},{default:a(()=>[k(r(o.status.toUpperCase()),1)]),_:2},1032,["color"]),_("span",Q,r(o.description),1),_("span",W,r(o.id.slice(0,16)),1)]),_("div",Z,[_("span",null,"类型: "+r(o.type||"-"),1),_("span",null,"已运行: "+r(t.store.formatDuration(Date.now()-o.startedAt)),1),n(v,{size:"small",danger:"",onClick:e=>t.store.stopTask(o.id)},{default:a(()=>[...l[4]||(l[4]=[k("停止",-1)])]),_:1},8,["onClick"])])]))),128))]),_:1})):x("v-if",!0),n(f,{class:"panel-card"},{default:a(()=>[n(A,{columns:t.columns,"data-source":t.store.tasks,pagination:{pageSize:15,size:"small"},loading:t.store.loading,"row-key":"id",size:"small"},{bodyCell:a(({column:o,record:e})=>[o.key==="status"?(i(),C(S,{key:0,color:t.store.getStatusColor(e.status)},{default:a(()=>[k(r(e.status),1)]),_:2},1032,["color"])):o.key==="description"?(i(),c("span",{key:1,title:e.command},r(e.description),9,q)):o.key==="duration"?(i(),c(T,{key:2},[k(r(t.getDuration(e)),1)],64)):o.key==="createdAt"?(i(),c(T,{key:3},[k(r(t.formatTime(e.createdAt)),1)],64)):o.key==="result"?(i(),c(T,{key:4},[e.error?(i(),c("span",G,r(t.truncate(e.error,60)),1)):e.result?(i(),c("span",H,r(t.truncate(String(e.result),60)),1)):(i(),c("span",X,"-"))],64)):o.key==="action"?(i(),c(T,{key:5},[e.status==="running"?(i(),C(v,{key:0,size:"small",danger:"",onClick:g=>t.store.stopTask(e.id)},{default:a(()=>[...l[5]||(l[5]=[k(" 停止 ",-1)])]),_:1},8,["onClick"])):x("v-if",!0)],64)):x("v-if",!0)]),_:1},8,["data-source","loading"])]),_:1})])}const st=O(L,[["render",Y],["__scopeId","data-v-da5ff6a2"],["__file","/tmp/cc-web-panel-Egsevy/repo/packages/web-panel/src/views/Tasks.vue"]]);export{st as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{Q as r}from"./index-BfOs_bmg.js";const o=((n,a,e)=>{r(n,`[ant-design-vue: ${a}] ${e}`)});export{o as d};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{C as o}from"./Col-DNO73qp7.js";import{a0 as t}from"./index-BfOs_bmg.js";import"./vendor-Bn1JzzAn.js";import"./index-CVZWiUE_.js";import"./icons-DG5UD-6K.js";const s=t(o);export{s as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{A as o}from"./Row-Ctb4oiYN.js";import{a0 as t}from"./index-BfOs_bmg.js";import"./vendor-Bn1JzzAn.js";import"./responsiveObserve-D7x_GDgD.js";import"./useFlexGapSupport-Bken4aNE.js";import"./styleChecker-B4dGrdD9.js";import"./index-CVZWiUE_.js";import"./icons-DG5UD-6K.js";const l=t(o);export{l as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{u as f}from"./index-BfOs_bmg.js";function d(n){if(!n)return n;if(n.error)throw new Error(n.error);return n.result!==void 0?n.result:n}function p(n,t,a,e,r){return typeof n.onMessage!="function"||typeof n.sendRaw!="function"?n.sendRaw({type:t,...a},r).then(d):new Promise((u,s)=>{const l=typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():`${Date.now()}-${Math.random().toString(36).slice(2)}`,w=`${t}.event`,g=`${t}.end`;let c=!1,y=()=>{};const o=(i,b)=>{if(!c){c=!0,clearTimeout(m);try{y()}catch{}i(b)}},m=setTimeout(()=>{o(s,new Error(`stream timeout (${r}ms): ${t}`))},r),h=n.onMessage(i=>{if(!(c||!i)&&!(i.id!==l&&i.requestId!==l)){if(i.type===w){if(typeof e=="function")try{e(i.event||i)}catch{}return}if(i.type===g){o(u,d(i));return}i.type==="error"&&o(s,new Error(i.message||"stream error"))}});y=typeof h=="function"?h:()=>{},Promise.resolve(n.sendRaw({id:l,type:t,...a},r)).catch(()=>{})})}function D(){const n=f(),t=(a,e={},r=3e4)=>n.sendRaw({type:a,...e},r).then(d);return{async health(){return await t("personal-data-hub.health",{},8e3)},async stats(){return await t("personal-data-hub.stats",{},8e3)},async listAdapters(){return await t("personal-data-hub.list-adapters",{},5e3)},async pickFile(a={}){try{const e=await n.sendRaw({type:"fs.openDialog",title:a.title,filters:a.filters},6e4),r=e&&e.result!==void 0?e.result:e;return r&&r.ok&&typeof r.filePath=="string"?r.filePath:null}catch{return null}},async adapterReadiness(a){return await t("personal-data-hub.adapter-readiness",Number.isInteger(a)?{timeoutMs:a}:{},15e3)},async syncAdapter(a,e={}){return await t("personal-data-hub.sync-adapter",{name:a,options:e},12e4)},async syncAll(a={}){return await t("personal-data-hub.sync-all",{options:a},6e5)},async registerMock({name:a="mock",count:e=20,seed:r=1}={}){return await t("personal-data-hub.register-mock",{name:a,count:e,seed:r})},async unregister(a){return await t("personal-data-hub.unregister",{name:a})},async ask(a,e={}){return await t("personal-data-hub.ask",{question:a,options:e},18e4)},async queryEvents(a={}){return await t("personal-data-hub.query-events",a,1e4)},async recentAudit(a={}){return await t("personal-data-hub.recent-audit",a,1e4)},async searchEvents(a={}){return await t("personal-data-hub.search-events",a,15e3)},async facetCounts(a={}){return await t("personal-data-hub.facet-counts",a,1e4)},async testEmailAuth(a){return await t("personal-data-hub.test-email-auth",{account:a},3e4)},async registerEmail(a,e={}){return await t("personal-data-hub.register-email",{account:a,opts:e},15e3)},async unregisterEmail(a){return await t("personal-data-hub.unregister-email",{email:a},5e3)},async listEmailAccounts(){return await t("personal-data-hub.list-email-accounts",{},5e3)},async eventDetail(a){return await t("personal-data-hub.event-detail",{eventId:a},5e3)},async syncAdapterStream(a,e={},r){return await p(n,"personal-data-hub.sync-adapter-stream",{name:a,options:e},r,6e5)},async syncAllStream(a={},e){return await p(n,"personal-data-hub.sync-all-stream",{options:a},e,9e5)},async registerAlipay(a,e={}){return await t("personal-data-hub.register-alipay",{account:a,opts:e},15e3)},async unregisterAlipay(a){return await t("personal-data-hub.unregister-alipay",{email:a},5e3)},async listAlipayAccounts(){return await t("personal-data-hub.list-alipay-accounts",{},5e3)},async importAlipayBill({zipPath:a,csvPath:e,zipPassword:r}={}){return await t("personal-data-hub.import-alipay-bill",{zipPath:a,csvPath:e,zipPassword:r},3e5)},async reviewQueueList(a=50){return await t("personal-data-hub.review-queue-list",{limit:a},5e3)},async reviewDecision(a,e){return await t("personal-data-hub.review-decision",{reviewId:a,decision:e},5e3)},async manualMerge(a,e){return await t("personal-data-hub.manual-merge",{aId:a,bId:e},5e3)},async manualUnmerge(a){return await t("personal-data-hub.manual-unmerge",{personId:a},5e3)},async resolverDrain(a=50){return await t("personal-data-hub.resolver-drain",{limit:a},18e4)},async resolverStats(){return await t("personal-data-hub.resolver-stats",{},5e3)},async skillsList(){return await t("personal-data-hub.skills-list",{},5e3)},async runSkill(a,e={}){return await t("personal-data-hub.run-skill",{name:a,options:e},12e4)},async openAichatLogin(a,e={}){return await t("personal-data-hub.aichat-open-login",{vendor:a,opts:e},1e4)},async probeAichatCookies(a,e){return await t("personal-data-hub.aichat-probe-cookies",{vendor:a,cookieHeader:e},1e4)},async registerAichatVendor(a,e,r={}){return await t("personal-data-hub.aichat-register-vendor",{vendor:a,cookies:e,opts:r},3e4)},async rotateAichatLogin(a){return await t("personal-data-hub.aichat-rotate-login",{vendor:a},1e4)},async listAichatAccounts(){return await t("personal-data-hub.list-aichat-accounts",{},5e3)},async unregisterAichat(a){return await t("personal-data-hub.unregister-aichat",{vendor:a},5e3)},async aichatHealthCheckOnce(){return await t("personal-data-hub.aichat-health-check-once",{},3e4)},async probeWechatEnv(){return await t("personal-data-hub.wechat-env-probe",{},15e3)},async registerWechat({account:a,dbPath:e,wechatDataPath:r,fridaOpts:u,keyProviderOverride:s}={}){return await t("personal-data-hub.register-wechat",{account:a,dbPath:e,wechatDataPath:r,fridaOpts:u,keyProviderOverride:s},45e3)},async listWechatAccounts(){return await t("personal-data-hub.list-wechat-accounts",{},5e3)},async unregisterWechat(a){return await t("personal-data-hub.unregister-wechat",{uin:a},5e3)},async bilibiliAdbSync(a={}){return await t("personal-data-hub.bilibili-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},12e4)},async bilibiliAdbDoctor(){return await t("personal-data-hub.bilibili-adb-doctor",{},15e3)},async weiboAdbSync(a={}){return await t("personal-data-hub.weibo-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},6e4)},async xhsAdbSync(a={}){return await t("personal-data-hub.xhs-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},6e4)},async toutiaoAdbSync(a={}){return await t("personal-data-hub.toutiao-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},9e4)},async kuaishouAdbSync(a={}){return await t("personal-data-hub.kuaishou-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},12e4)},async bridgeDoctor(){return await t("personal-data-hub.bridge-doctor",{},6e4)},async douyinAdbSync(a={}){return await t("personal-data-hub.douyin-adb-sync",{uid:a.uid,limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},6e4)}}}export{D as u};
|