aitu-app 0.6.78 → 0.6.80

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 (203) hide show
  1. package/README.md +3 -3
  2. package/assets/CanvasAudioPlayer-CSFENxi6.js +2 -0
  3. package/assets/ChatDrawer-CWZQP5R5.css +1 -0
  4. package/assets/ChatDrawer-sVEVW11M.js +11 -0
  5. package/assets/ChatMessagesArea-Cnb94V8-.js +7 -0
  6. package/assets/ChatMessagesArea-PlF5AwzD.css +1 -0
  7. package/assets/DeferredAIInputBar-D99l6sBS.js +8 -0
  8. package/assets/DrawnixDeferredFeatures-78cIu-ev.js +2 -0
  9. package/assets/{KnowledgeBaseContent-DcX5Jofx.js → KnowledgeBaseContent-DZ-1fPZa.js} +10 -10
  10. package/assets/{MVCreator-DllHozYg.js → MVCreator-BV8KDR6E.js} +8 -8
  11. package/assets/ModelBenchmarkWorkbench-DL6r0Z_5.js +2 -0
  12. package/assets/MusicAnalyzer-D9Bpmhym.css +1 -0
  13. package/assets/{MusicAnalyzer-DDeT6g3c.js → MusicAnalyzer-DQtjf36o.js} +2 -2
  14. package/assets/{MusicAnalyzer-CHcQ5t4P.js → MusicAnalyzer-u_5sy56T.js} +1 -1
  15. package/assets/PromptHistoryTool-B-ktaOpK.js +2 -0
  16. package/assets/PromptHistoryTool-BH7hq916.css +1 -0
  17. package/assets/ResizableDivider-BpUFdkte.js +1 -0
  18. package/assets/TaskQueuePanel-BLD1r7_I.js +1 -0
  19. package/assets/{VideoAnalyzer-BSLz1FaI.js → VideoAnalyzer-Bjv9pyDs.js} +2 -2
  20. package/assets/ai-generation-preferences-service-BSpgVCHz.js +1 -0
  21. package/assets/arc-CnA_FoJK.js +1 -0
  22. package/assets/{arc-BU2KKCa_.js → arc-DDvk_-VM.js} +1 -1
  23. package/assets/{batch-image-generation-Bg68r_Ql.js → batch-image-generation-N-lwbjRE.js} +3 -3
  24. package/assets/{blockDiagram-38ab4fdb-BCGEnMME.js → blockDiagram-38ab4fdb-B2G4wjZe.js} +6 -6
  25. package/assets/{blockDiagram-38ab4fdb-CsZR5uC5.js → blockDiagram-38ab4fdb-DBkZWrKk.js} +1 -1
  26. package/assets/{browser-DpICcNby.js → browser-ZXTF4AKv.js} +1 -1
  27. package/assets/{c4Diagram-3d4e48cf-9fuiuFdV.js → c4Diagram-3d4e48cf-BFg-wccg.js} +1 -1
  28. package/assets/{c4Diagram-3d4e48cf-WM4wd_GR.js → c4Diagram-3d4e48cf-CmyNnfip.js} +1 -1
  29. package/assets/{canvas-insertion-CdUQF7IV.js → canvas-insertion-CKIoVZ9a.js} +1 -1
  30. package/assets/channel-BQh3J7kz.js +1 -0
  31. package/assets/channel-CPsF_uSp.js +1 -0
  32. package/assets/{classDiagram-70f12bd4-DcYDedz1.js → classDiagram-70f12bd4-BoP-e23u.js} +2 -2
  33. package/assets/{classDiagram-70f12bd4-CBVHTwQu.js → classDiagram-70f12bd4-UTHJc2XA.js} +1 -1
  34. package/assets/classDiagram-v2-f2320105-BeBc2H-D.js +2 -0
  35. package/assets/{classDiagram-v2-f2320105-jpCwaHEd.js → classDiagram-v2-f2320105-Bjwz5ljW.js} +1 -1
  36. package/assets/{clipper-jvd5rF5a.js → clipper-NoHaeWV4.js} +1 -1
  37. package/assets/clone-CA2KqVCK.js +1 -0
  38. package/assets/createText-2e5e7dd3-Bsu7vT-L.js +8 -0
  39. package/assets/{createText-2e5e7dd3-x5lOIwut.js → createText-2e5e7dd3-DrWUfa-s.js} +1 -1
  40. package/assets/{edges-e0da2a9e-CbrF4nbD.js → edges-e0da2a9e-B9sYOHRt.js} +1 -1
  41. package/assets/{edges-e0da2a9e-Ch6PBwWs.js → edges-e0da2a9e-DX4IQMED.js} +1 -1
  42. package/assets/{erDiagram-9861fffd-DSlNVuAZ.js → erDiagram-9861fffd-B-LfsIMf.js} +1 -1
  43. package/assets/{erDiagram-9861fffd-Bq07elcI.js → erDiagram-9861fffd-DPdud_LA.js} +1 -1
  44. package/assets/{flowDb-956e92f1-Ti5YC4Vv.js → flowDb-956e92f1-C3xKlizM.js} +1 -1
  45. package/assets/{flowDb-956e92f1-BqPCJlZp.js → flowDb-956e92f1-Ck5oiEta.js} +1 -1
  46. package/assets/{flowDiagram-66a62f08-CPDuG3rY.js → flowDiagram-66a62f08-Bkt2NoHM.js} +4 -4
  47. package/assets/{flowDiagram-66a62f08-D3GSABFi.js → flowDiagram-66a62f08-CJnxo6dI.js} +1 -1
  48. package/assets/flowDiagram-v2-96b9c2cf-MnwxRDMO.js +1 -0
  49. package/assets/flowDiagram-v2-96b9c2cf-U7nNPvdl.js +1 -0
  50. package/assets/{flowchart-elk-definition-4a651766-BH09NeLA.js → flowchart-elk-definition-4a651766-2XkrsdKI.js} +2 -2
  51. package/assets/{flowchart-elk-definition-4a651766-BLaLPCDV.js → flowchart-elk-definition-4a651766-ec8y1a8S.js} +1 -1
  52. package/assets/{ganttDiagram-c361ad54-DL9ZeaEc.js → ganttDiagram-c361ad54-1TA0mZY_.js} +3 -3
  53. package/assets/{ganttDiagram-c361ad54-Sp9M1KHP.js → ganttDiagram-c361ad54-D-OrVtXV.js} +3 -3
  54. package/assets/{gitGraphDiagram-72cf32ee-BWwmRKo-.js → gitGraphDiagram-72cf32ee-Blt3RsBD.js} +1 -1
  55. package/assets/{gitGraphDiagram-72cf32ee-BSf1fsDV.js → gitGraphDiagram-72cf32ee-CKf6xgO1.js} +1 -1
  56. package/assets/{graph-g-2U7grQ.js → graph-CUYgHJmb.js} +1 -1
  57. package/assets/{graph--nPw8zXQ.js → graph-WeSRtsZO.js} +1 -1
  58. package/assets/{index-ZrVeQUWo.js → index--MqiaN5t.js} +1 -1
  59. package/assets/{index-C5eu4uSl.js → index-0b_TeH8L.js} +11 -11
  60. package/assets/{index-3862675e-BXwbZ2pz.js → index-3862675e-C2ipEQC8.js} +1 -1
  61. package/assets/{index-3862675e-D6Zy95zZ.js → index-3862675e-CeX6VlsU.js} +1 -1
  62. package/assets/{index-CLJUfzvO.js → index-B-J0JJak.js} +1 -1
  63. package/assets/{index-TkfyNewx.js → index-B7Hj7g41.js} +1 -1
  64. package/assets/{index-eZfwJ9bV.js → index-BS_v5cOh.js} +1 -1
  65. package/assets/index-Btk31p7r.js +1 -0
  66. package/assets/{index-DH12_HTj.js → index-C-Samsu3.js} +2 -2
  67. package/assets/index-C-llNX01.js +1 -0
  68. package/assets/index-C8c9icsH.js +2 -0
  69. package/assets/{index-D7b5fX1d.js → index-CAn2jfNg.js} +1 -1
  70. package/assets/{index-Dz8sghkK.js → index-CK2zt94U.js} +1 -1
  71. package/assets/{index-CfgvFFx3.js → index-CP51k4n6.js} +17 -17
  72. package/assets/{index-DI0OV6F8.js → index-CXBhIy30.js} +1 -1
  73. package/assets/index-C_Mj1wbj.js +2 -0
  74. package/assets/{index-BwSnJN93.js → index-CbfE0MBd.js} +1 -1
  75. package/assets/{index-C3qD42ws.js → index-CjeDxq0c.js} +1 -1
  76. package/assets/{index-DqMndQiP.js → index-Ct7OFnWK.js} +1 -1
  77. package/assets/{index-BaCHOxhI.js → index-CxxUIkx1.js} +1 -1
  78. package/assets/{index-B2dttXd7.js → index-D2Kc-3MO.js} +1 -1
  79. package/assets/{index-Bq8mPedC.js → index-DK0XEByD.js} +1 -1
  80. package/assets/{index-DllL1sx1.js → index-DQcV2DYj.js} +1 -1
  81. package/assets/{index-BP77pG9S.js → index-DSKRBuhn.js} +73 -73
  82. package/assets/{index-BXzGHPXz.js → index-DXqL8NRE.js} +2 -2
  83. package/assets/{index-B7V7-Vxz.js → index-DcLrRIlS.js} +1 -1
  84. package/assets/{index-D4pIkh3S.js → index-DdA-dF0D.js} +1 -1
  85. package/assets/{index-QkP3EC02.js → index-DdxTnVj5.js} +1 -1
  86. package/assets/{index-CmyOpFTN.js → index-DmrnShhc.js} +1 -1
  87. package/assets/{index-Bti3m-iW.js → index-QO0uGVDP.js} +1 -1
  88. package/assets/{index-BPR_DyGD.js → index-aIKXDB1M.js} +1 -1
  89. package/assets/{index-DIiIUyb-.js → index-n6JhNACm.js} +1 -1
  90. package/assets/{index-BWrcsh8u.js → index-qbS_W7PW.js} +1 -1
  91. package/assets/index-v7iKPBEu.css +1 -0
  92. package/assets/{infoDiagram-f8f76790-DpFqCCNv.js → infoDiagram-f8f76790-DEWQ3NXc.js} +1 -1
  93. package/assets/{infoDiagram-f8f76790-G2JpJJP7.js → infoDiagram-f8f76790-u_qjHFCm.js} +3 -3
  94. package/assets/{journeyDiagram-49397b02-DLLTobRM.js → journeyDiagram-49397b02-C8A30CBr.js} +1 -1
  95. package/assets/{journeyDiagram-49397b02-BdESGMrv.js → journeyDiagram-49397b02-hQJfqZih.js} +1 -1
  96. package/assets/{layout-WSR0vNPO.js → layout-CFKTKeqQ.js} +1 -1
  97. package/assets/{layout-CVkuImk4.js → layout-DvRyabpG.js} +1 -1
  98. package/assets/{line-D3bnG227.js → line-C72F34Po.js} +1 -1
  99. package/assets/{line-DQuMJveY.js → line-W5R41tQ1.js} +1 -1
  100. package/assets/{linear-CciP-97N.js → linear-7FXykgHM.js} +1 -1
  101. package/assets/{linear-Z6vFvuwc.js → linear-CVyOPUvz.js} +1 -1
  102. package/assets/main-BO0HWBB1.js +42 -0
  103. package/assets/{main-8DNjLY6L.css → main-DAuE07rf.css} +1 -1
  104. package/assets/{mermaid.core-CwZQb0ud.js → mermaid.core-2VcXhn43.js} +4 -4
  105. package/assets/{mindmap-definition-fc14e90a-BnJ8OOTI.js → mindmap-definition-fc14e90a-CcVXKGg4.js} +1 -1
  106. package/assets/{mindmap-definition-fc14e90a-CxQMydCW.js → mindmap-definition-fc14e90a-DRDYXe84.js} +2 -2
  107. package/assets/model-benchmark-launcher-C2qBiDlM.js +1 -0
  108. package/assets/{photo-wall-splitter-BZ88W5Zy.js → photo-wall-splitter-CFntSOdS.js} +1 -1
  109. package/assets/{pieDiagram-8a3498a8-BSDdkTeu.js → pieDiagram-8a3498a8-Be9dl9pU.js} +1 -1
  110. package/assets/{pieDiagram-8a3498a8-D6VtAoja.js → pieDiagram-8a3498a8-DXZOJYBv.js} +5 -5
  111. package/assets/ppt-generation-B5fKT_by.js +48 -0
  112. package/assets/{quadrantDiagram-120e2f19-C8k2xuBd.js → quadrantDiagram-120e2f19-DoU7aQSp.js} +3 -3
  113. package/assets/{quadrantDiagram-120e2f19-BbFV0VXY.js → quadrantDiagram-120e2f19-l5K9mx26.js} +1 -1
  114. package/assets/{requirementDiagram-deff3bca-C3xMdzJV.js → requirementDiagram-deff3bca-DN_87Wxe.js} +1 -1
  115. package/assets/{requirementDiagram-deff3bca-CpjqKjYZ.js → requirementDiagram-deff3bca-DOooq7kx.js} +1 -1
  116. package/assets/retry-image-BmIVuAVu.js +6 -0
  117. package/assets/{sankeyDiagram-04a897e0-Bjvig9bW.js → sankeyDiagram-04a897e0-BB33nO6_.js} +1 -1
  118. package/assets/{sankeyDiagram-04a897e0-BBJJgsFv.js → sankeyDiagram-04a897e0-CCa0hwml.js} +2 -2
  119. package/assets/{sequenceDiagram-704730f1-PFC_9IFI.js → sequenceDiagram-704730f1-CNhXZiix.js} +1 -1
  120. package/assets/{sequenceDiagram-704730f1-DX1MmBN_.js → sequenceDiagram-704730f1-ZqQ1QrY-.js} +1 -1
  121. package/assets/settings-dialog-BFuWTeQR.js +1 -0
  122. package/assets/{skill-dsl-parser-syNWYxFu.js → skill-dsl-parser-b-aB3P5u.js} +1 -1
  123. package/assets/{stateDiagram-587899a1-Dc3mI_B_.js → stateDiagram-587899a1-BBlOIJr7.js} +1 -1
  124. package/assets/{stateDiagram-587899a1-SFMUVAam.js → stateDiagram-587899a1-BhomZ0AN.js} +1 -1
  125. package/assets/{stateDiagram-v2-d93cdb3a-P4Yt2p_j.js → stateDiagram-v2-d93cdb3a-BpJsgMa0.js} +1 -1
  126. package/assets/stateDiagram-v2-d93cdb3a-CuOn9du2.js +1 -0
  127. package/assets/{styles-6aaf32cf-C3jnr3hV.js → styles-6aaf32cf-C2WEewoA.js} +1 -1
  128. package/assets/{styles-6aaf32cf-b6AdP7fu.js → styles-6aaf32cf-CTtf8moq.js} +1 -1
  129. package/assets/{styles-9a916d00-BUiD9iBe.js → styles-9a916d00-44Xi2-39.js} +1 -1
  130. package/assets/{styles-9a916d00-ii0XTdIm.js → styles-9a916d00-DUU3VgNe.js} +4 -4
  131. package/assets/{styles-c10674c1-DbTSpy3W.js → styles-c10674c1--AhWSGg7.js} +1 -1
  132. package/assets/styles-c10674c1-DS-wE3tK.js +116 -0
  133. package/assets/{svgDrawCommon-08f97a94-D4gIV05W.js → svgDrawCommon-08f97a94-CXcvtSSy.js} +1 -1
  134. package/assets/{svgDrawCommon-08f97a94-BK6lD4D6.js → svgDrawCommon-08f97a94-Dyqh4V2s.js} +1 -1
  135. package/assets/{timeline-definition-85554ec2-Bl2y548G.js → timeline-definition-85554ec2-k788753O.js} +1 -1
  136. package/assets/{timeline-definition-85554ec2-CWKg_JxG.js → timeline-definition-85554ec2-sw6-UuBe.js} +1 -1
  137. package/assets/tool-windows-BEnZdJqF.js +2948 -0
  138. package/assets/{tool-windows-CUNbW1Tz.css → tool-windows-D61Le6TE.css} +1 -1
  139. package/assets/ttd-dialog-BJzXAZ0l.js +99 -0
  140. package/assets/useCharacters-DRBoWvvj.css +1 -0
  141. package/assets/useCharacters-gsV4K8Hn.js +2 -0
  142. package/assets/{useWorkflowSubmission-BizuDmuw.js → useWorkflowSubmission-XRR21P6Y.js} +10 -10
  143. package/assets/{video-analyze-6v3Y-rUE.js → video-analyze-CpbnpSiI.js} +1 -1
  144. package/assets/{video-generation-DnmTlWnm.js → video-generation-BXhS7x-a.js} +2 -2
  145. package/assets/video-recovery-service-6G2lkWcu.js +1 -0
  146. package/assets/workflow-generation-utils-CYxtSHl0.js +3 -0
  147. package/assets/workflow-submission-service-DygSzydV.js +4 -0
  148. package/assets/{xychartDiagram-e933f94c-CJX9_9WF.js → xychartDiagram-e933f94c-CvTTDwPb.js} +3 -3
  149. package/assets/{xychartDiagram-e933f94c-Cep8CQEH.js → xychartDiagram-e933f94c-Ga9zi9ha.js} +1 -1
  150. package/changelog.json +45 -0
  151. package/idle-prefetch-manifest.json +310 -306
  152. package/manifest.json +3 -3
  153. package/package.json +1 -1
  154. package/precache-manifest.json +10 -10
  155. package/sitemap.xml +37 -0
  156. package/sw-debug/app.js +269 -156
  157. package/sw-debug/backup-restore.js +235 -103
  158. package/sw-debug/crypto-helper.js +116 -120
  159. package/sw-debug/duplex-client.js +33 -19
  160. package/sw-debug/gist-management.js +938 -655
  161. package/sw-debug/sw-communication.js +87 -50
  162. package/sw.js +5 -5
  163. package/version.json +7 -17
  164. package/assets/CanvasAudioPlayer-DutgwdiU.js +0 -2
  165. package/assets/ChatDrawer-0jNvKIoI.css +0 -1
  166. package/assets/ChatDrawer-E6Fog16I.js +0 -11
  167. package/assets/ChatMessagesArea-Bgwiz_XP.js +0 -250
  168. package/assets/ChatMessagesArea-DyR_wHFQ.css +0 -1
  169. package/assets/DeferredAIInputBar-CPkD8Cv9.js +0 -8
  170. package/assets/DrawnixDeferredFeatures-Cul76-88.js +0 -2
  171. package/assets/ModelBenchmarkWorkbench-Dv9SNYTi.js +0 -2
  172. package/assets/MusicAnalyzer-DhtRGpAp.css +0 -1
  173. package/assets/ResizableDivider-CaG9JQbJ.js +0 -1
  174. package/assets/TaskQueuePanel-BNhNzGp5.js +0 -1
  175. package/assets/ai-generation-preferences-service-BF7QkuJp.js +0 -1
  176. package/assets/arc-DmGoDCEL.js +0 -1
  177. package/assets/channel-CZjE-WNp.js +0 -1
  178. package/assets/channel-SXZD6bG3.js +0 -1
  179. package/assets/classDiagram-v2-f2320105-CsxWGkSy.js +0 -2
  180. package/assets/clone-C4mvvMDb.js +0 -1
  181. package/assets/createText-2e5e7dd3-CkXS3l7I.js +0 -5
  182. package/assets/flowDiagram-v2-96b9c2cf-BCcJ-cre.js +0 -1
  183. package/assets/flowDiagram-v2-96b9c2cf-DCVaFEgV.js +0 -1
  184. package/assets/index-3eqA7Bag.js +0 -1
  185. package/assets/index-7Q-aiwln.js +0 -4
  186. package/assets/index-B1XP5g7P.css +0 -1
  187. package/assets/index-BHPTfCZM.js +0 -1
  188. package/assets/index-BqHZCcen.js +0 -2
  189. package/assets/index-DcZrElEK.js +0 -2
  190. package/assets/index-gQ7LgvSv.js +0 -12
  191. package/assets/main-BFEkxCOK.js +0 -56
  192. package/assets/model-benchmark-launcher-Ct3lYXVq.js +0 -1
  193. package/assets/ppt-generation-FzjP_rp0.js +0 -48
  194. package/assets/settings-dialog-CQM4v791.js +0 -1
  195. package/assets/stateDiagram-v2-d93cdb3a-DmnBjHpC.js +0 -1
  196. package/assets/styles-c10674c1-Bt89Yy8Q.js +0 -116
  197. package/assets/tool-windows-DOIu9TAD.js +0 -2975
  198. package/assets/ttd-dialog-DI4kQSg8.js +0 -99
  199. package/assets/useCharacters-Chv4Ky7x.js +0 -7
  200. package/assets/useCharacters-OrDbG69o.css +0 -1
  201. package/assets/video-recovery-service-BeRoh0s2.js +0 -1
  202. package/assets/workflow-generation-utils-me381Cax.js +0 -3
  203. package/assets/workflow-submission-service-YOpo7g37.js +0 -4
