@glassly/engine 0.1.0-dev.98 → 0.2.8-dev.445

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 (501) hide show
  1. package/README.md +28 -0
  2. package/build/engine.d.ts +32 -10
  3. package/build/engine.d.ts.map +1 -1
  4. package/build/engine.js +24 -16
  5. package/build/engine.js.map +1 -1
  6. package/build/facades/dev.d.ts +9 -0
  7. package/build/facades/dev.d.ts.map +1 -1
  8. package/build/facades/dev.js +9 -0
  9. package/build/facades/dev.js.map +1 -1
  10. package/build/facades/display.d.ts +10 -3
  11. package/build/facades/display.d.ts.map +1 -1
  12. package/build/facades/display.js +22 -8
  13. package/build/facades/display.js.map +1 -1
  14. package/build/facades/displayMirror.d.ts +11 -0
  15. package/build/facades/displayMirror.d.ts.map +1 -1
  16. package/build/facades/displayMirror.js +22 -0
  17. package/build/facades/displayMirror.js.map +1 -1
  18. package/build/facades/glasses.d.ts +31 -1
  19. package/build/facades/glasses.d.ts.map +1 -1
  20. package/build/facades/glasses.js +51 -0
  21. package/build/facades/glasses.js.map +1 -1
  22. package/build/facades/memory.d.ts +0 -6
  23. package/build/facades/memory.d.ts.map +1 -1
  24. package/build/facades/memory.js +1 -9
  25. package/build/facades/memory.js.map +1 -1
  26. package/build/facades/miniapps.d.ts +3 -1
  27. package/build/facades/miniapps.d.ts.map +1 -1
  28. package/build/facades/miniapps.js +3 -1
  29. package/build/facades/miniapps.js.map +1 -1
  30. package/build/facades/pairing.d.ts.map +1 -1
  31. package/build/facades/pairing.js +5 -4
  32. package/build/facades/pairing.js.map +1 -1
  33. package/build/facades/permissions.d.ts +2 -0
  34. package/build/facades/permissions.d.ts.map +1 -1
  35. package/build/facades/permissions.js +48 -0
  36. package/build/facades/permissions.js.map +1 -1
  37. package/build/facades/phoneNotifications.d.ts +20 -9
  38. package/build/facades/phoneNotifications.d.ts.map +1 -1
  39. package/build/facades/phoneNotifications.js +33 -26
  40. package/build/facades/phoneNotifications.js.map +1 -1
  41. package/build/facades/settings.d.ts.map +1 -1
  42. package/build/facades/settings.js +1 -2
  43. package/build/facades/settings.js.map +1 -1
  44. package/build/generated/releaseMetadata.js +4 -4
  45. package/build/generated/releaseMetadata.js.map +1 -1
  46. package/build/index.d.ts +6 -4
  47. package/build/index.d.ts.map +1 -1
  48. package/build/index.js +5 -4
  49. package/build/index.js.map +1 -1
  50. package/build/react/MentraLiveOtaFlow.js +2 -2
  51. package/build/react/MentraLiveOtaFlow.js.map +1 -1
  52. package/build/react/useMentraLiveOta.d.ts.map +1 -1
  53. package/build/react/useMentraLiveOta.js +8 -7
  54. package/build/react/useMentraLiveOta.js.map +1 -1
  55. package/build/runtime/config.d.ts +1 -1
  56. package/build/runtime/config.d.ts.map +1 -1
  57. package/build/runtime/config.js.map +1 -1
  58. package/build/services/AppRegistry.d.ts +4 -1
  59. package/build/services/AppRegistry.d.ts.map +1 -1
  60. package/build/services/AppRegistry.js +21 -1
  61. package/build/services/AppRegistry.js.map +1 -1
  62. package/build/services/BlobStore.d.ts +2 -2
  63. package/build/services/BlobStore.js +3 -3
  64. package/build/services/BlobStore.js.map +1 -1
  65. package/build/services/CloudClientService.d.ts +7 -3
  66. package/build/services/CloudClientService.d.ts.map +1 -1
  67. package/build/services/CloudClientService.js +34 -9
  68. package/build/services/CloudClientService.js.map +1 -1
  69. package/build/services/DevServerBridge.d.ts +1 -18
  70. package/build/services/DevServerBridge.d.ts.map +1 -1
  71. package/build/services/DevServerBridge.js +9 -8
  72. package/build/services/DevServerBridge.js.map +1 -1
  73. package/build/services/DeviceEventRouter.d.ts.map +1 -1
  74. package/build/services/DeviceEventRouter.js +58 -71
  75. package/build/services/DeviceEventRouter.js.map +1 -1
  76. package/build/services/DisplayDiagnostics.d.ts +5 -0
  77. package/build/services/DisplayDiagnostics.d.ts.map +1 -0
  78. package/build/services/DisplayDiagnostics.js +105 -0
  79. package/build/services/DisplayDiagnostics.js.map +1 -0
  80. package/build/services/DisplayProcessor.d.ts +6 -7
  81. package/build/services/DisplayProcessor.d.ts.map +1 -1
  82. package/build/services/DisplayProcessor.js +17 -45
  83. package/build/services/DisplayProcessor.js.map +1 -1
  84. package/build/services/GestureDotsService.d.ts +10 -4
  85. package/build/services/GestureDotsService.d.ts.map +1 -1
  86. package/build/services/GestureDotsService.js +70 -16
  87. package/build/services/GestureDotsService.js.map +1 -1
  88. package/build/services/GlassesKeyboardInput.d.ts +77 -0
  89. package/build/services/GlassesKeyboardInput.d.ts.map +1 -0
  90. package/build/services/GlassesKeyboardInput.js +261 -0
  91. package/build/services/GlassesKeyboardInput.js.map +1 -0
  92. package/build/services/GlassesSensorService.d.ts +47 -0
  93. package/build/services/GlassesSensorService.d.ts.map +1 -0
  94. package/build/services/GlassesSensorService.js +242 -0
  95. package/build/services/GlassesSensorService.js.map +1 -0
  96. package/build/services/GlassesTouchInput.d.ts +14 -0
  97. package/build/services/GlassesTouchInput.d.ts.map +1 -0
  98. package/build/services/GlassesTouchInput.js +107 -0
  99. package/build/services/GlassesTouchInput.js.map +1 -0
  100. package/build/services/HeadingService.d.ts +0 -6
  101. package/build/services/HeadingService.d.ts.map +1 -1
  102. package/build/services/HeadingService.js +0 -27
  103. package/build/services/HeadingService.js.map +1 -1
  104. package/build/services/HotspotShutdown.d.ts.map +1 -1
  105. package/build/services/HotspotShutdown.js +2 -1
  106. package/build/services/HotspotShutdown.js.map +1 -1
  107. package/build/services/JSCrashloopReportService.js +2 -2
  108. package/build/services/JSCrashloopReportService.js.map +1 -1
  109. package/build/services/JSRouter.d.ts +6 -4
  110. package/build/services/JSRouter.d.ts.map +1 -1
  111. package/build/services/JSRouter.js +15 -13
  112. package/build/services/JSRouter.js.map +1 -1
  113. package/build/services/LocalDisplayManager.d.ts +35 -7
  114. package/build/services/LocalDisplayManager.d.ts.map +1 -1
  115. package/build/services/LocalDisplayManager.js +105 -27
  116. package/build/services/LocalDisplayManager.js.map +1 -1
  117. package/build/services/LocalMiniappDataMigration.d.ts +1 -1
  118. package/build/services/LocalMiniappDataMigration.js +1 -1
  119. package/build/services/LocalMiniappDataMigration.js.map +1 -1
  120. package/build/services/LocalMiniappRuntime.d.ts +64 -11
  121. package/build/services/LocalMiniappRuntime.d.ts.map +1 -1
  122. package/build/services/LocalMiniappRuntime.js +441 -35
  123. package/build/services/LocalMiniappRuntime.js.map +1 -1
  124. package/build/services/LocalSttFallbackCoordinator.d.ts +3 -0
  125. package/build/services/LocalSttFallbackCoordinator.d.ts.map +1 -1
  126. package/build/services/LocalSttFallbackCoordinator.js +27 -8
  127. package/build/services/LocalSttFallbackCoordinator.js.map +1 -1
  128. package/build/services/MemoryStore.d.ts +8 -33
  129. package/build/services/MemoryStore.d.ts.map +1 -1
  130. package/build/services/MemoryStore.js +30 -56
  131. package/build/services/MemoryStore.js.map +1 -1
  132. package/build/services/MiniappEngine.d.ts +3 -3
  133. package/build/services/MiniappEngine.js +7 -7
  134. package/build/services/MiniappEngine.js.map +1 -1
  135. package/build/services/MiniappLauncher.d.ts +8 -0
  136. package/build/services/MiniappLauncher.d.ts.map +1 -1
  137. package/build/services/MiniappLauncher.js +19 -1
  138. package/build/services/MiniappLauncher.js.map +1 -1
  139. package/build/services/MirrorService.d.ts +24 -0
  140. package/build/services/MirrorService.d.ts.map +1 -0
  141. package/build/services/MirrorService.js +132 -0
  142. package/build/services/MirrorService.js.map +1 -0
  143. package/build/services/NativeNavigationService.d.ts +2 -3
  144. package/build/services/NativeNavigationService.d.ts.map +1 -1
  145. package/build/services/NativeNavigationService.js +24 -21
  146. package/build/services/NativeNavigationService.js.map +1 -1
  147. package/build/services/NavigationHandlers.d.ts.map +1 -1
  148. package/build/services/NavigationHandlers.js +10 -5
  149. package/build/services/NavigationHandlers.js.map +1 -1
  150. package/build/services/OtaInstallCoordinator.d.ts.map +1 -1
  151. package/build/services/OtaInstallCoordinator.js +24 -23
  152. package/build/services/OtaInstallCoordinator.js.map +1 -1
  153. package/build/services/PairedGlassesLatch.d.ts +7 -0
  154. package/build/services/PairedGlassesLatch.d.ts.map +1 -0
  155. package/build/services/PairedGlassesLatch.js +38 -0
  156. package/build/services/PairedGlassesLatch.js.map +1 -0
  157. package/build/services/PhoneActivity.d.ts +23 -0
  158. package/build/services/PhoneActivity.d.ts.map +1 -0
  159. package/build/services/PhoneActivity.js +111 -0
  160. package/build/services/PhoneActivity.js.map +1 -0
  161. package/build/services/PhoneCameraFovCoordinator.d.ts.map +1 -1
  162. package/build/services/PhoneCameraFovCoordinator.js +4 -3
  163. package/build/services/PhoneCameraFovCoordinator.js.map +1 -1
  164. package/build/services/PhoneNotificationsSync.d.ts +40 -6
  165. package/build/services/PhoneNotificationsSync.d.ts.map +1 -1
  166. package/build/services/PhoneNotificationsSync.js +160 -84
  167. package/build/services/PhoneNotificationsSync.js.map +1 -1
  168. package/build/services/PhonePhotoCoordinator.d.ts.map +1 -1
  169. package/build/services/PhonePhotoCoordinator.js +6 -5
  170. package/build/services/PhonePhotoCoordinator.js.map +1 -1
  171. package/build/services/PhoneStreamCoordinator.d.ts.map +1 -1
  172. package/build/services/PhoneStreamCoordinator.js +8 -7
  173. package/build/services/PhoneStreamCoordinator.js.map +1 -1
  174. package/build/services/STTModelManager.d.ts +3 -0
  175. package/build/services/STTModelManager.d.ts.map +1 -1
  176. package/build/services/STTModelManager.js +15 -1
  177. package/build/services/STTModelManager.js.map +1 -1
  178. package/build/services/SceneRenderer.d.ts +43 -2
  179. package/build/services/SceneRenderer.d.ts.map +1 -1
  180. package/build/services/SceneRenderer.js +123 -8
  181. package/build/services/SceneRenderer.js.map +1 -1
  182. package/build/services/StreamLifecycleController.d.ts.map +1 -1
  183. package/build/services/StreamLifecycleController.js +6 -14
  184. package/build/services/StreamLifecycleController.js.map +1 -1
  185. package/build/services/TTSModelManager.js +1 -1
  186. package/build/services/TTSModelManager.js.map +1 -1
  187. package/build/services/UIRouter.d.ts +2 -2
  188. package/build/services/UIRouter.js +5 -5
  189. package/build/services/UIRouter.js.map +1 -1
  190. package/build/services/asg/galleryPathMigration.js +1 -1
  191. package/build/services/asg/galleryPathMigration.js.map +1 -1
  192. package/build/services/asg/gallerySyncService.js +2 -2
  193. package/build/services/asg/gallerySyncService.js.map +1 -1
  194. package/build/services/asg/localStorageService.d.ts.map +1 -1
  195. package/build/services/asg/localStorageService.js +3 -3
  196. package/build/services/asg/localStorageService.js.map +1 -1
  197. package/build/services/debug/DashboardOpenTrace.d.ts +32 -0
  198. package/build/services/debug/DashboardOpenTrace.d.ts.map +1 -0
  199. package/build/services/debug/DashboardOpenTrace.js +128 -0
  200. package/build/services/debug/DashboardOpenTrace.js.map +1 -0
  201. package/build/services/debug/dashboardOpenTimeline.d.ts +77 -0
  202. package/build/services/debug/dashboardOpenTimeline.d.ts.map +1 -0
  203. package/build/services/debug/dashboardOpenTimeline.js +195 -0
  204. package/build/services/debug/dashboardOpenTimeline.js.map +1 -0
  205. package/build/services/effectiveCapabilities.d.ts.map +1 -1
  206. package/build/services/effectiveCapabilities.js +25 -13
  207. package/build/services/effectiveCapabilities.js.map +1 -1
  208. package/build/services/gestureClaims.d.ts +34 -15
  209. package/build/services/gestureClaims.d.ts.map +1 -1
  210. package/build/services/gestureClaims.js +42 -21
  211. package/build/services/gestureClaims.js.map +1 -1
  212. package/build/services/manifestFields.d.ts +9 -0
  213. package/build/services/manifestFields.d.ts.map +1 -0
  214. package/build/services/manifestFields.js +26 -0
  215. package/build/services/manifestFields.js.map +1 -0
  216. package/build/services/memoryStoreInstance.d.ts +0 -10
  217. package/build/services/memoryStoreInstance.d.ts.map +1 -1
  218. package/build/services/memoryStoreInstance.js +2 -31
  219. package/build/services/memoryStoreInstance.js.map +1 -1
  220. package/build/services/mirrorSnapshot.d.ts +16 -0
  221. package/build/services/mirrorSnapshot.d.ts.map +1 -0
  222. package/build/services/mirrorSnapshot.js +102 -0
  223. package/build/services/mirrorSnapshot.js.map +1 -0
  224. package/build/services/nativeNavigationGate.d.ts +8 -0
  225. package/build/services/nativeNavigationGate.d.ts.map +1 -0
  226. package/build/services/nativeNavigationGate.js +12 -0
  227. package/build/services/nativeNavigationGate.js.map +1 -0
  228. package/build/services/notificationAppCatalog.d.ts +7 -0
  229. package/build/services/notificationAppCatalog.d.ts.map +1 -0
  230. package/build/services/notificationAppCatalog.js +16 -0
  231. package/build/services/notificationAppCatalog.js.map +1 -0
  232. package/build/services/notifications/notificationPolicy.d.ts +55 -0
  233. package/build/services/notifications/notificationPolicy.d.ts.map +1 -0
  234. package/build/services/notifications/notificationPolicy.js +41 -0
  235. package/build/services/notifications/notificationPolicy.js.map +1 -0
  236. package/build/services/pages/OverlayPages.d.ts +26 -0
  237. package/build/services/pages/OverlayPages.d.ts.map +1 -0
  238. package/build/services/pages/OverlayPages.js +80 -0
  239. package/build/services/pages/OverlayPages.js.map +1 -0
  240. package/build/services/pages/PageHost.d.ts +32 -0
  241. package/build/services/pages/PageHost.d.ts.map +1 -0
  242. package/build/services/pages/PageHost.js +99 -0
  243. package/build/services/pages/PageHost.js.map +1 -0
  244. package/build/services/pages/overlayApps.d.ts +25 -0
  245. package/build/services/pages/overlayApps.d.ts.map +1 -0
  246. package/build/services/pages/overlayApps.js +66 -0
  247. package/build/services/pages/overlayApps.js.map +1 -0
  248. package/build/services/pages/pageEligibility.d.ts +9 -0
  249. package/build/services/pages/pageEligibility.d.ts.map +1 -0
  250. package/build/services/pages/pageEligibility.js +27 -0
  251. package/build/services/pages/pageEligibility.js.map +1 -0
  252. package/build/services/settingsBridge.d.ts +58 -0
  253. package/build/services/settingsBridge.d.ts.map +1 -0
  254. package/build/services/settingsBridge.js +90 -0
  255. package/build/services/settingsBridge.js.map +1 -0
  256. package/build/services/speakerProfileStoreInstance.js +1 -1
  257. package/build/services/speakerProfileStoreInstance.js.map +1 -1
  258. package/build/services/uiShim.d.ts +1 -1
  259. package/build/services/uiShim.js +4 -4
  260. package/build/services/uiShim.js.map +1 -1
  261. package/build/stores/appVisibility.d.ts +28 -0
  262. package/build/stores/appVisibility.d.ts.map +1 -1
  263. package/build/stores/appVisibility.js +34 -0
  264. package/build/stores/appVisibility.js.map +1 -1
  265. package/build/stores/apps.d.ts +13 -0
  266. package/build/stores/apps.d.ts.map +1 -1
  267. package/build/stores/apps.js +66 -12
  268. package/build/stores/apps.js.map +1 -1
  269. package/build/stores/bluetoothSettingKeys.js +1 -1
  270. package/build/stores/bluetoothSettingKeys.js.map +1 -1
  271. package/build/stores/display.d.ts +3 -3
  272. package/build/stores/display.d.ts.map +1 -1
  273. package/build/stores/display.js +16 -4
  274. package/build/stores/display.js.map +1 -1
  275. package/build/stores/glasses.d.ts.map +1 -1
  276. package/build/stores/glasses.js +14 -1
  277. package/build/stores/glasses.js.map +1 -1
  278. package/build/stores/settings.d.ts +1 -0
  279. package/build/stores/settings.d.ts.map +1 -1
  280. package/build/stores/settings.js +170 -44
  281. package/build/stores/settings.js.map +1 -1
  282. package/build/types/applet.d.ts +14 -1
  283. package/build/types/applet.d.ts.map +1 -1
  284. package/build/types/applet.js.map +1 -1
  285. package/build/types/capabilities/even-realities-g2.d.ts.map +1 -1
  286. package/build/types/capabilities/even-realities-g2.js +5 -0
  287. package/build/types/capabilities/even-realities-g2.js.map +1 -1
  288. package/build/types/capabilities/simulated-glasses.d.ts +1 -1
  289. package/build/types/capabilities/simulated-glasses.d.ts.map +1 -1
  290. package/build/types/capabilities/simulated-glasses.js +7 -4
  291. package/build/types/capabilities/simulated-glasses.js.map +1 -1
  292. package/build/types/hardware.d.ts +20 -1
  293. package/build/types/hardware.d.ts.map +1 -1
  294. package/build/types/hardware.js +2 -0
  295. package/build/types/hardware.js.map +1 -1
  296. package/build/types/index.d.ts +1 -0
  297. package/build/types/index.d.ts.map +1 -1
  298. package/build/types/index.js +1 -0
  299. package/build/types/index.js.map +1 -1
  300. package/build/utils/debouncedPatch.d.ts +3 -1
  301. package/build/utils/debouncedPatch.d.ts.map +1 -1
  302. package/build/utils/debouncedPatch.js +6 -3
  303. package/build/utils/debouncedPatch.js.map +1 -1
  304. package/build/utils/devMiniappLaunch.d.ts.map +1 -1
  305. package/build/utils/devMiniappLaunch.js +4 -3
  306. package/build/utils/devMiniappLaunch.js.map +1 -1
  307. package/build/utils/display/measurer/TextMeasurer.d.ts +2 -159
  308. package/build/utils/display/measurer/TextMeasurer.d.ts.map +1 -1
  309. package/build/utils/display/measurer/TextMeasurer.js +2 -272
  310. package/build/utils/display/measurer/TextMeasurer.js.map +1 -1
  311. package/build/utils/display/measurer/script-detection.d.ts +1 -52
  312. package/build/utils/display/measurer/script-detection.d.ts.map +1 -1
  313. package/build/utils/display/measurer/script-detection.js +2 -183
  314. package/build/utils/display/measurer/script-detection.js.map +1 -1
  315. package/build/utils/display/pixelArt.d.ts +3 -0
  316. package/build/utils/display/pixelArt.d.ts.map +1 -0
  317. package/build/utils/display/pixelArt.js +3 -0
  318. package/build/utils/display/pixelArt.js.map +1 -0
  319. package/build/utils/display/profiles/g1.d.ts +1 -32
  320. package/build/utils/display/profiles/g1.d.ts.map +1 -1
  321. package/build/utils/display/profiles/g1.js +2 -212
  322. package/build/utils/display/profiles/g1.js.map +1 -1
  323. package/build/utils/display/profiles/g2.d.ts +1 -12
  324. package/build/utils/display/profiles/g2.d.ts.map +1 -1
  325. package/build/utils/display/profiles/g2.js +2 -33
  326. package/build/utils/display/profiles/g2.js.map +1 -1
  327. package/build/utils/display/profiles/nex.d.ts +1 -9
  328. package/build/utils/display/profiles/nex.d.ts.map +1 -1
  329. package/build/utils/display/profiles/nex.js +2 -149
  330. package/build/utils/display/profiles/nex.js.map +1 -1
  331. package/build/utils/display/profiles/types.d.ts +1 -102
  332. package/build/utils/display/profiles/types.d.ts.map +1 -1
  333. package/build/utils/display/profiles/types.js.map +1 -1
  334. package/build/utils/display/profiles/z100.d.ts +1 -32
  335. package/build/utils/display/profiles/z100.d.ts.map +1 -1
  336. package/build/utils/display/profiles/z100.js +2 -181
  337. package/build/utils/display/profiles/z100.js.map +1 -1
  338. package/build/utils/display/scene/degrade.d.ts.map +1 -1
  339. package/build/utils/display/scene/degrade.js +4 -1
  340. package/build/utils/display/scene/degrade.js.map +1 -1
  341. package/build/utils/display/scene/differ.d.ts +13 -1
  342. package/build/utils/display/scene/differ.d.ts.map +1 -1
  343. package/build/utils/display/scene/differ.js +22 -0
  344. package/build/utils/display/scene/differ.js.map +1 -1
  345. package/build/utils/display/scene/index.d.ts +1 -1
  346. package/build/utils/display/scene/index.d.ts.map +1 -1
  347. package/build/utils/display/scene/index.js.map +1 -1
  348. package/build/utils/display/scene/process.d.ts.map +1 -1
  349. package/build/utils/display/scene/process.js +183 -11
  350. package/build/utils/display/scene/process.js.map +1 -1
  351. package/build/utils/display/scene/store.d.ts +1 -1
  352. package/build/utils/display/scene/store.d.ts.map +1 -1
  353. package/build/utils/display/scene/store.js +0 -0
  354. package/build/utils/display/scene/store.js.map +1 -1
  355. package/build/utils/display/scene/svgPath.d.ts +9 -0
  356. package/build/utils/display/scene/svgPath.d.ts.map +1 -0
  357. package/build/utils/display/scene/svgPath.js +167 -0
  358. package/build/utils/display/scene/svgPath.js.map +1 -0
  359. package/build/utils/display/scene/types.d.ts +2 -142
  360. package/build/utils/display/scene/types.d.ts.map +1 -1
  361. package/build/utils/display/scene/types.js +0 -0
  362. package/build/utils/display/scene/types.js.map +1 -1
  363. package/build/utils/display/wrapper/TextWrapper.d.ts +1 -101
  364. package/build/utils/display/wrapper/TextWrapper.d.ts.map +1 -1
  365. package/build/utils/display/wrapper/TextWrapper.js +2 -470
  366. package/build/utils/display/wrapper/TextWrapper.js.map +1 -1
  367. package/build/utils/display/wrapper/types.d.ts +2 -74
  368. package/build/utils/display/wrapper/types.d.ts.map +1 -1
  369. package/build/utils/display/wrapper/types.js +2 -10
  370. package/build/utils/display/wrapper/types.js.map +1 -1
  371. package/build/utils/hardware/hardware.js +1 -1
  372. package/build/utils/hardware/hardware.js.map +1 -1
  373. package/build/utils/timers/timers.d.ts.map +1 -1
  374. package/build/utils/timers/timers.js +26 -4
  375. package/build/utils/timers/timers.js.map +1 -1
  376. package/package.json +8 -8
  377. package/src/engine.ts +24 -15
  378. package/src/facades/dev.ts +10 -0
  379. package/src/facades/display.ts +21 -8
  380. package/src/facades/displayMirror.ts +29 -0
  381. package/src/facades/glasses.ts +61 -1
  382. package/src/facades/memory.ts +1 -12
  383. package/src/facades/miniapps.ts +4 -1
  384. package/src/facades/pairing.ts +8 -6
  385. package/src/facades/permissions.ts +46 -0
  386. package/src/facades/phoneNotifications.ts +45 -26
  387. package/src/facades/settings.ts +1 -2
  388. package/src/generated/releaseMetadata.ts +4 -4
  389. package/src/index.ts +6 -9
  390. package/src/react/MentraLiveOtaFlow.tsx +2 -2
  391. package/src/react/useMentraLiveOta.ts +14 -8
  392. package/src/runtime/config.ts +1 -1
  393. package/src/services/AppRegistry.ts +43 -7
  394. package/src/services/BlobStore.ts +3 -3
  395. package/src/services/CloudClientService.ts +37 -10
  396. package/src/services/DevServerBridge.ts +12 -10
  397. package/src/services/DeviceEventRouter.ts +73 -74
  398. package/src/services/DisplayDiagnostics.ts +107 -0
  399. package/src/services/DisplayProcessor.ts +20 -55
  400. package/src/services/GestureDotsService.ts +77 -16
  401. package/src/services/GlassesKeyboardInput.ts +306 -0
  402. package/src/services/GlassesSensorService.ts +233 -0
  403. package/src/services/GlassesTouchInput.ts +128 -0
  404. package/src/services/HeadingService.ts +0 -24
  405. package/src/services/HotspotShutdown.ts +3 -1
  406. package/src/services/JSCrashloopReportService.ts +2 -2
  407. package/src/services/JSRouter.ts +29 -14
  408. package/src/services/LocalDisplayManager.ts +112 -26
  409. package/src/services/LocalMiniappDataMigration.ts +1 -1
  410. package/src/services/LocalMiniappRuntime.ts +500 -43
  411. package/src/services/LocalSttFallbackCoordinator.ts +28 -7
  412. package/src/services/MemoryStore.ts +32 -80
  413. package/src/services/MiniappEngine.ts +7 -7
  414. package/src/services/MiniappLauncher.ts +25 -1
  415. package/src/services/MirrorService.ts +139 -0
  416. package/src/services/NativeNavigationService.ts +29 -25
  417. package/src/services/NavigationHandlers.ts +10 -5
  418. package/src/services/OtaInstallCoordinator.ts +36 -34
  419. package/src/services/PairedGlassesLatch.ts +39 -0
  420. package/src/services/PhoneActivity.ts +116 -0
  421. package/src/services/PhoneCameraFovCoordinator.ts +6 -4
  422. package/src/services/PhoneNotificationsSync.ts +185 -103
  423. package/src/services/PhonePhotoCoordinator.ts +9 -10
  424. package/src/services/PhoneStreamCoordinator.ts +13 -11
  425. package/src/services/STTModelManager.ts +15 -1
  426. package/src/services/SceneRenderer.ts +148 -10
  427. package/src/services/StreamLifecycleController.ts +9 -7
  428. package/src/services/TTSModelManager.ts +1 -1
  429. package/src/services/UIRouter.ts +5 -5
  430. package/src/services/asg/galleryPathMigration.ts +1 -1
  431. package/src/services/asg/gallerySyncService.ts +2 -2
  432. package/src/services/asg/localStorageService.ts +3 -3
  433. package/src/services/debug/DashboardOpenTrace.ts +153 -0
  434. package/src/services/debug/dashboardOpenTimeline.ts +237 -0
  435. package/src/services/effectiveCapabilities.ts +32 -13
  436. package/src/services/gestureClaims.ts +72 -23
  437. package/src/services/manifestFields.ts +23 -0
  438. package/src/services/memoryStoreInstance.ts +2 -34
  439. package/src/services/mirrorSnapshot.ts +116 -0
  440. package/src/services/nativeNavigationGate.ts +14 -0
  441. package/src/services/notificationAppCatalog.ts +21 -0
  442. package/src/services/notifications/notificationPolicy.ts +87 -0
  443. package/src/services/pages/OverlayPages.ts +86 -0
  444. package/src/services/pages/PageHost.ts +116 -0
  445. package/src/services/pages/overlayApps.ts +72 -0
  446. package/src/services/pages/pageEligibility.ts +30 -0
  447. package/src/services/settingsBridge.ts +111 -0
  448. package/src/services/speakerProfileStoreInstance.ts +1 -1
  449. package/src/services/uiShim.ts +4 -4
  450. package/src/stores/appVisibility.ts +45 -0
  451. package/src/stores/apps.ts +110 -32
  452. package/src/stores/bluetoothSettingKeys.ts +1 -1
  453. package/src/stores/display.ts +18 -7
  454. package/src/stores/glasses.ts +15 -1
  455. package/src/stores/settings.ts +175 -51
  456. package/src/types/applet.ts +14 -1
  457. package/src/types/capabilities/even-realities-g2.ts +6 -0
  458. package/src/types/capabilities/simulated-glasses.ts +8 -4
  459. package/src/types/hardware.ts +34 -1
  460. package/src/types/index.ts +1 -0
  461. package/src/utils/debouncedPatch.ts +8 -4
  462. package/src/utils/devMiniappLaunch.ts +5 -3
  463. package/src/utils/display/measurer/TextMeasurer.ts +3 -346
  464. package/src/utils/display/measurer/script-detection.ts +10 -218
  465. package/src/utils/display/pixelArt.ts +3 -0
  466. package/src/utils/display/profiles/g1.ts +2 -236
  467. package/src/utils/display/profiles/g2.ts +2 -39
  468. package/src/utils/display/profiles/nex.ts +2 -166
  469. package/src/utils/display/profiles/types.ts +9 -132
  470. package/src/utils/display/profiles/z100.ts +2 -198
  471. package/src/utils/display/scene/degrade.ts +4 -1
  472. package/src/utils/display/scene/differ.ts +25 -1
  473. package/src/utils/display/scene/index.ts +5 -0
  474. package/src/utils/display/scene/process.ts +196 -13
  475. package/src/utils/display/scene/store.ts +0 -0
  476. package/src/utils/display/scene/svgPath.ts +163 -0
  477. package/src/utils/display/scene/types.ts +0 -0
  478. package/src/utils/display/wrapper/TextWrapper.ts +2 -546
  479. package/src/utils/display/wrapper/types.ts +3 -102
  480. package/src/utils/hardware/hardware.ts +1 -1
  481. package/src/utils/timers/timers.ts +32 -4
  482. package/build/services/CustomDashboardModel.d.ts +0 -48
  483. package/build/services/CustomDashboardModel.d.ts.map +0 -1
  484. package/build/services/CustomDashboardModel.js +0 -73
  485. package/build/services/CustomDashboardModel.js.map +0 -1
  486. package/build/services/CustomDashboardService.d.ts +0 -63
  487. package/build/services/CustomDashboardService.d.ts.map +0 -1
  488. package/build/services/CustomDashboardService.js +0 -576
  489. package/build/services/CustomDashboardService.js.map +0 -1
  490. package/build/services/DashboardCoordinator.d.ts +0 -26
  491. package/build/services/DashboardCoordinator.d.ts.map +0 -1
  492. package/build/services/DashboardCoordinator.js +0 -125
  493. package/build/services/DashboardCoordinator.js.map +0 -1
  494. package/build/services/iosNotificationAppCatalog.d.ts +0 -13
  495. package/build/services/iosNotificationAppCatalog.d.ts.map +0 -1
  496. package/build/services/iosNotificationAppCatalog.js +0 -28
  497. package/build/services/iosNotificationAppCatalog.js.map +0 -1
  498. package/src/services/CustomDashboardModel.ts +0 -83
  499. package/src/services/CustomDashboardService.ts +0 -598
  500. package/src/services/DashboardCoordinator.ts +0 -121
  501. package/src/services/iosNotificationAppCatalog.ts +0 -39
