@mentra/engine 3.1.0-dev.9 → 3.1.0-dev.91

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.
Files changed (109) hide show
  1. package/README.md +23 -5
  2. package/build/bluetooth-sdk/ota-transport.d.ts +2 -0
  3. package/build/bluetooth-sdk/ota-transport.d.ts.map +1 -0
  4. package/build/bluetooth-sdk/ota-transport.js +2 -0
  5. package/build/bluetooth-sdk/ota-transport.js.map +1 -0
  6. package/build/engine.d.ts +5 -2
  7. package/build/engine.d.ts.map +1 -1
  8. package/build/facades/ota.d.ts +11 -6
  9. package/build/facades/ota.d.ts.map +1 -1
  10. package/build/facades/ota.js +9 -5
  11. package/build/facades/ota.js.map +1 -1
  12. package/build/facades/pairing.d.ts +4 -0
  13. package/build/facades/pairing.d.ts.map +1 -1
  14. package/build/facades/pairing.js +81 -7
  15. package/build/facades/pairing.js.map +1 -1
  16. package/build/generated/releaseMetadata.js +5 -5
  17. package/build/generated/releaseMetadata.js.map +1 -1
  18. package/build/index.d.ts +2 -2
  19. package/build/index.d.ts.map +1 -1
  20. package/build/index.js +1 -1
  21. package/build/index.js.map +1 -1
  22. package/build/react/MentraLiveOtaFlow.d.ts +8 -2
  23. package/build/react/MentraLiveOtaFlow.d.ts.map +1 -1
  24. package/build/react/MentraLiveOtaFlow.js +256 -354
  25. package/build/react/MentraLiveOtaFlow.js.map +1 -1
  26. package/build/react/index.d.ts +1 -0
  27. package/build/react/index.d.ts.map +1 -1
  28. package/build/react/index.js +1 -0
  29. package/build/react/index.js.map +1 -1
  30. package/build/react/useMentraLiveOta.d.ts +84 -0
  31. package/build/react/useMentraLiveOta.d.ts.map +1 -0
  32. package/build/react/useMentraLiveOta.js +627 -0
  33. package/build/react/useMentraLiveOta.js.map +1 -0
  34. package/build/services/BlobStore.d.ts +2 -0
  35. package/build/services/BlobStore.d.ts.map +1 -1
  36. package/build/services/BlobStore.js +63 -10
  37. package/build/services/BlobStore.js.map +1 -1
  38. package/build/services/GlassesStatusProjection.d.ts +15 -2
  39. package/build/services/GlassesStatusProjection.d.ts.map +1 -1
  40. package/build/services/GlassesStatusProjection.js +3 -3
  41. package/build/services/GlassesStatusProjection.js.map +1 -1
  42. package/build/services/HotspotOtaTransport.d.ts.map +1 -1
  43. package/build/services/HotspotOtaTransport.js +8 -7
  44. package/build/services/HotspotOtaTransport.js.map +1 -1
  45. package/build/services/OtaAutoChain.d.ts +9 -2
  46. package/build/services/OtaAutoChain.d.ts.map +1 -1
  47. package/build/services/OtaAutoChain.js +10 -2
  48. package/build/services/OtaAutoChain.js.map +1 -1
  49. package/build/services/OtaInstallCoordinator.d.ts +26 -3
  50. package/build/services/OtaInstallCoordinator.d.ts.map +1 -1
  51. package/build/services/OtaInstallCoordinator.js +35 -13
  52. package/build/services/OtaInstallCoordinator.js.map +1 -1
  53. package/build/services/OtaService.d.ts.map +1 -1
  54. package/build/services/OtaService.js +1 -1
  55. package/build/services/OtaService.js.map +1 -1
  56. package/build/services/OtaUpdateCheckService.d.ts +4 -1
  57. package/build/services/OtaUpdateCheckService.d.ts.map +1 -1
  58. package/build/services/OtaUpdateCheckService.js +21 -5
  59. package/build/services/OtaUpdateCheckService.js.map +1 -1
  60. package/build/services/asg/localNetworkTransport.d.ts.map +1 -1
  61. package/build/services/asg/localNetworkTransport.js +13 -12
  62. package/build/services/asg/localNetworkTransport.js.map +1 -1
  63. package/build/services/glassesClockSync.js +1 -1
  64. package/build/services/glassesClockSync.js.map +1 -1
  65. package/build/services/otaInstallPolicy.d.ts +4 -0
  66. package/build/services/otaInstallPolicy.d.ts.map +1 -1
  67. package/build/services/otaInstallPolicy.js +4 -0
  68. package/build/services/otaInstallPolicy.js.map +1 -1
  69. package/build/services/otaReleaseVersion.d.ts +10 -0
  70. package/build/services/otaReleaseVersion.d.ts.map +1 -0
  71. package/build/services/otaReleaseVersion.js +14 -0
  72. package/build/services/otaReleaseVersion.js.map +1 -0
  73. package/build/stores/appVisibility.d.ts +3 -0
  74. package/build/stores/appVisibility.d.ts.map +1 -0
  75. package/build/stores/appVisibility.js +3 -0
  76. package/build/stores/appVisibility.js.map +1 -0
  77. package/build/stores/apps.d.ts.map +1 -1
  78. package/build/stores/apps.js +7 -1
  79. package/build/stores/apps.js.map +1 -1
  80. package/build/stores/core.d.ts +3 -3
  81. package/build/stores/core.d.ts.map +1 -1
  82. package/build/stores/core.js.map +1 -1
  83. package/build/stores/glasses.d.ts +10 -4
  84. package/build/stores/glasses.d.ts.map +1 -1
  85. package/build/stores/glasses.js.map +1 -1
  86. package/package.json +13 -6
  87. package/src/bluetooth-sdk/ota-transport.ts +1 -0
  88. package/src/facades/ota.ts +19 -6
  89. package/src/facades/pairing.ts +88 -12
  90. package/src/generated/releaseMetadata.ts +5 -5
  91. package/src/index.ts +2 -0
  92. package/src/react/MentraLiveOtaFlow.tsx +378 -480
  93. package/src/react/index.ts +14 -0
  94. package/src/react/useMentraLiveOta.ts +793 -0
  95. package/src/services/BlobStore.ts +57 -10
  96. package/src/services/GlassesStatusProjection.ts +7 -6
  97. package/src/services/HotspotOtaTransport.ts +8 -7
  98. package/src/services/OtaAutoChain.ts +26 -2
  99. package/src/services/OtaInstallCoordinator.ts +37 -13
  100. package/src/services/OtaService.ts +1 -2
  101. package/src/services/OtaUpdateCheckService.ts +26 -8
  102. package/src/services/asg/localNetworkTransport.ts +20 -19
  103. package/src/services/glassesClockSync.ts +1 -1
  104. package/src/services/otaInstallPolicy.ts +4 -0
  105. package/src/services/otaReleaseVersion.ts +22 -0
  106. package/src/stores/appVisibility.ts +3 -0
  107. package/src/stores/apps.ts +7 -1
  108. package/src/stores/core.ts +4 -4
  109. package/src/stores/glasses.ts +13 -6
