@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 @@
1
+ {"version":3,"file":"SpeakerIdSync.d.ts","sourceRoot":"","sources":["../../src/services/SpeakerIdSync.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAuBH,wBAAgB,kBAAkB,IAAI,IAAI,CAkCzC;AAED,wBAAgB,iBAAiB,IAAI,IAAI,CASxC"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * SpeakerIdSync — keeps the native SpeakerIdEngine in step with the engine
3
+ * layer: the "Identify enrolled speakers" setting drives the engine's enabled
4
+ * flag, profile centroids are pushed into native memory whenever the profile
5
+ * store changes (MMKV is the source of truth; native holds them in memory
6
+ * only — deleting a profile drops it from native on the same push), and the
7
+ * model path is activated when the model is already on disk. Also starts the
8
+ * SpeakerLabelResolver that annotates cloud transcripts.
9
+ *
10
+ * Started by `engine.start()`. Idempotent.
11
+ */
12
+ import BluetoothSdk from "@glassly/bluetooth-sdk/internal";
13
+ import { SETTINGS, useSettingsStore } from "../stores/settings";
14
+ import speakerIdModelManager from "./SpeakerIdModelManager";
15
+ import speakerLabelResolver from "./SpeakerLabelResolver";
16
+ import { speakerProfileStore } from "./speakerProfileStoreInstance";
17
+ let subs = [];
18
+ async function pushEnabled() {
19
+ const enabled = useSettingsStore.getState().getSetting(SETTINGS.speaker_id_enabled.key) === true;
20
+ console.log(`SpeakerID: pushing identify enabled=${enabled} to native`);
21
+ await BluetoothSdk.setSpeakerIdEnabled(enabled);
22
+ }
23
+ async function pushProfiles() {
24
+ const profiles = await speakerProfileStore.list();
25
+ console.log(`SpeakerID: pushing ${profiles.length} profile(s) to native: ${profiles.map((p) => p.name).join(", ")}`);
26
+ await BluetoothSdk.setSpeakerProfiles(profiles.map((p) => ({ id: p.id, name: p.name, embedding: p.centroid })));
27
+ }
28
+ export function startSpeakerIdSync() {
29
+ if (subs.length)
30
+ return;
31
+ speakerLabelResolver.start();
32
+ subs.push(() => speakerLabelResolver.stop());
33
+ subs.push(useSettingsStore.subscribe((s) => s.getSetting(SETTINGS.speaker_id_enabled.key), () => {
34
+ void pushEnabled().catch((err) => console.warn("SpeakerIdSync: enable push failed:", err));
35
+ }));
36
+ subs.push(speakerProfileStore.onChanged(() => {
37
+ void pushProfiles().catch((err) => console.warn("SpeakerIdSync: profile push failed:", err));
38
+ }));
39
+ // Initial seed. Profile push needs the user identity, which may not resolve
40
+ // yet (e.g. first launch before sign-in) — that's fine, the next store
41
+ // change re-pushes; native simply has no profiles until then.
42
+ void speakerIdModelManager
43
+ .activateIfDownloaded()
44
+ .then((activated) => {
45
+ console.log(`SpeakerID: model ${activated ? `activated (${speakerIdModelManager.getModelPath()})` : "not downloaded yet"}`);
46
+ return pushEnabled();
47
+ })
48
+ .then(() => pushProfiles())
49
+ .catch((err) => console.warn("SpeakerIdSync: initial sync failed:", err instanceof Error ? err.message : err));
50
+ }
51
+ export function stopSpeakerIdSync() {
52
+ for (const unsub of subs) {
53
+ try {
54
+ unsub();
55
+ }
56
+ catch {
57
+ // ignore
58
+ }
59
+ }
60
+ subs = [];
61
+ }
62
+ //# sourceMappingURL=SpeakerIdSync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SpeakerIdSync.js","sourceRoot":"","sources":["../../src/services/SpeakerIdSync.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * SpeakerIdSync — keeps the native SpeakerIdEngine in step with the engine\n * layer: the \"Identify enrolled speakers\" setting drives the engine's enabled\n * flag, profile centroids are pushed into native memory whenever the profile\n * store changes (MMKV is the source of truth; native holds them in memory\n * only — deleting a profile drops it from native on the same push), and the\n * model path is activated when the model is already on disk. Also starts the\n * SpeakerLabelResolver that annotates cloud transcripts.\n *\n * Started by `engine.start()`. Idempotent.\n */\n\nimport BluetoothSdk from \"@glassly/bluetooth-sdk/internal\"\n\nimport {SETTINGS, useSettingsStore} from \"../stores/settings\"\nimport speakerIdModelManager from \"./SpeakerIdModelManager\"\nimport speakerLabelResolver from \"./SpeakerLabelResolver\"\nimport {speakerProfileStore} from \"./speakerProfileStoreInstance\"\n\nlet subs: Array<() => void> = []\n\nasync function pushEnabled(): Promise<void> {\n const enabled = useSettingsStore.getState().getSetting(SETTINGS.speaker_id_enabled.key) === true\n console.log(`SpeakerID: pushing identify enabled=${enabled} to native`)\n await BluetoothSdk.setSpeakerIdEnabled(enabled)\n}\n\nasync function pushProfiles(): Promise<void> {\n const profiles = await speakerProfileStore.list()\n console.log(`SpeakerID: pushing ${profiles.length} profile(s) to native: ${profiles.map((p) => p.name).join(\", \")}`)\n await BluetoothSdk.setSpeakerProfiles(profiles.map((p) => ({id: p.id, name: p.name, embedding: p.centroid})))\n}\n\nexport function startSpeakerIdSync(): void {\n if (subs.length) return\n\n speakerLabelResolver.start()\n subs.push(() => speakerLabelResolver.stop())\n\n subs.push(\n useSettingsStore.subscribe(\n (s) => s.getSetting(SETTINGS.speaker_id_enabled.key),\n () => {\n void pushEnabled().catch((err) => console.warn(\"SpeakerIdSync: enable push failed:\", err))\n },\n ),\n )\n\n subs.push(\n speakerProfileStore.onChanged(() => {\n void pushProfiles().catch((err) => console.warn(\"SpeakerIdSync: profile push failed:\", err))\n }),\n )\n\n // Initial seed. Profile push needs the user identity, which may not resolve\n // yet (e.g. first launch before sign-in) — that's fine, the next store\n // change re-pushes; native simply has no profiles until then.\n void speakerIdModelManager\n .activateIfDownloaded()\n .then((activated) => {\n console.log(\n `SpeakerID: model ${activated ? `activated (${speakerIdModelManager.getModelPath()})` : \"not downloaded yet\"}`,\n )\n return pushEnabled()\n })\n .then(() => pushProfiles())\n .catch((err) => console.warn(\"SpeakerIdSync: initial sync failed:\", err instanceof Error ? err.message : err))\n}\n\nexport function stopSpeakerIdSync(): void {\n for (const unsub of subs) {\n try {\n unsub()\n } catch {\n // ignore\n }\n }\n subs = []\n}\n"]}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * SpeakerLabelResolver — engine wiring around SpeakerSegmentResolver.
3
+ *
4
+ * Subscribes to native `speaker_detected` bridge events (on-device speaker
5
+ * identification windows) and annotates cloud transcription events with a
6
+ * user/other/unknown determination — WITHOUT mutating the raw provider
7
+ * `speakerId` label. The two label spaces stay distinguishable; resolution is
8
+ * additive.
9
+ *
10
+ * Voice recognition is owner-only (the store holds the user's own "Your
11
+ * voice" profile), so the determination is framed as `isUser`:
12
+ * - matched the enrolled voice → isUser: true
13
+ * - confidently a different voice → isUser: false
14
+ * - ambiguous / no evidence → no annotation (honest unknown)
15
+ *
16
+ * "Confidently different" uses a second, lower similarity gate: a no-match
17
+ * window only counts as OTHER evidence when its cosine similarity is clearly
18
+ * below the enrolled centroid (OTHER_MAX_SIMILARITY), not merely below the
19
+ * native match threshold (0.45). Windows in the ambiguous band in between —
20
+ * the user's own degraded audio (wind, short utterances, overlap) lands there
21
+ * — assert nothing.
22
+ *
23
+ * Cloud segment times (`startMs`/`endMs`) are stream-relative, not epoch, so
24
+ * segments are anchored on the JS receive time: the segment is assumed to
25
+ * have just ended at receipt, spanning [receivedAt - duration, receivedAt].
26
+ * Transport latency makes this approximate; the resolver's overlap voting
27
+ * absorbs it (accepted v1 caveat — no sample-accurate alignment).
28
+ */
29
+ /**
30
+ * No-match windows at or below this cosine similarity are affirmative OTHER
31
+ * evidence. The model's benchmarked cross-speaker range tops out near 0.46
32
+ * and same-speaker scores sit well above it; 0.35 leaves an ambiguous band
33
+ * (0.35–0.45, up to the native match threshold) where degraded own-voice
34
+ * windows fail to match without being mislabeled as someone else.
35
+ */
36
+ export declare const OTHER_MAX_SIMILARITY = 0.35;
37
+ export interface CloudSegmentLike {
38
+ isFinal: boolean;
39
+ speakerId?: string;
40
+ startMs?: number;
41
+ endMs?: number;
42
+ durationMs?: number;
43
+ }
44
+ export interface SpeakerDetermination {
45
+ /**
46
+ * true = the enrolled voice (the user themself); false = confidently a
47
+ * different voice. Unknown segments never produce a determination.
48
+ */
49
+ isUser: boolean;
50
+ /** Enrolled profile id when isUser (stable opaque id for downstream). */
51
+ resolvedSpeakerId?: string;
52
+ /** Enrolled display name when isUser — on-device PII, stripped before miniapp fan-out. */
53
+ resolvedSpeakerName?: string;
54
+ }
55
+ declare class SpeakerLabelResolver {
56
+ private readonly resolver;
57
+ private sub;
58
+ start(): void;
59
+ stop(): void;
60
+ /** Per audio session: drop identification evidence and carry-forward state. */
61
+ reset(): void;
62
+ /**
63
+ * Resolve a FINAL cloud segment received just now. Returns null when there
64
+ * is no confident determination for it.
65
+ */
66
+ resolveCloudSegment(d: CloudSegmentLike, receivedAtMs?: number): SpeakerDetermination | null;
67
+ /**
68
+ * Local-STT transcripts are stamped natively (SpeakerIdEngine.recentMatch →
69
+ * `resolvedSpeakerId`); that join only produces positive matches, so this
70
+ * adds `isUser: true` when the native stamp is present and nothing else.
71
+ */
72
+ annotateLocalTranscript<T extends {
73
+ resolvedSpeakerId?: unknown;
74
+ }>(event: T): T & {
75
+ isUser?: boolean;
76
+ };
77
+ }
78
+ declare const speakerLabelResolver: SpeakerLabelResolver;
79
+ export default speakerLabelResolver;
80
+ //# sourceMappingURL=SpeakerLabelResolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SpeakerLabelResolver.d.ts","sourceRoot":"","sources":["../../src/services/SpeakerLabelResolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AASH;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,OAAO,CAAA;AAExC,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC;;;OAGG;IACH,MAAM,EAAE,OAAO,CAAA;IACf,yEAAyE;IACzE,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,0FAA0F;IAC1F,mBAAmB,CAAC,EAAE,MAAM,CAAA;CAC7B;AAED,cAAM,oBAAoB;IACxB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA+B;IACxD,OAAO,CAAC,GAAG,CAAoC;IAE/C,KAAK,IAAI,IAAI;IAgBb,IAAI,IAAI,IAAI;IAMZ,+EAA+E;IAC/E,KAAK,IAAI,IAAI;IAIb;;;OAGG;IACH,mBAAmB,CAAC,CAAC,EAAE,gBAAgB,EAAE,YAAY,GAAE,MAAmB,GAAG,oBAAoB,GAAG,IAAI;IA2BxG;;;;OAIG;IACH,uBAAuB,CAAC,CAAC,SAAS;QAAC,iBAAiB,CAAC,EAAE,OAAO,CAAA;KAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAC;CAInG;AAED,QAAA,MAAM,oBAAoB,sBAA6B,CAAA;AACvD,eAAe,oBAAoB,CAAA"}
@@ -0,0 +1,108 @@
1
+ /**
2
+ * SpeakerLabelResolver — engine wiring around SpeakerSegmentResolver.
3
+ *
4
+ * Subscribes to native `speaker_detected` bridge events (on-device speaker
5
+ * identification windows) and annotates cloud transcription events with a
6
+ * user/other/unknown determination — WITHOUT mutating the raw provider
7
+ * `speakerId` label. The two label spaces stay distinguishable; resolution is
8
+ * additive.
9
+ *
10
+ * Voice recognition is owner-only (the store holds the user's own "Your
11
+ * voice" profile), so the determination is framed as `isUser`:
12
+ * - matched the enrolled voice → isUser: true
13
+ * - confidently a different voice → isUser: false
14
+ * - ambiguous / no evidence → no annotation (honest unknown)
15
+ *
16
+ * "Confidently different" uses a second, lower similarity gate: a no-match
17
+ * window only counts as OTHER evidence when its cosine similarity is clearly
18
+ * below the enrolled centroid (OTHER_MAX_SIMILARITY), not merely below the
19
+ * native match threshold (0.45). Windows in the ambiguous band in between —
20
+ * the user's own degraded audio (wind, short utterances, overlap) lands there
21
+ * — assert nothing.
22
+ *
23
+ * Cloud segment times (`startMs`/`endMs`) are stream-relative, not epoch, so
24
+ * segments are anchored on the JS receive time: the segment is assumed to
25
+ * have just ended at receipt, spanning [receivedAt - duration, receivedAt].
26
+ * Transport latency makes this approximate; the resolver's overlap voting
27
+ * absorbs it (accepted v1 caveat — no sample-accurate alignment).
28
+ */
29
+ import BluetoothSdk from "@glassly/bluetooth-sdk/internal";
30
+ import { SpeakerSegmentResolver } from "./SpeakerSegmentResolver";
31
+ /** Clamp for implausible provider durations (protects the epoch estimate). */
32
+ const MAX_SEGMENT_DURATION_MS = 30_000;
33
+ /**
34
+ * No-match windows at or below this cosine similarity are affirmative OTHER
35
+ * evidence. The model's benchmarked cross-speaker range tops out near 0.46
36
+ * and same-speaker scores sit well above it; 0.35 leaves an ambiguous band
37
+ * (0.35–0.45, up to the native match threshold) where degraded own-voice
38
+ * windows fail to match without being mislabeled as someone else.
39
+ */
40
+ export const OTHER_MAX_SIMILARITY = 0.35;
41
+ class SpeakerLabelResolver {
42
+ resolver = new SpeakerSegmentResolver();
43
+ sub = null;
44
+ start() {
45
+ if (this.sub)
46
+ return;
47
+ this.sub = BluetoothSdk.addListener("speaker_detected", (event) => {
48
+ const profileId = typeof event.speakerId === "string" && event.speakerId.length > 0 ? event.speakerId : null;
49
+ const name = typeof event.name === "string" && event.name.length > 0 ? event.name : null;
50
+ const similarity = typeof event.similarity === "number" ? event.similarity : null;
51
+ const confidentOther = profileId === null && similarity !== null && similarity <= OTHER_MAX_SIMILARITY;
52
+ console.log(`SpeakerID: window ${profileId ? (name ?? "user") : confidentOther ? "other" : "ambiguous"} ` +
53
+ `sim=${similarity?.toFixed?.(3) ?? similarity} ` +
54
+ `span=${event.endMs - event.startMs}ms endAge=${Date.now() - event.endMs}ms`);
55
+ this.resolver.addWindow({ profileId, name, confidentOther, startMs: event.startMs, endMs: event.endMs });
56
+ });
57
+ }
58
+ stop() {
59
+ this.sub?.remove();
60
+ this.sub = null;
61
+ this.resolver.reset();
62
+ }
63
+ /** Per audio session: drop identification evidence and carry-forward state. */
64
+ reset() {
65
+ this.resolver.reset();
66
+ }
67
+ /**
68
+ * Resolve a FINAL cloud segment received just now. Returns null when there
69
+ * is no confident determination for it.
70
+ */
71
+ resolveCloudSegment(d, receivedAtMs = Date.now()) {
72
+ if (!d.isFinal)
73
+ return null;
74
+ const rawDuration = d.durationMs ?? (d.endMs != null && d.startMs != null ? d.endMs - d.startMs : 0);
75
+ const duration = Math.min(Math.max(rawDuration, 0), MAX_SEGMENT_DURATION_MS);
76
+ const resolution = this.resolver.resolve({
77
+ startMs: receivedAtMs - duration,
78
+ endMs: receivedAtMs,
79
+ label: d.speakerId,
80
+ });
81
+ const determination = resolution
82
+ ? resolution.resolvedSpeakerId != null
83
+ ? // Enrollment is owner-only (speakers.enrollSelf), so any enrolled
84
+ // match is the user — no owner-id lookup needed.
85
+ {
86
+ isUser: true,
87
+ resolvedSpeakerId: resolution.resolvedSpeakerId,
88
+ resolvedSpeakerName: resolution.resolvedSpeakerName ?? undefined,
89
+ }
90
+ : { isUser: false }
91
+ : null;
92
+ console.log(`SpeakerID: cloud final label=${d.speakerId ?? "-"} dur=${duration}ms → ` +
93
+ (determination ? (determination.isUser ? "user" : "other") : "unknown"));
94
+ return determination;
95
+ }
96
+ /**
97
+ * Local-STT transcripts are stamped natively (SpeakerIdEngine.recentMatch →
98
+ * `resolvedSpeakerId`); that join only produces positive matches, so this
99
+ * adds `isUser: true` when the native stamp is present and nothing else.
100
+ */
101
+ annotateLocalTranscript(event) {
102
+ const matched = typeof event.resolvedSpeakerId === "string" && event.resolvedSpeakerId.length > 0;
103
+ return matched ? { ...event, isUser: true } : event;
104
+ }
105
+ }
106
+ const speakerLabelResolver = new SpeakerLabelResolver();
107
+ export default speakerLabelResolver;
108
+ //# sourceMappingURL=SpeakerLabelResolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SpeakerLabelResolver.js","sourceRoot":"","sources":["../../src/services/SpeakerLabelResolver.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * SpeakerLabelResolver — engine wiring around SpeakerSegmentResolver.\n *\n * Subscribes to native `speaker_detected` bridge events (on-device speaker\n * identification windows) and annotates cloud transcription events with a\n * user/other/unknown determination — WITHOUT mutating the raw provider\n * `speakerId` label. The two label spaces stay distinguishable; resolution is\n * additive.\n *\n * Voice recognition is owner-only (the store holds the user's own \"Your\n * voice\" profile), so the determination is framed as `isUser`:\n * - matched the enrolled voice → isUser: true\n * - confidently a different voice → isUser: false\n * - ambiguous / no evidence → no annotation (honest unknown)\n *\n * \"Confidently different\" uses a second, lower similarity gate: a no-match\n * window only counts as OTHER evidence when its cosine similarity is clearly\n * below the enrolled centroid (OTHER_MAX_SIMILARITY), not merely below the\n * native match threshold (0.45). Windows in the ambiguous band in between —\n * the user's own degraded audio (wind, short utterances, overlap) lands there\n * — assert nothing.\n *\n * Cloud segment times (`startMs`/`endMs`) are stream-relative, not epoch, so\n * segments are anchored on the JS receive time: the segment is assumed to\n * have just ended at receipt, spanning [receivedAt - duration, receivedAt].\n * Transport latency makes this approximate; the resolver's overlap voting\n * absorbs it (accepted v1 caveat — no sample-accurate alignment).\n */\n\nimport BluetoothSdk from \"@glassly/bluetooth-sdk/internal\"\n\nimport {SpeakerSegmentResolver} from \"./SpeakerSegmentResolver\"\n\n/** Clamp for implausible provider durations (protects the epoch estimate). */\nconst MAX_SEGMENT_DURATION_MS = 30_000\n\n/**\n * No-match windows at or below this cosine similarity are affirmative OTHER\n * evidence. The model's benchmarked cross-speaker range tops out near 0.46\n * and same-speaker scores sit well above it; 0.35 leaves an ambiguous band\n * (0.35–0.45, up to the native match threshold) where degraded own-voice\n * windows fail to match without being mislabeled as someone else.\n */\nexport const OTHER_MAX_SIMILARITY = 0.35\n\nexport interface CloudSegmentLike {\n isFinal: boolean\n speakerId?: string\n startMs?: number\n endMs?: number\n durationMs?: number\n}\n\nexport interface SpeakerDetermination {\n /**\n * true = the enrolled voice (the user themself); false = confidently a\n * different voice. Unknown segments never produce a determination.\n */\n isUser: boolean\n /** Enrolled profile id when isUser (stable opaque id for downstream). */\n resolvedSpeakerId?: string\n /** Enrolled display name when isUser — on-device PII, stripped before miniapp fan-out. */\n resolvedSpeakerName?: string\n}\n\nclass SpeakerLabelResolver {\n private readonly resolver = new SpeakerSegmentResolver()\n private sub: {remove: () => void} | null = null\n\n start(): void {\n if (this.sub) return\n this.sub = BluetoothSdk.addListener(\"speaker_detected\", (event) => {\n const profileId = typeof event.speakerId === \"string\" && event.speakerId.length > 0 ? event.speakerId : null\n const name = typeof event.name === \"string\" && event.name.length > 0 ? event.name : null\n const similarity = typeof event.similarity === \"number\" ? event.similarity : null\n const confidentOther = profileId === null && similarity !== null && similarity <= OTHER_MAX_SIMILARITY\n console.log(\n `SpeakerID: window ${profileId ? (name ?? \"user\") : confidentOther ? \"other\" : \"ambiguous\"} ` +\n `sim=${similarity?.toFixed?.(3) ?? similarity} ` +\n `span=${event.endMs - event.startMs}ms endAge=${Date.now() - event.endMs}ms`,\n )\n this.resolver.addWindow({profileId, name, confidentOther, startMs: event.startMs, endMs: event.endMs})\n })\n }\n\n stop(): void {\n this.sub?.remove()\n this.sub = null\n this.resolver.reset()\n }\n\n /** Per audio session: drop identification evidence and carry-forward state. */\n reset(): void {\n this.resolver.reset()\n }\n\n /**\n * Resolve a FINAL cloud segment received just now. Returns null when there\n * is no confident determination for it.\n */\n resolveCloudSegment(d: CloudSegmentLike, receivedAtMs: number = Date.now()): SpeakerDetermination | null {\n if (!d.isFinal) return null\n const rawDuration = d.durationMs ?? (d.endMs != null && d.startMs != null ? d.endMs - d.startMs : 0)\n const duration = Math.min(Math.max(rawDuration, 0), MAX_SEGMENT_DURATION_MS)\n const resolution = this.resolver.resolve({\n startMs: receivedAtMs - duration,\n endMs: receivedAtMs,\n label: d.speakerId,\n })\n const determination: SpeakerDetermination | null = resolution\n ? resolution.resolvedSpeakerId != null\n ? // Enrollment is owner-only (speakers.enrollSelf), so any enrolled\n // match is the user — no owner-id lookup needed.\n {\n isUser: true,\n resolvedSpeakerId: resolution.resolvedSpeakerId,\n resolvedSpeakerName: resolution.resolvedSpeakerName ?? undefined,\n }\n : {isUser: false}\n : null\n console.log(\n `SpeakerID: cloud final label=${d.speakerId ?? \"-\"} dur=${duration}ms → ` +\n (determination ? (determination.isUser ? \"user\" : \"other\") : \"unknown\"),\n )\n return determination\n }\n\n /**\n * Local-STT transcripts are stamped natively (SpeakerIdEngine.recentMatch →\n * `resolvedSpeakerId`); that join only produces positive matches, so this\n * adds `isUser: true` when the native stamp is present and nothing else.\n */\n annotateLocalTranscript<T extends {resolvedSpeakerId?: unknown}>(event: T): T & {isUser?: boolean} {\n const matched = typeof event.resolvedSpeakerId === \"string\" && event.resolvedSpeakerId.length > 0\n return matched ? {...event, isUser: true} : event\n }\n}\n\nconst speakerLabelResolver = new SpeakerLabelResolver()\nexport default speakerLabelResolver\n"]}
@@ -0,0 +1,90 @@
1
+ /**
2
+ * SpeakerProfileStore — device-local voice profiles for on-device speaker
3
+ * identification (Settings > Voice Recognition). Since v2 the product surface
4
+ * is owner-only ("Your voice"), enrolled through `speakers.enrollSelf`; the
5
+ * store keeps its generic multi-profile shape underneath.
6
+ *
7
+ * Voice embeddings are biometric data: profiles are NEVER synced (no
8
+ * saveOnServer anywhere near this store), mirroring the repo's device-local
9
+ * conventions for memory and API keys. Raw enrollment audio is discarded by
10
+ * the native layer; only embeddings and their mean centroid persist here.
11
+ *
12
+ * Pure class + injected backend (same pattern as MemoryStore) so the store
13
+ * stays dependency-free for tests; speakerProfileStoreInstance.ts binds MMKV
14
+ * and the user-id resolver.
15
+ */
16
+ /** The model whose embedding space current profiles live in. Embeddings from
17
+ * different models are incompatible — a model swap must trigger re-enrollment
18
+ * (detectable via each profile's `modelId`). */
19
+ export declare const SPEAKER_ID_MODEL_ID = "3dspeaker_speech_campplus_sv_zh_en_16k-common_advanced";
20
+ export declare const SPEAKER_ID_EMBEDDING_DIM = 192;
21
+ export type SpeakerSampleSource = "glasses" | "phone" | "unknown";
22
+ export interface SpeakerSample {
23
+ /** base64 Float32Array (little-endian), length = dim. */
24
+ embedding: string;
25
+ source: SpeakerSampleSource;
26
+ createdAt: number;
27
+ }
28
+ export interface SpeakerProfile {
29
+ /** "spk_"-prefixed id — this is what flows downstream as a speaker id. */
30
+ id: string;
31
+ /** Display name, user-entered. On-device PII — never exposed to miniapps. */
32
+ name: string;
33
+ modelId: string;
34
+ dim: number;
35
+ /** base64 Float32Array — the matching vector (mean of samples, normalized). */
36
+ centroid: string;
37
+ samples: SpeakerSample[];
38
+ createdAt: number;
39
+ updatedAt: number;
40
+ }
41
+ export interface SpeakerProfileStoreState {
42
+ /**
43
+ * v2 = owner-only voice recognition (2026-08-10): the store holds the
44
+ * device owner's "Your voice" profile, enrolled via `speakers.enrollSelf`.
45
+ * v1 multi-speaker rosters are cleared on load rather than migrated — the
46
+ * roster UI is gone and a v1 profile can't be assumed to be the owner.
47
+ */
48
+ version: 2;
49
+ profiles: SpeakerProfile[];
50
+ }
51
+ export interface SpeakerProfileStoreBackend {
52
+ get(key: string): unknown | null;
53
+ set(key: string, value: unknown): void;
54
+ remove(key: string): void;
55
+ }
56
+ export interface SpeakerProfileStoreHooks {
57
+ getUserId: () => Promise<string>;
58
+ backend: SpeakerProfileStoreBackend;
59
+ now?: () => number;
60
+ }
61
+ export declare class SpeakerProfileStore {
62
+ private readonly hooks;
63
+ private profiles;
64
+ private loadedUserId;
65
+ private loadPromise;
66
+ private readonly changeListeners;
67
+ constructor(hooks: SpeakerProfileStoreHooks);
68
+ onChanged(listener: () => void): () => void;
69
+ list(): Promise<SpeakerProfile[]>;
70
+ get(id: string): Promise<SpeakerProfile | null>;
71
+ /**
72
+ * Create a profile from enrollment chunk embeddings (base64 Float32Arrays).
73
+ * The centroid is their normalized mean. Throws when the cap is reached or
74
+ * no valid embeddings were provided.
75
+ */
76
+ add(name: string, embeddings: string[], source: SpeakerSampleSource): Promise<SpeakerProfile>;
77
+ /** Append "Improve recognition" samples and recompute the centroid. */
78
+ addSamples(id: string, embeddings: string[], source: SpeakerSampleSource): Promise<SpeakerProfile | null>;
79
+ rename(id: string, name: string): Promise<boolean>;
80
+ remove(id: string): Promise<boolean>;
81
+ /** Ids of profiles enrolled under a different (incompatible) model. */
82
+ staleProfileIds(currentModelId?: string): Promise<string[]>;
83
+ private now;
84
+ private ensureLoaded;
85
+ private loadFor;
86
+ private key;
87
+ private persist;
88
+ private emitChanged;
89
+ }
90
+ //# sourceMappingURL=SpeakerProfileStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SpeakerProfileStore.d.ts","sourceRoot":"","sources":["../../src/services/SpeakerProfileStore.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAOH;;iDAEiD;AACjD,eAAO,MAAM,mBAAmB,2DAA2D,CAAA;AAC3F,eAAO,MAAM,wBAAwB,MAAM,CAAA;AAE3C,MAAM,MAAM,mBAAmB,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,CAAA;AAEjE,MAAM,WAAW,aAAa;IAC5B,yDAAyD;IACzD,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,mBAAmB,CAAA;IAC3B,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,0EAA0E;IAC1E,EAAE,EAAE,MAAM,CAAA;IACV,6EAA6E;IAC7E,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,GAAG,EAAE,MAAM,CAAA;IACX,+EAA+E;IAC/E,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,aAAa,EAAE,CAAA;IACxB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,wBAAwB;IACvC;;;;;OAKG;IACH,OAAO,EAAE,CAAC,CAAA;IACV,QAAQ,EAAE,cAAc,EAAE,CAAA;CAC3B;AAED,MAAM,WAAW,0BAA0B;IACzC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CAAA;IAChC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAAA;IACtC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;CAC1B;AAED,MAAM,WAAW,wBAAwB;IACvC,SAAS,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAA;IAChC,OAAO,EAAE,0BAA0B,CAAA;IACnC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;CACnB;AAMD,qBAAa,mBAAmB;IAMlB,OAAO,CAAC,QAAQ,CAAC,KAAK;IALlC,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,YAAY,CAAsB;IAC1C,OAAO,CAAC,WAAW,CAA6B;IAChD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAwB;gBAE3B,KAAK,EAAE,wBAAwB;IAE5D,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;IAKrC,IAAI,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IAKjC,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAKrD;;;;OAIG;IACG,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,cAAc,CAAC;IA2BnG,uEAAuE;IACjE,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAiBzG,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAalD,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAU1C,uEAAuE;IACjE,eAAe,CAAC,cAAc,GAAE,MAA4B,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAOtF,OAAO,CAAC,GAAG;YAIG,YAAY;YAYZ,OAAO;IAQrB,OAAO,CAAC,GAAG;IAIX,OAAO,CAAC,OAAO;IAMf,OAAO,CAAC,WAAW;CASpB"}
@@ -0,0 +1,213 @@
1
+ /**
2
+ * SpeakerProfileStore — device-local voice profiles for on-device speaker
3
+ * identification (Settings > Voice Recognition). Since v2 the product surface
4
+ * is owner-only ("Your voice"), enrolled through `speakers.enrollSelf`; the
5
+ * store keeps its generic multi-profile shape underneath.
6
+ *
7
+ * Voice embeddings are biometric data: profiles are NEVER synced (no
8
+ * saveOnServer anywhere near this store), mirroring the repo's device-local
9
+ * conventions for memory and API keys. Raw enrollment audio is discarded by
10
+ * the native layer; only embeddings and their mean centroid persist here.
11
+ *
12
+ * Pure class + injected backend (same pattern as MemoryStore) so the store
13
+ * stays dependency-free for tests; speakerProfileStoreInstance.ts binds MMKV
14
+ * and the user-id resolver.
15
+ */
16
+ import { embeddingFromBase64, embeddingToBase64, meanEmbedding } from "../utils/speakerEmbedding";
17
+ const KEY_ROOT = "speaker_profiles_";
18
+ const MAX_PROFILES = 50;
19
+ /** The model whose embedding space current profiles live in. Embeddings from
20
+ * different models are incompatible — a model swap must trigger re-enrollment
21
+ * (detectable via each profile's `modelId`). */
22
+ export const SPEAKER_ID_MODEL_ID = "3dspeaker_speech_campplus_sv_zh_en_16k-common_advanced";
23
+ export const SPEAKER_ID_EMBEDDING_DIM = 192;
24
+ function makeId(now) {
25
+ return `spk_${now.toString(36)}${Math.random().toString(36).slice(2, 10)}`;
26
+ }
27
+ export class SpeakerProfileStore {
28
+ hooks;
29
+ profiles = [];
30
+ loadedUserId = null;
31
+ loadPromise = null;
32
+ changeListeners = new Set();
33
+ constructor(hooks) {
34
+ this.hooks = hooks;
35
+ }
36
+ onChanged(listener) {
37
+ this.changeListeners.add(listener);
38
+ return () => this.changeListeners.delete(listener);
39
+ }
40
+ async list() {
41
+ await this.ensureLoaded();
42
+ return [...this.profiles];
43
+ }
44
+ async get(id) {
45
+ await this.ensureLoaded();
46
+ return this.profiles.find((p) => p.id === id) ?? null;
47
+ }
48
+ /**
49
+ * Create a profile from enrollment chunk embeddings (base64 Float32Arrays).
50
+ * The centroid is their normalized mean. Throws when the cap is reached or
51
+ * no valid embeddings were provided.
52
+ */
53
+ async add(name, embeddings, source) {
54
+ const displayName = name.trim();
55
+ if (!displayName)
56
+ throw new Error("Speaker name is required");
57
+ await this.ensureLoaded();
58
+ if (this.profiles.length >= MAX_PROFILES) {
59
+ throw new Error(`Speaker profile limit reached (${MAX_PROFILES})`);
60
+ }
61
+ const vectors = decodeAll(embeddings);
62
+ if (vectors.length === 0)
63
+ throw new Error("No valid embeddings provided");
64
+ const now = this.now();
65
+ const profile = {
66
+ id: makeId(now),
67
+ name: displayName,
68
+ modelId: SPEAKER_ID_MODEL_ID,
69
+ dim: vectors[0].length,
70
+ centroid: embeddingToBase64(meanEmbedding(vectors)),
71
+ samples: embeddings.map((embedding) => ({ embedding, source, createdAt: now })),
72
+ createdAt: now,
73
+ updatedAt: now,
74
+ };
75
+ this.profiles.push(profile);
76
+ this.persist();
77
+ this.emitChanged();
78
+ return profile;
79
+ }
80
+ /** Append "Improve recognition" samples and recompute the centroid. */
81
+ async addSamples(id, embeddings, source) {
82
+ await this.ensureLoaded();
83
+ const profile = this.profiles.find((p) => p.id === id);
84
+ if (!profile)
85
+ return null;
86
+ const now = this.now();
87
+ profile.samples.push(...embeddings.map((embedding) => ({ embedding, source, createdAt: now })));
88
+ const vectors = decodeAll(profile.samples.map((s) => s.embedding));
89
+ if (vectors.length > 0) {
90
+ profile.centroid = embeddingToBase64(meanEmbedding(vectors));
91
+ profile.dim = vectors[0].length;
92
+ }
93
+ profile.updatedAt = now;
94
+ this.persist();
95
+ this.emitChanged();
96
+ return profile;
97
+ }
98
+ async rename(id, name) {
99
+ const displayName = name.trim();
100
+ if (!displayName)
101
+ return false;
102
+ await this.ensureLoaded();
103
+ const profile = this.profiles.find((p) => p.id === id);
104
+ if (!profile)
105
+ return false;
106
+ profile.name = displayName;
107
+ profile.updatedAt = this.now();
108
+ this.persist();
109
+ this.emitChanged();
110
+ return true;
111
+ }
112
+ async remove(id) {
113
+ await this.ensureLoaded();
114
+ const before = this.profiles.length;
115
+ this.profiles = this.profiles.filter((p) => p.id !== id);
116
+ if (this.profiles.length === before)
117
+ return false;
118
+ this.persist();
119
+ this.emitChanged();
120
+ return true;
121
+ }
122
+ /** Ids of profiles enrolled under a different (incompatible) model. */
123
+ async staleProfileIds(currentModelId = SPEAKER_ID_MODEL_ID) {
124
+ await this.ensureLoaded();
125
+ return this.profiles.filter((p) => p.modelId !== currentModelId).map((p) => p.id);
126
+ }
127
+ // === Load / persist ===
128
+ now() {
129
+ return this.hooks.now?.() ?? Date.now();
130
+ }
131
+ async ensureLoaded() {
132
+ const userId = (await this.hooks.getUserId()).trim();
133
+ if (!userId)
134
+ throw new Error("Glassly user identity is unavailable");
135
+ if (this.loadedUserId === userId)
136
+ return;
137
+ if (!this.loadPromise) {
138
+ this.loadPromise = this.loadFor(userId).finally(() => {
139
+ this.loadPromise = null;
140
+ });
141
+ }
142
+ await this.loadPromise;
143
+ }
144
+ async loadFor(userId) {
145
+ this.profiles = [];
146
+ const raw = this.hooks.backend.get(this.key(userId));
147
+ const state = parseState(raw);
148
+ if (state)
149
+ this.profiles = state.profiles;
150
+ this.loadedUserId = userId;
151
+ }
152
+ key(userId) {
153
+ return `${KEY_ROOT}${userId}`;
154
+ }
155
+ persist() {
156
+ if (this.loadedUserId == null)
157
+ return;
158
+ const state = { version: 2, profiles: this.profiles };
159
+ this.hooks.backend.set(this.key(this.loadedUserId), JSON.stringify(state));
160
+ }
161
+ emitChanged() {
162
+ for (const listener of this.changeListeners) {
163
+ try {
164
+ listener();
165
+ }
166
+ catch (err) {
167
+ console.warn("SpeakerProfileStore: onChanged listener threw:", err instanceof Error ? err.message : err);
168
+ }
169
+ }
170
+ }
171
+ }
172
+ function decodeAll(embeddings) {
173
+ const out = [];
174
+ for (const b64 of embeddings) {
175
+ try {
176
+ const v = embeddingFromBase64(b64);
177
+ if (v.length > 0)
178
+ out.push(v);
179
+ }
180
+ catch {
181
+ // skip malformed sample
182
+ }
183
+ }
184
+ return out;
185
+ }
186
+ /** Stored value may be a JSON string or a raw object (backend-dependent). */
187
+ function parseState(raw) {
188
+ try {
189
+ const value = typeof raw === "string" ? JSON.parse(raw) : raw;
190
+ if (!value || typeof value !== "object")
191
+ return null;
192
+ const state = value;
193
+ // version 1 (multi-speaker roster) intentionally falls through to null —
194
+ // see SpeakerProfileStoreState: old rosters are cleared, not migrated.
195
+ if (state.version !== 2 || !Array.isArray(state.profiles))
196
+ return null;
197
+ return { version: 2, profiles: state.profiles.filter(isProfile) };
198
+ }
199
+ catch {
200
+ return null;
201
+ }
202
+ }
203
+ function isProfile(v) {
204
+ if (!v || typeof v !== "object")
205
+ return false;
206
+ const p = v;
207
+ return (typeof p.id === "string" &&
208
+ typeof p.name === "string" &&
209
+ typeof p.modelId === "string" &&
210
+ typeof p.centroid === "string" &&
211
+ Array.isArray(p.samples));
212
+ }
213
+ //# sourceMappingURL=SpeakerProfileStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SpeakerProfileStore.js","sourceRoot":"","sources":["../../src/services/SpeakerProfileStore.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * SpeakerProfileStore — device-local voice profiles for on-device speaker\n * identification (Settings > Voice Recognition). Since v2 the product surface\n * is owner-only (\"Your voice\"), enrolled through `speakers.enrollSelf`; the\n * store keeps its generic multi-profile shape underneath.\n *\n * Voice embeddings are biometric data: profiles are NEVER synced (no\n * saveOnServer anywhere near this store), mirroring the repo's device-local\n * conventions for memory and API keys. Raw enrollment audio is discarded by\n * the native layer; only embeddings and their mean centroid persist here.\n *\n * Pure class + injected backend (same pattern as MemoryStore) so the store\n * stays dependency-free for tests; speakerProfileStoreInstance.ts binds MMKV\n * and the user-id resolver.\n */\n\nimport {embeddingFromBase64, embeddingToBase64, meanEmbedding} from \"../utils/speakerEmbedding\"\n\nconst KEY_ROOT = \"speaker_profiles_\"\nconst MAX_PROFILES = 50\n\n/** The model whose embedding space current profiles live in. Embeddings from\n * different models are incompatible — a model swap must trigger re-enrollment\n * (detectable via each profile's `modelId`). */\nexport const SPEAKER_ID_MODEL_ID = \"3dspeaker_speech_campplus_sv_zh_en_16k-common_advanced\"\nexport const SPEAKER_ID_EMBEDDING_DIM = 192\n\nexport type SpeakerSampleSource = \"glasses\" | \"phone\" | \"unknown\"\n\nexport interface SpeakerSample {\n /** base64 Float32Array (little-endian), length = dim. */\n embedding: string\n source: SpeakerSampleSource\n createdAt: number\n}\n\nexport interface SpeakerProfile {\n /** \"spk_\"-prefixed id — this is what flows downstream as a speaker id. */\n id: string\n /** Display name, user-entered. On-device PII — never exposed to miniapps. */\n name: string\n modelId: string\n dim: number\n /** base64 Float32Array — the matching vector (mean of samples, normalized). */\n centroid: string\n samples: SpeakerSample[]\n createdAt: number\n updatedAt: number\n}\n\nexport interface SpeakerProfileStoreState {\n /**\n * v2 = owner-only voice recognition (2026-08-10): the store holds the\n * device owner's \"Your voice\" profile, enrolled via `speakers.enrollSelf`.\n * v1 multi-speaker rosters are cleared on load rather than migrated — the\n * roster UI is gone and a v1 profile can't be assumed to be the owner.\n */\n version: 2\n profiles: SpeakerProfile[]\n}\n\nexport interface SpeakerProfileStoreBackend {\n get(key: string): unknown | null\n set(key: string, value: unknown): void\n remove(key: string): void\n}\n\nexport interface SpeakerProfileStoreHooks {\n getUserId: () => Promise<string>\n backend: SpeakerProfileStoreBackend\n now?: () => number\n}\n\nfunction makeId(now: number): string {\n return `spk_${now.toString(36)}${Math.random().toString(36).slice(2, 10)}`\n}\n\nexport class SpeakerProfileStore {\n private profiles: SpeakerProfile[] = []\n private loadedUserId: string | null = null\n private loadPromise: Promise<void> | null = null\n private readonly changeListeners = new Set<() => void>()\n\n constructor(private readonly hooks: SpeakerProfileStoreHooks) {}\n\n onChanged(listener: () => void): () => void {\n this.changeListeners.add(listener)\n return () => this.changeListeners.delete(listener)\n }\n\n async list(): Promise<SpeakerProfile[]> {\n await this.ensureLoaded()\n return [...this.profiles]\n }\n\n async get(id: string): Promise<SpeakerProfile | null> {\n await this.ensureLoaded()\n return this.profiles.find((p) => p.id === id) ?? null\n }\n\n /**\n * Create a profile from enrollment chunk embeddings (base64 Float32Arrays).\n * The centroid is their normalized mean. Throws when the cap is reached or\n * no valid embeddings were provided.\n */\n async add(name: string, embeddings: string[], source: SpeakerSampleSource): Promise<SpeakerProfile> {\n const displayName = name.trim()\n if (!displayName) throw new Error(\"Speaker name is required\")\n await this.ensureLoaded()\n if (this.profiles.length >= MAX_PROFILES) {\n throw new Error(`Speaker profile limit reached (${MAX_PROFILES})`)\n }\n const vectors = decodeAll(embeddings)\n if (vectors.length === 0) throw new Error(\"No valid embeddings provided\")\n\n const now = this.now()\n const profile: SpeakerProfile = {\n id: makeId(now),\n name: displayName,\n modelId: SPEAKER_ID_MODEL_ID,\n dim: vectors[0].length,\n centroid: embeddingToBase64(meanEmbedding(vectors)),\n samples: embeddings.map((embedding) => ({embedding, source, createdAt: now})),\n createdAt: now,\n updatedAt: now,\n }\n this.profiles.push(profile)\n this.persist()\n this.emitChanged()\n return profile\n }\n\n /** Append \"Improve recognition\" samples and recompute the centroid. */\n async addSamples(id: string, embeddings: string[], source: SpeakerSampleSource): Promise<SpeakerProfile | null> {\n await this.ensureLoaded()\n const profile = this.profiles.find((p) => p.id === id)\n if (!profile) return null\n const now = this.now()\n profile.samples.push(...embeddings.map((embedding) => ({embedding, source, createdAt: now})))\n const vectors = decodeAll(profile.samples.map((s) => s.embedding))\n if (vectors.length > 0) {\n profile.centroid = embeddingToBase64(meanEmbedding(vectors))\n profile.dim = vectors[0].length\n }\n profile.updatedAt = now\n this.persist()\n this.emitChanged()\n return profile\n }\n\n async rename(id: string, name: string): Promise<boolean> {\n const displayName = name.trim()\n if (!displayName) return false\n await this.ensureLoaded()\n const profile = this.profiles.find((p) => p.id === id)\n if (!profile) return false\n profile.name = displayName\n profile.updatedAt = this.now()\n this.persist()\n this.emitChanged()\n return true\n }\n\n async remove(id: string): Promise<boolean> {\n await this.ensureLoaded()\n const before = this.profiles.length\n this.profiles = this.profiles.filter((p) => p.id !== id)\n if (this.profiles.length === before) return false\n this.persist()\n this.emitChanged()\n return true\n }\n\n /** Ids of profiles enrolled under a different (incompatible) model. */\n async staleProfileIds(currentModelId: string = SPEAKER_ID_MODEL_ID): Promise<string[]> {\n await this.ensureLoaded()\n return this.profiles.filter((p) => p.modelId !== currentModelId).map((p) => p.id)\n }\n\n // === Load / persist ===\n\n private now(): number {\n return this.hooks.now?.() ?? Date.now()\n }\n\n private async ensureLoaded(): Promise<void> {\n const userId = (await this.hooks.getUserId()).trim()\n if (!userId) throw new Error(\"Glassly user identity is unavailable\")\n if (this.loadedUserId === userId) return\n if (!this.loadPromise) {\n this.loadPromise = this.loadFor(userId).finally(() => {\n this.loadPromise = null\n })\n }\n await this.loadPromise\n }\n\n private async loadFor(userId: string): Promise<void> {\n this.profiles = []\n const raw = this.hooks.backend.get(this.key(userId))\n const state = parseState(raw)\n if (state) this.profiles = state.profiles\n this.loadedUserId = userId\n }\n\n private key(userId: string): string {\n return `${KEY_ROOT}${userId}`\n }\n\n private persist(): void {\n if (this.loadedUserId == null) return\n const state: SpeakerProfileStoreState = {version: 2, profiles: this.profiles}\n this.hooks.backend.set(this.key(this.loadedUserId), JSON.stringify(state))\n }\n\n private emitChanged(): void {\n for (const listener of this.changeListeners) {\n try {\n listener()\n } catch (err) {\n console.warn(\"SpeakerProfileStore: onChanged listener threw:\", err instanceof Error ? err.message : err)\n }\n }\n }\n}\n\nfunction decodeAll(embeddings: string[]): Float32Array[] {\n const out: Float32Array[] = []\n for (const b64 of embeddings) {\n try {\n const v = embeddingFromBase64(b64)\n if (v.length > 0) out.push(v)\n } catch {\n // skip malformed sample\n }\n }\n return out\n}\n\n/** Stored value may be a JSON string or a raw object (backend-dependent). */\nfunction parseState(raw: unknown): SpeakerProfileStoreState | null {\n try {\n const value = typeof raw === \"string\" ? (JSON.parse(raw) as unknown) : raw\n if (!value || typeof value !== \"object\") return null\n const state = value as Record<string, unknown>\n // version 1 (multi-speaker roster) intentionally falls through to null —\n // see SpeakerProfileStoreState: old rosters are cleared, not migrated.\n if (state.version !== 2 || !Array.isArray(state.profiles)) return null\n return {version: 2, profiles: (state.profiles as unknown[]).filter(isProfile)}\n } catch {\n return null\n }\n}\n\nfunction isProfile(v: unknown): v is SpeakerProfile {\n if (!v || typeof v !== \"object\") return false\n const p = v as Record<string, unknown>\n return (\n typeof p.id === \"string\" &&\n typeof p.name === \"string\" &&\n typeof p.modelId === \"string\" &&\n typeof p.centroid === \"string\" &&\n Array.isArray(p.samples)\n )\n}\n"]}