chainlesschain 0.157.1 → 0.157.3

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 (137) hide show
  1. package/package.json +1 -1
  2. package/src/assets/web-panel/.build-hash +1 -1
  3. package/src/assets/web-panel/assets/{ActionButton-Dp5EHuSs.js → ActionButton-mV_H2ZBW.js} +1 -1
  4. package/src/assets/web-panel/assets/{Analytics-Dt69R7IX.js → Analytics-GW0Daj2c.js} +1 -1
  5. package/src/assets/web-panel/assets/AppLayout-CILzvZ4I.css +1 -0
  6. package/src/assets/web-panel/assets/AppLayout-DznHOSmD.js +1 -0
  7. package/src/assets/web-panel/assets/Backup-BP13XrWC.js +1 -0
  8. package/src/assets/web-panel/assets/{BaseInput-CMHSpW6z.js → BaseInput-BAFrPrGk.js} +1 -1
  9. package/src/assets/web-panel/assets/{Chat-DQusK0UJ.js → Chat-D6KtPMGk.js} +2 -2
  10. package/src/assets/web-panel/assets/{Checkbox-DXQE64jQ.js → Checkbox-xnGUwzCJ.js} +1 -1
  11. package/src/assets/web-panel/assets/{Col-GesfSTFv.js → Col-BVK4mypO.js} +1 -1
  12. package/src/assets/web-panel/assets/Community-CreqDQST.js +1 -0
  13. package/src/assets/web-panel/assets/Community-DqDfLQui.css +1 -0
  14. package/src/assets/web-panel/assets/{Compact-DOVOXT5H.js → Compact-HV2KpdeM.js} +1 -1
  15. package/src/assets/web-panel/assets/{Cowork-BaJ4irYi.js → Cowork-BIhVZQdQ.js} +3 -3
  16. package/src/assets/web-panel/assets/{Cron-DLx6zElQ.js → Cron-ZYoqq3dP.js} +2 -2
  17. package/src/assets/web-panel/assets/{DID-O2dY9RPB.js → DID-Dzs7_3Ix.js} +2 -2
  18. package/src/assets/web-panel/assets/{Dashboard-BReDcgB_.js → Dashboard-DpWD0jBe.js} +1 -1
  19. package/src/assets/web-panel/assets/{Dropdown-O-lFvQpB.js → Dropdown-BhJQ7ase.js} +1 -1
  20. package/src/assets/web-panel/assets/{FormItemContext-Dld2C8JQ.js → FormItemContext-D0BWmaoR.js} +1 -1
  21. package/src/assets/web-panel/assets/{Git-hvFWgySH.js → Git-bXqWPH2a.js} +1 -1
  22. package/src/assets/web-panel/assets/{KnowledgeGraph-B_y3Ap4i.js → KnowledgeGraph-CHwQzfXh.js} +1 -1
  23. package/src/assets/web-panel/assets/{Logs-DhFPaoDT.js → Logs-pjiNzTno.js} +1 -1
  24. package/src/assets/web-panel/assets/Marketplace-B-4uYu_j.css +1 -0
  25. package/src/assets/web-panel/assets/Marketplace-Dyfg9_ug.js +1 -0
  26. package/src/assets/web-panel/assets/{McpTools-D0XTOWu9.js → McpTools-Bltof0JN.js} +2 -2
  27. package/src/assets/web-panel/assets/{Memory-DW_B6rnE.js → Memory-ClxOtILG.js} +2 -2
  28. package/src/assets/web-panel/assets/{Notes-BbyhsweS.js → Notes-DkAhw9_e.js} +2 -2
  29. package/src/assets/web-panel/assets/{Organization-CChT-ntv.js → Organization-DddzeMd6.js} +3 -3
  30. package/src/assets/web-panel/assets/{Overflow-CZx2xJzC.js → Overflow-CZY_3usr.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-CwaXSJZR.js → P2P-Buux_Lgw.js} +2 -2
  33. package/src/assets/web-panel/assets/{Permissions-D5U7ha3z.js → Permissions-Cqn9Jeuf.js} +4 -4
  34. package/src/assets/web-panel/assets/Portal-CARXcQZJ.js +1 -0
  35. package/src/assets/web-panel/assets/{ProjectSettings-BQX5tF8E.js → ProjectSettings-BQPrAum5.js} +1 -1
  36. package/src/assets/web-panel/assets/{Projects-CLL9WS2z.js → Projects-BEbAmoTM.js} +2 -2
  37. package/src/assets/web-panel/assets/{Providers-fjohdAMK.js → Providers-CYeQV4vn.js} +1 -1
  38. package/src/assets/web-panel/assets/{Row-C-bX9EFG.js → Row-DfL3PHtV.js} +1 -1
  39. package/src/assets/web-panel/assets/RssFeed-DI5F5RaQ.js +3 -0
  40. package/src/assets/web-panel/assets/{Security-DXW6YBaw.js → Security-Dvn_envm.js} +3 -3
  41. package/src/assets/web-panel/assets/{Services-BnNYoCwx.js → Services-CuaENMDT.js} +2 -2
  42. package/src/assets/web-panel/assets/{Skeleton-B-K9_08N.js → Skeleton-DZIDyklE.js} +1 -1
  43. package/src/assets/web-panel/assets/{Skills-DB8Qba_i.js → Skills-BkPNofwG.js} +1 -1
  44. package/src/assets/web-panel/assets/{Tasks-0fHss8Sn.js → Tasks-h03UxSCR.js} +1 -1
  45. package/src/assets/web-panel/assets/{Templates-Cfch0kkR.js → Templates-B1OanGmU.js} +1 -1
  46. package/src/assets/web-panel/assets/Trigger-CyX3zvNU.js +1 -0
  47. package/src/assets/web-panel/assets/{VideoEditing-CiTgOTo4.js → VideoEditing-CJHLV59r.js} +1 -1
  48. package/src/assets/web-panel/assets/{Wallet-BQiQ4WyF.js → Wallet-GwRmIUiB.js} +4 -4
  49. package/src/assets/web-panel/assets/{WebAuthn-Dq27qj5Y.js → WebAuthn-CZ_q_1nf.js} +5 -5
  50. package/src/assets/web-panel/assets/{WorkflowEditor-BSXLy_fi.js → WorkflowEditor--0SM6yv0.js} +1 -1
  51. package/src/assets/web-panel/assets/{chat-BNXQJRrX.js → chat-DK35BNpC.js} +1 -1
  52. package/src/assets/web-panel/assets/{collapseMotion-CSS8MlIE.js → collapseMotion-D_K_bBA2.js} +1 -1
  53. package/src/assets/web-panel/assets/{colors-CHcJ8oqQ.js → colors-ZsSPXEpx.js} +1 -1
  54. package/src/assets/web-panel/assets/community-parser-CO25nZFt.js +3 -0
  55. package/src/assets/web-panel/assets/{compact-item-BIM24cFh.js → compact-item-CwFgypMe.js} +1 -1
  56. package/src/assets/web-panel/assets/{createContext-yGfIqyCQ.js → createContext-CXDfCmTY.js} +1 -1
  57. package/src/assets/web-panel/assets/{hasIn-BXMsXiz7.js → hasIn-CuA5Qv5d.js} +1 -1
  58. package/src/assets/web-panel/assets/icons-DuLXY5ve.js +57 -0
  59. package/src/assets/web-panel/assets/{index-DX3NKnlx.js → index--02skmxm.js} +1 -1
  60. package/src/assets/web-panel/assets/{index-DViNLv05.js → index-0BsRZQ70.js} +2 -2
  61. package/src/assets/web-panel/assets/{index-BDzwtAvJ.js → index-7fYLkWFb.js} +1 -1
  62. package/src/assets/web-panel/assets/{index-CPzBvwi4.js → index-B1aCZ8tU.js} +1 -1
  63. package/src/assets/web-panel/assets/{index-CELIaC07.js → index-BTmBSfDP.js} +2 -2
  64. package/src/assets/web-panel/assets/index-BYpWUsV7.js +1 -0
  65. package/src/assets/web-panel/assets/index-BZeiwAUS.js +1 -0
  66. package/src/assets/web-panel/assets/{index-BaV1qPw2.js → index-Bdz6ZN2n.js} +2 -2
  67. package/src/assets/web-panel/assets/{index-Csq1ymAd.js → index-Bf6QSnBq.js} +1 -1
  68. package/src/assets/web-panel/assets/{index-T5htsJq3.js → index-Bi6eldWX.js} +1 -1
  69. package/src/assets/web-panel/assets/{index-pj_DB3gf.js → index-BoAaMGTC.js} +1 -1
  70. package/src/assets/web-panel/assets/{index-BsSnr41N.js → index-BrBmPm9P.js} +1 -1
  71. package/src/assets/web-panel/assets/{index-CWRVLGUY.js → index-Bzai2qqL.js} +2 -2
  72. package/src/assets/web-panel/assets/index-CP6IHxV9.js +1 -0
  73. package/src/assets/web-panel/assets/index-CU5HVlet.js +1 -0
  74. package/src/assets/web-panel/assets/{index-BEPQ53hT.js → index-CW0BgiQ7.js} +1 -1
  75. package/src/assets/web-panel/assets/{index-DNwo9Dzx.js → index-CiyAMvep.js} +1 -1
  76. package/src/assets/web-panel/assets/{index-CWhMnsWX.js → index-Ck5LhFMy.js} +3 -3
  77. package/src/assets/web-panel/assets/{index-CSzJBDW_.js → index-CotI08pv.js} +1 -1
  78. package/src/assets/web-panel/assets/{index-CfXwGGJa.js → index-CyZXgmzB.js} +1 -1
  79. package/src/assets/web-panel/assets/index-CzEyEx5i.js +1 -0
  80. package/src/assets/web-panel/assets/index-D8XA7siu.js +36 -0
  81. package/src/assets/web-panel/assets/{index-BPRyVdxV.js → index-DGV4y7Ok.js} +1 -1
  82. package/src/assets/web-panel/assets/index-DI6cGrS9.js +1 -0
  83. package/src/assets/web-panel/assets/{index-C6RUQfzA.js → index-DILaZYt9.js} +1 -1
  84. package/src/assets/web-panel/assets/{index-PbAFYgta.js → index-DOlW8HfH.js} +1 -1
  85. package/src/assets/web-panel/assets/{index-C_VBCJdj.js → index-DPLo4dr_.js} +1 -1
  86. package/src/assets/web-panel/assets/{index-DrBsteza.js → index-D_3tdh8I.js} +1 -1
  87. package/src/assets/web-panel/assets/{index-36fB-tdr.js → index-DaMGhrmy.js} +3 -3
  88. package/src/assets/web-panel/assets/{index-D2aA1Eww.js → index-Dj1YuMWN.js} +1 -1
  89. package/src/assets/web-panel/assets/index-DnoDj1K9.js +1 -0
  90. package/src/assets/web-panel/assets/{index-B50P9i-m.js → index-GHDuYmBz.js} +2 -2
  91. package/src/assets/web-panel/assets/{index-CvI-6roc.js → index-ZeKq1gO8.js} +2 -2
  92. package/src/assets/web-panel/assets/index-mzATEmde.js +55 -0
  93. package/src/assets/web-panel/assets/{index-OcnmMROX.js → index-nGWg45HB.js} +1 -1
  94. package/src/assets/web-panel/assets/index-nOYPI6Gi.js +3 -0
  95. package/src/assets/web-panel/assets/index-psUMSTuC.js +1 -0
  96. package/src/assets/web-panel/assets/{index-DYbkrS1k.js → index-wnbQQPT7.js} +3 -3
  97. package/src/assets/web-panel/assets/{initDefaultProps-DR3dFRrN.js → initDefaultProps-DFvrAEOp.js} +1 -1
  98. package/src/assets/web-panel/assets/{motion-Dab0Jzue.js → motion-Cfd1jQ_B.js} +3 -3
  99. package/src/assets/web-panel/assets/{move-CbXivKK7.js → move-CtwIMT78.js} +1 -1
  100. package/src/assets/web-panel/assets/{omit-CyPQ4Rvu.js → omit-DsID1k1x.js} +1 -1
  101. package/src/assets/web-panel/assets/{pickAttrs-DLkAq0jb.js → pickAttrs-hmUpaGeX.js} +1 -1
  102. package/src/assets/web-panel/assets/{placementArrow-OJpzGLKb.js → placementArrow-Mcm6Nlo6.js} +1 -1
  103. package/src/assets/web-panel/assets/{responsiveObserve-BSL-2rcG.js → responsiveObserve-CARlpUva.js} +1 -1
  104. package/src/assets/web-panel/assets/{slide-CSTFi1jq.js → slide-CoE_bmVd.js} +1 -1
  105. package/src/assets/web-panel/assets/{statusUtils-DYDvuHx4.js → statusUtils-DXv0eID1.js} +1 -1
  106. package/src/assets/web-panel/assets/{styleChecker-BMkbm-8r.js → styleChecker-KAcyElmo.js} +1 -1
  107. package/src/assets/web-panel/assets/{transition-B3-w1SVL.js → transition-CzoVM28y.js} +1 -1
  108. package/src/assets/web-panel/assets/{useConfigInject-DIr4olCu.js → useConfigInject-D5hyBDTd.js} +2 -2
  109. package/src/assets/web-panel/assets/useFlexGapSupport-P_d7Gj-x.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-Df_mZ5AJ.js → vnode-DUk2z77k.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-CY5xo2Ia.js → zoom-BTYQHwzp.js} +1 -1
  117. package/src/assets/web-panel/index.html +3 -3
  118. package/src/commands/db.js +325 -1
  119. package/src/assets/web-panel/assets/AppLayout-BiOlkA-r.js +0 -1
  120. package/src/assets/web-panel/assets/AppLayout-Wr63FaJ2.css +0 -1
  121. package/src/assets/web-panel/assets/Backup-sEweroFg.js +0 -1
  122. package/src/assets/web-panel/assets/Portal-DXIqogG2.js +0 -1
  123. package/src/assets/web-panel/assets/RssFeed-BsKQE8pe.js +0 -3
  124. package/src/assets/web-panel/assets/Trigger-CAZQ8LeJ.js +0 -1
  125. package/src/assets/web-panel/assets/icons-DEoqYzGZ.js +0 -57
  126. package/src/assets/web-panel/assets/index-B-tWHvIW.js +0 -1
  127. package/src/assets/web-panel/assets/index-BPln_4T8.js +0 -1
  128. package/src/assets/web-panel/assets/index-BPzN5a2A.js +0 -36
  129. package/src/assets/web-panel/assets/index-Bm7xqsYQ.js +0 -1
  130. package/src/assets/web-panel/assets/index-BtfOEVOq.js +0 -3
  131. package/src/assets/web-panel/assets/index-CEBBaWRc.js +0 -1
  132. package/src/assets/web-panel/assets/index-CN1O5Ka0.js +0 -1
  133. package/src/assets/web-panel/assets/index-D_E9PBtZ.js +0 -1
  134. package/src/assets/web-panel/assets/index-DlqQ3NPc.js +0 -1
  135. package/src/assets/web-panel/assets/index-Mc421_zZ.js +0 -55
  136. package/src/assets/web-panel/assets/index-lx2gVL_l.js +0 -1
  137. package/src/assets/web-panel/assets/useFlexGapSupport-d0_YPT4c.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-Dab0Jzue.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-Cfd1jQ_B.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-BPzN5a2A.js"></script>
