chainlesschain 0.47.6 → 0.47.8
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 +2 -2
- package/src/assets/web-panel/.build-hash +1 -1
- package/src/assets/web-panel/assets/Analytics-BFI7jbwM.css +1 -0
- package/src/assets/web-panel/assets/Analytics-DQ135mAd.js +3 -0
- package/src/assets/web-panel/assets/AppLayout-6SPt_8Y_.js +1 -0
- package/src/assets/web-panel/assets/AppLayout-BFJ-Fofn.css +1 -0
- package/src/assets/web-panel/assets/{Backup-Ba9UybpT.js → Backup-DbVRG5vE.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-BwXskT21.js → Chat-wVhrFK9C.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-UmOe7qvE.js → Cowork-lOC25IW2.js} +1 -1
- package/src/assets/web-panel/assets/{Cron-JHS-rc-4.js → Cron-3P0eVLTV.js} +1 -1
- package/src/assets/web-panel/assets/{Dashboard-B95cMCO7.js → Dashboard-Br7kCwKJ.js} +1 -1
- package/src/assets/web-panel/assets/{Git-CSYO0_zk.js → Git-CrDCcBig.js} +2 -2
- package/src/assets/web-panel/assets/{Logs-Hxw_K0km.js → Logs-BfTE8urP.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-DIE75TrB.js → McpTools-CsGIijNe.js} +1 -1
- package/src/assets/web-panel/assets/{Memory-C4KVnLlp.js → Memory-BXX_yMKJ.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-DuzrHMAk.js → Notes-DU6Vf2cL.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-DTq6uF82.js → Organization-Bny6yOPV.js} +4 -4
- package/src/assets/web-panel/assets/{P2P-C0hjlhsR.js → P2P-BxFZ1Bit.js} +2 -2
- package/src/assets/web-panel/assets/{Permissions-Ec0NH-xC.js → Permissions-B1j3Mtms.js} +3 -3
- package/src/assets/web-panel/assets/{Projects-U8D0asCS.js → Projects-D-CGscDu.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-BngtTLvJ.js → Providers-r6NaBYMf.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-B9NbwCKM.js → RssFeed-D7b68C5q.js} +1 -1
- package/src/assets/web-panel/assets/{Security-BL5Rkr1T.js → Security-MJfKv0EJ.js} +3 -3
- package/src/assets/web-panel/assets/{Services-D4MJzLld.js → Services-Yb_Q1V3d.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-CQTOMDwF.js → Skills-DLTHcH5T.js} +1 -1
- package/src/assets/web-panel/assets/{Tasks-DepbJMnL.js → Tasks-CqycpPjS.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-C24PVZPu.js → Templates-y01u2Zis.js} +1 -1
- package/src/assets/web-panel/assets/VideoEditing-BA1N-5kq.css +1 -0
- package/src/assets/web-panel/assets/VideoEditing-B_nPKw6B.js +1 -0
- package/src/assets/web-panel/assets/{Wallet-PQoSpN_P.js → Wallet-CsRgnjJY.js} +1 -1
- package/src/assets/web-panel/assets/{WebAuthn-BcuyQ4Lr.js → WebAuthn-DWoR5ADp.js} +1 -1
- package/src/assets/web-panel/assets/{WorkflowEditor-C-SvXbHW.js → WorkflowEditor-DBJhFPMN.js} +1 -1
- package/src/assets/web-panel/assets/{antd-DEjZPGMj.js → antd-Dh2t0vGq.js} +84 -84
- package/src/assets/web-panel/assets/index-tN-8TosE.js +2 -0
- package/src/assets/web-panel/assets/{markdown-CusdXFxb.js → markdown-CBnGGMzE.js} +1 -1
- package/src/assets/web-panel/index.html +2 -2
- package/src/commands/agent.js +20 -0
- package/src/commands/mcp.js +86 -4
- package/src/commands/memory.js +85 -4
- package/src/commands/sandbox.js +80 -6
- package/src/commands/serve.js +10 -0
- package/src/commands/session.js +250 -0
- package/src/commands/stream.js +75 -0
- package/src/commands/video.js +363 -0
- package/src/gateways/http/envelope-http-server.js +194 -0
- package/src/gateways/ws/message-dispatcher.js +123 -0
- package/src/gateways/ws/session-core-protocol.js +427 -0
- package/src/gateways/ws/session-protocol.js +42 -1
- package/src/gateways/ws/video-protocol.js +230 -0
- package/src/gateways/ws/ws-server.js +72 -0
- package/src/gateways/ws/ws-session-gateway.js +7 -3
- package/src/harness/jsonl-session-store.js +17 -9
- package/src/index.js +8 -0
- package/src/lib/agent-stream.js +63 -0
- package/src/lib/chat-core.js +183 -6
- package/src/lib/cowork/ab-comparator-cli.js +44 -23
- package/src/lib/cowork/agent-group-runner.js +145 -0
- package/src/lib/cowork/debate-review-cli.js +47 -25
- package/src/lib/cowork/project-style-analyzer-cli.js +34 -7
- package/src/lib/interaction-adapter.js +59 -1
- package/src/lib/jsonl-session-store.js +2 -0
- package/src/lib/memory-injection.js +90 -0
- package/src/lib/provider-stream.js +120 -0
- package/src/lib/sandbox-v2.js +198 -3
- package/src/lib/session-consolidator.js +125 -0
- package/src/lib/session-core-singletons.js +56 -0
- package/src/lib/session-tail.js +128 -0
- package/src/lib/session-usage.js +166 -0
- package/src/lib/shell-approval.js +96 -0
- package/src/lib/ws-chat-handler.js +3 -0
- package/src/repl/agent-repl.js +294 -6
- package/src/repl/chat-repl.js +87 -100
- package/src/runtime/agent-core.js +98 -15
- package/src/runtime/agent-runtime.js +105 -3
- package/src/runtime/policies/agent-policy.js +10 -0
- package/src/skills/video-editing/SKILL.md +46 -0
- package/src/skills/video-editing/beat-snap.js +127 -0
- package/src/skills/video-editing/extractors/audio-extractor.js +212 -0
- package/src/skills/video-editing/extractors/subtitle-extractor.js +90 -0
- package/src/skills/video-editing/extractors/video-extractor.js +137 -0
- package/src/skills/video-editing/parallel-orchestrator.js +212 -0
- package/src/skills/video-editing/pipeline.js +480 -0
- package/src/skills/video-editing/prompts/aesthetic-analysis.md +21 -0
- package/src/skills/video-editing/prompts/audio-segment.md +15 -0
- package/src/skills/video-editing/prompts/character-identify.md +19 -0
- package/src/skills/video-editing/prompts/dense-caption.md +20 -0
- package/src/skills/video-editing/prompts/editor-system.md +29 -0
- package/src/skills/video-editing/prompts/hook-dialogue.md +17 -0
- package/src/skills/video-editing/prompts/protagonist-detect.md +20 -0
- package/src/skills/video-editing/prompts/scene-caption.md +16 -0
- package/src/skills/video-editing/prompts/shot-caption.md +25 -0
- package/src/skills/video-editing/prompts/shot-plan.md +28 -0
- package/src/skills/video-editing/prompts/structure-proposal.md +16 -0
- package/src/skills/video-editing/prompts/vlog-scene-caption.md +18 -0
- package/src/skills/video-editing/render/audio-mix.js +128 -0
- package/src/skills/video-editing/render/ffmpeg-concat.js +45 -0
- package/src/skills/video-editing/render/ffmpeg-extract.js +67 -0
- package/src/skills/video-editing/reviewer.js +161 -0
- package/src/skills/video-editing/tools/commit.js +108 -0
- package/src/skills/video-editing/tools/review-clip.js +46 -0
- package/src/skills/video-editing/tools/semantic-retrieval.js +56 -0
- package/src/skills/video-editing/tools/shot-trimming.js +73 -0
- package/src/assets/web-panel/assets/Analytics-B4OM8S8X.css +0 -1
- package/src/assets/web-panel/assets/Analytics-DgypYeUB.js +0 -3
- package/src/assets/web-panel/assets/AppLayout-Bzf3mSZI.js +0 -1
- package/src/assets/web-panel/assets/AppLayout-DQyDwGut.css +0 -1
- package/src/assets/web-panel/assets/index-CwvzTTw_.js +0 -2
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{u as fe}from"./ws-Dma34ig_.js";import{_ as ve}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{N as x,q as ye,O as me,K as ge,S as _e,L as X,
|
|
2
|
-
`);for(const w of m){const o=w.trim();if(!o||o.startsWith("─")||o.startsWith("DID")||o.match(/^\d+ identit/i))continue;const r=o.match(/(did:\w+:\w+)/);if(r){const d=r[1],g=d.split(":")[1]||"key",b=/default|默认|\*/.test(o),_=o.match(/(\d{4}-\d{2}-\d{2}[\sT]?\d{2}:\d{2}(?::\d{2})?)/);e.push({key:d,did:d,method:g,created:_?_[1]:"-",isDefault:b})}}return e}async function ae(){
|
|
1
|
+
import{u as fe}from"./ws-Dma34ig_.js";import{_ as ve}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{N as x,q as ye,O as me,K as ge,S as _e,L as X,X as be}from"./antd-Dh2t0vGq.js";import{o as xe,a3 as p,a1 as I,k as t,Z as a,f as i,X as u,Y as n,G as f,u as D,W as z,a5 as c,a4 as y,F as ke,a7 as he}from"./vendor-CN0Iv_qZ.js";const we={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},Ie={key:0,style:{"text-align":"center",padding:"60px"}},De={key:0,style:{color:"#e0e0e0","font-family":"monospace","font-size":"12px"}},Ce={key:2,style:{color:"var(--text-secondary)","font-size":"12px"}},Re={key:0,style:{"margin-top":"12px"}},ze={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={key:0,style:{"margin-top":"8px"}},Ne={style:{"white-space":"pre-wrap","word-break":"break-all",color:"var(--text-secondary)","font-size":"11px","margin-top":"8px",background:"var(--bg-base)",padding:"10px","border-radius":"6px",border:"1px solid var(--border-color)"}},Te={key:0,style:{"margin-top":"8px"}},We={style:{"white-space":"pre-wrap","word-break":"break-all",color:"var(--text-secondary)","font-size":"11px","margin-top":"8px",background:"var(--bg-base)",padding:"10px","border-radius":"6px",border:"1px solid var(--border-color)"}},Ae={key:0,style:{"text-align":"center",padding:"60px"}},Oe={key:0,style:{color:"var(--text-secondary)","font-size":"12px","font-family":"monospace"}},Se={key:1,style:{color:"#e0e0e0"}},Me={key:2,style:{color:"var(--text-secondary)"}},$e={key:4,style:{color:"var(--text-muted)","font-size":"12px"}},Ee={__name:"Security",setup(Ke){const C=fe(),W=i("did"),M=i(!1);async function J(){M.value=!0;try{W.value==="did"?await O():W.value==="audit"&&await Z()}finally{M.value=!1}}function Q(l){l==="did"&&U.value.length===0&&O(),l==="audit"&&S.value.length===0&&Z()}const $=i(!1),E=i(!1),K=i(!1),U=i([]),V=i(!1),A=i(""),L=i(""),ee=[{title:"DID",key:"did",dataIndex:"did",ellipsis:!0},{title:"方法",key:"method",dataIndex:"method",width:"100px"},{title:"创建时间",key:"created",dataIndex:"created",width:"180px"},{title:"状态",key:"status",width:"80px"}];async function O(){$.value=!0;try{const{output:l}=await C.execute("did list",15e3);U.value=te(l)}catch(l){x.error("加载 DID 列表失败: "+l.message)}finally{$.value=!1}}function te(l){const e=[],m=l.split(`
|
|
2
|
+
`);for(const w of m){const o=w.trim();if(!o||o.startsWith("─")||o.startsWith("DID")||o.match(/^\d+ identit/i))continue;const r=o.match(/(did:\w+:\w+)/);if(r){const d=r[1],g=d.split(":")[1]||"key",b=/default|默认|\*/.test(o),_=o.match(/(\d{4}-\d{2}-\d{2}[\sT]?\d{2}:\d{2}(?::\d{2})?)/);e.push({key:d,did:d,method:g,created:_?_[1]:"-",isDefault:b})}}return e}async function ae(){E.value=!0;try{const{output:l}=await C.execute("did create",2e4);l.includes("error")||l.includes("失败")?x.error("创建失败: "+l.slice(0,120)):(x.success("DID 身份已创建"),await O())}catch(l){x.error("创建失败: "+l.message)}finally{E.value=!1}}async function le(){if(!A.value.trim()){x.warning("请输入消息");return}K.value=!0,L.value="";try{const{output:l}=await C.execute(`did sign "${A.value.replace(/"/g,'\\"')}"`,15e3);L.value=l,!l.includes("error")&&!l.includes("失败")&&x.success("签名成功")}catch(l){L.value="签名失败: "+l.message}finally{K.value=!1}}const N=i(""),T=i(""),B=i(!1),F=i(!1),k=i(null),h=i(null);async function se(){if(N.value.trim()){B.value=!0,k.value=null;try{const{output:l,exitCode:e}=await C.execute(`encrypt file "${N.value.trim()}"`,3e4);k.value={success:e===0&&!l.includes("error")&&!l.includes("失败"),output:l||"加密完成"},k.value.success&&x.success("文件加密成功")}catch(l){k.value={success:!1,output:"加密失败: "+l.message}}finally{B.value=!1}}}async function oe(){if(T.value.trim()){F.value=!0,h.value=null;try{const{output:l,exitCode:e}=await C.execute(`decrypt file "${T.value.trim()}"`,3e4);h.value={success:e===0&&!l.includes("error")&&!l.includes("失败"),output:l||"解密完成"},h.value.success&&x.success("文件解密成功")}catch(l){h.value={success:!1,output:"解密失败: "+l.message}}finally{F.value=!1}}}const P=i(!1),S=i([]),Y=i([]),ne=[{title:"时间",key:"time",dataIndex:"time",width:"180px"},{title:"事件",key:"event",dataIndex:"event",width:"200px"},{title:"用户",key:"user",dataIndex:"user",width:"120px"},{title:"级别",key:"level",dataIndex:"level",width:"80px"},{title:"详情",key:"detail",dataIndex:"detail",ellipsis:!0}];function ie(l){return{info:"blue",warn:"orange",warning:"orange",error:"red",critical:"red"}[(l||"").toLowerCase()]||"default"}async function Z(){P.value=!0;try{const[l,e]=await Promise.all([C.execute("audit log",15e3),C.execute("audit stats",15e3)]);S.value=re(l.output),Y.value=ue(e.output)}catch(l){x.error("加载审计日志失败: "+l.message)}finally{P.value=!1}}function re(l){const e=[],m=l.split(`
|
|
3
3
|
`);for(const w of m){const o=w.trim();if(!o||o.startsWith("─")||o.startsWith("Audit")||o.startsWith("Recent"))continue;const r=o.split(/\s*[|│]\s*/);if(r.length>=3){e.push({key:e.length,time:r[0]||"-",event:r[1]||"-",user:r[2]||"-",level:r[3]||"info",detail:r.slice(4).join(" ")||""});continue}const d=o.match(/^(\d{4}-\d{2}-\d{2}[\sT]\d{2}:\d{2}(?::\d{2})?)\s+(.+)/);if(d){const g=d[2],b=g.match(/\b(INFO|WARN|WARNING|ERROR|CRITICAL)\b/i);e.push({key:e.length,time:d[1],event:g.replace(/\b(INFO|WARN|WARNING|ERROR|CRITICAL)\b/i,"").trim().slice(0,80),user:"-",level:b?b[1].toLowerCase():"info",detail:""})}else o.length>3&&!o.match(/^\d+ event/i)&&e.push({key:e.length,time:"-",event:o.slice(0,80),user:"-",level:"info",detail:""})}return e}function ue(l){const e=[],m=l.split(`
|
|
4
|
-
`),w=["#1677ff","#52c41a","#faad14","#ff4d4f"];let o=0;for(const r of m){const d=r.trim();if(!d||d.startsWith("─")||d.startsWith("Audit"))continue;const g=d.match(/^(.+?)\s*[:=:]\s*(.+)$/);if(g){const b=g[1].trim(),_=g[2].trim(),R=_.match(/^(\d+)/);e.push({label:b,value:R?parseInt(R[1],10):_,color:w[o%w.length]}),o++}}return e.length===0&&e.push({label:"总事件数",value:S.value.length,color:"#1677ff"},{label:"状态",value:"就绪",color:"#52c41a"}),e}return xe(()=>{O()}),(l,e)=>{const m=u("a-button"),w=u("a-space"),o=u("a-spin"),r=u("a-tag"),d=u("a-empty"),g=u("a-table"),b=u("a-input"),_=u("a-form-item"),R=u("a-form"),de=u("a-modal"),G=u("a-tab-pane"),j=u("a-card"),q=u("a-col"),H=u("a-row"),ce=u("a-statistic"),pe=u("a-tabs");return n(),p("div",null,[I("div",we,[e[7]||(e[7]=I("div",null,[I("h2",{class:"page-title"},"安全中心"),I("p",{class:"page-sub"},"DID 身份 / 加密 / 审计")],-1)),t(m,{type:"primary",ghost:"",loading:M.value,onClick:J},{icon:a(()=>[t(D(ye))]),default:a(()=>[e[6]||(e[6]=f(" 刷新 ",-1))]),_:1},8,["loading"])]),t(pe,{activeKey:W.value,"onUpdate:activeKey":e[5]||(e[5]=s=>W.value=s),onChange:Q},{default:a(()=>[t(G,{key:"did"},{tab:a(()=>[t(D(_e)),e[8]||(e[8]=f(" DID 身份 ",-1))]),default:a(()=>[t(w,{style:{"margin-bottom":"16px"}},{default:a(()=>[t(m,{type:"primary",loading:
|
|
4
|
+
`),w=["#1677ff","#52c41a","#faad14","#ff4d4f"];let o=0;for(const r of m){const d=r.trim();if(!d||d.startsWith("─")||d.startsWith("Audit"))continue;const g=d.match(/^(.+?)\s*[:=:]\s*(.+)$/);if(g){const b=g[1].trim(),_=g[2].trim(),R=_.match(/^(\d+)/);e.push({label:b,value:R?parseInt(R[1],10):_,color:w[o%w.length]}),o++}}return e.length===0&&e.push({label:"总事件数",value:S.value.length,color:"#1677ff"},{label:"状态",value:"就绪",color:"#52c41a"}),e}return xe(()=>{O()}),(l,e)=>{const m=u("a-button"),w=u("a-space"),o=u("a-spin"),r=u("a-tag"),d=u("a-empty"),g=u("a-table"),b=u("a-input"),_=u("a-form-item"),R=u("a-form"),de=u("a-modal"),G=u("a-tab-pane"),j=u("a-card"),q=u("a-col"),H=u("a-row"),ce=u("a-statistic"),pe=u("a-tabs");return n(),p("div",null,[I("div",we,[e[7]||(e[7]=I("div",null,[I("h2",{class:"page-title"},"安全中心"),I("p",{class:"page-sub"},"DID 身份 / 加密 / 审计")],-1)),t(m,{type:"primary",ghost:"",loading:M.value,onClick:J},{icon:a(()=>[t(D(ye))]),default:a(()=>[e[6]||(e[6]=f(" 刷新 ",-1))]),_:1},8,["loading"])]),t(pe,{activeKey:W.value,"onUpdate:activeKey":e[5]||(e[5]=s=>W.value=s),onChange:Q},{default:a(()=>[t(G,{key:"did"},{tab:a(()=>[t(D(_e)),e[8]||(e[8]=f(" DID 身份 ",-1))]),default:a(()=>[t(w,{style:{"margin-bottom":"16px"}},{default:a(()=>[t(m,{type:"primary",loading:E.value,onClick:ae},{icon:a(()=>[t(D(me))]),default:a(()=>[e[9]||(e[9]=f(" 创建身份 ",-1))]),_:1},8,["loading"]),t(m,{onClick:e[0]||(e[0]=s=>V.value=!0)},{icon:a(()=>[t(D(ge))]),default:a(()=>[e[10]||(e[10]=f(" 签名消息 ",-1))]),_:1})]),_:1}),$.value?(n(),p("div",Ie,[t(o,{size:"large"})])):(n(),z(g,{key:1,columns:ee,"data-source":U.value,pagination:{pageSize:20,showTotal:s=>`共 ${s} 条`},size:"small",style:{background:"var(--bg-card)"},"row-class-name":()=>"sec-row"},{bodyCell:a(({column:s,record:v})=>[s.key==="did"?(n(),p("span",De,c(v.did),1)):y("",!0),s.key==="method"?(n(),z(r,{key:1,color:"blue"},{default:a(()=>[f(c(v.method),1)]),_:2},1024)):y("",!0),s.key==="created"?(n(),p("span",Ce,c(v.created),1)):y("",!0),s.key==="status"?(n(),z(r,{key:3,color:v.isDefault?"green":"default"},{default:a(()=>[f(c(v.isDefault?"默认":"可用"),1)]),_:2},1032,["color"])):y("",!0)]),emptyText:a(()=>[t(d,{description:"暂无 DID 身份,点击「创建身份」添加"})]),_:1},8,["data-source","pagination"])),t(de,{open:V.value,"onUpdate:open":e[2]||(e[2]=s=>V.value=s),title:"DID 签名","confirm-loading":K.value,onOk:le,"ok-text":"签名","cancel-text":"取消"},{default:a(()=>[t(R,{"label-col":{span:4},"wrapper-col":{span:20},style:{"margin-top":"16px"}},{default:a(()=>[t(_,{label:"消息",required:""},{default:a(()=>[t(b,{value:A.value,"onUpdate:value":e[1]||(e[1]=s=>A.value=s),placeholder:"请输入要签名的消息"},null,8,["value"])]),_:1})]),_:1}),L.value?(n(),p("div",Re,[e[11]||(e[11]=I("p",{style:{color:"var(--text-secondary)","margin-bottom":"6px"}},"签名结果:",-1)),I("pre",ze,c(L.value),1)])):y("",!0)]),_:1},8,["open","confirm-loading"])]),_:1}),t(G,{key:"encrypt"},{tab:a(()=>[t(D(X)),e[12]||(e[12]=f(" 文件加密 ",-1))]),default:a(()=>[t(H,{gutter:[24,24]},{default:a(()=>[t(q,{xs:24,md:12},{default:a(()=>[t(j,{title:"加密文件",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[t(R,{"label-col":{span:6},"wrapper-col":{span:18}},{default:a(()=>[t(_,{label:"文件路径"},{default:a(()=>[t(b,{value:N.value,"onUpdate:value":e[3]||(e[3]=s=>N.value=s),placeholder:"输入文件路径,如 /path/to/file.txt"},null,8,["value"])]),_:1}),t(_,{"wrapper-col":{offset:6,span:18}},{default:a(()=>[t(m,{type:"primary",loading:B.value,disabled:!N.value.trim(),onClick:se},{icon:a(()=>[t(D(X))]),default:a(()=>[e[13]||(e[13]=f(" 加密 ",-1))]),_:1},8,["loading","disabled"])]),_:1})]),_:1}),k.value?(n(),p("div",Le,[t(r,{color:k.value.success?"green":"red"},{default:a(()=>[f(c(k.value.success?"成功":"失败"),1)]),_:1},8,["color"]),I("pre",Ne,c(k.value.output),1)])):y("",!0)]),_:1})]),_:1}),t(q,{xs:24,md:12},{default:a(()=>[t(j,{title:"解密文件",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[t(R,{"label-col":{span:6},"wrapper-col":{span:18}},{default:a(()=>[t(_,{label:"文件路径"},{default:a(()=>[t(b,{value:T.value,"onUpdate:value":e[4]||(e[4]=s=>T.value=s),placeholder:"输入加密文件路径,如 /path/to/file.txt.enc"},null,8,["value"])]),_:1}),t(_,{"wrapper-col":{offset:6,span:18}},{default:a(()=>[t(m,{type:"primary",loading:F.value,disabled:!T.value.trim(),onClick:oe},{icon:a(()=>[t(D(X))]),default:a(()=>[e[14]||(e[14]=f(" 解密 ",-1))]),_:1},8,["loading","disabled"])]),_:1})]),_:1}),h.value?(n(),p("div",Te,[t(r,{color:h.value.success?"green":"red"},{default:a(()=>[f(c(h.value.success?"成功":"失败"),1)]),_:1},8,["color"]),I("pre",We,c(h.value.output),1)])):y("",!0)]),_:1})]),_:1})]),_:1})]),_:1}),t(G,{key:"audit"},{tab:a(()=>[t(D(be)),e[15]||(e[15]=f(" 审计日志 ",-1))]),default:a(()=>[t(H,{gutter:[16,16],style:{"margin-bottom":"20px"}},{default:a(()=>[(n(!0),p(ke,null,he(Y.value,s=>(n(),z(q,{xs:12,sm:6,key:s.label},{default:a(()=>[t(j,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"},size:"small"},{default:a(()=>[t(ce,{title:s.label,value:s.value,"value-style":{color:s.color,fontSize:"20px"}},null,8,["title","value","value-style"])]),_:2},1024)]),_:2},1024))),128))]),_:1}),P.value?(n(),p("div",Ae,[t(o,{size:"large"})])):(n(),z(g,{key:1,columns:ne,"data-source":S.value,pagination:{pageSize:20,showTotal:s=>`共 ${s} 条`},size:"small",style:{background:"var(--bg-card)"},"row-class-name":()=>"sec-row"},{bodyCell:a(({column:s,record:v})=>[s.key==="time"?(n(),p("span",Oe,c(v.time),1)):y("",!0),s.key==="event"?(n(),p("span",Se,c(v.event),1)):y("",!0),s.key==="user"?(n(),p("span",Me,c(v.user),1)):y("",!0),s.key==="level"?(n(),z(r,{key:3,color:ie(v.level)},{default:a(()=>[f(c(v.level),1)]),_:2},1032,["color"])):y("",!0),s.key==="detail"?(n(),p("span",$e,c(v.detail),1)):y("",!0)]),emptyText:a(()=>[t(d,{description:"暂无审计日志"})]),_:1},8,["data-source","pagination"]))]),_:1})]),_:1},8,["activeKey"])])}}},Pe=ve(Ee,[["__scopeId","data-v-d730836a"]]);export{Pe as default};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{u as J}from"./ws-Dma34ig_.js";import{_ as P}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{q as X,s as Y,d as R,r as Z,E as K,J as Q,b as U}from"./antd-
|
|
1
|
+
import{u as J}from"./ws-Dma34ig_.js";import{_ as P}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{q as X,s as Y,d as R,r as Z,E as K,J as Q,b as U}from"./antd-Dh2t0vGq.js";import{o as ee,a3 as d,a1 as m,k as e,Z as t,f as r,X as n,Y as l,G as y,u as c,a5 as u,a4 as g,W as V,c as te}from"./vendor-CN0Iv_qZ.js";const oe={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},ae={key:0,style:{"margin-top":"6px",color:"var(--text-muted)","font-size":"11px"}},re={style:{"margin-top":"6px",color:"var(--text-muted)","font-size":"11px"}},se={key:0,style:{"margin-top":"6px",color:"var(--text-muted)","font-size":"11px",overflow:"hidden","text-overflow":"ellipsis","white-space":"nowrap"}},le={key:0,style:{"margin-top":"6px",color:"var(--text-muted)","font-size":"11px"}},ne={key:0,style:{"text-align":"center",padding:"30px"}},ce={key:1,style:{"font-family":"monospace",color:"#ccc"}},ie={key:0,style:{color:"var(--text-secondary)","font-size":"13px",padding:"8px 0"}},de={key:1,style:{color:"var(--text-muted)","font-size":"13px",padding:"8px 0"}},ue={key:0,style:{"margin-top":"16px"}},ve={style:{background:"var(--bg-base)",border:"1px solid var(--border-color)","border-radius":"6px",padding:"12px",color:"#aaa","font-size":"12px","max-height":"300px","overflow-y":"auto","white-space":"pre-wrap"}},pe={__name:"Services",setup(fe){const S=J(),B=window.__CC_CONFIG__||{},x=r(!1),C=r(!1),b=r(""),W=r(""),z=r(!1),D=r(""),k=r(""),L=r(""),M=r(!1),h=r(""),w=r(""),N=r([]),I=te(()=>S.status==="connected"),E=[{title:"服务",dataIndex:"name",key:"name"},{title:"端口",dataIndex:"port",key:"port"},{title:"状态",key:"status"}];async function $(){x.value=!0;try{const{output:o}=await S.execute("status",15e3);W.value=o,F(o)}catch(o){console.error("status failed:",o)}finally{x.value=!1}}function F(o){z.value=o.includes("Desktop app running")||o.includes("Running");const a=o.match(/Edition:\s+(\S+)/i);a&&(D.value=a[1]);const v=o.match(/LLM:\s+(\S+)\s+\(([^)]+)\)/i);if(v)k.value=v[1],L.value=v[2];else{const s=o.match(/LLM:\s+(\S+)/i);s&&(k.value=s[1])}M.value=o.includes("Setup completed");const p=o.match(/Setup completed \(([^)]+)\)/i);if(p)try{h.value=new Date(p[1]).toLocaleDateString("zh-CN")}catch{h.value=""}o.includes("docker-compose.yml not found")?w.value="未找到 docker-compose.yml":o.includes("Docker Services")&&(w.value="已检测到 Docker 配置");const i=o.split(`
|
|
2
2
|
`).filter(s=>s.match(/[○●]\s+\w+:\s+\d+/));N.value=i.map(s=>{const f=s.match(/([○●])\s+(\w+):\s+(\d+)/);return f?{key:f[2],name:f[2],port:parseInt(f[3]),active:f[1]==="●"}:null}).filter(Boolean)}async function G(){C.value=!0,b.value="";try{const{output:o}=await S.execute("doctor",3e4);b.value=o}catch(o){b.value=`诊断失败: ${o.message}`}finally{C.value=!1}}return ee($),(o,a)=>{const v=n("a-button"),p=n("a-statistic"),i=n("a-card"),s=n("a-col"),f=n("a-row"),T=n("a-tag"),j=n("a-spin"),q=n("a-badge"),A=n("a-table"),H=n("a-space");return l(),d("div",null,[m("div",oe,[a[3]||(a[3]=m("div",null,[m("h2",{class:"page-title"},"服务管理"),m("p",{class:"page-sub"},"ChainlessChain 运行状态与服务控制")],-1)),e(v,{type:"primary",ghost:"",loading:x.value,onClick:$},{icon:t(()=>[e(c(X))]),default:t(()=>[a[2]||(a[2]=y(" 刷新 ",-1))]),_:1},8,["loading"])]),e(f,{gutter:[16,16],style:{"margin-bottom":"20px"}},{default:t(()=>[e(s,{xs:24,sm:12,lg:6},{default:t(()=>[e(i,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:t(()=>[e(p,{title:"应用状态",value:z.value?"运行中":"未运行","value-style":{color:z.value?"#52c41a":"#888",fontSize:"16px"}},{prefix:t(()=>[e(c(Y))]),_:1},8,["value","value-style"]),D.value?(l(),d("div",ae,"版本: "+u(D.value),1)):g("",!0)]),_:1})]),_:1}),e(s,{xs:24,sm:12,lg:6},{default:t(()=>[e(i,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:t(()=>[e(p,{title:"WebSocket 服务",value:"运行中","value-style":{color:"#52c41a",fontSize:"16px"}},{prefix:t(()=>[e(c(R))]),_:1}),m("div",re," 端口: "+u(c(B).wsPort||18800)+" · "+u(c(B).wsHost||"127.0.0.1"),1)]),_:1})]),_:1}),e(s,{xs:24,sm:12,lg:6},{default:t(()=>[e(i,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:t(()=>[e(p,{title:"LLM 提供商",value:k.value||"未配置","value-style":{color:k.value?"#1677ff":"#888",fontSize:"16px"}},{prefix:t(()=>[e(c(Z))]),_:1},8,["value","value-style"]),L.value?(l(),d("div",se,u(L.value),1)):g("",!0)]),_:1})]),_:1}),e(s,{xs:24,sm:12,lg:6},{default:t(()=>[e(i,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:t(()=>[e(p,{title:"初始化",value:M.value?"已完成":"未完成","value-style":{color:M.value?"#52c41a":"#faad14",fontSize:"16px"}},{prefix:t(()=>[e(c(K))]),_:1},8,["value","value-style"]),h.value?(l(),d("div",le,u(h.value),1)):g("",!0)]),_:1})]),_:1})]),_:1}),e(i,{title:"端口状态",style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"20px"}},{extra:t(()=>[e(T,{color:I.value?"green":"red"},{default:t(()=>[y(" WS "+u(I.value?"已连接":"断开"),1)]),_:1},8,["color"])]),default:t(()=>[x.value?(l(),d("div",ne,[e(j)])):(l(),V(A,{key:1,columns:E,"data-source":N.value,pagination:!1,size:"small","row-class-name":_=>_.active?"port-active":""},{bodyCell:t(({column:_,record:O})=>[_.key==="status"?(l(),V(q,{key:0,status:O.active?"success":"default",text:O.active?"运行中":"未运行"},null,8,["status","text"])):g("",!0),_.key==="port"?(l(),d("span",ce,u(O.port),1)):g("",!0)]),_:1},8,["data-source","row-class-name"]))]),_:1}),e(i,{title:"Docker 服务",style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"20px"}},{default:t(()=>[w.value?(l(),d("div",ie,u(w.value),1)):(l(),d("div",de,"未检测到 Docker 服务"))]),_:1}),e(i,{title:"快速操作",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:t(()=>[e(H,{wrap:""},{default:t(()=>[e(v,{loading:C.value,onClick:G,style:{background:"var(--bg-card-hover)","border-color":"var(--border-color)"}},{icon:t(()=>[e(c(Q))]),default:t(()=>[a[4]||(a[4]=y(" 环境诊断 ",-1))]),_:1},8,["loading"]),e(v,{onClick:a[0]||(a[0]=_=>o.$router.push("/logs")),style:{background:"var(--bg-card-hover)","border-color":"var(--border-color)"}},{icon:t(()=>[e(c(U))]),default:t(()=>[a[5]||(a[5]=y(" 查看日志 ",-1))]),_:1}),e(v,{onClick:a[1]||(a[1]=_=>o.$router.push("/providers")),style:{background:"var(--bg-card-hover)","border-color":"var(--border-color)"}},{icon:t(()=>[e(c(R))]),default:t(()=>[a[6]||(a[6]=y(" LLM 配置 ",-1))]),_:1})]),_:1}),b.value?(l(),d("div",ue,[a[7]||(a[7]=m("div",{style:{color:"var(--text-secondary)","font-size":"11px","margin-bottom":"6px"}},"诊断结果",-1)),m("pre",ve,u(b.value),1)])):g("",!0)]),_:1})])}}},ye=P(pe,[["__scopeId","data-v-13be6bfe"]]);export{ye as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{V,f as v,c as h,o as $,a3 as m,a1 as i,a5 as y,u as s,k as r,Z as d,F as C,a7 as L,X as p,$ as j,Y as u,G as g,W as M}from"./vendor-CN0Iv_qZ.js";import{u as A}from"./ws-Dma34ig_.js";import{p as F}from"./parsers-DftYMnlk.js";import{u as N}from"./chat-BYmuDvol.js";import{_ as Q}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{c as E,q as R,z as T}from"./antd-
|
|
1
|
+
import{V,f as v,c as h,o as $,a3 as m,a1 as i,a5 as y,u as s,k as r,Z as d,F as C,a7 as L,X as p,$ as j,Y as u,G as g,W as M}from"./vendor-CN0Iv_qZ.js";import{u as A}from"./ws-Dma34ig_.js";import{p as F}from"./parsers-DftYMnlk.js";import{u as N}from"./chat-BYmuDvol.js";import{_ as Q}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{c as E,q as R,z as T}from"./antd-Dh2t0vGq.js";const U=V("skills",()=>{const _=v(!1),e=v([]),c=v(""),f=v("all"),x=h(()=>{const n=new Set(["all"]);return e.value.forEach(l=>{l.category&&n.add(l.category),l.executionMode&&n.add(l.executionMode)}),[...n]}),k=h(()=>{let n=e.value;if(f.value!=="all"&&(n=n.filter(l=>l.category===f.value||l.executionMode===f.value)),c.value){const l=c.value.toLowerCase();n=n.filter(o=>o.name?.toLowerCase().includes(l)||o.description?.toLowerCase().includes(l)||o.title?.toLowerCase().includes(l))}return n});async function b(){const n=A();_.value=!0;try{const{output:l}=await n.execute("skill list",2e4),o=F(l);e.value=o}catch(l){console.error("Failed to load skills:",l)}finally{_.value=!1}}return{loading:_,allSkills:e,searchQuery:c,selectedCategory:f,categories:x,filteredSkills:k,loadSkills:b}}),W={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},D={class:"page-sub"},G={style:{display:"flex",gap:"12px","margin-bottom":"20px","flex-wrap":"wrap"}},P={key:0,style:{"text-align":"center",padding:"60px"}},X={key:1,class:"skills-grid"},Y={style:{display:"flex","justify-content":"space-between","align-items":"flex-start"}},Z={style:{flex:"1","min-width":"0"}},H={style:{"font-weight":"500",color:"#e0e0e0","font-size":"14px","margin-bottom":"4px","font-family":"monospace"}},J={style:{color:"var(--text-secondary)","font-size":"12px","line-height":"1.5"}},K={style:{"margin-left":"12px","flex-shrink":"0"}},ee={style:{"margin-top":"10px",display:"flex","justify-content":"flex-end"}},te={key:2,style:{"text-align":"center",padding:"60px",color:"var(--text-muted)"}},oe={__name:"Skills",setup(_){const e=U(),c=N(),f=j(),x=h(()=>e.categories.filter(o=>o!=="all").slice(0,6));function k(o){return{"built-in":"内置","cli-direct":"CLI",agent:"Agent","llm-query":"LLM",hybrid:"混合",workspace:"工作区",marketplace:"市场"}[o]||o}function b(o){return{"cli-direct":"CLI",agent:"Agent","llm-query":"LLM",hybrid:"混合","built-in":"内置"}[o]||o||"未知"}function n(o){return{"cli-direct":"cyan",agent:"purple","llm-query":"blue",hybrid:"orange","built-in":"green"}[o]||"default"}async function l(o){await c.createSession("agent"),f.push("/chat"),setTimeout(()=>{c.currentSessionId&&c.sendMessage(c.currentSessionId,`/skill run ${o}`)},300)}return $(()=>{e.allSkills.length||e.loadSkills()}),(o,t)=>{const S=p("a-button"),z=p("a-input-search"),w=p("a-radio-button"),q=p("a-radio-group"),I=p("a-spin"),B=p("a-tag"),O=p("a-card");return u(),m("div",null,[i("div",W,[i("div",null,[t[3]||(t[3]=i("h2",{class:"page-title"},"技能管理",-1)),i("p",D,y(s(e).allSkills.length)+" 个可用技能",1)]),r(S,{type:"primary",ghost:"",loading:s(e).loading,onClick:t[0]||(t[0]=a=>s(e).loadSkills())},{icon:d(()=>[r(s(R))]),default:d(()=>[t[4]||(t[4]=g(" 刷新 ",-1))]),_:1},8,["loading"])]),i("div",G,[r(z,{value:s(e).searchQuery,"onUpdate:value":t[1]||(t[1]=a=>s(e).searchQuery=a),placeholder:"搜索技能名称或描述...",style:{width:"300px"},"allow-clear":""},null,8,["value"]),r(q,{value:s(e).selectedCategory,"onUpdate:value":t[2]||(t[2]=a=>s(e).selectedCategory=a),"button-style":"solid"},{default:d(()=>[r(w,{value:"all"},{default:d(()=>[...t[5]||(t[5]=[g("全部",-1)])]),_:1}),(u(!0),m(C,null,L(x.value,a=>(u(),M(w,{key:a,value:a},{default:d(()=>[g(y(k(a)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),s(e).loading?(u(),m("div",P,[r(I,{size:"large"}),t[6]||(t[6]=i("div",{style:{color:"var(--text-muted)","margin-top":"12px"}},"加载技能中...",-1))])):s(e).filteredSkills.length?(u(),m("div",X,[(u(!0),m(C,null,L(s(e).filteredSkills,a=>(u(),M(O,{key:a.name,class:"skill-card",size:"small",hoverable:"",style:{background:"var(--bg-card)","border-color":"var(--border-color)",cursor:"default"}},{default:d(()=>[i("div",Y,[i("div",Z,[i("div",H,y(a.name),1),i("div",J,y(a.description||"暂无描述"),1)]),i("div",K,[r(B,{color:n(a.executionMode),style:{"font-size":"10px"}},{default:d(()=>[g(y(b(a.executionMode)),1)]),_:2},1032,["color"])])]),i("div",ee,[r(S,{size:"small",type:"primary",ghost:"",onClick:le=>l(a.name)},{icon:d(()=>[r(s(T))]),default:d(()=>[t[7]||(t[7]=g(" 运行 ",-1))]),_:1},8,["onClick"])])]),_:2},1024))),128))])):(u(),m("div",te,[r(s(E),{style:{"font-size":"48px","margin-bottom":"16px",display:"block"}}),i("div",null,y(s(e).allSkills.length?"没有匹配的技能":"点击刷新加载技能列表"),1)]))])}}},ce=Q(oe,[["__scopeId","data-v-a1cd8dd9"]]);export{ce as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{V as F,f as $,c as V,o as I,b as P,a3 as d,a1 as f,k as l,Z as o,u as s,W as T,a4 as b,X as _,Y as r,G as g,a5 as u,F as A,a7 as R}from"./vendor-CN0Iv_qZ.js";import{u as B}from"./ws-Dma34ig_.js";import{_ as E}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{q as L}from"./antd-
|
|
1
|
+
import{V as F,f as $,c as V,o as I,b as P,a3 as d,a1 as f,k as l,Z as o,u as s,W as T,a4 as b,X as _,Y as r,G as g,a5 as u,F as A,a7 as R}from"./vendor-CN0Iv_qZ.js";import{u as B}from"./ws-Dma34ig_.js";import{_ as E}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{q as L}from"./antd-Dh2t0vGq.js";const U=F("tasks",()=>{const v=$([]),t=$(!1);let w=null,k=null;const S=V(()=>v.value.filter(e=>e.status==="running")),N=V(()=>v.value.filter(e=>e.status==="pending")),i=V(()=>v.value.filter(e=>e.status==="completed"||e.status==="failed"||e.status==="timeout"));async function a(){const e=B();t.value=!0;try{const p=await e.sendRaw({type:"tasks-list"});p&&Array.isArray(p.tasks)&&(v.value=p.tasks)}catch{}finally{t.value=!1}}async function x(e){const p=B();try{await p.sendRaw({type:"tasks-stop",taskId:e})}catch{}finally{await a()}}const C=$(null);function z(e=5e3){y(),a(),w=setInterval(a,e),m()}function y(){w&&(clearInterval(w),w=null),k&&(k(),k=null)}function m(){const e=B();if(k)return;const p=n=>{n.type==="task:notification"&&n.payload?.task&&(C.value=n.payload.task,a(),setTimeout(()=>{C.value=null},8e3))};k=e.onRuntimeEvent(p)}function h(e){return!e||e<0?"-":e<1e3?`${e}ms`:e<6e4?`${(e/1e3).toFixed(1)}s`:`${(e/6e4).toFixed(1)}m`}function D(e){switch(e){case"running":return"processing";case"pending":return"default";case"completed":return"success";case"failed":return"error";case"timeout":return"warning";default:return"default"}}return{tasks:v,loading:t,running:S,pending:N,completed:i,lastNotification:C,fetchTasks:a,stopTask:x,startPolling:z,stopPolling:y,formatDuration:h,getStatusColor:D}}),W={class:"page-header"},q={key:0,class:"error-text"},G={key:1},M={class:"task-header"},O={class:"task-desc"},X={class:"task-id"},Y={class:"task-meta"},Z=["title"],j={key:0,class:"error-text"},H={key:1,class:"success-text"},J={key:2,class:"muted-text"},K={__name:"Tasks",setup(v){const t=U(),w=[{title:"状态",key:"status",width:90},{title:"描述",key:"description",ellipsis:!0},{title:"类型",dataIndex:"type",width:100},{title:"耗时",key:"duration",width:90},{title:"创建时间",key:"createdAt",width:180},{title:"结果",key:"result",ellipsis:!0},{title:"操作",key:"action",width:80}];function k(i){return i.status==="running"&&i.startedAt?t.formatDuration(Date.now()-i.startedAt):i.completedAt&&i.startedAt?t.formatDuration(i.completedAt-i.startedAt):"-"}function S(i){return i?new Date(i).toLocaleString():"-"}function N(i,a){return i?i.length>a?`${i.slice(0,a)}...`:i:""}return I(()=>t.startPolling(5e3)),P(()=>t.stopPolling()),(i,a)=>{const x=_("a-button"),C=_("a-space"),z=_("a-alert"),y=_("a-statistic"),m=_("a-card"),h=_("a-col"),D=_("a-row"),e=_("a-tag"),p=_("a-table");return r(),d("div",null,[f("div",W,[a[3]||(a[3]=f("div",null,[f("h2",{class:"page-title"},"后台任务"),f("p",{class:"page-sub"},"查看后台任务队列、实时通知和任务执行结果。")],-1)),l(C,null,{default:o(()=>[l(x,{ghost:"",loading:s(t).loading,onClick:a[0]||(a[0]=n=>s(t).fetchTasks())},{icon:o(()=>[l(s(L))]),default:o(()=>[a[2]||(a[2]=g(" 刷新 ",-1))]),_:1},8,["loading"])]),_:1})]),s(t).lastNotification?(r(),T(z,{key:0,type:s(t).lastNotification.status==="completed"?"success":"error","show-icon":"",closable:"",class:"banner",onClose:a[1]||(a[1]=n=>s(t).lastNotification=null)},{message:o(()=>[g(" 任务"+u(s(t).lastNotification.status==="completed"?"完成":"结束")+": "+u(s(t).lastNotification.description||s(t).lastNotification.id.slice(0,16)),1)]),description:o(()=>[s(t).lastNotification.error?(r(),d("span",q,u(s(t).lastNotification.error),1)):s(t).lastNotification.result?(r(),d("span",G,u(N(String(s(t).lastNotification.result),120)),1)):b("",!0)]),_:1},8,["type"])):b("",!0),l(D,{gutter:[16,16],class:"stats-row"},{default:o(()=>[l(h,{xs:12,sm:6},{default:o(()=>[l(m,{class:"stat-card",size:"small"},{default:o(()=>[l(y,{title:"全部任务",value:s(t).tasks.length},null,8,["value"])]),_:1})]),_:1}),l(h,{xs:12,sm:6},{default:o(()=>[l(m,{class:"stat-card",size:"small"},{default:o(()=>[l(y,{title:"运行中",value:s(t).running.length},null,8,["value"])]),_:1})]),_:1}),l(h,{xs:12,sm:6},{default:o(()=>[l(m,{class:"stat-card",size:"small"},{default:o(()=>[l(y,{title:"等待中",value:s(t).pending.length},null,8,["value"])]),_:1})]),_:1}),l(h,{xs:12,sm:6},{default:o(()=>[l(m,{class:"stat-card",size:"small"},{default:o(()=>[l(y,{title:"已完成",value:s(t).completed.length},null,8,["value"])]),_:1})]),_:1})]),_:1}),s(t).running.length>0?(r(),T(m,{key:1,title:"运行中的任务",class:"panel-card",size:"small"},{default:o(()=>[(r(!0),d(A,null,R(s(t).running,n=>(r(),d("div",{key:n.id,class:"task-item running"},[f("div",M,[l(e,{color:s(t).getStatusColor(n.status)},{default:o(()=>[g(u(n.status.toUpperCase()),1)]),_:2},1032,["color"]),f("span",O,u(n.description),1),f("span",X,u(n.id.slice(0,16)),1)]),f("div",Y,[f("span",null,"类型: "+u(n.type||"-"),1),f("span",null,"已运行: "+u(s(t).formatDuration(Date.now()-n.startedAt)),1),l(x,{size:"small",danger:"",onClick:c=>s(t).stopTask(n.id)},{default:o(()=>[...a[4]||(a[4]=[g("停止",-1)])]),_:1},8,["onClick"])])]))),128))]),_:1})):b("",!0),l(m,{class:"panel-card"},{default:o(()=>[l(p,{columns:w,"data-source":s(t).tasks,pagination:{pageSize:15,size:"small"},loading:s(t).loading,"row-key":"id",size:"small"},{bodyCell:o(({column:n,record:c})=>[n.key==="status"?(r(),T(e,{key:0,color:s(t).getStatusColor(c.status)},{default:o(()=>[g(u(c.status),1)]),_:2},1032,["color"])):n.key==="description"?(r(),d("span",{key:1,title:c.command},u(c.description),9,Z)):n.key==="duration"?(r(),d(A,{key:2},[g(u(k(c)),1)],64)):n.key==="createdAt"?(r(),d(A,{key:3},[g(u(S(c.createdAt)),1)],64)):n.key==="result"?(r(),d(A,{key:4},[c.error?(r(),d("span",j,u(N(c.error,60)),1)):c.result?(r(),d("span",H,u(N(String(c.result),60)),1)):(r(),d("span",J,"-"))],64)):n.key==="action"?(r(),d(A,{key:5},[c.status==="running"?(r(),T(x,{key:0,size:"small",danger:"",onClick:Q=>s(t).stopTask(c.id)},{default:o(()=>[...a[5]||(a[5]=[g(" 停止 ",-1)])]),_:1},8,["onClick"])):b("",!0)],64)):b("",!0)]),_:1},8,["data-source","loading"])]),_:1})])}}},nt=E(K,[["__scopeId","data-v-c8e3e605"]]);export{nt as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{o as fe,a3 as x,a1 as n,k as t,Z as o,f as c,X as l,r as ye,$ as ge,Y as u,F as A,a7 as R,u as p,a5 as d,G as i,W as y,a4 as U}from"./vendor-CN0Iv_qZ.js";import{u as _e}from"./ws-Dma34ig_.js";import{_ as xe}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{R as M,z as G,c as be,n as W,O as ke,b as Y,a5 as we,a4 as Ce,N as h}from"./antd-DEjZPGMj.js";const ze={style:{display:"flex","align-items":"flex-start",gap:"10px"}},he={style:{flex:"1","min-width":"0"}},Oe={style:{"font-weight":"500",color:"#e0e0e0","font-size":"14px","font-family":"monospace","margin-bottom":"4px"}},Pe={style:{color:"var(--text-secondary)","font-size":"12px","line-height":"1.5"}},$e={style:{"margin-top":"12px","text-align":"right"}},Te={style:{margin:"0","font-size":"12px","white-space":"pre-wrap","max-height":"200px","overflow-y":"auto"}},Ie={key:0,style:{"text-align":"center",padding:"40px"}},Be={style:{display:"flex","align-items":"flex-start",gap:"10px"}},je={style:{flex:"1","min-width":"0"}},Ne={style:{"font-weight":"500",color:"#e0e0e0","font-size":"14px","margin-bottom":"4px"}},Se={style:{color:"var(--text-secondary)","font-size":"12px","line-height":"1.5"}},Ae={key:0,style:{"margin-top":"4px"}},Re={style:{"margin-top":"12px","text-align":"right"}},Ue={style:{margin:"0","font-size":"12px","white-space":"pre-wrap","max-height":"200px","overflow-y":"auto"}},De={style:{"margin-bottom":"16px"}},Fe={style:{display:"flex","align-items":"center",gap:"8px","margin-bottom":"8px"}},Ke={style:{"font-weight":"500",color:"#e0e0e0","font-size":"14px",flex:"1",overflow:"hidden","text-overflow":"ellipsis","white-space":"nowrap"}},Le={style:{color:"var(--text-secondary)","font-size":"12px","line-height":"1.5","max-height":"60px",overflow:"hidden","text-overflow":"ellipsis","white-space":"pre-wrap"}},Ve={style:{"margin-top":"12px",display:"flex",gap:"8px","justify-content":"flex-end"}},X="cc_prompt_templates",qe={__name:"Templates",setup(Ee){const O=_e(),Z=ge(),D=c("project"),P=c(""),v=c(null),b=c(!1),$=c(""),H=[{name:"code-project",description:"代码项目 — 代码审查、重构、单元测试"},{name:"data-science",description:"数据科学 — ML/数据分析、可视化"},{name:"devops",description:"DevOps — 基础设施、部署、监控"},{name:"medical-triage",description:"医疗分诊 — 症状分析、分诊建议"},{name:"agriculture-expert",description:"农业专家 — 作物管理、病虫害"},{name:"general-assistant",description:"通用助手 — 日常问答、任务管理"},{name:"ai-media-creator",description:"AI 媒体创作 — 图文生成、视频脚本"},{name:"ai-doc-creator",description:"AI 文档创作 — 文档生成、格式转换"},{name:"empty",description:"空白模板 — 最小项目结构"}];function Q(s){$.value=s,b.value=!0}async function ee(){b.value=!1;const s=$.value;if(s){P.value=s,v.value=null;try{const e=`init --template ${s} --yes`,{output:m,exitCode:_}=await O.execute(e,3e4);v.value={success:_===0,output:m}}catch(e){v.value={success:!1,output:`初始化失败: ${e.message}`}}finally{P.value=""}}}const T=c(!1),k=c([]),I=c(""),f=c(null);async function te(){T.value=!0;try{const{output:s}=await O.execute("bi templates --json",15e3),e=JSON.parse(s);k.value=Array.isArray(e)?e:e.templates||[]}catch{k.value=[]}finally{T.value=!1}}async function oe(s){I.value=s,f.value=null;try{const e=`bi dashboard create --template ${s} --json`,{output:m,exitCode:_}=await O.execute(e,3e4);f.value={success:_===0,output:m}}catch(e){f.value={success:!1,output:`创建失败: ${e.message}`}}finally{I.value=""}}const g=c([]),w=c(!1),r=ye({name:"",category:"general",content:""});function ae(){try{const s=localStorage.getItem(X);g.value=s?JSON.parse(s):[]}catch{g.value=[]}}function F(){localStorage.setItem(X,JSON.stringify(g.value))}function ne(){!r.name||!r.content||(g.value.push({name:r.name,category:r.category,content:r.content}),F(),K(),h.success("模板已保存"))}function K(){w.value=!1,r.name="",r.category="general",r.content=""}function se(s){g.value.splice(s,1),F(),h.success("模板已删除")}function le(s){navigator.clipboard.writeText(s.content).then(()=>{h.success("已复制到剪贴板")}).catch(()=>{h.error("复制失败")})}function ie(s){Z.push({path:"/chat",query:{prompt:s.content}})}function re(s){return{general:"blue",code:"green",writing:"orange",analysis:"purple"}[s]||"default"}return fe(()=>{ae(),te()}),(s,e)=>{const m=l("a-button"),_=l("a-card"),B=l("a-col"),j=l("a-row"),L=l("a-alert"),N=l("a-tab-pane"),ue=l("a-spin"),V=l("a-empty"),q=l("a-tag"),pe=l("a-tabs"),E=l("a-modal"),ce=l("a-input"),S=l("a-form-item"),C=l("a-select-option"),de=l("a-select"),me=l("a-textarea"),ve=l("a-form");return u(),x("div",null,[e[27]||(e[27]=n("div",{style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},[n("div",null,[n("h2",{class:"page-title"},"模板中心"),n("p",{class:"page-sub"},"项目模板 / BI 模板 / Prompt 模板")])],-1)),t(pe,{activeKey:D.value,"onUpdate:activeKey":e[3]||(e[3]=a=>D.value=a),type:"card"},{default:o(()=>[t(N,{key:"project"},{tab:o(()=>[t(p(be)),e[10]||(e[10]=i(" 项目模板 ",-1))]),default:o(()=>[t(j,{gutter:[16,16]},{default:o(()=>[(u(),x(A,null,R(H,a=>t(B,{key:a.name,xs:24,sm:12,lg:8},{default:o(()=>[t(_,{size:"small",hoverable:"",class:"template-card",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:o(()=>[n("div",ze,[t(p(M),{style:{"font-size":"24px",color:"#1677ff","flex-shrink":"0","margin-top":"2px"}}),n("div",he,[n("div",Oe,d(a.name),1),n("div",Pe,d(a.description),1)])]),n("div",$e,[t(m,{type:"primary",size:"small",loading:P.value===a.name,onClick:z=>Q(a.name)},{icon:o(()=>[t(p(G))]),default:o(()=>[e[11]||(e[11]=i(" 初始化 ",-1))]),_:1},8,["loading","onClick"])])]),_:2},1024)]),_:2},1024)),64))]),_:1}),v.value?(u(),y(L,{key:0,message:v.value.success?"初始化成功":"初始化失败",type:v.value.success?"success":"error","show-icon":"",closable:"",style:{"margin-top":"16px"},onClose:e[0]||(e[0]=a=>v.value=null)},{description:o(()=>[n("pre",Te,d(v.value.output),1)]),_:1},8,["message","type"])):U("",!0)]),_:1}),t(N,{key:"bi"},{tab:o(()=>[t(p(W)),e[12]||(e[12]=i(" BI 模板 ",-1))]),default:o(()=>[T.value?(u(),x("div",Ie,[t(ue),e[13]||(e[13]=n("div",{style:{color:"var(--text-muted)","margin-top":"8px"}},"加载 BI 模板...",-1))])):k.value.length?(u(),y(j,{key:2,gutter:[16,16]},{default:o(()=>[(u(!0),x(A,null,R(k.value,a=>(u(),y(B,{key:a.id,xs:24,sm:12,lg:8},{default:o(()=>[t(_,{size:"small",hoverable:"",class:"template-card",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:o(()=>[n("div",Be,[t(p(W),{style:{"font-size":"24px",color:"#722ed1","flex-shrink":"0","margin-top":"2px"}}),n("div",je,[n("div",Ne,d(a.name),1),n("div",Se,d(a.description||"暂无描述"),1),a.id?(u(),x("div",Ae,[t(q,{size:"small",color:"purple"},{default:o(()=>[i(d(a.id),1)]),_:2},1024)])):U("",!0)])]),n("div",Re,[t(m,{type:"primary",size:"small",loading:I.value===a.id,onClick:z=>oe(a.id)},{icon:o(()=>[t(p(G))]),default:o(()=>[e[14]||(e[14]=i(" 创建仪表板 ",-1))]),_:1},8,["loading","onClick"])])]),_:2},1024)]),_:2},1024))),128))]),_:1})):(u(),y(V,{key:1,description:"暂无 BI 模板"})),f.value?(u(),y(L,{key:3,message:f.value.success?"仪表板创建成功":"创建失败",type:f.value.success?"success":"error","show-icon":"",closable:"",style:{"margin-top":"16px"},onClose:e[1]||(e[1]=a=>f.value=null)},{description:o(()=>[n("pre",Ue,d(f.value.output),1)]),_:1},8,["message","type"])):U("",!0)]),_:1}),t(N,{key:"prompts"},{tab:o(()=>[t(p(Y)),e[15]||(e[15]=i(" Prompt 模板 ",-1))]),default:o(()=>[n("div",De,[t(m,{type:"primary",onClick:e[2]||(e[2]=a=>w.value=!0)},{icon:o(()=>[t(p(ke))]),default:o(()=>[e[16]||(e[16]=i(" 新建模板 ",-1))]),_:1})]),g.value.length?(u(),y(j,{key:1,gutter:[16,16]},{default:o(()=>[(u(!0),x(A,null,R(g.value,(a,z)=>(u(),y(B,{key:z,xs:24,sm:12,lg:8},{default:o(()=>[t(_,{size:"small",class:"template-card",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:o(()=>[n("div",Fe,[t(p(Y),{style:{"font-size":"18px",color:"#52c41a"}}),n("span",Ke,d(a.name),1),t(q,{color:re(a.category),size:"small"},{default:o(()=>[i(d(a.category),1)]),_:2},1032,["color"])]),n("div",Le,d(a.content.length>120?a.content.slice(0,120)+"...":a.content),1),n("div",Ve,[t(m,{size:"small",onClick:J=>ie(a)},{icon:o(()=>[t(p(M))]),default:o(()=>[e[17]||(e[17]=i(" 使用 ",-1))]),_:1},8,["onClick"]),t(m,{size:"small",onClick:J=>le(a)},{icon:o(()=>[t(p(we))]),default:o(()=>[e[18]||(e[18]=i(" 复制 ",-1))]),_:1},8,["onClick"]),t(m,{size:"small",danger:"",onClick:J=>se(z)},{icon:o(()=>[t(p(Ce))]),default:o(()=>[e[19]||(e[19]=i(" 删除 ",-1))]),_:1},8,["onClick"])])]),_:2},1024)]),_:2},1024))),128))]),_:1})):(u(),y(V,{key:0,description:"暂无 Prompt 模板,点击上方按钮创建"}))]),_:1})]),_:1},8,["activeKey"]),t(E,{open:b.value,"onUpdate:open":e[4]||(e[4]=a=>b.value=a),title:"确认初始化",onOk:ee,onCancel:e[5]||(e[5]=a=>b.value=!1),"ok-text":"确认","cancel-text":"取消"},{default:o(()=>[n("p",null,[e[20]||(e[20]=i("确定要使用模板 ",-1)),n("strong",null,d($.value),1),e[21]||(e[21]=i(" 初始化项目吗?",-1))]),e[22]||(e[22]=n("p",{style:{color:"var(--text-muted)","font-size":"12px"}},"这将在当前工作目录创建项目结构。",-1))]),_:1},8,["open"]),t(E,{open:w.value,"onUpdate:open":e[9]||(e[9]=a=>w.value=a),title:"新建 Prompt 模板",onOk:ne,onCancel:K,"ok-text":"保存","cancel-text":"取消","ok-button-props":{disabled:!r.name||!r.content}},{default:o(()=>[t(ve,{layout:"vertical"},{default:o(()=>[t(S,{label:"模板名称",required:""},{default:o(()=>[t(ce,{value:r.name,"onUpdate:value":e[6]||(e[6]=a=>r.name=a),placeholder:"输入模板名称"},null,8,["value"])]),_:1}),t(S,{label:"分类"},{default:o(()=>[t(de,{value:r.category,"onUpdate:value":e[7]||(e[7]=a=>r.category=a),style:{width:"100%"}},{default:o(()=>[t(C,{value:"general"},{default:o(()=>[...e[23]||(e[23]=[i("general",-1)])]),_:1}),t(C,{value:"code"},{default:o(()=>[...e[24]||(e[24]=[i("code",-1)])]),_:1}),t(C,{value:"writing"},{default:o(()=>[...e[25]||(e[25]=[i("writing",-1)])]),_:1}),t(C,{value:"analysis"},{default:o(()=>[...e[26]||(e[26]=[i("analysis",-1)])]),_:1})]),_:1},8,["value"])]),_:1}),t(S,{label:"模板内容",required:""},{default:o(()=>[t(me,{value:r.content,"onUpdate:value":e[8]||(e[8]=a=>r.content=a),rows:6,placeholder:"输入 Prompt 模板内容"},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","ok-button-props"])])}}},Ye=xe(qe,[["__scopeId","data-v-22e50acf"]]);export{Ye as default};
|
|
1
|
+
import{o as fe,a3 as x,a1 as n,k as t,Z as o,f as c,X as l,r as ye,$ as ge,Y as u,F as A,a7 as R,u as p,a5 as d,G as i,W as y,a4 as U}from"./vendor-CN0Iv_qZ.js";import{u as _e}from"./ws-Dma34ig_.js";import{_ as xe}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{R as M,z as G,c as be,n as W,O as ke,b as Y,a6 as we,a5 as Ce,N as h}from"./antd-Dh2t0vGq.js";const ze={style:{display:"flex","align-items":"flex-start",gap:"10px"}},he={style:{flex:"1","min-width":"0"}},Oe={style:{"font-weight":"500",color:"#e0e0e0","font-size":"14px","font-family":"monospace","margin-bottom":"4px"}},Pe={style:{color:"var(--text-secondary)","font-size":"12px","line-height":"1.5"}},$e={style:{"margin-top":"12px","text-align":"right"}},Te={style:{margin:"0","font-size":"12px","white-space":"pre-wrap","max-height":"200px","overflow-y":"auto"}},Ie={key:0,style:{"text-align":"center",padding:"40px"}},Be={style:{display:"flex","align-items":"flex-start",gap:"10px"}},je={style:{flex:"1","min-width":"0"}},Ne={style:{"font-weight":"500",color:"#e0e0e0","font-size":"14px","margin-bottom":"4px"}},Se={style:{color:"var(--text-secondary)","font-size":"12px","line-height":"1.5"}},Ae={key:0,style:{"margin-top":"4px"}},Re={style:{"margin-top":"12px","text-align":"right"}},Ue={style:{margin:"0","font-size":"12px","white-space":"pre-wrap","max-height":"200px","overflow-y":"auto"}},De={style:{"margin-bottom":"16px"}},Fe={style:{display:"flex","align-items":"center",gap:"8px","margin-bottom":"8px"}},Ke={style:{"font-weight":"500",color:"#e0e0e0","font-size":"14px",flex:"1",overflow:"hidden","text-overflow":"ellipsis","white-space":"nowrap"}},Le={style:{color:"var(--text-secondary)","font-size":"12px","line-height":"1.5","max-height":"60px",overflow:"hidden","text-overflow":"ellipsis","white-space":"pre-wrap"}},Ve={style:{"margin-top":"12px",display:"flex",gap:"8px","justify-content":"flex-end"}},X="cc_prompt_templates",qe={__name:"Templates",setup(Ee){const O=_e(),Z=ge(),D=c("project"),P=c(""),v=c(null),b=c(!1),$=c(""),H=[{name:"code-project",description:"代码项目 — 代码审查、重构、单元测试"},{name:"data-science",description:"数据科学 — ML/数据分析、可视化"},{name:"devops",description:"DevOps — 基础设施、部署、监控"},{name:"medical-triage",description:"医疗分诊 — 症状分析、分诊建议"},{name:"agriculture-expert",description:"农业专家 — 作物管理、病虫害"},{name:"general-assistant",description:"通用助手 — 日常问答、任务管理"},{name:"ai-media-creator",description:"AI 媒体创作 — 图文生成、视频脚本"},{name:"ai-doc-creator",description:"AI 文档创作 — 文档生成、格式转换"},{name:"empty",description:"空白模板 — 最小项目结构"}];function Q(s){$.value=s,b.value=!0}async function ee(){b.value=!1;const s=$.value;if(s){P.value=s,v.value=null;try{const e=`init --template ${s} --yes`,{output:m,exitCode:_}=await O.execute(e,3e4);v.value={success:_===0,output:m}}catch(e){v.value={success:!1,output:`初始化失败: ${e.message}`}}finally{P.value=""}}}const T=c(!1),k=c([]),I=c(""),f=c(null);async function te(){T.value=!0;try{const{output:s}=await O.execute("bi templates --json",15e3),e=JSON.parse(s);k.value=Array.isArray(e)?e:e.templates||[]}catch{k.value=[]}finally{T.value=!1}}async function oe(s){I.value=s,f.value=null;try{const e=`bi dashboard create --template ${s} --json`,{output:m,exitCode:_}=await O.execute(e,3e4);f.value={success:_===0,output:m}}catch(e){f.value={success:!1,output:`创建失败: ${e.message}`}}finally{I.value=""}}const g=c([]),w=c(!1),r=ye({name:"",category:"general",content:""});function ae(){try{const s=localStorage.getItem(X);g.value=s?JSON.parse(s):[]}catch{g.value=[]}}function F(){localStorage.setItem(X,JSON.stringify(g.value))}function ne(){!r.name||!r.content||(g.value.push({name:r.name,category:r.category,content:r.content}),F(),K(),h.success("模板已保存"))}function K(){w.value=!1,r.name="",r.category="general",r.content=""}function se(s){g.value.splice(s,1),F(),h.success("模板已删除")}function le(s){navigator.clipboard.writeText(s.content).then(()=>{h.success("已复制到剪贴板")}).catch(()=>{h.error("复制失败")})}function ie(s){Z.push({path:"/chat",query:{prompt:s.content}})}function re(s){return{general:"blue",code:"green",writing:"orange",analysis:"purple"}[s]||"default"}return fe(()=>{ae(),te()}),(s,e)=>{const m=l("a-button"),_=l("a-card"),B=l("a-col"),j=l("a-row"),L=l("a-alert"),N=l("a-tab-pane"),ue=l("a-spin"),V=l("a-empty"),q=l("a-tag"),pe=l("a-tabs"),E=l("a-modal"),ce=l("a-input"),S=l("a-form-item"),C=l("a-select-option"),de=l("a-select"),me=l("a-textarea"),ve=l("a-form");return u(),x("div",null,[e[27]||(e[27]=n("div",{style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},[n("div",null,[n("h2",{class:"page-title"},"模板中心"),n("p",{class:"page-sub"},"项目模板 / BI 模板 / Prompt 模板")])],-1)),t(pe,{activeKey:D.value,"onUpdate:activeKey":e[3]||(e[3]=a=>D.value=a),type:"card"},{default:o(()=>[t(N,{key:"project"},{tab:o(()=>[t(p(be)),e[10]||(e[10]=i(" 项目模板 ",-1))]),default:o(()=>[t(j,{gutter:[16,16]},{default:o(()=>[(u(),x(A,null,R(H,a=>t(B,{key:a.name,xs:24,sm:12,lg:8},{default:o(()=>[t(_,{size:"small",hoverable:"",class:"template-card",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:o(()=>[n("div",ze,[t(p(M),{style:{"font-size":"24px",color:"#1677ff","flex-shrink":"0","margin-top":"2px"}}),n("div",he,[n("div",Oe,d(a.name),1),n("div",Pe,d(a.description),1)])]),n("div",$e,[t(m,{type:"primary",size:"small",loading:P.value===a.name,onClick:z=>Q(a.name)},{icon:o(()=>[t(p(G))]),default:o(()=>[e[11]||(e[11]=i(" 初始化 ",-1))]),_:1},8,["loading","onClick"])])]),_:2},1024)]),_:2},1024)),64))]),_:1}),v.value?(u(),y(L,{key:0,message:v.value.success?"初始化成功":"初始化失败",type:v.value.success?"success":"error","show-icon":"",closable:"",style:{"margin-top":"16px"},onClose:e[0]||(e[0]=a=>v.value=null)},{description:o(()=>[n("pre",Te,d(v.value.output),1)]),_:1},8,["message","type"])):U("",!0)]),_:1}),t(N,{key:"bi"},{tab:o(()=>[t(p(W)),e[12]||(e[12]=i(" BI 模板 ",-1))]),default:o(()=>[T.value?(u(),x("div",Ie,[t(ue),e[13]||(e[13]=n("div",{style:{color:"var(--text-muted)","margin-top":"8px"}},"加载 BI 模板...",-1))])):k.value.length?(u(),y(j,{key:2,gutter:[16,16]},{default:o(()=>[(u(!0),x(A,null,R(k.value,a=>(u(),y(B,{key:a.id,xs:24,sm:12,lg:8},{default:o(()=>[t(_,{size:"small",hoverable:"",class:"template-card",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:o(()=>[n("div",Be,[t(p(W),{style:{"font-size":"24px",color:"#722ed1","flex-shrink":"0","margin-top":"2px"}}),n("div",je,[n("div",Ne,d(a.name),1),n("div",Se,d(a.description||"暂无描述"),1),a.id?(u(),x("div",Ae,[t(q,{size:"small",color:"purple"},{default:o(()=>[i(d(a.id),1)]),_:2},1024)])):U("",!0)])]),n("div",Re,[t(m,{type:"primary",size:"small",loading:I.value===a.id,onClick:z=>oe(a.id)},{icon:o(()=>[t(p(G))]),default:o(()=>[e[14]||(e[14]=i(" 创建仪表板 ",-1))]),_:1},8,["loading","onClick"])])]),_:2},1024)]),_:2},1024))),128))]),_:1})):(u(),y(V,{key:1,description:"暂无 BI 模板"})),f.value?(u(),y(L,{key:3,message:f.value.success?"仪表板创建成功":"创建失败",type:f.value.success?"success":"error","show-icon":"",closable:"",style:{"margin-top":"16px"},onClose:e[1]||(e[1]=a=>f.value=null)},{description:o(()=>[n("pre",Ue,d(f.value.output),1)]),_:1},8,["message","type"])):U("",!0)]),_:1}),t(N,{key:"prompts"},{tab:o(()=>[t(p(Y)),e[15]||(e[15]=i(" Prompt 模板 ",-1))]),default:o(()=>[n("div",De,[t(m,{type:"primary",onClick:e[2]||(e[2]=a=>w.value=!0)},{icon:o(()=>[t(p(ke))]),default:o(()=>[e[16]||(e[16]=i(" 新建模板 ",-1))]),_:1})]),g.value.length?(u(),y(j,{key:1,gutter:[16,16]},{default:o(()=>[(u(!0),x(A,null,R(g.value,(a,z)=>(u(),y(B,{key:z,xs:24,sm:12,lg:8},{default:o(()=>[t(_,{size:"small",class:"template-card",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:o(()=>[n("div",Fe,[t(p(Y),{style:{"font-size":"18px",color:"#52c41a"}}),n("span",Ke,d(a.name),1),t(q,{color:re(a.category),size:"small"},{default:o(()=>[i(d(a.category),1)]),_:2},1032,["color"])]),n("div",Le,d(a.content.length>120?a.content.slice(0,120)+"...":a.content),1),n("div",Ve,[t(m,{size:"small",onClick:J=>ie(a)},{icon:o(()=>[t(p(M))]),default:o(()=>[e[17]||(e[17]=i(" 使用 ",-1))]),_:1},8,["onClick"]),t(m,{size:"small",onClick:J=>le(a)},{icon:o(()=>[t(p(we))]),default:o(()=>[e[18]||(e[18]=i(" 复制 ",-1))]),_:1},8,["onClick"]),t(m,{size:"small",danger:"",onClick:J=>se(z)},{icon:o(()=>[t(p(Ce))]),default:o(()=>[e[19]||(e[19]=i(" 删除 ",-1))]),_:1},8,["onClick"])])]),_:2},1024)]),_:2},1024))),128))]),_:1})):(u(),y(V,{key:0,description:"暂无 Prompt 模板,点击上方按钮创建"}))]),_:1})]),_:1},8,["activeKey"]),t(E,{open:b.value,"onUpdate:open":e[4]||(e[4]=a=>b.value=a),title:"确认初始化",onOk:ee,onCancel:e[5]||(e[5]=a=>b.value=!1),"ok-text":"确认","cancel-text":"取消"},{default:o(()=>[n("p",null,[e[20]||(e[20]=i("确定要使用模板 ",-1)),n("strong",null,d($.value),1),e[21]||(e[21]=i(" 初始化项目吗?",-1))]),e[22]||(e[22]=n("p",{style:{color:"var(--text-muted)","font-size":"12px"}},"这将在当前工作目录创建项目结构。",-1))]),_:1},8,["open"]),t(E,{open:w.value,"onUpdate:open":e[9]||(e[9]=a=>w.value=a),title:"新建 Prompt 模板",onOk:ne,onCancel:K,"ok-text":"保存","cancel-text":"取消","ok-button-props":{disabled:!r.name||!r.content}},{default:o(()=>[t(ve,{layout:"vertical"},{default:o(()=>[t(S,{label:"模板名称",required:""},{default:o(()=>[t(ce,{value:r.name,"onUpdate:value":e[6]||(e[6]=a=>r.name=a),placeholder:"输入模板名称"},null,8,["value"])]),_:1}),t(S,{label:"分类"},{default:o(()=>[t(de,{value:r.category,"onUpdate:value":e[7]||(e[7]=a=>r.category=a),style:{width:"100%"}},{default:o(()=>[t(C,{value:"general"},{default:o(()=>[...e[23]||(e[23]=[i("general",-1)])]),_:1}),t(C,{value:"code"},{default:o(()=>[...e[24]||(e[24]=[i("code",-1)])]),_:1}),t(C,{value:"writing"},{default:o(()=>[...e[25]||(e[25]=[i("writing",-1)])]),_:1}),t(C,{value:"analysis"},{default:o(()=>[...e[26]||(e[26]=[i("analysis",-1)])]),_:1})]),_:1},8,["value"])]),_:1}),t(S,{label:"模板内容",required:""},{default:o(()=>[t(me,{value:r.content,"onUpdate:value":e[8]||(e[8]=a=>r.content=a),rows:6,placeholder:"输入 Prompt 模板内容"},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","ok-button-props"])])}}},Ye=xe(qe,[["__scopeId","data-v-22e50acf"]]);export{Ye as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.asset-item[data-v-301515b7]{padding:8px;border:1px solid var(--border-color);border-radius:6px;margin-bottom:8px;cursor:pointer;transition:border-color .2s}.asset-item[data-v-301515b7]:hover{border-color:#1890ff}.asset-item.active[data-v-301515b7]{border-color:#1890ff;background:#1890ff14}.timeline-container[data-v-301515b7]{display:flex;height:28px;border-radius:4px;overflow:hidden;gap:1px}.timeline-section[data-v-301515b7]{background:#1890ff;display:flex;align-items:center;justify-content:center;min-width:0;transition:all .3s}.timeline-section[data-v-301515b7]:nth-child(2n){background:#52c41a}.timeline-section[data-v-301515b7]:nth-child(3n){background:#faad14}.timeline-section[data-v-301515b7]:nth-child(5n){background:#eb2f96}.timeline-label[data-v-301515b7]{font-size:10px;color:#fff;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding:0 4px}.event-log[data-v-301515b7]{max-height:200px;overflow-y:auto;font-family:monospace;font-size:11px}.event-item[data-v-301515b7]{padding:2px 0;border-bottom:1px solid var(--border-color)}.event-type[data-v-301515b7]{color:#1890ff;margin-right:8px}.event-detail[data-v-301515b7]{color:var(--text-muted)}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{u as Q}from"./ws-Dma34ig_.js";import{_ as tt}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{q as et,N as E}from"./antd-Dh2t0vGq.js";import{o as at,a3 as d,a1 as r,k as a,Z as s,f as m,X as c,Y as i,G as _,u as nt,W as S,F as D,a7 as V,a2 as ot,a5 as p,a4 as x,a8 as st,r as lt,n as it}from"./vendor-CN0Iv_qZ.js";const rt={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},ut={key:1,style:{color:"var(--text-muted)","text-align":"center",padding:"20px"}},dt={key:2},ct=["onClick"],pt={style:{"font-weight":"500","font-family":"monospace","font-size":"12px"}},vt={style:{color:"var(--text-muted)","font-size":"11px","word-break":"break-all"}},ft={style:{color:"var(--text-muted)","font-size":"11px"}},mt={style:{display:"flex",gap:"8px","margin-top":"12px"}},_t={key:0,style:{color:"var(--text-muted)","text-align":"center",padding:"20px"}},ht={key:1},gt={style:{display:"flex","align-items":"center",gap:"8px","margin-bottom":"4px"}},yt={style:{"font-weight":"500"}},bt={key:0,style:{color:"var(--text-muted)","font-size":"12px"}},xt={key:1,style:{color:"var(--text-muted)","font-size":"11px"}},kt={class:"timeline-container"},Pt=["title"],wt={class:"timeline-label"},Ct={style:{color:"var(--text-muted)","font-size":"11px","margin-top":"4px"}},zt={class:"event-type"},St={class:"event-detail"},Rt={style:{"text-align":"center"}},$t={style:{color:"var(--text-muted)","margin-bottom":"8px"}},Ut={__name:"VideoEditing",setup(Dt){const k=Q(),R=m([]),M=m(!1),P=m(null),v=m(!1),$=m([]),w=m([]),h=m(null),C=m(null),U=m(null);let N=null;const o=lt({videoPath:"",audioPath:"",existingSrt:"",instruction:"",fps:2,mainCharacter:"",outputPath:"./output.mp4"});at(()=>{A()});async function A(){M.value=!0;try{await k.waitConnected();const n=await k.sendRaw({type:"video.assets.list"});R.value=n.assets||[]}catch{R.value=[]}finally{M.value=!1}}function B(n,t){$.value=[],w.value=[],h.value=null,C.value=null,v.value=!0;const u=`video-${Date.now()}`;N=u;const y=k.onMessage(l=>{l.id===u&&(l.type==="stream.event"&&l.event&&L(l.event),l.type===`${n}.end`&&(v.value=!1,y(),l.ok?(l.shotPlan&&(h.value=l.shotPlan),l.outputPath&&(C.value=l.outputPath),l.assetDir&&A(),E.success("完成")):E.error(l.error?.message||"失败")))});k.sendRaw({type:n,id:u,...t}).catch(()=>{v.value=!1,y()})}function L(n){if($.value.push(n),n.type==="phase.start")w.value.push({phase:n.phase,pct:0,message:"",done:!1});else if(n.type==="phase.progress"){const t=w.value.find(u=>u.phase===n.phase);t&&(t.pct=n.pct,t.message=n.message||"")}else if(n.type==="phase.end"){const t=w.value.find(u=>u.phase===n.phase);t&&(t.pct=1,t.done=!0)}it(()=>{U.value&&(U.value.scrollTop=U.value.scrollHeight)})}function T(){B("video.edit",{videoPath:o.videoPath,audioPath:o.audioPath||void 0,instruction:o.instruction,outputPath:o.outputPath,existingSrt:o.existingSrt||void 0,fps:o.fps,mainCharacter:o.mainCharacter||void 0})}function W(){B("video.deconstruct",{videoPath:o.videoPath,audioPath:o.audioPath||void 0,existingSrt:o.existingSrt||void 0,fps:o.fps})}function q(){P.value&&B("video.plan",{assetDir:P.value.hash,instruction:o.instruction,mainCharacter:o.mainCharacter||void 0})}function I(){N&&k.sendRaw({type:"cancel",id:N}).catch(()=>{}),v.value=!1}function j(n){return n.done?"success":n.pct>0?"processing":"default"}function G(n){const t=(h.value?.sections||[]).reduce((y,l)=>y+(l.music_segment?.end||0)-(l.music_segment?.start||0),0),u=((n.music_segment?.end||0)-(n.music_segment?.start||0))/(t||1)*100;return Math.max(u,2)}function H(n){return n.phase?n.message||n.phase:n.tool?`${n.agent}.${n.tool}`:n.reason?n.reason:""}function J(n){navigator.clipboard?.writeText(n),E.success("已复制")}return(n,t)=>{const u=c("a-button"),y=c("a-spin"),l=c("a-card"),b=c("a-col"),z=c("a-input"),g=c("a-form-item"),O=c("a-textarea"),X=c("a-input-number"),F=c("a-row"),Y=c("a-form"),Z=c("a-badge"),K=c("a-progress");return i(),d("div",null,[r("div",rt,[t[9]||(t[9]=r("div",null,[r("h2",{class:"page-title"},"视频剪辑"),r("p",{class:"page-sub"},"长视频素材 + 音乐 → 节奏化蒙太奇(CutClaw 风格)")],-1)),a(u,{type:"primary",ghost:"",onClick:A},{icon:s(()=>[a(nt(et))]),default:s(()=>[t[8]||(t[8]=_(" 刷新资产 ",-1))]),_:1})]),a(F,{gutter:16},{default:s(()=>[a(b,{span:6},{default:s(()=>[a(l,{title:"素材库",size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:s(()=>[M.value?(i(),S(y,{key:0})):R.value.length===0?(i(),d("div",ut,[...t[10]||(t[10]=[_(" 暂无已解构素材",-1),r("br",null,null,-1),_("请先执行解构 ",-1)])])):(i(),d("div",dt,[(i(!0),d(D,null,V(R.value,e=>(i(),d("div",{key:e.hash,class:ot(["asset-item",{active:P.value?.hash===e.hash}]),onClick:f=>P.value=e},[r("div",pt,p(e.hash),1),r("div",vt,p(e.videoPath),1),r("div",ft,p(e.modifiedAt?.slice(0,10)),1)],10,ct))),128))]))]),_:1})]),_:1}),a(b,{span:10},{default:s(()=>[a(l,{title:"编辑工作台",size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:s(()=>[a(Y,{layout:"vertical",style:{"max-width":"100%"}},{default:s(()=>[a(g,{label:"视频文件"},{default:s(()=>[a(z,{value:o.videoPath,"onUpdate:value":t[0]||(t[0]=e=>o.videoPath=e),placeholder:"/path/to/video.mp4"},null,8,["value"])]),_:1}),a(g,{label:"音乐文件"},{default:s(()=>[a(z,{value:o.audioPath,"onUpdate:value":t[1]||(t[1]=e=>o.audioPath=e),placeholder:"/path/to/bgm.mp3(可选)"},null,8,["value"])]),_:1}),a(g,{label:"字幕文件"},{default:s(()=>[a(z,{value:o.existingSrt,"onUpdate:value":t[2]||(t[2]=e=>o.existingSrt=e),placeholder:"/path/to/subtitle.srt(可选,跳过 ASR)"},null,8,["value"])]),_:1}),a(g,{label:"剪辑指令"},{default:s(()=>[a(O,{value:o.instruction,"onUpdate:value":t[3]||(t[3]=e=>o.instruction=e),rows:3,placeholder:"节奏感强的角色蒙太奇..."},null,8,["value"])]),_:1}),a(F,{gutter:12},{default:s(()=>[a(b,{span:8},{default:s(()=>[a(g,{label:"采样 FPS"},{default:s(()=>[a(X,{value:o.fps,"onUpdate:value":t[4]||(t[4]=e=>o.fps=e),min:1,max:30,style:{width:"100%"}},null,8,["value"])]),_:1})]),_:1}),a(b,{span:8},{default:s(()=>[a(g,{label:"主角名"},{default:s(()=>[a(z,{value:o.mainCharacter,"onUpdate:value":t[5]||(t[5]=e=>o.mainCharacter=e),placeholder:"Joker"},null,8,["value"])]),_:1})]),_:1}),a(b,{span:8},{default:s(()=>[a(g,{label:"输出路径"},{default:s(()=>[a(z,{value:o.outputPath,"onUpdate:value":t[6]||(t[6]=e=>o.outputPath=e),placeholder:"./output.mp4"},null,8,["value"])]),_:1})]),_:1})]),_:1})]),_:1}),r("div",mt,[a(u,{type:"primary",loading:v.value,disabled:!o.videoPath,onClick:T},{default:s(()=>[...t[11]||(t[11]=[_(" 一键剪辑 ",-1)])]),_:1},8,["loading","disabled"]),a(u,{loading:v.value,disabled:!o.videoPath,onClick:W},{default:s(()=>[...t[12]||(t[12]=[_(" 仅解构 ",-1)])]),_:1},8,["loading","disabled"]),a(u,{loading:v.value,disabled:!P.value,onClick:q},{default:s(()=>[...t[13]||(t[13]=[_(" 生成计划 ",-1)])]),_:1},8,["loading","disabled"]),v.value?(i(),S(u,{key:0,danger:"",onClick:I},{default:s(()=>[...t[14]||(t[14]=[_(" 取消 ",-1)])]),_:1})):x("",!0)])]),_:1})]),_:1}),a(b,{span:8},{default:s(()=>[a(l,{title:"进度",size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"16px"}},{default:s(()=>[!v.value&&$.value.length===0?(i(),d("div",_t," 等待开始... ")):(i(),d("div",ht,[(i(!0),d(D,null,V(w.value,(e,f)=>(i(),d("div",{key:f,style:{"margin-bottom":"12px"}},[r("div",gt,[a(Z,{status:j(e)},null,8,["status"]),r("span",yt,p(e.phase),1),e.pct!=null?(i(),d("span",bt,p(Math.round(e.pct*100))+"% ",1)):x("",!0)]),e.pct!=null?(i(),S(K,{key:0,percent:Math.round(e.pct*100),"show-info":!1,size:"small",status:e.done?"success":"active"},null,8,["percent","status"])):x("",!0),e.message?(i(),d("div",xt,p(e.message),1)):x("",!0)]))),128))]))]),_:1}),h.value?(i(),S(l,{key:0,title:"分镜时间轴",size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"16px"}},{default:s(()=>[r("div",kt,[(i(!0),d(D,null,V(h.value.sections||[],(e,f)=>(i(),d("div",{key:f,class:"timeline-section",style:st({width:G(e)+"%"}),title:`Section ${e.section_idx}: ${e.shots?.length||0} shots`},[r("div",wt,p(e.music_segment?.label||f),1)],12,Pt))),128))]),r("div",Ct,p((h.value.sections||[]).length)+" 段 / "+p((h.value.sections||[]).reduce((e,f)=>e+(f.shots?.length||0),0))+" 镜头 ",1)]),_:1})):x("",!0),a(l,{title:"事件日志",size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:s(()=>[r("div",{class:"event-log",ref_key:"eventLogRef",ref:U},[(i(!0),d(D,null,V($.value.slice(-50),(e,f)=>(i(),d("div",{key:f,class:"event-item"},[r("span",zt,p(e.type),1),r("span",St,p(H(e)),1)]))),128))],512)]),_:1}),C.value?(i(),S(l,{key:1,title:"成片预览",size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-top":"16px"}},{default:s(()=>[r("div",Rt,[r("div",$t,p(C.value),1),a(u,{type:"primary",ghost:"",size:"small",onClick:t[7]||(t[7]=e=>J(C.value))},{default:s(()=>[...t[15]||(t[15]=[_("复制路径",-1)])]),_:1})])]),_:1})):x("",!0)]),_:1})]),_:1})])}}},Bt=tt(Ut,[["__scopeId","data-v-301515b7"]]);export{Bt as default};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{u as De}from"./ws-Dma34ig_.js";import{_ as Te}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{N as v,q as J,l as P
|
|
1
|
+
import{u as De}from"./ws-Dma34ig_.js";import{_ as Te}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{N as v,q as J,l as P,a0 as $e,O as re,v as ie}from"./antd-Dh2t0vGq.js";import{o as Se,a3 as _,a1 as x,k as t,Z as s,f,X as u,Y as r,G as m,u as b,W as C,a5 as y,a4 as k,F as We,c as Ue,r as de}from"./vendor-CN0Iv_qZ.js";const Oe={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},Ne={key:0,style:{"text-align":"center",padding:"60px"}},qe={key:0,style:{color:"#e0e0e0","font-family":"monospace","font-size":"12px"}},je={key:1,style:{color:"var(--text-primary)"}},Fe={key:3,style:{color:"#52c41a","font-family":"monospace"}},Le={key:1,style:{color:"var(--text-muted)","font-size":"12px"}},Me={key:0,style:{"text-align":"center",padding:"60px"}},Be={key:0,style:{color:"#e0e0e0"}},Ve={key:2,style:{color:"var(--text-secondary)","font-size":"12px"}},He={key:3,style:{color:"var(--text-muted)","font-family":"monospace","font-size":"12px"}},Ke={key:0,style:{"margin-top":"8px"}},Je={style:{"white-space":"pre-wrap","word-break":"break-all",color:"var(--text-secondary)","font-size":"11px","margin-top":"8px",background:"var(--bg-base)",padding:"10px","border-radius":"6px",border:"1px solid var(--border-color)"}},Pe={key:0,style:{"text-align":"center",padding:"30px"}},Re={key:0,style:{color:"var(--text-secondary)","font-size":"12px","font-family":"monospace"}},Ee={key:2,style:{color:"#e0e0e0","font-family":"monospace"}},Ge={key:3,style:{color:"var(--text-muted)","font-family":"monospace","font-size":"11px"}},Xe={style:{"margin-top":"16px"}},Ye={style:{"font-family":"monospace",color:"#ccc"}},Ze={style:{"font-family":"monospace",color:"#ccc"}},Qe={style:{"font-family":"monospace",color:"#52c41a"}},et={__name:"Wallet",setup(tt){const A=De(),$=f("wallets"),R=f(!1);function E(l){try{return JSON.parse(l)}catch{return null}}async function ue(){R.value=!0;try{$.value==="wallets"?await W():$.value==="assets"?await L():$.value==="transfer"&&await V()}finally{R.value=!1}}function pe(l){l==="assets"&&I.value.length===0&&L(),l==="transfer"&&T.value.length===0&&V()}const N=f(!1),G=f(!1),X=f(""),z=f([]),q=f(!1),S=f(""),ce=[{title:"地址",key:"address",dataIndex:"address",ellipsis:!0},{title:"名称",key:"name",dataIndex:"name",width:"150px"},{title:"默认",key:"isDefault",width:"80px"},{title:"余额",key:"balance",dataIndex:"balance",width:"120px"},{title:"操作",key:"action",width:"100px"}],ne=Ue(()=>{const l=z.value.find(a=>a.isDefault);if(!l||!l.address)return"未设置";const e=l.address;return e.length>16?e.slice(0,8)+"..."+e.slice(-6):e});async function W(){N.value=!0;try{const{output:l}=await A.execute("wallet list --json",15e3),e=E(l);e&&Array.isArray(e)?z.value=e.map((a,i)=>({key:a.address||a.id||i,address:a.address||a.id||"-",name:a.name||a.label||"-",isDefault:a.isDefault||a.default||!1,balance:a.balance??"-"})):e&&e.wallets&&Array.isArray(e.wallets)?z.value=e.wallets.map((a,i)=>({key:a.address||a.id||i,address:a.address||a.id||"-",name:a.name||a.label||"-",isDefault:a.isDefault||a.default||!1,balance:a.balance??"-"})):z.value=fe(l)}catch(l){v.error("加载钱包列表失败: "+l.message)}finally{N.value=!1}}function fe(l){const e=[],a=l.split(`
|
|
2
2
|
`);for(const i of a){const n=i.trim();if(!n||n.startsWith("─")||n.match(/^\d+ wallet/i))continue;const d=n.match(/(0x[a-fA-F0-9]{8,})/);if(d){const H=/default|默认|\*/.test(n),U=n.match(/name[:\s]+(\S+)/i);e.push({key:d[1],address:d[1],name:U?U[1]:"-",isDefault:H,balance:"-"})}}return e}async function me(){if(!S.value.trim()){v.warning("请输入钱包名称");return}G.value=!0;try{const{output:l}=await A.execute(`wallet create --name "${S.value.trim()}" --json`,2e4);l.includes("error")||l.includes("失败")?v.error("创建失败: "+l.slice(0,120)):(v.success("钱包已创建"),q.value=!1,S.value="",await W())}catch(l){v.error("创建失败: "+l.message)}finally{G.value=!1}}async function ye(l){X.value=l;try{const{output:e}=await A.execute(`wallet set-default ${l}`,15e3);e.includes("error")||e.includes("失败")?v.error("设置失败: "+e.slice(0,120)):(v.success("已设为默认钱包"),await W())}catch(e){v.error("设置失败: "+e.message)}finally{X.value=""}}const j=f(!1),Y=f(!1),I=f([]),F=f(!1),g=de({name:"",type:"token",description:""}),ve=[{title:"名称",key:"name",dataIndex:"name",width:"180px"},{title:"类型",key:"type",dataIndex:"type",width:"100px"},{title:"描述",key:"description",dataIndex:"description",ellipsis:!0},{title:"地址",key:"address",dataIndex:"address",ellipsis:!0}];function _e(l){return{token:"blue",nft:"purple",data:"cyan"}[(l||"").toLowerCase()]||"default"}async function L(){j.value=!0;try{const{output:l}=await A.execute("wallet assets --json",15e3),e=E(l);e&&Array.isArray(e)?I.value=e.map((a,i)=>({key:a.id||a.address||i,name:a.name||"-",type:a.type||"-",description:a.description||"",address:a.address||a.id||"-"})):e&&e.assets&&Array.isArray(e.assets)?I.value=e.assets.map((a,i)=>({key:a.id||a.address||i,name:a.name||"-",type:a.type||"-",description:a.description||"",address:a.address||a.id||"-"})):I.value=ge(l)}catch(l){v.error("加载资产列表失败: "+l.message)}finally{j.value=!1}}function ge(l){const e=[],a=l.split(`
|
|
3
3
|
`);for(const i of a){const n=i.trim();if(!n||n.startsWith("─")||n.match(/^\d+ asset/i))continue;const d=n.split(/\s*[|│]\s*/);d.length>=2&&e.push({key:e.length,name:d[0]||"-",type:d[1]||"-",description:d[2]||"",address:d[3]||"-"})}return e}async function ke(){if(!g.name.trim()){v.warning("请输入资产名称");return}Y.value=!0;try{let l=`wallet asset "${g.name.trim()}" --type ${g.type}`;g.description.trim()&&(l+=` --description "${g.description.trim().replace(/"/g,'\\"')}"`),l+=" --json";const{output:e}=await A.execute(l,2e4);e.includes("error")||e.includes("失败")?v.error("注册失败: "+e.slice(0,120)):(v.success("资产已注册"),F.value=!1,g.name="",g.type="token",g.description="",await L())}catch(l){v.error("注册失败: "+l.message)}finally{Y.value=!1}}const M=f(!1),B=f(!1),D=f(!1),w=f(null),T=f([]),c=de({assetId:"",toAddress:"",amount:null}),be=[{title:"时间",key:"time",dataIndex:"time",width:"150px"},{title:"类型",key:"type",dataIndex:"type",width:"80px"},{title:"数量",key:"amount",dataIndex:"amount",width:"100px"},{title:"目标",key:"to",dataIndex:"to",ellipsis:!0}];function xe(){if(!c.assetId.trim()||!c.toAddress.trim()||!c.amount){v.warning("请填写完整的转账信息");return}D.value=!0}async function we(){M.value=!0,w.value=null;try{const l=`wallet transfer ${c.assetId.trim()} ${c.toAddress.trim()} --amount ${c.amount}`,{output:e,exitCode:a}=await A.execute(l,3e4);w.value={success:a===0&&!e.includes("error")&&!e.includes("失败"),output:e||"转账已提交"},w.value.success?(v.success("转账成功"),D.value=!1,await V()):D.value=!1}catch(l){w.value={success:!1,output:"转账失败: "+l.message},D.value=!1}finally{M.value=!1}}async function V(){B.value=!0;try{const{output:l}=await A.execute("wallet history --limit 20 --json",15e3),e=E(l);e&&Array.isArray(e)?T.value=e.map((a,i)=>({key:a.id||a.hash||i,time:a.time||a.timestamp||a.createdAt||"-",type:a.type||a.direction||"-",amount:a.amount??"-",to:a.to||a.recipient||"-"})):e&&e.history&&Array.isArray(e.history)?T.value=e.history.map((a,i)=>({key:a.id||a.hash||i,time:a.time||a.timestamp||a.createdAt||"-",type:a.type||a.direction||"-",amount:a.amount??"-",to:a.to||a.recipient||"-"})):T.value=he(l)}catch(l){v.error("加载交易历史失败: "+l.message)}finally{B.value=!1}}function he(l){const e=[],a=l.split(`
|
|
4
4
|
`);for(const i of a){const n=i.trim();if(!n||n.startsWith("─")||n.match(/^\d+ transaction/i))continue;const d=n.split(/\s*[|│]\s*/);d.length>=3&&e.push({key:e.length,time:d[0]||"-",type:d[1]||"-",amount:d[2]||"-",to:d[3]||"-"})}return e}return Se(()=>{W()}),(l,e)=>{const a=u("a-button"),i=u("a-statistic"),n=u("a-card"),d=u("a-col"),H=u("a-row"),U=u("a-space"),Z=u("a-spin"),K=u("a-tag"),Q=u("a-empty"),ee=u("a-table"),O=u("a-input"),h=u("a-form-item"),te=u("a-form"),ae=u("a-modal"),se=u("a-tab-pane"),le=u("a-select-option"),Ae=u("a-select"),Ce=u("a-input-number"),oe=u("a-descriptions-item"),ze=u("a-descriptions"),Ie=u("a-tabs");return r(),_("div",null,[x("div",Oe,[e[14]||(e[14]=x("div",null,[x("h2",{class:"page-title"},"钱包管理"),x("p",{class:"page-sub"},"资产 / 转账 / 历史")],-1)),t(a,{type:"primary",ghost:"",loading:R.value,onClick:ue},{icon:s(()=>[t(b(J))]),default:s(()=>[e[13]||(e[13]=m(" 刷新 ",-1))]),_:1},8,["loading"])]),t(H,{gutter:[16,16],style:{"margin-bottom":"20px"}},{default:s(()=>[t(d,{xs:24,sm:12,lg:6},{default:s(()=>[t(n,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:s(()=>[t(i,{title:"钱包数量",value:z.value.length,"value-style":{color:"#1677ff",fontSize:"20px"}},{prefix:s(()=>[t(b(P))]),_:1},8,["value"])]),_:1})]),_:1}),t(d,{xs:24,sm:12,lg:6},{default:s(()=>[t(n,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:s(()=>[t(i,{title:"总资产数",value:I.value.length,"value-style":{color:"#52c41a",fontSize:"20px"}},null,8,["value"])]),_:1})]),_:1}),t(d,{xs:24,sm:12,lg:6},{default:s(()=>[t(n,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:s(()=>[t(i,{title:"默认钱包",value:ne.value,"value-style":{color:ne.value!=="未设置"?"#faad14":"#888",fontSize:"14px",fontFamily:"monospace"}},{prefix:s(()=>[t(b(P))]),_:1},8,["value","value-style"])]),_:1})]),_:1}),t(d,{xs:24,sm:12,lg:6},{default:s(()=>[t(n,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:s(()=>[t(i,{title:"总交易数",value:T.value.length,"value-style":{color:"#ff4d4f",fontSize:"20px"}},{prefix:s(()=>[t(b($e))]),_:1},8,["value"])]),_:1})]),_:1})]),_:1}),t(Ie,{activeKey:$.value,"onUpdate:activeKey":e[12]||(e[12]=o=>$.value=o),type:"card",onChange:pe},{default:s(()=>[t(se,{key:"wallets"},{tab:s(()=>[t(b(P)),e[15]||(e[15]=m(" 钱包列表 ",-1))]),default:s(()=>[t(U,{style:{"margin-bottom":"16px"}},{default:s(()=>[t(a,{type:"primary",loading:N.value,onClick:W},{icon:s(()=>[t(b(J))]),default:s(()=>[e[16]||(e[16]=m(" 刷新列表 ",-1))]),_:1},8,["loading"]),t(a,{onClick:e[0]||(e[0]=o=>q.value=!0)},{icon:s(()=>[t(b(re))]),default:s(()=>[e[17]||(e[17]=m(" 创建钱包 ",-1))]),_:1})]),_:1}),N.value?(r(),_("div",Ne,[t(Z,{size:"large"})])):(r(),C(ee,{key:1,columns:ce,"data-source":z.value,pagination:{pageSize:20,showTotal:o=>`共 ${o} 条`},size:"small",style:{background:"var(--bg-card)"},"row-class-name":()=>"wallet-row"},{bodyCell:s(({column:o,record:p})=>[o.key==="address"?(r(),_("span",qe,y(p.address),1)):k("",!0),o.key==="name"?(r(),_("span",je,y(p.name||"-"),1)):k("",!0),o.key==="isDefault"?(r(),C(K,{key:2,color:p.isDefault?"green":"default"},{default:s(()=>[m(y(p.isDefault?"默认":"-"),1)]),_:2},1032,["color"])):k("",!0),o.key==="balance"?(r(),_("span",Fe,y(p.balance??"-"),1)):k("",!0),o.key==="action"?(r(),_(We,{key:4},[p.isDefault?(r(),_("span",Le,"当前默认")):(r(),C(a,{key:0,size:"small",type:"link",loading:X.value===p.address,onClick:at=>ye(p.address)},{default:s(()=>[...e[18]||(e[18]=[m(" 设为默认 ",-1)])]),_:1},8,["loading","onClick"]))],64)):k("",!0)]),emptyText:s(()=>[t(Q,{description:"暂无钱包,点击「创建钱包」添加"})]),_:1},8,["data-source","pagination"])),t(ae,{open:q.value,"onUpdate:open":e[2]||(e[2]=o=>q.value=o),title:"创建钱包","confirm-loading":G.value,onOk:me,"ok-text":"创建","cancel-text":"取消"},{default:s(()=>[t(te,{"label-col":{span:6},"wrapper-col":{span:18},style:{"margin-top":"16px"}},{default:s(()=>[t(h,{label:"钱包名称",required:""},{default:s(()=>[t(O,{value:S.value,"onUpdate:value":e[1]||(e[1]=o=>S.value=o),placeholder:"请输入钱包名称"},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"])]),_:1}),t(se,{key:"assets"},{tab:s(()=>[t(b(P)),e[19]||(e[19]=m(" 资产管理 ",-1))]),default:s(()=>[t(U,{style:{"margin-bottom":"16px"}},{default:s(()=>[t(a,{type:"primary",loading:j.value,onClick:L},{icon:s(()=>[t(b(J))]),default:s(()=>[e[20]||(e[20]=m(" 刷新资产 ",-1))]),_:1},8,["loading"]),t(a,{onClick:e[3]||(e[3]=o=>F.value=!0)},{icon:s(()=>[t(b(re))]),default:s(()=>[e[21]||(e[21]=m(" 注册资产 ",-1))]),_:1})]),_:1}),j.value?(r(),_("div",Me,[t(Z,{size:"large"})])):(r(),C(ee,{key:1,columns:ve,"data-source":I.value,pagination:{pageSize:20,showTotal:o=>`共 ${o} 条`},size:"small",style:{background:"var(--bg-card)"},"row-class-name":()=>"wallet-row"},{bodyCell:s(({column:o,record:p})=>[o.key==="name"?(r(),_("span",Be,y(p.name),1)):k("",!0),o.key==="type"?(r(),C(K,{key:1,color:_e(p.type)},{default:s(()=>[m(y(p.type),1)]),_:2},1032,["color"])):k("",!0),o.key==="description"?(r(),_("span",Ve,y(p.description||"-"),1)):k("",!0),o.key==="address"?(r(),_("span",He,y(p.address||"-"),1)):k("",!0)]),emptyText:s(()=>[t(Q,{description:"暂无资产,点击「注册资产」添加"})]),_:1},8,["data-source","pagination"])),t(ae,{open:F.value,"onUpdate:open":e[7]||(e[7]=o=>F.value=o),title:"注册资产","confirm-loading":Y.value,onOk:ke,"ok-text":"注册","cancel-text":"取消"},{default:s(()=>[t(te,{"label-col":{span:6},"wrapper-col":{span:18},style:{"margin-top":"16px"}},{default:s(()=>[t(h,{label:"资产名称",required:""},{default:s(()=>[t(O,{value:g.name,"onUpdate:value":e[4]||(e[4]=o=>g.name=o),placeholder:"请输入资产名称"},null,8,["value"])]),_:1}),t(h,{label:"资产类型",required:""},{default:s(()=>[t(Ae,{value:g.type,"onUpdate:value":e[5]||(e[5]=o=>g.type=o),placeholder:"请选择类型"},{default:s(()=>[t(le,{value:"token"},{default:s(()=>[...e[22]||(e[22]=[m("Token",-1)])]),_:1}),t(le,{value:"nft"},{default:s(()=>[...e[23]||(e[23]=[m("NFT",-1)])]),_:1}),t(le,{value:"data"},{default:s(()=>[...e[24]||(e[24]=[m("Data",-1)])]),_:1})]),_:1},8,["value"])]),_:1}),t(h,{label:"描述"},{default:s(()=>[t(O,{value:g.description,"onUpdate:value":e[6]||(e[6]=o=>g.description=o),placeholder:"资产描述(可选)"},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"])]),_:1}),t(se,{key:"transfer"},{tab:s(()=>[t(b(ie)),e[25]||(e[25]=m(" 转账 ",-1))]),default:s(()=>[t(H,{gutter:[24,24]},{default:s(()=>[t(d,{xs:24,md:12},{default:s(()=>[t(n,{title:"发起转账",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:s(()=>[t(te,{"label-col":{span:6},"wrapper-col":{span:18}},{default:s(()=>[t(h,{label:"资产 ID",required:""},{default:s(()=>[t(O,{value:c.assetId,"onUpdate:value":e[8]||(e[8]=o=>c.assetId=o),placeholder:"请输入资产 ID"},null,8,["value"])]),_:1}),t(h,{label:"目标地址",required:""},{default:s(()=>[t(O,{value:c.toAddress,"onUpdate:value":e[9]||(e[9]=o=>c.toAddress=o),placeholder:"请输入接收方地址"},null,8,["value"])]),_:1}),t(h,{label:"数量",required:""},{default:s(()=>[t(Ce,{value:c.amount,"onUpdate:value":e[10]||(e[10]=o=>c.amount=o),min:0,step:.01,placeholder:"转账数量",style:{width:"100%"}},null,8,["value"])]),_:1}),t(h,{"wrapper-col":{offset:6,span:18}},{default:s(()=>[t(a,{type:"primary",loading:M.value,disabled:!c.assetId.trim()||!c.toAddress.trim()||!c.amount,onClick:xe},{icon:s(()=>[t(b(ie))]),default:s(()=>[e[26]||(e[26]=m(" 确认转账 ",-1))]),_:1},8,["loading","disabled"])]),_:1})]),_:1}),w.value?(r(),_("div",Ke,[t(K,{color:w.value.success?"green":"red"},{default:s(()=>[m(y(w.value.success?"成功":"失败"),1)]),_:1},8,["color"]),x("pre",Je,y(w.value.output),1)])):k("",!0)]),_:1})]),_:1}),t(d,{xs:24,md:12},{default:s(()=>[t(n,{title:"交易历史",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{extra:s(()=>[t(a,{size:"small",loading:B.value,onClick:V},{icon:s(()=>[t(b(J))]),_:1},8,["loading"])]),default:s(()=>[B.value?(r(),_("div",Pe,[t(Z)])):(r(),C(ee,{key:1,columns:be,"data-source":T.value,pagination:{pageSize:10,showTotal:o=>`共 ${o} 条`,size:"small"},size:"small","row-class-name":()=>"wallet-row"},{bodyCell:s(({column:o,record:p})=>[o.key==="time"?(r(),_("span",Re,y(p.time),1)):k("",!0),o.key==="type"?(r(),C(K,{key:1,color:p.type==="send"?"orange":"green"},{default:s(()=>[m(y(p.type),1)]),_:2},1032,["color"])):k("",!0),o.key==="amount"?(r(),_("span",Ee,y(p.amount),1)):k("",!0),o.key==="to"?(r(),_("span",Ge,y(p.to),1)):k("",!0)]),emptyText:s(()=>[t(Q,{description:"暂无交易记录"})]),_:1},8,["data-source","pagination"]))]),_:1})]),_:1})]),_:1}),t(ae,{open:D.value,"onUpdate:open":e[11]||(e[11]=o=>D.value=o),title:"确认转账","confirm-loading":M.value,onOk:we,"ok-text":"确认","cancel-text":"取消","ok-type":"primary"},{default:s(()=>[x("div",Xe,[e[27]||(e[27]=x("p",{style:{color:"var(--text-primary)"}},"请确认以下转账信息:",-1)),t(ze,{column:1,bordered:"",size:"small",style:{"margin-top":"12px"}},{default:s(()=>[t(oe,{label:"资产 ID"},{default:s(()=>[x("span",Ye,y(c.assetId),1)]),_:1}),t(oe,{label:"目标地址"},{default:s(()=>[x("span",Ze,y(c.toAddress),1)]),_:1}),t(oe,{label:"数量"},{default:s(()=>[x("span",Qe,y(c.amount),1)]),_:1})]),_:1})])]),_:1},8,["open","confirm-loading"])]),_:1})]),_:1},8,["activeKey"])])}}},rt=Te(et,[["__scopeId","data-v-01e6c0f1"]]);export{rt as default};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{u as Oe}from"./ws-Dma34ig_.js";import{_ as Ie}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{N as u,q as le,O as Te,
|
|
1
|
+
import{u as Oe}from"./ws-Dma34ig_.js";import{_ as Ie}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{N as u,q as le,O as Te,a5 as ze,K as ne,a9 as Le,L as oe}from"./antd-Dh2t0vGq.js";import{o as $e,a3 as y,a1 as g,k as a,Z as l,f as r,X as s,Y as i,G as c,u as k,W as O,a5 as m,a4 as h,F as j,a7 as se}from"./vendor-CN0Iv_qZ.js";const De={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},Ne={key:0,style:{"text-align":"center",padding:"60px"}},Pe=["title"],We={key:1,style:{color:"var(--text-primary)"}},Re={key:3,style:{color:"var(--text-secondary)","font-size":"12px"}},je={key:4,style:{color:"var(--text-secondary)","font-size":"12px"}},Ke={key:0,style:{"text-align":"center",padding:"60px"}},Me={style:{color:"#e0e0e0","font-family":"monospace","font-size":"12px"}},qe={style:{color:"var(--text-secondary)","font-size":"12px"}},Be={style:{"margin-top":"16px"}},Ve={key:0,style:{"text-align":"center",padding:"60px"}},Fe={style:{display:"flex","align-items":"center",gap:"16px","margin-bottom":"16px"}},Ee={key:0,style:{"margin-top":"16px"}},Je={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)"}},Ye={key:0,style:{"margin-top":"16px"}},Ze={style:{background:"var(--bg-base)",padding:"16px","border-radius":"6px",border:"1px solid var(--border-color)"}},Ge={__name:"WebAuthn",setup(Xe){const x=Oe(),I=r("webauthn"),K=r(!1);async function re(){K.value=!0;try{I.value==="webauthn"?await N():I.value==="sso"?await J():I.value==="2fa"&&await ee()}finally{K.value=!1}}function ie(t){t==="sso"&&!V.value&&J(),t==="2fa"&&!Z.value&&ee()}function T(t){try{return JSON.parse(t)}catch{return null}}function ue(t){return t?t.length<=16?t:t.slice(0,8)+"..."+t.slice(-8):"-"}const M=r(!1),q=r(!1),L=r([]),$=r(!1),D=r(""),de=[{title:"ID",key:"id",dataIndex:"id",width:"180px"},{title:"名称",key:"name",dataIndex:"name",width:"160px"},{title:"类型",key:"type",dataIndex:"type",width:"120px"},{title:"创建时间",key:"createdAt",dataIndex:"createdAt",width:"180px"},{title:"最后使用",key:"lastUsed",dataIndex:"lastUsed",width:"180px"},{title:"操作",key:"actions",width:"100px",fixed:"right"}];async function N(){M.value=!0;try{const{output:t}=await x.execute("webauthn list --json",15e3),e=T(t);e&&Array.isArray(e)?L.value=e.map((n,v)=>({key:n.id||v,id:n.id||"-",name:n.name||n.displayName||"-",type:n.type||"public-key",createdAt:n.createdAt||n.created||"-",lastUsed:n.lastUsed||n.lastAuthentication||"-"})):e&&e.credentials?L.value=e.credentials.map((n,v)=>({key:n.id||v,id:n.id||"-",name:n.name||n.displayName||"-",type:n.type||"public-key",createdAt:n.createdAt||n.created||"-",lastUsed:n.lastUsed||n.lastAuthentication||"-"})):L.value=ce(t)}catch(t){u.error("加载 WebAuthn 凭证失败: "+t.message)}finally{M.value=!1}}function ce(t){const e=[],n=t.split(`
|
|
2
2
|
`);for(const v of n){const b=v.trim();if(!b||b.startsWith("─")||b.startsWith("No "))continue;const d=b.split(/\s*[|│]\s*/);d.length>=2&&e.push({key:e.length,id:d[0]||"-",name:d[1]||"-",type:d[2]||"public-key",createdAt:d[3]||"-",lastUsed:d[4]||"-"})}return e}async function pe(){const t=D.value.trim();if(!t){u.warning("请输入凭证名称");return}q.value=!0;try{const e=t.replace(/"/g,'\\"'),{output:n}=await x.execute(`webauthn register --name "${e}" --json`,3e4);n.includes("error")||n.includes("失败")?u.error("注册失败: "+n.slice(0,120)):(u.success("WebAuthn 凭证已注册"),$.value=!1,D.value="",await N())}catch(e){u.error("注册失败: "+e.message)}finally{q.value=!1}}async function fe(t){try{const{output:e}=await x.execute(`webauthn delete "${t.id}"`,15e3);e.includes("error")||e.includes("失败")?u.error("删除失败: "+e.slice(0,120)):(u.success("凭证已删除"),await N())}catch(e){u.error("删除失败: "+e.message)}}const B=r(!1),V=r(!1),F=r(!1),P=r(!1),p=r({provider:"",clientId:"",redirectUrl:"",enabled:!1}),f=r({provider:void 0,clientId:"",clientSecret:"",issuerUrl:""}),E=r([]);async function J(){B.value=!0;try{const{output:t}=await x.execute("sso status --json",15e3),e=T(t);if(e)p.value={provider:e.provider||"",clientId:e.clientId||e.client_id||"",redirectUrl:e.redirectUrl||e.redirect_url||e.callbackUrl||"",enabled:e.enabled||e.active||!1};else{const n=t.split(`
|
|
3
3
|
`);for(const v of n){const b=v.trim().match(/^(.+?)\s*[:=:]\s*(.+)$/);if(b){const d=b[1].toLowerCase(),C=b[2].trim();d.includes("provider")?p.value.provider=C:d.includes("client")&&d.includes("id")?p.value.clientId=C:d.includes("redirect")||d.includes("callback")?p.value.redirectUrl=C:(d.includes("status")||d.includes("enabled"))&&(p.value.enabled=/true|enabled|active|已启用/i.test(C))}}}E.value=[{label:"提供商",value:p.value.provider||"未配置",color:p.value.provider?"#1677ff":"#999"},{label:"状态",value:p.value.enabled?"已启用":"未启用",color:p.value.enabled?"#52c41a":"#faad14"}],V.value=!0}catch{p.value={provider:"",clientId:"",redirectUrl:"",enabled:!1},E.value=[{label:"提供商",value:"未配置",color:"#999"},{label:"状态",value:"未启用",color:"#faad14"}],V.value=!0}finally{B.value=!1}}async function ve(){if(!f.value.provider){u.warning("请选择 SSO 提供商");return}if(!f.value.clientId.trim()){u.warning("请输入 Client ID");return}F.value=!0;try{const t=[`config set sso.provider ${f.value.provider}`,`config set sso.clientId ${f.value.clientId.trim()}`];f.value.clientSecret.trim()&&t.push(`config set sso.clientSecret ${f.value.clientSecret.trim()}`),f.value.issuerUrl.trim()&&t.push(`config set sso.issuerUrl ${f.value.issuerUrl.trim()}`);for(const e of t)await x.execute(e,1e4);u.success("SSO 配置已保存"),P.value=!1,await J()}catch(t){u.error("保存失败: "+t.message)}finally{F.value=!1}}const Y=r(!1),Z=r(!1),w=r(!1),U=r(!1),A=r(""),G=r(!1),S=r([]);async function ee(){Y.value=!0;try{const{output:t}=await x.execute("auth 2fa status --json",15e3),e=T(t);e?w.value=e.enabled||e.active||!1:w.value=/enabled|已启用|active/i.test(t),Z.value=!0}catch{w.value=!1,Z.value=!0}finally{Y.value=!1}}async function ye(){U.value=!0,A.value="";try{const{output:t}=await x.execute("auth 2fa enable --type totp --json",2e4);if(t.includes("error")||t.includes("失败"))u.error("启用失败: "+t.slice(0,120));else{const e=T(t);e&&e.secret?A.value=`TOTP Secret: ${e.secret}
|
|
4
4
|
OTP Auth URL: ${e.otpAuthUrl||e.uri||""}`:A.value=t,w.value=!0,u.success("TOTP 已启用")}}catch(t){u.error("启用失败: "+t.message)}finally{U.value=!1}}async function me(){U.value=!0,A.value="";try{const{output:t}=await x.execute("auth 2fa disable",15e3);t.includes("error")||t.includes("失败")?u.error("禁用失败: "+t.slice(0,120)):(w.value=!1,u.success("双因素认证已禁用"))}catch(t){u.error("禁用失败: "+t.message)}finally{U.value=!1}}async function be(){G.value=!0,S.value=[];try{const{output:t}=await x.execute("auth 2fa recovery-codes --json",15e3),e=T(t);if(e&&Array.isArray(e.codes))S.value=e.codes;else if(e&&Array.isArray(e))S.value=e;else{const n=t.split(`
|
package/src/assets/web-panel/assets/{WorkflowEditor-C-SvXbHW.js → WorkflowEditor-DBJhFPMN.js}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{V as H,f as b,o as K,a3 as v,a1 as _,k as s,Z as l,X as p,Y as c,G as m,u as h,W as L,a2 as P,a5 as y,A as X,F as V,a7 as D,a4 as W,c as Z}from"./vendor-CN0Iv_qZ.js";import{u as Q}from"./ws-Dma34ig_.js";import{_ as ee}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{O as te,q as ae,N as C}from"./antd-
|
|
1
|
+
import{V as H,f as b,o as K,a3 as v,a1 as _,k as s,Z as l,X as p,Y as c,G as m,u as h,W as L,a2 as P,a5 as y,A as X,F as V,a7 as D,a4 as W,c as Z}from"./vendor-CN0Iv_qZ.js";import{u as Q}from"./ws-Dma34ig_.js";import{_ as ee}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{O as te,q as ae,N as C}from"./antd-Dh2t0vGq.js";const se=H("workflow",()=>{const f=Q(),o=b([]),t=b(null),x=b([]),w=b("idle"),R=b(!1),z=b(null);async function E(){R.value=!0,z.value=null;try{await f.waitConnected();const e=await f.sendRaw({type:"workflow-list"});return o.value=Array.isArray(e.workflows)?e.workflows:[],o.value}catch(e){throw z.value=e.message,e}finally{R.value=!1}}async function I(e){await f.waitConnected();const n=await f.sendRaw({type:"workflow-get",id:e});return t.value=n.workflow||null,t.value}async function J(e){await f.waitConnected();const n=await f.sendRaw({type:"workflow-save",workflow:e});if(n.saved){const i=o.value.findIndex(r=>r.id===e.id);i>=0?o.value.splice(i,1,e):o.value.push(e)}return n}async function B(e){await f.waitConnected();const n=await f.sendRaw({type:"workflow-remove",id:e});return n.removed&&(o.value=o.value.filter(i=>i.id!==e)),n}async function q(e,{onEvent:n}={}){await f.waitConnected(),x.value=[],w.value="running";const i=f.onMessage(r=>{!r||typeof r.type!="string"||r.type.startsWith("workflow:")&&(x.value.push(r),n&&n(r),r.type==="workflow:done"&&(w.value=r.status||"completed"))});try{return await f.sendRaw({type:"workflow-run",id:e},12e4)}catch(r){throw w.value="failed",z.value=r.message,r}finally{i()}}function M(e){const n=[];if(!e||typeof e!="object")return{valid:!1,errors:["workflow must be an object"]};if(e.id||n.push("id required"),e.name||n.push("name required"),!Array.isArray(e.steps)||e.steps.length===0)n.push("steps required");else{let g=function(u){O.set(u,j);for(const $ of r.get(u)||[]){if(!r.has($)){n.push(`unknown dependency: ${$}`);continue}const A=O.get($);if(A===j){n.push(`cycle via ${u} -> ${$}`);return}A===N&&g($)}O.set(u,S)};const i=new Set;for(const u of e.steps)u.id||n.push("step.id required"),i.has(u.id)&&n.push(`duplicate step id: ${u.id}`),i.add(u.id);const r=new Map;for(const u of e.steps)r.set(u.id,u.dependsOn||[]);const N=0,j=1,S=2,O=new Map([...r.keys()].map(u=>[u,N]));for(const u of r.keys())O.get(u)===N&&g(u)}return{valid:n.length===0,errors:n}}function d(e){return JSON.stringify(e,null,2)}return{workflows:o,current:t,runEvents:x,runStatus:w,loading:R,error:z,list:E,get:I,save:J,remove:B,run:q,validateLocal:M,exportJson:d}}),ne={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},le={style:{flex:"1"}},oe={style:{"font-weight":"500"}},re={style:{color:"#888","font-size":"12px"}},ue={style:{color:"#888","font-size":"12px"}},ie={key:0,style:{"margin-top":"12px",color:"#d32f2f"}},de={style:{color:"#1976d2"}},ce={key:0},pe={key:1},fe={key:2,style:{color:"#555"}},ve={__name:"WorkflowEditor",setup(f){const o=se(),t=b(null),x=b(!1),w=Z(()=>t.value?o.validateLocal(t.value):null);K(()=>o.list().catch(()=>{}));function R(){t.value={id:"",name:"",description:"",steps:[{id:"step1",message:"",dependsOn:[]}]}}async function z(d){try{const e=await o.get(d);e&&(t.value=JSON.parse(JSON.stringify(e)),t.value.steps||(t.value.steps=[]))}catch(e){C.error(`加载失败: ${e.message}`)}}function E(){t.value.steps||(t.value.steps=[]),t.value.steps.push({id:`step${t.value.steps.length+1}`,message:"",dependsOn:[]})}function I(d){t.value.steps.splice(d,1)}async function J(){const d=o.validateLocal(t.value);if(!d.valid){C.error(d.errors[0]);return}try{await o.save(t.value),C.success("保存成功")}catch(e){C.error(`保存失败: ${e.message}`)}}async function B(d){try{await o.remove(d),t.value?.id===d&&(t.value=null),C.success("已删除")}catch(e){C.error(`删除失败: ${e.message}`)}}async function q(){x.value=!0;try{await o.run(t.value.id),C.success(`运行完成:${o.runStatus}`)}catch(d){C.error(`运行失败: ${d.message}`)}finally{x.value=!1}}function M(){const d=o.exportJson(t.value),e=new Blob([d],{type:"application/json"}),n=URL.createObjectURL(e),i=document.createElement("a");i.href=n,i.download=`${t.value.id||"workflow"}.json`,i.click(),URL.revokeObjectURL(n)}return(d,e)=>{const n=p("a-button"),i=p("a-space"),r=p("a-empty"),N=p("a-list-item"),j=p("a-list"),S=p("a-card"),O=p("a-col"),g=p("a-input"),u=p("a-form-item"),$=p("a-divider"),A=p("a-select"),F=p("a-input-group"),G=p("a-textarea"),T=p("a-form"),Y=p("a-row");return c(),v("div",null,[_("div",ne,[e[6]||(e[6]=_("div",null,[_("h2",{class:"page-title"},"工作流编辑器"),_("p",{class:"page-sub"},"创建、编辑、运行 Cowork 工作流(N1 — 初版:表单编辑,画布视图规划中)")],-1)),s(i,null,{default:l(()=>[s(n,{onClick:R,type:"primary"},{icon:l(()=>[s(h(te))]),default:l(()=>[e[4]||(e[4]=m(" 新建 ",-1))]),_:1}),s(n,{ghost:"",loading:h(o).loading,onClick:e[0]||(e[0]=a=>h(o).list())},{icon:l(()=>[s(h(ae))]),default:l(()=>[e[5]||(e[5]=m(" 刷新 ",-1))]),_:1},8,["loading"])]),_:1})]),s(Y,{gutter:16},{default:l(()=>[s(O,{span:8},{default:l(()=>[s(S,{title:"工作流列表",size:"small"},{default:l(()=>[h(o).workflows.length?(c(),L(j,{key:1,"data-source":h(o).workflows,size:"small"},{renderItem:l(({item:a})=>[s(N,{class:P({active:t.value?.id===a.id}),style:{cursor:"pointer"},onClick:U=>z(a.id)},{default:l(()=>[_("div",le,[_("div",oe,y(a.name||a.id),1),_("div",re,y((a.steps||[]).length)+" 步骤 ",1)]),s(n,{size:"small",danger:"",type:"text",onClick:X(U=>B(a.id),["stop"])},{default:l(()=>[...e[7]||(e[7]=[m("删除",-1)])]),_:1},8,["onClick"])]),_:2},1032,["class","onClick"])]),_:1},8,["data-source"])):(c(),L(r,{key:0,description:"暂无工作流"}))]),_:1})]),_:1}),s(O,{span:16},{default:l(()=>[t.value?(c(),L(S,{key:0,size:"small"},{title:l(()=>[m(" 编辑: "+y(t.value.name||t.value.id),1)]),extra:l(()=>[s(i,null,{default:l(()=>[s(n,{size:"small",onClick:M},{default:l(()=>[...e[8]||(e[8]=[m("导出 JSON",-1)])]),_:1}),s(n,{size:"small",loading:x.value,onClick:q,disabled:!t.value.id},{default:l(()=>[...e[9]||(e[9]=[m(" 运行 ",-1)])]),_:1},8,["loading","disabled"]),s(n,{size:"small",type:"primary",onClick:J},{default:l(()=>[...e[10]||(e[10]=[m("保存",-1)])]),_:1})]),_:1})]),default:l(()=>[s(T,{layout:"vertical",model:t.value},{default:l(()=>[s(u,{label:"ID (唯一标识)"},{default:l(()=>[s(g,{value:t.value.id,"onUpdate:value":e[1]||(e[1]=a=>t.value.id=a),placeholder:"my-workflow"},null,8,["value"])]),_:1}),s(u,{label:"名称"},{default:l(()=>[s(g,{value:t.value.name,"onUpdate:value":e[2]||(e[2]=a=>t.value.name=a),placeholder:"我的工作流"},null,8,["value"])]),_:1}),s(u,{label:"描述"},{default:l(()=>[s(g,{value:t.value.description,"onUpdate:value":e[3]||(e[3]=a=>t.value.description=a),placeholder:"(可选)"},null,8,["value"])]),_:1}),s($,null,{default:l(()=>[...e[11]||(e[11]=[m("步骤",-1)])]),_:1}),(c(!0),v(V,null,D(t.value.steps,(a,U)=>(c(),v("div",{key:U,class:"step-card"},[s(i,{style:{width:"100%","margin-bottom":"8px"},direction:"vertical"},{default:l(()=>[s(F,{compact:""},{default:l(()=>[s(g,{value:a.id,"onUpdate:value":k=>a.id=k,placeholder:"step-id",style:{width:"30%"}},null,8,["value","onUpdate:value"]),s(A,{value:a.dependsOn,"onUpdate:value":k=>a.dependsOn=k,mode:"tags",placeholder:"dependsOn",style:{width:"70%"}},null,8,["value","onUpdate:value"])]),_:2},1024),s(G,{value:a.message,"onUpdate:value":k=>a.message=k,rows:2,placeholder:"任务 prompt(支持 \\${step.<id>.summary} 占位)"},null,8,["value","onUpdate:value"]),s(g,{value:a.when,"onUpdate:value":k=>a.when=k,placeholder:"when 条件(可选,如 step.s1.status === 'completed')"},null,8,["value","onUpdate:value"]),s(i,null,{default:l(()=>[s(n,{size:"small",danger:"",onClick:k=>I(U)},{default:l(()=>[...e[12]||(e[12]=[m("删除",-1)])]),_:1},8,["onClick"]),_("span",ue," step "+y(U+1)+" / "+y(t.value.steps.length),1)]),_:2},1024)]),_:2},1024)]))),128)),s(n,{block:"",onClick:E},{default:l(()=>[...e[13]||(e[13]=[m("+ 添加步骤",-1)])]),_:1})]),_:1},8,["model"]),w.value&&!w.value.valid?(c(),v("div",ie,[(c(!0),v(V,null,D(w.value.errors,a=>(c(),v("div",{key:a},"• "+y(a),1))),128))])):W("",!0)]),_:1})):(c(),L(S,{key:1,size:"small"},{default:l(()=>[s(r,{description:"从左侧选择工作流或新建一个"})]),_:1})),h(o).runEvents.length?(c(),L(S,{key:2,size:"small",title:"运行日志",style:{"margin-top":"12px"}},{default:l(()=>[(c(!0),v(V,null,D(h(o).runEvents,(a,U)=>(c(),v("div",{key:U,style:{"font-family":"monospace","font-size":"12px","margin-bottom":"4px"}},[_("span",de,y(a.type),1),a.stepId?(c(),v("span",ce," ["+y(a.stepId)+"]",1)):W("",!0),a.status?(c(),v("span",pe," → "+y(a.status),1)):W("",!0),a.summary?(c(),v("span",fe," — "+y(a.summary),1)):W("",!0)]))),128))]),_:1})):W("",!0)]),_:1})]),_:1})])}}},ge=ee(ve,[["__scopeId","data-v-0d6dcf38"]]);export{ge as default};
|