chainlesschain 0.157.5 → 0.157.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/assets/web-panel/.build-hash +1 -1
- package/src/assets/web-panel/assets/AIOps-BT4aiWvN.js +1 -0
- package/src/assets/web-panel/assets/{ActionButton-DiRyhKar.js → ActionButton-DAsV0-Ys.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-C-wKOKnM.js → Analytics-DD0zl4Pt.js} +1 -1
- package/src/assets/web-panel/assets/AppLayout-C39vcA-h.js +1 -0
- package/src/assets/web-panel/assets/AppLayout-CQShwOhr.css +1 -0
- package/src/assets/web-panel/assets/{Backup-Bk1_Tsej.js → Backup-YA2dxmc0.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-BZ74CVZs.js → BaseInput-DEsW823u.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-DZ__6l_m.js → Chat-DWPvh1tj.js} +2 -2
- package/src/assets/web-panel/assets/{Checkbox-CZEC61kY.js → Checkbox-Clf5-xld.js} +1 -1
- package/src/assets/web-panel/assets/{Col-CNBJWyWl.js → Col-CH1hrzXT.js} +1 -1
- package/src/assets/web-panel/assets/{Community-DGQcJUCL.js → Community-roZ8U4aT.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-C8l08DTy.js → Compact-BgdvLc3A.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-DYB_MbmT.js → Compliance-CufbqW0y.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-DV3JWBAJ.js → Cowork-C_IaxH0e.js} +4 -4
- package/src/assets/web-panel/assets/{Cron-DGQz9J9u.js → Cron-DhL_2kgD.js} +1 -1
- package/src/assets/web-panel/assets/{Crosschain-CIWQ4dI-.js → Crosschain-DJOk256v.js} +1 -1
- package/src/assets/web-panel/assets/{DID-CKd_c4PX.js → DID-C-NGafCc.js} +1 -1
- package/src/assets/web-panel/assets/{Dashboard-CtHAdcCn.js → Dashboard-BehZEEGb.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-a19vPJmP.js → Dropdown-Di1XKsKH.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-B5ayZ9zK.js → FormItemContext-BiLL758Z.js} +1 -1
- package/src/assets/web-panel/assets/{Git-CMTjLD8-.js → Git-CK7BDDon.js} +1 -1
- package/src/assets/web-panel/assets/Inference-BKfMNDPb.js +1 -0
- package/src/assets/web-panel/assets/Inference-EFFc7eNZ.css +1 -0
- package/src/assets/web-panel/assets/{KnowledgeGraph-CO-ivdDK.js → KnowledgeGraph-CnMK_681.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-sCDOUYuS.js → Logs-OZ_SDJhi.js} +1 -1
- package/src/assets/web-panel/assets/Marketplace-s1GETxG1.js +1 -0
- package/src/assets/web-panel/assets/{McpTools-CqnNMG6W.js → McpTools-I_suskam.js} +2 -2
- package/src/assets/web-panel/assets/{Memory-D_O87sbR.js → Memory-Xg-8FUwL.js} +2 -2
- package/src/assets/web-panel/assets/NLProgramming-CuTxb54H.js +1 -0
- package/src/assets/web-panel/assets/NLProgramming-jURs-f-a.css +1 -0
- package/src/assets/web-panel/assets/{Notes-Bh7KP6cl.js → Notes-D3HPrdzx.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-CoonBV6s.js → Organization-BPk2hqkU.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-_g4V_Ju_.js → Overflow-DglXWvmc.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-DypZ1ege.js → P2P-9506J4Fa.js} +2 -2
- package/src/assets/web-panel/assets/{Permissions-BgZSIvcr.js → Permissions-D1ZT_iLb.js} +3 -3
- package/src/assets/web-panel/assets/Pipeline-DyqCLFVr.css +1 -0
- package/src/assets/web-panel/assets/Pipeline-s2l8q5TK.js +1 -0
- package/src/assets/web-panel/assets/Privacy-B_cAicd1.css +1 -0
- package/src/assets/web-panel/assets/Privacy-Cj1MuXI1.js +1 -0
- package/src/assets/web-panel/assets/{ProjectSettings-juTiV4PS.js → ProjectSettings-Ck1WnkO5.js} +1 -1
- package/src/assets/web-panel/assets/{Projects-DmPNnqOJ.js → Projects-1kgHPHWk.js} +2 -2
- package/src/assets/web-panel/assets/{Providers-BJsAfkjy.js → Providers-DnE4yu5E.js} +2 -2
- package/src/assets/web-panel/assets/{Row-DrdDP98g.js → Row-B0eZSULe.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-dYFn7J6x.js → RssFeed-CKCkUq-C.js} +1 -1
- package/src/assets/web-panel/assets/{Security-kxRpCiKJ.js → Security-DIVXGpQK.js} +4 -4
- package/src/assets/web-panel/assets/{Services-BP4AjEx_.js → Services-DhJEUDnu.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-Cpa-ty0l.js → Skeleton-ecuW2YBG.js} +1 -1
- package/src/assets/web-panel/assets/Skills-DeBN8_s8.js +1 -0
- package/src/assets/web-panel/assets/{Tasks-DzX0K-kB.js → Tasks-R-1xMJ9F.js} +1 -1
- package/src/assets/web-panel/assets/Templates-DHHfXjDu.js +1 -0
- package/src/assets/web-panel/assets/Tenant-BJr-h-_0.css +1 -0
- package/src/assets/web-panel/assets/Tenant-CC0KuURy.js +1 -0
- package/src/assets/web-panel/assets/{Trigger-CoAAYYBt.js → Trigger-D9s00Sgd.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-CkgIUHZZ.js → VideoEditing-DcDab4pD.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-CgA-lpLW.js → Wallet-DQl4w6NV.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-CY41bHIQ.js → WebAuthn-Hr3U_uGz.js} +2 -2
- package/src/assets/web-panel/assets/{WorkflowEditor-CE7u19Od.js → WorkflowEditor-BC8eATB5.js} +1 -1
- package/src/assets/web-panel/assets/{colors-CIKN8L8n.js → colors-CCC3A9ZL.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-CrBQCz3V.js → compact-item-BmWW5F8V.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-D1QXMs7U.js → createContext-B2b9CRr1.js} +1 -1
- package/src/assets/web-panel/assets/{hasIn-tTUZknBU.js → hasIn-BRo_JT_S.js} +1 -1
- package/src/assets/web-panel/assets/icons-DbKJDD5_.js +57 -0
- package/src/assets/web-panel/assets/{index-BIPWZw8B.js → index-1U9E0b34.js} +1 -1
- package/src/assets/web-panel/assets/{index-BX3rXaHn.js → index-2Yn7789f.js} +1 -1
- package/src/assets/web-panel/assets/{index-COySbArp.js → index-2kaOH6lv.js} +1 -1
- package/src/assets/web-panel/assets/{index-BwiOpWc5.js → index-6h7y54EK.js} +1 -1
- package/src/assets/web-panel/assets/{index-DvmvdIT_.js → index-B7kbey_Y.js} +1 -1
- package/src/assets/web-panel/assets/index-BLYcQWYW.js +36 -0
- package/src/assets/web-panel/assets/{index-cfS19Vfx.js → index-BafG-FrC.js} +1 -1
- package/src/assets/web-panel/assets/{index-X4HbBQbI.js → index-Bd2qQOOl.js} +1 -1
- package/src/assets/web-panel/assets/{index-ClrnG3mQ.js → index-BiCTVNS6.js} +1 -1
- package/src/assets/web-panel/assets/{index-zKNadN9-.js → index-BiNBF-Y_.js} +2 -2
- package/src/assets/web-panel/assets/{index-CYAkBhrQ.js → index-Bkjna3jQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-DhUBtkRD.js → index-Bxy0lJmt.js} +1 -1
- package/src/assets/web-panel/assets/{index-8nKSWBcm.js → index-BynNl5nX.js} +2 -2
- package/src/assets/web-panel/assets/{index-p1nJ70IV.js → index-CAv1O9z-.js} +1 -1
- package/src/assets/web-panel/assets/index-CEwU1s8_.js +12 -0
- package/src/assets/web-panel/assets/{index-D06WGcI3.js → index-CG3GraND.js} +1 -1
- package/src/assets/web-panel/assets/{index-CclY9-28.js → index-CNBAfkwP.js} +1 -1
- package/src/assets/web-panel/assets/index-CNtb4sCH.js +55 -0
- package/src/assets/web-panel/assets/{index-DZkS3V1X.js → index-CSF19Udr.js} +1 -1
- package/src/assets/web-panel/assets/{index-_3pzrgIO.js → index-CV88wBE4.js} +1 -1
- package/src/assets/web-panel/assets/{index-BDjky3rX.js → index-CWIWWW-z.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bi_6FYU5.js → index-Crg53xLr.js} +1 -1
- package/src/assets/web-panel/assets/{index-CP2liZYV.js → index-CtUuEt-Q.js} +3 -3
- package/src/assets/web-panel/assets/{index-BqDn_7rp.js → index-Cx1K1h3R.js} +3 -3
- package/src/assets/web-panel/assets/{index-vkHwRzrk.js → index-CzondF_H.js} +1 -1
- package/src/assets/web-panel/assets/{index-CwdYxBVA.js → index-D6LoUbxl.js} +1 -1
- package/src/assets/web-panel/assets/{index-DtayEBt0.js → index-DG8Argyk.js} +1 -1
- package/src/assets/web-panel/assets/index-DIHZW5eL.js +1 -0
- package/src/assets/web-panel/assets/{index-DVRzAjWk.js → index-DcLgLWwU.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dz_iVHtC.js → index-DktiurCg.js} +1 -1
- package/src/assets/web-panel/assets/{index-DVLZZQ5c.js → index-GXgIXqCa.js} +1 -1
- package/src/assets/web-panel/assets/{index-BKHWN2tE.js → index-NIIkheoM.js} +1 -1
- package/src/assets/web-panel/assets/{index-CROBuVak.js → index-bcMcPEIb.js} +2 -2
- package/src/assets/web-panel/assets/index-pX3VTY9A.js +1 -0
- package/src/assets/web-panel/assets/{index-CqCf9te0.js → index-vldy_vgJ.js} +2 -2
- package/src/assets/web-panel/assets/{index-BzqrE9NR.js → index-xMCJBS-g.js} +1 -1
- package/src/assets/web-panel/assets/{index-V6QCm9nt.js → index-ytX4yyzs.js} +1 -1
- package/src/assets/web-panel/assets/{index-CNlblI8D.js → index-zd2QMXg3.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-Dl1s0-DH.js → initDefaultProps-DbZ1HRc7.js} +1 -1
- package/src/assets/web-panel/assets/{motion-Bo_wsn2G.js → motion-KRtHWi9E.js} +1 -1
- package/src/assets/web-panel/assets/{move-DkSBFThb.js → move-B-zOsK6x.js} +1 -1
- package/src/assets/web-panel/assets/{omit-D_kxdSL6.js → omit-DNrV7ppz.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-B4jAAmTy.js → pickAttrs-B-AcyBpj.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-BQfy7E_I.js → placementArrow-Bu6BH9hd.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-DBrNeOOt.js → responsiveObserve-BMFIMTDs.js} +1 -1
- package/src/assets/web-panel/assets/{slide-DSKBMx3Q.js → slide-xFVMoPwP.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-BdGzd5fx.js → statusUtils-HggAwxhx.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-Ckbe4as7.js → styleChecker-CG5OjpVk.js} +1 -1
- package/src/assets/web-panel/assets/{transition-6LOZvE9a.js → transition-C4Iby8cT.js} +1 -1
- package/src/assets/web-panel/assets/{useConfigInject-BfCzqqat.js → useConfigInject-BlTQDaaH.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-C8nzL1g7.js → useFlexGapSupport-B4LJA5eG.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-kNIbBJfF.js → vnode-BToqLQaO.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-DafJyqPh.js → zoom-Cdr5kiga.js} +1 -1
- package/src/assets/web-panel/index.html +2 -2
- package/src/assets/web-panel/assets/AIOps-CDadp-Le.js +0 -1
- package/src/assets/web-panel/assets/AppLayout-Byg_RLDB.js +0 -1
- package/src/assets/web-panel/assets/AppLayout-Gkhl4thM.css +0 -1
- package/src/assets/web-panel/assets/Marketplace-Ch5Xd0CC.js +0 -1
- package/src/assets/web-panel/assets/Skills-CE8wG-A0.js +0 -1
- package/src/assets/web-panel/assets/Templates-Bku01czW.js +0 -1
- package/src/assets/web-panel/assets/icons-Jk30QO6-.js +0 -57
- package/src/assets/web-panel/assets/index-B0z2XooE.js +0 -1
- package/src/assets/web-panel/assets/index-D7l8Uzgm.js +0 -55
- package/src/assets/web-panel/assets/index-MzZGrA5i.js +0 -36
- package/src/assets/web-panel/assets/index-d8uIZmCQ.js +0 -12
- package/src/assets/web-panel/assets/index-hU5rQLDQ.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{u as we}from"./ws-Bv7YH0VB.js";import{s as $e}from"./community-parser-CO25nZFt.js";import{_ as qe}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{a as v}from"./index-CP2liZYV.js";import{v as Ee,a1 as Me,az as Pe,af as De,ay as Je,l as Ve,k as de,s as Ke,aA as pe,aB as We,A as Xe}from"./icons-Jk30QO6-.js";import{l as Ye,F as c,D as _,c as o,x as a,m as x,G as y,q as d,r as b,v as s,J as m,u as g,H as O,L as E,I as p,N as ye,j as V,a as oe}from"./vendor-BVetwVfk.js";import"./index-MzZGrA5i.js";import"./useConfigInject-BfCzqqat.js";import"./transition-6LOZvE9a.js";import"./Keyframes-C7fCrnlS.js";import"./Portal-CHsntPCQ.js";import"./index-U4Zd5IK6.js";function M(t){const r=$e(t);if(!r)return null;try{return JSON.parse(r)}catch{}const i=r.match(/\{[\s\S]*\}|\[[\s\S]*\]/);if(!i)return null;try{return JSON.parse(i[0])}catch{return null}}const Ge=Object.freeze(["file-md5","file-sha1","file-sha256","file-sha512","ipv4","ipv6","domain","url","email"]);function A(t,r=0){return typeof t=="number"&&Number.isFinite(t)?t:r}function fe(t,r=0){if(!t||typeof t!="object")return null;const i=t.id||"";if(!i)return null;const U=Array.isArray(t.labels)?t.labels:[];return{key:i,id:i,type:String(t.type||""),value:String(t.value||""),labels:U,confidence:t.confidence!=null?A(t.confidence,null):null,sourceId:t.sourceId??t.source_id??null,sourceName:t.sourceName??t.source_name??null,validFrom:t.validFrom??t.valid_from??null,validUntil:t.validUntil??t.valid_until??null,firstSeenAt:t.firstSeenAt??t.first_seen_at??null,lastSeenAt:t.lastSeenAt??t.last_seen_at??null,_idx:r}}function He(t){const r=M(t);return Array.isArray(r)?r.map(fe).filter(Boolean):[]}function Qe(t){const r=M(t);return!r||typeof r!="object"||Array.isArray(r)?null:{matched:!!r.matched,type:String(r.type||"unknown"),indicator:r.indicator?fe(r.indicator):null}}function Ze(t){const r={total:0,byType:{}},i=M(t);if(!i||typeof i!="object"||Array.isArray(i))return r;if(r.total=A(i.total,0),i.byType&&typeof i.byType=="object")for(const[U,j]of Object.entries(i.byType))typeof j=="number"&&Number.isFinite(j)&&(r.byType[U]=j);return r}function et(t,r=0){if(!t||typeof t!="object")return null;const i=t.entity||"";return i?{key:i,entity:i,eventCount:A(t.eventCount??t.event_count,0),failureRate:A(t.failureRate??t.failure_rate,0),uniqueResources:A(t.uniqueResources??t.unique_resources,0),uniqueActions:A(t.uniqueActions??t.unique_actions,0),burstiness:A(t.burstiness,0),riskScore:A(t.riskScore??t.risk_score,0),_idx:r}:null}function tt(t){const r=M(t);return Array.isArray(r)?r.map(et).filter(Boolean):[]}function ot(t,r=0){return!t||typeof t!="object"?null:{key:r,score:A(t.score,0),reasons:Array.isArray(t.reasons)?t.reasons:[],event:t.event&&typeof t.event=="object"?t.event:null,_idx:r}}function at(t){const r=M(t);return Array.isArray(r)?r.map(ot).filter(Boolean):[]}function ae(t){if(!t)return{noAuditLog:!1,error:""};const r=/no such table:\s*audit_log/i.test(t),i=t.match(/Failed:\s*(.+?)(?:\r?\n|$)/i);return{noAuditLog:r,error:i?i[1].trim():""}}function nt(t){if(t==null||t==="")return"—";const r=typeof t=="number"?new Date(t):new Date(String(t));return isNaN(r.getTime())?String(t):r.toLocaleString("zh-CN",{hour12:!1})}const lt={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},rt={class:"filter-bar"},st={key:1,style:{color:"var(--text-primary)","font-family":"monospace","font-size":"12px","word-break":"break-all"}},it={key:0,style:{color:"var(--text-muted)"}},ut={key:1,style:{color:"var(--text-muted)"}},ct={key:0,style:{color:"var(--text-secondary)","font-size":"12px"}},dt={key:1,style:{color:"var(--text-muted)"}},pt={key:5,style:{color:"var(--text-secondary)","font-size":"11px"}},yt={style:{padding:"40px",color:"var(--text-muted)","text-align":"center"}},ft={style:{color:"var(--text-primary)",margin:"16px 0 8px","font-size":"14px"}},mt={key:0,style:{color:"var(--text-primary)","font-family":"monospace","font-weight":"500"}},vt={key:2,style:{color:"var(--text-secondary)"}},_t={key:5,style:{color:"var(--text-secondary)","font-family":"monospace","font-size":"11px"}},bt={style:{padding:"30px",color:"var(--text-muted)","text-align":"center"}},gt={key:2,style:{color:"var(--text-primary)",margin:"24px 0 8px","font-size":"14px"}},xt={style:{flex:"1"}},kt={style:{display:"flex",gap:"8px","align-items":"center"}},ht={key:0,style:{color:"var(--text-primary)","font-family":"monospace","font-size":"12px"}},zt={key:1,style:{color:"var(--text-secondary)","font-size":"11px"}},At={key:0,style:{"margin-top":"4px"}},St={style:{"margin-top":"8px","font-size":"12px",color:"var(--text-secondary)"}},Ct={key:0,style:{"margin-top":"12px","font-size":"12px"}},Tt={style:{color:"var(--text-secondary)"}},Ot={style:{color:"var(--text-secondary)"}},Ut={key:0,style:{"margin-top":"4px"}},jt={__name:"Compliance",setup(t){const r=we(),i=b(!1),U=b(!1),j=b(!1),K=b(!1),W=b([]),F=b({total:0,byType:{}}),L=b([]),I=b([]),S=b({noAuditLog:!1,error:""}),P=b("threat"),D=b(""),X=b(!1),w=b(!1),$=b(!1),Y=oe({observable:""}),k=b(null),C=oe({entity:"",days:30}),h=oe({entity:"",threshold:.7,days:1}),me=[{title:"类型",key:"type",width:"120px"},{title:"值",key:"value"},{title:"标签",key:"labels",width:"160px"},{title:"置信度",key:"confidence",width:"90px"},{title:"来源",key:"source",width:"160px"},{title:"最近见到",key:"lastSeen",width:"160px"},{title:"操作",key:"action",width:"90px"}],ve=[{title:"实体",key:"entity",width:"180px"},{title:"风险分",key:"riskScore"},{title:"事件数",key:"eventCount",width:"90px"},{title:"失败率",key:"failureRate",width:"90px"},{title:"资源数",key:"uniqueResources",width:"90px"},{title:"突发度",key:"burstiness",width:"90px"}],_e=V(()=>D.value?W.value.filter(l=>l.type===D.value):W.value),be=V(()=>Object.keys(F.value.byType).length),ge=V(()=>Object.entries(F.value.byType).sort((l,e)=>e[1]-l[1])),ne=V(()=>L.value.filter(l=>l.riskScore>=70).length),xe={ipv4:"blue",ipv6:"cyan",domain:"purple",url:"magenta",email:"gold","file-md5":"orange","file-sha1":"orange","file-sha256":"red","file-sha512":"red",unknown:"default"};function G(l){return xe[l]||"default"}function ke(l){return l>=80?"#ff4d4f":l>=50?"#faad14":"#52c41a"}function le(l){return l>=70?"#ff4d4f":l>=40?"#faad14":"#52c41a"}function he(l,e){return l?l.length>e?l.slice(0,e)+"...":l:""}function ze({key:l}){l==="match"?(k.value=null,X.value=!0):l==="ueba-build"?w.value=!0:l==="ueba-analyze"&&($.value=!0)}async function J(){i.value=!0;try{const[l,e,f]=await Promise.all([r.execute("compliance threat-intel list --limit 200 --json",1e4).catch(()=>({output:""})),r.execute("compliance threat-intel stats --json",8e3).catch(()=>({output:""})),r.execute("compliance ueba top --top-k 20 --json",1e4).catch(()=>({output:""}))]);W.value=He(l.output),F.value=Ze(e.output),S.value=ae(f.output),L.value=S.value.noAuditLog?[]:tt(f.output)}catch(l){v.error("加载合规数据失败: "+(l?.message||l))}finally{i.value=!1}}async function Ae(){const l=Y.observable.trim();if(!l){v.warning("请输入要匹配的可观测值");return}U.value=!0,k.value=null;try{const e=`compliance threat-intel match "${l.replace(/"/g,'\\"')}" --json`,{output:f}=await r.execute(e,8e3),z=Qe(f);if(!z){v.error("匹配失败: "+f.slice(0,120));return}k.value=z,z.matched?v.warning(`命中威胁指标 (${z.type})`):z.type==="unknown"?v.info("无法识别该可观测值类型"):v.success(`未命中(已识别为 ${z.type})`)}catch(e){v.error("匹配失败: "+(e?.message||e))}finally{U.value=!1}}async function Se(l){try{const e=`compliance threat-intel remove ${l.type} "${l.value.replace(/"/g,'\\"')}" --json`,{output:f}=await r.execute(e,8e3);if(/error|失败/i.test(f)&&!/"removed"/.test(f)){v.error("删除失败: "+f.slice(0,120));return}v.success("指标已删除"),await J()}catch(e){v.error("删除失败: "+(e?.message||e))}}async function Ce(){j.value=!0;try{const l=["compliance ueba baseline"];C.entity.trim()&&l.push(`--entity "${C.entity.trim().replace(/"/g,'\\"')}"`),C.days!=null&&l.push(`--days ${C.days}`),l.push("--json");const{output:e}=await r.execute(l.join(" "),3e4),f=ae(e);if(f.noAuditLog){S.value=f,v.warning("audit_log 表为空,无法构建基线"),w.value=!1;return}if(f.error){v.error("构建失败: "+f.error);return}v.success("基线已构建"),w.value=!1,P.value="ueba",await J()}catch(l){v.error("构建失败: "+(l?.message||l))}finally{j.value=!1}}async function Te(){K.value=!0;try{const l=["compliance ueba analyze"];h.entity.trim()&&l.push(`--entity "${h.entity.trim().replace(/"/g,'\\"')}"`),h.threshold!=null&&l.push(`--threshold ${h.threshold}`),h.days!=null&&l.push(`--days ${h.days}`),l.push("--json");const{output:e}=await r.execute(l.join(" "),3e4),f=ae(e);if(f.noAuditLog){S.value=f,v.warning("audit_log 表为空,无可分析事件"),$.value=!1;return}if(f.error&&!e.includes("[")){v.error("分析失败: "+f.error);return}I.value=at(e),v.success(`分析完成,发现 ${I.value.length} 个异常`),$.value=!1,P.value="ueba"}catch(l){v.error("分析失败: "+(l?.message||l))}finally{K.value=!1}}return Ye(J),(l,e)=>{const f=d("a-button"),z=d("a-menu-item"),Oe=d("a-menu"),Ue=d("a-dropdown"),re=d("a-space"),R=d("a-statistic"),N=d("a-card"),q=d("a-col"),je=d("a-row"),T=d("a-tag"),se=d("a-radio-button"),Ie=d("a-radio-group"),Ne=d("a-popconfirm"),ie=d("a-table"),ue=d("a-tab-pane"),ce=d("a-alert"),Re=d("a-progress"),Be=d("a-list-item"),Fe=d("a-list"),Le=d("a-tabs"),H=d("a-input"),B=d("a-form-item"),Q=d("a-form"),Z=d("a-modal"),ee=d("a-input-number");return s(),c("div",null,[_("div",lt,[e[18]||(e[18]=_("div",null,[_("h2",{class:"page-title"},"合规与威胁情报"),_("p",{class:"page-sub"},"威胁指标 (IoC) · 用户行为分析 (UEBA)")],-1)),o(re,null,{default:a(()=>[o(f,{loading:i.value,onClick:J},{icon:a(()=>[o(g(Ee))]),default:a(()=>[e[11]||(e[11]=m(" 刷新 ",-1))]),_:1},8,["loading"]),o(Ue,{trigger:["click"]},{overlay:a(()=>[o(Oe,{onClick:ze},{default:a(()=>[o(z,{key:"match"},{default:a(()=>[o(g(Pe)),e[13]||(e[13]=m(" 匹配指标",-1))]),_:1}),o(z,{key:"ueba-build"},{default:a(()=>[o(g(De)),e[14]||(e[14]=m(" 构建基线",-1))]),_:1}),o(z,{key:"ueba-analyze"},{default:a(()=>[o(g(Je)),e[15]||(e[15]=m(" 行为分析",-1))]),_:1}),o(z,{key:"import",disabled:""},{default:a(()=>[o(g(Ve)),e[16]||(e[16]=m(" 导入 STIX bundle ",-1)),e[17]||(e[17]=_("span",{style:{color:"var(--text-muted)","font-size":"11px","margin-left":"6px"}},"(CLI 端)",-1))]),_:1})]),_:1})]),default:a(()=>[o(f,{type:"primary"},{icon:a(()=>[o(g(Me))]),default:a(()=>[e[12]||(e[12]=m(" 操作 ▼ ",-1))]),_:1})]),_:1})]),_:1})]),o(je,{gutter:[16,16],style:{"margin-bottom":"20px"}},{default:a(()=>[o(q,{xs:12,sm:8,lg:5},{default:a(()=>[o(N,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[o(R,{title:"IoC 总数",value:F.value.total,"value-style":{color:"#1677ff",fontSize:"20px"}},{prefix:a(()=>[o(g(de))]),_:1},8,["value"])]),_:1})]),_:1}),o(q,{xs:12,sm:8,lg:5},{default:a(()=>[o(N,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[o(R,{title:"IoC 类型",value:be.value,"value-style":{color:"#13c2c2",fontSize:"20px"}},{prefix:a(()=>[o(g(Ke))]),_:1},8,["value"])]),_:1})]),_:1}),o(q,{xs:12,sm:8,lg:5},{default:a(()=>[o(N,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[o(R,{title:"风险实体",value:L.value.length,"value-style":{color:"#722ed1",fontSize:"20px"}},{prefix:a(()=>[o(g(pe))]),_:1},8,["value"])]),_:1})]),_:1}),o(q,{xs:12,sm:8,lg:5},{default:a(()=>[o(N,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[o(R,{title:"高风险 (≥70)",value:ne.value,"value-style":{color:ne.value>0?"#ff4d4f":"#52c41a",fontSize:"20px"}},{prefix:a(()=>[o(g(We))]),_:1},8,["value","value-style"])]),_:1})]),_:1}),o(q,{xs:24,sm:8,lg:4},{default:a(()=>[o(N,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[o(R,{title:"近期异常",value:I.value.length,"value-style":{color:"#faad14",fontSize:"20px"}},{prefix:a(()=>[o(g(Xe))]),_:1},8,["value"])]),_:1})]),_:1})]),_:1}),F.value.total>0?(s(),x(N,{key:0,title:"IoC 类型分布",size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"20px"},"body-style":{padding:"12px 16px"}},{default:a(()=>[o(re,{size:[12,8],wrap:""},{default:a(()=>[(s(!0),c(O,null,E(ge.value,([n,u])=>(s(),x(T,{key:n,color:G(n)},{default:a(()=>[m(p(n)+": "+p(u),1)]),_:2},1032,["color"]))),128))]),_:1})]),_:1})):y("",!0),o(Le,{activeKey:P.value,"onUpdate:activeKey":e[1]||(e[1]=n=>P.value=n),class:"compliance-tabs"},{default:a(()=>[o(ue,{key:"threat",tab:"威胁情报"},{default:a(()=>[_("div",rt,[o(Ie,{value:D.value,"onUpdate:value":e[0]||(e[0]=n=>D.value=n),size:"small"},{default:a(()=>[o(se,{value:""},{default:a(()=>[...e[19]||(e[19]=[m("全部",-1)])]),_:1}),(s(!0),c(O,null,E(g(Ge),n=>(s(),x(se,{key:n,value:n},{default:a(()=>[m(p(n),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),o(ie,{columns:me,"data-source":_e.value,pagination:{pageSize:20,showTotal:n=>`共 ${n} 条`},size:"small",loading:i.value,style:{background:"var(--bg-card)"}},{bodyCell:a(({column:n,record:u})=>[n.key==="type"?(s(),x(T,{key:0,color:G(u.type),style:{"font-family":"monospace"}},{default:a(()=>[m(p(u.type),1)]),_:2},1032,["color"])):y("",!0),n.key==="value"?(s(),c("span",st,p(he(u.value,64)),1)):y("",!0),n.key==="labels"?(s(),c(O,{key:2},[(s(!0),c(O,null,E(u.labels,te=>(s(),x(T,{key:te,color:"orange",style:{"font-size":"10px",margin:"1px"}},{default:a(()=>[m(p(te),1)]),_:2},1024))),128)),u.labels.length?y("",!0):(s(),c("span",it,"—"))],64)):y("",!0),n.key==="confidence"?(s(),c(O,{key:3},[u.confidence!=null?(s(),c("span",{key:0,style:ye({color:ke(u.confidence),fontWeight:500})},p(u.confidence),5)):(s(),c("span",ut,"—"))],64)):y("",!0),n.key==="source"?(s(),c(O,{key:4},[u.sourceName?(s(),c("span",ct,p(u.sourceName),1)):(s(),c("span",dt,"—"))],64)):y("",!0),n.key==="lastSeen"?(s(),c("span",pt,p(g(nt)(u.lastSeenAt)),1)):y("",!0),n.key==="action"?(s(),x(Ne,{key:6,title:"删除该指标?","ok-text":"删除","cancel-text":"取消",onConfirm:te=>Se(u)},{default:a(()=>[o(f,{size:"small",type:"link",danger:""},{default:a(()=>[...e[20]||(e[20]=[m("删除",-1)])]),_:1})]),_:1},8,["onConfirm"])):y("",!0)]),emptyText:a(()=>[_("div",yt,[o(g(de),{style:{"font-size":"36px","margin-bottom":"10px",display:"block"}}),e[21]||(e[21]=m(" 暂无威胁指标。需通过 CLI 导入 STIX bundle: ",-1)),e[22]||(e[22]=_("code",{style:{"font-size":"11px"}},"cc compliance threat-intel import <file.json>",-1))])]),_:1},8,["data-source","pagination","loading"])]),_:1}),o(ue,{key:"ueba",tab:"行为分析 (UEBA)"},{default:a(()=>[S.value.noAuditLog?(s(),x(ce,{key:0,type:"info","show-icon":"",message:"尚无审计日志",description:"UEBA 基于 audit_log 表的审计事件。先在桌面端或 CLI 触发一些受审计的操作(如 cc auth login / cc note add),再回来运行「构建基线」。",style:{"margin-bottom":"16px"}})):S.value.error?(s(),x(ce,{key:1,type:"error","show-icon":"",message:`UEBA 错误:${S.value.error}`,style:{"margin-bottom":"16px"}},null,8,["message"])):y("",!0),_("h3",ft,"高风险实体 (Top "+p(L.value.length)+")",1),o(ie,{columns:ve,"data-source":L.value,pagination:!1,size:"small",loading:i.value,style:{background:"var(--bg-card)"}},{bodyCell:a(({column:n,record:u})=>[n.key==="entity"?(s(),c("span",mt,p(u.entity),1)):y("",!0),n.key==="riskScore"?(s(),x(Re,{key:1,percent:Math.min(u.riskScore,100),"stroke-color":le(u.riskScore),size:"small",format:()=>u.riskScore.toFixed(1)},null,8,["percent","stroke-color","format"])):y("",!0),n.key==="eventCount"?(s(),c("span",vt,p(u.eventCount),1)):y("",!0),n.key==="failureRate"?(s(),c("span",{key:3,style:ye({color:u.failureRate>.3?"#ff4d4f":"var(--text-secondary)",fontFamily:"monospace"})},p((u.failureRate*100).toFixed(1))+"% ",5)):y("",!0),n.key==="uniqueResources"?(s(),x(T,{key:4,color:"cyan",style:{"font-size":"11px"}},{default:a(()=>[m(p(u.uniqueResources),1)]),_:2},1024)):y("",!0),n.key==="burstiness"?(s(),c("span",_t,p((u.burstiness*100).toFixed(0))+"% ",1)):y("",!0)]),emptyText:a(()=>[_("div",bt,[o(g(pe),{style:{"font-size":"32px","margin-bottom":"8px",display:"block"}}),m(" "+p(S.value.noAuditLog?"审计日志为空,无可分析实体":"暂无风险实体"),1)])]),_:1},8,["data-source","loading"]),I.value.length?(s(),c("h3",gt," 近期异常 ("+p(I.value.length)+") ",1)):y("",!0),I.value.length?(s(),x(Fe,{key:3,size:"small","data-source":I.value,locale:{emptyText:"无异常"}},{renderItem:a(({item:n})=>[o(Be,{style:{background:"var(--bg-card)",padding:"10px 16px"}},{default:a(()=>[_("div",xt,[_("div",kt,[o(T,{color:le(n.score*100)},{default:a(()=>[m("score "+p(n.score.toFixed(2)),1)]),_:2},1032,["color"]),n.event?.entity?(s(),c("span",ht,p(n.event.entity),1)):y("",!0),n.event?.action?(s(),c("span",zt," → "+p(n.event.action),1)):y("",!0)]),n.reasons.length?(s(),c("div",At,[(s(!0),c(O,null,E(n.reasons,u=>(s(),x(T,{key:u,color:"volcano",style:{"font-size":"10px",margin:"1px"}},{default:a(()=>[m(p(u),1)]),_:2},1024))),128))])):y("",!0)])]),_:2},1024)]),_:1},8,["data-source"])):y("",!0)]),_:1})]),_:1},8,["activeKey"]),o(Z,{open:X.value,"onUpdate:open":e[3]||(e[3]=n=>X.value=n),title:"匹配威胁指标","confirm-loading":U.value,width:500,"ok-text":"匹配","cancel-text":"关闭",onOk:Ae},{default:a(()=>[o(Q,{"label-col":{span:5},"wrapper-col":{span:19},style:{"margin-top":"16px"}},{default:a(()=>[o(B,{label:"可观测值",required:""},{default:a(()=>[o(H,{value:Y.observable,"onUpdate:value":e[2]||(e[2]=n=>Y.observable=n),placeholder:"IP / 域名 / URL / 邮箱 / 文件哈希","allow-clear":""},null,8,["value"])]),_:1})]),_:1}),k.value?(s(),x(N,{key:0,size:"small",style:{background:"var(--bg-base)","margin-top":"8px"}},{default:a(()=>[o(R,{title:"匹配结果",value:k.value.matched?"命中":"未命中","value-style":{color:k.value.matched?"#ff4d4f":"#52c41a"}},null,8,["value","value-style"]),_("div",St,[e[23]||(e[23]=m(" 检测类型: ",-1)),o(T,{color:G(k.value.type)},{default:a(()=>[m(p(k.value.type),1)]),_:1},8,["color"])]),k.value.indicator?(s(),c("div",Ct,[_("div",Tt,"来源: "+p(k.value.indicator.sourceName||"—"),1),_("div",Ot,"置信度: "+p(k.value.indicator.confidence??"—"),1),k.value.indicator.labels.length?(s(),c("div",Ut,[(s(!0),c(O,null,E(k.value.indicator.labels,n=>(s(),x(T,{key:n,color:"orange",style:{"font-size":"10px"}},{default:a(()=>[m(p(n),1)]),_:2},1024))),128))])):y("",!0)])):y("",!0)]),_:1})):y("",!0)]),_:1},8,["open","confirm-loading"]),o(Z,{open:w.value,"onUpdate:open":e[6]||(e[6]=n=>w.value=n),title:"构建 UEBA 基线","confirm-loading":j.value,width:480,"ok-text":"构建","cancel-text":"取消",onOk:Ce},{default:a(()=>[o(Q,{"label-col":{span:6},"wrapper-col":{span:18},style:{"margin-top":"16px"}},{default:a(()=>[o(B,{label:"实体(可选)"},{default:a(()=>[o(H,{value:C.entity,"onUpdate:value":e[4]||(e[4]=n=>C.entity=n),placeholder:"留空则全量"},null,8,["value"])]),_:1}),o(B,{label:"天数"},{default:a(()=>[o(ee,{value:C.days,"onUpdate:value":e[5]||(e[5]=n=>C.days=n),min:1,max:365,placeholder:"例如 30",style:{width:"100%"}},null,8,["value"])]),_:1})]),_:1}),e[24]||(e[24]=_("p",{style:{color:"var(--text-secondary)","font-size":"12px",margin:"0"}}," 从 audit_log 读取最近 N 天的事件,按实体计算事件计数 / 失败率 / 资源覆盖等基线指标。 ",-1))]),_:1},8,["open","confirm-loading"]),o(Z,{open:$.value,"onUpdate:open":e[10]||(e[10]=n=>$.value=n),title:"运行行为分析","confirm-loading":K.value,width:480,"ok-text":"分析","cancel-text":"取消",onOk:Te},{default:a(()=>[o(Q,{"label-col":{span:6},"wrapper-col":{span:18},style:{"margin-top":"16px"}},{default:a(()=>[o(B,{label:"实体(可选)"},{default:a(()=>[o(H,{value:h.entity,"onUpdate:value":e[7]||(e[7]=n=>h.entity=n),placeholder:"留空则全量"},null,8,["value"])]),_:1}),o(B,{label:"阈值"},{default:a(()=>[o(ee,{value:h.threshold,"onUpdate:value":e[8]||(e[8]=n=>h.threshold=n),min:0,max:1,step:.05,style:{width:"100%"}},null,8,["value"])]),_:1}),o(B,{label:"天数"},{default:a(()=>[o(ee,{value:h.days,"onUpdate:value":e[9]||(e[9]=n=>h.days=n),min:1,max:30,style:{width:"100%"}},null,8,["value"])]),_:1})]),_:1}),e[25]||(e[25]=_("p",{style:{color:"var(--text-secondary)","font-size":"12px",margin:"0"}}," 将最近 N 天事件与已存基线对比;分数 ≥ 阈值的事件作为异常输出。 ",-1))]),_:1},8,["open","confirm-loading"])])}}},Dt=qe(jt,[["__scopeId","data-v-379a0162"]]);export{Dt as default};
|
|
1
|
+
import{u as we}from"./ws-Bv7YH0VB.js";import{s as $e}from"./community-parser-CO25nZFt.js";import{_ as Ee}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{a as v}from"./index-CtUuEt-Q.js";import{y as qe,a5 as Me,aC as De,ai as Pe,aB as Je,m as Ve,l as de,v as Ke,aD as pe,aE as We,A as Xe}from"./icons-DbKJDD5_.js";import{l as Ye,F as c,D as _,c as o,x as a,m as x,G as y,q as d,r as b,v as s,J as m,u as g,H as O,L as q,I as p,N as ye,j as V,a as oe}from"./vendor-BVetwVfk.js";import"./index-BLYcQWYW.js";import"./useConfigInject-BlTQDaaH.js";import"./transition-C4Iby8cT.js";import"./Keyframes-C7fCrnlS.js";import"./Portal-CHsntPCQ.js";import"./index-U4Zd5IK6.js";function M(t){const r=$e(t);if(!r)return null;try{return JSON.parse(r)}catch{}const i=r.match(/\{[\s\S]*\}|\[[\s\S]*\]/);if(!i)return null;try{return JSON.parse(i[0])}catch{return null}}const Ge=Object.freeze(["file-md5","file-sha1","file-sha256","file-sha512","ipv4","ipv6","domain","url","email"]);function A(t,r=0){return typeof t=="number"&&Number.isFinite(t)?t:r}function fe(t,r=0){if(!t||typeof t!="object")return null;const i=t.id||"";if(!i)return null;const U=Array.isArray(t.labels)?t.labels:[];return{key:i,id:i,type:String(t.type||""),value:String(t.value||""),labels:U,confidence:t.confidence!=null?A(t.confidence,null):null,sourceId:t.sourceId??t.source_id??null,sourceName:t.sourceName??t.source_name??null,validFrom:t.validFrom??t.valid_from??null,validUntil:t.validUntil??t.valid_until??null,firstSeenAt:t.firstSeenAt??t.first_seen_at??null,lastSeenAt:t.lastSeenAt??t.last_seen_at??null,_idx:r}}function He(t){const r=M(t);return Array.isArray(r)?r.map(fe).filter(Boolean):[]}function Qe(t){const r=M(t);return!r||typeof r!="object"||Array.isArray(r)?null:{matched:!!r.matched,type:String(r.type||"unknown"),indicator:r.indicator?fe(r.indicator):null}}function Ze(t){const r={total:0,byType:{}},i=M(t);if(!i||typeof i!="object"||Array.isArray(i))return r;if(r.total=A(i.total,0),i.byType&&typeof i.byType=="object")for(const[U,j]of Object.entries(i.byType))typeof j=="number"&&Number.isFinite(j)&&(r.byType[U]=j);return r}function et(t,r=0){if(!t||typeof t!="object")return null;const i=t.entity||"";return i?{key:i,entity:i,eventCount:A(t.eventCount??t.event_count,0),failureRate:A(t.failureRate??t.failure_rate,0),uniqueResources:A(t.uniqueResources??t.unique_resources,0),uniqueActions:A(t.uniqueActions??t.unique_actions,0),burstiness:A(t.burstiness,0),riskScore:A(t.riskScore??t.risk_score,0),_idx:r}:null}function tt(t){const r=M(t);return Array.isArray(r)?r.map(et).filter(Boolean):[]}function ot(t,r=0){return!t||typeof t!="object"?null:{key:r,score:A(t.score,0),reasons:Array.isArray(t.reasons)?t.reasons:[],event:t.event&&typeof t.event=="object"?t.event:null,_idx:r}}function at(t){const r=M(t);return Array.isArray(r)?r.map(ot).filter(Boolean):[]}function ae(t){if(!t)return{noAuditLog:!1,error:""};const r=/no such table:\s*audit_log/i.test(t),i=t.match(/Failed:\s*(.+?)(?:\r?\n|$)/i);return{noAuditLog:r,error:i?i[1].trim():""}}function nt(t){if(t==null||t==="")return"—";const r=typeof t=="number"?new Date(t):new Date(String(t));return isNaN(r.getTime())?String(t):r.toLocaleString("zh-CN",{hour12:!1})}const lt={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},rt={class:"filter-bar"},st={key:1,style:{color:"var(--text-primary)","font-family":"monospace","font-size":"12px","word-break":"break-all"}},it={key:0,style:{color:"var(--text-muted)"}},ut={key:1,style:{color:"var(--text-muted)"}},ct={key:0,style:{color:"var(--text-secondary)","font-size":"12px"}},dt={key:1,style:{color:"var(--text-muted)"}},pt={key:5,style:{color:"var(--text-secondary)","font-size":"11px"}},yt={style:{padding:"40px",color:"var(--text-muted)","text-align":"center"}},ft={style:{color:"var(--text-primary)",margin:"16px 0 8px","font-size":"14px"}},mt={key:0,style:{color:"var(--text-primary)","font-family":"monospace","font-weight":"500"}},vt={key:2,style:{color:"var(--text-secondary)"}},_t={key:5,style:{color:"var(--text-secondary)","font-family":"monospace","font-size":"11px"}},bt={style:{padding:"30px",color:"var(--text-muted)","text-align":"center"}},gt={key:2,style:{color:"var(--text-primary)",margin:"24px 0 8px","font-size":"14px"}},xt={style:{flex:"1"}},kt={style:{display:"flex",gap:"8px","align-items":"center"}},ht={key:0,style:{color:"var(--text-primary)","font-family":"monospace","font-size":"12px"}},zt={key:1,style:{color:"var(--text-secondary)","font-size":"11px"}},At={key:0,style:{"margin-top":"4px"}},St={style:{"margin-top":"8px","font-size":"12px",color:"var(--text-secondary)"}},Ct={key:0,style:{"margin-top":"12px","font-size":"12px"}},Tt={style:{color:"var(--text-secondary)"}},Ot={style:{color:"var(--text-secondary)"}},Ut={key:0,style:{"margin-top":"4px"}},jt={__name:"Compliance",setup(t){const r=we(),i=b(!1),U=b(!1),j=b(!1),K=b(!1),W=b([]),F=b({total:0,byType:{}}),L=b([]),I=b([]),S=b({noAuditLog:!1,error:""}),D=b("threat"),P=b(""),X=b(!1),w=b(!1),$=b(!1),Y=oe({observable:""}),k=b(null),C=oe({entity:"",days:30}),h=oe({entity:"",threshold:.7,days:1}),me=[{title:"类型",key:"type",width:"120px"},{title:"值",key:"value"},{title:"标签",key:"labels",width:"160px"},{title:"置信度",key:"confidence",width:"90px"},{title:"来源",key:"source",width:"160px"},{title:"最近见到",key:"lastSeen",width:"160px"},{title:"操作",key:"action",width:"90px"}],ve=[{title:"实体",key:"entity",width:"180px"},{title:"风险分",key:"riskScore"},{title:"事件数",key:"eventCount",width:"90px"},{title:"失败率",key:"failureRate",width:"90px"},{title:"资源数",key:"uniqueResources",width:"90px"},{title:"突发度",key:"burstiness",width:"90px"}],_e=V(()=>P.value?W.value.filter(l=>l.type===P.value):W.value),be=V(()=>Object.keys(F.value.byType).length),ge=V(()=>Object.entries(F.value.byType).sort((l,e)=>e[1]-l[1])),ne=V(()=>L.value.filter(l=>l.riskScore>=70).length),xe={ipv4:"blue",ipv6:"cyan",domain:"purple",url:"magenta",email:"gold","file-md5":"orange","file-sha1":"orange","file-sha256":"red","file-sha512":"red",unknown:"default"};function G(l){return xe[l]||"default"}function ke(l){return l>=80?"#ff4d4f":l>=50?"#faad14":"#52c41a"}function le(l){return l>=70?"#ff4d4f":l>=40?"#faad14":"#52c41a"}function he(l,e){return l?l.length>e?l.slice(0,e)+"...":l:""}function ze({key:l}){l==="match"?(k.value=null,X.value=!0):l==="ueba-build"?w.value=!0:l==="ueba-analyze"&&($.value=!0)}async function J(){i.value=!0;try{const[l,e,f]=await Promise.all([r.execute("compliance threat-intel list --limit 200 --json",1e4).catch(()=>({output:""})),r.execute("compliance threat-intel stats --json",8e3).catch(()=>({output:""})),r.execute("compliance ueba top --top-k 20 --json",1e4).catch(()=>({output:""}))]);W.value=He(l.output),F.value=Ze(e.output),S.value=ae(f.output),L.value=S.value.noAuditLog?[]:tt(f.output)}catch(l){v.error("加载合规数据失败: "+(l?.message||l))}finally{i.value=!1}}async function Ae(){const l=Y.observable.trim();if(!l){v.warning("请输入要匹配的可观测值");return}U.value=!0,k.value=null;try{const e=`compliance threat-intel match "${l.replace(/"/g,'\\"')}" --json`,{output:f}=await r.execute(e,8e3),z=Qe(f);if(!z){v.error("匹配失败: "+f.slice(0,120));return}k.value=z,z.matched?v.warning(`命中威胁指标 (${z.type})`):z.type==="unknown"?v.info("无法识别该可观测值类型"):v.success(`未命中(已识别为 ${z.type})`)}catch(e){v.error("匹配失败: "+(e?.message||e))}finally{U.value=!1}}async function Se(l){try{const e=`compliance threat-intel remove ${l.type} "${l.value.replace(/"/g,'\\"')}" --json`,{output:f}=await r.execute(e,8e3);if(/error|失败/i.test(f)&&!/"removed"/.test(f)){v.error("删除失败: "+f.slice(0,120));return}v.success("指标已删除"),await J()}catch(e){v.error("删除失败: "+(e?.message||e))}}async function Ce(){j.value=!0;try{const l=["compliance ueba baseline"];C.entity.trim()&&l.push(`--entity "${C.entity.trim().replace(/"/g,'\\"')}"`),C.days!=null&&l.push(`--days ${C.days}`),l.push("--json");const{output:e}=await r.execute(l.join(" "),3e4),f=ae(e);if(f.noAuditLog){S.value=f,v.warning("audit_log 表为空,无法构建基线"),w.value=!1;return}if(f.error){v.error("构建失败: "+f.error);return}v.success("基线已构建"),w.value=!1,D.value="ueba",await J()}catch(l){v.error("构建失败: "+(l?.message||l))}finally{j.value=!1}}async function Te(){K.value=!0;try{const l=["compliance ueba analyze"];h.entity.trim()&&l.push(`--entity "${h.entity.trim().replace(/"/g,'\\"')}"`),h.threshold!=null&&l.push(`--threshold ${h.threshold}`),h.days!=null&&l.push(`--days ${h.days}`),l.push("--json");const{output:e}=await r.execute(l.join(" "),3e4),f=ae(e);if(f.noAuditLog){S.value=f,v.warning("audit_log 表为空,无可分析事件"),$.value=!1;return}if(f.error&&!e.includes("[")){v.error("分析失败: "+f.error);return}I.value=at(e),v.success(`分析完成,发现 ${I.value.length} 个异常`),$.value=!1,D.value="ueba"}catch(l){v.error("分析失败: "+(l?.message||l))}finally{K.value=!1}}return Ye(J),(l,e)=>{const f=d("a-button"),z=d("a-menu-item"),Oe=d("a-menu"),Ue=d("a-dropdown"),re=d("a-space"),R=d("a-statistic"),N=d("a-card"),E=d("a-col"),je=d("a-row"),T=d("a-tag"),se=d("a-radio-button"),Ie=d("a-radio-group"),Ne=d("a-popconfirm"),ie=d("a-table"),ue=d("a-tab-pane"),ce=d("a-alert"),Re=d("a-progress"),Be=d("a-list-item"),Fe=d("a-list"),Le=d("a-tabs"),H=d("a-input"),B=d("a-form-item"),Q=d("a-form"),Z=d("a-modal"),ee=d("a-input-number");return s(),c("div",null,[_("div",lt,[e[18]||(e[18]=_("div",null,[_("h2",{class:"page-title"},"合规与威胁情报"),_("p",{class:"page-sub"},"威胁指标 (IoC) · 用户行为分析 (UEBA)")],-1)),o(re,null,{default:a(()=>[o(f,{loading:i.value,onClick:J},{icon:a(()=>[o(g(qe))]),default:a(()=>[e[11]||(e[11]=m(" 刷新 ",-1))]),_:1},8,["loading"]),o(Ue,{trigger:["click"]},{overlay:a(()=>[o(Oe,{onClick:ze},{default:a(()=>[o(z,{key:"match"},{default:a(()=>[o(g(De)),e[13]||(e[13]=m(" 匹配指标",-1))]),_:1}),o(z,{key:"ueba-build"},{default:a(()=>[o(g(Pe)),e[14]||(e[14]=m(" 构建基线",-1))]),_:1}),o(z,{key:"ueba-analyze"},{default:a(()=>[o(g(Je)),e[15]||(e[15]=m(" 行为分析",-1))]),_:1}),o(z,{key:"import",disabled:""},{default:a(()=>[o(g(Ve)),e[16]||(e[16]=m(" 导入 STIX bundle ",-1)),e[17]||(e[17]=_("span",{style:{color:"var(--text-muted)","font-size":"11px","margin-left":"6px"}},"(CLI 端)",-1))]),_:1})]),_:1})]),default:a(()=>[o(f,{type:"primary"},{icon:a(()=>[o(g(Me))]),default:a(()=>[e[12]||(e[12]=m(" 操作 ▼ ",-1))]),_:1})]),_:1})]),_:1})]),o(je,{gutter:[16,16],style:{"margin-bottom":"20px"}},{default:a(()=>[o(E,{xs:12,sm:8,lg:5},{default:a(()=>[o(N,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[o(R,{title:"IoC 总数",value:F.value.total,"value-style":{color:"#1677ff",fontSize:"20px"}},{prefix:a(()=>[o(g(de))]),_:1},8,["value"])]),_:1})]),_:1}),o(E,{xs:12,sm:8,lg:5},{default:a(()=>[o(N,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[o(R,{title:"IoC 类型",value:be.value,"value-style":{color:"#13c2c2",fontSize:"20px"}},{prefix:a(()=>[o(g(Ke))]),_:1},8,["value"])]),_:1})]),_:1}),o(E,{xs:12,sm:8,lg:5},{default:a(()=>[o(N,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[o(R,{title:"风险实体",value:L.value.length,"value-style":{color:"#722ed1",fontSize:"20px"}},{prefix:a(()=>[o(g(pe))]),_:1},8,["value"])]),_:1})]),_:1}),o(E,{xs:12,sm:8,lg:5},{default:a(()=>[o(N,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[o(R,{title:"高风险 (≥70)",value:ne.value,"value-style":{color:ne.value>0?"#ff4d4f":"#52c41a",fontSize:"20px"}},{prefix:a(()=>[o(g(We))]),_:1},8,["value","value-style"])]),_:1})]),_:1}),o(E,{xs:24,sm:8,lg:4},{default:a(()=>[o(N,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[o(R,{title:"近期异常",value:I.value.length,"value-style":{color:"#faad14",fontSize:"20px"}},{prefix:a(()=>[o(g(Xe))]),_:1},8,["value"])]),_:1})]),_:1})]),_:1}),F.value.total>0?(s(),x(N,{key:0,title:"IoC 类型分布",size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"20px"},"body-style":{padding:"12px 16px"}},{default:a(()=>[o(re,{size:[12,8],wrap:""},{default:a(()=>[(s(!0),c(O,null,q(ge.value,([n,u])=>(s(),x(T,{key:n,color:G(n)},{default:a(()=>[m(p(n)+": "+p(u),1)]),_:2},1032,["color"]))),128))]),_:1})]),_:1})):y("",!0),o(Le,{activeKey:D.value,"onUpdate:activeKey":e[1]||(e[1]=n=>D.value=n),class:"compliance-tabs"},{default:a(()=>[o(ue,{key:"threat",tab:"威胁情报"},{default:a(()=>[_("div",rt,[o(Ie,{value:P.value,"onUpdate:value":e[0]||(e[0]=n=>P.value=n),size:"small"},{default:a(()=>[o(se,{value:""},{default:a(()=>[...e[19]||(e[19]=[m("全部",-1)])]),_:1}),(s(!0),c(O,null,q(g(Ge),n=>(s(),x(se,{key:n,value:n},{default:a(()=>[m(p(n),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),o(ie,{columns:me,"data-source":_e.value,pagination:{pageSize:20,showTotal:n=>`共 ${n} 条`},size:"small",loading:i.value,style:{background:"var(--bg-card)"}},{bodyCell:a(({column:n,record:u})=>[n.key==="type"?(s(),x(T,{key:0,color:G(u.type),style:{"font-family":"monospace"}},{default:a(()=>[m(p(u.type),1)]),_:2},1032,["color"])):y("",!0),n.key==="value"?(s(),c("span",st,p(he(u.value,64)),1)):y("",!0),n.key==="labels"?(s(),c(O,{key:2},[(s(!0),c(O,null,q(u.labels,te=>(s(),x(T,{key:te,color:"orange",style:{"font-size":"10px",margin:"1px"}},{default:a(()=>[m(p(te),1)]),_:2},1024))),128)),u.labels.length?y("",!0):(s(),c("span",it,"—"))],64)):y("",!0),n.key==="confidence"?(s(),c(O,{key:3},[u.confidence!=null?(s(),c("span",{key:0,style:ye({color:ke(u.confidence),fontWeight:500})},p(u.confidence),5)):(s(),c("span",ut,"—"))],64)):y("",!0),n.key==="source"?(s(),c(O,{key:4},[u.sourceName?(s(),c("span",ct,p(u.sourceName),1)):(s(),c("span",dt,"—"))],64)):y("",!0),n.key==="lastSeen"?(s(),c("span",pt,p(g(nt)(u.lastSeenAt)),1)):y("",!0),n.key==="action"?(s(),x(Ne,{key:6,title:"删除该指标?","ok-text":"删除","cancel-text":"取消",onConfirm:te=>Se(u)},{default:a(()=>[o(f,{size:"small",type:"link",danger:""},{default:a(()=>[...e[20]||(e[20]=[m("删除",-1)])]),_:1})]),_:1},8,["onConfirm"])):y("",!0)]),emptyText:a(()=>[_("div",yt,[o(g(de),{style:{"font-size":"36px","margin-bottom":"10px",display:"block"}}),e[21]||(e[21]=m(" 暂无威胁指标。需通过 CLI 导入 STIX bundle: ",-1)),e[22]||(e[22]=_("code",{style:{"font-size":"11px"}},"cc compliance threat-intel import <file.json>",-1))])]),_:1},8,["data-source","pagination","loading"])]),_:1}),o(ue,{key:"ueba",tab:"行为分析 (UEBA)"},{default:a(()=>[S.value.noAuditLog?(s(),x(ce,{key:0,type:"info","show-icon":"",message:"尚无审计日志",description:"UEBA 基于 audit_log 表的审计事件。先在桌面端或 CLI 触发一些受审计的操作(如 cc auth login / cc note add),再回来运行「构建基线」。",style:{"margin-bottom":"16px"}})):S.value.error?(s(),x(ce,{key:1,type:"error","show-icon":"",message:`UEBA 错误:${S.value.error}`,style:{"margin-bottom":"16px"}},null,8,["message"])):y("",!0),_("h3",ft,"高风险实体 (Top "+p(L.value.length)+")",1),o(ie,{columns:ve,"data-source":L.value,pagination:!1,size:"small",loading:i.value,style:{background:"var(--bg-card)"}},{bodyCell:a(({column:n,record:u})=>[n.key==="entity"?(s(),c("span",mt,p(u.entity),1)):y("",!0),n.key==="riskScore"?(s(),x(Re,{key:1,percent:Math.min(u.riskScore,100),"stroke-color":le(u.riskScore),size:"small",format:()=>u.riskScore.toFixed(1)},null,8,["percent","stroke-color","format"])):y("",!0),n.key==="eventCount"?(s(),c("span",vt,p(u.eventCount),1)):y("",!0),n.key==="failureRate"?(s(),c("span",{key:3,style:ye({color:u.failureRate>.3?"#ff4d4f":"var(--text-secondary)",fontFamily:"monospace"})},p((u.failureRate*100).toFixed(1))+"% ",5)):y("",!0),n.key==="uniqueResources"?(s(),x(T,{key:4,color:"cyan",style:{"font-size":"11px"}},{default:a(()=>[m(p(u.uniqueResources),1)]),_:2},1024)):y("",!0),n.key==="burstiness"?(s(),c("span",_t,p((u.burstiness*100).toFixed(0))+"% ",1)):y("",!0)]),emptyText:a(()=>[_("div",bt,[o(g(pe),{style:{"font-size":"32px","margin-bottom":"8px",display:"block"}}),m(" "+p(S.value.noAuditLog?"审计日志为空,无可分析实体":"暂无风险实体"),1)])]),_:1},8,["data-source","loading"]),I.value.length?(s(),c("h3",gt," 近期异常 ("+p(I.value.length)+") ",1)):y("",!0),I.value.length?(s(),x(Fe,{key:3,size:"small","data-source":I.value,locale:{emptyText:"无异常"}},{renderItem:a(({item:n})=>[o(Be,{style:{background:"var(--bg-card)",padding:"10px 16px"}},{default:a(()=>[_("div",xt,[_("div",kt,[o(T,{color:le(n.score*100)},{default:a(()=>[m("score "+p(n.score.toFixed(2)),1)]),_:2},1032,["color"]),n.event?.entity?(s(),c("span",ht,p(n.event.entity),1)):y("",!0),n.event?.action?(s(),c("span",zt," → "+p(n.event.action),1)):y("",!0)]),n.reasons.length?(s(),c("div",At,[(s(!0),c(O,null,q(n.reasons,u=>(s(),x(T,{key:u,color:"volcano",style:{"font-size":"10px",margin:"1px"}},{default:a(()=>[m(p(u),1)]),_:2},1024))),128))])):y("",!0)])]),_:2},1024)]),_:1},8,["data-source"])):y("",!0)]),_:1})]),_:1},8,["activeKey"]),o(Z,{open:X.value,"onUpdate:open":e[3]||(e[3]=n=>X.value=n),title:"匹配威胁指标","confirm-loading":U.value,width:500,"ok-text":"匹配","cancel-text":"关闭",onOk:Ae},{default:a(()=>[o(Q,{"label-col":{span:5},"wrapper-col":{span:19},style:{"margin-top":"16px"}},{default:a(()=>[o(B,{label:"可观测值",required:""},{default:a(()=>[o(H,{value:Y.observable,"onUpdate:value":e[2]||(e[2]=n=>Y.observable=n),placeholder:"IP / 域名 / URL / 邮箱 / 文件哈希","allow-clear":""},null,8,["value"])]),_:1})]),_:1}),k.value?(s(),x(N,{key:0,size:"small",style:{background:"var(--bg-base)","margin-top":"8px"}},{default:a(()=>[o(R,{title:"匹配结果",value:k.value.matched?"命中":"未命中","value-style":{color:k.value.matched?"#ff4d4f":"#52c41a"}},null,8,["value","value-style"]),_("div",St,[e[23]||(e[23]=m(" 检测类型: ",-1)),o(T,{color:G(k.value.type)},{default:a(()=>[m(p(k.value.type),1)]),_:1},8,["color"])]),k.value.indicator?(s(),c("div",Ct,[_("div",Tt,"来源: "+p(k.value.indicator.sourceName||"—"),1),_("div",Ot,"置信度: "+p(k.value.indicator.confidence??"—"),1),k.value.indicator.labels.length?(s(),c("div",Ut,[(s(!0),c(O,null,q(k.value.indicator.labels,n=>(s(),x(T,{key:n,color:"orange",style:{"font-size":"10px"}},{default:a(()=>[m(p(n),1)]),_:2},1024))),128))])):y("",!0)])):y("",!0)]),_:1})):y("",!0)]),_:1},8,["open","confirm-loading"]),o(Z,{open:w.value,"onUpdate:open":e[6]||(e[6]=n=>w.value=n),title:"构建 UEBA 基线","confirm-loading":j.value,width:480,"ok-text":"构建","cancel-text":"取消",onOk:Ce},{default:a(()=>[o(Q,{"label-col":{span:6},"wrapper-col":{span:18},style:{"margin-top":"16px"}},{default:a(()=>[o(B,{label:"实体(可选)"},{default:a(()=>[o(H,{value:C.entity,"onUpdate:value":e[4]||(e[4]=n=>C.entity=n),placeholder:"留空则全量"},null,8,["value"])]),_:1}),o(B,{label:"天数"},{default:a(()=>[o(ee,{value:C.days,"onUpdate:value":e[5]||(e[5]=n=>C.days=n),min:1,max:365,placeholder:"例如 30",style:{width:"100%"}},null,8,["value"])]),_:1})]),_:1}),e[24]||(e[24]=_("p",{style:{color:"var(--text-secondary)","font-size":"12px",margin:"0"}}," 从 audit_log 读取最近 N 天的事件,按实体计算事件计数 / 失败率 / 资源覆盖等基线指标。 ",-1))]),_:1},8,["open","confirm-loading"]),o(Z,{open:$.value,"onUpdate:open":e[10]||(e[10]=n=>$.value=n),title:"运行行为分析","confirm-loading":K.value,width:480,"ok-text":"分析","cancel-text":"取消",onOk:Te},{default:a(()=>[o(Q,{"label-col":{span:6},"wrapper-col":{span:18},style:{"margin-top":"16px"}},{default:a(()=>[o(B,{label:"实体(可选)"},{default:a(()=>[o(H,{value:h.entity,"onUpdate:value":e[7]||(e[7]=n=>h.entity=n),placeholder:"留空则全量"},null,8,["value"])]),_:1}),o(B,{label:"阈值"},{default:a(()=>[o(ee,{value:h.threshold,"onUpdate:value":e[8]||(e[8]=n=>h.threshold=n),min:0,max:1,step:.05,style:{width:"100%"}},null,8,["value"])]),_:1}),o(B,{label:"天数"},{default:a(()=>[o(ee,{value:h.days,"onUpdate:value":e[9]||(e[9]=n=>h.days=n),min:1,max:30,style:{width:"100%"}},null,8,["value"])]),_:1})]),_:1}),e[25]||(e[25]=_("p",{style:{color:"var(--text-secondary)","font-size":"12px",margin:"0"}}," 将最近 N 天事件与已存基线对比;分数 ≥ 阈值的事件作为异常输出。 ",-1))]),_:1},8,["open","confirm-loading"])])}}},Pt=Ee(jt,[["__scopeId","data-v-379a0162"]]);export{Pt as default};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import{k as oe,w as ne,r as d,j as z,l as ie,F as i,D as n,c as p,u as s,H as S,L as b,E as
|
|
2
|
-
${e.description||""}`);let
|
|
1
|
+
import{k as oe,w as ne,r as d,j as z,l as ie,F as i,D as n,c as p,u as s,H as S,L as b,E as I,P as X,I as r,G as _,J as g,m as k,K as Y,x as v,O as re,q as C,v as a,n as ae}from"./vendor-BVetwVfk.js";import{u as ee}from"./ws-Bv7YH0VB.js";import{u as F}from"./chat-CVn-r3oV.js";import{r as te}from"./markdown-vYH_ziAO.js";import{_ as ce}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{R as H,k as ue,_ as le,$ as de,l as pe,w as ve,G as me,H as _e,n as ye,a0 as fe,a1 as ge,u as he,a2 as ke,a as we,J as xe,Z as Se}from"./icons-DbKJDD5_.js";import"./markdown-xjUYbPSW.js";const be=[{id:"doc-convert",name:"文档格式转换",icon:"FileTextOutlined",category:"document",description:"Word、Markdown、HTML、PDF 之间的格式互转",examples:["把 report.docx 转成 PDF","合并多个 Markdown 为一个文档"],acceptsFiles:!0},{id:"media-process",name:"音视频处理",icon:"PlayCircleOutlined",category:"media",description:"视频压缩、音频提取、格式转换、剪辑",examples:["提取 MP4 的音频","压缩视频到 50MB 以内"],acceptsFiles:!0},{id:"data-analysis",name:"数据分析",icon:"BarChartOutlined",category:"data",description:"CSV/Excel 分析、统计、可视化图表",examples:["分析 sales.csv 的月度趋势"],acceptsFiles:!0},{id:"web-research",name:"信息检索与调研",icon:"SearchOutlined",category:"research",description:"网页抓取、API 调用、多源信息汇总",examples:["调研 AI Agent 框架对比"],acceptsFiles:!1},{id:"image-process",name:"图片处理",icon:"PictureOutlined",category:"media",description:"批量压缩、格式转换、加水印、OCR",examples:["批量压缩到 500KB"],acceptsFiles:!0},{id:"code-helper",name:"代码辅助",icon:"CodeOutlined",category:"development",description:"生成脚本、调试代码、自动化任务",examples:["写一个批量重命名脚本"],acceptsFiles:!0},{id:"system-admin",name:"系统运维",icon:"DesktopOutlined",category:"system",description:"磁盘分析、进程管理、日志分析",examples:["查看磁盘使用情况"],acceptsFiles:!1},{id:"file-organize",name:"文件整理",icon:"FolderOpenOutlined",category:"file",description:"批量重命名、分类整理、查找重复",examples:["按文件类型分类整理"],acceptsFiles:!1},{id:"network-tools",name:"网络工具",icon:"GlobalOutlined",category:"network",description:"API 调试、网页抓取、网络诊断",examples:["测试 API 接口"],acceptsFiles:!1},{id:"learning-assist",name:"学习辅助",icon:"ReadOutlined",category:"learning",description:"文档翻译、内容总结、论文分析",examples:["翻译 PDF 摘要"],acceptsFiles:!0}],Ce=oe("cowork",()=>{const K=d(be),t=d(null),y=d([]),w=d(!1),O=d([]),h=d([]),T=d(null),m=d(null),x=d(null),P=d([]),U=d(!1),Q=d(3),A=d(!1),D=d([]),R=F();ne(()=>R.isLoading,o=>{!o&&m.value&&(w.value=!1)});function G(o){t.value=o,q()}function q(){O.value=[],h.value=[],T.value=null,w.value=!1,m.value=null,x.value=null}function E(o){y.value.includes(o)||y.value.push(o)}function B(o){y.value=y.value.filter(e=>e!==o)}async function u(){const o=ee();try{await o.waitConnected(5e3);const e=await o.sendRaw({type:"cowork-templates"},1e4);e?.templates?.length&&(K.value=e.templates)}catch{}}async function l(){const o=ee();try{await o.waitConnected(5e3);const e=await o.sendRaw({type:"cowork-history",limit:50},1e4);e?.entries&&(P.value=e.entries)}catch{}}async function f(o){x.value={mode:"session",message:o},w.value=!0;const e=t.value;let c="";e&&(c=`## 当前任务类型: ${e.name}
|
|
2
|
+
${e.description||""}`);let $=o;y.value.length&&($+=`
|
|
3
3
|
|
|
4
|
-
[用户提供的文件: ${y.value.join(", ")}]`),h.value.push({role:"user",content:o,timestamp:Date.now()});const M={systemPromptExtension:c};e?.shellPolicyOverrides&&(M.shellPolicyOverrides=e.shellPolicyOverrides);const se=await R.createSession("agent",M);m.value=se,await R.sendMessage(se
|
|
4
|
+
[用户提供的文件: ${y.value.join(", ")}]`),h.value.push({role:"user",content:o,timestamp:Date.now()});const M={systemPromptExtension:c};e?.shellPolicyOverrides&&(M.shellPolicyOverrides=e.shellPolicyOverrides);const se=await R.createSession("agent",M);m.value=se,await R.sendMessage(se,$)}async function N(o){x.value={mode:"direct",message:o};const e=ee();w.value=!0,h.value.push({role:"user",content:o,timestamp:Date.now()});try{await e.waitConnected(8e3);const c={type:"cowork-task",templateId:t.value?.id||null,userMessage:o,files:y.value};U.value&&(c.parallel=!0,c.agents=Q.value);const $=t.value;(A.value||$?.mode==="debate")&&(c.mode="debate",D.value.length&&(c.perspectives=D.value));const M=await e.sendRaw(c,3e5);h.value.push({role:"assistant",content:M.summary||"(No output)",timestamp:Date.now(),toolsUsed:M.toolsUsed||[],iterationCount:M.iterationCount||0}),T.value=M}catch(c){h.value.push({role:"assistant",content:`Error: ${c.message}`,timestamp:Date.now()})}finally{w.value=!1}}const W=z(()=>m.value?F().getMessages(m.value):[]),j=z(()=>{if(!m.value)return null;const e=F().streaming[m.value];return e?.active?e.content:null}),V=z(()=>m.value&&F().pendingQuestion[m.value]||null);function J(o){if(!m.value)return;F().answerQuestion(m.value,o)}async function L(){if(!x.value)return;const{mode:o,message:e}=x.value;o==="direct"?await N(e):await f(e)}async function Z(o){if(!m.value)return;const e=F();h.value.push({role:"user",content:o,timestamp:Date.now()});let c=o;y.value.length&&(c+=`
|
|
5
5
|
|
|
6
|
-
[用户提供的文件: ${y.value.join(", ")}]`),await e.sendMessage(m.value,c)}return{selectedTemplate:t,files:y,isRunning:w,steps:O,messages:h,result:T,agentSessionId:m,currentAgentMessages:J,currentStreaming:W,currentQuestion:V,selectTemplate:G,reset:q,addFile:E,removeFile:B,execute:f,executeDirectWs:N,sendFollowUp:X,answerQuestion:K,loadTemplates:u,templates:j,lastRequest:x,retry:L,history:P,loadHistory:l,parallelMode:Q,parallelAgents:U,debateMode:A,debatePerspectives:D}}),Te={class:"cowork-root"},Oe={class:"template-panel"},Me={class:"template-header"},Fe={class:"template-list"},Pe=["onClick"],De={class:"card-icon"},Re={class:"card-body"},Ae={class:"card-name"},Ee={class:"card-desc"},Le={class:"card-icon"},Ie={class:"drop-text"},$e={key:0,class:"file-list"},He={key:1,class:"history-section"},ze={key:0,class:"history-list"},Qe={class:"history-summary"},Ue={class:"history-meta"},qe={class:"exec-panel"},Be={key:0,class:"empty-state"},Ne={class:"empty-icon"},Ve={class:"example-grid"},Ke=["onClick"],je={key:1,class:"ready-state"},Ge={class:"ready-header"},Je={class:"ready-name"},We={key:0,class:"parallel-toggle"},Xe={key:1,class:"parallel-hint"},Ye={class:"ready-examples"},Ze=["onClick"],et={key:0,class:"tool-msg"},tt={class:"tool-input"},st={key:0,class:"tool-result-box"},at={class:"tool-result"},lt={key:1,class:"user-msg"},nt={class:"bubble user"},ot={key:2,class:"assistant-msg"},it=["innerHTML"],rt={key:0,class:"assistant-msg"},ct=["innerHTML"],ut={key:1,class:"question-card"},dt={class:"question-text"},pt={key:0,class:"question-choices"},vt={key:3,class:"debate-panel"},mt={class:"debate-verdict"},_t={class:"consensus"},yt=["innerHTML"],ft={key:4,class:"task-stats"},gt={class:"input-area"},ht={key:0,class:"input-context"},kt={class:"input-row"},wt={__name:"Cowork",setup(j){const t=Ce(),y=F(),w=d(""),O=d(null),h=d(!1),T=d(""),m=d(!1),x=d(!1),P={FileTextOutlined:we,PlayCircleOutlined:ke,BarChartOutlined:he,SearchOutlined:ge,PictureOutlined:fe,CodeOutlined:ye,DesktopOutlined:_e,FolderOpenOutlined:le,GlobalOutlined:me,ReadOutlined:ve,SafetyCertificateOutlined:pe},Q=["把 report.docx 转成 PDF","压缩视频到 50MB","分析 CSV 生成图表","查询今天的汇率","批量压缩图片","写一个自动化脚本"],U=z(()=>y.isLoading?"等待响应中...":t.selectedTemplate?t.selectedTemplate.examples?.[0]||"描述你的需求...":"描述你想完成的任务,Agent 会帮你搞定"),A=z(()=>t.currentAgentMessages);function D(u){return u==="APPROVE"?"green":u==="REJECT"?"red":u==="ERROR"?"default":"orange"}function R(u){return u.split(/[\\/]/).pop()||u}function G(u){h.value=!1;const l=u.dataTransfer?.files;if(l)for(const f of l)t.addFile(f.path||f.name)}function q(){const u=T.value.trim();u&&(t.addFile(u),T.value="")}async function E(){const u=w.value.trim();!u||y.isLoading||(w.value="",t.agentSessionId?await t.sendFollowUp(u):await t.execute(u))}function B(u){w.value=u,ae(()=>E())}return ne([A,()=>t.currentStreaming],()=>{ae(()=>{O.value&&(O.value.scrollTop=O.value.scrollHeight)})},{deep:!0}),ie(()=>{y.loadSessions(),t.loadTemplates(),t.loadHistory()}),(u,l)=>{const f=C("a-tag"),N=C("a-input"),J=C("a-switch"),W=C("a-input-number"),V=C("a-collapse-panel"),K=C("a-collapse"),L=C("a-button"),X=C("a-input-search"),o=C("a-textarea");return a(),i("div",Te,[n("div",Oe,[n("div",Me,[p(s(H),{class:"header-icon"}),l[9]||(l[9]=n("span",{class:"header-title"},"日常协作",-1))]),l[11]||(l[11]=n("div",{class:"template-hint"},"选择任务类型,或直接输入需求",-1)),n("div",Fe,[(a(!0),i(S,null,b(s(t).templates,e=>(a(),i("div",{key:e.id,class:$(["template-card",{active:s(t).selectedTemplate?.id===e.id}]),onClick:c=>s(t).selectTemplate(e)},[n("div",De,[(a(),k(Z(P[e.icon]||s(H))))]),n("div",Re,[n("div",Ae,r(e.name),1),n("div",Ee,r(e.description),1)])],10,Pe))),128)),n("div",{class:$(["template-card free",{active:s(t).selectedTemplate===null&&m.value}]),onClick:l[0]||(l[0]=e=>{s(t).selectTemplate(null),m.value=!0})},[n("div",Le,[p(s(ue))]),l[10]||(l[10]=n("div",{class:"card-body"},[n("div",{class:"card-name"},"自由提问"),n("div",{class:"card-desc"},"任意任务,Agent 自主完成")],-1))],2)]),s(t).selectedTemplate?.acceptsFiles!==!1?(a(),i("div",{key:0,class:$(["file-zone",{dragging:h.value}]),onDragover:l[2]||(l[2]=Y(e=>h.value=!0,["prevent"])),onDragleave:l[3]||(l[3]=e=>h.value=!1),onDrop:Y(G,["prevent"])},[p(s(le),{class:"drop-icon"}),n("div",Ie,r(h.value?"松开以添加文件":"拖拽文件到此处"),1),s(t).files.length?(a(),i("div",$e,[(a(!0),i(S,null,b(s(t).files,e=>(a(),k(f,{key:e,closable:"",onClose:c=>s(t).removeFile(e),class:"file-tag"},{default:v(()=>[g(r(R(e)),1)]),_:2},1032,["onClose"]))),128))])):_("",!0),p(N,{value:T.value,"onUpdate:value":l[1]||(l[1]=e=>T.value=e),placeholder:"或输入文件路径,按 Enter 添加",size:"small",class:"path-input",onPressEnter:q},null,8,["value"])],34)):_("",!0),s(t).history.length?(a(),i("div",He,[n("div",{class:"history-header",onClick:l[4]||(l[4]=e=>x.value=!x.value)},[p(s(de)),g(" 历史记录 ("+r(s(t).history.length)+") ",1)]),x.value?(a(),i("div",ze,[(a(!0),i(S,null,b(s(t).history.slice().reverse().slice(0,20),(e,c)=>(a(),i("div",{key:c,class:$(["history-item",e.status])},[n("div",Qe,r(e.userMessage),1),n("div",Ue,[n("span",null,r(e.templateName||"自由模式"),1),n("span",null,r(e.status),1)])],2))),128))])):_("",!0)])):_("",!0)]),n("div",qe,[!s(t).agentSessionId&&!s(t).selectedTemplate?(a(),i("div",Be,[n("div",Ne,[p(s(H))]),l[12]||(l[12]=n("div",{class:"empty-title"},"选择一个任务模板开始",-1)),l[13]||(l[13]=n("div",{class:"empty-sub"},"或选择「自由提问」处理任何问题",-1)),n("div",Ve,[(a(),i(S,null,b(Q,e=>n("div",{key:e,class:"example-chip",onClick:c=>B(e)},r(e),9,Ke)),64))])])):s(t).selectedTemplate&&!s(t).agentSessionId?(a(),i("div",je,[n("div",Ge,[(a(),k(Z(P[s(t).selectedTemplate.icon]||s(H)),{class:"ready-icon"})),n("span",Je,r(s(t).selectedTemplate.name),1)]),s(t).selectedTemplate.parallelStrategy&&s(t).selectedTemplate.parallelStrategy!=="none"?(a(),i("div",We,[p(J,{checked:s(t).parallelMode,"onUpdate:checked":l[5]||(l[5]=e=>s(t).parallelMode=e),size:"small"},null,8,["checked"]),l[14]||(l[14]=n("span",{class:"parallel-label"},"多 Agent 并行",-1)),s(t).parallelMode?(a(),k(W,{key:0,value:s(t).parallelAgents,"onUpdate:value":l[6]||(l[6]=e=>s(t).parallelAgents=e),min:2,max:10,size:"small",class:"agent-count"},null,8,["value"])):_("",!0),s(t).parallelMode?(a(),i("span",Xe,"个 Agent")):_("",!0)])):_("",!0),n("div",Ye,[l[15]||(l[15]=n("div",{class:"example-label"},"试试这些:",-1)),(a(!0),i(S,null,b(s(t).selectedTemplate.examples,e=>(a(),i("div",{key:e,class:"example-chip",onClick:c=>B(e)},r(e),9,Ze))),128))])])):(a(),i("div",{key:2,class:"messages-area",ref_key:"messagesEl",ref:O},[(a(!0),i(S,null,b(A.value,(e,c)=>(a(),i("div",{key:c,class:$(["message-row",e.role])},[e.role==="tool"?(a(),i("div",et,[p(K,{ghost:"",size:"small"},{default:v(()=>[p(V,{class:"tool-collapse"},{header:v(()=>[p(s(xe)),g(" "+r(e.tool)+" "+r(e.status==="running"?"(执行中...)":"✓"),1)]),default:v(()=>[n("pre",tt,r(JSON.stringify(e.input,null,2)),1),e.result?(a(),i("div",st,[n("pre",at,r(typeof e.result=="string"?e.result:JSON.stringify(e.result,null,2)),1)])):_("",!0)]),_:2},1024)]),_:2},1024)])):e.role==="user"?(a(),i("div",lt,[n("div",nt,r(e.content),1)])):(a(),i("div",ot,[l[17]||(l[17]=n("div",{class:"avatar"},"AI",-1)),n("div",{class:"bubble assistant",innerHTML:s(te)(e.content)},null,8,it),e.content?.startsWith("Error:")&&!s(t).isRunning&&s(t).lastRequest?(a(),k(L,{key:0,size:"small",type:"link",onClick:l[7]||(l[7]=I=>s(t).retry())},{default:v(()=>[...l[16]||(l[16]=[g(" 重试 ",-1)])]),_:1})):_("",!0)]))],2))),128)),s(t).currentStreaming?(a(),i("div",rt,[l[18]||(l[18]=n("div",{class:"avatar"},"AI",-1)),n("div",{class:"bubble assistant streaming",innerHTML:s(te)(s(t).currentStreaming)},null,8,ct)])):_("",!0),s(t).currentQuestion?(a(),i("div",ut,[n("div",dt,r(s(t).currentQuestion.question),1),s(t).currentQuestion.choices?.length?(a(),i("div",pt,[(a(!0),i(S,null,b(s(t).currentQuestion.choices,e=>(a(),k(L,{key:e,size:"small",onClick:c=>s(t).answerQuestion(e)},{default:v(()=>[g(r(e),1)]),_:2},1032,["onClick"]))),128))])):(a(),k(X,{key:1,placeholder:"输入回答...","enter-button":"发送",style:{"margin-top":"10px"},onSearch:s(t).answerQuestion},null,8,["onSearch"]))])):_("",!0)],512)),s(t).result?.mode==="debate"&&!s(t).isRunning?(a(),i("div",vt,[n("div",mt,[p(f,{color:D(s(t).result.verdict)},{default:v(()=>[g(r(s(t).result.verdict),1)]),_:1},8,["color"]),n("span",_t,"共识 "+r(s(t).result.consensusScore||0)+"/100",1)]),p(K,{ghost:"",size:"small"},{default:v(()=>[(a(!0),i(S,null,b(s(t).result.reviews||[],(e,c)=>(a(),k(V,{key:c,class:"review-collapse"},{header:v(()=>[p(f,{color:D(e.verdict)},{default:v(()=>[g(r(e.verdict),1)]),_:2},1032,["color"]),g(" "+r(e.role),1)]),default:v(()=>[n("div",{class:"review-body",innerHTML:s(te)(e.review)},null,8,yt)]),_:2},1024))),128))]),_:1})])):_("",!0),s(t).result&&!s(t).isRunning?(a(),i("div",ft,[s(t).result.mode==="debate"?(a(),k(f,{key:0,color:"magenta"},{default:v(()=>[...l[19]||(l[19]=[g("debate",-1)])]),_:1})):_("",!0),s(t).result.parallel?(a(),k(f,{key:1,color:"purple"},{default:v(()=>[g(r(s(t).result.subtaskCount||0)+" subtasks",1)]),_:1})):_("",!0),p(f,{color:"geekblue"},{default:v(()=>[g(r(s(t).result.iterationCount||0)+" iterations",1)]),_:1}),p(f,{color:"cyan"},{default:v(()=>[g("~"+r((s(t).result.tokenCount||0).toLocaleString())+" tokens",1)]),_:1}),s(t).result.toolsUsed?.length?(a(),k(f,{key:2,color:"green"},{default:v(()=>[g(r(s(t).result.toolsUsed.length)+" tools",1)]),_:1})):_("",!0)])):_("",!0),n("div",gt,[s(t).selectedTemplate?(a(),i("div",ht,[p(f,{color:"blue",class:"context-tag"},{default:v(()=>[(a(),k(Z(P[s(t).selectedTemplate.icon]||s(H)))),g(" "+r(s(t).selectedTemplate.name),1)]),_:1}),(a(!0),i(S,null,b(s(t).files,e=>(a(),k(f,{key:e,class:"context-tag file"},{default:v(()=>[g(r(R(e)),1)]),_:2},1024))),128))])):_("",!0),n("div",kt,[p(o,{value:w.value,"onUpdate:value":l[8]||(l[8]=e=>w.value=e),placeholder:U.value,"auto-size":{minRows:1,maxRows:6},disabled:s(y).isLoading,class:"msg-input",onKeydown:re(Y(E,["exact","prevent"]),["enter"])},null,8,["value","placeholder","disabled","onKeydown"]),p(L,{type:"primary",loading:s(y).isLoading,class:"send-btn",onClick:E},{icon:v(()=>[p(s(Se))]),_:1},8,["loading"])])])])])}}},Ft=ce(wt,[["__scopeId","data-v-3ed36674"]]);export{Ft as default};
|
|
6
|
+
[用户提供的文件: ${y.value.join(", ")}]`),await e.sendMessage(m.value,c)}return{selectedTemplate:t,files:y,isRunning:w,steps:O,messages:h,result:T,agentSessionId:m,currentAgentMessages:W,currentStreaming:j,currentQuestion:V,selectTemplate:G,reset:q,addFile:E,removeFile:B,execute:f,executeDirectWs:N,sendFollowUp:Z,answerQuestion:J,loadTemplates:u,templates:K,lastRequest:x,retry:L,history:P,loadHistory:l,parallelMode:U,parallelAgents:Q,debateMode:A,debatePerspectives:D}}),Te={class:"cowork-root"},Oe={class:"template-panel"},Me={class:"template-header"},Fe={class:"template-list"},Pe=["onClick"],De={class:"card-icon"},Re={class:"card-body"},Ae={class:"card-name"},Ee={class:"card-desc"},Le={class:"card-icon"},$e={class:"drop-text"},Ie={key:0,class:"file-list"},He={key:1,class:"history-section"},ze={key:0,class:"history-list"},Ue={class:"history-summary"},Qe={class:"history-meta"},qe={class:"exec-panel"},Be={key:0,class:"empty-state"},Ne={class:"empty-icon"},Ve={class:"example-grid"},Je=["onClick"],Ke={key:1,class:"ready-state"},Ge={class:"ready-header"},We={class:"ready-name"},je={key:0,class:"parallel-toggle"},Ze={key:1,class:"parallel-hint"},Xe={class:"ready-examples"},Ye=["onClick"],et={key:0,class:"tool-msg"},tt={class:"tool-input"},st={key:0,class:"tool-result-box"},at={class:"tool-result"},lt={key:1,class:"user-msg"},nt={class:"bubble user"},ot={key:2,class:"assistant-msg"},it=["innerHTML"],rt={key:0,class:"assistant-msg"},ct=["innerHTML"],ut={key:1,class:"question-card"},dt={class:"question-text"},pt={key:0,class:"question-choices"},vt={key:3,class:"debate-panel"},mt={class:"debate-verdict"},_t={class:"consensus"},yt=["innerHTML"],ft={key:4,class:"task-stats"},gt={class:"input-area"},ht={key:0,class:"input-context"},kt={class:"input-row"},wt={__name:"Cowork",setup(K){const t=Ce(),y=F(),w=d(""),O=d(null),h=d(!1),T=d(""),m=d(!1),x=d(!1),P={FileTextOutlined:we,PlayCircleOutlined:ke,BarChartOutlined:he,SearchOutlined:ge,PictureOutlined:fe,CodeOutlined:ye,DesktopOutlined:_e,FolderOpenOutlined:le,GlobalOutlined:me,ReadOutlined:ve,SafetyCertificateOutlined:pe},U=["把 report.docx 转成 PDF","压缩视频到 50MB","分析 CSV 生成图表","查询今天的汇率","批量压缩图片","写一个自动化脚本"],Q=z(()=>y.isLoading?"等待响应中...":t.selectedTemplate?t.selectedTemplate.examples?.[0]||"描述你的需求...":"描述你想完成的任务,Agent 会帮你搞定"),A=z(()=>t.currentAgentMessages);function D(u){return u==="APPROVE"?"green":u==="REJECT"?"red":u==="ERROR"?"default":"orange"}function R(u){return u.split(/[\\/]/).pop()||u}function G(u){h.value=!1;const l=u.dataTransfer?.files;if(l)for(const f of l)t.addFile(f.path||f.name)}function q(){const u=T.value.trim();u&&(t.addFile(u),T.value="")}async function E(){const u=w.value.trim();!u||y.isLoading||(w.value="",t.agentSessionId?await t.sendFollowUp(u):await t.execute(u))}function B(u){w.value=u,ae(()=>E())}return ne([A,()=>t.currentStreaming],()=>{ae(()=>{O.value&&(O.value.scrollTop=O.value.scrollHeight)})},{deep:!0}),ie(()=>{y.loadSessions(),t.loadTemplates(),t.loadHistory()}),(u,l)=>{const f=C("a-tag"),N=C("a-input"),W=C("a-switch"),j=C("a-input-number"),V=C("a-collapse-panel"),J=C("a-collapse"),L=C("a-button"),Z=C("a-input-search"),o=C("a-textarea");return a(),i("div",Te,[n("div",Oe,[n("div",Me,[p(s(H),{class:"header-icon"}),l[9]||(l[9]=n("span",{class:"header-title"},"日常协作",-1))]),l[11]||(l[11]=n("div",{class:"template-hint"},"选择任务类型,或直接输入需求",-1)),n("div",Fe,[(a(!0),i(S,null,b(s(t).templates,e=>(a(),i("div",{key:e.id,class:I(["template-card",{active:s(t).selectedTemplate?.id===e.id}]),onClick:c=>s(t).selectTemplate(e)},[n("div",De,[(a(),k(Y(P[e.icon]||s(H))))]),n("div",Re,[n("div",Ae,r(e.name),1),n("div",Ee,r(e.description),1)])],10,Pe))),128)),n("div",{class:I(["template-card free",{active:s(t).selectedTemplate===null&&m.value}]),onClick:l[0]||(l[0]=e=>{s(t).selectTemplate(null),m.value=!0})},[n("div",Le,[p(s(ue))]),l[10]||(l[10]=n("div",{class:"card-body"},[n("div",{class:"card-name"},"自由提问"),n("div",{class:"card-desc"},"任意任务,Agent 自主完成")],-1))],2)]),s(t).selectedTemplate?.acceptsFiles!==!1?(a(),i("div",{key:0,class:I(["file-zone",{dragging:h.value}]),onDragover:l[2]||(l[2]=X(e=>h.value=!0,["prevent"])),onDragleave:l[3]||(l[3]=e=>h.value=!1),onDrop:X(G,["prevent"])},[p(s(le),{class:"drop-icon"}),n("div",$e,r(h.value?"松开以添加文件":"拖拽文件到此处"),1),s(t).files.length?(a(),i("div",Ie,[(a(!0),i(S,null,b(s(t).files,e=>(a(),k(f,{key:e,closable:"",onClose:c=>s(t).removeFile(e),class:"file-tag"},{default:v(()=>[g(r(R(e)),1)]),_:2},1032,["onClose"]))),128))])):_("",!0),p(N,{value:T.value,"onUpdate:value":l[1]||(l[1]=e=>T.value=e),placeholder:"或输入文件路径,按 Enter 添加",size:"small",class:"path-input",onPressEnter:q},null,8,["value"])],34)):_("",!0),s(t).history.length?(a(),i("div",He,[n("div",{class:"history-header",onClick:l[4]||(l[4]=e=>x.value=!x.value)},[p(s(de)),g(" 历史记录 ("+r(s(t).history.length)+") ",1)]),x.value?(a(),i("div",ze,[(a(!0),i(S,null,b(s(t).history.slice().reverse().slice(0,20),(e,c)=>(a(),i("div",{key:c,class:I(["history-item",e.status])},[n("div",Ue,r(e.userMessage),1),n("div",Qe,[n("span",null,r(e.templateName||"自由模式"),1),n("span",null,r(e.status),1)])],2))),128))])):_("",!0)])):_("",!0)]),n("div",qe,[!s(t).agentSessionId&&!s(t).selectedTemplate?(a(),i("div",Be,[n("div",Ne,[p(s(H))]),l[12]||(l[12]=n("div",{class:"empty-title"},"选择一个任务模板开始",-1)),l[13]||(l[13]=n("div",{class:"empty-sub"},"或选择「自由提问」处理任何问题",-1)),n("div",Ve,[(a(),i(S,null,b(U,e=>n("div",{key:e,class:"example-chip",onClick:c=>B(e)},r(e),9,Je)),64))])])):s(t).selectedTemplate&&!s(t).agentSessionId?(a(),i("div",Ke,[n("div",Ge,[(a(),k(Y(P[s(t).selectedTemplate.icon]||s(H)),{class:"ready-icon"})),n("span",We,r(s(t).selectedTemplate.name),1)]),s(t).selectedTemplate.parallelStrategy&&s(t).selectedTemplate.parallelStrategy!=="none"?(a(),i("div",je,[p(W,{checked:s(t).parallelMode,"onUpdate:checked":l[5]||(l[5]=e=>s(t).parallelMode=e),size:"small"},null,8,["checked"]),l[14]||(l[14]=n("span",{class:"parallel-label"},"多 Agent 并行",-1)),s(t).parallelMode?(a(),k(j,{key:0,value:s(t).parallelAgents,"onUpdate:value":l[6]||(l[6]=e=>s(t).parallelAgents=e),min:2,max:10,size:"small",class:"agent-count"},null,8,["value"])):_("",!0),s(t).parallelMode?(a(),i("span",Ze,"个 Agent")):_("",!0)])):_("",!0),n("div",Xe,[l[15]||(l[15]=n("div",{class:"example-label"},"试试这些:",-1)),(a(!0),i(S,null,b(s(t).selectedTemplate.examples,e=>(a(),i("div",{key:e,class:"example-chip",onClick:c=>B(e)},r(e),9,Ye))),128))])])):(a(),i("div",{key:2,class:"messages-area",ref_key:"messagesEl",ref:O},[(a(!0),i(S,null,b(A.value,(e,c)=>(a(),i("div",{key:c,class:I(["message-row",e.role])},[e.role==="tool"?(a(),i("div",et,[p(J,{ghost:"",size:"small"},{default:v(()=>[p(V,{class:"tool-collapse"},{header:v(()=>[p(s(xe)),g(" "+r(e.tool)+" "+r(e.status==="running"?"(执行中...)":"✓"),1)]),default:v(()=>[n("pre",tt,r(JSON.stringify(e.input,null,2)),1),e.result?(a(),i("div",st,[n("pre",at,r(typeof e.result=="string"?e.result:JSON.stringify(e.result,null,2)),1)])):_("",!0)]),_:2},1024)]),_:2},1024)])):e.role==="user"?(a(),i("div",lt,[n("div",nt,r(e.content),1)])):(a(),i("div",ot,[l[17]||(l[17]=n("div",{class:"avatar"},"AI",-1)),n("div",{class:"bubble assistant",innerHTML:s(te)(e.content)},null,8,it),e.content?.startsWith("Error:")&&!s(t).isRunning&&s(t).lastRequest?(a(),k(L,{key:0,size:"small",type:"link",onClick:l[7]||(l[7]=$=>s(t).retry())},{default:v(()=>[...l[16]||(l[16]=[g(" 重试 ",-1)])]),_:1})):_("",!0)]))],2))),128)),s(t).currentStreaming?(a(),i("div",rt,[l[18]||(l[18]=n("div",{class:"avatar"},"AI",-1)),n("div",{class:"bubble assistant streaming",innerHTML:s(te)(s(t).currentStreaming)},null,8,ct)])):_("",!0),s(t).currentQuestion?(a(),i("div",ut,[n("div",dt,r(s(t).currentQuestion.question),1),s(t).currentQuestion.choices?.length?(a(),i("div",pt,[(a(!0),i(S,null,b(s(t).currentQuestion.choices,e=>(a(),k(L,{key:e,size:"small",onClick:c=>s(t).answerQuestion(e)},{default:v(()=>[g(r(e),1)]),_:2},1032,["onClick"]))),128))])):(a(),k(Z,{key:1,placeholder:"输入回答...","enter-button":"发送",style:{"margin-top":"10px"},onSearch:s(t).answerQuestion},null,8,["onSearch"]))])):_("",!0)],512)),s(t).result?.mode==="debate"&&!s(t).isRunning?(a(),i("div",vt,[n("div",mt,[p(f,{color:D(s(t).result.verdict)},{default:v(()=>[g(r(s(t).result.verdict),1)]),_:1},8,["color"]),n("span",_t,"共识 "+r(s(t).result.consensusScore||0)+"/100",1)]),p(J,{ghost:"",size:"small"},{default:v(()=>[(a(!0),i(S,null,b(s(t).result.reviews||[],(e,c)=>(a(),k(V,{key:c,class:"review-collapse"},{header:v(()=>[p(f,{color:D(e.verdict)},{default:v(()=>[g(r(e.verdict),1)]),_:2},1032,["color"]),g(" "+r(e.role),1)]),default:v(()=>[n("div",{class:"review-body",innerHTML:s(te)(e.review)},null,8,yt)]),_:2},1024))),128))]),_:1})])):_("",!0),s(t).result&&!s(t).isRunning?(a(),i("div",ft,[s(t).result.mode==="debate"?(a(),k(f,{key:0,color:"magenta"},{default:v(()=>[...l[19]||(l[19]=[g("debate",-1)])]),_:1})):_("",!0),s(t).result.parallel?(a(),k(f,{key:1,color:"purple"},{default:v(()=>[g(r(s(t).result.subtaskCount||0)+" subtasks",1)]),_:1})):_("",!0),p(f,{color:"geekblue"},{default:v(()=>[g(r(s(t).result.iterationCount||0)+" iterations",1)]),_:1}),p(f,{color:"cyan"},{default:v(()=>[g("~"+r((s(t).result.tokenCount||0).toLocaleString())+" tokens",1)]),_:1}),s(t).result.toolsUsed?.length?(a(),k(f,{key:2,color:"green"},{default:v(()=>[g(r(s(t).result.toolsUsed.length)+" tools",1)]),_:1})):_("",!0)])):_("",!0),n("div",gt,[s(t).selectedTemplate?(a(),i("div",ht,[p(f,{color:"blue",class:"context-tag"},{default:v(()=>[(a(),k(Y(P[s(t).selectedTemplate.icon]||s(H)))),g(" "+r(s(t).selectedTemplate.name),1)]),_:1}),(a(!0),i(S,null,b(s(t).files,e=>(a(),k(f,{key:e,class:"context-tag file"},{default:v(()=>[g(r(R(e)),1)]),_:2},1024))),128))])):_("",!0),n("div",kt,[p(o,{value:w.value,"onUpdate:value":l[8]||(l[8]=e=>w.value=e),placeholder:Q.value,"auto-size":{minRows:1,maxRows:6},disabled:s(y).isLoading,class:"msg-input",onKeydown:re(X(E,["exact","prevent"]),["enter"])},null,8,["value","placeholder","disabled","onKeydown"]),p(L,{type:"primary",loading:s(y).isLoading,class:"send-btn",onClick:E},{icon:v(()=>[p(s(Se))]),_:1},8,["loading"])])])])])}}},Ft=ce(wt,[["__scopeId","data-v-3ed36674"]]);export{Ft as default};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{u as Z}from"./ws-Bv7YH0VB.js";import{
|
|
1
|
+
import{u as Z}from"./ws-Bv7YH0VB.js";import{a5 as ee,y as ae,i as te}from"./icons-DbKJDD5_.js";import{a as d}from"./index-CtUuEt-Q.js";import{l as le,F as b,D as v,c as a,x as t,q as s,r as x,v as p,J as f,u as L,H as O,L as ne,I as w,m as q,G as z,j as V}from"./vendor-BVetwVfk.js";import"./index-BLYcQWYW.js";import"./useConfigInject-BlTQDaaH.js";import"./transition-C4Iby8cT.js";import"./Keyframes-C7fCrnlS.js";import"./Portal-CHsntPCQ.js";import"./index-U4Zd5IK6.js";const oe={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},se={key:0,style:{"text-align":"center",padding:"40px"}},re={style:{color:"#e0e0e0","font-weight":"500"}},ue={key:0,style:{color:"var(--text-secondary)","font-size":"11px"}},ie={key:1,style:{background:"var(--bg-card-hover)",padding:"2px 6px","border-radius":"3px",color:"#91caff","font-size":"11px"}},ce={style:{padding:"40px",color:"var(--text-muted)","text-align":"center"}},we={__name:"Cron",setup(de){const y=Z(),C=x(!1),$=x(!1),_=x(!1),m=x([]),S=V(()=>m.value.filter(l=>l.enabled).length),W=V(()=>m.value.filter(l=>!l.enabled).length),B=[{label:"每5分钟",cron:"*/5 * * * *"},{label:"每15分钟",cron:"*/15 * * * *"},{label:"每小时",cron:"0 * * * *"},{label:"每天9点",cron:"0 9 * * *"},{label:"每天18点",cron:"0 18 * * *"},{label:"每周一9点",cron:"0 9 * * 1"},{label:"每月1号",cron:"0 9 1 * *"}],o=x({name:"",cron:"",payload:"",description:"",enabled:!0}),j=[{title:"任务名称",key:"name",width:"25%"},{title:"Cron",key:"cron",width:"20%"},{title:"状态",key:"status",width:"15%"},{title:"操作",key:"actions",width:"20%"}];async function T(){C.value=!0;try{const{output:l}=await y.execute('skill run cron-scheduler "list all scheduled tasks"',2e4);m.value=A(l)}catch{m.value=[]}finally{C.value=!1}}function A(l){const e=[],c=l.split(`
|
|
2
2
|
`);for(const k of c){const u=k.trim();if(!u||u.startsWith("─"))continue;const i=u.match(/^([^\t|]+?)[\t|]+([*\d/,\-?LW#\s]+)[\t|]+/);i&&e.push({key:e.length,name:i[1].trim(),cron:i[2].trim(),enabled:!u.toLowerCase().includes("pause")&&!u.toLowerCase().includes("disabled"),description:"",running:!1})}return e}function D(l){o.value.cron=l.cron,_.value=!0}async function F(){if(!o.value.name||!o.value.cron){d.warning("请填写任务名称和 Cron 表达式");return}$.value=!0;try{const l=`skill run cron-scheduler "add task: ${o.value.name}, schedule: ${o.value.cron}, payload: ${o.value.payload||"ping"}"`,{output:e}=await y.execute(l,2e4);d.success("任务已创建"),_.value=!1,o.value={name:"",cron:"",payload:"",description:"",enabled:!0},await T()}catch(l){d.error("创建失败: "+l.message)}finally{$.value=!1}}async function I(l){l.running=!0;try{const{output:e}=await y.execute(`skill run cron-scheduler "run task: ${l.name}"`,3e4);d.success(`任务 ${l.name} 已触发`)}catch(e){d.error("触发失败: "+e.message)}finally{l.running=!1}}async function P(l){const e=l.enabled?"pause":"enable";try{await y.execute(`skill run cron-scheduler "${e} task: ${l.name}"`,1e4),l.enabled=!l.enabled,d.success(`任务已${l.enabled?"启用":"暂停"}`)}catch{d.error("操作失败")}}async function E(l){try{await y.execute(`skill run cron-scheduler "delete task: ${l.name}"`,1e4),m.value=m.value.filter(e=>e.key!==l.key),d.success("任务已删除")}catch{d.error("删除失败")}}return le(T),(l,e)=>{const c=s("a-button"),k=s("a-space"),u=s("a-statistic"),i=s("a-card"),h=s("a-col"),G=s("a-row"),H=s("a-spin"),J=s("a-badge"),M=s("a-popconfirm"),R=s("a-table"),U=s("a-input"),g=s("a-form-item"),K=s("a-textarea"),Q=s("a-switch"),X=s("a-form"),Y=s("a-modal");return p(),b("div",null,[v("div",oe,[e[9]||(e[9]=v("div",null,[v("h2",{class:"page-title"},"定时任务"),v("p",{class:"page-sub"},"定时任务调度管理")],-1)),a(k,null,{default:t(()=>[a(c,{onClick:e[0]||(e[0]=n=>_.value=!0),type:"primary"},{icon:t(()=>[a(L(ee))]),default:t(()=>[e[7]||(e[7]=f(" 新建任务 ",-1))]),_:1}),a(c,{ghost:"",loading:C.value,onClick:T},{icon:t(()=>[a(L(ae))]),default:t(()=>[e[8]||(e[8]=f(" 刷新 ",-1))]),_:1},8,["loading"])]),_:1})]),a(G,{gutter:[16,16],style:{"margin-bottom":"20px"}},{default:t(()=>[a(h,{xs:12,sm:6},{default:t(()=>[a(i,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"},size:"small"},{default:t(()=>[a(u,{title:"全部任务",value:m.value.length,"value-style":"color: #ccc; font-size: 18px;"},null,8,["value"])]),_:1})]),_:1}),a(h,{xs:12,sm:6},{default:t(()=>[a(i,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"},size:"small"},{default:t(()=>[a(u,{title:"启用中",value:S.value,"value-style":"color: #52c41a; font-size: 18px;"},null,8,["value"])]),_:1})]),_:1}),a(h,{xs:12,sm:6},{default:t(()=>[a(i,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"},size:"small"},{default:t(()=>[a(u,{title:"已暂停",value:W.value,"value-style":"color: #faad14; font-size: 18px;"},null,8,["value"])]),_:1})]),_:1}),a(h,{xs:12,sm:6},{default:t(()=>[a(i,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"},size:"small"},{default:t(()=>[a(u,{title:"预设方案",value:B.length,"value-style":"color: #1677ff; font-size: 18px;"},null,8,["value"])]),_:1})]),_:1})]),_:1}),a(i,{title:"快速添加预设",style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"16px"},size:"small"},{default:t(()=>[a(k,{wrap:""},{default:t(()=>[(p(),b(O,null,ne(B,n=>a(c,{key:n.label,size:"small",style:{background:"var(--bg-card-hover)","border-color":"var(--border-color)","font-size":"12px"},onClick:r=>D(n)},{default:t(()=>[f(w(n.label),1)]),_:2},1032,["onClick"])),64))]),_:1})]),_:1}),a(i,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:t(()=>[C.value?(p(),b("div",se,[a(H,{size:"large"})])):(p(),q(R,{key:1,columns:j,"data-source":m.value,pagination:{pageSize:15},size:"small"},{bodyCell:t(({column:n,record:r})=>[n.key==="name"?(p(),b(O,{key:0},[v("div",re,w(r.name),1),r.description?(p(),b("div",ue,w(r.description),1)):z("",!0)],64)):z("",!0),n.key==="cron"?(p(),b("code",ie,w(r.cron),1)):z("",!0),n.key==="status"?(p(),q(J,{key:2,status:r.enabled?"success":"warning",text:r.enabled?"运行中":"已暂停"},null,8,["status","text"])):z("",!0),n.key==="actions"?(p(),q(k,{key:3,size:"small"},{default:t(()=>[a(c,{size:"small",type:"link",loading:r.running,onClick:N=>I(r)},{default:t(()=>[...e[10]||(e[10]=[f("运行",-1)])]),_:1},8,["loading","onClick"]),a(c,{size:"small",type:"link",onClick:N=>P(r)},{default:t(()=>[f(w(r.enabled?"暂停":"启用"),1)]),_:2},1032,["onClick"]),a(M,{title:"确认删除此任务?",onConfirm:N=>E(r)},{default:t(()=>[a(c,{size:"small",type:"link",danger:""},{default:t(()=>[...e[11]||(e[11]=[f("删除",-1)])]),_:1})]),_:1},8,["onConfirm"])]),_:2},1024)):z("",!0)]),emptyText:t(()=>[v("div",ce,[a(L(te),{style:{"font-size":"36px","margin-bottom":"12px",display:"block"}}),e[12]||(e[12]=f(" 暂无定时任务 ",-1))])]),_:1},8,["data-source"]))]),_:1}),a(Y,{open:_.value,"onUpdate:open":e[6]||(e[6]=n=>_.value=n),title:"新建定时任务","confirm-loading":$.value,onOk:F,width:"520px"},{default:t(()=>[a(X,{"label-col":{span:5},"wrapper-col":{span:19},style:{"margin-top":"16px"}},{default:t(()=>[a(g,{label:"任务名称",required:""},{default:t(()=>[a(U,{value:o.value.name,"onUpdate:value":e[1]||(e[1]=n=>o.value.name=n),placeholder:"任务名称"},null,8,["value"])]),_:1}),a(g,{label:"Cron 表达式",required:""},{default:t(()=>[a(U,{value:o.value.cron,"onUpdate:value":e[2]||(e[2]=n=>o.value.cron=n),placeholder:"如: 0 9 * * * (每天9点)"},null,8,["value"]),e[13]||(e[13]=v("div",{style:{color:"var(--text-secondary)","font-size":"11px","margin-top":"4px"}},"格式: 分 时 日 月 周",-1))]),_:1}),a(g,{label:"任务内容",required:""},{default:t(()=>[a(K,{value:o.value.payload,"onUpdate:value":e[3]||(e[3]=n=>o.value.payload=n),rows:3,placeholder:"要执行的 AI 任务描述..."},null,8,["value"])]),_:1}),a(g,{label:"描述"},{default:t(()=>[a(U,{value:o.value.description,"onUpdate:value":e[4]||(e[4]=n=>o.value.description=n),placeholder:"可选描述"},null,8,["value"])]),_:1}),a(g,{label:"立即启用"},{default:t(()=>[a(Q,{checked:o.value.enabled,"onUpdate:checked":e[5]||(e[5]=n=>o.value.enabled=n)},null,8,["checked"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"])])}}};export{we as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{u as Ne}from"./ws-Bv7YH0VB.js";import{s as Be}from"./community-parser-CO25nZFt.js";import{_ as qe}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{a as x}from"./index-CP2liZYV.js";import{v as Ie,a1 as Re,n as re,at as ie,au as ue,av as Ve,a4 as De,ae as Je,aw as de}from"./icons-Jk30QO6-.js";import{l as Pe,F as f,D as m,c as a,x as n,m as C,G as h,q as v,r as k,v as i,J as y,u as b,H as A,L as U,I as u,a as Q}from"./vendor-BVetwVfk.js";import"./index-MzZGrA5i.js";import"./useConfigInject-BfCzqqat.js";import"./transition-6LOZvE9a.js";import"./Keyframes-C7fCrnlS.js";import"./Portal-CHsntPCQ.js";import"./index-U4Zd5IK6.js";function N(t){const l=Be(t);if(!l)return null;try{return JSON.parse(l)}catch{}const r=l.match(/\{[\s\S]*\}|\[[\s\S]*\]/);if(!r)return null;try{return JSON.parse(r[0])}catch{return null}}function S(t,l=0){return typeof t=="number"&&Number.isFinite(t)?t:l}function Ee(t,l=0){if(!t||typeof t!="object")return null;const r=t.id||"";return r?{key:r,id:r,name:String(t.name||r),symbol:String(t.symbol||""),chainId:S(t.chainId??t.chain_id,0),_idx:l}:null}function Ke(t){const l=N(t);return Array.isArray(l)?l.map(Ee).filter(Boolean):[]}function Ge(t,l=0){if(!t||typeof t!="object")return null;const r=t.id||"";return r?{key:r,id:r,fromChain:t.fromChain??t.from_chain??"",toChain:t.toChain??t.to_chain??"",asset:String(t.asset||"native"),amount:S(t.amount,0),senderAddress:t.senderAddress??t.sender_address??"",recipientAddress:t.recipientAddress??t.recipient_address??"",lockTxHash:t.lockTxHash??t.lock_tx_hash??"",mintTxHash:t.mintTxHash??t.mint_tx_hash??"",status:String(t.status||"pending").toLowerCase(),feeAmount:S(t.feeAmount??t.fee_amount,0),feeChain:t.feeChain??t.fee_chain??"",errorMessage:t.errorMessage??t.error_message??"",createdAt:t.createdAt??t.created_at??null,completedAt:t.completedAt??t.completed_at??null,_idx:l}:null}function We(t){const l=N(t);return Array.isArray(l)?l.map(Ge).filter(Boolean):[]}function Xe(t,l=0){if(!t||typeof t!="object")return null;const r=t.id||"";return r?{key:r,id:r,fromChain:t.fromChain??t.from_chain??"",toChain:t.toChain??t.to_chain??"",fromAsset:t.fromAsset??t.from_asset??"native",toAsset:t.toAsset??t.to_asset??"native",amount:S(t.amount,0),counterpartyAddress:t.counterpartyAddress??t.counterparty_address??"",hashLock:t.hashLock??t.hash_lock??"",expiresAt:t.expiresAt??t.expires_at??null,status:String(t.status||"initiated").toLowerCase(),claimTxHash:t.claimTxHash??t.claim_tx_hash??"",refundTxHash:t.refundTxHash??t.refund_tx_hash??"",createdAt:t.createdAt??t.created_at??null,_idx:l}:null}function Qe(t){const l=N(t);return Array.isArray(l)?l.map(Xe).filter(Boolean):[]}function Ye(t,l=0){if(!t||typeof t!="object")return null;const r=t.id||"";return r?{key:r,id:r,fromChain:t.fromChain??t.from_chain??"",toChain:t.toChain??t.to_chain??"",payload:String(t.payload||""),targetContract:t.targetContract??t.target_contract??"",sourceTxHash:t.sourceTxHash??t.source_tx_hash??"",destinationTxHash:t.destinationTxHash??t.destination_tx_hash??"",status:String(t.status||"pending").toLowerCase(),retries:S(t.retries,0),createdAt:t.createdAt??t.created_at??null,deliveredAt:t.deliveredAt??t.delivered_at??null,_idx:l}:null}function Ze(t){const l=N(t);return Array.isArray(l)?l.map(Ye).filter(Boolean):[]}const et={bridges:{total:0,byStatus:{},totalVolume:0,totalFees:0},swaps:{total:0,byStatus:{}},messages:{total:0,byStatus:{}}};function tt(t){const l=JSON.parse(JSON.stringify(et)),r=N(t);return!r||typeof r!="object"||Array.isArray(r)||(r.bridges&&typeof r.bridges=="object"&&(l.bridges.total=S(r.bridges.total,0),l.bridges.totalVolume=S(r.bridges.totalVolume??r.bridges.total_volume,0),l.bridges.totalFees=S(r.bridges.totalFees??r.bridges.total_fees,0),r.bridges.byStatus&&typeof r.bridges.byStatus=="object"&&(l.bridges.byStatus={...r.bridges.byStatus})),r.swaps&&typeof r.swaps=="object"&&(l.swaps.total=S(r.swaps.total,0),r.swaps.byStatus&&typeof r.swaps.byStatus=="object"&&(l.swaps.byStatus={...r.swaps.byStatus})),r.messages&&typeof r.messages=="object"&&(l.messages.total=S(r.messages.total,0),r.messages.byStatus&&typeof r.messages.byStatus=="object"&&(l.messages.byStatus={...r.messages.byStatus}))),l}function at(t){const l=N(t);return!l||typeof l!="object"||Array.isArray(l)?null:{fee:S(l.fee,0),breakdown:{sourceFee:S(l?.breakdown?.sourceFee??l?.breakdown?.source_fee,0),destFee:S(l?.breakdown?.destFee??l?.breakdown?.dest_fee,0),bridgeFee:S(l?.breakdown?.bridgeFee??l?.breakdown?.bridge_fee,0)},currency:String(l.currency||"USD")}}function pe(t){if(t==null||t==="")return"—";const l=typeof t=="number"?new Date(t):new Date(String(t));return isNaN(l.getTime())?String(t):l.toLocaleString("zh-CN",{hour12:!1})}const ot={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},nt={style:{opacity:"0.7"}},st={key:0,style:{opacity:"0.55","font-size":"10px","margin-left":"4px"}},lt={style:{color:"var(--text-primary)"}},rt={style:{color:"var(--text-primary)"}},it={style:{color:"#722ed1","font-weight":"500"}},ut={style:{color:"var(--text-secondary)","margin-left":"4px","font-size":"11px"}},dt={key:2,style:{color:"var(--text-secondary)","font-size":"12px"}},pt={key:4,style:{color:"var(--text-secondary)","font-size":"11px"}},ct={style:{padding:"40px",color:"var(--text-muted)","text-align":"center"}},ft={style:{color:"var(--text-primary)"}},mt={style:{color:"var(--text-secondary)","font-size":"11px",margin:"0 4px"}},yt={style:{color:"var(--text-primary)"}},vt={style:{color:"var(--text-secondary)","font-size":"11px","margin-left":"4px"}},gt={key:1,style:{color:"#722ed1","font-weight":"500"}},_t={key:0,style:{color:"var(--text-secondary)","font-family":"monospace","font-size":"11px"}},bt={key:1,style:{color:"var(--text-muted)"}},ht={key:4,style:{color:"var(--text-secondary)","font-size":"11px"}},xt={style:{padding:"40px",color:"var(--text-muted)","text-align":"center"}},kt={style:{color:"var(--text-primary)"}},Ct={style:{color:"var(--text-primary)"}},At={key:1,style:{color:"var(--text-secondary)","font-size":"12px"}},St={key:1,style:{color:"var(--text-muted)"}},zt={key:4,style:{color:"var(--text-secondary)","font-size":"11px"}},Tt={style:{padding:"40px",color:"var(--text-muted)","text-align":"center"}},wt={style:{"margin-top":"12px","font-size":"12px",color:"var(--text-secondary)"}},Ft={__name:"Crosschain",setup(t){const l=Ne(),r=k(!1),Y=k(!1),Z=k(!1),ee=k(!1),te=k(!1),z=k([]),ce=k([]),fe=k([]),me=k([]),B=k({bridges:{total:0,byStatus:{},totalVolume:0,totalFees:0},swaps:{total:0,byStatus:{}},messages:{total:0,byStatus:{}}}),q=k("bridges"),J=k(!1),P=k(!1),E=k(!1),ae=k(!1),p=Q({fromChain:"",toChain:"",amount:null,asset:"",sender:"",recipient:""}),d=Q({fromChain:"",toChain:"",amount:null,fromAsset:"",toAsset:"",counterparty:"",timeoutMs:null}),g=Q({fromChain:"",toChain:"",payload:"",contract:""}),T=Q({fromChain:"",toChain:"",amount:null}),w=k(null),be=[{title:"路径",key:"route"},{title:"金额",key:"amount",width:"160px"},{title:"费用",key:"fee",width:"100px"},{title:"状态",key:"status",width:"110px"},{title:"创建时间",key:"createdAt",width:"160px"}],he=[{title:"路径",key:"route"},{title:"金额",key:"amount",width:"110px"},{title:"哈希锁",key:"hashLock",width:"160px"},{title:"状态",key:"status",width:"120px"},{title:"过期时间",key:"expiresAt",width:"160px"}],xe=[{title:"路径",key:"route",width:"220px"},{title:"消息",key:"payload"},{title:"重试",key:"retries",width:"80px"},{title:"状态",key:"status",width:"110px"},{title:"创建时间",key:"createdAt",width:"160px"}],ke={ethereum:"blue",polygon:"purple",bsc:"gold",arbitrum:"cyan",solana:"magenta"};function Ce(s){return ke[s]||"default"}function O(s){const o=z.value.find(F=>F.id===s);return o?o.name:s||"—"}function oe(s){return{pending:"待处理",locked:"已锁定",minted:"已铸造",completed:"已完成",refunded:"已退款",failed:"失败",initiated:"已发起",hash_locked:"哈希锁定",claimed:"已领取",expired:"已过期",sent:"已发送",delivered:"已送达"}[s]||s}function Ae(s){return{pending:"default",locked:"processing",minted:"cyan",completed:"green",refunded:"orange",failed:"red"}[s]||"default"}function Se(s){return{initiated:"default",hash_locked:"processing",claimed:"green",refunded:"orange",expired:"red"}[s]||"default"}function ze(s){return{pending:"default",sent:"processing",delivered:"green",failed:"red"}[s]||"default"}function Te(s,o){return s?s.length>o?s.slice(0,o)+"...":s:""}function we({key:s}){s==="bridge"?J.value=!0:s==="swap"?P.value=!0:s==="message"&&(E.value=!0)}async function I(){r.value=!0;try{const[s,o,F,R,ne]=await Promise.all([l.execute("crosschain chains --json",8e3).catch(()=>({output:""})),l.execute("crosschain bridges --limit 200 --json",1e4).catch(()=>({output:""})),l.execute("crosschain swaps --limit 200 --json",1e4).catch(()=>({output:""})),l.execute("crosschain messages --limit 200 --json",1e4).catch(()=>({output:""})),l.execute("crosschain stats --json",8e3).catch(()=>({output:""}))]);z.value=Ke(s.output),ce.value=We(o.output),fe.value=Qe(F.output),me.value=Ze(R.output),B.value=tt(ne.output)}catch(s){x.error("加载跨链数据失败: "+(s?.message||s))}finally{r.value=!1}}function K(s){return!s.fromChain||!s.toChain?(x.warning("请选择源链和目标链"),!1):s.fromChain===s.toChain?(x.warning("源链和目标链必须不同"),!1):!0}async function Fe(){if(K(p)){if(!p.amount||p.amount<=0){x.warning("请输入正数金额");return}Y.value=!0;try{const s=[`crosschain bridge ${p.fromChain} ${p.toChain} ${p.amount}`];p.asset.trim()&&s.push(`--asset "${p.asset.trim().replace(/"/g,'\\"')}"`),p.sender.trim()&&s.push(`--sender "${p.sender.trim().replace(/"/g,'\\"')}"`),p.recipient.trim()&&s.push(`--recipient "${p.recipient.trim().replace(/"/g,'\\"')}"`),s.push("--json");const{output:o}=await l.execute(s.join(" "),15e3);if(/error|failed|失败|unsupported/i.test(o)&&!/"bridgeId"/.test(o)){x.error("桥接发起失败: "+o.slice(0,120));return}x.success("桥接已发起"),J.value=!1,ye(),q.value="bridges",await I()}catch(s){x.error("桥接失败: "+(s?.message||s))}finally{Y.value=!1}}}async function Ue(){if(K(d)){if(!d.amount||d.amount<=0){x.warning("请输入正数金额");return}Z.value=!0;try{const s=[`crosschain swap ${d.fromChain} ${d.toChain} ${d.amount}`];d.fromAsset.trim()&&s.push(`--from-asset "${d.fromAsset.trim().replace(/"/g,'\\"')}"`),d.toAsset.trim()&&s.push(`--to-asset "${d.toAsset.trim().replace(/"/g,'\\"')}"`),d.counterparty.trim()&&s.push(`--counterparty "${d.counterparty.trim().replace(/"/g,'\\"')}"`),d.timeoutMs!=null&&s.push(`--timeout ${d.timeoutMs}`),s.push("--json");const{output:o}=await l.execute(s.join(" "),15e3);if(/error|failed|失败|unsupported/i.test(o)&&!/"swapId"/.test(o)){x.error("原子交换发起失败: "+o.slice(0,120));return}x.success("原子交换已发起"),P.value=!1,ve(),q.value="swaps",await I()}catch(s){x.error("原子交换失败: "+(s?.message||s))}finally{Z.value=!1}}}async function je(){if(K(g)){ee.value=!0;try{const s=[`crosschain send ${g.fromChain} ${g.toChain}`];g.payload.trim()&&s.push(`--payload "${g.payload.trim().replace(/"/g,'\\"')}"`),g.contract.trim()&&s.push(`--contract "${g.contract.trim().replace(/"/g,'\\"')}"`),s.push("--json");const{output:o}=await l.execute(s.join(" "),12e3);if(/error|failed|失败|unsupported/i.test(o)&&!/"messageId"/.test(o)){x.error("消息发送失败: "+o.slice(0,120));return}x.success("消息已发送"),E.value=!1,ge(),q.value="messages",await I()}catch(s){x.error("发送失败: "+(s?.message||s))}finally{ee.value=!1}}}async function $e(){if(K(T)){if(!T.amount||T.amount<=0){x.warning("请输入正数金额");return}te.value=!0,w.value=null;try{const s=`crosschain estimate-fee ${T.fromChain} ${T.toChain} ${T.amount} --json`,{output:o}=await l.execute(s,8e3),F=at(o);if(!F){x.error("费用估算失败: "+o.slice(0,120));return}w.value=F}catch(s){x.error("估算失败: "+(s?.message||s))}finally{te.value=!1}}}function ye(){p.fromChain="",p.toChain="",p.amount=null,p.asset="",p.sender="",p.recipient=""}function ve(){d.fromChain="",d.toChain="",d.amount=null,d.fromAsset="",d.toAsset="",d.counterparty="",d.timeoutMs=null}function ge(){g.fromChain="",g.toChain="",g.payload="",g.contract=""}return Pe(I),(s,o)=>{const F=v("a-button"),R=v("a-menu-item"),ne=v("a-menu"),Le=v("a-dropdown"),_e=v("a-space"),H=v("a-statistic"),L=v("a-card"),V=v("a-col"),Me=v("a-row"),D=v("a-tag"),se=v("a-table"),le=v("a-tab-pane"),Oe=v("a-tabs"),j=v("a-select-option"),$=v("a-select"),_=v("a-form-item"),G=v("a-input-number"),M=v("a-input"),W=v("a-form"),X=v("a-modal"),He=v("a-textarea");return i(),f("div",null,[m("div",ot,[o[32]||(o[32]=m("div",null,[m("h2",{class:"page-title"},"跨链桥"),m("p",{class:"page-sub"},"链间资产桥接 · HTLC 原子交换 · 跨链消息")],-1)),a(_e,null,{default:n(()=>[a(F,{loading:r.value,onClick:I},{icon:n(()=>[a(b(Ie))]),default:n(()=>[o[26]||(o[26]=y(" 刷新 ",-1))]),_:1},8,["loading"]),a(Le,{trigger:["click"]},{overlay:n(()=>[a(ne,{onClick:we},{default:n(()=>[a(R,{key:"bridge"},{default:n(()=>[a(b(re)),o[28]||(o[28]=y(" 桥接资产",-1))]),_:1}),a(R,{key:"swap"},{default:n(()=>[a(b(ie)),o[29]||(o[29]=y(" HTLC 原子交换",-1))]),_:1}),a(R,{key:"message"},{default:n(()=>[a(b(ue)),o[30]||(o[30]=y(" 跨链消息",-1))]),_:1})]),_:1})]),default:n(()=>[a(F,{type:"primary"},{icon:n(()=>[a(b(Re))]),default:n(()=>[o[27]||(o[27]=y(" 新建 ▼ ",-1))]),_:1})]),_:1}),a(F,{onClick:o[0]||(o[0]=e=>ae.value=!0)},{icon:n(()=>[a(b(Ve))]),default:n(()=>[o[31]||(o[31]=y(" 费用估算 ",-1))]),_:1})]),_:1})]),a(Me,{gutter:[16,16],style:{"margin-bottom":"20px"}},{default:n(()=>[a(V,{xs:12,sm:8,lg:5},{default:n(()=>[a(L,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:n(()=>[a(H,{title:"支持链",value:z.value.length,"value-style":{color:"#1677ff",fontSize:"20px"}},{prefix:n(()=>[a(b(De))]),_:1},8,["value"])]),_:1})]),_:1}),a(V,{xs:12,sm:8,lg:5},{default:n(()=>[a(L,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:n(()=>[a(H,{title:"桥接交易",value:B.value.bridges.total,"value-style":{color:"#52c41a",fontSize:"20px"}},{prefix:n(()=>[a(b(re))]),_:1},8,["value"])]),_:1})]),_:1}),a(V,{xs:12,sm:8,lg:5},{default:n(()=>[a(L,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:n(()=>[a(H,{title:"原子交换",value:B.value.swaps.total,"value-style":{color:"#722ed1",fontSize:"20px"}},{prefix:n(()=>[a(b(ie))]),_:1},8,["value"])]),_:1})]),_:1}),a(V,{xs:12,sm:8,lg:5},{default:n(()=>[a(L,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:n(()=>[a(H,{title:"跨链消息",value:B.value.messages.total,"value-style":{color:"#faad14",fontSize:"20px"}},{prefix:n(()=>[a(b(ue))]),_:1},8,["value"])]),_:1})]),_:1}),a(V,{xs:24,sm:8,lg:4},{default:n(()=>[a(L,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:n(()=>[a(H,{title:"总交易额",value:B.value.bridges.totalVolume,precision:2,"value-style":{color:"#13c2c2",fontSize:"20px"}},{prefix:n(()=>[a(b(Je))]),_:1},8,["value"])]),_:1})]),_:1})]),_:1}),z.value.length?(i(),C(L,{key:0,title:"支持的区块链",size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"20px"},"body-style":{padding:"12px 16px"}},{default:n(()=>[a(_e,{size:[12,8],wrap:""},{default:n(()=>[(i(!0),f(A,null,U(z.value,e=>(i(),C(D,{key:e.id,color:Ce(e.id)},{default:n(()=>[y(u(e.name)+" ",1),m("span",nt,"("+u(e.symbol)+")",1),e.chainId>0?(i(),f("span",st,"#"+u(e.chainId),1)):h("",!0)]),_:2},1032,["color"]))),128))]),_:1})]),_:1})):h("",!0),a(Oe,{activeKey:q.value,"onUpdate:activeKey":o[1]||(o[1]=e=>q.value=e),class:"xchain-tabs"},{default:n(()=>[a(le,{key:"bridges",tab:"桥接交易"},{default:n(()=>[a(se,{columns:be,"data-source":ce.value,pagination:{pageSize:20,showTotal:e=>`共 ${e} 条`},size:"small",loading:r.value,style:{background:"var(--bg-card)"}},{bodyCell:n(({column:e,record:c})=>[e.key==="route"?(i(),f(A,{key:0},[m("span",lt,u(O(c.fromChain)),1),a(b(de),{style:{margin:"0 6px",color:"var(--text-secondary)","font-size":"11px"}}),m("span",rt,u(O(c.toChain)),1)],64)):h("",!0),e.key==="amount"?(i(),f(A,{key:1},[m("span",it,u(c.amount),1),m("span",ut,u(c.asset),1)],64)):h("",!0),e.key==="fee"?(i(),f("span",dt,u(c.feeAmount),1)):h("",!0),e.key==="status"?(i(),C(D,{key:3,color:Ae(c.status)},{default:n(()=>[y(u(oe(c.status)),1)]),_:2},1032,["color"])):h("",!0),e.key==="createdAt"?(i(),f("span",pt,u(b(pe)(c.createdAt)),1)):h("",!0)]),emptyText:n(()=>[m("div",ct,[a(b(re),{style:{"font-size":"36px","margin-bottom":"10px",display:"block"}}),o[33]||(o[33]=y(' 暂无桥接交易,点"新建 → 桥接资产"发起 ',-1))])]),_:1},8,["data-source","pagination","loading"])]),_:1}),a(le,{key:"swaps",tab:"原子交换"},{default:n(()=>[a(se,{columns:he,"data-source":fe.value,pagination:{pageSize:20,showTotal:e=>`共 ${e} 条`},size:"small",loading:r.value,style:{background:"var(--bg-card)"}},{bodyCell:n(({column:e,record:c})=>[e.key==="route"?(i(),f(A,{key:0},[m("span",ft,u(O(c.fromChain)),1),m("span",mt,"("+u(c.fromAsset)+")",1),a(b(de),{style:{margin:"0 4px",color:"var(--text-secondary)","font-size":"11px"}}),m("span",yt,u(O(c.toChain)),1),m("span",vt,"("+u(c.toAsset)+")",1)],64)):h("",!0),e.key==="amount"?(i(),f("span",gt,u(c.amount),1)):h("",!0),e.key==="hashLock"?(i(),f(A,{key:2},[c.hashLock?(i(),f("span",_t,u(c.hashLock.slice(0,14))+"... ",1)):(i(),f("span",bt,"—"))],64)):h("",!0),e.key==="status"?(i(),C(D,{key:3,color:Se(c.status)},{default:n(()=>[y(u(oe(c.status)),1)]),_:2},1032,["color"])):h("",!0),e.key==="expiresAt"?(i(),f("span",ht,u(b(pe)(c.expiresAt)),1)):h("",!0)]),emptyText:n(()=>[m("div",xt,[a(b(ie),{style:{"font-size":"36px","margin-bottom":"10px",display:"block"}}),o[34]||(o[34]=y(' 暂无原子交换,点"新建 → HTLC 原子交换"发起 ',-1))])]),_:1},8,["data-source","pagination","loading"])]),_:1}),a(le,{key:"messages",tab:"跨链消息"},{default:n(()=>[a(se,{columns:xe,"data-source":me.value,pagination:{pageSize:20,showTotal:e=>`共 ${e} 条`},size:"small",loading:r.value,style:{background:"var(--bg-card)"}},{bodyCell:n(({column:e,record:c})=>[e.key==="route"?(i(),f(A,{key:0},[m("span",kt,u(O(c.fromChain)),1),a(b(de),{style:{margin:"0 6px",color:"var(--text-secondary)","font-size":"11px"}}),m("span",Ct,u(O(c.toChain)),1)],64)):h("",!0),e.key==="payload"?(i(),f("span",At,u(Te(c.payload,60)||"—"),1)):h("",!0),e.key==="retries"?(i(),f(A,{key:2},[c.retries>0?(i(),C(D,{key:0,color:"orange",style:{"font-size":"11px"}},{default:n(()=>[y(u(c.retries)+" 次",1)]),_:2},1024)):(i(),f("span",St,"—"))],64)):h("",!0),e.key==="status"?(i(),C(D,{key:3,color:ze(c.status)},{default:n(()=>[y(u(oe(c.status)),1)]),_:2},1032,["color"])):h("",!0),e.key==="createdAt"?(i(),f("span",zt,u(b(pe)(c.createdAt)),1)):h("",!0)]),emptyText:n(()=>[m("div",Tt,[a(b(ue),{style:{"font-size":"36px","margin-bottom":"10px",display:"block"}}),o[35]||(o[35]=y(' 暂无跨链消息,点"新建 → 跨链消息"发送 ',-1))])]),_:1},8,["data-source","pagination","loading"])]),_:1})]),_:1},8,["activeKey"]),a(X,{open:J.value,"onUpdate:open":o[8]||(o[8]=e=>J.value=e),title:"桥接资产","confirm-loading":Y.value,width:540,"ok-text":"发起桥接","cancel-text":"取消",onOk:Fe,onCancel:ye},{default:n(()=>[a(W,{"label-col":{span:5},"wrapper-col":{span:19},style:{"margin-top":"16px"}},{default:n(()=>[a(_,{label:"源链",required:""},{default:n(()=>[a($,{value:p.fromChain,"onUpdate:value":o[2]||(o[2]=e=>p.fromChain=e),placeholder:"选择源链"},{default:n(()=>[(i(!0),f(A,null,U(z.value,e=>(i(),C(j,{key:e.id,value:e.id},{default:n(()=>[y(u(e.name),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),_:1}),a(_,{label:"目标链",required:""},{default:n(()=>[a($,{value:p.toChain,"onUpdate:value":o[3]||(o[3]=e=>p.toChain=e),placeholder:"选择目标链"},{default:n(()=>[(i(!0),f(A,null,U(z.value,e=>(i(),C(j,{key:e.id,value:e.id,disabled:e.id===p.fromChain},{default:n(()=>[y(u(e.name),1)]),_:2},1032,["value","disabled"]))),128))]),_:1},8,["value"])]),_:1}),a(_,{label:"金额",required:""},{default:n(()=>[a(G,{value:p.amount,"onUpdate:value":o[4]||(o[4]=e=>p.amount=e),min:0,precision:6,style:{width:"100%"}},null,8,["value"])]),_:1}),a(_,{label:"资产"},{default:n(()=>[a(M,{value:p.asset,"onUpdate:value":o[5]||(o[5]=e=>p.asset=e),placeholder:"native(默认)"},null,8,["value"])]),_:1}),a(_,{label:"发送方"},{default:n(()=>[a(M,{value:p.sender,"onUpdate:value":o[6]||(o[6]=e=>p.sender=e),placeholder:"0x...(可选)"},null,8,["value"])]),_:1}),a(_,{label:"接收方"},{default:n(()=>[a(M,{value:p.recipient,"onUpdate:value":o[7]||(o[7]=e=>p.recipient=e),placeholder:"0x...(可选)"},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"]),a(X,{open:P.value,"onUpdate:open":o[16]||(o[16]=e=>P.value=e),title:"HTLC 原子交换","confirm-loading":Z.value,width:540,"ok-text":"发起交换","cancel-text":"取消",onOk:Ue,onCancel:ve},{default:n(()=>[a(W,{"label-col":{span:5},"wrapper-col":{span:19},style:{"margin-top":"16px"}},{default:n(()=>[a(_,{label:"源链",required:""},{default:n(()=>[a($,{value:d.fromChain,"onUpdate:value":o[9]||(o[9]=e=>d.fromChain=e),placeholder:"选择源链"},{default:n(()=>[(i(!0),f(A,null,U(z.value,e=>(i(),C(j,{key:e.id,value:e.id},{default:n(()=>[y(u(e.name),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),_:1}),a(_,{label:"目标链",required:""},{default:n(()=>[a($,{value:d.toChain,"onUpdate:value":o[10]||(o[10]=e=>d.toChain=e),placeholder:"选择目标链"},{default:n(()=>[(i(!0),f(A,null,U(z.value,e=>(i(),C(j,{key:e.id,value:e.id,disabled:e.id===d.fromChain},{default:n(()=>[y(u(e.name),1)]),_:2},1032,["value","disabled"]))),128))]),_:1},8,["value"])]),_:1}),a(_,{label:"金额",required:""},{default:n(()=>[a(G,{value:d.amount,"onUpdate:value":o[11]||(o[11]=e=>d.amount=e),min:0,precision:6,style:{width:"100%"}},null,8,["value"])]),_:1}),a(_,{label:"源资产"},{default:n(()=>[a(M,{value:d.fromAsset,"onUpdate:value":o[12]||(o[12]=e=>d.fromAsset=e),placeholder:"native(默认)"},null,8,["value"])]),_:1}),a(_,{label:"目标资产"},{default:n(()=>[a(M,{value:d.toAsset,"onUpdate:value":o[13]||(o[13]=e=>d.toAsset=e),placeholder:"native(默认)"},null,8,["value"])]),_:1}),a(_,{label:"对手方"},{default:n(()=>[a(M,{value:d.counterparty,"onUpdate:value":o[14]||(o[14]=e=>d.counterparty=e),placeholder:"0x...(可选)"},null,8,["value"])]),_:1}),a(_,{label:"超时 (ms)"},{default:n(()=>[a(G,{value:d.timeoutMs,"onUpdate:value":o[15]||(o[15]=e=>d.timeoutMs=e),min:0,placeholder:"默认 24h",style:{width:"100%"}},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"]),a(X,{open:E.value,"onUpdate:open":o[21]||(o[21]=e=>E.value=e),title:"发送跨链消息","confirm-loading":ee.value,width:520,"ok-text":"发送","cancel-text":"取消",onOk:je,onCancel:ge},{default:n(()=>[a(W,{"label-col":{span:5},"wrapper-col":{span:19},style:{"margin-top":"16px"}},{default:n(()=>[a(_,{label:"源链",required:""},{default:n(()=>[a($,{value:g.fromChain,"onUpdate:value":o[17]||(o[17]=e=>g.fromChain=e),placeholder:"选择源链"},{default:n(()=>[(i(!0),f(A,null,U(z.value,e=>(i(),C(j,{key:e.id,value:e.id},{default:n(()=>[y(u(e.name),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),_:1}),a(_,{label:"目标链",required:""},{default:n(()=>[a($,{value:g.toChain,"onUpdate:value":o[18]||(o[18]=e=>g.toChain=e),placeholder:"选择目标链"},{default:n(()=>[(i(!0),f(A,null,U(z.value,e=>(i(),C(j,{key:e.id,value:e.id,disabled:e.id===g.fromChain},{default:n(()=>[y(u(e.name),1)]),_:2},1032,["value","disabled"]))),128))]),_:1},8,["value"])]),_:1}),a(_,{label:"消息"},{default:n(()=>[a(He,{value:g.payload,"onUpdate:value":o[19]||(o[19]=e=>g.payload=e),"auto-size":{minRows:3,maxRows:8}},null,8,["value"])]),_:1}),a(_,{label:"目标合约"},{default:n(()=>[a(M,{value:g.contract,"onUpdate:value":o[20]||(o[20]=e=>g.contract=e),placeholder:"0x...(可选)"},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"]),a(X,{open:ae.value,"onUpdate:open":o[25]||(o[25]=e=>ae.value=e),title:"费用估算","confirm-loading":te.value,width:480,"ok-text":"估算","cancel-text":"关闭",onOk:$e},{default:n(()=>[a(W,{"label-col":{span:5},"wrapper-col":{span:19},style:{"margin-top":"16px"}},{default:n(()=>[a(_,{label:"源链",required:""},{default:n(()=>[a($,{value:T.fromChain,"onUpdate:value":o[22]||(o[22]=e=>T.fromChain=e)},{default:n(()=>[(i(!0),f(A,null,U(z.value,e=>(i(),C(j,{key:e.id,value:e.id},{default:n(()=>[y(u(e.name),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),_:1}),a(_,{label:"目标链",required:""},{default:n(()=>[a($,{value:T.toChain,"onUpdate:value":o[23]||(o[23]=e=>T.toChain=e)},{default:n(()=>[(i(!0),f(A,null,U(z.value,e=>(i(),C(j,{key:e.id,value:e.id,disabled:e.id===T.fromChain},{default:n(()=>[y(u(e.name),1)]),_:2},1032,["value","disabled"]))),128))]),_:1},8,["value"])]),_:1}),a(_,{label:"金额",required:""},{default:n(()=>[a(G,{value:T.amount,"onUpdate:value":o[24]||(o[24]=e=>T.amount=e),min:0,precision:6,style:{width:"100%"}},null,8,["value"])]),_:1})]),_:1}),w.value?(i(),C(L,{key:0,size:"small",style:{background:"var(--bg-base)","margin-top":"8px"}},{default:n(()=>[a(H,{title:"预估费用",value:w.value.fee,precision:4,suffix:w.value.currency,"value-style":{color:"#1677ff"}},null,8,["value","suffix"]),m("div",wt,[m("div",null,"源链费: "+u(w.value.breakdown.sourceFee)+" "+u(w.value.currency),1),m("div",null,"目标链费: "+u(w.value.breakdown.destFee)+" "+u(w.value.currency),1),m("div",null,"桥接费: "+u(w.value.breakdown.bridgeFee)+" "+u(w.value.currency),1)])]),_:1})):h("",!0)]),_:1},8,["open","confirm-loading"])])}}},Vt=qe(Ft,[["__scopeId","data-v-04225cba"]]);export{Vt as default};
|
|
1
|
+
import{u as Ne}from"./ws-Bv7YH0VB.js";import{s as Be}from"./community-parser-CO25nZFt.js";import{_ as qe}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{a as x}from"./index-CtUuEt-Q.js";import{y as Ie,a5 as Re,o as re,aw as ie,ax as ue,ay as Ve,a8 as De,ah as Je,az as de}from"./icons-DbKJDD5_.js";import{l as Pe,F as f,D as m,c as a,x as n,m as C,G as h,q as v,r as k,v as i,J as y,u as b,H as A,L as U,I as u,a as Q}from"./vendor-BVetwVfk.js";import"./index-BLYcQWYW.js";import"./useConfigInject-BlTQDaaH.js";import"./transition-C4Iby8cT.js";import"./Keyframes-C7fCrnlS.js";import"./Portal-CHsntPCQ.js";import"./index-U4Zd5IK6.js";function N(t){const l=Be(t);if(!l)return null;try{return JSON.parse(l)}catch{}const r=l.match(/\{[\s\S]*\}|\[[\s\S]*\]/);if(!r)return null;try{return JSON.parse(r[0])}catch{return null}}function S(t,l=0){return typeof t=="number"&&Number.isFinite(t)?t:l}function Ee(t,l=0){if(!t||typeof t!="object")return null;const r=t.id||"";return r?{key:r,id:r,name:String(t.name||r),symbol:String(t.symbol||""),chainId:S(t.chainId??t.chain_id,0),_idx:l}:null}function Ke(t){const l=N(t);return Array.isArray(l)?l.map(Ee).filter(Boolean):[]}function Ge(t,l=0){if(!t||typeof t!="object")return null;const r=t.id||"";return r?{key:r,id:r,fromChain:t.fromChain??t.from_chain??"",toChain:t.toChain??t.to_chain??"",asset:String(t.asset||"native"),amount:S(t.amount,0),senderAddress:t.senderAddress??t.sender_address??"",recipientAddress:t.recipientAddress??t.recipient_address??"",lockTxHash:t.lockTxHash??t.lock_tx_hash??"",mintTxHash:t.mintTxHash??t.mint_tx_hash??"",status:String(t.status||"pending").toLowerCase(),feeAmount:S(t.feeAmount??t.fee_amount,0),feeChain:t.feeChain??t.fee_chain??"",errorMessage:t.errorMessage??t.error_message??"",createdAt:t.createdAt??t.created_at??null,completedAt:t.completedAt??t.completed_at??null,_idx:l}:null}function We(t){const l=N(t);return Array.isArray(l)?l.map(Ge).filter(Boolean):[]}function Xe(t,l=0){if(!t||typeof t!="object")return null;const r=t.id||"";return r?{key:r,id:r,fromChain:t.fromChain??t.from_chain??"",toChain:t.toChain??t.to_chain??"",fromAsset:t.fromAsset??t.from_asset??"native",toAsset:t.toAsset??t.to_asset??"native",amount:S(t.amount,0),counterpartyAddress:t.counterpartyAddress??t.counterparty_address??"",hashLock:t.hashLock??t.hash_lock??"",expiresAt:t.expiresAt??t.expires_at??null,status:String(t.status||"initiated").toLowerCase(),claimTxHash:t.claimTxHash??t.claim_tx_hash??"",refundTxHash:t.refundTxHash??t.refund_tx_hash??"",createdAt:t.createdAt??t.created_at??null,_idx:l}:null}function Qe(t){const l=N(t);return Array.isArray(l)?l.map(Xe).filter(Boolean):[]}function Ye(t,l=0){if(!t||typeof t!="object")return null;const r=t.id||"";return r?{key:r,id:r,fromChain:t.fromChain??t.from_chain??"",toChain:t.toChain??t.to_chain??"",payload:String(t.payload||""),targetContract:t.targetContract??t.target_contract??"",sourceTxHash:t.sourceTxHash??t.source_tx_hash??"",destinationTxHash:t.destinationTxHash??t.destination_tx_hash??"",status:String(t.status||"pending").toLowerCase(),retries:S(t.retries,0),createdAt:t.createdAt??t.created_at??null,deliveredAt:t.deliveredAt??t.delivered_at??null,_idx:l}:null}function Ze(t){const l=N(t);return Array.isArray(l)?l.map(Ye).filter(Boolean):[]}const et={bridges:{total:0,byStatus:{},totalVolume:0,totalFees:0},swaps:{total:0,byStatus:{}},messages:{total:0,byStatus:{}}};function tt(t){const l=JSON.parse(JSON.stringify(et)),r=N(t);return!r||typeof r!="object"||Array.isArray(r)||(r.bridges&&typeof r.bridges=="object"&&(l.bridges.total=S(r.bridges.total,0),l.bridges.totalVolume=S(r.bridges.totalVolume??r.bridges.total_volume,0),l.bridges.totalFees=S(r.bridges.totalFees??r.bridges.total_fees,0),r.bridges.byStatus&&typeof r.bridges.byStatus=="object"&&(l.bridges.byStatus={...r.bridges.byStatus})),r.swaps&&typeof r.swaps=="object"&&(l.swaps.total=S(r.swaps.total,0),r.swaps.byStatus&&typeof r.swaps.byStatus=="object"&&(l.swaps.byStatus={...r.swaps.byStatus})),r.messages&&typeof r.messages=="object"&&(l.messages.total=S(r.messages.total,0),r.messages.byStatus&&typeof r.messages.byStatus=="object"&&(l.messages.byStatus={...r.messages.byStatus}))),l}function at(t){const l=N(t);return!l||typeof l!="object"||Array.isArray(l)?null:{fee:S(l.fee,0),breakdown:{sourceFee:S(l?.breakdown?.sourceFee??l?.breakdown?.source_fee,0),destFee:S(l?.breakdown?.destFee??l?.breakdown?.dest_fee,0),bridgeFee:S(l?.breakdown?.bridgeFee??l?.breakdown?.bridge_fee,0)},currency:String(l.currency||"USD")}}function pe(t){if(t==null||t==="")return"—";const l=typeof t=="number"?new Date(t):new Date(String(t));return isNaN(l.getTime())?String(t):l.toLocaleString("zh-CN",{hour12:!1})}const ot={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},nt={style:{opacity:"0.7"}},st={key:0,style:{opacity:"0.55","font-size":"10px","margin-left":"4px"}},lt={style:{color:"var(--text-primary)"}},rt={style:{color:"var(--text-primary)"}},it={style:{color:"#722ed1","font-weight":"500"}},ut={style:{color:"var(--text-secondary)","margin-left":"4px","font-size":"11px"}},dt={key:2,style:{color:"var(--text-secondary)","font-size":"12px"}},pt={key:4,style:{color:"var(--text-secondary)","font-size":"11px"}},ct={style:{padding:"40px",color:"var(--text-muted)","text-align":"center"}},ft={style:{color:"var(--text-primary)"}},mt={style:{color:"var(--text-secondary)","font-size":"11px",margin:"0 4px"}},yt={style:{color:"var(--text-primary)"}},vt={style:{color:"var(--text-secondary)","font-size":"11px","margin-left":"4px"}},gt={key:1,style:{color:"#722ed1","font-weight":"500"}},_t={key:0,style:{color:"var(--text-secondary)","font-family":"monospace","font-size":"11px"}},bt={key:1,style:{color:"var(--text-muted)"}},ht={key:4,style:{color:"var(--text-secondary)","font-size":"11px"}},xt={style:{padding:"40px",color:"var(--text-muted)","text-align":"center"}},kt={style:{color:"var(--text-primary)"}},Ct={style:{color:"var(--text-primary)"}},At={key:1,style:{color:"var(--text-secondary)","font-size":"12px"}},St={key:1,style:{color:"var(--text-muted)"}},zt={key:4,style:{color:"var(--text-secondary)","font-size":"11px"}},Tt={style:{padding:"40px",color:"var(--text-muted)","text-align":"center"}},wt={style:{"margin-top":"12px","font-size":"12px",color:"var(--text-secondary)"}},Ft={__name:"Crosschain",setup(t){const l=Ne(),r=k(!1),Y=k(!1),Z=k(!1),ee=k(!1),te=k(!1),z=k([]),ce=k([]),fe=k([]),me=k([]),B=k({bridges:{total:0,byStatus:{},totalVolume:0,totalFees:0},swaps:{total:0,byStatus:{}},messages:{total:0,byStatus:{}}}),q=k("bridges"),J=k(!1),P=k(!1),E=k(!1),ae=k(!1),p=Q({fromChain:"",toChain:"",amount:null,asset:"",sender:"",recipient:""}),d=Q({fromChain:"",toChain:"",amount:null,fromAsset:"",toAsset:"",counterparty:"",timeoutMs:null}),g=Q({fromChain:"",toChain:"",payload:"",contract:""}),T=Q({fromChain:"",toChain:"",amount:null}),w=k(null),be=[{title:"路径",key:"route"},{title:"金额",key:"amount",width:"160px"},{title:"费用",key:"fee",width:"100px"},{title:"状态",key:"status",width:"110px"},{title:"创建时间",key:"createdAt",width:"160px"}],he=[{title:"路径",key:"route"},{title:"金额",key:"amount",width:"110px"},{title:"哈希锁",key:"hashLock",width:"160px"},{title:"状态",key:"status",width:"120px"},{title:"过期时间",key:"expiresAt",width:"160px"}],xe=[{title:"路径",key:"route",width:"220px"},{title:"消息",key:"payload"},{title:"重试",key:"retries",width:"80px"},{title:"状态",key:"status",width:"110px"},{title:"创建时间",key:"createdAt",width:"160px"}],ke={ethereum:"blue",polygon:"purple",bsc:"gold",arbitrum:"cyan",solana:"magenta"};function Ce(s){return ke[s]||"default"}function O(s){const o=z.value.find(F=>F.id===s);return o?o.name:s||"—"}function oe(s){return{pending:"待处理",locked:"已锁定",minted:"已铸造",completed:"已完成",refunded:"已退款",failed:"失败",initiated:"已发起",hash_locked:"哈希锁定",claimed:"已领取",expired:"已过期",sent:"已发送",delivered:"已送达"}[s]||s}function Ae(s){return{pending:"default",locked:"processing",minted:"cyan",completed:"green",refunded:"orange",failed:"red"}[s]||"default"}function Se(s){return{initiated:"default",hash_locked:"processing",claimed:"green",refunded:"orange",expired:"red"}[s]||"default"}function ze(s){return{pending:"default",sent:"processing",delivered:"green",failed:"red"}[s]||"default"}function Te(s,o){return s?s.length>o?s.slice(0,o)+"...":s:""}function we({key:s}){s==="bridge"?J.value=!0:s==="swap"?P.value=!0:s==="message"&&(E.value=!0)}async function I(){r.value=!0;try{const[s,o,F,R,ne]=await Promise.all([l.execute("crosschain chains --json",8e3).catch(()=>({output:""})),l.execute("crosschain bridges --limit 200 --json",1e4).catch(()=>({output:""})),l.execute("crosschain swaps --limit 200 --json",1e4).catch(()=>({output:""})),l.execute("crosschain messages --limit 200 --json",1e4).catch(()=>({output:""})),l.execute("crosschain stats --json",8e3).catch(()=>({output:""}))]);z.value=Ke(s.output),ce.value=We(o.output),fe.value=Qe(F.output),me.value=Ze(R.output),B.value=tt(ne.output)}catch(s){x.error("加载跨链数据失败: "+(s?.message||s))}finally{r.value=!1}}function K(s){return!s.fromChain||!s.toChain?(x.warning("请选择源链和目标链"),!1):s.fromChain===s.toChain?(x.warning("源链和目标链必须不同"),!1):!0}async function Fe(){if(K(p)){if(!p.amount||p.amount<=0){x.warning("请输入正数金额");return}Y.value=!0;try{const s=[`crosschain bridge ${p.fromChain} ${p.toChain} ${p.amount}`];p.asset.trim()&&s.push(`--asset "${p.asset.trim().replace(/"/g,'\\"')}"`),p.sender.trim()&&s.push(`--sender "${p.sender.trim().replace(/"/g,'\\"')}"`),p.recipient.trim()&&s.push(`--recipient "${p.recipient.trim().replace(/"/g,'\\"')}"`),s.push("--json");const{output:o}=await l.execute(s.join(" "),15e3);if(/error|failed|失败|unsupported/i.test(o)&&!/"bridgeId"/.test(o)){x.error("桥接发起失败: "+o.slice(0,120));return}x.success("桥接已发起"),J.value=!1,ye(),q.value="bridges",await I()}catch(s){x.error("桥接失败: "+(s?.message||s))}finally{Y.value=!1}}}async function Ue(){if(K(d)){if(!d.amount||d.amount<=0){x.warning("请输入正数金额");return}Z.value=!0;try{const s=[`crosschain swap ${d.fromChain} ${d.toChain} ${d.amount}`];d.fromAsset.trim()&&s.push(`--from-asset "${d.fromAsset.trim().replace(/"/g,'\\"')}"`),d.toAsset.trim()&&s.push(`--to-asset "${d.toAsset.trim().replace(/"/g,'\\"')}"`),d.counterparty.trim()&&s.push(`--counterparty "${d.counterparty.trim().replace(/"/g,'\\"')}"`),d.timeoutMs!=null&&s.push(`--timeout ${d.timeoutMs}`),s.push("--json");const{output:o}=await l.execute(s.join(" "),15e3);if(/error|failed|失败|unsupported/i.test(o)&&!/"swapId"/.test(o)){x.error("原子交换发起失败: "+o.slice(0,120));return}x.success("原子交换已发起"),P.value=!1,ve(),q.value="swaps",await I()}catch(s){x.error("原子交换失败: "+(s?.message||s))}finally{Z.value=!1}}}async function je(){if(K(g)){ee.value=!0;try{const s=[`crosschain send ${g.fromChain} ${g.toChain}`];g.payload.trim()&&s.push(`--payload "${g.payload.trim().replace(/"/g,'\\"')}"`),g.contract.trim()&&s.push(`--contract "${g.contract.trim().replace(/"/g,'\\"')}"`),s.push("--json");const{output:o}=await l.execute(s.join(" "),12e3);if(/error|failed|失败|unsupported/i.test(o)&&!/"messageId"/.test(o)){x.error("消息发送失败: "+o.slice(0,120));return}x.success("消息已发送"),E.value=!1,ge(),q.value="messages",await I()}catch(s){x.error("发送失败: "+(s?.message||s))}finally{ee.value=!1}}}async function $e(){if(K(T)){if(!T.amount||T.amount<=0){x.warning("请输入正数金额");return}te.value=!0,w.value=null;try{const s=`crosschain estimate-fee ${T.fromChain} ${T.toChain} ${T.amount} --json`,{output:o}=await l.execute(s,8e3),F=at(o);if(!F){x.error("费用估算失败: "+o.slice(0,120));return}w.value=F}catch(s){x.error("估算失败: "+(s?.message||s))}finally{te.value=!1}}}function ye(){p.fromChain="",p.toChain="",p.amount=null,p.asset="",p.sender="",p.recipient=""}function ve(){d.fromChain="",d.toChain="",d.amount=null,d.fromAsset="",d.toAsset="",d.counterparty="",d.timeoutMs=null}function ge(){g.fromChain="",g.toChain="",g.payload="",g.contract=""}return Pe(I),(s,o)=>{const F=v("a-button"),R=v("a-menu-item"),ne=v("a-menu"),Le=v("a-dropdown"),_e=v("a-space"),H=v("a-statistic"),L=v("a-card"),V=v("a-col"),Me=v("a-row"),D=v("a-tag"),se=v("a-table"),le=v("a-tab-pane"),Oe=v("a-tabs"),j=v("a-select-option"),$=v("a-select"),_=v("a-form-item"),G=v("a-input-number"),M=v("a-input"),W=v("a-form"),X=v("a-modal"),He=v("a-textarea");return i(),f("div",null,[m("div",ot,[o[32]||(o[32]=m("div",null,[m("h2",{class:"page-title"},"跨链桥"),m("p",{class:"page-sub"},"链间资产桥接 · HTLC 原子交换 · 跨链消息")],-1)),a(_e,null,{default:n(()=>[a(F,{loading:r.value,onClick:I},{icon:n(()=>[a(b(Ie))]),default:n(()=>[o[26]||(o[26]=y(" 刷新 ",-1))]),_:1},8,["loading"]),a(Le,{trigger:["click"]},{overlay:n(()=>[a(ne,{onClick:we},{default:n(()=>[a(R,{key:"bridge"},{default:n(()=>[a(b(re)),o[28]||(o[28]=y(" 桥接资产",-1))]),_:1}),a(R,{key:"swap"},{default:n(()=>[a(b(ie)),o[29]||(o[29]=y(" HTLC 原子交换",-1))]),_:1}),a(R,{key:"message"},{default:n(()=>[a(b(ue)),o[30]||(o[30]=y(" 跨链消息",-1))]),_:1})]),_:1})]),default:n(()=>[a(F,{type:"primary"},{icon:n(()=>[a(b(Re))]),default:n(()=>[o[27]||(o[27]=y(" 新建 ▼ ",-1))]),_:1})]),_:1}),a(F,{onClick:o[0]||(o[0]=e=>ae.value=!0)},{icon:n(()=>[a(b(Ve))]),default:n(()=>[o[31]||(o[31]=y(" 费用估算 ",-1))]),_:1})]),_:1})]),a(Me,{gutter:[16,16],style:{"margin-bottom":"20px"}},{default:n(()=>[a(V,{xs:12,sm:8,lg:5},{default:n(()=>[a(L,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:n(()=>[a(H,{title:"支持链",value:z.value.length,"value-style":{color:"#1677ff",fontSize:"20px"}},{prefix:n(()=>[a(b(De))]),_:1},8,["value"])]),_:1})]),_:1}),a(V,{xs:12,sm:8,lg:5},{default:n(()=>[a(L,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:n(()=>[a(H,{title:"桥接交易",value:B.value.bridges.total,"value-style":{color:"#52c41a",fontSize:"20px"}},{prefix:n(()=>[a(b(re))]),_:1},8,["value"])]),_:1})]),_:1}),a(V,{xs:12,sm:8,lg:5},{default:n(()=>[a(L,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:n(()=>[a(H,{title:"原子交换",value:B.value.swaps.total,"value-style":{color:"#722ed1",fontSize:"20px"}},{prefix:n(()=>[a(b(ie))]),_:1},8,["value"])]),_:1})]),_:1}),a(V,{xs:12,sm:8,lg:5},{default:n(()=>[a(L,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:n(()=>[a(H,{title:"跨链消息",value:B.value.messages.total,"value-style":{color:"#faad14",fontSize:"20px"}},{prefix:n(()=>[a(b(ue))]),_:1},8,["value"])]),_:1})]),_:1}),a(V,{xs:24,sm:8,lg:4},{default:n(()=>[a(L,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:n(()=>[a(H,{title:"总交易额",value:B.value.bridges.totalVolume,precision:2,"value-style":{color:"#13c2c2",fontSize:"20px"}},{prefix:n(()=>[a(b(Je))]),_:1},8,["value"])]),_:1})]),_:1})]),_:1}),z.value.length?(i(),C(L,{key:0,title:"支持的区块链",size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"20px"},"body-style":{padding:"12px 16px"}},{default:n(()=>[a(_e,{size:[12,8],wrap:""},{default:n(()=>[(i(!0),f(A,null,U(z.value,e=>(i(),C(D,{key:e.id,color:Ce(e.id)},{default:n(()=>[y(u(e.name)+" ",1),m("span",nt,"("+u(e.symbol)+")",1),e.chainId>0?(i(),f("span",st,"#"+u(e.chainId),1)):h("",!0)]),_:2},1032,["color"]))),128))]),_:1})]),_:1})):h("",!0),a(Oe,{activeKey:q.value,"onUpdate:activeKey":o[1]||(o[1]=e=>q.value=e),class:"xchain-tabs"},{default:n(()=>[a(le,{key:"bridges",tab:"桥接交易"},{default:n(()=>[a(se,{columns:be,"data-source":ce.value,pagination:{pageSize:20,showTotal:e=>`共 ${e} 条`},size:"small",loading:r.value,style:{background:"var(--bg-card)"}},{bodyCell:n(({column:e,record:c})=>[e.key==="route"?(i(),f(A,{key:0},[m("span",lt,u(O(c.fromChain)),1),a(b(de),{style:{margin:"0 6px",color:"var(--text-secondary)","font-size":"11px"}}),m("span",rt,u(O(c.toChain)),1)],64)):h("",!0),e.key==="amount"?(i(),f(A,{key:1},[m("span",it,u(c.amount),1),m("span",ut,u(c.asset),1)],64)):h("",!0),e.key==="fee"?(i(),f("span",dt,u(c.feeAmount),1)):h("",!0),e.key==="status"?(i(),C(D,{key:3,color:Ae(c.status)},{default:n(()=>[y(u(oe(c.status)),1)]),_:2},1032,["color"])):h("",!0),e.key==="createdAt"?(i(),f("span",pt,u(b(pe)(c.createdAt)),1)):h("",!0)]),emptyText:n(()=>[m("div",ct,[a(b(re),{style:{"font-size":"36px","margin-bottom":"10px",display:"block"}}),o[33]||(o[33]=y(' 暂无桥接交易,点"新建 → 桥接资产"发起 ',-1))])]),_:1},8,["data-source","pagination","loading"])]),_:1}),a(le,{key:"swaps",tab:"原子交换"},{default:n(()=>[a(se,{columns:he,"data-source":fe.value,pagination:{pageSize:20,showTotal:e=>`共 ${e} 条`},size:"small",loading:r.value,style:{background:"var(--bg-card)"}},{bodyCell:n(({column:e,record:c})=>[e.key==="route"?(i(),f(A,{key:0},[m("span",ft,u(O(c.fromChain)),1),m("span",mt,"("+u(c.fromAsset)+")",1),a(b(de),{style:{margin:"0 4px",color:"var(--text-secondary)","font-size":"11px"}}),m("span",yt,u(O(c.toChain)),1),m("span",vt,"("+u(c.toAsset)+")",1)],64)):h("",!0),e.key==="amount"?(i(),f("span",gt,u(c.amount),1)):h("",!0),e.key==="hashLock"?(i(),f(A,{key:2},[c.hashLock?(i(),f("span",_t,u(c.hashLock.slice(0,14))+"... ",1)):(i(),f("span",bt,"—"))],64)):h("",!0),e.key==="status"?(i(),C(D,{key:3,color:Se(c.status)},{default:n(()=>[y(u(oe(c.status)),1)]),_:2},1032,["color"])):h("",!0),e.key==="expiresAt"?(i(),f("span",ht,u(b(pe)(c.expiresAt)),1)):h("",!0)]),emptyText:n(()=>[m("div",xt,[a(b(ie),{style:{"font-size":"36px","margin-bottom":"10px",display:"block"}}),o[34]||(o[34]=y(' 暂无原子交换,点"新建 → HTLC 原子交换"发起 ',-1))])]),_:1},8,["data-source","pagination","loading"])]),_:1}),a(le,{key:"messages",tab:"跨链消息"},{default:n(()=>[a(se,{columns:xe,"data-source":me.value,pagination:{pageSize:20,showTotal:e=>`共 ${e} 条`},size:"small",loading:r.value,style:{background:"var(--bg-card)"}},{bodyCell:n(({column:e,record:c})=>[e.key==="route"?(i(),f(A,{key:0},[m("span",kt,u(O(c.fromChain)),1),a(b(de),{style:{margin:"0 6px",color:"var(--text-secondary)","font-size":"11px"}}),m("span",Ct,u(O(c.toChain)),1)],64)):h("",!0),e.key==="payload"?(i(),f("span",At,u(Te(c.payload,60)||"—"),1)):h("",!0),e.key==="retries"?(i(),f(A,{key:2},[c.retries>0?(i(),C(D,{key:0,color:"orange",style:{"font-size":"11px"}},{default:n(()=>[y(u(c.retries)+" 次",1)]),_:2},1024)):(i(),f("span",St,"—"))],64)):h("",!0),e.key==="status"?(i(),C(D,{key:3,color:ze(c.status)},{default:n(()=>[y(u(oe(c.status)),1)]),_:2},1032,["color"])):h("",!0),e.key==="createdAt"?(i(),f("span",zt,u(b(pe)(c.createdAt)),1)):h("",!0)]),emptyText:n(()=>[m("div",Tt,[a(b(ue),{style:{"font-size":"36px","margin-bottom":"10px",display:"block"}}),o[35]||(o[35]=y(' 暂无跨链消息,点"新建 → 跨链消息"发送 ',-1))])]),_:1},8,["data-source","pagination","loading"])]),_:1})]),_:1},8,["activeKey"]),a(X,{open:J.value,"onUpdate:open":o[8]||(o[8]=e=>J.value=e),title:"桥接资产","confirm-loading":Y.value,width:540,"ok-text":"发起桥接","cancel-text":"取消",onOk:Fe,onCancel:ye},{default:n(()=>[a(W,{"label-col":{span:5},"wrapper-col":{span:19},style:{"margin-top":"16px"}},{default:n(()=>[a(_,{label:"源链",required:""},{default:n(()=>[a($,{value:p.fromChain,"onUpdate:value":o[2]||(o[2]=e=>p.fromChain=e),placeholder:"选择源链"},{default:n(()=>[(i(!0),f(A,null,U(z.value,e=>(i(),C(j,{key:e.id,value:e.id},{default:n(()=>[y(u(e.name),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),_:1}),a(_,{label:"目标链",required:""},{default:n(()=>[a($,{value:p.toChain,"onUpdate:value":o[3]||(o[3]=e=>p.toChain=e),placeholder:"选择目标链"},{default:n(()=>[(i(!0),f(A,null,U(z.value,e=>(i(),C(j,{key:e.id,value:e.id,disabled:e.id===p.fromChain},{default:n(()=>[y(u(e.name),1)]),_:2},1032,["value","disabled"]))),128))]),_:1},8,["value"])]),_:1}),a(_,{label:"金额",required:""},{default:n(()=>[a(G,{value:p.amount,"onUpdate:value":o[4]||(o[4]=e=>p.amount=e),min:0,precision:6,style:{width:"100%"}},null,8,["value"])]),_:1}),a(_,{label:"资产"},{default:n(()=>[a(M,{value:p.asset,"onUpdate:value":o[5]||(o[5]=e=>p.asset=e),placeholder:"native(默认)"},null,8,["value"])]),_:1}),a(_,{label:"发送方"},{default:n(()=>[a(M,{value:p.sender,"onUpdate:value":o[6]||(o[6]=e=>p.sender=e),placeholder:"0x...(可选)"},null,8,["value"])]),_:1}),a(_,{label:"接收方"},{default:n(()=>[a(M,{value:p.recipient,"onUpdate:value":o[7]||(o[7]=e=>p.recipient=e),placeholder:"0x...(可选)"},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"]),a(X,{open:P.value,"onUpdate:open":o[16]||(o[16]=e=>P.value=e),title:"HTLC 原子交换","confirm-loading":Z.value,width:540,"ok-text":"发起交换","cancel-text":"取消",onOk:Ue,onCancel:ve},{default:n(()=>[a(W,{"label-col":{span:5},"wrapper-col":{span:19},style:{"margin-top":"16px"}},{default:n(()=>[a(_,{label:"源链",required:""},{default:n(()=>[a($,{value:d.fromChain,"onUpdate:value":o[9]||(o[9]=e=>d.fromChain=e),placeholder:"选择源链"},{default:n(()=>[(i(!0),f(A,null,U(z.value,e=>(i(),C(j,{key:e.id,value:e.id},{default:n(()=>[y(u(e.name),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),_:1}),a(_,{label:"目标链",required:""},{default:n(()=>[a($,{value:d.toChain,"onUpdate:value":o[10]||(o[10]=e=>d.toChain=e),placeholder:"选择目标链"},{default:n(()=>[(i(!0),f(A,null,U(z.value,e=>(i(),C(j,{key:e.id,value:e.id,disabled:e.id===d.fromChain},{default:n(()=>[y(u(e.name),1)]),_:2},1032,["value","disabled"]))),128))]),_:1},8,["value"])]),_:1}),a(_,{label:"金额",required:""},{default:n(()=>[a(G,{value:d.amount,"onUpdate:value":o[11]||(o[11]=e=>d.amount=e),min:0,precision:6,style:{width:"100%"}},null,8,["value"])]),_:1}),a(_,{label:"源资产"},{default:n(()=>[a(M,{value:d.fromAsset,"onUpdate:value":o[12]||(o[12]=e=>d.fromAsset=e),placeholder:"native(默认)"},null,8,["value"])]),_:1}),a(_,{label:"目标资产"},{default:n(()=>[a(M,{value:d.toAsset,"onUpdate:value":o[13]||(o[13]=e=>d.toAsset=e),placeholder:"native(默认)"},null,8,["value"])]),_:1}),a(_,{label:"对手方"},{default:n(()=>[a(M,{value:d.counterparty,"onUpdate:value":o[14]||(o[14]=e=>d.counterparty=e),placeholder:"0x...(可选)"},null,8,["value"])]),_:1}),a(_,{label:"超时 (ms)"},{default:n(()=>[a(G,{value:d.timeoutMs,"onUpdate:value":o[15]||(o[15]=e=>d.timeoutMs=e),min:0,placeholder:"默认 24h",style:{width:"100%"}},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"]),a(X,{open:E.value,"onUpdate:open":o[21]||(o[21]=e=>E.value=e),title:"发送跨链消息","confirm-loading":ee.value,width:520,"ok-text":"发送","cancel-text":"取消",onOk:je,onCancel:ge},{default:n(()=>[a(W,{"label-col":{span:5},"wrapper-col":{span:19},style:{"margin-top":"16px"}},{default:n(()=>[a(_,{label:"源链",required:""},{default:n(()=>[a($,{value:g.fromChain,"onUpdate:value":o[17]||(o[17]=e=>g.fromChain=e),placeholder:"选择源链"},{default:n(()=>[(i(!0),f(A,null,U(z.value,e=>(i(),C(j,{key:e.id,value:e.id},{default:n(()=>[y(u(e.name),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),_:1}),a(_,{label:"目标链",required:""},{default:n(()=>[a($,{value:g.toChain,"onUpdate:value":o[18]||(o[18]=e=>g.toChain=e),placeholder:"选择目标链"},{default:n(()=>[(i(!0),f(A,null,U(z.value,e=>(i(),C(j,{key:e.id,value:e.id,disabled:e.id===g.fromChain},{default:n(()=>[y(u(e.name),1)]),_:2},1032,["value","disabled"]))),128))]),_:1},8,["value"])]),_:1}),a(_,{label:"消息"},{default:n(()=>[a(He,{value:g.payload,"onUpdate:value":o[19]||(o[19]=e=>g.payload=e),"auto-size":{minRows:3,maxRows:8}},null,8,["value"])]),_:1}),a(_,{label:"目标合约"},{default:n(()=>[a(M,{value:g.contract,"onUpdate:value":o[20]||(o[20]=e=>g.contract=e),placeholder:"0x...(可选)"},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"]),a(X,{open:ae.value,"onUpdate:open":o[25]||(o[25]=e=>ae.value=e),title:"费用估算","confirm-loading":te.value,width:480,"ok-text":"估算","cancel-text":"关闭",onOk:$e},{default:n(()=>[a(W,{"label-col":{span:5},"wrapper-col":{span:19},style:{"margin-top":"16px"}},{default:n(()=>[a(_,{label:"源链",required:""},{default:n(()=>[a($,{value:T.fromChain,"onUpdate:value":o[22]||(o[22]=e=>T.fromChain=e)},{default:n(()=>[(i(!0),f(A,null,U(z.value,e=>(i(),C(j,{key:e.id,value:e.id},{default:n(()=>[y(u(e.name),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),_:1}),a(_,{label:"目标链",required:""},{default:n(()=>[a($,{value:T.toChain,"onUpdate:value":o[23]||(o[23]=e=>T.toChain=e)},{default:n(()=>[(i(!0),f(A,null,U(z.value,e=>(i(),C(j,{key:e.id,value:e.id,disabled:e.id===T.fromChain},{default:n(()=>[y(u(e.name),1)]),_:2},1032,["value","disabled"]))),128))]),_:1},8,["value"])]),_:1}),a(_,{label:"金额",required:""},{default:n(()=>[a(G,{value:T.amount,"onUpdate:value":o[24]||(o[24]=e=>T.amount=e),min:0,precision:6,style:{width:"100%"}},null,8,["value"])]),_:1})]),_:1}),w.value?(i(),C(L,{key:0,size:"small",style:{background:"var(--bg-base)","margin-top":"8px"}},{default:n(()=>[a(H,{title:"预估费用",value:w.value.fee,precision:4,suffix:w.value.currency,"value-style":{color:"#1677ff"}},null,8,["value","suffix"]),m("div",wt,[m("div",null,"源链费: "+u(w.value.breakdown.sourceFee)+" "+u(w.value.currency),1),m("div",null,"目标链费: "+u(w.value.breakdown.destFee)+" "+u(w.value.currency),1),m("div",null,"桥接费: "+u(w.value.breakdown.bridgeFee)+" "+u(w.value.currency),1)])]),_:1})):h("",!0)]),_:1},8,["open","confirm-loading"])])}}},Vt=qe(Ft,[["__scopeId","data-v-04225cba"]]);export{Vt as default};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{u as ge}from"./ws-Bv7YH0VB.js";import{_ as xe}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{a as f}from"./index-
|
|
1
|
+
import{u as ge}from"./ws-Bv7YH0VB.js";import{_ as xe}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{a as f}from"./index-CtUuEt-Q.js";import{y as be,a5 as ke,I as De,K as he,aa as X,m as we,a as Ie}from"./icons-DbKJDD5_.js";import{l as ze,F as I,D as b,c as t,x as a,m as $,G as k,q as r,r as c,v,J as p,u as z,I as g,j as Y}from"./vendor-BVetwVfk.js";import"./index-BLYcQWYW.js";import"./useConfigInject-BlTQDaaH.js";import"./transition-C4Iby8cT.js";import"./Keyframes-C7fCrnlS.js";import"./Portal-CHsntPCQ.js";import"./index-U4Zd5IK6.js";function G(n){if(!n)return null;const o=n.trim();try{return JSON.parse(o)}catch{const u=o.match(/(\[[\s\S]*\]|\{[\s\S]*\})/);if(!u)return null;try{return JSON.parse(u[1])}catch{return null}}}function E(n,o=0){if(!n||typeof n!="object")return null;const u=n.did||n.id||"";if(!u)return null;const d=n.displayName??n.display_name??n.name??"",C=n.isDefault===!0||n.is_default===1||n.is_default===!0||n.default===!0,m=n.publicKey??n.public_key??"",h=n.createdAt??n.created_at??n.created??"",x=(u.split(":")[1]||"chainless").trim();return{key:u,did:u,displayName:d||"",publicKey:m||"",isDefault:!!C,createdAt:h||"",method:x,raw:n.document?n:null,_idx:o}}function Ce(n){const o=G(n);return Array.isArray(o)?o.map(E).filter(Boolean):o&&Array.isArray(o.identities)?o.identities.map(E).filter(Boolean):Se(n||"")}function Se(n){const o=(n||"").split(`
|
|
2
2
|
`),u=[];let d=null;for(const C of o){const m=C.trim();if(!m||m.startsWith("─")||m.startsWith("="))continue;const h=m.match(/(did:[a-z0-9]+:[A-Za-z0-9_-]+)/);if(h&&/^did:/.test(m)){d&&u.push(d);const x=h[1],S=m.match(/\(([^)]+)\)/),D=/\[default\]|默认|\*/.test(m);d={key:x,did:x,displayName:S?S[1]:"",publicKey:"",isDefault:D,createdAt:"",method:(x.split(":")[1]||"chainless").trim(),raw:null,_idx:u.length};continue}if(d){const x=m.match(/created\s*[::]\s*(.+)$/i);x&&(d.createdAt=x[1].trim())}}return d&&u.push(d),u}function Ne(n){const o=G(n);if(!o||typeof o!="object"||Array.isArray(o))return null;const u=E(o);return u?(u.document=o.document||null,u):null}function $e(n){const o=G(n);if(o&&typeof o=="object"&&o.signature)return{did:o.did||"",message:o.message||"",signature:String(o.signature)};const d=(n||"").match(/Signature[::]\s*([a-f0-9]+)/i);return d?{did:"",message:"",signature:d[1]}:null}const Ae={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},Oe={key:1,style:{"text-align":"center",padding:"60px"}},je={key:0,style:{color:"#e0e0e0","font-family":"monospace","font-size":"12px"}},Me={key:1,style:{color:"var(--text-primary)"}},Te={key:3,style:{color:"var(--text-secondary)","font-size":"12px"}},Be={key:0,style:{"margin-top":"12px"}},Ke={style:{"font-family":"monospace",color:"#ccc","word-break":"break-all"}},Pe={style:{"font-family":"monospace",color:"#888","font-size":"11px","word-break":"break-all"}},Je={style:{"margin-top":"16px",display:"flex",gap:"8px","flex-wrap":"wrap"}},Ue={key:0,style:{"margin-top":"16px"}},Fe={style:{"white-space":"pre-wrap","word-break":"break-all",color:"#52c41a","font-size":"11px",background:"var(--bg-base)",padding:"12px","border-radius":"6px",border:"1px solid var(--border-color)","max-height":"320px",overflow:"auto"}},Re={key:0,style:{"margin-top":"12px"}},We={style:{"white-space":"pre-wrap","word-break":"break-all",color:"#52c41a","font-size":"11px",background:"var(--bg-base)",padding:"12px","border-radius":"6px",border:"1px solid var(--border-color)"}},Le={__name:"DID",setup(n){const o=ge(),u=c(!1),d=c(!1),C=c(!1),m=c(!1),h=c(""),x=c(""),S=c(!1),D=c([]),T=c(!1),F=c(!1),R=c(!1),B=c(""),y=c(null),A=c(""),W=c(""),O=c(""),j=c(null),ee=[{title:"DID",key:"did",dataIndex:"did",ellipsis:!0},{title:"名称",key:"displayName",dataIndex:"displayName",width:"160px"},{title:"方法",key:"method",dataIndex:"method",width:"110px"},{title:"创建时间",key:"createdAt",dataIndex:"createdAt",width:"180px"},{title:"默认",key:"isDefault",width:"90px"},{title:"操作",key:"action",width:"280px"}],Z=Y(()=>{const l=D.value.find(s=>s.isDefault);if(!l)return"未设置";const e=l.did;return e.length>24?e.slice(0,12)+"..."+e.slice(-8):e}),te=Y(()=>{const l=new Set(D.value.map(e=>e.method).filter(Boolean));return l.size===0?"无":l.size===1?[...l][0]:[...l].join(", ")});async function M(){d.value=!0;try{const{output:l}=await o.execute("did list --json",15e3);D.value=Ce(l)}catch(l){f.error("加载 DID 列表失败: "+l.message),D.value=[]}finally{d.value=!1}}async function ae(){C.value=!0;try{const l=B.value.trim(),e=l?`did create --name "${l.replace(/"/g,'\\"')}" --json`:"did create --json",{output:s}=await o.execute(e,2e4);/error|失败/i.test(s)&&!s.includes('"did"')?f.error("创建失败: "+s.slice(0,120)):(f.success("DID 身份已创建"),T.value=!1,B.value="",await M())}catch(l){f.error("创建失败: "+l.message)}finally{C.value=!1}}async function le(l){h.value=l.did;try{const{output:e,exitCode:s}=await o.execute(`did set-default ${l.did}`,15e3);s!==0||/error|not found|失败/i.test(e)?f.error("设置失败: "+e.slice(0,120)):(f.success("已设为默认身份"),await M())}catch(e){f.error("设置失败: "+e.message)}finally{h.value=""}}async function oe(l){x.value=l.did;try{const{output:e,exitCode:s}=await o.execute(`did delete ${l.did} --force`,15e3);s!==0||/error|not found|失败/i.test(e)?f.error("删除失败: "+e.slice(0,120)):(f.success("身份已删除"),await M())}catch(e){f.error("删除失败: "+e.message)}finally{x.value=""}}async function ne(l){if(y.value={...l},A.value="",F.value=!0,!l.publicKey)try{const{output:e}=await o.execute(`did show ${l.did} --json`,1e4),s=Ne(e);s&&(y.value={...y.value,...s})}catch{}}async function se(l){S.value=!0;try{const{output:e}=await o.execute(`did resolve ${l.did}`,1e4);try{A.value=JSON.stringify(JSON.parse(e.trim()),null,2)}catch{A.value=e.trim()}}catch(e){f.error("加载 DID Document 失败: "+e.message)}finally{S.value=!1}}function ie(l){W.value=l.did,O.value="",j.value=null,R.value=!0}async function re(){if(!O.value.trim()){f.warning("请输入要签名的消息");return}m.value=!0,j.value=null;try{const e=`did sign "${O.value.replace(/"/g,'\\"')}" --did ${W.value} --json`,{output:s,exitCode:K}=await o.execute(e,15e3),w=$e(s);w&&w.signature?(j.value=w,f.success("签名成功")):f.error("签名失败: "+(s||`exit ${K}`).slice(0,120))}catch(l){f.error("签名失败: "+l.message)}finally{m.value=!1}}return ze(()=>{M()}),(l,e)=>{const s=r("a-button"),K=r("a-space"),w=r("a-statistic"),P=r("a-card"),J=r("a-col"),ue=r("a-row"),de=r("a-alert"),ce=r("a-spin"),U=r("a-tag"),pe=r("a-popconfirm"),fe=r("a-empty"),me=r("a-table"),ye=r("a-input"),L=r("a-form-item"),V=r("a-tooltip"),Q=r("a-form"),H=r("a-modal"),N=r("a-descriptions-item"),ve=r("a-descriptions"),_e=r("a-textarea");return v(),I("div",null,[b("div",Ae,[e[9]||(e[9]=b("div",null,[b("h2",{class:"page-title"},"DID 身份管理"),b("p",{class:"page-sub"},"去中心化身份 / 密钥 / 签名验证")],-1)),t(K,null,{default:a(()=>[t(s,{loading:d.value,onClick:M},{icon:a(()=>[t(z(be))]),default:a(()=>[e[7]||(e[7]=p(" 刷新 ",-1))]),_:1},8,["loading"]),t(s,{type:"primary",onClick:e[0]||(e[0]=i=>T.value=!0)},{icon:a(()=>[t(z(ke))]),default:a(()=>[e[8]||(e[8]=p(" 创建身份 ",-1))]),_:1})]),_:1})]),t(ue,{gutter:[16,16],style:{"margin-bottom":"20px"}},{default:a(()=>[t(J,{xs:24,sm:12,lg:6},{default:a(()=>[t(P,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[t(w,{title:"身份数量",value:D.value.length,"value-style":{color:"#1677ff",fontSize:"20px"}},{prefix:a(()=>[t(z(De))]),_:1},8,["value"])]),_:1})]),_:1}),t(J,{xs:24,sm:12,lg:6},{default:a(()=>[t(P,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[t(w,{title:"默认身份",value:Z.value,"value-style":{color:Z.value!=="未设置"?"#52c41a":"#888",fontSize:"13px",fontFamily:"monospace"}},null,8,["value","value-style"])]),_:1})]),_:1}),t(J,{xs:24,sm:12,lg:6},{default:a(()=>[t(P,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[t(w,{title:"DID 方法",value:te.value,"value-style":{color:"#722ed1",fontSize:"14px"}},null,8,["value"])]),_:1})]),_:1}),t(J,{xs:24,sm:12,lg:6},{default:a(()=>[t(P,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[t(w,{title:"可签名",value:D.value.length>0?"是":"否","value-style":{color:D.value.length>0?"#52c41a":"#ff4d4f",fontSize:"20px"}},{prefix:a(()=>[t(z(he))]),_:1},8,["value","value-style"])]),_:1})]),_:1})]),_:1}),u.value?k("",!0):(v(),$(de,{key:0,message:"仅 Web 模式",description:"助记词备份/恢复 与 DHT 网络发布 仅在桌面端可用,本页面禁用相关按钮。所有创建/签名/删除操作通过 CLI 转发执行。",type:"info","show-icon":"",closable:"",style:{"margin-bottom":"16px"}})),d.value?(v(),I("div",Oe,[t(ce,{size:"large"})])):(v(),$(me,{key:2,columns:ee,"data-source":D.value,pagination:{pageSize:20,showTotal:i=>`共 ${i} 条`},size:"small",style:{background:"var(--bg-card)"},"row-class-name":()=>"did-row"},{bodyCell:a(({column:i,record:_})=>[i.key==="did"?(v(),I("span",je,g(_.did),1)):k("",!0),i.key==="displayName"?(v(),I("span",Me,g(_.displayName||"-"),1)):k("",!0),i.key==="method"?(v(),$(U,{key:2,color:"blue"},{default:a(()=>[p(g(_.method),1)]),_:2},1024)):k("",!0),i.key==="createdAt"?(v(),I("span",Te,g(_.createdAt||"-"),1)):k("",!0),i.key==="isDefault"?(v(),$(U,{key:4,color:_.isDefault?"green":"default"},{default:a(()=>[p(g(_.isDefault?"默认":"-"),1)]),_:2},1032,["color"])):k("",!0),i.key==="action"?(v(),$(K,{key:5,size:"small"},{default:a(()=>[t(s,{size:"small",type:"link",onClick:q=>ne(_)},{default:a(()=>[...e[10]||(e[10]=[p(" 详情 ",-1)])]),_:1},8,["onClick"]),t(s,{size:"small",type:"link",onClick:q=>ie(_)},{default:a(()=>[...e[11]||(e[11]=[p(" 签名 ",-1)])]),_:1},8,["onClick"]),_.isDefault?k("",!0):(v(),$(s,{key:0,size:"small",type:"link",loading:h.value===_.did,onClick:q=>le(_)},{default:a(()=>[...e[12]||(e[12]=[p(" 设为默认 ",-1)])]),_:1},8,["loading","onClick"])),t(pe,{title:"确定删除该 DID 身份吗?删除后私钥将无法找回。","ok-text":"删除","ok-type":"danger","cancel-text":"取消",onConfirm:q=>oe(_)},{default:a(()=>[t(s,{size:"small",type:"link",danger:"",loading:x.value===_.did},{default:a(()=>[...e[13]||(e[13]=[p(" 删除 ",-1)])]),_:1},8,["loading"])]),_:2},1032,["onConfirm"])]),_:2},1024)):k("",!0)]),emptyText:a(()=>[t(fe,{description:"暂无 DID 身份,点击「创建身份」添加"})]),_:1},8,["data-source","pagination"])),t(H,{open:T.value,"onUpdate:open":e[2]||(e[2]=i=>T.value=i),title:"创建 DID 身份","confirm-loading":C.value,onOk:ae,"ok-text":"创建","cancel-text":"取消"},{default:a(()=>[t(Q,{"label-col":{span:6},"wrapper-col":{span:18},style:{"margin-top":"16px"}},{default:a(()=>[t(L,{label:"显示名称"},{default:a(()=>[t(ye,{value:B.value,"onUpdate:value":e[1]||(e[1]=i=>B.value=i),placeholder:"可选 — 用于识别身份","allow-clear":""},null,8,["value"])]),_:1}),t(L,{"wrapper-col":{offset:6,span:18}},{default:a(()=>[t(V,{title:"桌面应用专属:BIP39 助记词派生密钥"},{default:a(()=>[t(s,{disabled:"",style:{"margin-right":"8px"}},{icon:a(()=>[t(z(X))]),default:a(()=>[e[14]||(e[14]=p(" 从助记词导入 ",-1))]),_:1})]),_:1}),e[15]||(e[15]=b("span",{style:{color:"var(--text-muted)","font-size":"11px"}},"需桌面端",-1))]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"]),t(H,{open:F.value,"onUpdate:open":e[4]||(e[4]=i=>F.value=i),title:`身份详情:${y.value?.displayName||y.value?.did?.slice(0,24)||""}`,width:720,footer:null},{default:a(()=>[y.value?(v(),I("div",Be,[t(ve,{column:1,bordered:"",size:"small"},{default:a(()=>[t(N,{label:"DID"},{default:a(()=>[b("span",Ke,g(y.value.did),1)]),_:1}),t(N,{label:"名称"},{default:a(()=>[p(g(y.value.displayName||"-"),1)]),_:1}),t(N,{label:"方法"},{default:a(()=>[t(U,{color:"blue"},{default:a(()=>[p(g(y.value.method),1)]),_:1})]),_:1}),t(N,{label:"默认"},{default:a(()=>[t(U,{color:y.value.isDefault?"green":"default"},{default:a(()=>[p(g(y.value.isDefault?"是":"否"),1)]),_:1},8,["color"])]),_:1}),t(N,{label:"创建时间"},{default:a(()=>[p(g(y.value.createdAt||"-"),1)]),_:1}),t(N,{label:"公钥(hex)"},{default:a(()=>[b("span",Pe,g(y.value.publicKey||"加载中..."),1)]),_:1})]),_:1}),b("div",Je,[t(V,{title:"桌面应用专属:导出 BIP39 助记词以备份"},{default:a(()=>[t(s,{disabled:""},{icon:a(()=>[t(z(X))]),default:a(()=>[e[16]||(e[16]=p(" 导出助记词 ",-1))]),_:1})]),_:1}),t(V,{title:"桌面应用专属:发布到 P2P DHT 网络以供他人解析"},{default:a(()=>[t(s,{disabled:""},{icon:a(()=>[t(z(we))]),default:a(()=>[e[17]||(e[17]=p(" 发布到 DHT ",-1))]),_:1})]),_:1}),t(s,{loading:S.value,onClick:e[3]||(e[3]=i=>se(y.value))},{icon:a(()=>[t(z(Ie))]),default:a(()=>[e[18]||(e[18]=p(" 查看 DID Document ",-1))]),_:1},8,["loading"])]),A.value?(v(),I("div",Ue,[e[19]||(e[19]=b("p",{style:{color:"var(--text-secondary)","margin-bottom":"6px"}},"DID Document (W3C):",-1)),b("pre",Fe,g(A.value),1)])):k("",!0)])):k("",!0)]),_:1},8,["open","title"]),t(H,{open:R.value,"onUpdate:open":e[6]||(e[6]=i=>R.value=i),title:`签名消息:${W.value?.slice(0,28)||"默认身份"}...`,"confirm-loading":m.value,onOk:re,"ok-text":"签名","cancel-text":"取消"},{default:a(()=>[t(Q,{"label-col":{span:4},"wrapper-col":{span:20},style:{"margin-top":"16px"}},{default:a(()=>[t(L,{label:"消息",required:""},{default:a(()=>[t(_e,{value:O.value,"onUpdate:value":e[5]||(e[5]=i=>O.value=i),placeholder:"请输入要签名的消息","auto-size":{minRows:3,maxRows:8}},null,8,["value"])]),_:1})]),_:1}),j.value?(v(),I("div",Re,[e[20]||(e[20]=b("p",{style:{color:"var(--text-secondary)","margin-bottom":"6px"}},"签名结果(hex):",-1)),b("pre",We,g(j.value.signature),1)])):k("",!0)]),_:1},8,["open","title","confirm-loading"])])}}},at=xe(Le,[["__scopeId","data-v-f2137559"]]);export{at as default};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{k as le,r as O,l as oe,M as ae,F as p,D as l,I as o,u as r,c as t,x as s,m as A,G as
|
|
1
|
+
import{k as le,r as O,l as oe,M as ae,F as p,D as l,I as o,u as r,c as t,x as s,m as A,G as J,j as S,q as x,B as ne,v as i,J as m,N as q,H as P,L as j}from"./vendor-BVetwVfk.js";import{u as H}from"./ws-Bv7YH0VB.js";import{u as re}from"./chat-CVn-r3oV.js";import{_ as ie}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{y as ue,F as de,z as K,b as Q,M as X,H as ve,J as ce,a as Y,N as pe,c as me}from"./icons-DbKJDD5_.js";function fe(){return{samples:0,compressedSamples:0,hitRate:0,totalSavedTokens:0,averageSavedTokens:0,totalOriginalTokens:0,totalCompressedTokens:0,netSavingsRate:0,variantDistribution:{},strategyDistribution:[],providerDistribution:[],modelDistribution:[]}}const ye=le("dashboard",()=>{const B=O(!1),N=O(!1),d=O({wsStatus:"disconnected",activeLlm:null,activeModel:null,skillCount:0,sessionCount:0,providerCount:0,appRunning:!1,setupDone:!1,edition:"",mcpCount:null,noteCount:null}),E=O(""),y=O(fe()),v=O({windowPreset:"all",provider:"",model:""});let _=null;function F(n=H()){_||(_=n.onRuntimeEvent(c=>{c.type==="compression:summary"?M(c.payload?.summary||{}):c.type==="session:start"?d.value.sessionCount=(d.value.sessionCount||0)+1:c.type==="session:end"&&(d.value.sessionCount=Math.max(0,(d.value.sessionCount||0)-1))}))}function I(){_&&(_(),_=null)}function M(n){y.value={...y.value,...n||{}}}function U(n){return n==="1h"?3600*1e3:n==="24h"?1440*60*1e3:n==="7d"?10080*60*1e3:null}function R(n){d.value.appRunning=n.includes("Desktop app running"),d.value.setupDone=n.includes("Setup completed");const c=n.match(/Edition:\s+(\S+)/i);c&&(d.value.edition=c[1]);const b=n.match(/LLM:\s+(\S+)\s+\(([^)]+)\)/i);if(b)d.value.activeLlm=b[1],d.value.activeModel=b[2];else{const k=n.match(/LLM:\s+(\S+)/i);k&&(d.value.activeLlm=k[1])}}async function f(){const n=H();F(n),N.value=!0;const c={type:"compression-stats",windowMs:U(v.value.windowPreset)};v.value.provider&&(c.provider=v.value.provider),v.value.model&&(c.model=v.value.model);try{const b=await n.sendRaw(c,1e4);M(b.summary||{})}catch{}finally{N.value=!1}}async function g(){const n=H();F(n),B.value=!0,d.value.wsStatus=n.status,E.value="";try{const[c,b]=await Promise.allSettled([n.execute("status",15e3),n.listSessions()]);if(c.status==="fulfilled"){const k=c.value.output;E.value=k.split(`
|
|
2
2
|
`).slice(0,20).join(`
|
|
3
|
-
`),R(k)}b.status==="fulfilled"&&(d.value.sessionCount=b.value.length),Promise.allSettled([n.execute("skill sources",15e3),n.execute("llm providers",15e3)]).then(([k,$])=>{if(k.status==="fulfilled"){const z=k.value.output.match(/(\d+)\s*(?:skills|技能)/i);z&&(d.value.skillCount=parseInt(z[1],10))}if($.status==="fulfilled"){const V=$.value.output.match(/active[:\s]+(\S+)/i);V&&!d.value.activeLlm&&(d.value.activeLlm=V[1])}}),n.execute("mcp servers",1e4).then(({output:k})=>{const $=(k.match(/^[a-z]/gm)||[]).length;d.value.mcpCount=$}).catch(()=>{d.value.mcpCount=0}),await f()}catch{}finally{B.value=!1}}return{loading:B,compressionLoading:E,stats:d,statusLog:F,compression:y,telemetryFilters:v,ensureRuntimeSubscription:N,stopRuntimeSubscription:I,refresh:g,refreshCompression:f,applyCompressionSummary:M,toWindowMs:U}}),_e={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"20px"}},ge={class:"page-sub"},be={style:{display:"flex","align-items":"center",gap:"12px","flex-wrap":"wrap"}},ke={style:{color:"#91caff","font-weight":"600"}},we={style:{color:"#4a6fa5","font-size":"11px","font-family":"monospace"}},Ce={class:"stat-header"},xe={class:"stat-sub"},Se={class:"stat-header"},he={class:"stat-value",style:{color:"#91caff","font-size":"15px",overflow:"hidden","text-overflow":"ellipsis","white-space":"nowrap"}},Re={class:"stat-sub",style:{overflow:"hidden","text-overflow":"ellipsis","white-space":"nowrap"}},$e={class:"stat-header"},ze={class:"stat-value",style:{color:"#1677ff"}},De={class:"stat-header"},Le={class:"stat-value",style:{color:"#c084fc"}},Me={class:"stat-header"},Te={class:"stat-sub"},Oe={class:"stat-header"},Pe={class:"stat-value",style:{color:"#13c2c2"}},je={class:"stat-header"},Ee={class:"stat-value",style:{color:"#faad14"}},Fe={class:"status-log"},Ne={class:"telemetry-filter"},Ie={class:"telemetry-filter"},Ae={class:"telemetry-filter"},Be={class:"telemetry-card"},Ue={class:"telemetry-value"},Ve={class:"telemetry-sub"},We={class:"telemetry-card"},Ge={class:"telemetry-value"},He={class:"telemetry-sub"},qe={class:"telemetry-card"},Je={class:"telemetry-value"},Ke={class:"telemetry-sub"},Qe={class:"telemetry-section"},Xe={key:0,class:"telemetry-empty"},Ye={key:1,class:"telemetry-list"},Ze={class:"telemetry-section"},et={key:0,class:"telemetry-empty"},tt={key:1,class:"telemetry-list"},st={class:"telemetry-section"},lt={key:0,class:"telemetry-empty"},ot={key:1,class:"telemetry-list"},at={class:"telemetry-section"},nt={key:0,class:"telemetry-empty"},rt={key:1,class:"telemetry-list"},it={style:{color:"#91caff"}},ut={style:{color:"var(--text-muted)","font-family":"monospace","font-size":"11px"}},dt={style:{color:"var(--text-secondary)","font-family":"monospace","font-size":"12px"}},vt={style:{color:"var(--text-muted)"}},ct={__name:"Dashboard",setup(B){const E=ne(),d=W(),F=re(),y=ye(),v=window.__CC_CONFIG__||{},_=S(()=>v.mode==="project"),N="v5.0.3.1",I=S(()=>d.status),M=S(()=>y.loading),U=S(()=>y.statusLog),R=S(()=>y.telemetryFilters),f=S(()=>y.compression),g=S(()=>y.stats),n=S(()=>Object.entries(f.value.variantDistribution||{})),c=S(()=>f.value.providerDistribution||[]),b=S(()=>f.value.modelDistribution||[]);async function k(){await y.refresh()}async function $(){await y.refreshCompression()}function z(w){return`${((w||0)*100).toFixed(1)}%`}async function V(){await F.createSession("agent"),E.push("/chat")}return oe(()=>{y.ensureRuntimeSubscription(d),setTimeout(k,300)}),ae(()=>{y.stopRuntimeSubscription()}),(w,e)=>{const D=x("a-button"),G=x("a-tag"),C=x("a-card"),Z=x("a-badge"),u=x("a-col"),h=x("a-row"),ee=x("a-space"),L=x("a-select-option"),H=x("a-select"),T=x("a-descriptions-item"),te=x("a-descriptions");return i(),p("div",null,[l("div",_e,[l("div",null,[e[13]||(e[13]=l("h2",{class:"page-title"},"仪表板",-1)),l("p",ge,o(_.value?`项目「${r(v).projectName||"未命名"}」运行概览`:"ChainlessChain 全局运行概览"),1)]),t(D,{type:"primary",ghost:"",loading:M.value,onClick:k},{icon:s(()=>[t(r(ue))]),default:s(()=>[e[14]||(e[14]=m(" 刷新 ",-1))]),_:1},8,["loading"])]),_.value?(i(),A(C,{key:0,style:{background:"rgba(22,119,255,.08)","border-color":"rgba(22,119,255,.25)","margin-bottom":"16px"},size:"small"},{default:s(()=>[l("div",be,[t(r(de),{style:{color:"#1677ff","font-size":"18px"}}),l("div",null,[l("div",ke,o(r(v).projectName||"项目"),1),l("div",we,o(r(v).projectRoot),1)]),t(G,{color:"blue",style:{"margin-left":"auto"}},{default:s(()=>[...e[15]||(e[15]=[m("项目面板",-1)])]),_:1})])]),_:1})):q("",!0),t(h,{gutter:[12,12],style:{"margin-bottom":"16px"}},{default:s(()=>[t(u,{xs:24,sm:12,lg:6},{default:s(()=>[t(C,{class:"stat-card gateway-card",size:"small"},{default:s(()=>[l("div",Ce,[e[16]||(e[16]=l("span",{class:"stat-label"},"WebSocket Gateway",-1)),t(Z,{status:I.value==="connected"?"success":"error"},null,8,["status"])]),l("div",{class:"stat-value",style:J({color:I.value==="connected"?"#52c41a":"#888"})},o(I.value==="connected"?"运行中":"未连接"),5),l("div",xe,"端口 "+o(r(v).wsPort||18800)+" · "+o(r(v).wsHost||"127.0.0.1"),1)]),_:1})]),_:1}),t(u,{xs:24,sm:12,lg:6},{default:s(()=>[t(C,{class:"stat-card",size:"small"},{default:s(()=>[l("div",Se,[e[17]||(e[17]=l("span",{class:"stat-label"},"当前 LLM",-1)),t(r(K),{style:{color:"#1677ff"}})]),l("div",he,o(g.value.activeLlm||"未配置"),1),l("div",Re,o(g.value.activeModel||"—"),1)]),_:1})]),_:1}),t(u,{xs:24,sm:12,lg:6},{default:s(()=>[t(C,{class:"stat-card",size:"small",style:{cursor:"pointer"},onClick:e[0]||(e[0]=a=>w.$router.push("/skills"))},{default:s(()=>[l("div",$e,[e[18]||(e[18]=l("span",{class:"stat-label"},"可用技能",-1)),t(r(Q),{style:{color:"#1677ff"}})]),l("div",ze,o(g.value.skillCount||"—"),1),e[19]||(e[19]=l("div",{class:"stat-sub"},"点击管理技能",-1))]),_:1})]),_:1}),t(u,{xs:24,sm:12,lg:6},{default:s(()=>[t(C,{class:"stat-card",size:"small",style:{cursor:"pointer"},onClick:e[1]||(e[1]=a=>w.$router.push("/chat"))},{default:s(()=>[l("div",De,[e[20]||(e[20]=l("span",{class:"stat-label"},"AI 会话",-1)),t(r(X),{style:{color:"#722ed1"}})]),l("div",Le,o(g.value.sessionCount),1),e[21]||(e[21]=l("div",{class:"stat-sub"},"点击进入对话",-1))]),_:1})]),_:1})]),_:1}),t(h,{gutter:[12,12],style:{"margin-bottom":"16px"}},{default:s(()=>[t(u,{xs:24,sm:8},{default:s(()=>[t(C,{class:"stat-card",size:"small"},{default:s(()=>[l("div",Me,[e[22]||(e[22]=l("span",{class:"stat-label"},"应用状态",-1)),t(r(ve),{style:J({color:g.value.appRunning?"#52c41a":"#888"})},null,8,["style"])]),l("div",{class:"stat-value",style:J({color:g.value.appRunning?"#52c41a":"#888",fontSize:"15px"})},o(g.value.appRunning?"运行中":g.value.setupDone?"已初始化":"未启动"),5),l("div",Te,o(g.value.edition||"Community")+" Edition",1)]),_:1})]),_:1}),t(u,{xs:24,sm:8},{default:s(()=>[t(C,{class:"stat-card",size:"small",style:{cursor:"pointer"},onClick:e[2]||(e[2]=a=>w.$router.push("/mcp"))},{default:s(()=>[l("div",Oe,[e[23]||(e[23]=l("span",{class:"stat-label"},"MCP 工具",-1)),t(r(ce),{style:{color:"#13c2c2"}})]),l("div",Pe,o(g.value.mcpCount??"—"),1),e[24]||(e[24]=l("div",{class:"stat-sub"},"已挂载扩展",-1))]),_:1})]),_:1}),t(u,{xs:24,sm:8},{default:s(()=>[t(C,{class:"stat-card",size:"small",style:{cursor:"pointer"},onClick:e[3]||(e[3]=a=>w.$router.push("/notes"))},{default:s(()=>[l("div",je,[e[25]||(e[25]=l("span",{class:"stat-label"},"知识库笔记",-1)),t(r(Y),{style:{color:"#faad14"}})]),l("div",Ee,o(g.value.noteCount??"—"),1),e[26]||(e[26]=l("div",{class:"stat-sub"},"点击管理笔记",-1))]),_:1})]),_:1})]),_:1}),t(h,{gutter:[16,16]},{default:s(()=>[t(u,{xs:24,lg:10},{default:s(()=>[t(C,{title:"快速操作",style:{background:"var(--bg-card)","border-color":"var(--border-color)",height:"100%"}},{default:s(()=>[t(ee,{direction:"vertical",style:{width:"100%"},size:"middle"},{default:s(()=>[t(D,{type:"primary",block:"",onClick:e[4]||(e[4]=a=>w.$router.push("/chat"))},{icon:s(()=>[t(r(X))]),default:s(()=>[m(" "+o(_.value?"进入项目 Chat":"新建 AI 对话"),1)]),_:1}),t(D,{block:"",onClick:V,style:{background:"rgba(114,46,209,.12)","border-color":"#722ed1",color:"#722ed1"}},{icon:s(()=>[t(r(K))]),default:s(()=>[e[27]||(e[27]=m(" 启动 Agent 模式 ",-1))]),_:1}),t(h,{gutter:8},{default:s(()=>[t(u,{span:12},{default:s(()=>[t(D,{block:"",onClick:e[5]||(e[5]=a=>w.$router.push("/services")),style:{background:"var(--bg-card-hover)","border-color":"var(--border-color)"}},{icon:s(()=>[t(r(pe))]),default:s(()=>[e[28]||(e[28]=m(" 服务管理 ",-1))]),_:1})]),_:1}),t(u,{span:12},{default:s(()=>[t(D,{block:"",onClick:e[6]||(e[6]=a=>w.$router.push("/logs")),style:{background:"var(--bg-card-hover)","border-color":"var(--border-color)"}},{icon:s(()=>[t(r(Y))]),default:s(()=>[e[29]||(e[29]=m(" 查看日志 ",-1))]),_:1})]),_:1})]),_:1}),t(h,{gutter:8},{default:s(()=>[t(u,{span:12},{default:s(()=>[t(D,{block:"",onClick:e[7]||(e[7]=a=>w.$router.push("/skills")),style:{background:"var(--bg-card-hover)","border-color":"var(--border-color)"}},{icon:s(()=>[t(r(Q))]),default:s(()=>[e[30]||(e[30]=m(" 技能管理 ",-1))]),_:1})]),_:1}),t(u,{span:12},{default:s(()=>[t(D,{block:"",onClick:e[8]||(e[8]=a=>w.$router.push("/providers")),style:{background:"var(--bg-card-hover)","border-color":"var(--border-color)"}},{icon:s(()=>[t(r(me))]),default:s(()=>[e[31]||(e[31]=m(" LLM 配置 ",-1))]),_:1})]),_:1})]),_:1})]),_:1})]),_:1})]),_:1}),t(u,{xs:24,lg:14},{default:s(()=>[t(C,{title:"最近状态",style:{background:"var(--bg-card)","border-color":"var(--border-color)"},loading:M.value},{extra:s(()=>[t(D,{type:"link",size:"small",onClick:e[9]||(e[9]=a=>w.$router.push("/logs"))},{default:s(()=>[...e[32]||(e[32]=[m("查看更多",-1)])]),_:1})]),default:s(()=>[l("pre",Fe,o(U.value||"点击刷新加载系统状态..."),1)]),_:1},8,["loading"])]),_:1})]),_:1}),t(C,{title:"压缩策略观测",style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-top":"16px"},loading:M.value},{default:s(()=>[t(h,{gutter:[12,12],style:{"margin-bottom":"12px"}},{default:s(()=>[t(u,{xs:24,md:8},{default:s(()=>[l("div",Ne,[e[37]||(e[37]=l("div",{class:"telemetry-filter-label"},"时间窗口",-1)),t(H,{value:R.value.windowPreset,"onUpdate:value":e[10]||(e[10]=a=>R.value.windowPreset=a),style:{width:"100%"},onChange:$},{default:s(()=>[t(L,{value:"all"},{default:s(()=>[...e[33]||(e[33]=[m("全部样本",-1)])]),_:1}),t(L,{value:"1h"},{default:s(()=>[...e[34]||(e[34]=[m("近 1 小时",-1)])]),_:1}),t(L,{value:"24h"},{default:s(()=>[...e[35]||(e[35]=[m("近 24 小时",-1)])]),_:1}),t(L,{value:"7d"},{default:s(()=>[...e[36]||(e[36]=[m("近 7 天",-1)])]),_:1})]),_:1},8,["value"])])]),_:1}),t(u,{xs:24,md:8},{default:s(()=>[l("div",Ie,[e[39]||(e[39]=l("div",{class:"telemetry-filter-label"},"Provider 切片",-1)),t(H,{value:R.value.provider,"onUpdate:value":e[11]||(e[11]=a=>R.value.provider=a),style:{width:"100%"},onChange:$},{default:s(()=>[t(L,{value:""},{default:s(()=>[...e[38]||(e[38]=[m("全部 Provider",-1)])]),_:1}),(i(!0),p(P,null,j(c.value,a=>(i(),A(L,{key:a.key,value:a.key},{default:s(()=>[m(o(a.key),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])])]),_:1}),t(u,{xs:24,md:8},{default:s(()=>[l("div",Ae,[e[41]||(e[41]=l("div",{class:"telemetry-filter-label"},"Model 切片",-1)),t(H,{value:R.value.model,"onUpdate:value":e[12]||(e[12]=a=>R.value.model=a),style:{width:"100%"},onChange:$},{default:s(()=>[t(L,{value:""},{default:s(()=>[...e[40]||(e[40]=[m("全部 Model",-1)])]),_:1}),(i(!0),p(P,null,j(b.value,a=>(i(),A(L,{key:a.key,value:a.key},{default:s(()=>[m(o(a.key),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])])]),_:1})]),_:1}),t(h,{gutter:[12,12]},{default:s(()=>[t(u,{xs:24,sm:8},{default:s(()=>[l("div",Be,[e[42]||(e[42]=l("div",{class:"telemetry-label"},"压缩命中率",-1)),l("div",Ue,o(z(f.value.hitRate)),1),l("div",Ve,o(f.value.compressedSamples)+" / "+o(f.value.samples)+" 次压缩产生了有效节省 ",1)])]),_:1}),t(u,{xs:24,sm:8},{default:s(()=>[l("div",We,[e[43]||(e[43]=l("div",{class:"telemetry-label"},"累计节省 Token",-1)),l("div",Ge,o(f.value.totalSavedTokens),1),l("div",He,"平均每次 "+o(f.value.averageSavedTokens)+" Token",1)])]),_:1}),t(u,{xs:24,sm:8},{default:s(()=>[l("div",qe,[e[44]||(e[44]=l("div",{class:"telemetry-label"},"净节省率",-1)),l("div",Je,o(z(f.value.netSavingsRate)),1),l("div",Ke," 原始 "+o(f.value.totalOriginalTokens)+" -> 压缩后 "+o(f.value.totalCompressedTokens),1)])]),_:1})]),_:1}),t(h,{gutter:[16,16],style:{"margin-top":"12px"}},{default:s(()=>[t(u,{xs:24,lg:12},{default:s(()=>[l("div",Qe,[e[45]||(e[45]=l("div",{class:"telemetry-section-title"},"策略命中分布",-1)),f.value.strategyDistribution.length===0?(i(),p("div",Xe,"暂无压缩样本")):(i(),p("div",Ye,[(i(!0),p(P,null,j(f.value.strategyDistribution.slice(0,6),a=>(i(),p("div",{key:a.strategy,class:"telemetry-row"},[l("span",null,o(a.strategy),1),l("span",null,o(a.hits)+" 次 · "+o(z(a.hitRate)),1)]))),128))]))])]),_:1}),t(u,{xs:24,lg:12},{default:s(()=>[l("div",Ze,[e[46]||(e[46]=l("div",{class:"telemetry-section-title"},"变体分布",-1)),n.value.length===0?(i(),p("div",et,"暂无变体数据")):(i(),p("div",tt,[(i(!0),p(P,null,j(n.value,([a,se])=>(i(),p("div",{key:a,class:"telemetry-row"},[l("span",null,o(a),1),l("span",null,o(se)+" 次",1)]))),128))]))])]),_:1})]),_:1}),t(h,{gutter:[16,16],style:{"margin-top":"12px"}},{default:s(()=>[t(u,{xs:24,lg:12},{default:s(()=>[l("div",st,[e[47]||(e[47]=l("div",{class:"telemetry-section-title"},"Provider 切片",-1)),c.value.length===0?(i(),p("div",lt,"暂无 Provider 数据")):(i(),p("div",ot,[(i(!0),p(P,null,j(c.value.slice(0,6),a=>(i(),p("div",{key:a.key,class:"telemetry-row"},[l("span",null,o(a.key),1),l("span",null,o(a.samples)+" 次 · "+o(z(a.hitRate)),1)]))),128))]))])]),_:1}),t(u,{xs:24,lg:12},{default:s(()=>[l("div",at,[e[48]||(e[48]=l("div",{class:"telemetry-section-title"},"Model 切片",-1)),b.value.length===0?(i(),p("div",nt,"暂无 Model 数据")):(i(),p("div",rt,[(i(!0),p(P,null,j(b.value.slice(0,6),a=>(i(),p("div",{key:a.key,class:"telemetry-row"},[l("span",null,o(a.key),1),l("span",null,o(a.samples)+" 次 · "+o(a.savedTokens)+" saved",1)]))),128))]))])]),_:1})]),_:1})]),_:1},8,["loading"]),t(C,{title:"运行信息",style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-top":"16px"}},{default:s(()=>[t(te,{column:{xs:1,sm:2,lg:3},size:"small"},{default:s(()=>[t(T,{label:"面板模式"},{default:s(()=>[t(G,{color:_.value?"blue":"purple"},{default:s(()=>[m(o(_.value?"项目级":"全局"),1)]),_:1},8,["color"])]),_:1}),_.value?(i(),A(T,{key:0,label:"项目名称"},{default:s(()=>[l("span",it,o(r(v).projectName||"—"),1)]),_:1})):q("",!0),_.value?(i(),A(T,{key:1,label:"项目路径"},{default:s(()=>[l("span",ut,o(r(v).projectRoot),1)]),_:1})):q("",!0),t(T,{label:"WebSocket"},{default:s(()=>[l("span",dt," ws://"+o(r(v).wsHost||"127.0.0.1")+":"+o(r(v).wsPort||18800),1)]),_:1}),t(T,{label:"认证"},{default:s(()=>[t(G,{color:r(v).wsToken?"green":"default",style:{"font-size":"11px"}},{default:s(()=>[m(o(r(v).wsToken?"已启用":"未启用"),1)]),_:1},8,["color"])]),_:1}),t(T,{label:"版本"},{default:s(()=>[l("span",vt,o(r(N)),1)]),_:1})]),_:1})]),_:1})])}}},gt=ie(ct,[["__scopeId","data-v-ab1b4e86"]]);export{gt as default};
|
|
3
|
+
`),R(k)}b.status==="fulfilled"&&(d.value.sessionCount=b.value.length),Promise.allSettled([n.execute("skill sources",15e3),n.execute("llm providers",15e3)]).then(([k,$])=>{if(k.status==="fulfilled"){const z=k.value.output.match(/(\d+)\s*(?:skills|技能)/i);z&&(d.value.skillCount=parseInt(z[1],10))}if($.status==="fulfilled"){const V=$.value.output.match(/active[:\s]+(\S+)/i);V&&!d.value.activeLlm&&(d.value.activeLlm=V[1])}}),n.execute("mcp servers",1e4).then(({output:k})=>{const $=(k.match(/^[a-z]/gm)||[]).length;d.value.mcpCount=$}).catch(()=>{d.value.mcpCount=0}),await f()}catch{}finally{B.value=!1}}return{loading:B,compressionLoading:N,stats:d,statusLog:E,compression:y,telemetryFilters:v,ensureRuntimeSubscription:F,stopRuntimeSubscription:I,refresh:g,refreshCompression:f,applyCompressionSummary:M,toWindowMs:U}}),_e={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"20px"}},ge={class:"page-sub"},be={style:{display:"flex","align-items":"center",gap:"12px","flex-wrap":"wrap"}},ke={style:{color:"#91caff","font-weight":"600"}},we={style:{color:"#4a6fa5","font-size":"11px","font-family":"monospace"}},Ce={class:"stat-header"},xe={class:"stat-sub"},Se={class:"stat-header"},he={class:"stat-value",style:{color:"#91caff","font-size":"15px",overflow:"hidden","text-overflow":"ellipsis","white-space":"nowrap"}},Re={class:"stat-sub",style:{overflow:"hidden","text-overflow":"ellipsis","white-space":"nowrap"}},$e={class:"stat-header"},ze={class:"stat-value",style:{color:"#1677ff"}},De={class:"stat-header"},Le={class:"stat-value",style:{color:"#c084fc"}},Me={class:"stat-header"},Te={class:"stat-sub"},Oe={class:"stat-header"},Pe={class:"stat-value",style:{color:"#13c2c2"}},je={class:"stat-header"},Ne={class:"stat-value",style:{color:"#faad14"}},Ee={class:"status-log"},Fe={class:"telemetry-filter"},Ie={class:"telemetry-filter"},Ae={class:"telemetry-filter"},Be={class:"telemetry-card"},Ue={class:"telemetry-value"},Ve={class:"telemetry-sub"},He={class:"telemetry-card"},We={class:"telemetry-value"},Ge={class:"telemetry-sub"},Je={class:"telemetry-card"},qe={class:"telemetry-value"},Ke={class:"telemetry-sub"},Qe={class:"telemetry-section"},Xe={key:0,class:"telemetry-empty"},Ye={key:1,class:"telemetry-list"},Ze={class:"telemetry-section"},et={key:0,class:"telemetry-empty"},tt={key:1,class:"telemetry-list"},st={class:"telemetry-section"},lt={key:0,class:"telemetry-empty"},ot={key:1,class:"telemetry-list"},at={class:"telemetry-section"},nt={key:0,class:"telemetry-empty"},rt={key:1,class:"telemetry-list"},it={style:{color:"#91caff"}},ut={style:{color:"var(--text-muted)","font-family":"monospace","font-size":"11px"}},dt={style:{color:"var(--text-secondary)","font-family":"monospace","font-size":"12px"}},vt={style:{color:"var(--text-muted)"}},ct={__name:"Dashboard",setup(B){const N=ne(),d=H(),E=re(),y=ye(),v=window.__CC_CONFIG__||{},_=S(()=>v.mode==="project"),F="v5.0.3.1",I=S(()=>d.status),M=S(()=>y.loading),U=S(()=>y.statusLog),R=S(()=>y.telemetryFilters),f=S(()=>y.compression),g=S(()=>y.stats),n=S(()=>Object.entries(f.value.variantDistribution||{})),c=S(()=>f.value.providerDistribution||[]),b=S(()=>f.value.modelDistribution||[]);async function k(){await y.refresh()}async function $(){await y.refreshCompression()}function z(w){return`${((w||0)*100).toFixed(1)}%`}async function V(){await E.createSession("agent"),N.push("/chat")}return oe(()=>{y.ensureRuntimeSubscription(d),setTimeout(k,300)}),ae(()=>{y.stopRuntimeSubscription()}),(w,e)=>{const D=x("a-button"),W=x("a-tag"),C=x("a-card"),Z=x("a-badge"),u=x("a-col"),h=x("a-row"),ee=x("a-space"),L=x("a-select-option"),G=x("a-select"),T=x("a-descriptions-item"),te=x("a-descriptions");return i(),p("div",null,[l("div",_e,[l("div",null,[e[13]||(e[13]=l("h2",{class:"page-title"},"仪表板",-1)),l("p",ge,o(_.value?`项目「${r(v).projectName||"未命名"}」运行概览`:"ChainlessChain 全局运行概览"),1)]),t(D,{type:"primary",ghost:"",loading:M.value,onClick:k},{icon:s(()=>[t(r(ue))]),default:s(()=>[e[14]||(e[14]=m(" 刷新 ",-1))]),_:1},8,["loading"])]),_.value?(i(),A(C,{key:0,style:{background:"rgba(22,119,255,.08)","border-color":"rgba(22,119,255,.25)","margin-bottom":"16px"},size:"small"},{default:s(()=>[l("div",be,[t(r(de),{style:{color:"#1677ff","font-size":"18px"}}),l("div",null,[l("div",ke,o(r(v).projectName||"项目"),1),l("div",we,o(r(v).projectRoot),1)]),t(W,{color:"blue",style:{"margin-left":"auto"}},{default:s(()=>[...e[15]||(e[15]=[m("项目面板",-1)])]),_:1})])]),_:1})):J("",!0),t(h,{gutter:[12,12],style:{"margin-bottom":"16px"}},{default:s(()=>[t(u,{xs:24,sm:12,lg:6},{default:s(()=>[t(C,{class:"stat-card gateway-card",size:"small"},{default:s(()=>[l("div",Ce,[e[16]||(e[16]=l("span",{class:"stat-label"},"WebSocket Gateway",-1)),t(Z,{status:I.value==="connected"?"success":"error"},null,8,["status"])]),l("div",{class:"stat-value",style:q({color:I.value==="connected"?"#52c41a":"#888"})},o(I.value==="connected"?"运行中":"未连接"),5),l("div",xe,"端口 "+o(r(v).wsPort||18800)+" · "+o(r(v).wsHost||"127.0.0.1"),1)]),_:1})]),_:1}),t(u,{xs:24,sm:12,lg:6},{default:s(()=>[t(C,{class:"stat-card",size:"small"},{default:s(()=>[l("div",Se,[e[17]||(e[17]=l("span",{class:"stat-label"},"当前 LLM",-1)),t(r(K),{style:{color:"#1677ff"}})]),l("div",he,o(g.value.activeLlm||"未配置"),1),l("div",Re,o(g.value.activeModel||"—"),1)]),_:1})]),_:1}),t(u,{xs:24,sm:12,lg:6},{default:s(()=>[t(C,{class:"stat-card",size:"small",style:{cursor:"pointer"},onClick:e[0]||(e[0]=a=>w.$router.push("/skills"))},{default:s(()=>[l("div",$e,[e[18]||(e[18]=l("span",{class:"stat-label"},"可用技能",-1)),t(r(Q),{style:{color:"#1677ff"}})]),l("div",ze,o(g.value.skillCount||"—"),1),e[19]||(e[19]=l("div",{class:"stat-sub"},"点击管理技能",-1))]),_:1})]),_:1}),t(u,{xs:24,sm:12,lg:6},{default:s(()=>[t(C,{class:"stat-card",size:"small",style:{cursor:"pointer"},onClick:e[1]||(e[1]=a=>w.$router.push("/chat"))},{default:s(()=>[l("div",De,[e[20]||(e[20]=l("span",{class:"stat-label"},"AI 会话",-1)),t(r(X),{style:{color:"#722ed1"}})]),l("div",Le,o(g.value.sessionCount),1),e[21]||(e[21]=l("div",{class:"stat-sub"},"点击进入对话",-1))]),_:1})]),_:1})]),_:1}),t(h,{gutter:[12,12],style:{"margin-bottom":"16px"}},{default:s(()=>[t(u,{xs:24,sm:8},{default:s(()=>[t(C,{class:"stat-card",size:"small"},{default:s(()=>[l("div",Me,[e[22]||(e[22]=l("span",{class:"stat-label"},"应用状态",-1)),t(r(ve),{style:q({color:g.value.appRunning?"#52c41a":"#888"})},null,8,["style"])]),l("div",{class:"stat-value",style:q({color:g.value.appRunning?"#52c41a":"#888",fontSize:"15px"})},o(g.value.appRunning?"运行中":g.value.setupDone?"已初始化":"未启动"),5),l("div",Te,o(g.value.edition||"Community")+" Edition",1)]),_:1})]),_:1}),t(u,{xs:24,sm:8},{default:s(()=>[t(C,{class:"stat-card",size:"small",style:{cursor:"pointer"},onClick:e[2]||(e[2]=a=>w.$router.push("/mcp"))},{default:s(()=>[l("div",Oe,[e[23]||(e[23]=l("span",{class:"stat-label"},"MCP 工具",-1)),t(r(ce),{style:{color:"#13c2c2"}})]),l("div",Pe,o(g.value.mcpCount??"—"),1),e[24]||(e[24]=l("div",{class:"stat-sub"},"已挂载扩展",-1))]),_:1})]),_:1}),t(u,{xs:24,sm:8},{default:s(()=>[t(C,{class:"stat-card",size:"small",style:{cursor:"pointer"},onClick:e[3]||(e[3]=a=>w.$router.push("/notes"))},{default:s(()=>[l("div",je,[e[25]||(e[25]=l("span",{class:"stat-label"},"知识库笔记",-1)),t(r(Y),{style:{color:"#faad14"}})]),l("div",Ne,o(g.value.noteCount??"—"),1),e[26]||(e[26]=l("div",{class:"stat-sub"},"点击管理笔记",-1))]),_:1})]),_:1})]),_:1}),t(h,{gutter:[16,16]},{default:s(()=>[t(u,{xs:24,lg:10},{default:s(()=>[t(C,{title:"快速操作",style:{background:"var(--bg-card)","border-color":"var(--border-color)",height:"100%"}},{default:s(()=>[t(ee,{direction:"vertical",style:{width:"100%"},size:"middle"},{default:s(()=>[t(D,{type:"primary",block:"",onClick:e[4]||(e[4]=a=>w.$router.push("/chat"))},{icon:s(()=>[t(r(X))]),default:s(()=>[m(" "+o(_.value?"进入项目 Chat":"新建 AI 对话"),1)]),_:1}),t(D,{block:"",onClick:V,style:{background:"rgba(114,46,209,.12)","border-color":"#722ed1",color:"#722ed1"}},{icon:s(()=>[t(r(K))]),default:s(()=>[e[27]||(e[27]=m(" 启动 Agent 模式 ",-1))]),_:1}),t(h,{gutter:8},{default:s(()=>[t(u,{span:12},{default:s(()=>[t(D,{block:"",onClick:e[5]||(e[5]=a=>w.$router.push("/services")),style:{background:"var(--bg-card-hover)","border-color":"var(--border-color)"}},{icon:s(()=>[t(r(pe))]),default:s(()=>[e[28]||(e[28]=m(" 服务管理 ",-1))]),_:1})]),_:1}),t(u,{span:12},{default:s(()=>[t(D,{block:"",onClick:e[6]||(e[6]=a=>w.$router.push("/logs")),style:{background:"var(--bg-card-hover)","border-color":"var(--border-color)"}},{icon:s(()=>[t(r(Y))]),default:s(()=>[e[29]||(e[29]=m(" 查看日志 ",-1))]),_:1})]),_:1})]),_:1}),t(h,{gutter:8},{default:s(()=>[t(u,{span:12},{default:s(()=>[t(D,{block:"",onClick:e[7]||(e[7]=a=>w.$router.push("/skills")),style:{background:"var(--bg-card-hover)","border-color":"var(--border-color)"}},{icon:s(()=>[t(r(Q))]),default:s(()=>[e[30]||(e[30]=m(" 技能管理 ",-1))]),_:1})]),_:1}),t(u,{span:12},{default:s(()=>[t(D,{block:"",onClick:e[8]||(e[8]=a=>w.$router.push("/providers")),style:{background:"var(--bg-card-hover)","border-color":"var(--border-color)"}},{icon:s(()=>[t(r(me))]),default:s(()=>[e[31]||(e[31]=m(" LLM 配置 ",-1))]),_:1})]),_:1})]),_:1})]),_:1})]),_:1})]),_:1}),t(u,{xs:24,lg:14},{default:s(()=>[t(C,{title:"最近状态",style:{background:"var(--bg-card)","border-color":"var(--border-color)"},loading:M.value},{extra:s(()=>[t(D,{type:"link",size:"small",onClick:e[9]||(e[9]=a=>w.$router.push("/logs"))},{default:s(()=>[...e[32]||(e[32]=[m("查看更多",-1)])]),_:1})]),default:s(()=>[l("pre",Ee,o(U.value||"点击刷新加载系统状态..."),1)]),_:1},8,["loading"])]),_:1})]),_:1}),t(C,{title:"压缩策略观测",style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-top":"16px"},loading:M.value},{default:s(()=>[t(h,{gutter:[12,12],style:{"margin-bottom":"12px"}},{default:s(()=>[t(u,{xs:24,md:8},{default:s(()=>[l("div",Fe,[e[37]||(e[37]=l("div",{class:"telemetry-filter-label"},"时间窗口",-1)),t(G,{value:R.value.windowPreset,"onUpdate:value":e[10]||(e[10]=a=>R.value.windowPreset=a),style:{width:"100%"},onChange:$},{default:s(()=>[t(L,{value:"all"},{default:s(()=>[...e[33]||(e[33]=[m("全部样本",-1)])]),_:1}),t(L,{value:"1h"},{default:s(()=>[...e[34]||(e[34]=[m("近 1 小时",-1)])]),_:1}),t(L,{value:"24h"},{default:s(()=>[...e[35]||(e[35]=[m("近 24 小时",-1)])]),_:1}),t(L,{value:"7d"},{default:s(()=>[...e[36]||(e[36]=[m("近 7 天",-1)])]),_:1})]),_:1},8,["value"])])]),_:1}),t(u,{xs:24,md:8},{default:s(()=>[l("div",Ie,[e[39]||(e[39]=l("div",{class:"telemetry-filter-label"},"Provider 切片",-1)),t(G,{value:R.value.provider,"onUpdate:value":e[11]||(e[11]=a=>R.value.provider=a),style:{width:"100%"},onChange:$},{default:s(()=>[t(L,{value:""},{default:s(()=>[...e[38]||(e[38]=[m("全部 Provider",-1)])]),_:1}),(i(!0),p(P,null,j(c.value,a=>(i(),A(L,{key:a.key,value:a.key},{default:s(()=>[m(o(a.key),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])])]),_:1}),t(u,{xs:24,md:8},{default:s(()=>[l("div",Ae,[e[41]||(e[41]=l("div",{class:"telemetry-filter-label"},"Model 切片",-1)),t(G,{value:R.value.model,"onUpdate:value":e[12]||(e[12]=a=>R.value.model=a),style:{width:"100%"},onChange:$},{default:s(()=>[t(L,{value:""},{default:s(()=>[...e[40]||(e[40]=[m("全部 Model",-1)])]),_:1}),(i(!0),p(P,null,j(b.value,a=>(i(),A(L,{key:a.key,value:a.key},{default:s(()=>[m(o(a.key),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])])]),_:1})]),_:1}),t(h,{gutter:[12,12]},{default:s(()=>[t(u,{xs:24,sm:8},{default:s(()=>[l("div",Be,[e[42]||(e[42]=l("div",{class:"telemetry-label"},"压缩命中率",-1)),l("div",Ue,o(z(f.value.hitRate)),1),l("div",Ve,o(f.value.compressedSamples)+" / "+o(f.value.samples)+" 次压缩产生了有效节省 ",1)])]),_:1}),t(u,{xs:24,sm:8},{default:s(()=>[l("div",He,[e[43]||(e[43]=l("div",{class:"telemetry-label"},"累计节省 Token",-1)),l("div",We,o(f.value.totalSavedTokens),1),l("div",Ge,"平均每次 "+o(f.value.averageSavedTokens)+" Token",1)])]),_:1}),t(u,{xs:24,sm:8},{default:s(()=>[l("div",Je,[e[44]||(e[44]=l("div",{class:"telemetry-label"},"净节省率",-1)),l("div",qe,o(z(f.value.netSavingsRate)),1),l("div",Ke," 原始 "+o(f.value.totalOriginalTokens)+" -> 压缩后 "+o(f.value.totalCompressedTokens),1)])]),_:1})]),_:1}),t(h,{gutter:[16,16],style:{"margin-top":"12px"}},{default:s(()=>[t(u,{xs:24,lg:12},{default:s(()=>[l("div",Qe,[e[45]||(e[45]=l("div",{class:"telemetry-section-title"},"策略命中分布",-1)),f.value.strategyDistribution.length===0?(i(),p("div",Xe,"暂无压缩样本")):(i(),p("div",Ye,[(i(!0),p(P,null,j(f.value.strategyDistribution.slice(0,6),a=>(i(),p("div",{key:a.strategy,class:"telemetry-row"},[l("span",null,o(a.strategy),1),l("span",null,o(a.hits)+" 次 · "+o(z(a.hitRate)),1)]))),128))]))])]),_:1}),t(u,{xs:24,lg:12},{default:s(()=>[l("div",Ze,[e[46]||(e[46]=l("div",{class:"telemetry-section-title"},"变体分布",-1)),n.value.length===0?(i(),p("div",et,"暂无变体数据")):(i(),p("div",tt,[(i(!0),p(P,null,j(n.value,([a,se])=>(i(),p("div",{key:a,class:"telemetry-row"},[l("span",null,o(a),1),l("span",null,o(se)+" 次",1)]))),128))]))])]),_:1})]),_:1}),t(h,{gutter:[16,16],style:{"margin-top":"12px"}},{default:s(()=>[t(u,{xs:24,lg:12},{default:s(()=>[l("div",st,[e[47]||(e[47]=l("div",{class:"telemetry-section-title"},"Provider 切片",-1)),c.value.length===0?(i(),p("div",lt,"暂无 Provider 数据")):(i(),p("div",ot,[(i(!0),p(P,null,j(c.value.slice(0,6),a=>(i(),p("div",{key:a.key,class:"telemetry-row"},[l("span",null,o(a.key),1),l("span",null,o(a.samples)+" 次 · "+o(z(a.hitRate)),1)]))),128))]))])]),_:1}),t(u,{xs:24,lg:12},{default:s(()=>[l("div",at,[e[48]||(e[48]=l("div",{class:"telemetry-section-title"},"Model 切片",-1)),b.value.length===0?(i(),p("div",nt,"暂无 Model 数据")):(i(),p("div",rt,[(i(!0),p(P,null,j(b.value.slice(0,6),a=>(i(),p("div",{key:a.key,class:"telemetry-row"},[l("span",null,o(a.key),1),l("span",null,o(a.samples)+" 次 · "+o(a.savedTokens)+" saved",1)]))),128))]))])]),_:1})]),_:1})]),_:1},8,["loading"]),t(C,{title:"运行信息",style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-top":"16px"}},{default:s(()=>[t(te,{column:{xs:1,sm:2,lg:3},size:"small"},{default:s(()=>[t(T,{label:"面板模式"},{default:s(()=>[t(W,{color:_.value?"blue":"purple"},{default:s(()=>[m(o(_.value?"项目级":"全局"),1)]),_:1},8,["color"])]),_:1}),_.value?(i(),A(T,{key:0,label:"项目名称"},{default:s(()=>[l("span",it,o(r(v).projectName||"—"),1)]),_:1})):J("",!0),_.value?(i(),A(T,{key:1,label:"项目路径"},{default:s(()=>[l("span",ut,o(r(v).projectRoot),1)]),_:1})):J("",!0),t(T,{label:"WebSocket"},{default:s(()=>[l("span",dt," ws://"+o(r(v).wsHost||"127.0.0.1")+":"+o(r(v).wsPort||18800),1)]),_:1}),t(T,{label:"认证"},{default:s(()=>[t(W,{color:r(v).wsToken?"green":"default",style:{"font-size":"11px"}},{default:s(()=>[m(o(r(v).wsToken?"已启用":"未启用"),1)]),_:1},8,["color"])]),_:1}),t(T,{label:"版本"},{default:s(()=>[l("span",vt,o(r(F)),1)]),_:1})]),_:1})]),_:1})])}}},gt=ie(ct,[["__scopeId","data-v-ab1b4e86"]]);export{gt as default};
|