@@ -28,9 +28,11 @@ const CACHE_STORAGE_NAME = 'drawnix-images';
28
28
  * Check if Web Crypto API is available
29
29
  */
30
30
  function isCryptoAvailable() {
31
- return typeof crypto !== 'undefined' &&
32
- crypto.subtle !== undefined &&
33
- typeof crypto.subtle.importKey === 'function';
31
+ return (
32
+ typeof crypto !== 'undefined' &&
33
+ crypto.subtle !== undefined &&
34
+ typeof crypto.subtle.importKey === 'function'
35
+ );
34
36
  }
35
37
 
36
38
  /**
@@ -79,9 +81,9 @@ function generatePasswordSeed() {
79
81
  const stableInfo = [
80
82
  deviceId,
81
83
  navigator.language || 'en-US',
82
- 'drawnix-crypto-key'
84
+ 'drawnix-crypto-key',
83
85
  ].join('-');
84
-
86
+
85
87
  return `drawnix-v2-${stableInfo}`;
86
88
  }
87
89
 
@@ -91,7 +93,7 @@ function generatePasswordSeed() {
91
93
  async function deriveKey(password, salt) {
92
94
  const encoder = new TextEncoder();
93
95
  const passwordBuffer = encoder.encode(password);
94
-
96
+
95
97
  const keyMaterial = await crypto.subtle.importKey(
96
98
  'raw',
97
99
  passwordBuffer,
@@ -99,13 +101,13 @@ async function deriveKey(password, salt) {
99
101
  false,
100
102
  ['deriveKey']
101
103
  );
102
-
104
+
103
105
  return crypto.subtle.deriveKey(
104
106
  {
105
107
  name: 'PBKDF2',
106
108
  salt: salt,
107
109
  iterations: PBKDF2_ITERATIONS,
108
- hash: 'SHA-256'
110
+ hash: 'SHA-256',
109
111
  },
110
112
  keyMaterial,
111
113
  { name: ALGORITHM, length: KEY_LENGTH },
@@ -116,34 +118,34 @@ async function deriveKey(password, salt) {
116
118
 
117
119
  /**
118
120
  * Decrypt Token (localStorage)
119
- * @param {string} encryptedData
121
+ * @param {string} encryptedData
120
122
  */
