@mentra/engine 0.1.0-beta.0

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 (842) hide show
  1. package/README.md +79 -0
  2. package/build/devtools.d.ts +11 -0
  3. package/build/devtools.d.ts.map +1 -0
  4. package/build/devtools.js +13 -0
  5. package/build/devtools.js.map +1 -0
  6. package/build/engine.d.ts +261 -0
  7. package/build/engine.d.ts.map +1 -0
  8. package/build/engine.js +170 -0
  9. package/build/engine.js.map +1 -0
  10. package/build/facades/dev.d.ts +58 -0
  11. package/build/facades/dev.d.ts.map +1 -0
  12. package/build/facades/dev.js +189 -0
  13. package/build/facades/dev.js.map +1 -0
  14. package/build/facades/display.d.ts +21 -0
  15. package/build/facades/display.d.ts.map +1 -0
  16. package/build/facades/display.js +17 -0
  17. package/build/facades/display.js.map +1 -0
  18. package/build/facades/displayMirror.d.ts +15 -0
  19. package/build/facades/displayMirror.d.ts.map +1 -0
  20. package/build/facades/displayMirror.js +29 -0
  21. package/build/facades/displayMirror.js.map +1 -0
  22. package/build/facades/gallery.d.ts +62 -0
  23. package/build/facades/gallery.d.ts.map +1 -0
  24. package/build/facades/gallery.js +61 -0
  25. package/build/facades/gallery.js.map +1 -0
  26. package/build/facades/glasses.d.ts +141 -0
  27. package/build/facades/glasses.d.ts.map +1 -0
  28. package/build/facades/glasses.js +199 -0
  29. package/build/facades/glasses.js.map +1 -0
  30. package/build/facades/glassesSettings.d.ts +13 -0
  31. package/build/facades/glassesSettings.d.ts.map +1 -0
  32. package/build/facades/glassesSettings.js +54 -0
  33. package/build/facades/glassesSettings.js.map +1 -0
  34. package/build/facades/glassesWifi.d.ts +25 -0
  35. package/build/facades/glassesWifi.d.ts.map +1 -0
  36. package/build/facades/glassesWifi.js +57 -0
  37. package/build/facades/glassesWifi.js.map +1 -0
  38. package/build/facades/miniapps.d.ts +43 -0
  39. package/build/facades/miniapps.d.ts.map +1 -0
  40. package/build/facades/miniapps.js +49 -0
  41. package/build/facades/miniapps.js.map +1 -0
  42. package/build/facades/notifications.d.ts +13 -0
  43. package/build/facades/notifications.d.ts.map +1 -0
  44. package/build/facades/notifications.js +12 -0
  45. package/build/facades/notifications.js.map +1 -0
  46. package/build/facades/ota.d.ts +103 -0
  47. package/build/facades/ota.d.ts.map +1 -0
  48. package/build/facades/ota.js +156 -0
  49. package/build/facades/ota.js.map +1 -0
  50. package/build/facades/pairing.d.ts +114 -0
  51. package/build/facades/pairing.d.ts.map +1 -0
  52. package/build/facades/pairing.js +275 -0
  53. package/build/facades/pairing.js.map +1 -0
  54. package/build/facades/permissions.d.ts +33 -0
  55. package/build/facades/permissions.d.ts.map +1 -0
  56. package/build/facades/permissions.js +155 -0
  57. package/build/facades/permissions.js.map +1 -0
  58. package/build/facades/phoneNotifications.d.ts +21 -0
  59. package/build/facades/phoneNotifications.d.ts.map +1 -0
  60. package/build/facades/phoneNotifications.js +51 -0
  61. package/build/facades/phoneNotifications.js.map +1 -0
  62. package/build/facades/reports.d.ts +36 -0
  63. package/build/facades/reports.d.ts.map +1 -0
  64. package/build/facades/reports.js +134 -0
  65. package/build/facades/reports.js.map +1 -0
  66. package/build/facades/session.d.ts +21 -0
  67. package/build/facades/session.d.ts.map +1 -0
  68. package/build/facades/session.js +52 -0
  69. package/build/facades/session.js.map +1 -0
  70. package/build/facades/settings.d.ts +37 -0
  71. package/build/facades/settings.d.ts.map +1 -0
  72. package/build/facades/settings.js +55 -0
  73. package/build/facades/settings.js.map +1 -0
  74. package/build/facades/speech.d.ts +30 -0
  75. package/build/facades/speech.d.ts.map +1 -0
  76. package/build/facades/speech.js +37 -0
  77. package/build/facades/speech.js.map +1 -0
  78. package/build/index.d.ts +43 -0
  79. package/build/index.d.ts.map +1 -0
  80. package/build/index.js +45 -0
  81. package/build/index.js.map +1 -0
  82. package/build/internal.d.ts +67 -0
  83. package/build/internal.d.ts.map +1 -0
  84. package/build/internal.js +90 -0
  85. package/build/internal.js.map +1 -0
  86. package/build/runtime/bootstrap.d.ts +83 -0
  87. package/build/runtime/bootstrap.d.ts.map +1 -0
  88. package/build/runtime/bootstrap.js +56 -0
  89. package/build/runtime/bootstrap.js.map +1 -0
  90. package/build/runtime/config.d.ts +146 -0
  91. package/build/runtime/config.d.ts.map +1 -0
  92. package/build/runtime/config.js +18 -0
  93. package/build/runtime/config.js.map +1 -0
  94. package/build/runtime/streamConfig.d.ts +4 -0
  95. package/build/runtime/streamConfig.d.ts.map +1 -0
  96. package/build/runtime/streamConfig.js +38 -0
  97. package/build/runtime/streamConfig.js.map +1 -0
  98. package/build/services/AppRegistry.d.ts +269 -0
  99. package/build/services/AppRegistry.d.ts.map +1 -0
  100. package/build/services/AppRegistry.js +1079 -0
  101. package/build/services/AppRegistry.js.map +1 -0
  102. package/build/services/AudioCloudUplink.d.ts +9 -0
  103. package/build/services/AudioCloudUplink.d.ts.map +1 -0
  104. package/build/services/AudioCloudUplink.js +48 -0
  105. package/build/services/AudioCloudUplink.js.map +1 -0
  106. package/build/services/AudioPlaybackService.d.ts +175 -0
  107. package/build/services/AudioPlaybackService.d.ts.map +1 -0
  108. package/build/services/AudioPlaybackService.js +705 -0
  109. package/build/services/AudioPlaybackService.js.map +1 -0
  110. package/build/services/AutomaticReportResult.d.ts +20 -0
  111. package/build/services/AutomaticReportResult.d.ts.map +1 -0
  112. package/build/services/AutomaticReportResult.js +29 -0
  113. package/build/services/AutomaticReportResult.js.map +1 -0
  114. package/build/services/BlobStore.d.ts +91 -0
  115. package/build/services/BlobStore.d.ts.map +1 -0
  116. package/build/services/BlobStore.js +668 -0
  117. package/build/services/BlobStore.js.map +1 -0
  118. package/build/services/CaptionsTesterReportService.d.ts +4 -0
  119. package/build/services/CaptionsTesterReportService.d.ts.map +1 -0
  120. package/build/services/CaptionsTesterReportService.js +80 -0
  121. package/build/services/CaptionsTesterReportService.js.map +1 -0
  122. package/build/services/CloudAudioSubscriptionSync.d.ts +24 -0
  123. package/build/services/CloudAudioSubscriptionSync.d.ts.map +1 -0
  124. package/build/services/CloudAudioSubscriptionSync.js +39 -0
  125. package/build/services/CloudAudioSubscriptionSync.js.map +1 -0
  126. package/build/services/CloudClientService.d.ts +143 -0
  127. package/build/services/CloudClientService.d.ts.map +1 -0
  128. package/build/services/CloudClientService.js +644 -0
  129. package/build/services/CloudClientService.js.map +1 -0
  130. package/build/services/CloudTranscriptE2EMetrics.d.ts +4 -0
  131. package/build/services/CloudTranscriptE2EMetrics.d.ts.map +1 -0
  132. package/build/services/CloudTranscriptE2EMetrics.js +24 -0
  133. package/build/services/CloudTranscriptE2EMetrics.js.map +1 -0
  134. package/build/services/ConnectionCoordinator.d.ts +51 -0
  135. package/build/services/ConnectionCoordinator.d.ts.map +1 -0
  136. package/build/services/ConnectionCoordinator.js +34 -0
  137. package/build/services/ConnectionCoordinator.js.map +1 -0
  138. package/build/services/DevServerBridge.d.ts +63 -0
  139. package/build/services/DevServerBridge.d.ts.map +1 -0
  140. package/build/services/DevServerBridge.js +294 -0
  141. package/build/services/DevServerBridge.js.map +1 -0
  142. package/build/services/DeviceEventRouter.d.ts +3 -0
  143. package/build/services/DeviceEventRouter.d.ts.map +1 -0
  144. package/build/services/DeviceEventRouter.js +190 -0
  145. package/build/services/DeviceEventRouter.js.map +1 -0
  146. package/build/services/DeviceStoreHydration.d.ts +38 -0
  147. package/build/services/DeviceStoreHydration.d.ts.map +1 -0
  148. package/build/services/DeviceStoreHydration.js +124 -0
  149. package/build/services/DeviceStoreHydration.js.map +1 -0
  150. package/build/services/DisplayProcessor.d.ts +223 -0
  151. package/build/services/DisplayProcessor.d.ts.map +1 -0
  152. package/build/services/DisplayProcessor.js +552 -0
  153. package/build/services/DisplayProcessor.js.map +1 -0
  154. package/build/services/GlassesReadiness.d.ts +41 -0
  155. package/build/services/GlassesReadiness.d.ts.map +1 -0
  156. package/build/services/GlassesReadiness.js +82 -0
  157. package/build/services/GlassesReadiness.js.map +1 -0
  158. package/build/services/GlassesSettingsSync.d.ts +33 -0
  159. package/build/services/GlassesSettingsSync.d.ts.map +1 -0
  160. package/build/services/GlassesSettingsSync.js +121 -0
  161. package/build/services/GlassesSettingsSync.js.map +1 -0
  162. package/build/services/GlassesStatusProjection.d.ts +3 -0
  163. package/build/services/GlassesStatusProjection.d.ts.map +1 -0
  164. package/build/services/GlassesStatusProjection.js +65 -0
  165. package/build/services/GlassesStatusProjection.js.map +1 -0
  166. package/build/services/HeadingService.d.ts +27 -0
  167. package/build/services/HeadingService.d.ts.map +1 -0
  168. package/build/services/HeadingService.js +96 -0
  169. package/build/services/HeadingService.js.map +1 -0
  170. package/build/services/LocalDisplayManager.d.ts +139 -0
  171. package/build/services/LocalDisplayManager.d.ts.map +1 -0
  172. package/build/services/LocalDisplayManager.js +579 -0
  173. package/build/services/LocalDisplayManager.js.map +1 -0
  174. package/build/services/LocalMiniappRuntime.d.ts +439 -0
  175. package/build/services/LocalMiniappRuntime.d.ts.map +1 -0
  176. package/build/services/LocalMiniappRuntime.js +3695 -0
  177. package/build/services/LocalMiniappRuntime.js.map +1 -0
  178. package/build/services/LocalSttFallbackCoordinator.d.ts +57 -0
  179. package/build/services/LocalSttFallbackCoordinator.d.ts.map +1 -0
  180. package/build/services/LocalSttFallbackCoordinator.js +137 -0
  181. package/build/services/LocalSttFallbackCoordinator.js.map +1 -0
  182. package/build/services/MentraJSCrashController.d.ts +97 -0
  183. package/build/services/MentraJSCrashController.d.ts.map +1 -0
  184. package/build/services/MentraJSCrashController.js +138 -0
  185. package/build/services/MentraJSCrashController.js.map +1 -0
  186. package/build/services/MentraJSCrashloopReportService.d.ts +9 -0
  187. package/build/services/MentraJSCrashloopReportService.d.ts.map +1 -0
  188. package/build/services/MentraJSCrashloopReportService.js +54 -0
  189. package/build/services/MentraJSCrashloopReportService.js.map +1 -0
  190. package/build/services/MentraJSLogPipeline.d.ts +87 -0
  191. package/build/services/MentraJSLogPipeline.d.ts.map +1 -0
  192. package/build/services/MentraJSLogPipeline.js +137 -0
  193. package/build/services/MentraJSLogPipeline.js.map +1 -0
  194. package/build/services/MentraJSRouter.d.ts +203 -0
  195. package/build/services/MentraJSRouter.d.ts.map +1 -0
  196. package/build/services/MentraJSRouter.js +480 -0
  197. package/build/services/MentraJSRouter.js.map +1 -0
  198. package/build/services/MentraUIRouter.d.ts +137 -0
  199. package/build/services/MentraUIRouter.d.ts.map +1 -0
  200. package/build/services/MentraUIRouter.js +210 -0
  201. package/build/services/MentraUIRouter.js.map +1 -0
  202. package/build/services/MicStateCoordinator.d.ts +37 -0
  203. package/build/services/MicStateCoordinator.d.ts.map +1 -0
  204. package/build/services/MicStateCoordinator.js +81 -0
  205. package/build/services/MicStateCoordinator.js.map +1 -0
  206. package/build/services/MiniappEngine.d.ts +31 -0
  207. package/build/services/MiniappEngine.d.ts.map +1 -0
  208. package/build/services/MiniappEngine.js +119 -0
  209. package/build/services/MiniappEngine.js.map +1 -0
  210. package/build/services/MiniappLauncher.d.ts +129 -0
  211. package/build/services/MiniappLauncher.d.ts.map +1 -0
  212. package/build/services/MiniappLauncher.js +291 -0
  213. package/build/services/MiniappLauncher.js.map +1 -0
  214. package/build/services/MiniappRunningRegistry.d.ts +24 -0
  215. package/build/services/MiniappRunningRegistry.d.ts.map +1 -0
  216. package/build/services/MiniappRunningRegistry.js +52 -0
  217. package/build/services/MiniappRunningRegistry.js.map +1 -0
  218. package/build/services/NativeHttpResponse.d.ts +3 -0
  219. package/build/services/NativeHttpResponse.d.ts.map +1 -0
  220. package/build/services/NativeHttpResponse.js +6 -0
  221. package/build/services/NativeHttpResponse.js.map +1 -0
  222. package/build/services/NavigationHandlers.d.ts +90 -0
  223. package/build/services/NavigationHandlers.d.ts.map +1 -0
  224. package/build/services/NavigationHandlers.js +379 -0
  225. package/build/services/NavigationHandlers.js.map +1 -0
  226. package/build/services/NavigationService.d.ts +254 -0
  227. package/build/services/NavigationService.d.ts.map +1 -0
  228. package/build/services/NavigationService.js +553 -0
  229. package/build/services/NavigationService.js.map +1 -0
  230. package/build/services/NotificationsEmitter.d.ts +28 -0
  231. package/build/services/NotificationsEmitter.d.ts.map +1 -0
  232. package/build/services/NotificationsEmitter.js +22 -0
  233. package/build/services/NotificationsEmitter.js.map +1 -0
  234. package/build/services/OfflineSpeechModelService.d.ts +33 -0
  235. package/build/services/OfflineSpeechModelService.d.ts.map +1 -0
  236. package/build/services/OfflineSpeechModelService.js +136 -0
  237. package/build/services/OfflineSpeechModelService.js.map +1 -0
  238. package/build/services/OtaInstallCoordinator.d.ts +195 -0
  239. package/build/services/OtaInstallCoordinator.d.ts.map +1 -0
  240. package/build/services/OtaInstallCoordinator.js +1047 -0
  241. package/build/services/OtaInstallCoordinator.js.map +1 -0
  242. package/build/services/OtaService.d.ts +3 -0
  243. package/build/services/OtaService.d.ts.map +1 -0
  244. package/build/services/OtaService.js +65 -0
  245. package/build/services/OtaService.js.map +1 -0
  246. package/build/services/OtaUpdateCheckService.d.ts +65 -0
  247. package/build/services/OtaUpdateCheckService.d.ts.map +1 -0
  248. package/build/services/OtaUpdateCheckService.js +260 -0
  249. package/build/services/OtaUpdateCheckService.js.map +1 -0
  250. package/build/services/PairingIdentity.d.ts +80 -0
  251. package/build/services/PairingIdentity.d.ts.map +1 -0
  252. package/build/services/PairingIdentity.js +145 -0
  253. package/build/services/PairingIdentity.js.map +1 -0
  254. package/build/services/PhoneCalendarHelpers.d.ts +32 -0
  255. package/build/services/PhoneCalendarHelpers.d.ts.map +1 -0
  256. package/build/services/PhoneCalendarHelpers.js +157 -0
  257. package/build/services/PhoneCalendarHelpers.js.map +1 -0
  258. package/build/services/PhoneCalendarService.d.ts +5 -0
  259. package/build/services/PhoneCalendarService.d.ts.map +1 -0
  260. package/build/services/PhoneCalendarService.js +24 -0
  261. package/build/services/PhoneCalendarService.js.map +1 -0
  262. package/build/services/PhoneCameraFovCoordinator.d.ts +28 -0
  263. package/build/services/PhoneCameraFovCoordinator.d.ts.map +1 -0
  264. package/build/services/PhoneCameraFovCoordinator.js +180 -0
  265. package/build/services/PhoneCameraFovCoordinator.js.map +1 -0
  266. package/build/services/PhoneLocationService.d.ts +36 -0
  267. package/build/services/PhoneLocationService.d.ts.map +1 -0
  268. package/build/services/PhoneLocationService.js +115 -0
  269. package/build/services/PhoneLocationService.js.map +1 -0
  270. package/build/services/PhoneNotificationsSync.d.ts +3 -0
  271. package/build/services/PhoneNotificationsSync.d.ts.map +1 -0
  272. package/build/services/PhoneNotificationsSync.js +35 -0
  273. package/build/services/PhoneNotificationsSync.js.map +1 -0
  274. package/build/services/PhonePhotoCoordinator.d.ts +103 -0
  275. package/build/services/PhonePhotoCoordinator.d.ts.map +1 -0
  276. package/build/services/PhonePhotoCoordinator.js +326 -0
  277. package/build/services/PhonePhotoCoordinator.js.map +1 -0
  278. package/build/services/PhoneStreamCoordinator.d.ts +168 -0
  279. package/build/services/PhoneStreamCoordinator.d.ts.map +1 -0
  280. package/build/services/PhoneStreamCoordinator.js +632 -0
  281. package/build/services/PhoneStreamCoordinator.js.map +1 -0
  282. package/build/services/PhoneVideoCoordinator.d.ts +50 -0
  283. package/build/services/PhoneVideoCoordinator.d.ts.map +1 -0
  284. package/build/services/PhoneVideoCoordinator.js +147 -0
  285. package/build/services/PhoneVideoCoordinator.js.map +1 -0
  286. package/build/services/STTModelManager.d.ts +65 -0
  287. package/build/services/STTModelManager.d.ts.map +1 -0
  288. package/build/services/STTModelManager.js +292 -0
  289. package/build/services/STTModelManager.js.map +1 -0
  290. package/build/services/SceneRenderer.d.ts +90 -0
  291. package/build/services/SceneRenderer.d.ts.map +1 -0
  292. package/build/services/SceneRenderer.js +248 -0
  293. package/build/services/SceneRenderer.js.map +1 -0
  294. package/build/services/SentenceTtsPipeline.d.ts +31 -0
  295. package/build/services/SentenceTtsPipeline.d.ts.map +1 -0
  296. package/build/services/SentenceTtsPipeline.js +67 -0
  297. package/build/services/SentenceTtsPipeline.js.map +1 -0
  298. package/build/services/StreamLifecycleController.d.ts +67 -0
  299. package/build/services/StreamLifecycleController.d.ts.map +1 -0
  300. package/build/services/StreamLifecycleController.js +152 -0
  301. package/build/services/StreamLifecycleController.js.map +1 -0
  302. package/build/services/TTSModelManager.d.ts +90 -0
  303. package/build/services/TTSModelManager.d.ts.map +1 -0
  304. package/build/services/TTSModelManager.js +366 -0
  305. package/build/services/TTSModelManager.js.map +1 -0
  306. package/build/services/TranscriptionRouting.d.ts +12 -0
  307. package/build/services/TranscriptionRouting.d.ts.map +1 -0
  308. package/build/services/TranscriptionRouting.js +24 -0
  309. package/build/services/TranscriptionRouting.js.map +1 -0
  310. package/build/services/WebviewBridge.d.ts +22 -0
  311. package/build/services/WebviewBridge.d.ts.map +1 -0
  312. package/build/services/WebviewBridge.js +47 -0
  313. package/build/services/WebviewBridge.js.map +1 -0
  314. package/build/services/asg/GalleryMediaIntegrityReportService.d.ts +17 -0
  315. package/build/services/asg/GalleryMediaIntegrityReportService.d.ts.map +1 -0
  316. package/build/services/asg/GalleryMediaIntegrityReportService.js +43 -0
  317. package/build/services/asg/GalleryMediaIntegrityReportService.js.map +1 -0
  318. package/build/services/asg/asgCameraApi.d.ts +205 -0
  319. package/build/services/asg/asgCameraApi.d.ts.map +1 -0
  320. package/build/services/asg/asgCameraApi.js +1410 -0
  321. package/build/services/asg/asgCameraApi.js.map +1 -0
  322. package/build/services/asg/cameraRollExportCoordinator.d.ts +60 -0
  323. package/build/services/asg/cameraRollExportCoordinator.d.ts.map +1 -0
  324. package/build/services/asg/cameraRollExportCoordinator.js +618 -0
  325. package/build/services/asg/cameraRollExportCoordinator.js.map +1 -0
  326. package/build/services/asg/cameraRollExportLedger.d.ts +44 -0
  327. package/build/services/asg/cameraRollExportLedger.d.ts.map +1 -0
  328. package/build/services/asg/cameraRollExportLedger.js +78 -0
  329. package/build/services/asg/cameraRollExportLedger.js.map +1 -0
  330. package/build/services/asg/galleryMediaValidation.d.ts +29 -0
  331. package/build/services/asg/galleryMediaValidation.d.ts.map +1 -0
  332. package/build/services/asg/galleryMediaValidation.js +149 -0
  333. package/build/services/asg/galleryMediaValidation.js.map +1 -0
  334. package/build/services/asg/galleryNotices.d.ts +33 -0
  335. package/build/services/asg/galleryNotices.d.ts.map +1 -0
  336. package/build/services/asg/galleryNotices.js +29 -0
  337. package/build/services/asg/galleryNotices.js.map +1 -0
  338. package/build/services/asg/galleryPathMigration.d.ts +3 -0
  339. package/build/services/asg/galleryPathMigration.d.ts.map +1 -0
  340. package/build/services/asg/galleryPathMigration.js +26 -0
  341. package/build/services/asg/galleryPathMigration.js.map +1 -0
  342. package/build/services/asg/gallerySettingsService.d.ts +20 -0
  343. package/build/services/asg/gallerySettingsService.d.ts.map +1 -0
  344. package/build/services/asg/gallerySettingsService.js +53 -0
  345. package/build/services/asg/gallerySettingsService.js.map +1 -0
  346. package/build/services/asg/gallerySyncNotifications.d.ts +56 -0
  347. package/build/services/asg/gallerySyncNotifications.d.ts.map +1 -0
  348. package/build/services/asg/gallerySyncNotifications.js +198 -0
  349. package/build/services/asg/gallerySyncNotifications.js.map +1 -0
  350. package/build/services/asg/gallerySyncService.d.ts +137 -0
  351. package/build/services/asg/gallerySyncService.d.ts.map +1 -0
  352. package/build/services/asg/gallerySyncService.js +1933 -0
  353. package/build/services/asg/gallerySyncService.js.map +1 -0
  354. package/build/services/asg/galleryTransferLedger.d.ts +58 -0
  355. package/build/services/asg/galleryTransferLedger.d.ts.map +1 -0
  356. package/build/services/asg/galleryTransferLedger.js +225 -0
  357. package/build/services/asg/galleryTransferLedger.js.map +1 -0
  358. package/build/services/asg/localNetworkTransport.d.ts +15 -0
  359. package/build/services/asg/localNetworkTransport.d.ts.map +1 -0
  360. package/build/services/asg/localNetworkTransport.js +144 -0
  361. package/build/services/asg/localNetworkTransport.js.map +1 -0
  362. package/build/services/asg/localStorageService.d.ts +146 -0
  363. package/build/services/asg/localStorageService.d.ts.map +1 -0
  364. package/build/services/asg/localStorageService.js +572 -0
  365. package/build/services/asg/localStorageService.js.map +1 -0
  366. package/build/services/asg/mediaProcessingQueue.d.ts +70 -0
  367. package/build/services/asg/mediaProcessingQueue.d.ts.map +1 -0
  368. package/build/services/asg/mediaProcessingQueue.js +451 -0
  369. package/build/services/asg/mediaProcessingQueue.js.map +1 -0
  370. package/build/services/asgOtaVersionUrl.d.ts +2 -0
  371. package/build/services/asgOtaVersionUrl.d.ts.map +1 -0
  372. package/build/services/asgOtaVersionUrl.js +36 -0
  373. package/build/services/asgOtaVersionUrl.js.map +1 -0
  374. package/build/services/blobPaths.d.ts +31 -0
  375. package/build/services/blobPaths.d.ts.map +1 -0
  376. package/build/services/blobPaths.js +86 -0
  377. package/build/services/blobPaths.js.map +1 -0
  378. package/build/services/cloudStreamApi.d.ts +59 -0
  379. package/build/services/cloudStreamApi.d.ts.map +1 -0
  380. package/build/services/cloudStreamApi.js +81 -0
  381. package/build/services/cloudStreamApi.js.map +1 -0
  382. package/build/services/gallerySyncClock.d.ts +17 -0
  383. package/build/services/gallerySyncClock.d.ts.map +1 -0
  384. package/build/services/gallerySyncClock.js +21 -0
  385. package/build/services/gallerySyncClock.js.map +1 -0
  386. package/build/services/glassesClockSync.d.ts +20 -0
  387. package/build/services/glassesClockSync.d.ts.map +1 -0
  388. package/build/services/glassesClockSync.js +97 -0
  389. package/build/services/glassesClockSync.js.map +1 -0
  390. package/build/services/manifestVersionGate.d.ts +28 -0
  391. package/build/services/manifestVersionGate.d.ts.map +1 -0
  392. package/build/services/manifestVersionGate.js +41 -0
  393. package/build/services/manifestVersionGate.js.map +1 -0
  394. package/build/services/mentraUiShim.d.ts +38 -0
  395. package/build/services/mentraUiShim.d.ts.map +1 -0
  396. package/build/services/mentraUiShim.js +360 -0
  397. package/build/services/mentraUiShim.js.map +1 -0
  398. package/build/services/navigation/roadNameResolver.d.ts +67 -0
  399. package/build/services/navigation/roadNameResolver.d.ts.map +1 -0
  400. package/build/services/navigation/roadNameResolver.js +96 -0
  401. package/build/services/navigation/roadNameResolver.js.map +1 -0
  402. package/build/services/navigation/routesApiCodec.d.ts +38 -0
  403. package/build/services/navigation/routesApiCodec.d.ts.map +1 -0
  404. package/build/services/navigation/routesApiCodec.js +68 -0
  405. package/build/services/navigation/routesApiCodec.js.map +1 -0
  406. package/build/services/otaDisplayState.d.ts +42 -0
  407. package/build/services/otaDisplayState.d.ts.map +1 -0
  408. package/build/services/otaDisplayState.js +92 -0
  409. package/build/services/otaDisplayState.js.map +1 -0
  410. package/build/services/otaInstallPolicy.d.ts +81 -0
  411. package/build/services/otaInstallPolicy.d.ts.map +1 -0
  412. package/build/services/otaInstallPolicy.js +96 -0
  413. package/build/services/otaInstallPolicy.js.map +1 -0
  414. package/build/services/otaLegacyMapping.d.ts +22 -0
  415. package/build/services/otaLegacyMapping.d.ts.map +1 -0
  416. package/build/services/otaLegacyMapping.js +56 -0
  417. package/build/services/otaLegacyMapping.js.map +1 -0
  418. package/build/services/slimStreamStatus.d.ts +7 -0
  419. package/build/services/slimStreamStatus.d.ts.map +1 -0
  420. package/build/services/slimStreamStatus.js +26 -0
  421. package/build/services/slimStreamStatus.js.map +1 -0
  422. package/build/stores/apps.d.ts +104 -0
  423. package/build/stores/apps.d.ts.map +1 -0
  424. package/build/stores/apps.js +492 -0
  425. package/build/stores/apps.js.map +1 -0
  426. package/build/stores/bluetoothSettingKeys.d.ts +4 -0
  427. package/build/stores/bluetoothSettingKeys.d.ts.map +1 -0
  428. package/build/stores/bluetoothSettingKeys.js +31 -0
  429. package/build/stores/bluetoothSettingKeys.js.map +1 -0
  430. package/build/stores/cloudClientStatus.d.ts +9 -0
  431. package/build/stores/cloudClientStatus.d.ts.map +1 -0
  432. package/build/stores/cloudClientStatus.js +24 -0
  433. package/build/stores/cloudClientStatus.js.map +1 -0
  434. package/build/stores/connection.d.ts +22 -0
  435. package/build/stores/connection.d.ts.map +1 -0
  436. package/build/stores/connection.js +43 -0
  437. package/build/stores/connection.js.map +1 -0
  438. package/build/stores/core.d.ts +15 -0
  439. package/build/stores/core.d.ts.map +1 -0
  440. package/build/stores/core.js +21 -0
  441. package/build/stores/core.js.map +1 -0
  442. package/build/stores/display.d.ts +24 -0
  443. package/build/stores/display.d.ts.map +1 -0
  444. package/build/stores/display.js +96 -0
  445. package/build/stores/display.js.map +1 -0
  446. package/build/stores/gallerySync.d.ts +101 -0
  447. package/build/stores/gallerySync.d.ts.map +1 -0
  448. package/build/stores/gallerySync.js +217 -0
  449. package/build/stores/gallerySync.js.map +1 -0
  450. package/build/stores/glasses.d.ts +62 -0
  451. package/build/stores/glasses.d.ts.map +1 -0
  452. package/build/stores/glasses.js +203 -0
  453. package/build/stores/glasses.js.map +1 -0
  454. package/build/stores/settings.d.ts +37 -0
  455. package/build/stores/settings.d.ts.map +1 -0
  456. package/build/stores/settings.js +922 -0
  457. package/build/stores/settings.js.map +1 -0
  458. package/build/types/applet.d.ts +96 -0
  459. package/build/types/applet.d.ts.map +1 -0
  460. package/build/types/applet.js +5 -0
  461. package/build/types/applet.js.map +1 -0
  462. package/build/types/asg.d.ts +53 -0
  463. package/build/types/asg.d.ts.map +1 -0
  464. package/build/types/asg.js +2 -0
  465. package/build/types/asg.js.map +1 -0
  466. package/build/types/capabilities/even-realities-g1.d.ts +12 -0
  467. package/build/types/capabilities/even-realities-g1.d.ts.map +1 -0
  468. package/build/types/capabilities/even-realities-g1.js +55 -0
  469. package/build/types/capabilities/even-realities-g1.js.map +1 -0
  470. package/build/types/capabilities/even-realities-g2.d.ts +12 -0
  471. package/build/types/capabilities/even-realities-g2.d.ts.map +1 -0
  472. package/build/types/capabilities/even-realities-g2.js +75 -0
  473. package/build/types/capabilities/even-realities-g2.js.map +1 -0
  474. package/build/types/capabilities/mentra-display.d.ts +12 -0
  475. package/build/types/capabilities/mentra-display.d.ts.map +1 -0
  476. package/build/types/capabilities/mentra-display.js +63 -0
  477. package/build/types/capabilities/mentra-display.js.map +1 -0
  478. package/build/types/capabilities/mentra-live.d.ts +12 -0
  479. package/build/types/capabilities/mentra-live.d.ts.map +1 -0
  480. package/build/types/capabilities/mentra-live.js +92 -0
  481. package/build/types/capabilities/mentra-live.js.map +1 -0
  482. package/build/types/capabilities/none.d.ts +13 -0
  483. package/build/types/capabilities/none.d.ts.map +1 -0
  484. package/build/types/capabilities/none.js +65 -0
  485. package/build/types/capabilities/none.js.map +1 -0
  486. package/build/types/capabilities/simulated-glasses.d.ts +13 -0
  487. package/build/types/capabilities/simulated-glasses.d.ts.map +1 -0
  488. package/build/types/capabilities/simulated-glasses.js +65 -0
  489. package/build/types/capabilities/simulated-glasses.js.map +1 -0
  490. package/build/types/capabilities/vuzix-z100.d.ts +12 -0
  491. package/build/types/capabilities/vuzix-z100.d.ts.map +1 -0
  492. package/build/types/capabilities/vuzix-z100.js +52 -0
  493. package/build/types/capabilities/vuzix-z100.js.map +1 -0
  494. package/build/types/enums.d.ts +40 -0
  495. package/build/types/enums.d.ts.map +1 -0
  496. package/build/types/enums.js +44 -0
  497. package/build/types/enums.js.map +1 -0
  498. package/build/types/hardware.d.ts +160 -0
  499. package/build/types/hardware.d.ts.map +1 -0
  500. package/build/types/hardware.js +36 -0
  501. package/build/types/hardware.js.map +1 -0
  502. package/build/types/index.d.ts +11 -0
  503. package/build/types/index.d.ts.map +1 -0
  504. package/build/types/index.js +10 -0
  505. package/build/types/index.js.map +1 -0
  506. package/build/utils/GlobalEventEmitter.d.ts +10 -0
  507. package/build/utils/GlobalEventEmitter.d.ts.map +1 -0
  508. package/build/utils/GlobalEventEmitter.js +13 -0
  509. package/build/utils/GlobalEventEmitter.js.map +1 -0
  510. package/build/utils/cloudClient/RnUdpAdapter.d.ts +3 -0
  511. package/build/utils/cloudClient/RnUdpAdapter.d.ts.map +1 -0
  512. package/build/utils/cloudClient/RnUdpAdapter.js +41 -0
  513. package/build/utils/cloudClient/RnUdpAdapter.js.map +1 -0
  514. package/build/utils/cloudClient/cloudSecureStore.d.ts +3 -0
  515. package/build/utils/cloudClient/cloudSecureStore.d.ts.map +1 -0
  516. package/build/utils/cloudClient/cloudSecureStore.js +26 -0
  517. package/build/utils/cloudClient/cloudSecureStore.js.map +1 -0
  518. package/build/utils/debouncedPatch.d.ts +6 -0
  519. package/build/utils/debouncedPatch.d.ts.map +1 -0
  520. package/build/utils/debouncedPatch.js +25 -0
  521. package/build/utils/debouncedPatch.js.map +1 -0
  522. package/build/utils/devLogging.d.ts +26 -0
  523. package/build/utils/devLogging.d.ts.map +1 -0
  524. package/build/utils/devLogging.js +116 -0
  525. package/build/utils/devLogging.js.map +1 -0
  526. package/build/utils/devMiniappLaunch.d.ts +44 -0
  527. package/build/utils/devMiniappLaunch.d.ts.map +1 -0
  528. package/build/utils/devMiniappLaunch.js +52 -0
  529. package/build/utils/devMiniappLaunch.js.map +1 -0
  530. package/build/utils/diagnosticContext.d.ts +3 -0
  531. package/build/utils/diagnosticContext.d.ts.map +1 -0
  532. package/build/utils/diagnosticContext.js +119 -0
  533. package/build/utils/diagnosticContext.js.map +1 -0
  534. package/build/utils/display/composer/ColumnComposer.d.ts +131 -0
  535. package/build/utils/display/composer/ColumnComposer.d.ts.map +1 -0
  536. package/build/utils/display/composer/ColumnComposer.js +204 -0
  537. package/build/utils/display/composer/ColumnComposer.js.map +1 -0
  538. package/build/utils/display/composer/index.d.ts +9 -0
  539. package/build/utils/display/composer/index.d.ts.map +1 -0
  540. package/build/utils/display/composer/index.js +9 -0
  541. package/build/utils/display/composer/index.js.map +1 -0
  542. package/build/utils/display/helpers/DisplayHelpers.d.ts +165 -0
  543. package/build/utils/display/helpers/DisplayHelpers.d.ts.map +1 -0
  544. package/build/utils/display/helpers/DisplayHelpers.js +312 -0
  545. package/build/utils/display/helpers/DisplayHelpers.js.map +1 -0
  546. package/build/utils/display/helpers/ScrollView.d.ts +183 -0
  547. package/build/utils/display/helpers/ScrollView.d.ts.map +1 -0
  548. package/build/utils/display/helpers/ScrollView.js +257 -0
  549. package/build/utils/display/helpers/ScrollView.js.map +1 -0
  550. package/build/utils/display/helpers/index.d.ts +11 -0
  551. package/build/utils/display/helpers/index.d.ts.map +1 -0
  552. package/build/utils/display/helpers/index.js +10 -0
  553. package/build/utils/display/helpers/index.js.map +1 -0
  554. package/build/utils/display/index.d.ts +174 -0
  555. package/build/utils/display/index.d.ts.map +1 -0
  556. package/build/utils/display/index.js +185 -0
  557. package/build/utils/display/index.js.map +1 -0
  558. package/build/utils/display/measurer/TextMeasurer.d.ts +160 -0
  559. package/build/utils/display/measurer/TextMeasurer.d.ts.map +1 -0
  560. package/build/utils/display/measurer/TextMeasurer.js +273 -0
  561. package/build/utils/display/measurer/TextMeasurer.js.map +1 -0
  562. package/build/utils/display/measurer/index.d.ts +10 -0
  563. package/build/utils/display/measurer/index.d.ts.map +1 -0
  564. package/build/utils/display/measurer/index.js +11 -0
  565. package/build/utils/display/measurer/index.js.map +1 -0
  566. package/build/utils/display/measurer/script-detection.d.ts +53 -0
  567. package/build/utils/display/measurer/script-detection.d.ts.map +1 -0
  568. package/build/utils/display/measurer/script-detection.js +184 -0
  569. package/build/utils/display/measurer/script-detection.js.map +1 -0
  570. package/build/utils/display/profiles/g1.d.ts +33 -0
  571. package/build/utils/display/profiles/g1.d.ts.map +1 -0
  572. package/build/utils/display/profiles/g1.js +213 -0
  573. package/build/utils/display/profiles/g1.js.map +1 -0
  574. package/build/utils/display/profiles/g2.d.ts +13 -0
  575. package/build/utils/display/profiles/g2.d.ts.map +1 -0
  576. package/build/utils/display/profiles/g2.js +34 -0
  577. package/build/utils/display/profiles/g2.js.map +1 -0
  578. package/build/utils/display/profiles/index.d.ts +12 -0
  579. package/build/utils/display/profiles/index.d.ts.map +1 -0
  580. package/build/utils/display/profiles/index.js +15 -0
  581. package/build/utils/display/profiles/index.js.map +1 -0
  582. package/build/utils/display/profiles/nex.d.ts +10 -0
  583. package/build/utils/display/profiles/nex.d.ts.map +1 -0
  584. package/build/utils/display/profiles/nex.js +150 -0
  585. package/build/utils/display/profiles/nex.js.map +1 -0
  586. package/build/utils/display/profiles/types.d.ts +103 -0
  587. package/build/utils/display/profiles/types.d.ts.map +1 -0
  588. package/build/utils/display/profiles/types.js +2 -0
  589. package/build/utils/display/profiles/types.js.map +1 -0
  590. package/build/utils/display/profiles/z100.d.ts +33 -0
  591. package/build/utils/display/profiles/z100.d.ts.map +1 -0
  592. package/build/utils/display/profiles/z100.js +182 -0
  593. package/build/utils/display/profiles/z100.js.map +1 -0
  594. package/build/utils/display/scene/degrade.d.ts +25 -0
  595. package/build/utils/display/scene/degrade.d.ts.map +1 -0
  596. package/build/utils/display/scene/degrade.js +64 -0
  597. package/build/utils/display/scene/degrade.js.map +1 -0
  598. package/build/utils/display/scene/differ.d.ts +38 -0
  599. package/build/utils/display/scene/differ.d.ts.map +1 -0
  600. package/build/utils/display/scene/differ.js +107 -0
  601. package/build/utils/display/scene/differ.js.map +1 -0
  602. package/build/utils/display/scene/index.d.ts +10 -0
  603. package/build/utils/display/scene/index.d.ts.map +1 -0
  604. package/build/utils/display/scene/index.js +6 -0
  605. package/build/utils/display/scene/index.js.map +1 -0
  606. package/build/utils/display/scene/process.d.ts +35 -0
  607. package/build/utils/display/scene/process.d.ts.map +1 -0
  608. package/build/utils/display/scene/process.js +187 -0
  609. package/build/utils/display/scene/process.js.map +1 -0
  610. package/build/utils/display/scene/store.d.ts +48 -0
  611. package/build/utils/display/scene/store.d.ts.map +1 -0
  612. package/build/utils/display/scene/store.js +0 -0
  613. package/build/utils/display/scene/store.js.map +1 -0
  614. package/build/utils/display/scene/types.d.ts +120 -0
  615. package/build/utils/display/scene/types.d.ts.map +1 -0
  616. package/build/utils/display/scene/types.js +0 -0
  617. package/build/utils/display/scene/types.js.map +1 -0
  618. package/build/utils/display/wrapper/TextWrapper.d.ts +102 -0
  619. package/build/utils/display/wrapper/TextWrapper.d.ts.map +1 -0
  620. package/build/utils/display/wrapper/TextWrapper.js +471 -0
  621. package/build/utils/display/wrapper/TextWrapper.js.map +1 -0
  622. package/build/utils/display/wrapper/index.d.ts +12 -0
  623. package/build/utils/display/wrapper/index.d.ts.map +1 -0
  624. package/build/utils/display/wrapper/index.js +12 -0
  625. package/build/utils/display/wrapper/index.js.map +1 -0
  626. package/build/utils/display/wrapper/types.d.ts +75 -0
  627. package/build/utils/display/wrapper/types.d.ts.map +1 -0
  628. package/build/utils/display/wrapper/types.js +11 -0
  629. package/build/utils/display/wrapper/types.js.map +1 -0
  630. package/build/utils/e2eMetrics.d.ts +6 -0
  631. package/build/utils/e2eMetrics.d.ts.map +1 -0
  632. package/build/utils/e2eMetrics.js +27 -0
  633. package/build/utils/e2eMetrics.js.map +1 -0
  634. package/build/utils/hardware/hardware.d.ts +42 -0
  635. package/build/utils/hardware/hardware.d.ts.map +1 -0
  636. package/build/utils/hardware/hardware.js +127 -0
  637. package/build/utils/hardware/hardware.js.map +1 -0
  638. package/build/utils/hardware/index.d.ts +2 -0
  639. package/build/utils/hardware/index.d.ts.map +1 -0
  640. package/build/utils/hardware/index.js +2 -0
  641. package/build/utils/hardware/index.js.map +1 -0
  642. package/build/utils/miniappGlobals.d.ts +60 -0
  643. package/build/utils/miniappGlobals.d.ts.map +1 -0
  644. package/build/utils/miniappGlobals.js +224 -0
  645. package/build/utils/miniappGlobals.js.map +1 -0
  646. package/build/utils/permissions/MediaLibraryPermissions.d.ts +45 -0
  647. package/build/utils/permissions/MediaLibraryPermissions.d.ts.map +1 -0
  648. package/build/utils/permissions/MediaLibraryPermissions.js +145 -0
  649. package/build/utils/permissions/MediaLibraryPermissions.js.map +1 -0
  650. package/build/utils/permissions/galleryDisplayName.d.ts +8 -0
  651. package/build/utils/permissions/galleryDisplayName.d.ts.map +1 -0
  652. package/build/utils/permissions/galleryDisplayName.js +25 -0
  653. package/build/utils/permissions/galleryDisplayName.js.map +1 -0
  654. package/build/utils/storage/index.d.ts +3 -0
  655. package/build/utils/storage/index.d.ts.map +1 -0
  656. package/build/utils/storage/index.js +3 -0
  657. package/build/utils/storage/index.js.map +1 -0
  658. package/build/utils/storage/storage.d.ts +24 -0
  659. package/build/utils/storage/storage.d.ts.map +1 -0
  660. package/build/utils/storage/storage.js +85 -0
  661. package/build/utils/storage/storage.js.map +1 -0
  662. package/build/utils/storage/zip.d.ts +3 -0
  663. package/build/utils/storage/zip.d.ts.map +1 -0
  664. package/build/utils/storage/zip.js +14 -0
  665. package/build/utils/storage/zip.js.map +1 -0
  666. package/build/utils/timers/index.d.ts +3 -0
  667. package/build/utils/timers/index.d.ts.map +1 -0
  668. package/build/utils/timers/index.js +3 -0
  669. package/build/utils/timers/index.js.map +1 -0
  670. package/build/utils/timers/timers.d.ts +9 -0
  671. package/build/utils/timers/timers.d.ts.map +1 -0
  672. package/build/utils/timers/timers.js +105 -0
  673. package/build/utils/timers/timers.js.map +1 -0
  674. package/package.json +120 -0
  675. package/src/devtools.ts +13 -0
  676. package/src/engine.ts +173 -0
  677. package/src/facades/dev.ts +198 -0
  678. package/src/facades/display.ts +17 -0
  679. package/src/facades/displayMirror.ts +33 -0
  680. package/src/facades/gallery.ts +69 -0
  681. package/src/facades/glasses.ts +206 -0
  682. package/src/facades/glassesSettings.ts +56 -0
  683. package/src/facades/glassesWifi.ts +68 -0
  684. package/src/facades/miniapps.ts +55 -0
  685. package/src/facades/notifications.ts +15 -0
  686. package/src/facades/ota.ts +174 -0
  687. package/src/facades/pairing.ts +329 -0
  688. package/src/facades/permissions.ts +165 -0
  689. package/src/facades/phoneNotifications.ts +50 -0
  690. package/src/facades/reports.ts +185 -0
  691. package/src/facades/session.ts +55 -0
  692. package/src/facades/settings.ts +57 -0
  693. package/src/facades/speech.ts +38 -0
  694. package/src/index.ts +191 -0
  695. package/src/internal.ts +159 -0
  696. package/src/runtime/bootstrap.ts +118 -0
  697. package/src/runtime/config.ts +147 -0
  698. package/src/runtime/streamConfig.ts +34 -0
  699. package/src/services/AppRegistry.ts +1190 -0
  700. package/src/services/AudioCloudUplink.ts +50 -0
  701. package/src/services/AudioPlaybackService.ts +813 -0
  702. package/src/services/AutomaticReportResult.ts +48 -0
  703. package/src/services/BlobStore.ts +746 -0
  704. package/src/services/CaptionsTesterReportService.ts +107 -0
  705. package/src/services/CloudAudioSubscriptionSync.ts +41 -0
  706. package/src/services/CloudClientService.ts +689 -0
  707. package/src/services/CloudTranscriptE2EMetrics.ts +27 -0
  708. package/src/services/ConnectionCoordinator.ts +65 -0
  709. package/src/services/DevServerBridge.ts +332 -0
  710. package/src/services/DeviceEventRouter.ts +238 -0
  711. package/src/services/DeviceStoreHydration.ts +130 -0
  712. package/src/services/DisplayProcessor.ts +775 -0
  713. package/src/services/GlassesReadiness.ts +103 -0
  714. package/src/services/GlassesSettingsSync.ts +134 -0
  715. package/src/services/GlassesStatusProjection.ts +73 -0
  716. package/src/services/HeadingService.ts +98 -0
  717. package/src/services/LocalDisplayManager.ts +703 -0
  718. package/src/services/LocalMiniappRuntime.ts +4213 -0
  719. package/src/services/LocalSttFallbackCoordinator.ts +147 -0
  720. package/src/services/MentraJSCrashController.ts +189 -0
  721. package/src/services/MentraJSCrashloopReportService.ts +66 -0
  722. package/src/services/MentraJSLogPipeline.ts +166 -0
  723. package/src/services/MentraJSRouter.ts +557 -0
  724. package/src/services/MentraUIRouter.ts +244 -0
  725. package/src/services/MicStateCoordinator.ts +94 -0
  726. package/src/services/MiniappEngine.ts +143 -0
  727. package/src/services/MiniappLauncher.ts +340 -0
  728. package/src/services/MiniappRunningRegistry.ts +57 -0
  729. package/src/services/NativeHttpResponse.ts +6 -0
  730. package/src/services/NavigationHandlers.ts +423 -0
  731. package/src/services/NavigationService.ts +731 -0
  732. package/src/services/NotificationsEmitter.ts +48 -0
  733. package/src/services/OfflineSpeechModelService.ts +168 -0
  734. package/src/services/OtaInstallCoordinator.ts +1205 -0
  735. package/src/services/OtaService.ts +83 -0
  736. package/src/services/OtaUpdateCheckService.ts +386 -0
  737. package/src/services/PairingIdentity.ts +154 -0
  738. package/src/services/PhoneCalendarHelpers.ts +212 -0
  739. package/src/services/PhoneCalendarService.ts +42 -0
  740. package/src/services/PhoneCameraFovCoordinator.ts +195 -0
  741. package/src/services/PhoneLocationService.ts +122 -0
  742. package/src/services/PhoneNotificationsSync.ts +44 -0
  743. package/src/services/PhonePhotoCoordinator.ts +409 -0
  744. package/src/services/PhoneStreamCoordinator.ts +777 -0
  745. package/src/services/PhoneVideoCoordinator.ts +189 -0
  746. package/src/services/STTModelManager.ts +360 -0
  747. package/src/services/SceneRenderer.ts +292 -0
  748. package/src/services/SentenceTtsPipeline.ts +106 -0
  749. package/src/services/StreamLifecycleController.ts +213 -0
  750. package/src/services/TTSModelManager.ts +466 -0
  751. package/src/services/TranscriptionRouting.ts +37 -0
  752. package/src/services/WebviewBridge.ts +50 -0
  753. package/src/services/asg/GalleryMediaIntegrityReportService.ts +70 -0
  754. package/src/services/asg/asgCameraApi.ts +1695 -0
  755. package/src/services/asg/cameraRollExportCoordinator.ts +627 -0
  756. package/src/services/asg/cameraRollExportLedger.ts +122 -0
  757. package/src/services/asg/galleryMediaValidation.ts +183 -0
  758. package/src/services/asg/galleryNotices.ts +61 -0
  759. package/src/services/asg/galleryPathMigration.ts +22 -0
  760. package/src/services/asg/gallerySettingsService.ts +68 -0
  761. package/src/services/asg/gallerySyncNotifications.ts +236 -0
  762. package/src/services/asg/gallerySyncService.ts +2269 -0
  763. package/src/services/asg/galleryTransferLedger.ts +312 -0
  764. package/src/services/asg/localNetworkTransport.ts +173 -0
  765. package/src/services/asg/localStorageService.ts +652 -0
  766. package/src/services/asg/mediaProcessingQueue.ts +518 -0
  767. package/src/services/asgOtaVersionUrl.ts +41 -0
  768. package/src/services/blobPaths.ts +86 -0
  769. package/src/services/cloudStreamApi.ts +154 -0
  770. package/src/services/gallerySyncClock.ts +39 -0
  771. package/src/services/glassesClockSync.ts +115 -0
  772. package/src/services/manifestVersionGate.ts +43 -0
  773. package/src/services/mentraUiShim.ts +366 -0
  774. package/src/services/navigation/roadNameResolver.ts +112 -0
  775. package/src/services/navigation/routesApiCodec.ts +69 -0
  776. package/src/services/otaDisplayState.ts +115 -0
  777. package/src/services/otaInstallPolicy.ts +106 -0
  778. package/src/services/otaLegacyMapping.ts +71 -0
  779. package/src/services/slimStreamStatus.ts +28 -0
  780. package/src/stores/apps.ts +614 -0
  781. package/src/stores/bluetoothSettingKeys.ts +36 -0
  782. package/src/stores/cloudClientStatus.ts +37 -0
  783. package/src/stores/connection.ts +69 -0
  784. package/src/stores/core.ts +32 -0
  785. package/src/stores/display.ts +121 -0
  786. package/src/stores/gallerySync.ts +380 -0
  787. package/src/stores/glasses.ts +309 -0
  788. package/src/stores/settings.ts +1001 -0
  789. package/src/types/applet.ts +112 -0
  790. package/src/types/asg.ts +58 -0
  791. package/src/types/capabilities/even-realities-g1.ts +67 -0
  792. package/src/types/capabilities/even-realities-g2.ts +88 -0
  793. package/src/types/capabilities/mentra-display.ts +75 -0
  794. package/src/types/capabilities/mentra-live.ts +103 -0
  795. package/src/types/capabilities/none.ts +76 -0
  796. package/src/types/capabilities/simulated-glasses.ts +76 -0
  797. package/src/types/capabilities/vuzix-z100.ts +64 -0
  798. package/src/types/enums.ts +43 -0
  799. package/src/types/hardware.ts +203 -0
  800. package/src/types/index.ts +37 -0
  801. package/src/utils/GlobalEventEmitter.ts +14 -0
  802. package/src/utils/cloudClient/RnUdpAdapter.ts +47 -0
  803. package/src/utils/cloudClient/cloudSecureStore.ts +28 -0
  804. package/src/utils/debouncedPatch.ts +28 -0
  805. package/src/utils/devLogging.ts +140 -0
  806. package/src/utils/devMiniappLaunch.ts +68 -0
  807. package/src/utils/diagnosticContext.ts +155 -0
  808. package/src/utils/display/composer/ColumnComposer.ts +285 -0
  809. package/src/utils/display/composer/index.ts +15 -0
  810. package/src/utils/display/helpers/DisplayHelpers.ts +413 -0
  811. package/src/utils/display/helpers/ScrollView.ts +337 -0
  812. package/src/utils/display/helpers/index.ts +14 -0
  813. package/src/utils/display/index.ts +273 -0
  814. package/src/utils/display/measurer/TextMeasurer.ts +346 -0
  815. package/src/utils/display/measurer/index.ts +21 -0
  816. package/src/utils/display/measurer/script-detection.ts +218 -0
  817. package/src/utils/display/profiles/g1.ts +236 -0
  818. package/src/utils/display/profiles/g2.ts +39 -0
  819. package/src/utils/display/profiles/index.ts +28 -0
  820. package/src/utils/display/profiles/nex.ts +166 -0
  821. package/src/utils/display/profiles/types.ts +132 -0
  822. package/src/utils/display/profiles/z100.ts +198 -0
  823. package/src/utils/display/scene/degrade.ts +80 -0
  824. package/src/utils/display/scene/differ.ts +128 -0
  825. package/src/utils/display/scene/index.ts +21 -0
  826. package/src/utils/display/scene/process.ts +214 -0
  827. package/src/utils/display/scene/store.ts +0 -0
  828. package/src/utils/display/scene/types.ts +0 -0
  829. package/src/utils/display/wrapper/TextWrapper.ts +546 -0
  830. package/src/utils/display/wrapper/index.ts +15 -0
  831. package/src/utils/display/wrapper/types.ts +102 -0
  832. package/src/utils/e2eMetrics.ts +30 -0
  833. package/src/utils/hardware/hardware.ts +166 -0
  834. package/src/utils/hardware/index.ts +1 -0
  835. package/src/utils/miniappGlobals.ts +260 -0
  836. package/src/utils/permissions/MediaLibraryPermissions.ts +161 -0
  837. package/src/utils/permissions/galleryDisplayName.ts +28 -0
  838. package/src/utils/storage/index.ts +2 -0
  839. package/src/utils/storage/storage.ts +101 -0
  840. package/src/utils/storage/zip.ts +13 -0
  841. package/src/utils/timers/index.ts +2 -0
  842. package/src/utils/timers/timers.ts +139 -0
