@glassly/bluetooth-sdk 0.1.0-dev.26

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 (548) hide show
  1. package/README.md +563 -0
  2. package/android/build.gradle +450 -0
  3. package/android/gradle.properties.example +9 -0
  4. package/android/lc3Lib/CMakeLists.txt +6 -0
  5. package/android/lc3Lib/build.gradle +212 -0
  6. package/android/lc3Lib/proguard-rules.pro +33 -0
  7. package/android/lc3Lib/src/main/AndroidManifest.xml +2 -0
  8. package/android/lc3Lib/src/main/cpp/CMakeLists.txt +8 -0
  9. package/android/lc3Lib/src/main/cpp/google_opus_stuff/CMakeLists.txt +30 -0
  10. package/android/lc3Lib/src/main/cpp/google_opus_stuff/jni/CMakeLists.txt +7 -0
  11. package/android/lc3Lib/src/main/cpp/google_opus_stuff/jni/ogg_opus_encoder.cc +96 -0
  12. package/android/lc3Lib/src/main/cpp/google_opus_stuff/jni/ogg_opus_encoder.h +53 -0
  13. package/android/lc3Lib/src/main/cpp/google_opus_stuff/libogg/Makefile.am +6 -0
  14. package/android/lc3Lib/src/main/cpp/google_opus_stuff/libogg/config_types.h +26 -0
  15. package/android/lc3Lib/src/main/cpp/google_opus_stuff/libogg/config_types.h.in +26 -0
  16. package/android/lc3Lib/src/main/cpp/google_opus_stuff/libogg/ogg.h +209 -0
  17. package/android/lc3Lib/src/main/cpp/google_opus_stuff/libogg/os_types.h +158 -0
  18. package/android/lc3Lib/src/main/cpp/google_opus_stuff/libopus/opus.h +981 -0
  19. package/android/lc3Lib/src/main/cpp/google_opus_stuff/libopus/opus_custom.h +342 -0
  20. package/android/lc3Lib/src/main/cpp/google_opus_stuff/libopus/opus_defines.h +799 -0
  21. package/android/lc3Lib/src/main/cpp/google_opus_stuff/libopus/opus_multistream.h +660 -0
  22. package/android/lc3Lib/src/main/cpp/google_opus_stuff/libopus/opus_projection.h +568 -0
  23. package/android/lc3Lib/src/main/cpp/google_opus_stuff/libopus/opus_types.h +166 -0
  24. package/android/lc3Lib/src/main/cpp/google_opus_stuff/ogg_opus_encoder.cc +268 -0
  25. package/android/lc3Lib/src/main/cpp/google_opus_stuff/ogg_opus_encoder.h +115 -0
  26. package/android/lc3Lib/src/main/cpp/google_opus_stuff/opus_tools/opus_header.h +59 -0
  27. package/android/lc3Lib/src/main/cpp/liblc3/CMakeLists.txt +38 -0
  28. package/android/lc3Lib/src/main/cpp/liblc3/include/lc3.h +309 -0
  29. package/android/lc3Lib/src/main/cpp/liblc3/include/lc3_private.h +162 -0
  30. package/android/lc3Lib/src/main/cpp/liblc3/include/rnnoise.h +114 -0
  31. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/CMakeLists.txt +19 -0
  32. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/attdet.c +92 -0
  33. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/attdet.h +44 -0
  34. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/bits.c +375 -0
  35. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/bits.h +315 -0
  36. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/bwdet.c +129 -0
  37. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/bwdet.h +69 -0
  38. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/common.h +148 -0
  39. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/energy.c +70 -0
  40. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/energy.h +43 -0
  41. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/fastmath.h +158 -0
  42. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/lc3.c +702 -0
  43. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/ltpf.c +893 -0
  44. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/ltpf.h +111 -0
  45. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/ltpf_arm.h +506 -0
  46. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/ltpf_neon.h +281 -0
  47. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/makefile.mk +35 -0
  48. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/mdct.c +452 -0
  49. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/mdct.h +57 -0
  50. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/mdct_neon.h +296 -0
  51. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/meson.build +46 -0
  52. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/plc.c +61 -0
  53. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/plc.h +57 -0
  54. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/sns.c +880 -0
  55. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/sns.h +103 -0
  56. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/spec.c +904 -0
  57. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/spec.h +119 -0
  58. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/tables.c +3457 -0
  59. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/tables.h +94 -0
  60. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/tns.c +457 -0
  61. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/tns.h +99 -0
  62. package/android/lc3Lib/src/main/cpp/liblc3/liblc3.cpp +159 -0
  63. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/_kiss_fft_guts.h +182 -0
  64. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/arch.h +261 -0
  65. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/celt_lpc.c +279 -0
  66. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/celt_lpc.h +59 -0
  67. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/common.h +48 -0
  68. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/compile.sh +3 -0
  69. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/denoise.c +646 -0
  70. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/kiss_fft.c +601 -0
  71. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/kiss_fft.h +203 -0
  72. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/opus_types.h +159 -0
  73. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/pitch.c +526 -0
  74. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/pitch.h +149 -0
  75. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/rnn.c +178 -0
  76. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/rnn.h +69 -0
  77. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/rnn_data.c +11051 -0
  78. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/rnn_data.h +34 -0
  79. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/rnn_reader.c +168 -0
  80. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/rnn_train.py +66 -0
  81. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/tansig_table.h +45 -0
  82. package/android/lc3Lib/src/main/java/com/glassly/lc3Lib/Lc3Cpp.java +38 -0
  83. package/android/lc3Lib/third_party/CMakeLists.txt +23 -0
  84. package/android/lc3Lib/third_party/CMakeLists_libogg.txt +18 -0
  85. package/android/lc3Lib/third_party/CMakeLists_libopus.txt +18 -0
  86. package/android/lc3Lib/third_party/CMakeLists_opus-tools.txt +23 -0
  87. package/android/lc3Lib/third_party/opus_tools/src/AUTHORS +5 -0
  88. package/android/lc3Lib/third_party/opus_tools/src/CMakeLists.txt +4 -0
  89. package/android/lc3Lib/third_party/opus_tools/src/COPYING +371 -0
  90. package/android/lc3Lib/third_party/opus_tools/src/ChangeLog +3 -0
  91. package/android/lc3Lib/third_party/opus_tools/src/Makefile.am +42 -0
  92. package/android/lc3Lib/third_party/opus_tools/src/Makefile.unix +23 -0
  93. package/android/lc3Lib/third_party/opus_tools/src/NEWS +0 -0
  94. package/android/lc3Lib/third_party/opus_tools/src/README +0 -0
  95. package/android/lc3Lib/third_party/opus_tools/src/autogen.sh +115 -0
  96. package/android/lc3Lib/third_party/opus_tools/src/configure.ac +293 -0
  97. package/android/lc3Lib/third_party/opus_tools/src/src/arch.h +239 -0
  98. package/android/lc3Lib/third_party/opus_tools/src/src/audio-in.c +1046 -0
  99. package/android/lc3Lib/third_party/opus_tools/src/src/diag_range.c +245 -0
  100. package/android/lc3Lib/third_party/opus_tools/src/src/diag_range.h +28 -0
  101. package/android/lc3Lib/third_party/opus_tools/src/src/info_opus.c +320 -0
  102. package/android/lc3Lib/third_party/opus_tools/src/src/info_opus.h +51 -0
  103. package/android/lc3Lib/third_party/opus_tools/src/src/lpc.c +157 -0
  104. package/android/lc3Lib/third_party/opus_tools/src/src/lpc.h +27 -0
  105. package/android/lc3Lib/third_party/opus_tools/src/src/opus_header.c +286 -0
  106. package/android/lc3Lib/third_party/opus_tools/src/src/opus_header.h +59 -0
  107. package/android/lc3Lib/third_party/opus_tools/src/src/opusdec.c +884 -0
  108. package/android/lc3Lib/third_party/opus_tools/src/src/opusenc.c +1021 -0
  109. package/android/lc3Lib/third_party/opus_tools/src/src/opusenc.h +101 -0
  110. package/android/lc3Lib/third_party/opus_tools/src/src/opusinfo.c +639 -0
  111. package/android/lc3Lib/third_party/opus_tools/src/src/opusinfo.h +51 -0
  112. package/android/lc3Lib/third_party/opus_tools/src/src/os_support.h +167 -0
  113. package/android/lc3Lib/third_party/opus_tools/src/src/resample.c +1137 -0
  114. package/android/lc3Lib/third_party/opus_tools/src/src/speex_resampler.h +344 -0
  115. package/android/lc3Lib/third_party/opus_tools/src/src/stack_alloc.h +115 -0
  116. package/android/lc3Lib/third_party/opus_tools/src/src/wav_io.c +125 -0
  117. package/android/lc3Lib/third_party/opus_tools/src/src/wav_io.h +62 -0
  118. package/android/lc3Lib/third_party/opus_tools/src/src/wave_out.c +223 -0
  119. package/android/lc3Lib/third_party/opus_tools/src/src/wave_out.h +60 -0
  120. package/android/settings.gradle +4 -0
  121. package/android/silero/LICENSE.md +17 -0
  122. package/android/silero/build.gradle +50 -0
  123. package/android/silero/proguard-rules.pro +24 -0
  124. package/android/silero/src/androidTest/assets/hello.wav +0 -0
  125. package/android/silero/src/androidTest/java/com/konovalov/vad/silero/VadSileroTest.kt +79 -0
  126. package/android/silero/src/main/assets/LICENSE +21 -0
  127. package/android/silero/src/main/assets/silero_vad.onnx +0 -0
  128. package/android/silero/src/main/java/com/konovalov/vad/silero/Vad.kt +160 -0
  129. package/android/silero/src/main/java/com/konovalov/vad/silero/VadSilero.kt +449 -0
  130. package/android/silero/src/main/java/com/konovalov/vad/silero/config/FrameSize.kt +15 -0
  131. package/android/silero/src/main/java/com/konovalov/vad/silero/config/Mode.kt +14 -0
  132. package/android/silero/src/main/java/com/konovalov/vad/silero/config/SampleRate.kt +12 -0
  133. package/android/silero/src/main/java/com/konovalov/vad/silero/utils/AudioUtils.kt +47 -0
  134. package/android/silero/src/main/java/com/konovalov/vad/silero/utils/TensorMap.kt +41 -0
  135. package/android/silero/src/test/java/com/konovalov/vad/silero/utils/AudioUtilsTest.kt +44 -0
  136. package/android/src/main/AndroidManifest.xml +42 -0
  137. package/android/src/main/assets/G2Firmware/README.md +11 -0
  138. package/android/src/main/java/com/glassly/bluetoothsdk/BluetoothSdk.kt +2325 -0
  139. package/android/src/main/java/com/glassly/bluetoothsdk/BluetoothSdkAnalytics.kt +216 -0
  140. package/android/src/main/java/com/glassly/bluetoothsdk/BluetoothSdkDebug.kt +14 -0
  141. package/android/src/main/java/com/glassly/bluetoothsdk/BluetoothSdkDefaults.kt +7 -0
  142. package/android/src/main/java/com/glassly/bluetoothsdk/BluetoothSdkModule.kt +1088 -0
  143. package/android/src/main/java/com/glassly/bluetoothsdk/Bridge.kt +953 -0
  144. package/android/src/main/java/com/glassly/bluetoothsdk/DeviceManager.kt +2528 -0
  145. package/android/src/main/java/com/glassly/bluetoothsdk/DeviceStore.kt +360 -0
  146. package/android/src/main/java/com/glassly/bluetoothsdk/GeneratedChangelogCatalog.kt +8 -0
  147. package/android/src/main/java/com/glassly/bluetoothsdk/GeneratedReleaseMetadata.kt +11 -0
  148. package/android/src/main/java/com/glassly/bluetoothsdk/LocalNetworkModule.kt +414 -0
  149. package/android/src/main/java/com/glassly/bluetoothsdk/ObservableStore.kt +88 -0
  150. package/android/src/main/java/com/glassly/bluetoothsdk/OtaManifest.kt +191 -0
  151. package/android/src/main/java/com/glassly/bluetoothsdk/ReleaseChangelog.kt +61 -0
  152. package/android/src/main/java/com/glassly/bluetoothsdk/ScopedNetworkReadiness.kt +17 -0
  153. package/android/src/main/java/com/glassly/bluetoothsdk/audio/AudioModels.kt +144 -0
  154. package/android/src/main/java/com/glassly/bluetoothsdk/camera/CameraModels.kt +486 -0
  155. package/android/src/main/java/com/glassly/bluetoothsdk/connection/ConnectionModels.kt +78 -0
  156. package/android/src/main/java/com/glassly/bluetoothsdk/controllers/ControllerManager.kt +158 -0
  157. package/android/src/main/java/com/glassly/bluetoothsdk/controllers/R1.kt +937 -0
  158. package/android/src/main/java/com/glassly/bluetoothsdk/debug/BleTraceLogger.kt +165 -0
  159. package/android/src/main/java/com/glassly/bluetoothsdk/events/BluetoothEvents.kt +178 -0
  160. package/android/src/main/java/com/glassly/bluetoothsdk/internal/MapParsing.kt +140 -0
  161. package/android/src/main/java/com/glassly/bluetoothsdk/net/LocalIpv4.kt +57 -0
  162. package/android/src/main/java/com/glassly/bluetoothsdk/otaserver/LocalOtaServer.kt +304 -0
  163. package/android/src/main/java/com/glassly/bluetoothsdk/otaserver/OtaServerModule.kt +120 -0
  164. package/android/src/main/java/com/glassly/bluetoothsdk/photoreceiver/LocalPhotoReceiverRegistry.java +108 -0
  165. package/android/src/main/java/com/glassly/bluetoothsdk/photoreceiver/LocalPhotoUploadServer.kt +622 -0
  166. package/android/src/main/java/com/glassly/bluetoothsdk/photoreceiver/PhotoReceiverModule.kt +156 -0
  167. package/android/src/main/java/com/glassly/bluetoothsdk/requests/DisplayRequests.kt +56 -0
  168. package/android/src/main/java/com/glassly/bluetoothsdk/services/Foreground.kt +272 -0
  169. package/android/src/main/java/com/glassly/bluetoothsdk/services/PhoneMic.kt +1195 -0
  170. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/Ar99.java +2653 -0
  171. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/BesOtaHeartbeatGuard.kt +49 -0
  172. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/BesOtaProgressMapper.kt +27 -0
  173. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/G1.kt +3878 -0
  174. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/G1TextSanitizer.kt +38 -0
  175. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/G2.kt +6428 -0
  176. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/G2CfwClassification.kt +49 -0
  177. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/G2CfwRenderer.kt +1241 -0
  178. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/G2CfwTextureCache.kt +270 -0
  179. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/G2FlashProtocol.kt +291 -0
  180. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/G2Flasher.kt +411 -0
  181. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/GlasslyBle.java +43189 -0
  182. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/Mach1.kt +1280 -0
  183. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/MentraLive.kt +10817 -0
  184. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/MentraLiveL2capChannel.kt +274 -0
  185. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/MentraLivePairingAdvertisement.kt +54 -0
  186. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/MentraNex.kt +2011 -0
  187. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/Nimo.kt +2532 -0
  188. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/SGCManager.kt +470 -0
  189. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/Simulated.kt +228 -0
  190. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/ar99/ota/Ar99OtaManager.java +566 -0
  191. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/ar99/ota/OtaByteUtils.java +18 -0
  192. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/ar99/ota/OtaCommandConstants.java +35 -0
  193. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/ar99/ota/OtaCrc32Util.java +13 -0
  194. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/ar99/ota/OtaGattTransport.java +11 -0
  195. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/ar99/ota/OtaProtocol.java +92 -0
  196. package/android/src/main/java/com/glassly/bluetoothsdk/speakerid/SpeakerIdEngine.kt +525 -0
  197. package/android/src/main/java/com/glassly/bluetoothsdk/status/DeviceStatus.kt +669 -0
  198. package/android/src/main/java/com/glassly/bluetoothsdk/status/RuntimeState.kt +201 -0
  199. package/android/src/main/java/com/glassly/bluetoothsdk/status/WifiHotspotStatus.kt +189 -0
  200. package/android/src/main/java/com/glassly/bluetoothsdk/streaming/StreamModels.kt +518 -0
  201. package/android/src/main/java/com/glassly/bluetoothsdk/stt/STTTools.kt +391 -0
  202. package/android/src/main/java/com/glassly/bluetoothsdk/stt/SherpaOnnxTranscriber.kt +518 -0
  203. package/android/src/main/java/com/glassly/bluetoothsdk/stt/VadGateSpeechPolicy.kt +229 -0
  204. package/android/src/main/java/com/glassly/bluetoothsdk/tts/TTSTools.kt +248 -0
  205. package/android/src/main/java/com/glassly/bluetoothsdk/types/DeviceModels.kt +96 -0
  206. package/android/src/main/java/com/glassly/bluetoothsdk/utils/AES.java +106 -0
  207. package/android/src/main/java/com/glassly/bluetoothsdk/utils/AudioSessionMonitor.kt +189 -0
  208. package/android/src/main/java/com/glassly/bluetoothsdk/utils/AvifExifStripper.java +573 -0
  209. package/android/src/main/java/com/glassly/bluetoothsdk/utils/BitmapJavaUtils.java +169 -0
  210. package/android/src/main/java/com/glassly/bluetoothsdk/utils/BleJsonCompact.java +496 -0
  211. package/android/src/main/java/com/glassly/bluetoothsdk/utils/BlePhotoUploadService.java +677 -0
  212. package/android/src/main/java/com/glassly/bluetoothsdk/utils/BleWireProtocol.java +108 -0
  213. package/android/src/main/java/com/glassly/bluetoothsdk/utils/Constants.kt +46 -0
  214. package/android/src/main/java/com/glassly/bluetoothsdk/utils/G1Text.kt +436 -0
  215. package/android/src/main/java/com/glassly/bluetoothsdk/utils/HeifExifTagReader.java +199 -0
  216. package/android/src/main/java/com/glassly/bluetoothsdk/utils/IncidentLogBleRelayNaming.java +29 -0
  217. package/android/src/main/java/com/glassly/bluetoothsdk/utils/IncidentLogBleUploadService.java +77 -0
  218. package/android/src/main/java/com/glassly/bluetoothsdk/utils/K900LengthCodec.java +115 -0
  219. package/android/src/main/java/com/glassly/bluetoothsdk/utils/K900ProtocolUtils.java +827 -0
  220. package/android/src/main/java/com/glassly/bluetoothsdk/utils/MessageChunkReassembler.java +228 -0
  221. package/android/src/main/java/com/glassly/bluetoothsdk/utils/MessageChunker.java +325 -0
  222. package/android/src/main/java/com/glassly/bluetoothsdk/utils/NexSGCUtils.kt +698 -0
  223. package/android/src/main/java/com/glassly/bluetoothsdk/utils/PhoneAudioMonitor.kt +348 -0
  224. package/android/src/main/java/com/glassly/bluetoothsdk/utils/SmartGlassesConnectionState.java +9 -0
  225. package/android/src/main/java/com/glassly/bluetoothsdk/utils/audio/Ar99OpusPcmDecoder.java +398 -0
  226. package/android/src/main/java/com/glassly/bluetoothsdk/utils/audio/ByteUtilAudioPlayer.java +655 -0
  227. package/android/src/main/java/com/glassly/bluetoothsdk/utils/audio/Lc3Player.java +441 -0
  228. package/android/src/main/java/com/glassly/bluetoothsdk/utils/audio/PCMAudioPlayer.java +431 -0
  229. package/android/src/main/java/com/glassly/bluetoothsdk/utils/audio/PcmStreamPlayer.kt +328 -0
  230. package/android/src/main/res/values/strings.xml +4 -0
  231. package/android/src/test/java/com/glassly/bluetoothsdk/BluetoothSdkExceptionTest.kt +18 -0
  232. package/android/src/test/java/com/glassly/bluetoothsdk/OtaManifestDowngradeTest.kt +86 -0
  233. package/android/src/test/java/com/glassly/bluetoothsdk/OtaStartResponsePolicyTest.kt +30 -0
  234. package/android/src/test/java/com/glassly/bluetoothsdk/ReleaseChangelogTest.kt +13 -0
  235. package/android/src/test/java/com/glassly/bluetoothsdk/ScopedNetworkReadinessTest.kt +39 -0
  236. package/android/src/test/java/com/glassly/bluetoothsdk/StreamStatusEventTest.kt +29 -0
  237. package/android/src/test/java/com/glassly/bluetoothsdk/camera/PhotoRequestTest.kt +141 -0
  238. package/android/src/test/java/com/glassly/bluetoothsdk/otaserver/LocalOtaServerTest.kt +82 -0
  239. package/android/src/test/java/com/glassly/bluetoothsdk/photoreceiver/LocalPhotoReceiverRegistryTest.java +75 -0
  240. package/android/src/test/java/com/glassly/bluetoothsdk/services/ForegroundServiceTypeTest.kt +69 -0
  241. package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/Ar99AdvertisementMatcherTest.java +22 -0
  242. package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/BesOtaHeartbeatGuardTest.kt +73 -0
  243. package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/BesOtaProgressMapperTest.kt +67 -0
  244. package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/EvenRleTest.kt +63 -0
  245. package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/G1TextSanitizerTest.kt +31 -0
  246. package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/G2CfwClassificationTest.kt +89 -0
  247. package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/G2CfwRendererTest.kt +344 -0
  248. package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/G2CfwTextureCacheTest.kt +200 -0
  249. package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/G2FlashProtocolTest.kt +131 -0
  250. package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/MentraLiveGattCharacteristicsTest.kt +39 -0
  251. package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/MentraLivePairingAdvertisementParserTest.kt +133 -0
  252. package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/NimoProtocolTest.kt +333 -0
  253. package/android/src/test/java/com/glassly/bluetoothsdk/utils/AvifExifStripperTest.java +46 -0
  254. package/android/src/test/java/com/glassly/bluetoothsdk/utils/BinaryMessageChunkerTest.java +84 -0
  255. package/android/src/test/java/com/glassly/bluetoothsdk/utils/BleJsonCompactTest.java +319 -0
  256. package/android/src/test/java/com/glassly/bluetoothsdk/utils/BlePhotoUploadServiceTest.java +107 -0
  257. package/android/src/test/java/com/glassly/bluetoothsdk/utils/K900ProtocolUtilsEndiannessTest.java +172 -0
  258. package/android/src/test/java/com/glassly/bluetoothsdk/utils/K900ProtocolUtilsTest.java +24 -0
  259. package/android/src/test/java/com/glassly/bluetoothsdk/utils/PhoneAudioMonitorTest.kt +45 -0
  260. package/android/src/test/resources/avif_with_exif.avif +0 -0
  261. package/app.plugin.js +3 -0
  262. package/build/BluetoothSdk.types.d.ts +1354 -0
  263. package/build/BluetoothSdk.types.d.ts.map +1 -0
  264. package/build/BluetoothSdk.types.js +41 -0
  265. package/build/BluetoothSdk.types.js.map +1 -0
  266. package/build/_internal.d.ts +17 -0
  267. package/build/_internal.d.ts.map +1 -0
  268. package/build/_internal.js +16 -0
  269. package/build/_internal.js.map +1 -0
  270. package/build/_private/BluetoothSdkModule.d.ts +172 -0
  271. package/build/_private/BluetoothSdkModule.d.ts.map +1 -0
  272. package/build/_private/BluetoothSdkModule.js +300 -0
  273. package/build/_private/BluetoothSdkModule.js.map +1 -0
  274. package/build/_private/LocalNetworkModule.d.ts +38 -0
  275. package/build/_private/LocalNetworkModule.d.ts.map +1 -0
  276. package/build/_private/LocalNetworkModule.js +3 -0
  277. package/build/_private/LocalNetworkModule.js.map +1 -0
  278. package/build/_private/cameraRequestPayload.d.ts +4 -0
  279. package/build/_private/cameraRequestPayload.d.ts.map +1 -0
  280. package/build/_private/cameraRequestPayload.js +32 -0
  281. package/build/_private/cameraRequestPayload.js.map +1 -0
  282. package/build/_private/photoRequestPayload.d.ts +6 -0
  283. package/build/_private/photoRequestPayload.d.ts.map +1 -0
  284. package/build/_private/photoRequestPayload.js +86 -0
  285. package/build/_private/photoRequestPayload.js.map +1 -0
  286. package/build/_private/sdkOtaManifest.d.ts +11 -0
  287. package/build/_private/sdkOtaManifest.d.ts.map +1 -0
  288. package/build/_private/sdkOtaManifest.js +15 -0
  289. package/build/_private/sdkOtaManifest.js.map +1 -0
  290. package/build/changelogs.d.ts +7 -0
  291. package/build/changelogs.d.ts.map +1 -0
  292. package/build/changelogs.js +46 -0
  293. package/build/changelogs.js.map +1 -0
  294. package/build/debug.d.ts +3 -0
  295. package/build/debug.d.ts.map +1 -0
  296. package/build/debug.js +8 -0
  297. package/build/debug.js.map +1 -0
  298. package/build/generated/changelogCatalog.d.ts +9 -0
  299. package/build/generated/changelogCatalog.d.ts.map +1 -0
  300. package/build/generated/changelogCatalog.js +12 -0
  301. package/build/generated/changelogCatalog.js.map +1 -0
  302. package/build/generated/releaseMetadata.d.ts +12 -0
  303. package/build/generated/releaseMetadata.d.ts.map +1 -0
  304. package/build/generated/releaseMetadata.js +10 -0
  305. package/build/generated/releaseMetadata.js.map +1 -0
  306. package/build/index.d.ts +6 -0
  307. package/build/index.d.ts.map +1 -0
  308. package/build/index.js +171 -0
  309. package/build/index.js.map +1 -0
  310. package/build/ota-server/OtaServer.types.d.ts +14 -0
  311. package/build/ota-server/OtaServer.types.d.ts.map +1 -0
  312. package/build/ota-server/OtaServer.types.js +2 -0
  313. package/build/ota-server/OtaServer.types.js.map +1 -0
  314. package/build/ota-server/OtaServerModule.d.ts +21 -0
  315. package/build/ota-server/OtaServerModule.d.ts.map +1 -0
  316. package/build/ota-server/OtaServerModule.js +3 -0
  317. package/build/ota-server/OtaServerModule.js.map +1 -0
  318. package/build/ota-server/OtaServerModule.web.d.ts +10 -0
  319. package/build/ota-server/OtaServerModule.web.d.ts.map +1 -0
  320. package/build/ota-server/OtaServerModule.web.js +12 -0
  321. package/build/ota-server/OtaServerModule.web.js.map +1 -0
  322. package/build/ota-server/index.d.ts +3 -0
  323. package/build/ota-server/index.d.ts.map +1 -0
  324. package/build/ota-server/index.js +3 -0
  325. package/build/ota-server/index.js.map +1 -0
  326. package/build/ota-transport/index.d.ts +67 -0
  327. package/build/ota-transport/index.d.ts.map +1 -0
  328. package/build/ota-transport/index.js +58 -0
  329. package/build/ota-transport/index.js.map +1 -0
  330. package/build/photo-receiver/PhotoReceiver.types.d.ts +18 -0
  331. package/build/photo-receiver/PhotoReceiver.types.d.ts.map +1 -0
  332. package/build/photo-receiver/PhotoReceiver.types.js +2 -0
  333. package/build/photo-receiver/PhotoReceiver.types.js.map +1 -0
  334. package/build/photo-receiver/PhotoReceiverModule.d.ts +10 -0
  335. package/build/photo-receiver/PhotoReceiverModule.d.ts.map +1 -0
  336. package/build/photo-receiver/PhotoReceiverModule.js +3 -0
  337. package/build/photo-receiver/PhotoReceiverModule.js.map +1 -0
  338. package/build/photo-receiver/PhotoReceiverModule.web.d.ts +10 -0
  339. package/build/photo-receiver/PhotoReceiverModule.web.d.ts.map +1 -0
  340. package/build/photo-receiver/PhotoReceiverModule.web.js +12 -0
  341. package/build/photo-receiver/PhotoReceiverModule.web.js.map +1 -0
  342. package/build/photo-receiver/index.d.ts +3 -0
  343. package/build/photo-receiver/index.d.ts.map +1 -0
  344. package/build/photo-receiver/index.js +3 -0
  345. package/build/photo-receiver/index.js.map +1 -0
  346. package/build/react/index.d.ts +5 -0
  347. package/build/react/index.d.ts.map +1 -0
  348. package/build/react/index.js +4 -0
  349. package/build/react/index.js.map +1 -0
  350. package/build/react/useBluetooth.d.ts +100 -0
  351. package/build/react/useBluetooth.d.ts.map +1 -0
  352. package/build/react/useBluetooth.js +167 -0
  353. package/build/react/useBluetooth.js.map +1 -0
  354. package/build/react/useBluetoothEvent.d.ts +6 -0
  355. package/build/react/useBluetoothEvent.d.ts.map +1 -0
  356. package/build/react/useBluetoothEvent.js +21 -0
  357. package/build/react/useBluetoothEvent.js.map +1 -0
  358. package/build/react/useBluetoothScan.d.ts +22 -0
  359. package/build/react/useBluetoothScan.d.ts.map +1 -0
  360. package/build/react/useBluetoothScan.js +135 -0
  361. package/build/react/useBluetoothScan.js.map +1 -0
  362. package/build/react/useBluetoothStatus.d.ts +16 -0
  363. package/build/react/useBluetoothStatus.d.ts.map +1 -0
  364. package/build/react/useBluetoothStatus.js +137 -0
  365. package/build/react/useBluetoothStatus.js.map +1 -0
  366. package/build/react/useGlassesConnection.d.ts +29 -0
  367. package/build/react/useGlassesConnection.d.ts.map +1 -0
  368. package/build/react/useGlassesConnection.js +153 -0
  369. package/build/react/useGlassesConnection.js.map +1 -0
  370. package/build/types/index.d.ts +3 -0
  371. package/build/types/index.d.ts.map +1 -0
  372. package/build/types/index.js +2 -0
  373. package/build/types/index.js.map +1 -0
  374. package/expo-module.config.json +14 -0
  375. package/ios/BackgroundOtaArtifactDownloader.swift +125 -0
  376. package/ios/BluetoothSdkModule.swift +1034 -0
  377. package/ios/GlasslyBluetoothSDK.podspec +106 -0
  378. package/ios/LocalIPv4.swift +150 -0
  379. package/ios/LocalOtaServer.swift +309 -0
  380. package/ios/LocalPhotoUploadServer.swift +754 -0
  381. package/ios/OtaServerModule.swift +147 -0
  382. package/ios/Packages/CoreObjC/CoreObjC.xcodeproj/project.pbxproj +213 -0
  383. package/ios/Packages/CoreObjC/PcmConverter.h +22 -0
  384. package/ios/Packages/CoreObjC/PcmConverter.m +266 -0
  385. package/ios/Packages/CoreObjC/attdet.c +92 -0
  386. package/ios/Packages/CoreObjC/attdet.h +44 -0
  387. package/ios/Packages/CoreObjC/bits.c +375 -0
  388. package/ios/Packages/CoreObjC/bits.h +315 -0
  389. package/ios/Packages/CoreObjC/bwdet.c +129 -0
  390. package/ios/Packages/CoreObjC/bwdet.h +69 -0
  391. package/ios/Packages/CoreObjC/common.h +151 -0
  392. package/ios/Packages/CoreObjC/energy.c +70 -0
  393. package/ios/Packages/CoreObjC/energy.h +43 -0
  394. package/ios/Packages/CoreObjC/fastmath.h +158 -0
  395. package/ios/Packages/CoreObjC/include/PcmConverter.h +22 -0
  396. package/ios/Packages/CoreObjC/lc3.c +704 -0
  397. package/ios/Packages/CoreObjC/lc3.h +313 -0
  398. package/ios/Packages/CoreObjC/lc3_cpp.h +283 -0
  399. package/ios/Packages/CoreObjC/lc3_private.h +163 -0
  400. package/ios/Packages/CoreObjC/ltpf.c +905 -0
  401. package/ios/Packages/CoreObjC/ltpf.h +111 -0
  402. package/ios/Packages/CoreObjC/ltpf_arm.h +506 -0
  403. package/ios/Packages/CoreObjC/ltpf_neon.h +281 -0
  404. package/ios/Packages/CoreObjC/makefile.mk +35 -0
  405. package/ios/Packages/CoreObjC/mdct.c +469 -0
  406. package/ios/Packages/CoreObjC/mdct.h +57 -0
  407. package/ios/Packages/CoreObjC/mdct_neon.h +296 -0
  408. package/ios/Packages/CoreObjC/meson.build +61 -0
  409. package/ios/Packages/CoreObjC/plc.c +61 -0
  410. package/ios/Packages/CoreObjC/plc.h +57 -0
  411. package/ios/Packages/CoreObjC/rnnoise.h +114 -0
  412. package/ios/Packages/CoreObjC/sns.c +880 -0
  413. package/ios/Packages/CoreObjC/sns.h +103 -0
  414. package/ios/Packages/CoreObjC/spec.c +907 -0
  415. package/ios/Packages/CoreObjC/spec.h +119 -0
  416. package/ios/Packages/CoreObjC/tables.c +3457 -0
  417. package/ios/Packages/CoreObjC/tables.h +94 -0
  418. package/ios/Packages/CoreObjC/tns.c +457 -0
  419. package/ios/Packages/CoreObjC/tns.h +99 -0
  420. package/ios/Packages/SherpaOnnx/Model/joiner.onnx +0 -0
  421. package/ios/Packages/SherpaOnnx/Model/tokens.txt +502 -0
  422. package/ios/Packages/SherpaOnnx/SherpaOnnx.swift +2383 -0
  423. package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/Info.plist +48 -0
  424. package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/ios-arm64/Headers/sherpa-onnx/c-api/c-api.h +4689 -0
  425. package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/ios-arm64/Headers/sherpa-onnx/c-api/cxx-api.h +2036 -0
  426. package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/ios-arm64/libsherpa-onnx.a +0 -0
  427. package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/ios-arm64_x86_64-simulator/Headers/sherpa-onnx/c-api/c-api.h +4689 -0
  428. package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/ios-arm64_x86_64-simulator/Headers/sherpa-onnx/c-api/cxx-api.h +2036 -0
  429. package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/ios-arm64_x86_64-simulator/libsherpa-onnx.a +0 -0
  430. package/ios/Packages/libbz2/module.modulemap +5 -0
  431. package/ios/Packages/libbz2/shim.h +1 -0
  432. package/ios/PhotoReceiverModule.swift +129 -0
  433. package/ios/Source/BluetoothSDK.swift +2303 -0
  434. package/ios/Source/BluetoothSDKDebug.swift +12 -0
  435. package/ios/Source/BluetoothSdkDefaults.swift +29 -0
  436. package/ios/Source/Bridge.swift +708 -0
  437. package/ios/Source/Bridging-Header.h +16 -0
  438. package/ios/Source/DeviceManager.swift +2109 -0
  439. package/ios/Source/DeviceStore.swift +336 -0
  440. package/ios/Source/GeneratedChangelogCatalog.swift +7 -0
  441. package/ios/Source/GeneratedReleaseMetadata.swift +11 -0
  442. package/ios/Source/ObservableStore.swift +118 -0
  443. package/ios/Source/OtaManifest.swift +211 -0
  444. package/ios/Source/PrivacyInfo.xcprivacy +23 -0
  445. package/ios/Source/ReleaseChangelog.swift +65 -0
  446. package/ios/Source/Resources/G2Firmware/README.md +10 -0
  447. package/ios/Source/audio/AudioModels.swift +178 -0
  448. package/ios/Source/audio/PcmStreamPlayer.swift +410 -0
  449. package/ios/Source/camera/CameraModels.swift +866 -0
  450. package/ios/Source/connection/ScanSession.swift +27 -0
  451. package/ios/Source/controllers/ControllerManager.swift +184 -0
  452. package/ios/Source/controllers/R1.swift +829 -0
  453. package/ios/Source/errors/BluetoothSdkError.swift +19 -0
  454. package/ios/Source/events/BluetoothEvents.swift +342 -0
  455. package/ios/Source/internal/BleTraceLogger.swift +192 -0
  456. package/ios/Source/internal/BluetoothAvailability.swift +78 -0
  457. package/ios/Source/internal/BluetoothSdkAnalytics.swift +199 -0
  458. package/ios/Source/internal/ValueParsing.swift +99 -0
  459. package/ios/Source/requests/DisplayRequests.swift +82 -0
  460. package/ios/Source/services/PhoneMic.swift +662 -0
  461. package/ios/Source/sgcs/Ar99.swift +2451 -0
  462. package/ios/Source/sgcs/Frame.swift +649 -0
  463. package/ios/Source/sgcs/G1.swift +2554 -0
  464. package/ios/Source/sgcs/G2.swift +6887 -0
  465. package/ios/Source/sgcs/G2CfwClassification.swift +43 -0
  466. package/ios/Source/sgcs/G2CfwRenderer.swift +1279 -0
  467. package/ios/Source/sgcs/G2CfwTextureCache.swift +233 -0
  468. package/ios/Source/sgcs/G2FlashProtocol.swift +312 -0
  469. package/ios/Source/sgcs/G2Flasher.swift +773 -0
  470. package/ios/Source/sgcs/Mach1.swift +541 -0
  471. package/ios/Source/sgcs/MentraLive.swift +7011 -0
  472. package/ios/Source/sgcs/MentraLiveL2capChannel.swift +183 -0
  473. package/ios/Source/sgcs/MentraLivePairingAdvertisement.swift +64 -0
  474. package/ios/Source/sgcs/MentraNex.swift +3221 -0
  475. package/ios/Source/sgcs/Nimo.swift +1886 -0
  476. package/ios/Source/sgcs/SGCManager.swift +608 -0
  477. package/ios/Source/sgcs/Simulated.swift +274 -0
  478. package/ios/Source/sgcs/ar99/ota/Ar99OtaManager.swift +637 -0
  479. package/ios/Source/sgcs/glassly_ble.pb.swift +4354 -0
  480. package/ios/Source/speakerid/SpeakerIdEngine.swift +573 -0
  481. package/ios/Source/status/DeviceStatus.swift +981 -0
  482. package/ios/Source/status/RuntimeState.swift +359 -0
  483. package/ios/Source/status/WifiHotspotStatus.swift +345 -0
  484. package/ios/Source/streaming/StreamModels.swift +693 -0
  485. package/ios/Source/stt/STTTools.swift +191 -0
  486. package/ios/Source/stt/SherpaOnnxTranscriber.swift +466 -0
  487. package/ios/Source/tts/TTSTools.swift +171 -0
  488. package/ios/Source/types/DeviceModels.swift +177 -0
  489. package/ios/Source/utils/AudioSessionMonitor.swift +283 -0
  490. package/ios/Source/utils/BinaryCodec.swift +61 -0
  491. package/ios/Source/utils/BleJsonCompact.swift +405 -0
  492. package/ios/Source/utils/BleWireProtocol.swift +92 -0
  493. package/ios/Source/utils/Constants.swift +78 -0
  494. package/ios/Source/utils/Enums.swift +95 -0
  495. package/ios/Source/utils/G1Text.swift +2096 -0
  496. package/ios/Source/utils/JSCExperiment.swift +241 -0
  497. package/ios/Source/utils/MemoryMonitor.swift +44 -0
  498. package/ios/Source/utils/MessageChunkReassembler.swift +190 -0
  499. package/ios/Source/utils/MessageChunker.swift +294 -0
  500. package/ios/Source/utils/Models.swift +135 -0
  501. package/ios/Source/utils/PhoneAudioMonitor.swift +230 -0
  502. package/ios/Source/utils/TarBz2Extractor.swift +257 -0
  503. package/ios/Tests/BluetoothSDKTests/G2CfwClassificationTests.swift +78 -0
  504. package/ios/Tests/BluetoothSDKTests/G2CfwRendererTests.swift +372 -0
  505. package/ios/Tests/BluetoothSDKTests/G2CfwTextureCacheTests.swift +162 -0
  506. package/ios/Tests/BluetoothSDKTests/G2FlashProtocolTests.swift +182 -0
  507. package/ios/Tests/MentraLivePairingAdvertisementTests.swift +160 -0
  508. package/ios/Tests/ReleaseChangelogTests.swift +13 -0
  509. package/package.json +129 -0
  510. package/plugin/build/index.d.ts +10 -0
  511. package/plugin/build/index.js +12 -0
  512. package/plugin/build/withAndroid.d.ts +3 -0
  513. package/plugin/build/withAndroid.js +190 -0
  514. package/plugin/build/withIos.d.ts +5 -0
  515. package/plugin/build/withIos.js +108 -0
  516. package/scripts/inject-ios-sdk-version.mjs +65 -0
  517. package/scripts/public-ota-api.test.mjs +37 -0
  518. package/scripts/verify-release-package.mjs +45 -0
  519. package/scripts/write-release-metadata.mjs +152 -0
  520. package/scripts/write-release-metadata.test.mjs +37 -0
  521. package/src/BluetoothSdk.types.ts +1623 -0
  522. package/src/_internal.ts +16 -0
  523. package/src/_private/BluetoothSdkModule.ts +684 -0
  524. package/src/_private/LocalNetworkModule.ts +50 -0
  525. package/src/_private/cameraRequestPayload.ts +34 -0
  526. package/src/_private/photoRequestPayload.ts +90 -0
  527. package/src/_private/sdkOtaManifest.ts +18 -0
  528. package/src/changelogs.ts +46 -0
  529. package/src/debug.ts +9 -0
  530. package/src/generated/changelogCatalog.ts +13 -0
  531. package/src/generated/releaseMetadata.ts +20 -0
  532. package/src/index.ts +321 -0
  533. package/src/ota-server/OtaServer.types.ts +10 -0
  534. package/src/ota-server/OtaServerModule.ts +23 -0
  535. package/src/ota-server/OtaServerModule.web.ts +17 -0
  536. package/src/ota-server/index.ts +2 -0
  537. package/src/ota-transport/index.ts +116 -0
  538. package/src/photo-receiver/PhotoReceiver.types.ts +20 -0
  539. package/src/photo-receiver/PhotoReceiverModule.ts +11 -0
  540. package/src/photo-receiver/PhotoReceiverModule.web.ts +17 -0
  541. package/src/photo-receiver/index.ts +2 -0
  542. package/src/react/index.ts +21 -0
  543. package/src/react/useBluetooth.ts +309 -0
  544. package/src/react/useBluetoothEvent.ts +35 -0
  545. package/src/react/useBluetoothScan.ts +173 -0
  546. package/src/react/useBluetoothStatus.ts +180 -0
  547. package/src/react/useGlassesConnection.ts +202 -0
  548. package/src/types/index.ts +12 -0
