chainlesschain 0.45.76 → 0.45.77
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/assets/web-panel/.build-hash +1 -1
- package/src/assets/web-panel/assets/{Analytics-sBrYoc3A.js → Analytics-Dd2DjBH5.js} +2 -2
- package/src/assets/web-panel/assets/AppLayout-CP9fATUN.js +1 -0
- package/src/assets/web-panel/assets/AppLayout-cxfKLu-m.css +1 -0
- package/src/assets/web-panel/assets/Backup-D6Tc7sf3.js +1 -0
- package/src/assets/web-panel/assets/Chat-DDUJZJ9I.js +1 -0
- package/src/assets/web-panel/assets/Chat-DfR76jyX.css +1 -0
- package/src/assets/web-panel/assets/Cowork-CPqYhoMI.css +1 -0
- package/src/assets/web-panel/assets/Cowork-XRFqGfqJ.js +48 -0
- package/src/assets/web-panel/assets/{Cron-CNs03iHJ.js → Cron-BnWzy_ZB.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-DanoHPSI.js → Dashboard-D2vCkoGu.js} +1 -1
- package/src/assets/web-panel/assets/{Git-CCMVr3Y8.js → Git-DYlvK4sh.js} +2 -2
- package/src/assets/web-panel/assets/{Logs-BY6A0UNG.js → Logs-4VgUbfP0.js} +2 -2
- package/src/assets/web-panel/assets/{McpTools-CrBVYlg6.js → McpTools-ChaiHoWY.js} +2 -2
- package/src/assets/web-panel/assets/{Memory-CWx3SpUt.js → Memory-PFtpuOwf.js} +2 -2
- package/src/assets/web-panel/assets/{Notes-1LcGD49x.js → Notes-wc_n6Rh1.js} +2 -2
- package/src/assets/web-panel/assets/{Organization-Dx2DhbkM.js → Organization-D1qUa8NQ.js} +4 -4
- package/src/assets/web-panel/assets/{P2P-B16fjqfJ.js → P2P-DIG2gnR8.js} +2 -2
- package/src/assets/web-panel/assets/{Permissions-BQbC9FzG.js → Permissions-CpE-Ar1e.js} +3 -3
- package/src/assets/web-panel/assets/{Projects-CjhZbNYm.js → Projects-GjuS-C6U.js} +2 -2
- package/src/assets/web-panel/assets/{Providers-ivOAQtHM.js → Providers-CCfGeqh_.js} +2 -2
- package/src/assets/web-panel/assets/{RssFeed-BrsErdrU.js → RssFeed-5TkrXK7Z.js} +1 -1
- package/src/assets/web-panel/assets/{Security-DnEvJU5h.js → Security-CcfBWT1D.js} +3 -3
- package/src/assets/web-panel/assets/{Services-7jQywNbl.js → Services-Cnm5Zs5h.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-CLlblJcG.js → Skills-BHapMb9h.js} +1 -1
- package/src/assets/web-panel/assets/{Tasks-CmJBC1cf.js → Tasks-DPb9OMck.js} +1 -1
- package/src/assets/web-panel/assets/Templates-Dij5t-rf.js +1 -0
- package/src/assets/web-panel/assets/{Wallet-3iYASEx_.js → Wallet-BJV5KmWA.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-s3Hzd9db.js → WebAuthn-DLkvYwSc.js} +5 -5
- package/src/assets/web-panel/assets/{antd-gZyc63Qr.js → antd-BQNxIyr-.js} +82 -82
- package/src/assets/web-panel/assets/github-dark-Dfs9RUU9.css +1 -0
- package/src/assets/web-panel/assets/index-CB5YlndO.js +2 -0
- package/src/assets/web-panel/assets/{markdown-Bv7nG63L.js → markdown-BeVIhIzs.js} +1 -1
- package/src/assets/web-panel/index.html +2 -2
- package/src/gateways/ws/action-protocol.js +54 -1
- package/src/gateways/ws/message-dispatcher.js +1 -0
- package/src/gateways/ws/ws-server.js +10 -1
- package/src/lib/cowork-task-runner.js +101 -0
- package/src/lib/cowork-task-templates.js +493 -0
- package/src/assets/web-panel/assets/AppLayout-2RCrdXxl.js +0 -1
- package/src/assets/web-panel/assets/AppLayout-D9pBLPC3.css +0 -1
- package/src/assets/web-panel/assets/Backup-D68fenbD.js +0 -1
- package/src/assets/web-panel/assets/Chat-B2nB8o_F.js +0 -1
- package/src/assets/web-panel/assets/Chat-DB46afPg.css +0 -1
- package/src/assets/web-panel/assets/Templates-RXT8-DNk.js +0 -1
- package/src/assets/web-panel/assets/index-CyGtHm63.js +0 -2
package/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
10de090f84a955c1e1423711a6c77d2f2a4102103718b7aa0fb4a5bbec4a6338
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{u as ie}from"./ws-CU7Gvoom.js";import{_ as ue}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{
|
|
1
|
+
import{u as ie}from"./ws-CU7Gvoom.js";import{_ as ue}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{p as ce,m as de,T as G,a0 as pe,a1 as ve,a2 as X,H as C}from"./antd-BQNxIyr-.js";import{w as fe,o as me,a3 as m,a1 as S,k as o,Z as s,f as y,X as f,r as Y,Y as r,G as i,u as b,W as I,a5 as x,a4 as g}from"./vendor-CN0Iv_qZ.js";const ke={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},ye={style:{display:"flex","align-items":"center",gap:"12px"}},_e={key:0,style:{"text-align":"center",padding:"60px"}},xe={key:1,style:{color:"#e0e0e0","font-family":"monospace","font-size":"12px"}},ge={key:2,style:{color:"#faad14"}},Te={key:3,style:{color:"var(--text-secondary)"}},be={key:0,style:{"text-align":"center",padding:"60px"}},he={key:0,style:{color:"var(--text-secondary)","font-size":"12px","font-family":"monospace"}},we={key:2,style:{color:"#e0e0e0","font-family":"monospace","font-size":"12px"}},Ce={key:3,style:{color:"#faad14"}},Se={key:4,style:{color:"var(--text-secondary)"}},Ie={key:0,style:{"text-align":"center",padding:"40px"}},ze={__name:"Analytics",setup(Re){const h=ie(),z=y("all"),O=y(!1),M=y(!1),N=y(!1),B=y(!1),D=y(!1),A=y(!1),L=y(20),p=Y({totalCalls:0,totalTokens:0,totalCost:0,avgResponseTime:0}),R=y([]),j=y([]),v=Y({entries:0,hits:0,tokensSaved:0,expired:0}),Z=[{title:"Provider",key:"provider",dataIndex:"provider",width:"120px",sorter:(e,t)=>(e.provider||"").localeCompare(t.provider||"")},{title:"Model",key:"model",dataIndex:"model",ellipsis:!0,sorter:(e,t)=>(e.model||"").localeCompare(t.model||"")},{title:"调用次数",key:"calls",dataIndex:"calls",width:"100px",sorter:(e,t)=>(e.calls||0)-(t.calls||0)},{title:"Input Tokens",key:"inputTokens",dataIndex:"inputTokens",width:"120px",sorter:(e,t)=>(e.inputTokens||0)-(t.inputTokens||0)},{title:"Output Tokens",key:"outputTokens",dataIndex:"outputTokens",width:"130px",sorter:(e,t)=>(e.outputTokens||0)-(t.outputTokens||0)},{title:"Total Tokens",key:"totalTokens",dataIndex:"totalTokens",width:"120px",sorter:(e,t)=>(e.totalTokens||0)-(t.totalTokens||0)},{title:"费用 (USD)",key:"cost",dataIndex:"cost",width:"110px",sorter:(e,t)=>(e.cost||0)-(t.cost||0)},{title:"平均响应",key:"avgResponseTime",dataIndex:"avgResponseTime",width:"110px",sorter:(e,t)=>(e.avgResponseTime||0)-(t.avgResponseTime||0)}],q=[{title:"时间",key:"timestamp",dataIndex:"timestamp",width:"180px"},{title:"Provider",key:"provider",dataIndex:"provider",width:"110px"},{title:"Model",key:"model",dataIndex:"model",ellipsis:!0},{title:"Input",key:"inputTokens",dataIndex:"inputTokens",width:"90px"},{title:"Output",key:"outputTokens",dataIndex:"outputTokens",width:"90px"},{title:"费用",key:"cost",dataIndex:"cost",width:"100px"},{title:"响应时间",key:"responseTime",dataIndex:"responseTime",width:"100px"}];function T(e){return(e||"").replace(/,/g,"")}function w(e){try{const t=(e||"").trim(),a=t.search(/[{[]/);return a>=0?JSON.parse(t.slice(a)):null}catch{return null}}function K(e){const t=(e||"").split(`
|
|
2
2
|
`);for(const a of t){const l=a.trim(),_=l.match(/total\s*calls?\s*[::]\s*([\d,]+)/i);_&&(p.totalCalls=parseInt(T(_[1]),10)||0);const u=l.match(/total\s*tokens?\s*[::]\s*([\d,]+)/i);u&&(p.totalTokens=parseInt(T(u[1]),10)||0);const d=l.match(/cost\s*[::]\s*\$?([\d,.]+)/i);d&&(p.totalCost=parseFloat(T(d[1]))||0);const c=l.match(/(?:avg|average)\s*(?:response\s*)?time\s*[::]\s*([\d,.]+)/i);c&&(p.avgResponseTime=parseFloat(T(c[1]))||0)}}function Q(e){p.totalCalls=e.totalCalls??e.total_calls??e.calls??0,p.totalTokens=e.totalTokens??e.total_tokens??e.tokens??0,p.totalCost=e.totalCost??e.total_cost??e.cost??0,p.avgResponseTime=e.avgResponseTime??e.avg_response_time??e.avgTime??0}function ee(e){return(Array.isArray(e)?e:e.breakdown||e.providers||e.rows||[]).map((a,l)=>({key:l,provider:a.provider||"-",model:a.model||"-",calls:a.calls||a.count||0,inputTokens:a.inputTokens??a.input_tokens??0,outputTokens:a.outputTokens??a.output_tokens??0,totalTokens:a.totalTokens??a.total_tokens??(a.inputTokens??0)+(a.outputTokens??0),cost:a.cost??a.total_cost??0,avgResponseTime:a.avgResponseTime??a.avg_response_time??0}))}function te(e){return(Array.isArray(e)?e:e.recent||e.records||e.rows||[]).map((a,l)=>({key:l,timestamp:a.timestamp||a.time||a.created_at||"-",provider:a.provider||"-",model:a.model||"-",inputTokens:a.inputTokens??a.input_tokens??0,outputTokens:a.outputTokens??a.output_tokens??0,cost:a.cost??0,responseTime:a.responseTime??a.response_time??0}))}function oe(e){v.entries=e.entries??e.count??e.size??0,v.hits=e.hits??e.cacheHits??e.cache_hits??0,v.tokensSaved=e.tokensSaved??e.tokens_saved??0,v.expired=e.expired??e.expiredCount??e.expired_count??0}function se(e){const t=(e||"").split(`
|
|
3
|
-
`);for(const a of t){const l=a.trim(),_=l.match(/entries?\s*[::]\s*([\d,]+)/i);_&&(v.entries=parseInt(T(_[1]),10)||0);const u=l.match(/hits?\s*[::]\s*([\d,]+)/i);u&&(v.hits=parseInt(T(u[1]),10)||0);const d=l.match(/(?:tokens?\s*)?saved\s*[::]\s*([\d,]+)/i);d&&(v.tokensSaved=parseInt(T(d[1]),10)||0);const c=l.match(/expired?\s*[::]\s*([\d,]+)/i);c&&(v.expired=parseInt(T(c[1]),10)||0)}}async function P(){O.value=!0;try{const{output:e}=await h.execute(`tokens show --period ${z.value} --json`,15e3),t=w(e);t?Q(t):K(e)}catch(e){console.error("loadSummary failed:",e)}finally{O.value=!1}}async function ae(){M.value=!0;try{const{output:e}=await h.execute("tokens breakdown --json",15e3),t=w(e);t?R.value=ee(t):R.value=[]}catch(e){console.error("loadBreakdown failed:",e),R.value=[]}finally{M.value=!1}}async function F(){N.value=!0;try{const{output:e}=await h.execute(`tokens recent --limit ${
|
|
3
|
+
`);for(const a of t){const l=a.trim(),_=l.match(/entries?\s*[::]\s*([\d,]+)/i);_&&(v.entries=parseInt(T(_[1]),10)||0);const u=l.match(/hits?\s*[::]\s*([\d,]+)/i);u&&(v.hits=parseInt(T(u[1]),10)||0);const d=l.match(/(?:tokens?\s*)?saved\s*[::]\s*([\d,]+)/i);d&&(v.tokensSaved=parseInt(T(d[1]),10)||0);const c=l.match(/expired?\s*[::]\s*([\d,]+)/i);c&&(v.expired=parseInt(T(c[1]),10)||0)}}async function P(){O.value=!0;try{const{output:e}=await h.execute(`tokens show --period ${z.value} --json`,15e3),t=w(e);t?Q(t):K(e)}catch(e){console.error("loadSummary failed:",e)}finally{O.value=!1}}async function ae(){M.value=!0;try{const{output:e}=await h.execute("tokens breakdown --json",15e3),t=w(e);t?R.value=ee(t):R.value=[]}catch(e){console.error("loadBreakdown failed:",e),R.value=[]}finally{M.value=!1}}async function F(){N.value=!0;try{const{output:e}=await h.execute(`tokens recent --limit ${L.value} --json`,15e3),t=w(e);t?j.value=te(t):j.value=[]}catch(e){console.error("loadRecent failed:",e),j.value=[]}finally{N.value=!1}}async function $(){B.value=!0;try{const{output:e}=await h.execute("tokens cache --json",15e3),t=w(e);t?oe(t):se(e)}catch(e){console.error("loadCache failed:",e)}finally{B.value=!1}}async function ne(){D.value=!0;try{const{output:e}=await h.execute("tokens cache --clear --json",15e3),t=w(e);t&&t.error?C.error("清理缓存失败: "+t.error):(C.success("缓存已清理"),await $())}catch(e){C.error("清理缓存失败: "+e.message)}finally{D.value=!1}}async function le(){A.value=!0;try{const{output:e}=await h.execute("tokens cache --cleanup --json",15e3),t=w(e);t&&t.error?C.error("清理过期失败: "+t.error):(C.success("过期缓存已清理"),await $())}catch(e){C.error("清理过期失败: "+e.message)}finally{A.value=!1}}async function U(){await Promise.all([P(),ae(),F(),$()])}return fe(z,()=>{P()}),me(U),(e,t)=>{const a=f("a-radio-button"),l=f("a-radio-group"),_=f("a-button"),u=f("a-statistic"),d=f("a-card"),c=f("a-col"),V=f("a-row"),J=f("a-spin"),H=f("a-tag"),W=f("a-empty"),E=f("a-table"),re=f("a-space");return r(),m("div",null,[S("div",ke,[t[7]||(t[7]=S("div",null,[S("h2",{class:"page-title"},"使用分析"),S("p",{class:"page-sub"},"Token 用量 / 成本 / 缓存")],-1)),S("div",ye,[o(l,{value:z.value,"onUpdate:value":t[0]||(t[0]=n=>z.value=n),"button-style":"solid",size:"small"},{default:s(()=>[o(a,{value:"today"},{default:s(()=>[...t[2]||(t[2]=[i("今天",-1)])]),_:1}),o(a,{value:"week"},{default:s(()=>[...t[3]||(t[3]=[i("本周",-1)])]),_:1}),o(a,{value:"month"},{default:s(()=>[...t[4]||(t[4]=[i("本月",-1)])]),_:1}),o(a,{value:"all"},{default:s(()=>[...t[5]||(t[5]=[i("全部",-1)])]),_:1})]),_:1},8,["value"]),o(_,{type:"primary",ghost:"",loading:O.value,onClick:U},{icon:s(()=>[o(b(ce))]),default:s(()=>[t[6]||(t[6]=i(" 刷新 ",-1))]),_:1},8,["loading"])])]),o(V,{gutter:[16,16],style:{"margin-bottom":"20px"}},{default:s(()=>[o(c,{xs:24,sm:12,lg:6},{default:s(()=>[o(d,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:s(()=>[o(u,{title:"总调用次数",value:p.totalCalls,"value-style":{color:"#1677ff",fontSize:"20px"}},{prefix:s(()=>[o(b(de))]),suffix:s(()=>[...t[8]||(t[8]=[i("次",-1)])]),_:1},8,["value"])]),_:1})]),_:1}),o(c,{xs:24,sm:12,lg:6},{default:s(()=>[o(d,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:s(()=>[o(u,{title:"总 Token 数",value:p.totalTokens,"value-style":{color:"#52c41a",fontSize:"20px"}},{prefix:s(()=>[o(b(G))]),_:1},8,["value"])]),_:1})]),_:1}),o(c,{xs:24,sm:12,lg:6},{default:s(()=>[o(d,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:s(()=>[o(u,{title:"总费用",value:p.totalCost,precision:4,"value-style":{color:"#faad14",fontSize:"20px"}},{prefix:s(()=>[o(b(pe))]),suffix:s(()=>[...t[9]||(t[9]=[i("USD",-1)])]),_:1},8,["value"])]),_:1})]),_:1}),o(c,{xs:24,sm:12,lg:6},{default:s(()=>[o(d,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:s(()=>[o(u,{title:"平均响应时间",value:p.avgResponseTime,"value-style":{color:"#722ed1",fontSize:"20px"}},{prefix:s(()=>[o(b(G))]),suffix:s(()=>[...t[10]||(t[10]=[i("ms",-1)])]),_:1},8,["value"])]),_:1})]),_:1})]),_:1}),o(d,{title:"Provider 分布",style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"20px"}},{default:s(()=>[M.value?(r(),m("div",_e,[o(J,{size:"large"})])):(r(),I(E,{key:1,columns:Z,"data-source":R.value,pagination:{pageSize:20,showTotal:n=>`共 ${n} 条`},size:"small",style:{background:"var(--bg-card)"},"row-class-name":()=>"analytics-row"},{bodyCell:s(({column:n,record:k})=>[n.key==="provider"?(r(),I(H,{key:0,color:"blue"},{default:s(()=>[i(x(k.provider),1)]),_:2},1024)):g("",!0),n.key==="model"?(r(),m("span",xe,x(k.model),1)):g("",!0),n.key==="cost"?(r(),m("span",ge,"$"+x((k.cost||0).toFixed(4)),1)):g("",!0),n.key==="avgResponseTime"?(r(),m("span",Te,x(k.avgResponseTime||0)+" ms",1)):g("",!0)]),emptyText:s(()=>[o(W,{description:"暂无调用记录"})]),_:1},8,["data-source","pagination"]))]),_:1}),o(d,{title:"最近调用记录",style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"20px"}},{extra:s(()=>[o(l,{value:L.value,"onUpdate:value":t[1]||(t[1]=n=>L.value=n),size:"small",onChange:F},{default:s(()=>[o(a,{value:10},{default:s(()=>[...t[11]||(t[11]=[i("10",-1)])]),_:1}),o(a,{value:20},{default:s(()=>[...t[12]||(t[12]=[i("20",-1)])]),_:1}),o(a,{value:50},{default:s(()=>[...t[13]||(t[13]=[i("50",-1)])]),_:1})]),_:1},8,["value"])]),default:s(()=>[N.value?(r(),m("div",be,[o(J,{size:"large"})])):(r(),I(E,{key:1,columns:q,"data-source":j.value,pagination:{pageSize:20,showTotal:n=>`共 ${n} 条`},size:"small",style:{background:"var(--bg-card)"},"row-class-name":()=>"analytics-row"},{bodyCell:s(({column:n,record:k})=>[n.key==="timestamp"?(r(),m("span",he,x(k.timestamp),1)):g("",!0),n.key==="provider"?(r(),I(H,{key:1,color:"blue"},{default:s(()=>[i(x(k.provider),1)]),_:2},1024)):g("",!0),n.key==="model"?(r(),m("span",we,x(k.model),1)):g("",!0),n.key==="cost"?(r(),m("span",Ce,"$"+x((k.cost||0).toFixed(4)),1)):g("",!0),n.key==="responseTime"?(r(),m("span",Se,x(k.responseTime||0)+" ms",1)):g("",!0)]),emptyText:s(()=>[o(W,{description:"暂无调用记录"})]),_:1},8,["data-source","pagination"]))]),_:1}),o(d,{title:"缓存状态",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{extra:s(()=>[o(re,null,{default:s(()=>[o(_,{size:"small",loading:A.value,onClick:le,style:{background:"var(--bg-card-hover)","border-color":"var(--border-color)"}},{icon:s(()=>[o(b(X))]),default:s(()=>[t[14]||(t[14]=i(" 清理过期 ",-1))]),_:1},8,["loading"]),o(_,{size:"small",danger:"",loading:D.value,onClick:ne,style:{"border-color":"var(--border-color)"}},{icon:s(()=>[o(b(X))]),default:s(()=>[t[15]||(t[15]=i(" 清理缓存 ",-1))]),_:1},8,["loading"])]),_:1})]),default:s(()=>[B.value?(r(),m("div",Ie,[o(J)])):(r(),I(V,{key:1,gutter:[16,16]},{default:s(()=>[o(c,{xs:12,sm:6},{default:s(()=>[o(u,{title:"缓存条目",value:v.entries,"value-style":{color:"#1677ff",fontSize:"18px"}},{prefix:s(()=>[o(b(ve))]),_:1},8,["value"])]),_:1}),o(c,{xs:12,sm:6},{default:s(()=>[o(u,{title:"命中次数",value:v.hits,"value-style":{color:"#52c41a",fontSize:"18px"}},null,8,["value"])]),_:1}),o(c,{xs:12,sm:6},{default:s(()=>[o(u,{title:"节省 Token",value:v.tokensSaved,"value-style":{color:"#faad14",fontSize:"18px"}},null,8,["value"])]),_:1}),o(c,{xs:12,sm:6},{default:s(()=>[o(u,{title:"已过期",value:v.expired,"value-style":{color:"#ff4d4f",fontSize:"18px"}},null,8,["value"])]),_:1})]),_:1}))]),_:1})])}}},Be=ue(ze,[["__scopeId","data-v-92f257d5"]]);export{Be as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{o as fe,W as f,Z as t,X as d,$ as ve,a0 as ge,Y as i,k as e,a1 as a,a2 as w,a3 as r,a4 as S,F as j,u as s,a5 as g,G as l,a6 as be,a7 as Oe,f as Ce,c as m}from"./vendor-CN0Iv_qZ.js";import{u as we}from"./ws-CU7Gvoom.js";import{u as je,T as Te}from"./index-CB5YlndO.js";import{_ as Se}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{F as B,G as x,D as M,M as F,R as K,C as P,b as A,c as G,d as I,e as W,B as D,f as V,h as z,T as E,S as U,L as $,W as H,i as X,j as Y,P as Z,k as q,l as J,m as Q,n as h,o as ee,K as te,I as Be}from"./antd-BQNxIyr-.js";const xe={key:0,class:"logo-text"},Le={key:0,class:"mode-banner project"},Ne={class:"banner-info"},Re={class:"banner-name"},Me={key:1,class:"mode-banner global"},Fe=["title"],Ke={key:0,class:"footer-text"},Pe={class:"header-left"},Ae={class:"header-right"},Ge={class:"theme-switcher"},Ie=["data-theme-key","onClick"],We={__name:"AppLayout",setup(De){const oe=ve(),se=ge(),b=we(),T=je(),u=Ce(!1),y=window.__CC_CONFIG__||{},p=m(()=>y.mode==="project"),ne=m(()=>T.current),le=m(()=>T.config.vars["--menu-mode"]),L=m(()=>{const c=se.name?.toLowerCase()||"dashboard";return[{mcptools:"mcp"}[c]||c]}),O=m(()=>b.status),ae=m(()=>({connected:"success",connecting:"processing",error:"error",disconnected:"default"})[b.status]||"default"),ie=m(()=>({connected:"已连接",connecting:"连接中...",error:"连接错误",disconnected:"未连接"})[b.status]||"未知");function de(c){T.setTheme(c)}function ue({key:c}){oe.push({mcp:"/mcp"}[c]||`/${c}`)}return fe(()=>b.connect()),(c,o)=>{const n=d("a-menu-item"),k=d("a-menu-item-group"),v=d("a-menu-divider"),re=d("a-menu"),ce=d("a-badge"),pe=d("a-layout-sider"),N=d("a-tooltip"),me=d("a-tag"),ye=d("a-layout-header"),ke=d("router-view"),_e=d("a-layout-content"),R=d("a-layout");return i(),f(R,{class:"app-root"},{default:t(()=>[e(pe,{collapsed:u.value,"onUpdate:collapsed":o[1]||(o[1]=_=>u.value=_),collapsible:"","collapsed-width":56,width:216,class:"sidebar"},{default:t(()=>[a("div",{class:w(["logo",{collapsed:u.value}])},[o[2]||(o[2]=a("span",{class:"logo-icon"},"⛓",-1)),u.value?S("",!0):(i(),r("span",xe,"ChainlessChain"))],2),u.value?(i(),r("div",{key:1,class:"mode-icon-sm",title:p.value?s(y).projectName:"全局模式"},[p.value?(i(),f(s(B),{key:0,style:{color:"#1677ff"}})):(i(),f(s(x),{key:1,style:{color:"#722ed1"}}))],8,Fe)):(i(),r(j,{key:0},[p.value?(i(),r("div",Le,[e(s(B),{class:"banner-icon"}),a("div",Ne,[a("div",Re,g(s(y).projectName||"项目"),1),o[3]||(o[3]=a("div",{class:"banner-sub"},"项目级面板",-1))])])):(i(),r("div",Me,[e(s(x),{class:"banner-icon"}),o[4]||(o[4]=a("span",{class:"banner-name"},"全局模式",-1))]))],64)),e(re,{selectedKeys:L.value,"onUpdate:selectedKeys":o[0]||(o[0]=_=>L.value=_),theme:le.value,mode:"inline","inline-collapsed":u.value,class:"side-menu",onClick:ue},{default:t(()=>[u.value?(i(),r(j,{key:1},[e(n,{key:"dashboard"},{icon:t(()=>[e(s(M))]),_:1}),e(n,{key:"chat"},{icon:t(()=>[e(s(F))]),_:1}),e(n,{key:"cowork"},{icon:t(()=>[e(s(K))]),_:1}),e(n,{key:"services"},{icon:t(()=>[e(s(P))]),_:1}),e(n,{key:"logs"},{icon:t(()=>[e(s(A))]),_:1}),e(v,{class:"divider-sm"}),e(n,{key:"skills"},{icon:t(()=>[e(s(G))]),_:1}),e(n,{key:"providers"},{icon:t(()=>[e(s(I))]),_:1}),e(n,{key:"mcp"},{icon:t(()=>[e(s(W))]),_:1}),e(v,{class:"divider-sm"}),e(n,{key:"notes"},{icon:t(()=>[e(s(D))]),_:1}),e(n,{key:"memory"},{icon:t(()=>[e(s(V))]),_:1}),e(n,{key:"cron"},{icon:t(()=>[e(s(z))]),_:1}),e(n,{key:"tasks"},{icon:t(()=>[e(s(E))]),_:1}),e(v,{class:"divider-sm"}),e(n,{key:"security"},{icon:t(()=>[e(s(U))]),_:1}),e(n,{key:"permissions"},{icon:t(()=>[e(s($))]),_:1}),e(n,{key:"p2p"},{icon:t(()=>[e(s(H))]),_:1}),e(n,{key:"backup"},{icon:t(()=>[e(s(X))]),_:1}),e(n,{key:"git"},{icon:t(()=>[e(s(Y))]),_:1}),e(n,{key:"projects"},{icon:t(()=>[e(s(Z))]),_:1}),e(v,{class:"divider-sm"}),e(n,{key:"wallet"},{icon:t(()=>[e(s(q))]),_:1}),e(n,{key:"organization"},{icon:t(()=>[e(s(J))]),_:1}),e(n,{key:"analytics"},{icon:t(()=>[e(s(Q))]),_:1}),e(n,{key:"templates"},{icon:t(()=>[e(s(h))]),_:1}),e(v,{class:"divider-sm"}),e(n,{key:"rssfeed"},{icon:t(()=>[e(s(ee))]),_:1}),e(n,{key:"webauthn"},{icon:t(()=>[e(s(te))]),_:1})],64)):(i(),r(j,{key:0},[e(k,null,{title:t(()=>[...o[5]||(o[5]=[a("span",{class:"group-label"},"概 览",-1)])]),default:t(()=>[e(n,{key:"dashboard"},{icon:t(()=>[e(s(M))]),default:t(()=>[o[6]||(o[6]=l("仪表板",-1))]),_:1}),e(n,{key:"chat"},{icon:t(()=>[e(s(F))]),default:t(()=>[o[7]||(o[7]=l("AI 对话",-1))]),_:1}),e(n,{key:"cowork"},{icon:t(()=>[e(s(K))]),default:t(()=>[o[8]||(o[8]=l("日常协作",-1))]),_:1}),e(n,{key:"services"},{icon:t(()=>[e(s(P))]),default:t(()=>[o[9]||(o[9]=l("服务管理",-1))]),_:1}),e(n,{key:"logs"},{icon:t(()=>[e(s(A))]),default:t(()=>[o[10]||(o[10]=l("日志查看",-1))]),_:1})]),_:1}),e(k,null,{title:t(()=>[...o[11]||(o[11]=[a("span",{class:"group-label"},"配 置",-1)])]),default:t(()=>[e(n,{key:"skills"},{icon:t(()=>[e(s(G))]),default:t(()=>[o[12]||(o[12]=l("技能管理",-1))]),_:1}),e(n,{key:"providers"},{icon:t(()=>[e(s(I))]),default:t(()=>[o[13]||(o[13]=l("LLM 配置",-1))]),_:1}),e(n,{key:"mcp"},{icon:t(()=>[e(s(W))]),default:t(()=>[o[14]||(o[14]=l("MCP 工具",-1))]),_:1})]),_:1}),e(k,null,{title:t(()=>[...o[15]||(o[15]=[a("span",{class:"group-label"},"数 据",-1)])]),default:t(()=>[e(n,{key:"notes"},{icon:t(()=>[e(s(D))]),default:t(()=>[o[16]||(o[16]=l("笔记管理",-1))]),_:1}),e(n,{key:"memory"},{icon:t(()=>[e(s(V))]),default:t(()=>[o[17]||(o[17]=l("记忆文件",-1))]),_:1}),e(n,{key:"cron"},{icon:t(()=>[e(s(z))]),default:t(()=>[o[18]||(o[18]=l("定时任务",-1))]),_:1}),e(n,{key:"tasks"},{icon:t(()=>[e(s(E))]),default:t(()=>[o[19]||(o[19]=l("后台任务",-1))]),_:1})]),_:1}),e(k,null,{title:t(()=>[...o[20]||(o[20]=[a("span",{class:"group-label"},"高 级",-1)])]),default:t(()=>[e(n,{key:"security"},{icon:t(()=>[e(s(U))]),default:t(()=>[o[21]||(o[21]=l("安全中心",-1))]),_:1}),e(n,{key:"permissions"},{icon:t(()=>[e(s($))]),default:t(()=>[o[22]||(o[22]=l("权限管理",-1))]),_:1}),e(n,{key:"p2p"},{icon:t(()=>[e(s(H))]),default:t(()=>[o[23]||(o[23]=l("P2P 网络",-1))]),_:1}),e(n,{key:"backup"},{icon:t(()=>[e(s(X))]),default:t(()=>[o[24]||(o[24]=l("备份同步",-1))]),_:1}),e(n,{key:"git"},{icon:t(()=>[e(s(Y))]),default:t(()=>[o[25]||(o[25]=l("Git 与数据",-1))]),_:1}),e(n,{key:"projects"},{icon:t(()=>[e(s(Z))]),default:t(()=>[o[26]||(o[26]=l("项目管理",-1))]),_:1})]),_:1}),e(k,null,{title:t(()=>[...o[27]||(o[27]=[a("span",{class:"group-label"},"企 业",-1)])]),default:t(()=>[e(n,{key:"wallet"},{icon:t(()=>[e(s(q))]),default:t(()=>[o[28]||(o[28]=l("钱包管理",-1))]),_:1}),e(n,{key:"organization"},{icon:t(()=>[e(s(J))]),default:t(()=>[o[29]||(o[29]=l("组织管理",-1))]),_:1}),e(n,{key:"analytics"},{icon:t(()=>[e(s(Q))]),default:t(()=>[o[30]||(o[30]=l("使用分析",-1))]),_:1}),e(n,{key:"templates"},{icon:t(()=>[e(s(h))]),default:t(()=>[o[31]||(o[31]=l("模板中心",-1))]),_:1})]),_:1}),e(k,null,{title:t(()=>[...o[32]||(o[32]=[a("span",{class:"group-label"},"扩 展",-1)])]),default:t(()=>[e(n,{key:"rssfeed"},{icon:t(()=>[e(s(ee))]),default:t(()=>[o[33]||(o[33]=l("RSS 订阅",-1))]),_:1}),e(n,{key:"webauthn"},{icon:t(()=>[e(s(te))]),default:t(()=>[o[34]||(o[34]=l("身份认证",-1))]),_:1})]),_:1})],64))]),_:1},8,["selectedKeys","theme","inline-collapsed"]),a("div",{class:w(["sidebar-footer",{collapsed:u.value}])},[e(ce,{status:ae.value},null,8,["status"]),u.value?S("",!0):(i(),r("span",Ke,g(ie.value),1))],2)]),_:1},8,["collapsed"]),e(R,{class:"main-area"},{default:t(()=>[e(ye,{class:"app-header"},{default:t(()=>[a("div",Pe,[a("div",{class:w(["scope-tag",p.value?"project":"global"])},[(i(),f(be(p.value?s(B):s(x)))),a("span",null,g(p.value?s(y).projectName||"项目":"全局模式"),1),p.value&&s(y).projectRoot?(i(),f(N,{key:0,title:s(y).projectRoot},{default:t(()=>[e(s(Be),{class:"info-icon"})]),_:1},8,["title"])):S("",!0)],2)]),a("div",Ae,[a("div",Ge,[(i(!0),r(j,null,Oe(s(Te),(_,C)=>(i(),f(N,{key:C,title:_.label},{default:t(()=>[a("button",{class:w(["theme-btn",{active:ne.value===C}]),"data-theme-key":C,onClick:Ve=>de(C)},g(_.icon),11,Ie)]),_:2},1032,["title"]))),128))]),o[35]||(o[35]=a("span",{class:"version-tag"},"v5.0.2.9",-1)),e(me,{color:O.value==="connected"?"green":O.value==="connecting"?"orange":"red",class:"ws-tag"},{default:t(()=>[l(g(O.value==="connected"?"已连接":O.value==="connecting"?"连接中":"断开"),1)]),_:1},8,["color"])])]),_:1}),e(_e,{class:"page-content"},{default:t(()=>[e(ke)]),_:1})]),_:1})]),_:1})}}},Xe=Se(We,[["__scopeId","data-v-2d496e96"]]);export{Xe as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.app-root[data-v-2d496e96]{min-height:100vh;background:var(--bg-base)}.sidebar[data-v-2d496e96]{background:var(--bg-sidebar)!important;border-right:1px solid var(--border-color);transition:background .25s}[data-v-2d496e96] .ant-layout-sider-children{display:flex;flex-direction:column;overflow:hidden}.main-area[data-v-2d496e96]{background:var(--bg-base)}.logo[data-v-2d496e96]{height:52px;display:flex;align-items:center;padding:0 18px;gap:10px;border-bottom:1px solid var(--border-color);overflow:hidden;white-space:nowrap;flex-shrink:0}.logo.collapsed[data-v-2d496e96]{padding:0;justify-content:center}.logo-icon[data-v-2d496e96]{font-size:20px;flex-shrink:0}.logo-text[data-v-2d496e96]{color:var(--logo-text);font-weight:700;font-size:14px;letter-spacing:.01em}.mode-banner[data-v-2d496e96]{display:flex;align-items:center;gap:8px;padding:7px 10px;margin:8px 8px 4px;border-radius:7px;overflow:hidden}.mode-banner.project[data-v-2d496e96]{background:#1677ff1a;border:1px solid rgba(22,119,255,.2)}.mode-banner.global[data-v-2d496e96]{background:#722ed11a;border:1px solid rgba(114,46,209,.2)}.banner-icon[data-v-2d496e96]{font-size:13px;flex-shrink:0;color:#1677ff}.mode-banner.global .banner-icon[data-v-2d496e96]{color:#722ed1}.banner-info[data-v-2d496e96]{flex:1;min-width:0}.banner-name[data-v-2d496e96]{font-size:12px;font-weight:600;color:var(--text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.banner-sub[data-v-2d496e96]{font-size:10px;color:#1677ff;margin-top:1px}.mode-banner.global .banner-name[data-v-2d496e96]{color:#c084fc}.mode-icon-sm[data-v-2d496e96]{display:flex;justify-content:center;padding:8px 0;font-size:14px}.side-menu[data-v-2d496e96]{border:none!important;margin-top:2px;-webkit-user-select:none;user-select:none;background:transparent!important;flex:1;overflow-y:auto;overflow-x:hidden}.group-label[data-v-2d496e96]{color:var(--group-title);font-size:10px;font-weight:700;letter-spacing:.12em;padding-left:6px}[data-v-2d496e96] .ant-menu-item-group-title{padding:8px 16px 2px!important}[data-v-2d496e96] .ant-menu-item{height:38px!important;line-height:38px!important;margin:1px 4px!important;border-radius:6px!important}.divider-sm[data-v-2d496e96]{margin:4px 0!important}.sidebar-footer[data-v-2d496e96]{flex-shrink:0;padding:8px 18px;display:flex;align-items:center;gap:8px;border-top:1px solid var(--border-color)}.sidebar-footer.collapsed[data-v-2d496e96]{justify-content:center;padding:8px 0}.footer-text[data-v-2d496e96]{color:var(--text-secondary);font-size:11px}.app-header[data-v-2d496e96]{background:var(--bg-header)!important;padding:0 20px!important;border-bottom:1px solid var(--border-color);height:50px!important;line-height:50px!important;display:flex!important;align-items:center!important;justify-content:space-between!important;box-shadow:0 1px 4px #0000000f}.header-left[data-v-2d496e96],.header-right[data-v-2d496e96]{display:flex;align-items:center;gap:10px}.scope-tag[data-v-2d496e96]{display:flex;align-items:center;gap:5px;padding:3px 10px;border-radius:5px;font-size:12px;font-weight:500}.scope-tag.project[data-v-2d496e96]{background:#1677ff1a;color:#1677ff;border:1px solid rgba(22,119,255,.2)}.scope-tag.global[data-v-2d496e96]{background:#722ed11a;color:#722ed1;border:1px solid rgba(114,46,209,.2)}.info-icon[data-v-2d496e96]{opacity:.45;cursor:help;margin-left:2px}.theme-switcher[data-v-2d496e96]{display:flex;align-items:center;gap:4px;background:var(--bg-card);border:1px solid var(--border-color);border-radius:20px;padding:3px 6px}.theme-btn[data-v-2d496e96]{width:26px;height:26px;border:none;border-radius:50%;cursor:pointer;background:transparent;font-size:14px;line-height:1;display:flex;align-items:center;justify-content:center;transition:background .15s,transform .15s;opacity:.55}.theme-btn[data-v-2d496e96]:hover{opacity:.9;transform:scale(1.15);background:var(--bg-card-hover)}.theme-btn.active[data-v-2d496e96]{opacity:1;transform:scale(1.1);background:var(--bg-card-hover);outline:2px solid var(--text-secondary)}.version-tag[data-v-2d496e96]{color:var(--text-muted);font-size:11px}.ws-tag[data-v-2d496e96]{margin:0!important;font-size:11px}.page-content[data-v-2d496e96]{padding:24px;overflow:auto;background:var(--bg-base);min-height:calc(100vh - 50px)}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{u as Me}from"./ws-CU7Gvoom.js";import{_ as Ne}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{p as Le,J as me,i as re,O as N,a4 as U,a2 as Te}from"./antd-BQNxIyr-.js";import{o as je,a3 as s,a1 as p,k as a,Z as o,f as n,X as y,Y as l,G as f,u as v,W as b,a4 as r,a5 as u,F as Re}from"./vendor-CN0Iv_qZ.js";const De={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},Ee={key:0,style:{"text-align":"center",padding:"30px"}},Ue={key:0,style:{"font-family":"monospace",color:"var(--text-muted)","font-size":"12px"}},Je={key:1},Ke={key:2,style:{color:"var(--text-secondary)","font-size":"12px"}},Ve={key:3,style:{"margin-top":"16px"}},Ge={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"}},We={key:4,style:{"margin-top":"12px",color:"#ff4d4f","font-size":"12px"}},He={key:0,style:{background:"var(--bg-base)",border:"1px solid var(--border-color)","border-radius":"6px",padding:"12px","margin-top":"8px"}},Xe={style:{"font-family":"monospace"}},Ye={key:0},Ze={key:1,style:{"margin-top":"12px"}},qe={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"}},Qe={key:0,style:{"text-align":"center",padding:"30px"}},et={key:0,style:{"margin-bottom":"16px"}},tt={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"}},at={key:0,style:{"font-family":"monospace","font-size":"12px"}},ot={key:2,style:{"margin-top":"12px",color:"#ff4d4f","font-size":"12px"}},lt={key:0,style:{"text-align":"center",padding:"30px"}},nt={key:2,style:{"margin-top":"12px",color:"#ff4d4f","font-size":"12px"}},st={key:0,style:{"text-align":"center",padding:"30px"}},rt={key:0,style:{"font-family":"monospace",color:"var(--text-muted)","font-size":"12px"}},it={key:1},ut={key:2},ct={key:3,style:{color:"var(--text-secondary)","font-size":"12px"}},dt={key:3,style:{"margin-top":"12px",color:"#ff4d4f","font-size":"12px"}},pt={key:0,style:{"margin-top":"12px"}},vt={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"}},yt={__name:"Backup",setup(ft){const g=Me(),ie=n("backup"),J=n(!1),K=n(!1),V=n(!1),B=n(""),w=n([]),_=n(""),be=[{title:"备份 ID",key:"id"},{title:"大小",key:"size",width:120},{title:"创建时间",key:"createdAt"},{title:"操作",key:"action",width:100}];async function ue(){K.value=!0,B.value="";try{const{output:t}=await g.execute("backup list --json",15e3),e=M(t);Array.isArray(e)?w.value=e:e&&Array.isArray(e.backups)?w.value=e.backups:(w.value=[],t&&t.trim()&&(_.value=t))}catch(t){B.value=`加载备份列表失败: ${t.message}`}finally{K.value=!1}}async function xe(){V.value=!0,_.value="",B.value="";try{const{output:t}=await g.execute("backup create --json",3e4);_.value=t||"备份已创建",await ue()}catch(t){_.value=`创建备份失败: ${t.message}`}finally{V.value=!1}}const G=n(!1),W=n(!1),k=n(null),z=n("");function _e(t){k.value=t,z.value="",G.value=!0}async function ke(){if(k.value){W.value=!0,z.value="";try{const{output:t}=await g.execute(`backup restore ${k.value.id}`,6e4);z.value=t||"恢复完成"}catch(t){z.value=`恢复失败: ${t.message}`}finally{W.value=!1}}}const H=n(!1),L=n(""),I=n(!1),T=n("未知"),j=n(0),X=n(""),x=n(""),Y=n(!1),Z=n(!1),S=n([]),he=[{title:"文件路径",key:"path"},{title:"冲突类型",key:"type",width:120}];async function q(){H.value=!0,L.value="";try{const{output:t}=await g.execute("sync status --json",15e3),e=M(t);e?(I.value=e.online||e.synced||e.status==="online"||!1,T.value=I.value?"已同步":"未同步",j.value=e.pending??e.pendingChanges??0,X.value=e.lastSync||e.lastSyncTime||""):we(t)}catch(t){L.value=`加载同步状态失败: ${t.message}`}finally{H.value=!1}}function we(t){if(!t){T.value="未知";return}I.value=/synced|online|up.to.date/i.test(t),T.value=I.value?"已同步":"未同步";const e=t.match(/pending[:\s]+(\d+)/i);j.value=e?parseInt(e[1]):0;const c=t.match(/last[:\s]+(.+)/i);c&&(X.value=c[1].trim())}async function ze(){Y.value=!0,x.value="";try{const{output:t}=await g.execute("sync push",3e4);x.value=t||"推送完成",await q()}catch(t){x.value=`推送失败: ${t.message}`}finally{Y.value=!1}}async function Se(){Z.value=!0,x.value="";try{const{output:t}=await g.execute("sync pull",3e4);x.value=t||"拉取完成",await q()}catch(t){x.value=`拉取失败: ${t.message}`}finally{Z.value=!1}}async function Ce(){try{const{output:t}=await g.execute("sync conflicts --json",15e3),e=M(t);Array.isArray(e)?S.value=e:e&&Array.isArray(e.conflicts)?S.value=e.conflicts:S.value=[]}catch{S.value=[]}}const Q=n(!1),R=n(""),C=n(!1),ee=n(""),te=n(!1),O=n(""),A=n([]),Ae=[{title:"CID",key:"cid"},{title:"名称",key:"name"},{title:"大小",key:"size",width:120},{title:"固定时间",key:"pinnedAt"},{title:"操作",key:"action",width:120}];async function Pe(){Q.value=!0,R.value="";try{const{output:t}=await g.execute("ipfs status --json",15e3),e=M(t);if(e)C.value=e.online||e.status==="online"||e.connected||!1,ee.value=e.peerId||e.id||"";else{C.value=t?/online|connected|running/i.test(t):!1;const c=t?t.match(/(?:peer\s*id|id)[:\s]+(\S+)/i):null;ee.value=c?c[1]:""}}catch(t){R.value=`加载 IPFS 状态失败: ${t.message}`}finally{Q.value=!1}}async function ae(){te.value=!0,O.value="";try{const{output:t}=await g.execute("ipfs pins --json",15e3),e=M(t);Array.isArray(e)?A.value=e:e&&Array.isArray(e.pins)?A.value=e.pins:A.value=[]}catch(t){O.value=`加载固定列表失败: ${t.message}`}finally{te.value=!1}}const oe=n(!1),le=n(!1),D=n(""),F=n("");async function ce(){if(D.value.trim()){le.value=!0,F.value="";try{const{output:t}=await g.execute(`ipfs pin "${D.value.trim()}"`,3e4);F.value=t||"固定成功",await ae()}catch(t){F.value=`固定失败: ${t.message}`}finally{le.value=!1}}}async function $e(t){try{await g.execute(`ipfs unpin ${t.cid}`,15e3),await ae()}catch(e){O.value=`取消固定失败: ${e.message}`}}function M(t){if(!t||!t.trim())return null;try{return JSON.parse(t.trim())}catch{const c=t.match(/\{[\s\S]*\}|\[[\s\S]*\]/);if(c)try{return JSON.parse(c[0])}catch{}return null}}function de(t){if(t==null||isNaN(t))return"-";const e=Number(t);if(e===0)return"0 B";const c=["B","KB","MB","GB","TB"],h=Math.floor(Math.log(e)/Math.log(1024));return(e/Math.pow(1024,h)).toFixed(h>0?1:0)+" "+c[h]}async function pe(){J.value=!0;try{await Promise.all([ue(),q(),Ce(),Pe(),ae()])}finally{J.value=!1}}return je(pe),(t,e)=>{const c=y("a-button"),h=y("a-space"),E=y("a-spin"),ve=y("a-empty"),ne=y("a-table"),m=y("a-card"),ye=y("a-modal"),se=y("a-tab-pane"),P=y("a-statistic"),$=y("a-col"),fe=y("a-row"),ge=y("a-tag"),Be=y("a-popconfirm"),Ie=y("a-input"),Oe=y("a-tabs");return l(),s("div",null,[p("div",De,[e[6]||(e[6]=p("div",null,[p("h2",{class:"page-title"},"备份与同步"),p("p",{class:"page-sub"},"备份管理 / 数据同步 / IPFS")],-1)),a(c,{type:"primary",ghost:"",loading:J.value,onClick:pe},{icon:o(()=>[a(v(Le))]),default:o(()=>[e[5]||(e[5]=f(" 刷新 ",-1))]),_:1},8,["loading"])]),a(Oe,{activeKey:ie.value,"onUpdate:activeKey":e[4]||(e[4]=i=>ie.value=i),type:"card"},{default:o(()=>[a(se,{key:"backup"},{tab:o(()=>[a(v(re)),e[7]||(e[7]=f(" 备份管理",-1))]),default:o(()=>[a(m,{style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"20px"}},{title:o(()=>[a(h,null,{default:o(()=>[a(v(re)),e[8]||(e[8]=p("span",null,"备份操作",-1))]),_:1})]),extra:o(()=>[a(c,{type:"primary",loading:V.value,onClick:xe},{icon:o(()=>[a(v(me))]),default:o(()=>[e[9]||(e[9]=f(" 创建备份 ",-1))]),_:1},8,["loading"])]),default:o(()=>[K.value?(l(),s("div",Ee,[a(E)])):w.value.length===0&&!_.value?(l(),b(ve,{key:1,description:"暂无备份记录"})):r("",!0),w.value.length>0?(l(),b(ne,{key:2,columns:be,"data-source":w.value,pagination:!1,size:"small","row-key":"id"},{bodyCell:o(({column:i,record:d})=>[i.key==="id"?(l(),s("span",Ue,u(d.id.length>20?d.id.slice(0,20)+"...":d.id),1)):r("",!0),i.key==="size"?(l(),s("span",Je,u(de(d.size)),1)):r("",!0),i.key==="createdAt"?(l(),s("span",Ke,u(d.createdAt||"-"),1)):r("",!0),i.key==="action"?(l(),b(c,{key:3,size:"small",type:"link",onClick:Fe=>_e(d)},{default:o(()=>[...e[10]||(e[10]=[f(" 恢复 ",-1)])]),_:1},8,["onClick"])):r("",!0)]),_:1},8,["data-source"])):r("",!0),_.value?(l(),s("div",Ve,[e[11]||(e[11]=p("div",{style:{color:"var(--text-secondary)","font-size":"11px","margin-bottom":"6px"}},"最近操作结果",-1)),p("pre",Ge,u(_.value),1)])):r("",!0),B.value?(l(),s("div",We,u(B.value),1)):r("",!0)]),_:1}),a(ye,{open:G.value,"onUpdate:open":e[0]||(e[0]=i=>G.value=i),title:"确认恢复备份","ok-text":"确认恢复","cancel-text":"取消","confirm-loading":W.value,onOk:ke,"ok-type":"danger"},{default:o(()=>[e[15]||(e[15]=p("p",{style:{color:"var(--text-secondary)"}}," 确定要恢复以下备份吗?此操作将覆盖当前数据。 ",-1)),k.value?(l(),s("div",He,[p("div",null,[e[12]||(e[12]=p("strong",null,"备份 ID:",-1)),e[13]||(e[13]=f()),p("span",Xe,u(k.value.id),1)]),k.value.createdAt?(l(),s("div",Ye,[e[14]||(e[14]=p("strong",null,"创建时间:",-1)),f(" "+u(k.value.createdAt),1)])):r("",!0)])):r("",!0),z.value?(l(),s("div",Ze,[p("pre",qe,u(z.value),1)])):r("",!0)]),_:1},8,["open","confirm-loading"])]),_:1}),a(se,{key:"sync"},{tab:o(()=>[a(v(N)),e[16]||(e[16]=f(" 数据同步",-1))]),default:o(()=>[H.value?(l(),s("div",Qe,[a(E)])):(l(),s(Re,{key:1},[a(fe,{gutter:[16,16],style:{"margin-bottom":"20px"}},{default:o(()=>[a($,{xs:24,sm:8},{default:o(()=>[a(m,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:o(()=>[a(P,{title:"同步状态",value:T.value,"value-style":{color:I.value?"#52c41a":"#888",fontSize:"16px"}},{prefix:o(()=>[a(v(N))]),_:1},8,["value","value-style"])]),_:1})]),_:1}),a($,{xs:24,sm:8},{default:o(()=>[a(m,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:o(()=>[a(P,{title:"待同步变更",value:j.value,"value-style":{color:j.value>0?"#faad14":"#52c41a",fontSize:"16px"}},{prefix:o(()=>[a(v(N))]),_:1},8,["value","value-style"])]),_:1})]),_:1}),a($,{xs:24,sm:8},{default:o(()=>[a(m,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:o(()=>[a(P,{title:"最近同步",value:X.value||"无","value-style":{color:"var(--text-secondary)",fontSize:"16px"}},{prefix:o(()=>[a(v(N))]),_:1},8,["value"])]),_:1})]),_:1})]),_:1}),a(h,{style:{"margin-bottom":"16px"}},{default:o(()=>[a(c,{loading:Y.value,onClick:ze,style:{background:"var(--bg-card-hover)","border-color":"var(--border-color)"}},{icon:o(()=>[a(v(re))]),default:o(()=>[e[17]||(e[17]=f(" 推送 ",-1))]),_:1},8,["loading"]),a(c,{loading:Z.value,onClick:Se,style:{background:"var(--bg-card-hover)","border-color":"var(--border-color)"}},{icon:o(()=>[a(v(N))]),default:o(()=>[e[18]||(e[18]=f(" 拉取 ",-1))]),_:1},8,["loading"])]),_:1}),x.value?(l(),s("div",et,[e[19]||(e[19]=p("div",{style:{color:"var(--text-secondary)","font-size":"11px","margin-bottom":"6px"}},"操作结果",-1)),p("pre",tt,u(x.value),1)])):r("",!0),S.value.length>0?(l(),b(m,{key:1,title:"冲突列表",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:o(()=>[a(ne,{columns:he,"data-source":S.value,pagination:!1,size:"small","row-key":"path"},{bodyCell:o(({column:i,record:d})=>[i.key==="path"?(l(),s("span",at,u(d.path),1)):r("",!0),i.key==="type"?(l(),b(ge,{key:1,color:"red"},{default:o(()=>[f(u(d.type||"冲突"),1)]),_:2},1024)):r("",!0)]),_:1},8,["data-source"])]),_:1})):r("",!0)],64)),L.value?(l(),s("div",ot,u(L.value),1)):r("",!0)]),_:1}),a(se,{key:"ipfs"},{tab:o(()=>[a(v(U)),e[20]||(e[20]=f(" IPFS 存储",-1))]),default:o(()=>[a(m,{title:"IPFS 状态",style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"20px"}},{extra:o(()=>[a(ge,{color:C.value?"green":"default"},{default:o(()=>[f(u(C.value?"在线":"离线"),1)]),_:1},8,["color"])]),default:o(()=>[Q.value?(l(),s("div",lt,[a(E)])):(l(),b(fe,{key:1,gutter:[16,16]},{default:o(()=>[a($,{xs:24,sm:8},{default:o(()=>[a(m,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:o(()=>[a(P,{title:"节点状态",value:C.value?"已连接":"未连接","value-style":{color:C.value?"#52c41a":"#888",fontSize:"16px"}},{prefix:o(()=>[a(v(U))]),_:1},8,["value","value-style"])]),_:1})]),_:1}),a($,{xs:24,sm:8},{default:o(()=>[a(m,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:o(()=>[a(P,{title:"已固定文件",value:A.value.length,"value-style":{fontSize:"16px"}},{prefix:o(()=>[a(v(U))]),_:1},8,["value"])]),_:1})]),_:1}),a($,{xs:24,sm:8},{default:o(()=>[a(m,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:o(()=>[a(P,{title:"Peer ID",value:ee.value||"-","value-style":{color:"var(--text-muted)",fontSize:"12px",fontFamily:"monospace"}},{prefix:o(()=>[a(v(U))]),_:1},8,["value"])]),_:1})]),_:1})]),_:1})),R.value?(l(),s("div",nt,u(R.value),1)):r("",!0)]),_:1}),a(m,{title:"固定文件列表",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{extra:o(()=>[a(c,{size:"small",onClick:e[1]||(e[1]=i=>oe.value=!0),style:{background:"var(--bg-card-hover)","border-color":"var(--border-color)"}},{icon:o(()=>[a(v(me))]),default:o(()=>[e[21]||(e[21]=f(" 固定文件 ",-1))]),_:1})]),default:o(()=>[te.value?(l(),s("div",st,[a(E)])):A.value.length===0?(l(),b(ve,{key:1,description:"暂无固定文件"})):(l(),b(ne,{key:2,columns:Ae,"data-source":A.value,pagination:{pageSize:10},size:"small","row-key":"cid"},{bodyCell:o(({column:i,record:d})=>[i.key==="cid"?(l(),s("span",rt,u(d.cid.length>24?d.cid.slice(0,24)+"...":d.cid),1)):r("",!0),i.key==="name"?(l(),s("span",it,u(d.name||"-"),1)):r("",!0),i.key==="size"?(l(),s("span",ut,u(de(d.size)),1)):r("",!0),i.key==="pinnedAt"?(l(),s("span",ct,u(d.pinnedAt||"-"),1)):r("",!0),i.key==="action"?(l(),b(Be,{key:4,title:"确定取消固定?","ok-text":"确定","cancel-text":"取消",onConfirm:Fe=>$e(d)},{default:o(()=>[a(c,{size:"small",type:"link",danger:""},{default:o(()=>[a(v(Te)),e[22]||(e[22]=f(" 取消固定 ",-1))]),_:1})]),_:1},8,["onConfirm"])):r("",!0)]),_:1},8,["data-source"])),O.value?(l(),s("div",dt,u(O.value),1)):r("",!0)]),_:1}),a(ye,{open:oe.value,"onUpdate:open":e[3]||(e[3]=i=>oe.value=i),title:"固定文件到 IPFS","confirm-loading":le.value,onOk:ce,"ok-text":"固定","cancel-text":"取消"},{default:o(()=>[e[23]||(e[23]=p("div",{style:{"margin-bottom":"12px",color:"var(--text-secondary)"}},"请输入要固定的文件路径",-1)),a(Ie,{value:D.value,"onUpdate:value":e[2]||(e[2]=i=>D.value=i),placeholder:"文件路径,例如: /path/to/file.txt",onPressEnter:ce},null,8,["value"]),F.value?(l(),s("div",pt,[p("pre",vt,u(F.value),1)])):r("",!0)]),_:1},8,["open","confirm-loading"])]),_:1})]),_:1},8,["activeKey"])])}}},_t=Ne(yt,[["__scopeId","data-v-3d5d81e6"]]);export{_t as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{w as G,o as Q,a3 as n,a1 as s,k as i,u as r,a5 as u,Z as d,F as S,a7 as z,G as c,a4 as y,W as T,a9 as R,A as V,c as x,X as f,f as $,Y as o,a2 as A,n as J}from"./vendor-CN0Iv_qZ.js";import{m as H,H as M}from"./markdown-BeVIhIzs.js";/* empty css */import{u as K}from"./chat-DWBA4-cl.js";import{_ as D}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{F as P,G as U,M as W,q as X,u as Y}from"./antd-BQNxIyr-.js";import"./ws-CU7Gvoom.js";const Z={style:{display:"flex",height:"calc(100vh - 56px - 48px)",gap:"16px"}},ee={style:{width:"240px","flex-shrink":"0",background:"var(--bg-card)","border-radius":"8px",border:"1px solid var(--border-color)",display:"flex","flex-direction":"column",overflow:"hidden"}},te={key:0,style:{padding:"6px 12px 4px","font-size":"11px",color:"#1677ff",background:"rgba(22,119,255,.07)","border-bottom":"1px solid rgba(22,119,255,.15)",display:"flex","align-items":"center",gap:"4px"}},se=["title"],oe={key:1,style:{padding:"6px 12px 4px","font-size":"11px",color:"#722ed1",background:"rgba(114,46,209,.07)","border-bottom":"1px solid rgba(114,46,209,.15)",display:"flex","align-items":"center",gap:"4px"}},ne={style:{padding:"10px 12px","border-bottom":"1px solid var(--border-color)",display:"flex",gap:"8px"}},ae={style:{flex:"1","overflow-y":"auto",padding:"8px"}},le=["onClick"],ie={class:"session-icon"},re={class:"session-info"},de={class:"session-title"},pe={class:"session-meta"},ue={key:0,style:{"text-align":"center",color:"var(--text-muted)",padding:"24px 0","font-size":"13px"}},ce={style:{flex:"1",background:"var(--bg-card)","border-radius":"8px",border:"1px solid var(--border-color)",display:"flex","flex-direction":"column",overflow:"hidden"}},ve={key:0,style:{flex:"1",display:"flex","flex-direction":"column","align-items":"center","justify-content":"center",color:"var(--text-muted)"}},xe={style:{"margin-top":"24px",display:"flex",gap:"12px"}},ge={key:0,class:"tool-msg"},ye={style:{margin:"0","font-size":"11px",color:"#aaa","white-space":"pre-wrap"}},fe={key:0,style:{"margin-top":"8px","padding-top":"8px","border-top":"1px solid var(--border-color)"}},_e={style:{margin:"0","font-size":"11px",color:"#52c41a","white-space":"pre-wrap"}},me={key:1,class:"user-msg"},be={class:"bubble user"},he={key:2,class:"assistant-msg"},ke=["innerHTML"],we={key:0,class:"assistant-msg"},Ce=["innerHTML"],Se={key:1,class:"question-card"},ze={class:"question-text"},Me={key:0,style:{display:"flex","flex-wrap":"wrap",gap:"8px","margin-top":"10px"}},Oe={key:2,style:{padding:"16px","border-top":"1px solid var(--border-color)"}},Ie={style:{display:"flex",gap:"8px","align-items":"flex-end"}},Le={__name:"Chat",setup(Ne){const k=window.__CC_CONFIG__||{},j=x(()=>k.mode==="project");H.setOptions({highlight:(a,e)=>e&&M.getLanguage(e)?M.highlight(a,{language:e}).value:M.highlightAuto(a).value,breaks:!0});const l=K(),_=$(null),g=$(""),p=x(()=>l.currentSessionId),O=x(()=>p.value?l.getMessages(p.value):[]),w=x(()=>{const a=l.streaming[p.value];return a?.active?a.content:null}),m=x(()=>l.pendingQuestion[p.value]),b=x(()=>l.isLoading);function I(a){try{return H(a||"")}catch{return a||""}}async function h(a){await l.createSession(a)}async function L(){if(!g.value.trim()||b.value||!p.value)return;const a=g.value;g.value="",await l.sendMessage(p.value,a)}function N(a){l.answerQuestion(p.value,a)}return G([O,w],()=>{J(()=>{_.value&&(_.value.scrollTop=_.value.scrollHeight)})},{deep:!0}),Q(()=>{l.loadSessions()}),(a,e)=>{const v=f("a-button"),E=f("a-collapse-panel"),F=f("a-collapse"),q=f("a-input-search"),B=f("a-textarea");return o(),n("div",Z,[s("div",ee,[j.value?(o(),n("div",te,[i(r(P)),s("span",{style:{overflow:"hidden","text-overflow":"ellipsis","white-space":"nowrap"},title:r(k).projectRoot},u(r(k).projectName||"项目"),9,se)])):(o(),n("div",oe,[i(r(U)),e[5]||(e[5]=s("span",null,"全局会话",-1))])),s("div",ne,[i(v,{type:"primary",size:"small",style:{flex:"1"},onClick:e[0]||(e[0]=t=>h("chat"))},{icon:d(()=>[i(r(W))]),default:d(()=>[e[6]||(e[6]=c(" Chat ",-1))]),_:1}),i(v,{size:"small",style:{flex:"1"},onClick:e[1]||(e[1]=t=>h("agent"))},{icon:d(()=>[i(r(X))]),default:d(()=>[e[7]||(e[7]=c(" Agent ",-1))]),_:1})]),s("div",ae,[(o(!0),n(S,null,z(r(l).sessions,t=>(o(),n("div",{key:t.id,class:A(["session-item",{active:t.id===r(l).currentSessionId}]),onClick:C=>r(l).switchSession(t.id)},[s("span",ie,u(t.type==="agent"?"🤖":"💬"),1),s("div",re,[s("div",de,u(t.title||"新对话"),1),s("div",pe,u(t.messageCount||0)+" 条消息",1)])],10,le))),128)),r(l).sessions.length?y("",!0):(o(),n("div",ue,[...e[8]||(e[8]=[c(" 点击上方按钮",-1),s("br",null,null,-1),c("开始新对话 ",-1)])]))])]),s("div",ce,[p.value?(o(),n("div",{key:1,style:{flex:"1","overflow-y":"auto",padding:"20px"},ref_key:"messagesEl",ref:_},[(o(!0),n(S,null,z(O.value,(t,C)=>(o(),n("div",{key:C,class:A(["message-row",t.role])},[t.role==="tool"?(o(),n("div",ge,[i(F,{ghost:"",size:"small"},{default:d(()=>[i(E,{header:`🔧 ${t.tool} ${t.status==="running"?"(执行中...)":"✓"}`,style:{border:"1px solid var(--border-color)","border-radius":"6px",background:"var(--bg-card)"}},{default:d(()=>[s("pre",ye,u(JSON.stringify(t.input,null,2)),1),t.result?(o(),n("div",fe,[s("pre",_e,u(typeof t.result=="string"?t.result:JSON.stringify(t.result,null,2)),1)])):y("",!0)]),_:2},1032,["header"])]),_:2},1024)])):t.role==="user"?(o(),n("div",me,[s("div",be,u(t.content),1)])):(o(),n("div",he,[e[14]||(e[14]=s("div",{class:"avatar"},"AI",-1)),s("div",{class:"bubble assistant",innerHTML:I(t.content)},null,8,ke)]))],2))),128)),w.value?(o(),n("div",we,[e[15]||(e[15]=s("div",{class:"avatar"},"AI",-1)),s("div",{class:"bubble assistant streaming",innerHTML:I(w.value)},null,8,Ce)])):y("",!0),m.value?(o(),n("div",Se,[s("div",ze,u(m.value.question),1),m.value.choices?.length?(o(),n("div",Me,[(o(!0),n(S,null,z(m.value.choices,t=>(o(),T(v,{key:t,size:"small",onClick:C=>N(t)},{default:d(()=>[c(u(t),1)]),_:2},1032,["onClick"]))),128))])):(o(),T(q,{key:1,placeholder:"输入回答...","enter-button":"发送",style:{"margin-top":"10px"},onSearch:N}))])):y("",!0)],512)):(o(),n("div",ve,[e[11]||(e[11]=s("div",{style:{"font-size":"48px","margin-bottom":"16px"}},"💬",-1)),e[12]||(e[12]=s("div",{style:{"font-size":"16px","margin-bottom":"8px",color:"#777"}},"开始 AI 对话",-1)),e[13]||(e[13]=s("div",{style:{"font-size":"13px",color:"var(--text-muted)"}},"选择左侧会话或创建新对话",-1)),s("div",xe,[i(v,{type:"primary",onClick:e[2]||(e[2]=t=>h("chat"))},{default:d(()=>[...e[9]||(e[9]=[c("新建 Chat",-1)])]),_:1}),i(v,{style:{},onClick:e[3]||(e[3]=t=>h("agent"))},{default:d(()=>[...e[10]||(e[10]=[c("新建 Agent",-1)])]),_:1})])])),p.value?(o(),n("div",Oe,[s("div",Ie,[i(B,{value:g.value,"onUpdate:value":e[4]||(e[4]=t=>g.value=t),placeholder:b.value?"等待响应中...":"输入消息,Shift+Enter 换行,Enter 发送","auto-size":{minRows:1,maxRows:6},disabled:b.value,style:{background:"var(--bg-card-hover)","border-color":"var(--border-color)",color:"var(--text-primary)",resize:"none",flex:"1"},onKeydown:R(V(L,["exact","prevent"]),["enter"])},null,8,["value","placeholder","disabled","onKeydown"]),i(v,{type:"primary",loading:b.value,onClick:L,style:{height:"40px"}},{icon:d(()=>[i(r(Y))]),_:1},8,["loading"])])])):y("",!0)])])}}},qe=D(Le,[["__scopeId","data-v-8392b2d7"]]);export{qe as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.session-item[data-v-8392b2d7]{display:flex;align-items:center;gap:10px;padding:10px 12px;border-radius:8px;cursor:pointer;transition:background .15s;margin-bottom:4px}.session-item[data-v-8392b2d7]:hover{background:var(--bg-card-hover)}.session-item.active[data-v-8392b2d7]{background:#1677ff20;border:1px solid #1677ff40}.session-icon[data-v-8392b2d7]{font-size:16px}.session-info[data-v-8392b2d7]{flex:1;min-width:0}.session-title[data-v-8392b2d7]{color:#ccc;font-size:13px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.session-meta[data-v-8392b2d7]{color:var(--text-muted);font-size:11px;margin-top:2px}.message-row[data-v-8392b2d7]{margin-bottom:16px}.user-msg[data-v-8392b2d7]{display:flex;justify-content:flex-end}.assistant-msg[data-v-8392b2d7]{display:flex;gap:10px;align-items:flex-start}.avatar[data-v-8392b2d7]{width:32px;height:32px;border-radius:50%;background:#1677ff;display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:600;color:var(--text-primary);flex-shrink:0}.bubble[data-v-8392b2d7]{padding:10px 14px;border-radius:12px;max-width:80%;line-height:1.6;font-size:14px}.bubble.user[data-v-8392b2d7]{background:#1677ff;color:var(--text-primary);border-bottom-right-radius:4px}.bubble.assistant[data-v-8392b2d7]{background:var(--bg-card-hover);color:var(--text-primary);border-bottom-left-radius:4px}.bubble.streaming[data-v-8392b2d7]:after{content:"▋";animation:blink-8392b2d7 .7s step-start infinite;color:#1677ff}@keyframes blink-8392b2d7{50%{opacity:0}}.tool-msg[data-v-8392b2d7]{margin:8px 0}.question-card[data-v-8392b2d7]{background:var(--bg-card-hover);border:1px solid #1677ff40;border-radius:10px;padding:14px 16px;margin-top:8px}.question-text[data-v-8392b2d7]{color:#aaa;font-size:13px}[data-v-8392b2d7] .bubble.assistant pre{background:var(--bg-base);border-radius:6px;padding:12px;overflow-x:auto;font-size:12px}[data-v-8392b2d7] .bubble.assistant code:not(pre code){background:var(--bg-card-hover);padding:1px 5px;border-radius:3px;font-size:12px;color:#f0a500}[data-v-8392b2d7] .bubble.assistant p{margin:0 0 8px}[data-v-8392b2d7] .bubble.assistant p:last-child{margin:0}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.cowork-root[data-v-4c6b3e9c]{display:flex;height:calc(100vh - 104px);gap:16px}.template-panel[data-v-4c6b3e9c]{width:280px;flex-shrink:0;background:var(--bg-card);border-radius:8px;border:1px solid var(--border-color);display:flex;flex-direction:column;overflow:hidden}.template-header[data-v-4c6b3e9c]{padding:16px 16px 8px;display:flex;align-items:center;gap:8px;font-size:16px;font-weight:600;color:var(--text-primary)}.header-icon[data-v-4c6b3e9c]{font-size:18px;color:#1677ff}.template-hint[data-v-4c6b3e9c]{padding:0 16px 12px;font-size:12px;color:var(--text-muted);border-bottom:1px solid var(--border-color)}.template-list[data-v-4c6b3e9c]{flex:1;overflow-y:auto;padding:8px}.template-card[data-v-4c6b3e9c]{display:flex;align-items:flex-start;gap:10px;padding:10px 12px;border-radius:8px;cursor:pointer;transition:all .15s;margin-bottom:4px;border:1px solid transparent}.template-card[data-v-4c6b3e9c]:hover{background:var(--bg-card-hover)}.template-card.active[data-v-4c6b3e9c]{background:#1677ff14;border-color:#1677ff4d}.template-card.free .card-icon[data-v-4c6b3e9c]{color:#faad14}.card-icon[data-v-4c6b3e9c]{width:32px;height:32px;display:flex;align-items:center;justify-content:center;font-size:16px;color:#1677ff;background:#1677ff14;border-radius:8px;flex-shrink:0;margin-top:2px}.card-name[data-v-4c6b3e9c]{font-size:13px;font-weight:500;color:var(--text-primary)}.card-desc[data-v-4c6b3e9c]{font-size:11px;color:var(--text-muted);margin-top:2px;line-height:1.4}.file-zone[data-v-4c6b3e9c]{padding:12px;border-top:1px solid var(--border-color);text-align:center;transition:background .2s}.file-zone.dragging[data-v-4c6b3e9c]{background:#1677ff14}.drop-icon[data-v-4c6b3e9c]{font-size:20px;color:var(--text-muted)}.drop-text[data-v-4c6b3e9c]{font-size:11px;color:var(--text-muted);margin:4px 0 8px}.file-list[data-v-4c6b3e9c]{display:flex;flex-wrap:wrap;gap:4px;margin-bottom:8px;justify-content:center}.file-tag[data-v-4c6b3e9c]{max-width:140px;overflow:hidden;text-overflow:ellipsis;font-size:11px}.path-input[data-v-4c6b3e9c]{font-size:11px}.exec-panel[data-v-4c6b3e9c]{flex:1;background:var(--bg-card);border-radius:8px;border:1px solid var(--border-color);display:flex;flex-direction:column;overflow:hidden}.empty-state[data-v-4c6b3e9c],.ready-state[data-v-4c6b3e9c]{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:40px 24px}.empty-icon[data-v-4c6b3e9c]{font-size:48px;color:#1677ff40;margin-bottom:16px}.empty-title[data-v-4c6b3e9c]{font-size:16px;color:var(--text-primary);margin-bottom:6px}.empty-sub[data-v-4c6b3e9c]{font-size:13px;color:var(--text-muted);margin-bottom:24px}.ready-header[data-v-4c6b3e9c]{display:flex;align-items:center;gap:10px;margin-bottom:20px}.ready-icon[data-v-4c6b3e9c]{font-size:28px;color:#1677ff}.ready-name[data-v-4c6b3e9c]{font-size:18px;font-weight:600;color:var(--text-primary)}.ready-examples[data-v-4c6b3e9c]{text-align:center}.example-label[data-v-4c6b3e9c]{font-size:13px;color:var(--text-muted);margin-bottom:12px}.example-grid[data-v-4c6b3e9c]{display:flex;flex-wrap:wrap;gap:8px;justify-content:center;max-width:500px}.example-chip[data-v-4c6b3e9c]{padding:6px 14px;border-radius:16px;font-size:12px;color:var(--text-primary);background:var(--bg-card-hover);border:1px solid var(--border-color);cursor:pointer;transition:all .15s}.example-chip[data-v-4c6b3e9c]:hover{border-color:#1677ff;background:#1677ff14;color:#1677ff}.messages-area[data-v-4c6b3e9c]{flex:1;overflow-y:auto;padding:20px}.message-row[data-v-4c6b3e9c]{margin-bottom:16px}.user-msg[data-v-4c6b3e9c]{display:flex;justify-content:flex-end}.assistant-msg[data-v-4c6b3e9c]{display:flex;gap:10px;align-items:flex-start}.avatar[data-v-4c6b3e9c]{width:32px;height:32px;border-radius:50%;background:#1677ff;display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:600;color:var(--text-primary);flex-shrink:0}.bubble[data-v-4c6b3e9c]{padding:10px 14px;border-radius:12px;max-width:80%;line-height:1.6;font-size:14px}.bubble.user[data-v-4c6b3e9c]{background:#1677ff;color:var(--text-primary);border-bottom-right-radius:4px}.bubble.assistant[data-v-4c6b3e9c]{background:var(--bg-card-hover);color:var(--text-primary);border-bottom-left-radius:4px}.bubble.streaming[data-v-4c6b3e9c]:after{content:"○";animation:blink-4c6b3e9c .7s step-start infinite;color:#1677ff}@keyframes blink-4c6b3e9c{50%{opacity:0}}.tool-msg[data-v-4c6b3e9c]{margin:8px 0}.tool-collapse[data-v-4c6b3e9c]{border:1px solid var(--border-color);border-radius:6px;background:var(--bg-card)}.tool-input[data-v-4c6b3e9c]{margin:0;font-size:11px;color:#aaa;white-space:pre-wrap}.tool-result-box[data-v-4c6b3e9c]{margin-top:8px;padding-top:8px;border-top:1px solid var(--border-color)}.tool-result[data-v-4c6b3e9c]{margin:0;font-size:11px;color:#52c41a;white-space:pre-wrap}.question-card[data-v-4c6b3e9c]{background:var(--bg-card-hover);border:1px solid #1677ff40;border-radius:10px;padding:14px 16px;margin-top:8px}.question-text[data-v-4c6b3e9c]{color:#aaa;font-size:13px}.question-choices[data-v-4c6b3e9c]{display:flex;flex-wrap:wrap;gap:8px;margin-top:10px}.input-area[data-v-4c6b3e9c]{padding:12px 16px 16px;border-top:1px solid var(--border-color)}.input-context[data-v-4c6b3e9c]{display:flex;flex-wrap:wrap;gap:4px;margin-bottom:8px}.context-tag[data-v-4c6b3e9c]{font-size:11px}.context-tag.file[data-v-4c6b3e9c]{background:var(--bg-card-hover)}.input-row[data-v-4c6b3e9c]{display:flex;gap:8px;align-items:flex-end}.msg-input[data-v-4c6b3e9c]{flex:1;background:var(--bg-card-hover);border-color:var(--border-color);color:var(--text-primary);resize:none}.send-btn[data-v-4c6b3e9c]{height:40px}[data-v-4c6b3e9c] .bubble.assistant pre{background:var(--bg-base);border-radius:6px;padding:12px;overflow-x:auto;font-size:12px}[data-v-4c6b3e9c] .bubble.assistant code:not(pre code){background:var(--bg-card-hover);padding:1px 5px;border-radius:3px;font-size:12px;color:#f0a500}[data-v-4c6b3e9c] .bubble.assistant p{margin:0 0 8px}[data-v-4c6b3e9c] .bubble.assistant p:last-child{margin:0}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import{V as ee,f as m,c as D,w as te,o as se,a3 as o,a1 as n,k as g,u as a,F as y,a7 as k,a2 as E,A as V,a5 as d,a4 as F,W as w,a6 as H,Z as S,a9 as ae,X as x,Y as l,G as B,n as J}from"./vendor-CN0Iv_qZ.js";import{m as K,H as U}from"./markdown-BeVIhIzs.js";/* empty css */import{u as ne}from"./ws-CU7Gvoom.js";import{u as T}from"./chat-DWBA4-cl.js";import{_ as le}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{R as P,T as oe,v as W,o as ie,G as ce,r as re,j as ue,w as de,x as pe,m as me,y as ve,b as ge,u as he}from"./antd-BQNxIyr-.js";const Z=[{id:"doc-convert",name:"文档格式转换",icon:"FileTextOutlined",category:"document",description:"Word、Markdown、HTML、PDF 之间的格式互转",examples:["把 report.docx 转成 PDF","合并多个 Markdown 为一个文档","把 Excel 导出为 PDF"],acceptsFiles:!0},{id:"media-process",name:"音视频处理",icon:"PlayCircleOutlined",category:"media",description:"视频压缩、音频提取、格式转换、剪辑",examples:["提取 MP4 的音频","压缩视频到 50MB 以内","剪辑 10:30 到 25:00 的片段"],acceptsFiles:!0},{id:"data-analysis",name:"数据分析",icon:"BarChartOutlined",category:"data",description:"CSV/Excel 分析、统计、可视化图表",examples:["分析 sales.csv 的月度趋势","清洗数据去重修复格式","比较两个 CSV 的差异"],acceptsFiles:!0},{id:"web-research",name:"信息检索与调研",icon:"SearchOutlined",category:"research",description:"网页抓取、API 调用、多源信息汇总",examples:["调研 AI Agent 框架对比","查询实时汇率","抓取网页内容并翻译"],acceptsFiles:!1},{id:"image-process",name:"图片处理",icon:"PictureOutlined",category:"media",description:"批量压缩、格式转换、加水印、OCR",examples:["批量压缩到 500KB","加水印文字","识别图上的文字 (OCR)"],acceptsFiles:!0},{id:"code-helper",name:"代码辅助",icon:"CodeOutlined",category:"development",description:"生成脚本、调试代码、自动化任务",examples:["写一个批量重命名脚本","调试这段报错代码","生成 REST API 脚手架"],acceptsFiles:!0},{id:"system-admin",name:"系统运维",icon:"DesktopOutlined",category:"system",description:"磁盘分析、进程管理、日志分析",examples:["查看磁盘使用情况","找出最大的 10 个文件","列出占用端口的进程"],acceptsFiles:!1},{id:"file-organize",name:"文件整理",icon:"FolderOpenOutlined",category:"file",description:"批量重命名、分类整理、查找重复",examples:["按文件类型分类整理","批量重命名去空格","打包排除 node_modules"],acceptsFiles:!1},{id:"network-tools",name:"网络工具",icon:"GlobalOutlined",category:"network",description:"API 调试、网页抓取、网络诊断",examples:["测试 API 接口","抓取网页图片链接","ping 测试网络延迟"],acceptsFiles:!1},{id:"learning-assist",name:"学习辅助",icon:"ReadOutlined",category:"learning",description:"文档翻译、内容总结、论文分析",examples:["翻译 PDF 摘要","总结长文档要点","解释代码工作原理"],acceptsFiles:!0}],_e=ee("cowork",()=>{const b=m(null),t=m([]),v=m(!1),_=m([]),p=m([]),h=m(null),r=m(null);function I(e){b.value=e,C()}function C(){_.value=[],p.value=[],h.value=null,v.value=!1,r.value=null}function G(e){t.value.includes(e)||t.value.push(e)}function N(e){t.value=t.value.filter(c=>c!==e)}const A=`## 开源工具优先 + 自动安装规则
|
|
2
|
+
|
|
3
|
+
### 第一步: 检查 cli-anything 已注册技能
|
|
4
|
+
先执行 list_skills 查看是否已有 cli-anything-* 技能(如 cli-anything-ffmpeg、cli-anything-pandoc)。
|
|
5
|
+
如果有,优先用 run_skill 调用:
|
|
6
|
+
run_skill cli-anything-ffmpeg "用户的自然语言需求"
|
|
7
|
+
cli-anything 会自动将自然语言翻译为正确的 CLI 命令,成功率更高。
|
|
8
|
+
|
|
9
|
+
### 第二步: 工具不存在时自动安装
|
|
10
|
+
当所需工具未安装时,直接自动安装,不要询问用户:
|
|
11
|
+
1. Python 包 (pandas/Pillow/pytesseract/...): run_code 的 auto-install 自动处理
|
|
12
|
+
2. npm 包: run_shell: npm install -g <package>
|
|
13
|
+
3. 系统级开源工具:
|
|
14
|
+
- Windows: winget install <winget-id> --accept-package-agreements --accept-source-agreements
|
|
15
|
+
- 备选: choco install <pkg> -y
|
|
16
|
+
- macOS: brew install <pkg>
|
|
17
|
+
4. 安装后验证: <tool> --version
|
|
18
|
+
5. 只有在安装失败且无替代方案时才告知用户
|
|
19
|
+
|
|
20
|
+
### 第三步: 尝试注册为 cli-anything 技能
|
|
21
|
+
安装完底层工具后,尝试为其创建 cli-anything 包装器:
|
|
22
|
+
run_shell: chainlesschain cli-anything register <tool> --force --json
|
|
23
|
+
如果成功,后续可用 run_skill cli-anything-<tool> 自然语言调用。
|
|
24
|
+
如果失败(如 cli-anything 未装),直接 run_shell 调用原始工具也可以。
|
|
25
|
+
|
|
26
|
+
### 工具优先级总结
|
|
27
|
+
cli-anything 已注册技能 > 直接调用开源工具 CLI > Python/Node 开源库 > 告知用户
|
|
28
|
+
|
|
29
|
+
### 常用开源工具速查
|
|
30
|
+
| 工具 | winget ID | 用途 |
|
|
31
|
+
| ffmpeg | Gyan.FFmpeg | 音视频处理 |
|
|
32
|
+
| pandoc | JohnMacFarlane.Pandoc | 文档格式转换 |
|
|
33
|
+
| LibreOffice | TheDocumentFoundation.LibreOffice | Office 文档 |
|
|
34
|
+
| Tesseract | UB-Mannheim.TesseractOCR | OCR 文字识别 |
|
|
35
|
+
| ImageMagick | ImageMagick.ImageMagick | 图片处理 |
|
|
36
|
+
| Ghostscript | ArtifexSoftware.GhostScript | PDF 处理 |
|
|
37
|
+
| 7-Zip | 7zip.7zip | 压缩解压 |
|
|
38
|
+
| GraphViz | Graphviz.Graphviz | 图表生成 |
|
|
39
|
+
| yt-dlp | yt-dlp.yt-dlp | 视频下载 |
|
|
40
|
+
| jq | jqlang.jq | JSON 处理 |
|
|
41
|
+
`;async function L(e){const c=T();v.value=!0;const u=b.value;let f="";f+=A+`
|
|
42
|
+
`,u&&(f+=`[任务类型: ${u.name}]
|
|
43
|
+
|
|
44
|
+
`),f+=e,t.value.length&&(f+=`
|
|
45
|
+
|
|
46
|
+
[用户提供的文件: ${t.value.join(", ")}]`),p.value.push({role:"user",content:e,timestamp:Date.now()});const z=await c.createSession("agent");r.value=z,await c.sendMessage(z,f)}async function R(e){const c=ne();v.value=!0,p.value.push({role:"user",content:e,timestamp:Date.now()});try{await c.waitConnected(8e3);const u=await c.sendRaw({type:"cowork-task",templateId:b.value?.id||null,userMessage:e,files:t.value},3e5);p.value.push({role:"assistant",content:u.summary||"(No output)",timestamp:Date.now(),toolsUsed:u.toolsUsed||[],iterationCount:u.iterationCount||0}),h.value=u}catch(u){p.value.push({role:"assistant",content:`Error: ${u.message}`,timestamp:Date.now()})}finally{v.value=!1}}const Q=D(()=>r.value?T().getMessages(r.value):[]),q=D(()=>{if(!r.value)return null;const c=T().streaming[r.value];return c?.active?c.content:null}),M=D(()=>r.value&&T().pendingQuestion[r.value]||null);function $(e){if(!r.value)return;T().answerQuestion(r.value,e)}async function i(e){if(!r.value)return;const c=T();p.value.push({role:"user",content:e,timestamp:Date.now()});let u=e;t.value.length&&(u+=`
|
|
47
|
+
|
|
48
|
+
[用户提供的文件: ${t.value.join(", ")}]`),await c.sendMessage(r.value,u)}return{selectedTemplate:b,files:t,isRunning:v,steps:_,messages:p,result:h,agentSessionId:r,currentAgentMessages:Q,currentStreaming:q,currentQuestion:M,selectTemplate:I,reset:C,addFile:G,removeFile:N,execute:L,executeDirectWs:R,sendFollowUp:i,answerQuestion:$,TASK_TEMPLATES:Z}}),fe={class:"cowork-root"},ye={class:"template-panel"},ke={class:"template-header"},we={class:"template-list"},Se=["onClick"],xe={class:"card-icon"},Te={class:"card-body"},Ce={class:"card-name"},Oe={class:"card-desc"},Fe={class:"card-icon"},be={class:"drop-text"},Me={key:0,class:"file-list"},Pe={class:"exec-panel"},De={key:0,class:"empty-state"},Ie={class:"empty-icon"},Ae={class:"example-grid"},Le=["onClick"],Re={key:1,class:"ready-state"},$e={class:"ready-header"},ze={class:"ready-name"},Ee={class:"ready-examples"},Be=["onClick"],Ge={key:0,class:"tool-msg"},Ne={class:"tool-input"},Qe={key:0,class:"tool-result-box"},qe={class:"tool-result"},Ve={key:1,class:"user-msg"},He={class:"bubble user"},Ue={key:2,class:"assistant-msg"},je=["innerHTML"],Je={key:0,class:"assistant-msg"},Ke=["innerHTML"],We={key:1,class:"question-card"},Ze={class:"question-text"},Xe={key:0,class:"question-choices"},Ye={class:"input-area"},et={key:0,class:"input-context"},tt={class:"input-row"},st={__name:"Cowork",setup(b){K.setOptions({highlight:(i,e)=>e&&U.getLanguage(e)?U.highlight(i,{language:e}).value:U.highlightAuto(i).value,breaks:!0});const t=_e(),v=T(),_=m(""),p=m(null),h=m(!1),r=m(""),I=m(!1),C={FileTextOutlined:ge,PlayCircleOutlined:ve,BarChartOutlined:me,SearchOutlined:pe,PictureOutlined:de,CodeOutlined:ue,DesktopOutlined:re,FolderOpenOutlined:W,GlobalOutlined:ce,ReadOutlined:ie},G=["把 report.docx 转成 PDF","压缩视频到 50MB","分析 CSV 生成图表","查询今天的汇率","批量压缩图片","写一个自动化脚本"],N=D(()=>v.isLoading?"等待响应中...":t.selectedTemplate?t.selectedTemplate.examples?.[0]||"描述你的需求...":"描述你想完成的任务,Agent 会帮你搞定"),A=D(()=>t.currentAgentMessages);function L(i){try{return K(i||"")}catch{return i||""}}function R(i){return i.split(/[\\/]/).pop()||i}function Q(i){h.value=!1;const e=i.dataTransfer?.files;if(e)for(const c of e)t.addFile(c.path||c.name)}function q(){const i=r.value.trim();i&&(t.addFile(i),r.value="")}async function M(){const i=_.value.trim();!i||v.isLoading||(_.value="",t.agentSessionId?await t.sendFollowUp(i):await t.execute(i))}function $(i){_.value=i,J(()=>M())}return te([A,()=>t.currentStreaming],()=>{J(()=>{p.value&&(p.value.scrollTop=p.value.scrollHeight)})},{deep:!0}),se(()=>{v.loadSessions()}),(i,e)=>{const c=x("a-tag"),u=x("a-input"),f=x("a-collapse-panel"),z=x("a-collapse"),j=x("a-button"),X=x("a-input-search"),Y=x("a-textarea");return l(),o("div",fe,[n("div",ye,[n("div",ke,[g(a(P),{class:"header-icon"}),e[5]||(e[5]=n("span",{class:"header-title"},"日常协作",-1))]),e[7]||(e[7]=n("div",{class:"template-hint"},"选择任务类型,或直接输入需求",-1)),n("div",we,[(l(!0),o(y,null,k(a(Z),s=>(l(),o("div",{key:s.id,class:E(["template-card",{active:a(t).selectedTemplate?.id===s.id}]),onClick:O=>a(t).selectTemplate(s)},[n("div",xe,[(l(),w(H(C[s.icon]||a(P))))]),n("div",Te,[n("div",Ce,d(s.name),1),n("div",Oe,d(s.description),1)])],10,Se))),128)),n("div",{class:E(["template-card free",{active:a(t).selectedTemplate===null&&I.value}]),onClick:e[0]||(e[0]=s=>{a(t).selectTemplate(null),I.value=!0})},[n("div",Fe,[g(a(oe))]),e[6]||(e[6]=n("div",{class:"card-body"},[n("div",{class:"card-name"},"自由提问"),n("div",{class:"card-desc"},"任意任务,Agent 自主完成")],-1))],2)]),a(t).selectedTemplate?.acceptsFiles!==!1?(l(),o("div",{key:0,class:E(["file-zone",{dragging:h.value}]),onDragover:e[2]||(e[2]=V(s=>h.value=!0,["prevent"])),onDragleave:e[3]||(e[3]=s=>h.value=!1),onDrop:V(Q,["prevent"])},[g(a(W),{class:"drop-icon"}),n("div",be,d(h.value?"松开以添加文件":"拖拽文件到此处"),1),a(t).files.length?(l(),o("div",Me,[(l(!0),o(y,null,k(a(t).files,s=>(l(),w(c,{key:s,closable:"",onClose:O=>a(t).removeFile(s),class:"file-tag"},{default:S(()=>[B(d(R(s)),1)]),_:2},1032,["onClose"]))),128))])):F("",!0),g(u,{value:r.value,"onUpdate:value":e[1]||(e[1]=s=>r.value=s),placeholder:"或输入文件路径,按 Enter 添加",size:"small",class:"path-input",onPressEnter:q},null,8,["value"])],34)):F("",!0)]),n("div",Pe,[!a(t).agentSessionId&&!a(t).selectedTemplate?(l(),o("div",De,[n("div",Ie,[g(a(P))]),e[8]||(e[8]=n("div",{class:"empty-title"},"选择一个任务模板开始",-1)),e[9]||(e[9]=n("div",{class:"empty-sub"},"或选择「自由提问」处理任何问题",-1)),n("div",Ae,[(l(),o(y,null,k(G,s=>n("div",{key:s,class:"example-chip",onClick:O=>$(s)},d(s),9,Le)),64))])])):a(t).selectedTemplate&&!a(t).agentSessionId?(l(),o("div",Re,[n("div",$e,[(l(),w(H(C[a(t).selectedTemplate.icon]||a(P)),{class:"ready-icon"})),n("span",ze,d(a(t).selectedTemplate.name),1)]),n("div",Ee,[e[10]||(e[10]=n("div",{class:"example-label"},"试试这些:",-1)),(l(!0),o(y,null,k(a(t).selectedTemplate.examples,s=>(l(),o("div",{key:s,class:"example-chip",onClick:O=>$(s)},d(s),9,Be))),128))])])):(l(),o("div",{key:2,class:"messages-area",ref_key:"messagesEl",ref:p},[(l(!0),o(y,null,k(A.value,(s,O)=>(l(),o("div",{key:O,class:E(["message-row",s.role])},[s.role==="tool"?(l(),o("div",Ge,[g(z,{ghost:"",size:"small"},{default:S(()=>[g(f,{header:`🔧 ${s.tool} ${s.status==="running"?"(执行中...)":"✓"}`,class:"tool-collapse"},{default:S(()=>[n("pre",Ne,d(JSON.stringify(s.input,null,2)),1),s.result?(l(),o("div",Qe,[n("pre",qe,d(typeof s.result=="string"?s.result:JSON.stringify(s.result,null,2)),1)])):F("",!0)]),_:2},1032,["header"])]),_:2},1024)])):s.role==="user"?(l(),o("div",Ve,[n("div",He,d(s.content),1)])):(l(),o("div",Ue,[e[11]||(e[11]=n("div",{class:"avatar"},"AI",-1)),n("div",{class:"bubble assistant",innerHTML:L(s.content)},null,8,je)]))],2))),128)),a(t).currentStreaming?(l(),o("div",Je,[e[12]||(e[12]=n("div",{class:"avatar"},"AI",-1)),n("div",{class:"bubble assistant streaming",innerHTML:L(a(t).currentStreaming)},null,8,Ke)])):F("",!0),a(t).currentQuestion?(l(),o("div",We,[n("div",Ze,d(a(t).currentQuestion.question),1),a(t).currentQuestion.choices?.length?(l(),o("div",Xe,[(l(!0),o(y,null,k(a(t).currentQuestion.choices,s=>(l(),w(j,{key:s,size:"small",onClick:O=>a(t).answerQuestion(s)},{default:S(()=>[B(d(s),1)]),_:2},1032,["onClick"]))),128))])):(l(),w(X,{key:1,placeholder:"输入回答...","enter-button":"发送",style:{"margin-top":"10px"},onSearch:a(t).answerQuestion},null,8,["onSearch"]))])):F("",!0)],512)),n("div",Ye,[a(t).selectedTemplate?(l(),o("div",et,[g(c,{color:"blue",class:"context-tag"},{default:S(()=>[(l(),w(H(C[a(t).selectedTemplate.icon]||a(P)))),B(" "+d(a(t).selectedTemplate.name),1)]),_:1}),(l(!0),o(y,null,k(a(t).files,s=>(l(),w(c,{key:s,class:"context-tag file"},{default:S(()=>[B(d(R(s)),1)]),_:2},1024))),128))])):F("",!0),n("div",tt,[g(Y,{value:_.value,"onUpdate:value":e[4]||(e[4]=s=>_.value=s),placeholder:N.value,"auto-size":{minRows:1,maxRows:6},disabled:a(v).isLoading,class:"msg-input",onKeydown:ae(V(M,["exact","prevent"]),["enter"])},null,8,["value","placeholder","disabled","onKeydown"]),g(j,{type:"primary",loading:a(v).isLoading,class:"send-btn",onClick:M},{icon:S(()=>[g(a(he))]),_:1},8,["loading"])])])])])}}},ut=le(st,[["__scopeId","data-v-4c6b3e9c"]]);export{ut as default};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{u as Q}from"./ws-CU7Gvoom.js";import{
|
|
2
|
-
`);for(const k of c){const u=k.trim();if(!u||u.startsWith("─"))continue;const i=u.match(/^([^\t|]+?)[\t|]+([*\d/,\-?LW#\s]+)[\t|]+/);i&&e.push({key:e.length,name:i[1].trim(),cron:i[2].trim(),enabled:!u.toLowerCase().includes("pause")&&!u.toLowerCase().includes("disabled"),description:"",running:!1})}return e}function P(l){o.value.cron=l.cron,_.value=!0}async function j(){if(!o.value.name||!o.value.cron){d.warning("请填写任务名称和 Cron 表达式");return}$.value=!0;try{const l=`skill run cron-scheduler "add task: ${o.value.name}, schedule: ${o.value.cron}, payload: ${o.value.payload||"ping"}"`,{output:e}=await y.execute(l,2e4);d.success("任务已创建"),_.value=!1,o.value={name:"",cron:"",payload:"",description:"",enabled:!0},await T()}catch(l){d.error("创建失败: "+l.message)}finally{$.value=!1}}async function D(l){l.running=!0;try{const{output:e}=await y.execute(`skill run cron-scheduler "run task: ${l.name}"`,3e4);d.success(`任务 ${l.name} 已触发`)}catch(e){d.error("触发失败: "+e.message)}finally{l.running=!1}}async function E(l){const e=l.enabled?"pause":"enable";try{await y.execute(`skill run cron-scheduler "${e} task: ${l.name}"`,1e4),l.enabled=!l.enabled,d.success(`任务已${l.enabled?"启用":"暂停"}`)}catch{d.error("操作失败")}}async function G(l){try{await y.execute(`skill run cron-scheduler "delete task: ${l.name}"`,1e4),v.value=v.value.filter(e=>e.key!==l.key),d.success("任务已删除")}catch{d.error("删除失败")}}return le(T),(l,e)=>{const c=s("a-button"),k=s("a-space"),u=s("a-statistic"),i=s("a-card"),h=s("a-col"),
|
|
1
|
+
import{u as Q}from"./ws-CU7Gvoom.js";import{J as ee,p as ae,h as te,H as d}from"./antd-BQNxIyr-.js";import{o as le,a3 as b,a1 as m,k as a,Z as t,X as s,f as x,Y as p,G as f,u as B,F as V,a7 as ne,a5 as w,W as L,a4 as z,c as W}from"./vendor-CN0Iv_qZ.js";const oe={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},se={key:0,style:{"text-align":"center",padding:"40px"}},re={style:{color:"#e0e0e0","font-weight":"500"}},ue={key:0,style:{color:"var(--text-secondary)","font-size":"11px"}},ie={key:1,style:{background:"var(--bg-card-hover)",padding:"2px 6px","border-radius":"3px",color:"#91caff","font-size":"11px"}},ce={style:{padding:"40px",color:"var(--text-muted)","text-align":"center"}},fe={__name:"Cron",setup(de){const y=Q(),C=x(!1),$=x(!1),_=x(!1),v=x([]),q=W(()=>v.value.filter(l=>l.enabled).length),S=W(()=>v.value.filter(l=>!l.enabled).length),N=[{label:"每5分钟",cron:"*/5 * * * *"},{label:"每15分钟",cron:"*/15 * * * *"},{label:"每小时",cron:"0 * * * *"},{label:"每天9点",cron:"0 9 * * *"},{label:"每天18点",cron:"0 18 * * *"},{label:"每周一9点",cron:"0 9 * * 1"},{label:"每月1号",cron:"0 9 1 * *"}],o=x({name:"",cron:"",payload:"",description:"",enabled:!0}),A=[{title:"任务名称",key:"name",width:"25%"},{title:"Cron",key:"cron",width:"20%"},{title:"状态",key:"status",width:"15%"},{title:"操作",key:"actions",width:"20%"}];async function T(){C.value=!0;try{const{output:l}=await y.execute('skill run cron-scheduler "list all scheduled tasks"',2e4);v.value=F(l)}catch{v.value=[]}finally{C.value=!1}}function F(l){const e=[],c=l.split(`
|
|
2
|
+
`);for(const k of c){const u=k.trim();if(!u||u.startsWith("─"))continue;const i=u.match(/^([^\t|]+?)[\t|]+([*\d/,\-?LW#\s]+)[\t|]+/);i&&e.push({key:e.length,name:i[1].trim(),cron:i[2].trim(),enabled:!u.toLowerCase().includes("pause")&&!u.toLowerCase().includes("disabled"),description:"",running:!1})}return e}function P(l){o.value.cron=l.cron,_.value=!0}async function j(){if(!o.value.name||!o.value.cron){d.warning("请填写任务名称和 Cron 表达式");return}$.value=!0;try{const l=`skill run cron-scheduler "add task: ${o.value.name}, schedule: ${o.value.cron}, payload: ${o.value.payload||"ping"}"`,{output:e}=await y.execute(l,2e4);d.success("任务已创建"),_.value=!1,o.value={name:"",cron:"",payload:"",description:"",enabled:!0},await T()}catch(l){d.error("创建失败: "+l.message)}finally{$.value=!1}}async function D(l){l.running=!0;try{const{output:e}=await y.execute(`skill run cron-scheduler "run task: ${l.name}"`,3e4);d.success(`任务 ${l.name} 已触发`)}catch(e){d.error("触发失败: "+e.message)}finally{l.running=!1}}async function E(l){const e=l.enabled?"pause":"enable";try{await y.execute(`skill run cron-scheduler "${e} task: ${l.name}"`,1e4),l.enabled=!l.enabled,d.success(`任务已${l.enabled?"启用":"暂停"}`)}catch{d.error("操作失败")}}async function G(l){try{await y.execute(`skill run cron-scheduler "delete task: ${l.name}"`,1e4),v.value=v.value.filter(e=>e.key!==l.key),d.success("任务已删除")}catch{d.error("删除失败")}}return le(T),(l,e)=>{const c=s("a-button"),k=s("a-space"),u=s("a-statistic"),i=s("a-card"),h=s("a-col"),H=s("a-row"),I=s("a-spin"),J=s("a-badge"),M=s("a-popconfirm"),R=s("a-table"),U=s("a-input"),g=s("a-form-item"),X=s("a-textarea"),Y=s("a-switch"),Z=s("a-form"),K=s("a-modal");return p(),b("div",null,[m("div",oe,[e[9]||(e[9]=m("div",null,[m("h2",{class:"page-title"},"定时任务"),m("p",{class:"page-sub"},"定时任务调度管理")],-1)),a(k,null,{default:t(()=>[a(c,{onClick:e[0]||(e[0]=n=>_.value=!0),type:"primary"},{icon:t(()=>[a(B(ee))]),default:t(()=>[e[7]||(e[7]=f(" 新建任务 ",-1))]),_:1}),a(c,{ghost:"",loading:C.value,onClick:T},{icon:t(()=>[a(B(ae))]),default:t(()=>[e[8]||(e[8]=f(" 刷新 ",-1))]),_:1},8,["loading"])]),_:1})]),a(H,{gutter:[16,16],style:{"margin-bottom":"20px"}},{default:t(()=>[a(h,{xs:12,sm:6},{default:t(()=>[a(i,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"},size:"small"},{default:t(()=>[a(u,{title:"全部任务",value:v.value.length,"value-style":"color: #ccc; font-size: 18px;"},null,8,["value"])]),_:1})]),_:1}),a(h,{xs:12,sm:6},{default:t(()=>[a(i,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"},size:"small"},{default:t(()=>[a(u,{title:"启用中",value:q.value,"value-style":"color: #52c41a; font-size: 18px;"},null,8,["value"])]),_:1})]),_:1}),a(h,{xs:12,sm:6},{default:t(()=>[a(i,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"},size:"small"},{default:t(()=>[a(u,{title:"已暂停",value:S.value,"value-style":"color: #faad14; font-size: 18px;"},null,8,["value"])]),_:1})]),_:1}),a(h,{xs:12,sm:6},{default:t(()=>[a(i,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"},size:"small"},{default:t(()=>[a(u,{title:"预设方案",value:N.length,"value-style":"color: #1677ff; font-size: 18px;"},null,8,["value"])]),_:1})]),_:1})]),_:1}),a(i,{title:"快速添加预设",style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"16px"},size:"small"},{default:t(()=>[a(k,{wrap:""},{default:t(()=>[(p(),b(V,null,ne(N,n=>a(c,{key:n.label,size:"small",style:{background:"var(--bg-card-hover)","border-color":"var(--border-color)","font-size":"12px"},onClick:r=>P(n)},{default:t(()=>[f(w(n.label),1)]),_:2},1032,["onClick"])),64))]),_:1})]),_:1}),a(i,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:t(()=>[C.value?(p(),b("div",se,[a(I,{size:"large"})])):(p(),L(R,{key:1,columns:A,"data-source":v.value,pagination:{pageSize:15},size:"small"},{bodyCell:t(({column:n,record:r})=>[n.key==="name"?(p(),b(V,{key:0},[m("div",re,w(r.name),1),r.description?(p(),b("div",ue,w(r.description),1)):z("",!0)],64)):z("",!0),n.key==="cron"?(p(),b("code",ie,w(r.cron),1)):z("",!0),n.key==="status"?(p(),L(J,{key:2,status:r.enabled?"success":"warning",text:r.enabled?"运行中":"已暂停"},null,8,["status","text"])):z("",!0),n.key==="actions"?(p(),L(k,{key:3,size:"small"},{default:t(()=>[a(c,{size:"small",type:"link",loading:r.running,onClick:O=>D(r)},{default:t(()=>[...e[10]||(e[10]=[f("运行",-1)])]),_:1},8,["loading","onClick"]),a(c,{size:"small",type:"link",onClick:O=>E(r)},{default:t(()=>[f(w(r.enabled?"暂停":"启用"),1)]),_:2},1032,["onClick"]),a(M,{title:"确认删除此任务?",onConfirm:O=>G(r)},{default:t(()=>[a(c,{size:"small",type:"link",danger:""},{default:t(()=>[...e[11]||(e[11]=[f("删除",-1)])]),_:1})]),_:1},8,["onConfirm"])]),_:2},1024)):z("",!0)]),emptyText:t(()=>[m("div",ce,[a(B(te),{style:{"font-size":"36px","margin-bottom":"12px",display:"block"}}),e[12]||(e[12]=f(" 暂无定时任务 ",-1))])]),_:1},8,["data-source"]))]),_:1}),a(K,{open:_.value,"onUpdate:open":e[6]||(e[6]=n=>_.value=n),title:"新建定时任务","confirm-loading":$.value,onOk:j,width:"520px"},{default:t(()=>[a(Z,{"label-col":{span:5},"wrapper-col":{span:19},style:{"margin-top":"16px"}},{default:t(()=>[a(g,{label:"任务名称",required:""},{default:t(()=>[a(U,{value:o.value.name,"onUpdate:value":e[1]||(e[1]=n=>o.value.name=n),placeholder:"任务名称"},null,8,["value"])]),_:1}),a(g,{label:"Cron 表达式",required:""},{default:t(()=>[a(U,{value:o.value.cron,"onUpdate:value":e[2]||(e[2]=n=>o.value.cron=n),placeholder:"如: 0 9 * * * (每天9点)"},null,8,["value"]),e[13]||(e[13]=m("div",{style:{color:"var(--text-secondary)","font-size":"11px","margin-top":"4px"}},"格式: 分 时 日 月 周",-1))]),_:1}),a(g,{label:"任务内容",required:""},{default:t(()=>[a(X,{value:o.value.payload,"onUpdate:value":e[3]||(e[3]=n=>o.value.payload=n),rows:3,placeholder:"要执行的 AI 任务描述..."},null,8,["value"])]),_:1}),a(g,{label:"描述"},{default:t(()=>[a(U,{value:o.value.description,"onUpdate:value":e[4]||(e[4]=n=>o.value.description=n),placeholder:"可选描述"},null,8,["value"])]),_:1}),a(g,{label:"立即启用"},{default:t(()=>[a(Y,{checked:o.value.enabled,"onUpdate:checked":e[5]||(e[5]=n=>o.value.enabled=n)},null,8,["checked"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"])])}}};export{fe as default};
|
|
@@ -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-CU7Gvoom.js";import{u as ne}from"./chat-DWBA4-cl.js";import{_ as re}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{
|
|
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-CU7Gvoom.js";import{u as ne}from"./chat-DWBA4-cl.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-BQNxIyr-.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(""),b=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){b.value={...b.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 _=n.match(/LLM:\s+(\S+)/i);_&&(d.value.activeLlm=_[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 _=c.value.output;F.value=_.split(`
|
|
2
2
|
`).slice(0,20).join(`
|
|
3
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};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{u as ee}from"./ws-CU7Gvoom.js";import{_ as te}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{
|
|
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-CU7Gvoom.js";import{_ as te}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{p as ae,V as oe,f as P,X as T,Y as le,H as v}from"./antd-BQNxIyr-.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 U,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(""),V=l(""),C=l(0),h=l(!1),x=l(""),O=l(!1),B=l(!1),E=l(""),z=l("markdown"),A=l(!1),M=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 S=f.trim();/^(M|A|D|R|C|U|\?\?|MM|AM|AD)\s/.test(S)&&r++,/^(modified|new file|deleted|renamed):/i.test(S)&&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);V.value=e.branch,C.value=e.changed}catch(o){v.error("获取 Git 状态失败: "+o.message),w.value=""}finally{L.value=!1}}function Y(){B.value=!0}async function j(){B.value=!1,h.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{h.value=!1}}async function H(){const o=E.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 Z(){const o=M.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"),S=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"),J=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(J,{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:h.value,onClick:Y},{icon:t(()=>[a(g(oe))]),default:t(()=>[e[9]||(e[9]=i(" 自动提交 ",-1))]),_:1},8,["loading"])]),_:1}),V.value||C.value>0?(p(),W("div",se,[a(r,null,{default:t(()=>[V.value?(p(),m(f,{key:0,color:"blue"},{default:t(()=>[a(g(P)),i(" "+U(V.value),1)]),_:1})):b("",!0),C.value>0?(p(),m(f,{key:1,color:"orange"},{default:t(()=>[i(U(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,U(w.value),1)]),_:1})):L.value?b("",!0):(p(),m(S,{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:E.value,"onUpdate:value":e[1]||(e[1]=d=>E.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:!E.value.trim(),onClick:H},{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:M.value,"onUpdate:value":e[3]||(e[3]=d=>M.value=d),placeholder:"输出目录,如 ./site","allow-clear":""},null,8,["value"])]),a(n,{type:"primary",loading:$.value,disabled:!M.value.trim(),onClick:Z},{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,U(k.value),1)]),_:1})):b("",!0)]),_:1})]),_:1},8,["activeKey"]),a(Q,{open:B.value,"onUpdate:open":e[6]||(e[6]=d=>B.value=d),title:"确认自动提交","ok-text":"确认提交","cancel-text":"取消","confirm-loading":h.value,onOk:j},{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-CU7Gvoom.js";import{_ as q}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{
|
|
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(),
|
|
1
|
+
import{u as U}from"./ws-CU7Gvoom.js";import{_ as q}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{p as z}from"./antd-BQNxIyr-.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
|
+
`)),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-CU7Gvoom.js";import{_ as j}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{
|
|
1
|
+
import{u as R}from"./ws-CU7Gvoom.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-BQNxIyr-.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
|
-
`);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,[
|
|
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};
|