chainlesschain 0.45.79 → 0.45.81
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/bin/chainlesschain.js +0 -0
- package/package.json +1 -1
- package/src/assets/web-panel/.build-hash +1 -1
- package/src/assets/web-panel/assets/{Analytics-CoH0P1ux.js → Analytics-C1AnPdMx.js} +2 -2
- package/src/assets/web-panel/assets/{AppLayout-Dk1eV3Xp.js → AppLayout-YdvJBMHH.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-Cv97eAjW.js → Backup-D31iZX3l.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-DSbYaPuD.js → Chat-DiXJ3TuK.js} +1 -1
- package/src/assets/web-panel/assets/Cowork-BnrHWwZw.js +7 -0
- package/src/assets/web-panel/assets/Cowork-CcSoS3eX.css +1 -0
- package/src/assets/web-panel/assets/{Cron-BcH0ckxq.js → Cron-DBt1ueXh.js} +2 -2
- package/src/assets/web-panel/assets/Dashboard-BS-tzGNj.css +1 -0
- package/src/assets/web-panel/assets/{Dashboard-DSOE-azo.js → Dashboard-HPh9FcPt.js} +2 -2
- package/src/assets/web-panel/assets/{Git-zd3CuuXJ.js → Git-hwQ1oZHj.js} +2 -2
- package/src/assets/web-panel/assets/{Logs-BUKXg48N.js → Logs-4D9p6PRM.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-WVxDlw0C.js → McpTools-CyAUjbbs.js} +1 -1
- package/src/assets/web-panel/assets/{Memory-BLFTgTpY.js → Memory-BMqOR7S-.js} +2 -2
- package/src/assets/web-panel/assets/{Notes-CFypT876.js → Notes-Cmas8i4E.js} +2 -2
- package/src/assets/web-panel/assets/{Organization-BOOqeyu_.js → Organization-DnSa58Tl.js} +4 -4
- package/src/assets/web-panel/assets/{P2P-D9xrbb8q.js → P2P-BxksIBWs.js} +2 -2
- package/src/assets/web-panel/assets/{Permissions-CidrpFWd.js → Permissions-Bq5Qn2s3.js} +4 -4
- package/src/assets/web-panel/assets/{Projects-D3Ycn8xG.js → Projects-B7EM0uPg.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-D0kMUvHz.js → Providers-DAwgG5KV.js} +2 -2
- package/src/assets/web-panel/assets/{RssFeed-OQLesJxb.js → RssFeed-HSZoRXvS.js} +2 -2
- package/src/assets/web-panel/assets/{Security-BR4hAAkF.js → Security-Cz17qBny.js} +3 -3
- package/src/assets/web-panel/assets/{Services-BFMDfXE5.js → Services-D2EsLq-v.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-BAf_mFKw.js → Skills-C9v-f3vZ.js} +1 -1
- package/src/assets/web-panel/assets/{Tasks-DuNOWfjU.js → Tasks-yMEcU0n7.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-buh__Yll.js → Templates-l7SvlKuB.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-vgS5USvW.js → Wallet-BHWhLWn9.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-BoL2UJ5Z.js → WebAuthn-kWhFYaUK.js} +4 -4
- package/src/assets/web-panel/assets/{antd-BQNxIyr-.js → antd-D6h4fDFf.js} +82 -82
- package/src/assets/web-panel/assets/{chat-BwUxWn7i.js → chat-BYmuDvol.js} +1 -1
- package/src/assets/web-panel/assets/{index-CCRLEutJ.js → index-ByUk2Wmr.js} +2 -2
- package/src/assets/web-panel/assets/{markdown-BeVIhIzs.js → markdown-BZsB-Dsv.js} +1 -1
- package/src/assets/web-panel/assets/ws-Dma34ig_.js +1 -0
- package/src/assets/web-panel/index.html +2 -2
- package/src/gateways/ws/action-protocol.js +101 -0
- package/src/gateways/ws/message-dispatcher.js +3 -0
- package/src/gateways/ws/session-protocol.js +2 -0
- package/src/gateways/ws/ws-agent-handler.js +1 -0
- package/src/gateways/ws/ws-server.js +18 -0
- package/src/gateways/ws/ws-session-gateway.js +1 -0
- package/src/lib/cowork-task-runner.js +55 -3
- package/src/lib/cowork-task-templates.js +105 -0
- package/src/lib/sub-agent-context.js +26 -0
- package/src/runtime/agent-core.js +6 -1
- package/src/runtime/coding-agent-shell-policy.cjs +16 -1
- package/src/assets/web-panel/assets/Cowork-CPqYhoMI.css +0 -1
- package/src/assets/web-panel/assets/Cowork-DY0Jcql7.js +0 -48
- package/src/assets/web-panel/assets/Dashboard-CKeMmCoT.css +0 -1
- package/src/assets/web-panel/assets/ws-B4fo9ew1.js +0 -1
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{V as se,f as T,o as le,b as oe,a3 as p,a1 as l,a5 as o,u as r,k as t,Z as s,W as I,a4 as H,c as S,X as x,$ as ae,Y as i,G as m,a8 as q,F as P,a7 as O}from"./vendor-CN0Iv_qZ.js";import{u as B}from"./ws-
|
|
1
|
+
import{V as se,f as T,o as le,b as oe,a3 as p,a1 as l,a5 as o,u as r,k as t,Z as s,W as I,a4 as H,c as S,X as x,$ as ae,Y as i,G as m,a8 as q,F as P,a7 as O}from"./vendor-CN0Iv_qZ.js";import{u as B}from"./ws-Dma34ig_.js";import{u as ne}from"./chat-BYmuDvol.js";import{_ as re}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{p as ie,F as ue,q as X,c as Y,M as Z,r as de,s as ve,b as J,t as ce,d as pe}from"./antd-D6h4fDFf.js";function me(){return{samples:0,compressedSamples:0,hitRate:0,totalSavedTokens:0,averageSavedTokens:0,totalOriginalTokens:0,totalCompressedTokens:0,netSavingsRate:0,variantDistribution:{},strategyDistribution:[],providerDistribution:[],modelDistribution:[]}}const fe=se("dashboard",()=>{const V=T(!1),j=T(!1),d=T({wsStatus:"disconnected",activeLlm:null,activeModel:null,skillCount:0,sessionCount:0,providerCount:0,appRunning:!1,setupDone:!1,edition:"",mcpCount:null,noteCount:null}),F=T(""),_=T(me()),v=T({windowPreset:"all",provider:"",model:""});let k=null;function D(n=B()){k||(k=n.onRuntimeEvent(c=>{c.type==="compression:summary"?N(c.payload?.summary||{}):c.type==="session:start"?d.value.sessionCount=(d.value.sessionCount||0)+1:c.type==="session:end"&&(d.value.sessionCount=Math.max(0,(d.value.sessionCount||0)-1))}))}function E(){k&&(k(),k=null)}function N(n){_.value={..._.value,...n||{}}}function h(n){return n==="1h"?3600*1e3:n==="24h"?1440*60*1e3:n==="7d"?10080*60*1e3:null}function f(n){d.value.appRunning=n.includes("Desktop app running"),d.value.setupDone=n.includes("Setup completed");const c=n.match(/Edition:\s+(\S+)/i);c&&(d.value.edition=c[1]);const w=n.match(/LLM:\s+(\S+)\s+\(([^)]+)\)/i);if(w)d.value.activeLlm=w[1],d.value.activeModel=w[2];else{const b=n.match(/LLM:\s+(\S+)/i);b&&(d.value.activeLlm=b[1])}}async function g(){const n=B();D(n),j.value=!0;const c={type:"compression-stats",windowMs:h(v.value.windowPreset)};v.value.provider&&(c.provider=v.value.provider),v.value.model&&(c.model=v.value.model);try{const w=await n.sendRaw(c,1e4);N(w.summary||{})}catch{}finally{j.value=!1}}async function W(){const n=B();D(n),V.value=!0,d.value.wsStatus=n.status,F.value="";try{const[c,w]=await Promise.allSettled([n.execute("status",15e3),n.listSessions()]);if(c.status==="fulfilled"){const b=c.value.output;F.value=b.split(`
|
|
2
2
|
`).slice(0,20).join(`
|
|
3
|
-
`),f(_)}w.status==="fulfilled"&&(d.value.sessionCount=w.value.length),Promise.allSettled([n.execute("skill sources",15e3),n.execute("llm providers",15e3)]).then(([_,$])=>{if(_.status==="fulfilled"){const A=_.value.output.match(/(\d+)\s*(?:skills|技能)/i);A&&(d.value.skillCount=parseInt(A[1],10))}if($.status==="fulfilled"){const y=$.value.output.match(/active[:\s]+(\S+)/i);y&&!d.value.activeLlm&&(d.value.activeLlm=y[1])}}),n.execute("mcp servers",1e4).then(({output:_})=>{const $=(_.match(/^[a-z]/gm)||[]).length;d.value.mcpCount=$}).catch(()=>{d.value.mcpCount=0}),await g()}catch{}finally{V.value=!1}}return{loading:V,compressionLoading:j,stats:d,statusLog:F,compression:b,telemetryFilters:v,ensureRuntimeSubscription:D,stopRuntimeSubscription:E,refresh:W,refreshCompression:g,applyCompressionSummary:N,toWindowMs:h}}),ye={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"20px"}},ge={class:"page-sub"},_e={style:{display:"flex","align-items":"center",gap:"12px","flex-wrap":"wrap"}},be={style:{color:"#91caff","font-weight":"600"}},ke={style:{color:"#4a6fa5","font-size":"11px","font-family":"monospace"}},we={class:"stat-header"},Ce={class:"stat-sub"},xe={class:"stat-header"},Se={class:"stat-value",style:{color:"#91caff","font-size":"15px",overflow:"hidden","text-overflow":"ellipsis","white-space":"nowrap"}},he={class:"stat-sub",style:{overflow:"hidden","text-overflow":"ellipsis","white-space":"nowrap"}},$e={class:"stat-header"},Re={class:"stat-value",style:{color:"#1677ff"}},ze={class:"stat-header"},Le={class:"stat-value",style:{color:"#c084fc"}},De={class:"stat-header"},Me={class:"stat-sub"},Te={class:"stat-header"},Pe={class:"stat-value",style:{color:"#13c2c2"}},Oe={class:"stat-header"},je={class:"stat-value",style:{color:"#faad14"}},Fe={class:"status-log"},Ee={class:"telemetry-filter"},Ne={class:"telemetry-filter"},Ae={class:"telemetry-filter"},Ie={class:"telemetry-card"},Ve={class:"telemetry-value"},We={class:"telemetry-sub"},Be={class:"telemetry-card"},Ue={class:"telemetry-value"},Ge={class:"telemetry-sub"},He={class:"telemetry-card"},qe={class:"telemetry-value"},Xe={class:"telemetry-sub"},Ye={class:"telemetry-section"},Ze={key:0,class:"telemetry-empty"},Je={key:1,class:"telemetry-list"},Ke={class:"telemetry-section"},Qe={key:0,class:"telemetry-empty"},et={key:1,class:"telemetry-list"},tt={class:"telemetry-section"},st={key:0,class:"telemetry-empty"},lt={key:1,class:"telemetry-list"},ot={class:"telemetry-section"},at={key:0,class:"telemetry-empty"},nt={key:1,class:"telemetry-list"},rt={style:{color:"#91caff"}},it={style:{color:"var(--text-muted)","font-family":"monospace","font-size":"11px"}},ut={style:{color:"var(--text-secondary)","font-family":"monospace","font-size":"12px"}},dt={__name:"Dashboard",setup(V){const j=ae(),d=B(),F=ne(),b=fe(),v=window.__CC_CONFIG__||{},k=S(()=>v.mode==="project"),D=S(()=>d.status),E=S(()=>b.loading),N=S(()=>b.statusLog),h=S(()=>b.telemetryFilters),f=S(()=>b.compression),g=S(()=>b.stats),W=S(()=>Object.entries(f.value.variantDistribution||{})),n=S(()=>f.value.providerDistribution||[]),c=S(()=>f.value.modelDistribution||[]);async function w(){await b.refresh()}async function _(){await b.refreshCompression()}function $(y){return`${((y||0)*100).toFixed(1)}%`}async function A(){await F.createSession("agent"),j.push("/chat")}return le(()=>{b.ensureRuntimeSubscription(d),setTimeout(w,300)}),oe(()=>{b.stopRuntimeSubscription()}),(y,e)=>{const z=x("a-button"),U=x("a-tag"),C=x("a-card"),K=x("a-badge"),u=x("a-col"),R=x("a-row"),Q=x("a-space"),L=x("a-select-option"),G=x("a-select"),M=x("a-descriptions-item"),ee=x("a-descriptions");return i(),p("div",null,[l("div",ye,[l("div",null,[e[13]||(e[13]=l("h2",{class:"page-title"},"仪表板",-1)),l("p",ge,o(k.value?`项目「${r(v).projectName||"未命名"}」运行概览`:"ChainlessChain 全局运行概览"),1)]),t(z,{type:"primary",ghost:"",loading:E.value,onClick:w},{icon:s(()=>[t(r(ie))]),default:s(()=>[e[14]||(e[14]=m(" 刷新 ",-1))]),_:1},8,["loading"])]),k.value?(i(),I(C,{key:0,style:{background:"rgba(22,119,255,.08)","border-color":"rgba(22,119,255,.25)","margin-bottom":"16px"},size:"small"},{default:s(()=>[l("div",_e,[t(r(ue),{style:{color:"#1677ff","font-size":"18px"}}),l("div",null,[l("div",be,o(r(v).projectName||"项目"),1),l("div",ke,o(r(v).projectRoot),1)]),t(U,{color:"blue",style:{"margin-left":"auto"}},{default:s(()=>[...e[15]||(e[15]=[m("项目面板",-1)])]),_:1})])]),_:1})):H("",!0),t(R,{gutter:[12,12],style:{"margin-bottom":"16px"}},{default:s(()=>[t(u,{xs:24,sm:12,lg:6},{default:s(()=>[t(C,{class:"stat-card gateway-card",size:"small"},{default:s(()=>[l("div",we,[e[16]||(e[16]=l("span",{class:"stat-label"},"WebSocket Gateway",-1)),t(K,{status:D.value==="connected"?"success":"error"},null,8,["status"])]),l("div",{class:"stat-value",style:q({color:D.value==="connected"?"#52c41a":"#888"})},o(D.value==="connected"?"运行中":"未连接"),5),l("div",Ce,"端口 "+o(r(v).wsPort||18800)+" · "+o(r(v).wsHost||"127.0.0.1"),1)]),_:1})]),_:1}),t(u,{xs:24,sm:12,lg:6},{default:s(()=>[t(C,{class:"stat-card",size:"small"},{default:s(()=>[l("div",xe,[e[17]||(e[17]=l("span",{class:"stat-label"},"当前 LLM",-1)),t(r(X),{style:{color:"#1677ff"}})]),l("div",Se,o(g.value.activeLlm||"未配置"),1),l("div",he,o(g.value.activeModel||"—"),1)]),_:1})]),_:1}),t(u,{xs:24,sm:12,lg:6},{default:s(()=>[t(C,{class:"stat-card",size:"small",style:{cursor:"pointer"},onClick:e[0]||(e[0]=a=>y.$router.push("/skills"))},{default:s(()=>[l("div",$e,[e[18]||(e[18]=l("span",{class:"stat-label"},"可用技能",-1)),t(r(Y),{style:{color:"#1677ff"}})]),l("div",Re,o(g.value.skillCount||"—"),1),e[19]||(e[19]=l("div",{class:"stat-sub"},"点击管理技能",-1))]),_:1})]),_:1}),t(u,{xs:24,sm:12,lg:6},{default:s(()=>[t(C,{class:"stat-card",size:"small",style:{cursor:"pointer"},onClick:e[1]||(e[1]=a=>y.$router.push("/chat"))},{default:s(()=>[l("div",ze,[e[20]||(e[20]=l("span",{class:"stat-label"},"AI 会话",-1)),t(r(Z),{style:{color:"#722ed1"}})]),l("div",Le,o(g.value.sessionCount),1),e[21]||(e[21]=l("div",{class:"stat-sub"},"点击进入对话",-1))]),_:1})]),_:1})]),_:1}),t(R,{gutter:[12,12],style:{"margin-bottom":"16px"}},{default:s(()=>[t(u,{xs:24,sm:8},{default:s(()=>[t(C,{class:"stat-card",size:"small"},{default:s(()=>[l("div",De,[e[22]||(e[22]=l("span",{class:"stat-label"},"应用状态",-1)),t(r(de),{style:q({color:g.value.appRunning?"#52c41a":"#888"})},null,8,["style"])]),l("div",{class:"stat-value",style:q({color:g.value.appRunning?"#52c41a":"#888",fontSize:"15px"})},o(g.value.appRunning?"运行中":g.value.setupDone?"已初始化":"未启动"),5),l("div",Me,o(g.value.edition||"Community")+" Edition",1)]),_:1})]),_:1}),t(u,{xs:24,sm:8},{default:s(()=>[t(C,{class:"stat-card",size:"small",style:{cursor:"pointer"},onClick:e[2]||(e[2]=a=>y.$router.push("/mcp"))},{default:s(()=>[l("div",Te,[e[23]||(e[23]=l("span",{class:"stat-label"},"MCP 工具",-1)),t(r(ve),{style:{color:"#13c2c2"}})]),l("div",Pe,o(g.value.mcpCount??"—"),1),e[24]||(e[24]=l("div",{class:"stat-sub"},"已挂载扩展",-1))]),_:1})]),_:1}),t(u,{xs:24,sm:8},{default:s(()=>[t(C,{class:"stat-card",size:"small",style:{cursor:"pointer"},onClick:e[3]||(e[3]=a=>y.$router.push("/notes"))},{default:s(()=>[l("div",Oe,[e[25]||(e[25]=l("span",{class:"stat-label"},"知识库笔记",-1)),t(r(J),{style:{color:"#faad14"}})]),l("div",je,o(g.value.noteCount??"—"),1),e[26]||(e[26]=l("div",{class:"stat-sub"},"点击管理笔记",-1))]),_:1})]),_:1})]),_:1}),t(R,{gutter:[16,16]},{default:s(()=>[t(u,{xs:24,lg:10},{default:s(()=>[t(C,{title:"快速操作",style:{background:"var(--bg-card)","border-color":"var(--border-color)",height:"100%"}},{default:s(()=>[t(Q,{direction:"vertical",style:{width:"100%"},size:"middle"},{default:s(()=>[t(z,{type:"primary",block:"",onClick:e[4]||(e[4]=a=>y.$router.push("/chat"))},{icon:s(()=>[t(r(Z))]),default:s(()=>[m(" "+o(k.value?"进入项目 Chat":"新建 AI 对话"),1)]),_:1}),t(z,{block:"",onClick:A,style:{background:"rgba(114,46,209,.12)","border-color":"#722ed1",color:"#722ed1"}},{icon:s(()=>[t(r(X))]),default:s(()=>[e[27]||(e[27]=m(" 启动 Agent 模式 ",-1))]),_:1}),t(R,{gutter:8},{default:s(()=>[t(u,{span:12},{default:s(()=>[t(z,{block:"",onClick:e[5]||(e[5]=a=>y.$router.push("/services")),style:{background:"var(--bg-card-hover)","border-color":"var(--border-color)"}},{icon:s(()=>[t(r(ce))]),default:s(()=>[e[28]||(e[28]=m(" 服务管理 ",-1))]),_:1})]),_:1}),t(u,{span:12},{default:s(()=>[t(z,{block:"",onClick:e[6]||(e[6]=a=>y.$router.push("/logs")),style:{background:"var(--bg-card-hover)","border-color":"var(--border-color)"}},{icon:s(()=>[t(r(J))]),default:s(()=>[e[29]||(e[29]=m(" 查看日志 ",-1))]),_:1})]),_:1})]),_:1}),t(R,{gutter:8},{default:s(()=>[t(u,{span:12},{default:s(()=>[t(z,{block:"",onClick:e[7]||(e[7]=a=>y.$router.push("/skills")),style:{background:"var(--bg-card-hover)","border-color":"var(--border-color)"}},{icon:s(()=>[t(r(Y))]),default:s(()=>[e[30]||(e[30]=m(" 技能管理 ",-1))]),_:1})]),_:1}),t(u,{span:12},{default:s(()=>[t(z,{block:"",onClick:e[8]||(e[8]=a=>y.$router.push("/providers")),style:{background:"var(--bg-card-hover)","border-color":"var(--border-color)"}},{icon:s(()=>[t(r(pe))]),default:s(()=>[e[31]||(e[31]=m(" LLM 配置 ",-1))]),_:1})]),_:1})]),_:1})]),_:1})]),_:1})]),_:1}),t(u,{xs:24,lg:14},{default:s(()=>[t(C,{title:"最近状态",style:{background:"var(--bg-card)","border-color":"var(--border-color)"},loading:E.value},{extra:s(()=>[t(z,{type:"link",size:"small",onClick:e[9]||(e[9]=a=>y.$router.push("/logs"))},{default:s(()=>[...e[32]||(e[32]=[m("查看更多",-1)])]),_:1})]),default:s(()=>[l("pre",Fe,o(N.value||"点击刷新加载系统状态..."),1)]),_:1},8,["loading"])]),_:1})]),_:1}),t(C,{title:"压缩策略观测",style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-top":"16px"},loading:E.value},{default:s(()=>[t(R,{gutter:[12,12],style:{"margin-bottom":"12px"}},{default:s(()=>[t(u,{xs:24,md:8},{default:s(()=>[l("div",Ee,[e[37]||(e[37]=l("div",{class:"telemetry-filter-label"},"时间窗口",-1)),t(G,{value:h.value.windowPreset,"onUpdate:value":e[10]||(e[10]=a=>h.value.windowPreset=a),style:{width:"100%"},onChange:_},{default:s(()=>[t(L,{value:"all"},{default:s(()=>[...e[33]||(e[33]=[m("全部样本",-1)])]),_:1}),t(L,{value:"1h"},{default:s(()=>[...e[34]||(e[34]=[m("近 1 小时",-1)])]),_:1}),t(L,{value:"24h"},{default:s(()=>[...e[35]||(e[35]=[m("近 24 小时",-1)])]),_:1}),t(L,{value:"7d"},{default:s(()=>[...e[36]||(e[36]=[m("近 7 天",-1)])]),_:1})]),_:1},8,["value"])])]),_:1}),t(u,{xs:24,md:8},{default:s(()=>[l("div",Ne,[e[39]||(e[39]=l("div",{class:"telemetry-filter-label"},"Provider 切片",-1)),t(G,{value:h.value.provider,"onUpdate:value":e[11]||(e[11]=a=>h.value.provider=a),style:{width:"100%"},onChange:_},{default:s(()=>[t(L,{value:""},{default:s(()=>[...e[38]||(e[38]=[m("全部 Provider",-1)])]),_:1}),(i(!0),p(P,null,O(n.value,a=>(i(),I(L,{key:a.key,value:a.key},{default:s(()=>[m(o(a.key),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])])]),_:1}),t(u,{xs:24,md:8},{default:s(()=>[l("div",Ae,[e[41]||(e[41]=l("div",{class:"telemetry-filter-label"},"Model 切片",-1)),t(G,{value:h.value.model,"onUpdate:value":e[12]||(e[12]=a=>h.value.model=a),style:{width:"100%"},onChange:_},{default:s(()=>[t(L,{value:""},{default:s(()=>[...e[40]||(e[40]=[m("全部 Model",-1)])]),_:1}),(i(!0),p(P,null,O(c.value,a=>(i(),I(L,{key:a.key,value:a.key},{default:s(()=>[m(o(a.key),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])])]),_:1})]),_:1}),t(R,{gutter:[12,12]},{default:s(()=>[t(u,{xs:24,sm:8},{default:s(()=>[l("div",Ie,[e[42]||(e[42]=l("div",{class:"telemetry-label"},"压缩命中率",-1)),l("div",Ve,o($(f.value.hitRate)),1),l("div",We,o(f.value.compressedSamples)+" / "+o(f.value.samples)+" 次压缩产生了有效节省 ",1)])]),_:1}),t(u,{xs:24,sm:8},{default:s(()=>[l("div",Be,[e[43]||(e[43]=l("div",{class:"telemetry-label"},"累计节省 Token",-1)),l("div",Ue,o(f.value.totalSavedTokens),1),l("div",Ge,"平均每次 "+o(f.value.averageSavedTokens)+" Token",1)])]),_:1}),t(u,{xs:24,sm:8},{default:s(()=>[l("div",He,[e[44]||(e[44]=l("div",{class:"telemetry-label"},"净节省率",-1)),l("div",qe,o($(f.value.netSavingsRate)),1),l("div",Xe," 原始 "+o(f.value.totalOriginalTokens)+" -> 压缩后 "+o(f.value.totalCompressedTokens),1)])]),_:1})]),_:1}),t(R,{gutter:[16,16],style:{"margin-top":"12px"}},{default:s(()=>[t(u,{xs:24,lg:12},{default:s(()=>[l("div",Ye,[e[45]||(e[45]=l("div",{class:"telemetry-section-title"},"策略命中分布",-1)),f.value.strategyDistribution.length===0?(i(),p("div",Ze,"暂无压缩样本")):(i(),p("div",Je,[(i(!0),p(P,null,O(f.value.strategyDistribution.slice(0,6),a=>(i(),p("div",{key:a.strategy,class:"telemetry-row"},[l("span",null,o(a.strategy),1),l("span",null,o(a.hits)+" 次 · "+o($(a.hitRate)),1)]))),128))]))])]),_:1}),t(u,{xs:24,lg:12},{default:s(()=>[l("div",Ke,[e[46]||(e[46]=l("div",{class:"telemetry-section-title"},"变体分布",-1)),W.value.length===0?(i(),p("div",Qe,"暂无变体数据")):(i(),p("div",et,[(i(!0),p(P,null,O(W.value,([a,te])=>(i(),p("div",{key:a,class:"telemetry-row"},[l("span",null,o(a),1),l("span",null,o(te)+" 次",1)]))),128))]))])]),_:1})]),_:1}),t(R,{gutter:[16,16],style:{"margin-top":"12px"}},{default:s(()=>[t(u,{xs:24,lg:12},{default:s(()=>[l("div",tt,[e[47]||(e[47]=l("div",{class:"telemetry-section-title"},"Provider 切片",-1)),n.value.length===0?(i(),p("div",st,"暂无 Provider 数据")):(i(),p("div",lt,[(i(!0),p(P,null,O(n.value.slice(0,6),a=>(i(),p("div",{key:a.key,class:"telemetry-row"},[l("span",null,o(a.key),1),l("span",null,o(a.samples)+" 次 · "+o($(a.hitRate)),1)]))),128))]))])]),_:1}),t(u,{xs:24,lg:12},{default:s(()=>[l("div",ot,[e[48]||(e[48]=l("div",{class:"telemetry-section-title"},"Model 切片",-1)),c.value.length===0?(i(),p("div",at,"暂无 Model 数据")):(i(),p("div",nt,[(i(!0),p(P,null,O(c.value.slice(0,6),a=>(i(),p("div",{key:a.key,class:"telemetry-row"},[l("span",null,o(a.key),1),l("span",null,o(a.samples)+" 次 · "+o(a.savedTokens)+" saved",1)]))),128))]))])]),_:1})]),_:1})]),_:1},8,["loading"]),t(C,{title:"运行信息",style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-top":"16px"}},{default:s(()=>[t(ee,{column:{xs:1,sm:2,lg:3},size:"small"},{default:s(()=>[t(M,{label:"面板模式"},{default:s(()=>[t(U,{color:k.value?"blue":"purple"},{default:s(()=>[m(o(k.value?"项目级":"全局"),1)]),_:1},8,["color"])]),_:1}),k.value?(i(),I(M,{key:0,label:"项目名称"},{default:s(()=>[l("span",rt,o(r(v).projectName||"—"),1)]),_:1})):H("",!0),k.value?(i(),I(M,{key:1,label:"项目路径"},{default:s(()=>[l("span",it,o(r(v).projectRoot),1)]),_:1})):H("",!0),t(M,{label:"WebSocket"},{default:s(()=>[l("span",ut," ws://"+o(r(v).wsHost||"127.0.0.1")+":"+o(r(v).wsPort||18800),1)]),_:1}),t(M,{label:"认证"},{default:s(()=>[t(U,{color:r(v).wsToken?"green":"default",style:{"font-size":"11px"}},{default:s(()=>[m(o(r(v).wsToken?"已启用":"未启用"),1)]),_:1},8,["color"])]),_:1}),t(M,{label:"版本"},{default:s(()=>[...e[49]||(e[49]=[l("span",{style:{color:"var(--text-muted)"}},"v5.0.2.7",-1)])]),_:1})]),_:1})]),_:1})])}}},yt=re(dt,[["__scopeId","data-v-c2d8ed1e"]]);export{yt as default};
|
|
3
|
+
`),f(b)}w.status==="fulfilled"&&(d.value.sessionCount=w.value.length),Promise.allSettled([n.execute("skill sources",15e3),n.execute("llm providers",15e3)]).then(([b,$])=>{if(b.status==="fulfilled"){const A=b.value.output.match(/(\d+)\s*(?:skills|技能)/i);A&&(d.value.skillCount=parseInt(A[1],10))}if($.status==="fulfilled"){const y=$.value.output.match(/active[:\s]+(\S+)/i);y&&!d.value.activeLlm&&(d.value.activeLlm=y[1])}}),n.execute("mcp servers",1e4).then(({output:b})=>{const $=(b.match(/^[a-z]/gm)||[]).length;d.value.mcpCount=$}).catch(()=>{d.value.mcpCount=0}),await g()}catch{}finally{V.value=!1}}return{loading:V,compressionLoading:j,stats:d,statusLog:F,compression:_,telemetryFilters:v,ensureRuntimeSubscription:D,stopRuntimeSubscription:E,refresh:W,refreshCompression:g,applyCompressionSummary:N,toWindowMs:h}}),ye={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"20px"}},ge={class:"page-sub"},be={style:{display:"flex","align-items":"center",gap:"12px","flex-wrap":"wrap"}},_e={style:{color:"#91caff","font-weight":"600"}},ke={style:{color:"#4a6fa5","font-size":"11px","font-family":"monospace"}},we={class:"stat-header"},Ce={class:"stat-sub"},xe={class:"stat-header"},Se={class:"stat-value",style:{color:"#91caff","font-size":"15px",overflow:"hidden","text-overflow":"ellipsis","white-space":"nowrap"}},he={class:"stat-sub",style:{overflow:"hidden","text-overflow":"ellipsis","white-space":"nowrap"}},$e={class:"stat-header"},Re={class:"stat-value",style:{color:"#1677ff"}},ze={class:"stat-header"},Le={class:"stat-value",style:{color:"#c084fc"}},De={class:"stat-header"},Me={class:"stat-sub"},Te={class:"stat-header"},Pe={class:"stat-value",style:{color:"#13c2c2"}},Oe={class:"stat-header"},je={class:"stat-value",style:{color:"#faad14"}},Fe={class:"status-log"},Ee={class:"telemetry-filter"},Ne={class:"telemetry-filter"},Ae={class:"telemetry-filter"},Ie={class:"telemetry-card"},Ve={class:"telemetry-value"},We={class:"telemetry-sub"},Be={class:"telemetry-card"},Ue={class:"telemetry-value"},Ge={class:"telemetry-sub"},He={class:"telemetry-card"},qe={class:"telemetry-value"},Xe={class:"telemetry-sub"},Ye={class:"telemetry-section"},Ze={key:0,class:"telemetry-empty"},Je={key:1,class:"telemetry-list"},Ke={class:"telemetry-section"},Qe={key:0,class:"telemetry-empty"},et={key:1,class:"telemetry-list"},tt={class:"telemetry-section"},st={key:0,class:"telemetry-empty"},lt={key:1,class:"telemetry-list"},ot={class:"telemetry-section"},at={key:0,class:"telemetry-empty"},nt={key:1,class:"telemetry-list"},rt={style:{color:"#91caff"}},it={style:{color:"var(--text-muted)","font-family":"monospace","font-size":"11px"}},ut={style:{color:"var(--text-secondary)","font-family":"monospace","font-size":"12px"}},dt={__name:"Dashboard",setup(V){const j=ae(),d=B(),F=ne(),_=fe(),v=window.__CC_CONFIG__||{},k=S(()=>v.mode==="project"),D=S(()=>d.status),E=S(()=>_.loading),N=S(()=>_.statusLog),h=S(()=>_.telemetryFilters),f=S(()=>_.compression),g=S(()=>_.stats),W=S(()=>Object.entries(f.value.variantDistribution||{})),n=S(()=>f.value.providerDistribution||[]),c=S(()=>f.value.modelDistribution||[]);async function w(){await _.refresh()}async function b(){await _.refreshCompression()}function $(y){return`${((y||0)*100).toFixed(1)}%`}async function A(){await F.createSession("agent"),j.push("/chat")}return le(()=>{_.ensureRuntimeSubscription(d),setTimeout(w,300)}),oe(()=>{_.stopRuntimeSubscription()}),(y,e)=>{const z=x("a-button"),U=x("a-tag"),C=x("a-card"),K=x("a-badge"),u=x("a-col"),R=x("a-row"),Q=x("a-space"),L=x("a-select-option"),G=x("a-select"),M=x("a-descriptions-item"),ee=x("a-descriptions");return i(),p("div",null,[l("div",ye,[l("div",null,[e[13]||(e[13]=l("h2",{class:"page-title"},"仪表板",-1)),l("p",ge,o(k.value?`项目「${r(v).projectName||"未命名"}」运行概览`:"ChainlessChain 全局运行概览"),1)]),t(z,{type:"primary",ghost:"",loading:E.value,onClick:w},{icon:s(()=>[t(r(ie))]),default:s(()=>[e[14]||(e[14]=m(" 刷新 ",-1))]),_:1},8,["loading"])]),k.value?(i(),I(C,{key:0,style:{background:"rgba(22,119,255,.08)","border-color":"rgba(22,119,255,.25)","margin-bottom":"16px"},size:"small"},{default:s(()=>[l("div",be,[t(r(ue),{style:{color:"#1677ff","font-size":"18px"}}),l("div",null,[l("div",_e,o(r(v).projectName||"项目"),1),l("div",ke,o(r(v).projectRoot),1)]),t(U,{color:"blue",style:{"margin-left":"auto"}},{default:s(()=>[...e[15]||(e[15]=[m("项目面板",-1)])]),_:1})])]),_:1})):H("",!0),t(R,{gutter:[12,12],style:{"margin-bottom":"16px"}},{default:s(()=>[t(u,{xs:24,sm:12,lg:6},{default:s(()=>[t(C,{class:"stat-card gateway-card",size:"small"},{default:s(()=>[l("div",we,[e[16]||(e[16]=l("span",{class:"stat-label"},"WebSocket Gateway",-1)),t(K,{status:D.value==="connected"?"success":"error"},null,8,["status"])]),l("div",{class:"stat-value",style:q({color:D.value==="connected"?"#52c41a":"#888"})},o(D.value==="connected"?"运行中":"未连接"),5),l("div",Ce,"端口 "+o(r(v).wsPort||18800)+" · "+o(r(v).wsHost||"127.0.0.1"),1)]),_:1})]),_:1}),t(u,{xs:24,sm:12,lg:6},{default:s(()=>[t(C,{class:"stat-card",size:"small"},{default:s(()=>[l("div",xe,[e[17]||(e[17]=l("span",{class:"stat-label"},"当前 LLM",-1)),t(r(X),{style:{color:"#1677ff"}})]),l("div",Se,o(g.value.activeLlm||"未配置"),1),l("div",he,o(g.value.activeModel||"—"),1)]),_:1})]),_:1}),t(u,{xs:24,sm:12,lg:6},{default:s(()=>[t(C,{class:"stat-card",size:"small",style:{cursor:"pointer"},onClick:e[0]||(e[0]=a=>y.$router.push("/skills"))},{default:s(()=>[l("div",$e,[e[18]||(e[18]=l("span",{class:"stat-label"},"可用技能",-1)),t(r(Y),{style:{color:"#1677ff"}})]),l("div",Re,o(g.value.skillCount||"—"),1),e[19]||(e[19]=l("div",{class:"stat-sub"},"点击管理技能",-1))]),_:1})]),_:1}),t(u,{xs:24,sm:12,lg:6},{default:s(()=>[t(C,{class:"stat-card",size:"small",style:{cursor:"pointer"},onClick:e[1]||(e[1]=a=>y.$router.push("/chat"))},{default:s(()=>[l("div",ze,[e[20]||(e[20]=l("span",{class:"stat-label"},"AI 会话",-1)),t(r(Z),{style:{color:"#722ed1"}})]),l("div",Le,o(g.value.sessionCount),1),e[21]||(e[21]=l("div",{class:"stat-sub"},"点击进入对话",-1))]),_:1})]),_:1})]),_:1}),t(R,{gutter:[12,12],style:{"margin-bottom":"16px"}},{default:s(()=>[t(u,{xs:24,sm:8},{default:s(()=>[t(C,{class:"stat-card",size:"small"},{default:s(()=>[l("div",De,[e[22]||(e[22]=l("span",{class:"stat-label"},"应用状态",-1)),t(r(de),{style:q({color:g.value.appRunning?"#52c41a":"#888"})},null,8,["style"])]),l("div",{class:"stat-value",style:q({color:g.value.appRunning?"#52c41a":"#888",fontSize:"15px"})},o(g.value.appRunning?"运行中":g.value.setupDone?"已初始化":"未启动"),5),l("div",Me,o(g.value.edition||"Community")+" Edition",1)]),_:1})]),_:1}),t(u,{xs:24,sm:8},{default:s(()=>[t(C,{class:"stat-card",size:"small",style:{cursor:"pointer"},onClick:e[2]||(e[2]=a=>y.$router.push("/mcp"))},{default:s(()=>[l("div",Te,[e[23]||(e[23]=l("span",{class:"stat-label"},"MCP 工具",-1)),t(r(ve),{style:{color:"#13c2c2"}})]),l("div",Pe,o(g.value.mcpCount??"—"),1),e[24]||(e[24]=l("div",{class:"stat-sub"},"已挂载扩展",-1))]),_:1})]),_:1}),t(u,{xs:24,sm:8},{default:s(()=>[t(C,{class:"stat-card",size:"small",style:{cursor:"pointer"},onClick:e[3]||(e[3]=a=>y.$router.push("/notes"))},{default:s(()=>[l("div",Oe,[e[25]||(e[25]=l("span",{class:"stat-label"},"知识库笔记",-1)),t(r(J),{style:{color:"#faad14"}})]),l("div",je,o(g.value.noteCount??"—"),1),e[26]||(e[26]=l("div",{class:"stat-sub"},"点击管理笔记",-1))]),_:1})]),_:1})]),_:1}),t(R,{gutter:[16,16]},{default:s(()=>[t(u,{xs:24,lg:10},{default:s(()=>[t(C,{title:"快速操作",style:{background:"var(--bg-card)","border-color":"var(--border-color)",height:"100%"}},{default:s(()=>[t(Q,{direction:"vertical",style:{width:"100%"},size:"middle"},{default:s(()=>[t(z,{type:"primary",block:"",onClick:e[4]||(e[4]=a=>y.$router.push("/chat"))},{icon:s(()=>[t(r(Z))]),default:s(()=>[m(" "+o(k.value?"进入项目 Chat":"新建 AI 对话"),1)]),_:1}),t(z,{block:"",onClick:A,style:{background:"rgba(114,46,209,.12)","border-color":"#722ed1",color:"#722ed1"}},{icon:s(()=>[t(r(X))]),default:s(()=>[e[27]||(e[27]=m(" 启动 Agent 模式 ",-1))]),_:1}),t(R,{gutter:8},{default:s(()=>[t(u,{span:12},{default:s(()=>[t(z,{block:"",onClick:e[5]||(e[5]=a=>y.$router.push("/services")),style:{background:"var(--bg-card-hover)","border-color":"var(--border-color)"}},{icon:s(()=>[t(r(ce))]),default:s(()=>[e[28]||(e[28]=m(" 服务管理 ",-1))]),_:1})]),_:1}),t(u,{span:12},{default:s(()=>[t(z,{block:"",onClick:e[6]||(e[6]=a=>y.$router.push("/logs")),style:{background:"var(--bg-card-hover)","border-color":"var(--border-color)"}},{icon:s(()=>[t(r(J))]),default:s(()=>[e[29]||(e[29]=m(" 查看日志 ",-1))]),_:1})]),_:1})]),_:1}),t(R,{gutter:8},{default:s(()=>[t(u,{span:12},{default:s(()=>[t(z,{block:"",onClick:e[7]||(e[7]=a=>y.$router.push("/skills")),style:{background:"var(--bg-card-hover)","border-color":"var(--border-color)"}},{icon:s(()=>[t(r(Y))]),default:s(()=>[e[30]||(e[30]=m(" 技能管理 ",-1))]),_:1})]),_:1}),t(u,{span:12},{default:s(()=>[t(z,{block:"",onClick:e[8]||(e[8]=a=>y.$router.push("/providers")),style:{background:"var(--bg-card-hover)","border-color":"var(--border-color)"}},{icon:s(()=>[t(r(pe))]),default:s(()=>[e[31]||(e[31]=m(" LLM 配置 ",-1))]),_:1})]),_:1})]),_:1})]),_:1})]),_:1})]),_:1}),t(u,{xs:24,lg:14},{default:s(()=>[t(C,{title:"最近状态",style:{background:"var(--bg-card)","border-color":"var(--border-color)"},loading:E.value},{extra:s(()=>[t(z,{type:"link",size:"small",onClick:e[9]||(e[9]=a=>y.$router.push("/logs"))},{default:s(()=>[...e[32]||(e[32]=[m("查看更多",-1)])]),_:1})]),default:s(()=>[l("pre",Fe,o(N.value||"点击刷新加载系统状态..."),1)]),_:1},8,["loading"])]),_:1})]),_:1}),t(C,{title:"压缩策略观测",style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-top":"16px"},loading:E.value},{default:s(()=>[t(R,{gutter:[12,12],style:{"margin-bottom":"12px"}},{default:s(()=>[t(u,{xs:24,md:8},{default:s(()=>[l("div",Ee,[e[37]||(e[37]=l("div",{class:"telemetry-filter-label"},"时间窗口",-1)),t(G,{value:h.value.windowPreset,"onUpdate:value":e[10]||(e[10]=a=>h.value.windowPreset=a),style:{width:"100%"},onChange:b},{default:s(()=>[t(L,{value:"all"},{default:s(()=>[...e[33]||(e[33]=[m("全部样本",-1)])]),_:1}),t(L,{value:"1h"},{default:s(()=>[...e[34]||(e[34]=[m("近 1 小时",-1)])]),_:1}),t(L,{value:"24h"},{default:s(()=>[...e[35]||(e[35]=[m("近 24 小时",-1)])]),_:1}),t(L,{value:"7d"},{default:s(()=>[...e[36]||(e[36]=[m("近 7 天",-1)])]),_:1})]),_:1},8,["value"])])]),_:1}),t(u,{xs:24,md:8},{default:s(()=>[l("div",Ne,[e[39]||(e[39]=l("div",{class:"telemetry-filter-label"},"Provider 切片",-1)),t(G,{value:h.value.provider,"onUpdate:value":e[11]||(e[11]=a=>h.value.provider=a),style:{width:"100%"},onChange:b},{default:s(()=>[t(L,{value:""},{default:s(()=>[...e[38]||(e[38]=[m("全部 Provider",-1)])]),_:1}),(i(!0),p(P,null,O(n.value,a=>(i(),I(L,{key:a.key,value:a.key},{default:s(()=>[m(o(a.key),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])])]),_:1}),t(u,{xs:24,md:8},{default:s(()=>[l("div",Ae,[e[41]||(e[41]=l("div",{class:"telemetry-filter-label"},"Model 切片",-1)),t(G,{value:h.value.model,"onUpdate:value":e[12]||(e[12]=a=>h.value.model=a),style:{width:"100%"},onChange:b},{default:s(()=>[t(L,{value:""},{default:s(()=>[...e[40]||(e[40]=[m("全部 Model",-1)])]),_:1}),(i(!0),p(P,null,O(c.value,a=>(i(),I(L,{key:a.key,value:a.key},{default:s(()=>[m(o(a.key),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])])]),_:1})]),_:1}),t(R,{gutter:[12,12]},{default:s(()=>[t(u,{xs:24,sm:8},{default:s(()=>[l("div",Ie,[e[42]||(e[42]=l("div",{class:"telemetry-label"},"压缩命中率",-1)),l("div",Ve,o($(f.value.hitRate)),1),l("div",We,o(f.value.compressedSamples)+" / "+o(f.value.samples)+" 次压缩产生了有效节省 ",1)])]),_:1}),t(u,{xs:24,sm:8},{default:s(()=>[l("div",Be,[e[43]||(e[43]=l("div",{class:"telemetry-label"},"累计节省 Token",-1)),l("div",Ue,o(f.value.totalSavedTokens),1),l("div",Ge,"平均每次 "+o(f.value.averageSavedTokens)+" Token",1)])]),_:1}),t(u,{xs:24,sm:8},{default:s(()=>[l("div",He,[e[44]||(e[44]=l("div",{class:"telemetry-label"},"净节省率",-1)),l("div",qe,o($(f.value.netSavingsRate)),1),l("div",Xe," 原始 "+o(f.value.totalOriginalTokens)+" -> 压缩后 "+o(f.value.totalCompressedTokens),1)])]),_:1})]),_:1}),t(R,{gutter:[16,16],style:{"margin-top":"12px"}},{default:s(()=>[t(u,{xs:24,lg:12},{default:s(()=>[l("div",Ye,[e[45]||(e[45]=l("div",{class:"telemetry-section-title"},"策略命中分布",-1)),f.value.strategyDistribution.length===0?(i(),p("div",Ze,"暂无压缩样本")):(i(),p("div",Je,[(i(!0),p(P,null,O(f.value.strategyDistribution.slice(0,6),a=>(i(),p("div",{key:a.strategy,class:"telemetry-row"},[l("span",null,o(a.strategy),1),l("span",null,o(a.hits)+" 次 · "+o($(a.hitRate)),1)]))),128))]))])]),_:1}),t(u,{xs:24,lg:12},{default:s(()=>[l("div",Ke,[e[46]||(e[46]=l("div",{class:"telemetry-section-title"},"变体分布",-1)),W.value.length===0?(i(),p("div",Qe,"暂无变体数据")):(i(),p("div",et,[(i(!0),p(P,null,O(W.value,([a,te])=>(i(),p("div",{key:a,class:"telemetry-row"},[l("span",null,o(a),1),l("span",null,o(te)+" 次",1)]))),128))]))])]),_:1})]),_:1}),t(R,{gutter:[16,16],style:{"margin-top":"12px"}},{default:s(()=>[t(u,{xs:24,lg:12},{default:s(()=>[l("div",tt,[e[47]||(e[47]=l("div",{class:"telemetry-section-title"},"Provider 切片",-1)),n.value.length===0?(i(),p("div",st,"暂无 Provider 数据")):(i(),p("div",lt,[(i(!0),p(P,null,O(n.value.slice(0,6),a=>(i(),p("div",{key:a.key,class:"telemetry-row"},[l("span",null,o(a.key),1),l("span",null,o(a.samples)+" 次 · "+o($(a.hitRate)),1)]))),128))]))])]),_:1}),t(u,{xs:24,lg:12},{default:s(()=>[l("div",ot,[e[48]||(e[48]=l("div",{class:"telemetry-section-title"},"Model 切片",-1)),c.value.length===0?(i(),p("div",at,"暂无 Model 数据")):(i(),p("div",nt,[(i(!0),p(P,null,O(c.value.slice(0,6),a=>(i(),p("div",{key:a.key,class:"telemetry-row"},[l("span",null,o(a.key),1),l("span",null,o(a.samples)+" 次 · "+o(a.savedTokens)+" saved",1)]))),128))]))])]),_:1})]),_:1})]),_:1},8,["loading"]),t(C,{title:"运行信息",style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-top":"16px"}},{default:s(()=>[t(ee,{column:{xs:1,sm:2,lg:3},size:"small"},{default:s(()=>[t(M,{label:"面板模式"},{default:s(()=>[t(U,{color:k.value?"blue":"purple"},{default:s(()=>[m(o(k.value?"项目级":"全局"),1)]),_:1},8,["color"])]),_:1}),k.value?(i(),I(M,{key:0,label:"项目名称"},{default:s(()=>[l("span",rt,o(r(v).projectName||"—"),1)]),_:1})):H("",!0),k.value?(i(),I(M,{key:1,label:"项目路径"},{default:s(()=>[l("span",it,o(r(v).projectRoot),1)]),_:1})):H("",!0),t(M,{label:"WebSocket"},{default:s(()=>[l("span",ut," ws://"+o(r(v).wsHost||"127.0.0.1")+":"+o(r(v).wsPort||18800),1)]),_:1}),t(M,{label:"认证"},{default:s(()=>[t(U,{color:r(v).wsToken?"green":"default",style:{"font-size":"11px"}},{default:s(()=>[m(o(r(v).wsToken?"已启用":"未启用"),1)]),_:1},8,["color"])]),_:1}),t(M,{label:"版本"},{default:s(()=>[...e[49]||(e[49]=[l("span",{style:{color:"var(--text-muted)"}},"v5.0.2.7",-1)])]),_:1})]),_:1})]),_:1})])}}},yt=re(dt,[["__scopeId","data-v-39c5aabc"]]);export{yt as default};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{u as ee}from"./ws-
|
|
2
|
-
`);let n="",r=0;for(const f of e){const y=f.match(/On branch\s+(.+)/)||f.match(/分支\s+(.+)/);y&&(n=y[1].trim());const
|
|
1
|
+
import{u as ee}from"./ws-Dma34ig_.js";import{_ as te}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{p as ae,X as oe,f as P,Y as T,Z as le,J as v}from"./antd-D6h4fDFf.js";import{a3 as W,a1 as s,k as a,Z as t,f as l,X as u,Y as p,G as i,u as g,W as m,a5 as V,a4 as b}from"./vendor-CN0Iv_qZ.js";const se={key:0,style:{"margin-bottom":"16px"}},ne={style:{"white-space":"pre-wrap","word-break":"break-all",color:"var(--text-primary)","font-family":"'Cascadia Code', 'Fira Code', Consolas, monospace","font-size":"13px","line-height":"1.7",margin:"0"}},re={style:{display:"flex",gap:"12px","align-items":"flex-end","flex-wrap":"wrap"}},ie={style:{flex:"1","min-width":"200px"}},ue={style:{"min-width":"140px"}},de={style:{display:"flex",gap:"12px","align-items":"flex-end","flex-wrap":"wrap"}},pe={style:{flex:"1","min-width":"200px"}},ce={style:{"white-space":"pre-wrap","word-break":"break-all",color:"var(--text-primary)","font-family":"'Cascadia Code', 'Fira Code', Consolas, monospace","font-size":"13px","line-height":"1.7",margin:"0"}},ve={__name:"Git",setup(me){const G=ee(),F=l("git"),L=l(!1),w=l(""),h=l(""),C=l(0),B=l(!1),x=l(""),O=l(!1),E=l(!1),M=l(""),z=l("markdown"),A=l(!1),S=l("./site"),$=l(!1),c=l(""),_=l(!1),k=l("");function X(o){const e=o.split(`
|
|
2
|
+
`);let n="",r=0;for(const f of e){const y=f.match(/On branch\s+(.+)/)||f.match(/分支\s+(.+)/);y&&(n=y[1].trim());const U=f.trim();/^(M|A|D|R|C|U|\?\?|MM|AM|AD)\s/.test(U)&&r++,/^(modified|new file|deleted|renamed):/i.test(U)&&r++}return{branch:n,changed:r}}async function N(){L.value=!0;try{const{output:o}=await G.execute("git status",15e3);w.value=o;const e=X(o);h.value=e.branch,C.value=e.changed}catch(o){v.error("获取 Git 状态失败: "+o.message),w.value=""}finally{L.value=!1}}function Y(){E.value=!0}async function Z(){E.value=!1,B.value=!0,x.value="";try{const{output:o}=await G.execute("git auto-commit",3e4);x.value=o,O.value=!o.includes("✖")&&!o.toLowerCase().includes("error"),O.value&&v.success("自动提交完成"),await N()}catch(o){x.value="提交失败: "+o.message,O.value=!1,v.error("自动提交失败")}finally{B.value=!1}}async function j(){const o=M.value.trim();if(!o){v.warning("请输入文件路径");return}A.value=!0,c.value="",k.value="";try{const e=`import ${z.value} ${o}`,{output:n}=await G.execute(e,6e4);k.value=n;const r=n.includes("✖")||n.toLowerCase().includes("error");_.value=!r,c.value=r?"导入过程中可能存在问题,请查看输出":"导入完成",r||v.success("导入成功")}catch(e){c.value="导入失败: "+e.message,_.value=!1,v.error("导入失败")}finally{A.value=!1}}async function J(){const o=S.value.trim();if(!o){v.warning("请输入输出路径");return}$.value=!0,c.value="",k.value="";try{const e=`export site -o ${o}`,{output:n}=await G.execute(e,6e4);k.value=n;const r=n.includes("✖")||n.toLowerCase().includes("error");_.value=!r,c.value=r?"导出过程中可能存在问题,请查看输出":"导出完成",r||v.success("导出成功")}catch(e){c.value="导出失败: "+e.message,_.value=!1,v.error("导出失败")}finally{$.value=!1}}return(o,e)=>{const n=u("a-button"),r=u("a-space"),f=u("a-tag"),y=u("a-card"),U=u("a-empty"),R=u("a-alert"),I=u("a-tab-pane"),K=u("a-input"),D=u("a-select-option"),q=u("a-select"),H=u("a-tabs"),Q=u("a-modal");return p(),W("div",null,[e[21]||(e[21]=s("div",{style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},[s("div",null,[s("h2",{class:"page-title"},"Git 与数据"),s("p",{class:"page-sub"},"版本控制 / 导入导出")])],-1)),a(H,{activeKey:F.value,"onUpdate:activeKey":e[5]||(e[5]=d=>F.value=d),type:"card"},{default:t(()=>[a(I,{key:"git"},{tab:t(()=>[a(g(P)),e[7]||(e[7]=i(" Git 仓库 ",-1))]),default:t(()=>[a(r,{style:{"margin-bottom":"16px"}},{default:t(()=>[a(n,{type:"primary",loading:L.value,onClick:N},{icon:t(()=>[a(g(ae))]),default:t(()=>[e[8]||(e[8]=i(" 刷新状态 ",-1))]),_:1},8,["loading"]),a(n,{loading:B.value,onClick:Y},{icon:t(()=>[a(g(oe))]),default:t(()=>[e[9]||(e[9]=i(" 自动提交 ",-1))]),_:1},8,["loading"])]),_:1}),h.value||C.value>0?(p(),W("div",se,[a(r,null,{default:t(()=>[h.value?(p(),m(f,{key:0,color:"blue"},{default:t(()=>[a(g(P)),i(" "+V(h.value),1)]),_:1})):b("",!0),C.value>0?(p(),m(f,{key:1,color:"orange"},{default:t(()=>[i(V(C.value)+" 个文件变更",1)]),_:1})):w.value&&C.value===0?(p(),m(f,{key:2,color:"green"},{default:t(()=>[...e[10]||(e[10]=[i("工作区干净",-1)])]),_:1})):b("",!0)]),_:1})])):b("",!0),w.value?(p(),m(y,{key:1,bordered:!1,style:{background:"var(--bg-base)",border:"1px solid var(--border-color)"}},{default:t(()=>[s("pre",ne,V(w.value),1)]),_:1})):L.value?b("",!0):(p(),m(U,{key:2,description:"点击刷新状态查看 Git 信息",style:{padding:"60px 0"}})),x.value?(p(),m(R,{key:3,message:O.value?"提交成功":"提交结果",description:x.value,type:O.value?"success":"info","show-icon":"",closable:"",style:{"margin-top":"16px"},onClose:e[0]||(e[0]=d=>x.value="")},null,8,["message","description","type"])):b("",!0)]),_:1}),a(I,{key:"io"},{tab:t(()=>[a(g(T)),e[11]||(e[11]=i(" 导入导出 ",-1))]),default:t(()=>[a(y,{title:"导入数据",bordered:!1,style:{background:"var(--bg-card)",border:"1px solid var(--border-color)","margin-bottom":"16px"}},{default:t(()=>[s("div",re,[s("div",ie,[e[12]||(e[12]=s("label",{style:{display:"block","margin-bottom":"6px",color:"var(--text-secondary)","font-size":"13px"}},"文件路径",-1)),a(K,{value:M.value,"onUpdate:value":e[1]||(e[1]=d=>M.value=d),placeholder:"输入文件或目录路径,如 ./docs","allow-clear":""},null,8,["value"])]),s("div",ue,[e[16]||(e[16]=s("label",{style:{display:"block","margin-bottom":"6px",color:"var(--text-secondary)","font-size":"13px"}},"格式",-1)),a(q,{value:z.value,"onUpdate:value":e[2]||(e[2]=d=>z.value=d),style:{width:"140px"}},{default:t(()=>[a(D,{value:"markdown"},{default:t(()=>[...e[13]||(e[13]=[i("Markdown",-1)])]),_:1}),a(D,{value:"pdf"},{default:t(()=>[...e[14]||(e[14]=[i("PDF",-1)])]),_:1}),a(D,{value:"evernote"},{default:t(()=>[...e[15]||(e[15]=[i("Evernote",-1)])]),_:1})]),_:1},8,["value"])]),a(n,{type:"primary",loading:A.value,disabled:!M.value.trim(),onClick:j},{icon:t(()=>[a(g(T))]),default:t(()=>[e[17]||(e[17]=i(" 导入 ",-1))]),_:1},8,["loading","disabled"])])]),_:1}),a(y,{title:"导出站点",bordered:!1,style:{background:"var(--bg-card)",border:"1px solid var(--border-color)","margin-bottom":"16px"}},{default:t(()=>[s("div",de,[s("div",pe,[e[18]||(e[18]=s("label",{style:{display:"block","margin-bottom":"6px",color:"var(--text-secondary)","font-size":"13px"}},"输出路径",-1)),a(K,{value:S.value,"onUpdate:value":e[3]||(e[3]=d=>S.value=d),placeholder:"输出目录,如 ./site","allow-clear":""},null,8,["value"])]),a(n,{type:"primary",loading:$.value,disabled:!S.value.trim(),onClick:J},{icon:t(()=>[a(g(le))]),default:t(()=>[e[19]||(e[19]=i(" 导出为静态站点 ",-1))]),_:1},8,["loading","disabled"])])]),_:1}),c.value?(p(),m(R,{key:0,message:_.value?"操作成功":"操作结果",description:c.value,type:_.value?"success":"info","show-icon":"",closable:"",style:{"margin-top":"16px"},onClose:e[4]||(e[4]=d=>c.value="")},null,8,["message","description","type"])):b("",!0),k.value?(p(),m(y,{key:1,title:"命令输出",bordered:!1,style:{background:"var(--bg-base)",border:"1px solid var(--border-color)","margin-top":"16px"}},{default:t(()=>[s("pre",ce,V(k.value),1)]),_:1})):b("",!0)]),_:1})]),_:1},8,["activeKey"]),a(Q,{open:E.value,"onUpdate:open":e[6]||(e[6]=d=>E.value=d),title:"确认自动提交","ok-text":"确认提交","cancel-text":"取消","confirm-loading":B.value,onOk:Z},{default:t(()=>[...e[20]||(e[20]=[s("p",{style:{color:"var(--text-secondary)"}},[i(" 将执行 "),s("code",null,"git auto-commit"),i(" 自动提交当前所有变更。请确认工作区文件已准备就绪。 ")],-1)])]),_:1},8,["open","confirm-loading"])])}}},xe=te(ve,[["__scopeId","data-v-1f28d00c"]]);export{xe as default};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{u as U}from"./ws-
|
|
1
|
+
import{u as U}from"./ws-Dma34ig_.js";import{_ as q}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{p as z}from"./antd-D6h4fDFf.js";import{w as A,o as D,a3 as i,a1 as o,k as a,Z as d,W as F,a4 as R,a5 as h,F as j,a7 as G,n as w,X as l,f as r,c as C,Y as u,G as b,u as I,a2 as Q}from"./vendor-CN0Iv_qZ.js";const X={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},Y={style:{display:"flex",gap:"10px",margin:"12px 0"}},Z={key:0,style:{"text-align":"center",padding:"40px",color:"var(--text-muted)"}},J={key:1,style:{"text-align":"center",padding:"40px",color:"var(--text-muted)"}},P={key:2},ee=["innerHTML"],te={__name:"Logs",setup(ae){const L=U(),k=r("status"),v=r(!1),g=r(""),m=r(""),c=r(""),_=r(!0),n=r(null),T={status:"status",doctor:"doctor","skill-sources":"skill sources","llm-providers":"llm providers"},f=C(()=>m.value.split(`
|
|
2
2
|
`)),p=C(()=>{if(!c.value)return f.value;const e=c.value.toLowerCase();return f.value.filter(t=>t.toLowerCase().includes(e))});function M(e){return e.includes("✖")||e.includes("error")||e.includes("Error")||e.includes("failed")?"line-error":e.includes("✔")||e.includes("✓")||e.includes("success")||e.includes("running")?"line-success":e.includes("warn")||e.includes("Warn")||e.includes("○")?"line-warn":e.startsWith(" ")||e.startsWith(" ")?"line-indent":""}function B(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">")}function H(e){if(!c.value)return e;const t=c.value.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return e.replace(new RegExp(`(${t})`,"gi"),"<mark>$1</mark>")}async function x(){v.value=!0,g.value="",m.value="";const e=T[k.value]||"status";try{const{output:t}=await L.execute(e,3e4);m.value=t,_.value&&(await w(),n.value&&(n.value.scrollTop=n.value.scrollHeight))}catch(t){g.value=`执行失败: ${t.message}`,m.value=g.value}finally{v.value=!1}}return A(p,async()=>{_.value&&(await w(),n.value&&(n.value.scrollTop=n.value.scrollHeight))}),D(x),(e,t)=>{const N=l("a-checkbox"),S=l("a-button"),W=l("a-space"),y=l("a-tab-pane"),$=l("a-tabs"),V=l("a-input-search"),E=l("a-tag"),K=l("a-spin");return u(),i("div",null,[o("div",X,[t[5]||(t[5]=o("div",null,[o("h2",{class:"page-title"},"日志查看"),o("p",{class:"page-sub"},"系统运行日志与诊断输出")],-1)),a(W,null,{default:d(()=>[a(N,{checked:_.value,"onUpdate:checked":t[0]||(t[0]=s=>_.value=s)},{default:d(()=>[...t[3]||(t[3]=[b("自动滚动",-1)])]),_:1},8,["checked"]),a(S,{type:"primary",ghost:"",loading:v.value,onClick:x},{icon:d(()=>[a(I(z))]),default:d(()=>[t[4]||(t[4]=b(" 刷新 ",-1))]),_:1},8,["loading"])]),_:1})]),a($,{activeKey:k.value,"onUpdate:activeKey":t[1]||(t[1]=s=>k.value=s),onChange:x,style:{"margin-bottom":"0"}},{default:d(()=>[a(y,{key:"status",tab:"系统状态"}),a(y,{key:"doctor",tab:"环境诊断"}),a(y,{key:"skill-sources",tab:"技能来源"}),a(y,{key:"llm-providers",tab:"LLM 提供商"})]),_:1},8,["activeKey"]),o("div",Y,[a(V,{value:c.value,"onUpdate:value":t[2]||(t[2]=s=>c.value=s),placeholder:"搜索日志内容...","allow-clear":"",style:{flex:"1"}},null,8,["value"]),p.value.length!==f.value.length?(u(),F(E,{key:0,color:"blue"},{default:d(()=>[b(h(p.value.length)+" / "+h(f.value.length)+" 行 ",1)]),_:1})):R("",!0)]),o("div",{ref_key:"logContainer",ref:n,class:"log-box"},[v.value?(u(),i("div",Z,[a(K,{size:"large"}),t[6]||(t[6]=o("div",{style:{"margin-top":"10px"}},"加载中...",-1))])):p.value.length?(u(),i("div",P,[(u(!0),i(j,null,G(p.value,(s,O)=>(u(),i("div",{key:O,class:Q(["log-line",M(s)]),innerHTML:H(B(s))},null,10,ee))),128))])):(u(),i("div",J,h(g.value||"暂无日志内容,点击刷新加载"),1))],512)])}}},re=q(te,[["__scopeId","data-v-b316ead3"]]);export{re as default};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{u as R}from"./ws-
|
|
1
|
+
import{u as R}from"./ws-Dma34ig_.js";import{_ as j}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{p as E,e as W,s as F,z as $}from"./antd-D6h4fDFf.js";import{o as q,a3 as u,a1 as p,k as o,Z as a,f as b,X as d,Y as l,G as k,u as v,F as A,a7 as D,W as C,a5 as m,a4 as z,c as G}from"./vendor-CN0Iv_qZ.js";const U={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},X={key:0,style:{"text-align":"center",padding:"30px"}},Y={key:1,style:{"text-align":"center",padding:"30px",color:"var(--text-muted)"}},Z={key:2,class:"servers-grid"},H={style:{display:"flex","align-items":"center",gap:"10px","margin-bottom":"6px"}},J={style:{color:"#e0e0e0","font-weight":"500","font-family":"monospace"}},K={key:0,style:{color:"var(--text-secondary)","font-size":"11px","font-family":"monospace"}},Q={key:1,style:{color:"var(--text-secondary)","font-size":"11px","margin-top":"4px"}},ee={key:0,style:{"text-align":"center",padding:"30px"}},te={key:0,style:{color:"#91caff","font-family":"monospace","font-size":"12px"}},oe={__name:"McpTools",setup(ae){const w=R(),f=b(!1),g=b([]),y=b([]),x=b(""),P=G(()=>{if(!x.value)return y.value;const r=x.value.toLowerCase();return y.value.filter(t=>t.name?.toLowerCase().includes(r)||t.description?.toLowerCase().includes(r))}),T=[{title:"工具名称",key:"name",dataIndex:"name",width:"30%"},{title:"服务器",key:"server",dataIndex:"server",width:"20%"},{title:"描述",dataIndex:"description",ellipsis:!0}];async function M(){f.value=!0;try{const[r,t]=await Promise.all([w.execute("mcp servers",15e3).catch(()=>({output:""})),w.execute("mcp tools",15e3).catch(()=>({output:""}))]);g.value=N(r.output),y.value=B(t.output)}catch(r){console.error("MCP load failed:",r)}finally{f.value=!1}}function N(r){const t=[],_=r.split(`
|
|
2
2
|
`);let s=null;for(const i of _){const e=i.trim();if(!e||e.startsWith("─")||e.startsWith("MCP"))continue;const c=e.match(/^[●•]?\s*([a-z][a-z0-9-_]+)\s*$/i)||e.match(/^([a-z][a-z0-9-_]+)\s*[::]/);c?(s&&t.push(s),s={key:c[1],name:c[1],command:"",args:[],description:""}):s&&(e.startsWith("command:")||e.startsWith("Command:")?s.command=e.replace(/^command:\s*/i,"").trim():e.startsWith("args:")||e.startsWith("Args:")?s.args=e.replace(/^args:\s*/i,"").split(",").map(h=>h.trim()):s.description||(s.description=e.slice(0,80)))}return s&&t.push(s),!t.length&&r.trim()&&!r.includes("No MCP")&&r.split(`
|
|
3
3
|
`).filter(e=>e.trim()&&!e.includes("─")).slice(0,10).forEach((e,c)=>{t.push({key:c,name:e.trim(),command:"",args:[],description:""})}),t}function B(r){const t=[],_=r.split(`
|
|
4
4
|
`);let s="unknown";for(const i of _){const e=i.trim();if(!e||e.startsWith("─"))continue;if(e.match(/^\[/)||e.match(/^Server:/i)){s=e.replace(/[\[\]]/g,"").replace(/^Server:\s*/i,"").trim();continue}const c=e.match(/^[●•]?\s*([a-z][a-z0-9_-]+)\s*[-–]\s*(.+)/i)||e.match(/^[●•]?\s*([a-z][a-z0-9_-]+)$/);c&&t.push({key:t.length,name:c[1],description:c[2]||"",server:s})}return t}return q(M),(r,t)=>{const _=d("a-button"),s=d("a-statistic"),i=d("a-card"),e=d("a-col"),c=d("a-row"),h=d("a-spin"),I=d("a-badge"),L=d("a-input-search"),O=d("a-tag"),V=d("a-table");return l(),u("div",null,[p("div",U,[t[2]||(t[2]=p("div",null,[p("h2",{class:"page-title"},"MCP 工具"),p("p",{class:"page-sub"},"Model Context Protocol — 已挂载工具与服务器")],-1)),o(_,{type:"primary",ghost:"",loading:f.value,onClick:M},{icon:a(()=>[o(v(E))]),default:a(()=>[t[1]||(t[1]=k(" 刷新 ",-1))]),_:1},8,["loading"])]),o(c,{gutter:[16,16],style:{"margin-bottom":"20px"}},{default:a(()=>[o(e,{xs:24,sm:8},{default:a(()=>[o(i,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"},size:"small"},{default:a(()=>[o(s,{title:"服务器数量",value:g.value.length,"value-style":"color: #1677ff; font-size: 20px;"},{prefix:a(()=>[o(v(W))]),_:1},8,["value"])]),_:1})]),_:1}),o(e,{xs:24,sm:8},{default:a(()=>[o(i,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"},size:"small"},{default:a(()=>[o(s,{title:"工具数量",value:y.value.length,"value-style":"color: #52c41a; font-size: 20px;"},{prefix:a(()=>[o(v(F))]),_:1},8,["value"])]),_:1})]),_:1}),o(e,{xs:24,sm:8},{default:a(()=>[o(i,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"},size:"small"},{default:a(()=>[o(s,{title:"运行状态",value:"就绪","value-style":"color: #52c41a; font-size: 20px;"},{prefix:a(()=>[o(v($))]),_:1})]),_:1})]),_:1})]),_:1}),o(i,{title:"已配置服务器",style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"16px"}},{default:a(()=>[f.value?(l(),u("div",X,[o(h)])):g.value.length?(l(),u("div",Z,[(l(!0),u(A,null,D(g.value,n=>(l(),C(i,{key:n.name,size:"small",style:{background:"var(--bg-card-hover)","border-color":"var(--border-color)"}},{default:a(()=>[p("div",H,[o(v(W),{style:{color:"#1677ff"}}),p("span",J,m(n.name),1),o(I,{status:"success"})]),n.command?(l(),u("div",K,m(n.command)+" "+m(n.args?.join(" ")),1)):z("",!0),n.description?(l(),u("div",Q,m(n.description),1)):z("",!0)]),_:2},1024))),128))])):(l(),u("div",Y,[...t[3]||(t[3]=[k(" 暂无 MCP 服务器,使用 ",-1),p("code",{style:{background:"var(--bg-card-hover)",padding:"2px 6px","border-radius":"3px"}},"chainlesschain mcp add",-1),k(" 添加 ",-1)])]))]),_:1}),o(i,{title:"可用工具",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{extra:a(()=>[o(L,{value:x.value,"onUpdate:value":t[0]||(t[0]=n=>x.value=n),placeholder:"搜索工具...","allow-clear":"",size:"small",style:{width:"200px"}},null,8,["value"])]),default:a(()=>[f.value?(l(),u("div",ee,[o(h)])):(l(),C(V,{key:1,columns:T,"data-source":P.value,pagination:{pageSize:15},size:"small"},{bodyCell:a(({column:n,record:S})=>[n.key==="name"?(l(),u("span",te,m(S.name),1)):z("",!0),n.key==="server"?(l(),C(O,{key:1,color:"blue",style:{"font-size":"10px"}},{default:a(()=>[k(m(S.server),1)]),_:2},1024)):z("",!0)]),emptyText:a(()=>[...t[4]||(t[4]=[p("div",{style:{padding:"30px",color:"var(--text-muted)"}},"暂无可用工具",-1)])]),_:1},8,["data-source"]))]),_:1})])}}},ie=j(oe,[["__scopeId","data-v-8a49311e"]]);export{ie as default};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{u as
|
|
2
|
-
`);for(const x of d){const i=x.trim();if(!i||i.startsWith("─")||i.startsWith("Recall"))continue;const m=i.match(/^[-●•\d.]+\s+(.+)/);if(m){const b=m[1].trim();b.length>5&&e.push({id:e.length,content:b,layer:s.value,importance:"",time:""})}else i.length>10&&!i.includes(":")&&e.length<30&&e.push({id:e.length,content:i,layer:s.value,importance:"",time:""})}return e.slice(0,20)}async function q(){if(!c.value.content.trim()){k.warning("请输入记忆内容");return}$.value=!0;try{const a=`hmemory store "${c.value.content.replace(/"/g,'\\"')}" --importance ${c.value.importance}`,{output:e}=await w.execute(a,15e3);e.toLowerCase().includes("stored")||e.includes("✔")?(k.success("记忆已存储"),C.value=!1,c.value={content:"",importance:.5},await O()):(k.warning(e.slice(0,100)||"存储完成"),C.value=!1)}catch(a){k.error("存储失败: "+a.message)}finally{$.value=!1}}async function F(){S.value=!0;try{const{output:a}=await w.execute("hmemory consolidate",2e4);k.success("记忆巩固完成"),await O()}catch(a){k.error("巩固失败: "+a.message)}finally{S.value=!1}}return ne(O),(a,e)=>{const d=n("a-button"),x=n("a-space"),i=n("a-statistic"),m=n("a-card"),b=n("a-col"),
|
|
1
|
+
import{u as A}from"./ws-Dma34ig_.js";import{_ as H}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{N as K,p as ee,T as te,h as oe,O as ae,Q as le,J as k}from"./antd-D6h4fDFf.js";import{o as ne,a3 as v,a1 as r,k as t,Z as o,X as n,f as u,Y as f,G as p,u as h,a4 as I,F as re,a7 as se,a5 as B}from"./vendor-CN0Iv_qZ.js";const ie={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},ue={style:{display:"flex","align-items":"center",gap:"12px"}},ce={key:0,style:{"text-align":"center",padding:"30px"}},de={key:1,style:{"text-align":"center",padding:"30px",color:"var(--text-muted)"}},pe={key:2,class:"memory-list"},me={style:{display:"flex","justify-content":"space-between","align-items":"flex-start","margin-bottom":"4px"}},ve={style:{display:"flex",gap:"8px","align-items":"center"}},fe={key:0,style:{color:"var(--text-secondary)","font-size":"11px"}},ye={style:{color:"var(--text-muted)","font-size":"11px"}},ge={style:{color:"#ccc","font-size":"13px","line-height":"1.6"}},_e={__name:"Memory",setup(xe){const w=A(),T=u(!1),y=u(!1),S=u(!1),$=u(!1),C=u(!1),g=u({shortTerm:0,longTerm:0,core:0}),_=u([]),s=u("short-term"),z=u(""),c=u({content:"",importance:.5});function V(a){return{"short-term":"purple","long-term":"blue",core:"green"}[a]||"default"}function W(a){return{"short-term":"短期","long-term":"长期",core:"核心"}[a]||a}async function O(){T.value=!0;try{const{output:a}=await w.execute("hmemory stats",15e3);R(a)}catch(a){console.error("hmemory stats failed:",a)}finally{T.value=!1,await M()}}function R(a){const e=a.match(/short.?term[^\d]*(\d+)/i),d=a.match(/long.?term[^\d]*(\d+)/i),x=a.match(/core[^\d]*(\d+)/i);e&&(g.value.shortTerm=parseInt(e[1])),d&&(g.value.longTerm=parseInt(d[1])),x&&(g.value.core=parseInt(x[1]))}async function M(){y.value=!0;try{const a=s.value==="short-term"?"recent":s.value==="long-term"?"important":"core",{output:e}=await w.execute(`hmemory recall "${a}" --limit 20`,15e3);_.value=N(e)}catch{_.value=[]}finally{y.value=!1}}async function j(){if(!z.value.trim()){await M();return}y.value=!0;try{const{output:a}=await w.execute(`hmemory recall "${z.value}"`,15e3);_.value=N(a)}catch{_.value=[]}finally{y.value=!1}}function N(a){const e=[],d=a.split(`
|
|
2
|
+
`);for(const x of d){const i=x.trim();if(!i||i.startsWith("─")||i.startsWith("Recall"))continue;const m=i.match(/^[-●•\d.]+\s+(.+)/);if(m){const b=m[1].trim();b.length>5&&e.push({id:e.length,content:b,layer:s.value,importance:"",time:""})}else i.length>10&&!i.includes(":")&&e.length<30&&e.push({id:e.length,content:i,layer:s.value,importance:"",time:""})}return e.slice(0,20)}async function q(){if(!c.value.content.trim()){k.warning("请输入记忆内容");return}$.value=!0;try{const a=`hmemory store "${c.value.content.replace(/"/g,'\\"')}" --importance ${c.value.importance}`,{output:e}=await w.execute(a,15e3);e.toLowerCase().includes("stored")||e.includes("✔")?(k.success("记忆已存储"),C.value=!1,c.value={content:"",importance:.5},await O()):(k.warning(e.slice(0,100)||"存储完成"),C.value=!1)}catch(a){k.error("存储失败: "+a.message)}finally{$.value=!1}}async function F(){S.value=!0;try{const{output:a}=await w.execute("hmemory consolidate",2e4);k.success("记忆巩固完成"),await O()}catch(a){k.error("巩固失败: "+a.message)}finally{S.value=!1}}return ne(O),(a,e)=>{const d=n("a-button"),x=n("a-space"),i=n("a-statistic"),m=n("a-card"),b=n("a-col"),Q=n("a-row"),L=n("a-radio-button"),D=n("a-radio-group"),E=n("a-input-search"),G=n("a-spin"),be=n("BrainOutlined"),J=n("a-tag"),P=n("a-textarea"),U=n("a-form-item"),X=n("a-slider"),Y=n("a-form"),Z=n("a-modal");return f(),v("div",null,[r("div",ie,[e[11]||(e[11]=r("div",null,[r("h2",{class:"page-title"},"记忆文件"),r("p",{class:"page-sub"},"分层记忆系统 — 短期 / 长期 / 核心记忆")],-1)),t(x,null,{default:o(()=>[t(d,{onClick:e[0]||(e[0]=l=>C.value=!0),type:"primary"},{icon:o(()=>[t(h(K))]),default:o(()=>[e[9]||(e[9]=p(" 存储记忆 ",-1))]),_:1}),t(d,{ghost:"",loading:T.value,onClick:O},{icon:o(()=>[t(h(ee))]),default:o(()=>[e[10]||(e[10]=p(" 刷新 ",-1))]),_:1},8,["loading"])]),_:1})]),t(Q,{gutter:[16,16],style:{"margin-bottom":"20px"}},{default:o(()=>[t(b,{xs:24,sm:8},{default:o(()=>[t(m,{style:{background:"rgba(114,46,209,.1)","border-color":"rgba(114,46,209,.35)",cursor:"pointer"},hoverable:"",onClick:e[1]||(e[1]=l=>s.value="short-term")},{default:o(()=>[t(i,{title:"短期记忆",value:g.value.shortTerm||0,"value-style":"color: #c084fc; font-size: 20px;"},{prefix:o(()=>[t(h(te))]),_:1},8,["value"]),e[12]||(e[12]=r("div",{style:{"margin-top":"4px",color:"var(--text-secondary)","font-size":"11px"}},"最近会话内容",-1))]),_:1})]),_:1}),t(b,{xs:24,sm:8},{default:o(()=>[t(m,{style:{background:"rgba(22,119,255,.08)","border-color":"rgba(22,119,255,.3)",cursor:"pointer"},hoverable:"",onClick:e[2]||(e[2]=l=>s.value="long-term")},{default:o(()=>[t(i,{title:"长期记忆",value:g.value.longTerm||0,"value-style":"color: #91caff; font-size: 20px;"},{prefix:o(()=>[t(h(oe))]),_:1},8,["value"]),e[13]||(e[13]=r("div",{style:{"margin-top":"4px",color:"var(--text-secondary)","font-size":"11px"}},"巩固后的重要信息",-1))]),_:1})]),_:1}),t(b,{xs:24,sm:8},{default:o(()=>[t(m,{style:{background:"rgba(41,162,112,.08)","border-color":"rgba(41,162,112,.3)",cursor:"pointer"},hoverable:"",onClick:e[3]||(e[3]=l=>s.value="core")},{default:o(()=>[t(i,{title:"核心记忆",value:g.value.core||0,"value-style":"color: #69db7c; font-size: 20px;"},{prefix:o(()=>[t(h(ae))]),_:1},8,["value"]),e[14]||(e[14]=r("div",{style:{"margin-top":"4px",color:"var(--text-secondary)","font-size":"11px"}},"高重要性长期保留",-1))]),_:1})]),_:1})]),_:1}),t(m,{style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"16px"}},{title:o(()=>[r("div",ue,[e[18]||(e[18]=r("span",null,"记忆内容",-1)),t(D,{value:s.value,"onUpdate:value":e[4]||(e[4]=l=>s.value=l),"button-style":"solid",size:"small",onChange:M},{default:o(()=>[t(L,{value:"short-term"},{default:o(()=>[...e[15]||(e[15]=[p("短期",-1)])]),_:1}),t(L,{value:"long-term"},{default:o(()=>[...e[16]||(e[16]=[p("长期",-1)])]),_:1}),t(L,{value:"core"},{default:o(()=>[...e[17]||(e[17]=[p("核心",-1)])]),_:1})]),_:1},8,["value"])])]),extra:o(()=>[t(E,{value:z.value,"onUpdate:value":e[5]||(e[5]=l=>z.value=l),placeholder:"语义搜索记忆...","allow-clear":"",size:"small",style:{width:"220px"},loading:y.value,onSearch:j},null,8,["value","loading"])]),default:o(()=>[y.value?(f(),v("div",ce,[t(G)])):_.value.length?(f(),v("div",pe,[(f(!0),v(re,null,se(_.value,l=>(f(),v("div",{key:l.id,class:"memory-item"},[r("div",me,[r("div",ve,[t(J,{color:V(l.layer||s.value),style:{"font-size":"10px"}},{default:o(()=>[p(B(W(l.layer||s.value)),1)]),_:2},1032,["color"]),l.importance?(f(),v("span",fe," 重要度 "+B(l.importance),1)):I("",!0)]),r("span",ye,B(l.time),1)]),r("div",ge,B(l.content),1)]))),128))])):(f(),v("div",de,[I("",!0),e[19]||(e[19]=p(' 暂无记忆内容,点击"存储记忆"添加 ',-1))]))]),_:1}),t(d,{loading:S.value,onClick:F,style:{background:"var(--bg-card-hover)","border-color":"var(--text-muted)",width:"100%"}},{icon:o(()=>[t(h(le))]),default:o(()=>[e[20]||(e[20]=p(" 巩固记忆(短期 → 长期晋升) ",-1))]),_:1},8,["loading"]),t(Z,{open:C.value,"onUpdate:open":e[8]||(e[8]=l=>C.value=l),title:"存储新记忆","confirm-loading":$.value,onOk:q},{default:o(()=>[t(Y,{"label-col":{span:4},"wrapper-col":{span:20},style:{"margin-top":"16px"}},{default:o(()=>[t(U,{label:"内容",required:""},{default:o(()=>[t(P,{value:c.value.content,"onUpdate:value":e[6]||(e[6]=l=>c.value.content=l),rows:4,placeholder:"要存储的记忆内容..."},null,8,["value"])]),_:1}),t(U,{label:"重要度"},{default:o(()=>[t(X,{value:c.value.importance,"onUpdate:value":e[7]||(e[7]=l=>c.value.importance=l),min:0,max:1,step:.1,marks:{0:"低",.5:"中",1:"高"}},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"])])}}},Oe=H(_e,[["__scopeId","data-v-ebb07e22"]]);export{Oe as default};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{u as
|
|
2
|
-
`);for(const T of y){const u=T.trim();if(!u||u.startsWith("─")||u.startsWith("Note")||u.match(/^\d+ note/i))continue;const r=u.match(/^(\d+)\.\s+(.+?)(?:\s+\[([^\]]+)\])?\s*(?:-\s*(.*))?$/);r?e.push({key:r[1],id:r[1],title:r[2].trim(),tags:r[3]?r[3].split(",").map(F=>F.trim()):[],preview:(r[4]||"").trim().slice(0,100),content:""}):u.length>2&&!u.startsWith("✖")&&!u.startsWith("[")&&e.push({key:e.length,id:String(e.length),title:u,tags:[],preview:"",content:""})}return e}async function
|
|
1
|
+
import{u as H}from"./ws-Dma34ig_.js";import{_ as K}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{N as ee,p as te,b as ae,J as C}from"./antd-D6h4fDFf.js";import{o as le,a3 as v,a1 as p,a5 as d,k as l,Z as o,W as x,a4 as _,f as s,X as c,c as oe,Y as i,G as m,u as M,F as A,a7 as D}from"./vendor-CN0Iv_qZ.js";const ne={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},se={class:"page-sub"},ie={style:{"margin-bottom":"16px",display:"flex",gap:"10px"}},ue={key:0,style:{"text-align":"center",padding:"60px"}},re={key:0,style:{color:"#e0e0e0","font-weight":"500"}},ce={key:2,style:{color:"var(--text-secondary)","font-size":"12px"}},pe={style:{padding:"40px",color:"var(--text-muted)","text-align":"center"}},de={key:0,style:{"max-height":"60vh","overflow-y":"auto"}},ve={style:{"margin-bottom":"10px"}},me={style:{"white-space":"pre-wrap",color:"#ccc","font-family":"inherit","line-height":"1.7",background:"var(--bg-base)",padding:"16px","border-radius":"6px",border:"1px solid var(--border-color)"}},fe={__name:"Notes",setup(ge){const $=H(),h=s(!1),S=s(!1),z=s(!1),U=s(""),W=s([]),w=s([]),k=s(!1),f=s(""),b=s(!1),V=s(!1),g=s(null),n=s({title:"",content:"",tags:""}),E=oe(()=>k.value?w.value:W.value),G=[{title:"标题",dataIndex:"title",key:"title",width:"30%"},{title:"预览",key:"content",ellipsis:!0},{title:"标签",key:"tags",width:"20%"},{title:"操作",key:"actions",width:"80px"}];async function B(){h.value=!0,U.value="";try{const{output:a}=await $.execute("note list",2e4);W.value=R(a)}catch(a){U.value=`加载失败: ${a.message}`}finally{h.value=!1}}function R(a){const e=[],y=a.split(`
|
|
2
|
+
`);for(const T of y){const u=T.trim();if(!u||u.startsWith("─")||u.startsWith("Note")||u.match(/^\d+ note/i))continue;const r=u.match(/^(\d+)\.\s+(.+?)(?:\s+\[([^\]]+)\])?\s*(?:-\s*(.*))?$/);r?e.push({key:r[1],id:r[1],title:r[2].trim(),tags:r[3]?r[3].split(",").map(F=>F.trim()):[],preview:(r[4]||"").trim().slice(0,100),content:""}):u.length>2&&!u.startsWith("✖")&&!u.startsWith("[")&&e.push({key:e.length,id:String(e.length),title:u,tags:[],preview:"",content:""})}return e}async function J(){if(!f.value.trim()){O();return}S.value=!0,k.value=!0;try{const{output:a}=await $.execute(`note search "${f.value}"`,15e3);w.value=R(a)}catch{w.value=[]}finally{S.value=!1}}function O(){f.value="",k.value=!1,w.value=[]}async function P(){if(!n.value.title.trim()){C.warning("请输入标题");return}z.value=!0;try{let a=`note add "${n.value.title}"`;n.value.content&&(a+=` -c "${n.value.content.replace(/"/g,'\\"')}"`),n.value.tags&&(a+=` -t "${n.value.tags}"`);const{output:e}=await $.execute(a,15e3);e.includes("✖")||e.toLowerCase().includes("error")?C.error("添加失败: "+e.slice(0,100)):(C.success("笔记已添加"),b.value=!1,n.value={title:"",content:"",tags:""},await B())}catch(a){C.error("添加失败: "+a.message)}finally{z.value=!1}}function Q(a){g.value=a,V.value=!0}return le(B),(a,e)=>{const y=c("a-button"),T=c("a-space"),u=c("a-input-search"),r=c("a-tag"),F=c("a-spin"),X=c("a-table"),j=c("a-input"),L=c("a-form-item"),Y=c("a-textarea"),Z=c("a-form"),q=c("a-modal");return i(),v("div",null,[p("div",ne,[p("div",null,[e[7]||(e[7]=p("h2",{class:"page-title"},"笔记管理",-1)),p("p",se,"个人知识库 · "+d(W.value.length)+" 条笔记",1)]),l(T,null,{default:o(()=>[l(y,{onClick:e[0]||(e[0]=t=>b.value=!0),type:"primary"},{icon:o(()=>[l(M(ee))]),default:o(()=>[e[8]||(e[8]=m(" 新建笔记 ",-1))]),_:1}),l(y,{ghost:"",loading:h.value,onClick:B},{icon:o(()=>[l(M(te))]),default:o(()=>[e[9]||(e[9]=m(" 刷新 ",-1))]),_:1},8,["loading"])]),_:1})]),p("div",ie,[l(u,{value:f.value,"onUpdate:value":e[1]||(e[1]=t=>f.value=t),placeholder:"搜索笔记...","allow-clear":"",style:{"max-width":"400px"},loading:S.value,onSearch:J,onClear:O},null,8,["value","loading"]),k.value?(i(),x(r,{key:0,color:"blue",closable:"",onClose:O},{default:o(()=>[m(" 搜索: "+d(f.value),1)]),_:1})):_("",!0)]),h.value?(i(),v("div",ue,[l(F,{size:"large"})])):(i(),x(X,{key:1,columns:G,"data-source":E.value,pagination:{pageSize:20,showTotal:t=>`共 ${t} 条`},size:"small",style:{background:"var(--bg-card)"},"row-class-name":()=>"note-row"},{bodyCell:o(({column:t,record:N})=>[t.key==="title"?(i(),v("span",re,d(N.title),1)):_("",!0),t.key==="tags"?(i(!0),v(A,{key:1},D(N.tags,I=>(i(),x(r,{key:I,color:"blue",style:{"font-size":"10px",margin:"1px"}},{default:o(()=>[m(d(I),1)]),_:2},1024))),128)):_("",!0),t.key==="content"?(i(),v("span",ce,d(N.preview),1)):_("",!0),t.key==="actions"?(i(),x(y,{key:3,size:"small",type:"link",onClick:I=>Q(N)},{default:o(()=>[...e[10]||(e[10]=[m("查看",-1)])]),_:1},8,["onClick"])):_("",!0)]),emptyText:o(()=>[p("div",pe,[l(M(ae),{style:{"font-size":"40px","margin-bottom":"12px",display:"block"}}),m(" "+d(U.value||'暂无笔记,点击"新建笔记"添加'),1)])]),_:1},8,["data-source","pagination"])),l(q,{open:b.value,"onUpdate:open":e[5]||(e[5]=t=>b.value=t),title:"新建笔记","confirm-loading":z.value,onOk:P},{default:o(()=>[l(Z,{"label-col":{span:4},"wrapper-col":{span:20},style:{"margin-top":"16px"}},{default:o(()=>[l(L,{label:"标题",required:""},{default:o(()=>[l(j,{value:n.value.title,"onUpdate:value":e[2]||(e[2]=t=>n.value.title=t),placeholder:"笔记标题"},null,8,["value"])]),_:1}),l(L,{label:"内容"},{default:o(()=>[l(Y,{value:n.value.content,"onUpdate:value":e[3]||(e[3]=t=>n.value.content=t),rows:5,placeholder:"笔记内容..."},null,8,["value"])]),_:1}),l(L,{label:"标签"},{default:o(()=>[l(j,{value:n.value.tags,"onUpdate:value":e[4]||(e[4]=t=>n.value.tags=t),placeholder:"用逗号分隔,如: work,ideas"},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"]),l(q,{open:V.value,"onUpdate:open":e[6]||(e[6]=t=>V.value=t),title:g.value?.title,footer:null,width:"700px"},{default:o(()=>[g.value?(i(),v("div",de,[p("div",ve,[(i(!0),v(A,null,D(g.value.tags,t=>(i(),x(r,{key:t,color:"blue"},{default:o(()=>[m(d(t),1)]),_:2},1024))),128))]),p("pre",me,d(g.value.content||g.value.preview),1)])):_("",!0)]),_:1},8,["open","title"])])}}},we=K(fe,[["__scopeId","data-v-4630ece9"]]);export{we as default};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{o as Fe,a3 as v,a1 as h,k as a,Z as o,f as i,X as g,Y as r,G as f,u as C,W as _,a5 as m,a4 as y,F as be,A as ke,c as
|
|
2
|
-
`);for(const s of t){const u=s.trim();if(!u||u.startsWith("─")||u.match(/^\d+ org/i))continue;const c=u.split(/\s*[|│]\s*/);c.length>=3&&e.push({key:e.length,id:c[0]||"-",name:c[1]||"-",owner:c[2]||"-",description:c[3]||"",memberCount:parseInt(c[4],10)||0})}return e}async function Oe(){if(!U.value.trim()){p.warning("请输入组织名称");return}ae.value=!0;try{const l=U.value.trim().replace(/"/g,'\\"'),e=
|
|
3
|
-
`);for(const s of t){const u=s.trim();if(!u||u.startsWith("─")||u.match(/^\d+ member/i))continue;const c=u.split(/\s*[|│]\s*/);c.length>=3&&e.push({key:e.length,userId:c[0]||"-",name:c[1]||"-",role:c[2]||"member",joinedAt:c[3]||"-"})}return e}async function ce(){if(x.value){ie.value=!0;try{const{output:l}=await k.execute(`org teams ${x.value} --json`,15e3),e=T(l);Array.isArray(e)?re.value=e.map((t,s)=>({key:t.id||t.name||s,name:t.name||"-",description:t.description||"",lead:t.lead||t.leader||"-"})):re.value=[]}catch(l){p.error("加载团队失败: "+l.message)}finally{ie.value=!1}}}async function De(){if(!L.value.trim()){p.warning("请输入用户 ID");return}ue.value=!0;try{const l=L.value.trim().replace(/"/g,'\\"'),e=K.value.trim().replace(/"/g,'\\"');let t=`org invite ${x.value} ${l} --role ${P.value}`;e&&(t+=` --name "${e}"`);const{output:s}=await k.execute(t,2e4);s.includes("error")||s.includes("失败")?p.error("邀请失败: "+s.slice(0,120)):(p.success("邀请已发送"),
|
|
4
|
-
`);for(const s of t){const u=s.trim();if(!u||u.startsWith("─")||u.match(/^\d+ approval/i))continue;const c=u.split(/\s*[|│]\s*/);c.length>=4&&e.push({key:e.length,id:c[0]||"-",title:c[1]||"-",type:c[2]||"-",requester:c[3]||"-",status:c[4]||"pending",_approving:!1,_rejecting:!1})}return e}async function Be(l){l._approving=!0;try{const{output:e}=await k.execute(`org approve ${l.id}`,15e3);e.includes("error")||e.includes("失败")?p.error("审批失败: "+e.slice(0,120)):(p.success("已通过"),await M())}catch(e){p.error("审批失败: "+e.message)}finally{l._approving=!1}}async function Ve(l){l._rejecting=!0;try{const{output:e}=await k.execute(`org reject ${l.id}`,15e3);e.includes("error")||e.includes("失败")?p.error("拒绝失败: "+e.slice(0,120)):(p.success("已拒绝"),await M())}catch(e){p.error("拒绝失败: "+e.message)}finally{l._rejecting=!1}}async function We(){if(!q.value){p.warning("请选择组织");return}if(!S.value.trim()){p.warning("请输入审批标题");return}me.value=!0;try{const l=S.value.trim().replace(/"/g,'\\"'),e=Q.value.trim().replace(/"/g,'\\"'),t=X.value.trim().replace(/"/g,'\\"');let s=`org approve --submit --org ${q.value} --title "${l}"`;e&&(s+=` --type "${e}"`),t&&(s+=` --description "${t}"`);const{output:u}=await k.execute(s,2e4);u.includes("error")||u.includes("失败")?p.error("提交失败: "+u.slice(0,120)):(p.success("审批已提交"),H.value=!1,q.value=null,S.value="",Q.value="",X.value="",await M())}catch(l){p.error("提交失败: "+l.message)}finally{me.value=!1}}return Fe(()=>{j()}),(l,e)=>{const t=g("a-button"),s=g("a-space"),u=g("a-spin"),c=g("a-tag"),N=g("a-empty"),Y=g("a-table"),A=g("a-descriptions-item"),Je=g("a-descriptions"),B=g("a-modal"),I=g("a-input"),b=g("a-form-item"),Z=g("a-form"),ye=g("a-tab-pane"),fe=g("a-select"),Ke=g("a-textarea"),Pe=g("a-tabs");return r(),v("div",null,[h("div",tt,[e[24]||(e[24]=h("div",null,[h("h2",{class:"page-title"},"组织管理"),h("p",{class:"page-sub"},"组织 / 成员 / 审批")],-1)),a(t,{type:"primary",ghost:"",loading:ee.value,onClick:we},{icon:o(()=>[a(C(Qe))]),default:o(()=>[e[23]||(e[23]=f(" 刷新 ",-1))]),_:1},8,["loading"])]),a(Pe,{activeKey:z.value,"onUpdate:activeKey":e[22]||(e[22]=n=>z.value=n),type:"card",onChange:Ce},{default:o(()=>[a(ye,{key:"orgs"},{tab:o(()=>[a(C(Xe)),e[25]||(e[25]=f(" 组织列表 ",-1))]),default:o(()=>[a(s,{style:{"margin-bottom":"16px"}},{default:o(()=>[a(t,{type:"primary",onClick:e[0]||(e[0]=n=>V.value=!0)},{icon:o(()=>[a(C(ge))]),default:o(()=>[e[26]||(e[26]=f(" 创建组织 ",-1))]),_:1})]),_:1}),te.value?(r(),v("div",at,[a(u,{size:"large"})])):(r(),_(Y,{key:1,columns:Ie,"data-source":O.value,pagination:{pageSize:20,showTotal:n=>`共 ${n} 条`},size:"small",style:{background:"var(--bg-card)"},"row-class-name":()=>"org-row","custom-row":n=>({onClick:()=>$e(n)})},{bodyCell:o(({column:n,record:d})=>[n.key==="id"?(r(),v("span",lt,m(d.id),1)):y("",!0),n.key==="name"?(r(),v("a",nt,m(d.name),1)):y("",!0),n.key==="owner"?(r(),v("span",ot,m(d.owner),1)):y("",!0),n.key==="description"?(r(),v("span",st,m(d.description),1)):y("",!0),n.key==="memberCount"?(r(),_(c,{key:4,color:"blue"},{default:o(()=>[f(m(d.memberCount),1)]),_:2},1024)):y("",!0)]),emptyText:o(()=>[a(N,{description:"暂无组织,点击「创建组织」添加"})]),_:1},8,["data-source","pagination","custom-row"])),a(B,{open:le.value,"onUpdate:open":e[1]||(e[1]=n=>le.value=n),title:"组织详情: "+w.value.name,footer:null,width:"640px"},{default:o(()=>[ne.value?(r(),v("div",it,[a(u)])):(r(),v("div",rt,[a(Je,{column:1,bordered:"",size:"small",style:{"margin-bottom":"16px"}},{default:o(()=>[a(A,{label:"ID"},{default:o(()=>[h("span",ut,m(w.value.id),1)]),_:1}),a(A,{label:"名称"},{default:o(()=>[f(m(w.value.name),1)]),_:1}),a(A,{label:"所有者"},{default:o(()=>[f(m(w.value.owner),1)]),_:1}),a(A,{label:"描述"},{default:o(()=>[f(m(w.value.description||"-"),1)]),_:1}),a(A,{label:"成员数"},{default:o(()=>[f(m(w.value.memberCount),1)]),_:1}),w.value.createdAt?(r(),_(A,{key:0,label:"创建时间"},{default:o(()=>[f(m(w.value.createdAt),1)]),_:1})):y("",!0)]),_:1}),$.value?(r(),v("pre",dt,m($.value),1)):y("",!0)]))]),_:1},8,["open","title"]),a(B,{open:V.value,"onUpdate:open":e[4]||(e[4]=n=>V.value=n),title:"创建组织","confirm-loading":ae.value,onOk:Oe,"ok-text":"创建","cancel-text":"取消"},{default:o(()=>[a(Z,{"label-col":{span:4},"wrapper-col":{span:20},style:{"margin-top":"16px"}},{default:o(()=>[a(b,{label:"名称",required:""},{default:o(()=>[a(I,{value:U.value,"onUpdate:value":e[2]||(e[2]=n=>U.value=n),placeholder:"请输入组织名称"},null,8,["value"])]),_:1}),a(b,{label:"描述"},{default:o(()=>[a(I,{value:W.value,"onUpdate:value":e[3]||(e[3]=n=>W.value=n),placeholder:"请输入组织描述(可选)"},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"])]),_:1}),a(ye,{key:"members"},{tab:o(()=>[a(C(_e)),e[27]||(e[27]=f(" 成员管理 ",-1))]),default:o(()=>[h("div",pt,[a(fe,{value:x.value,"onUpdate:value":e[5]||(e[5]=n=>x.value=n),placeholder:"选择组织",style:{width:"280px"},options:xe.value,onChange:Ue},null,8,["value","options"]),a(t,{type:"primary",disabled:!x.value,onClick:e[6]||(e[6]=n=>J.value=!0)},{icon:o(()=>[a(C(_e))]),default:o(()=>[e[28]||(e[28]=f(" 邀请成员 ",-1))]),_:1},8,["disabled"])]),oe.value?(r(),v("div",ct,[a(u,{size:"large"})])):x.value?(r(),_(Y,{key:1,columns:Ae,"data-source":se.value,pagination:{pageSize:20,showTotal:n=>`共 ${n} 条`},size:"small",style:{background:"var(--bg-card)","margin-bottom":"24px"},"row-class-name":()=>"org-row"},{bodyCell:o(({column:n,record:d})=>[n.key==="userId"?(r(),v("span",vt,m(d.userId),1)):y("",!0),n.key==="name"?(r(),v("span",mt,m(d.name),1)):y("",!0),n.key==="role"?(r(),_(c,{key:2,color:Te(d.role)},{default:o(()=>[f(m(d.role),1)]),_:2},1032,["color"])):y("",!0),n.key==="joinedAt"?(r(),v("span",yt,m(d.joinedAt),1)):y("",!0)]),emptyText:o(()=>[a(N,{description:"暂无成员"})]),_:1},8,["data-source","pagination"])):(r(),_(N,{key:2,description:"请先选择一个组织",style:{padding:"60px 0"}})),x.value?(r(),v(be,{key:3},[h("div",ft,[e[30]||(e[30]=h("h3",{style:{color:"var(--text-primary)",margin:"0","font-size":"15px"}},"团队",-1)),a(t,{size:"small",onClick:e[7]||(e[7]=n=>R.value=!0)},{icon:o(()=>[a(C(ge))]),default:o(()=>[e[29]||(e[29]=f(" 创建团队 ",-1))]),_:1})]),ie.value?(r(),v("div",gt,[a(u)])):(r(),_(Y,{key:1,columns:ze,"data-source":re.value,pagination:!1,size:"small",style:{background:"var(--bg-card)"},"row-class-name":()=>"org-row"},{bodyCell:o(({column:n,record:d})=>[n.key==="name"?(r(),v("span",xt,m(d.name),1)):y("",!0),n.key==="description"?(r(),v("span",bt,m(d.description),1)):y("",!0),n.key==="lead"?(r(),v("span",kt,m(d.lead),1)):y("",!0)]),emptyText:o(()=>[a(N,{description:"暂无团队"})]),_:1},8,["data-source"]))],64)):y("",!0),a(B,{open:J.value,"onUpdate:open":e[11]||(e[11]=n=>J.value=n),title:"邀请成员","confirm-loading":ue.value,onOk:De,"ok-text":"邀请","cancel-text":"取消"},{default:o(()=>[a(Z,{"label-col":{span:5},"wrapper-col":{span:19},style:{"margin-top":"16px"}},{default:o(()=>[a(b,{label:"用户 ID",required:""},{default:o(()=>[a(I,{value:L.value,"onUpdate:value":e[8]||(e[8]=n=>L.value=n),placeholder:"请输入用户 ID"},null,8,["value"])]),_:1}),a(b,{label:"名称"},{default:o(()=>[a(I,{value:K.value,"onUpdate:value":e[9]||(e[9]=n=>K.value=n),placeholder:"请输入用户名称"},null,8,["value"])]),_:1}),a(b,{label:"角色"},{default:o(()=>[a(fe,{value:P.value,"onUpdate:value":e[10]||(e[10]=n=>P.value=n),options:je},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"]),a(B,{open:R.value,"onUpdate:open":e[15]||(e[15]=n=>R.value=n),title:"创建团队","confirm-loading":de.value,onOk:qe,"ok-text":"创建","cancel-text":"取消"},{default:o(()=>[a(Z,{"label-col":{span:5},"wrapper-col":{span:19},style:{"margin-top":"16px"}},{default:o(()=>[a(b,{label:"团队名称",required:""},{default:o(()=>[a(I,{value:D.value,"onUpdate:value":e[12]||(e[12]=n=>D.value=n),placeholder:"请输入团队名称"},null,8,["value"])]),_:1}),a(b,{label:"描述"},{default:o(()=>[a(I,{value:F.value,"onUpdate:value":e[13]||(e[13]=n=>F.value=n),placeholder:"请输入团队描述(可选)"},null,8,["value"])]),_:1}),a(b,{label:"负责人"},{default:o(()=>[a(I,{value:E.value,"onUpdate:value":e[14]||(e[14]=n=>E.value=n),placeholder:"请输入负责人 ID(可选)"},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"])]),_:1}),a(ye,{key:"approvals"},{tab:o(()=>[a(C(et)),e[31]||(e[31]=f(" 审批管理 ",-1))]),default:o(()=>[a(s,{style:{"margin-bottom":"16px"}},{default:o(()=>[a(t,{type:"primary",onClick:e[16]||(e[16]=n=>H.value=!0)},{icon:o(()=>[a(C(ge))]),default:o(()=>[e[32]||(e[32]=f(" 提交审批 ",-1))]),_:1})]),_:1}),ve.value?(r(),v("div",_t,[a(u,{size:"large"})])):(r(),_(Y,{key:1,columns:Se,"data-source":G.value,pagination:{pageSize:20,showTotal:n=>`共 ${n} 条`},size:"small",style:{background:"var(--bg-card)"},"row-class-name":()=>"org-row"},{bodyCell:o(({column:n,record:d})=>[n.key==="id"?(r(),v("span",wt,m(d.id),1)):y("",!0),n.key==="title"?(r(),v("span",Ct,m(d.title),1)):y("",!0),n.key==="type"?(r(),_(c,{key:2,color:"blue"},{default:o(()=>[f(m(d.type),1)]),_:2},1024)):y("",!0),n.key==="requester"?(r(),v("span",It,m(d.requester),1)):y("",!0),n.key==="status"?(r(),_(c,{key:4,color:Me(d.status)},{default:o(()=>[f(m(d.status),1)]),_:2},1032,["color"])):y("",!0),n.key==="actions"?(r(),v(be,{key:5},[(d.status||"").toLowerCase()==="pending"?(r(),_(s,{key:0},{default:o(()=>[a(t,{type:"primary",size:"small",loading:d._approving,onClick:ke(Re=>Be(d),["stop"])},{icon:o(()=>[a(C(Ye))]),default:o(()=>[e[33]||(e[33]=f(" 通过 ",-1))]),_:1},8,["loading","onClick"]),a(t,{danger:"",size:"small",loading:d._rejecting,onClick:ke(Re=>Ve(d),["stop"])},{icon:o(()=>[a(C(Ze))]),default:o(()=>[e[34]||(e[34]=f(" 拒绝 ",-1))]),_:1},8,["loading","onClick"])]),_:2},1024)):(r(),v("span",ht,"-"))],64)):y("",!0)]),emptyText:o(()=>[a(N,{description:"暂无审批记录"})]),_:1},8,["data-source","pagination"])),a(B,{open:H.value,"onUpdate:open":e[21]||(e[21]=n=>H.value=n),title:"提交审批","confirm-loading":me.value,onOk:We,"ok-text":"提交","cancel-text":"取消"},{default:o(()=>[a(Z,{"label-col":{span:5},"wrapper-col":{span:19},style:{"margin-top":"16px"}},{default:o(()=>[a(b,{label:"组织",required:""},{default:o(()=>[a(fe,{value:q.value,"onUpdate:value":e[17]||(e[17]=n=>q.value=n),placeholder:"选择组织",options:xe.value},null,8,["value","options"])]),_:1}),a(b,{label:"标题",required:""},{default:o(()=>[a(I,{value:S.value,"onUpdate:value":e[18]||(e[18]=n=>S.value=n),placeholder:"请输入审批标题"},null,8,["value"])]),_:1}),a(b,{label:"类型"},{default:o(()=>[a(I,{value:Q.value,"onUpdate:value":e[19]||(e[19]=n=>Q.value=n),placeholder:"请输入审批类型"},null,8,["value"])]),_:1}),a(b,{label:"描述"},{default:o(()=>[a(Ke,{value:X.value,"onUpdate:value":e[20]||(e[20]=n=>X.value=n),placeholder:"请输入审批描述(可选)",rows:3},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"])]),_:1})]),_:1},8,["activeKey"])])}}},Ut=He(Ot,[["__scopeId","data-v-02062899"]]);export{Ut as default};
|
|
1
|
+
import{o as Fe,a3 as v,a1 as h,k as a,Z as o,f as i,X as g,Y as r,G as f,u as C,W as _,a5 as m,a4 as y,F as be,A as ke,c as Xe}from"./vendor-CN0Iv_qZ.js";import{u as Ee}from"./ws-Dma34ig_.js";import{_ as Ge}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{J as p,p as Ye,N as ge,l as Ze,$ as _e,X as He,a0 as Qe,U as et}from"./antd-D6h4fDFf.js";const tt={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},at={key:0,style:{"text-align":"center",padding:"60px"}},lt={key:0,style:{color:"var(--text-secondary)","font-family":"monospace","font-size":"12px"}},nt={key:1,style:{color:"#1677ff"}},ot={key:2,style:{color:"var(--text-secondary)"}},st={key:3,style:{color:"var(--text-muted)","font-size":"12px"}},it={key:0,style:{"text-align":"center",padding:"40px"}},rt={key:1},ut={style:{"font-family":"monospace",color:"#ccc"}},dt={key:0,style:{"white-space":"pre-wrap","word-break":"break-all",color:"var(--text-secondary)","font-size":"11px",background:"var(--bg-base)",padding:"12px","border-radius":"6px",border:"1px solid var(--border-color)","max-height":"300px","overflow-y":"auto"}},pt={style:{"margin-bottom":"16px",display:"flex","align-items":"center",gap:"12px"}},ct={key:0,style:{"text-align":"center",padding:"60px"}},vt={key:0,style:{color:"var(--text-secondary)","font-family":"monospace","font-size":"12px"}},mt={key:1,style:{color:"#e0e0e0"}},yt={key:3,style:{color:"var(--text-secondary)","font-size":"12px"}},ft={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"12px"}},gt={key:0,style:{"text-align":"center",padding:"40px"}},xt={key:0,style:{color:"#e0e0e0"}},bt={key:1,style:{color:"var(--text-muted)","font-size":"12px"}},kt={key:2,style:{color:"var(--text-secondary)"}},_t={key:0,style:{"text-align":"center",padding:"60px"}},wt={key:0,style:{color:"var(--text-secondary)","font-family":"monospace","font-size":"12px"}},Ct={key:1,style:{color:"#e0e0e0"}},It={key:3,style:{color:"var(--text-secondary)"}},ht={key:1,style:{color:"var(--text-muted)","font-size":"12px"}},Ot={__name:"Organization",setup($t){const k=Ee(),z=i("orgs"),ee=i(!1);async function we(){ee.value=!0;try{z.value==="orgs"?await j():z.value==="members"?(await j(),x.value&&(await pe(),await ce())):z.value==="approvals"&&await N()}finally{ee.value=!1}}function Ce(l){l==="orgs"&&O.value.length===0&&j(),l==="members"&&O.value.length===0&&j(),l==="approvals"&&E.value.length===0&&N()}function T(l){try{const e=l.trim(),t=e.indexOf("["),s=e.indexOf("{"),u=t>=0&&(s<0||t<s)?t:s;return u>=0?JSON.parse(e.slice(u)):null}catch{return null}}const te=i(!1),O=i([]),W=i(!1),ae=i(!1),U=i(""),J=i(""),le=i(!1),ne=i(!1),w=i({}),$=i(""),Ie=[{title:"ID",key:"id",dataIndex:"id",width:"100px"},{title:"名称",key:"name",dataIndex:"name",width:"180px"},{title:"所有者",key:"owner",dataIndex:"owner",width:"140px"},{title:"描述",key:"description",dataIndex:"description",ellipsis:!0},{title:"成员数",key:"memberCount",dataIndex:"memberCount",width:"90px"}],xe=Xe(()=>O.value.map(l=>({label:l.name,value:l.id})));async function j(){te.value=!0;try{const{output:l}=await k.execute("org list --json",15e3),e=T(l);Array.isArray(e)?O.value=e.map((t,s)=>({key:t.id||s,id:t.id||"-",name:t.name||"-",owner:t.owner||"-",description:t.description||"",memberCount:t.memberCount??t.members??0})):O.value=he(l)}catch(l){p.error("加载组织列表失败: "+l.message)}finally{te.value=!1}}function he(l){const e=[],t=l.split(`
|
|
2
|
+
`);for(const s of t){const u=s.trim();if(!u||u.startsWith("─")||u.match(/^\d+ org/i))continue;const c=u.split(/\s*[|│]\s*/);c.length>=3&&e.push({key:e.length,id:c[0]||"-",name:c[1]||"-",owner:c[2]||"-",description:c[3]||"",memberCount:parseInt(c[4],10)||0})}return e}async function Oe(){if(!U.value.trim()){p.warning("请输入组织名称");return}ae.value=!0;try{const l=U.value.trim().replace(/"/g,'\\"'),e=J.value.trim().replace(/"/g,'\\"');let t=`org create "${l}" --json`;e&&(t=`org create "${l}" --description "${e}" --json`);const{output:s}=await k.execute(t,2e4);s.includes("error")||s.includes("失败")?p.error("创建失败: "+s.slice(0,120)):(p.success("组织已创建"),W.value=!1,U.value="",J.value="",await j())}catch(l){p.error("创建失败: "+l.message)}finally{ae.value=!1}}async function $e(l){w.value={...l},$.value="",le.value=!0,ne.value=!0;try{const{output:e}=await k.execute(`org show ${l.id} --json`,15e3),t=T(e);t&&typeof t=="object"?(w.value={id:t.id||l.id,name:t.name||l.name,owner:t.owner||l.owner,description:t.description||l.description,memberCount:t.memberCount??t.members??l.memberCount,createdAt:t.createdAt||t.created||""},$.value=JSON.stringify(t,null,2)):$.value=e}catch(e){$.value="加载详情失败: "+e.message}finally{ne.value=!1}}const x=i(null),oe=i(!1),se=i([]),ie=i(!1),re=i([]),V=i(!1),ue=i(!1),L=i(""),K=i(""),P=i("member"),R=i(!1),de=i(!1),D=i(""),F=i(""),X=i(""),je=[{label:"管理员 (admin)",value:"admin"},{label:"成员 (member)",value:"member"},{label:"查看者 (viewer)",value:"viewer"}],Ae=[{title:"用户 ID",key:"userId",dataIndex:"userId",width:"160px"},{title:"名称",key:"name",dataIndex:"name",width:"140px"},{title:"角色",key:"role",dataIndex:"role",width:"100px"},{title:"加入时间",key:"joinedAt",dataIndex:"joinedAt",width:"180px"}],ze=[{title:"团队名称",key:"name",dataIndex:"name",width:"180px"},{title:"描述",key:"description",dataIndex:"description",ellipsis:!0},{title:"负责人",key:"lead",dataIndex:"lead",width:"140px"}];function Te(l){return{admin:"gold",member:"blue",viewer:"default",owner:"purple"}[(l||"").toLowerCase()]||"default"}async function Ue(){x.value&&await Promise.all([pe(),ce()])}async function pe(){if(x.value){oe.value=!0;try{const{output:l}=await k.execute(`org members ${x.value} --json`,15e3),e=T(l);Array.isArray(e)?se.value=e.map((t,s)=>({key:t.userId||t.id||s,userId:t.userId||t.id||"-",name:t.name||t.displayName||"-",role:t.role||"member",joinedAt:t.joinedAt||t.joined||"-"})):se.value=Le(l)}catch(l){p.error("加载成员失败: "+l.message)}finally{oe.value=!1}}}function Le(l){const e=[],t=l.split(`
|
|
3
|
+
`);for(const s of t){const u=s.trim();if(!u||u.startsWith("─")||u.match(/^\d+ member/i))continue;const c=u.split(/\s*[|│]\s*/);c.length>=3&&e.push({key:e.length,userId:c[0]||"-",name:c[1]||"-",role:c[2]||"member",joinedAt:c[3]||"-"})}return e}async function ce(){if(x.value){ie.value=!0;try{const{output:l}=await k.execute(`org teams ${x.value} --json`,15e3),e=T(l);Array.isArray(e)?re.value=e.map((t,s)=>({key:t.id||t.name||s,name:t.name||"-",description:t.description||"",lead:t.lead||t.leader||"-"})):re.value=[]}catch(l){p.error("加载团队失败: "+l.message)}finally{ie.value=!1}}}async function De(){if(!L.value.trim()){p.warning("请输入用户 ID");return}ue.value=!0;try{const l=L.value.trim().replace(/"/g,'\\"'),e=K.value.trim().replace(/"/g,'\\"');let t=`org invite ${x.value} ${l} --role ${P.value}`;e&&(t+=` --name "${e}"`);const{output:s}=await k.execute(t,2e4);s.includes("error")||s.includes("失败")?p.error("邀请失败: "+s.slice(0,120)):(p.success("邀请已发送"),V.value=!1,L.value="",K.value="",P.value="member",await pe())}catch(l){p.error("邀请失败: "+l.message)}finally{ue.value=!1}}async function qe(){if(!D.value.trim()){p.warning("请输入团队名称");return}de.value=!0;try{const l=D.value.trim().replace(/"/g,'\\"'),e=F.value.trim().replace(/"/g,'\\"'),t=X.value.trim().replace(/"/g,'\\"');let s=`org teams ${x.value} create "${l}"`;e&&(s+=` --description "${e}"`),t&&(s+=` --lead "${t}"`);const{output:u}=await k.execute(s,2e4);u.includes("error")||u.includes("失败")?p.error("创建失败: "+u.slice(0,120)):(p.success("团队已创建"),R.value=!1,D.value="",F.value="",X.value="",await ce())}catch(l){p.error("创建失败: "+l.message)}finally{de.value=!1}}const ve=i(!1),E=i([]),G=i(!1),me=i(!1),q=i(null),S=i(""),Y=i(""),Z=i(""),Se=[{title:"ID",key:"id",dataIndex:"id",width:"100px"},{title:"标题",key:"title",dataIndex:"title",width:"200px"},{title:"类型",key:"type",dataIndex:"type",width:"120px"},{title:"申请人",key:"requester",dataIndex:"requester",width:"140px"},{title:"状态",key:"status",dataIndex:"status",width:"100px"},{title:"操作",key:"actions",width:"180px"}];function Ne(l){return{pending:"orange",approved:"green",rejected:"red"}[(l||"").toLowerCase()]||"default"}async function N(){ve.value=!0;try{const{output:l}=await k.execute("org approvals --json",15e3),e=T(l);Array.isArray(e)?E.value=e.map((t,s)=>({key:t.id||s,id:t.id||"-",title:t.title||"-",type:t.type||"-",requester:t.requester||t.requestedBy||"-",status:t.status||"pending",_approving:!1,_rejecting:!1})):E.value=Me(l)}catch(l){p.error("加载审批列表失败: "+l.message)}finally{ve.value=!1}}function Me(l){const e=[],t=l.split(`
|
|
4
|
+
`);for(const s of t){const u=s.trim();if(!u||u.startsWith("─")||u.match(/^\d+ approval/i))continue;const c=u.split(/\s*[|│]\s*/);c.length>=4&&e.push({key:e.length,id:c[0]||"-",title:c[1]||"-",type:c[2]||"-",requester:c[3]||"-",status:c[4]||"pending",_approving:!1,_rejecting:!1})}return e}async function Be(l){l._approving=!0;try{const{output:e}=await k.execute(`org approve ${l.id}`,15e3);e.includes("error")||e.includes("失败")?p.error("审批失败: "+e.slice(0,120)):(p.success("已通过"),await N())}catch(e){p.error("审批失败: "+e.message)}finally{l._approving=!1}}async function We(l){l._rejecting=!0;try{const{output:e}=await k.execute(`org reject ${l.id}`,15e3);e.includes("error")||e.includes("失败")?p.error("拒绝失败: "+e.slice(0,120)):(p.success("已拒绝"),await N())}catch(e){p.error("拒绝失败: "+e.message)}finally{l._rejecting=!1}}async function Je(){if(!q.value){p.warning("请选择组织");return}if(!S.value.trim()){p.warning("请输入审批标题");return}me.value=!0;try{const l=S.value.trim().replace(/"/g,'\\"'),e=Y.value.trim().replace(/"/g,'\\"'),t=Z.value.trim().replace(/"/g,'\\"');let s=`org approve --submit --org ${q.value} --title "${l}"`;e&&(s+=` --type "${e}"`),t&&(s+=` --description "${t}"`);const{output:u}=await k.execute(s,2e4);u.includes("error")||u.includes("失败")?p.error("提交失败: "+u.slice(0,120)):(p.success("审批已提交"),G.value=!1,q.value=null,S.value="",Y.value="",Z.value="",await N())}catch(l){p.error("提交失败: "+l.message)}finally{me.value=!1}}return Fe(()=>{j()}),(l,e)=>{const t=g("a-button"),s=g("a-space"),u=g("a-spin"),c=g("a-tag"),M=g("a-empty"),H=g("a-table"),A=g("a-descriptions-item"),Ve=g("a-descriptions"),B=g("a-modal"),I=g("a-input"),b=g("a-form-item"),Q=g("a-form"),ye=g("a-tab-pane"),fe=g("a-select"),Ke=g("a-textarea"),Pe=g("a-tabs");return r(),v("div",null,[h("div",tt,[e[24]||(e[24]=h("div",null,[h("h2",{class:"page-title"},"组织管理"),h("p",{class:"page-sub"},"组织 / 成员 / 审批")],-1)),a(t,{type:"primary",ghost:"",loading:ee.value,onClick:we},{icon:o(()=>[a(C(Ye))]),default:o(()=>[e[23]||(e[23]=f(" 刷新 ",-1))]),_:1},8,["loading"])]),a(Pe,{activeKey:z.value,"onUpdate:activeKey":e[22]||(e[22]=n=>z.value=n),type:"card",onChange:Ce},{default:o(()=>[a(ye,{key:"orgs"},{tab:o(()=>[a(C(Ze)),e[25]||(e[25]=f(" 组织列表 ",-1))]),default:o(()=>[a(s,{style:{"margin-bottom":"16px"}},{default:o(()=>[a(t,{type:"primary",onClick:e[0]||(e[0]=n=>W.value=!0)},{icon:o(()=>[a(C(ge))]),default:o(()=>[e[26]||(e[26]=f(" 创建组织 ",-1))]),_:1})]),_:1}),te.value?(r(),v("div",at,[a(u,{size:"large"})])):(r(),_(H,{key:1,columns:Ie,"data-source":O.value,pagination:{pageSize:20,showTotal:n=>`共 ${n} 条`},size:"small",style:{background:"var(--bg-card)"},"row-class-name":()=>"org-row","custom-row":n=>({onClick:()=>$e(n)})},{bodyCell:o(({column:n,record:d})=>[n.key==="id"?(r(),v("span",lt,m(d.id),1)):y("",!0),n.key==="name"?(r(),v("a",nt,m(d.name),1)):y("",!0),n.key==="owner"?(r(),v("span",ot,m(d.owner),1)):y("",!0),n.key==="description"?(r(),v("span",st,m(d.description),1)):y("",!0),n.key==="memberCount"?(r(),_(c,{key:4,color:"blue"},{default:o(()=>[f(m(d.memberCount),1)]),_:2},1024)):y("",!0)]),emptyText:o(()=>[a(M,{description:"暂无组织,点击「创建组织」添加"})]),_:1},8,["data-source","pagination","custom-row"])),a(B,{open:le.value,"onUpdate:open":e[1]||(e[1]=n=>le.value=n),title:"组织详情: "+w.value.name,footer:null,width:"640px"},{default:o(()=>[ne.value?(r(),v("div",it,[a(u)])):(r(),v("div",rt,[a(Ve,{column:1,bordered:"",size:"small",style:{"margin-bottom":"16px"}},{default:o(()=>[a(A,{label:"ID"},{default:o(()=>[h("span",ut,m(w.value.id),1)]),_:1}),a(A,{label:"名称"},{default:o(()=>[f(m(w.value.name),1)]),_:1}),a(A,{label:"所有者"},{default:o(()=>[f(m(w.value.owner),1)]),_:1}),a(A,{label:"描述"},{default:o(()=>[f(m(w.value.description||"-"),1)]),_:1}),a(A,{label:"成员数"},{default:o(()=>[f(m(w.value.memberCount),1)]),_:1}),w.value.createdAt?(r(),_(A,{key:0,label:"创建时间"},{default:o(()=>[f(m(w.value.createdAt),1)]),_:1})):y("",!0)]),_:1}),$.value?(r(),v("pre",dt,m($.value),1)):y("",!0)]))]),_:1},8,["open","title"]),a(B,{open:W.value,"onUpdate:open":e[4]||(e[4]=n=>W.value=n),title:"创建组织","confirm-loading":ae.value,onOk:Oe,"ok-text":"创建","cancel-text":"取消"},{default:o(()=>[a(Q,{"label-col":{span:4},"wrapper-col":{span:20},style:{"margin-top":"16px"}},{default:o(()=>[a(b,{label:"名称",required:""},{default:o(()=>[a(I,{value:U.value,"onUpdate:value":e[2]||(e[2]=n=>U.value=n),placeholder:"请输入组织名称"},null,8,["value"])]),_:1}),a(b,{label:"描述"},{default:o(()=>[a(I,{value:J.value,"onUpdate:value":e[3]||(e[3]=n=>J.value=n),placeholder:"请输入组织描述(可选)"},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"])]),_:1}),a(ye,{key:"members"},{tab:o(()=>[a(C(_e)),e[27]||(e[27]=f(" 成员管理 ",-1))]),default:o(()=>[h("div",pt,[a(fe,{value:x.value,"onUpdate:value":e[5]||(e[5]=n=>x.value=n),placeholder:"选择组织",style:{width:"280px"},options:xe.value,onChange:Ue},null,8,["value","options"]),a(t,{type:"primary",disabled:!x.value,onClick:e[6]||(e[6]=n=>V.value=!0)},{icon:o(()=>[a(C(_e))]),default:o(()=>[e[28]||(e[28]=f(" 邀请成员 ",-1))]),_:1},8,["disabled"])]),oe.value?(r(),v("div",ct,[a(u,{size:"large"})])):x.value?(r(),_(H,{key:1,columns:Ae,"data-source":se.value,pagination:{pageSize:20,showTotal:n=>`共 ${n} 条`},size:"small",style:{background:"var(--bg-card)","margin-bottom":"24px"},"row-class-name":()=>"org-row"},{bodyCell:o(({column:n,record:d})=>[n.key==="userId"?(r(),v("span",vt,m(d.userId),1)):y("",!0),n.key==="name"?(r(),v("span",mt,m(d.name),1)):y("",!0),n.key==="role"?(r(),_(c,{key:2,color:Te(d.role)},{default:o(()=>[f(m(d.role),1)]),_:2},1032,["color"])):y("",!0),n.key==="joinedAt"?(r(),v("span",yt,m(d.joinedAt),1)):y("",!0)]),emptyText:o(()=>[a(M,{description:"暂无成员"})]),_:1},8,["data-source","pagination"])):(r(),_(M,{key:2,description:"请先选择一个组织",style:{padding:"60px 0"}})),x.value?(r(),v(be,{key:3},[h("div",ft,[e[30]||(e[30]=h("h3",{style:{color:"var(--text-primary)",margin:"0","font-size":"15px"}},"团队",-1)),a(t,{size:"small",onClick:e[7]||(e[7]=n=>R.value=!0)},{icon:o(()=>[a(C(ge))]),default:o(()=>[e[29]||(e[29]=f(" 创建团队 ",-1))]),_:1})]),ie.value?(r(),v("div",gt,[a(u)])):(r(),_(H,{key:1,columns:ze,"data-source":re.value,pagination:!1,size:"small",style:{background:"var(--bg-card)"},"row-class-name":()=>"org-row"},{bodyCell:o(({column:n,record:d})=>[n.key==="name"?(r(),v("span",xt,m(d.name),1)):y("",!0),n.key==="description"?(r(),v("span",bt,m(d.description),1)):y("",!0),n.key==="lead"?(r(),v("span",kt,m(d.lead),1)):y("",!0)]),emptyText:o(()=>[a(M,{description:"暂无团队"})]),_:1},8,["data-source"]))],64)):y("",!0),a(B,{open:V.value,"onUpdate:open":e[11]||(e[11]=n=>V.value=n),title:"邀请成员","confirm-loading":ue.value,onOk:De,"ok-text":"邀请","cancel-text":"取消"},{default:o(()=>[a(Q,{"label-col":{span:5},"wrapper-col":{span:19},style:{"margin-top":"16px"}},{default:o(()=>[a(b,{label:"用户 ID",required:""},{default:o(()=>[a(I,{value:L.value,"onUpdate:value":e[8]||(e[8]=n=>L.value=n),placeholder:"请输入用户 ID"},null,8,["value"])]),_:1}),a(b,{label:"名称"},{default:o(()=>[a(I,{value:K.value,"onUpdate:value":e[9]||(e[9]=n=>K.value=n),placeholder:"请输入用户名称"},null,8,["value"])]),_:1}),a(b,{label:"角色"},{default:o(()=>[a(fe,{value:P.value,"onUpdate:value":e[10]||(e[10]=n=>P.value=n),options:je},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"]),a(B,{open:R.value,"onUpdate:open":e[15]||(e[15]=n=>R.value=n),title:"创建团队","confirm-loading":de.value,onOk:qe,"ok-text":"创建","cancel-text":"取消"},{default:o(()=>[a(Q,{"label-col":{span:5},"wrapper-col":{span:19},style:{"margin-top":"16px"}},{default:o(()=>[a(b,{label:"团队名称",required:""},{default:o(()=>[a(I,{value:D.value,"onUpdate:value":e[12]||(e[12]=n=>D.value=n),placeholder:"请输入团队名称"},null,8,["value"])]),_:1}),a(b,{label:"描述"},{default:o(()=>[a(I,{value:F.value,"onUpdate:value":e[13]||(e[13]=n=>F.value=n),placeholder:"请输入团队描述(可选)"},null,8,["value"])]),_:1}),a(b,{label:"负责人"},{default:o(()=>[a(I,{value:X.value,"onUpdate:value":e[14]||(e[14]=n=>X.value=n),placeholder:"请输入负责人 ID(可选)"},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"])]),_:1}),a(ye,{key:"approvals"},{tab:o(()=>[a(C(et)),e[31]||(e[31]=f(" 审批管理 ",-1))]),default:o(()=>[a(s,{style:{"margin-bottom":"16px"}},{default:o(()=>[a(t,{type:"primary",onClick:e[16]||(e[16]=n=>G.value=!0)},{icon:o(()=>[a(C(ge))]),default:o(()=>[e[32]||(e[32]=f(" 提交审批 ",-1))]),_:1})]),_:1}),ve.value?(r(),v("div",_t,[a(u,{size:"large"})])):(r(),_(H,{key:1,columns:Se,"data-source":E.value,pagination:{pageSize:20,showTotal:n=>`共 ${n} 条`},size:"small",style:{background:"var(--bg-card)"},"row-class-name":()=>"org-row"},{bodyCell:o(({column:n,record:d})=>[n.key==="id"?(r(),v("span",wt,m(d.id),1)):y("",!0),n.key==="title"?(r(),v("span",Ct,m(d.title),1)):y("",!0),n.key==="type"?(r(),_(c,{key:2,color:"blue"},{default:o(()=>[f(m(d.type),1)]),_:2},1024)):y("",!0),n.key==="requester"?(r(),v("span",It,m(d.requester),1)):y("",!0),n.key==="status"?(r(),_(c,{key:4,color:Ne(d.status)},{default:o(()=>[f(m(d.status),1)]),_:2},1032,["color"])):y("",!0),n.key==="actions"?(r(),v(be,{key:5},[(d.status||"").toLowerCase()==="pending"?(r(),_(s,{key:0},{default:o(()=>[a(t,{type:"primary",size:"small",loading:d._approving,onClick:ke(Re=>Be(d),["stop"])},{icon:o(()=>[a(C(He))]),default:o(()=>[e[33]||(e[33]=f(" 通过 ",-1))]),_:1},8,["loading","onClick"]),a(t,{danger:"",size:"small",loading:d._rejecting,onClick:ke(Re=>We(d),["stop"])},{icon:o(()=>[a(C(Qe))]),default:o(()=>[e[34]||(e[34]=f(" 拒绝 ",-1))]),_:1},8,["loading","onClick"])]),_:2},1024)):(r(),v("span",ht,"-"))],64)):y("",!0)]),emptyText:o(()=>[a(M,{description:"暂无审批记录"})]),_:1},8,["data-source","pagination"])),a(B,{open:G.value,"onUpdate:open":e[21]||(e[21]=n=>G.value=n),title:"提交审批","confirm-loading":me.value,onOk:Je,"ok-text":"提交","cancel-text":"取消"},{default:o(()=>[a(Q,{"label-col":{span:5},"wrapper-col":{span:19},style:{"margin-top":"16px"}},{default:o(()=>[a(b,{label:"组织",required:""},{default:o(()=>[a(fe,{value:q.value,"onUpdate:value":e[17]||(e[17]=n=>q.value=n),placeholder:"选择组织",options:xe.value},null,8,["value","options"])]),_:1}),a(b,{label:"标题",required:""},{default:o(()=>[a(I,{value:S.value,"onUpdate:value":e[18]||(e[18]=n=>S.value=n),placeholder:"请输入审批标题"},null,8,["value"])]),_:1}),a(b,{label:"类型"},{default:o(()=>[a(I,{value:Y.value,"onUpdate:value":e[19]||(e[19]=n=>Y.value=n),placeholder:"请输入审批类型"},null,8,["value"])]),_:1}),a(b,{label:"描述"},{default:o(()=>[a(Ke,{value:Z.value,"onUpdate:value":e[20]||(e[20]=n=>Z.value=n),placeholder:"请输入审批描述(可选)",rows:3},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"])]),_:1})]),_:1},8,["activeKey"])])}}},Ut=Ge(Ot,[["__scopeId","data-v-02062899"]]);export{Ut as default};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{u as ve}from"./ws-
|
|
2
|
-
`).filter(m=>m.trim()),i=[];for(const m of e){const b=m.match(/^\s*(\S+)\s+(.+?)\s+(connected|online|offline|disconnected)\s*$/i);if(b){i.push({id:b[1],name:b[2].trim(),connected:/connected|online/i.test(b[3])});continue}const k=m.match(/^\s*((?:12D3|Qm)\S{10,})\s*(.*)$/);if(k){const C=k[2].trim();i.push({id:k[1],name:C||k[1].slice(0,12),connected:/connected|online/i.test(C)})}}return i}const
|
|
1
|
+
import{u as ve}from"./ws-Dma34ig_.js";import{_ as pe}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{p as fe,V as ye,u as ee,N as me,Q as M}from"./antd-D6h4fDFf.js";import{o as ge,a3 as d,a1 as u,k as t,Z as o,f as n,X as r,Y as s,G as p,u as c,W as w,a5 as v,a4 as f,F as te,a7 as be}from"./vendor-CN0Iv_qZ.js";const _e={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},xe={key:0,style:{"text-align":"center",padding:"30px"}},ke={key:2,style:{"font-family":"monospace",color:"var(--text-muted)","font-size":"12px"}},we={key:3,style:{"margin-top":"12px",color:"#ff4d4f","font-size":"12px"}},Pe={key:0,style:{"text-align":"center",padding:"30px"}},he={key:0,style:{"margin-top":"16px"}},Se={style:{background:"var(--bg-base)",border:"1px solid var(--border-color)","border-radius":"6px",padding:"12px",color:"#aaa","font-size":"12px","max-height":"200px","overflow-y":"auto","white-space":"pre-wrap"}},ze={key:2,style:{"margin-top":"12px",color:"#ff4d4f","font-size":"12px"}},$e={key:0,style:{"margin-top":"12px"}},Ce={style:{background:"var(--bg-base)",border:"1px solid var(--border-color)","border-radius":"6px",padding:"12px",color:"#aaa","font-size":"12px","white-space":"pre-wrap"}},Oe={key:0,style:{"margin-top":"12px"}},Me={style:{background:"var(--bg-base)",border:"1px solid var(--border-color)","border-radius":"6px",padding:"12px",color:"#aaa","font-size":"12px","white-space":"pre-wrap"}},Le={__name:"P2P",setup(Ne){const _=ve(),L=n(!1),N=n(""),P=n([]),ae=[{title:"设备名称",key:"name"},{title:"Peer ID",key:"id"},{title:"状态",key:"status"},{title:"操作",key:"action",width:100}];async function X(){L.value=!0,N.value="";try{const{output:a}=await _.execute("p2p peers",15e3);P.value=oe(a)}catch(a){N.value=`加载失败: ${a.message}`}finally{L.value=!1}}function oe(a){if(!a||a.includes("No peers")||a.includes("no peers"))return[];const e=a.split(`
|
|
2
|
+
`).filter(m=>m.trim()),i=[];for(const m of e){const b=m.match(/^\s*(\S+)\s+(.+?)\s+(connected|online|offline|disconnected)\s*$/i);if(b){i.push({id:b[1],name:b[2].trim(),connected:/connected|online/i.test(b[3])});continue}const k=m.match(/^\s*((?:12D3|Qm)\S{10,})\s*(.*)$/);if(k){const C=k[2].trim();i.push({id:k[1],name:C||k[1].slice(0,12),connected:/connected|online/i.test(C)})}}return i}const V=n(!1),B=n(!1),E=n(""),h=n("");async function Y(){if(E.value.trim()){B.value=!0,h.value="";try{const{output:a}=await _.execute(`p2p pair "${E.value.trim()}"`,3e4);h.value=a,await X()}catch(a){h.value=`配对失败: ${a.message}`}finally{B.value=!1}}}const T=n(!1),D=n(!1),S=n(void 0),z=n(""),x=n("");function le(a){S.value=a.id,z.value="",x.value="",T.value=!0}async function Z(){if(!(!S.value||!z.value.trim())){D.value=!0,x.value="";try{const{output:a}=await _.execute(`p2p send ${S.value} "${z.value.trim()}"`,15e3);x.value=a||"消息已发送"}catch(a){x.value=`发送失败: ${a.message}`}finally{D.value=!1}}}const I=n(!1),U=n(""),$=n(!1),R=n("未知"),F=n(0),q=n(""),y=n(""),Q=n(!1),W=n(!1);async function j(){I.value=!0,U.value="";try{const{output:a}=await _.execute("sync status",15e3);ne(a)}catch(a){U.value=`加载失败: ${a.message}`}finally{I.value=!1}}function ne(a){if(!a){R.value="未知";return}$.value=/synced|online|up.to.date/i.test(a),R.value=$.value?"已同步":"未同步";const e=a.match(/pending[:\s]+(\d+)/i);F.value=e?parseInt(e[1]):0;const i=a.match(/last[:\s]+(.+)/i);i&&(q.value=i[1].trim())}async function se(){Q.value=!0,y.value="";try{const{output:a}=await _.execute("sync push",3e4);y.value=a||"推送完成",await j()}catch(a){y.value=`推送失败: ${a.message}`}finally{Q.value=!1}}async function re(){W.value=!0,y.value="";try{const{output:a}=await _.execute("sync pull",3e4);y.value=a||"拉取完成",await j()}catch(a){y.value=`拉取失败: ${a.message}`}finally{W.value=!1}}async function H(){await Promise.all([X(),j()])}return ge(H),(a,e)=>{const i=r("a-button"),m=r("a-space"),b=r("a-spin"),k=r("a-empty"),C=r("a-tag"),ie=r("a-table"),O=r("a-card"),A=r("a-statistic"),G=r("a-col"),ue=r("a-row"),J=r("a-input"),K=r("a-modal"),de=r("a-select-option"),ce=r("a-select");return s(),d("div",null,[u("div",_e,[e[8]||(e[8]=u("div",null,[u("h2",{class:"page-title"},"P2P 网络"),u("p",{class:"page-sub"},"设备管理与数据同步")],-1)),t(i,{type:"primary",ghost:"",loading:L.value,onClick:H},{icon:o(()=>[t(c(fe))]),default:o(()=>[e[7]||(e[7]=p(" 刷新 ",-1))]),_:1},8,["loading"])]),t(O,{title:"P2P 设备",style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"20px"}},{extra:o(()=>[t(m,null,{default:o(()=>[t(i,{size:"small",onClick:e[0]||(e[0]=l=>V.value=!0),style:{background:"var(--bg-card-hover)","border-color":"var(--border-color)"}},{icon:o(()=>[t(c(me))]),default:o(()=>[e[9]||(e[9]=p(" 配对设备 ",-1))]),_:1}),t(i,{size:"small",onClick:e[1]||(e[1]=l=>T.value=!0),disabled:P.value.length===0,style:{background:"var(--bg-card-hover)","border-color":"var(--border-color)"}},{icon:o(()=>[t(c(ee))]),default:o(()=>[e[10]||(e[10]=p(" 发送消息 ",-1))]),_:1},8,["disabled"])]),_:1})]),default:o(()=>[L.value?(s(),d("div",xe,[t(b)])):P.value.length===0?(s(),w(k,{key:1,description:"暂无已连接设备"})):(s(),w(ie,{key:2,columns:ae,"data-source":P.value,pagination:!1,size:"small","row-key":"id"},{bodyCell:o(({column:l,record:g})=>[l.key==="status"?(s(),w(C,{key:0,color:g.connected?"green":"default"},{default:o(()=>[p(v(g.connected?"在线":"离线"),1)]),_:2},1032,["color"])):f("",!0),l.key==="name"?(s(),w(m,{key:1},{default:o(()=>[t(c(ye),{style:{color:"var(--text-muted)"}}),u("span",null,v(g.name||g.id),1)]),_:2},1024)):f("",!0),l.key==="id"?(s(),d("span",ke,v(g.id.length>16?g.id.slice(0,16)+"...":g.id),1)):f("",!0),l.key==="action"?(s(),w(i,{key:3,size:"small",type:"link",onClick:Ee=>le(g)},{default:o(()=>[t(c(ee)),e[11]||(e[11]=p(" 发送 ",-1))]),_:1},8,["onClick"])):f("",!0)]),_:1},8,["data-source"])),N.value?(s(),d("div",we,v(N.value),1)):f("",!0)]),_:1}),t(O,{title:"同步状态",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{extra:o(()=>[t(C,{color:$.value?"green":"default"},{default:o(()=>[p(v($.value?"已同步":"未同步"),1)]),_:1},8,["color"])]),default:o(()=>[I.value?(s(),d("div",Pe,[t(b)])):(s(),d(te,{key:1},[t(ue,{gutter:[16,16],style:{"margin-bottom":"20px"}},{default:o(()=>[t(G,{xs:24,sm:8},{default:o(()=>[t(O,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:o(()=>[t(A,{title:"同步状态",value:R.value,"value-style":{color:$.value?"#52c41a":"#888",fontSize:"16px"}},{prefix:o(()=>[t(c(M))]),_:1},8,["value","value-style"])]),_:1})]),_:1}),t(G,{xs:24,sm:8},{default:o(()=>[t(O,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:o(()=>[t(A,{title:"待推送",value:F.value,"value-style":{color:F.value>0?"#faad14":"#52c41a",fontSize:"16px"}},{prefix:o(()=>[t(c(M))]),_:1},8,["value","value-style"])]),_:1})]),_:1}),t(G,{xs:24,sm:8},{default:o(()=>[t(O,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:o(()=>[t(A,{title:"最近同步",value:q.value||"无","value-style":{color:"var(--text-secondary)",fontSize:"16px"}},{prefix:o(()=>[t(c(M))]),_:1},8,["value"])]),_:1})]),_:1})]),_:1}),t(m,null,{default:o(()=>[t(i,{loading:Q.value,onClick:se,style:{background:"var(--bg-card-hover)","border-color":"var(--border-color)"}},{icon:o(()=>[t(c(M))]),default:o(()=>[e[12]||(e[12]=p(" 推送变更 ",-1))]),_:1},8,["loading"]),t(i,{loading:W.value,onClick:re,style:{background:"var(--bg-card-hover)","border-color":"var(--border-color)"}},{icon:o(()=>[t(c(M))]),default:o(()=>[e[13]||(e[13]=p(" 拉取变更 ",-1))]),_:1},8,["loading"])]),_:1}),y.value?(s(),d("div",he,[e[14]||(e[14]=u("div",{style:{color:"var(--text-secondary)","font-size":"11px","margin-bottom":"6px"}},"操作结果",-1)),u("pre",Se,v(y.value),1)])):f("",!0)],64)),U.value?(s(),d("div",ze,v(U.value),1)):f("",!0)]),_:1}),t(K,{open:V.value,"onUpdate:open":e[3]||(e[3]=l=>V.value=l),title:"配对新设备","confirm-loading":B.value,onOk:Y,"ok-text":"配对","cancel-text":"取消"},{default:o(()=>[e[15]||(e[15]=u("div",{style:{"margin-bottom":"12px",color:"var(--text-secondary)"}},"请输入要配对的设备名称",-1)),t(J,{value:E.value,"onUpdate:value":e[2]||(e[2]=l=>E.value=l),placeholder:"设备名称,例如: My Phone",onPressEnter:Y},null,8,["value"]),h.value?(s(),d("div",$e,[u("pre",Ce,v(h.value),1)])):f("",!0)]),_:1},8,["open","confirm-loading"]),t(K,{open:T.value,"onUpdate:open":e[6]||(e[6]=l=>T.value=l),title:"发送消息","confirm-loading":D.value,onOk:Z,"ok-text":"发送","cancel-text":"取消"},{default:o(()=>[e[16]||(e[16]=u("div",{style:{"margin-bottom":"8px",color:"var(--text-secondary)"}},"选择目标设备",-1)),t(ce,{value:S.value,"onUpdate:value":e[4]||(e[4]=l=>S.value=l),style:{width:"100%","margin-bottom":"16px"},placeholder:"选择设备"},{default:o(()=>[(s(!0),d(te,null,be(P.value,l=>(s(),w(de,{key:l.id,value:l.id},{default:o(()=>[p(v(l.name||l.id),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"]),e[17]||(e[17]=u("div",{style:{"margin-bottom":"8px",color:"var(--text-secondary)"}},"消息内容",-1)),t(J,{value:z.value,"onUpdate:value":e[5]||(e[5]=l=>z.value=l),placeholder:"输入消息内容",onPressEnter:Z},null,8,["value"]),x.value?(s(),d("div",Oe,[u("pre",Me,v(x.value),1)])):f("",!0)]),_:1},8,["open","confirm-loading"])])}}},De=pe(Le,[["__scopeId","data-v-f56a4f0e"]]);export{De as default};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{u as ue}from"./ws-
|
|
2
|
-
`);for(const p of o){const n=p.trim();if(!n||n.startsWith("─")||n.match(/^Role/i))continue;const r=n.split(/\s*[|│]\s*/);r.length>=2?e.push({key:e.length,name:r[0]||"-",description:r[1]||"",permissions:r[2]?r[2].split(/[,;\s]+/).filter(Boolean):[],userCount:r[3]&&parseInt(r[3],10)||0}):n.length>2&&e.push({key:e.length,name:n.slice(0,60),description:"",permissions:[],userCount:0})}return e}const C=v(""),w=v(""),$=v(!1),k=v(null),
|
|
3
|
-
`);for(const p of o){const n=p.trim();if(!n||n.startsWith("─")||n.startsWith("Audit")||n.startsWith("Recent"))continue;const r=n.split(/\s*[|│]\s*/);if(r.length>=3){e.push({key:e.length,timestamp:r[0]||"-",event:r[1]||"-",user:r[2]||"-",level:r[3]||"info",detail:r.slice(4).join(" ")||""});continue}const y=n.match(/^(\d{4}-\d{2}-\d{2}[\sT]\d{2}:\d{2}(?::\d{2})?)\s+(.+)/);if(y){const m=y[2],f=m.match(/\b(INFO|WARN|WARNING|ERROR|CRITICAL)\b/i);e.push({key:e.length,timestamp:y[1],event:m.replace(/\b(INFO|WARN|WARNING|ERROR|CRITICAL)\b/i,"").trim().slice(0,80),user:"-",level:f?f[1].toLowerCase():"info",detail:""})}else n.length>3&&!n.match(/^\d+ event/i)&&e.push({key:e.length,timestamp:"-",event:n.slice(0,80),user:"-",level:"info",detail:""})}return e}function se(t){const e=
|
|
4
|
-
`),n=["#1677ff","#52c41a","#faad14","#ff4d4f"];let r=0;for(const y of p){const m=y.trim();if(!m||m.startsWith("─")||m.startsWith("Audit"))continue;const f=m.match(/^(.+?)\s*[:=]\s*(.+)$/);if(f){const x=f[1].trim(),N=f[2].trim(),T=N.match(/^(\d+)/);o.push({label:x,value:T?parseInt(T[1],10):N,color:n[r%n.length]}),r++}}return o.length===0&&o.push({label:"总事件数",value:A.value.length,color:"#1677ff"},{label:"状态",value:"就绪",color:"#52c41a"}),o}function
|
|
1
|
+
import{u as ue}from"./ws-Dma34ig_.js";import{_ as ce}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{J as G,p as de,L as pe,z as K,U as me}from"./antd-D6h4fDFf.js";import{o as fe,a3 as d,a1 as j,k as l,Z as s,f as v,X as u,Y as i,G as h,u as I,W as b,a5 as _,a4 as g,F as z,a7 as E}from"./vendor-CN0Iv_qZ.js";const ye={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},ve={key:0,style:{"text-align":"center",padding:"60px"}},_e={key:0,style:{color:"#e0e0e0","font-weight":"500"}},ge={key:1,style:{color:"var(--text-secondary)"}},he={key:0,style:{"margin-top":"16px"}},ke={key:0,style:{"text-align":"center",padding:"60px"}},xe={key:0,style:{color:"var(--text-secondary)","font-size":"12px","font-family":"monospace"}},be={key:1,style:{color:"#e0e0e0"}},we={key:2,style:{color:"var(--text-secondary)"}},Ce={key:4,style:{color:"var(--text-muted)","font-size":"12px"}},Ie={__name:"Permissions",setup(Re){const R=ue(),O=v("roles"),L=v(!1);async function q(){L.value=!0;try{O.value==="roles"?await P():O.value==="audit"&&await U()}finally{L.value=!1}}function X(t){t==="roles"&&S.value.length===0&&P(),t==="audit"&&A.value.length===0&&U()}const W=v(!1),S=v([]),Y=[{title:"角色名",key:"name",dataIndex:"name",width:"160px"},{title:"描述",key:"description",dataIndex:"description",width:"240px"},{title:"权限",key:"permissions",dataIndex:"permissions"},{title:"用户数",key:"userCount",dataIndex:"userCount",width:"100px"}];async function P(){W.value=!0;try{const{output:t}=await R.execute("auth roles --json",15e3);S.value=F(t,Z)}catch(t){G.error("加载角色列表失败: "+t.message)}finally{W.value=!1}}function Z(t){const e=[],o=t.split(`
|
|
2
|
+
`);for(const p of o){const n=p.trim();if(!n||n.startsWith("─")||n.match(/^Role/i))continue;const r=n.split(/\s*[|│]\s*/);r.length>=2?e.push({key:e.length,name:r[0]||"-",description:r[1]||"",permissions:r[2]?r[2].split(/[,;\s]+/).filter(Boolean):[],userCount:r[3]&&parseInt(r[3],10)||0}):n.length>2&&e.push({key:e.length,name:n.slice(0,60),description:"",permissions:[],userCount:0})}return e}const C=v(""),w=v(""),$=v(!1),k=v(null),H=["note:read","note:write","admin:*","skill:execute"];async function Q(){if(!(!C.value.trim()||!w.value.trim())){$.value=!0,k.value=null;try{const t=`auth check ${C.value.trim()} "${w.value.trim()}"`,{output:e}=await R.execute(t,15e3),o=e.toLowerCase(),p=o.includes("allow")||o.includes("granted")||o.includes("true")||o.includes("yes"),n=o.includes("denied")||o.includes("reject")||o.includes("false")||o.includes("no permission");k.value={allowed:p&&!n,detail:e.trim()||(p?"用户拥有该权限":"用户没有该权限")}}catch(t){k.value={allowed:!1,detail:"检查失败: "+t.message}}finally{$.value=!1}}}const B=v(!1),A=v([]),M=v([]),ee=[{title:"时间",key:"timestamp",dataIndex:"timestamp",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 te(t){return{info:"blue",warn:"orange",warning:"orange",error:"red",critical:"red"}[(t||"").toLowerCase()]||"default"}async function U(){B.value=!0;try{const[t,e]=await Promise.all([R.execute("audit log --json",15e3),R.execute("audit stats --json",15e3)]);A.value=F(t.output,ae),M.value=se(e.output)}catch(t){G.error("加载审计日志失败: "+t.message)}finally{B.value=!1}}function ae(t){const e=[],o=t.split(`
|
|
3
|
+
`);for(const p of o){const n=p.trim();if(!n||n.startsWith("─")||n.startsWith("Audit")||n.startsWith("Recent"))continue;const r=n.split(/\s*[|│]\s*/);if(r.length>=3){e.push({key:e.length,timestamp:r[0]||"-",event:r[1]||"-",user:r[2]||"-",level:r[3]||"info",detail:r.slice(4).join(" ")||""});continue}const y=n.match(/^(\d{4}-\d{2}-\d{2}[\sT]\d{2}:\d{2}(?::\d{2})?)\s+(.+)/);if(y){const m=y[2],f=m.match(/\b(INFO|WARN|WARNING|ERROR|CRITICAL)\b/i);e.push({key:e.length,timestamp:y[1],event:m.replace(/\b(INFO|WARN|WARNING|ERROR|CRITICAL)\b/i,"").trim().slice(0,80),user:"-",level:f?f[1].toLowerCase():"info",detail:""})}else n.length>3&&!n.match(/^\d+ event/i)&&e.push({key:e.length,timestamp:"-",event:n.slice(0,80),user:"-",level:"info",detail:""})}return e}function se(t){const e=V(t);if(e&&typeof e=="object"&&!Array.isArray(e)){const y=["#1677ff","#52c41a","#faad14","#ff4d4f"];return Object.entries(e).slice(0,4).map(([m,f],x)=>({label:m,value:typeof f=="number"?f:String(f),color:y[x%y.length]}))}const o=[],p=t.split(`
|
|
4
|
+
`),n=["#1677ff","#52c41a","#faad14","#ff4d4f"];let r=0;for(const y of p){const m=y.trim();if(!m||m.startsWith("─")||m.startsWith("Audit"))continue;const f=m.match(/^(.+?)\s*[:=]\s*(.+)$/);if(f){const x=f[1].trim(),N=f[2].trim(),T=N.match(/^(\d+)/);o.push({label:x,value:T?parseInt(T[1],10):N,color:n[r%n.length]}),r++}}return o.length===0&&o.push({label:"总事件数",value:A.value.length,color:"#1677ff"},{label:"状态",value:"就绪",color:"#52c41a"}),o}function V(t){try{const e=t.indexOf("[")!==-1?t.indexOf("["):t.indexOf("{");if(e===-1)return null;const o=t.lastIndexOf("]")!==-1?t.lastIndexOf("]")+1:t.lastIndexOf("}")+1;return JSON.parse(t.slice(e,o))}catch{return null}}function F(t,e){const o=V(t);return Array.isArray(o)?o.map((p,n)=>({key:n,...p})):e(t)}return fe(()=>{P()}),(t,e)=>{const o=u("a-button"),p=u("a-spin"),n=u("a-tag"),r=u("a-empty"),y=u("a-table"),m=u("a-tab-pane"),f=u("a-input"),x=u("a-form-item"),N=u("a-space"),T=u("a-form"),ne=u("a-alert"),J=u("a-card"),le=u("a-statistic"),oe=u("a-col"),ie=u("a-row"),re=u("a-tabs");return i(),d("div",null,[j("div",ye,[e[4]||(e[4]=j("div",null,[j("h2",{class:"page-title"},"权限管理"),j("p",{class:"page-sub"},"角色 / 权限检查 / 审计")],-1)),l(o,{type:"primary",ghost:"",loading:L.value,onClick:q},{icon:s(()=>[l(I(de))]),default:s(()=>[e[3]||(e[3]=h(" 刷新 ",-1))]),_:1},8,["loading"])]),l(re,{activeKey:O.value,"onUpdate:activeKey":e[2]||(e[2]=a=>O.value=a),type:"card",onChange:X},{default:s(()=>[l(m,{key:"roles"},{tab:s(()=>[l(I(pe)),e[5]||(e[5]=h(" 角色列表 ",-1))]),default:s(()=>[W.value?(i(),d("div",ve,[l(p,{size:"large"})])):(i(),b(y,{key:1,columns:Y,"data-source":S.value,pagination:{pageSize:20,showTotal:a=>`共 ${a} 条`},size:"small",style:{background:"var(--bg-card)"},"row-class-name":()=>"perm-row"},{bodyCell:s(({column:a,record:c})=>[a.key==="name"?(i(),d("span",_e,_(c.name),1)):g("",!0),a.key==="description"?(i(),d("span",ge,_(c.description),1)):g("",!0),a.key==="permissions"?(i(),d(z,{key:2},[(i(!0),d(z,null,E((c.permissions||[]).slice(0,5),D=>(i(),b(n,{key:D,color:"blue",style:{"margin-bottom":"2px"}},{default:s(()=>[h(_(D),1)]),_:2},1024))),128)),(c.permissions||[]).length>5?(i(),b(n,{key:0,color:"default"},{default:s(()=>[h(" +"+_(c.permissions.length-5),1)]),_:2},1024)):g("",!0)],64)):g("",!0),a.key==="userCount"?(i(),b(n,{key:3,color:c.userCount>0?"green":"default"},{default:s(()=>[h(_(c.userCount??0),1)]),_:2},1032,["color"])):g("",!0)]),emptyText:s(()=>[l(r,{description:"暂无角色数据"})]),_:1},8,["data-source","pagination"]))]),_:1}),l(m,{key:"check"},{tab:s(()=>[l(I(K)),e[6]||(e[6]=h(" 权限检查 ",-1))]),default:s(()=>[l(J,{style:{background:"var(--bg-card)","border-color":"var(--border-color)","max-width":"640px"}},{default:s(()=>[l(T,{"label-col":{span:5},"wrapper-col":{span:19}},{default:s(()=>[l(x,{label:"用户 ID",required:""},{default:s(()=>[l(f,{value:C.value,"onUpdate:value":e[0]||(e[0]=a=>C.value=a),placeholder:"输入用户 ID"},null,8,["value"])]),_:1}),l(x,{label:"权限",required:""},{default:s(()=>[l(f,{value:w.value,"onUpdate:value":e[1]||(e[1]=a=>w.value=a),placeholder:"note:read"},null,8,["value"])]),_:1}),l(x,{"wrapper-col":{offset:5,span:19}},{default:s(()=>[l(N,{wrap:""},{default:s(()=>[l(o,{type:"primary",loading:$.value,disabled:!C.value.trim()||!w.value.trim(),onClick:Q},{icon:s(()=>[l(I(K))]),default:s(()=>[e[7]||(e[7]=h(" 检查权限 ",-1))]),_:1},8,["loading","disabled"]),(i(),d(z,null,E(H,a=>l(o,{key:a,size:"small",onClick:c=>w.value=a},{default:s(()=>[h(_(a),1)]),_:2},1032,["onClick"])),64))]),_:1})]),_:1})]),_:1}),k.value!==null?(i(),d("div",he,[l(ne,{message:k.value.allowed?"权限允许":"权限拒绝",description:k.value.detail,type:k.value.allowed?"success":"error","show-icon":""},null,8,["message","description","type"])])):g("",!0)]),_:1})]),_:1}),l(m,{key:"audit"},{tab:s(()=>[l(I(me)),e[8]||(e[8]=h(" 审计日志 ",-1))]),default:s(()=>[l(ie,{gutter:[16,16],style:{"margin-bottom":"20px"}},{default:s(()=>[(i(!0),d(z,null,E(M.value,a=>(i(),b(oe,{xs:12,sm:6,key:a.label},{default:s(()=>[l(J,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"},size:"small"},{default:s(()=>[l(le,{title:a.label,value:a.value,"value-style":{color:a.color,fontSize:"20px"}},null,8,["title","value","value-style"])]),_:2},1024)]),_:2},1024))),128))]),_:1}),B.value?(i(),d("div",ke,[l(p,{size:"large"})])):(i(),b(y,{key:1,columns:ee,"data-source":A.value,pagination:{pageSize:20,showTotal:a=>`共 ${a} 条`},size:"small",style:{background:"var(--bg-card)"},"row-class-name":()=>"perm-row"},{bodyCell:s(({column:a,record:c})=>[a.key==="timestamp"?(i(),d("span",xe,_(c.timestamp),1)):g("",!0),a.key==="event"?(i(),d("span",be,_(c.event),1)):g("",!0),a.key==="user"?(i(),d("span",we,_(c.user),1)):g("",!0),a.key==="level"?(i(),b(n,{key:3,color:te(c.level)},{default:s(()=>[h(_(c.level),1)]),_:2},1032,["color"])):g("",!0),a.key==="detail"?(i(),d("span",Ce,_(c.detail),1)):g("",!0)]),emptyText:s(()=>[l(r,{description:"暂无审计日志"})]),_:1},8,["data-source","pagination"]))]),_:1})]),_:1},8,["activeKey"])])}}},je=ce(Ie,[["__scopeId","data-v-71782e36"]]);export{je as default};
|