@mentra/engine 0.1.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (842) hide show
  1. package/README.md +79 -0
  2. package/build/devtools.d.ts +11 -0
  3. package/build/devtools.d.ts.map +1 -0
  4. package/build/devtools.js +13 -0
  5. package/build/devtools.js.map +1 -0
  6. package/build/engine.d.ts +261 -0
  7. package/build/engine.d.ts.map +1 -0
  8. package/build/engine.js +170 -0
  9. package/build/engine.js.map +1 -0
  10. package/build/facades/dev.d.ts +58 -0
  11. package/build/facades/dev.d.ts.map +1 -0
  12. package/build/facades/dev.js +189 -0
  13. package/build/facades/dev.js.map +1 -0
  14. package/build/facades/display.d.ts +21 -0
  15. package/build/facades/display.d.ts.map +1 -0
  16. package/build/facades/display.js +17 -0
  17. package/build/facades/display.js.map +1 -0
  18. package/build/facades/displayMirror.d.ts +15 -0
  19. package/build/facades/displayMirror.d.ts.map +1 -0
  20. package/build/facades/displayMirror.js +29 -0
  21. package/build/facades/displayMirror.js.map +1 -0
  22. package/build/facades/gallery.d.ts +62 -0
  23. package/build/facades/gallery.d.ts.map +1 -0
  24. package/build/facades/gallery.js +61 -0
  25. package/build/facades/gallery.js.map +1 -0
  26. package/build/facades/glasses.d.ts +141 -0
  27. package/build/facades/glasses.d.ts.map +1 -0
  28. package/build/facades/glasses.js +199 -0
  29. package/build/facades/glasses.js.map +1 -0
  30. package/build/facades/glassesSettings.d.ts +13 -0
  31. package/build/facades/glassesSettings.d.ts.map +1 -0
  32. package/build/facades/glassesSettings.js +54 -0
  33. package/build/facades/glassesSettings.js.map +1 -0
  34. package/build/facades/glassesWifi.d.ts +25 -0
  35. package/build/facades/glassesWifi.d.ts.map +1 -0
  36. package/build/facades/glassesWifi.js +57 -0
  37. package/build/facades/glassesWifi.js.map +1 -0
  38. package/build/facades/miniapps.d.ts +43 -0
  39. package/build/facades/miniapps.d.ts.map +1 -0
  40. package/build/facades/miniapps.js +49 -0
  41. package/build/facades/miniapps.js.map +1 -0
  42. package/build/facades/notifications.d.ts +13 -0
  43. package/build/facades/notifications.d.ts.map +1 -0
  44. package/build/facades/notifications.js +12 -0
  45. package/build/facades/notifications.js.map +1 -0
  46. package/build/facades/ota.d.ts +103 -0
  47. package/build/facades/ota.d.ts.map +1 -0
  48. package/build/facades/ota.js +156 -0
  49. package/build/facades/ota.js.map +1 -0
  50. package/build/facades/pairing.d.ts +114 -0
  51. package/build/facades/pairing.d.ts.map +1 -0
  52. package/build/facades/pairing.js +275 -0
  53. package/build/facades/pairing.js.map +1 -0
  54. package/build/facades/permissions.d.ts +33 -0
  55. package/build/facades/permissions.d.ts.map +1 -0
  56. package/build/facades/permissions.js +155 -0
  57. package/build/facades/permissions.js.map +1 -0
  58. package/build/facades/phoneNotifications.d.ts +21 -0
  59. package/build/facades/phoneNotifications.d.ts.map +1 -0
  60. package/build/facades/phoneNotifications.js +51 -0
  61. package/build/facades/phoneNotifications.js.map +1 -0
  62. package/build/facades/reports.d.ts +36 -0
  63. package/build/facades/reports.d.ts.map +1 -0
  64. package/build/facades/reports.js +134 -0
  65. package/build/facades/reports.js.map +1 -0
  66. package/build/facades/session.d.ts +21 -0
  67. package/build/facades/session.d.ts.map +1 -0
  68. package/build/facades/session.js +52 -0
  69. package/build/facades/session.js.map +1 -0
  70. package/build/facades/settings.d.ts +37 -0
  71. package/build/facades/settings.d.ts.map +1 -0
  72. package/build/facades/settings.js +55 -0
  73. package/build/facades/settings.js.map +1 -0
  74. package/build/facades/speech.d.ts +30 -0
  75. package/build/facades/speech.d.ts.map +1 -0
  76. package/build/facades/speech.js +37 -0
  77. package/build/facades/speech.js.map +1 -0
  78. package/build/index.d.ts +43 -0
  79. package/build/index.d.ts.map +1 -0
  80. package/build/index.js +45 -0
  81. package/build/index.js.map +1 -0
  82. package/build/internal.d.ts +67 -0
  83. package/build/internal.d.ts.map +1 -0
  84. package/build/internal.js +90 -0
  85. package/build/internal.js.map +1 -0
  86. package/build/runtime/bootstrap.d.ts +83 -0
  87. package/build/runtime/bootstrap.d.ts.map +1 -0
  88. package/build/runtime/bootstrap.js +56 -0
  89. package/build/runtime/bootstrap.js.map +1 -0
  90. package/build/runtime/config.d.ts +146 -0
  91. package/build/runtime/config.d.ts.map +1 -0
  92. package/build/runtime/config.js +18 -0
  93. package/build/runtime/config.js.map +1 -0
  94. package/build/runtime/streamConfig.d.ts +4 -0
  95. package/build/runtime/streamConfig.d.ts.map +1 -0
  96. package/build/runtime/streamConfig.js +38 -0
  97. package/build/runtime/streamConfig.js.map +1 -0
  98. package/build/services/AppRegistry.d.ts +269 -0
  99. package/build/services/AppRegistry.d.ts.map +1 -0
  100. package/build/services/AppRegistry.js +1079 -0
  101. package/build/services/AppRegistry.js.map +1 -0
  102. package/build/services/AudioCloudUplink.d.ts +9 -0
  103. package/build/services/AudioCloudUplink.d.ts.map +1 -0
  104. package/build/services/AudioCloudUplink.js +48 -0
  105. package/build/services/AudioCloudUplink.js.map +1 -0
  106. package/build/services/AudioPlaybackService.d.ts +175 -0
  107. package/build/services/AudioPlaybackService.d.ts.map +1 -0
  108. package/build/services/AudioPlaybackService.js +705 -0
  109. package/build/services/AudioPlaybackService.js.map +1 -0
  110. package/build/services/AutomaticReportResult.d.ts +20 -0
  111. package/build/services/AutomaticReportResult.d.ts.map +1 -0
  112. package/build/services/AutomaticReportResult.js +29 -0
  113. package/build/services/AutomaticReportResult.js.map +1 -0
  114. package/build/services/BlobStore.d.ts +91 -0
  115. package/build/services/BlobStore.d.ts.map +1 -0
  116. package/build/services/BlobStore.js +668 -0
  117. package/build/services/BlobStore.js.map +1 -0
  118. package/build/services/CaptionsTesterReportService.d.ts +4 -0
  119. package/build/services/CaptionsTesterReportService.d.ts.map +1 -0
  120. package/build/services/CaptionsTesterReportService.js +80 -0
  121. package/build/services/CaptionsTesterReportService.js.map +1 -0
  122. package/build/services/CloudAudioSubscriptionSync.d.ts +24 -0
  123. package/build/services/CloudAudioSubscriptionSync.d.ts.map +1 -0
  124. package/build/services/CloudAudioSubscriptionSync.js +39 -0
  125. package/build/services/CloudAudioSubscriptionSync.js.map +1 -0
  126. package/build/services/CloudClientService.d.ts +143 -0
  127. package/build/services/CloudClientService.d.ts.map +1 -0
  128. package/build/services/CloudClientService.js +644 -0
  129. package/build/services/CloudClientService.js.map +1 -0
  130. package/build/services/CloudTranscriptE2EMetrics.d.ts +4 -0
  131. package/build/services/CloudTranscriptE2EMetrics.d.ts.map +1 -0
  132. package/build/services/CloudTranscriptE2EMetrics.js +24 -0
  133. package/build/services/CloudTranscriptE2EMetrics.js.map +1 -0
  134. package/build/services/ConnectionCoordinator.d.ts +51 -0
  135. package/build/services/ConnectionCoordinator.d.ts.map +1 -0
  136. package/build/services/ConnectionCoordinator.js +34 -0
  137. package/build/services/ConnectionCoordinator.js.map +1 -0
  138. package/build/services/DevServerBridge.d.ts +63 -0
  139. package/build/services/DevServerBridge.d.ts.map +1 -0
  140. package/build/services/DevServerBridge.js +294 -0
  141. package/build/services/DevServerBridge.js.map +1 -0
  142. package/build/services/DeviceEventRouter.d.ts +3 -0
  143. package/build/services/DeviceEventRouter.d.ts.map +1 -0
  144. package/build/services/DeviceEventRouter.js +190 -0
  145. package/build/services/DeviceEventRouter.js.map +1 -0
  146. package/build/services/DeviceStoreHydration.d.ts +38 -0
  147. package/build/services/DeviceStoreHydration.d.ts.map +1 -0
  148. package/build/services/DeviceStoreHydration.js +124 -0
  149. package/build/services/DeviceStoreHydration.js.map +1 -0
  150. package/build/services/DisplayProcessor.d.ts +223 -0
  151. package/build/services/DisplayProcessor.d.ts.map +1 -0
  152. package/build/services/DisplayProcessor.js +552 -0
  153. package/build/services/DisplayProcessor.js.map +1 -0
  154. package/build/services/GlassesReadiness.d.ts +41 -0
  155. package/build/services/GlassesReadiness.d.ts.map +1 -0
  156. package/build/services/GlassesReadiness.js +82 -0
  157. package/build/services/GlassesReadiness.js.map +1 -0
  158. package/build/services/GlassesSettingsSync.d.ts +33 -0
  159. package/build/services/GlassesSettingsSync.d.ts.map +1 -0
  160. package/build/services/GlassesSettingsSync.js +121 -0
  161. package/build/services/GlassesSettingsSync.js.map +1 -0
  162. package/build/services/GlassesStatusProjection.d.ts +3 -0
  163. package/build/services/GlassesStatusProjection.d.ts.map +1 -0
  164. package/build/services/GlassesStatusProjection.js +65 -0
  165. package/build/services/GlassesStatusProjection.js.map +1 -0
  166. package/build/services/HeadingService.d.ts +27 -0
  167. package/build/services/HeadingService.d.ts.map +1 -0
  168. package/build/services/HeadingService.js +96 -0
  169. package/build/services/HeadingService.js.map +1 -0
  170. package/build/services/LocalDisplayManager.d.ts +139 -0
  171. package/build/services/LocalDisplayManager.d.ts.map +1 -0
  172. package/build/services/LocalDisplayManager.js +579 -0
  173. package/build/services/LocalDisplayManager.js.map +1 -0
  174. package/build/services/LocalMiniappRuntime.d.ts +439 -0
  175. package/build/services/LocalMiniappRuntime.d.ts.map +1 -0
  176. package/build/services/LocalMiniappRuntime.js +3695 -0
  177. package/build/services/LocalMiniappRuntime.js.map +1 -0
  178. package/build/services/LocalSttFallbackCoordinator.d.ts +57 -0
  179. package/build/services/LocalSttFallbackCoordinator.d.ts.map +1 -0
  180. package/build/services/LocalSttFallbackCoordinator.js +137 -0
  181. package/build/services/LocalSttFallbackCoordinator.js.map +1 -0
  182. package/build/services/MentraJSCrashController.d.ts +97 -0
  183. package/build/services/MentraJSCrashController.d.ts.map +1 -0
  184. package/build/services/MentraJSCrashController.js +138 -0
  185. package/build/services/MentraJSCrashController.js.map +1 -0
  186. package/build/services/MentraJSCrashloopReportService.d.ts +9 -0
  187. package/build/services/MentraJSCrashloopReportService.d.ts.map +1 -0
  188. package/build/services/MentraJSCrashloopReportService.js +54 -0
  189. package/build/services/MentraJSCrashloopReportService.js.map +1 -0
  190. package/build/services/MentraJSLogPipeline.d.ts +87 -0
  191. package/build/services/MentraJSLogPipeline.d.ts.map +1 -0
  192. package/build/services/MentraJSLogPipeline.js +137 -0
  193. package/build/services/MentraJSLogPipeline.js.map +1 -0
  194. package/build/services/MentraJSRouter.d.ts +203 -0
  195. package/build/services/MentraJSRouter.d.ts.map +1 -0
  196. package/build/services/MentraJSRouter.js +480 -0
  197. package/build/services/MentraJSRouter.js.map +1 -0
  198. package/build/services/MentraUIRouter.d.ts +137 -0
  199. package/build/services/MentraUIRouter.d.ts.map +1 -0
  200. package/build/services/MentraUIRouter.js +210 -0
  201. package/build/services/MentraUIRouter.js.map +1 -0
  202. package/build/services/MicStateCoordinator.d.ts +37 -0
  203. package/build/services/MicStateCoordinator.d.ts.map +1 -0
  204. package/build/services/MicStateCoordinator.js +81 -0
  205. package/build/services/MicStateCoordinator.js.map +1 -0
  206. package/build/services/MiniappEngine.d.ts +31 -0
  207. package/build/services/MiniappEngine.d.ts.map +1 -0
  208. package/build/services/MiniappEngine.js +119 -0
  209. package/build/services/MiniappEngine.js.map +1 -0
  210. package/build/services/MiniappLauncher.d.ts +129 -0
  211. package/build/services/MiniappLauncher.d.ts.map +1 -0
  212. package/build/services/MiniappLauncher.js +291 -0
  213. package/build/services/MiniappLauncher.js.map +1 -0
  214. package/build/services/MiniappRunningRegistry.d.ts +24 -0
  215. package/build/services/MiniappRunningRegistry.d.ts.map +1 -0
  216. package/build/services/MiniappRunningRegistry.js +52 -0
  217. package/build/services/MiniappRunningRegistry.js.map +1 -0
  218. package/build/services/NativeHttpResponse.d.ts +3 -0
  219. package/build/services/NativeHttpResponse.d.ts.map +1 -0
  220. package/build/services/NativeHttpResponse.js +6 -0
  221. package/build/services/NativeHttpResponse.js.map +1 -0
  222. package/build/services/NavigationHandlers.d.ts +90 -0
  223. package/build/services/NavigationHandlers.d.ts.map +1 -0
  224. package/build/services/NavigationHandlers.js +379 -0
  225. package/build/services/NavigationHandlers.js.map +1 -0
  226. package/build/services/NavigationService.d.ts +254 -0
  227. package/build/services/NavigationService.d.ts.map +1 -0
  228. package/build/services/NavigationService.js +553 -0
  229. package/build/services/NavigationService.js.map +1 -0
  230. package/build/services/NotificationsEmitter.d.ts +28 -0
  231. package/build/services/NotificationsEmitter.d.ts.map +1 -0
  232. package/build/services/NotificationsEmitter.js +22 -0
  233. package/build/services/NotificationsEmitter.js.map +1 -0
  234. package/build/services/OfflineSpeechModelService.d.ts +33 -0
  235. package/build/services/OfflineSpeechModelService.d.ts.map +1 -0
  236. package/build/services/OfflineSpeechModelService.js +136 -0
  237. package/build/services/OfflineSpeechModelService.js.map +1 -0
  238. package/build/services/OtaInstallCoordinator.d.ts +195 -0
  239. package/build/services/OtaInstallCoordinator.d.ts.map +1 -0
  240. package/build/services/OtaInstallCoordinator.js +1047 -0
  241. package/build/services/OtaInstallCoordinator.js.map +1 -0
  242. package/build/services/OtaService.d.ts +3 -0
  243. package/build/services/OtaService.d.ts.map +1 -0
  244. package/build/services/OtaService.js +65 -0
  245. package/build/services/OtaService.js.map +1 -0
  246. package/build/services/OtaUpdateCheckService.d.ts +65 -0
  247. package/build/services/OtaUpdateCheckService.d.ts.map +1 -0
  248. package/build/services/OtaUpdateCheckService.js +260 -0
  249. package/build/services/OtaUpdateCheckService.js.map +1 -0
  250. package/build/services/PairingIdentity.d.ts +80 -0
  251. package/build/services/PairingIdentity.d.ts.map +1 -0
  252. package/build/services/PairingIdentity.js +145 -0
  253. package/build/services/PairingIdentity.js.map +1 -0
  254. package/build/services/PhoneCalendarHelpers.d.ts +32 -0
  255. package/build/services/PhoneCalendarHelpers.d.ts.map +1 -0
  256. package/build/services/PhoneCalendarHelpers.js +157 -0
  257. package/build/services/PhoneCalendarHelpers.js.map +1 -0
  258. package/build/services/PhoneCalendarService.d.ts +5 -0
  259. package/build/services/PhoneCalendarService.d.ts.map +1 -0
  260. package/build/services/PhoneCalendarService.js +24 -0
  261. package/build/services/PhoneCalendarService.js.map +1 -0
  262. package/build/services/PhoneCameraFovCoordinator.d.ts +28 -0
  263. package/build/services/PhoneCameraFovCoordinator.d.ts.map +1 -0
  264. package/build/services/PhoneCameraFovCoordinator.js +180 -0
  265. package/build/services/PhoneCameraFovCoordinator.js.map +1 -0
  266. package/build/services/PhoneLocationService.d.ts +36 -0
  267. package/build/services/PhoneLocationService.d.ts.map +1 -0
  268. package/build/services/PhoneLocationService.js +115 -0
  269. package/build/services/PhoneLocationService.js.map +1 -0
  270. package/build/services/PhoneNotificationsSync.d.ts +3 -0
  271. package/build/services/PhoneNotificationsSync.d.ts.map +1 -0
  272. package/build/services/PhoneNotificationsSync.js +35 -0
  273. package/build/services/PhoneNotificationsSync.js.map +1 -0
  274. package/build/services/PhonePhotoCoordinator.d.ts +103 -0
  275. package/build/services/PhonePhotoCoordinator.d.ts.map +1 -0
  276. package/build/services/PhonePhotoCoordinator.js +326 -0
  277. package/build/services/PhonePhotoCoordinator.js.map +1 -0
  278. package/build/services/PhoneStreamCoordinator.d.ts +168 -0
  279. package/build/services/PhoneStreamCoordinator.d.ts.map +1 -0
  280. package/build/services/PhoneStreamCoordinator.js +632 -0
  281. package/build/services/PhoneStreamCoordinator.js.map +1 -0
  282. package/build/services/PhoneVideoCoordinator.d.ts +50 -0
  283. package/build/services/PhoneVideoCoordinator.d.ts.map +1 -0
  284. package/build/services/PhoneVideoCoordinator.js +147 -0
  285. package/build/services/PhoneVideoCoordinator.js.map +1 -0
  286. package/build/services/STTModelManager.d.ts +65 -0
  287. package/build/services/STTModelManager.d.ts.map +1 -0
  288. package/build/services/STTModelManager.js +292 -0
  289. package/build/services/STTModelManager.js.map +1 -0
  290. package/build/services/SceneRenderer.d.ts +90 -0
  291. package/build/services/SceneRenderer.d.ts.map +1 -0
  292. package/build/services/SceneRenderer.js +248 -0
  293. package/build/services/SceneRenderer.js.map +1 -0
  294. package/build/services/SentenceTtsPipeline.d.ts +31 -0
  295. package/build/services/SentenceTtsPipeline.d.ts.map +1 -0
  296. package/build/services/SentenceTtsPipeline.js +67 -0
  297. package/build/services/SentenceTtsPipeline.js.map +1 -0
  298. package/build/services/StreamLifecycleController.d.ts +67 -0
  299. package/build/services/StreamLifecycleController.d.ts.map +1 -0
  300. package/build/services/StreamLifecycleController.js +152 -0
  301. package/build/services/StreamLifecycleController.js.map +1 -0
  302. package/build/services/TTSModelManager.d.ts +90 -0
  303. package/build/services/TTSModelManager.d.ts.map +1 -0
  304. package/build/services/TTSModelManager.js +366 -0
  305. package/build/services/TTSModelManager.js.map +1 -0
  306. package/build/services/TranscriptionRouting.d.ts +12 -0
  307. package/build/services/TranscriptionRouting.d.ts.map +1 -0
  308. package/build/services/TranscriptionRouting.js +24 -0
  309. package/build/services/TranscriptionRouting.js.map +1 -0
  310. package/build/services/WebviewBridge.d.ts +22 -0
  311. package/build/services/WebviewBridge.d.ts.map +1 -0
  312. package/build/services/WebviewBridge.js +47 -0
  313. package/build/services/WebviewBridge.js.map +1 -0
  314. package/build/services/asg/GalleryMediaIntegrityReportService.d.ts +17 -0
  315. package/build/services/asg/GalleryMediaIntegrityReportService.d.ts.map +1 -0
  316. package/build/services/asg/GalleryMediaIntegrityReportService.js +43 -0
  317. package/build/services/asg/GalleryMediaIntegrityReportService.js.map +1 -0
  318. package/build/services/asg/asgCameraApi.d.ts +205 -0
  319. package/build/services/asg/asgCameraApi.d.ts.map +1 -0
  320. package/build/services/asg/asgCameraApi.js +1410 -0
  321. package/build/services/asg/asgCameraApi.js.map +1 -0
  322. package/build/services/asg/cameraRollExportCoordinator.d.ts +60 -0
  323. package/build/services/asg/cameraRollExportCoordinator.d.ts.map +1 -0
  324. package/build/services/asg/cameraRollExportCoordinator.js +618 -0
  325. package/build/services/asg/cameraRollExportCoordinator.js.map +1 -0
  326. package/build/services/asg/cameraRollExportLedger.d.ts +44 -0
  327. package/build/services/asg/cameraRollExportLedger.d.ts.map +1 -0
  328. package/build/services/asg/cameraRollExportLedger.js +78 -0
  329. package/build/services/asg/cameraRollExportLedger.js.map +1 -0
  330. package/build/services/asg/galleryMediaValidation.d.ts +29 -0
  331. package/build/services/asg/galleryMediaValidation.d.ts.map +1 -0
  332. package/build/services/asg/galleryMediaValidation.js +149 -0
  333. package/build/services/asg/galleryMediaValidation.js.map +1 -0
  334. package/build/services/asg/galleryNotices.d.ts +33 -0
  335. package/build/services/asg/galleryNotices.d.ts.map +1 -0
  336. package/build/services/asg/galleryNotices.js +29 -0
  337. package/build/services/asg/galleryNotices.js.map +1 -0
  338. package/build/services/asg/galleryPathMigration.d.ts +3 -0
  339. package/build/services/asg/galleryPathMigration.d.ts.map +1 -0
  340. package/build/services/asg/galleryPathMigration.js +26 -0
  341. package/build/services/asg/galleryPathMigration.js.map +1 -0
  342. package/build/services/asg/gallerySettingsService.d.ts +20 -0
  343. package/build/services/asg/gallerySettingsService.d.ts.map +1 -0
  344. package/build/services/asg/gallerySettingsService.js +53 -0
  345. package/build/services/asg/gallerySettingsService.js.map +1 -0
  346. package/build/services/asg/gallerySyncNotifications.d.ts +56 -0
  347. package/build/services/asg/gallerySyncNotifications.d.ts.map +1 -0
  348. package/build/services/asg/gallerySyncNotifications.js +198 -0
  349. package/build/services/asg/gallerySyncNotifications.js.map +1 -0
  350. package/build/services/asg/gallerySyncService.d.ts +137 -0
  351. package/build/services/asg/gallerySyncService.d.ts.map +1 -0
  352. package/build/services/asg/gallerySyncService.js +1933 -0
  353. package/build/services/asg/gallerySyncService.js.map +1 -0
  354. package/build/services/asg/galleryTransferLedger.d.ts +58 -0
  355. package/build/services/asg/galleryTransferLedger.d.ts.map +1 -0
  356. package/build/services/asg/galleryTransferLedger.js +225 -0
  357. package/build/services/asg/galleryTransferLedger.js.map +1 -0
  358. package/build/services/asg/localNetworkTransport.d.ts +15 -0
  359. package/build/services/asg/localNetworkTransport.d.ts.map +1 -0
  360. package/build/services/asg/localNetworkTransport.js +144 -0
  361. package/build/services/asg/localNetworkTransport.js.map +1 -0
  362. package/build/services/asg/localStorageService.d.ts +146 -0
  363. package/build/services/asg/localStorageService.d.ts.map +1 -0
  364. package/build/services/asg/localStorageService.js +572 -0
  365. package/build/services/asg/localStorageService.js.map +1 -0
  366. package/build/services/asg/mediaProcessingQueue.d.ts +70 -0
  367. package/build/services/asg/mediaProcessingQueue.d.ts.map +1 -0
  368. package/build/services/asg/mediaProcessingQueue.js +451 -0
  369. package/build/services/asg/mediaProcessingQueue.js.map +1 -0
  370. package/build/services/asgOtaVersionUrl.d.ts +2 -0
  371. package/build/services/asgOtaVersionUrl.d.ts.map +1 -0
  372. package/build/services/asgOtaVersionUrl.js +36 -0
  373. package/build/services/asgOtaVersionUrl.js.map +1 -0
  374. package/build/services/blobPaths.d.ts +31 -0
  375. package/build/services/blobPaths.d.ts.map +1 -0
  376. package/build/services/blobPaths.js +86 -0
  377. package/build/services/blobPaths.js.map +1 -0
  378. package/build/services/cloudStreamApi.d.ts +59 -0
  379. package/build/services/cloudStreamApi.d.ts.map +1 -0
  380. package/build/services/cloudStreamApi.js +81 -0
  381. package/build/services/cloudStreamApi.js.map +1 -0
  382. package/build/services/gallerySyncClock.d.ts +17 -0
  383. package/build/services/gallerySyncClock.d.ts.map +1 -0
  384. package/build/services/gallerySyncClock.js +21 -0
  385. package/build/services/gallerySyncClock.js.map +1 -0
  386. package/build/services/glassesClockSync.d.ts +20 -0
  387. package/build/services/glassesClockSync.d.ts.map +1 -0
  388. package/build/services/glassesClockSync.js +97 -0
  389. package/build/services/glassesClockSync.js.map +1 -0
  390. package/build/services/manifestVersionGate.d.ts +28 -0
  391. package/build/services/manifestVersionGate.d.ts.map +1 -0
  392. package/build/services/manifestVersionGate.js +41 -0
  393. package/build/services/manifestVersionGate.js.map +1 -0
  394. package/build/services/mentraUiShim.d.ts +38 -0
  395. package/build/services/mentraUiShim.d.ts.map +1 -0
  396. package/build/services/mentraUiShim.js +360 -0
  397. package/build/services/mentraUiShim.js.map +1 -0
  398. package/build/services/navigation/roadNameResolver.d.ts +67 -0
  399. package/build/services/navigation/roadNameResolver.d.ts.map +1 -0
  400. package/build/services/navigation/roadNameResolver.js +96 -0
  401. package/build/services/navigation/roadNameResolver.js.map +1 -0
  402. package/build/services/navigation/routesApiCodec.d.ts +38 -0
  403. package/build/services/navigation/routesApiCodec.d.ts.map +1 -0
  404. package/build/services/navigation/routesApiCodec.js +68 -0
  405. package/build/services/navigation/routesApiCodec.js.map +1 -0
  406. package/build/services/otaDisplayState.d.ts +42 -0
  407. package/build/services/otaDisplayState.d.ts.map +1 -0
  408. package/build/services/otaDisplayState.js +92 -0
  409. package/build/services/otaDisplayState.js.map +1 -0
  410. package/build/services/otaInstallPolicy.d.ts +81 -0
  411. package/build/services/otaInstallPolicy.d.ts.map +1 -0
  412. package/build/services/otaInstallPolicy.js +96 -0
  413. package/build/services/otaInstallPolicy.js.map +1 -0
  414. package/build/services/otaLegacyMapping.d.ts +22 -0
  415. package/build/services/otaLegacyMapping.d.ts.map +1 -0
  416. package/build/services/otaLegacyMapping.js +56 -0
  417. package/build/services/otaLegacyMapping.js.map +1 -0
  418. package/build/services/slimStreamStatus.d.ts +7 -0
  419. package/build/services/slimStreamStatus.d.ts.map +1 -0
  420. package/build/services/slimStreamStatus.js +26 -0
  421. package/build/services/slimStreamStatus.js.map +1 -0
  422. package/build/stores/apps.d.ts +104 -0
  423. package/build/stores/apps.d.ts.map +1 -0
  424. package/build/stores/apps.js +492 -0
  425. package/build/stores/apps.js.map +1 -0
  426. package/build/stores/bluetoothSettingKeys.d.ts +4 -0
  427. package/build/stores/bluetoothSettingKeys.d.ts.map +1 -0
  428. package/build/stores/bluetoothSettingKeys.js +31 -0
  429. package/build/stores/bluetoothSettingKeys.js.map +1 -0
  430. package/build/stores/cloudClientStatus.d.ts +9 -0
  431. package/build/stores/cloudClientStatus.d.ts.map +1 -0
  432. package/build/stores/cloudClientStatus.js +24 -0
  433. package/build/stores/cloudClientStatus.js.map +1 -0
  434. package/build/stores/connection.d.ts +22 -0
  435. package/build/stores/connection.d.ts.map +1 -0
  436. package/build/stores/connection.js +43 -0
  437. package/build/stores/connection.js.map +1 -0
  438. package/build/stores/core.d.ts +15 -0
  439. package/build/stores/core.d.ts.map +1 -0
  440. package/build/stores/core.js +21 -0
  441. package/build/stores/core.js.map +1 -0
  442. package/build/stores/display.d.ts +24 -0
  443. package/build/stores/display.d.ts.map +1 -0
  444. package/build/stores/display.js +96 -0
  445. package/build/stores/display.js.map +1 -0
  446. package/build/stores/gallerySync.d.ts +101 -0
  447. package/build/stores/gallerySync.d.ts.map +1 -0
  448. package/build/stores/gallerySync.js +217 -0
  449. package/build/stores/gallerySync.js.map +1 -0
  450. package/build/stores/glasses.d.ts +62 -0
  451. package/build/stores/glasses.d.ts.map +1 -0
  452. package/build/stores/glasses.js +203 -0
  453. package/build/stores/glasses.js.map +1 -0
  454. package/build/stores/settings.d.ts +37 -0
  455. package/build/stores/settings.d.ts.map +1 -0
  456. package/build/stores/settings.js +922 -0
  457. package/build/stores/settings.js.map +1 -0
  458. package/build/types/applet.d.ts +96 -0
  459. package/build/types/applet.d.ts.map +1 -0
  460. package/build/types/applet.js +5 -0
  461. package/build/types/applet.js.map +1 -0
  462. package/build/types/asg.d.ts +53 -0
  463. package/build/types/asg.d.ts.map +1 -0
  464. package/build/types/asg.js +2 -0
  465. package/build/types/asg.js.map +1 -0
  466. package/build/types/capabilities/even-realities-g1.d.ts +12 -0
  467. package/build/types/capabilities/even-realities-g1.d.ts.map +1 -0
  468. package/build/types/capabilities/even-realities-g1.js +55 -0
  469. package/build/types/capabilities/even-realities-g1.js.map +1 -0
  470. package/build/types/capabilities/even-realities-g2.d.ts +12 -0
  471. package/build/types/capabilities/even-realities-g2.d.ts.map +1 -0
  472. package/build/types/capabilities/even-realities-g2.js +75 -0
  473. package/build/types/capabilities/even-realities-g2.js.map +1 -0
  474. package/build/types/capabilities/mentra-display.d.ts +12 -0
  475. package/build/types/capabilities/mentra-display.d.ts.map +1 -0
  476. package/build/types/capabilities/mentra-display.js +63 -0
  477. package/build/types/capabilities/mentra-display.js.map +1 -0
  478. package/build/types/capabilities/mentra-live.d.ts +12 -0
  479. package/build/types/capabilities/mentra-live.d.ts.map +1 -0
  480. package/build/types/capabilities/mentra-live.js +92 -0
  481. package/build/types/capabilities/mentra-live.js.map +1 -0
  482. package/build/types/capabilities/none.d.ts +13 -0
  483. package/build/types/capabilities/none.d.ts.map +1 -0
  484. package/build/types/capabilities/none.js +65 -0
  485. package/build/types/capabilities/none.js.map +1 -0
  486. package/build/types/capabilities/simulated-glasses.d.ts +13 -0
  487. package/build/types/capabilities/simulated-glasses.d.ts.map +1 -0
  488. package/build/types/capabilities/simulated-glasses.js +65 -0
  489. package/build/types/capabilities/simulated-glasses.js.map +1 -0
  490. package/build/types/capabilities/vuzix-z100.d.ts +12 -0
  491. package/build/types/capabilities/vuzix-z100.d.ts.map +1 -0
  492. package/build/types/capabilities/vuzix-z100.js +52 -0
  493. package/build/types/capabilities/vuzix-z100.js.map +1 -0
  494. package/build/types/enums.d.ts +40 -0
  495. package/build/types/enums.d.ts.map +1 -0
  496. package/build/types/enums.js +44 -0
  497. package/build/types/enums.js.map +1 -0
  498. package/build/types/hardware.d.ts +160 -0
  499. package/build/types/hardware.d.ts.map +1 -0
  500. package/build/types/hardware.js +36 -0
  501. package/build/types/hardware.js.map +1 -0
  502. package/build/types/index.d.ts +11 -0
  503. package/build/types/index.d.ts.map +1 -0
  504. package/build/types/index.js +10 -0
  505. package/build/types/index.js.map +1 -0
  506. package/build/utils/GlobalEventEmitter.d.ts +10 -0
  507. package/build/utils/GlobalEventEmitter.d.ts.map +1 -0
  508. package/build/utils/GlobalEventEmitter.js +13 -0
  509. package/build/utils/GlobalEventEmitter.js.map +1 -0
  510. package/build/utils/cloudClient/RnUdpAdapter.d.ts +3 -0
  511. package/build/utils/cloudClient/RnUdpAdapter.d.ts.map +1 -0
  512. package/build/utils/cloudClient/RnUdpAdapter.js +41 -0
  513. package/build/utils/cloudClient/RnUdpAdapter.js.map +1 -0
  514. package/build/utils/cloudClient/cloudSecureStore.d.ts +3 -0
  515. package/build/utils/cloudClient/cloudSecureStore.d.ts.map +1 -0
  516. package/build/utils/cloudClient/cloudSecureStore.js +26 -0
  517. package/build/utils/cloudClient/cloudSecureStore.js.map +1 -0
  518. package/build/utils/debouncedPatch.d.ts +6 -0
  519. package/build/utils/debouncedPatch.d.ts.map +1 -0
  520. package/build/utils/debouncedPatch.js +25 -0
  521. package/build/utils/debouncedPatch.js.map +1 -0
  522. package/build/utils/devLogging.d.ts +26 -0
  523. package/build/utils/devLogging.d.ts.map +1 -0
  524. package/build/utils/devLogging.js +116 -0
  525. package/build/utils/devLogging.js.map +1 -0
  526. package/build/utils/devMiniappLaunch.d.ts +44 -0
  527. package/build/utils/devMiniappLaunch.d.ts.map +1 -0
  528. package/build/utils/devMiniappLaunch.js +52 -0
  529. package/build/utils/devMiniappLaunch.js.map +1 -0
  530. package/build/utils/diagnosticContext.d.ts +3 -0
  531. package/build/utils/diagnosticContext.d.ts.map +1 -0
  532. package/build/utils/diagnosticContext.js +119 -0
  533. package/build/utils/diagnosticContext.js.map +1 -0
  534. package/build/utils/display/composer/ColumnComposer.d.ts +131 -0
  535. package/build/utils/display/composer/ColumnComposer.d.ts.map +1 -0
  536. package/build/utils/display/composer/ColumnComposer.js +204 -0
  537. package/build/utils/display/composer/ColumnComposer.js.map +1 -0
  538. package/build/utils/display/composer/index.d.ts +9 -0
  539. package/build/utils/display/composer/index.d.ts.map +1 -0
  540. package/build/utils/display/composer/index.js +9 -0
  541. package/build/utils/display/composer/index.js.map +1 -0
  542. package/build/utils/display/helpers/DisplayHelpers.d.ts +165 -0
  543. package/build/utils/display/helpers/DisplayHelpers.d.ts.map +1 -0
  544. package/build/utils/display/helpers/DisplayHelpers.js +312 -0
  545. package/build/utils/display/helpers/DisplayHelpers.js.map +1 -0
  546. package/build/utils/display/helpers/ScrollView.d.ts +183 -0
  547. package/build/utils/display/helpers/ScrollView.d.ts.map +1 -0
  548. package/build/utils/display/helpers/ScrollView.js +257 -0
  549. package/build/utils/display/helpers/ScrollView.js.map +1 -0
  550. package/build/utils/display/helpers/index.d.ts +11 -0
  551. package/build/utils/display/helpers/index.d.ts.map +1 -0
  552. package/build/utils/display/helpers/index.js +10 -0
  553. package/build/utils/display/helpers/index.js.map +1 -0
  554. package/build/utils/display/index.d.ts +174 -0
  555. package/build/utils/display/index.d.ts.map +1 -0
  556. package/build/utils/display/index.js +185 -0
  557. package/build/utils/display/index.js.map +1 -0
  558. package/build/utils/display/measurer/TextMeasurer.d.ts +160 -0
  559. package/build/utils/display/measurer/TextMeasurer.d.ts.map +1 -0
  560. package/build/utils/display/measurer/TextMeasurer.js +273 -0
  561. package/build/utils/display/measurer/TextMeasurer.js.map +1 -0
  562. package/build/utils/display/measurer/index.d.ts +10 -0
  563. package/build/utils/display/measurer/index.d.ts.map +1 -0
  564. package/build/utils/display/measurer/index.js +11 -0
  565. package/build/utils/display/measurer/index.js.map +1 -0
  566. package/build/utils/display/measurer/script-detection.d.ts +53 -0
  567. package/build/utils/display/measurer/script-detection.d.ts.map +1 -0
  568. package/build/utils/display/measurer/script-detection.js +184 -0
  569. package/build/utils/display/measurer/script-detection.js.map +1 -0
  570. package/build/utils/display/profiles/g1.d.ts +33 -0
  571. package/build/utils/display/profiles/g1.d.ts.map +1 -0
  572. package/build/utils/display/profiles/g1.js +213 -0
  573. package/build/utils/display/profiles/g1.js.map +1 -0
  574. package/build/utils/display/profiles/g2.d.ts +13 -0
  575. package/build/utils/display/profiles/g2.d.ts.map +1 -0
  576. package/build/utils/display/profiles/g2.js +34 -0
  577. package/build/utils/display/profiles/g2.js.map +1 -0
  578. package/build/utils/display/profiles/index.d.ts +12 -0
  579. package/build/utils/display/profiles/index.d.ts.map +1 -0
  580. package/build/utils/display/profiles/index.js +15 -0
  581. package/build/utils/display/profiles/index.js.map +1 -0
  582. package/build/utils/display/profiles/nex.d.ts +10 -0
  583. package/build/utils/display/profiles/nex.d.ts.map +1 -0
  584. package/build/utils/display/profiles/nex.js +150 -0
  585. package/build/utils/display/profiles/nex.js.map +1 -0
  586. package/build/utils/display/profiles/types.d.ts +103 -0
  587. package/build/utils/display/profiles/types.d.ts.map +1 -0
  588. package/build/utils/display/profiles/types.js +2 -0
  589. package/build/utils/display/profiles/types.js.map +1 -0
  590. package/build/utils/display/profiles/z100.d.ts +33 -0
  591. package/build/utils/display/profiles/z100.d.ts.map +1 -0
  592. package/build/utils/display/profiles/z100.js +182 -0
  593. package/build/utils/display/profiles/z100.js.map +1 -0
  594. package/build/utils/display/scene/degrade.d.ts +25 -0
  595. package/build/utils/display/scene/degrade.d.ts.map +1 -0
  596. package/build/utils/display/scene/degrade.js +64 -0
  597. package/build/utils/display/scene/degrade.js.map +1 -0
  598. package/build/utils/display/scene/differ.d.ts +38 -0
  599. package/build/utils/display/scene/differ.d.ts.map +1 -0
  600. package/build/utils/display/scene/differ.js +107 -0
  601. package/build/utils/display/scene/differ.js.map +1 -0
  602. package/build/utils/display/scene/index.d.ts +10 -0
  603. package/build/utils/display/scene/index.d.ts.map +1 -0
  604. package/build/utils/display/scene/index.js +6 -0
  605. package/build/utils/display/scene/index.js.map +1 -0
  606. package/build/utils/display/scene/process.d.ts +35 -0
  607. package/build/utils/display/scene/process.d.ts.map +1 -0
  608. package/build/utils/display/scene/process.js +187 -0
  609. package/build/utils/display/scene/process.js.map +1 -0
  610. package/build/utils/display/scene/store.d.ts +48 -0
  611. package/build/utils/display/scene/store.d.ts.map +1 -0
  612. package/build/utils/display/scene/store.js +0 -0
  613. package/build/utils/display/scene/store.js.map +1 -0
  614. package/build/utils/display/scene/types.d.ts +120 -0
  615. package/build/utils/display/scene/types.d.ts.map +1 -0
  616. package/build/utils/display/scene/types.js +0 -0
  617. package/build/utils/display/scene/types.js.map +1 -0
  618. package/build/utils/display/wrapper/TextWrapper.d.ts +102 -0
  619. package/build/utils/display/wrapper/TextWrapper.d.ts.map +1 -0
  620. package/build/utils/display/wrapper/TextWrapper.js +471 -0
  621. package/build/utils/display/wrapper/TextWrapper.js.map +1 -0
  622. package/build/utils/display/wrapper/index.d.ts +12 -0
  623. package/build/utils/display/wrapper/index.d.ts.map +1 -0
  624. package/build/utils/display/wrapper/index.js +12 -0
  625. package/build/utils/display/wrapper/index.js.map +1 -0
  626. package/build/utils/display/wrapper/types.d.ts +75 -0
  627. package/build/utils/display/wrapper/types.d.ts.map +1 -0
  628. package/build/utils/display/wrapper/types.js +11 -0
  629. package/build/utils/display/wrapper/types.js.map +1 -0
  630. package/build/utils/e2eMetrics.d.ts +6 -0
  631. package/build/utils/e2eMetrics.d.ts.map +1 -0
  632. package/build/utils/e2eMetrics.js +27 -0
  633. package/build/utils/e2eMetrics.js.map +1 -0
  634. package/build/utils/hardware/hardware.d.ts +42 -0
  635. package/build/utils/hardware/hardware.d.ts.map +1 -0
  636. package/build/utils/hardware/hardware.js +127 -0
  637. package/build/utils/hardware/hardware.js.map +1 -0
  638. package/build/utils/hardware/index.d.ts +2 -0
  639. package/build/utils/hardware/index.d.ts.map +1 -0
  640. package/build/utils/hardware/index.js +2 -0
  641. package/build/utils/hardware/index.js.map +1 -0
  642. package/build/utils/miniappGlobals.d.ts +60 -0
  643. package/build/utils/miniappGlobals.d.ts.map +1 -0
  644. package/build/utils/miniappGlobals.js +224 -0
  645. package/build/utils/miniappGlobals.js.map +1 -0
  646. package/build/utils/permissions/MediaLibraryPermissions.d.ts +45 -0
  647. package/build/utils/permissions/MediaLibraryPermissions.d.ts.map +1 -0
  648. package/build/utils/permissions/MediaLibraryPermissions.js +145 -0
  649. package/build/utils/permissions/MediaLibraryPermissions.js.map +1 -0
  650. package/build/utils/permissions/galleryDisplayName.d.ts +8 -0
  651. package/build/utils/permissions/galleryDisplayName.d.ts.map +1 -0
  652. package/build/utils/permissions/galleryDisplayName.js +25 -0
  653. package/build/utils/permissions/galleryDisplayName.js.map +1 -0
  654. package/build/utils/storage/index.d.ts +3 -0
  655. package/build/utils/storage/index.d.ts.map +1 -0
  656. package/build/utils/storage/index.js +3 -0
  657. package/build/utils/storage/index.js.map +1 -0
  658. package/build/utils/storage/storage.d.ts +24 -0
  659. package/build/utils/storage/storage.d.ts.map +1 -0
  660. package/build/utils/storage/storage.js +85 -0
  661. package/build/utils/storage/storage.js.map +1 -0
  662. package/build/utils/storage/zip.d.ts +3 -0
  663. package/build/utils/storage/zip.d.ts.map +1 -0
  664. package/build/utils/storage/zip.js +14 -0
  665. package/build/utils/storage/zip.js.map +1 -0
  666. package/build/utils/timers/index.d.ts +3 -0
  667. package/build/utils/timers/index.d.ts.map +1 -0
  668. package/build/utils/timers/index.js +3 -0
  669. package/build/utils/timers/index.js.map +1 -0
  670. package/build/utils/timers/timers.d.ts +9 -0
  671. package/build/utils/timers/timers.d.ts.map +1 -0
  672. package/build/utils/timers/timers.js +105 -0
  673. package/build/utils/timers/timers.js.map +1 -0
  674. package/package.json +120 -0
  675. package/src/devtools.ts +13 -0
  676. package/src/engine.ts +173 -0
  677. package/src/facades/dev.ts +198 -0
  678. package/src/facades/display.ts +17 -0
  679. package/src/facades/displayMirror.ts +33 -0
  680. package/src/facades/gallery.ts +69 -0
  681. package/src/facades/glasses.ts +206 -0
  682. package/src/facades/glassesSettings.ts +56 -0
  683. package/src/facades/glassesWifi.ts +68 -0
  684. package/src/facades/miniapps.ts +55 -0
  685. package/src/facades/notifications.ts +15 -0
  686. package/src/facades/ota.ts +174 -0
  687. package/src/facades/pairing.ts +329 -0
  688. package/src/facades/permissions.ts +165 -0
  689. package/src/facades/phoneNotifications.ts +50 -0
  690. package/src/facades/reports.ts +185 -0
  691. package/src/facades/session.ts +55 -0
  692. package/src/facades/settings.ts +57 -0
  693. package/src/facades/speech.ts +38 -0
  694. package/src/index.ts +191 -0
  695. package/src/internal.ts +159 -0
  696. package/src/runtime/bootstrap.ts +118 -0
  697. package/src/runtime/config.ts +147 -0
  698. package/src/runtime/streamConfig.ts +34 -0
  699. package/src/services/AppRegistry.ts +1190 -0
  700. package/src/services/AudioCloudUplink.ts +50 -0
  701. package/src/services/AudioPlaybackService.ts +813 -0
  702. package/src/services/AutomaticReportResult.ts +48 -0
  703. package/src/services/BlobStore.ts +746 -0
  704. package/src/services/CaptionsTesterReportService.ts +107 -0
  705. package/src/services/CloudAudioSubscriptionSync.ts +41 -0
  706. package/src/services/CloudClientService.ts +689 -0
  707. package/src/services/CloudTranscriptE2EMetrics.ts +27 -0
  708. package/src/services/ConnectionCoordinator.ts +65 -0
  709. package/src/services/DevServerBridge.ts +332 -0
  710. package/src/services/DeviceEventRouter.ts +238 -0
  711. package/src/services/DeviceStoreHydration.ts +130 -0
  712. package/src/services/DisplayProcessor.ts +775 -0
  713. package/src/services/GlassesReadiness.ts +103 -0
  714. package/src/services/GlassesSettingsSync.ts +134 -0
  715. package/src/services/GlassesStatusProjection.ts +73 -0
  716. package/src/services/HeadingService.ts +98 -0
  717. package/src/services/LocalDisplayManager.ts +703 -0
  718. package/src/services/LocalMiniappRuntime.ts +4213 -0
  719. package/src/services/LocalSttFallbackCoordinator.ts +147 -0
  720. package/src/services/MentraJSCrashController.ts +189 -0
  721. package/src/services/MentraJSCrashloopReportService.ts +66 -0
  722. package/src/services/MentraJSLogPipeline.ts +166 -0
  723. package/src/services/MentraJSRouter.ts +557 -0
  724. package/src/services/MentraUIRouter.ts +244 -0
  725. package/src/services/MicStateCoordinator.ts +94 -0
  726. package/src/services/MiniappEngine.ts +143 -0
  727. package/src/services/MiniappLauncher.ts +340 -0
  728. package/src/services/MiniappRunningRegistry.ts +57 -0
  729. package/src/services/NativeHttpResponse.ts +6 -0
  730. package/src/services/NavigationHandlers.ts +423 -0
  731. package/src/services/NavigationService.ts +731 -0
  732. package/src/services/NotificationsEmitter.ts +48 -0
  733. package/src/services/OfflineSpeechModelService.ts +168 -0
  734. package/src/services/OtaInstallCoordinator.ts +1205 -0
  735. package/src/services/OtaService.ts +83 -0
  736. package/src/services/OtaUpdateCheckService.ts +386 -0
  737. package/src/services/PairingIdentity.ts +154 -0
  738. package/src/services/PhoneCalendarHelpers.ts +212 -0
  739. package/src/services/PhoneCalendarService.ts +42 -0
  740. package/src/services/PhoneCameraFovCoordinator.ts +195 -0
  741. package/src/services/PhoneLocationService.ts +122 -0
  742. package/src/services/PhoneNotificationsSync.ts +44 -0
  743. package/src/services/PhonePhotoCoordinator.ts +409 -0
  744. package/src/services/PhoneStreamCoordinator.ts +777 -0
  745. package/src/services/PhoneVideoCoordinator.ts +189 -0
  746. package/src/services/STTModelManager.ts +360 -0
  747. package/src/services/SceneRenderer.ts +292 -0
  748. package/src/services/SentenceTtsPipeline.ts +106 -0
  749. package/src/services/StreamLifecycleController.ts +213 -0
  750. package/src/services/TTSModelManager.ts +466 -0
  751. package/src/services/TranscriptionRouting.ts +37 -0
  752. package/src/services/WebviewBridge.ts +50 -0
  753. package/src/services/asg/GalleryMediaIntegrityReportService.ts +70 -0
  754. package/src/services/asg/asgCameraApi.ts +1695 -0
  755. package/src/services/asg/cameraRollExportCoordinator.ts +627 -0
  756. package/src/services/asg/cameraRollExportLedger.ts +122 -0
  757. package/src/services/asg/galleryMediaValidation.ts +183 -0
  758. package/src/services/asg/galleryNotices.ts +61 -0
  759. package/src/services/asg/galleryPathMigration.ts +22 -0
  760. package/src/services/asg/gallerySettingsService.ts +68 -0
  761. package/src/services/asg/gallerySyncNotifications.ts +236 -0
  762. package/src/services/asg/gallerySyncService.ts +2269 -0
  763. package/src/services/asg/galleryTransferLedger.ts +312 -0
  764. package/src/services/asg/localNetworkTransport.ts +173 -0
  765. package/src/services/asg/localStorageService.ts +652 -0
  766. package/src/services/asg/mediaProcessingQueue.ts +518 -0
  767. package/src/services/asgOtaVersionUrl.ts +41 -0
  768. package/src/services/blobPaths.ts +86 -0
  769. package/src/services/cloudStreamApi.ts +154 -0
  770. package/src/services/gallerySyncClock.ts +39 -0
  771. package/src/services/glassesClockSync.ts +115 -0
  772. package/src/services/manifestVersionGate.ts +43 -0
  773. package/src/services/mentraUiShim.ts +366 -0
  774. package/src/services/navigation/roadNameResolver.ts +112 -0
  775. package/src/services/navigation/routesApiCodec.ts +69 -0
  776. package/src/services/otaDisplayState.ts +115 -0
  777. package/src/services/otaInstallPolicy.ts +106 -0
  778. package/src/services/otaLegacyMapping.ts +71 -0
  779. package/src/services/slimStreamStatus.ts +28 -0
  780. package/src/stores/apps.ts +614 -0
  781. package/src/stores/bluetoothSettingKeys.ts +36 -0
  782. package/src/stores/cloudClientStatus.ts +37 -0
  783. package/src/stores/connection.ts +69 -0
  784. package/src/stores/core.ts +32 -0
  785. package/src/stores/display.ts +121 -0
  786. package/src/stores/gallerySync.ts +380 -0
  787. package/src/stores/glasses.ts +309 -0
  788. package/src/stores/settings.ts +1001 -0
  789. package/src/types/applet.ts +112 -0
  790. package/src/types/asg.ts +58 -0
  791. package/src/types/capabilities/even-realities-g1.ts +67 -0
  792. package/src/types/capabilities/even-realities-g2.ts +88 -0
  793. package/src/types/capabilities/mentra-display.ts +75 -0
  794. package/src/types/capabilities/mentra-live.ts +103 -0
  795. package/src/types/capabilities/none.ts +76 -0
  796. package/src/types/capabilities/simulated-glasses.ts +76 -0
  797. package/src/types/capabilities/vuzix-z100.ts +64 -0
  798. package/src/types/enums.ts +43 -0
  799. package/src/types/hardware.ts +203 -0
  800. package/src/types/index.ts +37 -0
  801. package/src/utils/GlobalEventEmitter.ts +14 -0
  802. package/src/utils/cloudClient/RnUdpAdapter.ts +47 -0
  803. package/src/utils/cloudClient/cloudSecureStore.ts +28 -0
  804. package/src/utils/debouncedPatch.ts +28 -0
  805. package/src/utils/devLogging.ts +140 -0
  806. package/src/utils/devMiniappLaunch.ts +68 -0
  807. package/src/utils/diagnosticContext.ts +155 -0
  808. package/src/utils/display/composer/ColumnComposer.ts +285 -0
  809. package/src/utils/display/composer/index.ts +15 -0
  810. package/src/utils/display/helpers/DisplayHelpers.ts +413 -0
  811. package/src/utils/display/helpers/ScrollView.ts +337 -0
  812. package/src/utils/display/helpers/index.ts +14 -0
  813. package/src/utils/display/index.ts +273 -0
  814. package/src/utils/display/measurer/TextMeasurer.ts +346 -0
  815. package/src/utils/display/measurer/index.ts +21 -0
  816. package/src/utils/display/measurer/script-detection.ts +218 -0
  817. package/src/utils/display/profiles/g1.ts +236 -0
  818. package/src/utils/display/profiles/g2.ts +39 -0
  819. package/src/utils/display/profiles/index.ts +28 -0
  820. package/src/utils/display/profiles/nex.ts +166 -0
  821. package/src/utils/display/profiles/types.ts +132 -0
  822. package/src/utils/display/profiles/z100.ts +198 -0
  823. package/src/utils/display/scene/degrade.ts +80 -0
  824. package/src/utils/display/scene/differ.ts +128 -0
  825. package/src/utils/display/scene/index.ts +21 -0
  826. package/src/utils/display/scene/process.ts +214 -0
  827. package/src/utils/display/scene/store.ts +0 -0
  828. package/src/utils/display/scene/types.ts +0 -0
  829. package/src/utils/display/wrapper/TextWrapper.ts +546 -0
  830. package/src/utils/display/wrapper/index.ts +15 -0
  831. package/src/utils/display/wrapper/types.ts +102 -0
  832. package/src/utils/e2eMetrics.ts +30 -0
  833. package/src/utils/hardware/hardware.ts +166 -0
  834. package/src/utils/hardware/index.ts +1 -0
  835. package/src/utils/miniappGlobals.ts +260 -0
  836. package/src/utils/permissions/MediaLibraryPermissions.ts +161 -0
  837. package/src/utils/permissions/galleryDisplayName.ts +28 -0
  838. package/src/utils/storage/index.ts +2 -0
  839. package/src/utils/storage/storage.ts +101 -0
  840. package/src/utils/storage/zip.ts +13 -0
  841. package/src/utils/timers/index.ts +2 -0
  842. package/src/utils/timers/timers.ts +139 -0
