@mentra/engine 0.1.0-dev.0 → 3.1.0-dev.10
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 +55 -18
- package/build/bluetooth-sdk/debug.d.ts +2 -0
- package/build/bluetooth-sdk/debug.d.ts.map +1 -0
- package/build/bluetooth-sdk/debug.js +2 -0
- package/build/bluetooth-sdk/debug.js.map +1 -0
- package/build/bluetooth-sdk/index.d.ts +3 -0
- package/build/bluetooth-sdk/index.d.ts.map +1 -0
- package/build/bluetooth-sdk/index.js +3 -0
- package/build/bluetooth-sdk/index.js.map +1 -0
- package/build/bluetooth-sdk/photo-receiver.d.ts +3 -0
- package/build/bluetooth-sdk/photo-receiver.d.ts.map +1 -0
- package/build/bluetooth-sdk/photo-receiver.js +3 -0
- package/build/bluetooth-sdk/photo-receiver.js.map +1 -0
- package/build/bluetooth-sdk/react.d.ts +2 -0
- package/build/bluetooth-sdk/react.d.ts.map +1 -0
- package/build/bluetooth-sdk/react.js +2 -0
- package/build/bluetooth-sdk/react.js.map +1 -0
- package/build/bluetooth-sdk/types.d.ts +2 -0
- package/build/bluetooth-sdk/types.d.ts.map +1 -0
- package/build/bluetooth-sdk/types.js +2 -0
- package/build/bluetooth-sdk/types.js.map +1 -0
- package/build/engine.d.ts +24 -16
- package/build/engine.d.ts.map +1 -1
- package/build/engine.js +9 -4
- package/build/engine.js.map +1 -1
- package/build/facades/dev.d.ts +3 -2
- package/build/facades/dev.d.ts.map +1 -1
- package/build/facades/dev.js +18 -12
- package/build/facades/dev.js.map +1 -1
- package/build/facades/display.d.ts +1 -1
- package/build/facades/display.d.ts.map +1 -1
- package/build/facades/display.js +1 -1
- package/build/facades/display.js.map +1 -1
- package/build/facades/gallery.js +1 -1
- package/build/facades/gallery.js.map +1 -1
- package/build/facades/glasses.d.ts +4 -13
- package/build/facades/glasses.d.ts.map +1 -1
- package/build/facades/glasses.js +21 -6
- package/build/facades/glasses.js.map +1 -1
- package/build/facades/glassesSettings.d.ts.map +1 -1
- package/build/facades/glassesSettings.js +1 -0
- package/build/facades/glassesSettings.js.map +1 -1
- package/build/facades/miniapps.d.ts +4 -0
- package/build/facades/miniapps.d.ts.map +1 -1
- package/build/facades/miniapps.js +5 -0
- package/build/facades/miniapps.js.map +1 -1
- package/build/facades/ota.d.ts +14 -16
- package/build/facades/ota.d.ts.map +1 -1
- package/build/facades/ota.js +22 -7
- package/build/facades/ota.js.map +1 -1
- package/build/facades/pairing.d.ts +8 -5
- package/build/facades/pairing.d.ts.map +1 -1
- package/build/facades/pairing.js +12 -10
- package/build/facades/pairing.js.map +1 -1
- package/build/facades/permissions.d.ts +10 -0
- package/build/facades/permissions.d.ts.map +1 -1
- package/build/facades/permissions.js +10 -0
- package/build/facades/permissions.js.map +1 -1
- package/build/facades/phoneNotifications.d.ts +0 -4
- package/build/facades/phoneNotifications.d.ts.map +1 -1
- package/build/facades/phoneNotifications.js +4 -14
- package/build/facades/phoneNotifications.js.map +1 -1
- package/build/facades/speech.d.ts +7 -6
- package/build/facades/speech.d.ts.map +1 -1
- package/build/facades/speech.js +1 -1
- package/build/facades/speech.js.map +1 -1
- package/build/generated/releaseMetadata.d.ts +12 -0
- package/build/generated/releaseMetadata.d.ts.map +1 -0
- package/build/generated/releaseMetadata.js +10 -0
- package/build/generated/releaseMetadata.js.map +1 -0
- package/build/index.d.ts +10 -8
- package/build/index.d.ts.map +1 -1
- package/build/index.js +6 -5
- package/build/index.js.map +1 -1
- package/build/react/MentraLiveOtaFlow.d.ts +38 -0
- package/build/react/MentraLiveOtaFlow.d.ts.map +1 -0
- package/build/react/MentraLiveOtaFlow.js +528 -0
- package/build/react/MentraLiveOtaFlow.js.map +1 -0
- package/build/react/index.d.ts +2 -0
- package/build/react/index.d.ts.map +1 -0
- package/build/react/index.js +2 -0
- package/build/react/index.js.map +1 -0
- package/build/react/useEngineSnapshot.d.ts +2 -0
- package/build/react/useEngineSnapshot.d.ts.map +1 -0
- package/build/react/useEngineSnapshot.js +14 -0
- package/build/react/useEngineSnapshot.js.map +1 -0
- package/build/runtime/bootstrap.d.ts +24 -1
- package/build/runtime/bootstrap.d.ts.map +1 -1
- package/build/runtime/bootstrap.js +17 -0
- package/build/runtime/bootstrap.js.map +1 -1
- package/build/runtime/scanQrSeam.d.ts +7 -0
- package/build/runtime/scanQrSeam.d.ts.map +1 -0
- package/build/runtime/scanQrSeam.js +16 -0
- package/build/runtime/scanQrSeam.js.map +1 -0
- package/build/services/AppRegistry.d.ts +41 -57
- package/build/services/AppRegistry.d.ts.map +1 -1
- package/build/services/AppRegistry.js +208 -144
- package/build/services/AppRegistry.js.map +1 -1
- package/build/services/AudioCloudUplink.d.ts +12 -0
- package/build/services/AudioCloudUplink.d.ts.map +1 -1
- package/build/services/AudioCloudUplink.js +22 -1
- package/build/services/AudioCloudUplink.js.map +1 -1
- package/build/services/AudioPlaybackService.d.ts +41 -2
- package/build/services/AudioPlaybackService.d.ts.map +1 -1
- package/build/services/AudioPlaybackService.js +250 -33
- package/build/services/AudioPlaybackService.js.map +1 -1
- package/build/services/BlobStore.d.ts +2 -1
- package/build/services/BlobStore.d.ts.map +1 -1
- package/build/services/BlobStore.js +17 -9
- package/build/services/BlobStore.js.map +1 -1
- package/build/services/CloudAudioSubscriptionSync.d.ts.map +1 -1
- package/build/services/CloudAudioSubscriptionSync.js +13 -1
- package/build/services/CloudAudioSubscriptionSync.js.map +1 -1
- package/build/services/CloudClientService.d.ts +15 -0
- package/build/services/CloudClientService.d.ts.map +1 -1
- package/build/services/CloudClientService.js +93 -1
- package/build/services/CloudClientService.js.map +1 -1
- package/build/services/DeviceEventRouter.js +5 -5
- package/build/services/DeviceEventRouter.js.map +1 -1
- package/build/services/ForegroundLocationPermission.d.ts +13 -0
- package/build/services/ForegroundLocationPermission.d.ts.map +1 -0
- package/build/services/ForegroundLocationPermission.js +12 -0
- package/build/services/ForegroundLocationPermission.js.map +1 -0
- package/build/services/GlassesSettingsSync.d.ts.map +1 -1
- package/build/services/GlassesSettingsSync.js +9 -3
- package/build/services/GlassesSettingsSync.js.map +1 -1
- package/build/services/GlassesStatusProjection.d.ts +2 -1
- package/build/services/GlassesStatusProjection.d.ts.map +1 -1
- package/build/services/GlassesStatusProjection.js +15 -8
- package/build/services/GlassesStatusProjection.js.map +1 -1
- package/build/services/HotspotOtaTransport.d.ts +29 -0
- package/build/services/HotspotOtaTransport.d.ts.map +1 -0
- package/build/services/HotspotOtaTransport.js +146 -0
- package/build/services/HotspotOtaTransport.js.map +1 -0
- package/build/services/HotspotShutdown.d.ts +17 -0
- package/build/services/HotspotShutdown.d.ts.map +1 -0
- package/build/services/HotspotShutdown.js +29 -0
- package/build/services/HotspotShutdown.js.map +1 -0
- package/build/services/LocalDisplayManager.d.ts +15 -0
- package/build/services/LocalDisplayManager.d.ts.map +1 -1
- package/build/services/LocalDisplayManager.js +106 -20
- package/build/services/LocalDisplayManager.js.map +1 -1
- package/build/services/LocalMiniappRuntime.d.ts +74 -2
- package/build/services/LocalMiniappRuntime.d.ts.map +1 -1
- package/build/services/LocalMiniappRuntime.js +785 -291
- package/build/services/LocalMiniappRuntime.js.map +1 -1
- package/build/services/LocalMiniappStorage.d.ts +32 -0
- package/build/services/LocalMiniappStorage.d.ts.map +1 -0
- package/build/services/LocalMiniappStorage.js +66 -0
- package/build/services/LocalMiniappStorage.js.map +1 -0
- package/build/services/LocalMiniappUserIdentity.d.ts +20 -0
- package/build/services/LocalMiniappUserIdentity.d.ts.map +1 -0
- package/build/services/LocalMiniappUserIdentity.js +43 -0
- package/build/services/LocalMiniappUserIdentity.js.map +1 -0
- package/build/services/LocalSttFallbackCoordinator.d.ts +9 -6
- package/build/services/LocalSttFallbackCoordinator.d.ts.map +1 -1
- package/build/services/LocalSttFallbackCoordinator.js +18 -12
- package/build/services/LocalSttFallbackCoordinator.js.map +1 -1
- package/build/services/MicStateCoordinator.d.ts +42 -1
- package/build/services/MicStateCoordinator.d.ts.map +1 -1
- package/build/services/MicStateCoordinator.js +141 -3
- package/build/services/MicStateCoordinator.js.map +1 -1
- package/build/services/MiniappLauncher.d.ts.map +1 -1
- package/build/services/MiniappLauncher.js +23 -3
- package/build/services/MiniappLauncher.js.map +1 -1
- package/build/services/MiniappLiveness.d.ts +12 -0
- package/build/services/MiniappLiveness.d.ts.map +1 -0
- package/build/services/MiniappLiveness.js +16 -0
- package/build/services/MiniappLiveness.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/OtaArtifactDownloader.d.ts +65 -0
- package/build/services/OtaArtifactDownloader.d.ts.map +1 -0
- package/build/services/OtaArtifactDownloader.js +226 -0
- package/build/services/OtaArtifactDownloader.js.map +1 -0
- package/build/services/OtaAutoChain.d.ts +34 -0
- package/build/services/OtaAutoChain.d.ts.map +1 -0
- package/build/services/OtaAutoChain.js +83 -0
- package/build/services/OtaAutoChain.js.map +1 -0
- package/build/services/OtaErrorMapping.d.ts +18 -0
- package/build/services/OtaErrorMapping.d.ts.map +1 -0
- package/build/services/OtaErrorMapping.js +63 -0
- package/build/services/OtaErrorMapping.js.map +1 -0
- package/build/services/OtaInstallCoordinator.d.ts +95 -15
- package/build/services/OtaInstallCoordinator.d.ts.map +1 -1
- package/build/services/OtaInstallCoordinator.js +577 -130
- package/build/services/OtaInstallCoordinator.js.map +1 -1
- package/build/services/OtaService.d.ts.map +1 -1
- package/build/services/OtaService.js +8 -1
- package/build/services/OtaService.js.map +1 -1
- package/build/services/OtaUpdateCheckService.d.ts +39 -4
- package/build/services/OtaUpdateCheckService.d.ts.map +1 -1
- package/build/services/OtaUpdateCheckService.js +138 -22
- package/build/services/OtaUpdateCheckService.js.map +1 -1
- 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 +45 -0
- package/build/services/PhoneCalendarService.js.map +1 -0
- package/build/services/PhoneCameraFovCoordinator.d.ts +30 -0
- package/build/services/PhoneCameraFovCoordinator.d.ts.map +1 -0
- package/build/services/PhoneCameraFovCoordinator.js +194 -0
- package/build/services/PhoneCameraFovCoordinator.js.map +1 -0
- package/build/services/PhoneNotificationsSync.d.ts.map +1 -1
- package/build/services/PhoneNotificationsSync.js +12 -10
- package/build/services/PhoneNotificationsSync.js.map +1 -1
- package/build/services/PhonePhotoCoordinator.d.ts +26 -2
- package/build/services/PhonePhotoCoordinator.d.ts.map +1 -1
- package/build/services/PhonePhotoCoordinator.js +79 -9
- package/build/services/PhonePhotoCoordinator.js.map +1 -1
- package/build/services/PhoneStreamCoordinator.d.ts +8 -1
- package/build/services/PhoneStreamCoordinator.d.ts.map +1 -1
- package/build/services/PhoneStreamCoordinator.js +125 -13
- package/build/services/PhoneStreamCoordinator.js.map +1 -1
- package/build/services/PhoneVideoCoordinator.d.ts +2 -0
- package/build/services/PhoneVideoCoordinator.d.ts.map +1 -1
- package/build/services/PhoneVideoCoordinator.js +10 -0
- package/build/services/PhoneVideoCoordinator.js.map +1 -1
- package/build/services/SceneRenderer.d.ts.map +1 -1
- package/build/services/SceneRenderer.js +15 -0
- package/build/services/SceneRenderer.js.map +1 -1
- 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/SupportProfileSync.d.ts +22 -0
- package/build/services/SupportProfileSync.d.ts.map +1 -0
- package/build/services/SupportProfileSync.js +213 -0
- package/build/services/SupportProfileSync.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/TtsTextSanitizer.d.ts +5 -0
- package/build/services/TtsTextSanitizer.d.ts.map +1 -0
- package/build/services/TtsTextSanitizer.js +61 -0
- package/build/services/TtsTextSanitizer.js.map +1 -0
- package/build/services/WifiAdbRequest.d.ts +17 -0
- package/build/services/WifiAdbRequest.d.ts.map +1 -0
- package/build/services/WifiAdbRequest.js +35 -0
- package/build/services/WifiAdbRequest.js.map +1 -0
- package/build/services/asg/asgCameraApi.d.ts +43 -0
- package/build/services/asg/asgCameraApi.d.ts.map +1 -1
- package/build/services/asg/asgCameraApi.js +509 -26
- package/build/services/asg/asgCameraApi.js.map +1 -1
- 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/galleryNotices.d.ts +1 -1
- package/build/services/asg/galleryNotices.d.ts.map +1 -1
- package/build/services/asg/galleryNotices.js.map +1 -1
- 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 +1 -0
- package/build/services/asg/gallerySettingsService.d.ts.map +1 -1
- package/build/services/asg/gallerySettingsService.js +2 -0
- package/build/services/asg/gallerySettingsService.js.map +1 -1
- package/build/services/asg/gallerySyncService.d.ts.map +1 -1
- package/build/services/asg/gallerySyncService.js +162 -56
- package/build/services/asg/gallerySyncService.js.map +1 -1
- 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 +18 -0
- package/build/services/asg/localStorageService.d.ts.map +1 -1
- package/build/services/asg/localStorageService.js +168 -19
- package/build/services/asg/localStorageService.js.map +1 -1
- package/build/services/asg/mediaProcessingQueue.d.ts +10 -0
- package/build/services/asg/mediaProcessingQueue.d.ts.map +1 -1
- package/build/services/asg/mediaProcessingQueue.js +193 -62
- package/build/services/asg/mediaProcessingQueue.js.map +1 -1
- package/build/services/audioPlaybackAssets.d.ts +8 -0
- package/build/services/audioPlaybackAssets.d.ts.map +1 -0
- package/build/services/audioPlaybackAssets.js +7 -0
- package/build/services/audioPlaybackAssets.js.map +1 -0
- package/build/services/gallerySyncClock.js +1 -1
- package/build/services/gallerySyncClock.js.map +1 -1
- package/build/services/glassesClockSync.d.ts.map +1 -1
- package/build/services/glassesClockSync.js +6 -2
- package/build/services/glassesClockSync.js.map +1 -1
- package/build/services/manifestActions.d.ts +7 -0
- package/build/services/manifestActions.d.ts.map +1 -0
- package/build/services/manifestActions.js +25 -0
- package/build/services/manifestActions.js.map +1 -0
- package/build/services/otaDisplayState.d.ts +23 -12
- package/build/services/otaDisplayState.d.ts.map +1 -1
- package/build/services/otaDisplayState.js +36 -14
- package/build/services/otaDisplayState.js.map +1 -1
- package/build/services/otaInstallPolicy.d.ts +16 -4
- package/build/services/otaInstallPolicy.d.ts.map +1 -1
- package/build/services/otaInstallPolicy.js +24 -3
- package/build/services/otaInstallPolicy.js.map +1 -1
- package/build/services/otaLegacyMapping.d.ts +1 -1
- package/build/services/otaLegacyMapping.d.ts.map +1 -1
- package/build/services/otaLegacyMapping.js.map +1 -1
- package/build/services/otaManifestPolicy.d.ts +14 -0
- package/build/services/otaManifestPolicy.d.ts.map +1 -0
- package/build/services/otaManifestPolicy.js +19 -0
- package/build/services/otaManifestPolicy.js.map +1 -0
- package/build/services/otaManifestUrl.d.ts +3 -0
- package/build/services/otaManifestUrl.d.ts.map +1 -0
- package/build/services/otaManifestUrl.js +38 -0
- package/build/services/otaManifestUrl.js.map +1 -0
- package/build/services/slimStreamStatus.d.ts +11 -0
- package/build/services/slimStreamStatus.d.ts.map +1 -1
- package/build/services/slimStreamStatus.js +14 -4
- package/build/services/slimStreamStatus.js.map +1 -1
- package/build/stores/apps.d.ts.map +1 -1
- package/build/stores/apps.js +11 -0
- package/build/stores/apps.js.map +1 -1
- package/build/stores/bluetoothSettingKeys.d.ts.map +1 -1
- package/build/stores/bluetoothSettingKeys.js +2 -0
- package/build/stores/bluetoothSettingKeys.js.map +1 -1
- package/build/stores/gallerySync.d.ts +2 -0
- package/build/stores/gallerySync.d.ts.map +1 -1
- package/build/stores/gallerySync.js +2 -0
- package/build/stores/gallerySync.js.map +1 -1
- package/build/stores/glasses.d.ts.map +1 -1
- package/build/stores/glasses.js +3 -0
- package/build/stores/glasses.js.map +1 -1
- package/build/stores/settings.d.ts +17 -0
- package/build/stores/settings.d.ts.map +1 -1
- package/build/stores/settings.js +157 -17
- package/build/stores/settings.js.map +1 -1
- package/build/types/applet.d.ts +2 -0
- package/build/types/applet.d.ts.map +1 -1
- package/build/types/applet.js.map +1 -1
- package/build/types/asg.d.ts +7 -0
- package/build/types/asg.d.ts.map +1 -1
- package/build/types/asg.js.map +1 -1
- package/build/types/enums.d.ts +2 -25
- package/build/types/enums.d.ts.map +1 -1
- package/build/types/enums.js +2 -27
- package/build/types/enums.js.map +1 -1
- package/build/types/hardware.d.ts +4 -13
- package/build/types/hardware.d.ts.map +1 -1
- package/build/types/hardware.js +15 -3
- package/build/types/hardware.js.map +1 -1
- package/build/types/index.d.ts +2 -6
- package/build/types/index.d.ts.map +1 -1
- package/build/types/index.js +2 -6
- package/build/types/index.js.map +1 -1
- package/build/utils/configuredDevHost.d.ts +6 -0
- package/build/utils/configuredDevHost.d.ts.map +1 -0
- package/build/utils/configuredDevHost.js +19 -0
- package/build/utils/configuredDevHost.js.map +1 -0
- package/build/utils/devMiniappLaunch.d.ts +19 -8
- package/build/utils/devMiniappLaunch.d.ts.map +1 -1
- package/build/utils/devMiniappLaunch.js +144 -21
- package/build/utils/devMiniappLaunch.js.map +1 -1
- package/build/utils/diagnosticContext.d.ts.map +1 -1
- package/build/utils/diagnosticContext.js +15 -17
- package/build/utils/diagnosticContext.js.map +1 -1
- package/build/utils/hardware/hardware.d.ts.map +1 -1
- package/build/utils/hardware/hardware.js +7 -3
- package/build/utils/hardware/hardware.js.map +1 -1
- package/build/utils/miniappDiagnostics.d.ts +64 -0
- package/build/utils/miniappDiagnostics.d.ts.map +1 -0
- package/build/utils/miniappDiagnostics.js +173 -0
- package/build/utils/miniappDiagnostics.js.map +1 -0
- package/build/utils/permissions/MediaLibraryPermissions.d.ts +11 -0
- package/build/utils/permissions/MediaLibraryPermissions.d.ts.map +1 -1
- package/build/utils/permissions/MediaLibraryPermissions.js +27 -4
- package/build/utils/permissions/MediaLibraryPermissions.js.map +1 -1
- package/build/utils/timers/timers.d.ts.map +1 -1
- package/build/utils/timers/timers.js +55 -18
- package/build/utils/timers/timers.js.map +1 -1
- package/package.json +59 -31
- package/src/assets/silence.wav +0 -0
- package/src/bluetooth-sdk/debug.ts +1 -0
- package/src/bluetooth-sdk/index.ts +2 -0
- package/src/bluetooth-sdk/photo-receiver.ts +2 -0
- package/src/bluetooth-sdk/react.ts +1 -0
- package/src/bluetooth-sdk/types.ts +1 -0
- package/src/engine.ts +9 -4
- package/src/facades/dev.ts +17 -12
- package/src/facades/display.ts +1 -1
- package/src/facades/gallery.ts +1 -1
- package/src/facades/glasses.ts +20 -7
- package/src/facades/glassesSettings.ts +5 -0
- package/src/facades/miniapps.ts +7 -0
- package/src/facades/ota.ts +23 -8
- package/src/facades/pairing.ts +15 -11
- package/src/facades/permissions.ts +14 -0
- package/src/facades/phoneNotifications.ts +4 -13
- package/src/facades/speech.ts +21 -7
- package/src/generated/releaseMetadata.ts +20 -0
- package/src/index.ts +39 -13
- package/src/react/MentraLiveOtaFlow.tsx +856 -0
- package/src/react/index.ts +7 -0
- package/src/react/useEngineSnapshot.ts +16 -0
- package/src/runtime/bootstrap.ts +33 -1
- package/src/runtime/scanQrSeam.ts +20 -0
- package/src/services/AppRegistry.ts +240 -149
- package/src/services/AudioCloudUplink.ts +23 -1
- package/src/services/AudioPlaybackService.ts +287 -38
- package/src/services/BlobStore.ts +22 -9
- package/src/services/CloudAudioSubscriptionSync.ts +13 -1
- package/src/services/CloudClientService.ts +96 -1
- package/src/services/DeviceEventRouter.ts +5 -5
- package/src/services/ForegroundLocationPermission.ts +24 -0
- package/src/services/GlassesSettingsSync.ts +9 -3
- package/src/services/GlassesStatusProjection.ts +16 -8
- package/src/services/HotspotOtaTransport.ts +184 -0
- package/src/services/HotspotShutdown.ts +41 -0
- package/src/services/LocalDisplayManager.ts +112 -21
- package/src/services/LocalMiniappRuntime.ts +967 -346
- package/src/services/LocalMiniappStorage.ts +82 -0
- package/src/services/LocalMiniappUserIdentity.ts +46 -0
- package/src/services/LocalSttFallbackCoordinator.ts +19 -12
- package/src/services/MicStateCoordinator.ts +169 -4
- package/src/services/MiniappLauncher.ts +30 -3
- package/src/services/MiniappLiveness.ts +24 -0
- package/src/services/NativeHttpResponse.ts +6 -0
- package/src/services/OtaArtifactDownloader.ts +312 -0
- package/src/services/OtaAutoChain.ts +106 -0
- package/src/services/OtaErrorMapping.ts +80 -0
- package/src/services/OtaInstallCoordinator.ts +649 -144
- package/src/services/OtaService.ts +11 -5
- package/src/services/OtaUpdateCheckService.ts +181 -21
- package/src/services/PhoneCalendarHelpers.ts +212 -0
- package/src/services/PhoneCalendarService.ts +65 -0
- package/src/services/PhoneCameraFovCoordinator.ts +210 -0
- package/src/services/PhoneNotificationsSync.ts +12 -10
- package/src/services/PhonePhotoCoordinator.ts +116 -18
- package/src/services/PhoneStreamCoordinator.ts +139 -25
- package/src/services/PhoneVideoCoordinator.ts +11 -0
- package/src/services/SceneRenderer.ts +16 -0
- package/src/services/SentenceTtsPipeline.ts +106 -0
- package/src/services/SupportProfileSync.ts +218 -0
- package/src/services/TranscriptionRouting.ts +37 -0
- package/src/services/TtsTextSanitizer.ts +66 -0
- package/src/services/WifiAdbRequest.ts +53 -0
- package/src/services/asg/asgCameraApi.ts +615 -33
- package/src/services/asg/cameraRollExportCoordinator.ts +627 -0
- package/src/services/asg/cameraRollExportLedger.ts +122 -0
- package/src/services/asg/galleryNotices.ts +1 -0
- package/src/services/asg/galleryPathMigration.ts +22 -0
- package/src/services/asg/gallerySettingsService.ts +3 -0
- package/src/services/asg/gallerySyncService.ts +184 -73
- package/src/services/asg/galleryTransferLedger.ts +312 -0
- package/src/services/asg/localNetworkTransport.ts +169 -0
- package/src/services/asg/localStorageService.ts +179 -24
- package/src/services/asg/mediaProcessingQueue.ts +209 -62
- package/src/services/audioPlaybackAssets.ts +8 -0
- package/src/services/gallerySyncClock.ts +1 -1
- package/src/services/glassesClockSync.ts +6 -2
- package/src/services/manifestActions.ts +30 -0
- package/src/services/otaDisplayState.ts +58 -17
- package/src/services/otaInstallPolicy.ts +30 -4
- package/src/services/otaLegacyMapping.ts +1 -1
- package/src/services/otaManifestPolicy.ts +42 -0
- package/src/services/otaManifestUrl.ts +44 -0
- package/src/services/slimStreamStatus.ts +16 -5
- package/src/stores/apps.ts +12 -0
- package/src/stores/bluetoothSettingKeys.ts +2 -0
- package/src/stores/gallerySync.ts +4 -0
- package/src/stores/glasses.ts +3 -0
- package/src/stores/settings.ts +179 -18
- package/src/types/applet.ts +2 -0
- package/src/types/asg.ts +7 -0
- package/src/types/enums.ts +3 -28
- package/src/types/hardware.ts +20 -13
- package/src/types/index.ts +2 -6
- package/src/utils/configuredDevHost.ts +17 -0
- package/src/utils/devMiniappLaunch.ts +151 -23
- package/src/utils/diagnosticContext.ts +17 -17
- package/src/utils/hardware/hardware.ts +7 -9
- package/src/utils/miniappDiagnostics.ts +226 -0
- package/src/utils/permissions/MediaLibraryPermissions.ts +35 -4
- package/src/utils/timers/timers.ts +57 -21
- package/build/devtools.d.ts +0 -11
- package/build/devtools.d.ts.map +0 -1
- package/build/devtools.js +0 -13
- package/build/devtools.js.map +0 -1
- package/build/internal.d.ts +0 -66
- package/build/internal.d.ts.map +0 -1
- package/build/internal.js +0 -89
- package/build/internal.js.map +0 -1
- package/build/services/asgOtaVersionUrl.d.ts +0 -2
- package/build/services/asgOtaVersionUrl.d.ts.map +0 -1
- package/build/services/asgOtaVersionUrl.js +0 -36
- package/build/services/asgOtaVersionUrl.js.map +0 -1
- package/src/devtools.ts +0 -13
- package/src/internal.ts +0 -158
- package/src/services/asgOtaVersionUrl.ts +0 -41
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mentra/engine",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.1.0-dev.10",
|
|
4
4
|
"description": "Mentra Engine — miniapp registry, WebView bridge, and miniapp store",
|
|
5
5
|
"main": "build/index.js",
|
|
6
6
|
"react-native": "src/index.ts",
|
|
@@ -11,15 +11,35 @@
|
|
|
11
11
|
"react-native": "./src/index.ts",
|
|
12
12
|
"default": "./build/index.js"
|
|
13
13
|
},
|
|
14
|
-
"./
|
|
15
|
-
"types": "./build/
|
|
16
|
-
"react-native": "./src/
|
|
17
|
-
"default": "./build/
|
|
14
|
+
"./ota": {
|
|
15
|
+
"types": "./build/react/index.d.ts",
|
|
16
|
+
"react-native": "./src/react/index.ts",
|
|
17
|
+
"default": "./build/react/index.js"
|
|
18
18
|
},
|
|
19
|
-
"./
|
|
20
|
-
"types": "./build/
|
|
21
|
-
"react-native": "./src/
|
|
22
|
-
"default": "./build/
|
|
19
|
+
"./bluetooth-sdk": {
|
|
20
|
+
"types": "./build/bluetooth-sdk/index.d.ts",
|
|
21
|
+
"react-native": "./src/bluetooth-sdk/index.ts",
|
|
22
|
+
"default": "./build/bluetooth-sdk/index.js"
|
|
23
|
+
},
|
|
24
|
+
"./bluetooth-sdk/react": {
|
|
25
|
+
"types": "./build/bluetooth-sdk/react.d.ts",
|
|
26
|
+
"react-native": "./src/bluetooth-sdk/react.ts",
|
|
27
|
+
"default": "./build/bluetooth-sdk/react.js"
|
|
28
|
+
},
|
|
29
|
+
"./bluetooth-sdk/types": {
|
|
30
|
+
"types": "./build/bluetooth-sdk/types.d.ts",
|
|
31
|
+
"react-native": "./src/bluetooth-sdk/types.ts",
|
|
32
|
+
"default": "./build/bluetooth-sdk/types.js"
|
|
33
|
+
},
|
|
34
|
+
"./bluetooth-sdk/photo-receiver": {
|
|
35
|
+
"types": "./build/bluetooth-sdk/photo-receiver.d.ts",
|
|
36
|
+
"react-native": "./src/bluetooth-sdk/photo-receiver.ts",
|
|
37
|
+
"default": "./build/bluetooth-sdk/photo-receiver.js"
|
|
38
|
+
},
|
|
39
|
+
"./bluetooth-sdk/debug": {
|
|
40
|
+
"types": "./build/bluetooth-sdk/debug.d.ts",
|
|
41
|
+
"react-native": "./src/bluetooth-sdk/debug.ts",
|
|
42
|
+
"default": "./build/bluetooth-sdk/debug.js"
|
|
23
43
|
},
|
|
24
44
|
"./build/*": null,
|
|
25
45
|
"./src/*": null,
|
|
@@ -29,6 +49,10 @@
|
|
|
29
49
|
"build",
|
|
30
50
|
"README.md",
|
|
31
51
|
"src",
|
|
52
|
+
"!build/devtools.*",
|
|
53
|
+
"!build/internal.*",
|
|
54
|
+
"!src/devtools.ts",
|
|
55
|
+
"!src/internal.ts",
|
|
32
56
|
"!src/**/__tests__",
|
|
33
57
|
"!src/**/*.test.ts"
|
|
34
58
|
],
|
|
@@ -36,7 +60,10 @@
|
|
|
36
60
|
"build": "expo-module build",
|
|
37
61
|
"clean": "expo-module clean",
|
|
38
62
|
"lint": "expo-module lint",
|
|
39
|
-
"test": "
|
|
63
|
+
"test": "./scripts/test.sh && node --test scripts/*.test.mjs",
|
|
64
|
+
"write:release-metadata": "node scripts/write-release-metadata.mjs",
|
|
65
|
+
"verify:release-package": "node scripts/verify-release-package.mjs",
|
|
66
|
+
"test:public-api": "bun test src/bluetooth-sdk/__tests__/publicApi.test.ts",
|
|
40
67
|
"build:module": "expo-module prepare",
|
|
41
68
|
"prepublishOnly": "expo-module prepublishOnly",
|
|
42
69
|
"expo-module": "expo-module"
|
|
@@ -64,16 +91,17 @@
|
|
|
64
91
|
"registry": "https://registry.npmjs.org/"
|
|
65
92
|
},
|
|
66
93
|
"dependencies": {
|
|
94
|
+
"@mentra/bluetooth-sdk": "3.1.0-dev.10",
|
|
95
|
+
"@mentra/cloud-client": "3.1.0-dev.10",
|
|
96
|
+
"@mentra/cloud-protocol": "3.1.0-dev.10",
|
|
97
|
+
"@mentra/crust": "3.1.0-dev.10",
|
|
98
|
+
"@mentra/miniapp": "3.1.0-dev.10",
|
|
67
99
|
"buffer": "^6.0.3",
|
|
68
100
|
"events": "^3.3.0",
|
|
69
101
|
"semver": "^7.7.4",
|
|
70
102
|
"typesafe-ts": "^1.7.1"
|
|
71
103
|
},
|
|
72
104
|
"devDependencies": {
|
|
73
|
-
"@mentra/bluetooth-sdk": "workspace:*",
|
|
74
|
-
"@mentra/cloud-client": "workspace:*",
|
|
75
|
-
"@mentra/cloud-protocol": "workspace:*",
|
|
76
|
-
"@mentra/miniapp": "workspace:*",
|
|
77
105
|
"@types/semver": "^7.7.1",
|
|
78
106
|
"expo-module-scripts": "^55.0.2",
|
|
79
107
|
"expo-modules-core": "55.0.25",
|
|
@@ -81,26 +109,31 @@
|
|
|
81
109
|
"typescript": "~5.9.2"
|
|
82
110
|
},
|
|
83
111
|
"peerDependencies": {
|
|
84
|
-
"expo": "
|
|
85
|
-
"expo-modules-core": "
|
|
112
|
+
"expo": "~55.0.24",
|
|
113
|
+
"expo-modules-core": "~55.0.25",
|
|
86
114
|
"react": "*",
|
|
87
115
|
"react-native": "*",
|
|
116
|
+
"react-native-safe-area-context": "*",
|
|
117
|
+
"react-native-svg": "*",
|
|
88
118
|
"react-native-udp": "*",
|
|
89
119
|
"@types/react": "*",
|
|
90
120
|
"react-native-mmkv": "*",
|
|
91
121
|
"react-native-nitro-bg-timer": "*",
|
|
92
122
|
"react-native-nitro-modules": "*",
|
|
93
|
-
"react-native-reanimated": "
|
|
94
|
-
"
|
|
123
|
+
"react-native-reanimated": "4.2.1",
|
|
124
|
+
"react-native-worklets": "0.7.4",
|
|
125
|
+
"expo-file-system": "~55.0.20",
|
|
95
126
|
"react-native-zip-archive": "*",
|
|
96
127
|
"zustand": "*",
|
|
97
|
-
"expo-battery": "
|
|
98
|
-
"expo-audio": "
|
|
99
|
-
"expo-clipboard": "
|
|
100
|
-
"expo-
|
|
101
|
-
"expo-
|
|
102
|
-
"expo-
|
|
103
|
-
"expo-
|
|
128
|
+
"expo-battery": "^55.0.13",
|
|
129
|
+
"expo-audio": "~55.0.14",
|
|
130
|
+
"expo-clipboard": "~55.0.13",
|
|
131
|
+
"expo-calendar": "~55.0.14",
|
|
132
|
+
"expo-constants": "~55.0.16",
|
|
133
|
+
"expo-device": "~55.0.17",
|
|
134
|
+
"expo-location": "~55.1.10",
|
|
135
|
+
"expo-task-manager": "~55.0.16",
|
|
136
|
+
"expo-notifications": "~55.0.23",
|
|
104
137
|
"react-native-share": "*",
|
|
105
138
|
"react-native-localize": "*",
|
|
106
139
|
"react-native-ble-manager": "*",
|
|
@@ -109,11 +142,6 @@
|
|
|
109
142
|
"@react-native-community/netinfo": "*",
|
|
110
143
|
"@dr.pogodin/react-native-fs": "*",
|
|
111
144
|
"@craftzdog/react-native-buffer": "*",
|
|
112
|
-
"axios": "*"
|
|
113
|
-
"@mentra/bluetooth-sdk": "*",
|
|
114
|
-
"@mentra/crust": "^0.1.0-dev.0",
|
|
115
|
-
"@mentra/cloud-client": "^0.1.0-dev.0",
|
|
116
|
-
"@mentra/miniapp": "^0.3.0-dev.0",
|
|
117
|
-
"@mentra/cloud-protocol": "^0.1.0-dev.0"
|
|
145
|
+
"axios": "*"
|
|
118
146
|
}
|
|
119
147
|
}
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "@mentra/bluetooth-sdk/debug"
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "@mentra/bluetooth-sdk/react"
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "@mentra/bluetooth-sdk/types"
|
package/src/engine.ts
CHANGED
|
@@ -5,16 +5,17 @@
|
|
|
5
5
|
* name stays `engine` in code; the public API surface is `engine`.)
|
|
6
6
|
*
|
|
7
7
|
* It grows one facade at a time. The migration-era flat store/service exports
|
|
8
|
-
*
|
|
9
|
-
*
|
|
8
|
+
* remain in a private MentraOS host package; they shrink as screens move onto
|
|
9
|
+
* `engine.*`.
|
|
10
10
|
*/
|
|
11
|
-
import {configure, start as bootstrapStart, stop as bootstrapStop} from "./runtime/bootstrap"
|
|
11
|
+
import {configure, start as bootstrapStart, stop as bootstrapStop, updateUiSeams} from "./runtime/bootstrap"
|
|
12
12
|
import {cloudClientService} from "./services/CloudClientService"
|
|
13
13
|
import {hydrateDeviceStore, demoteOrphanedDefaultWearable} from "./services/DeviceStoreHydration"
|
|
14
14
|
import {startGlassesSettingsSync, stopGlassesSettingsSync} from "./services/GlassesSettingsSync"
|
|
15
15
|
import {startGlassesStatusProjection, stopGlassesStatusProjection} from "./services/GlassesStatusProjection"
|
|
16
16
|
import {startOtaService, stopOtaService} from "./services/OtaService"
|
|
17
17
|
import {startAudioCloudUplink, stopAudioCloudUplink} from "./services/AudioCloudUplink"
|
|
18
|
+
import {startSupportProfileSync, stopSupportProfileSync} from "./services/SupportProfileSync"
|
|
18
19
|
import {startDeviceEventRouter, stopDeviceEventRouter} from "./services/DeviceEventRouter"
|
|
19
20
|
import {startPhoneNotificationsSync, stopPhoneNotificationsSync} from "./services/PhoneNotificationsSync"
|
|
20
21
|
import {startCaptionsTesterReportService, stopCaptionsTesterReportService} from "./services/CaptionsTesterReportService"
|
|
@@ -45,6 +46,8 @@ import {logBuffer} from "./utils/devLogging"
|
|
|
45
46
|
export const engine = {
|
|
46
47
|
/** Front door — hand engine auth + config, then start/stop the runtime. */
|
|
47
48
|
configure,
|
|
49
|
+
/** Merge host-UI seams on a running runtime (scan overlay, wifi setup, …). */
|
|
50
|
+
updateUiSeams,
|
|
48
51
|
/** Start the runtime: mark started + construct/connect the cloud client + begin
|
|
49
52
|
* syncing device settings to the glasses. */
|
|
50
53
|
async start() {
|
|
@@ -59,7 +62,7 @@ export const engine = {
|
|
|
59
62
|
// Project native device status -> the engine stores (the inbound feed the rest
|
|
60
63
|
// of the runtime reads). Established first so the stores are live before the
|
|
61
64
|
// syncs below react to them.
|
|
62
|
-
startGlassesStatusProjection()
|
|
65
|
+
startGlassesStatusProjection((changed) => localMiniappRuntime.forwardEvent("glasses_connection_state", changed))
|
|
63
66
|
// Route the rest of the inbound device events (wifi/hotspot/gallery -> stores+bus,
|
|
64
67
|
// photo/stream -> coordinators, button/touch/accel/head -> miniapps, save_setting ->
|
|
65
68
|
// store, miniapp_selected -> launcher) so a bare OEM gets device data, not just the
|
|
@@ -96,6 +99,7 @@ export const engine = {
|
|
|
96
99
|
error instanceof Error ? error.message : error,
|
|
97
100
|
)
|
|
98
101
|
}
|
|
102
|
+
startSupportProfileSync()
|
|
99
103
|
// Push device-setting changes to the glasses for ANY host, so
|
|
100
104
|
// engine.glasses.settings.set() reaches the device (not just the Mentra app).
|
|
101
105
|
startGlassesSettingsSync()
|
|
@@ -135,6 +139,7 @@ export const engine = {
|
|
|
135
139
|
await safely("device event router", stopDeviceEventRouter)
|
|
136
140
|
await safely("ota service", stopOtaService)
|
|
137
141
|
await safely("audio cloud uplink", stopAudioCloudUplink)
|
|
142
|
+
await safely("support profile sync", stopSupportProfileSync)
|
|
138
143
|
await safely("phone notifications sync", stopPhoneNotificationsSync)
|
|
139
144
|
await safely("captions tester report service", stopCaptionsTesterReportService)
|
|
140
145
|
await safely("mentrajs crashloop report service", stopMentraJSCrashloopReportService)
|
package/src/facades/dev.ts
CHANGED
|
@@ -125,8 +125,9 @@ export const dev = {
|
|
|
125
125
|
/**
|
|
126
126
|
* Side-load a miniapp being served from a dev machine (the `mentra dev` / CLI
|
|
127
127
|
* flow) by its URL: probes `<url>/miniapp.json`, and on a reachable manifest
|
|
128
|
-
* registers it
|
|
129
|
-
* and can
|
|
128
|
+
* registers it under its manifest package so it appears in `engine.miniapps`
|
|
129
|
+
* and can coexist with other dev miniapps. This is the OEM-host equivalent
|
|
130
|
+
* of the first-party
|
|
130
131
|
* developer-URL screen — the registration itself is engine-internal, so a
|
|
131
132
|
* host reaches it here rather than the internal registry. Rendering still
|
|
132
133
|
* flows through the normal display path once the miniapp is started.
|
|
@@ -142,25 +143,29 @@ export const dev = {
|
|
|
142
143
|
return {ok: false, error: "dev server unreachable, or no miniapp.json served there"}
|
|
143
144
|
}
|
|
144
145
|
const manifest = result.manifest
|
|
146
|
+
const appName = name ?? manifest.name ?? "Dev Miniapp"
|
|
147
|
+
const packageName = (manifest.packageName as string | undefined) ?? DEV_APP_PACKAGE_NAME
|
|
148
|
+
// Persist the host that answered — not the stale input IP — so home-tile
|
|
149
|
+
// relaunches skip a dead LAN address after mDNS/Metro failover.
|
|
150
|
+
const resolvedUrl = result.resolvedUrl || devUrl
|
|
145
151
|
// The `mentra-miniapp dev` server puts the hot-reload/log sidecar on the
|
|
146
152
|
// user port PLUS ONE — same convention as the first-party developer-URL
|
|
147
153
|
// screen's deriveDevPort.
|
|
148
154
|
let devPort: number | undefined
|
|
149
155
|
try {
|
|
150
|
-
const parsed = Number(new URL(
|
|
156
|
+
const parsed = Number(new URL(resolvedUrl).port)
|
|
151
157
|
devPort = Number.isFinite(parsed) && parsed > 0 ? parsed + 1 : undefined
|
|
152
158
|
} catch {
|
|
153
159
|
devPort = undefined
|
|
154
160
|
}
|
|
155
|
-
const
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
// forcing packageName to the single dev slot.
|
|
160
|
-
packageName: (manifest.packageName as string | undefined) ?? DEV_APP_PACKAGE_NAME,
|
|
161
|
+
const existing = useAppStatusStore.getState().apps.find((app) => app.packageName === packageName)
|
|
162
|
+
if (existing?.running) await useAppStatusStore.getState().stop(packageName)
|
|
163
|
+
await registerDevApp({
|
|
164
|
+
packageName,
|
|
161
165
|
name: appName,
|
|
162
|
-
iconUrl: manifest.icon ? new URL(manifest.icon, `${
|
|
163
|
-
|
|
166
|
+
iconUrl: manifest.icon ? new URL(manifest.icon, `${resolvedUrl}/`).toString() : `${resolvedUrl}/icon.png`,
|
|
167
|
+
// Persist the host that answered — not the stale input IP.
|
|
168
|
+
devUrl: resolvedUrl,
|
|
164
169
|
devPort,
|
|
165
170
|
type: manifest.type as DevAppRecord["type"],
|
|
166
171
|
permissions: manifest.permissions as DevAppRecord["permissions"],
|
|
@@ -168,7 +173,7 @@ export const dev = {
|
|
|
168
173
|
actions: manifest.actions as DevAppRecord["actions"],
|
|
169
174
|
})
|
|
170
175
|
await useAppStatusStore.getState().refresh()
|
|
171
|
-
return {ok: true, packageName
|
|
176
|
+
return {ok: true, packageName, name: appName}
|
|
172
177
|
},
|
|
173
178
|
|
|
174
179
|
/** Current engine runtime status for engine-owned debug surfaces. */
|
package/src/facades/display.ts
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* glasses display for dev tools and escape-hatch use (normal rendering goes through
|
|
5
5
|
* the engine DisplayProcessor / layout system, not these).
|
|
6
6
|
*/
|
|
7
|
-
import BluetoothSdk from "@mentra/bluetooth-sdk
|
|
7
|
+
import BluetoothSdk from "@mentra/bluetooth-sdk"
|
|
8
8
|
import {displayMirror} from "./displayMirror"
|
|
9
9
|
|
|
10
10
|
export const display = {
|
package/src/facades/gallery.ts
CHANGED
|
@@ -22,7 +22,7 @@ function projectStatus() {
|
|
|
22
22
|
processingFiles: Array.from(progress.processingFiles),
|
|
23
23
|
processedFiles: s.processedFiles,
|
|
24
24
|
isSyncing: selectIssyncing(s),
|
|
25
|
-
isStarting:
|
|
25
|
+
isStarting: s.syncStarting,
|
|
26
26
|
glassesGallery: selectGlassesGalleryStatus(s),
|
|
27
27
|
// Copy: the snapshot must not hand callers a mutable reference into the store
|
|
28
28
|
// (each queue item is copied too — callers must not mutate them in place).
|
package/src/facades/glasses.ts
CHANGED
|
@@ -11,13 +11,14 @@
|
|
|
11
11
|
// surface, not the public entry. Relative path (the alias doesn't resolve in engine's
|
|
12
12
|
// standalone build); jest moduleNameMapper + tsconfig both resolve it.
|
|
13
13
|
import BluetoothSdk from "@mentra/bluetooth-sdk/internal"
|
|
14
|
-
import type {ButtonPressEvent, TouchEvent} from "@mentra/bluetooth-sdk
|
|
14
|
+
import type {ButtonPressEvent, ConnectOptions, Device, TouchEvent} from "@mentra/bluetooth-sdk"
|
|
15
15
|
import {useGlassesStore} from "../stores/glasses"
|
|
16
16
|
import {useSettingsStore, SETTINGS} from "../stores/settings"
|
|
17
17
|
import {hasDefaultDevice} from "../services/DeviceStoreHydration"
|
|
18
18
|
import {projectPairingIdentity} from "../services/PairingIdentity"
|
|
19
19
|
import {isGlassesConnected, isGlassesReady} from "../services/GlassesReadiness"
|
|
20
20
|
import {pushAllBluetoothSettings} from "../services/GlassesSettingsSync"
|
|
21
|
+
import {recordSupportProfileConnectionFailure} from "../services/SupportProfileSync"
|
|
21
22
|
import {getModelCapabilities, type DeviceTypes} from "../types"
|
|
22
23
|
import {glassesWifi} from "./glassesWifi"
|
|
23
24
|
import {glassesSettings} from "./glassesSettings"
|
|
@@ -62,6 +63,7 @@ function projectInfo() {
|
|
|
62
63
|
serialNumber: s.serialNumber,
|
|
63
64
|
buildNumber: s.buildNumber,
|
|
64
65
|
btMac: s.bluetoothMacAddress,
|
|
66
|
+
wifiMac: s.wifiMacAddress,
|
|
65
67
|
leftMac: s.leftMacAddress,
|
|
66
68
|
rightMac: s.rightMacAddress,
|
|
67
69
|
// Copy: the snapshot must not hand callers a mutable reference into the store.
|
|
@@ -81,20 +83,30 @@ export const glasses = {
|
|
|
81
83
|
* the glasses (this used to be a host-side step before `connectDefault`).
|
|
82
84
|
*/
|
|
83
85
|
connectDefault: async (): Promise<void> => {
|
|
84
|
-
|
|
85
|
-
|
|
86
|
+
try {
|
|
87
|
+
await pushAllBluetoothSettings()
|
|
88
|
+
await BluetoothSdk.connectDefault()
|
|
89
|
+
} catch (error) {
|
|
90
|
+
recordSupportProfileConnectionFailure(error, "connect_default")
|
|
91
|
+
throw error
|
|
92
|
+
}
|
|
86
93
|
},
|
|
87
94
|
disconnect: (): Promise<void> => BluetoothSdk.disconnect(),
|
|
88
95
|
forget: (): Promise<void> => BluetoothSdk.forget(),
|
|
89
96
|
/** Connect to a specific (discovered) device. */
|
|
90
|
-
connect: async (
|
|
91
|
-
|
|
92
|
-
|
|
97
|
+
connect: async (device: Device, options?: ConnectOptions): Promise<void> => {
|
|
98
|
+
try {
|
|
99
|
+
await pushAllBluetoothSettings()
|
|
100
|
+
await BluetoothSdk.connect(device, options)
|
|
101
|
+
} catch (error) {
|
|
102
|
+
recordSupportProfileConnectionFailure(error, "connect")
|
|
103
|
+
throw error
|
|
104
|
+
}
|
|
93
105
|
},
|
|
94
106
|
/** Connect the built-in simulated glasses (dev/testing). */
|
|
95
107
|
connectSimulated: (): Promise<void> => BluetoothSdk.connectSimulated(),
|
|
96
108
|
/** Set a device as the `connectDefault()` target. */
|
|
97
|
-
setDefault: (
|
|
109
|
+
setDefault: (device: Device | null): Promise<void> => BluetoothSdk.setDefaultDevice(device),
|
|
98
110
|
/**
|
|
99
111
|
* Reconnect to the saved default glasses. Resolves `false` when there's nothing to
|
|
100
112
|
* reconnect to (no default paired) or the connect attempt fails (e.g. BLE powered
|
|
@@ -110,6 +122,7 @@ export const glasses = {
|
|
|
110
122
|
await pushAllBluetoothSettings()
|
|
111
123
|
await BluetoothSdk.connectDefault()
|
|
112
124
|
} catch (error) {
|
|
125
|
+
recordSupportProfileConnectionFailure(error, "reconnect")
|
|
113
126
|
console.warn("engine.glasses.reconnect failed:", error)
|
|
114
127
|
return false
|
|
115
128
|
}
|
|
@@ -22,6 +22,7 @@ const INTERNAL_KEYS = new Set<string>([
|
|
|
22
22
|
SETTINGS.default_wearable.key,
|
|
23
23
|
SETTINGS.device_name.key,
|
|
24
24
|
SETTINGS.device_address.key,
|
|
25
|
+
SETTINGS.project_name.key,
|
|
25
26
|
SETTINGS.pending_controller.key,
|
|
26
27
|
SETTINGS.default_controller.key,
|
|
27
28
|
SETTINGS.controller_device_name.key,
|
|
@@ -54,3 +55,7 @@ export const glassesSettings = {
|
|
|
54
55
|
// Copy: callers must not be able to mutate the module-level key list.
|
|
55
56
|
available: (): string[] => [...DEVICE_KEYS],
|
|
56
57
|
}
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
|
package/src/facades/miniapps.ts
CHANGED
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
* `<WebView>` wired to them. This facade is the lifecycle half.
|
|
10
10
|
*/
|
|
11
11
|
import {useAppStatusStore} from "../stores/apps"
|
|
12
|
+
import localMiniappRuntime from "../services/LocalMiniappRuntime"
|
|
12
13
|
import type {ClientApp} from "../types"
|
|
13
14
|
|
|
14
15
|
type AppsState = ReturnType<typeof useAppStatusStore.getState>
|
|
@@ -29,6 +30,12 @@ export const miniapps = {
|
|
|
29
30
|
})
|
|
30
31
|
},
|
|
31
32
|
|
|
33
|
+
/** Miniapps actively subscribed to Mentra Live hardware-button events. */
|
|
34
|
+
buttonPressSubscribers: (): string[] => localMiniappRuntime.getButtonPressSubscribers(),
|
|
35
|
+
/** Observe the active Mentra Live hardware-button subscriber set. */
|
|
36
|
+
onButtonPressSubscribersChanged: (cb: (packageNames: string[]) => void): (() => void) =>
|
|
37
|
+
localMiniappRuntime.onButtonPressSubscribersChanged(cb),
|
|
38
|
+
|
|
32
39
|
/** Re-fetch the installed-app list from the backend. */
|
|
33
40
|
refresh: () => useAppStatusStore.getState().refresh(),
|
|
34
41
|
/** Start (foreground) a miniapp. */
|
package/src/facades/ota.ts
CHANGED
|
@@ -1,18 +1,20 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* ota facade — `engine.ota`: the OEM-facing OTA read/observe surface. Engine's
|
|
3
3
|
* OtaService projects the glasses' OTA BLE events into the engine store; this facade
|
|
4
|
-
* exposes the snapshot + change subscriptions the
|
|
5
|
-
*
|
|
4
|
+
* exposes the snapshot + change subscriptions behind the shared OTA flow exported by
|
|
5
|
+
* `@mentra/engine/ota`. Hosts retain only their surrounding navigation and theme/i18n adapters.
|
|
6
6
|
*
|
|
7
7
|
* Availability checks live in engine. Install orchestration lives in engine too:
|
|
8
8
|
* `installSession` fronts the OtaInstallCoordinator state machine (WP 8B) — the host
|
|
9
9
|
* progress screen is a pure renderer over its snapshot + attach/detach/retry/finish.
|
|
10
10
|
*/
|
|
11
11
|
import BluetoothSdk from "@mentra/bluetooth-sdk/internal"
|
|
12
|
-
import type {OtaProgress, OtaProgressStatus, OtaStatus, OtaUpdateInfo} from "@mentra/bluetooth-sdk
|
|
12
|
+
import type {OtaProgress, OtaProgressStatus, OtaStartAckEvent, OtaStatus, OtaUpdateInfo} from "@mentra/bluetooth-sdk"
|
|
13
13
|
import {isGlassesConnected, useGlassesStore} from "../stores/glasses"
|
|
14
|
-
import {
|
|
14
|
+
import {resolveOtaManifestUrl} from "../services/otaManifestUrl"
|
|
15
15
|
import {otaInstallCoordinator, type OtaInstallSnapshot} from "../services/OtaInstallCoordinator"
|
|
16
|
+
import {startGlassesStatusProjection} from "../services/GlassesStatusProjection"
|
|
17
|
+
import {startOtaService} from "../services/OtaService"
|
|
16
18
|
import {
|
|
17
19
|
checkCurrentGlassesForUpdate,
|
|
18
20
|
type OtaCheckCurrentGlassesOptions,
|
|
@@ -26,9 +28,10 @@ function projectSnapshot() {
|
|
|
26
28
|
buildNumber: s.buildNumber || null,
|
|
27
29
|
mtkFirmwareVersion: s.mtkFirmwareVersion || null,
|
|
28
30
|
besFirmwareVersion: s.besFirmwareVersion || null,
|
|
31
|
+
hotspotOtaVersion: s.hotspotOtaVersion ?? 0,
|
|
29
32
|
wifiConnected: s.wifi.state === "connected",
|
|
30
33
|
wifiStatusKnown: s.wifiStatusKnown,
|
|
31
|
-
manifestUrl:
|
|
34
|
+
manifestUrl: resolveOtaManifestUrl(s.otaVersionUrl, s.buildNumber),
|
|
32
35
|
updateAvailable: s.otaUpdateAvailable,
|
|
33
36
|
status: s.otaStatus,
|
|
34
37
|
legacyProgress: s.otaProgress,
|
|
@@ -50,13 +53,23 @@ export type {
|
|
|
50
53
|
|
|
51
54
|
export const ota = {
|
|
52
55
|
// --- actions ---
|
|
56
|
+
/**
|
|
57
|
+
* Start the device-status and OTA projections without starting the authenticated
|
|
58
|
+
* cloud/miniapp runtime. This is the explicit entry point for Bluetooth-only hosts.
|
|
59
|
+
* Idempotent and safe when the full engine runtime is already running.
|
|
60
|
+
*/
|
|
61
|
+
initialize: async () => {
|
|
62
|
+
const hydrated = startGlassesStatusProjection()
|
|
63
|
+
startOtaService()
|
|
64
|
+
await hydrated
|
|
65
|
+
},
|
|
53
66
|
/**
|
|
54
67
|
* Start the firmware install with the resolved OTA manifest URL. Progress lands on
|
|
55
|
-
* `status()`/`onStatus()`. (The host resolves the manifest URL —
|
|
56
|
-
* resolution stays with the OTA config; the
|
|
68
|
+
* `status()`/`onStatus()`. (The host resolves the manifest URL — developer override,
|
|
69
|
+
* host pin, or Engine release pin resolution stays with the OTA config; the stuck/retry watchdog is its own
|
|
57
70
|
* resilience layer on top of this command.)
|
|
58
71
|
*/
|
|
59
|
-
install: (
|
|
72
|
+
install: (otaVersionUrl?: string | null): Promise<OtaStartAckEvent> => BluetoothSdk.startOtaUpdate(otaVersionUrl),
|
|
60
73
|
// Deferred: this facade entry was intended to become the engine-owned retry/check
|
|
61
74
|
// action, but BluetoothSdk.checkForOtaUpdate() only returns a boolean. Exposing it
|
|
62
75
|
// here would make callers think the rich otaUpdateAvailable read model is refreshed,
|
|
@@ -115,6 +128,8 @@ export const ota = {
|
|
|
115
128
|
* the snapshot; every watchdog/retry/reconnect rule lives in the coordinator.
|
|
116
129
|
*/
|
|
117
130
|
installSession: {
|
|
131
|
+
/** Select Wi-Fi or capability-gated hotspot transport for this checked manifest. */
|
|
132
|
+
prepare: (result: OtaCheckCurrentGlassesResult) => otaInstallCoordinator.prepare(result),
|
|
118
133
|
/** Bind the machine to the mounted progress screen. Idempotent per attach/detach cycle. */
|
|
119
134
|
attach: () => otaInstallCoordinator.attach(),
|
|
120
135
|
/** Unbind on unmount: clears all timers/listeners and resets session state. */
|
package/src/facades/pairing.ts
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
// target hint) lives on the full surface, not the public entry (same reason
|
|
11
11
|
// the glasses facade imports internal).
|
|
12
12
|
import BluetoothSdk from "@mentra/bluetooth-sdk/internal"
|
|
13
|
-
import type {ConnectOptions, Device, PairFailureEvent, GlassesNotReadyEvent} from "@mentra/bluetooth-sdk"
|
|
13
|
+
import type {ConnectOptions, Device, DeviceModel, PairFailureEvent, GlassesNotReadyEvent} from "@mentra/bluetooth-sdk"
|
|
14
14
|
import {useCoreStore} from "../stores/core"
|
|
15
15
|
import {useGlassesStore} from "../stores/glasses"
|
|
16
16
|
import {hasDefaultDevice} from "../services/DeviceStoreHydration"
|
|
@@ -206,7 +206,7 @@ export const pairing = {
|
|
|
206
206
|
markPendingSelection: (model: string) => markPendingSelection(model),
|
|
207
207
|
|
|
208
208
|
/** Start scanning for nearby glasses. Results land on `searchResults()`/`onFound()`. */
|
|
209
|
-
scan: (
|
|
209
|
+
scan: (model: DeviceModel): Promise<void> => BluetoothSdk.startScan(model),
|
|
210
210
|
/** Whether a scan is currently in progress. */
|
|
211
211
|
scanning: (): boolean => useCoreStore.getState().searching,
|
|
212
212
|
/** Subscribe to scan-in-progress changes; fires only when it changes. Returns an unsubscribe. */
|
|
@@ -226,7 +226,7 @@ export const pairing = {
|
|
|
226
226
|
// leak as mutable references into the store.
|
|
227
227
|
searchResults: () => useCoreStore.getState().searchResults.map((result) => ({...result})),
|
|
228
228
|
/** Subscribe to scan-result changes; fires only when they change. Returns an unsubscribe. */
|
|
229
|
-
onFound: (cb: (results:
|
|
229
|
+
onFound: (cb: (results: Device[]) => void): (() => void) => {
|
|
230
230
|
let last = JSON.stringify(useCoreStore.getState().searchResults)
|
|
231
231
|
return useCoreStore.subscribe(() => {
|
|
232
232
|
const results = useCoreStore.getState().searchResults
|
|
@@ -250,7 +250,7 @@ export const pairing = {
|
|
|
250
250
|
return BluetoothSdk.connect(device, {...options, saveAsDefault: false})
|
|
251
251
|
},
|
|
252
252
|
/** Set a device as the default for subsequent `glasses.connectDefault()`. */
|
|
253
|
-
setDefault: (
|
|
253
|
+
setDefault: (device: Device | null): Promise<void> => BluetoothSdk.setDefaultDevice(device),
|
|
254
254
|
/**
|
|
255
255
|
* Prime the native Bluetooth Classic audio watcher with the picked device.
|
|
256
256
|
* The iOS Mentra Live flow pairs Classic audio BEFORE any BLE connect
|
|
@@ -291,25 +291,29 @@ export const pairing = {
|
|
|
291
291
|
await BluetoothSdk.stopScan()
|
|
292
292
|
return
|
|
293
293
|
}
|
|
294
|
-
await BluetoothSdk.disconnect()
|
|
295
294
|
if (projectPairingIdentity().kind === "paired") {
|
|
296
295
|
// The persisted settings describe a COMPLETE pairing: restore it to
|
|
297
296
|
// native (the attempt's connect-by-name overwrote the native
|
|
298
297
|
// device_name; and if native somehow lost its default entirely, this
|
|
299
298
|
// repairs the divergence instead of forgetting a real pairing).
|
|
300
299
|
console.log("PairingIdentity: abandonAttempt — preserving pairing; attempt cancelled, native identity re-seeded")
|
|
300
|
+
await BluetoothSdk.disconnect()
|
|
301
301
|
await pushAllBluetoothSettings()
|
|
302
|
-
|
|
302
|
+
return
|
|
303
|
+
}
|
|
304
|
+
if (nativeHasDefault) {
|
|
303
305
|
// Mid-relay: native promoted and its echoes are still landing — the
|
|
304
306
|
// incomplete JS snapshot must not be pushed over the fresher native
|
|
305
307
|
// identity (the on-connect replay's race). Native holds the truth.
|
|
306
308
|
console.log("PairingIdentity: abandonAttempt — preserving pairing; JS identity mid-relay, native kept as-is")
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
// persisted pairing — a genuinely partial attempt.
|
|
310
|
-
console.log("PairingIdentity: abandonAttempt — no pairing on either layer; forgetting the partial attempt")
|
|
311
|
-
await BluetoothSdk.forget()
|
|
309
|
+
await BluetoothSdk.disconnect()
|
|
310
|
+
return
|
|
312
311
|
}
|
|
312
|
+
// Partial attempt: forget owns teardown. Do NOT disconnect() first — that
|
|
313
|
+
// nulls the MentraLive SGC and used to skip Classic removeBond, leaving
|
|
314
|
+
// IBRT ACL up so glasses never re-advertise for the next scan.
|
|
315
|
+
console.log("PairingIdentity: abandonAttempt — no pairing on either layer; forgetting the partial attempt")
|
|
316
|
+
await BluetoothSdk.forget()
|
|
313
317
|
},
|
|
314
318
|
|
|
315
319
|
/** Subscribe to pairing failures; returns an unsubscribe. */
|
|
@@ -17,6 +17,7 @@ export const PermissionFeatures = {
|
|
|
17
17
|
CAMERA: "camera",
|
|
18
18
|
CALENDAR: "calendar",
|
|
19
19
|
LOCATION: "location",
|
|
20
|
+
LOCAL_WIFI: "local_wifi",
|
|
20
21
|
BACKGROUND_LOCATION: "background_location",
|
|
21
22
|
BLUETOOTH: "bluetooth",
|
|
22
23
|
PHONE_STATE: "phone_state",
|
|
@@ -27,6 +28,13 @@ const ANDROID = PermissionsAndroid.PERMISSIONS
|
|
|
27
28
|
const apiLevel = typeof Platform.Version === "number" ? Platform.Version : parseInt(String(Platform.Version), 10)
|
|
28
29
|
const requiresSeparateAndroidBackgroundLocation = apiLevel >= 29
|
|
29
30
|
|
|
31
|
+
export function localWifiPermissionForAndroid(
|
|
32
|
+
androidApiLevel: number,
|
|
33
|
+
androidPermissions: typeof PermissionsAndroid.PERMISSIONS = ANDROID,
|
|
34
|
+
): AndroidPermission {
|
|
35
|
+
return androidApiLevel >= 33 ? androidPermissions.NEARBY_WIFI_DEVICES : androidPermissions.ACCESS_FINE_LOCATION
|
|
36
|
+
}
|
|
37
|
+
|
|
30
38
|
async function areAndroidPermissionsGranted(perms: AndroidPermission[]): Promise<boolean> {
|
|
31
39
|
for (const p of perms) {
|
|
32
40
|
if (!(await PermissionsAndroid.check(p))) return false
|
|
@@ -66,6 +74,8 @@ function iosPerms(feature: string): Permission[] {
|
|
|
66
74
|
return [PERMISSIONS.IOS.CALENDARS]
|
|
67
75
|
case PermissionFeatures.LOCATION:
|
|
68
76
|
return [PERMISSIONS.IOS.LOCATION_WHEN_IN_USE]
|
|
77
|
+
case PermissionFeatures.LOCAL_WIFI:
|
|
78
|
+
return []
|
|
69
79
|
case PermissionFeatures.BACKGROUND_LOCATION:
|
|
70
80
|
// iOS won't grant ALWAYS without WHEN_IN_USE first — request both (matches
|
|
71
81
|
// the host PermissionsUtils mapping), else a cold request can't escalate.
|
|
@@ -84,10 +94,14 @@ function androidPerms(feature: string): AndroidPermission[] {
|
|
|
84
94
|
case PermissionFeatures.CAMERA:
|
|
85
95
|
return [ANDROID.CAMERA]
|
|
86
96
|
case PermissionFeatures.CALENDAR:
|
|
97
|
+
// Expo Calendar requires both grants on Android, including for read APIs.
|
|
98
|
+
// The miniapp-facing calendar API remains read-only.
|
|
87
99
|
return [ANDROID.READ_CALENDAR, ANDROID.WRITE_CALENDAR]
|
|
88
100
|
case PermissionFeatures.LOCATION:
|
|
89
101
|
case PermissionFeatures.BACKGROUND_LOCATION:
|
|
90
102
|
return [ANDROID.ACCESS_FINE_LOCATION]
|
|
103
|
+
case PermissionFeatures.LOCAL_WIFI:
|
|
104
|
+
return [localWifiPermissionForAndroid(apiLevel)]
|
|
91
105
|
case PermissionFeatures.PHONE_STATE:
|
|
92
106
|
return [ANDROID.READ_PHONE_STATE]
|
|
93
107
|
case PermissionFeatures.BLUETOOTH:
|
|
@@ -3,25 +3,16 @@
|
|
|
3
3
|
* notifications to the glasses, with a per-app blocklist. Android-only (the
|
|
4
4
|
* NotificationListenerService); the getters return sensible defaults on iOS.
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
* listener); the installed-apps list +
|
|
6
|
+
* The per-app blocklist is an engine setting (auto-synced to the native
|
|
7
|
+
* listener); the installed-apps list + listener permission are CrustModule.
|
|
8
|
+
* Capture itself is controlled only by Android notification access and the
|
|
9
|
+
* hidden operational kill switch.
|
|
8
10
|
*/
|
|
9
11
|
import {Platform} from "react-native"
|
|
10
12
|
import CrustModule from "@mentra/crust"
|
|
11
13
|
import {useSettingsStore, SETTINGS} from "../stores/settings"
|
|
12
14
|
|
|
13
15
|
export const phoneNotifications = {
|
|
14
|
-
/** Is phone-notification forwarding enabled? (false on iOS) */
|
|
15
|
-
enabled: (): boolean => {
|
|
16
|
-
if (Platform.OS !== "android") return false
|
|
17
|
-
return useSettingsStore.getState().getSetting(SETTINGS.notifications_enabled.key) ?? true
|
|
18
|
-
},
|
|
19
|
-
/** Enable/disable phone-notification forwarding. (no-op on iOS) */
|
|
20
|
-
setEnabled: (enabled: boolean) => {
|
|
21
|
-
if (Platform.OS !== "android") return
|
|
22
|
-
return useSettingsStore.getState().setSetting(SETTINGS.notifications_enabled.key, enabled)
|
|
23
|
-
},
|
|
24
|
-
|
|
25
16
|
/** The phone's installed apps (package, name, icon). (empty on iOS) */
|
|
26
17
|
installedApps: (): Promise<Array<{packageName: string; appName: string; icon: string | null}>> => {
|
|
27
18
|
if (Platform.OS !== "android") return Promise.resolve([])
|