@mentra/engine 0.1.0-dev.1 → 3.1.0-beta.100

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 (263) hide show
  1. package/README.md +43 -29
  2. package/build/bluetooth-sdk/debug.d.ts +2 -0
  3. package/build/bluetooth-sdk/debug.d.ts.map +1 -0
  4. package/build/bluetooth-sdk/debug.js +2 -0
  5. package/build/bluetooth-sdk/debug.js.map +1 -0
  6. package/build/bluetooth-sdk/index.d.ts +3 -0
  7. package/build/bluetooth-sdk/index.d.ts.map +1 -0
  8. package/build/bluetooth-sdk/index.js +3 -0
  9. package/build/bluetooth-sdk/index.js.map +1 -0
  10. package/build/bluetooth-sdk/ota-transport.d.ts +2 -0
  11. package/build/bluetooth-sdk/ota-transport.d.ts.map +1 -0
  12. package/build/bluetooth-sdk/ota-transport.js +2 -0
  13. package/build/bluetooth-sdk/ota-transport.js.map +1 -0
  14. package/build/bluetooth-sdk/photo-receiver.d.ts +3 -0
  15. package/build/bluetooth-sdk/photo-receiver.d.ts.map +1 -0
  16. package/build/bluetooth-sdk/photo-receiver.js +3 -0
  17. package/build/bluetooth-sdk/photo-receiver.js.map +1 -0
  18. package/build/bluetooth-sdk/react.d.ts +2 -0
  19. package/build/bluetooth-sdk/react.d.ts.map +1 -0
  20. package/build/bluetooth-sdk/react.js +2 -0
  21. package/build/bluetooth-sdk/react.js.map +1 -0
  22. package/build/bluetooth-sdk/types.d.ts +2 -0
  23. package/build/bluetooth-sdk/types.d.ts.map +1 -0
  24. package/build/bluetooth-sdk/types.js +2 -0
  25. package/build/bluetooth-sdk/types.js.map +1 -0
  26. package/build/engine.d.ts +18 -15
  27. package/build/engine.d.ts.map +1 -1
  28. package/build/engine.js +2 -2
  29. package/build/engine.js.map +1 -1
  30. package/build/facades/display.d.ts +1 -1
  31. package/build/facades/display.d.ts.map +1 -1
  32. package/build/facades/display.js +1 -1
  33. package/build/facades/display.js.map +1 -1
  34. package/build/facades/glasses.d.ts +3 -13
  35. package/build/facades/glasses.d.ts.map +1 -1
  36. package/build/facades/glasses.js +3 -3
  37. package/build/facades/glasses.js.map +1 -1
  38. package/build/facades/ota.d.ts +16 -22
  39. package/build/facades/ota.d.ts.map +1 -1
  40. package/build/facades/ota.js +13 -9
  41. package/build/facades/ota.js.map +1 -1
  42. package/build/facades/pairing.d.ts +8 -5
  43. package/build/facades/pairing.d.ts.map +1 -1
  44. package/build/facades/pairing.js +83 -9
  45. package/build/facades/pairing.js.map +1 -1
  46. package/build/facades/speech.d.ts +7 -6
  47. package/build/facades/speech.d.ts.map +1 -1
  48. package/build/facades/speech.js +1 -1
  49. package/build/facades/speech.js.map +1 -1
  50. package/build/generated/releaseMetadata.d.ts +12 -0
  51. package/build/generated/releaseMetadata.d.ts.map +1 -0
  52. package/build/generated/releaseMetadata.js +10 -0
  53. package/build/generated/releaseMetadata.js.map +1 -0
  54. package/build/index.d.ts +7 -8
  55. package/build/index.d.ts.map +1 -1
  56. package/build/index.js +4 -5
  57. package/build/index.js.map +1 -1
  58. package/build/react/MentraLiveOtaFlow.d.ts +8 -2
  59. package/build/react/MentraLiveOtaFlow.d.ts.map +1 -1
  60. package/build/react/MentraLiveOtaFlow.js +256 -354
  61. package/build/react/MentraLiveOtaFlow.js.map +1 -1
  62. package/build/react/index.d.ts +1 -0
  63. package/build/react/index.d.ts.map +1 -1
  64. package/build/react/index.js +1 -0
  65. package/build/react/index.js.map +1 -1
  66. package/build/react/useMentraLiveOta.d.ts +84 -0
  67. package/build/react/useMentraLiveOta.d.ts.map +1 -0
  68. package/build/react/useMentraLiveOta.js +627 -0
  69. package/build/react/useMentraLiveOta.js.map +1 -0
  70. package/build/services/AppRegistry.d.ts +8 -0
  71. package/build/services/AppRegistry.d.ts.map +1 -1
  72. package/build/services/AppRegistry.js +15 -0
  73. package/build/services/AppRegistry.js.map +1 -1
  74. package/build/services/BlobStore.d.ts +2 -0
  75. package/build/services/BlobStore.d.ts.map +1 -1
  76. package/build/services/BlobStore.js +63 -10
  77. package/build/services/BlobStore.js.map +1 -1
  78. package/build/services/DisplayProcessor.d.ts +3 -3
  79. package/build/services/DisplayProcessor.js +3 -3
  80. package/build/services/DisplayProcessor.js.map +1 -1
  81. package/build/services/GlassesStatusProjection.d.ts +15 -2
  82. package/build/services/GlassesStatusProjection.d.ts.map +1 -1
  83. package/build/services/GlassesStatusProjection.js +3 -3
  84. package/build/services/GlassesStatusProjection.js.map +1 -1
  85. package/build/services/HotspotOtaTransport.d.ts.map +1 -1
  86. package/build/services/HotspotOtaTransport.js +8 -7
  87. package/build/services/HotspotOtaTransport.js.map +1 -1
  88. package/build/services/LocalDisplayManager.d.ts +2 -3
  89. package/build/services/LocalDisplayManager.d.ts.map +1 -1
  90. package/build/services/LocalDisplayManager.js +2 -3
  91. package/build/services/LocalDisplayManager.js.map +1 -1
  92. package/build/services/OtaAutoChain.d.ts +9 -2
  93. package/build/services/OtaAutoChain.d.ts.map +1 -1
  94. package/build/services/OtaAutoChain.js +10 -2
  95. package/build/services/OtaAutoChain.js.map +1 -1
  96. package/build/services/OtaInstallCoordinator.d.ts +26 -3
  97. package/build/services/OtaInstallCoordinator.d.ts.map +1 -1
  98. package/build/services/OtaInstallCoordinator.js +38 -13
  99. package/build/services/OtaInstallCoordinator.js.map +1 -1
  100. package/build/services/OtaService.d.ts.map +1 -1
  101. package/build/services/OtaService.js +1 -1
  102. package/build/services/OtaService.js.map +1 -1
  103. package/build/services/OtaUpdateCheckService.d.ts +4 -1
  104. package/build/services/OtaUpdateCheckService.d.ts.map +1 -1
  105. package/build/services/OtaUpdateCheckService.js +33 -21
  106. package/build/services/OtaUpdateCheckService.js.map +1 -1
  107. package/build/services/PhonePhotoCoordinator.js +1 -1
  108. package/build/services/PhonePhotoCoordinator.js.map +1 -1
  109. package/build/services/StreamLifecycleController.d.ts +3 -3
  110. package/build/services/StreamLifecycleController.js +3 -3
  111. package/build/services/StreamLifecycleController.js.map +1 -1
  112. package/build/services/asg/localNetworkTransport.d.ts.map +1 -1
  113. package/build/services/asg/localNetworkTransport.js +13 -12
  114. package/build/services/asg/localNetworkTransport.js.map +1 -1
  115. package/build/services/glassesClockSync.d.ts.map +1 -1
  116. package/build/services/glassesClockSync.js +5 -1
  117. package/build/services/glassesClockSync.js.map +1 -1
  118. package/build/services/otaDisplayState.d.ts +1 -1
  119. package/build/services/otaDisplayState.d.ts.map +1 -1
  120. package/build/services/otaDisplayState.js.map +1 -1
  121. package/build/services/otaInstallPolicy.d.ts +5 -1
  122. package/build/services/otaInstallPolicy.d.ts.map +1 -1
  123. package/build/services/otaInstallPolicy.js +4 -0
  124. package/build/services/otaInstallPolicy.js.map +1 -1
  125. package/build/services/otaLegacyMapping.d.ts +1 -1
  126. package/build/services/otaLegacyMapping.d.ts.map +1 -1
  127. package/build/services/otaLegacyMapping.js.map +1 -1
  128. package/build/services/otaManifestPolicy.d.ts +14 -0
  129. package/build/services/otaManifestPolicy.d.ts.map +1 -0
  130. package/build/services/otaManifestPolicy.js +19 -0
  131. package/build/services/otaManifestPolicy.js.map +1 -0
  132. package/build/services/otaManifestUrl.d.ts +2 -1
  133. package/build/services/otaManifestUrl.d.ts.map +1 -1
  134. package/build/services/otaManifestUrl.js +24 -32
  135. package/build/services/otaManifestUrl.js.map +1 -1
  136. package/build/services/otaReleaseVersion.d.ts +10 -0
  137. package/build/services/otaReleaseVersion.d.ts.map +1 -0
  138. package/build/services/otaReleaseVersion.js +14 -0
  139. package/build/services/otaReleaseVersion.js.map +1 -0
  140. package/build/stores/appVisibility.d.ts +3 -0
  141. package/build/stores/appVisibility.d.ts.map +1 -0
  142. package/build/stores/appVisibility.js +3 -0
  143. package/build/stores/appVisibility.js.map +1 -0
  144. package/build/stores/apps.d.ts.map +1 -1
  145. package/build/stores/apps.js +7 -1
  146. package/build/stores/apps.js.map +1 -1
  147. package/build/stores/core.d.ts +3 -3
  148. package/build/stores/core.d.ts.map +1 -1
  149. package/build/stores/core.js.map +1 -1
  150. package/build/stores/glasses.d.ts +10 -4
  151. package/build/stores/glasses.d.ts.map +1 -1
  152. package/build/stores/glasses.js.map +1 -1
  153. package/build/stores/settings.js +3 -3
  154. package/build/stores/settings.js.map +1 -1
  155. package/build/types/applet.d.ts +1 -1
  156. package/build/types/applet.js +1 -1
  157. package/build/types/applet.js.map +1 -1
  158. package/build/types/capabilities/even-realities-g1.d.ts.map +1 -1
  159. package/build/types/capabilities/even-realities-g1.js +2 -0
  160. package/build/types/capabilities/even-realities-g1.js.map +1 -1
  161. package/build/types/capabilities/even-realities-g2.d.ts.map +1 -1
  162. package/build/types/capabilities/even-realities-g2.js +2 -0
  163. package/build/types/capabilities/even-realities-g2.js.map +1 -1
  164. package/build/types/capabilities/mentra-display.d.ts.map +1 -1
  165. package/build/types/capabilities/mentra-display.js +2 -0
  166. package/build/types/capabilities/mentra-display.js.map +1 -1
  167. package/build/types/capabilities/mentra-live.d.ts.map +1 -1
  168. package/build/types/capabilities/mentra-live.js +2 -0
  169. package/build/types/capabilities/mentra-live.js.map +1 -1
  170. package/build/types/capabilities/nimo.d.ts +9 -0
  171. package/build/types/capabilities/nimo.d.ts.map +1 -0
  172. package/build/types/capabilities/nimo.js +57 -0
  173. package/build/types/capabilities/nimo.js.map +1 -0
  174. package/build/types/capabilities/none.d.ts.map +1 -1
  175. package/build/types/capabilities/none.js +2 -0
  176. package/build/types/capabilities/none.js.map +1 -1
  177. package/build/types/capabilities/simulated-glasses.d.ts.map +1 -1
  178. package/build/types/capabilities/simulated-glasses.js +2 -0
  179. package/build/types/capabilities/simulated-glasses.js.map +1 -1
  180. package/build/types/capabilities/vuzix-z100.d.ts.map +1 -1
  181. package/build/types/capabilities/vuzix-z100.js +2 -0
  182. package/build/types/capabilities/vuzix-z100.js.map +1 -1
  183. package/build/types/enums.d.ts +3 -26
  184. package/build/types/enums.d.ts.map +1 -1
  185. package/build/types/enums.js +2 -27
  186. package/build/types/enums.js.map +1 -1
  187. package/build/types/hardware.d.ts +6 -15
  188. package/build/types/hardware.d.ts.map +1 -1
  189. package/build/types/hardware.js +4 -4
  190. package/build/types/hardware.js.map +1 -1
  191. package/build/types/index.d.ts +3 -7
  192. package/build/types/index.d.ts.map +1 -1
  193. package/build/types/index.js +3 -7
  194. package/build/types/index.js.map +1 -1
  195. package/build/utils/display/composer/ColumnComposer.d.ts +1 -1
  196. package/build/utils/display/composer/ColumnComposer.js +1 -1
  197. package/build/utils/display/composer/ColumnComposer.js.map +1 -1
  198. package/package.json +47 -22
  199. package/src/bluetooth-sdk/debug.ts +1 -0
  200. package/src/bluetooth-sdk/index.ts +2 -0
  201. package/src/bluetooth-sdk/ota-transport.ts +1 -0
  202. package/src/bluetooth-sdk/photo-receiver.ts +2 -0
  203. package/src/bluetooth-sdk/react.ts +1 -0
  204. package/src/bluetooth-sdk/types.ts +1 -0
  205. package/src/engine.ts +2 -2
  206. package/src/facades/display.ts +1 -1
  207. package/src/facades/glasses.ts +4 -4
  208. package/src/facades/ota.ts +23 -10
  209. package/src/facades/pairing.ts +92 -16
  210. package/src/facades/speech.ts +21 -7
  211. package/src/generated/releaseMetadata.ts +20 -0
  212. package/src/index.ts +16 -11
  213. package/src/react/MentraLiveOtaFlow.tsx +378 -480
  214. package/src/react/index.ts +14 -0
  215. package/src/react/useMentraLiveOta.ts +793 -0
  216. package/src/services/AppRegistry.ts +16 -0
  217. package/src/services/BlobStore.ts +57 -10
  218. package/src/services/DisplayProcessor.ts +3 -3
  219. package/src/services/GlassesStatusProjection.ts +7 -6
  220. package/src/services/HotspotOtaTransport.ts +8 -7
  221. package/src/services/LocalDisplayManager.ts +2 -3
  222. package/src/services/OtaAutoChain.ts +26 -2
  223. package/src/services/OtaInstallCoordinator.ts +40 -13
  224. package/src/services/OtaService.ts +1 -2
  225. package/src/services/OtaUpdateCheckService.ts +45 -27
  226. package/src/services/PhonePhotoCoordinator.ts +1 -1
  227. package/src/services/StreamLifecycleController.ts +3 -3
  228. package/src/services/asg/localNetworkTransport.ts +20 -19
  229. package/src/services/glassesClockSync.ts +5 -1
  230. package/src/services/otaDisplayState.ts +1 -1
  231. package/src/services/otaInstallPolicy.ts +5 -1
  232. package/src/services/otaLegacyMapping.ts +1 -1
  233. package/src/services/otaManifestPolicy.ts +42 -0
  234. package/src/services/otaManifestUrl.ts +27 -36
  235. package/src/services/otaReleaseVersion.ts +22 -0
  236. package/src/stores/appVisibility.ts +3 -0
  237. package/src/stores/apps.ts +7 -1
  238. package/src/stores/core.ts +4 -4
  239. package/src/stores/glasses.ts +13 -6
  240. package/src/stores/settings.ts +3 -3
  241. package/src/types/applet.ts +1 -1
  242. package/src/types/capabilities/even-realities-g1.ts +3 -0
  243. package/src/types/capabilities/even-realities-g2.ts +3 -0
  244. package/src/types/capabilities/mentra-display.ts +3 -0
  245. package/src/types/capabilities/mentra-live.ts +3 -0
  246. package/src/types/capabilities/nimo.ts +59 -0
  247. package/src/types/capabilities/none.ts +3 -0
  248. package/src/types/capabilities/simulated-glasses.ts +3 -0
  249. package/src/types/capabilities/vuzix-z100.ts +3 -0
  250. package/src/types/enums.ts +2 -27
  251. package/src/types/hardware.ts +7 -15
  252. package/src/types/index.ts +3 -6
  253. package/src/utils/display/composer/ColumnComposer.ts +1 -1
  254. package/build/devtools.d.ts +0 -11
  255. package/build/devtools.d.ts.map +0 -1
  256. package/build/devtools.js +0 -13
  257. package/build/devtools.js.map +0 -1
  258. package/build/internal.d.ts +0 -67
  259. package/build/internal.d.ts.map +0 -1
  260. package/build/internal.js +0 -90
  261. package/build/internal.js.map +0 -1
  262. package/src/devtools.ts +0 -13
  263. package/src/internal.ts +0 -160
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mentra/engine",
3
- "version": "0.1.0-dev.1",
3
+ "version": "3.1.0-beta.100",
4
4
  "description": "Mentra Engine — miniapp registry, WebView bridge, and miniapp store",
