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.
Files changed (138) hide show
  1. package/bin/chainlesschain.js +0 -0
  2. package/package.json +2 -2
  3. package/src/assets/web-panel/.build-hash +1 -1
  4. package/src/assets/web-panel/assets/{ActionButton-CCj9oE5_.js → ActionButton-CNyKzbBw.js} +1 -1
  5. package/src/assets/web-panel/assets/{Analytics-RMqXlyHE.js → Analytics-BZUBYH80.js} +2 -2
  6. package/src/assets/web-panel/assets/AppLayout-Cvl5XUEL.js +1 -0
  7. package/src/assets/web-panel/assets/AppLayout-DbK0-so_.css +1 -0
  8. package/src/assets/web-panel/assets/{Backup-bes7wE_k.js → Backup-CyZlJ_l8.js} +1 -1
  9. package/src/assets/web-panel/assets/{BaseInput-BKgAovqI.js → BaseInput-Ck9Kjams.js} +1 -1
  10. package/src/assets/web-panel/assets/{Chat-Duckao6i.js → Chat-DyoI0cWX.js} +2 -2
  11. package/src/assets/web-panel/assets/{Checkbox-BaBBUZnH.js → Checkbox-yEvLzLd8.js} +1 -1
  12. package/src/assets/web-panel/assets/{Col-B6iQKzFs.js → Col-CQ11Dnmt.js} +1 -1
  13. package/src/assets/web-panel/assets/Community-Ccn1BYio.js +3 -0
  14. package/src/assets/web-panel/assets/Community-DqDfLQui.css +1 -0
  15. package/src/assets/web-panel/assets/{Compact-Fwt0CbI5.js → Compact-Bmf5Cuzh.js} +1 -1
  16. package/src/assets/web-panel/assets/{Cowork-DNy50_Cp.js → Cowork-CbAGA5A5.js} +3 -3
  17. package/src/assets/web-panel/assets/{Cron-CBREJypB.js → Cron-CwbLFJdF.js} +2 -2
  18. package/src/assets/web-panel/assets/DID-BDvsVa08.css +1 -0
  19. package/src/assets/web-panel/assets/DID-Bz-Q7RAn.js +2 -0
  20. package/src/assets/web-panel/assets/Dashboard-DxyAGNxR.js +3 -0
  21. package/src/assets/web-panel/assets/{Dropdown-B3vdFzOi.js → Dropdown-B3gLO6AH.js} +1 -1
  22. package/src/assets/web-panel/assets/{FormItemContext-RYn2zMn5.js → FormItemContext-DR8WMkWL.js} +1 -1
  23. package/src/assets/web-panel/assets/{Git-7TolKe3c.js → Git-Bo6SJajL.js} +2 -2
  24. package/src/assets/web-panel/assets/{KnowledgeGraph-4b9v3wYV.js → KnowledgeGraph-Dr7X3CJz.js} +1 -1
  25. package/src/assets/web-panel/assets/{Logs-BZgM3Q4b.js → Logs-BNA4XGT-.js} +2 -2
  26. package/src/assets/web-panel/assets/{McpTools-5Wrif1R_.js → McpTools-D10LT5nQ.js} +2 -2
  27. package/src/assets/web-panel/assets/{Memory-D8YRnt51.js → Memory-BpGVVsGn.js} +2 -2
  28. package/src/assets/web-panel/assets/{Notes-CWTUG8hk.js → Notes-DRwg9537.js} +2 -2
  29. package/src/assets/web-panel/assets/{Organization-DvJzrIES.js → Organization-DcyIwloj.js} +4 -4
  30. package/src/assets/web-panel/assets/{Overflow-tpvXbZkh.js → Overflow-MuWktKcP.js} +1 -1
  31. package/src/assets/web-panel/assets/{OverrideContext-9ePmgwvW.js → OverrideContext-D01nzvZl.js} +1 -1
  32. package/src/assets/web-panel/assets/{P2P-C-AoKbTs.js → P2P-Ci1QXDFH.js} +2 -2
  33. package/src/assets/web-panel/assets/{Permissions-cIclKlQB.js → Permissions-Rdt6O8t8.js} +3 -3
  34. package/src/assets/web-panel/assets/Portal-CARXcQZJ.js +1 -0
  35. package/src/assets/web-panel/assets/ProjectSettings-DhYrRsiw.js +2 -0
  36. package/src/assets/web-panel/assets/ProjectSettings-pLSae-wy.css +1 -0
  37. package/src/assets/web-panel/assets/{Projects-CDKdsdit.js → Projects-BHSVUn-P.js} +2 -2
  38. package/src/assets/web-panel/assets/{Providers-C33u4Mka.js → Providers-D7Yf3Eh5.js} +2 -2
  39. package/src/assets/web-panel/assets/{Row-DVscVTtp.js → Row-C4W6kn-O.js} +1 -1
  40. package/src/assets/web-panel/assets/{RssFeed-CGC4w7VD.js → RssFeed-BRRNqE6z.js} +3 -3
  41. package/src/assets/web-panel/assets/{Security-ymR0We-P.js → Security-yVk1t4NG.js} +3 -3
  42. package/src/assets/web-panel/assets/{Services-Gydt4uVC.js → Services-DqtefZh8.js} +2 -2
  43. package/src/assets/web-panel/assets/{Skeleton-CfLdvEpu.js → Skeleton-B8DP7HAQ.js} +1 -1
  44. package/src/assets/web-panel/assets/{Skills-C_SrPIFZ.js → Skills-Dm_T9KJy.js} +1 -1
  45. package/src/assets/web-panel/assets/Tasks-C66psb8Z.js +1 -0
  46. package/src/assets/web-panel/assets/{Templates-Bj1wDexb.js → Templates-BEnkhJFe.js} +1 -1
  47. package/src/assets/web-panel/assets/Trigger-BHYwMCjE.js +1 -0
  48. package/src/assets/web-panel/assets/{VideoEditing-CQOwjQFu.js → VideoEditing-DucGsoXn.js} +1 -1
  49. package/src/assets/web-panel/assets/{Wallet-0kSZ-ENs.js → Wallet-BEnL0gxM.js} +4 -4
  50. package/src/assets/web-panel/assets/{WebAuthn-CrZlAr6l.js → WebAuthn-BZ3njvle.js} +5 -5
  51. package/src/assets/web-panel/assets/{WorkflowEditor-DbdF8700.js → WorkflowEditor-DNG6cJRJ.js} +1 -1
  52. package/src/assets/web-panel/assets/{chat-BNXQJRrX.js → chat-DK35BNpC.js} +1 -1
  53. package/src/assets/web-panel/assets/{collapseMotion-CSS8MlIE.js → collapseMotion-D_K_bBA2.js} +1 -1
  54. package/src/assets/web-panel/assets/{colors-BgoKrIXh.js → colors-CruxFUlV.js} +1 -1
  55. package/src/assets/web-panel/assets/{compact-item-COAuztwB.js → compact-item-DGL0Q_YX.js} +1 -1
  56. package/src/assets/web-panel/assets/{createContext-BTceykzK.js → createContext-Z0XEM4Cq.js} +1 -1
  57. package/src/assets/web-panel/assets/{hasIn-BNooGgXx.js → hasIn-Km8uZit7.js} +1 -1
  58. package/src/assets/web-panel/assets/icons-C40taSZA.js +57 -0
  59. package/src/assets/web-panel/assets/{index-C7uW3zj4.js → index--i0DkVXq.js} +3 -3
  60. package/src/assets/web-panel/assets/{index-Cf1n_3VC.js → index-3KWzfh6j.js} +1 -1
  61. package/src/assets/web-panel/assets/index-5Jby7AnF.js +1 -0
  62. package/src/assets/web-panel/assets/index-93dWGD7J.js +1 -0
  63. package/src/assets/web-panel/assets/{index-vHj3UTBK.js → index-B0iFuZHn.js} +1 -1
  64. package/src/assets/web-panel/assets/{index-DC-nDpH_.js → index-BDw_V2Ts.js} +2 -2
  65. package/src/assets/web-panel/assets/index-BGsbbo5Y.js +1 -0
  66. package/src/assets/web-panel/assets/{index-BLzkplpf.js → index-BO1I7Jar.js} +1 -1
  67. package/src/assets/web-panel/assets/{index-KEQgDCwj.js → index-BhFkrt3P.js} +3 -3
  68. package/src/assets/web-panel/assets/{index-CpFrvhnj.js → index-BqOFRJpD.js} +1 -1
  69. package/src/assets/web-panel/assets/{index-DnoNK5Gb.js → index-But1z4eV.js} +1 -1
  70. package/src/assets/web-panel/assets/{index-81NIDNcI.js → index-C0ngZOEr.js} +1 -1
  71. package/src/assets/web-panel/assets/index-C6qy-Zu-.js +1 -0
  72. package/src/assets/web-panel/assets/{index-DDgwb3KP.js → index-C9UU-ZOL.js} +1 -1
  73. package/src/assets/web-panel/assets/{index-cF6gfPY3.js → index-CGvUENNM.js} +1 -1
  74. package/src/assets/web-panel/assets/{index-Bjf02LQY.js → index-CR7JroGW.js} +2 -2
  75. package/src/assets/web-panel/assets/{index-D5wFryiJ.js → index-CWjdRkPO.js} +2 -2
  76. package/src/assets/web-panel/assets/index-CWvztGRz.js +1 -0
  77. package/src/assets/web-panel/assets/index-CoBBNzIM.js +55 -0
  78. package/src/assets/web-panel/assets/index-Crtf8JqT.js +3 -0
  79. package/src/assets/web-panel/assets/{index-BEbmwv5T.js → index-D2IHkqnY.js} +3 -3
  80. package/src/assets/web-panel/assets/{index-BMU9I-F6.js → index-D7hqt7jp.js} +1 -1
  81. package/src/assets/web-panel/assets/{index-BAPulPv1.js → index-D7vymjCu.js} +1 -1
  82. package/src/assets/web-panel/assets/index-DApPTzuh.js +1 -0
  83. package/src/assets/web-panel/assets/index-DFJYxODK.js +1 -0
  84. package/src/assets/web-panel/assets/{index-C1BBkQIj.js → index-DHWpBglQ.js} +1 -1
  85. package/src/assets/web-panel/assets/{index-eVLTVVvL.js → index-DR4nFehS.js} +1 -1
  86. package/src/assets/web-panel/assets/{index-nw5SqpgZ.js → index-Dgiq6kNf.js} +2 -2
  87. package/src/assets/web-panel/assets/{index-CjOtB4wg.js → index-DoHOmopo.js} +3 -3
  88. package/src/assets/web-panel/assets/index-DoSx4Q_p.js +1 -0
  89. package/src/assets/web-panel/assets/{index-Z9wFemG0.js → index-DuQBpo_N.js} +2 -2
  90. package/src/assets/web-panel/assets/{index-D6w1kIHg.js → index-N7lOpMHe.js} +1 -1
  91. package/src/assets/web-panel/assets/{index-lrfnKtkl.js → index-ROop7jDs.js} +1 -1
  92. package/src/assets/web-panel/assets/index-bUf23fPj.js +1 -0
  93. package/src/assets/web-panel/assets/{index-Z5CuKqcS.js → index-g30p4eci.js} +1 -1
  94. package/src/assets/web-panel/assets/{index-g7FAcG7B.js → index-pbblwkTP.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-D1SCFE25.js → index-vfJ5N9Wn.js} +2 -2
  96. package/src/assets/web-panel/assets/index-xcQ2VcES.js +36 -0
  97. package/src/assets/web-panel/assets/{initDefaultProps-_t-PG0bz.js → initDefaultProps-eEPfzAfC.js} +1 -1
  98. package/src/assets/web-panel/assets/{motion-DPnqtODq.js → motion-xnRaf7sL.js} +3 -3
  99. package/src/assets/web-panel/assets/{move-kO9NQRyb.js → move-CpDkwenV.js} +1 -1
  100. package/src/assets/web-panel/assets/{omit-DD9MqVt0.js → omit-B7Nb8KI8.js} +1 -1
  101. package/src/assets/web-panel/assets/{pickAttrs-D4u5AYq1.js → pickAttrs-BYHnT8J9.js} +1 -1
  102. package/src/assets/web-panel/assets/{placementArrow-BUkUxlJc.js → placementArrow-lfdL5TRx.js} +1 -1
  103. package/src/assets/web-panel/assets/{responsiveObserve-DA_o8FHw.js → responsiveObserve-CMAMO-tl.js} +1 -1
  104. package/src/assets/web-panel/assets/{slide-DSmAtCrK.js → slide-Dr-GHujf.js} +1 -1
  105. package/src/assets/web-panel/assets/{statusUtils-Bn00xQ4D.js → statusUtils-CGJ1hNOe.js} +1 -1
  106. package/src/assets/web-panel/assets/{styleChecker-phGTLjuN.js → styleChecker-jwEBpTKF.js} +1 -1
  107. package/src/assets/web-panel/assets/{transition-exl3w1iN.js → transition-gUK896vh.js} +1 -1
  108. package/src/assets/web-panel/assets/{useConfigInject-C2E3Qsop.js → useConfigInject-DBxKPWDc.js} +2 -2
  109. package/src/assets/web-panel/assets/useFlexGapSupport-CckP5k1m.js +1 -0
  110. package/src/assets/web-panel/assets/{useMergedState-DUMpRiCy.js → useMergedState-BUoJnBiL.js} +1 -1
  111. package/src/assets/web-panel/assets/{useRefs-C8A7zAB_.js → useRefs-XiBYSxE0.js} +1 -1
  112. package/src/assets/web-panel/assets/{useState-CSbzOa8O.js → useState-E1W-GoWe.js} +1 -1
  113. package/src/assets/web-panel/assets/{vendor-aH7YaPZi.js → vendor-xFZ6Jlpw.js} +1 -1
  114. package/src/assets/web-panel/assets/{vnode-CIbqhcnZ.js → vnode-Dcul1jVV.js} +1 -1
  115. package/src/assets/web-panel/assets/{ws-BTS8ehTm.js → ws-Dg01CdRG.js} +1 -1
  116. package/src/assets/web-panel/assets/{zoom-Ck9WbYsZ.js → zoom-DaF2prgS.js} +1 -1
  117. package/src/assets/web-panel/index.html +3 -3
  118. package/src/commands/db.js +317 -1
  119. package/src/assets/web-panel/assets/AppLayout-CSmBboZB.css +0 -1
  120. package/src/assets/web-panel/assets/AppLayout-CV6gWn1r.js +0 -1
  121. package/src/assets/web-panel/assets/Dashboard-DnJ1aZvj.js +0 -3
  122. package/src/assets/web-panel/assets/Portal-DXIqogG2.js +0 -1
  123. package/src/assets/web-panel/assets/Tasks-BchvT4YD.js +0 -1
  124. package/src/assets/web-panel/assets/Trigger-CIW_GVYA.js +0 -1
  125. package/src/assets/web-panel/assets/icons-DzieZiVh.js +0 -57
  126. package/src/assets/web-panel/assets/index-4C1c4hkZ.js +0 -36
  127. package/src/assets/web-panel/assets/index-B7gZm05C.js +0 -1
  128. package/src/assets/web-panel/assets/index-BRBeeCRz.js +0 -3
  129. package/src/assets/web-panel/assets/index-BbBjevdP.js +0 -1
  130. package/src/assets/web-panel/assets/index-Bn7dXbEh.js +0 -1
  131. package/src/assets/web-panel/assets/index-BqJS8Rje.js +0 -1
  132. package/src/assets/web-panel/assets/index-C4YPr8e8.js +0 -1
  133. package/src/assets/web-panel/assets/index-CZ3YetO8.js +0 -1
  134. package/src/assets/web-panel/assets/index-DYDvGZbQ.js +0 -1
  135. package/src/assets/web-panel/assets/index-DbxkO9Uy.js +0 -1
  136. package/src/assets/web-panel/assets/index-DeN7D3FZ.js +0 -1
  137. package/src/assets/web-panel/assets/index-O-dqdn3q.js +0 -55
  138. 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-aH7YaPZi.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
+ 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-DPnqtODq.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),{[`
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-4C1c4hkZ.js"></script>
12
- <link rel="modulepreload" crossorigin href="./assets/vendor-aH7YaPZi.js">
13
- <link rel="modulepreload" crossorigin href="./assets/icons-DzieZiVh.js">
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>
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Database management commands
3
- * chainlesschain db init|info|backup|restore|migrate
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};