@@ -0,0 +1,703 @@
1
+ /**
2
+ * LocalDisplayManager
3
+ *
4
+ * Phone-side arbiter for display requests originating from LOCAL miniapps
5
+ * (the @mentra/miniapp SDK). Mirrors the user-facing behavior of the cloud
6
+ * DisplayManager (cloud/packages/cloud/src/services/layout/DisplayManager6.1.ts)
7
+ * for the features that matter on the phone:
8
+ *
9
+ * - boot message ("Starting <AppName>…") with a bounded window
10
+ * - durationMs auto-clear
11
+ * - core-app vs background-app arbitration with a background lock
12
+ *
13
+ * Scope is deliberately local-only. Cloud-originated displays are untouched
14
+ * and may race with local displays during dev; that's acceptable per plan
15
+ * (agents/local-display-manager-plan.md).
16
+ *
17
+ * Display pacing is NOT done here. A JS-side ~300ms throttle used to live in
18
+ * this class, but JS timers (and therefore the throttle's trailing flush) do
19
+ * not fire on schedule while the iOS app is suspended in the background — so
20
+ * under streaming captions, updates accumulated and then flushed in a burst on
21
+ * the next wake. Pacing + last-wins coalescing now live in the native per-device
22
+ * queue (e.g. G2's event-driven EvenHub queue), which drains off the same BLE
23
+ * events that wake the process. This class forwards every request straight
24
+ * through; the native layer collapses redundant frames per display target.
25
+ *
26
+ * The remaining BgTimer use (boot window, durationMs expiry) is timing that
27
+ * does not need sub-second background fidelity.
28
+ */
29
+
30
+ import BluetoothSdk from "@mentra/bluetooth-sdk/internal"
31
+ import displayProcessor from "./DisplayProcessor"
32
+ import {useDisplayStore} from "../stores/display"
33
+ import sceneRenderer from "./SceneRenderer"
34
+ import {isGlassesConnected} from "./GlassesReadiness"
35
+ import {useGlassesStore} from "../stores/glasses"
36
+ import type {SceneElementInput} from "../utils/display/scene"
37
+ import {BgTimer} from "../utils/timers"
38
+
39
+ // =============================================================================
40
+ // Types
41
+ // =============================================================================
42
+
43
+ export interface DisplayPayload {
44
+ view?: "main" | "dashboard" | string
45
+ /** Legacy layout (sugar / old bundles / cloud shapes). Either this or `scene`. */
46
+ layout?: {layoutType: string; [key: string]: unknown}
47
+ /** Scene elements from display.render(). Either this or `layout`. */
48
+ scene?: SceneElementInput[]
49
+ durationMs?: number
50
+ }
51
+
52
+ /** Outcome delivered to an awaiting render() call (REQUEST_RESULT payload). */
53
+ export interface DisplayRequestResult {
54
+ status: "displayed" | "blocked"
55
+ degraded?: boolean
56
+ dropped?: string[]
57
+ reason?: string
58
+ }
59
+
60
+ export type DisplayRequestResolver = (result: DisplayRequestResult) => void
61
+
62
+ interface ActiveDisplay {
63
+ packageName: string
64
+ processedEvent: Record<string, unknown>
65
+ /** Set when this display is a scene — restore goes through SceneRenderer replay. */
66
+ scene?: SceneElementInput[]
67
+ expiresAt: number | null
68
+ }
69
+
70
+ interface BootingApp {
71
+ packageName: string
72
+ displayName: string
73
+ startedAt: number
74
+ timerId: number
75
+ /** Whatever was on the glasses when this boot started, so a boot that times
76
+ * out without the app rendering can restore it instead of blanking a frame
77
+ * another (e.g. foreground) app owns. Null if the glasses were empty. */
78
+ preBoot: ActiveDisplay | null
79
+ }
80
+
81
+ interface BackgroundLock {
82
+ packageName: string
83
+ acquiredAt: number
84
+ expiresAt: number
85
+ lastActiveTime: number
86
+ }
87
+
88
+ // =============================================================================
89
+ // Constants
90
+ // =============================================================================
91
+
92
+ const LOG_TAG = "LOCAL_DISPLAY"
93
+ const BOOT_DURATION_MS = 1500
94
+ // Mirrors cloud lease for a bg app holding the display. The bg app has to
95
+ // keep driving the display to hold the lock; if it goes quiet and the core
96
+ // app wants the screen, we release.
97
+ const BACKGROUND_LOCK_TIMEOUT_MS = 10_000
98
+ // Sentinel package name used as the "source" of the system boot message.
99
+ const SYSTEM_BOOT_PKG = "system.boot"
100
+
101
+ // =============================================================================
102
+ // LocalDisplayManager
103
+ // =============================================================================
104
+
105
+ class LocalDisplayManager {
106
+ private static instance: LocalDisplayManager | null = null
107
+
108
+ private coreApp: string | null = null
109
+ private coreAppDisplay: ActiveDisplay | null = null
110
+ private currentDisplay: ActiveDisplay | null = null
111
+ private backgroundLock: BackgroundLock | null = null
112
+
113
+ private bootingApp: BootingApp | null = null
114
+ private bootQueue: Map<string, {payload: DisplayPayload; resolve?: DisplayRequestResolver}> = new Map()
115
+
116
+ private expiryTimerId: number | null = null
117
+
118
+ /** Reconnect-replay subscription state (attachToRuntime). */
119
+ private runtimeAttached = false
120
+ private glassesWasConnected = false
121
+ private unsubscribeGlassesStatus: (() => void) | null = null
122
+
123
+ /** Injectable for tests. */
124
+ private now: () => number = () => Date.now()
125
+
126
+ private constructor() {}
127
+
128
+ public static getInstance(): LocalDisplayManager {
129
+ if (!LocalDisplayManager.instance) {
130
+ LocalDisplayManager.instance = new LocalDisplayManager()
131
+ }
132
+ return LocalDisplayManager.instance
133
+ }
134
+
135
+ // ===========================================================================
136
+ // Lifecycle API (called from MiniappHost)
137
+ // ===========================================================================
138
+
139
+ /**
140
+ * A new local miniapp just mounted. Start the boot window.
141
+ * Calling this for a different pkg while another is booting cancels the
142
+ * previous boot.
143
+ */
144
+ public onMount(packageName: string, displayName: string): void {
145
+ console.log(`${LOG_TAG}: onMount(${packageName}, "${displayName}")`)
146
+
147
+ // Cancel any in-flight boot for a prior app.
148
+ this.cancelBoot()
149
+
150
+ // Snapshot whatever's on the glasses BEFORE the boot text overwrites it.
151
+ // registerApp fires onMount for every spawn — including a background app or
152
+ // a crash-respawn while another app is foreground — so a boot that times out
153
+ // without rendering must put the prior frame back rather than blank it.
154
+ const preBoot = this.currentDisplay
155
+
156
+ // Send the boot message directly (bypass arbitration — this is a system
157
+ // display). Goes through sendNow so scene devices render it as a scene:
158
+ // otherwise every app start would be a legacy→scene transition on the
159
+ // glasses (which costs a blanking clear).
160
+ this.sendNow(SYSTEM_BOOT_PKG, {
161
+ view: "main",
162
+ layout: {layoutType: "text_wall", text: `Starting ${displayName}…`},
163
+ })
164
+
165
+ const timerId = BgTimer.setTimeout(() => {
166
+ this.endBoot(/* triggeredByFirstDisplay */ false)
167
+ }, BOOT_DURATION_MS)
168
+
169
+ this.bootingApp = {
170
+ packageName,
171
+ displayName,
172
+ startedAt: this.now(),
173
+ timerId,
174
+ preBoot,
175
+ }
176
+ this.bootQueue.clear()
177
+ }
178
+
179
+ /**
180
+ * Mark which miniapp is the "core" (foreground) app. Pass null when no local
181
+ * miniapp is foreground.
182
+ */
183
+ public onCoreAppChange(packageName: string | null): void {
184
+ if (this.coreApp === packageName) return
185
+ console.log(`${LOG_TAG}: onCoreAppChange(${packageName ?? "null"})`)
186
+
187
+ this.coreApp = packageName
188
+
189
+ // No core app means no saved frame to restore on the next unmount.
190
+ // Without this, the previous core's last frame can flicker back onto
191
+ // the glasses when the user-initiated clear is followed by an
192
+ // onUnmount that still finds a populated coreAppDisplay.
193
+ if (packageName === null) {
194
+ this.coreAppDisplay = null
195
+ }
196
+ }
197
+
198
+ /**
199
+ * A local miniapp is going away. Clean up all state associated with it.
200
+ */
201
+ public onUnmount(packageName: string): void {
202
+ console.log(`${LOG_TAG}: onUnmount(${packageName})`)
203
+
204
+ // If this was the booting app, cancel boot.
205
+ if (this.bootingApp?.packageName === packageName) {
206
+ this.cancelBoot()
207
+ }
208
+ this.bootQueue.get(packageName)?.resolve?.({status: "blocked", reason: "app stopped"})
209
+ this.bootQueue.delete(packageName)
210
+
211
+ // Forget the app's retained scenes — nothing left to replay for it.
212
+ sceneRenderer.clearApp(packageName)
213
+
214
+ // Release bg lock if this app held it.
215
+ if (this.backgroundLock?.packageName === packageName) {
216
+ this.backgroundLock = null
217
+ }
218
+
219
+ // Clear saved core app display if the core is going away.
220
+ if (this.coreApp === packageName) {
221
+ this.coreAppDisplay = null
222
+ this.coreApp = null
223
+ }
224
+
225
+ // If this app owned the current on-glasses display, clear it (and maybe
226
+ // restore the core app's display if it still has time left).
227
+ if (this.currentDisplay?.packageName === packageName) {
228
+ this.clearExpiryTimer()
229
+ this.currentDisplay = null
230
+ this.tryRestoreCoreDisplay()
231
+ if (!this.currentDisplay) {
232
+ // Nothing to restore → clear the glasses.
233
+ this.sendClear()
234
+ }
235
+ }
236
+ }
237
+
238
+ // ===========================================================================
239
+ // Display request API (called from LocalMiniappRuntime.handleDisplay)
240
+ // ===========================================================================
241
+
242
+ /**
243
+ * A miniapp requested a display. Routes through boot queue, arbitration,
244
+ * and throttle. This is the only public entry point for miniapp display
245
+ * traffic on the local path.
246
+ *
247
+ * `resolve`, when provided (render() requests), is guaranteed to be called
248
+ * exactly once with the request's outcome — including for requests parked in
249
+ * the boot queue (resolved when drained or superseded).
250
+ */
251
+ public request(packageName: string, payload: DisplayPayload, resolve?: DisplayRequestResolver): void {
252
+ // Dashboard view: pass straight through (no throttle/arbitration). Local
253
+ // dashboard rendering is currently a stub on the phone anyway.
254
+ if (payload.view === "dashboard") {
255
+ this.sendNow(packageName, payload, resolve)
256
+ return
257
+ }
258
+
259
+ // During boot, any app's requests go into the queue. If the booting app
260
+ // itself makes its first display call, end boot early and drain.
261
+ if (this.bootingApp) {
262
+ const superseded = this.bootQueue.get(packageName)
263
+ superseded?.resolve?.({status: "blocked", reason: "superseded by a newer frame"})
264
+ this.bootQueue.set(packageName, {payload, resolve})
265
+ if (this.bootingApp.packageName === packageName) {
266
+ this.endBoot(/* triggeredByFirstDisplay */ true)
267
+ }
268
+ return
269
+ }
270
+
271
+ this.arbitrateAndSend(packageName, payload, resolve)
272
+ }
273
+
274
+ // ===========================================================================
275
+ // Internals — arbitration
276
+ // ===========================================================================
277
+
278
+ private arbitrateAndSend(packageName: string, payload: DisplayPayload, resolve?: DisplayRequestResolver): void {
279
+ const now = this.now()
280
+
281
+ // Expire a stale bg lock before arbitrating.
282
+ if (this.backgroundLock && now > this.backgroundLock.expiresAt) {
283
+ this.backgroundLock = null
284
+ }
285
+
286
+ const isCore = packageName === this.coreApp
287
+
288
+ if (isCore) {
289
+ // Save so we can restore later.
290
+ this.coreAppDisplay = {
291
+ packageName,
292
+ processedEvent: {}, // filled by sendNow
293
+ scene: payload.scene,
294
+ expiresAt: payload.durationMs ? now + payload.durationMs : null,
295
+ }
296
+
297
+ // If a bg app holds the lock AND is currently on the glasses, core is
298
+ // blocked. The saved coreAppDisplay surfaces when the bg app expires
299
+ // or unmounts.
300
+ const bgHoldsAndDisplays =
301
+ this.backgroundLock &&
302
+ this.currentDisplay &&
303
+ this.currentDisplay.packageName === this.backgroundLock.packageName
304
+ if (bgHoldsAndDisplays) {
305
+ resolve?.({status: "blocked", reason: "a background app holds the display"})
306
+ return
307
+ }
308
+
309
+ // Core can display. If a bg lock exists but holder isn't actively on
310
+ // the glasses, release it.
311
+ if (this.backgroundLock && !bgHoldsAndDisplays) {
312
+ this.backgroundLock = null
313
+ }
314
+
315
+ this.sendNow(packageName, payload, resolve)
316
+ return
317
+ }
318
+
319
+ // Non-core: this is a background app.
320
+ if (this.backgroundLock && this.backgroundLock.packageName !== packageName) {
321
+ // Another bg app already holds the lock — drop.
322
+ resolve?.({status: "blocked", reason: "another background app holds the display"})
323
+ return
324
+ }
325
+
326
+ // Acquire or bump the lock.
327
+ if (!this.backgroundLock) {
328
+ this.backgroundLock = {
329
+ packageName,
330
+ acquiredAt: now,
331
+ expiresAt: now + BACKGROUND_LOCK_TIMEOUT_MS,
332
+ lastActiveTime: now,
333
+ }
334
+ } else {
335
+ this.backgroundLock.lastActiveTime = now
336
+ this.backgroundLock.expiresAt = now + BACKGROUND_LOCK_TIMEOUT_MS
337
+ }
338
+
339
+ this.sendNow(packageName, payload, resolve)
340
+ }
341
+
342
+ // ===========================================================================
343
+ // Internals — send
344
+ // ===========================================================================
345
+
346
+ private sendNow(packageName: string, payload: DisplayPayload, resolve?: DisplayRequestResolver): void {
347
+ const expiresAt = payload.durationMs ? this.now() + payload.durationMs : null
348
+ const view = (payload.view === "dashboard" ? "dashboard" : "main") as "main" | "dashboard"
349
+
350
+ // Scene requests — and legacy layouts a positioning device can render as a
351
+ // scene (sugar, old bundles) — go through the scene pipeline. Everything
352
+ // else stays on the legacy path.
353
+ let sceneElements = payload.scene ?? null
354
+ if (!sceneElements && payload.layout) {
355
+ const caps = sceneRenderer.currentCapabilities()
356
+ if (caps?.canPosition) {
357
+ sceneElements = sceneRenderer.convertLegacyLayout(payload.layout, caps)
358
+ }
359
+ }
360
+
361
+ if (sceneElements) {
362
+ this.sendScene(packageName, view, sceneElements, expiresAt, resolve)
363
+ } else if (payload.layout) {
364
+ // This layout bypasses the scene pipeline (clear_view, dashboard_card,
365
+ // unknown types, or a non-positioning device). If this (app, view) had a
366
+ // retained scene, the glasses no longer match it — reset the diff
367
+ // baseline so the next render() repaints from empty instead of skipping
368
+ // "unchanged" elements.
369
+ sceneRenderer.resetBaseline(packageName, view)
370
+ const rawEvent: Record<string, unknown> = {
371
+ view: payload.view ?? "main",
372
+ layout: payload.layout,
373
+ }
374
+ if (payload.durationMs !== undefined) {
375
+ rawEvent.durationMs = payload.durationMs
376
+ }
377
+ this.sendToNative(packageName, rawEvent, expiresAt)
378
+ resolve?.({status: "displayed"})
379
+ } else {
380
+ // A scene payload on a device with no display block at all.
381
+ resolve?.({status: "blocked", reason: "no display connected"})
382
+ return
383
+ }
384
+
385
+ // If core app fired, refresh the saved snapshot with the actual processed
386
+ // event so restore uses the wrapped text (legacy) / the retained scene.
387
+ if (packageName === this.coreApp && this.currentDisplay) {
388
+ this.coreAppDisplay = {
389
+ packageName,
390
+ processedEvent: this.currentDisplay.processedEvent,
391
+ scene: this.currentDisplay.scene,
392
+ expiresAt: this.currentDisplay.expiresAt,
393
+ }
394
+ }
395
+ }
396
+
397
+ /**
398
+ * Send a scene through SceneRenderer. On positioning devices this emits a
399
+ * SceneFrame; on degrade devices SceneRenderer hands back a legacy layout
400
+ * that rides the existing (unchanged) DisplayProcessor path.
401
+ */
402
+ private sendScene(
403
+ packageName: string,
404
+ view: "main" | "dashboard",
405
+ elements: SceneElementInput[],
406
+ expiresAt: number | null,
407
+ resolve?: DisplayRequestResolver,
408
+ ): void {
409
+ const result = sceneRenderer.emitScene(packageName, view, elements)
410
+
411
+ if (result.kind === "no-display") {
412
+ resolve?.({status: "blocked", reason: "no display connected"})
413
+ return
414
+ }
415
+
416
+ if (result.kind === "legacy") {
417
+ if (result.layout) {
418
+ this.sendToNative(packageName, {view, layout: result.layout}, expiresAt)
419
+ } else {
420
+ // Scene degraded to nothing (e.g. all-image scene on a text-only
421
+ // device). render() replaces the frame, so nothing means clear.
422
+ this.sendClear()
423
+ }
424
+ resolve?.({status: "displayed", degraded: result.degraded, dropped: result.dropped})
425
+ return
426
+ }
427
+
428
+ this.currentDisplay = {packageName, processedEvent: {}, scene: elements, expiresAt}
429
+ this.clearExpiryTimer()
430
+ if (expiresAt !== null) {
431
+ const delay = Math.max(0, expiresAt - this.now())
432
+ this.expiryTimerId = BgTimer.setTimeout(() => {
433
+ this.expiryTimerId = null
434
+ this.handleExpiry(packageName)
435
+ }, delay)
436
+ }
437
+ resolve?.({status: "displayed", degraded: result.degraded, dropped: result.dropped})
438
+ }
439
+
440
+ private sendToNative(packageName: string, rawEvent: Record<string, unknown>, expiresAt: number | null): void {
441
+ let processedEvent: Record<string, unknown>
442
+ try {
443
+ processedEvent = displayProcessor.processDisplayEvent(rawEvent as any)
444
+ } catch (err) {
445
+ console.error(`${LOG_TAG}: DisplayProcessor error, using raw event:`, err)
446
+ processedEvent = rawEvent
447
+ }
448
+
449
+ try {
450
+ // The display output path is a direct btsdk call now (was a host sendDisplayEvent
451
+ // hook) so a bare OEM renders to the glasses without wiring it.
452
+ void Promise.resolve(BluetoothSdk.displayEvent(processedEvent)).catch((err) => {
453
+ console.error(`${LOG_TAG}: native display failed:`, err)
454
+ })
455
+ // The mirror store also lives in engine, so display requests update the
456
+ // phone-side preview without any host hook.
457
+ useDisplayStore.getState().setDisplayEvent(JSON.stringify(processedEvent))
458
+ } catch (err) {
459
+ console.error(`${LOG_TAG}: native display failed:`, err)
460
+ }
461
+
462
+ this.currentDisplay = {packageName, processedEvent, expiresAt}
463
+
464
+ this.clearExpiryTimer()
465
+ if (expiresAt !== null) {
466
+ const delay = Math.max(0, expiresAt - this.now())
467
+ this.expiryTimerId = BgTimer.setTimeout(() => {
468
+ this.expiryTimerId = null
469
+ this.handleExpiry(packageName)
470
+ }, delay)
471
+ }
472
+ }
473
+
474
+ private handleExpiry(packageName: string): void {
475
+ // Someone else is on the glasses now — ignore.
476
+ if (!this.currentDisplay || this.currentDisplay.packageName !== packageName) {
477
+ return
478
+ }
479
+
480
+ // Release the lock if it belonged to this (bg) app.
481
+ if (this.backgroundLock?.packageName === packageName) {
482
+ this.backgroundLock = null
483
+ }
484
+
485
+ this.currentDisplay = null
486
+ this.tryRestoreCoreDisplay()
487
+ if (!this.currentDisplay) {
488
+ this.sendClear()
489
+ }
490
+ }
491
+
492
+ private tryRestoreCoreDisplay(): void {
493
+ if (!this.coreAppDisplay) return
494
+ // If the core snapshot has a duration and it's already elapsed, skip.
495
+ if (this.coreAppDisplay.expiresAt !== null && this.now() >= this.coreAppDisplay.expiresAt) {
496
+ this.coreAppDisplay = null
497
+ return
498
+ }
499
+ // Re-send the core's saved display.
500
+ this.restoreDisplay(this.coreAppDisplay)
501
+ }
502
+
503
+ private sendClear(): void {
504
+ const clearEvent: Record<string, unknown> = {
505
+ view: "main",
506
+ layout: {layoutType: "clear_view"},
507
+ }
508
+ this.sendToNative("system.clear", clearEvent, null)
509
+ this.currentDisplay = null
510
+ // The glasses main view is now blank: every app's retained scene is
511
+ // replay-only until it re-renders — diffing against it would skip
512
+ // "unchanged" elements onto the blank screen.
513
+ sceneRenderer.markViewStale("main")
514
+ }
515
+
516
+ // ===========================================================================
517
+ // Internals — boot
518
+ // ===========================================================================
519
+
520
+ private cancelBoot(): void {
521
+ if (!this.bootingApp) return
522
+ BgTimer.clearTimeout(this.bootingApp.timerId)
523
+ this.bootingApp = null
524
+ }
525
+
526
+ private endBoot(triggeredByFirstDisplay: boolean): void {
527
+ if (!this.bootingApp) return
528
+ const preBoot = this.bootingApp.preBoot
529
+ BgTimer.clearTimeout(this.bootingApp.timerId)
530
+ this.bootingApp = null
531
+
532
+ // Drain the queue: core first, then everyone else. Per-app last wins
533
+ // because the map holds one payload per packageName.
534
+ const queued = Array.from(this.bootQueue.entries())
535
+ this.bootQueue.clear()
536
+
537
+ const corePayload = this.coreApp ? queued.find(([pkg]) => pkg === this.coreApp) : undefined
538
+ if (corePayload) {
539
+ this.arbitrateAndSend(corePayload[0], corePayload[1].payload, corePayload[1].resolve)
540
+ }
541
+ for (const [pkg, entry] of queued) {
542
+ if (pkg === this.coreApp) continue
543
+ this.arbitrateAndSend(pkg, entry.payload, entry.resolve)
544
+ }
545
+
546
+ // Boot ended on the timeout with nothing queued and no first display — the
547
+ // app just never rendered. Restore whatever was on the glasses before the
548
+ // boot text so a background app or crash-respawn can't blank a foreground
549
+ // app's frame (registerApp fires onMount for every spawn, and the core app
550
+ // isn't wired on the local path yet). If the glasses were empty before,
551
+ // clear the lingering "Starting …" instead — otherwise a miniapp that never
552
+ // renders (e.g. audio-only) would strand it.
553
+ if (!triggeredByFirstDisplay && queued.length === 0) {
554
+ // Only restore a frame that's still valid — one whose duration elapsed
555
+ // during the boot window should clear, not come back.
556
+ if (preBoot && (preBoot.expiresAt === null || preBoot.expiresAt > this.now())) {
557
+ this.restoreDisplay(preBoot)
558
+ } else {
559
+ this.sendClear()
560
+ }
561
+ }
562
+ }
563
+
564
+ /**
565
+ * Re-push a previously-captured on-glasses frame (e.g. the display a boot
566
+ * window overwrote). Mirrors tryRestoreCoreDisplay: the saved event is already
567
+ * processed, and any remaining duration is recomputed from its expiry.
568
+ */
569
+ private restoreDisplay(saved: ActiveDisplay): void {
570
+ const remaining = saved.expiresAt !== null ? Math.max(0, saved.expiresAt - this.now()) : undefined
571
+
572
+ // Scene restores must REPLAY (create-based, epoch-bumped): re-emitting the
573
+ // scene through the normal diff would come back all-"unchanged" and the
574
+ // device would skip every element (spec §4 — replay is always create-based).
575
+ if (saved.scene) {
576
+ const expiresAt = remaining !== undefined ? this.now() + remaining : null
577
+ if (sceneRenderer.replayApp(saved.packageName, "main")) {
578
+ this.currentDisplay = {packageName: saved.packageName, processedEvent: {}, scene: saved.scene, expiresAt}
579
+ this.clearExpiryTimer()
580
+ if (expiresAt !== null) {
581
+ const delay = Math.max(0, expiresAt - this.now())
582
+ this.expiryTimerId = BgTimer.setTimeout(() => {
583
+ this.expiryTimerId = null
584
+ this.handleExpiry(saved.packageName)
585
+ }, delay)
586
+ }
587
+ } else {
588
+ // Retained state gone (app stopped since) — re-render the saved
589
+ // elements as a fresh scene instead.
590
+ this.sendNow(saved.packageName, {view: "main", scene: saved.scene, durationMs: remaining})
591
+ }
592
+ return
593
+ }
594
+
595
+ this.sendNow(saved.packageName, {
596
+ view: "main",
597
+ layout: saved.processedEvent.layout as DisplayPayload["layout"],
598
+ durationMs: remaining,
599
+ })
600
+ }
601
+
602
+ // ===========================================================================
603
+ // Reconnect replay (design doc §3.4.7 — recovery = replay, host-driven)
604
+ // ===========================================================================
605
+
606
+ /**
607
+ * Subscribe to glasses connection state so the current owner's frame is
608
+ * replayed after a reconnect. Safe to call repeatedly; attaches once. Wired
609
+ * from MantleManager next to displayProcessor.attachToRuntime().
610
+ */
611
+ public attachToRuntime(): void {
612
+ if (this.runtimeAttached) return
613
+ // dev wired this through the (since-removed) glassesStatus runtime hooks;
614
+ // engine reads its own glasses store directly.
615
+ this.glassesWasConnected = isGlassesConnected(useGlassesStore.getState().connection)
616
+ this.unsubscribeGlassesStatus = useGlassesStore.subscribe(() => {
617
+ const connected = isGlassesConnected(useGlassesStore.getState().connection)
618
+ if (connected === this.glassesWasConnected) return
619
+ this.glassesWasConnected = connected
620
+ if (connected) {
621
+ this.replayCurrent()
622
+ }
623
+ })
624
+ this.runtimeAttached = true
625
+ }
626
+
627
+ /**
628
+ * Re-push the current on-glasses frame after a device recovery. Scenes replay
629
+ * from SceneRenderer's retained state (create-based, epoch-bumped); legacy
630
+ * frames re-send their processed event. Expired frames don't come back.
631
+ */
632
+ public replayCurrent(): void {
633
+ const current = this.currentDisplay
634
+ if (!current) return
635
+ if (current.expiresAt !== null && this.now() >= current.expiresAt) return
636
+
637
+ console.log(`${LOG_TAG}: replayCurrent(${current.packageName})`)
638
+ if (current.scene) {
639
+ if (!sceneRenderer.replayApp(current.packageName, "main")) {
640
+ // Retained state gone (app stopped between disconnect and reconnect).
641
+ this.sendClear()
642
+ }
643
+ } else if (current.processedEvent.layout) {
644
+ this.sendToNative(current.packageName, current.processedEvent, current.expiresAt)
645
+ }
646
+ }
647
+
648
+ // ===========================================================================
649
+ // Internals — timer helpers
650
+ // ===========================================================================
651
+
652
+ private clearExpiryTimer(): void {
653
+ if (this.expiryTimerId !== null) {
654
+ BgTimer.clearTimeout(this.expiryTimerId)
655
+ this.expiryTimerId = null
656
+ }
657
+ }
658
+
659
+ // ===========================================================================
660
+ // Test hooks
661
+ // ===========================================================================
662
+
663
+ /** Injected clock — tests only. */
664
+ public _setNowForTest(fn: () => number): void {
665
+ this.now = fn
666
+ }
667
+
668
+ /** Wipe state — tests only. */
669
+ public _resetForTest(): void {
670
+ this.cancelBoot()
671
+ this.clearExpiryTimer()
672
+ this.coreApp = null
673
+ this.coreAppDisplay = null
674
+ this.currentDisplay = null
675
+ this.backgroundLock = null
676
+ this.bootQueue.clear()
677
+ this.now = () => Date.now()
678
+ this.unsubscribeGlassesStatus?.()
679
+ this.unsubscribeGlassesStatus = null
680
+ this.runtimeAttached = false
681
+ this.glassesWasConnected = false
682
+ sceneRenderer._resetForTest()
683
+ }
684
+
685
+ /** Read-only state snapshot — tests only. */
686
+ public _peekForTest(): {
687
+ coreApp: string | null
688
+ currentDisplayPkg: string | null
689
+ bgLockPkg: string | null
690
+ isBooting: boolean
691
+ } {
692
+ return {
693
+ coreApp: this.coreApp,
694
+ currentDisplayPkg: this.currentDisplay?.packageName ?? null,
695
+ bgLockPkg: this.backgroundLock?.packageName ?? null,
696
+ isBooting: this.bootingApp !== null,
697
+ }
698
+ }
699
+ }
700
+
701
+ const localDisplayManager = LocalDisplayManager.getInstance()
702
+ export default localDisplayManager
703
+ export {LocalDisplayManager}