chainlesschain 0.157.0 → 0.157.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/chainlesschain.js +0 -0
- package/package.json +2 -2
- package/src/assets/web-panel/.build-hash +1 -1
- package/src/assets/web-panel/assets/{ActionButton-CCj9oE5_.js → ActionButton-CNyKzbBw.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-RMqXlyHE.js → Analytics-BZUBYH80.js} +2 -2
- package/src/assets/web-panel/assets/AppLayout-Cvl5XUEL.js +1 -0
- package/src/assets/web-panel/assets/AppLayout-DbK0-so_.css +1 -0
- package/src/assets/web-panel/assets/{Backup-bes7wE_k.js → Backup-CyZlJ_l8.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-BKgAovqI.js → BaseInput-Ck9Kjams.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-Duckao6i.js → Chat-DyoI0cWX.js} +2 -2
- package/src/assets/web-panel/assets/{Checkbox-BaBBUZnH.js → Checkbox-yEvLzLd8.js} +1 -1
- package/src/assets/web-panel/assets/{Col-B6iQKzFs.js → Col-CQ11Dnmt.js} +1 -1
- package/src/assets/web-panel/assets/Community-Ccn1BYio.js +3 -0
- package/src/assets/web-panel/assets/Community-DqDfLQui.css +1 -0
- package/src/assets/web-panel/assets/{Compact-Fwt0CbI5.js → Compact-Bmf5Cuzh.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-DNy50_Cp.js → Cowork-CbAGA5A5.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-CBREJypB.js → Cron-CwbLFJdF.js} +2 -2
- package/src/assets/web-panel/assets/DID-BDvsVa08.css +1 -0
- package/src/assets/web-panel/assets/DID-Bz-Q7RAn.js +2 -0
- package/src/assets/web-panel/assets/Dashboard-DxyAGNxR.js +3 -0
- package/src/assets/web-panel/assets/{Dropdown-B3vdFzOi.js → Dropdown-B3gLO6AH.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-RYn2zMn5.js → FormItemContext-DR8WMkWL.js} +1 -1
- package/src/assets/web-panel/assets/{Git-7TolKe3c.js → Git-Bo6SJajL.js} +2 -2
- package/src/assets/web-panel/assets/{KnowledgeGraph-4b9v3wYV.js → KnowledgeGraph-Dr7X3CJz.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-BZgM3Q4b.js → Logs-BNA4XGT-.js} +2 -2
- package/src/assets/web-panel/assets/{McpTools-5Wrif1R_.js → McpTools-D10LT5nQ.js} +2 -2
- package/src/assets/web-panel/assets/{Memory-D8YRnt51.js → Memory-BpGVVsGn.js} +2 -2
- package/src/assets/web-panel/assets/{Notes-CWTUG8hk.js → Notes-DRwg9537.js} +2 -2
- package/src/assets/web-panel/assets/{Organization-DvJzrIES.js → Organization-DcyIwloj.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-tpvXbZkh.js → Overflow-MuWktKcP.js} +1 -1
- package/src/assets/web-panel/assets/{OverrideContext-9ePmgwvW.js → OverrideContext-D01nzvZl.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-C-AoKbTs.js → P2P-Ci1QXDFH.js} +2 -2
- package/src/assets/web-panel/assets/{Permissions-cIclKlQB.js → Permissions-Rdt6O8t8.js} +3 -3
- package/src/assets/web-panel/assets/Portal-CARXcQZJ.js +1 -0
- package/src/assets/web-panel/assets/ProjectSettings-DhYrRsiw.js +2 -0
- package/src/assets/web-panel/assets/ProjectSettings-pLSae-wy.css +1 -0
- package/src/assets/web-panel/assets/{Projects-CDKdsdit.js → Projects-BHSVUn-P.js} +2 -2
- package/src/assets/web-panel/assets/{Providers-C33u4Mka.js → Providers-D7Yf3Eh5.js} +2 -2
- package/src/assets/web-panel/assets/{Row-DVscVTtp.js → Row-C4W6kn-O.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-CGC4w7VD.js → RssFeed-BRRNqE6z.js} +3 -3
- package/src/assets/web-panel/assets/{Security-ymR0We-P.js → Security-yVk1t4NG.js} +3 -3
- package/src/assets/web-panel/assets/{Services-Gydt4uVC.js → Services-DqtefZh8.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-CfLdvEpu.js → Skeleton-B8DP7HAQ.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-C_SrPIFZ.js → Skills-Dm_T9KJy.js} +1 -1
- package/src/assets/web-panel/assets/Tasks-C66psb8Z.js +1 -0
- package/src/assets/web-panel/assets/{Templates-Bj1wDexb.js → Templates-BEnkhJFe.js} +1 -1
- package/src/assets/web-panel/assets/Trigger-BHYwMCjE.js +1 -0
- package/src/assets/web-panel/assets/{VideoEditing-CQOwjQFu.js → VideoEditing-DucGsoXn.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-0kSZ-ENs.js → Wallet-BEnL0gxM.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-CrZlAr6l.js → WebAuthn-BZ3njvle.js} +5 -5
- package/src/assets/web-panel/assets/{WorkflowEditor-DbdF8700.js → WorkflowEditor-DNG6cJRJ.js} +1 -1
- package/src/assets/web-panel/assets/{chat-BNXQJRrX.js → chat-DK35BNpC.js} +1 -1
- package/src/assets/web-panel/assets/{collapseMotion-CSS8MlIE.js → collapseMotion-D_K_bBA2.js} +1 -1
- package/src/assets/web-panel/assets/{colors-BgoKrIXh.js → colors-CruxFUlV.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-COAuztwB.js → compact-item-DGL0Q_YX.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-BTceykzK.js → createContext-Z0XEM4Cq.js} +1 -1
- package/src/assets/web-panel/assets/{hasIn-BNooGgXx.js → hasIn-Km8uZit7.js} +1 -1
- package/src/assets/web-panel/assets/icons-C40taSZA.js +57 -0
- package/src/assets/web-panel/assets/{index-C7uW3zj4.js → index--i0DkVXq.js} +3 -3
- package/src/assets/web-panel/assets/{index-Cf1n_3VC.js → index-3KWzfh6j.js} +1 -1
- package/src/assets/web-panel/assets/index-5Jby7AnF.js +1 -0
- package/src/assets/web-panel/assets/index-93dWGD7J.js +1 -0
- package/src/assets/web-panel/assets/{index-vHj3UTBK.js → index-B0iFuZHn.js} +1 -1
- package/src/assets/web-panel/assets/{index-DC-nDpH_.js → index-BDw_V2Ts.js} +2 -2
- package/src/assets/web-panel/assets/index-BGsbbo5Y.js +1 -0
- package/src/assets/web-panel/assets/{index-BLzkplpf.js → index-BO1I7Jar.js} +1 -1
- package/src/assets/web-panel/assets/{index-KEQgDCwj.js → index-BhFkrt3P.js} +3 -3
- package/src/assets/web-panel/assets/{index-CpFrvhnj.js → index-BqOFRJpD.js} +1 -1
- package/src/assets/web-panel/assets/{index-DnoNK5Gb.js → index-But1z4eV.js} +1 -1
- package/src/assets/web-panel/assets/{index-81NIDNcI.js → index-C0ngZOEr.js} +1 -1
- package/src/assets/web-panel/assets/index-C6qy-Zu-.js +1 -0
- package/src/assets/web-panel/assets/{index-DDgwb3KP.js → index-C9UU-ZOL.js} +1 -1
- package/src/assets/web-panel/assets/{index-cF6gfPY3.js → index-CGvUENNM.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bjf02LQY.js → index-CR7JroGW.js} +2 -2
- package/src/assets/web-panel/assets/{index-D5wFryiJ.js → index-CWjdRkPO.js} +2 -2
- package/src/assets/web-panel/assets/index-CWvztGRz.js +1 -0
- package/src/assets/web-panel/assets/index-CoBBNzIM.js +55 -0
- package/src/assets/web-panel/assets/index-Crtf8JqT.js +3 -0
- package/src/assets/web-panel/assets/{index-BEbmwv5T.js → index-D2IHkqnY.js} +3 -3
- package/src/assets/web-panel/assets/{index-BMU9I-F6.js → index-D7hqt7jp.js} +1 -1
- package/src/assets/web-panel/assets/{index-BAPulPv1.js → index-D7vymjCu.js} +1 -1
- package/src/assets/web-panel/assets/index-DApPTzuh.js +1 -0
- package/src/assets/web-panel/assets/index-DFJYxODK.js +1 -0
- package/src/assets/web-panel/assets/{index-C1BBkQIj.js → index-DHWpBglQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-eVLTVVvL.js → index-DR4nFehS.js} +1 -1
- package/src/assets/web-panel/assets/{index-nw5SqpgZ.js → index-Dgiq6kNf.js} +2 -2
- package/src/assets/web-panel/assets/{index-CjOtB4wg.js → index-DoHOmopo.js} +3 -3
- package/src/assets/web-panel/assets/index-DoSx4Q_p.js +1 -0
- package/src/assets/web-panel/assets/{index-Z9wFemG0.js → index-DuQBpo_N.js} +2 -2
- package/src/assets/web-panel/assets/{index-D6w1kIHg.js → index-N7lOpMHe.js} +1 -1
- package/src/assets/web-panel/assets/{index-lrfnKtkl.js → index-ROop7jDs.js} +1 -1
- package/src/assets/web-panel/assets/index-bUf23fPj.js +1 -0
- package/src/assets/web-panel/assets/{index-Z5CuKqcS.js → index-g30p4eci.js} +1 -1
- package/src/assets/web-panel/assets/{index-g7FAcG7B.js → index-pbblwkTP.js} +1 -1
- package/src/assets/web-panel/assets/{index-D1SCFE25.js → index-vfJ5N9Wn.js} +2 -2
- package/src/assets/web-panel/assets/index-xcQ2VcES.js +36 -0
- package/src/assets/web-panel/assets/{initDefaultProps-_t-PG0bz.js → initDefaultProps-eEPfzAfC.js} +1 -1
- package/src/assets/web-panel/assets/{motion-DPnqtODq.js → motion-xnRaf7sL.js} +3 -3
- package/src/assets/web-panel/assets/{move-kO9NQRyb.js → move-CpDkwenV.js} +1 -1
- package/src/assets/web-panel/assets/{omit-DD9MqVt0.js → omit-B7Nb8KI8.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-D4u5AYq1.js → pickAttrs-BYHnT8J9.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-BUkUxlJc.js → placementArrow-lfdL5TRx.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-DA_o8FHw.js → responsiveObserve-CMAMO-tl.js} +1 -1
- package/src/assets/web-panel/assets/{slide-DSmAtCrK.js → slide-Dr-GHujf.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-Bn00xQ4D.js → statusUtils-CGJ1hNOe.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-phGTLjuN.js → styleChecker-jwEBpTKF.js} +1 -1
- package/src/assets/web-panel/assets/{transition-exl3w1iN.js → transition-gUK896vh.js} +1 -1
- package/src/assets/web-panel/assets/{useConfigInject-C2E3Qsop.js → useConfigInject-DBxKPWDc.js} +2 -2
- package/src/assets/web-panel/assets/useFlexGapSupport-CckP5k1m.js +1 -0
- package/src/assets/web-panel/assets/{useMergedState-DUMpRiCy.js → useMergedState-BUoJnBiL.js} +1 -1
- package/src/assets/web-panel/assets/{useRefs-C8A7zAB_.js → useRefs-XiBYSxE0.js} +1 -1
- package/src/assets/web-panel/assets/{useState-CSbzOa8O.js → useState-E1W-GoWe.js} +1 -1
- package/src/assets/web-panel/assets/{vendor-aH7YaPZi.js → vendor-xFZ6Jlpw.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-CIbqhcnZ.js → vnode-Dcul1jVV.js} +1 -1
- package/src/assets/web-panel/assets/{ws-BTS8ehTm.js → ws-Dg01CdRG.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-Ck9WbYsZ.js → zoom-DaF2prgS.js} +1 -1
- package/src/assets/web-panel/index.html +3 -3
- package/src/commands/db.js +317 -1
- package/src/assets/web-panel/assets/AppLayout-CSmBboZB.css +0 -1
- package/src/assets/web-panel/assets/AppLayout-CV6gWn1r.js +0 -1
- package/src/assets/web-panel/assets/Dashboard-DnJ1aZvj.js +0 -3
- package/src/assets/web-panel/assets/Portal-DXIqogG2.js +0 -1
- package/src/assets/web-panel/assets/Tasks-BchvT4YD.js +0 -1
- package/src/assets/web-panel/assets/Trigger-CIW_GVYA.js +0 -1
- package/src/assets/web-panel/assets/icons-DzieZiVh.js +0 -57
- package/src/assets/web-panel/assets/index-4C1c4hkZ.js +0 -36
- package/src/assets/web-panel/assets/index-B7gZm05C.js +0 -1
- package/src/assets/web-panel/assets/index-BRBeeCRz.js +0 -3
- package/src/assets/web-panel/assets/index-BbBjevdP.js +0 -1
- package/src/assets/web-panel/assets/index-Bn7dXbEh.js +0 -1
- package/src/assets/web-panel/assets/index-BqJS8Rje.js +0 -1
- package/src/assets/web-panel/assets/index-C4YPr8e8.js +0 -1
- package/src/assets/web-panel/assets/index-CZ3YetO8.js +0 -1
- package/src/assets/web-panel/assets/index-DYDvGZbQ.js +0 -1
- package/src/assets/web-panel/assets/index-DbxkO9Uy.js +0 -1
- package/src/assets/web-panel/assets/index-DeN7D3FZ.js +0 -1
- package/src/assets/web-panel/assets/index-O-dqdn3q.js +0 -55
- package/src/assets/web-panel/assets/useFlexGapSupport-tlovsMBV.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{k as U,r as b,j as B}from"./vendor-
|
|
1
|
+
import{k as U,r as b,j as B}from"./vendor-xFZ6Jlpw.js";let F=0;const m=()=>`wp-${++F}`,O=new Set;function y(e,n={},r={}){return{type:e,kind:r.kind||"server",sessionId:r.sessionId||n.sessionId||null,timestamp:r.timestamp||Date.now(),payload:n}}function Q(e){const n=e?.type,r=e?.payload||{};switch(n){case"task:notification":return y("task:notification",{task:e.task||r.task},{kind:"server"});case"session-created":case"session.started":return y("session:start",{sessionId:e.sessionId||r.sessionId,sessionType:e.sessionType||r.sessionType||null,record:e.record||r.record||{id:e.sessionId||r.sessionId,type:e.sessionType||r.sessionType||null,status:"created",history:[],messageCount:0}},{kind:"server",sessionId:e.sessionId||r.sessionId});case"session-resumed":case"session.resumed":{const c=e.sessionId||r.sessionId,i=e.history||r.history||[];return y("session:resume",{sessionId:c,history:i,historyCount:Array.isArray(i)?i.length:0,record:e.record||r.record||{id:c,type:null,status:"resumed",history:i,messageCount:Array.isArray(i)?i.length:0}},{kind:"server",sessionId:c})}case"worktree-diff":case"worktree.diff":return y("worktree:diff:ready",{requestId:e.requestId||e.id||null,record:e.record||r.record||{branch:e.branch||r.branch||null,summary:e.summary||r.summary||null,previewEntrypoints:[{type:"worktree-diff",branch:e.branch||r.branch||null}]}},{kind:"server"});case"worktree-merged":case"worktree.merged":return y("worktree:merge:completed",{requestId:e.requestId||e.id||null,record:e.record||r.record||{branch:e.branch||r.branch||null,summary:e.summary||r.summary||null,conflicts:e.conflicts||r.conflicts||[],previewEntrypoints:e.previewEntrypoints||r.previewEntrypoints||[]}},{kind:"server"});case"compression-stats":case"context.compaction.completed":return y("compression:summary",{requestId:e.requestId||e.id||null,summary:e.summary||r.summary||{}},{kind:"server"});default:return null}}function W(e,n=null){O.forEach(r=>r(e,n||e))}function K(e){if(!e)return null;const n=e.record||{id:e.id||null,type:e.type||null,provider:e.provider||null,model:e.model||null,projectRoot:e.projectRoot||null,messageCount:e.messageCount??0,history:e.history||[],status:e.status||null};return{...e,id:e.id||n.id,type:e.type||n.type,provider:e.provider||n.provider,model:e.model||n.model,projectRoot:e.projectRoot||n.projectRoot,messageCount:e.messageCount??n.messageCount??0,status:e.status||n.status||null,record:n}}const V=U("ws",()=>{const e=b(null),n=b("disconnected"),r=b(null),c=new Map,i=new Map;let l=null,h=1e3,k=!1;const f=window.__CC_CONFIG__||{},P=B(()=>`ws://${f.wsHost||"127.0.0.1"}:${f.wsPort||18800}`);function S(){if(!(e.value?.readyState===WebSocket.OPEN||e.value?.readyState===WebSocket.CONNECTING)){clearTimeout(l),l=null,k=!1,n.value="connecting",r.value=null;try{const t=new WebSocket(P.value);e.value=t,t.onopen=()=>{h=1e3,f.wsToken?d({type:"auth",id:m(),token:f.wsToken}).then(()=>{n.value="connected"}).catch(()=>{n.value="connected"}):n.value="connected"},t.onmessage=s=>{let o;try{o=JSON.parse(s.data)}catch{return}q(o)},t.onerror=()=>{r.value="WebSocket error",n.value="error"},t.onclose=()=>{if(n.value="disconnected",e.value=null,c.forEach(({reject:s})=>s(new Error("WebSocket closed"))),c.clear(),k){k=!1,l=null;return}l=setTimeout(()=>{h=Math.min(h*2,3e4),l=null,S()},h)}}catch(t){n.value="error",r.value=t.message}}}function x(){clearTimeout(l),l=null,k=!0,e.value?.close(),e.value=null,n.value="disconnected"}function N(t){if(!t.version&&!t.payload)return t;const s=t.payload||{};return{...t,...s,type:t.type,sessionId:t.sessionId||s.sessionId||null}}function q(t){const{type:s}=t,o=t.requestId||t.id;let u=!1;if(o&&c.has(o)){const{resolve:w,reject:R,timeout:I}=c.get(o);clearTimeout(I),c.delete(o),u=!0;const C=N(t);C.id=o,s==="error"?R(new Error(C.message||"Unknown error")):w(C)}const a=t.sessionId||t.payload&&t.payload.sessionId||null;if(a&&i.has(a)){const w=N(t);i.get(a).forEach(I=>I(w))}E.forEach(w=>w(t));const v=Q(t);return v&&W(v,t),u}const E=new Set;function J(t){return E.add(t),()=>E.delete(t)}function j(t){return O.add(t),()=>O.delete(t)}function A(t,s){return i.has(t)||i.set(t,new Set),i.get(t).add(s),()=>{i.get(t)?.delete(s),i.get(t)?.size===0&&i.delete(t)}}function d(t,s=15e3){return new Promise((o,u)=>{if(e.value?.readyState!==WebSocket.OPEN){u(new Error("WebSocket not connected"));return}const a=t.id||m(),v=setTimeout(()=>{c.delete(a),u(new Error("Request timeout"))},s);c.set(a,{resolve:o,reject:u,timeout:v}),e.value.send(JSON.stringify({...t,id:a}))})}function p(t=8e3){return n.value==="connected"?Promise.resolve():new Promise((s,o)=>{const u=Date.now()+t,a=()=>{if(n.value==="connected")return s();if(n.value==="error"||Date.now()>=u)return o(new Error(`WS not ready: ${n.value}`));setTimeout(a,150)};n.value==="disconnected"&&S(),a()})}async function T(t,s=3e4){await p(8e3);const o=await d({type:"execute",command:t},s),u=o.output??o.stdout??"",a=o.stderr??"";return{output:u||a,exitCode:o.exitCode??0}}async function M(t,s=3e4){const{output:o,exitCode:u}=await T(t,s);if(u!==0)throw new Error(`Command failed: ${o}`);try{return JSON.parse(o.trim())}catch{const a=o.match(/\{[\s\S]*\}|\[[\s\S]*\]/);if(a)return JSON.parse(a[0]);throw new Error(`Invalid JSON output: ${o.slice(0,200)}`)}}async function _(t="chat",s=null,o={}){await p(8e3);const a={type:"session-create",id:m(),sessionType:t,projectRoot:s||f.projectRoot||null};return o.systemPromptExtension&&(a.systemPromptExtension=o.systemPromptExtension),Array.isArray(o.shellPolicyOverrides)&&o.shellPolicyOverrides.length&&(a.shellPolicyOverrides=o.shellPolicyOverrides),(await d(a)).sessionId}function $(t,s){e.value?.readyState===WebSocket.OPEN&&e.value.send(JSON.stringify({type:"session-message",id:m(),sessionId:t,content:s}))}function D(t,s,o){e.value?.readyState===WebSocket.OPEN&&e.value.send(JSON.stringify({type:"session-answer",id:m(),sessionId:t,requestId:s,answer:o}))}async function H(){return await p(8e3),((await d({type:"session-list"},1e4)).sessions||[]).map(K).filter(Boolean)}async function z(t){try{await d({type:"session-close",sessionId:t},5e3),W(y("session:end",{sessionId:t},{kind:"server",sessionId:t}),{type:"result",sessionId:t,success:!0})}catch{}}async function G(t){return await p(8e3),await d({type:"session-resume",sessionId:t},1e4)}return{status:n,error:r,wsUrl:P,connect:S,disconnect:x,waitConnected:p,onMessage:J,onRuntimeEvent:j,onSession:A,sendRaw:d,execute:T,executeJson:M,createSession:_,resumeSession:G,sendSessionMessage:$,answerQuestion:D,listSessions:H,closeSession:z}});export{V as u};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{K as o}from"./Keyframes-C7fCrnlS.js";import{i as f}from"./motion-
|
|
1
|
+
import{K as o}from"./Keyframes-C7fCrnlS.js";import{i as f}from"./motion-xnRaf7sL.js";const c=new o("antZoomIn",{"0%":{transform:"scale(0.2)",opacity:0},"100%":{transform:"scale(1)",opacity:1}}),y=new o("antZoomOut",{"0%":{transform:"scale(1)"},"100%":{transform:"scale(0.2)",opacity:0}}),a=new o("antZoomBigIn",{"0%":{transform:"scale(0.8)",opacity:0},"100%":{transform:"scale(1)",opacity:1}}),s=new o("antZoomBigOut",{"0%":{transform:"scale(1)"},"100%":{transform:"scale(0.8)",opacity:0}}),g=new o("antZoomUpIn",{"0%":{transform:"scale(0.8)",transformOrigin:"50% 0%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"50% 0%"}}),O=new o("antZoomUpOut",{"0%":{transform:"scale(1)",transformOrigin:"50% 0%"},"100%":{transform:"scale(0.8)",transformOrigin:"50% 0%",opacity:0}}),l=new o("antZoomLeftIn",{"0%":{transform:"scale(0.8)",transformOrigin:"0% 50%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"0% 50%"}}),u=new o("antZoomLeftOut",{"0%":{transform:"scale(1)",transformOrigin:"0% 50%"},"100%":{transform:"scale(0.8)",transformOrigin:"0% 50%",opacity:0}}),p=new o("antZoomRightIn",{"0%":{transform:"scale(0.8)",transformOrigin:"100% 50%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"100% 50%"}}),z=new o("antZoomRightOut",{"0%":{transform:"scale(1)",transformOrigin:"100% 50%"},"100%":{transform:"scale(0.8)",transformOrigin:"100% 50%",opacity:0}}),K=new o("antZoomDownIn",{"0%":{transform:"scale(0.8)",transformOrigin:"50% 100%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"50% 100%"}}),w=new o("antZoomDownOut",{"0%":{transform:"scale(1)",transformOrigin:"50% 100%"},"100%":{transform:"scale(0.8)",transformOrigin:"50% 100%",opacity:0}}),I={zoom:{inKeyframes:c,outKeyframes:y},"zoom-big":{inKeyframes:a,outKeyframes:s},"zoom-big-fast":{inKeyframes:a,outKeyframes:s},"zoom-left":{inKeyframes:l,outKeyframes:u},"zoom-right":{inKeyframes:p,outKeyframes:z},"zoom-up":{inKeyframes:g,outKeyframes:O},"zoom-down":{inKeyframes:K,outKeyframes:w}},h=(n,r)=>{const{antCls:m}=n,t=`${m}-${r}`,{inKeyframes:i,outKeyframes:e}=I[r];return[f(t,i,e,r==="zoom-big-fast"?n.motionDurationFast:n.motionDurationMid),{[`
|
|
2
2
|
${t}-enter,
|
|
3
3
|
${t}-appear
|
|
4
4
|
`]:{transform:"scale(0)",opacity:0,animationTimingFunction:n.motionEaseOutCirc,"&-prepare":{transform:"none"}},[`${t}-leave`]:{animationTimingFunction:n.motionEaseInOutCirc}}]};export{h as i,c as z};
|
|
@@ -8,9 +8,9 @@
|
|
|
8
8
|
// Injected by web-ui-server.js at serve time
|
|
9
9
|
window.__CC_CONFIG__ = __CC_CONFIG_PLACEHOLDER__;
|
|
10
10
|
</script>
|
|
11
|
-
<script type="module" crossorigin src="./assets/index-
|
|
12
|
-
<link rel="modulepreload" crossorigin href="./assets/vendor-
|
|
13
|
-
<link rel="modulepreload" crossorigin href="./assets/icons-
|
|
11
|
+
<script type="module" crossorigin src="./assets/index-xcQ2VcES.js"></script>
|
|
12
|
+
<link rel="modulepreload" crossorigin href="./assets/vendor-xFZ6Jlpw.js">
|
|
13
|
+
<link rel="modulepreload" crossorigin href="./assets/icons-C40taSZA.js">
|
|
14
14
|
<link rel="stylesheet" crossorigin href="./assets/index-CyGyEIVX.css">
|
|
15
15
|
</head>
|
|
16
16
|
<body>
|
package/src/commands/db.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Database management commands
|
|
3
|
-
* chainlesschain db init|info|backup|restore|
|
|
3
|
+
* chainlesschain db init|info|backup|restore|check|repair|reset
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import ora from "ora";
|
|
@@ -8,6 +8,8 @@ import chalk from "chalk";
|
|
|
8
8
|
import { logger } from "../lib/logger.js";
|
|
9
9
|
import { bootstrap, shutdown } from "../runtime/bootstrap.js";
|
|
10
10
|
|
|
11
|
+
const quoteIdent = (name) => `"${String(name).replace(/"/g, '""')}"`;
|
|
12
|
+
|
|
11
13
|
export function registerDbCommand(program) {
|
|
12
14
|
const db = program.command("db").description("Database management");
|
|
13
15
|
|
|
@@ -149,4 +151,318 @@ export function registerDbCommand(program) {
|
|
|
149
151
|
process.exit(1);
|
|
150
152
|
}
|
|
151
153
|
});
|
|
154
|
+
|
|
155
|
+
// db check — PRAGMA integrity_check (read-only, exits 2 on corruption)
|
|
156
|
+
db.command("check")
|
|
157
|
+
.description("Run SQLite integrity check on the database")
|
|
158
|
+
.option("--quick", "Run quick_check (faster, less thorough)")
|
|
159
|
+
.option("--json", "Output as JSON")
|
|
160
|
+
.action(async (options) => {
|
|
161
|
+
let exitCode = 0;
|
|
162
|
+
try {
|
|
163
|
+
const ctx = await bootstrap({
|
|
164
|
+
skipDb: true,
|
|
165
|
+
verbose: program.opts().verbose,
|
|
166
|
+
});
|
|
167
|
+
const fs = await import("fs");
|
|
168
|
+
const dbPath = `${ctx.env.dataDir}/chainlesschain.db`;
|
|
169
|
+
if (!fs.existsSync(dbPath)) {
|
|
170
|
+
logger.error(`Database file not found: ${dbPath}`);
|
|
171
|
+
await shutdown();
|
|
172
|
+
process.exit(1);
|
|
173
|
+
}
|
|
174
|
+
const { loadSQLiteDriver } = await import(
|
|
175
|
+
"@chainlesschain/core-db/database-manager"
|
|
176
|
+
);
|
|
177
|
+
const driver = loadSQLiteDriver();
|
|
178
|
+
if (
|
|
179
|
+
!driver ||
|
|
180
|
+
(driver.type !== "native" && driver.type !== "native-cipher")
|
|
181
|
+
) {
|
|
182
|
+
logger.error(
|
|
183
|
+
"integrity check requires a native SQLite driver (better-sqlite3)",
|
|
184
|
+
);
|
|
185
|
+
await shutdown();
|
|
186
|
+
process.exit(1);
|
|
187
|
+
}
|
|
188
|
+
const conn = new driver.Database(dbPath, {
|
|
189
|
+
readonly: true,
|
|
190
|
+
fileMustExist: true,
|
|
191
|
+
});
|
|
192
|
+
const checkName = options.quick ? "quick_check" : "integrity_check";
|
|
193
|
+
const rows = conn.pragma(checkName);
|
|
194
|
+
conn.close();
|
|
195
|
+
const ok =
|
|
196
|
+
rows.length === 1 && rows[0] && rows[0][checkName] === "ok";
|
|
197
|
+
if (options.json) {
|
|
198
|
+
console.log(
|
|
199
|
+
JSON.stringify({ ok, check: checkName, path: dbPath, result: rows }, null, 2),
|
|
200
|
+
);
|
|
201
|
+
} else if (ok) {
|
|
202
|
+
logger.success(
|
|
203
|
+
`Database integrity OK (${checkName}): ${chalk.cyan(dbPath)}`,
|
|
204
|
+
);
|
|
205
|
+
} else {
|
|
206
|
+
logger.error(`Database is CORRUPT: ${chalk.cyan(dbPath)}`);
|
|
207
|
+
for (const r of rows) {
|
|
208
|
+
const msg = (r && r[checkName]) || JSON.stringify(r);
|
|
209
|
+
const lines = String(msg).split("\n").slice(0, 20);
|
|
210
|
+
for (const line of lines) console.log(" " + line);
|
|
211
|
+
}
|
|
212
|
+
console.log("");
|
|
213
|
+
logger.warn("Recovery options:");
|
|
214
|
+
console.log(" cc db repair – best-effort row salvage into a new file");
|
|
215
|
+
console.log(" cc db reset – back up corrupt DB and start fresh");
|
|
216
|
+
}
|
|
217
|
+
exitCode = ok ? 0 : 2;
|
|
218
|
+
await shutdown();
|
|
219
|
+
} catch (err) {
|
|
220
|
+
logger.error(`Database check failed: ${err.message}`);
|
|
221
|
+
exitCode = 1;
|
|
222
|
+
}
|
|
223
|
+
process.exit(exitCode);
|
|
224
|
+
});
|
|
225
|
+
|
|
226
|
+
// db reset — rename corrupt DB + WAL/SHM to .bak.<timestamp>; next CLI run creates fresh
|
|
227
|
+
db.command("reset")
|
|
228
|
+
.description(
|
|
229
|
+
"Back up the database (and WAL sidecar) and start fresh next run",
|
|
230
|
+
)
|
|
231
|
+
.option("--force", "Skip confirmation")
|
|
232
|
+
.action(async (options) => {
|
|
233
|
+
try {
|
|
234
|
+
const ctx = await bootstrap({
|
|
235
|
+
skipDb: true,
|
|
236
|
+
verbose: program.opts().verbose,
|
|
237
|
+
});
|
|
238
|
+
const fs = await import("fs");
|
|
239
|
+
const dbPath = `${ctx.env.dataDir}/chainlesschain.db`;
|
|
240
|
+
if (!fs.existsSync(dbPath)) {
|
|
241
|
+
logger.info(`No database to reset: ${dbPath} does not exist`);
|
|
242
|
+
await shutdown();
|
|
243
|
+
return;
|
|
244
|
+
}
|
|
245
|
+
if (!options.force) {
|
|
246
|
+
const { confirm } = await import("@inquirer/prompts");
|
|
247
|
+
const ok = await confirm({
|
|
248
|
+
message: `Back up and remove ${dbPath}? Next CLI command will create a fresh DB.`,
|
|
249
|
+
default: false,
|
|
250
|
+
});
|
|
251
|
+
if (!ok) {
|
|
252
|
+
logger.info("Reset cancelled");
|
|
253
|
+
await shutdown();
|
|
254
|
+
return;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
const ts = new Date().toISOString().replace(/[:.]/g, "-");
|
|
258
|
+
const backed = [];
|
|
259
|
+
for (const ext of ["", "-wal", "-shm"]) {
|
|
260
|
+
const src = dbPath + ext;
|
|
261
|
+
if (fs.existsSync(src)) {
|
|
262
|
+
const dest = `${src}.bak.${ts}`;
|
|
263
|
+
fs.renameSync(src, dest);
|
|
264
|
+
backed.push(dest);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
if (backed.length === 0) {
|
|
268
|
+
logger.info("Nothing to back up");
|
|
269
|
+
} else {
|
|
270
|
+
logger.success("Database reset. Backups created:");
|
|
271
|
+
for (const b of backed) console.log(" " + chalk.cyan(b));
|
|
272
|
+
}
|
|
273
|
+
await shutdown();
|
|
274
|
+
} catch (err) {
|
|
275
|
+
logger.error(`Reset failed: ${err.message}`);
|
|
276
|
+
process.exit(1);
|
|
277
|
+
}
|
|
278
|
+
});
|
|
279
|
+
|
|
280
|
+
// db repair — best-effort row salvage from corrupt DB into a fresh file.
|
|
281
|
+
// Walks each table individually; rows on broken pages throw and are counted
|
|
282
|
+
// as lost rather than aborting the whole salvage. Output is a sibling file
|
|
283
|
+
// chainlesschain.db.recovered.<ts> — operator can swap it in via reset+restore.
|
|
284
|
+
db.command("repair")
|
|
285
|
+
.description("Best-effort row salvage from a corrupt DB into a new file")
|
|
286
|
+
.option("--out <path>", "Output path for recovered DB")
|
|
287
|
+
.action(async (options) => {
|
|
288
|
+
try {
|
|
289
|
+
const ctx = await bootstrap({
|
|
290
|
+
skipDb: true,
|
|
291
|
+
verbose: program.opts().verbose,
|
|
292
|
+
});
|
|
293
|
+
const fs = await import("fs");
|
|
294
|
+
const dbPath = `${ctx.env.dataDir}/chainlesschain.db`;
|
|
295
|
+
if (!fs.existsSync(dbPath)) {
|
|
296
|
+
logger.error(`Database file not found: ${dbPath}`);
|
|
297
|
+
await shutdown();
|
|
298
|
+
process.exit(1);
|
|
299
|
+
}
|
|
300
|
+
const { loadSQLiteDriver } = await import(
|
|
301
|
+
"@chainlesschain/core-db/database-manager"
|
|
302
|
+
);
|
|
303
|
+
const driver = loadSQLiteDriver();
|
|
304
|
+
if (
|
|
305
|
+
!driver ||
|
|
306
|
+
(driver.type !== "native" && driver.type !== "native-cipher")
|
|
307
|
+
) {
|
|
308
|
+
logger.error(
|
|
309
|
+
"repair requires a native SQLite driver (better-sqlite3)",
|
|
310
|
+
);
|
|
311
|
+
await shutdown();
|
|
312
|
+
process.exit(1);
|
|
313
|
+
}
|
|
314
|
+
const ts = new Date().toISOString().replace(/[:.]/g, "-");
|
|
315
|
+
const outPath = options.out || `${dbPath}.recovered.${ts}`;
|
|
316
|
+
if (fs.existsSync(outPath)) {
|
|
317
|
+
logger.error(`Output path already exists: ${outPath}`);
|
|
318
|
+
await shutdown();
|
|
319
|
+
process.exit(1);
|
|
320
|
+
}
|
|
321
|
+
logger.info(
|
|
322
|
+
`Salvaging ${chalk.cyan(dbPath)} → ${chalk.cyan(outPath)}`,
|
|
323
|
+
);
|
|
324
|
+
|
|
325
|
+
const src = new driver.Database(dbPath, {
|
|
326
|
+
readonly: true,
|
|
327
|
+
fileMustExist: true,
|
|
328
|
+
});
|
|
329
|
+
const dst = new driver.Database(outPath);
|
|
330
|
+
dst.pragma("journal_mode = WAL");
|
|
331
|
+
|
|
332
|
+
// Replay schema (tables first, then indexes/views).
|
|
333
|
+
let schemaRows = [];
|
|
334
|
+
try {
|
|
335
|
+
schemaRows = src
|
|
336
|
+
.prepare(
|
|
337
|
+
"SELECT type, name, sql FROM sqlite_master WHERE type IN ('table','index','view') AND sql IS NOT NULL AND name NOT LIKE 'sqlite_%' ORDER BY (type='table') DESC, name",
|
|
338
|
+
)
|
|
339
|
+
.all();
|
|
340
|
+
} catch (e) {
|
|
341
|
+
logger.error(`Cannot read sqlite_master: ${e.message}`);
|
|
342
|
+
src.close();
|
|
343
|
+
dst.close();
|
|
344
|
+
await shutdown();
|
|
345
|
+
process.exit(1);
|
|
346
|
+
}
|
|
347
|
+
const stats = {
|
|
348
|
+
tables: 0,
|
|
349
|
+
rowsCopied: 0,
|
|
350
|
+
rowsLost: 0,
|
|
351
|
+
schemasFailed: 0,
|
|
352
|
+
};
|
|
353
|
+
for (const r of schemaRows) {
|
|
354
|
+
try {
|
|
355
|
+
dst.exec(r.sql);
|
|
356
|
+
} catch (e) {
|
|
357
|
+
stats.schemasFailed++;
|
|
358
|
+
logger.warn(`schema replay failed for ${r.name}: ${e.message}`);
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
const tableRows = src
|
|
363
|
+
.prepare(
|
|
364
|
+
"SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%' ORDER BY name",
|
|
365
|
+
)
|
|
366
|
+
.all();
|
|
367
|
+
const tables = tableRows.map((t) => t.name);
|
|
368
|
+
for (const t of tables) {
|
|
369
|
+
let copied = 0;
|
|
370
|
+
let lost = 0;
|
|
371
|
+
let cols = [];
|
|
372
|
+
try {
|
|
373
|
+
cols = src
|
|
374
|
+
.prepare(`PRAGMA table_info(${quoteIdent(t)})`)
|
|
375
|
+
.all()
|
|
376
|
+
.map((c) => c.name);
|
|
377
|
+
} catch (e) {
|
|
378
|
+
console.log(
|
|
379
|
+
` ${t.padEnd(28)} ${chalk.red("schema unreadable")}`,
|
|
380
|
+
);
|
|
381
|
+
stats.tables++;
|
|
382
|
+
continue;
|
|
383
|
+
}
|
|
384
|
+
if (cols.length === 0) {
|
|
385
|
+
console.log(` ${t.padEnd(28)} ${chalk.gray("no columns")}`);
|
|
386
|
+
stats.tables++;
|
|
387
|
+
continue;
|
|
388
|
+
}
|
|
389
|
+
const colList = cols.map(quoteIdent).join(",");
|
|
390
|
+
const placeholders = cols.map(() => "?").join(",");
|
|
391
|
+
let insert;
|
|
392
|
+
try {
|
|
393
|
+
insert = dst.prepare(
|
|
394
|
+
`INSERT OR IGNORE INTO ${quoteIdent(t)} (${colList}) VALUES (${placeholders})`,
|
|
395
|
+
);
|
|
396
|
+
} catch (e) {
|
|
397
|
+
console.log(
|
|
398
|
+
` ${t.padEnd(28)} ${chalk.red("dest insert prep failed")}`,
|
|
399
|
+
);
|
|
400
|
+
stats.tables++;
|
|
401
|
+
continue;
|
|
402
|
+
}
|
|
403
|
+
let iter;
|
|
404
|
+
try {
|
|
405
|
+
iter = src
|
|
406
|
+
.prepare(`SELECT ${colList} FROM ${quoteIdent(t)}`)
|
|
407
|
+
.iterate();
|
|
408
|
+
} catch (e) {
|
|
409
|
+
console.log(
|
|
410
|
+
` ${t.padEnd(28)} ${chalk.red("table read aborted: " + e.message.slice(0, 40))}`,
|
|
411
|
+
);
|
|
412
|
+
stats.tables++;
|
|
413
|
+
continue;
|
|
414
|
+
}
|
|
415
|
+
while (true) {
|
|
416
|
+
let next;
|
|
417
|
+
try {
|
|
418
|
+
next = iter.next();
|
|
419
|
+
} catch (e) {
|
|
420
|
+
lost++;
|
|
421
|
+
break;
|
|
422
|
+
}
|
|
423
|
+
if (next.done) break;
|
|
424
|
+
try {
|
|
425
|
+
insert.run(...cols.map((c) => next.value[c]));
|
|
426
|
+
copied++;
|
|
427
|
+
} catch (e) {
|
|
428
|
+
lost++;
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
try {
|
|
432
|
+
iter.return && iter.return();
|
|
433
|
+
} catch (_e) {
|
|
434
|
+
/* swallow */
|
|
435
|
+
}
|
|
436
|
+
stats.tables++;
|
|
437
|
+
stats.rowsCopied += copied;
|
|
438
|
+
stats.rowsLost += lost;
|
|
439
|
+
const status =
|
|
440
|
+
lost > 0
|
|
441
|
+
? chalk.yellow(`${copied} copied, ${lost} lost`)
|
|
442
|
+
: copied === 0
|
|
443
|
+
? chalk.gray(`${copied} copied`)
|
|
444
|
+
: chalk.green(`${copied} copied`);
|
|
445
|
+
console.log(` ${t.padEnd(28)} ${status}`);
|
|
446
|
+
}
|
|
447
|
+
src.close();
|
|
448
|
+
dst.close();
|
|
449
|
+
|
|
450
|
+
logger.log("");
|
|
451
|
+
logger.success(`Recovered DB written to ${chalk.cyan(outPath)}`);
|
|
452
|
+
logger.log(` Tables processed: ${stats.tables}`);
|
|
453
|
+
logger.log(` Rows copied: ${chalk.green(stats.rowsCopied)}`);
|
|
454
|
+
logger.log(
|
|
455
|
+
` Rows lost: ${stats.rowsLost > 0 ? chalk.yellow(stats.rowsLost) : 0}`,
|
|
456
|
+
);
|
|
457
|
+
logger.log(` Schemas failed: ${stats.schemasFailed}`);
|
|
458
|
+
logger.log("");
|
|
459
|
+
logger.info("To use the recovered DB:");
|
|
460
|
+
console.log(` cc db reset --force`);
|
|
461
|
+
console.log(` cc db restore ${outPath} --force`);
|
|
462
|
+
await shutdown();
|
|
463
|
+
} catch (err) {
|
|
464
|
+
logger.error(`Repair failed: ${err.message}`);
|
|
465
|
+
process.exit(1);
|
|
466
|
+
}
|
|
467
|
+
});
|
|
152
468
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
.app-root[data-v-e509a844]{min-height:100vh;background:var(--bg-base)}.sidebar[data-v-e509a844]{background:var(--bg-sidebar)!important;border-right:1px solid var(--border-color);transition:background .25s}[data-v-e509a844] .ant-layout-sider-children{display:flex;flex-direction:column;overflow:hidden}.main-area[data-v-e509a844]{background:var(--bg-base)}.logo[data-v-e509a844]{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-e509a844]{padding:0;justify-content:center}.logo-icon[data-v-e509a844]{width:24px;height:24px;flex-shrink:0;object-fit:contain}.logo-text[data-v-e509a844]{color:var(--logo-text);font-weight:700;font-size:14px;letter-spacing:.01em}.mode-banner[data-v-e509a844]{display:flex;align-items:center;gap:8px;padding:7px 10px;margin:8px 8px 4px;border-radius:7px;overflow:hidden}.mode-banner.project[data-v-e509a844]{background:#1677ff1a;border:1px solid rgba(22,119,255,.2)}.mode-banner.global[data-v-e509a844]{background:#722ed11a;border:1px solid rgba(114,46,209,.2)}.banner-icon[data-v-e509a844]{font-size:13px;flex-shrink:0;color:#1677ff}.mode-banner.global .banner-icon[data-v-e509a844]{color:#722ed1}.banner-info[data-v-e509a844]{flex:1;min-width:0}.banner-name[data-v-e509a844]{font-size:12px;font-weight:600;color:var(--text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.banner-sub[data-v-e509a844]{font-size:10px;color:#1677ff;margin-top:1px}.mode-banner.global .banner-name[data-v-e509a844]{color:#c084fc}.mode-icon-sm[data-v-e509a844]{display:flex;justify-content:center;padding:8px 0;font-size:14px}.side-menu[data-v-e509a844]{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-e509a844]{color:var(--group-title);font-size:10px;font-weight:700;letter-spacing:.12em;padding-left:6px}[data-v-e509a844] .ant-menu-item-group-title{padding:8px 16px 2px!important}[data-v-e509a844] .ant-menu-item{height:38px!important;line-height:38px!important;margin:1px 4px!important;border-radius:6px!important}.divider-sm[data-v-e509a844]{margin:4px 0!important}.sidebar-footer[data-v-e509a844]{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-e509a844]{justify-content:center;padding:8px 0}.footer-text[data-v-e509a844]{color:var(--text-secondary);font-size:11px}.app-header[data-v-e509a844]{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-e509a844],.header-right[data-v-e509a844]{display:flex;align-items:center;gap:10px}.scope-tag[data-v-e509a844]{display:flex;align-items:center;gap:5px;padding:3px 10px;border-radius:5px;font-size:12px;font-weight:500}.scope-tag.project[data-v-e509a844]{background:#1677ff1a;color:#1677ff;border:1px solid rgba(22,119,255,.2)}.scope-tag.global[data-v-e509a844]{background:#722ed11a;color:#722ed1;border:1px solid rgba(114,46,209,.2)}.info-icon[data-v-e509a844]{opacity:.45;cursor:help;margin-left:2px}.theme-switcher[data-v-e509a844]{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-e509a844]{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-e509a844]:hover{opacity:.9;transform:scale(1.15);background:var(--bg-card-hover)}.theme-btn.active[data-v-e509a844]{opacity:1;transform:scale(1.1);background:var(--bg-card-hover);outline:2px solid var(--text-secondary)}.version-tag[data-v-e509a844]{color:var(--text-muted);font-size:11px}.ws-tag[data-v-e509a844]{margin:0!important;font-size:11px}.page-content[data-v-e509a844]{padding:24px;overflow:auto;background:var(--bg-base);min-height:calc(100vh - 50px)}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{l as Oe,m as f,x as t,q as d,B as Ce,C as we,v as i,c as e,D as a,E as w,u as s,F as r,G as T,H as j,I as v,J as l,K as je,L as Se,r as Te,j as y}from"./vendor-aH7YaPZi.js";import{u as Be}from"./ws-BTS8ehTm.js";import{u as Re,T as Le}from"./index-4C1c4hkZ.js";import{_ as xe}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{F as B,G as R,D as A,M as P,R as D,C as I,a as K,A as M,b as U,c as V,B as F,d as E,S as G,e as W,f as z,h as H,i as $,L as q,W as J,j as Y,k as Q,P as X,l as Z,m as h,n as ee,o as te,V as Ne,p as oe,K as se,I as Ae}from"./icons-DzieZiVh.js";const Pe=["src"],De={key:0,class:"logo-text"},Ie={key:0,class:"mode-banner project"},Ke={class:"banner-info"},Me={class:"banner-name"},Ue={key:1,class:"mode-banner global"},Ve=["title"],Fe={key:0,class:"footer-text"},Ee={class:"header-left"},Ge={class:"header-right"},We={class:"theme-switcher"},ze=["data-theme-key","onClick"],He={class:"version-tag"},$e={__name:"AppLayout",setup(qe){const ne=Ce(),le=we(),b=Be(),S=Re(),u=Te(!1),k=window.__CC_CONFIG__||{},p=y(()=>k.mode==="project"),ae="v5.0.2.55",ie=new URL(""+new URL("logo-DBCYUiWP.png",import.meta.url).href,import.meta.url).href,de=y(()=>S.current),ue=y(()=>S.config.vars["--menu-mode"]),L=y(()=>{const c=le.name?.toLowerCase()||"dashboard";return[{mcptools:"mcp"}[c]||c]}),O=y(()=>b.status),re=y(()=>({connected:"success",connecting:"processing",error:"error",disconnected:"default"})[b.status]||"default"),ce=y(()=>({connected:"已连接",connecting:"连接中...",error:"连接错误",disconnected:"未连接"})[b.status]||"未知");function pe(c){S.setTheme(c)}function me({key:c}){ne.push({mcp:"/mcp"}[c]||`/${c}`)}return Oe(()=>b.connect()),(c,o)=>{const n=d("a-menu-item"),m=d("a-menu-item-group"),g=d("a-menu-divider"),ye=d("a-menu"),ke=d("a-badge"),_e=d("a-layout-sider"),x=d("a-tooltip"),fe=d("a-tag"),ve=d("a-layout-header"),ge=d("router-view"),be=d("a-layout-content"),N=d("a-layout");return i(),f(N,{class:"app-root"},{default:t(()=>[e(_e,{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}])},[a("img",{src:s(ie),alt:"ChainlessChain",class:"logo-icon"},null,8,Pe),u.value?T("",!0):(i(),r("span",De,"ChainlessChain"))],2),u.value?(i(),r("div",{key:1,class:"mode-icon-sm",title:p.value?s(k).projectName:"全局模式"},[p.value?(i(),f(s(B),{key:0,style:{color:"#1677ff"}})):(i(),f(s(R),{key:1,style:{color:"#722ed1"}}))],8,Ve)):(i(),r(j,{key:0},[p.value?(i(),r("div",Ie,[e(s(B),{class:"banner-icon"}),a("div",Ke,[a("div",Me,v(s(k).projectName||"项目"),1),o[2]||(o[2]=a("div",{class:"banner-sub"},"项目级面板",-1))])])):(i(),r("div",Ue,[e(s(R),{class:"banner-icon"}),o[3]||(o[3]=a("span",{class:"banner-name"},"全局模式",-1))]))],64)),e(ye,{selectedKeys:L.value,"onUpdate:selectedKeys":o[0]||(o[0]=_=>L.value=_),theme:ue.value,mode:"inline","inline-collapsed":u.value,class:"side-menu",onClick:me},{default:t(()=>[u.value?(i(),r(j,{key:1},[e(n,{key:"dashboard"},{icon:t(()=>[e(s(A))]),_:1}),e(n,{key:"chat"},{icon:t(()=>[e(s(P))]),_:1}),e(n,{key:"cowork"},{icon:t(()=>[e(s(D))]),_:1}),e(n,{key:"services"},{icon:t(()=>[e(s(I))]),_:1}),e(n,{key:"logs"},{icon:t(()=>[e(s(K))]),_:1}),e(g,{class:"divider-sm"}),e(n,{key:"skills"},{icon:t(()=>[e(s(M))]),_:1}),e(n,{key:"providers"},{icon:t(()=>[e(s(U))]),_:1}),e(n,{key:"mcp"},{icon:t(()=>[e(s(V))]),_:1}),e(g,{class:"divider-sm"}),e(n,{key:"notes"},{icon:t(()=>[e(s(F))]),_:1}),e(n,{key:"memory"},{icon:t(()=>[e(s(E))]),_:1}),e(n,{key:"knowledge"},{icon:t(()=>[e(s(G))]),_:1}),e(n,{key:"cron"},{icon:t(()=>[e(s(W))]),_:1}),e(n,{key:"workflow"},{icon:t(()=>[e(s(z))]),_:1}),e(n,{key:"tasks"},{icon:t(()=>[e(s(H))]),_:1}),e(g,{class:"divider-sm"}),e(n,{key:"security"},{icon:t(()=>[e(s($))]),_:1}),e(n,{key:"permissions"},{icon:t(()=>[e(s(q))]),_:1}),e(n,{key:"p2p"},{icon:t(()=>[e(s(J))]),_:1}),e(n,{key:"backup"},{icon:t(()=>[e(s(Y))]),_:1}),e(n,{key:"git"},{icon:t(()=>[e(s(Q))]),_:1}),e(n,{key:"projects"},{icon:t(()=>[e(s(X))]),_:1}),e(g,{class:"divider-sm"}),e(n,{key:"wallet"},{icon:t(()=>[e(s(Z))]),_:1}),e(n,{key:"organization"},{icon:t(()=>[e(s(h))]),_:1}),e(n,{key:"analytics"},{icon:t(()=>[e(s(ee))]),_:1}),e(n,{key:"templates"},{icon:t(()=>[e(s(te))]),_:1}),e(g,{class:"divider-sm"}),e(n,{key:"rssfeed"},{icon:t(()=>[e(s(oe))]),_:1}),e(n,{key:"webauthn"},{icon:t(()=>[e(s(se))]),_:1})],64)):(i(),r(j,{key:0},[e(m,null,{title:t(()=>[...o[4]||(o[4]=[a("span",{class:"group-label"},"概 览",-1)])]),default:t(()=>[e(n,{key:"dashboard"},{icon:t(()=>[e(s(A))]),default:t(()=>[o[5]||(o[5]=l("仪表板",-1))]),_:1}),e(n,{key:"chat"},{icon:t(()=>[e(s(P))]),default:t(()=>[o[6]||(o[6]=l("AI 对话",-1))]),_:1}),e(n,{key:"cowork"},{icon:t(()=>[e(s(D))]),default:t(()=>[o[7]||(o[7]=l("日常协作",-1))]),_:1}),e(n,{key:"services"},{icon:t(()=>[e(s(I))]),default:t(()=>[o[8]||(o[8]=l("服务管理",-1))]),_:1}),e(n,{key:"logs"},{icon:t(()=>[e(s(K))]),default:t(()=>[o[9]||(o[9]=l("日志查看",-1))]),_:1})]),_:1}),e(m,null,{title:t(()=>[...o[10]||(o[10]=[a("span",{class:"group-label"},"配 置",-1)])]),default:t(()=>[e(n,{key:"skills"},{icon:t(()=>[e(s(M))]),default:t(()=>[o[11]||(o[11]=l("技能管理",-1))]),_:1}),e(n,{key:"providers"},{icon:t(()=>[e(s(U))]),default:t(()=>[o[12]||(o[12]=l("LLM 配置",-1))]),_:1}),e(n,{key:"mcp"},{icon:t(()=>[e(s(V))]),default:t(()=>[o[13]||(o[13]=l("MCP 工具",-1))]),_:1})]),_:1}),e(m,null,{title:t(()=>[...o[14]||(o[14]=[a("span",{class:"group-label"},"数 据",-1)])]),default:t(()=>[e(n,{key:"notes"},{icon:t(()=>[e(s(F))]),default:t(()=>[o[15]||(o[15]=l("笔记管理",-1))]),_:1}),e(n,{key:"memory"},{icon:t(()=>[e(s(E))]),default:t(()=>[o[16]||(o[16]=l("记忆文件",-1))]),_:1}),e(n,{key:"knowledge"},{icon:t(()=>[e(s(G))]),default:t(()=>[o[17]||(o[17]=l("知识图谱",-1))]),_:1}),e(n,{key:"cron"},{icon:t(()=>[e(s(W))]),default:t(()=>[o[18]||(o[18]=l("定时任务",-1))]),_:1}),e(n,{key:"workflow"},{icon:t(()=>[e(s(z))]),default:t(()=>[o[19]||(o[19]=l("工作流编辑",-1))]),_:1}),e(n,{key:"tasks"},{icon:t(()=>[e(s(H))]),default:t(()=>[o[20]||(o[20]=l("后台任务",-1))]),_:1})]),_:1}),e(m,null,{title:t(()=>[...o[21]||(o[21]=[a("span",{class:"group-label"},"高 级",-1)])]),default:t(()=>[e(n,{key:"security"},{icon:t(()=>[e(s($))]),default:t(()=>[o[22]||(o[22]=l("安全中心",-1))]),_:1}),e(n,{key:"permissions"},{icon:t(()=>[e(s(q))]),default:t(()=>[o[23]||(o[23]=l("权限管理",-1))]),_:1}),e(n,{key:"p2p"},{icon:t(()=>[e(s(J))]),default:t(()=>[o[24]||(o[24]=l("P2P 网络",-1))]),_:1}),e(n,{key:"backup"},{icon:t(()=>[e(s(Y))]),default:t(()=>[o[25]||(o[25]=l("备份同步",-1))]),_:1}),e(n,{key:"git"},{icon:t(()=>[e(s(Q))]),default:t(()=>[o[26]||(o[26]=l("Git 与数据",-1))]),_:1}),e(n,{key:"projects"},{icon:t(()=>[e(s(X))]),default:t(()=>[o[27]||(o[27]=l("项目管理",-1))]),_:1})]),_:1}),e(m,null,{title:t(()=>[...o[28]||(o[28]=[a("span",{class:"group-label"},"企 业",-1)])]),default:t(()=>[e(n,{key:"wallet"},{icon:t(()=>[e(s(Z))]),default:t(()=>[o[29]||(o[29]=l("钱包管理",-1))]),_:1}),e(n,{key:"organization"},{icon:t(()=>[e(s(h))]),default:t(()=>[o[30]||(o[30]=l("组织管理",-1))]),_:1}),e(n,{key:"analytics"},{icon:t(()=>[e(s(ee))]),default:t(()=>[o[31]||(o[31]=l("使用分析",-1))]),_:1}),e(n,{key:"templates"},{icon:t(()=>[e(s(te))]),default:t(()=>[o[32]||(o[32]=l("模板中心",-1))]),_:1})]),_:1}),e(m,null,{title:t(()=>[...o[33]||(o[33]=[a("span",{class:"group-label"},"媒 体",-1)])]),default:t(()=>[e(n,{key:"video"},{icon:t(()=>[e(s(Ne))]),default:t(()=>[o[34]||(o[34]=l("视频剪辑",-1))]),_:1})]),_:1}),e(m,null,{title:t(()=>[...o[35]||(o[35]=[a("span",{class:"group-label"},"扩 展",-1)])]),default:t(()=>[e(n,{key:"rssfeed"},{icon:t(()=>[e(s(oe))]),default:t(()=>[o[36]||(o[36]=l("RSS 订阅",-1))]),_:1}),e(n,{key:"webauthn"},{icon:t(()=>[e(s(se))]),default:t(()=>[o[37]||(o[37]=l("身份认证",-1))]),_:1})]),_:1})],64))]),_:1},8,["selectedKeys","theme","inline-collapsed"]),a("div",{class:w(["sidebar-footer",{collapsed:u.value}])},[e(ke,{status:re.value},null,8,["status"]),u.value?T("",!0):(i(),r("span",Fe,v(ce.value),1))],2)]),_:1},8,["collapsed"]),e(N,{class:"main-area"},{default:t(()=>[e(ve,{class:"app-header"},{default:t(()=>[a("div",Ee,[a("div",{class:w(["scope-tag",p.value?"project":"global"])},[(i(),f(je(p.value?s(B):s(R)))),a("span",null,v(p.value?s(k).projectName||"项目":"全局模式"),1),p.value&&s(k).projectRoot?(i(),f(x,{key:0,title:s(k).projectRoot},{default:t(()=>[e(s(Ae),{class:"info-icon"})]),_:1},8,["title"])):T("",!0)],2)]),a("div",Ge,[a("div",We,[(i(!0),r(j,null,Se(s(Le),(_,C)=>(i(),f(x,{key:C,title:_.label},{default:t(()=>[a("button",{class:w(["theme-btn",{active:de.value===C}]),"data-theme-key":C,onClick:Je=>pe(C)},v(_.icon),11,ze)]),_:2},1032,["title"]))),128))]),a("span",He,v(s(ae)),1),e(fe,{color:O.value==="connected"?"green":O.value==="connecting"?"orange":"red",class:"ws-tag"},{default:t(()=>[l(v(O.value==="connected"?"已连接":O.value==="connecting"?"连接中":"断开"),1)]),_:1},8,["color"])])]),_:1}),e(be,{class:"page-content"},{default:t(()=>[e(ge)]),_:1})]),_:1})]),_:1})}}},et=xe($e,[["__scopeId","data-v-e509a844"]]);export{et as default};
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import{k as le,r as O,l as oe,M as ae,F as p,D as l,I as o,u as r,c as t,x as s,m as I,G as q,j as S,q as x,B as ne,v as i,J as m,N as J,H as P,L as j}from"./vendor-aH7YaPZi.js";import{u as W}from"./ws-BTS8ehTm.js";import{u as re}from"./chat-BNXQJRrX.js";import{_ as ie}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{q as ue,F as de,r as K,A as Q,M as X,s as ve,t as ce,a as Y,u as pe,b as me}from"./icons-DzieZiVh.js";function fe(){return{samples:0,compressedSamples:0,hitRate:0,totalSavedTokens:0,averageSavedTokens:0,totalOriginalTokens:0,totalCompressedTokens:0,netSavingsRate:0,variantDistribution:{},strategyDistribution:[],providerDistribution:[],modelDistribution:[]}}const ye=le("dashboard",()=>{const B=O(!1),E=O(!1),d=O({wsStatus:"disconnected",activeLlm:null,activeModel:null,skillCount:0,sessionCount:0,providerCount:0,appRunning:!1,setupDone:!1,edition:"",mcpCount:null,noteCount:null}),F=O(""),y=O(fe()),v=O({windowPreset:"all",provider:"",model:""});let _=null;function N(n=W()){_||(_=n.onRuntimeEvent(c=>{c.type==="compression:summary"?M(c.payload?.summary||{}):c.type==="session:start"?d.value.sessionCount=(d.value.sessionCount||0)+1:c.type==="session:end"&&(d.value.sessionCount=Math.max(0,(d.value.sessionCount||0)-1))}))}function A(){_&&(_(),_=null)}function M(n){y.value={...y.value,...n||{}}}function U(n){return n==="1h"?3600*1e3:n==="24h"?1440*60*1e3:n==="7d"?10080*60*1e3:null}function R(n){d.value.appRunning=n.includes("Desktop app running"),d.value.setupDone=n.includes("Setup completed");const c=n.match(/Edition:\s+(\S+)/i);c&&(d.value.edition=c[1]);const b=n.match(/LLM:\s+(\S+)\s+\(([^)]+)\)/i);if(b)d.value.activeLlm=b[1],d.value.activeModel=b[2];else{const k=n.match(/LLM:\s+(\S+)/i);k&&(d.value.activeLlm=k[1])}}async function f(){const n=W();N(n),E.value=!0;const c={type:"compression-stats",windowMs:U(v.value.windowPreset)};v.value.provider&&(c.provider=v.value.provider),v.value.model&&(c.model=v.value.model);try{const b=await n.sendRaw(c,1e4);M(b.summary||{})}catch{}finally{E.value=!1}}async function g(){const n=W();N(n),B.value=!0,d.value.wsStatus=n.status,F.value="";try{const[c,b]=await Promise.allSettled([n.execute("status",15e3),n.listSessions()]);if(c.status==="fulfilled"){const k=c.value.output;F.value=k.split(`
|
|
2
|
-
`).slice(0,20).join(`
|
|
3
|
-
`),R(k)}b.status==="fulfilled"&&(d.value.sessionCount=b.value.length),Promise.allSettled([n.execute("skill sources",15e3),n.execute("llm providers",15e3)]).then(([k,$])=>{if(k.status==="fulfilled"){const z=k.value.output.match(/(\d+)\s*(?:skills|技能)/i);z&&(d.value.skillCount=parseInt(z[1],10))}if($.status==="fulfilled"){const V=$.value.output.match(/active[:\s]+(\S+)/i);V&&!d.value.activeLlm&&(d.value.activeLlm=V[1])}}),n.execute("mcp servers",1e4).then(({output:k})=>{const $=(k.match(/^[a-z]/gm)||[]).length;d.value.mcpCount=$}).catch(()=>{d.value.mcpCount=0}),await f()}catch{}finally{B.value=!1}}return{loading:B,compressionLoading:E,stats:d,statusLog:F,compression:y,telemetryFilters:v,ensureRuntimeSubscription:N,stopRuntimeSubscription:A,refresh:g,refreshCompression:f,applyCompressionSummary:M,toWindowMs:U}}),_e={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"20px"}},ge={class:"page-sub"},be={style:{display:"flex","align-items":"center",gap:"12px","flex-wrap":"wrap"}},ke={style:{color:"#91caff","font-weight":"600"}},we={style:{color:"#4a6fa5","font-size":"11px","font-family":"monospace"}},Ce={class:"stat-header"},xe={class:"stat-sub"},Se={class:"stat-header"},he={class:"stat-value",style:{color:"#91caff","font-size":"15px",overflow:"hidden","text-overflow":"ellipsis","white-space":"nowrap"}},Re={class:"stat-sub",style:{overflow:"hidden","text-overflow":"ellipsis","white-space":"nowrap"}},$e={class:"stat-header"},ze={class:"stat-value",style:{color:"#1677ff"}},De={class:"stat-header"},Le={class:"stat-value",style:{color:"#c084fc"}},Me={class:"stat-header"},Te={class:"stat-sub"},Oe={class:"stat-header"},Pe={class:"stat-value",style:{color:"#13c2c2"}},je={class:"stat-header"},Ee={class:"stat-value",style:{color:"#faad14"}},Fe={class:"status-log"},Ne={class:"telemetry-filter"},Ae={class:"telemetry-filter"},Ie={class:"telemetry-filter"},Be={class:"telemetry-card"},Ue={class:"telemetry-value"},Ve={class:"telemetry-sub"},We={class:"telemetry-card"},Ge={class:"telemetry-value"},He={class:"telemetry-sub"},qe={class:"telemetry-card"},Je={class:"telemetry-value"},Ke={class:"telemetry-sub"},Qe={class:"telemetry-section"},Xe={key:0,class:"telemetry-empty"},Ye={key:1,class:"telemetry-list"},Ze={class:"telemetry-section"},et={key:0,class:"telemetry-empty"},tt={key:1,class:"telemetry-list"},st={class:"telemetry-section"},lt={key:0,class:"telemetry-empty"},ot={key:1,class:"telemetry-list"},at={class:"telemetry-section"},nt={key:0,class:"telemetry-empty"},rt={key:1,class:"telemetry-list"},it={style:{color:"#91caff"}},ut={style:{color:"var(--text-muted)","font-family":"monospace","font-size":"11px"}},dt={style:{color:"var(--text-secondary)","font-family":"monospace","font-size":"12px"}},vt={style:{color:"var(--text-muted)"}},ct={__name:"Dashboard",setup(B){const E=ne(),d=W(),F=re(),y=ye(),v=window.__CC_CONFIG__||{},_=S(()=>v.mode==="project"),N="v5.0.2.55",A=S(()=>d.status),M=S(()=>y.loading),U=S(()=>y.statusLog),R=S(()=>y.telemetryFilters),f=S(()=>y.compression),g=S(()=>y.stats),n=S(()=>Object.entries(f.value.variantDistribution||{})),c=S(()=>f.value.providerDistribution||[]),b=S(()=>f.value.modelDistribution||[]);async function k(){await y.refresh()}async function $(){await y.refreshCompression()}function z(w){return`${((w||0)*100).toFixed(1)}%`}async function V(){await F.createSession("agent"),E.push("/chat")}return oe(()=>{y.ensureRuntimeSubscription(d),setTimeout(k,300)}),ae(()=>{y.stopRuntimeSubscription()}),(w,e)=>{const D=x("a-button"),G=x("a-tag"),C=x("a-card"),Z=x("a-badge"),u=x("a-col"),h=x("a-row"),ee=x("a-space"),L=x("a-select-option"),H=x("a-select"),T=x("a-descriptions-item"),te=x("a-descriptions");return i(),p("div",null,[l("div",_e,[l("div",null,[e[13]||(e[13]=l("h2",{class:"page-title"},"仪表板",-1)),l("p",ge,o(_.value?`项目「${r(v).projectName||"未命名"}」运行概览`:"ChainlessChain 全局运行概览"),1)]),t(D,{type:"primary",ghost:"",loading:M.value,onClick:k},{icon:s(()=>[t(r(ue))]),default:s(()=>[e[14]||(e[14]=m(" 刷新 ",-1))]),_:1},8,["loading"])]),_.value?(i(),I(C,{key:0,style:{background:"rgba(22,119,255,.08)","border-color":"rgba(22,119,255,.25)","margin-bottom":"16px"},size:"small"},{default:s(()=>[l("div",be,[t(r(de),{style:{color:"#1677ff","font-size":"18px"}}),l("div",null,[l("div",ke,o(r(v).projectName||"项目"),1),l("div",we,o(r(v).projectRoot),1)]),t(G,{color:"blue",style:{"margin-left":"auto"}},{default:s(()=>[...e[15]||(e[15]=[m("项目面板",-1)])]),_:1})])]),_:1})):q("",!0),t(h,{gutter:[12,12],style:{"margin-bottom":"16px"}},{default:s(()=>[t(u,{xs:24,sm:12,lg:6},{default:s(()=>[t(C,{class:"stat-card gateway-card",size:"small"},{default:s(()=>[l("div",Ce,[e[16]||(e[16]=l("span",{class:"stat-label"},"WebSocket Gateway",-1)),t(Z,{status:A.value==="connected"?"success":"error"},null,8,["status"])]),l("div",{class:"stat-value",style:J({color:A.value==="connected"?"#52c41a":"#888"})},o(A.value==="connected"?"运行中":"未连接"),5),l("div",xe,"端口 "+o(r(v).wsPort||18800)+" · "+o(r(v).wsHost||"127.0.0.1"),1)]),_:1})]),_:1}),t(u,{xs:24,sm:12,lg:6},{default:s(()=>[t(C,{class:"stat-card",size:"small"},{default:s(()=>[l("div",Se,[e[17]||(e[17]=l("span",{class:"stat-label"},"当前 LLM",-1)),t(r(K),{style:{color:"#1677ff"}})]),l("div",he,o(g.value.activeLlm||"未配置"),1),l("div",Re,o(g.value.activeModel||"—"),1)]),_:1})]),_:1}),t(u,{xs:24,sm:12,lg:6},{default:s(()=>[t(C,{class:"stat-card",size:"small",style:{cursor:"pointer"},onClick:e[0]||(e[0]=a=>w.$router.push("/skills"))},{default:s(()=>[l("div",$e,[e[18]||(e[18]=l("span",{class:"stat-label"},"可用技能",-1)),t(r(Q),{style:{color:"#1677ff"}})]),l("div",ze,o(g.value.skillCount||"—"),1),e[19]||(e[19]=l("div",{class:"stat-sub"},"点击管理技能",-1))]),_:1})]),_:1}),t(u,{xs:24,sm:12,lg:6},{default:s(()=>[t(C,{class:"stat-card",size:"small",style:{cursor:"pointer"},onClick:e[1]||(e[1]=a=>w.$router.push("/chat"))},{default:s(()=>[l("div",De,[e[20]||(e[20]=l("span",{class:"stat-label"},"AI 会话",-1)),t(r(X),{style:{color:"#722ed1"}})]),l("div",Le,o(g.value.sessionCount),1),e[21]||(e[21]=l("div",{class:"stat-sub"},"点击进入对话",-1))]),_:1})]),_:1})]),_:1}),t(h,{gutter:[12,12],style:{"margin-bottom":"16px"}},{default:s(()=>[t(u,{xs:24,sm:8},{default:s(()=>[t(C,{class:"stat-card",size:"small"},{default:s(()=>[l("div",Me,[e[22]||(e[22]=l("span",{class:"stat-label"},"应用状态",-1)),t(r(ve),{style:J({color:g.value.appRunning?"#52c41a":"#888"})},null,8,["style"])]),l("div",{class:"stat-value",style:J({color:g.value.appRunning?"#52c41a":"#888",fontSize:"15px"})},o(g.value.appRunning?"运行中":g.value.setupDone?"已初始化":"未启动"),5),l("div",Te,o(g.value.edition||"Community")+" Edition",1)]),_:1})]),_:1}),t(u,{xs:24,sm:8},{default:s(()=>[t(C,{class:"stat-card",size:"small",style:{cursor:"pointer"},onClick:e[2]||(e[2]=a=>w.$router.push("/mcp"))},{default:s(()=>[l("div",Oe,[e[23]||(e[23]=l("span",{class:"stat-label"},"MCP 工具",-1)),t(r(ce),{style:{color:"#13c2c2"}})]),l("div",Pe,o(g.value.mcpCount??"—"),1),e[24]||(e[24]=l("div",{class:"stat-sub"},"已挂载扩展",-1))]),_:1})]),_:1}),t(u,{xs:24,sm:8},{default:s(()=>[t(C,{class:"stat-card",size:"small",style:{cursor:"pointer"},onClick:e[3]||(e[3]=a=>w.$router.push("/notes"))},{default:s(()=>[l("div",je,[e[25]||(e[25]=l("span",{class:"stat-label"},"知识库笔记",-1)),t(r(Y),{style:{color:"#faad14"}})]),l("div",Ee,o(g.value.noteCount??"—"),1),e[26]||(e[26]=l("div",{class:"stat-sub"},"点击管理笔记",-1))]),_:1})]),_:1})]),_:1}),t(h,{gutter:[16,16]},{default:s(()=>[t(u,{xs:24,lg:10},{default:s(()=>[t(C,{title:"快速操作",style:{background:"var(--bg-card)","border-color":"var(--border-color)",height:"100%"}},{default:s(()=>[t(ee,{direction:"vertical",style:{width:"100%"},size:"middle"},{default:s(()=>[t(D,{type:"primary",block:"",onClick:e[4]||(e[4]=a=>w.$router.push("/chat"))},{icon:s(()=>[t(r(X))]),default:s(()=>[m(" "+o(_.value?"进入项目 Chat":"新建 AI 对话"),1)]),_:1}),t(D,{block:"",onClick:V,style:{background:"rgba(114,46,209,.12)","border-color":"#722ed1",color:"#722ed1"}},{icon:s(()=>[t(r(K))]),default:s(()=>[e[27]||(e[27]=m(" 启动 Agent 模式 ",-1))]),_:1}),t(h,{gutter:8},{default:s(()=>[t(u,{span:12},{default:s(()=>[t(D,{block:"",onClick:e[5]||(e[5]=a=>w.$router.push("/services")),style:{background:"var(--bg-card-hover)","border-color":"var(--border-color)"}},{icon:s(()=>[t(r(pe))]),default:s(()=>[e[28]||(e[28]=m(" 服务管理 ",-1))]),_:1})]),_:1}),t(u,{span:12},{default:s(()=>[t(D,{block:"",onClick:e[6]||(e[6]=a=>w.$router.push("/logs")),style:{background:"var(--bg-card-hover)","border-color":"var(--border-color)"}},{icon:s(()=>[t(r(Y))]),default:s(()=>[e[29]||(e[29]=m(" 查看日志 ",-1))]),_:1})]),_:1})]),_:1}),t(h,{gutter:8},{default:s(()=>[t(u,{span:12},{default:s(()=>[t(D,{block:"",onClick:e[7]||(e[7]=a=>w.$router.push("/skills")),style:{background:"var(--bg-card-hover)","border-color":"var(--border-color)"}},{icon:s(()=>[t(r(Q))]),default:s(()=>[e[30]||(e[30]=m(" 技能管理 ",-1))]),_:1})]),_:1}),t(u,{span:12},{default:s(()=>[t(D,{block:"",onClick:e[8]||(e[8]=a=>w.$router.push("/providers")),style:{background:"var(--bg-card-hover)","border-color":"var(--border-color)"}},{icon:s(()=>[t(r(me))]),default:s(()=>[e[31]||(e[31]=m(" LLM 配置 ",-1))]),_:1})]),_:1})]),_:1})]),_:1})]),_:1})]),_:1}),t(u,{xs:24,lg:14},{default:s(()=>[t(C,{title:"最近状态",style:{background:"var(--bg-card)","border-color":"var(--border-color)"},loading:M.value},{extra:s(()=>[t(D,{type:"link",size:"small",onClick:e[9]||(e[9]=a=>w.$router.push("/logs"))},{default:s(()=>[...e[32]||(e[32]=[m("查看更多",-1)])]),_:1})]),default:s(()=>[l("pre",Fe,o(U.value||"点击刷新加载系统状态..."),1)]),_:1},8,["loading"])]),_:1})]),_:1}),t(C,{title:"压缩策略观测",style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-top":"16px"},loading:M.value},{default:s(()=>[t(h,{gutter:[12,12],style:{"margin-bottom":"12px"}},{default:s(()=>[t(u,{xs:24,md:8},{default:s(()=>[l("div",Ne,[e[37]||(e[37]=l("div",{class:"telemetry-filter-label"},"时间窗口",-1)),t(H,{value:R.value.windowPreset,"onUpdate:value":e[10]||(e[10]=a=>R.value.windowPreset=a),style:{width:"100%"},onChange:$},{default:s(()=>[t(L,{value:"all"},{default:s(()=>[...e[33]||(e[33]=[m("全部样本",-1)])]),_:1}),t(L,{value:"1h"},{default:s(()=>[...e[34]||(e[34]=[m("近 1 小时",-1)])]),_:1}),t(L,{value:"24h"},{default:s(()=>[...e[35]||(e[35]=[m("近 24 小时",-1)])]),_:1}),t(L,{value:"7d"},{default:s(()=>[...e[36]||(e[36]=[m("近 7 天",-1)])]),_:1})]),_:1},8,["value"])])]),_:1}),t(u,{xs:24,md:8},{default:s(()=>[l("div",Ae,[e[39]||(e[39]=l("div",{class:"telemetry-filter-label"},"Provider 切片",-1)),t(H,{value:R.value.provider,"onUpdate:value":e[11]||(e[11]=a=>R.value.provider=a),style:{width:"100%"},onChange:$},{default:s(()=>[t(L,{value:""},{default:s(()=>[...e[38]||(e[38]=[m("全部 Provider",-1)])]),_:1}),(i(!0),p(P,null,j(c.value,a=>(i(),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",Ie,[e[41]||(e[41]=l("div",{class:"telemetry-filter-label"},"Model 切片",-1)),t(H,{value:R.value.model,"onUpdate:value":e[12]||(e[12]=a=>R.value.model=a),style:{width:"100%"},onChange:$},{default:s(()=>[t(L,{value:""},{default:s(()=>[...e[40]||(e[40]=[m("全部 Model",-1)])]),_:1}),(i(!0),p(P,null,j(b.value,a=>(i(),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(h,{gutter:[12,12]},{default:s(()=>[t(u,{xs:24,sm:8},{default:s(()=>[l("div",Be,[e[42]||(e[42]=l("div",{class:"telemetry-label"},"压缩命中率",-1)),l("div",Ue,o(z(f.value.hitRate)),1),l("div",Ve,o(f.value.compressedSamples)+" / "+o(f.value.samples)+" 次压缩产生了有效节省 ",1)])]),_:1}),t(u,{xs:24,sm:8},{default:s(()=>[l("div",We,[e[43]||(e[43]=l("div",{class:"telemetry-label"},"累计节省 Token",-1)),l("div",Ge,o(f.value.totalSavedTokens),1),l("div",He,"平均每次 "+o(f.value.averageSavedTokens)+" Token",1)])]),_:1}),t(u,{xs:24,sm:8},{default:s(()=>[l("div",qe,[e[44]||(e[44]=l("div",{class:"telemetry-label"},"净节省率",-1)),l("div",Je,o(z(f.value.netSavingsRate)),1),l("div",Ke," 原始 "+o(f.value.totalOriginalTokens)+" -> 压缩后 "+o(f.value.totalCompressedTokens),1)])]),_:1})]),_:1}),t(h,{gutter:[16,16],style:{"margin-top":"12px"}},{default:s(()=>[t(u,{xs:24,lg:12},{default:s(()=>[l("div",Qe,[e[45]||(e[45]=l("div",{class:"telemetry-section-title"},"策略命中分布",-1)),f.value.strategyDistribution.length===0?(i(),p("div",Xe,"暂无压缩样本")):(i(),p("div",Ye,[(i(!0),p(P,null,j(f.value.strategyDistribution.slice(0,6),a=>(i(),p("div",{key:a.strategy,class:"telemetry-row"},[l("span",null,o(a.strategy),1),l("span",null,o(a.hits)+" 次 · "+o(z(a.hitRate)),1)]))),128))]))])]),_:1}),t(u,{xs:24,lg:12},{default:s(()=>[l("div",Ze,[e[46]||(e[46]=l("div",{class:"telemetry-section-title"},"变体分布",-1)),n.value.length===0?(i(),p("div",et,"暂无变体数据")):(i(),p("div",tt,[(i(!0),p(P,null,j(n.value,([a,se])=>(i(),p("div",{key:a,class:"telemetry-row"},[l("span",null,o(a),1),l("span",null,o(se)+" 次",1)]))),128))]))])]),_:1})]),_:1}),t(h,{gutter:[16,16],style:{"margin-top":"12px"}},{default:s(()=>[t(u,{xs:24,lg:12},{default:s(()=>[l("div",st,[e[47]||(e[47]=l("div",{class:"telemetry-section-title"},"Provider 切片",-1)),c.value.length===0?(i(),p("div",lt,"暂无 Provider 数据")):(i(),p("div",ot,[(i(!0),p(P,null,j(c.value.slice(0,6),a=>(i(),p("div",{key:a.key,class:"telemetry-row"},[l("span",null,o(a.key),1),l("span",null,o(a.samples)+" 次 · "+o(z(a.hitRate)),1)]))),128))]))])]),_:1}),t(u,{xs:24,lg:12},{default:s(()=>[l("div",at,[e[48]||(e[48]=l("div",{class:"telemetry-section-title"},"Model 切片",-1)),b.value.length===0?(i(),p("div",nt,"暂无 Model 数据")):(i(),p("div",rt,[(i(!0),p(P,null,j(b.value.slice(0,6),a=>(i(),p("div",{key:a.key,class:"telemetry-row"},[l("span",null,o(a.key),1),l("span",null,o(a.samples)+" 次 · "+o(a.savedTokens)+" saved",1)]))),128))]))])]),_:1})]),_:1})]),_:1},8,["loading"]),t(C,{title:"运行信息",style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-top":"16px"}},{default:s(()=>[t(te,{column:{xs:1,sm:2,lg:3},size:"small"},{default:s(()=>[t(T,{label:"面板模式"},{default:s(()=>[t(G,{color:_.value?"blue":"purple"},{default:s(()=>[m(o(_.value?"项目级":"全局"),1)]),_:1},8,["color"])]),_:1}),_.value?(i(),I(T,{key:0,label:"项目名称"},{default:s(()=>[l("span",it,o(r(v).projectName||"—"),1)]),_:1})):q("",!0),_.value?(i(),I(T,{key:1,label:"项目路径"},{default:s(()=>[l("span",ut,o(r(v).projectRoot),1)]),_:1})):q("",!0),t(T,{label:"WebSocket"},{default:s(()=>[l("span",dt," ws://"+o(r(v).wsHost||"127.0.0.1")+":"+o(r(v).wsPort||18800),1)]),_:1}),t(T,{label:"认证"},{default:s(()=>[t(G,{color:r(v).wsToken?"green":"default",style:{"font-size":"11px"}},{default:s(()=>[m(o(r(v).wsToken?"已启用":"未启用"),1)]),_:1},8,["color"])]),_:1}),t(T,{label:"版本"},{default:s(()=>[l("span",vt,o(r(N)),1)]),_:1})]),_:1})]),_:1})])}}},gt=ie(ct,[["__scopeId","data-v-ab1b4e86"]]);export{gt as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{P as f}from"./index-U4Zd5IK6.js";import{i as c,j as l,p as g,d as p,a0 as m,l as C,w as v,a1 as x,n as P,c as h,V as R}from"./vendor-aH7YaPZi.js";function S(e){let{prefixCls:s,animation:t,transitionName:o}=e;return t?{name:`${s}-${t}`}:o?{name:o}:{}}const u=Symbol("PortalContextKey"),T=function(e){let s=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{inTriggerContext:!0};g(u,{inTriggerContext:s.inTriggerContext,shouldRender:l(()=>{const{sPopupVisible:t,popupRef:o,forceRender:n,autoDestroy:r}=e||{};let i=!1;return(t||o||n)&&(i=!0),!t&&r&&(i=!1),i})})},y=()=>{T({},{inTriggerContext:!1});const e=c(u,{shouldRender:l(()=>!1),inTriggerContext:!1});return{shouldRender:l(()=>e.shouldRender.value||e.inTriggerContext===!1)}},U=p({compatConfig:{MODE:3},name:"Portal",inheritAttrs:!1,props:{getContainer:f.func.isRequired,didUpdate:Function},setup(e,s){let{slots:t}=s,o=!0,n;const{shouldRender:r}=y();function i(){r.value&&(n=e.getContainer())}m(()=>{o=!1,i()}),C(()=>{n||i()});const d=v(r,()=>{r.value&&!n&&(n=e.getContainer()),n&&d()});return x(()=>{P(()=>{var a;r.value&&((a=e.didUpdate)===null||a===void 0||a.call(e,e))})}),()=>{var a;return r.value?o?(a=t.default)===null||a===void 0?void 0:a.call(t):n?h(R,{to:n},t):null:null}}});export{U as P,S as g,T as u};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{k as F,r as $,j as I,l as P,M as R,F as d,D as f,c as o,x as l,u as s,m as T,G as b,q as _,v as r,J as g,I as u,H as A,L as V}from"./vendor-aH7YaPZi.js";import{u as B}from"./ws-BTS8ehTm.js";import{_ as L}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{q}from"./icons-DzieZiVh.js";const E=F("tasks",()=>{const v=$([]),t=$(!1);let w=null,k=null;const S=I(()=>v.value.filter(e=>e.status==="running")),x=I(()=>v.value.filter(e=>e.status==="pending")),i=I(()=>v.value.filter(e=>e.status==="completed"||e.status==="failed"||e.status==="timeout"));async function a(){const e=B();t.value=!0;try{const p=await e.sendRaw({type:"tasks-list"});p&&Array.isArray(p.tasks)&&(v.value=p.tasks)}catch{}finally{t.value=!1}}async function N(e){const p=B();try{await p.sendRaw({type:"tasks-stop",taskId:e})}catch{}finally{await a()}}const C=$(null);function z(e=5e3){y(),a(),w=setInterval(a,e),m()}function y(){w&&(clearInterval(w),w=null),k&&(k(),k=null)}function m(){const e=B();if(k)return;const p=n=>{n.type==="task:notification"&&n.payload?.task&&(C.value=n.payload.task,a(),setTimeout(()=>{C.value=null},8e3))};k=e.onRuntimeEvent(p)}function h(e){return!e||e<0?"-":e<1e3?`${e}ms`:e<6e4?`${(e/1e3).toFixed(1)}s`:`${(e/6e4).toFixed(1)}m`}function D(e){switch(e){case"running":return"processing";case"pending":return"default";case"completed":return"success";case"failed":return"error";case"timeout":return"warning";default:return"default"}}return{tasks:v,loading:t,running:S,pending:x,completed:i,lastNotification:C,fetchTasks:a,stopTask:N,startPolling:z,stopPolling:y,formatDuration:h,getStatusColor:D}}),M={class:"page-header"},U={key:0,class:"error-text"},j={key:1},G={class:"task-header"},H={class:"task-desc"},J={class:"task-id"},O={class:"task-meta"},W=["title"],K={key:0,class:"error-text"},Q={key:1,class:"success-text"},X={key:2,class:"muted-text"},Y={__name:"Tasks",setup(v){const t=E(),w=[{title:"状态",key:"status",width:90},{title:"描述",key:"description",ellipsis:!0},{title:"类型",dataIndex:"type",width:100},{title:"耗时",key:"duration",width:90},{title:"创建时间",key:"createdAt",width:180},{title:"结果",key:"result",ellipsis:!0},{title:"操作",key:"action",width:80}];function k(i){return i.status==="running"&&i.startedAt?t.formatDuration(Date.now()-i.startedAt):i.completedAt&&i.startedAt?t.formatDuration(i.completedAt-i.startedAt):"-"}function S(i){return i?new Date(i).toLocaleString():"-"}function x(i,a){return i?i.length>a?`${i.slice(0,a)}...`:i:""}return P(()=>t.startPolling(5e3)),R(()=>t.stopPolling()),(i,a)=>{const N=_("a-button"),C=_("a-space"),z=_("a-alert"),y=_("a-statistic"),m=_("a-card"),h=_("a-col"),D=_("a-row"),e=_("a-tag"),p=_("a-table");return r(),d("div",null,[f("div",M,[a[3]||(a[3]=f("div",null,[f("h2",{class:"page-title"},"后台任务"),f("p",{class:"page-sub"},"查看后台任务队列、实时通知和任务执行结果。")],-1)),o(C,null,{default:l(()=>[o(N,{ghost:"",loading:s(t).loading,onClick:a[0]||(a[0]=n=>s(t).fetchTasks())},{icon:l(()=>[o(s(q))]),default:l(()=>[a[2]||(a[2]=g(" 刷新 ",-1))]),_:1},8,["loading"])]),_:1})]),s(t).lastNotification?(r(),T(z,{key:0,type:s(t).lastNotification.status==="completed"?"success":"error","show-icon":"",closable:"",class:"banner",onClose:a[1]||(a[1]=n=>s(t).lastNotification=null)},{message:l(()=>[g(" 任务"+u(s(t).lastNotification.status==="completed"?"完成":"结束")+": "+u(s(t).lastNotification.description||s(t).lastNotification.id.slice(0,16)),1)]),description:l(()=>[s(t).lastNotification.error?(r(),d("span",U,u(s(t).lastNotification.error),1)):s(t).lastNotification.result?(r(),d("span",j,u(x(String(s(t).lastNotification.result),120)),1)):b("",!0)]),_:1},8,["type"])):b("",!0),o(D,{gutter:[16,16],class:"stats-row"},{default:l(()=>[o(h,{xs:12,sm:6},{default:l(()=>[o(m,{class:"stat-card",size:"small"},{default:l(()=>[o(y,{title:"全部任务",value:s(t).tasks.length},null,8,["value"])]),_:1})]),_:1}),o(h,{xs:12,sm:6},{default:l(()=>[o(m,{class:"stat-card",size:"small"},{default:l(()=>[o(y,{title:"运行中",value:s(t).running.length},null,8,["value"])]),_:1})]),_:1}),o(h,{xs:12,sm:6},{default:l(()=>[o(m,{class:"stat-card",size:"small"},{default:l(()=>[o(y,{title:"等待中",value:s(t).pending.length},null,8,["value"])]),_:1})]),_:1}),o(h,{xs:12,sm:6},{default:l(()=>[o(m,{class:"stat-card",size:"small"},{default:l(()=>[o(y,{title:"已完成",value:s(t).completed.length},null,8,["value"])]),_:1})]),_:1})]),_:1}),s(t).running.length>0?(r(),T(m,{key:1,title:"运行中的任务",class:"panel-card",size:"small"},{default:l(()=>[(r(!0),d(A,null,V(s(t).running,n=>(r(),d("div",{key:n.id,class:"task-item running"},[f("div",G,[o(e,{color:s(t).getStatusColor(n.status)},{default:l(()=>[g(u(n.status.toUpperCase()),1)]),_:2},1032,["color"]),f("span",H,u(n.description),1),f("span",J,u(n.id.slice(0,16)),1)]),f("div",O,[f("span",null,"类型: "+u(n.type||"-"),1),f("span",null,"已运行: "+u(s(t).formatDuration(Date.now()-n.startedAt)),1),o(N,{size:"small",danger:"",onClick:c=>s(t).stopTask(n.id)},{default:l(()=>[...a[4]||(a[4]=[g("停止",-1)])]),_:1},8,["onClick"])])]))),128))]),_:1})):b("",!0),o(m,{class:"panel-card"},{default:l(()=>[o(p,{columns:w,"data-source":s(t).tasks,pagination:{pageSize:15,size:"small"},loading:s(t).loading,"row-key":"id",size:"small"},{bodyCell:l(({column:n,record:c})=>[n.key==="status"?(r(),T(e,{key:0,color:s(t).getStatusColor(c.status)},{default:l(()=>[g(u(c.status),1)]),_:2},1032,["color"])):n.key==="description"?(r(),d("span",{key:1,title:c.command},u(c.description),9,W)):n.key==="duration"?(r(),d(A,{key:2},[g(u(k(c)),1)],64)):n.key==="createdAt"?(r(),d(A,{key:3},[g(u(S(c.createdAt)),1)],64)):n.key==="result"?(r(),d(A,{key:4},[c.error?(r(),d("span",K,u(x(c.error,60)),1)):c.result?(r(),d("span",Q,u(x(String(c.result),60)),1)):(r(),d("span",X,"-"))],64)):n.key==="action"?(r(),d(A,{key:5},[c.status==="running"?(r(),T(N,{key:0,size:"small",danger:"",onClick:Z=>s(t).stopTask(c.id)},{default:l(()=>[...a[5]||(a[5]=[g(" 停止 ",-1)])]),_:1},8,["onClick"])):b("",!0)],64)):b("",!0)]),_:1},8,["data-source","loading"])]),_:1})])}}},nt=L(Y,[["__scopeId","data-v-c8e3e605"]]);export{nt as default};
|