aitu-app 0.6.21 → 0.6.22

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 (144) hide show
  1. package/README.md +3 -3
  2. package/assets/{ChatMessagesArea-Bc7FkjZo.js → ChatMessagesArea-63H9tZtG.js} +3 -3
  3. package/assets/{KnowledgeBaseContent-BLIcG9KK.js → KnowledgeBaseContent-5j70f-FP.js} +4 -4
  4. package/assets/{ModelBenchmarkWorkbench-CGztJD2j.js → ModelBenchmarkWorkbench-OdGWsh0T.js} +1 -1
  5. package/assets/{ResizableDivider-DfqWs8LM.js → ResizableDivider-DUn2YRJi.js} +1 -1
  6. package/assets/{ToolboxDrawer-B9g_w8pc.js → ToolboxDrawer-DDAFUdNA.js} +1 -1
  7. package/assets/{VideoAnalyzer-KdlQiqKF.js → VideoAnalyzer-C7mAfG_a.js} +1 -1
  8. package/assets/{ai-analyze-D51W4jnj.js → ai-analyze-CJsLcVP0.js} +1 -1
  9. package/assets/{arc-DVIrWwbE.js → arc-BwiBrwsC.js} +1 -1
  10. package/assets/{arc-BqtXmYwJ.js → arc-bU0RTLO_.js} +1 -1
  11. package/assets/{batch-image-generation-DEC8rrCP.js → batch-image-generation-se7md6Xz.js} +1 -1
  12. package/assets/{blockDiagram-38ab4fdb-BgPS1CyJ.js → blockDiagram-38ab4fdb-C-J430-U.js} +1 -1
  13. package/assets/{blockDiagram-38ab4fdb-CMoyjTgm.js → blockDiagram-38ab4fdb-CRlC08-f.js} +1 -1
  14. package/assets/{c4Diagram-3d4e48cf-wjCA-CL-.js → c4Diagram-3d4e48cf-CZXHUfLE.js} +1 -1
  15. package/assets/{c4Diagram-3d4e48cf-CIeKmCwa.js → c4Diagram-3d4e48cf-CjnnPMdb.js} +1 -1
  16. package/assets/channel-C0300EYS.js +1 -0
  17. package/assets/channel-CFKYr4PJ.js +1 -0
  18. package/assets/{classDiagram-70f12bd4-vizVZzUd.js → classDiagram-70f12bd4-CHHFCLtW.js} +1 -1
  19. package/assets/{classDiagram-70f12bd4-DfTNrA1t.js → classDiagram-70f12bd4-Cka5pz9E.js} +1 -1
  20. package/assets/{classDiagram-v2-f2320105-LutY6jPP.js → classDiagram-v2-f2320105-BoY5QpGK.js} +1 -1
  21. package/assets/{classDiagram-v2-f2320105-DO7izSAk.js → classDiagram-v2-f2320105-DhMOYQPM.js} +1 -1
  22. package/assets/{clipper-D3zP18nj.js → clipper-ZDte_DyN.js} +1 -1
  23. package/assets/clone-B4wQMor7.js +1 -0
  24. package/assets/clone-DTNvy75S.js +1 -0
  25. package/assets/{createText-2e5e7dd3-CtWg9f_f.js → createText-2e5e7dd3-CouAisK8.js} +1 -1
  26. package/assets/{createText-2e5e7dd3-iSllMU05.js → createText-2e5e7dd3-DQiR2iFi.js} +1 -1
  27. package/assets/{edges-e0da2a9e-B8N3S4AD.js → edges-e0da2a9e-D5w5n92i.js} +1 -1
  28. package/assets/{edges-e0da2a9e-B9APkBSa.js → edges-e0da2a9e-dJImi3XC.js} +1 -1
  29. package/assets/{erDiagram-9861fffd-Dnp1WpmL.js → erDiagram-9861fffd-9WI5iVS2.js} +1 -1
  30. package/assets/{erDiagram-9861fffd-B1x-ZWfU.js → erDiagram-9861fffd-IyJNqdw_.js} +1 -1
  31. package/assets/{flowDb-956e92f1-BT8eaBZE.js → flowDb-956e92f1-DltT8K-M.js} +1 -1
  32. package/assets/{flowDb-956e92f1-5caTHN1T.js → flowDb-956e92f1-FUMkFpNV.js} +1 -1
  33. package/assets/{flowDiagram-66a62f08-B5xcjVie.js → flowDiagram-66a62f08-Dbc4Nx93.js} +1 -1
  34. package/assets/{flowDiagram-66a62f08-Cx_V_MoA.js → flowDiagram-66a62f08-nXDkz0Ug.js} +1 -1
  35. package/assets/flowDiagram-v2-96b9c2cf-BVOhfZw2.js +1 -0
  36. package/assets/flowDiagram-v2-96b9c2cf-j5LlfdZR.js +1 -0
  37. package/assets/{flowchart-elk-definition-4a651766-Cjgywupa.js → flowchart-elk-definition-4a651766-B6rzHwEw.js} +1 -1
  38. package/assets/{flowchart-elk-definition-4a651766-CwIA9l-O.js → flowchart-elk-definition-4a651766-gZ7Jh0C4.js} +1 -1
  39. package/assets/{ganttDiagram-c361ad54-6zSjhOJy.js → ganttDiagram-c361ad54-B9Sd11GI.js} +1 -1
  40. package/assets/{ganttDiagram-c361ad54-oySKvDa4.js → ganttDiagram-c361ad54-CItnWrDi.js} +1 -1
  41. package/assets/{gitGraphDiagram-72cf32ee-BK7TWB1s.js → gitGraphDiagram-72cf32ee-CYyEomwm.js} +1 -1
  42. package/assets/{gitGraphDiagram-72cf32ee-BnNAY3pp.js → gitGraphDiagram-72cf32ee-Dd5nG_11.js} +1 -1
  43. package/assets/{graph-B_MH2EY9.js → graph-BHlg4sFb.js} +1 -1
  44. package/assets/{graph-BPS27gwv.js → graph-Cy6oe2k_.js} +1 -1
  45. package/assets/{grid-image-DLa8OQhL.js → grid-image-C-msrN1B.js} +1 -1
  46. package/assets/{has-D0S1Zmzg.js → has-CWNO02CD.js} +1 -1
  47. package/assets/{hasIn-De9yBkgj.js → hasIn-Bs6kQ8q7.js} +1 -1
  48. package/assets/{index-3862675e-FzFTrzJW.js → index-3862675e-BKpqGoRu.js} +1 -1
  49. package/assets/{index-3862675e-D6LCgHcS.js → index-3862675e-DsPsD_QS.js} +1 -1
  50. package/assets/{index-T5OF1JP4.js → index-B-A2026m.js} +1 -1
  51. package/assets/{index-Bjr6SLmW.js → index-BC5aP94k.js} +1 -1
  52. package/assets/{index-Cb_6lq4r.js → index-BEFGFeiI.js} +1 -1
  53. package/assets/{index-Dgs_9LtJ.js → index-BTRvm9gy.js} +1 -1
  54. package/assets/{index-B8Cp8ZAq.js → index-B_ECxmtW.js} +1 -1
  55. package/assets/{index-CGUpUzSI.js → index-BcM3gyCR.js} +1 -1
  56. package/assets/{index-Ia_xKhIZ.js → index-BdH171U0.js} +5 -5
  57. package/assets/{index-sARZWo5n.js → index-Br38Ej3g.js} +1 -1
  58. package/assets/{index-CU-f8hlX.js → index-C-wf0YcU.js} +1 -1
  59. package/assets/{index-Ctlb8bi0.js → index-C1X4nHa1.js} +1 -1
  60. package/assets/{index-Br6iEGLw.js → index-CCzr4Dqs.js} +1 -1
  61. package/assets/{index-DYQtOpt_.js → index-CMfdA3Eb.js} +1 -1
  62. package/assets/{index-B1Qj7KmK.js → index-CRvF4JAy.js} +1 -1
  63. package/assets/{index-GP_0iNEx.js → index-CUYzOOe1.js} +1 -1
  64. package/assets/{index-rrHZbeHC.js → index-CnVvluBH.js} +1 -1
  65. package/assets/{index-Ddc6oDDk.js → index-D4JTX52h.js} +1 -1
  66. package/assets/{index-BdrYk4gf.js → index-DB9eHDVM.js} +1 -1
  67. package/assets/{index-DFgRlr0t.js → index-DGVrURNm.js} +1 -1
  68. package/assets/{index-CG_qIHbM.js → index-Dczi3BkD.js} +1 -1
  69. package/assets/{index-CSxjkKUk.js → index-DtJW2qel.js} +1 -1
  70. package/assets/{index-6opHRfWl.js → index-DysS6hq1.js} +1 -1
  71. package/assets/{index-C6mW2Bug.js → index-KJVd0B2z.js} +1 -1
  72. package/assets/{index-BIv91qW9.js → index-T9dstNa6.js} +16 -16
  73. package/assets/{index-B3GMIqjJ.js → index-TQu9hYF9.js} +1 -1
  74. package/assets/{index-CAghokCh.js → index-Y5c26X-0.js} +1 -1
  75. package/assets/{index-BR5Ge2w3.js → index-YBixVTkA.js} +1 -1
  76. package/assets/{index-CqeciDtE.js → index-ZRpcXeUi.js} +1 -1
  77. package/assets/{index-DUFh_idy.js → index-byQfZx9Y.js} +1 -1
  78. package/assets/{index-DJhDtQwz.js → index-hmLPqXUT.js} +1 -1
  79. package/assets/{index-BUde8Mm7.js → index-iDwZIVzi.js} +1 -1
  80. package/assets/{index-B_TY0tLT.js → index-sRNe5iWo.js} +1 -1
  81. package/assets/{index-CoNiRHcD.js → index-w0J-N3Bz.js} +1 -1
  82. package/assets/{index-CIsTR1zp.js → index-xSQSiTqU.js} +1 -1
  83. package/assets/{infoDiagram-f8f76790-C5lK_OdP.js → infoDiagram-f8f76790-D3aFK43x.js} +1 -1
  84. package/assets/{infoDiagram-f8f76790-DqxLIqvx.js → infoDiagram-f8f76790-plyhvVln.js} +1 -1
  85. package/assets/{inspiration-board-DELLwhlH.js → inspiration-board-WeHubIbH.js} +1 -1
  86. package/assets/{isEmpty-DF_ugZHw.js → isEmpty-DZgnI1Gi.js} +1 -1
  87. package/assets/{journeyDiagram-49397b02-f6bVwxyz.js → journeyDiagram-49397b02-BUEu9YZl.js} +1 -1
  88. package/assets/{journeyDiagram-49397b02-BJ9tbMfk.js → journeyDiagram-49397b02-CJLyWjZc.js} +1 -1
  89. package/assets/{layers-DAOrLzwi.js → layers-BZ-h9vGA.js} +1 -1
  90. package/assets/{layout-yMh6DKYs.js → layout-CB3iLEN-.js} +1 -1
  91. package/assets/{layout-fmUyEip8.js → layout-CfIv6ys6.js} +1 -1
  92. package/assets/{line-DANa88VO.js → line-Cl2IINpY.js} +1 -1
  93. package/assets/{line-DXiCFjwk.js → line-DEMH00tR.js} +1 -1
  94. package/assets/{linear-5iY8Cy-H.js → linear-CAlPBLIZ.js} +1 -1
  95. package/assets/{linear-ctDXkzM_.js → linear-CYligRij.js} +1 -1
  96. package/assets/{mermaid.core-Dgk12NKe.js → mermaid.core-HRa8_3iy.js} +5 -5
  97. package/assets/{mindmap-definition-fc14e90a-C7BlMhzr.js → mindmap-definition-fc14e90a-BE_BelNq.js} +1 -1
  98. package/assets/{mindmap-definition-fc14e90a-DLlf6Rx9.js → mindmap-definition-fc14e90a-BjEfE1ER.js} +1 -1
  99. package/assets/{model-benchmark-launcher-fleyPbmY.js → model-benchmark-launcher-DGhnqUWi.js} +1 -1
  100. package/assets/{photo-wall-splitter-xpPO2k5T.js → photo-wall-splitter-CEBkekUS.js} +1 -1
  101. package/assets/{pick-VCZntyna.js → pick-BDzXufGU.js} +1 -1
  102. package/assets/{pieDiagram-8a3498a8-BBnaNSJ-.js → pieDiagram-8a3498a8-BOz79K-l.js} +1 -1
  103. package/assets/{pieDiagram-8a3498a8-BvSfbq65.js → pieDiagram-8a3498a8-BXg1_0zb.js} +1 -1
  104. package/assets/{quadrantDiagram-120e2f19-Bnh-DNQv.js → quadrantDiagram-120e2f19-BNSax4Yv.js} +1 -1
  105. package/assets/{quadrantDiagram-120e2f19-Cm8pCCM5.js → quadrantDiagram-120e2f19-BW0c6246.js} +1 -1
  106. package/assets/{requirementDiagram-deff3bca-CDm-DECv.js → requirementDiagram-deff3bca-BdKQCBBh.js} +1 -1
  107. package/assets/{requirementDiagram-deff3bca-DMRUc1cx.js → requirementDiagram-deff3bca-DLC9wibM.js} +1 -1
  108. package/assets/{sankeyDiagram-04a897e0-CXC5R9JG.js → sankeyDiagram-04a897e0-gzh6unx3.js} +1 -1
  109. package/assets/{sankeyDiagram-04a897e0-BMtXJIXg.js → sankeyDiagram-04a897e0-mnwYvtIk.js} +1 -1
  110. package/assets/{sequenceDiagram-704730f1-D42qglAv.js → sequenceDiagram-704730f1-9WzL_6Og.js} +1 -1
  111. package/assets/{sequenceDiagram-704730f1-CNMmBUQx.js → sequenceDiagram-704730f1-CPrfOGmY.js} +1 -1
  112. package/assets/{settings-dialog-2ODvctTh.js → settings-dialog-DKi0S3Fj.js} +1 -1
  113. package/assets/{shard-sync-service-D3USLllH.js → shard-sync-service-DMBoL8-S.js} +1 -1
  114. package/assets/{stateDiagram-587899a1-DqPLyMub.js → stateDiagram-587899a1-D0lAIKBU.js} +1 -1
  115. package/assets/{stateDiagram-587899a1-DsEPR5ou.js → stateDiagram-587899a1-DHfaNuxL.js} +1 -1
  116. package/assets/{stateDiagram-v2-d93cdb3a-DrlPKA21.js → stateDiagram-v2-d93cdb3a-BW2UOJGd.js} +1 -1
  117. package/assets/{stateDiagram-v2-d93cdb3a-Bf_7sDs_.js → stateDiagram-v2-d93cdb3a-BkSMcdnU.js} +1 -1
  118. package/assets/{styles-6aaf32cf-YHAPMNO9.js → styles-6aaf32cf-BzV4m8wn.js} +1 -1
  119. package/assets/{styles-6aaf32cf-Bj2sDHb0.js → styles-6aaf32cf-DbLx1dQP.js} +1 -1
  120. package/assets/{styles-9a916d00-7jELss6_.js → styles-9a916d00-BWvAJ5en.js} +1 -1
  121. package/assets/{styles-9a916d00-CZUDnhpb.js → styles-9a916d00-DfAvsjKD.js} +1 -1
  122. package/assets/{styles-c10674c1-DC9073pI.js → styles-c10674c1-CeFiajQK.js} +1 -1
  123. package/assets/{styles-c10674c1-DLuj745u.js → styles-c10674c1-DOM3WQ5r.js} +1 -1
  124. package/assets/{svgDrawCommon-08f97a94-CrWF0HaY.js → svgDrawCommon-08f97a94-BVgqbMeh.js} +1 -1
  125. package/assets/{svgDrawCommon-08f97a94-D2AO9i1k.js → svgDrawCommon-08f97a94-BlKKsIl4.js} +1 -1
  126. package/assets/{timeline-definition-85554ec2-leTEuD1Q.js → timeline-definition-85554ec2-9aW1_D2N.js} +1 -1
  127. package/assets/{timeline-definition-85554ec2-7KS0GPh6.js → timeline-definition-85554ec2-DzpdYs0t.js} +1 -1
  128. package/assets/ttd-dialog-DEnnfHyO.js +115 -0
  129. package/assets/{upload-CQNwOcX2.js → upload-DNNZ8L4F.js} +1 -1
  130. package/assets/{video-recovery-service-BQIopXWm.js → video-recovery-service-CbVWiAGn.js} +1 -1
  131. package/assets/{xychartDiagram-e933f94c-BCEY4mIx.js → xychartDiagram-e933f94c-DNl2ns7z.js} +1 -1
  132. package/assets/{xychartDiagram-e933f94c-B_6b1Ojq.js → xychartDiagram-e933f94c-d54TQLOU.js} +1 -1
  133. package/changelog.json +13 -0
  134. package/package.json +1 -1
  135. package/precache-manifest.json +277 -277
  136. package/sw.js +1 -1
  137. package/version.json +3 -7
  138. package/assets/channel-Ckduo0Rh.js +0 -1
  139. package/assets/channel-DXN87Isu.js +0 -1
  140. package/assets/clone-CuD87pDT.js +0 -1
  141. package/assets/clone-DOLqw3Mb.js +0 -1
  142. package/assets/flowDiagram-v2-96b9c2cf-BaJg3X7e.js +0 -1
  143. package/assets/flowDiagram-v2-96b9c2cf-bslUZjmZ.js +0 -1
  144. package/assets/ttd-dialog-DZzhIaYG.js +0 -115
