chainlesschain 0.157.9 → 0.158.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. package/bin/chainlesschain.js +0 -0
  2. package/package.json +1 -1
  3. package/src/assets/web-panel/.build-hash +1 -1
  4. package/src/assets/web-panel/assets/{AIOps-C4XQxptM.js → AIOps-9QEKGr43.js} +1 -1
  5. package/src/assets/web-panel/assets/{ActionButton-CvKbykKA.js → ActionButton-BQElVBgD.js} +1 -1
  6. package/src/assets/web-panel/assets/{Analytics-DFMAWKUR.js → Analytics-DbZbFR_a.js} +1 -1
  7. package/src/assets/web-panel/assets/{AppLayout-BkNdtTbn.js → AppLayout-BbfBwVfE.js} +1 -1
  8. package/src/assets/web-panel/assets/{Audit-Bw7KSJD_.js → Audit-DzddAZVx.js} +1 -1
  9. package/src/assets/web-panel/assets/{BaseInput-CvAa9Hm_.js → BaseInput-60t9IMEz.js} +1 -1
  10. package/src/assets/web-panel/assets/{Checkbox-YsCNWg9S.js → Checkbox-Ba1Rf2Ea.js} +1 -1
  11. package/src/assets/web-panel/assets/{Codegen-DDiVk21N.js → Codegen-WiYmL3oB.js} +1 -1
  12. package/src/assets/web-panel/assets/{Col-Dpb7Eik4.js → Col-D2zhpSqE.js} +1 -1
  13. package/src/assets/web-panel/assets/{Community-Bglv8oIv.js → Community-DgqmUGwT.js} +1 -1
  14. package/src/assets/web-panel/assets/{Compact-DC8UsEAe.js → Compact-D_dbJDbi.js} +1 -1
  15. package/src/assets/web-panel/assets/{Compliance-DzVghx7L.js → Compliance-BVcVb-e2.js} +1 -1
  16. package/src/assets/web-panel/assets/{Cron-I81HiCa1.js → Cron-Cs5QaKTP.js} +1 -1
  17. package/src/assets/web-panel/assets/{Crosschain-48CdkgQf.js → Crosschain-pjWfIM8s.js} +1 -1
  18. package/src/assets/web-panel/assets/{DID-CVYxjLQn.js → DID-DQtsjz3X.js} +1 -1
  19. package/src/assets/web-panel/assets/{Dropdown-DBfZJHBI.js → Dropdown-BM_ljd87.js} +1 -1
  20. package/src/assets/web-panel/assets/{Federation-BT-pF1wN.js → Federation-CId-3zn6.js} +1 -1
  21. package/src/assets/web-panel/assets/{FormItemContext-B-sn9E_W.js → FormItemContext-CnzbixSE.js} +1 -1
  22. package/src/assets/web-panel/assets/{Git-DTh2i-Qk.js → Git-B38QeOPF.js} +1 -1
  23. package/src/assets/web-panel/assets/{Governance-D788Lws6.js → Governance-DrGkAjd1.js} +1 -1
  24. package/src/assets/web-panel/assets/{Inference-CnFa6Se9.js → Inference-BjkHB4sD.js} +1 -1
  25. package/src/assets/web-panel/assets/{KnowledgeGraph-DHaMxawn.js → KnowledgeGraph-Trs1XJFK.js} +1 -1
  26. package/src/assets/web-panel/assets/{Marketplace-BdOCF2RA.js → Marketplace-BnpOoITi.js} +1 -1
  27. package/src/assets/web-panel/assets/{Memory-Vl_lYCs2.js → Memory-BHXHpldt.js} +1 -1
  28. package/src/assets/web-panel/assets/NLProgramming-B3BALajs.js +1 -0
  29. package/src/assets/web-panel/assets/{Notes-BvC5_V2H.js → Notes-u6lLTv0t.js} +1 -1
  30. package/src/assets/web-panel/assets/{Organization-Cxhhw4aD.js → Organization-CQ1X722j.js} +1 -1
  31. package/src/assets/web-panel/assets/{Overflow-L_28D41_.js → Overflow-DHKu8e8g.js} +1 -1
  32. package/src/assets/web-panel/assets/{Permissions-ByLhEAbz.js → Permissions-B2XrAUBW.js} +1 -1
  33. package/src/assets/web-panel/assets/{Pipeline-CnZJNdgt.js → Pipeline-C0K9-DnR.js} +1 -1
  34. package/src/assets/web-panel/assets/{Privacy-BJIajCGG.js → Privacy-BKPoZngH.js} +1 -1
  35. package/src/assets/web-panel/assets/{ProjectSettings-N0r_mtec.js → ProjectSettings-C34C7hFt.js} +1 -1
  36. package/src/assets/web-panel/assets/{Providers-B2A35VhD.js → Providers-BFiMVWaM.js} +1 -1
  37. package/src/assets/web-panel/assets/{Recommend-DYb61WNp.js → Recommend-BmUhysGC.js} +1 -1
  38. package/src/assets/web-panel/assets/{Reputation-C9BfnI0z.js → Reputation-BlfSvJww.js} +1 -1
  39. package/src/assets/web-panel/assets/{Row-CpPHVi7H.js → Row-Dl74576S.js} +1 -1
  40. package/src/assets/web-panel/assets/{RssFeed-CbqJDErh.js → RssFeed-9_MkDUxZ.js} +1 -1
  41. package/src/assets/web-panel/assets/{Search-C0gd765-.js → Search-CSRY_TYa.js} +1 -1
  42. package/src/assets/web-panel/assets/{Security-DsYWAhpE.js → Security-DfDoKfkl.js} +1 -1
  43. package/src/assets/web-panel/assets/{Skeleton-TzxE-JJt.js → Skeleton-6CF_3QUY.js} +1 -1
  44. package/src/assets/web-panel/assets/Skills-DowQcRe1.js +1 -0
  45. package/src/assets/web-panel/assets/{Sla-mftEtvGn.js → Sla-B93c8j92.js} +1 -1
  46. package/src/assets/web-panel/assets/{Templates-DgonVRQJ.js → Templates-DJ_hvs5c.js} +1 -1
  47. package/src/assets/web-panel/assets/{Tenant-BB-LLJMZ.js → Tenant-BXS8s6vl.js} +1 -1
  48. package/src/assets/web-panel/assets/{Tokens-DHOkHNur.js → Tokens-CvmTVU7E.js} +1 -1
  49. package/src/assets/web-panel/assets/{Trigger-BV4JPD3z.js → Trigger-BenSsaoN.js} +1 -1
  50. package/src/assets/web-panel/assets/{Trust-BpC4gDis.js → Trust-HMz40LfZ.js} +1 -1
  51. package/src/assets/web-panel/assets/{VideoEditing-CeDFfKrq.js → VideoEditing-DEhH42sI.js} +1 -1
  52. package/src/assets/web-panel/assets/{Wallet-CcNCVaor.js → Wallet-AGwfOdTM.js} +1 -1
  53. package/src/assets/web-panel/assets/{WebAuthn-BbIPA6Ca.js → WebAuthn-DK5tKWul.js} +1 -1
  54. package/src/assets/web-panel/assets/{WorkflowEditor-DxkitXpf.js → WorkflowEditor-vlujdL6I.js} +1 -1
  55. package/src/assets/web-panel/assets/{colors-2MPUdPu2.js → colors-BiB5aDao.js} +1 -1
  56. package/src/assets/web-panel/assets/{compact-item-B4vcKR0x.js → compact-item-CHderV9n.js} +1 -1
  57. package/src/assets/web-panel/assets/{createContext-Div8Cl0F.js → createContext-DMZ-5dy2.js} +1 -1
  58. package/src/assets/web-panel/assets/{hasIn-9c9xldOR.js → hasIn-BKDBYP3s.js} +1 -1
  59. package/src/assets/web-panel/assets/{index-BuVNDnn8.js → index-7fxCGMoL.js} +1 -1
  60. package/src/assets/web-panel/assets/{index-ZW72ov7W.js → index-7pqZqPD2.js} +1 -1
  61. package/src/assets/web-panel/assets/{index-CIE6ht2b.js → index-A4RpHMOa.js} +1 -1
  62. package/src/assets/web-panel/assets/{index-dV8k_pMc.js → index-AIdelwOe.js} +1 -1
  63. package/src/assets/web-panel/assets/index-B5oebI6W.js +1 -0
  64. package/src/assets/web-panel/assets/{index-COJ-mQYg.js → index-B7fivpG2.js} +1 -1
  65. package/src/assets/web-panel/assets/{index-BntG0RJO.js → index-BBWUR4u4.js} +1 -1
  66. package/src/assets/web-panel/assets/{index-BCfVA9mJ.js → index-BBk2e7vJ.js} +1 -1
  67. package/src/assets/web-panel/assets/{index-BfoYep3e.js → index-BRRFK-im.js} +1 -1
  68. package/src/assets/web-panel/assets/{index-CVYrm1az.js → index-BVOI707f.js} +1 -1
  69. package/src/assets/web-panel/assets/{index-C1GXp5YD.js → index-BadelvSE.js} +1 -1
  70. package/src/assets/web-panel/assets/{index-BbqCdQXU.js → index-BfKFNptm.js} +1 -1
  71. package/src/assets/web-panel/assets/{index-OhUZFfxQ.js → index-BgDX-tzO.js} +1 -1
  72. package/src/assets/web-panel/assets/{index-B58J4NxK.js → index-BjSojphX.js} +1 -1
  73. package/src/assets/web-panel/assets/{index-DJAPu9VF.js → index-BlXskar6.js} +1 -1
  74. package/src/assets/web-panel/assets/{index-B65KFSc3.js → index-BryAkWUJ.js} +1 -1
  75. package/src/assets/web-panel/assets/{index-D0GALIQZ.js → index-C1p_dZw0.js} +1 -1
  76. package/src/assets/web-panel/assets/{index-CtM3tjRj.js → index-CBYNsy51.js} +1 -1
  77. package/src/assets/web-panel/assets/{index-IzAqu_OK.js → index-CEpcKl17.js} +1 -1
  78. package/src/assets/web-panel/assets/{index--tOLU2ID.js → index-CUT3Nmzx.js} +1 -1
  79. package/src/assets/web-panel/assets/{index-Ca3iTiXs.js → index-CbpCY2ch.js} +1 -1
  80. package/src/assets/web-panel/assets/{index-DgWftysw.js → index-D3PGpBPm.js} +1 -1
  81. package/src/assets/web-panel/assets/{index-C-CTCrAH.js → index-D3lD9wgX.js} +1 -1
  82. package/src/assets/web-panel/assets/index-D5Beu9ZA.js +1 -0
  83. package/src/assets/web-panel/assets/{index-CIWKlZ1X.js → index-DRRzH4Ge.js} +1 -1
  84. package/src/assets/web-panel/assets/{index-BcnQrVVZ.js → index-DRcTAUJA.js} +1 -1
  85. package/src/assets/web-panel/assets/{index-COdKVelL.js → index-DZ8MjPLC.js} +1 -1
  86. package/src/assets/web-panel/assets/{index-ZZ_4A9um.js → index-DfcXDy2A.js} +3 -3
  87. package/src/assets/web-panel/assets/{index-B4hcllQg.js → index-DtDFSCfE.js} +1 -1
  88. package/src/assets/web-panel/assets/{index-D1JeOKve.js → index-DvI8Xtzv.js} +1 -1
  89. package/src/assets/web-panel/assets/{index-D-0g6tCK.js → index-DvfAkHw8.js} +1 -1
  90. package/src/assets/web-panel/assets/{index-D--EKCHy.js → index-DyXslU_B.js} +1 -1
  91. package/src/assets/web-panel/assets/{index-Dk3ZySO2.js → index-MoLxDrkb.js} +1 -1
  92. package/src/assets/web-panel/assets/{index-DogHNcyC.js → index-Ncxqj2UN.js} +1 -1
  93. package/src/assets/web-panel/assets/{index-DdHPswKn.js → index-YgC7QI1N.js} +1 -1
  94. package/src/assets/web-panel/assets/{index-3KbT-bG7.js → index-_sntSncx.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-BjGOthNv.js → index-uujjC_4g.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-DIe3dY84.js → index-yMt4C1Gh.js} +1 -1
  97. package/src/assets/web-panel/assets/{initDefaultProps--L8bzddm.js → initDefaultProps-B2vQoQga.js} +1 -1
  98. package/src/assets/web-panel/assets/{motion-BR7NF0vx.js → motion-D2eluOJu.js} +1 -1
  99. package/src/assets/web-panel/assets/{move-BpyQMRtF.js → move-CgcvSoZ7.js} +1 -1
  100. package/src/assets/web-panel/assets/{omit-RkKN6uqw.js → omit-DvLh7wH1.js} +1 -1
  101. package/src/assets/web-panel/assets/{pickAttrs-Bk8_mKGY.js → pickAttrs-BsseBclw.js} +1 -1
  102. package/src/assets/web-panel/assets/{placementArrow-CBAaXBxj.js → placementArrow-XLLtr9qD.js} +1 -1
  103. package/src/assets/web-panel/assets/{responsiveObserve-BzrPInK7.js → responsiveObserve-ByCb5zZK.js} +1 -1
  104. package/src/assets/web-panel/assets/{slide-CXFBsLyp.js → slide-CeP5JCiZ.js} +1 -1
  105. package/src/assets/web-panel/assets/{statusUtils-6TeOuUzQ.js → statusUtils-DMVoo96t.js} +1 -1
  106. package/src/assets/web-panel/assets/{styleChecker-CQt4HHRm.js → styleChecker-Cz5mJgc8.js} +1 -1
  107. package/src/assets/web-panel/assets/{transition-CGYDOK3N.js → transition-DSe9CgZe.js} +1 -1
  108. package/src/assets/web-panel/assets/{useConfigInject-BKqJUQaF.js → useConfigInject-DCcT0grw.js} +1 -1
  109. package/src/assets/web-panel/assets/{useFlexGapSupport--RuYYIc6.js → useFlexGapSupport-BZkoDuF3.js} +1 -1
  110. package/src/assets/web-panel/assets/{vnode-I9keNa_U.js → vnode-Dexy2NN9.js} +1 -1
  111. package/src/assets/web-panel/assets/{zoom-BNV3xYvt.js → zoom-CDfM_sRk.js} +1 -1
  112. package/src/assets/web-panel/index.html +1 -1
  113. package/src/commands/nlprog.js +25 -15
  114. package/src/gateways/ws/ws-server.js +12 -1
  115. package/src/lib/web-ui-server.js +33 -0
  116. package/src/assets/web-panel/assets/NLProgramming-CgD2H0Pc.js +0 -1
  117. package/src/assets/web-panel/assets/Skills-DfaRaffm.js +0 -1
  118. package/src/assets/web-panel/assets/index-BzBaZFuT.js +0 -1
  119. package/src/assets/web-panel/assets/index-CDoxJ9Cl.js +0 -1