5
5
  "main": "build/index.js",
6
6
  "react-native": "src/index.ts",
@@ -11,21 +11,41 @@
11
11
  "react-native": "./src/index.ts",
12
12
  "default": "./build/index.js"
13
13
  },
14
- "./internal": {
15
- "types": "./build/internal.d.ts",
16
- "react-native": "./src/internal.ts",
17
- "default": "./build/internal.js"
18
- },
19
- "./devtools": {
20
- "types": "./build/devtools.d.ts",
21
- "react-native": "./src/devtools.ts",
22
- "default": "./build/devtools.js"
23
- },
24
14
  "./ota": {
25
15
  "types": "./build/react/index.d.ts",
26
16
  "react-native": "./src/react/index.ts",
27
17
  "default": "./build/react/index.js"
28
18
  },
19
+ "./bluetooth-sdk": {
20
+ "types": "./build/bluetooth-sdk/index.d.ts",
21
+ "react-native": "./src/bluetooth-sdk/index.ts",
22
+ "default": "./build/bluetooth-sdk/index.js"
23
+ },
24
+ "./bluetooth-sdk/react": {
25
+ "types": "./build/bluetooth-sdk/react.d.ts",
26
+ "react-native": "./src/bluetooth-sdk/react.ts",
27
+ "default": "./build/bluetooth-sdk/react.js"
28
+ },
29
+ "./bluetooth-sdk/types": {
30
+ "types": "./build/bluetooth-sdk/types.d.ts",
31
+ "react-native": "./src/bluetooth-sdk/types.ts",
32
+ "default": "./build/bluetooth-sdk/types.js"
33
+ },
34
+ "./bluetooth-sdk/photo-receiver": {
35
+ "types": "./build/bluetooth-sdk/photo-receiver.d.ts",
36
+ "react-native": "./src/bluetooth-sdk/photo-receiver.ts",
37
+ "default": "./build/bluetooth-sdk/photo-receiver.js"
38
+ },
39
+ "./bluetooth-sdk/ota-transport": {
40
+ "types": "./build/bluetooth-sdk/ota-transport.d.ts",
41
+ "react-native": "./src/bluetooth-sdk/ota-transport.ts",
42
+ "default": "./build/bluetooth-sdk/ota-transport.js"
43
+ },
44
+ "./bluetooth-sdk/debug": {
45
+ "types": "./build/bluetooth-sdk/debug.d.ts",
46
+ "react-native": "./src/bluetooth-sdk/debug.ts",
47
+ "default": "./build/bluetooth-sdk/debug.js"
48
+ },
29
49
  "./build/*": null,
