@mentra/engine 0.1.0-dev.0 → 3.1.0-dev.4

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 (503) hide show
  1. package/README.md +55 -18
  2. package/build/bluetooth-sdk/debug.d.ts +2 -0
  3. package/build/bluetooth-sdk/debug.d.ts.map +1 -0
  4. package/build/bluetooth-sdk/debug.js +2 -0
  5. package/build/bluetooth-sdk/debug.js.map +1 -0
  6. package/build/bluetooth-sdk/index.d.ts +3 -0
  7. package/build/bluetooth-sdk/index.d.ts.map +1 -0
  8. package/build/bluetooth-sdk/index.js +3 -0
  9. package/build/bluetooth-sdk/index.js.map +1 -0
  10. package/build/bluetooth-sdk/photo-receiver.d.ts +3 -0
  11. package/build/bluetooth-sdk/photo-receiver.d.ts.map +1 -0
  12. package/build/bluetooth-sdk/photo-receiver.js +3 -0
  13. package/build/bluetooth-sdk/photo-receiver.js.map +1 -0
  14. package/build/bluetooth-sdk/react.d.ts +2 -0
  15. package/build/bluetooth-sdk/react.d.ts.map +1 -0
  16. package/build/bluetooth-sdk/react.js +2 -0
  17. package/build/bluetooth-sdk/react.js.map +1 -0
  18. package/build/bluetooth-sdk/types.d.ts +2 -0
  19. package/build/bluetooth-sdk/types.d.ts.map +1 -0
  20. package/build/bluetooth-sdk/types.js +2 -0
  21. package/build/bluetooth-sdk/types.js.map +1 -0
  22. package/build/engine.d.ts +24 -16
  23. package/build/engine.d.ts.map +1 -1
  24. package/build/engine.js +9 -4
  25. package/build/engine.js.map +1 -1
  26. package/build/facades/dev.d.ts +3 -2
  27. package/build/facades/dev.d.ts.map +1 -1
  28. package/build/facades/dev.js +18 -12
  29. package/build/facades/dev.js.map +1 -1
  30. package/build/facades/display.d.ts +1 -1
  31. package/build/facades/display.d.ts.map +1 -1
  32. package/build/facades/display.js +1 -1
  33. package/build/facades/display.js.map +1 -1
  34. package/build/facades/gallery.js +1 -1
  35. package/build/facades/gallery.js.map +1 -1
  36. package/build/facades/glasses.d.ts +4 -13
  37. package/build/facades/glasses.d.ts.map +1 -1
  38. package/build/facades/glasses.js +21 -6
  39. package/build/facades/glasses.js.map +1 -1
  40. package/build/facades/glassesSettings.d.ts.map +1 -1
  41. package/build/facades/glassesSettings.js +1 -0
  42. package/build/facades/glassesSettings.js.map +1 -1
  43. package/build/facades/miniapps.d.ts +4 -0
  44. package/build/facades/miniapps.d.ts.map +1 -1
  45. package/build/facades/miniapps.js +5 -0
  46. package/build/facades/miniapps.js.map +1 -1
  47. package/build/facades/ota.d.ts +14 -16
  48. package/build/facades/ota.d.ts.map +1 -1
  49. package/build/facades/ota.js +22 -7
  50. package/build/facades/ota.js.map +1 -1
  51. package/build/facades/pairing.d.ts +8 -5
  52. package/build/facades/pairing.d.ts.map +1 -1
  53. package/build/facades/pairing.js +12 -10
  54. package/build/facades/pairing.js.map +1 -1
  55. package/build/facades/permissions.d.ts +10 -0
  56. package/build/facades/permissions.d.ts.map +1 -1
  57. package/build/facades/permissions.js +10 -0
  58. package/build/facades/permissions.js.map +1 -1
  59. package/build/facades/phoneNotifications.d.ts +0 -4
  60. package/build/facades/phoneNotifications.d.ts.map +1 -1
  61. package/build/facades/phoneNotifications.js +4 -14
  62. package/build/facades/phoneNotifications.js.map +1 -1
  63. package/build/facades/speech.d.ts +7 -6
  64. package/build/facades/speech.d.ts.map +1 -1
  65. package/build/facades/speech.js +1 -1
  66. package/build/facades/speech.js.map +1 -1
  67. package/build/generated/releaseMetadata.d.ts +12 -0
  68. package/build/generated/releaseMetadata.d.ts.map +1 -0
  69. package/build/generated/releaseMetadata.js +10 -0
  70. package/build/generated/releaseMetadata.js.map +1 -0
  71. package/build/index.d.ts +10 -8
  72. package/build/index.d.ts.map +1 -1
  73. package/build/index.js +6 -5
  74. package/build/index.js.map +1 -1
  75. package/build/react/MentraLiveOtaFlow.d.ts +38 -0
  76. package/build/react/MentraLiveOtaFlow.d.ts.map +1 -0
  77. package/build/react/MentraLiveOtaFlow.js +528 -0
  78. package/build/react/MentraLiveOtaFlow.js.map +1 -0
  79. package/build/react/index.d.ts +2 -0
  80. package/build/react/index.d.ts.map +1 -0
  81. package/build/react/index.js +2 -0
  82. package/build/react/index.js.map +1 -0
  83. package/build/react/useEngineSnapshot.d.ts +2 -0
  84. package/build/react/useEngineSnapshot.d.ts.map +1 -0
  85. package/build/react/useEngineSnapshot.js +14 -0
  86. package/build/react/useEngineSnapshot.js.map +1 -0
  87. package/build/runtime/bootstrap.d.ts +24 -1
  88. package/build/runtime/bootstrap.d.ts.map +1 -1
  89. package/build/runtime/bootstrap.js +17 -0
  90. package/build/runtime/bootstrap.js.map +1 -1
  91. package/build/runtime/scanQrSeam.d.ts +7 -0
  92. package/build/runtime/scanQrSeam.d.ts.map +1 -0
  93. package/build/runtime/scanQrSeam.js +16 -0
  94. package/build/runtime/scanQrSeam.js.map +1 -0
  95. package/build/services/AppRegistry.d.ts +41 -57
  96. package/build/services/AppRegistry.d.ts.map +1 -1
  97. package/build/services/AppRegistry.js +208 -144
  98. package/build/services/AppRegistry.js.map +1 -1
  99. package/build/services/AudioCloudUplink.d.ts +12 -0
  100. package/build/services/AudioCloudUplink.d.ts.map +1 -1
  101. package/build/services/AudioCloudUplink.js +22 -1
  102. package/build/services/AudioCloudUplink.js.map +1 -1
  103. package/build/services/AudioPlaybackService.d.ts +41 -2
  104. package/build/services/AudioPlaybackService.d.ts.map +1 -1
  105. package/build/services/AudioPlaybackService.js +250 -33
  106. package/build/services/AudioPlaybackService.js.map +1 -1
  107. package/build/services/BlobStore.d.ts +2 -1
  108. package/build/services/BlobStore.d.ts.map +1 -1
  109. package/build/services/BlobStore.js +17 -9
  110. package/build/services/BlobStore.js.map +1 -1
  111. package/build/services/CloudAudioSubscriptionSync.d.ts.map +1 -1
  112. package/build/services/CloudAudioSubscriptionSync.js +13 -1
  113. package/build/services/CloudAudioSubscriptionSync.js.map +1 -1
  114. package/build/services/CloudClientService.d.ts +15 -0
  115. package/build/services/CloudClientService.d.ts.map +1 -1
  116. package/build/services/CloudClientService.js +93 -1
  117. package/build/services/CloudClientService.js.map +1 -1
  118. package/build/services/DeviceEventRouter.js +5 -5
  119. package/build/services/DeviceEventRouter.js.map +1 -1
  120. package/build/services/ForegroundLocationPermission.d.ts +13 -0
  121. package/build/services/ForegroundLocationPermission.d.ts.map +1 -0
  122. package/build/services/ForegroundLocationPermission.js +12 -0
  123. package/build/services/ForegroundLocationPermission.js.map +1 -0
  124. package/build/services/GlassesSettingsSync.d.ts.map +1 -1
  125. package/build/services/GlassesSettingsSync.js +9 -3
  126. package/build/services/GlassesSettingsSync.js.map +1 -1
  127. package/build/services/GlassesStatusProjection.d.ts +2 -1
  128. package/build/services/GlassesStatusProjection.d.ts.map +1 -1
  129. package/build/services/GlassesStatusProjection.js +15 -8
  130. package/build/services/GlassesStatusProjection.js.map +1 -1
  131. package/build/services/HotspotOtaTransport.d.ts +29 -0
  132. package/build/services/HotspotOtaTransport.d.ts.map +1 -0
  133. package/build/services/HotspotOtaTransport.js +146 -0
  134. package/build/services/HotspotOtaTransport.js.map +1 -0
  135. package/build/services/HotspotShutdown.d.ts +17 -0
  136. package/build/services/HotspotShutdown.d.ts.map +1 -0
  137. package/build/services/HotspotShutdown.js +29 -0
  138. package/build/services/HotspotShutdown.js.map +1 -0
  139. package/build/services/LocalDisplayManager.d.ts +15 -0
  140. package/build/services/LocalDisplayManager.d.ts.map +1 -1
  141. package/build/services/LocalDisplayManager.js +106 -20
  142. package/build/services/LocalDisplayManager.js.map +1 -1
  143. package/build/services/LocalMiniappRuntime.d.ts +74 -2
  144. package/build/services/LocalMiniappRuntime.d.ts.map +1 -1
  145. package/build/services/LocalMiniappRuntime.js +785 -291
  146. package/build/services/LocalMiniappRuntime.js.map +1 -1
  147. package/build/services/LocalMiniappStorage.d.ts +32 -0
  148. package/build/services/LocalMiniappStorage.d.ts.map +1 -0
  149. package/build/services/LocalMiniappStorage.js +66 -0
  150. package/build/services/LocalMiniappStorage.js.map +1 -0
  151. package/build/services/LocalMiniappUserIdentity.d.ts +20 -0
  152. package/build/services/LocalMiniappUserIdentity.d.ts.map +1 -0
  153. package/build/services/LocalMiniappUserIdentity.js +43 -0
  154. package/build/services/LocalMiniappUserIdentity.js.map +1 -0
  155. package/build/services/LocalSttFallbackCoordinator.d.ts +9 -6
  156. package/build/services/LocalSttFallbackCoordinator.d.ts.map +1 -1
  157. package/build/services/LocalSttFallbackCoordinator.js +18 -12
  158. package/build/services/LocalSttFallbackCoordinator.js.map +1 -1
  159. package/build/services/MicStateCoordinator.d.ts +42 -1
  160. package/build/services/MicStateCoordinator.d.ts.map +1 -1
  161. package/build/services/MicStateCoordinator.js +141 -3
  162. package/build/services/MicStateCoordinator.js.map +1 -1
  163. package/build/services/MiniappLauncher.d.ts.map +1 -1
  164. package/build/services/MiniappLauncher.js +23 -3
  165. package/build/services/MiniappLauncher.js.map +1 -1
  166. package/build/services/MiniappLiveness.d.ts +12 -0
  167. package/build/services/MiniappLiveness.d.ts.map +1 -0
  168. package/build/services/MiniappLiveness.js +16 -0
  169. package/build/services/MiniappLiveness.js.map +1 -0
  170. package/build/services/NativeHttpResponse.d.ts +3 -0
  171. package/build/services/NativeHttpResponse.d.ts.map +1 -0
  172. package/build/services/NativeHttpResponse.js +6 -0
  173. package/build/services/NativeHttpResponse.js.map +1 -0
  174. package/build/services/OtaArtifactDownloader.d.ts +65 -0
  175. package/build/services/OtaArtifactDownloader.d.ts.map +1 -0
  176. package/build/services/OtaArtifactDownloader.js +226 -0
  177. package/build/services/OtaArtifactDownloader.js.map +1 -0
  178. package/build/services/OtaAutoChain.d.ts +34 -0
  179. package/build/services/OtaAutoChain.d.ts.map +1 -0
  180. package/build/services/OtaAutoChain.js +83 -0
  181. package/build/services/OtaAutoChain.js.map +1 -0
  182. package/build/services/OtaErrorMapping.d.ts +18 -0
  183. package/build/services/OtaErrorMapping.d.ts.map +1 -0
  184. package/build/services/OtaErrorMapping.js +63 -0
  185. package/build/services/OtaErrorMapping.js.map +1 -0
  186. package/build/services/OtaInstallCoordinator.d.ts +95 -15
  187. package/build/services/OtaInstallCoordinator.d.ts.map +1 -1
  188. package/build/services/OtaInstallCoordinator.js +577 -130
  189. package/build/services/OtaInstallCoordinator.js.map +1 -1
  190. package/build/services/OtaService.d.ts.map +1 -1
  191. package/build/services/OtaService.js +8 -1
  192. package/build/services/OtaService.js.map +1 -1
  193. package/build/services/OtaUpdateCheckService.d.ts +39 -4
  194. package/build/services/OtaUpdateCheckService.d.ts.map +1 -1
  195. package/build/services/OtaUpdateCheckService.js +138 -22
  196. package/build/services/OtaUpdateCheckService.js.map +1 -1
  197. package/build/services/PhoneCalendarHelpers.d.ts +32 -0
  198. package/build/services/PhoneCalendarHelpers.d.ts.map +1 -0
  199. package/build/services/PhoneCalendarHelpers.js +157 -0
  200. package/build/services/PhoneCalendarHelpers.js.map +1 -0
  201. package/build/services/PhoneCalendarService.d.ts +5 -0
  202. package/build/services/PhoneCalendarService.d.ts.map +1 -0
  203. package/build/services/PhoneCalendarService.js +45 -0
  204. package/build/services/PhoneCalendarService.js.map +1 -0
  205. package/build/services/PhoneCameraFovCoordinator.d.ts +30 -0
  206. package/build/services/PhoneCameraFovCoordinator.d.ts.map +1 -0
  207. package/build/services/PhoneCameraFovCoordinator.js +194 -0
  208. package/build/services/PhoneCameraFovCoordinator.js.map +1 -0
  209. package/build/services/PhoneNotificationsSync.d.ts.map +1 -1
  210. package/build/services/PhoneNotificationsSync.js +12 -10
  211. package/build/services/PhoneNotificationsSync.js.map +1 -1
  212. package/build/services/PhonePhotoCoordinator.d.ts +26 -2
  213. package/build/services/PhonePhotoCoordinator.d.ts.map +1 -1
  214. package/build/services/PhonePhotoCoordinator.js +79 -9
  215. package/build/services/PhonePhotoCoordinator.js.map +1 -1
  216. package/build/services/PhoneStreamCoordinator.d.ts +8 -1
  217. package/build/services/PhoneStreamCoordinator.d.ts.map +1 -1
  218. package/build/services/PhoneStreamCoordinator.js +125 -13
  219. package/build/services/PhoneStreamCoordinator.js.map +1 -1
  220. package/build/services/PhoneVideoCoordinator.d.ts +2 -0
  221. package/build/services/PhoneVideoCoordinator.d.ts.map +1 -1
  222. package/build/services/PhoneVideoCoordinator.js +10 -0
  223. package/build/services/PhoneVideoCoordinator.js.map +1 -1
  224. package/build/services/SceneRenderer.d.ts.map +1 -1
  225. package/build/services/SceneRenderer.js +15 -0
  226. package/build/services/SceneRenderer.js.map +1 -1
  227. package/build/services/SentenceTtsPipeline.d.ts +31 -0
  228. package/build/services/SentenceTtsPipeline.d.ts.map +1 -0
  229. package/build/services/SentenceTtsPipeline.js +67 -0
  230. package/build/services/SentenceTtsPipeline.js.map +1 -0
  231. package/build/services/SupportProfileSync.d.ts +22 -0
  232. package/build/services/SupportProfileSync.d.ts.map +1 -0
  233. package/build/services/SupportProfileSync.js +213 -0
  234. package/build/services/SupportProfileSync.js.map +1 -0
  235. package/build/services/TranscriptionRouting.d.ts +12 -0
  236. package/build/services/TranscriptionRouting.d.ts.map +1 -0
  237. package/build/services/TranscriptionRouting.js +24 -0
  238. package/build/services/TranscriptionRouting.js.map +1 -0
  239. package/build/services/TtsTextSanitizer.d.ts +5 -0
  240. package/build/services/TtsTextSanitizer.d.ts.map +1 -0
  241. package/build/services/TtsTextSanitizer.js +61 -0
  242. package/build/services/TtsTextSanitizer.js.map +1 -0
  243. package/build/services/WifiAdbRequest.d.ts +17 -0
  244. package/build/services/WifiAdbRequest.d.ts.map +1 -0
  245. package/build/services/WifiAdbRequest.js +35 -0
  246. package/build/services/WifiAdbRequest.js.map +1 -0
  247. package/build/services/asg/asgCameraApi.d.ts +43 -0
  248. package/build/services/asg/asgCameraApi.d.ts.map +1 -1
  249. package/build/services/asg/asgCameraApi.js +509 -26
  250. package/build/services/asg/asgCameraApi.js.map +1 -1
  251. package/build/services/asg/cameraRollExportCoordinator.d.ts +60 -0
  252. package/build/services/asg/cameraRollExportCoordinator.d.ts.map +1 -0
  253. package/build/services/asg/cameraRollExportCoordinator.js +618 -0
  254. package/build/services/asg/cameraRollExportCoordinator.js.map +1 -0
  255. package/build/services/asg/cameraRollExportLedger.d.ts +44 -0
  256. package/build/services/asg/cameraRollExportLedger.d.ts.map +1 -0
  257. package/build/services/asg/cameraRollExportLedger.js +78 -0
  258. package/build/services/asg/cameraRollExportLedger.js.map +1 -0
  259. package/build/services/asg/galleryNotices.d.ts +1 -1
  260. package/build/services/asg/galleryNotices.d.ts.map +1 -1
  261. package/build/services/asg/galleryNotices.js.map +1 -1
  262. package/build/services/asg/galleryPathMigration.d.ts +3 -0
  263. package/build/services/asg/galleryPathMigration.d.ts.map +1 -0
  264. package/build/services/asg/galleryPathMigration.js +26 -0
  265. package/build/services/asg/galleryPathMigration.js.map +1 -0
  266. package/build/services/asg/gallerySettingsService.d.ts +1 -0
  267. package/build/services/asg/gallerySettingsService.d.ts.map +1 -1
  268. package/build/services/asg/gallerySettingsService.js +2 -0
  269. package/build/services/asg/gallerySettingsService.js.map +1 -1
  270. package/build/services/asg/gallerySyncService.d.ts.map +1 -1
  271. package/build/services/asg/gallerySyncService.js +162 -56
  272. package/build/services/asg/gallerySyncService.js.map +1 -1
  273. package/build/services/asg/galleryTransferLedger.d.ts +58 -0
  274. package/build/services/asg/galleryTransferLedger.d.ts.map +1 -0
  275. package/build/services/asg/galleryTransferLedger.js +225 -0
  276. package/build/services/asg/galleryTransferLedger.js.map +1 -0
  277. package/build/services/asg/localNetworkTransport.d.ts +15 -0
  278. package/build/services/asg/localNetworkTransport.d.ts.map +1 -0
  279. package/build/services/asg/localNetworkTransport.js +144 -0
  280. package/build/services/asg/localNetworkTransport.js.map +1 -0
  281. package/build/services/asg/localStorageService.d.ts +18 -0
  282. package/build/services/asg/localStorageService.d.ts.map +1 -1
  283. package/build/services/asg/localStorageService.js +168 -19
  284. package/build/services/asg/localStorageService.js.map +1 -1
  285. package/build/services/asg/mediaProcessingQueue.d.ts +10 -0
  286. package/build/services/asg/mediaProcessingQueue.d.ts.map +1 -1
  287. package/build/services/asg/mediaProcessingQueue.js +193 -62
  288. package/build/services/asg/mediaProcessingQueue.js.map +1 -1
  289. package/build/services/audioPlaybackAssets.d.ts +8 -0
  290. package/build/services/audioPlaybackAssets.d.ts.map +1 -0
  291. package/build/services/audioPlaybackAssets.js +7 -0
  292. package/build/services/audioPlaybackAssets.js.map +1 -0
  293. package/build/services/gallerySyncClock.js +1 -1
  294. package/build/services/gallerySyncClock.js.map +1 -1
  295. package/build/services/glassesClockSync.d.ts.map +1 -1
  296. package/build/services/glassesClockSync.js +6 -2
  297. package/build/services/glassesClockSync.js.map +1 -1
  298. package/build/services/manifestActions.d.ts +7 -0
  299. package/build/services/manifestActions.d.ts.map +1 -0
  300. package/build/services/manifestActions.js +25 -0
  301. package/build/services/manifestActions.js.map +1 -0
  302. package/build/services/otaDisplayState.d.ts +23 -12
  303. package/build/services/otaDisplayState.d.ts.map +1 -1
  304. package/build/services/otaDisplayState.js +36 -14
  305. package/build/services/otaDisplayState.js.map +1 -1
  306. package/build/services/otaInstallPolicy.d.ts +16 -4
  307. package/build/services/otaInstallPolicy.d.ts.map +1 -1
  308. package/build/services/otaInstallPolicy.js +24 -3
  309. package/build/services/otaInstallPolicy.js.map +1 -1
  310. package/build/services/otaLegacyMapping.d.ts +1 -1
  311. package/build/services/otaLegacyMapping.d.ts.map +1 -1
  312. package/build/services/otaLegacyMapping.js.map +1 -1
  313. package/build/services/otaManifestPolicy.d.ts +14 -0
  314. package/build/services/otaManifestPolicy.d.ts.map +1 -0
  315. package/build/services/otaManifestPolicy.js +19 -0
  316. package/build/services/otaManifestPolicy.js.map +1 -0
  317. package/build/services/otaManifestUrl.d.ts +3 -0
  318. package/build/services/otaManifestUrl.d.ts.map +1 -0
  319. package/build/services/otaManifestUrl.js +38 -0
  320. package/build/services/otaManifestUrl.js.map +1 -0
  321. package/build/services/slimStreamStatus.d.ts +11 -0
  322. package/build/services/slimStreamStatus.d.ts.map +1 -1
  323. package/build/services/slimStreamStatus.js +14 -4
  324. package/build/services/slimStreamStatus.js.map +1 -1
  325. package/build/stores/apps.d.ts.map +1 -1
  326. package/build/stores/apps.js +11 -0
  327. package/build/stores/apps.js.map +1 -1
  328. package/build/stores/bluetoothSettingKeys.d.ts.map +1 -1
  329. package/build/stores/bluetoothSettingKeys.js +2 -0
  330. package/build/stores/bluetoothSettingKeys.js.map +1 -1
  331. package/build/stores/gallerySync.d.ts +2 -0
  332. package/build/stores/gallerySync.d.ts.map +1 -1
  333. package/build/stores/gallerySync.js +2 -0
  334. package/build/stores/gallerySync.js.map +1 -1
  335. package/build/stores/glasses.d.ts.map +1 -1
  336. package/build/stores/glasses.js +3 -0
  337. package/build/stores/glasses.js.map +1 -1
  338. package/build/stores/settings.d.ts +17 -0
  339. package/build/stores/settings.d.ts.map +1 -1
  340. package/build/stores/settings.js +157 -17
  341. package/build/stores/settings.js.map +1 -1
  342. package/build/types/applet.d.ts +2 -0
  343. package/build/types/applet.d.ts.map +1 -1
  344. package/build/types/applet.js.map +1 -1
  345. package/build/types/asg.d.ts +7 -0
  346. package/build/types/asg.d.ts.map +1 -1
  347. package/build/types/asg.js.map +1 -1
  348. package/build/types/enums.d.ts +2 -25
  349. package/build/types/enums.d.ts.map +1 -1
  350. package/build/types/enums.js +2 -27
  351. package/build/types/enums.js.map +1 -1
  352. package/build/types/hardware.d.ts +4 -13
  353. package/build/types/hardware.d.ts.map +1 -1
  354. package/build/types/hardware.js +15 -3
  355. package/build/types/hardware.js.map +1 -1
  356. package/build/types/index.d.ts +2 -6
  357. package/build/types/index.d.ts.map +1 -1
  358. package/build/types/index.js +2 -6
  359. package/build/types/index.js.map +1 -1
  360. package/build/utils/configuredDevHost.d.ts +6 -0
  361. package/build/utils/configuredDevHost.d.ts.map +1 -0
  362. package/build/utils/configuredDevHost.js +19 -0
  363. package/build/utils/configuredDevHost.js.map +1 -0
  364. package/build/utils/devMiniappLaunch.d.ts +19 -8
  365. package/build/utils/devMiniappLaunch.d.ts.map +1 -1
  366. package/build/utils/devMiniappLaunch.js +144 -21
  367. package/build/utils/devMiniappLaunch.js.map +1 -1
  368. package/build/utils/diagnosticContext.d.ts.map +1 -1
  369. package/build/utils/diagnosticContext.js +15 -17
  370. package/build/utils/diagnosticContext.js.map +1 -1
  371. package/build/utils/hardware/hardware.d.ts.map +1 -1
  372. package/build/utils/hardware/hardware.js +7 -3
  373. package/build/utils/hardware/hardware.js.map +1 -1
  374. package/build/utils/miniappDiagnostics.d.ts +64 -0
  375. package/build/utils/miniappDiagnostics.d.ts.map +1 -0
  376. package/build/utils/miniappDiagnostics.js +173 -0
  377. package/build/utils/miniappDiagnostics.js.map +1 -0
  378. package/build/utils/permissions/MediaLibraryPermissions.d.ts +11 -0
  379. package/build/utils/permissions/MediaLibraryPermissions.d.ts.map +1 -1
  380. package/build/utils/permissions/MediaLibraryPermissions.js +27 -4
  381. package/build/utils/permissions/MediaLibraryPermissions.js.map +1 -1
  382. package/build/utils/timers/timers.d.ts.map +1 -1
  383. package/build/utils/timers/timers.js +55 -18
  384. package/build/utils/timers/timers.js.map +1 -1
  385. package/package.json +59 -31
  386. package/src/assets/silence.wav +0 -0
  387. package/src/bluetooth-sdk/debug.ts +1 -0
  388. package/src/bluetooth-sdk/index.ts +2 -0
  389. package/src/bluetooth-sdk/photo-receiver.ts +2 -0
  390. package/src/bluetooth-sdk/react.ts +1 -0
  391. package/src/bluetooth-sdk/types.ts +1 -0
  392. package/src/engine.ts +9 -4
  393. package/src/facades/dev.ts +17 -12
  394. package/src/facades/display.ts +1 -1
  395. package/src/facades/gallery.ts +1 -1
  396. package/src/facades/glasses.ts +20 -7
  397. package/src/facades/glassesSettings.ts +5 -0
  398. package/src/facades/miniapps.ts +7 -0
  399. package/src/facades/ota.ts +23 -8
  400. package/src/facades/pairing.ts +15 -11
  401. package/src/facades/permissions.ts +14 -0
  402. package/src/facades/phoneNotifications.ts +4 -13
  403. package/src/facades/speech.ts +21 -7
  404. package/src/generated/releaseMetadata.ts +20 -0
  405. package/src/index.ts +39 -13
  406. package/src/react/MentraLiveOtaFlow.tsx +856 -0
  407. package/src/react/index.ts +7 -0
  408. package/src/react/useEngineSnapshot.ts +16 -0
  409. package/src/runtime/bootstrap.ts +33 -1
  410. package/src/runtime/scanQrSeam.ts +20 -0
  411. package/src/services/AppRegistry.ts +240 -149
  412. package/src/services/AudioCloudUplink.ts +23 -1
  413. package/src/services/AudioPlaybackService.ts +287 -38
  414. package/src/services/BlobStore.ts +22 -9
  415. package/src/services/CloudAudioSubscriptionSync.ts +13 -1
  416. package/src/services/CloudClientService.ts +96 -1
  417. package/src/services/DeviceEventRouter.ts +5 -5
  418. package/src/services/ForegroundLocationPermission.ts +24 -0
  419. package/src/services/GlassesSettingsSync.ts +9 -3
  420. package/src/services/GlassesStatusProjection.ts +16 -8
  421. package/src/services/HotspotOtaTransport.ts +184 -0
  422. package/src/services/HotspotShutdown.ts +41 -0
  423. package/src/services/LocalDisplayManager.ts +112 -21
  424. package/src/services/LocalMiniappRuntime.ts +967 -346
  425. package/src/services/LocalMiniappStorage.ts +82 -0
  426. package/src/services/LocalMiniappUserIdentity.ts +46 -0
  427. package/src/services/LocalSttFallbackCoordinator.ts +19 -12
  428. package/src/services/MicStateCoordinator.ts +169 -4
  429. package/src/services/MiniappLauncher.ts +30 -3
  430. package/src/services/MiniappLiveness.ts +24 -0
  431. package/src/services/NativeHttpResponse.ts +6 -0
  432. package/src/services/OtaArtifactDownloader.ts +312 -0
  433. package/src/services/OtaAutoChain.ts +106 -0
  434. package/src/services/OtaErrorMapping.ts +80 -0
  435. package/src/services/OtaInstallCoordinator.ts +649 -144
  436. package/src/services/OtaService.ts +11 -5
  437. package/src/services/OtaUpdateCheckService.ts +181 -21
  438. package/src/services/PhoneCalendarHelpers.ts +212 -0
  439. package/src/services/PhoneCalendarService.ts +65 -0
  440. package/src/services/PhoneCameraFovCoordinator.ts +210 -0
  441. package/src/services/PhoneNotificationsSync.ts +12 -10
  442. package/src/services/PhonePhotoCoordinator.ts +116 -18
  443. package/src/services/PhoneStreamCoordinator.ts +139 -25
  444. package/src/services/PhoneVideoCoordinator.ts +11 -0
  445. package/src/services/SceneRenderer.ts +16 -0
  446. package/src/services/SentenceTtsPipeline.ts +106 -0
  447. package/src/services/SupportProfileSync.ts +218 -0
  448. package/src/services/TranscriptionRouting.ts +37 -0
  449. package/src/services/TtsTextSanitizer.ts +66 -0
  450. package/src/services/WifiAdbRequest.ts +53 -0
  451. package/src/services/asg/asgCameraApi.ts +615 -33
  452. package/src/services/asg/cameraRollExportCoordinator.ts +627 -0
  453. package/src/services/asg/cameraRollExportLedger.ts +122 -0
  454. package/src/services/asg/galleryNotices.ts +1 -0
  455. package/src/services/asg/galleryPathMigration.ts +22 -0
  456. package/src/services/asg/gallerySettingsService.ts +3 -0
  457. package/src/services/asg/gallerySyncService.ts +184 -73
  458. package/src/services/asg/galleryTransferLedger.ts +312 -0
  459. package/src/services/asg/localNetworkTransport.ts +169 -0
  460. package/src/services/asg/localStorageService.ts +179 -24
  461. package/src/services/asg/mediaProcessingQueue.ts +209 -62
  462. package/src/services/audioPlaybackAssets.ts +8 -0
  463. package/src/services/gallerySyncClock.ts +1 -1
  464. package/src/services/glassesClockSync.ts +6 -2
  465. package/src/services/manifestActions.ts +30 -0
  466. package/src/services/otaDisplayState.ts +58 -17
  467. package/src/services/otaInstallPolicy.ts +30 -4
  468. package/src/services/otaLegacyMapping.ts +1 -1
  469. package/src/services/otaManifestPolicy.ts +42 -0
  470. package/src/services/otaManifestUrl.ts +44 -0
  471. package/src/services/slimStreamStatus.ts +16 -5
  472. package/src/stores/apps.ts +12 -0
  473. package/src/stores/bluetoothSettingKeys.ts +2 -0
  474. package/src/stores/gallerySync.ts +4 -0
  475. package/src/stores/glasses.ts +3 -0
  476. package/src/stores/settings.ts +179 -18
  477. package/src/types/applet.ts +2 -0
  478. package/src/types/asg.ts +7 -0
  479. package/src/types/enums.ts +3 -28
  480. package/src/types/hardware.ts +20 -13
  481. package/src/types/index.ts +2 -6
  482. package/src/utils/configuredDevHost.ts +17 -0
  483. package/src/utils/devMiniappLaunch.ts +151 -23
  484. package/src/utils/diagnosticContext.ts +17 -17
  485. package/src/utils/hardware/hardware.ts +7 -9
  486. package/src/utils/miniappDiagnostics.ts +226 -0
  487. package/src/utils/permissions/MediaLibraryPermissions.ts +35 -4
  488. package/src/utils/timers/timers.ts +57 -21
  489. package/build/devtools.d.ts +0 -11
  490. package/build/devtools.d.ts.map +0 -1
  491. package/build/devtools.js +0 -13
  492. package/build/devtools.js.map +0 -1
  493. package/build/internal.d.ts +0 -66
  494. package/build/internal.d.ts.map +0 -1
  495. package/build/internal.js +0 -89
  496. package/build/internal.js.map +0 -1
  497. package/build/services/asgOtaVersionUrl.d.ts +0 -2
  498. package/build/services/asgOtaVersionUrl.d.ts.map +0 -1
  499. package/build/services/asgOtaVersionUrl.js +0 -36
  500. package/build/services/asgOtaVersionUrl.js.map +0 -1
  501. package/src/devtools.ts +0 -13
  502. package/src/internal.ts +0 -158
  503. package/src/services/asgOtaVersionUrl.ts +0 -41
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cameraRollExportCoordinator.js","sourceRoot":"","sources":["../../../src/services/asg/cameraRollExportCoordinator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,6BAA6B,CAAA;AAEnD,OAAO,EAAC,uBAAuB,EAAC,MAAM,iDAAiD,CAAA;AACvF,OAAO,EAAC,OAAO,EAAC,MAAM,oBAAoB,CAAA;AAC1C,OAAO,EACL,iBAAiB,EACjB,sBAAsB,EACtB,oBAAoB,GAGrB,MAAM,0BAA0B,CAAA;AACjC,OAAO,EAAC,sBAAsB,EAAC,MAAM,0BAA0B,CAAA;AAC/D,OAAO,EAAC,qBAAqB,EAA2B,MAAM,yBAAyB,CAAA;AACvF,OAAO,EAAC,mBAAmB,EAAsB,MAAM,uBAAuB,CAAA;AAE9E,MAAM,GAAG,GAAG,oBAAoB,CAAA;AAChC,MAAM,oBAAoB,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,CAAA;AAC9C,MAAM,kBAAkB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAA;AAiBzC,MAAM,2BAA2B;IACvB,WAAW,GAAG,KAAK,CAAA;IACnB,YAAY,GAAyB,IAAI,CAAA;IACzC,mBAAmB,GAAG,CAAC,CAAA;IACvB,OAAO,GAAG,IAAI,CAAA;IACd,OAAO,GAAG,KAAK,CAAA;IACf,cAAc,GAAG,KAAK,CAAA;IACtB,UAAU,GAAkB,IAAI,CAAA;IAChC,aAAa,GAAkB,IAAI,CAAA;IACnC,eAAe,GAAG,KAAK,CAAA;IACvB,kBAAkB,GAAG,IAAI,GAAG,EAAU,CAAA;IACtC,SAAS,GAAG,IAAI,GAAG,EAAmB,CAAA;IACtC,aAAa,GAAG,IAAI,GAAG,EAG5B,CAAA;IAEH,KAAK,CAAC,UAAU;QACd,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;gBACvB,MAAM,UAAU,GAAG,IAAI,CAAC,mBAAmB,CAAA;gBAC3C,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAA;YACzD,CAAC;YACD,MAAM,cAAc,GAAG,IAAI,CAAC,YAAY,CAAA;YACxC,IAAI,CAAC;gBACH,MAAM,cAAc,CAAA;YACtB,CAAC;oBAAS,CAAC;gBACT,IAAI,IAAI,CAAC,YAAY,KAAK,cAAc;oBAAE,IAAI,CAAC,YAAY,GAAG,IAAI,CAAA;YACpE,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,IAAI,CAAC,mBAAmB,IAAI,CAAC,CAAA;QAC7B,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI;YAAE,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QAClE,IAAI,CAAC,UAAU,GAAG,IAAI,CAAA;QACtB,IAAI,CAAC,WAAW,GAAG,KAAK,CAAA;QACxB,IAAI,CAAC,cAAc,GAAG,KAAK,CAAA;QAC3B,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAA;QACjE,KAAK,MAAM,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;YAAE,IAAI,CAAC,mBAAmB,CAAC,EAAE,EAAE,KAAK,CAAC,CAAA;QACpF,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,IAAI,CAAC,aAAa,GAAG,IAAI,CAAA;IAC9C,CAAC;IAEO,KAAK,CAAC,kBAAkB,CAAC,UAAkB;QACjD,sBAAsB,CAAC,oBAAoB,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAA;QACvE,mFAAmF;QACnF,wFAAwF;QACxF,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAA;QACvE,CAAC;QACD,IAAI,UAAU,KAAK,IAAI,CAAC,mBAAmB;YAAE,OAAM;QACnD,MAAM,OAAO,GAAG,MAAM,sBAAsB,CAAC,uBAAuB,EAAE,CAAA;QACtE,IAAI,UAAU,KAAK,IAAI,CAAC,mBAAmB;YAAE,OAAM;QACnD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;QACtB,MAAM,IAAI,CAAC,mBAAmB,EAAE,CAAA;QAChC,IAAI,UAAU,KAAK,IAAI,CAAC,mBAAmB;YAAE,OAAM;QACnD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAA;QACvB,IAAI,CAAC,WAAW,EAAE,CAAA;QAClB,IAAI,IAAI,CAAC,OAAO;YAAE,KAAK,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;IAC/C,CAAC;IAED,kFAAkF;IAC1E,KAAK,CAAC,mBAAmB;QAC/B,MAAM,KAAK,GAAG,MAAM,mBAAmB,CAAC,kBAAkB,EAAE,CAAA;QAC5D,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAA;QACjC,MAAM,yBAAyB,GAAG,IAAI,GAAG,EAAkB,CAAA;QAC3D,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YACxC,MAAM,EAAE,GAAG,iBAAiB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;YACjE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;YACf,yBAAyB,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;YAC5C,MAAM,OAAO,GAAG,sBAAsB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;YAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU;gBAC9B,CAAC,CAAC,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC;gBAC5C,CAAC,CAAC,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACxC,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,IAAI,QAAQ,EAAE,YAAY,IAAI,OAAO,EAAE,OAAO,CAAA;YAC/E,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;YACtB,sBAAsB,CAAC,GAAG,CAAC;gBACzB,GAAG,CAAC,OAAO,IAAI;oBACb,EAAE;oBACF,SAAS,EAAE,IAAI,CAAC,IAAI;oBACpB,UAAU,EAAE,oBAAoB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC;oBACrE,QAAQ,EAAE,IAAI,CAAC,QAAQ;oBACvB,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;oBACvB,OAAO,EAAE,IAAI,CAAC,QAAQ;oBACtB,SAAS,EAAE,IAAI,CAAC,UAAU,IAAI,QAAQ,EAAE,SAAS;oBACjD,QAAQ,EAAE,qBAA8B;oBACxC,QAAQ,EAAE,CAAC;oBACX,SAAS,EAAE,GAAG;oBACd,SAAS,EAAE,GAAG;oBACd,KAAK,EAAE,gBAAyB;iBACjC,CAAC;gBACF,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,YAAY,EAAE,IAAI;gBAClB,OAAO;gBACP,iCAAiC,EAC/B,OAAO,EAAE,iCAAiC,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,OAAO,IAAI,CAAC,QAAQ,CAAC;gBACnF,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,KAAK,CAAC;aACrE,CAAC,CAAA;QACJ,CAAC;QAED,4FAA4F;QAC5F,4FAA4F;QAC5F,6FAA6F;QAC7F,oFAAoF;QACpF,KAAK,MAAM,KAAK,IAAI,sBAAsB,CAAC,IAAI,EAAE,EAAE,CAAC;YAClD,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;gBAAE,SAAQ;YACnC,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;gBAClB,sBAAsB,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,EAAC,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,KAAK,EAAC,CAAC,CAAA;gBACjF,SAAQ;YACV,CAAC;YACD,wFAAwF;YACxF,0FAA0F;YAC1F,IAAI,yBAAyB,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;gBACnD,sBAAsB,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;gBACvC,SAAQ;YACV,CAAC;YACD,sBAAsB,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE;gBACtC,KAAK,EAAE,eAAe;gBACtB,YAAY,EAAE,KAAK;gBACnB,SAAS,EAAE,wBAAwB;gBACnC,WAAW,EAAE,SAAS;aACvB,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAEO,iBAAiB,CAAC,OAAwC;QAChE,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO,eAAe,CAAA;QACzC,wFAAwF;QACxF,qFAAqF;QACrF,IAAI,OAAO,KAAK,kBAAkB;YAAE,OAAO,OAAO,CAAA;QAClD,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED,KAAK,CAAC,aAAa,CACjB,IAAoB,EACpB,cAAuB,EACvB,WAAqC,qBAAqB,EAC1D,SAAkB;QAElB,MAAM,IAAI,CAAC,UAAU,EAAE,CAAA;QACvB,MAAM,EAAE,GAAG,iBAAiB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;QACjE,MAAM,OAAO,GAAG,sBAAsB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QACtB,MAAM,KAAK,GAAG,sBAAsB,CAAC,GAAG,CAAC;YACvC,GAAG,CAAC,OAAO,IAAI;gBACb,EAAE;gBACF,SAAS,EAAE,IAAI,CAAC,IAAI;gBACpB,UAAU,EAAE,oBAAoB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC;gBACrE,QAAQ,EAAE,CAAC;gBACX,SAAS,EAAE,GAAG;gBACd,SAAS,EAAE,GAAG;aACf,CAAC;YACF,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,OAAO,EAAE,IAAI,CAAC,QAAQ;YACtB,SAAS,EAAE,SAAS,IAAI,IAAI,CAAC,UAAU,IAAI,OAAO,EAAE,SAAS;YAC7D,YAAY,EAAE,IAAI;YAClB,iCAAiC,EAAE,OAAO,EAAE,iCAAiC,IAAI,KAAK;YACtF,QAAQ;YACR,OAAO,EAAE,IAAI,CAAC,YAAY,IAAI,OAAO,EAAE,OAAO;YAC9C,KAAK,EAAE,IAAI,CAAC,YAAY,IAAI,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,eAAe;YACvG,SAAS,EAAE,SAAS;YACpB,WAAW,EAAE,SAAS;SACvB,CAAC,CAAA;QACF,IAAI,CAAC,WAAW,EAAE,CAAA;QAClB,OAAO,KAAK,CAAA;IACd,CAAC;IAED,KAAK,CAAC,iBAAiB;QACrB,MAAM,IAAI,CAAC,UAAU,EAAE,CAAA;QACvB,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;IAED,qGAAqG;IACrG,KAAK,CAAC,eAAe,CAAC,IAAoB,EAAE,SAAkB;QAC5D,MAAM,IAAI,CAAC,UAAU,EAAE,CAAA;QACvB,qFAAqF;QACrF,sFAAsF;QACtF,uDAAuD;QACvD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,gBAAgB,EAAE,SAAS,CAAC,CAAA;QACvF,IAAI,KAAK,CAAC,OAAO;YAAE,OAAO,KAAK,CAAC,OAAO,CAAA;QACvC,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO,SAAS,CAAA;QACnC,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,OAAO,CAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBAChE,MAAM,OAAO,GAAG,sBAAsB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;gBACpD,IAAI,OAAO,EAAE,OAAO,EAAE,CAAC;oBACrB,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;oBACxB,OAAM;gBACR,CAAC;gBACD,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,MAAM,CAAC,IAAI,KAAK,CAAC,qEAAqE,CAAC,CAAC,CAAA;oBACxF,OAAM;gBACR,CAAC;gBACD,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,CAAA;gBACtD,OAAO,CAAC,IAAI,CAAC,EAAC,OAAO,EAAE,MAAM,EAAC,CAAC,CAAA;gBAC/B,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,OAAO,CAAC,CAAA;gBACzC,mFAAmF;gBACnF,qEAAqE;gBACrE,MAAM,UAAU,GAAG,sBAAsB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;gBACvD,IAAI,UAAU,EAAE,OAAO,EAAE,CAAC;oBACxB,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,EAAE,EAAE,UAAU,CAAC,OAAO,CAAC,CAAA;oBACvD,OAAM;gBACR,CAAC;gBACD,IAAI,CAAC,UAAU,EAAE,CAAC;oBAChB,IAAI,CAAC,mBAAmB,CACtB,KAAK,CAAC,EAAE,EACR,IAAI,KAAK,CAAC,qEAAqE,CAAC,CACjF,CAAA;oBACD,OAAM;gBACR,CAAC;gBACD,KAAK,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAA;YACpC,CAAC,CAAC,CAAA;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,yFAAyF;YACzF,2FAA2F;YAC3F,IAAI,CAAC,IAAI,CAAC,OAAO;gBAAE,OAAO,SAAS,CAAA;YACnC,MAAM,KAAK,CAAA;QACb,CAAC;IACH,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,OAAgB;QAC/B,MAAM,IAAI,CAAC,UAAU,EAAE,CAAA;QACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAA;QAC7B,MAAM,sBAAsB,CAAC,uBAAuB,CAAC,OAAO,CAAC,CAAA;QAC7D,IAAI,CAAC;YACH,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;YACtB,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,EAAE,CAAC;gBACxC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;gBACrC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAA;YACxB,CAAC;YACD,KAAK,MAAM,KAAK,IAAI,sBAAsB,CAAC,IAAI,EAAE,EAAE,CAAC;gBAClD,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,KAAK,UAAU,IAAI,KAAK,CAAC,KAAK,KAAK,eAAe;oBAAE,SAAQ;gBAC5F,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC,EAAE,KAAK,IAAI,CAAC,aAAa,EAAE,CAAC;oBAChD,sBAAsB,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,EAAC,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,SAAS,EAAC,CAAC,CAAA;oBACzF,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC,CAAA;gBAC5F,CAAC;qBAAM,IAAI,OAAO,EAAE,CAAC;oBACnB,sBAAsB,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,EAAC,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAC,CAAC,CAAA;gBAC1G,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAA;YACvB,MAAM,sBAAsB,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAA;YAC9D,MAAM,KAAK,CAAA;QACb,CAAC;QACD,IAAI,CAAC,WAAW,EAAE,CAAA;QAClB,IAAI,OAAO;YAAE,KAAK,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAA;IAClD,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,MAAc;QACzB,MAAM,UAAU,GAAG,IAAI,CAAC,mBAAmB,CAAA;QAC3C,MAAM,IAAI,CAAC,UAAU,EAAE,CAAA;QACvB,IAAI,UAAU,KAAK,IAAI,CAAC,mBAAmB;YAAE,OAAM;QACnD,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,sBAAsB,MAAM,EAAE,CAAC,CAAA;QACjD,IAAI,sBAAsB,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,KAAK,oBAAoB,CAAC,EAAE,CAAC;YACxF,MAAM,aAAa,GAAG,MAAM,uBAAuB,CAAC,eAAe,EAAE,CAAA;YACrE,MAAM,gBAAgB,GAAG,aAAa,IAAI,CAAC,MAAM,uBAAuB,CAAC,gBAAgB,EAAE,CAAC,CAAA;YAC5F,IAAI,UAAU,KAAK,IAAI,CAAC,mBAAmB;gBAAE,OAAM;YACnD,IAAI,aAAa,EAAE,CAAC;gBAClB,KAAK,MAAM,KAAK,IAAI,sBAAsB,CAAC,IAAI,EAAE,EAAE,CAAC;oBAClD,IAAI,KAAK,CAAC,KAAK,KAAK,oBAAoB,IAAI,CAAC,CAAC,KAAK,CAAC,iCAAiC,IAAI,gBAAgB,CAAC,EAAE,CAAC;wBAC3G,sBAAsB,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,EAAC,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAC,CAAC,CAAA;oBAClF,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QACD,IAAI,UAAU,KAAK,IAAI,CAAC,mBAAmB;YAAE,OAAM;QACnD,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,EAAE,CAAC;YAC5B,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;YACrC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAA;QACxB,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAA;YAC1B,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC;gBACpB,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAA;YACvE,CAAC;YACD,IAAI,UAAU,KAAK,IAAI,CAAC,mBAAmB;gBAAE,OAAM;YACnD,mFAAmF;YACnF,sFAAsF;YACtF,IAAI,IAAI,CAAC,SAAS,EAAE;gBAAE,MAAM,IAAI,CAAC,MAAM,CAAC,uCAAuC,CAAC,CAAA;YAChF,OAAM;QACR,CAAC;QACD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAA;QACnB,IAAI,CAAC,WAAW,EAAE,CAAA;QAClB,IAAI,CAAC;YACH,GAAG,CAAC;gBACF,IAAI,CAAC,cAAc,GAAG,KAAK,CAAA;gBAC3B,IAAI,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE,CAAA;gBAC5B,OAAO,KAAK,IAAI,UAAU,KAAK,IAAI,CAAC,mBAAmB,EAAE,CAAC;oBACxD,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,UAAU,CAAC,CAAA;oBAC1C,IAAI,UAAU,KAAK,IAAI,CAAC,mBAAmB;wBAAE,MAAK;oBAClD,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE,CAAA;gBAC1B,CAAC;YACH,CAAC,QAAQ,IAAI,CAAC,cAAc,IAAI,UAAU,KAAK,IAAI,CAAC,mBAAmB,EAAC;QAC1E,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,cAAc,GAAG,KAAK,CAAA;YAC3B,IAAI,CAAC,OAAO,GAAG,KAAK,CAAA;YACpB,IAAI,UAAU,KAAK,IAAI,CAAC,mBAAmB,EAAE,CAAC;gBAC5C,IAAI,CAAC,WAAW,EAAE,CAAA;gBAClB,IAAI,CAAC,aAAa,EAAE,CAAA;YACtB,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,MAAM,UAAU,GAAG,IAAI,CAAC,mBAAmB,CAAA;QAC3C,MAAM,IAAI,CAAC,UAAU,EAAE,CAAA;QACvB,2FAA2F;QAC3F,qFAAqF;QACrF,gFAAgF;QAChF,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAA;QACvE,CAAC;QACD,IAAI,UAAU,KAAK,IAAI,CAAC,mBAAmB;YAAE,OAAM;QACnD,MAAM,IAAI,CAAC,mBAAmB,EAAE,CAAA;QAChC,IAAI,UAAU,KAAK,IAAI,CAAC,mBAAmB;YAAE,OAAM;QACnD,KAAK,MAAM,KAAK,IAAI,sBAAsB,CAAC,IAAI,EAAE,EAAE,CAAC;YAClD,IACE,KAAK,CAAC,KAAK,KAAK,kBAAkB;gBAClC,KAAK,CAAC,KAAK,KAAK,oBAAoB;gBACpC,CAAC,KAAK,CAAC,KAAK,KAAK,eAAe,IAAI,KAAK,CAAC,YAAY,KAAK,KAAK,CAAC,EACjE,CAAC;gBACD,sBAAsB,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,EAAC,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAC,CAAC,CAAA;YAC1G,CAAC;QACH,CAAC;QACD,MAAM,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,CAAA;IACnC,CAAC;IAED,SAAS,CAAC,QAAyB;QACjC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QAC5B,iFAAiF;QACjF,qFAAqF;QACrF,IAAI,IAAI,CAAC,WAAW;YAAE,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAA;QACjD,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;IAC9C,CAAC;IAED,UAAU;QACR,MAAM,OAAO,GAAG,sBAAsB;aACnC,IAAI,EAAE;YACP,sFAAsF;YACtF,sFAAsF;YACtF,wCAAwC;aACvC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,YAAY,KAAK,KAAK,IAAI,KAAK,CAAC,KAAK,KAAK,eAAe,CAAC,CAAA;QACrF,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC;YAC5B,gBAAgB;YAChB,QAAQ;YACR,aAAa;YACb,WAAW;YACX,kBAAkB;YAClB,oBAAoB;SACrB,CAAC,CAAA;QACF,OAAO;YACL,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,KAAK,EAAE,OAAO,CAAC,MAAM;YACrB,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,KAAK,UAAU,CAAC,CAAC,MAAM;YACtE,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM;YACzE,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,KAAK,kBAAkB,IAAI,KAAK,CAAC,KAAK,KAAK,kBAAkB,CAAC;iBACxG,MAAM;YACT,iBAAiB,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,KAAK,oBAAoB,CAAC,CAAC,MAAM;YACzF,kBAAkB,EAAE,OAAO,CAAC,MAAM,CAChC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,KAAK,oBAAoB,IAAI,KAAK,CAAC,iCAAiC,CAC3F,CAAC,MAAM;YACR,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,KAAK,eAAe,CAAC,CAAC,MAAM;YAC1E,YAAY,EAAE,OAAO;iBAClB,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;iBACjD,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YAC9C,SAAS,EAAE,IAAI,CAAC,OAAO;SACxB,CAAA;IACH,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,UAAoB;QACzC,MAAM,IAAI,CAAC,UAAU,EAAE,CAAA;QACvB,MAAM,WAAW,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,CAAA;QAC5C,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,CAAC,CAAA;QACtC,MAAM,KAAK,GAAG,MAAM,mBAAmB,CAAC,kBAAkB,EAAE,CAAA;QAC5D,OAAO,WAAW,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;YACjC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAA;YACxB,IAAI,CAAC,IAAI;gBAAE,OAAO,IAAI,CAAA;YACtB,MAAM,KAAK,GAAG,sBAAsB,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAA;YAChG,OAAO,KAAK,EAAE,KAAK,KAAK,UAAU,CAAA;QACpC,CAAC,CAAC,CAAC,MAAM,CAAA;IACX,CAAC;IAED,kFAAkF;IAClF,KAAK,CAAC,gBAAgB,CAAC,SAAiB;QACtC,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QACtC,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,aAAa,IAAI,sBAAsB,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,SAAS,KAAK,SAAS,EAAE,CAAC;gBACrG,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAA;YACvE,CAAC;YACD,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAA;YACzE,IAAI,OAAO,EAAE,CAAC;gBACZ,uFAAuF;gBACvF,sFAAsF;gBACtF,kFAAkF;gBAClF,KAAK,MAAM,KAAK,IAAI,sBAAsB,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,SAAS,KAAK,SAAS,CAAC,EAAE,CAAC;oBAC3G,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC,CAAA;gBACpG,CAAC;gBACD,sBAAsB,CAAC,cAAc,CAAC,SAAS,CAAC,CAAA;YAClD,CAAC;YACD,OAAO,OAAO,CAAA;QAChB,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;YACzC,IAAI,CAAC,WAAW,EAAE,CAAA;YAClB,IAAI,IAAI,CAAC,OAAO;gBAAE,KAAK,IAAI,CAAC,MAAM,CAAC,yBAAyB,CAAC,CAAA;QAC/D,CAAC;IACH,CAAC;IAED,2GAA2G;IAC3G,KAAK,CAAC,eAAe;QACnB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAA;QAC3B,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC;gBAC1B,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAA;YACvE,CAAC;YACD,MAAM,mBAAmB,CAAC,aAAa,EAAE,CAAA;YACzC,uFAAuF;YACvF,uFAAuF;YACvF,kDAAkD;YAClD,KAAK,MAAM,KAAK,IAAI,sBAAsB,CAAC,IAAI,EAAE,EAAE,CAAC;gBAClD,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC,CAAA;YACpG,CAAC;YACD,sBAAsB,CAAC,KAAK,EAAE,CAAA;QAChC,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,eAAe,GAAG,KAAK,CAAA;YAC5B,IAAI,CAAC,WAAW,EAAE,CAAA;YAClB,IAAI,IAAI,CAAC,OAAO;gBAAE,KAAK,IAAI,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAA;QAC5D,CAAC;IACH,CAAC;IAEO,SAAS;QACf,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QACtB,OAAO,sBAAsB;aAC1B,IAAI,EAAE;aACN,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;YAChB,IAAI,KAAK,CAAC,YAAY,KAAK,KAAK;gBAAE,OAAO,KAAK,CAAA;YAC9C,IAAI,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC;gBAAE,OAAO,KAAK,CAAA;YACtF,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,KAAK,UAAU,IAAI,KAAK,CAAC,KAAK,KAAK,eAAe;gBAAE,OAAO,KAAK,CAAA;YAChG,IAAI,CAAC,IAAI,CAAC,OAAO;gBAAE,OAAO,KAAK,CAAA;YAC/B,IAAI,KAAK,CAAC,KAAK,KAAK,oBAAoB,IAAI,KAAK,CAAC,KAAK,KAAK,kBAAkB;gBAAE,OAAO,KAAK,CAAA;YAC5F,IAAI,KAAK,CAAC,KAAK,KAAK,kBAAkB,IAAI,CAAC,KAAK,CAAC,WAAW,IAAI,CAAC,CAAC,GAAG,GAAG;gBAAE,OAAO,KAAK,CAAA;YACtF,OAAO,KAAK,CAAC,KAAK,KAAK,eAAe,CAAA;QACxC,CAAC,CAAC;aACD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACb,IAAI,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,QAAQ;gBAAE,OAAO,CAAC,CAAC,QAAQ,KAAK,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;YAC9E,OAAO,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAA;QAChC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACT,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,QAA+B,EAAE,UAAkB;QAC5E,IAAI,KAAK,GAAG,QAAQ,CAAA;QACpB,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,EAAE,CAAA;QAC7B,IAAI,CAAC;YACH,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;gBAClB,sBAAsB,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,EAAC,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,SAAS,EAAC,CAAC,CAAA;gBACzF,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC,CAAA;gBAC1F,OAAM;YACR,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;YAChD,IAAI,UAAU,KAAK,IAAI,CAAC,mBAAmB;gBAAE,OAAM;YACnD,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,sBAAsB,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,EAAC,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,wBAAwB,EAAC,CAAC,CAAA;gBACtG,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAA;YAC3C,CAAC;YACD,MAAM,UAAU,GAAG,MAAM,uBAAuB,CAAC,eAAe,EAAE,CAAA;YAClE,IAAI,UAAU,KAAK,IAAI,CAAC,mBAAmB;gBAAE,OAAM;YACnD,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,sBAAsB,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE;oBACtC,KAAK,EAAE,oBAAoB;oBAC3B,SAAS,EAAE,oCAAoC;iBAChD,CAAC,CAAA;gBACF,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAA;YACvD,CAAC;YACD,MAAM,gBAAgB,GACpB,KAAK,CAAC,iCAAiC,IAAI,CAAC,MAAM,uBAAuB,CAAC,gBAAgB,EAAE,CAAC,CAAA;YAC/F,IAAI,UAAU,KAAK,IAAI,CAAC,mBAAmB;gBAAE,OAAM;YACnD,IAAI,gBAAgB,EAAE,CAAC;gBACrB,sBAAsB,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE;oBACtC,KAAK,EAAE,oBAAoB;oBAC3B,SAAS,EAAE,8EAA8E;iBAC1F,CAAC,CAAA;gBACF,MAAM,IAAI,KAAK,CAAC,8EAA8E,CAAC,CAAA;YACjG,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAA;YACrC,IAAI,UAAU,KAAK,IAAI,CAAC,mBAAmB;gBAAE,OAAM;YACnD,IAAI,MAAM,CAAC,SAAS,GAAG,KAAK,CAAC,IAAI,GAAG,oBAAoB,EAAE,CAAC;gBACzD,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAA;YACnE,CAAC;YACD,sFAAsF;YACtF,qFAAqF;YACrF,6DAA6D;YAC7D,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;gBAClB,sBAAsB,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,EAAC,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,SAAS,EAAC,CAAC,CAAA;gBACzF,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC,CAAA;gBAC1F,OAAM;YACR,CAAC;YAED,KAAK,GAAG,sBAAsB,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,EAAC,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,SAAS,EAAC,CAAC,CAAA;YAC7F,KAAK,GAAG,sBAAsB,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,EAAC,KAAK,EAAE,WAAW,EAAC,CAAC,CAAA;YACrE,MAAM,MAAM,GAAG,MAAM,uBAAuB,CAAC,wBAAwB,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAA;YACrG,IAAI,CAAC,MAAM,CAAC,OAAO;gBAAE,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,2BAA2B,CAAC,CAAA;YACjF,MAAM,OAAO,GAAwB;gBACnC,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,GAAG,EAAE,MAAM,CAAC,GAAG;gBACf,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE;aACvB,CAAA;YACD,KAAK,GAAG,sBAAsB,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE;gBAC9C,KAAK,EAAE,UAAU;gBACjB,OAAO;gBACP,iCAAiC,EAAE,KAAK;gBACxC,QAAQ,EAAE,KAAK,CAAC,QAAQ,GAAG,CAAC;gBAC5B,WAAW,EAAE,SAAS;gBACtB,SAAS,EAAE,SAAS;aACrB,CAAC,CAAA;YACF,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;YAC1C,CAAC;YAAC,OAAO,WAAW,EAAE,CAAC;gBACrB,8EAA8E;gBAC9E,iFAAiF;gBACjF,OAAO,CAAC,IAAI,CAAC,GAAG,GAAG,qCAAqC,KAAK,CAAC,SAAS,GAAG,EAAE,WAAW,CAAC,CAAA;YAC1F,CAAC;YACD,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,EAAE,EAAE,OAAO,CAAC,CAAA;QAC9C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;YACtE,MAAM,OAAO,GAAG,sBAAsB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;YACpD,IAAI,OAAO,IAAI,OAAO,CAAC,KAAK,KAAK,oBAAoB,IAAI,OAAO,CAAC,KAAK,KAAK,eAAe,EAAE,CAAC;gBAC3F,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAA;gBACrC,sBAAsB,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE;oBACtC,KAAK,EAAE,kBAAkB;oBACzB,QAAQ;oBACR,SAAS,EAAE,OAAO;oBAClB,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,kBAAkB,CAAC;iBAC3F,CAAC,CAAA;YACJ,CAAC;YACD,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAA;YACvF,OAAO,CAAC,IAAI,CAAC,GAAG,GAAG,+BAA+B,KAAK,CAAC,SAAS,KAAK,OAAO,EAAE,CAAC,CAAA;QAClF,CAAC;gBAAS,CAAC;YACT,IAAI,IAAI,CAAC,aAAa,KAAK,KAAK,CAAC,EAAE;gBAAE,IAAI,CAAC,aAAa,GAAG,IAAI,CAAA;YAC9D,IAAI,UAAU,KAAK,IAAI,CAAC,mBAAmB;gBAAE,IAAI,CAAC,WAAW,EAAE,CAAA;QACjE,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,aAAa,CAAC,KAA4B,EAAE,OAA4B;QACpF,MAAM,mBAAmB,CAAC,gCAAgC,CAAC,KAAK,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;QACpF,MAAM,QAAQ,GAAG,KAAK,CAAC,SAAS;YAC9B,CAAC,CAAC,qBAAqB,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC;YAC5C,CAAC,CAAC,qBAAqB,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;QAC9C,IAAI,QAAQ;YAAE,qBAAqB,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,EAAC,YAAY,EAAE,OAAO,EAAC,CAAC,CAAA;IACzF,CAAC;IAEO,aAAa;QACnB,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI;YAAE,OAAM;QACpD,MAAM,IAAI,GAAG,sBAAsB;aAChC,IAAI,EAAE;aACN,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,KAAK,kBAAkB,IAAI,KAAK,CAAC,WAAW,CAAC;aAC1E,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QACjE,IAAI,CAAC,IAAI,EAAE,WAAW;YAAE,OAAM;QAC9B,MAAM,UAAU,GAAG,IAAI,CAAC,mBAAmB,CAAA;QAC3C,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,CAClC,GAAG,EAAE;YACH,IAAI,CAAC,UAAU,GAAG,IAAI,CAAA;YACtB,IAAI,UAAU,KAAK,IAAI,CAAC,mBAAmB;gBAAE,OAAM;YACnD,KAAK,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAA;QACjC,CAAC,EACD,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAC3C,CAAA;IACH,CAAC;IAEO,oBAAoB,CAAC,EAAU,EAAE,OAA4B;QACnE,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE;YAAE,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;QAC9E,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;IAC/B,CAAC;IAEO,mBAAmB,CAAC,EAAU,EAAE,KAAY;QAClD,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE;YAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QAC3E,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;IAC/B,CAAC;IAEO,WAAW;QACjB,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAA;QACjC,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACtC,IAAI,CAAC;gBACH,QAAQ,CAAC,OAAO,CAAC,CAAA;YACnB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC,GAAG,GAAG,0BAA0B,EAAE,KAAK,CAAC,CAAA;YACvD,CAAC;QACH,CAAC;IACH,CAAC;CACF;AAED,MAAM,CAAC,MAAM,2BAA2B,GAAG,IAAI,2BAA2B,EAAE,CAAA","sourcesContent":["import * as RNFS from \"@dr.pogodin/react-native-fs\"\n\nimport {MediaLibraryPermissions} from \"../../utils/permissions/MediaLibraryPermissions\"\nimport {BgTimer} from \"../../utils/timers\"\nimport {\n cameraRollEntryId,\n cameraRollExportLedger,\n cameraRollGeneration,\n type CameraRollExportEntry,\n type CameraRollExportPriority,\n} from \"./cameraRollExportLedger\"\nimport {gallerySettingsService} from \"./gallerySettingsService\"\nimport {galleryTransferLedger, type GalleryAssetReceipt} from \"./galleryTransferLedger\"\nimport {localStorageService, type DownloadedFile} from \"./localStorageService\"\n\nconst TAG = \"[CameraRollExport]\"\nconst MIN_FREE_SPACE_BYTES = 100 * 1024 * 1024\nconst MAX_RETRY_DELAY_MS = 30 * 60 * 1000\n\nexport interface CameraRollExportSummary {\n enabled: boolean\n total: number\n exported: number\n pending: number\n failed: number\n blockedPermission: number\n fullAccessRequired: number\n missing: number\n bytesPending: number\n isRunning: boolean\n}\n\ntype SummaryListener = (summary: CameraRollExportSummary) => void\n\nclass CameraRollExportCoordinator {\n private initialized = false\n private initializing: Promise<void> | null = null\n private lifecycleGeneration = 0\n private enabled = true\n private running = false\n private rerunRequested = false\n private retryTimer: number | null = null\n private activeEntryId: string | null = null\n private clearInProgress = false\n private deletingMediaNames = new Set<string>()\n private listeners = new Set<SummaryListener>()\n private sourceWaiters = new Map<\n string,\n Array<{resolve: (receipt: GalleryAssetReceipt) => void; reject: (error: Error) => void}>\n >()\n\n async initialize(): Promise<void> {\n while (!this.initialized) {\n if (!this.initializing) {\n const generation = this.lifecycleGeneration\n this.initializing = this.initializeInternal(generation)\n }\n const initialization = this.initializing\n try {\n await initialization\n } finally {\n if (this.initializing === initialization) this.initializing = null\n }\n }\n }\n\n cleanup(): void {\n this.lifecycleGeneration += 1\n if (this.retryTimer != null) BgTimer.clearTimeout(this.retryTimer)\n this.retryTimer = null\n this.initialized = false\n this.rerunRequested = false\n const error = new Error(\"Camera-roll export coordinator stopped\")\n for (const id of [...this.sourceWaiters.keys()]) this.rejectSourceWaiters(id, error)\n if (!this.running) this.activeEntryId = null\n }\n\n private async initializeInternal(generation: number): Promise<void> {\n cameraRollExportLedger.setDocumentDirectory(RNFS.DocumentDirectoryPath)\n // A native camera-roll insert is atomic and cannot be cancelled. On a quick engine\n // stop/start, let the old drain commit its receipt before the new lifecycle reconciles.\n while (this.running) {\n await new Promise<void>((resolve) => BgTimer.setTimeout(resolve, 25))\n }\n if (generation !== this.lifecycleGeneration) return\n const enabled = await gallerySettingsService.getAutoSaveToCameraRoll()\n if (generation !== this.lifecycleGeneration) return\n this.enabled = enabled\n await this.reconcileLocalIndex()\n if (generation !== this.lifecycleGeneration) return\n this.initialized = true\n this.emitSummary()\n if (this.enabled) void this.resume(\"startup\")\n }\n\n /** Rebuild missing per-generation records after upgrading from legacy clients. */\n private async reconcileLocalIndex(): Promise<void> {\n const files = await localStorageService.getDownloadedFiles()\n const liveIds = new Set<string>()\n const liveGenerationByMediaName = new Map<string, string>()\n for (const file of Object.values(files)) {\n const id = cameraRollEntryId(file.name, file.size, file.modified)\n liveIds.add(id)\n liveGenerationByMediaName.set(file.name, id)\n const current = cameraRollExportLedger.get(id)\n const transfer = file.capture_id\n ? galleryTransferLedger.get(file.capture_id)\n : galleryTransferLedger.get(file.name)\n const receipt = file.assetReceipt || transfer?.assetReceipt || current?.receipt\n const now = Date.now()\n cameraRollExportLedger.put({\n ...(current || {\n id,\n mediaName: file.name,\n generation: cameraRollGeneration(file.name, file.size, file.modified),\n filePath: file.filePath,\n size: file.size,\n modified: file.modified,\n isVideo: file.is_video,\n captureId: file.capture_id || transfer?.captureId,\n priority: \"HISTORICAL_BACKFILL\" as const,\n attempts: 0,\n createdAt: now,\n updatedAt: now,\n state: \"LEGACY_UNKNOWN\" as const,\n }),\n filePath: file.filePath,\n localPresent: true,\n receipt,\n requiresFullLibraryReconciliation:\n current?.requiresFullLibraryReconciliation ?? (!current && !receipt && !transfer),\n state: receipt ? \"EXPORTED\" : this.nextEligibleState(current?.state),\n })\n }\n\n // Explicit app deletion removes receipts through deleteLocalMedia/clearLocalMedia. An index\n // miss here is not proof of deletion: recovery may not have rebuilt the row yet, and a load\n // failure is represented as an empty index. Preserve exported receipts as hidden tombstones;\n // they are the authoritative proof that prevents a duplicate native-library insert.\n for (const entry of cameraRollExportLedger.list()) {\n if (liveIds.has(entry.id)) continue\n if (entry.receipt) {\n cameraRollExportLedger.update(entry.id, {state: \"EXPORTED\", localPresent: false})\n continue\n }\n // A different live generation with the same display name supersedes an unexported stale\n // row. Never let its old path export the replacement's bytes under the wrong fingerprint.\n if (liveGenerationByMediaName.has(entry.mediaName)) {\n cameraRollExportLedger.remove(entry.id)\n continue\n }\n cameraRollExportLedger.update(entry.id, {\n state: \"MISSING_LOCAL\",\n localPresent: false,\n lastError: \"Local media is missing\",\n nextRetryAt: undefined,\n })\n }\n }\n\n private nextEligibleState(current?: CameraRollExportEntry[\"state\"]): CameraRollExportEntry[\"state\"] {\n if (!this.enabled) return \"NOT_REQUESTED\"\n // Reconciliation only calls this for files that are present in the durable local index.\n // A previous filesystem miss was transient if that same generation is visible again.\n if (current === \"FAILED_PERMANENT\") return current\n return \"QUEUED\"\n }\n\n async recordIndexed(\n file: DownloadedFile,\n shouldAutoSave: boolean,\n priority: CameraRollExportPriority = \"HISTORICAL_BACKFILL\",\n captureId?: string,\n ): Promise<CameraRollExportEntry> {\n await this.initialize()\n const id = cameraRollEntryId(file.name, file.size, file.modified)\n const current = cameraRollExportLedger.get(id)\n const now = Date.now()\n const entry = cameraRollExportLedger.put({\n ...(current || {\n id,\n mediaName: file.name,\n generation: cameraRollGeneration(file.name, file.size, file.modified),\n attempts: 0,\n createdAt: now,\n updatedAt: now,\n }),\n filePath: file.filePath,\n size: file.size,\n modified: file.modified,\n isVideo: file.is_video,\n captureId: captureId || file.capture_id || current?.captureId,\n localPresent: true,\n requiresFullLibraryReconciliation: current?.requiresFullLibraryReconciliation ?? false,\n priority,\n receipt: file.assetReceipt || current?.receipt,\n state: file.assetReceipt || current?.receipt ? \"EXPORTED\" : shouldAutoSave ? \"QUEUED\" : \"NOT_REQUESTED\",\n lastError: undefined,\n nextRetryAt: undefined,\n })\n this.emitSummary()\n return entry\n }\n\n async isAutoSaveEnabled(): Promise<boolean> {\n await this.initialize()\n return this.enabled\n }\n\n /** Source deletion waits on this barrier while enabled; disabled exports remain safely app-local. */\n async exportForSource(file: DownloadedFile, captureId?: string): Promise<GalleryAssetReceipt | undefined> {\n await this.initialize()\n // A durable receipt proves this generation is already safe regardless of the current\n // preference. Return it before enforcing disabled state so recovery can still ack the\n // glasses after a previously-started export committed.\n const entry = await this.recordIndexed(file, this.enabled, \"SOURCE_BARRIER\", captureId)\n if (entry.receipt) return entry.receipt\n if (!this.enabled) return undefined\n try {\n return await new Promise<GalleryAssetReceipt>((resolve, reject) => {\n const current = cameraRollExportLedger.get(entry.id)\n if (current?.receipt) {\n resolve(current.receipt)\n return\n }\n if (!current) {\n reject(new Error(\"Camera-roll export was removed before its source barrier registered\"))\n return\n }\n const waiters = this.sourceWaiters.get(entry.id) || []\n waiters.push({resolve, reject})\n this.sourceWaiters.set(entry.id, waiters)\n // Re-read after registration so any future refactor that yields while installing a\n // waiter still cannot miss a receipt committed by the active runner.\n const registered = cameraRollExportLedger.get(entry.id)\n if (registered?.receipt) {\n this.resolveSourceWaiters(entry.id, registered.receipt)\n return\n }\n if (!registered) {\n this.rejectSourceWaiters(\n entry.id,\n new Error(\"Camera-roll export was removed before its source barrier registered\"),\n )\n return\n }\n void this.resume(\"source barrier\")\n })\n } catch (error) {\n // Turning auto-save off makes the durable app-local commit the source-of-truth. A native\n // insert already in progress still finishes and returns its receipt; queued work may stop.\n if (!this.enabled) return undefined\n throw error\n }\n }\n\n async setEnabled(enabled: boolean): Promise<void> {\n await this.initialize()\n const previous = this.enabled\n await gallerySettingsService.setAutoSaveToCameraRoll(enabled)\n try {\n this.enabled = enabled\n if (!enabled && this.retryTimer != null) {\n BgTimer.clearTimeout(this.retryTimer)\n this.retryTimer = null\n }\n for (const entry of cameraRollExportLedger.list()) {\n if (entry.receipt || entry.state === \"EXPORTED\" || entry.state === \"MISSING_LOCAL\") continue\n if (!enabled && entry.id !== this.activeEntryId) {\n cameraRollExportLedger.update(entry.id, {state: \"NOT_REQUESTED\", nextRetryAt: undefined})\n this.rejectSourceWaiters(entry.id, new Error(\"Automatic camera-roll saving was disabled\"))\n } else if (enabled) {\n cameraRollExportLedger.update(entry.id, {state: \"QUEUED\", nextRetryAt: undefined, lastError: undefined})\n }\n }\n } catch (error) {\n this.enabled = previous\n await gallerySettingsService.setAutoSaveToCameraRoll(previous)\n throw error\n }\n this.emitSummary()\n if (enabled) void this.resume(\"setting enabled\")\n }\n\n async resume(reason: string): Promise<void> {\n const generation = this.lifecycleGeneration\n await this.initialize()\n if (generation !== this.lifecycleGeneration) return\n console.log(`${TAG} Resume requested: ${reason}`)\n if (cameraRollExportLedger.list().some((entry) => entry.state === \"BLOCKED_PERMISSION\")) {\n const hasPermission = await MediaLibraryPermissions.checkPermission()\n const hasLimitedAccess = hasPermission && (await MediaLibraryPermissions.hasLimitedAccess())\n if (generation !== this.lifecycleGeneration) return\n if (hasPermission) {\n for (const entry of cameraRollExportLedger.list()) {\n if (entry.state === \"BLOCKED_PERMISSION\" && !(entry.requiresFullLibraryReconciliation && hasLimitedAccess)) {\n cameraRollExportLedger.update(entry.id, {state: \"QUEUED\", lastError: undefined})\n }\n }\n }\n }\n if (generation !== this.lifecycleGeneration) return\n if (this.retryTimer != null) {\n BgTimer.clearTimeout(this.retryTimer)\n this.retryTimer = null\n }\n if (this.running) {\n this.rerunRequested = true\n while (this.running) {\n await new Promise<void>((resolve) => BgTimer.setTimeout(resolve, 25))\n }\n if (generation !== this.lifecycleGeneration) return\n // The active drain normally consumes rerunRequested before releasing running. Keep\n // this final durable-work check so a late handoff can never strand an eligible entry.\n if (this.nextEntry()) await this.resume(\"work remained after concurrent resume\")\n return\n }\n this.running = true\n this.emitSummary()\n try {\n do {\n this.rerunRequested = false\n let entry = this.nextEntry()\n while (entry && generation === this.lifecycleGeneration) {\n await this.processEntry(entry, generation)\n if (generation !== this.lifecycleGeneration) break\n entry = this.nextEntry()\n }\n } while (this.rerunRequested && generation === this.lifecycleGeneration)\n } finally {\n this.rerunRequested = false\n this.running = false\n if (generation === this.lifecycleGeneration) {\n this.emitSummary()\n this.scheduleRetry()\n }\n }\n }\n\n async retryNow(): Promise<void> {\n const generation = this.lifecycleGeneration\n await this.initialize()\n // A recovered transfer may have rebuilt a missing local-index row since the last lifecycle\n // reconciliation. Refresh before retrying so the same camera-roll generation becomes\n // eligible again; never rewrite entry state underneath an active native insert.\n while (this.running) {\n await new Promise<void>((resolve) => BgTimer.setTimeout(resolve, 25))\n }\n if (generation !== this.lifecycleGeneration) return\n await this.reconcileLocalIndex()\n if (generation !== this.lifecycleGeneration) return\n for (const entry of cameraRollExportLedger.list()) {\n if (\n entry.state === \"FAILED_RETRYABLE\" ||\n entry.state === \"BLOCKED_PERMISSION\" ||\n (entry.state === \"MISSING_LOCAL\" && entry.localPresent !== false)\n ) {\n cameraRollExportLedger.update(entry.id, {state: \"QUEUED\", nextRetryAt: undefined, lastError: undefined})\n }\n }\n await this.resume(\"manual retry\")\n }\n\n subscribe(listener: SummaryListener): () => void {\n this.listeners.add(listener)\n // `enabled` is loaded from durable settings during initialize(). Do not emit the\n // default before that read completes or disabled users briefly see the toggle as on.\n if (this.initialized) listener(this.getSummary())\n return () => this.listeners.delete(listener)\n }\n\n getSummary(): CameraRollExportSummary {\n const entries = cameraRollExportLedger\n .list()\n // Exported receipts with no local row are hidden deduplication tombstones. Unexported\n // missing generations remain user-visible so data that can no longer be backfilled is\n // never reported as successfully saved.\n .filter((entry) => entry.localPresent !== false || entry.state === \"MISSING_LOCAL\")\n const pendingStates = new Set([\n \"LEGACY_UNKNOWN\",\n \"QUEUED\",\n \"RECONCILING\",\n \"EXPORTING\",\n \"FAILED_RETRYABLE\",\n \"BLOCKED_PERMISSION\",\n ])\n return {\n enabled: this.enabled,\n total: entries.length,\n exported: entries.filter((entry) => entry.state === \"EXPORTED\").length,\n pending: entries.filter((entry) => pendingStates.has(entry.state)).length,\n failed: entries.filter((entry) => entry.state === \"FAILED_RETRYABLE\" || entry.state === \"FAILED_PERMANENT\")\n .length,\n blockedPermission: entries.filter((entry) => entry.state === \"BLOCKED_PERMISSION\").length,\n fullAccessRequired: entries.filter(\n (entry) => entry.state === \"BLOCKED_PERMISSION\" && entry.requiresFullLibraryReconciliation,\n ).length,\n missing: entries.filter((entry) => entry.state === \"MISSING_LOCAL\").length,\n bytesPending: entries\n .filter((entry) => pendingStates.has(entry.state))\n .reduce((sum, entry) => sum + entry.size, 0),\n isRunning: this.running,\n }\n }\n\n async countNotExported(mediaNames: string[]): Promise<number> {\n await this.initialize()\n const uniqueNames = [...new Set(mediaNames)]\n if (uniqueNames.length === 0) return 0\n const files = await localStorageService.getDownloadedFiles()\n return uniqueNames.filter((name) => {\n const file = files[name]\n if (!file) return true\n const entry = cameraRollExportLedger.get(cameraRollEntryId(file.name, file.size, file.modified))\n return entry?.state !== \"EXPORTED\"\n }).length\n }\n\n /** Serialize local deletion against an in-flight native copy of the same item. */\n async deleteLocalMedia(mediaName: string): Promise<boolean> {\n this.deletingMediaNames.add(mediaName)\n try {\n while (this.activeEntryId && cameraRollExportLedger.get(this.activeEntryId)?.mediaName === mediaName) {\n await new Promise<void>((resolve) => BgTimer.setTimeout(resolve, 25))\n }\n const deleted = await localStorageService.deleteDownloadedFile(mediaName)\n if (deleted) {\n // An already-running export gets to finish and resolve its source barrier. Queued work\n // cannot start while the name is in deletingMediaNames, so reject only after deletion\n // is confirmed. A failed delete leaves the barrier intact and eligible for retry.\n for (const entry of cameraRollExportLedger.list().filter((candidate) => candidate.mediaName === mediaName)) {\n this.rejectSourceWaiters(entry.id, new Error(\"Local media was deleted before camera-roll export\"))\n }\n cameraRollExportLedger.removeForMedia(mediaName)\n }\n return deleted\n } finally {\n this.deletingMediaNames.delete(mediaName)\n this.emitSummary()\n if (this.enabled) void this.resume(\"local deletion finished\")\n }\n }\n\n /** Stop scheduling exports, finish the current native copy, then atomically clear app media + receipts. */\n async clearLocalMedia(): Promise<void> {\n this.clearInProgress = true\n try {\n while (this.activeEntryId) {\n await new Promise<void>((resolve) => BgTimer.setTimeout(resolve, 25))\n }\n await localStorageService.clearAllFiles()\n // Let the active native copy deliver its receipt before rejecting queued barriers, and\n // reject them only after the app media clear is confirmed. If clear fails, the durable\n // work and its waiters remain eligible for retry.\n for (const entry of cameraRollExportLedger.list()) {\n this.rejectSourceWaiters(entry.id, new Error(\"Local media was deleted before camera-roll export\"))\n }\n cameraRollExportLedger.clear()\n } finally {\n this.clearInProgress = false\n this.emitSummary()\n if (this.enabled) void this.resume(\"local clear finished\")\n }\n }\n\n private nextEntry(): CameraRollExportEntry | undefined {\n const now = Date.now()\n return cameraRollExportLedger\n .list()\n .filter((entry) => {\n if (entry.localPresent === false) return false\n if (this.clearInProgress || this.deletingMediaNames.has(entry.mediaName)) return false\n if (entry.receipt || entry.state === \"EXPORTED\" || entry.state === \"MISSING_LOCAL\") return false\n if (!this.enabled) return false\n if (entry.state === \"BLOCKED_PERMISSION\" || entry.state === \"FAILED_PERMANENT\") return false\n if (entry.state === \"FAILED_RETRYABLE\" && (entry.nextRetryAt || 0) > now) return false\n return entry.state !== \"NOT_REQUESTED\"\n })\n .sort((a, b) => {\n if (a.priority !== b.priority) return a.priority === \"SOURCE_BARRIER\" ? -1 : 1\n return a.modified - b.modified\n })[0]\n }\n\n private async processEntry(original: CameraRollExportEntry, generation: number): Promise<void> {\n let entry = original\n this.activeEntryId = entry.id\n try {\n if (!this.enabled) {\n cameraRollExportLedger.update(entry.id, {state: \"NOT_REQUESTED\", nextRetryAt: undefined})\n this.rejectSourceWaiters(entry.id, new Error(\"Automatic camera-roll saving was disabled\"))\n return\n }\n const exists = await RNFS.exists(entry.filePath)\n if (generation !== this.lifecycleGeneration) return\n if (!exists) {\n cameraRollExportLedger.update(entry.id, {state: \"MISSING_LOCAL\", lastError: \"Local media is missing\"})\n throw new Error(\"Local media is missing\")\n }\n const permission = await MediaLibraryPermissions.checkPermission()\n if (generation !== this.lifecycleGeneration) return\n if (!permission) {\n cameraRollExportLedger.update(entry.id, {\n state: \"BLOCKED_PERMISSION\",\n lastError: \"Camera-roll permission is required\",\n })\n throw new Error(\"Camera-roll permission is required\")\n }\n const hasLimitedAccess =\n entry.requiresFullLibraryReconciliation && (await MediaLibraryPermissions.hasLimitedAccess())\n if (generation !== this.lifecycleGeneration) return\n if (hasLimitedAccess) {\n cameraRollExportLedger.update(entry.id, {\n state: \"BLOCKED_PERMISSION\",\n lastError: \"Full photo-library access is required to reconcile this legacy export safely\",\n })\n throw new Error(\"Full photo-library access is required to reconcile this legacy export safely\")\n }\n const fsInfo = await RNFS.getFSInfo()\n if (generation !== this.lifecycleGeneration) return\n if (fsInfo.freeSpace < entry.size + MIN_FREE_SPACE_BYTES) {\n throw new Error(\"Insufficient free space for camera-roll export\")\n }\n // A setting change can land while the filesystem and permission checks are in flight.\n // Once the native save starts it must finish atomically, but do not begin a new save\n // after the user has disabled automatic camera-roll exports.\n if (!this.enabled) {\n cameraRollExportLedger.update(entry.id, {state: \"NOT_REQUESTED\", nextRetryAt: undefined})\n this.rejectSourceWaiters(entry.id, new Error(\"Automatic camera-roll saving was disabled\"))\n return\n }\n\n entry = cameraRollExportLedger.update(entry.id, {state: \"RECONCILING\", lastError: undefined})\n entry = cameraRollExportLedger.update(entry.id, {state: \"EXPORTING\"})\n const result = await MediaLibraryPermissions.saveToLibraryWithReceipt(entry.filePath, entry.modified)\n if (!result.success) throw new Error(result.error || \"Camera-roll export failed\")\n const receipt: GalleryAssetReceipt = {\n platform: result.platform,\n uri: result.uri,\n identifier: result.identifier,\n exportedAt: Date.now(),\n }\n entry = cameraRollExportLedger.update(entry.id, {\n state: \"EXPORTED\",\n receipt,\n requiresFullLibraryReconciliation: false,\n attempts: entry.attempts + 1,\n nextRetryAt: undefined,\n lastError: undefined,\n })\n try {\n await this.mirrorReceipt(entry, receipt)\n } catch (mirrorError) {\n // The per-generation ledger is the authoritative durable receipt. A secondary\n // metadata mirror failure must not cause a duplicate insert or block source ack.\n console.warn(`${TAG} Export receipt mirror failed for ${entry.mediaName}:`, mirrorError)\n }\n this.resolveSourceWaiters(entry.id, receipt)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n const current = cameraRollExportLedger.get(entry.id)\n if (current && current.state !== \"BLOCKED_PERMISSION\" && current.state !== \"MISSING_LOCAL\") {\n const attempts = current.attempts + 1\n cameraRollExportLedger.update(entry.id, {\n state: \"FAILED_RETRYABLE\",\n attempts,\n lastError: message,\n nextRetryAt: Date.now() + Math.min(2 ** Math.min(attempts, 10) * 1000, MAX_RETRY_DELAY_MS),\n })\n }\n this.rejectSourceWaiters(entry.id, error instanceof Error ? error : new Error(message))\n console.warn(`${TAG} Export remains pending for ${entry.mediaName}: ${message}`)\n } finally {\n if (this.activeEntryId === entry.id) this.activeEntryId = null\n if (generation === this.lifecycleGeneration) this.emitSummary()\n }\n }\n\n private async mirrorReceipt(entry: CameraRollExportEntry, receipt: GalleryAssetReceipt): Promise<void> {\n await localStorageService.updateDownloadedFileAssetReceipt(entry.mediaName, receipt)\n const transfer = entry.captureId\n ? galleryTransferLedger.get(entry.captureId)\n : galleryTransferLedger.get(entry.mediaName)\n if (transfer) galleryTransferLedger.update(transfer.captureId, {assetReceipt: receipt})\n }\n\n private scheduleRetry(): void {\n if (!this.enabled || this.retryTimer != null) return\n const next = cameraRollExportLedger\n .list()\n .filter((entry) => entry.state === \"FAILED_RETRYABLE\" && entry.nextRetryAt)\n .sort((a, b) => (a.nextRetryAt || 0) - (b.nextRetryAt || 0))[0]\n if (!next?.nextRetryAt) return\n const generation = this.lifecycleGeneration\n this.retryTimer = BgTimer.setTimeout(\n () => {\n this.retryTimer = null\n if (generation !== this.lifecycleGeneration) return\n void this.resume(\"retry timer\")\n },\n Math.max(0, next.nextRetryAt - Date.now()),\n )\n }\n\n private resolveSourceWaiters(id: string, receipt: GalleryAssetReceipt): void {\n for (const waiter of this.sourceWaiters.get(id) || []) waiter.resolve(receipt)\n this.sourceWaiters.delete(id)\n }\n\n private rejectSourceWaiters(id: string, error: Error): void {\n for (const waiter of this.sourceWaiters.get(id) || []) waiter.reject(error)\n this.sourceWaiters.delete(id)\n }\n\n private emitSummary(): void {\n const summary = this.getSummary()\n for (const listener of this.listeners) {\n try {\n listener(summary)\n } catch (error) {\n console.warn(`${TAG} Summary listener failed`, error)\n }\n }\n }\n}\n\nexport const cameraRollExportCoordinator = new CameraRollExportCoordinator()\n"]}
@@ -0,0 +1,44 @@
1
+ import type { GalleryAssetReceipt } from "./galleryTransferLedger";
2
+ export type CameraRollExportState = "NOT_REQUESTED" | "LEGACY_UNKNOWN" | "QUEUED" | "RECONCILING" | "EXPORTING" | "EXPORTED" | "BLOCKED_PERMISSION" | "FAILED_RETRYABLE" | "FAILED_PERMANENT" | "MISSING_LOCAL";
3
+ export type CameraRollExportPriority = "SOURCE_BARRIER" | "HISTORICAL_BACKFILL";
4
+ export interface CameraRollExportEntry {
5
+ /** Stable identity for one local-file generation. */
6
+ id: string;
7
+ mediaName: string;
8
+ generation: string;
9
+ filePath: string;
10
+ size: number;
11
+ modified: number;
12
+ isVideo: boolean;
13
+ captureId?: string;
14
+ /** False while this generation is absent from the local index; exported receipts remain as hidden tombstones. */
15
+ localPresent?: boolean;
16
+ /** True when an older client may already have exported this file without persisting a receipt. */
17
+ requiresFullLibraryReconciliation?: boolean;
18
+ state: CameraRollExportState;
19
+ priority: CameraRollExportPriority;
20
+ receipt?: GalleryAssetReceipt;
21
+ attempts: number;
22
+ nextRetryAt?: number;
23
+ lastError?: string;
24
+ createdAt: number;
25
+ updatedAt: number;
26
+ }
27
+ export declare function cameraRollGeneration(mediaName: string, size: number, modified: number): string;
28
+ export declare function cameraRollEntryId(mediaName: string, size: number, modified: number): string;
29
+ declare class CameraRollExportLedger {
30
+ private runtimeDocumentDirectory;
31
+ setDocumentDirectory(path: string): void;
32
+ get(id: string): CameraRollExportEntry | undefined;
33
+ list(): CameraRollExportEntry[];
34
+ put(entry: CameraRollExportEntry): CameraRollExportEntry;
35
+ update(id: string, patch: Partial<CameraRollExportEntry>): CameraRollExportEntry;
36
+ remove(id: string): void;
37
+ removeForMedia(mediaName: string): void;
38
+ clear(): void;
39
+ private toStoredEntry;
40
+ private toRuntimeEntry;
41
+ }
42
+ export declare const cameraRollExportLedger: CameraRollExportLedger;
43
+ export {};
44
+ //# sourceMappingURL=cameraRollExportLedger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cameraRollExportLedger.d.ts","sourceRoot":"","sources":["../../../src/services/asg/cameraRollExportLedger.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAC,mBAAmB,EAAC,MAAM,yBAAyB,CAAA;AAEhE,MAAM,MAAM,qBAAqB,GAC7B,eAAe,GACf,gBAAgB,GAChB,QAAQ,GACR,aAAa,GACb,WAAW,GACX,UAAU,GACV,oBAAoB,GACpB,kBAAkB,GAClB,kBAAkB,GAClB,eAAe,CAAA;AAEnB,MAAM,MAAM,wBAAwB,GAAG,gBAAgB,GAAG,qBAAqB,CAAA;AAE/E,MAAM,WAAW,qBAAqB;IACpC,qDAAqD;IACrD,EAAE,EAAE,MAAM,CAAA;IACV,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,OAAO,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,iHAAiH;IACjH,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,kGAAkG;IAClG,iCAAiC,CAAC,EAAE,OAAO,CAAA;IAC3C,KAAK,EAAE,qBAAqB,CAAA;IAC5B,QAAQ,EAAE,wBAAwB,CAAA;IAClC,OAAO,CAAC,EAAE,mBAAmB,CAAA;IAC7B,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;CAClB;AAID,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE9F;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE3F;AAED,cAAM,sBAAsB;IAC1B,OAAO,CAAC,wBAAwB,CAAK;IAErC,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAIxC,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,qBAAqB,GAAG,SAAS;IAMlD,IAAI,IAAI,qBAAqB,EAAE;IAW/B,GAAG,CAAC,KAAK,EAAE,qBAAqB,GAAG,qBAAqB;IAOxD,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,qBAAqB,CAAC,GAAG,qBAAqB;IAMhF,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAKxB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAMvC,KAAK,IAAI,IAAI;IAOb,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,cAAc;CAIvB;AAED,eAAO,MAAM,sBAAsB,wBAA+B,CAAA"}
@@ -0,0 +1,78 @@
1
+ import { storage } from "../../utils/storage";
2
+ import { toPortableGalleryPath } from "./galleryPathMigration";
3
+ const ENTRY_PREFIX = "asg_camera_roll_export_v1:";
4
+ export function cameraRollGeneration(mediaName, size, modified) {
5
+ return `${mediaName}:${size}:${modified}`;
6
+ }
7
+ export function cameraRollEntryId(mediaName, size, modified) {
8
+ return encodeURIComponent(cameraRollGeneration(mediaName, size, modified));
9
+ }
10
+ class CameraRollExportLedger {
11
+ runtimeDocumentDirectory = "";
12
+ setDocumentDirectory(path) {
13
+ this.runtimeDocumentDirectory = path;
14
+ }
15
+ get(id) {
16
+ const result = storage.load(`${ENTRY_PREFIX}${id}`);
17
+ if (result.is_error())
18
+ return undefined;
19
+ return this.toRuntimeEntry(result.value);
20
+ }
21
+ list() {
22
+ return storage
23
+ .getAllKeys()
24
+ .filter((key) => key.startsWith(ENTRY_PREFIX))
25
+ .map((key) => {
26
+ const result = storage.load(key);
27
+ return result.is_error() ? undefined : this.toRuntimeEntry(result.value);
28
+ })
29
+ .filter((entry) => !!entry);
30
+ }
31
+ put(entry) {
32
+ const updated = { ...entry, updatedAt: Date.now() };
33
+ const result = storage.save(`${ENTRY_PREFIX}${entry.id}`, this.toStoredEntry(updated));
34
+ if (result.is_error())
35
+ throw result.error;
36
+ return updated;
37
+ }
38
+ update(id, patch) {
39
+ const current = this.get(id);
40
+ if (!current)
41
+ throw new Error(`Camera-roll export entry missing: ${id}`);
42
+ return this.put({ ...current, ...patch, id });
43
+ }
44
+ remove(id) {
45
+ const result = storage.remove(`${ENTRY_PREFIX}${id}`);
46
+ if (result.is_error())
47
+ throw result.error;
48
+ }
49
+ removeForMedia(mediaName) {
50
+ for (const entry of this.list()) {
51
+ if (entry.mediaName === mediaName)
52
+ this.remove(entry.id);
53
+ }
54
+ }
55
+ clear() {
56
+ const keys = storage.getAllKeys().filter((key) => key.startsWith(ENTRY_PREFIX));
57
+ if (keys.length === 0)
58
+ return;
59
+ const result = storage.removeMultiple(keys);
60
+ if (result.is_error())
61
+ throw result.error;
62
+ }
63
+ toStoredEntry(entry) {
64
+ if (!this.runtimeDocumentDirectory)
65
+ return entry;
66
+ return {
67
+ ...entry,
68
+ filePath: toPortableGalleryPath(entry.filePath, this.runtimeDocumentDirectory) || entry.filePath,
69
+ };
70
+ }
71
+ toRuntimeEntry(entry) {
72
+ if (!this.runtimeDocumentDirectory || entry.filePath.startsWith("/"))
73
+ return entry;
74
+ return { ...entry, filePath: `${this.runtimeDocumentDirectory}/${entry.filePath}` };
75
+ }
76
+ }
77
+ export const cameraRollExportLedger = new CameraRollExportLedger();
78
+ //# sourceMappingURL=cameraRollExportLedger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cameraRollExportLedger.js","sourceRoot":"","sources":["../../../src/services/asg/cameraRollExportLedger.ts"],"names":[],"mappings":"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","sourcesContent":["import {storage} from \"../../utils/storage\"\nimport {toPortableGalleryPath} from \"./galleryPathMigration\"\nimport type {GalleryAssetReceipt} from \"./galleryTransferLedger\"\n\nexport type CameraRollExportState =\n | \"NOT_REQUESTED\"\n | \"LEGACY_UNKNOWN\"\n | \"QUEUED\"\n | \"RECONCILING\"\n | \"EXPORTING\"\n | \"EXPORTED\"\n | \"BLOCKED_PERMISSION\"\n | \"FAILED_RETRYABLE\"\n | \"FAILED_PERMANENT\"\n | \"MISSING_LOCAL\"\n\nexport type CameraRollExportPriority = \"SOURCE_BARRIER\" | \"HISTORICAL_BACKFILL\"\n\nexport interface CameraRollExportEntry {\n /** Stable identity for one local-file generation. */\n id: string\n mediaName: string\n generation: string\n filePath: string\n size: number\n modified: number\n isVideo: boolean\n captureId?: string\n /** False while this generation is absent from the local index; exported receipts remain as hidden tombstones. */\n localPresent?: boolean\n /** True when an older client may already have exported this file without persisting a receipt. */\n requiresFullLibraryReconciliation?: boolean\n state: CameraRollExportState\n priority: CameraRollExportPriority\n receipt?: GalleryAssetReceipt\n attempts: number\n nextRetryAt?: number\n lastError?: string\n createdAt: number\n updatedAt: number\n}\n\nconst ENTRY_PREFIX = \"asg_camera_roll_export_v1:\"\n\nexport function cameraRollGeneration(mediaName: string, size: number, modified: number): string {\n return `${mediaName}:${size}:${modified}`\n}\n\nexport function cameraRollEntryId(mediaName: string, size: number, modified: number): string {\n return encodeURIComponent(cameraRollGeneration(mediaName, size, modified))\n}\n\nclass CameraRollExportLedger {\n private runtimeDocumentDirectory = \"\"\n\n setDocumentDirectory(path: string): void {\n this.runtimeDocumentDirectory = path\n }\n\n get(id: string): CameraRollExportEntry | undefined {\n const result = storage.load<CameraRollExportEntry>(`${ENTRY_PREFIX}${id}`)\n if (result.is_error()) return undefined\n return this.toRuntimeEntry(result.value)\n }\n\n list(): CameraRollExportEntry[] {\n return storage\n .getAllKeys()\n .filter((key) => key.startsWith(ENTRY_PREFIX))\n .map((key) => {\n const result = storage.load<CameraRollExportEntry>(key)\n return result.is_error() ? undefined : this.toRuntimeEntry(result.value)\n })\n .filter((entry): entry is CameraRollExportEntry => !!entry)\n }\n\n put(entry: CameraRollExportEntry): CameraRollExportEntry {\n const updated = {...entry, updatedAt: Date.now()}\n const result = storage.save(`${ENTRY_PREFIX}${entry.id}`, this.toStoredEntry(updated))\n if (result.is_error()) throw result.error\n return updated\n }\n\n update(id: string, patch: Partial<CameraRollExportEntry>): CameraRollExportEntry {\n const current = this.get(id)\n if (!current) throw new Error(`Camera-roll export entry missing: ${id}`)\n return this.put({...current, ...patch, id})\n }\n\n remove(id: string): void {\n const result = storage.remove(`${ENTRY_PREFIX}${id}`)\n if (result.is_error()) throw result.error\n }\n\n removeForMedia(mediaName: string): void {\n for (const entry of this.list()) {\n if (entry.mediaName === mediaName) this.remove(entry.id)\n }\n }\n\n clear(): void {\n const keys = storage.getAllKeys().filter((key) => key.startsWith(ENTRY_PREFIX))\n if (keys.length === 0) return\n const result = storage.removeMultiple(keys)\n if (result.is_error()) throw result.error\n }\n\n private toStoredEntry(entry: CameraRollExportEntry): CameraRollExportEntry {\n if (!this.runtimeDocumentDirectory) return entry\n return {\n ...entry,\n filePath: toPortableGalleryPath(entry.filePath, this.runtimeDocumentDirectory) || entry.filePath,\n }\n }\n\n private toRuntimeEntry(entry: CameraRollExportEntry): CameraRollExportEntry {\n if (!this.runtimeDocumentDirectory || entry.filePath.startsWith(\"/\")) return entry\n return {...entry, filePath: `${this.runtimeDocumentDirectory}/${entry.filePath}`}\n }\n}\n\nexport const cameraRollExportLedger = new CameraRollExportLedger()\n"]}
@@ -5,7 +5,7 @@
5
5
  * sync (engine runtime) free of host UI/i18n/navigation — exposed as
