@mentra/engine 0.1.0-dev.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (787) hide show
  1. package/README.md +79 -0
  2. package/build/devtools.d.ts +11 -0
  3. package/build/devtools.d.ts.map +1 -0
  4. package/build/devtools.js +13 -0
  5. package/build/devtools.js.map +1 -0
  6. package/build/engine.d.ts +261 -0
  7. package/build/engine.d.ts.map +1 -0
  8. package/build/engine.js +170 -0
  9. package/build/engine.js.map +1 -0
  10. package/build/facades/dev.d.ts +57 -0
  11. package/build/facades/dev.d.ts.map +1 -0
  12. package/build/facades/dev.js +187 -0
  13. package/build/facades/dev.js.map +1 -0
  14. package/build/facades/display.d.ts +21 -0
  15. package/build/facades/display.d.ts.map +1 -0
  16. package/build/facades/display.js +17 -0
  17. package/build/facades/display.js.map +1 -0
  18. package/build/facades/displayMirror.d.ts +15 -0
  19. package/build/facades/displayMirror.d.ts.map +1 -0
  20. package/build/facades/displayMirror.js +29 -0
  21. package/build/facades/displayMirror.js.map +1 -0
  22. package/build/facades/gallery.d.ts +62 -0
  23. package/build/facades/gallery.d.ts.map +1 -0
  24. package/build/facades/gallery.js +61 -0
  25. package/build/facades/gallery.js.map +1 -0
  26. package/build/facades/glasses.d.ts +141 -0
  27. package/build/facades/glasses.d.ts.map +1 -0
  28. package/build/facades/glasses.js +199 -0
  29. package/build/facades/glasses.js.map +1 -0
  30. package/build/facades/glassesSettings.d.ts +13 -0
  31. package/build/facades/glassesSettings.d.ts.map +1 -0
  32. package/build/facades/glassesSettings.js +54 -0
  33. package/build/facades/glassesSettings.js.map +1 -0
  34. package/build/facades/glassesWifi.d.ts +25 -0
  35. package/build/facades/glassesWifi.d.ts.map +1 -0
  36. package/build/facades/glassesWifi.js +57 -0
  37. package/build/facades/glassesWifi.js.map +1 -0
  38. package/build/facades/miniapps.d.ts +43 -0
  39. package/build/facades/miniapps.d.ts.map +1 -0
  40. package/build/facades/miniapps.js +49 -0
  41. package/build/facades/miniapps.js.map +1 -0
  42. package/build/facades/notifications.d.ts +13 -0
  43. package/build/facades/notifications.d.ts.map +1 -0
  44. package/build/facades/notifications.js +12 -0
  45. package/build/facades/notifications.js.map +1 -0
  46. package/build/facades/ota.d.ts +103 -0
  47. package/build/facades/ota.d.ts.map +1 -0
  48. package/build/facades/ota.js +156 -0
  49. package/build/facades/ota.js.map +1 -0
  50. package/build/facades/pairing.d.ts +114 -0
  51. package/build/facades/pairing.d.ts.map +1 -0
  52. package/build/facades/pairing.js +275 -0
  53. package/build/facades/pairing.js.map +1 -0
  54. package/build/facades/permissions.d.ts +23 -0
  55. package/build/facades/permissions.d.ts.map +1 -0
  56. package/build/facades/permissions.js +145 -0
  57. package/build/facades/permissions.js.map +1 -0
  58. package/build/facades/phoneNotifications.d.ts +21 -0
  59. package/build/facades/phoneNotifications.d.ts.map +1 -0
  60. package/build/facades/phoneNotifications.js +51 -0
  61. package/build/facades/phoneNotifications.js.map +1 -0
  62. package/build/facades/reports.d.ts +36 -0
  63. package/build/facades/reports.d.ts.map +1 -0
  64. package/build/facades/reports.js +134 -0
  65. package/build/facades/reports.js.map +1 -0
  66. package/build/facades/session.d.ts +21 -0
  67. package/build/facades/session.d.ts.map +1 -0
  68. package/build/facades/session.js +52 -0
  69. package/build/facades/session.js.map +1 -0
  70. package/build/facades/settings.d.ts +37 -0
  71. package/build/facades/settings.d.ts.map +1 -0
  72. package/build/facades/settings.js +55 -0
  73. package/build/facades/settings.js.map +1 -0
  74. package/build/facades/speech.d.ts +30 -0
  75. package/build/facades/speech.d.ts.map +1 -0
  76. package/build/facades/speech.js +37 -0
  77. package/build/facades/speech.js.map +1 -0
  78. package/build/index.d.ts +43 -0
  79. package/build/index.d.ts.map +1 -0
  80. package/build/index.js +45 -0
  81. package/build/index.js.map +1 -0
  82. package/build/internal.d.ts +66 -0
  83. package/build/internal.d.ts.map +1 -0
  84. package/build/internal.js +89 -0
  85. package/build/internal.js.map +1 -0
  86. package/build/runtime/bootstrap.d.ts +83 -0
  87. package/build/runtime/bootstrap.d.ts.map +1 -0
  88. package/build/runtime/bootstrap.js +56 -0
  89. package/build/runtime/bootstrap.js.map +1 -0
  90. package/build/runtime/config.d.ts +146 -0
  91. package/build/runtime/config.d.ts.map +1 -0
  92. package/build/runtime/config.js +18 -0
  93. package/build/runtime/config.js.map +1 -0
  94. package/build/runtime/streamConfig.d.ts +4 -0
  95. package/build/runtime/streamConfig.d.ts.map +1 -0
  96. package/build/runtime/streamConfig.js +38 -0
  97. package/build/runtime/streamConfig.js.map +1 -0
  98. package/build/services/AppRegistry.d.ts +303 -0
  99. package/build/services/AppRegistry.d.ts.map +1 -0
  100. package/build/services/AppRegistry.js +1029 -0
  101. package/build/services/AppRegistry.js.map +1 -0
  102. package/build/services/AudioCloudUplink.d.ts +3 -0
  103. package/build/services/AudioCloudUplink.d.ts.map +1 -0
  104. package/build/services/AudioCloudUplink.js +33 -0
  105. package/build/services/AudioCloudUplink.js.map +1 -0
  106. package/build/services/AudioPlaybackService.d.ts +144 -0
  107. package/build/services/AudioPlaybackService.d.ts.map +1 -0
  108. package/build/services/AudioPlaybackService.js +533 -0
  109. package/build/services/AudioPlaybackService.js.map +1 -0
  110. package/build/services/AutomaticReportResult.d.ts +20 -0
  111. package/build/services/AutomaticReportResult.d.ts.map +1 -0
  112. package/build/services/AutomaticReportResult.js +29 -0
  113. package/build/services/AutomaticReportResult.js.map +1 -0
  114. package/build/services/BlobStore.d.ts +91 -0
  115. package/build/services/BlobStore.d.ts.map +1 -0
  116. package/build/services/BlobStore.js +668 -0
  117. package/build/services/BlobStore.js.map +1 -0
  118. package/build/services/CaptionsTesterReportService.d.ts +4 -0
  119. package/build/services/CaptionsTesterReportService.d.ts.map +1 -0
  120. package/build/services/CaptionsTesterReportService.js +80 -0
  121. package/build/services/CaptionsTesterReportService.js.map +1 -0
  122. package/build/services/CloudAudioSubscriptionSync.d.ts +24 -0
  123. package/build/services/CloudAudioSubscriptionSync.d.ts.map +1 -0
  124. package/build/services/CloudAudioSubscriptionSync.js +39 -0
  125. package/build/services/CloudAudioSubscriptionSync.js.map +1 -0
  126. package/build/services/CloudClientService.d.ts +143 -0
  127. package/build/services/CloudClientService.d.ts.map +1 -0
  128. package/build/services/CloudClientService.js +627 -0
  129. package/build/services/CloudClientService.js.map +1 -0
  130. package/build/services/CloudTranscriptE2EMetrics.d.ts +4 -0
  131. package/build/services/CloudTranscriptE2EMetrics.d.ts.map +1 -0
  132. package/build/services/CloudTranscriptE2EMetrics.js +24 -0
  133. package/build/services/CloudTranscriptE2EMetrics.js.map +1 -0
  134. package/build/services/ConnectionCoordinator.d.ts +51 -0
  135. package/build/services/ConnectionCoordinator.d.ts.map +1 -0
  136. package/build/services/ConnectionCoordinator.js +34 -0
  137. package/build/services/ConnectionCoordinator.js.map +1 -0
  138. package/build/services/DevServerBridge.d.ts +63 -0
  139. package/build/services/DevServerBridge.d.ts.map +1 -0
  140. package/build/services/DevServerBridge.js +294 -0
  141. package/build/services/DevServerBridge.js.map +1 -0
  142. package/build/services/DeviceEventRouter.d.ts +3 -0
  143. package/build/services/DeviceEventRouter.d.ts.map +1 -0
  144. package/build/services/DeviceEventRouter.js +190 -0
  145. package/build/services/DeviceEventRouter.js.map +1 -0
  146. package/build/services/DeviceStoreHydration.d.ts +38 -0
  147. package/build/services/DeviceStoreHydration.d.ts.map +1 -0
  148. package/build/services/DeviceStoreHydration.js +124 -0
  149. package/build/services/DeviceStoreHydration.js.map +1 -0
  150. package/build/services/DisplayProcessor.d.ts +223 -0
  151. package/build/services/DisplayProcessor.d.ts.map +1 -0
  152. package/build/services/DisplayProcessor.js +552 -0
  153. package/build/services/DisplayProcessor.js.map +1 -0
  154. package/build/services/GlassesReadiness.d.ts +41 -0
  155. package/build/services/GlassesReadiness.d.ts.map +1 -0
  156. package/build/services/GlassesReadiness.js +82 -0
  157. package/build/services/GlassesReadiness.js.map +1 -0
  158. package/build/services/GlassesSettingsSync.d.ts +33 -0
  159. package/build/services/GlassesSettingsSync.d.ts.map +1 -0
  160. package/build/services/GlassesSettingsSync.js +121 -0
  161. package/build/services/GlassesSettingsSync.js.map +1 -0
  162. package/build/services/GlassesStatusProjection.d.ts +3 -0
  163. package/build/services/GlassesStatusProjection.d.ts.map +1 -0
  164. package/build/services/GlassesStatusProjection.js +65 -0
  165. package/build/services/GlassesStatusProjection.js.map +1 -0
  166. package/build/services/HeadingService.d.ts +27 -0
  167. package/build/services/HeadingService.d.ts.map +1 -0
  168. package/build/services/HeadingService.js +96 -0
  169. package/build/services/HeadingService.js.map +1 -0
  170. package/build/services/LocalDisplayManager.d.ts +139 -0
  171. package/build/services/LocalDisplayManager.d.ts.map +1 -0
  172. package/build/services/LocalDisplayManager.js +579 -0
  173. package/build/services/LocalDisplayManager.js.map +1 -0
  174. package/build/services/LocalMiniappRuntime.d.ts +433 -0
  175. package/build/services/LocalMiniappRuntime.d.ts.map +1 -0
  176. package/build/services/LocalMiniappRuntime.js +3561 -0
  177. package/build/services/LocalMiniappRuntime.js.map +1 -0
  178. package/build/services/LocalSttFallbackCoordinator.d.ts +54 -0
  179. package/build/services/LocalSttFallbackCoordinator.d.ts.map +1 -0
  180. package/build/services/LocalSttFallbackCoordinator.js +131 -0
  181. package/build/services/LocalSttFallbackCoordinator.js.map +1 -0
  182. package/build/services/MentraJSCrashController.d.ts +97 -0
  183. package/build/services/MentraJSCrashController.d.ts.map +1 -0
  184. package/build/services/MentraJSCrashController.js +138 -0
  185. package/build/services/MentraJSCrashController.js.map +1 -0
  186. package/build/services/MentraJSCrashloopReportService.d.ts +9 -0
  187. package/build/services/MentraJSCrashloopReportService.d.ts.map +1 -0
  188. package/build/services/MentraJSCrashloopReportService.js +54 -0
  189. package/build/services/MentraJSCrashloopReportService.js.map +1 -0
  190. package/build/services/MentraJSLogPipeline.d.ts +87 -0
  191. package/build/services/MentraJSLogPipeline.d.ts.map +1 -0
  192. package/build/services/MentraJSLogPipeline.js +137 -0
  193. package/build/services/MentraJSLogPipeline.js.map +1 -0
  194. package/build/services/MentraJSRouter.d.ts +203 -0
  195. package/build/services/MentraJSRouter.d.ts.map +1 -0
  196. package/build/services/MentraJSRouter.js +480 -0
  197. package/build/services/MentraJSRouter.js.map +1 -0
  198. package/build/services/MentraUIRouter.d.ts +137 -0
  199. package/build/services/MentraUIRouter.d.ts.map +1 -0
  200. package/build/services/MentraUIRouter.js +210 -0
  201. package/build/services/MentraUIRouter.js.map +1 -0
  202. package/build/services/MicStateCoordinator.d.ts +37 -0
  203. package/build/services/MicStateCoordinator.d.ts.map +1 -0
  204. package/build/services/MicStateCoordinator.js +81 -0
  205. package/build/services/MicStateCoordinator.js.map +1 -0
  206. package/build/services/MiniappEngine.d.ts +31 -0
  207. package/build/services/MiniappEngine.d.ts.map +1 -0
  208. package/build/services/MiniappEngine.js +119 -0
  209. package/build/services/MiniappEngine.js.map +1 -0
  210. package/build/services/MiniappLauncher.d.ts +129 -0
  211. package/build/services/MiniappLauncher.d.ts.map +1 -0
  212. package/build/services/MiniappLauncher.js +291 -0
  213. package/build/services/MiniappLauncher.js.map +1 -0
  214. package/build/services/MiniappRunningRegistry.d.ts +24 -0
  215. package/build/services/MiniappRunningRegistry.d.ts.map +1 -0
  216. package/build/services/MiniappRunningRegistry.js +52 -0
  217. package/build/services/MiniappRunningRegistry.js.map +1 -0
  218. package/build/services/NavigationHandlers.d.ts +90 -0
  219. package/build/services/NavigationHandlers.d.ts.map +1 -0
  220. package/build/services/NavigationHandlers.js +379 -0
  221. package/build/services/NavigationHandlers.js.map +1 -0
  222. package/build/services/NavigationService.d.ts +254 -0
  223. package/build/services/NavigationService.d.ts.map +1 -0
  224. package/build/services/NavigationService.js +553 -0
  225. package/build/services/NavigationService.js.map +1 -0
  226. package/build/services/NotificationsEmitter.d.ts +28 -0
  227. package/build/services/NotificationsEmitter.d.ts.map +1 -0
  228. package/build/services/NotificationsEmitter.js +22 -0
  229. package/build/services/NotificationsEmitter.js.map +1 -0
  230. package/build/services/OfflineSpeechModelService.d.ts +33 -0
  231. package/build/services/OfflineSpeechModelService.d.ts.map +1 -0
  232. package/build/services/OfflineSpeechModelService.js +136 -0
  233. package/build/services/OfflineSpeechModelService.js.map +1 -0
  234. package/build/services/OtaInstallCoordinator.d.ts +195 -0
  235. package/build/services/OtaInstallCoordinator.d.ts.map +1 -0
  236. package/build/services/OtaInstallCoordinator.js +1047 -0
  237. package/build/services/OtaInstallCoordinator.js.map +1 -0
  238. package/build/services/OtaService.d.ts +3 -0
  239. package/build/services/OtaService.d.ts.map +1 -0
  240. package/build/services/OtaService.js +65 -0
  241. package/build/services/OtaService.js.map +1 -0
  242. package/build/services/OtaUpdateCheckService.d.ts +65 -0
  243. package/build/services/OtaUpdateCheckService.d.ts.map +1 -0
  244. package/build/services/OtaUpdateCheckService.js +260 -0
  245. package/build/services/OtaUpdateCheckService.js.map +1 -0
  246. package/build/services/PairingIdentity.d.ts +80 -0
  247. package/build/services/PairingIdentity.d.ts.map +1 -0
  248. package/build/services/PairingIdentity.js +145 -0
  249. package/build/services/PairingIdentity.js.map +1 -0
  250. package/build/services/PhoneLocationService.d.ts +36 -0
  251. package/build/services/PhoneLocationService.d.ts.map +1 -0
  252. package/build/services/PhoneLocationService.js +115 -0
  253. package/build/services/PhoneLocationService.js.map +1 -0
  254. package/build/services/PhoneNotificationsSync.d.ts +3 -0
  255. package/build/services/PhoneNotificationsSync.d.ts.map +1 -0
  256. package/build/services/PhoneNotificationsSync.js +35 -0
  257. package/build/services/PhoneNotificationsSync.js.map +1 -0
  258. package/build/services/PhonePhotoCoordinator.d.ts +86 -0
  259. package/build/services/PhonePhotoCoordinator.d.ts.map +1 -0
  260. package/build/services/PhonePhotoCoordinator.js +274 -0
  261. package/build/services/PhonePhotoCoordinator.js.map +1 -0
  262. package/build/services/PhoneStreamCoordinator.d.ts +168 -0
  263. package/build/services/PhoneStreamCoordinator.d.ts.map +1 -0
  264. package/build/services/PhoneStreamCoordinator.js +632 -0
  265. package/build/services/PhoneStreamCoordinator.js.map +1 -0
  266. package/build/services/PhoneVideoCoordinator.d.ts +50 -0
  267. package/build/services/PhoneVideoCoordinator.d.ts.map +1 -0
  268. package/build/services/PhoneVideoCoordinator.js +147 -0
  269. package/build/services/PhoneVideoCoordinator.js.map +1 -0
  270. package/build/services/STTModelManager.d.ts +65 -0
  271. package/build/services/STTModelManager.d.ts.map +1 -0
  272. package/build/services/STTModelManager.js +292 -0
  273. package/build/services/STTModelManager.js.map +1 -0
  274. package/build/services/SceneRenderer.d.ts +90 -0
  275. package/build/services/SceneRenderer.d.ts.map +1 -0
  276. package/build/services/SceneRenderer.js +248 -0
  277. package/build/services/SceneRenderer.js.map +1 -0
  278. package/build/services/StreamLifecycleController.d.ts +67 -0
  279. package/build/services/StreamLifecycleController.d.ts.map +1 -0
  280. package/build/services/StreamLifecycleController.js +152 -0
  281. package/build/services/StreamLifecycleController.js.map +1 -0
  282. package/build/services/TTSModelManager.d.ts +90 -0
  283. package/build/services/TTSModelManager.d.ts.map +1 -0
  284. package/build/services/TTSModelManager.js +366 -0
  285. package/build/services/TTSModelManager.js.map +1 -0
  286. package/build/services/WebviewBridge.d.ts +22 -0
  287. package/build/services/WebviewBridge.d.ts.map +1 -0
  288. package/build/services/WebviewBridge.js +47 -0
  289. package/build/services/WebviewBridge.js.map +1 -0
  290. package/build/services/asg/GalleryMediaIntegrityReportService.d.ts +17 -0
  291. package/build/services/asg/GalleryMediaIntegrityReportService.d.ts.map +1 -0
  292. package/build/services/asg/GalleryMediaIntegrityReportService.js +43 -0
  293. package/build/services/asg/GalleryMediaIntegrityReportService.js.map +1 -0
  294. package/build/services/asg/asgCameraApi.d.ts +165 -0
  295. package/build/services/asg/asgCameraApi.d.ts.map +1 -0
  296. package/build/services/asg/asgCameraApi.js +997 -0
  297. package/build/services/asg/asgCameraApi.js.map +1 -0
  298. package/build/services/asg/galleryMediaValidation.d.ts +29 -0
  299. package/build/services/asg/galleryMediaValidation.d.ts.map +1 -0
  300. package/build/services/asg/galleryMediaValidation.js +149 -0
  301. package/build/services/asg/galleryMediaValidation.js.map +1 -0
  302. package/build/services/asg/galleryNotices.d.ts +33 -0
  303. package/build/services/asg/galleryNotices.d.ts.map +1 -0
  304. package/build/services/asg/galleryNotices.js +29 -0
  305. package/build/services/asg/galleryNotices.js.map +1 -0
  306. package/build/services/asg/gallerySettingsService.d.ts +19 -0
  307. package/build/services/asg/gallerySettingsService.d.ts.map +1 -0
  308. package/build/services/asg/gallerySettingsService.js +51 -0
  309. package/build/services/asg/gallerySettingsService.js.map +1 -0
  310. package/build/services/asg/gallerySyncNotifications.d.ts +56 -0
  311. package/build/services/asg/gallerySyncNotifications.d.ts.map +1 -0
  312. package/build/services/asg/gallerySyncNotifications.js +198 -0
  313. package/build/services/asg/gallerySyncNotifications.js.map +1 -0
  314. package/build/services/asg/gallerySyncService.d.ts +137 -0
  315. package/build/services/asg/gallerySyncService.d.ts.map +1 -0
  316. package/build/services/asg/gallerySyncService.js +1839 -0
  317. package/build/services/asg/gallerySyncService.js.map +1 -0
  318. package/build/services/asg/localStorageService.d.ts +128 -0
  319. package/build/services/asg/localStorageService.d.ts.map +1 -0
  320. package/build/services/asg/localStorageService.js +423 -0
  321. package/build/services/asg/localStorageService.js.map +1 -0
  322. package/build/services/asg/mediaProcessingQueue.d.ts +60 -0
  323. package/build/services/asg/mediaProcessingQueue.d.ts.map +1 -0
  324. package/build/services/asg/mediaProcessingQueue.js +320 -0
  325. package/build/services/asg/mediaProcessingQueue.js.map +1 -0
  326. package/build/services/asgOtaVersionUrl.d.ts +2 -0
  327. package/build/services/asgOtaVersionUrl.d.ts.map +1 -0
  328. package/build/services/asgOtaVersionUrl.js +36 -0
  329. package/build/services/asgOtaVersionUrl.js.map +1 -0
  330. package/build/services/blobPaths.d.ts +31 -0
  331. package/build/services/blobPaths.d.ts.map +1 -0
  332. package/build/services/blobPaths.js +86 -0
  333. package/build/services/blobPaths.js.map +1 -0
  334. package/build/services/cloudStreamApi.d.ts +59 -0
  335. package/build/services/cloudStreamApi.d.ts.map +1 -0
  336. package/build/services/cloudStreamApi.js +81 -0
  337. package/build/services/cloudStreamApi.js.map +1 -0
  338. package/build/services/gallerySyncClock.d.ts +17 -0
  339. package/build/services/gallerySyncClock.d.ts.map +1 -0
  340. package/build/services/gallerySyncClock.js +21 -0
  341. package/build/services/gallerySyncClock.js.map +1 -0
  342. package/build/services/glassesClockSync.d.ts +20 -0
  343. package/build/services/glassesClockSync.d.ts.map +1 -0
  344. package/build/services/glassesClockSync.js +97 -0
  345. package/build/services/glassesClockSync.js.map +1 -0
  346. package/build/services/manifestVersionGate.d.ts +28 -0
  347. package/build/services/manifestVersionGate.d.ts.map +1 -0
  348. package/build/services/manifestVersionGate.js +41 -0
  349. package/build/services/manifestVersionGate.js.map +1 -0
  350. package/build/services/mentraUiShim.d.ts +38 -0
  351. package/build/services/mentraUiShim.d.ts.map +1 -0
  352. package/build/services/mentraUiShim.js +360 -0
  353. package/build/services/mentraUiShim.js.map +1 -0
  354. package/build/services/navigation/roadNameResolver.d.ts +67 -0
  355. package/build/services/navigation/roadNameResolver.d.ts.map +1 -0
  356. package/build/services/navigation/roadNameResolver.js +96 -0
  357. package/build/services/navigation/roadNameResolver.js.map +1 -0
  358. package/build/services/navigation/routesApiCodec.d.ts +38 -0
  359. package/build/services/navigation/routesApiCodec.d.ts.map +1 -0
  360. package/build/services/navigation/routesApiCodec.js +68 -0
  361. package/build/services/navigation/routesApiCodec.js.map +1 -0
  362. package/build/services/otaDisplayState.d.ts +42 -0
  363. package/build/services/otaDisplayState.d.ts.map +1 -0
  364. package/build/services/otaDisplayState.js +92 -0
  365. package/build/services/otaDisplayState.js.map +1 -0
  366. package/build/services/otaInstallPolicy.d.ts +81 -0
  367. package/build/services/otaInstallPolicy.d.ts.map +1 -0
  368. package/build/services/otaInstallPolicy.js +96 -0
  369. package/build/services/otaInstallPolicy.js.map +1 -0
  370. package/build/services/otaLegacyMapping.d.ts +22 -0
  371. package/build/services/otaLegacyMapping.d.ts.map +1 -0
  372. package/build/services/otaLegacyMapping.js +56 -0
  373. package/build/services/otaLegacyMapping.js.map +1 -0
  374. package/build/services/slimStreamStatus.d.ts +7 -0
  375. package/build/services/slimStreamStatus.d.ts.map +1 -0
  376. package/build/services/slimStreamStatus.js +26 -0
  377. package/build/services/slimStreamStatus.js.map +1 -0
  378. package/build/stores/apps.d.ts +104 -0
  379. package/build/stores/apps.d.ts.map +1 -0
  380. package/build/stores/apps.js +492 -0
  381. package/build/stores/apps.js.map +1 -0
  382. package/build/stores/bluetoothSettingKeys.d.ts +4 -0
  383. package/build/stores/bluetoothSettingKeys.d.ts.map +1 -0
  384. package/build/stores/bluetoothSettingKeys.js +31 -0
  385. package/build/stores/bluetoothSettingKeys.js.map +1 -0
  386. package/build/stores/cloudClientStatus.d.ts +9 -0
  387. package/build/stores/cloudClientStatus.d.ts.map +1 -0
  388. package/build/stores/cloudClientStatus.js +24 -0
  389. package/build/stores/cloudClientStatus.js.map +1 -0
  390. package/build/stores/connection.d.ts +22 -0
  391. package/build/stores/connection.d.ts.map +1 -0
  392. package/build/stores/connection.js +43 -0
  393. package/build/stores/connection.js.map +1 -0
  394. package/build/stores/core.d.ts +15 -0
  395. package/build/stores/core.d.ts.map +1 -0
  396. package/build/stores/core.js +21 -0
  397. package/build/stores/core.js.map +1 -0
  398. package/build/stores/display.d.ts +24 -0
  399. package/build/stores/display.d.ts.map +1 -0
  400. package/build/stores/display.js +96 -0
  401. package/build/stores/display.js.map +1 -0
  402. package/build/stores/gallerySync.d.ts +101 -0
  403. package/build/stores/gallerySync.d.ts.map +1 -0
  404. package/build/stores/gallerySync.js +217 -0
  405. package/build/stores/gallerySync.js.map +1 -0
  406. package/build/stores/glasses.d.ts +62 -0
  407. package/build/stores/glasses.d.ts.map +1 -0
  408. package/build/stores/glasses.js +203 -0
  409. package/build/stores/glasses.js.map +1 -0
  410. package/build/stores/settings.d.ts +37 -0
  411. package/build/stores/settings.d.ts.map +1 -0
  412. package/build/stores/settings.js +915 -0
  413. package/build/stores/settings.js.map +1 -0
  414. package/build/types/applet.d.ts +96 -0
  415. package/build/types/applet.d.ts.map +1 -0
  416. package/build/types/applet.js +5 -0
  417. package/build/types/applet.js.map +1 -0
  418. package/build/types/asg.d.ts +46 -0
  419. package/build/types/asg.d.ts.map +1 -0
  420. package/build/types/asg.js +2 -0
  421. package/build/types/asg.js.map +1 -0
  422. package/build/types/capabilities/even-realities-g1.d.ts +12 -0
  423. package/build/types/capabilities/even-realities-g1.d.ts.map +1 -0
  424. package/build/types/capabilities/even-realities-g1.js +55 -0
  425. package/build/types/capabilities/even-realities-g1.js.map +1 -0
  426. package/build/types/capabilities/even-realities-g2.d.ts +12 -0
  427. package/build/types/capabilities/even-realities-g2.d.ts.map +1 -0
  428. package/build/types/capabilities/even-realities-g2.js +75 -0
  429. package/build/types/capabilities/even-realities-g2.js.map +1 -0
  430. package/build/types/capabilities/mentra-display.d.ts +12 -0
  431. package/build/types/capabilities/mentra-display.d.ts.map +1 -0
  432. package/build/types/capabilities/mentra-display.js +63 -0
  433. package/build/types/capabilities/mentra-display.js.map +1 -0
  434. package/build/types/capabilities/mentra-live.d.ts +12 -0
  435. package/build/types/capabilities/mentra-live.d.ts.map +1 -0
  436. package/build/types/capabilities/mentra-live.js +92 -0
  437. package/build/types/capabilities/mentra-live.js.map +1 -0
  438. package/build/types/capabilities/none.d.ts +13 -0
  439. package/build/types/capabilities/none.d.ts.map +1 -0
  440. package/build/types/capabilities/none.js +65 -0
  441. package/build/types/capabilities/none.js.map +1 -0
  442. package/build/types/capabilities/simulated-glasses.d.ts +13 -0
  443. package/build/types/capabilities/simulated-glasses.d.ts.map +1 -0
  444. package/build/types/capabilities/simulated-glasses.js +65 -0
  445. package/build/types/capabilities/simulated-glasses.js.map +1 -0
  446. package/build/types/capabilities/vuzix-z100.d.ts +12 -0
  447. package/build/types/capabilities/vuzix-z100.d.ts.map +1 -0
  448. package/build/types/capabilities/vuzix-z100.js +52 -0
  449. package/build/types/capabilities/vuzix-z100.js.map +1 -0
  450. package/build/types/enums.d.ts +40 -0
  451. package/build/types/enums.d.ts.map +1 -0
  452. package/build/types/enums.js +44 -0
  453. package/build/types/enums.js.map +1 -0
  454. package/build/types/hardware.d.ts +160 -0
  455. package/build/types/hardware.d.ts.map +1 -0
  456. package/build/types/hardware.js +36 -0
  457. package/build/types/hardware.js.map +1 -0
  458. package/build/types/index.d.ts +11 -0
  459. package/build/types/index.d.ts.map +1 -0
  460. package/build/types/index.js +10 -0
  461. package/build/types/index.js.map +1 -0
  462. package/build/utils/GlobalEventEmitter.d.ts +10 -0
  463. package/build/utils/GlobalEventEmitter.d.ts.map +1 -0
  464. package/build/utils/GlobalEventEmitter.js +13 -0
  465. package/build/utils/GlobalEventEmitter.js.map +1 -0
  466. package/build/utils/cloudClient/RnUdpAdapter.d.ts +3 -0
  467. package/build/utils/cloudClient/RnUdpAdapter.d.ts.map +1 -0
  468. package/build/utils/cloudClient/RnUdpAdapter.js +41 -0
  469. package/build/utils/cloudClient/RnUdpAdapter.js.map +1 -0
  470. package/build/utils/cloudClient/cloudSecureStore.d.ts +3 -0
  471. package/build/utils/cloudClient/cloudSecureStore.d.ts.map +1 -0
  472. package/build/utils/cloudClient/cloudSecureStore.js +26 -0
  473. package/build/utils/cloudClient/cloudSecureStore.js.map +1 -0
  474. package/build/utils/debouncedPatch.d.ts +6 -0
  475. package/build/utils/debouncedPatch.d.ts.map +1 -0
  476. package/build/utils/debouncedPatch.js +25 -0
  477. package/build/utils/debouncedPatch.js.map +1 -0
  478. package/build/utils/devLogging.d.ts +26 -0
  479. package/build/utils/devLogging.d.ts.map +1 -0
  480. package/build/utils/devLogging.js +116 -0
  481. package/build/utils/devLogging.js.map +1 -0
  482. package/build/utils/devMiniappLaunch.d.ts +44 -0
  483. package/build/utils/devMiniappLaunch.d.ts.map +1 -0
  484. package/build/utils/devMiniappLaunch.js +52 -0
  485. package/build/utils/devMiniappLaunch.js.map +1 -0
  486. package/build/utils/diagnosticContext.d.ts +3 -0
  487. package/build/utils/diagnosticContext.d.ts.map +1 -0
  488. package/build/utils/diagnosticContext.js +119 -0
  489. package/build/utils/diagnosticContext.js.map +1 -0
  490. package/build/utils/display/composer/ColumnComposer.d.ts +131 -0
  491. package/build/utils/display/composer/ColumnComposer.d.ts.map +1 -0
  492. package/build/utils/display/composer/ColumnComposer.js +204 -0
  493. package/build/utils/display/composer/ColumnComposer.js.map +1 -0
  494. package/build/utils/display/composer/index.d.ts +9 -0
  495. package/build/utils/display/composer/index.d.ts.map +1 -0
  496. package/build/utils/display/composer/index.js +9 -0
  497. package/build/utils/display/composer/index.js.map +1 -0
  498. package/build/utils/display/helpers/DisplayHelpers.d.ts +165 -0
  499. package/build/utils/display/helpers/DisplayHelpers.d.ts.map +1 -0
  500. package/build/utils/display/helpers/DisplayHelpers.js +312 -0
  501. package/build/utils/display/helpers/DisplayHelpers.js.map +1 -0
  502. package/build/utils/display/helpers/ScrollView.d.ts +183 -0
  503. package/build/utils/display/helpers/ScrollView.d.ts.map +1 -0
  504. package/build/utils/display/helpers/ScrollView.js +257 -0
  505. package/build/utils/display/helpers/ScrollView.js.map +1 -0
  506. package/build/utils/display/helpers/index.d.ts +11 -0
  507. package/build/utils/display/helpers/index.d.ts.map +1 -0
  508. package/build/utils/display/helpers/index.js +10 -0
  509. package/build/utils/display/helpers/index.js.map +1 -0
  510. package/build/utils/display/index.d.ts +174 -0
  511. package/build/utils/display/index.d.ts.map +1 -0
  512. package/build/utils/display/index.js +185 -0
  513. package/build/utils/display/index.js.map +1 -0
  514. package/build/utils/display/measurer/TextMeasurer.d.ts +160 -0
  515. package/build/utils/display/measurer/TextMeasurer.d.ts.map +1 -0
  516. package/build/utils/display/measurer/TextMeasurer.js +273 -0
  517. package/build/utils/display/measurer/TextMeasurer.js.map +1 -0
  518. package/build/utils/display/measurer/index.d.ts +10 -0
  519. package/build/utils/display/measurer/index.d.ts.map +1 -0
  520. package/build/utils/display/measurer/index.js +11 -0
  521. package/build/utils/display/measurer/index.js.map +1 -0
  522. package/build/utils/display/measurer/script-detection.d.ts +53 -0
  523. package/build/utils/display/measurer/script-detection.d.ts.map +1 -0
  524. package/build/utils/display/measurer/script-detection.js +184 -0
  525. package/build/utils/display/measurer/script-detection.js.map +1 -0
  526. package/build/utils/display/profiles/g1.d.ts +33 -0
  527. package/build/utils/display/profiles/g1.d.ts.map +1 -0
  528. package/build/utils/display/profiles/g1.js +213 -0
  529. package/build/utils/display/profiles/g1.js.map +1 -0
  530. package/build/utils/display/profiles/g2.d.ts +13 -0
  531. package/build/utils/display/profiles/g2.d.ts.map +1 -0
  532. package/build/utils/display/profiles/g2.js +34 -0
  533. package/build/utils/display/profiles/g2.js.map +1 -0
  534. package/build/utils/display/profiles/index.d.ts +12 -0
  535. package/build/utils/display/profiles/index.d.ts.map +1 -0
  536. package/build/utils/display/profiles/index.js +15 -0
  537. package/build/utils/display/profiles/index.js.map +1 -0
  538. package/build/utils/display/profiles/nex.d.ts +10 -0
  539. package/build/utils/display/profiles/nex.d.ts.map +1 -0
  540. package/build/utils/display/profiles/nex.js +150 -0
  541. package/build/utils/display/profiles/nex.js.map +1 -0
  542. package/build/utils/display/profiles/types.d.ts +103 -0
  543. package/build/utils/display/profiles/types.d.ts.map +1 -0
  544. package/build/utils/display/profiles/types.js +2 -0
  545. package/build/utils/display/profiles/types.js.map +1 -0
  546. package/build/utils/display/profiles/z100.d.ts +33 -0
  547. package/build/utils/display/profiles/z100.d.ts.map +1 -0
  548. package/build/utils/display/profiles/z100.js +182 -0
  549. package/build/utils/display/profiles/z100.js.map +1 -0
  550. package/build/utils/display/scene/degrade.d.ts +25 -0
  551. package/build/utils/display/scene/degrade.d.ts.map +1 -0
  552. package/build/utils/display/scene/degrade.js +64 -0
  553. package/build/utils/display/scene/degrade.js.map +1 -0
  554. package/build/utils/display/scene/differ.d.ts +38 -0
  555. package/build/utils/display/scene/differ.d.ts.map +1 -0
  556. package/build/utils/display/scene/differ.js +107 -0
  557. package/build/utils/display/scene/differ.js.map +1 -0
  558. package/build/utils/display/scene/index.d.ts +10 -0
  559. package/build/utils/display/scene/index.d.ts.map +1 -0
  560. package/build/utils/display/scene/index.js +6 -0
  561. package/build/utils/display/scene/index.js.map +1 -0
  562. package/build/utils/display/scene/process.d.ts +35 -0
  563. package/build/utils/display/scene/process.d.ts.map +1 -0
  564. package/build/utils/display/scene/process.js +187 -0
  565. package/build/utils/display/scene/process.js.map +1 -0
  566. package/build/utils/display/scene/store.d.ts +48 -0
  567. package/build/utils/display/scene/store.d.ts.map +1 -0
  568. package/build/utils/display/scene/store.js +0 -0
  569. package/build/utils/display/scene/store.js.map +1 -0
  570. package/build/utils/display/scene/types.d.ts +120 -0
  571. package/build/utils/display/scene/types.d.ts.map +1 -0
  572. package/build/utils/display/scene/types.js +0 -0
  573. package/build/utils/display/scene/types.js.map +1 -0
  574. package/build/utils/display/wrapper/TextWrapper.d.ts +102 -0
  575. package/build/utils/display/wrapper/TextWrapper.d.ts.map +1 -0
  576. package/build/utils/display/wrapper/TextWrapper.js +471 -0
  577. package/build/utils/display/wrapper/TextWrapper.js.map +1 -0
  578. package/build/utils/display/wrapper/index.d.ts +12 -0
  579. package/build/utils/display/wrapper/index.d.ts.map +1 -0
  580. package/build/utils/display/wrapper/index.js +12 -0
  581. package/build/utils/display/wrapper/index.js.map +1 -0
  582. package/build/utils/display/wrapper/types.d.ts +75 -0
  583. package/build/utils/display/wrapper/types.d.ts.map +1 -0
  584. package/build/utils/display/wrapper/types.js +11 -0
  585. package/build/utils/display/wrapper/types.js.map +1 -0
  586. package/build/utils/e2eMetrics.d.ts +6 -0
  587. package/build/utils/e2eMetrics.d.ts.map +1 -0
  588. package/build/utils/e2eMetrics.js +27 -0
  589. package/build/utils/e2eMetrics.js.map +1 -0
  590. package/build/utils/hardware/hardware.d.ts +42 -0
  591. package/build/utils/hardware/hardware.d.ts.map +1 -0
  592. package/build/utils/hardware/hardware.js +127 -0
  593. package/build/utils/hardware/hardware.js.map +1 -0
  594. package/build/utils/hardware/index.d.ts +2 -0
  595. package/build/utils/hardware/index.d.ts.map +1 -0
  596. package/build/utils/hardware/index.js +2 -0
  597. package/build/utils/hardware/index.js.map +1 -0
  598. package/build/utils/miniappGlobals.d.ts +60 -0
  599. package/build/utils/miniappGlobals.d.ts.map +1 -0
  600. package/build/utils/miniappGlobals.js +224 -0
  601. package/build/utils/miniappGlobals.js.map +1 -0
  602. package/build/utils/permissions/MediaLibraryPermissions.d.ts +34 -0
  603. package/build/utils/permissions/MediaLibraryPermissions.d.ts.map +1 -0
  604. package/build/utils/permissions/MediaLibraryPermissions.js +122 -0
  605. package/build/utils/permissions/MediaLibraryPermissions.js.map +1 -0
  606. package/build/utils/permissions/galleryDisplayName.d.ts +8 -0
  607. package/build/utils/permissions/galleryDisplayName.d.ts.map +1 -0
  608. package/build/utils/permissions/galleryDisplayName.js +25 -0
  609. package/build/utils/permissions/galleryDisplayName.js.map +1 -0
  610. package/build/utils/storage/index.d.ts +3 -0
  611. package/build/utils/storage/index.d.ts.map +1 -0
  612. package/build/utils/storage/index.js +3 -0
  613. package/build/utils/storage/index.js.map +1 -0
  614. package/build/utils/storage/storage.d.ts +24 -0
  615. package/build/utils/storage/storage.d.ts.map +1 -0
  616. package/build/utils/storage/storage.js +85 -0
  617. package/build/utils/storage/storage.js.map +1 -0
  618. package/build/utils/storage/zip.d.ts +3 -0
  619. package/build/utils/storage/zip.d.ts.map +1 -0
  620. package/build/utils/storage/zip.js +14 -0
  621. package/build/utils/storage/zip.js.map +1 -0
  622. package/build/utils/timers/index.d.ts +3 -0
  623. package/build/utils/timers/index.d.ts.map +1 -0
  624. package/build/utils/timers/index.js +3 -0
  625. package/build/utils/timers/index.js.map +1 -0
  626. package/build/utils/timers/timers.d.ts +9 -0
  627. package/build/utils/timers/timers.d.ts.map +1 -0
  628. package/build/utils/timers/timers.js +105 -0
  629. package/build/utils/timers/timers.js.map +1 -0
  630. package/package.json +119 -0
  631. package/src/devtools.ts +13 -0
  632. package/src/engine.ts +173 -0
  633. package/src/facades/dev.ts +197 -0
  634. package/src/facades/display.ts +17 -0
  635. package/src/facades/displayMirror.ts +33 -0
  636. package/src/facades/gallery.ts +69 -0
  637. package/src/facades/glasses.ts +206 -0
  638. package/src/facades/glassesSettings.ts +56 -0
  639. package/src/facades/glassesWifi.ts +68 -0
  640. package/src/facades/miniapps.ts +55 -0
  641. package/src/facades/notifications.ts +15 -0
  642. package/src/facades/ota.ts +174 -0
  643. package/src/facades/pairing.ts +329 -0
  644. package/src/facades/permissions.ts +151 -0
  645. package/src/facades/phoneNotifications.ts +50 -0
  646. package/src/facades/reports.ts +185 -0
  647. package/src/facades/session.ts +55 -0
  648. package/src/facades/settings.ts +57 -0
  649. package/src/facades/speech.ts +38 -0
  650. package/src/index.ts +191 -0
  651. package/src/internal.ts +158 -0
  652. package/src/runtime/bootstrap.ts +118 -0
  653. package/src/runtime/config.ts +147 -0
  654. package/src/runtime/streamConfig.ts +34 -0
  655. package/src/services/AppRegistry.ts +1139 -0
  656. package/src/services/AudioCloudUplink.ts +34 -0
  657. package/src/services/AudioPlaybackService.ts +624 -0
  658. package/src/services/AutomaticReportResult.ts +48 -0
  659. package/src/services/BlobStore.ts +746 -0
  660. package/src/services/CaptionsTesterReportService.ts +107 -0
  661. package/src/services/CloudAudioSubscriptionSync.ts +41 -0
  662. package/src/services/CloudClientService.ts +668 -0
  663. package/src/services/CloudTranscriptE2EMetrics.ts +27 -0
  664. package/src/services/ConnectionCoordinator.ts +65 -0
  665. package/src/services/DevServerBridge.ts +332 -0
  666. package/src/services/DeviceEventRouter.ts +238 -0
  667. package/src/services/DeviceStoreHydration.ts +130 -0
  668. package/src/services/DisplayProcessor.ts +775 -0
  669. package/src/services/GlassesReadiness.ts +103 -0
  670. package/src/services/GlassesSettingsSync.ts +134 -0
  671. package/src/services/GlassesStatusProjection.ts +73 -0
  672. package/src/services/HeadingService.ts +98 -0
  673. package/src/services/LocalDisplayManager.ts +703 -0
  674. package/src/services/LocalMiniappRuntime.ts +4038 -0
  675. package/src/services/LocalSttFallbackCoordinator.ts +140 -0
  676. package/src/services/MentraJSCrashController.ts +189 -0
  677. package/src/services/MentraJSCrashloopReportService.ts +66 -0
  678. package/src/services/MentraJSLogPipeline.ts +166 -0
  679. package/src/services/MentraJSRouter.ts +557 -0
  680. package/src/services/MentraUIRouter.ts +244 -0
  681. package/src/services/MicStateCoordinator.ts +94 -0
  682. package/src/services/MiniappEngine.ts +143 -0
  683. package/src/services/MiniappLauncher.ts +340 -0
  684. package/src/services/MiniappRunningRegistry.ts +57 -0
  685. package/src/services/NavigationHandlers.ts +423 -0
  686. package/src/services/NavigationService.ts +731 -0
  687. package/src/services/NotificationsEmitter.ts +48 -0
  688. package/src/services/OfflineSpeechModelService.ts +168 -0
  689. package/src/services/OtaInstallCoordinator.ts +1205 -0
  690. package/src/services/OtaService.ts +83 -0
  691. package/src/services/OtaUpdateCheckService.ts +386 -0
  692. package/src/services/PairingIdentity.ts +154 -0
  693. package/src/services/PhoneLocationService.ts +122 -0
  694. package/src/services/PhoneNotificationsSync.ts +44 -0
  695. package/src/services/PhonePhotoCoordinator.ts +337 -0
  696. package/src/services/PhoneStreamCoordinator.ts +777 -0
  697. package/src/services/PhoneVideoCoordinator.ts +189 -0
  698. package/src/services/STTModelManager.ts +360 -0
  699. package/src/services/SceneRenderer.ts +292 -0
  700. package/src/services/StreamLifecycleController.ts +213 -0
  701. package/src/services/TTSModelManager.ts +466 -0
  702. package/src/services/WebviewBridge.ts +50 -0
  703. package/src/services/asg/GalleryMediaIntegrityReportService.ts +70 -0
  704. package/src/services/asg/asgCameraApi.ts +1204 -0
  705. package/src/services/asg/galleryMediaValidation.ts +183 -0
  706. package/src/services/asg/galleryNotices.ts +60 -0
  707. package/src/services/asg/gallerySettingsService.ts +65 -0
  708. package/src/services/asg/gallerySyncNotifications.ts +236 -0
  709. package/src/services/asg/gallerySyncService.ts +2167 -0
  710. package/src/services/asg/localStorageService.ts +497 -0
  711. package/src/services/asg/mediaProcessingQueue.ts +371 -0
  712. package/src/services/asgOtaVersionUrl.ts +41 -0
  713. package/src/services/blobPaths.ts +86 -0
  714. package/src/services/cloudStreamApi.ts +154 -0
  715. package/src/services/gallerySyncClock.ts +39 -0
  716. package/src/services/glassesClockSync.ts +115 -0
  717. package/src/services/manifestVersionGate.ts +43 -0
  718. package/src/services/mentraUiShim.ts +366 -0
  719. package/src/services/navigation/roadNameResolver.ts +112 -0
  720. package/src/services/navigation/routesApiCodec.ts +69 -0
  721. package/src/services/otaDisplayState.ts +115 -0
  722. package/src/services/otaInstallPolicy.ts +106 -0
  723. package/src/services/otaLegacyMapping.ts +71 -0
  724. package/src/services/slimStreamStatus.ts +28 -0
  725. package/src/stores/apps.ts +614 -0
  726. package/src/stores/bluetoothSettingKeys.ts +36 -0
  727. package/src/stores/cloudClientStatus.ts +37 -0
  728. package/src/stores/connection.ts +69 -0
  729. package/src/stores/core.ts +32 -0
  730. package/src/stores/display.ts +121 -0
  731. package/src/stores/gallerySync.ts +380 -0
  732. package/src/stores/glasses.ts +309 -0
  733. package/src/stores/settings.ts +993 -0
  734. package/src/types/applet.ts +112 -0
  735. package/src/types/asg.ts +51 -0
  736. package/src/types/capabilities/even-realities-g1.ts +67 -0
  737. package/src/types/capabilities/even-realities-g2.ts +88 -0
  738. package/src/types/capabilities/mentra-display.ts +75 -0
  739. package/src/types/capabilities/mentra-live.ts +103 -0
  740. package/src/types/capabilities/none.ts +76 -0
  741. package/src/types/capabilities/simulated-glasses.ts +76 -0
  742. package/src/types/capabilities/vuzix-z100.ts +64 -0
  743. package/src/types/enums.ts +43 -0
  744. package/src/types/hardware.ts +203 -0
  745. package/src/types/index.ts +37 -0
  746. package/src/utils/GlobalEventEmitter.ts +14 -0
  747. package/src/utils/cloudClient/RnUdpAdapter.ts +47 -0
  748. package/src/utils/cloudClient/cloudSecureStore.ts +28 -0
  749. package/src/utils/debouncedPatch.ts +28 -0
  750. package/src/utils/devLogging.ts +140 -0
  751. package/src/utils/devMiniappLaunch.ts +68 -0
  752. package/src/utils/diagnosticContext.ts +155 -0
  753. package/src/utils/display/composer/ColumnComposer.ts +285 -0
  754. package/src/utils/display/composer/index.ts +15 -0
  755. package/src/utils/display/helpers/DisplayHelpers.ts +413 -0
  756. package/src/utils/display/helpers/ScrollView.ts +337 -0
  757. package/src/utils/display/helpers/index.ts +14 -0
  758. package/src/utils/display/index.ts +273 -0
  759. package/src/utils/display/measurer/TextMeasurer.ts +346 -0
  760. package/src/utils/display/measurer/index.ts +21 -0
  761. package/src/utils/display/measurer/script-detection.ts +218 -0
  762. package/src/utils/display/profiles/g1.ts +236 -0
  763. package/src/utils/display/profiles/g2.ts +39 -0
  764. package/src/utils/display/profiles/index.ts +28 -0
  765. package/src/utils/display/profiles/nex.ts +166 -0
  766. package/src/utils/display/profiles/types.ts +132 -0
  767. package/src/utils/display/profiles/z100.ts +198 -0
  768. package/src/utils/display/scene/degrade.ts +80 -0
  769. package/src/utils/display/scene/differ.ts +128 -0
  770. package/src/utils/display/scene/index.ts +21 -0
  771. package/src/utils/display/scene/process.ts +214 -0
  772. package/src/utils/display/scene/store.ts +0 -0
  773. package/src/utils/display/scene/types.ts +0 -0
  774. package/src/utils/display/wrapper/TextWrapper.ts +546 -0
  775. package/src/utils/display/wrapper/index.ts +15 -0
  776. package/src/utils/display/wrapper/types.ts +102 -0
  777. package/src/utils/e2eMetrics.ts +30 -0
  778. package/src/utils/hardware/hardware.ts +166 -0
  779. package/src/utils/hardware/index.ts +1 -0
  780. package/src/utils/miniappGlobals.ts +260 -0
  781. package/src/utils/permissions/MediaLibraryPermissions.ts +130 -0
  782. package/src/utils/permissions/galleryDisplayName.ts +28 -0
  783. package/src/utils/storage/index.ts +2 -0
  784. package/src/utils/storage/storage.ts +101 -0
  785. package/src/utils/storage/zip.ts +13 -0
  786. package/src/utils/timers/index.ts +2 -0
  787. package/src/utils/timers/timers.ts +139 -0
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Audio cloud uplink — engine-owned. Subscribes to the glasses' `mic_lc3` BLE frames
3
+ * and forwards each one to the v2 cloud session (`cloud.sendAudioFrame`), gated on the
4
+ * cloud being connected AND having active audio subscriptions so we don't burn the
5
+ * UDP/encrypt path when nothing upstream is listening.
6
+ *
7
+ * This is the device→cloud audio data-plane for the v2 runtime. It used to live in the
8
+ * host's MantleManager `mic_lc3` handler (the "cloud fork"); moved here so ANY host —
9
+ * including a bare OEM that never runs the v1 SocketComms plane — gets cloud
10
+ * transcription/translation, not just the first-party Mentra app.
11
+ *
12
+ * The old v1 UDP/SocketComms upload legs were removed; MantleManager only keeps
13
+ * host-side debug mic-activity tracking and on-device PCM fan-out.
14
+ *
15
+ * Started by `engine.start()`. Idempotent.
16
+ */
17
+ import BluetoothSdk from "@mentra/bluetooth-sdk/internal"
18
+ import {cloudClientService} from "./CloudClientService"
19
+
20
+ let sub: {remove: () => void} | null = null
21
+
22
+ export function startAudioCloudUplink(): void {
23
+ if (sub) return
24
+ sub = BluetoothSdk.addListener("mic_lc3", (event) => {
25
+ if (cloudClientService.isConnected() && cloudClientService.hasAudioSubscriptions()) {
26
+ cloudClientService.sendAudioFrame(new Uint8Array(event.lc3))
27
+ }
28
+ })
29
+ }
30
+
31
+ export function stopAudioCloudUplink(): void {
32
+ sub?.remove()
33
+ sub = null
34
+ }
@@ -0,0 +1,624 @@
1
+ import {createAudioPlayer, AudioPlayer, AudioStatus, setAudioModeAsync} from "expo-audio"
2
+ import BluetoothSdk from "@mentra/bluetooth-sdk/internal"
3
+ import {BgTimer} from "../utils/timers"
4
+
5
+ const RESTORE_GLASSES_VOLUME_AFTER_PLAYBACK = false
6
+
7
+ interface AudioPlayRequest {
8
+ requestId: string
9
+ audioUrl: string
10
+ appId?: string
11
+ volume?: number
12
+ stopOtherAudio?: boolean
13
+ }
14
+
15
+ interface PlaybackState {
16
+ requestId: string
17
+ appId?: string
18
+ startTime: number
19
+ completed: boolean // Guard against double callbacks
20
+ onComplete: (requestId: string, success: boolean, error: string | null, duration: number | null) => void
21
+ }
22
+
23
+ /** Open request for a live PCM output stream (miniapp speaker.createStream). */
24
+ export interface AudioStreamOpenRequest {
25
+ streamId: string
26
+ appId: string
27
+ /** PCM sample rate in Hz (16000 / 24000 / 48000). */
28
+ sampleRate: number
29
+ /** Channel count. v1 is mono. */
30
+ channels: number
31
+ volume?: number
32
+ stopOtherAudio?: boolean
33
+ /**
34
+ * Called when the stream ends for any reason (drained after close, aborted,
35
+ * interrupted by other audio, or native error).
36
+ */
37
+ onEnded: (streamId: string, success: boolean, error: string | null, durationMs: number | null) => void
38
+ }
39
+
40
+ /** One live PCM stream session, backed by native streaming audio. */
41
+ interface StreamState {
42
+ streamId: string
43
+ appId: string
44
+ startTime: number
45
+ ended: boolean // Guard against double onEnded
46
+ onEnded: AudioStreamOpenRequest["onEnded"]
47
+ }
48
+
49
+ class AudioPlaybackService {
50
+ private static instance: AudioPlaybackService | null = null
51
+ // Reuse a single AudioPlayer to avoid AudioTrack exhaustion
52
+ // Creating new ExoPlayer instances per request leads to -12 ENOMEM errors
53
+ private player: AudioPlayer | null = null
54
+ private currentPlayback: PlaybackState | null = null
55
+ // Live PCM streams (speaker.createStream), keyed by streamId. The runtime
56
+ // enforces one per app; stopOtherAudio interrupts across apps.
57
+ private streams = new Map<string, StreamState>()
58
+ private audioModeConfigured: boolean = false
59
+ // Debounce timer for notifying native that audio stopped
60
+ // Prevents mic toggle flicker when playing back-to-back audio
61
+ // Uses BgTimer to work reliably when app is backgrounded on Android
62
+ private audioStopDebounceTimer: number | null = null
63
+ // Original glasses media volume captured before we bump it for A2DP playback.
64
+ private glassesVolumeRestoreLevel: number | null = null
65
+ private static readonly AUDIO_STOP_DEBOUNCE_MS = 1500
66
+ private static readonly A2DP_TAIL_DRAIN_MS = 900
67
+ /** If glasses report step volume at or below this, bump to FLOOR before A2DP playback. */
68
+ private static readonly GLASSES_VOLUME_LOW_THRESHOLD = 2
69
+ private static readonly GLASSES_VOLUME_FLOOR = 9
70
+
71
+ private constructor() {}
72
+
73
+ /**
74
+ * Configure audio mode for playback, re-asserting it on EVERY play.
75
+ *
76
+ * This must run before each play — not just once — because other parts of the
77
+ * app put the shared iOS AVAudioSession into a record-oriented category and
78
+ * never restore it. In particular the phone mic (PhoneMic.swift) switches the
79
+ * session to `.playAndRecord` (sometimes `.voiceChat`/earpiece routing) while
80
+ * capturing and only deactivates it on stop, leaving the category sticky. A
81
+ * miniapp like the Recorder records and then immediately plays back through
82
+ * this service; if we kept the old "configure once" guard, playback would land
83
+ * in the leftover `.playAndRecord` session and be inaudible on the phone
84
+ * speaker (the symptom: the progress bar runs but no sound comes out). Calling
85
+ * setAudioModeAsync with no `allowsRecording` maps to category `.playback`,
86
+ * reclaiming the speaker route. `audioModeConfigured` is kept only to gate the
87
+ * one-time log.
88
+ */
89
+ private async ensureAudioModeConfigured(): Promise<void> {
90
+ try {
91
+ await setAudioModeAsync({
92
+ shouldPlayInBackground: true,
93
+ playsInSilentMode: true,
94
+ interruptionMode: "duckOthers",
95
+ })
96
+ if (!this.audioModeConfigured) {
97
+ this.audioModeConfigured = true
98
+ console.log("AUDIO: Audio mode configured for playback")
99
+ }
100
+ } catch (error) {
101
+ console.error("AUDIO: Failed to configure audio mode:", error)
102
+ // Don't block playback if audio mode config fails
103
+ }
104
+ }
105
+
106
+ public static getInstance(): AudioPlaybackService {
107
+ if (!AudioPlaybackService.instance) {
108
+ AudioPlaybackService.instance = new AudioPlaybackService()
109
+ }
110
+ return AudioPlaybackService.instance
111
+ }
112
+
113
+ /**
114
+ * Ensure we have a reusable player instance
115
+ */
116
+ private ensurePlayer(): AudioPlayer {
117
+ if (!this.player) {
118
+ console.log("AUDIO: Creating reusable AudioPlayer instance")
119
+ this.player = createAudioPlayer(null)
120
+
121
+ // Add status listener once - it will handle all playback completions
122
+ this.player.addListener("playbackStatusUpdate", (status: AudioStatus) => {
123
+ this.onPlaybackStatusUpdate(status)
124
+ })
125
+ }
126
+ return this.player
127
+ }
128
+
129
+ private async getGlassesMediaVolumeWithTiming() {
130
+ const startedAt = Date.now()
131
+ try {
132
+ const result = await BluetoothSdk.getGlassesMediaVolume()
133
+ console.log(`AUDIO: Glasses media volume read completed in ${Date.now() - startedAt}ms`)
134
+ return result
135
+ } catch (error) {
136
+ console.warn(
137
+ `AUDIO: Glasses media volume read failed after ${Date.now() - startedAt}ms:`,
138
+ error instanceof Error ? error.message : String(error),
139
+ )
140
+ throw error
141
+ }
142
+ }
143
+
144
+ private async setGlassesMediaVolumeWithTiming(level: number) {
145
+ const startedAt = Date.now()
146
+ try {
147
+ const result = await BluetoothSdk.setGlassesMediaVolume(level)
148
+ console.log(`AUDIO: Glasses media volume set(${level}) completed in ${Date.now() - startedAt}ms`)
149
+ return result
150
+ } catch (error) {
151
+ console.warn(
152
+ `AUDIO: Glasses media volume set(${level}) failed after ${Date.now() - startedAt}ms:`,
153
+ error instanceof Error ? error.message : String(error),
154
+ )
155
+ throw error
156
+ }
157
+ }
158
+
159
+ /**
160
+ * Mentra Live: raise glasses media volume over BLE when it is very low so A2DP prompts are audible.
161
+ * Fail-open on unsupported devices, timeouts, or errors.
162
+ */
163
+ private async ensureGlassesMediaVolumeForA2dp(playback: PlaybackState): Promise<void> {
164
+ if (this.glassesVolumeRestoreLevel !== null) {
165
+ console.log(
166
+ `AUDIO: Keeping bumped glasses media volume at ${AudioPlaybackService.GLASSES_VOLUME_FLOOR} during ongoing playback`,
167
+ )
168
+ return
169
+ }
170
+
171
+ try {
172
+ const raw = await this.getGlassesMediaVolumeWithTiming()
173
+ const level = Number(raw.level)
174
+ const statusCode = Number(raw.statusCode)
175
+ if (!Number.isFinite(level)) {
176
+ console.log("AUDIO: Received glasses media volume response without numeric level:", JSON.stringify(raw))
177
+ return
178
+ }
179
+ const k900S = Number.isFinite(statusCode) && statusCode >= 0 ? ` K900_S=${statusCode}` : ""
180
+ console.log(`AUDIO: Glasses media step volume (wearable knob, 0-15 scale): ${level}/15.${k900S}`)
181
+ if (level > AudioPlaybackService.GLASSES_VOLUME_LOW_THRESHOLD) {
182
+ return
183
+ }
184
+ if (this.currentPlayback !== playback || playback.completed) {
185
+ console.log("AUDIO: Skipping glasses volume bump; playback already ended")
186
+ return
187
+ }
188
+ console.log(`AUDIO: Raising glasses media volume (was ${level})`)
189
+ await this.setGlassesMediaVolumeWithTiming(AudioPlaybackService.GLASSES_VOLUME_FLOOR)
190
+ if (this.currentPlayback === playback && !playback.completed) {
191
+ this.glassesVolumeRestoreLevel = level
192
+ } else if (RESTORE_GLASSES_VOLUME_AFTER_PLAYBACK) {
193
+ console.log("AUDIO: Restoring glasses volume immediately; playback ended during volume bump")
194
+ await this.setGlassesMediaVolumeWithTiming(level)
195
+ } else {
196
+ console.log("AUDIO: Leaving bumped glasses media volume unchanged after playback")
197
+ }
198
+ } catch (e) {
199
+ const msg = e instanceof Error ? e.message : String(e)
200
+ console.warn("AUDIO: Skipping glasses volume bump:", msg)
201
+ }
202
+ }
203
+
204
+ /**
205
+ * Restore the user's original glasses media step volume after A2DP playback finishes.
206
+ */
207
+ private async restoreGlassesMediaVolume(): Promise<void> {
208
+ const restoreLevel = this.glassesVolumeRestoreLevel
209
+ if (restoreLevel === null) {
210
+ return
211
+ }
212
+ if (!RESTORE_GLASSES_VOLUME_AFTER_PLAYBACK) {
213
+ this.glassesVolumeRestoreLevel = null
214
+ console.log("AUDIO: Leaving bumped glasses media volume unchanged after playback")
215
+ return
216
+ }
217
+
218
+ try {
219
+ console.log(`AUDIO: Restoring glasses media volume to ${restoreLevel}`)
220
+ await this.setGlassesMediaVolumeWithTiming(restoreLevel)
221
+ } catch (e) {
222
+ const msg = e instanceof Error ? e.message : String(e)
223
+ console.warn(`AUDIO: Failed to restore glasses volume to ${restoreLevel}:`, msg)
224
+ } finally {
225
+ this.glassesVolumeRestoreLevel = null
226
+ }
227
+ }
228
+
229
+ private pauseFinishedPlayerAfterTail(playback: PlaybackState): void {
230
+ BgTimer.setTimeout(() => {
231
+ if (this.currentPlayback) return
232
+ if (!this.player) return
233
+ try {
234
+ this.player.pause()
235
+ console.log(
236
+ `AUDIO: Paused finished player for ${playback.requestId} after ${AudioPlaybackService.A2DP_TAIL_DRAIN_MS}ms tail drain`,
237
+ )
238
+ } catch (e) {
239
+ console.warn("AUDIO: Error pausing player after tail drain:", e)
240
+ }
241
+ }, AudioPlaybackService.A2DP_TAIL_DRAIN_MS)
242
+ }
243
+
244
+ /**
245
+ * Play audio from a URL.
246
+ * Returns a promise that resolves with playback result when audio finishes or errors.
247
+ */
248
+ public async play(
249
+ request: AudioPlayRequest,
250
+ onComplete: (requestId: string, success: boolean, error: string | null, duration: number | null) => void,
251
+ ): Promise<void> {
252
+ const {requestId, audioUrl, appId, volume = 1.0, stopOtherAudio = true} = request
253
+
254
+ console.log(`AUDIO: Play request ${requestId}${appId ? ` from ${appId}` : ""}: ${audioUrl}`)
255
+
256
+ try {
257
+ // Ensure audio mode is configured for background playback
258
+ await this.ensureAudioModeConfigured()
259
+
260
+ // Stop current playback if any (notify previous callback)
261
+ if (stopOtherAudio && this.currentPlayback && !this.currentPlayback.completed) {
262
+ console.log(`AUDIO: Interrupting current playback for new request`)
263
+ this.interruptCurrentPlayback(true)
264
+ }
265
+ // Live PCM streams count as "other audio" too.
266
+ if (stopOtherAudio) {
267
+ await this.abortAllStreams()
268
+ }
269
+
270
+ // Get or create the reusable player
271
+ const player = this.ensurePlayer()
272
+
273
+ // Set volume
274
+ player.volume = Math.max(0, Math.min(1, volume))
275
+
276
+ // Store the new playback state
277
+ const playback: PlaybackState = {
278
+ requestId,
279
+ appId,
280
+ startTime: Date.now(),
281
+ completed: false,
282
+ onComplete,
283
+ }
284
+ this.currentPlayback = playback
285
+
286
+ // Replace the source and play
287
+ // Using replace() reuses the existing ExoPlayer/AudioTrack instead of creating new ones
288
+ player.replace({uri: audioUrl})
289
+ player.play()
290
+
291
+ // Mentra Live volume reads can block up to 5s when the glasses don't
292
+ // answer. Do not put that in front of playback; guard it against late
293
+ // completion so a stale volume response cannot bump after this request is
294
+ // already over.
295
+ void this.ensureGlassesMediaVolumeForA2dp(playback)
296
+
297
+ // Notify native that our app is playing audio
298
+ // Used to suspend LC3 mic during audio playback to avoid MCU overload
299
+ // Cancel any pending "stop" notification first (handles back-to-back audio)
300
+ if (this.audioStopDebounceTimer !== null) {
301
+ BgTimer.clearTimeout(this.audioStopDebounceTimer)
302
+ this.audioStopDebounceTimer = null
303
+ }
304
+ BluetoothSdk.setOwnAppAudioPlaying(true).catch((e) => {
305
+ console.warn("AUDIO: Failed to notify native of audio start:", e)
306
+ })
307
+
308
+ console.log(`AUDIO: Started playback for ${requestId}`)
309
+ } catch (error) {
310
+ const errorMessage = error instanceof Error ? error.message : "Unknown error loading audio"
311
+ console.error(`AUDIO: Failed to play ${requestId}:`, errorMessage)
312
+ void this.restoreGlassesMediaVolume()
313
+ onComplete(requestId, false, errorMessage, null)
314
+ }
315
+ }
316
+
317
+ /**
318
+ * Interrupt current playback and notify its callback
319
+ */
320
+ private interruptCurrentPlayback(preserveGlassesMediaVolume: boolean = false): void {
321
+ if (!this.currentPlayback || this.currentPlayback.completed) return
322
+
323
+ const playback = this.currentPlayback
324
+ playback.completed = true
325
+ this.currentPlayback = null
326
+
327
+ // Stop the player
328
+ if (this.player) {
329
+ try {
330
+ this.player.pause()
331
+ } catch (error) {
332
+ console.error("AUDIO: Error pausing player:", error)
333
+ }
334
+ }
335
+
336
+ // Notify native that our app stopped playing audio (debounced)
337
+ this.notifyAudioStopDebounced()
338
+ if (!preserveGlassesMediaVolume) {
339
+ void this.restoreGlassesMediaVolume()
340
+ }
341
+
342
+ // Notify that playback was interrupted
343
+ const elapsedMs = Date.now() - playback.startTime
344
+ playback.onComplete(playback.requestId, true, null, elapsedMs)
345
+ console.log(`AUDIO: Interrupted ${playback.requestId} after ${elapsedMs}ms`)
346
+ }
347
+
348
+ /**
349
+ * Handle playback status updates from expo-audio
350
+ */
351
+ private onPlaybackStatusUpdate(status: AudioStatus): void {
352
+ const playback = this.currentPlayback
353
+
354
+ // Guard against callbacks for unknown or completed playbacks
355
+ if (!playback || playback.completed) {
356
+ return
357
+ }
358
+
359
+ // Check if playback finished
360
+ if (status.didJustFinish) {
361
+ const durationMs = (status.duration || 0) * 1000 // expo-audio uses seconds
362
+ console.log(`AUDIO: Playback finished for ${playback.requestId}, duration: ${durationMs}ms`)
363
+ playback.completed = true
364
+
365
+ // ExoPlayer can report finished before an A2DP sink has audibly drained
366
+ // the last buffered audio. Pausing immediately can clip the tail on
367
+ // Mentra Live; defer cleanup unless another playback has started.
368
+ this.pauseFinishedPlayerAfterTail(playback)
369
+
370
+ playback.onComplete(playback.requestId, true, null, durationMs)
371
+ this.currentPlayback = null
372
+
373
+ // Notify native that our app stopped playing audio (debounced)
374
+ this.notifyAudioStopDebounced()
375
+ void this.restoreGlassesMediaVolume()
376
+ return
377
+ }
378
+
379
+ // Detect silent playback failures: expo-audio doesn't surface errors to JS,
380
+ // so when ExoPlayer fails to load/play a URL (network error, HTTP 500, etc.),
381
+ // the player state goes to "idle" with nothing loaded and no buffering.
382
+ // We wait 1500ms after play() to avoid false positives during initial load.
383
+ if (status.playbackState === "idle" && !status.isBuffering && !status.isLoaded) {
384
+ const elapsedMs = Date.now() - playback.startTime
385
+ if (elapsedMs > 1500) {
386
+ console.error(`AUDIO: Playback failed for ${playback.requestId} (player went idle after ${elapsedMs}ms)`)
387
+ playback.completed = true
388
+ playback.onComplete(playback.requestId, false, "Playback failed (player went idle)", null)
389
+ this.currentPlayback = null
390
+ this.notifyAudioStopDebounced()
391
+ void this.restoreGlassesMediaVolume()
392
+ }
393
+ }
394
+ }
395
+
396
+ /**
397
+ * Notify native that audio stopped, with debouncing to prevent mic toggle flicker
398
+ * when playing back-to-back audio files
399
+ */
400
+ private notifyAudioStopDebounced(): void {
401
+ // Clear any existing timer
402
+ if (this.audioStopDebounceTimer !== null) {
403
+ BgTimer.clearTimeout(this.audioStopDebounceTimer)
404
+ }
405
+
406
+ // Set a new timer - if new audio starts within this window, the timer gets cancelled
407
+ // Uses BgTimer to work reliably when app is backgrounded on Android
408
+ this.audioStopDebounceTimer = BgTimer.setTimeout(() => {
409
+ this.audioStopDebounceTimer = null
410
+ BluetoothSdk.setOwnAppAudioPlaying(false).catch((e) => {
411
+ console.warn("AUDIO: Failed to notify native of audio stop:", e)
412
+ })
413
+ }, AudioPlaybackService.AUDIO_STOP_DEBOUNCE_MS)
414
+ }
415
+
416
+ // ── live PCM output streams (miniapp speaker.createStream) ────────────────
417
+
418
+ /**
419
+ * Open a live PCM stream session. Chunks are pushed with writeStreamChunk
420
+ * into native streaming audio (AudioTrack on Android, AVAudioEngine on iOS),
421
+ * following the media route such as A2DP to connected glasses.
422
+ */
423
+ public async openStream(request: AudioStreamOpenRequest): Promise<void> {
424
+ const {streamId, appId, sampleRate, channels, volume = 1.0, stopOtherAudio = true} = request
425
+ console.log(`AUDIO: Stream open ${streamId} from ${appId}: rate=${sampleRate} ch=${channels}`)
426
+
427
+ await this.ensureAudioModeConfigured()
428
+
429
+ if (stopOtherAudio) {
430
+ if (this.currentPlayback && !this.currentPlayback.completed) {
431
+ console.log("AUDIO: Interrupting current playback for new stream")
432
+ this.interruptCurrentPlayback(true)
433
+ }
434
+ await this.abortAllStreams(streamId)
435
+ }
436
+
437
+ await BluetoothSdk.pcmStreamOpen(streamId, sampleRate, channels, Math.max(0, Math.min(1, volume)))
438
+
439
+ const stream: StreamState = {streamId, appId, startTime: Date.now(), ended: false, onEnded: request.onEnded}
440
+ this.streams.set(streamId, stream)
441
+
442
+ // Same LC3-mic-suspend dance as play(): cancel any pending "stopped"
443
+ // notification and mark our app as playing audio.
444
+ if (this.audioStopDebounceTimer !== null) {
445
+ BgTimer.clearTimeout(this.audioStopDebounceTimer)
446
+ this.audioStopDebounceTimer = null
447
+ }
448
+ BluetoothSdk.setOwnAppAudioPlaying(true).catch((e) => {
449
+ console.warn("AUDIO: Failed to notify native of stream audio start:", e)
450
+ })
451
+
452
+ // Guarded against the stream ending mid-read, same as the play() path.
453
+ void this.ensureGlassesMediaVolumeForA2dpStream(stream)
454
+ }
455
+
456
+ /**
457
+ * Append base64 PCM to an open stream. Resolves with the host-side backlog
458
+ * in ms; the native write blocks while the backlog is above the
459
+ * backpressure ceiling, so awaited writes self-throttle to realtime.
460
+ */
461
+ public async writeStreamChunk(streamId: string, base64: string): Promise<{bufferedMs: number}> {
462
+ const stream = this.streams.get(streamId)
463
+ if (!stream || stream.ended) {
464
+ throw new Error(`stream ${streamId} is not open`)
465
+ }
466
+ try {
467
+ return await BluetoothSdk.pcmStreamWrite(streamId, base64)
468
+ } catch (error) {
469
+ const message = error instanceof Error ? error.message : String(error)
470
+ this.endStream(stream, false, message, Date.now() - stream.startTime)
471
+ throw error
472
+ }
473
+ }
474
+
475
+ /** Drain the backlog, then finish. Resolves with the total played duration. */
476
+ public async closeStream(streamId: string): Promise<{durationMs?: number}> {
477
+ const stream = this.streams.get(streamId)
478
+ if (!stream || stream.ended) {
479
+ throw new Error(`stream ${streamId} is not open`)
480
+ }
481
+ try {
482
+ const result = await BluetoothSdk.pcmStreamClose(streamId)
483
+ this.endStream(stream, true, null, result?.durationMs ?? Date.now() - stream.startTime)
484
+ return result ?? {}
485
+ } catch (error) {
486
+ const message = error instanceof Error ? error.message : String(error)
487
+ this.endStream(stream, false, message, Date.now() - stream.startTime)
488
+ throw error
489
+ }
490
+ }
491
+
492
+ /** Stop immediately, dropping the backlog. Safe on unknown/ended ids. */
493
+ public async abortStream(streamId: string): Promise<void> {
494
+ const stream = this.streams.get(streamId)
495
+ await BluetoothSdk.pcmStreamAbort(streamId).catch((e) => {
496
+ console.warn(`AUDIO: Stream abort ${streamId} native call failed:`, e)
497
+ })
498
+ if (stream) {
499
+ this.endStream(stream, true, null, Date.now() - stream.startTime)
500
+ }
501
+ }
502
+
503
+ /** Abort every active stream (optionally sparing one about to replace them). */
504
+ private async abortAllStreams(exceptStreamId?: string): Promise<void> {
505
+ const streamIds = [...this.streams.values()]
506
+ .filter((stream) => stream.streamId !== exceptStreamId)
507
+ .map((stream) => stream.streamId)
508
+ await Promise.all(streamIds.map((streamId) => this.abortStream(streamId)))
509
+ }
510
+
511
+ /** Terminal bookkeeping for a stream: dedup, unregister, notify. */
512
+ private endStream(stream: StreamState, success: boolean, error: string | null, durationMs: number | null): void {
513
+ if (stream.ended) return
514
+ stream.ended = true
515
+ this.streams.delete(stream.streamId)
516
+ // Only signal "audio stopped" when nothing else is making noise.
517
+ if (this.streams.size === 0 && (!this.currentPlayback || this.currentPlayback.completed)) {
518
+ this.notifyAudioStopDebounced()
519
+ void this.restoreGlassesMediaVolume()
520
+ }
521
+ stream.onEnded(stream.streamId, success, error, durationMs)
522
+ }
523
+
524
+ /** Stream twin of ensureGlassesMediaVolumeForA2dp, guarded by stream.ended. */
525
+ private async ensureGlassesMediaVolumeForA2dpStream(stream: StreamState): Promise<void> {
526
+ if (this.glassesVolumeRestoreLevel !== null) return
527
+ try {
528
+ const raw = await this.getGlassesMediaVolumeWithTiming()
529
+ const level = Number(raw.level)
530
+ if (!Number.isFinite(level) || level > AudioPlaybackService.GLASSES_VOLUME_LOW_THRESHOLD) return
531
+ if (stream.ended) return
532
+ console.log(`AUDIO: Raising glasses media volume for stream (was ${level})`)
533
+ await this.setGlassesMediaVolumeWithTiming(AudioPlaybackService.GLASSES_VOLUME_FLOOR)
534
+ if (!stream.ended) {
535
+ this.glassesVolumeRestoreLevel = level
536
+ } else {
537
+ await this.setGlassesMediaVolumeWithTiming(level)
538
+ }
539
+ } catch (e) {
540
+ console.warn("AUDIO: Skipping glasses volume bump for stream:", e instanceof Error ? e.message : String(e))
541
+ }
542
+ }
543
+
544
+ /**
545
+ * Stop playback for a specific app.
546
+ * If appId is not provided, stops all playback.
547
+ */
548
+ public async stopForApp(appId?: string): Promise<void> {
549
+ // Abort this app's live PCM streams too (miniapp stop/disconnect path).
550
+ const streamIds = [...this.streams.values()]
551
+ .filter((stream) => !appId || stream.appId === appId)
552
+ .map((stream) => stream.streamId)
553
+ await Promise.all(streamIds.map((streamId) => this.abortStream(streamId)))
554
+
555
+ if (!this.currentPlayback || this.currentPlayback.completed) return
556
+
557
+ if (!appId || this.currentPlayback.appId === appId) {
558
+ console.log(`AUDIO: Stopping playback for app ${appId || "(all)"}`)
559
+ this.interruptCurrentPlayback()
560
+ }
561
+ }
562
+
563
+ /**
564
+ * Stop all audio playback
565
+ */
566
+ public async stopAll(): Promise<void> {
567
+ await this.abortAllStreams()
568
+ if (this.currentPlayback && !this.currentPlayback.completed) {
569
+ console.log("AUDIO: Stopping all playback")
570
+ this.interruptCurrentPlayback()
571
+ }
572
+ }
573
+
574
+ /**
575
+ * Check if audio is currently playing
576
+ */
577
+ public isPlaying(): boolean {
578
+ return (this.currentPlayback !== null && !this.currentPlayback.completed) || this.streams.size > 0
579
+ }
580
+
581
+ /**
582
+ * Get current playback app IDs (all active)
583
+ */
584
+ public getActiveAppIds(): string[] {
585
+ const appIds = new Set<string>()
586
+ if (this.currentPlayback && !this.currentPlayback.completed && this.currentPlayback.appId) {
587
+ appIds.add(this.currentPlayback.appId)
588
+ }
589
+ for (const stream of this.streams.values()) appIds.add(stream.appId)
590
+ return [...appIds]
591
+ }
592
+
593
+ /**
594
+ * Get number of active playbacks
595
+ */
596
+ public getActiveCount(): number {
597
+ return (this.currentPlayback && !this.currentPlayback.completed ? 1 : 0) + this.streams.size
598
+ }
599
+
600
+ /**
601
+ * Release the player entirely (call when app is shutting down)
602
+ */
603
+ public release(): void {
604
+ void this.abortAllStreams()
605
+ if (this.currentPlayback && !this.currentPlayback.completed) {
606
+ this.interruptCurrentPlayback()
607
+ } else {
608
+ void this.restoreGlassesMediaVolume()
609
+ }
610
+
611
+ if (this.player) {
612
+ try {
613
+ this.player.remove()
614
+ console.log("AUDIO: Released AudioPlayer")
615
+ } catch (error) {
616
+ console.error("AUDIO: Error releasing player:", error)
617
+ }
618
+ this.player = null
619
+ }
620
+ }
621
+ }
622
+
623
+ const audioPlaybackService = AudioPlaybackService.getInstance()
624
+ export default audioPlaybackService