@mentra/engine 0.1.0-dev.0 → 0.1.0-dev.1

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 (441) hide show
  1. package/README.md +42 -1
  2. package/build/engine.d.ts +11 -3
  3. package/build/engine.d.ts.map +1 -1
  4. package/build/engine.js +7 -2
  5. package/build/engine.js.map +1 -1
  6. package/build/facades/dev.d.ts +3 -2
  7. package/build/facades/dev.d.ts.map +1 -1
  8. package/build/facades/dev.js +18 -12
  9. package/build/facades/dev.js.map +1 -1
  10. package/build/facades/gallery.js +1 -1
  11. package/build/facades/gallery.js.map +1 -1
  12. package/build/facades/glasses.d.ts +1 -0
  13. package/build/facades/glasses.d.ts.map +1 -1
  14. package/build/facades/glasses.js +19 -4
  15. package/build/facades/glasses.js.map +1 -1
  16. package/build/facades/glassesSettings.d.ts.map +1 -1
  17. package/build/facades/glassesSettings.js +1 -0
  18. package/build/facades/glassesSettings.js.map +1 -1
  19. package/build/facades/miniapps.d.ts +4 -0
  20. package/build/facades/miniapps.d.ts.map +1 -1
  21. package/build/facades/miniapps.js +5 -0
  22. package/build/facades/miniapps.js.map +1 -1
  23. package/build/facades/ota.d.ts +11 -2
  24. package/build/facades/ota.d.ts.map +1 -1
  25. package/build/facades/ota.js +19 -4
  26. package/build/facades/ota.js.map +1 -1
  27. package/build/facades/pairing.d.ts +4 -0
  28. package/build/facades/pairing.d.ts.map +1 -1
  29. package/build/facades/pairing.js +10 -8
  30. package/build/facades/pairing.js.map +1 -1
  31. package/build/facades/permissions.d.ts +10 -0
  32. package/build/facades/permissions.d.ts.map +1 -1
  33. package/build/facades/permissions.js +10 -0
  34. package/build/facades/permissions.js.map +1 -1
  35. package/build/facades/phoneNotifications.d.ts +0 -4
  36. package/build/facades/phoneNotifications.d.ts.map +1 -1
  37. package/build/facades/phoneNotifications.js +4 -14
  38. package/build/facades/phoneNotifications.js.map +1 -1
  39. package/build/index.d.ts +6 -3
  40. package/build/index.d.ts.map +1 -1
  41. package/build/index.js +4 -2
  42. package/build/index.js.map +1 -1
  43. package/build/internal.d.ts +3 -2
  44. package/build/internal.d.ts.map +1 -1
  45. package/build/internal.js +2 -1
  46. package/build/internal.js.map +1 -1
  47. package/build/react/MentraLiveOtaFlow.d.ts +38 -0
  48. package/build/react/MentraLiveOtaFlow.d.ts.map +1 -0
  49. package/build/react/MentraLiveOtaFlow.js +528 -0
  50. package/build/react/MentraLiveOtaFlow.js.map +1 -0
  51. package/build/react/index.d.ts +2 -0
  52. package/build/react/index.d.ts.map +1 -0
  53. package/build/react/index.js +2 -0
  54. package/build/react/index.js.map +1 -0
  55. package/build/react/useEngineSnapshot.d.ts +2 -0
  56. package/build/react/useEngineSnapshot.d.ts.map +1 -0
  57. package/build/react/useEngineSnapshot.js +14 -0
  58. package/build/react/useEngineSnapshot.js.map +1 -0
  59. package/build/runtime/bootstrap.d.ts +24 -1
  60. package/build/runtime/bootstrap.d.ts.map +1 -1
  61. package/build/runtime/bootstrap.js +17 -0
  62. package/build/runtime/bootstrap.js.map +1 -1
  63. package/build/runtime/scanQrSeam.d.ts +7 -0
  64. package/build/runtime/scanQrSeam.d.ts.map +1 -0
  65. package/build/runtime/scanQrSeam.js +16 -0
  66. package/build/runtime/scanQrSeam.js.map +1 -0
  67. package/build/services/AppRegistry.d.ts +33 -57
  68. package/build/services/AppRegistry.d.ts.map +1 -1
  69. package/build/services/AppRegistry.js +193 -144
  70. package/build/services/AppRegistry.js.map +1 -1
  71. package/build/services/AudioCloudUplink.d.ts +12 -0
  72. package/build/services/AudioCloudUplink.d.ts.map +1 -1
  73. package/build/services/AudioCloudUplink.js +22 -1
  74. package/build/services/AudioCloudUplink.js.map +1 -1
  75. package/build/services/AudioPlaybackService.d.ts +41 -2
  76. package/build/services/AudioPlaybackService.d.ts.map +1 -1
  77. package/build/services/AudioPlaybackService.js +250 -33
  78. package/build/services/AudioPlaybackService.js.map +1 -1
  79. package/build/services/BlobStore.d.ts +2 -1
  80. package/build/services/BlobStore.d.ts.map +1 -1
  81. package/build/services/BlobStore.js +17 -9
  82. package/build/services/BlobStore.js.map +1 -1
  83. package/build/services/CloudAudioSubscriptionSync.d.ts.map +1 -1
  84. package/build/services/CloudAudioSubscriptionSync.js +13 -1
  85. package/build/services/CloudAudioSubscriptionSync.js.map +1 -1
  86. package/build/services/CloudClientService.d.ts +15 -0
  87. package/build/services/CloudClientService.d.ts.map +1 -1
  88. package/build/services/CloudClientService.js +93 -1
  89. package/build/services/CloudClientService.js.map +1 -1
  90. package/build/services/DeviceEventRouter.js +5 -5
  91. package/build/services/DeviceEventRouter.js.map +1 -1
  92. package/build/services/ForegroundLocationPermission.d.ts +13 -0
  93. package/build/services/ForegroundLocationPermission.d.ts.map +1 -0
  94. package/build/services/ForegroundLocationPermission.js +12 -0
  95. package/build/services/ForegroundLocationPermission.js.map +1 -0
  96. package/build/services/GlassesSettingsSync.d.ts.map +1 -1
  97. package/build/services/GlassesSettingsSync.js +9 -3
  98. package/build/services/GlassesSettingsSync.js.map +1 -1
  99. package/build/services/GlassesStatusProjection.d.ts +2 -1
  100. package/build/services/GlassesStatusProjection.d.ts.map +1 -1
  101. package/build/services/GlassesStatusProjection.js +15 -8
  102. package/build/services/GlassesStatusProjection.js.map +1 -1
  103. package/build/services/HotspotOtaTransport.d.ts +29 -0
  104. package/build/services/HotspotOtaTransport.d.ts.map +1 -0
  105. package/build/services/HotspotOtaTransport.js +146 -0
  106. package/build/services/HotspotOtaTransport.js.map +1 -0
  107. package/build/services/HotspotShutdown.d.ts +17 -0
  108. package/build/services/HotspotShutdown.d.ts.map +1 -0
  109. package/build/services/HotspotShutdown.js +29 -0
  110. package/build/services/HotspotShutdown.js.map +1 -0
  111. package/build/services/LocalDisplayManager.d.ts +15 -0
  112. package/build/services/LocalDisplayManager.d.ts.map +1 -1
  113. package/build/services/LocalDisplayManager.js +106 -20
  114. package/build/services/LocalDisplayManager.js.map +1 -1
  115. package/build/services/LocalMiniappRuntime.d.ts +74 -2
  116. package/build/services/LocalMiniappRuntime.d.ts.map +1 -1
  117. package/build/services/LocalMiniappRuntime.js +785 -291
  118. package/build/services/LocalMiniappRuntime.js.map +1 -1
  119. package/build/services/LocalMiniappStorage.d.ts +32 -0
  120. package/build/services/LocalMiniappStorage.d.ts.map +1 -0
  121. package/build/services/LocalMiniappStorage.js +66 -0
  122. package/build/services/LocalMiniappStorage.js.map +1 -0
  123. package/build/services/LocalMiniappUserIdentity.d.ts +20 -0
  124. package/build/services/LocalMiniappUserIdentity.d.ts.map +1 -0
  125. package/build/services/LocalMiniappUserIdentity.js +43 -0
  126. package/build/services/LocalMiniappUserIdentity.js.map +1 -0
  127. package/build/services/LocalSttFallbackCoordinator.d.ts +9 -6
  128. package/build/services/LocalSttFallbackCoordinator.d.ts.map +1 -1
  129. package/build/services/LocalSttFallbackCoordinator.js +18 -12
  130. package/build/services/LocalSttFallbackCoordinator.js.map +1 -1
  131. package/build/services/MicStateCoordinator.d.ts +42 -1
  132. package/build/services/MicStateCoordinator.d.ts.map +1 -1
  133. package/build/services/MicStateCoordinator.js +141 -3
  134. package/build/services/MicStateCoordinator.js.map +1 -1
  135. package/build/services/MiniappLauncher.d.ts.map +1 -1
  136. package/build/services/MiniappLauncher.js +23 -3
  137. package/build/services/MiniappLauncher.js.map +1 -1
  138. package/build/services/MiniappLiveness.d.ts +12 -0
  139. package/build/services/MiniappLiveness.d.ts.map +1 -0
  140. package/build/services/MiniappLiveness.js +16 -0
  141. package/build/services/MiniappLiveness.js.map +1 -0
  142. package/build/services/NativeHttpResponse.d.ts +3 -0
  143. package/build/services/NativeHttpResponse.d.ts.map +1 -0
  144. package/build/services/NativeHttpResponse.js +6 -0
  145. package/build/services/NativeHttpResponse.js.map +1 -0
  146. package/build/services/OtaArtifactDownloader.d.ts +65 -0
  147. package/build/services/OtaArtifactDownloader.d.ts.map +1 -0
  148. package/build/services/OtaArtifactDownloader.js +226 -0
  149. package/build/services/OtaArtifactDownloader.js.map +1 -0
  150. package/build/services/OtaAutoChain.d.ts +34 -0
  151. package/build/services/OtaAutoChain.d.ts.map +1 -0
  152. package/build/services/OtaAutoChain.js +83 -0
  153. package/build/services/OtaAutoChain.js.map +1 -0
  154. package/build/services/OtaErrorMapping.d.ts +18 -0
  155. package/build/services/OtaErrorMapping.d.ts.map +1 -0
  156. package/build/services/OtaErrorMapping.js +63 -0
  157. package/build/services/OtaErrorMapping.js.map +1 -0
  158. package/build/services/OtaInstallCoordinator.d.ts +94 -14
  159. package/build/services/OtaInstallCoordinator.d.ts.map +1 -1
  160. package/build/services/OtaInstallCoordinator.js +574 -130
  161. package/build/services/OtaInstallCoordinator.js.map +1 -1
  162. package/build/services/OtaService.d.ts.map +1 -1
  163. package/build/services/OtaService.js +8 -1
  164. package/build/services/OtaService.js.map +1 -1
  165. package/build/services/OtaUpdateCheckService.d.ts +38 -3
  166. package/build/services/OtaUpdateCheckService.d.ts.map +1 -1
  167. package/build/services/OtaUpdateCheckService.js +142 -22
  168. package/build/services/OtaUpdateCheckService.js.map +1 -1
  169. package/build/services/PhoneCalendarHelpers.d.ts +32 -0
  170. package/build/services/PhoneCalendarHelpers.d.ts.map +1 -0
  171. package/build/services/PhoneCalendarHelpers.js +157 -0
  172. package/build/services/PhoneCalendarHelpers.js.map +1 -0
  173. package/build/services/PhoneCalendarService.d.ts +5 -0
  174. package/build/services/PhoneCalendarService.d.ts.map +1 -0
  175. package/build/services/PhoneCalendarService.js +45 -0
  176. package/build/services/PhoneCalendarService.js.map +1 -0
  177. package/build/services/PhoneCameraFovCoordinator.d.ts +30 -0
  178. package/build/services/PhoneCameraFovCoordinator.d.ts.map +1 -0
  179. package/build/services/PhoneCameraFovCoordinator.js +194 -0
  180. package/build/services/PhoneCameraFovCoordinator.js.map +1 -0
  181. package/build/services/PhoneNotificationsSync.d.ts.map +1 -1
  182. package/build/services/PhoneNotificationsSync.js +12 -10
  183. package/build/services/PhoneNotificationsSync.js.map +1 -1
  184. package/build/services/PhonePhotoCoordinator.d.ts +26 -2
  185. package/build/services/PhonePhotoCoordinator.d.ts.map +1 -1
  186. package/build/services/PhonePhotoCoordinator.js +79 -9
  187. package/build/services/PhonePhotoCoordinator.js.map +1 -1
  188. package/build/services/PhoneStreamCoordinator.d.ts +8 -1
  189. package/build/services/PhoneStreamCoordinator.d.ts.map +1 -1
  190. package/build/services/PhoneStreamCoordinator.js +125 -13
  191. package/build/services/PhoneStreamCoordinator.js.map +1 -1
  192. package/build/services/PhoneVideoCoordinator.d.ts +2 -0
  193. package/build/services/PhoneVideoCoordinator.d.ts.map +1 -1
  194. package/build/services/PhoneVideoCoordinator.js +10 -0
  195. package/build/services/PhoneVideoCoordinator.js.map +1 -1
  196. package/build/services/SceneRenderer.d.ts.map +1 -1
  197. package/build/services/SceneRenderer.js +15 -0
  198. package/build/services/SceneRenderer.js.map +1 -1
  199. package/build/services/SentenceTtsPipeline.d.ts +31 -0
  200. package/build/services/SentenceTtsPipeline.d.ts.map +1 -0
  201. package/build/services/SentenceTtsPipeline.js +67 -0
  202. package/build/services/SentenceTtsPipeline.js.map +1 -0
  203. package/build/services/SupportProfileSync.d.ts +22 -0
  204. package/build/services/SupportProfileSync.d.ts.map +1 -0
  205. package/build/services/SupportProfileSync.js +213 -0
  206. package/build/services/SupportProfileSync.js.map +1 -0
  207. package/build/services/TranscriptionRouting.d.ts +12 -0
  208. package/build/services/TranscriptionRouting.d.ts.map +1 -0
  209. package/build/services/TranscriptionRouting.js +24 -0
  210. package/build/services/TranscriptionRouting.js.map +1 -0
  211. package/build/services/TtsTextSanitizer.d.ts +5 -0
  212. package/build/services/TtsTextSanitizer.d.ts.map +1 -0
  213. package/build/services/TtsTextSanitizer.js +61 -0
  214. package/build/services/TtsTextSanitizer.js.map +1 -0
  215. package/build/services/WifiAdbRequest.d.ts +17 -0
  216. package/build/services/WifiAdbRequest.d.ts.map +1 -0
  217. package/build/services/WifiAdbRequest.js +35 -0
  218. package/build/services/WifiAdbRequest.js.map +1 -0
  219. package/build/services/asg/asgCameraApi.d.ts +43 -0
  220. package/build/services/asg/asgCameraApi.d.ts.map +1 -1
  221. package/build/services/asg/asgCameraApi.js +509 -26
  222. package/build/services/asg/asgCameraApi.js.map +1 -1
  223. package/build/services/asg/cameraRollExportCoordinator.d.ts +60 -0
  224. package/build/services/asg/cameraRollExportCoordinator.d.ts.map +1 -0
  225. package/build/services/asg/cameraRollExportCoordinator.js +618 -0
  226. package/build/services/asg/cameraRollExportCoordinator.js.map +1 -0
  227. package/build/services/asg/cameraRollExportLedger.d.ts +44 -0
  228. package/build/services/asg/cameraRollExportLedger.d.ts.map +1 -0
  229. package/build/services/asg/cameraRollExportLedger.js +78 -0
  230. package/build/services/asg/cameraRollExportLedger.js.map +1 -0
  231. package/build/services/asg/galleryNotices.d.ts +1 -1
  232. package/build/services/asg/galleryNotices.d.ts.map +1 -1
  233. package/build/services/asg/galleryNotices.js.map +1 -1
  234. package/build/services/asg/galleryPathMigration.d.ts +3 -0
  235. package/build/services/asg/galleryPathMigration.d.ts.map +1 -0
  236. package/build/services/asg/galleryPathMigration.js +26 -0
  237. package/build/services/asg/galleryPathMigration.js.map +1 -0
  238. package/build/services/asg/gallerySettingsService.d.ts +1 -0
  239. package/build/services/asg/gallerySettingsService.d.ts.map +1 -1
  240. package/build/services/asg/gallerySettingsService.js +2 -0
  241. package/build/services/asg/gallerySettingsService.js.map +1 -1
  242. package/build/services/asg/gallerySyncService.d.ts.map +1 -1
  243. package/build/services/asg/gallerySyncService.js +162 -56
  244. package/build/services/asg/gallerySyncService.js.map +1 -1
  245. package/build/services/asg/galleryTransferLedger.d.ts +58 -0
  246. package/build/services/asg/galleryTransferLedger.d.ts.map +1 -0
  247. package/build/services/asg/galleryTransferLedger.js +225 -0
  248. package/build/services/asg/galleryTransferLedger.js.map +1 -0
  249. package/build/services/asg/localNetworkTransport.d.ts +15 -0
  250. package/build/services/asg/localNetworkTransport.d.ts.map +1 -0
  251. package/build/services/asg/localNetworkTransport.js +144 -0
  252. package/build/services/asg/localNetworkTransport.js.map +1 -0
  253. package/build/services/asg/localStorageService.d.ts +18 -0
  254. package/build/services/asg/localStorageService.d.ts.map +1 -1
  255. package/build/services/asg/localStorageService.js +168 -19
  256. package/build/services/asg/localStorageService.js.map +1 -1
  257. package/build/services/asg/mediaProcessingQueue.d.ts +10 -0
  258. package/build/services/asg/mediaProcessingQueue.d.ts.map +1 -1
  259. package/build/services/asg/mediaProcessingQueue.js +193 -62
  260. package/build/services/asg/mediaProcessingQueue.js.map +1 -1
  261. package/build/services/audioPlaybackAssets.d.ts +8 -0
  262. package/build/services/audioPlaybackAssets.d.ts.map +1 -0
  263. package/build/services/audioPlaybackAssets.js +7 -0
  264. package/build/services/audioPlaybackAssets.js.map +1 -0
  265. package/build/services/gallerySyncClock.js +1 -1
  266. package/build/services/gallerySyncClock.js.map +1 -1
  267. package/build/services/glassesClockSync.js +2 -2
  268. package/build/services/glassesClockSync.js.map +1 -1
  269. package/build/services/manifestActions.d.ts +7 -0
  270. package/build/services/manifestActions.d.ts.map +1 -0
  271. package/build/services/manifestActions.js +25 -0
  272. package/build/services/manifestActions.js.map +1 -0
  273. package/build/services/otaDisplayState.d.ts +22 -11
  274. package/build/services/otaDisplayState.d.ts.map +1 -1
  275. package/build/services/otaDisplayState.js +36 -14
  276. package/build/services/otaDisplayState.js.map +1 -1
  277. package/build/services/otaInstallPolicy.d.ts +15 -3
  278. package/build/services/otaInstallPolicy.d.ts.map +1 -1
  279. package/build/services/otaInstallPolicy.js +24 -3
  280. package/build/services/otaInstallPolicy.js.map +1 -1
  281. package/build/services/otaManifestUrl.d.ts +2 -0
  282. package/build/services/otaManifestUrl.d.ts.map +1 -0
  283. package/build/services/{asgOtaVersionUrl.js → otaManifestUrl.js} +15 -5
  284. package/build/services/otaManifestUrl.js.map +1 -0
  285. package/build/services/slimStreamStatus.d.ts +11 -0
  286. package/build/services/slimStreamStatus.d.ts.map +1 -1
  287. package/build/services/slimStreamStatus.js +14 -4
  288. package/build/services/slimStreamStatus.js.map +1 -1
  289. package/build/stores/apps.d.ts.map +1 -1
  290. package/build/stores/apps.js +11 -0
  291. package/build/stores/apps.js.map +1 -1
  292. package/build/stores/bluetoothSettingKeys.d.ts.map +1 -1
  293. package/build/stores/bluetoothSettingKeys.js +2 -0
  294. package/build/stores/bluetoothSettingKeys.js.map +1 -1
  295. package/build/stores/gallerySync.d.ts +2 -0
  296. package/build/stores/gallerySync.d.ts.map +1 -1
  297. package/build/stores/gallerySync.js +2 -0
  298. package/build/stores/gallerySync.js.map +1 -1
  299. package/build/stores/glasses.d.ts.map +1 -1
  300. package/build/stores/glasses.js +3 -0
  301. package/build/stores/glasses.js.map +1 -1
  302. package/build/stores/settings.d.ts +17 -0
  303. package/build/stores/settings.d.ts.map +1 -1
  304. package/build/stores/settings.js +157 -17
  305. package/build/stores/settings.js.map +1 -1
  306. package/build/types/applet.d.ts +2 -0
  307. package/build/types/applet.d.ts.map +1 -1
  308. package/build/types/applet.js.map +1 -1
  309. package/build/types/asg.d.ts +7 -0
  310. package/build/types/asg.d.ts.map +1 -1
  311. package/build/types/asg.js.map +1 -1
  312. package/build/types/enums.d.ts +1 -0
  313. package/build/types/enums.d.ts.map +1 -1
  314. package/build/types/enums.js +1 -0
  315. package/build/types/enums.js.map +1 -1
  316. package/build/types/hardware.d.ts +1 -0
  317. package/build/types/hardware.d.ts.map +1 -1
  318. package/build/types/hardware.js +14 -0
  319. package/build/types/hardware.js.map +1 -1
  320. package/build/utils/configuredDevHost.d.ts +6 -0
  321. package/build/utils/configuredDevHost.d.ts.map +1 -0
  322. package/build/utils/configuredDevHost.js +19 -0
  323. package/build/utils/configuredDevHost.js.map +1 -0
  324. package/build/utils/devMiniappLaunch.d.ts +19 -8
  325. package/build/utils/devMiniappLaunch.d.ts.map +1 -1
  326. package/build/utils/devMiniappLaunch.js +144 -21
  327. package/build/utils/devMiniappLaunch.js.map +1 -1
  328. package/build/utils/diagnosticContext.d.ts.map +1 -1
  329. package/build/utils/diagnosticContext.js +15 -17
  330. package/build/utils/diagnosticContext.js.map +1 -1
  331. package/build/utils/hardware/hardware.d.ts.map +1 -1
  332. package/build/utils/hardware/hardware.js +7 -3
  333. package/build/utils/hardware/hardware.js.map +1 -1
  334. package/build/utils/miniappDiagnostics.d.ts +64 -0
  335. package/build/utils/miniappDiagnostics.d.ts.map +1 -0
  336. package/build/utils/miniappDiagnostics.js +173 -0
  337. package/build/utils/miniappDiagnostics.js.map +1 -0
  338. package/build/utils/permissions/MediaLibraryPermissions.d.ts +11 -0
  339. package/build/utils/permissions/MediaLibraryPermissions.d.ts.map +1 -1
  340. package/build/utils/permissions/MediaLibraryPermissions.js +27 -4
  341. package/build/utils/permissions/MediaLibraryPermissions.js.map +1 -1
  342. package/build/utils/timers/timers.d.ts.map +1 -1
  343. package/build/utils/timers/timers.js +55 -18
  344. package/build/utils/timers/timers.js.map +1 -1
  345. package/package.json +25 -15
  346. package/src/assets/silence.wav +0 -0
  347. package/src/engine.ts +7 -2
  348. package/src/facades/dev.ts +17 -12
  349. package/src/facades/gallery.ts +1 -1
  350. package/src/facades/glasses.ts +17 -4
  351. package/src/facades/glassesSettings.ts +5 -0
  352. package/src/facades/miniapps.ts +7 -0
  353. package/src/facades/ota.ts +19 -4
  354. package/src/facades/pairing.ts +11 -7
  355. package/src/facades/permissions.ts +14 -0
  356. package/src/facades/phoneNotifications.ts +4 -13
  357. package/src/index.ts +26 -2
  358. package/src/internal.ts +3 -1
  359. package/src/react/MentraLiveOtaFlow.tsx +856 -0
  360. package/src/react/index.ts +7 -0
  361. package/src/react/useEngineSnapshot.ts +16 -0
  362. package/src/runtime/bootstrap.ts +33 -1
  363. package/src/runtime/scanQrSeam.ts +20 -0
  364. package/src/services/AppRegistry.ts +224 -149
  365. package/src/services/AudioCloudUplink.ts +23 -1
  366. package/src/services/AudioPlaybackService.ts +287 -38
  367. package/src/services/BlobStore.ts +22 -9
  368. package/src/services/CloudAudioSubscriptionSync.ts +13 -1
  369. package/src/services/CloudClientService.ts +96 -1
  370. package/src/services/DeviceEventRouter.ts +5 -5
  371. package/src/services/ForegroundLocationPermission.ts +24 -0
  372. package/src/services/GlassesSettingsSync.ts +9 -3
  373. package/src/services/GlassesStatusProjection.ts +16 -8
  374. package/src/services/HotspotOtaTransport.ts +184 -0
  375. package/src/services/HotspotShutdown.ts +41 -0
  376. package/src/services/LocalDisplayManager.ts +112 -21
  377. package/src/services/LocalMiniappRuntime.ts +967 -346
  378. package/src/services/LocalMiniappStorage.ts +82 -0
  379. package/src/services/LocalMiniappUserIdentity.ts +46 -0
  380. package/src/services/LocalSttFallbackCoordinator.ts +19 -12
  381. package/src/services/MicStateCoordinator.ts +169 -4
  382. package/src/services/MiniappLauncher.ts +30 -3
  383. package/src/services/MiniappLiveness.ts +24 -0
  384. package/src/services/NativeHttpResponse.ts +6 -0
  385. package/src/services/OtaArtifactDownloader.ts +312 -0
  386. package/src/services/OtaAutoChain.ts +106 -0
  387. package/src/services/OtaErrorMapping.ts +80 -0
  388. package/src/services/OtaInstallCoordinator.ts +645 -143
  389. package/src/services/OtaService.ts +11 -5
  390. package/src/services/OtaUpdateCheckService.ts +180 -20
  391. package/src/services/PhoneCalendarHelpers.ts +212 -0
  392. package/src/services/PhoneCalendarService.ts +65 -0
  393. package/src/services/PhoneCameraFovCoordinator.ts +210 -0
  394. package/src/services/PhoneNotificationsSync.ts +12 -10
  395. package/src/services/PhonePhotoCoordinator.ts +116 -18
  396. package/src/services/PhoneStreamCoordinator.ts +139 -25
  397. package/src/services/PhoneVideoCoordinator.ts +11 -0
  398. package/src/services/SceneRenderer.ts +16 -0
  399. package/src/services/SentenceTtsPipeline.ts +106 -0
  400. package/src/services/SupportProfileSync.ts +218 -0
  401. package/src/services/TranscriptionRouting.ts +37 -0
  402. package/src/services/TtsTextSanitizer.ts +66 -0
  403. package/src/services/WifiAdbRequest.ts +53 -0
  404. package/src/services/asg/asgCameraApi.ts +615 -33
  405. package/src/services/asg/cameraRollExportCoordinator.ts +627 -0
  406. package/src/services/asg/cameraRollExportLedger.ts +122 -0
  407. package/src/services/asg/galleryNotices.ts +1 -0
  408. package/src/services/asg/galleryPathMigration.ts +22 -0
  409. package/src/services/asg/gallerySettingsService.ts +3 -0
  410. package/src/services/asg/gallerySyncService.ts +184 -73
  411. package/src/services/asg/galleryTransferLedger.ts +312 -0
  412. package/src/services/asg/localNetworkTransport.ts +169 -0
  413. package/src/services/asg/localStorageService.ts +179 -24
  414. package/src/services/asg/mediaProcessingQueue.ts +209 -62
  415. package/src/services/audioPlaybackAssets.ts +8 -0
  416. package/src/services/gallerySyncClock.ts +1 -1
  417. package/src/services/glassesClockSync.ts +2 -2
  418. package/src/services/manifestActions.ts +30 -0
  419. package/src/services/otaDisplayState.ts +57 -16
  420. package/src/services/otaInstallPolicy.ts +29 -3
  421. package/src/services/{asgOtaVersionUrl.ts → otaManifestUrl.ts} +16 -4
  422. package/src/services/slimStreamStatus.ts +16 -5
  423. package/src/stores/apps.ts +12 -0
  424. package/src/stores/bluetoothSettingKeys.ts +2 -0
  425. package/src/stores/gallerySync.ts +4 -0
  426. package/src/stores/glasses.ts +3 -0
  427. package/src/stores/settings.ts +179 -18
  428. package/src/types/applet.ts +2 -0
  429. package/src/types/asg.ts +7 -0
  430. package/src/types/enums.ts +2 -1
  431. package/src/types/hardware.ts +17 -0
  432. package/src/utils/configuredDevHost.ts +17 -0
  433. package/src/utils/devMiniappLaunch.ts +151 -23
  434. package/src/utils/diagnosticContext.ts +17 -17
  435. package/src/utils/hardware/hardware.ts +7 -9
  436. package/src/utils/miniappDiagnostics.ts +226 -0
  437. package/src/utils/permissions/MediaLibraryPermissions.ts +35 -4
  438. package/src/utils/timers/timers.ts +57 -21
  439. package/build/services/asgOtaVersionUrl.d.ts +0 -2
  440. package/build/services/asgOtaVersionUrl.d.ts.map +0 -1
  441. package/build/services/asgOtaVersionUrl.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"AppRegistry.js","sourceRoot":"","sources":["../../src/services/AppRegistry.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * AppRegistry — on-disk install/uninstall registry for local miniapps.\n *\n * Owns the `Documents/lmas/<packageName>/<version>/` filesystem layout, the\n * download/unzip pipeline, and the active-version pointer in MMKV. It does\n * NOT touch the apps store directly — instead it notifies subscribers when\n * the install set changes, so the host (mobile manager, OEM app) can refresh\n * its own state.\n *\n * Public surface:\n * - installFromUrl(url, opts?) install/replace a miniapp from a URL\n * - installFromLocalZip(path, opts?) install/replace from a local zip\n * - uninstall(packageName, version?) remove one or all versions\n * - getInstalledMiniapps() ClientApp[] derived from disk\n * - getActiveVersion(packageName) active version string for a package\n * - getBundleDir / getMiniappManifest filesystem helpers used by hosts\n * - subscribe(fn) register a refresh listener\n */\n\nimport {Directory, Paths, File} from \"expo-file-system\"\nimport {unzip} from \"react-native-zip-archive\"\nimport semver from \"semver\"\nimport {AsyncResult, Result, result as Res} from \"typesafe-ts\"\n\nimport type {AppletPermission, AppPermissionType, AppletType, ClientApp, DeclaredAction} from \"../types/applet\"\nimport {HardwareRequirement, HardwareRequirementLevel, HardwareType} from \"../types\"\nimport {getConfigValues} from \"../runtime/bootstrap\"\nimport {storage} from \"../utils/storage/storage\"\nimport {printDirectory} from \"../utils/storage/zip\"\nimport {checkManifestVersions} from \"./manifestVersionGate\"\nimport {miniappRunningRegistry} from \"./MiniappRunningRegistry\"\n\nconst ALLOWED_PERMISSION_TYPES: ReadonlySet<AppPermissionType> = new Set<AppPermissionType>([\n \"MICROPHONE\",\n \"CAMERA\",\n \"CALENDAR\",\n \"LOCATION\",\n \"BACKGROUND_LOCATION\",\n \"READ_NOTIFICATIONS\",\n \"POST_NOTIFICATIONS\",\n])\n\n/**\n * Normalize the `permissions` field from a miniapp.json manifest.\n *\n * New miniapps ship `[{type, required?, description?}]` objects. A few older\n * installed bundles may have `[\"MICROPHONE\", ...]` plain strings. Accept both.\n */\nexport function normalizeManifestPermissions(\n raw: Array<string | {type: string; required?: boolean; description?: string}> | undefined,\n): AppletPermission[] {\n if (!Array.isArray(raw)) return []\n const out: AppletPermission[] = []\n for (const p of raw) {\n if (typeof p === \"string\") {\n if (ALLOWED_PERMISSION_TYPES.has(p as AppPermissionType)) {\n out.push({type: p as AppPermissionType, required: true})\n }\n } else if (p && typeof p === \"object\" && typeof p.type === \"string\") {\n if (ALLOWED_PERMISSION_TYPES.has(p.type as AppPermissionType)) {\n out.push({\n type: p.type as AppPermissionType,\n ...(typeof p.required === \"boolean\" ? {required: p.required} : {}),\n ...(typeof p.description === \"string\" ? {description: p.description} : {}),\n })\n }\n }\n }\n return out\n}\n\nfunction normalizeManifestType(raw: unknown): AppletType {\n return raw === \"background\" || raw === \"system_dashboard\" || raw === \"standard\" ? raw : \"standard\"\n}\n\n/**\n * Normalize a manifest's `actions` into DeclaredAction[]. Defensive — keeps only\n * well-formed `{id, description}` entries (installed/dev bundles may be\n * malformed). Shared by installed (disk) and dev-sideload projection so both\n * surface declared actions to session.miniapps.list + the invoke gate.\n */\nexport function normalizeManifestActions(raw: unknown): DeclaredAction[] {\n if (!Array.isArray(raw)) return []\n const out: DeclaredAction[] = []\n for (const a of raw as Array<{id?: unknown; description?: unknown; parameters?: unknown}>) {\n if (a && typeof a.id === \"string\" && typeof a.description === \"string\") {\n out.push({\n id: a.id,\n description: a.description,\n ...(a.parameters && typeof a.parameters === \"object\"\n ? {parameters: a.parameters as Record<string, unknown>}\n : {}),\n })\n }\n }\n return out\n}\n\n/**\n * Convert declared hardwareRequirements from a miniapp.json manifest into\n * runtime `HardwareRequirement[]`, always appending `{EXIST, REQUIRED}` so\n * launchers show \"Glasses Required\" when no glasses are connected.\n *\n * Malformed entries are dropped with a single warning per package so the\n * rest of the manifest still works.\n */\nexport function buildHardwareRequirements(\n raw: Array<{type: string; level: string; description?: string}> | undefined,\n packageName: string,\n): HardwareRequirement[] {\n const out: HardwareRequirement[] = []\n const validTypes = new Set(Object.values(HardwareType) as string[])\n const validLevels = new Set(Object.values(HardwareRequirementLevel) as string[])\n\n if (!Array.isArray(raw)) {\n if (raw !== undefined) {\n console.warn(`APP_REGISTRY: ${packageName} has invalid hardwareRequirements (not an array); treating as []`)\n }\n } else {\n let warned = false\n for (const r of raw) {\n if (\n !r ||\n typeof r !== \"object\" ||\n typeof r.type !== \"string\" ||\n typeof r.level !== \"string\" ||\n !validTypes.has(r.type) ||\n !validLevels.has(r.level)\n ) {\n if (!warned) {\n console.warn(\n `APP_REGISTRY: ${packageName} has malformed hardwareRequirements entry; skipping invalid entries`,\n r,\n )\n warned = true\n }\n continue\n }\n out.push({\n type: r.type as HardwareType,\n level: r.level as HardwareRequirementLevel,\n ...(typeof r.description === \"string\" ? {description: r.description} : {}),\n })\n }\n }\n\n // Always require glasses to be connected for any local miniapp.\n out.push({type: HardwareType.EXIST, level: HardwareRequirementLevel.REQUIRED})\n return out\n}\n\ninterface InstalledInfo {\n name: string\n logoUrl: string\n}\n\ninterface InstalledLma {\n packageName: string\n versions: Record<string, InstalledInfo>\n}\n\n/**\n * Download a miniapp zip from `url` into the cache and return its local path.\n *\n * `File.downloadFileAsync` is HTTP(S)-only, so this path is for remote bundles\n * (dev server, store). Bundled-asset installs already have a local zip and\n * should call {@link unpackMiniApp} directly.\n */\nasync function downloadMiniAppZip(url: string): Promise<string> {\n const downloadDir = new Directory(Paths.cache, \"lma_downloads\")\n try {\n if (!downloadDir.exists) {\n downloadDir.create()\n }\n } catch (error) {\n console.error(\"ZIP: Error creating download directory\", error)\n throw \"CREATE_DOWNLOAD_DIR_FAILED\"\n }\n\n // Pre-delete any cached file with the same name. Both `mentra-miniapp dev`\n // and `mentra-miniapp release` serve their zip at /bundle.zip, so URLs\n // collide on the cache filename. Without this delete, a stale dev-snapshot\n // (containing the project source tree) gets unzipped instead of the\n // release build → white screen because index.html points at TSX files.\n const targetFileName = url.split(\"/\").pop() ?? \"bundle.zip\"\n const existingFile = new File(downloadDir, targetFileName)\n if (existingFile.exists) {\n try {\n existingFile.delete()\n } catch (e) {\n console.warn(\"ZIP: failed to delete stale cached download:\", e)\n }\n }\n\n try {\n const output = await File.downloadFileAsync(url, downloadDir)\n return output.uri\n } catch (error) {\n console.error(\"ZIP: Error downloading zip file\", error)\n throw \"DOWNLOAD_FAILED\"\n }\n}\n\n/**\n * Unpack a local miniapp zip and install it under\n * `lmas/<packageName>/<version>/`.\n *\n * Zip layout: flat — files at root, `miniapp.json` at the top level. We're\n * strict on shape so we fail loudly on malformed bundles.\n *\n * @param zipPath file:// URI of the zip on local disk.\n * @param versionOverride override the manifest's version field. Used by the\n * dev miniapp caching path which stamps `dev-<ms>`\n * so multiple snapshots can coexist alongside\n * semver-installed versions.\n */\nasync function unpackMiniApp(\n zipPath: string,\n versionOverride?: string,\n): Promise<{packageName: string; version: string}> {\n const unzipDir = new Directory(Paths.cache, \"lma_unzip\")\n try {\n if (unzipDir.exists) unzipDir.delete()\n unzipDir.create()\n } catch (error) {\n console.error(\"ZIP: Error creating or deleting the unzip directory\", error)\n throw \"CREATE_CACHE_DIR_FAILED\"\n }\n\n try {\n console.log(\"ZIP: unzipping\", zipPath)\n await unzip(zipPath, unzipDir.uri)\n } catch (error) {\n console.error(\"Error unzipping zip file\", error)\n throw \"UNZIP_FAILED\"\n }\n\n // Strict zip shape: miniapp.json at unzip root. No tolerance for an\n // enclosing folder or app.json fallback — we own the dev-server emit\n // format, so any deviation indicates a corrupt bundle.\n const appDir = unzipDir\n let packageName: string\n let manifestVersion: string\n try {\n const miniappJsonFile = new File(appDir, \"miniapp.json\")\n if (!miniappJsonFile.exists) throw new Error(\"miniapp.json missing at zip root\")\n const manifest = JSON.parse(miniappJsonFile.textSync())\n if (!manifest.packageName) throw new Error(\"miniapp.json missing packageName\")\n if (!manifest.version) throw new Error(\"miniapp.json missing version\")\n packageName = manifest.packageName\n manifestVersion = manifest.version\n } catch (error) {\n console.error(\"Error reading miniapp.json from zip:\", error)\n throw \"READ_MANIFEST_FAILED\"\n }\n const version = versionOverride ?? manifestVersion\n console.log(`ZIP: installing ${packageName} as version ${version}`)\n\n const basePackageDir = new Directory(Paths.document, \"lmas\", packageName)\n try {\n if (!basePackageDir.exists) {\n basePackageDir.create({intermediates: true})\n }\n } catch (error) {\n console.error(\"Error creating the base package directory\", error)\n throw \"CREATE_PACKAGE_DIR_FAILED\"\n }\n\n const versionDir = new Directory(basePackageDir, version)\n try {\n if (!versionDir.exists) {\n versionDir.create()\n } else {\n versionDir.delete()\n versionDir.create()\n }\n } catch (error) {\n console.error(\"Error creating the version directory\", error)\n throw \"CREATE_VERSION_DIR_FAILED\"\n }\n\n try {\n const contents = appDir.list()\n for (const item of contents) {\n item.move(versionDir)\n }\n } catch (error) {\n console.error(\"Error moving the contents of the folder to the destination directory\", error)\n throw \"INSTALL_CONTENTS_FAILED\"\n }\n\n console.log(\"ZIP: local mini app installed at\", versionDir.uri)\n printDirectory(versionDir, 2)\n return {packageName, version}\n}\n\n/**\n * Download a miniapp zip from `url`, unpack it, and install it under\n * `lmas/<packageName>/<version>/`. Thin composition of\n * {@link downloadMiniAppZip} + {@link unpackMiniApp} for remote bundles.\n *\n * @param versionOverride override the manifest's version field. Used by the\n * dev miniapp caching path which stamps `dev-<ms>`\n * so multiple snapshots can coexist alongside\n * semver-installed versions.\n */\nasync function downloadAndInstallMiniApp(\n url: string,\n versionOverride?: string,\n): Promise<{packageName: string; version: string}> {\n const downloadedZipPath = await downloadMiniAppZip(url)\n console.log(\"ZIP: done downloading, starting unzip\")\n return unpackMiniApp(downloadedZipPath, versionOverride)\n}\n\ntype Listener = () => void\n\nclass AppRegistry {\n private cachedApps: ClientApp[] = []\n // Offline apps live in a separate layer so they survive the disk-rebuild\n // path in getInstalledMiniapps (which reassigns cachedApps).\n private offlineApps: ClientApp[] = []\n /** Package names whose start() requires the on-device STT model (host-declared). */\n private sttModelRequired = new Set<string>()\n private refreshNeeded: boolean = true\n private listeners = new Set<Listener>()\n\n private static instance: AppRegistry | null = null\n\n private constructor() {}\n\n public static getInstance(): AppRegistry {\n if (!AppRegistry.instance) {\n AppRegistry.instance = new AppRegistry()\n }\n return AppRegistry.instance\n }\n\n /** Subscribe to install/uninstall events. Listener fires after refreshNeeded flips. */\n public subscribe(fn: Listener): () => void {\n this.listeners.add(fn)\n return () => {\n this.listeners.delete(fn)\n }\n }\n\n private notify(): void {\n for (const fn of this.listeners) {\n try {\n fn()\n } catch (e) {\n console.warn(\"AppRegistry: listener threw\", e)\n }\n }\n }\n\n /**\n * On-disk path for a given miniapp bundle version.\n */\n public getBundleDir(packageName: string, version: string): string {\n const bundleDir = new Directory(Paths.document, \"lmas\", packageName, version)\n return bundleDir.uri\n }\n\n /**\n * Resolve the two-layer entry paths for an installed miniapp version.\n * Returns absolute file:// URIs for `background` and (when present) `ui`.\n *\n * Legacy single-layer bundles (no `entry` object in manifest) fall back\n * to `index.html` discovery so the WebView host keeps working unchanged.\n * Two-layer bundles ship `entry.background` and optional `entry.ui`\n * paths relative to the bundle root.\n *\n * Returns null if neither shape resolves to existing files on disk.\n */\n public getMiniappEntryPaths(\n packageName: string,\n version: string,\n ): {background: string | null; ui: string | null} | null {\n const manifest = this.getMiniappManifest(packageName, version) as {\n entry?: {background?: string; ui?: string}\n } | null\n const bundleDir = this.getBundleDir(packageName, version)\n const resolve = (rel: string): string | null => {\n const trimmed = rel.replace(/^\\.?\\/+/, \"\")\n const file = new File(bundleDir, trimmed)\n return file.exists ? file.uri : null\n }\n if (manifest?.entry) {\n console.log(\"manifest.entry\", manifest.entry)\n const bg = manifest.entry.background ? resolve(manifest.entry.background) : null\n console.log(\"bg\", bg)\n const ui = manifest.entry.ui ? resolve(manifest.entry.ui) : null\n console.log(\"ui\", ui)\n if (bg || ui) {\n return {background: bg, ui: ui}\n }\n }\n // Legacy single-bundle fallback — `index.html` at the bundle root.\n const legacy = new File(new Directory(bundleDir.replace(/^file:\\/\\//, \"\")), \"index.html\")\n return {\n background: null,\n ui: legacy.exists ? legacy.uri : null,\n }\n }\n\n /**\n * Verify a manifest declares an SDK / host version range compatible\n * with the current host. Delegates to the pure\n * {@link checkManifestVersions} helper — same shape, no React Native\n * imports, unit-testable. Manifests missing either field pass\n * through unchanged (legacy single-layer path).\n */\n public checkManifestVersions(\n manifest: {sdkVersion?: string; minHostVersion?: string} | null,\n options: {hostVersion: string; supportedSdkRange: string},\n ): {ok: true} | {ok: false; reason: string} {\n return checkManifestVersions(manifest, options)\n }\n\n /**\n * Read and parse the miniapp manifest (miniapp.json with app.json fallback)\n * from a given bundle directory.\n */\n public getMiniappManifest(packageName: string, version: string): any {\n const bundleDir = new Directory(Paths.document, \"lmas\", packageName, version)\n try {\n const miniappJsonFile = new File(bundleDir, \"miniapp.json\")\n if (miniappJsonFile.exists) {\n return JSON.parse(miniappJsonFile.textSync())\n }\n } catch (e) {\n console.warn(\"AppRegistry: Error reading miniapp.json, trying app.json fallback\", e)\n }\n try {\n const appJsonFile = new File(bundleDir, \"app.json\")\n if (appJsonFile.exists) {\n return JSON.parse(appJsonFile.textSync())\n }\n } catch (e) {\n console.warn(\"AppRegistry: Error reading app.json fallback\", e)\n }\n return null\n }\n\n /**\n * Download and install a miniapp bundle from a URL. The URL must serve a\n * zip whose root contains `miniapp.json` plus the bundle entry files.\n *\n * @param opts.versionOverride if set, install under this version instead\n * of `manifest.version`. The dev caching path uses `dev-<ms>` so multiple\n * snapshots can coexist alongside semver-installed versions.\n */\n public installFromUrl(url: string, opts?: {versionOverride?: string}): AsyncResult<void, Error> {\n return Res.try_async(async () => {\n const {packageName, version} = await downloadAndInstallMiniApp(url, opts?.versionOverride)\n console.log(\"APP_REGISTRY: Downloaded and installed mini app\")\n this.finalizeInstall(packageName, version)\n })\n }\n\n /**\n * Install a miniapp from a zip already on local disk (e.g. a bundled asset\n * copied into cache). Skips the HTTP download path that `installFromUrl`\n * uses — `File.downloadFileAsync` is HTTP(S)-only and rejects file:// URIs.\n *\n * @param zipPath file:// URI of the local zip.\n */\n public installFromLocalZip(\n zipPath: string,\n opts?: {versionOverride?: string},\n ): AsyncResult<{packageName: string; version: string}, Error> {\n return Res.try_async(async () => {\n const {packageName, version} = await unpackMiniApp(zipPath, opts?.versionOverride)\n console.log(\"APP_REGISTRY: Installed mini app from local zip\")\n this.finalizeInstall(packageName, version)\n return {packageName, version}\n })\n }\n\n /**\n * Post-install bookkeeping shared by every install path: clear stale dev\n * artifacts on release installs, point the active-version at the just-\n * installed bundle, and notify subscribers to refresh.\n */\n private finalizeInstall(packageName: string, version: string): void {\n // If this is a release install (semver, not dev-*) of a package that\n // currently has dev-* snapshots, clear the dev state so the swap to\n // \"released\" is clean. Otherwise the dev version would keep winning\n // getActiveVersion's dev-precedence rule and the just-installed\n // release wouldn't run.\n const isDevInstall = version.startsWith(\"dev-\")\n if (!isDevInstall) {\n this.clearDevArtifacts(packageName)\n }\n\n this.setActiveVersion(packageName, version)\n this.refreshNeeded = true\n this.notify()\n }\n\n public installFromJsonUrl(baseUrl: string): AsyncResult<{packageName: string; version: string; name: string}, Error> {\n return Res.try_async(async () => {\n const trimmed = baseUrl.replace(/\\/$/, \"\")\n\n const manifestRes = await fetch(`${trimmed}/miniapp.json`)\n if (!manifestRes.ok) {\n throw new Error(`Failed to fetch miniapp.json: ${manifestRes.status}`)\n }\n const manifest = (await manifestRes.json()) as Record<string, unknown>\n const packageName = manifest.packageName as string | undefined\n const version = manifest.version as string | undefined\n const name = (manifest.name as string | undefined) ?? packageName ?? \"Mini app\"\n if (!packageName) throw new Error(\"miniapp.json missing packageName\")\n if (!version) throw new Error(\"miniapp.json missing version\")\n\n const installRes = await appRegistry.installFromUrl(`${trimmed}/bundle.zip`)\n if (installRes.is_error()) throw installRes.error\n\n return {packageName, version, name}\n })\n }\n\n /**\n * Drop every dev-* version directory for a package plus ALL dev MMKV keys\n * (URL/port/reachability + the home-tile metadata record). Called on a\n * release install (dev → released transition) and on uninstall, so a dev\n * package leaves nothing behind that `projectDevApps` could re-surface.\n */\n private clearDevArtifacts(packageName: string): void {\n try {\n const pkgDir = new Directory(Paths.document, \"lmas\", packageName)\n if (pkgDir.exists) {\n for (const item of pkgDir.list()) {\n if (item instanceof Directory && item.name.startsWith(\"dev-\")) {\n try {\n item.delete()\n } catch (e) {\n console.warn(`APP_REGISTRY: failed to delete ${item.name}:`, e)\n }\n }\n }\n }\n } catch (e) {\n console.warn(`APP_REGISTRY: clearDevArtifacts dir scan failed for ${packageName}:`, e)\n }\n storage.remove(`${packageName}_dev_url`)\n storage.remove(`${packageName}_dev_port`)\n storage.remove(`${packageName}_dev_last_reachable`)\n // Drop the single dev slot's home-tile metadata + dev URL/port keys (all stored under\n // DEV_APP_PACKAGE_NAME, not `packageName`). Dev miniapps load over HTTP and aren't on disk,\n // so without this the projected tile would reappear on the next getInstalledMiniapps() refresh.\n //\n // Only do this when we're actually touching the dev slot: either the dev package itself, or the\n // real manifest package currently occupying the slot. Otherwise a release install/uninstall of\n // an UNRELATED package would wipe the active dev tile.\n if (packageName === DEV_APP_PACKAGE_NAME || packageName === getDevAppSourcePackage()) {\n unregisterDevApp()\n }\n }\n\n /**\n * Garbage-collect older `dev-*` version directories for this package,\n * keeping the latest `keep` (by lexicographic sort, which matches\n * timestamp ordering since dev-<ms> is zero-padded).\n *\n * Only touches `dev-*` versions; semver-installed versions are left alone.\n */\n public gcDevVersions(packageName: string, keep: number): void {\n try {\n const pkgDir = new Directory(Paths.document, \"lmas\", packageName)\n if (!pkgDir.exists) return\n const dirs = pkgDir\n .list()\n .filter((d): d is Directory => d instanceof Directory && d.name.startsWith(\"dev-\"))\n .sort((a, b) => (a.name < b.name ? 1 : -1))\n for (let i = keep; i < dirs.length; i++) {\n try {\n dirs[i].delete()\n } catch (e) {\n console.warn(`APP_REGISTRY: failed to delete ${dirs[i].name}:`, e)\n }\n }\n if (dirs.length > keep) this.refreshNeeded = true\n } catch (e) {\n console.warn(`APP_REGISTRY: gcDevVersions error for ${packageName}:`, e)\n }\n }\n\n public uninstall(packageName: string, version?: string): AsyncResult<void, Error> {\n return Res.try_async(async () => {\n if (version) {\n const lmaDir = new Directory(Paths.document, \"lmas\", packageName, version)\n // Guard exists: a dev miniapp loads over HTTP and has no on-disk dir,\n // so an unconditional delete() would throw and abort the cleanup below.\n if (lmaDir.exists) lmaDir.delete()\n console.log(\"APP_REGISTRY: Uninstalled mini app version\", version)\n const packageDir = new Directory(Paths.document, \"lmas\", packageName)\n if (packageDir.exists && packageDir.list().length === 0) {\n packageDir.delete()\n }\n } else {\n const packageDir = new Directory(Paths.document, \"lmas\", packageName)\n if (packageDir.exists) {\n packageDir.delete()\n }\n console.log(\"APP_REGISTRY: Uninstalled all versions of mini app\", packageName)\n }\n // Always clear dev artifacts: for HTTP-direct dev miniapps the tile is\n // backed by storage records (_dev_meta + dev_apps_index), not the disk\n // dir, so without this the projected tile reappears on the next refresh.\n this.clearDevArtifacts(packageName)\n this.refreshNeeded = true\n this.notify()\n })\n }\n\n public getPackageNames(): string[] {\n try {\n const lmasDir = new Directory(Paths.document, \"lmas\")\n if (!lmasDir.exists) return []\n let lmas = lmasDir.list()\n lmas = lmas.filter((lma): lma is Directory => lma instanceof Directory && lma.list().length > 0)\n return lmas.map((lma) => lma.name)\n } catch (error) {\n console.error(\"APP_REGISTRY: Error getting locally installed package names\", error)\n return []\n }\n }\n\n public getInstalledVersions(packageName: string): string[] {\n try {\n const lmaDir = new Directory(Paths.document, \"lmas\", packageName)\n // Not installed yet is an expected state (e.g. preinstall sync probing\n // versions before first install) — return [] without the error noise.\n if (!lmaDir.exists) {\n return []\n }\n const lma = lmaDir.list()\n return lma.map((lma) => lma.name)\n } catch (error) {\n console.error(\"APP_REGISTRY: Error getting local applet versions\", error)\n return []\n }\n }\n\n public async getActiveVersion(packageName: string): Promise<string> {\n let versions = this.getInstalledVersions(packageName)\n // Treat MMKV as a hint, not authority. A stored version may have been\n // GC'd off disk without this pointer being updated.\n let res = storage.load<string>(`${packageName}_active_version`)\n if (res.is_ok() && versions.includes(res.value)) {\n return res.value\n }\n // Dev versions take precedence over semver-installed versions.\n const devVersions = versions\n .filter((v) => v.startsWith(\"dev-\"))\n .sort()\n .reverse()\n if (devVersions.length > 0) {\n this.setActiveVersion(packageName, devVersions[0])\n return devVersions[0]\n }\n versions = versions.filter((v) => semver.valid(v))\n versions.sort((a, b) => semver.rcompare(a, b))\n this.setActiveVersion(packageName, versions[0])\n return versions[0]\n }\n\n public setActiveVersion(packageName: string, version: string): Result<void, Error> {\n return storage.save(`${packageName}_active_version`, version)\n }\n\n public getMetadata(packageName: string, version: string): InstalledInfo {\n try {\n const lmaDir = new Directory(Paths.document, \"lmas\", packageName, version)\n const miniappJsonFile = new File(lmaDir, \"miniapp.json\")\n const manifest = JSON.parse(miniappJsonFile.textSync())\n const logoUrl = new File(lmaDir, \"icon.png\").uri\n return {name: manifest.name, logoUrl: logoUrl}\n } catch (error) {\n console.error(\"APP_REGISTRY: Error getting local miniapp metadata\", error)\n return {name: \"error\", logoUrl: \"\"}\n }\n }\n\n public getInstalledInfo(): InstalledLma[] {\n const packageNames = this.getPackageNames()\n const out: InstalledLma[] = []\n for (const packageName of packageNames) {\n const versionStrings = this.getInstalledVersions(packageName)\n const installedVersion: InstalledLma = {packageName, versions: {}}\n for (const versionString of versionStrings) {\n installedVersion.versions[versionString] = this.getMetadata(packageName, versionString)\n }\n out.push(installedVersion)\n }\n return out\n }\n\n /**\n * Read the lmas/ tree and return one ClientApp per installed package,\n * picking each package's active version. The store/host overlays runtime\n * state (loading, hidden, compatibility) on top of these.\n *\n * `running` reflects MiniappHost mount state via miniappRunningRegistry.\n */\n /**\n * Merge disk-derived apps with the projected dev + offline layers,\n * de-duping by packageName. A real on-disk install (or offline app) wins\n * over a dev tile of the same package — a dev record is just a launcher\n * stub that an actual install supersedes.\n */\n private mergeProjectedApps(diskApps: ClientApp[]): ClientApp[] {\n const seen = new Set(diskApps.map((a) => a.packageName))\n const offline = this.projectOfflineApps()\n for (const a of offline) seen.add(a.packageName)\n const dev = this.projectDevApps().filter((a) => !seen.has(a.packageName))\n return [...diskApps, ...dev, ...offline]\n }\n\n public async getInstalledMiniapps(): Promise<ClientApp[]> {\n if (!this.refreshNeeded && this.cachedApps.length > 0) {\n // Cache hit: re-project running from the registry. The cached array\n // IS the disk-derived truth; running comes from the mount registry.\n return this.mergeProjectedApps(\n this.cachedApps.map((a) => ({\n ...a,\n running: miniappRunningRegistry.has(a.packageName),\n })),\n )\n }\n\n try {\n const installedInfo = this.getInstalledInfo()\n const out: ClientApp[] = []\n for (const lmaInfo of installedInfo) {\n const versionString = await this.getActiveVersion(lmaInfo.packageName)\n const versionInfo = lmaInfo.versions[versionString]\n\n const manifest = this.getMiniappManifest(lmaInfo.packageName, versionString) as {\n permissions?: Array<string | {type: string; required?: boolean; description?: string}>\n hardwareRequirements?: Array<{type: string; level: string; description?: string}>\n type?: string\n actions?: Array<{id?: unknown; description?: unknown; parameters?: unknown}>\n } | null\n\n const permissions = normalizeManifestPermissions(manifest?.permissions)\n const hardwareRequirements = buildHardwareRequirements(manifest?.hardwareRequirements, lmaInfo.packageName)\n const appType = normalizeManifestType(manifest?.type)\n\n // Declared actions (for session.miniapps.list + invoke gating).\n const actions = normalizeManifestActions(manifest?.actions)\n\n // Dev miniapps live in the same lmas/ tree as installed ones, but\n // their version directory name starts with \"dev-\".\n const isMiniappDev = versionString.startsWith(\"dev-\")\n let devUrl: string | undefined\n if (isMiniappDev) {\n const devUrlRes = storage.load<string>(`${lmaInfo.packageName}_dev_url`)\n if (devUrlRes.is_ok()) devUrl = devUrlRes.value\n }\n\n out.push({\n packageName: lmaInfo.packageName,\n version: versionString,\n running: miniappRunningRegistry.has(lmaInfo.packageName),\n local: true,\n healthy: true,\n loading: false,\n offline: false,\n hidden: false,\n offlineRoute: \"\",\n name: versionInfo.name,\n webviewUrl: \"\",\n logoUrl: versionInfo.logoUrl,\n type: appType,\n permissions,\n hardwareRequirements,\n // Always project actions (even []) so the invoke gate can enforce\n // declared-action membership unconditionally — an app with no declared\n // actions must reject every invoke, not bypass the check.\n actions,\n ...(isMiniappDev ? {isMiniappDev: true} : {}),\n ...(devUrl ? {devUrl} : {}),\n onStart: () => saveLocalAppRunningState(lmaInfo.packageName, true),\n onStop: () => saveLocalAppRunningState(lmaInfo.packageName, false),\n })\n }\n\n this.cachedApps = out\n this.refreshNeeded = false\n return this.mergeProjectedApps(this.cachedApps)\n } catch (error) {\n console.error(\"APP_REGISTRY: Error getting local applets\", error)\n return this.mergeProjectedApps(\n this.cachedApps.map((a) => ({\n ...a,\n running: miniappRunningRegistry.has(a.packageName),\n })),\n )\n }\n }\n\n /** Force the next getInstalledMiniapps() to re-derive from disk + records. */\n public markRefreshNeeded(): void {\n this.refreshNeeded = true\n this.notify()\n }\n\n /**\n * Project persisted dev-app metadata records into ClientApp tiles. Dev\n * miniapps aren't installed to disk (they load over HTTP), so they don't\n * appear in the `lmas/` scan — this surfaces them on the home screen so\n * they're re-launchable without re-scanning the QR.\n */\n private projectDevApps(): ClientApp[] {\n return getDevAppRecords().map((rec) => {\n const permissions = normalizeManifestPermissions(rec.permissions)\n const hardwareRequirements = buildHardwareRequirements(rec.hardwareRequirements, rec.packageName)\n return {\n packageName: rec.packageName,\n version: undefined,\n running: miniappRunningRegistry.has(rec.packageName),\n local: true,\n healthy: true,\n loading: false,\n offline: false,\n hidden: false,\n offlineRoute: \"\",\n name: rec.name,\n webviewUrl: \"\",\n logoUrl: rec.iconUrl,\n type: normalizeManifestType(rec.type),\n permissions,\n hardwareRequirements,\n actions: normalizeManifestActions(rec.actions),\n isMiniappDev: true,\n devUrl: rec.devUrl,\n devPort: rec.devPort,\n onStart: () => saveLocalAppRunningState(rec.packageName, true),\n onStop: () => saveLocalAppRunningState(rec.packageName, false),\n }\n })\n }\n\n private projectOfflineApps(): ClientApp[] {\n // Offline apps don't go through miniappRunningRegistry (that's for\n // MiniappHost-mounted webviews). Their running flag is persisted to\n // MMKV by saveLocalAppRunningState — read it back here so refreshes\n // don't blow away the active flag.\n return this.offlineApps.map((a) => {\n const running = getLocalAppRunningState(a.packageName)\n const screenshot = getLocalAppScreenshot(a.packageName)\n\n return {...a, running, screenshot}\n })\n }\n\n // Register an offline (locally-routed) app. Survives disk rebuilds.\n public installOfflineApp(app: ClientApp, opts?: {requiresLocalSttModel?: boolean}): void {\n if (opts?.requiresLocalSttModel) {\n this.sttModelRequired.add(app.packageName)\n }\n this.offlineApps.push({\n ...app,\n onStart: () => saveLocalAppRunningState(app.packageName, true),\n onStop: () => saveLocalAppRunningState(app.packageName, false),\n })\n this.refreshNeeded = true\n this.notify()\n }\n\n /**\n * Registered as needing the on-device STT model before it can start (the\n * host declares this per offline app; the apps store gates start() on it).\n */\n public requiresLocalSttModel(packageName: string): boolean {\n return this.sttModelRequired.has(packageName)\n }\n\n public getMiniappHtml(packageName: string, version: string): Result<string, Error> {\n return Res.try(() => {\n const lmaDir = new Directory(Paths.document, \"lmas\", packageName, version)\n const htmlFile = new File(lmaDir, \"index.html\")\n return htmlFile.textSync()\n })\n }\n}\n\n/**\n * Persist the running flag for a local miniapp (read on next cold boot so\n * autostart picks the right set of apps). Exported for hosts that want to\n * track running state independently.\n */\nexport function saveLocalAppRunningState(packageName: string, status: boolean): void {\n storage.save(`${packageName}_running`, status)\n}\n\nexport function getLocalAppRunningState(packageName: string): boolean {\n const res = storage.load<boolean>(`${packageName}_running`)\n if (res.is_ok()) return res.value\n return false\n}\n\nexport function getLocalAppScreenshot(packageName: string): string | undefined {\n const key = `${packageName}_screenshot`\n const res = storage.load<string>(key)\n if (res.is_error()) return undefined\n\n const uri = res.value\n if (uri.startsWith(\"file://\")) {\n try {\n if (!new File(uri).exists) {\n storage.remove(key)\n return undefined\n }\n } catch {\n storage.remove(key)\n return undefined\n }\n }\n\n return uri\n}\n\n/**\n * Persisted metadata for a dev miniapp's home tile.\n *\n * Dev miniapps load directly off the dev server over HTTP and are NOT\n * installed into `lmas/`, so the disk scan in `getInstalledMiniapps` can't\n * see them. We persist a tiny record at scan / dev-URL-entry time so the\n * tile survives across app launches and is re-launchable without re-scanning.\n * `permissions` / `hardwareRequirements` are snapshotted from the manifest so\n * the home-screen permission gate has data without a disk bundle.\n */\nexport interface DevAppRecord {\n packageName: string\n name: string\n iconUrl: string\n devUrl: string\n devPort?: number\n type?: AppletType\n permissions?: Array<string | {type: string; required?: boolean; description?: string}>\n hardwareRequirements?: Array<{type: string; level: string; description?: string}>\n /** Manifest-declared actions — so dev-sideloaded miniapps can be invoked too. */\n actions?: Array<{id?: unknown; description?: unknown; parameters?: unknown}>\n /**\n * The dev miniapp's real manifest package name. `packageName` is overwritten to\n * {@link DEV_APP_PACKAGE_NAME} so the launch chain routes consistently, so this field\n * preserves the original so install/uninstall of OTHER packages don't wipe the dev slot.\n */\n sourcePackageName?: string\n /**\n * Short-lived Core-verifiable proof emitted by `mentra dev`. This lets the\n * single `com.dev` slot request auto-auth for the real package without\n * letting arbitrary dev URLs claim any package name.\n */\n devAttestation?: string\n}\n\nconst DEV_APPS_INDEX_KEY = \"dev_apps_index\"\n\nfunction configuredDevHost(): string | undefined {\n // Explicit escape hatch first; otherwise the host-injected Metro host (the\n // address this dev bundle was served from — always current for the network\n // the phone is on). Deliberately NOT the EXPO_PUBLIC_CLOUD_* URLs: those are\n // cloud endpoints, a different machine entirely from the laptop running the\n // miniapp dev server, and rewriting a dev URL to a cloud host would break it.\n const explicit = process.env.EXPO_PUBLIC_LOCAL_MINIAPP_HOST\n if (explicit) {\n try {\n return new URL(explicit).hostname\n } catch {\n if (/^[\\w.-]+$/.test(explicit)) return explicit\n }\n }\n return getConfigValues().devServerHost?.()\n}\n\nfunction isPrivateLanHost(hostname: string): boolean {\n return (\n hostname === \"localhost\" ||\n hostname.startsWith(\"192.168.\") ||\n hostname.startsWith(\"10.\") ||\n /^172\\.(1[6-9]|2\\d|3[0-1])\\./.test(hostname)\n )\n}\n\nfunction rewriteStaleDevUrl(value: string): string {\n if (!__DEV__) return value\n const host = configuredDevHost()\n if (!host) return value\n\n try {\n const url = new URL(value)\n if (url.hostname === host || !isPrivateLanHost(url.hostname)) return value\n url.hostname = host\n return url.toString().replace(/\\/$/, \"\")\n } catch {\n return value\n }\n}\n\nfunction normalizeDevAppRecord(record: DevAppRecord): DevAppRecord {\n const devUrl = rewriteStaleDevUrl(record.devUrl)\n const iconUrl = rewriteStaleDevUrl(record.iconUrl)\n return devUrl === record.devUrl && iconUrl === record.iconUrl ? record : {...record, devUrl, iconUrl}\n}\n\n/**\n * The one and only package name a dev miniapp is registered under.\n *\n * There is a SINGLE dev slot: scanning a new QR (or entering a new dev URL)\n * replaces the previous dev app rather than adding a second tile. Because the\n * whole launch chain — JSContext registration, UI-router binding,\n * setForeground, dev_url/dev_port storage keys, respawn-bg lookup — keys on\n * this package name, every consumer MUST use `DEV_APP_PACKAGE_NAME` (not the\n * manifest's real packageName) so messages route consistently. Mixing the two\n * was the cause of the \"CONNECT_ACK timeout\" — the tile said `com.dev` while\n * the dev URL/port and foreground target used the manifest name.\n */\nexport const DEV_APP_PACKAGE_NAME = \"com.dev\"\nexport const DEV_APP_NAME = \"Dev\"\n\n/**\n * Register (or replace) THE dev miniapp. Persists the home-tile metadata AND\n * the dev_url/dev_port keyed on {@link DEV_APP_PACKAGE_NAME}, so this function\n * is the single source of truth for the dev slot — callers must not write the\n * `*_dev_url` / `*_dev_port` keys under the manifest's real package name.\n *\n * Callers pass the manifest's REAL packageName/name. Only the packageName is\n * forced to {@link DEV_APP_PACKAGE_NAME} so the home tile and launch chain key\n * on the single dev slot (the real package survives in `sourcePackageName` for\n * clearDevArtifacts). The name + icon are kept as-is so the home tile reflects\n * the actual dev miniapp — marked as dev by the {@link DevMiniappBadge} dot\n * rather than renamed to a generic \"Dev\" tile.\n */\nexport function registerDevApp(record: DevAppRecord): void {\n const devRecord: DevAppRecord = {\n ...record,\n // Preserve the real manifest package before overwriting packageName with the\n // single dev-slot name, so clearDevArtifacts can tell whether an install/uninstall\n // actually targets the dev slot.\n sourcePackageName: record.sourcePackageName ?? record.packageName,\n packageName: DEV_APP_PACKAGE_NAME,\n // Keep the manifest's real name + icon (display-only; routing keys on\n // packageName). Fall back to DEV_APP_NAME only if a caller omitted the name.\n name: record.name || DEV_APP_NAME,\n iconUrl: record.iconUrl,\n }\n storage.save(`${DEV_APP_PACKAGE_NAME}_dev_meta`, JSON.stringify(devRecord))\n // The launch chain (LocalMiniappView.resolveDevPort, mentraJsBootstrap\n // respawn-bg) reads these keys under DEV_APP_PACKAGE_NAME — persist them\n // here so callers can't key them on the wrong (real) package name.\n storage.save(`${DEV_APP_PACKAGE_NAME}_dev_url`, record.devUrl)\n if (typeof record.devPort === \"number\" && Number.isFinite(record.devPort)) {\n storage.save(`${DEV_APP_PACKAGE_NAME}_dev_port`, record.devPort)\n } else {\n storage.remove(`${DEV_APP_PACKAGE_NAME}_dev_port`)\n }\n const idx = getDevAppIndex()\n if (!idx.includes(DEV_APP_PACKAGE_NAME)) {\n idx.push(DEV_APP_PACKAGE_NAME)\n storage.save(DEV_APPS_INDEX_KEY, JSON.stringify(idx))\n }\n appRegistry.markRefreshNeeded()\n}\n\n/** Drop the dev miniapp's home-tile metadata + dev URL/port keys. */\nexport function unregisterDevApp(): void {\n storage.remove(`${DEV_APP_PACKAGE_NAME}_dev_meta`)\n storage.remove(`${DEV_APP_PACKAGE_NAME}_dev_url`)\n storage.remove(`${DEV_APP_PACKAGE_NAME}_dev_port`)\n storage.remove(`${DEV_APP_PACKAGE_NAME}_dev_last_reachable`)\n const idx = getDevAppIndex().filter((p) => p !== DEV_APP_PACKAGE_NAME)\n storage.save(DEV_APPS_INDEX_KEY, JSON.stringify(idx))\n appRegistry.markRefreshNeeded()\n}\n\nfunction getDevAppIndex(): string[] {\n const res = storage.load<string>(DEV_APPS_INDEX_KEY)\n if (!res.is_ok()) return []\n try {\n const parsed = JSON.parse(res.value)\n return Array.isArray(parsed) ? (parsed as string[]) : []\n } catch {\n return []\n }\n}\n\n/**\n * The real manifest package name currently occupying the dev slot, or null if no dev app is\n * registered. Used to decide whether clearing a package's artifacts should also drop the dev slot.\n */\nexport function getDevAppSourcePackage(): string | null {\n const res = storage.load<string>(`${DEV_APP_PACKAGE_NAME}_dev_meta`)\n if (!res.is_ok()) return null\n try {\n const rec = JSON.parse(res.value) as DevAppRecord\n return rec.sourcePackageName ?? null\n } catch {\n return null\n }\n}\n\nexport function getDevAppAttestation(): string | null {\n const res = storage.load<string>(`${DEV_APP_PACKAGE_NAME}_dev_meta`)\n if (!res.is_ok()) return null\n try {\n const rec = JSON.parse(res.value) as DevAppRecord\n return rec.devAttestation ?? null\n } catch {\n return null\n }\n}\n\nexport function getDevAppRecords(): DevAppRecord[] {\n const out: DevAppRecord[] = []\n for (const pkg of getDevAppIndex()) {\n const res = storage.load<string>(`${pkg}_dev_meta`)\n if (!res.is_ok()) continue\n try {\n const record = JSON.parse(res.value) as DevAppRecord\n const normalized = normalizeDevAppRecord(record)\n if (normalized !== record) {\n storage.save(`${pkg}_dev_meta`, JSON.stringify(normalized))\n storage.save(`${pkg}_dev_url`, normalized.devUrl)\n }\n out.push(normalized)\n } catch {\n /* corrupt record — skip */\n }\n }\n return out\n}\n\nconst appRegistry = AppRegistry.getInstance()\nexport default appRegistry\n"]}