@@ -2,7 +2,7 @@
2
2
  * Push phone time to glasses only when clock skew is detected (gallery sync, OTA, etc.).
3
3
  */
4
4
 
5
- import BluetoothSdk from "@mentra/bluetooth-sdk/internal"
5
+ import BluetoothSdk from "@mentra/bluetooth-sdk"
6
6
  import {BgTimer} from "../utils/timers"
7
7
  import {useGlassesStore} from "../stores/glasses"
8
8
 
@@ -32,6 +32,8 @@ export const PING_INTERVAL_MS = 10_000
32
32
  export const QUERY_REPLY_TIMEOUT_MS = 6000
33
33
  /** 15s lockout on the Continue button after a BES restart, to prevent an accidental tap. */
34
34
  export const BES_CONTINUE_LOCKOUT_MS = 15_000
35
+ /** Fail closed if a BES reboot never reconnects; normal restarts complete in a fraction of this window. */
36
+ export const BES_RESTART_TIMEOUT_MS = 120_000
35
37
 
36
38
  // --- Legacy old-build (< MINIMUM_OTA_STATUS_BUILD) OTA policy (WP 8C) ---
37
39
  //
@@ -51,6 +53,7 @@ export const LEGACY_MTK_INSTALL_TIMEOUT_MS = MTK_INSTALL_TIMEOUT_MS + LEGACY_EXT
51
53
  export const LEGACY_GLOBAL_OTA_TIMEOUT_MS = GLOBAL_OTA_TIMEOUT_MS + LEGACY_EXTRA_TIMEOUT_MS
