@glassly/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 (1053) hide show
  1. package/README.md +96 -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 +336 -0
  7. package/build/engine.d.ts.map +1 -0
  8. package/build/engine.js +198 -0
  9. package/build/engine.js.map +1 -0
  10. package/build/facades/dev.d.ts +69 -0
  11. package/build/facades/dev.d.ts.map +1 -0
  12. package/build/facades/dev.js +204 -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 +142 -0
  27. package/build/facades/glasses.d.ts.map +1 -0
  28. package/build/facades/glasses.js +214 -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 +55 -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/maps.d.ts +18 -0
  39. package/build/facades/maps.d.ts.map +1 -0
  40. package/build/facades/maps.js +13 -0
  41. package/build/facades/maps.js.map +1 -0
  42. package/build/facades/memory.d.ts +38 -0
  43. package/build/facades/memory.d.ts.map +1 -0
  44. package/build/facades/memory.js +33 -0
  45. package/build/facades/memory.js.map +1 -0
  46. package/build/facades/miniapps.d.ts +47 -0
  47. package/build/facades/miniapps.d.ts.map +1 -0
  48. package/build/facades/miniapps.js +54 -0
  49. package/build/facades/miniapps.js.map +1 -0
  50. package/build/facades/notifications.d.ts +13 -0
  51. package/build/facades/notifications.d.ts.map +1 -0
  52. package/build/facades/notifications.js +12 -0
  53. package/build/facades/notifications.js.map +1 -0
  54. package/build/facades/ota.d.ts +106 -0
  55. package/build/facades/ota.d.ts.map +1 -0
  56. package/build/facades/ota.js +159 -0
  57. package/build/facades/ota.js.map +1 -0
  58. package/build/facades/pairing.d.ts +115 -0
  59. package/build/facades/pairing.d.ts.map +1 -0
  60. package/build/facades/pairing.js +275 -0
  61. package/build/facades/pairing.js.map +1 -0
  62. package/build/facades/permissions.d.ts +33 -0
  63. package/build/facades/permissions.d.ts.map +1 -0
  64. package/build/facades/permissions.js +155 -0
  65. package/build/facades/permissions.js.map +1 -0
  66. package/build/facades/phoneNotifications.d.ts +17 -0
  67. package/build/facades/phoneNotifications.d.ts.map +1 -0
  68. package/build/facades/phoneNotifications.js +41 -0
  69. package/build/facades/phoneNotifications.js.map +1 -0
  70. package/build/facades/providerKeys.d.ts +26 -0
  71. package/build/facades/providerKeys.d.ts.map +1 -0
  72. package/build/facades/providerKeys.js +26 -0
  73. package/build/facades/providerKeys.js.map +1 -0
  74. package/build/facades/reports.d.ts +36 -0
  75. package/build/facades/reports.d.ts.map +1 -0
  76. package/build/facades/reports.js +134 -0
  77. package/build/facades/reports.js.map +1 -0
  78. package/build/facades/session.d.ts +21 -0
  79. package/build/facades/session.d.ts.map +1 -0
  80. package/build/facades/session.js +52 -0
  81. package/build/facades/session.js.map +1 -0
  82. package/build/facades/settings.d.ts +37 -0
  83. package/build/facades/settings.d.ts.map +1 -0
  84. package/build/facades/settings.js +55 -0
  85. package/build/facades/settings.js.map +1 -0
  86. package/build/facades/speakers.d.ts +41 -0
  87. package/build/facades/speakers.d.ts.map +1 -0
  88. package/build/facades/speakers.js +139 -0
  89. package/build/facades/speakers.js.map +1 -0
  90. package/build/facades/speech.d.ts +44 -0
  91. package/build/facades/speech.d.ts.map +1 -0
  92. package/build/facades/speech.js +46 -0
  93. package/build/facades/speech.js.map +1 -0
  94. package/build/index.d.ts +48 -0
  95. package/build/index.d.ts.map +1 -0
  96. package/build/index.js +49 -0
  97. package/build/index.js.map +1 -0
  98. package/build/internal.d.ts +67 -0
  99. package/build/internal.d.ts.map +1 -0
  100. package/build/internal.js +90 -0
  101. package/build/internal.js.map +1 -0
  102. package/build/runtime/bootstrap.d.ts +115 -0
  103. package/build/runtime/bootstrap.d.ts.map +1 -0
  104. package/build/runtime/bootstrap.js +73 -0
  105. package/build/runtime/bootstrap.js.map +1 -0
  106. package/build/runtime/config.d.ts +152 -0
  107. package/build/runtime/config.d.ts.map +1 -0
  108. package/build/runtime/config.js +19 -0
  109. package/build/runtime/config.js.map +1 -0
  110. package/build/runtime/scanQrSeam.d.ts +7 -0
  111. package/build/runtime/scanQrSeam.d.ts.map +1 -0
  112. package/build/runtime/scanQrSeam.js +16 -0
  113. package/build/runtime/scanQrSeam.js.map +1 -0
  114. package/build/runtime/streamConfig.d.ts +4 -0
  115. package/build/runtime/streamConfig.d.ts.map +1 -0
  116. package/build/runtime/streamConfig.js +38 -0
  117. package/build/runtime/streamConfig.js.map +1 -0
  118. package/build/services/AiTierResolution.d.ts +61 -0
  119. package/build/services/AiTierResolution.d.ts.map +1 -0
  120. package/build/services/AiTierResolution.js +83 -0
  121. package/build/services/AiTierResolution.js.map +1 -0
  122. package/build/services/AppRegistry.d.ts +303 -0
  123. package/build/services/AppRegistry.d.ts.map +1 -0
  124. package/build/services/AppRegistry.js +1108 -0
  125. package/build/services/AppRegistry.js.map +1 -0
  126. package/build/services/AudioCloudUplink.d.ts +15 -0
  127. package/build/services/AudioCloudUplink.d.ts.map +1 -0
  128. package/build/services/AudioCloudUplink.js +54 -0
  129. package/build/services/AudioCloudUplink.js.map +1 -0
  130. package/build/services/AudioPlaybackService.d.ts +183 -0
  131. package/build/services/AudioPlaybackService.d.ts.map +1 -0
  132. package/build/services/AudioPlaybackService.js +750 -0
  133. package/build/services/AudioPlaybackService.js.map +1 -0
  134. package/build/services/AutomaticReportResult.d.ts +20 -0
  135. package/build/services/AutomaticReportResult.d.ts.map +1 -0
  136. package/build/services/AutomaticReportResult.js +29 -0
  137. package/build/services/AutomaticReportResult.js.map +1 -0
  138. package/build/services/BlobStore.d.ts +106 -0
  139. package/build/services/BlobStore.d.ts.map +1 -0
  140. package/build/services/BlobStore.js +741 -0
  141. package/build/services/BlobStore.js.map +1 -0
  142. package/build/services/CaptionsTesterReportService.d.ts +4 -0
  143. package/build/services/CaptionsTesterReportService.d.ts.map +1 -0
  144. package/build/services/CaptionsTesterReportService.js +80 -0
  145. package/build/services/CaptionsTesterReportService.js.map +1 -0
  146. package/build/services/CloudAudioSubscriptionSync.d.ts +24 -0
  147. package/build/services/CloudAudioSubscriptionSync.d.ts.map +1 -0
  148. package/build/services/CloudAudioSubscriptionSync.js +51 -0
  149. package/build/services/CloudAudioSubscriptionSync.js.map +1 -0
  150. package/build/services/CloudClientService.d.ts +293 -0
  151. package/build/services/CloudClientService.d.ts.map +1 -0
  152. package/build/services/CloudClientService.js +965 -0
  153. package/build/services/CloudClientService.js.map +1 -0
  154. package/build/services/CloudTranscriptE2EMetrics.d.ts +4 -0
  155. package/build/services/CloudTranscriptE2EMetrics.d.ts.map +1 -0
  156. package/build/services/CloudTranscriptE2EMetrics.js +24 -0
  157. package/build/services/CloudTranscriptE2EMetrics.js.map +1 -0
  158. package/build/services/ConnectionCoordinator.d.ts +51 -0
  159. package/build/services/ConnectionCoordinator.d.ts.map +1 -0
  160. package/build/services/ConnectionCoordinator.js +34 -0
  161. package/build/services/ConnectionCoordinator.js.map +1 -0
  162. package/build/services/DevServerBridge.d.ts +63 -0
  163. package/build/services/DevServerBridge.d.ts.map +1 -0
  164. package/build/services/DevServerBridge.js +296 -0
  165. package/build/services/DevServerBridge.js.map +1 -0
  166. package/build/services/DeviceEventRouter.d.ts +3 -0
  167. package/build/services/DeviceEventRouter.d.ts.map +1 -0
  168. package/build/services/DeviceEventRouter.js +214 -0
  169. package/build/services/DeviceEventRouter.js.map +1 -0
  170. package/build/services/DeviceStoreHydration.d.ts +38 -0
  171. package/build/services/DeviceStoreHydration.d.ts.map +1 -0
  172. package/build/services/DeviceStoreHydration.js +124 -0
  173. package/build/services/DeviceStoreHydration.js.map +1 -0
  174. package/build/services/DisplayProcessor.d.ts +223 -0
  175. package/build/services/DisplayProcessor.d.ts.map +1 -0
  176. package/build/services/DisplayProcessor.js +552 -0
  177. package/build/services/DisplayProcessor.js.map +1 -0
  178. package/build/services/ForegroundLocationPermission.d.ts +13 -0
  179. package/build/services/ForegroundLocationPermission.d.ts.map +1 -0
  180. package/build/services/ForegroundLocationPermission.js +12 -0
  181. package/build/services/ForegroundLocationPermission.js.map +1 -0
  182. package/build/services/GlassesReadiness.d.ts +41 -0
  183. package/build/services/GlassesReadiness.d.ts.map +1 -0
  184. package/build/services/GlassesReadiness.js +82 -0
  185. package/build/services/GlassesReadiness.js.map +1 -0
  186. package/build/services/GlassesSettingsSync.d.ts +33 -0
  187. package/build/services/GlassesSettingsSync.d.ts.map +1 -0
  188. package/build/services/GlassesSettingsSync.js +127 -0
  189. package/build/services/GlassesSettingsSync.js.map +1 -0
  190. package/build/services/GlassesStatusProjection.d.ts +3 -0
  191. package/build/services/GlassesStatusProjection.d.ts.map +1 -0
  192. package/build/services/GlassesStatusProjection.js +65 -0
  193. package/build/services/GlassesStatusProjection.js.map +1 -0
  194. package/build/services/HeadingService.d.ts +33 -0
  195. package/build/services/HeadingService.d.ts.map +1 -0
  196. package/build/services/HeadingService.js +123 -0
  197. package/build/services/HeadingService.js.map +1 -0
  198. package/build/services/HotspotOtaTransport.d.ts +29 -0
  199. package/build/services/HotspotOtaTransport.d.ts.map +1 -0
  200. package/build/services/HotspotOtaTransport.js +146 -0
  201. package/build/services/HotspotOtaTransport.js.map +1 -0
  202. package/build/services/HotspotShutdown.d.ts +17 -0
  203. package/build/services/HotspotShutdown.d.ts.map +1 -0
  204. package/build/services/HotspotShutdown.js +29 -0
  205. package/build/services/HotspotShutdown.js.map +1 -0
  206. package/build/services/JSCrashController.d.ts +97 -0
  207. package/build/services/JSCrashController.d.ts.map +1 -0
  208. package/build/services/JSCrashController.js +138 -0
  209. package/build/services/JSCrashController.js.map +1 -0
  210. package/build/services/JSCrashloopReportService.d.ts +9 -0
  211. package/build/services/JSCrashloopReportService.d.ts.map +1 -0
  212. package/build/services/JSCrashloopReportService.js +54 -0
  213. package/build/services/JSCrashloopReportService.js.map +1 -0
  214. package/build/services/JSLogPipeline.d.ts +87 -0
  215. package/build/services/JSLogPipeline.d.ts.map +1 -0
  216. package/build/services/JSLogPipeline.js +137 -0
  217. package/build/services/JSLogPipeline.js.map +1 -0
  218. package/build/services/JSRouter.d.ts +203 -0
  219. package/build/services/JSRouter.d.ts.map +1 -0
  220. package/build/services/JSRouter.js +482 -0
  221. package/build/services/JSRouter.js.map +1 -0
  222. package/build/services/LocalDisplayManager.d.ts +162 -0
  223. package/build/services/LocalDisplayManager.d.ts.map +1 -0
  224. package/build/services/LocalDisplayManager.js +687 -0
  225. package/build/services/LocalDisplayManager.js.map +1 -0
  226. package/build/services/LocalMiniappDataMigration.d.ts +46 -0
  227. package/build/services/LocalMiniappDataMigration.d.ts.map +1 -0
  228. package/build/services/LocalMiniappDataMigration.js +78 -0
  229. package/build/services/LocalMiniappDataMigration.js.map +1 -0
  230. package/build/services/LocalMiniappRuntime.d.ts +677 -0
  231. package/build/services/LocalMiniappRuntime.d.ts.map +1 -0
  232. package/build/services/LocalMiniappRuntime.js +5068 -0
  233. package/build/services/LocalMiniappRuntime.js.map +1 -0
  234. package/build/services/LocalMiniappStorage.d.ts +32 -0
  235. package/build/services/LocalMiniappStorage.d.ts.map +1 -0
  236. package/build/services/LocalMiniappStorage.js +66 -0
  237. package/build/services/LocalMiniappStorage.js.map +1 -0
  238. package/build/services/LocalMiniappUserIdentity.d.ts +41 -0
  239. package/build/services/LocalMiniappUserIdentity.d.ts.map +1 -0
  240. package/build/services/LocalMiniappUserIdentity.js +73 -0
  241. package/build/services/LocalMiniappUserIdentity.js.map +1 -0
  242. package/build/services/LocalSttFallbackCoordinator.d.ts +101 -0
  243. package/build/services/LocalSttFallbackCoordinator.d.ts.map +1 -0
  244. package/build/services/LocalSttFallbackCoordinator.js +210 -0
  245. package/build/services/LocalSttFallbackCoordinator.js.map +1 -0
  246. package/build/services/MapboxTokenService.d.ts +33 -0
  247. package/build/services/MapboxTokenService.d.ts.map +1 -0
  248. package/build/services/MapboxTokenService.js +115 -0
  249. package/build/services/MapboxTokenService.js.map +1 -0
  250. package/build/services/MemoryCapture.d.ts +40 -0
  251. package/build/services/MemoryCapture.d.ts.map +1 -0
  252. package/build/services/MemoryCapture.js +42 -0
  253. package/build/services/MemoryCapture.js.map +1 -0
  254. package/build/services/MemoryStore.d.ts +184 -0
  255. package/build/services/MemoryStore.d.ts.map +1 -0
  256. package/build/services/MemoryStore.js +541 -0
  257. package/build/services/MemoryStore.js.map +1 -0
  258. package/build/services/MicStateCoordinator.d.ts +78 -0
  259. package/build/services/MicStateCoordinator.d.ts.map +1 -0
  260. package/build/services/MicStateCoordinator.js +219 -0
  261. package/build/services/MicStateCoordinator.js.map +1 -0
  262. package/build/services/MiniappEngine.d.ts +31 -0
  263. package/build/services/MiniappEngine.d.ts.map +1 -0
  264. package/build/services/MiniappEngine.js +119 -0
  265. package/build/services/MiniappEngine.js.map +1 -0
  266. package/build/services/MiniappLauncher.d.ts +127 -0
  267. package/build/services/MiniappLauncher.d.ts.map +1 -0
  268. package/build/services/MiniappLauncher.js +309 -0
  269. package/build/services/MiniappLauncher.js.map +1 -0
  270. package/build/services/MiniappLiveness.d.ts +12 -0
  271. package/build/services/MiniappLiveness.d.ts.map +1 -0
  272. package/build/services/MiniappLiveness.js +16 -0
  273. package/build/services/MiniappLiveness.js.map +1 -0
  274. package/build/services/MiniappRunningRegistry.d.ts +24 -0
  275. package/build/services/MiniappRunningRegistry.d.ts.map +1 -0
  276. package/build/services/MiniappRunningRegistry.js +52 -0
  277. package/build/services/MiniappRunningRegistry.js.map +1 -0
  278. package/build/services/NativeHttpResponse.d.ts +3 -0
  279. package/build/services/NativeHttpResponse.d.ts.map +1 -0
  280. package/build/services/NativeHttpResponse.js +6 -0
  281. package/build/services/NativeHttpResponse.js.map +1 -0
  282. package/build/services/NativeNavigationService.d.ts +51 -0
  283. package/build/services/NativeNavigationService.d.ts.map +1 -0
  284. package/build/services/NativeNavigationService.js +154 -0
  285. package/build/services/NativeNavigationService.js.map +1 -0
  286. package/build/services/NavigationHandlers.d.ts +107 -0
  287. package/build/services/NavigationHandlers.d.ts.map +1 -0
  288. package/build/services/NavigationHandlers.js +479 -0
  289. package/build/services/NavigationHandlers.js.map +1 -0
  290. package/build/services/NavigationService.d.ts +283 -0
  291. package/build/services/NavigationService.d.ts.map +1 -0
  292. package/build/services/NavigationService.js +696 -0
  293. package/build/services/NavigationService.js.map +1 -0
  294. package/build/services/NotificationsEmitter.d.ts +28 -0
  295. package/build/services/NotificationsEmitter.d.ts.map +1 -0
  296. package/build/services/NotificationsEmitter.js +22 -0
  297. package/build/services/NotificationsEmitter.js.map +1 -0
  298. package/build/services/OfflineSpeechModelService.d.ts +33 -0
  299. package/build/services/OfflineSpeechModelService.d.ts.map +1 -0
  300. package/build/services/OfflineSpeechModelService.js +136 -0
  301. package/build/services/OfflineSpeechModelService.js.map +1 -0
  302. package/build/services/OtaArtifactDownloader.d.ts +65 -0
  303. package/build/services/OtaArtifactDownloader.d.ts.map +1 -0
  304. package/build/services/OtaArtifactDownloader.js +226 -0
  305. package/build/services/OtaArtifactDownloader.js.map +1 -0
  306. package/build/services/OtaInstallCoordinator.d.ts +275 -0
  307. package/build/services/OtaInstallCoordinator.d.ts.map +1 -0
  308. package/build/services/OtaInstallCoordinator.js +1491 -0
  309. package/build/services/OtaInstallCoordinator.js.map +1 -0
  310. package/build/services/OtaService.d.ts +3 -0
  311. package/build/services/OtaService.d.ts.map +1 -0
  312. package/build/services/OtaService.js +72 -0
  313. package/build/services/OtaService.js.map +1 -0
  314. package/build/services/OtaUpdateCheckService.d.ts +100 -0
  315. package/build/services/OtaUpdateCheckService.d.ts.map +1 -0
  316. package/build/services/OtaUpdateCheckService.js +380 -0
  317. package/build/services/OtaUpdateCheckService.js.map +1 -0
  318. package/build/services/PairingIdentity.d.ts +80 -0
  319. package/build/services/PairingIdentity.d.ts.map +1 -0
  320. package/build/services/PairingIdentity.js +145 -0
  321. package/build/services/PairingIdentity.js.map +1 -0
  322. package/build/services/PhoneCalendarHelpers.d.ts +32 -0
  323. package/build/services/PhoneCalendarHelpers.d.ts.map +1 -0
  324. package/build/services/PhoneCalendarHelpers.js +157 -0
  325. package/build/services/PhoneCalendarHelpers.js.map +1 -0
  326. package/build/services/PhoneCalendarService.d.ts +5 -0
  327. package/build/services/PhoneCalendarService.d.ts.map +1 -0
  328. package/build/services/PhoneCalendarService.js +45 -0
  329. package/build/services/PhoneCalendarService.js.map +1 -0
  330. package/build/services/PhoneCameraFovCoordinator.d.ts +30 -0
  331. package/build/services/PhoneCameraFovCoordinator.d.ts.map +1 -0
  332. package/build/services/PhoneCameraFovCoordinator.js +194 -0
  333. package/build/services/PhoneCameraFovCoordinator.js.map +1 -0
  334. package/build/services/PhoneLocationService.d.ts +36 -0
  335. package/build/services/PhoneLocationService.d.ts.map +1 -0
  336. package/build/services/PhoneLocationService.js +115 -0
  337. package/build/services/PhoneLocationService.js.map +1 -0
  338. package/build/services/PhoneNotificationsSync.d.ts +3 -0
  339. package/build/services/PhoneNotificationsSync.d.ts.map +1 -0
  340. package/build/services/PhoneNotificationsSync.js +37 -0
  341. package/build/services/PhoneNotificationsSync.js.map +1 -0
  342. package/build/services/PhonePhotoCoordinator.d.ts +110 -0
  343. package/build/services/PhonePhotoCoordinator.d.ts.map +1 -0
  344. package/build/services/PhonePhotoCoordinator.js +344 -0
  345. package/build/services/PhonePhotoCoordinator.js.map +1 -0
  346. package/build/services/PhoneStreamCoordinator.d.ts +175 -0
  347. package/build/services/PhoneStreamCoordinator.d.ts.map +1 -0
  348. package/build/services/PhoneStreamCoordinator.js +740 -0
  349. package/build/services/PhoneStreamCoordinator.js.map +1 -0
  350. package/build/services/PhoneVideoCoordinator.d.ts +52 -0
  351. package/build/services/PhoneVideoCoordinator.d.ts.map +1 -0
  352. package/build/services/PhoneVideoCoordinator.js +157 -0
  353. package/build/services/PhoneVideoCoordinator.js.map +1 -0
  354. package/build/services/ProviderKeyValidation.d.ts +27 -0
  355. package/build/services/ProviderKeyValidation.d.ts.map +1 -0
  356. package/build/services/ProviderKeyValidation.js +42 -0
  357. package/build/services/ProviderKeyValidation.js.map +1 -0
  358. package/build/services/STTModelManager.d.ts +65 -0
  359. package/build/services/STTModelManager.d.ts.map +1 -0
  360. package/build/services/STTModelManager.js +366 -0
  361. package/build/services/STTModelManager.js.map +1 -0
  362. package/build/services/SceneRenderer.d.ts +90 -0
  363. package/build/services/SceneRenderer.d.ts.map +1 -0
  364. package/build/services/SceneRenderer.js +274 -0
  365. package/build/services/SceneRenderer.js.map +1 -0
  366. package/build/services/SentenceTtsPipeline.d.ts +31 -0
  367. package/build/services/SentenceTtsPipeline.d.ts.map +1 -0
  368. package/build/services/SentenceTtsPipeline.js +67 -0
  369. package/build/services/SentenceTtsPipeline.js.map +1 -0
  370. package/build/services/SpeakerIdModelManager.d.ts +36 -0
  371. package/build/services/SpeakerIdModelManager.d.ts.map +1 -0
  372. package/build/services/SpeakerIdModelManager.js +132 -0
  373. package/build/services/SpeakerIdModelManager.js.map +1 -0
  374. package/build/services/SpeakerIdSync.d.ts +14 -0
  375. package/build/services/SpeakerIdSync.d.ts.map +1 -0
  376. package/build/services/SpeakerIdSync.js +62 -0
  377. package/build/services/SpeakerIdSync.js.map +1 -0
  378. package/build/services/SpeakerLabelResolver.d.ts +80 -0
  379. package/build/services/SpeakerLabelResolver.d.ts.map +1 -0
  380. package/build/services/SpeakerLabelResolver.js +108 -0
  381. package/build/services/SpeakerLabelResolver.js.map +1 -0
  382. package/build/services/SpeakerProfileStore.d.ts +90 -0
  383. package/build/services/SpeakerProfileStore.d.ts.map +1 -0
  384. package/build/services/SpeakerProfileStore.js +213 -0
  385. package/build/services/SpeakerProfileStore.js.map +1 -0
  386. package/build/services/SpeakerSegmentResolver.d.ts +87 -0
  387. package/build/services/SpeakerSegmentResolver.d.ts.map +1 -0
  388. package/build/services/SpeakerSegmentResolver.js +137 -0
  389. package/build/services/SpeakerSegmentResolver.js.map +1 -0
  390. package/build/services/StreamLifecycleController.d.ts +63 -0
  391. package/build/services/StreamLifecycleController.d.ts.map +1 -0
  392. package/build/services/StreamLifecycleController.js +148 -0
  393. package/build/services/StreamLifecycleController.js.map +1 -0
  394. package/build/services/SupportProfileSync.d.ts +22 -0
  395. package/build/services/SupportProfileSync.d.ts.map +1 -0
  396. package/build/services/SupportProfileSync.js +213 -0
  397. package/build/services/SupportProfileSync.js.map +1 -0
  398. package/build/services/TTSModelManager.d.ts +90 -0
  399. package/build/services/TTSModelManager.d.ts.map +1 -0
  400. package/build/services/TTSModelManager.js +366 -0
  401. package/build/services/TTSModelManager.js.map +1 -0
  402. package/build/services/TranscriptionRouting.d.ts +22 -0
  403. package/build/services/TranscriptionRouting.d.ts.map +1 -0
  404. package/build/services/TranscriptionRouting.js +34 -0
  405. package/build/services/TranscriptionRouting.js.map +1 -0
  406. package/build/services/TtsTextSanitizer.d.ts +5 -0
  407. package/build/services/TtsTextSanitizer.d.ts.map +1 -0
  408. package/build/services/TtsTextSanitizer.js +61 -0
  409. package/build/services/TtsTextSanitizer.js.map +1 -0
  410. package/build/services/UIRouter.d.ts +137 -0
  411. package/build/services/UIRouter.d.ts.map +1 -0
  412. package/build/services/UIRouter.js +210 -0
  413. package/build/services/UIRouter.js.map +1 -0
  414. package/build/services/WebviewBridge.d.ts +22 -0
  415. package/build/services/WebviewBridge.d.ts.map +1 -0
  416. package/build/services/WebviewBridge.js +47 -0
  417. package/build/services/WebviewBridge.js.map +1 -0
  418. package/build/services/WifiAdbRequest.d.ts +17 -0
  419. package/build/services/WifiAdbRequest.d.ts.map +1 -0
  420. package/build/services/WifiAdbRequest.js +35 -0
  421. package/build/services/WifiAdbRequest.js.map +1 -0
  422. package/build/services/asg/GalleryMediaIntegrityReportService.d.ts +17 -0
  423. package/build/services/asg/GalleryMediaIntegrityReportService.d.ts.map +1 -0
  424. package/build/services/asg/GalleryMediaIntegrityReportService.js +43 -0
  425. package/build/services/asg/GalleryMediaIntegrityReportService.js.map +1 -0
  426. package/build/services/asg/asgCameraApi.d.ts +208 -0
  427. package/build/services/asg/asgCameraApi.d.ts.map +1 -0
  428. package/build/services/asg/asgCameraApi.js +1480 -0
  429. package/build/services/asg/asgCameraApi.js.map +1 -0
  430. package/build/services/asg/cameraRollExportCoordinator.d.ts +60 -0
  431. package/build/services/asg/cameraRollExportCoordinator.d.ts.map +1 -0
  432. package/build/services/asg/cameraRollExportCoordinator.js +618 -0
  433. package/build/services/asg/cameraRollExportCoordinator.js.map +1 -0
  434. package/build/services/asg/cameraRollExportLedger.d.ts +44 -0
  435. package/build/services/asg/cameraRollExportLedger.d.ts.map +1 -0
  436. package/build/services/asg/cameraRollExportLedger.js +78 -0
  437. package/build/services/asg/cameraRollExportLedger.js.map +1 -0
  438. package/build/services/asg/galleryMediaValidation.d.ts +29 -0
  439. package/build/services/asg/galleryMediaValidation.d.ts.map +1 -0
  440. package/build/services/asg/galleryMediaValidation.js +149 -0
  441. package/build/services/asg/galleryMediaValidation.js.map +1 -0
  442. package/build/services/asg/galleryNotices.d.ts +33 -0
  443. package/build/services/asg/galleryNotices.d.ts.map +1 -0
  444. package/build/services/asg/galleryNotices.js +29 -0
  445. package/build/services/asg/galleryNotices.js.map +1 -0
  446. package/build/services/asg/galleryPathMigration.d.ts +3 -0
  447. package/build/services/asg/galleryPathMigration.d.ts.map +1 -0
  448. package/build/services/asg/galleryPathMigration.js +26 -0
  449. package/build/services/asg/galleryPathMigration.js.map +1 -0
  450. package/build/services/asg/gallerySettingsService.d.ts +20 -0
  451. package/build/services/asg/gallerySettingsService.d.ts.map +1 -0
  452. package/build/services/asg/gallerySettingsService.js +53 -0
  453. package/build/services/asg/gallerySettingsService.js.map +1 -0
  454. package/build/services/asg/gallerySyncNotifications.d.ts +56 -0
  455. package/build/services/asg/gallerySyncNotifications.d.ts.map +1 -0
  456. package/build/services/asg/gallerySyncNotifications.js +198 -0
  457. package/build/services/asg/gallerySyncNotifications.js.map +1 -0
  458. package/build/services/asg/gallerySyncService.d.ts +137 -0
  459. package/build/services/asg/gallerySyncService.d.ts.map +1 -0
  460. package/build/services/asg/gallerySyncService.js +1945 -0
  461. package/build/services/asg/gallerySyncService.js.map +1 -0
  462. package/build/services/asg/galleryTransferLedger.d.ts +58 -0
  463. package/build/services/asg/galleryTransferLedger.d.ts.map +1 -0
  464. package/build/services/asg/galleryTransferLedger.js +225 -0
  465. package/build/services/asg/galleryTransferLedger.js.map +1 -0
  466. package/build/services/asg/localNetworkTransport.d.ts +15 -0
  467. package/build/services/asg/localNetworkTransport.d.ts.map +1 -0
  468. package/build/services/asg/localNetworkTransport.js +144 -0
  469. package/build/services/asg/localNetworkTransport.js.map +1 -0
  470. package/build/services/asg/localStorageService.d.ts +146 -0
  471. package/build/services/asg/localStorageService.d.ts.map +1 -0
  472. package/build/services/asg/localStorageService.js +572 -0
  473. package/build/services/asg/localStorageService.js.map +1 -0
  474. package/build/services/asg/mediaProcessingQueue.d.ts +70 -0
  475. package/build/services/asg/mediaProcessingQueue.d.ts.map +1 -0
  476. package/build/services/asg/mediaProcessingQueue.js +451 -0
  477. package/build/services/asg/mediaProcessingQueue.js.map +1 -0
  478. package/build/services/audioPlaybackAssets.d.ts +8 -0
  479. package/build/services/audioPlaybackAssets.d.ts.map +1 -0
  480. package/build/services/audioPlaybackAssets.js +7 -0
  481. package/build/services/audioPlaybackAssets.js.map +1 -0
  482. package/build/services/blobPaths.d.ts +31 -0
  483. package/build/services/blobPaths.d.ts.map +1 -0
  484. package/build/services/blobPaths.js +86 -0
  485. package/build/services/blobPaths.js.map +1 -0
  486. package/build/services/cloudStreamApi.d.ts +59 -0
  487. package/build/services/cloudStreamApi.d.ts.map +1 -0
  488. package/build/services/cloudStreamApi.js +81 -0
  489. package/build/services/cloudStreamApi.js.map +1 -0
  490. package/build/services/effectiveCapabilities.d.ts +8 -0
  491. package/build/services/effectiveCapabilities.d.ts.map +1 -0
  492. package/build/services/effectiveCapabilities.js +23 -0
  493. package/build/services/effectiveCapabilities.js.map +1 -0
  494. package/build/services/gallerySyncClock.d.ts +17 -0
  495. package/build/services/gallerySyncClock.d.ts.map +1 -0
  496. package/build/services/gallerySyncClock.js +21 -0
  497. package/build/services/gallerySyncClock.js.map +1 -0
  498. package/build/services/glassesClockSync.d.ts +20 -0
  499. package/build/services/glassesClockSync.d.ts.map +1 -0
  500. package/build/services/glassesClockSync.js +97 -0
  501. package/build/services/glassesClockSync.js.map +1 -0
  502. package/build/services/manifestActions.d.ts +31 -0
  503. package/build/services/manifestActions.d.ts.map +1 -0
  504. package/build/services/manifestActions.js +54 -0
  505. package/build/services/manifestActions.js.map +1 -0
  506. package/build/services/manifestVersionGate.d.ts +28 -0
  507. package/build/services/manifestVersionGate.d.ts.map +1 -0
  508. package/build/services/manifestVersionGate.js +41 -0
  509. package/build/services/manifestVersionGate.js.map +1 -0
  510. package/build/services/memoryStoreInstance.d.ts +19 -0
  511. package/build/services/memoryStoreInstance.d.ts.map +1 -0
  512. package/build/services/memoryStoreInstance.js +65 -0
  513. package/build/services/memoryStoreInstance.js.map +1 -0
  514. package/build/services/navigation/roadNameResolver.d.ts +67 -0
  515. package/build/services/navigation/roadNameResolver.d.ts.map +1 -0
  516. package/build/services/navigation/roadNameResolver.js +87 -0
  517. package/build/services/navigation/roadNameResolver.js.map +1 -0
  518. package/build/services/navigation/routesApiCodec.d.ts +38 -0
  519. package/build/services/navigation/routesApiCodec.d.ts.map +1 -0
  520. package/build/services/navigation/routesApiCodec.js +68 -0
  521. package/build/services/navigation/routesApiCodec.js.map +1 -0
  522. package/build/services/otaDisplayState.d.ts +53 -0
  523. package/build/services/otaDisplayState.d.ts.map +1 -0
  524. package/build/services/otaDisplayState.js +114 -0
  525. package/build/services/otaDisplayState.js.map +1 -0
  526. package/build/services/otaInstallPolicy.d.ts +93 -0
  527. package/build/services/otaInstallPolicy.d.ts.map +1 -0
  528. package/build/services/otaInstallPolicy.js +117 -0
  529. package/build/services/otaInstallPolicy.js.map +1 -0
  530. package/build/services/otaLegacyMapping.d.ts +22 -0
  531. package/build/services/otaLegacyMapping.d.ts.map +1 -0
  532. package/build/services/otaLegacyMapping.js +56 -0
  533. package/build/services/otaLegacyMapping.js.map +1 -0
  534. package/build/services/otaManifestUrl.d.ts +2 -0
  535. package/build/services/otaManifestUrl.d.ts.map +1 -0
  536. package/build/services/otaManifestUrl.js +46 -0
  537. package/build/services/otaManifestUrl.js.map +1 -0
  538. package/build/services/slimStreamStatus.d.ts +18 -0
  539. package/build/services/slimStreamStatus.d.ts.map +1 -0
  540. package/build/services/slimStreamStatus.js +36 -0
  541. package/build/services/slimStreamStatus.js.map +1 -0
  542. package/build/services/soniox/SonioxDirectService.d.ts +109 -0
  543. package/build/services/soniox/SonioxDirectService.d.ts.map +1 -0
  544. package/build/services/soniox/SonioxDirectService.js +449 -0
  545. package/build/services/soniox/SonioxDirectService.js.map +1 -0
  546. package/build/services/soniox/SonioxRealtimeClient.d.ts +121 -0
  547. package/build/services/soniox/SonioxRealtimeClient.d.ts.map +1 -0
  548. package/build/services/soniox/SonioxRealtimeClient.js +301 -0
  549. package/build/services/soniox/SonioxRealtimeClient.js.map +1 -0
  550. package/build/services/soniox/SonioxTokenAssembler.d.ts +98 -0
  551. package/build/services/soniox/SonioxTokenAssembler.d.ts.map +1 -0
  552. package/build/services/soniox/SonioxTokenAssembler.js +394 -0
  553. package/build/services/soniox/SonioxTokenAssembler.js.map +1 -0
  554. package/build/services/speakerProfileStoreInstance.d.ts +8 -0
  555. package/build/services/speakerProfileStoreInstance.d.ts.map +1 -0
  556. package/build/services/speakerProfileStoreInstance.js +24 -0
  557. package/build/services/speakerProfileStoreInstance.js.map +1 -0
  558. package/build/services/uiShim.d.ts +38 -0
  559. package/build/services/uiShim.d.ts.map +1 -0
  560. package/build/services/uiShim.js +369 -0
  561. package/build/services/uiShim.js.map +1 -0
  562. package/build/stores/apps.d.ts +104 -0
  563. package/build/stores/apps.d.ts.map +1 -0
  564. package/build/stores/apps.js +503 -0
  565. package/build/stores/apps.js.map +1 -0
  566. package/build/stores/bluetoothSettingKeys.d.ts +4 -0
  567. package/build/stores/bluetoothSettingKeys.d.ts.map +1 -0
  568. package/build/stores/bluetoothSettingKeys.js +33 -0
  569. package/build/stores/bluetoothSettingKeys.js.map +1 -0
  570. package/build/stores/cloudClientStatus.d.ts +9 -0
  571. package/build/stores/cloudClientStatus.d.ts.map +1 -0
  572. package/build/stores/cloudClientStatus.js +24 -0
  573. package/build/stores/cloudClientStatus.js.map +1 -0
  574. package/build/stores/connection.d.ts +22 -0
  575. package/build/stores/connection.d.ts.map +1 -0
  576. package/build/stores/connection.js +43 -0
  577. package/build/stores/connection.js.map +1 -0
  578. package/build/stores/core.d.ts +15 -0
  579. package/build/stores/core.d.ts.map +1 -0
  580. package/build/stores/core.js +21 -0
  581. package/build/stores/core.js.map +1 -0
  582. package/build/stores/display.d.ts +24 -0
  583. package/build/stores/display.d.ts.map +1 -0
  584. package/build/stores/display.js +96 -0
  585. package/build/stores/display.js.map +1 -0
  586. package/build/stores/gallerySync.d.ts +103 -0
  587. package/build/stores/gallerySync.d.ts.map +1 -0
  588. package/build/stores/gallerySync.js +219 -0
  589. package/build/stores/gallerySync.js.map +1 -0
  590. package/build/stores/glasses.d.ts +62 -0
  591. package/build/stores/glasses.d.ts.map +1 -0
  592. package/build/stores/glasses.js +208 -0
  593. package/build/stores/glasses.js.map +1 -0
  594. package/build/stores/settings.d.ts +54 -0
  595. package/build/stores/settings.d.ts.map +1 -0
  596. package/build/stores/settings.js +1200 -0
  597. package/build/stores/settings.js.map +1 -0
  598. package/build/stores/transcriptionDebug.d.ts +25 -0
  599. package/build/stores/transcriptionDebug.d.ts.map +1 -0
  600. package/build/stores/transcriptionDebug.js +0 -0
  601. package/build/stores/transcriptionDebug.js.map +1 -0
  602. package/build/types/applet.d.ts +101 -0
  603. package/build/types/applet.d.ts.map +1 -0
  604. package/build/types/applet.js +5 -0
  605. package/build/types/applet.js.map +1 -0
  606. package/build/types/asg.d.ts +53 -0
  607. package/build/types/asg.d.ts.map +1 -0
  608. package/build/types/asg.js +2 -0
  609. package/build/types/asg.js.map +1 -0
  610. package/build/types/capabilities/even-realities-g1.d.ts +12 -0
  611. package/build/types/capabilities/even-realities-g1.d.ts.map +1 -0
  612. package/build/types/capabilities/even-realities-g1.js +57 -0
  613. package/build/types/capabilities/even-realities-g1.js.map +1 -0
  614. package/build/types/capabilities/even-realities-g2.d.ts +12 -0
  615. package/build/types/capabilities/even-realities-g2.d.ts.map +1 -0
  616. package/build/types/capabilities/even-realities-g2.js +83 -0
  617. package/build/types/capabilities/even-realities-g2.js.map +1 -0
  618. package/build/types/capabilities/mentra-display.d.ts +12 -0
  619. package/build/types/capabilities/mentra-display.d.ts.map +1 -0
  620. package/build/types/capabilities/mentra-display.js +65 -0
  621. package/build/types/capabilities/mentra-display.js.map +1 -0
  622. package/build/types/capabilities/mentra-live.d.ts +12 -0
  623. package/build/types/capabilities/mentra-live.d.ts.map +1 -0
  624. package/build/types/capabilities/mentra-live.js +94 -0
  625. package/build/types/capabilities/mentra-live.js.map +1 -0
  626. package/build/types/capabilities/nimo.d.ts +13 -0
  627. package/build/types/capabilities/nimo.d.ts.map +1 -0
  628. package/build/types/capabilities/nimo.js +72 -0
  629. package/build/types/capabilities/nimo.js.map +1 -0
  630. package/build/types/capabilities/none.d.ts +13 -0
  631. package/build/types/capabilities/none.d.ts.map +1 -0
  632. package/build/types/capabilities/none.js +67 -0
  633. package/build/types/capabilities/none.js.map +1 -0
  634. package/build/types/capabilities/simulated-glasses.d.ts +13 -0
  635. package/build/types/capabilities/simulated-glasses.d.ts.map +1 -0
  636. package/build/types/capabilities/simulated-glasses.js +82 -0
  637. package/build/types/capabilities/simulated-glasses.js.map +1 -0
  638. package/build/types/capabilities/vuzix-z100.d.ts +12 -0
  639. package/build/types/capabilities/vuzix-z100.d.ts.map +1 -0
  640. package/build/types/capabilities/vuzix-z100.js +54 -0
  641. package/build/types/capabilities/vuzix-z100.js.map +1 -0
  642. package/build/types/enums.d.ts +22 -0
  643. package/build/types/enums.d.ts.map +1 -0
  644. package/build/types/enums.js +27 -0
  645. package/build/types/enums.js.map +1 -0
  646. package/build/types/hardware.d.ts +155 -0
  647. package/build/types/hardware.d.ts.map +1 -0
  648. package/build/types/hardware.js +52 -0
  649. package/build/types/hardware.js.map +1 -0
  650. package/build/types/index.d.ts +11 -0
  651. package/build/types/index.d.ts.map +1 -0
  652. package/build/types/index.js +10 -0
  653. package/build/types/index.js.map +1 -0
  654. package/build/utils/GlobalEventEmitter.d.ts +11 -0
  655. package/build/utils/GlobalEventEmitter.d.ts.map +1 -0
  656. package/build/utils/GlobalEventEmitter.js +14 -0
  657. package/build/utils/GlobalEventEmitter.js.map +1 -0
  658. package/build/utils/cloudClient/RnUdpAdapter.d.ts +3 -0
  659. package/build/utils/cloudClient/RnUdpAdapter.d.ts.map +1 -0
  660. package/build/utils/cloudClient/RnUdpAdapter.js +41 -0
  661. package/build/utils/cloudClient/RnUdpAdapter.js.map +1 -0
  662. package/build/utils/cloudClient/cloudSecureStore.d.ts +3 -0
  663. package/build/utils/cloudClient/cloudSecureStore.d.ts.map +1 -0
  664. package/build/utils/cloudClient/cloudSecureStore.js +26 -0
  665. package/build/utils/cloudClient/cloudSecureStore.js.map +1 -0
  666. package/build/utils/configuredDevHost.d.ts +6 -0
  667. package/build/utils/configuredDevHost.d.ts.map +1 -0
  668. package/build/utils/configuredDevHost.js +19 -0
  669. package/build/utils/configuredDevHost.js.map +1 -0
  670. package/build/utils/debouncedPatch.d.ts +6 -0
  671. package/build/utils/debouncedPatch.d.ts.map +1 -0
  672. package/build/utils/debouncedPatch.js +25 -0
  673. package/build/utils/debouncedPatch.js.map +1 -0
  674. package/build/utils/devLogging.d.ts +26 -0
  675. package/build/utils/devLogging.d.ts.map +1 -0
  676. package/build/utils/devLogging.js +116 -0
  677. package/build/utils/devLogging.js.map +1 -0
  678. package/build/utils/devMiniappLaunch.d.ts +55 -0
  679. package/build/utils/devMiniappLaunch.d.ts.map +1 -0
  680. package/build/utils/devMiniappLaunch.js +175 -0
  681. package/build/utils/devMiniappLaunch.js.map +1 -0
  682. package/build/utils/diagnosticContext.d.ts +3 -0
  683. package/build/utils/diagnosticContext.d.ts.map +1 -0
  684. package/build/utils/diagnosticContext.js +122 -0
  685. package/build/utils/diagnosticContext.js.map +1 -0
  686. package/build/utils/display/composer/ColumnComposer.d.ts +131 -0
  687. package/build/utils/display/composer/ColumnComposer.d.ts.map +1 -0
  688. package/build/utils/display/composer/ColumnComposer.js +204 -0
  689. package/build/utils/display/composer/ColumnComposer.js.map +1 -0
  690. package/build/utils/display/composer/index.d.ts +9 -0
  691. package/build/utils/display/composer/index.d.ts.map +1 -0
  692. package/build/utils/display/composer/index.js +9 -0
  693. package/build/utils/display/composer/index.js.map +1 -0
  694. package/build/utils/display/helpers/DisplayHelpers.d.ts +165 -0
  695. package/build/utils/display/helpers/DisplayHelpers.d.ts.map +1 -0
  696. package/build/utils/display/helpers/DisplayHelpers.js +312 -0
  697. package/build/utils/display/helpers/DisplayHelpers.js.map +1 -0
  698. package/build/utils/display/helpers/ScrollView.d.ts +183 -0
  699. package/build/utils/display/helpers/ScrollView.d.ts.map +1 -0
  700. package/build/utils/display/helpers/ScrollView.js +257 -0
  701. package/build/utils/display/helpers/ScrollView.js.map +1 -0
  702. package/build/utils/display/helpers/index.d.ts +11 -0
  703. package/build/utils/display/helpers/index.d.ts.map +1 -0
  704. package/build/utils/display/helpers/index.js +10 -0
  705. package/build/utils/display/helpers/index.js.map +1 -0
  706. package/build/utils/display/index.d.ts +174 -0
  707. package/build/utils/display/index.d.ts.map +1 -0
  708. package/build/utils/display/index.js +188 -0
  709. package/build/utils/display/index.js.map +1 -0
  710. package/build/utils/display/measurer/TextMeasurer.d.ts +160 -0
  711. package/build/utils/display/measurer/TextMeasurer.d.ts.map +1 -0
  712. package/build/utils/display/measurer/TextMeasurer.js +273 -0
  713. package/build/utils/display/measurer/TextMeasurer.js.map +1 -0
  714. package/build/utils/display/measurer/index.d.ts +10 -0
  715. package/build/utils/display/measurer/index.d.ts.map +1 -0
  716. package/build/utils/display/measurer/index.js +11 -0
  717. package/build/utils/display/measurer/index.js.map +1 -0
  718. package/build/utils/display/measurer/script-detection.d.ts +53 -0
  719. package/build/utils/display/measurer/script-detection.d.ts.map +1 -0
  720. package/build/utils/display/measurer/script-detection.js +184 -0
  721. package/build/utils/display/measurer/script-detection.js.map +1 -0
  722. package/build/utils/display/profiles/g1.d.ts +33 -0
  723. package/build/utils/display/profiles/g1.d.ts.map +1 -0
  724. package/build/utils/display/profiles/g1.js +213 -0
  725. package/build/utils/display/profiles/g1.js.map +1 -0
  726. package/build/utils/display/profiles/g2.d.ts +13 -0
  727. package/build/utils/display/profiles/g2.d.ts.map +1 -0
  728. package/build/utils/display/profiles/g2.js +34 -0
  729. package/build/utils/display/profiles/g2.js.map +1 -0
  730. package/build/utils/display/profiles/index.d.ts +12 -0
  731. package/build/utils/display/profiles/index.d.ts.map +1 -0
  732. package/build/utils/display/profiles/index.js +15 -0
  733. package/build/utils/display/profiles/index.js.map +1 -0
  734. package/build/utils/display/profiles/nex.d.ts +10 -0
  735. package/build/utils/display/profiles/nex.d.ts.map +1 -0
  736. package/build/utils/display/profiles/nex.js +150 -0
  737. package/build/utils/display/profiles/nex.js.map +1 -0
  738. package/build/utils/display/profiles/types.d.ts +103 -0
  739. package/build/utils/display/profiles/types.d.ts.map +1 -0
  740. package/build/utils/display/profiles/types.js +2 -0
  741. package/build/utils/display/profiles/types.js.map +1 -0
  742. package/build/utils/display/profiles/z100.d.ts +33 -0
  743. package/build/utils/display/profiles/z100.d.ts.map +1 -0
  744. package/build/utils/display/profiles/z100.js +182 -0
  745. package/build/utils/display/profiles/z100.js.map +1 -0
  746. package/build/utils/display/scene/anchor.d.ts +17 -0
  747. package/build/utils/display/scene/anchor.d.ts.map +1 -0
  748. package/build/utils/display/scene/anchor.js +33 -0
  749. package/build/utils/display/scene/anchor.js.map +1 -0
  750. package/build/utils/display/scene/degrade.d.ts +25 -0
  751. package/build/utils/display/scene/degrade.d.ts.map +1 -0
  752. package/build/utils/display/scene/degrade.js +64 -0
  753. package/build/utils/display/scene/degrade.js.map +1 -0
  754. package/build/utils/display/scene/differ.d.ts +38 -0
  755. package/build/utils/display/scene/differ.d.ts.map +1 -0
  756. package/build/utils/display/scene/differ.js +107 -0
  757. package/build/utils/display/scene/differ.js.map +1 -0
  758. package/build/utils/display/scene/index.d.ts +11 -0
  759. package/build/utils/display/scene/index.d.ts.map +1 -0
  760. package/build/utils/display/scene/index.js +7 -0
  761. package/build/utils/display/scene/index.js.map +1 -0
  762. package/build/utils/display/scene/process.d.ts +35 -0
  763. package/build/utils/display/scene/process.d.ts.map +1 -0
  764. package/build/utils/display/scene/process.js +201 -0
  765. package/build/utils/display/scene/process.js.map +1 -0
  766. package/build/utils/display/scene/store.d.ts +48 -0
  767. package/build/utils/display/scene/store.d.ts.map +1 -0
  768. package/build/utils/display/scene/store.js +0 -0
  769. package/build/utils/display/scene/store.js.map +1 -0
  770. package/build/utils/display/scene/types.d.ts +139 -0
  771. package/build/utils/display/scene/types.d.ts.map +1 -0
  772. package/build/utils/display/scene/types.js +0 -0
  773. package/build/utils/display/scene/types.js.map +1 -0
  774. package/build/utils/display/wrapper/TextWrapper.d.ts +102 -0
  775. package/build/utils/display/wrapper/TextWrapper.d.ts.map +1 -0
  776. package/build/utils/display/wrapper/TextWrapper.js +471 -0
  777. package/build/utils/display/wrapper/TextWrapper.js.map +1 -0
  778. package/build/utils/display/wrapper/index.d.ts +12 -0
  779. package/build/utils/display/wrapper/index.d.ts.map +1 -0
  780. package/build/utils/display/wrapper/index.js +12 -0
  781. package/build/utils/display/wrapper/index.js.map +1 -0
  782. package/build/utils/display/wrapper/types.d.ts +75 -0
  783. package/build/utils/display/wrapper/types.d.ts.map +1 -0
  784. package/build/utils/display/wrapper/types.js +11 -0
  785. package/build/utils/display/wrapper/types.js.map +1 -0
  786. package/build/utils/e2eMetrics.d.ts +6 -0
  787. package/build/utils/e2eMetrics.d.ts.map +1 -0
  788. package/build/utils/e2eMetrics.js +27 -0
  789. package/build/utils/e2eMetrics.js.map +1 -0
  790. package/build/utils/hardware/hardware.d.ts +42 -0
  791. package/build/utils/hardware/hardware.d.ts.map +1 -0
  792. package/build/utils/hardware/hardware.js +131 -0
  793. package/build/utils/hardware/hardware.js.map +1 -0
  794. package/build/utils/hardware/index.d.ts +2 -0
  795. package/build/utils/hardware/index.d.ts.map +1 -0
  796. package/build/utils/hardware/index.js +2 -0
  797. package/build/utils/hardware/index.js.map +1 -0
  798. package/build/utils/memory/search.d.ts +72 -0
  799. package/build/utils/memory/search.d.ts.map +1 -0
  800. package/build/utils/memory/search.js +178 -0
  801. package/build/utils/memory/search.js.map +1 -0
  802. package/build/utils/miniappDiagnostics.d.ts +64 -0
  803. package/build/utils/miniappDiagnostics.d.ts.map +1 -0
  804. package/build/utils/miniappDiagnostics.js +173 -0
  805. package/build/utils/miniappDiagnostics.js.map +1 -0
  806. package/build/utils/miniappGlobals.d.ts +59 -0
  807. package/build/utils/miniappGlobals.d.ts.map +1 -0
  808. package/build/utils/miniappGlobals.js +223 -0
  809. package/build/utils/miniappGlobals.js.map +1 -0
  810. package/build/utils/permissions/MediaLibraryPermissions.d.ts +45 -0
  811. package/build/utils/permissions/MediaLibraryPermissions.d.ts.map +1 -0
  812. package/build/utils/permissions/MediaLibraryPermissions.js +145 -0
  813. package/build/utils/permissions/MediaLibraryPermissions.js.map +1 -0
  814. package/build/utils/permissions/galleryDisplayName.d.ts +8 -0
  815. package/build/utils/permissions/galleryDisplayName.d.ts.map +1 -0
  816. package/build/utils/permissions/galleryDisplayName.js +25 -0
  817. package/build/utils/permissions/galleryDisplayName.js.map +1 -0
  818. package/build/utils/speakerEmbedding.d.ts +8 -0
  819. package/build/utils/speakerEmbedding.d.ts.map +1 -0
  820. package/build/utils/speakerEmbedding.js +63 -0
  821. package/build/utils/speakerEmbedding.js.map +1 -0
  822. package/build/utils/storage/index.d.ts +3 -0
  823. package/build/utils/storage/index.d.ts.map +1 -0
  824. package/build/utils/storage/index.js +3 -0
  825. package/build/utils/storage/index.js.map +1 -0
  826. package/build/utils/storage/storage.d.ts +24 -0
  827. package/build/utils/storage/storage.d.ts.map +1 -0
  828. package/build/utils/storage/storage.js +85 -0
  829. package/build/utils/storage/storage.js.map +1 -0
  830. package/build/utils/storage/zip.d.ts +3 -0
  831. package/build/utils/storage/zip.d.ts.map +1 -0
  832. package/build/utils/storage/zip.js +14 -0
  833. package/build/utils/storage/zip.js.map +1 -0
  834. package/build/utils/timers/index.d.ts +3 -0
  835. package/build/utils/timers/index.d.ts.map +1 -0
  836. package/build/utils/timers/index.js +3 -0
  837. package/build/utils/timers/index.js.map +1 -0
  838. package/build/utils/timers/timers.d.ts +9 -0
  839. package/build/utils/timers/timers.d.ts.map +1 -0
  840. package/build/utils/timers/timers.js +142 -0
  841. package/build/utils/timers/timers.js.map +1 -0
  842. package/package.json +122 -0
  843. package/src/assets/silence.wav +0 -0
  844. package/src/devtools.ts +13 -0
  845. package/src/engine.ts +198 -0
  846. package/src/facades/dev.ts +213 -0
  847. package/src/facades/display.ts +17 -0
  848. package/src/facades/displayMirror.ts +33 -0
  849. package/src/facades/gallery.ts +69 -0
  850. package/src/facades/glasses.ts +219 -0
  851. package/src/facades/glassesSettings.ts +57 -0
  852. package/src/facades/glassesWifi.ts +68 -0
  853. package/src/facades/maps.ts +13 -0
  854. package/src/facades/memory.ts +46 -0
  855. package/src/facades/miniapps.ts +62 -0
  856. package/src/facades/notifications.ts +14 -0
  857. package/src/facades/ota.ts +177 -0
  858. package/src/facades/pairing.ts +329 -0
  859. package/src/facades/permissions.ts +165 -0
  860. package/src/facades/phoneNotifications.ts +41 -0
  861. package/src/facades/providerKeys.ts +31 -0
  862. package/src/facades/reports.ts +180 -0
  863. package/src/facades/session.ts +54 -0
  864. package/src/facades/settings.ts +57 -0
  865. package/src/facades/speakers.ts +152 -0
  866. package/src/facades/speech.ts +49 -0
  867. package/src/index.ts +214 -0
  868. package/src/internal.ts +155 -0
  869. package/src/runtime/bootstrap.ts +159 -0
  870. package/src/runtime/config.ts +155 -0
  871. package/src/runtime/scanQrSeam.ts +20 -0
  872. package/src/runtime/streamConfig.ts +34 -0
  873. package/src/services/AiTierResolution.ts +106 -0
  874. package/src/services/AppRegistry.ts +1245 -0
  875. package/src/services/AudioCloudUplink.ts +56 -0
  876. package/src/services/AudioPlaybackService.ts +873 -0
  877. package/src/services/AutomaticReportResult.ts +50 -0
  878. package/src/services/BlobStore.ts +823 -0
  879. package/src/services/CaptionsTesterReportService.ts +107 -0
  880. package/src/services/CloudAudioSubscriptionSync.ts +53 -0
  881. package/src/services/CloudClientService.ts +1031 -0
  882. package/src/services/CloudTranscriptE2EMetrics.ts +27 -0
  883. package/src/services/ConnectionCoordinator.ts +65 -0
  884. package/src/services/DevServerBridge.ts +334 -0
  885. package/src/services/DeviceEventRouter.ts +266 -0
  886. package/src/services/DeviceStoreHydration.ts +130 -0
  887. package/src/services/DisplayProcessor.ts +775 -0
  888. package/src/services/ForegroundLocationPermission.ts +24 -0
  889. package/src/services/GlassesReadiness.ts +103 -0
  890. package/src/services/GlassesSettingsSync.ts +140 -0
  891. package/src/services/GlassesStatusProjection.ts +73 -0
  892. package/src/services/HeadingService.ts +122 -0
  893. package/src/services/HotspotOtaTransport.ts +184 -0
  894. package/src/services/HotspotShutdown.ts +41 -0
  895. package/src/services/JSCrashController.ts +189 -0
  896. package/src/services/JSCrashloopReportService.ts +66 -0
  897. package/src/services/JSLogPipeline.ts +166 -0
  898. package/src/services/JSRouter.ts +555 -0
  899. package/src/services/LocalDisplayManager.ts +815 -0
  900. package/src/services/LocalMiniappDataMigration.ts +102 -0
  901. package/src/services/LocalMiniappRuntime.ts +5747 -0
  902. package/src/services/LocalMiniappStorage.ts +82 -0
  903. package/src/services/LocalMiniappUserIdentity.ts +79 -0
  904. package/src/services/LocalSttFallbackCoordinator.ts +247 -0
  905. package/src/services/MapboxTokenService.ts +118 -0
  906. package/src/services/MemoryCapture.ts +61 -0
  907. package/src/services/MemoryStore.ts +633 -0
  908. package/src/services/MicStateCoordinator.ts +259 -0
  909. package/src/services/MiniappEngine.ts +143 -0
  910. package/src/services/MiniappLauncher.ts +365 -0
  911. package/src/services/MiniappLiveness.ts +24 -0
  912. package/src/services/MiniappRunningRegistry.ts +57 -0
  913. package/src/services/NativeHttpResponse.ts +6 -0
  914. package/src/services/NativeNavigationService.ts +176 -0
  915. package/src/services/NavigationHandlers.ts +527 -0
  916. package/src/services/NavigationService.ts +926 -0
  917. package/src/services/NotificationsEmitter.ts +49 -0
  918. package/src/services/OfflineSpeechModelService.ts +168 -0
  919. package/src/services/OtaArtifactDownloader.ts +312 -0
  920. package/src/services/OtaInstallCoordinator.ts +1707 -0
  921. package/src/services/OtaService.ts +89 -0
  922. package/src/services/OtaUpdateCheckService.ts +550 -0
  923. package/src/services/PairingIdentity.ts +154 -0
  924. package/src/services/PhoneCalendarHelpers.ts +212 -0
  925. package/src/services/PhoneCalendarService.ts +61 -0
  926. package/src/services/PhoneCameraFovCoordinator.ts +210 -0
  927. package/src/services/PhoneLocationService.ts +120 -0
  928. package/src/services/PhoneNotificationsSync.ts +46 -0
  929. package/src/services/PhonePhotoCoordinator.ts +435 -0
  930. package/src/services/PhoneStreamCoordinator.ts +874 -0
  931. package/src/services/PhoneVideoCoordinator.ts +203 -0
  932. package/src/services/ProviderKeyValidation.ts +57 -0
  933. package/src/services/STTModelManager.ts +434 -0
  934. package/src/services/SceneRenderer.ts +320 -0
  935. package/src/services/SentenceTtsPipeline.ts +106 -0
  936. package/src/services/SpeakerIdModelManager.ts +151 -0
  937. package/src/services/SpeakerIdSync.ts +79 -0
  938. package/src/services/SpeakerLabelResolver.ts +140 -0
  939. package/src/services/SpeakerProfileStore.ts +265 -0
  940. package/src/services/SpeakerSegmentResolver.ts +194 -0
  941. package/src/services/StreamLifecycleController.ts +203 -0
  942. package/src/services/SupportProfileSync.ts +218 -0
  943. package/src/services/TTSModelManager.ts +466 -0
  944. package/src/services/TranscriptionRouting.ts +47 -0
  945. package/src/services/TtsTextSanitizer.ts +66 -0
  946. package/src/services/UIRouter.ts +250 -0
  947. package/src/services/WebviewBridge.ts +50 -0
  948. package/src/services/WifiAdbRequest.ts +53 -0
  949. package/src/services/asg/GalleryMediaIntegrityReportService.ts +72 -0
  950. package/src/services/asg/asgCameraApi.ts +1786 -0
  951. package/src/services/asg/cameraRollExportCoordinator.ts +627 -0
  952. package/src/services/asg/cameraRollExportLedger.ts +122 -0
  953. package/src/services/asg/galleryMediaValidation.ts +185 -0
  954. package/src/services/asg/galleryNotices.ts +61 -0
  955. package/src/services/asg/galleryPathMigration.ts +22 -0
  956. package/src/services/asg/gallerySettingsService.ts +68 -0
  957. package/src/services/asg/gallerySyncNotifications.ts +235 -0
  958. package/src/services/asg/gallerySyncService.ts +2278 -0
  959. package/src/services/asg/galleryTransferLedger.ts +312 -0
  960. package/src/services/asg/localNetworkTransport.ts +169 -0
  961. package/src/services/asg/localStorageService.ts +652 -0
  962. package/src/services/asg/mediaProcessingQueue.ts +518 -0
  963. package/src/services/audioPlaybackAssets.ts +8 -0
  964. package/src/services/blobPaths.ts +86 -0
  965. package/src/services/cloudStreamApi.ts +142 -0
  966. package/src/services/effectiveCapabilities.ts +27 -0
  967. package/src/services/gallerySyncClock.ts +39 -0
  968. package/src/services/glassesClockSync.ts +115 -0
  969. package/src/services/manifestActions.ts +80 -0
  970. package/src/services/manifestVersionGate.ts +43 -0
  971. package/src/services/memoryStoreInstance.ts +70 -0
  972. package/src/services/navigation/roadNameResolver.ts +103 -0
  973. package/src/services/navigation/routesApiCodec.ts +69 -0
  974. package/src/services/otaDisplayState.ts +156 -0
  975. package/src/services/otaInstallPolicy.ts +132 -0
  976. package/src/services/otaLegacyMapping.ts +71 -0
  977. package/src/services/otaManifestUrl.ts +53 -0
  978. package/src/services/slimStreamStatus.ts +39 -0
  979. package/src/services/soniox/SonioxDirectService.ts +517 -0
  980. package/src/services/soniox/SonioxRealtimeClient.ts +349 -0
  981. package/src/services/soniox/SonioxTokenAssembler.ts +451 -0
  982. package/src/services/speakerProfileStoreInstance.ts +25 -0
  983. package/src/services/uiShim.ts +375 -0
  984. package/src/stores/apps.ts +626 -0
  985. package/src/stores/bluetoothSettingKeys.ts +35 -0
  986. package/src/stores/cloudClientStatus.ts +37 -0
  987. package/src/stores/connection.ts +69 -0
  988. package/src/stores/core.ts +32 -0
  989. package/src/stores/display.ts +121 -0
  990. package/src/stores/gallerySync.ts +384 -0
  991. package/src/stores/glasses.ts +314 -0
  992. package/src/stores/settings.ts +1299 -0
  993. package/src/stores/transcriptionDebug.ts +0 -0
  994. package/src/types/applet.ts +121 -0
  995. package/src/types/asg.ts +58 -0
  996. package/src/types/capabilities/even-realities-g1.ts +70 -0
  997. package/src/types/capabilities/even-realities-g2.ts +98 -0
  998. package/src/types/capabilities/mentra-display.ts +78 -0
  999. package/src/types/capabilities/mentra-live.ts +106 -0
  1000. package/src/types/capabilities/nimo.ts +84 -0
  1001. package/src/types/capabilities/none.ts +79 -0
  1002. package/src/types/capabilities/simulated-glasses.ts +95 -0
  1003. package/src/types/capabilities/vuzix-z100.ts +67 -0
  1004. package/src/types/enums.ts +27 -0
  1005. package/src/types/hardware.ts +220 -0
  1006. package/src/types/index.ts +38 -0
  1007. package/src/utils/GlobalEventEmitter.ts +15 -0
  1008. package/src/utils/cloudClient/RnUdpAdapter.ts +47 -0
  1009. package/src/utils/cloudClient/cloudSecureStore.ts +28 -0
  1010. package/src/utils/configuredDevHost.ts +17 -0
  1011. package/src/utils/debouncedPatch.ts +28 -0
  1012. package/src/utils/devLogging.ts +140 -0
  1013. package/src/utils/devMiniappLaunch.ts +196 -0
  1014. package/src/utils/diagnosticContext.ts +159 -0
  1015. package/src/utils/display/composer/ColumnComposer.ts +285 -0
  1016. package/src/utils/display/composer/index.ts +15 -0
  1017. package/src/utils/display/helpers/DisplayHelpers.ts +409 -0
  1018. package/src/utils/display/helpers/ScrollView.ts +326 -0
  1019. package/src/utils/display/helpers/index.ts +14 -0
  1020. package/src/utils/display/index.ts +273 -0
  1021. package/src/utils/display/measurer/TextMeasurer.ts +346 -0
  1022. package/src/utils/display/measurer/index.ts +21 -0
  1023. package/src/utils/display/measurer/script-detection.ts +218 -0
  1024. package/src/utils/display/profiles/g1.ts +236 -0
  1025. package/src/utils/display/profiles/g2.ts +39 -0
  1026. package/src/utils/display/profiles/index.ts +28 -0
  1027. package/src/utils/display/profiles/nex.ts +166 -0
  1028. package/src/utils/display/profiles/types.ts +132 -0
  1029. package/src/utils/display/profiles/z100.ts +198 -0
  1030. package/src/utils/display/scene/anchor.ts +39 -0
  1031. package/src/utils/display/scene/degrade.ts +80 -0
  1032. package/src/utils/display/scene/differ.ts +128 -0
  1033. package/src/utils/display/scene/index.ts +24 -0
  1034. package/src/utils/display/scene/process.ts +228 -0
  1035. package/src/utils/display/scene/store.ts +0 -0
  1036. package/src/utils/display/scene/types.ts +0 -0
  1037. package/src/utils/display/wrapper/TextWrapper.ts +546 -0
  1038. package/src/utils/display/wrapper/index.ts +15 -0
  1039. package/src/utils/display/wrapper/types.ts +102 -0
  1040. package/src/utils/e2eMetrics.ts +30 -0
  1041. package/src/utils/hardware/hardware.ts +171 -0
  1042. package/src/utils/hardware/index.ts +1 -0
  1043. package/src/utils/memory/search.ts +204 -0
  1044. package/src/utils/miniappDiagnostics.ts +226 -0
  1045. package/src/utils/miniappGlobals.ts +259 -0
  1046. package/src/utils/permissions/MediaLibraryPermissions.ts +161 -0
  1047. package/src/utils/permissions/galleryDisplayName.ts +28 -0
  1048. package/src/utils/speakerEmbedding.ts +58 -0
  1049. package/src/utils/storage/index.ts +2 -0
  1050. package/src/utils/storage/storage.ts +101 -0
  1051. package/src/utils/storage/zip.ts +13 -0
  1052. package/src/utils/timers/index.ts +2 -0
  1053. package/src/utils/timers/timers.ts +175 -0