12
- <link rel="modulepreload" crossorigin href="./assets/vendor-aH7YaPZi.js">
13
- <link rel="modulepreload" crossorigin href="./assets/icons-DEoqYzGZ.js">
11
+ <script type="module" crossorigin src="./assets/index-D8XA7siu.js"></script>
12
+ <link rel="modulepreload" crossorigin href="./assets/vendor-xFZ6Jlpw.js">
13
+ <link rel="modulepreload" crossorigin href="./assets/icons-DuLXY5ve.js">
14
14
  <link rel="stylesheet" crossorigin href="./assets/index-CyGyEIVX.css">
15
15
  </head>
16
16
  <body>
@@ -1,13 +1,35 @@
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";
7
7
  import chalk from "chalk";
8
+ import { createRequire } from "module";
8
9
  import { logger } from "../lib/logger.js";
9
10
  import { bootstrap, shutdown } from "../runtime/bootstrap.js";
10
11
 
12
+ const requireCjs = createRequire(import.meta.url);
13
+ const quoteIdent = (name) => `"${String(name).replace(/"/g, '""')}"`;
14
+
15
+ // Local SQLite driver loader for db check/repair. Inlined rather than imported
16
+ // from core-db because @chainlesschain/core-db@0.1.0 on npm only exports
17
+ // {DatabaseManager, getDatabaseManager}; loadSQLiteDriver was added later
18
+ // without a version bump.
19
+ function loadNativeSQLiteDriver() {
20
+ for (const pkg of ["better-sqlite3-multiple-ciphers", "better-sqlite3"]) {
21
+ try {
22
+ const Database = requireCjs(pkg);
23
+ const probe = new Database(":memory:");
24
+ probe.close();
25
+ return { name: pkg, Database };
26
+ } catch (_e) {
27
+ /* try next */
28
+ }
29
+ }
30
+ return null;
31
+ }
32
+
11
33
  export function registerDbCommand(program) {
12
34
  const db = program.command("db").description("Database management");
13
35
 
@@ -149,4 +171,306 @@ export function registerDbCommand(program) {
149
171
  process.exit(1);
150
172
  }
151
173
  });
