@mentra/engine 3.2.0-dev.217 → 3.2.0-dev.222

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 (87) hide show
  1. package/build/generated/releaseMetadata.js +5 -5
  2. package/build/generated/releaseMetadata.js.map +1 -1
  3. package/build/index.d.ts +3 -1
  4. package/build/index.d.ts.map +1 -1
  5. package/build/index.js +2 -1
  6. package/build/index.js.map +1 -1
  7. package/build/react/MentraLiveOtaFlow.d.ts.map +1 -1
  8. package/build/react/MentraLiveOtaFlow.js +19 -3
  9. package/build/react/MentraLiveOtaFlow.js.map +1 -1
  10. package/build/react/useMentraLiveOta.d.ts +12 -0
  11. package/build/react/useMentraLiveOta.d.ts.map +1 -1
  12. package/build/react/useMentraLiveOta.js +31 -5
  13. package/build/react/useMentraLiveOta.js.map +1 -1
  14. package/build/services/AcsMeetingService.d.ts +360 -10
  15. package/build/services/AcsMeetingService.d.ts.map +1 -1
  16. package/build/services/AcsMeetingService.js +836 -19
  17. package/build/services/AcsMeetingService.js.map +1 -1
  18. package/build/services/AudioPlaybackService.d.ts +6 -0
  19. package/build/services/AudioPlaybackService.d.ts.map +1 -1
  20. package/build/services/AudioPlaybackService.js +4 -3
  21. package/build/services/AudioPlaybackService.js.map +1 -1
  22. package/build/services/GlassesMicProbe.d.ts +78 -0
  23. package/build/services/GlassesMicProbe.d.ts.map +1 -0
  24. package/build/services/GlassesMicProbe.js +258 -0
  25. package/build/services/GlassesMicProbe.js.map +1 -0
  26. package/build/services/LocalMiniappRuntime.d.ts +83 -0
  27. package/build/services/LocalMiniappRuntime.d.ts.map +1 -1
  28. package/build/services/LocalMiniappRuntime.js +714 -39
  29. package/build/services/LocalMiniappRuntime.js.map +1 -1
  30. package/build/services/MentraJSLogPipeline.d.ts +39 -0
  31. package/build/services/MentraJSLogPipeline.d.ts.map +1 -1
  32. package/build/services/MentraJSLogPipeline.js +59 -3
  33. package/build/services/MentraJSLogPipeline.js.map +1 -1
  34. package/build/services/MentraJSRouter.d.ts +1 -1
  35. package/build/services/MentraJSRouter.d.ts.map +1 -1
  36. package/build/services/MentraJSRouter.js +2 -2
  37. package/build/services/MentraJSRouter.js.map +1 -1
  38. package/build/services/MicStateCoordinator.d.ts +22 -0
  39. package/build/services/MicStateCoordinator.d.ts.map +1 -1
  40. package/build/services/MicStateCoordinator.js +34 -3
  41. package/build/services/MicStateCoordinator.js.map +1 -1
  42. package/build/services/OtaErrorMapping.d.ts +25 -2
  43. package/build/services/OtaErrorMapping.d.ts.map +1 -1
  44. package/build/services/OtaErrorMapping.js +68 -23
  45. package/build/services/OtaErrorMapping.js.map +1 -1
  46. package/build/services/OtaInstallCoordinator.d.ts.map +1 -1
  47. package/build/services/OtaInstallCoordinator.js +6 -1
  48. package/build/services/OtaInstallCoordinator.js.map +1 -1
  49. package/build/services/PhoneStreamCoordinator.d.ts +8 -0
  50. package/build/services/PhoneStreamCoordinator.d.ts.map +1 -1
  51. package/build/services/PhoneStreamCoordinator.js +2 -0
  52. package/build/services/PhoneStreamCoordinator.js.map +1 -1
  53. package/build/services/SoftapCallTransport.d.ts +365 -0
  54. package/build/services/SoftapCallTransport.d.ts.map +1 -0
  55. package/build/services/SoftapCallTransport.js +722 -0
  56. package/build/services/SoftapCallTransport.js.map +1 -0
  57. package/build/services/SoftapCleanupBarrier.d.ts +45 -0
  58. package/build/services/SoftapCleanupBarrier.d.ts.map +1 -0
  59. package/build/services/SoftapCleanupBarrier.js +51 -0
  60. package/build/services/SoftapCleanupBarrier.js.map +1 -0
  61. package/build/utils/pcm16.d.ts +35 -0
  62. package/build/utils/pcm16.d.ts.map +1 -0
  63. package/build/utils/pcm16.js +85 -0
  64. package/build/utils/pcm16.js.map +1 -0
  65. package/build/utils/softapTrace.d.ts +39 -0
  66. package/build/utils/softapTrace.d.ts.map +1 -0
  67. package/build/utils/softapTrace.js +124 -0
  68. package/build/utils/softapTrace.js.map +1 -0
  69. package/package.json +7 -7
  70. package/src/generated/releaseMetadata.ts +5 -5
  71. package/src/index.ts +8 -0
  72. package/src/react/MentraLiveOtaFlow.tsx +22 -3
  73. package/src/react/useMentraLiveOta.ts +44 -6
  74. package/src/services/AcsMeetingService.ts +956 -22
  75. package/src/services/AudioPlaybackService.ts +12 -3
  76. package/src/services/GlassesMicProbe.ts +300 -0
  77. package/src/services/LocalMiniappRuntime.ts +775 -42
  78. package/src/services/MentraJSLogPipeline.ts +70 -3
  79. package/src/services/MentraJSRouter.ts +2 -2
  80. package/src/services/MicStateCoordinator.ts +35 -3
  81. package/src/services/OtaErrorMapping.ts +77 -25
  82. package/src/services/OtaInstallCoordinator.ts +6 -1
  83. package/src/services/PhoneStreamCoordinator.ts +10 -0
  84. package/src/services/SoftapCallTransport.ts +928 -0
  85. package/src/services/SoftapCleanupBarrier.ts +72 -0
  86. package/src/utils/pcm16.ts +93 -0
  87. package/src/utils/softapTrace.ts +133 -0
