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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (503) hide show
  1. package/README.md +55 -18
  2. package/build/bluetooth-sdk/debug.d.ts +2 -0
  3. package/build/bluetooth-sdk/debug.d.ts.map +1 -0
  4. package/build/bluetooth-sdk/debug.js +2 -0
  5. package/build/bluetooth-sdk/debug.js.map +1 -0
  6. package/build/bluetooth-sdk/index.d.ts +3 -0
  7. package/build/bluetooth-sdk/index.d.ts.map +1 -0
  8. package/build/bluetooth-sdk/index.js +3 -0
  9. package/build/bluetooth-sdk/index.js.map +1 -0
  10. package/build/bluetooth-sdk/photo-receiver.d.ts +3 -0
  11. package/build/bluetooth-sdk/photo-receiver.d.ts.map +1 -0
  12. package/build/bluetooth-sdk/photo-receiver.js +3 -0
  13. package/build/bluetooth-sdk/photo-receiver.js.map +1 -0
  14. package/build/bluetooth-sdk/react.d.ts +2 -0
  15. package/build/bluetooth-sdk/react.d.ts.map +1 -0
  16. package/build/bluetooth-sdk/react.js +2 -0
  17. package/build/bluetooth-sdk/react.js.map +1 -0
  18. package/build/bluetooth-sdk/types.d.ts +2 -0
  19. package/build/bluetooth-sdk/types.d.ts.map +1 -0
  20. package/build/bluetooth-sdk/types.js +2 -0
  21. package/build/bluetooth-sdk/types.js.map +1 -0
  22. package/build/engine.d.ts +24 -16
  23. package/build/engine.d.ts.map +1 -1
  24. package/build/engine.js +9 -4
  25. package/build/engine.js.map +1 -1
  26. package/build/facades/dev.d.ts +3 -2
  27. package/build/facades/dev.d.ts.map +1 -1
  28. package/build/facades/dev.js +18 -12
  29. package/build/facades/dev.js.map +1 -1
  30. package/build/facades/display.d.ts +1 -1
  31. package/build/facades/display.d.ts.map +1 -1
  32. package/build/facades/display.js +1 -1
  33. package/build/facades/display.js.map +1 -1
  34. package/build/facades/gallery.js +1 -1
  35. package/build/facades/gallery.js.map +1 -1
  36. package/build/facades/glasses.d.ts +4 -13
  37. package/build/facades/glasses.d.ts.map +1 -1
  38. package/build/facades/glasses.js +21 -6
  39. package/build/facades/glasses.js.map +1 -1
  40. package/build/facades/glassesSettings.d.ts.map +1 -1
  41. package/build/facades/glassesSettings.js +1 -0
  42. package/build/facades/glassesSettings.js.map +1 -1
  43. package/build/facades/miniapps.d.ts +4 -0
  44. package/build/facades/miniapps.d.ts.map +1 -1
  45. package/build/facades/miniapps.js +5 -0
  46. package/build/facades/miniapps.js.map +1 -1
  47. package/build/facades/ota.d.ts +14 -16
  48. package/build/facades/ota.d.ts.map +1 -1
  49. package/build/facades/ota.js +22 -7
  50. package/build/facades/ota.js.map +1 -1
  51. package/build/facades/pairing.d.ts +8 -5
  52. package/build/facades/pairing.d.ts.map +1 -1
  53. package/build/facades/pairing.js +12 -10
  54. package/build/facades/pairing.js.map +1 -1
  55. package/build/facades/permissions.d.ts +10 -0
  56. package/build/facades/permissions.d.ts.map +1 -1
  57. package/build/facades/permissions.js +10 -0
  58. package/build/facades/permissions.js.map +1 -1
  59. package/build/facades/phoneNotifications.d.ts +0 -4
  60. package/build/facades/phoneNotifications.d.ts.map +1 -1
  61. package/build/facades/phoneNotifications.js +4 -14
  62. package/build/facades/phoneNotifications.js.map +1 -1
  63. package/build/facades/speech.d.ts +7 -6
  64. package/build/facades/speech.d.ts.map +1 -1
  65. package/build/facades/speech.js +1 -1
  66. package/build/facades/speech.js.map +1 -1
  67. package/build/generated/releaseMetadata.d.ts +12 -0
  68. package/build/generated/releaseMetadata.d.ts.map +1 -0
  69. package/build/generated/releaseMetadata.js +10 -0
  70. package/build/generated/releaseMetadata.js.map +1 -0
  71. package/build/index.d.ts +10 -8
  72. package/build/index.d.ts.map +1 -1
  73. package/build/index.js +6 -5
  74. package/build/index.js.map +1 -1
  75. package/build/react/MentraLiveOtaFlow.d.ts +38 -0
  76. package/build/react/MentraLiveOtaFlow.d.ts.map +1 -0
  77. package/build/react/MentraLiveOtaFlow.js +528 -0
  78. package/build/react/MentraLiveOtaFlow.js.map +1 -0
  79. package/build/react/index.d.ts +2 -0
  80. package/build/react/index.d.ts.map +1 -0
  81. package/build/react/index.js +2 -0
  82. package/build/react/index.js.map +1 -0
  83. package/build/react/useEngineSnapshot.d.ts +2 -0
  84. package/build/react/useEngineSnapshot.d.ts.map +1 -0
  85. package/build/react/useEngineSnapshot.js +14 -0
  86. package/build/react/useEngineSnapshot.js.map +1 -0
  87. package/build/runtime/bootstrap.d.ts +24 -1
  88. package/build/runtime/bootstrap.d.ts.map +1 -1
  89. package/build/runtime/bootstrap.js +17 -0
  90. package/build/runtime/bootstrap.js.map +1 -1
  91. package/build/runtime/scanQrSeam.d.ts +7 -0
  92. package/build/runtime/scanQrSeam.d.ts.map +1 -0
  93. package/build/runtime/scanQrSeam.js +16 -0
  94. package/build/runtime/scanQrSeam.js.map +1 -0
  95. package/build/services/AppRegistry.d.ts +41 -57
  96. package/build/services/AppRegistry.d.ts.map +1 -1
  97. package/build/services/AppRegistry.js +208 -144
  98. package/build/services/AppRegistry.js.map +1 -1
  99. package/build/services/AudioCloudUplink.d.ts +12 -0
  100. package/build/services/AudioCloudUplink.d.ts.map +1 -1
  101. package/build/services/AudioCloudUplink.js +22 -1
  102. package/build/services/AudioCloudUplink.js.map +1 -1
  103. package/build/services/AudioPlaybackService.d.ts +41 -2
  104. package/build/services/AudioPlaybackService.d.ts.map +1 -1
  105. package/build/services/AudioPlaybackService.js +250 -33
  106. package/build/services/AudioPlaybackService.js.map +1 -1
  107. package/build/services/BlobStore.d.ts +2 -1
  108. package/build/services/BlobStore.d.ts.map +1 -1
  109. package/build/services/BlobStore.js +17 -9
  110. package/build/services/BlobStore.js.map +1 -1
  111. package/build/services/CloudAudioSubscriptionSync.d.ts.map +1 -1
  112. package/build/services/CloudAudioSubscriptionSync.js +13 -1
  113. package/build/services/CloudAudioSubscriptionSync.js.map +1 -1
  114. package/build/services/CloudClientService.d.ts +15 -0
  115. package/build/services/CloudClientService.d.ts.map +1 -1
  116. package/build/services/CloudClientService.js +93 -1
  117. package/build/services/CloudClientService.js.map +1 -1
  118. package/build/services/DeviceEventRouter.js +5 -5
  119. package/build/services/DeviceEventRouter.js.map +1 -1
  120. package/build/services/ForegroundLocationPermission.d.ts +13 -0
  121. package/build/services/ForegroundLocationPermission.d.ts.map +1 -0
  122. package/build/services/ForegroundLocationPermission.js +12 -0
  123. package/build/services/ForegroundLocationPermission.js.map +1 -0
  124. package/build/services/GlassesSettingsSync.d.ts.map +1 -1
  125. package/build/services/GlassesSettingsSync.js +9 -3
  126. package/build/services/GlassesSettingsSync.js.map +1 -1
  127. package/build/services/GlassesStatusProjection.d.ts +2 -1
  128. package/build/services/GlassesStatusProjection.d.ts.map +1 -1
  129. package/build/services/GlassesStatusProjection.js +15 -8
  130. package/build/services/GlassesStatusProjection.js.map +1 -1
  131. package/build/services/HotspotOtaTransport.d.ts +29 -0
  132. package/build/services/HotspotOtaTransport.d.ts.map +1 -0
  133. package/build/services/HotspotOtaTransport.js +146 -0
  134. package/build/services/HotspotOtaTransport.js.map +1 -0
  135. package/build/services/HotspotShutdown.d.ts +17 -0
  136. package/build/services/HotspotShutdown.d.ts.map +1 -0
  137. package/build/services/HotspotShutdown.js +29 -0
  138. package/build/services/HotspotShutdown.js.map +1 -0
  139. package/build/services/LocalDisplayManager.d.ts +15 -0
  140. package/build/services/LocalDisplayManager.d.ts.map +1 -1
  141. package/build/services/LocalDisplayManager.js +106 -20
  142. package/build/services/LocalDisplayManager.js.map +1 -1
  143. package/build/services/LocalMiniappRuntime.d.ts +74 -2
  144. package/build/services/LocalMiniappRuntime.d.ts.map +1 -1
  145. package/build/services/LocalMiniappRuntime.js +785 -291
  146. package/build/services/LocalMiniappRuntime.js.map +1 -1
  147. package/build/services/LocalMiniappStorage.d.ts +32 -0
  148. package/build/services/LocalMiniappStorage.d.ts.map +1 -0
  149. package/build/services/LocalMiniappStorage.js +66 -0
  150. package/build/services/LocalMiniappStorage.js.map +1 -0
  151. package/build/services/LocalMiniappUserIdentity.d.ts +20 -0
  152. package/build/services/LocalMiniappUserIdentity.d.ts.map +1 -0
  153. package/build/services/LocalMiniappUserIdentity.js +43 -0
  154. package/build/services/LocalMiniappUserIdentity.js.map +1 -0
  155. package/build/services/LocalSttFallbackCoordinator.d.ts +9 -6
  156. package/build/services/LocalSttFallbackCoordinator.d.ts.map +1 -1
  157. package/build/services/LocalSttFallbackCoordinator.js +18 -12
  158. package/build/services/LocalSttFallbackCoordinator.js.map +1 -1
  159. package/build/services/MicStateCoordinator.d.ts +42 -1
  160. package/build/services/MicStateCoordinator.d.ts.map +1 -1
  161. package/build/services/MicStateCoordinator.js +141 -3
  162. package/build/services/MicStateCoordinator.js.map +1 -1
  163. package/build/services/MiniappLauncher.d.ts.map +1 -1
  164. package/build/services/MiniappLauncher.js +23 -3
  165. package/build/services/MiniappLauncher.js.map +1 -1
  166. package/build/services/MiniappLiveness.d.ts +12 -0
  167. package/build/services/MiniappLiveness.d.ts.map +1 -0
  168. package/build/services/MiniappLiveness.js +16 -0
  169. package/build/services/MiniappLiveness.js.map +1 -0
  170. package/build/services/NativeHttpResponse.d.ts +3 -0
  171. package/build/services/NativeHttpResponse.d.ts.map +1 -0
  172. package/build/services/NativeHttpResponse.js +6 -0
  173. package/build/services/NativeHttpResponse.js.map +1 -0
  174. package/build/services/OtaArtifactDownloader.d.ts +65 -0
  175. package/build/services/OtaArtifactDownloader.d.ts.map +1 -0
  176. package/build/services/OtaArtifactDownloader.js +226 -0
  177. package/build/services/OtaArtifactDownloader.js.map +1 -0
  178. package/build/services/OtaAutoChain.d.ts +34 -0
  179. package/build/services/OtaAutoChain.d.ts.map +1 -0
  180. package/build/services/OtaAutoChain.js +83 -0
  181. package/build/services/OtaAutoChain.js.map +1 -0
  182. package/build/services/OtaErrorMapping.d.ts +18 -0
  183. package/build/services/OtaErrorMapping.d.ts.map +1 -0
  184. package/build/services/OtaErrorMapping.js +63 -0
  185. package/build/services/OtaErrorMapping.js.map +1 -0
  186. package/build/services/OtaInstallCoordinator.d.ts +95 -15
  187. package/build/services/OtaInstallCoordinator.d.ts.map +1 -1
  188. package/build/services/OtaInstallCoordinator.js +577 -130
  189. package/build/services/OtaInstallCoordinator.js.map +1 -1
  190. package/build/services/OtaService.d.ts.map +1 -1
  191. package/build/services/OtaService.js +8 -1
  192. package/build/services/OtaService.js.map +1 -1
  193. package/build/services/OtaUpdateCheckService.d.ts +39 -4
  194. package/build/services/OtaUpdateCheckService.d.ts.map +1 -1
  195. package/build/services/OtaUpdateCheckService.js +138 -22
  196. package/build/services/OtaUpdateCheckService.js.map +1 -1
  197. package/build/services/PhoneCalendarHelpers.d.ts +32 -0
  198. package/build/services/PhoneCalendarHelpers.d.ts.map +1 -0
  199. package/build/services/PhoneCalendarHelpers.js +157 -0
  200. package/build/services/PhoneCalendarHelpers.js.map +1 -0
  201. package/build/services/PhoneCalendarService.d.ts +5 -0
  202. package/build/services/PhoneCalendarService.d.ts.map +1 -0
  203. package/build/services/PhoneCalendarService.js +45 -0
  204. package/build/services/PhoneCalendarService.js.map +1 -0
  205. package/build/services/PhoneCameraFovCoordinator.d.ts +30 -0
  206. package/build/services/PhoneCameraFovCoordinator.d.ts.map +1 -0
  207. package/build/services/PhoneCameraFovCoordinator.js +194 -0
  208. package/build/services/PhoneCameraFovCoordinator.js.map +1 -0
  209. package/build/services/PhoneNotificationsSync.d.ts.map +1 -1
  210. package/build/services/PhoneNotificationsSync.js +12 -10
  211. package/build/services/PhoneNotificationsSync.js.map +1 -1
  212. package/build/services/PhonePhotoCoordinator.d.ts +26 -2
  213. package/build/services/PhonePhotoCoordinator.d.ts.map +1 -1
  214. package/build/services/PhonePhotoCoordinator.js +79 -9
  215. package/build/services/PhonePhotoCoordinator.js.map +1 -1
  216. package/build/services/PhoneStreamCoordinator.d.ts +8 -1
  217. package/build/services/PhoneStreamCoordinator.d.ts.map +1 -1
  218. package/build/services/PhoneStreamCoordinator.js +125 -13
  219. package/build/services/PhoneStreamCoordinator.js.map +1 -1
  220. package/build/services/PhoneVideoCoordinator.d.ts +2 -0
  221. package/build/services/PhoneVideoCoordinator.d.ts.map +1 -1
  222. package/build/services/PhoneVideoCoordinator.js +10 -0
  223. package/build/services/PhoneVideoCoordinator.js.map +1 -1
  224. package/build/services/SceneRenderer.d.ts.map +1 -1
  225. package/build/services/SceneRenderer.js +15 -0
  226. package/build/services/SceneRenderer.js.map +1 -1
  227. package/build/services/SentenceTtsPipeline.d.ts +31 -0
  228. package/build/services/SentenceTtsPipeline.d.ts.map +1 -0
  229. package/build/services/SentenceTtsPipeline.js +67 -0
  230. package/build/services/SentenceTtsPipeline.js.map +1 -0
  231. package/build/services/SupportProfileSync.d.ts +22 -0
  232. package/build/services/SupportProfileSync.d.ts.map +1 -0
  233. package/build/services/SupportProfileSync.js +213 -0
  234. package/build/services/SupportProfileSync.js.map +1 -0
  235. package/build/services/TranscriptionRouting.d.ts +12 -0
  236. package/build/services/TranscriptionRouting.d.ts.map +1 -0
  237. package/build/services/TranscriptionRouting.js +24 -0
  238. package/build/services/TranscriptionRouting.js.map +1 -0
  239. package/build/services/TtsTextSanitizer.d.ts +5 -0
  240. package/build/services/TtsTextSanitizer.d.ts.map +1 -0
  241. package/build/services/TtsTextSanitizer.js +61 -0
  242. package/build/services/TtsTextSanitizer.js.map +1 -0
  243. package/build/services/WifiAdbRequest.d.ts +17 -0
  244. package/build/services/WifiAdbRequest.d.ts.map +1 -0
  245. package/build/services/WifiAdbRequest.js +35 -0
  246. package/build/services/WifiAdbRequest.js.map +1 -0
  247. package/build/services/asg/asgCameraApi.d.ts +43 -0
  248. package/build/services/asg/asgCameraApi.d.ts.map +1 -1
  249. package/build/services/asg/asgCameraApi.js +509 -26
  250. package/build/services/asg/asgCameraApi.js.map +1 -1
  251. package/build/services/asg/cameraRollExportCoordinator.d.ts +60 -0
  252. package/build/services/asg/cameraRollExportCoordinator.d.ts.map +1 -0
  253. package/build/services/asg/cameraRollExportCoordinator.js +618 -0
  254. package/build/services/asg/cameraRollExportCoordinator.js.map +1 -0
  255. package/build/services/asg/cameraRollExportLedger.d.ts +44 -0
  256. package/build/services/asg/cameraRollExportLedger.d.ts.map +1 -0
  257. package/build/services/asg/cameraRollExportLedger.js +78 -0
  258. package/build/services/asg/cameraRollExportLedger.js.map +1 -0
  259. package/build/services/asg/galleryNotices.d.ts +1 -1
  260. package/build/services/asg/galleryNotices.d.ts.map +1 -1
  261. package/build/services/asg/galleryNotices.js.map +1 -1
  262. package/build/services/asg/galleryPathMigration.d.ts +3 -0
  263. package/build/services/asg/galleryPathMigration.d.ts.map +1 -0
  264. package/build/services/asg/galleryPathMigration.js +26 -0
  265. package/build/services/asg/galleryPathMigration.js.map +1 -0
  266. package/build/services/asg/gallerySettingsService.d.ts +1 -0
  267. package/build/services/asg/gallerySettingsService.d.ts.map +1 -1
  268. package/build/services/asg/gallerySettingsService.js +2 -0
  269. package/build/services/asg/gallerySettingsService.js.map +1 -1
  270. package/build/services/asg/gallerySyncService.d.ts.map +1 -1
  271. package/build/services/asg/gallerySyncService.js +162 -56
  272. package/build/services/asg/gallerySyncService.js.map +1 -1
  273. package/build/services/asg/galleryTransferLedger.d.ts +58 -0
  274. package/build/services/asg/galleryTransferLedger.d.ts.map +1 -0
  275. package/build/services/asg/galleryTransferLedger.js +225 -0
  276. package/build/services/asg/galleryTransferLedger.js.map +1 -0
  277. package/build/services/asg/localNetworkTransport.d.ts +15 -0
  278. package/build/services/asg/localNetworkTransport.d.ts.map +1 -0
  279. package/build/services/asg/localNetworkTransport.js +144 -0
  280. package/build/services/asg/localNetworkTransport.js.map +1 -0
  281. package/build/services/asg/localStorageService.d.ts +18 -0
  282. package/build/services/asg/localStorageService.d.ts.map +1 -1
  283. package/build/services/asg/localStorageService.js +168 -19
  284. package/build/services/asg/localStorageService.js.map +1 -1
  285. package/build/services/asg/mediaProcessingQueue.d.ts +10 -0
  286. package/build/services/asg/mediaProcessingQueue.d.ts.map +1 -1
  287. package/build/services/asg/mediaProcessingQueue.js +193 -62
  288. package/build/services/asg/mediaProcessingQueue.js.map +1 -1
  289. package/build/services/audioPlaybackAssets.d.ts +8 -0
  290. package/build/services/audioPlaybackAssets.d.ts.map +1 -0
  291. package/build/services/audioPlaybackAssets.js +7 -0
  292. package/build/services/audioPlaybackAssets.js.map +1 -0
  293. package/build/services/gallerySyncClock.js +1 -1
  294. package/build/services/gallerySyncClock.js.map +1 -1
  295. package/build/services/glassesClockSync.d.ts.map +1 -1
  296. package/build/services/glassesClockSync.js +6 -2
  297. package/build/services/glassesClockSync.js.map +1 -1
  298. package/build/services/manifestActions.d.ts +7 -0
  299. package/build/services/manifestActions.d.ts.map +1 -0
  300. package/build/services/manifestActions.js +25 -0
  301. package/build/services/manifestActions.js.map +1 -0
  302. package/build/services/otaDisplayState.d.ts +23 -12
  303. package/build/services/otaDisplayState.d.ts.map +1 -1
  304. package/build/services/otaDisplayState.js +36 -14
  305. package/build/services/otaDisplayState.js.map +1 -1
  306. package/build/services/otaInstallPolicy.d.ts +16 -4
  307. package/build/services/otaInstallPolicy.d.ts.map +1 -1
  308. package/build/services/otaInstallPolicy.js +24 -3
  309. package/build/services/otaInstallPolicy.js.map +1 -1
  310. package/build/services/otaLegacyMapping.d.ts +1 -1
  311. package/build/services/otaLegacyMapping.d.ts.map +1 -1
  312. package/build/services/otaLegacyMapping.js.map +1 -1
  313. package/build/services/otaManifestPolicy.d.ts +14 -0
  314. package/build/services/otaManifestPolicy.d.ts.map +1 -0
  315. package/build/services/otaManifestPolicy.js +19 -0
  316. package/build/services/otaManifestPolicy.js.map +1 -0
  317. package/build/services/otaManifestUrl.d.ts +3 -0
  318. package/build/services/otaManifestUrl.d.ts.map +1 -0
  319. package/build/services/otaManifestUrl.js +38 -0
  320. package/build/services/otaManifestUrl.js.map +1 -0
  321. package/build/services/slimStreamStatus.d.ts +11 -0
  322. package/build/services/slimStreamStatus.d.ts.map +1 -1
  323. package/build/services/slimStreamStatus.js +14 -4
  324. package/build/services/slimStreamStatus.js.map +1 -1
  325. package/build/stores/apps.d.ts.map +1 -1
  326. package/build/stores/apps.js +11 -0
  327. package/build/stores/apps.js.map +1 -1
  328. package/build/stores/bluetoothSettingKeys.d.ts.map +1 -1
  329. package/build/stores/bluetoothSettingKeys.js +2 -0
  330. package/build/stores/bluetoothSettingKeys.js.map +1 -1
  331. package/build/stores/gallerySync.d.ts +2 -0
  332. package/build/stores/gallerySync.d.ts.map +1 -1
  333. package/build/stores/gallerySync.js +2 -0
  334. package/build/stores/gallerySync.js.map +1 -1
  335. package/build/stores/glasses.d.ts.map +1 -1
  336. package/build/stores/glasses.js +3 -0
  337. package/build/stores/glasses.js.map +1 -1
  338. package/build/stores/settings.d.ts +17 -0
  339. package/build/stores/settings.d.ts.map +1 -1
  340. package/build/stores/settings.js +157 -17
  341. package/build/stores/settings.js.map +1 -1
  342. package/build/types/applet.d.ts +2 -0
  343. package/build/types/applet.d.ts.map +1 -1
  344. package/build/types/applet.js.map +1 -1
  345. package/build/types/asg.d.ts +7 -0
  346. package/build/types/asg.d.ts.map +1 -1
  347. package/build/types/asg.js.map +1 -1
  348. package/build/types/enums.d.ts +2 -25
  349. package/build/types/enums.d.ts.map +1 -1
  350. package/build/types/enums.js +2 -27
  351. package/build/types/enums.js.map +1 -1
  352. package/build/types/hardware.d.ts +4 -13
  353. package/build/types/hardware.d.ts.map +1 -1
  354. package/build/types/hardware.js +15 -3
  355. package/build/types/hardware.js.map +1 -1
  356. package/build/types/index.d.ts +2 -6
  357. package/build/types/index.d.ts.map +1 -1
  358. package/build/types/index.js +2 -6
  359. package/build/types/index.js.map +1 -1
  360. package/build/utils/configuredDevHost.d.ts +6 -0
  361. package/build/utils/configuredDevHost.d.ts.map +1 -0
  362. package/build/utils/configuredDevHost.js +19 -0
  363. package/build/utils/configuredDevHost.js.map +1 -0
  364. package/build/utils/devMiniappLaunch.d.ts +19 -8
  365. package/build/utils/devMiniappLaunch.d.ts.map +1 -1
  366. package/build/utils/devMiniappLaunch.js +144 -21
  367. package/build/utils/devMiniappLaunch.js.map +1 -1
  368. package/build/utils/diagnosticContext.d.ts.map +1 -1
  369. package/build/utils/diagnosticContext.js +15 -17
  370. package/build/utils/diagnosticContext.js.map +1 -1
  371. package/build/utils/hardware/hardware.d.ts.map +1 -1
  372. package/build/utils/hardware/hardware.js +7 -3
  373. package/build/utils/hardware/hardware.js.map +1 -1
  374. package/build/utils/miniappDiagnostics.d.ts +64 -0
  375. package/build/utils/miniappDiagnostics.d.ts.map +1 -0
  376. package/build/utils/miniappDiagnostics.js +173 -0
  377. package/build/utils/miniappDiagnostics.js.map +1 -0
  378. package/build/utils/permissions/MediaLibraryPermissions.d.ts +11 -0
  379. package/build/utils/permissions/MediaLibraryPermissions.d.ts.map +1 -1
  380. package/build/utils/permissions/MediaLibraryPermissions.js +27 -4
  381. package/build/utils/permissions/MediaLibraryPermissions.js.map +1 -1
  382. package/build/utils/timers/timers.d.ts.map +1 -1
  383. package/build/utils/timers/timers.js +55 -18
  384. package/build/utils/timers/timers.js.map +1 -1
  385. package/package.json +59 -31
  386. package/src/assets/silence.wav +0 -0
  387. package/src/bluetooth-sdk/debug.ts +1 -0
  388. package/src/bluetooth-sdk/index.ts +2 -0
  389. package/src/bluetooth-sdk/photo-receiver.ts +2 -0
  390. package/src/bluetooth-sdk/react.ts +1 -0
  391. package/src/bluetooth-sdk/types.ts +1 -0
  392. package/src/engine.ts +9 -4
  393. package/src/facades/dev.ts +17 -12
  394. package/src/facades/display.ts +1 -1
  395. package/src/facades/gallery.ts +1 -1
  396. package/src/facades/glasses.ts +20 -7
  397. package/src/facades/glassesSettings.ts +5 -0
  398. package/src/facades/miniapps.ts +7 -0
  399. package/src/facades/ota.ts +23 -8
  400. package/src/facades/pairing.ts +15 -11
  401. package/src/facades/permissions.ts +14 -0
  402. package/src/facades/phoneNotifications.ts +4 -13
  403. package/src/facades/speech.ts +21 -7
  404. package/src/generated/releaseMetadata.ts +20 -0
  405. package/src/index.ts +39 -13
  406. package/src/react/MentraLiveOtaFlow.tsx +856 -0
  407. package/src/react/index.ts +7 -0
  408. package/src/react/useEngineSnapshot.ts +16 -0
  409. package/src/runtime/bootstrap.ts +33 -1
  410. package/src/runtime/scanQrSeam.ts +20 -0
  411. package/src/services/AppRegistry.ts +240 -149
  412. package/src/services/AudioCloudUplink.ts +23 -1
  413. package/src/services/AudioPlaybackService.ts +287 -38
  414. package/src/services/BlobStore.ts +22 -9
  415. package/src/services/CloudAudioSubscriptionSync.ts +13 -1
  416. package/src/services/CloudClientService.ts +96 -1
  417. package/src/services/DeviceEventRouter.ts +5 -5
  418. package/src/services/ForegroundLocationPermission.ts +24 -0
  419. package/src/services/GlassesSettingsSync.ts +9 -3
  420. package/src/services/GlassesStatusProjection.ts +16 -8
  421. package/src/services/HotspotOtaTransport.ts +184 -0
  422. package/src/services/HotspotShutdown.ts +41 -0
  423. package/src/services/LocalDisplayManager.ts +112 -21
  424. package/src/services/LocalMiniappRuntime.ts +967 -346
  425. package/src/services/LocalMiniappStorage.ts +82 -0
  426. package/src/services/LocalMiniappUserIdentity.ts +46 -0
  427. package/src/services/LocalSttFallbackCoordinator.ts +19 -12
  428. package/src/services/MicStateCoordinator.ts +169 -4
  429. package/src/services/MiniappLauncher.ts +30 -3
  430. package/src/services/MiniappLiveness.ts +24 -0
  431. package/src/services/NativeHttpResponse.ts +6 -0
  432. package/src/services/OtaArtifactDownloader.ts +312 -0
  433. package/src/services/OtaAutoChain.ts +106 -0
  434. package/src/services/OtaErrorMapping.ts +80 -0
  435. package/src/services/OtaInstallCoordinator.ts +649 -144
  436. package/src/services/OtaService.ts +11 -5
  437. package/src/services/OtaUpdateCheckService.ts +181 -21
  438. package/src/services/PhoneCalendarHelpers.ts +212 -0
  439. package/src/services/PhoneCalendarService.ts +65 -0
  440. package/src/services/PhoneCameraFovCoordinator.ts +210 -0
  441. package/src/services/PhoneNotificationsSync.ts +12 -10
  442. package/src/services/PhonePhotoCoordinator.ts +116 -18
  443. package/src/services/PhoneStreamCoordinator.ts +139 -25
  444. package/src/services/PhoneVideoCoordinator.ts +11 -0
  445. package/src/services/SceneRenderer.ts +16 -0
  446. package/src/services/SentenceTtsPipeline.ts +106 -0
  447. package/src/services/SupportProfileSync.ts +218 -0
  448. package/src/services/TranscriptionRouting.ts +37 -0
  449. package/src/services/TtsTextSanitizer.ts +66 -0
  450. package/src/services/WifiAdbRequest.ts +53 -0
  451. package/src/services/asg/asgCameraApi.ts +615 -33
  452. package/src/services/asg/cameraRollExportCoordinator.ts +627 -0
  453. package/src/services/asg/cameraRollExportLedger.ts +122 -0
  454. package/src/services/asg/galleryNotices.ts +1 -0
  455. package/src/services/asg/galleryPathMigration.ts +22 -0
  456. package/src/services/asg/gallerySettingsService.ts +3 -0
  457. package/src/services/asg/gallerySyncService.ts +184 -73
  458. package/src/services/asg/galleryTransferLedger.ts +312 -0
  459. package/src/services/asg/localNetworkTransport.ts +169 -0
  460. package/src/services/asg/localStorageService.ts +179 -24
  461. package/src/services/asg/mediaProcessingQueue.ts +209 -62
  462. package/src/services/audioPlaybackAssets.ts +8 -0
  463. package/src/services/gallerySyncClock.ts +1 -1
  464. package/src/services/glassesClockSync.ts +6 -2
  465. package/src/services/manifestActions.ts +30 -0
  466. package/src/services/otaDisplayState.ts +58 -17
  467. package/src/services/otaInstallPolicy.ts +30 -4
  468. package/src/services/otaLegacyMapping.ts +1 -1
  469. package/src/services/otaManifestPolicy.ts +42 -0
  470. package/src/services/otaManifestUrl.ts +44 -0
  471. package/src/services/slimStreamStatus.ts +16 -5
  472. package/src/stores/apps.ts +12 -0
  473. package/src/stores/bluetoothSettingKeys.ts +2 -0
  474. package/src/stores/gallerySync.ts +4 -0
  475. package/src/stores/glasses.ts +3 -0
  476. package/src/stores/settings.ts +179 -18
  477. package/src/types/applet.ts +2 -0
  478. package/src/types/asg.ts +7 -0
  479. package/src/types/enums.ts +3 -28
  480. package/src/types/hardware.ts +20 -13
  481. package/src/types/index.ts +2 -6
  482. package/src/utils/configuredDevHost.ts +17 -0
  483. package/src/utils/devMiniappLaunch.ts +151 -23
  484. package/src/utils/diagnosticContext.ts +17 -17
  485. package/src/utils/hardware/hardware.ts +7 -9
  486. package/src/utils/miniappDiagnostics.ts +226 -0
  487. package/src/utils/permissions/MediaLibraryPermissions.ts +35 -4
  488. package/src/utils/timers/timers.ts +57 -21
  489. package/build/devtools.d.ts +0 -11
  490. package/build/devtools.d.ts.map +0 -1
  491. package/build/devtools.js +0 -13
  492. package/build/devtools.js.map +0 -1
  493. package/build/internal.d.ts +0 -66
  494. package/build/internal.d.ts.map +0 -1
  495. package/build/internal.js +0 -89
  496. package/build/internal.js.map +0 -1
  497. package/build/services/asgOtaVersionUrl.d.ts +0 -2
  498. package/build/services/asgOtaVersionUrl.d.ts.map +0 -1
  499. package/build/services/asgOtaVersionUrl.js +0 -36
  500. package/build/services/asgOtaVersionUrl.js.map +0 -1
  501. package/src/devtools.ts +0 -13
  502. package/src/internal.ts +0 -158
  503. package/src/services/asgOtaVersionUrl.ts +0 -41
