@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
|
@@ -21,11 +21,13 @@ import { unzip } from "react-native-zip-archive";
|
|
|
21
21
|
import semver from "semver";
|
|
22
22
|
import { result as Res } from "typesafe-ts";
|
|
23
23
|
import { HardwareRequirementLevel, HardwareType } from "../types";
|
|
24
|
-
import {
|
|
24
|
+
import { configuredDevHost } from "../utils/configuredDevHost";
|
|
25
25
|
import { storage } from "../utils/storage/storage";
|
|
26
26
|
import { printDirectory } from "../utils/storage/zip";
|
|
27
27
|
import { checkManifestVersions } from "./manifestVersionGate";
|
|
28
|
+
import { normalizeManifestActions } from "./manifestActions";
|
|
28
29
|
import { miniappRunningRegistry } from "./MiniappRunningRegistry";
|
|
30
|
+
export { normalizeManifestActions } from "./manifestActions";
|
|
29
31
|
const ALLOWED_PERMISSION_TYPES = new Set([
|
|
30
32
|
"MICROPHONE",
|
|
31
33
|
"CAMERA",
|
|
@@ -66,29 +68,6 @@ export function normalizeManifestPermissions(raw) {
|
|
|
66
68
|
function normalizeManifestType(raw) {
|
|
67
69
|
return raw === "background" || raw === "system_dashboard" || raw === "standard" ? raw : "standard";
|
|
68
70
|
}
|
|
69
|
-
/**
|
|
70
|
-
* Normalize a manifest's `actions` into DeclaredAction[]. Defensive — keeps only
|
|
71
|
-
* well-formed `{id, description}` entries (installed/dev bundles may be
|
|
72
|
-
* malformed). Shared by installed (disk) and dev-sideload projection so both
|
|
73
|
-
* surface declared actions to session.miniapps.list + the invoke gate.
|
|
74
|
-
*/
|
|
75
|
-
export function normalizeManifestActions(raw) {
|
|
76
|
-
if (!Array.isArray(raw))
|
|
77
|
-
return [];
|
|
78
|
-
const out = [];
|
|
79
|
-
for (const a of raw) {
|
|
80
|
-
if (a && typeof a.id === "string" && typeof a.description === "string") {
|
|
81
|
-
out.push({
|
|
82
|
-
id: a.id,
|
|
83
|
-
description: a.description,
|
|
84
|
-
...(a.parameters && typeof a.parameters === "object"
|
|
85
|
-
? { parameters: a.parameters }
|
|
86
|
-
: {}),
|
|
87
|
-
});
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
return out;
|
|
91
|
-
}
|
|
92
71
|
/**
|
|
93
72
|
* Convert declared hardwareRequirements from a miniapp.json manifest into
|
|
94
73
|
* runtime `HardwareRequirement[]`, always appending `{EXIST, REQUIRED}` so
|
|
@@ -132,6 +111,9 @@ export function buildHardwareRequirements(raw, packageName) {
|
|
|
132
111
|
out.push({ type: HardwareType.EXIST, level: HardwareRequirementLevel.REQUIRED });
|
|
133
112
|
return out;
|
|
134
113
|
}
|
|
114
|
+
function releaseIdentityKey(packageName, version) {
|
|
115
|
+
return `miniapp_release_identity:${packageName}:${version}`;
|
|
116
|
+
}
|
|
135
117
|
/**
|
|
136
118
|
* Download a miniapp zip from `url` into the cache and return its local path.
|
|
137
119
|
*
|
|
@@ -408,7 +390,7 @@ class AppRegistry {
|
|
|
408
390
|
return Res.try_async(async () => {
|
|
409
391
|
const { packageName, version } = await downloadAndInstallMiniApp(url, opts?.versionOverride);
|
|
410
392
|
console.log("APP_REGISTRY: Downloaded and installed mini app");
|
|
411
|
-
this.finalizeInstall(packageName, version);
|
|
393
|
+
this.finalizeInstall(packageName, version, opts?.releaseIdentity ?? { source: version.startsWith("dev-") ? "dev_snapshot" : "direct_download" });
|
|
412
394
|
});
|
|
413
395
|
}
|
|
414
396
|
/**
|
|
@@ -422,7 +404,7 @@ class AppRegistry {
|
|
|
422
404
|
return Res.try_async(async () => {
|
|
423
405
|
const { packageName, version } = await unpackMiniApp(zipPath, opts?.versionOverride);
|
|
424
406
|
console.log("APP_REGISTRY: Installed mini app from local zip");
|
|
425
|
-
this.finalizeInstall(packageName, version);
|
|
407
|
+
this.finalizeInstall(packageName, version, opts?.releaseIdentity ?? { source: "bundled_asset" });
|
|
426
408
|
return { packageName, version };
|
|
427
409
|
});
|
|
428
410
|
}
|
|
@@ -431,7 +413,7 @@ class AppRegistry {
|
|
|
431
413
|
* artifacts on release installs, point the active-version at the just-
|
|
432
414
|
* installed bundle, and notify subscribers to refresh.
|
|
433
415
|
*/
|
|
434
|
-
finalizeInstall(packageName, version) {
|
|
416
|
+
finalizeInstall(packageName, version, releaseIdentity) {
|
|
435
417
|
// If this is a release install (semver, not dev-*) of a package that
|
|
436
418
|
// currently has dev-* snapshots, clear the dev state so the swap to
|
|
437
419
|
// "released" is clean. Otherwise the dev version would keep winning
|
|
@@ -442,9 +424,14 @@ class AppRegistry {
|
|
|
442
424
|
this.clearDevArtifacts(packageName);
|
|
443
425
|
}
|
|
444
426
|
this.setActiveVersion(packageName, version);
|
|
427
|
+
storage.save(releaseIdentityKey(packageName, version), releaseIdentity);
|
|
445
428
|
this.refreshNeeded = true;
|
|
446
429
|
this.notify();
|
|
447
430
|
}
|
|
431
|
+
getReleaseIdentity(packageName, version) {
|
|
432
|
+
const result = storage.load(releaseIdentityKey(packageName, version));
|
|
433
|
+
return result.is_ok() ? result.value : null;
|
|
434
|
+
}
|
|
448
435
|
installFromJsonUrl(baseUrl) {
|
|
449
436
|
return Res.try_async(async () => {
|
|
450
437
|
const trimmed = baseUrl.replace(/\/$/, "");
|
|
@@ -479,6 +466,7 @@ class AppRegistry {
|
|
|
479
466
|
for (const item of pkgDir.list()) {
|
|
480
467
|
if (item instanceof Directory && item.name.startsWith("dev-")) {
|
|
481
468
|
try {
|
|
469
|
+
storage.remove(releaseIdentityKey(packageName, item.name));
|
|
482
470
|
item.delete();
|
|
483
471
|
}
|
|
484
472
|
catch (e) {
|
|
@@ -493,17 +481,13 @@ class AppRegistry {
|
|
|
493
481
|
}
|
|
494
482
|
storage.remove(`${packageName}_dev_url`);
|
|
495
483
|
storage.remove(`${packageName}_dev_port`);
|
|
484
|
+
storage.remove(`${packageName}_dev_mdns`);
|
|
496
485
|
storage.remove(`${packageName}_dev_last_reachable`);
|
|
497
|
-
//
|
|
498
|
-
//
|
|
499
|
-
//
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
// real manifest package currently occupying the slot. Otherwise a release install/uninstall of
|
|
503
|
-
// an UNRELATED package would wipe the active dev tile.
|
|
504
|
-
if (packageName === DEV_APP_PACKAGE_NAME || packageName === getDevAppSourcePackage()) {
|
|
505
|
-
unregisterDevApp();
|
|
506
|
-
}
|
|
486
|
+
// HTTP-direct dev miniapps are indexed by their real package name. A
|
|
487
|
+
// release install/uninstall of that same package should remove only its
|
|
488
|
+
// dev tile; unrelated dev miniapps must remain available.
|
|
489
|
+
if (readDevAppRecord(packageName))
|
|
490
|
+
unregisterDevApp(packageName);
|
|
507
491
|
}
|
|
508
492
|
/**
|
|
509
493
|
* Garbage-collect older `dev-*` version directories for this package,
|
|
@@ -544,6 +528,7 @@ class AppRegistry {
|
|
|
544
528
|
// so an unconditional delete() would throw and abort the cleanup below.
|
|
545
529
|
if (lmaDir.exists)
|
|
546
530
|
lmaDir.delete();
|
|
531
|
+
storage.remove(releaseIdentityKey(packageName, version));
|
|
547
532
|
console.log("APP_REGISTRY: Uninstalled mini app version", version);
|
|
548
533
|
const packageDir = new Directory(Paths.document, "lmas", packageName);
|
|
549
534
|
if (packageDir.exists && packageDir.list().length === 0) {
|
|
@@ -551,6 +536,9 @@ class AppRegistry {
|
|
|
551
536
|
}
|
|
552
537
|
}
|
|
553
538
|
else {
|
|
539
|
+
for (const installedVersion of this.getInstalledVersions(packageName)) {
|
|
540
|
+
storage.remove(releaseIdentityKey(packageName, installedVersion));
|
|
541
|
+
}
|
|
554
542
|
const packageDir = new Directory(Paths.document, "lmas", packageName);
|
|
555
543
|
if (packageDir.exists) {
|
|
556
544
|
packageDir.delete();
|
|
@@ -646,26 +634,19 @@ class AppRegistry {
|
|
|
646
634
|
}
|
|
647
635
|
return out;
|
|
648
636
|
}
|
|
649
|
-
/**
|
|
650
|
-
* Read the lmas/ tree and return one ClientApp per installed package,
|
|
651
|
-
* picking each package's active version. The store/host overlays runtime
|
|
652
|
-
* state (loading, hidden, compatibility) on top of these.
|
|
653
|
-
*
|
|
654
|
-
* `running` reflects MiniappHost mount state via miniappRunningRegistry.
|
|
655
|
-
*/
|
|
656
637
|
/**
|
|
657
638
|
* Merge disk-derived apps with the projected dev + offline layers,
|
|
658
|
-
* de-duping by packageName.
|
|
659
|
-
*
|
|
660
|
-
*
|
|
639
|
+
* de-duping by packageName. An active dev registration wins over an older
|
|
640
|
+
* disk install of the same package; installing a release clears that dev
|
|
641
|
+
* registration in finalizeInstall. Native offline apps keep top priority.
|
|
661
642
|
*/
|
|
662
643
|
mergeProjectedApps(diskApps) {
|
|
663
|
-
const seen = new Set(diskApps.map((a) => a.packageName));
|
|
664
644
|
const offline = this.projectOfflineApps();
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
const
|
|
668
|
-
|
|
645
|
+
const offlinePackages = new Set(offline.map((app) => app.packageName));
|
|
646
|
+
const dev = this.projectDevApps().filter((app) => !offlinePackages.has(app.packageName));
|
|
647
|
+
const devPackages = new Set(dev.map((app) => app.packageName));
|
|
648
|
+
const installed = diskApps.filter((app) => !offlinePackages.has(app.packageName) && !devPackages.has(app.packageName));
|
|
649
|
+
return [...installed, ...dev, ...offline];
|
|
669
650
|
}
|
|
670
651
|
async getInstalledMiniapps() {
|
|
671
652
|
if (!this.refreshNeeded && this.cachedApps.length > 0) {
|
|
@@ -799,6 +780,21 @@ class AppRegistry {
|
|
|
799
780
|
this.refreshNeeded = true;
|
|
800
781
|
this.notify();
|
|
801
782
|
}
|
|
783
|
+
/**
|
|
784
|
+
* Update whether a registered offline app is projected into launcher UIs.
|
|
785
|
+
*
|
|
786
|
+
* Offline apps are registered once at host startup, so settings-backed
|
|
787
|
+
* visibility changes need to update the projection without reinstalling or
|
|
788
|
+
* duplicating the app. No-op when the app is missing or already matches.
|
|
789
|
+
*/
|
|
790
|
+
setOfflineAppHidden(packageName, hidden) {
|
|
791
|
+
const app = this.offlineApps.find((candidate) => candidate.packageName === packageName);
|
|
792
|
+
if (!app || app.hidden === hidden)
|
|
793
|
+
return;
|
|
794
|
+
app.hidden = hidden;
|
|
795
|
+
this.refreshNeeded = true;
|
|
796
|
+
this.notify();
|
|
797
|
+
}
|
|
802
798
|
/**
|
|
803
799
|
* Registered as needing the on-device STT model before it can start (the
|
|
804
800
|
* host declares this per offline app; the apps store gates start() on it).
|
|
@@ -849,24 +845,7 @@ export function getLocalAppScreenshot(packageName) {
|
|
|
849
845
|
return uri;
|
|
850
846
|
}
|
|
851
847
|
const DEV_APPS_INDEX_KEY = "dev_apps_index";
|
|
852
|
-
|
|
853
|
-
// Explicit escape hatch first; otherwise the host-injected Metro host (the
|
|
854
|
-
// address this dev bundle was served from — always current for the network
|
|
855
|
-
// the phone is on). Deliberately NOT the EXPO_PUBLIC_CLOUD_* URLs: those are
|
|
856
|
-
// cloud endpoints, a different machine entirely from the laptop running the
|
|
857
|
-
// miniapp dev server, and rewriting a dev URL to a cloud host would break it.
|
|
858
|
-
const explicit = process.env.EXPO_PUBLIC_LOCAL_MINIAPP_HOST;
|
|
859
|
-
if (explicit) {
|
|
860
|
-
try {
|
|
861
|
-
return new URL(explicit).hostname;
|
|
862
|
-
}
|
|
863
|
-
catch {
|
|
864
|
-
if (/^[\w.-]+$/.test(explicit))
|
|
865
|
-
return explicit;
|
|
866
|
-
}
|
|
867
|
-
}
|
|
868
|
-
return getConfigValues().devServerHost?.();
|
|
869
|
-
}
|
|
848
|
+
const DEV_APP_ICONS_DIR = "dev-miniapp-icons";
|
|
870
849
|
function isPrivateLanHost(hostname) {
|
|
871
850
|
return (hostname === "localhost" ||
|
|
872
851
|
hostname.startsWith("192.168.") ||
|
|
@@ -895,71 +874,173 @@ function normalizeDevAppRecord(record) {
|
|
|
895
874
|
const iconUrl = rewriteStaleDevUrl(record.iconUrl);
|
|
896
875
|
return devUrl === record.devUrl && iconUrl === record.iconUrl ? record : { ...record, devUrl, iconUrl };
|
|
897
876
|
}
|
|
898
|
-
/**
|
|
899
|
-
* The one and only package name a dev miniapp is registered under.
|
|
900
|
-
*
|
|
901
|
-
* There is a SINGLE dev slot: scanning a new QR (or entering a new dev URL)
|
|
902
|
-
* replaces the previous dev app rather than adding a second tile. Because the
|
|
903
|
-
* whole launch chain — JSContext registration, UI-router binding,
|
|
904
|
-
* setForeground, dev_url/dev_port storage keys, respawn-bg lookup — keys on
|
|
905
|
-
* this package name, every consumer MUST use `DEV_APP_PACKAGE_NAME` (not the
|
|
906
|
-
* manifest's real packageName) so messages route consistently. Mixing the two
|
|
907
|
-
* was the cause of the "CONNECT_ACK timeout" — the tile said `com.dev` while
|
|
908
|
-
* the dev URL/port and foreground target used the manifest name.
|
|
909
|
-
*/
|
|
877
|
+
/** Legacy package used by builds that supported only one dev miniapp. */
|
|
910
878
|
export const DEV_APP_PACKAGE_NAME = "com.dev";
|
|
911
879
|
export const DEV_APP_NAME = "Dev";
|
|
912
880
|
/**
|
|
913
|
-
*
|
|
914
|
-
*
|
|
915
|
-
*
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
881
|
+
* Copy a dev-server icon into Documents so the tile remains branded after the
|
|
882
|
+
* laptop/server disappears. A failed download is non-fatal: the remote URL is
|
|
883
|
+
* retained and can still render while the server is reachable.
|
|
884
|
+
*/
|
|
885
|
+
async function cacheDevAppIcon(packageName, iconUrl) {
|
|
886
|
+
if (!/^https?:\/\//.test(iconUrl))
|
|
887
|
+
return iconUrl;
|
|
888
|
+
try {
|
|
889
|
+
const dir = new Directory(Paths.document, DEV_APP_ICONS_DIR);
|
|
890
|
+
if (!dir.exists)
|
|
891
|
+
dir.create({ intermediates: true });
|
|
892
|
+
const safePackageName = packageName.replace(/[^a-zA-Z0-9._-]/g, "_");
|
|
893
|
+
let extension = ".png";
|
|
894
|
+
try {
|
|
895
|
+
const match = new URL(iconUrl).pathname.match(/\.(png|jpe?g|webp|gif|svg)$/i);
|
|
896
|
+
if (match)
|
|
897
|
+
extension = `.${match[1].toLowerCase()}`;
|
|
898
|
+
}
|
|
899
|
+
catch {
|
|
900
|
+
// Keep the decoder-friendly .png fallback; image loaders sniff content.
|
|
901
|
+
}
|
|
902
|
+
const target = new File(dir, `${safePackageName}${extension}`);
|
|
903
|
+
const downloaded = await File.downloadFileAsync(iconUrl, target, { idempotent: true });
|
|
904
|
+
// Only remove older extensions AFTER the replacement is safely on disk;
|
|
905
|
+
// a broken icon URL must not destroy the last known-good cached logo.
|
|
906
|
+
for (const item of dir.list()) {
|
|
907
|
+
if (item instanceof File && item.uri !== downloaded.uri && item.name.startsWith(`${safePackageName}.`)) {
|
|
908
|
+
try {
|
|
909
|
+
item.delete();
|
|
910
|
+
}
|
|
911
|
+
catch {
|
|
912
|
+
// Best effort; the current icon has already been persisted.
|
|
913
|
+
}
|
|
914
|
+
}
|
|
915
|
+
}
|
|
916
|
+
return downloaded.uri;
|
|
917
|
+
}
|
|
918
|
+
catch (error) {
|
|
919
|
+
console.warn(`APP_REGISTRY: failed to cache dev icon for ${packageName}:`, error);
|
|
920
|
+
return readDevAppRecord(packageName)?.iconUrl ?? iconUrl;
|
|
921
|
+
}
|
|
922
|
+
}
|
|
923
|
+
function removeDevRecordKeys(packageName) {
|
|
924
|
+
const existing = readDevAppRecord(packageName);
|
|
925
|
+
if (existing?.iconUrl.startsWith("file://")) {
|
|
926
|
+
try {
|
|
927
|
+
const icon = new File(existing.iconUrl);
|
|
928
|
+
if (icon.exists)
|
|
929
|
+
icon.delete();
|
|
930
|
+
}
|
|
931
|
+
catch (error) {
|
|
932
|
+
console.warn(`APP_REGISTRY: failed to delete dev icon for ${packageName}:`, error);
|
|
933
|
+
}
|
|
934
|
+
}
|
|
935
|
+
storage.remove(`${packageName}_dev_meta`);
|
|
936
|
+
storage.remove(`${packageName}_dev_url`);
|
|
937
|
+
storage.remove(`${packageName}_dev_port`);
|
|
938
|
+
storage.remove(`${packageName}_dev_mdns`);
|
|
939
|
+
storage.remove(`${packageName}_dev_last_reachable`);
|
|
940
|
+
}
|
|
941
|
+
function readDevAppRecord(packageName) {
|
|
942
|
+
const res = storage.load(`${packageName}_dev_meta`);
|
|
943
|
+
if (!res.is_ok())
|
|
944
|
+
return null;
|
|
945
|
+
try {
|
|
946
|
+
return JSON.parse(res.value);
|
|
947
|
+
}
|
|
948
|
+
catch {
|
|
949
|
+
return null;
|
|
950
|
+
}
|
|
951
|
+
}
|
|
952
|
+
/** Move the historical `com.dev` record onto its real manifest package key. */
|
|
953
|
+
function migrateLegacyDevSlot() {
|
|
954
|
+
const legacy = readDevAppRecord(DEV_APP_PACKAGE_NAME);
|
|
955
|
+
const targetPackage = legacy?.sourcePackageName?.trim();
|
|
956
|
+
if (!legacy || !targetPackage || targetPackage === DEV_APP_PACKAGE_NAME)
|
|
957
|
+
return;
|
|
958
|
+
const existingTarget = readDevAppRecord(targetPackage);
|
|
959
|
+
const migrated = existingTarget ?? {
|
|
960
|
+
...legacy,
|
|
961
|
+
packageName: targetPackage,
|
|
962
|
+
sourcePackageName: targetPackage,
|
|
963
|
+
};
|
|
964
|
+
if (!existingTarget)
|
|
965
|
+
storage.save(`${targetPackage}_dev_meta`, JSON.stringify(migrated));
|
|
966
|
+
const legacyUrl = storage.load(`${DEV_APP_PACKAGE_NAME}_dev_url`);
|
|
967
|
+
const targetUrl = storage.load(`${targetPackage}_dev_url`);
|
|
968
|
+
if (!targetUrl.is_ok()) {
|
|
969
|
+
storage.save(`${targetPackage}_dev_url`, legacyUrl.is_ok() ? legacyUrl.value : migrated.devUrl);
|
|
970
|
+
}
|
|
971
|
+
const legacyPort = storage.load(`${DEV_APP_PACKAGE_NAME}_dev_port`);
|
|
972
|
+
const targetPort = storage.load(`${targetPackage}_dev_port`);
|
|
973
|
+
if (!targetPort.is_ok()) {
|
|
974
|
+
const port = migrated.devPort ?? (legacyPort.is_ok() ? legacyPort.value : undefined);
|
|
975
|
+
if (typeof port === "number" && Number.isFinite(port))
|
|
976
|
+
storage.save(`${targetPackage}_dev_port`, port);
|
|
977
|
+
}
|
|
978
|
+
const legacyMdns = storage.load(`${DEV_APP_PACKAGE_NAME}_dev_mdns`);
|
|
979
|
+
const targetMdns = storage.load(`${targetPackage}_dev_mdns`);
|
|
980
|
+
if (!targetMdns.is_ok() && legacyMdns.is_ok() && legacyMdns.value.trim()) {
|
|
981
|
+
storage.save(`${targetPackage}_dev_mdns`, legacyMdns.value.trim());
|
|
982
|
+
}
|
|
983
|
+
storage.remove(`${DEV_APP_PACKAGE_NAME}_dev_meta`);
|
|
984
|
+
storage.remove(`${DEV_APP_PACKAGE_NAME}_dev_url`);
|
|
985
|
+
storage.remove(`${DEV_APP_PACKAGE_NAME}_dev_port`);
|
|
986
|
+
storage.remove(`${DEV_APP_PACKAGE_NAME}_dev_mdns`);
|
|
987
|
+
storage.remove(`${DEV_APP_PACKAGE_NAME}_dev_last_reachable`);
|
|
988
|
+
const index = Array.from(new Set(getDevAppIndex().map((pkg) => (pkg === DEV_APP_PACKAGE_NAME ? targetPackage : pkg))));
|
|
989
|
+
storage.save(DEV_APPS_INDEX_KEY, JSON.stringify(index));
|
|
990
|
+
}
|
|
991
|
+
function readStoredMdnsHost(packageName) {
|
|
992
|
+
const res = storage.load(`${packageName}_dev_mdns`);
|
|
993
|
+
if (!res.is_ok())
|
|
994
|
+
return undefined;
|
|
995
|
+
return res.value.trim() || undefined;
|
|
996
|
+
}
|
|
997
|
+
/**
|
|
998
|
+
* Register or update one dev miniapp under its real manifest package. Different
|
|
999
|
+
* package names coexist; rescanning the same package updates that package only.
|
|
924
1000
|
*/
|
|
925
|
-
export function registerDevApp(record) {
|
|
1001
|
+
export async function registerDevApp(record) {
|
|
1002
|
+
migrateLegacyDevSlot();
|
|
1003
|
+
const packageName = record.packageName.trim();
|
|
1004
|
+
if (!packageName)
|
|
1005
|
+
throw new Error("Dev miniapp manifest is missing packageName");
|
|
1006
|
+
const iconUrl = await cacheDevAppIcon(packageName, record.iconUrl);
|
|
1007
|
+
// Relaunch paths (developer-URL screen, loadDevMiniapp) omit mdnsHost, so an
|
|
1008
|
+
// omitted field keeps whatever the QR scan stored instead of wiping the
|
|
1009
|
+
// `.local` failover host.
|
|
1010
|
+
const mdnsHost = record.mdnsHost !== undefined ? record.mdnsHost.trim() || undefined : readStoredMdnsHost(packageName);
|
|
926
1011
|
const devRecord = {
|
|
927
1012
|
...record,
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
// actually targets the dev slot.
|
|
931
|
-
sourcePackageName: record.sourcePackageName ?? record.packageName,
|
|
932
|
-
packageName: DEV_APP_PACKAGE_NAME,
|
|
933
|
-
// Keep the manifest's real name + icon (display-only; routing keys on
|
|
934
|
-
// packageName). Fall back to DEV_APP_NAME only if a caller omitted the name.
|
|
1013
|
+
packageName,
|
|
1014
|
+
sourcePackageName: packageName,
|
|
935
1015
|
name: record.name || DEV_APP_NAME,
|
|
936
|
-
iconUrl
|
|
1016
|
+
iconUrl,
|
|
1017
|
+
mdnsHost,
|
|
937
1018
|
};
|
|
938
|
-
storage.save(`${
|
|
939
|
-
|
|
940
|
-
// respawn-bg) reads these keys under DEV_APP_PACKAGE_NAME — persist them
|
|
941
|
-
// here so callers can't key them on the wrong (real) package name.
|
|
942
|
-
storage.save(`${DEV_APP_PACKAGE_NAME}_dev_url`, record.devUrl);
|
|
1019
|
+
storage.save(`${packageName}_dev_meta`, JSON.stringify(devRecord));
|
|
1020
|
+
storage.save(`${packageName}_dev_url`, record.devUrl);
|
|
943
1021
|
if (typeof record.devPort === "number" && Number.isFinite(record.devPort)) {
|
|
944
|
-
storage.save(`${
|
|
1022
|
+
storage.save(`${packageName}_dev_port`, record.devPort);
|
|
945
1023
|
}
|
|
946
1024
|
else {
|
|
947
|
-
storage.remove(`${
|
|
1025
|
+
storage.remove(`${packageName}_dev_port`);
|
|
1026
|
+
}
|
|
1027
|
+
if (mdnsHost) {
|
|
1028
|
+
storage.save(`${packageName}_dev_mdns`, mdnsHost);
|
|
1029
|
+
}
|
|
1030
|
+
else {
|
|
1031
|
+
storage.remove(`${packageName}_dev_mdns`);
|
|
948
1032
|
}
|
|
949
1033
|
const idx = getDevAppIndex();
|
|
950
|
-
if (!idx.includes(
|
|
951
|
-
idx.push(
|
|
1034
|
+
if (!idx.includes(packageName)) {
|
|
1035
|
+
idx.push(packageName);
|
|
952
1036
|
storage.save(DEV_APPS_INDEX_KEY, JSON.stringify(idx));
|
|
953
1037
|
}
|
|
954
1038
|
appRegistry.markRefreshNeeded();
|
|
955
1039
|
}
|
|
956
|
-
/** Drop
|
|
957
|
-
export function unregisterDevApp() {
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
storage.remove(`${DEV_APP_PACKAGE_NAME}_dev_port`);
|
|
961
|
-
storage.remove(`${DEV_APP_PACKAGE_NAME}_dev_last_reachable`);
|
|
962
|
-
const idx = getDevAppIndex().filter((p) => p !== DEV_APP_PACKAGE_NAME);
|
|
1040
|
+
/** Drop one dev miniapp's metadata, routing keys, and cached icon. */
|
|
1041
|
+
export function unregisterDevApp(packageName = DEV_APP_PACKAGE_NAME) {
|
|
1042
|
+
removeDevRecordKeys(packageName);
|
|
1043
|
+
const idx = getDevAppIndex().filter((p) => p !== packageName);
|
|
963
1044
|
storage.save(DEV_APPS_INDEX_KEY, JSON.stringify(idx));
|
|
964
1045
|
appRegistry.markRefreshNeeded();
|
|
965
1046
|
}
|
|
@@ -975,35 +1056,18 @@ function getDevAppIndex() {
|
|
|
975
1056
|
return [];
|
|
976
1057
|
}
|
|
977
1058
|
}
|
|
978
|
-
/**
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
const res = storage.load(`${DEV_APP_PACKAGE_NAME}_dev_meta`);
|
|
984
|
-
if (!res.is_ok())
|
|
985
|
-
return null;
|
|
986
|
-
try {
|
|
987
|
-
const rec = JSON.parse(res.value);
|
|
988
|
-
return rec.sourcePackageName ?? null;
|
|
989
|
-
}
|
|
990
|
-
catch {
|
|
991
|
-
return null;
|
|
992
|
-
}
|
|
1059
|
+
/** Resolve the manifest package for a dev runtime (including the legacy slot). */
|
|
1060
|
+
export function getDevAppSourcePackage(packageName = DEV_APP_PACKAGE_NAME) {
|
|
1061
|
+
migrateLegacyDevSlot();
|
|
1062
|
+
const rec = readDevAppRecord(packageName);
|
|
1063
|
+
return rec?.sourcePackageName ?? rec?.packageName ?? null;
|
|
993
1064
|
}
|
|
994
|
-
export function getDevAppAttestation() {
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
return null;
|
|
998
|
-
try {
|
|
999
|
-
const rec = JSON.parse(res.value);
|
|
1000
|
-
return rec.devAttestation ?? null;
|
|
1001
|
-
}
|
|
1002
|
-
catch {
|
|
1003
|
-
return null;
|
|
1004
|
-
}
|
|
1065
|
+
export function getDevAppAttestation(packageName = DEV_APP_PACKAGE_NAME) {
|
|
1066
|
+
migrateLegacyDevSlot();
|
|
1067
|
+
return readDevAppRecord(packageName)?.devAttestation ?? null;
|
|
1005
1068
|
}
|
|
1006
1069
|
export function getDevAppRecords() {
|
|
1070
|
+
migrateLegacyDevSlot();
|
|
1007
1071
|
const out = [];
|
|
1008
1072
|
for (const pkg of getDevAppIndex()) {
|
|
1009
1073
|
const res = storage.load(`${pkg}_dev_meta`);
|