30
50
  "./src/*": null,
31
51
  "./package.json": "./package.json"
@@ -34,6 +54,10 @@
34
54
  "build",
35
55
  "README.md",
36
56
  "src",
57
+ "!build/devtools.*",
58
+ "!build/internal.*",
59
+ "!src/devtools.ts",
60
+ "!src/internal.ts",
37
61
  "!src/**/__tests__",
38
62
  "!src/**/*.test.ts"
39
63
  ],
@@ -41,7 +65,11 @@
41
65
  "build": "expo-module build",
42
66
  "clean": "expo-module clean",
43
67
  "lint": "expo-module lint",
44
- "test": "./scripts/test.sh",
68
+ "test": "./scripts/test.sh && node --test scripts/*.test.mjs",
69
+ "write:release-metadata": "node scripts/write-release-metadata.mjs",
70
+ "verify:release-package": "node scripts/verify-release-package.mjs",
71
+ "test:public-api": "bun test src/bluetooth-sdk/__tests__/publicApi.test.ts",
72
+ "test:public-ota-consumer": "tsc --noEmit --strict --skipLibCheck --jsx react-jsx --moduleResolution bundler --module esnext --target es2022 scripts/fixtures/public-ota-consumer.tsx",
45
73
  "build:module": "expo-module prepare",
