@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,57 @@
1
+ /**
2
+ * Decides whether on-device Sherpa STT should produce transcripts for local
3
+ * miniapps, instead of (or in addition to) cloud transcription. Local STT is
4
+ * active when the cloud is unavailable or any subscription requires
5
+ * `forceLocal`.
6
+ *
7
+ * Activation flips `localSttFallbackActive` in the settings store, which
8
+ * the bluetooth-sdk native side reads to decide whether to feed PCM into
9
+ * the SherpaOnnxTranscriber. Local transcripts then flow back through the
10
+ * `local_transcription` Bridge event; the host wires that event to
11
+ * `localMiniappRuntime.forwardEvent`, with this coordinator providing the
12
+ * subscription-active gate so we never publish transcripts to miniapps that
13
+ * aren't asking for them. LocalMiniappRuntime filters mixed local/cloud
14
+ * delivery per miniapp.
15
+ */
16
+ declare class LocalSttFallbackCoordinator {
17
+ private static instance;
18
+ private hasTranscriptionSubscription;
19
+ private hasForceLocalSubscription;
20
+ private activeLanguage;
21
+ /**
22
+ * Default to "cloud is up" so we never accidentally activate local STT before
23
+ * the cloud client has had a chance to start. We attach lazily on the first
24
+ * subscription/reconcile pass; once attached, this field reflects the real
25
+ * cloud-client runtime status.
26
+ */
27
+ private cloudConnected;
28
+ private localActive;
29
+ private cloudAdapterAttached;
30
+ private constructor();
31
+ /**
32
+ * Lazy-attach the engine cloud connection listener. The coordinator is
33
+ * constructed at module load, before engine.start() brings up the cloud
34
+ * client, so we defer until the first reconcile.
35
+ */
36
+ private attachCloudAdapterIfReady;
37
+ static getInstance(): LocalSttFallbackCoordinator;
38
+ isActive(): boolean;
39
+ getActiveLanguage(): string | null;
40
+ onSubscriptionChange(hasTranscription: boolean, language: string | null, hasForceLocal?: boolean): void;
41
+ /**
42
+ * Informational hook, retained for API stability. No longer called: the
43
+ * authoritative switching signal is the cloud-client adapter (local miniapps
44
+ * are powered only by V2). v1 cloud transcripts deliberately do NOT drive this
45
+ * coordinator anymore. Kept for future hysteresis if connection-state alone
46
+ * proves too coarse.
47
+ */
48
+ onCloudTranscript(): void;
49
+ private reconcile;
50
+ private startLocalStt;
51
+ private stopLocalStt;
52
+ private shouldUseLocalStt;
53
+ private log;
54
+ }
55
+ declare const localSttFallbackCoordinator: LocalSttFallbackCoordinator;
56
+ export default localSttFallbackCoordinator;
57
+ //# sourceMappingURL=LocalSttFallbackCoordinator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LocalSttFallbackCoordinator.d.ts","sourceRoot":"","sources":["../../src/services/LocalSttFallbackCoordinator.ts"],"names":[],"mappings":"AAMA;;;;;;;;;;;;;;GAcG;AACH,cAAM,2BAA2B;IAC/B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA6B;IAEpD,OAAO,CAAC,4BAA4B,CAAQ;IAC5C,OAAO,CAAC,yBAAyB,CAAQ;IACzC,OAAO,CAAC,cAAc,CAAsB;IAC5C;;;;;OAKG;IACH,OAAO,CAAC,cAAc,CAAO;IAC7B,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,oBAAoB,CAAQ;IAEpC,OAAO;IAQP;;;;OAIG;IACH,OAAO,CAAC,yBAAyB;IAajC,MAAM,CAAC,WAAW,IAAI,2BAA2B;IAOjD,QAAQ,IAAI,OAAO;IAInB,iBAAiB,IAAI,MAAM,GAAG,IAAI;IAIlC,oBAAoB,CAAC,gBAAgB,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,aAAa,UAAQ,GAAG,IAAI;IAQrG;;;;;;OAMG;IACH,iBAAiB,IAAI,IAAI;YAEX,SAAS;YAUT,aAAa;IAyB3B,OAAO,CAAC,YAAY;IAMpB,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,GAAG;CAGZ;AAED,QAAA,MAAM,2BAA2B,6BAA4C,CAAA;AAC7E,eAAe,2BAA2B,CAAA"}
@@ -0,0 +1,137 @@
1
+ import BluetoothSdk from "@mentra/bluetooth-sdk/internal";
2
+ import { ISLAND_SETTINGS_KEYS } from "../runtime/config";
3
+ import { useSettingsStore } from "../stores/settings";
4
+ import { cloudClientService } from "./CloudClientService";
5
+ import sttModelManager from "./STTModelManager";
6
+ /**
7
+ * Decides whether on-device Sherpa STT should produce transcripts for local
8
+ * miniapps, instead of (or in addition to) cloud transcription. Local STT is
9
+ * active when the cloud is unavailable or any subscription requires
10
+ * `forceLocal`.
11
+ *
12
+ * Activation flips `localSttFallbackActive` in the settings store, which
13
+ * the bluetooth-sdk native side reads to decide whether to feed PCM into
14
+ * the SherpaOnnxTranscriber. Local transcripts then flow back through the
15
+ * `local_transcription` Bridge event; the host wires that event to
16
+ * `localMiniappRuntime.forwardEvent`, with this coordinator providing the
17
+ * subscription-active gate so we never publish transcripts to miniapps that
18
+ * aren't asking for them. LocalMiniappRuntime filters mixed local/cloud
19
+ * delivery per miniapp.
20
+ */
21
+ class LocalSttFallbackCoordinator {
22
+ static instance;
23
+ hasTranscriptionSubscription = false;
24
+ hasForceLocalSubscription = false;
25
+ activeLanguage = null;
26
+ /**
27
+ * Default to "cloud is up" so we never accidentally activate local STT before
28
+ * the cloud client has had a chance to start. We attach lazily on the first
29
+ * subscription/reconcile pass; once attached, this field reflects the real
30
+ * cloud-client runtime status.
31
+ */
32
+ cloudConnected = true;
33
+ localActive = false;
34
+ cloudAdapterAttached = false;
35
+ constructor() {
36
+ // Reset the persisted mirror flag on boot — the in-memory state in this
37
+ // coordinator is the source of truth, and a stale "true" left from the
38
+ // previous session would cause native to feed Sherpa before any miniapp
39
+ // registered a subscription.
40
+ useSettingsStore.getState().setSetting(ISLAND_SETTINGS_KEYS.localSttFallbackActive, false);
41
+ }
42
+ /**
43
+ * Lazy-attach the engine cloud connection listener. The coordinator is
44
+ * constructed at module load, before engine.start() brings up the cloud
45
+ * client, so we defer until the first reconcile.
46
+ */
47
+ attachCloudAdapterIfReady() {
48
+ if (this.cloudAdapterAttached)
49
+ return;
50
+ this.cloudConnected = cloudClientService.isConnected();
51
+ cloudClientService.onStatusChanged((status) => {
52
+ const connected = status.status === "connected";
53
+ if (this.cloudConnected === connected)
54
+ return;
55
+ this.log(`cloud connection -> ${connected ? "up" : "down"}`);
56
+ this.cloudConnected = connected;
57
+ void this.reconcile();
58
+ });
59
+ this.cloudAdapterAttached = true;
60
+ }
61
+ static getInstance() {
62
+ if (!LocalSttFallbackCoordinator.instance) {
63
+ LocalSttFallbackCoordinator.instance = new LocalSttFallbackCoordinator();
64
+ }
65
+ return LocalSttFallbackCoordinator.instance;
66
+ }
67
+ isActive() {
68
+ return this.localActive;
69
+ }
70
+ getActiveLanguage() {
71
+ return this.activeLanguage;
72
+ }
73
+ onSubscriptionChange(hasTranscription, language, hasForceLocal = false) {
74
+ this.log(`onSubscriptionChange(hasTx=${hasTranscription}, lang=${language}, forceLocal=${hasForceLocal})`);
75
+ this.hasTranscriptionSubscription = hasTranscription;
76
+ this.hasForceLocalSubscription = hasTranscription && hasForceLocal;
77
+ this.activeLanguage = hasTranscription ? language : null;
78
+ void this.reconcile();
79
+ }
80
+ /**
81
+ * Informational hook, retained for API stability. No longer called: the
82
+ * authoritative switching signal is the cloud-client adapter (local miniapps
83
+ * are powered only by V2). v1 cloud transcripts deliberately do NOT drive this
84
+ * coordinator anymore. Kept for future hysteresis if connection-state alone
85
+ * proves too coarse.
86
+ */
87
+ onCloudTranscript() { }
88
+ async reconcile() {
89
+ this.attachCloudAdapterIfReady();
90
+ const shouldBeActive = this.shouldUseLocalStt();
91
+ if (shouldBeActive && !this.localActive) {
92
+ await this.startLocalStt();
93
+ }
94
+ else if (!shouldBeActive && this.localActive) {
95
+ this.stopLocalStt(this.hasTranscriptionSubscription ? "cloud reconnected" : "subscription gone");
96
+ }
97
+ }
98
+ async startLocalStt() {
99
+ this.log("starting local stt");
100
+ const modelAvailable = await sttModelManager.isModelAvailable();
101
+ if (!modelAvailable) {
102
+ this.log("local stt model is not available yet — skipping activation");
103
+ return;
104
+ }
105
+ if (!this.shouldUseLocalStt()) {
106
+ this.log("local stt activation skipped: routing changed before start completed");
107
+ return;
108
+ }
109
+ try {
110
+ // Direct btsdk call now (was a host restartTranscriber hook).
111
+ await BluetoothSdk.restartTranscriber();
112
+ }
113
+ catch (err) {
114
+ this.log(`restartTranscriber failed: ${err}`);
115
+ }
116
+ if (!this.shouldUseLocalStt()) {
117
+ this.log("local stt activation skipped: routing changed during transcriber restart");
118
+ return;
119
+ }
120
+ useSettingsStore.getState().setSetting(ISLAND_SETTINGS_KEYS.localSttFallbackActive, true);
121
+ this.localActive = true;
122
+ }
123
+ stopLocalStt(reason) {
124
+ this.log(`stopping local stt: ${reason}`);
125
+ useSettingsStore.getState().setSetting(ISLAND_SETTINGS_KEYS.localSttFallbackActive, false);
126
+ this.localActive = false;
127
+ }
128
+ shouldUseLocalStt() {
129
+ return this.hasTranscriptionSubscription && (this.hasForceLocalSubscription || !this.cloudConnected);
130
+ }
131
+ log(msg) {
132
+ console.log(`[LocalSttFallback] ${msg}`);
133
+ }
134
+ }
135
+ const localSttFallbackCoordinator = LocalSttFallbackCoordinator.getInstance();
136
+ export default localSttFallbackCoordinator;
137
+ //# sourceMappingURL=LocalSttFallbackCoordinator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LocalSttFallbackCoordinator.js","sourceRoot":"","sources":["../../src/services/LocalSttFallbackCoordinator.ts"],"names":[],"mappings":"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","sourcesContent":["import BluetoothSdk from \"@mentra/bluetooth-sdk/internal\"\nimport {ISLAND_SETTINGS_KEYS} from \"../runtime/config\"\nimport {useSettingsStore} from \"../stores/settings\"\nimport {cloudClientService} from \"./CloudClientService\"\nimport sttModelManager from \"./STTModelManager\"\n\n/**\n * Decides whether on-device Sherpa STT should produce transcripts for local\n * miniapps, instead of (or in addition to) cloud transcription. Local STT is\n * active when the cloud is unavailable or any subscription requires\n * `forceLocal`.\n *\n * Activation flips `localSttFallbackActive` in the settings store, which\n * the bluetooth-sdk native side reads to decide whether to feed PCM into\n * the SherpaOnnxTranscriber. Local transcripts then flow back through the\n * `local_transcription` Bridge event; the host wires that event to\n * `localMiniappRuntime.forwardEvent`, with this coordinator providing the\n * subscription-active gate so we never publish transcripts to miniapps that\n * aren't asking for them. LocalMiniappRuntime filters mixed local/cloud\n * delivery per miniapp.\n */\nclass LocalSttFallbackCoordinator {\n private static instance: LocalSttFallbackCoordinator\n\n private hasTranscriptionSubscription = false\n private hasForceLocalSubscription = false\n private activeLanguage: string | null = null\n /**\n * Default to \"cloud is up\" so we never accidentally activate local STT before\n * the cloud client has had a chance to start. We attach lazily on the first\n * subscription/reconcile pass; once attached, this field reflects the real\n * cloud-client runtime status.\n */\n private cloudConnected = true\n private localActive = false\n private cloudAdapterAttached = false\n\n private constructor() {\n // Reset the persisted mirror flag on boot — the in-memory state in this\n // coordinator is the source of truth, and a stale \"true\" left from the\n // previous session would cause native to feed Sherpa before any miniapp\n // registered a subscription.\n useSettingsStore.getState().setSetting(ISLAND_SETTINGS_KEYS.localSttFallbackActive, false)\n }\n\n /**\n * Lazy-attach the engine cloud connection listener. The coordinator is\n * constructed at module load, before engine.start() brings up the cloud\n * client, so we defer until the first reconcile.\n */\n private attachCloudAdapterIfReady(): void {\n if (this.cloudAdapterAttached) return\n this.cloudConnected = cloudClientService.isConnected()\n cloudClientService.onStatusChanged((status) => {\n const connected = status.status === \"connected\"\n if (this.cloudConnected === connected) return\n this.log(`cloud connection -> ${connected ? \"up\" : \"down\"}`)\n this.cloudConnected = connected\n void this.reconcile()\n })\n this.cloudAdapterAttached = true\n }\n\n static getInstance(): LocalSttFallbackCoordinator {\n if (!LocalSttFallbackCoordinator.instance) {\n LocalSttFallbackCoordinator.instance = new LocalSttFallbackCoordinator()\n }\n return LocalSttFallbackCoordinator.instance\n }\n\n isActive(): boolean {\n return this.localActive\n }\n\n getActiveLanguage(): string | null {\n return this.activeLanguage\n }\n\n onSubscriptionChange(hasTranscription: boolean, language: string | null, hasForceLocal = false): void {\n this.log(`onSubscriptionChange(hasTx=${hasTranscription}, lang=${language}, forceLocal=${hasForceLocal})`)\n this.hasTranscriptionSubscription = hasTranscription\n this.hasForceLocalSubscription = hasTranscription && hasForceLocal\n this.activeLanguage = hasTranscription ? language : null\n void this.reconcile()\n }\n\n /**\n * Informational hook, retained for API stability. No longer called: the\n * authoritative switching signal is the cloud-client adapter (local miniapps\n * are powered only by V2). v1 cloud transcripts deliberately do NOT drive this\n * coordinator anymore. Kept for future hysteresis if connection-state alone\n * proves too coarse.\n */\n onCloudTranscript(): void {}\n\n private async reconcile(): Promise<void> {\n this.attachCloudAdapterIfReady()\n const shouldBeActive = this.shouldUseLocalStt()\n if (shouldBeActive && !this.localActive) {\n await this.startLocalStt()\n } else if (!shouldBeActive && this.localActive) {\n this.stopLocalStt(this.hasTranscriptionSubscription ? \"cloud reconnected\" : \"subscription gone\")\n }\n }\n\n private async startLocalStt(): Promise<void> {\n this.log(\"starting local stt\")\n const modelAvailable = await sttModelManager.isModelAvailable()\n if (!modelAvailable) {\n this.log(\"local stt model is not available yet — skipping activation\")\n return\n }\n if (!this.shouldUseLocalStt()) {\n this.log(\"local stt activation skipped: routing changed before start completed\")\n return\n }\n try {\n // Direct btsdk call now (was a host restartTranscriber hook).\n await BluetoothSdk.restartTranscriber()\n } catch (err) {\n this.log(`restartTranscriber failed: ${err}`)\n }\n if (!this.shouldUseLocalStt()) {\n this.log(\"local stt activation skipped: routing changed during transcriber restart\")\n return\n }\n useSettingsStore.getState().setSetting(ISLAND_SETTINGS_KEYS.localSttFallbackActive, true)\n this.localActive = true\n }\n\n private stopLocalStt(reason: string): void {\n this.log(`stopping local stt: ${reason}`)\n useSettingsStore.getState().setSetting(ISLAND_SETTINGS_KEYS.localSttFallbackActive, false)\n this.localActive = false\n }\n\n private shouldUseLocalStt(): boolean {\n return this.hasTranscriptionSubscription && (this.hasForceLocalSubscription || !this.cloudConnected)\n }\n\n private log(msg: string): void {\n console.log(`[LocalSttFallback] ${msg}`)\n }\n}\n\nconst localSttFallbackCoordinator = LocalSttFallbackCoordinator.getInstance()\nexport default localSttFallbackCoordinator\n"]}
@@ -0,0 +1,97 @@
1
+ /**
2
+ * MentraJSCrashController — crash recovery state machine for the
3
+ * per-miniapp JSContexts owned by MentraJSRouter.
4
+ *
5
+ * RUNNING
6
+ * │ crash detected (uncaught exception, native bridge throw,
7
+ * │ ping miss, soft-watchdog kill, etc.)
8
+ * ▼
9
+ * CRASHED ──── respawn allowed? ──── no ──► CRASHLOOP_DISABLED
10
+ * │ (persistent banner)
11
+ * ▼ yes
12
+ * BACKOFF(2s → 8s → 30s)
13
+ * │ timer fires
14
+ * ▼
15
+ * RUNNING (and stays here on a clean 60s window;
16
+ * otherwise crash count increments)
17
+ *
18
+ * Retry policy: zero retries by default — the first crash escalates
19
+ * straight to CRASHLOOP_DISABLED, matching how Android / iOS treat crashed
20
+ * apps. Callers that prefer auto-respawn opt in by passing
21
+ * `{maxRetries: 3, backoffMs: [2_000, 8_000, 30_000]}`; the BACKOFF state
22
+ * machine and exponential delays are implemented and unit-tested for that
23
+ * case.
24
+ *
25
+ * The controller is purely a policy engine — it doesn't actually call
26
+ * mentraJsSpawn / mentraJsKill. Callers (MentraJSRouter) read the
27
+ * Outcome returned from onCrash() and drive the host accordingly. This
28
+ * makes the controller unit-testable with synthetic timer.
29
+ */
30
+ export type CrashState = {
31
+ kind: "RUNNING";
32
+ sinceMs: number;
33
+ } | {
34
+ kind: "CRASHED";
35
+ reason: string;
36
+ crashedAtMs: number;
37
+ } | {
38
+ kind: "BACKOFF";
39
+ until: number;
40
+ attempt: number;
41
+ reason: string;
42
+ } | {
43
+ kind: "CRASHLOOP_DISABLED";
44
+ sinceMs: number;
45
+ reason: string;
46
+ };
47
+ export interface CrashOutcome {
48
+ /** Caller must call `respawn(packageName)` after this delay (ms from now). */
49
+ scheduleRespawnAfterMs?: number;
50
+ /** Caller should surface "X restarted" toast (2nd-within-5m crash). */
51
+ showRestartToast?: boolean;
52
+ /** Caller should surface persistent "crashloop disabled" banner. */
53
+ surfaceCrashloopBanner?: boolean;
54
+ /** Caller may push the crash event to dev portal / Sentry as warn-level. */
55
+ sentryLevel?: "info" | "warning" | "error";
56
+ }
57
+ export interface CrashControllerOptions {
58
+ /** Override the wall clock for tests. Defaults to Date.now. */
59
+ now?: () => number;
60
+ /** Backoff sequence in ms. Defaults to [2_000, 8_000, 30_000]. */
61
+ backoffMs?: number[];
62
+ /** Window in ms — N crashes inside this window escalates. Defaults to 5min. */
63
+ crashWindowMs?: number;
64
+ /** Max retries before CRASHLOOP_DISABLED. Defaults to 0 — first crash
65
+ * escalates immediately, matching Android / iOS app conventions. */
66
+ maxRetries?: number;
67
+ /** Clean-uptime threshold that resets the retry counter. Defaults to 60s. */
68
+ cleanUptimeResetMs?: number;
69
+ }
70
+ export declare class MentraJSCrashController {
71
+ private readonly now;
72
+ private readonly backoffMs;
73
+ private readonly crashWindowMs;
74
+ private readonly maxRetries;
75
+ private readonly cleanUptimeResetMs;
76
+ private readonly packages;
77
+ constructor(opts?: CrashControllerOptions);
78
+ /** Tracking starts when MentraJSRouter spawns a fresh JSContext. */
79
+ onSpawn(packageName: string): void;
80
+ /** Called when MentraJSRouter explicitly tears down (user-initiated). */
81
+ onKill(packageName: string): void;
82
+ /**
83
+ * Record a crash and return the policy outcome. Caller is responsible for
84
+ * scheduling the respawn (timer ownership belongs at the orchestration
85
+ * layer that holds the host context, not here).
86
+ */
87
+ onCrash(packageName: string, reason: string): CrashOutcome;
88
+ /** Inspect current state — useful for tests and diagnostics. */
89
+ stateFor(packageName: string): CrashState | null;
90
+ /** Total respawns since registration — surfaced to Sentry as a counter. */
91
+ respawnCount(packageName: string): number;
92
+ /** Currently-disabled packages. Host UI uses this to show banners. */
93
+ disabledPackages(): string[];
94
+ /** Manually re-enable a disabled package (user "Try again" tap). */
95
+ reset(packageName: string): void;
96
+ }
97
+ //# sourceMappingURL=MentraJSCrashController.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MentraJSCrashController.d.ts","sourceRoot":"","sources":["../../src/services/MentraJSCrashController.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,MAAM,MAAM,UAAU,GAClB;IAAC,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAC,GAClC;IAAC,IAAI,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAC,GACtD;IAAC,IAAI,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAC,GACjE;IAAC,IAAI,EAAE,oBAAoB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAC,CAAA;AAEjE,MAAM,WAAW,YAAY;IAC3B,8EAA8E;IAC9E,sBAAsB,CAAC,EAAE,MAAM,CAAA;IAC/B,uEAAuE;IACvE,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,oEAAoE;IACpE,sBAAsB,CAAC,EAAE,OAAO,CAAA;IAChC,4EAA4E;IAC5E,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAA;CAC3C;AAED,MAAM,WAAW,sBAAsB;IACrC,+DAA+D;IAC/D,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;IAClB,kEAAkE;IAClE,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;IACpB,+EAA+E;IAC/E,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB;yEACqE;IACrE,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,6EAA6E;IAC7E,kBAAkB,CAAC,EAAE,MAAM,CAAA;CAC5B;AAeD,qBAAa,uBAAuB;IAClC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAc;IAClC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAU;IACpC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAQ;IACtC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAQ;IACnC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAQ;IAC3C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAuC;gBAEpD,IAAI,GAAE,sBAA2B;IAQ7C,oEAAoE;IACpE,OAAO,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAiBlC,yEAAyE;IACzE,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAIjC;;;;OAIG;IACH,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,YAAY;IA4C1D,gEAAgE;IAChE,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAIhD,2EAA2E;IAC3E,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;IAIzC,sEAAsE;IACtE,gBAAgB,IAAI,MAAM,EAAE;IAQ5B,oEAAoE;IACpE,KAAK,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;CAMjC"}
@@ -0,0 +1,138 @@
1
+ /**
2
+ * MentraJSCrashController — crash recovery state machine for the
3
+ * per-miniapp JSContexts owned by MentraJSRouter.
4
+ *
5
+ * RUNNING
6
+ * │ crash detected (uncaught exception, native bridge throw,
7
+ * │ ping miss, soft-watchdog kill, etc.)
8
+ * ▼
9
+ * CRASHED ──── respawn allowed? ──── no ──► CRASHLOOP_DISABLED
10
+ * │ (persistent banner)
11
+ * ▼ yes
12
+ * BACKOFF(2s → 8s → 30s)
13
+ * │ timer fires
14
+ * ▼
15
+ * RUNNING (and stays here on a clean 60s window;
16
+ * otherwise crash count increments)
17
+ *
18
+ * Retry policy: zero retries by default — the first crash escalates
19
+ * straight to CRASHLOOP_DISABLED, matching how Android / iOS treat crashed
20
+ * apps. Callers that prefer auto-respawn opt in by passing
21
+ * `{maxRetries: 3, backoffMs: [2_000, 8_000, 30_000]}`; the BACKOFF state
22
+ * machine and exponential delays are implemented and unit-tested for that
23
+ * case.
24
+ *
25
+ * The controller is purely a policy engine — it doesn't actually call
26
+ * mentraJsSpawn / mentraJsKill. Callers (MentraJSRouter) read the
27
+ * Outcome returned from onCrash() and drive the host accordingly. This
28
+ * makes the controller unit-testable with synthetic timer.
29
+ */
30
+ const DEFAULT_BACKOFFS = [2_000, 8_000, 30_000];
31
+ const DEFAULT_WINDOW_MS = 5 * 60_000;
32
+ const DEFAULT_MAX_RETRIES = 0;
33
+ const DEFAULT_CLEAN_UPTIME_RESET_MS = 60_000;
34
+ export class MentraJSCrashController {
35
+ now;
36
+ backoffMs;
37
+ crashWindowMs;
38
+ maxRetries;
39
+ cleanUptimeResetMs;
40
+ packages = new Map();
41
+ constructor(opts = {}) {
42
+ this.now = opts.now ?? (() => Date.now());
43
+ this.backoffMs = opts.backoffMs ?? DEFAULT_BACKOFFS;
44
+ this.crashWindowMs = opts.crashWindowMs ?? DEFAULT_WINDOW_MS;
45
+ this.maxRetries = opts.maxRetries ?? DEFAULT_MAX_RETRIES;
46
+ this.cleanUptimeResetMs = opts.cleanUptimeResetMs ?? DEFAULT_CLEAN_UPTIME_RESET_MS;
47
+ }
48
+ /** Tracking starts when MentraJSRouter spawns a fresh JSContext. */
49
+ onSpawn(packageName) {
50
+ const at = this.now();
51
+ const prev = this.packages.get(packageName);
52
+ if (prev) {
53
+ // Carry forward the crash history; a respawn doesn't reset retry
54
+ // budget unless the previous RUNNING state survived >= cleanUptimeResetMs.
55
+ prev.state = { kind: "RUNNING", sinceMs: at };
56
+ prev.totalRespawns += 1;
57
+ }
58
+ else {
59
+ this.packages.set(packageName, {
60
+ state: { kind: "RUNNING", sinceMs: at },
61
+ crashesInWindow: [],
62
+ totalRespawns: 0,
63
+ });
64
+ }
65
+ }
66
+ /** Called when MentraJSRouter explicitly tears down (user-initiated). */
67
+ onKill(packageName) {
68
+ this.packages.delete(packageName);
69
+ }
70
+ /**
71
+ * Record a crash and return the policy outcome. Caller is responsible for
72
+ * scheduling the respawn (timer ownership belongs at the orchestration
73
+ * layer that holds the host context, not here).
74
+ */
75
+ onCrash(packageName, reason) {
76
+ const at = this.now();
77
+ const entry = this.packages.get(packageName) ?? {
78
+ state: { kind: "RUNNING", sinceMs: at },
79
+ crashesInWindow: [],
80
+ totalRespawns: 0,
81
+ };
82
+ // If the previous RUNNING window was long enough, reset the retry
83
+ // counter — a crash after a stable session shouldn't burn budget.
84
+ if (entry.state.kind === "RUNNING") {
85
+ const uptime = at - entry.state.sinceMs;
86
+ if (uptime >= this.cleanUptimeResetMs) {
87
+ entry.crashesInWindow = [];
88
+ }
89
+ }
90
+ // Drop crashes that fell out of the window before counting the new one.
91
+ const cutoff = at - this.crashWindowMs;
92
+ entry.crashesInWindow = entry.crashesInWindow.filter((t) => t >= cutoff);
93
+ entry.crashesInWindow.push(at);
94
+ this.packages.set(packageName, entry);
95
+ const crashCount = entry.crashesInWindow.length;
96
+ if (crashCount > this.maxRetries) {
97
+ entry.state = { kind: "CRASHLOOP_DISABLED", sinceMs: at, reason };
98
+ return {
99
+ surfaceCrashloopBanner: true,
100
+ sentryLevel: "error",
101
+ };
102
+ }
103
+ const attempt = crashCount - 1;
104
+ const delayMs = this.backoffMs[Math.min(attempt, this.backoffMs.length - 1)];
105
+ entry.state = { kind: "BACKOFF", until: at + delayMs, attempt: crashCount, reason };
106
+ return {
107
+ scheduleRespawnAfterMs: delayMs,
108
+ showRestartToast: crashCount >= 2,
109
+ sentryLevel: crashCount === 1 ? "info" : "warning",
110
+ };
111
+ }
112
+ /** Inspect current state — useful for tests and diagnostics. */
113
+ stateFor(packageName) {
114
+ return this.packages.get(packageName)?.state ?? null;
115
+ }
116
+ /** Total respawns since registration — surfaced to Sentry as a counter. */
117
+ respawnCount(packageName) {
118
+ return this.packages.get(packageName)?.totalRespawns ?? 0;
119
+ }
120
+ /** Currently-disabled packages. Host UI uses this to show banners. */
121
+ disabledPackages() {
122
+ const out = [];
123
+ for (const [name, entry] of this.packages) {
124
+ if (entry.state.kind === "CRASHLOOP_DISABLED")
125
+ out.push(name);
126
+ }
127
+ return out;
128
+ }
129
+ /** Manually re-enable a disabled package (user "Try again" tap). */
130
+ reset(packageName) {
131
+ const entry = this.packages.get(packageName);
132
+ if (!entry)
133
+ return;
134
+ entry.crashesInWindow = [];
135
+ entry.state = { kind: "RUNNING", sinceMs: this.now() };
136
+ }
137
+ }
138
+ //# sourceMappingURL=MentraJSCrashController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MentraJSCrashController.js","sourceRoot":"","sources":["../../src/services/MentraJSCrashController.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAyCH,MAAM,gBAAgB,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAA;AAC/C,MAAM,iBAAiB,GAAG,CAAC,GAAG,MAAM,CAAA;AACpC,MAAM,mBAAmB,GAAG,CAAC,CAAA;AAC7B,MAAM,6BAA6B,GAAG,MAAM,CAAA;AAE5C,MAAM,OAAO,uBAAuB;IACjB,GAAG,CAAc;IACjB,SAAS,CAAU;IACnB,aAAa,CAAQ;IACrB,UAAU,CAAQ;IAClB,kBAAkB,CAAQ;IAC1B,QAAQ,GAA8B,IAAI,GAAG,EAAE,CAAA;IAEhE,YAAY,OAA+B,EAAE;QAC3C,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAA;QACzC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,gBAAgB,CAAA;QACnD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,IAAI,iBAAiB,CAAA;QAC5D,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,mBAAmB,CAAA;QACxD,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,IAAI,6BAA6B,CAAA;IACpF,CAAC;IAED,oEAAoE;IACpE,OAAO,CAAC,WAAmB;QACzB,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QACrB,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;QAC3C,IAAI,IAAI,EAAE,CAAC;YACT,iEAAiE;YACjE,2EAA2E;YAC3E,IAAI,CAAC,KAAK,GAAG,EAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,EAAC,CAAA;YAC3C,IAAI,CAAC,aAAa,IAAI,CAAC,CAAA;QACzB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,EAAE;gBAC7B,KAAK,EAAE,EAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,EAAC;gBACrC,eAAe,EAAE,EAAE;gBACnB,aAAa,EAAE,CAAC;aACjB,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAED,yEAAyE;IACzE,MAAM,CAAC,WAAmB;QACxB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,CAAA;IACnC,CAAC;IAED;;;;OAIG;IACH,OAAO,CAAC,WAAmB,EAAE,MAAc;QACzC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QACrB,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI;YAC9C,KAAK,EAAE,EAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,EAAC;YACrC,eAAe,EAAE,EAAE;YACnB,aAAa,EAAE,CAAC;SACjB,CAAA;QAED,kEAAkE;QAClE,kEAAkE;QAClE,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YACnC,MAAM,MAAM,GAAG,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAA;YACvC,IAAI,MAAM,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBACtC,KAAK,CAAC,eAAe,GAAG,EAAE,CAAA;YAC5B,CAAC;QACH,CAAC;QAED,wEAAwE;QACxE,MAAM,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,aAAa,CAAA;QACtC,KAAK,CAAC,eAAe,GAAG,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,CAAA;QACxE,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAC9B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,CAAC,CAAA;QAErC,MAAM,UAAU,GAAG,KAAK,CAAC,eAAe,CAAC,MAAM,CAAA;QAE/C,IAAI,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;YACjC,KAAK,CAAC,KAAK,GAAG,EAAC,IAAI,EAAE,oBAAoB,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAC,CAAA;YAC/D,OAAO;gBACL,sBAAsB,EAAE,IAAI;gBAC5B,WAAW,EAAE,OAAO;aACrB,CAAA;QACH,CAAC;QAED,MAAM,OAAO,GAAG,UAAU,GAAG,CAAC,CAAA;QAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAE,CAAA;QAC7E,KAAK,CAAC,KAAK,GAAG,EAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAC,CAAA;QAEjF,OAAO;YACL,sBAAsB,EAAE,OAAO;YAC/B,gBAAgB,EAAE,UAAU,IAAI,CAAC;YACjC,WAAW,EAAE,UAAU,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;SACnD,CAAA;IACH,CAAC;IAED,gEAAgE;IAChE,QAAQ,CAAC,WAAmB;QAC1B,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,KAAK,IAAI,IAAI,CAAA;IACtD,CAAC;IAED,2EAA2E;IAC3E,YAAY,CAAC,WAAmB;QAC9B,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,aAAa,IAAI,CAAC,CAAA;IAC3D,CAAC;IAED,sEAAsE;IACtE,gBAAgB;QACd,MAAM,GAAG,GAAa,EAAE,CAAA;QACxB,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC1C,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,oBAAoB;gBAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC/D,CAAC;QACD,OAAO,GAAG,CAAA;IACZ,CAAC;IAED,oEAAoE;IACpE,KAAK,CAAC,WAAmB;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;QAC5C,IAAI,CAAC,KAAK;YAAE,OAAM;QAClB,KAAK,CAAC,eAAe,GAAG,EAAE,CAAA;QAC1B,KAAK,CAAC,KAAK,GAAG,EAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,EAAC,CAAA;IACtD,CAAC;CACF","sourcesContent":["/**\n * MentraJSCrashController — crash recovery state machine for the\n * per-miniapp JSContexts owned by MentraJSRouter.\n *\n * RUNNING\n * │ crash detected (uncaught exception, native bridge throw,\n * │ ping miss, soft-watchdog kill, etc.)\n * ▼\n * CRASHED ──── respawn allowed? ──── no ──► CRASHLOOP_DISABLED\n * │ (persistent banner)\n * ▼ yes\n * BACKOFF(2s → 8s → 30s)\n * │ timer fires\n * ▼\n * RUNNING (and stays here on a clean 60s window;\n * otherwise crash count increments)\n *\n * Retry policy: zero retries by default — the first crash escalates\n * straight to CRASHLOOP_DISABLED, matching how Android / iOS treat crashed\n * apps. Callers that prefer auto-respawn opt in by passing\n * `{maxRetries: 3, backoffMs: [2_000, 8_000, 30_000]}`; the BACKOFF state\n * machine and exponential delays are implemented and unit-tested for that\n * case.\n *\n * The controller is purely a policy engine — it doesn't actually call\n * mentraJsSpawn / mentraJsKill. Callers (MentraJSRouter) read the\n * Outcome returned from onCrash() and drive the host accordingly. This\n * makes the controller unit-testable with synthetic timer.\n */\n\nexport type CrashState =\n | {kind: \"RUNNING\"; sinceMs: number}\n | {kind: \"CRASHED\"; reason: string; crashedAtMs: number}\n | {kind: \"BACKOFF\"; until: number; attempt: number; reason: string}\n | {kind: \"CRASHLOOP_DISABLED\"; sinceMs: number; reason: string}\n\nexport interface CrashOutcome {\n /** Caller must call `respawn(packageName)` after this delay (ms from now). */\n scheduleRespawnAfterMs?: number\n /** Caller should surface \"X restarted\" toast (2nd-within-5m crash). */\n showRestartToast?: boolean\n /** Caller should surface persistent \"crashloop disabled\" banner. */\n surfaceCrashloopBanner?: boolean\n /** Caller may push the crash event to dev portal / Sentry as warn-level. */\n sentryLevel?: \"info\" | \"warning\" | \"error\"\n}\n\nexport interface CrashControllerOptions {\n /** Override the wall clock for tests. Defaults to Date.now. */\n now?: () => number\n /** Backoff sequence in ms. Defaults to [2_000, 8_000, 30_000]. */\n backoffMs?: number[]\n /** Window in ms — N crashes inside this window escalates. Defaults to 5min. */\n crashWindowMs?: number\n /** Max retries before CRASHLOOP_DISABLED. Defaults to 0 — first crash\n * escalates immediately, matching Android / iOS app conventions. */\n maxRetries?: number\n /** Clean-uptime threshold that resets the retry counter. Defaults to 60s. */\n cleanUptimeResetMs?: number\n}\n\ninterface PackageState {\n state: CrashState\n /** Crash timestamps inside the current window (sorted ascending). */\n crashesInWindow: number[]\n /** Total respawns since the package was first registered (for telemetry). */\n totalRespawns: number\n}\n\nconst DEFAULT_BACKOFFS = [2_000, 8_000, 30_000]\nconst DEFAULT_WINDOW_MS = 5 * 60_000\nconst DEFAULT_MAX_RETRIES = 0\nconst DEFAULT_CLEAN_UPTIME_RESET_MS = 60_000\n\nexport class MentraJSCrashController {\n private readonly now: () => number\n private readonly backoffMs: number[]\n private readonly crashWindowMs: number\n private readonly maxRetries: number\n private readonly cleanUptimeResetMs: number\n private readonly packages: Map<string, PackageState> = new Map()\n\n constructor(opts: CrashControllerOptions = {}) {\n this.now = opts.now ?? (() => Date.now())\n this.backoffMs = opts.backoffMs ?? DEFAULT_BACKOFFS\n this.crashWindowMs = opts.crashWindowMs ?? DEFAULT_WINDOW_MS\n this.maxRetries = opts.maxRetries ?? DEFAULT_MAX_RETRIES\n this.cleanUptimeResetMs = opts.cleanUptimeResetMs ?? DEFAULT_CLEAN_UPTIME_RESET_MS\n }\n\n /** Tracking starts when MentraJSRouter spawns a fresh JSContext. */\n onSpawn(packageName: string): void {\n const at = this.now()\n const prev = this.packages.get(packageName)\n if (prev) {\n // Carry forward the crash history; a respawn doesn't reset retry\n // budget unless the previous RUNNING state survived >= cleanUptimeResetMs.\n prev.state = {kind: \"RUNNING\", sinceMs: at}\n prev.totalRespawns += 1\n } else {\n this.packages.set(packageName, {\n state: {kind: \"RUNNING\", sinceMs: at},\n crashesInWindow: [],\n totalRespawns: 0,\n })\n }\n }\n\n /** Called when MentraJSRouter explicitly tears down (user-initiated). */\n onKill(packageName: string): void {\n this.packages.delete(packageName)\n }\n\n /**\n * Record a crash and return the policy outcome. Caller is responsible for\n * scheduling the respawn (timer ownership belongs at the orchestration\n * layer that holds the host context, not here).\n */\n onCrash(packageName: string, reason: string): CrashOutcome {\n const at = this.now()\n const entry = this.packages.get(packageName) ?? {\n state: {kind: \"RUNNING\", sinceMs: at},\n crashesInWindow: [],\n totalRespawns: 0,\n }\n\n // If the previous RUNNING window was long enough, reset the retry\n // counter — a crash after a stable session shouldn't burn budget.\n if (entry.state.kind === \"RUNNING\") {\n const uptime = at - entry.state.sinceMs\n if (uptime >= this.cleanUptimeResetMs) {\n entry.crashesInWindow = []\n }\n }\n\n // Drop crashes that fell out of the window before counting the new one.\n const cutoff = at - this.crashWindowMs\n entry.crashesInWindow = entry.crashesInWindow.filter((t) => t >= cutoff)\n entry.crashesInWindow.push(at)\n this.packages.set(packageName, entry)\n\n const crashCount = entry.crashesInWindow.length\n\n if (crashCount > this.maxRetries) {\n entry.state = {kind: \"CRASHLOOP_DISABLED\", sinceMs: at, reason}\n return {\n surfaceCrashloopBanner: true,\n sentryLevel: \"error\",\n }\n }\n\n const attempt = crashCount - 1\n const delayMs = this.backoffMs[Math.min(attempt, this.backoffMs.length - 1)]!\n entry.state = {kind: \"BACKOFF\", until: at + delayMs, attempt: crashCount, reason}\n\n return {\n scheduleRespawnAfterMs: delayMs,\n showRestartToast: crashCount >= 2,\n sentryLevel: crashCount === 1 ? \"info\" : \"warning\",\n }\n }\n\n /** Inspect current state — useful for tests and diagnostics. */\n stateFor(packageName: string): CrashState | null {\n return this.packages.get(packageName)?.state ?? null\n }\n\n /** Total respawns since registration — surfaced to Sentry as a counter. */\n respawnCount(packageName: string): number {\n return this.packages.get(packageName)?.totalRespawns ?? 0\n }\n\n /** Currently-disabled packages. Host UI uses this to show banners. */\n disabledPackages(): string[] {\n const out: string[] = []\n for (const [name, entry] of this.packages) {\n if (entry.state.kind === \"CRASHLOOP_DISABLED\") out.push(name)\n }\n return out\n }\n\n /** Manually re-enable a disabled package (user \"Try again\" tap). */\n reset(packageName: string): void {\n const entry = this.packages.get(packageName)\n if (!entry) return\n entry.crashesInWindow = []\n entry.state = {kind: \"RUNNING\", sinceMs: this.now()}\n }\n}\n"]}
@@ -0,0 +1,9 @@
1
+ import { type AutomaticReportSubmissionStatus } from "./AutomaticReportResult";
2
+ export declare function submitMentraJSCrashloopReport(params: {
3
+ packageName: string;
4
+ reason: string;
5
+ lastLogLines?: string[];
6
+ }): Promise<AutomaticReportSubmissionStatus>;
7
+ export declare function startMentraJSCrashloopReportService(): void;
8
+ export declare function stopMentraJSCrashloopReportService(): void;
9
+ //# sourceMappingURL=MentraJSCrashloopReportService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MentraJSCrashloopReportService.d.ts","sourceRoot":"","sources":["../../src/services/MentraJSCrashloopReportService.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,KAAK,+BAA+B,EACrC,MAAM,yBAAyB,CAAA;AAQhC,wBAAsB,6BAA6B,CAAC,MAAM,EAAE;IAC1D,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;CACxB,GAAG,OAAO,CAAC,+BAA+B,CAAC,CAwB3C;AAeD,wBAAgB,mCAAmC,IAAI,IAAI,CAG1D;AAED,wBAAgB,kCAAkC,IAAI,IAAI,CAGzD"}
@@ -0,0 +1,54 @@
1
+ import { submitAutomaticReport } from "../facades/reports";
2
+ import { useAppStatusStore } from "../stores/apps";
3
+ import { logAutomaticReportSubmissionStatus, toAutomaticReportSubmissionStatus, } from "./AutomaticReportResult";
4
+ import { getMiniappEngine } from "./MiniappEngine";
5
+ import { islandNotifications } from "./NotificationsEmitter";
6
+ const LOG_TAG = "MentraJSCrashloopReport";
7
+ let unsubscribe = null;
8
+ export async function submitMentraJSCrashloopReport(params) {
9
+ const { packageName, reason, lastLogLines = [] } = params;
10
+ const app = useAppStatusStore.getState().apps.find((a) => a.packageName === packageName);
11
+ const appName = app?.name ?? packageName;
12
+ const result = await submitAutomaticReport({
13
+ kind: "automatic",
14
+ trigger: {
15
+ type: "automatic",
16
+ source: "miniapp_crashloop",
17
+ reason: "mentrajs_crashloop_disabled",
18
+ sourceAppletPackageName: packageName,
19
+ sourceAppletName: appName,
20
+ },
21
+ report: {
22
+ expectedBehavior: `${appName} should run without crashing.`,
23
+ actualBehavior: JSON.stringify({ reason, lastLogLines }, null, 2),
24
+ systemPriority: "critical",
25
+ },
26
+ throttleKey: `mentrajs_crashloop:${packageName}`,
27
+ });
28
+ const status = toAutomaticReportSubmissionStatus(result);
29
+ logAutomaticReportSubmissionStatus(LOG_TAG, status, packageName);
30
+ return status;
31
+ }
32
+ function handleNotification(notification) {
33
+ if (notification.kind !== "miniapp_crashloop" || !notification.packageName)
34
+ return;
35
+ const packageName = notification.packageName;
36
+ const lastLogLines = getMiniappEngine()?.router.logRing.snapshot(packageName) ?? [];
37
+ void submitMentraJSCrashloopReport({
38
+ packageName,
39
+ reason: notification.reason,
40
+ lastLogLines,
41
+ }).catch((error) => {
42
+ console.error(`[${LOG_TAG}] Unexpected error:`, error);
43
+ });
44
+ }
45
+ export function startMentraJSCrashloopReportService() {
46
+ if (unsubscribe)
47
+ return;
48
+ unsubscribe = islandNotifications.subscribe(handleNotification);
49
+ }
50
+ export function stopMentraJSCrashloopReportService() {
51
+ unsubscribe?.();
52
+ unsubscribe = null;
53
+ }
54
+ //# sourceMappingURL=MentraJSCrashloopReportService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MentraJSCrashloopReportService.js","sourceRoot":"","sources":["../../src/services/MentraJSCrashloopReportService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,qBAAqB,EAAC,MAAM,oBAAoB,CAAA;AACxD,OAAO,EAAC,iBAAiB,EAAC,MAAM,gBAAgB,CAAA;AAChD,OAAO,EACL,kCAAkC,EAClC,iCAAiC,GAElC,MAAM,yBAAyB,CAAA;AAChC,OAAO,EAAC,gBAAgB,EAAC,MAAM,iBAAiB,CAAA;AAChD,OAAO,EAAC,mBAAmB,EAA0B,MAAM,wBAAwB,CAAA;AAEnF,MAAM,OAAO,GAAG,yBAAyB,CAAA;AAEzC,IAAI,WAAW,GAAwB,IAAI,CAAA;AAE3C,MAAM,CAAC,KAAK,UAAU,6BAA6B,CAAC,MAInD;IACC,MAAM,EAAC,WAAW,EAAE,MAAM,EAAE,YAAY,GAAG,EAAE,EAAC,GAAG,MAAM,CAAA;IACvD,MAAM,GAAG,GAAG,iBAAiB,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,KAAK,WAAW,CAAC,CAAA;IACxF,MAAM,OAAO,GAAG,GAAG,EAAE,IAAI,IAAI,WAAW,CAAA;IACxC,MAAM,MAAM,GAAG,MAAM,qBAAqB,CAAC;QACzC,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE;YACP,IAAI,EAAE,WAAW;YACjB,MAAM,EAAE,mBAAmB;YAC3B,MAAM,EAAE,6BAA6B;YACrC,uBAAuB,EAAE,WAAW;YACpC,gBAAgB,EAAE,OAAO;SAC1B;QACD,MAAM,EAAE;YACN,gBAAgB,EAAE,GAAG,OAAO,+BAA+B;YAC3D,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,EAAC,MAAM,EAAE,YAAY,EAAC,EAAE,IAAI,EAAE,CAAC,CAAC;YAC/D,cAAc,EAAE,UAAU;SAC3B;QACD,WAAW,EAAE,sBAAsB,WAAW,EAAE;KACjD,CAAC,CAAA;IAEF,MAAM,MAAM,GAAG,iCAAiC,CAAC,MAAM,CAAC,CAAA;IACxD,kCAAkC,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,CAAA;IAChE,OAAO,MAAM,CAAA;AACf,CAAC;AAED,SAAS,kBAAkB,CAAC,YAAgC;IAC1D,IAAI,YAAY,CAAC,IAAI,KAAK,mBAAmB,IAAI,CAAC,YAAY,CAAC,WAAW;QAAE,OAAM;IAClF,MAAM,WAAW,GAAG,YAAY,CAAC,WAAW,CAAA;IAC5C,MAAM,YAAY,GAAG,gBAAgB,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,EAAE,CAAA;IACnF,KAAK,6BAA6B,CAAC;QACjC,WAAW;QACX,MAAM,EAAE,YAAY,CAAC,MAAM;QAC3B,YAAY;KACb,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;QACjB,OAAO,CAAC,KAAK,CAAC,IAAI,OAAO,qBAAqB,EAAE,KAAK,CAAC,CAAA;IACxD,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,UAAU,mCAAmC;IACjD,IAAI,WAAW;QAAE,OAAM;IACvB,WAAW,GAAG,mBAAmB,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAA;AACjE,CAAC;AAED,MAAM,UAAU,kCAAkC;IAChD,WAAW,EAAE,EAAE,CAAA;IACf,WAAW,GAAG,IAAI,CAAA;AACpB,CAAC","sourcesContent":["import {submitAutomaticReport} from \"../facades/reports\"\nimport {useAppStatusStore} from \"../stores/apps\"\nimport {\n logAutomaticReportSubmissionStatus,\n toAutomaticReportSubmissionStatus,\n type AutomaticReportSubmissionStatus,\n} from \"./AutomaticReportResult\"\nimport {getMiniappEngine} from \"./MiniappEngine\"\nimport {islandNotifications, type IslandNotification} from \"./NotificationsEmitter\"\n\nconst LOG_TAG = \"MentraJSCrashloopReport\"\n\nlet unsubscribe: (() => void) | null = null\n\nexport async function submitMentraJSCrashloopReport(params: {\n packageName: string\n reason: string\n lastLogLines?: string[]\n}): Promise<AutomaticReportSubmissionStatus> {\n const {packageName, reason, lastLogLines = []} = params\n const app = useAppStatusStore.getState().apps.find((a) => a.packageName === packageName)\n const appName = app?.name ?? packageName\n const result = await submitAutomaticReport({\n kind: \"automatic\",\n trigger: {\n type: \"automatic\",\n source: \"miniapp_crashloop\",\n reason: \"mentrajs_crashloop_disabled\",\n sourceAppletPackageName: packageName,\n sourceAppletName: appName,\n },\n report: {\n expectedBehavior: `${appName} should run without crashing.`,\n actualBehavior: JSON.stringify({reason, lastLogLines}, null, 2),\n systemPriority: \"critical\",\n },\n throttleKey: `mentrajs_crashloop:${packageName}`,\n })\n\n const status = toAutomaticReportSubmissionStatus(result)\n logAutomaticReportSubmissionStatus(LOG_TAG, status, packageName)\n return status\n}\n\nfunction handleNotification(notification: IslandNotification): void {\n if (notification.kind !== \"miniapp_crashloop\" || !notification.packageName) return\n const packageName = notification.packageName\n const lastLogLines = getMiniappEngine()?.router.logRing.snapshot(packageName) ?? []\n void submitMentraJSCrashloopReport({\n packageName,\n reason: notification.reason,\n lastLogLines,\n }).catch((error) => {\n console.error(`[${LOG_TAG}] Unexpected error:`, error)\n })\n}\n\nexport function startMentraJSCrashloopReportService(): void {\n if (unsubscribe) return\n unsubscribe = islandNotifications.subscribe(handleNotification)\n}\n\nexport function stopMentraJSCrashloopReportService(): void {\n unsubscribe?.()\n unsubscribe = null\n}\n"]}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * MentraJSLogPipeline — the three log-side utilities that
3
+ * MentraJSRouter's `__log` handler runs every miniapp log line through:
4
+ *
5
+ * 1. redactSecrets — walks a value (string / array / object) and
6
+ * replaces anything matching the secret-key regex
7
+ * (token|password|secret|auth|bearer|key|api[_-]?key) with
8
+ * "[REDACTED]". Conservative: over-redaction is preferable to
9
+ * leaking a real secret into Sentry breadcrumbs.
10
+ *
11
+ * 2. MentraJSLogThrottle — token-bucket rate limiter, 100 lines/min
12
+ * sustained with a 500-line burst, per miniapp. Excess is dropped
13
+ * and surfaced once as a `[throttled N]` summary. Stops a
14
+ * misbehaving miniapp from drowning the host's log stream.
15
+ *
16
+ * 3. MentraJSLogRingBuffer — fixed-size circular buffer (default 200)
17
+ * holding the most recent log lines per miniapp. Dumped into the
18
+ * crash report so post-mortem tooling sees the miniapp's last words.
19
+ *
20
+ * All three are pure (no React Native imports) and unit-tested in
21
+ * MentraJSLogPipeline.test.ts.
22
+ */
23
+ /**
24
+ * Redact obvious secret-like strings from a log line. Walks the JSON
25
+ * argument list, replacing any value that looks like a secret with
26
+ * `[REDACTED]`. Conservative — false negatives are fine, false positives
27
+ * are bad (devs lose visibility into their own data).
28
+ *
29
+ * Heuristics:
30
+ * 1. Top-level strings matching SECRET_KEY_PATTERN get the entire value
31
+ * redacted (e.g. `console.log("token=abc123")` → `[REDACTED]`).
32
+ * 2. Object keys matching the pattern get their values replaced.
33
+ * 3. Arrays are walked element-by-element.
34
+ *
35
+ * Returns a new structure — never mutates the input.
36
+ */
37
+ export declare function redactSecrets(value: unknown): unknown;
38
+ /**
39
+ * Token bucket throttler. Per-package: 100 logs/min sustained with a 500
40
+ * burst. Excess lines are dropped; the first drop in each refill window
41
+ * emits a `[throttled N]` synthetic line so the dev knows messages
42
+ * were lost.
43
+ */
44
+ export interface ThrottleOptions {
45
+ /** Tokens added per second. Default 100/60 = ~1.67. */
46
+ tokensPerSecond?: number;
47
+ /** Bucket capacity. Default 500. */
48
+ bucketCapacity?: number;
49
+ /** Clock override for tests. */
50
+ now?: () => number;
51
+ }
52
+ export declare class MentraJSLogThrottle {
53
+ private readonly tokensPerSecond;
54
+ private readonly bucketCapacity;
55
+ private readonly now;
56
+ private readonly buckets;
57
+ constructor(opts?: ThrottleOptions);
58
+ /**
59
+ * Try to consume one token for the named package. Returns either:
60
+ * - `{allowed: true}` — caller emits the original log line.
61
+ * - `{allowed: false, throttledLine}` — caller may emit the
62
+ * synthetic throttled line (the first drop in each window).
63
+ * If `throttledLine` is undefined the caller drops silently
64
+ * (subsequent drops in the same window).
65
+ */
66
+ consume(packageName: string): {
67
+ allowed: true;
68
+ } | {
69
+ allowed: false;
70
+ throttledLine?: string;
71
+ };
72
+ /** Test/dev — reset all buckets. */
73
+ resetForTests(): void;
74
+ }
75
+ /**
76
+ * In-memory ring buffer holding the last N lines per package. Useful as a
77
+ * "last words" context attached to crash reports.
78
+ */
79
+ export declare class MentraJSLogRingBuffer {
80
+ private readonly capacity;
81
+ private readonly buffers;
82
+ constructor(capacityPerPackage?: number);
83
+ push(packageName: string, line: string): void;
84
+ snapshot(packageName: string): string[];
85
+ clear(packageName: string): void;
86
+ }
87
+ //# sourceMappingURL=MentraJSLogPipeline.d.ts.map