@@ -0,0 +1,275 @@
1
+ /**
2
+ * pairing facade — `engine.pairing`: scan for nearby glasses + pair. Scan state
3
+ * (searching + results) comes from the engine core store; scan/connect go over the
4
+ * bluetooth-sdk; pair-failure / not-ready are the bluetooth-sdk events.
5
+ *
6
+ * (Connect-the-already-paired-default is `engine.glasses.connectDefault()`; this
7
+ * facade is the first-time discovery + pair flow.)
8
+ */
9
+ // Internal btsdk surface — updateBluetoothSettings (the Bluetooth Classic
10
+ // target hint) lives on the full surface, not the public entry (same reason
11
+ // the glasses facade imports internal).
12
+ import BluetoothSdk from "@mentra/bluetooth-sdk/internal";
13
+ import { useCoreStore } from "../stores/core";
14
+ import { useGlassesStore } from "../stores/glasses";
15
+ import { hasDefaultDevice } from "../services/DeviceStoreHydration";
16
+ import { markPendingSelection, projectPairingIdentity, subscribePairingIdentity, } from "../services/PairingIdentity";
17
+ import { isGlassesConnected, isGlassesLinkLayerBusy, isGlassesReady, waitForGlassesReady, } from "../services/GlassesReadiness";
18
+ import { logAutomaticReportSubmissionStatus, toAutomaticReportSubmissionStatus, } from "../services/AutomaticReportResult";
19
+ import { pushAllBluetoothSettings } from "../services/GlassesSettingsSync";
20
+ import { submitAutomaticReport } from "./reports";
21
+ const DEFAULT_PAIRING_BOOT_TIMEOUT_MS = 35_000;
22
+ const DEFAULT_BT_CLASSIC_TIMEOUT_MS = 1_000;
23
+ const DEFAULT_PAIRING_ROUTE = "/pairing/loading";
24
+ const LOG_TAG = "PairingTimeoutReport";
25
+ function projectReadiness() {
26
+ const s = useGlassesStore.getState();
27
+ return {
28
+ state: s.connection.state,
29
+ connected: s.connection.state === "connected",
30
+ fullyBooted: isGlassesReady(s.connection),
31
+ bluetoothClassicConnected: s.bluetoothClassicConnected,
32
+ nativeLinkBusy: isGlassesLinkLayerBusy(s.connection),
33
+ };
34
+ }
35
+ export async function submitPairingBootTimeoutReport(params) {
36
+ const { deviceModel, deviceName, showGlassesBooting, elapsedMs, route = DEFAULT_PAIRING_ROUTE } = params;
37
+ const result = await submitAutomaticReport({
38
+ kind: "automatic",
39
+ trigger: {
40
+ type: "automatic",
41
+ source: "pairing_loading",
42
+ reason: "glasses_connect_timeout",
43
+ },
44
+ report: {
45
+ expectedBehavior: `Glasses should connect successfully within ${Math.round(elapsedMs / 1000)} seconds.`,
46
+ actualBehavior: JSON.stringify({
47
+ deviceModel,
48
+ deviceName,
49
+ showGlassesBooting,
50
+ elapsedMs,
51
+ route,
52
+ }, null, 2),
53
+ systemPriority: "medium",
54
+ },
55
+ throttleKey: `pairing_timeout|${deviceModel || "unknown"}|${deviceName || "unknown"}`,
56
+ });
57
+ const status = toAutomaticReportSubmissionStatus(result);
58
+ logAutomaticReportSubmissionStatus(LOG_TAG, status, deviceModel, deviceName);
59
+ return status;
60
+ }
61
+ async function waitForReadyDuringPairing(options = {}) {
62
+ const timeoutMs = options.timeoutMs ?? DEFAULT_PAIRING_BOOT_TIMEOUT_MS;
63
+ let showGlassesBooting = false;
64
+ const notReadySub = BluetoothSdk.addListener("glasses_not_ready", () => {
65
+ showGlassesBooting = true;
66
+ });
67
+ try {
68
+ const ready = await waitForGlassesReady({
69
+ getConnection: () => useGlassesStore.getState().connection,
70
+ subscribe: (listener) => useGlassesStore.subscribe((state) => state.connection, listener),
71
+ timeoutMs,
72
+ signal: options.signal,
73
+ });
74
+ if (!ready && !options.signal?.aborted) {
75
+ void submitPairingBootTimeoutReport({
76
+ deviceModel: options.deviceModel,
77
+ deviceName: options.deviceName,
78
+ showGlassesBooting,
79
+ elapsedMs: timeoutMs,
80
+ route: options.route,
81
+ }).catch((error) => {
82
+ console.error(`[${LOG_TAG}] Unexpected error:`, error);
83
+ });
84
+ }
85
+ return ready;
86
+ }
87
+ finally {
88
+ notReadySub.remove();
89
+ }
90
+ }
91
+ async function waitForBluetoothClassic(options = {}) {
92
+ const timeoutMs = options.timeoutMs ?? DEFAULT_BT_CLASSIC_TIMEOUT_MS;
93
+ return new Promise((resolve) => {
94
+ if (options.signal?.aborted) {
95
+ resolve(false);
96
+ return;
97
+ }
98
+ const initial = useGlassesStore.getState().bluetoothClassicConnected;
99
+ if (initial) {
100
+ resolve(true);
101
+ return;
102
+ }
103
+ let settled = false;
104
+ let timeout = null;
105
+ let unsubscribe = null;
106
+ let onAbort = null;
107
+ const finish = (value) => {
108
+ if (settled)
109
+ return;
110
+ settled = true;
111
+ if (timeout)
112
+ clearTimeout(timeout);
113
+ if (unsubscribe)
114
+ unsubscribe();
115
+ if (onAbort && options.signal)
116
+ options.signal.removeEventListener("abort", onAbort);
117
+ resolve(value);
118
+ };
119
+ if (options.signal) {
120
+ onAbort = () => finish(false);
121
+ options.signal.addEventListener("abort", onAbort);
122
+ }
123
+ unsubscribe = useGlassesStore.subscribe((s) => s.bluetoothClassicConnected, (connected) => {
124
+ if (connected)
125
+ finish(true);
126
+ });
127
+ timeout = setTimeout(() => {
128
+ finish(useGlassesStore.getState().bluetoothClassicConnected);
129
+ }, timeoutMs);
130
+ });
131
+ }
132
+ export const pairing = {
133
+ readiness: () => projectReadiness(),
134
+ onReadiness: (cb) => {
135
+ let last = JSON.stringify(projectReadiness());
136
+ return useGlassesStore.subscribe(() => {
137
+ const snap = projectReadiness();
138
+ const key = JSON.stringify(snap);
139
+ if (key === last)
140
+ return;
141
+ last = key;
142
+ cb(snap);
143
+ });
144
+ },
145
+ // --- pairing-identity lifecycle (the PairingIdentity read-model + the JS-owned
146
+ // identity writes; promotion to `paired` only ever happens natively) ---
147
+ /** The identity lifecycle snapshot: none | pending (chosen, never paired) | paired. */
148
+ identity: () => projectPairingIdentity(),
149
+ /** Subscribe to identity changes; fires only when the projected snapshot changes.
150
+ * Returns an unsubscribe. */
151
+ onIdentity: (cb) => subscribePairingIdentity(cb),
152
+ /** Mark the chosen model as the pending selection (the scan-entry write); the
153
+ * host renders it as a finish-pairing affordance until pairing succeeds. */
154
+ markPendingSelection: (model) => markPendingSelection(model),
155
+ /** Start scanning for nearby glasses. Results land on `searchResults()`/`onFound()`. */
156
+ scan: (...args) => BluetoothSdk.startScan(...args),
157
+ /** Whether a scan is currently in progress. */
158
+ scanning: () => useCoreStore.getState().searching,
159
+ /** Subscribe to scan-in-progress changes; fires only when it changes. Returns an unsubscribe. */
160
+ onScanning: (cb) => useCoreStore.subscribe((s) => s.searching, cb),
161
+ /** Whether a controller scan is currently in progress. */
162
+ scanningController: () => useCoreStore.getState().searchingController,
163
+ /** Subscribe to controller-scan-in-progress changes; fires only when it changes. Returns an unsubscribe. */
164
+ onScanningController: (cb) => useCoreStore.subscribe((s) => s.searchingController, cb),
165
+ /** Whether the phone has another Bluetooth (audio) device connected — the BT Classic pairing hint. */
166
+ otherBtConnected: () => useCoreStore.getState().otherBtConnected,
167
+ /** Subscribe to other-Bluetooth-device-connected changes; fires only when it changes. Returns an unsubscribe. */
168
+ onOtherBtConnected: (cb) => useCoreStore.subscribe((s) => s.otherBtConnected, cb),
169
+ /** The current scan results (snapshot). */
170
+ // Copy the array AND each entry: neither the list nor the Device objects may
171
+ // leak as mutable references into the store.
172
+ searchResults: () => useCoreStore.getState().searchResults.map((result) => ({ ...result })),
173
+ /** Subscribe to scan-result changes; fires only when they change. Returns an unsubscribe. */
174
+ onFound: (cb) => {
175
+ let last = JSON.stringify(useCoreStore.getState().searchResults);
176
+ return useCoreStore.subscribe(() => {
177
+ const results = useCoreStore.getState().searchResults;
178
+ const key = JSON.stringify(results);
179
+ if (key === last)
180
+ return;
181
+ last = key;
182
+ // Copy like searchResults(): listeners must not mutate shared scan state.
183
+ cb(results.map((result) => ({ ...result })));
184
+ });
185
+ },
186
+ /**
187
+ * Pair with (connect to) a discovered device. Two-phase identity: the connect
188
+ * attempt only marks the device as pending (`saveAsDefault: false` — no eager
189
+ * default-device write); the native layer promotes it to the default wearable
190
+ * when pairing actually succeeds (handleDeviceReady), so an abandoned or
191
+ * failed attempt can't leave a default identity with no paired device behind.
192
+ */
193
+ pair: async (device, options) => {
194
+ await pushAllBluetoothSettings();
195
+ return BluetoothSdk.connect(device, { ...options, saveAsDefault: false });
196
+ },
197
+ /** Set a device as the default for subsequent `glasses.connectDefault()`. */
198
+ setDefault: (...args) => BluetoothSdk.setDefaultDevice(...args),
199
+ /**
200
+ * Prime the native Bluetooth Classic audio watcher with the picked device.
201
+ * The iOS Mentra Live flow pairs Classic audio BEFORE any BLE connect
202
+ * exists, and native detects the pairing by matching the connected audio
203
+ * route against its device_name — which two-phase identity no longer sets
204
+ * at selection time. This is native-only routing state (device_name has no
205
+ * native→JS echo): the phone's persisted identity is untouched, and
206
+ * promotion still happens only at pairing success.
207
+ */
208
+ setBluetoothClassicTarget: (device) => BluetoothSdk.updateBluetoothSettings({ device_name: device.name }),
209
+ /**
210
+ * Abandon an in-flight pairing attempt (back-out, failure retry, conflict
211
+ * retry) without destroying an existing pairing. The decision comes from the
212
+ * LIVE hydrated default-device read — never from flow-entry state, because a
213
+ * pairing can PROMOTE while the flow is open (the glasses finish pairing
214
+ * even as the user backs out of the UI), and an entry snapshot would forget
215
+ * that brand-new pairing:
216
+ * - Default device exists and glasses are connected (nothing in flight — an
217
+ * attempt drops the link first): stop the scan, touch nothing else.
218
+ * - Default device exists with an attempt in flight: cancel it, then re-seed
219
+ * the native identity from the phone's persisted settings — the attempt's
220
+ * connect-by-name overwrote the native device_name, so a later
221
+ * connectDefault() would otherwise target the abandoned device.
222
+ * - No default device (genuinely unpaired attempt): also forget, clearing
223
+ * the partial native pairing state.
224
+ * The read fails OPEN to "preserve" — a transient failure must never wipe a
225
+ * real pairing. The `pending_wearable` marker is deliberately left alone —
226
+ * the host renders it as a finish-pairing affordance.
227
+ */
228
+ abandonAttempt: async () => {
229
+ const nativeHasDefault = await hasDefaultDevice().catch(() => true);
230
+ if (nativeHasDefault && isGlassesConnected(useGlassesStore.getState().connection)) {
231
+ // Still connected means no connect attempt is in flight (an attempt drops
232
+ // the existing link first): the user browsed the scan and backed out.
233
+ // Stop the scan and leave the live pairing untouched.
234
+ console.log("PairingIdentity: abandonAttempt — pairing intact and connected; stopping scan only");
235
+ await BluetoothSdk.stopScan();
236
+ return;
237
+ }
238
+ await BluetoothSdk.disconnect();
239
+ if (projectPairingIdentity().kind === "paired") {
240
+ // The persisted settings describe a COMPLETE pairing: restore it to
241
+ // native (the attempt's connect-by-name overwrote the native
242
+ // device_name; and if native somehow lost its default entirely, this
243
+ // repairs the divergence instead of forgetting a real pairing).
244
+ console.log("PairingIdentity: abandonAttempt — preserving pairing; attempt cancelled, native identity re-seeded");
245
+ await pushAllBluetoothSettings();
246
+ }
247
+ else if (nativeHasDefault) {
248
+ // Mid-relay: native promoted and its echoes are still landing — the
249
+ // incomplete JS snapshot must not be pushed over the fresher native
250
+ // identity (the on-connect replay's race). Native holds the truth.
251
+ console.log("PairingIdentity: abandonAttempt — preserving pairing; JS identity mid-relay, native kept as-is");
252
+ }
253
+ else {
254
+ // Forgetting requires CONSENSUS: no native default AND no complete
255
+ // persisted pairing — a genuinely partial attempt.
256
+ console.log("PairingIdentity: abandonAttempt — no pairing on either layer; forgetting the partial attempt");
257
+ await BluetoothSdk.forget();
258
+ }
259
+ },
260
+ /** Subscribe to pairing failures; returns an unsubscribe. */
261
+ onPairFailure: (cb) => {
262
+ const sub = BluetoothSdk.addListener("pair_failure", cb);
263
+ return () => sub.remove();
264
+ },
265
+ /** Subscribe to glasses-not-ready events during pairing; returns an unsubscribe. */
266
+ onGlassesNotReady: (cb) => {
267
+ const sub = BluetoothSdk.addListener("glasses_not_ready", cb);
268
+ return () => sub.remove();
269
+ },
270
+ /** Wait for paired glasses to finish booting; engine files the timeout diagnostic. */
271
+ waitForReady: waitForReadyDuringPairing,
272
+ /** Wait briefly for Bluetooth Classic to come up after BLE pairing. */
273
+ waitForBluetoothClassic,
274
+ };
275
+ //# sourceMappingURL=pairing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pairing.js","sourceRoot":"","sources":["../../src/facades/pairing.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * pairing facade — `engine.pairing`: scan for nearby glasses + pair. Scan state\n * (searching + results) comes from the engine core store; scan/connect go over the\n * bluetooth-sdk; pair-failure / not-ready are the bluetooth-sdk events.\n *\n * (Connect-the-already-paired-default is `engine.glasses.connectDefault()`; this\n * facade is the first-time discovery + pair flow.)\n */\n// Internal btsdk surface — updateBluetoothSettings (the Bluetooth Classic\n// target hint) lives on the full surface, not the public entry (same reason\n// the glasses facade imports internal).\nimport BluetoothSdk from \"@mentra/bluetooth-sdk/internal\"\nimport type {ConnectOptions, Device, PairFailureEvent, GlassesNotReadyEvent} from \"@mentra/bluetooth-sdk\"\nimport {useCoreStore} from \"../stores/core\"\nimport {useGlassesStore} from \"../stores/glasses\"\nimport {hasDefaultDevice} from \"../services/DeviceStoreHydration\"\nimport {\n markPendingSelection,\n projectPairingIdentity,\n subscribePairingIdentity,\n type IdentitySnapshot,\n} from \"../services/PairingIdentity\"\nimport {\n isGlassesConnected,\n isGlassesLinkLayerBusy,\n isGlassesReady,\n waitForGlassesReady,\n} from \"../services/GlassesReadiness\"\nimport {\n logAutomaticReportSubmissionStatus,\n toAutomaticReportSubmissionStatus,\n type AutomaticReportSubmissionStatus,\n} from \"../services/AutomaticReportResult\"\nimport {pushAllBluetoothSettings} from \"../services/GlassesSettingsSync\"\nimport {submitAutomaticReport} from \"./reports\"\n\nexport type {IdentitySnapshot} from \"../services/PairingIdentity\"\n\nexport interface PairingReadyWaitOptions {\n deviceModel?: string\n deviceName?: string\n timeoutMs?: number\n route?: string\n signal?: AbortSignal\n}\n\nconst DEFAULT_PAIRING_BOOT_TIMEOUT_MS = 35_000\nconst DEFAULT_BT_CLASSIC_TIMEOUT_MS = 1_000\nconst DEFAULT_PAIRING_ROUTE = \"/pairing/loading\"\nconst LOG_TAG = \"PairingTimeoutReport\"\n\nfunction projectReadiness() {\n const s = useGlassesStore.getState()\n return {\n state: s.connection.state,\n connected: s.connection.state === \"connected\",\n fullyBooted: isGlassesReady(s.connection),\n bluetoothClassicConnected: s.bluetoothClassicConnected,\n nativeLinkBusy: isGlassesLinkLayerBusy(s.connection),\n }\n}\n\nexport type PairingReadinessSnapshot = ReturnType<typeof projectReadiness>\n\nexport async function submitPairingBootTimeoutReport(params: {\n deviceModel?: string\n deviceName?: string\n showGlassesBooting: boolean\n elapsedMs: number\n route?: string\n}): Promise<AutomaticReportSubmissionStatus> {\n const {deviceModel, deviceName, showGlassesBooting, elapsedMs, route = DEFAULT_PAIRING_ROUTE} = params\n const result = await submitAutomaticReport({\n kind: \"automatic\",\n trigger: {\n type: \"automatic\",\n source: \"pairing_loading\",\n reason: \"glasses_connect_timeout\",\n },\n report: {\n expectedBehavior: `Glasses should connect successfully within ${Math.round(elapsedMs / 1000)} seconds.`,\n actualBehavior: JSON.stringify(\n {\n deviceModel,\n deviceName,\n showGlassesBooting,\n elapsedMs,\n route,\n },\n null,\n 2,\n ),\n systemPriority: \"medium\",\n },\n throttleKey: `pairing_timeout|${deviceModel || \"unknown\"}|${deviceName || \"unknown\"}`,\n })\n\n const status = toAutomaticReportSubmissionStatus(result)\n logAutomaticReportSubmissionStatus(LOG_TAG, status, deviceModel, deviceName)\n return status\n}\n\nasync function waitForReadyDuringPairing(options: PairingReadyWaitOptions = {}): Promise<boolean> {\n const timeoutMs = options.timeoutMs ?? DEFAULT_PAIRING_BOOT_TIMEOUT_MS\n let showGlassesBooting = false\n const notReadySub = BluetoothSdk.addListener(\"glasses_not_ready\", () => {\n showGlassesBooting = true\n })\n\n try {\n const ready = await waitForGlassesReady({\n getConnection: () => useGlassesStore.getState().connection,\n subscribe: (listener) => useGlassesStore.subscribe((state) => state.connection, listener),\n timeoutMs,\n signal: options.signal,\n })\n\n if (!ready && !options.signal?.aborted) {\n void submitPairingBootTimeoutReport({\n deviceModel: options.deviceModel,\n deviceName: options.deviceName,\n showGlassesBooting,\n elapsedMs: timeoutMs,\n route: options.route,\n }).catch((error) => {\n console.error(`[${LOG_TAG}] Unexpected error:`, error)\n })\n }\n\n return ready\n } finally {\n notReadySub.remove()\n }\n}\n\nasync function waitForBluetoothClassic(\n options: Pick<PairingReadyWaitOptions, \"timeoutMs\" | \"signal\"> = {},\n): Promise<boolean> {\n const timeoutMs = options.timeoutMs ?? DEFAULT_BT_CLASSIC_TIMEOUT_MS\n return new Promise((resolve) => {\n if (options.signal?.aborted) {\n resolve(false)\n return\n }\n\n const initial = useGlassesStore.getState().bluetoothClassicConnected\n if (initial) {\n resolve(true)\n return\n }\n\n let settled = false\n let timeout: ReturnType<typeof setTimeout> | null = null\n let unsubscribe: (() => void) | null = null\n let onAbort: (() => void) | null = null\n\n const finish = (value: boolean) => {\n if (settled) return\n settled = true\n if (timeout) clearTimeout(timeout)\n if (unsubscribe) unsubscribe()\n if (onAbort && options.signal) options.signal.removeEventListener(\"abort\", onAbort)\n resolve(value)\n }\n\n if (options.signal) {\n onAbort = () => finish(false)\n options.signal.addEventListener(\"abort\", onAbort)\n }\n\n unsubscribe = useGlassesStore.subscribe(\n (s) => s.bluetoothClassicConnected,\n (connected) => {\n if (connected) finish(true)\n },\n )\n\n timeout = setTimeout(() => {\n finish(useGlassesStore.getState().bluetoothClassicConnected)\n }, timeoutMs)\n })\n}\n\nexport const pairing = {\n readiness: (): PairingReadinessSnapshot => projectReadiness(),\n onReadiness: (cb: (readiness: PairingReadinessSnapshot) => void): (() => void) => {\n let last = JSON.stringify(projectReadiness())\n return useGlassesStore.subscribe(() => {\n const snap = projectReadiness()\n const key = JSON.stringify(snap)\n if (key === last) return\n last = key\n cb(snap)\n })\n },\n\n // --- pairing-identity lifecycle (the PairingIdentity read-model + the JS-owned\n // identity writes; promotion to `paired` only ever happens natively) ---\n /** The identity lifecycle snapshot: none | pending (chosen, never paired) | paired. */\n identity: (): IdentitySnapshot => projectPairingIdentity(),\n /** Subscribe to identity changes; fires only when the projected snapshot changes.\n * Returns an unsubscribe. */\n onIdentity: (cb: (identity: IdentitySnapshot) => void): (() => void) => subscribePairingIdentity(cb),\n /** Mark the chosen model as the pending selection (the scan-entry write); the\n * host renders it as a finish-pairing affordance until pairing succeeds. */\n markPendingSelection: (model: string) => markPendingSelection(model),\n\n /** Start scanning for nearby glasses. Results land on `searchResults()`/`onFound()`. */\n scan: (...args: Parameters<typeof BluetoothSdk.startScan>) => BluetoothSdk.startScan(...args),\n /** Whether a scan is currently in progress. */\n scanning: (): boolean => useCoreStore.getState().searching,\n /** Subscribe to scan-in-progress changes; fires only when it changes. Returns an unsubscribe. */\n onScanning: (cb: (scanning: boolean) => void): (() => void) => useCoreStore.subscribe((s) => s.searching, cb),\n /** Whether a controller scan is currently in progress. */\n scanningController: (): boolean => useCoreStore.getState().searchingController,\n /** Subscribe to controller-scan-in-progress changes; fires only when it changes. Returns an unsubscribe. */\n onScanningController: (cb: (scanning: boolean) => void): (() => void) =>\n useCoreStore.subscribe((s) => s.searchingController, cb),\n /** Whether the phone has another Bluetooth (audio) device connected — the BT Classic pairing hint. */\n otherBtConnected: (): boolean => useCoreStore.getState().otherBtConnected,\n /** Subscribe to other-Bluetooth-device-connected changes; fires only when it changes. Returns an unsubscribe. */\n onOtherBtConnected: (cb: (connected: boolean) => void): (() => void) =>\n useCoreStore.subscribe((s) => s.otherBtConnected, cb),\n /** The current scan results (snapshot). */\n // Copy the array AND each entry: neither the list nor the Device objects may\n // leak as mutable references into the store.\n searchResults: () => useCoreStore.getState().searchResults.map((result) => ({...result})),\n /** Subscribe to scan-result changes; fires only when they change. Returns an unsubscribe. */\n onFound: (cb: (results: ReturnType<typeof useCoreStore.getState>[\"searchResults\"]) => void): (() => void) => {\n let last = JSON.stringify(useCoreStore.getState().searchResults)\n return useCoreStore.subscribe(() => {\n const results = useCoreStore.getState().searchResults\n const key = JSON.stringify(results)\n if (key === last) return\n last = key\n // Copy like searchResults(): listeners must not mutate shared scan state.\n cb(results.map((result) => ({...result})))\n })\n },\n\n /**\n * Pair with (connect to) a discovered device. Two-phase identity: the connect\n * attempt only marks the device as pending (`saveAsDefault: false` — no eager\n * default-device write); the native layer promotes it to the default wearable\n * when pairing actually succeeds (handleDeviceReady), so an abandoned or\n * failed attempt can't leave a default identity with no paired device behind.\n */\n pair: async (device: Device, options?: ConnectOptions): Promise<void> => {\n await pushAllBluetoothSettings()\n return BluetoothSdk.connect(device, {...options, saveAsDefault: false})\n },\n /** Set a device as the default for subsequent `glasses.connectDefault()`. */\n setDefault: (...args: Parameters<typeof BluetoothSdk.setDefaultDevice>) => BluetoothSdk.setDefaultDevice(...args),\n /**\n * Prime the native Bluetooth Classic audio watcher with the picked device.\n * The iOS Mentra Live flow pairs Classic audio BEFORE any BLE connect\n * exists, and native detects the pairing by matching the connected audio\n * route against its device_name — which two-phase identity no longer sets\n * at selection time. This is native-only routing state (device_name has no\n * native→JS echo): the phone's persisted identity is untouched, and\n * promotion still happens only at pairing success.\n */\n setBluetoothClassicTarget: (device: Device): Promise<void> =>\n BluetoothSdk.updateBluetoothSettings({device_name: device.name}),\n /**\n * Abandon an in-flight pairing attempt (back-out, failure retry, conflict\n * retry) without destroying an existing pairing. The decision comes from the\n * LIVE hydrated default-device read — never from flow-entry state, because a\n * pairing can PROMOTE while the flow is open (the glasses finish pairing\n * even as the user backs out of the UI), and an entry snapshot would forget\n * that brand-new pairing:\n * - Default device exists and glasses are connected (nothing in flight — an\n * attempt drops the link first): stop the scan, touch nothing else.\n * - Default device exists with an attempt in flight: cancel it, then re-seed\n * the native identity from the phone's persisted settings — the attempt's\n * connect-by-name overwrote the native device_name, so a later\n * connectDefault() would otherwise target the abandoned device.\n * - No default device (genuinely unpaired attempt): also forget, clearing\n * the partial native pairing state.\n * The read fails OPEN to \"preserve\" — a transient failure must never wipe a\n * real pairing. The `pending_wearable` marker is deliberately left alone —\n * the host renders it as a finish-pairing affordance.\n */\n abandonAttempt: async (): Promise<void> => {\n const nativeHasDefault = await hasDefaultDevice().catch(() => true)\n if (nativeHasDefault && isGlassesConnected(useGlassesStore.getState().connection)) {\n // Still connected means no connect attempt is in flight (an attempt drops\n // the existing link first): the user browsed the scan and backed out.\n // Stop the scan and leave the live pairing untouched.\n console.log(\"PairingIdentity: abandonAttempt — pairing intact and connected; stopping scan only\")\n await BluetoothSdk.stopScan()\n return\n }\n await BluetoothSdk.disconnect()\n if (projectPairingIdentity().kind === \"paired\") {\n // The persisted settings describe a COMPLETE pairing: restore it to\n // native (the attempt's connect-by-name overwrote the native\n // device_name; and if native somehow lost its default entirely, this\n // repairs the divergence instead of forgetting a real pairing).\n console.log(\"PairingIdentity: abandonAttempt — preserving pairing; attempt cancelled, native identity re-seeded\")\n await pushAllBluetoothSettings()\n } else if (nativeHasDefault) {\n // Mid-relay: native promoted and its echoes are still landing — the\n // incomplete JS snapshot must not be pushed over the fresher native\n // identity (the on-connect replay's race). Native holds the truth.\n console.log(\"PairingIdentity: abandonAttempt — preserving pairing; JS identity mid-relay, native kept as-is\")\n } else {\n // Forgetting requires CONSENSUS: no native default AND no complete\n // persisted pairing — a genuinely partial attempt.\n console.log(\"PairingIdentity: abandonAttempt — no pairing on either layer; forgetting the partial attempt\")\n await BluetoothSdk.forget()\n }\n },\n\n /** Subscribe to pairing failures; returns an unsubscribe. */\n onPairFailure: (cb: (event: PairFailureEvent) => void): (() => void) => {\n const sub = BluetoothSdk.addListener(\"pair_failure\", cb)\n return () => sub.remove()\n },\n /** Subscribe to glasses-not-ready events during pairing; returns an unsubscribe. */\n onGlassesNotReady: (cb: (event: GlassesNotReadyEvent) => void): (() => void) => {\n const sub = BluetoothSdk.addListener(\"glasses_not_ready\", cb)\n return () => sub.remove()\n },\n /** Wait for paired glasses to finish booting; engine files the timeout diagnostic. */\n waitForReady: waitForReadyDuringPairing,\n /** Wait briefly for Bluetooth Classic to come up after BLE pairing. */\n waitForBluetoothClassic,\n}\n"]}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * permissions facade — `engine.permissions`: the raw OS-permission ops the runtime
3
+ * needs, mapped from feature keys to react-native-permissions. This is the LEAN
4
+ * surface (check/request/openSettings/requirementsForMiniapp) — the host keeps its
5
+ * own UI helpers (rationale dialogs, denied-warnings) on top; engine stays free of
6
+ * i18n/theme/AlertUtils.
7
+ */
8
+ import { PermissionsAndroid, type Permission as AndroidPermission } from "react-native";
9
+ import type { AppletPermission } from "../types";
10
+ /** OEM-facing feature keys (mapped to OS permissions per platform). */
11
+ export declare const PermissionFeatures: {
12
+ readonly MICROPHONE: "microphone";
13
+ readonly CAMERA: "camera";
14
+ readonly CALENDAR: "calendar";
15
+ readonly LOCATION: "location";
16
+ readonly LOCAL_WIFI: "local_wifi";
17
+ readonly BACKGROUND_LOCATION: "background_location";
18
+ readonly BLUETOOTH: "bluetooth";
19
+ readonly PHONE_STATE: "phone_state";
20
+ readonly POST_NOTIFICATIONS: "post_notifications";
21
+ };
22
+ export declare function localWifiPermissionForAndroid(androidApiLevel: number, androidPermissions?: typeof PermissionsAndroid.PERMISSIONS): AndroidPermission;
23
+ export declare const permissions: {
24
+ /** Is the given feature's OS permission currently granted? */
25
+ check(feature: string): Promise<boolean>;
26
+ /** Request the given feature's OS permission. Resolves to whether it's granted. */
27
+ request(feature: string): Promise<boolean>;
28
+ /** Open the OS settings app (so the user can grant a blocked permission). */
29
+ openSettings: () => Promise<void>;
30
+ /** The permissions a given installed miniapp declares it needs. */
31
+ requirementsForMiniapp(packageName: string): Promise<AppletPermission[]>;
32
+ };
33
+ //# sourceMappingURL=permissions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../src/facades/permissions.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAoB,kBAAkB,EAAE,KAAK,UAAU,IAAI,iBAAiB,EAAC,MAAM,cAAc,CAAA;AAIxG,OAAO,KAAK,EAAC,gBAAgB,EAAC,MAAM,UAAU,CAAA;AAE9C,uEAAuE;AACvE,eAAO,MAAM,kBAAkB;;;;;;;;;;CAUrB,CAAA;AAMV,wBAAgB,6BAA6B,CAC3C,eAAe,EAAE,MAAM,EACvB,kBAAkB,GAAE,OAAO,kBAAkB,CAAC,WAAqB,GAClE,iBAAiB,CAEnB;AAgFD,eAAO,MAAM,WAAW;IACtB,8DAA8D;mBACzC,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAmB9C,mFAAmF;qBAC5D,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAmBhD,6EAA6E;wBAC3D,OAAO,CAAC,IAAI,CAAC;IAE/B,mEAAmE;wCACzB,MAAM,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;CAI/E,CAAA"}
@@ -0,0 +1,155 @@
1
+ /**
2
+ * permissions facade — `engine.permissions`: the raw OS-permission ops the runtime
3
+ * needs, mapped from feature keys to react-native-permissions. This is the LEAN
4
+ * surface (check/request/openSettings/requirementsForMiniapp) — the host keeps its
5
+ * own UI helpers (rationale dialogs, denied-warnings) on top; engine stays free of
6
+ * i18n/theme/AlertUtils.
7
+ */
8
+ import { Platform, Linking, PermissionsAndroid } from "react-native";
9
+ import { check, request, PERMISSIONS, RESULTS } from "react-native-permissions";
10
+ import appRegistry from "../services/AppRegistry";
11
+ /** OEM-facing feature keys (mapped to OS permissions per platform). */
12
+ export const PermissionFeatures = {
13
+ MICROPHONE: "microphone",
14
+ CAMERA: "camera",
15
+ CALENDAR: "calendar",
16
+ LOCATION: "location",
17
+ LOCAL_WIFI: "local_wifi",
18
+ BACKGROUND_LOCATION: "background_location",
19
+ BLUETOOTH: "bluetooth",
20
+ PHONE_STATE: "phone_state",
21
+ POST_NOTIFICATIONS: "post_notifications",
22
+ };
23
+ const ANDROID = PermissionsAndroid.PERMISSIONS;
24
+ const apiLevel = typeof Platform.Version === "number" ? Platform.Version : parseInt(String(Platform.Version), 10);
25
+ const requiresSeparateAndroidBackgroundLocation = apiLevel >= 29;
26
+ export function localWifiPermissionForAndroid(androidApiLevel, androidPermissions = ANDROID) {
27
+ return androidApiLevel >= 33 ? androidPermissions.NEARBY_WIFI_DEVICES : androidPermissions.ACCESS_FINE_LOCATION;
28
+ }
29
+ async function areAndroidPermissionsGranted(perms) {
30
+ for (const p of perms) {
31
+ if (!(await PermissionsAndroid.check(p)))
32
+ return false;
33
+ }
34
+ return true;
35
+ }
36
+ async function requestAndroidPermissions(perms) {
37
+ const results = await PermissionsAndroid.requestMultiple(perms);
38
+ return perms.every((p) => results[p] === PermissionsAndroid.RESULTS.GRANTED);
39
+ }
40
+ async function checkAndroidBackgroundLocation() {
41
+ const hasForegroundLocation = await areAndroidPermissionsGranted([ANDROID.ACCESS_FINE_LOCATION]);
42
+ if (!hasForegroundLocation || !requiresSeparateAndroidBackgroundLocation)
43
+ return hasForegroundLocation;
44
+ return PermissionsAndroid.check(ANDROID.ACCESS_BACKGROUND_LOCATION);
45
+ }
46
+ async function requestAndroidBackgroundLocation() {
47
+ const hasForegroundLocation = await requestAndroidPermissions([ANDROID.ACCESS_FINE_LOCATION]);
48
+ if (!hasForegroundLocation || !requiresSeparateAndroidBackgroundLocation)
49
+ return hasForegroundLocation;
50
+ if (await PermissionsAndroid.check(ANDROID.ACCESS_BACKGROUND_LOCATION))
51
+ return true;
52
+ const result = await PermissionsAndroid.request(ANDROID.ACCESS_BACKGROUND_LOCATION);
53
+ return result === PermissionsAndroid.RESULTS.GRANTED;
54
+ }
55
+ function iosPerms(feature) {
56
+ switch (feature) {
57
+ case PermissionFeatures.MICROPHONE:
58
+ return [PERMISSIONS.IOS.MICROPHONE];
59
+ case PermissionFeatures.CAMERA:
60
+ return [PERMISSIONS.IOS.CAMERA];
61
+ case PermissionFeatures.CALENDAR:
62
+ return [PERMISSIONS.IOS.CALENDARS];
63
+ case PermissionFeatures.LOCATION:
64
+ return [PERMISSIONS.IOS.LOCATION_WHEN_IN_USE];
65
+ case PermissionFeatures.LOCAL_WIFI:
66
+ return [];
67
+ case PermissionFeatures.BACKGROUND_LOCATION:
68
+ // iOS won't grant ALWAYS without WHEN_IN_USE first — request both (matches
69
+ // the host PermissionsUtils mapping), else a cold request can't escalate.
70
+ return [PERMISSIONS.IOS.LOCATION_WHEN_IN_USE, PERMISSIONS.IOS.LOCATION_ALWAYS];
71
+ case PermissionFeatures.BLUETOOTH:
72
+ return [PERMISSIONS.IOS.BLUETOOTH];
73
+ default:
74
+ return [];
75
+ }
76
+ }
77
+ function androidPerms(feature) {
78
+ switch (feature) {
79
+ case PermissionFeatures.MICROPHONE:
80
+ return [ANDROID.RECORD_AUDIO];
81
+ case PermissionFeatures.CAMERA:
82
+ return [ANDROID.CAMERA];
83
+ case PermissionFeatures.CALENDAR:
84
+ // Expo Calendar requires both grants on Android, including for read APIs.
85
+ // The miniapp-facing calendar API remains read-only.
86
+ return [ANDROID.READ_CALENDAR, ANDROID.WRITE_CALENDAR];
87
+ case PermissionFeatures.LOCATION:
88
+ case PermissionFeatures.BACKGROUND_LOCATION:
89
+ return [ANDROID.ACCESS_FINE_LOCATION];
90
+ case PermissionFeatures.LOCAL_WIFI:
91
+ return [localWifiPermissionForAndroid(apiLevel)];
92
+ case PermissionFeatures.PHONE_STATE:
93
+ return [ANDROID.READ_PHONE_STATE];
94
+ case PermissionFeatures.BLUETOOTH:
95
+ return apiLevel >= 31 ? [ANDROID.BLUETOOTH_SCAN, ANDROID.BLUETOOTH_CONNECT, ANDROID.BLUETOOTH_ADVERTISE] : [];
96
+ case PermissionFeatures.POST_NOTIFICATIONS:
97
+ return apiLevel >= 33 ? [ANDROID.POST_NOTIFICATIONS] : [];
98
+ default:
99
+ return [];
100
+ }
101
+ }
102
+ export const permissions = {
103
+ /** Is the given feature's OS permission currently granted? */
104
+ async check(feature) {
105
+ if (Platform.OS === "android") {
106
+ if (feature === PermissionFeatures.BACKGROUND_LOCATION)
107
+ return checkAndroidBackgroundLocation();
108
+ const perms = androidPerms(feature);
109
+ if (perms.length === 0)
110
+ return true; // nothing to ask on this OS/version
111
+ // Every permission in the group must be granted (e.g. bluetooth =
112
+ // scan+connect+advertise, calendar = read+write) — matches the iOS branch.
113
+ return areAndroidPermissionsGranted(perms);
114
+ }
115
+ const perms = iosPerms(feature);
116
+ if (perms.length === 0)
117
+ return true;
118
+ for (const p of perms) {
119
+ const status = await check(p);
120
+ if (status !== RESULTS.GRANTED && status !== RESULTS.LIMITED)
121
+ return false;
122
+ }
123
+ return true;
124
+ },
125
+ /** Request the given feature's OS permission. Resolves to whether it's granted. */
126
+ async request(feature) {
127
+ if (Platform.OS === "android") {
128
+ if (feature === PermissionFeatures.BACKGROUND_LOCATION)
129
+ return requestAndroidBackgroundLocation();
130
+ const perms = androidPerms(feature);
131
+ if (perms.length === 0)
132
+ return true;
133
+ // Granted only when EVERY permission in the group was granted.
134
+ return requestAndroidPermissions(perms);
135
+ }
136
+ const perms = iosPerms(feature);
137
+ if (perms.length === 0)
138
+ return true;
139
+ let granted = true;
140
+ for (const p of perms) {
141
+ const result = await request(p);
142
+ if (result !== RESULTS.GRANTED && result !== RESULTS.LIMITED)
143
+ granted = false;
144
+ }
145
+ return granted;
146
+ },
147
+ /** Open the OS settings app (so the user can grant a blocked permission). */
148
+ openSettings: () => Linking.openSettings(),
149
+ /** The permissions a given installed miniapp declares it needs. */
150
+ async requirementsForMiniapp(packageName) {
151
+ const apps = await appRegistry.getInstalledMiniapps();
152
+ return apps.find((a) => a.packageName === packageName)?.permissions ?? [];
153
+ },
154
+ };
155
+ //# sourceMappingURL=permissions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../src/facades/permissions.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAC,QAAQ,EAAE,OAAO,EAAE,kBAAkB,EAAuC,MAAM,cAAc,CAAA;AACxG,OAAO,EAAC,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAkB,MAAM,0BAA0B,CAAA;AAE9F,OAAO,WAAW,MAAM,yBAAyB,CAAA;AAGjD,uEAAuE;AACvE,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,UAAU,EAAE,YAAY;IACxB,MAAM,EAAE,QAAQ;IAChB,QAAQ,EAAE,UAAU;IACpB,QAAQ,EAAE,UAAU;IACpB,UAAU,EAAE,YAAY;IACxB,mBAAmB,EAAE,qBAAqB;IAC1C,SAAS,EAAE,WAAW;IACtB,WAAW,EAAE,aAAa;IAC1B,kBAAkB,EAAE,oBAAoB;CAChC,CAAA;AAEV,MAAM,OAAO,GAAG,kBAAkB,CAAC,WAAW,CAAA;AAC9C,MAAM,QAAQ,GAAG,OAAO,QAAQ,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAA;AACjH,MAAM,yCAAyC,GAAG,QAAQ,IAAI,EAAE,CAAA;AAEhE,MAAM,UAAU,6BAA6B,CAC3C,eAAuB,EACvB,qBAA4D,OAAO;IAEnE,OAAO,eAAe,IAAI,EAAE,CAAC,CAAC,CAAC,kBAAkB,CAAC,mBAAmB,CAAC,CAAC,CAAC,kBAAkB,CAAC,oBAAoB,CAAA;AACjH,CAAC;AAED,KAAK,UAAU,4BAA4B,CAAC,KAA0B;IACpE,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC,CAAC,MAAM,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAAE,OAAO,KAAK,CAAA;IACxD,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,KAAK,UAAU,yBAAyB,CAAC,KAA0B;IACjE,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC,eAAe,CAAC,KAAK,CAAC,CAAA;IAC/D,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,kBAAkB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;AAC9E,CAAC;AAED,KAAK,UAAU,8BAA8B;IAC3C,MAAM,qBAAqB,GAAG,MAAM,4BAA4B,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,CAAA;IAChG,IAAI,CAAC,qBAAqB,IAAI,CAAC,yCAAyC;QAAE,OAAO,qBAAqB,CAAA;IAEtG,OAAO,kBAAkB,CAAC,KAAK,CAAC,OAAO,CAAC,0BAA0B,CAAC,CAAA;AACrE,CAAC;AAED,KAAK,UAAU,gCAAgC;IAC7C,MAAM,qBAAqB,GAAG,MAAM,yBAAyB,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,CAAA;IAC7F,IAAI,CAAC,qBAAqB,IAAI,CAAC,yCAAyC;QAAE,OAAO,qBAAqB,CAAA;IAEtG,IAAI,MAAM,kBAAkB,CAAC,KAAK,CAAC,OAAO,CAAC,0BAA0B,CAAC;QAAE,OAAO,IAAI,CAAA;IAEnF,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,OAAO,CAAC,0BAA0B,CAAC,CAAA;IACnF,OAAO,MAAM,KAAK,kBAAkB,CAAC,OAAO,CAAC,OAAO,CAAA;AACtD,CAAC;AAED,SAAS,QAAQ,CAAC,OAAe;IAC/B,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,kBAAkB,CAAC,UAAU;YAChC,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;QACrC,KAAK,kBAAkB,CAAC,MAAM;YAC5B,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QACjC,KAAK,kBAAkB,CAAC,QAAQ;YAC9B,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QACpC,KAAK,kBAAkB,CAAC,QAAQ;YAC9B,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAA;QAC/C,KAAK,kBAAkB,CAAC,UAAU;YAChC,OAAO,EAAE,CAAA;QACX,KAAK,kBAAkB,CAAC,mBAAmB;YACzC,2EAA2E;YAC3E,0EAA0E;YAC1E,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,oBAAoB,EAAE,WAAW,CAAC,GAAG,CAAC,eAAe,CAAC,CAAA;QAChF,KAAK,kBAAkB,CAAC,SAAS;YAC/B,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QACpC;YACE,OAAO,EAAE,CAAA;IACb,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,OAAe;IACnC,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,kBAAkB,CAAC,UAAU;YAChC,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,CAAA;QAC/B,KAAK,kBAAkB,CAAC,MAAM;YAC5B,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;QACzB,KAAK,kBAAkB,CAAC,QAAQ;YAC9B,0EAA0E;YAC1E,qDAAqD;YACrD,OAAO,CAAC,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,cAAc,CAAC,CAAA;QACxD,KAAK,kBAAkB,CAAC,QAAQ,CAAC;QACjC,KAAK,kBAAkB,CAAC,mBAAmB;YACzC,OAAO,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAA;QACvC,KAAK,kBAAkB,CAAC,UAAU;YAChC,OAAO,CAAC,6BAA6B,CAAC,QAAQ,CAAC,CAAC,CAAA;QAClD,KAAK,kBAAkB,CAAC,WAAW;YACjC,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAA;QACnC,KAAK,kBAAkB,CAAC,SAAS;YAC/B,OAAO,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,OAAO,CAAC,iBAAiB,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;QAC/G,KAAK,kBAAkB,CAAC,kBAAkB;YACxC,OAAO,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;QAC3D;YACE,OAAO,EAAE,CAAA;IACb,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,8DAA8D;IAC9D,KAAK,CAAC,KAAK,CAAC,OAAe;QACzB,IAAI,QAAQ,CAAC,EAAE,KAAK,SAAS,EAAE,CAAC;YAC9B,IAAI,OAAO,KAAK,kBAAkB,CAAC,mBAAmB;gBAAE,OAAO,8BAA8B,EAAE,CAAA;YAE/F,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,CAAA;YACnC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,IAAI,CAAA,CAAC,oCAAoC;YACxE,kEAAkE;YAClE,2EAA2E;YAC3E,OAAO,4BAA4B,CAAC,KAAK,CAAC,CAAA;QAC5C,CAAC;QACD,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAA;QAC/B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAA;QACnC,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,CAAC,CAAC,CAAA;YAC7B,IAAI,MAAM,KAAK,OAAO,CAAC,OAAO,IAAI,MAAM,KAAK,OAAO,CAAC,OAAO;gBAAE,OAAO,KAAK,CAAA;QAC5E,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IAED,mFAAmF;IACnF,KAAK,CAAC,OAAO,CAAC,OAAe;QAC3B,IAAI,QAAQ,CAAC,EAAE,KAAK,SAAS,EAAE,CAAC;YAC9B,IAAI,OAAO,KAAK,kBAAkB,CAAC,mBAAmB;gBAAE,OAAO,gCAAgC,EAAE,CAAA;YAEjG,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,CAAA;YACnC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,IAAI,CAAA;YACnC,+DAA+D;YAC/D,OAAO,yBAAyB,CAAC,KAAK,CAAC,CAAA;QACzC,CAAC;QACD,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAA;QAC/B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAA;QACnC,IAAI,OAAO,GAAG,IAAI,CAAA;QAClB,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,CAAC,CAAC,CAAA;YAC/B,IAAI,MAAM,KAAK,OAAO,CAAC,OAAO,IAAI,MAAM,KAAK,OAAO,CAAC,OAAO;gBAAE,OAAO,GAAG,KAAK,CAAA;QAC/E,CAAC;QACD,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,6EAA6E;IAC7E,YAAY,EAAE,GAAkB,EAAE,CAAC,OAAO,CAAC,YAAY,EAAE;IAEzD,mEAAmE;IACnE,KAAK,CAAC,sBAAsB,CAAC,WAAmB;QAC9C,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,oBAAoB,EAAE,CAAA;QACrD,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,KAAK,WAAW,CAAC,EAAE,WAAW,IAAI,EAAE,CAAA;IAC3E,CAAC;CACF,CAAA","sourcesContent":["/**\n * permissions facade — `engine.permissions`: the raw OS-permission ops the runtime\n * needs, mapped from feature keys to react-native-permissions. This is the LEAN\n * surface (check/request/openSettings/requirementsForMiniapp) — the host keeps its\n * own UI helpers (rationale dialogs, denied-warnings) on top; engine stays free of\n * i18n/theme/AlertUtils.\n */\nimport {Platform, Linking, PermissionsAndroid, type Permission as AndroidPermission} from \"react-native\"\nimport {check, request, PERMISSIONS, RESULTS, type Permission} from \"react-native-permissions\"\n\nimport appRegistry from \"../services/AppRegistry\"\nimport type {AppletPermission} from \"../types\"\n\n/** OEM-facing feature keys (mapped to OS permissions per platform). */\nexport const PermissionFeatures = {\n MICROPHONE: \"microphone\",\n CAMERA: \"camera\",\n CALENDAR: \"calendar\",\n LOCATION: \"location\",\n LOCAL_WIFI: \"local_wifi\",\n BACKGROUND_LOCATION: \"background_location\",\n BLUETOOTH: \"bluetooth\",\n PHONE_STATE: \"phone_state\",\n POST_NOTIFICATIONS: \"post_notifications\",\n} as const\n\nconst ANDROID = PermissionsAndroid.PERMISSIONS\nconst apiLevel = typeof Platform.Version === \"number\" ? Platform.Version : parseInt(String(Platform.Version), 10)\nconst requiresSeparateAndroidBackgroundLocation = apiLevel >= 29\n\nexport function localWifiPermissionForAndroid(\n androidApiLevel: number,\n androidPermissions: typeof PermissionsAndroid.PERMISSIONS = ANDROID,\n): AndroidPermission {\n return androidApiLevel >= 33 ? androidPermissions.NEARBY_WIFI_DEVICES : androidPermissions.ACCESS_FINE_LOCATION\n}\n\nasync function areAndroidPermissionsGranted(perms: AndroidPermission[]): Promise<boolean> {\n for (const p of perms) {\n if (!(await PermissionsAndroid.check(p))) return false\n }\n return true\n}\n\nasync function requestAndroidPermissions(perms: AndroidPermission[]): Promise<boolean> {\n const results = await PermissionsAndroid.requestMultiple(perms)\n return perms.every((p) => results[p] === PermissionsAndroid.RESULTS.GRANTED)\n}\n\nasync function checkAndroidBackgroundLocation(): Promise<boolean> {\n const hasForegroundLocation = await areAndroidPermissionsGranted([ANDROID.ACCESS_FINE_LOCATION])\n if (!hasForegroundLocation || !requiresSeparateAndroidBackgroundLocation) return hasForegroundLocation\n\n return PermissionsAndroid.check(ANDROID.ACCESS_BACKGROUND_LOCATION)\n}\n\nasync function requestAndroidBackgroundLocation(): Promise<boolean> {\n const hasForegroundLocation = await requestAndroidPermissions([ANDROID.ACCESS_FINE_LOCATION])\n if (!hasForegroundLocation || !requiresSeparateAndroidBackgroundLocation) return hasForegroundLocation\n\n if (await PermissionsAndroid.check(ANDROID.ACCESS_BACKGROUND_LOCATION)) return true\n\n const result = await PermissionsAndroid.request(ANDROID.ACCESS_BACKGROUND_LOCATION)\n return result === PermissionsAndroid.RESULTS.GRANTED\n}\n\nfunction iosPerms(feature: string): Permission[] {\n switch (feature) {\n case PermissionFeatures.MICROPHONE:\n return [PERMISSIONS.IOS.MICROPHONE]\n case PermissionFeatures.CAMERA:\n return [PERMISSIONS.IOS.CAMERA]\n case PermissionFeatures.CALENDAR:\n return [PERMISSIONS.IOS.CALENDARS]\n case PermissionFeatures.LOCATION:\n return [PERMISSIONS.IOS.LOCATION_WHEN_IN_USE]\n case PermissionFeatures.LOCAL_WIFI:\n return []\n case PermissionFeatures.BACKGROUND_LOCATION:\n // iOS won't grant ALWAYS without WHEN_IN_USE first — request both (matches\n // the host PermissionsUtils mapping), else a cold request can't escalate.\n return [PERMISSIONS.IOS.LOCATION_WHEN_IN_USE, PERMISSIONS.IOS.LOCATION_ALWAYS]\n case PermissionFeatures.BLUETOOTH:\n return [PERMISSIONS.IOS.BLUETOOTH]\n default:\n return []\n }\n}\n\nfunction androidPerms(feature: string): AndroidPermission[] {\n switch (feature) {\n case PermissionFeatures.MICROPHONE:\n return [ANDROID.RECORD_AUDIO]\n case PermissionFeatures.CAMERA:\n return [ANDROID.CAMERA]\n case PermissionFeatures.CALENDAR:\n // Expo Calendar requires both grants on Android, including for read APIs.\n // The miniapp-facing calendar API remains read-only.\n return [ANDROID.READ_CALENDAR, ANDROID.WRITE_CALENDAR]\n case PermissionFeatures.LOCATION:\n case PermissionFeatures.BACKGROUND_LOCATION:\n return [ANDROID.ACCESS_FINE_LOCATION]\n case PermissionFeatures.LOCAL_WIFI:\n return [localWifiPermissionForAndroid(apiLevel)]\n case PermissionFeatures.PHONE_STATE:\n return [ANDROID.READ_PHONE_STATE]\n case PermissionFeatures.BLUETOOTH:\n return apiLevel >= 31 ? [ANDROID.BLUETOOTH_SCAN, ANDROID.BLUETOOTH_CONNECT, ANDROID.BLUETOOTH_ADVERTISE] : []\n case PermissionFeatures.POST_NOTIFICATIONS:\n return apiLevel >= 33 ? [ANDROID.POST_NOTIFICATIONS] : []\n default:\n return []\n }\n}\n\nexport const permissions = {\n /** Is the given feature's OS permission currently granted? */\n async check(feature: string): Promise<boolean> {\n if (Platform.OS === \"android\") {\n if (feature === PermissionFeatures.BACKGROUND_LOCATION) return checkAndroidBackgroundLocation()\n\n const perms = androidPerms(feature)\n if (perms.length === 0) return true // nothing to ask on this OS/version\n // Every permission in the group must be granted (e.g. bluetooth =\n // scan+connect+advertise, calendar = read+write) — matches the iOS branch.\n return areAndroidPermissionsGranted(perms)\n }\n const perms = iosPerms(feature)\n if (perms.length === 0) return true\n for (const p of perms) {\n const status = await check(p)\n if (status !== RESULTS.GRANTED && status !== RESULTS.LIMITED) return false\n }\n return true\n },\n\n /** Request the given feature's OS permission. Resolves to whether it's granted. */\n async request(feature: string): Promise<boolean> {\n if (Platform.OS === \"android\") {\n if (feature === PermissionFeatures.BACKGROUND_LOCATION) return requestAndroidBackgroundLocation()\n\n const perms = androidPerms(feature)\n if (perms.length === 0) return true\n // Granted only when EVERY permission in the group was granted.\n return requestAndroidPermissions(perms)\n }\n const perms = iosPerms(feature)\n if (perms.length === 0) return true\n let granted = true\n for (const p of perms) {\n const result = await request(p)\n if (result !== RESULTS.GRANTED && result !== RESULTS.LIMITED) granted = false\n }\n return granted\n },\n\n /** Open the OS settings app (so the user can grant a blocked permission). */\n openSettings: (): Promise<void> => Linking.openSettings(),\n\n /** The permissions a given installed miniapp declares it needs. */\n async requirementsForMiniapp(packageName: string): Promise<AppletPermission[]> {\n const apps = await appRegistry.getInstalledMiniapps()\n return apps.find((a) => a.packageName === packageName)?.permissions ?? []\n },\n}\n"]}
@@ -0,0 +1,21 @@
1
+ export declare const phoneNotifications: {
2
+ /** Is phone-notification forwarding enabled? (false on iOS) */
3
+ enabled: () => boolean;
4
+ /** Enable/disable phone-notification forwarding. (no-op on iOS) */
5
+ setEnabled: (enabled: boolean) => import("typesafe-ts").AsyncResult<void, Error> | undefined;
6
+ /** The phone's installed apps (package, name, icon). (empty on iOS) */
7
+ installedApps: () => Promise<Array<{
8
+ packageName: string;
9
+ appName: string;
10
+ icon: string | null;
11
+ }>>;
12
+ /** The per-app blocklist (package names whose notifications are NOT forwarded). */
13
+ blocklist: () => string[];
14
+ /** Replace the per-app blocklist. */
15
+ setBlocklist: (packageNames: string[]) => import("typesafe-ts").AsyncResult<void, Error>;
16
+ /** Does the app have the Android notification-listener permission? (false on iOS) */
17
+ hasListenerPermission: () => Promise<boolean>;
18
+ /** Open the OS settings to grant the notification-listener permission. (no-op on iOS) */
19
+ requestListenerPermission: () => Promise<boolean> | undefined;
20
+ };
21
+ //# sourceMappingURL=phoneNotifications.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phoneNotifications.d.ts","sourceRoot":"","sources":["../../src/facades/phoneNotifications.ts"],"names":[],"mappings":"AAYA,eAAO,MAAM,kBAAkB;IAC7B,+DAA+D;mBAClD,OAAO;IAIpB,mEAAmE;0BAC7C,OAAO;IAK7B,uEAAuE;yBACpD,OAAO,CAAC,KAAK,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;KAAC,CAAC,CAAC;IAK9F,mFAAmF;qBACpE,MAAM,EAAE;IAIvB,qCAAqC;iCACR,MAAM,EAAE;IAGrC,qFAAqF;iCAC1D,OAAO,CAAC,OAAO,CAAC;IAI3C,yFAAyF;;CAK1F,CAAA"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * phoneNotifications facade — `engine.phoneNotifications`: forward phone
3
+ * notifications to the glasses, with a per-app blocklist. Android-only (the
4
+ * NotificationListenerService); the getters return sensible defaults on iOS.
5
+ *
6
+ * Enabled-state + blocklist are engine settings (auto-synced to the native
7
+ * listener); the installed-apps list + the listener permission are CrustModule.
8
+ */
9
+ import { Platform } from "react-native";
10
+ import CrustModule from "@mentra/crust";
11
+ import { useSettingsStore, SETTINGS } from "../stores/settings";
12
+ export const phoneNotifications = {
13
+ /** Is phone-notification forwarding enabled? (false on iOS) */
14
+ enabled: () => {
15
+ if (Platform.OS !== "android")
16
+ return false;
17
+ return useSettingsStore.getState().getSetting(SETTINGS.notifications_enabled.key) ?? true;
18
+ },
19
+ /** Enable/disable phone-notification forwarding. (no-op on iOS) */
20
+ setEnabled: (enabled) => {
21
+ if (Platform.OS !== "android")
22
+ return;
23
+ return useSettingsStore.getState().setSetting(SETTINGS.notifications_enabled.key, enabled);
24
+ },
25
+ /** The phone's installed apps (package, name, icon). (empty on iOS) */
26
+ installedApps: () => {
27
+ if (Platform.OS !== "android")
28
+ return Promise.resolve([]);
29
+ return CrustModule.getInstalledApps();
30
+ },
31
+ /** The per-app blocklist (package names whose notifications are NOT forwarded). */
32
+ blocklist: () => {
33
+ const b = useSettingsStore.getState().getSetting(SETTINGS.notifications_blocklist.key);
34
+ return Array.isArray(b) ? b : [];
35
+ },
36
+ /** Replace the per-app blocklist. */
37
+ setBlocklist: (packageNames) => useSettingsStore.getState().setSetting(SETTINGS.notifications_blocklist.key, packageNames),
38
+ /** Does the app have the Android notification-listener permission? (false on iOS) */
39
+ hasListenerPermission: () => {
40
+ if (Platform.OS !== "android")
41
+ return Promise.resolve(false);
42
+ return CrustModule.hasNotificationListenerPermission();
43
+ },
44
+ /** Open the OS settings to grant the notification-listener permission. (no-op on iOS) */
45
+ requestListenerPermission: () => {
46
+ if (Platform.OS !== "android")
47
+ return;
48
+ return CrustModule.openNotificationListenerSettings();
49
+ },
50
+ };
51
+ //# sourceMappingURL=phoneNotifications.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phoneNotifications.js","sourceRoot":"","sources":["../../src/facades/phoneNotifications.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAC,QAAQ,EAAC,MAAM,cAAc,CAAA;AACrC,OAAO,WAAW,MAAM,eAAe,CAAA;AACvC,OAAO,EAAC,gBAAgB,EAAE,QAAQ,EAAC,MAAM,oBAAoB,CAAA;AAE7D,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,+DAA+D;IAC/D,OAAO,EAAE,GAAY,EAAE;QACrB,IAAI,QAAQ,CAAC,EAAE,KAAK,SAAS;YAAE,OAAO,KAAK,CAAA;QAC3C,OAAO,gBAAgB,CAAC,QAAQ,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,qBAAqB,CAAC,GAAG,CAAC,IAAI,IAAI,CAAA;IAC3F,CAAC;IACD,mEAAmE;IACnE,UAAU,EAAE,CAAC,OAAgB,EAAE,EAAE;QAC/B,IAAI,QAAQ,CAAC,EAAE,KAAK,SAAS;YAAE,OAAM;QACrC,OAAO,gBAAgB,CAAC,QAAQ,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,qBAAqB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;IAC5F,CAAC;IAED,uEAAuE;IACvE,aAAa,EAAE,GAAgF,EAAE;QAC/F,IAAI,QAAQ,CAAC,EAAE,KAAK,SAAS;YAAE,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QACzD,OAAO,WAAW,CAAC,gBAAgB,EAAE,CAAA;IACvC,CAAC;IAED,mFAAmF;IACnF,SAAS,EAAE,GAAa,EAAE;QACxB,MAAM,CAAC,GAAG,gBAAgB,CAAC,QAAQ,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,uBAAuB,CAAC,GAAG,CAAC,CAAA;QACtF,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IAClC,CAAC;IACD,qCAAqC;IACrC,YAAY,EAAE,CAAC,YAAsB,EAAE,EAAE,CACvC,gBAAgB,CAAC,QAAQ,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,uBAAuB,CAAC,GAAG,EAAE,YAAY,CAAC;IAE5F,qFAAqF;IACrF,qBAAqB,EAAE,GAAqB,EAAE;QAC5C,IAAI,QAAQ,CAAC,EAAE,KAAK,SAAS;YAAE,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QAC5D,OAAO,WAAW,CAAC,iCAAiC,EAAE,CAAA;IACxD,CAAC;IACD,yFAAyF;IACzF,yBAAyB,EAAE,GAAG,EAAE;QAC9B,IAAI,QAAQ,CAAC,EAAE,KAAK,SAAS;YAAE,OAAM;QACrC,OAAO,WAAW,CAAC,gCAAgC,EAAE,CAAA;IACvD,CAAC;CACF,CAAA","sourcesContent":["/**\n * phoneNotifications facade — `engine.phoneNotifications`: forward phone\n * notifications to the glasses, with a per-app blocklist. Android-only (the\n * NotificationListenerService); the getters return sensible defaults on iOS.\n *\n * Enabled-state + blocklist are engine settings (auto-synced to the native\n * listener); the installed-apps list + the listener permission are CrustModule.\n */\nimport {Platform} from \"react-native\"\nimport CrustModule from \"@mentra/crust\"\nimport {useSettingsStore, SETTINGS} from \"../stores/settings\"\n\nexport const phoneNotifications = {\n /** Is phone-notification forwarding enabled? (false on iOS) */\n enabled: (): boolean => {\n if (Platform.OS !== \"android\") return false\n return useSettingsStore.getState().getSetting(SETTINGS.notifications_enabled.key) ?? true\n },\n /** Enable/disable phone-notification forwarding. (no-op on iOS) */\n setEnabled: (enabled: boolean) => {\n if (Platform.OS !== \"android\") return\n return useSettingsStore.getState().setSetting(SETTINGS.notifications_enabled.key, enabled)\n },\n\n /** The phone's installed apps (package, name, icon). (empty on iOS) */\n installedApps: (): Promise<Array<{packageName: string; appName: string; icon: string | null}>> => {\n if (Platform.OS !== \"android\") return Promise.resolve([])\n return CrustModule.getInstalledApps()\n },\n\n /** The per-app blocklist (package names whose notifications are NOT forwarded). */\n blocklist: (): string[] => {\n const b = useSettingsStore.getState().getSetting(SETTINGS.notifications_blocklist.key)\n return Array.isArray(b) ? b : []\n },\n /** Replace the per-app blocklist. */\n setBlocklist: (packageNames: string[]) =>\n useSettingsStore.getState().setSetting(SETTINGS.notifications_blocklist.key, packageNames),\n\n /** Does the app have the Android notification-listener permission? (false on iOS) */\n hasListenerPermission: (): Promise<boolean> => {\n if (Platform.OS !== \"android\") return Promise.resolve(false)\n return CrustModule.hasNotificationListenerPermission()\n },\n /** Open the OS settings to grant the notification-listener permission. (no-op on iOS) */\n requestListenerPermission: () => {\n if (Platform.OS !== \"android\") return\n return CrustModule.openNotificationListenerSettings()\n },\n}\n"]}