52
54
  export const LEGACY_PING_INTERVAL_MS = PING_INTERVAL_MS + LEGACY_EXTRA_TIMEOUT_MS
53
55
  export const LEGACY_BES_CONTINUE_LOCKOUT_MS = BES_CONTINUE_LOCKOUT_MS + LEGACY_EXTRA_TIMEOUT_MS
56
+ export const LEGACY_BES_RESTART_TIMEOUT_MS = BES_RESTART_TIMEOUT_MS + LEGACY_EXTRA_TIMEOUT_MS
54
57
  /**
55
58
  * After a legacy apk `install FINISHED` observed in-flight, the legacy screen held the
56
59
  * completed state for 12s (+20s pad) so the ASG process restart settles (and fresh
@@ -122,6 +125,7 @@ export function selectOtaProtocolProfile(
122
125
  export const OtaProgressMessages = {
123
126
  stalledOrStuck: "Update may have failed. Ensure glasses have internet access and try again.",
124
127
  globalTimeout: "Update took too long. Please try again.",
128
+ restartTimeout: "Glasses did not finish restarting. Restart them before trying the update again.",
125
129
  sendOtaStartFailed: "Failed to communicate with glasses.",
126
130
  hotspotArtifactDownloadFailed: "Could not download the update to your phone. Check phone internet and try again.",
127
131
  hotspotArtifactVerifyFailed: "The update package could not be verified. Please try again later.",
@@ -0,0 +1,22 @@
1
+ const COORDINATED_RELEASE_VERSION = /^\d+\.\d+\.\d+(?:-(?:dev|beta)\.[1-9]\d*)?$/
2
+
3
+ type OtaReleaseVersionInput = {
4
+ manifestReleaseVersion?: string | null
5
+ manifestUrl: string
6
+ packagedManifestUrl?: string | null
7
+ packagedReleaseIdentity?: string | null
8
+ }
9
+
10
+ function validReleaseVersion(version: string | null | undefined): string | null {
11
+ const trimmed = version?.trim()
12
+ return trimmed && COORDINATED_RELEASE_VERSION.test(trimmed) ? trimmed : null
13
+ }
14
+
15
+ /** Resolve the label for the selected OTA pin, including stable promotion of exact beta OTA bytes. */
16
+ export function resolveOtaReleaseVersion(input: OtaReleaseVersionInput): string | null {
17
+ const packagedRelease = validReleaseVersion(input.packagedReleaseIdentity)
18
+ if (packagedRelease && input.packagedManifestUrl?.trim() === input.manifestUrl.trim()) {
19
+ return packagedRelease
20
+ }
21
+ return validReleaseVersion(input.manifestReleaseVersion)
22
+ }
@@ -0,0 +1,3 @@
1
+ /** Combine registry-enforced visibility with the user's home-screen choice. */
2
+ export const resolveHiddenStatus = (registryHidden: boolean, userHidden: boolean): boolean =>
3
+ registryHidden || userHidden
@@ -25,6 +25,7 @@ import {islandNotifications} from "../services/NotificationsEmitter"
25
25
  import sttModelManager from "../services/STTModelManager"
26
26
  import {miniappLauncher} from "../services/MiniappLauncher"
27
27
  import {miniappRunningRegistry} from "../services/MiniappRunningRegistry"
28
+ import {resolveHiddenStatus} from "./appVisibility"
28
29
  import {SETTINGS, useSettingsStore} from "./settings"
29
30
  import BluetoothSdk from "@mentra/bluetooth-sdk"
30
31
 
@@ -221,7 +222,12 @@ function projectApps(previousState: AppStatusState, localApps: ClientApp[]): Cli
221
222
  ...app,
222
223
  screenshot: previousByPackage.get(app.packageName)?.screenshot ?? app.screenshot,
223
224
  compatibility: HardwareCompatibility.checkCompatibility(app.hardwareRequirements, capabilities),
224
- hidden: previousState.getHiddenStatus(app.packageName),
225
+ // A registry source can force an app off the primary home screen (for
226
+ // example, Miniapp Developer while its home-screen setting is disabled).
227
+ // Compose that gate with the user's persisted home-screen layout instead
228
+ // of replacing it, otherwise a default-false persisted value makes a
229
+ // source-hidden app visible again during projection.
230
+ hidden: resolveHiddenStatus(app.hidden, previousState.getHiddenStatus(app.packageName)),
225
231
  // Derive the foreground flag from the store's single source of truth