46
74
  "prepublishOnly": "expo-module prepublishOnly",
47
75
  "expo-module": "expo-module"
@@ -69,16 +97,18 @@
69
97
  "registry": "https://registry.npmjs.org/"
70
98
  },
71
99
  "dependencies": {
100
+ "@mentra/bluetooth-sdk": "3.1.0-beta.100",
101
+ "@mentra/cloud-client": "3.1.0-beta.100",
102
+ "@mentra/cloud-protocol": "3.1.0-beta.100",
103
+ "@mentra/crust": "3.1.0-beta.100",
104
+ "@mentra/miniapp": "3.1.0-beta.100",
72
105
  "buffer": "^6.0.3",
73
106
  "events": "^3.3.0",
107
+ "react-native-marked": "8.1.1",
74
108
  "semver": "^7.7.4",
75
109
  "typesafe-ts": "^1.7.1"
76
110
  },
77
111
  "devDependencies": {
78
- "@mentra/bluetooth-sdk": "workspace:*",
79
- "@mentra/cloud-client": "workspace:*",
80
- "@mentra/cloud-protocol": "workspace:*",
81
- "@mentra/miniapp": "workspace:*",
82
112
  "@types/semver": "^7.7.1",
83
113
  "expo-module-scripts": "^55.0.2",
84
114
  "expo-modules-core": "55.0.25",
@@ -119,11 +149,6 @@
119
149
  "@react-native-community/netinfo": "*",
120
150
  "@dr.pogodin/react-native-fs": "*",
121
151
  "@craftzdog/react-native-buffer": "*",
122
- "axios": "*",
123
- "@mentra/bluetooth-sdk": "*",
124
- "@mentra/crust": "^0.1.0-dev.1",
125
- "@mentra/cloud-client": "^0.1.0-dev.0",
126
- "@mentra/miniapp": "^0.3.0-dev.1",
127
- "@mentra/cloud-protocol": "^0.1.0-dev.0"
152
+ "axios": "*"
128
153
  }
129
154
  }
@@ -0,0 +1 @@
1
+ export * from "@mentra/bluetooth-sdk/debug"
@@ -0,0 +1,2 @@
1
+ export {default} from "@mentra/bluetooth-sdk"
2
+ export * from "@mentra/bluetooth-sdk"
@@ -0,0 +1 @@
1
+ export * from "@mentra/bluetooth-sdk/ota-transport"
@@ -0,0 +1,2 @@
1
+ export {default} from "@mentra/bluetooth-sdk/photo-receiver"
2
+ export * from "@mentra/bluetooth-sdk/photo-receiver"
@@ -0,0 +1 @@
1
+ export * from "@mentra/bluetooth-sdk/react"
@@ -0,0 +1 @@
1
+ export * from "@mentra/bluetooth-sdk/types"
package/src/engine.ts CHANGED
@@ -5,8 +5,8 @@
5
5
  * name stays `engine` in code; the public API surface is `engine`.)
6
6
  *
7
7
  * It grows one facade at a time. The migration-era flat store/service exports
8
- * live on the `@mentra/engine/internal` entry (and the debug singletons on
9
- * `@mentra/engine/devtools`); they shrink as screens move onto `engine.*`.
8
+ * remain in a private MentraOS host package; they shrink as screens move onto
9
+ * `engine.*`.
10
10
  */
11
11
  import {configure, start as bootstrapStart, stop as bootstrapStop, updateUiSeams} from "./runtime/bootstrap"
12
12
  import {cloudClientService} from "./services/CloudClientService"
@@ -4,7 +4,7 @@
4
4
  * glasses display for dev tools and escape-hatch use (normal rendering goes through
5
5
  * the engine DisplayProcessor / layout system, not these).
6
6
  */
7
- import BluetoothSdk from "@mentra/bluetooth-sdk/internal"
7
+ import BluetoothSdk from "@mentra/bluetooth-sdk"
8
8
  import {displayMirror} from "./displayMirror"
9
9
 
