@glassly/engine 0.1.0-dev.99 → 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
@@ -3,7 +3,6 @@ import {AsyncResult, result as Res, Result} from "typesafe-ts"
3
3
  import {create} from "zustand"
4
4
  import {subscribeWithSelector} from "zustand/middleware"
5
5
 
6
- import {normalizeDashboardWidgets} from "../services/CustomDashboardModel"
7
6
  import {storage} from "../utils/storage"
8
7
  import {getBluetoothSettingKeysForDevice} from "./bluetoothSettingKeys"
9
8
  import {useGlassesStore} from "./glasses"
@@ -49,6 +48,11 @@ export interface Setting {
49
48
  resetOnBuildEnvChange?: true
50
49
  }
51
50
 
51
+ // The provider list the data-consent screen currently shows. Stored per
52
+ // install so a later bump can be told apart from an older answer; the boot
53
+ // router only shows the screen during first onboarding today.
54
+ export const AI_DATA_CONSENT_VERSION = 1
55
+
52
56
  export const SETTINGS: Record<string, Setting> = {
53
57
  // feature flags / mantle settings:
54
58
  dev_mode: {key: "dev_mode", defaultValue: () => __DEV__, writable: true, saveOnServer: true, persist: true}, // deprecated
@@ -77,8 +81,12 @@ export const SETTINGS: Record<string, Setting> = {
77
81
  saveOnServer: true,
78
82
  persist: true,
79
83
  },
80
- miniapp_dev_mode: {
81
- key: "miniapp_dev_mode",
84
+ // Developer tools: shows the Miniapp Developer launcher and the dev-only
85
+ // bundled miniapps (see DEV_TOOLS_PACKAGES). Off by default so ordinary
86
+ // installs never see them. Replaced the legacy `miniapp_dev_mode` key,
87
+ // which only controlled the Miniapp Developer home tile.
88
+ dev_tools: {
89
+ key: "dev_tools",
82
90
  defaultValue: () => false,
83
91
  writable: true,
84
92
  saveOnServer: true,
@@ -132,10 +140,10 @@ export const SETTINGS: Record<string, Setting> = {
132
140
  },
133
141
  // Show the glasses display mirror on the home screen even when a real
134
142
  // (non-simulated) pair of glasses is paired. Toggled from the glasses card's
135
- // long-press menu.
143
+ // long-press menu. Default on.
136
144
  home_mirror: {
137
145
  key: "home_mirror",
138
- defaultValue: () => false,
146
+ defaultValue: () => true,
139
147
  writable: true,
140
148
  saveOnServer: true,
141
149
  persist: true,
@@ -223,6 +231,37 @@ export const SETTINGS: Record<string, Setting> = {
223
231
  saveOnServer: false,
224
232
  persist: true,
225
233
  },
234
+ // In-app disclosure of which third parties receive user data (App Store
235
+ // 5.1.2(i)). `_version` is the AI_DATA_CONSENT_VERSION the user last saw
236
+ // and `_agreed` is their answer. Declining turns disable_cloud on. The
237
+ // screen is part of first onboarding only. Device-local: consent is a
238
+ // property of this install, and logout's resetAllLocal() clears it so the
239
+ // next account is asked afresh.
240
+ ai_data_consent_version: {
241
+ key: "ai_data_consent_version",
242
+ defaultValue: () => 0,
243
+ writable: true,
244
+ saveOnServer: false,
245
+ persist: true,
246
+ },
247
+ ai_data_consent_agreed: {
248
+ key: "ai_data_consent_agreed",
249
+ defaultValue: () => false,
250
+ writable: true,
251
+ saveOnServer: false,
252
+ persist: true,
253
+ },
254
+ // The user chose "Continue without an account" on the login screen. Boot
255
+ // treats no-session + this flag as guest mode (cloud disabled, no token
256
+ // exchange). Signing in clears it. Device-local like disable_cloud; logout's
257
+ // resetAllLocal() drops it so the login screen offers Skip again.
258
+ login_skipped: {
259
+ key: "login_skipped",
260
+ defaultValue: () => false,
261
+ writable: true,
262
+ saveOnServer: false,
263
+ persist: true,
264
+ },
226
265
  // Cloud V2 endpoint OVERRIDES. Empty = no override; cloudClient's resolveUrl
227
266
  // owns the full precedence (override -> env -> Metro-derived dev default).
228
267
  // The value may be an explicit URL or the METRO_AUTO sentinel ("my dev
@@ -428,6 +467,16 @@ export const SETTINGS: Record<string, Setting> = {
428
467
  persist: true,
429
468
  nativeAuthoritative: true,
430
469
  },
470
+ // Latched true the first time the identity projects as paired to real
471
+ // (non-simulated) glasses; never cleared, so forgetting the glasses keeps
472
+ // what it unlocked (the Store). Per-phone like the identity it derives from.
473
+ has_paired_glasses: {
474
+ key: "has_paired_glasses",
475
+ defaultValue: () => false,
476
+ writable: true,
477
+ saveOnServer: false,
478
+ persist: true,
479
+ },
431
480
  default_controller: {
432
481
  key: "default_controller",
433
482
  defaultValue: () => "",
@@ -436,6 +485,16 @@ export const SETTINGS: Record<string, Setting> = {
436
485
  persist: true,
437
486
  nativeAuthoritative: true,
438
487
  },
488
+ // Display name of the keyboard the glasses remember (G2 Glassly CFW). The
489
+ // native bridge owns the address/bond; this only keeps the home card and
490
+ // settings row populated before the glasses connect, like default_controller.
491
+ keyboard_name: {
492
+ key: "keyboard_name",
493
+ defaultValue: () => "",
494
+ writable: true,
495
+ saveOnServer: false,
496
+ persist: true,
497
+ },
439
498
  pending_controller: {
440
499
  key: "pending_controller",
441
500
  defaultValue: () => "",
@@ -476,13 +535,6 @@ export const SETTINGS: Record<string, Setting> = {
476
535
  saveOnServer: true,
477
536
  persist: true,
478
537
  },
479
- enable_phone_notifications: {
480
- key: "enable_phone_notifications",
481
- defaultValue: () => false,
482
- writable: true,
483
- saveOnServer: true,
484
- persist: true,
485
- },
486
538
  settings_access_count: {
487
539
  key: "settings_access_count",
488
540
  defaultValue: () => 0,
@@ -650,13 +702,6 @@ export const SETTINGS: Record<string, Setting> = {
650
702
  saveOnServer: true,
651
703
  persist: true,
652
704
  },
653
- use_native_dashboard: {
654
- key: "use_native_dashboard",
655
- defaultValue: () => true,
656
- writable: true,
657
- saveOnServer: true,
658
- persist: true,
659
- },
660
705
  // Debug escape hatch: G2 scene rendering through the Glassly CFW
661
706
  // direct-framebuffer path (rasterized mode-3 frames into the carrier).
662
707
  // ON by default — the working production path on CFW glasses; OFF falls
@@ -671,8 +716,34 @@ export const SETTINGS: Record<string, Setting> = {
671
716
  saveOnServer: false,
672
717
  persist: true,
673
718
  },
719
+ // Debug: ask Glassly CFW glasses (revision 26+) for the 7.5 ms / latency-0
720
+ // fast BLE connection profile with slow mode suppressed, instead of the
721
+ // stock 15-30 ms link and its one-minute slow-mode timer. OFF by default:
722
+ // the fast link costs battery whenever the phone is merely connected, and
723
+ // the phone must agree to the interval. Synced to the Bluetooth SDK, which
724
+ // sends the control to both lenses and re-sends it on every CFW detection.
725
+ // Device-local debug knob, so not saved on the server.
726
+ cfw_fast_ble: {
727
+ key: "cfw_fast_ble",
728
+ defaultValue: () => false,
729
+ writable: true,
730
+ saveOnServer: false,
731
+ persist: true,
732
+ },
733
+ // Maximum rate at which display updates leave the phone for the glasses.
734
+ // The Bluetooth SDK paces every scene frame and legacy layout to this,
735
+ // coalescing faster updates last-wins; clears bypass it. No effect on G2
736
+ // custom firmware, whose driver coalesces off the link itself. Device-local
737
+ // debug knob (2..20), so not saved on the server.
738
+ display_max_fps: {
739
+ key: "display_max_fps",
740
+ defaultValue: () => 8,
741
+ writable: true,
742
+ saveOnServer: false,
743
+ persist: true,
744
+ },
674
745
  // Master switch for the Scene API dashboard on G2 custom firmware
675
- // (CustomDashboardService.isEligible). Off leaves an eligible device on the
746
+ // (the dashboard's eligibility). Off leaves an eligible device on the
676
747
  // native head-up behavior. Device-local debug knob, so not saved on the
677
748
  // server.
678
749
  custom_dashboard_enabled: {
@@ -682,6 +753,37 @@ export const SETTINGS: Record<string, Setting> = {
682
753
  saveOnServer: false,
683
754
  persist: true,
684
755
  },
756
+ // Debug: time each dashboard open (head-up / double tap → glasses frame)
757
+ // and post the stage timeline as a phone notification. Persisted so a
758
+ // slow first open after an app restart is still caught. Device-local.
759
+ debug_dashboard_open_timing: {
760
+ key: "debug_dashboard_open_timing",
761
+ defaultValue: () => false,
762
+ writable: true,
763
+ saveOnServer: false,
764
+ persist: true,
765
+ },
766
+ // Debug escape hatch: enter the G2's firmware-rendered navigation mode on
767
+ // custom firmware too. Off by default: CFW draws the navigation miniapp's
768
+ // own HUD through the scene canvas and reads session.compass directly, so
769
+ // native nav mode is reserved for stock firmware. Device-local debug knob,
770
+ // so not saved on the server.
771
+ cfw_native_navigation: {
772
+ key: "cfw_native_navigation",
773
+ defaultValue: () => false,
774
+ writable: true,
775
+ saveOnServer: false,
776
+ persist: true,
777
+ },
778
+ // Debug: open miniapps from their last screenshot, fading straight into the
779
+ // app. Off shows the splash instead. Device-local, default on.
780
+ use_screenshot_transition: {
781
+ key: "use_screenshot_transition",
782
+ defaultValue: () => true,
783
+ writable: true,
784
+ saveOnServer: false,
785
+ persist: true,
786
+ },
685
787
  // Gesture-dots debug indicator: flash a glyph on the glasses when a touch
686
788
  // gesture is received while the display is empty. Works on any
687
789
  // scene-capable device, not only CFW. Device-local debug knob, default off.
@@ -710,24 +812,33 @@ export const SETTINGS: Record<string, Setting> = {
710
812
  saveOnServer: false,
711
813
  persist: true,
712
814
  },
713
- // Ordered [{id, enabled}] list — the widget composition of the dashboard.
714
- custom_dashboard_widgets: {
715
- key: "custom_dashboard_widgets",
716
- defaultValue: () => normalizeDashboardWidgets(null),
815
+ // "solid" | "two_tone": the battery widgets' G and R.
816
+ custom_dashboard_battery_style: {
817
+ key: "custom_dashboard_battery_style",
818
+ defaultValue: () => "solid",
819
+ writable: true,
820
+ saveOnServer: false,
821
+ persist: true,
822
+ },
823
+ // {preset, slots: {slotId: widgetId}, scratchpad: [widgetId]} — the
824
+ // dashboard miniapp owns the shape and its default; null draws its default layout.
825
+ custom_dashboard_layout: {
826
+ key: "custom_dashboard_layout",
827
+ defaultValue: () => null,
717
828
  writable: true,
718
829
  saveOnServer: false,
719
830
  persist: true,
720
831
  },
721
832
  custom_dashboard_calendar_event_count: {
722
833
  key: "custom_dashboard_calendar_event_count",
723
- defaultValue: () => 2,
834
+ defaultValue: () => 3,
724
835
  writable: true,
725
836
  saveOnServer: false,
726
837
  persist: true,
727
838
  },
728
839
  custom_dashboard_calendar_days_ahead: {
729
840
  key: "custom_dashboard_calendar_days_ahead",
730
- defaultValue: () => 3,
841
+ defaultValue: () => 5,
731
842
  writable: true,
732
843
  saveOnServer: false,
733
844
  persist: true,
@@ -910,42 +1021,58 @@ export const SETTINGS: Record<string, Setting> = {
910
1021
  saveOnServer: true,
911
1022
  persist: true,
912
1023
  },
913
- // iOS: apps observed posting notifications, reported by the glasses' ANCS
914
- // client ({appId, displayName, lastSeen}[]). Backs the filter UI, since iOS
915
- // has no installed-apps enumeration. Device-local by design.
916
- ios_notification_seen_apps: {
917
- key: "ios_notification_seen_apps",
1024
+ // Apps the connected glasses reported posting notifications (bundle/package
1025
+ // id + display name). Backs the filter UI where the phone cannot enumerate
1026
+ // apps itself and the allowlist pushed to firmware that filters on-glass.
1027
+ notification_seen_apps: {
1028
+ key: "notification_seen_apps",
918
1029
  defaultValue: () => [],
919
1030
  writable: true,
920
1031
  saveOnServer: false,
921
1032
  persist: true,
922
1033
  },
923
- // G2 on-glass notification display behavior (NotificationControl):
924
- g2_notifications_enabled: {
925
- key: "g2_notifications_enabled",
1034
+ // Notification display, any glasses: firmware that presents notifications
1035
+ // itself receives these as a GlassesNotificationConfig; the engine's own
1036
+ // viewer reads the same four. Master switch first.
1037
+ notifications_enabled: {
1038
+ key: "notifications_enabled",
926
1039
  defaultValue: () => true,
927
1040
  writable: true,
928
1041
  saveOnServer: true,
929
1042
  persist: true,
930
1043
  },
931
- g2_notification_auto_display: {
932
- key: "g2_notification_auto_display",
1044
+ // Show a popup when a notification arrives; off keeps history only.
1045
+ notifications_popups: {
1046
+ key: "notifications_popups",
933
1047
  defaultValue: () => true,
934
1048
  writable: true,
935
1049
  saveOnServer: true,
936
1050
  persist: true,
937
1051
  },
938
- // Popup duration in seconds; firmware accepts 0 (default), 5, 7, 10.
939
- g2_notification_disp_time: {
940
- key: "g2_notification_disp_time",
1052
+ // Popup duration in seconds; 0 lets the firmware or viewer pick its default.
1053
+ notifications_popup_seconds: {
1054
+ key: "notifications_popup_seconds",
941
1055
  defaultValue: () => 5,
942
1056
  writable: true,
943
1057
  saveOnServer: true,
944
1058
  persist: true,
945
1059
  },
946
- // Suppress popups while another on-glass feature (navigation, teleprompter) is active.
947
- g2_notification_avoid_disturb: {
948
- key: "g2_notification_avoid_disturb",
1060
+ // Hold popups while another glasses feature (navigation, a miniapp) is on screen.
1061
+ notifications_hold_during_apps: {
1062
+ key: "notifications_hold_during_apps",
1063
+ defaultValue: () => true,
1064
+ writable: true,
1065
+ saveOnServer: true,
1066
+ persist: true,
1067
+ },
1068
+ // Experimental, any glasses: hold notification popups while the phone is in
1069
+ // use (unlocked, or the Glassly App foregrounded), so a notification isn't
1070
+ // shown on the glasses and the phone screen at once. The dashboard reducer
1071
+ // reads it with PhoneActivity when a notification posts; on iOS
1072
+ // PhoneNotificationsSync also folds it into the stock G2 firmware's
1073
+ // auto_display, which pops notifications up on its own.
1074
+ notifications_ignore_while_active: {
1075
+ key: "notifications_ignore_while_active",
949
1076
  defaultValue: () => true,
950
1077
  writable: true,
951
1078
  saveOnServer: true,
@@ -1001,9 +1128,9 @@ export const BLUETOOTH_SETTING_KEYS: string[] = [
1001
1128
  SETTINGS.dashboard_depth.key,
1002
1129
  SETTINGS.menu_apps.key,
1003
1130
  SETTINGS.calendar_events.key,
1004
- // G2 native reads this to gate rendering while the ER firmware dashboard is open.
1005
- SETTINGS.use_native_dashboard.key,
1006
1131
  SETTINGS.cfw_scene_renderer.key,
1132
+ SETTINGS.cfw_fast_ble.key,
1133
+ SETTINGS.display_max_fps.key,
1007
1134
  SETTINGS.twelve_hour_time.key,
1008
1135
  SETTINGS.metric_system.key,
1009
1136
  // button:
@@ -1070,13 +1197,10 @@ export interface SettingsState {
1070
1197
  }
1071
1198
 
1072
1199
  const getDefaultSettings = () =>
1073
- Object.keys(SETTINGS).reduce(
1074
- (acc, key) => {
1075
- acc[key] = SETTINGS[key].defaultValue()
1076
- return acc
1077
- },
1078
- {} as Record<string, any>,
1079
- )
1200
+ Object.keys(SETTINGS).reduce((acc, key) => {
1201
+ acc[key] = SETTINGS[key].defaultValue()
1202
+ return acc
1203
+ }, {} as Record<string, any>)
1080
1204
 
1081
1205
  // Single-flight for loadAllSettings: the host fires it at module load and
1082
1206
  // engine.start()'s device-store hydration awaits it — without the memo the
@@ -3,7 +3,6 @@ import type {ReactNode} from "react"
3
3
  * App and miniapp types owned by @glassly/engine.
4
4
  */
5
5
 
6
-
7
6
  import {HardwareRequirement} from "./hardware"
8
7
 
9
8
  import type {CompatibilityResult} from "../utils/hardware/hardware"
@@ -24,6 +23,7 @@ export type AppPermissionType =
24
23
  | "LOCATION"
25
24
  | "BACKGROUND_LOCATION"
26
25
  | "READ_NOTIFICATIONS"
26
+ | "DISPLAY_MIRROR"
27
27
  | "POST_NOTIFICATIONS"
28
28
  | "API_KEYS"
29
29
  | "MEMORY"
@@ -107,12 +107,25 @@ export interface ClientApp extends AppletInterface {
107
107
  loading: boolean
108
108
  local: boolean
109
109
  hidden: boolean
110
+ /**
111
+ * Persistent miniapp: the host starts it at launch and it only stops from
112
+ * the app switcher's persistent pill; its card cannot be swiped away and
113
+ * the capsule close minimizes it. Manifest `persistent` gives the default;
114
+ * the wearer's choice persists beside the hidden flag.
115
+ */
116
+ persistent?: boolean
110
117
  onStart?: () => void
111
118
  onStop?: () => void
112
119
  screenshot?: string
113
120
  runtimePermissions?: string[]
114
121
  declaredPermissions?: string[]
115
122
  version?: string
123
+ /** Manifest `description`: the paragraph the store and the info page show. */
124
+ description?: string
125
+ /** Manifest `tagline`: one line under the name. */
126
+ tagline?: string
127
+ /** Manifest `tags`: lowercase store tag slugs. */
128
+ tags?: string[]
116
129
  needsPcm?: boolean
117
130
  needsTranscript?: boolean
118
131
  devUrl?: string
@@ -88,6 +88,9 @@ export const evenRealitiesG2: Capabilities = {
88
88
  // OTA capabilities - G2 firmware updates are not driven by the ASG OTA flow
89
89
  hasOta: false,
90
90
 
91
+ // Glassly CFW is bundled for the G2 and flashed over BLE from the app
92
+ hasCustomFirmware: true,
93
+
91
94
  // Dashboard - G2 renders Even Realities' native dashboard in firmware, so
92
95
  // Glassly does not manage the dashboard or expose dashboard settings for it
93
96
  hasNativeDashboard: true,
@@ -96,4 +99,7 @@ export const evenRealitiesG2: Capabilities = {
96
99
  // 576×188 overview map); magnetometer streams only while it is active
97
100
  hasNativeNavigation: true,
98
101
 
102
+ // Firmware notification centre: popups + history, on-glass app filter.
103
+ hasNativeNotifications: true,
104
+ nativeNotificationPopupSeconds: [0, 5, 7, 10],
99
105
  }
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * Capability profile for the Simulated Glasses model.
5
5
  * Defines the hardware and software features available on this device.
6
- * This profile matches the Vuzix Z100 capabilities for testing purposes.
6
+ * The display previews the G2 Glassly CFW scene API, including SVG and rotation.
7
7
  */
8
8
 
9
9
  import type {Capabilities} from "../hardware"
@@ -38,10 +38,14 @@ export const simulatedGlasses: Capabilities = {
38
38
  width: 576,
39
39
  height: 288,
40
40
  canPosition: true,
41
- maxTextElements: 6,
42
- maxImageElements: 4,
43
- shapes: ["rect"],
41
+ maxTextElements: 120,
42
+ maxImageElements: 120,
43
+ shapes: ["rect", "circle", "arc", "pie", "line", "triangle", "quad", "bezier", "svg"],
44
+ animation: true,
45
+ rotation: true,
46
+ depth: true,
44
47
  // The mirror renders full 8-bit grayscale; 16 matches the G2's 4-bit
48
+
45
49
  // panel so simulated output previews what real hardware can show.
46
50
  intensityLevels: 16,
47
51
  partialUpdate: true,
@@ -56,11 +56,31 @@ export interface DisplayCapabilities {
56
56
  maxImageElements?: number
57
57
  /** Per-image dimension cap (box-level), when the firmware has one. */
58
58
  maxImagePx?: {width: number; height: number}
59
- shapes?: "rect"[]
59
+ shapes?: DisplayShape[]
60
+ /** True ⇒ the device animates element transitions itself. */
61
+ animation?: boolean
62
+ /** Geometric and SVG rotations, including duration-based transitions. */
63
+ rotation?: boolean
64
+ /** Per-element stereo `depth` (a lens disparity) is honored; otherwise elements draw flat. */
65
+ depth?: boolean
60
66
  intensityLevels?: number
67
+
61
68
  partialUpdate?: boolean
69
+ /**
70
+ * The views a miniapp may draw right now: "main" for every app, "dashboard"
71
+ * (the overlay slot) only for the designated system dashboard app while the
72
+ * glasses are eligible. Per app; filled in by the miniapp runtime.
73
+ */
74
+ views?: DisplayView[]
62
75
  }
63
76
 
77
+ export type DisplayView = "main" | "dashboard"
78
+
79
+ export type DisplayShape = "rect" | "circle" | "arc" | "pie" | "line" | "triangle" | "quad" | "bezier" | "svg"
80
+
81
+ /** Every vector shape the Glassly CFW rasterizes on the glasses. */
82
+ export const ALL_DISPLAY_SHAPES: DisplayShape[] = ["rect", "circle", "arc", "pie", "line", "triangle", "quad", "bezier"]
83
+
64
84
  /**
65
85
  * Microphone capabilities
66
86
  */
@@ -164,6 +184,10 @@ export interface Capabilities {
164
184
  // OTA capability
165
185
  hasOta?: boolean
166
186
 
187
+ // True when the app ships a flashable Glassly custom firmware for this
188
+ // model, so pairing can offer to install it and Settings exposes the flasher
189
+ hasCustomFirmware?: boolean
190
+
167
191
  // Native dashboard capability
168
192
  // True when the device renders its own dashboard in firmware (e.g. Even
169
193
  // Realities' built-in dashboard on G2). Glassly does not manage or expose
@@ -175,6 +199,15 @@ export interface Capabilities {
175
199
  // (G2 nav mode: instruction card + map slots + magnetometer compass); nav
176
200
  // apps feed it structured fields and map bitmaps instead of scene elements
177
201
  hasNativeNavigation?: boolean
202
+
203
+ // True when the firmware presents phone notifications itself (popup +
204
+ // history) and takes a GlassesNotificationConfig. How it gets the content
205
+ // (reading the phone's stream, or an upload from the phone) is the driver's
206
+ // business; the engine only decides who presents.
207
+ hasNativeNotifications?: boolean
208
+ // Popup durations the firmware accepts, in seconds (0 = firmware default).
209
+ // Drivers snap other values; the settings UI offers exactly these.
210
+ nativeNotificationPopupSeconds?: number[]
178
211
  }
179
212
 
180
213
  /**
@@ -17,6 +17,7 @@ export type {
17
17
  PowerCapabilities,
18
18
  Capabilities,
19
19
  } from "./hardware"
20
+ export {ALL_DISPLAY_SHAPES} from "./hardware"
20
21
 
21
22
  export {
22
23
  HARDWARE_CAPABILITIES,
@@ -1,22 +1,26 @@
1
+ import {BgTimer} from "./timers"
2
+
1
3
  /**
2
4
  * Merge partial patches and flush once after `delayMs` of quiet time.
3
- * Uses global setTimeout so Jest fake timers can advance debounced writes.
5
+ * Runs on BgTimer so a debounced write still lands while the app is
6
+ * backgrounded; off-Android (and under Jest) BgTimer falls through to the
7
+ * global timer, so fake timers can still advance it.
4
8
  */
5
9
  export function createDebouncedPatchFlusher<T extends Record<string, unknown>>(
6
10
  flush: (patch: T) => void,
7
11
  delayMs: number,
8
12
  ) {
9
13
  let pending = {} as T
10
- let timer: ReturnType<typeof setTimeout> | null = null
14
+ let timer: number | null = null
11
15
 
12
16
  const schedule = (callback: () => void) => {
13
- timer = setTimeout(callback, delayMs) as ReturnType<typeof setTimeout>
17
+ timer = BgTimer.setTimeout(callback, delayMs)
14
18
  }
15
19
 
16
20
  return (patch: Partial<T>) => {
17
21
  pending = {...pending, ...patch}
18
22
  if (timer != null) {
19
- clearTimeout(timer)
23
+ BgTimer.clearTimeout(timer)
20
24
  }
21
25
  schedule(() => {
22
26
  timer = null
@@ -22,6 +22,8 @@
22
22
  import {configuredDevHost} from "./configuredDevHost"
23
23
  import {storage} from "./storage/storage"
24
24
 
25
+ import {BgTimer} from "./timers"
26
+
25
27
  const REACHABILITY_TIMEOUT_MS = 1500
26
28
 
27
29
  // A single dropped DNS lookup or momentary Wi-Fi blip (AP roam, DHCP renewal,
@@ -53,13 +55,13 @@ export type DecideDevLaunchOptions = {
53
55
  }
54
56
 
55
57
  function delay(ms: number): Promise<void> {
56
- return new Promise((resolve) => setTimeout(resolve, ms))
58
+ return new Promise((resolve) => BgTimer.setTimeout(resolve, ms))
57
59
  }
58
60
 
59
61
  /** Single GET <devUrl>/miniapp.json attempt with a hard timeout. */
60
62
  async function fetchManifestOnce(devUrl: string): Promise<DevManifest | null> {
61
63
  const controller = new AbortController()
62
- const timer = setTimeout(() => controller.abort(), REACHABILITY_TIMEOUT_MS)
64
+ const timer = BgTimer.setTimeout(() => controller.abort(), REACHABILITY_TIMEOUT_MS)
63
65
  try {
64
66
  const res = await fetch(`${devUrl.replace(/\/$/, "")}/miniapp.json`, {
65
67
  method: "GET",
@@ -68,7 +70,7 @@ async function fetchManifestOnce(devUrl: string): Promise<DevManifest | null> {
68
70
  if (!res.ok) return null
69
71
  return (await res.json()) as DevManifest
70
72
  } finally {
71
- clearTimeout(timer)
73
+ BgTimer.clearTimeout(timer)
72
74
  }
73
75
  }
74
76