@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.
- package/README.md +79 -0
- package/build/devtools.d.ts +11 -0
- package/build/devtools.d.ts.map +1 -0
- package/build/devtools.js +13 -0
- package/build/devtools.js.map +1 -0
- package/build/engine.d.ts +261 -0
- package/build/engine.d.ts.map +1 -0
- package/build/engine.js +170 -0
- package/build/engine.js.map +1 -0
- package/build/facades/dev.d.ts +58 -0
- package/build/facades/dev.d.ts.map +1 -0
- package/build/facades/dev.js +189 -0
- package/build/facades/dev.js.map +1 -0
- package/build/facades/display.d.ts +21 -0
- package/build/facades/display.d.ts.map +1 -0
- package/build/facades/display.js +17 -0
- package/build/facades/display.js.map +1 -0
- package/build/facades/displayMirror.d.ts +15 -0
- package/build/facades/displayMirror.d.ts.map +1 -0
- package/build/facades/displayMirror.js +29 -0
- package/build/facades/displayMirror.js.map +1 -0
- package/build/facades/gallery.d.ts +62 -0
- package/build/facades/gallery.d.ts.map +1 -0
- package/build/facades/gallery.js +61 -0
- package/build/facades/gallery.js.map +1 -0
- package/build/facades/glasses.d.ts +141 -0
- package/build/facades/glasses.d.ts.map +1 -0
- package/build/facades/glasses.js +199 -0
- package/build/facades/glasses.js.map +1 -0
- package/build/facades/glassesSettings.d.ts +13 -0
- package/build/facades/glassesSettings.d.ts.map +1 -0
- package/build/facades/glassesSettings.js +54 -0
- package/build/facades/glassesSettings.js.map +1 -0
- package/build/facades/glassesWifi.d.ts +25 -0
- package/build/facades/glassesWifi.d.ts.map +1 -0
- package/build/facades/glassesWifi.js +57 -0
- package/build/facades/glassesWifi.js.map +1 -0
- package/build/facades/miniapps.d.ts +43 -0
- package/build/facades/miniapps.d.ts.map +1 -0
- package/build/facades/miniapps.js +49 -0
- package/build/facades/miniapps.js.map +1 -0
- package/build/facades/notifications.d.ts +13 -0
- package/build/facades/notifications.d.ts.map +1 -0
- package/build/facades/notifications.js +12 -0
- package/build/facades/notifications.js.map +1 -0
- package/build/facades/ota.d.ts +103 -0
- package/build/facades/ota.d.ts.map +1 -0
- package/build/facades/ota.js +156 -0
- package/build/facades/ota.js.map +1 -0
- package/build/facades/pairing.d.ts +114 -0
- package/build/facades/pairing.d.ts.map +1 -0
- package/build/facades/pairing.js +275 -0
- package/build/facades/pairing.js.map +1 -0
- package/build/facades/permissions.d.ts +33 -0
- package/build/facades/permissions.d.ts.map +1 -0
- package/build/facades/permissions.js +155 -0
- package/build/facades/permissions.js.map +1 -0
- package/build/facades/phoneNotifications.d.ts +21 -0
- package/build/facades/phoneNotifications.d.ts.map +1 -0
- package/build/facades/phoneNotifications.js +51 -0
- package/build/facades/phoneNotifications.js.map +1 -0
- package/build/facades/reports.d.ts +36 -0
- package/build/facades/reports.d.ts.map +1 -0
- package/build/facades/reports.js +134 -0
- package/build/facades/reports.js.map +1 -0
- package/build/facades/session.d.ts +21 -0
- package/build/facades/session.d.ts.map +1 -0
- package/build/facades/session.js +52 -0
- package/build/facades/session.js.map +1 -0
- package/build/facades/settings.d.ts +37 -0
- package/build/facades/settings.d.ts.map +1 -0
- package/build/facades/settings.js +55 -0
- package/build/facades/settings.js.map +1 -0
- package/build/facades/speech.d.ts +30 -0
- package/build/facades/speech.d.ts.map +1 -0
- package/build/facades/speech.js +37 -0
- package/build/facades/speech.js.map +1 -0
- package/build/index.d.ts +43 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +45 -0
- package/build/index.js.map +1 -0
- package/build/internal.d.ts +67 -0
- package/build/internal.d.ts.map +1 -0
- package/build/internal.js +90 -0
- package/build/internal.js.map +1 -0
- package/build/runtime/bootstrap.d.ts +83 -0
- package/build/runtime/bootstrap.d.ts.map +1 -0
- package/build/runtime/bootstrap.js +56 -0
- package/build/runtime/bootstrap.js.map +1 -0
- package/build/runtime/config.d.ts +146 -0
- package/build/runtime/config.d.ts.map +1 -0
- package/build/runtime/config.js +18 -0
- package/build/runtime/config.js.map +1 -0
- package/build/runtime/streamConfig.d.ts +4 -0
- package/build/runtime/streamConfig.d.ts.map +1 -0
- package/build/runtime/streamConfig.js +38 -0
- package/build/runtime/streamConfig.js.map +1 -0
- package/build/services/AppRegistry.d.ts +269 -0
- package/build/services/AppRegistry.d.ts.map +1 -0
- package/build/services/AppRegistry.js +1079 -0
- package/build/services/AppRegistry.js.map +1 -0
- package/build/services/AudioCloudUplink.d.ts +9 -0
- package/build/services/AudioCloudUplink.d.ts.map +1 -0
- package/build/services/AudioCloudUplink.js +48 -0
- package/build/services/AudioCloudUplink.js.map +1 -0
- package/build/services/AudioPlaybackService.d.ts +175 -0
- package/build/services/AudioPlaybackService.d.ts.map +1 -0
- package/build/services/AudioPlaybackService.js +705 -0
- package/build/services/AudioPlaybackService.js.map +1 -0
- package/build/services/AutomaticReportResult.d.ts +20 -0
- package/build/services/AutomaticReportResult.d.ts.map +1 -0
- package/build/services/AutomaticReportResult.js +29 -0
- package/build/services/AutomaticReportResult.js.map +1 -0
- package/build/services/BlobStore.d.ts +91 -0
- package/build/services/BlobStore.d.ts.map +1 -0
- package/build/services/BlobStore.js +668 -0
- package/build/services/BlobStore.js.map +1 -0
- package/build/services/CaptionsTesterReportService.d.ts +4 -0
- package/build/services/CaptionsTesterReportService.d.ts.map +1 -0
- package/build/services/CaptionsTesterReportService.js +80 -0
- package/build/services/CaptionsTesterReportService.js.map +1 -0
- package/build/services/CloudAudioSubscriptionSync.d.ts +24 -0
- package/build/services/CloudAudioSubscriptionSync.d.ts.map +1 -0
- package/build/services/CloudAudioSubscriptionSync.js +39 -0
- package/build/services/CloudAudioSubscriptionSync.js.map +1 -0
- package/build/services/CloudClientService.d.ts +143 -0
- package/build/services/CloudClientService.d.ts.map +1 -0
- package/build/services/CloudClientService.js +644 -0
- package/build/services/CloudClientService.js.map +1 -0
- package/build/services/CloudTranscriptE2EMetrics.d.ts +4 -0
- package/build/services/CloudTranscriptE2EMetrics.d.ts.map +1 -0
- package/build/services/CloudTranscriptE2EMetrics.js +24 -0
- package/build/services/CloudTranscriptE2EMetrics.js.map +1 -0
- package/build/services/ConnectionCoordinator.d.ts +51 -0
- package/build/services/ConnectionCoordinator.d.ts.map +1 -0
- package/build/services/ConnectionCoordinator.js +34 -0
- package/build/services/ConnectionCoordinator.js.map +1 -0
- package/build/services/DevServerBridge.d.ts +63 -0
- package/build/services/DevServerBridge.d.ts.map +1 -0
- package/build/services/DevServerBridge.js +294 -0
- package/build/services/DevServerBridge.js.map +1 -0
- package/build/services/DeviceEventRouter.d.ts +3 -0
- package/build/services/DeviceEventRouter.d.ts.map +1 -0
- package/build/services/DeviceEventRouter.js +190 -0
- package/build/services/DeviceEventRouter.js.map +1 -0
- package/build/services/DeviceStoreHydration.d.ts +38 -0
- package/build/services/DeviceStoreHydration.d.ts.map +1 -0
- package/build/services/DeviceStoreHydration.js +124 -0
- package/build/services/DeviceStoreHydration.js.map +1 -0
- package/build/services/DisplayProcessor.d.ts +223 -0
- package/build/services/DisplayProcessor.d.ts.map +1 -0
- package/build/services/DisplayProcessor.js +552 -0
- package/build/services/DisplayProcessor.js.map +1 -0
- package/build/services/GlassesReadiness.d.ts +41 -0
- package/build/services/GlassesReadiness.d.ts.map +1 -0
- package/build/services/GlassesReadiness.js +82 -0
- package/build/services/GlassesReadiness.js.map +1 -0
- package/build/services/GlassesSettingsSync.d.ts +33 -0
- package/build/services/GlassesSettingsSync.d.ts.map +1 -0
- package/build/services/GlassesSettingsSync.js +121 -0
- package/build/services/GlassesSettingsSync.js.map +1 -0
- package/build/services/GlassesStatusProjection.d.ts +3 -0
- package/build/services/GlassesStatusProjection.d.ts.map +1 -0
- package/build/services/GlassesStatusProjection.js +65 -0
- package/build/services/GlassesStatusProjection.js.map +1 -0
- package/build/services/HeadingService.d.ts +27 -0
- package/build/services/HeadingService.d.ts.map +1 -0
- package/build/services/HeadingService.js +96 -0
- package/build/services/HeadingService.js.map +1 -0
- package/build/services/LocalDisplayManager.d.ts +139 -0
- package/build/services/LocalDisplayManager.d.ts.map +1 -0
- package/build/services/LocalDisplayManager.js +579 -0
- package/build/services/LocalDisplayManager.js.map +1 -0
- package/build/services/LocalMiniappRuntime.d.ts +439 -0
- package/build/services/LocalMiniappRuntime.d.ts.map +1 -0
- package/build/services/LocalMiniappRuntime.js +3695 -0
- package/build/services/LocalMiniappRuntime.js.map +1 -0
- package/build/services/LocalSttFallbackCoordinator.d.ts +57 -0
- package/build/services/LocalSttFallbackCoordinator.d.ts.map +1 -0
- package/build/services/LocalSttFallbackCoordinator.js +137 -0
- package/build/services/LocalSttFallbackCoordinator.js.map +1 -0
- package/build/services/MentraJSCrashController.d.ts +97 -0
- package/build/services/MentraJSCrashController.d.ts.map +1 -0
- package/build/services/MentraJSCrashController.js +138 -0
- package/build/services/MentraJSCrashController.js.map +1 -0
- package/build/services/MentraJSCrashloopReportService.d.ts +9 -0
- package/build/services/MentraJSCrashloopReportService.d.ts.map +1 -0
- package/build/services/MentraJSCrashloopReportService.js +54 -0
- package/build/services/MentraJSCrashloopReportService.js.map +1 -0
- package/build/services/MentraJSLogPipeline.d.ts +87 -0
- package/build/services/MentraJSLogPipeline.d.ts.map +1 -0
- package/build/services/MentraJSLogPipeline.js +137 -0
- package/build/services/MentraJSLogPipeline.js.map +1 -0
- package/build/services/MentraJSRouter.d.ts +203 -0
- package/build/services/MentraJSRouter.d.ts.map +1 -0
- package/build/services/MentraJSRouter.js +480 -0
- package/build/services/MentraJSRouter.js.map +1 -0
- package/build/services/MentraUIRouter.d.ts +137 -0
- package/build/services/MentraUIRouter.d.ts.map +1 -0
- package/build/services/MentraUIRouter.js +210 -0
- package/build/services/MentraUIRouter.js.map +1 -0
- package/build/services/MicStateCoordinator.d.ts +37 -0
- package/build/services/MicStateCoordinator.d.ts.map +1 -0
- package/build/services/MicStateCoordinator.js +81 -0
- package/build/services/MicStateCoordinator.js.map +1 -0
- package/build/services/MiniappEngine.d.ts +31 -0
- package/build/services/MiniappEngine.d.ts.map +1 -0
- package/build/services/MiniappEngine.js +119 -0
- package/build/services/MiniappEngine.js.map +1 -0
- package/build/services/MiniappLauncher.d.ts +129 -0
- package/build/services/MiniappLauncher.d.ts.map +1 -0
- package/build/services/MiniappLauncher.js +291 -0
- package/build/services/MiniappLauncher.js.map +1 -0
- package/build/services/MiniappRunningRegistry.d.ts +24 -0
- package/build/services/MiniappRunningRegistry.d.ts.map +1 -0
- package/build/services/MiniappRunningRegistry.js +52 -0
- package/build/services/MiniappRunningRegistry.js.map +1 -0
- package/build/services/NativeHttpResponse.d.ts +3 -0
- package/build/services/NativeHttpResponse.d.ts.map +1 -0
- package/build/services/NativeHttpResponse.js +6 -0
- package/build/services/NativeHttpResponse.js.map +1 -0
- package/build/services/NavigationHandlers.d.ts +90 -0
- package/build/services/NavigationHandlers.d.ts.map +1 -0
- package/build/services/NavigationHandlers.js +379 -0
- package/build/services/NavigationHandlers.js.map +1 -0
- package/build/services/NavigationService.d.ts +254 -0
- package/build/services/NavigationService.d.ts.map +1 -0
- package/build/services/NavigationService.js +553 -0
- package/build/services/NavigationService.js.map +1 -0
- package/build/services/NotificationsEmitter.d.ts +28 -0
- package/build/services/NotificationsEmitter.d.ts.map +1 -0
- package/build/services/NotificationsEmitter.js +22 -0
- package/build/services/NotificationsEmitter.js.map +1 -0
- package/build/services/OfflineSpeechModelService.d.ts +33 -0
- package/build/services/OfflineSpeechModelService.d.ts.map +1 -0
- package/build/services/OfflineSpeechModelService.js +136 -0
- package/build/services/OfflineSpeechModelService.js.map +1 -0
- package/build/services/OtaInstallCoordinator.d.ts +195 -0
- package/build/services/OtaInstallCoordinator.d.ts.map +1 -0
- package/build/services/OtaInstallCoordinator.js +1047 -0
- package/build/services/OtaInstallCoordinator.js.map +1 -0
- package/build/services/OtaService.d.ts +3 -0
- package/build/services/OtaService.d.ts.map +1 -0
- package/build/services/OtaService.js +65 -0
- package/build/services/OtaService.js.map +1 -0
- package/build/services/OtaUpdateCheckService.d.ts +65 -0
- package/build/services/OtaUpdateCheckService.d.ts.map +1 -0
- package/build/services/OtaUpdateCheckService.js +260 -0
- package/build/services/OtaUpdateCheckService.js.map +1 -0
- package/build/services/PairingIdentity.d.ts +80 -0
- package/build/services/PairingIdentity.d.ts.map +1 -0
- package/build/services/PairingIdentity.js +145 -0
- package/build/services/PairingIdentity.js.map +1 -0
- package/build/services/PhoneCalendarHelpers.d.ts +32 -0
- package/build/services/PhoneCalendarHelpers.d.ts.map +1 -0
- package/build/services/PhoneCalendarHelpers.js +157 -0
- package/build/services/PhoneCalendarHelpers.js.map +1 -0
- package/build/services/PhoneCalendarService.d.ts +5 -0
- package/build/services/PhoneCalendarService.d.ts.map +1 -0
- package/build/services/PhoneCalendarService.js +24 -0
- package/build/services/PhoneCalendarService.js.map +1 -0
- package/build/services/PhoneCameraFovCoordinator.d.ts +28 -0
- package/build/services/PhoneCameraFovCoordinator.d.ts.map +1 -0
- package/build/services/PhoneCameraFovCoordinator.js +180 -0
- package/build/services/PhoneCameraFovCoordinator.js.map +1 -0
- package/build/services/PhoneLocationService.d.ts +36 -0
- package/build/services/PhoneLocationService.d.ts.map +1 -0
- package/build/services/PhoneLocationService.js +115 -0
- package/build/services/PhoneLocationService.js.map +1 -0
- package/build/services/PhoneNotificationsSync.d.ts +3 -0
- package/build/services/PhoneNotificationsSync.d.ts.map +1 -0
- package/build/services/PhoneNotificationsSync.js +35 -0
- package/build/services/PhoneNotificationsSync.js.map +1 -0
- package/build/services/PhonePhotoCoordinator.d.ts +103 -0
- package/build/services/PhonePhotoCoordinator.d.ts.map +1 -0
- package/build/services/PhonePhotoCoordinator.js +326 -0
- package/build/services/PhonePhotoCoordinator.js.map +1 -0
- package/build/services/PhoneStreamCoordinator.d.ts +168 -0
- package/build/services/PhoneStreamCoordinator.d.ts.map +1 -0
- package/build/services/PhoneStreamCoordinator.js +632 -0
- package/build/services/PhoneStreamCoordinator.js.map +1 -0
- package/build/services/PhoneVideoCoordinator.d.ts +50 -0
- package/build/services/PhoneVideoCoordinator.d.ts.map +1 -0
- package/build/services/PhoneVideoCoordinator.js +147 -0
- package/build/services/PhoneVideoCoordinator.js.map +1 -0
- package/build/services/STTModelManager.d.ts +65 -0
- package/build/services/STTModelManager.d.ts.map +1 -0
- package/build/services/STTModelManager.js +292 -0
- package/build/services/STTModelManager.js.map +1 -0
- package/build/services/SceneRenderer.d.ts +90 -0
- package/build/services/SceneRenderer.d.ts.map +1 -0
- package/build/services/SceneRenderer.js +248 -0
- package/build/services/SceneRenderer.js.map +1 -0
- package/build/services/SentenceTtsPipeline.d.ts +31 -0
- package/build/services/SentenceTtsPipeline.d.ts.map +1 -0
- package/build/services/SentenceTtsPipeline.js +67 -0
- package/build/services/SentenceTtsPipeline.js.map +1 -0
- package/build/services/StreamLifecycleController.d.ts +67 -0
- package/build/services/StreamLifecycleController.d.ts.map +1 -0
- package/build/services/StreamLifecycleController.js +152 -0
- package/build/services/StreamLifecycleController.js.map +1 -0
- package/build/services/TTSModelManager.d.ts +90 -0
- package/build/services/TTSModelManager.d.ts.map +1 -0
- package/build/services/TTSModelManager.js +366 -0
- package/build/services/TTSModelManager.js.map +1 -0
- package/build/services/TranscriptionRouting.d.ts +12 -0
- package/build/services/TranscriptionRouting.d.ts.map +1 -0
- package/build/services/TranscriptionRouting.js +24 -0
- package/build/services/TranscriptionRouting.js.map +1 -0
- package/build/services/WebviewBridge.d.ts +22 -0
- package/build/services/WebviewBridge.d.ts.map +1 -0
- package/build/services/WebviewBridge.js +47 -0
- package/build/services/WebviewBridge.js.map +1 -0
- package/build/services/asg/GalleryMediaIntegrityReportService.d.ts +17 -0
- package/build/services/asg/GalleryMediaIntegrityReportService.d.ts.map +1 -0
- package/build/services/asg/GalleryMediaIntegrityReportService.js +43 -0
- package/build/services/asg/GalleryMediaIntegrityReportService.js.map +1 -0
- package/build/services/asg/asgCameraApi.d.ts +205 -0
- package/build/services/asg/asgCameraApi.d.ts.map +1 -0
- package/build/services/asg/asgCameraApi.js +1410 -0
- package/build/services/asg/asgCameraApi.js.map +1 -0
- package/build/services/asg/cameraRollExportCoordinator.d.ts +60 -0
- package/build/services/asg/cameraRollExportCoordinator.d.ts.map +1 -0
- package/build/services/asg/cameraRollExportCoordinator.js +618 -0
- package/build/services/asg/cameraRollExportCoordinator.js.map +1 -0
- package/build/services/asg/cameraRollExportLedger.d.ts +44 -0
- package/build/services/asg/cameraRollExportLedger.d.ts.map +1 -0
- package/build/services/asg/cameraRollExportLedger.js +78 -0
- package/build/services/asg/cameraRollExportLedger.js.map +1 -0
- package/build/services/asg/galleryMediaValidation.d.ts +29 -0
- package/build/services/asg/galleryMediaValidation.d.ts.map +1 -0
- package/build/services/asg/galleryMediaValidation.js +149 -0
- package/build/services/asg/galleryMediaValidation.js.map +1 -0
- package/build/services/asg/galleryNotices.d.ts +33 -0
- package/build/services/asg/galleryNotices.d.ts.map +1 -0
- package/build/services/asg/galleryNotices.js +29 -0
- package/build/services/asg/galleryNotices.js.map +1 -0
- package/build/services/asg/galleryPathMigration.d.ts +3 -0
- package/build/services/asg/galleryPathMigration.d.ts.map +1 -0
- package/build/services/asg/galleryPathMigration.js +26 -0
- package/build/services/asg/galleryPathMigration.js.map +1 -0
- package/build/services/asg/gallerySettingsService.d.ts +20 -0
- package/build/services/asg/gallerySettingsService.d.ts.map +1 -0
- package/build/services/asg/gallerySettingsService.js +53 -0
- package/build/services/asg/gallerySettingsService.js.map +1 -0
- package/build/services/asg/gallerySyncNotifications.d.ts +56 -0
- package/build/services/asg/gallerySyncNotifications.d.ts.map +1 -0
- package/build/services/asg/gallerySyncNotifications.js +198 -0
- package/build/services/asg/gallerySyncNotifications.js.map +1 -0
- package/build/services/asg/gallerySyncService.d.ts +137 -0
- package/build/services/asg/gallerySyncService.d.ts.map +1 -0
- package/build/services/asg/gallerySyncService.js +1933 -0
- package/build/services/asg/gallerySyncService.js.map +1 -0
- package/build/services/asg/galleryTransferLedger.d.ts +58 -0
- package/build/services/asg/galleryTransferLedger.d.ts.map +1 -0
- package/build/services/asg/galleryTransferLedger.js +225 -0
- package/build/services/asg/galleryTransferLedger.js.map +1 -0
- package/build/services/asg/localNetworkTransport.d.ts +15 -0
- package/build/services/asg/localNetworkTransport.d.ts.map +1 -0
- package/build/services/asg/localNetworkTransport.js +144 -0
- package/build/services/asg/localNetworkTransport.js.map +1 -0
- package/build/services/asg/localStorageService.d.ts +146 -0
- package/build/services/asg/localStorageService.d.ts.map +1 -0
- package/build/services/asg/localStorageService.js +572 -0
- package/build/services/asg/localStorageService.js.map +1 -0
- package/build/services/asg/mediaProcessingQueue.d.ts +70 -0
- package/build/services/asg/mediaProcessingQueue.d.ts.map +1 -0
- package/build/services/asg/mediaProcessingQueue.js +451 -0
- package/build/services/asg/mediaProcessingQueue.js.map +1 -0
- package/build/services/asgOtaVersionUrl.d.ts +2 -0
- package/build/services/asgOtaVersionUrl.d.ts.map +1 -0
- package/build/services/asgOtaVersionUrl.js +36 -0
- package/build/services/asgOtaVersionUrl.js.map +1 -0
- package/build/services/blobPaths.d.ts +31 -0
- package/build/services/blobPaths.d.ts.map +1 -0
- package/build/services/blobPaths.js +86 -0
- package/build/services/blobPaths.js.map +1 -0
- package/build/services/cloudStreamApi.d.ts +59 -0
- package/build/services/cloudStreamApi.d.ts.map +1 -0
- package/build/services/cloudStreamApi.js +81 -0
- package/build/services/cloudStreamApi.js.map +1 -0
- package/build/services/gallerySyncClock.d.ts +17 -0
- package/build/services/gallerySyncClock.d.ts.map +1 -0
- package/build/services/gallerySyncClock.js +21 -0
- package/build/services/gallerySyncClock.js.map +1 -0
- package/build/services/glassesClockSync.d.ts +20 -0
- package/build/services/glassesClockSync.d.ts.map +1 -0
- package/build/services/glassesClockSync.js +97 -0
- package/build/services/glassesClockSync.js.map +1 -0
- package/build/services/manifestVersionGate.d.ts +28 -0
- package/build/services/manifestVersionGate.d.ts.map +1 -0
- package/build/services/manifestVersionGate.js +41 -0
- package/build/services/manifestVersionGate.js.map +1 -0
- package/build/services/mentraUiShim.d.ts +38 -0
- package/build/services/mentraUiShim.d.ts.map +1 -0
- package/build/services/mentraUiShim.js +360 -0
- package/build/services/mentraUiShim.js.map +1 -0
- package/build/services/navigation/roadNameResolver.d.ts +67 -0
- package/build/services/navigation/roadNameResolver.d.ts.map +1 -0
- package/build/services/navigation/roadNameResolver.js +96 -0
- package/build/services/navigation/roadNameResolver.js.map +1 -0
- package/build/services/navigation/routesApiCodec.d.ts +38 -0
- package/build/services/navigation/routesApiCodec.d.ts.map +1 -0
- package/build/services/navigation/routesApiCodec.js +68 -0
- package/build/services/navigation/routesApiCodec.js.map +1 -0
- package/build/services/otaDisplayState.d.ts +42 -0
- package/build/services/otaDisplayState.d.ts.map +1 -0
- package/build/services/otaDisplayState.js +92 -0
- package/build/services/otaDisplayState.js.map +1 -0
- package/build/services/otaInstallPolicy.d.ts +81 -0
- package/build/services/otaInstallPolicy.d.ts.map +1 -0
- package/build/services/otaInstallPolicy.js +96 -0
- package/build/services/otaInstallPolicy.js.map +1 -0
- package/build/services/otaLegacyMapping.d.ts +22 -0
- package/build/services/otaLegacyMapping.d.ts.map +1 -0
- package/build/services/otaLegacyMapping.js +56 -0
- package/build/services/otaLegacyMapping.js.map +1 -0
- package/build/services/slimStreamStatus.d.ts +7 -0
- package/build/services/slimStreamStatus.d.ts.map +1 -0
- package/build/services/slimStreamStatus.js +26 -0
- package/build/services/slimStreamStatus.js.map +1 -0
- package/build/stores/apps.d.ts +104 -0
- package/build/stores/apps.d.ts.map +1 -0
- package/build/stores/apps.js +492 -0
- package/build/stores/apps.js.map +1 -0
- package/build/stores/bluetoothSettingKeys.d.ts +4 -0
- package/build/stores/bluetoothSettingKeys.d.ts.map +1 -0
- package/build/stores/bluetoothSettingKeys.js +31 -0
- package/build/stores/bluetoothSettingKeys.js.map +1 -0
- package/build/stores/cloudClientStatus.d.ts +9 -0
- package/build/stores/cloudClientStatus.d.ts.map +1 -0
- package/build/stores/cloudClientStatus.js +24 -0
- package/build/stores/cloudClientStatus.js.map +1 -0
- package/build/stores/connection.d.ts +22 -0
- package/build/stores/connection.d.ts.map +1 -0
- package/build/stores/connection.js +43 -0
- package/build/stores/connection.js.map +1 -0
- package/build/stores/core.d.ts +15 -0
- package/build/stores/core.d.ts.map +1 -0
- package/build/stores/core.js +21 -0
- package/build/stores/core.js.map +1 -0
- package/build/stores/display.d.ts +24 -0
- package/build/stores/display.d.ts.map +1 -0
- package/build/stores/display.js +96 -0
- package/build/stores/display.js.map +1 -0
- package/build/stores/gallerySync.d.ts +101 -0
- package/build/stores/gallerySync.d.ts.map +1 -0
- package/build/stores/gallerySync.js +217 -0
- package/build/stores/gallerySync.js.map +1 -0
- package/build/stores/glasses.d.ts +62 -0
- package/build/stores/glasses.d.ts.map +1 -0
- package/build/stores/glasses.js +203 -0
- package/build/stores/glasses.js.map +1 -0
- package/build/stores/settings.d.ts +37 -0
- package/build/stores/settings.d.ts.map +1 -0
- package/build/stores/settings.js +922 -0
- package/build/stores/settings.js.map +1 -0
- package/build/types/applet.d.ts +96 -0
- package/build/types/applet.d.ts.map +1 -0
- package/build/types/applet.js +5 -0
- package/build/types/applet.js.map +1 -0
- package/build/types/asg.d.ts +53 -0
- package/build/types/asg.d.ts.map +1 -0
- package/build/types/asg.js +2 -0
- package/build/types/asg.js.map +1 -0
- package/build/types/capabilities/even-realities-g1.d.ts +12 -0
- package/build/types/capabilities/even-realities-g1.d.ts.map +1 -0
- package/build/types/capabilities/even-realities-g1.js +55 -0
- package/build/types/capabilities/even-realities-g1.js.map +1 -0
- package/build/types/capabilities/even-realities-g2.d.ts +12 -0
- package/build/types/capabilities/even-realities-g2.d.ts.map +1 -0
- package/build/types/capabilities/even-realities-g2.js +75 -0
- package/build/types/capabilities/even-realities-g2.js.map +1 -0
- package/build/types/capabilities/mentra-display.d.ts +12 -0
- package/build/types/capabilities/mentra-display.d.ts.map +1 -0
- package/build/types/capabilities/mentra-display.js +63 -0
- package/build/types/capabilities/mentra-display.js.map +1 -0
- package/build/types/capabilities/mentra-live.d.ts +12 -0
- package/build/types/capabilities/mentra-live.d.ts.map +1 -0
- package/build/types/capabilities/mentra-live.js +92 -0
- package/build/types/capabilities/mentra-live.js.map +1 -0
- package/build/types/capabilities/none.d.ts +13 -0
- package/build/types/capabilities/none.d.ts.map +1 -0
- package/build/types/capabilities/none.js +65 -0
- package/build/types/capabilities/none.js.map +1 -0
- package/build/types/capabilities/simulated-glasses.d.ts +13 -0
- package/build/types/capabilities/simulated-glasses.d.ts.map +1 -0
- package/build/types/capabilities/simulated-glasses.js +65 -0
- package/build/types/capabilities/simulated-glasses.js.map +1 -0
- package/build/types/capabilities/vuzix-z100.d.ts +12 -0
- package/build/types/capabilities/vuzix-z100.d.ts.map +1 -0
- package/build/types/capabilities/vuzix-z100.js +52 -0
- package/build/types/capabilities/vuzix-z100.js.map +1 -0
- package/build/types/enums.d.ts +40 -0
- package/build/types/enums.d.ts.map +1 -0
- package/build/types/enums.js +44 -0
- package/build/types/enums.js.map +1 -0
- package/build/types/hardware.d.ts +160 -0
- package/build/types/hardware.d.ts.map +1 -0
- package/build/types/hardware.js +36 -0
- package/build/types/hardware.js.map +1 -0
- package/build/types/index.d.ts +11 -0
- package/build/types/index.d.ts.map +1 -0
- package/build/types/index.js +10 -0
- package/build/types/index.js.map +1 -0
- package/build/utils/GlobalEventEmitter.d.ts +10 -0
- package/build/utils/GlobalEventEmitter.d.ts.map +1 -0
- package/build/utils/GlobalEventEmitter.js +13 -0
- package/build/utils/GlobalEventEmitter.js.map +1 -0
- package/build/utils/cloudClient/RnUdpAdapter.d.ts +3 -0
- package/build/utils/cloudClient/RnUdpAdapter.d.ts.map +1 -0
- package/build/utils/cloudClient/RnUdpAdapter.js +41 -0
- package/build/utils/cloudClient/RnUdpAdapter.js.map +1 -0
- package/build/utils/cloudClient/cloudSecureStore.d.ts +3 -0
- package/build/utils/cloudClient/cloudSecureStore.d.ts.map +1 -0
- package/build/utils/cloudClient/cloudSecureStore.js +26 -0
- package/build/utils/cloudClient/cloudSecureStore.js.map +1 -0
- package/build/utils/debouncedPatch.d.ts +6 -0
- package/build/utils/debouncedPatch.d.ts.map +1 -0
- package/build/utils/debouncedPatch.js +25 -0
- package/build/utils/debouncedPatch.js.map +1 -0
- package/build/utils/devLogging.d.ts +26 -0
- package/build/utils/devLogging.d.ts.map +1 -0
- package/build/utils/devLogging.js +116 -0
- package/build/utils/devLogging.js.map +1 -0
- package/build/utils/devMiniappLaunch.d.ts +44 -0
- package/build/utils/devMiniappLaunch.d.ts.map +1 -0
- package/build/utils/devMiniappLaunch.js +52 -0
- package/build/utils/devMiniappLaunch.js.map +1 -0
- package/build/utils/diagnosticContext.d.ts +3 -0
- package/build/utils/diagnosticContext.d.ts.map +1 -0
- package/build/utils/diagnosticContext.js +119 -0
- package/build/utils/diagnosticContext.js.map +1 -0
- package/build/utils/display/composer/ColumnComposer.d.ts +131 -0
- package/build/utils/display/composer/ColumnComposer.d.ts.map +1 -0
- package/build/utils/display/composer/ColumnComposer.js +204 -0
- package/build/utils/display/composer/ColumnComposer.js.map +1 -0
- package/build/utils/display/composer/index.d.ts +9 -0
- package/build/utils/display/composer/index.d.ts.map +1 -0
- package/build/utils/display/composer/index.js +9 -0
- package/build/utils/display/composer/index.js.map +1 -0
- package/build/utils/display/helpers/DisplayHelpers.d.ts +165 -0
- package/build/utils/display/helpers/DisplayHelpers.d.ts.map +1 -0
- package/build/utils/display/helpers/DisplayHelpers.js +312 -0
- package/build/utils/display/helpers/DisplayHelpers.js.map +1 -0
- package/build/utils/display/helpers/ScrollView.d.ts +183 -0
- package/build/utils/display/helpers/ScrollView.d.ts.map +1 -0
- package/build/utils/display/helpers/ScrollView.js +257 -0
- package/build/utils/display/helpers/ScrollView.js.map +1 -0
- package/build/utils/display/helpers/index.d.ts +11 -0
- package/build/utils/display/helpers/index.d.ts.map +1 -0
- package/build/utils/display/helpers/index.js +10 -0
- package/build/utils/display/helpers/index.js.map +1 -0
- package/build/utils/display/index.d.ts +174 -0
- package/build/utils/display/index.d.ts.map +1 -0
- package/build/utils/display/index.js +185 -0
- package/build/utils/display/index.js.map +1 -0
- package/build/utils/display/measurer/TextMeasurer.d.ts +160 -0
- package/build/utils/display/measurer/TextMeasurer.d.ts.map +1 -0
- package/build/utils/display/measurer/TextMeasurer.js +273 -0
- package/build/utils/display/measurer/TextMeasurer.js.map +1 -0
- package/build/utils/display/measurer/index.d.ts +10 -0
- package/build/utils/display/measurer/index.d.ts.map +1 -0
- package/build/utils/display/measurer/index.js +11 -0
- package/build/utils/display/measurer/index.js.map +1 -0
- package/build/utils/display/measurer/script-detection.d.ts +53 -0
- package/build/utils/display/measurer/script-detection.d.ts.map +1 -0
- package/build/utils/display/measurer/script-detection.js +184 -0
- package/build/utils/display/measurer/script-detection.js.map +1 -0
- package/build/utils/display/profiles/g1.d.ts +33 -0
- package/build/utils/display/profiles/g1.d.ts.map +1 -0
- package/build/utils/display/profiles/g1.js +213 -0
- package/build/utils/display/profiles/g1.js.map +1 -0
- package/build/utils/display/profiles/g2.d.ts +13 -0
- package/build/utils/display/profiles/g2.d.ts.map +1 -0
- package/build/utils/display/profiles/g2.js +34 -0
- package/build/utils/display/profiles/g2.js.map +1 -0
- package/build/utils/display/profiles/index.d.ts +12 -0
- package/build/utils/display/profiles/index.d.ts.map +1 -0
- package/build/utils/display/profiles/index.js +15 -0
- package/build/utils/display/profiles/index.js.map +1 -0
- package/build/utils/display/profiles/nex.d.ts +10 -0
- package/build/utils/display/profiles/nex.d.ts.map +1 -0
- package/build/utils/display/profiles/nex.js +150 -0
- package/build/utils/display/profiles/nex.js.map +1 -0
- package/build/utils/display/profiles/types.d.ts +103 -0
- package/build/utils/display/profiles/types.d.ts.map +1 -0
- package/build/utils/display/profiles/types.js +2 -0
- package/build/utils/display/profiles/types.js.map +1 -0
- package/build/utils/display/profiles/z100.d.ts +33 -0
- package/build/utils/display/profiles/z100.d.ts.map +1 -0
- package/build/utils/display/profiles/z100.js +182 -0
- package/build/utils/display/profiles/z100.js.map +1 -0
- package/build/utils/display/scene/degrade.d.ts +25 -0
- package/build/utils/display/scene/degrade.d.ts.map +1 -0
- package/build/utils/display/scene/degrade.js +64 -0
- package/build/utils/display/scene/degrade.js.map +1 -0
- package/build/utils/display/scene/differ.d.ts +38 -0
- package/build/utils/display/scene/differ.d.ts.map +1 -0
- package/build/utils/display/scene/differ.js +107 -0
- package/build/utils/display/scene/differ.js.map +1 -0
- package/build/utils/display/scene/index.d.ts +10 -0
- package/build/utils/display/scene/index.d.ts.map +1 -0
- package/build/utils/display/scene/index.js +6 -0
- package/build/utils/display/scene/index.js.map +1 -0
- package/build/utils/display/scene/process.d.ts +35 -0
- package/build/utils/display/scene/process.d.ts.map +1 -0
- package/build/utils/display/scene/process.js +187 -0
- package/build/utils/display/scene/process.js.map +1 -0
- package/build/utils/display/scene/store.d.ts +48 -0
- package/build/utils/display/scene/store.d.ts.map +1 -0
- package/build/utils/display/scene/store.js +0 -0
- package/build/utils/display/scene/store.js.map +1 -0
- package/build/utils/display/scene/types.d.ts +120 -0
- package/build/utils/display/scene/types.d.ts.map +1 -0
- package/build/utils/display/scene/types.js +0 -0
- package/build/utils/display/scene/types.js.map +1 -0
- package/build/utils/display/wrapper/TextWrapper.d.ts +102 -0
- package/build/utils/display/wrapper/TextWrapper.d.ts.map +1 -0
- package/build/utils/display/wrapper/TextWrapper.js +471 -0
- package/build/utils/display/wrapper/TextWrapper.js.map +1 -0
- package/build/utils/display/wrapper/index.d.ts +12 -0
- package/build/utils/display/wrapper/index.d.ts.map +1 -0
- package/build/utils/display/wrapper/index.js +12 -0
- package/build/utils/display/wrapper/index.js.map +1 -0
- package/build/utils/display/wrapper/types.d.ts +75 -0
- package/build/utils/display/wrapper/types.d.ts.map +1 -0
- package/build/utils/display/wrapper/types.js +11 -0
- package/build/utils/display/wrapper/types.js.map +1 -0
- package/build/utils/e2eMetrics.d.ts +6 -0
- package/build/utils/e2eMetrics.d.ts.map +1 -0
- package/build/utils/e2eMetrics.js +27 -0
- package/build/utils/e2eMetrics.js.map +1 -0
- package/build/utils/hardware/hardware.d.ts +42 -0
- package/build/utils/hardware/hardware.d.ts.map +1 -0
- package/build/utils/hardware/hardware.js +127 -0
- package/build/utils/hardware/hardware.js.map +1 -0
- package/build/utils/hardware/index.d.ts +2 -0
- package/build/utils/hardware/index.d.ts.map +1 -0
- package/build/utils/hardware/index.js +2 -0
- package/build/utils/hardware/index.js.map +1 -0
- package/build/utils/miniappGlobals.d.ts +60 -0
- package/build/utils/miniappGlobals.d.ts.map +1 -0
- package/build/utils/miniappGlobals.js +224 -0
- package/build/utils/miniappGlobals.js.map +1 -0
- package/build/utils/permissions/MediaLibraryPermissions.d.ts +45 -0
- package/build/utils/permissions/MediaLibraryPermissions.d.ts.map +1 -0
- package/build/utils/permissions/MediaLibraryPermissions.js +145 -0
- package/build/utils/permissions/MediaLibraryPermissions.js.map +1 -0
- package/build/utils/permissions/galleryDisplayName.d.ts +8 -0
- package/build/utils/permissions/galleryDisplayName.d.ts.map +1 -0
- package/build/utils/permissions/galleryDisplayName.js +25 -0
- package/build/utils/permissions/galleryDisplayName.js.map +1 -0
- package/build/utils/storage/index.d.ts +3 -0
- package/build/utils/storage/index.d.ts.map +1 -0
- package/build/utils/storage/index.js +3 -0
- package/build/utils/storage/index.js.map +1 -0
- package/build/utils/storage/storage.d.ts +24 -0
- package/build/utils/storage/storage.d.ts.map +1 -0
- package/build/utils/storage/storage.js +85 -0
- package/build/utils/storage/storage.js.map +1 -0
- package/build/utils/storage/zip.d.ts +3 -0
- package/build/utils/storage/zip.d.ts.map +1 -0
- package/build/utils/storage/zip.js +14 -0
- package/build/utils/storage/zip.js.map +1 -0
- package/build/utils/timers/index.d.ts +3 -0
- package/build/utils/timers/index.d.ts.map +1 -0
- package/build/utils/timers/index.js +3 -0
- package/build/utils/timers/index.js.map +1 -0
- package/build/utils/timers/timers.d.ts +9 -0
- package/build/utils/timers/timers.d.ts.map +1 -0
- package/build/utils/timers/timers.js +105 -0
- package/build/utils/timers/timers.js.map +1 -0
- package/package.json +120 -0
- package/src/devtools.ts +13 -0
- package/src/engine.ts +173 -0
- package/src/facades/dev.ts +198 -0
- package/src/facades/display.ts +17 -0
- package/src/facades/displayMirror.ts +33 -0
- package/src/facades/gallery.ts +69 -0
- package/src/facades/glasses.ts +206 -0
- package/src/facades/glassesSettings.ts +56 -0
- package/src/facades/glassesWifi.ts +68 -0
- package/src/facades/miniapps.ts +55 -0
- package/src/facades/notifications.ts +15 -0
- package/src/facades/ota.ts +174 -0
- package/src/facades/pairing.ts +329 -0
- package/src/facades/permissions.ts +165 -0
- package/src/facades/phoneNotifications.ts +50 -0
- package/src/facades/reports.ts +185 -0
- package/src/facades/session.ts +55 -0
- package/src/facades/settings.ts +57 -0
- package/src/facades/speech.ts +38 -0
- package/src/index.ts +191 -0
- package/src/internal.ts +159 -0
- package/src/runtime/bootstrap.ts +118 -0
- package/src/runtime/config.ts +147 -0
- package/src/runtime/streamConfig.ts +34 -0
- package/src/services/AppRegistry.ts +1190 -0
- package/src/services/AudioCloudUplink.ts +50 -0
- package/src/services/AudioPlaybackService.ts +813 -0
- package/src/services/AutomaticReportResult.ts +48 -0
- package/src/services/BlobStore.ts +746 -0
- package/src/services/CaptionsTesterReportService.ts +107 -0
- package/src/services/CloudAudioSubscriptionSync.ts +41 -0
- package/src/services/CloudClientService.ts +689 -0
- package/src/services/CloudTranscriptE2EMetrics.ts +27 -0
- package/src/services/ConnectionCoordinator.ts +65 -0
- package/src/services/DevServerBridge.ts +332 -0
- package/src/services/DeviceEventRouter.ts +238 -0
- package/src/services/DeviceStoreHydration.ts +130 -0
- package/src/services/DisplayProcessor.ts +775 -0
- package/src/services/GlassesReadiness.ts +103 -0
- package/src/services/GlassesSettingsSync.ts +134 -0
- package/src/services/GlassesStatusProjection.ts +73 -0
- package/src/services/HeadingService.ts +98 -0
- package/src/services/LocalDisplayManager.ts +703 -0
- package/src/services/LocalMiniappRuntime.ts +4213 -0
- package/src/services/LocalSttFallbackCoordinator.ts +147 -0
- package/src/services/MentraJSCrashController.ts +189 -0
- package/src/services/MentraJSCrashloopReportService.ts +66 -0
- package/src/services/MentraJSLogPipeline.ts +166 -0
- package/src/services/MentraJSRouter.ts +557 -0
- package/src/services/MentraUIRouter.ts +244 -0
- package/src/services/MicStateCoordinator.ts +94 -0
- package/src/services/MiniappEngine.ts +143 -0
- package/src/services/MiniappLauncher.ts +340 -0
- package/src/services/MiniappRunningRegistry.ts +57 -0
- package/src/services/NativeHttpResponse.ts +6 -0
- package/src/services/NavigationHandlers.ts +423 -0
- package/src/services/NavigationService.ts +731 -0
- package/src/services/NotificationsEmitter.ts +48 -0
- package/src/services/OfflineSpeechModelService.ts +168 -0
- package/src/services/OtaInstallCoordinator.ts +1205 -0
- package/src/services/OtaService.ts +83 -0
- package/src/services/OtaUpdateCheckService.ts +386 -0
- package/src/services/PairingIdentity.ts +154 -0
- package/src/services/PhoneCalendarHelpers.ts +212 -0
- package/src/services/PhoneCalendarService.ts +42 -0
- package/src/services/PhoneCameraFovCoordinator.ts +195 -0
- package/src/services/PhoneLocationService.ts +122 -0
- package/src/services/PhoneNotificationsSync.ts +44 -0
- package/src/services/PhonePhotoCoordinator.ts +409 -0
- package/src/services/PhoneStreamCoordinator.ts +777 -0
- package/src/services/PhoneVideoCoordinator.ts +189 -0
- package/src/services/STTModelManager.ts +360 -0
- package/src/services/SceneRenderer.ts +292 -0
- package/src/services/SentenceTtsPipeline.ts +106 -0
- package/src/services/StreamLifecycleController.ts +213 -0
- package/src/services/TTSModelManager.ts +466 -0
- package/src/services/TranscriptionRouting.ts +37 -0
- package/src/services/WebviewBridge.ts +50 -0
- package/src/services/asg/GalleryMediaIntegrityReportService.ts +70 -0
- package/src/services/asg/asgCameraApi.ts +1695 -0
- package/src/services/asg/cameraRollExportCoordinator.ts +627 -0
- package/src/services/asg/cameraRollExportLedger.ts +122 -0
- package/src/services/asg/galleryMediaValidation.ts +183 -0
- package/src/services/asg/galleryNotices.ts +61 -0
- package/src/services/asg/galleryPathMigration.ts +22 -0
- package/src/services/asg/gallerySettingsService.ts +68 -0
- package/src/services/asg/gallerySyncNotifications.ts +236 -0
- package/src/services/asg/gallerySyncService.ts +2269 -0
- package/src/services/asg/galleryTransferLedger.ts +312 -0
- package/src/services/asg/localNetworkTransport.ts +173 -0
- package/src/services/asg/localStorageService.ts +652 -0
- package/src/services/asg/mediaProcessingQueue.ts +518 -0
- package/src/services/asgOtaVersionUrl.ts +41 -0
- package/src/services/blobPaths.ts +86 -0
- package/src/services/cloudStreamApi.ts +154 -0
- package/src/services/gallerySyncClock.ts +39 -0
- package/src/services/glassesClockSync.ts +115 -0
- package/src/services/manifestVersionGate.ts +43 -0
- package/src/services/mentraUiShim.ts +366 -0
- package/src/services/navigation/roadNameResolver.ts +112 -0
- package/src/services/navigation/routesApiCodec.ts +69 -0
- package/src/services/otaDisplayState.ts +115 -0
- package/src/services/otaInstallPolicy.ts +106 -0
- package/src/services/otaLegacyMapping.ts +71 -0
- package/src/services/slimStreamStatus.ts +28 -0
- package/src/stores/apps.ts +614 -0
- package/src/stores/bluetoothSettingKeys.ts +36 -0
- package/src/stores/cloudClientStatus.ts +37 -0
- package/src/stores/connection.ts +69 -0
- package/src/stores/core.ts +32 -0
- package/src/stores/display.ts +121 -0
- package/src/stores/gallerySync.ts +380 -0
- package/src/stores/glasses.ts +309 -0
- package/src/stores/settings.ts +1001 -0
- package/src/types/applet.ts +112 -0
- package/src/types/asg.ts +58 -0
- package/src/types/capabilities/even-realities-g1.ts +67 -0
- package/src/types/capabilities/even-realities-g2.ts +88 -0
- package/src/types/capabilities/mentra-display.ts +75 -0
- package/src/types/capabilities/mentra-live.ts +103 -0
- package/src/types/capabilities/none.ts +76 -0
- package/src/types/capabilities/simulated-glasses.ts +76 -0
- package/src/types/capabilities/vuzix-z100.ts +64 -0
- package/src/types/enums.ts +43 -0
- package/src/types/hardware.ts +203 -0
- package/src/types/index.ts +37 -0
- package/src/utils/GlobalEventEmitter.ts +14 -0
- package/src/utils/cloudClient/RnUdpAdapter.ts +47 -0
- package/src/utils/cloudClient/cloudSecureStore.ts +28 -0
- package/src/utils/debouncedPatch.ts +28 -0
- package/src/utils/devLogging.ts +140 -0
- package/src/utils/devMiniappLaunch.ts +68 -0
- package/src/utils/diagnosticContext.ts +155 -0
- package/src/utils/display/composer/ColumnComposer.ts +285 -0
- package/src/utils/display/composer/index.ts +15 -0
- package/src/utils/display/helpers/DisplayHelpers.ts +413 -0
- package/src/utils/display/helpers/ScrollView.ts +337 -0
- package/src/utils/display/helpers/index.ts +14 -0
- package/src/utils/display/index.ts +273 -0
- package/src/utils/display/measurer/TextMeasurer.ts +346 -0
- package/src/utils/display/measurer/index.ts +21 -0
- package/src/utils/display/measurer/script-detection.ts +218 -0
- package/src/utils/display/profiles/g1.ts +236 -0
- package/src/utils/display/profiles/g2.ts +39 -0
- package/src/utils/display/profiles/index.ts +28 -0
- package/src/utils/display/profiles/nex.ts +166 -0
- package/src/utils/display/profiles/types.ts +132 -0
- package/src/utils/display/profiles/z100.ts +198 -0
- package/src/utils/display/scene/degrade.ts +80 -0
- package/src/utils/display/scene/differ.ts +128 -0
- package/src/utils/display/scene/index.ts +21 -0
- package/src/utils/display/scene/process.ts +214 -0
- package/src/utils/display/scene/store.ts +0 -0
- package/src/utils/display/scene/types.ts +0 -0
- package/src/utils/display/wrapper/TextWrapper.ts +546 -0
- package/src/utils/display/wrapper/index.ts +15 -0
- package/src/utils/display/wrapper/types.ts +102 -0
- package/src/utils/e2eMetrics.ts +30 -0
- package/src/utils/hardware/hardware.ts +166 -0
- package/src/utils/hardware/index.ts +1 -0
- package/src/utils/miniappGlobals.ts +260 -0
- package/src/utils/permissions/MediaLibraryPermissions.ts +161 -0
- package/src/utils/permissions/galleryDisplayName.ts +28 -0
- package/src/utils/storage/index.ts +2 -0
- package/src/utils/storage/storage.ts +101 -0
- package/src/utils/storage/zip.ts +13 -0
- package/src/utils/timers/index.ts +2 -0
- package/src/utils/timers/timers.ts +139 -0
|
@@ -0,0 +1,147 @@
|
|
|
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
|
+
/**
|
|
8
|
+
* Decides whether on-device Sherpa STT should produce transcripts for local
|
|
9
|
+
* miniapps, instead of (or in addition to) cloud transcription. Local STT is
|
|
10
|
+
* active when the cloud is unavailable or any subscription requires
|
|
11
|
+
* `forceLocal`.
|
|
12
|
+
*
|
|
13
|
+
* Activation flips `localSttFallbackActive` in the settings store, which
|
|
14
|
+
* the bluetooth-sdk native side reads to decide whether to feed PCM into
|
|
15
|
+
* the SherpaOnnxTranscriber. Local transcripts then flow back through the
|
|
16
|
+
* `local_transcription` Bridge event; the host wires that event to
|
|
17
|
+
* `localMiniappRuntime.forwardEvent`, with this coordinator providing the
|
|
18
|
+
* subscription-active gate so we never publish transcripts to miniapps that
|
|
19
|
+
* aren't asking for them. LocalMiniappRuntime filters mixed local/cloud
|
|
20
|
+
* delivery per miniapp.
|
|
21
|
+
*/
|
|
22
|
+
class LocalSttFallbackCoordinator {
|
|
23
|
+
private static instance: LocalSttFallbackCoordinator
|
|
24
|
+
|
|
25
|
+
private hasTranscriptionSubscription = false
|
|
26
|
+
private hasForceLocalSubscription = false
|
|
27
|
+
private activeLanguage: string | null = null
|
|
28
|
+
/**
|
|
29
|
+
* Default to "cloud is up" so we never accidentally activate local STT before
|
|
30
|
+
* the cloud client has had a chance to start. We attach lazily on the first
|
|
31
|
+
* subscription/reconcile pass; once attached, this field reflects the real
|
|
32
|
+
* cloud-client runtime status.
|
|
33
|
+
*/
|
|
34
|
+
private cloudConnected = true
|
|
35
|
+
private localActive = false
|
|
36
|
+
private cloudAdapterAttached = false
|
|
37
|
+
|
|
38
|
+
private constructor() {
|
|
39
|
+
// Reset the persisted mirror flag on boot — the in-memory state in this
|
|
40
|
+
// coordinator is the source of truth, and a stale "true" left from the
|
|
41
|
+
// previous session would cause native to feed Sherpa before any miniapp
|
|
42
|
+
// registered a subscription.
|
|
43
|
+
useSettingsStore.getState().setSetting(ISLAND_SETTINGS_KEYS.localSttFallbackActive, false)
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Lazy-attach the engine cloud connection listener. The coordinator is
|
|
48
|
+
* constructed at module load, before engine.start() brings up the cloud
|
|
49
|
+
* client, so we defer until the first reconcile.
|
|
50
|
+
*/
|
|
51
|
+
private attachCloudAdapterIfReady(): void {
|
|
52
|
+
if (this.cloudAdapterAttached) return
|
|
53
|
+
this.cloudConnected = cloudClientService.isConnected()
|
|
54
|
+
cloudClientService.onStatusChanged((status) => {
|
|
55
|
+
const connected = status.status === "connected"
|
|
56
|
+
if (this.cloudConnected === connected) return
|
|
57
|
+
this.log(`cloud connection -> ${connected ? "up" : "down"}`)
|
|
58
|
+
this.cloudConnected = connected
|
|
59
|
+
void this.reconcile()
|
|
60
|
+
})
|
|
61
|
+
this.cloudAdapterAttached = true
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
static getInstance(): LocalSttFallbackCoordinator {
|
|
65
|
+
if (!LocalSttFallbackCoordinator.instance) {
|
|
66
|
+
LocalSttFallbackCoordinator.instance = new LocalSttFallbackCoordinator()
|
|
67
|
+
}
|
|
68
|
+
return LocalSttFallbackCoordinator.instance
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
isActive(): boolean {
|
|
72
|
+
return this.localActive
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
getActiveLanguage(): string | null {
|
|
76
|
+
return this.activeLanguage
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
onSubscriptionChange(hasTranscription: boolean, language: string | null, hasForceLocal = false): void {
|
|
80
|
+
this.log(`onSubscriptionChange(hasTx=${hasTranscription}, lang=${language}, forceLocal=${hasForceLocal})`)
|
|
81
|
+
this.hasTranscriptionSubscription = hasTranscription
|
|
82
|
+
this.hasForceLocalSubscription = hasTranscription && hasForceLocal
|
|
83
|
+
this.activeLanguage = hasTranscription ? language : null
|
|
84
|
+
void this.reconcile()
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Informational hook, retained for API stability. No longer called: the
|
|
89
|
+
* authoritative switching signal is the cloud-client adapter (local miniapps
|
|
90
|
+
* are powered only by V2). v1 cloud transcripts deliberately do NOT drive this
|
|
91
|
+
* coordinator anymore. Kept for future hysteresis if connection-state alone
|
|
92
|
+
* proves too coarse.
|
|
93
|
+
*/
|
|
94
|
+
onCloudTranscript(): void {}
|
|
95
|
+
|
|
96
|
+
private async reconcile(): Promise<void> {
|
|
97
|
+
this.attachCloudAdapterIfReady()
|
|
98
|
+
const shouldBeActive = this.shouldUseLocalStt()
|
|
99
|
+
if (shouldBeActive && !this.localActive) {
|
|
100
|
+
await this.startLocalStt()
|
|
101
|
+
} else if (!shouldBeActive && this.localActive) {
|
|
102
|
+
this.stopLocalStt(this.hasTranscriptionSubscription ? "cloud reconnected" : "subscription gone")
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
private async startLocalStt(): Promise<void> {
|
|
107
|
+
this.log("starting local stt")
|
|
108
|
+
const modelAvailable = await sttModelManager.isModelAvailable()
|
|
109
|
+
if (!modelAvailable) {
|
|
110
|
+
this.log("local stt model is not available yet — skipping activation")
|
|
111
|
+
return
|
|
112
|
+
}
|
|
113
|
+
if (!this.shouldUseLocalStt()) {
|
|
114
|
+
this.log("local stt activation skipped: routing changed before start completed")
|
|
115
|
+
return
|
|
116
|
+
}
|
|
117
|
+
try {
|
|
118
|
+
// Direct btsdk call now (was a host restartTranscriber hook).
|
|
119
|
+
await BluetoothSdk.restartTranscriber()
|
|
120
|
+
} catch (err) {
|
|
121
|
+
this.log(`restartTranscriber failed: ${err}`)
|
|
122
|
+
}
|
|
123
|
+
if (!this.shouldUseLocalStt()) {
|
|
124
|
+
this.log("local stt activation skipped: routing changed during transcriber restart")
|
|
125
|
+
return
|
|
126
|
+
}
|
|
127
|
+
useSettingsStore.getState().setSetting(ISLAND_SETTINGS_KEYS.localSttFallbackActive, true)
|
|
128
|
+
this.localActive = true
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
private stopLocalStt(reason: string): void {
|
|
132
|
+
this.log(`stopping local stt: ${reason}`)
|
|
133
|
+
useSettingsStore.getState().setSetting(ISLAND_SETTINGS_KEYS.localSttFallbackActive, false)
|
|
134
|
+
this.localActive = false
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
private shouldUseLocalStt(): boolean {
|
|
138
|
+
return this.hasTranscriptionSubscription && (this.hasForceLocalSubscription || !this.cloudConnected)
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
private log(msg: string): void {
|
|
142
|
+
console.log(`[LocalSttFallback] ${msg}`)
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
const localSttFallbackCoordinator = LocalSttFallbackCoordinator.getInstance()
|
|
147
|
+
export default localSttFallbackCoordinator
|
|
@@ -0,0 +1,189 @@
|
|
|
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
|
+
|
|
31
|
+
export type CrashState =
|
|
32
|
+
| {kind: "RUNNING"; sinceMs: number}
|
|
33
|
+
| {kind: "CRASHED"; reason: string; crashedAtMs: number}
|
|
34
|
+
| {kind: "BACKOFF"; until: number; attempt: number; reason: string}
|
|
35
|
+
| {kind: "CRASHLOOP_DISABLED"; sinceMs: number; reason: string}
|
|
36
|
+
|
|
37
|
+
export interface CrashOutcome {
|
|
38
|
+
/** Caller must call `respawn(packageName)` after this delay (ms from now). */
|
|
39
|
+
scheduleRespawnAfterMs?: number
|
|
40
|
+
/** Caller should surface "X restarted" toast (2nd-within-5m crash). */
|
|
41
|
+
showRestartToast?: boolean
|
|
42
|
+
/** Caller should surface persistent "crashloop disabled" banner. */
|
|
43
|
+
surfaceCrashloopBanner?: boolean
|
|
44
|
+
/** Caller may push the crash event to dev portal / Sentry as warn-level. */
|
|
45
|
+
sentryLevel?: "info" | "warning" | "error"
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export interface CrashControllerOptions {
|
|
49
|
+
/** Override the wall clock for tests. Defaults to Date.now. */
|
|
50
|
+
now?: () => number
|
|
51
|
+
/** Backoff sequence in ms. Defaults to [2_000, 8_000, 30_000]. */
|
|
52
|
+
backoffMs?: number[]
|
|
53
|
+
/** Window in ms — N crashes inside this window escalates. Defaults to 5min. */
|
|
54
|
+
crashWindowMs?: number
|
|
55
|
+
/** Max retries before CRASHLOOP_DISABLED. Defaults to 0 — first crash
|
|
56
|
+
* escalates immediately, matching Android / iOS app conventions. */
|
|
57
|
+
maxRetries?: number
|
|
58
|
+
/** Clean-uptime threshold that resets the retry counter. Defaults to 60s. */
|
|
59
|
+
cleanUptimeResetMs?: number
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
interface PackageState {
|
|
63
|
+
state: CrashState
|
|
64
|
+
/** Crash timestamps inside the current window (sorted ascending). */
|
|
65
|
+
crashesInWindow: number[]
|
|
66
|
+
/** Total respawns since the package was first registered (for telemetry). */
|
|
67
|
+
totalRespawns: number
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const DEFAULT_BACKOFFS = [2_000, 8_000, 30_000]
|
|
71
|
+
const DEFAULT_WINDOW_MS = 5 * 60_000
|
|
72
|
+
const DEFAULT_MAX_RETRIES = 0
|
|
73
|
+
const DEFAULT_CLEAN_UPTIME_RESET_MS = 60_000
|
|
74
|
+
|
|
75
|
+
export class MentraJSCrashController {
|
|
76
|
+
private readonly now: () => number
|
|
77
|
+
private readonly backoffMs: number[]
|
|
78
|
+
private readonly crashWindowMs: number
|
|
79
|
+
private readonly maxRetries: number
|
|
80
|
+
private readonly cleanUptimeResetMs: number
|
|
81
|
+
private readonly packages: Map<string, PackageState> = new Map()
|
|
82
|
+
|
|
83
|
+
constructor(opts: CrashControllerOptions = {}) {
|
|
84
|
+
this.now = opts.now ?? (() => Date.now())
|
|
85
|
+
this.backoffMs = opts.backoffMs ?? DEFAULT_BACKOFFS
|
|
86
|
+
this.crashWindowMs = opts.crashWindowMs ?? DEFAULT_WINDOW_MS
|
|
87
|
+
this.maxRetries = opts.maxRetries ?? DEFAULT_MAX_RETRIES
|
|
88
|
+
this.cleanUptimeResetMs = opts.cleanUptimeResetMs ?? DEFAULT_CLEAN_UPTIME_RESET_MS
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/** Tracking starts when MentraJSRouter spawns a fresh JSContext. */
|
|
92
|
+
onSpawn(packageName: string): void {
|
|
93
|
+
const at = this.now()
|
|
94
|
+
const prev = this.packages.get(packageName)
|
|
95
|
+
if (prev) {
|
|
96
|
+
// Carry forward the crash history; a respawn doesn't reset retry
|
|
97
|
+
// budget unless the previous RUNNING state survived >= cleanUptimeResetMs.
|
|
98
|
+
prev.state = {kind: "RUNNING", sinceMs: at}
|
|
99
|
+
prev.totalRespawns += 1
|
|
100
|
+
} else {
|
|
101
|
+
this.packages.set(packageName, {
|
|
102
|
+
state: {kind: "RUNNING", sinceMs: at},
|
|
103
|
+
crashesInWindow: [],
|
|
104
|
+
totalRespawns: 0,
|
|
105
|
+
})
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/** Called when MentraJSRouter explicitly tears down (user-initiated). */
|
|
110
|
+
onKill(packageName: string): void {
|
|
111
|
+
this.packages.delete(packageName)
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Record a crash and return the policy outcome. Caller is responsible for
|
|
116
|
+
* scheduling the respawn (timer ownership belongs at the orchestration
|
|
117
|
+
* layer that holds the host context, not here).
|
|
118
|
+
*/
|
|
119
|
+
onCrash(packageName: string, reason: string): CrashOutcome {
|
|
120
|
+
const at = this.now()
|
|
121
|
+
const entry = this.packages.get(packageName) ?? {
|
|
122
|
+
state: {kind: "RUNNING", sinceMs: at},
|
|
123
|
+
crashesInWindow: [],
|
|
124
|
+
totalRespawns: 0,
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// If the previous RUNNING window was long enough, reset the retry
|
|
128
|
+
// counter — a crash after a stable session shouldn't burn budget.
|
|
129
|
+
if (entry.state.kind === "RUNNING") {
|
|
130
|
+
const uptime = at - entry.state.sinceMs
|
|
131
|
+
if (uptime >= this.cleanUptimeResetMs) {
|
|
132
|
+
entry.crashesInWindow = []
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// Drop crashes that fell out of the window before counting the new one.
|
|
137
|
+
const cutoff = at - this.crashWindowMs
|
|
138
|
+
entry.crashesInWindow = entry.crashesInWindow.filter((t) => t >= cutoff)
|
|
139
|
+
entry.crashesInWindow.push(at)
|
|
140
|
+
this.packages.set(packageName, entry)
|
|
141
|
+
|
|
142
|
+
const crashCount = entry.crashesInWindow.length
|
|
143
|
+
|
|
144
|
+
if (crashCount > this.maxRetries) {
|
|
145
|
+
entry.state = {kind: "CRASHLOOP_DISABLED", sinceMs: at, reason}
|
|
146
|
+
return {
|
|
147
|
+
surfaceCrashloopBanner: true,
|
|
148
|
+
sentryLevel: "error",
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
const attempt = crashCount - 1
|
|
153
|
+
const delayMs = this.backoffMs[Math.min(attempt, this.backoffMs.length - 1)]!
|
|
154
|
+
entry.state = {kind: "BACKOFF", until: at + delayMs, attempt: crashCount, reason}
|
|
155
|
+
|
|
156
|
+
return {
|
|
157
|
+
scheduleRespawnAfterMs: delayMs,
|
|
158
|
+
showRestartToast: crashCount >= 2,
|
|
159
|
+
sentryLevel: crashCount === 1 ? "info" : "warning",
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/** Inspect current state — useful for tests and diagnostics. */
|
|
164
|
+
stateFor(packageName: string): CrashState | null {
|
|
165
|
+
return this.packages.get(packageName)?.state ?? null
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/** Total respawns since registration — surfaced to Sentry as a counter. */
|
|
169
|
+
respawnCount(packageName: string): number {
|
|
170
|
+
return this.packages.get(packageName)?.totalRespawns ?? 0
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/** Currently-disabled packages. Host UI uses this to show banners. */
|
|
174
|
+
disabledPackages(): string[] {
|
|
175
|
+
const out: string[] = []
|
|
176
|
+
for (const [name, entry] of this.packages) {
|
|
177
|
+
if (entry.state.kind === "CRASHLOOP_DISABLED") out.push(name)
|
|
178
|
+
}
|
|
179
|
+
return out
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/** Manually re-enable a disabled package (user "Try again" tap). */
|
|
183
|
+
reset(packageName: string): void {
|
|
184
|
+
const entry = this.packages.get(packageName)
|
|
185
|
+
if (!entry) return
|
|
186
|
+
entry.crashesInWindow = []
|
|
187
|
+
entry.state = {kind: "RUNNING", sinceMs: this.now()}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import {submitAutomaticReport} from "../facades/reports"
|
|
2
|
+
import {useAppStatusStore} from "../stores/apps"
|
|
3
|
+
import {
|
|
4
|
+
logAutomaticReportSubmissionStatus,
|
|
5
|
+
toAutomaticReportSubmissionStatus,
|
|
6
|
+
type AutomaticReportSubmissionStatus,
|
|
7
|
+
} from "./AutomaticReportResult"
|
|
8
|
+
import {getMiniappEngine} from "./MiniappEngine"
|
|
9
|
+
import {islandNotifications, type IslandNotification} from "./NotificationsEmitter"
|
|
10
|
+
|
|
11
|
+
const LOG_TAG = "MentraJSCrashloopReport"
|
|
12
|
+
|
|
13
|
+
let unsubscribe: (() => void) | null = null
|
|
14
|
+
|
|
15
|
+
export async function submitMentraJSCrashloopReport(params: {
|
|
16
|
+
packageName: string
|
|
17
|
+
reason: string
|
|
18
|
+
lastLogLines?: string[]
|
|
19
|
+
}): Promise<AutomaticReportSubmissionStatus> {
|
|
20
|
+
const {packageName, reason, lastLogLines = []} = params
|
|
21
|
+
const app = useAppStatusStore.getState().apps.find((a) => a.packageName === packageName)
|
|
22
|
+
const appName = app?.name ?? packageName
|
|
23
|
+
const result = await submitAutomaticReport({
|
|
24
|
+
kind: "automatic",
|
|
25
|
+
trigger: {
|
|
26
|
+
type: "automatic",
|
|
27
|
+
source: "miniapp_crashloop",
|
|
28
|
+
reason: "mentrajs_crashloop_disabled",
|
|
29
|
+
sourceAppletPackageName: packageName,
|
|
30
|
+
sourceAppletName: appName,
|
|
31
|
+
},
|
|
32
|
+
report: {
|
|
33
|
+
expectedBehavior: `${appName} should run without crashing.`,
|
|
34
|
+
actualBehavior: JSON.stringify({reason, lastLogLines}, null, 2),
|
|
35
|
+
systemPriority: "critical",
|
|
36
|
+
},
|
|
37
|
+
throttleKey: `mentrajs_crashloop:${packageName}`,
|
|
38
|
+
})
|
|
39
|
+
|
|
40
|
+
const status = toAutomaticReportSubmissionStatus(result)
|
|
41
|
+
logAutomaticReportSubmissionStatus(LOG_TAG, status, packageName)
|
|
42
|
+
return status
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function handleNotification(notification: IslandNotification): void {
|
|
46
|
+
if (notification.kind !== "miniapp_crashloop" || !notification.packageName) return
|
|
47
|
+
const packageName = notification.packageName
|
|
48
|
+
const lastLogLines = getMiniappEngine()?.router.logRing.snapshot(packageName) ?? []
|
|
49
|
+
void submitMentraJSCrashloopReport({
|
|
50
|
+
packageName,
|
|
51
|
+
reason: notification.reason,
|
|
52
|
+
lastLogLines,
|
|
53
|
+
}).catch((error) => {
|
|
54
|
+
console.error(`[${LOG_TAG}] Unexpected error:`, error)
|
|
55
|
+
})
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export function startMentraJSCrashloopReportService(): void {
|
|
59
|
+
if (unsubscribe) return
|
|
60
|
+
unsubscribe = islandNotifications.subscribe(handleNotification)
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export function stopMentraJSCrashloopReportService(): void {
|
|
64
|
+
unsubscribe?.()
|
|
65
|
+
unsubscribe = null
|
|
66
|
+
}
|
|
@@ -0,0 +1,166 @@
|
|
|
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
|
+
const SECRET_KEY_PATTERN = /\b(token|password|secret|auth|bearer|key|api[_-]?key)\b/i
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Redact obvious secret-like strings from a log line. Walks the JSON
|
|
28
|
+
* argument list, replacing any value that looks like a secret with
|
|
29
|
+
* `[REDACTED]`. Conservative — false negatives are fine, false positives
|
|
30
|
+
* are bad (devs lose visibility into their own data).
|
|
31
|
+
*
|
|
32
|
+
* Heuristics:
|
|
33
|
+
* 1. Top-level strings matching SECRET_KEY_PATTERN get the entire value
|
|
34
|
+
* redacted (e.g. `console.log("token=abc123")` → `[REDACTED]`).
|
|
35
|
+
* 2. Object keys matching the pattern get their values replaced.
|
|
36
|
+
* 3. Arrays are walked element-by-element.
|
|
37
|
+
*
|
|
38
|
+
* Returns a new structure — never mutates the input.
|
|
39
|
+
*/
|
|
40
|
+
export function redactSecrets(value: unknown): unknown {
|
|
41
|
+
if (typeof value === "string") {
|
|
42
|
+
return SECRET_KEY_PATTERN.test(value) ? "[REDACTED]" : value
|
|
43
|
+
}
|
|
44
|
+
if (Array.isArray(value)) {
|
|
45
|
+
return value.map((v) => redactSecrets(v))
|
|
46
|
+
}
|
|
47
|
+
if (value && typeof value === "object") {
|
|
48
|
+
const out: Record<string, unknown> = {}
|
|
49
|
+
for (const [k, v] of Object.entries(value as Record<string, unknown>)) {
|
|
50
|
+
if (SECRET_KEY_PATTERN.test(k)) {
|
|
51
|
+
out[k] = "[REDACTED]"
|
|
52
|
+
} else {
|
|
53
|
+
out[k] = redactSecrets(v)
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return out
|
|
57
|
+
}
|
|
58
|
+
return value
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Token bucket throttler. Per-package: 100 logs/min sustained with a 500
|
|
63
|
+
* burst. Excess lines are dropped; the first drop in each refill window
|
|
64
|
+
* emits a `[throttled N]` synthetic line so the dev knows messages
|
|
65
|
+
* were lost.
|
|
66
|
+
*/
|
|
67
|
+
export interface ThrottleOptions {
|
|
68
|
+
/** Tokens added per second. Default 100/60 = ~1.67. */
|
|
69
|
+
tokensPerSecond?: number
|
|
70
|
+
/** Bucket capacity. Default 500. */
|
|
71
|
+
bucketCapacity?: number
|
|
72
|
+
/** Clock override for tests. */
|
|
73
|
+
now?: () => number
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
interface PackageBucket {
|
|
77
|
+
tokens: number
|
|
78
|
+
lastRefillAtMs: number
|
|
79
|
+
/** Drops accumulated since the last `[throttled N]` synthetic line. */
|
|
80
|
+
pendingDrops: number
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export class MentraJSLogThrottle {
|
|
84
|
+
private readonly tokensPerSecond: number
|
|
85
|
+
private readonly bucketCapacity: number
|
|
86
|
+
private readonly now: () => number
|
|
87
|
+
private readonly buckets: Map<string, PackageBucket> = new Map()
|
|
88
|
+
|
|
89
|
+
constructor(opts: ThrottleOptions = {}) {
|
|
90
|
+
this.tokensPerSecond = opts.tokensPerSecond ?? 100 / 60
|
|
91
|
+
this.bucketCapacity = opts.bucketCapacity ?? 500
|
|
92
|
+
this.now = opts.now ?? (() => Date.now())
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Try to consume one token for the named package. Returns either:
|
|
97
|
+
* - `{allowed: true}` — caller emits the original log line.
|
|
98
|
+
* - `{allowed: false, throttledLine}` — caller may emit the
|
|
99
|
+
* synthetic throttled line (the first drop in each window).
|
|
100
|
+
* If `throttledLine` is undefined the caller drops silently
|
|
101
|
+
* (subsequent drops in the same window).
|
|
102
|
+
*/
|
|
103
|
+
consume(packageName: string): {allowed: true} | {allowed: false; throttledLine?: string} {
|
|
104
|
+
const at = this.now()
|
|
105
|
+
let bucket = this.buckets.get(packageName)
|
|
106
|
+
if (!bucket) {
|
|
107
|
+
bucket = {
|
|
108
|
+
tokens: this.bucketCapacity,
|
|
109
|
+
lastRefillAtMs: at,
|
|
110
|
+
pendingDrops: 0,
|
|
111
|
+
}
|
|
112
|
+
this.buckets.set(packageName, bucket)
|
|
113
|
+
} else {
|
|
114
|
+
const elapsedSec = (at - bucket.lastRefillAtMs) / 1000
|
|
115
|
+
bucket.tokens = Math.min(this.bucketCapacity, bucket.tokens + elapsedSec * this.tokensPerSecond)
|
|
116
|
+
bucket.lastRefillAtMs = at
|
|
117
|
+
}
|
|
118
|
+
if (bucket.tokens >= 1) {
|
|
119
|
+
bucket.tokens -= 1
|
|
120
|
+
if (bucket.pendingDrops > 0) {
|
|
121
|
+
const dropped = bucket.pendingDrops
|
|
122
|
+
bucket.pendingDrops = 0
|
|
123
|
+
return {allowed: false, throttledLine: `[throttled ${dropped}]`}
|
|
124
|
+
}
|
|
125
|
+
return {allowed: true}
|
|
126
|
+
}
|
|
127
|
+
bucket.pendingDrops += 1
|
|
128
|
+
return {allowed: false}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/** Test/dev — reset all buckets. */
|
|
132
|
+
resetForTests(): void {
|
|
133
|
+
this.buckets.clear()
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* In-memory ring buffer holding the last N lines per package. Useful as a
|
|
139
|
+
* "last words" context attached to crash reports.
|
|
140
|
+
*/
|
|
141
|
+
export class MentraJSLogRingBuffer {
|
|
142
|
+
private readonly capacity: number
|
|
143
|
+
private readonly buffers: Map<string, string[]> = new Map()
|
|
144
|
+
|
|
145
|
+
constructor(capacityPerPackage = 200) {
|
|
146
|
+
this.capacity = capacityPerPackage
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
push(packageName: string, line: string): void {
|
|
150
|
+
let buf = this.buffers.get(packageName)
|
|
151
|
+
if (!buf) {
|
|
152
|
+
buf = []
|
|
153
|
+
this.buffers.set(packageName, buf)
|
|
154
|
+
}
|
|
155
|
+
buf.push(line)
|
|
156
|
+
if (buf.length > this.capacity) buf.shift()
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
snapshot(packageName: string): string[] {
|
|
160
|
+
return [...(this.buffers.get(packageName) ?? [])]
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
clear(packageName: string): void {
|
|
164
|
+
this.buffers.delete(packageName)
|
|
165
|
+
}
|
|
166
|
+
}
|