1
+ {"version":3,"file":"AppRegistry.js","sourceRoot":"","sources":["../../src/services/AppRegistry.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * AppRegistry — on-disk install/uninstall registry for local miniapps.\n *\n * Owns the `Documents/lmas/<packageName>/<version>/` filesystem layout, the\n * download/unzip pipeline, and the active-version pointer in MMKV. It does\n * NOT touch the apps store directly — instead it notifies subscribers when\n * the install set changes, so the host (mobile manager, OEM app) can refresh\n * its own state.\n *\n * Public surface:\n * - installFromUrl(url, opts?) install/replace a miniapp from a URL\n * - installFromLocalZip(path, opts?) install/replace from a local zip\n * - uninstall(packageName, version?) remove one or all versions\n * - getInstalledMiniapps() ClientApp[] derived from disk\n * - getActiveVersion(packageName) active version string for a package\n * - getBundleDir / getMiniappManifest filesystem helpers used by hosts\n * - subscribe(fn) register a refresh listener\n */\n\nimport {Directory, Paths, File} from \"expo-file-system\"\nimport {unzip} from \"react-native-zip-archive\"\nimport semver from \"semver\"\nimport {AsyncResult, Result, result as Res} from \"typesafe-ts\"\n\nimport type {AppletPermission, AppPermissionType, AppletType, ClientApp} from \"../types/applet\"\nimport {HardwareRequirement, HardwareRequirementLevel, HardwareType} from \"../types\"\nimport {configuredDevHost} from \"../utils/configuredDevHost\"\nimport {storage} from \"../utils/storage/storage\"\nimport {printDirectory} from \"../utils/storage/zip\"\nimport {checkManifestVersions} from \"./manifestVersionGate\"\nimport {normalizeManifestActions} from \"./manifestActions\"\nimport {miniappRunningRegistry} from \"./MiniappRunningRegistry\"\n\nexport {normalizeManifestActions} from \"./manifestActions\"\n\nconst ALLOWED_PERMISSION_TYPES: ReadonlySet<AppPermissionType> = new Set<AppPermissionType>([\n \"MICROPHONE\",\n \"CAMERA\",\n \"CALENDAR\",\n \"LOCATION\",\n \"BACKGROUND_LOCATION\",\n \"READ_NOTIFICATIONS\",\n \"POST_NOTIFICATIONS\",\n])\n\n/**\n * Normalize the `permissions` field from a miniapp.json manifest.\n *\n * New miniapps ship `[{type, required?, description?}]` objects. A few older\n * installed bundles may have `[\"MICROPHONE\", ...]` plain strings. Accept both.\n */\nexport function normalizeManifestPermissions(\n raw: Array<string | {type: string; required?: boolean; description?: string}> | undefined,\n): AppletPermission[] {\n if (!Array.isArray(raw)) return []\n const out: AppletPermission[] = []\n for (const p of raw) {\n if (typeof p === \"string\") {\n if (ALLOWED_PERMISSION_TYPES.has(p as AppPermissionType)) {\n out.push({type: p as AppPermissionType, required: true})\n }\n } else if (p && typeof p === \"object\" && typeof p.type === \"string\") {\n if (ALLOWED_PERMISSION_TYPES.has(p.type as AppPermissionType)) {\n out.push({\n type: p.type as AppPermissionType,\n ...(typeof p.required === \"boolean\" ? {required: p.required} : {}),\n ...(typeof p.description === \"string\" ? {description: p.description} : {}),\n })\n }\n }\n }\n return out\n}\n\nfunction normalizeManifestType(raw: unknown): AppletType {\n return raw === \"background\" || raw === \"system_dashboard\" || raw === \"standard\" ? raw : \"standard\"\n}\n\n/**\n * Convert declared hardwareRequirements from a miniapp.json manifest into\n * runtime `HardwareRequirement[]`, always appending `{EXIST, REQUIRED}` so\n * launchers show \"Glasses Required\" when no glasses are connected.\n *\n * Malformed entries are dropped with a single warning per package so the\n * rest of the manifest still works.\n */\nexport function buildHardwareRequirements(\n raw: Array<{type: string; level: string; description?: string}> | undefined,\n packageName: string,\n): HardwareRequirement[] {\n const out: HardwareRequirement[] = []\n const validTypes = new Set(Object.values(HardwareType) as string[])\n const validLevels = new Set(Object.values(HardwareRequirementLevel) as string[])\n\n if (!Array.isArray(raw)) {\n if (raw !== undefined) {\n console.warn(`APP_REGISTRY: ${packageName} has invalid hardwareRequirements (not an array); treating as []`)\n }\n } else {\n let warned = false\n for (const r of raw) {\n if (\n !r ||\n typeof r !== \"object\" ||\n typeof r.type !== \"string\" ||\n typeof r.level !== \"string\" ||\n !validTypes.has(r.type) ||\n !validLevels.has(r.level)\n ) {\n if (!warned) {\n console.warn(\n `APP_REGISTRY: ${packageName} has malformed hardwareRequirements entry; skipping invalid entries`,\n r,\n )\n warned = true\n }\n continue\n }\n out.push({\n type: r.type as HardwareType,\n level: r.level as HardwareRequirementLevel,\n ...(typeof r.description === \"string\" ? {description: r.description} : {}),\n })\n }\n }\n\n // Always require glasses to be connected for any local miniapp.\n out.push({type: HardwareType.EXIST, level: HardwareRequirementLevel.REQUIRED})\n return out\n}\n\ninterface InstalledInfo {\n name: string\n logoUrl: string\n}\n\ninterface InstalledLma {\n packageName: string\n versions: Record<string, InstalledInfo>\n}\n\nexport interface MiniappReleaseIdentity {\n source: \"direct_download\" | \"bundled_asset\" | \"preinstalled_registry\" | \"dev_snapshot\"\n releaseId?: string\n bundleSha256?: string\n channel?: string\n}\n\nfunction releaseIdentityKey(packageName: string, version: string): string {\n return `miniapp_release_identity:${packageName}:${version}`\n}\n\n/**\n * Download a miniapp zip from `url` into the cache and return its local path.\n *\n * `File.downloadFileAsync` is HTTP(S)-only, so this path is for remote bundles\n * (dev server, store). Bundled-asset installs already have a local zip and\n * should call {@link unpackMiniApp} directly.\n */\nasync function downloadMiniAppZip(url: string): Promise<string> {\n const downloadDir = new Directory(Paths.cache, \"lma_downloads\")\n try {\n if (!downloadDir.exists) {\n downloadDir.create()\n }\n } catch (error) {\n console.error(\"ZIP: Error creating download directory\", error)\n throw \"CREATE_DOWNLOAD_DIR_FAILED\"\n }\n\n // Pre-delete any cached file with the same name. Both `mentra-miniapp dev`\n // and `mentra-miniapp release` serve their zip at /bundle.zip, so URLs\n // collide on the cache filename. Without this delete, a stale dev-snapshot\n // (containing the project source tree) gets unzipped instead of the\n // release build → white screen because index.html points at TSX files.\n const targetFileName = url.split(\"/\").pop() ?? \"bundle.zip\"\n const existingFile = new File(downloadDir, targetFileName)\n if (existingFile.exists) {\n try {\n existingFile.delete()\n } catch (e) {\n console.warn(\"ZIP: failed to delete stale cached download:\", e)\n }\n }\n\n try {\n const output = await File.downloadFileAsync(url, downloadDir)\n return output.uri\n } catch (error) {\n console.error(\"ZIP: Error downloading zip file\", error)\n throw \"DOWNLOAD_FAILED\"\n }\n}\n\n/**\n * Unpack a local miniapp zip and install it under\n * `lmas/<packageName>/<version>/`.\n *\n * Zip layout: flat — files at root, `miniapp.json` at the top level. We're\n * strict on shape so we fail loudly on malformed bundles.\n *\n * @param zipPath file:// URI of the zip on local disk.\n * @param versionOverride override the manifest's version field. Used by the\n * dev miniapp caching path which stamps `dev-<ms>`\n * so multiple snapshots can coexist alongside\n * semver-installed versions.\n */\nasync function unpackMiniApp(\n zipPath: string,\n versionOverride?: string,\n): Promise<{packageName: string; version: string}> {\n const unzipDir = new Directory(Paths.cache, \"lma_unzip\")\n try {\n if (unzipDir.exists) unzipDir.delete()\n unzipDir.create()\n } catch (error) {\n console.error(\"ZIP: Error creating or deleting the unzip directory\", error)\n throw \"CREATE_CACHE_DIR_FAILED\"\n }\n\n try {\n console.log(\"ZIP: unzipping\", zipPath)\n await unzip(zipPath, unzipDir.uri)\n } catch (error) {\n console.error(\"Error unzipping zip file\", error)\n throw \"UNZIP_FAILED\"\n }\n\n // Strict zip shape: miniapp.json at unzip root. No tolerance for an\n // enclosing folder or app.json fallback — we own the dev-server emit\n // format, so any deviation indicates a corrupt bundle.\n const appDir = unzipDir\n let packageName: string\n let manifestVersion: string\n try {\n const miniappJsonFile = new File(appDir, \"miniapp.json\")\n if (!miniappJsonFile.exists) throw new Error(\"miniapp.json missing at zip root\")\n const manifest = JSON.parse(miniappJsonFile.textSync())\n if (!manifest.packageName) throw new Error(\"miniapp.json missing packageName\")\n if (!manifest.version) throw new Error(\"miniapp.json missing version\")\n packageName = manifest.packageName\n manifestVersion = manifest.version\n } catch (error) {\n console.error(\"Error reading miniapp.json from zip:\", error)\n throw \"READ_MANIFEST_FAILED\"\n }\n const version = versionOverride ?? manifestVersion\n console.log(`ZIP: installing ${packageName} as version ${version}`)\n\n const basePackageDir = new Directory(Paths.document, \"lmas\", packageName)\n try {\n if (!basePackageDir.exists) {\n basePackageDir.create({intermediates: true})\n }\n } catch (error) {\n console.error(\"Error creating the base package directory\", error)\n throw \"CREATE_PACKAGE_DIR_FAILED\"\n }\n\n const versionDir = new Directory(basePackageDir, version)\n try {\n if (!versionDir.exists) {\n versionDir.create()\n } else {\n versionDir.delete()\n versionDir.create()\n }\n } catch (error) {\n console.error(\"Error creating the version directory\", error)\n throw \"CREATE_VERSION_DIR_FAILED\"\n }\n\n try {\n const contents = appDir.list()\n for (const item of contents) {\n item.move(versionDir)\n }\n } catch (error) {\n console.error(\"Error moving the contents of the folder to the destination directory\", error)\n throw \"INSTALL_CONTENTS_FAILED\"\n }\n\n console.log(\"ZIP: local mini app installed at\", versionDir.uri)\n printDirectory(versionDir, 2)\n return {packageName, version}\n}\n\n/**\n * Download a miniapp zip from `url`, unpack it, and install it under\n * `lmas/<packageName>/<version>/`. Thin composition of\n * {@link downloadMiniAppZip} + {@link unpackMiniApp} for remote bundles.\n *\n * @param versionOverride override the manifest's version field. Used by the\n * dev miniapp caching path which stamps `dev-<ms>`\n * so multiple snapshots can coexist alongside\n * semver-installed versions.\n */\nasync function downloadAndInstallMiniApp(\n url: string,\n versionOverride?: string,\n): Promise<{packageName: string; version: string}> {\n const downloadedZipPath = await downloadMiniAppZip(url)\n console.log(\"ZIP: done downloading, starting unzip\")\n return unpackMiniApp(downloadedZipPath, versionOverride)\n}\n\ntype Listener = () => void\n\nclass AppRegistry {\n private cachedApps: ClientApp[] = []\n // Offline apps live in a separate layer so they survive the disk-rebuild\n // path in getInstalledMiniapps (which reassigns cachedApps).\n private offlineApps: ClientApp[] = []\n /** Package names whose start() requires the on-device STT model (host-declared). */\n private sttModelRequired = new Set<string>()\n private refreshNeeded: boolean = true\n private listeners = new Set<Listener>()\n\n private static instance: AppRegistry | null = null\n\n private constructor() {}\n\n public static getInstance(): AppRegistry {\n if (!AppRegistry.instance) {\n AppRegistry.instance = new AppRegistry()\n }\n return AppRegistry.instance\n }\n\n /** Subscribe to install/uninstall events. Listener fires after refreshNeeded flips. */\n public subscribe(fn: Listener): () => void {\n this.listeners.add(fn)\n return () => {\n this.listeners.delete(fn)\n }\n }\n\n private notify(): void {\n for (const fn of this.listeners) {\n try {\n fn()\n } catch (e) {\n console.warn(\"AppRegistry: listener threw\", e)\n }\n }\n }\n\n /**\n * On-disk path for a given miniapp bundle version.\n */\n public getBundleDir(packageName: string, version: string): string {\n const bundleDir = new Directory(Paths.document, \"lmas\", packageName, version)\n return bundleDir.uri\n }\n\n /**\n * Resolve the two-layer entry paths for an installed miniapp version.\n * Returns absolute file:// URIs for `background` and (when present) `ui`.\n *\n * Legacy single-layer bundles (no `entry` object in manifest) fall back\n * to `index.html` discovery so the WebView host keeps working unchanged.\n * Two-layer bundles ship `entry.background` and optional `entry.ui`\n * paths relative to the bundle root.\n *\n * Returns null if neither shape resolves to existing files on disk.\n */\n public getMiniappEntryPaths(\n packageName: string,\n version: string,\n ): {background: string | null; ui: string | null} | null {\n const manifest = this.getMiniappManifest(packageName, version) as {\n entry?: {background?: string; ui?: string}\n } | null\n const bundleDir = this.getBundleDir(packageName, version)\n const resolve = (rel: string): string | null => {\n const trimmed = rel.replace(/^\\.?\\/+/, \"\")\n const file = new File(bundleDir, trimmed)\n return file.exists ? file.uri : null\n }\n if (manifest?.entry) {\n console.log(\"manifest.entry\", manifest.entry)\n const bg = manifest.entry.background ? resolve(manifest.entry.background) : null\n console.log(\"bg\", bg)\n const ui = manifest.entry.ui ? resolve(manifest.entry.ui) : null\n console.log(\"ui\", ui)\n if (bg || ui) {\n return {background: bg, ui: ui}\n }\n }\n // Legacy single-bundle fallback — `index.html` at the bundle root.\n const legacy = new File(new Directory(bundleDir.replace(/^file:\\/\\//, \"\")), \"index.html\")\n return {\n background: null,\n ui: legacy.exists ? legacy.uri : null,\n }\n }\n\n /**\n * Verify a manifest declares an SDK / host version range compatible\n * with the current host. Delegates to the pure\n * {@link checkManifestVersions} helper — same shape, no React Native\n * imports, unit-testable. Manifests missing either field pass\n * through unchanged (legacy single-layer path).\n */\n public checkManifestVersions(\n manifest: {sdkVersion?: string; minHostVersion?: string} | null,\n options: {hostVersion: string; supportedSdkRange: string},\n ): {ok: true} | {ok: false; reason: string} {\n return checkManifestVersions(manifest, options)\n }\n\n /**\n * Read and parse the miniapp manifest (miniapp.json with app.json fallback)\n * from a given bundle directory.\n */\n public getMiniappManifest(packageName: string, version: string): any {\n const bundleDir = new Directory(Paths.document, \"lmas\", packageName, version)\n try {\n const miniappJsonFile = new File(bundleDir, \"miniapp.json\")\n if (miniappJsonFile.exists) {\n return JSON.parse(miniappJsonFile.textSync())\n }\n } catch (e) {\n console.warn(\"AppRegistry: Error reading miniapp.json, trying app.json fallback\", e)\n }\n try {\n const appJsonFile = new File(bundleDir, \"app.json\")\n if (appJsonFile.exists) {\n return JSON.parse(appJsonFile.textSync())\n }\n } catch (e) {\n console.warn(\"AppRegistry: Error reading app.json fallback\", e)\n }\n return null\n }\n\n /**\n * Download and install a miniapp bundle from a URL. The URL must serve a\n * zip whose root contains `miniapp.json` plus the bundle entry files.\n *\n * @param opts.versionOverride if set, install under this version instead\n * of `manifest.version`. The dev caching path uses `dev-<ms>` so multiple\n * snapshots can coexist alongside semver-installed versions.\n */\n public installFromUrl(\n url: string,\n opts?: {versionOverride?: string; releaseIdentity?: MiniappReleaseIdentity},\n ): AsyncResult<void, Error> {\n return Res.try_async(async () => {\n const {packageName, version} = await downloadAndInstallMiniApp(url, opts?.versionOverride)\n console.log(\"APP_REGISTRY: Downloaded and installed mini app\")\n this.finalizeInstall(\n packageName,\n version,\n opts?.releaseIdentity ?? {source: version.startsWith(\"dev-\") ? \"dev_snapshot\" : \"direct_download\"},\n )\n })\n }\n\n /**\n * Install a miniapp from a zip already on local disk (e.g. a bundled asset\n * copied into cache). Skips the HTTP download path that `installFromUrl`\n * uses — `File.downloadFileAsync` is HTTP(S)-only and rejects file:// URIs.\n *\n * @param zipPath file:// URI of the local zip.\n */\n public installFromLocalZip(\n zipPath: string,\n opts?: {versionOverride?: string; releaseIdentity?: MiniappReleaseIdentity},\n ): AsyncResult<{packageName: string; version: string}, Error> {\n return Res.try_async(async () => {\n const {packageName, version} = await unpackMiniApp(zipPath, opts?.versionOverride)\n console.log(\"APP_REGISTRY: Installed mini app from local zip\")\n this.finalizeInstall(packageName, version, opts?.releaseIdentity ?? {source: \"bundled_asset\"})\n return {packageName, version}\n })\n }\n\n /**\n * Post-install bookkeeping shared by every install path: clear stale dev\n * artifacts on release installs, point the active-version at the just-\n * installed bundle, and notify subscribers to refresh.\n */\n private finalizeInstall(packageName: string, version: string, releaseIdentity: MiniappReleaseIdentity): void {\n // If this is a release install (semver, not dev-*) of a package that\n // currently has dev-* snapshots, clear the dev state so the swap to\n // \"released\" is clean. Otherwise the dev version would keep winning\n // getActiveVersion's dev-precedence rule and the just-installed\n // release wouldn't run.\n const isDevInstall = version.startsWith(\"dev-\")\n if (!isDevInstall) {\n this.clearDevArtifacts(packageName)\n }\n\n this.setActiveVersion(packageName, version)\n storage.save(releaseIdentityKey(packageName, version), releaseIdentity)\n this.refreshNeeded = true\n this.notify()\n }\n\n public getReleaseIdentity(packageName: string, version: string): MiniappReleaseIdentity | null {\n const result = storage.load<MiniappReleaseIdentity>(releaseIdentityKey(packageName, version))\n return result.is_ok() ? result.value : null\n }\n\n public installFromJsonUrl(baseUrl: string): AsyncResult<{packageName: string; version: string; name: string}, Error> {\n return Res.try_async(async () => {\n const trimmed = baseUrl.replace(/\\/$/, \"\")\n\n const manifestRes = await fetch(`${trimmed}/miniapp.json`)\n if (!manifestRes.ok) {\n throw new Error(`Failed to fetch miniapp.json: ${manifestRes.status}`)\n }\n const manifest = (await manifestRes.json()) as Record<string, unknown>\n const packageName = manifest.packageName as string | undefined\n const version = manifest.version as string | undefined\n const name = (manifest.name as string | undefined) ?? packageName ?? \"Mini app\"\n if (!packageName) throw new Error(\"miniapp.json missing packageName\")\n if (!version) throw new Error(\"miniapp.json missing version\")\n\n const installRes = await appRegistry.installFromUrl(`${trimmed}/bundle.zip`)\n if (installRes.is_error()) throw installRes.error\n\n return {packageName, version, name}\n })\n }\n\n /**\n * Drop every dev-* version directory for a package plus ALL dev MMKV keys\n * (URL/port/reachability + the home-tile metadata record). Called on a\n * release install (dev → released transition) and on uninstall, so a dev\n * package leaves nothing behind that `projectDevApps` could re-surface.\n */\n private clearDevArtifacts(packageName: string): void {\n try {\n const pkgDir = new Directory(Paths.document, \"lmas\", packageName)\n if (pkgDir.exists) {\n for (const item of pkgDir.list()) {\n if (item instanceof Directory && item.name.startsWith(\"dev-\")) {\n try {\n storage.remove(releaseIdentityKey(packageName, item.name))\n item.delete()\n } catch (e) {\n console.warn(`APP_REGISTRY: failed to delete ${item.name}:`, e)\n }\n }\n }\n }\n } catch (e) {\n console.warn(`APP_REGISTRY: clearDevArtifacts dir scan failed for ${packageName}:`, e)\n }\n storage.remove(`${packageName}_dev_url`)\n storage.remove(`${packageName}_dev_port`)\n storage.remove(`${packageName}_dev_mdns`)\n storage.remove(`${packageName}_dev_last_reachable`)\n // HTTP-direct dev miniapps are indexed by their real package name. A\n // release install/uninstall of that same package should remove only its\n // dev tile; unrelated dev miniapps must remain available.\n if (readDevAppRecord(packageName)) unregisterDevApp(packageName)\n }\n\n /**\n * Garbage-collect older `dev-*` version directories for this package,\n * keeping the latest `keep` (by lexicographic sort, which matches\n * timestamp ordering since dev-<ms> is zero-padded).\n *\n * Only touches `dev-*` versions; semver-installed versions are left alone.\n */\n public gcDevVersions(packageName: string, keep: number): void {\n try {\n const pkgDir = new Directory(Paths.document, \"lmas\", packageName)\n if (!pkgDir.exists) return\n const dirs = pkgDir\n .list()\n .filter((d): d is Directory => d instanceof Directory && d.name.startsWith(\"dev-\"))\n .sort((a, b) => (a.name < b.name ? 1 : -1))\n for (let i = keep; i < dirs.length; i++) {\n try {\n dirs[i].delete()\n } catch (e) {\n console.warn(`APP_REGISTRY: failed to delete ${dirs[i].name}:`, e)\n }\n }\n if (dirs.length > keep) this.refreshNeeded = true\n } catch (e) {\n console.warn(`APP_REGISTRY: gcDevVersions error for ${packageName}:`, e)\n }\n }\n\n public uninstall(packageName: string, version?: string): AsyncResult<void, Error> {\n return Res.try_async(async () => {\n if (version) {\n const lmaDir = new Directory(Paths.document, \"lmas\", packageName, version)\n // Guard exists: a dev miniapp loads over HTTP and has no on-disk dir,\n // so an unconditional delete() would throw and abort the cleanup below.\n if (lmaDir.exists) lmaDir.delete()\n storage.remove(releaseIdentityKey(packageName, version))\n console.log(\"APP_REGISTRY: Uninstalled mini app version\", version)\n const packageDir = new Directory(Paths.document, \"lmas\", packageName)\n if (packageDir.exists && packageDir.list().length === 0) {\n packageDir.delete()\n }\n } else {\n for (const installedVersion of this.getInstalledVersions(packageName)) {\n storage.remove(releaseIdentityKey(packageName, installedVersion))\n }\n const packageDir = new Directory(Paths.document, \"lmas\", packageName)\n if (packageDir.exists) {\n packageDir.delete()\n }\n console.log(\"APP_REGISTRY: Uninstalled all versions of mini app\", packageName)\n }\n // Always clear dev artifacts: for HTTP-direct dev miniapps the tile is\n // backed by storage records (_dev_meta + dev_apps_index), not the disk\n // dir, so without this the projected tile reappears on the next refresh.\n this.clearDevArtifacts(packageName)\n this.refreshNeeded = true\n this.notify()\n })\n }\n\n public getPackageNames(): string[] {\n try {\n const lmasDir = new Directory(Paths.document, \"lmas\")\n if (!lmasDir.exists) return []\n let lmas = lmasDir.list()\n lmas = lmas.filter((lma): lma is Directory => lma instanceof Directory && lma.list().length > 0)\n return lmas.map((lma) => lma.name)\n } catch (error) {\n console.error(\"APP_REGISTRY: Error getting locally installed package names\", error)\n return []\n }\n }\n\n public getInstalledVersions(packageName: string): string[] {\n try {\n const lmaDir = new Directory(Paths.document, \"lmas\", packageName)\n // Not installed yet is an expected state (e.g. preinstall sync probing\n // versions before first install) — return [] without the error noise.\n if (!lmaDir.exists) {\n return []\n }\n const lma = lmaDir.list()\n return lma.map((lma) => lma.name)\n } catch (error) {\n console.error(\"APP_REGISTRY: Error getting local applet versions\", error)\n return []\n }\n }\n\n public async getActiveVersion(packageName: string): Promise<string> {\n let versions = this.getInstalledVersions(packageName)\n // Treat MMKV as a hint, not authority. A stored version may have been\n // GC'd off disk without this pointer being updated.\n let res = storage.load<string>(`${packageName}_active_version`)\n if (res.is_ok() && versions.includes(res.value)) {\n return res.value\n }\n // Dev versions take precedence over semver-installed versions.\n const devVersions = versions\n .filter((v) => v.startsWith(\"dev-\"))\n .sort()\n .reverse()\n if (devVersions.length > 0) {\n this.setActiveVersion(packageName, devVersions[0])\n return devVersions[0]\n }\n versions = versions.filter((v) => semver.valid(v))\n versions.sort((a, b) => semver.rcompare(a, b))\n this.setActiveVersion(packageName, versions[0])\n return versions[0]\n }\n\n public setActiveVersion(packageName: string, version: string): Result<void, Error> {\n return storage.save(`${packageName}_active_version`, version)\n }\n\n public getMetadata(packageName: string, version: string): InstalledInfo {\n try {\n const lmaDir = new Directory(Paths.document, \"lmas\", packageName, version)\n const miniappJsonFile = new File(lmaDir, \"miniapp.json\")\n const manifest = JSON.parse(miniappJsonFile.textSync())\n const logoUrl = new File(lmaDir, \"icon.png\").uri\n return {name: manifest.name, logoUrl: logoUrl}\n } catch (error) {\n console.error(\"APP_REGISTRY: Error getting local miniapp metadata\", error)\n return {name: \"error\", logoUrl: \"\"}\n }\n }\n\n public getInstalledInfo(): InstalledLma[] {\n const packageNames = this.getPackageNames()\n const out: InstalledLma[] = []\n for (const packageName of packageNames) {\n const versionStrings = this.getInstalledVersions(packageName)\n const installedVersion: InstalledLma = {packageName, versions: {}}\n for (const versionString of versionStrings) {\n installedVersion.versions[versionString] = this.getMetadata(packageName, versionString)\n }\n out.push(installedVersion)\n }\n return out\n }\n\n /**\n * Merge disk-derived apps with the projected dev + offline layers,\n * de-duping by packageName. An active dev registration wins over an older\n * disk install of the same package; installing a release clears that dev\n * registration in finalizeInstall. Native offline apps keep top priority.\n */\n private mergeProjectedApps(diskApps: ClientApp[]): ClientApp[] {\n const offline = this.projectOfflineApps()\n const offlinePackages = new Set(offline.map((app) => app.packageName))\n const dev = this.projectDevApps().filter((app) => !offlinePackages.has(app.packageName))\n const devPackages = new Set(dev.map((app) => app.packageName))\n const installed = diskApps.filter(\n (app) => !offlinePackages.has(app.packageName) && !devPackages.has(app.packageName),\n )\n return [...installed, ...dev, ...offline]\n }\n\n public async getInstalledMiniapps(): Promise<ClientApp[]> {\n if (!this.refreshNeeded && this.cachedApps.length > 0) {\n // Cache hit: re-project running from the registry. The cached array\n // IS the disk-derived truth; running comes from the mount registry.\n return this.mergeProjectedApps(\n this.cachedApps.map((a) => ({\n ...a,\n running: miniappRunningRegistry.has(a.packageName),\n })),\n )\n }\n\n try {\n const installedInfo = this.getInstalledInfo()\n const out: ClientApp[] = []\n for (const lmaInfo of installedInfo) {\n const versionString = await this.getActiveVersion(lmaInfo.packageName)\n const versionInfo = lmaInfo.versions[versionString]\n\n const manifest = this.getMiniappManifest(lmaInfo.packageName, versionString) as {\n permissions?: Array<string | {type: string; required?: boolean; description?: string}>\n hardwareRequirements?: Array<{type: string; level: string; description?: string}>\n type?: string\n actions?: Array<{id?: unknown; description?: unknown; parameters?: unknown; outputSchema?: unknown}>\n } | null\n\n const permissions = normalizeManifestPermissions(manifest?.permissions)\n const hardwareRequirements = buildHardwareRequirements(manifest?.hardwareRequirements, lmaInfo.packageName)\n const appType = normalizeManifestType(manifest?.type)\n\n // Declared actions (for session.miniapps.list + invoke gating).\n const actions = normalizeManifestActions(manifest?.actions)\n\n // Dev miniapps live in the same lmas/ tree as installed ones, but\n // their version directory name starts with \"dev-\".\n const isMiniappDev = versionString.startsWith(\"dev-\")\n let devUrl: string | undefined\n if (isMiniappDev) {\n const devUrlRes = storage.load<string>(`${lmaInfo.packageName}_dev_url`)\n if (devUrlRes.is_ok()) devUrl = devUrlRes.value\n }\n\n out.push({\n packageName: lmaInfo.packageName,\n version: versionString,\n running: miniappRunningRegistry.has(lmaInfo.packageName),\n local: true,\n healthy: true,\n loading: false,\n offline: false,\n hidden: false,\n offlineRoute: \"\",\n name: versionInfo.name,\n webviewUrl: \"\",\n logoUrl: versionInfo.logoUrl,\n type: appType,\n permissions,\n hardwareRequirements,\n // Always project actions (even []) so the invoke gate can enforce\n // declared-action membership unconditionally — an app with no declared\n // actions must reject every invoke, not bypass the check.\n actions,\n ...(isMiniappDev ? {isMiniappDev: true} : {}),\n ...(devUrl ? {devUrl} : {}),\n onStart: () => saveLocalAppRunningState(lmaInfo.packageName, true),\n onStop: () => saveLocalAppRunningState(lmaInfo.packageName, false),\n })\n }\n\n this.cachedApps = out\n this.refreshNeeded = false\n return this.mergeProjectedApps(this.cachedApps)\n } catch (error) {\n console.error(\"APP_REGISTRY: Error getting local applets\", error)\n return this.mergeProjectedApps(\n this.cachedApps.map((a) => ({\n ...a,\n running: miniappRunningRegistry.has(a.packageName),\n })),\n )\n }\n }\n\n /** Force the next getInstalledMiniapps() to re-derive from disk + records. */\n public markRefreshNeeded(): void {\n this.refreshNeeded = true\n this.notify()\n }\n\n /**\n * Project persisted dev-app metadata records into ClientApp tiles. Dev\n * miniapps aren't installed to disk (they load over HTTP), so they don't\n * appear in the `lmas/` scan — this surfaces them on the home screen so\n * they're re-launchable without re-scanning the QR.\n */\n private projectDevApps(): ClientApp[] {\n return getDevAppRecords().map((rec) => {\n const permissions = normalizeManifestPermissions(rec.permissions)\n const hardwareRequirements = buildHardwareRequirements(rec.hardwareRequirements, rec.packageName)\n return {\n packageName: rec.packageName,\n version: undefined,\n running: miniappRunningRegistry.has(rec.packageName),\n local: true,\n healthy: true,\n loading: false,\n offline: false,\n hidden: false,\n offlineRoute: \"\",\n name: rec.name,\n webviewUrl: \"\",\n logoUrl: rec.iconUrl,\n type: normalizeManifestType(rec.type),\n permissions,\n hardwareRequirements,\n actions: normalizeManifestActions(rec.actions),\n isMiniappDev: true,\n devUrl: rec.devUrl,\n devPort: rec.devPort,\n onStart: () => saveLocalAppRunningState(rec.packageName, true),\n onStop: () => saveLocalAppRunningState(rec.packageName, false),\n }\n })\n }\n\n private projectOfflineApps(): ClientApp[] {\n // Offline apps don't go through miniappRunningRegistry (that's for\n // MiniappHost-mounted webviews). Their running flag is persisted to\n // MMKV by saveLocalAppRunningState — read it back here so refreshes\n // don't blow away the active flag.\n return this.offlineApps.map((a) => {\n const running = getLocalAppRunningState(a.packageName)\n const screenshot = getLocalAppScreenshot(a.packageName)\n\n return {...a, running, screenshot}\n })\n }\n\n // Register an offline (locally-routed) app. Survives disk rebuilds.\n public installOfflineApp(app: ClientApp, opts?: {requiresLocalSttModel?: boolean}): void {\n if (opts?.requiresLocalSttModel) {\n this.sttModelRequired.add(app.packageName)\n }\n this.offlineApps.push({\n ...app,\n onStart: () => saveLocalAppRunningState(app.packageName, true),\n onStop: () => saveLocalAppRunningState(app.packageName, false),\n })\n this.refreshNeeded = true\n this.notify()\n }\n\n /**\n * Registered as needing the on-device STT model before it can start (the\n * host declares this per offline app; the apps store gates start() on it).\n */\n public requiresLocalSttModel(packageName: string): boolean {\n return this.sttModelRequired.has(packageName)\n }\n\n public getMiniappHtml(packageName: string, version: string): Result<string, Error> {\n return Res.try(() => {\n const lmaDir = new Directory(Paths.document, \"lmas\", packageName, version)\n const htmlFile = new File(lmaDir, \"index.html\")\n return htmlFile.textSync()\n })\n }\n}\n\n/**\n * Persist the running flag for a local miniapp (read on next cold boot so\n * autostart picks the right set of apps). Exported for hosts that want to\n * track running state independently.\n */\nexport function saveLocalAppRunningState(packageName: string, status: boolean): void {\n storage.save(`${packageName}_running`, status)\n}\n\nexport function getLocalAppRunningState(packageName: string): boolean {\n const res = storage.load<boolean>(`${packageName}_running`)\n if (res.is_ok()) return res.value\n return false\n}\n\nexport function getLocalAppScreenshot(packageName: string): string | undefined {\n const key = `${packageName}_screenshot`\n const res = storage.load<string>(key)\n if (res.is_error()) return undefined\n\n const uri = res.value\n if (uri.startsWith(\"file://\")) {\n try {\n if (!new File(uri).exists) {\n storage.remove(key)\n return undefined\n }\n } catch {\n storage.remove(key)\n return undefined\n }\n }\n\n return uri\n}\n\n/**\n * Persisted metadata for a dev miniapp's home tile.\n *\n * Dev miniapps load directly off the dev server over HTTP and are NOT\n * installed into `lmas/`, so the disk scan in `getInstalledMiniapps` can't\n * see them. We persist a tiny record at scan / dev-URL-entry time so the\n * tile survives across app launches and is re-launchable without re-scanning.\n * `permissions` / `hardwareRequirements` are snapshotted from the manifest so\n * the home-screen permission gate has data without a disk bundle.\n */\nexport interface DevAppRecord {\n packageName: string\n name: string\n iconUrl: string\n devUrl: string\n devPort?: number\n /**\n * Bonjour / mDNS hostname from the QR (`ComputerName.local`). Used as a\n * failover host when the raw LAN IP in `devUrl` goes stale after a Wi-Fi\n * change — phones that resolve `.local` can relaunch without re-scanning.\n */\n mdnsHost?: string\n type?: AppletType\n permissions?: Array<string | {type: string; required?: boolean; description?: string}>\n hardwareRequirements?: Array<{type: string; level: string; description?: string}>\n /** Manifest-declared actions — so dev-sideloaded miniapps can be invoked too. */\n actions?: Array<{id?: unknown; description?: unknown; parameters?: unknown; outputSchema?: unknown}>\n /** Legacy single-slot migration field. New records use the real packageName directly. */\n sourcePackageName?: string\n /**\n * Short-lived Core-verifiable proof emitted by `mentra dev`. This lets the\n * dev runtime request auto-auth for the manifest package without letting\n * arbitrary dev URLs claim any package name.\n */\n devAttestation?: string\n}\n\nconst DEV_APPS_INDEX_KEY = \"dev_apps_index\"\nconst DEV_APP_ICONS_DIR = \"dev-miniapp-icons\"\n\n\nfunction isPrivateLanHost(hostname: string): boolean {\n return (\n hostname === \"localhost\" ||\n hostname.startsWith(\"192.168.\") ||\n hostname.startsWith(\"10.\") ||\n /^172\\.(1[6-9]|2\\d|3[0-1])\\./.test(hostname)\n )\n}\n\nfunction rewriteStaleDevUrl(value: string): string {\n if (!__DEV__) return value\n const host = configuredDevHost()\n if (!host) return value\n\n try {\n const url = new URL(value)\n if (url.hostname === host || !isPrivateLanHost(url.hostname)) return value\n url.hostname = host\n return url.toString().replace(/\\/$/, \"\")\n } catch {\n return value\n }\n}\n\nfunction normalizeDevAppRecord(record: DevAppRecord): DevAppRecord {\n const devUrl = rewriteStaleDevUrl(record.devUrl)\n const iconUrl = rewriteStaleDevUrl(record.iconUrl)\n return devUrl === record.devUrl && iconUrl === record.iconUrl ? record : {...record, devUrl, iconUrl}\n}\n\n/** Legacy package used by builds that supported only one dev miniapp. */\nexport const DEV_APP_PACKAGE_NAME = \"com.dev\"\nexport const DEV_APP_NAME = \"Dev\"\n\n/**\n * Copy a dev-server icon into Documents so the tile remains branded after the\n * laptop/server disappears. A failed download is non-fatal: the remote URL is\n * retained and can still render while the server is reachable.\n */\nasync function cacheDevAppIcon(packageName: string, iconUrl: string): Promise<string> {\n if (!/^https?:\\/\\//.test(iconUrl)) return iconUrl\n\n try {\n const dir = new Directory(Paths.document, DEV_APP_ICONS_DIR)\n if (!dir.exists) dir.create({intermediates: true})\n\n const safePackageName = packageName.replace(/[^a-zA-Z0-9._-]/g, \"_\")\n let extension = \".png\"\n try {\n const match = new URL(iconUrl).pathname.match(/\\.(png|jpe?g|webp|gif|svg)$/i)\n if (match) extension = `.${match[1].toLowerCase()}`\n } catch {\n // Keep the decoder-friendly .png fallback; image loaders sniff content.\n }\n\n const target = new File(dir, `${safePackageName}${extension}`)\n const downloaded = await File.downloadFileAsync(iconUrl, target, {idempotent: true})\n\n // Only remove older extensions AFTER the replacement is safely on disk;\n // a broken icon URL must not destroy the last known-good cached logo.\n for (const item of dir.list()) {\n if (item instanceof File && item.uri !== downloaded.uri && item.name.startsWith(`${safePackageName}.`)) {\n try {\n item.delete()\n } catch {\n // Best effort; the current icon has already been persisted.\n }\n }\n }\n return downloaded.uri\n } catch (error) {\n console.warn(`APP_REGISTRY: failed to cache dev icon for ${packageName}:`, error)\n return readDevAppRecord(packageName)?.iconUrl ?? iconUrl\n }\n}\n\nfunction removeDevRecordKeys(packageName: string): void {\n const existing = readDevAppRecord(packageName)\n if (existing?.iconUrl.startsWith(\"file://\")) {\n try {\n const icon = new File(existing.iconUrl)\n if (icon.exists) icon.delete()\n } catch (error) {\n console.warn(`APP_REGISTRY: failed to delete dev icon for ${packageName}:`, error)\n }\n }\n storage.remove(`${packageName}_dev_meta`)\n storage.remove(`${packageName}_dev_url`)\n storage.remove(`${packageName}_dev_port`)\n storage.remove(`${packageName}_dev_mdns`)\n storage.remove(`${packageName}_dev_last_reachable`)\n}\n\nfunction readDevAppRecord(packageName: string): DevAppRecord | null {\n const res = storage.load<string>(`${packageName}_dev_meta`)\n if (!res.is_ok()) return null\n try {\n return JSON.parse(res.value) as DevAppRecord\n } catch {\n return null\n }\n}\n\n/** Move the historical `com.dev` record onto its real manifest package key. */\nfunction migrateLegacyDevSlot(): void {\n const legacy = readDevAppRecord(DEV_APP_PACKAGE_NAME)\n const targetPackage = legacy?.sourcePackageName?.trim()\n if (!legacy || !targetPackage || targetPackage === DEV_APP_PACKAGE_NAME) return\n\n const existingTarget = readDevAppRecord(targetPackage)\n const migrated: DevAppRecord = existingTarget ?? {\n ...legacy,\n packageName: targetPackage,\n sourcePackageName: targetPackage,\n }\n if (!existingTarget) storage.save(`${targetPackage}_dev_meta`, JSON.stringify(migrated))\n\n const legacyUrl = storage.load<string>(`${DEV_APP_PACKAGE_NAME}_dev_url`)\n const targetUrl = storage.load<string>(`${targetPackage}_dev_url`)\n if (!targetUrl.is_ok()) {\n storage.save(`${targetPackage}_dev_url`, legacyUrl.is_ok() ? legacyUrl.value : migrated.devUrl)\n }\n const legacyPort = storage.load<number>(`${DEV_APP_PACKAGE_NAME}_dev_port`)\n const targetPort = storage.load<number>(`${targetPackage}_dev_port`)\n if (!targetPort.is_ok()) {\n const port = migrated.devPort ?? (legacyPort.is_ok() ? legacyPort.value : undefined)\n if (typeof port === \"number\" && Number.isFinite(port)) storage.save(`${targetPackage}_dev_port`, port)\n }\n const legacyMdns = storage.load<string>(`${DEV_APP_PACKAGE_NAME}_dev_mdns`)\n const targetMdns = storage.load<string>(`${targetPackage}_dev_mdns`)\n if (!targetMdns.is_ok() && legacyMdns.is_ok() && legacyMdns.value.trim()) {\n storage.save(`${targetPackage}_dev_mdns`, legacyMdns.value.trim())\n }\n\n storage.remove(`${DEV_APP_PACKAGE_NAME}_dev_meta`)\n storage.remove(`${DEV_APP_PACKAGE_NAME}_dev_url`)\n storage.remove(`${DEV_APP_PACKAGE_NAME}_dev_port`)\n storage.remove(`${DEV_APP_PACKAGE_NAME}_dev_mdns`)\n storage.remove(`${DEV_APP_PACKAGE_NAME}_dev_last_reachable`)\n\n const index = Array.from(new Set(getDevAppIndex().map((pkg) => (pkg === DEV_APP_PACKAGE_NAME ? targetPackage : pkg))))\n storage.save(DEV_APPS_INDEX_KEY, JSON.stringify(index))\n}\n\nfunction readStoredMdnsHost(packageName: string): string | undefined {\n const res = storage.load<string>(`${packageName}_dev_mdns`)\n if (!res.is_ok()) return undefined\n return res.value.trim() || undefined\n}\n\n/**\n * Register or update one dev miniapp under its real manifest package. Different\n * package names coexist; rescanning the same package updates that package only.\n */\nexport async function registerDevApp(record: DevAppRecord): Promise<void> {\n migrateLegacyDevSlot()\n const packageName = record.packageName.trim()\n if (!packageName) throw new Error(\"Dev miniapp manifest is missing packageName\")\n\n const iconUrl = await cacheDevAppIcon(packageName, record.iconUrl)\n // Relaunch paths (developer-URL screen, loadDevMiniapp) omit mdnsHost, so an\n // omitted field keeps whatever the QR scan stored instead of wiping the\n // `.local` failover host.\n const mdnsHost =\n record.mdnsHost !== undefined ? record.mdnsHost.trim() || undefined : readStoredMdnsHost(packageName)\n const devRecord: DevAppRecord = {\n ...record,\n packageName,\n sourcePackageName: packageName,\n name: record.name || DEV_APP_NAME,\n iconUrl,\n mdnsHost,\n }\n storage.save(`${packageName}_dev_meta`, JSON.stringify(devRecord))\n storage.save(`${packageName}_dev_url`, record.devUrl)\n if (typeof record.devPort === \"number\" && Number.isFinite(record.devPort)) {\n storage.save(`${packageName}_dev_port`, record.devPort)\n } else {\n storage.remove(`${packageName}_dev_port`)\n }\n if (mdnsHost) {\n storage.save(`${packageName}_dev_mdns`, mdnsHost)\n } else {\n storage.remove(`${packageName}_dev_mdns`)\n }\n const idx = getDevAppIndex()\n if (!idx.includes(packageName)) {\n idx.push(packageName)\n storage.save(DEV_APPS_INDEX_KEY, JSON.stringify(idx))\n }\n appRegistry.markRefreshNeeded()\n}\n\n/** Drop one dev miniapp's metadata, routing keys, and cached icon. */\nexport function unregisterDevApp(packageName = DEV_APP_PACKAGE_NAME): void {\n removeDevRecordKeys(packageName)\n const idx = getDevAppIndex().filter((p) => p !== packageName)\n storage.save(DEV_APPS_INDEX_KEY, JSON.stringify(idx))\n appRegistry.markRefreshNeeded()\n}\n\nfunction getDevAppIndex(): string[] {\n const res = storage.load<string>(DEV_APPS_INDEX_KEY)\n if (!res.is_ok()) return []\n try {\n const parsed = JSON.parse(res.value)\n return Array.isArray(parsed) ? (parsed as string[]) : []\n } catch {\n return []\n }\n}\n\n/** Resolve the manifest package for a dev runtime (including the legacy slot). */\nexport function getDevAppSourcePackage(packageName = DEV_APP_PACKAGE_NAME): string | null {\n migrateLegacyDevSlot()\n const rec = readDevAppRecord(packageName)\n return rec?.sourcePackageName ?? rec?.packageName ?? null\n}\n\nexport function getDevAppAttestation(packageName = DEV_APP_PACKAGE_NAME): string | null {\n migrateLegacyDevSlot()\n return readDevAppRecord(packageName)?.devAttestation ?? null\n}\n\nexport function getDevAppRecords(): DevAppRecord[] {\n migrateLegacyDevSlot()\n const out: DevAppRecord[] = []\n for (const pkg of getDevAppIndex()) {\n const res = storage.load<string>(`${pkg}_dev_meta`)\n if (!res.is_ok()) continue\n try {\n const record = JSON.parse(res.value) as DevAppRecord\n const normalized = normalizeDevAppRecord(record)\n if (normalized !== record) {\n storage.save(`${pkg}_dev_meta`, JSON.stringify(normalized))\n storage.save(`${pkg}_dev_url`, normalized.devUrl)\n }\n out.push(normalized)\n } catch {\n /* corrupt record — skip */\n }\n }\n return out\n}\n\nconst appRegistry = AppRegistry.getInstance()\nexport default appRegistry\n"]}
@@ -1,3 +1,15 @@
1
+ /**
2
+ * Keep the glasses LC3 transport alive while dropping mic audio before cloud
3
+ * STT. Sources are reference-counted by id so overlapping playback cannot
4
+ * reopen the uplink until every active source has released.
5
+ *
6
+ * Suppression is global to the uplink: one source silences STT for every app.
7
+ * That is why no platform path arms it any more (spoken TTS used to, which made
8
+ * every assistant reply punch a hole in Live Translation and Captions). The
9
+ * mechanism stays because it is the right primitive for an explicit,
10
+ * caller-scoped mute; see OS-1741 for the per-app opt-in that will use it.
11
+ */
12
+ export declare function setAudioCloudUplinkSuppressed(sourceId: string, suppressed: boolean): void;
1
13
  export declare function startAudioCloudUplink(): void;
