@mentra/engine 0.1.0-dev.0 → 3.1.0-beta.100

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 (574) hide show
  1. package/README.md +73 -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/ota-transport.d.ts +2 -0
  11. package/build/bluetooth-sdk/ota-transport.d.ts.map +1 -0
  12. package/build/bluetooth-sdk/ota-transport.js +2 -0
  13. package/build/bluetooth-sdk/ota-transport.js.map +1 -0
  14. package/build/bluetooth-sdk/photo-receiver.d.ts +3 -0
  15. package/build/bluetooth-sdk/photo-receiver.d.ts.map +1 -0
  16. package/build/bluetooth-sdk/photo-receiver.js +3 -0
  17. package/build/bluetooth-sdk/photo-receiver.js.map +1 -0
  18. package/build/bluetooth-sdk/react.d.ts +2 -0
  19. package/build/bluetooth-sdk/react.d.ts.map +1 -0
  20. package/build/bluetooth-sdk/react.js +2 -0
  21. package/build/bluetooth-sdk/react.js.map +1 -0
  22. package/build/bluetooth-sdk/types.d.ts +2 -0
  23. package/build/bluetooth-sdk/types.d.ts.map +1 -0
  24. package/build/bluetooth-sdk/types.js +2 -0
  25. package/build/bluetooth-sdk/types.js.map +1 -0
  26. package/build/engine.d.ts +29 -18
  27. package/build/engine.d.ts.map +1 -1
  28. package/build/engine.js +9 -4
  29. package/build/engine.js.map +1 -1
  30. package/build/facades/dev.d.ts +3 -2
  31. package/build/facades/dev.d.ts.map +1 -1
  32. package/build/facades/dev.js +18 -12
  33. package/build/facades/dev.js.map +1 -1
  34. package/build/facades/display.d.ts +1 -1
  35. package/build/facades/display.d.ts.map +1 -1
  36. package/build/facades/display.js +1 -1
  37. package/build/facades/display.js.map +1 -1
  38. package/build/facades/gallery.js +1 -1
  39. package/build/facades/gallery.js.map +1 -1
  40. package/build/facades/glasses.d.ts +4 -13
  41. package/build/facades/glasses.d.ts.map +1 -1
  42. package/build/facades/glasses.js +21 -6
  43. package/build/facades/glasses.js.map +1 -1
  44. package/build/facades/glassesSettings.d.ts.map +1 -1
  45. package/build/facades/glassesSettings.js +1 -0
  46. package/build/facades/glassesSettings.js.map +1 -1
  47. package/build/facades/miniapps.d.ts +4 -0
  48. package/build/facades/miniapps.d.ts.map +1 -1
  49. package/build/facades/miniapps.js +5 -0
  50. package/build/facades/miniapps.js.map +1 -1
  51. package/build/facades/ota.d.ts +24 -21
  52. package/build/facades/ota.d.ts.map +1 -1
  53. package/build/facades/ota.js +31 -12
  54. package/build/facades/ota.js.map +1 -1
  55. package/build/facades/pairing.d.ts +12 -5
  56. package/build/facades/pairing.d.ts.map +1 -1
  57. package/build/facades/pairing.js +93 -17
  58. package/build/facades/pairing.js.map +1 -1
  59. package/build/facades/permissions.d.ts +10 -0
  60. package/build/facades/permissions.d.ts.map +1 -1
  61. package/build/facades/permissions.js +10 -0
  62. package/build/facades/permissions.js.map +1 -1
  63. package/build/facades/phoneNotifications.d.ts +0 -4
  64. package/build/facades/phoneNotifications.d.ts.map +1 -1
  65. package/build/facades/phoneNotifications.js +4 -14
  66. package/build/facades/phoneNotifications.js.map +1 -1
  67. package/build/facades/speech.d.ts +7 -6
  68. package/build/facades/speech.d.ts.map +1 -1
  69. package/build/facades/speech.js +1 -1
  70. package/build/facades/speech.js.map +1 -1
  71. package/build/generated/releaseMetadata.d.ts +12 -0
  72. package/build/generated/releaseMetadata.d.ts.map +1 -0
  73. package/build/generated/releaseMetadata.js +10 -0
  74. package/build/generated/releaseMetadata.js.map +1 -0
  75. package/build/index.d.ts +12 -10
  76. package/build/index.d.ts.map +1 -1
  77. package/build/index.js +7 -6
  78. package/build/index.js.map +1 -1
  79. package/build/react/MentraLiveOtaFlow.d.ts +44 -0
  80. package/build/react/MentraLiveOtaFlow.d.ts.map +1 -0
  81. package/build/react/MentraLiveOtaFlow.js +430 -0
  82. package/build/react/MentraLiveOtaFlow.js.map +1 -0
  83. package/build/react/index.d.ts +3 -0
  84. package/build/react/index.d.ts.map +1 -0
  85. package/build/react/index.js +3 -0
  86. package/build/react/index.js.map +1 -0
  87. package/build/react/useEngineSnapshot.d.ts +2 -0
  88. package/build/react/useEngineSnapshot.d.ts.map +1 -0
  89. package/build/react/useEngineSnapshot.js +14 -0
  90. package/build/react/useEngineSnapshot.js.map +1 -0
  91. package/build/react/useMentraLiveOta.d.ts +84 -0
  92. package/build/react/useMentraLiveOta.d.ts.map +1 -0
  93. package/build/react/useMentraLiveOta.js +627 -0
  94. package/build/react/useMentraLiveOta.js.map +1 -0
  95. package/build/runtime/bootstrap.d.ts +24 -1
  96. package/build/runtime/bootstrap.d.ts.map +1 -1
  97. package/build/runtime/bootstrap.js +17 -0
  98. package/build/runtime/bootstrap.js.map +1 -1
  99. package/build/runtime/scanQrSeam.d.ts +7 -0
  100. package/build/runtime/scanQrSeam.d.ts.map +1 -0
  101. package/build/runtime/scanQrSeam.js +16 -0
  102. package/build/runtime/scanQrSeam.js.map +1 -0
  103. package/build/services/AppRegistry.d.ts +41 -57
  104. package/build/services/AppRegistry.d.ts.map +1 -1
  105. package/build/services/AppRegistry.js +208 -144
  106. package/build/services/AppRegistry.js.map +1 -1
  107. package/build/services/AudioCloudUplink.d.ts +12 -0
  108. package/build/services/AudioCloudUplink.d.ts.map +1 -1
  109. package/build/services/AudioCloudUplink.js +22 -1
  110. package/build/services/AudioCloudUplink.js.map +1 -1
  111. package/build/services/AudioPlaybackService.d.ts +41 -2
  112. package/build/services/AudioPlaybackService.d.ts.map +1 -1
  113. package/build/services/AudioPlaybackService.js +250 -33
  114. package/build/services/AudioPlaybackService.js.map +1 -1
  115. package/build/services/BlobStore.d.ts +4 -1
  116. package/build/services/BlobStore.d.ts.map +1 -1
  117. package/build/services/BlobStore.js +80 -19
  118. package/build/services/BlobStore.js.map +1 -1
  119. package/build/services/CloudAudioSubscriptionSync.d.ts.map +1 -1
  120. package/build/services/CloudAudioSubscriptionSync.js +13 -1
  121. package/build/services/CloudAudioSubscriptionSync.js.map +1 -1
  122. package/build/services/CloudClientService.d.ts +15 -0
  123. package/build/services/CloudClientService.d.ts.map +1 -1
  124. package/build/services/CloudClientService.js +93 -1
  125. package/build/services/CloudClientService.js.map +1 -1
  126. package/build/services/DeviceEventRouter.js +5 -5
  127. package/build/services/DeviceEventRouter.js.map +1 -1
  128. package/build/services/DisplayProcessor.d.ts +3 -3
  129. package/build/services/DisplayProcessor.js +3 -3
  130. package/build/services/DisplayProcessor.js.map +1 -1
  131. package/build/services/ForegroundLocationPermission.d.ts +13 -0
  132. package/build/services/ForegroundLocationPermission.d.ts.map +1 -0
  133. package/build/services/ForegroundLocationPermission.js +12 -0
  134. package/build/services/ForegroundLocationPermission.js.map +1 -0
  135. package/build/services/GlassesSettingsSync.d.ts.map +1 -1
  136. package/build/services/GlassesSettingsSync.js +9 -3
  137. package/build/services/GlassesSettingsSync.js.map +1 -1
  138. package/build/services/GlassesStatusProjection.d.ts +15 -1
  139. package/build/services/GlassesStatusProjection.d.ts.map +1 -1
  140. package/build/services/GlassesStatusProjection.js +18 -11
  141. package/build/services/GlassesStatusProjection.js.map +1 -1
  142. package/build/services/HotspotOtaTransport.d.ts +29 -0
  143. package/build/services/HotspotOtaTransport.d.ts.map +1 -0
  144. package/build/services/HotspotOtaTransport.js +147 -0
  145. package/build/services/HotspotOtaTransport.js.map +1 -0
  146. package/build/services/HotspotShutdown.d.ts +17 -0
  147. package/build/services/HotspotShutdown.d.ts.map +1 -0
  148. package/build/services/HotspotShutdown.js +29 -0
  149. package/build/services/HotspotShutdown.js.map +1 -0
  150. package/build/services/LocalDisplayManager.d.ts +17 -3
  151. package/build/services/LocalDisplayManager.d.ts.map +1 -1
  152. package/build/services/LocalDisplayManager.js +108 -23
  153. package/build/services/LocalDisplayManager.js.map +1 -1
  154. package/build/services/LocalMiniappRuntime.d.ts +74 -2
  155. package/build/services/LocalMiniappRuntime.d.ts.map +1 -1
  156. package/build/services/LocalMiniappRuntime.js +785 -291
  157. package/build/services/LocalMiniappRuntime.js.map +1 -1
  158. package/build/services/LocalMiniappStorage.d.ts +32 -0
  159. package/build/services/LocalMiniappStorage.d.ts.map +1 -0
  160. package/build/services/LocalMiniappStorage.js +66 -0
  161. package/build/services/LocalMiniappStorage.js.map +1 -0
  162. package/build/services/LocalMiniappUserIdentity.d.ts +20 -0
  163. package/build/services/LocalMiniappUserIdentity.d.ts.map +1 -0
  164. package/build/services/LocalMiniappUserIdentity.js +43 -0
  165. package/build/services/LocalMiniappUserIdentity.js.map +1 -0
  166. package/build/services/LocalSttFallbackCoordinator.d.ts +9 -6
  167. package/build/services/LocalSttFallbackCoordinator.d.ts.map +1 -1
  168. package/build/services/LocalSttFallbackCoordinator.js +18 -12
  169. package/build/services/LocalSttFallbackCoordinator.js.map +1 -1
  170. package/build/services/MicStateCoordinator.d.ts +42 -1
  171. package/build/services/MicStateCoordinator.d.ts.map +1 -1
  172. package/build/services/MicStateCoordinator.js +141 -3
  173. package/build/services/MicStateCoordinator.js.map +1 -1
  174. package/build/services/MiniappLauncher.d.ts.map +1 -1
  175. package/build/services/MiniappLauncher.js +23 -3
  176. package/build/services/MiniappLauncher.js.map +1 -1
  177. package/build/services/MiniappLiveness.d.ts +12 -0
  178. package/build/services/MiniappLiveness.d.ts.map +1 -0
  179. package/build/services/MiniappLiveness.js +16 -0
  180. package/build/services/MiniappLiveness.js.map +1 -0
  181. package/build/services/NativeHttpResponse.d.ts +3 -0
  182. package/build/services/NativeHttpResponse.d.ts.map +1 -0
  183. package/build/services/NativeHttpResponse.js +6 -0
  184. package/build/services/NativeHttpResponse.js.map +1 -0
  185. package/build/services/OtaArtifactDownloader.d.ts +65 -0
  186. package/build/services/OtaArtifactDownloader.d.ts.map +1 -0
  187. package/build/services/OtaArtifactDownloader.js +226 -0
  188. package/build/services/OtaArtifactDownloader.js.map +1 -0
  189. package/build/services/OtaAutoChain.d.ts +41 -0
  190. package/build/services/OtaAutoChain.d.ts.map +1 -0
  191. package/build/services/OtaAutoChain.js +91 -0
  192. package/build/services/OtaAutoChain.js.map +1 -0
  193. package/build/services/OtaErrorMapping.d.ts +18 -0
  194. package/build/services/OtaErrorMapping.d.ts.map +1 -0
  195. package/build/services/OtaErrorMapping.js +63 -0
  196. package/build/services/OtaErrorMapping.js.map +1 -0
  197. package/build/services/OtaInstallCoordinator.d.ts +120 -17
  198. package/build/services/OtaInstallCoordinator.d.ts.map +1 -1
  199. package/build/services/OtaInstallCoordinator.js +605 -136
  200. package/build/services/OtaInstallCoordinator.js.map +1 -1
  201. package/build/services/OtaService.d.ts.map +1 -1
  202. package/build/services/OtaService.js +9 -2
  203. package/build/services/OtaService.js.map +1 -1
  204. package/build/services/OtaUpdateCheckService.d.ts +42 -4
  205. package/build/services/OtaUpdateCheckService.d.ts.map +1 -1
  206. package/build/services/OtaUpdateCheckService.js +158 -26
  207. package/build/services/OtaUpdateCheckService.js.map +1 -1
  208. package/build/services/PhoneCalendarHelpers.d.ts +32 -0
  209. package/build/services/PhoneCalendarHelpers.d.ts.map +1 -0
  210. package/build/services/PhoneCalendarHelpers.js +157 -0
  211. package/build/services/PhoneCalendarHelpers.js.map +1 -0
  212. package/build/services/PhoneCalendarService.d.ts +5 -0
  213. package/build/services/PhoneCalendarService.d.ts.map +1 -0
  214. package/build/services/PhoneCalendarService.js +45 -0
  215. package/build/services/PhoneCalendarService.js.map +1 -0
  216. package/build/services/PhoneCameraFovCoordinator.d.ts +30 -0
  217. package/build/services/PhoneCameraFovCoordinator.d.ts.map +1 -0
  218. package/build/services/PhoneCameraFovCoordinator.js +194 -0
  219. package/build/services/PhoneCameraFovCoordinator.js.map +1 -0
  220. package/build/services/PhoneNotificationsSync.d.ts.map +1 -1
  221. package/build/services/PhoneNotificationsSync.js +12 -10
  222. package/build/services/PhoneNotificationsSync.js.map +1 -1
  223. package/build/services/PhonePhotoCoordinator.d.ts +26 -2
  224. package/build/services/PhonePhotoCoordinator.d.ts.map +1 -1
  225. package/build/services/PhonePhotoCoordinator.js +80 -10
  226. package/build/services/PhonePhotoCoordinator.js.map +1 -1
  227. package/build/services/PhoneStreamCoordinator.d.ts +8 -1
  228. package/build/services/PhoneStreamCoordinator.d.ts.map +1 -1
  229. package/build/services/PhoneStreamCoordinator.js +125 -13
  230. package/build/services/PhoneStreamCoordinator.js.map +1 -1
  231. package/build/services/PhoneVideoCoordinator.d.ts +2 -0
  232. package/build/services/PhoneVideoCoordinator.d.ts.map +1 -1
  233. package/build/services/PhoneVideoCoordinator.js +10 -0
  234. package/build/services/PhoneVideoCoordinator.js.map +1 -1
  235. package/build/services/SceneRenderer.d.ts.map +1 -1
  236. package/build/services/SceneRenderer.js +15 -0
  237. package/build/services/SceneRenderer.js.map +1 -1
  238. package/build/services/SentenceTtsPipeline.d.ts +31 -0
  239. package/build/services/SentenceTtsPipeline.d.ts.map +1 -0
  240. package/build/services/SentenceTtsPipeline.js +67 -0
  241. package/build/services/SentenceTtsPipeline.js.map +1 -0
  242. package/build/services/StreamLifecycleController.d.ts +3 -3
  243. package/build/services/StreamLifecycleController.js +3 -3
  244. package/build/services/StreamLifecycleController.js.map +1 -1
  245. package/build/services/SupportProfileSync.d.ts +22 -0
  246. package/build/services/SupportProfileSync.d.ts.map +1 -0
  247. package/build/services/SupportProfileSync.js +213 -0
  248. package/build/services/SupportProfileSync.js.map +1 -0
  249. package/build/services/TranscriptionRouting.d.ts +12 -0
  250. package/build/services/TranscriptionRouting.d.ts.map +1 -0
  251. package/build/services/TranscriptionRouting.js +24 -0
  252. package/build/services/TranscriptionRouting.js.map +1 -0
  253. package/build/services/TtsTextSanitizer.d.ts +5 -0
  254. package/build/services/TtsTextSanitizer.d.ts.map +1 -0
  255. package/build/services/TtsTextSanitizer.js +61 -0
  256. package/build/services/TtsTextSanitizer.js.map +1 -0
  257. package/build/services/WifiAdbRequest.d.ts +17 -0
  258. package/build/services/WifiAdbRequest.d.ts.map +1 -0
  259. package/build/services/WifiAdbRequest.js +35 -0
  260. package/build/services/WifiAdbRequest.js.map +1 -0
  261. package/build/services/asg/asgCameraApi.d.ts +43 -0
  262. package/build/services/asg/asgCameraApi.d.ts.map +1 -1
  263. package/build/services/asg/asgCameraApi.js +509 -26
  264. package/build/services/asg/asgCameraApi.js.map +1 -1
  265. package/build/services/asg/cameraRollExportCoordinator.d.ts +60 -0
  266. package/build/services/asg/cameraRollExportCoordinator.d.ts.map +1 -0
  267. package/build/services/asg/cameraRollExportCoordinator.js +618 -0
  268. package/build/services/asg/cameraRollExportCoordinator.js.map +1 -0
  269. package/build/services/asg/cameraRollExportLedger.d.ts +44 -0
  270. package/build/services/asg/cameraRollExportLedger.d.ts.map +1 -0
  271. package/build/services/asg/cameraRollExportLedger.js +78 -0
  272. package/build/services/asg/cameraRollExportLedger.js.map +1 -0
  273. package/build/services/asg/galleryNotices.d.ts +1 -1
  274. package/build/services/asg/galleryNotices.d.ts.map +1 -1
  275. package/build/services/asg/galleryNotices.js.map +1 -1
  276. package/build/services/asg/galleryPathMigration.d.ts +3 -0
  277. package/build/services/asg/galleryPathMigration.d.ts.map +1 -0
  278. package/build/services/asg/galleryPathMigration.js +26 -0
  279. package/build/services/asg/galleryPathMigration.js.map +1 -0
  280. package/build/services/asg/gallerySettingsService.d.ts +1 -0
  281. package/build/services/asg/gallerySettingsService.d.ts.map +1 -1
  282. package/build/services/asg/gallerySettingsService.js +2 -0
  283. package/build/services/asg/gallerySettingsService.js.map +1 -1
  284. package/build/services/asg/gallerySyncService.d.ts.map +1 -1
  285. package/build/services/asg/gallerySyncService.js +162 -56
  286. package/build/services/asg/gallerySyncService.js.map +1 -1
  287. package/build/services/asg/galleryTransferLedger.d.ts +58 -0
  288. package/build/services/asg/galleryTransferLedger.d.ts.map +1 -0
  289. package/build/services/asg/galleryTransferLedger.js +225 -0
  290. package/build/services/asg/galleryTransferLedger.js.map +1 -0
  291. package/build/services/asg/localNetworkTransport.d.ts +15 -0
  292. package/build/services/asg/localNetworkTransport.d.ts.map +1 -0
  293. package/build/services/asg/localNetworkTransport.js +145 -0
  294. package/build/services/asg/localNetworkTransport.js.map +1 -0
  295. package/build/services/asg/localStorageService.d.ts +18 -0
  296. package/build/services/asg/localStorageService.d.ts.map +1 -1
  297. package/build/services/asg/localStorageService.js +168 -19
  298. package/build/services/asg/localStorageService.js.map +1 -1
  299. package/build/services/asg/mediaProcessingQueue.d.ts +10 -0
  300. package/build/services/asg/mediaProcessingQueue.d.ts.map +1 -1
  301. package/build/services/asg/mediaProcessingQueue.js +193 -62
  302. package/build/services/asg/mediaProcessingQueue.js.map +1 -1
  303. package/build/services/audioPlaybackAssets.d.ts +8 -0
  304. package/build/services/audioPlaybackAssets.d.ts.map +1 -0
  305. package/build/services/audioPlaybackAssets.js +7 -0
  306. package/build/services/audioPlaybackAssets.js.map +1 -0
  307. package/build/services/gallerySyncClock.js +1 -1
  308. package/build/services/gallerySyncClock.js.map +1 -1
  309. package/build/services/glassesClockSync.d.ts.map +1 -1
  310. package/build/services/glassesClockSync.js +7 -3
  311. package/build/services/glassesClockSync.js.map +1 -1
  312. package/build/services/manifestActions.d.ts +7 -0
  313. package/build/services/manifestActions.d.ts.map +1 -0
  314. package/build/services/manifestActions.js +25 -0
  315. package/build/services/manifestActions.js.map +1 -0
  316. package/build/services/otaDisplayState.d.ts +23 -12
  317. package/build/services/otaDisplayState.d.ts.map +1 -1
  318. package/build/services/otaDisplayState.js +36 -14
  319. package/build/services/otaDisplayState.js.map +1 -1
  320. package/build/services/otaInstallPolicy.d.ts +20 -4
  321. package/build/services/otaInstallPolicy.d.ts.map +1 -1
  322. package/build/services/otaInstallPolicy.js +28 -3
  323. package/build/services/otaInstallPolicy.js.map +1 -1
  324. package/build/services/otaLegacyMapping.d.ts +1 -1
  325. package/build/services/otaLegacyMapping.d.ts.map +1 -1
  326. package/build/services/otaLegacyMapping.js.map +1 -1
  327. package/build/services/otaManifestPolicy.d.ts +14 -0
  328. package/build/services/otaManifestPolicy.d.ts.map +1 -0
  329. package/build/services/otaManifestPolicy.js +19 -0
  330. package/build/services/otaManifestPolicy.js.map +1 -0
  331. package/build/services/otaManifestUrl.d.ts +3 -0
  332. package/build/services/otaManifestUrl.d.ts.map +1 -0
  333. package/build/services/otaManifestUrl.js +38 -0
  334. package/build/services/otaManifestUrl.js.map +1 -0
  335. package/build/services/otaReleaseVersion.d.ts +10 -0
  336. package/build/services/otaReleaseVersion.d.ts.map +1 -0
  337. package/build/services/otaReleaseVersion.js +14 -0
  338. package/build/services/otaReleaseVersion.js.map +1 -0
  339. package/build/services/slimStreamStatus.d.ts +11 -0
  340. package/build/services/slimStreamStatus.d.ts.map +1 -1
  341. package/build/services/slimStreamStatus.js +14 -4
  342. package/build/services/slimStreamStatus.js.map +1 -1
  343. package/build/stores/appVisibility.d.ts +3 -0
  344. package/build/stores/appVisibility.d.ts.map +1 -0
  345. package/build/stores/appVisibility.js +3 -0
  346. package/build/stores/appVisibility.js.map +1 -0
  347. package/build/stores/apps.d.ts.map +1 -1
  348. package/build/stores/apps.js +18 -1
  349. package/build/stores/apps.js.map +1 -1
  350. package/build/stores/bluetoothSettingKeys.d.ts.map +1 -1
  351. package/build/stores/bluetoothSettingKeys.js +2 -0
  352. package/build/stores/bluetoothSettingKeys.js.map +1 -1
  353. package/build/stores/core.d.ts +3 -3
  354. package/build/stores/core.d.ts.map +1 -1
  355. package/build/stores/core.js.map +1 -1
  356. package/build/stores/gallerySync.d.ts +2 -0
  357. package/build/stores/gallerySync.d.ts.map +1 -1
  358. package/build/stores/gallerySync.js +2 -0
  359. package/build/stores/gallerySync.js.map +1 -1
  360. package/build/stores/glasses.d.ts +10 -4
  361. package/build/stores/glasses.d.ts.map +1 -1
  362. package/build/stores/glasses.js +3 -0
  363. package/build/stores/glasses.js.map +1 -1
  364. package/build/stores/settings.d.ts +17 -0
  365. package/build/stores/settings.d.ts.map +1 -1
  366. package/build/stores/settings.js +157 -17
  367. package/build/stores/settings.js.map +1 -1
  368. package/build/types/applet.d.ts +3 -1
  369. package/build/types/applet.d.ts.map +1 -1
  370. package/build/types/applet.js +1 -1
  371. package/build/types/applet.js.map +1 -1
  372. package/build/types/asg.d.ts +7 -0
  373. package/build/types/asg.d.ts.map +1 -1
  374. package/build/types/asg.js.map +1 -1
  375. package/build/types/capabilities/even-realities-g1.d.ts.map +1 -1
  376. package/build/types/capabilities/even-realities-g1.js +2 -0
  377. package/build/types/capabilities/even-realities-g1.js.map +1 -1
  378. package/build/types/capabilities/even-realities-g2.d.ts.map +1 -1
  379. package/build/types/capabilities/even-realities-g2.js +2 -0
  380. package/build/types/capabilities/even-realities-g2.js.map +1 -1
  381. package/build/types/capabilities/mentra-display.d.ts.map +1 -1
  382. package/build/types/capabilities/mentra-display.js +2 -0
  383. package/build/types/capabilities/mentra-display.js.map +1 -1
  384. package/build/types/capabilities/mentra-live.d.ts.map +1 -1
  385. package/build/types/capabilities/mentra-live.js +2 -0
  386. package/build/types/capabilities/mentra-live.js.map +1 -1
  387. package/build/types/capabilities/nimo.d.ts +9 -0
  388. package/build/types/capabilities/nimo.d.ts.map +1 -0
  389. package/build/types/capabilities/nimo.js +57 -0
  390. package/build/types/capabilities/nimo.js.map +1 -0
  391. package/build/types/capabilities/none.d.ts.map +1 -1
  392. package/build/types/capabilities/none.js +2 -0
  393. package/build/types/capabilities/none.js.map +1 -1
  394. package/build/types/capabilities/simulated-glasses.d.ts.map +1 -1
  395. package/build/types/capabilities/simulated-glasses.js +2 -0
  396. package/build/types/capabilities/simulated-glasses.js.map +1 -1
  397. package/build/types/capabilities/vuzix-z100.d.ts.map +1 -1
  398. package/build/types/capabilities/vuzix-z100.js +2 -0
  399. package/build/types/capabilities/vuzix-z100.js.map +1 -1
  400. package/build/types/enums.d.ts +4 -26
  401. package/build/types/enums.d.ts.map +1 -1
  402. package/build/types/enums.js +3 -27
  403. package/build/types/enums.js.map +1 -1
  404. package/build/types/hardware.d.ts +6 -14
  405. package/build/types/hardware.d.ts.map +1 -1
  406. package/build/types/hardware.js +18 -4
  407. package/build/types/hardware.js.map +1 -1
  408. package/build/types/index.d.ts +3 -7
  409. package/build/types/index.d.ts.map +1 -1
  410. package/build/types/index.js +3 -7
  411. package/build/types/index.js.map +1 -1
  412. package/build/utils/configuredDevHost.d.ts +6 -0
  413. package/build/utils/configuredDevHost.d.ts.map +1 -0
  414. package/build/utils/configuredDevHost.js +19 -0
  415. package/build/utils/configuredDevHost.js.map +1 -0
  416. package/build/utils/devMiniappLaunch.d.ts +19 -8
  417. package/build/utils/devMiniappLaunch.d.ts.map +1 -1
  418. package/build/utils/devMiniappLaunch.js +144 -21
  419. package/build/utils/devMiniappLaunch.js.map +1 -1
  420. package/build/utils/diagnosticContext.d.ts.map +1 -1
  421. package/build/utils/diagnosticContext.js +15 -17
  422. package/build/utils/diagnosticContext.js.map +1 -1
  423. package/build/utils/display/composer/ColumnComposer.d.ts +1 -1
  424. package/build/utils/display/composer/ColumnComposer.js +1 -1
  425. package/build/utils/display/composer/ColumnComposer.js.map +1 -1
  426. package/build/utils/hardware/hardware.d.ts.map +1 -1
  427. package/build/utils/hardware/hardware.js +7 -3
  428. package/build/utils/hardware/hardware.js.map +1 -1
  429. package/build/utils/miniappDiagnostics.d.ts +64 -0
  430. package/build/utils/miniappDiagnostics.d.ts.map +1 -0
  431. package/build/utils/miniappDiagnostics.js +173 -0
  432. package/build/utils/miniappDiagnostics.js.map +1 -0
  433. package/build/utils/permissions/MediaLibraryPermissions.d.ts +11 -0
  434. package/build/utils/permissions/MediaLibraryPermissions.d.ts.map +1 -1
  435. package/build/utils/permissions/MediaLibraryPermissions.js +27 -4
  436. package/build/utils/permissions/MediaLibraryPermissions.js.map +1 -1
  437. package/build/utils/timers/timers.d.ts.map +1 -1
  438. package/build/utils/timers/timers.js +55 -18
  439. package/build/utils/timers/timers.js.map +1 -1
  440. package/package.json +66 -31
  441. package/src/assets/silence.wav +0 -0
  442. package/src/bluetooth-sdk/debug.ts +1 -0
  443. package/src/bluetooth-sdk/index.ts +2 -0
  444. package/src/bluetooth-sdk/ota-transport.ts +1 -0
  445. package/src/bluetooth-sdk/photo-receiver.ts +2 -0
  446. package/src/bluetooth-sdk/react.ts +1 -0
  447. package/src/bluetooth-sdk/types.ts +1 -0
  448. package/src/engine.ts +9 -4
  449. package/src/facades/dev.ts +17 -12
  450. package/src/facades/display.ts +1 -1
  451. package/src/facades/gallery.ts +1 -1
  452. package/src/facades/glasses.ts +20 -7
  453. package/src/facades/glassesSettings.ts +5 -0
  454. package/src/facades/miniapps.ts +7 -0
  455. package/src/facades/ota.ts +41 -13
  456. package/src/facades/pairing.ts +103 -23
  457. package/src/facades/permissions.ts +14 -0
  458. package/src/facades/phoneNotifications.ts +4 -13
  459. package/src/facades/speech.ts +21 -7
  460. package/src/generated/releaseMetadata.ts +20 -0
  461. package/src/index.ts +42 -13
  462. package/src/react/MentraLiveOtaFlow.tsx +754 -0
  463. package/src/react/index.ts +21 -0
  464. package/src/react/useEngineSnapshot.ts +16 -0
  465. package/src/react/useMentraLiveOta.ts +793 -0
  466. package/src/runtime/bootstrap.ts +33 -1
  467. package/src/runtime/scanQrSeam.ts +20 -0
  468. package/src/services/AppRegistry.ts +240 -149
  469. package/src/services/AudioCloudUplink.ts +23 -1
  470. package/src/services/AudioPlaybackService.ts +287 -38
  471. package/src/services/BlobStore.ts +79 -19
  472. package/src/services/CloudAudioSubscriptionSync.ts +13 -1
  473. package/src/services/CloudClientService.ts +96 -1
  474. package/src/services/DeviceEventRouter.ts +5 -5
  475. package/src/services/DisplayProcessor.ts +3 -3
  476. package/src/services/ForegroundLocationPermission.ts +24 -0
  477. package/src/services/GlassesSettingsSync.ts +9 -3
  478. package/src/services/GlassesStatusProjection.ts +20 -11
  479. package/src/services/HotspotOtaTransport.ts +185 -0
  480. package/src/services/HotspotShutdown.ts +41 -0
  481. package/src/services/LocalDisplayManager.ts +114 -24
  482. package/src/services/LocalMiniappRuntime.ts +967 -346
  483. package/src/services/LocalMiniappStorage.ts +82 -0
  484. package/src/services/LocalMiniappUserIdentity.ts +46 -0
  485. package/src/services/LocalSttFallbackCoordinator.ts +19 -12
  486. package/src/services/MicStateCoordinator.ts +169 -4
  487. package/src/services/MiniappLauncher.ts +30 -3
  488. package/src/services/MiniappLiveness.ts +24 -0
  489. package/src/services/NativeHttpResponse.ts +6 -0
  490. package/src/services/OtaArtifactDownloader.ts +312 -0
  491. package/src/services/OtaAutoChain.ts +130 -0
  492. package/src/services/OtaErrorMapping.ts +80 -0
  493. package/src/services/OtaInstallCoordinator.ts +680 -151
  494. package/src/services/OtaService.ts +12 -7
  495. package/src/services/OtaUpdateCheckService.ts +205 -27
  496. package/src/services/PhoneCalendarHelpers.ts +212 -0
  497. package/src/services/PhoneCalendarService.ts +65 -0
  498. package/src/services/PhoneCameraFovCoordinator.ts +210 -0
  499. package/src/services/PhoneNotificationsSync.ts +12 -10
  500. package/src/services/PhonePhotoCoordinator.ts +117 -19
  501. package/src/services/PhoneStreamCoordinator.ts +139 -25
  502. package/src/services/PhoneVideoCoordinator.ts +11 -0
  503. package/src/services/SceneRenderer.ts +16 -0
  504. package/src/services/SentenceTtsPipeline.ts +106 -0
  505. package/src/services/StreamLifecycleController.ts +3 -3
  506. package/src/services/SupportProfileSync.ts +218 -0
  507. package/src/services/TranscriptionRouting.ts +37 -0
  508. package/src/services/TtsTextSanitizer.ts +66 -0
  509. package/src/services/WifiAdbRequest.ts +53 -0
  510. package/src/services/asg/asgCameraApi.ts +615 -33
  511. package/src/services/asg/cameraRollExportCoordinator.ts +627 -0
  512. package/src/services/asg/cameraRollExportLedger.ts +122 -0
  513. package/src/services/asg/galleryNotices.ts +1 -0
  514. package/src/services/asg/galleryPathMigration.ts +22 -0
  515. package/src/services/asg/gallerySettingsService.ts +3 -0
  516. package/src/services/asg/gallerySyncService.ts +184 -73
  517. package/src/services/asg/galleryTransferLedger.ts +312 -0
  518. package/src/services/asg/localNetworkTransport.ts +170 -0
  519. package/src/services/asg/localStorageService.ts +179 -24
  520. package/src/services/asg/mediaProcessingQueue.ts +209 -62
  521. package/src/services/audioPlaybackAssets.ts +8 -0
  522. package/src/services/gallerySyncClock.ts +1 -1
  523. package/src/services/glassesClockSync.ts +7 -3
  524. package/src/services/manifestActions.ts +30 -0
  525. package/src/services/otaDisplayState.ts +58 -17
  526. package/src/services/otaInstallPolicy.ts +34 -4
  527. package/src/services/otaLegacyMapping.ts +1 -1
  528. package/src/services/otaManifestPolicy.ts +42 -0
  529. package/src/services/otaManifestUrl.ts +44 -0
  530. package/src/services/otaReleaseVersion.ts +22 -0
  531. package/src/services/slimStreamStatus.ts +16 -5
  532. package/src/stores/appVisibility.ts +3 -0
  533. package/src/stores/apps.ts +19 -1
  534. package/src/stores/bluetoothSettingKeys.ts +2 -0
  535. package/src/stores/core.ts +4 -4
  536. package/src/stores/gallerySync.ts +4 -0
  537. package/src/stores/glasses.ts +16 -6
  538. package/src/stores/settings.ts +179 -18
  539. package/src/types/applet.ts +3 -1
  540. package/src/types/asg.ts +7 -0
  541. package/src/types/capabilities/even-realities-g1.ts +3 -0
  542. package/src/types/capabilities/even-realities-g2.ts +3 -0
  543. package/src/types/capabilities/mentra-display.ts +3 -0
  544. package/src/types/capabilities/mentra-live.ts +3 -0
  545. package/src/types/capabilities/nimo.ts +59 -0
  546. package/src/types/capabilities/none.ts +3 -0
  547. package/src/types/capabilities/simulated-glasses.ts +3 -0
  548. package/src/types/capabilities/vuzix-z100.ts +3 -0
  549. package/src/types/enums.ts +4 -28
  550. package/src/types/hardware.ts +23 -14
  551. package/src/types/index.ts +3 -6
  552. package/src/utils/configuredDevHost.ts +17 -0
  553. package/src/utils/devMiniappLaunch.ts +151 -23
  554. package/src/utils/diagnosticContext.ts +17 -17
  555. package/src/utils/display/composer/ColumnComposer.ts +1 -1
  556. package/src/utils/hardware/hardware.ts +7 -9
  557. package/src/utils/miniappDiagnostics.ts +226 -0
  558. package/src/utils/permissions/MediaLibraryPermissions.ts +35 -4
  559. package/src/utils/timers/timers.ts +57 -21
  560. package/build/devtools.d.ts +0 -11
  561. package/build/devtools.d.ts.map +0 -1
  562. package/build/devtools.js +0 -13
  563. package/build/devtools.js.map +0 -1
  564. package/build/internal.d.ts +0 -66
  565. package/build/internal.d.ts.map +0 -1
  566. package/build/internal.js +0 -89
  567. package/build/internal.js.map +0 -1
  568. package/build/services/asgOtaVersionUrl.d.ts +0 -2
  569. package/build/services/asgOtaVersionUrl.d.ts.map +0 -1
  570. package/build/services/asgOtaVersionUrl.js +0 -36
  571. package/build/services/asgOtaVersionUrl.js.map +0 -1
  572. package/src/devtools.ts +0 -13
  573. package/src/internal.ts +0 -158
  574. package/src/services/asgOtaVersionUrl.ts +0 -41