174
+
175
+ // db check — PRAGMA integrity_check (read-only, exits 2 on corruption)
176
+ db.command("check")
177
+ .description("Run SQLite integrity check on the database")
178
+ .option("--quick", "Run quick_check (faster, less thorough)")
179
+ .option("--json", "Output as JSON")
180
+ .action(async (options) => {
181
+ let exitCode = 0;
182
+ try {
183
+ const ctx = await bootstrap({
184
+ skipDb: true,
185
+ verbose: program.opts().verbose,
186
+ });
187
+ const fs = await import("fs");
188
+ const dbPath = `${ctx.env.dataDir}/chainlesschain.db`;
189
+ if (!fs.existsSync(dbPath)) {
190
+ logger.error(`Database file not found: ${dbPath}`);
191
+ await shutdown();
192
+ process.exit(1);
193
+ }
194
+ const driver = loadNativeSQLiteDriver();
195
+ if (!driver) {
196
+ logger.error(
197
+ "integrity check requires a native SQLite driver (better-sqlite3)",
198
+ );
199
+ await shutdown();
200
+ process.exit(1);
201
+ }
202
+ const conn = new driver.Database(dbPath, {
203
+ readonly: true,
204
+ fileMustExist: true,
205
+ });
206
+ const checkName = options.quick ? "quick_check" : "integrity_check";
207
+ const rows = conn.pragma(checkName);
208
+ conn.close();
209
+ const ok =
210
+ rows.length === 1 && rows[0] && rows[0][checkName] === "ok";
211
+ if (options.json) {
212
+ console.log(
213
+ JSON.stringify({ ok, check: checkName, path: dbPath, result: rows }, null, 2),
214
+ );
215
+ } else if (ok) {
216
+ logger.success(
217
+ `Database integrity OK (${checkName}): ${chalk.cyan(dbPath)}`,
218
+ );
219
+ } else {
220
+ logger.error(`Database is CORRUPT: ${chalk.cyan(dbPath)}`);
221
+ for (const r of rows) {
222
+ const msg = (r && r[checkName]) || JSON.stringify(r);
223
+ const lines = String(msg).split("\n").slice(0, 20);
224
+ for (const line of lines) console.log(" " + line);
225
+ }
226
+ console.log("");
227
+ logger.warn("Recovery options:");
228
+ console.log(" cc db repair – best-effort row salvage into a new file");
229
+ console.log(" cc db reset – back up corrupt DB and start fresh");
230
+ }
231
+ exitCode = ok ? 0 : 2;
232
+ await shutdown();
233
+ } catch (err) {
234
+ logger.error(`Database check failed: ${err.message}`);
235
+ exitCode = 1;
236
+ }
237
+ process.exit(exitCode);
238
+ });
239
+
240
+ // db reset — rename corrupt DB + WAL/SHM to .bak.<timestamp>; next CLI run creates fresh
241
+ db.command("reset")
242
+ .description(
243
+ "Back up the database (and WAL sidecar) and start fresh next run",
244
+ )
245
+ .option("--force", "Skip confirmation")
246
+ .action(async (options) => {
247
+ try {
248
+ const ctx = await bootstrap({
249
+ skipDb: true,
250
+ verbose: program.opts().verbose,
251
+ });
252
+ const fs = await import("fs");
253
+ const dbPath = `${ctx.env.dataDir}/chainlesschain.db`;
254
+ if (!fs.existsSync(dbPath)) {
255
+ logger.info(`No database to reset: ${dbPath} does not exist`);
256
+ await shutdown();
257
+ return;
258
+ }
259
+ if (!options.force) {
260
+ const { confirm } = await import("@inquirer/prompts");
261
+ const ok = await confirm({
262
+ message: `Back up and remove ${dbPath}? Next CLI command will create a fresh DB.`,
263
+ default: false,
264
+ });
265
+ if (!ok) {
266
+ logger.info("Reset cancelled");
267
+ await shutdown();
268
+ return;
269
+ }
270
+ }
271
+ const ts = new Date().toISOString().replace(/[:.]/g, "-");
272
+ const backed = [];
273
+ for (const ext of ["", "-wal", "-shm"]) {
274
+ const src = dbPath + ext;
275
+ if (fs.existsSync(src)) {
276
+ const dest = `${src}.bak.${ts}`;
277
+ fs.renameSync(src, dest);
278
+ backed.push(dest);
279
+ }
280
+ }
281
+ if (backed.length === 0) {
282
+ logger.info("Nothing to back up");
283
+ } else {
284
+ logger.success("Database reset. Backups created:");
285
+ for (const b of backed) console.log(" " + chalk.cyan(b));
286
+ }
287
+ await shutdown();
288
+ } catch (err) {
289
+ logger.error(`Reset failed: ${err.message}`);
290
+ process.exit(1);
291
+ }
292
+ });
293
+
294
+ // db repair — best-effort row salvage from corrupt DB into a fresh file.
295
+ // Walks each table individually; rows on broken pages throw and are counted
296
+ // as lost rather than aborting the whole salvage. Output is a sibling file
297
+ // chainlesschain.db.recovered.<ts> — operator can swap it in via reset+restore.
298
+ db.command("repair")
299
+ .description("Best-effort row salvage from a corrupt DB into a new file")
300
+ .option("--out <path>", "Output path for recovered DB")
301
+ .action(async (options) => {
302
+ try {
303
+ const ctx = await bootstrap({
304
+ skipDb: true,
305
+ verbose: program.opts().verbose,
306
+ });
307
+ const fs = await import("fs");
308
+ const dbPath = `${ctx.env.dataDir}/chainlesschain.db`;
309
+ if (!fs.existsSync(dbPath)) {
310
+ logger.error(`Database file not found: ${dbPath}`);
311
+ await shutdown();
312
+ process.exit(1);
313
+ }
314
+ const driver = loadNativeSQLiteDriver();
315
+ if (!driver) {
316
+ logger.error(
317
+ "repair requires a native SQLite driver (better-sqlite3)",
318
+ );
319
+ await shutdown();
320
+ process.exit(1);
321
+ }
322
+ const ts = new Date().toISOString().replace(/[:.]/g, "-");
323
+ const outPath = options.out || `${dbPath}.recovered.${ts}`;
324
+ if (fs.existsSync(outPath)) {
325
+ logger.error(`Output path already exists: ${outPath}`);
326
+ await shutdown();
327
+ process.exit(1);
328
+ }
329
+ logger.info(
330
+ `Salvaging ${chalk.cyan(dbPath)} → ${chalk.cyan(outPath)}`,
331
+ );
332
+
333
+ const src = new driver.Database(dbPath, {
334
+ readonly: true,
335
+ fileMustExist: true,
336
+ });
337
+ const dst = new driver.Database(outPath);
338
+ dst.pragma("journal_mode = WAL");
339
+
340
+ // Replay schema (tables first, then indexes/views).
341
+ let schemaRows = [];
342
+ try {
343
+ schemaRows = src
344
+ .prepare(
345
+ "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",
346
+ )
347
+ .all();
348
+ } catch (e) {
349
+ logger.error(`Cannot read sqlite_master: ${e.message}`);
350
+ src.close();
351
+ dst.close();
352
+ await shutdown();
353
+ process.exit(1);
354
+ }
355
+ const stats = {
356
+ tables: 0,
357
+ rowsCopied: 0,
358
+ rowsLost: 0,
359
+ schemasFailed: 0,
360
+ };
361
+ for (const r of schemaRows) {
362
+ try {
363
+ dst.exec(r.sql);
364
+ } catch (e) {
365
+ stats.schemasFailed++;
366
+ logger.warn(`schema replay failed for ${r.name}: ${e.message}`);
367
+ }
368
+ }
369
+
370
+ const tableRows = src
371
+ .prepare(
372
+ "SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%' ORDER BY name",
373
+ )
374
+ .all();
375
+ const tables = tableRows.map((t) => t.name);
376
+ for (const t of tables) {
377
+ let copied = 0;
378
+ let lost = 0;
379
+ let cols = [];
380
+ try {
381
+ cols = src
382
+ .prepare(`PRAGMA table_info(${quoteIdent(t)})`)
383
+ .all()
384
+ .map((c) => c.name);
385
+ } catch (e) {
386
+ console.log(
387
+ ` ${t.padEnd(28)} ${chalk.red("schema unreadable")}`,
388
+ );
389
+ stats.tables++;
390
+ continue;
391
+ }
392
+ if (cols.length === 0) {
393
+ console.log(` ${t.padEnd(28)} ${chalk.gray("no columns")}`);
394
+ stats.tables++;
395
+ continue;
396
+ }
397
+ const colList = cols.map(quoteIdent).join(",");
398
+ const placeholders = cols.map(() => "?").join(",");
399
+ let insert;
400
+ try {
401
+ insert = dst.prepare(
402
+ `INSERT OR IGNORE INTO ${quoteIdent(t)} (${colList}) VALUES (${placeholders})`,
403
+ );
404
+ } catch (e) {
405
+ console.log(
406
+ ` ${t.padEnd(28)} ${chalk.red("dest insert prep failed")}`,
407
+ );
408
+ stats.tables++;
409
+ continue;
410
+ }
411
+ let iter;
412
+ try {
413
+ iter = src
414
+ .prepare(`SELECT ${colList} FROM ${quoteIdent(t)}`)
415
+ .iterate();
416
+ } catch (e) {
417
+ console.log(
418
+ ` ${t.padEnd(28)} ${chalk.red("table read aborted: " + e.message.slice(0, 40))}`,
419
+ );
420
+ stats.tables++;
421
+ continue;
422
+ }
423
+ while (true) {
424
+ let next;
425
+ try {
426
+ next = iter.next();
427
+ } catch (e) {
428
+ lost++;
429
+ break;
430
+ }
431
+ if (next.done) break;
432
+ try {
433
+ insert.run(...cols.map((c) => next.value[c]));
434
+ copied++;
435
+ } catch (e) {
436
+ lost++;
437
+ }
438
+ }
439
+ try {
440
+ iter.return && iter.return();
441
+ } catch (_e) {
442
+ /* swallow */
443
+ }
444
+ stats.tables++;
445
+ stats.rowsCopied += copied;
446
+ stats.rowsLost += lost;
447
+ const status =
448
+ lost > 0
449
+ ? chalk.yellow(`${copied} copied, ${lost} lost`)
450
+ : copied === 0
451
+ ? chalk.gray(`${copied} copied`)
452
+ : chalk.green(`${copied} copied`);
453
+ console.log(` ${t.padEnd(28)} ${status}`);
454
+ }
455
+ src.close();
456
+ dst.close();
457
+
458
+ logger.log("");
459
+ logger.success(`Recovered DB written to ${chalk.cyan(outPath)}`);
460
+ logger.log(` Tables processed: ${stats.tables}`);
461
+ logger.log(` Rows copied: ${chalk.green(stats.rowsCopied)}`);
462
+ logger.log(
463
+ ` Rows lost: ${stats.rowsLost > 0 ? chalk.yellow(stats.rowsLost) : 0}`,
464
+ );
465
+ logger.log(` Schemas failed: ${stats.schemasFailed}`);
466
+ logger.log("");
467
+ logger.info("To use the recovered DB:");
468
+ console.log(` cc db reset --force`);
469
+ console.log(` cc db restore ${outPath} --force`);
470
+ await shutdown();
471
+ } catch (err) {
472
+ logger.error(`Repair failed: ${err.message}`);
473
+ process.exit(1);
474
+ }
475
+ });
152
476
  }