@@ -1 +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 \"@glassly/bluetooth-sdk/internal\"\nimport type {ConnectOptions, Device, DeviceModel, PairFailureEvent, GlassesNotReadyEvent} from \"@glassly/bluetooth-sdk\"\nimport {useCoreStore} from \"../stores/core\"\nimport {useGlassesStore} from \"../stores/glasses\"\nimport {SETTINGS, useSettingsStore} from \"../stores/settings\"\nimport {hasDefaultDevice} from \"../services/DeviceStoreHydration\"\nimport {\n markPendingSelection,\n projectPairingIdentity,\n subscribePairingIdentity,\n type IdentitySnapshot,\n} from \"../services/PairingIdentity\"\nimport {isGlassesConnected, isGlassesLinkLayerBusy, isGlassesReady} from \"../services/GlassesReadiness\"\nimport {\n logAutomaticReportSubmissionStatus,\n toAutomaticReportSubmissionStatus,\n type AutomaticReportSubmissionStatus,\n} from \"../services/AutomaticReportResult\"\nimport {pushAllBluetoothSettings} from \"../services/GlassesSettingsSync\"\nimport {ControllerTypes} from \"../types\"\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\nfunction projectTargetReady(options: Pick<PairingReadyWaitOptions, \"deviceModel\" | \"deviceName\">): boolean {\n const {deviceModel, deviceName} = options\n const glasses = useGlassesStore.getState()\n\n if (deviceModel === ControllerTypes.R1) {\n if (!glasses.controllerConnected || !glasses.controllerFullyBooted) return false\n const settings = useSettingsStore.getState()\n const pairedModel = settings.getSetting(SETTINGS.default_controller.key)\n const pairedName = settings.getSetting(SETTINGS.controller_device_name.key)\n return (!deviceModel || pairedModel === deviceModel) && (!deviceName || pairedName === deviceName)\n }\n\n if (!isGlassesReady(glasses.connection)) return false\n const identity = projectPairingIdentity()\n if (!deviceModel && !deviceName) return true\n return (\n identity.kind === \"paired\" &&\n (!deviceModel || identity.model === deviceModel) &&\n (!deviceName || identity.name === deviceName)\n )\n}\n\nfunction subscribeTargetReady(\n options: Pick<PairingReadyWaitOptions, \"deviceModel\" | \"deviceName\">,\n cb: (ready: boolean) => void,\n): () => void {\n let last = projectTargetReady(options)\n const notify = () => {\n const ready = projectTargetReady(options)\n if (ready === last) return\n last = ready\n cb(ready)\n }\n const unsubscribeGlasses = useGlassesStore.subscribe(notify)\n const unsubscribeSettings = useSettingsStore.subscribe(notify)\n return () => {\n unsubscribeGlasses()\n unsubscribeSettings()\n }\n}\n\nasync function waitForTargetReady(options: PairingReadyWaitOptions, timeoutMs: number): Promise<boolean> {\n return new Promise((resolve) => {\n if (options.signal?.aborted) {\n resolve(false)\n return\n }\n if (projectTargetReady(options)) {\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 const finish = (ready: 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(ready)\n }\n\n unsubscribe = subscribeTargetReady(options, (ready) => {\n if (ready) finish(true)\n })\n if (options.signal) {\n onAbort = () => finish(false)\n options.signal.addEventListener(\"abort\", onAbort)\n }\n timeout = setTimeout(() => finish(projectTargetReady(options)), timeoutMs)\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 waitForTargetReady(options, timeoutMs)\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 /** Whether the exact wearable or controller selected on the scan screen is ready. */\n targetReady: (options: Pick<PairingReadyWaitOptions, \"deviceModel\" | \"deviceName\">): boolean =>\n projectTargetReady(options),\n /** Subscribe to readiness for the exact selected target, excluding stale devices. */\n onTargetReady: (\n options: Pick<PairingReadyWaitOptions, \"deviceModel\" | \"deviceName\">,\n cb: (ready: boolean) => void,\n ): (() => void) => subscribeTargetReady(options, cb),\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: (model: DeviceModel): Promise<void> => BluetoothSdk.startScan(model),\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: Device[]) => 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: (device: Device | null): Promise<void> => BluetoothSdk.setDefaultDevice(device),\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 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 BluetoothSdk.disconnect()\n await pushAllBluetoothSettings()\n return\n }\n 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 await BluetoothSdk.disconnect()\n return\n }\n // Partial attempt: forget owns teardown. Do NOT disconnect() first — that\n // nulls the MentraLive SGC and used to skip Classic removeBond, leaving\n // IBRT ACL up so glasses never re-advertise for the next scan.\n console.log(\"PairingIdentity: abandonAttempt — no pairing on either layer; forgetting the partial attempt\")\n await BluetoothSdk.forget()\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"]}
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 \"@glassly/bluetooth-sdk/internal\"\nimport type {ConnectOptions, Device, DeviceModel, PairFailureEvent, GlassesNotReadyEvent} from \"@glassly/bluetooth-sdk\"\nimport {useCoreStore} from \"../stores/core\"\nimport {useGlassesStore} from \"../stores/glasses\"\nimport {SETTINGS, useSettingsStore} from \"../stores/settings\"\nimport {hasDefaultDevice} from \"../services/DeviceStoreHydration\"\nimport {\n markPendingSelection,\n projectPairingIdentity,\n subscribePairingIdentity,\n type IdentitySnapshot,\n} from \"../services/PairingIdentity\"\nimport {isGlassesConnected, isGlassesLinkLayerBusy, isGlassesReady} from \"../services/GlassesReadiness\"\nimport {\n logAutomaticReportSubmissionStatus,\n toAutomaticReportSubmissionStatus,\n type AutomaticReportSubmissionStatus,\n} from \"../services/AutomaticReportResult\"\nimport {pushAllBluetoothSettings} from \"../services/GlassesSettingsSync\"\nimport {ControllerTypes} from \"../types\"\nimport {submitAutomaticReport} from \"./reports\"\n\nimport {BgTimer} from \"../utils/timers\"\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\nfunction projectTargetReady(options: Pick<PairingReadyWaitOptions, \"deviceModel\" | \"deviceName\">): boolean {\n const {deviceModel, deviceName} = options\n const glasses = useGlassesStore.getState()\n\n if (deviceModel === ControllerTypes.R1) {\n if (!glasses.controllerConnected || !glasses.controllerFullyBooted) return false\n const settings = useSettingsStore.getState()\n const pairedModel = settings.getSetting(SETTINGS.default_controller.key)\n const pairedName = settings.getSetting(SETTINGS.controller_device_name.key)\n return (!deviceModel || pairedModel === deviceModel) && (!deviceName || pairedName === deviceName)\n }\n\n if (!isGlassesReady(glasses.connection)) return false\n const identity = projectPairingIdentity()\n if (!deviceModel && !deviceName) return true\n return (\n identity.kind === \"paired\" &&\n (!deviceModel || identity.model === deviceModel) &&\n (!deviceName || identity.name === deviceName)\n )\n}\n\nfunction subscribeTargetReady(\n options: Pick<PairingReadyWaitOptions, \"deviceModel\" | \"deviceName\">,\n cb: (ready: boolean) => void,\n): () => void {\n let last = projectTargetReady(options)\n const notify = () => {\n const ready = projectTargetReady(options)\n if (ready === last) return\n last = ready\n cb(ready)\n }\n const unsubscribeGlasses = useGlassesStore.subscribe(notify)\n const unsubscribeSettings = useSettingsStore.subscribe(notify)\n return () => {\n unsubscribeGlasses()\n unsubscribeSettings()\n }\n}\n\nasync function waitForTargetReady(options: PairingReadyWaitOptions, timeoutMs: number): Promise<boolean> {\n return new Promise((resolve) => {\n if (options.signal?.aborted) {\n resolve(false)\n return\n }\n if (projectTargetReady(options)) {\n resolve(true)\n return\n }\n\n let settled = false\n let timeout: number | null = null\n let unsubscribe: (() => void) | null = null\n let onAbort: (() => void) | null = null\n const finish = (ready: boolean) => {\n if (settled) return\n settled = true\n if (timeout) BgTimer.clearTimeout(timeout)\n if (unsubscribe) unsubscribe()\n if (onAbort && options.signal) options.signal.removeEventListener(\"abort\", onAbort)\n resolve(ready)\n }\n\n unsubscribe = subscribeTargetReady(options, (ready) => {\n if (ready) finish(true)\n })\n if (options.signal) {\n onAbort = () => finish(false)\n options.signal.addEventListener(\"abort\", onAbort)\n }\n timeout = BgTimer.setTimeout(() => finish(projectTargetReady(options)), timeoutMs)\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 waitForTargetReady(options, timeoutMs)\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: number | 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) BgTimer.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 = BgTimer.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 /** Whether the exact wearable or controller selected on the scan screen is ready. */\n targetReady: (options: Pick<PairingReadyWaitOptions, \"deviceModel\" | \"deviceName\">): boolean =>\n projectTargetReady(options),\n /** Subscribe to readiness for the exact selected target, excluding stale devices. */\n onTargetReady: (\n options: Pick<PairingReadyWaitOptions, \"deviceModel\" | \"deviceName\">,\n cb: (ready: boolean) => void,\n ): (() => void) => subscribeTargetReady(options, cb),\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: (model: DeviceModel): Promise<void> => BluetoothSdk.startScan(model),\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: Device[]) => 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: (device: Device | null): Promise<void> => BluetoothSdk.setDefaultDevice(device),\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 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 BluetoothSdk.disconnect()\n await pushAllBluetoothSettings()\n return\n }\n 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 await BluetoothSdk.disconnect()\n return\n }\n // Partial attempt: forget owns teardown. Do NOT disconnect() first — that\n // nulls the MentraLive SGC and used to skip Classic removeBond, leaving\n // IBRT ACL up so glasses never re-advertise for the next scan.\n console.log(\"PairingIdentity: abandonAttempt — no pairing on either layer; forgetting the partial attempt\")\n await BluetoothSdk.forget()\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"]}
@@ -21,6 +21,8 @@ export declare const PermissionFeatures: {
21
21
  };