@@ -21,11 +21,13 @@ import { unzip } from "react-native-zip-archive";
21
21
  import semver from "semver";
22
22
  import { result as Res } from "typesafe-ts";
23
23
  import { HardwareRequirementLevel, HardwareType } from "../types";
24
- import { getConfigValues } from "../runtime/bootstrap";
24
+ import { configuredDevHost } from "../utils/configuredDevHost";
25
25
  import { storage } from "../utils/storage/storage";
26
26
  import { printDirectory } from "../utils/storage/zip";
27
27
  import { checkManifestVersions } from "./manifestVersionGate";
28
+ import { normalizeManifestActions } from "./manifestActions";
28
29
  import { miniappRunningRegistry } from "./MiniappRunningRegistry";
30
+ export { normalizeManifestActions } from "./manifestActions";
29
31
  const ALLOWED_PERMISSION_TYPES = new Set([
30
32
  "MICROPHONE",
31
33
  "CAMERA",
@@ -66,29 +68,6 @@ export function normalizeManifestPermissions(raw) {
66
68
  function normalizeManifestType(raw) {
67
69
  return raw === "background" || raw === "system_dashboard" || raw === "standard" ? raw : "standard";
68
70
  }
69
- /**
70
- * Normalize a manifest's `actions` into DeclaredAction[]. Defensive — keeps only
71
- * well-formed `{id, description}` entries (installed/dev bundles may be
72
- * malformed). Shared by installed (disk) and dev-sideload projection so both
73
- * surface declared actions to session.miniapps.list + the invoke gate.
74
- */
75
- export function normalizeManifestActions(raw) {
76
- if (!Array.isArray(raw))
77
- return [];
78
- const out = [];
79
- for (const a of raw) {
80
- if (a && typeof a.id === "string" && typeof a.description === "string") {
81
- out.push({
82
- id: a.id,
83
- description: a.description,
84
- ...(a.parameters && typeof a.parameters === "object"
85
- ? { parameters: a.parameters }
86
- : {}),
87
- });
88
- }
89
- }
90
- return out;
91
- }
92
71
  /**
93
72
  * Convert declared hardwareRequirements from a miniapp.json manifest into
94
73
  * runtime `HardwareRequirement[]`, always appending `{EXIST, REQUIRED}` so
@@ -132,6 +111,9 @@ export function buildHardwareRequirements(raw, packageName) {
132
111
  out.push({ type: HardwareType.EXIST, level: HardwareRequirementLevel.REQUIRED });
133
112
  return out;
134
113
  }
114
+ function releaseIdentityKey(packageName, version) {
115
+ return `miniapp_release_identity:${packageName}:${version}`;
116
+ }
135
117
  /**
136
118
  * Download a miniapp zip from `url` into the cache and return its local path.
137
119
  *
@@ -408,7 +390,7 @@ class AppRegistry {
408
390
  return Res.try_async(async () => {
409
391
  const { packageName, version } = await downloadAndInstallMiniApp(url, opts?.versionOverride);
410
392
  console.log("APP_REGISTRY: Downloaded and installed mini app");
411
- this.finalizeInstall(packageName, version);
393
+ this.finalizeInstall(packageName, version, opts?.releaseIdentity ?? { source: version.startsWith("dev-") ? "dev_snapshot" : "direct_download" });
412
394
  });
413
395
  }
414
396
  /**
@@ -422,7 +404,7 @@ class AppRegistry {
422
404
  return Res.try_async(async () => {
423
405
  const { packageName, version } = await unpackMiniApp(zipPath, opts?.versionOverride);
424
406
  console.log("APP_REGISTRY: Installed mini app from local zip");
425
- this.finalizeInstall(packageName, version);
407
+ this.finalizeInstall(packageName, version, opts?.releaseIdentity ?? { source: "bundled_asset" });
426
408
  return { packageName, version };
427
409
  });
428
410
  }
@@ -431,7 +413,7 @@ class AppRegistry {
431
413
  * artifacts on release installs, point the active-version at the just-
432
414
  * installed bundle, and notify subscribers to refresh.
433
415
  */
434
- finalizeInstall(packageName, version) {
416
+ finalizeInstall(packageName, version, releaseIdentity) {
435
417
  // If this is a release install (semver, not dev-*) of a package that
436
418
  // currently has dev-* snapshots, clear the dev state so the swap to
437
419
  // "released" is clean. Otherwise the dev version would keep winning
@@ -442,9 +424,14 @@ class AppRegistry {
442
424
  this.clearDevArtifacts(packageName);
443
425
  }
444
426
  this.setActiveVersion(packageName, version);
427
+ storage.save(releaseIdentityKey(packageName, version), releaseIdentity);
445
428
  this.refreshNeeded = true;
446
429
  this.notify();
447
430
  }
431
+ getReleaseIdentity(packageName, version) {
432
+ const result = storage.load(releaseIdentityKey(packageName, version));
433
+ return result.is_ok() ? result.value : null;
434
+ }
448
435
  installFromJsonUrl(baseUrl) {
449
436
  return Res.try_async(async () => {
450
437
  const trimmed = baseUrl.replace(/\/$/, "");
@@ -479,6 +466,7 @@ class AppRegistry {
479
466
  for (const item of pkgDir.list()) {
480
467
  if (item instanceof Directory && item.name.startsWith("dev-")) {
481
468
  try {
469
+ storage.remove(releaseIdentityKey(packageName, item.name));
482
470
  item.delete();
483
471
  }
484
472
  catch (e) {
@@ -493,17 +481,13 @@ class AppRegistry {
493
481
  }
494
482
  storage.remove(`${packageName}_dev_url`);
495
483
  storage.remove(`${packageName}_dev_port`);
484
+ storage.remove(`${packageName}_dev_mdns`);
496
485
  storage.remove(`${packageName}_dev_last_reachable`);
497
- // Drop the single dev slot's home-tile metadata + dev URL/port keys (all stored under
498
- // DEV_APP_PACKAGE_NAME, not `packageName`). Dev miniapps load over HTTP and aren't on disk,
499
- // so without this the projected tile would reappear on the next getInstalledMiniapps() refresh.
500
- //
501
- // Only do this when we're actually touching the dev slot: either the dev package itself, or the
502
- // real manifest package currently occupying the slot. Otherwise a release install/uninstall of
503
- // an UNRELATED package would wipe the active dev tile.
504
- if (packageName === DEV_APP_PACKAGE_NAME || packageName === getDevAppSourcePackage()) {
505
- unregisterDevApp();
506
- }
486
+ // HTTP-direct dev miniapps are indexed by their real package name. A
487
+ // release install/uninstall of that same package should remove only its
488
+ // dev tile; unrelated dev miniapps must remain available.
489
+ if (readDevAppRecord(packageName))
490
+ unregisterDevApp(packageName);
507
491
  }
508
492
  /**
509
493
  * Garbage-collect older `dev-*` version directories for this package,
@@ -544,6 +528,7 @@ class AppRegistry {
544
528
  // so an unconditional delete() would throw and abort the cleanup below.
545
529
  if (lmaDir.exists)
546
530
  lmaDir.delete();
531
+ storage.remove(releaseIdentityKey(packageName, version));
547
532
  console.log("APP_REGISTRY: Uninstalled mini app version", version);
548
533
  const packageDir = new Directory(Paths.document, "lmas", packageName);
549
534
  if (packageDir.exists && packageDir.list().length === 0) {
@@ -551,6 +536,9 @@ class AppRegistry {
551
536
  }
552
537
  }
553
538
  else {
539
+ for (const installedVersion of this.getInstalledVersions(packageName)) {
540
+ storage.remove(releaseIdentityKey(packageName, installedVersion));
541
+ }
554
542
  const packageDir = new Directory(Paths.document, "lmas", packageName);
555
543
  if (packageDir.exists) {
556
544
  packageDir.delete();
@@ -646,26 +634,19 @@ class AppRegistry {
646
634
  }
647
635
  return out;
648
636
  }
649
- /**
650
- * Read the lmas/ tree and return one ClientApp per installed package,
651
- * picking each package's active version. The store/host overlays runtime
652
- * state (loading, hidden, compatibility) on top of these.
653
- *
654
- * `running` reflects MiniappHost mount state via miniappRunningRegistry.
655
- */
656
637
  /**
657
638
  * Merge disk-derived apps with the projected dev + offline layers,
658
- * de-duping by packageName. A real on-disk install (or offline app) wins
659
- * over a dev tile of the same package a dev record is just a launcher
660
- * stub that an actual install supersedes.
639
+ * de-duping by packageName. An active dev registration wins over an older
640
+ * disk install of the same package; installing a release clears that dev
641
+ * registration in finalizeInstall. Native offline apps keep top priority.
661
642
  */
662
643
  mergeProjectedApps(diskApps) {
663
- const seen = new Set(diskApps.map((a) => a.packageName));
664
644
  const offline = this.projectOfflineApps();
665
- for (const a of offline)
666
- seen.add(a.packageName);
667
- const dev = this.projectDevApps().filter((a) => !seen.has(a.packageName));
668
- return [...diskApps, ...dev, ...offline];
645
+ const offlinePackages = new Set(offline.map((app) => app.packageName));
646
+ const dev = this.projectDevApps().filter((app) => !offlinePackages.has(app.packageName));
647
+ const devPackages = new Set(dev.map((app) => app.packageName));
648
+ const installed = diskApps.filter((app) => !offlinePackages.has(app.packageName) && !devPackages.has(app.packageName));
649
+ return [...installed, ...dev, ...offline];
669
650
  }
670
651
  async getInstalledMiniapps() {
671
652
  if (!this.refreshNeeded && this.cachedApps.length > 0) {
@@ -799,6 +780,21 @@ class AppRegistry {
799
780
  this.refreshNeeded = true;
800
781
  this.notify();
801
782
  }
783
+ /**
784
+ * Update whether a registered offline app is projected into launcher UIs.
785
+ *
786
+ * Offline apps are registered once at host startup, so settings-backed
787
+ * visibility changes need to update the projection without reinstalling or
788
+ * duplicating the app. No-op when the app is missing or already matches.
789
+ */
790
+ setOfflineAppHidden(packageName, hidden) {
791
+ const app = this.offlineApps.find((candidate) => candidate.packageName === packageName);
792
+ if (!app || app.hidden === hidden)
793
+ return;
794
+ app.hidden = hidden;
795
+ this.refreshNeeded = true;
796
+ this.notify();
797
+ }
802
798
  /**
803
799
  * Registered as needing the on-device STT model before it can start (the
804
800
  * host declares this per offline app; the apps store gates start() on it).
@@ -849,24 +845,7 @@ export function getLocalAppScreenshot(packageName) {
849
845
  return uri;
850
846
  }
851
847
  const DEV_APPS_INDEX_KEY = "dev_apps_index";
852
- function configuredDevHost() {
853
- // Explicit escape hatch first; otherwise the host-injected Metro host (the
854
- // address this dev bundle was served from — always current for the network
855
- // the phone is on). Deliberately NOT the EXPO_PUBLIC_CLOUD_* URLs: those are
856
- // cloud endpoints, a different machine entirely from the laptop running the
857
- // miniapp dev server, and rewriting a dev URL to a cloud host would break it.
858
- const explicit = process.env.EXPO_PUBLIC_LOCAL_MINIAPP_HOST;
859
- if (explicit) {
860
- try {
861
- return new URL(explicit).hostname;
862
- }
863
- catch {
864
- if (/^[\w.-]+$/.test(explicit))
865
- return explicit;
866
- }
867
- }
868
- return getConfigValues().devServerHost?.();
869
- }
848
+ const DEV_APP_ICONS_DIR = "dev-miniapp-icons";
870
849
  function isPrivateLanHost(hostname) {
871
850
  return (hostname === "localhost" ||
872
851
  hostname.startsWith("192.168.") ||
@@ -895,71 +874,173 @@ function normalizeDevAppRecord(record) {
895
874
  const iconUrl = rewriteStaleDevUrl(record.iconUrl);
896
875
  return devUrl === record.devUrl && iconUrl === record.iconUrl ? record : { ...record, devUrl, iconUrl };
897
876
  }
898
- /**
899
- * The one and only package name a dev miniapp is registered under.
900
- *
901
- * There is a SINGLE dev slot: scanning a new QR (or entering a new dev URL)
902
- * replaces the previous dev app rather than adding a second tile. Because the
903
- * whole launch chain — JSContext registration, UI-router binding,
904
- * setForeground, dev_url/dev_port storage keys, respawn-bg lookup — keys on
905
- * this package name, every consumer MUST use `DEV_APP_PACKAGE_NAME` (not the
906
- * manifest's real packageName) so messages route consistently. Mixing the two
907
- * was the cause of the "CONNECT_ACK timeout" — the tile said `com.dev` while
908
- * the dev URL/port and foreground target used the manifest name.
909
- */
877
+ /** Legacy package used by builds that supported only one dev miniapp. */
910
878
  export const DEV_APP_PACKAGE_NAME = "com.dev";
911
879
  export const DEV_APP_NAME = "Dev";
912
880
  /**
913
- * Register (or replace) THE dev miniapp. Persists the home-tile metadata AND
914
- * the dev_url/dev_port keyed on {@link DEV_APP_PACKAGE_NAME}, so this function
915
- * is the single source of truth for the dev slot — callers must not write the
916
- * `*_dev_url` / `*_dev_port` keys under the manifest's real package name.
917
- *
918
- * Callers pass the manifest's REAL packageName/name. Only the packageName is
919
- * forced to {@link DEV_APP_PACKAGE_NAME} so the home tile and launch chain key
920
- * on the single dev slot (the real package survives in `sourcePackageName` for
921
- * clearDevArtifacts). The name + icon are kept as-is so the home tile reflects
922
- * the actual dev miniapp — marked as dev by the {@link DevMiniappBadge} dot
923
- * rather than renamed to a generic "Dev" tile.
881
+ * Copy a dev-server icon into Documents so the tile remains branded after the
882
+ * laptop/server disappears. A failed download is non-fatal: the remote URL is
883
+ * retained and can still render while the server is reachable.
884
+ */
885
+ async function cacheDevAppIcon(packageName, iconUrl) {
886
+ if (!/^https?:\/\//.test(iconUrl))
887
+ return iconUrl;
888
+ try {
889
+ const dir = new Directory(Paths.document, DEV_APP_ICONS_DIR);
890
+ if (!dir.exists)
891
+ dir.create({ intermediates: true });
892
+ const safePackageName = packageName.replace(/[^a-zA-Z0-9._-]/g, "_");
893
+ let extension = ".png";
894
+ try {
895
+ const match = new URL(iconUrl).pathname.match(/\.(png|jpe?g|webp|gif|svg)$/i);
896
+ if (match)
897
+ extension = `.${match[1].toLowerCase()}`;
898
+ }
899
+ catch {
900
+ // Keep the decoder-friendly .png fallback; image loaders sniff content.
901
+ }
902
+ const target = new File(dir, `${safePackageName}${extension}`);
903
+ const downloaded = await File.downloadFileAsync(iconUrl, target, { idempotent: true });
904
+ // Only remove older extensions AFTER the replacement is safely on disk;
905
+ // a broken icon URL must not destroy the last known-good cached logo.
906
+ for (const item of dir.list()) {
907
+ if (item instanceof File && item.uri !== downloaded.uri && item.name.startsWith(`${safePackageName}.`)) {
908
+ try {
909
+ item.delete();
910
+ }
911
+ catch {
912
+ // Best effort; the current icon has already been persisted.
913
+ }
914
+ }
915
+ }
916
+ return downloaded.uri;
917
+ }
918
+ catch (error) {
919
+ console.warn(`APP_REGISTRY: failed to cache dev icon for ${packageName}:`, error);
920
+ return readDevAppRecord(packageName)?.iconUrl ?? iconUrl;
921
+ }
922
+ }
923
+ function removeDevRecordKeys(packageName) {
924
+ const existing = readDevAppRecord(packageName);
925
+ if (existing?.iconUrl.startsWith("file://")) {
926
+ try {
927
+ const icon = new File(existing.iconUrl);
928
+ if (icon.exists)
929
+ icon.delete();
930
+ }
931
+ catch (error) {
932
+ console.warn(`APP_REGISTRY: failed to delete dev icon for ${packageName}:`, error);
933
+ }
934
+ }
935
+ storage.remove(`${packageName}_dev_meta`);
936
+ storage.remove(`${packageName}_dev_url`);
937
+ storage.remove(`${packageName}_dev_port`);
938
+ storage.remove(`${packageName}_dev_mdns`);
939
+ storage.remove(`${packageName}_dev_last_reachable`);
940
+ }
941
+ function readDevAppRecord(packageName) {
942
+ const res = storage.load(`${packageName}_dev_meta`);
943
+ if (!res.is_ok())
944
+ return null;
945
+ try {
946
+ return JSON.parse(res.value);
947
+ }
948
+ catch {
949
+ return null;
950
+ }
951
+ }
952
+ /** Move the historical `com.dev` record onto its real manifest package key. */
953
+ function migrateLegacyDevSlot() {
954
+ const legacy = readDevAppRecord(DEV_APP_PACKAGE_NAME);
955
+ const targetPackage = legacy?.sourcePackageName?.trim();
956
+ if (!legacy || !targetPackage || targetPackage === DEV_APP_PACKAGE_NAME)
957
+ return;
958
+ const existingTarget = readDevAppRecord(targetPackage);
959
+ const migrated = existingTarget ?? {
960
+ ...legacy,
961
+ packageName: targetPackage,
962
+ sourcePackageName: targetPackage,
963
+ };
964
+ if (!existingTarget)
965
+ storage.save(`${targetPackage}_dev_meta`, JSON.stringify(migrated));
966
+ const legacyUrl = storage.load(`${DEV_APP_PACKAGE_NAME}_dev_url`);
967
+ const targetUrl = storage.load(`${targetPackage}_dev_url`);
968
+ if (!targetUrl.is_ok()) {
969
+ storage.save(`${targetPackage}_dev_url`, legacyUrl.is_ok() ? legacyUrl.value : migrated.devUrl);
970
+ }
971
+ const legacyPort = storage.load(`${DEV_APP_PACKAGE_NAME}_dev_port`);
972
+ const targetPort = storage.load(`${targetPackage}_dev_port`);
973
+ if (!targetPort.is_ok()) {
974
+ const port = migrated.devPort ?? (legacyPort.is_ok() ? legacyPort.value : undefined);
975
+ if (typeof port === "number" && Number.isFinite(port))
976
+ storage.save(`${targetPackage}_dev_port`, port);
977
+ }
978
+ const legacyMdns = storage.load(`${DEV_APP_PACKAGE_NAME}_dev_mdns`);
979
+ const targetMdns = storage.load(`${targetPackage}_dev_mdns`);
980
+ if (!targetMdns.is_ok() && legacyMdns.is_ok() && legacyMdns.value.trim()) {
981
+ storage.save(`${targetPackage}_dev_mdns`, legacyMdns.value.trim());
982
+ }
983
+ storage.remove(`${DEV_APP_PACKAGE_NAME}_dev_meta`);
984
+ storage.remove(`${DEV_APP_PACKAGE_NAME}_dev_url`);
985
+ storage.remove(`${DEV_APP_PACKAGE_NAME}_dev_port`);
986
+ storage.remove(`${DEV_APP_PACKAGE_NAME}_dev_mdns`);
987
+ storage.remove(`${DEV_APP_PACKAGE_NAME}_dev_last_reachable`);
988
+ const index = Array.from(new Set(getDevAppIndex().map((pkg) => (pkg === DEV_APP_PACKAGE_NAME ? targetPackage : pkg))));
989
+ storage.save(DEV_APPS_INDEX_KEY, JSON.stringify(index));
990
+ }
991
+ function readStoredMdnsHost(packageName) {
992
+ const res = storage.load(`${packageName}_dev_mdns`);
993
+ if (!res.is_ok())
994
+ return undefined;
995
+ return res.value.trim() || undefined;
996
+ }
997
+ /**
998
+ * Register or update one dev miniapp under its real manifest package. Different
999
+ * package names coexist; rescanning the same package updates that package only.
924
1000
  */
925
- export function registerDevApp(record) {
1001
+ export async function registerDevApp(record) {
1002
+ migrateLegacyDevSlot();
1003
+ const packageName = record.packageName.trim();
1004
+ if (!packageName)
1005
+ throw new Error("Dev miniapp manifest is missing packageName");
1006
+ const iconUrl = await cacheDevAppIcon(packageName, record.iconUrl);
1007
+ // Relaunch paths (developer-URL screen, loadDevMiniapp) omit mdnsHost, so an
1008
+ // omitted field keeps whatever the QR scan stored instead of wiping the
1009
+ // `.local` failover host.
1010
+ const mdnsHost = record.mdnsHost !== undefined ? record.mdnsHost.trim() || undefined : readStoredMdnsHost(packageName);
926
1011
  const devRecord = {
927
1012
  ...record,
928
- // Preserve the real manifest package before overwriting packageName with the
929
- // single dev-slot name, so clearDevArtifacts can tell whether an install/uninstall
930
- // actually targets the dev slot.
931
- sourcePackageName: record.sourcePackageName ?? record.packageName,
932
- packageName: DEV_APP_PACKAGE_NAME,
933
- // Keep the manifest's real name + icon (display-only; routing keys on
934
- // packageName). Fall back to DEV_APP_NAME only if a caller omitted the name.
1013
+ packageName,
1014
+ sourcePackageName: packageName,
935
1015
  name: record.name || DEV_APP_NAME,
936
- iconUrl: record.iconUrl,
1016
+ iconUrl,
1017
+ mdnsHost,
937
1018
  };
938
- storage.save(`${DEV_APP_PACKAGE_NAME}_dev_meta`, JSON.stringify(devRecord));
939
- // The launch chain (LocalMiniappView.resolveDevPort, mentraJsBootstrap
940
- // respawn-bg) reads these keys under DEV_APP_PACKAGE_NAME — persist them
941
- // here so callers can't key them on the wrong (real) package name.
942
- storage.save(`${DEV_APP_PACKAGE_NAME}_dev_url`, record.devUrl);
1019
+ storage.save(`${packageName}_dev_meta`, JSON.stringify(devRecord));
1020
+ storage.save(`${packageName}_dev_url`, record.devUrl);
943
1021
  if (typeof record.devPort === "number" && Number.isFinite(record.devPort)) {
944
- storage.save(`${DEV_APP_PACKAGE_NAME}_dev_port`, record.devPort);
1022
+ storage.save(`${packageName}_dev_port`, record.devPort);
945
1023
  }
946
1024
  else {
947
- storage.remove(`${DEV_APP_PACKAGE_NAME}_dev_port`);
1025
+ storage.remove(`${packageName}_dev_port`);
1026
+ }
1027
+ if (mdnsHost) {
1028
+ storage.save(`${packageName}_dev_mdns`, mdnsHost);
1029
+ }
1030
+ else {
1031
+ storage.remove(`${packageName}_dev_mdns`);
948
1032
  }
949
1033
  const idx = getDevAppIndex();
950
- if (!idx.includes(DEV_APP_PACKAGE_NAME)) {
951
- idx.push(DEV_APP_PACKAGE_NAME);
1034
+ if (!idx.includes(packageName)) {
1035
+ idx.push(packageName);
952
1036
  storage.save(DEV_APPS_INDEX_KEY, JSON.stringify(idx));
953
1037
  }
954
1038
  appRegistry.markRefreshNeeded();
955
1039
  }
956
- /** Drop the dev miniapp's home-tile metadata + dev URL/port keys. */
957
- export function unregisterDevApp() {
958
- storage.remove(`${DEV_APP_PACKAGE_NAME}_dev_meta`);
959
- storage.remove(`${DEV_APP_PACKAGE_NAME}_dev_url`);
960
- storage.remove(`${DEV_APP_PACKAGE_NAME}_dev_port`);
961
- storage.remove(`${DEV_APP_PACKAGE_NAME}_dev_last_reachable`);
962
- const idx = getDevAppIndex().filter((p) => p !== DEV_APP_PACKAGE_NAME);
1040
+ /** Drop one dev miniapp's metadata, routing keys, and cached icon. */
1041
+ export function unregisterDevApp(packageName = DEV_APP_PACKAGE_NAME) {
1042
+ removeDevRecordKeys(packageName);
1043
+ const idx = getDevAppIndex().filter((p) => p !== packageName);
963
1044
  storage.save(DEV_APPS_INDEX_KEY, JSON.stringify(idx));
964
1045
  appRegistry.markRefreshNeeded();
965
1046
  }
@@ -975,35 +1056,18 @@ function getDevAppIndex() {
975
1056
  return [];
976
1057
  }
977
1058
  }
978
- /**
979
- * The real manifest package name currently occupying the dev slot, or null if no dev app is
980
- * registered. Used to decide whether clearing a package's artifacts should also drop the dev slot.
981
- */
982
- export function getDevAppSourcePackage() {
983
- const res = storage.load(`${DEV_APP_PACKAGE_NAME}_dev_meta`);
984
- if (!res.is_ok())
985
- return null;
986
- try {
987
- const rec = JSON.parse(res.value);
988
- return rec.sourcePackageName ?? null;
989
- }
990
- catch {
991
- return null;
992
- }
1059
+ /** Resolve the manifest package for a dev runtime (including the legacy slot). */
1060
+ export function getDevAppSourcePackage(packageName = DEV_APP_PACKAGE_NAME) {
1061
+ migrateLegacyDevSlot();
1062
+ const rec = readDevAppRecord(packageName);
1063
+ return rec?.sourcePackageName ?? rec?.packageName ?? null;
993
1064
  }
994
- export function getDevAppAttestation() {
995
- const res = storage.load(`${DEV_APP_PACKAGE_NAME}_dev_meta`);
996
- if (!res.is_ok())
997
- return null;
998
- try {
999
- const rec = JSON.parse(res.value);
1000
- return rec.devAttestation ?? null;
1001
- }
1002
- catch {
1003
- return null;
1004
- }
1065
+ export function getDevAppAttestation(packageName = DEV_APP_PACKAGE_NAME) {
1066
+ migrateLegacyDevSlot();
1067
+ return readDevAppRecord(packageName)?.devAttestation ?? null;
1005
1068
  }
1006
1069
  export function getDevAppRecords() {
1070
+ migrateLegacyDevSlot();
1007
1071
  const out = [];
1008
1072
  for (const pkg of getDevAppIndex()) {
1009
1073
  const res = storage.load(`${pkg}_dev_meta`);