@mentra/engine 0.1.0-dev.0 → 0.1.0-dev.1
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 +42 -1
- package/build/engine.d.ts +11 -3
- package/build/engine.d.ts.map +1 -1
- package/build/engine.js +7 -2
- 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/gallery.js +1 -1
- package/build/facades/gallery.js.map +1 -1
- package/build/facades/glasses.d.ts +1 -0
- package/build/facades/glasses.d.ts.map +1 -1
- package/build/facades/glasses.js +19 -4
- 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 +11 -2
- package/build/facades/ota.d.ts.map +1 -1
- package/build/facades/ota.js +19 -4
- package/build/facades/ota.js.map +1 -1
- package/build/facades/pairing.d.ts +4 -0
- package/build/facades/pairing.d.ts.map +1 -1
- package/build/facades/pairing.js +10 -8
- 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/index.d.ts +6 -3
- package/build/index.d.ts.map +1 -1
- package/build/index.js +4 -2
- package/build/index.js.map +1 -1
- package/build/internal.d.ts +3 -2
- package/build/internal.d.ts.map +1 -1
- package/build/internal.js +2 -1
- package/build/internal.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 +33 -57
- package/build/services/AppRegistry.d.ts.map +1 -1
- package/build/services/AppRegistry.js +193 -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 +94 -14
- package/build/services/OtaInstallCoordinator.d.ts.map +1 -1
- package/build/services/OtaInstallCoordinator.js +574 -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 +38 -3
- package/build/services/OtaUpdateCheckService.d.ts.map +1 -1
- package/build/services/OtaUpdateCheckService.js +142 -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.js +2 -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 +22 -11
- 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 +15 -3
- 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/otaManifestUrl.d.ts +2 -0
- package/build/services/otaManifestUrl.d.ts.map +1 -0
- package/build/services/{asgOtaVersionUrl.js → otaManifestUrl.js} +15 -5
- 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 +1 -0
- package/build/types/enums.d.ts.map +1 -1
- package/build/types/enums.js +1 -0
- package/build/types/enums.js.map +1 -1
- package/build/types/hardware.d.ts +1 -0
- package/build/types/hardware.d.ts.map +1 -1
- package/build/types/hardware.js +14 -0
- package/build/types/hardware.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 +25 -15
- package/src/assets/silence.wav +0 -0
- package/src/engine.ts +7 -2
- package/src/facades/dev.ts +17 -12
- package/src/facades/gallery.ts +1 -1
- package/src/facades/glasses.ts +17 -4
- package/src/facades/glassesSettings.ts +5 -0
- package/src/facades/miniapps.ts +7 -0
- package/src/facades/ota.ts +19 -4
- package/src/facades/pairing.ts +11 -7
- package/src/facades/permissions.ts +14 -0
- package/src/facades/phoneNotifications.ts +4 -13
- package/src/index.ts +26 -2
- package/src/internal.ts +3 -1
- 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 +224 -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 +645 -143
- package/src/services/OtaService.ts +11 -5
- package/src/services/OtaUpdateCheckService.ts +180 -20
- 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 +2 -2
- package/src/services/manifestActions.ts +30 -0
- package/src/services/otaDisplayState.ts +57 -16
- package/src/services/otaInstallPolicy.ts +29 -3
- package/src/services/{asgOtaVersionUrl.ts → otaManifestUrl.ts} +16 -4
- 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 +2 -1
- package/src/types/hardware.ts +17 -0
- 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/services/asgOtaVersionUrl.d.ts +0 -2
- package/build/services/asgOtaVersionUrl.d.ts.map +0 -1
- package/build/services/asgOtaVersionUrl.js.map +0 -1
|
@@ -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) {
|
|
@@ -849,24 +830,7 @@ export function getLocalAppScreenshot(packageName) {
|
|
|
849
830
|
return uri;
|
|
850
831
|
}
|
|
851
832
|
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
|
-
}
|
|
833
|
+
const DEV_APP_ICONS_DIR = "dev-miniapp-icons";
|
|
870
834
|
function isPrivateLanHost(hostname) {
|
|
871
835
|
return (hostname === "localhost" ||
|
|
872
836
|
hostname.startsWith("192.168.") ||
|
|
@@ -895,71 +859,173 @@ function normalizeDevAppRecord(record) {
|
|
|
895
859
|
const iconUrl = rewriteStaleDevUrl(record.iconUrl);
|
|
896
860
|
return devUrl === record.devUrl && iconUrl === record.iconUrl ? record : { ...record, devUrl, iconUrl };
|
|
897
861
|
}
|
|
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
|
-
*/
|
|
862
|
+
/** Legacy package used by builds that supported only one dev miniapp. */
|
|
910
863
|
export const DEV_APP_PACKAGE_NAME = "com.dev";
|
|
911
864
|
export const DEV_APP_NAME = "Dev";
|
|
912
865
|
/**
|
|
913
|
-
*
|
|
914
|
-
*
|
|
915
|
-
*
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
866
|
+
* Copy a dev-server icon into Documents so the tile remains branded after the
|
|
867
|
+
* laptop/server disappears. A failed download is non-fatal: the remote URL is
|
|
868
|
+
* retained and can still render while the server is reachable.
|
|
869
|
+
*/
|
|
870
|
+
async function cacheDevAppIcon(packageName, iconUrl) {
|
|
871
|
+
if (!/^https?:\/\//.test(iconUrl))
|
|
872
|
+
return iconUrl;
|
|
873
|
+
try {
|
|
874
|
+
const dir = new Directory(Paths.document, DEV_APP_ICONS_DIR);
|
|
875
|
+
if (!dir.exists)
|
|
876
|
+
dir.create({ intermediates: true });
|
|
877
|
+
const safePackageName = packageName.replace(/[^a-zA-Z0-9._-]/g, "_");
|
|
878
|
+
let extension = ".png";
|
|
879
|
+
try {
|
|
880
|
+
const match = new URL(iconUrl).pathname.match(/\.(png|jpe?g|webp|gif|svg)$/i);
|
|
881
|
+
if (match)
|
|
882
|
+
extension = `.${match[1].toLowerCase()}`;
|
|
883
|
+
}
|
|
884
|
+
catch {
|
|
885
|
+
// Keep the decoder-friendly .png fallback; image loaders sniff content.
|
|
886
|
+
}
|
|
887
|
+
const target = new File(dir, `${safePackageName}${extension}`);
|
|
888
|
+
const downloaded = await File.downloadFileAsync(iconUrl, target, { idempotent: true });
|
|
889
|
+
// Only remove older extensions AFTER the replacement is safely on disk;
|
|
890
|
+
// a broken icon URL must not destroy the last known-good cached logo.
|
|
891
|
+
for (const item of dir.list()) {
|
|
892
|
+
if (item instanceof File && item.uri !== downloaded.uri && item.name.startsWith(`${safePackageName}.`)) {
|
|
893
|
+
try {
|
|
894
|
+
item.delete();
|
|
895
|
+
}
|
|
896
|
+
catch {
|
|
897
|
+
// Best effort; the current icon has already been persisted.
|
|
898
|
+
}
|
|
899
|
+
}
|
|
900
|
+
}
|
|
901
|
+
return downloaded.uri;
|
|
902
|
+
}
|
|
903
|
+
catch (error) {
|
|
904
|
+
console.warn(`APP_REGISTRY: failed to cache dev icon for ${packageName}:`, error);
|
|
905
|
+
return readDevAppRecord(packageName)?.iconUrl ?? iconUrl;
|
|
906
|
+
}
|
|
907
|
+
}
|
|
908
|
+
function removeDevRecordKeys(packageName) {
|
|
909
|
+
const existing = readDevAppRecord(packageName);
|
|
910
|
+
if (existing?.iconUrl.startsWith("file://")) {
|
|
911
|
+
try {
|
|
912
|
+
const icon = new File(existing.iconUrl);
|
|
913
|
+
if (icon.exists)
|
|
914
|
+
icon.delete();
|
|
915
|
+
}
|
|
916
|
+
catch (error) {
|
|
917
|
+
console.warn(`APP_REGISTRY: failed to delete dev icon for ${packageName}:`, error);
|
|
918
|
+
}
|
|
919
|
+
}
|
|
920
|
+
storage.remove(`${packageName}_dev_meta`);
|
|
921
|
+
storage.remove(`${packageName}_dev_url`);
|
|
922
|
+
storage.remove(`${packageName}_dev_port`);
|
|
923
|
+
storage.remove(`${packageName}_dev_mdns`);
|
|
924
|
+
storage.remove(`${packageName}_dev_last_reachable`);
|
|
925
|
+
}
|
|
926
|
+
function readDevAppRecord(packageName) {
|
|
927
|
+
const res = storage.load(`${packageName}_dev_meta`);
|
|
928
|
+
if (!res.is_ok())
|
|
929
|
+
return null;
|
|
930
|
+
try {
|
|
931
|
+
return JSON.parse(res.value);
|
|
932
|
+
}
|
|
933
|
+
catch {
|
|
934
|
+
return null;
|
|
935
|
+
}
|
|
936
|
+
}
|
|
937
|
+
/** Move the historical `com.dev` record onto its real manifest package key. */
|
|
938
|
+
function migrateLegacyDevSlot() {
|
|
939
|
+
const legacy = readDevAppRecord(DEV_APP_PACKAGE_NAME);
|
|
940
|
+
const targetPackage = legacy?.sourcePackageName?.trim();
|
|
941
|
+
if (!legacy || !targetPackage || targetPackage === DEV_APP_PACKAGE_NAME)
|
|
942
|
+
return;
|
|
943
|
+
const existingTarget = readDevAppRecord(targetPackage);
|
|
944
|
+
const migrated = existingTarget ?? {
|
|
945
|
+
...legacy,
|
|
946
|
+
packageName: targetPackage,
|
|
947
|
+
sourcePackageName: targetPackage,
|
|
948
|
+
};
|
|
949
|
+
if (!existingTarget)
|
|
950
|
+
storage.save(`${targetPackage}_dev_meta`, JSON.stringify(migrated));
|
|
951
|
+
const legacyUrl = storage.load(`${DEV_APP_PACKAGE_NAME}_dev_url`);
|
|
952
|
+
const targetUrl = storage.load(`${targetPackage}_dev_url`);
|
|
953
|
+
if (!targetUrl.is_ok()) {
|
|
954
|
+
storage.save(`${targetPackage}_dev_url`, legacyUrl.is_ok() ? legacyUrl.value : migrated.devUrl);
|
|
955
|
+
}
|
|
956
|
+
const legacyPort = storage.load(`${DEV_APP_PACKAGE_NAME}_dev_port`);
|
|
957
|
+
const targetPort = storage.load(`${targetPackage}_dev_port`);
|
|
958
|
+
if (!targetPort.is_ok()) {
|
|
959
|
+
const port = migrated.devPort ?? (legacyPort.is_ok() ? legacyPort.value : undefined);
|
|
960
|
+
if (typeof port === "number" && Number.isFinite(port))
|
|
961
|
+
storage.save(`${targetPackage}_dev_port`, port);
|
|
962
|
+
}
|
|
963
|
+
const legacyMdns = storage.load(`${DEV_APP_PACKAGE_NAME}_dev_mdns`);
|
|
964
|
+
const targetMdns = storage.load(`${targetPackage}_dev_mdns`);
|
|
965
|
+
if (!targetMdns.is_ok() && legacyMdns.is_ok() && legacyMdns.value.trim()) {
|
|
966
|
+
storage.save(`${targetPackage}_dev_mdns`, legacyMdns.value.trim());
|
|
967
|
+
}
|
|
968
|
+
storage.remove(`${DEV_APP_PACKAGE_NAME}_dev_meta`);
|
|
969
|
+
storage.remove(`${DEV_APP_PACKAGE_NAME}_dev_url`);
|
|
970
|
+
storage.remove(`${DEV_APP_PACKAGE_NAME}_dev_port`);
|
|
971
|
+
storage.remove(`${DEV_APP_PACKAGE_NAME}_dev_mdns`);
|
|
972
|
+
storage.remove(`${DEV_APP_PACKAGE_NAME}_dev_last_reachable`);
|
|
973
|
+
const index = Array.from(new Set(getDevAppIndex().map((pkg) => (pkg === DEV_APP_PACKAGE_NAME ? targetPackage : pkg))));
|
|
974
|
+
storage.save(DEV_APPS_INDEX_KEY, JSON.stringify(index));
|
|
975
|
+
}
|
|
976
|
+
function readStoredMdnsHost(packageName) {
|
|
977
|
+
const res = storage.load(`${packageName}_dev_mdns`);
|
|
978
|
+
if (!res.is_ok())
|
|
979
|
+
return undefined;
|
|
980
|
+
return res.value.trim() || undefined;
|
|
981
|
+
}
|
|
982
|
+
/**
|
|
983
|
+
* Register or update one dev miniapp under its real manifest package. Different
|
|
984
|
+
* package names coexist; rescanning the same package updates that package only.
|
|
924
985
|
*/
|
|
925
|
-
export function registerDevApp(record) {
|
|
986
|
+
export async function registerDevApp(record) {
|
|
987
|
+
migrateLegacyDevSlot();
|
|
988
|
+
const packageName = record.packageName.trim();
|
|
989
|
+
if (!packageName)
|
|
990
|
+
throw new Error("Dev miniapp manifest is missing packageName");
|
|
991
|
+
const iconUrl = await cacheDevAppIcon(packageName, record.iconUrl);
|
|
992
|
+
// Relaunch paths (developer-URL screen, loadDevMiniapp) omit mdnsHost, so an
|
|
993
|
+
// omitted field keeps whatever the QR scan stored instead of wiping the
|
|
994
|
+
// `.local` failover host.
|
|
995
|
+
const mdnsHost = record.mdnsHost !== undefined ? record.mdnsHost.trim() || undefined : readStoredMdnsHost(packageName);
|
|
926
996
|
const devRecord = {
|
|
927
997
|
...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.
|
|
998
|
+
packageName,
|
|
999
|
+
sourcePackageName: packageName,
|
|
935
1000
|
name: record.name || DEV_APP_NAME,
|
|
936
|
-
iconUrl
|
|
1001
|
+
iconUrl,
|
|
1002
|
+
mdnsHost,
|
|
937
1003
|
};
|
|
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);
|
|
1004
|
+
storage.save(`${packageName}_dev_meta`, JSON.stringify(devRecord));
|
|
1005
|
+
storage.save(`${packageName}_dev_url`, record.devUrl);
|
|
943
1006
|
if (typeof record.devPort === "number" && Number.isFinite(record.devPort)) {
|
|
944
|
-
storage.save(`${
|
|
1007
|
+
storage.save(`${packageName}_dev_port`, record.devPort);
|
|
945
1008
|
}
|
|
946
1009
|
else {
|
|
947
|
-
storage.remove(`${
|
|
1010
|
+
storage.remove(`${packageName}_dev_port`);
|
|
1011
|
+
}
|
|
1012
|
+
if (mdnsHost) {
|
|
1013
|
+
storage.save(`${packageName}_dev_mdns`, mdnsHost);
|
|
1014
|
+
}
|
|
1015
|
+
else {
|
|
1016
|
+
storage.remove(`${packageName}_dev_mdns`);
|
|
948
1017
|
}
|
|
949
1018
|
const idx = getDevAppIndex();
|
|
950
|
-
if (!idx.includes(
|
|
951
|
-
idx.push(
|
|
1019
|
+
if (!idx.includes(packageName)) {
|
|
1020
|
+
idx.push(packageName);
|
|
952
1021
|
storage.save(DEV_APPS_INDEX_KEY, JSON.stringify(idx));
|
|
953
1022
|
}
|
|
954
1023
|
appRegistry.markRefreshNeeded();
|
|
955
1024
|
}
|
|
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);
|
|
1025
|
+
/** Drop one dev miniapp's metadata, routing keys, and cached icon. */
|
|
1026
|
+
export function unregisterDevApp(packageName = DEV_APP_PACKAGE_NAME) {
|
|
1027
|
+
removeDevRecordKeys(packageName);
|
|
1028
|
+
const idx = getDevAppIndex().filter((p) => p !== packageName);
|
|
963
1029
|
storage.save(DEV_APPS_INDEX_KEY, JSON.stringify(idx));
|
|
964
1030
|
appRegistry.markRefreshNeeded();
|
|
965
1031
|
}
|
|
@@ -975,35 +1041,18 @@ function getDevAppIndex() {
|
|
|
975
1041
|
return [];
|
|
976
1042
|
}
|
|
977
1043
|
}
|
|
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
|
-
}
|
|
1044
|
+
/** Resolve the manifest package for a dev runtime (including the legacy slot). */
|
|
1045
|
+
export function getDevAppSourcePackage(packageName = DEV_APP_PACKAGE_NAME) {
|
|
1046
|
+
migrateLegacyDevSlot();
|
|
1047
|
+
const rec = readDevAppRecord(packageName);
|
|
1048
|
+
return rec?.sourcePackageName ?? rec?.packageName ?? null;
|
|
993
1049
|
}
|
|
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
|
-
}
|
|
1050
|
+
export function getDevAppAttestation(packageName = DEV_APP_PACKAGE_NAME) {
|
|
1051
|
+
migrateLegacyDevSlot();
|
|
1052
|
+
return readDevAppRecord(packageName)?.devAttestation ?? null;
|
|
1005
1053
|
}
|
|
1006
1054
|
export function getDevAppRecords() {
|
|
1055
|
+
migrateLegacyDevSlot();
|
|
1007
1056
|
const out = [];
|
|
1008
1057
|
for (const pkg of getDevAppIndex()) {
|
|
1009
1058
|
const res = storage.load(`${pkg}_dev_meta`);
|