22
22
  export declare function localWifiPermissionForAndroid(androidApiLevel: number, androidPermissions?: typeof PermissionsAndroid.PERMISSIONS): AndroidPermission;
23
23
  export declare const permissions: {
24
+ /** Missing required miniapp grants, checked without prompting. CAMERA is the glasses camera. */
25
+ missingRequired(requirements: readonly AppletPermission[]): Promise<string[]>;
24
26
  /** Is the given feature's OS permission currently granted? */
25
27
  check(feature: string): Promise<boolean>;
26
28
  /** Request the given feature's OS permission. Resolves to whether it's granted. */
@@ -1 +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"}
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,gGAAgG;kCAC5D,SAAS,gBAAgB,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IA6CnF,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"}
@@ -100,6 +100,54 @@ function androidPerms(feature) {
100
100
  }
101
101
  }
102
102
  export const permissions = {
103
+ /** Missing required miniapp grants, checked without prompting. CAMERA is the glasses camera. */
104
+ async missingRequired(requirements) {
105
+ const features = new Set();
106
+ for (const permission of requirements) {
107
+ if (permission.required === false)
108
+ continue;
109
+ switch (permission.type) {
110
+ case "ALL":
111
+ features.add(PermissionFeatures.MICROPHONE);
112
+ features.add(PermissionFeatures.CALENDAR);
113
+ features.add(PermissionFeatures.LOCATION);
114
+ features.add(PermissionFeatures.BACKGROUND_LOCATION);
115
+ features.add(PermissionFeatures.POST_NOTIFICATIONS);
116
+ features.add("read_notifications");
117
+ break;
118
+ case "MICROPHONE":
119
+ case "CALENDAR":
120
+ case "LOCATION":
121
+ case "BACKGROUND_LOCATION":
122
+ case "POST_NOTIFICATIONS":
123
+ features.add(PermissionFeatures[permission.type]);
124
+ break;
125
+ case "READ_NOTIFICATIONS":
126
+ features.add("read_notifications");
127
+ break;
128
+ }
129
+ }
130
+ const missing = [];
131
+ for (const feature of features) {
132
+ let granted;
133
+ if (feature === "read_notifications") {
134
+ // iOS glasses read notifications directly; Android uses the phone's listener.
135
+ granted =
136
+ Platform.OS !== "android" ||
137
+ (await (await import("@glassly/crust")).default.hasNotificationListenerPermission());
138
+ }
139
+ else if (feature === PermissionFeatures.CALENDAR && Platform.OS === "ios") {
140
+ // EventKit must allow reads; a scoped/write-only OS grant is insufficient.
141
+ granted = (await (await import("expo-calendar")).getCalendarPermissions()).status === "granted";
142
+ }
143
+ else {
144
+ granted = await permissions.check(feature);
145
+ }
146
+ if (!granted)
147
+ missing.push(feature);
148
+ }
149
+ return missing;
150
+ },
103
151
  /** Is the given feature's OS permission currently granted? */
104
152
  async check(feature) {
105
153
  if (Platform.OS === "android") {
@@ -1 +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"]}
1
+ {"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../src/facades/permissions.ts"],"names":[],"mappings":"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","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 /** Missing required miniapp grants, checked without prompting. CAMERA is the glasses camera. */\n async missingRequired(requirements: readonly AppletPermission[]): Promise<string[]> {\n const features = new Set<string>()\n for (const permission of requirements) {\n if (permission.required === false) continue\n switch (permission.type) {\n case \"ALL\":\n features.add(PermissionFeatures.MICROPHONE)\n features.add(PermissionFeatures.CALENDAR)\n features.add(PermissionFeatures.LOCATION)\n features.add(PermissionFeatures.BACKGROUND_LOCATION)\n features.add(PermissionFeatures.POST_NOTIFICATIONS)\n features.add(\"read_notifications\")\n break\n case \"MICROPHONE\":\n case \"CALENDAR\":\n case \"LOCATION\":\n case \"BACKGROUND_LOCATION\":\n case \"POST_NOTIFICATIONS\":\n features.add(PermissionFeatures[permission.type])\n break\n case \"READ_NOTIFICATIONS\":\n features.add(\"read_notifications\")\n break\n }\n }\n\n const missing: string[] = []\n for (const feature of features) {\n let granted: boolean\n if (feature === \"read_notifications\") {\n // iOS glasses read notifications directly; Android uses the phone's listener.\n granted =\n Platform.OS !== \"android\" ||\n (await (await import(\"@glassly/crust\")).default.hasNotificationListenerPermission())\n } else if (feature === PermissionFeatures.CALENDAR && Platform.OS === \"ios\") {\n // EventKit must allow reads; a scoped/write-only OS grant is insufficient.\n granted = (await (await import(\"expo-calendar\")).getCalendarPermissions()).status === \"granted\"\n } else {\n granted = await permissions.check(feature)\n }\n if (!granted) missing.push(feature)\n }\n return missing\n },\n\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"]}
@@ -1,14 +1,13 @@
1
+ import type { PhoneNotificationEvent } from "@glassly/crust";
2
+ import type { GlassesNotificationStatus, NotificationUploadResult } from "@glassly/bluetooth-sdk";
3
+ import { captureAuthorization, currentPresentationOwner, installedNotificationApps, nativeNotificationPopupSeconds, nativeNotificationsSupported } from "../services/PhoneNotificationsSync";
1
4
  export declare const phoneNotifications: {
2
5
  /**
3
6
  * Apps to show in the notification filter UI (package/bundle id, name, icon).
4
7
  * Android: installed apps. iOS: seeded catalog ∪ glasses-reported apps
5
8
  * (icons unavailable — iOS offers no cross-app icon lookup).
6
9
  */
7
- installedApps: () => Promise<Array<{
8
- packageName: string;
9
- appName: string;
10
- icon: string | null;
11
- }>>;
10
+ installedApps: typeof installedNotificationApps;
12
11
  /** The per-app blocklist (package/bundle ids whose notifications are NOT forwarded). */
13
12
  blocklist: () => string[];
14
13
  /** Replace the per-app blocklist. */
@@ -17,11 +16,23 @@ export declare const phoneNotifications: {
17
16
  hasListenerPermission: () => Promise<boolean>;
18
17
  /** Open the OS settings to grant the notification-listener permission. (no-op on iOS) */
19
18
  requestListenerPermission: () => Promise<boolean> | undefined;
19
+ /** Whether the glasses may read the phone's notifications; `not_needed` where the phone captures. */
20
+ captureAuthorization: typeof captureAuthorization;
21
+ /** The connected model presents notifications in firmware. */
22
+ nativeNotifications: typeof nativeNotificationsSupported;
23
+ /** Popup durations the firmware accepts (seconds, 0 = its default); empty when any value goes. */
24
+ popupSecondsOptions: typeof nativeNotificationPopupSeconds;
20
25
  /**
21
- * iOS: whether the connected glasses may read the phone's ANCS notification
22
- * stream (the "Share System Notifications" Bluetooth consent). Always false
23
- * on Android — Android capture is the notification listener instead.
26
+ * Who presents the next phone notification. Hosts pass whether their own
27
+ * surface runs and draw only when the answer is `host`.
24
28
  */
25
- ancsAuthorized: () => boolean;
29
+ presentationOwner: typeof currentPresentationOwner;
30
+ /** Hand a captured notification to firmware that presents uploaded content (owner `firmware`, Android). */
31
+ uploadToGlasses: (event: PhoneNotificationEvent) => Promise<void>;
32
+ /** The driver's view of its notification surface. */
33
+ glassesStatus: () => Promise<GlassesNotificationStatus>;
34
+ onGlassesStatus: (listener: (status: GlassesNotificationStatus) => void) => (() => void);
35
+ /** Upload outcomes by id; content never travels back. */
36
+ onUploadResult: (listener: (result: NotificationUploadResult) => void) => (() => void);
26
37
  };
27
38
  //# sourceMappingURL=phoneNotifications.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"phoneNotifications.d.ts","sourceRoot":"","sources":["../../src/facades/phoneNotifications.ts"],"names":[],"mappings":"AAkBA,eAAO,MAAM,kBAAkB;IAC7B;;;;OAIG;yBACgB,OAAO,CAAC,KAAK,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;KAAC,CAAC,CAAC;IAY9F,wFAAwF;qBACzE,MAAM,EAAE;IAIvB,qCAAqC;iCACR,MAAM,EAAE;IAGrC,qFAAqF;iCAC1D,OAAO,CAAC,OAAO,CAAC;IAI3C,yFAAyF;;IAMzF;;;;OAIG;0BACiB,OAAO;CAC5B,CAAA"}
1
+ {"version":3,"file":"phoneNotifications.d.ts","sourceRoot":"","sources":["../../src/facades/phoneNotifications.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAC,sBAAsB,EAAC,MAAM,gBAAgB,CAAA;AAE1D,OAAO,KAAK,EAAC,yBAAyB,EAAE,wBAAwB,EAAC,MAAM,wBAAwB,CAAA;AAE/F,OAAO,EACL,oBAAoB,EACpB,wBAAwB,EACxB,yBAAyB,EACzB,8BAA8B,EAC9B,4BAA4B,EAE7B,MAAM,oCAAoC,CAAA;AAE3C,eAAO,MAAM,kBAAkB;IAC7B;;;;OAIG;;IAGH,wFAAwF;qBACzE,MAAM,EAAE;IAIvB,qCAAqC;iCACR,MAAM,EAAE;IAGrC,qFAAqF;iCAC1D,OAAO,CAAC,OAAO,CAAC;IAI3C,yFAAyF;;IAMzF,qGAAqG;;IAGrG,8DAA8D;;IAE9D,kGAAkG;;IAGlG;;;OAGG;;IAEH,2GAA2G;6BAClF,sBAAsB,KAAG,OAAO,CAAC,IAAI,CAAC;IAE/D,qDAAqD;yBAClC,OAAO,CAAC,yBAAyB,CAAC;gCACzB,CAAC,MAAM,EAAE,yBAAyB,KAAK,IAAI,KAAG,CAAC,MAAM,IAAI,CAAC;IAItF,yDAAyD;+BAC9B,CAAC,MAAM,EAAE,wBAAwB,KAAK,IAAI,KAAG,CAAC,MAAM,IAAI,CAAC;CAIrF,CAAA"}
@@ -1,37 +1,26 @@
1
1
  /**
2
- * phoneNotifications facade — `engine.phoneNotifications`: forward phone
3
- * notifications to the glasses, with a per-app blocklist.
2
+ * phoneNotifications facade — `engine.phoneNotifications`: phone notifications
3
+ * on the glasses, with a per-app blocklist and one presentation owner.
4
4
  *
5
- * Android: apps come from the NotificationListenerService's installed-apps
6
- * enumeration and the blocklist filters capture phone-side.
7
- * iOS: apps are the seeded catalog plus what the glasses' ANCS client has
8
- * reported posting notifications (`ios_notification_seen_apps`); the blocklist
9
- * is mapped onto the G2's on-glass allowlist by PhoneNotificationsSync.
10
- * Capture itself is controlled by Android notification access / iOS ANCS
11
- * authorization (`glasses.ancsAuthorized`), not by this facade.
5
+ * Capture is the phone's (Android listener) or the glasses' (iOS, reading the
6
+ * phone's stream) business and is never gated here. Presentation is decided
7
+ * by `presentationOwner`: the engine's viewer on Glassly CFW glasses, the
8
+ * firmware on glasses with their own notification centre, else the host's
9
+ * card while its surface (Notify) runs. The four display settings drive
10
+ * firmware and viewer alike; PhoneNotificationsSync pushes them.
12
11
  */
13
12
  import { Platform } from "react-native";
14
13
  import CrustModule from "@glassly/crust";
14
+ import BluetoothSdk from "@glassly/bluetooth-sdk/internal";
15
15
  import { useSettingsStore, SETTINGS } from "../stores/settings";
16
- import { useGlassesStore } from "../stores/glasses";
17
- import { getKnownNotificationApps } from "../services/PhoneNotificationsSync";
16
+ import { captureAuthorization, currentPresentationOwner, installedNotificationApps, nativeNotificationPopupSeconds, nativeNotificationsSupported, uploadPhoneNotification, } from "../services/PhoneNotificationsSync";
18
17
  export const phoneNotifications = {
19
18
  /**
20
19
  * Apps to show in the notification filter UI (package/bundle id, name, icon).
21
20
  * Android: installed apps. iOS: seeded catalog ∪ glasses-reported apps
22
21
  * (icons unavailable — iOS offers no cross-app icon lookup).
23
22
  */
24
- installedApps: () => {
25
- if (Platform.OS === "android")
26
- return CrustModule.getInstalledApps();
27
- if (Platform.OS !== "ios")
28
- return Promise.resolve([]);
29
- return Promise.resolve(getKnownNotificationApps().map((app) => ({
30
- packageName: app.appId,
31
- appName: app.displayName,
32
- icon: null,
33
- })));
34
- },
23
+ installedApps: installedNotificationApps,
35
24
  /** The per-app blocklist (package/bundle ids whose notifications are NOT forwarded). */
36
25
  blocklist: () => {
37
26
  const b = useSettingsStore.getState().getSetting(SETTINGS.notifications_blocklist.key);
@@ -51,11 +40,29 @@ export const phoneNotifications = {
51
40
  return;
52
41
  return CrustModule.openNotificationListenerSettings();
53
42
  },
43
+ /** Whether the glasses may read the phone's notifications; `not_needed` where the phone captures. */
44
+ captureAuthorization,
45
+ /** The connected model presents notifications in firmware. */
46
+ nativeNotifications: nativeNotificationsSupported,
47
+ /** Popup durations the firmware accepts (seconds, 0 = its default); empty when any value goes. */
48
+ popupSecondsOptions: nativeNotificationPopupSeconds,
54
49
  /**
55
- * iOS: whether the connected glasses may read the phone's ANCS notification
56
- * stream (the "Share System Notifications" Bluetooth consent). Always false
57
- * on Android — Android capture is the notification listener instead.
50
+ * Who presents the next phone notification. Hosts pass whether their own
51
+ * surface runs and draw only when the answer is `host`.
58
52
  */
59
- ancsAuthorized: () => Boolean(useGlassesStore.getState().ancsAuthorized),
53
+ presentationOwner: currentPresentationOwner,
54
+ /** Hand a captured notification to firmware that presents uploaded content (owner `firmware`, Android). */
55
+ uploadToGlasses: (event) => uploadPhoneNotification(event),
56
+ /** The driver's view of its notification surface. */
57
+ glassesStatus: () => BluetoothSdk.getGlassesNotificationStatus(),
58
+ onGlassesStatus: (listener) => {
59
+ const subscription = BluetoothSdk.addListener("glasses_notification_status", listener);
60
+ return () => subscription.remove();
61
+ },
62
+ /** Upload outcomes by id; content never travels back. */
63
+ onUploadResult: (listener) => {
64
+ const subscription = BluetoothSdk.addListener("notification_upload_result", listener);
65
+ return () => subscription.remove();
66
+ },
60
67
  };
61
68
  //# sourceMappingURL=phoneNotifications.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"phoneNotifications.js","sourceRoot":"","sources":["../../src/facades/phoneNotifications.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAC,QAAQ,EAAC,MAAM,cAAc,CAAA;AACrC,OAAO,WAAW,MAAM,gBAAgB,CAAA;AACxC,OAAO,EAAC,gBAAgB,EAAE,QAAQ,EAAC,MAAM,oBAAoB,CAAA;AAC7D,OAAO,EAAC,eAAe,EAAC,MAAM,mBAAmB,CAAA;AACjD,OAAO,EAAC,wBAAwB,EAAC,MAAM,oCAAoC,CAAA;AAE3E,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC;;;;OAIG;IACH,aAAa,EAAE,GAAgF,EAAE;QAC/F,IAAI,QAAQ,CAAC,EAAE,KAAK,SAAS;YAAE,OAAO,WAAW,CAAC,gBAAgB,EAAE,CAAA;QACpE,IAAI,QAAQ,CAAC,EAAE,KAAK,KAAK;YAAE,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QACrD,OAAO,OAAO,CAAC,OAAO,CACpB,wBAAwB,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACvC,WAAW,EAAE,GAAG,CAAC,KAAK;YACtB,OAAO,EAAE,GAAG,CAAC,WAAW;YACxB,IAAI,EAAE,IAAI;SACX,CAAC,CAAC,CACJ,CAAA;IACH,CAAC;IAED,wFAAwF;IACxF,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;IAED;;;;OAIG;IACH,cAAc,EAAE,GAAY,EAAE,CAAC,OAAO,CAAC,eAAe,CAAC,QAAQ,EAAE,CAAC,cAAc,CAAC;CAClF,CAAA","sourcesContent":["/**\n * phoneNotifications facade — `engine.phoneNotifications`: forward phone\n * notifications to the glasses, with a per-app blocklist.\n *\n * Android: apps come from the NotificationListenerService's installed-apps\n * enumeration and the blocklist filters capture phone-side.\n * iOS: apps are the seeded catalog plus what the glasses' ANCS client has\n * reported posting notifications (`ios_notification_seen_apps`); the blocklist\n * is mapped onto the G2's on-glass allowlist by PhoneNotificationsSync.\n * Capture itself is controlled by Android notification access / iOS ANCS\n * authorization (`glasses.ancsAuthorized`), not by this facade.\n */\nimport {Platform} from \"react-native\"\nimport CrustModule from \"@glassly/crust\"\nimport {useSettingsStore, SETTINGS} from \"../stores/settings\"\nimport {useGlassesStore} from \"../stores/glasses\"\nimport {getKnownNotificationApps} from \"../services/PhoneNotificationsSync\"\n\nexport const phoneNotifications = {\n /**\n * Apps to show in the notification filter UI (package/bundle id, name, icon).\n * Android: installed apps. iOS: seeded catalog ∪ glasses-reported apps\n * (icons unavailable — iOS offers no cross-app icon lookup).\n */\n installedApps: (): Promise<Array<{packageName: string; appName: string; icon: string | null}>> => {\n if (Platform.OS === \"android\") return CrustModule.getInstalledApps()\n if (Platform.OS !== \"ios\") return Promise.resolve([])\n return Promise.resolve(\n getKnownNotificationApps().map((app) => ({\n packageName: app.appId,\n appName: app.displayName,\n icon: null,\n })),\n )\n },\n\n /** The per-app blocklist (package/bundle ids 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 /**\n * iOS: whether the connected glasses may read the phone's ANCS notification\n * stream (the \"Share System Notifications\" Bluetooth consent). Always false\n * on Android — Android capture is the notification listener instead.\n */\n ancsAuthorized: (): boolean => Boolean(useGlassesStore.getState().ancsAuthorized),\n}\n"]}
1
+ {"version":3,"file":"phoneNotifications.js","sourceRoot":"","sources":["../../src/facades/phoneNotifications.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAC,QAAQ,EAAC,MAAM,cAAc,CAAA;AACrC,OAAO,WAAW,MAAM,gBAAgB,CAAA;AAExC,OAAO,YAAY,MAAM,iCAAiC,CAAA;AAE1D,OAAO,EAAC,gBAAgB,EAAE,QAAQ,EAAC,MAAM,oBAAoB,CAAA;AAC7D,OAAO,EACL,oBAAoB,EACpB,wBAAwB,EACxB,yBAAyB,EACzB,8BAA8B,EAC9B,4BAA4B,EAC5B,uBAAuB,GACxB,MAAM,oCAAoC,CAAA;AAE3C,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC;;;;OAIG;IACH,aAAa,EAAE,yBAAyB;IAExC,wFAAwF;IACxF,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;IAED,qGAAqG;IACrG,oBAAoB;IAEpB,8DAA8D;IAC9D,mBAAmB,EAAE,4BAA4B;IACjD,kGAAkG;IAClG,mBAAmB,EAAE,8BAA8B;IAEnD;;;OAGG;IACH,iBAAiB,EAAE,wBAAwB;IAC3C,2GAA2G;IAC3G,eAAe,EAAE,CAAC,KAA6B,EAAiB,EAAE,CAAC,uBAAuB,CAAC,KAAK,CAAC;IAEjG,qDAAqD;IACrD,aAAa,EAAE,GAAuC,EAAE,CAAC,YAAY,CAAC,4BAA4B,EAAE;IACpG,eAAe,EAAE,CAAC,QAAqD,EAAgB,EAAE;QACvF,MAAM,YAAY,GAAG,YAAY,CAAC,WAAW,CAAC,6BAA6B,EAAE,QAAQ,CAAC,CAAA;QACtF,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,CAAA;IACpC,CAAC;IACD,yDAAyD;IACzD,cAAc,EAAE,CAAC,QAAoD,EAAgB,EAAE;QACrF,MAAM,YAAY,GAAG,YAAY,CAAC,WAAW,CAAC,4BAA4B,EAAE,QAAQ,CAAC,CAAA;QACrF,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,CAAA;IACpC,CAAC;CACF,CAAA","sourcesContent":["/**\n * phoneNotifications facade — `engine.phoneNotifications`: phone notifications\n * on the glasses, with a per-app blocklist and one presentation owner.\n *\n * Capture is the phone's (Android listener) or the glasses' (iOS, reading the\n * phone's stream) business and is never gated here. Presentation is decided\n * by `presentationOwner`: the engine's viewer on Glassly CFW glasses, the\n * firmware on glasses with their own notification centre, else the host's\n * card while its surface (Notify) runs. The four display settings drive\n * firmware and viewer alike; PhoneNotificationsSync pushes them.\n */\nimport {Platform} from \"react-native\"\nimport CrustModule from \"@glassly/crust\"\nimport type {PhoneNotificationEvent} from \"@glassly/crust\"\nimport BluetoothSdk from \"@glassly/bluetooth-sdk/internal\"\nimport type {GlassesNotificationStatus, NotificationUploadResult} from \"@glassly/bluetooth-sdk\"\nimport {useSettingsStore, SETTINGS} from \"../stores/settings\"\nimport {\n captureAuthorization,\n currentPresentationOwner,\n installedNotificationApps,\n nativeNotificationPopupSeconds,\n nativeNotificationsSupported,\n uploadPhoneNotification,\n} from \"../services/PhoneNotificationsSync\"\n\nexport const phoneNotifications = {\n /**\n * Apps to show in the notification filter UI (package/bundle id, name, icon).\n * Android: installed apps. iOS: seeded catalog ∪ glasses-reported apps\n * (icons unavailable — iOS offers no cross-app icon lookup).\n */\n installedApps: installedNotificationApps,\n\n /** The per-app blocklist (package/bundle ids 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 /** Whether the glasses may read the phone's notifications; `not_needed` where the phone captures. */\n captureAuthorization,\n\n /** The connected model presents notifications in firmware. */\n nativeNotifications: nativeNotificationsSupported,\n /** Popup durations the firmware accepts (seconds, 0 = its default); empty when any value goes. */\n popupSecondsOptions: nativeNotificationPopupSeconds,\n\n /**\n * Who presents the next phone notification. Hosts pass whether their own\n * surface runs and draw only when the answer is `host`.\n */\n presentationOwner: currentPresentationOwner,\n /** Hand a captured notification to firmware that presents uploaded content (owner `firmware`, Android). */\n uploadToGlasses: (event: PhoneNotificationEvent): Promise<void> => uploadPhoneNotification(event),\n\n /** The driver's view of its notification surface. */\n glassesStatus: (): Promise<GlassesNotificationStatus> => BluetoothSdk.getGlassesNotificationStatus(),\n onGlassesStatus: (listener: (status: GlassesNotificationStatus) => void): (() => void) => {\n const subscription = BluetoothSdk.addListener(\"glasses_notification_status\", listener)\n return () => subscription.remove()\n },\n /** Upload outcomes by id; content never travels back. */\n onUploadResult: (listener: (result: NotificationUploadResult) => void): (() => void) => {\n const subscription = BluetoothSdk.addListener(\"notification_upload_result\", listener)\n return () => subscription.remove()\n },\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../src/facades/settings.ts"],"names":[],"mappings":"AAkBA,eAAO,MAAM,QAAQ;IACnB;8BAC0B;UACpB,CAAC,iBAAiB,MAAM,KAAG,CAAC,GAAG,SAAS;IAE9C;;;OAGG;UACG,CAAC,iBAAiB,MAAM,SAAS,CAAC;IAExC,gEAAgE;gBACpD,CAAC,iBAAiB,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,SAAS,KAAK,IAAI,KAAG,CAAC,MAAM,IAAI,CAAC;IAEvF,+EAA+E;sBAC7D,MAAM;IACxB,8BAA8B;gBACpB,MAAM,EAAE;IAClB;;;OAGG;yBACgB,IAAI;IACvB;;;OAGG;;IAEH;;;OAGG;kBACS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACnC;;;OAGG;2BACoB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAC/C,CAAA"}
1
+ {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../src/facades/settings.ts"],"names":[],"mappings":"AAiBA,eAAO,MAAM,QAAQ;IACnB;8BAC0B;UACpB,CAAC,iBAAiB,MAAM,KAAG,CAAC,GAAG,SAAS;IAE9C;;;OAGG;UACG,CAAC,iBAAiB,MAAM,SAAS,CAAC;IAExC,gEAAgE;gBACpD,CAAC,iBAAiB,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,SAAS,KAAK,IAAI,KAAG,CAAC,MAAM,IAAI,CAAC;IAEvF,+EAA+E;sBAC7D,MAAM;IACxB,8BAA8B;gBACpB,MAAM,EAAE;IAClB;;;OAGG;yBACgB,IAAI;IACvB;;;OAGG;;IAEH;;;OAGG;kBACS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACnC;;;OAGG;2BACoB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAC/C,CAAA"}
@@ -1,7 +1,6 @@
1
1
  /**
2
2
  * settings facade — `engine.settings`: the typed keyed user-settings surface over
3
- * the engine-owned settings store. This is the (A) OEM contract; the raw store at
4
- * `engine.stores.settings` is the Glassly-app escape hatch.
3
+ * the engine-owned settings store. This is the OEM contract.
5
4
  *
6
5
  * Keys + their schema live in `SETTINGS` (theme, devMode, metric/twelveHourTime,
7
6
  * notifications, onboarding flags, …); `descriptor(key)`/`keys()` expose them.
@@ -1 +1 @@
1
- {"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/facades/settings.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAC,gBAAgB,EAAE,QAAQ,EAAC,MAAM,oBAAoB,CAAA;AAE7D,+EAA+E;AAC/E,kFAAkF;AAClF,SAAS,gBAAgB,CAAI,KAAQ;IACnC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,GAAG,KAAK,CAAM,CAAA;IAChD,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,EAAC,GAAI,KAAgB,EAAM,CAAA;IAC1E,OAAO,KAAK,CAAA;AACd,CAAC;AAED,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB;8BAC0B;IAC1B,GAAG,EAAE,CAAc,GAAW,EAAiB,EAAE,CAC/C,gBAAgB,CAAC,gBAAgB,CAAC,QAAQ,EAAE,CAAC,UAAU,CAAC,GAAG,CAAkB,CAAC;IAChF;;;OAGG;IACH,GAAG,EAAE,CAAc,GAAW,EAAE,KAAQ,EAAE,YAAY,GAAG,IAAI,EAAE,EAAE,CAC/D,gBAAgB,CAAC,QAAQ,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,KAAK,EAAE,YAAY,CAAC;IAClE,gEAAgE;IAChE,SAAS,EAAE,CAAc,GAAW,EAAE,EAAkC,EAAgB,EAAE,CACxF,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAkB,EAAE,EAAE,CAAC;IAC3E,+EAA+E;IAC/E,UAAU,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC;IAC1C,8BAA8B;IAC9B,IAAI,EAAE,GAAa,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC;IAC3C;;;OAGG;IACH,aAAa,EAAE,GAAS,EAAE,CAAC,gBAAgB,CAAC,QAAQ,EAAE,CAAC,uBAAuB,EAAE;IAChF;;;OAGG;IACH,OAAO,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,QAAQ,EAAE,CAAC,eAAe,EAAE;IAC5D;;;OAGG;IACH,MAAM,EAAE,GAA4B,EAAE,CAAC,CAAC,EAAC,GAAG,gBAAgB,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAC,CAAC;IAClF;;;OAGG;IACH,YAAY,EAAE,CAAC,MAA+B,EAAE,EAAE,CAAC,gBAAgB,CAAC,QAAQ,EAAE,CAAC,cAAc,CAAC,MAAM,CAAC;CACtG,CAAA","sourcesContent":["/**\n * settings facade — `engine.settings`: the typed keyed user-settings surface over\n * the engine-owned settings store. This is the (A) OEM contract; the raw store at\n * `engine.stores.settings` is the Glassly-app escape hatch.\n *\n * Keys + their schema live in `SETTINGS` (theme, devMode, metric/twelveHourTime,\n * notifications, onboarding flags, …); `descriptor(key)`/`keys()` expose them.\n */\nimport {useSettingsStore, SETTINGS} from \"../stores/settings\"\n\n// Copy: object/array-valued settings must not hand callers a mutable reference\n// into the store (mutations would silently corrupt store state, bypassing set()).\nfunction copySettingValue<T>(value: T): T {\n if (Array.isArray(value)) return [...value] as T\n if (value && typeof value === \"object\") return {...(value as object)} as T\n return value\n}\n\nexport const settings = {\n /** Read a setting by key (the current value, or its default; object/array values\n * are shallow copies). */\n get: <T = unknown>(key: string): T | undefined =>\n copySettingValue(useSettingsStore.getState().getSetting(key) as T | undefined),\n /**\n * Write a setting. `syncToServer` (default true) also pushes the change to the\n * backend; pass false for device-local-only writes.\n */\n set: <T = unknown>(key: string, value: T, syncToServer = true) =>\n useSettingsStore.getState().setSetting(key, value, syncToServer),\n /** Subscribe to changes for one key; returns an unsubscribe. */\n onChanged: <T = unknown>(key: string, cb: (value: T | undefined) => void): (() => void) =>\n useSettingsStore.subscribe((s) => s.getSetting(key) as T | undefined, cb),\n /** The schema descriptor for a key (type, default, options…), or undefined. */\n descriptor: (key: string) => SETTINGS[key],\n /** All known setting keys. */\n keys: (): string[] => Object.keys(SETTINGS),\n /**\n * Reset every setting to its default on THIS device only (no server sync) —\n * the logout path. Server-side settings are untouched.\n */\n resetAllLocal: (): void => useSettingsStore.getState().resetAllSettingsLocally(),\n /**\n * Hydrate the settings store from device storage — the host-boot step (fire\n * once at app start, before UI reads settings). Single-flighted internally.\n */\n loadAll: () => useSettingsStore.getState().loadAllSettings(),\n /**\n * Every EXPLICITLY-SET setting (shallow copy; keys never written are absent —\n * use get() for default-resolved reads). The data-export surface.\n */\n getAll: (): Record<string, unknown> => ({...useSettingsStore.getState().settings}),\n /**\n * Bulk device-local write without server sync — seeding the store from a\n * backend settings payload.\n */\n setManyLocal: (values: Record<string, unknown>) => useSettingsStore.getState().setManyLocally(values),\n}\n"]}
1
+ {"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/facades/settings.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAC,gBAAgB,EAAE,QAAQ,EAAC,MAAM,oBAAoB,CAAA;AAE7D,+EAA+E;AAC/E,kFAAkF;AAClF,SAAS,gBAAgB,CAAI,KAAQ;IACnC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,GAAG,KAAK,CAAM,CAAA;IAChD,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,EAAC,GAAI,KAAgB,EAAM,CAAA;IAC1E,OAAO,KAAK,CAAA;AACd,CAAC;AAED,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB;8BAC0B;IAC1B,GAAG,EAAE,CAAc,GAAW,EAAiB,EAAE,CAC/C,gBAAgB,CAAC,gBAAgB,CAAC,QAAQ,EAAE,CAAC,UAAU,CAAC,GAAG,CAAkB,CAAC;IAChF;;;OAGG;IACH,GAAG,EAAE,CAAc,GAAW,EAAE,KAAQ,EAAE,YAAY,GAAG,IAAI,EAAE,EAAE,CAC/D,gBAAgB,CAAC,QAAQ,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,KAAK,EAAE,YAAY,CAAC;IAClE,gEAAgE;IAChE,SAAS,EAAE,CAAc,GAAW,EAAE,EAAkC,EAAgB,EAAE,CACxF,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAkB,EAAE,EAAE,CAAC;IAC3E,+EAA+E;IAC/E,UAAU,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC;IAC1C,8BAA8B;IAC9B,IAAI,EAAE,GAAa,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC;IAC3C;;;OAGG;IACH,aAAa,EAAE,GAAS,EAAE,CAAC,gBAAgB,CAAC,QAAQ,EAAE,CAAC,uBAAuB,EAAE;IAChF;;;OAGG;IACH,OAAO,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,QAAQ,EAAE,CAAC,eAAe,EAAE;IAC5D;;;OAGG;IACH,MAAM,EAAE,GAA4B,EAAE,CAAC,CAAC,EAAC,GAAG,gBAAgB,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAC,CAAC;IAClF;;;OAGG;IACH,YAAY,EAAE,CAAC,MAA+B,EAAE,EAAE,CAAC,gBAAgB,CAAC,QAAQ,EAAE,CAAC,cAAc,CAAC,MAAM,CAAC;CACtG,CAAA","sourcesContent":["/**\n * settings facade — `engine.settings`: the typed keyed user-settings surface over\n * the engine-owned settings store. This is the OEM contract.\n *\n * Keys + their schema live in `SETTINGS` (theme, devMode, metric/twelveHourTime,\n * notifications, onboarding flags, …); `descriptor(key)`/`keys()` expose them.\n */\nimport {useSettingsStore, SETTINGS} from \"../stores/settings\"\n\n// Copy: object/array-valued settings must not hand callers a mutable reference\n// into the store (mutations would silently corrupt store state, bypassing set()).\nfunction copySettingValue<T>(value: T): T {\n if (Array.isArray(value)) return [...value] as T\n if (value && typeof value === \"object\") return {...(value as object)} as T\n return value\n}\n\nexport const settings = {\n /** Read a setting by key (the current value, or its default; object/array values\n * are shallow copies). */\n get: <T = unknown>(key: string): T | undefined =>\n copySettingValue(useSettingsStore.getState().getSetting(key) as T | undefined),\n /**\n * Write a setting. `syncToServer` (default true) also pushes the change to the\n * backend; pass false for device-local-only writes.\n */\n set: <T = unknown>(key: string, value: T, syncToServer = true) =>\n useSettingsStore.getState().setSetting(key, value, syncToServer),\n /** Subscribe to changes for one key; returns an unsubscribe. */\n onChanged: <T = unknown>(key: string, cb: (value: T | undefined) => void): (() => void) =>\n useSettingsStore.subscribe((s) => s.getSetting(key) as T | undefined, cb),\n /** The schema descriptor for a key (type, default, options…), or undefined. */\n descriptor: (key: string) => SETTINGS[key],\n /** All known setting keys. */\n keys: (): string[] => Object.keys(SETTINGS),\n /**\n * Reset every setting to its default on THIS device only (no server sync) —\n * the logout path. Server-side settings are untouched.\n */\n resetAllLocal: (): void => useSettingsStore.getState().resetAllSettingsLocally(),\n /**\n * Hydrate the settings store from device storage — the host-boot step (fire\n * once at app start, before UI reads settings). Single-flighted internally.\n */\n loadAll: () => useSettingsStore.getState().loadAllSettings(),\n /**\n * Every EXPLICITLY-SET setting (shallow copy; keys never written are absent —\n * use get() for default-resolved reads). The data-export surface.\n */\n getAll: (): Record<string, unknown> => ({...useSettingsStore.getState().settings}),\n /**\n * Bulk device-local write without server sync — seeding the store from a\n * backend settings payload.\n */\n setManyLocal: (values: Record<string, unknown>) => useSettingsStore.getState().setManyLocally(values),\n}\n"]}
@@ -1,9 +1,9 @@
1
1
  export const ENGINE_RELEASE_METADATA = Object.freeze({
2
2
  "schemaVersion": 1,
3
- "familyBaseVersion": "0.1.0",
4
- "releaseIdentity": "0.1.0-dev.98",
5
- "releaseSetId": "glassly-0.1.0-dev.98",
6
- "sourceCommit": "2c7feb7c84f8161087b58ef18cf589254ad16ae8",
3
+ "familyBaseVersion": "0.2.8",
4
+ "releaseIdentity": "0.2.8-dev.445",
5
+ "releaseSetId": "glassly-0.2.8-dev.445",
6
+ "sourceCommit": "7e82d274d259dc795d05a3aef988d261d871106a",
7
7
  "otaManifestUrl": null,
8
8
  "otaManifestSha256": null
9
9
  });
@@ -1 +1 @@
1
- {"version":3,"file":"releaseMetadata.js","sourceRoot":"","sources":["../../src/generated/releaseMetadata.ts"],"names":[],"mappings":"AAWA,MAAM,CAAC,MAAM,uBAAuB,GAAoC,MAAM,CAAC,MAAM,CAAC;IACpF,eAAe,EAAE,CAAC;IAClB,mBAAmB,EAAE,OAAO;IAC5B,iBAAiB,EAAE,cAAc;IACjC,cAAc,EAAE,sBAAsB;IACtC,cAAc,EAAE,0CAA0C;IAC1D,gBAAgB,EAAE,IAAI;IACtB,mBAAmB,EAAE,IAAI;CAC1B,CAAC,CAAA","sourcesContent":["/** Generated by release CI. Do not edit in a release checkout. */\nexport interface EngineReleaseMetadata {\n schemaVersion: 1\n familyBaseVersion: string | null\n releaseIdentity: string | null\n releaseSetId: string | null\n sourceCommit: string | null\n otaManifestUrl: string | null\n otaManifestSha256: string | null\n}\n\nexport const ENGINE_RELEASE_METADATA: Readonly<EngineReleaseMetadata> = Object.freeze({\n \"schemaVersion\": 1,\n \"familyBaseVersion\": \"0.1.0\",\n \"releaseIdentity\": \"0.1.0-dev.98\",\n \"releaseSetId\": \"glassly-0.1.0-dev.98\",\n \"sourceCommit\": \"2c7feb7c84f8161087b58ef18cf589254ad16ae8\",\n \"otaManifestUrl\": null,\n \"otaManifestSha256\": null\n})\n"]}
1
+ {"version":3,"file":"releaseMetadata.js","sourceRoot":"","sources":["../../src/generated/releaseMetadata.ts"],"names":[],"mappings":"AAWA,MAAM,CAAC,MAAM,uBAAuB,GAAoC,MAAM,CAAC,MAAM,CAAC;IACpF,eAAe,EAAE,CAAC;IAClB,mBAAmB,EAAE,OAAO;IAC5B,iBAAiB,EAAE,eAAe;IAClC,cAAc,EAAE,uBAAuB;IACvC,cAAc,EAAE,0CAA0C;IAC1D,gBAAgB,EAAE,IAAI;IACtB,mBAAmB,EAAE,IAAI;CAC1B,CAAC,CAAA","sourcesContent":["/** Generated by release CI. Do not edit in a release checkout. */\nexport interface EngineReleaseMetadata {\n schemaVersion: 1\n familyBaseVersion: string | null\n releaseIdentity: string | null\n releaseSetId: string | null\n sourceCommit: string | null\n otaManifestUrl: string | null\n otaManifestSha256: string | null\n}\n\nexport const ENGINE_RELEASE_METADATA: Readonly<EngineReleaseMetadata> = Object.freeze({\n \"schemaVersion\": 1,\n \"familyBaseVersion\": \"0.2.8\",\n \"releaseIdentity\": \"0.2.8-dev.445\",\n \"releaseSetId\": \"glassly-0.2.8-dev.445\",\n \"sourceCommit\": \"7e82d274d259dc795d05a3aef988d261d871106a\",\n \"otaManifestUrl\": null,\n \"otaManifestSha256\": null\n})\n"]}
package/build/index.d.ts CHANGED
@@ -6,18 +6,20 @@
6
6
  * renders with (decision functions, sort/order helpers, policy constants,
7
7
  * capability tables, timers). Judgment rule: read models, commands, pure
8
8
  * functions and types belong here; anything that mutates runtime state or
9
- * exposes a raw store/service remains private to the GlasslyOS host.
9
+ * exposes a raw store/service remains private to the Glassly host.
10
10
  * See cloud-v2/docs/issues/020-glasses-status-boundary/integration-review.md §D.
11
11
  */
12
12
  export { engine } from "./engine";
13
13
  export type { ReportAttachmentInput, ReportContext, ReportDetails, ReportStatus, ReportTrigger, ReportSubmitResult, EngineSubmitReportInput, } from "./facades/reports";
14
14
  export type { IslandNotification, IslandNotificationKind } from "./facades/notifications";
15
+ export type { PresentationOwner } from "./services/notifications/notificationPolicy";
16
+ export { DEFAULT_HIDDEN_PACKAGES } from "./stores/appVisibility";
15
17
  export type { WifiSearchResult } from "./facades/glassesWifi";
16
18
  export type { IdentitySnapshot } from "./services/PairingIdentity";
17
19
  export type { DisplayMirrorEvent } from "./facades/displayMirror";
18
20
  export type { IslandConfigureOptions, IslandAuth, IslandConfigValues, IslandAnalytics, IslandUiSeams, ScanQrOptions, ScanQrResult, SubjectTokenType, } from "./runtime/bootstrap";
19
- export { SETTINGS, useSetting } from "./stores/settings";
20
- export { isCustomDashboardEligible, normalizeDashboardWidgets, DASHBOARD_WIDGET_IDS, type DashboardWidgetId, type DashboardWidgetSetting, } from "./services/CustomDashboardModel";
21
+ export { SETTINGS, useSetting, AI_DATA_CONSENT_VERSION } from "./stores/settings";
22
+ export { isCfwFirmwareVersion, isCustomDashboardEligible } from "./services/pages/pageEligibility";
21
23
  export { AI_TIERS, TIER_MODEL_OPTIONS, parseTierSetting } from "./services/AiTierResolution";
22
24
  export type { AiTier, AiTierProvider, TierModelOption } from "./services/AiTierResolution";
23
25
  export type { MemoryStats } from "./services/MemoryStore";
@@ -42,7 +44,7 @@ export { deriveGalleryDisplayName } from "./utils/permissions/galleryDisplayName
42
44
  export type { PhotoInfo, CaptureFile, CaptureGroup, GalleryResponse, ServerStatus, HealthResponse, GalleryEvent, } from "./types/asg";
43
45
  export type { PairFailureEvent, GlassesNotReadyEvent } from "@glassly/bluetooth-sdk";
44
46
  export { WebSocketStatus } from "./stores/connection";
45
- export { DUMMY_APPLET, saveAppsOrder, getAppsOrder, sortAppsByPackageNamePriority, saveLastOpenTime, getLastOpenTime, sortAppsByLastOpenTime, useApps, useStart, useStop, useSetForeground, useClearForeground, useRefresh, useStopAll, useInstall, useUninstall, useActiveApps, useActiveBackgroundApps, useBackgroundApps, useActiveForegroundApp, useForegroundApp, useActiveBackgroundAppsCount, useLocalMiniApps, type StartOptions, type OrderMap, } from "./stores/apps";
47
+ export { DUMMY_APPLET, saveAppsOrder, getAppsOrder, sortAppsByPackageNamePriority, saveLastOpenTime, getLastOpenTime, sortAppsByLastOpenTime, useApps, useStart, useStop, useSetForeground, useClearForeground, useRefresh, useStopAll, useInstall, useUninstall, useActiveApps, useRunningPersistentApps, useActiveBackgroundApps, useBackgroundApps, useActiveForegroundApp, useForegroundApp, useActiveBackgroundAppsCount, useLocalMiniApps, type StartOptions, type OrderMap, } from "./stores/apps";
46
48
  export { decideDevLaunchRoute, type DecideDevLaunchOptions, type DevLaunchResult, type DevManifest, } from "./utils/devMiniappLaunch";
47
49
  export { HardwareCompatibility, type CompatibilityResult } from "./utils/hardware";
48
50
  export { BgTimer, throttle, debounce } from "./utils/timers";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}