@@ -0,0 +1,793 @@
1
+ import {useCallback, useEffect, useMemo, useRef, useState} from "react"
2
+
3
+ import {ota} from "../facades/ota"
4
+ import {
5
+ beginOtaAutoChain,
6
+ clearOtaAutoChainReconnectWait,
7
+ isOtaAutoChainActive,
8
+ otaAutoChainFingerprint,
9
+ otaAutoChainReleaseRange,
10
+ otaAutoChainReconnectWaitRemaining,
11
+ stopOtaAutoChain,
12
+ tryAdvanceOtaAutoChain,
13
+ type OtaAutoChainReleaseRange,
14
+ } from "../services/OtaAutoChain"
15
+ import {
16
+ BES_INSTALL_RESTART_MESSAGE,
17
+ getOtaErrorMessage,
18
+ shouldRequireGlassesRebootForBesFailure,
19
+ shouldShowChangeWifiForOtaDownloadFailure,
20
+ } from "../services/OtaErrorMapping"
21
+ import type {OtaInstallSnapshot} from "../services/OtaInstallCoordinator"
22
+ import type {OtaCheckCurrentGlassesResult} from "../services/OtaUpdateCheckService"
23
+ import type {ReleaseChangelog} from "../facades/ota"
24
+ import {useEngineSnapshot} from "./useEngineSnapshot"
25
+
26
+ export type MentraLiveOtaFlowPage = "check" | "progress"
27
+
28
+ export type MentraLiveOtaScreen =
29
+ | "initializing"
30
+ | "checking"
31
+ | "finishing"
32
+ | "update_available"
33
+ | "battery_required"
34
+ | "wifi_required"
35
+ | "up_to_date"
36
+ | "dev_build"
37
+ | "check_failed"
38
+ | "update_info_unavailable"
39
+ | "starting"
40
+ | "preparing_hotspot"
41
+ | "updating"
42
+ | "restarting"
43
+ | "verifying"
44
+ | "complete"
45
+ | "failed"
46
+ | "disconnected"
47
+
48
+ export type MentraLiveOtaErrorCode =
49
+ | "check_failed"
50
+ | "update_info_unavailable"
51
+ | "install_failed"
52
+ | "bes_restart_required"
53
+
54
+ export type MentraLiveOtaError = {
55
+ code: MentraLiveOtaErrorCode
56
+ message: string
57
+ }
58
+
59
+ export type MentraLiveOtaTransport = "wifi" | "hotspot"
60
+ export type MentraLiveOtaHotspotPhase = "idle" | "downloading" | "starting_hotspot" | "joining_hotspot" | "serving"
61
+ export type MentraLiveOtaInstallPhase = "download" | "install"
62
+ export type MentraLiveOtaStep = "apk" | "mtk" | "bes"
63
+
64
+ export type MentraLiveOtaReleaseTransition = {
65
+ /** Current glasses software label. Temporarily backed by the reported ASG app version. */
66
+ fromVersion: string | null
67
+ /** Exact coordinated release identity for the selected OTA pin. */
68
+ toVersion: string
69
+ }
70
+
71
+ export type MentraLiveOtaState = {
72
+ screen: MentraLiveOtaScreen
73
+ connected: boolean
74
+ batteryLevel: number | null
75
+ transport: MentraLiveOtaTransport | null
76
+ updateRequired: boolean
77
+ versionChange: boolean
78
+ versionChangeConverged: boolean
79
+ versionChangePhase: "installing" | "restarting" | "verifying" | null
80
+ wifiConnected: boolean
81
+ wifiStatusKnown: boolean
82
+ hotspotSupported: boolean
83
+ hotspotPhase: MentraLiveOtaHotspotPhase
84
+ hotspotArtifactPercent: number | null
85
+ phase: MentraLiveOtaInstallPhase | null
86
+ step: MentraLiveOtaStep | null
87
+ currentStep: number | null
88
+ totalSteps: number | null
89
+ progress: number | null
90
+ installingApkOnly: boolean
91
+ firmwareRestarting: boolean
92
+ error: MentraLiveOtaError | null
93
+ canInstall: boolean
94
+ canRetry: boolean
95
+ canFinish: boolean
96
+ canDismiss: boolean
97
+ canDiscard: boolean
98
+ canOpenWifiSetup: boolean
99
+ continueDisabled: boolean
100
+ /** True only after an approved update session reaches a final no-update check. */
101
+ completedUpdate: boolean
102
+ /** Release labels for the offered or just-completed coordinated update. */
103
+ releaseTransition: MentraLiveOtaReleaseTransition | null
104
+ /** Release notes crossed by this update, newest first. Populated on completion. */
105
+ changelogs: ReleaseChangelog[]
106
+ }
107
+
108
+ export type UseMentraLiveOtaOptions = {
109
+ /** Entry page. `progress` exists for interrupted-session recovery. */
110
+ initialPage?: MentraLiveOtaFlowPage
111
+ /** Start Engine's OTA-only projections. Full Engine hosts should pass false. */
112
+ initializeRuntime?: boolean
113
+ /** Called after the final check or when an optional update is dismissed. */
114
+ onFinished?: () => void
115
+ /** Host-owned Wi-Fi setup for glasses without hotspot OTA support. */
116
+ onOpenWifiSetup?: () => void
117
+ /** Lets a host coordinate its connection overlay with OTA firmware restarts. */
118
+ onFirmwareRestartingChange?: (restarting: boolean, progressActive: boolean) => void
119
+ }
120
+
121
+ export type MentraLiveOtaController = {
122
+ state: MentraLiveOtaState
123
+ check: () => void
124
+ retryCheck: () => void
125
+ install: () => void
126
+ retryInstall: () => void
127
+ finish: () => void
128
+ discard: () => void
129
+ openWifiSetup: () => void
130
+ }
131
+
132
+ type CheckState = "checking" | "update_available" | "no_update" | "dev_build" | "error"
133
+
134
+ const AUTO_CHAIN_NETWORK_RETRY_DELAY_MS = 5000
135
+ const AUTO_CHAIN_COMPLETE_DELAY_MS = 750
136
+ export const MINIMUM_OTA_BATTERY_LEVEL = 25
137
+
138
+ function releaseRangeTargetVersion(result: OtaCheckCurrentGlassesResult): string | null {
139
+ return result.releaseVersion ?? result.updateInfo?.versionName ?? result.latestVersionInfo?.versionName ?? null
140
+ }
141
+
142
+ function currentReleaseVersion(appVersion: string | null): string | null {
143
+ const version = appVersion?.trim()
144
+ return version || null
145
+ }
146
+
147
+ function releaseTransitionFromRange(range: OtaAutoChainReleaseRange | null): MentraLiveOtaReleaseTransition | null {
148
+ if (!range?.releaseVersion) return null
149
+ return {fromVersion: range.fromVersion, toVersion: range.releaseVersion}
150
+ }
151
+
152
+ function releaseChangelogsForActiveChain(): ReleaseChangelog[] {
153
+ const range = otaAutoChainReleaseRange()
154
+ if (!range?.toVersion) return []
155
+ try {
156
+ return ota.getReleaseChangelogs(range.fromVersion, range.toVersion)
157
+ } catch {
158
+ try {
159
+ return ota.getReleaseChangelogs(null, range.toVersion)
160
+ } catch {
161
+ return []
162
+ }
163
+ }
164
+ }
165
+
166
+ function installProgress(snapshot: OtaInstallSnapshot): number | null {
167
+ if (snapshot.displayState !== "updating") return null
168
+ const {otaStatus} = snapshot
169
+ const isDownload = otaStatus?.phase === "download"
170
+ const totalSteps = otaStatus?.totalSteps ?? 1
171
+ const rawPercent = isDownload
172
+ ? (otaStatus?.stepPercent ?? 0)
173
+ : totalSteps >= 2
174
+ ? (otaStatus?.overallPercent ?? 0)
175
+ : (otaStatus?.stepPercent ?? 0)
176
+ return Math.min(Math.max(rawPercent, snapshot.mtkInstallStallSimulatedPercent ?? 0, 0), 100)
177
+ }
178
+
179
+ function progressScreen(snapshot: OtaInstallSnapshot): MentraLiveOtaScreen {
180
+ if (snapshot.versionChangePhase === "restarting") return "restarting"
181
+ if (snapshot.versionChangePhase === "verifying") return "verifying"
182
+ switch (snapshot.displayState) {
183
+ case "starting":
184
+ return snapshot.hotspotPhase === "idle" || snapshot.hotspotPhase === "serving" ? "starting" : "preparing_hotspot"
185
+ case "updating":
186
+ return "updating"
187
+ case "restarting":
188
+ return "restarting"
189
+ case "complete":
190
+ return "complete"
191
+ case "failed":
192
+ return "failed"
193
+ default:
194
+ return "disconnected"
195
+ }
196
+ }
197
+
198
+ /**
199
+ * Headless Mentra Live OTA flow. Engine owns checking, hotspot staging,
200
+ * APK/MTK/BES sequencing, restart recovery, retries, and verification; the host
201
+ * renders semantic state and invokes these idempotent actions.
202
+ */
203
+ export function useMentraLiveOta(options: UseMentraLiveOtaOptions = {}): MentraLiveOtaController {
204
+ const {
205
+ initialPage = "check",
206
+ initializeRuntime = true,
207
+ onFinished,
208
+ onFirmwareRestartingChange,
209
+ onOpenWifiSetup,
210
+ } = options
211
+ const otaSnapshot = useEngineSnapshot(ota.snapshot, ota.onSnapshot)
212
+ const installSnapshot = useEngineSnapshot(ota.installSession.snapshot, ota.installSession.onSnapshot)
213
+ const [page, setPage] = useState<MentraLiveOtaFlowPage>(initialPage)
214
+ const [runtimeReady, setRuntimeReady] = useState(!initializeRuntime)
215
+ const [checkState, setCheckState] = useState<CheckState>("checking")
216
+ const [isUpdateRequired, setIsUpdateRequired] = useState(true)
217
+ const [isVersionChange, setIsVersionChange] = useState(false)
218
+ const [errorKind, setErrorKind] = useState<"network" | "pin_unavailable">("network")
219
+ const [updateFingerprint, setUpdateFingerprint] = useState<string | null>(null)
220
+ const [offeredReleaseTransition, setOfferedReleaseTransition] = useState<MentraLiveOtaReleaseTransition | null>(null)
221
+ const [completedReleaseTransition, setCompletedReleaseTransition] = useState<MentraLiveOtaReleaseTransition | null>(
222
+ null,
223
+ )
224
+ const [completedUpdate, setCompletedUpdate] = useState(false)
225
+ const [completedChangelogs, setCompletedChangelogs] = useState<ReleaseChangelog[]>([])
226
+ const [batteryBlocked, setBatteryBlocked] = useState(false)
227
+ const [checkGeneration, setCheckGeneration] = useState(0)
228
+ const performCheckGenerationRef = useRef(0)
229
+ const activeCheckKeyRef = useRef<string | null>(null)
230
+ const checkStartedRef = useRef(false)
231
+ const checkCompletedRef = useRef(false)
232
+ const selectedCheckResultRef = useRef<OtaCheckCurrentGlassesResult | null>(null)
233
+ const autoChainAdvancedRef = useRef(false)
234
+ const installActionPendingRef = useRef(false)
235
+ const onFinishedRef = useRef(onFinished)
236
+ const onOpenWifiSetupRef = useRef(onOpenWifiSetup)
237
+ const onFirmwareRestartingChangeRef = useRef(onFirmwareRestartingChange)
238
+ onFinishedRef.current = onFinished
239
+ onOpenWifiSetupRef.current = onOpenWifiSetup
240
+ onFirmwareRestartingChangeRef.current = onFirmwareRestartingChange
241
+
242
+ useEffect(() => {
243
+ if (!initializeRuntime) {
244
+ setRuntimeReady(true)
245
+ return
246
+ }
247
+ let cancelled = false
248
+ setRuntimeReady(false)
249
+ void ota.initialize().finally(() => {
250
+ if (!cancelled) setRuntimeReady(true)
251
+ })
252
+ return () => {
253
+ cancelled = true
254
+ }
255
+ }, [initializeRuntime])
256
+
257
+ const returnToCheck = useCallback(() => {
258
+ installActionPendingRef.current = false
259
+ autoChainAdvancedRef.current = false
260
+ setCheckState("checking")
261
+ setPage("check")
262
+ setCheckGeneration((generation) => generation + 1)
263
+ }, [])
264
+
265
+ const navigateToProgress = useCallback(() => {
266
+ installActionPendingRef.current = true
267
+ ota.clearProgress()
268
+ setPage("progress")
269
+ }, [])
270
+
271
+ const continueApprovedChain = useCallback(
272
+ (result: OtaCheckCurrentGlassesResult): boolean => {
273
+ if (installActionPendingRef.current || !isOtaAutoChainActive() || !result.updateInfo) return false
274
+ const snapshot = ota.snapshot()
275
+ if (!snapshot.wifiStatusKnown || (!snapshot.wifiConnected && snapshot.hotspotOtaVersion !== 1)) return false
276
+
277
+ const admission = tryAdvanceOtaAutoChain(
278
+ otaAutoChainFingerprint(result),
279
+ result.updateInfo.isDowngrade === true,
280
+ releaseRangeTargetVersion(result),
281
+ result.releaseVersion,
282
+ )
283
+ if (!admission.advance) return false
284
+
285
+ checkCompletedRef.current = true
286
+ ota.installSession.prepare(result)
287
+ navigateToProgress()
288
+ return true
289
+ },
290
+ [navigateToProgress],
291
+ )
292
+
293
+ useEffect(() => {
294
+ if (!runtimeReady || page !== "check") return
295
+ const MIN_DISPLAY_TIME_MS = 1100
296
+ const MAX_WAIT_FOR_VERSION_INFO_MS = 10_000
297
+ const checkKey = String(checkGeneration)
298
+ if (activeCheckKeyRef.current !== checkKey) {
299
+ activeCheckKeyRef.current = checkKey
300
+ checkStartedRef.current = false
301
+ checkCompletedRef.current = false
302
+ selectedCheckResultRef.current = null
303
+ installActionPendingRef.current = false
304
+ setCheckState("checking")
305
+ }
306
+
307
+ const myGeneration = ++performCheckGenerationRef.current
308
+ let cancelled = false
309
+ let reconnectTimeout: ReturnType<typeof setTimeout> | null = null
310
+
311
+ const performCheck = async () => {
312
+ if (checkCompletedRef.current) return
313
+ if (isOtaAutoChainActive() && !otaSnapshot.ready) {
314
+ const remainingMs = otaAutoChainReconnectWaitRemaining()
315
+ if (remainingMs === null) return
316
+ reconnectTimeout = setTimeout(() => {
317
+ if (cancelled || myGeneration !== performCheckGenerationRef.current || ota.snapshot().ready) return
318
+ stopOtaAutoChain()
319
+ checkCompletedRef.current = true
320
+ setCheckState("error")
321
+ }, remainingMs)
322
+ return
323
+ }
324
+ if (!otaSnapshot.connected) {
325
+ if (checkStartedRef.current) {
326
+ stopOtaAutoChain()
327
+ checkCompletedRef.current = true
328
+ setCheckState("error")
329
+ return
330
+ }
331
+ checkCompletedRef.current = true
332
+ onFinishedRef.current?.()
333
+ return
334
+ }
335
+
336
+ clearOtaAutoChainReconnectWait()
337
+ checkStartedRef.current = true
338
+ const startTime = Date.now()
339
+ try {
340
+ const checkOptions = {
341
+ waitForBuildNumberMs: MAX_WAIT_FOR_VERSION_INFO_MS,
342
+ waitForBesVersionMs: 5000,
343
+ waitForMtkVersionMs: 2000,
344
+ refreshVersionInfo: true,
345
+ fixClockBeforeCheck: false,
346
+ }
347
+ let result = await ota.checkForUpdates(checkOptions)
348
+ if (cancelled || myGeneration !== performCheckGenerationRef.current) return
349
+ if (!result.hasCheckCompleted && result.checkFailureReason === "network" && isOtaAutoChainActive()) {
350
+ await new Promise((resolve) => setTimeout(resolve, AUTO_CHAIN_NETWORK_RETRY_DELAY_MS))
351
+ if (cancelled || myGeneration !== performCheckGenerationRef.current) return
352
+ result = await ota.checkForUpdates(checkOptions)
353
+ }
354
+ if (cancelled || myGeneration !== performCheckGenerationRef.current) return
355
+ selectedCheckResultRef.current = result
356
+ await new Promise((resolve) => setTimeout(resolve, Math.max(0, MIN_DISPLAY_TIME_MS - (Date.now() - startTime))))
357
+ if (cancelled || myGeneration !== performCheckGenerationRef.current) return
358
+
359
+ if (result.skippedReason === "disconnected") {
360
+ stopOtaAutoChain()
361
+ checkCompletedRef.current = true
362
+ setCheckState("error")
363
+ return
364
+ }
365
+ if (result.skippedReason === "missing_build") {
366
+ checkCompletedRef.current = true
367
+ if (isOtaAutoChainActive()) {
368
+ stopOtaAutoChain()
369
+ setCheckState("error")
370
+ } else {
371
+ onFinishedRef.current?.()
372
+ }
373
+ return
374
+ }
375
+ if (result.skippedReason === "dev_build") {
376
+ stopOtaAutoChain()
377
+ checkCompletedRef.current = true
378
+ ota.clearUpdateAvailable()
379
+ setCheckState("dev_build")
380
+ return
381
+ }
382
+ if (!result.hasCheckCompleted) {
383
+ stopOtaAutoChain()
384
+ checkCompletedRef.current = true
385
+ setErrorKind(result.checkFailureReason === "pin_unavailable" ? "pin_unavailable" : "network")
386
+ setCheckState("error")
387
+ return
388
+ }
389
+ if (result.updateAvailable && result.updateInfo) {
390
+ setIsUpdateRequired(result.isRequired)
391
+ setIsVersionChange(result.updateInfo.isDowngrade === true)
392
+ const fingerprint = otaAutoChainFingerprint(result)
393
+ setUpdateFingerprint(fingerprint)
394
+ if (!isOtaAutoChainActive()) {
395
+ const fromVersion = currentReleaseVersion(ota.snapshot().appVersion)
396
+ setOfferedReleaseTransition(result.releaseVersion ? {fromVersion, toVersion: result.releaseVersion} : null)
397
+ }
398
+ if (isOtaAutoChainActive() && !ota.snapshot().wifiStatusKnown) {
399
+ checkCompletedRef.current = true
400
+ return
401
+ }
402
+ if (continueApprovedChain(result)) return
403
+ checkCompletedRef.current = true
404
+ setCheckState("update_available")
405
+ return
406
+ }
407
+ const completedApprovedSession = isOtaAutoChainActive()
408
+ if (completedApprovedSession) {
409
+ setCompletedChangelogs(releaseChangelogsForActiveChain())
410
+ setCompletedReleaseTransition(releaseTransitionFromRange(otaAutoChainReleaseRange()))
411
+ }
412
+ setCompletedUpdate(completedApprovedSession)
413
+ stopOtaAutoChain()
414
+ checkCompletedRef.current = true
415
+ ota.clearUpdateAvailable()
416
+ setCheckState("no_update")
417
+ } catch (error) {
418
+ console.error("OTA check failed:", error)
419
+ await new Promise((resolve) => setTimeout(resolve, Math.max(0, MIN_DISPLAY_TIME_MS - (Date.now() - startTime))))
420
+ if (cancelled || myGeneration !== performCheckGenerationRef.current) return
421
+ stopOtaAutoChain()
422
+ checkCompletedRef.current = true
423
+ setErrorKind("network")
424
+ setCheckState("error")
425
+ }
426
+ }
427
+
428
+ void performCheck()
429
+ return () => {
430
+ cancelled = true
431
+ if (reconnectTimeout) clearTimeout(reconnectTimeout)
432
+ }
433
+ }, [
434
+ checkGeneration,
435
+ continueApprovedChain,
436
+ otaSnapshot.connected,
437
+ otaSnapshot.ready,
438
+ otaSnapshot.wifiStatusKnown,
439
+ page,
440
+ runtimeReady,
441
+ ])
442
+
443
+ useEffect(() => {
444
+ if (
445
+ !runtimeReady ||
446
+ page !== "check" ||
447
+ (checkState !== "checking" && checkState !== "update_available") ||
448
+ !otaSnapshot.wifiStatusKnown ||
449
+ !isOtaAutoChainActive()
450
+ ) {
451
+ return
452
+ }
453
+ const result = selectedCheckResultRef.current
454
+ if (!result?.updateAvailable || !result.updateInfo) return
455
+ if (!otaSnapshot.wifiConnected && otaSnapshot.hotspotOtaVersion !== 1) {
456
+ setCheckState("update_available")
457
+ return
458
+ }
459
+ continueApprovedChain(result)
460
+ }, [
461
+ checkState,
462
+ continueApprovedChain,
463
+ otaSnapshot.hotspotOtaVersion,
464
+ otaSnapshot.wifiConnected,
465
+ otaSnapshot.wifiStatusKnown,
466
+ page,
467
+ runtimeReady,
468
+ ])
469
+
470
+ useEffect(() => {
471
+ if (!runtimeReady || page !== "progress") return
472
+ ota.installSession.attach()
473
+ return () => ota.installSession.detach()
474
+ }, [page, runtimeReady])
475
+
476
+ const firmwareRestarting =
477
+ page === "progress" &&
478
+ ((!installSnapshot.connected && installSnapshot.displayState === "restarting") ||
479
+ installSnapshot.versionChangePhase === "restarting")
480
+
481
+ useEffect(() => {
482
+ if (page !== "progress") return
483
+ onFirmwareRestartingChangeRef.current?.(firmwareRestarting, true)
484
+ }, [firmwareRestarting, page])
485
+
486
+ useEffect(() => {
487
+ if (page !== "progress") return
488
+ return () => {
489
+ onFirmwareRestartingChangeRef.current?.(false, false)
490
+ }
491
+ }, [page])
492
+
493
+ useEffect(() => {
494
+ if (
495
+ page !== "progress" ||
496
+ installSnapshot.displayState !== "complete" ||
497
+ !installSnapshot.connected ||
498
+ !isOtaAutoChainActive() ||
499
+ autoChainAdvancedRef.current
500
+ ) {
501
+ return
502
+ }
503
+ const timeout = setTimeout(async () => {
504
+ if (!isOtaAutoChainActive()) return
505
+ autoChainAdvancedRef.current = true
506
+ await ota.installSession.finish()
507
+ returnToCheck()
508
+ }, AUTO_CHAIN_COMPLETE_DELAY_MS)
509
+ return () => clearTimeout(timeout)
510
+ }, [installSnapshot.connected, installSnapshot.displayState, page, returnToCheck])
511
+
512
+ const check = useCallback(() => {
513
+ setBatteryBlocked(false)
514
+ setOfferedReleaseTransition(null)
515
+ setCompletedReleaseTransition(null)
516
+ setCompletedUpdate(false)
517
+ setCompletedChangelogs([])
518
+ setPage("check")
519
+ setCheckState("checking")
520
+ setCheckGeneration((generation) => generation + 1)
521
+ }, [])
522
+
523
+ const install = useCallback(() => {
524
+ if (installActionPendingRef.current || page !== "check") return
525
+ const result = selectedCheckResultRef.current
526
+ if (!result) {
527
+ setErrorKind("network")
528
+ setCheckState("error")
529
+ return
530
+ }
531
+ const snapshot = ota.snapshot()
532
+ if (snapshot.batteryLevel !== null && snapshot.batteryLevel < MINIMUM_OTA_BATTERY_LEVEL) {
533
+ setBatteryBlocked(true)
534
+ return
535
+ }
536
+ if (!snapshot.wifiStatusKnown) {
537
+ check()
538
+ return
539
+ }
540
+ if (!snapshot.wifiConnected && snapshot.hotspotOtaVersion !== 1) {
541
+ onOpenWifiSetupRef.current?.()
542
+ return
543
+ }
544
+ ota.installSession.prepare(result)
545
+ setBatteryBlocked(false)
546
+ setCompletedUpdate(false)
547
+ setCompletedChangelogs([])
548
+ if (updateFingerprint) {
549
+ const fromVersion = offeredReleaseTransition
550
+ ? offeredReleaseTransition.fromVersion
551
+ : currentReleaseVersion(snapshot.appVersion)
552
+ beginOtaAutoChain(updateFingerprint, isVersionChange, {
553
+ fromVersion,
554
+ toVersion: releaseRangeTargetVersion(result),
555
+ releaseVersion: result.releaseVersion,
556
+ })
557
+ }
558
+ navigateToProgress()
559
+ }, [check, isVersionChange, navigateToProgress, offeredReleaseTransition, page, updateFingerprint])
560
+
561
+ useEffect(() => {
562
+ if (
563
+ batteryBlocked &&
564
+ (otaSnapshot.batteryLevel === null || otaSnapshot.batteryLevel >= MINIMUM_OTA_BATTERY_LEVEL)
565
+ ) {
566
+ setBatteryBlocked(false)
567
+ }
568
+ }, [batteryBlocked, otaSnapshot.batteryLevel])
569
+
570
+ const retryInstall = useCallback(() => {
571
+ if (page !== "progress") return
572
+ onFirmwareRestartingChangeRef.current?.(false, true)
573
+ ota.installSession.retry()
574
+ }, [page])
575
+
576
+ const finish = useCallback(async () => {
577
+ if (page === "check") {
578
+ onFinishedRef.current?.()
579
+ return
580
+ }
581
+ const restartStillInProgress =
582
+ installSnapshot.displayState === "restarting" ||
583
+ installSnapshot.versionChangePhase === "restarting" ||
584
+ installSnapshot.versionChangePhase === "verifying"
585
+ if (restartStillInProgress) return
586
+ const requiresGlassesReboot = shouldRequireGlassesRebootForBesFailure(
587
+ installSnapshot.otaStatus,
588
+ installSnapshot.otaProgress,
589
+ installSnapshot.errorMsg,
590
+ )
591
+ if (requiresGlassesReboot) stopOtaAutoChain()
592
+ await ota.installSession.finish()
593
+ returnToCheck()
594
+ }, [installSnapshot, page, returnToCheck])
595
+
596
+ const discard = useCallback(async () => {
597
+ if (page !== "progress") return
598
+ stopOtaAutoChain()
599
+ await ota.installSession.discard()
600
+ returnToCheck()
601
+ }, [page, returnToCheck])
602
+
603
+ const openWifiSetup = useCallback(() => {
604
+ if (page === "progress") stopOtaAutoChain()
605
+ onOpenWifiSetupRef.current?.()
606
+ }, [page])
607
+
608
+ const state = useMemo<MentraLiveOtaState>(() => {
609
+ const hotspotSupported = otaSnapshot.hotspotOtaVersion === 1
610
+ const canInstall = otaSnapshot.wifiStatusKnown && (otaSnapshot.wifiConnected || hotspotSupported)
611
+ const autoChainActive = isOtaAutoChainActive()
612
+ if (!runtimeReady) {
613
+ return {
614
+ screen: "initializing",
615
+ connected: otaSnapshot.connected,
616
+ batteryLevel: otaSnapshot.batteryLevel,
617
+ transport: null,
618
+ updateRequired: isUpdateRequired,
619
+ versionChange: isVersionChange,
620
+ versionChangeConverged: false,
621
+ versionChangePhase: null,
622
+ wifiConnected: otaSnapshot.wifiConnected,
623
+ wifiStatusKnown: otaSnapshot.wifiStatusKnown,
624
+ hotspotSupported,
625
+ hotspotPhase: "idle",
626
+ hotspotArtifactPercent: null,
627
+ phase: null,
628
+ step: null,
629
+ currentStep: null,
630
+ totalSteps: null,
631
+ progress: null,
632
+ installingApkOnly: false,
633
+ firmwareRestarting: false,
634
+ error: null,
635
+ canInstall: false,
636
+ canRetry: false,
637
+ canFinish: false,
638
+ canDismiss: false,
639
+ canDiscard: false,
640
+ canOpenWifiSetup: false,
641
+ continueDisabled: false,
642
+ completedUpdate: false,
643
+ releaseTransition: null,
644
+ changelogs: [],
645
+ }
646
+ }
647
+
648
+ if (page === "check") {
649
+ const wifiRequired = otaSnapshot.wifiStatusKnown && !otaSnapshot.wifiConnected && !hotspotSupported
650
+ let screen: MentraLiveOtaScreen
651
+ if (checkState === "checking") screen = autoChainActive ? "finishing" : "checking"
652
+ else if (checkState === "update_available") {
653
+ screen = wifiRequired ? "wifi_required" : batteryBlocked ? "battery_required" : "update_available"
654
+ } else if (checkState === "no_update") screen = "up_to_date"
655
+ else if (checkState === "dev_build") screen = "dev_build"
656
+ else screen = errorKind === "pin_unavailable" ? "update_info_unavailable" : "check_failed"
657
+
658
+ let error: MentraLiveOtaError | null = null
659
+ if (screen === "check_failed") {
660
+ error = {
661
+ code: "check_failed",
662
+ message: "Couldn't check for updates. Please check your connection and try again.",
663
+ }
664
+ } else if (screen === "update_info_unavailable") {
665
+ error = {code: "update_info_unavailable", message: "Update information for this app version is unavailable."}
666
+ }
667
+ return {
668
+ screen,
669
+ connected: otaSnapshot.connected,
670
+ batteryLevel: otaSnapshot.batteryLevel,
671
+ transport: otaSnapshot.wifiConnected ? "wifi" : hotspotSupported ? "hotspot" : null,
672
+ updateRequired: isUpdateRequired,
673
+ versionChange: isVersionChange,
674
+ versionChangeConverged: false,
675
+ versionChangePhase: null,
676
+ wifiConnected: otaSnapshot.wifiConnected,
677
+ wifiStatusKnown: otaSnapshot.wifiStatusKnown,
678
+ hotspotSupported,
679
+ hotspotPhase: "idle",
680
+ hotspotArtifactPercent: null,
681
+ phase: null,
682
+ step: null,
683
+ currentStep: null,
684
+ totalSteps: null,
685
+ progress: null,
686
+ installingApkOnly: false,
687
+ firmwareRestarting: false,
688
+ error,
689
+ canInstall: screen === "update_available" && canInstall,
690
+ canRetry: screen === "check_failed",
691
+ canFinish: screen === "up_to_date" || screen === "dev_build" || screen === "update_info_unavailable",
692
+ canDismiss:
693
+ (screen === "update_available" || screen === "wifi_required" || screen === "battery_required") &&
694
+ !isUpdateRequired &&
695
+ !autoChainActive,
696
+ canDiscard: false,
697
+ canOpenWifiSetup: screen === "wifi_required",
698
+ continueDisabled: false,
699
+ completedUpdate: screen === "up_to_date" && completedUpdate,
700
+ releaseTransition:
701
+ screen === "update_available" || screen === "wifi_required"
702
+ ? autoChainActive
703
+ ? releaseTransitionFromRange(otaAutoChainReleaseRange())
704
+ : offeredReleaseTransition
705
+ : screen === "up_to_date"
706
+ ? completedReleaseTransition
707
+ : null,
708
+ changelogs: screen === "up_to_date" ? completedChangelogs : [],
709
+ }
710
+ }
711
+
712
+ const requiresGlassesReboot = shouldRequireGlassesRebootForBesFailure(
713
+ installSnapshot.otaStatus,
714
+ installSnapshot.otaProgress,
715
+ installSnapshot.errorMsg,
716
+ )
717
+ const showChangeWifi = shouldShowChangeWifiForOtaDownloadFailure(
718
+ installSnapshot.otaStatus,
719
+ installSnapshot.otaProgress,
720
+ installSnapshot.errorMsg,
721
+ )
722
+ const displayedError = requiresGlassesReboot
723
+ ? BES_INSTALL_RESTART_MESSAGE
724
+ : installSnapshot.errorMsg || getOtaErrorMessage(installSnapshot.otaStatus?.error)
725
+ const progressState = progressScreen(installSnapshot)
726
+ const screen = progressState === "complete" && autoChainActive ? "finishing" : progressState
727
+ const error =
728
+ screen === "failed"
729
+ ? {
730
+ code: requiresGlassesReboot ? ("bes_restart_required" as const) : ("install_failed" as const),
731
+ message: displayedError,
732
+ }
733
+ : null
734
+ const totalSteps = installSnapshot.otaStatus?.totalSteps ?? null
735
+ const changelogs = screen === "complete" ? releaseChangelogsForActiveChain() : []
736
+ return {
737
+ screen,
738
+ connected: installSnapshot.connected,
739
+ batteryLevel: otaSnapshot.batteryLevel,
740
+ transport: installSnapshot.transport,
741
+ updateRequired: isUpdateRequired,
742
+ versionChange: installSnapshot.isVersionChange,
743
+ versionChangeConverged: installSnapshot.versionChangeConverged,
744
+ versionChangePhase: installSnapshot.versionChangePhase,
745
+ wifiConnected: otaSnapshot.wifiConnected,
746
+ wifiStatusKnown: otaSnapshot.wifiStatusKnown,
747
+ hotspotSupported,
748
+ hotspotPhase: installSnapshot.hotspotPhase,
749
+ hotspotArtifactPercent: installSnapshot.hotspotArtifactPercent,
750
+ phase: installSnapshot.otaStatus?.phase ?? installSnapshot.otaProgress?.stage ?? null,
751
+ step: installSnapshot.otaStatus?.stepType ?? null,
752
+ currentStep: installSnapshot.otaStatus?.currentStep ?? null,
753
+ totalSteps,
754
+ progress: installProgress(installSnapshot),
755
+ installingApkOnly:
756
+ installSnapshot.otaStatus?.stepType === "apk" &&
757
+ installSnapshot.otaStatus.phase === "install" &&
758
+ totalSteps === 1,
759
+ firmwareRestarting,
760
+ error,
761
+ canInstall: false,
762
+ canRetry: screen === "failed" && !requiresGlassesReboot,
763
+ canFinish: screen === "complete" || (screen === "failed" && requiresGlassesReboot),
764
+ canDismiss: false,
765
+ canDiscard: screen === "disconnected",
766
+ canOpenWifiSetup: screen === "failed" && showChangeWifi,
767
+ continueDisabled: installSnapshot.continueButtonDisabled,
768
+ completedUpdate: false,
769
+ releaseTransition: releaseTransitionFromRange(otaAutoChainReleaseRange()),
770
+ changelogs,
771
+ }
772
+ }, [
773
+ checkState,
774
+ batteryBlocked,
775
+ completedChangelogs,
776
+ completedReleaseTransition,
777
+ completedUpdate,
778
+ errorKind,
779
+ firmwareRestarting,
780
+ installSnapshot,
781
+ isUpdateRequired,
782
+ isVersionChange,
783
+ otaSnapshot,
784
+ offeredReleaseTransition,
785
+ page,
786
+ runtimeReady,
787
+ ])
788
+
789
+ return useMemo(
790
+ () => ({state, check, retryCheck: check, install, retryInstall, finish, discard, openWifiSetup}),
791
+ [check, discard, finish, install, openWifiSetup, retryInstall, state],
792
+ )
793
+ }