@@ -12,9 +12,9 @@ export interface EngineReleaseMetadata {
12
12
  export const ENGINE_RELEASE_METADATA: Readonly<EngineReleaseMetadata> = Object.freeze({
13
13
  "schemaVersion": 1,
14
14
  "familyBaseVersion": "3.2.0",
15
- "releaseIdentity": "3.2.0-dev.217",
16
- "releaseSetId": "mentra-3.2.0-dev.217",
17
- "sourceCommit": "acd4336bcf67c5e2c7ddfa17ea1a2600dc7fb1d9",
18
- "otaManifestUrl": "https://github.com/Mentra-Community/MentraOS/releases/download/mentra-builds-v3.2.0/mentra-live-ota-3.2.0-dev.217.json",
19
- "otaManifestSha256": "4ec6bf57ab08ef2749a58232737dface3b0ddb0d8269b61e134b7cb5986efa4a"
15
+ "releaseIdentity": "3.2.0-dev.222",
16
+ "releaseSetId": "mentra-3.2.0-dev.222",
17
+ "sourceCommit": "7865d7f192a2d9a732269857bb877a3a8a6bf4b8",
18
+ "otaManifestUrl": "https://github.com/Mentra-Community/MentraOS/releases/download/mentra-builds-v3.2.0/mentra-live-ota-3.2.0-dev.222.json",
19
+ "otaManifestSha256": "8c33e8beb5ba61eb0821d89b58d81fe2bbf05641d0a99b2e1972926863cc6ab7"
20
20
  })
package/src/index.ts CHANGED
@@ -119,7 +119,13 @@ export {
119
119
  export type {OtaAutoChainAdvanceResult} from "./services/OtaAutoChain"
120
120
  export {
121
121
  BES_INSTALL_RESTART_MESSAGE,
122
+ OTA_ERROR_BES_RESTART_REQUIRED_COPY_KEY,
123
+ OTA_ERROR_ENGLISH_COPY,
124
+ OTA_ERROR_GENERIC_COPY_KEY,
125
+ OTA_ERROR_UNKNOWN_GLASSES_COPY_KEY,
126
+ OTA_GLASSES_ERROR_COPY_KEYS,
122
127
  getOtaErrorMessage,
128
+ otaErrorCopyKey,
123
129
  shouldRequireGlassesRebootForBesFailure,
124
130
  shouldShowChangeWifiForOtaDownloadFailure,
125
131
  } from "./services/OtaErrorMapping"
@@ -190,6 +196,8 @@ export {
190
196
  } from "./utils/devMiniappSnapshot"
191
197
  export {HardwareCompatibility, type CompatibilityResult} from "./utils/hardware"
192
198
  export {BgTimer, throttle, debounce} from "./utils/timers"
199
+ export {default as glassesMicProbe, parseMicProbeParams} from "./services/GlassesMicProbe"
200
+ export type {MicProbeA2dpMode, MicProbeOptions, MicProbeSample} from "./services/GlassesMicProbe"
193
201
 
194
202
  // Hardware types and capability profiles.
195
203
  export {
@@ -14,10 +14,12 @@ import {useMarkdown, type MarkedStyles, type useMarkdownHookOptions} from "react
14
14
  import {SafeAreaView} from "react-native-safe-area-context"
15
15
  import Svg, {Path, Rect} from "react-native-svg"
16
16
 
17
+ import {OTA_ERROR_ENGLISH_COPY} from "../services/OtaErrorMapping"
17
18
  import {
18
19
  MINIMUM_OTA_BATTERY_LEVEL,
19
20
  useMentraLiveOta,
20
21
  type MentraLiveOtaController,
22
+ type MentraLiveOtaError,
21
23
  type MentraLiveOtaFlowPage,
22
24
  } from "./useMentraLiveOta"
23
25
 
@@ -142,6 +144,8 @@ const ENGLISH_COPY: Record<string, string> = {
142
144
  "ota:versionChangeFirmwarePassComplete": "Firmware updated",
143
145
  "ota:versionChangeFirmwarePassCompleteMessage":
144
146
  "Your glasses restarted with new firmware. One more step: they'll now continue to the required version.",
147
+ "ota:updateFailed": "Update Failed",
148
+ ...OTA_ERROR_ENGLISH_COPY,
145
149
  }
146
150
 
147
151
  const componentCopyKey = {
@@ -150,8 +154,17 @@ const componentCopyKey = {
150
154
  bes: "ota:componentBes",
151
155
  } as const
152
156
 
157
+ /**
158
+ * Copy for the failed screen: the translated copy key when the failure maps to one,
159
+ * otherwise the engine's English message (phone-side watchdog and preflight text).
160
+ */
161
+ function failureMessage(error: MentraLiveOtaError | null, translate: MentraLiveOtaFlowTranslate): string {
162
+ if (!error) return translate("ota:errorGeneric")
163
+ return error.copyKey ? translate(error.copyKey) : error.message
164
+ }
165
+
153
166
  function defaultTranslate(key: string, options?: Record<string, string>): string {
154
- let value = ENGLISH_COPY[key] ?? key
167
+ let value = Object.prototype.hasOwnProperty.call(ENGLISH_COPY, key) ? ENGLISH_COPY[key] : key
155
168
  for (const [name, replacement] of Object.entries(options ?? {})) {
156
169
  value = value.replaceAll(`{{${name}}}`, replacement)
157
170
  }
@@ -559,8 +572,13 @@ function OtaFlowContent({
559
572
  }
560
573
  colors={colors}
561
574
  icon="alert"
562
- title="Update Failed">
563
- <BodyText colors={colors}>{state.error?.message}</BodyText>
575
+ title={translate("ota:updateFailed")}>
576
+ <BodyText colors={colors}>{failureMessage(state.error, translate)}</BodyText>
577
+ {state.error?.glassesCode ? (
578
+ <Text style={[styles.errorCode, {color: colors.textDim}]} testID="ota-error-code">
579
+ {translate("ota:errorCode", {code: state.error.glassesCode})}
580
+ </Text>
581
+ ) : null}
564
582
  </FlowPage>
565
583
  )
566
584
  }
@@ -810,6 +828,7 @@ const styles = StyleSheet.create({
810
828
  icon: {fontSize: 64, fontWeight: "500", lineHeight: 72, textAlign: "center"},
811
829
  title: {fontSize: 20, fontWeight: "600", textAlign: "center"},
812
830
  body: {fontSize: 14, lineHeight: 20, maxWidth: 420, textAlign: "center"},
831
+ errorCode: {fontSize: 12, fontVariant: ["tabular-nums"], lineHeight: 16, opacity: 0.7, textAlign: "center"},
813
832
  percent: {fontSize: 30, fontVariant: ["tabular-nums"], fontWeight: "700"},
814
833
  progressTrack: {borderRadius: 4, height: 8, maxWidth: 420, overflow: "hidden", width: "100%"},
815
834
  progressFill: {borderRadius: 4, height: 8},
@@ -14,7 +14,9 @@ import {
14
14
  } from "../services/OtaAutoChain"
15
15
  import {
16
16
  BES_INSTALL_RESTART_MESSAGE,
17
+ OTA_ERROR_BES_RESTART_REQUIRED_COPY_KEY,
17
18
  getOtaErrorMessage,
19
+ otaErrorCopyKey,
18
20
  shouldRequireGlassesRebootForBesFailure,
19
21
  shouldShowChangeWifiForOtaDownloadFailure,
20
22
  } from "../services/OtaErrorMapping"
@@ -54,7 +56,19 @@ export type MentraLiveOtaErrorCode =
54
56
 
55
57
  export type MentraLiveOtaError = {
56
58
  code: MentraLiveOtaErrorCode
59
+ /** English copy for hosts without localization. */
57
60
  message: string
61
+ /**
62
+ * Copy key for `message` when the failure maps to known copy, so localized hosts can
63
+ * translate it. Null for phone-side watchdog and preflight messages, which are English-only.
64
+ * Optional so host code that builds this type by hand keeps compiling; the hook always sets it.
65
+ */
66
+ copyKey?: string | null
67
+ /**
68
+ * Raw failure code reported by the glasses (`ota_status.error`), for support. Null when the
69
+ * failure originated on the phone. Optional for the same source-compatibility reason.
70
+ */
71
+ glassesCode?: string | null
58
72
  }
59
73
 
60
74
  export type MentraLiveOtaTransport = "wifi" | "hotspot"
@@ -680,9 +694,16 @@ export function useMentraLiveOta(options: UseMentraLiveOtaOptions = {}): MentraL
680
694
  error = {
681
695
  code: "check_failed",
682
696
  message: "Couldn't check for updates. Please check your connection and try again.",
697
+ copyKey: "ota:checkFailedMessage",
698
+ glassesCode: null,
683
699
  }
684
700
  } else if (screen === "update_info_unavailable") {
685
- error = {code: "update_info_unavailable", message: "Update information for this app version is unavailable."}
701
+ error = {
702
+ code: "update_info_unavailable",
703
+ message: "Update information for this app version is unavailable.",
704
+ copyKey: "ota:updateInfoUnavailableMessage",
705
+ glassesCode: null,
706
+ }
686
707
  }
687
708
  return {
688
709
  screen,
@@ -745,16 +766,33 @@ export function useMentraLiveOta(options: UseMentraLiveOtaOptions = {}): MentraL
745
766
  installSnapshot.otaProgress,
746
767
  installSnapshot.errorMsg,
747
768
  )
748
- const displayedError = requiresGlassesReboot
749
- ? BES_INSTALL_RESTART_MESSAGE
750
- : installSnapshot.errorMsg || getOtaErrorMessage(installSnapshot.otaStatus?.error)
769
+ // The raw code the glasses attached to their failure report, kept for support even when
770
+ // phone-side copy outranks it. Only a failed ota_status carries a current code.
771
+ const glassesCode = installSnapshot.otaStatus?.status === "failed" ? installSnapshot.otaStatus.error || null : null
772
+ // Precedence mirrors the legacy screen: the BES restart instruction, then a phone-side
773
+ // watchdog/preflight message (English-only, no copy key), then the glasses code mapped to
774
+ // copy (unknown codes get the generic glasses-error copy rather than the raw code).
775
+ let displayedError: string
776
+ let copyKey: string | null
777
+ if (requiresGlassesReboot) {
778
+ displayedError = BES_INSTALL_RESTART_MESSAGE
779
+ copyKey = OTA_ERROR_BES_RESTART_REQUIRED_COPY_KEY
780
+ } else if (installSnapshot.errorMsg) {
781
+ displayedError = installSnapshot.errorMsg
782
+ copyKey = null
783
+ } else {
784
+ displayedError = getOtaErrorMessage(glassesCode)
785
+ copyKey = otaErrorCopyKey(glassesCode)
786
+ }
751
787
  const progressState = progressScreen(installSnapshot)
752
788
  const screen = progressState === "complete" && autoChainActive ? "finishing" : progressState
753
- const error =
789
+ const error: MentraLiveOtaError | null =
754
790
  screen === "failed"
755
791
  ? {
756
- code: requiresGlassesReboot ? ("bes_restart_required" as const) : ("install_failed" as const),
792
+ code: requiresGlassesReboot ? "bes_restart_required" : "install_failed",
757
793
  message: displayedError,
794
+ copyKey,
795
+ glassesCode,
758
796
  }
759
797
  : null
760
798
  const totalSteps = installSnapshot.otaStatus?.totalSteps ?? null