226
232
  // (`foregroundedPackage`), NOT from the previous snapshot. Carrying it over
227
233
  // per-app meant a refresh that momentarily omitted an app (e.g. the
@@ -1,13 +1,13 @@
1
1
  import {create} from "zustand"
2
2
  import {subscribeWithSelector} from "zustand/middleware"
3
- import type {BluetoothStatus} from "@mentra/bluetooth-sdk/internal"
3
+ import type {PublicBluetoothStatus} from "@mentra/bluetooth-sdk"
4
4
 
5
- export interface CoreState extends BluetoothStatus {
6
- setCoreInfo: (info: Partial<BluetoothStatus>) => void
5
+ export interface CoreState extends PublicBluetoothStatus {
6
+ setCoreInfo: (info: Partial<PublicBluetoothStatus>) => void
7
7
  reset: () => void
8
8
  }
9
9
 
10
- const initialState: BluetoothStatus = {
10
+ const initialState: PublicBluetoothStatus = {
11
11
  // state:
12
12
  searching: false,
13
13
  searchingController: false,
@@ -1,12 +1,12 @@
1
1
  import type {
2
2
  GlassesConnectionStatus,
3
- GlassesStatus,
4
3
  HotspotStatus,
5
4
  OtaProgress,
6
5
  OtaStatus,
7
6
  OtaUpdateInfo,
7
+ PublicGlassesStatus,
8
8
  WifiStatus,
9
- } from "@mentra/bluetooth-sdk/internal"
9
+ } from "@mentra/bluetooth-sdk"
10
10
  import {isGlassesConnected, isGlassesLinkLayerBusy, isGlassesReady} from "../services/GlassesReadiness"
11
11
  import {create} from "zustand"
12
12
  import {subscribeWithSelector} from "zustand/middleware"
@@ -20,7 +20,14 @@ export const selectGlassesConnected = (state: {connection: GlassesConnectionStat
20
20
 
21
21
  export const selectGlassesReady = (state: {connection: GlassesConnectionStatus}) => isGlassesReady(state.connection)
22
22
 
23
- export interface GlassesState extends GlassesStatus {
23
+ type EngineGlassesStatus = PublicGlassesStatus & {
24
+ otaUpdateAvailable: OtaUpdateInfo | null
25
+ otaProgress: OtaProgress | null
26
+ otaInProgress: boolean
27
+ otaVersionUrl: string
28
+ }
29
+
30
+ export interface GlassesState extends EngineGlassesStatus {
24
31
  systemTimeMs: number
25
32
  wifiStatusKnown: boolean
26
33
  setGlassesInfo: (info: GlassesInfoUpdate) => void
@@ -53,7 +60,7 @@ type LegacyHotspotFields = {
53
60
  hotspotLocalIp?: string
54
61
  }
55
62
 
56
- type GlassesInfoUpdate = Partial<GlassesStatus> & LegacyWifiFields & LegacyHotspotFields
63
+ type GlassesInfoUpdate = Partial<EngineGlassesStatus> & LegacyWifiFields & LegacyHotspotFields
57
64
 
58
65
  function wifiFromLegacyFields(info: LegacyWifiFields): WifiStatus | null {
59
66
  if (info.wifiConnected === true) {
@@ -80,7 +87,7 @@ function hotspotFromLegacyFields(info: LegacyHotspotFields): HotspotStatus | nul
80
87
  return null
81
88
  }
82
89
 
83
- export const getGlasesInfoPartial = (state: GlassesStatus) => {
90
+ export const getGlasesInfoPartial = (state: EngineGlassesStatus) => {
84
91
  const wifi = state.wifi
85
92
  const connected = isGlassesConnected(state.connection)
86
93
  return {
@@ -98,7 +105,7 @@ export const getGlasesInfoPartial = (state: GlassesStatus) => {
98
105
  }
99
106
  }
100
107
 
101
- interface GlassesStore extends GlassesStatus {
108
+ interface GlassesStore extends EngineGlassesStatus {
102
109
  systemTimeMs: number
103
110
  mtkUpdatedThisSession: boolean
104
111
  wifiStatusKnown: boolean