@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 @@
|
|
|
1
|
+
{"version":3,"file":"StreamLifecycleController.js","sourceRoot":"","sources":["../../src/services/StreamLifecycleController.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Drives RTMP stream liveliness checks via a keep-alive heartbeat:\n * `setActive(true)` starts the timer; each tick sends a keep-alive with a\n * fresh ackId; `maxMissedAcks` consecutive timeouts fire `onTimeout`.\n *\n * Mirror of `cloud/packages/cloud/src/services/streaming/StreamLifecycleController.ts`\n * — kept byte-equivalent except for the `LifecycleLogger` interface (pino\n * isn't a phone dep). Behavior changes must land in both files.\n */\n\nexport interface LifecycleLogger {\n child(bindings: Record<string, unknown>): LifecycleLogger\n debug(...args: unknown[]): void\n warn(...args: unknown[]): void\n error(...args: unknown[]): void\n}\n\ninterface StreamLifecycleCallbacks {\n sendKeepAlive: (ackId: string) => Promise<void> | void\n onTimeout: () => Promise<void> | void\n onKeepAliveSent?: (ackId: string) => void\n onKeepAliveAcked?: (ackId: string, ageMs: number) => void\n onKeepAliveMissed?: (ackId: string, ageMs: number, missedCount: number) => void\n}\n\nexport interface StreamLifecycleOptions {\n logger: LifecycleLogger\n streamId: string\n keepAliveIntervalMs: number\n ackTimeoutMs: number\n maxMissedAcks: number\n shouldSendKeepAlive?: () => boolean\n now?: () => number\n}\n\ninterface PendingAckInfo {\n sentAt: number\n timeout: ReturnType<typeof setTimeout>\n}\n\n/**\n * Drives RTMP stream liveliness checks. Activate to start the heartbeat;\n * each tick sends a keep-alive with a fresh ackId and arms a timeout. When\n * `maxMissedAcks` consecutive timeouts fire, `onTimeout` is invoked and the\n * caller is expected to tear the stream down.\n */\nexport class StreamLifecycleController {\n private keepAliveTimer?: ReturnType<typeof setInterval>\n private pendingAcks: Map<string, PendingAckInfo> = new Map()\n private missedAcks = 0\n private lastActivityMs: number\n private active = false\n private disposed = false\n\n private readonly logger: LifecycleLogger\n private readonly streamId: string\n private readonly keepAliveIntervalMs: number\n private readonly ackTimeoutMs: number\n private readonly maxMissedAcks: number\n private readonly shouldSendKeepAlive?: () => boolean\n private readonly now: () => number\n\n constructor(\n options: StreamLifecycleOptions,\n private readonly callbacks: StreamLifecycleCallbacks,\n ) {\n this.logger = options.logger.child({component: \"StreamLifecycle\"})\n this.streamId = options.streamId\n this.keepAliveIntervalMs = options.keepAliveIntervalMs\n this.ackTimeoutMs = options.ackTimeoutMs\n this.maxMissedAcks = options.maxMissedAcks\n this.shouldSendKeepAlive = options.shouldSendKeepAlive\n this.now = options.now ?? (() => Date.now())\n this.lastActivityMs = this.now()\n }\n\n setActive(active: boolean): void {\n if (this.disposed || this.active === active) return\n\n this.logger.debug({streamId: this.streamId, active}, \"Updating lifecycle active state\")\n\n this.active = active\n if (active) {\n this.startTimer()\n } else {\n this.stopTimer()\n this.clearPendingAcks()\n this.missedAcks = 0\n }\n }\n\n recordActivity(): void {\n this.lastActivityMs = this.now()\n this.missedAcks = 0\n }\n\n handleAck(ackId: string): void {\n if (this.disposed) return\n\n const ackInfo = this.pendingAcks.get(ackId)\n if (!ackInfo) {\n this.logger.warn({streamId: this.streamId, ackId}, \"Received unknown keep-alive ACK\")\n return\n }\n\n clearTimeout(ackInfo.timeout)\n this.pendingAcks.delete(ackId)\n this.recordActivity()\n\n this.callbacks.onKeepAliveAcked?.(ackId, this.now() - ackInfo.sentAt)\n }\n\n dispose(): void {\n if (this.disposed) return\n\n this.disposed = true\n this.stopTimer()\n this.clearPendingAcks()\n this.logger.debug({streamId: this.streamId}, \"Lifecycle disposed\")\n }\n\n getLastActivityMs(): number {\n return this.lastActivityMs\n }\n\n private startTimer(): void {\n if (this.keepAliveTimer) return\n this.keepAliveTimer = setInterval(() => {\n void this.tick()\n }, this.keepAliveIntervalMs)\n this.logger.debug({streamId: this.streamId}, \"Keep-alive timer started\")\n }\n\n private stopTimer(): void {\n if (this.keepAliveTimer) {\n clearInterval(this.keepAliveTimer)\n this.keepAliveTimer = undefined\n this.logger.debug({streamId: this.streamId}, \"Keep-alive timer stopped\")\n }\n }\n\n private async tick(): Promise<void> {\n if (this.disposed || !this.active) return\n\n if (this.shouldSendKeepAlive && !this.shouldSendKeepAlive()) {\n this.logger.warn(\n {streamId: this.streamId},\n \"Skipping keep-alive send because transport is unavailable\",\n )\n return\n }\n\n const ackId = this.createAckId()\n const sentAt = this.now()\n\n const timeout = setTimeout(() => {\n this.onAckTimeout(ackId, sentAt)\n }, this.ackTimeoutMs)\n\n this.pendingAcks.set(ackId, {sentAt, timeout})\n this.callbacks.onKeepAliveSent?.(ackId)\n\n try {\n await this.callbacks.sendKeepAlive(ackId)\n } catch (error) {\n this.logger.error({streamId: this.streamId, ackId, error}, \"Error sending keep-alive\")\n }\n }\n\n private onAckTimeout(ackId: string, sentAt: number): void {\n if (this.disposed) return\n\n // Race guard: handleAck may have processed the ACK between the timeout\n // being scheduled and this callback running. In that case the ackId is\n // no longer pending — counting it as missed would falsely escalate.\n if (!this.pendingAcks.has(ackId)) return\n\n this.pendingAcks.delete(ackId)\n this.missedAcks += 1\n const ageMs = this.now() - sentAt\n\n this.logger.warn(\n {streamId: this.streamId, ackId, missedAcks: this.missedAcks, ageMs},\n \"Keep-alive ACK timeout\",\n )\n\n this.callbacks.onKeepAliveMissed?.(ackId, ageMs, this.missedAcks)\n\n if (this.missedAcks >= this.maxMissedAcks) {\n this.logger.error(\n {\n streamId: this.streamId,\n missedAcks: this.missedAcks,\n maxMissedAcks: this.maxMissedAcks,\n },\n \"Maximum missed ACKs reached; triggering timeout\",\n )\n\n void this.callbacks.onTimeout()\n }\n }\n\n private clearPendingAcks(): void {\n for (const {timeout} of this.pendingAcks.values()) {\n clearTimeout(timeout)\n }\n this.pendingAcks.clear()\n }\n\n private createAckId(): string {\n return `a${this.now().toString(36).slice(-5)}`\n }\n}\n"]}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
export declare const SUPERTONIC_VOICES: {
|
|
2
|
+
readonly F1: 0;
|
|
3
|
+
readonly F2: 1;
|
|
4
|
+
readonly F3: 2;
|
|
5
|
+
readonly F4: 3;
|
|
6
|
+
readonly F5: 4;
|
|
7
|
+
readonly M1: 5;
|
|
8
|
+
readonly M2: 6;
|
|
9
|
+
readonly M3: 7;
|
|
10
|
+
readonly M4: 8;
|
|
11
|
+
readonly M5: 9;
|
|
12
|
+
};
|
|
13
|
+
export declare const DEFAULT_SUPERTONIC_VOICE_SID: 0;
|
|
14
|
+
export interface TTSLanguageInfo {
|
|
15
|
+
code: string;
|
|
16
|
+
displayName: string;
|
|
17
|
+
size: number;
|
|
18
|
+
language: string;
|
|
19
|
+
downloaded: boolean;
|
|
20
|
+
path?: string;
|
|
21
|
+
type: "supertonic";
|
|
22
|
+
}
|
|
23
|
+
export interface TTSDownloadProgress {
|
|
24
|
+
jobId: number;
|
|
25
|
+
bytesWritten: number;
|
|
26
|
+
contentLength: number;
|
|
27
|
+
percentage: number;
|
|
28
|
+
}
|
|
29
|
+
export interface TTSExtractionProgress {
|
|
30
|
+
percentage: number;
|
|
31
|
+
currentFile?: string;
|
|
32
|
+
}
|
|
33
|
+
export interface TTSLanguageConfig {
|
|
34
|
+
code: string;
|
|
35
|
+
displayName: string;
|
|
36
|
+
fileName: string;
|
|
37
|
+
size: number;
|
|
38
|
+
type: "supertonic";
|
|
39
|
+
requiredFiles: string[];
|
|
40
|
+
languageCode: string;
|
|
41
|
+
}
|
|
42
|
+
export interface TTSGenerateOptions {
|
|
43
|
+
/** BCP-47 language tag, e.g. "en-US", "fr-FR". Maps to Supertonic 2-letter code. */
|
|
44
|
+
languageCode?: string;
|
|
45
|
+
/** Speaker ID (0..9). Defaults to F1 (sid 0). */
|
|
46
|
+
speakerId?: number;
|
|
47
|
+
/** Speech rate, clamped 0.5..2.0 on native side. */
|
|
48
|
+
speed?: number;
|
|
49
|
+
}
|
|
50
|
+
export interface TTSGenerateResult {
|
|
51
|
+
audioUrl: string;
|
|
52
|
+
filePath: string;
|
|
53
|
+
cleanup: () => Promise<void>;
|
|
54
|
+
}
|
|
55
|
+
declare class TTSModelManager {
|
|
56
|
+
private static instance;
|
|
57
|
+
private downloadJobId?;
|
|
58
|
+
private currentLanguage;
|
|
59
|
+
private modelBaseUrl;
|
|
60
|
+
private languages;
|
|
61
|
+
private constructor();
|
|
62
|
+
static getInstance(): TTSModelManager;
|
|
63
|
+
/** Expected SHA-256 of the Supertonic 3 tarball, for downstream integrity checks. */
|
|
64
|
+
getExpectedSha256(): string;
|
|
65
|
+
getCurrentLanguageFromPreferences(): Promise<string>;
|
|
66
|
+
getCurrentLanguage(): string;
|
|
67
|
+
setCurrentLanguage(code: string): void;
|
|
68
|
+
getAvailableLanguages(): TTSLanguageConfig[];
|
|
69
|
+
getBcp47ForLanguage(code?: string): string;
|
|
70
|
+
getModelDirectory(): string;
|
|
71
|
+
/** All languages share the same on-disk Supertonic install. */
|
|
72
|
+
getModelPath(_code?: string): string;
|
|
73
|
+
/** Last path segment is "supertonic" (the on-disk install folder). */
|
|
74
|
+
getLanguageFromPath(path: string): string;
|
|
75
|
+
isModelAvailable(code?: string): Promise<boolean>;
|
|
76
|
+
getLanguageInfo(code?: string): Promise<TTSLanguageInfo>;
|
|
77
|
+
getAllLanguageInfo(): Promise<TTSLanguageInfo[]>;
|
|
78
|
+
downloadModel(code?: string, onProgress?: (progress: TTSDownloadProgress) => void, onExtractionProgress?: (progress: TTSExtractionProgress) => void): Promise<void>;
|
|
79
|
+
cancelDownload(): Promise<void>;
|
|
80
|
+
deleteModel(_code?: string): Promise<void>;
|
|
81
|
+
activateLanguage(code: string): Promise<void>;
|
|
82
|
+
synthesizeToFile(text: string, options?: TTSGenerateOptions): Promise<TTSGenerateResult>;
|
|
83
|
+
private setNativeModelPath;
|
|
84
|
+
formatBytes(bytes: number): string;
|
|
85
|
+
static formatBytes(bytes: number): string;
|
|
86
|
+
}
|
|
87
|
+
declare const instance: TTSModelManager;
|
|
88
|
+
export { TTSModelManager };
|
|
89
|
+
export default instance;
|
|
90
|
+
//# sourceMappingURL=TTSModelManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TTSModelManager.d.ts","sourceRoot":"","sources":["../../src/services/TTSModelManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,366 @@
|
|
|
1
|
+
import BluetoothSdk from "@mentra/bluetooth-sdk";
|
|
2
|
+
import * as RNFS from "@dr.pogodin/react-native-fs";
|
|
3
|
+
/**
|
|
4
|
+
* Offline TTS via Sherpa-ONNX Supertonic 3.
|
|
5
|
+
*
|
|
6
|
+
* Supertonic 3 ships as a single multilingual model bundle (123 MB int8)
|
|
7
|
+
* with 31 languages and 10 preset voice styles inside one voice.bin.
|
|
8
|
+
*
|
|
9
|
+
* Speaker IDs are alphabetical by source filename, so:
|
|
10
|
+
* sid 0 = F1, 1 = F2, 2 = F3, 3 = F4, 4 = F5,
|
|
11
|
+
* sid 5 = M1, 6 = M2, 7 = M3, 8 = M4, 9 = M5.
|
|
12
|
+
*
|
|
13
|
+
* Default voice is F1 (sid 0) — a female "professional broadcast" voice.
|
|
14
|
+
*
|
|
15
|
+
* Per-call language selection is done by the native layer based on the
|
|
16
|
+
* languageCode set via setTtsModelDetails (Supertonic accepts e.g. "en",
|
|
17
|
+
* "ko", "ja", "fr", "de", "es", … — 31 codes total).
|
|
18
|
+
*/
|
|
19
|
+
const SUPERTONIC_FILE = "sherpa-onnx-supertonic-3-tts-int8-2026-05-11";
|
|
20
|
+
const SUPERTONIC_SIZE = 128974848; // 123 MB
|
|
21
|
+
const SUPERTONIC_SHA256 = "82fa96f91c4ef8abaae3a14a3f4153facf88bed821d1f7331cec2700f432c427";
|
|
22
|
+
// Speaker IDs for Supertonic 3.
|
|
23
|
+
export const SUPERTONIC_VOICES = {
|
|
24
|
+
F1: 0,
|
|
25
|
+
F2: 1,
|
|
26
|
+
F3: 2,
|
|
27
|
+
F4: 3,
|
|
28
|
+
F5: 4,
|
|
29
|
+
M1: 5,
|
|
30
|
+
M2: 6,
|
|
31
|
+
M3: 7,
|
|
32
|
+
M4: 8,
|
|
33
|
+
M5: 9,
|
|
34
|
+
};
|
|
35
|
+
export const DEFAULT_SUPERTONIC_VOICE_SID = SUPERTONIC_VOICES.F1;
|
|
36
|
+
/** Languages Supertonic 3 supports (BCP-47-ish tags surfaced to the UI). */
|
|
37
|
+
const LANGUAGE_DISPLAY = {
|
|
38
|
+
en: { displayName: "English", bcp47: "en-US" },
|
|
39
|
+
fr: { displayName: "Français", bcp47: "fr-FR" },
|
|
40
|
+
de: { displayName: "Deutsch", bcp47: "de-DE" },
|
|
41
|
+
es: { displayName: "Español", bcp47: "es-ES" },
|
|
42
|
+
it: { displayName: "Italiano", bcp47: "it-IT" },
|
|
43
|
+
pt: { displayName: "Português", bcp47: "pt-PT" },
|
|
44
|
+
nl: { displayName: "Nederlands", bcp47: "nl-NL" },
|
|
45
|
+
pl: { displayName: "Polski", bcp47: "pl-PL" },
|
|
46
|
+
ru: { displayName: "Русский", bcp47: "ru-RU" },
|
|
47
|
+
uk: { displayName: "Українська", bcp47: "uk-UA" },
|
|
48
|
+
ko: { displayName: "한국어", bcp47: "ko-KR" },
|
|
49
|
+
ja: { displayName: "日本語", bcp47: "ja-JP" },
|
|
50
|
+
ar: { displayName: "العربية", bcp47: "ar-SA" },
|
|
51
|
+
hi: { displayName: "हिन्दी", bcp47: "hi-IN" },
|
|
52
|
+
id: { displayName: "Bahasa Indonesia", bcp47: "id-ID" },
|
|
53
|
+
vi: { displayName: "Tiếng Việt", bcp47: "vi-VN" },
|
|
54
|
+
tr: { displayName: "Türkçe", bcp47: "tr-TR" },
|
|
55
|
+
el: { displayName: "Ελληνικά", bcp47: "el-GR" },
|
|
56
|
+
bg: { displayName: "Български", bcp47: "bg-BG" },
|
|
57
|
+
cs: { displayName: "Čeština", bcp47: "cs-CZ" },
|
|
58
|
+
da: { displayName: "Dansk", bcp47: "da-DK" },
|
|
59
|
+
et: { displayName: "Eesti", bcp47: "et-EE" },
|
|
60
|
+
fi: { displayName: "Suomi", bcp47: "fi-FI" },
|
|
61
|
+
hr: { displayName: "Hrvatski", bcp47: "hr-HR" },
|
|
62
|
+
hu: { displayName: "Magyar", bcp47: "hu-HU" },
|
|
63
|
+
lt: { displayName: "Lietuvių", bcp47: "lt-LT" },
|
|
64
|
+
lv: { displayName: "Latviešu", bcp47: "lv-LV" },
|
|
65
|
+
ro: { displayName: "Română", bcp47: "ro-RO" },
|
|
66
|
+
sk: { displayName: "Slovenčina", bcp47: "sk-SK" },
|
|
67
|
+
sl: { displayName: "Slovenščina", bcp47: "sl-SI" },
|
|
68
|
+
sv: { displayName: "Svenska", bcp47: "sv-SE" },
|
|
69
|
+
};
|
|
70
|
+
const DEFAULT_LANGUAGE = "en";
|
|
71
|
+
/** On-disk folder name for the single Supertonic install. */
|
|
72
|
+
const MODEL_FOLDER = "supertonic";
|
|
73
|
+
/** Files inside the Supertonic 3 archive — must match TTSTools native validators. */
|
|
74
|
+
const SUPERTONIC_REQUIRED_FILES = [
|
|
75
|
+
"duration_predictor.int8.onnx",
|
|
76
|
+
"text_encoder.int8.onnx",
|
|
77
|
+
"vector_estimator.int8.onnx",
|
|
78
|
+
"vocoder.int8.onnx",
|
|
79
|
+
"tts.json",
|
|
80
|
+
"unicode_indexer.bin",
|
|
81
|
+
"voice.bin",
|
|
82
|
+
];
|
|
83
|
+
function buildLanguageRegistry() {
|
|
84
|
+
const out = {};
|
|
85
|
+
for (const [code, meta] of Object.entries(LANGUAGE_DISPLAY)) {
|
|
86
|
+
out[code] = {
|
|
87
|
+
code,
|
|
88
|
+
displayName: meta.displayName,
|
|
89
|
+
fileName: SUPERTONIC_FILE,
|
|
90
|
+
size: SUPERTONIC_SIZE,
|
|
91
|
+
type: "supertonic",
|
|
92
|
+
requiredFiles: SUPERTONIC_REQUIRED_FILES,
|
|
93
|
+
languageCode: meta.bcp47,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
return out;
|
|
97
|
+
}
|
|
98
|
+
class TTSModelManager {
|
|
99
|
+
static instance;
|
|
100
|
+
downloadJobId;
|
|
101
|
+
currentLanguage = DEFAULT_LANGUAGE;
|
|
102
|
+
// Sherpa-onnx releases page hosts the tarball.
|
|
103
|
+
modelBaseUrl = "https://github.com/k2-fsa/sherpa-onnx/releases/download/tts-models/";
|
|
104
|
+
// Languages all map onto the same on-disk Supertonic install. Selecting a
|
|
105
|
+
// language tells the native layer which lang to pass to the model — no
|
|
106
|
+
// separate downloads per language.
|
|
107
|
+
languages = buildLanguageRegistry();
|
|
108
|
+
constructor() { }
|
|
109
|
+
static getInstance() {
|
|
110
|
+
if (!TTSModelManager.instance) {
|
|
111
|
+
TTSModelManager.instance = new TTSModelManager();
|
|
112
|
+
}
|
|
113
|
+
return TTSModelManager.instance;
|
|
114
|
+
}
|
|
115
|
+
/** Expected SHA-256 of the Supertonic 3 tarball, for downstream integrity checks. */
|
|
116
|
+
getExpectedSha256() {
|
|
117
|
+
return SUPERTONIC_SHA256;
|
|
118
|
+
}
|
|
119
|
+
async getCurrentLanguageFromPreferences() {
|
|
120
|
+
try {
|
|
121
|
+
const path = await BluetoothSdk.getTtsModelPath();
|
|
122
|
+
if (!path || path.length === 0) {
|
|
123
|
+
return "";
|
|
124
|
+
}
|
|
125
|
+
if (!(await this.isModelAvailable())) {
|
|
126
|
+
return "";
|
|
127
|
+
}
|
|
128
|
+
// The native side persists the BCP-47 tag (e.g. "fr-FR") that was passed
|
|
129
|
+
// to setTtsModelDetails. Map it back to our registry key.
|
|
130
|
+
const bcp47 = await BluetoothSdk.getTtsModelLanguage();
|
|
131
|
+
const primary = bcp47.split("-")[0].toLowerCase();
|
|
132
|
+
const code = this.languages[primary] ? primary : "";
|
|
133
|
+
if (code) {
|
|
134
|
+
this.currentLanguage = code;
|
|
135
|
+
}
|
|
136
|
+
return code;
|
|
137
|
+
}
|
|
138
|
+
catch (error) {
|
|
139
|
+
console.error("Error getting current TTS language from preferences:", error);
|
|
140
|
+
return "";
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
getCurrentLanguage() {
|
|
144
|
+
return this.currentLanguage;
|
|
145
|
+
}
|
|
146
|
+
setCurrentLanguage(code) {
|
|
147
|
+
if (this.languages[code]) {
|
|
148
|
+
this.currentLanguage = code;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
getAvailableLanguages() {
|
|
152
|
+
return Object.values(this.languages);
|
|
153
|
+
}
|
|
154
|
+
getBcp47ForLanguage(code) {
|
|
155
|
+
const id = code || this.currentLanguage;
|
|
156
|
+
return this.languages[id]?.languageCode ?? "en-US";
|
|
157
|
+
}
|
|
158
|
+
getModelDirectory() {
|
|
159
|
+
return `${RNFS.DocumentDirectoryPath}/tts_models`;
|
|
160
|
+
}
|
|
161
|
+
/** All languages share the same on-disk Supertonic install. */
|
|
162
|
+
getModelPath(_code) {
|
|
163
|
+
return `${this.getModelDirectory()}/${MODEL_FOLDER}`;
|
|
164
|
+
}
|
|
165
|
+
/** Last path segment is "supertonic" (the on-disk install folder). */
|
|
166
|
+
getLanguageFromPath(path) {
|
|
167
|
+
return path.split("/").pop() || "";
|
|
168
|
+
}
|
|
169
|
+
async isModelAvailable(code) {
|
|
170
|
+
try {
|
|
171
|
+
const language = this.languages[code || this.currentLanguage];
|
|
172
|
+
if (!language)
|
|
173
|
+
return false;
|
|
174
|
+
const modelPath = this.getModelPath();
|
|
175
|
+
for (const file of language.requiredFiles) {
|
|
176
|
+
const exists = await RNFS.exists(`${modelPath}/${file}`);
|
|
177
|
+
if (!exists) {
|
|
178
|
+
console.log(`Missing required TTS file: ${file} at ${modelPath}`);
|
|
179
|
+
return false;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
return await BluetoothSdk.validateTtsModel(modelPath);
|
|
183
|
+
}
|
|
184
|
+
catch (error) {
|
|
185
|
+
console.error("Error checking TTS model availability:", error);
|
|
186
|
+
return false;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
async getLanguageInfo(code) {
|
|
190
|
+
const id = code || this.currentLanguage;
|
|
191
|
+
const language = this.languages[id];
|
|
192
|
+
if (!language) {
|
|
193
|
+
throw new Error(`TTS language ${id} not found`);
|
|
194
|
+
}
|
|
195
|
+
const downloaded = await this.isModelAvailable(id);
|
|
196
|
+
const path = downloaded ? this.getModelPath() : undefined;
|
|
197
|
+
return {
|
|
198
|
+
code: id,
|
|
199
|
+
displayName: language.displayName,
|
|
200
|
+
size: language.size,
|
|
201
|
+
language: language.languageCode,
|
|
202
|
+
downloaded,
|
|
203
|
+
path,
|
|
204
|
+
type: language.type,
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
async getAllLanguageInfo() {
|
|
208
|
+
const infos = [];
|
|
209
|
+
for (const code of Object.keys(this.languages)) {
|
|
210
|
+
infos.push(await this.getLanguageInfo(code));
|
|
211
|
+
}
|
|
212
|
+
return infos;
|
|
213
|
+
}
|
|
214
|
+
async downloadModel(code, onProgress, onExtractionProgress) {
|
|
215
|
+
const id = code || this.currentLanguage;
|
|
216
|
+
const language = this.languages[id];
|
|
217
|
+
if (!language) {
|
|
218
|
+
throw new Error(`TTS language ${id} not found`);
|
|
219
|
+
}
|
|
220
|
+
// All languages share the same archive — re-downloading is a no-op if
|
|
221
|
+
// the on-disk model is already present and valid.
|
|
222
|
+
if (await this.isModelAvailable(id)) {
|
|
223
|
+
onExtractionProgress?.({ percentage: 100 });
|
|
224
|
+
// Make sure the native layer has the latest language code.
|
|
225
|
+
await this.setNativeModelPath(this.getModelPath(), language.languageCode);
|
|
226
|
+
this.currentLanguage = id;
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
const modelUrl = `${this.modelBaseUrl}${SUPERTONIC_FILE}.tar.bz2`;
|
|
230
|
+
const tempPath = `${RNFS.TemporaryDirectoryPath}/${SUPERTONIC_FILE}.tar.bz2`;
|
|
231
|
+
const modelDir = this.getModelDirectory();
|
|
232
|
+
const finalPath = this.getModelPath();
|
|
233
|
+
try {
|
|
234
|
+
await RNFS.mkdir(modelDir, { NSURLIsExcludedFromBackupKey: true });
|
|
235
|
+
const result = RNFS.downloadFile({
|
|
236
|
+
fromUrl: modelUrl,
|
|
237
|
+
toFile: tempPath,
|
|
238
|
+
progress: (res) => {
|
|
239
|
+
const percentage = Math.round((res.bytesWritten / res.contentLength) * 100);
|
|
240
|
+
onProgress?.({
|
|
241
|
+
jobId: res.jobId,
|
|
242
|
+
bytesWritten: res.bytesWritten,
|
|
243
|
+
contentLength: res.contentLength,
|
|
244
|
+
percentage,
|
|
245
|
+
});
|
|
246
|
+
},
|
|
247
|
+
progressDivider: 10,
|
|
248
|
+
connectionTimeout: 30000,
|
|
249
|
+
readTimeout: 30000,
|
|
250
|
+
});
|
|
251
|
+
this.downloadJobId = result.jobId;
|
|
252
|
+
const downloadResult = await result.promise;
|
|
253
|
+
if (downloadResult.statusCode !== 200) {
|
|
254
|
+
throw new Error(`TTS model download failed with status code: ${downloadResult.statusCode}`);
|
|
255
|
+
}
|
|
256
|
+
const subscription = BluetoothSdk.addListener("extraction_progress", (event) => {
|
|
257
|
+
onExtractionProgress?.({ percentage: event.percentage });
|
|
258
|
+
});
|
|
259
|
+
let extractionResult = false;
|
|
260
|
+
try {
|
|
261
|
+
extractionResult = await BluetoothSdk.extractTarBz2(tempPath, finalPath);
|
|
262
|
+
}
|
|
263
|
+
finally {
|
|
264
|
+
subscription.remove();
|
|
265
|
+
}
|
|
266
|
+
if (!extractionResult) {
|
|
267
|
+
throw new Error("Native TTS model extraction returned failure status");
|
|
268
|
+
}
|
|
269
|
+
onExtractionProgress?.({ percentage: 100 });
|
|
270
|
+
await RNFS.unlink(tempPath);
|
|
271
|
+
await this.setNativeModelPath(finalPath, language.languageCode);
|
|
272
|
+
this.currentLanguage = id;
|
|
273
|
+
}
|
|
274
|
+
catch (error) {
|
|
275
|
+
// Best-effort cleanup; never let it mask the original error.
|
|
276
|
+
try {
|
|
277
|
+
if (await RNFS.exists(tempPath))
|
|
278
|
+
await RNFS.unlink(tempPath);
|
|
279
|
+
}
|
|
280
|
+
catch (cleanupError) {
|
|
281
|
+
console.warn("TTSModelManager: temp cleanup failed:", cleanupError);
|
|
282
|
+
}
|
|
283
|
+
try {
|
|
284
|
+
if (await RNFS.exists(finalPath))
|
|
285
|
+
await RNFS.unlink(finalPath);
|
|
286
|
+
}
|
|
287
|
+
catch (cleanupError) {
|
|
288
|
+
console.warn("TTSModelManager: final cleanup failed:", cleanupError);
|
|
289
|
+
}
|
|
290
|
+
throw error;
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
async cancelDownload() {
|
|
294
|
+
if (this.downloadJobId !== undefined) {
|
|
295
|
+
await RNFS.stopDownload(this.downloadJobId);
|
|
296
|
+
this.downloadJobId = undefined;
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
async deleteModel(_code) {
|
|
300
|
+
const modelPath = this.getModelPath();
|
|
301
|
+
if (await RNFS.exists(modelPath)) {
|
|
302
|
+
await RNFS.unlink(modelPath);
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
async activateLanguage(code) {
|
|
306
|
+
const language = this.languages[code];
|
|
307
|
+
if (!language) {
|
|
308
|
+
throw new Error(`TTS language ${code} not found`);
|
|
309
|
+
}
|
|
310
|
+
const isAvailable = await this.isModelAvailable(code);
|
|
311
|
+
if (!isAvailable) {
|
|
312
|
+
throw new Error(`TTS language ${code} model is not downloaded`);
|
|
313
|
+
}
|
|
314
|
+
this.currentLanguage = code;
|
|
315
|
+
await this.setNativeModelPath(this.getModelPath(), language.languageCode);
|
|
316
|
+
}
|
|
317
|
+
async synthesizeToFile(text, options = {}) {
|
|
318
|
+
const id = options.languageCode || this.currentLanguage;
|
|
319
|
+
const language = this.languages[id];
|
|
320
|
+
if (!language) {
|
|
321
|
+
throw new Error(`TTS language ${id} not found`);
|
|
322
|
+
}
|
|
323
|
+
if (!(await this.isModelAvailable(id))) {
|
|
324
|
+
throw new Error(`TTS model is not downloaded`);
|
|
325
|
+
}
|
|
326
|
+
// Make sure the native layer is synced to this language before generating;
|
|
327
|
+
// Supertonic reads the BCP-47 tag from prefs when synthesising.
|
|
328
|
+
if (id !== this.currentLanguage) {
|
|
329
|
+
await this.activateLanguage(id);
|
|
330
|
+
}
|
|
331
|
+
const outputDir = RNFS.CachesDirectoryPath || RNFS.TemporaryDirectoryPath;
|
|
332
|
+
const safeId = `${Date.now()}_${Math.random().toString(36).slice(2)}`;
|
|
333
|
+
const outputPath = `${outputDir}/mentra_tts_${safeId}.wav`;
|
|
334
|
+
const ok = await BluetoothSdk.generateTtsAudio(text, this.getModelPath(), outputPath, options.speakerId ?? DEFAULT_SUPERTONIC_VOICE_SID, options.speed ?? 1.0);
|
|
335
|
+
if (!ok) {
|
|
336
|
+
throw new Error("Offline TTS synthesis failed");
|
|
337
|
+
}
|
|
338
|
+
return {
|
|
339
|
+
audioUrl: `file://${outputPath}`,
|
|
340
|
+
filePath: outputPath,
|
|
341
|
+
cleanup: async () => {
|
|
342
|
+
if (await RNFS.exists(outputPath)) {
|
|
343
|
+
await RNFS.unlink(outputPath);
|
|
344
|
+
}
|
|
345
|
+
},
|
|
346
|
+
};
|
|
347
|
+
}
|
|
348
|
+
async setNativeModelPath(path, languageCode) {
|
|
349
|
+
await BluetoothSdk.setTtsModelDetails(path, languageCode);
|
|
350
|
+
}
|
|
351
|
+
formatBytes(bytes) {
|
|
352
|
+
return TTSModelManager.formatBytes(bytes);
|
|
353
|
+
}
|
|
354
|
+
static formatBytes(bytes) {
|
|
355
|
+
if (bytes === 0)
|
|
356
|
+
return "0 Bytes";
|
|
357
|
+
const k = 1024;
|
|
358
|
+
const sizes = ["Bytes", "KB", "MB", "GB"];
|
|
359
|
+
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
360
|
+
return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + " " + sizes[i];
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
const instance = TTSModelManager.getInstance();
|
|
364
|
+
export { TTSModelManager };
|
|
365
|
+
export default instance;
|
|
366
|
+
//# sourceMappingURL=TTSModelManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TTSModelManager.js","sourceRoot":"","sources":["../../src/services/TTSModelManager.ts"],"names":[],"mappings":"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","sourcesContent":["import BluetoothSdk from \"@mentra/bluetooth-sdk\"\nimport * as RNFS from \"@dr.pogodin/react-native-fs\"\n\n/**\n * Offline TTS via Sherpa-ONNX Supertonic 3.\n *\n * Supertonic 3 ships as a single multilingual model bundle (123 MB int8)\n * with 31 languages and 10 preset voice styles inside one voice.bin.\n *\n * Speaker IDs are alphabetical by source filename, so:\n * sid 0 = F1, 1 = F2, 2 = F3, 3 = F4, 4 = F5,\n * sid 5 = M1, 6 = M2, 7 = M3, 8 = M4, 9 = M5.\n *\n * Default voice is F1 (sid 0) — a female \"professional broadcast\" voice.\n *\n * Per-call language selection is done by the native layer based on the\n * languageCode set via setTtsModelDetails (Supertonic accepts e.g. \"en\",\n * \"ko\", \"ja\", \"fr\", \"de\", \"es\", … — 31 codes total).\n */\n\nconst SUPERTONIC_FILE = \"sherpa-onnx-supertonic-3-tts-int8-2026-05-11\"\nconst SUPERTONIC_SIZE = 128974848 // 123 MB\nconst SUPERTONIC_SHA256 = \"82fa96f91c4ef8abaae3a14a3f4153facf88bed821d1f7331cec2700f432c427\"\n\n// Speaker IDs for Supertonic 3.\nexport const SUPERTONIC_VOICES = {\n F1: 0,\n F2: 1,\n F3: 2,\n F4: 3,\n F5: 4,\n M1: 5,\n M2: 6,\n M3: 7,\n M4: 8,\n M5: 9,\n} as const\n\nexport const DEFAULT_SUPERTONIC_VOICE_SID = SUPERTONIC_VOICES.F1\n\nexport interface TTSLanguageInfo {\n code: string\n displayName: string\n size: number\n language: string\n downloaded: boolean\n path?: string\n type: \"supertonic\"\n}\n\nexport interface TTSDownloadProgress {\n jobId: number\n bytesWritten: number\n contentLength: number\n percentage: number\n}\n\nexport interface TTSExtractionProgress {\n percentage: number\n currentFile?: string\n}\n\nexport interface TTSLanguageConfig {\n code: string\n displayName: string\n fileName: string\n size: number\n type: \"supertonic\"\n requiredFiles: string[]\n languageCode: string\n}\n\nexport interface TTSGenerateOptions {\n /** BCP-47 language tag, e.g. \"en-US\", \"fr-FR\". Maps to Supertonic 2-letter code. */\n languageCode?: string\n /** Speaker ID (0..9). Defaults to F1 (sid 0). */\n speakerId?: number\n /** Speech rate, clamped 0.5..2.0 on native side. */\n speed?: number\n}\n\nexport interface TTSGenerateResult {\n audioUrl: string\n filePath: string\n cleanup: () => Promise<void>\n}\n\n/** Languages Supertonic 3 supports (BCP-47-ish tags surfaced to the UI). */\nconst LANGUAGE_DISPLAY: Record<string, {displayName: string; bcp47: string}> = {\n en: {displayName: \"English\", bcp47: \"en-US\"},\n fr: {displayName: \"Français\", bcp47: \"fr-FR\"},\n de: {displayName: \"Deutsch\", bcp47: \"de-DE\"},\n es: {displayName: \"Español\", bcp47: \"es-ES\"},\n it: {displayName: \"Italiano\", bcp47: \"it-IT\"},\n pt: {displayName: \"Português\", bcp47: \"pt-PT\"},\n nl: {displayName: \"Nederlands\", bcp47: \"nl-NL\"},\n pl: {displayName: \"Polski\", bcp47: \"pl-PL\"},\n ru: {displayName: \"Русский\", bcp47: \"ru-RU\"},\n uk: {displayName: \"Українська\", bcp47: \"uk-UA\"},\n ko: {displayName: \"한국어\", bcp47: \"ko-KR\"},\n ja: {displayName: \"日本語\", bcp47: \"ja-JP\"},\n ar: {displayName: \"العربية\", bcp47: \"ar-SA\"},\n hi: {displayName: \"हिन्दी\", bcp47: \"hi-IN\"},\n id: {displayName: \"Bahasa Indonesia\", bcp47: \"id-ID\"},\n vi: {displayName: \"Tiếng Việt\", bcp47: \"vi-VN\"},\n tr: {displayName: \"Türkçe\", bcp47: \"tr-TR\"},\n el: {displayName: \"Ελληνικά\", bcp47: \"el-GR\"},\n bg: {displayName: \"Български\", bcp47: \"bg-BG\"},\n cs: {displayName: \"Čeština\", bcp47: \"cs-CZ\"},\n da: {displayName: \"Dansk\", bcp47: \"da-DK\"},\n et: {displayName: \"Eesti\", bcp47: \"et-EE\"},\n fi: {displayName: \"Suomi\", bcp47: \"fi-FI\"},\n hr: {displayName: \"Hrvatski\", bcp47: \"hr-HR\"},\n hu: {displayName: \"Magyar\", bcp47: \"hu-HU\"},\n lt: {displayName: \"Lietuvių\", bcp47: \"lt-LT\"},\n lv: {displayName: \"Latviešu\", bcp47: \"lv-LV\"},\n ro: {displayName: \"Română\", bcp47: \"ro-RO\"},\n sk: {displayName: \"Slovenčina\", bcp47: \"sk-SK\"},\n sl: {displayName: \"Slovenščina\", bcp47: \"sl-SI\"},\n sv: {displayName: \"Svenska\", bcp47: \"sv-SE\"},\n}\n\nconst DEFAULT_LANGUAGE = \"en\"\n\n/** On-disk folder name for the single Supertonic install. */\nconst MODEL_FOLDER = \"supertonic\"\n\n/** Files inside the Supertonic 3 archive — must match TTSTools native validators. */\nconst SUPERTONIC_REQUIRED_FILES = [\n \"duration_predictor.int8.onnx\",\n \"text_encoder.int8.onnx\",\n \"vector_estimator.int8.onnx\",\n \"vocoder.int8.onnx\",\n \"tts.json\",\n \"unicode_indexer.bin\",\n \"voice.bin\",\n]\n\nfunction buildLanguageRegistry(): Record<string, TTSLanguageConfig> {\n const out: Record<string, TTSLanguageConfig> = {}\n for (const [code, meta] of Object.entries(LANGUAGE_DISPLAY)) {\n out[code] = {\n code,\n displayName: meta.displayName,\n fileName: SUPERTONIC_FILE,\n size: SUPERTONIC_SIZE,\n type: \"supertonic\",\n requiredFiles: SUPERTONIC_REQUIRED_FILES,\n languageCode: meta.bcp47,\n }\n }\n return out\n}\n\nclass TTSModelManager {\n private static instance: TTSModelManager\n private downloadJobId?: number\n private currentLanguage = DEFAULT_LANGUAGE\n // Sherpa-onnx releases page hosts the tarball.\n private modelBaseUrl = \"https://github.com/k2-fsa/sherpa-onnx/releases/download/tts-models/\"\n\n // Languages all map onto the same on-disk Supertonic install. Selecting a\n // language tells the native layer which lang to pass to the model — no\n // separate downloads per language.\n private languages: Record<string, TTSLanguageConfig> = buildLanguageRegistry()\n\n private constructor() {}\n\n static getInstance(): TTSModelManager {\n if (!TTSModelManager.instance) {\n TTSModelManager.instance = new TTSModelManager()\n }\n return TTSModelManager.instance\n }\n\n /** Expected SHA-256 of the Supertonic 3 tarball, for downstream integrity checks. */\n getExpectedSha256(): string {\n return SUPERTONIC_SHA256\n }\n\n async getCurrentLanguageFromPreferences(): Promise<string> {\n try {\n const path = await BluetoothSdk.getTtsModelPath()\n if (!path || path.length === 0) {\n return \"\"\n }\n if (!(await this.isModelAvailable())) {\n return \"\"\n }\n // The native side persists the BCP-47 tag (e.g. \"fr-FR\") that was passed\n // to setTtsModelDetails. Map it back to our registry key.\n const bcp47 = await BluetoothSdk.getTtsModelLanguage()\n const primary = bcp47.split(\"-\")[0].toLowerCase()\n const code = this.languages[primary] ? primary : \"\"\n if (code) {\n this.currentLanguage = code\n }\n return code\n } catch (error) {\n console.error(\"Error getting current TTS language from preferences:\", error)\n return \"\"\n }\n }\n\n getCurrentLanguage(): string {\n return this.currentLanguage\n }\n\n setCurrentLanguage(code: string): void {\n if (this.languages[code]) {\n this.currentLanguage = code\n }\n }\n\n getAvailableLanguages(): TTSLanguageConfig[] {\n return Object.values(this.languages)\n }\n\n getBcp47ForLanguage(code?: string): string {\n const id = code || this.currentLanguage\n return this.languages[id]?.languageCode ?? \"en-US\"\n }\n\n getModelDirectory(): string {\n return `${RNFS.DocumentDirectoryPath}/tts_models`\n }\n\n /** All languages share the same on-disk Supertonic install. */\n getModelPath(_code?: string): string {\n return `${this.getModelDirectory()}/${MODEL_FOLDER}`\n }\n\n /** Last path segment is \"supertonic\" (the on-disk install folder). */\n getLanguageFromPath(path: string): string {\n return path.split(\"/\").pop() || \"\"\n }\n\n async isModelAvailable(code?: string): Promise<boolean> {\n try {\n const language = this.languages[code || this.currentLanguage]\n if (!language) return false\n\n const modelPath = this.getModelPath()\n for (const file of language.requiredFiles) {\n const exists = await RNFS.exists(`${modelPath}/${file}`)\n if (!exists) {\n console.log(`Missing required TTS file: ${file} at ${modelPath}`)\n return false\n }\n }\n\n return await BluetoothSdk.validateTtsModel(modelPath)\n } catch (error) {\n console.error(\"Error checking TTS model availability:\", error)\n return false\n }\n }\n\n async getLanguageInfo(code?: string): Promise<TTSLanguageInfo> {\n const id = code || this.currentLanguage\n const language = this.languages[id]\n if (!language) {\n throw new Error(`TTS language ${id} not found`)\n }\n\n const downloaded = await this.isModelAvailable(id)\n const path = downloaded ? this.getModelPath() : undefined\n\n return {\n code: id,\n displayName: language.displayName,\n size: language.size,\n language: language.languageCode,\n downloaded,\n path,\n type: language.type,\n }\n }\n\n async getAllLanguageInfo(): Promise<TTSLanguageInfo[]> {\n const infos: TTSLanguageInfo[] = []\n for (const code of Object.keys(this.languages)) {\n infos.push(await this.getLanguageInfo(code))\n }\n return infos\n }\n\n async downloadModel(\n code?: string,\n onProgress?: (progress: TTSDownloadProgress) => void,\n onExtractionProgress?: (progress: TTSExtractionProgress) => void,\n ): Promise<void> {\n const id = code || this.currentLanguage\n const language = this.languages[id]\n if (!language) {\n throw new Error(`TTS language ${id} not found`)\n }\n\n // All languages share the same archive — re-downloading is a no-op if\n // the on-disk model is already present and valid.\n if (await this.isModelAvailable(id)) {\n onExtractionProgress?.({percentage: 100})\n // Make sure the native layer has the latest language code.\n await this.setNativeModelPath(this.getModelPath(), language.languageCode)\n this.currentLanguage = id\n return\n }\n\n const modelUrl = `${this.modelBaseUrl}${SUPERTONIC_FILE}.tar.bz2`\n const tempPath = `${RNFS.TemporaryDirectoryPath}/${SUPERTONIC_FILE}.tar.bz2`\n const modelDir = this.getModelDirectory()\n const finalPath = this.getModelPath()\n\n try {\n await RNFS.mkdir(modelDir, {NSURLIsExcludedFromBackupKey: true})\n\n const result = RNFS.downloadFile({\n fromUrl: modelUrl,\n toFile: tempPath,\n progress: (res: RNFS.DownloadProgressCallbackResultT) => {\n const percentage = Math.round((res.bytesWritten / res.contentLength) * 100)\n onProgress?.({\n jobId: res.jobId,\n bytesWritten: res.bytesWritten,\n contentLength: res.contentLength,\n percentage,\n })\n },\n progressDivider: 10,\n connectionTimeout: 30000,\n readTimeout: 30000,\n })\n this.downloadJobId = result.jobId\n\n const downloadResult = await result.promise\n if (downloadResult.statusCode !== 200) {\n throw new Error(`TTS model download failed with status code: ${downloadResult.statusCode}`)\n }\n\n const subscription = BluetoothSdk.addListener(\"extraction_progress\", (event) => {\n onExtractionProgress?.({percentage: event.percentage})\n })\n\n let extractionResult = false\n try {\n extractionResult = await BluetoothSdk.extractTarBz2(tempPath, finalPath)\n } finally {\n subscription.remove()\n }\n\n if (!extractionResult) {\n throw new Error(\"Native TTS model extraction returned failure status\")\n }\n onExtractionProgress?.({percentage: 100})\n\n await RNFS.unlink(tempPath)\n\n await this.setNativeModelPath(finalPath, language.languageCode)\n this.currentLanguage = id\n } catch (error) {\n // Best-effort cleanup; never let it mask the original error.\n try {\n if (await RNFS.exists(tempPath)) await RNFS.unlink(tempPath)\n } catch (cleanupError) {\n console.warn(\"TTSModelManager: temp cleanup failed:\", cleanupError)\n }\n try {\n if (await RNFS.exists(finalPath)) await RNFS.unlink(finalPath)\n } catch (cleanupError) {\n console.warn(\"TTSModelManager: final cleanup failed:\", cleanupError)\n }\n throw error\n }\n }\n\n async cancelDownload(): Promise<void> {\n if (this.downloadJobId !== undefined) {\n await RNFS.stopDownload(this.downloadJobId)\n this.downloadJobId = undefined\n }\n }\n\n async deleteModel(_code?: string): Promise<void> {\n const modelPath = this.getModelPath()\n if (await RNFS.exists(modelPath)) {\n await RNFS.unlink(modelPath)\n }\n }\n\n async activateLanguage(code: string): Promise<void> {\n const language = this.languages[code]\n if (!language) {\n throw new Error(`TTS language ${code} not found`)\n }\n\n const isAvailable = await this.isModelAvailable(code)\n if (!isAvailable) {\n throw new Error(`TTS language ${code} model is not downloaded`)\n }\n\n this.currentLanguage = code\n await this.setNativeModelPath(this.getModelPath(), language.languageCode)\n }\n\n async synthesizeToFile(text: string, options: TTSGenerateOptions = {}): Promise<TTSGenerateResult> {\n const id = options.languageCode || this.currentLanguage\n const language = this.languages[id]\n if (!language) {\n throw new Error(`TTS language ${id} not found`)\n }\n\n if (!(await this.isModelAvailable(id))) {\n throw new Error(`TTS model is not downloaded`)\n }\n\n // Make sure the native layer is synced to this language before generating;\n // Supertonic reads the BCP-47 tag from prefs when synthesising.\n if (id !== this.currentLanguage) {\n await this.activateLanguage(id)\n }\n\n const outputDir = RNFS.CachesDirectoryPath || RNFS.TemporaryDirectoryPath\n const safeId = `${Date.now()}_${Math.random().toString(36).slice(2)}`\n const outputPath = `${outputDir}/mentra_tts_${safeId}.wav`\n const ok = await BluetoothSdk.generateTtsAudio(\n text,\n this.getModelPath(),\n outputPath,\n options.speakerId ?? DEFAULT_SUPERTONIC_VOICE_SID,\n options.speed ?? 1.0,\n )\n if (!ok) {\n throw new Error(\"Offline TTS synthesis failed\")\n }\n\n return {\n audioUrl: `file://${outputPath}`,\n filePath: outputPath,\n cleanup: async () => {\n if (await RNFS.exists(outputPath)) {\n await RNFS.unlink(outputPath)\n }\n },\n }\n }\n\n private async setNativeModelPath(path: string, languageCode: string): Promise<void> {\n await BluetoothSdk.setTtsModelDetails(path, languageCode)\n }\n\n formatBytes(bytes: number): string {\n return TTSModelManager.formatBytes(bytes)\n }\n\n static formatBytes(bytes: number): string {\n if (bytes === 0) return \"0 Bytes\"\n const k = 1024\n const sizes = [\"Bytes\", \"KB\", \"MB\", \"GB\"]\n const i = Math.floor(Math.log(bytes) / Math.log(k))\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + \" \" + sizes[i]\n }\n}\n\nconst instance = TTSModelManager.getInstance()\nexport {TTSModelManager}\nexport default instance\n"]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface TranscriptionRouteSummary {
|
|
2
|
+
hasCloudSubscriber: boolean;
|
|
3
|
+
hasForceLocalSubscriber: boolean;
|
|
4
|
+
}
|
|
5
|
+
export interface TranscriptionSubscriberRoutes {
|
|
6
|
+
cloud: boolean;
|
|
7
|
+
forceLocal: boolean;
|
|
8
|
+
}
|
|
9
|
+
export type TranscriptionDeliveryRoute = "default" | "forceLocal" | "all";
|
|
10
|
+
export declare function summarizeTranscriptionRoutes<T>(subscribers: Iterable<T>, routesFor: (subscriber: T) => TranscriptionSubscriberRoutes): TranscriptionRouteSummary;
|
|
11
|
+
export declare function transcriptionDeliveryRoute(source: "cloud" | "local", routes: TranscriptionSubscriberRoutes, cloudConnected: boolean): TranscriptionDeliveryRoute | null;
|
|
12
|
+
//# sourceMappingURL=TranscriptionRouting.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TranscriptionRouting.d.ts","sourceRoot":"","sources":["../../src/services/TranscriptionRouting.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,yBAAyB;IACxC,kBAAkB,EAAE,OAAO,CAAA;IAC3B,uBAAuB,EAAE,OAAO,CAAA;CACjC;AAED,MAAM,WAAW,6BAA6B;IAC5C,KAAK,EAAE,OAAO,CAAA;IACd,UAAU,EAAE,OAAO,CAAA;CACpB;AAED,MAAM,MAAM,0BAA0B,GAAG,SAAS,GAAG,YAAY,GAAG,KAAK,CAAA;AAEzE,wBAAgB,4BAA4B,CAAC,CAAC,EAC5C,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC,EACxB,SAAS,EAAE,CAAC,UAAU,EAAE,CAAC,KAAK,6BAA6B,GAC1D,yBAAyB,CAS3B;AAED,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,OAAO,GAAG,OAAO,EACzB,MAAM,EAAE,6BAA6B,EACrC,cAAc,EAAE,OAAO,GACtB,0BAA0B,GAAG,IAAI,CAMnC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export function summarizeTranscriptionRoutes(subscribers, routesFor) {
|
|
2
|
+
let hasCloudSubscriber = false;
|
|
3
|
+
let hasForceLocalSubscriber = false;
|
|
4
|
+
for (const subscriber of subscribers) {
|
|
5
|
+
const routes = routesFor(subscriber);
|
|
6
|
+
if (routes.cloud)
|
|
7
|
+
hasCloudSubscriber = true;
|
|
8
|
+
if (routes.forceLocal)
|
|
9
|
+
hasForceLocalSubscriber = true;
|
|
10
|
+
}
|
|
11
|
+
return { hasCloudSubscriber, hasForceLocalSubscriber };
|
|
12
|
+
}
|
|
13
|
+
export function transcriptionDeliveryRoute(source, routes, cloudConnected) {
|
|
14
|
+
if (source === "cloud")
|
|
15
|
+
return routes.cloud ? "default" : null;
|
|
16
|
+
if (cloudConnected)
|
|
17
|
+
return routes.forceLocal ? "forceLocal" : null;
|
|
18
|
+
if (routes.cloud && routes.forceLocal)
|
|
19
|
+
return "all";
|
|
20
|
+
if (routes.forceLocal)
|
|
21
|
+
return "forceLocal";
|
|
22
|
+
return routes.cloud ? "default" : null;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=TranscriptionRouting.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TranscriptionRouting.js","sourceRoot":"","sources":["../../src/services/TranscriptionRouting.ts"],"names":[],"mappings":"AAYA,MAAM,UAAU,4BAA4B,CAC1C,WAAwB,EACxB,SAA2D;IAE3D,IAAI,kBAAkB,GAAG,KAAK,CAAA;IAC9B,IAAI,uBAAuB,GAAG,KAAK,CAAA;IACnC,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;QACrC,MAAM,MAAM,GAAG,SAAS,CAAC,UAAU,CAAC,CAAA;QACpC,IAAI,MAAM,CAAC,KAAK;YAAE,kBAAkB,GAAG,IAAI,CAAA;QAC3C,IAAI,MAAM,CAAC,UAAU;YAAE,uBAAuB,GAAG,IAAI,CAAA;IACvD,CAAC;IACD,OAAO,EAAC,kBAAkB,EAAE,uBAAuB,EAAC,CAAA;AACtD,CAAC;AAED,MAAM,UAAU,0BAA0B,CACxC,MAAyB,EACzB,MAAqC,EACrC,cAAuB;IAEvB,IAAI,MAAM,KAAK,OAAO;QAAE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAA;IAC9D,IAAI,cAAc;QAAE,OAAO,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAA;IAClE,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,UAAU;QAAE,OAAO,KAAK,CAAA;IACnD,IAAI,MAAM,CAAC,UAAU;QAAE,OAAO,YAAY,CAAA;IAC1C,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAA;AACxC,CAAC","sourcesContent":["export interface TranscriptionRouteSummary {\n hasCloudSubscriber: boolean\n hasForceLocalSubscriber: boolean\n}\n\nexport interface TranscriptionSubscriberRoutes {\n cloud: boolean\n forceLocal: boolean\n}\n\nexport type TranscriptionDeliveryRoute = \"default\" | \"forceLocal\" | \"all\"\n\nexport function summarizeTranscriptionRoutes<T>(\n subscribers: Iterable<T>,\n routesFor: (subscriber: T) => TranscriptionSubscriberRoutes,\n): TranscriptionRouteSummary {\n let hasCloudSubscriber = false\n let hasForceLocalSubscriber = false\n for (const subscriber of subscribers) {\n const routes = routesFor(subscriber)\n if (routes.cloud) hasCloudSubscriber = true\n if (routes.forceLocal) hasForceLocalSubscriber = true\n }\n return {hasCloudSubscriber, hasForceLocalSubscriber}\n}\n\nexport function transcriptionDeliveryRoute(\n source: \"cloud\" | \"local\",\n routes: TranscriptionSubscriberRoutes,\n cloudConnected: boolean,\n): TranscriptionDeliveryRoute | null {\n if (source === \"cloud\") return routes.cloud ? \"default\" : null\n if (cloudConnected) return routes.forceLocal ? \"forceLocal\" : null\n if (routes.cloud && routes.forceLocal) return \"all\"\n if (routes.forceLocal) return \"forceLocal\"\n return routes.cloud ? \"default\" : null\n}\n"]}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebviewBridge — WebView message handler registry.
|
|
3
|
+
*
|
|
4
|
+
* Holds per-packageName send functions so that any service (MiniappHost,
|
|
5
|
+
* webview.tsx) can inject JS into a specific WebView. That's it.
|
|
6
|
+
*
|
|
7
|
+
* Local miniapp message routing goes through LocalMiniappRuntime directly
|
|
8
|
+
* (MiniappHost calls localMiniappRuntime.handleRawMessage). WebviewBridge is
|
|
9
|
+
* not in that path.
|
|
10
|
+
*/
|
|
11
|
+
declare class WebviewBridge {
|
|
12
|
+
private static instance;
|
|
13
|
+
private messageHandlers;
|
|
14
|
+
private constructor();
|
|
15
|
+
static getInstance(): WebviewBridge;
|
|
16
|
+
cleanup(): void;
|
|
17
|
+
setWebViewMessageHandler(packageName: string, handler?: (stringified: string) => void): void;
|
|
18
|
+
sendToMiniApp(packageName: string, message: object): void;
|
|
19
|
+
}
|
|
20
|
+
declare const webviewBridge: WebviewBridge;
|
|
21
|
+
export default webviewBridge;
|
|
22
|
+
//# sourceMappingURL=WebviewBridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WebviewBridge.d.ts","sourceRoot":"","sources":["../../src/services/WebviewBridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,cAAM,aAAa;IACjB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA6B;IACpD,OAAO,CAAC,eAAe,CAAoD;IAE3E,OAAO;WAEO,WAAW,IAAI,aAAa;IAOnC,OAAO;IAKP,wBAAwB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI;IAQrF,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAS1D;AAED,QAAA,MAAM,aAAa,eAA8B,CAAA;AACjD,eAAe,aAAa,CAAA"}
|