@@ -0,0 +1,1031 @@
1
+ /**
2
+ * Owns the singleton `@glassly/cloud-client` (CloudClient) for the engine runtime
3
+ * — the keystone move that pulls backend comms INTO engine.
4
+ *
5
+ * engine constructs the client from engine-owned pieces (the native UDP socket,
6
+ * the MMKV secure store, the cloud-status store) plus the two things the host
7
+ * provides through the engine front door: `auth.getSubjectToken` (the one
8
+ * permanent seam — the OEM owns login) and the resolved cloud endpoints
9
+ * (`config.coreUrl/runtimeUrl`, computed host-side from dev/settings). On init it
10
+ * exposes cloud runtime methods directly from this service, so the host no longer
11
+ * injects a cloud adapter — engine owns construction and wiring.
12
+ *
13
+ * The local-miniapp path drives the cloud's transcription/translation through
14
+ * this service.
15
+ */
16
+ import {CloudClient, setNativeHttp, setNativeUdp, setSecureStorage} from "@glassly/cloud-client/react-native"
17
+ import type {PreinstalledMiniappRegistry, RuntimeSnapshot} from "@glassly/cloud-client/react-native"
18
+ import type {SubjectTokenType} from "@glassly/cloud-client"
19
+ import {Platform} from "react-native"
20
+ import type {AudioSubscription, QuotaStatusPayload, TranscriptionData, TranslationData} from "@glassly/cloud-protocol"
21
+
22
+ import BluetoothSdk from "@glassly/bluetooth-sdk/internal"
23
+ import CrustModule from "@glassly/crust"
24
+ import {getAuth, getConfigValues} from "../runtime/bootstrap"
25
+ import {useSettingsStore, SETTINGS} from "../stores/settings"
26
+ import {type CloudClientStatusSnapshot, type MiniappAuthToken} from "../runtime/config"
27
+ import {createCloudUdpSocket} from "../utils/cloudClient/RnUdpAdapter"
28
+ import {cloudSecureStore} from "../utils/cloudClient/cloudSecureStore"
29
+ import {storage as mmkvStorage} from "../utils/storage"
30
+ import {useCloudClientStatusStore} from "../stores/cloudClientStatus"
31
+ import {islandNotifications} from "./NotificationsEmitter"
32
+ import {BgTimer} from "../utils/timers"
33
+ import {logCloudV2TranscriptMetric} from "./CloudTranscriptE2EMetrics"
34
+ import {isLocalUserId, LocalMiniappUserIdentity} from "./LocalMiniappUserIdentity"
35
+ import {migrateLocalMiniappData, type LocalMiniappDataMigrationBackend} from "./LocalMiniappDataMigration"
36
+ import {nativeHttpResponseBody} from "./NativeHttpResponse"
37
+
38
+ const LOG_TAG = "cloudClient"
39
+ type CloudCore = NonNullable<CloudClient["core"]>
40
+
41
+ // Persistent cloud-disconnect detector: the cloud-client reconnect loop is infinite
42
+ // and never surfaces a "giving up" signal, so "persistent failure" = the session has
43
+ // been continuously NOT connected for this long. A quick reconnect cancels it; brief
44
+ // flaps that recover don't fire. Raised as engine.notifications(connection_failed_persistent).
45
+ const CLOUD_PERSISTENT_FAILURE_MS = 60_000
46
+ const LOCAL_MINIAPP_USER_ID_KEY = "glassly.localMiniapp.userId"
47
+
48
+ /** Cancel the pending persistent-failure alarm + re-arm for the next outage. */
49
+ function clearPersistentFailureAlarm(): void {
50
+ if (persistentFailureTimer) {
51
+ BgTimer.clearTimeout(persistentFailureTimer)
52
+ persistentFailureTimer = null
53
+ }
54
+ persistentFailureNotified = false
55
+ }
56
+
57
+ type Lc3FrameSizeBytes = 20 | 40 | 60
58
+
59
+ // Neutral last-ditch fallbacks (reachable under `adb reverse`) for when the host
60
+ // passes no endpoints. The host normally resolves the real URLs (dev override /
61
+ // Metro host / env) and hands them in via `engine.configure({config})`.
62
+ const FALLBACK_CORE_URL = "http://localhost:3000"
63
+ const FALLBACK_RUNTIME_URL = "http://localhost:3001"
64
+ const LOCAL_AUTH_PORT = 3002
65
+
66
+ let client: CloudClient | null = null
67
+ let connected = false
68
+ let persistentFailureTimer: ReturnType<typeof BgTimer.setTimeout> | null = null
69
+ let persistentFailureNotified = false
70
+ let audioSubscriptions: AudioSubscription[] = []
71
+ let transportsReady = false
72
+ /** Endpoints to build with — seeded from config, overridable via reconnect(). */
73
+ let endpointsOverride: {core: string; runtime: string} | null = null
74
+ let runtimeStatusUnsubscribe: (() => void) | null = null
75
+ let transcriptUnsubscribe: (() => void) | null = null
76
+ let translationUnsubscribe: (() => void) | null = null
77
+ let quotaUnsubscribe: (() => void) | null = null
78
+ let authStateUnsubscribe: (() => void) | null = null
79
+ let localDevRuntimeToken: {runtimeUrl: string; token: string; expiresAtMs: number} | null = null
80
+ let lc3FrameSizeUnsubscribe: (() => void) | null = null
81
+ let disableCloudUnsubscribe: (() => void) | null = null
82
+ let coreTokenSyncPromise: Promise<string> | null = null
83
+ /**
84
+ * A device-local namespace (`local_…`) whose data still needs to be adopted
85
+ * into the account namespace. Set when a sign-in displaces a local id; cleared
86
+ * once {@link adoptLocalNamespace} has moved the data.
87
+ */
88
+ let pendingLocalNamespace: string | null = null
89
+
90
+ /**
91
+ * Moves blob bytes between user directories during namespace adoption.
92
+ * Registered by LocalMiniappRuntime (which owns the BlobStore instance) so this
93
+ * service doesn't import it and create a cycle. Absent in tests / before the
94
+ * runtime boots, in which case only the key-value stores migrate.
95
+ */
96
+ type BlobNamespaceMigrator = (fromUserId: string, toUserId: string) => {moved: number; skipped: number}
97
+ let blobNamespaceMigrator: BlobNamespaceMigrator | null = null
98
+
99
+ /**
100
+ * Register the blob-bytes half of namespace adoption. Called by
101
+ * LocalMiniappRuntime at construction — it owns the BlobStore instance, and
102
+ * having it push the hook here keeps this service from importing the runtime.
103
+ */
104
+ export function setBlobNamespaceMigrator(migrator: BlobNamespaceMigrator | null): void {
105
+ blobNamespaceMigrator = migrator
106
+ }
107
+
108
+ /** Result-free view of MMKV, as the migration's plain get/set/remove/keys. */
109
+ const migrationBackend: LocalMiniappDataMigrationBackend = {
110
+ get(key: string): unknown | null {
111
+ const result = mmkvStorage.load<unknown>(key)
112
+ return result.is_ok() ? result.value : null
113
+ },
114
+ set(key: string, value: unknown): void {
115
+ const result = mmkvStorage.save(key, value)
116
+ if (result.is_error()) throw result.error
117
+ },
118
+ remove(key: string): void {
119
+ const result = mmkvStorage.remove(key)
120
+ if (result.is_error()) throw result.error
121
+ },
122
+ keys(): string[] {
123
+ return mmkvStorage.getAllKeys()
124
+ },
125
+ }
126
+
127
+ /**
128
+ * Adopt data written under a device-local namespace into the signed-in
129
+ * account's, so miniapp state created while cloud was disabled survives
130
+ * sign-in. No-op unless a sign-in actually displaced a local id.
131
+ */
132
+ function adoptLocalNamespace(coreUserId: string): void {
133
+ const from = pendingLocalNamespace
134
+ if (!from) return
135
+ // Clear first: a failure must not re-run on every subsequent resolve, and the
136
+ // migration is idempotent anyway.
137
+ pendingLocalNamespace = null
138
+ if (!coreUserId || from === coreUserId) return
139
+
140
+ try {
141
+ const keys = migrateLocalMiniappData(migrationBackend, from, coreUserId)
142
+ const blobs = blobNamespaceMigrator?.(from, coreUserId) ?? {moved: 0, skipped: 0}
143
+ if (keys.moved || keys.skipped || blobs.moved || blobs.skipped) {
144
+ console.log(
145
+ `${LOG_TAG}: adopted local miniapp data into account namespace ` +
146
+ `(keys ${keys.moved} moved/${keys.skipped} skipped, blobs ${blobs.moved} moved/${blobs.skipped} skipped)`,
147
+ )
148
+ }
149
+ } catch (err) {
150
+ console.warn(`${LOG_TAG}: local namespace adoption failed: ${(err as Error)?.message ?? err}`)
151
+ }
152
+ }
153
+
154
+ const localMiniappUserIdentity = new LocalMiniappUserIdentity({
155
+ get(): string | null {
156
+ const result = mmkvStorage.load<string>(LOCAL_MINIAPP_USER_ID_KEY)
157
+ return result.is_ok() ? result.value : null
158
+ },
159
+ set(userId: string): void {
160
+ const result = mmkvStorage.save(LOCAL_MINIAPP_USER_ID_KEY, userId)
161
+ if (result.is_error()) throw result.error
162
+ },
163
+ remove(): void {
164
+ const result = mmkvStorage.remove(LOCAL_MINIAPP_USER_ID_KEY)
165
+ if (result.is_error()) throw result.error
166
+ },
167
+ })
168
+
169
+ const transcriptListeners = new Set<(d: TranscriptionData) => void>()
170
+ const translationListeners = new Set<(d: TranslationData) => void>()
171
+ const quotaListeners = new Set<(d: QuotaStatusPayload) => void>()
172
+ const statusListeners = new Set<(snapshot: CloudClientStatusSnapshot) => void>()
173
+ const connectionListeners = new Set<(connected: boolean) => void>()
174
+
175
+ function resolveEndpoints(): {core: string; runtime: string} {
176
+ if (endpointsOverride) return endpointsOverride
177
+ const cfg = getConfigValues()
178
+ return {
179
+ core: cfg.coreUrl?.trim() || FALLBACK_CORE_URL,
180
+ runtime: cfg.runtimeUrl?.trim() || FALLBACK_RUNTIME_URL,
181
+ }
182
+ }
183
+
184
+ function getCoreClient(): CloudCore {
185
+ if (!client) construct()
186
+ const core = client?.core
187
+ if (!core) throw new Error("cloud client core not configured")
188
+ return core
189
+ }
190
+
191
+ function syncCoreAccessTokenToBluetooth(): Promise<string> {
192
+ if (coreTokenSyncPromise) return coreTokenSyncPromise
193
+
194
+ coreTokenSyncPromise = syncCoreAccessTokenToBluetoothInternal().finally(() => {
195
+ coreTokenSyncPromise = null
196
+ })
197
+ return coreTokenSyncPromise
198
+ }
199
+
200
+ async function syncCoreAccessTokenToBluetoothInternal(): Promise<string> {
201
+ if (!client) construct()
202
+ const c = client
203
+ if (!c) throw new Error("cloud client not initialized")
204
+
205
+ const token = await c.auth.getCoreToken()
206
+ if (c !== client) {
207
+ throw new Error("cloud client changed while syncing core token")
208
+ }
209
+ adoptLocalNamespace(c.auth.identity.glasslyUserId)
210
+ localMiniappUserIdentity.remember(c.auth.identity.glasslyUserId)
211
+ const result = await useSettingsStore.getState().setSetting(SETTINGS.core_token.key, token, false)
212
+ if (result.is_error()) {
213
+ throw result.error
214
+ }
215
+
216
+ try {
217
+ await BluetoothSdk.updateBluetoothSettings({[SETTINGS.core_token.key]: token})
218
+ } catch (err) {
219
+ console.warn(`${LOG_TAG}: direct Bluetooth core_token sync failed: ${(err as Error)?.message ?? err}`)
220
+ }
221
+
222
+ return token
223
+ }
224
+
225
+ function frameSizeBytes(): Lc3FrameSizeBytes {
226
+ // Read LIVE from the engine settings store (the source of truth) so a
227
+ // reconnect after a glasses swap (G1=20 ↔ G2=40) picks up the new frame size,
228
+ // not the one-time engine.configure({config}) snapshot. Falls back to the
229
+ // config value (set at boot) then 20 when the setting is unset.
230
+ const fromSettings = useSettingsStore.getState().getSetting(SETTINGS.lc3_frame_size.key)
231
+ const size = fromSettings ?? getConfigValues().audioFrameSizeBytes
232
+ return size === 20 || size === 40 || size === 60 ? size : 20
233
+ }
234
+
235
+ async function getSubjectToken(): Promise<{token: string; type: SubjectTokenType}> {
236
+ const a = getAuth()
237
+ if (!a) throw new Error("cloudClient: engine.configure({auth}) not called")
238
+ const r = await a.getSubjectToken()
239
+ // IslandAuth's SubjectTokenType is intentionally open (`string & {}`) so OEMs
240
+ // can use other token kinds; cloud-client's is a closed union. The host's
241
+ // actual value ("supabase") is valid — narrow at this boundary.
242
+ return {token: r.token, type: r.type as SubjectTokenType}
243
+ }
244
+
245
+ function normalizeExpiresAt(expiresAt: number): number {
246
+ return expiresAt < 10_000_000_000 ? expiresAt * 1000 : expiresAt
247
+ }
248
+
249
+ function shouldUseLocalDevRuntimeToken(endpoints: {runtime: string}): boolean {
250
+ if (!__DEV__) return false
251
+ try {
252
+ const host = new URL(endpoints.runtime).hostname
253
+ return host === "localhost" || host === "127.0.0.1" || host === "10.0.2.2"
254
+ } catch {
255
+ return false
256
+ }
257
+ }
258
+
259
+ async function getLocalDevRuntimeToken(runtimeEndpoint: string, opts?: {forceRefresh?: boolean}): Promise<string> {
260
+ const now = Date.now()
261
+ if (
262
+ !opts?.forceRefresh &&
263
+ localDevRuntimeToken?.runtimeUrl === runtimeEndpoint &&
264
+ localDevRuntimeToken.expiresAtMs - now > 60_000
265
+ ) {
266
+ return localDevRuntimeToken.token
267
+ }
268
+
269
+ const base = new URL(runtimeEndpoint)
270
+ base.port = String(LOCAL_AUTH_PORT)
271
+ base.pathname = "/api/dev/runtime-token"
272
+ base.search = new URLSearchParams({userId: "local-phone-user", tenantId: "glassly"}).toString()
273
+
274
+ const res = await fetch(base.toString())
275
+ if (!res.ok) {
276
+ throw new Error(`cloudClient: local dev runtime token failed (${res.status})`)
277
+ }
278
+ const body = (await res.json()) as {access_token?: string; expires_in?: number}
279
+ if (!body.access_token) {
280
+ throw new Error("cloudClient: local dev runtime token response missing access_token")
281
+ }
282
+ localDevRuntimeToken = {
283
+ runtimeUrl: runtimeEndpoint,
284
+ token: body.access_token,
285
+ expiresAtMs: now + (body.expires_in ?? 300) * 1000,
286
+ }
287
+ return body.access_token
288
+ }
289
+
290
+ function toCloudClientStatusSnapshot(snapshot: RuntimeSnapshot): CloudClientStatusSnapshot {
291
+ return {status: snapshot.status, audioTransport: snapshot.audioTransport}
292
+ }
293
+
294
+ function currentRuntimeStatus(): CloudClientStatusSnapshot {
295
+ const state = useCloudClientStatusStore.getState()
296
+ return {status: state.status, audioTransport: state.audioTransport}
297
+ }
298
+
299
+ function setRuntimeStatus(snapshot: RuntimeSnapshot): void {
300
+ useCloudClientStatusStore.getState().setSnapshot(snapshot)
301
+ emitStatus(toCloudClientStatusSnapshot(snapshot))
302
+ }
303
+
304
+ function resetRuntimeStatus(): void {
305
+ useCloudClientStatusStore.getState().reset()
306
+ emitStatus(currentRuntimeStatus())
307
+ }
308
+
309
+ function stringifyMeta(meta: unknown): string {
310
+ if (!meta || typeof meta !== "object") return ""
311
+ try {
312
+ return ` ${JSON.stringify(meta)}`
313
+ } catch {
314
+ return ""
315
+ }
316
+ }
317
+
318
+ const cloudLogger = {
319
+ debug: (msg: string, meta?: unknown) => console.log(`${LOG_TAG}: debug: ${msg}${stringifyMeta(meta)}`),
320
+ info: (msg: string, meta?: unknown) => console.log(`${LOG_TAG}: info: ${msg}${stringifyMeta(meta)}`),
321
+ warn: (msg: string, meta?: unknown) => console.warn(`${LOG_TAG}: warn: ${msg}${stringifyMeta(meta)}`),
322
+ error: (msg: string, meta?: unknown) => console.warn(`${LOG_TAG}: error: ${msg}${stringifyMeta(meta)}`),
323
+ }
324
+
325
+ function notifyConnectionListeners(next: boolean): void {
326
+ for (const l of connectionListeners) {
327
+ try {
328
+ l(next)
329
+ } catch (err) {
330
+ console.warn(`${LOG_TAG}: connection listener threw: ${(err as Error)?.message ?? err}`)
331
+ }
332
+ }
333
+ }
334
+
335
+ function extractUnsubscribe(sub: unknown): (() => void) | null {
336
+ const candidates: unknown[] = []
337
+ const s = sub as Record<string, unknown> | null | undefined
338
+ if (s && typeof s === "object") {
339
+ candidates.push(s)
340
+ candidates.push((s.value as Record<string, unknown>)?.subscription)
341
+ candidates.push((s.data as Record<string, unknown>)?.subscription)
342
+ candidates.push(s.subscription)
343
+ }
344
+ for (const c of candidates) {
345
+ const unsub = (c as {unsubscribe?: unknown})?.unsubscribe
346
+ if (typeof unsub === "function") return unsub as () => void
347
+ }
348
+ return null
349
+ }
350
+
351
+ function ensureAuthWatch(): void {
352
+ if (authStateUnsubscribe) return
353
+ authStateUnsubscribe = () => {}
354
+
355
+ const auth = getAuth()
356
+ if (!auth?.onStateChange) return
357
+
358
+ let reconnectPending = false
359
+ try {
360
+ const sub = auth.onStateChange((event, session) => {
361
+ if (event === "SIGNED_OUT") {
362
+ localMiniappUserIdentity.forget()
363
+ return
364
+ }
365
+ // A new sign-in may belong to a different account. Force the next
366
+ // storage request to resolve and persist that account's Core identity.
367
+ // A device-local namespace is remembered first so the data written while
368
+ // cloud was off can follow the user into the account (see
369
+ // adoptLocalNamespace).
370
+ if (event === "SIGNED_IN") {
371
+ const local = localMiniappUserIdentity.get()
372
+ if (local && isLocalUserId(local)) pendingLocalNamespace = local
373
+ localMiniappUserIdentity.forget()
374
+ }
375
+ if (!session?.token) return
376
+ if (connected || reconnectPending) return
377
+
378
+ reconnectPending = true
379
+ console.log(`${LOG_TAG}: auth session available (${event}) while disconnected — reconnecting`)
380
+ try {
381
+ cloudClientService.reconnect()
382
+ } finally {
383
+ setTimeout(() => {
384
+ reconnectPending = false
385
+ }, 0)
386
+ }
387
+ })
388
+
389
+ const unsub = extractUnsubscribe(sub)
390
+ if (unsub) authStateUnsubscribe = unsub
391
+ } catch (err) {
392
+ console.warn(`${LOG_TAG}: auth watch subscribe failed: ${(err as Error)?.message ?? err}`)
393
+ }
394
+ }
395
+
396
+ function stopAuthWatch(): void {
397
+ authStateUnsubscribe?.()
398
+ authStateUnsubscribe = null
399
+ }
400
+
401
+ function emitTranscript(data: TranscriptionData): void {
402
+ for (const l of transcriptListeners) {
403
+ try {
404
+ l(data)
405
+ } catch (err) {
406
+ console.warn(`${LOG_TAG}: transcript listener threw: ${(err as Error)?.message ?? err}`)
407
+ }
408
+ }
409
+ }
410
+
411
+ function emitTranslation(data: TranslationData): void {
412
+ for (const l of translationListeners) {
413
+ try {
414
+ l(data)
415
+ } catch (err) {
416
+ console.warn(`${LOG_TAG}: translation listener threw: ${(err as Error)?.message ?? err}`)
417
+ }
418
+ }
419
+ }
420
+
421
+ function emitQuota(data: QuotaStatusPayload): void {
422
+ for (const l of quotaListeners) {
423
+ try {
424
+ l(data)
425
+ } catch (err) {
426
+ console.warn(`${LOG_TAG}: quota listener threw: ${(err as Error)?.message ?? err}`)
427
+ }
428
+ }
429
+ }
430
+
431
+ function emitStatus(snapshot: CloudClientStatusSnapshot): void {
432
+ for (const l of statusListeners) {
433
+ try {
434
+ l(snapshot)
435
+ } catch (err) {
436
+ console.warn(`${LOG_TAG}: status listener threw: ${(err as Error)?.message ?? err}`)
437
+ }
438
+ }
439
+ }
440
+
441
+ function ensureTransports(): void {
442
+ if (transportsReady) return
443
+ transportsReady = true
444
+ setNativeUdp(() => createCloudUdpSocket())
445
+ setSecureStorage(cloudSecureStore)
446
+ if (Platform.OS !== "android") return
447
+ setNativeHttp(async (input, init) => {
448
+ if (typeof input !== "string" || (init?.body != null && typeof init.body !== "string")) {
449
+ return globalThis.fetch(input, init)
450
+ }
451
+ const headers = Object.fromEntries(new Headers(init?.headers).entries())
452
+ const result = await CrustModule.nativeHttpRequest(
453
+ init?.method ?? "GET",
454
+ input,
455
+ headers,
456
+ (init?.body as string | undefined) ?? null,
457
+ )
458
+ return new Response(nativeHttpResponseBody(result.status, result.body), {
459
+ status: result.status,
460
+ statusText: result.statusText,
461
+ headers: result.headers,
462
+ })
463
+ })
464
+ }
465
+
466
+ function clearRuntimeEventSubscriptions(): void {
467
+ runtimeStatusUnsubscribe?.()
468
+ runtimeStatusUnsubscribe = null
469
+ transcriptUnsubscribe?.()
470
+ transcriptUnsubscribe = null
471
+ translationUnsubscribe?.()
472
+ translationUnsubscribe = null
473
+ quotaUnsubscribe?.()
474
+ quotaUnsubscribe = null
475
+ }
476
+
477
+ /**
478
+ * The user's hard "never talk to Glassly cloud" stance (Settings > Privacy).
479
+ * Read imperatively at every would-be-connect point rather than cached, so
480
+ * flipping the toggle takes effect without a restart. `=== true` because
481
+ * getSetting is `any` and an unhydrated store must not read as "disabled".
482
+ */
483
+ function cloudDisabled(): boolean {
484
+ return useSettingsStore.getState().getSetting(SETTINGS.disable_cloud.key) === true
485
+ }
486
+
487
+ function startLc3FrameSizeWatcher(): void {
488
+ if (lc3FrameSizeUnsubscribe) return
489
+
490
+ let last = frameSizeBytes()
491
+ lc3FrameSizeUnsubscribe = useSettingsStore.subscribe(
492
+ (state) => state.getSetting(SETTINGS.lc3_frame_size.key),
493
+ () => {
494
+ const next = frameSizeBytes()
495
+ if (next === last) return
496
+ last = next
497
+ if (!client) return
498
+ console.log(`${LOG_TAG}: LC3 frame size changed to ${next}; reconnecting runtime`)
499
+ cloudClientService.reconnect()
500
+ },
501
+ )
502
+ }
503
+
504
+ function stopLc3FrameSizeWatcher(): void {
505
+ lc3FrameSizeUnsubscribe?.()
506
+ lc3FrameSizeUnsubscribe = null
507
+ }
508
+
509
+ /**
510
+ * Apply a mid-session flip of the Privacy toggle without a restart: turning it
511
+ * on tears the live client down, turning it back off reconnects. Installed by
512
+ * init() on BOTH branches — when cloud starts disabled there is no client to
513
+ * hang the watcher off, but we still need to notice the user re-enabling it.
514
+ */
515
+ function startDisableCloudWatcher(): void {
516
+ if (disableCloudUnsubscribe) return
517
+
518
+ let last = cloudDisabled()
519
+ disableCloudUnsubscribe = useSettingsStore.subscribe(
520
+ (state) => state.getSetting(SETTINGS.disable_cloud.key),
521
+ () => {
522
+ const next = cloudDisabled()
523
+ if (next === last) return
524
+ last = next
525
+ if (next) {
526
+ console.log(`${LOG_TAG}: cloud disabled — tearing down client`)
527
+ cloudClientService.stop()
528
+ } else {
529
+ console.log(`${LOG_TAG}: cloud re-enabled — reconnecting`)
530
+ cloudClientService.init()
531
+ }
532
+ },
533
+ )
534
+ }
535
+
536
+ function stopDisableCloudWatcher(): void {
537
+ disableCloudUnsubscribe?.()
538
+ disableCloudUnsubscribe = null
539
+ }
540
+
541
+ function construct(): void {
542
+ ensureTransports()
543
+
544
+ const endpoints = resolveEndpoints()
545
+ console.log(`${LOG_TAG}: endpoints ${JSON.stringify(endpoints)}`)
546
+
547
+ const coreAuth = {getSubjectToken}
548
+ const auth = shouldUseLocalDevRuntimeToken(endpoints)
549
+ ? {
550
+ core: coreAuth,
551
+ runtime: {getToken: (opts?: {forceRefresh?: boolean}) => getLocalDevRuntimeToken(endpoints.runtime, opts)},
552
+ }
553
+ : {core: coreAuth, runtime: {source: "core" as const}}
554
+
555
+ client = new CloudClient({
556
+ endpoints,
557
+ // The phone LC3-encodes mic audio (even in phone/simulated mode); announce
558
+ // LC3 at 16 kHz with the frame size the encoder emits.
559
+ audio: {codec: "lc3", sampleRate: 16000, frameSizeBytes: frameSizeBytes()},
560
+ auth,
561
+ timers: {
562
+ setTimeout: (callback, delayMs) => BgTimer.setTimeout(callback, delayMs),
563
+ clearTimeout: (handle) => BgTimer.clearTimeout(handle as number),
564
+ setInterval: (callback, intervalMs) => BgTimer.setInterval(callback, intervalMs),
565
+ clearInterval: (handle) => BgTimer.clearInterval(handle as number),
566
+ },
567
+ logger: cloudLogger,
568
+ })
569
+
570
+ const c = client
571
+ clearRuntimeEventSubscriptions()
572
+ runtimeStatusUnsubscribe = c.runtime.onStatusChanged((status) => {
573
+ if (c !== client) return
574
+ setRuntimeStatus(status)
575
+ })
576
+ transcriptUnsubscribe = c.runtime.onTranscript((data) => {
577
+ if (c !== client) return
578
+ logCloudV2TranscriptMetric(data)
579
+ emitTranscript(data)
580
+ })
581
+ translationUnsubscribe = c.runtime.onTranslation((data) => {
582
+ if (c !== client) return
583
+ emitTranslation(data)
584
+ })
585
+ quotaUnsubscribe = c.runtime.onQuota((data) => {
586
+ if (c !== client) return
587
+ emitQuota(data)
588
+ })
589
+ setRuntimeStatus(c.runtime.getStatus())
590
+
591
+ c.runtime.onConnected(() => {
592
+ if (c !== client) return
593
+ connected = true
594
+ console.log(`${LOG_TAG}: runtime connected`)
595
+ console.log(`${LOG_TAG}: debug: ws-session-debug connected`)
596
+ // Cloud is up — cancel any pending persistent-failure alarm and re-arm for the
597
+ // next outage.
598
+ clearPersistentFailureAlarm()
599
+ // Re-apply the authoritative subscription set, including the empty set, so
600
+ // a fresh phone launch clears any stale server-side audio subscriptions.
601
+ c.runtime
602
+ .setSubscriptions(audioSubscriptions)
603
+ .catch((err) =>
604
+ console.warn(`${LOG_TAG}: re-applying queued subscriptions failed: ${(err as Error)?.message ?? err}`),
605
+ )
606
+ notifyConnectionListeners(true)
607
+ })
608
+ c.runtime.onDisconnected((info) => {
609
+ if (c !== client) return
610
+ connected = false
611
+ console.log(`${LOG_TAG}: runtime disconnected (${info.reason})`)
612
+ console.log(
613
+ `${LOG_TAG}: debug: ws-session-debug disconnected reason=${info.reason} willStayDown=${/superseded by newer session/i.test(info.reason)}`,
614
+ )
615
+ // Arm the persistent-failure alarm once; if we're still down when it fires, raise
616
+ // the notification. A reconnect within the window cancels it (onConnected above).
617
+ if (!persistentFailureTimer && !persistentFailureNotified) {
618
+ persistentFailureTimer = BgTimer.setTimeout(() => {
619
+ persistentFailureTimer = null
620
+ if (connected) return
621
+ persistentFailureNotified = true
622
+ islandNotifications.emit({
623
+ kind: "connection_failed_persistent",
624
+ reason: `Cloud session has been disconnected for over ${Math.round(CLOUD_PERSISTENT_FAILURE_MS / 1000)}s`,
625
+ metadata: {downForMs: CLOUD_PERSISTENT_FAILURE_MS, lastReason: info.reason},
626
+ timestamp: Date.now(),
627
+ })
628
+ }, CLOUD_PERSISTENT_FAILURE_MS)
629
+ }
630
+ notifyConnectionListeners(false)
631
+ })
632
+ c.runtime.onError((err) => {
633
+ console.warn(`${LOG_TAG}: runtime error: ${err.code}`)
634
+ })
635
+
636
+ // Dead credentials (refresh AND subject exchange both failed). Surface to
637
+ // the host so it can force a re-login — otherwise the app looks signed-in
638
+ // while every cloud feature silently fails. Fires at most once per client
639
+ // instance (the auth module latches until a successful exchange).
640
+ c.auth.onExpired(() => {
641
+ if (c !== client) return
642
+ console.warn(`${LOG_TAG}: cloud session expired beyond recovery — notifying host`)
643
+ getAuth()?.onSessionExpired?.()
644
+ })
645
+
646
+ // Best-effort connect. Do not crash the app if the dev cloud is unreachable.
647
+ c.runtime
648
+ .connect()
649
+ .then(() => console.log(`${LOG_TAG}: connect() resolved`))
650
+ .catch((err) => console.warn(`${LOG_TAG}: connect() failed: ${err?.message ?? err}`))
651
+
652
+ syncCoreAccessTokenToBluetooth().catch((err) =>
653
+ console.warn(`${LOG_TAG}: initial Bluetooth core_token sync failed: ${(err as Error)?.message ?? err}`),
654
+ )
655
+
656
+ startLc3FrameSizeWatcher()
657
+ }
658
+
659
+ /**
660
+ * engine's cloud client. Owns the singleton CloudClient, its connection state,
661
+ * and the runtime-hook wiring.
662
+ */
663
+ export const cloudClientService = {
664
+ /**
665
+ * Construct (once) + connect the client. Idempotent. Best-effort connect — a
666
+ * failure is logged and the app keeps running. Requires
667
+ * `engine.configure({auth, config})` first.
668
+ */
669
+ init(): void {
670
+ if (client) return
671
+ // Privacy stance wins over every caller, including the lazy `if (!client)
672
+ // this.init()` paths below — this is the one chokepoint where the client
673
+ // gets built, so refusing here keeps the socket from ever opening.
674
+ if (cloudDisabled()) {
675
+ console.log(`${LOG_TAG}: init skipped — cloud disabled in Privacy settings`)
676
+ startDisableCloudWatcher()
677
+ return
678
+ }
679
+ ensureAuthWatch()
680
+ startDisableCloudWatcher()
681
+ construct()
682
+ },
683
+
684
+ /** True when the user has turned Glassly cloud off entirely. */
685
+ isCloudDisabled(): boolean {
686
+ return cloudDisabled()
687
+ },
688
+
689
+ /**
690
+ * Tear down + rebuild. Pass new endpoints to switch URLs; pass `null` to CLEAR
691
+ * a prior override and fall back to the boot config (so cleared/default cloud
692
+ * URLs don't keep reconnecting to a stale override); omit to keep the current.
693
+ */
694
+ reconnect(endpoints?: {core: string; runtime: string} | null): void {
695
+ const prevCore = resolveEndpoints().core
696
+ if (endpoints !== undefined) endpointsOverride = endpoints
697
+ // Tokens are minted per backend (per-env signing keys + user DB), so a
698
+ // core switch makes the persisted refresh token dead weight the new
699
+ // backend will reject. Drop it so the client goes straight to a subject
700
+ // exchange instead of burning a round trip on a guaranteed invalid_grant.
701
+ // Key literal matches cloud-client's token-store.ts REFRESH_TOKEN_KEY.
702
+ if (resolveEndpoints().core !== prevCore) {
703
+ console.log(`${LOG_TAG}: core endpoint changed — dropping persisted cloud refresh token`)
704
+ void cloudSecureStore.delete("glassly.cloud-client.refreshToken")
705
+ }
706
+ try {
707
+ client?.runtime.close()
708
+ } catch (err) {
709
+ console.warn(`${LOG_TAG}: reconnect close() failed: ${(err as Error)?.message ?? err}`)
710
+ }
711
+ clearRuntimeEventSubscriptions()
712
+ clearPersistentFailureAlarm()
713
+
714
+ const wasConnected = connected
715
+ client = null
716
+ localDevRuntimeToken = null
717
+ connected = false
718
+ resetRuntimeStatus()
719
+ if (wasConnected) notifyConnectionListeners(false)
720
+
721
+ // Same gate as init(): endpoint changes / LC3 reconnects must not resurrect
722
+ // a connection the user has switched off.
723
+ if (cloudDisabled()) {
724
+ console.log(`${LOG_TAG}: reconnect skipped — cloud disabled in Privacy settings`)
725
+ return
726
+ }
727
+ construct()
728
+ },
729
+
730
+ async getPreinstalledMiniappRegistry(): Promise<PreinstalledMiniappRegistry> {
731
+ if (!client) this.init()
732
+ const c = client
733
+ if (!c?.core) throw new Error("cloud client core is unavailable")
734
+ return c.core.miniapps.getRegistry()
735
+ },
736
+
737
+ /**
738
+ * Resolve the stable Core-owned Glassly user id.
739
+ *
740
+ * Storage must use this identity rather than the short-lived Core access
741
+ * token. A previously verified id is restored from MMKV so local miniapps
742
+ * remain available after an offline process restart. On first sign-in,
743
+ * callers join the auth module's single-flight exchange/refresh instead of
744
+ * falling back to an anonymous namespace.
745
+ */
746
+ async resolveGlasslyUserId(): Promise<string> {
747
+ // With cloud off there is no client to exchange a token with and never will
748
+ // be, so the online path below would throw on every storage call and take
749
+ // offline-capable local miniapps down with it. Fall back to a device-local
750
+ // namespace instead — a cached Core id still wins inside resolveLocal().
751
+ if (cloudDisabled()) return localMiniappUserIdentity.resolveLocal()
752
+
753
+ return localMiniappUserIdentity.resolve(async () => {
754
+ if (!client) this.init()
755
+ const c = client
756
+ if (!c) throw new Error("cloud client not initialized")
757
+
758
+ await c.auth.getCoreToken()
759
+ if (c !== client) throw new Error("cloud client changed while resolving user identity")
760
+ // Runs before resolve() persists the id, so the local namespace is adopted
761
+ // whichever path reaches Core identity first (this or the token sync).
762
+ adoptLocalNamespace(c.auth.identity.glasslyUserId)
763
+ return c.auth.identity.glasslyUserId
764
+ })
765
+ },
766
+
767
+ /** Read the stable Glassly user id after async identity resolution. */
768
+ getGlasslyUserId(): string {
769
+ // Mirrors resolveGlasslyUserId(): with cloud off, minting is synchronous and
770
+ // cannot fail, so sync callers (BlobStore) don't depend on an async resolve
771
+ // having run first.
772
+ if (cloudDisabled()) return localMiniappUserIdentity.resolveLocal()
773
+ const userId = localMiniappUserIdentity.get()
774
+ if (!userId) throw new Error("Glassly user identity is unavailable")
775
+ return userId
776
+ },
777
+
778
+ async getMiniappAuthToken(
779
+ packageName: string,
780
+ opts?: {minTtlMs?: number; devAttestation?: string},
781
+ ): Promise<MiniappAuthToken> {
782
+ if (!client) this.init()
783
+ const c = client
784
+ if (!c) throw new Error("cloud client not initialized")
785
+
786
+ const {token, expiresAt} = await c.auth.getMiniappToken(packageName, opts)
787
+ const identity = c.auth.identity
788
+ return {
789
+ glasslyUserId: identity.glasslyUserId,
790
+ tenantId: identity.tenantId,
791
+ token,
792
+ expiresAt: normalizeExpiresAt(expiresAt),
793
+ }
794
+ },
795
+
796
+ /**
797
+ * Tear down the client + connection (the engine.stop() lifecycle).
798
+ *
799
+ * Deliberately leaves the disable-cloud watcher installed: this is also the
800
+ * teardown the Privacy toggle triggers, and dropping the subscription here
801
+ * would strand the app disconnected until restart when the user flips the
802
+ * toggle back off. `shutdown()` is the full-stop variant that removes it.
803
+ */
804
+ stop(): void {
805
+ try {
806
+ client?.runtime.close()
807
+ } catch (err) {
808
+ console.warn(`${LOG_TAG}: stop close() failed: ${(err as Error)?.message ?? err}`)
809
+ }
810
+ stopLc3FrameSizeWatcher()
811
+ stopAuthWatch()
812
+ clearRuntimeEventSubscriptions()
813
+ clearPersistentFailureAlarm()
814
+ const wasConnected = connected
815
+ client = null
816
+ // stop() is part of the logout lifecycle and runs before the host emits
817
+ // SIGNED_OUT. Remove the persisted namespace owner here so a later account
818
+ // can never inherit it. A force-stop/process kill does not call stop(), so
819
+ // the cached id still survives the offline cold-start case.
820
+ localMiniappUserIdentity.forget()
821
+ localDevRuntimeToken = null
822
+ connected = false
823
+ resetRuntimeStatus()
824
+ if (wasConnected) notifyConnectionListeners(false)
825
+ },
826
+
827
+ /** `stop()` plus the disable-cloud watcher — for a genuine engine teardown. */
828
+ shutdown(): void {
829
+ this.stop()
830
+ stopDisableCloudWatcher()
831
+ },
832
+
833
+ /** Device-side managed photo (cloud-v2): presign now, deliver bytes, await ready. */
834
+ startManagedPhoto(opts: Record<string, unknown> = {}) {
835
+ if (!client) throw new Error("cloud client not connected")
836
+ return client.runtime.startManagedPhoto(opts)
837
+ },
838
+ awaitManagedPhotoReady(requestId: string) {
839
+ if (!client) throw new Error("cloud client not connected")
840
+ return client.runtime.awaitManagedPhotoReady(requestId)
841
+ },
842
+
843
+ /** Managed stream (cloud-v2): provision ingest+playback on the runtime. */
844
+ startManagedStream(opts: Record<string, unknown> = {}) {
845
+ if (!client) throw new Error("cloud client not connected")
846
+ return client.runtime.startManagedStream(opts)
847
+ },
848
+ getManagedStreamStatus(streamId: string) {
849
+ if (!client) throw new Error("cloud client not connected")
850
+ return client.runtime.getManagedStreamStatus(streamId)
851
+ },
852
+ stopManagedStream(streamId: string) {
853
+ if (!client) throw new Error("cloud client not connected")
854
+ return client.runtime.stopManagedStream(streamId)
855
+ },
856
+
857
+ /** Current live-session connection state (handshake completed). */
858
+ isConnected(): boolean {
859
+ return connected
860
+ },
861
+
862
+ /** Subscribe to connection-state transitions. Returns an unsubscribe fn. */
863
+ onConnectionChange(listener: (connected: boolean) => void): () => void {
864
+ connectionListeners.add(listener)
865
+ return () => {
866
+ connectionListeners.delete(listener)
867
+ }
868
+ },
869
+
870
+ /** Replace the v2 cloud's audio subscription set for the live session. */
871
+ async setSubscriptions(subs: AudioSubscription[]): Promise<void> {
872
+ // Cache unconditionally so the desired set survives a not-yet-connected
873
+ // session and reconnects; the onConnected handler re-applies the cached set.
874
+ audioSubscriptions = subs
875
+ const c = client
876
+ if (connected && c) {
877
+ await c.runtime.setSubscriptions(subs)
878
+ }
879
+ },
880
+
881
+ sendAudioFrame(frame: Uint8Array): void {
882
+ client?.runtime.sendAudioFrame(frame)
883
+ },
884
+
885
+ onTranscript(cb: (d: TranscriptionData) => void): () => void {
886
+ transcriptListeners.add(cb)
887
+ return () => {
888
+ transcriptListeners.delete(cb)
889
+ }
890
+ },
891
+
892
+ onTranslation(cb: (d: TranslationData) => void): () => void {
893
+ translationListeners.add(cb)
894
+ return () => {
895
+ translationListeners.delete(cb)
896
+ }
897
+ },
898
+
899
+ /** Plan-quota block/unblock pushes for metered cloud streams. */
900
+ onQuota(cb: (d: QuotaStatusPayload) => void): () => void {
901
+ quotaListeners.add(cb)
902
+ return () => {
903
+ quotaListeners.delete(cb)
904
+ }
905
+ },
906
+
907
+ getStatus(): CloudClientStatusSnapshot {
908
+ return currentRuntimeStatus()
909
+ },
910
+
911
+ getCoreUrl(): string {
912
+ return resolveEndpoints().core
913
+ },
914
+
915
+ syncCoreTokenToBluetooth(): Promise<string> {
916
+ return syncCoreAccessTokenToBluetooth()
917
+ },
918
+
919
+ onStatusChanged(cb: (snapshot: CloudClientStatusSnapshot) => void): () => void {
920
+ statusListeners.add(cb)
921
+ return () => {
922
+ statusListeners.delete(cb)
923
+ }
924
+ },
925
+
926
+ tts: {
927
+ speak(text: string, options?: Parameters<CloudClient["runtime"]["tts"]["speak"]>[1]) {
928
+ if (!client) throw new Error("cloud client not connected")
929
+ return client.runtime.tts.speak(text, options)
930
+ },
931
+ },
932
+
933
+ llm: {
934
+ /**
935
+ * One completion turn through the cloud LLM service. `userApiKey` is the
936
+ * user's own provider key when they've saved one; the cloud bills that key
937
+ * instead of the platform's and skips metering. It rides as a header, never
938
+ * in the request body.
939
+ */
940
+ complete(
941
+ req: Parameters<CloudClient["runtime"]["llm"]["complete"]>[0],
942
+ opts?: Parameters<CloudClient["runtime"]["llm"]["complete"]>[1],
943
+ ) {
944
+ if (!client) throw new Error("cloud client not connected")
945
+ return client.runtime.llm.complete(req, opts)
946
+ },
947
+
948
+ /** One agentic visual-generation run. Long-running; see cloud-client docs. */
949
+ generate(
950
+ req: Parameters<CloudClient["runtime"]["llm"]["generate"]>[0],
951
+ opts?: Parameters<CloudClient["runtime"]["llm"]["generate"]>[1],
952
+ ) {
953
+ if (!client) throw new Error("cloud client not connected")
954
+ return client.runtime.llm.generate(req, opts)
955
+ },
956
+
957
+ /** Start a pollable generate job (async flavor; 404 on old clouds). */
958
+ startGenerateJob(
959
+ req: Parameters<CloudClient["runtime"]["llm"]["startGenerateJob"]>[0],
960
+ opts?: Parameters<CloudClient["runtime"]["llm"]["startGenerateJob"]>[1],
961
+ ) {
962
+ if (!client) throw new Error("cloud client not connected")
963
+ return client.runtime.llm.startGenerateJob(req, opts)
964
+ },
965
+
966
+ generateJobStatus(jobId: string) {
967
+ if (!client) throw new Error("cloud client not connected")
968
+ return client.runtime.llm.generateJobStatus(jobId)
969
+ },
970
+
971
+ cancelGenerateJob(jobId: string) {
972
+ if (!client) throw new Error("cloud client not connected")
973
+ return client.runtime.llm.cancelGenerateJob(jobId)
974
+ },
975
+ },
976
+
977
+ maps: {
978
+ directions(req: Parameters<CloudClient["runtime"]["maps"]["directions"]>[0]) {
979
+ if (!client) throw new Error("cloud client not connected")
980
+ return client.runtime.maps.directions(req)
981
+ },
982
+ reverseGeocode(coord: Parameters<CloudClient["runtime"]["maps"]["reverseGeocode"]>[0]) {
983
+ if (!client) throw new Error("cloud client not connected")
984
+ return client.runtime.maps.reverseGeocode(coord)
985
+ },
986
+ placeAutocomplete(req: Parameters<CloudClient["runtime"]["maps"]["placeAutocomplete"]>[0]) {
987
+ if (!client) throw new Error("cloud client not connected")
988
+ return client.runtime.maps.placeAutocomplete(req)
989
+ },
990
+ placeDetails(req: Parameters<CloudClient["runtime"]["maps"]["placeDetails"]>[0]) {
991
+ if (!client) throw new Error("cloud client not connected")
992
+ return client.runtime.maps.placeDetails(req)
993
+ },
994
+ /**
995
+ * The deployment's public map render token ({provider, token}) for the
996
+ * consumers that can't be proxied (tiles, native nav SDK). `token` null =
997
+ * this deployment serves none. See MapboxTokenService for the caching
998
+ * consumer.
999
+ */
1000
+ renderToken() {
1001
+ if (!client) throw new Error("cloud client not connected")
1002
+ return client.runtime.maps.renderToken()
1003
+ },
1004
+ },
1005
+
1006
+ core: {
1007
+ reports: {
1008
+ submit(...args: Parameters<CloudCore["reports"]["submit"]>) {
1009
+ return getCoreClient().reports.submit(...args)
1010
+ },
1011
+ addLogs(...args: Parameters<CloudCore["reports"]["addLogs"]>) {
1012
+ return getCoreClient().reports.addLogs(...args)
1013
+ },
1014
+ addScreenshots(...args: Parameters<CloudCore["reports"]["addScreenshots"]>) {
1015
+ return getCoreClient().reports.addScreenshots(...args)
1016
+ },
1017
+ complete(...args: Parameters<CloudCore["reports"]["complete"]>) {
1018
+ return getCoreClient().reports.complete(...args)
1019
+ },
1020
+ },
1021
+ supportProfile: {
1022
+ update(...args: Parameters<CloudCore["supportProfile"]["update"]>) {
1023
+ return getCoreClient().supportProfile.update(...args)
1024
+ },
1025
+ },
1026
+ },
1027
+
1028
+ hasAudioSubscriptions(): boolean {
1029
+ return audioSubscriptions.length > 0
1030
+ },
1031
+ }