10
10
  export const display = {
@@ -11,7 +11,7 @@
11
11
  // surface, not the public entry. Relative path (the alias doesn't resolve in engine's
12
12
  // standalone build); jest moduleNameMapper + tsconfig both resolve it.
13
13
  import BluetoothSdk from "@mentra/bluetooth-sdk/internal"
14
- import type {ButtonPressEvent, TouchEvent} from "@mentra/bluetooth-sdk/internal"
14
+ import type {ButtonPressEvent, ConnectOptions, Device, TouchEvent} from "@mentra/bluetooth-sdk"
15
15
  import {useGlassesStore} from "../stores/glasses"
16
16
  import {useSettingsStore, SETTINGS} from "../stores/settings"
17
17
  import {hasDefaultDevice} from "../services/DeviceStoreHydration"
@@ -94,10 +94,10 @@ export const glasses = {
94
94
  disconnect: (): Promise<void> => BluetoothSdk.disconnect(),
95
95
  forget: (): Promise<void> => BluetoothSdk.forget(),
96
96
  /** Connect to a specific (discovered) device. */
97
- connect: async (...args: Parameters<typeof BluetoothSdk.connect>): Promise<void> => {
97
+ connect: async (device: Device, options?: ConnectOptions): Promise<void> => {
98
98
  try {
99
99
  await pushAllBluetoothSettings()
100
- await BluetoothSdk.connect(...args)
100
+ await BluetoothSdk.connect(device, options)
101
101
  } catch (error) {
102
102
  recordSupportProfileConnectionFailure(error, "connect")
103
103
  throw error
@@ -106,7 +106,7 @@ export const glasses = {
106
106
  /** Connect the built-in simulated glasses (dev/testing). */
107
107
  connectSimulated: (): Promise<void> => BluetoothSdk.connectSimulated(),
108
108
  /** Set a device as the `connectDefault()` target. */
109
- setDefault: (...args: Parameters<typeof BluetoothSdk.setDefaultDevice>) => BluetoothSdk.setDefaultDevice(...args),
109
+ setDefault: (device: Device | null): Promise<void> => BluetoothSdk.setDefaultDevice(device),
110
110
  /**
111
111
  * Reconnect to the saved default glasses. Resolves `false` when there's nothing to
112
112
  * reconnect to (no default paired) or the connect attempt fails (e.g. BLE powered
@@ -8,9 +8,16 @@
8
8
  * `installSession` fronts the OtaInstallCoordinator state machine (WP 8B) — the host
9
9
  * progress screen is a pure renderer over its snapshot + attach/detach/retry/finish.
10
10
  */
11
- import BluetoothSdk from "@mentra/bluetooth-sdk/internal"
12
- import type {OtaProgress, OtaProgressStatus, OtaStatus, OtaUpdateInfo} from "@mentra/bluetooth-sdk/internal"
13
- import {isGlassesConnected, useGlassesStore} from "../stores/glasses"
11
+ import BluetoothSdk from "@mentra/bluetooth-sdk"
12
+ import type {
13
+ OtaProgress,
14
+ OtaProgressStatus,
15
+ OtaStartAckEvent,
16
+ OtaStatus,
17
+ OtaUpdateInfo,
18
+ ReleaseChangelog,
19
+ } from "@mentra/bluetooth-sdk"
20
+ import {isGlassesConnected, isGlassesReady, useGlassesStore} from "../stores/glasses"
14
21
  import {resolveOtaManifestUrl} from "../services/otaManifestUrl"
15
22
  import {otaInstallCoordinator, type OtaInstallSnapshot} from "../services/OtaInstallCoordinator"
16
23
  import {startGlassesStatusProjection} from "../services/GlassesStatusProjection"
@@ -25,9 +32,12 @@ function projectSnapshot() {
25
32
  const s = useGlassesStore.getState()
26
33
  return {
27
34
  connected: isGlassesConnected(s.connection),
35
+ ready: isGlassesReady(s.connection),
28
36
  buildNumber: s.buildNumber || null,
37
+ appVersion: s.appVersion || null,
29
38
  mtkFirmwareVersion: s.mtkFirmwareVersion || null,
30
39
  besFirmwareVersion: s.besFirmwareVersion || null,
40
+ batteryLevel: s.batteryLevel >= 0 ? s.batteryLevel : null,
31
41
  hotspotOtaVersion: s.hotspotOtaVersion ?? 0,
32
42
  wifiConnected: s.wifi.state === "connected",
33
43
  wifiStatusKnown: s.wifiStatusKnown,
@@ -46,6 +56,7 @@ export type {
46
56
  OtaProgressStatus,
47
57
  OtaStatus,
48
58
  OtaUpdateInfo,
59
+ ReleaseChangelog,
49
60
  OtaInstallSnapshot,
50
61
  OtaCheckCurrentGlassesOptions,
51
62
  OtaCheckCurrentGlassesResult,
@@ -55,7 +66,7 @@ export const ota = {
55
66
  // --- actions ---
56
67
  /**
57
68
  * Start the device-status and OTA projections without starting the authenticated
58
- * cloud/miniapp runtime. This is the explicit entry point for Bluetooth-only hosts.
69
+ * cloud connection or miniapp runtime. This is the explicit entry point for Bluetooth-only hosts.
59
70
  * Idempotent and safe when the full engine runtime is already running.
60
71
  */
61
72
  initialize: async () => {
@@ -65,11 +76,11 @@ export const ota = {
65
76
  },
66
77
  /**
67
78
  * Start the firmware install with the resolved OTA manifest URL. Progress lands on
68
- * `status()`/`onStatus()`. (The host resolves the manifest URL — dev-override/env/prod
69
- * resolution stays with the OTA config; the host-side stuck/retry watchdog is its own
79
+ * `status()`/`onStatus()`. (The host resolves the manifest URL — developer override,
80
+ * host pin, or Engine release pin resolution stays with the OTA config; the stuck/retry watchdog is its own
70
81
  * resilience layer on top of this command.)
71
82
  */
72
- install: (...args: Parameters<typeof BluetoothSdk.startOtaUpdate>) => BluetoothSdk.startOtaUpdate(...args),
83
+ install: (otaVersionUrl?: string | null): Promise<OtaStartAckEvent> => BluetoothSdk.startOtaUpdate(otaVersionUrl),
73
84
  // Deferred: this facade entry was intended to become the engine-owned retry/check
74
85
  // action, but BluetoothSdk.checkForOtaUpdate() only returns a boolean. Exposing it
75
86
  // here would make callers think the rich otaUpdateAvailable read model is refreshed,
@@ -84,6 +95,9 @@ export const ota = {
84
95
  ping: () => BluetoothSdk.ping(),
85
96
  /** Resolve and compare the current glasses against the OTA manifest, then update the OTA snapshot. */
86
97
  checkForUpdates: (options?: OtaCheckCurrentGlassesOptions) => checkCurrentGlassesForUpdate(options),
98
+ /** Return bundled release changelogs crossed between two coordinated product versions, newest first. */
99
+ getReleaseChangelogs: (fromVersion?: string | null, toVersion?: string | null): ReleaseChangelog[] =>
100
+ BluetoothSdk.getReleaseChangelogs(fromVersion, toVersion),
87
101
  /** Clear the available-update prompt state. */
88
102
  clearUpdateAvailable: () => useGlassesStore.getState().setOtaUpdateAvailable(null),
89
103
  /** Clear active progress/status before entering a fresh install flow. */
@@ -113,7 +127,6 @@ export const ota = {
113
127
  * @deprecated Legacy progress route (build < 37) only — removed with WP 8D.
114
128
  */
115
129
  clearBuildNumberForNextCheck: () => {
116
- BluetoothSdk.updateGlasses({buildNumber: ""})
117
130
  useGlassesStore.getState().setGlassesInfo({buildNumber: ""})
118
131
  },
119
132
  /**
@@ -136,9 +149,9 @@ export const ota = {
136
149
  detach: () => otaInstallCoordinator.detach(),
137
150
  /** Retry after a failure: clear state and re-send ota_start (if connected). */
138
151
  retry: () => otaInstallCoordinator.retry(),
139
- /** Terminal cleanup for Continue/Done (navigation stays in the screen). */
152
+ /** Terminal cleanup for Continue/Done, including hotspot route teardown. */
140
153
  finish: () => otaInstallCoordinator.finish(),
141
- /** Abandon an interrupted session (super-mode skip): finish() + drop the session's status/progress. */
154
+ /** Abandon an interrupted session: await finish() then drop the session's status/progress. */
142
155
  discard: () => otaInstallCoordinator.discard(),
143
156
  /** Current install read model (displayState/errorMsg/lockout + glasses OTA data). */
144
157
  snapshot: (): OtaInstallSnapshot => otaInstallCoordinator.snapshot(),
@@ -10,9 +10,10 @@
10
10
  // target hint) lives on the full surface, not the public entry (same reason
11
11
  // the glasses facade imports internal).
12
12
  import BluetoothSdk from "@mentra/bluetooth-sdk/internal"
13
- import type {ConnectOptions, Device, PairFailureEvent, GlassesNotReadyEvent} from "@mentra/bluetooth-sdk"
13
+ import type {ConnectOptions, Device, DeviceModel, PairFailureEvent, GlassesNotReadyEvent} from "@mentra/bluetooth-sdk"
14
14
  import {useCoreStore} from "../stores/core"
15
15
  import {useGlassesStore} from "../stores/glasses"
16
+ import {SETTINGS, useSettingsStore} from "../stores/settings"
16
17
  import {hasDefaultDevice} from "../services/DeviceStoreHydration"
17
18
  import {
18
19
  markPendingSelection,
@@ -20,18 +21,14 @@ import {
20
21
  subscribePairingIdentity,
21
22
  type IdentitySnapshot,
22
23
  } from "../services/PairingIdentity"
23
- import {
24
- isGlassesConnected,
25
- isGlassesLinkLayerBusy,
26
- isGlassesReady,
27
- waitForGlassesReady,
28
- } from "../services/GlassesReadiness"
24
+ import {isGlassesConnected, isGlassesLinkLayerBusy, isGlassesReady} from "../services/GlassesReadiness"
29
25
  import {
30
26
  logAutomaticReportSubmissionStatus,
31
27
  toAutomaticReportSubmissionStatus,
32
28
  type AutomaticReportSubmissionStatus,
33
29
  } from "../services/AutomaticReportResult"
34
30
  import {pushAllBluetoothSettings} from "../services/GlassesSettingsSync"
31
+ import {ControllerTypes} from "../types"
35
32
  import {submitAutomaticReport} from "./reports"
36
33
 
37
34
  export type {IdentitySnapshot} from "../services/PairingIdentity"
@@ -60,6 +57,82 @@ function projectReadiness() {
60
57
  }
61
58
  }
62
59
 
60
+ function projectTargetReady(options: Pick<PairingReadyWaitOptions, "deviceModel" | "deviceName">): boolean {
61
+ const {deviceModel, deviceName} = options
62
+ const glasses = useGlassesStore.getState()
63
+
64
+ if (deviceModel === ControllerTypes.R1) {
65
+ if (!glasses.controllerConnected || !glasses.controllerFullyBooted) return false
66
+ const settings = useSettingsStore.getState()
67
+ const pairedModel = settings.getSetting(SETTINGS.default_controller.key)
68
+ const pairedName = settings.getSetting(SETTINGS.controller_device_name.key)
69
+ return (!deviceModel || pairedModel === deviceModel) && (!deviceName || pairedName === deviceName)
70
+ }
71
+
72
+ if (!isGlassesReady(glasses.connection)) return false
73
+ const identity = projectPairingIdentity()
74
+ if (!deviceModel && !deviceName) return true
75
+ return (
76
+ identity.kind === "paired" &&
77
+ (!deviceModel || identity.model === deviceModel) &&
78
+ (!deviceName || identity.name === deviceName)
79
+ )
80
+ }
81
+
82
+ function subscribeTargetReady(
83
+ options: Pick<PairingReadyWaitOptions, "deviceModel" | "deviceName">,
84
+ cb: (ready: boolean) => void,
85
+ ): () => void {
86
+ let last = projectTargetReady(options)
87
+ const notify = () => {
88
+ const ready = projectTargetReady(options)
89
+ if (ready === last) return
90
+ last = ready
91
+ cb(ready)
92
+ }
93
+ const unsubscribeGlasses = useGlassesStore.subscribe(notify)
94
+ const unsubscribeSettings = useSettingsStore.subscribe(notify)
95
+ return () => {
96
+ unsubscribeGlasses()
97
+ unsubscribeSettings()
98
+ }
99
+ }
100
+
101
+ async function waitForTargetReady(options: PairingReadyWaitOptions, timeoutMs: number): Promise<boolean> {
102
+ return new Promise((resolve) => {
103
+ if (options.signal?.aborted) {
104
+ resolve(false)
105
+ return
106
+ }
107
+ if (projectTargetReady(options)) {
108
+ resolve(true)
109
+ return
110
+ }
111
+
112
+ let settled = false
113
+ let timeout: ReturnType<typeof setTimeout> | null = null
114
+ let unsubscribe: (() => void) | null = null
115
+ let onAbort: (() => void) | null = null
116
+ const finish = (ready: boolean) => {
117
+ if (settled) return
118
+ settled = true
119
+ if (timeout) clearTimeout(timeout)
120
+ if (unsubscribe) unsubscribe()
121
+ if (onAbort && options.signal) options.signal.removeEventListener("abort", onAbort)
122
+ resolve(ready)
123
+ }
124
+
125
+ unsubscribe = subscribeTargetReady(options, (ready) => {
126
+ if (ready) finish(true)
127
+ })
128
+ if (options.signal) {
129
+ onAbort = () => finish(false)
130
+ options.signal.addEventListener("abort", onAbort)
131
+ }
132
+ timeout = setTimeout(() => finish(projectTargetReady(options)), timeoutMs)
133
+ })
134
+ }
135
+
63
136
  export type PairingReadinessSnapshot = ReturnType<typeof projectReadiness>
64
137
 
65
138
  export async function submitPairingBootTimeoutReport(params: {
@@ -108,12 +181,7 @@ async function waitForReadyDuringPairing(options: PairingReadyWaitOptions = {}):
108
181
  })
109
182
 
110
183
  try {
111
- const ready = await waitForGlassesReady({
112
- getConnection: () => useGlassesStore.getState().connection,
113
- subscribe: (listener) => useGlassesStore.subscribe((state) => state.connection, listener),
114
- timeoutMs,
115
- signal: options.signal,
116
- })
184
+ const ready = await waitForTargetReady(options, timeoutMs)
117
185
 
118
186
  if (!ready && !options.signal?.aborted) {
119
187
  void submitPairingBootTimeoutReport({
@@ -193,6 +261,14 @@ export const pairing = {
193
261
  cb(snap)
194
262
  })
195
263
  },
264
+ /** Whether the exact wearable or controller selected on the scan screen is ready. */
265
+ targetReady: (options: Pick<PairingReadyWaitOptions, "deviceModel" | "deviceName">): boolean =>
266
+ projectTargetReady(options),
267
+ /** Subscribe to readiness for the exact selected target, excluding stale devices. */
268
+ onTargetReady: (
269
+ options: Pick<PairingReadyWaitOptions, "deviceModel" | "deviceName">,
270
+ cb: (ready: boolean) => void,
271
+ ): (() => void) => subscribeTargetReady(options, cb),
196
272
 
197
273
  // --- pairing-identity lifecycle (the PairingIdentity read-model + the JS-owned
198
274
  // identity writes; promotion to `paired` only ever happens natively) ---
@@ -206,7 +282,7 @@ export const pairing = {
206
282
  markPendingSelection: (model: string) => markPendingSelection(model),
207
283
 
208
284
  /** Start scanning for nearby glasses. Results land on `searchResults()`/`onFound()`. */
209
- scan: (...args: Parameters<typeof BluetoothSdk.startScan>) => BluetoothSdk.startScan(...args),
285
+ scan: (model: DeviceModel): Promise<void> => BluetoothSdk.startScan(model),
210
286
  /** Whether a scan is currently in progress. */
211
287
  scanning: (): boolean => useCoreStore.getState().searching,
212
288
  /** Subscribe to scan-in-progress changes; fires only when it changes. Returns an unsubscribe. */
@@ -226,7 +302,7 @@ export const pairing = {
226
302
  // leak as mutable references into the store.
227
303
  searchResults: () => useCoreStore.getState().searchResults.map((result) => ({...result})),
228
304
  /** Subscribe to scan-result changes; fires only when they change. Returns an unsubscribe. */
229
- onFound: (cb: (results: ReturnType<typeof useCoreStore.getState>["searchResults"]) => void): (() => void) => {
305
+ onFound: (cb: (results: Device[]) => void): (() => void) => {
230
306
  let last = JSON.stringify(useCoreStore.getState().searchResults)
231
307
  return useCoreStore.subscribe(() => {
232
308
  const results = useCoreStore.getState().searchResults
@@ -250,7 +326,7 @@ export const pairing = {
250
326
  return BluetoothSdk.connect(device, {...options, saveAsDefault: false})
251
327
  },
252
328
  /** Set a device as the default for subsequent `glasses.connectDefault()`. */
253
- setDefault: (...args: Parameters<typeof BluetoothSdk.setDefaultDevice>) => BluetoothSdk.setDefaultDevice(...args),
329
+ setDefault: (device: Device | null): Promise<void> => BluetoothSdk.setDefaultDevice(device),
254
330
  /**
255
331
  * Prime the native Bluetooth Classic audio watcher with the picked device.
256
332
  * The iOS Mentra Live flow pairs Classic audio BEFORE any BLE connect
@@ -7,24 +7,38 @@
7
7
  import BluetoothSdk from "@mentra/bluetooth-sdk/internal"
8
8
  import sttModelManager from "../services/STTModelManager"
9
9
  import ttsModelManager from "../services/TTSModelManager"
10
- import offlineSpeechModelService from "../services/OfflineSpeechModelService"
10
+ import offlineSpeechModelService, {
11
+ type DownloadStatus as OfflineModelDownloadStatus,
12
+ } from "../services/OfflineSpeechModelService"
13
+ import type {
14
+ DownloadProgress as SttDownloadProgress,
15
+ ExtractionProgress as SttExtractionProgress,
16
+ LanguageConfig as SttLanguageConfig,
17
+ LanguageInfo as SttLanguageInfo,
18
+ } from "../services/STTModelManager"
11
19
 
12
20
  export const speech = {
13
21
  /** Restart the glasses' on-device transcriber (e.g. after switching STT language). */
14
22
  restartTranscriber: (): Promise<void> => BluetoothSdk.restartTranscriber(),
15
23
  stt: {
16
24
  currentLanguage: () => sttModelManager.getCurrentLanguage(),
17
- languages: () => sttModelManager.getAvailableLanguages(),
18
- languageInfo: () => sttModelManager.getAllLanguageInfo(),
19
- download: (...args: Parameters<typeof sttModelManager.downloadModel>) => sttModelManager.downloadModel(...args),
25
+ languages: (): SttLanguageConfig[] => sttModelManager.getAvailableLanguages(),
26
+ languageInfo: (): Promise<SttLanguageInfo[]> => sttModelManager.getAllLanguageInfo(),
27
+ download: (
28
+ ...args: [
29
+ code?: string,
30
+ onProgress?: (progress: SttDownloadProgress) => void,
31
+ onExtractionProgress?: (progress: SttExtractionProgress) => void,
32
+ ]
33
+ ): Promise<void> => sttModelManager.downloadModel(...args),
20
34
  activate: (code: string) => sttModelManager.setCurrentLanguage(code),
21
35
  cancelDownload: () => sttModelManager.cancelDownload(),
22
36
  deleteModel: (...args: Parameters<typeof sttModelManager.deleteModel>) => sttModelManager.deleteModel(...args),
23
37
  /** Current auto-download status of the offline STT model. */
24
- status: () => offlineSpeechModelService.getStatus(),
38
+ status: (): OfflineModelDownloadStatus | null => offlineSpeechModelService.getStatus(),
25
39
  /** Subscribe to auto-download status changes; returns an unsubscribe. */
26
- onStatusChanged: (...args: Parameters<typeof offlineSpeechModelService.subscribe>) =>
27
- offlineSpeechModelService.subscribe(...args),
40
+ onStatusChanged: (listener: (status: OfflineModelDownloadStatus | null) => void): (() => void) =>
41
+ offlineSpeechModelService.subscribe(listener),
28
42
  },
29
43
  tts: {
30
44
  currentLanguage: () => ttsModelManager.getCurrentLanguage(),
@@ -0,0 +1,20 @@
1
+ /** Generated by release CI. Do not edit in a release checkout. */
2
+ export interface EngineReleaseMetadata {
3
+ schemaVersion: 1
4
+ familyBaseVersion: string | null
5
+ releaseIdentity: string | null
6
+ releaseSetId: string | null
7
+ sourceCommit: string | null
8
+ otaManifestUrl: string | null
9
+ otaManifestSha256: string | null
10
+ }
11
+
12
+ export const ENGINE_RELEASE_METADATA: Readonly<EngineReleaseMetadata> = Object.freeze({
13
+ "schemaVersion": 1,
14
+ "familyBaseVersion": "3.1.0",
15
+ "releaseIdentity": "3.1.0-beta.100",
16
+ "releaseSetId": "mentra-3.1.0-beta.100",
17
+ "sourceCommit": "c7c90f50ce7fd83dadc9a005e152db1d88083e4f",
18
+ "otaManifestUrl": "https://github.com/Mentra-Community/MentraOS/releases/download/mentra-builds-v3.1.0/mentra-live-ota-3.1.0-beta.100.json",
19
+ "otaManifestSha256": "7fdf5b1f75d5d07007e45c929495cd4b6800c810c94e3c60c62bda99d1c61552"
20
+ })
package/src/index.ts CHANGED
@@ -6,8 +6,7 @@
6
6
  * renders with (decision functions, sort/order helpers, policy constants,
7
7
  * capability tables, timers). Judgment rule: read models, commands, pure
8
8
  * functions and types belong here; anything that mutates runtime state or
9
- * exposes a raw store/service lives on `@mentra/engine/internal`
10
- * (migration-era surface) or `@mentra/engine/devtools` (debug-only) instead.
9
+ * exposes a raw store/service remains private to the MentraOS host.
11
10
  * See cloud-v2/docs/issues/020-glasses-status-boundary/integration-review.md §D.
12
11
  */
13
12
 
@@ -47,12 +46,7 @@ export {MENTRA_LIVE_SETTING_KEYS, getBluetoothSettingKeysForDevice} from "./stor
47
46
 
48
47
  // Runtime-shared constants and contract DTOs.
49
48
  export {ISLAND_SETTINGS_KEYS} from "./runtime/config"
50
- export type {
51
- CloudClientStatusSnapshot,
52
- MiniappAuthToken,
53
- InteropAuditEvent,
54
- TtsSynthesisResult,
55
- } from "./runtime/config"
49
+ export type {CloudClientStatusSnapshot, MiniappAuthToken, InteropAuditEvent, TtsSynthesisResult} from "./runtime/config"
56
50
 
57
51
  // Pure readiness predicates over glasses connection state.
58
52
  export {
@@ -95,6 +89,7 @@ export {
95
89
  GLOBAL_OTA_TIMEOUT_MS,
96
90
  PING_INTERVAL_MS,
97
91
  QUERY_REPLY_TIMEOUT_MS,
92
+ BES_RESTART_TIMEOUT_MS,
98
93
  OtaProgressMessages,
99
94
  } from "./services/otaInstallPolicy"
100
95
  export {deriveDisplayState} from "./services/otaDisplayState"
@@ -104,6 +99,7 @@ export type {
104
99
  OtaProgressStatus,
105
100
  OtaStatus,
106
101
  OtaUpdateInfo,
102
+ ReleaseChangelog,
107
103
  OtaSnapshot,
108
104
  OtaInstallSnapshot,
109
105
  } from "./facades/ota"
@@ -132,11 +128,19 @@ export {
132
128
  export type {GalleryNotice, GalleryNoticeCode} from "./services/asg/galleryNotices"
133
129
  export {MediaLibraryPermissions} from "./utils/permissions/MediaLibraryPermissions"
134
130
  export {deriveGalleryDisplayName} from "./utils/permissions/galleryDisplayName"
135
- export type {PhotoInfo, CaptureFile, CaptureGroup, GalleryResponse, ServerStatus, HealthResponse, GalleryEvent} from "./types/asg"
131
+ export type {
132
+ PhotoInfo,
133
+ CaptureFile,
134
+ CaptureGroup,
135
+ GalleryResponse,
136
+ ServerStatus,
137
+ HealthResponse,
138
+ GalleryEvent,
139
+ } from "./types/asg"
136
140
 
137
141
  // Bluetooth SDK event types host UI subscribes to via engine facades (the
138
142
  // BluetoothSdk singleton passthrough itself is internal).
139
- export type {PairFailureEvent, GlassesNotReadyEvent} from "@mentra/bluetooth-sdk/internal"
143
+ export type {PairFailureEvent, GlassesNotReadyEvent} from "@mentra/bluetooth-sdk"
140
144
 
141
145
  // Cloud connection status enum (read model; the connection store is internal).
142
146
  export {WebSocketStatus} from "./stores/connection"
@@ -181,7 +185,7 @@ export {
181
185
  export {HardwareCompatibility, type CompatibilityResult} from "./utils/hardware"
182
186
  export {BgTimer, throttle, debounce} from "./utils/timers"
183
187
 
184
- // Types (copied from @mentra/types — keep in sync with cloud/packages/types/src)
188
+ // Hardware types and capability profiles.
185
189
  export {
186
190
  HardwareType,
187
191
  HardwareRequirementLevel,
@@ -193,6 +197,7 @@ export {
193
197
  evenRealitiesG1,
194
198
  evenRealitiesG2,
195
199
  mentraLive,
200
+ nimo,
196
201
  vuzixZ100,
197
202
  mentraDisplay,
198
203
  } from "./types"