@@ -1 +0,0 @@
1
- import{l as Ce,m as f,x as t,q as d,B as we,C as je,v as i,c as e,D as a,E as j,u as s,F as r,G as B,H as S,I as v,J as l,K as Se,L as Te,r as Be,j as y}from"./vendor-aH7YaPZi.js";import{u as Re}from"./ws-BTS8ehTm.js";import{u as Le,T as xe}from"./index-BPzN5a2A.js";import{_ as De}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{F as b,G as R,D as I,M as N,R as A,C as P,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 q,i as H,I as $,L as J,W as Y,j as Q,k as X,P as Z,l as h,m as ee,n as te,o as oe,V as Ie,p as se,K as ne,q as Ne}from"./icons-DEoqYzGZ.js";const Ae=["src"],Pe={key:0,class:"logo-text"},Ke={key:0,class:"mode-banner project"},Me={class:"banner-info"},Ue={class:"banner-name"},Ve={key:1,class:"mode-banner global"},Fe=["title"],Ee={key:0,class:"footer-text"},Ge={class:"header-left"},We={class:"header-right"},ze={class:"theme-switcher"},qe=["data-theme-key","onClick"],He={class:"version-tag"},$e={__name:"AppLayout",setup(Je){const le=we(),ae=je(),O=Re(),T=Le(),u=Be(!1),k=window.__CC_CONFIG__||{},p=y(()=>k.mode==="project"),ie="v5.0.3.1",de=new URL(""+new URL("logo-DBCYUiWP.png",import.meta.url).href,import.meta.url).href,ue=y(()=>T.current),re=y(()=>T.config.vars["--menu-mode"]),L=y(()=>{const c=ae.name?.toLowerCase()||"dashboard";return[{mcptools:"mcp"}[c]||c]}),C=y(()=>O.status),ce=y(()=>({connected:"success",connecting:"processing",error:"error",disconnected:"default"})[O.status]||"default"),pe=y(()=>({connected:"已连接",connecting:"连接中...",error:"连接错误",disconnected:"未连接"})[O.status]||"未知");function me(c){T.setTheme(c)}function ye({key:c}){le.push({mcp:"/mcp"}[c]||`/${c}`)}return Ce(()=>O.connect()),(c,o)=>{const n=d("a-menu-item"),m=d("a-menu-item-group"),g=d("a-menu-divider"),ke=d("a-menu"),_e=d("a-badge"),fe=d("a-layout-sider"),x=d("a-tooltip"),ve=d("a-tag"),ge=d("a-layout-header"),be=d("router-view"),Oe=d("a-layout-content"),D=d("a-layout");return i(),f(D,{class:"app-root"},{default:t(()=>[e(fe,{collapsed:u.value,"onUpdate:collapsed":o[1]||(o[1]=_=>u.value=_),collapsible:"","collapsed-width":56,width:216,class:"sidebar"},{default:t(()=>[a("div",{class:j(["logo",{collapsed:u.value}])},[a("img",{src:s(de),alt:"ChainlessChain",class:"logo-icon"},null,8,Ae),u.value?B("",!0):(i(),r("span",Pe,"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,Fe)):(i(),r(S,{key:0},[p.value?(i(),r("div",Ke,[e(s(b),{class:"banner-icon"}),a("div",Me,[a("div",Ue,v(s(k).projectName||"项目"),1),o[2]||(o[2]=a("div",{class:"banner-sub"},"项目级面板",-1))])])):(i(),r("div",Ve,[e(s(R),{class:"banner-icon"}),o[3]||(o[3]=a("span",{class:"banner-name"},"全局模式",-1))]))],64)),e(ke,{selectedKeys:L.value,"onUpdate:selectedKeys":o[0]||(o[0]=_=>L.value=_),theme:re.value,mode:"inline","inline-collapsed":u.value,class:"side-menu",onClick:ye},{default:t(()=>[u.value?(i(),r(S,{key:1},[e(n,{key:"dashboard"},{icon:t(()=>[e(s(I))]),_:1}),e(n,{key:"chat"},{icon:t(()=>[e(s(N))]),_:1}),e(n,{key:"cowork"},{icon:t(()=>[e(s(A))]),_:1}),e(n,{key:"services"},{icon:t(()=>[e(s(P))]),_: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(n,{key:"project-settings"},{icon:t(()=>[e(s(b))]),_: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(q))]),_:1}),e(g,{class:"divider-sm"}),e(n,{key:"security"},{icon:t(()=>[e(s(H))]),_:1}),e(n,{key:"did"},{icon:t(()=>[e(s($))]),_:1}),e(n,{key:"permissions"},{icon:t(()=>[e(s(J))]),_:1}),e(n,{key:"p2p"},{icon:t(()=>[e(s(Y))]),_:1}),e(n,{key:"backup"},{icon:t(()=>[e(s(Q))]),_:1}),e(n,{key:"git"},{icon:t(()=>[e(s(X))]),_:1}),e(n,{key:"projects"},{icon:t(()=>[e(s(Z))]),_:1}),e(g,{class:"divider-sm"}),e(n,{key:"wallet"},{icon:t(()=>[e(s(h))]),_:1}),e(n,{key:"organization"},{icon:t(()=>[e(s(ee))]),_:1}),e(n,{key:"analytics"},{icon:t(()=>[e(s(te))]),_:1}),e(n,{key:"templates"},{icon:t(()=>[e(s(oe))]),_:1}),e(g,{class:"divider-sm"}),e(n,{key:"rssfeed"},{icon:t(()=>[e(s(se))]),_:1}),e(n,{key:"webauthn"},{icon:t(()=>[e(s(ne))]),_:1})],64)):(i(),r(S,{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(I))]),default:t(()=>[o[5]||(o[5]=l("仪表板",-1))]),_:1}),e(n,{key:"chat"},{icon:t(()=>[e(s(N))]),default:t(()=>[o[6]||(o[6]=l("AI 对话",-1))]),_:1}),e(n,{key:"cowork"},{icon:t(()=>[e(s(A))]),default:t(()=>[o[7]||(o[7]=l("日常协作",-1))]),_:1}),e(n,{key:"services"},{icon:t(()=>[e(s(P))]),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}),e(n,{key:"project-settings"},{icon:t(()=>[e(s(b))]),default:t(()=>[o[14]||(o[14]=l("项目存储",-1))]),_:1})]),_:1}),e(m,null,{title:t(()=>[...o[15]||(o[15]=[a("span",{class:"group-label"},"数 据",-1)])]),default:t(()=>[e(n,{key:"notes"},{icon:t(()=>[e(s(F))]),default:t(()=>[o[16]||(o[16]=l("笔记管理",-1))]),_:1}),e(n,{key:"memory"},{icon:t(()=>[e(s(E))]),default:t(()=>[o[17]||(o[17]=l("记忆文件",-1))]),_:1}),e(n,{key:"knowledge"},{icon:t(()=>[e(s(G))]),default:t(()=>[o[18]||(o[18]=l("知识图谱",-1))]),_:1}),e(n,{key:"cron"},{icon:t(()=>[e(s(W))]),default:t(()=>[o[19]||(o[19]=l("定时任务",-1))]),_:1}),e(n,{key:"workflow"},{icon:t(()=>[e(s(z))]),default:t(()=>[o[20]||(o[20]=l("工作流编辑",-1))]),_:1}),e(n,{key:"tasks"},{icon:t(()=>[e(s(q))]),default:t(()=>[o[21]||(o[21]=l("后台任务",-1))]),_:1})]),_:1}),e(m,null,{title:t(()=>[...o[22]||(o[22]=[a("span",{class:"group-label"},"高 级",-1)])]),default:t(()=>[e(n,{key:"security"},{icon:t(()=>[e(s(H))]),default:t(()=>[o[23]||(o[23]=l("安全中心",-1))]),_:1}),e(n,{key:"did"},{icon:t(()=>[e(s($))]),default:t(()=>[o[24]||(o[24]=l("DID 身份",-1))]),_:1}),e(n,{key:"permissions"},{icon:t(()=>[e(s(J))]),default:t(()=>[o[25]||(o[25]=l("权限管理",-1))]),_:1}),e(n,{key:"p2p"},{icon:t(()=>[e(s(Y))]),default:t(()=>[o[26]||(o[26]=l("P2P 网络",-1))]),_:1}),e(n,{key:"backup"},{icon:t(()=>[e(s(Q))]),default:t(()=>[o[27]||(o[27]=l("备份同步",-1))]),_:1}),e(n,{key:"git"},{icon:t(()=>[e(s(X))]),default:t(()=>[o[28]||(o[28]=l("Git 与数据",-1))]),_:1}),e(n,{key:"projects"},{icon:t(()=>[e(s(Z))]),default:t(()=>[o[29]||(o[29]=l("项目管理",-1))]),_:1})]),_:1}),e(m,null,{title:t(()=>[...o[30]||(o[30]=[a("span",{class:"group-label"},"企 业",-1)])]),default:t(()=>[e(n,{key:"wallet"},{icon:t(()=>[e(s(h))]),default:t(()=>[o[31]||(o[31]=l("钱包管理",-1))]),_:1}),e(n,{key:"organization"},{icon:t(()=>[e(s(ee))]),default:t(()=>[o[32]||(o[32]=l("组织管理",-1))]),_:1}),e(n,{key:"analytics"},{icon:t(()=>[e(s(te))]),default:t(()=>[o[33]||(o[33]=l("使用分析",-1))]),_:1}),e(n,{key:"templates"},{icon:t(()=>[e(s(oe))]),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:"video"},{icon:t(()=>[e(s(Ie))]),default:t(()=>[o[36]||(o[36]=l("视频剪辑",-1))]),_:1})]),_:1}),e(m,null,{title:t(()=>[...o[37]||(o[37]=[a("span",{class:"group-label"},"扩 展",-1)])]),default:t(()=>[e(n,{key:"rssfeed"},{icon:t(()=>[e(s(se))]),default:t(()=>[o[38]||(o[38]=l("RSS 订阅",-1))]),_:1}),e(n,{key:"webauthn"},{icon:t(()=>[e(s(ne))]),default:t(()=>[o[39]||(o[39]=l("身份认证",-1))]),_:1})]),_:1})],64))]),_:1},8,["selectedKeys","theme","inline-collapsed"]),a("div",{class:j(["sidebar-footer",{collapsed:u.value}])},[e(_e,{status:ce.value},null,8,["status"]),u.value?B("",!0):(i(),r("span",Ee,v(pe.value),1))],2)]),_:1},8,["collapsed"]),e(D,{class:"main-area"},{default:t(()=>[e(ge,{class:"app-header"},{default:t(()=>[a("div",Ge,[a("div",{class:j(["scope-tag",p.value?"project":"global"])},[(i(),f(Se(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(Ne),{class:"info-icon"})]),_:1},8,["title"])):B("",!0)],2)]),a("div",We,[a("div",ze,[(i(!0),r(S,null,Te(s(xe),(_,w)=>(i(),f(x,{key:w,title:_.label},{default:t(()=>[a("button",{class:j(["theme-btn",{active:ue.value===w}]),"data-theme-key":w,onClick:Ye=>me(w)},v(_.icon),11,qe)]),_:2},1032,["title"]))),128))]),a("span",He,v(s(ie)),1),e(ve,{color:C.value==="connected"?"green":C.value==="connecting"?"orange":"red",class:"ws-tag"},{default:t(()=>[l(v(C.value==="connected"?"已连接":C.value==="connecting"?"连接中":"断开"),1)]),_:1},8,["color"])])]),_:1}),e(Oe,{class:"page-content"},{default:t(()=>[e(be)]),_:1})]),_:1})]),_:1})}}},tt=De($e,[["__scopeId","data-v-0d8e78de"]]);export{tt as default};
@@ -1 +0,0 @@
1
- .app-root[data-v-0d8e78de]{min-height:100vh;background:var(--bg-base)}.sidebar[data-v-0d8e78de]{background:var(--bg-sidebar)!important;border-right:1px solid var(--border-color);transition:background .25s}[data-v-0d8e78de] .ant-layout-sider-children{display:flex;flex-direction:column;overflow:hidden}.main-area[data-v-0d8e78de]{background:var(--bg-base)}.logo[data-v-0d8e78de]{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-0d8e78de]{padding:0;justify-content:center}.logo-icon[data-v-0d8e78de]{width:24px;height:24px;flex-shrink:0;object-fit:contain}.logo-text[data-v-0d8e78de]{color:var(--logo-text);font-weight:700;font-size:14px;letter-spacing:.01em}.mode-banner[data-v-0d8e78de]{display:flex;align-items:center;gap:8px;padding:7px 10px;margin:8px 8px 4px;border-radius:7px;overflow:hidden}.mode-banner.project[data-v-0d8e78de]{background:#1677ff1a;border:1px solid rgba(22,119,255,.2)}.mode-banner.global[data-v-0d8e78de]{background:#722ed11a;border:1px solid rgba(114,46,209,.2)}.banner-icon[data-v-0d8e78de]{font-size:13px;flex-shrink:0;color:#1677ff}.mode-banner.global .banner-icon[data-v-0d8e78de]{color:#722ed1}.banner-info[data-v-0d8e78de]{flex:1;min-width:0}.banner-name[data-v-0d8e78de]{font-size:12px;font-weight:600;color:var(--text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.banner-sub[data-v-0d8e78de]{font-size:10px;color:#1677ff;margin-top:1px}.mode-banner.global .banner-name[data-v-0d8e78de]{color:#c084fc}.mode-icon-sm[data-v-0d8e78de]{display:flex;justify-content:center;padding:8px 0;font-size:14px}.side-menu[data-v-0d8e78de]{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-0d8e78de]{color:var(--group-title);font-size:10px;font-weight:700;letter-spacing:.12em;padding-left:6px}[data-v-0d8e78de] .ant-menu-item-group-title{padding:8px 16px 2px!important}[data-v-0d8e78de] .ant-menu-item{height:38px!important;line-height:38px!important;margin:1px 4px!important;border-radius:6px!important}.divider-sm[data-v-0d8e78de]{margin:4px 0!important}.sidebar-footer[data-v-0d8e78de]{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-0d8e78de]{justify-content:center;padding:8px 0}.footer-text[data-v-0d8e78de]{color:var(--text-secondary);font-size:11px}.app-header[data-v-0d8e78de]{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-0d8e78de],.header-right[data-v-0d8e78de]{display:flex;align-items:center;gap:10px}.scope-tag[data-v-0d8e78de]{display:flex;align-items:center;gap:5px;padding:3px 10px;border-radius:5px;font-size:12px;font-weight:500}.scope-tag.project[data-v-0d8e78de]{background:#1677ff1a;color:#1677ff;border:1px solid rgba(22,119,255,.2)}.scope-tag.global[data-v-0d8e78de]{background:#722ed11a;color:#722ed1;border:1px solid rgba(114,46,209,.2)}.info-icon[data-v-0d8e78de]{opacity:.45;cursor:help;margin-left:2px}.theme-switcher[data-v-0d8e78de]{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-0d8e78de]{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-0d8e78de]:hover{opacity:.9;transform:scale(1.15);background:var(--bg-card-hover)}.theme-btn.active[data-v-0d8e78de]{opacity:1;transform:scale(1.1);background:var(--bg-card-hover);outline:2px solid var(--text-secondary)}.version-tag[data-v-0d8e78de]{color:var(--text-muted);font-size:11px}.ws-tag[data-v-0d8e78de]{margin:0!important;font-size:11px}.page-content[data-v-0d8e78de]{padding:24px;overflow:auto;background:var(--bg-base);min-height:calc(100vh - 50px)}
@@ -1 +0,0 @@
1
- import{u as Me}from"./ws-BTS8ehTm.js";import{_ as Ne}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{r as je,Y as me,j as re,_ as N,ae as U,ac as Le}from"./icons-DEoqYzGZ.js";import{l as Te,F as s,D as p,c as a,x as o,r as n,q as y,v as l,J as f,u as v,m as b,G as r,I as u,H as De}from"./vendor-aH7YaPZi.js";const Re={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},Ee={key:0,style:{"text-align":"center",padding:"30px"}},Ue={key:0,style:{"font-family":"monospace",color:"var(--text-muted)","font-size":"12px"}},Je={key:1},Ke={key:2,style:{color:"var(--text-secondary)","font-size":"12px"}},Ve={key:3,style:{"margin-top":"16px"}},Ge={style:{background:"var(--bg-base)",border:"1px solid var(--border-color)","border-radius":"6px",padding:"12px",color:"#aaa","font-size":"12px","max-height":"200px","overflow-y":"auto","white-space":"pre-wrap"}},He={key:4,style:{"margin-top":"12px",color:"#ff4d4f","font-size":"12px"}},qe={key:0,style:{background:"var(--bg-base)",border:"1px solid var(--border-color)","border-radius":"6px",padding:"12px","margin-top":"8px"}},We={style:{"font-family":"monospace"}},Ye={key:0},Qe={key:1,style:{"margin-top":"12px"}},Xe={style:{background:"var(--bg-base)",border:"1px solid var(--border-color)","border-radius":"6px",padding:"12px",color:"#aaa","font-size":"12px","white-space":"pre-wrap"}},Ze={key:0,style:{"text-align":"center",padding:"30px"}},et={key:0,style:{"margin-bottom":"16px"}},tt={style:{background:"var(--bg-base)",border:"1px solid var(--border-color)","border-radius":"6px",padding:"12px",color:"#aaa","font-size":"12px","max-height":"200px","overflow-y":"auto","white-space":"pre-wrap"}},at={key:0,style:{"font-family":"monospace","font-size":"12px"}},ot={key:2,style:{"margin-top":"12px",color:"#ff4d4f","font-size":"12px"}},lt={key:0,style:{"text-align":"center",padding:"30px"}},nt={key:2,style:{"margin-top":"12px",color:"#ff4d4f","font-size":"12px"}},st={key:0,style:{"text-align":"center",padding:"30px"}},rt={key:0,style:{"font-family":"monospace",color:"var(--text-muted)","font-size":"12px"}},it={key:1},ut={key:2},ct={key:3,style:{color:"var(--text-secondary)","font-size":"12px"}},dt={key:3,style:{"margin-top":"12px",color:"#ff4d4f","font-size":"12px"}},pt={key:0,style:{"margin-top":"12px"}},vt={style:{background:"var(--bg-base)",border:"1px solid var(--border-color)","border-radius":"6px",padding:"12px",color:"#aaa","font-size":"12px","white-space":"pre-wrap"}},yt={__name:"Backup",setup(ft){const g=Me(),ie=n("backup"),J=n(!1),K=n(!1),V=n(!1),B=n(""),w=n([]),_=n(""),be=[{title:"备份 ID",key:"id"},{title:"大小",key:"size",width:120},{title:"创建时间",key:"createdAt"},{title:"操作",key:"action",width:100}];async function ue(){K.value=!0,B.value="";try{const{output:t}=await g.execute("backup list --json",15e3),e=M(t);Array.isArray(e)?w.value=e:e&&Array.isArray(e.backups)?w.value=e.backups:(w.value=[],t&&t.trim()&&(_.value=t))}catch(t){B.value=`加载备份列表失败: ${t.message}`}finally{K.value=!1}}async function xe(){V.value=!0,_.value="",B.value="";try{const{output:t}=await g.execute("backup create --json",3e4);_.value=t||"备份已创建",await ue()}catch(t){_.value=`创建备份失败: ${t.message}`}finally{V.value=!1}}const G=n(!1),H=n(!1),k=n(null),z=n("");function _e(t){k.value=t,z.value="",G.value=!0}async function ke(){if(k.value){H.value=!0,z.value="";try{const{output:t}=await g.execute(`backup restore ${k.value.id}`,6e4);z.value=t||"恢复完成"}catch(t){z.value=`恢复失败: ${t.message}`}finally{H.value=!1}}}const q=n(!1),j=n(""),I=n(!1),L=n("未知"),T=n(0),W=n(""),x=n(""),Y=n(!1),Q=n(!1),S=n([]),he=[{title:"文件路径",key:"path"},{title:"冲突类型",key:"type",width:120}];async function X(){q.value=!0,j.value="";try{const{output:t}=await g.execute("sync status --json",15e3),e=M(t);e?(I.value=e.online||e.synced||e.status==="online"||!1,L.value=I.value?"已同步":"未同步",T.value=e.pending??e.pendingChanges??0,W.value=e.lastSync||e.lastSyncTime||""):we(t)}catch(t){j.value=`加载同步状态失败: ${t.message}`}finally{q.value=!1}}function we(t){if(!t){L.value="未知";return}I.value=/synced|online|up.to.date/i.test(t),L.value=I.value?"已同步":"未同步";const e=t.match(/pending[:\s]+(\d+)/i);T.value=e?parseInt(e[1]):0;const c=t.match(/last[:\s]+(.+)/i);c&&(W.value=c[1].trim())}async function ze(){Y.value=!0,x.value="";try{const{output:t}=await g.execute("sync push",3e4);x.value=t||"推送完成",await X()}catch(t){x.value=`推送失败: ${t.message}`}finally{Y.value=!1}}async function Se(){Q.value=!0,x.value="";try{const{output:t}=await g.execute("sync pull",3e4);x.value=t||"拉取完成",await X()}catch(t){x.value=`拉取失败: ${t.message}`}finally{Q.value=!1}}async function Ce(){try{const{output:t}=await g.execute("sync conflicts --json",15e3),e=M(t);Array.isArray(e)?S.value=e:e&&Array.isArray(e.conflicts)?S.value=e.conflicts:S.value=[]}catch{S.value=[]}}const Z=n(!1),D=n(""),C=n(!1),ee=n(""),te=n(!1),O=n(""),A=n([]),Ae=[{title:"CID",key:"cid"},{title:"名称",key:"name"},{title:"大小",key:"size",width:120},{title:"固定时间",key:"pinnedAt"},{title:"操作",key:"action",width:120}];async function Pe(){Z.value=!0,D.value="";try{const{output:t}=await g.execute("ipfs status --json",15e3),e=M(t);if(e)C.value=e.online||e.status==="online"||e.connected||!1,ee.value=e.peerId||e.id||"";else{C.value=t?/online|connected|running/i.test(t):!1;const c=t?t.match(/(?:peer\s*id|id)[:\s]+(\S+)/i):null;ee.value=c?c[1]:""}}catch(t){D.value=`加载 IPFS 状态失败: ${t.message}`}finally{Z.value=!1}}async function ae(){te.value=!0,O.value="";try{const{output:t}=await g.execute("ipfs pins --json",15e3),e=M(t);Array.isArray(e)?A.value=e:e&&Array.isArray(e.pins)?A.value=e.pins:A.value=[]}catch(t){O.value=`加载固定列表失败: ${t.message}`}finally{te.value=!1}}const oe=n(!1),le=n(!1),R=n(""),F=n("");async function ce(){if(R.value.trim()){le.value=!0,F.value="";try{const{output:t}=await g.execute(`ipfs pin "${R.value.trim()}"`,3e4);F.value=t||"固定成功",await ae()}catch(t){F.value=`固定失败: ${t.message}`}finally{le.value=!1}}}async function $e(t){try{await g.execute(`ipfs unpin ${t.cid}`,15e3),await ae()}catch(e){O.value=`取消固定失败: ${e.message}`}}function M(t){if(!t||!t.trim())return null;try{return JSON.parse(t.trim())}catch{const c=t.match(/\{[\s\S]*\}|\[[\s\S]*\]/);if(c)try{return JSON.parse(c[0])}catch{}return null}}function de(t){if(t==null||isNaN(t))return"-";const e=Number(t);if(e===0)return"0 B";const c=["B","KB","MB","GB","TB"],h=Math.floor(Math.log(e)/Math.log(1024));return(e/Math.pow(1024,h)).toFixed(h>0?1:0)+" "+c[h]}async function pe(){J.value=!0;try{await Promise.all([ue(),X(),Ce(),Pe(),ae()])}finally{J.value=!1}}return Te(pe),(t,e)=>{const c=y("a-button"),h=y("a-space"),E=y("a-spin"),ve=y("a-empty"),ne=y("a-table"),m=y("a-card"),ye=y("a-modal"),se=y("a-tab-pane"),P=y("a-statistic"),$=y("a-col"),fe=y("a-row"),ge=y("a-tag"),Be=y("a-popconfirm"),Ie=y("a-input"),Oe=y("a-tabs");return l(),s("div",null,[p("div",Re,[e[6]||(e[6]=p("div",null,[p("h2",{class:"page-title"},"备份与同步"),p("p",{class:"page-sub"},"备份管理 / 数据同步 / IPFS")],-1)),a(c,{type:"primary",ghost:"",loading:J.value,onClick:pe},{icon:o(()=>[a(v(je))]),default:o(()=>[e[5]||(e[5]=f(" 刷新 ",-1))]),_:1},8,["loading"])]),a(Oe,{activeKey:ie.value,"onUpdate:activeKey":e[4]||(e[4]=i=>ie.value=i),type:"card"},{default:o(()=>[a(se,{key:"backup"},{tab:o(()=>[a(v(re)),e[7]||(e[7]=f(" 备份管理",-1))]),default:o(()=>[a(m,{style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"20px"}},{title:o(()=>[a(h,null,{default:o(()=>[a(v(re)),e[8]||(e[8]=p("span",null,"备份操作",-1))]),_:1})]),extra:o(()=>[a(c,{type:"primary",loading:V.value,onClick:xe},{icon:o(()=>[a(v(me))]),default:o(()=>[e[9]||(e[9]=f(" 创建备份 ",-1))]),_:1},8,["loading"])]),default:o(()=>[K.value?(l(),s("div",Ee,[a(E)])):w.value.length===0&&!_.value?(l(),b(ve,{key:1,description:"暂无备份记录"})):r("",!0),w.value.length>0?(l(),b(ne,{key:2,columns:be,"data-source":w.value,pagination:!1,size:"small","row-key":"id"},{bodyCell:o(({column:i,record:d})=>[i.key==="id"?(l(),s("span",Ue,u(d.id.length>20?d.id.slice(0,20)+"...":d.id),1)):r("",!0),i.key==="size"?(l(),s("span",Je,u(de(d.size)),1)):r("",!0),i.key==="createdAt"?(l(),s("span",Ke,u(d.createdAt||"-"),1)):r("",!0),i.key==="action"?(l(),b(c,{key:3,size:"small",type:"link",onClick:Fe=>_e(d)},{default:o(()=>[...e[10]||(e[10]=[f(" 恢复 ",-1)])]),_:1},8,["onClick"])):r("",!0)]),_:1},8,["data-source"])):r("",!0),_.value?(l(),s("div",Ve,[e[11]||(e[11]=p("div",{style:{color:"var(--text-secondary)","font-size":"11px","margin-bottom":"6px"}},"最近操作结果",-1)),p("pre",Ge,u(_.value),1)])):r("",!0),B.value?(l(),s("div",He,u(B.value),1)):r("",!0)]),_:1}),a(ye,{open:G.value,"onUpdate:open":e[0]||(e[0]=i=>G.value=i),title:"确认恢复备份","ok-text":"确认恢复","cancel-text":"取消","confirm-loading":H.value,onOk:ke,"ok-type":"danger"},{default:o(()=>[e[15]||(e[15]=p("p",{style:{color:"var(--text-secondary)"}}," 确定要恢复以下备份吗?此操作将覆盖当前数据。 ",-1)),k.value?(l(),s("div",qe,[p("div",null,[e[12]||(e[12]=p("strong",null,"备份 ID:",-1)),e[13]||(e[13]=f()),p("span",We,u(k.value.id),1)]),k.value.createdAt?(l(),s("div",Ye,[e[14]||(e[14]=p("strong",null,"创建时间:",-1)),f(" "+u(k.value.createdAt),1)])):r("",!0)])):r("",!0),z.value?(l(),s("div",Qe,[p("pre",Xe,u(z.value),1)])):r("",!0)]),_:1},8,["open","confirm-loading"])]),_:1}),a(se,{key:"sync"},{tab:o(()=>[a(v(N)),e[16]||(e[16]=f(" 数据同步",-1))]),default:o(()=>[q.value?(l(),s("div",Ze,[a(E)])):(l(),s(De,{key:1},[a(fe,{gutter:[16,16],style:{"margin-bottom":"20px"}},{default:o(()=>[a($,{xs:24,sm:8},{default:o(()=>[a(m,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:o(()=>[a(P,{title:"同步状态",value:L.value,"value-style":{color:I.value?"#52c41a":"#888",fontSize:"16px"}},{prefix:o(()=>[a(v(N))]),_:1},8,["value","value-style"])]),_:1})]),_:1}),a($,{xs:24,sm:8},{default:o(()=>[a(m,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:o(()=>[a(P,{title:"待同步变更",value:T.value,"value-style":{color:T.value>0?"#faad14":"#52c41a",fontSize:"16px"}},{prefix:o(()=>[a(v(N))]),_:1},8,["value","value-style"])]),_:1})]),_:1}),a($,{xs:24,sm:8},{default:o(()=>[a(m,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:o(()=>[a(P,{title:"最近同步",value:W.value||"无","value-style":{color:"var(--text-secondary)",fontSize:"16px"}},{prefix:o(()=>[a(v(N))]),_:1},8,["value"])]),_:1})]),_:1})]),_:1}),a(h,{style:{"margin-bottom":"16px"}},{default:o(()=>[a(c,{loading:Y.value,onClick:ze,style:{background:"var(--bg-card-hover)","border-color":"var(--border-color)"}},{icon:o(()=>[a(v(re))]),default:o(()=>[e[17]||(e[17]=f(" 推送 ",-1))]),_:1},8,["loading"]),a(c,{loading:Q.value,onClick:Se,style:{background:"var(--bg-card-hover)","border-color":"var(--border-color)"}},{icon:o(()=>[a(v(N))]),default:o(()=>[e[18]||(e[18]=f(" 拉取 ",-1))]),_:1},8,["loading"])]),_:1}),x.value?(l(),s("div",et,[e[19]||(e[19]=p("div",{style:{color:"var(--text-secondary)","font-size":"11px","margin-bottom":"6px"}},"操作结果",-1)),p("pre",tt,u(x.value),1)])):r("",!0),S.value.length>0?(l(),b(m,{key:1,title:"冲突列表",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:o(()=>[a(ne,{columns:he,"data-source":S.value,pagination:!1,size:"small","row-key":"path"},{bodyCell:o(({column:i,record:d})=>[i.key==="path"?(l(),s("span",at,u(d.path),1)):r("",!0),i.key==="type"?(l(),b(ge,{key:1,color:"red"},{default:o(()=>[f(u(d.type||"冲突"),1)]),_:2},1024)):r("",!0)]),_:1},8,["data-source"])]),_:1})):r("",!0)],64)),j.value?(l(),s("div",ot,u(j.value),1)):r("",!0)]),_:1}),a(se,{key:"ipfs"},{tab:o(()=>[a(v(U)),e[20]||(e[20]=f(" IPFS 存储",-1))]),default:o(()=>[a(m,{title:"IPFS 状态",style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"20px"}},{extra:o(()=>[a(ge,{color:C.value?"green":"default"},{default:o(()=>[f(u(C.value?"在线":"离线"),1)]),_:1},8,["color"])]),default:o(()=>[Z.value?(l(),s("div",lt,[a(E)])):(l(),b(fe,{key:1,gutter:[16,16]},{default:o(()=>[a($,{xs:24,sm:8},{default:o(()=>[a(m,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:o(()=>[a(P,{title:"节点状态",value:C.value?"已连接":"未连接","value-style":{color:C.value?"#52c41a":"#888",fontSize:"16px"}},{prefix:o(()=>[a(v(U))]),_:1},8,["value","value-style"])]),_:1})]),_:1}),a($,{xs:24,sm:8},{default:o(()=>[a(m,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:o(()=>[a(P,{title:"已固定文件",value:A.value.length,"value-style":{fontSize:"16px"}},{prefix:o(()=>[a(v(U))]),_:1},8,["value"])]),_:1})]),_:1}),a($,{xs:24,sm:8},{default:o(()=>[a(m,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:o(()=>[a(P,{title:"Peer ID",value:ee.value||"-","value-style":{color:"var(--text-muted)",fontSize:"12px",fontFamily:"monospace"}},{prefix:o(()=>[a(v(U))]),_:1},8,["value"])]),_:1})]),_:1})]),_:1})),D.value?(l(),s("div",nt,u(D.value),1)):r("",!0)]),_:1}),a(m,{title:"固定文件列表",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{extra:o(()=>[a(c,{size:"small",onClick:e[1]||(e[1]=i=>oe.value=!0),style:{background:"var(--bg-card-hover)","border-color":"var(--border-color)"}},{icon:o(()=>[a(v(me))]),default:o(()=>[e[21]||(e[21]=f(" 固定文件 ",-1))]),_:1})]),default:o(()=>[te.value?(l(),s("div",st,[a(E)])):A.value.length===0?(l(),b(ve,{key:1,description:"暂无固定文件"})):(l(),b(ne,{key:2,columns:Ae,"data-source":A.value,pagination:{pageSize:10},size:"small","row-key":"cid"},{bodyCell:o(({column:i,record:d})=>[i.key==="cid"?(l(),s("span",rt,u(d.cid.length>24?d.cid.slice(0,24)+"...":d.cid),1)):r("",!0),i.key==="name"?(l(),s("span",it,u(d.name||"-"),1)):r("",!0),i.key==="size"?(l(),s("span",ut,u(de(d.size)),1)):r("",!0),i.key==="pinnedAt"?(l(),s("span",ct,u(d.pinnedAt||"-"),1)):r("",!0),i.key==="action"?(l(),b(Be,{key:4,title:"确定取消固定?","ok-text":"确定","cancel-text":"取消",onConfirm:Fe=>$e(d)},{default:o(()=>[a(c,{size:"small",type:"link",danger:""},{default:o(()=>[a(v(Le)),e[22]||(e[22]=f(" 取消固定 ",-1))]),_:1})]),_:1},8,["onConfirm"])):r("",!0)]),_:1},8,["data-source"])),O.value?(l(),s("div",dt,u(O.value),1)):r("",!0)]),_:1}),a(ye,{open:oe.value,"onUpdate:open":e[3]||(e[3]=i=>oe.value=i),title:"固定文件到 IPFS","confirm-loading":le.value,onOk:ce,"ok-text":"固定","cancel-text":"取消"},{default:o(()=>[e[23]||(e[23]=p("div",{style:{"margin-bottom":"12px",color:"var(--text-secondary)"}},"请输入要固定的文件路径",-1)),a(Ie,{value:R.value,"onUpdate:value":e[2]||(e[2]=i=>R.value=i),placeholder:"文件路径,例如: /path/to/file.txt",onPressEnter:ce},null,8,["value"]),F.value?(l(),s("div",pt,[p("pre",vt,u(F.value),1)])):r("",!0)]),_:1},8,["open","confirm-loading"])]),_:1})]),_:1},8,["activeKey"])])}}},_t=Ne(yt,[["__scopeId","data-v-3d5d81e6"]]);export{_t as default};
@@ -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,3 +0,0 @@
1
- import{l as ce,F as p,D as m,c as s,x as l,m as x,u as _,J as y,q as d,r as g,v as r,H as F,L as O,I as v,G as k,P as pe,j as me}from"./vendor-aH7YaPZi.js";import{u as ye}from"./ws-BTS8ehTm.js";import{_ as fe}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{p as I,Y as ve,r as M,$ as P,ac as _e}from"./icons-DEoqYzGZ.js";import{a as c}from"./index-36fB-tdr.js";import"./index-BPzN5a2A.js";import"./useConfigInject-DIr4olCu.js";import"./transition-B3-w1SVL.js";import"./Keyframes-C7fCrnlS.js";import"./Portal-DXIqogG2.js";import"./index-U4Zd5IK6.js";const ge={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},xe={key:0,style:{"text-align":"center",padding:"60px"}},ke={style:{display:"flex","align-items":"center",gap:"6px",overflow:"hidden"}},he={style:{color:"#e0e0e0","font-size":"13px",overflow:"hidden","text-overflow":"ellipsis","white-space":"nowrap"}},we={style:{color:"var(--text-muted)","font-size":"11px","margin-bottom":"6px",overflow:"hidden","text-overflow":"ellipsis","white-space":"nowrap"}},be={style:{display:"flex","justify-content":"space-between",color:"var(--text-secondary)","font-size":"12px"}},Ce={key:2,style:{"text-align":"center",padding:"40px",color:"var(--text-muted)","margin-bottom":"24px"}},Ae={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"12px"}},Fe={key:3,style:{"text-align":"center",padding:"60px"}},ze=["href"],Se={key:1,style:{color:"#e0e0e0","font-weight":"500"}},Re={key:2,style:{color:"var(--text-secondary)","font-size":"12px"}},Ue={key:1,style:{color:"var(--text-muted)","font-size":"12px"}},$e={style:{padding:"8px 16px",color:"var(--text-secondary)","font-size":"13px","line-height":"1.8","max-height":"300px","overflow-y":"auto"}},Ne={key:0,style:{"margin-bottom":"8px"}},Le=["innerHTML"],Te={key:2,style:{color:"var(--text-muted)"}},je={style:{padding:"40px",color:"var(--text-muted)","text-align":"center"}},De={__name:"RssFeed",setup(Oe){const h=ye(),N=g(!1),z=g(!1),L=g(!1),T=g(!1),w=g([]),C=g([]),S=g(""),R=g(!1),U=g(""),j=g([]),q=me(()=>{const t=w.value.length,e=C.value.length,o=C.value.filter(u=>!u.read).length,n=w.value.filter(u=>u.lastUpdated).sort((u,$)=>new Date($.lastUpdated)-new Date(u.lastUpdated))[0],i=n?D(n.lastUpdated):"-";return[{label:"订阅源数",value:t,color:"#1677ff"},{label:"文章总数",value:e,color:"#52c41a"},{label:"未读文章",value:o,color:"#faad14"},{label:"最近刷新",value:i,color:"#13c2c2"}]}),K=[{title:"标题",key:"title",dataIndex:"title",ellipsis:!0},{title:"来源",key:"source",dataIndex:"source",width:"140px"},{title:"发布时间",key:"publishedAt",dataIndex:"publishedAt",width:"160px"},{title:"状态",key:"status",width:"80px"},{title:"操作",key:"actions",width:"100px"}];function D(t){if(!t)return"-";try{const e=new Date(t);return isNaN(e.getTime())?t:e.toLocaleString("zh-CN",{month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"})}catch{return t}}function W(t){try{const e=t.match(/(\[[\s\S]*\]|\{[\s\S]*\})/);if(e)return JSON.parse(e[1])}catch{}return null}async function A(){N.value=!0;try{const{output:t}=await h.execute("rss list --json",2e4),e=W(t);Array.isArray(e)?w.value=e.map((o,n)=>({key:o.id||o.url||n,id:o.id||String(n),title:o.title||o.name||"",url:o.url||o.feedUrl||"",itemCount:o.itemCount??o.articleCount??o.count??0,lastUpdated:o.lastUpdated||o.updatedAt||o.lastRefresh||""})):w.value=G(t)}catch(t){c.error("加载订阅源失败: "+t.message)}finally{N.value=!1}}function G(t){const e=[],o=t.split(`
2
- `);for(const n of o){const i=n.trim();if(!i||i.startsWith("─")||i.match(/^\d+ feed/i)||i.startsWith("RSS")||i.startsWith("No "))continue;const u=i.match(/^(\d+)\.\s+(.+?)(?:\s+[-–]\s+(.+))?$/);u?e.push({key:u[1],id:u[1],title:u[2].trim(),url:(u[3]||"").trim(),itemCount:0,lastUpdated:""}):i.length>5&&e.push({key:String(e.length),id:String(e.length),title:i.slice(0,80),url:"",itemCount:0,lastUpdated:""})}return e}async function b(){z.value=!0,j.value=[];try{let t="rss articles --limit 30 --json";S.value&&(t=`rss articles --feed ${S.value} --limit 30 --json`);const{output:e}=await h.execute(t,2e4),o=W(e);Array.isArray(o)?C.value=o.map((n,i)=>({key:n.id||String(i),id:n.id||String(i),title:n.title||"无标题",link:n.link||n.url||"",source:n.source||n.feedTitle||n.feedName||"",publishedAt:n.publishedAt||n.pubDate||n.date||"",read:!!n.read,summary:n.summary||n.description||"",content:n.content||""})):C.value=Y(e)}catch(t){c.error("加载文章失败: "+t.message)}finally{z.value=!1}}function Y(t){const e=[],o=t.split(`
3
- `);for(const n of o){const i=n.trim();if(!i||i.startsWith("─")||i.match(/^\d+ article/i)||i.startsWith("No "))continue;const u=i.match(/^(\d+)\.\s+(.+?)(?:\s+[-–]\s+(.+))?$/);u&&e.push({key:u[1],id:u[1],title:u[2].trim(),link:"",source:(u[3]||"").trim(),publishedAt:"",read:!1,summary:"",content:""})}return e}async function Q(){const t=U.value.trim();if(!t){c.warning("请输入订阅源地址");return}T.value=!0;try{const{output:e}=await h.execute(`rss add "${t}"`,3e4);e.includes("error")||e.includes("失败")||e.includes("Error")?c.error("添加失败: "+e.slice(0,120)):(c.success("订阅源已添加"),R.value=!1,U.value="",await A(),await b())}catch(e){c.error("添加失败: "+e.message)}finally{T.value=!1}}async function X(t){try{c.loading({content:`正在刷新 ${t.title||t.id}...`,key:"refreshFeed"}),await h.execute(`rss refresh ${t.id}`,3e4),c.success({content:"刷新完成",key:"refreshFeed"}),await A(),await b()}catch(e){c.error({content:"刷新失败: "+e.message,key:"refreshFeed"})}}async function Z(t){try{c.loading({content:`正在删除 ${t.title||t.id}...`,key:"removeFeed"});const{output:e}=await h.execute(`rss remove ${t.id}`,2e4);e.includes("error")||e.includes("失败")?c.error({content:"删除失败: "+e.slice(0,120),key:"removeFeed"}):(c.success({content:"已删除订阅源",key:"removeFeed"}),await A(),await b())}catch(e){c.error({content:"删除失败: "+e.message,key:"removeFeed"})}}async function ee(){L.value=!0;try{c.loading({content:"正在刷新所有订阅源...",key:"refreshAll"}),await h.execute("rss refresh-all",6e4),c.success({content:"全部刷新完成",key:"refreshAll"}),await A(),await b()}catch(t){c.error({content:"刷新失败: "+t.message,key:"refreshAll"})}finally{L.value=!1}}async function te(t){try{await h.execute(`rss mark-read ${t.id}`,1e4),t.read=!0,c.success("已标记已读")}catch(e){c.error("操作失败: "+e.message)}}function ae(t,e){j.value=t?[e.key]:[]}return ce(async()=>{await A(),await b()}),(t,e)=>{const o=d("a-button"),n=d("a-space"),i=d("a-statistic"),u=d("a-card"),$=d("a-col"),B=d("a-row"),E=d("a-spin"),V=d("a-menu-item"),le=d("a-menu"),se=d("a-dropdown"),H=d("a-select-option"),oe=d("a-select"),J=d("a-tag"),ne=d("a-table"),re=d("a-input"),ie=d("a-form-item"),ue=d("a-form"),de=d("a-modal");return r(),p("div",null,[m("div",ge,[e[6]||(e[6]=m("div",null,[m("h2",{class:"page-title"},"RSS 订阅"),m("p",{class:"page-sub"},"订阅源 / 文章阅读")],-1)),s(n,null,{default:l(()=>[s(o,{type:"primary",onClick:e[0]||(e[0]=a=>R.value=!0)},{icon:l(()=>[s(_(ve))]),default:l(()=>[e[4]||(e[4]=y(" 添加订阅 ",-1))]),_:1}),s(o,{ghost:"",loading:L.value,onClick:ee},{icon:l(()=>[s(_(M))]),default:l(()=>[e[5]||(e[5]=y(" 全部刷新 ",-1))]),_:1},8,["loading"])]),_:1})]),s(B,{gutter:[16,16],style:{"margin-bottom":"20px"}},{default:l(()=>[(r(!0),p(F,null,O(q.value,a=>(r(),x($,{xs:12,sm:6,key:a.label},{default:l(()=>[s(u,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"},size:"small"},{default:l(()=>[s(i,{title:a.label,value:a.value,"value-style":{color:a.color,fontSize:"20px"}},null,8,["title","value","value-style"])]),_:2},1024)]),_:2},1024))),128))]),_:1}),e[16]||(e[16]=m("h3",{style:{color:"var(--text-primary)","margin-bottom":"12px"}},"订阅源管理",-1)),N.value?(r(),p("div",xe,[s(E,{size:"large"})])):w.value.length>0?(r(),x(B,{key:1,gutter:[16,16],style:{"margin-bottom":"24px"}},{default:l(()=>[(r(!0),p(F,null,O(w.value,a=>(r(),x($,{xs:24,sm:12,md:8,lg:6,key:a.id||a.url},{default:l(()=>[s(u,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"},size:"small",hoverable:!0},{title:l(()=>[m("div",ke,[s(_(I),{style:{color:"#1677ff","flex-shrink":"0"}}),m("span",he,v(a.title||"未命名订阅"),1)])]),extra:l(()=>[s(se,null,{overlay:l(()=>[s(le,null,{default:l(()=>[s(V,{onClick:f=>X(a)},{default:l(()=>[s(_(M)),e[8]||(e[8]=y(" 刷新 ",-1))]),_:1},8,["onClick"]),s(V,{onClick:f=>Z(a),danger:""},{default:l(()=>[s(_(_e)),e[9]||(e[9]=y(" 删除 ",-1))]),_:1},8,["onClick"])]),_:2},1024)]),default:l(()=>[s(o,{size:"small",type:"text",style:{color:"var(--text-muted)"}},{default:l(()=>[...e[7]||(e[7]=[y("...",-1)])]),_:1})]),_:2},1024)]),default:l(()=>[m("p",we,[s(_(P)),y(" "+v(a.url||"-"),1)]),m("div",be,[m("span",null,v(a.itemCount??"-")+" 篇文章",1),m("span",null,v(D(a.lastUpdated)),1)])]),_:2},1024)]),_:2},1024))),128))]),_:1})):(r(),p("div",Ce,[s(_(I),{style:{"font-size":"40px","margin-bottom":"12px",display:"block"}}),e[10]||(e[10]=y(' 暂无订阅源,点击"添加订阅"开始 ',-1))])),m("div",Ae,[e[12]||(e[12]=m("h3",{style:{color:"var(--text-primary)",margin:"0"}},"文章列表",-1)),s(n,null,{default:l(()=>[s(oe,{value:S.value,"onUpdate:value":e[1]||(e[1]=a=>S.value=a),style:{"min-width":"180px"},placeholder:"筛选订阅源","allow-clear":"",onChange:b},{default:l(()=>[s(H,{value:""},{default:l(()=>[...e[11]||(e[11]=[y("全部订阅",-1)])]),_:1}),(r(!0),p(F,null,O(w.value,a=>(r(),x(H,{key:a.id,value:a.id},{default:l(()=>[y(v(a.title||a.url),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"]),s(o,{loading:z.value,onClick:b},{icon:l(()=>[s(_(M))]),_:1},8,["loading"])]),_:1})]),z.value?(r(),p("div",Fe,[s(E,{size:"large"})])):(r(),x(ne,{key:4,columns:K,"data-source":C.value,pagination:{pageSize:20,showTotal:a=>`共 ${a} 条`},size:"small",style:{background:"var(--bg-card)"},"row-class-name":()=>"rss-row",expandable:{expandedRowKeys:j.value,onExpand:ae}},{bodyCell:l(({column:a,record:f})=>[a.key==="title"?(r(),p(F,{key:0},[f.link?(r(),p("a",{key:0,href:f.link,target:"_blank",rel:"noopener noreferrer",style:{color:"#1677ff","font-weight":"500"}},[s(_(P),{style:{"margin-right":"4px"}}),y(v(f.title),1)],8,ze)):(r(),p("span",Se,v(f.title),1))],64)):k("",!0),a.key==="source"?(r(),x(J,{key:1,color:"blue",style:{"font-size":"10px"}},{default:l(()=>[y(v(f.source||"-"),1)]),_:2},1024)):k("",!0),a.key==="publishedAt"?(r(),p("span",Re,v(D(f.publishedAt)),1)):k("",!0),a.key==="status"?(r(),x(J,{key:3,color:f.read?"default":"green"},{default:l(()=>[y(v(f.read?"已读":"未读"),1)]),_:2},1032,["color"])):k("",!0),a.key==="actions"?(r(),p(F,{key:4},[f.read?(r(),p("span",Ue,"--")):(r(),x(o,{key:0,size:"small",type:"link",onClick:pe(Ie=>te(f),["stop"])},{default:l(()=>[...e[13]||(e[13]=[y(" 标记已读 ",-1)])]),_:1},8,["onClick"]))],64)):k("",!0)]),expandedRowRender:l(({record:a})=>[m("div",$e,[a.summary?(r(),p("div",Ne,[e[14]||(e[14]=m("strong",{style:{color:"var(--text-primary)"}},"摘要: ",-1)),y(v(a.summary),1)])):k("",!0),a.content?(r(),p("div",{key:1,innerHTML:a.content,style:{color:"var(--text-secondary)"}},null,8,Le)):k("",!0),!a.summary&&!a.content?(r(),p("div",Te,"暂无内容预览")):k("",!0)])]),emptyText:l(()=>[m("div",je,[s(_(I),{style:{"font-size":"40px","margin-bottom":"12px",display:"block"}}),e[15]||(e[15]=y(" 暂无文章 ",-1))])]),_:1},8,["data-source","pagination","expandable"])),s(de,{open:R.value,"onUpdate:open":e[3]||(e[3]=a=>R.value=a),title:"添加订阅源","confirm-loading":T.value,onOk:Q,"ok-text":"添加","cancel-text":"取消"},{default:l(()=>[s(ue,{"label-col":{span:4},"wrapper-col":{span:20},style:{"margin-top":"16px"}},{default:l(()=>[s(ie,{label:"URL",required:""},{default:l(()=>[s(re,{value:U.value,"onUpdate:value":e[2]||(e[2]=a=>U.value=a),placeholder:"输入 RSS 订阅源地址,如 https://example.com/feed.xml"},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"])])}}},Ye=fe(De,[["__scopeId","data-v-66093b20"]]);export{Ye as default};