chainlesschain 0.159.0 → 0.161.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/assets/web-panel/.build-hash +1 -1
- package/src/assets/web-panel/assets/AIOps-Cchx1iXI.css +1 -0
- package/src/assets/web-panel/assets/AIOps-CoZ9bIqF.js +1 -0
- package/src/assets/web-panel/assets/ActionButton-BvMi4awy.js +1 -0
- package/src/assets/web-panel/assets/Analytics-C1-TXmTC.css +1 -0
- package/src/assets/web-panel/assets/Analytics-hRk2ziup.js +3 -0
- package/src/assets/web-panel/assets/AppLayout-CtGprHSx.css +1 -0
- package/src/assets/web-panel/assets/AppLayout-_JR3Gko8.js +1 -0
- package/src/assets/web-panel/assets/Audit-6ZMsXmrO.css +1 -0
- package/src/assets/web-panel/assets/Audit-D8WmaHdX.js +1 -0
- package/src/assets/web-panel/assets/Backup-CY9QozR7.css +1 -0
- package/src/assets/web-panel/assets/Backup-CogYVeiE.js +1 -0
- package/src/assets/web-panel/assets/BaseInput-NAp5_OPY.js +1 -0
- package/src/assets/web-panel/assets/{Chat-DmX5bWvL.css → Chat-ByiYUboW.css} +1 -1
- package/src/assets/web-panel/assets/Chat-DkQnhjfk.js +2 -0
- package/src/assets/web-panel/assets/Checkbox-C9dkWb-7.js +1 -0
- package/src/assets/web-panel/assets/Codegen-BHyJ3j-p.js +1 -0
- package/src/assets/web-panel/assets/Codegen-BLP7id2a.css +1 -0
- package/src/assets/web-panel/assets/Col-JyQOivHb.js +1 -0
- package/src/assets/web-panel/assets/Community-C2RejeOY.css +1 -0
- package/src/assets/web-panel/assets/Community-UMq5QuBA.js +1 -0
- package/src/assets/web-panel/assets/Compact-DGlwooBJ.js +1 -0
- package/src/assets/web-panel/assets/Compliance-2rWGO55k.js +1 -0
- package/src/assets/web-panel/assets/Compliance-DOys4Ov1.css +1 -0
- package/src/assets/web-panel/assets/{Cowork-CFkkMMDK.js → Cowork-V-tDxtrt.js} +4 -4
- package/src/assets/web-panel/assets/Cron-YgEeQvdV.js +2 -0
- package/src/assets/web-panel/assets/Crosschain-C7Le4Pte.css +1 -0
- package/src/assets/web-panel/assets/Crosschain-Cgd5cRKn.js +1 -0
- package/src/assets/web-panel/assets/DID-BX6k3jZi.css +1 -0
- package/src/assets/web-panel/assets/DID-swdBCdMZ.js +2 -0
- package/src/assets/web-panel/assets/Dashboard-ClnWtxsT.js +3 -0
- package/src/assets/web-panel/assets/Dashboard-MFDcsVcM.css +1 -0
- package/src/assets/web-panel/assets/Dropdown-mlITwb7d.js +1 -0
- package/src/assets/web-panel/assets/Federation-CgmfLbx1.css +1 -0
- package/src/assets/web-panel/assets/Federation-DtUN3wQa.js +1 -0
- package/src/assets/web-panel/assets/{FormItemContext-Be6TSNxz.js → FormItemContext-BYmWDwAT.js} +1 -1
- package/src/assets/web-panel/assets/{Git-DGcuBXST.css → Git-DPuaGtg7.css} +1 -1
- package/src/assets/web-panel/assets/Git-Du1k1iHz.js +2 -0
- package/src/assets/web-panel/assets/Governance-B2TFaWsf.js +1 -0
- package/src/assets/web-panel/assets/Governance-BoipmXaM.css +1 -0
- package/src/assets/web-panel/assets/Inference-BWxYJF9-.css +1 -0
- package/src/assets/web-panel/assets/Inference-Cm_hmXla.js +1 -0
- package/src/assets/web-panel/assets/KnowledgeGraph-CztPDA96.css +1 -0
- package/src/assets/web-panel/assets/KnowledgeGraph-DLaLMo4r.js +1 -0
- package/src/assets/web-panel/assets/Logs-CElvIBBJ.js +2 -0
- package/src/assets/web-panel/assets/Marketplace-BlR3RCDV.js +1 -0
- package/src/assets/web-panel/assets/Marketplace-Djp5q9dS.css +1 -0
- package/src/assets/web-panel/assets/McpTools-BpHkrlka.js +5 -0
- package/src/assets/web-panel/assets/McpTools-CDjHmzxH.css +1 -0
- package/src/assets/web-panel/assets/Memory-Bcc2hxOA.css +1 -0
- package/src/assets/web-panel/assets/Memory-DeU9ys_m.js +2 -0
- package/src/assets/web-panel/assets/Mtc-CCJZpnJo.js +6 -0
- package/src/assets/web-panel/assets/Mtc-Cc8OJxe_.css +1 -0
- package/src/assets/web-panel/assets/NLProgramming-B_Tie6j1.js +1 -0
- package/src/assets/web-panel/assets/NLProgramming-CLOvy-35.css +1 -0
- package/src/assets/web-panel/assets/Notes-BcpuirPj.js +7 -0
- package/src/assets/web-panel/assets/Organization-BX-cIO8M.css +1 -0
- package/src/assets/web-panel/assets/Organization-B_SHESSc.js +4 -0
- package/src/assets/web-panel/assets/Overflow-R2SOGT0l.js +1 -0
- package/src/assets/web-panel/assets/{OverrideContext-GHsJf9ok.js → OverrideContext-Nubhv68k.js} +1 -1
- package/src/assets/web-panel/assets/P2P-Cx88UaiD.css +1 -0
- package/src/assets/web-panel/assets/P2P-IYYy3cEd.js +2 -0
- package/src/assets/web-panel/assets/Permissions-CR1N42yW.js +4 -0
- package/src/assets/web-panel/assets/Pipeline-DxkXqrH2.css +1 -0
- package/src/assets/web-panel/assets/Pipeline-nwFpKsU_.js +1 -0
- package/src/assets/web-panel/assets/Privacy-BGpz72PX.js +1 -0
- package/src/assets/web-panel/assets/Privacy-CrsfSFKd.css +1 -0
- package/src/assets/web-panel/assets/ProjectSettings-CEDhpgbs.js +2 -0
- package/src/assets/web-panel/assets/Projects-B5IgXt-x.css +1 -0
- package/src/assets/web-panel/assets/Projects-DABi6ylb.js +2 -0
- package/src/assets/web-panel/assets/Providers-HzrcE8ma.js +2 -0
- package/src/assets/web-panel/assets/QuickAsk-6FgX9DC6.js +1 -0
- package/src/assets/web-panel/assets/Recommend-BPhQwye7.js +1 -0
- package/src/assets/web-panel/assets/Recommend-CH6wKzGo.css +1 -0
- package/src/assets/web-panel/assets/Reputation-BL6hTN1s.js +1 -0
- package/src/assets/web-panel/assets/Reputation-D6VPNEd0.css +1 -0
- package/src/assets/web-panel/assets/Row-2akLU3YS.js +1 -0
- package/src/assets/web-panel/assets/RssFeed-D6qNq6Ht.js +3 -0
- package/src/assets/web-panel/assets/Search-B6RalzTB.css +1 -0
- package/src/assets/web-panel/assets/Search-R_b-u9oL.js +1 -0
- package/src/assets/web-panel/assets/Security-13K57V_v.css +1 -0
- package/src/assets/web-panel/assets/Security-DdW4hu_4.js +4 -0
- package/src/assets/web-panel/assets/Services-CnzEzGFN.js +2 -0
- package/src/assets/web-panel/assets/Skeleton-D6RevdW2.js +8 -0
- package/src/assets/web-panel/assets/Skills-DD5ReHH7.js +1 -0
- package/src/assets/web-panel/assets/Sla-CaQOOsjD.js +1 -0
- package/src/assets/web-panel/assets/Sla-K19oOyQc.css +1 -0
- package/src/assets/web-panel/assets/SpeechSettings-D-pGIn9Z.js +1 -0
- package/src/assets/web-panel/assets/SpeechSettings-DYPJTDKz.css +1 -0
- package/src/assets/web-panel/assets/Tasks-BbdO_i4Q.js +1 -0
- package/src/assets/web-panel/assets/Templates-BWTV8-2E.css +1 -0
- package/src/assets/web-panel/assets/Templates-CupAugDn.js +1 -0
- package/src/assets/web-panel/assets/Tenant-D3zkSAV0.css +1 -0
- package/src/assets/web-panel/assets/Tenant-rseAzHcY.js +1 -0
- package/src/assets/web-panel/assets/Tokens-BBOdNRHQ.css +1 -0
- package/src/assets/web-panel/assets/Tokens-DXMokNbR.js +1 -0
- package/src/assets/web-panel/assets/Trigger-DkSZjOlY.js +1 -0
- package/src/assets/web-panel/assets/Trust-CKb7QDH1.js +1 -0
- package/src/assets/web-panel/assets/Trust-DeOo0xAh.css +1 -0
- package/src/assets/web-panel/assets/UkeySign-Cux8_Ib_.js +1 -0
- package/src/assets/web-panel/assets/VideoEditing-CSOjdBZg.js +1 -0
- package/src/assets/web-panel/assets/VideoEditing-DksiizfS.css +1 -0
- package/src/assets/web-panel/assets/Wallet-DHbi5dHt.js +4 -0
- package/src/assets/web-panel/assets/Wallet-gR0ZvZbK.css +1 -0
- package/src/assets/web-panel/assets/WebAuthn-BkGDI33-.js +5 -0
- package/src/assets/web-panel/assets/WebAuthn-SSh5VhVO.css +1 -0
- package/src/assets/web-panel/assets/WorkflowEditor-BFZ3RYva.js +1 -0
- package/src/assets/web-panel/assets/WorkflowEditor-IiwsD8Kh.css +1 -0
- package/src/assets/web-panel/assets/{chat-DY27mJje.js → chat-BQ-Nk2XY.js} +1 -1
- package/src/assets/web-panel/assets/{collapseMotion-CyadT_6x.js → collapseMotion-BIjDVXtT.js} +1 -1
- package/src/assets/web-panel/assets/{colors-B7fDvuJc.js → colors-D2tTvuDI.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-DgthOVXi.js → compact-item-CqCEUZiy.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-Blw2vgkG.js → createContext-C6HFlAQP.js} +1 -1
- package/src/assets/web-panel/assets/echarts-DmBLM6YO.js +19 -0
- package/src/assets/web-panel/assets/{hasIn-BfL1HJZl.js → hasIn-yp2CbhYc.js} +1 -1
- package/src/assets/web-panel/assets/icons-DvZE-RKs.js +57 -0
- package/src/assets/web-panel/assets/index-4cn1LmJ9.js +1 -0
- package/src/assets/web-panel/assets/index-B0jkl2Zb.js +1 -0
- package/src/assets/web-panel/assets/{index-BHnaIQEm.js → index-B2qFUwGb.js} +2 -2
- package/src/assets/web-panel/assets/index-B74gWYqD.js +1 -0
- package/src/assets/web-panel/assets/index-B8Qxu0q2.js +1 -0
- package/src/assets/web-panel/assets/index-B9b_mz4I.js +55 -0
- package/src/assets/web-panel/assets/index-BAA1SFp1.js +1 -0
- package/src/assets/web-panel/assets/index-BJeE7n_I.js +12 -0
- package/src/assets/web-panel/assets/index-BJoK7MkB.js +13 -0
- package/src/assets/web-panel/assets/{index-DyRzaN4b.js → index-BTL2yIvT.js} +3 -3
- package/src/assets/web-panel/assets/index-BlVnFOFL.js +1 -0
- package/src/assets/web-panel/assets/{index-x8iHfZRd.js → index-Blq49aTW.js} +3 -3
- package/src/assets/web-panel/assets/{index-BsleJWGy.js → index-BxSsO6Sm.js} +2 -2
- package/src/assets/web-panel/assets/index-CA3g3EpL.js +1 -0
- package/src/assets/web-panel/assets/{index-BuEOhTAw.js → index-CFoFkVUt.js} +5 -5
- package/src/assets/web-panel/assets/index-CWhXxdyo.js +1 -0
- package/src/assets/web-panel/assets/index-CXf0zL5i.js +13 -0
- package/src/assets/web-panel/assets/index-CcwZodUl.js +1 -0
- package/src/assets/web-panel/assets/index-Cd6m6ynF.js +1 -0
- package/src/assets/web-panel/assets/index-CfX1DEtk.css +1 -0
- package/src/assets/web-panel/assets/index-Cfy9l115.js +1 -0
- package/src/assets/web-panel/assets/index-CijiVpfO.js +1 -0
- package/src/assets/web-panel/assets/index-Cpfx7-LN.js +12 -0
- package/src/assets/web-panel/assets/index-CrEEL63u.js +1 -0
- package/src/assets/web-panel/assets/index-CucxAdwN.js +6 -0
- package/src/assets/web-panel/assets/index-CvuBD5TK.js +3 -0
- package/src/assets/web-panel/assets/index-Cw4v7ezB.js +65 -0
- package/src/assets/web-panel/assets/{index-00RNC3ZQ.js → index-D34iabcS.js} +8 -8
- package/src/assets/web-panel/assets/index-DEKuiAPQ.js +3 -0
- package/src/assets/web-panel/assets/index-Dj4P0iWm.js +1 -0
- package/src/assets/web-panel/assets/index-DjeNNVwu.js +1 -0
- package/src/assets/web-panel/assets/index-DlgMVieO.js +1 -0
- package/src/assets/web-panel/assets/{index-CiN4NEAa.js → index-DnehXcB-.js} +2 -2
- package/src/assets/web-panel/assets/index-JszcDpsT.js +7 -0
- package/src/assets/web-panel/assets/index-KdFFI-p3.js +1 -0
- package/src/assets/web-panel/assets/index-NNymVAza.js +3 -0
- package/src/assets/web-panel/assets/index-aw2DwKj-.js +21 -0
- package/src/assets/web-panel/assets/index-nzDx0JAR.js +1 -0
- package/src/assets/web-panel/assets/index-w1xShUDf.js +1 -0
- package/src/assets/web-panel/assets/{initDefaultProps-BeWIEzBr.js → initDefaultProps-DfdVxwz6.js} +1 -1
- package/src/assets/web-panel/assets/motion-CL0bdvJg.js +11 -0
- package/src/assets/web-panel/assets/move-Bo9Fgzv7.js +4 -0
- package/src/assets/web-panel/assets/mtc-parser-pGMSt10g.js +1 -0
- package/src/assets/web-panel/assets/{omit-BS0H_YEP.js → omit-C-cc6wHr.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-BOGgGau8.js → pickAttrs-CjLp5RN-.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow--c5TQkDQ.js → placementArrow-CJa8gsqa.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-CrHOX7jp.js → responsiveObserve-CcDj3P-p.js} +1 -1
- package/src/assets/web-panel/assets/slide-CpvbHO26.js +4 -0
- package/src/assets/web-panel/assets/statusUtils-BK69kP1U.js +1 -0
- package/src/assets/web-panel/assets/{styleChecker-CiDrXnbi.js → styleChecker-CDvBRzsG.js} +1 -1
- package/src/assets/web-panel/assets/useFlexGapSupport-CRN_hzJt.js +1 -0
- package/src/assets/web-panel/assets/useFs-BD-YRwbU.js +1 -0
- package/src/assets/web-panel/assets/{useMergedState-CLY-UHry.js → useMergedState-TP9VIF2K.js} +1 -1
- package/src/assets/web-panel/assets/{useRefs-HzOoMkZk.js → useRefs-BhIz_lC3.js} +1 -1
- package/src/assets/web-panel/assets/{useState-yWVBuz1S.js → useState-CpKsyozn.js} +1 -1
- package/src/assets/web-panel/assets/vendor-B6ToihkA.js +1 -0
- package/src/assets/web-panel/assets/vnode-Bzp-FsbB.js +1 -0
- package/src/assets/web-panel/assets/{ws-4ur1fGsk.js → ws-D_5-FRIb.js} +1 -1
- package/src/assets/web-panel/assets/zoom-BHqpWXJV.js +4 -0
- package/src/assets/web-panel/index.html +4 -4
- package/src/commands/audit.js +296 -0
- package/src/commands/crosschain.js +564 -8
- package/src/commands/init.js +16 -1
- package/src/commands/mtc.js +2735 -86
- package/src/lib/audit-mtc.js +504 -0
- package/src/lib/cross-chain-mtc.js +904 -0
- package/src/assets/web-panel/assets/AIOps-Bfzpnnlg.css +0 -1
- package/src/assets/web-panel/assets/AIOps-ztGJppiG.js +0 -1
- package/src/assets/web-panel/assets/ActionButton-DCuat-R-.js +0 -1
- package/src/assets/web-panel/assets/Analytics-BFI7jbwM.css +0 -1
- package/src/assets/web-panel/assets/Analytics-m_EtU-RR.js +0 -3
- package/src/assets/web-panel/assets/AppLayout-8HizVjee.css +0 -1
- package/src/assets/web-panel/assets/AppLayout-Crz8jbEC.js +0 -1
- package/src/assets/web-panel/assets/Audit-CNLWjMXN.js +0 -1
- package/src/assets/web-panel/assets/Audit-kU7vbN-D.css +0 -1
- package/src/assets/web-panel/assets/Backup-CggaSq9O.js +0 -1
- package/src/assets/web-panel/assets/Backup-DxLiJzmk.css +0 -1
- package/src/assets/web-panel/assets/BaseInput-BssiYvl6.js +0 -1
- package/src/assets/web-panel/assets/Chat-tuVfpQUO.js +0 -2
- package/src/assets/web-panel/assets/Checkbox-BUUkXdQg.js +0 -1
- package/src/assets/web-panel/assets/Codegen-AVAcL7NA.css +0 -1
- package/src/assets/web-panel/assets/Codegen-CHu-7YGr.js +0 -1
- package/src/assets/web-panel/assets/Col-2IaMFwmX.js +0 -1
- package/src/assets/web-panel/assets/Community-CYL7Fvjq.js +0 -1
- package/src/assets/web-panel/assets/Community-DqDfLQui.css +0 -1
- package/src/assets/web-panel/assets/Compact-5yRVELhA.js +0 -1
- package/src/assets/web-panel/assets/Compliance-CKuIDJHK.js +0 -1
- package/src/assets/web-panel/assets/Compliance-CKxw6vIq.css +0 -1
- package/src/assets/web-panel/assets/Cron-DIfkI7vf.js +0 -2
- package/src/assets/web-panel/assets/Crosschain-BkjY-lst.js +0 -1
- package/src/assets/web-panel/assets/Crosschain-DThGgQk8.css +0 -1
- package/src/assets/web-panel/assets/DID-BDvsVa08.css +0 -1
- package/src/assets/web-panel/assets/DID-ChzRkgNy.js +0 -2
- package/src/assets/web-panel/assets/Dashboard-Cviwdc26.css +0 -1
- package/src/assets/web-panel/assets/Dashboard-DKrbXVNn.js +0 -3
- package/src/assets/web-panel/assets/Dropdown-BYGoxH1z.js +0 -1
- package/src/assets/web-panel/assets/Federation-B8QX-IaA.js +0 -1
- package/src/assets/web-panel/assets/Federation-BftELHDw.css +0 -1
- package/src/assets/web-panel/assets/Git-BBnGgbBR.js +0 -2
- package/src/assets/web-panel/assets/Governance-BfmfQBGB.css +0 -1
- package/src/assets/web-panel/assets/Governance-CxUHZMsp.js +0 -1
- package/src/assets/web-panel/assets/Inference-BlnOG71q.js +0 -1
- package/src/assets/web-panel/assets/Inference-EFFc7eNZ.css +0 -1
- package/src/assets/web-panel/assets/Keyframes-C7fCrnlS.js +0 -1
- package/src/assets/web-panel/assets/KnowledgeGraph-U8ps3aGJ.css +0 -1
- package/src/assets/web-panel/assets/KnowledgeGraph-vkVq38kC.js +0 -19
- package/src/assets/web-panel/assets/Logs-Bxx7WARH.js +0 -2
- package/src/assets/web-panel/assets/Marketplace-B-4uYu_j.css +0 -1
- package/src/assets/web-panel/assets/Marketplace-Bh8ExT9_.js +0 -1
- package/src/assets/web-panel/assets/McpTools-CTQrNVAQ.css +0 -1
- package/src/assets/web-panel/assets/McpTools-Djj_a3ko.js +0 -5
- package/src/assets/web-panel/assets/Memory-DRghrGJr.css +0 -1
- package/src/assets/web-panel/assets/Memory-DlgNgAov.js +0 -2
- package/src/assets/web-panel/assets/NLProgramming-BN3jaoen.js +0 -1
- package/src/assets/web-panel/assets/NLProgramming-jURs-f-a.css +0 -1
- package/src/assets/web-panel/assets/Notes-De7mIkkV.js +0 -7
- package/src/assets/web-panel/assets/Organization-B-98mdK2.js +0 -4
- package/src/assets/web-panel/assets/Organization-DdOOM4ic.css +0 -1
- package/src/assets/web-panel/assets/Overflow-G0I8IlY3.js +0 -1
- package/src/assets/web-panel/assets/P2P-DIUgHZ1z.js +0 -2
- package/src/assets/web-panel/assets/P2P-OEzOeMZX.css +0 -1
- package/src/assets/web-panel/assets/Permissions-B8XycCVk.js +0 -4
- package/src/assets/web-panel/assets/Pipeline-DyqCLFVr.css +0 -1
- package/src/assets/web-panel/assets/Pipeline-cUpETlXS.js +0 -1
- package/src/assets/web-panel/assets/Portal-SsPhn64D.js +0 -1
- package/src/assets/web-panel/assets/Privacy-B6J89UBw.js +0 -1
- package/src/assets/web-panel/assets/Privacy-B_cAicd1.css +0 -1
- package/src/assets/web-panel/assets/ProjectSettings-2Ftw0zt_.js +0 -2
- package/src/assets/web-panel/assets/Projects-CcOdFpgr.js +0 -2
- package/src/assets/web-panel/assets/Projects-DxKelI5h.css +0 -1
- package/src/assets/web-panel/assets/Providers-D0r2qSf-.js +0 -2
- package/src/assets/web-panel/assets/QuickAsk-CwsPpfkq.js +0 -1
- package/src/assets/web-panel/assets/Recommend-BYEDetJm.js +0 -1
- package/src/assets/web-panel/assets/Recommend-DgNSCgRX.css +0 -1
- package/src/assets/web-panel/assets/Reputation-Bli4hBGH.js +0 -1
- package/src/assets/web-panel/assets/Reputation-y-46ThW8.css +0 -1
- package/src/assets/web-panel/assets/Row-DTW9_BYi.js +0 -1
- package/src/assets/web-panel/assets/RssFeed-kwj_himl.js +0 -3
- package/src/assets/web-panel/assets/Search-BTk9rglb.css +0 -1
- package/src/assets/web-panel/assets/Search-DymcqASO.js +0 -1
- package/src/assets/web-panel/assets/Security-Bh3yvyNN.js +0 -4
- package/src/assets/web-panel/assets/Security-Dwxw7rfP.css +0 -1
- package/src/assets/web-panel/assets/Services-O4UZaYur.js +0 -2
- package/src/assets/web-panel/assets/Skeleton-B82oQZTz.js +0 -8
- package/src/assets/web-panel/assets/Skills-BfkrC05g.js +0 -1
- package/src/assets/web-panel/assets/Sla-C1WYuQKf.css +0 -1
- package/src/assets/web-panel/assets/Sla-DEs5XCIf.js +0 -1
- package/src/assets/web-panel/assets/SpeechSettings-BWMhb10j.js +0 -1
- package/src/assets/web-panel/assets/SpeechSettings-CiKvsIyV.css +0 -1
- package/src/assets/web-panel/assets/Tasks-CIBUb9M1.js +0 -1
- package/src/assets/web-panel/assets/Templates-DAkzr0xS.css +0 -1
- package/src/assets/web-panel/assets/Templates-iqSuJY-O.js +0 -1
- package/src/assets/web-panel/assets/Tenant-BJr-h-_0.css +0 -1
- package/src/assets/web-panel/assets/Tenant-CLqZjkVq.js +0 -1
- package/src/assets/web-panel/assets/Tokens-Bwz8aQtK.js +0 -1
- package/src/assets/web-panel/assets/Tokens-KvJRHQcl.css +0 -1
- package/src/assets/web-panel/assets/Trigger-CxnChVoS.js +0 -1
- package/src/assets/web-panel/assets/Trust-BLI308Ik.css +0 -1
- package/src/assets/web-panel/assets/Trust-Bp23lyZl.js +0 -1
- package/src/assets/web-panel/assets/UkeySign-_VAMquoh.js +0 -1
- package/src/assets/web-panel/assets/VideoEditing-BA1N-5kq.css +0 -1
- package/src/assets/web-panel/assets/VideoEditing-Bxqwg4zW.js +0 -1
- package/src/assets/web-panel/assets/Wallet-Cvht6Yrh.js +0 -4
- package/src/assets/web-panel/assets/Wallet-DnIumafl.css +0 -1
- package/src/assets/web-panel/assets/WebAuthn-CNPl2VQR.css +0 -1
- package/src/assets/web-panel/assets/WebAuthn-DD4EomJu.js +0 -5
- package/src/assets/web-panel/assets/WorkflowEditor-CEKNTS5G.css +0 -1
- package/src/assets/web-panel/assets/WorkflowEditor-CJy5e0fl.js +0 -1
- package/src/assets/web-panel/assets/_plugin-vue_export-helper-DlAUqK2U.js +0 -1
- package/src/assets/web-panel/assets/icons-CJACPYXu.js +0 -57
- package/src/assets/web-panel/assets/index-B9B9Zbf3.js +0 -1
- package/src/assets/web-panel/assets/index-BAsMNMbh.js +0 -1
- package/src/assets/web-panel/assets/index-BB5y5Y0z.js +0 -14
- package/src/assets/web-panel/assets/index-BVjDIZQ4.js +0 -1
- package/src/assets/web-panel/assets/index-BZeRnzuY.js +0 -55
- package/src/assets/web-panel/assets/index-BZfoAtZC.js +0 -1
- package/src/assets/web-panel/assets/index-Bl2nXm2J.js +0 -13
- package/src/assets/web-panel/assets/index-Bw1dwHWm.js +0 -1
- package/src/assets/web-panel/assets/index-Bw_UV2ez.js +0 -13
- package/src/assets/web-panel/assets/index-C8GYpC65.js +0 -1
- package/src/assets/web-panel/assets/index-CBHlKa-J.js +0 -3
- package/src/assets/web-panel/assets/index-CL-7KCFI.js +0 -3
- package/src/assets/web-panel/assets/index-CqjUUbil.js +0 -12
- package/src/assets/web-panel/assets/index-Cqtt1N0F.js +0 -1
- package/src/assets/web-panel/assets/index-CyGyEIVX.css +0 -1
- package/src/assets/web-panel/assets/index-D1QP9Ue1.js +0 -1
- package/src/assets/web-panel/assets/index-D6BUjL6I.js +0 -1
- package/src/assets/web-panel/assets/index-DN7ywgBJ.js +0 -1
- package/src/assets/web-panel/assets/index-DasW8LIs.js +0 -1
- package/src/assets/web-panel/assets/index-Dd9McFt_.js +0 -1
- package/src/assets/web-panel/assets/index-DdzLEdL6.js +0 -7
- package/src/assets/web-panel/assets/index-DhML6F3z.js +0 -1
- package/src/assets/web-panel/assets/index-DjN0nHiV.js +0 -1
- package/src/assets/web-panel/assets/index-DjhWpiZW.js +0 -1
- package/src/assets/web-panel/assets/index-DouFuKIR.js +0 -1
- package/src/assets/web-panel/assets/index-DzWwjWYN.js +0 -21
- package/src/assets/web-panel/assets/index-Dza_w3kG.js +0 -1
- package/src/assets/web-panel/assets/index-Q4qgOtOe.js +0 -12
- package/src/assets/web-panel/assets/index-U4Zd5IK6.js +0 -8
- package/src/assets/web-panel/assets/index-Vit9TJBu.js +0 -36
- package/src/assets/web-panel/assets/index-lkJllVbJ.js +0 -6
- package/src/assets/web-panel/assets/index-uMWaXVtR.js +0 -3
- package/src/assets/web-panel/assets/index-uwh_ikIt.js +0 -1
- package/src/assets/web-panel/assets/motion-CIQOKmi6.js +0 -11
- package/src/assets/web-panel/assets/move-ZgRPlBji.js +0 -4
- package/src/assets/web-panel/assets/slide-Dd2mJUD0.js +0 -4
- package/src/assets/web-panel/assets/statusUtils-5QFvAofV.js +0 -1
- package/src/assets/web-panel/assets/transition-CVd2ueaJ.js +0 -1
- package/src/assets/web-panel/assets/useConfigInject-DIkkDpt1.js +0 -2
- package/src/assets/web-panel/assets/useFlexGapSupport-rrtj6f1h.js +0 -1
- package/src/assets/web-panel/assets/useFs-CK8VYPus.js +0 -1
- package/src/assets/web-panel/assets/vendor-D0Qjn73K.js +0 -1
- package/src/assets/web-panel/assets/vnode-xRp-KMjS.js +0 -1
- package/src/assets/web-panel/assets/zoom-CrI_kdTW.js +0 -4
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{u as we}from"./ws-4ur1fGsk.js";import{s as $e}from"./community-parser-CO25nZFt.js";import{_ as qe}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{a as v}from"./index-BB5y5Y0z.js";import{_ as Ee,ah as Me,aR as Pe,at as De,aQ as Je,r as Ve,o as de,H as Ke,aG as pe,aa as We,A as Ge}from"./icons-CJACPYXu.js";import{l as He,F as c,D as _,c as o,x as a,m as x,G as y,q as d,r as b,v as s,J as m,u as g,H as O,L as E,I as p,N as ye,j as V,a as oe}from"./vendor-D0Qjn73K.js";import"./index-Vit9TJBu.js";import"./useConfigInject-DIkkDpt1.js";import"./transition-CVd2ueaJ.js";import"./Keyframes-C7fCrnlS.js";import"./Portal-SsPhn64D.js";import"./index-U4Zd5IK6.js";function M(t){const r=$e(t);if(!r)return null;try{return JSON.parse(r)}catch{}const i=r.match(/\{[\s\S]*\}|\[[\s\S]*\]/);if(!i)return null;try{return JSON.parse(i[0])}catch{return null}}const Xe=Object.freeze(["file-md5","file-sha1","file-sha256","file-sha512","ipv4","ipv6","domain","url","email"]);function A(t,r=0){return typeof t=="number"&&Number.isFinite(t)?t:r}function fe(t,r=0){if(!t||typeof t!="object")return null;const i=t.id||"";if(!i)return null;const U=Array.isArray(t.labels)?t.labels:[];return{key:i,id:i,type:String(t.type||""),value:String(t.value||""),labels:U,confidence:t.confidence!=null?A(t.confidence,null):null,sourceId:t.sourceId??t.source_id??null,sourceName:t.sourceName??t.source_name??null,validFrom:t.validFrom??t.valid_from??null,validUntil:t.validUntil??t.valid_until??null,firstSeenAt:t.firstSeenAt??t.first_seen_at??null,lastSeenAt:t.lastSeenAt??t.last_seen_at??null,_idx:r}}function Ye(t){const r=M(t);return Array.isArray(r)?r.map(fe).filter(Boolean):[]}function Qe(t){const r=M(t);return!r||typeof r!="object"||Array.isArray(r)?null:{matched:!!r.matched,type:String(r.type||"unknown"),indicator:r.indicator?fe(r.indicator):null}}function Ze(t){const r={total:0,byType:{}},i=M(t);if(!i||typeof i!="object"||Array.isArray(i))return r;if(r.total=A(i.total,0),i.byType&&typeof i.byType=="object")for(const[U,j]of Object.entries(i.byType))typeof j=="number"&&Number.isFinite(j)&&(r.byType[U]=j);return r}function et(t,r=0){if(!t||typeof t!="object")return null;const i=t.entity||"";return i?{key:i,entity:i,eventCount:A(t.eventCount??t.event_count,0),failureRate:A(t.failureRate??t.failure_rate,0),uniqueResources:A(t.uniqueResources??t.unique_resources,0),uniqueActions:A(t.uniqueActions??t.unique_actions,0),burstiness:A(t.burstiness,0),riskScore:A(t.riskScore??t.risk_score,0),_idx:r}:null}function tt(t){const r=M(t);return Array.isArray(r)?r.map(et).filter(Boolean):[]}function ot(t,r=0){return!t||typeof t!="object"?null:{key:r,score:A(t.score,0),reasons:Array.isArray(t.reasons)?t.reasons:[],event:t.event&&typeof t.event=="object"?t.event:null,_idx:r}}function at(t){const r=M(t);return Array.isArray(r)?r.map(ot).filter(Boolean):[]}function ae(t){if(!t)return{noAuditLog:!1,error:""};const r=/no such table:\s*audit_log/i.test(t),i=t.match(/Failed:\s*(.+?)(?:\r?\n|$)/i);return{noAuditLog:r,error:i?i[1].trim():""}}function nt(t){if(t==null||t==="")return"—";const r=typeof t=="number"?new Date(t):new Date(String(t));return isNaN(r.getTime())?String(t):r.toLocaleString("zh-CN",{hour12:!1})}const lt={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},rt={class:"filter-bar"},st={key:1,style:{color:"var(--text-primary)","font-family":"monospace","font-size":"12px","word-break":"break-all"}},it={key:0,style:{color:"var(--text-muted)"}},ut={key:1,style:{color:"var(--text-muted)"}},ct={key:0,style:{color:"var(--text-secondary)","font-size":"12px"}},dt={key:1,style:{color:"var(--text-muted)"}},pt={key:5,style:{color:"var(--text-secondary)","font-size":"11px"}},yt={style:{padding:"40px",color:"var(--text-muted)","text-align":"center"}},ft={style:{color:"var(--text-primary)",margin:"16px 0 8px","font-size":"14px"}},mt={key:0,style:{color:"var(--text-primary)","font-family":"monospace","font-weight":"500"}},vt={key:2,style:{color:"var(--text-secondary)"}},_t={key:5,style:{color:"var(--text-secondary)","font-family":"monospace","font-size":"11px"}},bt={style:{padding:"30px",color:"var(--text-muted)","text-align":"center"}},gt={key:2,style:{color:"var(--text-primary)",margin:"24px 0 8px","font-size":"14px"}},xt={style:{flex:"1"}},kt={style:{display:"flex",gap:"8px","align-items":"center"}},ht={key:0,style:{color:"var(--text-primary)","font-family":"monospace","font-size":"12px"}},zt={key:1,style:{color:"var(--text-secondary)","font-size":"11px"}},At={key:0,style:{"margin-top":"4px"}},St={style:{"margin-top":"8px","font-size":"12px",color:"var(--text-secondary)"}},Ct={key:0,style:{"margin-top":"12px","font-size":"12px"}},Tt={style:{color:"var(--text-secondary)"}},Ot={style:{color:"var(--text-secondary)"}},Ut={key:0,style:{"margin-top":"4px"}},jt={__name:"Compliance",setup(t){const r=we(),i=b(!1),U=b(!1),j=b(!1),K=b(!1),W=b([]),B=b({total:0,byType:{}}),L=b([]),I=b([]),S=b({noAuditLog:!1,error:""}),P=b("threat"),D=b(""),G=b(!1),w=b(!1),$=b(!1),H=oe({observable:""}),k=b(null),C=oe({entity:"",days:30}),h=oe({entity:"",threshold:.7,days:1}),me=[{title:"类型",key:"type",width:"120px"},{title:"值",key:"value"},{title:"标签",key:"labels",width:"160px"},{title:"置信度",key:"confidence",width:"90px"},{title:"来源",key:"source",width:"160px"},{title:"最近见到",key:"lastSeen",width:"160px"},{title:"操作",key:"action",width:"90px"}],ve=[{title:"实体",key:"entity",width:"180px"},{title:"风险分",key:"riskScore"},{title:"事件数",key:"eventCount",width:"90px"},{title:"失败率",key:"failureRate",width:"90px"},{title:"资源数",key:"uniqueResources",width:"90px"},{title:"突发度",key:"burstiness",width:"90px"}],_e=V(()=>D.value?W.value.filter(l=>l.type===D.value):W.value),be=V(()=>Object.keys(B.value.byType).length),ge=V(()=>Object.entries(B.value.byType).sort((l,e)=>e[1]-l[1])),ne=V(()=>L.value.filter(l=>l.riskScore>=70).length),xe={ipv4:"blue",ipv6:"cyan",domain:"purple",url:"magenta",email:"gold","file-md5":"orange","file-sha1":"orange","file-sha256":"red","file-sha512":"red",unknown:"default"};function X(l){return xe[l]||"default"}function ke(l){return l>=80?"#ff4d4f":l>=50?"#faad14":"#52c41a"}function le(l){return l>=70?"#ff4d4f":l>=40?"#faad14":"#52c41a"}function he(l,e){return l?l.length>e?l.slice(0,e)+"...":l:""}function ze({key:l}){l==="match"?(k.value=null,G.value=!0):l==="ueba-build"?w.value=!0:l==="ueba-analyze"&&($.value=!0)}async function J(){i.value=!0;try{const[l,e,f]=await Promise.all([r.execute("compliance threat-intel list --limit 200 --json",1e4).catch(()=>({output:""})),r.execute("compliance threat-intel stats --json",8e3).catch(()=>({output:""})),r.execute("compliance ueba top --top-k 20 --json",1e4).catch(()=>({output:""}))]);W.value=Ye(l.output),B.value=Ze(e.output),S.value=ae(f.output),L.value=S.value.noAuditLog?[]:tt(f.output)}catch(l){v.error("加载合规数据失败: "+(l?.message||l))}finally{i.value=!1}}async function Ae(){const l=H.observable.trim();if(!l){v.warning("请输入要匹配的可观测值");return}U.value=!0,k.value=null;try{const e=`compliance threat-intel match "${l.replace(/"/g,'\\"')}" --json`,{output:f}=await r.execute(e,8e3),z=Qe(f);if(!z){v.error("匹配失败: "+f.slice(0,120));return}k.value=z,z.matched?v.warning(`命中威胁指标 (${z.type})`):z.type==="unknown"?v.info("无法识别该可观测值类型"):v.success(`未命中(已识别为 ${z.type})`)}catch(e){v.error("匹配失败: "+(e?.message||e))}finally{U.value=!1}}async function Se(l){try{const e=`compliance threat-intel remove ${l.type} "${l.value.replace(/"/g,'\\"')}" --json`,{output:f}=await r.execute(e,8e3);if(/error|失败/i.test(f)&&!/"removed"/.test(f)){v.error("删除失败: "+f.slice(0,120));return}v.success("指标已删除"),await J()}catch(e){v.error("删除失败: "+(e?.message||e))}}async function Ce(){j.value=!0;try{const l=["compliance ueba baseline"];C.entity.trim()&&l.push(`--entity "${C.entity.trim().replace(/"/g,'\\"')}"`),C.days!=null&&l.push(`--days ${C.days}`),l.push("--json");const{output:e}=await r.execute(l.join(" "),3e4),f=ae(e);if(f.noAuditLog){S.value=f,v.warning("audit_log 表为空,无法构建基线"),w.value=!1;return}if(f.error){v.error("构建失败: "+f.error);return}v.success("基线已构建"),w.value=!1,P.value="ueba",await J()}catch(l){v.error("构建失败: "+(l?.message||l))}finally{j.value=!1}}async function Te(){K.value=!0;try{const l=["compliance ueba analyze"];h.entity.trim()&&l.push(`--entity "${h.entity.trim().replace(/"/g,'\\"')}"`),h.threshold!=null&&l.push(`--threshold ${h.threshold}`),h.days!=null&&l.push(`--days ${h.days}`),l.push("--json");const{output:e}=await r.execute(l.join(" "),3e4),f=ae(e);if(f.noAuditLog){S.value=f,v.warning("audit_log 表为空,无可分析事件"),$.value=!1;return}if(f.error&&!e.includes("[")){v.error("分析失败: "+f.error);return}I.value=at(e),v.success(`分析完成,发现 ${I.value.length} 个异常`),$.value=!1,P.value="ueba"}catch(l){v.error("分析失败: "+(l?.message||l))}finally{K.value=!1}}return He(J),(l,e)=>{const f=d("a-button"),z=d("a-menu-item"),Oe=d("a-menu"),Ue=d("a-dropdown"),re=d("a-space"),R=d("a-statistic"),N=d("a-card"),q=d("a-col"),je=d("a-row"),T=d("a-tag"),se=d("a-radio-button"),Ie=d("a-radio-group"),Ne=d("a-popconfirm"),ie=d("a-table"),ue=d("a-tab-pane"),ce=d("a-alert"),Re=d("a-progress"),Fe=d("a-list-item"),Be=d("a-list"),Le=d("a-tabs"),Y=d("a-input"),F=d("a-form-item"),Q=d("a-form"),Z=d("a-modal"),ee=d("a-input-number");return s(),c("div",null,[_("div",lt,[e[18]||(e[18]=_("div",null,[_("h2",{class:"page-title"},"合规与威胁情报"),_("p",{class:"page-sub"},"威胁指标 (IoC) · 用户行为分析 (UEBA)")],-1)),o(re,null,{default:a(()=>[o(f,{loading:i.value,onClick:J},{icon:a(()=>[o(g(Ee))]),default:a(()=>[e[11]||(e[11]=m(" 刷新 ",-1))]),_:1},8,["loading"]),o(Ue,{trigger:["click"]},{overlay:a(()=>[o(Oe,{onClick:ze},{default:a(()=>[o(z,{key:"match"},{default:a(()=>[o(g(Pe)),e[13]||(e[13]=m(" 匹配指标",-1))]),_:1}),o(z,{key:"ueba-build"},{default:a(()=>[o(g(De)),e[14]||(e[14]=m(" 构建基线",-1))]),_:1}),o(z,{key:"ueba-analyze"},{default:a(()=>[o(g(Je)),e[15]||(e[15]=m(" 行为分析",-1))]),_:1}),o(z,{key:"import",disabled:""},{default:a(()=>[o(g(Ve)),e[16]||(e[16]=m(" 导入 STIX bundle ",-1)),e[17]||(e[17]=_("span",{style:{color:"var(--text-muted)","font-size":"11px","margin-left":"6px"}},"(CLI 端)",-1))]),_:1})]),_:1})]),default:a(()=>[o(f,{type:"primary"},{icon:a(()=>[o(g(Me))]),default:a(()=>[e[12]||(e[12]=m(" 操作 ▼ ",-1))]),_:1})]),_:1})]),_:1})]),o(je,{gutter:[16,16],style:{"margin-bottom":"20px"}},{default:a(()=>[o(q,{xs:12,sm:8,lg:5},{default:a(()=>[o(N,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[o(R,{title:"IoC 总数",value:B.value.total,"value-style":{color:"#1677ff",fontSize:"20px"}},{prefix:a(()=>[o(g(de))]),_:1},8,["value"])]),_:1})]),_:1}),o(q,{xs:12,sm:8,lg:5},{default:a(()=>[o(N,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[o(R,{title:"IoC 类型",value:be.value,"value-style":{color:"#13c2c2",fontSize:"20px"}},{prefix:a(()=>[o(g(Ke))]),_:1},8,["value"])]),_:1})]),_:1}),o(q,{xs:12,sm:8,lg:5},{default:a(()=>[o(N,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[o(R,{title:"风险实体",value:L.value.length,"value-style":{color:"#722ed1",fontSize:"20px"}},{prefix:a(()=>[o(g(pe))]),_:1},8,["value"])]),_:1})]),_:1}),o(q,{xs:12,sm:8,lg:5},{default:a(()=>[o(N,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[o(R,{title:"高风险 (≥70)",value:ne.value,"value-style":{color:ne.value>0?"#ff4d4f":"#52c41a",fontSize:"20px"}},{prefix:a(()=>[o(g(We))]),_:1},8,["value","value-style"])]),_:1})]),_:1}),o(q,{xs:24,sm:8,lg:4},{default:a(()=>[o(N,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[o(R,{title:"近期异常",value:I.value.length,"value-style":{color:"#faad14",fontSize:"20px"}},{prefix:a(()=>[o(g(Ge))]),_:1},8,["value"])]),_:1})]),_:1})]),_:1}),B.value.total>0?(s(),x(N,{key:0,title:"IoC 类型分布",size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"20px"},"body-style":{padding:"12px 16px"}},{default:a(()=>[o(re,{size:[12,8],wrap:""},{default:a(()=>[(s(!0),c(O,null,E(ge.value,([n,u])=>(s(),x(T,{key:n,color:X(n)},{default:a(()=>[m(p(n)+": "+p(u),1)]),_:2},1032,["color"]))),128))]),_:1})]),_:1})):y("",!0),o(Le,{activeKey:P.value,"onUpdate:activeKey":e[1]||(e[1]=n=>P.value=n),class:"compliance-tabs"},{default:a(()=>[o(ue,{key:"threat",tab:"威胁情报"},{default:a(()=>[_("div",rt,[o(Ie,{value:D.value,"onUpdate:value":e[0]||(e[0]=n=>D.value=n),size:"small"},{default:a(()=>[o(se,{value:""},{default:a(()=>[...e[19]||(e[19]=[m("全部",-1)])]),_:1}),(s(!0),c(O,null,E(g(Xe),n=>(s(),x(se,{key:n,value:n},{default:a(()=>[m(p(n),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),o(ie,{columns:me,"data-source":_e.value,pagination:{pageSize:20,showTotal:n=>`共 ${n} 条`},size:"small",loading:i.value,style:{background:"var(--bg-card)"}},{bodyCell:a(({column:n,record:u})=>[n.key==="type"?(s(),x(T,{key:0,color:X(u.type),style:{"font-family":"monospace"}},{default:a(()=>[m(p(u.type),1)]),_:2},1032,["color"])):y("",!0),n.key==="value"?(s(),c("span",st,p(he(u.value,64)),1)):y("",!0),n.key==="labels"?(s(),c(O,{key:2},[(s(!0),c(O,null,E(u.labels,te=>(s(),x(T,{key:te,color:"orange",style:{"font-size":"10px",margin:"1px"}},{default:a(()=>[m(p(te),1)]),_:2},1024))),128)),u.labels.length?y("",!0):(s(),c("span",it,"—"))],64)):y("",!0),n.key==="confidence"?(s(),c(O,{key:3},[u.confidence!=null?(s(),c("span",{key:0,style:ye({color:ke(u.confidence),fontWeight:500})},p(u.confidence),5)):(s(),c("span",ut,"—"))],64)):y("",!0),n.key==="source"?(s(),c(O,{key:4},[u.sourceName?(s(),c("span",ct,p(u.sourceName),1)):(s(),c("span",dt,"—"))],64)):y("",!0),n.key==="lastSeen"?(s(),c("span",pt,p(g(nt)(u.lastSeenAt)),1)):y("",!0),n.key==="action"?(s(),x(Ne,{key:6,title:"删除该指标?","ok-text":"删除","cancel-text":"取消",onConfirm:te=>Se(u)},{default:a(()=>[o(f,{size:"small",type:"link",danger:""},{default:a(()=>[...e[20]||(e[20]=[m("删除",-1)])]),_:1})]),_:1},8,["onConfirm"])):y("",!0)]),emptyText:a(()=>[_("div",yt,[o(g(de),{style:{"font-size":"36px","margin-bottom":"10px",display:"block"}}),e[21]||(e[21]=m(" 暂无威胁指标。需通过 CLI 导入 STIX bundle: ",-1)),e[22]||(e[22]=_("code",{style:{"font-size":"11px"}},"cc compliance threat-intel import <file.json>",-1))])]),_:1},8,["data-source","pagination","loading"])]),_:1}),o(ue,{key:"ueba",tab:"行为分析 (UEBA)"},{default:a(()=>[S.value.noAuditLog?(s(),x(ce,{key:0,type:"info","show-icon":"",message:"尚无审计日志",description:"UEBA 基于 audit_log 表的审计事件。先在桌面端或 CLI 触发一些受审计的操作(如 cc auth login / cc note add),再回来运行「构建基线」。",style:{"margin-bottom":"16px"}})):S.value.error?(s(),x(ce,{key:1,type:"error","show-icon":"",message:`UEBA 错误:${S.value.error}`,style:{"margin-bottom":"16px"}},null,8,["message"])):y("",!0),_("h3",ft,"高风险实体 (Top "+p(L.value.length)+")",1),o(ie,{columns:ve,"data-source":L.value,pagination:!1,size:"small",loading:i.value,style:{background:"var(--bg-card)"}},{bodyCell:a(({column:n,record:u})=>[n.key==="entity"?(s(),c("span",mt,p(u.entity),1)):y("",!0),n.key==="riskScore"?(s(),x(Re,{key:1,percent:Math.min(u.riskScore,100),"stroke-color":le(u.riskScore),size:"small",format:()=>u.riskScore.toFixed(1)},null,8,["percent","stroke-color","format"])):y("",!0),n.key==="eventCount"?(s(),c("span",vt,p(u.eventCount),1)):y("",!0),n.key==="failureRate"?(s(),c("span",{key:3,style:ye({color:u.failureRate>.3?"#ff4d4f":"var(--text-secondary)",fontFamily:"monospace"})},p((u.failureRate*100).toFixed(1))+"% ",5)):y("",!0),n.key==="uniqueResources"?(s(),x(T,{key:4,color:"cyan",style:{"font-size":"11px"}},{default:a(()=>[m(p(u.uniqueResources),1)]),_:2},1024)):y("",!0),n.key==="burstiness"?(s(),c("span",_t,p((u.burstiness*100).toFixed(0))+"% ",1)):y("",!0)]),emptyText:a(()=>[_("div",bt,[o(g(pe),{style:{"font-size":"32px","margin-bottom":"8px",display:"block"}}),m(" "+p(S.value.noAuditLog?"审计日志为空,无可分析实体":"暂无风险实体"),1)])]),_:1},8,["data-source","loading"]),I.value.length?(s(),c("h3",gt," 近期异常 ("+p(I.value.length)+") ",1)):y("",!0),I.value.length?(s(),x(Be,{key:3,size:"small","data-source":I.value,locale:{emptyText:"无异常"}},{renderItem:a(({item:n})=>[o(Fe,{style:{background:"var(--bg-card)",padding:"10px 16px"}},{default:a(()=>[_("div",xt,[_("div",kt,[o(T,{color:le(n.score*100)},{default:a(()=>[m("score "+p(n.score.toFixed(2)),1)]),_:2},1032,["color"]),n.event?.entity?(s(),c("span",ht,p(n.event.entity),1)):y("",!0),n.event?.action?(s(),c("span",zt," → "+p(n.event.action),1)):y("",!0)]),n.reasons.length?(s(),c("div",At,[(s(!0),c(O,null,E(n.reasons,u=>(s(),x(T,{key:u,color:"volcano",style:{"font-size":"10px",margin:"1px"}},{default:a(()=>[m(p(u),1)]),_:2},1024))),128))])):y("",!0)])]),_:2},1024)]),_:1},8,["data-source"])):y("",!0)]),_:1})]),_:1},8,["activeKey"]),o(Z,{open:G.value,"onUpdate:open":e[3]||(e[3]=n=>G.value=n),title:"匹配威胁指标","confirm-loading":U.value,width:500,"ok-text":"匹配","cancel-text":"关闭",onOk:Ae},{default:a(()=>[o(Q,{"label-col":{span:5},"wrapper-col":{span:19},style:{"margin-top":"16px"}},{default:a(()=>[o(F,{label:"可观测值",required:""},{default:a(()=>[o(Y,{value:H.observable,"onUpdate:value":e[2]||(e[2]=n=>H.observable=n),placeholder:"IP / 域名 / URL / 邮箱 / 文件哈希","allow-clear":""},null,8,["value"])]),_:1})]),_:1}),k.value?(s(),x(N,{key:0,size:"small",style:{background:"var(--bg-base)","margin-top":"8px"}},{default:a(()=>[o(R,{title:"匹配结果",value:k.value.matched?"命中":"未命中","value-style":{color:k.value.matched?"#ff4d4f":"#52c41a"}},null,8,["value","value-style"]),_("div",St,[e[23]||(e[23]=m(" 检测类型: ",-1)),o(T,{color:X(k.value.type)},{default:a(()=>[m(p(k.value.type),1)]),_:1},8,["color"])]),k.value.indicator?(s(),c("div",Ct,[_("div",Tt,"来源: "+p(k.value.indicator.sourceName||"—"),1),_("div",Ot,"置信度: "+p(k.value.indicator.confidence??"—"),1),k.value.indicator.labels.length?(s(),c("div",Ut,[(s(!0),c(O,null,E(k.value.indicator.labels,n=>(s(),x(T,{key:n,color:"orange",style:{"font-size":"10px"}},{default:a(()=>[m(p(n),1)]),_:2},1024))),128))])):y("",!0)])):y("",!0)]),_:1})):y("",!0)]),_:1},8,["open","confirm-loading"]),o(Z,{open:w.value,"onUpdate:open":e[6]||(e[6]=n=>w.value=n),title:"构建 UEBA 基线","confirm-loading":j.value,width:480,"ok-text":"构建","cancel-text":"取消",onOk:Ce},{default:a(()=>[o(Q,{"label-col":{span:6},"wrapper-col":{span:18},style:{"margin-top":"16px"}},{default:a(()=>[o(F,{label:"实体(可选)"},{default:a(()=>[o(Y,{value:C.entity,"onUpdate:value":e[4]||(e[4]=n=>C.entity=n),placeholder:"留空则全量"},null,8,["value"])]),_:1}),o(F,{label:"天数"},{default:a(()=>[o(ee,{value:C.days,"onUpdate:value":e[5]||(e[5]=n=>C.days=n),min:1,max:365,placeholder:"例如 30",style:{width:"100%"}},null,8,["value"])]),_:1})]),_:1}),e[24]||(e[24]=_("p",{style:{color:"var(--text-secondary)","font-size":"12px",margin:"0"}}," 从 audit_log 读取最近 N 天的事件,按实体计算事件计数 / 失败率 / 资源覆盖等基线指标。 ",-1))]),_:1},8,["open","confirm-loading"]),o(Z,{open:$.value,"onUpdate:open":e[10]||(e[10]=n=>$.value=n),title:"运行行为分析","confirm-loading":K.value,width:480,"ok-text":"分析","cancel-text":"取消",onOk:Te},{default:a(()=>[o(Q,{"label-col":{span:6},"wrapper-col":{span:18},style:{"margin-top":"16px"}},{default:a(()=>[o(F,{label:"实体(可选)"},{default:a(()=>[o(Y,{value:h.entity,"onUpdate:value":e[7]||(e[7]=n=>h.entity=n),placeholder:"留空则全量"},null,8,["value"])]),_:1}),o(F,{label:"阈值"},{default:a(()=>[o(ee,{value:h.threshold,"onUpdate:value":e[8]||(e[8]=n=>h.threshold=n),min:0,max:1,step:.05,style:{width:"100%"}},null,8,["value"])]),_:1}),o(F,{label:"天数"},{default:a(()=>[o(ee,{value:h.days,"onUpdate:value":e[9]||(e[9]=n=>h.days=n),min:1,max:30,style:{width:"100%"}},null,8,["value"])]),_:1})]),_:1}),e[25]||(e[25]=_("p",{style:{color:"var(--text-secondary)","font-size":"12px",margin:"0"}}," 将最近 N 天事件与已存基线对比;分数 ≥ 阈值的事件作为异常输出。 ",-1))]),_:1},8,["open","confirm-loading"])])}}},Dt=qe(jt,[["__scopeId","data-v-379a0162"]]);export{Dt as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
.page-title[data-v-379a0162]{margin:0;color:var(--text-primary);font-size:22px;font-weight:600}.page-sub[data-v-379a0162]{margin:4px 0 0;color:var(--text-secondary);font-size:13px}.compliance-tabs[data-v-379a0162] .ant-tabs-nav{margin-bottom:16px}.filter-bar[data-v-379a0162]{display:flex;align-items:center;gap:12px;margin-bottom:12px;flex-wrap:wrap}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{u as Z}from"./ws-4ur1fGsk.js";import{ah as ee,_ as ae,m as te}from"./icons-CJACPYXu.js";import{a as d}from"./index-BB5y5Y0z.js";import{l as le,F as b,D as v,c as a,x as t,q as s,r as x,v as p,J as f,u as L,H as O,L as ne,I as w,m as q,G as z,j as V}from"./vendor-D0Qjn73K.js";import"./index-Vit9TJBu.js";import"./useConfigInject-DIkkDpt1.js";import"./transition-CVd2ueaJ.js";import"./Keyframes-C7fCrnlS.js";import"./Portal-SsPhn64D.js";import"./index-U4Zd5IK6.js";const oe={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},se={key:0,style:{"text-align":"center",padding:"40px"}},re={style:{color:"#e0e0e0","font-weight":"500"}},ue={key:0,style:{color:"var(--text-secondary)","font-size":"11px"}},ie={key:1,style:{background:"var(--bg-card-hover)",padding:"2px 6px","border-radius":"3px",color:"#91caff","font-size":"11px"}},ce={style:{padding:"40px",color:"var(--text-muted)","text-align":"center"}},we={__name:"Cron",setup(de){const y=Z(),C=x(!1),$=x(!1),_=x(!1),m=x([]),S=V(()=>m.value.filter(l=>l.enabled).length),W=V(()=>m.value.filter(l=>!l.enabled).length),B=[{label:"每5分钟",cron:"*/5 * * * *"},{label:"每15分钟",cron:"*/15 * * * *"},{label:"每小时",cron:"0 * * * *"},{label:"每天9点",cron:"0 9 * * *"},{label:"每天18点",cron:"0 18 * * *"},{label:"每周一9点",cron:"0 9 * * 1"},{label:"每月1号",cron:"0 9 1 * *"}],o=x({name:"",cron:"",payload:"",description:"",enabled:!0}),j=[{title:"任务名称",key:"name",width:"25%"},{title:"Cron",key:"cron",width:"20%"},{title:"状态",key:"status",width:"15%"},{title:"操作",key:"actions",width:"20%"}];async function T(){C.value=!0;try{const{output:l}=await y.execute('skill run cron-scheduler "list all scheduled tasks"',2e4);m.value=A(l)}catch{m.value=[]}finally{C.value=!1}}function A(l){const e=[],c=l.split(`
|
|
2
|
-
`);for(const k of c){const u=k.trim();if(!u||u.startsWith("─"))continue;const i=u.match(/^([^\t|]+?)[\t|]+([*\d/,\-?LW#\s]+)[\t|]+/);i&&e.push({key:e.length,name:i[1].trim(),cron:i[2].trim(),enabled:!u.toLowerCase().includes("pause")&&!u.toLowerCase().includes("disabled"),description:"",running:!1})}return e}function D(l){o.value.cron=l.cron,_.value=!0}async function F(){if(!o.value.name||!o.value.cron){d.warning("请填写任务名称和 Cron 表达式");return}$.value=!0;try{const l=`skill run cron-scheduler "add task: ${o.value.name}, schedule: ${o.value.cron}, payload: ${o.value.payload||"ping"}"`,{output:e}=await y.execute(l,2e4);d.success("任务已创建"),_.value=!1,o.value={name:"",cron:"",payload:"",description:"",enabled:!0},await T()}catch(l){d.error("创建失败: "+l.message)}finally{$.value=!1}}async function I(l){l.running=!0;try{const{output:e}=await y.execute(`skill run cron-scheduler "run task: ${l.name}"`,3e4);d.success(`任务 ${l.name} 已触发`)}catch(e){d.error("触发失败: "+e.message)}finally{l.running=!1}}async function P(l){const e=l.enabled?"pause":"enable";try{await y.execute(`skill run cron-scheduler "${e} task: ${l.name}"`,1e4),l.enabled=!l.enabled,d.success(`任务已${l.enabled?"启用":"暂停"}`)}catch{d.error("操作失败")}}async function E(l){try{await y.execute(`skill run cron-scheduler "delete task: ${l.name}"`,1e4),m.value=m.value.filter(e=>e.key!==l.key),d.success("任务已删除")}catch{d.error("删除失败")}}return le(T),(l,e)=>{const c=s("a-button"),k=s("a-space"),u=s("a-statistic"),i=s("a-card"),h=s("a-col"),G=s("a-row"),H=s("a-spin"),J=s("a-badge"),M=s("a-popconfirm"),R=s("a-table"),U=s("a-input"),g=s("a-form-item"),K=s("a-textarea"),Q=s("a-switch"),X=s("a-form"),Y=s("a-modal");return p(),b("div",null,[v("div",oe,[e[9]||(e[9]=v("div",null,[v("h2",{class:"page-title"},"定时任务"),v("p",{class:"page-sub"},"定时任务调度管理")],-1)),a(k,null,{default:t(()=>[a(c,{onClick:e[0]||(e[0]=n=>_.value=!0),type:"primary"},{icon:t(()=>[a(L(ee))]),default:t(()=>[e[7]||(e[7]=f(" 新建任务 ",-1))]),_:1}),a(c,{ghost:"",loading:C.value,onClick:T},{icon:t(()=>[a(L(ae))]),default:t(()=>[e[8]||(e[8]=f(" 刷新 ",-1))]),_:1},8,["loading"])]),_:1})]),a(G,{gutter:[16,16],style:{"margin-bottom":"20px"}},{default:t(()=>[a(h,{xs:12,sm:6},{default:t(()=>[a(i,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"},size:"small"},{default:t(()=>[a(u,{title:"全部任务",value:m.value.length,"value-style":"color: #ccc; font-size: 18px;"},null,8,["value"])]),_:1})]),_:1}),a(h,{xs:12,sm:6},{default:t(()=>[a(i,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"},size:"small"},{default:t(()=>[a(u,{title:"启用中",value:S.value,"value-style":"color: #52c41a; font-size: 18px;"},null,8,["value"])]),_:1})]),_:1}),a(h,{xs:12,sm:6},{default:t(()=>[a(i,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"},size:"small"},{default:t(()=>[a(u,{title:"已暂停",value:W.value,"value-style":"color: #faad14; font-size: 18px;"},null,8,["value"])]),_:1})]),_:1}),a(h,{xs:12,sm:6},{default:t(()=>[a(i,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"},size:"small"},{default:t(()=>[a(u,{title:"预设方案",value:B.length,"value-style":"color: #1677ff; font-size: 18px;"},null,8,["value"])]),_:1})]),_:1})]),_:1}),a(i,{title:"快速添加预设",style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"16px"},size:"small"},{default:t(()=>[a(k,{wrap:""},{default:t(()=>[(p(),b(O,null,ne(B,n=>a(c,{key:n.label,size:"small",style:{background:"var(--bg-card-hover)","border-color":"var(--border-color)","font-size":"12px"},onClick:r=>D(n)},{default:t(()=>[f(w(n.label),1)]),_:2},1032,["onClick"])),64))]),_:1})]),_:1}),a(i,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:t(()=>[C.value?(p(),b("div",se,[a(H,{size:"large"})])):(p(),q(R,{key:1,columns:j,"data-source":m.value,pagination:{pageSize:15},size:"small"},{bodyCell:t(({column:n,record:r})=>[n.key==="name"?(p(),b(O,{key:0},[v("div",re,w(r.name),1),r.description?(p(),b("div",ue,w(r.description),1)):z("",!0)],64)):z("",!0),n.key==="cron"?(p(),b("code",ie,w(r.cron),1)):z("",!0),n.key==="status"?(p(),q(J,{key:2,status:r.enabled?"success":"warning",text:r.enabled?"运行中":"已暂停"},null,8,["status","text"])):z("",!0),n.key==="actions"?(p(),q(k,{key:3,size:"small"},{default:t(()=>[a(c,{size:"small",type:"link",loading:r.running,onClick:N=>I(r)},{default:t(()=>[...e[10]||(e[10]=[f("运行",-1)])]),_:1},8,["loading","onClick"]),a(c,{size:"small",type:"link",onClick:N=>P(r)},{default:t(()=>[f(w(r.enabled?"暂停":"启用"),1)]),_:2},1032,["onClick"]),a(M,{title:"确认删除此任务?",onConfirm:N=>E(r)},{default:t(()=>[a(c,{size:"small",type:"link",danger:""},{default:t(()=>[...e[11]||(e[11]=[f("删除",-1)])]),_:1})]),_:1},8,["onConfirm"])]),_:2},1024)):z("",!0)]),emptyText:t(()=>[v("div",ce,[a(L(te),{style:{"font-size":"36px","margin-bottom":"12px",display:"block"}}),e[12]||(e[12]=f(" 暂无定时任务 ",-1))])]),_:1},8,["data-source"]))]),_:1}),a(Y,{open:_.value,"onUpdate:open":e[6]||(e[6]=n=>_.value=n),title:"新建定时任务","confirm-loading":$.value,onOk:F,width:"520px"},{default:t(()=>[a(X,{"label-col":{span:5},"wrapper-col":{span:19},style:{"margin-top":"16px"}},{default:t(()=>[a(g,{label:"任务名称",required:""},{default:t(()=>[a(U,{value:o.value.name,"onUpdate:value":e[1]||(e[1]=n=>o.value.name=n),placeholder:"任务名称"},null,8,["value"])]),_:1}),a(g,{label:"Cron 表达式",required:""},{default:t(()=>[a(U,{value:o.value.cron,"onUpdate:value":e[2]||(e[2]=n=>o.value.cron=n),placeholder:"如: 0 9 * * * (每天9点)"},null,8,["value"]),e[13]||(e[13]=v("div",{style:{color:"var(--text-secondary)","font-size":"11px","margin-top":"4px"}},"格式: 分 时 日 月 周",-1))]),_:1}),a(g,{label:"任务内容",required:""},{default:t(()=>[a(K,{value:o.value.payload,"onUpdate:value":e[3]||(e[3]=n=>o.value.payload=n),rows:3,placeholder:"要执行的 AI 任务描述..."},null,8,["value"])]),_:1}),a(g,{label:"描述"},{default:t(()=>[a(U,{value:o.value.description,"onUpdate:value":e[4]||(e[4]=n=>o.value.description=n),placeholder:"可选描述"},null,8,["value"])]),_:1}),a(g,{label:"立即启用"},{default:t(()=>[a(Q,{checked:o.value.enabled,"onUpdate:checked":e[5]||(e[5]=n=>o.value.enabled=n)},null,8,["checked"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"])])}}};export{we as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{u as Ne}from"./ws-4ur1fGsk.js";import{s as Be}from"./community-parser-CO25nZFt.js";import{_ as qe}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{a as x}from"./index-BB5y5Y0z.js";import{_ as Ie,ah as Re,t as re,aN as ie,aO as ue,aP as Ve,al as De,as as Je,aF as de}from"./icons-CJACPYXu.js";import{l as Pe,F as f,D as m,c as a,x as s,m as C,G as h,q as v,r as k,v as i,J as y,u as b,H as A,L as w,I as u,a as Q}from"./vendor-D0Qjn73K.js";import"./index-Vit9TJBu.js";import"./useConfigInject-DIkkDpt1.js";import"./transition-CVd2ueaJ.js";import"./Keyframes-C7fCrnlS.js";import"./Portal-SsPhn64D.js";import"./index-U4Zd5IK6.js";function N(t){const l=Be(t);if(!l)return null;try{return JSON.parse(l)}catch{}const r=l.match(/\{[\s\S]*\}|\[[\s\S]*\]/);if(!r)return null;try{return JSON.parse(r[0])}catch{return null}}function S(t,l=0){return typeof t=="number"&&Number.isFinite(t)?t:l}function Ee(t,l=0){if(!t||typeof t!="object")return null;const r=t.id||"";return r?{key:r,id:r,name:String(t.name||r),symbol:String(t.symbol||""),chainId:S(t.chainId??t.chain_id,0),_idx:l}:null}function Ke(t){const l=N(t);return Array.isArray(l)?l.map(Ee).filter(Boolean):[]}function Ge(t,l=0){if(!t||typeof t!="object")return null;const r=t.id||"";return r?{key:r,id:r,fromChain:t.fromChain??t.from_chain??"",toChain:t.toChain??t.to_chain??"",asset:String(t.asset||"native"),amount:S(t.amount,0),senderAddress:t.senderAddress??t.sender_address??"",recipientAddress:t.recipientAddress??t.recipient_address??"",lockTxHash:t.lockTxHash??t.lock_tx_hash??"",mintTxHash:t.mintTxHash??t.mint_tx_hash??"",status:String(t.status||"pending").toLowerCase(),feeAmount:S(t.feeAmount??t.fee_amount,0),feeChain:t.feeChain??t.fee_chain??"",errorMessage:t.errorMessage??t.error_message??"",createdAt:t.createdAt??t.created_at??null,completedAt:t.completedAt??t.completed_at??null,_idx:l}:null}function We(t){const l=N(t);return Array.isArray(l)?l.map(Ge).filter(Boolean):[]}function Xe(t,l=0){if(!t||typeof t!="object")return null;const r=t.id||"";return r?{key:r,id:r,fromChain:t.fromChain??t.from_chain??"",toChain:t.toChain??t.to_chain??"",fromAsset:t.fromAsset??t.from_asset??"native",toAsset:t.toAsset??t.to_asset??"native",amount:S(t.amount,0),counterpartyAddress:t.counterpartyAddress??t.counterparty_address??"",hashLock:t.hashLock??t.hash_lock??"",expiresAt:t.expiresAt??t.expires_at??null,status:String(t.status||"initiated").toLowerCase(),claimTxHash:t.claimTxHash??t.claim_tx_hash??"",refundTxHash:t.refundTxHash??t.refund_tx_hash??"",createdAt:t.createdAt??t.created_at??null,_idx:l}:null}function Qe(t){const l=N(t);return Array.isArray(l)?l.map(Xe).filter(Boolean):[]}function Ye(t,l=0){if(!t||typeof t!="object")return null;const r=t.id||"";return r?{key:r,id:r,fromChain:t.fromChain??t.from_chain??"",toChain:t.toChain??t.to_chain??"",payload:String(t.payload||""),targetContract:t.targetContract??t.target_contract??"",sourceTxHash:t.sourceTxHash??t.source_tx_hash??"",destinationTxHash:t.destinationTxHash??t.destination_tx_hash??"",status:String(t.status||"pending").toLowerCase(),retries:S(t.retries,0),createdAt:t.createdAt??t.created_at??null,deliveredAt:t.deliveredAt??t.delivered_at??null,_idx:l}:null}function Ze(t){const l=N(t);return Array.isArray(l)?l.map(Ye).filter(Boolean):[]}const et={bridges:{total:0,byStatus:{},totalVolume:0,totalFees:0},swaps:{total:0,byStatus:{}},messages:{total:0,byStatus:{}}};function tt(t){const l=JSON.parse(JSON.stringify(et)),r=N(t);return!r||typeof r!="object"||Array.isArray(r)||(r.bridges&&typeof r.bridges=="object"&&(l.bridges.total=S(r.bridges.total,0),l.bridges.totalVolume=S(r.bridges.totalVolume??r.bridges.total_volume,0),l.bridges.totalFees=S(r.bridges.totalFees??r.bridges.total_fees,0),r.bridges.byStatus&&typeof r.bridges.byStatus=="object"&&(l.bridges.byStatus={...r.bridges.byStatus})),r.swaps&&typeof r.swaps=="object"&&(l.swaps.total=S(r.swaps.total,0),r.swaps.byStatus&&typeof r.swaps.byStatus=="object"&&(l.swaps.byStatus={...r.swaps.byStatus})),r.messages&&typeof r.messages=="object"&&(l.messages.total=S(r.messages.total,0),r.messages.byStatus&&typeof r.messages.byStatus=="object"&&(l.messages.byStatus={...r.messages.byStatus}))),l}function at(t){const l=N(t);return!l||typeof l!="object"||Array.isArray(l)?null:{fee:S(l.fee,0),breakdown:{sourceFee:S(l?.breakdown?.sourceFee??l?.breakdown?.source_fee,0),destFee:S(l?.breakdown?.destFee??l?.breakdown?.dest_fee,0),bridgeFee:S(l?.breakdown?.bridgeFee??l?.breakdown?.bridge_fee,0)},currency:String(l.currency||"USD")}}function pe(t){if(t==null||t==="")return"—";const l=typeof t=="number"?new Date(t):new Date(String(t));return isNaN(l.getTime())?String(t):l.toLocaleString("zh-CN",{hour12:!1})}const ot={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},st={style:{opacity:"0.7"}},nt={key:0,style:{opacity:"0.55","font-size":"10px","margin-left":"4px"}},lt={style:{color:"var(--text-primary)"}},rt={style:{color:"var(--text-primary)"}},it={style:{color:"#722ed1","font-weight":"500"}},ut={style:{color:"var(--text-secondary)","margin-left":"4px","font-size":"11px"}},dt={key:2,style:{color:"var(--text-secondary)","font-size":"12px"}},pt={key:4,style:{color:"var(--text-secondary)","font-size":"11px"}},ct={style:{padding:"40px",color:"var(--text-muted)","text-align":"center"}},ft={style:{color:"var(--text-primary)"}},mt={style:{color:"var(--text-secondary)","font-size":"11px",margin:"0 4px"}},yt={style:{color:"var(--text-primary)"}},vt={style:{color:"var(--text-secondary)","font-size":"11px","margin-left":"4px"}},gt={key:1,style:{color:"#722ed1","font-weight":"500"}},_t={key:0,style:{color:"var(--text-secondary)","font-family":"monospace","font-size":"11px"}},bt={key:1,style:{color:"var(--text-muted)"}},ht={key:4,style:{color:"var(--text-secondary)","font-size":"11px"}},xt={style:{padding:"40px",color:"var(--text-muted)","text-align":"center"}},kt={style:{color:"var(--text-primary)"}},Ct={style:{color:"var(--text-primary)"}},At={key:1,style:{color:"var(--text-secondary)","font-size":"12px"}},St={key:1,style:{color:"var(--text-muted)"}},zt={key:4,style:{color:"var(--text-secondary)","font-size":"11px"}},Tt={style:{padding:"40px",color:"var(--text-muted)","text-align":"center"}},Ft={style:{"margin-top":"12px","font-size":"12px",color:"var(--text-secondary)"}},Ut={__name:"Crosschain",setup(t){const l=Ne(),r=k(!1),Y=k(!1),Z=k(!1),ee=k(!1),te=k(!1),z=k([]),ce=k([]),fe=k([]),me=k([]),B=k({bridges:{total:0,byStatus:{},totalVolume:0,totalFees:0},swaps:{total:0,byStatus:{}},messages:{total:0,byStatus:{}}}),q=k("bridges"),J=k(!1),P=k(!1),E=k(!1),ae=k(!1),p=Q({fromChain:"",toChain:"",amount:null,asset:"",sender:"",recipient:""}),d=Q({fromChain:"",toChain:"",amount:null,fromAsset:"",toAsset:"",counterparty:"",timeoutMs:null}),g=Q({fromChain:"",toChain:"",payload:"",contract:""}),T=Q({fromChain:"",toChain:"",amount:null}),F=k(null),be=[{title:"路径",key:"route"},{title:"金额",key:"amount",width:"160px"},{title:"费用",key:"fee",width:"100px"},{title:"状态",key:"status",width:"110px"},{title:"创建时间",key:"createdAt",width:"160px"}],he=[{title:"路径",key:"route"},{title:"金额",key:"amount",width:"110px"},{title:"哈希锁",key:"hashLock",width:"160px"},{title:"状态",key:"status",width:"120px"},{title:"过期时间",key:"expiresAt",width:"160px"}],xe=[{title:"路径",key:"route",width:"220px"},{title:"消息",key:"payload"},{title:"重试",key:"retries",width:"80px"},{title:"状态",key:"status",width:"110px"},{title:"创建时间",key:"createdAt",width:"160px"}],ke={ethereum:"blue",polygon:"purple",bsc:"gold",arbitrum:"cyan",solana:"magenta"};function Ce(n){return ke[n]||"default"}function M(n){const o=z.value.find(U=>U.id===n);return o?o.name:n||"—"}function oe(n){return{pending:"待处理",locked:"已锁定",minted:"已铸造",completed:"已完成",refunded:"已退款",failed:"失败",initiated:"已发起",hash_locked:"哈希锁定",claimed:"已领取",expired:"已过期",sent:"已发送",delivered:"已送达"}[n]||n}function Ae(n){return{pending:"default",locked:"processing",minted:"cyan",completed:"green",refunded:"orange",failed:"red"}[n]||"default"}function Se(n){return{initiated:"default",hash_locked:"processing",claimed:"green",refunded:"orange",expired:"red"}[n]||"default"}function ze(n){return{pending:"default",sent:"processing",delivered:"green",failed:"red"}[n]||"default"}function Te(n,o){return n?n.length>o?n.slice(0,o)+"...":n:""}function Fe({key:n}){n==="bridge"?J.value=!0:n==="swap"?P.value=!0:n==="message"&&(E.value=!0)}async function I(){r.value=!0;try{const[n,o,U,R,se]=await Promise.all([l.execute("crosschain chains --json",8e3).catch(()=>({output:""})),l.execute("crosschain bridges --limit 200 --json",1e4).catch(()=>({output:""})),l.execute("crosschain swaps --limit 200 --json",1e4).catch(()=>({output:""})),l.execute("crosschain messages --limit 200 --json",1e4).catch(()=>({output:""})),l.execute("crosschain stats --json",8e3).catch(()=>({output:""}))]);z.value=Ke(n.output),ce.value=We(o.output),fe.value=Qe(U.output),me.value=Ze(R.output),B.value=tt(se.output)}catch(n){x.error("加载跨链数据失败: "+(n?.message||n))}finally{r.value=!1}}function K(n){return!n.fromChain||!n.toChain?(x.warning("请选择源链和目标链"),!1):n.fromChain===n.toChain?(x.warning("源链和目标链必须不同"),!1):!0}async function Ue(){if(K(p)){if(!p.amount||p.amount<=0){x.warning("请输入正数金额");return}Y.value=!0;try{const n=[`crosschain bridge ${p.fromChain} ${p.toChain} ${p.amount}`];p.asset.trim()&&n.push(`--asset "${p.asset.trim().replace(/"/g,'\\"')}"`),p.sender.trim()&&n.push(`--sender "${p.sender.trim().replace(/"/g,'\\"')}"`),p.recipient.trim()&&n.push(`--recipient "${p.recipient.trim().replace(/"/g,'\\"')}"`),n.push("--json");const{output:o}=await l.execute(n.join(" "),15e3);if(/error|failed|失败|unsupported/i.test(o)&&!/"bridgeId"/.test(o)){x.error("桥接发起失败: "+o.slice(0,120));return}x.success("桥接已发起"),J.value=!1,ye(),q.value="bridges",await I()}catch(n){x.error("桥接失败: "+(n?.message||n))}finally{Y.value=!1}}}async function we(){if(K(d)){if(!d.amount||d.amount<=0){x.warning("请输入正数金额");return}Z.value=!0;try{const n=[`crosschain swap ${d.fromChain} ${d.toChain} ${d.amount}`];d.fromAsset.trim()&&n.push(`--from-asset "${d.fromAsset.trim().replace(/"/g,'\\"')}"`),d.toAsset.trim()&&n.push(`--to-asset "${d.toAsset.trim().replace(/"/g,'\\"')}"`),d.counterparty.trim()&&n.push(`--counterparty "${d.counterparty.trim().replace(/"/g,'\\"')}"`),d.timeoutMs!=null&&n.push(`--timeout ${d.timeoutMs}`),n.push("--json");const{output:o}=await l.execute(n.join(" "),15e3);if(/error|failed|失败|unsupported/i.test(o)&&!/"swapId"/.test(o)){x.error("原子交换发起失败: "+o.slice(0,120));return}x.success("原子交换已发起"),P.value=!1,ve(),q.value="swaps",await I()}catch(n){x.error("原子交换失败: "+(n?.message||n))}finally{Z.value=!1}}}async function je(){if(K(g)){ee.value=!0;try{const n=[`crosschain send ${g.fromChain} ${g.toChain}`];g.payload.trim()&&n.push(`--payload "${g.payload.trim().replace(/"/g,'\\"')}"`),g.contract.trim()&&n.push(`--contract "${g.contract.trim().replace(/"/g,'\\"')}"`),n.push("--json");const{output:o}=await l.execute(n.join(" "),12e3);if(/error|failed|失败|unsupported/i.test(o)&&!/"messageId"/.test(o)){x.error("消息发送失败: "+o.slice(0,120));return}x.success("消息已发送"),E.value=!1,ge(),q.value="messages",await I()}catch(n){x.error("发送失败: "+(n?.message||n))}finally{ee.value=!1}}}async function $e(){if(K(T)){if(!T.amount||T.amount<=0){x.warning("请输入正数金额");return}te.value=!0,F.value=null;try{const n=`crosschain estimate-fee ${T.fromChain} ${T.toChain} ${T.amount} --json`,{output:o}=await l.execute(n,8e3),U=at(o);if(!U){x.error("费用估算失败: "+o.slice(0,120));return}F.value=U}catch(n){x.error("估算失败: "+(n?.message||n))}finally{te.value=!1}}}function ye(){p.fromChain="",p.toChain="",p.amount=null,p.asset="",p.sender="",p.recipient=""}function ve(){d.fromChain="",d.toChain="",d.amount=null,d.fromAsset="",d.toAsset="",d.counterparty="",d.timeoutMs=null}function ge(){g.fromChain="",g.toChain="",g.payload="",g.contract=""}return Pe(I),(n,o)=>{const U=v("a-button"),R=v("a-menu-item"),se=v("a-menu"),Le=v("a-dropdown"),_e=v("a-space"),H=v("a-statistic"),L=v("a-card"),V=v("a-col"),Oe=v("a-row"),D=v("a-tag"),ne=v("a-table"),le=v("a-tab-pane"),Me=v("a-tabs"),j=v("a-select-option"),$=v("a-select"),_=v("a-form-item"),G=v("a-input-number"),O=v("a-input"),W=v("a-form"),X=v("a-modal"),He=v("a-textarea");return i(),f("div",null,[m("div",ot,[o[32]||(o[32]=m("div",null,[m("h2",{class:"page-title"},"跨链桥"),m("p",{class:"page-sub"},"链间资产桥接 · HTLC 原子交换 · 跨链消息")],-1)),a(_e,null,{default:s(()=>[a(U,{loading:r.value,onClick:I},{icon:s(()=>[a(b(Ie))]),default:s(()=>[o[26]||(o[26]=y(" 刷新 ",-1))]),_:1},8,["loading"]),a(Le,{trigger:["click"]},{overlay:s(()=>[a(se,{onClick:Fe},{default:s(()=>[a(R,{key:"bridge"},{default:s(()=>[a(b(re)),o[28]||(o[28]=y(" 桥接资产",-1))]),_:1}),a(R,{key:"swap"},{default:s(()=>[a(b(ie)),o[29]||(o[29]=y(" HTLC 原子交换",-1))]),_:1}),a(R,{key:"message"},{default:s(()=>[a(b(ue)),o[30]||(o[30]=y(" 跨链消息",-1))]),_:1})]),_:1})]),default:s(()=>[a(U,{type:"primary"},{icon:s(()=>[a(b(Re))]),default:s(()=>[o[27]||(o[27]=y(" 新建 ▼ ",-1))]),_:1})]),_:1}),a(U,{onClick:o[0]||(o[0]=e=>ae.value=!0)},{icon:s(()=>[a(b(Ve))]),default:s(()=>[o[31]||(o[31]=y(" 费用估算 ",-1))]),_:1})]),_:1})]),a(Oe,{gutter:[16,16],style:{"margin-bottom":"20px"}},{default:s(()=>[a(V,{xs:12,sm:8,lg:5},{default:s(()=>[a(L,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:s(()=>[a(H,{title:"支持链",value:z.value.length,"value-style":{color:"#1677ff",fontSize:"20px"}},{prefix:s(()=>[a(b(De))]),_:1},8,["value"])]),_:1})]),_:1}),a(V,{xs:12,sm:8,lg:5},{default:s(()=>[a(L,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:s(()=>[a(H,{title:"桥接交易",value:B.value.bridges.total,"value-style":{color:"#52c41a",fontSize:"20px"}},{prefix:s(()=>[a(b(re))]),_:1},8,["value"])]),_:1})]),_:1}),a(V,{xs:12,sm:8,lg:5},{default:s(()=>[a(L,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:s(()=>[a(H,{title:"原子交换",value:B.value.swaps.total,"value-style":{color:"#722ed1",fontSize:"20px"}},{prefix:s(()=>[a(b(ie))]),_:1},8,["value"])]),_:1})]),_:1}),a(V,{xs:12,sm:8,lg:5},{default:s(()=>[a(L,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:s(()=>[a(H,{title:"跨链消息",value:B.value.messages.total,"value-style":{color:"#faad14",fontSize:"20px"}},{prefix:s(()=>[a(b(ue))]),_:1},8,["value"])]),_:1})]),_:1}),a(V,{xs:24,sm:8,lg:4},{default:s(()=>[a(L,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:s(()=>[a(H,{title:"总交易额",value:B.value.bridges.totalVolume,precision:2,"value-style":{color:"#13c2c2",fontSize:"20px"}},{prefix:s(()=>[a(b(Je))]),_:1},8,["value"])]),_:1})]),_:1})]),_:1}),z.value.length?(i(),C(L,{key:0,title:"支持的区块链",size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"20px"},"body-style":{padding:"12px 16px"}},{default:s(()=>[a(_e,{size:[12,8],wrap:""},{default:s(()=>[(i(!0),f(A,null,w(z.value,e=>(i(),C(D,{key:e.id,color:Ce(e.id)},{default:s(()=>[y(u(e.name)+" ",1),m("span",st,"("+u(e.symbol)+")",1),e.chainId>0?(i(),f("span",nt,"#"+u(e.chainId),1)):h("",!0)]),_:2},1032,["color"]))),128))]),_:1})]),_:1})):h("",!0),a(Me,{activeKey:q.value,"onUpdate:activeKey":o[1]||(o[1]=e=>q.value=e),class:"xchain-tabs"},{default:s(()=>[a(le,{key:"bridges",tab:"桥接交易"},{default:s(()=>[a(ne,{columns:be,"data-source":ce.value,pagination:{pageSize:20,showTotal:e=>`共 ${e} 条`},size:"small",loading:r.value,style:{background:"var(--bg-card)"}},{bodyCell:s(({column:e,record:c})=>[e.key==="route"?(i(),f(A,{key:0},[m("span",lt,u(M(c.fromChain)),1),a(b(de),{style:{margin:"0 6px",color:"var(--text-secondary)","font-size":"11px"}}),m("span",rt,u(M(c.toChain)),1)],64)):h("",!0),e.key==="amount"?(i(),f(A,{key:1},[m("span",it,u(c.amount),1),m("span",ut,u(c.asset),1)],64)):h("",!0),e.key==="fee"?(i(),f("span",dt,u(c.feeAmount),1)):h("",!0),e.key==="status"?(i(),C(D,{key:3,color:Ae(c.status)},{default:s(()=>[y(u(oe(c.status)),1)]),_:2},1032,["color"])):h("",!0),e.key==="createdAt"?(i(),f("span",pt,u(b(pe)(c.createdAt)),1)):h("",!0)]),emptyText:s(()=>[m("div",ct,[a(b(re),{style:{"font-size":"36px","margin-bottom":"10px",display:"block"}}),o[33]||(o[33]=y(' 暂无桥接交易,点"新建 → 桥接资产"发起 ',-1))])]),_:1},8,["data-source","pagination","loading"])]),_:1}),a(le,{key:"swaps",tab:"原子交换"},{default:s(()=>[a(ne,{columns:he,"data-source":fe.value,pagination:{pageSize:20,showTotal:e=>`共 ${e} 条`},size:"small",loading:r.value,style:{background:"var(--bg-card)"}},{bodyCell:s(({column:e,record:c})=>[e.key==="route"?(i(),f(A,{key:0},[m("span",ft,u(M(c.fromChain)),1),m("span",mt,"("+u(c.fromAsset)+")",1),a(b(de),{style:{margin:"0 4px",color:"var(--text-secondary)","font-size":"11px"}}),m("span",yt,u(M(c.toChain)),1),m("span",vt,"("+u(c.toAsset)+")",1)],64)):h("",!0),e.key==="amount"?(i(),f("span",gt,u(c.amount),1)):h("",!0),e.key==="hashLock"?(i(),f(A,{key:2},[c.hashLock?(i(),f("span",_t,u(c.hashLock.slice(0,14))+"... ",1)):(i(),f("span",bt,"—"))],64)):h("",!0),e.key==="status"?(i(),C(D,{key:3,color:Se(c.status)},{default:s(()=>[y(u(oe(c.status)),1)]),_:2},1032,["color"])):h("",!0),e.key==="expiresAt"?(i(),f("span",ht,u(b(pe)(c.expiresAt)),1)):h("",!0)]),emptyText:s(()=>[m("div",xt,[a(b(ie),{style:{"font-size":"36px","margin-bottom":"10px",display:"block"}}),o[34]||(o[34]=y(' 暂无原子交换,点"新建 → HTLC 原子交换"发起 ',-1))])]),_:1},8,["data-source","pagination","loading"])]),_:1}),a(le,{key:"messages",tab:"跨链消息"},{default:s(()=>[a(ne,{columns:xe,"data-source":me.value,pagination:{pageSize:20,showTotal:e=>`共 ${e} 条`},size:"small",loading:r.value,style:{background:"var(--bg-card)"}},{bodyCell:s(({column:e,record:c})=>[e.key==="route"?(i(),f(A,{key:0},[m("span",kt,u(M(c.fromChain)),1),a(b(de),{style:{margin:"0 6px",color:"var(--text-secondary)","font-size":"11px"}}),m("span",Ct,u(M(c.toChain)),1)],64)):h("",!0),e.key==="payload"?(i(),f("span",At,u(Te(c.payload,60)||"—"),1)):h("",!0),e.key==="retries"?(i(),f(A,{key:2},[c.retries>0?(i(),C(D,{key:0,color:"orange",style:{"font-size":"11px"}},{default:s(()=>[y(u(c.retries)+" 次",1)]),_:2},1024)):(i(),f("span",St,"—"))],64)):h("",!0),e.key==="status"?(i(),C(D,{key:3,color:ze(c.status)},{default:s(()=>[y(u(oe(c.status)),1)]),_:2},1032,["color"])):h("",!0),e.key==="createdAt"?(i(),f("span",zt,u(b(pe)(c.createdAt)),1)):h("",!0)]),emptyText:s(()=>[m("div",Tt,[a(b(ue),{style:{"font-size":"36px","margin-bottom":"10px",display:"block"}}),o[35]||(o[35]=y(' 暂无跨链消息,点"新建 → 跨链消息"发送 ',-1))])]),_:1},8,["data-source","pagination","loading"])]),_:1})]),_:1},8,["activeKey"]),a(X,{open:J.value,"onUpdate:open":o[8]||(o[8]=e=>J.value=e),title:"桥接资产","confirm-loading":Y.value,width:540,"ok-text":"发起桥接","cancel-text":"取消",onOk:Ue,onCancel:ye},{default:s(()=>[a(W,{"label-col":{span:5},"wrapper-col":{span:19},style:{"margin-top":"16px"}},{default:s(()=>[a(_,{label:"源链",required:""},{default:s(()=>[a($,{value:p.fromChain,"onUpdate:value":o[2]||(o[2]=e=>p.fromChain=e),placeholder:"选择源链"},{default:s(()=>[(i(!0),f(A,null,w(z.value,e=>(i(),C(j,{key:e.id,value:e.id},{default:s(()=>[y(u(e.name),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),_:1}),a(_,{label:"目标链",required:""},{default:s(()=>[a($,{value:p.toChain,"onUpdate:value":o[3]||(o[3]=e=>p.toChain=e),placeholder:"选择目标链"},{default:s(()=>[(i(!0),f(A,null,w(z.value,e=>(i(),C(j,{key:e.id,value:e.id,disabled:e.id===p.fromChain},{default:s(()=>[y(u(e.name),1)]),_:2},1032,["value","disabled"]))),128))]),_:1},8,["value"])]),_:1}),a(_,{label:"金额",required:""},{default:s(()=>[a(G,{value:p.amount,"onUpdate:value":o[4]||(o[4]=e=>p.amount=e),min:0,precision:6,style:{width:"100%"}},null,8,["value"])]),_:1}),a(_,{label:"资产"},{default:s(()=>[a(O,{value:p.asset,"onUpdate:value":o[5]||(o[5]=e=>p.asset=e),placeholder:"native(默认)"},null,8,["value"])]),_:1}),a(_,{label:"发送方"},{default:s(()=>[a(O,{value:p.sender,"onUpdate:value":o[6]||(o[6]=e=>p.sender=e),placeholder:"0x...(可选)"},null,8,["value"])]),_:1}),a(_,{label:"接收方"},{default:s(()=>[a(O,{value:p.recipient,"onUpdate:value":o[7]||(o[7]=e=>p.recipient=e),placeholder:"0x...(可选)"},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"]),a(X,{open:P.value,"onUpdate:open":o[16]||(o[16]=e=>P.value=e),title:"HTLC 原子交换","confirm-loading":Z.value,width:540,"ok-text":"发起交换","cancel-text":"取消",onOk:we,onCancel:ve},{default:s(()=>[a(W,{"label-col":{span:5},"wrapper-col":{span:19},style:{"margin-top":"16px"}},{default:s(()=>[a(_,{label:"源链",required:""},{default:s(()=>[a($,{value:d.fromChain,"onUpdate:value":o[9]||(o[9]=e=>d.fromChain=e),placeholder:"选择源链"},{default:s(()=>[(i(!0),f(A,null,w(z.value,e=>(i(),C(j,{key:e.id,value:e.id},{default:s(()=>[y(u(e.name),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),_:1}),a(_,{label:"目标链",required:""},{default:s(()=>[a($,{value:d.toChain,"onUpdate:value":o[10]||(o[10]=e=>d.toChain=e),placeholder:"选择目标链"},{default:s(()=>[(i(!0),f(A,null,w(z.value,e=>(i(),C(j,{key:e.id,value:e.id,disabled:e.id===d.fromChain},{default:s(()=>[y(u(e.name),1)]),_:2},1032,["value","disabled"]))),128))]),_:1},8,["value"])]),_:1}),a(_,{label:"金额",required:""},{default:s(()=>[a(G,{value:d.amount,"onUpdate:value":o[11]||(o[11]=e=>d.amount=e),min:0,precision:6,style:{width:"100%"}},null,8,["value"])]),_:1}),a(_,{label:"源资产"},{default:s(()=>[a(O,{value:d.fromAsset,"onUpdate:value":o[12]||(o[12]=e=>d.fromAsset=e),placeholder:"native(默认)"},null,8,["value"])]),_:1}),a(_,{label:"目标资产"},{default:s(()=>[a(O,{value:d.toAsset,"onUpdate:value":o[13]||(o[13]=e=>d.toAsset=e),placeholder:"native(默认)"},null,8,["value"])]),_:1}),a(_,{label:"对手方"},{default:s(()=>[a(O,{value:d.counterparty,"onUpdate:value":o[14]||(o[14]=e=>d.counterparty=e),placeholder:"0x...(可选)"},null,8,["value"])]),_:1}),a(_,{label:"超时 (ms)"},{default:s(()=>[a(G,{value:d.timeoutMs,"onUpdate:value":o[15]||(o[15]=e=>d.timeoutMs=e),min:0,placeholder:"默认 24h",style:{width:"100%"}},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"]),a(X,{open:E.value,"onUpdate:open":o[21]||(o[21]=e=>E.value=e),title:"发送跨链消息","confirm-loading":ee.value,width:520,"ok-text":"发送","cancel-text":"取消",onOk:je,onCancel:ge},{default:s(()=>[a(W,{"label-col":{span:5},"wrapper-col":{span:19},style:{"margin-top":"16px"}},{default:s(()=>[a(_,{label:"源链",required:""},{default:s(()=>[a($,{value:g.fromChain,"onUpdate:value":o[17]||(o[17]=e=>g.fromChain=e),placeholder:"选择源链"},{default:s(()=>[(i(!0),f(A,null,w(z.value,e=>(i(),C(j,{key:e.id,value:e.id},{default:s(()=>[y(u(e.name),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),_:1}),a(_,{label:"目标链",required:""},{default:s(()=>[a($,{value:g.toChain,"onUpdate:value":o[18]||(o[18]=e=>g.toChain=e),placeholder:"选择目标链"},{default:s(()=>[(i(!0),f(A,null,w(z.value,e=>(i(),C(j,{key:e.id,value:e.id,disabled:e.id===g.fromChain},{default:s(()=>[y(u(e.name),1)]),_:2},1032,["value","disabled"]))),128))]),_:1},8,["value"])]),_:1}),a(_,{label:"消息"},{default:s(()=>[a(He,{value:g.payload,"onUpdate:value":o[19]||(o[19]=e=>g.payload=e),"auto-size":{minRows:3,maxRows:8}},null,8,["value"])]),_:1}),a(_,{label:"目标合约"},{default:s(()=>[a(O,{value:g.contract,"onUpdate:value":o[20]||(o[20]=e=>g.contract=e),placeholder:"0x...(可选)"},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"]),a(X,{open:ae.value,"onUpdate:open":o[25]||(o[25]=e=>ae.value=e),title:"费用估算","confirm-loading":te.value,width:480,"ok-text":"估算","cancel-text":"关闭",onOk:$e},{default:s(()=>[a(W,{"label-col":{span:5},"wrapper-col":{span:19},style:{"margin-top":"16px"}},{default:s(()=>[a(_,{label:"源链",required:""},{default:s(()=>[a($,{value:T.fromChain,"onUpdate:value":o[22]||(o[22]=e=>T.fromChain=e)},{default:s(()=>[(i(!0),f(A,null,w(z.value,e=>(i(),C(j,{key:e.id,value:e.id},{default:s(()=>[y(u(e.name),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),_:1}),a(_,{label:"目标链",required:""},{default:s(()=>[a($,{value:T.toChain,"onUpdate:value":o[23]||(o[23]=e=>T.toChain=e)},{default:s(()=>[(i(!0),f(A,null,w(z.value,e=>(i(),C(j,{key:e.id,value:e.id,disabled:e.id===T.fromChain},{default:s(()=>[y(u(e.name),1)]),_:2},1032,["value","disabled"]))),128))]),_:1},8,["value"])]),_:1}),a(_,{label:"金额",required:""},{default:s(()=>[a(G,{value:T.amount,"onUpdate:value":o[24]||(o[24]=e=>T.amount=e),min:0,precision:6,style:{width:"100%"}},null,8,["value"])]),_:1})]),_:1}),F.value?(i(),C(L,{key:0,size:"small",style:{background:"var(--bg-base)","margin-top":"8px"}},{default:s(()=>[a(H,{title:"预估费用",value:F.value.fee,precision:4,suffix:F.value.currency,"value-style":{color:"#1677ff"}},null,8,["value","suffix"]),m("div",Ft,[m("div",null,"源链费: "+u(F.value.breakdown.sourceFee)+" "+u(F.value.currency),1),m("div",null,"目标链费: "+u(F.value.breakdown.destFee)+" "+u(F.value.currency),1),m("div",null,"桥接费: "+u(F.value.breakdown.bridgeFee)+" "+u(F.value.currency),1)])]),_:1})):h("",!0)]),_:1},8,["open","confirm-loading"])])}}},Vt=qe(Ut,[["__scopeId","data-v-04225cba"]]);export{Vt as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
.page-title[data-v-04225cba]{margin:0;color:var(--text-primary);font-size:22px;font-weight:600}.page-sub[data-v-04225cba]{margin:4px 0 0;color:var(--text-secondary);font-size:13px}.xchain-tabs[data-v-04225cba] .ant-tabs-nav{margin-bottom:16px}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
[data-v-f2137559] .did-row:hover td{background:var(--bg-card-hover)!important}[data-v-f2137559] .ant-card-head{border-color:var(--border-color)!important;color:var(--text-primary)!important}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{u as ge}from"./ws-4ur1fGsk.js";import{_ as xe}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{a as f}from"./index-BB5y5Y0z.js";import{_ as be,ah as ke,I as De,K as he,am as X,r as we,b as Ie}from"./icons-CJACPYXu.js";import{l as ze,F as I,D as b,c as t,x as a,m as $,G as k,q as r,r as c,v,J as p,u as z,I as g,j as Y}from"./vendor-D0Qjn73K.js";import"./index-Vit9TJBu.js";import"./useConfigInject-DIkkDpt1.js";import"./transition-CVd2ueaJ.js";import"./Keyframes-C7fCrnlS.js";import"./Portal-SsPhn64D.js";import"./index-U4Zd5IK6.js";function G(n){if(!n)return null;const o=n.trim();try{return JSON.parse(o)}catch{const u=o.match(/(\[[\s\S]*\]|\{[\s\S]*\})/);if(!u)return null;try{return JSON.parse(u[1])}catch{return null}}}function E(n,o=0){if(!n||typeof n!="object")return null;const u=n.did||n.id||"";if(!u)return null;const d=n.displayName??n.display_name??n.name??"",C=n.isDefault===!0||n.is_default===1||n.is_default===!0||n.default===!0,m=n.publicKey??n.public_key??"",h=n.createdAt??n.created_at??n.created??"",x=(u.split(":")[1]||"chainless").trim();return{key:u,did:u,displayName:d||"",publicKey:m||"",isDefault:!!C,createdAt:h||"",method:x,raw:n.document?n:null,_idx:o}}function Ce(n){const o=G(n);return Array.isArray(o)?o.map(E).filter(Boolean):o&&Array.isArray(o.identities)?o.identities.map(E).filter(Boolean):Se(n||"")}function Se(n){const o=(n||"").split(`
|
|
2
|
-
`),u=[];let d=null;for(const C of o){const m=C.trim();if(!m||m.startsWith("─")||m.startsWith("="))continue;const h=m.match(/(did:[a-z0-9]+:[A-Za-z0-9_-]+)/);if(h&&/^did:/.test(m)){d&&u.push(d);const x=h[1],S=m.match(/\(([^)]+)\)/),D=/\[default\]|默认|\*/.test(m);d={key:x,did:x,displayName:S?S[1]:"",publicKey:"",isDefault:D,createdAt:"",method:(x.split(":")[1]||"chainless").trim(),raw:null,_idx:u.length};continue}if(d){const x=m.match(/created\s*[::]\s*(.+)$/i);x&&(d.createdAt=x[1].trim())}}return d&&u.push(d),u}function Ne(n){const o=G(n);if(!o||typeof o!="object"||Array.isArray(o))return null;const u=E(o);return u?(u.document=o.document||null,u):null}function $e(n){const o=G(n);if(o&&typeof o=="object"&&o.signature)return{did:o.did||"",message:o.message||"",signature:String(o.signature)};const d=(n||"").match(/Signature[::]\s*([a-f0-9]+)/i);return d?{did:"",message:"",signature:d[1]}:null}const Ae={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},Oe={key:1,style:{"text-align":"center",padding:"60px"}},je={key:0,style:{color:"#e0e0e0","font-family":"monospace","font-size":"12px"}},Me={key:1,style:{color:"var(--text-primary)"}},Te={key:3,style:{color:"var(--text-secondary)","font-size":"12px"}},Be={key:0,style:{"margin-top":"12px"}},Ke={style:{"font-family":"monospace",color:"#ccc","word-break":"break-all"}},Pe={style:{"font-family":"monospace",color:"#888","font-size":"11px","word-break":"break-all"}},Je={style:{"margin-top":"16px",display:"flex",gap:"8px","flex-wrap":"wrap"}},Ue={key:0,style:{"margin-top":"16px"}},Fe={style:{"white-space":"pre-wrap","word-break":"break-all",color:"#52c41a","font-size":"11px",background:"var(--bg-base)",padding:"12px","border-radius":"6px",border:"1px solid var(--border-color)","max-height":"320px",overflow:"auto"}},Re={key:0,style:{"margin-top":"12px"}},We={style:{"white-space":"pre-wrap","word-break":"break-all",color:"#52c41a","font-size":"11px",background:"var(--bg-base)",padding:"12px","border-radius":"6px",border:"1px solid var(--border-color)"}},Le={__name:"DID",setup(n){const o=ge(),u=c(!1),d=c(!1),C=c(!1),m=c(!1),h=c(""),x=c(""),S=c(!1),D=c([]),T=c(!1),F=c(!1),R=c(!1),B=c(""),y=c(null),A=c(""),W=c(""),O=c(""),j=c(null),ee=[{title:"DID",key:"did",dataIndex:"did",ellipsis:!0},{title:"名称",key:"displayName",dataIndex:"displayName",width:"160px"},{title:"方法",key:"method",dataIndex:"method",width:"110px"},{title:"创建时间",key:"createdAt",dataIndex:"createdAt",width:"180px"},{title:"默认",key:"isDefault",width:"90px"},{title:"操作",key:"action",width:"280px"}],Z=Y(()=>{const l=D.value.find(s=>s.isDefault);if(!l)return"未设置";const e=l.did;return e.length>24?e.slice(0,12)+"..."+e.slice(-8):e}),te=Y(()=>{const l=new Set(D.value.map(e=>e.method).filter(Boolean));return l.size===0?"无":l.size===1?[...l][0]:[...l].join(", ")});async function M(){d.value=!0;try{const{output:l}=await o.execute("did list --json",15e3);D.value=Ce(l)}catch(l){f.error("加载 DID 列表失败: "+l.message),D.value=[]}finally{d.value=!1}}async function ae(){C.value=!0;try{const l=B.value.trim(),e=l?`did create --name "${l.replace(/"/g,'\\"')}" --json`:"did create --json",{output:s}=await o.execute(e,2e4);/error|失败/i.test(s)&&!s.includes('"did"')?f.error("创建失败: "+s.slice(0,120)):(f.success("DID 身份已创建"),T.value=!1,B.value="",await M())}catch(l){f.error("创建失败: "+l.message)}finally{C.value=!1}}async function le(l){h.value=l.did;try{const{output:e,exitCode:s}=await o.execute(`did set-default ${l.did}`,15e3);s!==0||/error|not found|失败/i.test(e)?f.error("设置失败: "+e.slice(0,120)):(f.success("已设为默认身份"),await M())}catch(e){f.error("设置失败: "+e.message)}finally{h.value=""}}async function oe(l){x.value=l.did;try{const{output:e,exitCode:s}=await o.execute(`did delete ${l.did} --force`,15e3);s!==0||/error|not found|失败/i.test(e)?f.error("删除失败: "+e.slice(0,120)):(f.success("身份已删除"),await M())}catch(e){f.error("删除失败: "+e.message)}finally{x.value=""}}async function ne(l){if(y.value={...l},A.value="",F.value=!0,!l.publicKey)try{const{output:e}=await o.execute(`did show ${l.did} --json`,1e4),s=Ne(e);s&&(y.value={...y.value,...s})}catch{}}async function se(l){S.value=!0;try{const{output:e}=await o.execute(`did resolve ${l.did}`,1e4);try{A.value=JSON.stringify(JSON.parse(e.trim()),null,2)}catch{A.value=e.trim()}}catch(e){f.error("加载 DID Document 失败: "+e.message)}finally{S.value=!1}}function ie(l){W.value=l.did,O.value="",j.value=null,R.value=!0}async function re(){if(!O.value.trim()){f.warning("请输入要签名的消息");return}m.value=!0,j.value=null;try{const e=`did sign "${O.value.replace(/"/g,'\\"')}" --did ${W.value} --json`,{output:s,exitCode:K}=await o.execute(e,15e3),w=$e(s);w&&w.signature?(j.value=w,f.success("签名成功")):f.error("签名失败: "+(s||`exit ${K}`).slice(0,120))}catch(l){f.error("签名失败: "+l.message)}finally{m.value=!1}}return ze(()=>{M()}),(l,e)=>{const s=r("a-button"),K=r("a-space"),w=r("a-statistic"),P=r("a-card"),J=r("a-col"),ue=r("a-row"),de=r("a-alert"),ce=r("a-spin"),U=r("a-tag"),pe=r("a-popconfirm"),fe=r("a-empty"),me=r("a-table"),ye=r("a-input"),L=r("a-form-item"),V=r("a-tooltip"),Q=r("a-form"),H=r("a-modal"),N=r("a-descriptions-item"),ve=r("a-descriptions"),_e=r("a-textarea");return v(),I("div",null,[b("div",Ae,[e[9]||(e[9]=b("div",null,[b("h2",{class:"page-title"},"DID 身份管理"),b("p",{class:"page-sub"},"去中心化身份 / 密钥 / 签名验证")],-1)),t(K,null,{default:a(()=>[t(s,{loading:d.value,onClick:M},{icon:a(()=>[t(z(be))]),default:a(()=>[e[7]||(e[7]=p(" 刷新 ",-1))]),_:1},8,["loading"]),t(s,{type:"primary",onClick:e[0]||(e[0]=i=>T.value=!0)},{icon:a(()=>[t(z(ke))]),default:a(()=>[e[8]||(e[8]=p(" 创建身份 ",-1))]),_:1})]),_:1})]),t(ue,{gutter:[16,16],style:{"margin-bottom":"20px"}},{default:a(()=>[t(J,{xs:24,sm:12,lg:6},{default:a(()=>[t(P,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[t(w,{title:"身份数量",value:D.value.length,"value-style":{color:"#1677ff",fontSize:"20px"}},{prefix:a(()=>[t(z(De))]),_:1},8,["value"])]),_:1})]),_:1}),t(J,{xs:24,sm:12,lg:6},{default:a(()=>[t(P,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[t(w,{title:"默认身份",value:Z.value,"value-style":{color:Z.value!=="未设置"?"#52c41a":"#888",fontSize:"13px",fontFamily:"monospace"}},null,8,["value","value-style"])]),_:1})]),_:1}),t(J,{xs:24,sm:12,lg:6},{default:a(()=>[t(P,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[t(w,{title:"DID 方法",value:te.value,"value-style":{color:"#722ed1",fontSize:"14px"}},null,8,["value"])]),_:1})]),_:1}),t(J,{xs:24,sm:12,lg:6},{default:a(()=>[t(P,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[t(w,{title:"可签名",value:D.value.length>0?"是":"否","value-style":{color:D.value.length>0?"#52c41a":"#ff4d4f",fontSize:"20px"}},{prefix:a(()=>[t(z(he))]),_:1},8,["value","value-style"])]),_:1})]),_:1})]),_:1}),u.value?k("",!0):(v(),$(de,{key:0,message:"仅 Web 模式",description:"助记词备份/恢复 与 DHT 网络发布 仅在桌面端可用,本页面禁用相关按钮。所有创建/签名/删除操作通过 CLI 转发执行。",type:"info","show-icon":"",closable:"",style:{"margin-bottom":"16px"}})),d.value?(v(),I("div",Oe,[t(ce,{size:"large"})])):(v(),$(me,{key:2,columns:ee,"data-source":D.value,pagination:{pageSize:20,showTotal:i=>`共 ${i} 条`},size:"small",style:{background:"var(--bg-card)"},"row-class-name":()=>"did-row"},{bodyCell:a(({column:i,record:_})=>[i.key==="did"?(v(),I("span",je,g(_.did),1)):k("",!0),i.key==="displayName"?(v(),I("span",Me,g(_.displayName||"-"),1)):k("",!0),i.key==="method"?(v(),$(U,{key:2,color:"blue"},{default:a(()=>[p(g(_.method),1)]),_:2},1024)):k("",!0),i.key==="createdAt"?(v(),I("span",Te,g(_.createdAt||"-"),1)):k("",!0),i.key==="isDefault"?(v(),$(U,{key:4,color:_.isDefault?"green":"default"},{default:a(()=>[p(g(_.isDefault?"默认":"-"),1)]),_:2},1032,["color"])):k("",!0),i.key==="action"?(v(),$(K,{key:5,size:"small"},{default:a(()=>[t(s,{size:"small",type:"link",onClick:q=>ne(_)},{default:a(()=>[...e[10]||(e[10]=[p(" 详情 ",-1)])]),_:1},8,["onClick"]),t(s,{size:"small",type:"link",onClick:q=>ie(_)},{default:a(()=>[...e[11]||(e[11]=[p(" 签名 ",-1)])]),_:1},8,["onClick"]),_.isDefault?k("",!0):(v(),$(s,{key:0,size:"small",type:"link",loading:h.value===_.did,onClick:q=>le(_)},{default:a(()=>[...e[12]||(e[12]=[p(" 设为默认 ",-1)])]),_:1},8,["loading","onClick"])),t(pe,{title:"确定删除该 DID 身份吗?删除后私钥将无法找回。","ok-text":"删除","ok-type":"danger","cancel-text":"取消",onConfirm:q=>oe(_)},{default:a(()=>[t(s,{size:"small",type:"link",danger:"",loading:x.value===_.did},{default:a(()=>[...e[13]||(e[13]=[p(" 删除 ",-1)])]),_:1},8,["loading"])]),_:2},1032,["onConfirm"])]),_:2},1024)):k("",!0)]),emptyText:a(()=>[t(fe,{description:"暂无 DID 身份,点击「创建身份」添加"})]),_:1},8,["data-source","pagination"])),t(H,{open:T.value,"onUpdate:open":e[2]||(e[2]=i=>T.value=i),title:"创建 DID 身份","confirm-loading":C.value,onOk:ae,"ok-text":"创建","cancel-text":"取消"},{default:a(()=>[t(Q,{"label-col":{span:6},"wrapper-col":{span:18},style:{"margin-top":"16px"}},{default:a(()=>[t(L,{label:"显示名称"},{default:a(()=>[t(ye,{value:B.value,"onUpdate:value":e[1]||(e[1]=i=>B.value=i),placeholder:"可选 — 用于识别身份","allow-clear":""},null,8,["value"])]),_:1}),t(L,{"wrapper-col":{offset:6,span:18}},{default:a(()=>[t(V,{title:"桌面应用专属:BIP39 助记词派生密钥"},{default:a(()=>[t(s,{disabled:"",style:{"margin-right":"8px"}},{icon:a(()=>[t(z(X))]),default:a(()=>[e[14]||(e[14]=p(" 从助记词导入 ",-1))]),_:1})]),_:1}),e[15]||(e[15]=b("span",{style:{color:"var(--text-muted)","font-size":"11px"}},"需桌面端",-1))]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"]),t(H,{open:F.value,"onUpdate:open":e[4]||(e[4]=i=>F.value=i),title:`身份详情:${y.value?.displayName||y.value?.did?.slice(0,24)||""}`,width:720,footer:null},{default:a(()=>[y.value?(v(),I("div",Be,[t(ve,{column:1,bordered:"",size:"small"},{default:a(()=>[t(N,{label:"DID"},{default:a(()=>[b("span",Ke,g(y.value.did),1)]),_:1}),t(N,{label:"名称"},{default:a(()=>[p(g(y.value.displayName||"-"),1)]),_:1}),t(N,{label:"方法"},{default:a(()=>[t(U,{color:"blue"},{default:a(()=>[p(g(y.value.method),1)]),_:1})]),_:1}),t(N,{label:"默认"},{default:a(()=>[t(U,{color:y.value.isDefault?"green":"default"},{default:a(()=>[p(g(y.value.isDefault?"是":"否"),1)]),_:1},8,["color"])]),_:1}),t(N,{label:"创建时间"},{default:a(()=>[p(g(y.value.createdAt||"-"),1)]),_:1}),t(N,{label:"公钥(hex)"},{default:a(()=>[b("span",Pe,g(y.value.publicKey||"加载中..."),1)]),_:1})]),_:1}),b("div",Je,[t(V,{title:"桌面应用专属:导出 BIP39 助记词以备份"},{default:a(()=>[t(s,{disabled:""},{icon:a(()=>[t(z(X))]),default:a(()=>[e[16]||(e[16]=p(" 导出助记词 ",-1))]),_:1})]),_:1}),t(V,{title:"桌面应用专属:发布到 P2P DHT 网络以供他人解析"},{default:a(()=>[t(s,{disabled:""},{icon:a(()=>[t(z(we))]),default:a(()=>[e[17]||(e[17]=p(" 发布到 DHT ",-1))]),_:1})]),_:1}),t(s,{loading:S.value,onClick:e[3]||(e[3]=i=>se(y.value))},{icon:a(()=>[t(z(Ie))]),default:a(()=>[e[18]||(e[18]=p(" 查看 DID Document ",-1))]),_:1},8,["loading"])]),A.value?(v(),I("div",Ue,[e[19]||(e[19]=b("p",{style:{color:"var(--text-secondary)","margin-bottom":"6px"}},"DID Document (W3C):",-1)),b("pre",Fe,g(A.value),1)])):k("",!0)])):k("",!0)]),_:1},8,["open","title"]),t(H,{open:R.value,"onUpdate:open":e[6]||(e[6]=i=>R.value=i),title:`签名消息:${W.value?.slice(0,28)||"默认身份"}...`,"confirm-loading":m.value,onOk:re,"ok-text":"签名","cancel-text":"取消"},{default:a(()=>[t(Q,{"label-col":{span:4},"wrapper-col":{span:20},style:{"margin-top":"16px"}},{default:a(()=>[t(L,{label:"消息",required:""},{default:a(()=>[t(_e,{value:O.value,"onUpdate:value":e[5]||(e[5]=i=>O.value=i),placeholder:"请输入要签名的消息","auto-size":{minRows:3,maxRows:8}},null,8,["value"])]),_:1})]),_:1}),j.value?(v(),I("div",Re,[e[20]||(e[20]=b("p",{style:{color:"var(--text-secondary)","margin-bottom":"6px"}},"签名结果(hex):",-1)),b("pre",We,g(j.value.signature),1)])):k("",!0)]),_:1},8,["open","title","confirm-loading"])])}}},at=xe(Le,[["__scopeId","data-v-f2137559"]]);export{at as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
.stat-card[data-v-ab1b4e86]{background:var(--bg-card)!important;border-color:var(--border-color)!important;transition:border-color .2s}.stat-card[data-v-ab1b4e86]:hover{border-color:var(--text-muted)!important}.stat-header[data-v-ab1b4e86]{display:flex;justify-content:space-between;align-items:center;margin-bottom:6px}.stat-label[data-v-ab1b4e86]{color:var(--text-secondary);font-size:12px}.stat-value[data-v-ab1b4e86]{font-size:22px;font-weight:600;line-height:1.2;margin-bottom:4px}.stat-sub[data-v-ab1b4e86]{color:var(--text-muted);font-size:11px}.gateway-card[data-v-ab1b4e86]{border-left:3px solid #1677ff!important}.status-log[data-v-ab1b4e86]{background:var(--bg-base);border:1px solid var(--border-color);border-radius:6px;padding:10px 14px;color:var(--text-secondary);font-size:11px;font-family:Consolas,monospace;max-height:200px;overflow-y:auto;white-space:pre-wrap;margin:0;line-height:1.6}.telemetry-card[data-v-ab1b4e86]{background:var(--bg-base);border:1px solid var(--border-color);border-radius:8px;padding:14px;height:100%}.telemetry-filter[data-v-ab1b4e86]{display:flex;flex-direction:column;gap:6px}.telemetry-filter-label[data-v-ab1b4e86]{color:var(--text-muted);font-size:12px}.telemetry-label[data-v-ab1b4e86]{color:var(--text-muted);font-size:12px;margin-bottom:6px}.telemetry-value[data-v-ab1b4e86]{color:#91caff;font-size:24px;font-weight:600;line-height:1.2}.telemetry-sub[data-v-ab1b4e86]{color:var(--text-secondary);font-size:11px;margin-top:4px}.telemetry-section[data-v-ab1b4e86]{background:var(--bg-base);border:1px solid var(--border-color);border-radius:8px;padding:14px;min-height:140px}.telemetry-section-title[data-v-ab1b4e86]{color:var(--text-secondary);font-size:12px;margin-bottom:10px}.telemetry-list[data-v-ab1b4e86]{display:flex;flex-direction:column;gap:8px}.telemetry-row[data-v-ab1b4e86]{display:flex;justify-content:space-between;gap:12px;color:var(--text-secondary);font-size:12px}.telemetry-empty[data-v-ab1b4e86]{color:var(--text-muted);font-size:12px}
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import{k as le,r as O,l as oe,M as ae,F as p,D as l,I as o,u as r,c as t,x as s,m as A,G as q,j as S,q as x,B as ne,v as i,J as m,N as J,H as P,L as j}from"./vendor-D0Qjn73K.js";import{u as W}from"./ws-4ur1fGsk.js";import{u as re}from"./chat-DY27mJje.js";import{_ as ie}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{_ as ue,F as de,$ as Z,c as K,M as Q,Z as ve,a0 as ce,b as X,a1 as pe,d as me}from"./icons-CJACPYXu.js";function fe(){return{samples:0,compressedSamples:0,hitRate:0,totalSavedTokens:0,averageSavedTokens:0,totalOriginalTokens:0,totalCompressedTokens:0,netSavingsRate:0,variantDistribution:{},strategyDistribution:[],providerDistribution:[],modelDistribution:[]}}const ye=le("dashboard",()=>{const B=O(!1),E=O(!1),d=O({wsStatus:"disconnected",activeLlm:null,activeModel:null,skillCount:0,sessionCount:0,providerCount:0,appRunning:!1,setupDone:!1,edition:"",mcpCount:null,noteCount:null}),F=O(""),y=O(fe()),v=O({windowPreset:"all",provider:"",model:""});let _=null;function N(n=W()){_||(_=n.onRuntimeEvent(c=>{c.type==="compression:summary"?M(c.payload?.summary||{}):c.type==="session:start"?d.value.sessionCount=(d.value.sessionCount||0)+1:c.type==="session:end"&&(d.value.sessionCount=Math.max(0,(d.value.sessionCount||0)-1))}))}function I(){_&&(_(),_=null)}function M(n){y.value={...y.value,...n||{}}}function U(n){return n==="1h"?3600*1e3:n==="24h"?1440*60*1e3:n==="7d"?10080*60*1e3:null}function R(n){d.value.appRunning=n.includes("Desktop app running"),d.value.setupDone=n.includes("Setup completed");const c=n.match(/Edition:\s+(\S+)/i);c&&(d.value.edition=c[1]);const b=n.match(/LLM:\s+(\S+)\s+\(([^)]+)\)/i);if(b)d.value.activeLlm=b[1],d.value.activeModel=b[2];else{const k=n.match(/LLM:\s+(\S+)/i);k&&(d.value.activeLlm=k[1])}}async function f(){const n=W();N(n),E.value=!0;const c={type:"compression-stats",windowMs:U(v.value.windowPreset)};v.value.provider&&(c.provider=v.value.provider),v.value.model&&(c.model=v.value.model);try{const b=await n.sendRaw(c,1e4);M(b.summary||{})}catch{}finally{E.value=!1}}async function g(){const n=W();N(n),B.value=!0,d.value.wsStatus=n.status,F.value="";try{const[c,b]=await Promise.allSettled([n.execute("status",15e3),n.listSessions()]);if(c.status==="fulfilled"){const k=c.value.output;F.value=k.split(`
|
|
2
|
-
`).slice(0,20).join(`
|
|
3
|
-
`),R(k)}b.status==="fulfilled"&&(d.value.sessionCount=b.value.length),Promise.allSettled([n.execute("skill sources",15e3),n.execute("llm providers",15e3)]).then(([k,$])=>{if(k.status==="fulfilled"){const z=k.value.output.match(/(\d+)\s*(?:skills|技能)/i);z&&(d.value.skillCount=parseInt(z[1],10))}if($.status==="fulfilled"){const V=$.value.output.match(/active[:\s]+(\S+)/i);V&&!d.value.activeLlm&&(d.value.activeLlm=V[1])}}),n.execute("mcp servers",1e4).then(({output:k})=>{const $=(k.match(/^[a-z]/gm)||[]).length;d.value.mcpCount=$}).catch(()=>{d.value.mcpCount=0}),await f()}catch{}finally{B.value=!1}}return{loading:B,compressionLoading:E,stats:d,statusLog:F,compression:y,telemetryFilters:v,ensureRuntimeSubscription:N,stopRuntimeSubscription:I,refresh:g,refreshCompression:f,applyCompressionSummary:M,toWindowMs:U}}),_e={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"20px"}},ge={class:"page-sub"},be={style:{display:"flex","align-items":"center",gap:"12px","flex-wrap":"wrap"}},ke={style:{color:"#91caff","font-weight":"600"}},we={style:{color:"#4a6fa5","font-size":"11px","font-family":"monospace"}},Ce={class:"stat-header"},xe={class:"stat-sub"},Se={class:"stat-header"},he={class:"stat-value",style:{color:"#91caff","font-size":"15px",overflow:"hidden","text-overflow":"ellipsis","white-space":"nowrap"}},Re={class:"stat-sub",style:{overflow:"hidden","text-overflow":"ellipsis","white-space":"nowrap"}},$e={class:"stat-header"},ze={class:"stat-value",style:{color:"#1677ff"}},De={class:"stat-header"},Le={class:"stat-value",style:{color:"#c084fc"}},Me={class:"stat-header"},Te={class:"stat-sub"},Oe={class:"stat-header"},Pe={class:"stat-value",style:{color:"#13c2c2"}},je={class:"stat-header"},Ee={class:"stat-value",style:{color:"#faad14"}},Fe={class:"status-log"},Ne={class:"telemetry-filter"},Ie={class:"telemetry-filter"},Ae={class:"telemetry-filter"},Be={class:"telemetry-card"},Ue={class:"telemetry-value"},Ve={class:"telemetry-sub"},We={class:"telemetry-card"},Ge={class:"telemetry-value"},He={class:"telemetry-sub"},qe={class:"telemetry-card"},Je={class:"telemetry-value"},Ze={class:"telemetry-sub"},Ke={class:"telemetry-section"},Qe={key:0,class:"telemetry-empty"},Xe={key:1,class:"telemetry-list"},Ye={class:"telemetry-section"},et={key:0,class:"telemetry-empty"},tt={key:1,class:"telemetry-list"},st={class:"telemetry-section"},lt={key:0,class:"telemetry-empty"},ot={key:1,class:"telemetry-list"},at={class:"telemetry-section"},nt={key:0,class:"telemetry-empty"},rt={key:1,class:"telemetry-list"},it={style:{color:"#91caff"}},ut={style:{color:"var(--text-muted)","font-family":"monospace","font-size":"11px"}},dt={style:{color:"var(--text-secondary)","font-family":"monospace","font-size":"12px"}},vt={style:{color:"var(--text-muted)"}},ct={__name:"Dashboard",setup(B){const E=ne(),d=W(),F=re(),y=ye(),v=window.__CC_CONFIG__||{},_=S(()=>v.mode==="project"),N="v5.0.3.1",I=S(()=>d.status),M=S(()=>y.loading),U=S(()=>y.statusLog),R=S(()=>y.telemetryFilters),f=S(()=>y.compression),g=S(()=>y.stats),n=S(()=>Object.entries(f.value.variantDistribution||{})),c=S(()=>f.value.providerDistribution||[]),b=S(()=>f.value.modelDistribution||[]);async function k(){await y.refresh()}async function $(){await y.refreshCompression()}function z(w){return`${((w||0)*100).toFixed(1)}%`}async function V(){await F.createSession("agent"),E.push("/chat")}return oe(()=>{y.ensureRuntimeSubscription(d),setTimeout(k,300)}),ae(()=>{y.stopRuntimeSubscription()}),(w,e)=>{const D=x("a-button"),G=x("a-tag"),C=x("a-card"),Y=x("a-badge"),u=x("a-col"),h=x("a-row"),ee=x("a-space"),L=x("a-select-option"),H=x("a-select"),T=x("a-descriptions-item"),te=x("a-descriptions");return i(),p("div",null,[l("div",_e,[l("div",null,[e[13]||(e[13]=l("h2",{class:"page-title"},"仪表板",-1)),l("p",ge,o(_.value?`项目「${r(v).projectName||"未命名"}」运行概览`:"ChainlessChain 全局运行概览"),1)]),t(D,{type:"primary",ghost:"",loading:M.value,onClick:k},{icon:s(()=>[t(r(ue))]),default:s(()=>[e[14]||(e[14]=m(" 刷新 ",-1))]),_:1},8,["loading"])]),_.value?(i(),A(C,{key:0,style:{background:"rgba(22,119,255,.08)","border-color":"rgba(22,119,255,.25)","margin-bottom":"16px"},size:"small"},{default:s(()=>[l("div",be,[t(r(de),{style:{color:"#1677ff","font-size":"18px"}}),l("div",null,[l("div",ke,o(r(v).projectName||"项目"),1),l("div",we,o(r(v).projectRoot),1)]),t(G,{color:"blue",style:{"margin-left":"auto"}},{default:s(()=>[...e[15]||(e[15]=[m("项目面板",-1)])]),_:1})])]),_:1})):q("",!0),t(h,{gutter:[12,12],style:{"margin-bottom":"16px"}},{default:s(()=>[t(u,{xs:24,sm:12,lg:6},{default:s(()=>[t(C,{class:"stat-card gateway-card",size:"small"},{default:s(()=>[l("div",Ce,[e[16]||(e[16]=l("span",{class:"stat-label"},"WebSocket Gateway",-1)),t(Y,{status:I.value==="connected"?"success":"error"},null,8,["status"])]),l("div",{class:"stat-value",style:J({color:I.value==="connected"?"#52c41a":"#888"})},o(I.value==="connected"?"运行中":"未连接"),5),l("div",xe,"端口 "+o(r(v).wsPort||18800)+" · "+o(r(v).wsHost||"127.0.0.1"),1)]),_:1})]),_:1}),t(u,{xs:24,sm:12,lg:6},{default:s(()=>[t(C,{class:"stat-card",size:"small"},{default:s(()=>[l("div",Se,[e[17]||(e[17]=l("span",{class:"stat-label"},"当前 LLM",-1)),t(r(Z),{style:{color:"#1677ff"}})]),l("div",he,o(g.value.activeLlm||"未配置"),1),l("div",Re,o(g.value.activeModel||"—"),1)]),_:1})]),_:1}),t(u,{xs:24,sm:12,lg:6},{default:s(()=>[t(C,{class:"stat-card",size:"small",style:{cursor:"pointer"},onClick:e[0]||(e[0]=a=>w.$router.push("/skills"))},{default:s(()=>[l("div",$e,[e[18]||(e[18]=l("span",{class:"stat-label"},"可用技能",-1)),t(r(K),{style:{color:"#1677ff"}})]),l("div",ze,o(g.value.skillCount||"—"),1),e[19]||(e[19]=l("div",{class:"stat-sub"},"点击管理技能",-1))]),_:1})]),_:1}),t(u,{xs:24,sm:12,lg:6},{default:s(()=>[t(C,{class:"stat-card",size:"small",style:{cursor:"pointer"},onClick:e[1]||(e[1]=a=>w.$router.push("/chat"))},{default:s(()=>[l("div",De,[e[20]||(e[20]=l("span",{class:"stat-label"},"AI 会话",-1)),t(r(Q),{style:{color:"#722ed1"}})]),l("div",Le,o(g.value.sessionCount),1),e[21]||(e[21]=l("div",{class:"stat-sub"},"点击进入对话",-1))]),_:1})]),_:1})]),_:1}),t(h,{gutter:[12,12],style:{"margin-bottom":"16px"}},{default:s(()=>[t(u,{xs:24,sm:8},{default:s(()=>[t(C,{class:"stat-card",size:"small"},{default:s(()=>[l("div",Me,[e[22]||(e[22]=l("span",{class:"stat-label"},"应用状态",-1)),t(r(ve),{style:J({color:g.value.appRunning?"#52c41a":"#888"})},null,8,["style"])]),l("div",{class:"stat-value",style:J({color:g.value.appRunning?"#52c41a":"#888",fontSize:"15px"})},o(g.value.appRunning?"运行中":g.value.setupDone?"已初始化":"未启动"),5),l("div",Te,o(g.value.edition||"Community")+" Edition",1)]),_:1})]),_:1}),t(u,{xs:24,sm:8},{default:s(()=>[t(C,{class:"stat-card",size:"small",style:{cursor:"pointer"},onClick:e[2]||(e[2]=a=>w.$router.push("/mcp"))},{default:s(()=>[l("div",Oe,[e[23]||(e[23]=l("span",{class:"stat-label"},"MCP 工具",-1)),t(r(ce),{style:{color:"#13c2c2"}})]),l("div",Pe,o(g.value.mcpCount??"—"),1),e[24]||(e[24]=l("div",{class:"stat-sub"},"已挂载扩展",-1))]),_:1})]),_:1}),t(u,{xs:24,sm:8},{default:s(()=>[t(C,{class:"stat-card",size:"small",style:{cursor:"pointer"},onClick:e[3]||(e[3]=a=>w.$router.push("/notes"))},{default:s(()=>[l("div",je,[e[25]||(e[25]=l("span",{class:"stat-label"},"知识库笔记",-1)),t(r(X),{style:{color:"#faad14"}})]),l("div",Ee,o(g.value.noteCount??"—"),1),e[26]||(e[26]=l("div",{class:"stat-sub"},"点击管理笔记",-1))]),_:1})]),_:1})]),_:1}),t(h,{gutter:[16,16]},{default:s(()=>[t(u,{xs:24,lg:10},{default:s(()=>[t(C,{title:"快速操作",style:{background:"var(--bg-card)","border-color":"var(--border-color)",height:"100%"}},{default:s(()=>[t(ee,{direction:"vertical",style:{width:"100%"},size:"middle"},{default:s(()=>[t(D,{type:"primary",block:"",onClick:e[4]||(e[4]=a=>w.$router.push("/chat"))},{icon:s(()=>[t(r(Q))]),default:s(()=>[m(" "+o(_.value?"进入项目 Chat":"新建 AI 对话"),1)]),_:1}),t(D,{block:"",onClick:V,style:{background:"rgba(114,46,209,.12)","border-color":"#722ed1",color:"#722ed1"}},{icon:s(()=>[t(r(Z))]),default:s(()=>[e[27]||(e[27]=m(" 启动 Agent 模式 ",-1))]),_:1}),t(h,{gutter:8},{default:s(()=>[t(u,{span:12},{default:s(()=>[t(D,{block:"",onClick:e[5]||(e[5]=a=>w.$router.push("/services")),style:{background:"var(--bg-card-hover)","border-color":"var(--border-color)"}},{icon:s(()=>[t(r(pe))]),default:s(()=>[e[28]||(e[28]=m(" 服务管理 ",-1))]),_:1})]),_:1}),t(u,{span:12},{default:s(()=>[t(D,{block:"",onClick:e[6]||(e[6]=a=>w.$router.push("/logs")),style:{background:"var(--bg-card-hover)","border-color":"var(--border-color)"}},{icon:s(()=>[t(r(X))]),default:s(()=>[e[29]||(e[29]=m(" 查看日志 ",-1))]),_:1})]),_:1})]),_:1}),t(h,{gutter:8},{default:s(()=>[t(u,{span:12},{default:s(()=>[t(D,{block:"",onClick:e[7]||(e[7]=a=>w.$router.push("/skills")),style:{background:"var(--bg-card-hover)","border-color":"var(--border-color)"}},{icon:s(()=>[t(r(K))]),default:s(()=>[e[30]||(e[30]=m(" 技能管理 ",-1))]),_:1})]),_:1}),t(u,{span:12},{default:s(()=>[t(D,{block:"",onClick:e[8]||(e[8]=a=>w.$router.push("/providers")),style:{background:"var(--bg-card-hover)","border-color":"var(--border-color)"}},{icon:s(()=>[t(r(me))]),default:s(()=>[e[31]||(e[31]=m(" LLM 配置 ",-1))]),_:1})]),_:1})]),_:1})]),_:1})]),_:1})]),_:1}),t(u,{xs:24,lg:14},{default:s(()=>[t(C,{title:"最近状态",style:{background:"var(--bg-card)","border-color":"var(--border-color)"},loading:M.value},{extra:s(()=>[t(D,{type:"link",size:"small",onClick:e[9]||(e[9]=a=>w.$router.push("/logs"))},{default:s(()=>[...e[32]||(e[32]=[m("查看更多",-1)])]),_:1})]),default:s(()=>[l("pre",Fe,o(U.value||"点击刷新加载系统状态..."),1)]),_:1},8,["loading"])]),_:1})]),_:1}),t(C,{title:"压缩策略观测",style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-top":"16px"},loading:M.value},{default:s(()=>[t(h,{gutter:[12,12],style:{"margin-bottom":"12px"}},{default:s(()=>[t(u,{xs:24,md:8},{default:s(()=>[l("div",Ne,[e[37]||(e[37]=l("div",{class:"telemetry-filter-label"},"时间窗口",-1)),t(H,{value:R.value.windowPreset,"onUpdate:value":e[10]||(e[10]=a=>R.value.windowPreset=a),style:{width:"100%"},onChange:$},{default:s(()=>[t(L,{value:"all"},{default:s(()=>[...e[33]||(e[33]=[m("全部样本",-1)])]),_:1}),t(L,{value:"1h"},{default:s(()=>[...e[34]||(e[34]=[m("近 1 小时",-1)])]),_:1}),t(L,{value:"24h"},{default:s(()=>[...e[35]||(e[35]=[m("近 24 小时",-1)])]),_:1}),t(L,{value:"7d"},{default:s(()=>[...e[36]||(e[36]=[m("近 7 天",-1)])]),_:1})]),_:1},8,["value"])])]),_:1}),t(u,{xs:24,md:8},{default:s(()=>[l("div",Ie,[e[39]||(e[39]=l("div",{class:"telemetry-filter-label"},"Provider 切片",-1)),t(H,{value:R.value.provider,"onUpdate:value":e[11]||(e[11]=a=>R.value.provider=a),style:{width:"100%"},onChange:$},{default:s(()=>[t(L,{value:""},{default:s(()=>[...e[38]||(e[38]=[m("全部 Provider",-1)])]),_:1}),(i(!0),p(P,null,j(c.value,a=>(i(),A(L,{key:a.key,value:a.key},{default:s(()=>[m(o(a.key),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])])]),_:1}),t(u,{xs:24,md:8},{default:s(()=>[l("div",Ae,[e[41]||(e[41]=l("div",{class:"telemetry-filter-label"},"Model 切片",-1)),t(H,{value:R.value.model,"onUpdate:value":e[12]||(e[12]=a=>R.value.model=a),style:{width:"100%"},onChange:$},{default:s(()=>[t(L,{value:""},{default:s(()=>[...e[40]||(e[40]=[m("全部 Model",-1)])]),_:1}),(i(!0),p(P,null,j(b.value,a=>(i(),A(L,{key:a.key,value:a.key},{default:s(()=>[m(o(a.key),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])])]),_:1})]),_:1}),t(h,{gutter:[12,12]},{default:s(()=>[t(u,{xs:24,sm:8},{default:s(()=>[l("div",Be,[e[42]||(e[42]=l("div",{class:"telemetry-label"},"压缩命中率",-1)),l("div",Ue,o(z(f.value.hitRate)),1),l("div",Ve,o(f.value.compressedSamples)+" / "+o(f.value.samples)+" 次压缩产生了有效节省 ",1)])]),_:1}),t(u,{xs:24,sm:8},{default:s(()=>[l("div",We,[e[43]||(e[43]=l("div",{class:"telemetry-label"},"累计节省 Token",-1)),l("div",Ge,o(f.value.totalSavedTokens),1),l("div",He,"平均每次 "+o(f.value.averageSavedTokens)+" Token",1)])]),_:1}),t(u,{xs:24,sm:8},{default:s(()=>[l("div",qe,[e[44]||(e[44]=l("div",{class:"telemetry-label"},"净节省率",-1)),l("div",Je,o(z(f.value.netSavingsRate)),1),l("div",Ze," 原始 "+o(f.value.totalOriginalTokens)+" -> 压缩后 "+o(f.value.totalCompressedTokens),1)])]),_:1})]),_:1}),t(h,{gutter:[16,16],style:{"margin-top":"12px"}},{default:s(()=>[t(u,{xs:24,lg:12},{default:s(()=>[l("div",Ke,[e[45]||(e[45]=l("div",{class:"telemetry-section-title"},"策略命中分布",-1)),f.value.strategyDistribution.length===0?(i(),p("div",Qe,"暂无压缩样本")):(i(),p("div",Xe,[(i(!0),p(P,null,j(f.value.strategyDistribution.slice(0,6),a=>(i(),p("div",{key:a.strategy,class:"telemetry-row"},[l("span",null,o(a.strategy),1),l("span",null,o(a.hits)+" 次 · "+o(z(a.hitRate)),1)]))),128))]))])]),_:1}),t(u,{xs:24,lg:12},{default:s(()=>[l("div",Ye,[e[46]||(e[46]=l("div",{class:"telemetry-section-title"},"变体分布",-1)),n.value.length===0?(i(),p("div",et,"暂无变体数据")):(i(),p("div",tt,[(i(!0),p(P,null,j(n.value,([a,se])=>(i(),p("div",{key:a,class:"telemetry-row"},[l("span",null,o(a),1),l("span",null,o(se)+" 次",1)]))),128))]))])]),_:1})]),_:1}),t(h,{gutter:[16,16],style:{"margin-top":"12px"}},{default:s(()=>[t(u,{xs:24,lg:12},{default:s(()=>[l("div",st,[e[47]||(e[47]=l("div",{class:"telemetry-section-title"},"Provider 切片",-1)),c.value.length===0?(i(),p("div",lt,"暂无 Provider 数据")):(i(),p("div",ot,[(i(!0),p(P,null,j(c.value.slice(0,6),a=>(i(),p("div",{key:a.key,class:"telemetry-row"},[l("span",null,o(a.key),1),l("span",null,o(a.samples)+" 次 · "+o(z(a.hitRate)),1)]))),128))]))])]),_:1}),t(u,{xs:24,lg:12},{default:s(()=>[l("div",at,[e[48]||(e[48]=l("div",{class:"telemetry-section-title"},"Model 切片",-1)),b.value.length===0?(i(),p("div",nt,"暂无 Model 数据")):(i(),p("div",rt,[(i(!0),p(P,null,j(b.value.slice(0,6),a=>(i(),p("div",{key:a.key,class:"telemetry-row"},[l("span",null,o(a.key),1),l("span",null,o(a.samples)+" 次 · "+o(a.savedTokens)+" saved",1)]))),128))]))])]),_:1})]),_:1})]),_:1},8,["loading"]),t(C,{title:"运行信息",style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-top":"16px"}},{default:s(()=>[t(te,{column:{xs:1,sm:2,lg:3},size:"small"},{default:s(()=>[t(T,{label:"面板模式"},{default:s(()=>[t(G,{color:_.value?"blue":"purple"},{default:s(()=>[m(o(_.value?"项目级":"全局"),1)]),_:1},8,["color"])]),_:1}),_.value?(i(),A(T,{key:0,label:"项目名称"},{default:s(()=>[l("span",it,o(r(v).projectName||"—"),1)]),_:1})):q("",!0),_.value?(i(),A(T,{key:1,label:"项目路径"},{default:s(()=>[l("span",ut,o(r(v).projectRoot),1)]),_:1})):q("",!0),t(T,{label:"WebSocket"},{default:s(()=>[l("span",dt," ws://"+o(r(v).wsHost||"127.0.0.1")+":"+o(r(v).wsPort||18800),1)]),_:1}),t(T,{label:"认证"},{default:s(()=>[t(G,{color:r(v).wsToken?"green":"default",style:{"font-size":"11px"}},{default:s(()=>[m(o(r(v).wsToken?"已启用":"未启用"),1)]),_:1},8,["color"])]),_:1}),t(T,{label:"版本"},{default:s(()=>[l("span",vt,o(r(N)),1)]),_:1})]),_:1})]),_:1})])}}},gt=ie(ct,[["__scopeId","data-v-ab1b4e86"]]);export{gt as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{_ as m,c as V,J as B}from"./useConfigInject-DIkkDpt1.js";import{P as n}from"./index-U4Zd5IK6.js";import{T as D}from"./Trigger-CxnChVoS.js";import{c as g}from"./vnode-xRp-KMjS.js";import{d as M,r as v,w as L,c as d,H as W,j as y}from"./vendor-D0Qjn73K.js";const l={adjustX:1,adjustY:1},s=[0,0],$={topLeft:{points:["bl","tl"],overflow:l,offset:[0,-4],targetOffset:s},topCenter:{points:["bc","tc"],overflow:l,offset:[0,-4],targetOffset:s},topRight:{points:["br","tr"],overflow:l,offset:[0,-4],targetOffset:s},bottomLeft:{points:["tl","bl"],overflow:l,offset:[0,4],targetOffset:s},bottomCenter:{points:["tc","bc"],overflow:l,offset:[0,4],targetOffset:s},bottomRight:{points:["tr","br"],overflow:l,offset:[0,4],targetOffset:s}};var F=function(e,c){var r={};for(var o in e)Object.prototype.hasOwnProperty.call(e,o)&&c.indexOf(o)<0&&(r[o]=e[o]);if(e!=null&&typeof Object.getOwnPropertySymbols=="function")for(var a=0,o=Object.getOwnPropertySymbols(e);a<o.length;a++)c.indexOf(o[a])<0&&Object.prototype.propertyIsEnumerable.call(e,o[a])&&(r[o[a]]=e[o[a]]);return r};const X=M({compatConfig:{MODE:3},props:{minOverlayWidthMatchTrigger:{type:Boolean,default:void 0},arrow:{type:Boolean,default:!1},prefixCls:n.string.def("rc-dropdown"),transitionName:String,overlayClassName:n.string.def(""),openClassName:String,animation:n.any,align:n.object,overlayStyle:{type:Object,default:void 0},placement:n.string.def("bottomLeft"),overlay:n.any,trigger:n.oneOfType([n.string,n.arrayOf(n.string)]).def("hover"),alignPoint:{type:Boolean,default:void 0},showAction:n.array,hideAction:n.array,getPopupContainer:Function,visible:{type:Boolean,default:void 0},defaultVisible:{type:Boolean,default:!1},mouseEnterDelay:n.number.def(.15),mouseLeaveDelay:n.number.def(.1)},emits:["visibleChange","overlayClick"],setup(e,c){let{slots:r,emit:o,expose:a}=c;const f=v(!!e.visible);L(()=>e.visible,t=>{t!==void 0&&(f.value=t)});const p=v();a({triggerRef:p});const b=t=>{e.visible===void 0&&(f.value=!1),o("overlayClick",t)},h=t=>{e.visible===void 0&&(f.value=t),o("visibleChange",t)},C=()=>{var t;const i=(t=r.overlay)===null||t===void 0?void 0:t.call(r),u={prefixCls:`${e.prefixCls}-menu`,onClick:b};return d(W,{key:B},[e.arrow&&d("div",{class:`${e.prefixCls}-arrow`},null),g(i,u,!1)])},w=y(()=>{const{minOverlayWidthMatchTrigger:t=!e.alignPoint}=e;return t}),O=()=>{var t;const i=(t=r.default)===null||t===void 0?void 0:t.call(r);return f.value&&i?g(i[0],{class:e.openClassName||`${e.prefixCls}-open`},!1):i},P=y(()=>!e.hideAction&&e.trigger.indexOf("contextmenu")!==-1?["click"]:e.hideAction);return()=>{const{prefixCls:t,arrow:i,showAction:u,overlayStyle:x,trigger:A,placement:N,align:j,getPopupContainer:S,transitionName:T,animation:_,overlayClassName:k}=e,E=F(e,["prefixCls","arrow","showAction","overlayStyle","trigger","placement","align","getPopupContainer","transitionName","animation","overlayClassName"]);return d(D,m(m({},E),{},{prefixCls:t,ref:p,popupClassName:V(k,{[`${t}-show-arrow`]:i}),popupStyle:x,builtinPlacements:$,action:A,showAction:u,hideAction:P.value||[],popupPlacement:N,popupAlign:j,popupTransitionName:T,popupAnimation:_,popupVisible:f.value,stretch:w.value?"minWidth":"",onPopupVisibleChange:h,getPopupContainer:S}),{popup:C,default:O})}}});export{X as D};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{u as Ze}from"./ws-4ur1fGsk.js";import{s as et}from"./community-parser-CO25nZFt.js";import{_ as tt}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{a as m}from"./index-BB5y5Y0z.js";import{_ as ot,ah as at,v as nt,aC as lt,d as st,aa as it,a9 as rt,i as ut}from"./icons-CJACPYXu.js";import{E as ct}from"./useConfigInject-DIkkDpt1.js";import{l as dt,F as I,D as A,c as o,x as a,q as f,r as x,v as c,J as p,u as h,I as d,H as E,L,m as T,G as H,j as se,a as ke}from"./vendor-D0Qjn73K.js";import"./index-Vit9TJBu.js";import"./transition-CVd2ueaJ.js";import"./Keyframes-C7fCrnlS.js";import"./Portal-SsPhn64D.js";import"./index-U4Zd5IK6.js";function z(l){const t=et(l);if(!t)return null;try{return JSON.parse(t)}catch{}const i=t.match(/\{[\s\S]*\}|\[[\s\S]*\]/);if(!i)return null;try{return JSON.parse(i[0])}catch{return null}}const je=Object.freeze(["closed","open","half_open"]),he=Object.freeze(["healthy","degraded","unhealthy","unknown"]),ze=Object.freeze(["heartbeat","latency","success_rate","cpu_usage","memory_usage"]);function k(l,t=0){return typeof l=="number"&&Number.isFinite(l)?l:t}function pt(l,t=0){if(!l||typeof l!="object")return null;const i=l.node_id??l.nodeId??"";if(!i)return null;const v=String(l.state||"closed").toLowerCase();return{key:i,nodeId:i,state:v,failureCount:k(l.failure_count??l.failureCount,0),successCount:k(l.success_count??l.successCount,0),failureThreshold:k(l.failure_threshold??l.failureThreshold,0),successThreshold:k(l.success_threshold??l.successThreshold,0),openTimeout:k(l.open_timeout??l.openTimeout,0),lastFailureTime:l.last_failure_time??l.lastFailureTime??null,lastSuccessTime:l.last_success_time??l.lastSuccessTime??null,stateChangedAt:l.state_changed_at??l.stateChangedAt??null,metadata:l.metadata??null,createdAt:l.created_at??l.createdAt??null,updatedAt:l.updated_at??l.updatedAt??null,_idx:t}}function ft(l){const t=z(l);return Array.isArray(t)?t.map(pt).filter(Boolean):[]}function yt(l,t=0){if(!l||typeof l!="object")return null;const i=l.check_id??l.checkId??"";return i?{key:i,checkId:i,nodeId:l.node_id??l.nodeId??"",checkType:String(l.check_type??l.checkType??"").toLowerCase(),status:String(l.status||"unknown").toLowerCase(),metrics:l.metrics??null,checkedAt:l.checked_at??l.checkedAt??null,_idx:t}:null}function mt(l){const t=z(l);return Array.isArray(t)?t.map(yt).filter(Boolean):[]}function kt(l,t=0){if(!l||typeof l!="object")return null;const i=l.nodeId??l.node_id??"";return i?{key:i,nodeId:i,minConnections:k(l.minConnections,0),maxConnections:k(l.maxConnections,0),idleTimeout:k(l.idleTimeout,0),activeConnections:k(l.activeConnections,0),idleConnections:k(l.idleConnections,0),totalCreated:k(l.totalCreated,0),totalDestroyed:k(l.totalDestroyed,0),waitingRequests:k(l.waitingRequests,0),createdAt:l.createdAt??null,_idx:t}:null}function vt(l){const t=z(l);return Array.isArray(t)?t.map(kt).filter(Boolean):[]}function ht(l){const t=z(l);if(!t||typeof t!="object"||Array.isArray(t))return{nodeId:"",status:"unknown",checks:0,latestChecks:[]};const v=(Array.isArray(t.latestChecks)?t.latestChecks:[]).filter(y=>y&&typeof y=="object").map(y=>({checkType:String(y.checkType??y.check_type??"").toLowerCase(),status:String(y.status||"unknown").toLowerCase(),checkedAt:y.checkedAt??y.checked_at??null}));return{nodeId:t.nodeId??t.node_id??"",status:String(t.status||"unknown").toLowerCase(),checks:k(t.checks,0),latestChecks:v}}function ve(l){const t=z(l);if(!t||typeof t!="object"||Array.isArray(t))return{ok:!1,id:null,reason:""};const i=!!(t.registered||t.recorded||t.initialized),v=t.nodeId??t.checkId??null;return{ok:i,id:v?String(v):null,reason:t.reason?String(t.reason):""}}function _t(l){const t=z(l);return!t||typeof t!="object"||Array.isArray(t)?{ok:!1,state:"",previousState:"",failureCount:0,successCount:0,remainingMs:0,reason:""}:{ok:!!(t.updated||t.reset),state:String(t.state||""),previousState:String(t.previousState||""),failureCount:k(t.failureCount,0),successCount:k(t.successCount,0),remainingMs:k(t.remainingMs,0),reason:t.reason?String(t.reason):""}}function gt(l){const t=z(l);return!t||typeof t!="object"||Array.isArray(t)?{ok:!1,active:0,idle:0,waiting:0,reason:""}:{ok:!!(t.acquired||t.released||t.destroyed),active:k(t.active,0),idle:k(t.idle,0),waiting:k(t.waiting,0),reason:t.reason?String(t.reason):""}}function bt(l){const t=z(l);return!t||typeof t!="object"||Array.isArray(t)?{ok:!1,reason:""}:{ok:!!t.removed,reason:t.reason?String(t.reason):""}}const Ct={circuitBreakers:{total:0,byState:{}},healthChecks:{total:0,byStatus:{}},connectionPools:{total:0,totalActive:0,totalIdle:0,totalConnections:0}};function xt(l){const t=JSON.parse(JSON.stringify(Ct));for(const v of je)t.circuitBreakers.byState[v]=0;for(const v of he)t.healthChecks.byStatus[v]=0;const i=z(l);if(!i||typeof i!="object"||Array.isArray(i))return t;if(i.circuitBreakers&&typeof i.circuitBreakers=="object"&&(t.circuitBreakers.total=k(i.circuitBreakers.total,0),i.circuitBreakers.byState&&typeof i.circuitBreakers.byState=="object"))for(const[v,y]of Object.entries(i.circuitBreakers.byState))typeof y=="number"&&Number.isFinite(y)&&(t.circuitBreakers.byState[v]=y);if(i.healthChecks&&typeof i.healthChecks=="object"&&(t.healthChecks.total=k(i.healthChecks.total,0),i.healthChecks.byStatus&&typeof i.healthChecks.byStatus=="object"))for(const[v,y]of Object.entries(i.healthChecks.byStatus))typeof y=="number"&&Number.isFinite(y)&&(t.healthChecks.byStatus[v]=y);return i.connectionPools&&typeof i.connectionPools=="object"&&(t.connectionPools.total=k(i.connectionPools.total,0),t.connectionPools.totalActive=k(i.connectionPools.totalActive,0),t.connectionPools.totalIdle=k(i.connectionPools.totalIdle,0),t.connectionPools.totalConnections=k(i.connectionPools.totalConnections,0)),t}function ie(l){if(l==null||l==="")return"—";const t=typeof l=="number"?new Date(l):new Date(String(l));return isNaN(t.getTime())?String(l):t.toLocaleString("zh-CN",{hour12:!1})}const Tt={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},St={class:"stat-sub"},It={class:"stat-sub"},At={class:"stat-sub"},wt={class:"stat-sub"},$t={class:"filter-bar"},zt={key:1},jt={key:2},Bt={key:3,class:"muted"},Pt={class:"filter-bar"},Ut={key:0,style:{"font-family":"monospace","font-size":"12px"}},Rt={key:3,class:"muted",style:{"font-family":"monospace","font-size":"11px"}},Ft={key:4,class:"muted"},Ot={key:1,class:"muted"},Nt={style:{"font-family":"monospace"}},Mt={style:{"margin-top":"16px"}},qt={key:2,class:"muted"},Dt={__name:"Federation",setup(l){const t=Ze(),i=ct.PRESENTED_IMAGE_SIMPLE,v=x(!1),y=x(!1),re=x(!1),ue=x([]),_e=x([]),ge=x([]),S=x({circuitBreakers:{total:0,byState:{closed:0,open:0,half_open:0}},healthChecks:{total:0,byStatus:{healthy:0,degraded:0,unhealthy:0,unknown:0}},connectionPools:{total:0,totalActive:0,totalIdle:0,totalConnections:0}}),be=x("breakers"),J=x(""),V=x(""),G=x(""),K=x(!1),W=x(!1),Q=x(!1),_=ke({nodeId:"",failureThreshold:5,successThreshold:2,openTimeout:6e4}),b=ke({nodeId:"",checkType:"heartbeat",status:"healthy",metrics:""}),g=ke({nodeId:"",min:5,max:50,idleTimeout:3e5}),Y=x(""),j=x(null),Be=[{title:"节点",key:"nodeId",dataIndex:"nodeId",width:"200px"},{title:"状态",key:"state",width:"100px"},{title:"失败计数",key:"failure",width:"120px"},{title:"成功计数",key:"success",width:"120px"},{title:"超时 (ms)",key:"openTimeout",dataIndex:"openTimeout",width:"110px"},{title:"更新时间",key:"updatedAt",width:"170px"},{title:"操作",key:"action",width:"340px"}],Pe=[{title:"ID",key:"checkId",width:"130px"},{title:"节点",key:"nodeId",dataIndex:"nodeId",width:"180px"},{title:"指标",key:"checkType",width:"120px"},{title:"状态",key:"status",width:"100px"},{title:"指标值",key:"metrics"},{title:"采集时间",key:"checkedAt",width:"170px"}],Ue=[{title:"节点",key:"nodeId",dataIndex:"nodeId",width:"200px"},{title:"活跃",key:"activeConnections",dataIndex:"activeConnections",width:"90px"},{title:"空闲",key:"idleConnections",dataIndex:"idleConnections",width:"90px"},{title:"上限",key:"maxConnections",dataIndex:"maxConnections",width:"90px"},{title:"使用率",key:"utilization",width:"160px"},{title:"排队中",key:"waitingRequests",dataIndex:"waitingRequests",width:"90px"},{title:"已创建",key:"totalCreated",dataIndex:"totalCreated",width:"90px"},{title:"创建时间",key:"createdAt",width:"170px"},{title:"操作",key:"action",width:"240px"}],Re=[{title:"指标",key:"checkType",width:"160px"},{title:"状态",key:"status",width:"120px"},{title:"采集时间",key:"checkedAt"}],Fe=se(()=>J.value?ue.value.filter(s=>s.state===J.value):ue.value),Oe=se(()=>{let s=_e.value;return V.value&&(s=s.filter(e=>e.checkType===V.value)),G.value&&(s=s.filter(e=>e.status===G.value)),s}),Ce=se(()=>(S.value.circuitBreakers.byState.open||0)+(S.value.circuitBreakers.byState.half_open||0)),xe=se(()=>{const s=S.value.circuitBreakers.total;return s?(S.value.circuitBreakers.byState.closed||0)/s*100:100});function Te(s){return s.maxConnections?Math.round(s.activeConnections/s.maxConnections*100):0}function X(s){return{closed:"闭合",open:"开路",half_open:"半开"}[s]||s}function Ne(s){return{closed:"green",open:"red",half_open:"gold"}[s]||"default"}function Z(s){return{heartbeat:"心跳",latency:"延迟",success_rate:"成功率",cpu_usage:"CPU",memory_usage:"内存"}[s]||s}function M(s){return{healthy:"健康",degraded:"降级",unhealthy:"不可用",unknown:"未知"}[s]||s}function ce(s){return{healthy:"green",degraded:"gold",unhealthy:"red",unknown:"default"}[s]||"default"}function Se(s){return s>=95?"#52c41a":s>=80?"#1677ff":s>=60?"#faad14":"#ff4d4f"}function Me(s,e){return s?s.length<=e?s:s.slice(0,e)+"…":""}function B(s){return`"${String(s).replace(/"/g,'\\"')}"`}async function P(){v.value=!0;try{const[s,e,r,$]=await Promise.all([t.execute("federation breakers --limit 200 --json",1e4).catch(()=>({output:""})),t.execute("federation checks --limit 200 --json",1e4).catch(()=>({output:""})),t.execute("federation pools --json",8e3).catch(()=>({output:""})),t.execute("federation stats --json",8e3).catch(()=>({output:""}))]);ue.value=ft(s.output),_e.value=mt(e.output),ge.value=vt(r.output),S.value=xt($.output)}catch(s){m.error("加载数据失败: "+(s?.message||s))}finally{v.value=!1}}async function qe(){if(!_.nodeId.trim()){m.warning("请填写节点 ID");return}y.value=!0;try{const s=[`federation register ${B(_.nodeId.trim())}`];_.failureThreshold&&s.push(`-f ${_.failureThreshold}`),_.successThreshold&&s.push(`-s ${_.successThreshold}`),_.openTimeout&&s.push(`-t ${_.openTimeout}`),s.push("--json");const{output:e}=await t.execute(s.join(" "),1e4),r=ve(e);if(!r.ok){m.error("注册失败: "+(r.reason||e.slice(0,120)));return}m.success(`节点已注册:${r.id}`),K.value=!1,He(),await P()}catch(s){m.error("注册失败: "+(s?.message||s))}finally{y.value=!1}}async function De(){if(!b.nodeId.trim()){m.warning("请填写节点 ID");return}y.value=!0;try{const s=[`federation check ${B(b.nodeId.trim())}`];s.push(`-t ${b.checkType}`),s.push(`-s ${b.status}`),b.metrics.trim()&&s.push(`-m ${B(b.metrics.trim())}`),s.push("--json");const{output:e}=await t.execute(s.join(" "),1e4),r=ve(e);if(!r.ok){m.error("记录失败: "+(r.reason||e.slice(0,120)));return}m.success(`检查已记录:${r.id?.slice(0,8)}`),W.value=!1,Je(),await P()}catch(s){m.error("记录失败: "+(s?.message||s))}finally{y.value=!1}}async function Ee(){if(!g.nodeId.trim()){m.warning("请填写节点 ID");return}y.value=!0;try{const s=[`federation pool-init ${B(g.nodeId.trim())}`];g.min&&s.push(`--min ${g.min}`),g.max&&s.push(`--max ${g.max}`),g.idleTimeout&&s.push(`--idle-timeout ${g.idleTimeout}`),s.push("--json");const{output:e}=await t.execute(s.join(" "),1e4),r=ve(e);if(!r.ok){m.error("创建失败: "+(r.reason||e.slice(0,120)));return}m.success(`连接池已创建:${r.id}`),Q.value=!1,Ve(),await P()}catch(s){m.error("创建失败: "+(s?.message||s))}finally{y.value=!1}}async function ee(s,e){try{const r=`federation ${e} ${B(s.nodeId)} --json`,{output:$}=await t.execute(r,8e3),C=_t($);if(!C.ok){m.warning((C.reason||"操作未生效")+(C.remainingMs?` (还需 ${C.remainingMs}ms)`:""));return}C.previousState&&C.state&&C.previousState!==C.state?m.success(`${X(C.previousState)} → ${X(C.state)}`):m.success(e==="reset"?"熔断器已重置":"已记录"),await P()}catch(r){m.error("操作失败: "+(r?.message||r))}}async function Le(s){try{const{output:e}=await t.execute(`federation remove ${B(s.nodeId)} --json`,8e3),r=bt(e);if(!r.ok){m.error("移除失败: "+(r.reason||e.slice(0,120)));return}m.success("节点已移除"),await P()}catch(e){m.error("移除失败: "+(e?.message||e))}}async function de(s,e){try{const r={acquire:"pool-acquire",release:"pool-release",destroy:"pool-destroy"}[e],{output:$}=await t.execute(`federation ${r} ${B(s.nodeId)} --json`,8e3),C=gt($);if(!C.ok){m.warning(C.reason||"操作未生效");return}e==="destroy"?m.success("连接池已销毁"):m.success(`${e==="acquire"?"已获取":"已释放"}(活跃 ${C.active} · 空闲 ${C.idle})`),await P()}catch(r){m.error("操作失败: "+(r?.message||r))}}async function Ie(){if(!Y.value.trim()){m.warning("请填写节点 ID");return}re.value=!0;try{const{output:s}=await t.execute(`federation node-health ${B(Y.value.trim())} --json`,8e3);j.value=ht(s)}catch(s){m.error("查询失败: "+(s?.message||s))}finally{re.value=!1}}function He(){_.nodeId="",_.failureThreshold=5,_.successThreshold=2,_.openTimeout=6e4}function Je(){b.nodeId="",b.checkType="heartbeat",b.status="healthy",b.metrics=""}function Ve(){g.nodeId="",g.min=5,g.max=50,g.idleTimeout=3e5}return dt(P),(s,e)=>{const r=f("a-button"),$=f("a-menu-item"),C=f("a-menu"),Ge=f("a-dropdown"),te=f("a-space"),q=f("a-statistic"),U=f("a-card"),D=f("a-col"),Ke=f("a-row"),F=f("a-radio-button"),pe=f("a-radio-group"),O=f("a-tag"),Ae=f("a-popconfirm"),oe=f("a-empty"),ae=f("a-table"),ne=f("a-tab-pane"),We=f("a-progress"),le=f("a-input"),fe=f("a-descriptions-item"),Qe=f("a-descriptions"),Ye=f("a-tabs"),w=f("a-form-item"),N=f("a-input-number"),ye=f("a-form"),me=f("a-modal"),we=f("a-select-option"),$e=f("a-select"),Xe=f("a-textarea");return c(),I("div",null,[A("div",Tt,[e[28]||(e[28]=A("div",null,[A("h2",{class:"page-title"},"联邦强化"),A("p",{class:"page-sub"},"熔断器 FSM · 健康检查 · 连接池模拟")],-1)),o(te,null,{default:a(()=>[o(r,{loading:v.value,onClick:P},{icon:a(()=>[o(h(ot))]),default:a(()=>[e[23]||(e[23]=p(" 刷新 ",-1))]),_:1},8,["loading"]),o(Ge,null,{overlay:a(()=>[o(C,null,{default:a(()=>[o($,{key:"register",onClick:e[0]||(e[0]=n=>K.value=!0)},{default:a(()=>[...e[25]||(e[25]=[p("注册节点",-1)])]),_:1}),o($,{key:"check",onClick:e[1]||(e[1]=n=>W.value=!0)},{default:a(()=>[...e[26]||(e[26]=[p("记录健康检查",-1)])]),_:1}),o($,{key:"pool",onClick:e[2]||(e[2]=n=>Q.value=!0)},{default:a(()=>[...e[27]||(e[27]=[p("新建连接池",-1)])]),_:1})]),_:1})]),default:a(()=>[o(r,{type:"primary"},{icon:a(()=>[o(h(at))]),default:a(()=>[e[24]||(e[24]=p(" 新建 ▼ ",-1))]),_:1})]),_:1})]),_:1})]),o(Ke,{gutter:[16,16],style:{"margin-bottom":"20px"}},{default:a(()=>[o(D,{xs:12,sm:8,lg:5},{default:a(()=>[o(U,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[o(q,{title:"熔断器节点",value:S.value.circuitBreakers.total,"value-style":{color:"#1677ff",fontSize:"20px"}},{prefix:a(()=>[o(h(nt))]),_:1},8,["value"]),A("div",St,d(S.value.circuitBreakers.byState.closed||0)+" 闭合 · "+d(S.value.circuitBreakers.byState.open||0)+" 开",1)]),_:1})]),_:1}),o(D,{xs:12,sm:8,lg:5},{default:a(()=>[o(U,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[o(q,{title:"健康检查",value:S.value.healthChecks.total,"value-style":{color:"#52c41a",fontSize:"20px"}},{prefix:a(()=>[o(h(lt))]),_:1},8,["value"]),A("div",It,d(S.value.healthChecks.byStatus.healthy||0)+" 健康 · "+d(S.value.healthChecks.byStatus.unhealthy||0)+" 不可用",1)]),_:1})]),_:1}),o(D,{xs:12,sm:8,lg:5},{default:a(()=>[o(U,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[o(q,{title:"连接池",value:S.value.connectionPools.total,"value-style":{color:"#13c2c2",fontSize:"20px"}},{prefix:a(()=>[o(h(st))]),_:1},8,["value"]),A("div",At,d(S.value.connectionPools.totalActive)+" 活跃 · "+d(S.value.connectionPools.totalIdle)+" 空闲",1)]),_:1})]),_:1}),o(D,{xs:12,sm:8,lg:5},{default:a(()=>[o(U,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[o(q,{title:"降级节点",value:Ce.value,"value-style":{color:Ce.value>0?"#faad14":"#8c8c8c",fontSize:"20px"}},{prefix:a(()=>[o(h(it))]),_:1},8,["value","value-style"]),A("div",wt,d(S.value.circuitBreakers.byState.half_open||0)+" 半开",1)]),_:1})]),_:1}),o(D,{xs:24,sm:8,lg:4},{default:a(()=>[o(U,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[o(q,{title:"可用率",value:xe.value,suffix:"%",precision:0,"value-style":{color:Se(xe.value),fontSize:"20px"}},{prefix:a(()=>[o(h(rt))]),_:1},8,["value","value-style"])]),_:1})]),_:1})]),_:1}),o(Ye,{activeKey:be.value,"onUpdate:activeKey":e[7]||(e[7]=n=>be.value=n),class:"fed-tabs"},{default:a(()=>[o(ne,{key:"breakers",tab:"熔断器"},{default:a(()=>[A("div",$t,[o(pe,{value:J.value,"onUpdate:value":e[3]||(e[3]=n=>J.value=n),size:"small","button-style":"solid"},{default:a(()=>[o(F,{value:""},{default:a(()=>[...e[29]||(e[29]=[p("全部状态",-1)])]),_:1}),(c(!0),I(E,null,L(h(je),n=>(c(),T(F,{key:n,value:n},{default:a(()=>[p(d(X(n)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),o(ae,{columns:Be,"data-source":Fe.value,pagination:{pageSize:20,showTotal:n=>`共 ${n} 条`},size:"small",loading:v.value,"row-key":"key",style:{background:"var(--bg-card)"}},{bodyCell:a(({column:n,record:u})=>[n.key==="state"?(c(),T(O,{key:0,color:Ne(u.state)},{default:a(()=>[p(d(X(u.state)),1)]),_:2},1032,["color"])):n.key==="failure"?(c(),I("span",zt,d(u.failureCount)+" / "+d(u.failureThreshold),1)):n.key==="success"?(c(),I("span",jt,d(u.successCount)+" / "+d(u.successThreshold),1)):n.key==="updatedAt"?(c(),I("span",Bt,d(h(ie)(u.updatedAt)),1)):n.key==="action"?(c(),T(te,{key:4,size:4},{default:a(()=>[o(r,{size:"small",danger:"",onClick:R=>ee(u,"failure")},{default:a(()=>[...e[30]||(e[30]=[p("失败",-1)])]),_:1},8,["onClick"]),o(r,{size:"small",onClick:R=>ee(u,"success")},{default:a(()=>[...e[31]||(e[31]=[p("成功",-1)])]),_:1},8,["onClick"]),o(r,{size:"small",type:"dashed",onClick:R=>ee(u,"half-open")},{default:a(()=>[...e[32]||(e[32]=[p("半开",-1)])]),_:1},8,["onClick"]),o(r,{size:"small",onClick:R=>ee(u,"reset")},{default:a(()=>[...e[33]||(e[33]=[p("重置",-1)])]),_:1},8,["onClick"]),o(Ae,{title:"移除该节点?所有相关熔断器与健康检查会被删除",onConfirm:R=>Le(u)},{default:a(()=>[o(r,{size:"small",danger:"",type:"text"},{default:a(()=>[...e[34]||(e[34]=[p("移除",-1)])]),_:1})]),_:1},8,["onConfirm"])]),_:2},1024)):H("",!0)]),emptyText:a(()=>[o(oe,{image:h(i),description:"暂无熔断器"},null,8,["image"])]),_:1},8,["data-source","pagination","loading"])]),_:1}),o(ne,{key:"checks",tab:"健康检查"},{default:a(()=>[A("div",Pt,[o(pe,{value:V.value,"onUpdate:value":e[4]||(e[4]=n=>V.value=n),size:"small","button-style":"solid"},{default:a(()=>[o(F,{value:""},{default:a(()=>[...e[35]||(e[35]=[p("全部指标",-1)])]),_:1}),(c(!0),I(E,null,L(h(ze),n=>(c(),T(F,{key:n,value:n},{default:a(()=>[p(d(Z(n)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"]),o(pe,{value:G.value,"onUpdate:value":e[5]||(e[5]=n=>G.value=n),size:"small"},{default:a(()=>[o(F,{value:""},{default:a(()=>[...e[36]||(e[36]=[p("全部状态",-1)])]),_:1}),(c(!0),I(E,null,L(h(he),n=>(c(),T(F,{key:n,value:n},{default:a(()=>[p(d(M(n)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),o(ae,{columns:Pe,"data-source":Oe.value,pagination:{pageSize:20,showTotal:n=>`共 ${n} 条`},size:"small",loading:v.value,"row-key":"key",style:{background:"var(--bg-card)"}},{bodyCell:a(({column:n,record:u})=>[n.key==="checkId"?(c(),I("span",Ut,d(u.checkId.slice(0,12)),1)):n.key==="checkType"?(c(),T(O,{key:1,color:"blue"},{default:a(()=>[p(d(Z(u.checkType)),1)]),_:2},1024)):n.key==="status"?(c(),T(O,{key:2,color:ce(u.status)},{default:a(()=>[p(d(M(u.status)),1)]),_:2},1032,["color"])):n.key==="metrics"?(c(),I("span",Rt,d(Me(u.metrics||"",50)),1)):n.key==="checkedAt"?(c(),I("span",Ft,d(h(ie)(u.checkedAt)),1)):H("",!0)]),emptyText:a(()=>[o(oe,{image:h(i),description:"暂无健康检查记录"},null,8,["image"])]),_:1},8,["data-source","pagination","loading"])]),_:1}),o(ne,{key:"pools",tab:"连接池"},{default:a(()=>[o(ae,{columns:Ue,"data-source":ge.value,pagination:{pageSize:20,showTotal:n=>`共 ${n} 条`},size:"small",loading:v.value,"row-key":"key",style:{background:"var(--bg-card)"}},{bodyCell:a(({column:n,record:u})=>[n.key==="utilization"?(c(),T(We,{key:0,percent:Te(u),"stroke-color":Se(Te(u)),size:"small"},null,8,["percent","stroke-color"])):n.key==="createdAt"?(c(),I("span",Ot,d(h(ie)(u.createdAt)),1)):n.key==="action"?(c(),T(te,{key:2,size:4},{default:a(()=>[o(r,{size:"small",type:"primary",onClick:R=>de(u,"acquire")},{default:a(()=>[...e[37]||(e[37]=[p("取连接",-1)])]),_:1},8,["onClick"]),o(r,{size:"small",onClick:R=>de(u,"release")},{default:a(()=>[...e[38]||(e[38]=[p("还连接",-1)])]),_:1},8,["onClick"]),o(Ae,{title:"销毁该连接池?",onConfirm:R=>de(u,"destroy")},{default:a(()=>[o(r,{size:"small",danger:"",type:"text"},{default:a(()=>[...e[39]||(e[39]=[p("销毁",-1)])]),_:1})]),_:1},8,["onConfirm"])]),_:2},1024)):H("",!0)]),emptyText:a(()=>[o(oe,{image:h(i),description:"暂无连接池"},null,8,["image"])]),_:1},8,["data-source","pagination","loading"])]),_:1}),o(ne,{key:"node-health",tab:"节点健康聚合"},{default:a(()=>[o(U,{style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"16px"}},{default:a(()=>[o(te,null,{default:a(()=>[o(le,{value:Y.value,"onUpdate:value":e[6]||(e[6]=n=>Y.value=n),placeholder:"节点 ID",style:{width:"240px"},"allow-clear":"",onPressEnter:Ie},null,8,["value"]),o(r,{type:"primary",loading:re.value,onClick:Ie},{icon:a(()=>[o(h(ut))]),default:a(()=>[e[40]||(e[40]=p(" 查询 ",-1))]),_:1},8,["loading"])]),_:1})]),_:1}),j.value?(c(),T(U,{key:0,style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[o(Qe,{column:3,size:"small",bordered:""},{default:a(()=>[o(fe,{label:"节点"},{default:a(()=>[A("span",Nt,d(j.value.nodeId),1)]),_:1}),o(fe,{label:"聚合状态"},{default:a(()=>[o(O,{color:ce(j.value.status)},{default:a(()=>[p(d(M(j.value.status)),1)]),_:1},8,["color"])]),_:1}),o(fe,{label:"检查总数"},{default:a(()=>[p(d(j.value.checks),1)]),_:1})]),_:1}),A("div",Mt,[e[41]||(e[41]=A("h4",{style:{color:"var(--text-primary)","margin-bottom":"8px"}},"最近各指标状态",-1)),j.value.latestChecks.length?(c(),T(ae,{key:1,columns:Re,"data-source":j.value.latestChecks,pagination:!1,size:"small","row-key":"checkType",style:{background:"var(--bg-card)"}},{bodyCell:a(({column:n,record:u})=>[n.key==="checkType"?(c(),T(O,{key:0,color:"blue"},{default:a(()=>[p(d(Z(u.checkType)),1)]),_:2},1024)):n.key==="status"?(c(),T(O,{key:1,color:ce(u.status)},{default:a(()=>[p(d(M(u.status)),1)]),_:2},1032,["color"])):n.key==="checkedAt"?(c(),I("span",qt,d(h(ie)(u.checkedAt)),1)):H("",!0)]),_:1},8,["data-source"])):(c(),T(oe,{key:0,image:h(i),description:"无最近检查"},null,8,["image"]))])]),_:1})):H("",!0)]),_:1})]),_:1},8,["activeKey"]),o(me,{open:K.value,"onUpdate:open":e[12]||(e[12]=n=>K.value=n),title:"注册联邦节点","confirm-loading":y.value,onOk:qe},{default:a(()=>[o(ye,{layout:"vertical"},{default:a(()=>[o(w,{label:"节点 ID",required:""},{default:a(()=>[o(le,{value:_.nodeId,"onUpdate:value":e[8]||(e[8]=n=>_.nodeId=n),placeholder:"如 node-shanghai-01"},null,8,["value"])]),_:1}),o(w,{label:"失败阈值(默认 5)"},{default:a(()=>[o(N,{value:_.failureThreshold,"onUpdate:value":e[9]||(e[9]=n=>_.failureThreshold=n),min:1,max:100,style:{width:"100%"}},null,8,["value"])]),_:1}),o(w,{label:"成功阈值(默认 2)"},{default:a(()=>[o(N,{value:_.successThreshold,"onUpdate:value":e[10]||(e[10]=n=>_.successThreshold=n),min:1,max:100,style:{width:"100%"}},null,8,["value"])]),_:1}),o(w,{label:"开路超时 (ms)(默认 60000)"},{default:a(()=>[o(N,{value:_.openTimeout,"onUpdate:value":e[11]||(e[11]=n=>_.openTimeout=n),min:1e3,step:1e3,style:{width:"100%"}},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"]),o(me,{open:W.value,"onUpdate:open":e[17]||(e[17]=n=>W.value=n),title:"记录健康检查","confirm-loading":y.value,onOk:De},{default:a(()=>[o(ye,{layout:"vertical"},{default:a(()=>[o(w,{label:"节点 ID",required:""},{default:a(()=>[o(le,{value:b.nodeId,"onUpdate:value":e[13]||(e[13]=n=>b.nodeId=n),placeholder:"必须先注册节点"},null,8,["value"])]),_:1}),o(w,{label:"指标类型",required:""},{default:a(()=>[o($e,{value:b.checkType,"onUpdate:value":e[14]||(e[14]=n=>b.checkType=n)},{default:a(()=>[(c(!0),I(E,null,L(h(ze),n=>(c(),T(we,{key:n,value:n},{default:a(()=>[p(d(Z(n)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),_:1}),o(w,{label:"健康状态",required:""},{default:a(()=>[o($e,{value:b.status,"onUpdate:value":e[15]||(e[15]=n=>b.status=n)},{default:a(()=>[(c(!0),I(E,null,L(h(he),n=>(c(),T(we,{key:n,value:n},{default:a(()=>[p(d(M(n)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),_:1}),o(w,{label:'指标 JSON(可选,如 {"latencyMs":42})'},{default:a(()=>[o(Xe,{value:b.metrics,"onUpdate:value":e[16]||(e[16]=n=>b.metrics=n),rows:3,placeholder:'{"latencyMs": 42, "cpu": 0.4}'},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"]),o(me,{open:Q.value,"onUpdate:open":e[22]||(e[22]=n=>Q.value=n),title:"新建连接池","confirm-loading":y.value,onOk:Ee},{default:a(()=>[o(ye,{layout:"vertical"},{default:a(()=>[o(w,{label:"节点 ID",required:""},{default:a(()=>[o(le,{value:g.nodeId,"onUpdate:value":e[18]||(e[18]=n=>g.nodeId=n),placeholder:"如 node-shanghai-01"},null,8,["value"])]),_:1}),o(w,{label:"最小连接数(默认 5)"},{default:a(()=>[o(N,{value:g.min,"onUpdate:value":e[19]||(e[19]=n=>g.min=n),min:1,max:500,style:{width:"100%"}},null,8,["value"])]),_:1}),o(w,{label:"最大连接数(默认 50)"},{default:a(()=>[o(N,{value:g.max,"onUpdate:value":e[20]||(e[20]=n=>g.max=n),min:1,max:500,style:{width:"100%"}},null,8,["value"])]),_:1}),o(w,{label:"空闲超时 (ms)(默认 300000)"},{default:a(()=>[o(N,{value:g.idleTimeout,"onUpdate:value":e[21]||(e[21]=n=>g.idleTimeout=n),min:1e3,step:1e3,style:{width:"100%"}},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"])])}}},eo=tt(Dt,[["__scopeId","data-v-6bc17fe8"]]);export{eo as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
.page-title[data-v-6bc17fe8]{margin:0;color:var(--text-primary);font-size:22px;font-weight:600}.page-sub[data-v-6bc17fe8]{margin:4px 0 0;color:var(--text-secondary);font-size:13px}.fed-tabs[data-v-6bc17fe8] .ant-tabs-nav{margin-bottom:16px}.filter-bar[data-v-6bc17fe8]{display:flex;align-items:center;gap:12px;margin-bottom:12px;flex-wrap:wrap}.stat-sub[data-v-6bc17fe8]{margin-top:4px;color:var(--text-muted);font-size:11px}.muted[data-v-6bc17fe8]{color:var(--text-muted)}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{u as ee}from"./ws-4ur1fGsk.js";import{_ as te}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{_ as ae,ao as oe,j as P,ap as j,aq as le}from"./icons-CJACPYXu.js";import{a as m}from"./index-BB5y5Y0z.js";import{F as q,D as s,c as a,x as t,r as l,q as u,v as p,J as i,u as g,m as v,I as V,G as b}from"./vendor-D0Qjn73K.js";import"./index-Vit9TJBu.js";import"./useConfigInject-DIkkDpt1.js";import"./transition-CVd2ueaJ.js";import"./Keyframes-C7fCrnlS.js";import"./Portal-SsPhn64D.js";import"./index-U4Zd5IK6.js";const se={key:0,style:{"margin-bottom":"16px"}},ne={style:{"white-space":"pre-wrap","word-break":"break-all",color:"var(--text-primary)","font-family":"'Cascadia Code', 'Fira Code', Consolas, monospace","font-size":"13px","line-height":"1.7",margin:"0"}},re={style:{display:"flex",gap:"12px","align-items":"flex-end","flex-wrap":"wrap"}},ie={style:{flex:"1","min-width":"200px"}},ue={style:{"min-width":"140px"}},de={style:{display:"flex",gap:"12px","align-items":"flex-end","flex-wrap":"wrap"}},pe={style:{flex:"1","min-width":"200px"}},ce={style:{"white-space":"pre-wrap","word-break":"break-all",color:"var(--text-primary)","font-family":"'Cascadia Code', 'Fira Code', Consolas, monospace","font-size":"13px","line-height":"1.7",margin:"0"}},me={__name:"Git",setup(ve){const G=ee(),$=l("git"),L=l(!1),k=l(""),h=l(""),C=l(0),B=l(!1),x=l(""),O=l(!1),E=l(!1),M=l(""),z=l("markdown"),A=l(!1),S=l("./site"),D=l(!1),c=l(""),_=l(!1),w=l("");function T(o){const e=o.split(`
|
|
2
|
-
`);let n="",r=0;for(const f of e){const y=f.match(/On branch\s+(.+)/)||f.match(/分支\s+(.+)/);y&&(n=y[1].trim());const U=f.trim();/^(M|A|D|R|C|U|\?\?|MM|AM|AD)\s/.test(U)&&r++,/^(modified|new file|deleted|renamed):/i.test(U)&&r++}return{branch:n,changed:r}}async function I(){L.value=!0;try{const{output:o}=await G.execute("git status",15e3);k.value=o;const e=T(o);h.value=e.branch,C.value=e.changed}catch(o){m.error("获取 Git 状态失败: "+o.message),k.value=""}finally{L.value=!1}}function J(){E.value=!0}async function W(){E.value=!1,B.value=!0,x.value="";try{const{output:o}=await G.execute("git auto-commit",3e4);x.value=o,O.value=!o.includes("✖")&&!o.toLowerCase().includes("error"),O.value&&m.success("自动提交完成"),await I()}catch(o){x.value="提交失败: "+o.message,O.value=!1,m.error("自动提交失败")}finally{B.value=!1}}async function H(){const o=M.value.trim();if(!o){m.warning("请输入文件路径");return}A.value=!0,c.value="",w.value="";try{const e=`import ${z.value} ${o}`,{output:n}=await G.execute(e,6e4);w.value=n;const r=n.includes("✖")||n.toLowerCase().includes("error");_.value=!r,c.value=r?"导入过程中可能存在问题,请查看输出":"导入完成",r||m.success("导入成功")}catch(e){c.value="导入失败: "+e.message,_.value=!1,m.error("导入失败")}finally{A.value=!1}}async function Q(){const o=S.value.trim();if(!o){m.warning("请输入输出路径");return}D.value=!0,c.value="",w.value="";try{const e=`export site -o ${o}`,{output:n}=await G.execute(e,6e4);w.value=n;const r=n.includes("✖")||n.toLowerCase().includes("error");_.value=!r,c.value=r?"导出过程中可能存在问题,请查看输出":"导出完成",r||m.success("导出成功")}catch(e){c.value="导出失败: "+e.message,_.value=!1,m.error("导出失败")}finally{D.value=!1}}return(o,e)=>{const n=u("a-button"),r=u("a-space"),f=u("a-tag"),y=u("a-card"),U=u("a-empty"),N=u("a-alert"),R=u("a-tab-pane"),K=u("a-input"),F=u("a-select-option"),X=u("a-select"),Y=u("a-tabs"),Z=u("a-modal");return p(),q("div",null,[e[21]||(e[21]=s("div",{style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},[s("div",null,[s("h2",{class:"page-title"},"Git 与数据"),s("p",{class:"page-sub"},"版本控制 / 导入导出")])],-1)),a(Y,{activeKey:$.value,"onUpdate:activeKey":e[5]||(e[5]=d=>$.value=d),type:"card"},{default:t(()=>[a(R,{key:"git"},{tab:t(()=>[a(g(P)),e[7]||(e[7]=i(" Git 仓库 ",-1))]),default:t(()=>[a(r,{style:{"margin-bottom":"16px"}},{default:t(()=>[a(n,{type:"primary",loading:L.value,onClick:I},{icon:t(()=>[a(g(ae))]),default:t(()=>[e[8]||(e[8]=i(" 刷新状态 ",-1))]),_:1},8,["loading"]),a(n,{loading:B.value,onClick:J},{icon:t(()=>[a(g(oe))]),default:t(()=>[e[9]||(e[9]=i(" 自动提交 ",-1))]),_:1},8,["loading"])]),_:1}),h.value||C.value>0?(p(),q("div",se,[a(r,null,{default:t(()=>[h.value?(p(),v(f,{key:0,color:"blue"},{default:t(()=>[a(g(P)),i(" "+V(h.value),1)]),_:1})):b("",!0),C.value>0?(p(),v(f,{key:1,color:"orange"},{default:t(()=>[i(V(C.value)+" 个文件变更",1)]),_:1})):k.value&&C.value===0?(p(),v(f,{key:2,color:"green"},{default:t(()=>[...e[10]||(e[10]=[i("工作区干净",-1)])]),_:1})):b("",!0)]),_:1})])):b("",!0),k.value?(p(),v(y,{key:1,bordered:!1,style:{background:"var(--bg-base)",border:"1px solid var(--border-color)"}},{default:t(()=>[s("pre",ne,V(k.value),1)]),_:1})):L.value?b("",!0):(p(),v(U,{key:2,description:"点击刷新状态查看 Git 信息",style:{padding:"60px 0"}})),x.value?(p(),v(N,{key:3,message:O.value?"提交成功":"提交结果",description:x.value,type:O.value?"success":"info","show-icon":"",closable:"",style:{"margin-top":"16px"},onClose:e[0]||(e[0]=d=>x.value="")},null,8,["message","description","type"])):b("",!0)]),_:1}),a(R,{key:"io"},{tab:t(()=>[a(g(j)),e[11]||(e[11]=i(" 导入导出 ",-1))]),default:t(()=>[a(y,{title:"导入数据",bordered:!1,style:{background:"var(--bg-card)",border:"1px solid var(--border-color)","margin-bottom":"16px"}},{default:t(()=>[s("div",re,[s("div",ie,[e[12]||(e[12]=s("label",{style:{display:"block","margin-bottom":"6px",color:"var(--text-secondary)","font-size":"13px"}},"文件路径",-1)),a(K,{value:M.value,"onUpdate:value":e[1]||(e[1]=d=>M.value=d),placeholder:"输入文件或目录路径,如 ./docs","allow-clear":""},null,8,["value"])]),s("div",ue,[e[16]||(e[16]=s("label",{style:{display:"block","margin-bottom":"6px",color:"var(--text-secondary)","font-size":"13px"}},"格式",-1)),a(X,{value:z.value,"onUpdate:value":e[2]||(e[2]=d=>z.value=d),style:{width:"140px"}},{default:t(()=>[a(F,{value:"markdown"},{default:t(()=>[...e[13]||(e[13]=[i("Markdown",-1)])]),_:1}),a(F,{value:"pdf"},{default:t(()=>[...e[14]||(e[14]=[i("PDF",-1)])]),_:1}),a(F,{value:"evernote"},{default:t(()=>[...e[15]||(e[15]=[i("Evernote",-1)])]),_:1})]),_:1},8,["value"])]),a(n,{type:"primary",loading:A.value,disabled:!M.value.trim(),onClick:H},{icon:t(()=>[a(g(j))]),default:t(()=>[e[17]||(e[17]=i(" 导入 ",-1))]),_:1},8,["loading","disabled"])])]),_:1}),a(y,{title:"导出站点",bordered:!1,style:{background:"var(--bg-card)",border:"1px solid var(--border-color)","margin-bottom":"16px"}},{default:t(()=>[s("div",de,[s("div",pe,[e[18]||(e[18]=s("label",{style:{display:"block","margin-bottom":"6px",color:"var(--text-secondary)","font-size":"13px"}},"输出路径",-1)),a(K,{value:S.value,"onUpdate:value":e[3]||(e[3]=d=>S.value=d),placeholder:"输出目录,如 ./site","allow-clear":""},null,8,["value"])]),a(n,{type:"primary",loading:D.value,disabled:!S.value.trim(),onClick:Q},{icon:t(()=>[a(g(le))]),default:t(()=>[e[19]||(e[19]=i(" 导出为静态站点 ",-1))]),_:1},8,["loading","disabled"])])]),_:1}),c.value?(p(),v(N,{key:0,message:_.value?"操作成功":"操作结果",description:c.value,type:_.value?"success":"info","show-icon":"",closable:"",style:{"margin-top":"16px"},onClose:e[4]||(e[4]=d=>c.value="")},null,8,["message","description","type"])):b("",!0),w.value?(p(),v(y,{key:1,title:"命令输出",bordered:!1,style:{background:"var(--bg-base)",border:"1px solid var(--border-color)","margin-top":"16px"}},{default:t(()=>[s("pre",ce,V(w.value),1)]),_:1})):b("",!0)]),_:1})]),_:1},8,["activeKey"]),a(Z,{open:E.value,"onUpdate:open":e[6]||(e[6]=d=>E.value=d),title:"确认自动提交","ok-text":"确认提交","cancel-text":"取消","confirm-loading":B.value,onOk:W},{default:t(()=>[...e[20]||(e[20]=[s("p",{style:{color:"var(--text-secondary)"}},[i(" 将执行 "),s("code",null,"git auto-commit"),i(" 自动提交当前所有变更。请确认工作区文件已准备就绪。 ")],-1)])]),_:1},8,["open","confirm-loading"])])}}},Le=te(me,[["__scopeId","data-v-1f28d00c"]]);export{Le as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
.page-title[data-v-0524a699]{margin:0;color:var(--text-primary);font-size:22px;font-weight:600}.page-sub[data-v-0524a699]{margin:4px 0 0;color:var(--text-secondary);font-size:13px}.governance-tabs[data-v-0524a699] .ant-tabs-nav{margin-bottom:16px}.filter-bar[data-v-0524a699]{display:flex;align-items:center;gap:12px;margin-bottom:12px;flex-wrap:wrap}.type-pill[data-v-0524a699]{padding:10px 12px;border-radius:6px;background:#1677ff0a;border:1px solid var(--border-color);border-left:3px solid #1677ff;height:100%}.type-head[data-v-0524a699]{display:flex;align-items:center;justify-content:space-between;margin-bottom:6px}.type-count[data-v-0524a699]{font-size:18px;font-weight:600;color:var(--text-primary)}.type-name[data-v-0524a699]{color:var(--text-primary);font-size:13px;font-weight:500}.type-desc[data-v-0524a699]{color:var(--text-secondary);font-size:11px;margin-top:2px}.bd-row[data-v-0524a699]{display:flex;align-items:center;margin-bottom:8px}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{u as tt}from"./ws-4ur1fGsk.js";import{s as Pe}from"./community-parser-CO25nZFt.js";import{_ as ot}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{E as at}from"./useConfigInject-DIkkDpt1.js";import{a as _}from"./index-BB5y5Y0z.js";import{_ as lt,ah as nt,b as he,af as rt,a9 as st,ab as it,aE as ut,aF as pt}from"./icons-CJACPYXu.js";import{l as ct,F as y,D as d,c as e,x as o,m as g,G as b,q as f,r as S,v as s,J as u,u as x,H as N,L as M,N as dt,I as i,j as ft,a as we}from"./vendor-D0Qjn73K.js";import"./index-Vit9TJBu.js";import"./transition-CVd2ueaJ.js";import"./Keyframes-C7fCrnlS.js";import"./Portal-SsPhn64D.js";import"./index-U4Zd5IK6.js";function R(r){const n=Pe(r);if(!n)return null;try{return JSON.parse(n)}catch{}const p=n.match(/\{[\s\S]*\}|\[[\s\S]*\]/);if(!p)return null;try{return JSON.parse(p[0])}catch{return null}}const fe=Object.freeze(["draft","active","passed","rejected","expired"]),ae=Object.freeze(["parameter_change","feature_request","policy_update","budget_allocation"]),vt=Object.freeze(["yes","no","abstain"]);function O(r,n=0){return typeof r=="number"&&Number.isFinite(r)?r:n}function q(r){if(!r)return{noDb:!1,error:""};const n=Pe(r),p=/Database not available/i.test(n);return{noDb:p,error:p?"Database not available":""}}function yt(r,n=0){if(!r||typeof r!="object")return null;const p=r.id||"";return p?{key:p,id:p,name:String(r.name||""),description:String(r.description||""),_idx:n}:null}function mt(r){const n=R(r);return Array.isArray(n)?n.map(yt).filter(Boolean):[]}function _t(r,n=0){if(!r||typeof r!="object")return null;const p=r.id||"";return p?{key:p,id:p,title:String(r.title||""),description:r.description??"",type:String(r.type||"feature_request"),proposerDid:r.proposerDid??"",status:String(r.status||"draft").toLowerCase(),impactLevel:r.impactLevel??"",impactAnalysis:r.impactAnalysis??null,voteYes:O(r.voteYes,0),voteNo:O(r.voteNo,0),voteAbstain:O(r.voteAbstain,0),votingStartsAt:r.votingStartsAt??null,votingEndsAt:r.votingEndsAt??null,metadata:r.metadata??null,createdAt:r.createdAt??null,_idx:n}:null}function bt(r){const n=R(r);return Array.isArray(n)?n.map(_t).filter(Boolean):[]}function gt(r,n=0){if(!r||typeof r!="object")return null;const p=r.id||"";if(!p)return null;const C=String(r.vote||"").toLowerCase();return{key:p,id:p,proposalId:String(r.proposalId||""),voterDid:String(r.voterDid||""),vote:(vt.includes(C),C),reason:r.reason??"",weight:O(r.weight,1),createdAt:r.createdAt??null,_idx:n}}function xt(r){const n=R(r);return Array.isArray(n)?n.map(gt).filter(Boolean):[]}function kt(r){const n=R(r);return!n||typeof n!="object"||Array.isArray(n)?null:{impactLevel:String(n.impactLevel||""),affectedComponents:Array.isArray(n.affectedComponents)?n.affectedComponents.filter(p=>typeof p=="string"):[],riskScore:O(n.riskScore,0),benefitScore:O(n.benefitScore,0),estimatedEffort:String(n.estimatedEffort||""),communitySentiment:String(n.communitySentiment||""),recommendations:Array.isArray(n.recommendations)?n.recommendations.filter(p=>typeof p=="string"):[],analyzedAt:n.analyzedAt??null}}function St(r){const n=R(r);return!n||typeof n!="object"||Array.isArray(n)?null:{proposalId:String(n.proposalId||""),predictedOutcome:String(n.predictedOutcome||""),confidence:O(n.confidence,0),yesProb:O(n.yesProb,0),noProb:O(n.noProb,0),abstainProb:O(n.abstainProb,0),basedOn:String(n.basedOn||""),sampleSize:O(n.sampleSize,0)}}const zt={proposalCount:0,voteCount:0,byStatus:{},byType:{}};function Ct(r){const n=JSON.parse(JSON.stringify(zt));for(const C of fe)n.byStatus[C]=0;for(const C of ae)n.byType[C]=0;const p=R(r);if(!p||typeof p!="object"||Array.isArray(p))return n;if(n.proposalCount=O(p.proposalCount,0),n.voteCount=O(p.voteCount,0),p.byStatus&&typeof p.byStatus=="object")for(const[C,L]of Object.entries(p.byStatus))typeof L=="number"&&Number.isFinite(L)&&(n.byStatus[C]=L);if(p.byType&&typeof p.byType=="object")for(const[C,L]of Object.entries(p.byType))typeof L=="number"&&Number.isFinite(L)&&(n.byType[C]=L);return n}function Q(r){if(r==null||r==="")return"—";const n=typeof r=="number"?new Date(r):new Date(String(r));return isNaN(n.getTime())?String(r):n.toLocaleString("zh-CN",{hour12:!1})}const At={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},Dt={class:"type-head"},ht={class:"type-count"},wt={class:"type-name"},Pt={class:"type-desc"},Ot={class:"filter-bar"},jt={style:{color:"var(--text-primary)","font-weight":"500"}},Lt={style:{color:"var(--text-secondary)","font-size":"11px","font-family":"monospace","margin-top":"2px"}},Tt={style:{"font-family":"monospace","font-size":"12px"}},$t={style:{color:"#52c41a"}},Nt={style:{color:"#ff4d4f"}},Et={style:{color:"var(--text-muted)"}},Ut={key:1,style:{color:"var(--text-muted)"}},It={key:5,style:{color:"var(--text-secondary)","font-size":"11px"}},Mt={style:{padding:"40px",color:"var(--text-muted)","text-align":"center"}},Ft={key:0,style:{"padding-top":"8px"}},qt={style:{"font-family":"monospace","font-size":"12px"}},Rt={key:0,style:{"font-family":"monospace","font-size":"12px"}},Vt={key:1,style:{color:"var(--text-muted)"}},Bt={key:0,style:{"white-space":"pre-wrap"}},Yt={key:1,style:{color:"var(--text-muted)"}},Gt={style:{"margin-left":"8px",color:"var(--text-muted)","font-size":"11px"}},Jt={style:{"margin-left":"8px","font-family":"monospace","font-size":"11px",color:"var(--text-secondary)"}},Kt={key:0,style:{"margin-left":"8px",color:"var(--text-secondary)","font-size":"12px"}},Ht={style:{"margin-left":"auto",color:"var(--text-muted)","font-size":"11px"}},Wt={key:0,style:{"padding-top":"8px"}},Qt={style:{"margin-bottom":"8px"}},Xt={key:0,style:{"padding-top":"8px"}},Zt={style:{"text-align":"center","margin-bottom":"20px"}},eo={style:{color:"#52c41a"}},to={style:{color:"#ff4d4f"}},oo={style:{color:"var(--text-muted)"}},ao={__name:"Governance",setup(r){const n=tt(),p=at.PRESENTED_IMAGE_SIMPLE,C=S(!1),L=S(!1),le=S(!1),ve=S([]),ye=S([]),h=S({proposalCount:0,voteCount:0,byStatus:{},byType:{}}),ne=S({noDb:!1,error:""}),me=S("proposals"),V=S(""),B=S(""),X=S(!1),Z=S(!1),re=S(!1),se=S(!1),ie=S(!1),k=we({title:"",type:"feature_request",proposerDid:"",description:""}),z=we({voterDid:"",value:"yes",weight:1,reason:""}),c=S(null),ee=S([]),w=S(null),P=S(null),Oe=[{title:"标题",key:"title"},{title:"类型",key:"type",width:"130px"},{title:"状态",key:"status",width:"100px"},{title:"票数",key:"tally",width:"180px"},{title:"影响",key:"impact",width:"100px"},{title:"创建时间",key:"createdAt",width:"160px"},{title:"操作",key:"action",width:"320px"}],je=ft(()=>{let l=ve.value;return V.value&&(l=l.filter(t=>t.status===V.value)),B.value&&(l=l.filter(t=>t.type===B.value)),l});function te(l){return{draft:"草稿",active:"进行中",passed:"已通过",rejected:"已否决",expired:"已过期"}[l]||l}function ue(l){return{draft:"default",active:"processing",passed:"green",rejected:"red",expired:"default"}[l]||"default"}function Le(l){return{draft:"#888",active:"#1677ff",passed:"#52c41a",rejected:"#ff4d4f",expired:"#888"}[l]||"#888"}function Y(l){return{parameter_change:"参数变更",feature_request:"功能请求",policy_update:"策略更新",budget_allocation:"预算分配"}[l]||l}function G(l){return{parameter_change:"cyan",feature_request:"blue",policy_update:"purple",budget_allocation:"gold"}[l]||"default"}function Te(l){return{parameter_change:"#13c2c2",feature_request:"#1677ff",policy_update:"#722ed1",budget_allocation:"#faad14"}[l]||"#888"}function pe(l){return{low:"低",medium:"中",high:"高",critical:"关键"}[l]||l}function _e(l){return{low:"default",medium:"blue",high:"orange",critical:"red"}[l]||"default"}function $e(l){return{low:"#888",medium:"#1677ff",high:"#faad14",critical:"#ff4d4f"}[l]||"#888"}function Ne(l){return{yes:"赞成",no:"反对",abstain:"弃权"}[l]||l}function Ee(l){return{yes:"green",no:"red",abstain:"default"}[l]||"default"}function Ue(l){return{small:"小",medium:"中",large:"大"}[l]||l||"—"}function Ie(l){return{positive:"积极",cautious:"谨慎",negative:"负面"}[l]||l||"—"}function Me(l){const t=l.voteYes+l.voteNo;return t?Math.round(l.voteYes/t*100):0}function be(l,t){return t?Math.round(l/t*100):0}async function J(){C.value=!0,ne.value={noDb:!1,error:""};try{const[l,t,m]=await Promise.all([n.execute("governance types --json",8e3).catch(()=>({output:""})),n.execute("governance list --json",1e4).catch(()=>({output:""})),n.execute("governance stats --json",8e3).catch(()=>({output:""}))]),j=[t,m].map(K=>q(K.output)).find(K=>K.noDb);j&&(ne.value=j),ye.value=mt(l.output),ve.value=bt(t.output),h.value=Ct(m.output)}catch(l){_.error("加载治理数据失败: "+(l?.message||l))}finally{C.value=!1}}async function Fe(){if(!k.title.trim()){_.warning("请填写标题");return}L.value=!0;try{const l=[`governance create "${k.title.trim().replace(/"/g,'\\"')}"`];l.push(`-t ${k.type}`),k.proposerDid.trim()&&l.push(`-p "${k.proposerDid.trim().replace(/"/g,'\\"')}"`),k.description.trim()&&l.push(`-d "${k.description.trim().replace(/"/g,'\\"')}"`),l.push("--json");const{output:t}=await n.execute(l.join(" "),1e4);if(q(t).noDb){_.error("需要先 cc init 初始化项目");return}if(!/"id"/.test(t)){_.error("创建失败: "+t.slice(0,120));return}_.success("提案已创建(草稿)"),X.value=!1,xe(),await J()}catch(l){_.error("创建失败: "+(l?.message||l))}finally{L.value=!1}}async function qe(l){await ge(`governance activate ${l.id} --json`,"已启动投票")}async function Re(l){await ge(`governance close ${l.id} --json`,"投票已关闭")}async function ge(l,t){try{const{output:m}=await n.execute(l,1e4);if(q(m).noDb){_.error("需要先 cc init 初始化项目");return}if(!/"id"|"proposalId"|"passed"/.test(m)){_.error("操作失败: "+m.slice(0,120));return}_.success(t),await J()}catch(m){_.error("操作失败: "+(m?.message||m))}}function Ve(l){c.value=l,z.voterDid="",z.value="yes",z.weight=1,z.reason="",Z.value=!0}async function Be(){if(c.value){if(!z.voterDid.trim()){_.warning("请填写投票人 DID");return}le.value=!0;try{const l=[`governance vote ${c.value.id}`,`"${z.voterDid.trim().replace(/"/g,'\\"')}"`,z.value,`-w ${z.weight}`];z.reason.trim()&&l.push(`-r "${z.reason.trim().replace(/"/g,'\\"')}"`),l.push("--json");const{output:t}=await n.execute(l.join(" "),8e3);if(q(t).noDb){_.error("需要先 cc init 初始化项目");return}if(!/"id"/.test(t)){_.error("投票失败: "+t.slice(0,120));return}_.success("投票已记录"),Z.value=!1,await J()}catch(l){_.error("投票失败: "+(l?.message||l))}finally{le.value=!1}}}async function Ye(l){c.value=l,ee.value=[],re.value=!0;try{const{output:t}=await n.execute(`governance votes ${l.id} --json`,8e3);ee.value=xt(t)}catch{}}async function Ge(l){c.value=l,w.value=null;try{const{output:t}=await n.execute(`governance analyze ${l.id} --json`,8e3);if(q(t).noDb){_.error("需要先 cc init 初始化项目");return}const j=kt(t);if(!j){_.error("分析失败: "+t.slice(0,120));return}w.value=j,se.value=!0}catch(t){_.error("分析失败: "+(t?.message||t))}}async function Je(l){c.value=l,P.value=null;try{const{output:t}=await n.execute(`governance predict ${l.id} --json`,8e3);if(q(t).noDb){_.error("需要先 cc init 初始化项目");return}const j=St(t);if(!j){_.error("预测失败: "+t.slice(0,120));return}P.value=j,ie.value=!0}catch(t){_.error("预测失败: "+(t?.message||t))}}function xe(){k.title="",k.type="feature_request",k.proposerDid="",k.description=""}return ct(J),(l,t)=>{const m=f("a-button"),j=f("a-space"),K=f("a-alert"),E=f("a-statistic"),T=f("a-card"),$=f("a-col"),oe=f("a-row"),A=f("a-tag"),I=f("a-radio-button"),ce=f("a-radio-group"),F=f("a-progress"),Ke=f("a-popconfirm"),He=f("a-table"),ke=f("a-tab-pane"),We=f("a-tabs"),de=f("a-input"),U=f("a-form-item"),Qe=f("a-select-option"),Xe=f("a-select"),Se=f("a-textarea"),ze=f("a-form"),H=f("a-modal"),Ze=f("a-input-number"),D=f("a-descriptions-item"),Ce=f("a-descriptions"),et=f("a-empty"),Ae=f("a-list-item"),De=f("a-list");return s(),y("div",null,[d("div",At,[t[19]||(t[19]=d("div",null,[d("h2",{class:"page-title"},"社区治理"),d("p",{class:"page-sub"},"提案 · 加权投票 · 启发式影响分析 · 投票预测")],-1)),e(j,null,{default:o(()=>[e(m,{loading:C.value,onClick:J},{icon:o(()=>[e(x(lt))]),default:o(()=>[t[17]||(t[17]=u(" 刷新 ",-1))]),_:1},8,["loading"]),e(m,{type:"primary",onClick:t[0]||(t[0]=a=>X.value=!0)},{icon:o(()=>[e(x(nt))]),default:o(()=>[t[18]||(t[18]=u(" 创建提案 ",-1))]),_:1})]),_:1})]),ne.value.noDb?(s(),g(K,{key:0,type:"info","show-icon":"",message:"该模块需要项目级数据库",description:"`cc governance ...` 命令仅在 chainlesschain 项目目录下可用。请先运行 `cc init` 初始化项目,或在已初始化的目录启动 `cc serve`。",style:{"margin-bottom":"16px"}})):b("",!0),e(oe,{gutter:[16,16],style:{"margin-bottom":"20px"}},{default:o(()=>[e($,{xs:12,sm:8,lg:5},{default:o(()=>[e(T,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:o(()=>[e(E,{title:"提案总数",value:h.value.proposalCount,"value-style":{color:"#1677ff",fontSize:"20px"}},{prefix:o(()=>[e(x(he))]),_:1},8,["value"])]),_:1})]),_:1}),e($,{xs:12,sm:8,lg:5},{default:o(()=>[e(T,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:o(()=>[e(E,{title:"进行中",value:h.value.byStatus.active||0,"value-style":{color:(h.value.byStatus.active||0)>0?"#1677ff":"#888",fontSize:"20px"}},{prefix:o(()=>[e(x(rt))]),_:1},8,["value","value-style"])]),_:1})]),_:1}),e($,{xs:12,sm:8,lg:5},{default:o(()=>[e(T,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:o(()=>[e(E,{title:"已通过",value:h.value.byStatus.passed||0,"value-style":{color:"#52c41a",fontSize:"20px"}},{prefix:o(()=>[e(x(st))]),_:1},8,["value"])]),_:1})]),_:1}),e($,{xs:12,sm:8,lg:5},{default:o(()=>[e(T,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:o(()=>[e(E,{title:"被否决",value:h.value.byStatus.rejected||0,"value-style":{color:"#ff4d4f",fontSize:"20px"}},{prefix:o(()=>[e(x(it))]),_:1},8,["value"])]),_:1})]),_:1}),e($,{xs:24,sm:8,lg:4},{default:o(()=>[e(T,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:o(()=>[e(E,{title:"投票总数",value:h.value.voteCount,"value-style":{color:"#722ed1",fontSize:"20px"}},{prefix:o(()=>[e(x(ut))]),_:1},8,["value"])]),_:1})]),_:1})]),_:1}),e(T,{title:"提案类型",size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"20px"},"body-style":{padding:"12px 16px"}},{default:o(()=>[e(oe,{gutter:[12,12]},{default:o(()=>[(s(!0),y(N,null,M(ye.value,a=>(s(),g($,{key:a.id,xs:12,sm:12,lg:6},{default:o(()=>[d("div",{class:"type-pill",style:dt({borderLeftColor:G(a.id)})},[d("div",Dt,[e(A,{color:G(a.id),style:{"font-family":"monospace"}},{default:o(()=>[u(i(a.id),1)]),_:2},1032,["color"]),d("span",ht,i(h.value.byType[a.id]||0),1)]),d("div",wt,i(a.name),1),d("div",Pt,i(a.description),1)],4)]),_:2},1024))),128))]),_:1})]),_:1}),e(We,{activeKey:me.value,"onUpdate:activeKey":t[3]||(t[3]=a=>me.value=a),class:"governance-tabs"},{default:o(()=>[e(ke,{key:"proposals",tab:"提案"},{default:o(()=>[d("div",Ot,[e(ce,{value:V.value,"onUpdate:value":t[1]||(t[1]=a=>V.value=a),size:"small","button-style":"solid"},{default:o(()=>[e(I,{value:""},{default:o(()=>[...t[20]||(t[20]=[u("全部状态",-1)])]),_:1}),(s(!0),y(N,null,M(x(fe),a=>(s(),g(I,{key:a,value:a},{default:o(()=>[u(i(te(a)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"]),e(ce,{value:B.value,"onUpdate:value":t[2]||(t[2]=a=>B.value=a),size:"small"},{default:o(()=>[e(I,{value:""},{default:o(()=>[...t[21]||(t[21]=[u("全部类型",-1)])]),_:1}),(s(!0),y(N,null,M(x(ae),a=>(s(),g(I,{key:a,value:a},{default:o(()=>[u(i(Y(a)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),e(He,{columns:Oe,"data-source":je.value,pagination:{pageSize:20,showTotal:a=>`共 ${a} 条`},size:"small",loading:C.value,style:{background:"var(--bg-card)"}},{bodyCell:o(({column:a,record:v})=>[a.key==="title"?(s(),y(N,{key:0},[d("span",jt,i(v.title||"(未命名)"),1),d("div",Lt,i(v.id.slice(0,16)),1)],64)):b("",!0),a.key==="type"?(s(),g(A,{key:1,color:G(v.type),style:{"font-family":"monospace"}},{default:o(()=>[u(i(Y(v.type)),1)]),_:2},1032,["color"])):b("",!0),a.key==="status"?(s(),g(A,{key:2,color:ue(v.status)},{default:o(()=>[u(i(te(v.status)),1)]),_:2},1032,["color"])):b("",!0),a.key==="tally"?(s(),y(N,{key:3},[d("span",Tt,[d("span",$t,"+"+i(v.voteYes),1),t[22]||(t[22]=u(" / ",-1)),d("span",Nt,"-"+i(v.voteNo),1),t[23]||(t[23]=u(" / ",-1)),d("span",Et,"~"+i(v.voteAbstain),1)]),v.voteYes+v.voteNo>0?(s(),g(F,{key:0,percent:Me(v),size:"small","show-info":!1,"stroke-color":v.voteYes>=v.voteNo?"#52c41a":"#ff4d4f",style:{"margin-top":"4px"}},null,8,["percent","stroke-color"])):b("",!0)],64)):b("",!0),a.key==="impact"?(s(),y(N,{key:4},[v.impactLevel?(s(),g(A,{key:0,color:_e(v.impactLevel)},{default:o(()=>[u(i(pe(v.impactLevel)),1)]),_:2},1032,["color"])):(s(),y("span",Ut,"—"))],64)):b("",!0),a.key==="createdAt"?(s(),y("span",It,i(x(Q)(v.createdAt)),1)):b("",!0),a.key==="action"?(s(),y(N,{key:6},[e(m,{size:"small",type:"link",onClick:W=>Ye(v)},{default:o(()=>[...t[24]||(t[24]=[u("详情",-1)])]),_:1},8,["onClick"]),v.status==="draft"?(s(),g(m,{key:0,size:"small",type:"link",onClick:W=>qe(v)},{default:o(()=>[...t[25]||(t[25]=[u("启动投票",-1)])]),_:1},8,["onClick"])):b("",!0),v.status==="active"?(s(),g(m,{key:1,size:"small",type:"link",style:{color:"#52c41a"},onClick:W=>Ve(v)},{default:o(()=>[...t[26]||(t[26]=[u("投票",-1)])]),_:1},8,["onClick"])):b("",!0),v.status==="active"?(s(),g(Ke,{key:2,title:"关闭投票并按当前票数结算?","ok-text":"关闭","cancel-text":"返回",onConfirm:W=>Re(v)},{default:o(()=>[e(m,{size:"small",type:"link",danger:""},{default:o(()=>[...t[27]||(t[27]=[u("关闭",-1)])]),_:1})]),_:1},8,["onConfirm"])):b("",!0),e(m,{size:"small",type:"link",onClick:W=>Ge(v)},{default:o(()=>[...t[28]||(t[28]=[u("影响分析",-1)])]),_:1},8,["onClick"]),e(m,{size:"small",type:"link",onClick:W=>Je(v)},{default:o(()=>[...t[29]||(t[29]=[u("预测",-1)])]),_:1},8,["onClick"])],64)):b("",!0)]),emptyText:o(()=>[d("div",Mt,[e(x(he),{style:{"font-size":"36px","margin-bottom":"10px",display:"block"}}),u(" "+i(V.value||B.value?"没有符合条件的提案":'暂无提案,点"创建提案"创建第一条'),1)])]),_:1},8,["data-source","pagination","loading"])]),_:1}),e(ke,{key:"breakdown",tab:"状态分布"},{default:o(()=>[e(oe,{gutter:[16,16]},{default:o(()=>[e($,{xs:24,lg:12},{default:o(()=>[e(T,{title:"按状态",size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:o(()=>[(s(!0),y(N,null,M(x(fe),a=>(s(),y("div",{key:a,class:"bd-row"},[e(A,{color:ue(a),style:{"min-width":"60px","text-align":"center"}},{default:o(()=>[u(i(te(a)),1)]),_:2},1032,["color"]),e(F,{percent:be(h.value.byStatus[a]||0,h.value.proposalCount),"stroke-color":Le(a),format:()=>`${h.value.byStatus[a]||0}`,size:"small",style:{flex:"1","margin-left":"12px"}},null,8,["percent","stroke-color","format"])]))),128))]),_:1})]),_:1}),e($,{xs:24,lg:12},{default:o(()=>[e(T,{title:"按类型",size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:o(()=>[(s(!0),y(N,null,M(x(ae),a=>(s(),y("div",{key:a,class:"bd-row"},[e(A,{color:G(a),style:{"min-width":"90px","text-align":"center"}},{default:o(()=>[u(i(Y(a)),1)]),_:2},1032,["color"]),e(F,{percent:be(h.value.byType[a]||0,h.value.proposalCount),"stroke-color":Te(a),format:()=>`${h.value.byType[a]||0}`,size:"small",style:{flex:"1","margin-left":"12px"}},null,8,["percent","stroke-color","format"])]))),128))]),_:1})]),_:1})]),_:1})]),_:1})]),_:1},8,["activeKey"]),e(H,{open:X.value,"onUpdate:open":t[8]||(t[8]=a=>X.value=a),title:"创建提案","confirm-loading":L.value,width:560,"ok-text":"创建","cancel-text":"取消",onOk:Fe,onCancel:xe},{default:o(()=>[e(ze,{"label-col":{span:5},"wrapper-col":{span:19},style:{"margin-top":"16px"}},{default:o(()=>[e(U,{label:"标题",required:""},{default:o(()=>[e(de,{value:k.title,"onUpdate:value":t[4]||(t[4]=a=>k.title=a),placeholder:"例如: 增加深色模式支持"},null,8,["value"])]),_:1}),e(U,{label:"类型",required:""},{default:o(()=>[e(Xe,{value:k.type,"onUpdate:value":t[5]||(t[5]=a=>k.type=a)},{default:o(()=>[(s(!0),y(N,null,M(x(ae),a=>(s(),g(Qe,{key:a,value:a},{default:o(()=>[u(i(Y(a)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),_:1}),e(U,{label:"提案人 DID"},{default:o(()=>[e(de,{value:k.proposerDid,"onUpdate:value":t[6]||(t[6]=a=>k.proposerDid=a),placeholder:"可选,例如 did:key:z6Mk..."},null,8,["value"])]),_:1}),e(U,{label:"描述"},{default:o(()=>[e(Se,{value:k.description,"onUpdate:value":t[7]||(t[7]=a=>k.description=a),placeholder:"提案的背景、动机、范围(描述越详细,影响分析的 benefit 评分越高)","auto-size":{minRows:3,maxRows:8}},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"]),e(H,{open:Z.value,"onUpdate:open":t[13]||(t[13]=a=>Z.value=a),title:`对提案投票:${c.value?.title||""}`,"confirm-loading":le.value,width:540,"ok-text":"投票","cancel-text":"取消",onOk:Be},{default:o(()=>[e(ze,{"label-col":{span:5},"wrapper-col":{span:19},style:{"margin-top":"16px"}},{default:o(()=>[e(U,{label:"投票人 DID",required:""},{default:o(()=>[e(de,{value:z.voterDid,"onUpdate:value":t[9]||(t[9]=a=>z.voterDid=a),placeholder:"did:key:..."},null,8,["value"])]),_:1}),e(U,{label:"选项",required:""},{default:o(()=>[e(ce,{value:z.value,"onUpdate:value":t[10]||(t[10]=a=>z.value=a),"button-style":"solid"},{default:o(()=>[e(I,{value:"yes",style:{color:"#52c41a"}},{default:o(()=>[...t[30]||(t[30]=[u("赞成",-1)])]),_:1}),e(I,{value:"no",style:{color:"#ff4d4f"}},{default:o(()=>[...t[31]||(t[31]=[u("反对",-1)])]),_:1}),e(I,{value:"abstain"},{default:o(()=>[...t[32]||(t[32]=[u("弃权",-1)])]),_:1})]),_:1},8,["value"])]),_:1}),e(U,{label:"权重"},{default:o(()=>[e(Ze,{value:z.weight,"onUpdate:value":t[11]||(t[11]=a=>z.weight=a),min:.1,step:.1,style:{width:"120px"}},null,8,["value"]),t[33]||(t[33]=d("span",{style:{"margin-left":"8px",color:"var(--text-muted)","font-size":"12px"}},"默认 1.0",-1))]),_:1}),e(U,{label:"理由"},{default:o(()=>[e(Se,{value:z.reason,"onUpdate:value":t[12]||(t[12]=a=>z.reason=a),placeholder:"可选,说明投票理由","auto-size":{minRows:2,maxRows:5}},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","title","confirm-loading"]),e(H,{open:re.value,"onUpdate:open":t[14]||(t[14]=a=>re.value=a),title:`提案详情:${c.value?.title||""}`,width:780,footer:null},{default:o(()=>[c.value?(s(),y("div",Ft,[e(Ce,{column:2,size:"small",bordered:""},{default:o(()=>[e(D,{label:"ID",span:2},{default:o(()=>[d("span",qt,i(c.value.id),1)]),_:1}),e(D,{label:"类型"},{default:o(()=>[e(A,{color:G(c.value.type)},{default:o(()=>[u(i(Y(c.value.type)),1)]),_:1},8,["color"])]),_:1}),e(D,{label:"状态"},{default:o(()=>[e(A,{color:ue(c.value.status)},{default:o(()=>[u(i(te(c.value.status)),1)]),_:1},8,["color"])]),_:1}),e(D,{label:"提案人",span:2},{default:o(()=>[c.value.proposerDid?(s(),y("span",Rt,i(c.value.proposerDid),1)):(s(),y("span",Vt,"未指定"))]),_:1}),e(D,{label:"描述",span:2},{default:o(()=>[c.value.description?(s(),y("div",Bt,i(c.value.description),1)):(s(),y("span",Yt,"—"))]),_:1}),e(D,{label:"投票汇总",span:2},{default:o(()=>[e(j,null,{default:o(()=>[e(A,{color:"green"},{default:o(()=>[u("赞成: "+i(c.value.voteYes),1)]),_:1}),e(A,{color:"red"},{default:o(()=>[u("反对: "+i(c.value.voteNo),1)]),_:1}),e(A,null,{default:o(()=>[u("弃权: "+i(c.value.voteAbstain),1)]),_:1})]),_:1})]),_:1}),c.value.impactLevel?(s(),g(D,{key:0,label:"影响等级"},{default:o(()=>[e(A,{color:_e(c.value.impactLevel)},{default:o(()=>[u(i(pe(c.value.impactLevel)),1)]),_:1},8,["color"])]),_:1})):b("",!0),e(D,{label:"创建时间"},{default:o(()=>[u(i(x(Q)(c.value.createdAt)),1)]),_:1}),c.value.votingStartsAt?(s(),g(D,{key:1,label:"投票开始"},{default:o(()=>[u(i(x(Q)(c.value.votingStartsAt)),1)]),_:1})):b("",!0),c.value.votingEndsAt?(s(),g(D,{key:2,label:"投票结束"},{default:o(()=>[u(i(x(Q)(c.value.votingEndsAt)),1)]),_:1})):b("",!0)]),_:1}),t[34]||(t[34]=d("h4",{style:{color:"var(--text-primary)","font-size":"13px",margin:"20px 0 10px"}},"投票记录",-1)),ee.value.length?(s(),g(De,{key:1,size:"small","data-source":ee.value,pagination:{pageSize:8}},{renderItem:o(({item:a})=>[e(Ae,null,{default:o(()=>[e(A,{color:Ee(a.vote),style:{"min-width":"50px","text-align":"center"}},{default:o(()=>[u(i(Ne(a.vote)),1)]),_:2},1032,["color"]),d("span",Gt,"w="+i(a.weight),1),d("span",Jt,i(a.voterDid),1),a.reason?(s(),y("span",Kt,"— "+i(a.reason),1)):b("",!0),d("span",Ht,i(x(Q)(a.createdAt)),1)]),_:2},1024)]),_:1},8,["data-source"])):(s(),g(et,{key:0,description:"暂无投票",image:x(p)},null,8,["image"]))])):b("",!0)]),_:1},8,["open","title"]),e(H,{open:se.value,"onUpdate:open":t[15]||(t[15]=a=>se.value=a),title:`影响分析:${c.value?.title||""}`,width:640,footer:null},{default:o(()=>[w.value?(s(),y("div",Wt,[e(oe,{gutter:[12,12],style:{"margin-bottom":"16px"}},{default:o(()=>[e($,{span:8},{default:o(()=>[e(E,{title:"影响等级",value:pe(w.value.impactLevel),"value-style":{color:$e(w.value.impactLevel),fontSize:"16px"}},null,8,["value","value-style"])]),_:1}),e($,{span:8},{default:o(()=>[e(E,{title:"工作量",value:Ue(w.value.estimatedEffort),"value-style":{fontSize:"16px"}},null,8,["value"])]),_:1}),e($,{span:8},{default:o(()=>[e(E,{title:"社区情绪",value:Ie(w.value.communitySentiment),"value-style":{fontSize:"16px"}},null,8,["value"])]),_:1})]),_:1}),e(T,{title:"风险 / 收益",size:"small",style:{"margin-bottom":"12px"}},{default:o(()=>[d("div",Qt,[t[35]||(t[35]=d("span",{style:{color:"var(--text-secondary)","font-size":"12px"}},"风险评分",-1)),e(F,{percent:Math.round(w.value.riskScore*100),"stroke-color":"#ff4d4f"},null,8,["percent"])]),d("div",null,[t[36]||(t[36]=d("span",{style:{color:"var(--text-secondary)","font-size":"12px"}},"收益评分",-1)),e(F,{percent:Math.round(w.value.benefitScore*100),"stroke-color":"#52c41a"},null,8,["percent"])])]),_:1}),w.value.affectedComponents.length?(s(),g(T,{key:0,title:"影响组件",size:"small",style:{"margin-bottom":"12px"}},{default:o(()=>[(s(!0),y(N,null,M(w.value.affectedComponents,a=>(s(),g(A,{key:a,color:"blue"},{default:o(()=>[u(i(a),1)]),_:2},1024))),128))]),_:1})):b("",!0),w.value.recommendations.length?(s(),g(T,{key:1,title:"建议",size:"small"},{default:o(()=>[e(De,{size:"small","data-source":w.value.recommendations},{renderItem:o(({item:a})=>[e(Ae,null,{default:o(()=>[e(x(pt),{style:{color:"#faad14","margin-right":"8px"}}),u(" "+i(a),1)]),_:2},1024)]),_:1},8,["data-source"])]),_:1})):b("",!0)])):b("",!0)]),_:1},8,["open","title"]),e(H,{open:ie.value,"onUpdate:open":t[16]||(t[16]=a=>ie.value=a),title:`投票预测:${c.value?.title||""}`,width:540,footer:null},{default:o(()=>[P.value?(s(),y("div",Xt,[d("div",Zt,[e(A,{color:P.value.predictedOutcome==="pass"?"green":"red",style:{"font-size":"16px",padding:"6px 14px"}},{default:o(()=>[u(i(P.value.predictedOutcome==="pass"?"预计通过":"预计否决"),1)]),_:1},8,["color"])]),e(Ce,{column:2,size:"small",bordered:""},{default:o(()=>[e(D,{label:"置信度",span:2},{default:o(()=>[e(F,{percent:Math.round(P.value.confidence*100),"stroke-color":P.value.confidence>=.6?"#52c41a":"#faad14"},null,8,["percent","stroke-color"])]),_:1}),e(D,{label:"预测依据"},{default:o(()=>[e(A,{color:P.value.basedOn==="votes"?"blue":"orange"},{default:o(()=>[u(i(P.value.basedOn==="votes"?"已有投票":"启发式(无投票)"),1)]),_:1},8,["color"])]),_:1}),e(D,{label:"样本数"},{default:o(()=>[u(i(P.value.sampleSize),1)]),_:1}),e(D,{label:"赞成概率"},{default:o(()=>[d("span",eo,i((P.value.yesProb*100).toFixed(1))+"%",1)]),_:1}),e(D,{label:"反对概率"},{default:o(()=>[d("span",to,i((P.value.noProb*100).toFixed(1))+"%",1)]),_:1}),e(D,{label:"弃权概率",span:2},{default:o(()=>[d("span",oo,i((P.value.abstainProb*100).toFixed(1))+"%",1)]),_:1})]),_:1})])):b("",!0)]),_:1},8,["open","title"])])}}},_o=ot(ao,[["__scopeId","data-v-0524a699"]]);export{_o as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{u as He}from"./ws-4ur1fGsk.js";import{s as Je}from"./community-parser-CO25nZFt.js";import{_ as Pe}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{a as y}from"./index-BB5y5Y0z.js";import{_ as Ee,ah as Ge,e as Q,a as X,a9 as Ve,m as Ke}from"./icons-CJACPYXu.js";import{l as We,F as c,D as M,c as a,x as t,m as x,G as m,q as v,r as S,v as i,J as d,u as k,I as p,H as C,L as w,N as Ye,j as ye,a as me}from"./vendor-D0Qjn73K.js";import"./index-Vit9TJBu.js";import"./useConfigInject-DIkkDpt1.js";import"./transition-CVd2ueaJ.js";import"./Keyframes-C7fCrnlS.js";import"./Portal-SsPhn64D.js";import"./index-U4Zd5IK6.js";function Z(l){const s=Je(l);if(!s)return null;try{return JSON.parse(s)}catch{}const u=s.match(/\{[\s\S]*\}|\[[\s\S]*\]/);if(!u)return null;try{return JSON.parse(u[0])}catch{return null}}const ve=Object.freeze(["online","offline","busy","degraded"]),Qe=Object.freeze(["queued","dispatched","running","complete","failed"]),ge=Object.freeze(["standard","encrypted","federated"]);function z(l,s=0){return typeof l=="number"&&Number.isFinite(l)?l:s}function Xe(l){if(Array.isArray(l))return l.filter(s=>typeof s=="string");if(typeof l=="string")try{const s=JSON.parse(l);if(Array.isArray(s))return s.filter(u=>typeof u=="string")}catch{}return[]}function Ze(l,s=0){if(!l||typeof l!="object")return null;const u=l.id||"";return u?{key:u,id:u,nodeId:l.nodeId??l.node_id??"",endpoint:l.endpoint||"",capabilities:Xe(l.capabilities),gpuMemoryMb:z(l.gpuMemoryMb??l.gpu_memory_mb,0),status:String(l.status||"offline").toLowerCase(),lastHeartbeat:l.lastHeartbeat??l.last_heartbeat??null,taskCount:z(l.taskCount??l.task_count,0),createdAt:l.createdAt??l.created_at??null,_idx:s}:null}function et(l){const s=Z(l);return Array.isArray(s)?s.map(Ze).filter(Boolean):[]}function tt(l,s=0){if(!l||typeof l!="object")return null;const u=l.id||"";return u?{key:u,id:u,model:String(l.model||""),input:l.input??"",output:l.output??"",privacyMode:String(l.privacyMode??l.privacy_mode??"standard").toLowerCase(),priority:z(l.priority,5),assignedNode:l.assignedNode??l.assigned_node??null,status:String(l.status||"queued").toLowerCase(),durationMs:l.durationMs??l.duration_ms??null,createdAt:l.createdAt??l.created_at??null,completedAt:l.completedAt??l.completed_at??null,_idx:s}:null}function at(l){const s=Z(l);return Array.isArray(s)?s.map(tt).filter(Boolean):[]}const ot={nodes:{total:0,online:0,offline:0,busy:0},tasks:{total:0,queued:0,completed:0,failed:0,avgDurationMs:0}};function nt(l){const s=JSON.parse(JSON.stringify(ot)),u=Z(l);return!u||typeof u!="object"||Array.isArray(u)||(u.nodes&&typeof u.nodes=="object"&&(s.nodes.total=z(u.nodes.total,0),s.nodes.online=z(u.nodes.online,0),s.nodes.offline=z(u.nodes.offline,0),s.nodes.busy=z(u.nodes.busy,0)),u.tasks&&typeof u.tasks=="object"&&(s.tasks.total=z(u.tasks.total,0),s.tasks.queued=z(u.tasks.queued,0),s.tasks.completed=z(u.tasks.completed,0),s.tasks.failed=z(u.tasks.failed,0),s.tasks.avgDurationMs=z(u.tasks.avgDurationMs??u.tasks.avg_duration_ms,0))),s}function _e(l){if(l==null||l==="")return"—";const s=typeof l=="number"?new Date(l):new Date(String(l));return isNaN(s.getTime())?String(l):s.toLocaleString("zh-CN",{hour12:!1})}const lt={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},st={style:{color:"var(--text-secondary)","font-size":"12px","margin-left":"8px"}},it={class:"filter-bar"},rt={style:{color:"var(--text-primary)","font-family":"monospace","font-weight":"500"}},ut={key:0,style:{color:"var(--text-secondary)","font-size":"11px","margin-top":"2px"}},dt={key:1,style:{color:"var(--text-muted)"}},pt={key:0,style:{color:"var(--text-secondary)","font-family":"monospace"}},ct={key:1,style:{color:"var(--text-muted)"}},ft={key:5,style:{color:"var(--text-secondary)","font-size":"11px"}},yt={style:{padding:"40px",color:"var(--text-muted)","text-align":"center"}},mt={class:"filter-bar"},vt={style:{color:"var(--text-primary)","font-family":"monospace","font-weight":"500"}},gt={key:0,style:{color:"var(--text-secondary)","font-size":"11px","margin-top":"2px"}},_t={key:0,style:{color:"var(--text-secondary)","font-family":"monospace","font-size":"11px"}},kt={key:1,style:{color:"var(--text-muted)"}},bt={key:0,style:{"font-family":"monospace",color:"var(--text-secondary)","font-size":"12px"}},xt={key:1,style:{color:"var(--text-muted)"}},St={key:6,style:{color:"var(--text-secondary)","font-size":"11px"}},Ct={style:{padding:"40px",color:"var(--text-muted)","text-align":"center"}},ht={__name:"Inference",setup(l){const s=He(),u=S(!1),E=S(!1),G=S(!1),V=S(""),K=S(""),L=S([]),ee=S([]),b=S({nodes:{total:0,online:0,offline:0,busy:0},tasks:{total:0,queued:0,completed:0,failed:0,avgDurationMs:0}}),W=S("nodes"),U=S(""),O=S(""),D=S(""),B=S(!1),R=S(!1),g=me({nodeId:"",endpoint:"",capabilities:"",gpuMemory:null}),_=me({model:"",input:"",priority:5,mode:"standard"}),ke=[{title:"节点 ID",key:"nodeId"},{title:"能力",key:"capabilities",width:"220px"},{title:"GPU",key:"gpu",width:"100px"},{title:"状态",key:"status",width:"100px"},{title:"任务数",key:"taskCount",width:"90px"},{title:"最近心跳",key:"lastHeartbeat",width:"160px"},{title:"操作",key:"action",width:"210px"}],be=[{title:"模型",key:"model"},{title:"隐私",key:"privacyMode",width:"110px"},{title:"优先级",key:"priority",width:"80px"},{title:"执行节点",key:"assignedNode",width:"140px"},{title:"状态",key:"status",width:"110px"},{title:"耗时",key:"duration",width:"110px"},{title:"提交时间",key:"createdAt",width:"160px"},{title:"操作",key:"action",width:"140px"}],xe=ye(()=>U.value?L.value.filter(o=>o.status===U.value):L.value),Se=ye(()=>{let o=ee.value;return O.value&&(o=o.filter(e=>e.status===O.value)),D.value&&(o=o.filter(e=>e.privacyMode===D.value)),o});function H(o){return{online:"在线",offline:"离线",busy:"忙碌",degraded:"降级"}[o]||o}function Ce(o){return{online:"green",offline:"default",busy:"orange",degraded:"red"}[o]||"default"}function te(o){return{queued:"排队中",dispatched:"已派发",running:"运行中",complete:"已完成",failed:"失败"}[o]||o}function he(o){return{queued:"default",dispatched:"processing",running:"cyan",complete:"green",failed:"red"}[o]||"default"}function Y(o){return{standard:"标准",encrypted:"加密",federated:"联邦"}[o]||o}function ze(o){return{standard:"default",encrypted:"purple",federated:"cyan"}[o]||"default"}function Me(o){return o>=8?"#ff4d4f":o>=5?"#faad14":"#52c41a"}function Ne(o){const e=L.value.find(f=>f.id===o);return e?e.nodeId:o.slice(0,8)}function ae(o,e){return o?o.length>e?o.slice(0,e)+"...":o:""}function Ae(o){return o>=1024?`${(o/1024).toFixed(1)} GB`:`${o} MB`}function Ie(o){return o.status==="queued"||o.status==="dispatched"||o.status==="running"}function je(o){return o.status!=="complete"&&o.status!=="failed"}function Te({key:o}){o==="register"?B.value=!0:o==="submit"&&(R.value=!0)}async function N(){u.value=!0;try{const[o,e,f]=await Promise.all([s.execute("inference nodes --limit 200 --json",1e4).catch(()=>({output:""})),s.execute("inference tasks --limit 200 --json",1e4).catch(()=>({output:""})),s.execute("inference stats --json",8e3).catch(()=>({output:""}))]);L.value=et(o.output),ee.value=at(e.output),b.value=nt(f.output)}catch(o){y.error("加载推理网络数据失败: "+(o?.message||o))}finally{u.value=!1}}async function $e(){const o=g.nodeId.trim();if(!o){y.warning("请填写节点 ID");return}E.value=!0;try{const e=[`inference register "${o.replace(/"/g,'\\"')}"`];if(g.endpoint.trim()&&e.push(`--endpoint "${g.endpoint.trim().replace(/"/g,'\\"')}"`),g.capabilities.trim()){const T=g.capabilities.split(/[,\s]+/).filter(Boolean).join(",");T&&e.push(`--capabilities "${T}"`)}g.gpuMemory!=null&&e.push(`--gpu ${g.gpuMemory}`),e.push("--json");const{output:f}=await s.execute(e.join(" "),1e4);if(/error|failed|失败/i.test(f)&&!/"nodeId"/.test(f)){y.error("注册失败: "+f.slice(0,120));return}y.success("节点已注册"),B.value=!1,oe(),await N()}catch(e){y.error("注册失败: "+(e?.message||e))}finally{E.value=!1}}async function we(){const o=_.model.trim();if(!o){y.warning("请填写模型名");return}G.value=!0;try{const e=[`inference submit "${o.replace(/"/g,'\\"')}"`];_.input.trim()&&e.push(`--input "${_.input.trim().replace(/"/g,'\\"')}"`),_.priority!=null&&e.push(`--priority ${_.priority}`),e.push(`--mode ${_.mode}`),e.push("--json");const{output:f}=await s.execute(e.join(" "),12e3);if(/error|failed|失败/i.test(f)&&!/"taskId"/.test(f)){y.error("提交失败: "+f.slice(0,120));return}y.success("任务已提交"),R.value=!1,ne(),W.value="tasks",await N()}catch(e){y.error("提交失败: "+(e?.message||e))}finally{G.value=!1}}async function Ue(o){V.value=o.id;try{const{output:e}=await s.execute(`inference heartbeat ${o.id} --json`,8e3);if(/error/i.test(e)&&!/"updated"/.test(e)){y.error("心跳失败: "+e.slice(0,120));return}y.success("心跳已更新"),await N()}catch(e){y.error("心跳失败: "+(e?.message||e))}finally{V.value=""}}async function Oe(o,e){if(e!==o.status)try{const{output:f}=await s.execute(`inference node-status ${o.id} ${e} --json`,8e3);if(/error|invalid/i.test(f)&&!/"updated"/.test(f)){y.error("状态转换失败: "+f.slice(0,120));return}y.success(`节点状态已更新为 ${H(e)}`),await N()}catch(f){y.error("状态转换失败: "+(f?.message||f))}}async function De(o){try{const{output:e}=await s.execute(`inference unregister ${o.id} --json`,8e3);if(/error/i.test(e)&&!/"removed"/.test(e)){y.error("注销失败: "+e.slice(0,120));return}y.success("节点已注销"),await N()}catch(e){y.error("注销失败: "+(e?.message||e))}}async function qe(o){K.value=o.id;try{const{output:e}=await s.execute(`inference complete ${o.id} --json`,1e4);if(/error|failed/i.test(e)&&!/"completed"/.test(e)){y.error("完成失败: "+e.slice(0,120));return}y.success("任务已完成"),await N()}catch(e){y.error("完成失败: "+(e?.message||e))}finally{K.value=""}}async function Fe(o){try{const{output:e}=await s.execute(`inference fail-task ${o.id} --json`,8e3);if(/error/i.test(e)&&!/"failed"/.test(e)){y.error("标记失败: "+e.slice(0,120));return}y.success("已标记为失败"),await N()}catch(e){y.error("标记失败: "+(e?.message||e))}}function oe(){g.nodeId="",g.endpoint="",g.capabilities="",g.gpuMemory=null}function ne(){_.model="",_.input="",_.priority=5,_.mode="standard"}return We(N),(o,e)=>{const f=v("a-button"),T=v("a-menu-item"),le=v("a-menu"),se=v("a-dropdown"),ie=v("a-space"),q=v("a-statistic"),$=v("a-card"),F=v("a-col"),Le=v("a-row"),A=v("a-tag"),j=v("a-radio-button"),J=v("a-radio-group"),re=v("a-popconfirm"),ue=v("a-table"),de=v("a-tab-pane"),Be=v("a-tabs"),P=v("a-input"),I=v("a-form-item"),pe=v("a-input-number"),ce=v("a-form"),fe=v("a-modal"),Re=v("a-textarea");return i(),c("div",null,[M("div",lt,[e[18]||(e[18]=M("div",null,[M("h2",{class:"page-title"},"推理网络"),M("p",{class:"page-sub"},"去中心化推理节点 · 任务调度 · 隐私模式")],-1)),a(ie,null,{default:t(()=>[a(f,{loading:u.value,onClick:N},{icon:t(()=>[a(k(Ee))]),default:t(()=>[e[14]||(e[14]=d(" 刷新 ",-1))]),_:1},8,["loading"]),a(se,{trigger:["click"]},{overlay:t(()=>[a(le,{onClick:Te},{default:t(()=>[a(T,{key:"register"},{default:t(()=>[a(k(Q)),e[16]||(e[16]=d(" 注册节点",-1))]),_:1}),a(T,{key:"submit"},{default:t(()=>[a(k(X)),e[17]||(e[17]=d(" 提交推理任务",-1))]),_:1})]),_:1})]),default:t(()=>[a(f,{type:"primary"},{icon:t(()=>[a(k(Ge))]),default:t(()=>[e[15]||(e[15]=d(" 操作 ▼ ",-1))]),_:1})]),_:1})]),_:1})]),a(Le,{gutter:[16,16],style:{"margin-bottom":"20px"}},{default:t(()=>[a(F,{xs:12,sm:8,lg:5},{default:t(()=>[a($,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:t(()=>[a(q,{title:"节点总数",value:b.value.nodes.total,"value-style":{color:"#1677ff",fontSize:"20px"}},{prefix:t(()=>[a(k(Q))]),_:1},8,["value"])]),_:1})]),_:1}),a(F,{xs:12,sm:8,lg:5},{default:t(()=>[a($,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:t(()=>[a(q,{title:"在线节点",value:b.value.nodes.online,"value-style":{color:b.value.nodes.online>0?"#52c41a":"#888",fontSize:"20px"}},{prefix:t(()=>[a(k(Ve))]),_:1},8,["value","value-style"])]),_:1})]),_:1}),a(F,{xs:12,sm:8,lg:5},{default:t(()=>[a($,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:t(()=>[a(q,{title:"任务总数",value:b.value.tasks.total,"value-style":{color:"#722ed1",fontSize:"20px"}},{prefix:t(()=>[a(k(X))]),_:1},8,["value"])]),_:1})]),_:1}),a(F,{xs:12,sm:8,lg:5},{default:t(()=>[a($,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:t(()=>[a(q,{title:"排队中",value:b.value.tasks.queued,"value-style":{color:b.value.tasks.queued>0?"#faad14":"#52c41a",fontSize:"20px"}},{prefix:t(()=>[a(k(Ke))]),_:1},8,["value","value-style"])]),_:1})]),_:1}),a(F,{xs:24,sm:8,lg:4},{default:t(()=>[a($,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:t(()=>[a(q,{title:"平均耗时",value:b.value.tasks.avgDurationMs,suffix:"ms","value-style":{color:"#13c2c2",fontSize:"20px"}},null,8,["value"])]),_:1})]),_:1})]),_:1}),b.value.nodes.total>0?(i(),x($,{key:0,title:"节点状态分布",size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"20px"},"body-style":{padding:"12px 16px"}},{default:t(()=>[a(ie,{size:[12,8],wrap:""},{default:t(()=>[a(A,{color:"green"},{default:t(()=>[d("在线 "+p(b.value.nodes.online),1)]),_:1}),a(A,{color:"orange"},{default:t(()=>[d("忙碌 "+p(b.value.nodes.busy),1)]),_:1}),a(A,{color:"default"},{default:t(()=>[d("离线 "+p(b.value.nodes.offline),1)]),_:1}),M("span",st," 完成: "+p(b.value.tasks.completed)+" · 失败: "+p(b.value.tasks.failed),1)]),_:1})]),_:1})):m("",!0),a(Be,{activeKey:W.value,"onUpdate:activeKey":e[3]||(e[3]=n=>W.value=n),class:"inference-tabs"},{default:t(()=>[a(de,{key:"nodes",tab:"节点"},{default:t(()=>[M("div",it,[a(J,{value:U.value,"onUpdate:value":e[0]||(e[0]=n=>U.value=n),size:"small","button-style":"solid"},{default:t(()=>[a(j,{value:""},{default:t(()=>[...e[19]||(e[19]=[d("全部",-1)])]),_:1}),(i(!0),c(C,null,w(k(ve),n=>(i(),x(j,{key:n,value:n},{default:t(()=>[d(p(H(n)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),a(ue,{columns:ke,"data-source":xe.value,pagination:{pageSize:20,showTotal:n=>`共 ${n} 条`},size:"small",loading:u.value,style:{background:"var(--bg-card)"}},{bodyCell:t(({column:n,record:r})=>[n.key==="nodeId"?(i(),c(C,{key:0},[M("span",rt,p(r.nodeId),1),r.endpoint?(i(),c("div",ut,p(ae(r.endpoint,50)),1)):m("",!0)],64)):m("",!0),n.key==="capabilities"?(i(),c(C,{key:1},[(i(!0),c(C,null,w(r.capabilities.slice(0,4),h=>(i(),x(A,{key:h,color:"blue",style:{"font-size":"10px",margin:"1px"}},{default:t(()=>[d(p(h),1)]),_:2},1024))),128)),r.capabilities.length>4?(i(),x(A,{key:0,color:"default",style:{"font-size":"10px"}},{default:t(()=>[d("+"+p(r.capabilities.length-4),1)]),_:2},1024)):m("",!0),r.capabilities.length?m("",!0):(i(),c("span",dt,"—"))],64)):m("",!0),n.key==="gpu"?(i(),c(C,{key:2},[r.gpuMemoryMb>0?(i(),c("span",pt,p(Ae(r.gpuMemoryMb)),1)):(i(),c("span",ct,"—"))],64)):m("",!0),n.key==="status"?(i(),x(A,{key:3,color:Ce(r.status)},{default:t(()=>[d(p(H(r.status)),1)]),_:2},1032,["color"])):m("",!0),n.key==="taskCount"?(i(),x(A,{key:4,color:"purple",style:{"font-size":"11px"}},{default:t(()=>[d(p(r.taskCount),1)]),_:2},1024)):m("",!0),n.key==="lastHeartbeat"?(i(),c("span",ft,p(k(_e)(r.lastHeartbeat)),1)):m("",!0),n.key==="action"?(i(),c(C,{key:6},[a(f,{size:"small",type:"link",loading:V.value===r.id,onClick:h=>Ue(r)},{default:t(()=>[...e[20]||(e[20]=[d("心跳",-1)])]),_:1},8,["loading","onClick"]),a(se,{trigger:["click"]},{overlay:t(()=>[a(le,{onClick:h=>Oe(r,h.key)},{default:t(()=>[(i(!0),c(C,null,w(k(ve),h=>(i(),x(T,{key:h,disabled:h===r.status},{default:t(()=>[d(p(H(h)),1)]),_:2},1032,["disabled"]))),128))]),_:2},1032,["onClick"])]),default:t(()=>[a(f,{size:"small",type:"link"},{default:t(()=>[...e[21]||(e[21]=[d("状态 ▼",-1)])]),_:1})]),_:2},1024),a(re,{title:"注销该节点?","ok-text":"注销","cancel-text":"取消",onConfirm:h=>De(r)},{default:t(()=>[a(f,{size:"small",type:"link",danger:""},{default:t(()=>[...e[22]||(e[22]=[d("注销",-1)])]),_:1})]),_:1},8,["onConfirm"])],64)):m("",!0)]),emptyText:t(()=>[M("div",yt,[a(k(Q),{style:{"font-size":"36px","margin-bottom":"10px",display:"block"}}),d(" "+p(U.value?"没有符合条件的节点":'暂无节点,点"操作 → 注册节点"添加第一个'),1)])]),_:1},8,["data-source","pagination","loading"])]),_:1}),a(de,{key:"tasks",tab:"任务"},{default:t(()=>[M("div",mt,[a(J,{value:O.value,"onUpdate:value":e[1]||(e[1]=n=>O.value=n),size:"small"},{default:t(()=>[a(j,{value:""},{default:t(()=>[...e[23]||(e[23]=[d("全部状态",-1)])]),_:1}),(i(!0),c(C,null,w(k(Qe),n=>(i(),x(j,{key:n,value:n},{default:t(()=>[d(p(te(n)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"]),a(J,{value:D.value,"onUpdate:value":e[2]||(e[2]=n=>D.value=n),size:"small"},{default:t(()=>[a(j,{value:""},{default:t(()=>[...e[24]||(e[24]=[d("全部模式",-1)])]),_:1}),(i(!0),c(C,null,w(k(ge),n=>(i(),x(j,{key:n,value:n},{default:t(()=>[d(p(Y(n)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),a(ue,{columns:be,"data-source":Se.value,pagination:{pageSize:20,showTotal:n=>`共 ${n} 条`},size:"small",loading:u.value,style:{background:"var(--bg-card)"}},{bodyCell:t(({column:n,record:r})=>[n.key==="model"?(i(),c(C,{key:0},[M("span",vt,p(r.model),1),r.input?(i(),c("div",gt,p(ae(r.input,60)),1)):m("",!0)],64)):m("",!0),n.key==="privacyMode"?(i(),x(A,{key:1,color:ze(r.privacyMode)},{default:t(()=>[d(p(Y(r.privacyMode)),1)]),_:2},1032,["color"])):m("",!0),n.key==="priority"?(i(),c("span",{key:2,style:Ye({color:Me(r.priority),fontWeight:500})},p(r.priority),5)):m("",!0),n.key==="assignedNode"?(i(),c(C,{key:3},[r.assignedNode?(i(),c("span",_t,p(Ne(r.assignedNode)),1)):(i(),c("span",kt,"—"))],64)):m("",!0),n.key==="status"?(i(),x(A,{key:4,color:he(r.status)},{default:t(()=>[d(p(te(r.status)),1)]),_:2},1032,["color"])):m("",!0),n.key==="duration"?(i(),c(C,{key:5},[r.durationMs!=null?(i(),c("span",bt,p(r.durationMs)+" ms ",1)):(i(),c("span",xt,"—"))],64)):m("",!0),n.key==="createdAt"?(i(),c("span",St,p(k(_e)(r.createdAt)),1)):m("",!0),n.key==="action"?(i(),c(C,{key:7},[Ie(r)?(i(),x(f,{key:0,size:"small",type:"link",loading:K.value===r.id,onClick:h=>qe(r)},{default:t(()=>[...e[25]||(e[25]=[d(" 完成 ",-1)])]),_:1},8,["loading","onClick"])):m("",!0),je(r)?(i(),x(re,{key:1,title:"标记任务失败?","ok-text":"确认","cancel-text":"取消",onConfirm:h=>Fe(r)},{default:t(()=>[a(f,{size:"small",type:"link",danger:""},{default:t(()=>[...e[26]||(e[26]=[d("失败",-1)])]),_:1})]),_:1},8,["onConfirm"])):m("",!0)],64)):m("",!0)]),emptyText:t(()=>[M("div",Ct,[a(k(X),{style:{"font-size":"36px","margin-bottom":"10px",display:"block"}}),d(" "+p(O.value||D.value?"没有符合条件的任务":'暂无任务,点"操作 → 提交推理任务"创建第一个'),1)])]),_:1},8,["data-source","pagination","loading"])]),_:1})]),_:1},8,["activeKey"]),a(fe,{open:B.value,"onUpdate:open":e[8]||(e[8]=n=>B.value=n),title:"注册推理节点","confirm-loading":E.value,width:520,"ok-text":"注册","cancel-text":"取消",onOk:$e,onCancel:oe},{default:t(()=>[a(ce,{"label-col":{span:6},"wrapper-col":{span:18},style:{"margin-top":"16px"}},{default:t(()=>[a(I,{label:"节点 ID",required:""},{default:t(()=>[a(P,{value:g.nodeId,"onUpdate:value":e[4]||(e[4]=n=>g.nodeId=n),placeholder:"例如: gpu-host-1"},null,8,["value"])]),_:1}),a(I,{label:"端点 URL"},{default:t(()=>[a(P,{value:g.endpoint,"onUpdate:value":e[5]||(e[5]=n=>g.endpoint=n),placeholder:"https://node.example.com(可选)"},null,8,["value"])]),_:1}),a(I,{label:"能力列表"},{default:t(()=>[a(P,{value:g.capabilities,"onUpdate:value":e[6]||(e[6]=n=>g.capabilities=n),placeholder:"逗号分隔,例如: llama2,mistral,gpt-4"},null,8,["value"])]),_:1}),a(I,{label:"GPU 内存 (MB)"},{default:t(()=>[a(pe,{value:g.gpuMemory,"onUpdate:value":e[7]||(e[7]=n=>g.gpuMemory=n),min:0,max:2e5,style:{width:"100%"}},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"]),a(fe,{open:R.value,"onUpdate:open":e[13]||(e[13]=n=>R.value=n),title:"提交推理任务","confirm-loading":G.value,width:520,"ok-text":"提交","cancel-text":"取消",onOk:we,onCancel:ne},{default:t(()=>[a(ce,{"label-col":{span:6},"wrapper-col":{span:18},style:{"margin-top":"16px"}},{default:t(()=>[a(I,{label:"模型",required:""},{default:t(()=>[a(P,{value:_.model,"onUpdate:value":e[9]||(e[9]=n=>_.model=n),placeholder:"例如: llama2-7b"},null,8,["value"])]),_:1}),a(I,{label:"输入"},{default:t(()=>[a(Re,{value:_.input,"onUpdate:value":e[10]||(e[10]=n=>_.input=n),"auto-size":{minRows:3,maxRows:6}},null,8,["value"])]),_:1}),a(I,{label:"优先级"},{default:t(()=>[a(pe,{value:_.priority,"onUpdate:value":e[11]||(e[11]=n=>_.priority=n),min:1,max:10,style:{width:"100%"}},null,8,["value"])]),_:1}),a(I,{label:"隐私模式"},{default:t(()=>[a(J,{value:_.mode,"onUpdate:value":e[12]||(e[12]=n=>_.mode=n)},{default:t(()=>[(i(!0),c(C,null,w(k(ge),n=>(i(),x(j,{key:n,value:n},{default:t(()=>[d(p(Y(n)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"])])}}},qt=Pe(ht,[["__scopeId","data-v-cd24d62b"]]);export{qt as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
.page-title[data-v-cd24d62b]{margin:0;color:var(--text-primary);font-size:22px;font-weight:600}.page-sub[data-v-cd24d62b]{margin:4px 0 0;color:var(--text-secondary);font-size:13px}.inference-tabs[data-v-cd24d62b] .ant-tabs-nav{margin-bottom:16px}.filter-bar[data-v-cd24d62b]{display:flex;align-items:center;gap:12px;margin-bottom:12px;flex-wrap:wrap}
|