@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 @@
1
+ {"version":3,"file":"OtaArtifactDownloader.js","sourceRoot":"","sources":["../../src/services/OtaArtifactDownloader.ts"],"names":[],"mappings":"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","sourcesContent":["import * as RNFS from \"@dr.pogodin/react-native-fs\"\nimport type {OtaCheckCurrentGlassesResult, VersionJson} from \"./OtaUpdateCheckService\"\n\n/**\n * Phone-side artifact staging for hotspot-served OTA (OS-1676).\n *\n * When the glasses have no WiFi, the phone downloads the OTA artifacts itself (over\n * whatever network it is on — the user's tap on \"update\" is the consent) and serves them\n * to the glasses via the LocalOtaServer over the glasses' hotspot. This module owns:\n *\n * - planning which artifacts the pending update actually needs (from the raw manifest the\n * update check fetched, so the glasses re-parse byte-identical version data),\n * - downloading them with .part staging and sha256 verification, keyed on disk by hash so\n * retries and the post-APK continuation reuse verified files,\n * - rewriting the manifest's URL fields to point at the phone server, and\n * - cleanup once the update completes or the manifest moves on.\n */\n\nexport type OtaArtifactKind = \"apk\" | \"mtk\" | \"bes\"\n\nexport interface OtaArtifactPlanEntry {\n kind: OtaArtifactKind\n /** URL this artifact is fetched from, exactly as it appears in the raw manifest. */\n url: string\n /** Required content hash from the manifest. */\n sha256: string\n}\n\nexport interface PreparedOtaArtifact extends OtaArtifactPlanEntry {\n filePath: string\n}\n\nexport interface OtaArtifactDownloadProgress {\n kind: OtaArtifactKind\n /** 0-based index of the artifact being downloaded. */\n index: number\n totalCount: number\n /** Percent of the current artifact, 0-100 (0 when the server sent no length). */\n artifactPercent: number\n bytesWritten: number\n contentLength: number\n}\n\nexport class OtaArtifactError extends Error {\n constructor(\n public readonly code: \"artifact_download_failed\" | \"artifact_verify_failed\" | \"manifest_invalid\",\n message: string,\n ) {\n super(message)\n this.name = \"OtaArtifactError\"\n }\n}\n\nconst ASG_PACKAGE = \"com.mentra.asg_client\"\n\nexport function otaArtifactsDirectory(): string {\n return `${RNFS.DocumentDirectoryPath}/ota_artifacts`\n}\n\n/**\n * Derive the artifact list the pending update needs from a completed check.\n * Works off the raw manifest body (not the normalized check fields) so the URLs and\n * hashes match exactly what the glasses will re-parse.\n */\nexport function planArtifacts(result: OtaCheckCurrentGlassesResult): OtaArtifactPlanEntry[] {\n if (!result.manifestBody) {\n throw new OtaArtifactError(\"manifest_invalid\", \"Check result carries no manifest body\")\n }\n let manifest: VersionJson\n try {\n manifest = JSON.parse(result.manifestBody)\n } catch {\n throw new OtaArtifactError(\"manifest_invalid\", \"Manifest body is not valid JSON\")\n }\n\n const entries: OtaArtifactPlanEntry[] = []\n\n if (result.updates.includes(\"apk\")) {\n const app = manifest.apps?.[ASG_PACKAGE] as unknown as Record<string, unknown> | undefined\n const url = typeof app?.apkUrl === \"string\" ? app.apkUrl : null\n if (!url) {\n throw new OtaArtifactError(\"manifest_invalid\", \"Manifest has no apkUrl for the pending APK update\")\n }\n entries.push({\n kind: \"apk\",\n url,\n sha256: requireSha256(app, \"APK\"),\n })\n }\n\n if (result.updates.includes(\"mtk\") && result.mtkPatch) {\n const raw = (manifest.mtk_patches ?? []).find(\n (patch) => firmwareUrl(patch) === firmwareUrl(result.mtkPatch!),\n ) as unknown as Record<string, unknown> | undefined\n const url = firmwareUrl(raw) ?? firmwareUrl(result.mtkPatch)\n if (!url) {\n throw new OtaArtifactError(\"manifest_invalid\", \"Manifest has no URL for the pending MTK patch\")\n }\n entries.push({\n kind: \"mtk\",\n url,\n sha256: requireSha256(raw, \"MTK\"),\n })\n }\n\n if (result.updates.includes(\"bes\") && manifest.bes_firmware) {\n const raw = manifest.bes_firmware as unknown as Record<string, unknown>\n const url = firmwareUrl(raw)\n if (!url) {\n throw new OtaArtifactError(\"manifest_invalid\", \"Manifest has no URL for the pending BES firmware\")\n }\n entries.push({\n kind: \"bes\",\n url,\n sha256: requireSha256(raw, \"BES\"),\n })\n }\n\n return entries\n}\n\n/**\n * Download every planned artifact into the on-disk hash-keyed store, reusing files that\n * already verify. Sequential on purpose: progress is legible and the hotspot window that\n * follows is the slow part, not phone-side parallelism.\n */\nexport async function prepareArtifacts(\n plan: OtaArtifactPlanEntry[],\n onProgress?: (progress: OtaArtifactDownloadProgress) => void,\n nativeDownload?: (\n entry: OtaArtifactPlanEntry,\n destination: string,\n onProgress?: (bytesWritten: number, contentLength: number) => void,\n ) => Promise<{statusCode: number}>,\n): Promise<PreparedOtaArtifact[]> {\n const directory = otaArtifactsDirectory()\n await RNFS.mkdir(directory, {NSURLIsExcludedFromBackupKey: true})\n\n const prepared: PreparedOtaArtifact[] = []\n for (let index = 0; index < plan.length; index++) {\n const entry = plan[index]\n\n const cachedPath = `${directory}/${entry.sha256}`\n if (await RNFS.exists(cachedPath)) {\n const cachedHash = (await RNFS.hash(cachedPath, \"sha256\")).toLowerCase()\n if (cachedHash === entry.sha256) {\n prepared.push({...entry, filePath: cachedPath})\n continue\n }\n await safeUnlink(cachedPath)\n }\n\n const partPath = `${directory}/download-${index}.part`\n await safeUnlink(partPath)\n try {\n const reportProgress = (bytesWritten: number, contentLength: number) => {\n onProgress?.({\n kind: entry.kind,\n index,\n totalCount: plan.length,\n artifactPercent: contentLength > 0 ? Math.round((bytesWritten / contentLength) * 100) : 0,\n bytesWritten,\n contentLength,\n })\n }\n const downloadResult = nativeDownload\n ? await nativeDownload(entry, partPath, reportProgress)\n : await RNFS.downloadFile({\n fromUrl: entry.url,\n toFile: partPath,\n connectionTimeout: 30_000,\n readTimeout: 30_000,\n progressDivider: 5,\n progress: (res: RNFS.DownloadProgressCallbackResultT) => {\n reportProgress(res.bytesWritten, res.contentLength)\n },\n }).promise\n if (downloadResult.statusCode !== 200) {\n throw new OtaArtifactError(\n \"artifact_download_failed\",\n `Download of ${entry.kind} artifact failed with HTTP ${downloadResult.statusCode}`,\n )\n }\n\n const actualSha256 = (await RNFS.hash(partPath, \"sha256\")).toLowerCase()\n if (actualSha256 !== entry.sha256) {\n throw new OtaArtifactError(\n \"artifact_verify_failed\",\n `${entry.kind} artifact hash mismatch: expected ${entry.sha256}, got ${actualSha256}`,\n )\n }\n\n const finalPath = `${directory}/${entry.sha256}`\n await safeUnlink(finalPath)\n await RNFS.moveFile(partPath, finalPath)\n prepared.push({...entry, filePath: finalPath})\n } catch (error) {\n await safeUnlink(partPath)\n if (error instanceof OtaArtifactError) {\n throw error\n }\n throw new OtaArtifactError(\n \"artifact_download_failed\",\n `Download of ${entry.kind} artifact failed: ${error instanceof Error ? error.message : String(error)}`,\n )\n }\n }\n return prepared\n}\n\n/**\n * Point the manifest's artifact URLs at the phone server, leaving every other field\n * semantically identical to what the update check saw. Entries we host get\n * `<baseUrl>/artifacts/<sha256>`; entries the update does not need keep their CDN URLs.\n * Only URL fields change: target versions, sizes, and manifest hashes remain untouched.\n */\nexport function rewriteManifestForLocalServer(\n manifestBody: string,\n artifacts: PreparedOtaArtifact[],\n baseUrl: string,\n): string {\n let manifest: VersionJson\n try {\n manifest = JSON.parse(manifestBody)\n } catch {\n throw new OtaArtifactError(\"manifest_invalid\", \"Manifest body is not valid JSON\")\n }\n const byUrl = new Map(artifacts.map((artifact) => [artifact.url, artifact]))\n const localUrl = (artifact: PreparedOtaArtifact) => `${baseUrl}/artifacts/${artifact.sha256}`\n\n for (const app of Object.values(manifest.apps ?? {})) {\n const record = app as unknown as Record<string, unknown>\n const artifact = typeof record.apkUrl === \"string\" ? byUrl.get(record.apkUrl) : undefined\n if (artifact) {\n record.apkUrl = localUrl(artifact)\n }\n }\n\n for (const patch of manifest.mtk_patches ?? []) {\n rewriteFirmwareEntry(patch as unknown as Record<string, unknown>, byUrl, localUrl)\n }\n if (manifest.bes_firmware) {\n rewriteFirmwareEntry(manifest.bes_firmware as unknown as Record<string, unknown>, byUrl, localUrl)\n }\n\n return JSON.stringify(manifest)\n}\n\n/** Delete every stored artifact whose hash is not in `keepSha256s` (plus stray .part files). */\nexport async function cleanupArtifacts(keepSha256s: string[] = []): Promise<void> {\n const directory = otaArtifactsDirectory()\n if (!(await RNFS.exists(directory))) {\n return\n }\n const keep = new Set(keepSha256s.map((sha) => sha.toLowerCase()))\n const items = await RNFS.readDir(directory)\n for (const item of items) {\n if (!item.isFile()) continue\n if (keep.has(item.name.toLowerCase())) continue\n await safeUnlink(item.path)\n }\n}\n\nfunction rewriteFirmwareEntry(\n entry: Record<string, unknown>,\n byUrl: Map<string, PreparedOtaArtifact>,\n localUrl: (artifact: PreparedOtaArtifact) => string,\n): void {\n const url = firmwareUrl(entry)\n const artifact = url ? byUrl.get(url) : undefined\n if (!artifact) {\n return\n }\n entry.url = localUrl(artifact)\n // Overwrite the legacy key too when present, so no glasses build can prefer a stale\n // CDN URL over the local one.\n if (typeof entry.firmwareUrl === \"string\") {\n entry.firmwareUrl = localUrl(artifact)\n }\n}\n\nfunction firmwareUrl(entry: unknown): string | null {\n if (!entry || typeof entry !== \"object\") {\n return null\n }\n const record = entry as Record<string, unknown>\n if (typeof record.url === \"string\" && record.url.length > 0) {\n return record.url\n }\n if (typeof record.firmwareUrl === \"string\" && record.firmwareUrl.length > 0) {\n return record.firmwareUrl\n }\n return null\n}\n\nfunction requireSha256(entry: Record<string, unknown> | undefined, label: string): string {\n const sha256 = typeof entry?.sha256 === \"string\" ? entry.sha256.trim().toLowerCase() : \"\"\n if (!/^[a-f0-9]{64}$/.test(sha256)) {\n throw new OtaArtifactError(\"manifest_invalid\", `${label} artifact has no valid manifest sha256`)\n }\n return sha256\n}\n\nasync function safeUnlink(path: string): Promise<void> {\n try {\n if (await RNFS.exists(path)) {\n await RNFS.unlink(path)\n }\n } catch {\n // Best-effort: a leftover file only wastes space and is cleaned up next run.\n }\n}\n"]}
@@ -0,0 +1,41 @@
1
+ import type { OtaCheckCurrentGlassesResult } from "./OtaUpdateCheckService";
2
+ export declare const MAX_OTA_AUTO_CHAIN_PASSES = 8;
3
+ export declare const OTA_AUTO_CHAIN_RECONNECT_TIMEOUT_MS = 120000;
4
+ export type OtaAutoChainReleaseRange = {
5
+ fromVersion: string | null;
6
+ toVersion: string | null;
7
+ /** Exact coordinated release identity for the OTA pin, absent for legacy manifests. */
8
+ releaseVersion?: string | null;
9
+ };
10
+ export type OtaAutoChainAdvanceResult = {
11
+ advance: true;
12
+ passCount: number;
13
+ } | {
14
+ advance: false;
15
+ reason: "inactive" | "duplicate" | "max_passes" | "downgrade_not_approved";
16
+ };
17
+ /**
18
+ * Identify the exact update offer that produced one OTA pass. Including the
19
+ * observed versions and manifest body lets a changed manifest advance while a
20
+ * stale post-install version_info response is rejected as a duplicate.
21
+ */
22
+ export declare function otaAutoChainFingerprint(result: OtaCheckCurrentGlassesResult): string;
23
+ /** Start a chain after the user explicitly approves its first update pass. */
24
+ export declare function beginOtaAutoChain(initialFingerprint: string, approvedDowngrade: boolean, releaseRange: OtaAutoChainReleaseRange): void;
25
+ export declare function isOtaAutoChainActive(): boolean;
26
+ export declare function otaAutoChainReleaseRange(): OtaAutoChainReleaseRange | null;
27
+ /** End the current chain. Safe to call when no chain is active. */
28
+ export declare function stopOtaAutoChain(): void;
29
+ /**
30
+ * Start (or continue) the bounded wait for glasses that are rebooting between
31
+ * passes. Re-renders must not extend the original deadline indefinitely.
32
+ */
33
+ export declare function otaAutoChainReconnectWaitRemaining(now?: number): number | null;
34
+ /** A successful reconnect allows a future pass to establish a fresh wait. */
35
+ export declare function clearOtaAutoChainReconnectWait(): void;
36
+ /**
37
+ * Admit the next pass of an active chain. Repeated offers, unexpectedly
38
+ * destructive downgrades, and runaway chains fail closed and end automation.
39
+ */
40
+ export declare function tryAdvanceOtaAutoChain(fingerprint: string, isDowngrade: boolean, targetVersion: string | null, releaseVersion?: string | null): OtaAutoChainAdvanceResult;
41
+ //# sourceMappingURL=OtaAutoChain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OtaAutoChain.d.ts","sourceRoot":"","sources":["../../src/services/OtaAutoChain.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,4BAA4B,EAAC,MAAM,yBAAyB,CAAA;AAEzE,eAAO,MAAM,yBAAyB,IAAI,CAAA;AAC1C,eAAO,MAAM,mCAAmC,SAAU,CAAA;AAU1D,MAAM,MAAM,wBAAwB,GAAG;IACrC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,uFAAuF;IACvF,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAC/B,CAAA;AAED,MAAM,MAAM,yBAAyB,GACjC;IAAC,OAAO,EAAE,IAAI,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAC,GAClC;IAAC,OAAO,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,UAAU,GAAG,WAAW,GAAG,YAAY,GAAG,wBAAwB,CAAA;CAAC,CAAA;AAIhG;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,4BAA4B,GAAG,MAAM,CAkBpF;AAED,8EAA8E;AAC9E,wBAAgB,iBAAiB,CAC/B,kBAAkB,EAAE,MAAM,EAC1B,iBAAiB,EAAE,OAAO,EAC1B,YAAY,EAAE,wBAAwB,GACrC,IAAI,CAQN;AAED,wBAAgB,oBAAoB,IAAI,OAAO,CAE9C;AAED,wBAAgB,wBAAwB,IAAI,wBAAwB,GAAG,IAAI,CAE1E;AAED,mEAAmE;AACnE,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC;AAED;;;GAGG;AACH,wBAAgB,kCAAkC,CAAC,GAAG,SAAoB,GAAG,MAAM,GAAG,IAAI,CAKzF;AAED,6EAA6E;AAC7E,wBAAgB,8BAA8B,IAAI,IAAI,CAErD;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,OAAO,EACpB,aAAa,EAAE,MAAM,GAAG,IAAI,EAC5B,cAAc,GAAE,MAAM,GAAG,IAAW,GACnC,yBAAyB,CAyB3B"}
@@ -0,0 +1,91 @@
1
+ export const MAX_OTA_AUTO_CHAIN_PASSES = 8;
2
+ export const OTA_AUTO_CHAIN_RECONNECT_TIMEOUT_MS = 120_000;
3
+ let session = null;
4
+ /**
5
+ * Identify the exact update offer that produced one OTA pass. Including the
6
+ * observed versions and manifest body lets a changed manifest advance while a
7
+ * stale post-install version_info response is rejected as a duplicate.
8
+ */
9
+ export function otaAutoChainFingerprint(result) {
10
+ return JSON.stringify({
11
+ manifestUrl: result.manifestUrl ?? "",
12
+ manifestBody: result.manifestBody ?? "",
13
+ buildNumber: result.buildNumber ?? "",
14
+ mtkFirmwareVersion: result.mtkFirmwareVersion ?? "",
15
+ besFirmwareVersion: result.besFirmwareVersion ?? "",
16
+ updates: result.updates,
17
+ targetBuildNumber: result.updateInfo?.versionCode ?? result.latestVersionInfo?.versionCode ?? 0,
18
+ targetBesVersion: result.besVersion ?? "",
19
+ mtkPatch: result.mtkPatch
20
+ ? {
21
+ startFirmware: result.mtkPatch.start_firmware,
22
+ endFirmware: result.mtkPatch.end_firmware,
23
+ url: result.mtkPatch.url,
24
+ }
25
+ : null,
26
+ });
27
+ }
28
+ /** Start a chain after the user explicitly approves its first update pass. */
29
+ export function beginOtaAutoChain(initialFingerprint, approvedDowngrade, releaseRange) {
30
+ session = {
31
+ approvedDowngrade,
32
+ passCount: 1,
33
+ releaseRange: { ...releaseRange },
34
+ reconnectDeadline: null,
35
+ seenFingerprints: new Set([initialFingerprint]),
36
+ };
37
+ }
38
+ export function isOtaAutoChainActive() {
39
+ return session !== null;
40
+ }
41
+ export function otaAutoChainReleaseRange() {
42
+ return session ? { ...session.releaseRange } : null;
43
+ }
44
+ /** End the current chain. Safe to call when no chain is active. */
45
+ export function stopOtaAutoChain() {
46
+ session = null;
47
+ }
48
+ /**
49
+ * Start (or continue) the bounded wait for glasses that are rebooting between
50
+ * passes. Re-renders must not extend the original deadline indefinitely.
51
+ */
52
+ export function otaAutoChainReconnectWaitRemaining(now = performance.now()) {
53
+ if (!session)
54
+ return null;
55
+ session.reconnectDeadline ??= now + OTA_AUTO_CHAIN_RECONNECT_TIMEOUT_MS;
56
+ return Math.max(0, session.reconnectDeadline - now);
57
+ }
58
+ /** A successful reconnect allows a future pass to establish a fresh wait. */
59
+ export function clearOtaAutoChainReconnectWait() {
60
+ if (session)
61
+ session.reconnectDeadline = null;
62
+ }
63
+ /**
64
+ * Admit the next pass of an active chain. Repeated offers, unexpectedly
65
+ * destructive downgrades, and runaway chains fail closed and end automation.
66
+ */
67
+ export function tryAdvanceOtaAutoChain(fingerprint, isDowngrade, targetVersion, releaseVersion = null) {
68
+ if (!session) {
69
+ return { advance: false, reason: "inactive" };
70
+ }
71
+ if (isDowngrade && !session.approvedDowngrade) {
72
+ stopOtaAutoChain();
73
+ return { advance: false, reason: "downgrade_not_approved" };
74
+ }
75
+ if (session.seenFingerprints.has(fingerprint)) {
76
+ stopOtaAutoChain();
77
+ return { advance: false, reason: "duplicate" };
78
+ }
79
+ if (session.passCount >= MAX_OTA_AUTO_CHAIN_PASSES) {
80
+ stopOtaAutoChain();
81
+ return { advance: false, reason: "max_passes" };
82
+ }
83
+ session.seenFingerprints.add(fingerprint);
84
+ session.passCount += 1;
85
+ if (targetVersion)
86
+ session.releaseRange.toVersion = targetVersion;
87
+ if (releaseVersion)
88
+ session.releaseRange.releaseVersion = releaseVersion;
89
+ return { advance: true, passCount: session.passCount };
90
+ }
91
+ //# sourceMappingURL=OtaAutoChain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OtaAutoChain.js","sourceRoot":"","sources":["../../src/services/OtaAutoChain.ts"],"names":[],"mappings":"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","sourcesContent":["import type {OtaCheckCurrentGlassesResult} from \"./OtaUpdateCheckService\"\n\nexport const MAX_OTA_AUTO_CHAIN_PASSES = 8\nexport const OTA_AUTO_CHAIN_RECONNECT_TIMEOUT_MS = 120_000\n\ntype OtaAutoChainSession = {\n approvedDowngrade: boolean\n passCount: number\n releaseRange: OtaAutoChainReleaseRange\n reconnectDeadline: number | null\n seenFingerprints: Set<string>\n}\n\nexport type OtaAutoChainReleaseRange = {\n fromVersion: string | null\n toVersion: string | null\n /** Exact coordinated release identity for the OTA pin, absent for legacy manifests. */\n releaseVersion?: string | null\n}\n\nexport type OtaAutoChainAdvanceResult =\n | {advance: true; passCount: number}\n | {advance: false; reason: \"inactive\" | \"duplicate\" | \"max_passes\" | \"downgrade_not_approved\"}\n\nlet session: OtaAutoChainSession | null = null\n\n/**\n * Identify the exact update offer that produced one OTA pass. Including the\n * observed versions and manifest body lets a changed manifest advance while a\n * stale post-install version_info response is rejected as a duplicate.\n */\nexport function otaAutoChainFingerprint(result: OtaCheckCurrentGlassesResult): string {\n return JSON.stringify({\n manifestUrl: result.manifestUrl ?? \"\",\n manifestBody: result.manifestBody ?? \"\",\n buildNumber: result.buildNumber ?? \"\",\n mtkFirmwareVersion: result.mtkFirmwareVersion ?? \"\",\n besFirmwareVersion: result.besFirmwareVersion ?? \"\",\n updates: result.updates,\n targetBuildNumber: result.updateInfo?.versionCode ?? result.latestVersionInfo?.versionCode ?? 0,\n targetBesVersion: result.besVersion ?? \"\",\n mtkPatch: result.mtkPatch\n ? {\n startFirmware: result.mtkPatch.start_firmware,\n endFirmware: result.mtkPatch.end_firmware,\n url: result.mtkPatch.url,\n }\n : null,\n })\n}\n\n/** Start a chain after the user explicitly approves its first update pass. */\nexport function beginOtaAutoChain(\n initialFingerprint: string,\n approvedDowngrade: boolean,\n releaseRange: OtaAutoChainReleaseRange,\n): void {\n session = {\n approvedDowngrade,\n passCount: 1,\n releaseRange: {...releaseRange},\n reconnectDeadline: null,\n seenFingerprints: new Set([initialFingerprint]),\n }\n}\n\nexport function isOtaAutoChainActive(): boolean {\n return session !== null\n}\n\nexport function otaAutoChainReleaseRange(): OtaAutoChainReleaseRange | null {\n return session ? {...session.releaseRange} : null\n}\n\n/** End the current chain. Safe to call when no chain is active. */\nexport function stopOtaAutoChain(): void {\n session = null\n}\n\n/**\n * Start (or continue) the bounded wait for glasses that are rebooting between\n * passes. Re-renders must not extend the original deadline indefinitely.\n */\nexport function otaAutoChainReconnectWaitRemaining(now = performance.now()): number | null {\n if (!session) return null\n\n session.reconnectDeadline ??= now + OTA_AUTO_CHAIN_RECONNECT_TIMEOUT_MS\n return Math.max(0, session.reconnectDeadline - now)\n}\n\n/** A successful reconnect allows a future pass to establish a fresh wait. */\nexport function clearOtaAutoChainReconnectWait(): void {\n if (session) session.reconnectDeadline = null\n}\n\n/**\n * Admit the next pass of an active chain. Repeated offers, unexpectedly\n * destructive downgrades, and runaway chains fail closed and end automation.\n */\nexport function tryAdvanceOtaAutoChain(\n fingerprint: string,\n isDowngrade: boolean,\n targetVersion: string | null,\n releaseVersion: string | null = null,\n): OtaAutoChainAdvanceResult {\n if (!session) {\n return {advance: false, reason: \"inactive\"}\n }\n\n if (isDowngrade && !session.approvedDowngrade) {\n stopOtaAutoChain()\n return {advance: false, reason: \"downgrade_not_approved\"}\n }\n\n if (session.seenFingerprints.has(fingerprint)) {\n stopOtaAutoChain()\n return {advance: false, reason: \"duplicate\"}\n }\n\n if (session.passCount >= MAX_OTA_AUTO_CHAIN_PASSES) {\n stopOtaAutoChain()\n return {advance: false, reason: \"max_passes\"}\n }\n\n session.seenFingerprints.add(fingerprint)\n session.passCount += 1\n if (targetVersion) session.releaseRange.toVersion = targetVersion\n if (releaseVersion) session.releaseRange.releaseVersion = releaseVersion\n return {advance: true, passCount: session.passCount}\n}\n"]}
@@ -0,0 +1,18 @@
1
+ import type { OtaProgress, OtaStatus } from "../facades/ota";
2
+ export declare const BES_INSTALL_RESTART_MESSAGE = "Restart your glasses to safely exit firmware update mode before trying again";
3
+ /**
4
+ * Offer Change WiFi whenever the OTA flow failed while the glasses were in the
5
+ * download step (any download failure — network, SSL, size cap, verify, etc.).
6
+ *
7
+ * Also covers phone-side watchdog failures that fire while the store still shows
8
+ * an active download phase (stall / global timeout mid-download).
9
+ */
10
+ export declare function shouldShowChangeWifiForOtaDownloadFailure(otaStatus: OtaStatus | null | undefined, otaProgress: OtaProgress | null | undefined, localErrorMessage: string): boolean;
11
+ export declare function getOtaErrorMessage(error?: string): string;
12
+ /**
13
+ * Once a BES install has started, any failure conservatively requires a glasses restart. This
14
+ * avoids adding a BES-specific error code to the wire protocol and, more importantly, never offers
15
+ * an unsafe retry when a generic failure or silence may mean BES entered its raw OTA parser.
16
+ */
17
+ export declare function shouldRequireGlassesRebootForBesFailure(otaStatus: OtaStatus | null | undefined, _otaProgress: OtaProgress | null | undefined, localErrorMessage: string): boolean;
18
+ //# sourceMappingURL=OtaErrorMapping.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OtaErrorMapping.d.ts","sourceRoot":"","sources":["../../src/services/OtaErrorMapping.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,WAAW,EAAE,SAAS,EAAC,MAAM,gBAAgB,CAAA;AAE1D,eAAO,MAAM,2BAA2B,iFACwC,CAAA;AAehF;;;;;;GAMG;AACH,wBAAgB,yCAAyC,CACvD,SAAS,EAAE,SAAS,GAAG,IAAI,GAAG,SAAS,EACvC,WAAW,EAAE,WAAW,GAAG,IAAI,GAAG,SAAS,EAC3C,iBAAiB,EAAE,MAAM,GACxB,OAAO,CAWT;AAED,wBAAgB,kBAAkB,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAqBzD;AAED;;;;GAIG;AACH,wBAAgB,uCAAuC,CACrD,SAAS,EAAE,SAAS,GAAG,IAAI,GAAG,SAAS,EACvC,YAAY,EAAE,WAAW,GAAG,IAAI,GAAG,SAAS,EAC5C,iBAAiB,EAAE,MAAM,GACxB,OAAO,CAKT"}
@@ -0,0 +1,63 @@
1
+ export const BES_INSTALL_RESTART_MESSAGE = "Restart your glasses to safely exit firmware update mode before trying again";
2
+ function isDownloadPhaseSnapshot(otaStatus, otaProgress) {
3
+ if (otaStatus?.phase === "download") {
4
+ return true;
5
+ }
6
+ if (otaProgress?.stage === "download") {
7
+ return true;
8
+ }
9
+ return false;
10
+ }
11
+ /**
12
+ * Offer Change WiFi whenever the OTA flow failed while the glasses were in the
13
+ * download step (any download failure — network, SSL, size cap, verify, etc.).
14
+ *
15
+ * Also covers phone-side watchdog failures that fire while the store still shows
16
+ * an active download phase (stall / global timeout mid-download).
17
+ */
18
+ export function shouldShowChangeWifiForOtaDownloadFailure(otaStatus, otaProgress, localErrorMessage) {
19
+ if (otaStatus?.status === "failed" && otaStatus.phase === "download") {
20
+ return true;
21
+ }
22
+ if (otaProgress?.status === "FAILED" && otaProgress.stage === "download") {
23
+ return true;
24
+ }
25
+ if (localErrorMessage && isDownloadPhaseSnapshot(otaStatus, otaProgress)) {
26
+ return true;
27
+ }
28
+ return false;
29
+ }
30
+ export function getOtaErrorMessage(error) {
31
+ switch (error) {
32
+ case "no_internet":
33
+ return "Glasses WiFi has no internet connection";
34
+ case "clock_skew":
35
+ return "Glasses clock is wrong — syncing time from your phone, then retrying update check";
36
+ case "ssl_error":
37
+ return "Secure connection failed — try a different WiFi network";
38
+ case "download_failed":
39
+ return "Download failed — check glasses WiFi connection";
40
+ case "firmware_too_large":
41
+ return "Firmware file is unexpectedly large — please contact support";
42
+ case "firmware_verify_failed":
43
+ return "Firmware verification failed — please try again or contact support";
44
+ case "apk_verify_failed":
45
+ return "Update verification failed — please try again or contact support";
46
+ case "install_failed":
47
+ return "Install failed — please try again";
48
+ default:
49
+ return error || "Update failed";
50
+ }
51
+ }
52
+ /**
53
+ * Once a BES install has started, any failure conservatively requires a glasses restart. This
54
+ * avoids adding a BES-specific error code to the wire protocol and, more importantly, never offers
55
+ * an unsafe retry when a generic failure or silence may mean BES entered its raw OTA parser.
56
+ */
57
+ export function shouldRequireGlassesRebootForBesFailure(otaStatus, _otaProgress, localErrorMessage) {
58
+ if (otaStatus?.stepType !== "bes" || otaStatus.phase !== "install") {
59
+ return false;
60
+ }
61
+ return otaStatus.status === "failed" || Boolean(localErrorMessage);
62
+ }
63
+ //# sourceMappingURL=OtaErrorMapping.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OtaErrorMapping.js","sourceRoot":"","sources":["../../src/services/OtaErrorMapping.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,2BAA2B,GACtC,8EAA8E,CAAA;AAEhF,SAAS,uBAAuB,CAC9B,SAAuC,EACvC,WAA2C;IAE3C,IAAI,SAAS,EAAE,KAAK,KAAK,UAAU,EAAE,CAAC;QACpC,OAAO,IAAI,CAAA;IACb,CAAC;IACD,IAAI,WAAW,EAAE,KAAK,KAAK,UAAU,EAAE,CAAC;QACtC,OAAO,IAAI,CAAA;IACb,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,yCAAyC,CACvD,SAAuC,EACvC,WAA2C,EAC3C,iBAAyB;IAEzB,IAAI,SAAS,EAAE,MAAM,KAAK,QAAQ,IAAI,SAAS,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;QACrE,OAAO,IAAI,CAAA;IACb,CAAC;IACD,IAAI,WAAW,EAAE,MAAM,KAAK,QAAQ,IAAI,WAAW,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;QACzE,OAAO,IAAI,CAAA;IACb,CAAC;IACD,IAAI,iBAAiB,IAAI,uBAAuB,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,CAAC;QACzE,OAAO,IAAI,CAAA;IACb,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAc;IAC/C,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,aAAa;YAChB,OAAO,yCAAyC,CAAA;QAClD,KAAK,YAAY;YACf,OAAO,mFAAmF,CAAA;QAC5F,KAAK,WAAW;YACd,OAAO,yDAAyD,CAAA;QAClE,KAAK,iBAAiB;YACpB,OAAO,iDAAiD,CAAA;QAC1D,KAAK,oBAAoB;YACvB,OAAO,8DAA8D,CAAA;QACvE,KAAK,wBAAwB;YAC3B,OAAO,oEAAoE,CAAA;QAC7E,KAAK,mBAAmB;YACtB,OAAO,kEAAkE,CAAA;QAC3E,KAAK,gBAAgB;YACnB,OAAO,mCAAmC,CAAA;QAC5C;YACE,OAAO,KAAK,IAAI,eAAe,CAAA;IACnC,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,uCAAuC,CACrD,SAAuC,EACvC,YAA4C,EAC5C,iBAAyB;IAEzB,IAAI,SAAS,EAAE,QAAQ,KAAK,KAAK,IAAI,SAAS,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QACnE,OAAO,KAAK,CAAA;IACd,CAAC;IACD,OAAO,SAAS,CAAC,MAAM,KAAK,QAAQ,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAAA;AACpE,CAAC","sourcesContent":["import type {OtaProgress, OtaStatus} from \"../facades/ota\"\n\nexport const BES_INSTALL_RESTART_MESSAGE =\n \"Restart your glasses to safely exit firmware update mode before trying again\"\n\nfunction isDownloadPhaseSnapshot(\n otaStatus: OtaStatus | null | undefined,\n otaProgress: OtaProgress | null | undefined,\n): boolean {\n if (otaStatus?.phase === \"download\") {\n return true\n }\n if (otaProgress?.stage === \"download\") {\n return true\n }\n return false\n}\n\n/**\n * Offer Change WiFi whenever the OTA flow failed while the glasses were in the\n * download step (any download failure — network, SSL, size cap, verify, etc.).\n *\n * Also covers phone-side watchdog failures that fire while the store still shows\n * an active download phase (stall / global timeout mid-download).\n */\nexport function shouldShowChangeWifiForOtaDownloadFailure(\n otaStatus: OtaStatus | null | undefined,\n otaProgress: OtaProgress | null | undefined,\n localErrorMessage: string,\n): boolean {\n if (otaStatus?.status === \"failed\" && otaStatus.phase === \"download\") {\n return true\n }\n if (otaProgress?.status === \"FAILED\" && otaProgress.stage === \"download\") {\n return true\n }\n if (localErrorMessage && isDownloadPhaseSnapshot(otaStatus, otaProgress)) {\n return true\n }\n return false\n}\n\nexport function getOtaErrorMessage(error?: string): string {\n switch (error) {\n case \"no_internet\":\n return \"Glasses WiFi has no internet connection\"\n case \"clock_skew\":\n return \"Glasses clock is wrong — syncing time from your phone, then retrying update check\"\n case \"ssl_error\":\n return \"Secure connection failed — try a different WiFi network\"\n case \"download_failed\":\n return \"Download failed — check glasses WiFi connection\"\n case \"firmware_too_large\":\n return \"Firmware file is unexpectedly large — please contact support\"\n case \"firmware_verify_failed\":\n return \"Firmware verification failed — please try again or contact support\"\n case \"apk_verify_failed\":\n return \"Update verification failed — please try again or contact support\"\n case \"install_failed\":\n return \"Install failed — please try again\"\n default:\n return error || \"Update failed\"\n }\n}\n\n/**\n * Once a BES install has started, any failure conservatively requires a glasses restart. This\n * avoids adding a BES-specific error code to the wire protocol and, more importantly, never offers\n * an unsafe retry when a generic failure or silence may mean BES entered its raw OTA parser.\n */\nexport function shouldRequireGlassesRebootForBesFailure(\n otaStatus: OtaStatus | null | undefined,\n _otaProgress: OtaProgress | null | undefined,\n localErrorMessage: string,\n): boolean {\n if (otaStatus?.stepType !== \"bes\" || otaStatus.phase !== \"install\") {\n return false\n }\n return otaStatus.status === \"failed\" || Boolean(localErrorMessage)\n}\n"]}
@@ -1,4 +1,25 @@
1
- import type { OtaProgress, OtaStatus } from "@mentra/bluetooth-sdk/internal";
1
+ /**
2
+ * OtaInstallCoordinator — engine-owned OTA install state machine (WP 8B).
3
+ *
4
+ * Owns every timer/retry/sequencing rule that used to live in the host screen
5
+ * `mobile/src/app/ota/progress.tsx`: the global session timeout, serialized
6
+ * ota_start retries, the stuck-at-zero watchdog, the progress-stall watchdog keyed
7
+ * on a staleness signature, connect-edge arbitration (initial mount vs
8
+ * reconnect vs post-APK reboot), the ota_query_status reply fallback, the ping
9
+ * keepalive, the ota_start_ack / mtk_update_complete listeners, and terminal
10
+ * cleanup. The host progress screen is a pure renderer over
11
+ * `snapshot()`/`onSnapshot()` plus the `attach()/detach()/retry()/finish()`
12
+ * commands (exposed as `engine.ota.installSession`).
13
+ *
14
+ * The reaction pass mirrors the old component's effect ordering: a
15
+ * pass diffs the store-derived inputs (connected / otaStatus / otaProgress /
16
+ * displayState / stall signature) exactly like the old effect dep arrays, and
17
+ * state written mid-pass queues a follow-up pass — the same way a setState
18
+ * during React effects scheduled a re-render after the current effect batch.
19
+ */
20
+ import { type OtaProgress, type OtaStatus } from "@mentra/bluetooth-sdk";
21
+ import { type HotspotOtaPhase } from "./HotspotOtaTransport";
22
+ import type { OtaCheckCurrentGlassesResult } from "./OtaUpdateCheckService";
2
23
  import { type DisplayState } from "./otaDisplayState";
