@mentra/engine 0.1.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +79 -0
- package/build/devtools.d.ts +11 -0
- package/build/devtools.d.ts.map +1 -0
- package/build/devtools.js +13 -0
- package/build/devtools.js.map +1 -0
- package/build/engine.d.ts +261 -0
- package/build/engine.d.ts.map +1 -0
- package/build/engine.js +170 -0
- package/build/engine.js.map +1 -0
- package/build/facades/dev.d.ts +58 -0
- package/build/facades/dev.d.ts.map +1 -0
- package/build/facades/dev.js +189 -0
- package/build/facades/dev.js.map +1 -0
- package/build/facades/display.d.ts +21 -0
- package/build/facades/display.d.ts.map +1 -0
- package/build/facades/display.js +17 -0
- package/build/facades/display.js.map +1 -0
- package/build/facades/displayMirror.d.ts +15 -0
- package/build/facades/displayMirror.d.ts.map +1 -0
- package/build/facades/displayMirror.js +29 -0
- package/build/facades/displayMirror.js.map +1 -0
- package/build/facades/gallery.d.ts +62 -0
- package/build/facades/gallery.d.ts.map +1 -0
- package/build/facades/gallery.js +61 -0
- package/build/facades/gallery.js.map +1 -0
- package/build/facades/glasses.d.ts +141 -0
- package/build/facades/glasses.d.ts.map +1 -0
- package/build/facades/glasses.js +199 -0
- package/build/facades/glasses.js.map +1 -0
- package/build/facades/glassesSettings.d.ts +13 -0
- package/build/facades/glassesSettings.d.ts.map +1 -0
- package/build/facades/glassesSettings.js +54 -0
- package/build/facades/glassesSettings.js.map +1 -0
- package/build/facades/glassesWifi.d.ts +25 -0
- package/build/facades/glassesWifi.d.ts.map +1 -0
- package/build/facades/glassesWifi.js +57 -0
- package/build/facades/glassesWifi.js.map +1 -0
- package/build/facades/miniapps.d.ts +43 -0
- package/build/facades/miniapps.d.ts.map +1 -0
- package/build/facades/miniapps.js +49 -0
- package/build/facades/miniapps.js.map +1 -0
- package/build/facades/notifications.d.ts +13 -0
- package/build/facades/notifications.d.ts.map +1 -0
- package/build/facades/notifications.js +12 -0
- package/build/facades/notifications.js.map +1 -0
- package/build/facades/ota.d.ts +103 -0
- package/build/facades/ota.d.ts.map +1 -0
- package/build/facades/ota.js +156 -0
- package/build/facades/ota.js.map +1 -0
- package/build/facades/pairing.d.ts +114 -0
- package/build/facades/pairing.d.ts.map +1 -0
- package/build/facades/pairing.js +275 -0
- package/build/facades/pairing.js.map +1 -0
- package/build/facades/permissions.d.ts +33 -0
- package/build/facades/permissions.d.ts.map +1 -0
- package/build/facades/permissions.js +155 -0
- package/build/facades/permissions.js.map +1 -0
- package/build/facades/phoneNotifications.d.ts +21 -0
- package/build/facades/phoneNotifications.d.ts.map +1 -0
- package/build/facades/phoneNotifications.js +51 -0
- package/build/facades/phoneNotifications.js.map +1 -0
- package/build/facades/reports.d.ts +36 -0
- package/build/facades/reports.d.ts.map +1 -0
- package/build/facades/reports.js +134 -0
- package/build/facades/reports.js.map +1 -0
- package/build/facades/session.d.ts +21 -0
- package/build/facades/session.d.ts.map +1 -0
- package/build/facades/session.js +52 -0
- package/build/facades/session.js.map +1 -0
- package/build/facades/settings.d.ts +37 -0
- package/build/facades/settings.d.ts.map +1 -0
- package/build/facades/settings.js +55 -0
- package/build/facades/settings.js.map +1 -0
- package/build/facades/speech.d.ts +30 -0
- package/build/facades/speech.d.ts.map +1 -0
- package/build/facades/speech.js +37 -0
- package/build/facades/speech.js.map +1 -0
- package/build/index.d.ts +43 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +45 -0
- package/build/index.js.map +1 -0
- package/build/internal.d.ts +67 -0
- package/build/internal.d.ts.map +1 -0
- package/build/internal.js +90 -0
- package/build/internal.js.map +1 -0
- package/build/runtime/bootstrap.d.ts +83 -0
- package/build/runtime/bootstrap.d.ts.map +1 -0
- package/build/runtime/bootstrap.js +56 -0
- package/build/runtime/bootstrap.js.map +1 -0
- package/build/runtime/config.d.ts +146 -0
- package/build/runtime/config.d.ts.map +1 -0
- package/build/runtime/config.js +18 -0
- package/build/runtime/config.js.map +1 -0
- package/build/runtime/streamConfig.d.ts +4 -0
- package/build/runtime/streamConfig.d.ts.map +1 -0
- package/build/runtime/streamConfig.js +38 -0
- package/build/runtime/streamConfig.js.map +1 -0
- package/build/services/AppRegistry.d.ts +269 -0
- package/build/services/AppRegistry.d.ts.map +1 -0
- package/build/services/AppRegistry.js +1079 -0
- package/build/services/AppRegistry.js.map +1 -0
- package/build/services/AudioCloudUplink.d.ts +9 -0
- package/build/services/AudioCloudUplink.d.ts.map +1 -0
- package/build/services/AudioCloudUplink.js +48 -0
- package/build/services/AudioCloudUplink.js.map +1 -0
- package/build/services/AudioPlaybackService.d.ts +175 -0
- package/build/services/AudioPlaybackService.d.ts.map +1 -0
- package/build/services/AudioPlaybackService.js +705 -0
- package/build/services/AudioPlaybackService.js.map +1 -0
- package/build/services/AutomaticReportResult.d.ts +20 -0
- package/build/services/AutomaticReportResult.d.ts.map +1 -0
- package/build/services/AutomaticReportResult.js +29 -0
- package/build/services/AutomaticReportResult.js.map +1 -0
- package/build/services/BlobStore.d.ts +91 -0
- package/build/services/BlobStore.d.ts.map +1 -0
- package/build/services/BlobStore.js +668 -0
- package/build/services/BlobStore.js.map +1 -0
- package/build/services/CaptionsTesterReportService.d.ts +4 -0
- package/build/services/CaptionsTesterReportService.d.ts.map +1 -0
- package/build/services/CaptionsTesterReportService.js +80 -0
- package/build/services/CaptionsTesterReportService.js.map +1 -0
- package/build/services/CloudAudioSubscriptionSync.d.ts +24 -0
- package/build/services/CloudAudioSubscriptionSync.d.ts.map +1 -0
- package/build/services/CloudAudioSubscriptionSync.js +39 -0
- package/build/services/CloudAudioSubscriptionSync.js.map +1 -0
- package/build/services/CloudClientService.d.ts +143 -0
- package/build/services/CloudClientService.d.ts.map +1 -0
- package/build/services/CloudClientService.js +644 -0
- package/build/services/CloudClientService.js.map +1 -0
- package/build/services/CloudTranscriptE2EMetrics.d.ts +4 -0
- package/build/services/CloudTranscriptE2EMetrics.d.ts.map +1 -0
- package/build/services/CloudTranscriptE2EMetrics.js +24 -0
- package/build/services/CloudTranscriptE2EMetrics.js.map +1 -0
- package/build/services/ConnectionCoordinator.d.ts +51 -0
- package/build/services/ConnectionCoordinator.d.ts.map +1 -0
- package/build/services/ConnectionCoordinator.js +34 -0
- package/build/services/ConnectionCoordinator.js.map +1 -0
- package/build/services/DevServerBridge.d.ts +63 -0
- package/build/services/DevServerBridge.d.ts.map +1 -0
- package/build/services/DevServerBridge.js +294 -0
- package/build/services/DevServerBridge.js.map +1 -0
- package/build/services/DeviceEventRouter.d.ts +3 -0
- package/build/services/DeviceEventRouter.d.ts.map +1 -0
- package/build/services/DeviceEventRouter.js +190 -0
- package/build/services/DeviceEventRouter.js.map +1 -0
- package/build/services/DeviceStoreHydration.d.ts +38 -0
- package/build/services/DeviceStoreHydration.d.ts.map +1 -0
- package/build/services/DeviceStoreHydration.js +124 -0
- package/build/services/DeviceStoreHydration.js.map +1 -0
- package/build/services/DisplayProcessor.d.ts +223 -0
- package/build/services/DisplayProcessor.d.ts.map +1 -0
- package/build/services/DisplayProcessor.js +552 -0
- package/build/services/DisplayProcessor.js.map +1 -0
- package/build/services/GlassesReadiness.d.ts +41 -0
- package/build/services/GlassesReadiness.d.ts.map +1 -0
- package/build/services/GlassesReadiness.js +82 -0
- package/build/services/GlassesReadiness.js.map +1 -0
- package/build/services/GlassesSettingsSync.d.ts +33 -0
- package/build/services/GlassesSettingsSync.d.ts.map +1 -0
- package/build/services/GlassesSettingsSync.js +121 -0
- package/build/services/GlassesSettingsSync.js.map +1 -0
- package/build/services/GlassesStatusProjection.d.ts +3 -0
- package/build/services/GlassesStatusProjection.d.ts.map +1 -0
- package/build/services/GlassesStatusProjection.js +65 -0
- package/build/services/GlassesStatusProjection.js.map +1 -0
- package/build/services/HeadingService.d.ts +27 -0
- package/build/services/HeadingService.d.ts.map +1 -0
- package/build/services/HeadingService.js +96 -0
- package/build/services/HeadingService.js.map +1 -0
- package/build/services/LocalDisplayManager.d.ts +139 -0
- package/build/services/LocalDisplayManager.d.ts.map +1 -0
- package/build/services/LocalDisplayManager.js +579 -0
- package/build/services/LocalDisplayManager.js.map +1 -0
- package/build/services/LocalMiniappRuntime.d.ts +439 -0
- package/build/services/LocalMiniappRuntime.d.ts.map +1 -0
- package/build/services/LocalMiniappRuntime.js +3695 -0
- package/build/services/LocalMiniappRuntime.js.map +1 -0
- package/build/services/LocalSttFallbackCoordinator.d.ts +57 -0
- package/build/services/LocalSttFallbackCoordinator.d.ts.map +1 -0
- package/build/services/LocalSttFallbackCoordinator.js +137 -0
- package/build/services/LocalSttFallbackCoordinator.js.map +1 -0
- package/build/services/MentraJSCrashController.d.ts +97 -0
- package/build/services/MentraJSCrashController.d.ts.map +1 -0
- package/build/services/MentraJSCrashController.js +138 -0
- package/build/services/MentraJSCrashController.js.map +1 -0
- package/build/services/MentraJSCrashloopReportService.d.ts +9 -0
- package/build/services/MentraJSCrashloopReportService.d.ts.map +1 -0
- package/build/services/MentraJSCrashloopReportService.js +54 -0
- package/build/services/MentraJSCrashloopReportService.js.map +1 -0
- package/build/services/MentraJSLogPipeline.d.ts +87 -0
- package/build/services/MentraJSLogPipeline.d.ts.map +1 -0
- package/build/services/MentraJSLogPipeline.js +137 -0
- package/build/services/MentraJSLogPipeline.js.map +1 -0
- package/build/services/MentraJSRouter.d.ts +203 -0
- package/build/services/MentraJSRouter.d.ts.map +1 -0
- package/build/services/MentraJSRouter.js +480 -0
- package/build/services/MentraJSRouter.js.map +1 -0
- package/build/services/MentraUIRouter.d.ts +137 -0
- package/build/services/MentraUIRouter.d.ts.map +1 -0
- package/build/services/MentraUIRouter.js +210 -0
- package/build/services/MentraUIRouter.js.map +1 -0
- package/build/services/MicStateCoordinator.d.ts +37 -0
- package/build/services/MicStateCoordinator.d.ts.map +1 -0
- package/build/services/MicStateCoordinator.js +81 -0
- package/build/services/MicStateCoordinator.js.map +1 -0
- package/build/services/MiniappEngine.d.ts +31 -0
- package/build/services/MiniappEngine.d.ts.map +1 -0
- package/build/services/MiniappEngine.js +119 -0
- package/build/services/MiniappEngine.js.map +1 -0
- package/build/services/MiniappLauncher.d.ts +129 -0
- package/build/services/MiniappLauncher.d.ts.map +1 -0
- package/build/services/MiniappLauncher.js +291 -0
- package/build/services/MiniappLauncher.js.map +1 -0
- package/build/services/MiniappRunningRegistry.d.ts +24 -0
- package/build/services/MiniappRunningRegistry.d.ts.map +1 -0
- package/build/services/MiniappRunningRegistry.js +52 -0
- package/build/services/MiniappRunningRegistry.js.map +1 -0
- package/build/services/NativeHttpResponse.d.ts +3 -0
- package/build/services/NativeHttpResponse.d.ts.map +1 -0
- package/build/services/NativeHttpResponse.js +6 -0
- package/build/services/NativeHttpResponse.js.map +1 -0
- package/build/services/NavigationHandlers.d.ts +90 -0
- package/build/services/NavigationHandlers.d.ts.map +1 -0
- package/build/services/NavigationHandlers.js +379 -0
- package/build/services/NavigationHandlers.js.map +1 -0
- package/build/services/NavigationService.d.ts +254 -0
- package/build/services/NavigationService.d.ts.map +1 -0
- package/build/services/NavigationService.js +553 -0
- package/build/services/NavigationService.js.map +1 -0
- package/build/services/NotificationsEmitter.d.ts +28 -0
- package/build/services/NotificationsEmitter.d.ts.map +1 -0
- package/build/services/NotificationsEmitter.js +22 -0
- package/build/services/NotificationsEmitter.js.map +1 -0
- package/build/services/OfflineSpeechModelService.d.ts +33 -0
- package/build/services/OfflineSpeechModelService.d.ts.map +1 -0
- package/build/services/OfflineSpeechModelService.js +136 -0
- package/build/services/OfflineSpeechModelService.js.map +1 -0
- package/build/services/OtaInstallCoordinator.d.ts +195 -0
- package/build/services/OtaInstallCoordinator.d.ts.map +1 -0
- package/build/services/OtaInstallCoordinator.js +1047 -0
- package/build/services/OtaInstallCoordinator.js.map +1 -0
- package/build/services/OtaService.d.ts +3 -0
- package/build/services/OtaService.d.ts.map +1 -0
- package/build/services/OtaService.js +65 -0
- package/build/services/OtaService.js.map +1 -0
- package/build/services/OtaUpdateCheckService.d.ts +65 -0
- package/build/services/OtaUpdateCheckService.d.ts.map +1 -0
- package/build/services/OtaUpdateCheckService.js +260 -0
- package/build/services/OtaUpdateCheckService.js.map +1 -0
- package/build/services/PairingIdentity.d.ts +80 -0
- package/build/services/PairingIdentity.d.ts.map +1 -0
- package/build/services/PairingIdentity.js +145 -0
- package/build/services/PairingIdentity.js.map +1 -0
- package/build/services/PhoneCalendarHelpers.d.ts +32 -0
- package/build/services/PhoneCalendarHelpers.d.ts.map +1 -0
- package/build/services/PhoneCalendarHelpers.js +157 -0
- package/build/services/PhoneCalendarHelpers.js.map +1 -0
- package/build/services/PhoneCalendarService.d.ts +5 -0
- package/build/services/PhoneCalendarService.d.ts.map +1 -0
- package/build/services/PhoneCalendarService.js +24 -0
- package/build/services/PhoneCalendarService.js.map +1 -0
- package/build/services/PhoneCameraFovCoordinator.d.ts +28 -0
- package/build/services/PhoneCameraFovCoordinator.d.ts.map +1 -0
- package/build/services/PhoneCameraFovCoordinator.js +180 -0
- package/build/services/PhoneCameraFovCoordinator.js.map +1 -0
- package/build/services/PhoneLocationService.d.ts +36 -0
- package/build/services/PhoneLocationService.d.ts.map +1 -0
- package/build/services/PhoneLocationService.js +115 -0
- package/build/services/PhoneLocationService.js.map +1 -0
- package/build/services/PhoneNotificationsSync.d.ts +3 -0
- package/build/services/PhoneNotificationsSync.d.ts.map +1 -0
- package/build/services/PhoneNotificationsSync.js +35 -0
- package/build/services/PhoneNotificationsSync.js.map +1 -0
- package/build/services/PhonePhotoCoordinator.d.ts +103 -0
- package/build/services/PhonePhotoCoordinator.d.ts.map +1 -0
- package/build/services/PhonePhotoCoordinator.js +326 -0
- package/build/services/PhonePhotoCoordinator.js.map +1 -0
- package/build/services/PhoneStreamCoordinator.d.ts +168 -0
- package/build/services/PhoneStreamCoordinator.d.ts.map +1 -0
- package/build/services/PhoneStreamCoordinator.js +632 -0
- package/build/services/PhoneStreamCoordinator.js.map +1 -0
- package/build/services/PhoneVideoCoordinator.d.ts +50 -0
- package/build/services/PhoneVideoCoordinator.d.ts.map +1 -0
- package/build/services/PhoneVideoCoordinator.js +147 -0
- package/build/services/PhoneVideoCoordinator.js.map +1 -0
- package/build/services/STTModelManager.d.ts +65 -0
- package/build/services/STTModelManager.d.ts.map +1 -0
- package/build/services/STTModelManager.js +292 -0
- package/build/services/STTModelManager.js.map +1 -0
- package/build/services/SceneRenderer.d.ts +90 -0
- package/build/services/SceneRenderer.d.ts.map +1 -0
- package/build/services/SceneRenderer.js +248 -0
- package/build/services/SceneRenderer.js.map +1 -0
- package/build/services/SentenceTtsPipeline.d.ts +31 -0
- package/build/services/SentenceTtsPipeline.d.ts.map +1 -0
- package/build/services/SentenceTtsPipeline.js +67 -0
- package/build/services/SentenceTtsPipeline.js.map +1 -0
- package/build/services/StreamLifecycleController.d.ts +67 -0
- package/build/services/StreamLifecycleController.d.ts.map +1 -0
- package/build/services/StreamLifecycleController.js +152 -0
- package/build/services/StreamLifecycleController.js.map +1 -0
- package/build/services/TTSModelManager.d.ts +90 -0
- package/build/services/TTSModelManager.d.ts.map +1 -0
- package/build/services/TTSModelManager.js +366 -0
- package/build/services/TTSModelManager.js.map +1 -0
- package/build/services/TranscriptionRouting.d.ts +12 -0
- package/build/services/TranscriptionRouting.d.ts.map +1 -0
- package/build/services/TranscriptionRouting.js +24 -0
- package/build/services/TranscriptionRouting.js.map +1 -0
- package/build/services/WebviewBridge.d.ts +22 -0
- package/build/services/WebviewBridge.d.ts.map +1 -0
- package/build/services/WebviewBridge.js +47 -0
- package/build/services/WebviewBridge.js.map +1 -0
- package/build/services/asg/GalleryMediaIntegrityReportService.d.ts +17 -0
- package/build/services/asg/GalleryMediaIntegrityReportService.d.ts.map +1 -0
- package/build/services/asg/GalleryMediaIntegrityReportService.js +43 -0
- package/build/services/asg/GalleryMediaIntegrityReportService.js.map +1 -0
- package/build/services/asg/asgCameraApi.d.ts +205 -0
- package/build/services/asg/asgCameraApi.d.ts.map +1 -0
- package/build/services/asg/asgCameraApi.js +1410 -0
- package/build/services/asg/asgCameraApi.js.map +1 -0
- package/build/services/asg/cameraRollExportCoordinator.d.ts +60 -0
- package/build/services/asg/cameraRollExportCoordinator.d.ts.map +1 -0
- package/build/services/asg/cameraRollExportCoordinator.js +618 -0
- package/build/services/asg/cameraRollExportCoordinator.js.map +1 -0
- package/build/services/asg/cameraRollExportLedger.d.ts +44 -0
- package/build/services/asg/cameraRollExportLedger.d.ts.map +1 -0
- package/build/services/asg/cameraRollExportLedger.js +78 -0
- package/build/services/asg/cameraRollExportLedger.js.map +1 -0
- package/build/services/asg/galleryMediaValidation.d.ts +29 -0
- package/build/services/asg/galleryMediaValidation.d.ts.map +1 -0
- package/build/services/asg/galleryMediaValidation.js +149 -0
- package/build/services/asg/galleryMediaValidation.js.map +1 -0
- package/build/services/asg/galleryNotices.d.ts +33 -0
- package/build/services/asg/galleryNotices.d.ts.map +1 -0
- package/build/services/asg/galleryNotices.js +29 -0
- package/build/services/asg/galleryNotices.js.map +1 -0
- package/build/services/asg/galleryPathMigration.d.ts +3 -0
- package/build/services/asg/galleryPathMigration.d.ts.map +1 -0
- package/build/services/asg/galleryPathMigration.js +26 -0
- package/build/services/asg/galleryPathMigration.js.map +1 -0
- package/build/services/asg/gallerySettingsService.d.ts +20 -0
- package/build/services/asg/gallerySettingsService.d.ts.map +1 -0
- package/build/services/asg/gallerySettingsService.js +53 -0
- package/build/services/asg/gallerySettingsService.js.map +1 -0
- package/build/services/asg/gallerySyncNotifications.d.ts +56 -0
- package/build/services/asg/gallerySyncNotifications.d.ts.map +1 -0
- package/build/services/asg/gallerySyncNotifications.js +198 -0
- package/build/services/asg/gallerySyncNotifications.js.map +1 -0
- package/build/services/asg/gallerySyncService.d.ts +137 -0
- package/build/services/asg/gallerySyncService.d.ts.map +1 -0
- package/build/services/asg/gallerySyncService.js +1933 -0
- package/build/services/asg/gallerySyncService.js.map +1 -0
- package/build/services/asg/galleryTransferLedger.d.ts +58 -0
- package/build/services/asg/galleryTransferLedger.d.ts.map +1 -0
- package/build/services/asg/galleryTransferLedger.js +225 -0
- package/build/services/asg/galleryTransferLedger.js.map +1 -0
- package/build/services/asg/localNetworkTransport.d.ts +15 -0
- package/build/services/asg/localNetworkTransport.d.ts.map +1 -0
- package/build/services/asg/localNetworkTransport.js +144 -0
- package/build/services/asg/localNetworkTransport.js.map +1 -0
- package/build/services/asg/localStorageService.d.ts +146 -0
- package/build/services/asg/localStorageService.d.ts.map +1 -0
- package/build/services/asg/localStorageService.js +572 -0
- package/build/services/asg/localStorageService.js.map +1 -0
- package/build/services/asg/mediaProcessingQueue.d.ts +70 -0
- package/build/services/asg/mediaProcessingQueue.d.ts.map +1 -0
- package/build/services/asg/mediaProcessingQueue.js +451 -0
- package/build/services/asg/mediaProcessingQueue.js.map +1 -0
- package/build/services/asgOtaVersionUrl.d.ts +2 -0
- package/build/services/asgOtaVersionUrl.d.ts.map +1 -0
- package/build/services/asgOtaVersionUrl.js +36 -0
- package/build/services/asgOtaVersionUrl.js.map +1 -0
- package/build/services/blobPaths.d.ts +31 -0
- package/build/services/blobPaths.d.ts.map +1 -0
- package/build/services/blobPaths.js +86 -0
- package/build/services/blobPaths.js.map +1 -0
- package/build/services/cloudStreamApi.d.ts +59 -0
- package/build/services/cloudStreamApi.d.ts.map +1 -0
- package/build/services/cloudStreamApi.js +81 -0
- package/build/services/cloudStreamApi.js.map +1 -0
- package/build/services/gallerySyncClock.d.ts +17 -0
- package/build/services/gallerySyncClock.d.ts.map +1 -0
- package/build/services/gallerySyncClock.js +21 -0
- package/build/services/gallerySyncClock.js.map +1 -0
- package/build/services/glassesClockSync.d.ts +20 -0
- package/build/services/glassesClockSync.d.ts.map +1 -0
- package/build/services/glassesClockSync.js +97 -0
- package/build/services/glassesClockSync.js.map +1 -0
- package/build/services/manifestVersionGate.d.ts +28 -0
- package/build/services/manifestVersionGate.d.ts.map +1 -0
- package/build/services/manifestVersionGate.js +41 -0
- package/build/services/manifestVersionGate.js.map +1 -0
- package/build/services/mentraUiShim.d.ts +38 -0
- package/build/services/mentraUiShim.d.ts.map +1 -0
- package/build/services/mentraUiShim.js +360 -0
- package/build/services/mentraUiShim.js.map +1 -0
- package/build/services/navigation/roadNameResolver.d.ts +67 -0
- package/build/services/navigation/roadNameResolver.d.ts.map +1 -0
- package/build/services/navigation/roadNameResolver.js +96 -0
- package/build/services/navigation/roadNameResolver.js.map +1 -0
- package/build/services/navigation/routesApiCodec.d.ts +38 -0
- package/build/services/navigation/routesApiCodec.d.ts.map +1 -0
- package/build/services/navigation/routesApiCodec.js +68 -0
- package/build/services/navigation/routesApiCodec.js.map +1 -0
- package/build/services/otaDisplayState.d.ts +42 -0
- package/build/services/otaDisplayState.d.ts.map +1 -0
- package/build/services/otaDisplayState.js +92 -0
- package/build/services/otaDisplayState.js.map +1 -0
- package/build/services/otaInstallPolicy.d.ts +81 -0
- package/build/services/otaInstallPolicy.d.ts.map +1 -0
- package/build/services/otaInstallPolicy.js +96 -0
- package/build/services/otaInstallPolicy.js.map +1 -0
- package/build/services/otaLegacyMapping.d.ts +22 -0
- package/build/services/otaLegacyMapping.d.ts.map +1 -0
- package/build/services/otaLegacyMapping.js +56 -0
- package/build/services/otaLegacyMapping.js.map +1 -0
- package/build/services/slimStreamStatus.d.ts +7 -0
- package/build/services/slimStreamStatus.d.ts.map +1 -0
- package/build/services/slimStreamStatus.js +26 -0
- package/build/services/slimStreamStatus.js.map +1 -0
- package/build/stores/apps.d.ts +104 -0
- package/build/stores/apps.d.ts.map +1 -0
- package/build/stores/apps.js +492 -0
- package/build/stores/apps.js.map +1 -0
- package/build/stores/bluetoothSettingKeys.d.ts +4 -0
- package/build/stores/bluetoothSettingKeys.d.ts.map +1 -0
- package/build/stores/bluetoothSettingKeys.js +31 -0
- package/build/stores/bluetoothSettingKeys.js.map +1 -0
- package/build/stores/cloudClientStatus.d.ts +9 -0
- package/build/stores/cloudClientStatus.d.ts.map +1 -0
- package/build/stores/cloudClientStatus.js +24 -0
- package/build/stores/cloudClientStatus.js.map +1 -0
- package/build/stores/connection.d.ts +22 -0
- package/build/stores/connection.d.ts.map +1 -0
- package/build/stores/connection.js +43 -0
- package/build/stores/connection.js.map +1 -0
- package/build/stores/core.d.ts +15 -0
- package/build/stores/core.d.ts.map +1 -0
- package/build/stores/core.js +21 -0
- package/build/stores/core.js.map +1 -0
- package/build/stores/display.d.ts +24 -0
- package/build/stores/display.d.ts.map +1 -0
- package/build/stores/display.js +96 -0
- package/build/stores/display.js.map +1 -0
- package/build/stores/gallerySync.d.ts +101 -0
- package/build/stores/gallerySync.d.ts.map +1 -0
- package/build/stores/gallerySync.js +217 -0
- package/build/stores/gallerySync.js.map +1 -0
- package/build/stores/glasses.d.ts +62 -0
- package/build/stores/glasses.d.ts.map +1 -0
- package/build/stores/glasses.js +203 -0
- package/build/stores/glasses.js.map +1 -0
- package/build/stores/settings.d.ts +37 -0
- package/build/stores/settings.d.ts.map +1 -0
- package/build/stores/settings.js +922 -0
- package/build/stores/settings.js.map +1 -0
- package/build/types/applet.d.ts +96 -0
- package/build/types/applet.d.ts.map +1 -0
- package/build/types/applet.js +5 -0
- package/build/types/applet.js.map +1 -0
- package/build/types/asg.d.ts +53 -0
- package/build/types/asg.d.ts.map +1 -0
- package/build/types/asg.js +2 -0
- package/build/types/asg.js.map +1 -0
- package/build/types/capabilities/even-realities-g1.d.ts +12 -0
- package/build/types/capabilities/even-realities-g1.d.ts.map +1 -0
- package/build/types/capabilities/even-realities-g1.js +55 -0
- package/build/types/capabilities/even-realities-g1.js.map +1 -0
- package/build/types/capabilities/even-realities-g2.d.ts +12 -0
- package/build/types/capabilities/even-realities-g2.d.ts.map +1 -0
- package/build/types/capabilities/even-realities-g2.js +75 -0
- package/build/types/capabilities/even-realities-g2.js.map +1 -0
- package/build/types/capabilities/mentra-display.d.ts +12 -0
- package/build/types/capabilities/mentra-display.d.ts.map +1 -0
- package/build/types/capabilities/mentra-display.js +63 -0
- package/build/types/capabilities/mentra-display.js.map +1 -0
- package/build/types/capabilities/mentra-live.d.ts +12 -0
- package/build/types/capabilities/mentra-live.d.ts.map +1 -0
- package/build/types/capabilities/mentra-live.js +92 -0
- package/build/types/capabilities/mentra-live.js.map +1 -0
- package/build/types/capabilities/none.d.ts +13 -0
- package/build/types/capabilities/none.d.ts.map +1 -0
- package/build/types/capabilities/none.js +65 -0
- package/build/types/capabilities/none.js.map +1 -0
- package/build/types/capabilities/simulated-glasses.d.ts +13 -0
- package/build/types/capabilities/simulated-glasses.d.ts.map +1 -0
- package/build/types/capabilities/simulated-glasses.js +65 -0
- package/build/types/capabilities/simulated-glasses.js.map +1 -0
- package/build/types/capabilities/vuzix-z100.d.ts +12 -0
- package/build/types/capabilities/vuzix-z100.d.ts.map +1 -0
- package/build/types/capabilities/vuzix-z100.js +52 -0
- package/build/types/capabilities/vuzix-z100.js.map +1 -0
- package/build/types/enums.d.ts +40 -0
- package/build/types/enums.d.ts.map +1 -0
- package/build/types/enums.js +44 -0
- package/build/types/enums.js.map +1 -0
- package/build/types/hardware.d.ts +160 -0
- package/build/types/hardware.d.ts.map +1 -0
- package/build/types/hardware.js +36 -0
- package/build/types/hardware.js.map +1 -0
- package/build/types/index.d.ts +11 -0
- package/build/types/index.d.ts.map +1 -0
- package/build/types/index.js +10 -0
- package/build/types/index.js.map +1 -0
- package/build/utils/GlobalEventEmitter.d.ts +10 -0
- package/build/utils/GlobalEventEmitter.d.ts.map +1 -0
- package/build/utils/GlobalEventEmitter.js +13 -0
- package/build/utils/GlobalEventEmitter.js.map +1 -0
- package/build/utils/cloudClient/RnUdpAdapter.d.ts +3 -0
- package/build/utils/cloudClient/RnUdpAdapter.d.ts.map +1 -0
- package/build/utils/cloudClient/RnUdpAdapter.js +41 -0
- package/build/utils/cloudClient/RnUdpAdapter.js.map +1 -0
- package/build/utils/cloudClient/cloudSecureStore.d.ts +3 -0
- package/build/utils/cloudClient/cloudSecureStore.d.ts.map +1 -0
- package/build/utils/cloudClient/cloudSecureStore.js +26 -0
- package/build/utils/cloudClient/cloudSecureStore.js.map +1 -0
- package/build/utils/debouncedPatch.d.ts +6 -0
- package/build/utils/debouncedPatch.d.ts.map +1 -0
- package/build/utils/debouncedPatch.js +25 -0
- package/build/utils/debouncedPatch.js.map +1 -0
- package/build/utils/devLogging.d.ts +26 -0
- package/build/utils/devLogging.d.ts.map +1 -0
- package/build/utils/devLogging.js +116 -0
- package/build/utils/devLogging.js.map +1 -0
- package/build/utils/devMiniappLaunch.d.ts +44 -0
- package/build/utils/devMiniappLaunch.d.ts.map +1 -0
- package/build/utils/devMiniappLaunch.js +52 -0
- package/build/utils/devMiniappLaunch.js.map +1 -0
- package/build/utils/diagnosticContext.d.ts +3 -0
- package/build/utils/diagnosticContext.d.ts.map +1 -0
- package/build/utils/diagnosticContext.js +119 -0
- package/build/utils/diagnosticContext.js.map +1 -0
- package/build/utils/display/composer/ColumnComposer.d.ts +131 -0
- package/build/utils/display/composer/ColumnComposer.d.ts.map +1 -0
- package/build/utils/display/composer/ColumnComposer.js +204 -0
- package/build/utils/display/composer/ColumnComposer.js.map +1 -0
- package/build/utils/display/composer/index.d.ts +9 -0
- package/build/utils/display/composer/index.d.ts.map +1 -0
- package/build/utils/display/composer/index.js +9 -0
- package/build/utils/display/composer/index.js.map +1 -0
- package/build/utils/display/helpers/DisplayHelpers.d.ts +165 -0
- package/build/utils/display/helpers/DisplayHelpers.d.ts.map +1 -0
- package/build/utils/display/helpers/DisplayHelpers.js +312 -0
- package/build/utils/display/helpers/DisplayHelpers.js.map +1 -0
- package/build/utils/display/helpers/ScrollView.d.ts +183 -0
- package/build/utils/display/helpers/ScrollView.d.ts.map +1 -0
- package/build/utils/display/helpers/ScrollView.js +257 -0
- package/build/utils/display/helpers/ScrollView.js.map +1 -0
- package/build/utils/display/helpers/index.d.ts +11 -0
- package/build/utils/display/helpers/index.d.ts.map +1 -0
- package/build/utils/display/helpers/index.js +10 -0
- package/build/utils/display/helpers/index.js.map +1 -0
- package/build/utils/display/index.d.ts +174 -0
- package/build/utils/display/index.d.ts.map +1 -0
- package/build/utils/display/index.js +185 -0
- package/build/utils/display/index.js.map +1 -0
- package/build/utils/display/measurer/TextMeasurer.d.ts +160 -0
- package/build/utils/display/measurer/TextMeasurer.d.ts.map +1 -0
- package/build/utils/display/measurer/TextMeasurer.js +273 -0
- package/build/utils/display/measurer/TextMeasurer.js.map +1 -0
- package/build/utils/display/measurer/index.d.ts +10 -0
- package/build/utils/display/measurer/index.d.ts.map +1 -0
- package/build/utils/display/measurer/index.js +11 -0
- package/build/utils/display/measurer/index.js.map +1 -0
- package/build/utils/display/measurer/script-detection.d.ts +53 -0
- package/build/utils/display/measurer/script-detection.d.ts.map +1 -0
- package/build/utils/display/measurer/script-detection.js +184 -0
- package/build/utils/display/measurer/script-detection.js.map +1 -0
- package/build/utils/display/profiles/g1.d.ts +33 -0
- package/build/utils/display/profiles/g1.d.ts.map +1 -0
- package/build/utils/display/profiles/g1.js +213 -0
- package/build/utils/display/profiles/g1.js.map +1 -0
- package/build/utils/display/profiles/g2.d.ts +13 -0
- package/build/utils/display/profiles/g2.d.ts.map +1 -0
- package/build/utils/display/profiles/g2.js +34 -0
- package/build/utils/display/profiles/g2.js.map +1 -0
- package/build/utils/display/profiles/index.d.ts +12 -0
- package/build/utils/display/profiles/index.d.ts.map +1 -0
- package/build/utils/display/profiles/index.js +15 -0
- package/build/utils/display/profiles/index.js.map +1 -0
- package/build/utils/display/profiles/nex.d.ts +10 -0
- package/build/utils/display/profiles/nex.d.ts.map +1 -0
- package/build/utils/display/profiles/nex.js +150 -0
- package/build/utils/display/profiles/nex.js.map +1 -0
- package/build/utils/display/profiles/types.d.ts +103 -0
- package/build/utils/display/profiles/types.d.ts.map +1 -0
- package/build/utils/display/profiles/types.js +2 -0
- package/build/utils/display/profiles/types.js.map +1 -0
- package/build/utils/display/profiles/z100.d.ts +33 -0
- package/build/utils/display/profiles/z100.d.ts.map +1 -0
- package/build/utils/display/profiles/z100.js +182 -0
- package/build/utils/display/profiles/z100.js.map +1 -0
- package/build/utils/display/scene/degrade.d.ts +25 -0
- package/build/utils/display/scene/degrade.d.ts.map +1 -0
- package/build/utils/display/scene/degrade.js +64 -0
- package/build/utils/display/scene/degrade.js.map +1 -0
- package/build/utils/display/scene/differ.d.ts +38 -0
- package/build/utils/display/scene/differ.d.ts.map +1 -0
- package/build/utils/display/scene/differ.js +107 -0
- package/build/utils/display/scene/differ.js.map +1 -0
- package/build/utils/display/scene/index.d.ts +10 -0
- package/build/utils/display/scene/index.d.ts.map +1 -0
- package/build/utils/display/scene/index.js +6 -0
- package/build/utils/display/scene/index.js.map +1 -0
- package/build/utils/display/scene/process.d.ts +35 -0
- package/build/utils/display/scene/process.d.ts.map +1 -0
- package/build/utils/display/scene/process.js +187 -0
- package/build/utils/display/scene/process.js.map +1 -0
- package/build/utils/display/scene/store.d.ts +48 -0
- package/build/utils/display/scene/store.d.ts.map +1 -0
- package/build/utils/display/scene/store.js +0 -0
- package/build/utils/display/scene/store.js.map +1 -0
- package/build/utils/display/scene/types.d.ts +120 -0
- package/build/utils/display/scene/types.d.ts.map +1 -0
- package/build/utils/display/scene/types.js +0 -0
- package/build/utils/display/scene/types.js.map +1 -0
- package/build/utils/display/wrapper/TextWrapper.d.ts +102 -0
- package/build/utils/display/wrapper/TextWrapper.d.ts.map +1 -0
- package/build/utils/display/wrapper/TextWrapper.js +471 -0
- package/build/utils/display/wrapper/TextWrapper.js.map +1 -0
- package/build/utils/display/wrapper/index.d.ts +12 -0
- package/build/utils/display/wrapper/index.d.ts.map +1 -0
- package/build/utils/display/wrapper/index.js +12 -0
- package/build/utils/display/wrapper/index.js.map +1 -0
- package/build/utils/display/wrapper/types.d.ts +75 -0
- package/build/utils/display/wrapper/types.d.ts.map +1 -0
- package/build/utils/display/wrapper/types.js +11 -0
- package/build/utils/display/wrapper/types.js.map +1 -0
- package/build/utils/e2eMetrics.d.ts +6 -0
- package/build/utils/e2eMetrics.d.ts.map +1 -0
- package/build/utils/e2eMetrics.js +27 -0
- package/build/utils/e2eMetrics.js.map +1 -0
- package/build/utils/hardware/hardware.d.ts +42 -0
- package/build/utils/hardware/hardware.d.ts.map +1 -0
- package/build/utils/hardware/hardware.js +127 -0
- package/build/utils/hardware/hardware.js.map +1 -0
- package/build/utils/hardware/index.d.ts +2 -0
- package/build/utils/hardware/index.d.ts.map +1 -0
- package/build/utils/hardware/index.js +2 -0
- package/build/utils/hardware/index.js.map +1 -0
- package/build/utils/miniappGlobals.d.ts +60 -0
- package/build/utils/miniappGlobals.d.ts.map +1 -0
- package/build/utils/miniappGlobals.js +224 -0
- package/build/utils/miniappGlobals.js.map +1 -0
- package/build/utils/permissions/MediaLibraryPermissions.d.ts +45 -0
- package/build/utils/permissions/MediaLibraryPermissions.d.ts.map +1 -0
- package/build/utils/permissions/MediaLibraryPermissions.js +145 -0
- package/build/utils/permissions/MediaLibraryPermissions.js.map +1 -0
- package/build/utils/permissions/galleryDisplayName.d.ts +8 -0
- package/build/utils/permissions/galleryDisplayName.d.ts.map +1 -0
- package/build/utils/permissions/galleryDisplayName.js +25 -0
- package/build/utils/permissions/galleryDisplayName.js.map +1 -0
- package/build/utils/storage/index.d.ts +3 -0
- package/build/utils/storage/index.d.ts.map +1 -0
- package/build/utils/storage/index.js +3 -0
- package/build/utils/storage/index.js.map +1 -0
- package/build/utils/storage/storage.d.ts +24 -0
- package/build/utils/storage/storage.d.ts.map +1 -0
- package/build/utils/storage/storage.js +85 -0
- package/build/utils/storage/storage.js.map +1 -0
- package/build/utils/storage/zip.d.ts +3 -0
- package/build/utils/storage/zip.d.ts.map +1 -0
- package/build/utils/storage/zip.js +14 -0
- package/build/utils/storage/zip.js.map +1 -0
- package/build/utils/timers/index.d.ts +3 -0
- package/build/utils/timers/index.d.ts.map +1 -0
- package/build/utils/timers/index.js +3 -0
- package/build/utils/timers/index.js.map +1 -0
- package/build/utils/timers/timers.d.ts +9 -0
- package/build/utils/timers/timers.d.ts.map +1 -0
- package/build/utils/timers/timers.js +105 -0
- package/build/utils/timers/timers.js.map +1 -0
- package/package.json +120 -0
- package/src/devtools.ts +13 -0
- package/src/engine.ts +173 -0
- package/src/facades/dev.ts +198 -0
- package/src/facades/display.ts +17 -0
- package/src/facades/displayMirror.ts +33 -0
- package/src/facades/gallery.ts +69 -0
- package/src/facades/glasses.ts +206 -0
- package/src/facades/glassesSettings.ts +56 -0
- package/src/facades/glassesWifi.ts +68 -0
- package/src/facades/miniapps.ts +55 -0
- package/src/facades/notifications.ts +15 -0
- package/src/facades/ota.ts +174 -0
- package/src/facades/pairing.ts +329 -0
- package/src/facades/permissions.ts +165 -0
- package/src/facades/phoneNotifications.ts +50 -0
- package/src/facades/reports.ts +185 -0
- package/src/facades/session.ts +55 -0
- package/src/facades/settings.ts +57 -0
- package/src/facades/speech.ts +38 -0
- package/src/index.ts +191 -0
- package/src/internal.ts +159 -0
- package/src/runtime/bootstrap.ts +118 -0
- package/src/runtime/config.ts +147 -0
- package/src/runtime/streamConfig.ts +34 -0
- package/src/services/AppRegistry.ts +1190 -0
- package/src/services/AudioCloudUplink.ts +50 -0
- package/src/services/AudioPlaybackService.ts +813 -0
- package/src/services/AutomaticReportResult.ts +48 -0
- package/src/services/BlobStore.ts +746 -0
- package/src/services/CaptionsTesterReportService.ts +107 -0
- package/src/services/CloudAudioSubscriptionSync.ts +41 -0
- package/src/services/CloudClientService.ts +689 -0
- package/src/services/CloudTranscriptE2EMetrics.ts +27 -0
- package/src/services/ConnectionCoordinator.ts +65 -0
- package/src/services/DevServerBridge.ts +332 -0
- package/src/services/DeviceEventRouter.ts +238 -0
- package/src/services/DeviceStoreHydration.ts +130 -0
- package/src/services/DisplayProcessor.ts +775 -0
- package/src/services/GlassesReadiness.ts +103 -0
- package/src/services/GlassesSettingsSync.ts +134 -0
- package/src/services/GlassesStatusProjection.ts +73 -0
- package/src/services/HeadingService.ts +98 -0
- package/src/services/LocalDisplayManager.ts +703 -0
- package/src/services/LocalMiniappRuntime.ts +4213 -0
- package/src/services/LocalSttFallbackCoordinator.ts +147 -0
- package/src/services/MentraJSCrashController.ts +189 -0
- package/src/services/MentraJSCrashloopReportService.ts +66 -0
- package/src/services/MentraJSLogPipeline.ts +166 -0
- package/src/services/MentraJSRouter.ts +557 -0
- package/src/services/MentraUIRouter.ts +244 -0
- package/src/services/MicStateCoordinator.ts +94 -0
- package/src/services/MiniappEngine.ts +143 -0
- package/src/services/MiniappLauncher.ts +340 -0
- package/src/services/MiniappRunningRegistry.ts +57 -0
- package/src/services/NativeHttpResponse.ts +6 -0
- package/src/services/NavigationHandlers.ts +423 -0
- package/src/services/NavigationService.ts +731 -0
- package/src/services/NotificationsEmitter.ts +48 -0
- package/src/services/OfflineSpeechModelService.ts +168 -0
- package/src/services/OtaInstallCoordinator.ts +1205 -0
- package/src/services/OtaService.ts +83 -0
- package/src/services/OtaUpdateCheckService.ts +386 -0
- package/src/services/PairingIdentity.ts +154 -0
- package/src/services/PhoneCalendarHelpers.ts +212 -0
- package/src/services/PhoneCalendarService.ts +42 -0
- package/src/services/PhoneCameraFovCoordinator.ts +195 -0
- package/src/services/PhoneLocationService.ts +122 -0
- package/src/services/PhoneNotificationsSync.ts +44 -0
- package/src/services/PhonePhotoCoordinator.ts +409 -0
- package/src/services/PhoneStreamCoordinator.ts +777 -0
- package/src/services/PhoneVideoCoordinator.ts +189 -0
- package/src/services/STTModelManager.ts +360 -0
- package/src/services/SceneRenderer.ts +292 -0
- package/src/services/SentenceTtsPipeline.ts +106 -0
- package/src/services/StreamLifecycleController.ts +213 -0
- package/src/services/TTSModelManager.ts +466 -0
- package/src/services/TranscriptionRouting.ts +37 -0
- package/src/services/WebviewBridge.ts +50 -0
- package/src/services/asg/GalleryMediaIntegrityReportService.ts +70 -0
- package/src/services/asg/asgCameraApi.ts +1695 -0
- package/src/services/asg/cameraRollExportCoordinator.ts +627 -0
- package/src/services/asg/cameraRollExportLedger.ts +122 -0
- package/src/services/asg/galleryMediaValidation.ts +183 -0
- package/src/services/asg/galleryNotices.ts +61 -0
- package/src/services/asg/galleryPathMigration.ts +22 -0
- package/src/services/asg/gallerySettingsService.ts +68 -0
- package/src/services/asg/gallerySyncNotifications.ts +236 -0
- package/src/services/asg/gallerySyncService.ts +2269 -0
- package/src/services/asg/galleryTransferLedger.ts +312 -0
- package/src/services/asg/localNetworkTransport.ts +173 -0
- package/src/services/asg/localStorageService.ts +652 -0
- package/src/services/asg/mediaProcessingQueue.ts +518 -0
- package/src/services/asgOtaVersionUrl.ts +41 -0
- package/src/services/blobPaths.ts +86 -0
- package/src/services/cloudStreamApi.ts +154 -0
- package/src/services/gallerySyncClock.ts +39 -0
- package/src/services/glassesClockSync.ts +115 -0
- package/src/services/manifestVersionGate.ts +43 -0
- package/src/services/mentraUiShim.ts +366 -0
- package/src/services/navigation/roadNameResolver.ts +112 -0
- package/src/services/navigation/routesApiCodec.ts +69 -0
- package/src/services/otaDisplayState.ts +115 -0
- package/src/services/otaInstallPolicy.ts +106 -0
- package/src/services/otaLegacyMapping.ts +71 -0
- package/src/services/slimStreamStatus.ts +28 -0
- package/src/stores/apps.ts +614 -0
- package/src/stores/bluetoothSettingKeys.ts +36 -0
- package/src/stores/cloudClientStatus.ts +37 -0
- package/src/stores/connection.ts +69 -0
- package/src/stores/core.ts +32 -0
- package/src/stores/display.ts +121 -0
- package/src/stores/gallerySync.ts +380 -0
- package/src/stores/glasses.ts +309 -0
- package/src/stores/settings.ts +1001 -0
- package/src/types/applet.ts +112 -0
- package/src/types/asg.ts +58 -0
- package/src/types/capabilities/even-realities-g1.ts +67 -0
- package/src/types/capabilities/even-realities-g2.ts +88 -0
- package/src/types/capabilities/mentra-display.ts +75 -0
- package/src/types/capabilities/mentra-live.ts +103 -0
- package/src/types/capabilities/none.ts +76 -0
- package/src/types/capabilities/simulated-glasses.ts +76 -0
- package/src/types/capabilities/vuzix-z100.ts +64 -0
- package/src/types/enums.ts +43 -0
- package/src/types/hardware.ts +203 -0
- package/src/types/index.ts +37 -0
- package/src/utils/GlobalEventEmitter.ts +14 -0
- package/src/utils/cloudClient/RnUdpAdapter.ts +47 -0
- package/src/utils/cloudClient/cloudSecureStore.ts +28 -0
- package/src/utils/debouncedPatch.ts +28 -0
- package/src/utils/devLogging.ts +140 -0
- package/src/utils/devMiniappLaunch.ts +68 -0
- package/src/utils/diagnosticContext.ts +155 -0
- package/src/utils/display/composer/ColumnComposer.ts +285 -0
- package/src/utils/display/composer/index.ts +15 -0
- package/src/utils/display/helpers/DisplayHelpers.ts +413 -0
- package/src/utils/display/helpers/ScrollView.ts +337 -0
- package/src/utils/display/helpers/index.ts +14 -0
- package/src/utils/display/index.ts +273 -0
- package/src/utils/display/measurer/TextMeasurer.ts +346 -0
- package/src/utils/display/measurer/index.ts +21 -0
- package/src/utils/display/measurer/script-detection.ts +218 -0
- package/src/utils/display/profiles/g1.ts +236 -0
- package/src/utils/display/profiles/g2.ts +39 -0
- package/src/utils/display/profiles/index.ts +28 -0
- package/src/utils/display/profiles/nex.ts +166 -0
- package/src/utils/display/profiles/types.ts +132 -0
- package/src/utils/display/profiles/z100.ts +198 -0
- package/src/utils/display/scene/degrade.ts +80 -0
- package/src/utils/display/scene/differ.ts +128 -0
- package/src/utils/display/scene/index.ts +21 -0
- package/src/utils/display/scene/process.ts +214 -0
- package/src/utils/display/scene/store.ts +0 -0
- package/src/utils/display/scene/types.ts +0 -0
- package/src/utils/display/wrapper/TextWrapper.ts +546 -0
- package/src/utils/display/wrapper/index.ts +15 -0
- package/src/utils/display/wrapper/types.ts +102 -0
- package/src/utils/e2eMetrics.ts +30 -0
- package/src/utils/hardware/hardware.ts +166 -0
- package/src/utils/hardware/index.ts +1 -0
- package/src/utils/miniappGlobals.ts +260 -0
- package/src/utils/permissions/MediaLibraryPermissions.ts +161 -0
- package/src/utils/permissions/galleryDisplayName.ts +28 -0
- package/src/utils/storage/index.ts +2 -0
- package/src/utils/storage/storage.ts +101 -0
- package/src/utils/storage/zip.ts +13 -0
- package/src/utils/timers/index.ts +2 -0
- package/src/utils/timers/timers.ts +139 -0
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
import { DisplayProfile } from "./types";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Vuzix Z100 glyph widths - extracted from NotoSans-Regular.ttf at 21px
|
|
5
|
+
*
|
|
6
|
+
* These are pixel widths at the default font size used by the Z100 display.
|
|
7
|
+
* The Z100 uses Noto Sans as its system font.
|
|
8
|
+
*
|
|
9
|
+
* Extracted using: node scripts/extract-font-metrics.js NotoSans-Regular.ttf 21
|
|
10
|
+
*/
|
|
11
|
+
const Z100_GLYPH_WIDTHS: Record<string, number> = {
|
|
12
|
+
// Space and punctuation
|
|
13
|
+
" ": 5,
|
|
14
|
+
"!": 6,
|
|
15
|
+
'"': 9,
|
|
16
|
+
"#": 14,
|
|
17
|
+
"$": 12,
|
|
18
|
+
"%": 17,
|
|
19
|
+
"&": 15,
|
|
20
|
+
"'": 5,
|
|
21
|
+
"(": 6,
|
|
22
|
+
")": 6,
|
|
23
|
+
"*": 12,
|
|
24
|
+
"+": 12,
|
|
25
|
+
",": 6,
|
|
26
|
+
"-": 7, // Hyphen width - important for line breaking
|
|
27
|
+
".": 6,
|
|
28
|
+
"/": 8,
|
|
29
|
+
|
|
30
|
+
// Numbers
|
|
31
|
+
"0": 12,
|
|
32
|
+
"1": 12,
|
|
33
|
+
"2": 12,
|
|
34
|
+
"3": 12,
|
|
35
|
+
"4": 12,
|
|
36
|
+
"5": 12,
|
|
37
|
+
"6": 12,
|
|
38
|
+
"7": 12,
|
|
39
|
+
"8": 12,
|
|
40
|
+
"9": 12,
|
|
41
|
+
|
|
42
|
+
// More punctuation
|
|
43
|
+
":": 6,
|
|
44
|
+
";": 6,
|
|
45
|
+
"<": 12,
|
|
46
|
+
"=": 12,
|
|
47
|
+
">": 12,
|
|
48
|
+
"?": 9,
|
|
49
|
+
"@": 19,
|
|
50
|
+
|
|
51
|
+
// Uppercase
|
|
52
|
+
"A": 13,
|
|
53
|
+
"B": 14,
|
|
54
|
+
"C": 13,
|
|
55
|
+
"D": 15,
|
|
56
|
+
"E": 12,
|
|
57
|
+
"F": 11,
|
|
58
|
+
"G": 15,
|
|
59
|
+
"H": 16,
|
|
60
|
+
"I": 7,
|
|
61
|
+
"J": 6,
|
|
62
|
+
"K": 13,
|
|
63
|
+
"L": 11,
|
|
64
|
+
"M": 19,
|
|
65
|
+
"N": 16,
|
|
66
|
+
"O": 16,
|
|
67
|
+
"P": 13,
|
|
68
|
+
"Q": 16,
|
|
69
|
+
"R": 13,
|
|
70
|
+
"S": 12,
|
|
71
|
+
"T": 12,
|
|
72
|
+
"U": 15,
|
|
73
|
+
"V": 13,
|
|
74
|
+
"W": 20,
|
|
75
|
+
"X": 12,
|
|
76
|
+
"Y": 12,
|
|
77
|
+
"Z": 12,
|
|
78
|
+
|
|
79
|
+
// Brackets & special
|
|
80
|
+
"[": 7,
|
|
81
|
+
"\\": 8,
|
|
82
|
+
"]": 7,
|
|
83
|
+
"^": 12,
|
|
84
|
+
"_": 9,
|
|
85
|
+
"`": 6,
|
|
86
|
+
|
|
87
|
+
// Lowercase
|
|
88
|
+
"a": 12,
|
|
89
|
+
"b": 13,
|
|
90
|
+
"c": 10,
|
|
91
|
+
"d": 13,
|
|
92
|
+
"e": 12,
|
|
93
|
+
"f": 7,
|
|
94
|
+
"g": 13,
|
|
95
|
+
"h": 13,
|
|
96
|
+
"i": 5,
|
|
97
|
+
"j": 5,
|
|
98
|
+
"k": 11,
|
|
99
|
+
"l": 5,
|
|
100
|
+
"m": 20,
|
|
101
|
+
"n": 13,
|
|
102
|
+
"o": 13,
|
|
103
|
+
"p": 13,
|
|
104
|
+
"q": 13,
|
|
105
|
+
"r": 9,
|
|
106
|
+
"s": 10,
|
|
107
|
+
"t": 8,
|
|
108
|
+
"u": 13,
|
|
109
|
+
"v": 11,
|
|
110
|
+
"w": 17,
|
|
111
|
+
"x": 11,
|
|
112
|
+
"y": 11,
|
|
113
|
+
"z": 10,
|
|
114
|
+
|
|
115
|
+
// More special
|
|
116
|
+
"{": 8,
|
|
117
|
+
"|": 12,
|
|
118
|
+
"}": 8,
|
|
119
|
+
"~": 12,
|
|
120
|
+
};
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Vuzix Z100 Smart Glasses Display Profile
|
|
124
|
+
*
|
|
125
|
+
* The Z100 has a green monochrome display with 640x480 resolution.
|
|
126
|
+
* It uses the Vuzix Ultralite SDK and Noto Sans font family.
|
|
127
|
+
*
|
|
128
|
+
* Display specs:
|
|
129
|
+
* - Resolution: 640x480
|
|
130
|
+
* - Usable text width: ~390px (empirically tested - SDK applies margins)
|
|
131
|
+
* - Color: Green monochrome
|
|
132
|
+
* - Max text lines: 7
|
|
133
|
+
* - Font: Noto Sans Regular at 21px
|
|
134
|
+
* - No bitmap support via text commands
|
|
135
|
+
* - Adjustable brightness
|
|
136
|
+
*
|
|
137
|
+
* NOTE: The Vuzix Ultralite SDK handles text rendering internally and applies
|
|
138
|
+
* its own margins/padding. The usable text width is significantly less than
|
|
139
|
+
* the physical 640px resolution. Empirical testing shows ~42 characters of
|
|
140
|
+
* mixed text (387px measured) fits on one line before the SDK wraps.
|
|
141
|
+
*/
|
|
142
|
+
export const Z100_PROFILE: DisplayProfile = {
|
|
143
|
+
id: "vuzix-z100",
|
|
144
|
+
name: "Vuzix Z100",
|
|
145
|
+
|
|
146
|
+
// Display dimensions
|
|
147
|
+
// Empirically tested: ~42 chars of mixed text (387px) fits before SDK wraps
|
|
148
|
+
// Using 390px to account for measurement variance
|
|
149
|
+
displayWidthPx: 390,
|
|
150
|
+
maxLines: 7,
|
|
151
|
+
|
|
152
|
+
// BLE constraints
|
|
153
|
+
// Z100 uses Vuzix Ultralite SDK which handles chunking internally
|
|
154
|
+
// These are conservative values for direct BLE if needed
|
|
155
|
+
maxPayloadBytes: 512,
|
|
156
|
+
bleChunkSize: 180,
|
|
157
|
+
|
|
158
|
+
// Font metrics - Noto Sans Regular at 21px
|
|
159
|
+
fontMetrics: {
|
|
160
|
+
glyphWidths: new Map(Object.entries(Z100_GLYPH_WIDTHS)),
|
|
161
|
+
defaultGlyphWidth: 12, // Average width from extracted metrics
|
|
162
|
+
// Z100 uses direct pixel widths, no render formula needed
|
|
163
|
+
renderFormula: (glyphWidth: number) => glyphWidth,
|
|
164
|
+
|
|
165
|
+
// Uniform-width scripts for CJK and other non-Latin
|
|
166
|
+
// Noto Sans CJK characters are typically wider
|
|
167
|
+
uniformScripts: {
|
|
168
|
+
cjk: 21, // Full-width CJK characters
|
|
169
|
+
hiragana: 21,
|
|
170
|
+
katakana: 21,
|
|
171
|
+
korean: 21,
|
|
172
|
+
cyrillic: 14, // Cyrillic is similar to Latin in Noto Sans
|
|
173
|
+
},
|
|
174
|
+
|
|
175
|
+
fallback: {
|
|
176
|
+
latinMaxWidth: 20, // 'W' and 'm' are the widest at 20px
|
|
177
|
+
unknownBehavior: "useLatinMax",
|
|
178
|
+
},
|
|
179
|
+
},
|
|
180
|
+
|
|
181
|
+
constraints: {
|
|
182
|
+
minCharsBeforeHyphen: 3,
|
|
183
|
+
noStartChars: [".", ",", "!", "?", ":", ";", ")", "]", "}", "。", ",", "!", "?", ":", ";", ")", "】", "」"],
|
|
184
|
+
noEndChars: ["(", "[", "{", "(", "【", "「"],
|
|
185
|
+
},
|
|
186
|
+
};
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* Get the hyphen width for Z100 in pixels.
|
|
190
|
+
* Used for line breaking calculations.
|
|
191
|
+
*/
|
|
192
|
+
export const Z100_HYPHEN_WIDTH_PX = 7;
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* Get the space width for Z100 in pixels.
|
|
196
|
+
* Used for column alignment calculations.
|
|
197
|
+
*/
|
|
198
|
+
export const Z100_SPACE_WIDTH_PX = 5;
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Degrade — compile a scene for devices that can't position elements
|
|
3
|
+
* (`canPosition: false`: G1, Z100). Output is a LEGACY layout that rides the
|
|
4
|
+
* existing display path — DisplayProcessor wraps it there, exactly as today,
|
|
5
|
+
* which is what keeps sugar byte-identical on old hardware (spec §2/§5:
|
|
6
|
+
* degrade output must be UNWRAPPED; wrapping twice breaks the goldens).
|
|
7
|
+
*
|
|
8
|
+
* Rules (design doc §3.4.8): content-preserving, never-erroring,
|
|
9
|
+
* honestly-reported. Text collapses in reading order (y, then x) joined by
|
|
10
|
+
* blank lines; EXACTLY two text elements sharing a y-range with disjoint
|
|
11
|
+
* x-ranges become a double_text_wall (ColumnComposer path downstream); rects
|
|
12
|
+
* drop silently (decoration); images drop + report.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import type {SceneElementInput} from "./types"
|
|
16
|
+
|
|
17
|
+
export interface DegradedScene {
|
|
18
|
+
/** Legacy layout for the existing display path, or null for an empty scene (caller clears). */
|
|
19
|
+
layout: {layoutType: string; [key: string]: unknown} | null
|
|
20
|
+
degraded: boolean
|
|
21
|
+
dropped: string[]
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
type TextEl = Extract<SceneElementInput, {type: "text"}>
|
|
25
|
+
|
|
26
|
+
function yOverlap(a: TextEl, b: TextEl): boolean {
|
|
27
|
+
return a.box.y < b.box.y + b.box.h && b.box.y < a.box.y + a.box.h
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function xDisjoint(a: TextEl, b: TextEl): boolean {
|
|
31
|
+
return a.box.x + a.box.w <= b.box.x || b.box.x + b.box.w <= a.box.x
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export function degradeScene(input: readonly SceneElementInput[]): DegradedScene {
|
|
35
|
+
const dropped: string[] = []
|
|
36
|
+
let degraded = false
|
|
37
|
+
|
|
38
|
+
const texts: TextEl[] = []
|
|
39
|
+
input.forEach((el, index) => {
|
|
40
|
+
if (!el || typeof el !== "object" || !el.box) {
|
|
41
|
+
// Malformed element — report it like the positioning pipeline does
|
|
42
|
+
// instead of silently pretending the render was clean.
|
|
43
|
+
dropped.push((el as {id?: string} | null)?.id ?? `element[${index}]`)
|
|
44
|
+
degraded = true
|
|
45
|
+
return
|
|
46
|
+
}
|
|
47
|
+
if (el.type === "text") {
|
|
48
|
+
texts.push(el)
|
|
49
|
+
} else if (el.type === "image") {
|
|
50
|
+
dropped.push(el.id ?? `image[${index}]`)
|
|
51
|
+
degraded = true
|
|
52
|
+
}
|
|
53
|
+
// rects: silent drop — pure decoration on a text wall.
|
|
54
|
+
})
|
|
55
|
+
|
|
56
|
+
if (texts.length === 0) {
|
|
57
|
+
return {layout: null, degraded, dropped}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Row exception: exactly 2 columns with clean separation — the shipped
|
|
61
|
+
// double_text_wall mechanism (scope guard: nothing fancier; this is NOT a
|
|
62
|
+
// layout engine).
|
|
63
|
+
if (texts.length === 2 && yOverlap(texts[0], texts[1]) && xDisjoint(texts[0], texts[1])) {
|
|
64
|
+
const [left, right] = texts[0].box.x <= texts[1].box.x ? [texts[0], texts[1]] : [texts[1], texts[0]]
|
|
65
|
+
return {
|
|
66
|
+
layout: {layoutType: "double_text_wall", topText: left.text ?? "", bottomText: right.text ?? ""},
|
|
67
|
+
degraded,
|
|
68
|
+
dropped,
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// Reading order: y, then x; join with blank lines. Downstream wrap clips
|
|
73
|
+
// overflow per the device profile.
|
|
74
|
+
const ordered = [...texts].sort((a, b) => a.box.y - b.box.y || a.box.x - b.box.x)
|
|
75
|
+
const text = ordered
|
|
76
|
+
.map((t) => t.text ?? "")
|
|
77
|
+
.filter((t) => t.length > 0)
|
|
78
|
+
.join("\n\n")
|
|
79
|
+
return {layout: {layoutType: "text_wall", text}, degraded, dropped}
|
|
80
|
+
}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scene differ — matches elements between the last frame sent to the device and
|
|
3
|
+
* the next scene, and classifies each element's change. Pure set arithmetic:
|
|
4
|
+
* nothing in here is device-specific (spec §1).
|
|
5
|
+
*
|
|
6
|
+
* Matching rules (design doc §3.4.1, in order):
|
|
7
|
+
* 1. same explicit `id` + same `type` ⇒ same element
|
|
8
|
+
* 2. no id: same `type` + identical box ⇒ same element
|
|
9
|
+
* 3. no id: same `type`, by order among the still-unmatched
|
|
10
|
+
* 4. anything unmatched in prev ⇒ removed; unmatched in next ⇒ created
|
|
11
|
+
*
|
|
12
|
+
* Matched no-id elements INHERIT the previous element's assigned id so the
|
|
13
|
+
* device-side id⇒firmware-component mapping stays stable; fresh elements get a
|
|
14
|
+
* synthesized id from the caller (SceneStore counter). Synthesized ids are
|
|
15
|
+
* prefixed "~" so they can never collide with app-supplied ids.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import type {FrameElement, SceneBox, SceneChange, SceneElementType} from "./types"
|
|
19
|
+
import {boxesEqual} from "./types"
|
|
20
|
+
|
|
21
|
+
/** A processed (clamped/wrapped) element, pre-diff: id optional, no annotation yet. */
|
|
22
|
+
export interface DiffableElement {
|
|
23
|
+
id?: string
|
|
24
|
+
type: SceneElementType
|
|
25
|
+
box: SceneBox
|
|
26
|
+
text?: string
|
|
27
|
+
data?: string
|
|
28
|
+
style?: FrameElement["style"]
|
|
29
|
+
contentHash: string
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export interface DiffResult {
|
|
33
|
+
elements: FrameElement[]
|
|
34
|
+
removed: string[]
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function classify(prev: FrameElement, next: DiffableElement): SceneChange {
|
|
38
|
+
if (!boxesEqual(prev.box, next.box)) return "moved"
|
|
39
|
+
if (prev.contentHash !== next.contentHash) return "updated"
|
|
40
|
+
return "unchanged"
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Assemble the annotated FrameElement, OMITTING optional fields that are
|
|
45
|
+
* undefined. A present key with an `undefined` value cannot cross the Expo
|
|
46
|
+
* Android bridge — its `Map<String, Any>` converter rejects it ("Value is
|
|
47
|
+
* undefined, expected an Object"), which surfaces as ERR_UNEXPECTED from
|
|
48
|
+
* displayEvent. (iOS's `[String: Any]` bridge silently drops nils, so the
|
|
49
|
+
* defect was invisible there.) Keeping the keys absent — not undefined —
|
|
50
|
+
* matches the optional-field contract in types.ts.
|
|
51
|
+
*/
|
|
52
|
+
function buildFrameElement(el: DiffableElement, id: string, change: SceneChange): FrameElement {
|
|
53
|
+
const out: FrameElement = {id, type: el.type, box: el.box, contentHash: el.contentHash, change}
|
|
54
|
+
if (el.text !== undefined) out.text = el.text
|
|
55
|
+
if (el.data !== undefined) out.data = el.data
|
|
56
|
+
if (el.style !== undefined) out.style = el.style
|
|
57
|
+
return out
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Diff `next` against `prev` (the last frame sent for this app/view/device;
|
|
62
|
+
* empty array for a fresh scene). `nextSyntheticId` mints ids for elements the
|
|
63
|
+
* app didn't name — must be stable per (app, view) across calls (SceneStore).
|
|
64
|
+
*/
|
|
65
|
+
export function diffScene(
|
|
66
|
+
prev: readonly FrameElement[],
|
|
67
|
+
next: readonly DiffableElement[],
|
|
68
|
+
nextSyntheticId: () => string,
|
|
69
|
+
): DiffResult {
|
|
70
|
+
const prevUnmatched = new Set(prev.map((_, i) => i))
|
|
71
|
+
const prevByExplicitId = new Map<string, number>()
|
|
72
|
+
prev.forEach((el, i) => {
|
|
73
|
+
if (!el.id.startsWith("~")) prevByExplicitId.set(`${el.type}:${el.id}`, i)
|
|
74
|
+
})
|
|
75
|
+
|
|
76
|
+
// matches[nextIndex] = prevIndex | undefined
|
|
77
|
+
const matches: (number | undefined)[] = new Array(next.length).fill(undefined)
|
|
78
|
+
|
|
79
|
+
// Pass 1: explicit id + type.
|
|
80
|
+
next.forEach((el, i) => {
|
|
81
|
+
if (!el.id) return
|
|
82
|
+
const j = prevByExplicitId.get(`${el.type}:${el.id}`)
|
|
83
|
+
if (j !== undefined && prevUnmatched.has(j)) {
|
|
84
|
+
matches[i] = j
|
|
85
|
+
prevUnmatched.delete(j)
|
|
86
|
+
}
|
|
87
|
+
})
|
|
88
|
+
|
|
89
|
+
// Pass 2: no-id elements match a no-id prev element of the same type with an
|
|
90
|
+
// identical box.
|
|
91
|
+
next.forEach((el, i) => {
|
|
92
|
+
if (el.id || matches[i] !== undefined) return
|
|
93
|
+
for (const j of prevUnmatched) {
|
|
94
|
+
const p = prev[j]
|
|
95
|
+
if (p.id.startsWith("~") && p.type === el.type && boxesEqual(p.box, el.box)) {
|
|
96
|
+
matches[i] = j
|
|
97
|
+
prevUnmatched.delete(j)
|
|
98
|
+
break
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
})
|
|
102
|
+
|
|
103
|
+
// Pass 3: remaining no-id elements match remaining no-id prev of the same
|
|
104
|
+
// type in order (k-th unmatched text ↔ k-th unmatched text).
|
|
105
|
+
next.forEach((el, i) => {
|
|
106
|
+
if (el.id || matches[i] !== undefined) return
|
|
107
|
+
for (const j of prevUnmatched) {
|
|
108
|
+
const p = prev[j]
|
|
109
|
+
if (p.id.startsWith("~") && p.type === el.type) {
|
|
110
|
+
matches[i] = j
|
|
111
|
+
prevUnmatched.delete(j)
|
|
112
|
+
break
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
})
|
|
116
|
+
|
|
117
|
+
const elements: FrameElement[] = next.map((el, i) => {
|
|
118
|
+
const j = matches[i]
|
|
119
|
+
if (j !== undefined) {
|
|
120
|
+
const p = prev[j]
|
|
121
|
+
return buildFrameElement(el, el.id ?? p.id, classify(p, el))
|
|
122
|
+
}
|
|
123
|
+
return buildFrameElement(el, el.id ?? nextSyntheticId(), "created")
|
|
124
|
+
})
|
|
125
|
+
|
|
126
|
+
const removed = [...prevUnmatched].map((j) => prev[j].id)
|
|
127
|
+
return {elements, removed}
|
|
128
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export type {
|
|
2
|
+
FrameElement,
|
|
3
|
+
SceneBox,
|
|
4
|
+
SceneBreakMode,
|
|
5
|
+
SceneChange,
|
|
6
|
+
SceneDisplayCapabilities,
|
|
7
|
+
SceneElementInput,
|
|
8
|
+
SceneElementType,
|
|
9
|
+
SceneFrame,
|
|
10
|
+
SceneProcessResult,
|
|
11
|
+
SceneRectStyle,
|
|
12
|
+
SceneTextStyle,
|
|
13
|
+
} from "./types"
|
|
14
|
+
export {boxesEqual, contentHash, elementContentHash} from "./types"
|
|
15
|
+
export type {DiffResult, DiffableElement} from "./differ"
|
|
16
|
+
export {diffScene} from "./differ"
|
|
17
|
+
export type {ProcessedScene} from "./process"
|
|
18
|
+
export {processScene, profileLineHeightPx} from "./process"
|
|
19
|
+
export type {DegradedScene} from "./degrade"
|
|
20
|
+
export {degradeScene} from "./degrade"
|
|
21
|
+
export {SceneStore} from "./store"
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scene processing — validate → clamp → budget → wrap. Everything here is
|
|
3
|
+
* generic; device variation enters only through the capabilities block and the
|
|
4
|
+
* display profile (data, not code). Spec §5.
|
|
5
|
+
*
|
|
6
|
+
* Never rejects a frame: offending elements are dropped per-element and
|
|
7
|
+
* reported via `dropped` / `degraded` (design doc §3.4.6; spec §4 refines the
|
|
8
|
+
* design doc's image "reject" to per-element drop).
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import {TextMeasurer} from "../measurer/TextMeasurer"
|
|
12
|
+
import {TextWrapper} from "../wrapper/TextWrapper"
|
|
13
|
+
import type {DisplayProfile} from "../profiles/types"
|
|
14
|
+
import type {DiffableElement} from "./differ"
|
|
15
|
+
import type {SceneBox, SceneDisplayCapabilities, SceneElementInput, SceneTextStyle} from "./types"
|
|
16
|
+
import {elementContentHash} from "./types"
|
|
17
|
+
|
|
18
|
+
export interface ProcessedScene {
|
|
19
|
+
elements: DiffableElement[]
|
|
20
|
+
degraded: boolean
|
|
21
|
+
dropped: string[]
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/** Reporting id for an element the app may not have named. */
|
|
25
|
+
function reportId(el: SceneElementInput, index: number): string {
|
|
26
|
+
return el.id ?? `${el.type}[${index}]`
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function clampBox(box: SceneBox, width: number, height: number): SceneBox | null {
|
|
30
|
+
const x1 = Math.max(0, Math.floor(box.x))
|
|
31
|
+
const y1 = Math.max(0, Math.floor(box.y))
|
|
32
|
+
const x2 = Math.min(width, Math.floor(box.x) + Math.max(0, Math.floor(box.w)))
|
|
33
|
+
const y2 = Math.min(height, Math.floor(box.y) + Math.max(0, Math.floor(box.h)))
|
|
34
|
+
if (x2 <= x1 || y2 <= y1) return null
|
|
35
|
+
return {x: x1, y: y1, w: x2 - x1, h: y2 - y1}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function boxShrunk(orig: SceneBox, clamped: SceneBox): boolean {
|
|
39
|
+
return (
|
|
40
|
+
clamped.x !== Math.floor(orig.x) ||
|
|
41
|
+
clamped.y !== Math.floor(orig.y) ||
|
|
42
|
+
clamped.w !== Math.floor(orig.w) ||
|
|
43
|
+
clamped.h !== Math.floor(orig.h)
|
|
44
|
+
)
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Line height for box-height→line-count math — ONLY when the profile declares
|
|
49
|
+
* a calibrated `lineHeightPx`. Deriving one from full-canvas numbers proved
|
|
50
|
+
* wrong on hardware (288/8=36px clipped the G2 nav instruction to one line;
|
|
51
|
+
* the real container line height is smaller). Without calibration we return
|
|
52
|
+
* null and the wrap step skips host-side height clipping entirely — text wraps
|
|
53
|
+
* to the box WIDTH and the firmware clips vertically in-box, which is exactly
|
|
54
|
+
* the legacy behavior.
|
|
55
|
+
*/
|
|
56
|
+
export function profileLineHeightPx(profile: DisplayProfile, _canvasHeight: number): number | null {
|
|
57
|
+
return profile.lineHeightPx ?? null
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Process a raw scene against a device's capabilities + profile. Output is
|
|
62
|
+
* diff-ready (text pre-wrapped, boxes clamped, content hashed) and reflects
|
|
63
|
+
* exactly what will be sent — the diff baseline is post-processed by design
|
|
64
|
+
* (spec §4).
|
|
65
|
+
*/
|
|
66
|
+
export function processScene(
|
|
67
|
+
input: readonly SceneElementInput[],
|
|
68
|
+
caps: SceneDisplayCapabilities,
|
|
69
|
+
profile: DisplayProfile,
|
|
70
|
+
): ProcessedScene {
|
|
71
|
+
const dropped: string[] = []
|
|
72
|
+
let degraded = false
|
|
73
|
+
|
|
74
|
+
const measurer = new TextMeasurer(profile)
|
|
75
|
+
const wrapper = new TextWrapper(measurer)
|
|
76
|
+
const lineHeight = profileLineHeightPx(profile, caps.height)
|
|
77
|
+
|
|
78
|
+
// Validate + dedupe explicit ids (first occurrence wins; dupes are dev error).
|
|
79
|
+
const seenIds = new Set<string>()
|
|
80
|
+
const valid: {el: SceneElementInput; index: number}[] = []
|
|
81
|
+
input.forEach((raw, index) => {
|
|
82
|
+
if (!raw || typeof raw !== "object" || !raw.box) {
|
|
83
|
+
dropped.push(reportId(raw ?? ({type: "text"} as SceneElementInput), index))
|
|
84
|
+
degraded = true
|
|
85
|
+
return
|
|
86
|
+
}
|
|
87
|
+
// Non-finite box numbers (NaN/±Infinity/non-number) would survive the
|
|
88
|
+
// Math.* clamp below and poison the frame all the way to native ints.
|
|
89
|
+
const b = raw.box
|
|
90
|
+
if (![b.x, b.y, b.w, b.h].every((n) => typeof n === "number" && Number.isFinite(n))) {
|
|
91
|
+
dropped.push(reportId(raw, index))
|
|
92
|
+
degraded = true
|
|
93
|
+
return
|
|
94
|
+
}
|
|
95
|
+
// Leading "~" is the differ's synthetic-id namespace — an app id there
|
|
96
|
+
// would never match across frames (re-created every push). Normalize by
|
|
97
|
+
// stripping; the rewrite is deterministic, so diffing stays stable.
|
|
98
|
+
const el = raw.id?.startsWith("~") ? {...raw, id: raw.id.replace(/^~+/, "") || undefined} : raw
|
|
99
|
+
if (el.id) {
|
|
100
|
+
const key = `${el.type}:${el.id}`
|
|
101
|
+
if (seenIds.has(key)) {
|
|
102
|
+
dropped.push(reportId(el, index))
|
|
103
|
+
degraded = true
|
|
104
|
+
return
|
|
105
|
+
}
|
|
106
|
+
seenIds.add(key)
|
|
107
|
+
}
|
|
108
|
+
valid.push({el, index})
|
|
109
|
+
})
|
|
110
|
+
|
|
111
|
+
// Clamp + per-type limits, then budget in array order.
|
|
112
|
+
let textBudget = caps.maxTextElements
|
|
113
|
+
let imageBudget = caps.maxImageElements
|
|
114
|
+
const out: DiffableElement[] = []
|
|
115
|
+
|
|
116
|
+
for (const {el, index} of valid) {
|
|
117
|
+
const clamped = clampBox(el.box, caps.width, caps.height)
|
|
118
|
+
if (!clamped) {
|
|
119
|
+
dropped.push(reportId(el, index))
|
|
120
|
+
degraded = true
|
|
121
|
+
continue
|
|
122
|
+
}
|
|
123
|
+
const shrunk = boxShrunk(el.box, clamped)
|
|
124
|
+
if (shrunk) degraded = true
|
|
125
|
+
|
|
126
|
+
if (el.type === "image") {
|
|
127
|
+
// Images: a shrunk box can't be honored (we don't crop pixels host-side)
|
|
128
|
+
// and per-image device limits are box-level (the firmware allocates the
|
|
129
|
+
// component from the box). SGCs scale pixels to the box (phone-side
|
|
130
|
+
// scaling — never on glasses).
|
|
131
|
+
if (shrunk) {
|
|
132
|
+
dropped.push(reportId(el, index))
|
|
133
|
+
continue
|
|
134
|
+
}
|
|
135
|
+
if (caps.maxImagePx && (clamped.w > caps.maxImagePx.width || clamped.h > caps.maxImagePx.height)) {
|
|
136
|
+
dropped.push(reportId(el, index))
|
|
137
|
+
degraded = true
|
|
138
|
+
continue
|
|
139
|
+
}
|
|
140
|
+
if (imageBudget <= 0) {
|
|
141
|
+
dropped.push(reportId(el, index))
|
|
142
|
+
degraded = true
|
|
143
|
+
continue
|
|
144
|
+
}
|
|
145
|
+
imageBudget--
|
|
146
|
+
out.push({
|
|
147
|
+
id: el.id,
|
|
148
|
+
type: "image",
|
|
149
|
+
box: clamped,
|
|
150
|
+
data: el.data,
|
|
151
|
+
contentHash: elementContentHash({type: "image", data: el.data}),
|
|
152
|
+
})
|
|
153
|
+
continue
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// text + rect share the text-container budget (design doc §3.4.6).
|
|
157
|
+
if (textBudget <= 0) {
|
|
158
|
+
dropped.push(reportId(el, index))
|
|
159
|
+
degraded = true
|
|
160
|
+
continue
|
|
161
|
+
}
|
|
162
|
+
textBudget--
|
|
163
|
+
|
|
164
|
+
if (el.type === "rect") {
|
|
165
|
+
out.push({
|
|
166
|
+
id: el.id,
|
|
167
|
+
type: "rect",
|
|
168
|
+
box: clamped,
|
|
169
|
+
style: el.style,
|
|
170
|
+
contentHash: elementContentHash({type: "rect", style: el.style}),
|
|
171
|
+
})
|
|
172
|
+
continue
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// Text: wrap on the phone into the (clamped) box. The box then carries
|
|
176
|
+
// pre-wrapped text; firmware in-box wrap is a fallback, not the mechanism.
|
|
177
|
+
// Height clipping only applies with a CALIBRATED line height — otherwise
|
|
178
|
+
// the firmware clips vertically in-box (legacy behavior).
|
|
179
|
+
const style: SceneTextStyle = el.style ?? {}
|
|
180
|
+
const maxLines = lineHeight ? Math.max(1, Math.floor(clamped.h / lineHeight)) : profile.maxLines
|
|
181
|
+
const result = wrapper.wrap(el.text ?? "", {
|
|
182
|
+
maxWidthPx: clamped.w,
|
|
183
|
+
maxLines,
|
|
184
|
+
...(style.breakMode ? {breakMode: style.breakMode} : {}),
|
|
185
|
+
})
|
|
186
|
+
let lines = result.lines
|
|
187
|
+
if (result.truncated) {
|
|
188
|
+
degraded = true
|
|
189
|
+
if (style.overflow === "ellipsis" && lines.length > 0) {
|
|
190
|
+
// Trim the last line until it fits WITH the ellipsis appended —
|
|
191
|
+
// otherwise the extra glyph can overflow the clamped box width.
|
|
192
|
+
let last = lines[lines.length - 1]
|
|
193
|
+
while (last.length > 0 && !measurer.fitsInWidth(`${last}…`, clamped.w)) {
|
|
194
|
+
last = last.slice(0, -1)
|
|
195
|
+
}
|
|
196
|
+
// A box narrower than the ellipsis glyph itself gets an empty line —
|
|
197
|
+
// never emit a line wider than the clamped box.
|
|
198
|
+
const ellipsized = last.length > 0 || measurer.fitsInWidth("…", clamped.w) ? `${last}…` : ""
|
|
199
|
+
lines = [...lines.slice(0, -1), ellipsized]
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
const wrappedText = lines.join("\n")
|
|
203
|
+
out.push({
|
|
204
|
+
id: el.id,
|
|
205
|
+
type: "text",
|
|
206
|
+
box: clamped,
|
|
207
|
+
text: wrappedText,
|
|
208
|
+
style: el.style,
|
|
209
|
+
contentHash: elementContentHash({type: "text", text: wrappedText, style: el.style}),
|
|
210
|
+
})
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
return {elements: out, degraded, dropped}
|
|
214
|
+
}
|
|
Binary file
|
|
Binary file
|