@@ -1 +1 @@
1
- import{u as Xe}from"./ws-Bv7YH0VB.js";import{s as Ze}from"./community-parser-CO25nZFt.js";import{_ as et}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{a as f}from"./index-BbqCdQXU.js";import{Y as tt,ac as at,E as ue,l as pe,L as Re,o as lt,aL as ot}from"./icons-ukMaZ3tx.js";import{l as nt,F as c,D as y,c as a,x as l,q as v,r as b,v as s,J as m,u as x,I as p,H as R,L,m as C,G as h,N as it,j as X,a as Z}from"./vendor-BVetwVfk.js";import"./index-ZZ_4A9um.js";import"./useConfigInject-BKqJUQaF.js";import"./transition-CGYDOK3N.js";import"./Keyframes-C7fCrnlS.js";import"./Portal-CHsntPCQ.js";import"./index-U4Zd5IK6.js";function H(o){const i=Ze(o);if(!i)return null;try{return JSON.parse(i)}catch{}const r=i.match(/\{[\s\S]*\}|\[[\s\S]*\]/);if(!r)return null;try{return JSON.parse(r[0])}catch{return null}}const st=Object.freeze(["initializing","training","aggregating","completed","failed"]),rt=Object.freeze(["pending","computing","completed"]),Ae=Object.freeze(["shamir","beaver","gmw"]),ut=Object.freeze(["laplace","gaussian","exponential"]),pt=Object.freeze(["paillier","bfv","ckks"]),dt=Object.freeze(["sum","product","mean","count"]);function g(o,i=0){return typeof o=="number"&&Number.isFinite(o)?o:i}function ct(o,i=0){if(!o||typeof o!="object")return null;const r=o.id||"";return r?{key:r,id:r,name:String(o.name||r),description:String(o.description||""),_idx:i}:null}function de(o){const i=H(o);return Array.isArray(i)?i.map(ct).filter(Boolean):[]}function mt(o,i=0){if(!o||typeof o!="object")return null;const r=o.id||"";return r?{key:r,id:r,name:String(o.name||""),modelType:o.modelType??o.model_type??"neural_network",architecture:String(o.architecture||""),status:String(o.status||"initializing").toLowerCase(),currentRound:g(o.currentRound??o.current_round,0),totalRounds:g(o.totalRounds??o.total_rounds,0),participantCount:g(o.participantCount??o.participant_count,0),accuracy:g(o.accuracy,0),loss:o.loss==null?null:g(o.loss,null),learningRate:g(o.learningRate??o.learning_rate,0),aggregationStrategy:o.aggregationStrategy??o.aggregation_strategy??"",privacyBudgetSpent:g(o.privacyBudgetSpent??o.privacy_budget_spent,0),createdAt:o.createdAt??o.created_at??null,updatedAt:o.updatedAt??o.updated_at??null,_idx:i}:null}function ft(o){const i=H(o);return Array.isArray(i)?i.map(mt).filter(Boolean):[]}function yt(o,i=0){if(!o||typeof o!="object")return null;const r=o.id||"";if(!r)return null;let A=o.participantIds??o.participant_ids??[];if(typeof A=="string")try{A=JSON.parse(A)}catch{A=[]}return Array.isArray(A)||(A=[]),{key:r,id:r,computationType:o.computationType??o.computation_type??"",protocol:String(o.protocol||"shamir").toLowerCase(),participantCount:g(o.participantCount??o.participant_count,0),participantIds:A,resultHash:o.resultHash??o.result_hash??null,status:String(o.status||"pending").toLowerCase(),sharesReceived:g(o.sharesReceived??o.shares_received,0),sharesRequired:g(o.sharesRequired??o.shares_required,0),computationTimeMs:o.computationTimeMs??o.computation_time_ms??null,errorMessage:o.errorMessage??o.error_message??"",createdAt:o.createdAt??o.created_at??null,completedAt:o.completedAt??o.completed_at??null,_idx:i}}function vt(o){const i=H(o);return Array.isArray(i)?i.map(yt).filter(Boolean):[]}function gt(o){const i=H(o);return!i||typeof i!="object"||Array.isArray(i)?null:{published:!!i.published,reason:i.reason||null,data:i.data??null,epsilon:g(i.epsilon,0),delta:g(i.delta,0),mechanism:String(i.mechanism||""),budgetSpent:g(i.budgetSpent??i.budget_spent,0),budgetRemaining:g(i.budgetRemaining??i.budget_remaining,0)}}function _t(o){const i=H(o);return!i||typeof i!="object"||Array.isArray(i)?null:{result:i.result??null,operation:String(i.operation||""),scheme:String(i.scheme||""),inputCount:g(i.inputCount??i.input_count,0),encrypted:i.encrypted!==!1}}const bt={privacyBudget:{spent:0,limit:0,remaining:0,exhausted:!1},federatedLearning:{totalModels:0,completed:0,training:0,avgAccuracy:0},mpc:{totalComputations:0,completed:0,pending:0,byProtocol:{}}};function xt(o){const i=JSON.parse(JSON.stringify(bt)),r=H(o);if(!r||typeof r!="object"||Array.isArray(r))return i;if(r.privacyBudget&&typeof r.privacyBudget=="object"&&(i.privacyBudget.spent=g(r.privacyBudget.spent,0),i.privacyBudget.limit=g(r.privacyBudget.limit,0),i.privacyBudget.remaining=g(r.privacyBudget.remaining,0),i.privacyBudget.exhausted=!!r.privacyBudget.exhausted),r.federatedLearning&&typeof r.federatedLearning=="object"&&(i.federatedLearning.totalModels=g(r.federatedLearning.totalModels,0),i.federatedLearning.completed=g(r.federatedLearning.completed,0),i.federatedLearning.training=g(r.federatedLearning.training,0),i.federatedLearning.avgAccuracy=g(r.federatedLearning.avgAccuracy,0)),r.mpc&&typeof r.mpc=="object"&&(i.mpc.totalComputations=g(r.mpc.totalComputations,0),i.mpc.completed=g(r.mpc.completed,0),i.mpc.pending=g(r.mpc.pending,0),r.mpc.byProtocol&&typeof r.mpc.byProtocol=="object"))for(const[A,F]of Object.entries(r.mpc.byProtocol))typeof F=="number"&&Number.isFinite(F)&&(i.mpc.byProtocol[A]=F);return i}function Me(o){if(o==null||o==="")return"—";const i=typeof o=="number"?new Date(o):new Date(String(o));return isNaN(i.getTime())?String(o):i.toLocaleString("zh-CN",{hour12:!1})}const ht={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},kt={style:{"font-size":"11px",color:"var(--text-secondary)"}},St={class:"catalog-name"},Ct={class:"catalog-desc"},zt={class:"catalog-name"},Rt={class:"catalog-desc"},At={class:"catalog-name"},Mt={class:"catalog-desc"},jt={class:"filter-bar"},Ot={style:{color:"var(--text-primary)","font-weight":"500"}},Tt={style:{color:"var(--text-secondary)","font-size":"11px","margin-top":"2px"}},Lt={style:{"font-size":"11px",color:"var(--text-secondary)"}},Pt={key:0,style:{"font-size":"11px",color:"var(--text-secondary)"}},$t={key:5,style:{"font-family":"monospace",color:"var(--text-secondary)"}},Bt={key:6,style:{color:"var(--text-secondary)","font-size":"11px"}},Ut={style:{padding:"40px",color:"var(--text-muted)","text-align":"center"}},wt={class:"filter-bar"},Nt={key:0,style:{color:"var(--text-primary)","font-family":"monospace","font-weight":"500"}},Ft={key:0,style:{"font-family":"monospace",color:"var(--text-secondary)","font-size":"12px"}},Et={key:1,style:{color:"var(--text-muted)"}},qt={key:5,style:{color:"var(--text-secondary)","font-size":"11px"}},Jt={key:1,style:{color:"var(--text-muted)","font-size":"11px","font-family":"monospace"}},Ht={style:{padding:"40px",color:"var(--text-muted)","text-align":"center"}},Dt={style:{"margin-top":"12px","font-size":"12px",color:"var(--text-secondary)"}},It={style:{"margin-top":"12px","font-size":"12px",color:"var(--text-secondary)"}},Vt={__name:"Privacy",setup(o){const i=Xe(),r=b(!1),A=b(!1),F=b(!1),ee=b(!1),te=b(""),ae=b(""),ce=b([]),me=b([]),fe=b([]),le=b([]),ye=b([]),M=b({privacyBudget:{spent:0,limit:0,remaining:0,exhausted:!1},federatedLearning:{totalModels:0,completed:0,training:0,avgAccuracy:0},mpc:{totalComputations:0,completed:0,pending:0,byProtocol:{}}}),oe=b("models"),D=b(""),V=b(""),K=b(""),G=b(!1),W=b(!1),ne=b(!1),ie=b(!1),d=Z({name:"",modelType:"",architecture:"",rounds:10,lr:.01,participants:0}),k=Z({type:"",protocol:"shamir",participants:"",threshold:null}),S=Z({data:"",mechanism:"laplace",epsilon:.1,delta:1e-5,sensitivity:1}),j=Z({data:"",operation:"sum",scheme:"paillier"}),O=b(null),P=b(null),je=[{title:"名称",key:"name"},{title:"状态",key:"status",width:"120px"},{title:"进度",key:"progress",width:"160px"},{title:"准确度",key:"accuracy",width:"110px"},{title:"参与方",key:"participants",width:"90px"},{title:"预算 ε",key:"budget",width:"100px"},{title:"更新时间",key:"updatedAt",width:"160px"},{title:"操作",key:"action",width:"180px"}],Oe=[{title:"类型",key:"type",width:"160px"},{title:"协议",key:"protocol",width:"100px"},{title:"份额进度",key:"progress"},{title:"状态",key:"status",width:"110px"},{title:"耗时",key:"time",width:"110px"},{title:"创建时间",key:"createdAt",width:"160px"},{title:"操作",key:"action",width:"160px"}],Te=X(()=>M.value.federatedLearning.avgAccuracy*100),Le=X(()=>{const n=M.value.privacyBudget.remaining,e=M.value.privacyBudget.limit;if(e===0)return"#888";const _=n/e;return _<.2?"#ff4d4f":_<.5?"#faad14":"#52c41a"}),Pe=X(()=>D.value?le.value.filter(n=>n.status===D.value):le.value),$e=X(()=>{let n=ye.value;return V.value&&(n=n.filter(e=>e.protocol===V.value)),K.value&&(n=n.filter(e=>e.status===K.value)),n});function ve(n){return{initializing:"初始化",training:"训练中",aggregating:"聚合中",completed:"已完成",failed:"失败"}[n]||n}function Be(n){return{initializing:"default",training:"processing",aggregating:"cyan",completed:"green",failed:"red"}[n]||"default"}function ge(n){return{pending:"待处理",computing:"计算中",completed:"已完成"}[n]||n}function Ue(n){return{pending:"default",computing:"processing",completed:"green"}[n]||"default"}function we(n){return n>=.85?"#52c41a":n>=.6?"#faad14":"#ff4d4f"}function Ne(n){return n.status==="initializing"||n.status==="training"||n.status==="aggregating"}function Fe({key:n}){n==="model"?G.value=!0:n==="computation"?W.value=!0:n==="dp"?(O.value=null,ne.value=!0):n==="he"&&(P.value=null,ie.value=!0)}async function B(){r.value=!0;try{const[n,e,_,q,se,re]=await Promise.all([i.execute("privacy protocols --json",8e3).catch(()=>({output:""})),i.execute("privacy dp-mechanisms --json",8e3).catch(()=>({output:""})),i.execute("privacy he-schemes --json",8e3).catch(()=>({output:""})),i.execute("privacy models --limit 100 --json",1e4).catch(()=>({output:""})),i.execute("privacy computations --limit 100 --json",1e4).catch(()=>({output:""})),i.execute("privacy report --json",8e3).catch(()=>({output:""}))]);ce.value=de(n.output),me.value=de(e.output),fe.value=de(_.output),le.value=ft(q.output),ye.value=vt(se.output),M.value=xt(re.output)}catch(n){f.error("加载隐私计算数据失败: "+(n?.message||n))}finally{r.value=!1}}async function Ee(){if(!d.name.trim()){f.warning("请输入模型名称");return}A.value=!0;try{const n=[`privacy create-model "${d.name.trim().replace(/"/g,'\\"')}"`];d.modelType.trim()&&n.push(`--type "${d.modelType.trim().replace(/"/g,'\\"')}"`),d.architecture.trim()&&n.push(`--arch "${d.architecture.trim().replace(/"/g,'\\"')}"`),d.rounds!=null&&n.push(`--rounds ${d.rounds}`),d.lr!=null&&n.push(`--lr ${d.lr}`),d.participants!=null&&n.push(`--participants ${d.participants}`),n.push("--json");const{output:e}=await i.execute(n.join(" "),12e3);if(/error|失败/i.test(e)&&!/"modelId"/.test(e)){f.error("创建失败: "+e.slice(0,120));return}f.success("FL 模型已创建"),G.value=!1,_e(),await B()}catch(n){f.error("创建失败: "+(n?.message||n))}finally{A.value=!1}}async function qe(){if(!k.type.trim()){f.warning("请输入计算类型");return}A.value=!0;try{const n=[`privacy create-computation "${k.type.trim().replace(/"/g,'\\"')}"`];if(n.push(`--protocol ${k.protocol}`),k.participants.trim()){const _=k.participants.split(/[,\s]+/).filter(Boolean).join(",");_&&n.push(`--participants "${_}"`)}k.threshold!=null&&n.push(`--threshold ${k.threshold}`),n.push("--json");const{output:e}=await i.execute(n.join(" "),1e4);if(/error|失败|invalid/i.test(e)&&!/"computationId"/.test(e)){f.error("创建失败: "+e.slice(0,120));return}f.success("MPC 计算已创建"),W.value=!1,be(),oe.value="computations",await B()}catch(n){f.error("创建失败: "+(n?.message||n))}finally{A.value=!1}}async function Je(n){te.value=n.id;try{const{output:e}=await i.execute(`privacy train ${n.id} --json`,12e3);if(/error|失败/i.test(e)&&!/"trained"/.test(e)){f.error("训练失败: "+e.slice(0,120));return}f.success("训练一轮完成"),await B()}catch(e){f.error("训练失败: "+(e?.message||e))}finally{te.value=""}}async function He(n){try{const{output:e}=await i.execute(`privacy fail-model ${n.id} --json`,8e3);if(/error/i.test(e)&&!/"failed"/.test(e)){f.error("标记失败: "+e.slice(0,120));return}f.success("已标记为失败"),await B()}catch(e){f.error("标记失败: "+(e?.message||e))}}async function De(n){ae.value=n.id;try{const{output:e}=await i.execute(`privacy submit-share ${n.id} --json`,1e4);if(/error|失败/i.test(e)&&!/"submitted"/.test(e)){f.error("提交失败: "+e.slice(0,120));return}f.success("份额已提交"),await B()}catch(e){f.error("提交失败: "+(e?.message||e))}finally{ae.value=""}}async function Ie(){if(!S.data.trim()){f.warning("请输入数据");return}F.value=!0,O.value=null;try{const n=["privacy dp-publish"];n.push(`--data ${JSON.stringify(S.data.trim())}`),n.push(`--mechanism ${S.mechanism}`),S.epsilon!=null&&n.push(`--epsilon ${S.epsilon}`),S.delta!=null&&n.push(`--delta ${S.delta}`),S.sensitivity!=null&&n.push(`--sensitivity ${S.sensitivity}`),n.push("--json");const{output:e}=await i.execute(n.join(" "),1e4),_=gt(e);if(!_){f.error("发布失败: "+e.slice(0,120));return}O.value=_,_.published?(f.success("已发布"),await B()):f.warning(`发布拒绝: ${_.reason||"unknown"}`)}catch(n){f.error("发布失败: "+(n?.message||n))}finally{F.value=!1}}async function Ve(){if(!j.data.trim()){f.warning("请输入数据");return}try{JSON.parse(j.data)}catch{f.warning("数据格式错误,请输入合法 JSON 数组");return}ee.value=!0,P.value=null;try{const n=["privacy he-query"];n.push(`--data ${JSON.stringify(j.data.trim())}`),n.push(`--operation ${j.operation}`),n.push(`--scheme ${j.scheme}`),n.push("--json");const{output:e}=await i.execute(n.join(" "),1e4),_=_t(e);if(!_){f.error("查询失败: "+e.slice(0,120));return}P.value=_,f.success(`计算完成 (${_.scheme}/${_.operation})`)}catch(n){f.error("查询失败: "+(n?.message||n))}finally{ee.value=!1}}function _e(){d.name="",d.modelType="",d.architecture="",d.rounds=10,d.lr=.01,d.participants=0}function be(){k.type="",k.protocol="shamir",k.participants="",k.threshold=null}return nt(B),(n,e)=>{const _=v("a-button"),q=v("a-menu-item"),se=v("a-menu"),re=v("a-dropdown"),Ke=v("a-space"),U=v("a-statistic"),T=v("a-card"),w=v("a-col"),xe=v("a-row"),N=v("a-tag"),$=v("a-radio-button"),J=v("a-radio-group"),he=v("a-progress"),Ge=v("a-popconfirm"),ke=v("a-table"),Se=v("a-tab-pane"),We=v("a-tabs"),I=v("a-input"),z=v("a-form-item"),E=v("a-input-number"),Y=v("a-form"),Q=v("a-modal"),Ye=v("a-select-option"),Qe=v("a-select"),Ce=v("a-textarea");return s(),c("div",null,[y("div",ht,[e[32]||(e[32]=y("div",null,[y("h2",{class:"page-title"},"隐私计算"),y("p",{class:"page-sub"},"联邦学习 · 多方计算 · 差分隐私 · 同态加密")],-1)),a(Ke,null,{default:l(()=>[a(_,{loading:r.value,onClick:B},{icon:l(()=>[a(x(tt))]),default:l(()=>[e[26]||(e[26]=m(" 刷新 ",-1))]),_:1},8,["loading"]),a(re,{trigger:["click"]},{overlay:l(()=>[a(se,{onClick:Fe},{default:l(()=>[a(q,{key:"model"},{default:l(()=>[a(x(ue)),e[28]||(e[28]=m(" 创建联邦学习模型",-1))]),_:1}),a(q,{key:"computation"},{default:l(()=>[a(x(pe)),e[29]||(e[29]=m(" 创建 MPC 计算",-1))]),_:1}),a(q,{key:"dp"},{default:l(()=>[a(x(Re)),e[30]||(e[30]=m(" 差分隐私发布",-1))]),_:1}),a(q,{key:"he"},{default:l(()=>[a(x(lt)),e[31]||(e[31]=m(" 同态加密查询",-1))]),_:1})]),_:1})]),default:l(()=>[a(_,{type:"primary"},{icon:l(()=>[a(x(at))]),default:l(()=>[e[27]||(e[27]=m(" 操作 ▼ ",-1))]),_:1})]),_:1})]),_:1})]),a(xe,{gutter:[16,16],style:{"margin-bottom":"20px"}},{default:l(()=>[a(w,{xs:12,sm:8,lg:5},{default:l(()=>[a(T,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:l(()=>[a(U,{title:"FL 模型",value:M.value.federatedLearning.totalModels,"value-style":{color:"#1677ff",fontSize:"20px"}},{prefix:l(()=>[a(x(ue))]),_:1},8,["value"])]),_:1})]),_:1}),a(w,{xs:12,sm:8,lg:5},{default:l(()=>[a(T,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:l(()=>[a(U,{title:"平均准确度",value:Te.value,precision:1,suffix:"%","value-style":{color:M.value.federatedLearning.avgAccuracy>=.8?"#52c41a":"#faad14",fontSize:"20px"}},{prefix:l(()=>[a(x(ot))]),_:1},8,["value","value-style"])]),_:1})]),_:1}),a(w,{xs:12,sm:8,lg:5},{default:l(()=>[a(T,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:l(()=>[a(U,{title:"MPC 计算",value:M.value.mpc.totalComputations,"value-style":{color:"#722ed1",fontSize:"20px"}},{prefix:l(()=>[a(x(pe))]),_:1},8,["value"])]),_:1})]),_:1}),a(w,{xs:12,sm:8,lg:5},{default:l(()=>[a(T,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:l(()=>[a(U,{title:"预算余量 ε",value:M.value.privacyBudget.remaining,precision:2,"value-style":{color:Le.value,fontSize:"20px"}},{prefix:l(()=>[a(x(Re))]),suffix:l(()=>[y("span",kt,"/ "+p(M.value.privacyBudget.limit),1)]),_:1},8,["value","value-style"])]),_:1})]),_:1}),a(w,{xs:24,sm:8,lg:4},{default:l(()=>[a(T,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:l(()=>[a(U,{title:"预算状态",value:M.value.privacyBudget.exhausted?"已耗尽":"充足","value-style":{color:M.value.privacyBudget.exhausted?"#ff4d4f":"#52c41a",fontSize:"20px"}},null,8,["value","value-style"])]),_:1})]),_:1})]),_:1}),a(xe,{gutter:[16,16],style:{"margin-bottom":"20px"}},{default:l(()=>[a(w,{xs:24,md:8},{default:l(()=>[a(T,{title:"MPC 协议",size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)"},"body-style":{padding:"12px 16px"}},{default:l(()=>[(s(!0),c(R,null,L(ce.value,t=>(s(),c("div",{key:t.id,class:"catalog-item"},[a(N,{color:"purple",style:{"font-family":"monospace"}},{default:l(()=>[m(p(t.id),1)]),_:2},1024),y("span",St,p(t.name),1),y("span",Ct,p(t.description),1)]))),128))]),_:1})]),_:1}),a(w,{xs:24,md:8},{default:l(()=>[a(T,{title:"DP 噪声机制",size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)"},"body-style":{padding:"12px 16px"}},{default:l(()=>[(s(!0),c(R,null,L(me.value,t=>(s(),c("div",{key:t.id,class:"catalog-item"},[a(N,{color:"orange",style:{"font-family":"monospace"}},{default:l(()=>[m(p(t.id),1)]),_:2},1024),y("span",zt,p(t.name),1),y("span",Rt,p(t.description),1)]))),128))]),_:1})]),_:1}),a(w,{xs:24,md:8},{default:l(()=>[a(T,{title:"HE 同态方案",size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)"},"body-style":{padding:"12px 16px"}},{default:l(()=>[(s(!0),c(R,null,L(fe.value,t=>(s(),c("div",{key:t.id,class:"catalog-item"},[a(N,{color:"cyan",style:{"font-family":"monospace"}},{default:l(()=>[m(p(t.id),1)]),_:2},1024),y("span",At,p(t.name),1),y("span",Mt,p(t.description),1)]))),128))]),_:1})]),_:1})]),_:1}),a(We,{activeKey:oe.value,"onUpdate:activeKey":e[3]||(e[3]=t=>oe.value=t),class:"privacy-tabs"},{default:l(()=>[a(Se,{key:"models",tab:"联邦学习"},{default:l(()=>[y("div",jt,[a(J,{value:D.value,"onUpdate:value":e[0]||(e[0]=t=>D.value=t),size:"small","button-style":"solid"},{default:l(()=>[a($,{value:""},{default:l(()=>[...e[33]||(e[33]=[m("全部",-1)])]),_:1}),(s(!0),c(R,null,L(x(st),t=>(s(),C($,{key:t,value:t},{default:l(()=>[m(p(ve(t)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),a(ke,{columns:je,"data-source":Pe.value,pagination:{pageSize:20,showTotal:t=>`共 ${t} 条`},size:"small",loading:r.value,style:{background:"var(--bg-card)"}},{bodyCell:l(({column:t,record:u})=>[t.key==="name"?(s(),c(R,{key:0},[y("span",Ot,p(u.name),1),y("div",Tt,p(u.modelType)+" / "+p(u.architecture),1)],64)):h("",!0),t.key==="status"?(s(),C(N,{key:1,color:Be(u.status)},{default:l(()=>[m(p(ve(u.status)),1)]),_:2},1032,["color"])):h("",!0),t.key==="progress"?(s(),c(R,{key:2},[a(he,{percent:u.totalRounds?Math.round(100*u.currentRound/u.totalRounds):0,size:"small",status:u.status==="failed"?"exception":u.status==="completed"?"success":"active"},null,8,["percent","status"]),y("div",Lt,p(u.currentRound)+" / "+p(u.totalRounds)+" 轮 ",1)],64)):h("",!0),t.key==="accuracy"?(s(),c(R,{key:3},[y("span",{style:it({color:we(u.accuracy),fontFamily:"monospace"})},p((u.accuracy*100).toFixed(1))+"% ",5),u.loss!=null?(s(),c("div",Pt," loss "+p(u.loss.toFixed(3)),1)):h("",!0)],64)):h("",!0),t.key==="participants"?(s(),C(N,{key:4,color:"blue",style:{"font-size":"11px"}},{default:l(()=>[m(p(u.participantCount),1)]),_:2},1024)):h("",!0),t.key==="budget"?(s(),c("span",$t,p(u.privacyBudgetSpent.toFixed(3)),1)):h("",!0),t.key==="updatedAt"?(s(),c("span",Bt,p(x(Me)(u.updatedAt)),1)):h("",!0),t.key==="action"?(s(),c(R,{key:7},[Ne(u)?(s(),C(_,{key:0,size:"small",type:"link",loading:te.value===u.id,onClick:ze=>Je(u)},{default:l(()=>[...e[34]||(e[34]=[m(" 训练一轮 ",-1)])]),_:1},8,["loading","onClick"])):h("",!0),u.status!=="failed"&&u.status!=="completed"?(s(),C(Ge,{key:1,title:"标记该模型为失败?","ok-text":"确认","cancel-text":"取消",onConfirm:ze=>He(u)},{default:l(()=>[a(_,{size:"small",type:"link",danger:""},{default:l(()=>[...e[35]||(e[35]=[m("标记失败",-1)])]),_:1})]),_:1},8,["onConfirm"])):h("",!0)],64)):h("",!0)]),emptyText:l(()=>[y("div",Ut,[a(x(ue),{style:{"font-size":"36px","margin-bottom":"10px",display:"block"}}),m(" "+p(D.value?"没有符合条件的模型":'暂无 FL 模型,点"操作 → 创建联邦学习模型"创建第一个'),1)])]),_:1},8,["data-source","pagination","loading"])]),_:1}),a(Se,{key:"computations",tab:"MPC 计算"},{default:l(()=>[y("div",wt,[a(J,{value:V.value,"onUpdate:value":e[1]||(e[1]=t=>V.value=t),size:"small"},{default:l(()=>[a($,{value:""},{default:l(()=>[...e[36]||(e[36]=[m("全部协议",-1)])]),_:1}),(s(!0),c(R,null,L(x(Ae),t=>(s(),C($,{key:t,value:t},{default:l(()=>[m(p(t),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"]),a(J,{value:K.value,"onUpdate:value":e[2]||(e[2]=t=>K.value=t),size:"small"},{default:l(()=>[a($,{value:""},{default:l(()=>[...e[37]||(e[37]=[m("全部状态",-1)])]),_:1}),(s(!0),c(R,null,L(x(rt),t=>(s(),C($,{key:t,value:t},{default:l(()=>[m(p(ge(t)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),a(ke,{columns:Oe,"data-source":$e.value,pagination:{pageSize:20,showTotal:t=>`共 ${t} 条`},size:"small",loading:r.value,style:{background:"var(--bg-card)"}},{bodyCell:l(({column:t,record:u})=>[t.key==="type"?(s(),c("span",Nt,p(u.computationType),1)):h("",!0),t.key==="protocol"?(s(),C(N,{key:1,color:"purple",style:{"font-family":"monospace"}},{default:l(()=>[m(p(u.protocol),1)]),_:2},1024)):h("",!0),t.key==="progress"?(s(),C(he,{key:2,percent:u.sharesRequired?Math.round(100*u.sharesReceived/u.sharesRequired):0,size:"small",status:u.status==="completed"?"success":"active",format:()=>`${u.sharesReceived}/${u.sharesRequired}`},null,8,["percent","status","format"])):h("",!0),t.key==="status"?(s(),C(N,{key:3,color:Ue(u.status)},{default:l(()=>[m(p(ge(u.status)),1)]),_:2},1032,["color"])):h("",!0),t.key==="time"?(s(),c(R,{key:4},[u.computationTimeMs!=null?(s(),c("span",Ft,p(u.computationTimeMs)+" ms ",1)):(s(),c("span",Et,"—"))],64)):h("",!0),t.key==="createdAt"?(s(),c("span",qt,p(x(Me)(u.createdAt)),1)):h("",!0),t.key==="action"?(s(),c(R,{key:6},[u.status!=="completed"?(s(),C(_,{key:0,size:"small",type:"link",loading:ae.value===u.id,onClick:ze=>De(u)},{default:l(()=>[...e[38]||(e[38]=[m(" 提交份额 ",-1)])]),_:1},8,["loading","onClick"])):(s(),c("span",Jt," hash "+p(u.resultHash?.slice(0,8)||"—"),1))],64)):h("",!0)]),emptyText:l(()=>[y("div",Ht,[a(x(pe),{style:{"font-size":"36px","margin-bottom":"10px",display:"block"}}),e[39]||(e[39]=m(' 暂无 MPC 计算,点"操作 → 创建 MPC 计算"创建第一个 ',-1))])]),_:1},8,["data-source","pagination","loading"])]),_:1})]),_:1},8,["activeKey"]),a(Q,{open:G.value,"onUpdate:open":e[10]||(e[10]=t=>G.value=t),title:"创建联邦学习模型","confirm-loading":A.value,width:540,"ok-text":"创建","cancel-text":"取消",onOk:Ee,onCancel:_e},{default:l(()=>[a(Y,{"label-col":{span:6},"wrapper-col":{span:18},style:{"margin-top":"16px"}},{default:l(()=>[a(z,{label:"模型名称",required:""},{default:l(()=>[a(I,{value:d.name,"onUpdate:value":e[4]||(e[4]=t=>d.name=t),placeholder:"例如: fraud-detector"},null,8,["value"])]),_:1}),a(z,{label:"模型类型"},{default:l(()=>[a(I,{value:d.modelType,"onUpdate:value":e[5]||(e[5]=t=>d.modelType=t),placeholder:"neural_network(默认)"},null,8,["value"])]),_:1}),a(z,{label:"架构"},{default:l(()=>[a(I,{value:d.architecture,"onUpdate:value":e[6]||(e[6]=t=>d.architecture=t),placeholder:"mlp(默认)"},null,8,["value"])]),_:1}),a(z,{label:"总轮次"},{default:l(()=>[a(E,{value:d.rounds,"onUpdate:value":e[7]||(e[7]=t=>d.rounds=t),min:1,max:1e3,style:{width:"100%"}},null,8,["value"])]),_:1}),a(z,{label:"学习率"},{default:l(()=>[a(E,{value:d.lr,"onUpdate:value":e[8]||(e[8]=t=>d.lr=t),min:0,max:1,step:.001,style:{width:"100%"}},null,8,["value"])]),_:1}),a(z,{label:"参与方数量"},{default:l(()=>[a(E,{value:d.participants,"onUpdate:value":e[9]||(e[9]=t=>d.participants=t),min:0,max:1e3,style:{width:"100%"}},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"]),a(Q,{open:W.value,"onUpdate:open":e[15]||(e[15]=t=>W.value=t),title:"创建 MPC 计算","confirm-loading":A.value,width:520,"ok-text":"创建","cancel-text":"取消",onOk:qe,onCancel:be},{default:l(()=>[a(Y,{"label-col":{span:6},"wrapper-col":{span:18},style:{"margin-top":"16px"}},{default:l(()=>[a(z,{label:"计算类型",required:""},{default:l(()=>[a(I,{value:k.type,"onUpdate:value":e[11]||(e[11]=t=>k.type=t),placeholder:"例如: sum / multiplication"},null,8,["value"])]),_:1}),a(z,{label:"协议"},{default:l(()=>[a(Qe,{value:k.protocol,"onUpdate:value":e[12]||(e[12]=t=>k.protocol=t)},{default:l(()=>[(s(!0),c(R,null,L(x(Ae),t=>(s(),C(Ye,{key:t,value:t},{default:l(()=>[m(p(t),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),_:1}),a(z,{label:"参与方 ID"},{default:l(()=>[a(Ce,{value:k.participants,"onUpdate:value":e[13]||(e[13]=t=>k.participants=t),placeholder:"逗号分隔,例如: alice,bob,carol","auto-size":{minRows:2,maxRows:4}},null,8,["value"])]),_:1}),a(z,{label:"所需份额"},{default:l(()=>[a(E,{value:k.threshold,"onUpdate:value":e[14]||(e[14]=t=>k.threshold=t),min:2,max:100,placeholder:"留空自动取半数",style:{width:"100%"}},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"]),a(Q,{open:ne.value,"onUpdate:open":e[21]||(e[21]=t=>ne.value=t),title:"差分隐私发布","confirm-loading":F.value,width:520,"ok-text":"发布","cancel-text":"关闭",onOk:Ie},{default:l(()=>[a(Y,{"label-col":{span:6},"wrapper-col":{span:18},style:{"margin-top":"16px"}},{default:l(()=>[a(z,{label:"数据",required:""},{default:l(()=>[a(I,{value:S.data,"onUpdate:value":e[16]||(e[16]=t=>S.data=t),placeholder:"数字或 JSON 数组,例如 10 或 [1,2,3]"},null,8,["value"])]),_:1}),a(z,{label:"噪声机制"},{default:l(()=>[a(J,{value:S.mechanism,"onUpdate:value":e[17]||(e[17]=t=>S.mechanism=t)},{default:l(()=>[(s(!0),c(R,null,L(x(ut),t=>(s(),C($,{key:t,value:t},{default:l(()=>[m(p(t),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),_:1}),a(z,{label:"ε (epsilon)"},{default:l(()=>[a(E,{value:S.epsilon,"onUpdate:value":e[18]||(e[18]=t=>S.epsilon=t),min:0,step:.01,style:{width:"100%"}},null,8,["value"])]),_:1}),a(z,{label:"δ (delta)"},{default:l(()=>[a(E,{value:S.delta,"onUpdate:value":e[19]||(e[19]=t=>S.delta=t),min:0,step:1e-6,style:{width:"100%"}},null,8,["value"])]),_:1}),a(z,{label:"敏感度"},{default:l(()=>[a(E,{value:S.sensitivity,"onUpdate:value":e[20]||(e[20]=t=>S.sensitivity=t),min:0,step:.1,style:{width:"100%"}},null,8,["value"])]),_:1})]),_:1}),O.value?(s(),C(T,{key:0,size:"small",style:{background:"var(--bg-base)","margin-top":"8px"}},{default:l(()=>[O.value.published?(s(),c(R,{key:0},[a(U,{title:"加噪后数据",value:O.value.data,precision:3,"value-style":{color:"#52c41a"}},null,8,["value"]),y("div",Dt,[y("div",null,"消耗预算: "+p(O.value.budgetSpent.toFixed(3)),1),y("div",null,"剩余预算: "+p(O.value.budgetRemaining.toFixed(3)),1),y("div",null,"机制: "+p(O.value.mechanism)+" (ε="+p(O.value.epsilon)+")",1)])],64)):(s(),C(U,{key:1,title:"发布失败",value:O.value.reason||"unknown","value-style":{color:"#ff4d4f"}},null,8,["value"]))]),_:1})):h("",!0)]),_:1},8,["open","confirm-loading"]),a(Q,{open:ie.value,"onUpdate:open":e[25]||(e[25]=t=>ie.value=t),title:"同态加密查询","confirm-loading":ee.value,width:500,"ok-text":"查询","cancel-text":"关闭",onOk:Ve},{default:l(()=>[a(Y,{"label-col":{span:6},"wrapper-col":{span:18},style:{"margin-top":"16px"}},{default:l(()=>[a(z,{label:"数据",required:""},{default:l(()=>[a(Ce,{value:j.data,"onUpdate:value":e[22]||(e[22]=t=>j.data=t),placeholder:"JSON 数组,例如 [1,2,3,4,5]","auto-size":{minRows:2,maxRows:4}},null,8,["value"])]),_:1}),a(z,{label:"操作"},{default:l(()=>[a(J,{value:j.operation,"onUpdate:value":e[23]||(e[23]=t=>j.operation=t)},{default:l(()=>[(s(!0),c(R,null,L(x(dt),t=>(s(),C($,{key:t,value:t},{default:l(()=>[m(p(t),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),_:1}),a(z,{label:"同态方案"},{default:l(()=>[a(J,{value:j.scheme,"onUpdate:value":e[24]||(e[24]=t=>j.scheme=t)},{default:l(()=>[(s(!0),c(R,null,L(x(pt),t=>(s(),C($,{key:t,value:t},{default:l(()=>[m(p(t),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),_:1})]),_:1}),P.value?(s(),C(T,{key:0,size:"small",style:{background:"var(--bg-base)","margin-top":"8px"}},{default:l(()=>[a(U,{title:"加密计算结果",value:P.value.result,"value-style":{color:"#1677ff"}},null,8,["value"]),y("div",It,[y("div",null,"方案: "+p(P.value.scheme),1),y("div",null,"操作: "+p(P.value.operation),1),y("div",null,"输入项数: "+p(P.value.inputCount),1),P.value.encrypted?(s(),C(N,{key:0,color:"green",style:{"margin-top":"4px","font-size":"10px"}},{default:l(()=>[...e[40]||(e[40]=[m("已加密",-1)])]),_:1})):h("",!0)])]),_:1})):h("",!0)]),_:1},8,["open","confirm-loading"])])}}},na=et(Vt,[["__scopeId","data-v-70813c86"]]);export{na as default};
1
+ import{u as Xe}from"./ws-Bv7YH0VB.js";import{s as Ze}from"./community-parser-CO25nZFt.js";import{_ as et}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{a as f}from"./index-BfKFNptm.js";import{Y as tt,ac as at,E as ue,l as pe,L as Re,o as lt,aL as ot}from"./icons-ukMaZ3tx.js";import{l as nt,F as c,D as y,c as a,x as l,q as v,r as b,v as s,J as m,u as x,I as p,H as R,L,m as C,G as h,N as it,j as X,a as Z}from"./vendor-BVetwVfk.js";import"./index-DfcXDy2A.js";import"./useConfigInject-DCcT0grw.js";import"./transition-DSe9CgZe.js";import"./Keyframes-C7fCrnlS.js";import"./Portal-CHsntPCQ.js";import"./index-U4Zd5IK6.js";function H(o){const i=Ze(o);if(!i)return null;try{return JSON.parse(i)}catch{}const r=i.match(/\{[\s\S]*\}|\[[\s\S]*\]/);if(!r)return null;try{return JSON.parse(r[0])}catch{return null}}const st=Object.freeze(["initializing","training","aggregating","completed","failed"]),rt=Object.freeze(["pending","computing","completed"]),Ae=Object.freeze(["shamir","beaver","gmw"]),ut=Object.freeze(["laplace","gaussian","exponential"]),pt=Object.freeze(["paillier","bfv","ckks"]),dt=Object.freeze(["sum","product","mean","count"]);function g(o,i=0){return typeof o=="number"&&Number.isFinite(o)?o:i}function ct(o,i=0){if(!o||typeof o!="object")return null;const r=o.id||"";return r?{key:r,id:r,name:String(o.name||r),description:String(o.description||""),_idx:i}:null}function de(o){const i=H(o);return Array.isArray(i)?i.map(ct).filter(Boolean):[]}function mt(o,i=0){if(!o||typeof o!="object")return null;const r=o.id||"";return r?{key:r,id:r,name:String(o.name||""),modelType:o.modelType??o.model_type??"neural_network",architecture:String(o.architecture||""),status:String(o.status||"initializing").toLowerCase(),currentRound:g(o.currentRound??o.current_round,0),totalRounds:g(o.totalRounds??o.total_rounds,0),participantCount:g(o.participantCount??o.participant_count,0),accuracy:g(o.accuracy,0),loss:o.loss==null?null:g(o.loss,null),learningRate:g(o.learningRate??o.learning_rate,0),aggregationStrategy:o.aggregationStrategy??o.aggregation_strategy??"",privacyBudgetSpent:g(o.privacyBudgetSpent??o.privacy_budget_spent,0),createdAt:o.createdAt??o.created_at??null,updatedAt:o.updatedAt??o.updated_at??null,_idx:i}:null}function ft(o){const i=H(o);return Array.isArray(i)?i.map(mt).filter(Boolean):[]}function yt(o,i=0){if(!o||typeof o!="object")return null;const r=o.id||"";if(!r)return null;let A=o.participantIds??o.participant_ids??[];if(typeof A=="string")try{A=JSON.parse(A)}catch{A=[]}return Array.isArray(A)||(A=[]),{key:r,id:r,computationType:o.computationType??o.computation_type??"",protocol:String(o.protocol||"shamir").toLowerCase(),participantCount:g(o.participantCount??o.participant_count,0),participantIds:A,resultHash:o.resultHash??o.result_hash??null,status:String(o.status||"pending").toLowerCase(),sharesReceived:g(o.sharesReceived??o.shares_received,0),sharesRequired:g(o.sharesRequired??o.shares_required,0),computationTimeMs:o.computationTimeMs??o.computation_time_ms??null,errorMessage:o.errorMessage??o.error_message??"",createdAt:o.createdAt??o.created_at??null,completedAt:o.completedAt??o.completed_at??null,_idx:i}}function vt(o){const i=H(o);return Array.isArray(i)?i.map(yt).filter(Boolean):[]}function gt(o){const i=H(o);return!i||typeof i!="object"||Array.isArray(i)?null:{published:!!i.published,reason:i.reason||null,data:i.data??null,epsilon:g(i.epsilon,0),delta:g(i.delta,0),mechanism:String(i.mechanism||""),budgetSpent:g(i.budgetSpent??i.budget_spent,0),budgetRemaining:g(i.budgetRemaining??i.budget_remaining,0)}}function _t(o){const i=H(o);return!i||typeof i!="object"||Array.isArray(i)?null:{result:i.result??null,operation:String(i.operation||""),scheme:String(i.scheme||""),inputCount:g(i.inputCount??i.input_count,0),encrypted:i.encrypted!==!1}}const bt={privacyBudget:{spent:0,limit:0,remaining:0,exhausted:!1},federatedLearning:{totalModels:0,completed:0,training:0,avgAccuracy:0},mpc:{totalComputations:0,completed:0,pending:0,byProtocol:{}}};function xt(o){const i=JSON.parse(JSON.stringify(bt)),r=H(o);if(!r||typeof r!="object"||Array.isArray(r))return i;if(r.privacyBudget&&typeof r.privacyBudget=="object"&&(i.privacyBudget.spent=g(r.privacyBudget.spent,0),i.privacyBudget.limit=g(r.privacyBudget.limit,0),i.privacyBudget.remaining=g(r.privacyBudget.remaining,0),i.privacyBudget.exhausted=!!r.privacyBudget.exhausted),r.federatedLearning&&typeof r.federatedLearning=="object"&&(i.federatedLearning.totalModels=g(r.federatedLearning.totalModels,0),i.federatedLearning.completed=g(r.federatedLearning.completed,0),i.federatedLearning.training=g(r.federatedLearning.training,0),i.federatedLearning.avgAccuracy=g(r.federatedLearning.avgAccuracy,0)),r.mpc&&typeof r.mpc=="object"&&(i.mpc.totalComputations=g(r.mpc.totalComputations,0),i.mpc.completed=g(r.mpc.completed,0),i.mpc.pending=g(r.mpc.pending,0),r.mpc.byProtocol&&typeof r.mpc.byProtocol=="object"))for(const[A,F]of Object.entries(r.mpc.byProtocol))typeof F=="number"&&Number.isFinite(F)&&(i.mpc.byProtocol[A]=F);return i}function Me(o){if(o==null||o==="")return"—";const i=typeof o=="number"?new Date(o):new Date(String(o));return isNaN(i.getTime())?String(o):i.toLocaleString("zh-CN",{hour12:!1})}const ht={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},kt={style:{"font-size":"11px",color:"var(--text-secondary)"}},St={class:"catalog-name"},Ct={class:"catalog-desc"},zt={class:"catalog-name"},Rt={class:"catalog-desc"},At={class:"catalog-name"},Mt={class:"catalog-desc"},jt={class:"filter-bar"},Ot={style:{color:"var(--text-primary)","font-weight":"500"}},Tt={style:{color:"var(--text-secondary)","font-size":"11px","margin-top":"2px"}},Lt={style:{"font-size":"11px",color:"var(--text-secondary)"}},Pt={key:0,style:{"font-size":"11px",color:"var(--text-secondary)"}},$t={key:5,style:{"font-family":"monospace",color:"var(--text-secondary)"}},Bt={key:6,style:{color:"var(--text-secondary)","font-size":"11px"}},Ut={style:{padding:"40px",color:"var(--text-muted)","text-align":"center"}},wt={class:"filter-bar"},Nt={key:0,style:{color:"var(--text-primary)","font-family":"monospace","font-weight":"500"}},Ft={key:0,style:{"font-family":"monospace",color:"var(--text-secondary)","font-size":"12px"}},Et={key:1,style:{color:"var(--text-muted)"}},qt={key:5,style:{color:"var(--text-secondary)","font-size":"11px"}},Jt={key:1,style:{color:"var(--text-muted)","font-size":"11px","font-family":"monospace"}},Ht={style:{padding:"40px",color:"var(--text-muted)","text-align":"center"}},Dt={style:{"margin-top":"12px","font-size":"12px",color:"var(--text-secondary)"}},It={style:{"margin-top":"12px","font-size":"12px",color:"var(--text-secondary)"}},Vt={__name:"Privacy",setup(o){const i=Xe(),r=b(!1),A=b(!1),F=b(!1),ee=b(!1),te=b(""),ae=b(""),ce=b([]),me=b([]),fe=b([]),le=b([]),ye=b([]),M=b({privacyBudget:{spent:0,limit:0,remaining:0,exhausted:!1},federatedLearning:{totalModels:0,completed:0,training:0,avgAccuracy:0},mpc:{totalComputations:0,completed:0,pending:0,byProtocol:{}}}),oe=b("models"),D=b(""),V=b(""),K=b(""),G=b(!1),W=b(!1),ne=b(!1),ie=b(!1),d=Z({name:"",modelType:"",architecture:"",rounds:10,lr:.01,participants:0}),k=Z({type:"",protocol:"shamir",participants:"",threshold:null}),S=Z({data:"",mechanism:"laplace",epsilon:.1,delta:1e-5,sensitivity:1}),j=Z({data:"",operation:"sum",scheme:"paillier"}),O=b(null),P=b(null),je=[{title:"名称",key:"name"},{title:"状态",key:"status",width:"120px"},{title:"进度",key:"progress",width:"160px"},{title:"准确度",key:"accuracy",width:"110px"},{title:"参与方",key:"participants",width:"90px"},{title:"预算 ε",key:"budget",width:"100px"},{title:"更新时间",key:"updatedAt",width:"160px"},{title:"操作",key:"action",width:"180px"}],Oe=[{title:"类型",key:"type",width:"160px"},{title:"协议",key:"protocol",width:"100px"},{title:"份额进度",key:"progress"},{title:"状态",key:"status",width:"110px"},{title:"耗时",key:"time",width:"110px"},{title:"创建时间",key:"createdAt",width:"160px"},{title:"操作",key:"action",width:"160px"}],Te=X(()=>M.value.federatedLearning.avgAccuracy*100),Le=X(()=>{const n=M.value.privacyBudget.remaining,e=M.value.privacyBudget.limit;if(e===0)return"#888";const _=n/e;return _<.2?"#ff4d4f":_<.5?"#faad14":"#52c41a"}),Pe=X(()=>D.value?le.value.filter(n=>n.status===D.value):le.value),$e=X(()=>{let n=ye.value;return V.value&&(n=n.filter(e=>e.protocol===V.value)),K.value&&(n=n.filter(e=>e.status===K.value)),n});function ve(n){return{initializing:"初始化",training:"训练中",aggregating:"聚合中",completed:"已完成",failed:"失败"}[n]||n}function Be(n){return{initializing:"default",training:"processing",aggregating:"cyan",completed:"green",failed:"red"}[n]||"default"}function ge(n){return{pending:"待处理",computing:"计算中",completed:"已完成"}[n]||n}function Ue(n){return{pending:"default",computing:"processing",completed:"green"}[n]||"default"}function we(n){return n>=.85?"#52c41a":n>=.6?"#faad14":"#ff4d4f"}function Ne(n){return n.status==="initializing"||n.status==="training"||n.status==="aggregating"}function Fe({key:n}){n==="model"?G.value=!0:n==="computation"?W.value=!0:n==="dp"?(O.value=null,ne.value=!0):n==="he"&&(P.value=null,ie.value=!0)}async function B(){r.value=!0;try{const[n,e,_,q,se,re]=await Promise.all([i.execute("privacy protocols --json",8e3).catch(()=>({output:""})),i.execute("privacy dp-mechanisms --json",8e3).catch(()=>({output:""})),i.execute("privacy he-schemes --json",8e3).catch(()=>({output:""})),i.execute("privacy models --limit 100 --json",1e4).catch(()=>({output:""})),i.execute("privacy computations --limit 100 --json",1e4).catch(()=>({output:""})),i.execute("privacy report --json",8e3).catch(()=>({output:""}))]);ce.value=de(n.output),me.value=de(e.output),fe.value=de(_.output),le.value=ft(q.output),ye.value=vt(se.output),M.value=xt(re.output)}catch(n){f.error("加载隐私计算数据失败: "+(n?.message||n))}finally{r.value=!1}}async function Ee(){if(!d.name.trim()){f.warning("请输入模型名称");return}A.value=!0;try{const n=[`privacy create-model "${d.name.trim().replace(/"/g,'\\"')}"`];d.modelType.trim()&&n.push(`--type "${d.modelType.trim().replace(/"/g,'\\"')}"`),d.architecture.trim()&&n.push(`--arch "${d.architecture.trim().replace(/"/g,'\\"')}"`),d.rounds!=null&&n.push(`--rounds ${d.rounds}`),d.lr!=null&&n.push(`--lr ${d.lr}`),d.participants!=null&&n.push(`--participants ${d.participants}`),n.push("--json");const{output:e}=await i.execute(n.join(" "),12e3);if(/error|失败/i.test(e)&&!/"modelId"/.test(e)){f.error("创建失败: "+e.slice(0,120));return}f.success("FL 模型已创建"),G.value=!1,_e(),await B()}catch(n){f.error("创建失败: "+(n?.message||n))}finally{A.value=!1}}async function qe(){if(!k.type.trim()){f.warning("请输入计算类型");return}A.value=!0;try{const n=[`privacy create-computation "${k.type.trim().replace(/"/g,'\\"')}"`];if(n.push(`--protocol ${k.protocol}`),k.participants.trim()){const _=k.participants.split(/[,\s]+/).filter(Boolean).join(",");_&&n.push(`--participants "${_}"`)}k.threshold!=null&&n.push(`--threshold ${k.threshold}`),n.push("--json");const{output:e}=await i.execute(n.join(" "),1e4);if(/error|失败|invalid/i.test(e)&&!/"computationId"/.test(e)){f.error("创建失败: "+e.slice(0,120));return}f.success("MPC 计算已创建"),W.value=!1,be(),oe.value="computations",await B()}catch(n){f.error("创建失败: "+(n?.message||n))}finally{A.value=!1}}async function Je(n){te.value=n.id;try{const{output:e}=await i.execute(`privacy train ${n.id} --json`,12e3);if(/error|失败/i.test(e)&&!/"trained"/.test(e)){f.error("训练失败: "+e.slice(0,120));return}f.success("训练一轮完成"),await B()}catch(e){f.error("训练失败: "+(e?.message||e))}finally{te.value=""}}async function He(n){try{const{output:e}=await i.execute(`privacy fail-model ${n.id} --json`,8e3);if(/error/i.test(e)&&!/"failed"/.test(e)){f.error("标记失败: "+e.slice(0,120));return}f.success("已标记为失败"),await B()}catch(e){f.error("标记失败: "+(e?.message||e))}}async function De(n){ae.value=n.id;try{const{output:e}=await i.execute(`privacy submit-share ${n.id} --json`,1e4);if(/error|失败/i.test(e)&&!/"submitted"/.test(e)){f.error("提交失败: "+e.slice(0,120));return}f.success("份额已提交"),await B()}catch(e){f.error("提交失败: "+(e?.message||e))}finally{ae.value=""}}async function Ie(){if(!S.data.trim()){f.warning("请输入数据");return}F.value=!0,O.value=null;try{const n=["privacy dp-publish"];n.push(`--data ${JSON.stringify(S.data.trim())}`),n.push(`--mechanism ${S.mechanism}`),S.epsilon!=null&&n.push(`--epsilon ${S.epsilon}`),S.delta!=null&&n.push(`--delta ${S.delta}`),S.sensitivity!=null&&n.push(`--sensitivity ${S.sensitivity}`),n.push("--json");const{output:e}=await i.execute(n.join(" "),1e4),_=gt(e);if(!_){f.error("发布失败: "+e.slice(0,120));return}O.value=_,_.published?(f.success("已发布"),await B()):f.warning(`发布拒绝: ${_.reason||"unknown"}`)}catch(n){f.error("发布失败: "+(n?.message||n))}finally{F.value=!1}}async function Ve(){if(!j.data.trim()){f.warning("请输入数据");return}try{JSON.parse(j.data)}catch{f.warning("数据格式错误,请输入合法 JSON 数组");return}ee.value=!0,P.value=null;try{const n=["privacy he-query"];n.push(`--data ${JSON.stringify(j.data.trim())}`),n.push(`--operation ${j.operation}`),n.push(`--scheme ${j.scheme}`),n.push("--json");const{output:e}=await i.execute(n.join(" "),1e4),_=_t(e);if(!_){f.error("查询失败: "+e.slice(0,120));return}P.value=_,f.success(`计算完成 (${_.scheme}/${_.operation})`)}catch(n){f.error("查询失败: "+(n?.message||n))}finally{ee.value=!1}}function _e(){d.name="",d.modelType="",d.architecture="",d.rounds=10,d.lr=.01,d.participants=0}function be(){k.type="",k.protocol="shamir",k.participants="",k.threshold=null}return nt(B),(n,e)=>{const _=v("a-button"),q=v("a-menu-item"),se=v("a-menu"),re=v("a-dropdown"),Ke=v("a-space"),U=v("a-statistic"),T=v("a-card"),w=v("a-col"),xe=v("a-row"),N=v("a-tag"),$=v("a-radio-button"),J=v("a-radio-group"),he=v("a-progress"),Ge=v("a-popconfirm"),ke=v("a-table"),Se=v("a-tab-pane"),We=v("a-tabs"),I=v("a-input"),z=v("a-form-item"),E=v("a-input-number"),Y=v("a-form"),Q=v("a-modal"),Ye=v("a-select-option"),Qe=v("a-select"),Ce=v("a-textarea");return s(),c("div",null,[y("div",ht,[e[32]||(e[32]=y("div",null,[y("h2",{class:"page-title"},"隐私计算"),y("p",{class:"page-sub"},"联邦学习 · 多方计算 · 差分隐私 · 同态加密")],-1)),a(Ke,null,{default:l(()=>[a(_,{loading:r.value,onClick:B},{icon:l(()=>[a(x(tt))]),default:l(()=>[e[26]||(e[26]=m(" 刷新 ",-1))]),_:1},8,["loading"]),a(re,{trigger:["click"]},{overlay:l(()=>[a(se,{onClick:Fe},{default:l(()=>[a(q,{key:"model"},{default:l(()=>[a(x(ue)),e[28]||(e[28]=m(" 创建联邦学习模型",-1))]),_:1}),a(q,{key:"computation"},{default:l(()=>[a(x(pe)),e[29]||(e[29]=m(" 创建 MPC 计算",-1))]),_:1}),a(q,{key:"dp"},{default:l(()=>[a(x(Re)),e[30]||(e[30]=m(" 差分隐私发布",-1))]),_:1}),a(q,{key:"he"},{default:l(()=>[a(x(lt)),e[31]||(e[31]=m(" 同态加密查询",-1))]),_:1})]),_:1})]),default:l(()=>[a(_,{type:"primary"},{icon:l(()=>[a(x(at))]),default:l(()=>[e[27]||(e[27]=m(" 操作 ▼ ",-1))]),_:1})]),_:1})]),_:1})]),a(xe,{gutter:[16,16],style:{"margin-bottom":"20px"}},{default:l(()=>[a(w,{xs:12,sm:8,lg:5},{default:l(()=>[a(T,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:l(()=>[a(U,{title:"FL 模型",value:M.value.federatedLearning.totalModels,"value-style":{color:"#1677ff",fontSize:"20px"}},{prefix:l(()=>[a(x(ue))]),_:1},8,["value"])]),_:1})]),_:1}),a(w,{xs:12,sm:8,lg:5},{default:l(()=>[a(T,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:l(()=>[a(U,{title:"平均准确度",value:Te.value,precision:1,suffix:"%","value-style":{color:M.value.federatedLearning.avgAccuracy>=.8?"#52c41a":"#faad14",fontSize:"20px"}},{prefix:l(()=>[a(x(ot))]),_:1},8,["value","value-style"])]),_:1})]),_:1}),a(w,{xs:12,sm:8,lg:5},{default:l(()=>[a(T,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:l(()=>[a(U,{title:"MPC 计算",value:M.value.mpc.totalComputations,"value-style":{color:"#722ed1",fontSize:"20px"}},{prefix:l(()=>[a(x(pe))]),_:1},8,["value"])]),_:1})]),_:1}),a(w,{xs:12,sm:8,lg:5},{default:l(()=>[a(T,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:l(()=>[a(U,{title:"预算余量 ε",value:M.value.privacyBudget.remaining,precision:2,"value-style":{color:Le.value,fontSize:"20px"}},{prefix:l(()=>[a(x(Re))]),suffix:l(()=>[y("span",kt,"/ "+p(M.value.privacyBudget.limit),1)]),_:1},8,["value","value-style"])]),_:1})]),_:1}),a(w,{xs:24,sm:8,lg:4},{default:l(()=>[a(T,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:l(()=>[a(U,{title:"预算状态",value:M.value.privacyBudget.exhausted?"已耗尽":"充足","value-style":{color:M.value.privacyBudget.exhausted?"#ff4d4f":"#52c41a",fontSize:"20px"}},null,8,["value","value-style"])]),_:1})]),_:1})]),_:1}),a(xe,{gutter:[16,16],style:{"margin-bottom":"20px"}},{default:l(()=>[a(w,{xs:24,md:8},{default:l(()=>[a(T,{title:"MPC 协议",size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)"},"body-style":{padding:"12px 16px"}},{default:l(()=>[(s(!0),c(R,null,L(ce.value,t=>(s(),c("div",{key:t.id,class:"catalog-item"},[a(N,{color:"purple",style:{"font-family":"monospace"}},{default:l(()=>[m(p(t.id),1)]),_:2},1024),y("span",St,p(t.name),1),y("span",Ct,p(t.description),1)]))),128))]),_:1})]),_:1}),a(w,{xs:24,md:8},{default:l(()=>[a(T,{title:"DP 噪声机制",size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)"},"body-style":{padding:"12px 16px"}},{default:l(()=>[(s(!0),c(R,null,L(me.value,t=>(s(),c("div",{key:t.id,class:"catalog-item"},[a(N,{color:"orange",style:{"font-family":"monospace"}},{default:l(()=>[m(p(t.id),1)]),_:2},1024),y("span",zt,p(t.name),1),y("span",Rt,p(t.description),1)]))),128))]),_:1})]),_:1}),a(w,{xs:24,md:8},{default:l(()=>[a(T,{title:"HE 同态方案",size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)"},"body-style":{padding:"12px 16px"}},{default:l(()=>[(s(!0),c(R,null,L(fe.value,t=>(s(),c("div",{key:t.id,class:"catalog-item"},[a(N,{color:"cyan",style:{"font-family":"monospace"}},{default:l(()=>[m(p(t.id),1)]),_:2},1024),y("span",At,p(t.name),1),y("span",Mt,p(t.description),1)]))),128))]),_:1})]),_:1})]),_:1}),a(We,{activeKey:oe.value,"onUpdate:activeKey":e[3]||(e[3]=t=>oe.value=t),class:"privacy-tabs"},{default:l(()=>[a(Se,{key:"models",tab:"联邦学习"},{default:l(()=>[y("div",jt,[a(J,{value:D.value,"onUpdate:value":e[0]||(e[0]=t=>D.value=t),size:"small","button-style":"solid"},{default:l(()=>[a($,{value:""},{default:l(()=>[...e[33]||(e[33]=[m("全部",-1)])]),_:1}),(s(!0),c(R,null,L(x(st),t=>(s(),C($,{key:t,value:t},{default:l(()=>[m(p(ve(t)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),a(ke,{columns:je,"data-source":Pe.value,pagination:{pageSize:20,showTotal:t=>`共 ${t} 条`},size:"small",loading:r.value,style:{background:"var(--bg-card)"}},{bodyCell:l(({column:t,record:u})=>[t.key==="name"?(s(),c(R,{key:0},[y("span",Ot,p(u.name),1),y("div",Tt,p(u.modelType)+" / "+p(u.architecture),1)],64)):h("",!0),t.key==="status"?(s(),C(N,{key:1,color:Be(u.status)},{default:l(()=>[m(p(ve(u.status)),1)]),_:2},1032,["color"])):h("",!0),t.key==="progress"?(s(),c(R,{key:2},[a(he,{percent:u.totalRounds?Math.round(100*u.currentRound/u.totalRounds):0,size:"small",status:u.status==="failed"?"exception":u.status==="completed"?"success":"active"},null,8,["percent","status"]),y("div",Lt,p(u.currentRound)+" / "+p(u.totalRounds)+" 轮 ",1)],64)):h("",!0),t.key==="accuracy"?(s(),c(R,{key:3},[y("span",{style:it({color:we(u.accuracy),fontFamily:"monospace"})},p((u.accuracy*100).toFixed(1))+"% ",5),u.loss!=null?(s(),c("div",Pt," loss "+p(u.loss.toFixed(3)),1)):h("",!0)],64)):h("",!0),t.key==="participants"?(s(),C(N,{key:4,color:"blue",style:{"font-size":"11px"}},{default:l(()=>[m(p(u.participantCount),1)]),_:2},1024)):h("",!0),t.key==="budget"?(s(),c("span",$t,p(u.privacyBudgetSpent.toFixed(3)),1)):h("",!0),t.key==="updatedAt"?(s(),c("span",Bt,p(x(Me)(u.updatedAt)),1)):h("",!0),t.key==="action"?(s(),c(R,{key:7},[Ne(u)?(s(),C(_,{key:0,size:"small",type:"link",loading:te.value===u.id,onClick:ze=>Je(u)},{default:l(()=>[...e[34]||(e[34]=[m(" 训练一轮 ",-1)])]),_:1},8,["loading","onClick"])):h("",!0),u.status!=="failed"&&u.status!=="completed"?(s(),C(Ge,{key:1,title:"标记该模型为失败?","ok-text":"确认","cancel-text":"取消",onConfirm:ze=>He(u)},{default:l(()=>[a(_,{size:"small",type:"link",danger:""},{default:l(()=>[...e[35]||(e[35]=[m("标记失败",-1)])]),_:1})]),_:1},8,["onConfirm"])):h("",!0)],64)):h("",!0)]),emptyText:l(()=>[y("div",Ut,[a(x(ue),{style:{"font-size":"36px","margin-bottom":"10px",display:"block"}}),m(" "+p(D.value?"没有符合条件的模型":'暂无 FL 模型,点"操作 → 创建联邦学习模型"创建第一个'),1)])]),_:1},8,["data-source","pagination","loading"])]),_:1}),a(Se,{key:"computations",tab:"MPC 计算"},{default:l(()=>[y("div",wt,[a(J,{value:V.value,"onUpdate:value":e[1]||(e[1]=t=>V.value=t),size:"small"},{default:l(()=>[a($,{value:""},{default:l(()=>[...e[36]||(e[36]=[m("全部协议",-1)])]),_:1}),(s(!0),c(R,null,L(x(Ae),t=>(s(),C($,{key:t,value:t},{default:l(()=>[m(p(t),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"]),a(J,{value:K.value,"onUpdate:value":e[2]||(e[2]=t=>K.value=t),size:"small"},{default:l(()=>[a($,{value:""},{default:l(()=>[...e[37]||(e[37]=[m("全部状态",-1)])]),_:1}),(s(!0),c(R,null,L(x(rt),t=>(s(),C($,{key:t,value:t},{default:l(()=>[m(p(ge(t)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),a(ke,{columns:Oe,"data-source":$e.value,pagination:{pageSize:20,showTotal:t=>`共 ${t} 条`},size:"small",loading:r.value,style:{background:"var(--bg-card)"}},{bodyCell:l(({column:t,record:u})=>[t.key==="type"?(s(),c("span",Nt,p(u.computationType),1)):h("",!0),t.key==="protocol"?(s(),C(N,{key:1,color:"purple",style:{"font-family":"monospace"}},{default:l(()=>[m(p(u.protocol),1)]),_:2},1024)):h("",!0),t.key==="progress"?(s(),C(he,{key:2,percent:u.sharesRequired?Math.round(100*u.sharesReceived/u.sharesRequired):0,size:"small",status:u.status==="completed"?"success":"active",format:()=>`${u.sharesReceived}/${u.sharesRequired}`},null,8,["percent","status","format"])):h("",!0),t.key==="status"?(s(),C(N,{key:3,color:Ue(u.status)},{default:l(()=>[m(p(ge(u.status)),1)]),_:2},1032,["color"])):h("",!0),t.key==="time"?(s(),c(R,{key:4},[u.computationTimeMs!=null?(s(),c("span",Ft,p(u.computationTimeMs)+" ms ",1)):(s(),c("span",Et,"—"))],64)):h("",!0),t.key==="createdAt"?(s(),c("span",qt,p(x(Me)(u.createdAt)),1)):h("",!0),t.key==="action"?(s(),c(R,{key:6},[u.status!=="completed"?(s(),C(_,{key:0,size:"small",type:"link",loading:ae.value===u.id,onClick:ze=>De(u)},{default:l(()=>[...e[38]||(e[38]=[m(" 提交份额 ",-1)])]),_:1},8,["loading","onClick"])):(s(),c("span",Jt," hash "+p(u.resultHash?.slice(0,8)||"—"),1))],64)):h("",!0)]),emptyText:l(()=>[y("div",Ht,[a(x(pe),{style:{"font-size":"36px","margin-bottom":"10px",display:"block"}}),e[39]||(e[39]=m(' 暂无 MPC 计算,点"操作 → 创建 MPC 计算"创建第一个 ',-1))])]),_:1},8,["data-source","pagination","loading"])]),_:1})]),_:1},8,["activeKey"]),a(Q,{open:G.value,"onUpdate:open":e[10]||(e[10]=t=>G.value=t),title:"创建联邦学习模型","confirm-loading":A.value,width:540,"ok-text":"创建","cancel-text":"取消",onOk:Ee,onCancel:_e},{default:l(()=>[a(Y,{"label-col":{span:6},"wrapper-col":{span:18},style:{"margin-top":"16px"}},{default:l(()=>[a(z,{label:"模型名称",required:""},{default:l(()=>[a(I,{value:d.name,"onUpdate:value":e[4]||(e[4]=t=>d.name=t),placeholder:"例如: fraud-detector"},null,8,["value"])]),_:1}),a(z,{label:"模型类型"},{default:l(()=>[a(I,{value:d.modelType,"onUpdate:value":e[5]||(e[5]=t=>d.modelType=t),placeholder:"neural_network(默认)"},null,8,["value"])]),_:1}),a(z,{label:"架构"},{default:l(()=>[a(I,{value:d.architecture,"onUpdate:value":e[6]||(e[6]=t=>d.architecture=t),placeholder:"mlp(默认)"},null,8,["value"])]),_:1}),a(z,{label:"总轮次"},{default:l(()=>[a(E,{value:d.rounds,"onUpdate:value":e[7]||(e[7]=t=>d.rounds=t),min:1,max:1e3,style:{width:"100%"}},null,8,["value"])]),_:1}),a(z,{label:"学习率"},{default:l(()=>[a(E,{value:d.lr,"onUpdate:value":e[8]||(e[8]=t=>d.lr=t),min:0,max:1,step:.001,style:{width:"100%"}},null,8,["value"])]),_:1}),a(z,{label:"参与方数量"},{default:l(()=>[a(E,{value:d.participants,"onUpdate:value":e[9]||(e[9]=t=>d.participants=t),min:0,max:1e3,style:{width:"100%"}},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"]),a(Q,{open:W.value,"onUpdate:open":e[15]||(e[15]=t=>W.value=t),title:"创建 MPC 计算","confirm-loading":A.value,width:520,"ok-text":"创建","cancel-text":"取消",onOk:qe,onCancel:be},{default:l(()=>[a(Y,{"label-col":{span:6},"wrapper-col":{span:18},style:{"margin-top":"16px"}},{default:l(()=>[a(z,{label:"计算类型",required:""},{default:l(()=>[a(I,{value:k.type,"onUpdate:value":e[11]||(e[11]=t=>k.type=t),placeholder:"例如: sum / multiplication"},null,8,["value"])]),_:1}),a(z,{label:"协议"},{default:l(()=>[a(Qe,{value:k.protocol,"onUpdate:value":e[12]||(e[12]=t=>k.protocol=t)},{default:l(()=>[(s(!0),c(R,null,L(x(Ae),t=>(s(),C(Ye,{key:t,value:t},{default:l(()=>[m(p(t),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),_:1}),a(z,{label:"参与方 ID"},{default:l(()=>[a(Ce,{value:k.participants,"onUpdate:value":e[13]||(e[13]=t=>k.participants=t),placeholder:"逗号分隔,例如: alice,bob,carol","auto-size":{minRows:2,maxRows:4}},null,8,["value"])]),_:1}),a(z,{label:"所需份额"},{default:l(()=>[a(E,{value:k.threshold,"onUpdate:value":e[14]||(e[14]=t=>k.threshold=t),min:2,max:100,placeholder:"留空自动取半数",style:{width:"100%"}},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"]),a(Q,{open:ne.value,"onUpdate:open":e[21]||(e[21]=t=>ne.value=t),title:"差分隐私发布","confirm-loading":F.value,width:520,"ok-text":"发布","cancel-text":"关闭",onOk:Ie},{default:l(()=>[a(Y,{"label-col":{span:6},"wrapper-col":{span:18},style:{"margin-top":"16px"}},{default:l(()=>[a(z,{label:"数据",required:""},{default:l(()=>[a(I,{value:S.data,"onUpdate:value":e[16]||(e[16]=t=>S.data=t),placeholder:"数字或 JSON 数组,例如 10 或 [1,2,3]"},null,8,["value"])]),_:1}),a(z,{label:"噪声机制"},{default:l(()=>[a(J,{value:S.mechanism,"onUpdate:value":e[17]||(e[17]=t=>S.mechanism=t)},{default:l(()=>[(s(!0),c(R,null,L(x(ut),t=>(s(),C($,{key:t,value:t},{default:l(()=>[m(p(t),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),_:1}),a(z,{label:"ε (epsilon)"},{default:l(()=>[a(E,{value:S.epsilon,"onUpdate:value":e[18]||(e[18]=t=>S.epsilon=t),min:0,step:.01,style:{width:"100%"}},null,8,["value"])]),_:1}),a(z,{label:"δ (delta)"},{default:l(()=>[a(E,{value:S.delta,"onUpdate:value":e[19]||(e[19]=t=>S.delta=t),min:0,step:1e-6,style:{width:"100%"}},null,8,["value"])]),_:1}),a(z,{label:"敏感度"},{default:l(()=>[a(E,{value:S.sensitivity,"onUpdate:value":e[20]||(e[20]=t=>S.sensitivity=t),min:0,step:.1,style:{width:"100%"}},null,8,["value"])]),_:1})]),_:1}),O.value?(s(),C(T,{key:0,size:"small",style:{background:"var(--bg-base)","margin-top":"8px"}},{default:l(()=>[O.value.published?(s(),c(R,{key:0},[a(U,{title:"加噪后数据",value:O.value.data,precision:3,"value-style":{color:"#52c41a"}},null,8,["value"]),y("div",Dt,[y("div",null,"消耗预算: "+p(O.value.budgetSpent.toFixed(3)),1),y("div",null,"剩余预算: "+p(O.value.budgetRemaining.toFixed(3)),1),y("div",null,"机制: "+p(O.value.mechanism)+" (ε="+p(O.value.epsilon)+")",1)])],64)):(s(),C(U,{key:1,title:"发布失败",value:O.value.reason||"unknown","value-style":{color:"#ff4d4f"}},null,8,["value"]))]),_:1})):h("",!0)]),_:1},8,["open","confirm-loading"]),a(Q,{open:ie.value,"onUpdate:open":e[25]||(e[25]=t=>ie.value=t),title:"同态加密查询","confirm-loading":ee.value,width:500,"ok-text":"查询","cancel-text":"关闭",onOk:Ve},{default:l(()=>[a(Y,{"label-col":{span:6},"wrapper-col":{span:18},style:{"margin-top":"16px"}},{default:l(()=>[a(z,{label:"数据",required:""},{default:l(()=>[a(Ce,{value:j.data,"onUpdate:value":e[22]||(e[22]=t=>j.data=t),placeholder:"JSON 数组,例如 [1,2,3,4,5]","auto-size":{minRows:2,maxRows:4}},null,8,["value"])]),_:1}),a(z,{label:"操作"},{default:l(()=>[a(J,{value:j.operation,"onUpdate:value":e[23]||(e[23]=t=>j.operation=t)},{default:l(()=>[(s(!0),c(R,null,L(x(dt),t=>(s(),C($,{key:t,value:t},{default:l(()=>[m(p(t),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),_:1}),a(z,{label:"同态方案"},{default:l(()=>[a(J,{value:j.scheme,"onUpdate:value":e[24]||(e[24]=t=>j.scheme=t)},{default:l(()=>[(s(!0),c(R,null,L(x(pt),t=>(s(),C($,{key:t,value:t},{default:l(()=>[m(p(t),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),_:1})]),_:1}),P.value?(s(),C(T,{key:0,size:"small",style:{background:"var(--bg-base)","margin-top":"8px"}},{default:l(()=>[a(U,{title:"加密计算结果",value:P.value.result,"value-style":{color:"#1677ff"}},null,8,["value"]),y("div",It,[y("div",null,"方案: "+p(P.value.scheme),1),y("div",null,"操作: "+p(P.value.operation),1),y("div",null,"输入项数: "+p(P.value.inputCount),1),P.value.encrypted?(s(),C(N,{key:0,color:"green",style:{"margin-top":"4px","font-size":"10px"}},{default:l(()=>[...e[40]||(e[40]=[m("已加密",-1)])]),_:1})):h("",!0)])]),_:1})):h("",!0)]),_:1},8,["open","confirm-loading"])])}}},na=et(Vt,[["__scopeId","data-v-70813c86"]]);export{na as default};
@@ -1,2 +1,2 @@
1
- import{u as V}from"./ws-Bv7YH0VB.js";import{_ as A}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{a as k}from"./index-BbqCdQXU.js";import{Y as D,F as E}from"./icons-ukMaZ3tx.js";import{a as T,r as P,l as L,F as I,D as v,c as a,x as i,q as l,v as M,J as w,u as O,m as R,G as $,j as W}from"./vendor-BVetwVfk.js";import"./index-ZZ_4A9um.js";import"./useConfigInject-BKqJUQaF.js";import"./transition-CGYDOK3N.js";import"./Keyframes-C7fCrnlS.js";import"./Portal-CHsntPCQ.js";import"./index-U4Zd5IK6.js";const c=Object.freeze({rootPath:"",maxSizeMB:1e3,autoSync:!1,syncIntervalSeconds:300});function q(s){if(!s)return null;const e=s.trim();try{return JSON.parse(e)}catch{const o=e.match(/(\{[\s\S]*\}|\[[\s\S]*\])/);if(!o)return null;try{return JSON.parse(o[1])}catch{return null}}}function N(s){if(typeof s=="boolean")return s;const e=String(s).trim().toLowerCase();return e==="true"||e==="1"||e==="yes"||e==="on"}function B(s,e){if(typeof s=="number"&&Number.isFinite(s))return s;const o=parseFloat(s);return Number.isFinite(o)?o:e}function G(s){const e={...c};if(!s)return e;const o=s.trim();if(!o||/key not found/i.test(o))return e;const n=q(o);if(n&&typeof n=="object"&&!Array.isArray(n))return n.rootPath!==void 0&&(e.rootPath=String(n.rootPath||"")),n.maxSizeMB!==void 0&&(e.maxSizeMB=B(n.maxSizeMB,c.maxSizeMB)),n.autoSync!==void 0&&(e.autoSync=N(n.autoSync)),n.syncIntervalSeconds!==void 0&&(e.syncIntervalSeconds=B(n.syncIntervalSeconds,c.syncIntervalSeconds)),e;const r=o.split(`
1
+ import{u as V}from"./ws-Bv7YH0VB.js";import{_ as A}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{a as k}from"./index-BfKFNptm.js";import{Y as D,F as E}from"./icons-ukMaZ3tx.js";import{a as T,r as P,l as L,F as I,D as v,c as a,x as i,q as l,v as M,J as w,u as O,m as R,G as $,j as W}from"./vendor-BVetwVfk.js";import"./index-DfcXDy2A.js";import"./useConfigInject-DCcT0grw.js";import"./transition-DSe9CgZe.js";import"./Keyframes-C7fCrnlS.js";import"./Portal-CHsntPCQ.js";import"./index-U4Zd5IK6.js";const c=Object.freeze({rootPath:"",maxSizeMB:1e3,autoSync:!1,syncIntervalSeconds:300});function q(s){if(!s)return null;const e=s.trim();try{return JSON.parse(e)}catch{const o=e.match(/(\{[\s\S]*\}|\[[\s\S]*\])/);if(!o)return null;try{return JSON.parse(o[1])}catch{return null}}}function N(s){if(typeof s=="boolean")return s;const e=String(s).trim().toLowerCase();return e==="true"||e==="1"||e==="yes"||e==="on"}function B(s,e){if(typeof s=="number"&&Number.isFinite(s))return s;const o=parseFloat(s);return Number.isFinite(o)?o:e}function G(s){const e={...c};if(!s)return e;const o=s.trim();if(!o||/key not found/i.test(o))return e;const n=q(o);if(n&&typeof n=="object"&&!Array.isArray(n))return n.rootPath!==void 0&&(e.rootPath=String(n.rootPath||"")),n.maxSizeMB!==void 0&&(e.maxSizeMB=B(n.maxSizeMB,c.maxSizeMB)),n.autoSync!==void 0&&(e.autoSync=N(n.autoSync)),n.syncIntervalSeconds!==void 0&&(e.syncIntervalSeconds=B(n.syncIntervalSeconds,c.syncIntervalSeconds)),e;const r=o.split(`
2
2
  `);for(const u of r){const m=u.trim().match(/^(?:project\.)?(rootPath|maxSizeMB|autoSync|syncIntervalSeconds)\s*[=:]\s*(.+)$/i);if(!m)continue;const b=m[1],g=m[2].trim();b==="rootPath"?e.rootPath=g:b==="maxSizeMB"?e.maxSizeMB=B(g,c.maxSizeMB):b==="autoSync"?e.autoSync=N(g):b==="syncIntervalSeconds"&&(e.syncIntervalSeconds=B(g,c.syncIntervalSeconds))}return e}function F(s,e){const o={};for(const n of Object.keys(c))s[n]!==e[n]&&(o[n]=e[n]);return o}const Y={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},H={style:{color:"var(--text-primary)"}},K={key:0,style:{color:"#faad14","font-size":"12px","margin-left":"8px"}},Q={__name:"ProjectSettings",setup(s){const e=V(),o=P(!1),n=P(!1),r=T({...c}),u=P({...c}),h=W(()=>Object.keys(F(u.value,r)).length>0);async function m(){o.value=!0;try{const{output:d}=await e.execute("config get project",1e4),t=G(d);Object.assign(r,t),u.value={...t}}catch(d){/key not found/i.test(d.message)?(Object.assign(r,c),u.value={...c}):k.error("加载配置失败: "+d.message)}finally{o.value=!1}}function b(){Object.assign(r,u.value)}async function g(){const d=F(u.value,r),t=Object.keys(d);if(t.length===0){k.info("没有需要保存的修改");return}n.value=!0;let f=0,S=0;for(const _ of t){const p=d[_],j=String(p).replace(/"/g,'\\"'),z=`config set project.${_} "${j}"`;try{const{output:x,exitCode:C}=await e.execute(z,1e4);C!==0||/error|failed|失败/i.test(x)?(S++,k.error(`保存 ${_} 失败: ${x.slice(0,80)}`)):f++}catch(x){S++,k.error(`保存 ${_} 失败: ${x.message}`)}}n.value=!1,S===0?(k.success(`保存成功(${f} 项)`),u.value={...r}):f>0&&(k.warning(`部分保存成功:${f} 成功 / ${S} 失败`),await m())}return L(()=>{m()}),(d,t)=>{const f=l("a-button"),S=l("a-alert"),_=l("a-input"),p=l("a-form-item"),j=l("a-input-number"),z=l("a-switch"),x=l("a-space"),C=l("a-form"),J=l("a-spin"),U=l("a-card");return M(),I("div",null,[v("div",Y,[t[5]||(t[5]=v("div",null,[v("h2",{class:"page-title"},"项目存储配置"),v("p",{class:"page-sub"},"根目录 / 配额 / 自动同步")],-1)),a(f,{loading:o.value,onClick:m},{icon:i(()=>[a(O(D))]),default:i(()=>[t[4]||(t[4]=w(" 刷新 ",-1))]),_:1},8,["loading"])]),a(S,{message:"仅 Web 模式",description:"目录选择器(原生文件对话框)仅在桌面端可用,本页面需手动输入路径。修改根目录后需重启桌面应用生效;web 端只影响后端配置文件。",type:"info","show-icon":"",closable:"",style:{"margin-bottom":"16px"}}),a(U,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{title:i(()=>[v("span",H,[a(O(E),{style:{"margin-right":"8px"}}),t[6]||(t[6]=w("项目存储 ",-1))])]),default:i(()=>[a(J,{spinning:o.value},{default:i(()=>[a(C,{"label-col":{span:6},"wrapper-col":{span:18},style:{"max-width":"720px"}},{default:i(()=>[a(p,{label:"项目根目录"},{extra:i(()=>[...t[7]||(t[7]=[v("span",{style:{color:"var(--text-muted)","font-size":"11px"}}," 需绝对路径;修改后重启桌面应用生效 ",-1)])]),default:i(()=>[a(_,{value:r.rootPath,"onUpdate:value":t[0]||(t[0]=y=>r.rootPath=y),placeholder:"项目文件存储的根目录绝对路径",disabled:n.value},null,8,["value","disabled"])]),_:1}),a(p,{label:"最大项目大小"},{default:i(()=>[a(j,{value:r.maxSizeMB,"onUpdate:value":t[1]||(t[1]=y=>r.maxSizeMB=y),min:100,max:1e4,step:100,"addon-after":"MB",style:{width:"220px"},disabled:n.value},null,8,["value","disabled"])]),_:1}),a(p,{label:"自动同步"},{default:i(()=>[a(z,{checked:r.autoSync,"onUpdate:checked":t[2]||(t[2]=y=>r.autoSync=y),disabled:n.value},null,8,["checked","disabled"]),t[8]||(t[8]=v("span",{style:{"margin-left":"12px",color:"var(--text-secondary)","font-size":"12px"}}," 自动同步项目到后端服务器 ",-1))]),_:1}),r.autoSync?(M(),R(p,{key:0,label:"同步间隔"},{default:i(()=>[a(j,{value:r.syncIntervalSeconds,"onUpdate:value":t[3]||(t[3]=y=>r.syncIntervalSeconds=y),min:60,max:3600,step:60,"addon-after":"秒",style:{width:"220px"},disabled:n.value},null,8,["value","disabled"])]),_:1})):$("",!0),a(p,{"wrapper-col":{offset:6,span:18}},{default:i(()=>[a(x,null,{default:i(()=>[a(f,{onClick:b,disabled:n.value||o.value},{default:i(()=>[...t[9]||(t[9]=[w(" 重置 ",-1)])]),_:1},8,["disabled"]),a(f,{type:"primary",loading:n.value,disabled:!h.value,onClick:g},{default:i(()=>[...t[10]||(t[10]=[w(" 保存配置 ",-1)])]),_:1},8,["loading","disabled"]),h.value?(M(),I("span",K," 有未保存的修改 ")):$("",!0)]),_:1})]),_:1})]),_:1})]),_:1},8,["spinning"])]),_:1})])}}},ce=A(Q,[["__scopeId","data-v-17603429"]]);export{ce as default};
@@ -1,2 +1,2 @@
1
- import{k as Q,r as T,l as X,F as N,D as i,c as s,x as l,u as g,m as K,G as B,H as Z,L as ee,q as u,a as te,v as y,J as x,I as M,E as oe}from"./vendor-BVetwVfk.js";import{u as A}from"./ws-Bv7YH0VB.js";import{a as ae,b as se}from"./parsers-DftYMnlk.js";import{_ as le}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{a as _}from"./index-BbqCdQXU.js";import{Y as V}from"./icons-ukMaZ3tx.js";import"./index-ZZ_4A9um.js";import"./useConfigInject-BKqJUQaF.js";import"./transition-CGYDOK3N.js";import"./Keyframes-C7fCrnlS.js";import"./Portal-CHsntPCQ.js";import"./index-U4Zd5IK6.js";const re=Q("providers",()=>{const I=T(!1),n=T(null),m=T([]),P=T([]),c=T(null);async function t(){const v=A();I.value=!0;try{const{output:k}=await v.execute("llm providers",15e3);m.value=ae(k);const b=m.value.find(C=>C.active);b&&(c.value=b.name);const{output:w}=await v.execute("llm models",15e3);P.value=se(w)}catch(k){console.error("Failed to load providers:",k)}finally{I.value=!1}}async function d(v){await A().execute(`llm switch ${v}`,1e4),m.value.forEach(b=>b.active=b.name===v),c.value=v}async function F(v){const k=A();n.value=v;try{const{output:b,exitCode:w}=await k.execute("llm test",3e4),C=m.value.find(O=>O.name===v);return C&&(C.status=w===0?"ok":"error"),w===0}catch{const b=m.value.find(w=>w.name===v);return b&&(b.status="error"),!1}finally{n.value=null}}return{loading:I,testing:n,providers:m,localModels:P,activeProvider:c,loadProviders:t,switchProvider:d,testProvider:F}}),ie={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},ne={key:1,style:{"text-align":"center",padding:"60px"}},de={key:2},ue={class:"providers-grid"},ce={style:{display:"flex","align-items":"center",gap:"12px","margin-bottom":"12px"}},pe={style:{"font-size":"24px"}},me={style:{flex:"1"}},ve={style:{color:"#e0e0e0","font-weight":"500"}},fe={style:{color:"var(--text-secondary)","font-size":"11px","font-family":"monospace"}},ge={style:{display:"flex",gap:"8px","justify-content":"flex-end"}},ye={key:0,style:{"margin-top":"24px"}},be={style:{color:"#ccc","font-family":"monospace","font-size":"13px"}},xe={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"16px"}},_e={class:"config-grid"},ke={style:{display:"flex","align-items":"center",gap:"12px"}},we={style:{display:"flex",gap:"12px","justify-content":"flex-end","margin-top":"16px"}},he={__name:"Providers",setup(I){const n=re(),m=A(),P=T(!1),c=T(!1),t=te({provider:void 0,model:"",apiKey:"",baseUrl:"",temperature:.7,maxTokens:4096});let d={};const F=["ollama","openai","anthropic","volcengine","deepseek","gemini","groq","mistral","custom","zhipu"],v={ollama:"Ollama(本地)",openai:"OpenAI",anthropic:"Anthropic",volcengine:"火山引擎(豆包)",deepseek:"DeepSeek",gemini:"Google Gemini",groq:"Groq",mistral:"Mistral",custom:"Custom(自定义)",zhipu:"智谱 AI"},k=F.map(a=>({value:a,label:v[a]||a}));async function b(a){try{await n.switchProvider(a),_.success(`已切换到 ${a}`)}catch(e){_.error(`切换失败: ${e.message}`)}}async function w(a){await n.testProvider(a)?_.success(`${a} 连接正常`):_.warning(`${a} 连接失败,请检查配置`)}function C(a){const e={};if(!a)return e;try{const U=JSON.parse(a.trim()),p=U.llm||U;return p.provider&&(e.provider=p.provider),p.model&&(e.model=p.model),p.apiKey&&(e.apiKey=p.apiKey),p.baseUrl&&(e.baseUrl=p.baseUrl),p.temperature!==void 0&&(e.temperature=Number(p.temperature)),p.maxTokens!==void 0&&(e.maxTokens=Number(p.maxTokens)),e}catch{}const r=a.split(`
1
+ import{k as Q,r as T,l as X,F as N,D as i,c as s,x as l,u as g,m as K,G as B,H as Z,L as ee,q as u,a as te,v as y,J as x,I as M,E as oe}from"./vendor-BVetwVfk.js";import{u as A}from"./ws-Bv7YH0VB.js";import{a as ae,b as se}from"./parsers-DftYMnlk.js";import{_ as le}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{a as _}from"./index-BfKFNptm.js";import{Y as V}from"./icons-ukMaZ3tx.js";import"./index-DfcXDy2A.js";import"./useConfigInject-DCcT0grw.js";import"./transition-DSe9CgZe.js";import"./Keyframes-C7fCrnlS.js";import"./Portal-CHsntPCQ.js";import"./index-U4Zd5IK6.js";const re=Q("providers",()=>{const I=T(!1),n=T(null),m=T([]),P=T([]),c=T(null);async function t(){const v=A();I.value=!0;try{const{output:k}=await v.execute("llm providers",15e3);m.value=ae(k);const b=m.value.find(C=>C.active);b&&(c.value=b.name);const{output:w}=await v.execute("llm models",15e3);P.value=se(w)}catch(k){console.error("Failed to load providers:",k)}finally{I.value=!1}}async function d(v){await A().execute(`llm switch ${v}`,1e4),m.value.forEach(b=>b.active=b.name===v),c.value=v}async function F(v){const k=A();n.value=v;try{const{output:b,exitCode:w}=await k.execute("llm test",3e4),C=m.value.find(O=>O.name===v);return C&&(C.status=w===0?"ok":"error"),w===0}catch{const b=m.value.find(w=>w.name===v);return b&&(b.status="error"),!1}finally{n.value=null}}return{loading:I,testing:n,providers:m,localModels:P,activeProvider:c,loadProviders:t,switchProvider:d,testProvider:F}}),ie={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},ne={key:1,style:{"text-align":"center",padding:"60px"}},de={key:2},ue={class:"providers-grid"},ce={style:{display:"flex","align-items":"center",gap:"12px","margin-bottom":"12px"}},pe={style:{"font-size":"24px"}},me={style:{flex:"1"}},ve={style:{color:"#e0e0e0","font-weight":"500"}},fe={style:{color:"var(--text-secondary)","font-size":"11px","font-family":"monospace"}},ge={style:{display:"flex",gap:"8px","justify-content":"flex-end"}},ye={key:0,style:{"margin-top":"24px"}},be={style:{color:"#ccc","font-family":"monospace","font-size":"13px"}},xe={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"16px"}},_e={class:"config-grid"},ke={style:{display:"flex","align-items":"center",gap:"12px"}},we={style:{display:"flex",gap:"12px","justify-content":"flex-end","margin-top":"16px"}},he={__name:"Providers",setup(I){const n=re(),m=A(),P=T(!1),c=T(!1),t=te({provider:void 0,model:"",apiKey:"",baseUrl:"",temperature:.7,maxTokens:4096});let d={};const F=["ollama","openai","anthropic","volcengine","deepseek","gemini","groq","mistral","custom","zhipu"],v={ollama:"Ollama(本地)",openai:"OpenAI",anthropic:"Anthropic",volcengine:"火山引擎(豆包)",deepseek:"DeepSeek",gemini:"Google Gemini",groq:"Groq",mistral:"Mistral",custom:"Custom(自定义)",zhipu:"智谱 AI"},k=F.map(a=>({value:a,label:v[a]||a}));async function b(a){try{await n.switchProvider(a),_.success(`已切换到 ${a}`)}catch(e){_.error(`切换失败: ${e.message}`)}}async function w(a){await n.testProvider(a)?_.success(`${a} 连接正常`):_.warning(`${a} 连接失败,请检查配置`)}function C(a){const e={};if(!a)return e;try{const U=JSON.parse(a.trim()),p=U.llm||U;return p.provider&&(e.provider=p.provider),p.model&&(e.model=p.model),p.apiKey&&(e.apiKey=p.apiKey),p.baseUrl&&(e.baseUrl=p.baseUrl),p.temperature!==void 0&&(e.temperature=Number(p.temperature)),p.maxTokens!==void 0&&(e.maxTokens=Number(p.maxTokens)),e}catch{}const r=a.split(`
2
2
  `);for(const U of r){const z=U.trim().match(/^(?:llm\.)?(\w+)\s*[=:]\s*(.+)$/i);if(!z)continue;const[,S,j]=z,f=j.trim(),h=S.toLowerCase();if(h==="provider"&&f)e.provider=f;else if(h==="model"&&f)e.model=f;else if(h==="apikey"&&f)f.includes("***")||(e.apiKey=f);else if(h==="baseurl")e.baseUrl=f;else if(h==="temperature"){const $=parseFloat(f);isNaN($)||(e.temperature=$)}else if(h==="maxtokens"){const $=parseInt(f,10);isNaN($)||(e.maxTokens=$)}}return e}async function O(){P.value=!0;try{const{output:a}=await m.execute("config list",15e3),e=C(a);e.provider&&(t.provider=e.provider),e.model&&(t.model=e.model),e.apiKey&&(t.apiKey=e.apiKey),e.baseUrl&&(t.baseUrl=e.baseUrl),e.temperature!==void 0&&(t.temperature=e.temperature),e.maxTokens!==void 0&&(t.maxTokens=e.maxTokens),d={...t},_.success("配置已加载")}catch(a){_.error(`加载配置失败: ${a.message}`)}finally{P.value=!1}}async function D(){c.value=!0;const a=[],e=[];try{if(t.provider&&t.provider!==d.provider)try{await m.execute(`config set llm.provider ${t.provider}`,1e4),e.push("provider")}catch(r){a.push(`provider: ${r.message}`)}if(t.model&&t.model!==d.model)try{await m.execute(`config set llm.model ${t.model}`,1e4),e.push("model")}catch(r){a.push(`model: ${r.message}`)}if(t.apiKey&&t.apiKey!==d.apiKey)try{await m.execute(`config set llm.apiKey ${t.apiKey}`,1e4),e.push("apiKey")}catch(r){a.push(`apiKey: ${r.message}`)}if(t.baseUrl!==void 0&&t.baseUrl!==d.baseUrl)try{await m.execute(`config set llm.baseUrl ${t.baseUrl}`,1e4),e.push("baseUrl")}catch(r){a.push(`baseUrl: ${r.message}`)}if(t.temperature!==d.temperature)try{await m.execute(`config set llm.temperature ${t.temperature}`,1e4),e.push("temperature")}catch(r){a.push(`temperature: ${r.message}`)}if(t.maxTokens!==d.maxTokens)try{await m.execute(`config set llm.maxTokens ${t.maxTokens}`,1e4),e.push("maxTokens")}catch(r){a.push(`maxTokens: ${r.message}`)}a.length>0?_.warning(`部分配置保存失败: ${a.join("; ")}`):e.length>0?(_.success(`已保存 ${e.length} 项配置`),d={...t},e.includes("provider")&&n.loadProviders()):_.info("没有检测到配置变更")}catch(r){_.error(`保存配置失败: ${r.message}`)}finally{c.value=!1}}function E(){t.provider=d.provider||void 0,t.model=d.model||"",t.apiKey=d.apiKey||"",t.baseUrl=d.baseUrl||"",t.temperature=d.temperature??.7,t.maxTokens=d.maxTokens??4096}return X(()=>{n.loadProviders(),O()}),(a,e)=>{const r=u("a-button"),U=u("a-alert"),p=u("a-spin"),z=u("a-tag"),S=u("a-badge"),j=u("a-card"),f=u("a-list-item"),h=u("a-list"),$=u("a-divider"),J=u("a-select"),L=u("a-form-item"),q=u("a-input"),R=u("a-input-password"),H=u("a-slider"),G=u("a-input-number"),W=u("a-form");return y(),N("div",null,[i("div",ie,[e[9]||(e[9]=i("div",null,[i("h2",{class:"page-title"},"LLM 配置"),i("p",{class:"page-sub"},"管理 AI 服务提供商")],-1)),s(r,{type:"primary",ghost:"",loading:g(n).loading,onClick:e[0]||(e[0]=o=>g(n).loadProviders())},{icon:l(()=>[s(g(V))]),default:l(()=>[e[8]||(e[8]=x(" 刷新 ",-1))]),_:1},8,["loading"])]),g(n).activeProvider?(y(),K(U,{key:0,type:"success",style:{"margin-bottom":"20px",background:"rgba(41,162,112,.08)","border-color":"rgba(41,162,112,.3)"},"show-icon":""},{message:l(()=>[i("span",null,[e[10]||(e[10]=x("当前激活:",-1)),i("strong",null,M(g(n).activeProvider),1)])]),_:1})):B("",!0),g(n).loading?(y(),N("div",ne,[s(p,{size:"large"}),e[11]||(e[11]=i("div",{style:{color:"var(--text-muted)","margin-top":"12px"}},"加载 LLM 信息中...",-1))])):(y(),N("div",de,[i("div",ue,[(y(!0),N(Z,null,ee(g(n).providers,o=>(y(),K(j,{key:o.name,class:oe(["provider-card",{active:o.active}]),style:{background:"var(--bg-card)"},size:"small"},{default:l(()=>[i("div",ce,[i("span",pe,M(o.icon),1),i("div",me,[i("div",ve,M(o.label),1),i("div",fe,M(o.name),1)]),i("div",null,[o.active?(y(),K(z,{key:0,color:"green"},{default:l(()=>[...e[12]||(e[12]=[x("活跃",-1)])]),_:1})):o.status==="ok"?(y(),K(S,{key:1,status:"success",text:""})):o.status==="error"?(y(),K(S,{key:2,status:"error",text:""})):B("",!0)])]),i("div",ge,[s(r,{size:"small",style:{background:"var(--bg-card-hover)","border-color":"var(--border-color)"},loading:g(n).testing===o.name,onClick:Y=>w(o.name)},{default:l(()=>[...e[13]||(e[13]=[x(" 测试 ",-1)])]),_:1},8,["loading","onClick"]),o.active?(y(),K(z,{key:1,color:"green",style:{margin:"0","line-height":"24px"}},{default:l(()=>[...e[15]||(e[15]=[x("当前",-1)])]),_:1})):(y(),K(r,{key:0,size:"small",type:"primary",ghost:"",onClick:Y=>b(o.name)},{default:l(()=>[...e[14]||(e[14]=[x(" 切换 ",-1)])]),_:1},8,["onClick"]))])]),_:2},1032,["class"]))),128))]),g(n).localModels.length?(y(),N("div",ye,[e[16]||(e[16]=i("h3",{style:{color:"#ccc","font-size":"15px","margin-bottom":"12px"}}," 本地模型(Ollama) ",-1)),s(h,{"data-source":g(n).localModels,size:"small",style:{background:"var(--bg-card)","border-radius":"8px",border:"1px solid var(--border-color)"}},{renderItem:l(({item:o})=>[s(f,{style:{padding:"10px 16px","border-color":"#252525"}},{actions:l(()=>[s(z,{color:"cyan",style:{"font-size":"10px"}},{default:l(()=>[x(M(o.size||"local"),1)]),_:2},1024)]),default:l(()=>[i("span",be,M(o.name),1)]),_:2},1024)]),_:1},8,["data-source"])])):B("",!0),s($,{style:{"border-color":"var(--border-color)",margin:"32px 0 24px"}}),i("div",xe,[e[18]||(e[18]=i("h3",{class:"section-title"},"LLM 参数设置",-1)),s(r,{size:"small",loading:P.value,onClick:O,style:{background:"var(--bg-card-hover)","border-color":"var(--border-color)"}},{icon:l(()=>[s(g(V))]),default:l(()=>[e[17]||(e[17]=x(" 加载配置 ",-1))]),_:1},8,["loading"])]),s(j,{class:"config-card",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:l(()=>[s(W,{model:t,layout:"vertical",class:"config-form"},{default:l(()=>[i("div",_e,[s(L,{label:"Provider(提供商)"},{default:l(()=>[s(J,{value:t.provider,"onUpdate:value":e[1]||(e[1]=o=>t.provider=o),placeholder:"选择 LLM 提供商",options:g(k),style:{width:"100%"},disabled:c.value},null,8,["value","options","disabled"])]),_:1}),s(L,{label:"Model(模型名称)"},{default:l(()=>[s(q,{value:t.model,"onUpdate:value":e[2]||(e[2]=o=>t.model=o),placeholder:"例如 doubao-seed-1-6-251015","allow-clear":"",disabled:c.value},null,8,["value","disabled"])]),_:1}),s(L,{label:"API Key"},{default:l(()=>[s(R,{value:t.apiKey,"onUpdate:value":e[3]||(e[3]=o=>t.apiKey=o),placeholder:"输入 API Key",disabled:c.value},null,8,["value","disabled"])]),_:1}),s(L,{label:"Base URL"},{default:l(()=>[s(q,{value:t.baseUrl,"onUpdate:value":e[4]||(e[4]=o=>t.baseUrl=o),placeholder:"例如 https://ark.cn-beijing.volces.com/api/v3","allow-clear":"",disabled:c.value},null,8,["value","disabled"])]),_:1}),s(L,{label:"Temperature(温度)"},{default:l(()=>[i("div",ke,[s(H,{value:t.temperature,"onUpdate:value":e[5]||(e[5]=o=>t.temperature=o),min:0,max:2,step:.1,style:{flex:"1"},disabled:c.value},null,8,["value","disabled"]),s(G,{value:t.temperature,"onUpdate:value":e[6]||(e[6]=o=>t.temperature=o),min:0,max:2,step:.1,precision:1,style:{width:"80px"},disabled:c.value},null,8,["value","disabled"])])]),_:1}),s(L,{label:"Max Tokens(最大输出长度)"},{default:l(()=>[s(G,{value:t.maxTokens,"onUpdate:value":e[7]||(e[7]=o=>t.maxTokens=o),min:256,max:128e3,step:256,style:{width:"100%"},placeholder:"4096",disabled:c.value},null,8,["value","disabled"])]),_:1})]),i("div",we,[s(r,{onClick:E,disabled:c.value,style:{background:"var(--bg-card-hover)","border-color":"var(--border-color)"}},{default:l(()=>[...e[19]||(e[19]=[x(" 重置 ",-1)])]),_:1},8,["disabled"]),s(r,{type:"primary",loading:c.value,onClick:D},{default:l(()=>[...e[20]||(e[20]=[x(" 保存配置 ",-1)])]),_:1},8,["loading"])])]),_:1},8,["model"])]),_:1})]))])}}},Se=le(he,[["__scopeId","data-v-38d68389"]]);export{Se as default};
@@ -1 +1 @@
1
- import{u as qe}from"./ws-Bv7YH0VB.js";import{s as He}from"./community-parser-CO25nZFt.js";import{_ as Qe}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{a as m}from"./index-BbqCdQXU.js";import{Y as Xe,al as Ze,aG as et,B as tt,aE as ge,K as _e,aH as ot,av as nt,ad as at}from"./icons-ukMaZ3tx.js";import{E as st}from"./useConfigInject-BKqJUQaF.js";import{l as lt,F as y,D as x,c as n,x as o,q as p,r as h,v as i,J as d,u as v,m as g,G as _,H as I,L as K,N as rt,I as f,j as it,a as ut}from"./vendor-BVetwVfk.js";import"./index-ZZ_4A9um.js";import"./transition-CGYDOK3N.js";import"./Keyframes-C7fCrnlS.js";import"./Portal-CHsntPCQ.js";import"./index-U4Zd5IK6.js";function F(s){const l=He(s);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}}const ke=Object.freeze(["note","post","article","document"]),ct=Object.freeze(["pending","viewed","dismissed"]);function S(s,l=0){return typeof s=="number"&&Number.isFinite(s)?s:l}function be(s){if(!s||typeof s!="object"||Array.isArray(s))return{};const l={};for(const[r,C]of Object.entries(s))typeof C=="number"&&Number.isFinite(C)&&(l[r]=C);return l}function dt(s,l=0){if(!s||typeof s!="object")return null;const r=s.user_id??s.userId??"";if(!r)return null;const C=s.topics&&typeof s.topics=="object"&&!Array.isArray(s.topics)?be(s.topics):{},$=s.interaction_weights??s.interactionWeights,E=$&&typeof $=="object"&&!Array.isArray($)?be($):{};return{key:r,id:String(s.id||""),userId:r,topics:C,topicCount:Object.keys(C).length,interactionWeights:E,decayFactor:S(s.decay_factor??s.decayFactor,.9),lastUpdated:s.last_updated??s.lastUpdated??null,updateCount:S(s.update_count??s.updateCount,0),_idx:l}}function pt(s){const l=F(s);return Array.isArray(l)?l.map(dt).filter(Boolean):[]}function ft(s,l=0){if(!s||typeof s!="object")return null;const r=s.id||"";return r?{key:r,id:r,userId:s.user_id??s.userId??"",contentId:s.content_id??s.contentId??"",contentType:String(s.content_type??s.contentType??"note").toLowerCase(),title:String(s.title||""),score:S(s.score,0),reason:String(s.reason||""),source:String(s.source||"heuristic"),status:String(s.status||"pending").toLowerCase(),feedback:s.feedback??null,createdAt:s.created_at??s.createdAt??null,viewedAt:s.viewed_at??s.viewedAt??null,_idx:l}:null}function mt(s){const l=F(s);return Array.isArray(l)?l.map(ft).filter(Boolean):[]}const yt={total:0,pending:0,viewed:0,dismissed:0,feedbackCount:0,feedbackRate:0,avgScore:0};function vt(s){const l={...yt},r=F(s);return!r||typeof r!="object"||Array.isArray(r)||(l.total=S(r.total,0),l.pending=S(r.pending,0),l.viewed=S(r.viewed,0),l.dismissed=S(r.dismissed,0),l.feedbackCount=S(r.feedbackCount,0),l.feedbackRate=S(r.feedbackRate,0),l.avgScore=S(r.avgScore,0)),l}function gt(s){const l=F(s);return Array.isArray(l)?l.filter(r=>r&&typeof r=="object"&&typeof r.topic=="string").map((r,C)=>({key:`${r.topic}-${C}`,topic:r.topic,weight:S(r.weight,0)})):[]}function _t(s){const l=F(s);return Array.isArray(l)?l.filter(r=>r&&typeof r=="object"&&typeof r.topic=="string"&&typeof r.action=="string").map((r,C)=>({key:`${r.topic}-${C}`,topic:r.topic,action:r.action,amount:S(r.amount,0)})):[]}function U(s){const l=F(s);return!l||typeof l!="object"||Array.isArray(l)?{ok:!1,reason:"",profileId:null,topicCount:null}:{ok:!!(l.updated||l.deleted||l.marked||l.dismissed||l.recorded||l.applied||l.profileId),reason:l.reason?String(l.reason):"",profileId:l.profileId?String(l.profileId):null,topicCount:typeof l.topicCount=="number"?l.topicCount:null}}function xe(s){if(s==null||s==="")return"—";const l=typeof s=="number"?new Date(s):new Date(String(s));return isNaN(l.getTime())?String(s):l.toLocaleString("zh-CN",{hour12:!1})}const kt={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},bt={style:{display:"flex","align-items":"center",gap:"12px","flex-wrap":"wrap"}},xt={class:"type-name"},Ct={class:"filter-bar"},ht={style:{color:"var(--text-primary)","font-weight":"500"}},wt={style:{color:"var(--text-muted)","font-size":"11px","margin-top":"2px"}},St={key:3,style:{color:"var(--text-secondary)","font-size":"12px"}},zt={key:1,style:{color:"var(--text-muted)"}},It={style:{padding:"40px",color:"var(--text-muted)","text-align":"center"}},$t={key:0,style:{color:"var(--text-primary)","font-family":"monospace","font-weight":"500"}},At={key:2,style:{color:"var(--text-secondary)","font-family":"monospace","font-size":"12px"}},jt={key:3,style:{color:"var(--text-secondary)"}},Ot={key:4,style:{color:"var(--text-secondary)","font-size":"11px"}},Jt={style:{padding:"40px",color:"var(--text-muted)","text-align":"center"}},Tt={key:1},Rt={class:"interest-topic"},Nt={style:{"margin-left":"8px","font-family":"monospace",color:"var(--text-primary)"}},Ut={style:{"margin-left":"auto",color:"var(--text-secondary)","font-size":"12px"}},Ft={key:0,style:{"padding-top":"8px"}},Et={style:{"font-family":"monospace","font-size":"12px"}},Dt={key:1},Pt={class:"interest-topic"},Lt={key:2,style:{color:"var(--text-primary)","font-size":"13px",margin:"16px 0 8px"}},Mt={key:3,class:"weights-pre"},Bt={__name:"Recommend",setup(s){const l=qe(),r=st.PRESENTED_IMAGE_SIMPLE,C=h(!1),$=h(!1),E=h(!1),D=h([]),X=h([]),A=h({total:0,pending:0,viewed:0,dismissed:0,feedbackCount:0,feedbackRate:0,avgScore:0}),Y=h([]),T=h([]),k=h(null),q=h("recs"),P=h(""),L=h(""),H=h(!1),Z=h(!1),b=ut({userId:"",topicsJson:"",weightsJson:""}),w=h(null),Ce=[{title:"标题",key:"title"},{title:"类型",key:"contentType",width:"110px"},{title:"评分",key:"score",width:"180px"},{title:"理由",key:"reason",width:"220px"},{title:"状态",key:"status",width:"100px"},{title:"反馈",key:"feedback",width:"90px"},{title:"操作",key:"action",width:"210px"}],he=[{title:"用户 ID",key:"userId"},{title:"主题数",key:"topicCount",width:"110px"},{title:"衰减因子",key:"decayFactor",width:"110px"},{title:"更新次数",key:"updateCount",width:"110px"},{title:"最后更新",key:"lastUpdated",width:"180px"},{title:"操作",key:"action",width:"200px"}],we=it(()=>{let t=X.value;return P.value&&(t=t.filter(e=>e.status===P.value)),L.value&&(t=t.filter(e=>e.contentType===L.value)),t});function se(t){return{note:"笔记",post:"帖子",article:"文章",document:"文档"}[t]||t}function le(t){return{note:"blue",post:"green",article:"purple",document:"orange"}[t]||"default"}function Se(t){return{note:"#1677ff",post:"#52c41a",article:"#722ed1",document:"#fa8c16"}[t]||"#888"}function re(t){return{pending:"待查看",viewed:"已查看",dismissed:"已忽略"}[t]||t}function ze(t){return{pending:"processing",viewed:"green",dismissed:"default"}[t]||"default"}function Ie(t){return{like:"赞",dislike:"踩",later:"稍后"}[t]||t}function $e(t){return{like:"green",dislike:"red",later:"gold"}[t]||"default"}function ie(t){return t>=.7?"#52c41a":t>=.4?"#1677ff":t>=.2?"#faad14":"#ff4d4f"}function ue(t){return t>=.7?"#52c41a":t>=.4?"#1677ff":t>=.2?"#faad14":"#888"}function Ae(t){try{return JSON.stringify(t,null,2)}catch{return String(t)}}async function M(){C.value=!0;try{const{output:t}=await l.execute("recommend profiles --json",1e4).catch(()=>({output:""}));D.value=pt(t),k.value&&!D.value.find(e=>e.userId===k.value)&&(k.value=null),k.value&&await J()}catch(t){m.error("加载档案失败: "+(t?.message||t))}finally{C.value=!1}}async function J(){if(!k.value){X.value=[],A.value={total:0,pending:0,viewed:0,dismissed:0,feedbackCount:0,feedbackRate:0,avgScore:0},Y.value=[];return}$.value=!0;try{const t=B(k.value),[e,u,j]=await Promise.all([l.execute(`recommend list ${t} --limit 200 --json`,1e4).catch(()=>({output:""})),l.execute(`recommend stats ${t} --json`,8e3).catch(()=>({output:""})),l.execute(`recommend top-interests ${t} --limit 30 --json`,8e3).catch(()=>({output:""}))]);X.value=mt(e.output),A.value=vt(u.output),Y.value=gt(j.output)}catch(t){m.error("加载用户数据失败: "+(t?.message||t))}finally{$.value=!1}}function B(t){return`"${String(t).replace(/"/g,'\\"')}"`}function je(){T.value=[],J()}function Oe(t){k.value=t,q.value="recs",J()}async function Je(){if(!b.userId.trim()){m.warning("请填写用户 ID");return}if(b.topicsJson.trim())try{JSON.parse(b.topicsJson)}catch{m.warning("主题权重 JSON 格式错误");return}if(b.weightsJson.trim())try{JSON.parse(b.weightsJson)}catch{m.warning("交互权重 JSON 格式错误");return}E.value=!0;try{const t=[`recommend create-profile ${B(b.userId.trim())}`];b.topicsJson.trim()&&t.push(`-t ${ce(b.topicsJson.trim())}`),b.weightsJson.trim()&&t.push(`-w ${ce(b.weightsJson.trim())}`),t.push("--json");const{output:e}=await l.execute(t.join(" "),1e4),u=U(e);if(!u.ok){m.error("创建失败: "+(u.reason||e.slice(0,120)));return}m.success(`档案已创建:${u.profileId?.slice(0,8)||""}`),H.value=!1;const j=b.userId.trim();de(),await M(),k.value=j,await J()}catch(t){m.error("创建失败: "+(t?.message||t))}finally{E.value=!1}}function ce(t){return`'${String(t).replace(/'/g,"'\\''")}'`}async function Te(){if(k.value)try{const{output:t}=await l.execute(`recommend decay ${B(k.value)} --json`,8e3),e=U(t);if(!e.ok){m.error("衰减失败: "+(e.reason||t.slice(0,120)));return}m.success(e.topicCount!==null?`衰减已应用,剩余 ${e.topicCount} 个主题`:"衰减已应用"),await M()}catch(t){m.error("衰减失败: "+(t?.message||t))}}async function Re(){if(k.value)try{const{output:t}=await l.execute(`recommend suggest ${B(k.value)} --json`,8e3);T.value=_t(t),q.value="interests",T.value.length?m.success(`找到 ${T.value.length} 条建议`):m.info("暂无建议 — 需要更多反馈")}catch(t){m.error("加载建议失败: "+(t?.message||t))}}async function Ne(t){try{const{output:e}=await l.execute(`recommend delete-profile ${B(t.userId)} --json`,8e3),u=U(e);if(!u.ok){m.error("删除失败: "+(u.reason||e.slice(0,120)));return}m.success("档案已删除"),k.value===t.userId&&(k.value=null),await M()}catch(e){m.error("删除失败: "+(e?.message||e))}}function Ue(t){w.value=t,Z.value=!0}async function Fe(t){try{const{output:e}=await l.execute(`recommend view ${t.id} --json`,8e3),u=U(e);if(!u.ok){m.error("标记失败: "+(u.reason||e.slice(0,120)));return}m.success("已标记为已查看"),await J()}catch(e){m.error("标记失败: "+(e?.message||e))}}async function Ee(t,e){try{const{output:u}=await l.execute(`recommend feedback ${t.id} ${e} --json`,8e3),j=U(u);if(!j.ok){m.error("反馈失败: "+(j.reason||u.slice(0,120)));return}m.success("反馈已记录"),await J()}catch(u){m.error("反馈失败: "+(u?.message||u))}}async function De(t){try{const{output:e}=await l.execute(`recommend dismiss ${t.id} --json`,8e3),u=U(e);if(!u.ok){m.error("忽略失败: "+(u.reason||e.slice(0,120)));return}m.success("已忽略"),await J()}catch(e){m.error("忽略失败: "+(e?.message||e))}}function de(){b.userId="",b.topicsJson="",b.weightsJson=""}return lt(M),(t,e)=>{const u=p("a-button"),j=p("a-space"),Pe=p("a-select"),z=p("a-card"),W=p("a-statistic"),O=p("a-col"),ee=p("a-row"),R=p("a-tag"),Q=p("a-radio-button"),pe=p("a-radio-group"),V=p("a-empty"),te=p("a-progress"),oe=p("a-menu-item"),Le=p("a-menu"),Me=p("a-dropdown"),fe=p("a-popconfirm"),me=p("a-table"),ne=p("a-tab-pane"),Be=p("a-list-item"),We=p("a-list"),Ve=p("a-tabs"),Ge=p("a-input"),ae=p("a-form-item"),ye=p("a-textarea"),Ke=p("a-form"),ve=p("a-modal"),G=p("a-descriptions-item"),Ye=p("a-descriptions");return i(),y("div",null,[x("div",kt,[e[12]||(e[12]=x("div",null,[x("h2",{class:"page-title"},"智能推荐"),x("p",{class:"page-sub"},"兴趣画像 · 主题衰减 · 内容评分 · 反馈学习")],-1)),n(j,null,{default:o(()=>[n(u,{loading:C.value,onClick:M},{icon:o(()=>[n(v(Xe))]),default:o(()=>[e[10]||(e[10]=d(" 刷新 ",-1))]),_:1},8,["loading"]),n(u,{type:"primary",onClick:e[0]||(e[0]=a=>H.value=!0)},{icon:o(()=>[n(v(Ze))]),default:o(()=>[e[11]||(e[11]=d(" 创建画像 ",-1))]),_:1})]),_:1})]),n(z,{size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"16px"},"body-style":{padding:"10px 16px"}},{default:o(()=>[x("div",bt,[e[15]||(e[15]=x("span",{style:{color:"var(--text-secondary)","font-size":"12px"}},"当前用户:",-1)),n(Pe,{value:k.value,"onUpdate:value":e[1]||(e[1]=a=>k.value=a),options:D.value.map(a=>({value:a.userId,label:`${a.userId} (${a.topicCount} topics)`})),placeholder:"选择用户档案",style:{"min-width":"280px"},"allow-clear":"","show-search":"",onChange:je},null,8,["value","options"]),k.value?(i(),g(u,{key:0,size:"small",onClick:Te},{icon:o(()=>[n(v(et))]),default:o(()=>[e[13]||(e[13]=d(" 应用衰减 ",-1))]),_:1})):_("",!0),k.value?(i(),g(u,{key:1,size:"small",onClick:Re},{icon:o(()=>[n(v(tt))]),default:o(()=>[e[14]||(e[14]=d(" 建议调整 ",-1))]),_:1})):_("",!0)])]),_:1}),n(ee,{gutter:[16,16],style:{"margin-bottom":"20px"}},{default:o(()=>[n(O,{xs:12,sm:8,lg:5},{default:o(()=>[n(z,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:o(()=>[n(W,{title:"用户档案",value:D.value.length,"value-style":{color:"#1677ff",fontSize:"20px"}},{prefix:o(()=>[n(v(ge))]),_:1},8,["value"])]),_:1})]),_:1}),n(O,{xs:12,sm:8,lg:5},{default:o(()=>[n(z,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:o(()=>[n(W,{title:"推荐总数",value:A.value.total,"value-style":{color:"#722ed1",fontSize:"20px"}},{prefix:o(()=>[n(v(_e))]),_:1},8,["value"])]),_:1})]),_:1}),n(O,{xs:12,sm:8,lg:5},{default:o(()=>[n(z,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:o(()=>[n(W,{title:"待查看",value:A.value.pending,"value-style":{color:A.value.pending>0?"#faad14":"#888",fontSize:"20px"}},{prefix:o(()=>[n(v(ot))]),_:1},8,["value","value-style"])]),_:1})]),_:1}),n(O,{xs:12,sm:8,lg:5},{default:o(()=>[n(z,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:o(()=>[n(W,{title:"反馈率",value:A.value.feedbackRate*100,suffix:"%",precision:1,"value-style":{color:"#13c2c2",fontSize:"20px"}},{prefix:o(()=>[n(v(nt))]),_:1},8,["value"])]),_:1})]),_:1}),n(O,{xs:24,sm:8,lg:4},{default:o(()=>[n(z,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:o(()=>[n(W,{title:"平均分",value:A.value.avgScore,precision:3,"value-style":{color:ie(A.value.avgScore),fontSize:"20px"}},{prefix:o(()=>[n(v(at))]),_:1},8,["value","value-style"])]),_:1})]),_:1})]),_:1}),n(z,{title:"内容类型",size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"20px"},"body-style":{padding:"12px 16px"}},{default:o(()=>[n(ee,{gutter:[12,12]},{default:o(()=>[(i(!0),y(I,null,K(v(ke),a=>(i(),g(O,{key:a,xs:12,sm:6},{default:o(()=>[x("div",{class:"type-pill",style:rt({borderLeftColor:Se(a)})},[n(R,{color:le(a),style:{"font-family":"monospace"}},{default:o(()=>[d(f(a),1)]),_:2},1032,["color"]),x("div",xt,f(se(a)),1)],4)]),_:2},1024))),128))]),_:1})]),_:1}),n(Ve,{activeKey:q.value,"onUpdate:activeKey":e[4]||(e[4]=a=>q.value=a),class:"recommend-tabs"},{default:o(()=>[n(ne,{key:"recs",tab:"推荐流"},{default:o(()=>[x("div",Ct,[n(pe,{value:P.value,"onUpdate:value":e[2]||(e[2]=a=>P.value=a),size:"small","button-style":"solid"},{default:o(()=>[n(Q,{value:""},{default:o(()=>[...e[16]||(e[16]=[d("全部状态",-1)])]),_:1}),(i(!0),y(I,null,K(v(ct),a=>(i(),g(Q,{key:a,value:a},{default:o(()=>[d(f(re(a)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"]),n(pe,{value:L.value,"onUpdate:value":e[3]||(e[3]=a=>L.value=a),size:"small"},{default:o(()=>[n(Q,{value:""},{default:o(()=>[...e[17]||(e[17]=[d("全部类型",-1)])]),_:1}),(i(!0),y(I,null,K(v(ke),a=>(i(),g(Q,{key:a,value:a},{default:o(()=>[d(f(se(a)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),k.value?(i(),g(me,{key:1,columns:Ce,"data-source":we.value,pagination:{pageSize:20,showTotal:a=>`共 ${a} 条`},size:"small",loading:$.value,style:{background:"var(--bg-card)"}},{bodyCell:o(({column:a,record:c})=>[a.key==="title"?(i(),y(I,{key:0},[x("span",ht,f(c.title||"(无标题)"),1),x("div",wt,f(c.contentId),1)],64)):_("",!0),a.key==="contentType"?(i(),g(R,{key:1,color:le(c.contentType),style:{"font-family":"monospace"}},{default:o(()=>[d(f(c.contentType),1)]),_:2},1032,["color"])):_("",!0),a.key==="score"?(i(),g(te,{key:2,percent:Math.round(c.score*100),"stroke-color":ie(c.score),size:"small",format:()=>c.score.toFixed(3)},null,8,["percent","stroke-color","format"])):_("",!0),a.key==="reason"?(i(),y("span",St,f(c.reason),1)):_("",!0),a.key==="status"?(i(),g(R,{key:4,color:ze(c.status)},{default:o(()=>[d(f(re(c.status)),1)]),_:2},1032,["color"])):_("",!0),a.key==="feedback"?(i(),y(I,{key:5},[c.feedback?(i(),g(R,{key:0,color:$e(c.feedback)},{default:o(()=>[d(f(Ie(c.feedback)),1)]),_:2},1032,["color"])):(i(),y("span",zt,"—"))],64)):_("",!0),a.key==="action"?(i(),y(I,{key:6},[c.status==="pending"?(i(),g(u,{key:0,size:"small",type:"link",onClick:N=>Fe(c)},{default:o(()=>[...e[18]||(e[18]=[d("查看",-1)])]),_:1},8,["onClick"])):_("",!0),c.status!=="dismissed"?(i(),g(Me,{key:1},{overlay:o(()=>[n(Le,{onClick:({key:N})=>Ee(c,N)},{default:o(()=>[n(oe,{key:"like",style:{color:"#52c41a"}},{default:o(()=>[...e[20]||(e[20]=[d("赞",-1)])]),_:1}),n(oe,{key:"dislike",style:{color:"#ff4d4f"}},{default:o(()=>[...e[21]||(e[21]=[d("踩",-1)])]),_:1}),n(oe,{key:"later"},{default:o(()=>[...e[22]||(e[22]=[d("稍后",-1)])]),_:1})]),_:1},8,["onClick"])]),default:o(()=>[n(u,{size:"small",type:"link"},{default:o(()=>[...e[19]||(e[19]=[d("反馈 ▼",-1)])]),_:1})]),_:2},1024)):_("",!0),c.status!=="dismissed"?(i(),g(fe,{key:2,title:"忽略该推荐?","ok-text":"忽略","cancel-text":"取消",onConfirm:N=>De(c)},{default:o(()=>[n(u,{size:"small",type:"link",danger:""},{default:o(()=>[...e[23]||(e[23]=[d("忽略",-1)])]),_:1})]),_:1},8,["onConfirm"])):_("",!0)],64)):_("",!0)]),emptyText:o(()=>[x("div",It,[n(v(_e),{style:{"font-size":"36px","margin-bottom":"10px",display:"block"}}),d(" "+f(P.value||L.value?"没有符合条件的推荐":"该用户暂无推荐 — 用 cc recommend generate 从内容池生成"),1)])]),_:1},8,["data-source","pagination","loading"])):(i(),g(V,{key:0,description:"请先选择用户档案",image:v(r),style:{padding:"40px 0"}},null,8,["image"]))]),_:1}),n(ne,{key:"profiles",tab:"用户档案"},{default:o(()=>[n(me,{columns:he,"data-source":D.value,pagination:{pageSize:20,showTotal:a=>`共 ${a} 个档案`},size:"small",loading:C.value,style:{background:"var(--bg-card)"}},{bodyCell:o(({column:a,record:c})=>[a.key==="userId"?(i(),y("span",$t,f(c.userId),1)):_("",!0),a.key==="topicCount"?(i(),g(R,{key:1,color:"blue"},{default:o(()=>[d(f(c.topicCount)+" 主题",1)]),_:2},1024)):_("",!0),a.key==="decayFactor"?(i(),y("span",At,f(c.decayFactor.toFixed(2)),1)):_("",!0),a.key==="updateCount"?(i(),y("span",jt,f(c.updateCount),1)):_("",!0),a.key==="lastUpdated"?(i(),y("span",Ot,f(v(xe)(c.lastUpdated)),1)):_("",!0),a.key==="action"?(i(),y(I,{key:5},[n(u,{size:"small",type:"link",onClick:N=>Ue(c)},{default:o(()=>[...e[24]||(e[24]=[d("详情",-1)])]),_:1},8,["onClick"]),n(u,{size:"small",type:"link",onClick:N=>Oe(c.userId)},{default:o(()=>[...e[25]||(e[25]=[d("切换",-1)])]),_:1},8,["onClick"]),n(fe,{title:"删除该档案?","ok-text":"删除","cancel-text":"取消",onConfirm:N=>Ne(c)},{default:o(()=>[n(u,{size:"small",type:"link",danger:""},{default:o(()=>[...e[26]||(e[26]=[d("删除",-1)])]),_:1})]),_:1},8,["onConfirm"])],64)):_("",!0)]),emptyText:o(()=>[x("div",Jt,[n(v(ge),{style:{"font-size":"36px","margin-bottom":"10px",display:"block"}}),e[27]||(e[27]=d(" 暂无用户档案 ",-1))])]),_:1},8,["data-source","pagination","loading"])]),_:1}),n(ne,{key:"interests",tab:"兴趣画像"},{default:o(()=>[k.value?(i(),g(ee,{key:1,gutter:[16,16]},{default:o(()=>[n(O,{xs:24,lg:14},{default:o(()=>[n(z,{title:"主题权重",size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:o(()=>[Y.value.length?(i(),y("div",Tt,[(i(!0),y(I,null,K(Y.value,a=>(i(),y("div",{key:a.key,class:"interest-row"},[x("span",Rt,f(a.topic),1),n(te,{percent:Math.round(a.weight*100),"stroke-color":ue(a.weight),format:()=>a.weight.toFixed(3),size:"small",style:{flex:"1","margin-left":"12px"}},null,8,["percent","stroke-color","format"])]))),128))])):(i(),g(V,{key:0,description:"该用户暂无兴趣权重",image:v(r)},null,8,["image"]))]),_:1})]),_:1}),n(O,{xs:24,lg:10},{default:o(()=>[n(z,{title:"反馈建议",size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:o(()=>[T.value.length?(i(),g(We,{key:1,size:"small","data-source":T.value},{renderItem:o(({item:a})=>[n(Be,null,{default:o(()=>[n(R,{color:a.action==="boost"?"green":"orange"},{default:o(()=>[d(f(a.action==="boost"?"提升":"降低"),1)]),_:2},1032,["color"]),x("span",Nt,f(a.topic),1),x("span",Ut,"±"+f(a.amount),1)]),_:2},1024)]),_:1},8,["data-source"])):(i(),g(V,{key:0,description:"暂无建议 — 需要更多反馈",image:v(r)},null,8,["image"]))]),_:1})]),_:1})]),_:1})):(i(),g(V,{key:0,description:"请先选择用户档案",image:v(r),style:{padding:"40px 0"}},null,8,["image"]))]),_:1})]),_:1},8,["activeKey"]),n(ve,{open:H.value,"onUpdate:open":e[8]||(e[8]=a=>H.value=a),title:"创建用户档案","confirm-loading":E.value,width:560,"ok-text":"创建","cancel-text":"取消",onOk:Je,onCancel:de},{default:o(()=>[n(Ke,{"label-col":{span:5},"wrapper-col":{span:19},style:{"margin-top":"16px"}},{default:o(()=>[n(ae,{label:"用户 ID",required:""},{default:o(()=>[n(Ge,{value:b.userId,"onUpdate:value":e[5]||(e[5]=a=>b.userId=a),placeholder:"例如 alice"},null,8,["value"])]),_:1}),n(ae,{label:"主题权重"},{default:o(()=>[n(ye,{value:b.topicsJson,"onUpdate:value":e[6]||(e[6]=a=>b.topicsJson=a),placeholder:'可选 JSON,例如 {"ai":0.8,"vue":0.5}',"auto-size":{minRows:2,maxRows:5}},null,8,["value"])]),_:1}),n(ae,{label:"交互权重"},{default:o(()=>[n(ye,{value:b.weightsJson,"onUpdate:value":e[7]||(e[7]=a=>b.weightsJson=a),placeholder:'可选 JSON,例如 {"like":1.0,"view":0.3}',"auto-size":{minRows:2,maxRows:5}},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"]),n(ve,{open:Z.value,"onUpdate:open":e[9]||(e[9]=a=>Z.value=a),title:`档案详情:${w.value?.userId||""}`,width:680,footer:null},{default:o(()=>[w.value?(i(),y("div",Ft,[n(Ye,{column:2,size:"small",bordered:""},{default:o(()=>[n(G,{label:"ID",span:2},{default:o(()=>[x("span",Et,f(w.value.id),1)]),_:1}),n(G,{label:"主题数"},{default:o(()=>[d(f(w.value.topicCount),1)]),_:1}),n(G,{label:"衰减因子"},{default:o(()=>[d(f(w.value.decayFactor.toFixed(2)),1)]),_:1}),n(G,{label:"更新次数"},{default:o(()=>[d(f(w.value.updateCount),1)]),_:1}),n(G,{label:"最后更新"},{default:o(()=>[d(f(v(xe)(w.value.lastUpdated)),1)]),_:1})]),_:1}),e[28]||(e[28]=x("h4",{style:{color:"var(--text-primary)","font-size":"13px",margin:"16px 0 8px"}},"主题权重",-1)),Object.keys(w.value.topics).length?(i(),y("div",Dt,[(i(!0),y(I,null,K(w.value.topics,(a,c)=>(i(),y("div",{key:c,class:"interest-row"},[x("span",Pt,f(c),1),n(te,{percent:Math.round(a*100),"stroke-color":ue(a),format:()=>a.toFixed(3),size:"small",style:{flex:"1","margin-left":"12px"}},null,8,["percent","stroke-color","format"])]))),128))])):(i(),g(V,{key:0,description:"无主题权重",image:v(r)},null,8,["image"])),Object.keys(w.value.interactionWeights).length?(i(),y("h4",Lt,"交互权重")):_("",!0),Object.keys(w.value.interactionWeights).length?(i(),y("pre",Mt,f(Ae(w.value.interactionWeights)),1)):_("",!0)])):_("",!0)]),_:1},8,["open","title"])])}}},oo=Qe(Bt,[["__scopeId","data-v-c7719db6"]]);export{oo as default};
1
+ import{u as qe}from"./ws-Bv7YH0VB.js";import{s as He}from"./community-parser-CO25nZFt.js";import{_ as Qe}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{a as m}from"./index-BfKFNptm.js";import{Y as Xe,al as Ze,aG as et,B as tt,aE as ge,K as _e,aH as ot,av as nt,ad as at}from"./icons-ukMaZ3tx.js";import{E as st}from"./useConfigInject-DCcT0grw.js";import{l as lt,F as y,D as x,c as n,x as o,q as p,r as h,v as i,J as d,u as v,m as g,G as _,H as I,L as K,N as rt,I as f,j as it,a as ut}from"./vendor-BVetwVfk.js";import"./index-DfcXDy2A.js";import"./transition-DSe9CgZe.js";import"./Keyframes-C7fCrnlS.js";import"./Portal-CHsntPCQ.js";import"./index-U4Zd5IK6.js";function F(s){const l=He(s);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}}const ke=Object.freeze(["note","post","article","document"]),ct=Object.freeze(["pending","viewed","dismissed"]);function S(s,l=0){return typeof s=="number"&&Number.isFinite(s)?s:l}function be(s){if(!s||typeof s!="object"||Array.isArray(s))return{};const l={};for(const[r,C]of Object.entries(s))typeof C=="number"&&Number.isFinite(C)&&(l[r]=C);return l}function dt(s,l=0){if(!s||typeof s!="object")return null;const r=s.user_id??s.userId??"";if(!r)return null;const C=s.topics&&typeof s.topics=="object"&&!Array.isArray(s.topics)?be(s.topics):{},$=s.interaction_weights??s.interactionWeights,E=$&&typeof $=="object"&&!Array.isArray($)?be($):{};return{key:r,id:String(s.id||""),userId:r,topics:C,topicCount:Object.keys(C).length,interactionWeights:E,decayFactor:S(s.decay_factor??s.decayFactor,.9),lastUpdated:s.last_updated??s.lastUpdated??null,updateCount:S(s.update_count??s.updateCount,0),_idx:l}}function pt(s){const l=F(s);return Array.isArray(l)?l.map(dt).filter(Boolean):[]}function ft(s,l=0){if(!s||typeof s!="object")return null;const r=s.id||"";return r?{key:r,id:r,userId:s.user_id??s.userId??"",contentId:s.content_id??s.contentId??"",contentType:String(s.content_type??s.contentType??"note").toLowerCase(),title:String(s.title||""),score:S(s.score,0),reason:String(s.reason||""),source:String(s.source||"heuristic"),status:String(s.status||"pending").toLowerCase(),feedback:s.feedback??null,createdAt:s.created_at??s.createdAt??null,viewedAt:s.viewed_at??s.viewedAt??null,_idx:l}:null}function mt(s){const l=F(s);return Array.isArray(l)?l.map(ft).filter(Boolean):[]}const yt={total:0,pending:0,viewed:0,dismissed:0,feedbackCount:0,feedbackRate:0,avgScore:0};function vt(s){const l={...yt},r=F(s);return!r||typeof r!="object"||Array.isArray(r)||(l.total=S(r.total,0),l.pending=S(r.pending,0),l.viewed=S(r.viewed,0),l.dismissed=S(r.dismissed,0),l.feedbackCount=S(r.feedbackCount,0),l.feedbackRate=S(r.feedbackRate,0),l.avgScore=S(r.avgScore,0)),l}function gt(s){const l=F(s);return Array.isArray(l)?l.filter(r=>r&&typeof r=="object"&&typeof r.topic=="string").map((r,C)=>({key:`${r.topic}-${C}`,topic:r.topic,weight:S(r.weight,0)})):[]}function _t(s){const l=F(s);return Array.isArray(l)?l.filter(r=>r&&typeof r=="object"&&typeof r.topic=="string"&&typeof r.action=="string").map((r,C)=>({key:`${r.topic}-${C}`,topic:r.topic,action:r.action,amount:S(r.amount,0)})):[]}function U(s){const l=F(s);return!l||typeof l!="object"||Array.isArray(l)?{ok:!1,reason:"",profileId:null,topicCount:null}:{ok:!!(l.updated||l.deleted||l.marked||l.dismissed||l.recorded||l.applied||l.profileId),reason:l.reason?String(l.reason):"",profileId:l.profileId?String(l.profileId):null,topicCount:typeof l.topicCount=="number"?l.topicCount:null}}function xe(s){if(s==null||s==="")return"—";const l=typeof s=="number"?new Date(s):new Date(String(s));return isNaN(l.getTime())?String(s):l.toLocaleString("zh-CN",{hour12:!1})}const kt={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},bt={style:{display:"flex","align-items":"center",gap:"12px","flex-wrap":"wrap"}},xt={class:"type-name"},Ct={class:"filter-bar"},ht={style:{color:"var(--text-primary)","font-weight":"500"}},wt={style:{color:"var(--text-muted)","font-size":"11px","margin-top":"2px"}},St={key:3,style:{color:"var(--text-secondary)","font-size":"12px"}},zt={key:1,style:{color:"var(--text-muted)"}},It={style:{padding:"40px",color:"var(--text-muted)","text-align":"center"}},$t={key:0,style:{color:"var(--text-primary)","font-family":"monospace","font-weight":"500"}},At={key:2,style:{color:"var(--text-secondary)","font-family":"monospace","font-size":"12px"}},jt={key:3,style:{color:"var(--text-secondary)"}},Ot={key:4,style:{color:"var(--text-secondary)","font-size":"11px"}},Jt={style:{padding:"40px",color:"var(--text-muted)","text-align":"center"}},Tt={key:1},Rt={class:"interest-topic"},Nt={style:{"margin-left":"8px","font-family":"monospace",color:"var(--text-primary)"}},Ut={style:{"margin-left":"auto",color:"var(--text-secondary)","font-size":"12px"}},Ft={key:0,style:{"padding-top":"8px"}},Et={style:{"font-family":"monospace","font-size":"12px"}},Dt={key:1},Pt={class:"interest-topic"},Lt={key:2,style:{color:"var(--text-primary)","font-size":"13px",margin:"16px 0 8px"}},Mt={key:3,class:"weights-pre"},Bt={__name:"Recommend",setup(s){const l=qe(),r=st.PRESENTED_IMAGE_SIMPLE,C=h(!1),$=h(!1),E=h(!1),D=h([]),X=h([]),A=h({total:0,pending:0,viewed:0,dismissed:0,feedbackCount:0,feedbackRate:0,avgScore:0}),Y=h([]),T=h([]),k=h(null),q=h("recs"),P=h(""),L=h(""),H=h(!1),Z=h(!1),b=ut({userId:"",topicsJson:"",weightsJson:""}),w=h(null),Ce=[{title:"标题",key:"title"},{title:"类型",key:"contentType",width:"110px"},{title:"评分",key:"score",width:"180px"},{title:"理由",key:"reason",width:"220px"},{title:"状态",key:"status",width:"100px"},{title:"反馈",key:"feedback",width:"90px"},{title:"操作",key:"action",width:"210px"}],he=[{title:"用户 ID",key:"userId"},{title:"主题数",key:"topicCount",width:"110px"},{title:"衰减因子",key:"decayFactor",width:"110px"},{title:"更新次数",key:"updateCount",width:"110px"},{title:"最后更新",key:"lastUpdated",width:"180px"},{title:"操作",key:"action",width:"200px"}],we=it(()=>{let t=X.value;return P.value&&(t=t.filter(e=>e.status===P.value)),L.value&&(t=t.filter(e=>e.contentType===L.value)),t});function se(t){return{note:"笔记",post:"帖子",article:"文章",document:"文档"}[t]||t}function le(t){return{note:"blue",post:"green",article:"purple",document:"orange"}[t]||"default"}function Se(t){return{note:"#1677ff",post:"#52c41a",article:"#722ed1",document:"#fa8c16"}[t]||"#888"}function re(t){return{pending:"待查看",viewed:"已查看",dismissed:"已忽略"}[t]||t}function ze(t){return{pending:"processing",viewed:"green",dismissed:"default"}[t]||"default"}function Ie(t){return{like:"赞",dislike:"踩",later:"稍后"}[t]||t}function $e(t){return{like:"green",dislike:"red",later:"gold"}[t]||"default"}function ie(t){return t>=.7?"#52c41a":t>=.4?"#1677ff":t>=.2?"#faad14":"#ff4d4f"}function ue(t){return t>=.7?"#52c41a":t>=.4?"#1677ff":t>=.2?"#faad14":"#888"}function Ae(t){try{return JSON.stringify(t,null,2)}catch{return String(t)}}async function M(){C.value=!0;try{const{output:t}=await l.execute("recommend profiles --json",1e4).catch(()=>({output:""}));D.value=pt(t),k.value&&!D.value.find(e=>e.userId===k.value)&&(k.value=null),k.value&&await J()}catch(t){m.error("加载档案失败: "+(t?.message||t))}finally{C.value=!1}}async function J(){if(!k.value){X.value=[],A.value={total:0,pending:0,viewed:0,dismissed:0,feedbackCount:0,feedbackRate:0,avgScore:0},Y.value=[];return}$.value=!0;try{const t=B(k.value),[e,u,j]=await Promise.all([l.execute(`recommend list ${t} --limit 200 --json`,1e4).catch(()=>({output:""})),l.execute(`recommend stats ${t} --json`,8e3).catch(()=>({output:""})),l.execute(`recommend top-interests ${t} --limit 30 --json`,8e3).catch(()=>({output:""}))]);X.value=mt(e.output),A.value=vt(u.output),Y.value=gt(j.output)}catch(t){m.error("加载用户数据失败: "+(t?.message||t))}finally{$.value=!1}}function B(t){return`"${String(t).replace(/"/g,'\\"')}"`}function je(){T.value=[],J()}function Oe(t){k.value=t,q.value="recs",J()}async function Je(){if(!b.userId.trim()){m.warning("请填写用户 ID");return}if(b.topicsJson.trim())try{JSON.parse(b.topicsJson)}catch{m.warning("主题权重 JSON 格式错误");return}if(b.weightsJson.trim())try{JSON.parse(b.weightsJson)}catch{m.warning("交互权重 JSON 格式错误");return}E.value=!0;try{const t=[`recommend create-profile ${B(b.userId.trim())}`];b.topicsJson.trim()&&t.push(`-t ${ce(b.topicsJson.trim())}`),b.weightsJson.trim()&&t.push(`-w ${ce(b.weightsJson.trim())}`),t.push("--json");const{output:e}=await l.execute(t.join(" "),1e4),u=U(e);if(!u.ok){m.error("创建失败: "+(u.reason||e.slice(0,120)));return}m.success(`档案已创建:${u.profileId?.slice(0,8)||""}`),H.value=!1;const j=b.userId.trim();de(),await M(),k.value=j,await J()}catch(t){m.error("创建失败: "+(t?.message||t))}finally{E.value=!1}}function ce(t){return`'${String(t).replace(/'/g,"'\\''")}'`}async function Te(){if(k.value)try{const{output:t}=await l.execute(`recommend decay ${B(k.value)} --json`,8e3),e=U(t);if(!e.ok){m.error("衰减失败: "+(e.reason||t.slice(0,120)));return}m.success(e.topicCount!==null?`衰减已应用,剩余 ${e.topicCount} 个主题`:"衰减已应用"),await M()}catch(t){m.error("衰减失败: "+(t?.message||t))}}async function Re(){if(k.value)try{const{output:t}=await l.execute(`recommend suggest ${B(k.value)} --json`,8e3);T.value=_t(t),q.value="interests",T.value.length?m.success(`找到 ${T.value.length} 条建议`):m.info("暂无建议 — 需要更多反馈")}catch(t){m.error("加载建议失败: "+(t?.message||t))}}async function Ne(t){try{const{output:e}=await l.execute(`recommend delete-profile ${B(t.userId)} --json`,8e3),u=U(e);if(!u.ok){m.error("删除失败: "+(u.reason||e.slice(0,120)));return}m.success("档案已删除"),k.value===t.userId&&(k.value=null),await M()}catch(e){m.error("删除失败: "+(e?.message||e))}}function Ue(t){w.value=t,Z.value=!0}async function Fe(t){try{const{output:e}=await l.execute(`recommend view ${t.id} --json`,8e3),u=U(e);if(!u.ok){m.error("标记失败: "+(u.reason||e.slice(0,120)));return}m.success("已标记为已查看"),await J()}catch(e){m.error("标记失败: "+(e?.message||e))}}async function Ee(t,e){try{const{output:u}=await l.execute(`recommend feedback ${t.id} ${e} --json`,8e3),j=U(u);if(!j.ok){m.error("反馈失败: "+(j.reason||u.slice(0,120)));return}m.success("反馈已记录"),await J()}catch(u){m.error("反馈失败: "+(u?.message||u))}}async function De(t){try{const{output:e}=await l.execute(`recommend dismiss ${t.id} --json`,8e3),u=U(e);if(!u.ok){m.error("忽略失败: "+(u.reason||e.slice(0,120)));return}m.success("已忽略"),await J()}catch(e){m.error("忽略失败: "+(e?.message||e))}}function de(){b.userId="",b.topicsJson="",b.weightsJson=""}return lt(M),(t,e)=>{const u=p("a-button"),j=p("a-space"),Pe=p("a-select"),z=p("a-card"),W=p("a-statistic"),O=p("a-col"),ee=p("a-row"),R=p("a-tag"),Q=p("a-radio-button"),pe=p("a-radio-group"),V=p("a-empty"),te=p("a-progress"),oe=p("a-menu-item"),Le=p("a-menu"),Me=p("a-dropdown"),fe=p("a-popconfirm"),me=p("a-table"),ne=p("a-tab-pane"),Be=p("a-list-item"),We=p("a-list"),Ve=p("a-tabs"),Ge=p("a-input"),ae=p("a-form-item"),ye=p("a-textarea"),Ke=p("a-form"),ve=p("a-modal"),G=p("a-descriptions-item"),Ye=p("a-descriptions");return i(),y("div",null,[x("div",kt,[e[12]||(e[12]=x("div",null,[x("h2",{class:"page-title"},"智能推荐"),x("p",{class:"page-sub"},"兴趣画像 · 主题衰减 · 内容评分 · 反馈学习")],-1)),n(j,null,{default:o(()=>[n(u,{loading:C.value,onClick:M},{icon:o(()=>[n(v(Xe))]),default:o(()=>[e[10]||(e[10]=d(" 刷新 ",-1))]),_:1},8,["loading"]),n(u,{type:"primary",onClick:e[0]||(e[0]=a=>H.value=!0)},{icon:o(()=>[n(v(Ze))]),default:o(()=>[e[11]||(e[11]=d(" 创建画像 ",-1))]),_:1})]),_:1})]),n(z,{size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"16px"},"body-style":{padding:"10px 16px"}},{default:o(()=>[x("div",bt,[e[15]||(e[15]=x("span",{style:{color:"var(--text-secondary)","font-size":"12px"}},"当前用户:",-1)),n(Pe,{value:k.value,"onUpdate:value":e[1]||(e[1]=a=>k.value=a),options:D.value.map(a=>({value:a.userId,label:`${a.userId} (${a.topicCount} topics)`})),placeholder:"选择用户档案",style:{"min-width":"280px"},"allow-clear":"","show-search":"",onChange:je},null,8,["value","options"]),k.value?(i(),g(u,{key:0,size:"small",onClick:Te},{icon:o(()=>[n(v(et))]),default:o(()=>[e[13]||(e[13]=d(" 应用衰减 ",-1))]),_:1})):_("",!0),k.value?(i(),g(u,{key:1,size:"small",onClick:Re},{icon:o(()=>[n(v(tt))]),default:o(()=>[e[14]||(e[14]=d(" 建议调整 ",-1))]),_:1})):_("",!0)])]),_:1}),n(ee,{gutter:[16,16],style:{"margin-bottom":"20px"}},{default:o(()=>[n(O,{xs:12,sm:8,lg:5},{default:o(()=>[n(z,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:o(()=>[n(W,{title:"用户档案",value:D.value.length,"value-style":{color:"#1677ff",fontSize:"20px"}},{prefix:o(()=>[n(v(ge))]),_:1},8,["value"])]),_:1})]),_:1}),n(O,{xs:12,sm:8,lg:5},{default:o(()=>[n(z,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:o(()=>[n(W,{title:"推荐总数",value:A.value.total,"value-style":{color:"#722ed1",fontSize:"20px"}},{prefix:o(()=>[n(v(_e))]),_:1},8,["value"])]),_:1})]),_:1}),n(O,{xs:12,sm:8,lg:5},{default:o(()=>[n(z,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:o(()=>[n(W,{title:"待查看",value:A.value.pending,"value-style":{color:A.value.pending>0?"#faad14":"#888",fontSize:"20px"}},{prefix:o(()=>[n(v(ot))]),_:1},8,["value","value-style"])]),_:1})]),_:1}),n(O,{xs:12,sm:8,lg:5},{default:o(()=>[n(z,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:o(()=>[n(W,{title:"反馈率",value:A.value.feedbackRate*100,suffix:"%",precision:1,"value-style":{color:"#13c2c2",fontSize:"20px"}},{prefix:o(()=>[n(v(nt))]),_:1},8,["value"])]),_:1})]),_:1}),n(O,{xs:24,sm:8,lg:4},{default:o(()=>[n(z,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:o(()=>[n(W,{title:"平均分",value:A.value.avgScore,precision:3,"value-style":{color:ie(A.value.avgScore),fontSize:"20px"}},{prefix:o(()=>[n(v(at))]),_:1},8,["value","value-style"])]),_:1})]),_:1})]),_:1}),n(z,{title:"内容类型",size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"20px"},"body-style":{padding:"12px 16px"}},{default:o(()=>[n(ee,{gutter:[12,12]},{default:o(()=>[(i(!0),y(I,null,K(v(ke),a=>(i(),g(O,{key:a,xs:12,sm:6},{default:o(()=>[x("div",{class:"type-pill",style:rt({borderLeftColor:Se(a)})},[n(R,{color:le(a),style:{"font-family":"monospace"}},{default:o(()=>[d(f(a),1)]),_:2},1032,["color"]),x("div",xt,f(se(a)),1)],4)]),_:2},1024))),128))]),_:1})]),_:1}),n(Ve,{activeKey:q.value,"onUpdate:activeKey":e[4]||(e[4]=a=>q.value=a),class:"recommend-tabs"},{default:o(()=>[n(ne,{key:"recs",tab:"推荐流"},{default:o(()=>[x("div",Ct,[n(pe,{value:P.value,"onUpdate:value":e[2]||(e[2]=a=>P.value=a),size:"small","button-style":"solid"},{default:o(()=>[n(Q,{value:""},{default:o(()=>[...e[16]||(e[16]=[d("全部状态",-1)])]),_:1}),(i(!0),y(I,null,K(v(ct),a=>(i(),g(Q,{key:a,value:a},{default:o(()=>[d(f(re(a)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"]),n(pe,{value:L.value,"onUpdate:value":e[3]||(e[3]=a=>L.value=a),size:"small"},{default:o(()=>[n(Q,{value:""},{default:o(()=>[...e[17]||(e[17]=[d("全部类型",-1)])]),_:1}),(i(!0),y(I,null,K(v(ke),a=>(i(),g(Q,{key:a,value:a},{default:o(()=>[d(f(se(a)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),k.value?(i(),g(me,{key:1,columns:Ce,"data-source":we.value,pagination:{pageSize:20,showTotal:a=>`共 ${a} 条`},size:"small",loading:$.value,style:{background:"var(--bg-card)"}},{bodyCell:o(({column:a,record:c})=>[a.key==="title"?(i(),y(I,{key:0},[x("span",ht,f(c.title||"(无标题)"),1),x("div",wt,f(c.contentId),1)],64)):_("",!0),a.key==="contentType"?(i(),g(R,{key:1,color:le(c.contentType),style:{"font-family":"monospace"}},{default:o(()=>[d(f(c.contentType),1)]),_:2},1032,["color"])):_("",!0),a.key==="score"?(i(),g(te,{key:2,percent:Math.round(c.score*100),"stroke-color":ie(c.score),size:"small",format:()=>c.score.toFixed(3)},null,8,["percent","stroke-color","format"])):_("",!0),a.key==="reason"?(i(),y("span",St,f(c.reason),1)):_("",!0),a.key==="status"?(i(),g(R,{key:4,color:ze(c.status)},{default:o(()=>[d(f(re(c.status)),1)]),_:2},1032,["color"])):_("",!0),a.key==="feedback"?(i(),y(I,{key:5},[c.feedback?(i(),g(R,{key:0,color:$e(c.feedback)},{default:o(()=>[d(f(Ie(c.feedback)),1)]),_:2},1032,["color"])):(i(),y("span",zt,"—"))],64)):_("",!0),a.key==="action"?(i(),y(I,{key:6},[c.status==="pending"?(i(),g(u,{key:0,size:"small",type:"link",onClick:N=>Fe(c)},{default:o(()=>[...e[18]||(e[18]=[d("查看",-1)])]),_:1},8,["onClick"])):_("",!0),c.status!=="dismissed"?(i(),g(Me,{key:1},{overlay:o(()=>[n(Le,{onClick:({key:N})=>Ee(c,N)},{default:o(()=>[n(oe,{key:"like",style:{color:"#52c41a"}},{default:o(()=>[...e[20]||(e[20]=[d("赞",-1)])]),_:1}),n(oe,{key:"dislike",style:{color:"#ff4d4f"}},{default:o(()=>[...e[21]||(e[21]=[d("踩",-1)])]),_:1}),n(oe,{key:"later"},{default:o(()=>[...e[22]||(e[22]=[d("稍后",-1)])]),_:1})]),_:1},8,["onClick"])]),default:o(()=>[n(u,{size:"small",type:"link"},{default:o(()=>[...e[19]||(e[19]=[d("反馈 ▼",-1)])]),_:1})]),_:2},1024)):_("",!0),c.status!=="dismissed"?(i(),g(fe,{key:2,title:"忽略该推荐?","ok-text":"忽略","cancel-text":"取消",onConfirm:N=>De(c)},{default:o(()=>[n(u,{size:"small",type:"link",danger:""},{default:o(()=>[...e[23]||(e[23]=[d("忽略",-1)])]),_:1})]),_:1},8,["onConfirm"])):_("",!0)],64)):_("",!0)]),emptyText:o(()=>[x("div",It,[n(v(_e),{style:{"font-size":"36px","margin-bottom":"10px",display:"block"}}),d(" "+f(P.value||L.value?"没有符合条件的推荐":"该用户暂无推荐 — 用 cc recommend generate 从内容池生成"),1)])]),_:1},8,["data-source","pagination","loading"])):(i(),g(V,{key:0,description:"请先选择用户档案",image:v(r),style:{padding:"40px 0"}},null,8,["image"]))]),_:1}),n(ne,{key:"profiles",tab:"用户档案"},{default:o(()=>[n(me,{columns:he,"data-source":D.value,pagination:{pageSize:20,showTotal:a=>`共 ${a} 个档案`},size:"small",loading:C.value,style:{background:"var(--bg-card)"}},{bodyCell:o(({column:a,record:c})=>[a.key==="userId"?(i(),y("span",$t,f(c.userId),1)):_("",!0),a.key==="topicCount"?(i(),g(R,{key:1,color:"blue"},{default:o(()=>[d(f(c.topicCount)+" 主题",1)]),_:2},1024)):_("",!0),a.key==="decayFactor"?(i(),y("span",At,f(c.decayFactor.toFixed(2)),1)):_("",!0),a.key==="updateCount"?(i(),y("span",jt,f(c.updateCount),1)):_("",!0),a.key==="lastUpdated"?(i(),y("span",Ot,f(v(xe)(c.lastUpdated)),1)):_("",!0),a.key==="action"?(i(),y(I,{key:5},[n(u,{size:"small",type:"link",onClick:N=>Ue(c)},{default:o(()=>[...e[24]||(e[24]=[d("详情",-1)])]),_:1},8,["onClick"]),n(u,{size:"small",type:"link",onClick:N=>Oe(c.userId)},{default:o(()=>[...e[25]||(e[25]=[d("切换",-1)])]),_:1},8,["onClick"]),n(fe,{title:"删除该档案?","ok-text":"删除","cancel-text":"取消",onConfirm:N=>Ne(c)},{default:o(()=>[n(u,{size:"small",type:"link",danger:""},{default:o(()=>[...e[26]||(e[26]=[d("删除",-1)])]),_:1})]),_:1},8,["onConfirm"])],64)):_("",!0)]),emptyText:o(()=>[x("div",Jt,[n(v(ge),{style:{"font-size":"36px","margin-bottom":"10px",display:"block"}}),e[27]||(e[27]=d(" 暂无用户档案 ",-1))])]),_:1},8,["data-source","pagination","loading"])]),_:1}),n(ne,{key:"interests",tab:"兴趣画像"},{default:o(()=>[k.value?(i(),g(ee,{key:1,gutter:[16,16]},{default:o(()=>[n(O,{xs:24,lg:14},{default:o(()=>[n(z,{title:"主题权重",size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:o(()=>[Y.value.length?(i(),y("div",Tt,[(i(!0),y(I,null,K(Y.value,a=>(i(),y("div",{key:a.key,class:"interest-row"},[x("span",Rt,f(a.topic),1),n(te,{percent:Math.round(a.weight*100),"stroke-color":ue(a.weight),format:()=>a.weight.toFixed(3),size:"small",style:{flex:"1","margin-left":"12px"}},null,8,["percent","stroke-color","format"])]))),128))])):(i(),g(V,{key:0,description:"该用户暂无兴趣权重",image:v(r)},null,8,["image"]))]),_:1})]),_:1}),n(O,{xs:24,lg:10},{default:o(()=>[n(z,{title:"反馈建议",size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:o(()=>[T.value.length?(i(),g(We,{key:1,size:"small","data-source":T.value},{renderItem:o(({item:a})=>[n(Be,null,{default:o(()=>[n(R,{color:a.action==="boost"?"green":"orange"},{default:o(()=>[d(f(a.action==="boost"?"提升":"降低"),1)]),_:2},1032,["color"]),x("span",Nt,f(a.topic),1),x("span",Ut,"±"+f(a.amount),1)]),_:2},1024)]),_:1},8,["data-source"])):(i(),g(V,{key:0,description:"暂无建议 — 需要更多反馈",image:v(r)},null,8,["image"]))]),_:1})]),_:1})]),_:1})):(i(),g(V,{key:0,description:"请先选择用户档案",image:v(r),style:{padding:"40px 0"}},null,8,["image"]))]),_:1})]),_:1},8,["activeKey"]),n(ve,{open:H.value,"onUpdate:open":e[8]||(e[8]=a=>H.value=a),title:"创建用户档案","confirm-loading":E.value,width:560,"ok-text":"创建","cancel-text":"取消",onOk:Je,onCancel:de},{default:o(()=>[n(Ke,{"label-col":{span:5},"wrapper-col":{span:19},style:{"margin-top":"16px"}},{default:o(()=>[n(ae,{label:"用户 ID",required:""},{default:o(()=>[n(Ge,{value:b.userId,"onUpdate:value":e[5]||(e[5]=a=>b.userId=a),placeholder:"例如 alice"},null,8,["value"])]),_:1}),n(ae,{label:"主题权重"},{default:o(()=>[n(ye,{value:b.topicsJson,"onUpdate:value":e[6]||(e[6]=a=>b.topicsJson=a),placeholder:'可选 JSON,例如 {"ai":0.8,"vue":0.5}',"auto-size":{minRows:2,maxRows:5}},null,8,["value"])]),_:1}),n(ae,{label:"交互权重"},{default:o(()=>[n(ye,{value:b.weightsJson,"onUpdate:value":e[7]||(e[7]=a=>b.weightsJson=a),placeholder:'可选 JSON,例如 {"like":1.0,"view":0.3}',"auto-size":{minRows:2,maxRows:5}},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"]),n(ve,{open:Z.value,"onUpdate:open":e[9]||(e[9]=a=>Z.value=a),title:`档案详情:${w.value?.userId||""}`,width:680,footer:null},{default:o(()=>[w.value?(i(),y("div",Ft,[n(Ye,{column:2,size:"small",bordered:""},{default:o(()=>[n(G,{label:"ID",span:2},{default:o(()=>[x("span",Et,f(w.value.id),1)]),_:1}),n(G,{label:"主题数"},{default:o(()=>[d(f(w.value.topicCount),1)]),_:1}),n(G,{label:"衰减因子"},{default:o(()=>[d(f(w.value.decayFactor.toFixed(2)),1)]),_:1}),n(G,{label:"更新次数"},{default:o(()=>[d(f(w.value.updateCount),1)]),_:1}),n(G,{label:"最后更新"},{default:o(()=>[d(f(v(xe)(w.value.lastUpdated)),1)]),_:1})]),_:1}),e[28]||(e[28]=x("h4",{style:{color:"var(--text-primary)","font-size":"13px",margin:"16px 0 8px"}},"主题权重",-1)),Object.keys(w.value.topics).length?(i(),y("div",Dt,[(i(!0),y(I,null,K(w.value.topics,(a,c)=>(i(),y("div",{key:c,class:"interest-row"},[x("span",Pt,f(c),1),n(te,{percent:Math.round(a*100),"stroke-color":ue(a),format:()=>a.toFixed(3),size:"small",style:{flex:"1","margin-left":"12px"}},null,8,["percent","stroke-color","format"])]))),128))])):(i(),g(V,{key:0,description:"无主题权重",image:v(r)},null,8,["image"])),Object.keys(w.value.interactionWeights).length?(i(),y("h4",Lt,"交互权重")):_("",!0),Object.keys(w.value.interactionWeights).length?(i(),y("pre",Mt,f(Ae(w.value.interactionWeights)),1)):_("",!0)])):_("",!0)]),_:1},8,["open","title"])])}}},oo=Qe(Bt,[["__scopeId","data-v-c7719db6"]]);export{oo as default};
@@ -1 +1 @@
1
- import{u as lt}from"./ws-Bv7YH0VB.js";import{s as Ee}from"./community-parser-CO25nZFt.js";import{_ as st}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{a as x}from"./index-BbqCdQXU.js";import{Y as it,aD as Ae,m as ut,aE as we,aF as ct,E as Ce,a2 as pt,J as dt,ac as mt,ax as ft}from"./icons-ukMaZ3tx.js";import vt from"./index-D0GALIQZ.js";import{E as yt}from"./useConfigInject-BKqJUQaF.js";import{l as bt,F as p,D as b,c as e,x as a,m as S,G as f,q as c,r as k,v as i,J as d,u as v,H as E,L as N,I as u,E as _t,N as Re,a as fe}from"./vendor-BVetwVfk.js";import"./index-ZZ_4A9um.js";import"./transition-CGYDOK3N.js";import"./Keyframes-C7fCrnlS.js";import"./Portal-CHsntPCQ.js";import"./index-U4Zd5IK6.js";import"./KeyCode-D63Tfrq7.js";import"./omit-RkKN6uqw.js";import"./pickAttrs-Bk8_mKGY.js";import"./initDefaultProps--L8bzddm.js";import"./motion-BR7NF0vx.js";import"./raf-Deuc0E8-.js";import"./index-DIe3dY84.js";import"./index-C-CTCrAH.js";import"./isVisible-C7tPsqfj.js";import"./useState-DoAhV80c.js";import"./devWarning-CNIS3FrJ.js";import"./warning-Pq00owYb.js";import"./compact-item-B4vcKR0x.js";import"./createContext-Div8Cl0F.js";import"./Compact-DC8UsEAe.js";import"./_getTag-CWA3v-Ds.js";import"./styleChecker-CQt4HHRm.js";import"./zoom-BNV3xYvt.js";import"./ActionButton-CvKbykKA.js";import"./vnode-I9keNa_U.js";function P(l){const n=Ee(l);if(!n)return null;try{return JSON.parse(n)}catch{}const s=n.match(/\{[\s\S]*\}|\[[\s\S]*\]/);if(!s)return null;try{return JSON.parse(s[0])}catch{return null}}const ye=Object.freeze(["accuracy","fairness","resilience","convergence_speed"]),Ie=Object.freeze(["none","exponential","linear","step"]),gt=Object.freeze(["z_score","iqr"]),$e=Object.freeze(["running","complete","applied","failed","cancelled"]),xt=Object.freeze(["generic","task","review","vote"]);function h(l,n=0){return typeof l=="number"&&Number.isFinite(l)?l:n}function B(l){if(!l)return{noDb:!1,error:""};const n=Ee(l),s=/Database not available/i.test(n);return{noDb:s,error:s?"Database not available":""}}function kt(l,n=0){if(!l||typeof l!="object")return null;const s=l.did||"";return s?{key:s,did:s,score:h(l.score,0),observations:h(l.observations,0),decay:String(l.decay||"none"),weightTotal:h(l.weightTotal,0),_idx:n}:null}function Te(l){const n=P(l);return Array.isArray(n)?n.map(kt).filter(Boolean):[]}function Fe(l,n=0){if(!l||typeof l!="object")return null;const s=l.did||"";return s?{key:`${s}-${n}`,did:s,score:h(l.score,0),reason:String(l.reason||""),zScore:typeof l.zScore=="number"?l.zScore:null,lower:typeof l.lower=="number"?l.lower:null,upper:typeof l.upper=="number"?l.upper:null}:null}function St(l){const n=P(l);if(!n||typeof n!="object"||Array.isArray(n))return{method:"",threshold:0,totalSamples:0,anomalies:[],summary:"",message:""};const s=Array.isArray(n.anomalies)?n.anomalies.map(Fe).filter(Boolean):[];return{method:String(n.method||""),threshold:h(n.threshold,0),totalSamples:h(n.totalSamples,0),anomalies:s,summary:n.summary?String(n.summary):"",message:n.message?String(n.message):""}}function Ne(l,n=0){if(!l||typeof l!="object")return null;const s=l.runId||"";return s?{key:s,runId:s,objective:String(l.objective||""),iterations:h(l.iterations,0),paramSpace:l.paramSpace??null,bestParams:l.bestParams??null,bestScore:h(l.bestScore,0),status:String(l.status||"complete").toLowerCase(),createdAt:l.createdAt??null,completedAt:l.completedAt??null,analytics:l.analytics??null,errorMessage:l.errorMessage??"",_idx:n}:null}function zt(l){const n=P(l);return Array.isArray(n)?n.map(Ne).filter(Boolean):[]}function ht(l){const n=P(l);return!n||typeof n!="object"||Array.isArray(n)?null:Ne(n,0)}function Dt(l){const n=P(l);if(!n||typeof n!="object"||Array.isArray(n))return null;const s=n.reputationDistribution||{};return{analyticsId:String(n.analyticsId||""),runId:String(n.runId||""),reputationDistribution:{buckets:Array.isArray(s.buckets)?s.buckets.filter(m=>m&&typeof m=="object").map(m=>({label:String(m.label||""),count:h(m.count,0),min:typeof m.min=="number"?m.min:null,max:typeof m.max=="number"?m.max:null})):[],mean:typeof s.mean=="number"?s.mean:null,stdDev:typeof s.stdDev=="number"?s.stdDev:null},anomalies:n.anomalies&&typeof n.anomalies=="object"?{method:String(n.anomalies.method||""),totalSamples:h(n.anomalies.totalSamples,0),anomalies:Array.isArray(n.anomalies.anomalies)?n.anomalies.anomalies.map(Fe).filter(Boolean):[],summary:n.anomalies.summary?String(n.anomalies.summary):"",message:n.anomalies.message?String(n.anomalies.message):""}:{method:"",totalSamples:0,anomalies:[],summary:"",message:""},recommendations:Array.isArray(n.recommendations)?n.recommendations.filter(m=>typeof m=="string"):[]}}const Ot={totalRuns:0,activeRuns:0,maxConcurrentOptimizations:0,byStatus:{},byObjective:{},observations:{totalObservations:0,totalDids:0},bestScoreEver:0};function jt(l){const n=JSON.parse(JSON.stringify(Ot));for(const m of $e)n.byStatus[m]=0;for(const m of ye)n.byObjective[m]=0;const s=P(l);if(!s||typeof s!="object"||Array.isArray(s))return n;if(n.totalRuns=h(s.totalRuns,0),n.activeRuns=h(s.activeRuns,0),n.maxConcurrentOptimizations=h(s.maxConcurrentOptimizations,0),n.bestScoreEver=h(s.bestScoreEver,0),s.byStatus&&typeof s.byStatus=="object")for(const[m,O]of Object.entries(s.byStatus))typeof O=="number"&&Number.isFinite(O)&&(n.byStatus[m]=O);if(s.byObjective&&typeof s.byObjective=="object")for(const[m,O]of Object.entries(s.byObjective))typeof O=="number"&&Number.isFinite(O)&&(n.byObjective[m]=O);return s.observations&&typeof s.observations=="object"&&(n.observations.totalObservations=h(s.observations.totalObservations,0),n.observations.totalDids=h(s.observations.totalDids,0)),n}function ve(l){if(l==null||l==="")return"—";const n=typeof l=="number"?new Date(l):new Date(String(l));return isNaN(n.getTime())?String(l):n.toLocaleString("zh-CN",{hour12:!1})}const At={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},wt={class:"filter-bar"},Ct={key:1,style:{color:"var(--text-primary)","font-family":"monospace","font-size":"12px"}},Rt={key:3,style:{color:"var(--text-secondary)"}},It={key:4,style:{color:"var(--text-secondary)","font-family":"monospace","font-size":"12px"}},Tt={style:{padding:"40px",color:"var(--text-muted)","text-align":"center"}},Et={key:0,style:{color:"var(--text-primary)","font-family":"monospace","font-size":"12px"}},$t={key:2,style:{color:"var(--text-secondary)"}},Ft={key:5,style:{color:"var(--text-secondary)","font-size":"11px"}},Nt={style:{padding:"40px",color:"var(--text-muted)","text-align":"center"}},Mt={style:{color:"var(--text-muted)","font-size":"11px","margin-top":"4px"}},Ut={style:{"padding-top":"8px"}},Lt={key:1},Bt={style:{"font-family":"monospace","font-size":"12px",color:"var(--text-primary)"}},Pt={style:{"margin-left":"8px",color:"var(--text-secondary)","font-size":"12px"}},Jt={key:0,style:{"margin-left":"8px",color:"var(--text-muted)","font-size":"11px"}},Vt={key:0,style:{"padding-top":"8px"}},qt={class:"params-pre"},Kt={style:{color:"#ff4d4f"}},Wt={key:0,style:{"margin-top":"16px"}},Yt={class:"bucket-label"},Gt={key:0,style:{"margin-top":"8px",color:"var(--text-secondary)","font-size":"12px"}},Ht={key:0,style:{"margin-left":"12px"}},Zt={__name:"Reputation",setup(l){const n=lt(),s=yt.PRESENTED_IMAGE_SIMPLE,m=k(!1),O=k(!1),ee=k(!1),te=k(!1),oe=k(!1),ae=k([]),be=k([]),D=k({totalRuns:0,activeRuns:0,maxConcurrentOptimizations:0,byStatus:{},byObjective:{},observations:{totalObservations:0,totalDids:0},bestScoreEver:0}),V=k({noDb:!1,error:""}),_e=k("scores"),q=k("none"),K=k(!1),W=k(!1),ne=k(!1),Y=k(!1),_=fe({did:"",score:.8,kind:"generic",weight:1}),M=fe({objective:"accuracy",iterations:50}),I=fe({method:"z_score",threshold:2.5,decay:"none"}),y=k(null),j=k(null),A=k(null),Me=[{title:"排名",key:"rank",width:"60px"},{title:"DID",key:"did"},{title:"声誉分数",key:"score",width:"220px"},{title:"观察数",key:"observations",width:"100px"},{title:"权重和",key:"weightTotal",width:"100px"}],Ue=[{title:"Run ID",key:"runId",width:"140px"},{title:"目标",key:"objective",width:"140px"},{title:"迭代",key:"iterations",width:"80px"},{title:"最佳分数",key:"bestScore",width:"110px"},{title:"状态",key:"status",width:"100px"},{title:"创建时间",key:"createdAt",width:"160px"},{title:"操作",key:"action",width:"160px"}];function ge(r){return{none:"无",exponential:"指数",linear:"线性",step:"步进"}[r]||r}function Le(r){return{generic:"通用",task:"任务",review:"评审",vote:"投票"}[r]||r}function G(r){return{accuracy:"准确性",fairness:"公平性",resilience:"抗扰动",convergence_speed:"收敛速度"}[r]||r}function re(r){return{accuracy:"blue",fairness:"green",resilience:"purple",convergence_speed:"orange"}[r]||"default"}function Be(r){return{accuracy:"#1677ff",fairness:"#52c41a",resilience:"#722ed1",convergence_speed:"#fa8c16"}[r]||"#888"}function Pe(r){return{accuracy:"最大化对真实声誉的拟合",fairness:"降低衰减强度,平等对待各 DID",resilience:"提高对异常值的容忍度",convergence_speed:"尽量少迭代获得稳定结果"}[r]||""}function le(r){return{running:"运行中",complete:"已完成",applied:"已应用",failed:"失败",cancelled:"已取消"}[r]||r}function se(r){return{running:"processing",complete:"blue",applied:"green",failed:"red",cancelled:"default"}[r]||"default"}function Je(r){return{running:"#1677ff",complete:"#13c2c2",applied:"#52c41a",failed:"#ff4d4f",cancelled:"#888"}[r]||"#888"}function Ve(r){return r===0?"gold":r===1?"silver":r===2?"bronze":""}function ie(r){return r>=.8?"#52c41a":r>=.5?"#1677ff":r>=.3?"#faad14":"#ff4d4f"}function xe(r,o){return o?Math.round(r/o*100):0}function qe(r){const o=j.value?.reputationDistribution.buckets.reduce((z,w)=>z+w.count,0)||0;return o?Math.round(r.count/o*100):0}function Ke(r){if(typeof r=="string")return r;try{return JSON.stringify(r,null,2)}catch{return String(r)}}async function J(){m.value=!0,V.value={noDb:!1,error:""};try{const[r,o,z]=await Promise.all([n.execute(`reputation list --decay ${q.value} --json`,1e4).catch(()=>({output:""})),n.execute("reputation runs --limit 50 --json",1e4).catch(()=>({output:""})),n.execute("reputation stats-v2 --json",8e3).catch(()=>({output:""}))]),w=[r,o,z].map(U=>B(U.output)).find(U=>U.noDb);w&&(V.value=w),ae.value=Te(r.output),be.value=zt(o.output),D.value=jt(z.output)}catch(r){x.error("加载声誉数据失败: "+(r?.message||r))}finally{m.value=!1}}async function We(){try{const{output:r}=await n.execute(`reputation list --decay ${q.value} --json`,1e4),o=B(r);if(o.noDb){V.value=o;return}ae.value=Te(r)}catch(r){x.error("加载评分失败: "+(r?.message||r))}}async function Ye(){if(!_.did.trim()){x.warning("请填写 DID");return}if(_.score<0||_.score>1){x.warning("评分必须在 0 ~ 1 之间");return}O.value=!0;try{const r=[`reputation observe "${_.did.trim().replace(/"/g,'\\"')}"`,String(_.score),`-k ${_.kind}`,`-w ${_.weight}`,"--json"],{output:o}=await n.execute(r.join(" "),1e4);if(B(o).noDb){x.error("需要先 cc init 初始化项目");return}if(!/"did"/.test(o)){x.error("记录失败: "+o.slice(0,120));return}x.success("观察已记录"),K.value=!1,Se(),await J()}catch(r){x.error("记录失败: "+(r?.message||r))}finally{O.value=!1}}async function Ge(){ee.value=!0;try{const r=["reputation optimize",`-o ${M.objective}`,`-i ${M.iterations}`,"--json"],{output:o}=await n.execute(r.join(" "),6e4);if(B(o).noDb){x.error("需要先 cc init 初始化项目");return}const w=ht(o);if(!w){x.error("优化失败: "+o.slice(0,120));return}W.value=!1,x.success(`优化完成,最佳分数 ${w.bestScore.toFixed(4)}`),await J(),y.value=w,Y.value=!0,await ke()}catch(r){x.error("优化失败: "+(r?.message||r))}finally{ee.value=!1}}async function He(r){vt.confirm({title:"应用本次优化结果?",content:`Run ${r.runId.slice(0,12)} 的最佳参数将被标记为已应用。`,okText:"应用",cancelText:"取消",onOk:async()=>{try{const{output:o}=await n.execute(`reputation apply ${r.runId}`,8e3);if(B(o).noDb){x.error("需要先 cc init 初始化项目");return}if(/Failed|Error/i.test(o)&&!/Applied/i.test(o)){x.error("应用失败: "+o.slice(0,120));return}x.success("已应用"),await J()}catch(o){x.error("应用失败: "+(o?.message||o))}}})}async function Ze(r){y.value=r,j.value=null,Y.value=!0,await ke()}async function ke(){if(y.value){oe.value=!0;try{const{output:r}=await n.execute(`reputation analytics ${y.value.runId} --json`,8e3);if(B(r).noDb)return;j.value=Dt(r)}catch{}finally{oe.value=!1}}}function Qe(){A.value=null,ne.value=!0}async function Xe(){te.value=!0;try{const r=["reputation anomalies",`-m ${I.method}`,`-t ${I.threshold}`,`-d ${I.decay}`,"--json"],{output:o}=await n.execute(r.join(" "),1e4);if(B(o).noDb){x.error("需要先 cc init 初始化项目");return}A.value=St(o)}catch(r){x.error("检测失败: "+(r?.message||r))}finally{te.value=!1}}function Se(){_.did="",_.score=.8,_.kind="generic",_.weight=1}return bt(J),(r,o)=>{const z=c("a-button"),w=c("a-space"),U=c("a-alert"),$=c("a-statistic"),T=c("a-card"),C=c("a-col"),ue=c("a-row"),ze=c("a-radio-button"),he=c("a-radio-group"),H=c("a-progress"),De=c("a-table"),ce=c("a-tab-pane"),L=c("a-tag"),et=c("a-tabs"),tt=c("a-input"),R=c("a-form-item"),Z=c("a-input-number"),pe=c("a-select-option"),de=c("a-select"),me=c("a-form"),Q=c("a-modal"),ot=c("a-divider"),at=c("a-empty"),Oe=c("a-list-item"),je=c("a-list"),F=c("a-descriptions-item"),nt=c("a-descriptions"),rt=c("a-spin");return i(),p("div",null,[b("div",At,[o[20]||(o[20]=b("div",null,[b("h2",{class:"page-title"},"声誉优化"),b("p",{class:"page-sub"},"观察记录 · 衰减模型 · 异常检测 · 贝叶斯参数优化")],-1)),e(w,null,{default:a(()=>[e(z,{loading:m.value,onClick:J},{icon:a(()=>[e(v(it))]),default:a(()=>[o[17]||(o[17]=d(" 刷新 ",-1))]),_:1},8,["loading"]),e(z,{onClick:Qe},{icon:a(()=>[e(v(Ae))]),default:a(()=>[o[18]||(o[18]=d(" 异常检测 ",-1))]),_:1}),e(z,{type:"primary",onClick:o[0]||(o[0]=t=>W.value=!0)},{icon:a(()=>[e(v(ut))]),default:a(()=>[o[19]||(o[19]=d(" 启动优化 ",-1))]),_:1})]),_:1})]),V.value.noDb?(i(),S(U,{key:0,type:"info","show-icon":"",message:"该模块需要项目级数据库",description:"`cc reputation ...` 命令仅在 chainlesschain 项目目录下可用。请先运行 `cc init` 初始化项目,或在已初始化的目录启动 `cc serve`。",style:{"margin-bottom":"16px"}})):f("",!0),e(ue,{gutter:[16,16],style:{"margin-bottom":"20px"}},{default:a(()=>[e(C,{xs:12,sm:8,lg:5},{default:a(()=>[e(T,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[e($,{title:"跟踪 DID",value:D.value.observations.totalDids,"value-style":{color:"#1677ff",fontSize:"20px"}},{prefix:a(()=>[e(v(we))]),_:1},8,["value"])]),_:1})]),_:1}),e(C,{xs:12,sm:8,lg:5},{default:a(()=>[e(T,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[e($,{title:"观察总数",value:D.value.observations.totalObservations,"value-style":{color:"#722ed1",fontSize:"20px"}},{prefix:a(()=>[e(v(ct))]),_:1},8,["value"])]),_:1})]),_:1}),e(C,{xs:12,sm:8,lg:5},{default:a(()=>[e(T,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[e($,{title:"优化运行",value:D.value.totalRuns,"value-style":{color:"#13c2c2",fontSize:"20px"}},{prefix:a(()=>[e(v(Ce))]),_:1},8,["value"])]),_:1})]),_:1}),e(C,{xs:12,sm:8,lg:5},{default:a(()=>[e(T,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[e($,{title:"进行中",value:D.value.activeRuns,"value-style":{color:D.value.activeRuns>0?"#1677ff":"#888",fontSize:"20px"},suffix:`/ ${D.value.maxConcurrentOptimizations}`},{prefix:a(()=>[e(v(pt))]),_:1},8,["value","value-style","suffix"])]),_:1})]),_:1}),e(C,{xs:24,sm:8,lg:4},{default:a(()=>[e(T,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[e($,{title:"历史最佳",value:D.value.bestScoreEver,precision:3,"value-style":{color:"#52c41a",fontSize:"20px"}},{prefix:a(()=>[e(v(dt))]),_:1},8,["value"])]),_:1})]),_:1})]),_:1}),e(et,{activeKey:_e.value,"onUpdate:activeKey":o[3]||(o[3]=t=>_e.value=t),class:"reputation-tabs"},{default:a(()=>[e(ce,{key:"scores",tab:"评分排行"},{default:a(()=>[b("div",wt,[o[22]||(o[22]=b("span",{style:{color:"var(--text-secondary)","font-size":"12px"}},"衰减模型:",-1)),e(he,{value:q.value,"onUpdate:value":o[1]||(o[1]=t=>q.value=t),size:"small","button-style":"solid",onChange:We},{default:a(()=>[(i(!0),p(E,null,N(v(Ie),t=>(i(),S(ze,{key:t,value:t},{default:a(()=>[d(u(ge(t)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"]),e(z,{size:"small",onClick:o[2]||(o[2]=t=>K.value=!0)},{icon:a(()=>[e(v(mt))]),default:a(()=>[o[21]||(o[21]=d(" 添加观察 ",-1))]),_:1})]),e(De,{columns:Me,"data-source":ae.value,pagination:{pageSize:20,showTotal:t=>`共 ${t} 个 DID`},size:"small",loading:m.value,style:{background:"var(--bg-card)"}},{bodyCell:a(({column:t,record:g,index:X})=>[t.key==="rank"?(i(),p("span",{key:0,class:_t(["rank-pill",Ve(X)])},u(X+1),3)):f("",!0),t.key==="did"?(i(),p("span",Ct,u(g.did),1)):f("",!0),t.key==="score"?(i(),S(H,{key:2,percent:Math.round(g.score*100),"stroke-color":ie(g.score),size:"small",format:()=>g.score.toFixed(4)},null,8,["percent","stroke-color","format"])):f("",!0),t.key==="observations"?(i(),p("span",Rt,u(g.observations),1)):f("",!0),t.key==="weightTotal"?(i(),p("span",It,u(g.weightTotal.toFixed(2)),1)):f("",!0)]),emptyText:a(()=>[b("div",Tt,[e(v(we),{style:{"font-size":"36px","margin-bottom":"10px",display:"block"}}),o[23]||(o[23]=d(' 暂无声誉数据,点"添加观察"记录第一条 ',-1))])]),_:1},8,["data-source","pagination","loading"])]),_:1}),e(ce,{key:"runs",tab:"优化运行"},{default:a(()=>[e(De,{columns:Ue,"data-source":be.value,pagination:{pageSize:20,showTotal:t=>`共 ${t} 条`},size:"small",loading:m.value,style:{background:"var(--bg-card)"}},{bodyCell:a(({column:t,record:g})=>[t.key==="runId"?(i(),p("span",Et,u(g.runId.slice(0,12)),1)):f("",!0),t.key==="objective"?(i(),S(L,{key:1,color:re(g.objective),style:{"font-family":"monospace"}},{default:a(()=>[d(u(G(g.objective)),1)]),_:2},1032,["color"])):f("",!0),t.key==="iterations"?(i(),p("span",$t,u(g.iterations),1)):f("",!0),t.key==="bestScore"?(i(),p("span",{key:3,style:Re({color:ie(g.bestScore),fontWeight:500,fontFamily:"monospace"})},u(g.bestScore.toFixed(4)),5)):f("",!0),t.key==="status"?(i(),S(L,{key:4,color:se(g.status)},{default:a(()=>[d(u(le(g.status)),1)]),_:2},1032,["color"])):f("",!0),t.key==="createdAt"?(i(),p("span",Ft,u(v(ve)(g.createdAt)),1)):f("",!0),t.key==="action"?(i(),p(E,{key:6},[e(z,{size:"small",type:"link",onClick:X=>Ze(g)},{default:a(()=>[...o[24]||(o[24]=[d("分析",-1)])]),_:1},8,["onClick"]),g.status==="complete"?(i(),S(z,{key:0,size:"small",type:"link",style:{color:"#52c41a"},onClick:X=>He(g)},{default:a(()=>[...o[25]||(o[25]=[d("应用",-1)])]),_:1},8,["onClick"])):f("",!0)],64)):f("",!0)]),emptyText:a(()=>[b("div",Nt,[e(v(Ce),{style:{"font-size":"36px","margin-bottom":"10px",display:"block"}}),o[26]||(o[26]=d(' 暂无优化运行,点"启动优化"开始第一次 ',-1))])]),_:1},8,["data-source","pagination","loading"])]),_:1}),e(ce,{key:"breakdown",tab:"分布统计"},{default:a(()=>[e(ue,{gutter:[16,16]},{default:a(()=>[e(C,{xs:24,lg:12},{default:a(()=>[e(T,{title:"按状态",size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[(i(!0),p(E,null,N(v($e),t=>(i(),p("div",{key:t,class:"bd-row"},[e(L,{color:se(t),style:{"min-width":"80px","text-align":"center"}},{default:a(()=>[d(u(le(t)),1)]),_:2},1032,["color"]),e(H,{percent:xe(D.value.byStatus[t]||0,D.value.totalRuns),"stroke-color":Je(t),format:()=>`${D.value.byStatus[t]||0}`,size:"small",style:{flex:"1","margin-left":"12px"}},null,8,["percent","stroke-color","format"])]))),128))]),_:1})]),_:1}),e(C,{xs:24,lg:12},{default:a(()=>[e(T,{title:"按目标",size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[(i(!0),p(E,null,N(v(ye),t=>(i(),p("div",{key:t,class:"bd-row"},[e(L,{color:re(t),style:{"min-width":"100px","text-align":"center","font-family":"monospace"}},{default:a(()=>[d(u(G(t)),1)]),_:2},1032,["color"]),e(H,{percent:xe(D.value.byObjective[t]||0,D.value.totalRuns),"stroke-color":Be(t),format:()=>`${D.value.byObjective[t]||0}`,size:"small",style:{flex:"1","margin-left":"12px"}},null,8,["percent","stroke-color","format"])]))),128))]),_:1})]),_:1})]),_:1})]),_:1})]),_:1},8,["activeKey"]),e(Q,{open:K.value,"onUpdate:open":o[8]||(o[8]=t=>K.value=t),title:"添加观察记录","confirm-loading":O.value,width:540,"ok-text":"记录","cancel-text":"取消",onOk:Ye,onCancel:Se},{default:a(()=>[e(me,{"label-col":{span:5},"wrapper-col":{span:19},style:{"margin-top":"16px"}},{default:a(()=>[e(R,{label:"DID",required:""},{default:a(()=>[e(tt,{value:_.did,"onUpdate:value":o[4]||(o[4]=t=>_.did=t),placeholder:"did:key:..."},null,8,["value"])]),_:1}),e(R,{label:"评分",required:""},{default:a(()=>[e(Z,{value:_.score,"onUpdate:value":o[5]||(o[5]=t=>_.score=t),min:0,max:1,step:.05,style:{width:"160px"}},null,8,["value"]),o[27]||(o[27]=b("span",{style:{"margin-left":"8px",color:"var(--text-muted)","font-size":"12px"}},"范围 0.0 ~ 1.0",-1))]),_:1}),e(R,{label:"种类"},{default:a(()=>[e(de,{value:_.kind,"onUpdate:value":o[6]||(o[6]=t=>_.kind=t)},{default:a(()=>[(i(!0),p(E,null,N(v(xt),t=>(i(),S(pe,{key:t,value:t},{default:a(()=>[d(u(Le(t)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),_:1}),e(R,{label:"权重"},{default:a(()=>[e(Z,{value:_.weight,"onUpdate:value":o[7]||(o[7]=t=>_.weight=t),min:.1,step:.1,style:{width:"120px"}},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"]),e(Q,{open:W.value,"onUpdate:open":o[11]||(o[11]=t=>W.value=t),title:"启动优化","confirm-loading":ee.value,width:540,"ok-text":"启动","cancel-text":"取消",onOk:Ge},{default:a(()=>[e(me,{"label-col":{span:5},"wrapper-col":{span:19},style:{"margin-top":"16px"}},{default:a(()=>[e(R,{label:"目标",required:""},{default:a(()=>[e(de,{value:M.objective,"onUpdate:value":o[9]||(o[9]=t=>M.objective=t)},{default:a(()=>[(i(!0),p(E,null,N(v(ye),t=>(i(),S(pe,{key:t,value:t},{default:a(()=>[d(u(G(t)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"]),b("div",Mt,u(Pe(M.objective)),1)]),_:1}),e(R,{label:"迭代次数"},{default:a(()=>[e(Z,{value:M.iterations,"onUpdate:value":o[10]||(o[10]=t=>M.iterations=t),min:1,max:1e3,step:10,style:{width:"160px"}},null,8,["value"]),o[28]||(o[28]=b("span",{style:{"margin-left":"8px",color:"var(--text-muted)","font-size":"12px"}},"范围 1 ~ 1000,默认 50",-1))]),_:1})]),_:1}),e(U,{type:"info","show-icon":"",message:"同步执行",description:"优化将运行所有迭代后立即返回最佳参数与建议(CLI lib 内置启发式 Bayesian 模拟)。",style:{"margin-top":"12px"}})]),_:1},8,["open","confirm-loading"]),e(Q,{open:ne.value,"onUpdate:open":o[15]||(o[15]=t=>ne.value=t),title:"异常评分检测",width:640,footer:null},{default:a(()=>[b("div",Ut,[e(me,{"label-col":{span:5},"wrapper-col":{span:19}},{default:a(()=>[e(R,{label:"检测方法"},{default:a(()=>[e(he,{value:I.method,"onUpdate:value":o[12]||(o[12]=t=>I.method=t),"button-style":"solid"},{default:a(()=>[(i(!0),p(E,null,N(v(gt),t=>(i(),S(ze,{key:t,value:t},{default:a(()=>[d(u(t==="z_score"?"Z 分数 (3σ)":"IQR (1.5×)"),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),_:1}),e(R,{label:"阈值"},{default:a(()=>[e(Z,{value:I.threshold,"onUpdate:value":o[13]||(o[13]=t=>I.threshold=t),min:.5,step:.1,style:{width:"120px"}},null,8,["value"]),o[29]||(o[29]=b("span",{style:{"margin-left":"8px",color:"var(--text-muted)","font-size":"12px"}},"默认 z_score=2.5 / iqr=1.5",-1))]),_:1}),e(R,{label:"衰减模型"},{default:a(()=>[e(de,{value:I.decay,"onUpdate:value":o[14]||(o[14]=t=>I.decay=t),style:{width:"200px"}},{default:a(()=>[(i(!0),p(E,null,N(v(Ie),t=>(i(),S(pe,{key:t,value:t},{default:a(()=>[d(u(ge(t)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),_:1}),e(R,{"wrapper-col":{offset:5,span:19}},{default:a(()=>[e(z,{type:"primary",loading:te.value,onClick:Xe},{icon:a(()=>[e(v(Ae))]),default:a(()=>[o[30]||(o[30]=d(" 开始检测 ",-1))]),_:1},8,["loading"])]),_:1})]),_:1}),e(ot),A.value?(i(),p("div",Lt,[e(ue,{gutter:12,style:{"margin-bottom":"12px"}},{default:a(()=>[e(C,{span:8},{default:a(()=>[e($,{title:"样本数",value:A.value.totalSamples,"value-style":{fontSize:"16px"}},null,8,["value"])]),_:1}),e(C,{span:8},{default:a(()=>[e($,{title:"阈值",value:A.value.threshold,precision:2,"value-style":{fontSize:"16px"}},null,8,["value"])]),_:1}),e(C,{span:8},{default:a(()=>[e($,{title:"异常数",value:A.value.anomalies.length,"value-style":{color:A.value.anomalies.length>0?"#ff4d4f":"#52c41a",fontSize:"16px"}},null,8,["value","value-style"])]),_:1})]),_:1}),A.value.message?(i(),S(U,{key:0,message:A.value.message,type:"warning","show-icon":"",style:{"margin-bottom":"12px"}},null,8,["message"])):f("",!0),A.value.anomalies.length?(i(),S(je,{key:1,size:"small","data-source":A.value.anomalies},{renderItem:a(({item:t})=>[e(Oe,null,{default:a(()=>[b("span",Bt,u(t.did),1),e(L,{color:"red",style:{"margin-left":"8px"}},{default:a(()=>[d("score: "+u(t.score.toFixed(4)),1)]),_:2},1024),b("span",Pt,u(t.reason),1),t.zScore!==null?(i(),p("span",Jt,"z="+u(t.zScore.toFixed(2)),1)):f("",!0)]),_:2},1024)]),_:1},8,["data-source"])):f("",!0)])):(i(),S(at,{key:0,description:"尚未检测",image:v(s)},null,8,["image"]))])]),_:1},8,["open"]),e(Q,{open:Y.value,"onUpdate:open":o[16]||(o[16]=t=>Y.value=t),title:`运行详情:${y.value?.runId?.slice(0,12)||""}`,width:780,footer:null},{default:a(()=>[y.value?(i(),p("div",Vt,[e(nt,{column:2,size:"small",bordered:""},{default:a(()=>[e(F,{label:"目标"},{default:a(()=>[e(L,{color:re(y.value.objective)},{default:a(()=>[d(u(G(y.value.objective)),1)]),_:1},8,["color"])]),_:1}),e(F,{label:"状态"},{default:a(()=>[e(L,{color:se(y.value.status)},{default:a(()=>[d(u(le(y.value.status)),1)]),_:1},8,["color"])]),_:1}),e(F,{label:"迭代次数"},{default:a(()=>[d(u(y.value.iterations),1)]),_:1}),e(F,{label:"最佳分数"},{default:a(()=>[b("span",{style:Re({color:ie(y.value.bestScore),fontWeight:500,fontFamily:"monospace"})},u(y.value.bestScore.toFixed(4)),5)]),_:1}),e(F,{label:"创建时间"},{default:a(()=>[d(u(v(ve)(y.value.createdAt)),1)]),_:1}),y.value.completedAt?(i(),S(F,{key:0,label:"完成时间"},{default:a(()=>[d(u(v(ve)(y.value.completedAt)),1)]),_:1})):f("",!0),y.value.bestParams?(i(),S(F,{key:1,label:"最佳参数",span:2},{default:a(()=>[b("pre",qt,u(Ke(y.value.bestParams)),1)]),_:1})):f("",!0),y.value.errorMessage?(i(),S(F,{key:2,label:"错误信息",span:2},{default:a(()=>[b("span",Kt,u(y.value.errorMessage),1)]),_:1})):f("",!0)]),_:1}),e(rt,{spinning:oe.value},{default:a(()=>[j.value?(i(),p("div",Wt,[o[31]||(o[31]=b("h4",{style:{color:"var(--text-primary)","font-size":"13px",margin:"0 0 10px"}},"声誉分布",-1)),e(T,{size:"small",style:{"margin-bottom":"12px"}},{default:a(()=>[(i(!0),p(E,null,N(j.value.reputationDistribution.buckets,t=>(i(),p("div",{key:t.label,class:"bucket-row"},[b("span",Yt,u(t.label),1),e(H,{percent:qe(t),"stroke-color":t.count>0?"#1677ff":"#d9d9d9",format:()=>`${t.count}`,size:"small",style:{flex:"1","margin-left":"12px"}},null,8,["percent","stroke-color","format"])]))),128)),j.value.reputationDistribution.mean!==null?(i(),p("div",Gt,[d(" 平均: "+u(j.value.reputationDistribution.mean.toFixed(4))+" ",1),j.value.reputationDistribution.stdDev!==null?(i(),p("span",Ht," 标准差: "+u(j.value.reputationDistribution.stdDev.toFixed(4)),1)):f("",!0)])):f("",!0)]),_:1}),j.value.recommendations.length?(i(),S(T,{key:0,title:"建议",size:"small"},{default:a(()=>[e(je,{size:"small","data-source":j.value.recommendations},{renderItem:a(({item:t})=>[e(Oe,null,{default:a(()=>[e(v(ft),{style:{color:"#faad14","margin-right":"8px"}}),d(" "+u(t),1)]),_:2},1024)]),_:1},8,["data-source"])]),_:1})):f("",!0)])):f("",!0)]),_:1},8,["spinning"])])):f("",!0)]),_:1},8,["open","title"])])}}},Io=st(Zt,[["__scopeId","data-v-ac9b3af6"]]);export{Io as default};
1
+ import{u as lt}from"./ws-Bv7YH0VB.js";import{s as Ee}from"./community-parser-CO25nZFt.js";import{_ as st}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{a as x}from"./index-BfKFNptm.js";import{Y as it,aD as Ae,m as ut,aE as we,aF as ct,E as Ce,a2 as pt,J as dt,ac as mt,ax as ft}from"./icons-ukMaZ3tx.js";import vt from"./index-C1p_dZw0.js";import{E as yt}from"./useConfigInject-DCcT0grw.js";import{l as bt,F as p,D as b,c as e,x as a,m as S,G as f,q as c,r as k,v as i,J as d,u as v,H as E,L as N,I as u,E as _t,N as Re,a as fe}from"./vendor-BVetwVfk.js";import"./index-DfcXDy2A.js";import"./transition-DSe9CgZe.js";import"./Keyframes-C7fCrnlS.js";import"./Portal-CHsntPCQ.js";import"./index-U4Zd5IK6.js";import"./KeyCode-D63Tfrq7.js";import"./omit-DvLh7wH1.js";import"./pickAttrs-BsseBclw.js";import"./initDefaultProps-B2vQoQga.js";import"./motion-D2eluOJu.js";import"./raf-Deuc0E8-.js";import"./index-yMt4C1Gh.js";import"./index-D3lD9wgX.js";import"./isVisible-C7tPsqfj.js";import"./useState-DoAhV80c.js";import"./devWarning-CNIS3FrJ.js";import"./warning-Pq00owYb.js";import"./compact-item-CHderV9n.js";import"./createContext-DMZ-5dy2.js";import"./Compact-D_dbJDbi.js";import"./_getTag-CWA3v-Ds.js";import"./styleChecker-Cz5mJgc8.js";import"./zoom-CDfM_sRk.js";import"./ActionButton-BQElVBgD.js";import"./vnode-Dexy2NN9.js";function P(l){const n=Ee(l);if(!n)return null;try{return JSON.parse(n)}catch{}const s=n.match(/\{[\s\S]*\}|\[[\s\S]*\]/);if(!s)return null;try{return JSON.parse(s[0])}catch{return null}}const ye=Object.freeze(["accuracy","fairness","resilience","convergence_speed"]),Ie=Object.freeze(["none","exponential","linear","step"]),gt=Object.freeze(["z_score","iqr"]),$e=Object.freeze(["running","complete","applied","failed","cancelled"]),xt=Object.freeze(["generic","task","review","vote"]);function h(l,n=0){return typeof l=="number"&&Number.isFinite(l)?l:n}function B(l){if(!l)return{noDb:!1,error:""};const n=Ee(l),s=/Database not available/i.test(n);return{noDb:s,error:s?"Database not available":""}}function kt(l,n=0){if(!l||typeof l!="object")return null;const s=l.did||"";return s?{key:s,did:s,score:h(l.score,0),observations:h(l.observations,0),decay:String(l.decay||"none"),weightTotal:h(l.weightTotal,0),_idx:n}:null}function Te(l){const n=P(l);return Array.isArray(n)?n.map(kt).filter(Boolean):[]}function Fe(l,n=0){if(!l||typeof l!="object")return null;const s=l.did||"";return s?{key:`${s}-${n}`,did:s,score:h(l.score,0),reason:String(l.reason||""),zScore:typeof l.zScore=="number"?l.zScore:null,lower:typeof l.lower=="number"?l.lower:null,upper:typeof l.upper=="number"?l.upper:null}:null}function St(l){const n=P(l);if(!n||typeof n!="object"||Array.isArray(n))return{method:"",threshold:0,totalSamples:0,anomalies:[],summary:"",message:""};const s=Array.isArray(n.anomalies)?n.anomalies.map(Fe).filter(Boolean):[];return{method:String(n.method||""),threshold:h(n.threshold,0),totalSamples:h(n.totalSamples,0),anomalies:s,summary:n.summary?String(n.summary):"",message:n.message?String(n.message):""}}function Ne(l,n=0){if(!l||typeof l!="object")return null;const s=l.runId||"";return s?{key:s,runId:s,objective:String(l.objective||""),iterations:h(l.iterations,0),paramSpace:l.paramSpace??null,bestParams:l.bestParams??null,bestScore:h(l.bestScore,0),status:String(l.status||"complete").toLowerCase(),createdAt:l.createdAt??null,completedAt:l.completedAt??null,analytics:l.analytics??null,errorMessage:l.errorMessage??"",_idx:n}:null}function zt(l){const n=P(l);return Array.isArray(n)?n.map(Ne).filter(Boolean):[]}function ht(l){const n=P(l);return!n||typeof n!="object"||Array.isArray(n)?null:Ne(n,0)}function Dt(l){const n=P(l);if(!n||typeof n!="object"||Array.isArray(n))return null;const s=n.reputationDistribution||{};return{analyticsId:String(n.analyticsId||""),runId:String(n.runId||""),reputationDistribution:{buckets:Array.isArray(s.buckets)?s.buckets.filter(m=>m&&typeof m=="object").map(m=>({label:String(m.label||""),count:h(m.count,0),min:typeof m.min=="number"?m.min:null,max:typeof m.max=="number"?m.max:null})):[],mean:typeof s.mean=="number"?s.mean:null,stdDev:typeof s.stdDev=="number"?s.stdDev:null},anomalies:n.anomalies&&typeof n.anomalies=="object"?{method:String(n.anomalies.method||""),totalSamples:h(n.anomalies.totalSamples,0),anomalies:Array.isArray(n.anomalies.anomalies)?n.anomalies.anomalies.map(Fe).filter(Boolean):[],summary:n.anomalies.summary?String(n.anomalies.summary):"",message:n.anomalies.message?String(n.anomalies.message):""}:{method:"",totalSamples:0,anomalies:[],summary:"",message:""},recommendations:Array.isArray(n.recommendations)?n.recommendations.filter(m=>typeof m=="string"):[]}}const Ot={totalRuns:0,activeRuns:0,maxConcurrentOptimizations:0,byStatus:{},byObjective:{},observations:{totalObservations:0,totalDids:0},bestScoreEver:0};function jt(l){const n=JSON.parse(JSON.stringify(Ot));for(const m of $e)n.byStatus[m]=0;for(const m of ye)n.byObjective[m]=0;const s=P(l);if(!s||typeof s!="object"||Array.isArray(s))return n;if(n.totalRuns=h(s.totalRuns,0),n.activeRuns=h(s.activeRuns,0),n.maxConcurrentOptimizations=h(s.maxConcurrentOptimizations,0),n.bestScoreEver=h(s.bestScoreEver,0),s.byStatus&&typeof s.byStatus=="object")for(const[m,O]of Object.entries(s.byStatus))typeof O=="number"&&Number.isFinite(O)&&(n.byStatus[m]=O);if(s.byObjective&&typeof s.byObjective=="object")for(const[m,O]of Object.entries(s.byObjective))typeof O=="number"&&Number.isFinite(O)&&(n.byObjective[m]=O);return s.observations&&typeof s.observations=="object"&&(n.observations.totalObservations=h(s.observations.totalObservations,0),n.observations.totalDids=h(s.observations.totalDids,0)),n}function ve(l){if(l==null||l==="")return"—";const n=typeof l=="number"?new Date(l):new Date(String(l));return isNaN(n.getTime())?String(l):n.toLocaleString("zh-CN",{hour12:!1})}const At={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},wt={class:"filter-bar"},Ct={key:1,style:{color:"var(--text-primary)","font-family":"monospace","font-size":"12px"}},Rt={key:3,style:{color:"var(--text-secondary)"}},It={key:4,style:{color:"var(--text-secondary)","font-family":"monospace","font-size":"12px"}},Tt={style:{padding:"40px",color:"var(--text-muted)","text-align":"center"}},Et={key:0,style:{color:"var(--text-primary)","font-family":"monospace","font-size":"12px"}},$t={key:2,style:{color:"var(--text-secondary)"}},Ft={key:5,style:{color:"var(--text-secondary)","font-size":"11px"}},Nt={style:{padding:"40px",color:"var(--text-muted)","text-align":"center"}},Mt={style:{color:"var(--text-muted)","font-size":"11px","margin-top":"4px"}},Ut={style:{"padding-top":"8px"}},Lt={key:1},Bt={style:{"font-family":"monospace","font-size":"12px",color:"var(--text-primary)"}},Pt={style:{"margin-left":"8px",color:"var(--text-secondary)","font-size":"12px"}},Jt={key:0,style:{"margin-left":"8px",color:"var(--text-muted)","font-size":"11px"}},Vt={key:0,style:{"padding-top":"8px"}},qt={class:"params-pre"},Kt={style:{color:"#ff4d4f"}},Wt={key:0,style:{"margin-top":"16px"}},Yt={class:"bucket-label"},Gt={key:0,style:{"margin-top":"8px",color:"var(--text-secondary)","font-size":"12px"}},Ht={key:0,style:{"margin-left":"12px"}},Zt={__name:"Reputation",setup(l){const n=lt(),s=yt.PRESENTED_IMAGE_SIMPLE,m=k(!1),O=k(!1),ee=k(!1),te=k(!1),oe=k(!1),ae=k([]),be=k([]),D=k({totalRuns:0,activeRuns:0,maxConcurrentOptimizations:0,byStatus:{},byObjective:{},observations:{totalObservations:0,totalDids:0},bestScoreEver:0}),V=k({noDb:!1,error:""}),_e=k("scores"),q=k("none"),K=k(!1),W=k(!1),ne=k(!1),Y=k(!1),_=fe({did:"",score:.8,kind:"generic",weight:1}),M=fe({objective:"accuracy",iterations:50}),I=fe({method:"z_score",threshold:2.5,decay:"none"}),y=k(null),j=k(null),A=k(null),Me=[{title:"排名",key:"rank",width:"60px"},{title:"DID",key:"did"},{title:"声誉分数",key:"score",width:"220px"},{title:"观察数",key:"observations",width:"100px"},{title:"权重和",key:"weightTotal",width:"100px"}],Ue=[{title:"Run ID",key:"runId",width:"140px"},{title:"目标",key:"objective",width:"140px"},{title:"迭代",key:"iterations",width:"80px"},{title:"最佳分数",key:"bestScore",width:"110px"},{title:"状态",key:"status",width:"100px"},{title:"创建时间",key:"createdAt",width:"160px"},{title:"操作",key:"action",width:"160px"}];function ge(r){return{none:"无",exponential:"指数",linear:"线性",step:"步进"}[r]||r}function Le(r){return{generic:"通用",task:"任务",review:"评审",vote:"投票"}[r]||r}function G(r){return{accuracy:"准确性",fairness:"公平性",resilience:"抗扰动",convergence_speed:"收敛速度"}[r]||r}function re(r){return{accuracy:"blue",fairness:"green",resilience:"purple",convergence_speed:"orange"}[r]||"default"}function Be(r){return{accuracy:"#1677ff",fairness:"#52c41a",resilience:"#722ed1",convergence_speed:"#fa8c16"}[r]||"#888"}function Pe(r){return{accuracy:"最大化对真实声誉的拟合",fairness:"降低衰减强度,平等对待各 DID",resilience:"提高对异常值的容忍度",convergence_speed:"尽量少迭代获得稳定结果"}[r]||""}function le(r){return{running:"运行中",complete:"已完成",applied:"已应用",failed:"失败",cancelled:"已取消"}[r]||r}function se(r){return{running:"processing",complete:"blue",applied:"green",failed:"red",cancelled:"default"}[r]||"default"}function Je(r){return{running:"#1677ff",complete:"#13c2c2",applied:"#52c41a",failed:"#ff4d4f",cancelled:"#888"}[r]||"#888"}function Ve(r){return r===0?"gold":r===1?"silver":r===2?"bronze":""}function ie(r){return r>=.8?"#52c41a":r>=.5?"#1677ff":r>=.3?"#faad14":"#ff4d4f"}function xe(r,o){return o?Math.round(r/o*100):0}function qe(r){const o=j.value?.reputationDistribution.buckets.reduce((z,w)=>z+w.count,0)||0;return o?Math.round(r.count/o*100):0}function Ke(r){if(typeof r=="string")return r;try{return JSON.stringify(r,null,2)}catch{return String(r)}}async function J(){m.value=!0,V.value={noDb:!1,error:""};try{const[r,o,z]=await Promise.all([n.execute(`reputation list --decay ${q.value} --json`,1e4).catch(()=>({output:""})),n.execute("reputation runs --limit 50 --json",1e4).catch(()=>({output:""})),n.execute("reputation stats-v2 --json",8e3).catch(()=>({output:""}))]),w=[r,o,z].map(U=>B(U.output)).find(U=>U.noDb);w&&(V.value=w),ae.value=Te(r.output),be.value=zt(o.output),D.value=jt(z.output)}catch(r){x.error("加载声誉数据失败: "+(r?.message||r))}finally{m.value=!1}}async function We(){try{const{output:r}=await n.execute(`reputation list --decay ${q.value} --json`,1e4),o=B(r);if(o.noDb){V.value=o;return}ae.value=Te(r)}catch(r){x.error("加载评分失败: "+(r?.message||r))}}async function Ye(){if(!_.did.trim()){x.warning("请填写 DID");return}if(_.score<0||_.score>1){x.warning("评分必须在 0 ~ 1 之间");return}O.value=!0;try{const r=[`reputation observe "${_.did.trim().replace(/"/g,'\\"')}"`,String(_.score),`-k ${_.kind}`,`-w ${_.weight}`,"--json"],{output:o}=await n.execute(r.join(" "),1e4);if(B(o).noDb){x.error("需要先 cc init 初始化项目");return}if(!/"did"/.test(o)){x.error("记录失败: "+o.slice(0,120));return}x.success("观察已记录"),K.value=!1,Se(),await J()}catch(r){x.error("记录失败: "+(r?.message||r))}finally{O.value=!1}}async function Ge(){ee.value=!0;try{const r=["reputation optimize",`-o ${M.objective}`,`-i ${M.iterations}`,"--json"],{output:o}=await n.execute(r.join(" "),6e4);if(B(o).noDb){x.error("需要先 cc init 初始化项目");return}const w=ht(o);if(!w){x.error("优化失败: "+o.slice(0,120));return}W.value=!1,x.success(`优化完成,最佳分数 ${w.bestScore.toFixed(4)}`),await J(),y.value=w,Y.value=!0,await ke()}catch(r){x.error("优化失败: "+(r?.message||r))}finally{ee.value=!1}}async function He(r){vt.confirm({title:"应用本次优化结果?",content:`Run ${r.runId.slice(0,12)} 的最佳参数将被标记为已应用。`,okText:"应用",cancelText:"取消",onOk:async()=>{try{const{output:o}=await n.execute(`reputation apply ${r.runId}`,8e3);if(B(o).noDb){x.error("需要先 cc init 初始化项目");return}if(/Failed|Error/i.test(o)&&!/Applied/i.test(o)){x.error("应用失败: "+o.slice(0,120));return}x.success("已应用"),await J()}catch(o){x.error("应用失败: "+(o?.message||o))}}})}async function Ze(r){y.value=r,j.value=null,Y.value=!0,await ke()}async function ke(){if(y.value){oe.value=!0;try{const{output:r}=await n.execute(`reputation analytics ${y.value.runId} --json`,8e3);if(B(r).noDb)return;j.value=Dt(r)}catch{}finally{oe.value=!1}}}function Qe(){A.value=null,ne.value=!0}async function Xe(){te.value=!0;try{const r=["reputation anomalies",`-m ${I.method}`,`-t ${I.threshold}`,`-d ${I.decay}`,"--json"],{output:o}=await n.execute(r.join(" "),1e4);if(B(o).noDb){x.error("需要先 cc init 初始化项目");return}A.value=St(o)}catch(r){x.error("检测失败: "+(r?.message||r))}finally{te.value=!1}}function Se(){_.did="",_.score=.8,_.kind="generic",_.weight=1}return bt(J),(r,o)=>{const z=c("a-button"),w=c("a-space"),U=c("a-alert"),$=c("a-statistic"),T=c("a-card"),C=c("a-col"),ue=c("a-row"),ze=c("a-radio-button"),he=c("a-radio-group"),H=c("a-progress"),De=c("a-table"),ce=c("a-tab-pane"),L=c("a-tag"),et=c("a-tabs"),tt=c("a-input"),R=c("a-form-item"),Z=c("a-input-number"),pe=c("a-select-option"),de=c("a-select"),me=c("a-form"),Q=c("a-modal"),ot=c("a-divider"),at=c("a-empty"),Oe=c("a-list-item"),je=c("a-list"),F=c("a-descriptions-item"),nt=c("a-descriptions"),rt=c("a-spin");return i(),p("div",null,[b("div",At,[o[20]||(o[20]=b("div",null,[b("h2",{class:"page-title"},"声誉优化"),b("p",{class:"page-sub"},"观察记录 · 衰减模型 · 异常检测 · 贝叶斯参数优化")],-1)),e(w,null,{default:a(()=>[e(z,{loading:m.value,onClick:J},{icon:a(()=>[e(v(it))]),default:a(()=>[o[17]||(o[17]=d(" 刷新 ",-1))]),_:1},8,["loading"]),e(z,{onClick:Qe},{icon:a(()=>[e(v(Ae))]),default:a(()=>[o[18]||(o[18]=d(" 异常检测 ",-1))]),_:1}),e(z,{type:"primary",onClick:o[0]||(o[0]=t=>W.value=!0)},{icon:a(()=>[e(v(ut))]),default:a(()=>[o[19]||(o[19]=d(" 启动优化 ",-1))]),_:1})]),_:1})]),V.value.noDb?(i(),S(U,{key:0,type:"info","show-icon":"",message:"该模块需要项目级数据库",description:"`cc reputation ...` 命令仅在 chainlesschain 项目目录下可用。请先运行 `cc init` 初始化项目,或在已初始化的目录启动 `cc serve`。",style:{"margin-bottom":"16px"}})):f("",!0),e(ue,{gutter:[16,16],style:{"margin-bottom":"20px"}},{default:a(()=>[e(C,{xs:12,sm:8,lg:5},{default:a(()=>[e(T,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[e($,{title:"跟踪 DID",value:D.value.observations.totalDids,"value-style":{color:"#1677ff",fontSize:"20px"}},{prefix:a(()=>[e(v(we))]),_:1},8,["value"])]),_:1})]),_:1}),e(C,{xs:12,sm:8,lg:5},{default:a(()=>[e(T,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[e($,{title:"观察总数",value:D.value.observations.totalObservations,"value-style":{color:"#722ed1",fontSize:"20px"}},{prefix:a(()=>[e(v(ct))]),_:1},8,["value"])]),_:1})]),_:1}),e(C,{xs:12,sm:8,lg:5},{default:a(()=>[e(T,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[e($,{title:"优化运行",value:D.value.totalRuns,"value-style":{color:"#13c2c2",fontSize:"20px"}},{prefix:a(()=>[e(v(Ce))]),_:1},8,["value"])]),_:1})]),_:1}),e(C,{xs:12,sm:8,lg:5},{default:a(()=>[e(T,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[e($,{title:"进行中",value:D.value.activeRuns,"value-style":{color:D.value.activeRuns>0?"#1677ff":"#888",fontSize:"20px"},suffix:`/ ${D.value.maxConcurrentOptimizations}`},{prefix:a(()=>[e(v(pt))]),_:1},8,["value","value-style","suffix"])]),_:1})]),_:1}),e(C,{xs:24,sm:8,lg:4},{default:a(()=>[e(T,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[e($,{title:"历史最佳",value:D.value.bestScoreEver,precision:3,"value-style":{color:"#52c41a",fontSize:"20px"}},{prefix:a(()=>[e(v(dt))]),_:1},8,["value"])]),_:1})]),_:1})]),_:1}),e(et,{activeKey:_e.value,"onUpdate:activeKey":o[3]||(o[3]=t=>_e.value=t),class:"reputation-tabs"},{default:a(()=>[e(ce,{key:"scores",tab:"评分排行"},{default:a(()=>[b("div",wt,[o[22]||(o[22]=b("span",{style:{color:"var(--text-secondary)","font-size":"12px"}},"衰减模型:",-1)),e(he,{value:q.value,"onUpdate:value":o[1]||(o[1]=t=>q.value=t),size:"small","button-style":"solid",onChange:We},{default:a(()=>[(i(!0),p(E,null,N(v(Ie),t=>(i(),S(ze,{key:t,value:t},{default:a(()=>[d(u(ge(t)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"]),e(z,{size:"small",onClick:o[2]||(o[2]=t=>K.value=!0)},{icon:a(()=>[e(v(mt))]),default:a(()=>[o[21]||(o[21]=d(" 添加观察 ",-1))]),_:1})]),e(De,{columns:Me,"data-source":ae.value,pagination:{pageSize:20,showTotal:t=>`共 ${t} 个 DID`},size:"small",loading:m.value,style:{background:"var(--bg-card)"}},{bodyCell:a(({column:t,record:g,index:X})=>[t.key==="rank"?(i(),p("span",{key:0,class:_t(["rank-pill",Ve(X)])},u(X+1),3)):f("",!0),t.key==="did"?(i(),p("span",Ct,u(g.did),1)):f("",!0),t.key==="score"?(i(),S(H,{key:2,percent:Math.round(g.score*100),"stroke-color":ie(g.score),size:"small",format:()=>g.score.toFixed(4)},null,8,["percent","stroke-color","format"])):f("",!0),t.key==="observations"?(i(),p("span",Rt,u(g.observations),1)):f("",!0),t.key==="weightTotal"?(i(),p("span",It,u(g.weightTotal.toFixed(2)),1)):f("",!0)]),emptyText:a(()=>[b("div",Tt,[e(v(we),{style:{"font-size":"36px","margin-bottom":"10px",display:"block"}}),o[23]||(o[23]=d(' 暂无声誉数据,点"添加观察"记录第一条 ',-1))])]),_:1},8,["data-source","pagination","loading"])]),_:1}),e(ce,{key:"runs",tab:"优化运行"},{default:a(()=>[e(De,{columns:Ue,"data-source":be.value,pagination:{pageSize:20,showTotal:t=>`共 ${t} 条`},size:"small",loading:m.value,style:{background:"var(--bg-card)"}},{bodyCell:a(({column:t,record:g})=>[t.key==="runId"?(i(),p("span",Et,u(g.runId.slice(0,12)),1)):f("",!0),t.key==="objective"?(i(),S(L,{key:1,color:re(g.objective),style:{"font-family":"monospace"}},{default:a(()=>[d(u(G(g.objective)),1)]),_:2},1032,["color"])):f("",!0),t.key==="iterations"?(i(),p("span",$t,u(g.iterations),1)):f("",!0),t.key==="bestScore"?(i(),p("span",{key:3,style:Re({color:ie(g.bestScore),fontWeight:500,fontFamily:"monospace"})},u(g.bestScore.toFixed(4)),5)):f("",!0),t.key==="status"?(i(),S(L,{key:4,color:se(g.status)},{default:a(()=>[d(u(le(g.status)),1)]),_:2},1032,["color"])):f("",!0),t.key==="createdAt"?(i(),p("span",Ft,u(v(ve)(g.createdAt)),1)):f("",!0),t.key==="action"?(i(),p(E,{key:6},[e(z,{size:"small",type:"link",onClick:X=>Ze(g)},{default:a(()=>[...o[24]||(o[24]=[d("分析",-1)])]),_:1},8,["onClick"]),g.status==="complete"?(i(),S(z,{key:0,size:"small",type:"link",style:{color:"#52c41a"},onClick:X=>He(g)},{default:a(()=>[...o[25]||(o[25]=[d("应用",-1)])]),_:1},8,["onClick"])):f("",!0)],64)):f("",!0)]),emptyText:a(()=>[b("div",Nt,[e(v(Ce),{style:{"font-size":"36px","margin-bottom":"10px",display:"block"}}),o[26]||(o[26]=d(' 暂无优化运行,点"启动优化"开始第一次 ',-1))])]),_:1},8,["data-source","pagination","loading"])]),_:1}),e(ce,{key:"breakdown",tab:"分布统计"},{default:a(()=>[e(ue,{gutter:[16,16]},{default:a(()=>[e(C,{xs:24,lg:12},{default:a(()=>[e(T,{title:"按状态",size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[(i(!0),p(E,null,N(v($e),t=>(i(),p("div",{key:t,class:"bd-row"},[e(L,{color:se(t),style:{"min-width":"80px","text-align":"center"}},{default:a(()=>[d(u(le(t)),1)]),_:2},1032,["color"]),e(H,{percent:xe(D.value.byStatus[t]||0,D.value.totalRuns),"stroke-color":Je(t),format:()=>`${D.value.byStatus[t]||0}`,size:"small",style:{flex:"1","margin-left":"12px"}},null,8,["percent","stroke-color","format"])]))),128))]),_:1})]),_:1}),e(C,{xs:24,lg:12},{default:a(()=>[e(T,{title:"按目标",size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[(i(!0),p(E,null,N(v(ye),t=>(i(),p("div",{key:t,class:"bd-row"},[e(L,{color:re(t),style:{"min-width":"100px","text-align":"center","font-family":"monospace"}},{default:a(()=>[d(u(G(t)),1)]),_:2},1032,["color"]),e(H,{percent:xe(D.value.byObjective[t]||0,D.value.totalRuns),"stroke-color":Be(t),format:()=>`${D.value.byObjective[t]||0}`,size:"small",style:{flex:"1","margin-left":"12px"}},null,8,["percent","stroke-color","format"])]))),128))]),_:1})]),_:1})]),_:1})]),_:1})]),_:1},8,["activeKey"]),e(Q,{open:K.value,"onUpdate:open":o[8]||(o[8]=t=>K.value=t),title:"添加观察记录","confirm-loading":O.value,width:540,"ok-text":"记录","cancel-text":"取消",onOk:Ye,onCancel:Se},{default:a(()=>[e(me,{"label-col":{span:5},"wrapper-col":{span:19},style:{"margin-top":"16px"}},{default:a(()=>[e(R,{label:"DID",required:""},{default:a(()=>[e(tt,{value:_.did,"onUpdate:value":o[4]||(o[4]=t=>_.did=t),placeholder:"did:key:..."},null,8,["value"])]),_:1}),e(R,{label:"评分",required:""},{default:a(()=>[e(Z,{value:_.score,"onUpdate:value":o[5]||(o[5]=t=>_.score=t),min:0,max:1,step:.05,style:{width:"160px"}},null,8,["value"]),o[27]||(o[27]=b("span",{style:{"margin-left":"8px",color:"var(--text-muted)","font-size":"12px"}},"范围 0.0 ~ 1.0",-1))]),_:1}),e(R,{label:"种类"},{default:a(()=>[e(de,{value:_.kind,"onUpdate:value":o[6]||(o[6]=t=>_.kind=t)},{default:a(()=>[(i(!0),p(E,null,N(v(xt),t=>(i(),S(pe,{key:t,value:t},{default:a(()=>[d(u(Le(t)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),_:1}),e(R,{label:"权重"},{default:a(()=>[e(Z,{value:_.weight,"onUpdate:value":o[7]||(o[7]=t=>_.weight=t),min:.1,step:.1,style:{width:"120px"}},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"]),e(Q,{open:W.value,"onUpdate:open":o[11]||(o[11]=t=>W.value=t),title:"启动优化","confirm-loading":ee.value,width:540,"ok-text":"启动","cancel-text":"取消",onOk:Ge},{default:a(()=>[e(me,{"label-col":{span:5},"wrapper-col":{span:19},style:{"margin-top":"16px"}},{default:a(()=>[e(R,{label:"目标",required:""},{default:a(()=>[e(de,{value:M.objective,"onUpdate:value":o[9]||(o[9]=t=>M.objective=t)},{default:a(()=>[(i(!0),p(E,null,N(v(ye),t=>(i(),S(pe,{key:t,value:t},{default:a(()=>[d(u(G(t)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"]),b("div",Mt,u(Pe(M.objective)),1)]),_:1}),e(R,{label:"迭代次数"},{default:a(()=>[e(Z,{value:M.iterations,"onUpdate:value":o[10]||(o[10]=t=>M.iterations=t),min:1,max:1e3,step:10,style:{width:"160px"}},null,8,["value"]),o[28]||(o[28]=b("span",{style:{"margin-left":"8px",color:"var(--text-muted)","font-size":"12px"}},"范围 1 ~ 1000,默认 50",-1))]),_:1})]),_:1}),e(U,{type:"info","show-icon":"",message:"同步执行",description:"优化将运行所有迭代后立即返回最佳参数与建议(CLI lib 内置启发式 Bayesian 模拟)。",style:{"margin-top":"12px"}})]),_:1},8,["open","confirm-loading"]),e(Q,{open:ne.value,"onUpdate:open":o[15]||(o[15]=t=>ne.value=t),title:"异常评分检测",width:640,footer:null},{default:a(()=>[b("div",Ut,[e(me,{"label-col":{span:5},"wrapper-col":{span:19}},{default:a(()=>[e(R,{label:"检测方法"},{default:a(()=>[e(he,{value:I.method,"onUpdate:value":o[12]||(o[12]=t=>I.method=t),"button-style":"solid"},{default:a(()=>[(i(!0),p(E,null,N(v(gt),t=>(i(),S(ze,{key:t,value:t},{default:a(()=>[d(u(t==="z_score"?"Z 分数 (3σ)":"IQR (1.5×)"),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),_:1}),e(R,{label:"阈值"},{default:a(()=>[e(Z,{value:I.threshold,"onUpdate:value":o[13]||(o[13]=t=>I.threshold=t),min:.5,step:.1,style:{width:"120px"}},null,8,["value"]),o[29]||(o[29]=b("span",{style:{"margin-left":"8px",color:"var(--text-muted)","font-size":"12px"}},"默认 z_score=2.5 / iqr=1.5",-1))]),_:1}),e(R,{label:"衰减模型"},{default:a(()=>[e(de,{value:I.decay,"onUpdate:value":o[14]||(o[14]=t=>I.decay=t),style:{width:"200px"}},{default:a(()=>[(i(!0),p(E,null,N(v(Ie),t=>(i(),S(pe,{key:t,value:t},{default:a(()=>[d(u(ge(t)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),_:1}),e(R,{"wrapper-col":{offset:5,span:19}},{default:a(()=>[e(z,{type:"primary",loading:te.value,onClick:Xe},{icon:a(()=>[e(v(Ae))]),default:a(()=>[o[30]||(o[30]=d(" 开始检测 ",-1))]),_:1},8,["loading"])]),_:1})]),_:1}),e(ot),A.value?(i(),p("div",Lt,[e(ue,{gutter:12,style:{"margin-bottom":"12px"}},{default:a(()=>[e(C,{span:8},{default:a(()=>[e($,{title:"样本数",value:A.value.totalSamples,"value-style":{fontSize:"16px"}},null,8,["value"])]),_:1}),e(C,{span:8},{default:a(()=>[e($,{title:"阈值",value:A.value.threshold,precision:2,"value-style":{fontSize:"16px"}},null,8,["value"])]),_:1}),e(C,{span:8},{default:a(()=>[e($,{title:"异常数",value:A.value.anomalies.length,"value-style":{color:A.value.anomalies.length>0?"#ff4d4f":"#52c41a",fontSize:"16px"}},null,8,["value","value-style"])]),_:1})]),_:1}),A.value.message?(i(),S(U,{key:0,message:A.value.message,type:"warning","show-icon":"",style:{"margin-bottom":"12px"}},null,8,["message"])):f("",!0),A.value.anomalies.length?(i(),S(je,{key:1,size:"small","data-source":A.value.anomalies},{renderItem:a(({item:t})=>[e(Oe,null,{default:a(()=>[b("span",Bt,u(t.did),1),e(L,{color:"red",style:{"margin-left":"8px"}},{default:a(()=>[d("score: "+u(t.score.toFixed(4)),1)]),_:2},1024),b("span",Pt,u(t.reason),1),t.zScore!==null?(i(),p("span",Jt,"z="+u(t.zScore.toFixed(2)),1)):f("",!0)]),_:2},1024)]),_:1},8,["data-source"])):f("",!0)])):(i(),S(at,{key:0,description:"尚未检测",image:v(s)},null,8,["image"]))])]),_:1},8,["open"]),e(Q,{open:Y.value,"onUpdate:open":o[16]||(o[16]=t=>Y.value=t),title:`运行详情:${y.value?.runId?.slice(0,12)||""}`,width:780,footer:null},{default:a(()=>[y.value?(i(),p("div",Vt,[e(nt,{column:2,size:"small",bordered:""},{default:a(()=>[e(F,{label:"目标"},{default:a(()=>[e(L,{color:re(y.value.objective)},{default:a(()=>[d(u(G(y.value.objective)),1)]),_:1},8,["color"])]),_:1}),e(F,{label:"状态"},{default:a(()=>[e(L,{color:se(y.value.status)},{default:a(()=>[d(u(le(y.value.status)),1)]),_:1},8,["color"])]),_:1}),e(F,{label:"迭代次数"},{default:a(()=>[d(u(y.value.iterations),1)]),_:1}),e(F,{label:"最佳分数"},{default:a(()=>[b("span",{style:Re({color:ie(y.value.bestScore),fontWeight:500,fontFamily:"monospace"})},u(y.value.bestScore.toFixed(4)),5)]),_:1}),e(F,{label:"创建时间"},{default:a(()=>[d(u(v(ve)(y.value.createdAt)),1)]),_:1}),y.value.completedAt?(i(),S(F,{key:0,label:"完成时间"},{default:a(()=>[d(u(v(ve)(y.value.completedAt)),1)]),_:1})):f("",!0),y.value.bestParams?(i(),S(F,{key:1,label:"最佳参数",span:2},{default:a(()=>[b("pre",qt,u(Ke(y.value.bestParams)),1)]),_:1})):f("",!0),y.value.errorMessage?(i(),S(F,{key:2,label:"错误信息",span:2},{default:a(()=>[b("span",Kt,u(y.value.errorMessage),1)]),_:1})):f("",!0)]),_:1}),e(rt,{spinning:oe.value},{default:a(()=>[j.value?(i(),p("div",Wt,[o[31]||(o[31]=b("h4",{style:{color:"var(--text-primary)","font-size":"13px",margin:"0 0 10px"}},"声誉分布",-1)),e(T,{size:"small",style:{"margin-bottom":"12px"}},{default:a(()=>[(i(!0),p(E,null,N(j.value.reputationDistribution.buckets,t=>(i(),p("div",{key:t.label,class:"bucket-row"},[b("span",Yt,u(t.label),1),e(H,{percent:qe(t),"stroke-color":t.count>0?"#1677ff":"#d9d9d9",format:()=>`${t.count}`,size:"small",style:{flex:"1","margin-left":"12px"}},null,8,["percent","stroke-color","format"])]))),128)),j.value.reputationDistribution.mean!==null?(i(),p("div",Gt,[d(" 平均: "+u(j.value.reputationDistribution.mean.toFixed(4))+" ",1),j.value.reputationDistribution.stdDev!==null?(i(),p("span",Ht," 标准差: "+u(j.value.reputationDistribution.stdDev.toFixed(4)),1)):f("",!0)])):f("",!0)]),_:1}),j.value.recommendations.length?(i(),S(T,{key:0,title:"建议",size:"small"},{default:a(()=>[e(je,{size:"small","data-source":j.value.recommendations},{renderItem:a(({item:t})=>[e(Oe,null,{default:a(()=>[e(v(ft),{style:{color:"#faad14","margin-right":"8px"}}),d(" "+u(t),1)]),_:2},1024)]),_:1},8,["data-source"])]),_:1})):f("",!0)])):f("",!0)]),_:1},8,["spinning"])])):f("",!0)]),_:1},8,["open","title"])])}}},Io=st(Zt,[["__scopeId","data-v-ac9b3af6"]]);export{Io as default};
@@ -1 +1 @@
1
- import{u as z,_ as S,c as B}from"./useConfigInject-BKqJUQaF.js";import{_ as $,z as f}from"./index-ZZ_4A9um.js";import{u as N,r as u}from"./responsiveObserve-BzrPInK7.js";import{u as E}from"./useFlexGapSupport--RuYYIc6.js";import{b as F,c as I}from"./index-D-0g6tCK.js";import{d as M,l as T,o as V,c as D,r as h,j as o}from"./vendor-BVetwVfk.js";const J=()=>({align:f([String,Object]),justify:f([String,Object]),prefixCls:String,gutter:f([Number,Array,Object],0),wrap:{type:Boolean,default:void 0}}),Q=M({compatConfig:{MODE:3},name:"ARow",inheritAttrs:!1,props:J(),setup(s,G){let{slots:d,attrs:l}=G;const{prefixCls:a,direction:R}=z("row",s),[O,C]=F(a);let m;const v=N(),p=h({xs:!0,sm:!0,md:!0,lg:!0,xl:!0,xxl:!0}),y=h({xs:!1,sm:!1,md:!1,lg:!1,xl:!1,xxl:!1}),g=e=>o(()=>{if(typeof s[e]=="string")return s[e];if(typeof s[e]!="object")return"";for(let t=0;t<u.length;t++){const n=u[t];if(!y.value[n])continue;const r=s[e][n];if(r!==void 0)return r}return""}),b=g("align"),x=g("justify"),w=E();T(()=>{m=v.value.subscribe(e=>{y.value=e;const t=s.gutter||0;(!Array.isArray(t)&&typeof t=="object"||Array.isArray(t)&&(typeof t[0]=="object"||typeof t[1]=="object"))&&(p.value=e)})}),V(()=>{v.value.unsubscribe(m)});const j=o(()=>{const e=[void 0,void 0],{gutter:t=0}=s;return(Array.isArray(t)?t:[t,void 0]).forEach((r,A)=>{if(typeof r=="object")for(let i=0;i<u.length;i++){const c=u[i];if(p.value[c]&&r[c]!==void 0){e[A]=r[c];break}}else e[A]=r}),e});I({gutter:j,supportFlexGap:w,wrap:o(()=>s.wrap)});const _=o(()=>B(a.value,{[`${a.value}-no-wrap`]:s.wrap===!1,[`${a.value}-${x.value}`]:x.value,[`${a.value}-${b.value}`]:b.value,[`${a.value}-rtl`]:R.value==="rtl"},l.class,C.value)),k=o(()=>{const e=j.value,t={},n=e[0]!=null&&e[0]>0?`${e[0]/-2}px`:void 0,r=e[1]!=null&&e[1]>0?`${e[1]/-2}px`:void 0;return n&&(t.marginLeft=n,t.marginRight=n),w.value?t.rowGap=`${e[1]}px`:r&&(t.marginTop=r,t.marginBottom=r),t});return()=>{var e;return O(D("div",S(S({},l),{},{class:_.value,style:$($({},k.value),l.style)}),[(e=d.default)===null||e===void 0?void 0:e.call(d)]))}}});export{Q as A};
1
+ import{u as z,_ as S,c as B}from"./useConfigInject-DCcT0grw.js";import{_ as $,z as f}from"./index-DfcXDy2A.js";import{u as N,r as u}from"./responsiveObserve-ByCb5zZK.js";import{u as E}from"./useFlexGapSupport-BZkoDuF3.js";import{b as F,c as I}from"./index-DvfAkHw8.js";import{d as M,l as T,o as V,c as D,r as h,j as o}from"./vendor-BVetwVfk.js";const J=()=>({align:f([String,Object]),justify:f([String,Object]),prefixCls:String,gutter:f([Number,Array,Object],0),wrap:{type:Boolean,default:void 0}}),Q=M({compatConfig:{MODE:3},name:"ARow",inheritAttrs:!1,props:J(),setup(s,G){let{slots:d,attrs:l}=G;const{prefixCls:a,direction:R}=z("row",s),[O,C]=F(a);let m;const v=N(),p=h({xs:!0,sm:!0,md:!0,lg:!0,xl:!0,xxl:!0}),y=h({xs:!1,sm:!1,md:!1,lg:!1,xl:!1,xxl:!1}),g=e=>o(()=>{if(typeof s[e]=="string")return s[e];if(typeof s[e]!="object")return"";for(let t=0;t<u.length;t++){const n=u[t];if(!y.value[n])continue;const r=s[e][n];if(r!==void 0)return r}return""}),b=g("align"),x=g("justify"),w=E();T(()=>{m=v.value.subscribe(e=>{y.value=e;const t=s.gutter||0;(!Array.isArray(t)&&typeof t=="object"||Array.isArray(t)&&(typeof t[0]=="object"||typeof t[1]=="object"))&&(p.value=e)})}),V(()=>{v.value.unsubscribe(m)});const j=o(()=>{const e=[void 0,void 0],{gutter:t=0}=s;return(Array.isArray(t)?t:[t,void 0]).forEach((r,A)=>{if(typeof r=="object")for(let i=0;i<u.length;i++){const c=u[i];if(p.value[c]&&r[c]!==void 0){e[A]=r[c];break}}else e[A]=r}),e});I({gutter:j,supportFlexGap:w,wrap:o(()=>s.wrap)});const _=o(()=>B(a.value,{[`${a.value}-no-wrap`]:s.wrap===!1,[`${a.value}-${x.value}`]:x.value,[`${a.value}-${b.value}`]:b.value,[`${a.value}-rtl`]:R.value==="rtl"},l.class,C.value)),k=o(()=>{const e=j.value,t={},n=e[0]!=null&&e[0]>0?`${e[0]/-2}px`:void 0,r=e[1]!=null&&e[1]>0?`${e[1]/-2}px`:void 0;return n&&(t.marginLeft=n,t.marginRight=n),w.value?t.rowGap=`${e[1]}px`:r&&(t.marginTop=r,t.marginBottom=r),t});return()=>{var e;return O(D("div",S(S({},l),{},{class:_.value,style:$($({},k.value),l.style)}),[(e=d.default)===null||e===void 0?void 0:e.call(d)]))}}});export{Q as A};