121
123
  export async function decryptToken(encryptedData) {
122
124
  if (encryptedData.startsWith(FALLBACK_PREFIX)) {
123
125
  const data = encryptedData.slice(FALLBACK_PREFIX.length);
124
126
  return decodeURIComponent(globalThis.atob(data));
125
127
  }
126
-
128
+
127
129
  if (!isCryptoAvailable()) {
128
130
  throw new Error('Web Crypto API not available');
129
131
  }
130
-
132
+
131
133
  try {
132
134
  const parsed = JSON.parse(encryptedData);
133
-
135
+
134
136
  const data = base64ToArrayBuffer(parsed.data);
135
137
  const iv = base64ToArrayBuffer(parsed.iv);
136
138
  const salt = base64ToArrayBuffer(parsed.salt);
137
-
139
+
138
140
  const password = generatePasswordSeed();
139
141
  const key = await deriveKey(password, new Uint8Array(salt));
140
-
142
+
141
143
  const decrypted = await crypto.subtle.decrypt(
142
144
  { name: ALGORITHM, iv: iv },
143
145
  key,
144
146
  data
145
147
  );
146
-
148
+
147
149
  const decoder = new TextDecoder();
148
150
  return decoder.decode(decrypted);
149
151
  } catch (error) {
@@ -191,9 +193,9 @@ function decryptCustomPassword(encrypted) {
191
193
  function getFromKVStore(key) {
192
194
  return new Promise((resolve, reject) => {
193
195
  const request = indexedDB.open(KV_DB_NAME);
194
-
196
+
195
197
  request.onerror = () => reject(request.error);
196
-
198
+
197
199
  request.onsuccess = () => {
198
200
  const db = request.result;
199
201
  if (!db.objectStoreNames.contains(KV_STORE_NAME)) {
@@ -201,17 +203,17 @@ function getFromKVStore(key) {
201
203
  resolve(null);
202
204
  return;
203
205
  }
204
-
206
+
205
207
  const transaction = db.transaction(KV_STORE_NAME, 'readonly');
206
208
  const store = transaction.objectStore(KV_STORE_NAME);
207
209
  const getReq = store.get(key);
208
-
210
+
209
211
  getReq.onsuccess = () => {
210
212
  resolve(getReq.result ? getReq.result.value : null);
211
213
  };
212
-
214
+
213
215
  getReq.onerror = () => reject(getReq.error);
214
-
216
+
215
217
  transaction.oncomplete = () => db.close();
216
218
  };
217
219
  });
@@ -224,15 +226,15 @@ export async function getGistCredentials() {
224
226
  try {
225
227
  const config = await getFromKVStore(SYNC_CONFIG_KEY);
226
228
  const storedPassword = await getFromKVStore(SYNC_PASSWORD_KEY);
227
-
229
+
228
230
  let customPassword = null;
229
231
  if (storedPassword && storedPassword.encrypted) {
230
232
  customPassword = decryptCustomPassword(storedPassword.encrypted);
231
233
  }
232
-
234
+
233
235
  return {
234
236
  gistId: config ? config.gistId : null,
235
- customPassword
237
+ customPassword,
236
238
  };
237
239
  } catch (error) {
238
240
  console.error('Failed to get gist credentials:', error);
@@ -246,7 +248,7 @@ export async function getGistCredentials() {
246
248
  async function deriveGistKey(secret) {
247
249
  const encoder = new TextEncoder();
248
250
  const passwordData = encoder.encode(secret + FIXED_SALT);
249
-
251
+
250
252
  const keyMaterial = await crypto.subtle.importKey(
251
253
  'raw',
252
254
  passwordData,
@@ -254,15 +256,15 @@ async function deriveGistKey(secret) {
254
256
  false,
255
257
  ['deriveKey']
256
258
  );
257
-
259
+
258
260
  const salt = encoder.encode(FIXED_SALT);
259
-
261
+
260
262
  return crypto.subtle.deriveKey(
261
263
  {
262
264
  name: 'PBKDF2',
263
265
  salt: salt,
264
266
  iterations: PBKDF2_ITERATIONS,
265
- hash: 'SHA-256'
267
+ hash: 'SHA-256',
266
268
  },
267
269
  keyMaterial,
268
270
  { name: ALGORITHM, length: KEY_LENGTH },
@@ -277,12 +279,12 @@ async function deriveGistKey(secret) {
277
279
  export async function decryptGistFile(content, gistId, customPassword) {
278
280
  try {
279
281
  const data = JSON.parse(content);
280
-
282
+
281
283
  // Check if it's encrypted data
282
284
  if (data.encrypted !== true || !data.iv || !data.data) {
283
285
  return content; // Return as is if not encrypted
284
286
  }
285
-
287
+
286
288
  // Determine secret to use
287
289
  let secret = gistId;
288
290
  if (data.customPassword && customPassword) {
@@ -290,17 +292,17 @@ export async function decryptGistFile(content, gistId, customPassword) {
290
292
  } else if (data.customPassword && !customPassword) {
291
293
  throw new Error('File encrypted with custom password but none provided');
292
294
  }
293
-
295
+
294
296
  const key = await deriveGistKey(secret);
295
297
  const iv = base64ToArrayBuffer(data.iv);
296
298
  const encryptedData = base64ToArrayBuffer(data.data);
297
-
299
+
298
300
  const decrypted = await crypto.subtle.decrypt(
299
301
  { name: ALGORITHM, iv: iv },
300
302
  key,
301
303
  encryptedData
302
304
  );
303
-
305
+
304
306
  const decoder = new TextDecoder();
305
307
  return decoder.decode(decrypted);
306
308
  } catch (error) {
@@ -383,42 +385,28 @@ export function getDeviceIdExported() {
383
385
  function getAllFromStore(dbName, storeName) {
384
386
  return new Promise((resolve, reject) => {
385
387
  const request = indexedDB.open(dbName);
386
-
388
+
387
389
  request.onerror = () => reject(request.error);
388
-
390
+
389
391
  request.onsuccess = () => {
390
392
  const db = request.result;
391
- console.log(`[getAllFromStore] Opened ${dbName}, stores:`, [...db.objectStoreNames]);
392
-
393
393
  if (!db.objectStoreNames.contains(storeName)) {
394
- console.log(`[getAllFromStore] Store '${storeName}' not found`);
395
394
  db.close();
396
395
  resolve([]);
397
396
  return;
398
397
  }
399
-
398
+
400
399
  const transaction = db.transaction(storeName, 'readonly');
401
400
  const store = transaction.objectStore(storeName);
402
401
  const getAllReq = store.getAll();
403
-
402
+
404
403
  getAllReq.onsuccess = () => {
405
404
  const results = getAllReq.result || [];
406
- console.log(`[getAllFromStore] ${dbName}/${storeName}: ${results.length} items`);
407
-
408
- // Check if this is localforage format (each item may be the actual value)
409
- // localforage stores data directly, but we should verify the structure
410
- if (results.length > 0) {
411
- const sample = results[0];
412
- console.log(`[getAllFromStore] Sample item structure:`,
413
- sample ? Object.keys(sample).slice(0, 5) : 'empty'
414
- );
415
- }
416
-
417
405
  resolve(results);
418
406
  };
419
-
407
+
420
408
  getAllReq.onerror = () => reject(getAllReq.error);
421
-
409
+
422
410
  transaction.oncomplete = () => db.close();
423
411
  };
424
412
  });
@@ -430,9 +418,9 @@ function getAllFromStore(dbName, storeName) {
430
418
  export async function diagnoseDatabase(dbName) {
431
419
  return new Promise((resolve, reject) => {
432
420
  const request = indexedDB.open(dbName);
433
-
421
+
434
422
  request.onerror = () => reject(request.error);
435
-
423
+
436
424
  request.onsuccess = async () => {
437
425
  const db = request.result;
438
426
  const result = {
@@ -440,38 +428,39 @@ export async function diagnoseDatabase(dbName) {
440
428
  version: db.version,
441
429
  stores: {},
442
430
  };
443
-
431
+
444
432
  const storeNames = [...db.objectStoreNames];
445
-
433
+
446
434
  for (const storeName of storeNames) {
447
435
  try {
448
436
  const tx = db.transaction(storeName, 'readonly');
449
437
  const store = tx.objectStore(storeName);
450
-
438
+
451
439
  const countReq = store.count();
452
440
  const count = await new Promise((res) => {
453
441
  countReq.onsuccess = () => res(countReq.result);
454
442
  countReq.onerror = () => res(-1);
455
443
  });
456
-
444
+
457
445
  // Get sample item
458
446
  const getAllReq = store.getAll(null, 1);
459
447
  const samples = await new Promise((res) => {
460
448
  getAllReq.onsuccess = () => res(getAllReq.result || []);
461
449
  getAllReq.onerror = () => res([]);
462
450
  });
463
-
451
+
464
452
  result.stores[storeName] = {
465
453
  count,
466
454
  keyPath: store.keyPath,
467
455
  indexNames: [...store.indexNames],
468
- sampleKeys: samples.length > 0 ? Object.keys(samples[0]).slice(0, 8) : [],
456
+ sampleKeys:
457
+ samples.length > 0 ? Object.keys(samples[0]).slice(0, 8) : [],
469
458
  };
470
459
  } catch (e) {
471
460
  result.stores[storeName] = { error: e.message };
472
461
  }
473
462
  }
474
-
463
+
475
464
  db.close();
476
465
  resolve(result);
477
466
  };
@@ -511,8 +500,8 @@ export async function listCacheStorageMedia() {
511
500
  try {
512
501
  const cache = await caches.open(CACHE_STORAGE_NAME);
513
502
  const keys = await cache.keys();
514
-
515
- const mediaList = keys.map(request => {
503
+
504
+ const mediaList = keys.map((request) => {
516
505
  const url = request.url;
517
506
  return {
518
507
  url,
@@ -520,7 +509,7 @@ export async function listCacheStorageMedia() {
520
509
  filename: url.split('/').pop() || url,
521
510
  };
522
511
  });
523
-
512
+
524
513
  return mediaList;
525
514
  } catch (error) {
526
515
  console.error('Failed to list cache storage media:', error);
@@ -535,17 +524,17 @@ export async function getCacheStorageStats() {
535
524
  try {
536
525
  const cache = await caches.open(CACHE_STORAGE_NAME);
537
526
  const keys = await cache.keys();
538
-
527
+
539
528
  let totalSize = 0;
540
529
  let imageCount = 0;
541
530
  let videoCount = 0;
542
-
531
+
543
532
  for (const request of keys) {
544
533
  const response = await cache.match(request);
545
534
  if (response) {
546
535
  const blob = await response.clone().blob();
547
536
  totalSize += blob.size;
548
-
537
+
549
538
  const contentType = response.headers.get('content-type') || '';
550
539
  if (contentType.startsWith('image/')) {
551
540
  imageCount++;
@@ -554,7 +543,7 @@ export async function getCacheStorageStats() {
554
543
  }
555
544
  }
556
545
  }
557
-
546
+
558
547
  return {
559
548
  totalFiles: keys.length,
560
549
  totalSize,
@@ -580,25 +569,28 @@ const UNIFIED_LOG_STORE = 'logs';
580
569
  async function openUnifiedLogDb() {
581
570
  return new Promise((resolve, reject) => {
582
571
  const request = indexedDB.open(UNIFIED_LOG_DB, 1);
583
-
572
+
584
573
  request.onerror = () => reject(request.error);
585
574
  request.onsuccess = () => resolve(request.result);
586
-
575
+
587
576
  request.onupgradeneeded = (event) => {
588
577
  const db = event.target.result;
589
578
  if (!db.objectStoreNames.contains(UNIFIED_LOG_STORE)) {
590
- const store = db.createObjectStore(UNIFIED_LOG_STORE, { keyPath: 'id' });
579
+ const store = db.createObjectStore(UNIFIED_LOG_STORE, {
580
+ keyPath: 'id',
581
+ });
591
582
  store.createIndex('timestamp', 'timestamp', { unique: false });
592
583
  store.createIndex('category', 'category', { unique: false });
593
584
  store.createIndex('level', 'level', { unique: false });
594
585
  store.createIndex('sessionId', 'sessionId', { unique: false });
595
- store.createIndex('category_timestamp', ['category', 'timestamp'], { unique: false });
586
+ store.createIndex('category_timestamp', ['category', 'timestamp'], {
587
+ unique: false,
588
+ });
596
589
  }
597
590
  };
598
591
  });
599
592
  }
600
593
 
601
-
602
594
  /**
603
595
  * Query sync logs from IndexedDB (unified log database)
604
596
  * @param {Object} query - Query parameters
@@ -607,15 +599,15 @@ async function openUnifiedLogDb() {
607
599
  export async function querySyncLogs(query = {}) {
608
600
  try {
609
601
  const db = await openUnifiedLogDb();
610
-
602
+
611
603
  return new Promise((resolve, reject) => {
612
604
  const tx = db.transaction(UNIFIED_LOG_STORE, 'readonly');
613
605
  const store = tx.objectStore(UNIFIED_LOG_STORE);
614
606
  const index = store.index('timestamp');
615
-
607
+
616
608
  const results = [];
617
609
  const request = index.openCursor(null, 'prev'); // Descending by timestamp
618
-
610
+
619
611
  request.onsuccess = () => {
620
612
  const cursor = request.result;
621
613
  if (!cursor) {
@@ -623,49 +615,52 @@ export async function querySyncLogs(query = {}) {
623
615
  resolve(results);
624
616
  return;
625
617
  }
626
-
618
+
627
619
  const entry = cursor.value;
628
-
620
+
629
621
  // Only include 'sync' category logs
630
622
  if (entry.category !== 'sync') {
631
623
  cursor.continue();
632
624
  return;
633
625
  }
634
-
626
+
635
627
  // Apply filters
636
628
  if (query.level && entry.level !== query.level) {
637
629
  cursor.continue();
638
630
  return;
639
631
  }
640
-
632
+
641
633
  if (query.sessionId && entry.sessionId !== query.sessionId) {
642
634
  cursor.continue();
643
635
  return;
644
636
  }
645
-
637
+
646
638
  if (query.search) {
647
639
  const searchLower = query.search.toLowerCase();
648
- const matchesMessage = entry.message?.toLowerCase().includes(searchLower);
649
- const matchesData = entry.data &&
640
+ const matchesMessage = entry.message
641
+ ?.toLowerCase()
642
+ .includes(searchLower);
643
+ const matchesData =
644
+ entry.data &&
650
645
  JSON.stringify(entry.data).toLowerCase().includes(searchLower);
651
646
  if (!matchesMessage && !matchesData) {
652
647
  cursor.continue();
653
648
  return;
654
649
  }
655
650
  }
656
-
651
+
657
652
  results.push(entry);
658
-
653
+
659
654
  // Apply limit
660
655
  if (query.limit && results.length >= query.limit) {
661
656
  db.close();
662
657
  resolve(results);
663
658
  return;
664
659
  }
665
-
660
+
666
661
  cursor.continue();
667
662
  };
668
-
663
+
669
664
  request.onerror = () => {
670
665
  db.close();
671
666
  reject(request.error);
@@ -684,19 +679,19 @@ export async function querySyncLogs(query = {}) {
684
679
  export async function getSyncLogStats() {
685
680
  try {
686
681
  const db = await openUnifiedLogDb();
687
-
682
+
688
683
  return new Promise((resolve, reject) => {
689
684
  const tx = db.transaction(UNIFIED_LOG_STORE, 'readonly');
690
685
  const store = tx.objectStore(UNIFIED_LOG_STORE);
691
-
686
+
692
687
  const stats = {
693
688
  total: 0,
694
689
  byLevel: { info: 0, success: 0, warning: 0, error: 0, debug: 0 },
695
690
  sessions: new Set(),
696
691
  };
697
-
692
+
698
693
  const request = store.openCursor();
699
-
694
+
700
695
  request.onsuccess = () => {
701
696
  const cursor = request.result;
702
697
  if (!cursor) {
@@ -706,28 +701,28 @@ export async function getSyncLogStats() {
706
701
  resolve(stats);
707
702
  return;
708
703
  }
709
-
704
+
710
705
  const entry = cursor.value;
711
-
706
+
712
707
  // Only count 'sync' category logs
713
708
  if (entry.category !== 'sync') {
714
709
  cursor.continue();
715
710
  return;
716
711
  }
717
-
712
+
718
713
  stats.total++;
719
-
714
+
720
715
  if (stats.byLevel[entry.level] !== undefined) {
721
716
  stats.byLevel[entry.level]++;
722
717
  }
723
-
718
+
724
719
  if (entry.sessionId) {
725
720
  stats.sessions.add(entry.sessionId);
726
721
  }
727
-
722
+
728
723
  cursor.continue();
729
724
  };
730
-
725
+
731
726
  request.onerror = () => {
732
727
  db.close();
733
728
  reject(request.error);
@@ -746,32 +741,33 @@ export async function getSyncLogStats() {
746
741
  export async function getSyncSessions() {
747
742
  try {
748
743
  const db = await openUnifiedLogDb();
749
-
744
+
750
745
  return new Promise((resolve, reject) => {
751
746
  const tx = db.transaction(UNIFIED_LOG_STORE, 'readonly');
752
747
  const store = tx.objectStore(UNIFIED_LOG_STORE);
753
-
748
+
754
749
  const sessionsMap = new Map();
755
750
  const request = store.openCursor();
756
-
751
+
757
752
  request.onsuccess = () => {
758
753
  const cursor = request.result;
759
754
  if (!cursor) {
760
755
  db.close();
761
- const sessions = Array.from(sessionsMap.values())
762
- .sort((a, b) => b.startTime - a.startTime);
756
+ const sessions = Array.from(sessionsMap.values()).sort(
757
+ (a, b) => b.startTime - a.startTime
758
+ );
763
759
  resolve(sessions);
764
760
  return;
765
761
  }
766
-
762
+
767
763
  const entry = cursor.value;
768
-
764
+
769
765
  // Only include 'sync' category logs
770
766
  if (entry.category !== 'sync') {
771
767
  cursor.continue();
772
768
  return;
773
769
  }
774
-
770
+
775
771
  if (entry.sessionId) {
776
772
  const existing = sessionsMap.get(entry.sessionId);
777
773
  if (existing) {
@@ -789,10 +785,10 @@ export async function getSyncSessions() {
789
785
  });
790
786
  }
791
787
  }
792
-
788
+
793
789
  cursor.continue();
794
790
  };
795
-
791
+
796
792
  request.onerror = () => {
797
793
  db.close();
798
794
  reject(request.error);
@@ -812,14 +808,14 @@ export async function getSyncSessions() {
812
808
  export async function clearSyncLogs(options = {}) {
813
809
  try {
814
810
  const db = await openUnifiedLogDb();
815
-
811
+
816
812
  return new Promise((resolve, reject) => {
817
813
  const tx = db.transaction(UNIFIED_LOG_STORE, 'readwrite');
818
814
  const store = tx.objectStore(UNIFIED_LOG_STORE);
819
-
815
+
820
816
  let deletedCount = 0;
821
817
  const request = store.openCursor();
822
-
818
+
823
819
  request.onsuccess = () => {
824
820
  const cursor = request.result;
825
821
  if (!cursor) {
@@ -827,17 +823,17 @@ export async function clearSyncLogs(options = {}) {
827
823
  resolve(deletedCount);
828
824
  return;
829
825
  }
830
-
826
+
831
827
  const entry = cursor.value;
832
-
828
+
833
829
  // Only delete 'sync' category logs
834
830
  if (entry.category !== 'sync') {
835
831
  cursor.continue();
836
832
  return;
837
833
  }
838
-
834
+
839
835
  let shouldDelete = false;
840
-
836
+
841
837
  // Clear all sync logs if no options
842
838
  if (!options.olderThan && !options.sessionId) {
843
839
  shouldDelete = true;
@@ -845,20 +841,20 @@ export async function clearSyncLogs(options = {}) {
845
841
  if (options.olderThan && entry.timestamp < options.olderThan) {
846
842
  shouldDelete = true;
847
843
  }
848
-
844
+
849
845
  if (options.sessionId && entry.sessionId === options.sessionId) {
850
846
  shouldDelete = true;
851
847
  }
852
848
  }
853
-
849
+
854
850
  if (shouldDelete) {
855
851
  cursor.delete();
856
852
  deletedCount++;
857
853
  }
858
-
854
+
859
855
  cursor.continue();
860
856
  };
861
-
857
+
862
858
  request.onerror = () => {
863
859
  db.close();
864
860
  reject(request.error);