6
6
  * `engine.gallery.onNotice(cb)`.
7
7
  */
8
- export type GalleryNoticeCode = "glasses_disconnected" | "bluetooth_off" | "insufficient_storage" | "wifi_initializing" | "wifi_off" | "location_services_off" | "connect_to_glasses";
8
+ export type GalleryNoticeCode = "glasses_disconnected" | "bluetooth_off" | "insufficient_storage" | "wifi_initializing" | "wifi_off" | "location_services_off" | "camera_roll_permission_required" | "connect_to_glasses";
9
9
  export interface GalleryNotice {
10
10
  code: GalleryNoticeCode;
11
11
  /** Optional extra context (e.g. ssid/platform) for the host's message. */
@@ -1 +1 @@
1
- {"version":3,"file":"galleryNotices.d.ts","sourceRoot":"","sources":["../../../src/services/asg/galleryNotices.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,MAAM,iBAAiB,GACzB,sBAAsB,GACtB,eAAe,GACf,sBAAsB,GACtB,mBAAmB,GACnB,UAAU,GACV,uBAAuB,GACvB,oBAAoB,CAAA;AAExB,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,iBAAiB,CAAA;IACvB,0EAA0E;IAC1E,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC9B;;;;;OAKG;IACH,GAAG,CAAC,EAAE,MAAM,IAAI,CAAA;CACjB;AAED,KAAK,QAAQ,GAAG,CAAC,MAAM,EAAE,aAAa,KAAK,IAAI,CAAA;AAI/C;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAa/D;AAED,4DAA4D;AAC5D,wBAAgB,eAAe,CAAC,EAAE,EAAE,QAAQ,GAAG,MAAM,IAAI,CAGxD"}
1
+ {"version":3,"file":"galleryNotices.d.ts","sourceRoot":"","sources":["../../../src/services/asg/galleryNotices.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,MAAM,iBAAiB,GACzB,sBAAsB,GACtB,eAAe,GACf,sBAAsB,GACtB,mBAAmB,GACnB,UAAU,GACV,uBAAuB,GACvB,iCAAiC,GACjC,oBAAoB,CAAA;AAExB,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,iBAAiB,CAAA;IACvB,0EAA0E;IAC1E,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC9B;;;;;OAKG;IACH,GAAG,CAAC,EAAE,MAAM,IAAI,CAAA;CACjB;AAED,KAAK,QAAQ,GAAG,CAAC,MAAM,EAAE,aAAa,KAAK,IAAI,CAAA;AAI/C;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAa/D;AAED,4DAA4D;AAC5D,wBAAgB,eAAe,CAAC,EAAE,EAAE,QAAQ,GAAG,MAAM,IAAI,CAGxD"}
@@ -1 +1 @@
1
- {"version":3,"file":"galleryNotices.js","sourceRoot":"","sources":["../../../src/services/asg/galleryNotices.ts"],"names":[],"mappings":"AA+BA,MAAM,SAAS,GAAG,IAAI,GAAG,EAAY,CAAA;AAErC;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAqB;IACrD,IAAI,SAAS,GAAG,CAAC,CAAA;IACjB,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;QACtB,8EAA8E;QAC9E,uDAAuD;QACvD,IAAI,CAAC;YACH,CAAC,CAAC,MAAM,CAAC,CAAA;YACT,SAAS,IAAI,CAAC,CAAA;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,0CAA0C,EAAE,KAAK,CAAC,CAAA;QAClE,CAAC;IACH,CAAC,CAAC,CAAA;IACF,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,eAAe,CAAC,EAAY;IAC1C,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IACjB,OAAO,GAAG,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;AACnC,CAAC","sourcesContent":["/**\n * Gallery notices — engine-owned. The gallery sync emits STRUCTURED notice codes\n * (never localized strings or alerts) when it hits a user-actionable precondition;\n * the host renders its own alert / settings deep-link from the code. This keeps the\n * sync (engine runtime) free of host UI/i18n/navigation — exposed as\n * `engine.gallery.onNotice(cb)`.\n */\nexport type GalleryNoticeCode =\n | \"glasses_disconnected\"\n | \"bluetooth_off\"\n | \"insufficient_storage\"\n | \"wifi_initializing\"\n | \"wifi_off\"\n | \"location_services_off\"\n | \"connect_to_glasses\"\n\nexport interface GalleryNotice {\n code: GalleryNoticeCode\n /** Optional extra context (e.g. ssid/platform) for the host's message. */\n data?: Record<string, unknown>\n /**\n * Present only on notices the sync BLOCKS on (currently the one-time wifi-join\n * explanation): the host calls this when the user acknowledges, letting the sync\n * proceed. If no host is listening, the emitter's return value lets the sync fall\n * through instead of hanging.\n */\n ack?: () => void\n}\n\ntype Listener = (notice: GalleryNotice) => void\n\nconst listeners = new Set<Listener>()\n\n/**\n * Emit a notice to all subscribers; returns how many SUCCESSFULLY received it\n * (0 = nobody listening, or every listener threw). Callers use 0 as the\n * \"no host will act on this\" signal — e.g. gallery sync auto-proceeds on the\n * blocking connect_to_glasses notice — so a throwing listener must not count\n * as a delivery.\n */\nexport function emitGalleryNotice(notice: GalleryNotice): number {\n let delivered = 0\n listeners.forEach((l) => {\n // Isolate listeners: one throwing host handler must not break delivery to the\n // others or bubble an exception into the gallery sync.\n try {\n l(notice)\n delivered += 1\n } catch (error) {\n console.error(\"galleryNotices: onNotice listener threw:\", error)\n }\n })\n return delivered\n}\n\n/** Subscribe to gallery notices; returns an unsubscribe. */\nexport function onGalleryNotice(cb: Listener): () => void {\n listeners.add(cb)\n return () => listeners.delete(cb)\n}\n"]}
1
+ {"version":3,"file":"galleryNotices.js","sourceRoot":"","sources":["../../../src/services/asg/galleryNotices.ts"],"names":[],"mappings":"AAgCA,MAAM,SAAS,GAAG,IAAI,GAAG,EAAY,CAAA;AAErC;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAqB;IACrD,IAAI,SAAS,GAAG,CAAC,CAAA;IACjB,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;QACtB,8EAA8E;QAC9E,uDAAuD;QACvD,IAAI,CAAC;YACH,CAAC,CAAC,MAAM,CAAC,CAAA;YACT,SAAS,IAAI,CAAC,CAAA;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,0CAA0C,EAAE,KAAK,CAAC,CAAA;QAClE,CAAC;IACH,CAAC,CAAC,CAAA;IACF,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,eAAe,CAAC,EAAY;IAC1C,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IACjB,OAAO,GAAG,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;AACnC,CAAC","sourcesContent":["/**\n * Gallery notices — engine-owned. The gallery sync emits STRUCTURED notice codes\n * (never localized strings or alerts) when it hits a user-actionable precondition;\n * the host renders its own alert / settings deep-link from the code. This keeps the\n * sync (engine runtime) free of host UI/i18n/navigation — exposed as\n * `engine.gallery.onNotice(cb)`.\n */\nexport type GalleryNoticeCode =\n | \"glasses_disconnected\"\n | \"bluetooth_off\"\n | \"insufficient_storage\"\n | \"wifi_initializing\"\n | \"wifi_off\"\n | \"location_services_off\"\n | \"camera_roll_permission_required\"\n | \"connect_to_glasses\"\n\nexport interface GalleryNotice {\n code: GalleryNoticeCode\n /** Optional extra context (e.g. ssid/platform) for the host's message. */\n data?: Record<string, unknown>\n /**\n * Present only on notices the sync BLOCKS on (currently the one-time wifi-join\n * explanation): the host calls this when the user acknowledges, letting the sync\n * proceed. If no host is listening, the emitter's return value lets the sync fall\n * through instead of hanging.\n */\n ack?: () => void\n}\n\ntype Listener = (notice: GalleryNotice) => void\n\nconst listeners = new Set<Listener>()\n\n/**\n * Emit a notice to all subscribers; returns how many SUCCESSFULLY received it\n * (0 = nobody listening, or every listener threw). Callers use 0 as the\n * \"no host will act on this\" signal — e.g. gallery sync auto-proceeds on the\n * blocking connect_to_glasses notice — so a throwing listener must not count\n * as a delivery.\n */\nexport function emitGalleryNotice(notice: GalleryNotice): number {\n let delivered = 0\n listeners.forEach((l) => {\n // Isolate listeners: one throwing host handler must not break delivery to the\n // others or bubble an exception into the gallery sync.\n try {\n l(notice)\n delivered += 1\n } catch (error) {\n console.error(\"galleryNotices: onNotice listener threw:\", error)\n }\n })\n return delivered\n}\n\n/** Subscribe to gallery notices; returns an unsubscribe. */\nexport function onGalleryNotice(cb: Listener): () => void {\n listeners.add(cb)\n return () => listeners.delete(cb)\n}\n"]}
@@ -0,0 +1,3 @@
1
+ /** Convert current or legacy app-container paths into a portable Documents-relative path. */
2
+ export declare function toPortableGalleryPath(path: string, documentDirectoryPath: string): string | null;
3
+ //# sourceMappingURL=galleryPathMigration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"galleryPathMigration.d.ts","sourceRoot":"","sources":["../../../src/services/asg/galleryPathMigration.ts"],"names":[],"mappings":"AAAA,6FAA6F;AAC7F,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,qBAAqB,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAoBhG"}
@@ -0,0 +1,26 @@
1
+ /** Convert current or legacy app-container paths into a portable Documents-relative path. */
2
+ export function toPortableGalleryPath(path, documentDirectoryPath) {
3
+ if (!path)
4
+ return null;
5
+ const cleanPath = path.replace(/^file:\/\//, "");
6
+ const docPath = documentDirectoryPath.replace(/\/$/, "");
7
+ let candidate = null;
8
+ if (cleanPath.startsWith(`${docPath}/`))
9
+ candidate = cleanPath.substring(docPath.length + 1);
10
+ else if (!cleanPath.startsWith("/"))
11
+ candidate = cleanPath.replace(/^\/+/, "");
12
+ if (!candidate) {
13
+ const documentsMarker = "/Documents/";
14
+ const documentsIndex = cleanPath.indexOf(documentsMarker);
15
+ if (documentsIndex >= 0)
16
+ candidate = cleanPath.substring(documentsIndex + documentsMarker.length);
17
+ }
18
+ if (!candidate || candidate.includes("\0"))
19
+ return null;
20
+ const segments = candidate.split("/");
21
+ if (segments[0] !== "MentraPhotos" || segments.some((segment) => !segment || segment === "." || segment === "..")) {
22
+ return null;
23
+ }
24
+ return segments.join("/");
25
+ }
26
+ //# sourceMappingURL=galleryPathMigration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"galleryPathMigration.js","sourceRoot":"","sources":["../../../src/services/asg/galleryPathMigration.ts"],"names":[],"mappings":"AAAA,6FAA6F;AAC7F,MAAM,UAAU,qBAAqB,CAAC,IAAY,EAAE,qBAA6B;IAC/E,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAA;IACtB,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAA;IAChD,MAAM,OAAO,GAAG,qBAAqB,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;IACxD,IAAI,SAAS,GAAkB,IAAI,CAAA;IACnC,IAAI,SAAS,CAAC,UAAU,CAAC,GAAG,OAAO,GAAG,CAAC;QAAE,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;SACvF,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;IAE9E,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,eAAe,GAAG,aAAa,CAAA;QACrC,MAAM,cAAc,GAAG,SAAS,CAAC,OAAO,CAAC,eAAe,CAAC,CAAA;QACzD,IAAI,cAAc,IAAI,CAAC;YAAE,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC,cAAc,GAAG,eAAe,CAAC,MAAM,CAAC,CAAA;IACnG,CAAC;IAED,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAA;IACvD,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IACrC,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,cAAc,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,IAAI,OAAO,KAAK,GAAG,IAAI,OAAO,KAAK,IAAI,CAAC,EAAE,CAAC;QAClH,OAAO,IAAI,CAAA;IACb,CAAC;IACD,OAAO,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAC3B,CAAC","sourcesContent":["/** Convert current or legacy app-container paths into a portable Documents-relative path. */\nexport function toPortableGalleryPath(path: string, documentDirectoryPath: string): string | null {\n if (!path) return null\n const cleanPath = path.replace(/^file:\\/\\//, \"\")\n const docPath = documentDirectoryPath.replace(/\\/$/, \"\")\n let candidate: string | null = null\n if (cleanPath.startsWith(`${docPath}/`)) candidate = cleanPath.substring(docPath.length + 1)\n else if (!cleanPath.startsWith(\"/\")) candidate = cleanPath.replace(/^\\/+/, \"\")\n\n if (!candidate) {\n const documentsMarker = \"/Documents/\"\n const documentsIndex = cleanPath.indexOf(documentsMarker)\n if (documentsIndex >= 0) candidate = cleanPath.substring(documentsIndex + documentsMarker.length)\n }\n\n if (!candidate || candidate.includes(\"\\0\")) return null\n const segments = candidate.split(\"/\")\n if (segments[0] !== \"MentraPhotos\" || segments.some((segment) => !segment || segment === \".\" || segment === \"..\")) {\n return null\n }\n return segments.join(\"/\")\n}\n"]}
@@ -1,5 +1,6 @@
1
1
  export interface GallerySettings {
2
2
  autoSaveToCameraRoll: boolean;
3
+ autoSaveDisableWarningShown: boolean;
3
4
  imageProcessingEnabled: boolean;
4
5
  }
5
6
  export declare class GallerySettingsService {
@@ -1 +1 @@
1
- {"version":3,"file":"gallerySettingsService.d.ts","sourceRoot":"","sources":["../../../src/services/asg/gallerySettingsService.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,eAAe;IAC9B,oBAAoB,EAAE,OAAO,CAAA;IAC7B,sBAAsB,EAAE,OAAO,CAAA;CAChC;AAED,qBAAa,sBAAsB;IACjC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAwB;IAC/C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAqB;IAClD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAGhC;IAED,OAAO;IAEP,MAAM,CAAC,WAAW,IAAI,sBAAsB;IAOtC,WAAW,IAAI,OAAO,CAAC,eAAe,CAAC;IAWvC,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAUjE,uBAAuB,IAAI,OAAO,CAAC,OAAO,CAAC;IAK3C,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAIxD,yBAAyB,IAAI,OAAO,CAAC,OAAO,CAAC;IAK7C,yBAAyB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;CAGjE;AAED,eAAO,MAAM,sBAAsB,wBAAuC,CAAA"}
1
+ {"version":3,"file":"gallerySettingsService.d.ts","sourceRoot":"","sources":["../../../src/services/asg/gallerySettingsService.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,eAAe;IAC9B,oBAAoB,EAAE,OAAO,CAAA;IAC7B,2BAA2B,EAAE,OAAO,CAAA;IACpC,sBAAsB,EAAE,OAAO,CAAA;CAChC;AAED,qBAAa,sBAAsB;IACjC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAwB;IAC/C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAqB;IAClD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAIhC;IAED,OAAO;IAEP,MAAM,CAAC,WAAW,IAAI,sBAAsB;IAOtC,WAAW,IAAI,OAAO,CAAC,eAAe,CAAC;IAWvC,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAWjE,uBAAuB,IAAI,OAAO,CAAC,OAAO,CAAC;IAK3C,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAIxD,yBAAyB,IAAI,OAAO,CAAC,OAAO,CAAC;IAK7C,yBAAyB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;CAGjE;AAED,eAAO,MAAM,sBAAsB,wBAAuC,CAAA"}
@@ -4,6 +4,7 @@ export class GallerySettingsService {
4
4
  SETTINGS_KEY = "gallery_settings";
5
5
  DEFAULT_SETTINGS = {
6
6
  autoSaveToCameraRoll: true, // Default ON
7
+ autoSaveDisableWarningShown: false,
7
8
  imageProcessingEnabled: true, // Lens coefficients calibrated from chessboard photos
8
9
  };
9
10
  constructor() { }
@@ -29,6 +30,7 @@ export class GallerySettingsService {
29
30
  const res = await storage.save(this.SETTINGS_KEY, updated);
30
31
  if (res.is_error()) {
31
32
  console.error("[GallerySettings] Error saving settings:", res.error);
33
+ throw res.error;
32
34
  }
33
35
  console.log("[GallerySettings] Settings updated:", updated);
34
36
  }
@@ -1 +1 @@
1
- {"version":3,"file":"gallerySettingsService.js","sourceRoot":"","sources":["../../../src/services/asg/gallerySettingsService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAC,MAAM,6BAA6B,CAAA;AAOnD,MAAM,OAAO,sBAAsB;IACzB,MAAM,CAAC,QAAQ,CAAwB;IAC9B,YAAY,GAAG,kBAAkB,CAAA;IACjC,gBAAgB,GAAoB;QACnD,oBAAoB,EAAE,IAAI,EAAE,aAAa;QACzC,sBAAsB,EAAE,IAAI,EAAE,sDAAsD;KACrF,CAAA;IAED,gBAAuB,CAAC;IAExB,MAAM,CAAC,WAAW;QAChB,IAAI,CAAC,sBAAsB,CAAC,QAAQ,EAAE,CAAC;YACrC,sBAAsB,CAAC,QAAQ,GAAG,IAAI,sBAAsB,EAAE,CAAA;QAChE,CAAC;QACD,OAAO,sBAAsB,CAAC,QAAQ,CAAA;IACxC,CAAC;IAED,KAAK,CAAC,WAAW;QACf,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAkB,IAAI,CAAC,YAAY,CAAC,CAAA;QAC5D,IAAI,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC;YACnB,wEAAwE;YACxE,2BAA2B;YAC3B,OAAO,IAAI,CAAC,gBAAgB,CAAA;QAC9B,CAAC;QACD,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAA;QACxB,OAAO,EAAC,GAAG,IAAI,CAAC,gBAAgB,EAAE,GAAG,MAAM,EAAC,CAAA;IAC9C,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,QAAkC;QACrD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAA;QACxC,MAAM,OAAO,GAAG,EAAC,GAAG,OAAO,EAAE,GAAG,QAAQ,EAAC,CAAA;QACzC,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,CAAA;QAC1D,IAAI,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC;YACnB,OAAO,CAAC,KAAK,CAAC,0CAA0C,EAAE,GAAG,CAAC,KAAK,CAAC,CAAA;QACtE,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,qCAAqC,EAAE,OAAO,CAAC,CAAA;IAC7D,CAAC;IAED,KAAK,CAAC,uBAAuB;QAC3B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAA;QACzC,OAAO,QAAQ,CAAC,oBAAoB,CAAA;IACtC,CAAC;IAED,KAAK,CAAC,uBAAuB,CAAC,OAAgB;QAC5C,MAAM,IAAI,CAAC,cAAc,CAAC,EAAC,oBAAoB,EAAE,OAAO,EAAC,CAAC,CAAA;IAC5D,CAAC;IAED,KAAK,CAAC,yBAAyB;QAC7B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAA;QACzC,OAAO,QAAQ,CAAC,sBAAsB,CAAA;IACxC,CAAC;IAED,KAAK,CAAC,yBAAyB,CAAC,OAAgB;QAC9C,MAAM,IAAI,CAAC,cAAc,CAAC,EAAC,sBAAsB,EAAE,OAAO,EAAC,CAAC,CAAA;IAC9D,CAAC;CACF;AAED,MAAM,CAAC,MAAM,sBAAsB,GAAG,sBAAsB,CAAC,WAAW,EAAE,CAAA","sourcesContent":["import {storage} from \"../../utils/storage/storage\"\n\nexport interface GallerySettings {\n autoSaveToCameraRoll: boolean\n imageProcessingEnabled: boolean\n}\n\nexport class GallerySettingsService {\n private static instance: GallerySettingsService\n private readonly SETTINGS_KEY = \"gallery_settings\"\n private readonly DEFAULT_SETTINGS: GallerySettings = {\n autoSaveToCameraRoll: true, // Default ON\n imageProcessingEnabled: true, // Lens coefficients calibrated from chessboard photos\n }\n\n private constructor() {}\n\n static getInstance(): GallerySettingsService {\n if (!GallerySettingsService.instance) {\n GallerySettingsService.instance = new GallerySettingsService()\n }\n return GallerySettingsService.instance\n }\n\n async getSettings(): Promise<GallerySettings> {\n const res = storage.load<GallerySettings>(this.SETTINGS_KEY)\n if (res.is_error()) {\n // Not an error - just means settings haven't been saved yet (first use)\n // Return defaults silently\n return this.DEFAULT_SETTINGS\n }\n const stored = res.value\n return {...this.DEFAULT_SETTINGS, ...stored}\n }\n\n async updateSettings(settings: Partial<GallerySettings>): Promise<void> {\n const current = await this.getSettings()\n const updated = {...current, ...settings}\n const res = await storage.save(this.SETTINGS_KEY, updated)\n if (res.is_error()) {\n console.error(\"[GallerySettings] Error saving settings:\", res.error)\n }\n console.log(\"[GallerySettings] Settings updated:\", updated)\n }\n\n async getAutoSaveToCameraRoll(): Promise<boolean> {\n const settings = await this.getSettings()\n return settings.autoSaveToCameraRoll\n }\n\n async setAutoSaveToCameraRoll(enabled: boolean): Promise<void> {\n await this.updateSettings({autoSaveToCameraRoll: enabled})\n }\n\n async getImageProcessingEnabled(): Promise<boolean> {\n const settings = await this.getSettings()\n return settings.imageProcessingEnabled\n }\n\n async setImageProcessingEnabled(enabled: boolean): Promise<void> {\n await this.updateSettings({imageProcessingEnabled: enabled})\n }\n}\n\nexport const gallerySettingsService = GallerySettingsService.getInstance()\n"]}
1
+ {"version":3,"file":"gallerySettingsService.js","sourceRoot":"","sources":["../../../src/services/asg/gallerySettingsService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAC,MAAM,6BAA6B,CAAA;AAQnD,MAAM,OAAO,sBAAsB;IACzB,MAAM,CAAC,QAAQ,CAAwB;IAC9B,YAAY,GAAG,kBAAkB,CAAA;IACjC,gBAAgB,GAAoB;QACnD,oBAAoB,EAAE,IAAI,EAAE,aAAa;QACzC,2BAA2B,EAAE,KAAK;QAClC,sBAAsB,EAAE,IAAI,EAAE,sDAAsD;KACrF,CAAA;IAED,gBAAuB,CAAC;IAExB,MAAM,CAAC,WAAW;QAChB,IAAI,CAAC,sBAAsB,CAAC,QAAQ,EAAE,CAAC;YACrC,sBAAsB,CAAC,QAAQ,GAAG,IAAI,sBAAsB,EAAE,CAAA;QAChE,CAAC;QACD,OAAO,sBAAsB,CAAC,QAAQ,CAAA;IACxC,CAAC;IAED,KAAK,CAAC,WAAW;QACf,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAkB,IAAI,CAAC,YAAY,CAAC,CAAA;QAC5D,IAAI,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC;YACnB,wEAAwE;YACxE,2BAA2B;YAC3B,OAAO,IAAI,CAAC,gBAAgB,CAAA;QAC9B,CAAC;QACD,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAA;QACxB,OAAO,EAAC,GAAG,IAAI,CAAC,gBAAgB,EAAE,GAAG,MAAM,EAAC,CAAA;IAC9C,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,QAAkC;QACrD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAA;QACxC,MAAM,OAAO,GAAG,EAAC,GAAG,OAAO,EAAE,GAAG,QAAQ,EAAC,CAAA;QACzC,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,CAAA;QAC1D,IAAI,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC;YACnB,OAAO,CAAC,KAAK,CAAC,0CAA0C,EAAE,GAAG,CAAC,KAAK,CAAC,CAAA;YACpE,MAAM,GAAG,CAAC,KAAK,CAAA;QACjB,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,qCAAqC,EAAE,OAAO,CAAC,CAAA;IAC7D,CAAC;IAED,KAAK,CAAC,uBAAuB;QAC3B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAA;QACzC,OAAO,QAAQ,CAAC,oBAAoB,CAAA;IACtC,CAAC;IAED,KAAK,CAAC,uBAAuB,CAAC,OAAgB;QAC5C,MAAM,IAAI,CAAC,cAAc,CAAC,EAAC,oBAAoB,EAAE,OAAO,EAAC,CAAC,CAAA;IAC5D,CAAC;IAED,KAAK,CAAC,yBAAyB;QAC7B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAA;QACzC,OAAO,QAAQ,CAAC,sBAAsB,CAAA;IACxC,CAAC;IAED,KAAK,CAAC,yBAAyB,CAAC,OAAgB;QAC9C,MAAM,IAAI,CAAC,cAAc,CAAC,EAAC,sBAAsB,EAAE,OAAO,EAAC,CAAC,CAAA;IAC9D,CAAC;CACF;AAED,MAAM,CAAC,MAAM,sBAAsB,GAAG,sBAAsB,CAAC,WAAW,EAAE,CAAA","sourcesContent":["import {storage} from \"../../utils/storage/storage\"\n\nexport interface GallerySettings {\n autoSaveToCameraRoll: boolean\n autoSaveDisableWarningShown: boolean\n imageProcessingEnabled: boolean\n}\n\nexport class GallerySettingsService {\n private static instance: GallerySettingsService\n private readonly SETTINGS_KEY = \"gallery_settings\"\n private readonly DEFAULT_SETTINGS: GallerySettings = {\n autoSaveToCameraRoll: true, // Default ON\n autoSaveDisableWarningShown: false,\n imageProcessingEnabled: true, // Lens coefficients calibrated from chessboard photos\n }\n\n private constructor() {}\n\n static getInstance(): GallerySettingsService {\n if (!GallerySettingsService.instance) {\n GallerySettingsService.instance = new GallerySettingsService()\n }\n return GallerySettingsService.instance\n }\n\n async getSettings(): Promise<GallerySettings> {\n const res = storage.load<GallerySettings>(this.SETTINGS_KEY)\n if (res.is_error()) {\n // Not an error - just means settings haven't been saved yet (first use)\n // Return defaults silently\n return this.DEFAULT_SETTINGS\n }\n const stored = res.value\n return {...this.DEFAULT_SETTINGS, ...stored}\n }\n\n async updateSettings(settings: Partial<GallerySettings>): Promise<void> {\n const current = await this.getSettings()\n const updated = {...current, ...settings}\n const res = await storage.save(this.SETTINGS_KEY, updated)\n if (res.is_error()) {\n console.error(\"[GallerySettings] Error saving settings:\", res.error)\n throw res.error\n }\n console.log(\"[GallerySettings] Settings updated:\", updated)\n }\n\n async getAutoSaveToCameraRoll(): Promise<boolean> {\n const settings = await this.getSettings()\n return settings.autoSaveToCameraRoll\n }\n\n async setAutoSaveToCameraRoll(enabled: boolean): Promise<void> {\n await this.updateSettings({autoSaveToCameraRoll: enabled})\n }\n\n async getImageProcessingEnabled(): Promise<boolean> {\n const settings = await this.getSettings()\n return settings.imageProcessingEnabled\n }\n\n async setImageProcessingEnabled(enabled: boolean): Promise<void> {\n await this.updateSettings({imageProcessingEnabled: enabled})\n }\n}\n\nexport const gallerySettingsService = GallerySettingsService.getInstance()\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"gallerySyncService.d.ts","sourceRoot":"","sources":["../../../src/services/asg/gallerySyncService.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA0DH,cAAM,kBAAkB;IACtB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAoB;IAC3C,OAAO,CAAC,yBAAyB,CAAQ;IACzC,OAAO,CAAC,wBAAwB,CAAsB;IACtD,OAAO,CAAC,qBAAqB,CAAsB;IACnD,OAAO,CAAC,eAAe,CAA+B;IACtD,OAAO,CAAC,aAAa,CAAQ;IAC7B,OAAO,CAAC,uBAAuB,CAA4B;IAC3D,OAAO,CAAC,oBAAoB,CAA4D;IACxF,OAAO,CAAC,mBAAmB,CAAQ;IAInC,OAAO,CAAC,oBAAoB,CAAsB;IAClD,OAAO,CAAC,oBAAoB,CAAsB;IAClD,OAAO,CAAC,gBAAgB,CAA6B;IACrD,OAAO,CAAC,YAAY,CAAQ;IAE5B,OAAO;IAEP,MAAM,CAAC,WAAW,IAAI,kBAAkB;IAOxC;;OAEG;IACH,UAAU,IAAI,IAAI;IA4BlB;;OAEG;IACH,OAAO,IAAI,IAAI;IAiCf;;OAEG;IACH,OAAO,CAAC,yBAAyB,CAmChC;IAED;;OAEG;IACH,OAAO,CAAC,oBAAoB,CAkE3B;IAED;;OAEG;IACH,OAAO,CAAC,mBAAmB,CAK1B;IAED;;OAEG;IACH,OAAO,CAAC,yBAAyB,CA8DhC;IAED;;OAEG;IACH,OAAO,CAAC,kBAAkB,CAYzB;IAED;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAYhC;;;;;;OAMG;YACW,yBAAyB;IAqBvC;;;;;OAKG;YACW,yBAAyB;IAkBvC,OAAO,CAAC,oBAAoB;YAWd,YAAY;IAyV1B;;;OAGG;YACW,uBAAuB;IA8BrC;;;;;OAKG;YACW,oBAAoB;YAobpB,iBAAiB;IAK/B;;OAEG;YACW,mBAAmB;IA+CjC;;OAEG;YACW,iBAAiB;IAwJ/B;;;;;OAKG;YACW,eAAe;IAsR7B;;;OAGG;YACW,sBAAsB;IAkMpC;;OAEG;YACW,cAAc;IAuF5B;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAgCjC;;OAEG;YACW,YAAY;IAc1B;;OAEG;IACG,qBAAqB,IAAI,OAAO,CAAC,OAAO,CAAC;IAY/C;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IA2BjC;;OAEG;IACG,yBAAyB,IAAI,OAAO,CAAC,IAAI,CAAC;IAQhD,yFAAyF;IACzF,cAAc,IAAI,OAAO;IAIzB;;;OAGG;IACH,SAAS,IAAI,OAAO;CAMrB;AAED,eAAO,MAAM,kBAAkB,oBAAmC,CAAA"}
1
+ {"version":3,"file":"gallerySyncService.d.ts","sourceRoot":"","sources":["../../../src/services/asg/gallerySyncService.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA6DH,cAAM,kBAAkB;IACtB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAoB;IAC3C,OAAO,CAAC,yBAAyB,CAAQ;IACzC,OAAO,CAAC,wBAAwB,CAAsB;IACtD,OAAO,CAAC,qBAAqB,CAAsB;IACnD,OAAO,CAAC,eAAe,CAA+B;IACtD,OAAO,CAAC,aAAa,CAAQ;IAC7B,OAAO,CAAC,uBAAuB,CAA4B;IAC3D,OAAO,CAAC,oBAAoB,CAA4D;IACxF,OAAO,CAAC,mBAAmB,CAAQ;IAInC,OAAO,CAAC,oBAAoB,CAAsB;IAClD,OAAO,CAAC,oBAAoB,CAAsB;IAClD,OAAO,CAAC,gBAAgB,CAA6B;IACrD,OAAO,CAAC,YAAY,CAAQ;IAE5B,OAAO;IAEP,MAAM,CAAC,WAAW,IAAI,kBAAkB;IAOxC;;OAEG;IACH,UAAU,IAAI,IAAI;IA8BlB;;OAEG;IACH,OAAO,IAAI,IAAI;IAuCf;;OAEG;IACH,OAAO,CAAC,yBAAyB,CAoChC;IAED;;OAEG;IACH,OAAO,CAAC,oBAAoB,CAuE3B;IAED;;OAEG;IACH,OAAO,CAAC,mBAAmB,CAK1B;IAED;;OAEG;IACH,OAAO,CAAC,yBAAyB,CA8DhC;IAED;;OAEG;IACH,OAAO,CAAC,kBAAkB,CAYzB;IAED;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAchC;;;;;;OAMG;YACW,yBAAyB;IAqBvC;;;;;OAKG;YACW,yBAAyB;IAkBvC,OAAO,CAAC,oBAAoB;YAWd,YAAY;IAiX1B;;;OAGG;YACW,uBAAuB;IA8BrC;;;;;OAKG;YACW,oBAAoB;YAwbpB,iBAAiB;IAqC/B;;OAEG;YACW,mBAAmB;IA+CjC;;OAEG;YACW,iBAAiB;IAqK/B;;;;;OAKG;YACW,eAAe;IAkR7B;;;OAGG;YACW,sBAAsB;IA0MpC;;OAEG;YACW,cAAc;IAqG5B;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAgCjC;;OAEG;YACW,YAAY;IAe1B;;OAEG;IACG,qBAAqB,IAAI,OAAO,CAAC,OAAO,CAAC;IAY/C;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IA2BjC;;OAEG;IACG,yBAAyB,IAAI,OAAO,CAAC,IAAI,CAAC;IAQhD,yFAAyF;IACzF,cAAc,IAAI,OAAO;IAIzB;;;OAGG;IACH,SAAS,IAAI,OAAO;CAMrB;AAED,eAAO,MAAM,kBAAkB,oBAAmC,CAAA"}