3
24
  /** Read model the host progress screen renders from. */
4
25
  export interface OtaInstallSnapshot {
@@ -14,9 +35,30 @@ export interface OtaInstallSnapshot {
14
35
  * +1% ticks up to 60% purely to reassure the user. Render max(real, simulated).
15
36
  */
16
37
  mtkInstallStallSimulatedPercent: number | null;
38
+ /** True for a downgrade (version-change) session — the UI narrates it differently. */
39
+ isVersionChange: boolean;
40
+ /** True once the glasses reported the exact pinned target (the downgrade truly completed). */
41
+ versionChangeConverged: boolean;
42
+ /**
43
+ * Sub-phase of the downgrade detour for the progress narrative, or null when not
44
+ * in one: "installing" before the handoff, "restarting" while the glasses are dark
45
+ * (uninstall / factory flicker / target install), "verifying" once reconnected and
46
+ * checking the version. Completion is the "complete" displayState.
47
+ */
48
+ versionChangePhase: "installing" | "restarting" | "verifying" | null;
49
+ /** Pre-ota_start phone staging/join state for a hotspot attempt. */
50
+ hotspotPhase: HotspotOtaPhase;
51
+ hotspotArtifactPercent: number | null;
52
+ /** Transport selected from the checked glasses capabilities and Wi-Fi state. */
53
+ transport: "wifi" | "hotspot";
17
54
  }
18
55
  declare class OtaInstallCoordinator {
19
56
  private attached;
57
+ private preparedCheckResult;
58
+ private selectedTransport;
59
+ private hotspotManifestUrl;
60
+ private hotspotPhase;
61
+ private hotspotArtifactPercent;
20
62
  private errorMsg;
21
63
  private sawReconnectEdge;
22
64
  private continueButtonDisabled;
@@ -25,6 +67,14 @@ declare class OtaInstallCoordinator {
25
67
  private initialBuildNumber;
26
68
  private apkExpectedInSession;
27
69
  private apkCompletedViaBuildIncrease;
70
+ private protocolProfile;
71
+ private besRestartExpected;
72
+ private besRestartDisconnectObserved;
73
+ private besRestartRecovery;
74
+ private versionChangeSession;
75
+ private versionChangeTarget;
76
+ private versionChangeInstallStarted;
77
+ private versionChangeConverged;
28
78
  private legacyApkSettleHold;
29
79
  private mtkSimulatedPercent;
30
80
  private lastRealMtkProgress;
@@ -33,14 +83,15 @@ declare class OtaInstallCoordinator {
33
83
  private retryTimeout;
34
84
  private stuckTimeout;
35
85
  private progressTimeout;
36
- private postApkDelay;
37
86
  private pingInterval;
38
87
  private queryReplyTimeout;
39
88
  private continueLockoutTimer;
89
+ private restartRecoveryTimeout;
40
90
  private legacyApkSettleTimer;
41
91
  private mtkStallDetectTimer;
42
92
  private mtkSimTickTimer;
43
- private hasReceivedAck;
93
+ private apkInstallPollInFlight;
94
+ private otaStartOwnership;
44
95
  private hasFirstActivity;
45
96
  private hasFirstNonZeroProgress;
46
97
  private retryCount;
@@ -55,6 +106,8 @@ declare class OtaInstallCoordinator {
55
106
  private reactQueued;
56
107
  private storeUnsubscribe;
57
108
  private snapshotCheckers;
109
+ /** Select the transport at the existing install entry point before the progress route attaches. */
110
+ prepare(checkResult: OtaCheckCurrentGlassesResult): "wifi" | "hotspot";
58
111
  /**
59
112
  * Bind the state machine to a mounted progress screen. Idempotent per
60
113
  * attach/detach cycle. Runs the initial-mount arbitration (send ota_start
@@ -75,15 +128,25 @@ declare class OtaInstallCoordinator {
75
128
  * stays in the screen): clear the selected update, and after an APK step
76
129
  * clear the stale build number so the next check re-reads version_info.
77
130
  */
78
- finish(): void;
131
+ finish(): Promise<void>;
79
132
  /**
80
133
  * Abandon an interrupted session (the super-mode skip): terminal cleanup
81
134
  * plus dropping the session's status/progress read-state, so
82
135
  * deriveDisplayState doesn't resurrect the stale install when the host
83
136
  * navigates away and back through /ota routes.
84
137
  */
85
- discard(): void;
138
+ discard(): Promise<void>;
86
139
  snapshot(): OtaInstallSnapshot;
140
+ /**
141
+ * True while the recovery worker owns the downgrade transaction (after the apk install
142
+ * started, before convergence). During this window ASG is being uninstalled/reinstalled and
143
+ * cannot answer the phone, so the coordinator must not ping, poll ota_query_status, or arm the
144
+ * progress-stall watchdog — doing so drives the passive factory build and fails the session
145
+ * before the target reconnects. Completion is exact-version convergence, detected separately.
146
+ */
147
+ private isInVersionChangeDetour;
148
+ /** Downgrade-detour sub-phase for the progress narrative (see OtaInstallSnapshot). */
149
+ private deriveVersionChangePhase;
87
150
  /**
88
151
  * Subscribe to install snapshot changes, deduped on the projected JSON.
89
152
  * Fires on glasses-store changes AND coordinator-internal state changes
@@ -91,6 +154,10 @@ declare class OtaInstallCoordinator {
91
154
  */
92
155
  onSnapshot(cb: (snapshot: OtaInstallSnapshot) => void): () => void;
93
156
  private resetSessionState;
157
+ /** Begin a genuinely new command attempt only after native ownership has settled. */
158
+ private prepareFreshOtaStartAttempt;
159
+ /** Reset only the reboot lifecycle that belongs to one install attempt. */
160
+ private resetBesRestartAttempt;
94
161
  /** Notify snapshot subscribers of a coordinator-internal state change. */
95
162
  private emitInternalChange;
96
163
  private setErrorMsg;
@@ -100,11 +167,7 @@ declare class OtaInstallCoordinator {
100
167
  private setLegacyApkSettleHold;
101
168
  /** Display-only (WP 8C-e): notifies snapshot subscribers but never queues a reaction pass. */
102
169
  private setMtkSimulatedPercent;
103
- /**
104
- * Legacy-session shape (WP 8C): event shape wins once events exist; before any event
105
- * only the session-start build number can tell (falls back to the live build number
106
- * until it is captured). Old builds get the LEGACY_* padded policy durations.
107
- */
170
+ /** Legacy/unified policy is selected once, matching the old sticky route choice. */
108
171
  private isLegacySessionShapeNow;
109
172
  private react;
110
173
  /**
@@ -112,8 +175,22 @@ declare class OtaInstallCoordinator {
112
175
  * component, in the old declaration order.
113
176
  */
114
177
  private runPass;
178
+ /**
179
+ * Reconnect arbitration shared by the physical BLE connect edge and the
180
+ * glasses_session_changed signal. The latter exists because the BES keeps the BLE
181
+ * link alive across asg_client restarts (APK OTA): no physical edge ever fires, so
182
+ * the changed process session id is the only reconnect signal the coordinator gets
183
+ * (incident rep_01KY6BJ0B7A4RBMQ7VN39KAE5E). Always returns true (the caller's
184
+ * edge handling is complete).
185
+ */
186
+ private runReconnectArbitration;
115
187
  private runConnectEdge;
116
188
  private readonly handleAck;
189
+ /**
190
+ * The asg process restarted while the BES kept the BLE link up (sid change observed
191
+ * by the bridge): treat it exactly like a physical reconnect edge.
192
+ */
193
+ private readonly handleGlassesSessionChanged;
117
194
  private readonly handleMtkComplete;
118
195
  /**
119
196
  * Reacts to a NEW legacy-shaped install-phase "complete" (an old build's
@@ -126,6 +203,9 @@ declare class OtaInstallCoordinator {
126
203
  * starting/failed (post-reboot explicit signal) completion is immediate.
127
204
  */
128
205
  private handleLegacyInstallCompleteEdge;
206
+ private isBesRestartExpected;
207
+ /** Complete only after a protocol-authorized BES restart traverses disconnect -> reconnect. */
208
+ private completeBesRestartRecovery;
129
209
  /**
130
210
  * Legacy MTK install stall simulation (WP 8C-e), ported verbatim: the MTK system
131
211
  * install typically stalls around 49-50%. Every real event restarts stall detection;
@@ -141,7 +221,25 @@ declare class OtaInstallCoordinator {
141
221
  */
142
222
  private computeDisplayStateNow;
143
223
  /**
144
- * "Glasses are talking to us" — clears the no-ack retry watchdog only.
224
+ * During an APK install the package installer kills and restarts the glasses
225
+ * process, and the new process's completion push can lose its startup race
226
+ * against the UART transport (incident rep_01KY31HEMTSBSMK8DVMNXJ5XGG: the
227
+ * phone sat on a stale "install in_progress 0%" until the stall watchdog
228
+ * failed a successful update). The persisted session on the glasses always
229
+ * knows the truth, so poll ota_query_status on the keepalive tick while an
230
+ * apk step sits in its install phase — the reply either confirms progress or
231
+ * delivers the missed completion. Gated to the apk install phase so a stray
232
+ * idle reply can't disturb an active download; legacy (< 37) builds ignore
233
+ * the query, which is harmless.
234
+ *
235
+ * The native query pends up to 15s and rejects a concurrent call with
236
+ * request_in_flight — longer than the 10s tick — so exactly one poll is kept
237
+ * in flight (the glasses being slow to answer IS the silent-restart window
238
+ * this poll exists for) and rejections are swallowed: the next tick retries.
239
+ */
240
+ private maybePollApkInstallStatus;
241
+ /**
242
+ * "Glasses are talking to us" — suppresses retry if the native request later rejects.
145
243
  * Important: this does NOT clear the stuck-at-zero watchdog; that one fires
146
244
  * on real progress > 0% (see {@link onFirstNonZeroProgress}).
147
245
  */
@@ -155,14 +253,19 @@ declare class OtaInstallCoordinator {
155
253
  */
156
254
  private onFirstNonZeroProgress;
157
255
  private maybeStartGlobalTimeout;
158
- private armAckAndStuckWatchdogsOnly;
256
+ private armStuckWatchdogOnly;
257
+ /** Arm the 0%-stuck watchdog only when this logical session has none. */
258
+ private maybeArmStuckWatchdog;
159
259
  private sendOtaStartWithWatchdogs;
260
+ private performOtaStart;
261
+ private teardownHotspotTransport;
160
262
  /**
161
263
  * After sending ota_query_status, wait QUERY_REPLY_TIMEOUT_MS for the glasses
162
- * to reply with a useful ota_status. If nothing arrives (e.g. the glasses'
163
- * OTA session was wiped between mount and reconnect), or the glasses reply
164
- * with an explicit "idle" status (no session), fall back to ota_start so the
165
- * user doesn't sit on a spinner forever.
264
+ * to reply with a useful ota_status. A unified session may start again only
265
+ * after an explicit "idle" reply, or after a locally rejected ota_start has
266
+ * produced no activity and no authoritative reply across reconnect. Legacy
267
+ * builds ignore ota_query_status, so their established timeout fallback
268
+ * remains the compatibility path.
166
269
  *
167
270
  * Cleared as soon as a non-idle otaStatus or any otaProgress lands in the
168
271
  * store (see the reaction block above). An idle reply intentionally does NOT
@@ -173,10 +276,10 @@ declare class OtaInstallCoordinator {
173
276
  private clearRetryTimeout;
174
277
  private clearStuckTimeout;
175
278
  private clearGlobalTimeout;
176
- private clearPostApkDelay;
177
279
  private clearPingInterval;
178
280
  private clearQueryReplyTimeout;
179
281
  private clearContinueLockoutTimer;
282
+ private clearRestartRecoveryTimeout;
180
283
  private clearLegacyApkSettleTimer;
181
284
  private clearMtkSimulationTimers;
182
285
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"OtaInstallCoordinator.d.ts","sourceRoot":"","sources":["../../src/services/OtaInstallCoordinator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"OtaInstallCoordinator.d.ts","sourceRoot":"","sources":["../../src/services/OtaInstallCoordinator.ts"],"names":[],"mappings":"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"}