2
14
  export declare function stopAudioCloudUplink(): void;
3
15
  //# sourceMappingURL=AudioCloudUplink.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AudioCloudUplink.d.ts","sourceRoot":"","sources":["../../src/services/AudioCloudUplink.ts"],"names":[],"mappings":"AAqBA,wBAAgB,qBAAqB,IAAI,IAAI,CAO5C;AAED,wBAAgB,oBAAoB,IAAI,IAAI,CAG3C"}
1
+ {"version":3,"file":"AudioCloudUplink.d.ts","sourceRoot":"","sources":["../../src/services/AudioCloudUplink.ts"],"names":[],"mappings":"AAsBA;;;;;;;;;;GAUG;AACH,wBAAgB,6BAA6B,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,GAAG,IAAI,CAGzF;AAED,wBAAgB,qBAAqB,IAAI,IAAI,CAW5C;AAED,wBAAgB,oBAAoB,IAAI,IAAI,CAI3C"}
@@ -17,11 +17,31 @@
17
17
  import BluetoothSdk from "@mentra/bluetooth-sdk/internal";
18
18
  import { cloudClientService } from "./CloudClientService";
19
19
  let sub = null;
20
+ const suppressionSources = new Set();
21
+ /**
22
+ * Keep the glasses LC3 transport alive while dropping mic audio before cloud
23
+ * STT. Sources are reference-counted by id so overlapping playback cannot
24
+ * reopen the uplink until every active source has released.
25
+ *
26
+ * Suppression is global to the uplink: one source silences STT for every app.
27
+ * That is why no platform path arms it any more (spoken TTS used to, which made
28
+ * every assistant reply punch a hole in Live Translation and Captions). The
29
+ * mechanism stays because it is the right primitive for an explicit,
30
+ * caller-scoped mute; see OS-1741 for the per-app opt-in that will use it.
31
+ */
32
+ export function setAudioCloudUplinkSuppressed(sourceId, suppressed) {
33
+ if (suppressed)
34
+ suppressionSources.add(sourceId);
35
+ else
36
+ suppressionSources.delete(sourceId);
37
+ }
20
38
  export function startAudioCloudUplink() {
21
39
  if (sub)
22
40
  return;
23
41
  sub = BluetoothSdk.addListener("mic_lc3", (event) => {
24
- if (cloudClientService.isConnected() && cloudClientService.hasAudioSubscriptions()) {
42
+ if (suppressionSources.size === 0 &&
43
+ cloudClientService.isConnected() &&
44
+ cloudClientService.hasAudioSubscriptions()) {
25
45
  cloudClientService.sendAudioFrame(new Uint8Array(event.lc3));
26
46
  }
27
47
  });
@@ -29,5 +49,6 @@ export function startAudioCloudUplink() {
29
49
  export function stopAudioCloudUplink() {
30
50
  sub?.remove();
31
51
  sub = null;
52
+ suppressionSources.clear();
32
53
  }
33
54
  //# sourceMappingURL=AudioCloudUplink.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AudioCloudUplink.js","sourceRoot":"","sources":["../../src/services/AudioCloudUplink.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,YAAY,MAAM,gCAAgC,CAAA;AACzD,OAAO,EAAC,kBAAkB,EAAC,MAAM,sBAAsB,CAAA;AAEvD,IAAI,GAAG,GAAgC,IAAI,CAAA;AAE3C,MAAM,UAAU,qBAAqB;IACnC,IAAI,GAAG;QAAE,OAAM;IACf,GAAG,GAAG,YAAY,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE;QAClD,IAAI,kBAAkB,CAAC,WAAW,EAAE,IAAI,kBAAkB,CAAC,qBAAqB,EAAE,EAAE,CAAC;YACnF,kBAAkB,CAAC,cAAc,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAA;QAC9D,CAAC;IACH,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,GAAG,EAAE,MAAM,EAAE,CAAA;IACb,GAAG,GAAG,IAAI,CAAA;AACZ,CAAC","sourcesContent":["/**\n * Audio cloud uplink — engine-owned. Subscribes to the glasses' `mic_lc3` BLE frames\n * and forwards each one to the v2 cloud session (`cloud.sendAudioFrame`), gated on the\n * cloud being connected AND having active audio subscriptions so we don't burn the\n * UDP/encrypt path when nothing upstream is listening.\n *\n * This is the device→cloud audio data-plane for the v2 runtime. It used to live in the\n * host's MantleManager `mic_lc3` handler (the \"cloud fork\"); moved here so ANY host —\n * including a bare OEM that never runs the v1 SocketComms plane — gets cloud\n * transcription/translation, not just the first-party Mentra app.\n *\n * The old v1 UDP/SocketComms upload legs were removed; MantleManager only keeps\n * host-side debug mic-activity tracking and on-device PCM fan-out.\n *\n * Started by `engine.start()`. Idempotent.\n */\nimport BluetoothSdk from \"@mentra/bluetooth-sdk/internal\"\nimport {cloudClientService} from \"./CloudClientService\"\n\nlet sub: {remove: () => void} | null = null\n\nexport function startAudioCloudUplink(): void {\n if (sub) return\n sub = BluetoothSdk.addListener(\"mic_lc3\", (event) => {\n if (cloudClientService.isConnected() && cloudClientService.hasAudioSubscriptions()) {\n cloudClientService.sendAudioFrame(new Uint8Array(event.lc3))\n }\n })\n}\n\nexport function stopAudioCloudUplink(): void {\n sub?.remove()\n sub = null\n}\n"]}
1
+ {"version":3,"file":"AudioCloudUplink.js","sourceRoot":"","sources":["../../src/services/AudioCloudUplink.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,YAAY,MAAM,gCAAgC,CAAA;AACzD,OAAO,EAAC,kBAAkB,EAAC,MAAM,sBAAsB,CAAA;AAEvD,IAAI,GAAG,GAAgC,IAAI,CAAA;AAC3C,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAU,CAAA;AAE5C;;;;;;;;;;GAUG;AACH,MAAM,UAAU,6BAA6B,CAAC,QAAgB,EAAE,UAAmB;IACjF,IAAI,UAAU;QAAE,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;;QAC3C,kBAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;AAC1C,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,IAAI,GAAG;QAAE,OAAM;IACf,GAAG,GAAG,YAAY,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE;QAClD,IACE,kBAAkB,CAAC,IAAI,KAAK,CAAC;YAC7B,kBAAkB,CAAC,WAAW,EAAE;YAChC,kBAAkB,CAAC,qBAAqB,EAAE,EAC1C,CAAC;YACD,kBAAkB,CAAC,cAAc,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAA;QAC9D,CAAC;IACH,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,GAAG,EAAE,MAAM,EAAE,CAAA;IACb,GAAG,GAAG,IAAI,CAAA;IACV,kBAAkB,CAAC,KAAK,EAAE,CAAA;AAC5B,CAAC","sourcesContent":["/**\n * Audio cloud uplink — engine-owned. Subscribes to the glasses' `mic_lc3` BLE frames\n * and forwards each one to the v2 cloud session (`cloud.sendAudioFrame`), gated on the\n * cloud being connected AND having active audio subscriptions so we don't burn the\n * UDP/encrypt path when nothing upstream is listening.\n *\n * This is the device→cloud audio data-plane for the v2 runtime. It used to live in the\n * host's MantleManager `mic_lc3` handler (the \"cloud fork\"); moved here so ANY host —\n * including a bare OEM that never runs the v1 SocketComms plane — gets cloud\n * transcription/translation, not just the first-party Mentra app.\n *\n * The old v1 UDP/SocketComms upload legs were removed; MantleManager only keeps\n * host-side debug mic-activity tracking and on-device PCM fan-out.\n *\n * Started by `engine.start()`. Idempotent.\n */\nimport BluetoothSdk from \"@mentra/bluetooth-sdk/internal\"\nimport {cloudClientService} from \"./CloudClientService\"\n\nlet sub: {remove: () => void} | null = null\nconst suppressionSources = new Set<string>()\n\n/**\n * Keep the glasses LC3 transport alive while dropping mic audio before cloud\n * STT. Sources are reference-counted by id so overlapping playback cannot\n * reopen the uplink until every active source has released.\n *\n * Suppression is global to the uplink: one source silences STT for every app.\n * That is why no platform path arms it any more (spoken TTS used to, which made\n * every assistant reply punch a hole in Live Translation and Captions). The\n * mechanism stays because it is the right primitive for an explicit,\n * caller-scoped mute; see OS-1741 for the per-app opt-in that will use it.\n */\nexport function setAudioCloudUplinkSuppressed(sourceId: string, suppressed: boolean): void {\n if (suppressed) suppressionSources.add(sourceId)\n else suppressionSources.delete(sourceId)\n}\n\nexport function startAudioCloudUplink(): void {\n if (sub) return\n sub = BluetoothSdk.addListener(\"mic_lc3\", (event) => {\n if (\n suppressionSources.size === 0 &&\n cloudClientService.isConnected() &&\n cloudClientService.hasAudioSubscriptions()\n ) {\n cloudClientService.sendAudioFrame(new Uint8Array(event.lc3))\n }\n })\n}\n\nexport function stopAudioCloudUplink(): void {\n sub?.remove()\n sub = null\n suppressionSources.clear()\n}\n"]}
@@ -4,7 +4,16 @@ interface AudioPlayRequest {
4
4
  appId?: string;
5
5
  volume?: number;
6
6
  stopOtherAudio?: boolean;
7
+ /**
8
+ * Suppress microphone audio sent to cloud STT while this audio is audible.
9
+ * Opt-in and off by default: the suppression is global to the uplink, so a
10
+ * caller that sets this silences STT for every running app, not just itself.
11
+ * No platform path sets it today (see AudioCloudUplink and OS-1741).
12
+ */
13
+ suppressCloudUplink?: boolean;
7
14
  }
15
+ export type AudioPlaybackCompletionReason = "completed" | "interrupted" | "error";
16
+ type AudioPlaybackCompletion = (requestId: string, success: boolean, error: string | null, duration: number | null, reason: AudioPlaybackCompletionReason) => void;
8
17
  /** Open request for a live PCM output stream (miniapp speaker.createStream). */
9
18
  export interface AudioStreamOpenRequest {
10
19
  streamId: string;
@@ -24,13 +33,24 @@ export interface AudioStreamOpenRequest {
24
33
  declare class AudioPlaybackService {
25
34
  private static instance;
26
35
  private player;
36
+ private loadedPlayback;
27
37
  private currentPlayback;
38
+ private pendingPlaybacks;
28
39
  private streams;
29
40
  private audioModeConfigured;
30
41
  private audioStopDebounceTimer;
42
+ private audioRouteWarmUntil;
43
+ private audioRouteWarmupPromise;
44
+ private tailUplinkSuppressions;
31
45
  private glassesVolumeRestoreLevel;
32
46
  private static readonly AUDIO_STOP_DEBOUNCE_MS;
33
47
  private static readonly A2DP_TAIL_DRAIN_MS;
48
+ private static readonly AUDIO_ROUTE_WARM_WINDOW_MS;
49
+ private static readonly AUDIO_ROUTE_PREWARM_MS;
50
+ private static readonly AUDIO_ROUTE_PREWARM_SAMPLE_RATE;
51
+ /** Break accidental same-app replay storms without affecting deliberate later replays. */
52
+ private static readonly DUPLICATE_PLAY_WINDOW_MS;
53
+ private static readonly AUDIO_ROUTE_PREWARM_PCM_BASE64;
34
54
  /** If glasses report step volume at or below this, bump to FLOOR before A2DP playback. */
35
55
  private static readonly GLASSES_VOLUME_LOW_THRESHOLD;
36
56
  private static readonly GLASSES_VOLUME_FLOOR;
@@ -57,6 +77,17 @@ declare class AudioPlaybackService {
57
77
  * Ensure we have a reusable player instance
58
78
  */
59
79
  private ensurePlayer;
80
+ private markAudioRouteWarm;
81
+ private isAudioRouteWarm;
82
+ /**
83
+ * Wake a cold Android A2DP route with silent PCM before a user-facing sound.
84
+ *
85
+ * Do not call pcmStreamClose here: some Bluetooth routes do not advance an
86
+ * idle AudioTrack playback head, so close waits for its drain timeout. After
87
+ * exactly 200ms of silence we abort the stream instead, which releases the
88
+ * pre-roll immediately and lets the real URL playback begin.
89
+ */
90
+ private prewarmAudioRouteIfCold;
60
91
  private getGlassesMediaVolumeWithTiming;
61
92
  private setGlassesMediaVolumeWithTiming;
62
93
  /**
@@ -68,12 +99,20 @@ declare class AudioPlaybackService {
68
99
  * Restore the user's original glasses media step volume after A2DP playback finishes.
69
100
  */
70
101
  private restoreGlassesMediaVolume;
71
- private pauseFinishedPlayerAfterTail;
102
+ private unloadPlaybackSource;
103
+ private clearFinishedPlayerAfterTail;
104
+ private releaseTailUplinkSuppressions;
72
105
  /**
73
106
  * Play audio from a URL.
74
107
  * Returns a promise that resolves with playback result when audio finishes or errors.
75
108
  */
76
- play(request: AudioPlayRequest, onComplete: (requestId: string, success: boolean, error: string | null, duration: number | null) => void): Promise<void>;
109
+ play(request: AudioPlayRequest, onComplete: AudioPlaybackCompletion): Promise<void>;
110
+ /**
111
+ * Cancel one URL playback without touching audio owned by another request.
112
+ * Pending requests are prevented from reaching the native player; active
113
+ * requests are paused synchronously before their completion callback fires.
114
+ */
115
+ cancelPlayback(requestId: string): void;
77
116
  /**
78
117
  * Interrupt current playback and notify its callback
79
118
  */
@@ -1 +1 @@
1
- {"version":3,"file":"AudioPlaybackService.d.ts","sourceRoot":"","sources":["../../src/services/AudioPlaybackService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AudioPlaybackService.d.ts","sourceRoot":"","sources":["../../src/services/AudioPlaybackService.ts"],"names":[],"mappings":"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"}