@@ -1 +1 @@
1
- import{ck as K,cl as F,cm as Z,cn as ae,co as re,cp as ie,cq as ne,cr as oe,cs as z,c8 as Y,z as P,as as V,b$ as B,ct as $,cu as me,cv as be,cw as fe,cx as ce,cy as H,u as q,cz as ge,cA as ke,y as he,r as _,bl as T,cc as Ne,cB as we,ab as d,cC as xe,cD as ye,cf as O}from"./index-BIv91qW9.js";import{P as Q}from"./index-B1Qj7KmK.js";import{U as je}from"./upload-CQNwOcX2.js";const de=3,W="aitu-backup";function X(S){return S.map(t=>t.id?t:{...t,id:`imported-${Date.now()}-${Math.random().toString(36).slice(2,9)}`})}const Ee=500*1024*1024;async function M(S,t){const e=URL.createObjectURL(S),r=document.createElement("a");r.href=e,r.download=t,document.body.appendChild(r),r.click(),document.body.removeChild(r),await new Promise(s=>setTimeout(s,1200)),URL.revokeObjectURL(e)}class ve{constructor(t,e){this.partIndex=1,this.currentSize=0,this.downloadedParts=[],this.baseFilename=t,this.backupId=e,this.currentZip=new K,this.part1Zip=this.currentZip}addFile(t,e){const r=typeof e=="string"?e:JSON.stringify(e,null,2);this.currentZip.file(t,r),this.currentSize+=new Blob([r]).size}normalizeEntryDate(t){if(!t||Number.isNaN(t)||t<=0)return new Date;const e=t<1e12?t*1e3:t,r=new Date(e);return Number.isNaN(r.getTime())?new Date:r}async addAssetBlob(t,e,r,s,i){const u=typeof s=="string"?s:JSON.stringify(s,null,2),m=e.size+new Blob([u]).size,p=this.normalizeEntryDate(i);this.currentSize+m>Ee&&this.currentSize>0&&(await this.finalizePart(),this.startNewPart());const n=this.currentZip.folder("assets");n.file(r,u,{date:p}),n.file(t,e,{date:p}),this.currentSize+=m}async finalizePart(){const t={signature:W,version:de,createdAt:Date.now(),source:"app",backupId:this.backupId,partIndex:this.partIndex,totalParts:null,isFinalPart:!1,includes:{prompts:!1,projects:!1,assets:!0,knowledgeBase:!1}};if((this.partIndex===1?this.part1Zip:this.currentZip).file("manifest.json",JSON.stringify(t,null,2)),this.partIndex===1)return;const r=await this.currentZip.generateAsync({type:"blob",compression:"DEFLATE",compressionOptions:{level:6}}),s=`${this.baseFilename}_part${this.partIndex}.zip`;this.downloadedParts.length>0&&await new Promise(i=>setTimeout(i,500)),await M(r,s),this.downloadedParts.push({filename:s,size:r.size})}startNewPart(){this.partIndex++,this.currentZip=new K,this.currentSize=0}async finalizeAll(t){if(!(this.partIndex>1)){t.backupId=this.backupId,t.partIndex=1,t.totalParts=1,t.isFinalPart=!0,this.part1Zip.file("manifest.json",JSON.stringify(t,null,2));const u=await this.part1Zip.generateAsync({type:"blob",compression:"DEFLATE",compressionOptions:{level:6}}),m=`${this.baseFilename}.zip`;return await M(u,m),{files:[{filename:m,size:u.size}],totalParts:1,stats:t.stats}}const r={...t,backupId:this.backupId,partIndex:1,totalParts:null,isFinalPart:!1};this.part1Zip.file("manifest.json",JSON.stringify(r,null,2));const s=await this.part1Zip.generateAsync({type:"blob",compression:"DEFLATE",compressionOptions:{level:6}}),i=`${this.baseFilename}_part1.zip`;if(await M(s,i),this.downloadedParts.unshift({filename:i,size:s.size}),this.currentSize>0){const u={...t,backupId:this.backupId,partIndex:this.partIndex,totalParts:this.partIndex,isFinalPart:!0};this.currentZip.file("manifest.json",JSON.stringify(u,null,2));const m=await this.currentZip.generateAsync({type:"blob",compression:"DEFLATE",compressionOptions:{level:6}}),p=`${this.baseFilename}_part${this.partIndex}.zip`;await new Promise(n=>setTimeout(n,700)),await M(m,p),this.downloadedParts.push({filename:p,size:m.size})}return{files:this.downloadedParts,totalParts:this.partIndex,stats:t.stats}}}function le(S){return{"image/jpeg":".jpg","image/jpg":".jpg","image/png":".png","image/gif":".gif","image/webp":".webp","image/svg+xml":".svg","video/mp4":".mp4","video/webm":".webm","video/quicktime":".mov"}[S]||""}function J(S){return S.replace(/[<>:"/\\|?*]/g,"_").replace(/\s+/g," ").trim()||"unnamed"}function Se(S){let t=0;for(let e=0;e<S.length;e++){const r=S.charCodeAt(e);t=(t<<5)-t+r,t=t&t}return`cache-${Math.abs(t).toString(36)}`}function ee(){return`${Date.now().toString(36)}-${Math.random().toString(36).substring(2,11)}`}class _e{formatTimestampForFilename(t){const e=typeof t=="number"&&Number.isFinite(t)?new Date(t):new Date;if(Number.isNaN(e.getTime()))return"unknown-time";const r=e.getFullYear(),s=String(e.getMonth()+1).padStart(2,"0"),i=String(e.getDate()).padStart(2,"0"),u=String(e.getHours()).padStart(2,"0"),m=String(e.getMinutes()).padStart(2,"0"),p=String(e.getSeconds()).padStart(2,"0");return`${r}${s}${i}_${u}${m}${p}`}buildAssetExportBaseName(t,e){const r=this.formatTimestampForFilename(e),s=J(t);return`${r}_${s}`}shouldExportAssetByRange(t,e){const{timeRangeStart:r,timeRangeEnd:s}=e;return!r&&!s?!0:!(typeof t!="number"||Number.isNaN(t)||t<=0||typeof r=="number"&&t<r||typeof s=="number"&&t>s)}async exportToZip(t,e){const r=Date.now();F.track("backup_export_start",{includePrompts:t.includePrompts,includeProjects:t.includeProjects,includeAssets:t.includeAssets}),e==null||e(5,"正在准备数据...");const s=new Date,i=s.toISOString().split("T")[0],u=s.toTimeString().split(" ")[0].replace(/:/g,""),m=`aitu_backup_${i}_${u}`,p=`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,8)}`,n=new ve(m,p),g=Z.getCurrentBoard(),h={currentBoardId:(g==null?void 0:g.id)||null,currentBoardName:g==null?void 0:g.name,viewport:g==null?void 0:g.viewport},l={signature:W,version:de,createdAt:Date.now(),includes:{prompts:t.includePrompts,projects:t.includeProjects,assets:t.includeAssets,knowledgeBase:t.includeKnowledgeBase},stats:{promptCount:0,videoPromptCount:0,imagePromptCount:0,folderCount:0,boardCount:0,assetCount:0,taskCount:0,kbNoteCount:0},workspaceState:h};if(t.includePrompts){e==null||e(10,"正在导出提示词...");const b=await this.collectPromptData();n.addFile("prompts.json",b),l.stats.promptCount=b.promptHistory.length,l.stats.videoPromptCount=b.videoPromptHistory.length,l.stats.imagePromptCount=b.imagePromptHistory.length}if(t.includeKnowledgeBase){e==null||e(30,"正在导出知识库...");try{const b=await ae.exportAllData();n.addFile("knowledge-base.json",b),l.stats.kbNoteCount=b.notes.length}catch(b){console.error("Failed to export knowledge base:",b)}}t.includeProjects&&(e==null||e(40,"正在导出项目..."),await this.exportProjects(n,l,!t.includeAssets,e)),t.includeAssets&&(e==null||e(50,"正在导出素材..."),await this.exportAssets(n,l,t,e)),e==null||e(85,"正在压缩文件...");const w=await n.finalizeAll(l);return e==null||e(100,"导出完成"),F.track("backup_export_success",{duration:Date.now()-r,totalParts:w.totalParts,promptCount:l.stats.promptCount+l.stats.videoPromptCount+l.stats.imagePromptCount,projectCount:l.stats.boardCount,assetCount:l.stats.assetCount,taskCount:l.stats.taskCount}),w}downloadZip(t,e){const r=new Date,s=r.toISOString().split("T")[0],i=r.toTimeString().split(" ")[0].replace(/:/g,""),u=`aitu_backup_${s}_${i}.zip`,m=URL.createObjectURL(t),p=document.createElement("a");p.href=m,p.download=e||u,document.body.appendChild(p),p.click(),document.body.removeChild(p),URL.revokeObjectURL(m)}async collectPromptData(){await re();const t=ie();let e=ne(),r=oe();const s=await z.getAllTasks({status:Y.COMPLETED}),i=s.filter(l=>{var w;return l.type===P.IMAGE&&((w=l.params)==null?void 0:w.prompt)}).map(l=>({id:`task_${l.id}`,content:l.params.prompt.trim(),timestamp:l.completedAt||l.createdAt})).filter(l=>l.content.length>0),u=s.filter(l=>{var w;return l.type===P.VIDEO&&((w=l.params)==null?void 0:w.prompt)}).map(l=>({id:`task_${l.id}`,content:l.params.prompt.trim(),timestamp:l.completedAt||l.createdAt})).filter(l=>l.content.length>0),m=new Set(r.map(l=>l.content)),p=i.filter(l=>!m.has(l.content));r=[...r,...p];const n=new Set(e.map(l=>l.content)),g=u.filter(l=>!n.has(l.content));e=[...e,...g];const h=await V.get(B.PRESET_SETTINGS);return{promptHistory:t,videoPromptHistory:e,imagePromptHistory:r,presetSettings:h||{image:{pinnedPrompts:[],deletedPrompts:[]},video:{pinnedPrompts:[],deletedPrompts:[]}}}}async exportProjects(t,e,r,s){const[i,u]=await Promise.all([$.loadAllFolders(),$.loadAllBoards()]),m=this.buildFolderPathMap(i);e.stats.folderCount=i.length;for(let p=0;p<u.length;p++){const n=u[p],g=n.folderId?m.get(n.folderId):null,h=J(n.name),l=g?`projects/${g}/${h}.drawnix`:`projects/${h}.drawnix`,w=r?await me(n.elements||[]):void 0,b={type:be.drawnix,version:fe.drawnix,source:"backup",elements:n.elements||[],viewport:n.viewport||{zoom:1},theme:n.theme,embeddedMedia:w,boardMeta:{id:n.id,name:n.name,folderId:n.folderId,order:n.order,createdAt:n.createdAt,updatedAt:n.updatedAt}};if(t.addFile(l,b),s&&u.length>0){const x=25+Math.round((p+1)/u.length*20);s(x,`正在导出画板 (${p+1}/${u.length})...`)}}e.stats.boardCount=u.length}buildFolderPathMap(t){const e=new Map,r=new Map;for(const i of t)r.set(i.id,i);const s=i=>{if(e.has(i))return e.get(i);const u=r.get(i);if(!u)return"";const m=J(u.name);if(u.parentId){const p=s(u.parentId),n=p?`${p}/${m}`:m;return e.set(i,n),n}return e.set(i,m),m};for(const i of t)s(i.id);return e}async getActualCreationTime(t){var e;try{if((e=t.metadata)!=null&&e.taskId){const i=await z.getTask(t.metadata.taskId);if(i!=null&&i.completedAt)return i.completedAt;if(i!=null&&i.createdAt)return i.createdAt}const r=new URL(t.url),s=r.searchParams.get("t")||r.searchParams.get("timestamp");if(s){const i=parseInt(s,10);if(!Number.isNaN(i)&&i>0)return i}return t.cachedAt}catch(r){return console.warn(`[BackupRestore] Failed to get actual creation time for ${t.url}:`,r),t.cachedAt}}async exportAssets(t,e,r,s){var N;const i=new Set;let u=0;const m=[],p=ce.createInstance({name:H.STORAGE_NAME,storeName:H.STORE_NAME}),n=await p.keys(),g=n.length;for(let a=0;a<n.length;a++){try{const c=await p.getItem(n[a]);if(c&&this.shouldExportAssetByRange(c.createdAt,r)){const o=await q.getCachedBlob(c.url);if(o){const f=this.buildAssetExportBaseName(c.id,c.createdAt);m.push({baseName:f,blobData:o,metaData:c,createdAt:c.createdAt}),i.add(c.url)}}}catch(c){console.warn(`[BackupRestore] Failed to load asset ${n[a]}:`,c)}if(s&&g>0){const c=50+Math.round((a+1)/g*15);s(c,`正在导出本地素材 (${a+1}/${g})...`)}}const l=(await q.getAllCacheMetadata()).filter(a=>!i.has(a.url)),w=l.length;for(let a=0;a<l.length;a++){const c=l[a];try{const o=await this.getActualCreationTime(c);if(!this.shouldExportAssetByRange(o,r))continue;const f=((N=c.metadata)==null?void 0:N.taskId)||Se(c.url),j=o||c.cachedAt,D={id:f,url:c.url,type:c.type==="video"?"VIDEO":"IMAGE",mimeType:c.mimeType,size:c.size,source:"AI_GENERATED",createdAt:j,updatedAt:c.lastUsed,metadata:c.metadata},E=await q.getCachedBlob(c.url);if(E){const I=this.buildAssetExportBaseName(f,j);m.push({baseName:I,blobData:E,metaData:D,createdAt:j}),i.add(c.url)}}catch(o){console.warn(`[BackupRestore] Failed to export cached media ${c.url}:`,o)}if(s&&w>0){const o=65+Math.round((a+1)/w*10);s(o,`正在导出缓存媒体 (${a+1}/${w})...`)}}m.sort((a,c)=>{const o=a.createdAt??0,f=c.createdAt??0;return o!==f?o-f:a.baseName.localeCompare(c.baseName)});for(let a=0;a<m.length;a++){const c=m[a],o=typeof c.metaData=="string"?JSON.parse(c.metaData):c.metaData,f=typeof(o==null?void 0:o.mimeType)=="string"?o.mimeType:c.blobData.type,j=le(f);if(await t.addAssetBlob(`${c.baseName}${j}`,c.blobData,`${c.baseName}.meta.json`,c.metaData,c.createdAt),u++,s&&m.length>0){const D=75+Math.round((a+1)/m.length*10);s(D,`正在写入素材 (${a+1}/${m.length})...`)}}e.stats.assetCount=u,s==null||s(85,"正在导出任务数据...");const x=(await z.getAllTasks()).filter(a=>{var c;return a.status===Y.COMPLETED&&(a.type===P.IMAGE||a.type===P.VIDEO)&&((c=a.result)==null?void 0:c.url)});x.length>0&&(t.addFile("tasks.json",x),e.stats.taskCount=x.length)}}const te=new _e;class De{async importFromZip(t,e){const r=Date.now();F.track("backup_import_start",{fileSize:t.size,fileName:t.name});const s={success:!1,prompts:{imported:0,skipped:0},projects:{folders:0,boards:0,merged:0,skipped:0},assets:{imported:0,skipped:0},tasks:{imported:0,skipped:0},knowledgeBase:{directories:0,notes:0,tags:0,skipped:0},errors:[]};try{e==null||e(5,"正在读取文件...");const i=await K.loadAsync(t);e==null||e(10,"正在验证文件格式...");const u=i.file("manifest.json");if(!u)throw new Error("无效的备份文件:未找到 manifest.json");const m=await u.async("string"),p=JSON.parse(m);if(p.signature!==W)throw new Error("无效的备份文件:签名不匹配");if(p.includes.prompts){e==null||e(20,"正在导入提示词...");const n=i.file("prompts.json");if(n){const g=await n.async("string"),h=JSON.parse(g);s.prompts=await this.importPromptData(h)}}if(p.includes.knowledgeBase){e==null||e(30,"正在导入知识库...");const n=await this.importKnowledgeBase(i);s.knowledgeBase=n,n.errors&&n.errors.length>0&&s.errors.push(...n.errors)}p.includes.projects&&(e==null||e(40,"正在导入项目..."),s.projects=await this.importProjects(i,e)),p.includes.assets&&(e==null||e(60,"正在导入素材..."),s.assets=await this.importAssets(i,e),e==null||e(85,"正在导入任务数据..."),s.tasks=await this.importTasks(i)),(s.projects.folders>0||s.projects.boards>0||s.projects.merged>0)&&await Z.reload(),p.workspaceState&&(s.workspaceState=p.workspaceState),s.success=s.errors.length===0,e==null||e(100,"导入完成"),F.track("backup_import_success",{duration:Date.now()-r,promptCount:s.prompts.imported,projectCount:s.projects.boards,assetCount:s.assets.imported,taskCount:s.tasks.imported,kbNoteCount:s.knowledgeBase.notes,skippedCount:s.prompts.skipped+s.projects.skipped+s.assets.skipped+s.tasks.skipped+s.knowledgeBase.skipped})}catch(i){const u=i instanceof Error?i.message:String(i);s.errors.push(u),F.track("backup_import_failed",{duration:Date.now()-r,error:u})}return s}async importKnowledgeBase(t){const e=t.file("knowledge-base.json");if(!e)return{directories:0,notes:0,tags:0,skipped:0,errors:[]};try{const r=await e.async("string"),s=JSON.parse(r),i=await ae.importAllData(s);return{directories:i.dirCount,notes:i.noteCount,tags:i.tagCount,skipped:0,errors:[]}}catch(r){return console.error("Failed to import knowledge base:",r),{directories:0,notes:0,tags:0,skipped:0,errors:[`Knowledge base import failed: ${r instanceof Error?r.message:String(r)}`]}}}async importPromptData(t){let e=0,r=0;const s=t.promptHistory||[],i=t.videoPromptHistory||[],u=t.imagePromptHistory||[];await re();const m=ie(),p=ne(),n=oe(),g=new Set(m.map(f=>f.id)),h=new Set(m.map(f=>f.content)),l=s.filter(f=>g.has(f.id)||h.has(f.content)?(r++,!1):(e++,!0)),w=new Set(p.map(f=>f.id)),b=new Set(p.map(f=>f.content)),x=i.filter(f=>w.has(f.id)||b.has(f.content)?(r++,!1):(e++,!0)),N=new Set(n.map(f=>f.id)),a=new Set(n.map(f=>f.content)),c=u.filter(f=>N.has(f.id)||a.has(f.content)?(r++,!1):(e++,!0));await V.set(B.PROMPT_HISTORY,[...m,...l]),await V.set(B.VIDEO_PROMPT_HISTORY,[...p,...x]),await V.set(B.IMAGE_PROMPT_HISTORY,[...n,...c]);const o=await V.get(B.PRESET_SETTINGS);if(o&&t.presetSettings){const f={image:{pinnedPrompts:[...new Set([...o.image.pinnedPrompts,...t.presetSettings.image.pinnedPrompts])],deletedPrompts:[...new Set([...o.image.deletedPrompts,...t.presetSettings.image.deletedPrompts])]},video:{pinnedPrompts:[...new Set([...o.video.pinnedPrompts,...t.presetSettings.video.pinnedPrompts])],deletedPrompts:[...new Set([...o.video.deletedPrompts,...t.presetSettings.video.deletedPrompts])]}};await V.set(B.PRESET_SETTINGS,f)}else t.presetSettings&&await V.set(B.PRESET_SETTINGS,t.presetSettings);return await ge(),{imported:e,skipped:r}}async importProjects(t,e){let r=0,s=0,i=0,u=0;const m=await $.loadAllFolders(),p=await $.loadAllBoards(),n=new Set(p.map(b=>b.id)),g=Object.keys(t.files).filter(b=>b.startsWith("projects/")&&b.endsWith(".drawnix")&&!b.includes("/_"));if(g.length===0)return{folders:0,boards:0,merged:0,skipped:0};const h=new Set,l=new Map;for(const b of g){const N=b.replace(/^projects\//,"").split("/");if(N.length>1){let a="";for(let c=0;c<N.length-1;c++)a=a?`${a}/${N[c]}`:N[c],h.add(a)}}const w=Array.from(h).sort((b,x)=>{const N=b.split("/").length,a=x.split("/").length;return N-a||b.localeCompare(x)});for(let b=0;b<w.length;b++){const x=w[b],N=x.split("/"),a=N[N.length-1],c=N.length>1?N.slice(0,-1).join("/"):null,o=c&&l.get(c)||null,f=ee();l.set(x,f);const j=m.find(E=>E.name===a&&E.parentId===o);if(j){l.set(x,j.id),u++;continue}const D={id:f,name:a,parentId:o,order:b,isExpanded:!0,createdAt:Date.now(),updatedAt:Date.now()};await $.saveFolder(D),r++}for(let b=0;b<g.length;b++){const x=g[b];try{const N=t.file(x);if(N){const a=await N.async("string"),c=JSON.parse(a);await ke(c.embeddedMedia);const o=c.boardMeta,j=x.replace(/^projects\//,"").split("/"),D=j.length>1?j.slice(0,-1).join("/"):null,E=D&&(l.get(D)||(o==null?void 0:o.folderId))||null,I=j[j.length-1]||"unnamed.drawnix",U=(o==null?void 0:o.name)||I.replace(".drawnix","");if(o!=null&&o.id&&n.has(o.id)){const A=p.find(R=>R.id===o.id);if(A){const R=new Set((A.elements||[]).map(v=>v.id).filter(v=>!!v)),k=(c.elements||[]).filter(v=>v.id?!R.has(v.id):!0),y={...A,elements:[...A.elements||[],...X(k)],viewport:c.viewport||A.viewport,theme:c.theme||A.theme,updatedAt:Date.now()};await $.saveBoard(y),i++;continue}}const L={id:(o==null?void 0:o.id)||ee(),name:U,folderId:E,order:(o==null?void 0:o.order)??b,elements:X(c.elements||[]),viewport:c.viewport,theme:c.theme,createdAt:(o==null?void 0:o.createdAt)||Date.now(),updatedAt:(o==null?void 0:o.updatedAt)||Date.now()};await $.saveBoard(L),s++}}catch(N){console.warn(`[BackupRestore] Failed to import board ${x}:`,N)}if(e&&g.length>0){const N=40+Math.round((b+1)/g.length*15);e(N,`正在导入画板 (${b+1}/${g.length})...`)}}return{folders:r,boards:s,merged:i,skipped:u}}async importAssets(t,e){var g,h,l;let r=0,s=0;const i=Object.keys(t.files).filter(w=>w.startsWith("assets/")&&w.endsWith(".meta.json"));if(i.length===0)return{imported:0,skipped:0};const u=ce.createInstance({name:H.STORAGE_NAME,storeName:H.STORE_NAME}),m=await u.keys(),p=new Set(m),n=new Set(await q.getAllCachedUrls());for(let w=0;w<i.length;w++){const b=i[w],x=b.replace("assets/","").replace(".meta.json","");let N=x;try{const a=t.file(b);if(!a){s++;continue}const c=await a.async("string"),o=JSON.parse(c),f=(o==null?void 0:o.id)||x;N=f;const j=o.source==="AI_GENERATED";if(j){if(n.has(o.url)){s++;continue}}else if(p.has(f)){s++;continue}const D=[".jpg",".png",".gif",".webp",".mp4",".webm",".mov",".svg"];let E=null;for(const I of D){const U=t.file(`assets/${x}${I}`);if(U){E=await U.async("blob");break}}if(!E&&o.mimeType){const I=le(o.mimeType);if(I){const U=t.file(`assets/${x}${I}`);U&&(E=await U.async("blob"))}}if(E){const I=o.type==="VIDEO"?"video":"image";await q.cacheMediaFromBlob(o.url,E,I,{metadata:{taskId:((g=o.metadata)==null?void 0:g.taskId)||f,prompt:(h=o.metadata)==null?void 0:h.prompt,model:(l=o.metadata)==null?void 0:l.model},cachedAt:o.createdAt,lastUsed:o.updatedAt||o.createdAt}),j||await u.setItem(f,o),r++}else console.warn(`[BackupRestore] No media file found for asset ${f}, skipping`),s++}catch(a){console.warn(`[BackupRestore] Failed to import asset ${N}:`,a),s++}if(e&&i.length>0){const a=60+Math.round((w+1)/i.length*35);e(a,`正在导入素材 (${w+1}/${i.length})...`)}}return{imported:r,skipped:s}}async importTasks(t){let e=0,r=0;const s=t.file("tasks.json");if(!s)return{imported:0,skipped:0};try{const i=await s.async("string"),u=JSON.parse(i);if(!Array.isArray(u)||u.length===0)return{imported:0,skipped:0};const m=await z.getAllTasks(),p=new Set(m.map(g=>g.id)),n=u.filter(g=>p.has(g.id)?(r++,!1):!0);n.length>0&&(await he.restoreTasks(n),e=n.length)}catch(i){console.warn("[BackupRestore] Failed to import tasks:",i)}return{imported:e,skipped:r}}}const Ie=new De;class Ae{exportToZip(t,e){return te.exportToZip(t,e)}importFromZip(t,e){return Ie.importFromZip(t,e)}downloadZip(t,e){te.downloadZip(t,e)}}const se=new Ae,Ve=({open:S,onOpenChange:t,container:e,onSwitchBoard:r,onBeforeImport:s})=>{var R;const i=k=>{if(!k)return"";const y=new Date(k),v=y.getTimezoneOffset()*6e4;return new Date(y.getTime()-v).toISOString().slice(0,16)},u=k=>{if(!k)return null;const y=Date.parse(k);return Number.isNaN(y)?null:y},[m,p]=_.useState("backup"),[n,g]=_.useState({includePrompts:!0,includeProjects:!0,includeAssets:!0,includeKnowledgeBase:!0,timeRangeStart:null,timeRangeEnd:null}),[h,l]=_.useState(!1),[w,b]=_.useState(0),[x,N]=_.useState(""),[a,c]=_.useState(null),[o,f]=_.useState(null),j=_.useRef(null),D=_.useCallback(async k=>{if(!k.currentBoardId||!r)return;const y=Z.getBoard(k.currentBoardId);if(!y)return;const v=Z.getCurrentBoard();if(!v||!v.elements||v.elements.length===0)await r(k.currentBoardId,k.viewport),T.success(`已切换到画板「${y.name}」`);else{const C=Ne.confirm({header:"恢复画布状态",body:`备份时正在编辑画板「${k.currentBoardName||y.name}」,是否切换到该画板?`,confirmBtn:"切换",cancelBtn:"取消",onConfirm:async()=>{await r(k.currentBoardId,k.viewport),T.success(`已切换到画板「${y.name}」`),C.destroy()},onCancel:()=>{C.destroy()}})}},[r]),E=_.useCallback(async()=>{if(!h){if(o&&(await D(o),f(null)),a&&a.tasks&&a.tasks.imported>0){we();return}t(!1),b(0),N(""),c(null)}},[h,t,a,o,D]),I=_.useCallback(async()=>{if(!n.includePrompts&&!n.includeProjects&&!n.includeAssets&&!n.includeKnowledgeBase){T.warning("请至少选择一项要备份的内容");return}if(n.timeRangeStart&&n.timeRangeEnd&&n.timeRangeStart>n.timeRangeEnd){T.warning("开始时间不能晚于结束时间");return}l(!0),b(0),N("正在准备...");try{const k=await se.exportToZip(n,(y,v)=>{b(y),N(v)});T.success(`备份成功!分片 ${k.totalParts} 个,素材 ${k.stats.assetCount} 个`),E()}catch(k){console.error("[BackupRestore] Export failed:",k),T.error("备份失败,请重试")}finally{l(!1)}},[n,E]),U=_.useCallback(()=>{var k;(k=j.current)==null||k.click()},[]),L=_.useCallback(async k=>{var v,G;const y=(v=k.target.files)==null?void 0:v[0];if(y){if(!y.name.endsWith(".zip")){T.warning("请选择 ZIP 格式的备份文件");return}l(!0),b(0),N("正在保存当前画板..."),c(null);try{s&&await s(),N("正在读取文件...");const C=await se.importFromZip(y,(ue,pe)=>{b(ue),N(pe)});c(C),(G=C.workspaceState)!=null&&G.currentBoardId&&f(C.workspaceState),C.success?T.success("导入成功!"):C.errors.length>0&&T.warning("导入完成,但有部分错误")}catch(C){console.error("[BackupRestore] Import failed:",C),T.error("导入失败,请检查文件格式")}finally{l(!1),j.current&&(j.current.value="")}}},[s]),A=_.useCallback((k,y)=>{g(v=>({...v,[k]:y}))},[]);return d.jsxDEV(xe,{open:S,onOpenChange:E,children:d.jsxDEV(ye,{className:"backup-restore-dialog",container:e,"data-testid":"backup-restore-dialog",children:[d.jsxDEV("h2",{className:"backup-restore-dialog__title",children:"备份 / 恢复"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:245,columnNumber:9},void 0),d.jsxDEV("div",{className:"backup-restore-dialog__tabs",children:[d.jsxDEV("button",{className:`backup-restore-dialog__tab ${m==="backup"?"backup-restore-dialog__tab--active":""}`,onClick:()=>p("backup"),disabled:h,children:"备份"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:249,columnNumber:11},void 0),d.jsxDEV("button",{className:`backup-restore-dialog__tab ${m==="restore"?"backup-restore-dialog__tab--active":""}`,onClick:()=>p("restore"),disabled:h,children:"恢复"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:256,columnNumber:11},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:248,columnNumber:9},void 0),m==="backup"&&d.jsxDEV("div",{className:"backup-restore-dialog__panel",children:[d.jsxDEV("p",{className:"backup-restore-dialog__description",children:"选择要备份的内容,将导出为 ZIP 压缩包:"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:268,columnNumber:13},void 0),d.jsxDEV("div",{className:"backup-restore-dialog__options",children:[d.jsxDEV(O,{checked:n.includePrompts,onChange:k=>A("includePrompts",k),disabled:h,children:d.jsxDEV("div",{className:"backup-restore-dialog__option-content",children:[d.jsxDEV("span",{className:"backup-restore-dialog__option-title",children:"提示词"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:279,columnNumber:19},void 0),d.jsxDEV("span",{className:"backup-restore-dialog__option-desc",children:"包含图片和视频生成的历史提示词"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:280,columnNumber:19},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:278,columnNumber:17},void 0)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:273,columnNumber:15},void 0),d.jsxDEV(O,{checked:n.includeProjects,onChange:k=>A("includeProjects",k),disabled:h,children:d.jsxDEV("div",{className:"backup-restore-dialog__option-content",children:[d.jsxDEV("span",{className:"backup-restore-dialog__option-title",children:"项目"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:290,columnNumber:19},void 0),d.jsxDEV("span",{className:"backup-restore-dialog__option-desc",children:"包含所有文件夹和画板"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:291,columnNumber:19},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:289,columnNumber:17},void 0)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:284,columnNumber:15},void 0),d.jsxDEV(O,{checked:n.includeAssets,onChange:k=>A("includeAssets",k),disabled:h,children:d.jsxDEV("div",{className:"backup-restore-dialog__option-content",children:[d.jsxDEV("span",{className:"backup-restore-dialog__option-title",children:"素材库"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:301,columnNumber:19},void 0),d.jsxDEV("span",{className:"backup-restore-dialog__option-desc",children:"包含所有本地上传的图片和视频"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:302,columnNumber:19},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:300,columnNumber:17},void 0)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:295,columnNumber:15},void 0),d.jsxDEV(O,{checked:n.includeKnowledgeBase,onChange:k=>A("includeKnowledgeBase",k),disabled:h,children:d.jsxDEV("div",{className:"backup-restore-dialog__option-content",children:[d.jsxDEV("span",{className:"backup-restore-dialog__option-title",children:"知识库"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:312,columnNumber:19},void 0),d.jsxDEV("span",{className:"backup-restore-dialog__option-desc",children:"包含所有目录、笔记和标签"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:313,columnNumber:19},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:311,columnNumber:17},void 0)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:306,columnNumber:15},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:272,columnNumber:13},void 0),d.jsxDEV("div",{className:"backup-restore-dialog__time-range",children:[d.jsxDEV("div",{className:"backup-restore-dialog__time-range-title",children:"图片导出时间范围(可选)"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:319,columnNumber:15},void 0),d.jsxDEV("div",{className:"backup-restore-dialog__time-range-row",children:[d.jsxDEV("label",{className:"backup-restore-dialog__time-range-field",children:[d.jsxDEV("span",{children:"开始时间"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:322,columnNumber:19},void 0),d.jsxDEV("input",{type:"datetime-local",value:i(n.timeRangeStart),disabled:h,onChange:k=>g(y=>({...y,timeRangeStart:u(k.target.value)}))},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:323,columnNumber:19},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:321,columnNumber:17},void 0),d.jsxDEV("label",{className:"backup-restore-dialog__time-range-field",children:[d.jsxDEV("span",{children:"结束时间"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:334,columnNumber:19},void 0),d.jsxDEV("input",{type:"datetime-local",value:i(n.timeRangeEnd),disabled:h,onChange:k=>g(y=>({...y,timeRangeEnd:u(k.target.value)}))},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:335,columnNumber:19},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:333,columnNumber:17},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:320,columnNumber:15},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:318,columnNumber:13},void 0),h&&d.jsxDEV("div",{className:"backup-restore-dialog__progress",children:[d.jsxDEV(Q,{percentage:w,theme:"line"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:350,columnNumber:17},void 0),d.jsxDEV("span",{className:"backup-restore-dialog__progress-text",children:x},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:351,columnNumber:17},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:349,columnNumber:15},void 0),d.jsxDEV("div",{className:"backup-restore-dialog__actions",children:[d.jsxDEV("button",{className:"backup-restore-dialog__button backup-restore-dialog__button--cancel",onClick:E,disabled:h,children:"取消"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:356,columnNumber:15},void 0),d.jsxDEV("button",{className:"backup-restore-dialog__button backup-restore-dialog__button--primary",onClick:I,disabled:h,children:h?"正在备份...":"开始备份"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:363,columnNumber:15},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:355,columnNumber:13},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:267,columnNumber:11},void 0),m==="restore"&&d.jsxDEV("div",{className:"backup-restore-dialog__panel",children:[d.jsxDEV("p",{className:"backup-restore-dialog__description",children:"选择备份文件进行恢复,数据将增量导入(不会覆盖现有内容):"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:377,columnNumber:13},void 0),d.jsxDEV("div",{className:"backup-restore-dialog__dropzone",onClick:U,children:[d.jsxDEV(je,{className:"backup-restore-dialog__dropzone-icon"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:385,columnNumber:15},void 0),d.jsxDEV("span",{className:"backup-restore-dialog__dropzone-text",children:"点击选择备份文件 (.zip)"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:386,columnNumber:15},void 0),d.jsxDEV("input",{ref:j,type:"file",accept:".zip",onChange:L,style:{display:"none"}},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:389,columnNumber:15},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:381,columnNumber:13},void 0),h&&d.jsxDEV("div",{className:"backup-restore-dialog__progress",children:[d.jsxDEV(Q,{percentage:w,theme:"line"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:400,columnNumber:17},void 0),d.jsxDEV("span",{className:"backup-restore-dialog__progress-text",children:x},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:401,columnNumber:17},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:399,columnNumber:15},void 0),a&&d.jsxDEV("div",{className:"backup-restore-dialog__result",children:[d.jsxDEV("h4",{className:"backup-restore-dialog__result-title",children:a.success?"导入完成":"导入完成(有错误)"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:407,columnNumber:17},void 0),d.jsxDEV("ul",{className:"backup-restore-dialog__result-list",children:[(a.prompts.imported>0||a.prompts.skipped>0)&&d.jsxDEV("li",{children:["提示词:导入 ",a.prompts.imported," 条,跳过 ",a.prompts.skipped," 条"]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:412,columnNumber:21},void 0),(a.projects.folders>0||a.projects.boards>0||a.projects.merged>0)&&d.jsxDEV("li",{children:["项目:导入 ",a.projects.folders," 个文件夹,",a.projects.boards," 个画板",a.projects.merged>0&&`,合并 ${a.projects.merged} 个画板`]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:417,columnNumber:21},void 0),(a.assets.imported>0||a.assets.skipped>0)&&d.jsxDEV("li",{children:["素材:导入 ",a.assets.imported," 个,跳过 ",a.assets.skipped," 个"]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:423,columnNumber:21},void 0),a.knowledgeBase&&(a.knowledgeBase.notes>0||a.knowledgeBase.directories>0)&&d.jsxDEV("li",{children:["知识库:导入 ",a.knowledgeBase.directories," 个目录,",a.knowledgeBase.notes," 篇笔记,",a.knowledgeBase.tags," 个标签"]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:428,columnNumber:21},void 0),a.tasks&&(a.tasks.imported>0||a.tasks.skipped>0)&&d.jsxDEV("li",{children:["任务:导入 ",a.tasks.imported," 个,跳过 ",a.tasks.skipped," 个"]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:433,columnNumber:21},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:410,columnNumber:17},void 0),a.errors.length>0&&d.jsxDEV("div",{className:"backup-restore-dialog__result-errors",children:[d.jsxDEV("strong",{children:"错误信息:"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:440,columnNumber:21},void 0),d.jsxDEV("ul",{children:a.errors.map((k,y)=>d.jsxDEV("li",{children:k},y,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:443,columnNumber:25},void 0))},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:441,columnNumber:21},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:439,columnNumber:19},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:406,columnNumber:15},void 0),d.jsxDEV("div",{className:"backup-restore-dialog__actions",children:d.jsxDEV("button",{className:"backup-restore-dialog__button backup-restore-dialog__button--cancel",onClick:E,disabled:h,children:a?((R=a.tasks)==null?void 0:R.imported)>0?"完成并刷新":"完成":"取消"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:452,columnNumber:15},void 0)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:451,columnNumber:13},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:376,columnNumber:11},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:244,columnNumber:7},void 0)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:243,columnNumber:5},void 0)};export{Ve as BackupRestoreDialog};
1
+ import{ck as K,cl as F,cm as Z,cn as ae,co as re,cp as ie,cq as ne,cr as oe,cs as z,c8 as Y,z as P,as as V,b$ as B,ct as $,cu as me,cv as be,cw as fe,cx as ce,cy as H,u as q,cz as ge,cA as ke,y as he,r as _,bl as T,cc as Ne,cB as we,ab as d,cC as xe,cD as ye,cf as O}from"./index-T9dstNa6.js";import{P as Q}from"./index-CRvF4JAy.js";import{U as je}from"./upload-DNNZ8L4F.js";const de=3,W="aitu-backup";function X(S){return S.map(t=>t.id?t:{...t,id:`imported-${Date.now()}-${Math.random().toString(36).slice(2,9)}`})}const Ee=500*1024*1024;async function M(S,t){const e=URL.createObjectURL(S),r=document.createElement("a");r.href=e,r.download=t,document.body.appendChild(r),r.click(),document.body.removeChild(r),await new Promise(s=>setTimeout(s,1200)),URL.revokeObjectURL(e)}class ve{constructor(t,e){this.partIndex=1,this.currentSize=0,this.downloadedParts=[],this.baseFilename=t,this.backupId=e,this.currentZip=new K,this.part1Zip=this.currentZip}addFile(t,e){const r=typeof e=="string"?e:JSON.stringify(e,null,2);this.currentZip.file(t,r),this.currentSize+=new Blob([r]).size}normalizeEntryDate(t){if(!t||Number.isNaN(t)||t<=0)return new Date;const e=t<1e12?t*1e3:t,r=new Date(e);return Number.isNaN(r.getTime())?new Date:r}async addAssetBlob(t,e,r,s,i){const u=typeof s=="string"?s:JSON.stringify(s,null,2),m=e.size+new Blob([u]).size,p=this.normalizeEntryDate(i);this.currentSize+m>Ee&&this.currentSize>0&&(await this.finalizePart(),this.startNewPart());const n=this.currentZip.folder("assets");n.file(r,u,{date:p}),n.file(t,e,{date:p}),this.currentSize+=m}async finalizePart(){const t={signature:W,version:de,createdAt:Date.now(),source:"app",backupId:this.backupId,partIndex:this.partIndex,totalParts:null,isFinalPart:!1,includes:{prompts:!1,projects:!1,assets:!0,knowledgeBase:!1}};if((this.partIndex===1?this.part1Zip:this.currentZip).file("manifest.json",JSON.stringify(t,null,2)),this.partIndex===1)return;const r=await this.currentZip.generateAsync({type:"blob",compression:"DEFLATE",compressionOptions:{level:6}}),s=`${this.baseFilename}_part${this.partIndex}.zip`;this.downloadedParts.length>0&&await new Promise(i=>setTimeout(i,500)),await M(r,s),this.downloadedParts.push({filename:s,size:r.size})}startNewPart(){this.partIndex++,this.currentZip=new K,this.currentSize=0}async finalizeAll(t){if(!(this.partIndex>1)){t.backupId=this.backupId,t.partIndex=1,t.totalParts=1,t.isFinalPart=!0,this.part1Zip.file("manifest.json",JSON.stringify(t,null,2));const u=await this.part1Zip.generateAsync({type:"blob",compression:"DEFLATE",compressionOptions:{level:6}}),m=`${this.baseFilename}.zip`;return await M(u,m),{files:[{filename:m,size:u.size}],totalParts:1,stats:t.stats}}const r={...t,backupId:this.backupId,partIndex:1,totalParts:null,isFinalPart:!1};this.part1Zip.file("manifest.json",JSON.stringify(r,null,2));const s=await this.part1Zip.generateAsync({type:"blob",compression:"DEFLATE",compressionOptions:{level:6}}),i=`${this.baseFilename}_part1.zip`;if(await M(s,i),this.downloadedParts.unshift({filename:i,size:s.size}),this.currentSize>0){const u={...t,backupId:this.backupId,partIndex:this.partIndex,totalParts:this.partIndex,isFinalPart:!0};this.currentZip.file("manifest.json",JSON.stringify(u,null,2));const m=await this.currentZip.generateAsync({type:"blob",compression:"DEFLATE",compressionOptions:{level:6}}),p=`${this.baseFilename}_part${this.partIndex}.zip`;await new Promise(n=>setTimeout(n,700)),await M(m,p),this.downloadedParts.push({filename:p,size:m.size})}return{files:this.downloadedParts,totalParts:this.partIndex,stats:t.stats}}}function le(S){return{"image/jpeg":".jpg","image/jpg":".jpg","image/png":".png","image/gif":".gif","image/webp":".webp","image/svg+xml":".svg","video/mp4":".mp4","video/webm":".webm","video/quicktime":".mov"}[S]||""}function J(S){return S.replace(/[<>:"/\\|?*]/g,"_").replace(/\s+/g," ").trim()||"unnamed"}function Se(S){let t=0;for(let e=0;e<S.length;e++){const r=S.charCodeAt(e);t=(t<<5)-t+r,t=t&t}return`cache-${Math.abs(t).toString(36)}`}function ee(){return`${Date.now().toString(36)}-${Math.random().toString(36).substring(2,11)}`}class _e{formatTimestampForFilename(t){const e=typeof t=="number"&&Number.isFinite(t)?new Date(t):new Date;if(Number.isNaN(e.getTime()))return"unknown-time";const r=e.getFullYear(),s=String(e.getMonth()+1).padStart(2,"0"),i=String(e.getDate()).padStart(2,"0"),u=String(e.getHours()).padStart(2,"0"),m=String(e.getMinutes()).padStart(2,"0"),p=String(e.getSeconds()).padStart(2,"0");return`${r}${s}${i}_${u}${m}${p}`}buildAssetExportBaseName(t,e){const r=this.formatTimestampForFilename(e),s=J(t);return`${r}_${s}`}shouldExportAssetByRange(t,e){const{timeRangeStart:r,timeRangeEnd:s}=e;return!r&&!s?!0:!(typeof t!="number"||Number.isNaN(t)||t<=0||typeof r=="number"&&t<r||typeof s=="number"&&t>s)}async exportToZip(t,e){const r=Date.now();F.track("backup_export_start",{includePrompts:t.includePrompts,includeProjects:t.includeProjects,includeAssets:t.includeAssets}),e==null||e(5,"正在准备数据...");const s=new Date,i=s.toISOString().split("T")[0],u=s.toTimeString().split(" ")[0].replace(/:/g,""),m=`aitu_backup_${i}_${u}`,p=`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,8)}`,n=new ve(m,p),g=Z.getCurrentBoard(),h={currentBoardId:(g==null?void 0:g.id)||null,currentBoardName:g==null?void 0:g.name,viewport:g==null?void 0:g.viewport},l={signature:W,version:de,createdAt:Date.now(),includes:{prompts:t.includePrompts,projects:t.includeProjects,assets:t.includeAssets,knowledgeBase:t.includeKnowledgeBase},stats:{promptCount:0,videoPromptCount:0,imagePromptCount:0,folderCount:0,boardCount:0,assetCount:0,taskCount:0,kbNoteCount:0},workspaceState:h};if(t.includePrompts){e==null||e(10,"正在导出提示词...");const b=await this.collectPromptData();n.addFile("prompts.json",b),l.stats.promptCount=b.promptHistory.length,l.stats.videoPromptCount=b.videoPromptHistory.length,l.stats.imagePromptCount=b.imagePromptHistory.length}if(t.includeKnowledgeBase){e==null||e(30,"正在导出知识库...");try{const b=await ae.exportAllData();n.addFile("knowledge-base.json",b),l.stats.kbNoteCount=b.notes.length}catch(b){console.error("Failed to export knowledge base:",b)}}t.includeProjects&&(e==null||e(40,"正在导出项目..."),await this.exportProjects(n,l,!t.includeAssets,e)),t.includeAssets&&(e==null||e(50,"正在导出素材..."),await this.exportAssets(n,l,t,e)),e==null||e(85,"正在压缩文件...");const w=await n.finalizeAll(l);return e==null||e(100,"导出完成"),F.track("backup_export_success",{duration:Date.now()-r,totalParts:w.totalParts,promptCount:l.stats.promptCount+l.stats.videoPromptCount+l.stats.imagePromptCount,projectCount:l.stats.boardCount,assetCount:l.stats.assetCount,taskCount:l.stats.taskCount}),w}downloadZip(t,e){const r=new Date,s=r.toISOString().split("T")[0],i=r.toTimeString().split(" ")[0].replace(/:/g,""),u=`aitu_backup_${s}_${i}.zip`,m=URL.createObjectURL(t),p=document.createElement("a");p.href=m,p.download=e||u,document.body.appendChild(p),p.click(),document.body.removeChild(p),URL.revokeObjectURL(m)}async collectPromptData(){await re();const t=ie();let e=ne(),r=oe();const s=await z.getAllTasks({status:Y.COMPLETED}),i=s.filter(l=>{var w;return l.type===P.IMAGE&&((w=l.params)==null?void 0:w.prompt)}).map(l=>({id:`task_${l.id}`,content:l.params.prompt.trim(),timestamp:l.completedAt||l.createdAt})).filter(l=>l.content.length>0),u=s.filter(l=>{var w;return l.type===P.VIDEO&&((w=l.params)==null?void 0:w.prompt)}).map(l=>({id:`task_${l.id}`,content:l.params.prompt.trim(),timestamp:l.completedAt||l.createdAt})).filter(l=>l.content.length>0),m=new Set(r.map(l=>l.content)),p=i.filter(l=>!m.has(l.content));r=[...r,...p];const n=new Set(e.map(l=>l.content)),g=u.filter(l=>!n.has(l.content));e=[...e,...g];const h=await V.get(B.PRESET_SETTINGS);return{promptHistory:t,videoPromptHistory:e,imagePromptHistory:r,presetSettings:h||{image:{pinnedPrompts:[],deletedPrompts:[]},video:{pinnedPrompts:[],deletedPrompts:[]}}}}async exportProjects(t,e,r,s){const[i,u]=await Promise.all([$.loadAllFolders(),$.loadAllBoards()]),m=this.buildFolderPathMap(i);e.stats.folderCount=i.length;for(let p=0;p<u.length;p++){const n=u[p],g=n.folderId?m.get(n.folderId):null,h=J(n.name),l=g?`projects/${g}/${h}.drawnix`:`projects/${h}.drawnix`,w=r?await me(n.elements||[]):void 0,b={type:be.drawnix,version:fe.drawnix,source:"backup",elements:n.elements||[],viewport:n.viewport||{zoom:1},theme:n.theme,embeddedMedia:w,boardMeta:{id:n.id,name:n.name,folderId:n.folderId,order:n.order,createdAt:n.createdAt,updatedAt:n.updatedAt}};if(t.addFile(l,b),s&&u.length>0){const x=25+Math.round((p+1)/u.length*20);s(x,`正在导出画板 (${p+1}/${u.length})...`)}}e.stats.boardCount=u.length}buildFolderPathMap(t){const e=new Map,r=new Map;for(const i of t)r.set(i.id,i);const s=i=>{if(e.has(i))return e.get(i);const u=r.get(i);if(!u)return"";const m=J(u.name);if(u.parentId){const p=s(u.parentId),n=p?`${p}/${m}`:m;return e.set(i,n),n}return e.set(i,m),m};for(const i of t)s(i.id);return e}async getActualCreationTime(t){var e;try{if((e=t.metadata)!=null&&e.taskId){const i=await z.getTask(t.metadata.taskId);if(i!=null&&i.completedAt)return i.completedAt;if(i!=null&&i.createdAt)return i.createdAt}const r=new URL(t.url),s=r.searchParams.get("t")||r.searchParams.get("timestamp");if(s){const i=parseInt(s,10);if(!Number.isNaN(i)&&i>0)return i}return t.cachedAt}catch(r){return console.warn(`[BackupRestore] Failed to get actual creation time for ${t.url}:`,r),t.cachedAt}}async exportAssets(t,e,r,s){var N;const i=new Set;let u=0;const m=[],p=ce.createInstance({name:H.STORAGE_NAME,storeName:H.STORE_NAME}),n=await p.keys(),g=n.length;for(let a=0;a<n.length;a++){try{const c=await p.getItem(n[a]);if(c&&this.shouldExportAssetByRange(c.createdAt,r)){const o=await q.getCachedBlob(c.url);if(o){const f=this.buildAssetExportBaseName(c.id,c.createdAt);m.push({baseName:f,blobData:o,metaData:c,createdAt:c.createdAt}),i.add(c.url)}}}catch(c){console.warn(`[BackupRestore] Failed to load asset ${n[a]}:`,c)}if(s&&g>0){const c=50+Math.round((a+1)/g*15);s(c,`正在导出本地素材 (${a+1}/${g})...`)}}const l=(await q.getAllCacheMetadata()).filter(a=>!i.has(a.url)),w=l.length;for(let a=0;a<l.length;a++){const c=l[a];try{const o=await this.getActualCreationTime(c);if(!this.shouldExportAssetByRange(o,r))continue;const f=((N=c.metadata)==null?void 0:N.taskId)||Se(c.url),j=o||c.cachedAt,D={id:f,url:c.url,type:c.type==="video"?"VIDEO":"IMAGE",mimeType:c.mimeType,size:c.size,source:"AI_GENERATED",createdAt:j,updatedAt:c.lastUsed,metadata:c.metadata},E=await q.getCachedBlob(c.url);if(E){const I=this.buildAssetExportBaseName(f,j);m.push({baseName:I,blobData:E,metaData:D,createdAt:j}),i.add(c.url)}}catch(o){console.warn(`[BackupRestore] Failed to export cached media ${c.url}:`,o)}if(s&&w>0){const o=65+Math.round((a+1)/w*10);s(o,`正在导出缓存媒体 (${a+1}/${w})...`)}}m.sort((a,c)=>{const o=a.createdAt??0,f=c.createdAt??0;return o!==f?o-f:a.baseName.localeCompare(c.baseName)});for(let a=0;a<m.length;a++){const c=m[a],o=typeof c.metaData=="string"?JSON.parse(c.metaData):c.metaData,f=typeof(o==null?void 0:o.mimeType)=="string"?o.mimeType:c.blobData.type,j=le(f);if(await t.addAssetBlob(`${c.baseName}${j}`,c.blobData,`${c.baseName}.meta.json`,c.metaData,c.createdAt),u++,s&&m.length>0){const D=75+Math.round((a+1)/m.length*10);s(D,`正在写入素材 (${a+1}/${m.length})...`)}}e.stats.assetCount=u,s==null||s(85,"正在导出任务数据...");const x=(await z.getAllTasks()).filter(a=>{var c;return a.status===Y.COMPLETED&&(a.type===P.IMAGE||a.type===P.VIDEO)&&((c=a.result)==null?void 0:c.url)});x.length>0&&(t.addFile("tasks.json",x),e.stats.taskCount=x.length)}}const te=new _e;class De{async importFromZip(t,e){const r=Date.now();F.track("backup_import_start",{fileSize:t.size,fileName:t.name});const s={success:!1,prompts:{imported:0,skipped:0},projects:{folders:0,boards:0,merged:0,skipped:0},assets:{imported:0,skipped:0},tasks:{imported:0,skipped:0},knowledgeBase:{directories:0,notes:0,tags:0,skipped:0},errors:[]};try{e==null||e(5,"正在读取文件...");const i=await K.loadAsync(t);e==null||e(10,"正在验证文件格式...");const u=i.file("manifest.json");if(!u)throw new Error("无效的备份文件:未找到 manifest.json");const m=await u.async("string"),p=JSON.parse(m);if(p.signature!==W)throw new Error("无效的备份文件:签名不匹配");if(p.includes.prompts){e==null||e(20,"正在导入提示词...");const n=i.file("prompts.json");if(n){const g=await n.async("string"),h=JSON.parse(g);s.prompts=await this.importPromptData(h)}}if(p.includes.knowledgeBase){e==null||e(30,"正在导入知识库...");const n=await this.importKnowledgeBase(i);s.knowledgeBase=n,n.errors&&n.errors.length>0&&s.errors.push(...n.errors)}p.includes.projects&&(e==null||e(40,"正在导入项目..."),s.projects=await this.importProjects(i,e)),p.includes.assets&&(e==null||e(60,"正在导入素材..."),s.assets=await this.importAssets(i,e),e==null||e(85,"正在导入任务数据..."),s.tasks=await this.importTasks(i)),(s.projects.folders>0||s.projects.boards>0||s.projects.merged>0)&&await Z.reload(),p.workspaceState&&(s.workspaceState=p.workspaceState),s.success=s.errors.length===0,e==null||e(100,"导入完成"),F.track("backup_import_success",{duration:Date.now()-r,promptCount:s.prompts.imported,projectCount:s.projects.boards,assetCount:s.assets.imported,taskCount:s.tasks.imported,kbNoteCount:s.knowledgeBase.notes,skippedCount:s.prompts.skipped+s.projects.skipped+s.assets.skipped+s.tasks.skipped+s.knowledgeBase.skipped})}catch(i){const u=i instanceof Error?i.message:String(i);s.errors.push(u),F.track("backup_import_failed",{duration:Date.now()-r,error:u})}return s}async importKnowledgeBase(t){const e=t.file("knowledge-base.json");if(!e)return{directories:0,notes:0,tags:0,skipped:0,errors:[]};try{const r=await e.async("string"),s=JSON.parse(r),i=await ae.importAllData(s);return{directories:i.dirCount,notes:i.noteCount,tags:i.tagCount,skipped:0,errors:[]}}catch(r){return console.error("Failed to import knowledge base:",r),{directories:0,notes:0,tags:0,skipped:0,errors:[`Knowledge base import failed: ${r instanceof Error?r.message:String(r)}`]}}}async importPromptData(t){let e=0,r=0;const s=t.promptHistory||[],i=t.videoPromptHistory||[],u=t.imagePromptHistory||[];await re();const m=ie(),p=ne(),n=oe(),g=new Set(m.map(f=>f.id)),h=new Set(m.map(f=>f.content)),l=s.filter(f=>g.has(f.id)||h.has(f.content)?(r++,!1):(e++,!0)),w=new Set(p.map(f=>f.id)),b=new Set(p.map(f=>f.content)),x=i.filter(f=>w.has(f.id)||b.has(f.content)?(r++,!1):(e++,!0)),N=new Set(n.map(f=>f.id)),a=new Set(n.map(f=>f.content)),c=u.filter(f=>N.has(f.id)||a.has(f.content)?(r++,!1):(e++,!0));await V.set(B.PROMPT_HISTORY,[...m,...l]),await V.set(B.VIDEO_PROMPT_HISTORY,[...p,...x]),await V.set(B.IMAGE_PROMPT_HISTORY,[...n,...c]);const o=await V.get(B.PRESET_SETTINGS);if(o&&t.presetSettings){const f={image:{pinnedPrompts:[...new Set([...o.image.pinnedPrompts,...t.presetSettings.image.pinnedPrompts])],deletedPrompts:[...new Set([...o.image.deletedPrompts,...t.presetSettings.image.deletedPrompts])]},video:{pinnedPrompts:[...new Set([...o.video.pinnedPrompts,...t.presetSettings.video.pinnedPrompts])],deletedPrompts:[...new Set([...o.video.deletedPrompts,...t.presetSettings.video.deletedPrompts])]}};await V.set(B.PRESET_SETTINGS,f)}else t.presetSettings&&await V.set(B.PRESET_SETTINGS,t.presetSettings);return await ge(),{imported:e,skipped:r}}async importProjects(t,e){let r=0,s=0,i=0,u=0;const m=await $.loadAllFolders(),p=await $.loadAllBoards(),n=new Set(p.map(b=>b.id)),g=Object.keys(t.files).filter(b=>b.startsWith("projects/")&&b.endsWith(".drawnix")&&!b.includes("/_"));if(g.length===0)return{folders:0,boards:0,merged:0,skipped:0};const h=new Set,l=new Map;for(const b of g){const N=b.replace(/^projects\//,"").split("/");if(N.length>1){let a="";for(let c=0;c<N.length-1;c++)a=a?`${a}/${N[c]}`:N[c],h.add(a)}}const w=Array.from(h).sort((b,x)=>{const N=b.split("/").length,a=x.split("/").length;return N-a||b.localeCompare(x)});for(let b=0;b<w.length;b++){const x=w[b],N=x.split("/"),a=N[N.length-1],c=N.length>1?N.slice(0,-1).join("/"):null,o=c&&l.get(c)||null,f=ee();l.set(x,f);const j=m.find(E=>E.name===a&&E.parentId===o);if(j){l.set(x,j.id),u++;continue}const D={id:f,name:a,parentId:o,order:b,isExpanded:!0,createdAt:Date.now(),updatedAt:Date.now()};await $.saveFolder(D),r++}for(let b=0;b<g.length;b++){const x=g[b];try{const N=t.file(x);if(N){const a=await N.async("string"),c=JSON.parse(a);await ke(c.embeddedMedia);const o=c.boardMeta,j=x.replace(/^projects\//,"").split("/"),D=j.length>1?j.slice(0,-1).join("/"):null,E=D&&(l.get(D)||(o==null?void 0:o.folderId))||null,I=j[j.length-1]||"unnamed.drawnix",U=(o==null?void 0:o.name)||I.replace(".drawnix","");if(o!=null&&o.id&&n.has(o.id)){const A=p.find(R=>R.id===o.id);if(A){const R=new Set((A.elements||[]).map(v=>v.id).filter(v=>!!v)),k=(c.elements||[]).filter(v=>v.id?!R.has(v.id):!0),y={...A,elements:[...A.elements||[],...X(k)],viewport:c.viewport||A.viewport,theme:c.theme||A.theme,updatedAt:Date.now()};await $.saveBoard(y),i++;continue}}const L={id:(o==null?void 0:o.id)||ee(),name:U,folderId:E,order:(o==null?void 0:o.order)??b,elements:X(c.elements||[]),viewport:c.viewport,theme:c.theme,createdAt:(o==null?void 0:o.createdAt)||Date.now(),updatedAt:(o==null?void 0:o.updatedAt)||Date.now()};await $.saveBoard(L),s++}}catch(N){console.warn(`[BackupRestore] Failed to import board ${x}:`,N)}if(e&&g.length>0){const N=40+Math.round((b+1)/g.length*15);e(N,`正在导入画板 (${b+1}/${g.length})...`)}}return{folders:r,boards:s,merged:i,skipped:u}}async importAssets(t,e){var g,h,l;let r=0,s=0;const i=Object.keys(t.files).filter(w=>w.startsWith("assets/")&&w.endsWith(".meta.json"));if(i.length===0)return{imported:0,skipped:0};const u=ce.createInstance({name:H.STORAGE_NAME,storeName:H.STORE_NAME}),m=await u.keys(),p=new Set(m),n=new Set(await q.getAllCachedUrls());for(let w=0;w<i.length;w++){const b=i[w],x=b.replace("assets/","").replace(".meta.json","");let N=x;try{const a=t.file(b);if(!a){s++;continue}const c=await a.async("string"),o=JSON.parse(c),f=(o==null?void 0:o.id)||x;N=f;const j=o.source==="AI_GENERATED";if(j){if(n.has(o.url)){s++;continue}}else if(p.has(f)){s++;continue}const D=[".jpg",".png",".gif",".webp",".mp4",".webm",".mov",".svg"];let E=null;for(const I of D){const U=t.file(`assets/${x}${I}`);if(U){E=await U.async("blob");break}}if(!E&&o.mimeType){const I=le(o.mimeType);if(I){const U=t.file(`assets/${x}${I}`);U&&(E=await U.async("blob"))}}if(E){const I=o.type==="VIDEO"?"video":"image";await q.cacheMediaFromBlob(o.url,E,I,{metadata:{taskId:((g=o.metadata)==null?void 0:g.taskId)||f,prompt:(h=o.metadata)==null?void 0:h.prompt,model:(l=o.metadata)==null?void 0:l.model},cachedAt:o.createdAt,lastUsed:o.updatedAt||o.createdAt}),j||await u.setItem(f,o),r++}else console.warn(`[BackupRestore] No media file found for asset ${f}, skipping`),s++}catch(a){console.warn(`[BackupRestore] Failed to import asset ${N}:`,a),s++}if(e&&i.length>0){const a=60+Math.round((w+1)/i.length*35);e(a,`正在导入素材 (${w+1}/${i.length})...`)}}return{imported:r,skipped:s}}async importTasks(t){let e=0,r=0;const s=t.file("tasks.json");if(!s)return{imported:0,skipped:0};try{const i=await s.async("string"),u=JSON.parse(i);if(!Array.isArray(u)||u.length===0)return{imported:0,skipped:0};const m=await z.getAllTasks(),p=new Set(m.map(g=>g.id)),n=u.filter(g=>p.has(g.id)?(r++,!1):!0);n.length>0&&(await he.restoreTasks(n),e=n.length)}catch(i){console.warn("[BackupRestore] Failed to import tasks:",i)}return{imported:e,skipped:r}}}const Ie=new De;class Ae{exportToZip(t,e){return te.exportToZip(t,e)}importFromZip(t,e){return Ie.importFromZip(t,e)}downloadZip(t,e){te.downloadZip(t,e)}}const se=new Ae,Ve=({open:S,onOpenChange:t,container:e,onSwitchBoard:r,onBeforeImport:s})=>{var R;const i=k=>{if(!k)return"";const y=new Date(k),v=y.getTimezoneOffset()*6e4;return new Date(y.getTime()-v).toISOString().slice(0,16)},u=k=>{if(!k)return null;const y=Date.parse(k);return Number.isNaN(y)?null:y},[m,p]=_.useState("backup"),[n,g]=_.useState({includePrompts:!0,includeProjects:!0,includeAssets:!0,includeKnowledgeBase:!0,timeRangeStart:null,timeRangeEnd:null}),[h,l]=_.useState(!1),[w,b]=_.useState(0),[x,N]=_.useState(""),[a,c]=_.useState(null),[o,f]=_.useState(null),j=_.useRef(null),D=_.useCallback(async k=>{if(!k.currentBoardId||!r)return;const y=Z.getBoard(k.currentBoardId);if(!y)return;const v=Z.getCurrentBoard();if(!v||!v.elements||v.elements.length===0)await r(k.currentBoardId,k.viewport),T.success(`已切换到画板「${y.name}」`);else{const C=Ne.confirm({header:"恢复画布状态",body:`备份时正在编辑画板「${k.currentBoardName||y.name}」,是否切换到该画板?`,confirmBtn:"切换",cancelBtn:"取消",onConfirm:async()=>{await r(k.currentBoardId,k.viewport),T.success(`已切换到画板「${y.name}」`),C.destroy()},onCancel:()=>{C.destroy()}})}},[r]),E=_.useCallback(async()=>{if(!h){if(o&&(await D(o),f(null)),a&&a.tasks&&a.tasks.imported>0){we();return}t(!1),b(0),N(""),c(null)}},[h,t,a,o,D]),I=_.useCallback(async()=>{if(!n.includePrompts&&!n.includeProjects&&!n.includeAssets&&!n.includeKnowledgeBase){T.warning("请至少选择一项要备份的内容");return}if(n.timeRangeStart&&n.timeRangeEnd&&n.timeRangeStart>n.timeRangeEnd){T.warning("开始时间不能晚于结束时间");return}l(!0),b(0),N("正在准备...");try{const k=await se.exportToZip(n,(y,v)=>{b(y),N(v)});T.success(`备份成功!分片 ${k.totalParts} 个,素材 ${k.stats.assetCount} 个`),E()}catch(k){console.error("[BackupRestore] Export failed:",k),T.error("备份失败,请重试")}finally{l(!1)}},[n,E]),U=_.useCallback(()=>{var k;(k=j.current)==null||k.click()},[]),L=_.useCallback(async k=>{var v,G;const y=(v=k.target.files)==null?void 0:v[0];if(y){if(!y.name.endsWith(".zip")){T.warning("请选择 ZIP 格式的备份文件");return}l(!0),b(0),N("正在保存当前画板..."),c(null);try{s&&await s(),N("正在读取文件...");const C=await se.importFromZip(y,(ue,pe)=>{b(ue),N(pe)});c(C),(G=C.workspaceState)!=null&&G.currentBoardId&&f(C.workspaceState),C.success?T.success("导入成功!"):C.errors.length>0&&T.warning("导入完成,但有部分错误")}catch(C){console.error("[BackupRestore] Import failed:",C),T.error("导入失败,请检查文件格式")}finally{l(!1),j.current&&(j.current.value="")}}},[s]),A=_.useCallback((k,y)=>{g(v=>({...v,[k]:y}))},[]);return d.jsxDEV(xe,{open:S,onOpenChange:E,children:d.jsxDEV(ye,{className:"backup-restore-dialog",container:e,"data-testid":"backup-restore-dialog",children:[d.jsxDEV("h2",{className:"backup-restore-dialog__title",children:"备份 / 恢复"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:245,columnNumber:9},void 0),d.jsxDEV("div",{className:"backup-restore-dialog__tabs",children:[d.jsxDEV("button",{className:`backup-restore-dialog__tab ${m==="backup"?"backup-restore-dialog__tab--active":""}`,onClick:()=>p("backup"),disabled:h,children:"备份"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:249,columnNumber:11},void 0),d.jsxDEV("button",{className:`backup-restore-dialog__tab ${m==="restore"?"backup-restore-dialog__tab--active":""}`,onClick:()=>p("restore"),disabled:h,children:"恢复"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:256,columnNumber:11},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:248,columnNumber:9},void 0),m==="backup"&&d.jsxDEV("div",{className:"backup-restore-dialog__panel",children:[d.jsxDEV("p",{className:"backup-restore-dialog__description",children:"选择要备份的内容,将导出为 ZIP 压缩包:"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:268,columnNumber:13},void 0),d.jsxDEV("div",{className:"backup-restore-dialog__options",children:[d.jsxDEV(O,{checked:n.includePrompts,onChange:k=>A("includePrompts",k),disabled:h,children:d.jsxDEV("div",{className:"backup-restore-dialog__option-content",children:[d.jsxDEV("span",{className:"backup-restore-dialog__option-title",children:"提示词"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:279,columnNumber:19},void 0),d.jsxDEV("span",{className:"backup-restore-dialog__option-desc",children:"包含图片和视频生成的历史提示词"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:280,columnNumber:19},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:278,columnNumber:17},void 0)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:273,columnNumber:15},void 0),d.jsxDEV(O,{checked:n.includeProjects,onChange:k=>A("includeProjects",k),disabled:h,children:d.jsxDEV("div",{className:"backup-restore-dialog__option-content",children:[d.jsxDEV("span",{className:"backup-restore-dialog__option-title",children:"项目"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:290,columnNumber:19},void 0),d.jsxDEV("span",{className:"backup-restore-dialog__option-desc",children:"包含所有文件夹和画板"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:291,columnNumber:19},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:289,columnNumber:17},void 0)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:284,columnNumber:15},void 0),d.jsxDEV(O,{checked:n.includeAssets,onChange:k=>A("includeAssets",k),disabled:h,children:d.jsxDEV("div",{className:"backup-restore-dialog__option-content",children:[d.jsxDEV("span",{className:"backup-restore-dialog__option-title",children:"素材库"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:301,columnNumber:19},void 0),d.jsxDEV("span",{className:"backup-restore-dialog__option-desc",children:"包含所有本地上传的图片和视频"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:302,columnNumber:19},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:300,columnNumber:17},void 0)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:295,columnNumber:15},void 0),d.jsxDEV(O,{checked:n.includeKnowledgeBase,onChange:k=>A("includeKnowledgeBase",k),disabled:h,children:d.jsxDEV("div",{className:"backup-restore-dialog__option-content",children:[d.jsxDEV("span",{className:"backup-restore-dialog__option-title",children:"知识库"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:312,columnNumber:19},void 0),d.jsxDEV("span",{className:"backup-restore-dialog__option-desc",children:"包含所有目录、笔记和标签"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:313,columnNumber:19},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:311,columnNumber:17},void 0)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:306,columnNumber:15},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:272,columnNumber:13},void 0),d.jsxDEV("div",{className:"backup-restore-dialog__time-range",children:[d.jsxDEV("div",{className:"backup-restore-dialog__time-range-title",children:"图片导出时间范围(可选)"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:319,columnNumber:15},void 0),d.jsxDEV("div",{className:"backup-restore-dialog__time-range-row",children:[d.jsxDEV("label",{className:"backup-restore-dialog__time-range-field",children:[d.jsxDEV("span",{children:"开始时间"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:322,columnNumber:19},void 0),d.jsxDEV("input",{type:"datetime-local",value:i(n.timeRangeStart),disabled:h,onChange:k=>g(y=>({...y,timeRangeStart:u(k.target.value)}))},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:323,columnNumber:19},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:321,columnNumber:17},void 0),d.jsxDEV("label",{className:"backup-restore-dialog__time-range-field",children:[d.jsxDEV("span",{children:"结束时间"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:334,columnNumber:19},void 0),d.jsxDEV("input",{type:"datetime-local",value:i(n.timeRangeEnd),disabled:h,onChange:k=>g(y=>({...y,timeRangeEnd:u(k.target.value)}))},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:335,columnNumber:19},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:333,columnNumber:17},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:320,columnNumber:15},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:318,columnNumber:13},void 0),h&&d.jsxDEV("div",{className:"backup-restore-dialog__progress",children:[d.jsxDEV(Q,{percentage:w,theme:"line"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:350,columnNumber:17},void 0),d.jsxDEV("span",{className:"backup-restore-dialog__progress-text",children:x},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:351,columnNumber:17},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:349,columnNumber:15},void 0),d.jsxDEV("div",{className:"backup-restore-dialog__actions",children:[d.jsxDEV("button",{className:"backup-restore-dialog__button backup-restore-dialog__button--cancel",onClick:E,disabled:h,children:"取消"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:356,columnNumber:15},void 0),d.jsxDEV("button",{className:"backup-restore-dialog__button backup-restore-dialog__button--primary",onClick:I,disabled:h,children:h?"正在备份...":"开始备份"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:363,columnNumber:15},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:355,columnNumber:13},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:267,columnNumber:11},void 0),m==="restore"&&d.jsxDEV("div",{className:"backup-restore-dialog__panel",children:[d.jsxDEV("p",{className:"backup-restore-dialog__description",children:"选择备份文件进行恢复,数据将增量导入(不会覆盖现有内容):"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:377,columnNumber:13},void 0),d.jsxDEV("div",{className:"backup-restore-dialog__dropzone",onClick:U,children:[d.jsxDEV(je,{className:"backup-restore-dialog__dropzone-icon"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:385,columnNumber:15},void 0),d.jsxDEV("span",{className:"backup-restore-dialog__dropzone-text",children:"点击选择备份文件 (.zip)"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:386,columnNumber:15},void 0),d.jsxDEV("input",{ref:j,type:"file",accept:".zip",onChange:L,style:{display:"none"}},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:389,columnNumber:15},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:381,columnNumber:13},void 0),h&&d.jsxDEV("div",{className:"backup-restore-dialog__progress",children:[d.jsxDEV(Q,{percentage:w,theme:"line"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:400,columnNumber:17},void 0),d.jsxDEV("span",{className:"backup-restore-dialog__progress-text",children:x},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:401,columnNumber:17},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:399,columnNumber:15},void 0),a&&d.jsxDEV("div",{className:"backup-restore-dialog__result",children:[d.jsxDEV("h4",{className:"backup-restore-dialog__result-title",children:a.success?"导入完成":"导入完成(有错误)"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:407,columnNumber:17},void 0),d.jsxDEV("ul",{className:"backup-restore-dialog__result-list",children:[(a.prompts.imported>0||a.prompts.skipped>0)&&d.jsxDEV("li",{children:["提示词:导入 ",a.prompts.imported," 条,跳过 ",a.prompts.skipped," 条"]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:412,columnNumber:21},void 0),(a.projects.folders>0||a.projects.boards>0||a.projects.merged>0)&&d.jsxDEV("li",{children:["项目:导入 ",a.projects.folders," 个文件夹,",a.projects.boards," 个画板",a.projects.merged>0&&`,合并 ${a.projects.merged} 个画板`]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:417,columnNumber:21},void 0),(a.assets.imported>0||a.assets.skipped>0)&&d.jsxDEV("li",{children:["素材:导入 ",a.assets.imported," 个,跳过 ",a.assets.skipped," 个"]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:423,columnNumber:21},void 0),a.knowledgeBase&&(a.knowledgeBase.notes>0||a.knowledgeBase.directories>0)&&d.jsxDEV("li",{children:["知识库:导入 ",a.knowledgeBase.directories," 个目录,",a.knowledgeBase.notes," 篇笔记,",a.knowledgeBase.tags," 个标签"]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:428,columnNumber:21},void 0),a.tasks&&(a.tasks.imported>0||a.tasks.skipped>0)&&d.jsxDEV("li",{children:["任务:导入 ",a.tasks.imported," 个,跳过 ",a.tasks.skipped," 个"]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:433,columnNumber:21},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:410,columnNumber:17},void 0),a.errors.length>0&&d.jsxDEV("div",{className:"backup-restore-dialog__result-errors",children:[d.jsxDEV("strong",{children:"错误信息:"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:440,columnNumber:21},void 0),d.jsxDEV("ul",{children:a.errors.map((k,y)=>d.jsxDEV("li",{children:k},y,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:443,columnNumber:25},void 0))},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:441,columnNumber:21},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:439,columnNumber:19},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:406,columnNumber:15},void 0),d.jsxDEV("div",{className:"backup-restore-dialog__actions",children:d.jsxDEV("button",{className:"backup-restore-dialog__button backup-restore-dialog__button--cancel",onClick:E,disabled:h,children:a?((R=a.tasks)==null?void 0:R.imported)>0?"完成并刷新":"完成":"取消"},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:452,columnNumber:15},void 0)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:451,columnNumber:13},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:376,columnNumber:11},void 0)]},void 0,!0,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:244,columnNumber:7},void 0)},void 0,!1,{fileName:"/Users/ljq/code/shuidiyu/aitu/packages/drawnix/src/components/backup-restore/backup-restore-dialog.tsx",lineNumber:243,columnNumber:5},void 0)};export{Ve as BackupRestoreDialog};