@@ -0,0 +1,1623 @@
1
+ // Bluetooth SDK Event Types
2
+ export type GlassesNotReadyEvent = {
3
+ type: "glasses_not_ready"
4
+ message: string
5
+ }
6
+
7
+ export type G2FirmwareTarget = "stock" | "glassly-cfw"
8
+
9
+ export type G2FirmwareArtifact = {
10
+ id: G2FirmwareTarget
11
+ displayName: string
12
+ version: string
13
+ fileName: string
14
+ sha256: string
15
+ size: number
16
+ }
17
+
18
+ export type G2FirmwareFlashProgressEvent = {
19
+ type: "g2_firmware_flash_progress"
20
+ message: string
21
+ progress: number
22
+ done: boolean
23
+ ok: boolean
24
+ }
25
+
26
+ export type G2FirmwareFlashResult = {
27
+ ok: boolean
28
+ target: G2FirmwareTarget
29
+ version: string
30
+ sha256: string
31
+ }
32
+
33
+ // NOTE: unlike most events below, the native module does NOT include a `type`
34
+ // field on the button_press payload 闂?it sends only {buttonId, pressType,
35
+ // timestamp} (see BluetoothSdkModule on both iOS and Android). Consumers must
36
+ // filter on `pressType` / the "button_press" listener name, never `event.type`.
37
+ export type ButtonPressEvent = {
38
+ buttonId: string
39
+ pressType: "long" | "short"
40
+ timestamp: number
41
+ }
42
+
43
+ export type TouchEvent = {
44
+ type: "touch_event"
45
+ deviceModel: DeviceModel
46
+ gestureName: string
47
+ timestamp: number
48
+ }
49
+
50
+ export type AccelEvent = {
51
+ type: "accel_event"
52
+ x: number
53
+ y: number
54
+ z: number
55
+ timestamp: number
56
+ }
57
+
58
+ export type HeadUpEvent = {
59
+ up: boolean
60
+ }
61
+
62
+ /**
63
+ * Glasses magnetometer heading, streamed while the native navigation mode is
64
+ * active (G2 service 0x08). Degrees 0…359, 0 = magnetic north.
65
+ */
66
+ export type CompassHeadingEvent = {
67
+ type: "compass_heading"
68
+ heading: number
69
+ timestamp: number
70
+ }
71
+
72
+ /** Magnetometer calibration prompts — the wearer should look around / figure-8. */
73
+ export type CompassCalibrationEvent = {
74
+ type: "compass_calibration"
75
+ status: "start" | "complete"
76
+ }
77
+
78
+ /**
79
+ * Native navigation mode lifecycle. `source: "glasses"` means the wearer (or
80
+ * firmware) exited the nav UI on the device itself, not the phone.
81
+ */
82
+ export type NavigationModeEvent = {
83
+ type: "navigation_mode_change"
84
+ status: "entered" | "exited"
85
+ source?: string
86
+ }
87
+
88
+ /** Wearer toggled the mini-map / overview review view on the glasses. */
89
+ export type NavigationViewEvent = {
90
+ type: "navigation_view_change"
91
+ viewIndex: number
92
+ }
93
+
94
+ export type VoiceActivityDetectionStatusEvent = {
95
+ type: "voice_activity_detection_status"
96
+ voiceActivityDetectionEnabled: boolean
97
+ }
98
+
99
+ export const DEFAULT_VOICE_ACTIVITY_DETECTION_ENABLED = false
100
+
101
+ export type SpeakingStatusEvent = {
102
+ type: "speaking_status"
103
+ speaking: boolean
104
+ timestamp: number
105
+ }
106
+
107
+ export type BatteryStatusEvent = {
108
+ type: "battery_status"
109
+ level: number
110
+ charging: boolean
111
+ timestamp: number
112
+ }
113
+
114
+ export type GlassesConnectionStatus =
115
+ | {state: "disconnected"}
116
+ | {state: "scanning"}
117
+ | {state: "connecting"}
118
+ | {state: "bonding"}
119
+ | {state: "connected"; fullyBooted: boolean}
120
+
121
+ export type ConnectedGlassesConnectionStatus = Extract<GlassesConnectionStatus, {state: "connected"}>
122
+
123
+ export function isConnectedGlassesConnectionStatus(
124
+ status: GlassesConnectionStatus,
125
+ ): status is ConnectedGlassesConnectionStatus {
126
+ return status.state === "connected"
127
+ }
128
+
129
+ export function isReadyGlassesConnectionStatus(status: GlassesConnectionStatus): boolean {
130
+ return status.state === "connected" && status.fullyBooted
131
+ }
132
+
133
+ export function isBusyGlassesConnectionStatus(status: GlassesConnectionStatus): boolean {
134
+ return status.state === "scanning" || status.state === "connecting" || status.state === "bonding"
135
+ }
136
+
137
+ export function createDisconnectedGlassesStatus(): Partial<GlassesStatus> {
138
+ return {
139
+ connection: {state: "disconnected"},
140
+ hotspot: {state: "disabled"},
141
+ voiceActivityDetectionEnabled: DEFAULT_VOICE_ACTIVITY_DETECTION_ENABLED,
142
+ wifi: {state: "disconnected"},
143
+ }
144
+ }
145
+
146
+ /** K900 `sr_getvol` response (Mentra Live glasses media step volume 0闂?5). */
147
+ export type GlassesMediaVolumeGetResult = {
148
+ level: number
149
+ statusCode: number
150
+ }
151
+
152
+ /** K900 `sr_vol` acknowledgment. */
153
+ export type GlassesMediaVolumeSetResult = {
154
+ statusCode: number
155
+ }
156
+
157
+ export type LocalTranscriptionEvent = {
158
+ text: string
159
+ isFinal?: boolean
160
+ transcribeLanguage?: string
161
+ /** Enrolled profile id when the on-device speaker engine matched, else 0. */
162
+ speakerId?: number | string
163
+ /** Additive speaker resolution — present only when a profile matched. */
164
+ resolvedSpeakerId?: string
165
+ resolvedSpeakerName?: string
166
+ startTime?: number
167
+ endTime?: number
168
+ provider?: string
169
+ }
170
+
171
+ /** One on-device speaker-identification window (SpeakerIdEngine).
172
+ * `speakerId`/`name` are absent for an unknown (unenrolled) voice. */
173
+ export type SpeakerDetectedEvent = {
174
+ speakerId?: string
175
+ name?: string
176
+ similarity: number
177
+ /** Epoch ms window bounds (native clock, same epoch as Date.now()). */
178
+ startMs: number
179
+ endMs: number
180
+ }
181
+
182
+ export type SpeakerEnrollProgressEvent = {
183
+ voicedSeconds: number
184
+ targetSeconds: number
185
+ /** RMS level of the latest chunk, 0..1 — drives the recording meter. */
186
+ level: number
187
+ }
188
+
189
+ export type SpeakerEnrollResultEvent = {
190
+ ok: boolean
191
+ /** Failure reason when !ok: "inconsistent" | "too_short" | "model_unavailable" | "unsupported". */
192
+ reason?: string
193
+ /** base64 Float32Array chunk embeddings (raw audio is already discarded). */
194
+ embeddings?: string[]
195
+ dim?: number
196
+ /** Which mic captured the enrollment audio. */
197
+ source: "glasses" | "phone"
198
+ }
199
+
200
+ export type SpeakerProfilePush = {
201
+ id: string
202
+ name: string
203
+ /** base64 Float32Array centroid. */
204
+ embedding: string
205
+ }
206
+
207
+ export type LogEvent = {
208
+ message: string
209
+ }
210
+
211
+ export type WifiStatus = {state: "disconnected"} | {state: "connected"; ssid: string; localIp?: string}
212
+
213
+ export type ConnectedWifiStatus = Extract<WifiStatus, {state: "connected"}>
214
+
215
+ export function isConnectedWifiStatus(status: WifiStatus): status is ConnectedWifiStatus {
216
+ return status.state === "connected"
217
+ }
218
+
219
+ export type WifiStatusChangeEvent = WifiStatus & {
220
+ type: "wifi_status_change"
221
+ /**
222
+ * Glasses-reported provisioning failure reason when THIS event is the verdict of a
223
+ * failed connect attempt; absent on routine link-state updates. An attempt property,
224
+ * not a link property 闂?which is why it lives on the event, not on WifiStatus:
225
+ * "connect_timeout" arrives on a disconnected status (never associated), while
226
+ * "connected_to_other_network" arrives on a *connected* status (the attempt failed
227
+ * and the glasses ended up on / fell back to a different SSID than requested).
228
+ * Requires ASG client v40+ 闂?older glasses never send it.
229
+ */
230
+ error?: string
231
+ }
232
+
233
+ export type HotspotStatus = {state: "disabled"} | {state: "enabled"; ssid: string; password: string; localIp: string}
234
+
235
+ export type EnabledHotspotStatus = Extract<HotspotStatus, {state: "enabled"}>
236
+
237
+ export function isEnabledHotspotStatus(status: HotspotStatus): status is EnabledHotspotStatus {
238
+ return status.state === "enabled"
239
+ }
240
+
241
+ export type HotspotStatusChangeEvent = HotspotStatus & {
242
+ type: "hotspot_status_change"
243
+ }
244
+
245
+ export type HotspotErrorEvent = {
246
+ type: "hotspot_error"
247
+ errorMessage: string
248
+ timestamp: number
249
+ }
250
+
251
+ export type VersionInfoResult = {
252
+ androidVersion: string
253
+ firmwareVersion: string
254
+ besFirmwareVersion: string
255
+ mtkFirmwareVersion: string
256
+ buildNumber: string
257
+ systemTimeMs?: number
258
+ otaVersionUrl: string
259
+ appVersion: string
260
+ /** Phone-served hotspot OTA protocol version; 0 means unsupported/legacy glasses. */
261
+ hotspotOtaVersion: number
262
+ }
263
+
264
+ export type VersionInfoEvent = VersionInfoResult & {
265
+ type: "version_info"
266
+ }
267
+
268
+ export type WifiScanResultEvent = {
269
+ type: "wifi_scan_result"
270
+ networks: WifiSearchResult[]
271
+ scanComplete?: boolean
272
+ }
273
+
274
+ export type PhotoResponseEvent =
275
+ | {
276
+ type: "photo_response"
277
+ state: "success"
278
+ requestId: string
279
+ uploadUrl: string
280
+ photoUrl?: string
281
+ statusUrl?: string
282
+ contentType?: string
283
+ fileSizeBytes?: number
284
+ timestamp: number
285
+ }
286
+ | {
287
+ type: "photo_response"
288
+ state: "error"
289
+ requestId: string
290
+ timestamp: number
291
+ errorCode?: string
292
+ errorMessage: string
293
+ }
294
+
295
+ export type PhotoSuccessResponseEvent = Extract<PhotoResponseEvent, {state: "success"}>
296
+
297
+ export type PhotoStatusState =
298
+ | "accepted"
299
+ | "queued"
300
+ | "configuring"
301
+ | "capturing"
302
+ | "captured"
303
+ | "compressing"
304
+ | "ble_fallback_compression"
305
+ | "uploading"
306
+ | "uploaded"
307
+ | "ready_for_transfer"
308
+ | "transferring"
309
+ | "failed"
310
+
311
+ export type PhotoResolvedConfig = {
312
+ format?: "jpeg" | string
313
+ width?: number
314
+ height?: number
315
+ quality?: number
316
+ requestedSize?: PhotoSize | string
317
+ source?: "sdk" | "button" | string
318
+ transferMethod?: "webhook" | "ble" | "local" | string
319
+ compression?: PhotoCompression | string
320
+ saveToGallery?: boolean
321
+ exposureTimeNs?: number
322
+ iso?: number
323
+ }
324
+
325
+ export type PhotoFpsRange = {
326
+ min?: number
327
+ max?: number
328
+ }
329
+
330
+ export type PhotoRequestedCaptureConfig = {
331
+ manual?: boolean
332
+ exposureTimeNs?: number
333
+ iso?: number
334
+ frameDurationNs?: number
335
+ aeMode?: number
336
+ aeLock?: boolean
337
+ aeExposureCompensation?: number
338
+ aeTargetFpsRange?: PhotoFpsRange
339
+ noiseReductionMode?: number
340
+ edgeMode?: number
341
+ afMode?: number
342
+ zsl?: boolean
343
+ }
344
+
345
+ export type PhotoMeteredPreview = {
346
+ exposureTimeNs?: number
347
+ iso?: number
348
+ totalLightProxy?: number
349
+ }
350
+
351
+ export type PhotoCaptureMetadata = {
352
+ manual?: boolean
353
+ exposureTimeNs?: number
354
+ iso?: number
355
+ frameDurationNs?: number
356
+ aeMode?: number
357
+ aeState?: number
358
+ aeStateName?: string
359
+ noiseReductionMode?: number
360
+ edgeMode?: number
361
+ zsl?: boolean
362
+ sensorTimestampNs?: number
363
+ totalLightProxy?: number
364
+ mfnrLikely?: boolean
365
+ mfnrApplied?: boolean
366
+ width?: number
367
+ height?: number
368
+ noiseReductionWarning?: "not_implemented" | string
369
+ ispDigitalGainWarning?: "not_implemented" | string
370
+ ispAnalogGainWarning?: "not_implemented" | string
371
+ [key: string]: unknown
372
+ }
373
+
374
+ export type PhotoStatusEvent = {
375
+ type: "photo_status"
376
+ requestId: string
377
+ status: PhotoStatusState | string
378
+ timestamp: number
379
+ resolvedConfig?: PhotoResolvedConfig
380
+ requestedCaptureConfig?: PhotoRequestedCaptureConfig
381
+ meteredPreview?: PhotoMeteredPreview
382
+ captureMetadata?: PhotoCaptureMetadata
383
+ errorCode?: string
384
+ errorMessage?: string
385
+ }
386
+
387
+ export type CameraStatusEvent = {
388
+ type: "camera_status"
389
+ requestId: string
390
+ state: "warming" | "ready" | "stopped" | "error" | string
391
+ timestamp: number
392
+ errorCode?: string
393
+ errorMessage?: string
394
+ }
395
+
396
+ export type VideoRecordingStatusEvent = {
397
+ type: "video_recording_status"
398
+ requestId?: string
399
+ success: boolean
400
+ status: VideoRecordingStatusState
401
+ details?: string | null
402
+ timestamp: number
403
+ data?: {
404
+ recording?: boolean
405
+ duration_ms?: number
406
+ duration_formatted?: string
407
+ [key: string]: unknown
408
+ }
409
+ }
410
+
411
+ export type VideoRecordingStatusState =
412
+ | "recording_started"
413
+ | "recording_status"
414
+ | "already_recording"
415
+ | "recording_stopped"
416
+ | "not_recording"
417
+ | "request_id_mismatch"
418
+ | "service_unavailable"
419
+ | "json_error"
420
+ | "battery_low"
421
+ | "camera_busy"
422
+ | "storage_unavailable"
423
+ | "integrity_failed"
424
+ | "error"
425
+
426
+ export type VideoRecordingStartedStatusEvent = Omit<VideoRecordingStatusEvent, "success" | "status"> & {
427
+ success: true
428
+ status: "recording_started"
429
+ }
430
+
431
+ export type VideoRecordingStoppedStatusEvent = Omit<VideoRecordingStatusEvent, "success" | "status"> & {
432
+ success: true
433
+ status: "recording_stopped"
434
+ }
435
+
436
+ export type VideoRecordingSuccessStatusEvent = VideoRecordingStartedStatusEvent | VideoRecordingStoppedStatusEvent
437
+
438
+ export type MediaUploadSuccessEvent = {
439
+ type: "media_success"
440
+ requestId: string
441
+ mediaUrl: string
442
+ mediaType: number
443
+ timestamp: number
444
+ }
445
+
446
+ export type MediaUploadErrorEvent = {
447
+ type: "media_error"
448
+ requestId: string
449
+ errorMessage: string
450
+ mediaType: number
451
+ timestamp: number
452
+ }
453
+
454
+ export type MediaUploadEvent = MediaUploadSuccessEvent | MediaUploadErrorEvent
455
+
456
+ export type GalleryStatusEvent = {
457
+ type: "gallery_status"
458
+ photos: number
459
+ videos: number
460
+ total: number
461
+ totalSize?: number
462
+ hasContent: boolean
463
+ cameraBusy: boolean
464
+ cameraBusyReason?: "video" | "stream" | (string & {})
465
+ }
466
+
467
+ export type CompatibleGlassesSearchStopEvent = {
468
+ type: "compatible_glasses_search_stop"
469
+ deviceModel: DeviceModel
470
+ }
471
+
472
+ export type HeartbeatSentEvent = {
473
+ type: "heartbeat_sent"
474
+ heartbeat_sent: {
475
+ timestamp: number
476
+ }
477
+ }
478
+
479
+ export type HeartbeatReceivedEvent = {
480
+ type: "heartbeat_received"
481
+ heartbeat_received: {
482
+ timestamp: number
483
+ }
484
+ }
485
+
486
+ export type SwipeVolumeStatusEvent = {
487
+ type: "swipe_volume_status"
488
+ enabled: boolean
489
+ timestamp: number
490
+ }
491
+
492
+ export type SwitchStatusEvent = {
493
+ type: "switch_status"
494
+ switchType?: number
495
+ switchValue?: number
496
+ timestamp: number
497
+ }
498
+
499
+ export type RgbLedControlResponseEvent =
500
+ | {
501
+ type: "rgb_led_control_response"
502
+ state: "success"
503
+ requestId: string
504
+ }
505
+ | {
506
+ type: "rgb_led_control_response"
507
+ state: "error"
508
+ requestId: string
509
+ errorCode: string
510
+ }
511
+
512
+ export type RgbLedControlSuccessResponseEvent = Extract<RgbLedControlResponseEvent, {state: "success"}>
513
+
514
+ export type SettingsAckStatus = "applied" | "ready" | "error" | "failed" | "failure" | "rejected"
515
+
516
+ export type SettingsAckSetting =
517
+ | "gallery_mode"
518
+ | "button_photo"
519
+ | "button_video_recording"
520
+ | "button_max_recording_time"
521
+ | "camera_fov"
522
+ | "camera_fov_override"
523
+ | "camera_tuning"
524
+
525
+ export type SettingsAckEvent = {
526
+ type: "settings_ack"
527
+ requestId: string
528
+ setting: SettingsAckSetting
529
+ status: SettingsAckStatus
530
+ timestamp: number
531
+ fov?: number
532
+ roiPosition?: CameraRoiPositionValue
533
+ hardwareApplied?: boolean
534
+ leaseId?: string
535
+ active?: boolean
536
+ size?: ButtonPhotoSize | string
537
+ width?: number
538
+ height?: number
539
+ fps?: number
540
+ enabled?: boolean
541
+ minutes?: number
542
+ /** ANR enabled flag; present when setting === "camera_tuning" */
543
+ anr?: boolean
544
+ /** Stock-gain flag; present when setting === "camera_tuning" */
545
+ gain?: boolean
546
+ errorCode?: string
547
+ errorMessage?: string
548
+ }
549
+
550
+ export type SettingsAckSuccessStatus = Exclude<SettingsAckStatus, "error" | "failed" | "failure" | "rejected">
551
+
552
+ export type SettingsAckSuccessEvent = Omit<SettingsAckEvent, "status"> & {
553
+ status: SettingsAckSuccessStatus
554
+ }
555
+
556
+ export type RgbLedAction = "on" | "off"
557
+ export type RgbLedColor = "red" | "green" | "blue" | "orange" | "white"
558
+ export type PhotoSize = "low" | "medium" | "high" | "max"
559
+ export type PhotoMode = "photo" | "text"
560
+ export type PhotoTransferMethod = "auto" | "direct" | "ble"
561
+ export type ButtonPhotoSize = "low" | "medium" | "high" | "max"
562
+
563
+ /**
564
+ * @deprecated Sticky action-button photo presets via {@link BluetoothSdkPublicModule.setPhotoCaptureDefaults}
565
+ * are deprecated. Prefer per-request {@link BluetoothSdkPublicModule.requestPhoto} options
566
+ * (e.g. `mode: "text"` for text sensor size/crop, or explicit `aeExposureDivisor`) instead of
567
+ * persisting button-photo tuning on the glasses.
568
+ */
569
+ export type PhotoCaptureDefaults = {
570
+ size?: PhotoSize
571
+ /** ZSL preview buffering for physical camera-button photos. */
572
+ zsl?: boolean
573
+ /** MFNR still capture for physical camera-button photos. */
574
+ mfnr?: boolean
575
+ noiseReduction?: boolean
576
+ edgeEnhancement?: boolean
577
+ ispDigitalGain?: number
578
+ ispAnalogGain?: string
579
+ aeExposureDivisor?: number
580
+ isoCap?: number
581
+ compress?: PhotoCompression
582
+ sound?: boolean
583
+ /** When true, clears stored NR/edge/ISP presets on the glasses before applying other fields. */
584
+ resetCaptureTuning?: boolean
585
+ }
586
+ export type PhotoCompression = "none" | "medium" | "heavy"
587
+
588
+ export type VideoRecordingDefaults = {
589
+ width: number
590
+ height: number
591
+ fps: number
592
+ }
593
+
594
+ /**
595
+ * Optional per-recording video settings for {@link startVideoRecording}. When
596
+ * omitted, the glasses fall back to their saved video recording defaults. Any
597
+ * field left undefined is omitted from the BLE command (glasses default applies).
598
+ */
599
+ export interface VideoRecordingSettings {
600
+ width?: number
601
+ height?: number
602
+ fps?: number
603
+ /**
604
+ * Optional auto-stop timer in minutes, sent on `start_video_recording`.
605
+ * `0` (the default) means record until stopped or interrupted
606
+ * (battery/storage/thermal/error).
607
+ */
608
+ maxRecordingTimeMinutes?: number
609
+ }
610
+ export const DeviceModels = {
611
+ Simulated: "Simulated Glasses",
612
+ G1: "Even Realities G1",
613
+ G2: "Even Realities G2",
614
+ MentraLive: "Mentra Live",
615
+ MentraNex: "Mentra Display",
616
+ Mach1: "Mentra Mach1",
617
+ Z100: "Vuzix Z100",
618
+ Frame: "Brilliant Frame",
619
+ Nimo: "NIMO",
620
+ Ar99: "AR99",
621
+ R1: "Even Realities R1",
622
+ } as const
623
+
624
+ export type DeviceModel = (typeof DeviceModels)[keyof typeof DeviceModels]
625
+ export type ObservableStoreCategory = "glasses" | "bluetooth" | "core"
626
+
627
+ export type DashboardMenuItem = {
628
+ title: string
629
+ packageName: string
630
+ values?: Record<string, unknown>
631
+ }
632
+
633
+ export const CAMERA_FOV_MIN = 62
634
+ export const CAMERA_FOV_MAX = 118
635
+ export const CAMERA_FOV_DEFAULT = CAMERA_FOV_MAX
636
+
637
+ export type CameraRoiPosition = "center" | "bottom" | "top"
638
+ export type CameraRoiPositionValue = 0 | 1 | 2
639
+ export type CameraFovPreset = "narrow" | "standard" | "wide"
640
+
641
+ export type CameraFovRequest =
642
+ | {
643
+ fov: number
644
+ roiPosition?: CameraRoiPosition
645
+ }
646
+ | {
647
+ preset: CameraFovPreset
648
+ }
649
+
650
+ export type CameraFovResult = {
651
+ requestId: string
652
+ fov: number
653
+ roiPosition: CameraRoiPosition
654
+ timestamp: number
655
+ }
656
+
657
+ export type CameraFovOverrideRequest = CameraFovRequest & {
658
+ /** Phone-owned lease used to make delayed releases safe. */
659
+ leaseId: string
660
+ /** Safety TTL; refresh the same lease/configuration to extend without a HAL restart. */
661
+ ttlMs?: number
662
+ }
663
+
664
+ export type CameraFovSetting = {
665
+ fov: number
666
+ roiPosition: CameraRoiPositionValue
667
+ }
668
+
669
+ type NativeCameraFovSetting = {
670
+ fov: number
671
+ roi_position: CameraRoiPositionValue
672
+ }
673
+
674
+ export type MicPreference = "auto" | "phone" | "glasses" | "bluetooth"
675
+ export type MicMode = "phone" | "glasses" | "bluetoothClassic" | "bluetooth"
676
+
677
+ export type PhotoRequestParams = {
678
+ requestId?: string
679
+ appId?: string
680
+ size: PhotoSize
681
+ mode?: PhotoMode
682
+ /** `direct` disables BLE fallback; `ble` skips direct upload and forces phone-relayed transfer. */
683
+ transferMethod?: PhotoTransferMethod
684
+ webhookUrl: string | null
685
+ authToken: string | null
686
+ compress: PhotoCompression
687
+ save?: boolean
688
+ sound: boolean
689
+ exposureTimeNs?: number | null
690
+ /** Sensor ISO for this capture only. Only used when exposureTimeNs enables manual exposure. */
691
+ iso?: number | null
692
+ /** After AE convergence, divide metered exposure by this factor (scan mode). */
693
+ aeExposureDivisor?: number
694
+ /** Cap ISO after AE metering (scan mode). */
695
+ isoCap?: number
696
+ /** Requested on wire; glasses may log not_implemented. */
697
+ noiseReduction?: boolean
698
+ edgeEnhancement?: boolean
699
+ /** ZSL buffering. Forced off for manual/scan stills because fixed sensor controls take priority. */
700
+ zsl?: boolean
701
+ /** MFNR still capture. Forced off for manual/scan stills because fixed sensor controls take priority. */
702
+ mfnr?: boolean
703
+ ispDigitalGain?: number
704
+ ispAnalogGain?: string
705
+ }
706
+
707
+ export type WarmUpCameraParams = {
708
+ /** Supply this when the owner needs to call stopCameraWarmUp during teardown. */
709
+ requestId?: string
710
+ size: PhotoSize
711
+ mode?: PhotoMode
712
+ exposureTimeNs?: number | null
713
+ /** Ready-state hold; defaults to 15 seconds and is capped at 60 seconds by ASG. */
714
+ durationMs?: number
715
+ /** ZSL preview buffering for the warm-up session. */
716
+ zsl?: boolean
717
+ /** MFNR still capture for the warm-up session. */
718
+ mfnr?: boolean
719
+ }
720
+
721
+ export type StreamVideoConfig = {
722
+ width?: number
723
+ height?: number
724
+ bitrate?: number
725
+ fps?: number
726
+ }
727
+
728
+ export type StreamAudioConfig = {
729
+ bitrate?: number
730
+ sampleRate?: number
731
+ echoCancellation?: boolean
732
+ noiseSuppression?: boolean
733
+ }
734
+
735
+ export type StreamStartRequest = {
736
+ type?: "start_stream"
737
+ streamUrl: string
738
+ streamId?: string
739
+ sound?: boolean
740
+ video?: StreamVideoConfig
741
+ audio?: StreamAudioConfig
742
+ }
743
+
744
+ export type StreamKeepAliveRequest = {
745
+ type?: "keep_stream_alive"
746
+ streamId: string
747
+ ackId: string
748
+ }
749
+
750
+ export type PairFailureEvent = {
751
+ type: "pair_failure"
752
+ error: string
753
+ }
754
+
755
+ export type PairingInfoEvent = {
756
+ had_previous_bond: boolean
757
+ pairing_code?: string
758
+ classic_bond_ready?: boolean
759
+ secure_pairing_capable?: boolean
760
+ protocol_version?: number
761
+ }
762
+
763
+ export type EnteringPairingModeEvent = {
764
+ window_ms: number
765
+ reason?: string
766
+ }
767
+
768
+ export type OwnerReplacedEvent = {
769
+ reason: string
770
+ }
771
+
772
+ export type AudioPairingNeededEvent = {
773
+ type: "audio_pairing_needed"
774
+ deviceName: string
775
+ }
776
+
777
+ export type AudioConnectedEvent = {
778
+ type: "audio_connected"
779
+ deviceName: string
780
+ }
781
+
782
+ export type AudioDisconnectedEvent = {
783
+ type: "audio_disconnected"
784
+ }
785
+
786
+ export type SaveSettingEvent = {
787
+ type: "save_setting"
788
+ key: string
789
+ value: any
790
+ }
791
+
792
+ export type WsTextEvent = {
793
+ type: "ws_text"
794
+ text: string
795
+ }
796
+
797
+ export type WsBinEvent = {
798
+ type: "ws_bin"
799
+ base64: string
800
+ }
801
+
802
+ export type MicPcmEvent = {
803
+ type: "mic_pcm"
804
+ pcm: ArrayBuffer
805
+ sampleRate: 16000
806
+ bitsPerSample: 16
807
+ channels: 1
808
+ encoding: "pcm_s16le"
809
+ voiceActivityDetectionEnabled: boolean
810
+ }
811
+
812
+ export type MicLc3Event = {
813
+ type: "mic_lc3"
814
+ lc3: ArrayBuffer
815
+ sampleRate: 16000
816
+ channels: 1
817
+ encoding: "lc3"
818
+ frameDurationMs: 10
819
+ frameSizeBytes: number
820
+ bitrate: number
821
+ packetizedFromGlasses: boolean
822
+ voiceActivityDetectionEnabled: boolean
823
+ }
824
+
825
+ /** Native glasses-microphone diagnostics emitted when the SDK detects a transport or decode issue. */
826
+ export type MicHealthEvent = {
827
+ type: "mic_health"
828
+ reason: "sequence_gap" | "decode_failure"
829
+ sequenceGapEvents: number
830
+ decodeFailures: number
831
+ lastLc3ReceivedAt?: number
832
+ lastPcmProducedAt?: number
833
+ timestamp: number
834
+ }
835
+
836
+ export type StreamStatusLifecycleState = "initializing" | "streaming" | "stopping" | "stopped"
837
+ export type StreamStatusReconnectState = "reconnecting" | "reconnected" | "reconnect_failed"
838
+ export type StreamStatusState = StreamStatusLifecycleState | StreamStatusReconnectState | "error"
839
+
840
+ /** Effective stream settings reported by the glasses after defaults and clamps. */
841
+ export type StreamResolvedConfig = {
842
+ transport?: "rtmp" | "srt" | "whip"
843
+ video?: {
844
+ /** Encoded output width sent to the stream endpoint. */
845
+ width: number
846
+ /** Encoded output height sent to the stream endpoint. */
847
+ height: number
848
+ /** Native camera buffer width selected before crop/downscale. */
849
+ captureWidth?: number
850
+ /** Native camera buffer height selected before crop/downscale. */
851
+ captureHeight?: number
852
+ /** Encoded video bitrate in bits per second. */
853
+ bitrate: number
854
+ /** Resolved capture/encode frame rate. */
855
+ fps: number
856
+ }
857
+ audio?: {
858
+ /** Encoded audio bitrate in bits per second. */
859
+ bitrate?: number
860
+ /** Audio sample rate in Hz. */
861
+ sampleRate?: number
862
+ echoCancellation?: boolean
863
+ noiseSuppression?: boolean
864
+ }
865
+ }
866
+
867
+ /** Live encoder and device telemetry emitted periodically by supported glasses firmware. */
868
+ export type StreamLiveStats = {
869
+ /** Current encoded video bitrate in bits per second. */
870
+ bitrate?: number
871
+ /** Current encode frame rate. */
872
+ fps?: number
873
+ droppedFrames?: number
874
+ /** Seconds since the stream started. */
875
+ duration?: number
876
+ /** Device temperature in 闂佺娅i悡? if the hardware reports it. */
877
+ temperatureC?: number
878
+ }
879
+
880
+ type StreamStatusCommon = {
881
+ type: "stream_status"
882
+ streamId?: string
883
+ timestamp?: number
884
+ resolvedConfig?: StreamResolvedConfig
885
+ stats?: StreamLiveStats
886
+ }
887
+
888
+ export type StreamStatusEvent =
889
+ | (StreamStatusCommon & {
890
+ kind: "lifecycle"
891
+ status: StreamStatusLifecycleState
892
+ })
893
+ | (StreamStatusCommon & {
894
+ kind: "reconnect"
895
+ status: "reconnecting"
896
+ attempt: number
897
+ maxAttempts: number
898
+ reason: string
899
+ })
900
+ | (StreamStatusCommon & {
901
+ kind: "reconnect"
902
+ status: "reconnected"
903
+ attempt: number
904
+ })
905
+ | (StreamStatusCommon & {
906
+ kind: "reconnect"
907
+ status: "reconnect_failed"
908
+ maxAttempts: number
909
+ })
910
+ | (StreamStatusCommon & {
911
+ kind: "error"
912
+ status: "error"
913
+ errorDetails: string
914
+ })
915
+ | (StreamStatusCommon & {
916
+ kind: "snapshot"
917
+ status: "streaming" | "reconnecting" | "stopped"
918
+ streaming: boolean
919
+ reconnecting: boolean
920
+ attempt?: number
921
+ })
922
+
923
+ export type KeepAliveAckEvent = {
924
+ type: "keep_alive_ack"
925
+ streamId: string
926
+ ackId: string
927
+ timestamp?: number
928
+ }
929
+
930
+ export type MtkUpdateCompleteEvent = {
931
+ type: "mtk_update_complete"
932
+ message: string
933
+ timestamp: number
934
+ }
935
+
936
+ /**
937
+ * The glasses process restarted while the BES kept the BLE link alive (its `sid`
938
+ * changed, or first appeared after an update from a pre-sid build). There is no
939
+ * physical disconnect for this — treat it as the logical reconnect edge.
940
+ */
941
+ export type GlassesSessionChangedEvent = {
942
+ type: "glasses_session_changed"
943
+ previous_sid: string
944
+ sid: string
945
+ }
946
+
947
+ /** @deprecated Glasses no longer emit ota_progress; use {@link OtaStatusEvent} and status-store mapping. */
948
+ export type OtaProgressEvent = {
949
+ type: "ota_progress"
950
+ stage?: OtaStage
951
+ status?: OtaProgressStatus
952
+ progress?: number
953
+ bytes_downloaded?: number
954
+ total_bytes?: number
955
+ current_update?: string
956
+ error_message?: string
957
+ }
958
+
959
+ export type OtaStartAckEvent = {
960
+ type: "ota_start_ack"
961
+ timestamp: number
962
+ }
963
+ export type OtaStatusEvent = {
964
+ type: "ota_status"
965
+ session_id: string
966
+ total_steps: number
967
+ current_step: number
968
+ step_type: "apk" | "mtk" | "bes"
969
+ phase: "download" | "install"
970
+ step_percent: number
971
+ overall_percent: number
972
+ status: "in_progress" | "step_complete" | "complete" | "failed" | "idle"
973
+ error_message?: string
974
+ }
975
+
976
+ export type OtaQueryResult = OtaStatusEvent
977
+
978
+ /** Nex BLE protobuf trace (NexEventUtils); payload matches native Map keys. */
979
+ export type BleCommandTraceEvent = {
980
+ command: string
981
+ commandText: string
982
+ timestamp: number
983
+ }
984
+
985
+ export type MiniappSelectedEvent = {
986
+ type: "miniapp_selected"
987
+ packageName: string
988
+ }
989
+
990
+ // Union type of all native/internal Bluetooth SDK events.
991
+ export type BluetoothSdkInternalEvent = Parameters<BluetoothSdkModuleEvents[keyof BluetoothSdkModuleEvents]>[0]
992
+
993
+ export type BluetoothSdkModuleEvents = {
994
+ glasses_status: (changed: Partial<GlassesStatus>) => void
995
+ bluetooth_status: (changed: Partial<BluetoothStatus>) => void
996
+ log: (event: LogEvent) => void
997
+ device_discovered: (device: Device) => void
998
+ default_device_changed: (event: {device?: Device}) => void
999
+ // Individual event handlers
1000
+ glasses_not_ready: (event: GlassesNotReadyEvent) => void
1001
+ button_press: (event: ButtonPressEvent) => void
1002
+ touch_event: (event: TouchEvent) => void
1003
+ accel_event: (event: AccelEvent) => void
1004
+ compass_heading: (event: CompassHeadingEvent) => void
1005
+ compass_calibration: (event: CompassCalibrationEvent) => void
1006
+ navigation_mode_change: (event: NavigationModeEvent) => void
1007
+ navigation_view_change: (event: NavigationViewEvent) => void
1008
+ head_up: (event: HeadUpEvent) => void
1009
+ voice_activity_detection_status: (event: VoiceActivityDetectionStatusEvent) => void
1010
+ speaking_status: (event: SpeakingStatusEvent) => void
1011
+ battery_status: (event: BatteryStatusEvent) => void
1012
+ local_transcription: (event: LocalTranscriptionEvent) => void
1013
+ speaker_detected: (event: SpeakerDetectedEvent) => void
1014
+ speaker_enroll_progress: (event: SpeakerEnrollProgressEvent) => void
1015
+ speaker_enroll_result: (event: SpeakerEnrollResultEvent) => void
1016
+ phone_notification: (event: PhoneNotificationEvent) => void
1017
+ phone_notification_dismissed: (event: PhoneNotificationDismissedEvent) => void
1018
+ wifi_status_change: (event: WifiStatusChangeEvent) => void
1019
+ wifi_scan_result: (event: WifiScanResultEvent) => void
1020
+ hotspot_status_change: (event: HotspotStatusChangeEvent) => void
1021
+ hotspot_error: (event: HotspotErrorEvent) => void
1022
+ photo_response: (event: PhotoResponseEvent) => void
1023
+ photo_status: (event: PhotoStatusEvent) => void
1024
+ camera_status: (event: CameraStatusEvent) => void
1025
+ video_recording_status: (event: VideoRecordingStatusEvent) => void
1026
+ media_success: (event: MediaUploadSuccessEvent) => void
1027
+ media_error: (event: MediaUploadErrorEvent) => void
1028
+ gallery_status: (event: GalleryStatusEvent) => void
1029
+ compatible_glasses_search_stop: (event: CompatibleGlassesSearchStopEvent) => void
1030
+ heartbeat_sent: (event: HeartbeatSentEvent) => void
1031
+ heartbeat_received: (event: HeartbeatReceivedEvent) => void
1032
+ swipe_volume_status: (event: SwipeVolumeStatusEvent) => void
1033
+ switch_status: (event: SwitchStatusEvent) => void
1034
+ rgb_led_control_response: (event: RgbLedControlResponseEvent) => void
1035
+ settings_ack: (event: SettingsAckEvent) => void
1036
+ pair_failure: (event: PairFailureEvent) => void
1037
+ pairing_info: (event: PairingInfoEvent) => void
1038
+ entering_pairing_mode: (event: EnteringPairingModeEvent) => void
1039
+ owner_replaced: (event: OwnerReplacedEvent) => void
1040
+ audio_pairing_needed: (event: AudioPairingNeededEvent) => void
1041
+ audio_connected: (event: AudioConnectedEvent) => void
1042
+ audio_disconnected: (event: AudioDisconnectedEvent) => void
1043
+ save_setting: (event: SaveSettingEvent) => void
1044
+ ws_text: (event: WsTextEvent) => void
1045
+ ws_bin: (event: WsBinEvent) => void
1046
+ mic_pcm: (event: MicPcmEvent) => void
1047
+ mic_lc3: (event: MicLc3Event) => void
1048
+ mic_health: (event: MicHealthEvent) => void
1049
+ stream_status: (event: StreamStatusEvent) => void
1050
+ keep_alive_ack: (event: KeepAliveAckEvent) => void
1051
+ mtk_update_complete: (event: MtkUpdateCompleteEvent) => void
1052
+ glasses_session_changed: (event: GlassesSessionChangedEvent) => void
1053
+ ota_start_ack: (event: OtaStartAckEvent) => void
1054
+ ota_status: (event: OtaStatusEvent) => void
1055
+ ar99_ota_status: (event: Ar99OtaStatusEvent) => void
1056
+ g2_firmware_flash_progress: (event: G2FirmwareFlashProgressEvent) => void
1057
+ version_info: (event: VersionInfoEvent) => void
1058
+ send_command_to_ble: (event: BleCommandTraceEvent) => void
1059
+ receive_command_from_ble: (event: BleCommandTraceEvent) => void
1060
+ miniapp_selected: (event: MiniappSelectedEvent) => void
1061
+ extraction_progress: (event: ExtractionProgressEvent) => void
1062
+ }
1063
+
1064
+ export interface ExtractionProgressEvent {
1065
+ percentage: number
1066
+ bytesRead: number
1067
+ totalBytes: number
1068
+ }
1069
+
1070
+ export interface Ar99OtaStatusEvent {
1071
+ type: "ar99_ota_status"
1072
+ phase: string
1073
+ progress: number
1074
+ offset: number
1075
+ total: number
1076
+ errorMessage?: string
1077
+ error_message?: string
1078
+ }
1079
+
1080
+ export interface PhoneNotificationEvent {
1081
+ notificationId: string
1082
+ app: string
1083
+ title: string
1084
+ content: string
1085
+ priority: string
1086
+ timestamp: number
1087
+ packageName: string
1088
+ }
1089
+
1090
+ export interface PhoneNotificationDismissedEvent {
1091
+ notificationId: string
1092
+ notificationKey: string
1093
+ packageName: string
1094
+ timestamp: number
1095
+ }
1096
+
1097
+ export type PublicGlassesStatus = Omit<
1098
+ GlassesStatus,
1099
+ "otaUpdateAvailable" | "otaProgress" | "otaInProgress" | "otaVersionUrl"
1100
+ >
1101
+
1102
+ export type PublicBluetoothStatus = Pick<
1103
+ BluetoothStatus,
1104
+ | "searching"
1105
+ | "searchingController"
1106
+ | "systemMicUnavailable"
1107
+ | "micRanking"
1108
+ | "currentMic"
1109
+ | "searchResults"
1110
+ | "wifiScanResults"
1111
+ | "lastLog"
1112
+ | "otherBtConnected"
1113
+ | "galleryModeEnabled"
1114
+ >
1115
+
1116
+ export type BluetoothSdkEventMap = {
1117
+ log: LogEvent
1118
+ device_discovered: Device
1119
+ default_device_changed: {device?: Device}
1120
+ glasses_not_ready: GlassesNotReadyEvent
1121
+ button_press: ButtonPressEvent
1122
+ touch_event: TouchEvent
1123
+ accel_event: AccelEvent
1124
+ head_up: HeadUpEvent
1125
+ voice_activity_detection_status: VoiceActivityDetectionStatusEvent
1126
+ speaking_status: SpeakingStatusEvent
1127
+ battery_status: BatteryStatusEvent
1128
+ local_transcription: LocalTranscriptionEvent
1129
+ wifi_status_change: WifiStatusChangeEvent
1130
+ wifi_scan_result: WifiScanResultEvent
1131
+ hotspot_status_change: HotspotStatusChangeEvent
1132
+ hotspot_error: HotspotErrorEvent
1133
+ photo_response: PhotoResponseEvent
1134
+ photo_status: PhotoStatusEvent
1135
+ camera_status: CameraStatusEvent
1136
+ video_recording_status: VideoRecordingStatusEvent
1137
+ media_success: MediaUploadSuccessEvent
1138
+ media_error: MediaUploadErrorEvent
1139
+ gallery_status: GalleryStatusEvent
1140
+ compatible_glasses_search_stop: CompatibleGlassesSearchStopEvent
1141
+ swipe_volume_status: SwipeVolumeStatusEvent
1142
+ switch_status: SwitchStatusEvent
1143
+ rgb_led_control_response: RgbLedControlResponseEvent
1144
+ settings_ack: SettingsAckEvent
1145
+ pair_failure: PairFailureEvent
1146
+ pairing_info: PairingInfoEvent
1147
+ entering_pairing_mode: EnteringPairingModeEvent
1148
+ owner_replaced: OwnerReplacedEvent
1149
+ audio_pairing_needed: AudioPairingNeededEvent
1150
+ audio_connected: AudioConnectedEvent
1151
+ audio_disconnected: AudioDisconnectedEvent
1152
+ mic_pcm: MicPcmEvent
1153
+ mic_lc3: MicLc3Event
1154
+ mic_health: MicHealthEvent
1155
+ stream_status: StreamStatusEvent
1156
+ /** Mentra Live MTK updater completed and the glasses are about to restart. */
1157
+ mtk_update_complete: MtkUpdateCompleteEvent
1158
+ /** The ASG process restarted while the BES kept the BLE connection alive. */
1159
+ glasses_session_changed: GlassesSessionChangedEvent
1160
+ ota_start_ack: OtaStartAckEvent
1161
+ ota_status: OtaStatusEvent
1162
+ ar99_ota_status: Ar99OtaStatusEvent
1163
+ g2_firmware_flash_progress: G2FirmwareFlashProgressEvent
1164
+ version_info: VersionInfoEvent
1165
+ extraction_progress: ExtractionProgressEvent
1166
+ }
1167
+
1168
+ export type BluetoothSdkEventName = keyof BluetoothSdkEventMap
1169
+
1170
+ export type BluetoothSdkEventListener<EventName extends BluetoothSdkEventName> = (
1171
+ event: BluetoothSdkEventMap[EventName],
1172
+ ) => void
1173
+
1174
+ export type BluetoothSdkSubscription = {
1175
+ remove(): void
1176
+ }
1177
+
1178
+ export type BluetoothSdkEvent = BluetoothSdkEventMap[BluetoothSdkEventName]
1179
+
1180
+ export interface BluetoothSdkPublicModule {
1181
+ addListener<EventName extends BluetoothSdkEventName>(
1182
+ eventName: EventName,
1183
+ listener: BluetoothSdkEventListener<EventName>,
1184
+ ): BluetoothSdkSubscription
1185
+
1186
+ /** Read an immutable snapshot of the current glasses state. */
1187
+ getGlassesStatus(): Promise<PublicGlassesStatus>
1188
+ /** Read an immutable snapshot of the phone Bluetooth adapter state. */
1189
+ getBluetoothStatus(): Promise<PublicBluetoothStatus>
1190
+ /** Observe immutable glasses-state patches. Returns an unsubscribe function. */
1191
+ subscribeGlassesStatus(listener: (changed: Partial<PublicGlassesStatus>) => void): () => void
1192
+ /** Observe immutable Bluetooth-state patches. Returns an unsubscribe function. */
1193
+ subscribeBluetoothStatus(listener: (changed: Partial<PublicBluetoothStatus>) => void): () => void
1194
+
1195
+ getDefaultDevice(): Promise<Device | null>
1196
+ setDefaultDevice(device: Device | null): Promise<void>
1197
+ clearDefaultDevice(): Promise<void>
1198
+
1199
+ startScan(model: DeviceModel): Promise<void>
1200
+ stopScan(): Promise<void>
1201
+ scan(options: ScanOptions): Promise<Device[]>
1202
+ scan(model: DeviceModel, options?: ScanModelOptions): Promise<Device[]>
1203
+ connect(device: Device, options?: ConnectOptions): Promise<void>
1204
+ connectDefault(options?: ConnectOptions): Promise<void>
1205
+ cancelConnectionAttempt(): Promise<void>
1206
+ disconnect(): Promise<void>
1207
+ forget(): Promise<void>
1208
+
1209
+ displayText(text: string, x?: number, y?: number, size?: number): Promise<void>
1210
+ clearDisplay(): Promise<void>
1211
+ showDashboard(): Promise<void>
1212
+ toggleHeadUp(): Promise<void>
1213
+ /**
1214
+ * Open the glasses' built-in notification panel (same effect as the user
1215
+ * saying "Hey Even, show notifications"). G2 only; a no-op elsewhere.
1216
+ */
1217
+ showNativeNotificationPanel(): Promise<void>
1218
+ setDashboardPosition(height: number, depth: number): Promise<void>
1219
+ setHeadUpAngle(angleDegrees: number): Promise<void>
1220
+ setImuEnabled(enabled: boolean): Promise<void>
1221
+ setScreenDisabled(disabled: boolean): Promise<void>
1222
+ /** Keep legacy Mentra Live OTA sessions awake. Modern sessions normally do not require this. */
1223
+ ping(): Promise<void>
1224
+
1225
+ requestWifiScan(): Promise<WifiSearchResult[]>
1226
+ sendWifiCredentials(ssid: string, password: string): Promise<WifiStatusChangeEvent>
1227
+ forgetWifiNetwork(ssid: string): Promise<WifiStatusChangeEvent>
1228
+ setHotspotState(enabled: boolean): Promise<HotspotStatusChangeEvent>
1229
+ /** Set the glasses clock from the phone after an OTA clock-skew failure. */
1230
+ setSystemTime(timestampMs: number): Promise<void>
1231
+ /** Enable or disable Wi-Fi ADB on Mentra Live (no-op on other devices). */
1232
+ setWifiAdbState(enabled: boolean): Promise<void>
1233
+
1234
+ setGalleryModeEnabled(enabled: boolean): Promise<SettingsAckSuccessEvent>
1235
+ setVoiceActivityDetectionEnabled(enabled: boolean): Promise<void>
1236
+ setLoudnessGateEnabled(enabled: boolean): Promise<void>
1237
+ /**
1238
+ * @deprecated Sticky action-button photo presets are deprecated. Prefer per-request
1239
+ * `requestPhoto(...)` options (e.g. `mode: "text"` for text sensor size/crop, or explicit per-shot
1240
+ * fields). Still functional until removed in a future release.
1241
+ */
1242
+ setPhotoCaptureDefaults(settings: PhotoCaptureDefaults): Promise<SettingsAckSuccessEvent>
1243
+ setVideoRecordingDefaults(settings: VideoRecordingDefaults): Promise<SettingsAckSuccessEvent>
1244
+ setMaxVideoRecordingDuration(minutes: number): Promise<SettingsAckSuccessEvent>
1245
+ setCameraFov(request: CameraFovRequest): Promise<CameraFovResult>
1246
+ /** One-way FOV command for legacy ASG clients that do not send settings acknowledgements. */
1247
+ setLegacyCameraFov(request: CameraFovRequest): Promise<CameraFovResult>
1248
+ setCameraFovOverride(request: CameraFovOverrideRequest): Promise<CameraFovResult>
1249
+ releaseCameraFovOverride(leaseId: string): Promise<SettingsAckSuccessEvent>
1250
+ /**
1251
+ * Configure camera HAL tuning (ANR / gain) on Mentra Live glasses.
1252
+ *
1253
+ * The phone sends a {@code camera_tuning_config} BLE command; the glasses relay it as a
1254
+ * {@code camconfig} broadcast to the camera HAL so parameters take effect without a reboot.
1255
+ *
1256
+ * **Scan-mode convention**: call with `(false, false)` when activating scan mode to disable ANR
1257
+ * and pixsmart gain for sharper text/barcode captures. Call with `(true, true)` to restore
1258
+ * defaults when exiting scan mode.
1259
+ *
1260
+ * @param anrOn `true` = ANR enabled (default), `false` = ANR disabled
1261
+ * @param gainOn `true` = stock gain params (default), `false` = pixsmart gain-off params
1262
+ */
1263
+ setCameraTuningConfig(anrOn: boolean, gainOn: boolean): Promise<SettingsAckSuccessEvent>
1264
+ queryGalleryStatus(): Promise<GalleryStatusEvent>
1265
+ requestPhoto(params: PhotoRequestParams): Promise<PhotoSuccessResponseEvent>
1266
+ warmUpCamera(params: WarmUpCameraParams): Promise<CameraStatusEvent>
1267
+ /** Release one request-owned warm-up. Opening requests reject with camera_warm_up_cancelled. */
1268
+ stopCameraWarmUp(requestId: string): Promise<void>
1269
+ startVideoRecording(
1270
+ requestId: string,
1271
+ save: boolean,
1272
+ sound: boolean,
1273
+ settings?: VideoRecordingSettings,
1274
+ ): Promise<VideoRecordingStartedStatusEvent>
1275
+ /**
1276
+ * Stop the active recording. When {@link webhookUrl} is provided, the glasses
1277
+ * upload the recorded video to it (multipart) using {@link authToken}. These
1278
+ * are supplied at stop time (not start) so the token is fresh when the upload
1279
+ * runs 闂?a recording can last arbitrarily long. An empty/omitted webhook keeps
1280
+ * the video on device (no upload).
1281
+ */
1282
+ stopVideoRecording(
1283
+ requestId: string,
1284
+ webhookUrl?: string,
1285
+ authToken?: string,
1286
+ ): Promise<VideoRecordingStoppedStatusEvent>
1287
+ /** Query the glasses for the current recording state and elapsed duration. */
1288
+ queryVideoRecordingStatus(requestId: string): Promise<VideoRecordingStatusEvent>
1289
+
1290
+ startStream(params: StreamStartRequest): Promise<StreamStatusEvent>
1291
+ stopStream(): Promise<StreamStatusEvent>
1292
+
1293
+ setMicState(enabled: boolean, useGlassesMic?: boolean, sendTranscript?: boolean, sendLc3Data?: boolean): Promise<void>
1294
+ setPreferredMic(preferredMic: MicPreference): Promise<void>
1295
+ setOwnAppAudioPlaying(playing: boolean): Promise<void>
1296
+ getGlassesMediaVolume(): Promise<GlassesMediaVolumeGetResult>
1297
+ setGlassesMediaVolume(level: number): Promise<GlassesMediaVolumeSetResult>
1298
+
1299
+ rgbLedControl(
1300
+ requestId: string,
1301
+ packageName: string | null,
1302
+ action: RgbLedAction,
1303
+ color: RgbLedColor | null,
1304
+ onDurationMs: number,
1305
+ offDurationMs: number,
1306
+ count: number,
1307
+ ): Promise<RgbLedControlSuccessResponseEvent>
1308
+
1309
+ requestVersionInfo(): Promise<VersionInfoResult>
1310
+ availableG2FirmwareArtifacts(): Promise<G2FirmwareArtifact[]>
1311
+ startG2FirmwareFlash(target: G2FirmwareTarget): Promise<G2FirmwareFlashResult>
1312
+ /**
1313
+ * Select the OTA manifest used by subsequent update checks and installs.
1314
+ * The URL may point at Glassly's hosted manifest or any customer-controlled HTTP(S) server.
1315
+ */
1316
+ setOtaVersionUrl(otaVersionUrl: string): void
1317
+ /** Return the configured or release-embedded OTA manifest URL. Rejects when a source build is unconfigured. */
1318
+ getOtaVersionUrl(): string
1319
+ /** Fetch the configured OTA manifest and return whether any ASG/BES/MTK update is available. */
1320
+ checkForOtaUpdate(): Promise<boolean>
1321
+ /** Return bundled release changelogs crossed between two coordinated product versions, newest first. */
1322
+ getReleaseChangelogs(fromVersion?: string | null, toVersion?: string | null): ReleaseChangelog[]
1323
+ /** Start OTA from the configured or explicitly supplied manifest URL. */
1324
+ startOtaUpdate(otaVersionUrl?: string | null): Promise<OtaStartAckEvent>
1325
+ /** Query the active OTA session and return the correlated status response. */
1326
+ queryOtaStatus(): Promise<OtaQueryResult>
1327
+ startAr99OtaFromFile(path: string): Promise<boolean>
1328
+ cancelAr99Ota(): Promise<void>
1329
+ sendAr99FactoryReset(): Promise<void>
1330
+ buildAr99OtaSignature(
1331
+ secret: string,
1332
+ appName: string,
1333
+ currentVersion: string,
1334
+ serialNumber: string,
1335
+ nonce: string,
1336
+ ): string
1337
+
1338
+ // // stt commands (MOVE TO CRUST)
1339
+ // setSttModelDetails(path: string, languageCode: string): Promise<void>
1340
+ // getSttModelPath(): Promise<string>
1341
+ // checkSttModelAvailable(): Promise<boolean>
1342
+ // validateSttModel(path: string): Promise<boolean>
1343
+ // extractTarBz2(sourcePath: string, destinationPath: string): Promise<boolean>
1344
+
1345
+ // // tts commands (MOVE TO CRUST)
1346
+ // setTtsModelDetails(path: string, languageCode: string): Promise<void>
1347
+ // getTtsModelPath(): Promise<string>
1348
+ // getTtsModelLanguage(): Promise<string>
1349
+ // checkTtsModelAvailable(): Promise<boolean>
1350
+ // validateTtsModel(path: string): Promise<boolean>
1351
+ // generateTtsAudio(text: string, path: string, outputPath: string, speakerId: number, speed: number): Promise<boolean>
1352
+
1353
+ // STT Commands (TODO: MOVE TO CRUST)
1354
+ setSttModelDetails(path: string, languageCode: string): Promise<void>
1355
+ getSttModelPath(): Promise<string>
1356
+ checkSttModelAvailable(): Promise<boolean>
1357
+ validateSttModel(path: string): Promise<boolean>
1358
+ extractTarBz2(sourcePath: string, destinationPath: string): Promise<boolean>
1359
+ restartTranscriber(): Promise<void>
1360
+
1361
+ // TTS Commands (TODO: MOVE TO CRUST)
1362
+ setTtsModelDetails(path: string, languageCode: string): Promise<void>
1363
+ getTtsModelPath(): Promise<string>
1364
+ getTtsModelLanguage(): Promise<string>
1365
+ checkTtsModelAvailable(): Promise<boolean>
1366
+ validateTtsModel(path: string): Promise<boolean>
1367
+ generateTtsAudio(
1368
+ text: string,
1369
+ modelPath: string,
1370
+ outputPath: string,
1371
+ speakerId: number,
1372
+ speed: number,
1373
+ ): Promise<boolean>
1374
+ }
1375
+
1376
+ // OTA update status types
1377
+ export type OtaStage = "download" | "install"
1378
+ export type OtaProgressStatus = "STARTED" | "PROGRESS" | "FINISHED" | "FAILED"
1379
+
1380
+ export interface OtaStatus {
1381
+ sessionId: string
1382
+ totalSteps: number
1383
+ currentStep: number
1384
+ stepType: "apk" | "mtk" | "bes"
1385
+ phase: "download" | "install"
1386
+ stepPercent: number
1387
+ overallPercent: number
1388
+ status: "in_progress" | "step_complete" | "complete" | "failed" | "idle"
1389
+ error?: string
1390
+ }
1391
+
1392
+ export interface OtaUpdateInfo {
1393
+ available: boolean
1394
+ versionCode: number
1395
+ versionName: string
1396
+ updates: string[] // ["apk", "mtk", "bes"]
1397
+ totalSize: number
1398
+ cacheReady?: boolean
1399
+ /** Exact BES target selected from the OTA manifest, when a BES step is pending. */
1400
+ besVersion?: string
1401
+ /** True when the APK step installs an older build than the glasses currently run (exact-pin manifests only). */
1402
+ isDowngrade?: boolean
1403
+ }
1404
+
1405
+ export interface ReleaseChangelog {
1406
+ /** Base production version, for example `3.1.0`. */
1407
+ version: string
1408
+ /** Markdown body authored in `/changelogs/<version>.md`. */
1409
+ markdown: string
1410
+ }
1411
+
1412
+ export interface OtaProgress {
1413
+ stage: OtaStage
1414
+ status: OtaProgressStatus
1415
+ progress: number
1416
+ bytesDownloaded: number
1417
+ totalBytes: number
1418
+ currentUpdate: string
1419
+ errorMessage?: string
1420
+ }
1421
+
1422
+ export interface GlassesStatus {
1423
+ // state:
1424
+ connection: GlassesConnectionStatus
1425
+ micEnabled: boolean
1426
+ voiceActivityDetectionEnabled: boolean
1427
+ bluetoothClassicConnected: boolean
1428
+ signalStrength: number
1429
+ /** Milliseconds since epoch when signalStrength was last refreshed by the phone BLE stack. */
1430
+ signalStrengthUpdatedAt: number
1431
+ // device info
1432
+ deviceModel: string
1433
+ androidVersion: string
1434
+ firmwareVersion: string
1435
+ besFirmwareVersion: string
1436
+ mtkFirmwareVersion: string
1437
+ bluetoothMacAddress: string
1438
+ wifiMacAddress: string
1439
+ leftMacAddress: string
1440
+ rightMacAddress: string
1441
+ buildNumber: string
1442
+ /** Glasses System.currentTimeMillis() from last version_info (clock skew detection). */
1443
+ systemTimeMs?: number
1444
+ otaVersionUrl: string
1445
+ appVersion: string
1446
+ /** Phone-served hotspot OTA protocol version; 0 means unsupported/legacy glasses. */
1447
+ hotspotOtaVersion: number
1448
+ bluetoothName: string
1449
+ serialNumber: string
1450
+ style: string
1451
+ color: string
1452
+ /**
1453
+ * Scene canvas the connected firmware renders, when it differs from the
1454
+ * model profile (G2 Glassly CFW: 640×480 direct framebuffer). 0/absent ⇒
1455
+ * use the model's canvas.
1456
+ */
1457
+ sceneCanvasWidth?: number
1458
+ sceneCanvasHeight?: number
1459
+ // wifi info
1460
+ wifi: WifiStatus
1461
+ // battery info
1462
+ batteryLevel: number
1463
+ charging: boolean
1464
+ caseBatteryLevel: number
1465
+ caseCharging: boolean
1466
+ caseOpen: boolean
1467
+ caseRemoved: boolean
1468
+ // hotspot info
1469
+ hotspot: HotspotStatus
1470
+ // OTA update info
1471
+ otaUpdateAvailable: OtaUpdateInfo | null
1472
+ otaProgress: OtaProgress | null
1473
+ otaInProgress: boolean
1474
+ // ring info
1475
+ controllerConnected: boolean
1476
+ controllerFullyBooted: boolean
1477
+ controllerMacAddress: string
1478
+ controllerBatteryLevel: number
1479
+ controllerSignalStrength: number
1480
+ }
1481
+
1482
+ export interface CoreDashboardMenuItem {
1483
+ name: string
1484
+ packageName: string
1485
+ running: boolean
1486
+ }
1487
+
1488
+ export interface CalendarEvent {
1489
+ title: string
1490
+ location?: string
1491
+ time: string
1492
+ endDate: number
1493
+ }
1494
+
1495
+ export interface CoreSettings {
1496
+ menu_apps: CoreDashboardMenuItem[]
1497
+ calendar_events: CalendarEvent[]
1498
+ }
1499
+
1500
+ export interface Device {
1501
+ /**
1502
+ * Stable app-facing key for this scan result, within the limits of the
1503
+ * platform identifier available to the SDK. Do not parse this value; use the
1504
+ * typed model, name, address, projectName, and rssi fields instead.
1505
+ */
1506
+ id: string
1507
+ model: DeviceModel
1508
+ name: string
1509
+ /** Platform address/identifier when available: Android Bluetooth address, iOS CoreBluetooth identifier. */
1510
+ address?: string
1511
+ /** Optional AR99 project discriminator. Supported value: AR99. */
1512
+ projectName?: string
1513
+ /**
1514
+ * Optional scan signal strength. It may be undefined at first discovery and
1515
+ * appear in a later scan update when the platform reports RSSI metadata.
1516
+ */
1517
+ rssi?: number
1518
+ /** Mentra Live: unit is currently in pairing mode (adv flag). */
1519
+ pairingMode?: boolean
1520
+ /** Mentra Live: four-character hex spoken pairing code when available. */
1521
+ pairingCode?: string
1522
+ /** Mentra Live: advertisement carries the secure-pairing capability trailer. */
1523
+ securePairingCapable?: boolean
1524
+ }
1525
+
1526
+ export interface ConnectOptions {
1527
+ saveAsDefault?: boolean
1528
+ cancelExistingConnectionAttempt?: boolean
1529
+ }
1530
+
1531
+ export type ScanResultsCallback = (devices: Device[]) => void
1532
+
1533
+ export interface ScanOptions {
1534
+ model: DeviceModel
1535
+ /** Defaults to 15000. */
1536
+ timeoutMs?: number
1537
+ /** Alias for `timeoutMs`, useful when mirroring native examples. */
1538
+ timeout?: number
1539
+ /** Called every time the discovered device list changes during the scan. */
1540
+ onResults?: ScanResultsCallback
1541
+ }
1542
+
1543
+ export type ScanModelOptions = Omit<ScanOptions, "model">
1544
+
1545
+ export interface WifiSearchResult {
1546
+ ssid: string
1547
+ requiresPassword: boolean
1548
+ signalStrength: number
1549
+ /** Frequency in MHz (from glasses scan). 5 GHz band is typically 5170闂?825. Omitted if unknown. */
1550
+ frequency?: number
1551
+ }
1552
+
1553
+ export interface BluetoothStatus {
1554
+ // state:
1555
+ searching: boolean
1556
+ searchingController: boolean
1557
+ default_wearable?: DeviceModel | ""
1558
+ pending_wearable?: DeviceModel | ""
1559
+ device_name?: string
1560
+ device_address?: string
1561
+ default_controller?: DeviceModel | ""
1562
+ pending_controller?: DeviceModel | ""
1563
+ controller_device_name?: string
1564
+ controller_address?: string
1565
+ systemMicUnavailable: boolean
1566
+ micRanking: MicMode[]
1567
+ currentMic: MicMode | "" | null
1568
+ /**
1569
+ * Nearby glasses in stable discovery order.
1570
+ * Existing entries keep their array position as details refresh; new glasses append at the end,
1571
+ * and removals should not reorder remaining entries.
1572
+ */
1573
+ searchResults: Device[]
1574
+ wifiScanResults: WifiSearchResult[]
1575
+ lastLog: string[]
1576
+ otherBtConnected: boolean
1577
+ // desired settings the SDK sends to compatible connected glasses:
1578
+ galleryModeEnabled: boolean
1579
+ }
1580
+
1581
+ export type BluetoothSettingsUpdate = Partial<{
1582
+ auth_email: string
1583
+ core_token: string
1584
+ sensing_enabled: boolean
1585
+ power_saving_mode: boolean
1586
+ lc3_frame_size: number
1587
+ preferred_mic: MicPreference
1588
+ screen_disabled: boolean
1589
+ contextual_dashboard: boolean
1590
+ head_up_angle: number
1591
+ imu_enabled: boolean
1592
+ brightness: number
1593
+ auto_brightness: boolean
1594
+ dashboard_height: number
1595
+ dashboard_depth: number
1596
+ menu_apps: DashboardMenuItem[] | CoreDashboardMenuItem[] | Array<Record<string, unknown>> | null
1597
+ calendar_events: CalendarEvent[]
1598
+ metric_system: boolean
1599
+ twelve_hour_time: boolean
1600
+ gallery_mode: boolean
1601
+ voice_activity_detection_enabled: boolean
1602
+ loudness_gate_enabled: boolean
1603
+ button_photo_size: ButtonPhotoSize
1604
+ button_video_settings: {width: number; height: number; fps: number}
1605
+ button_video_width: number
1606
+ button_video_height: number
1607
+ button_video_fps: number
1608
+ button_max_recording_time: number
1609
+ camera_fov: NativeCameraFovSetting
1610
+ should_send_pcm: boolean
1611
+ should_send_lc3: boolean
1612
+ should_send_transcript: boolean
1613
+ offline_mode: boolean
1614
+ local_stt_fallback_active: boolean
1615
+ pending_wearable: DeviceModel | ""
1616
+ default_wearable: DeviceModel | ""
1617
+ device_name: string
1618
+ device_address: string
1619
+ default_controller: DeviceModel | ""
1620
+ pending_controller: DeviceModel | ""
1621
+ controller_device_name: string
1622
+ controller_address: string
1623
+ }>