@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,1245 @@
1
+ /**
2
+ * AppRegistry — on-disk install/uninstall registry for local miniapps.
3
+ *
4
+ * Owns the `Documents/lmas/<packageName>/<version>/` filesystem layout, the
5
+ * download/unzip pipeline, and the active-version pointer in MMKV. It does
6
+ * NOT touch the apps store directly — instead it notifies subscribers when
7
+ * the install set changes, so the host (mobile manager, OEM app) can refresh
8
+ * its own state.
9
+ *
10
+ * Public surface:
11
+ * - installFromUrl(url, opts?) install/replace a miniapp from a URL
12
+ * - installFromLocalZip(path, opts?) install/replace from a local zip
13
+ * - uninstall(packageName, version?) remove one or all versions
14
+ * - getInstalledMiniapps() ClientApp[] derived from disk
15
+ * - getActiveVersion(packageName) active version string for a package
16
+ * - getBundleDir / getMiniappManifest filesystem helpers used by hosts
17
+ * - subscribe(fn) register a refresh listener
18
+ */
19
+
20
+ import {Directory, Paths, File} from "expo-file-system"
21
+ import {unzip} from "react-native-zip-archive"
22
+ import semver from "semver"
23
+ import {AsyncResult, Result, result as Res} from "typesafe-ts"
24
+
25
+ import type {AppletPermission, AppPermissionType, AppletType, ClientApp} from "../types/applet"
26
+ import {HardwareRequirement, HardwareRequirementLevel, HardwareType} from "../types"
27
+ import {configuredDevHost} from "../utils/configuredDevHost"
28
+ import {storage} from "../utils/storage/storage"
29
+ import {printDirectory} from "../utils/storage/zip"
30
+ import {checkManifestVersions} from "./manifestVersionGate"
31
+ import {normalizeManifestActions} from "./manifestActions"
32
+ import {miniappRunningRegistry} from "./MiniappRunningRegistry"
33
+
34
+ export {normalizeManifestActions} from "./manifestActions"
35
+
36
+ const ALLOWED_PERMISSION_TYPES: ReadonlySet<AppPermissionType> = new Set<AppPermissionType>([
37
+ "MICROPHONE",
38
+ "CAMERA",
39
+ "CALENDAR",
40
+ "LOCATION",
41
+ "BACKGROUND_LOCATION",
42
+ "READ_NOTIFICATIONS",
43
+ "POST_NOTIFICATIONS",
44
+ "API_KEYS",
45
+ ])
46
+
47
+ /**
48
+ * Normalize the `permissions` field from a miniapp.json manifest.
49
+ *
50
+ * New miniapps ship `[{type, required?, description?}]` objects. A few older
51
+ * installed bundles may have `["MICROPHONE", ...]` plain strings. Accept both.
52
+ */
53
+ export function normalizeManifestPermissions(
54
+ raw: Array<string | {type: string; required?: boolean; description?: string}> | undefined,
55
+ ): AppletPermission[] {
56
+ if (!Array.isArray(raw)) return []
57
+ const out: AppletPermission[] = []
58
+ for (const p of raw) {
59
+ if (typeof p === "string") {
60
+ if (ALLOWED_PERMISSION_TYPES.has(p as AppPermissionType)) {
61
+ out.push({type: p as AppPermissionType, required: true})
62
+ }
63
+ } else if (p && typeof p === "object" && typeof p.type === "string") {
64
+ if (ALLOWED_PERMISSION_TYPES.has(p.type as AppPermissionType)) {
65
+ out.push({
66
+ type: p.type as AppPermissionType,
67
+ ...(typeof p.required === "boolean" ? {required: p.required} : {}),
68
+ ...(typeof p.description === "string" ? {description: p.description} : {}),
69
+ })
70
+ }
71
+ }
72
+ }
73
+ return out
74
+ }
75
+
76
+ function normalizeManifestType(raw: unknown): AppletType {
77
+ return raw === "background" || raw === "system_dashboard" || raw === "standard" ? raw : "standard"
78
+ }
79
+
80
+ /**
81
+ * Convert declared hardwareRequirements from a miniapp.json manifest into
82
+ * runtime `HardwareRequirement[]`, always appending `{EXIST, REQUIRED}` so
83
+ * launchers show "Glasses Required" when no glasses are connected.
84
+ *
85
+ * Malformed entries are dropped with a single warning per package so the
86
+ * rest of the manifest still works.
87
+ */
88
+ export function buildHardwareRequirements(
89
+ raw: Array<{type: string; level: string; description?: string}> | undefined,
90
+ packageName: string,
91
+ ): HardwareRequirement[] {
92
+ const out: HardwareRequirement[] = []
93
+ const validTypes = new Set(Object.values(HardwareType) as string[])
94
+ const validLevels = new Set(Object.values(HardwareRequirementLevel) as string[])
95
+
96
+ if (!Array.isArray(raw)) {
97
+ if (raw !== undefined) {
98
+ console.warn(`APP_REGISTRY: ${packageName} has invalid hardwareRequirements (not an array); treating as []`)
99
+ }
100
+ } else {
101
+ let warned = false
102
+ for (const r of raw) {
103
+ if (
104
+ !r ||
105
+ typeof r !== "object" ||
106
+ typeof r.type !== "string" ||
107
+ typeof r.level !== "string" ||
108
+ !validTypes.has(r.type) ||
109
+ !validLevels.has(r.level)
110
+ ) {
111
+ if (!warned) {
112
+ console.warn(
113
+ `APP_REGISTRY: ${packageName} has malformed hardwareRequirements entry; skipping invalid entries`,
114
+ r,
115
+ )
116
+ warned = true
117
+ }
118
+ continue
119
+ }
120
+ out.push({
121
+ type: r.type as HardwareType,
122
+ level: r.level as HardwareRequirementLevel,
123
+ ...(typeof r.description === "string" ? {description: r.description} : {}),
124
+ })
125
+ }
126
+ }
127
+
128
+ // Always require glasses to be connected for any local miniapp.
129
+ out.push({type: HardwareType.EXIST, level: HardwareRequirementLevel.REQUIRED})
130
+ return out
131
+ }
132
+
133
+ interface InstalledInfo {
134
+ name: string
135
+ logoUrl: string
136
+ }
137
+
138
+ interface InstalledLma {
139
+ packageName: string
140
+ versions: Record<string, InstalledInfo>
141
+ }
142
+
143
+ export interface MiniappReleaseIdentity {
144
+ source: "direct_download" | "bundled_asset" | "preinstalled_registry" | "dev_snapshot"
145
+ releaseId?: string
146
+ bundleSha256?: string
147
+ channel?: string
148
+ }
149
+
150
+ function releaseIdentityKey(packageName: string, version: string): string {
151
+ return `miniapp_release_identity:${packageName}:${version}`
152
+ }
153
+
154
+ /**
155
+ * Download a miniapp zip from `url` into the cache and return its local path.
156
+ *
157
+ * `File.downloadFileAsync` is HTTP(S)-only, so this path is for remote bundles
158
+ * (dev server, store). Bundled-asset installs already have a local zip and
159
+ * should call {@link unpackMiniApp} directly.
160
+ */
161
+ async function downloadMiniAppZip(url: string): Promise<string> {
162
+ const downloadDir = new Directory(Paths.cache, "lma_downloads")
163
+ try {
164
+ if (!downloadDir.exists) {
165
+ downloadDir.create()
166
+ }
167
+ } catch (error) {
168
+ console.error("ZIP: Error creating download directory", error)
169
+ throw "CREATE_DOWNLOAD_DIR_FAILED"
170
+ }
171
+
172
+ // Pre-delete any cached file with the same name. Both `glassly-miniapp dev`
173
+ // and `glassly-miniapp release` serve their zip at /bundle.zip, so URLs
174
+ // collide on the cache filename. Without this delete, a stale dev-snapshot
175
+ // (containing the project source tree) gets unzipped instead of the
176
+ // release build → white screen because index.html points at TSX files.
177
+ const targetFileName = url.split("/").pop() ?? "bundle.zip"
178
+ const existingFile = new File(downloadDir, targetFileName)
179
+ if (existingFile.exists) {
180
+ try {
181
+ existingFile.delete()
182
+ } catch (e) {
183
+ console.warn("ZIP: failed to delete stale cached download:", e)
184
+ }
185
+ }
186
+
187
+ try {
188
+ const output = await File.downloadFileAsync(url, downloadDir)
189
+ return output.uri
190
+ } catch (error) {
191
+ console.error("ZIP: Error downloading zip file", error)
192
+ throw "DOWNLOAD_FAILED"
193
+ }
194
+ }
195
+
196
+ /**
197
+ * Unpack a local miniapp zip and install it under
198
+ * `lmas/<packageName>/<version>/`.
199
+ *
200
+ * Zip layout: flat — files at root, `miniapp.json` at the top level. We're
201
+ * strict on shape so we fail loudly on malformed bundles.
202
+ *
203
+ * @param zipPath file:// URI of the zip on local disk.
204
+ * @param versionOverride override the manifest's version field. Used by the
205
+ * dev miniapp caching path which stamps `dev-<ms>`
206
+ * so multiple snapshots can coexist alongside
207
+ * semver-installed versions.
208
+ */
209
+ async function unpackMiniApp(
210
+ zipPath: string,
211
+ versionOverride?: string,
212
+ ): Promise<{packageName: string; version: string}> {
213
+ const unzipDir = new Directory(Paths.cache, "lma_unzip")
214
+ try {
215
+ if (unzipDir.exists) unzipDir.delete()
216
+ unzipDir.create()
217
+ } catch (error) {
218
+ console.error("ZIP: Error creating or deleting the unzip directory", error)
219
+ throw "CREATE_CACHE_DIR_FAILED"
220
+ }
221
+
222
+ try {
223
+ console.log("ZIP: unzipping", zipPath)
224
+ await unzip(zipPath, unzipDir.uri)
225
+ } catch (error) {
226
+ console.error("Error unzipping zip file", error)
227
+ throw "UNZIP_FAILED"
228
+ }
229
+
230
+ // Strict zip shape: miniapp.json at unzip root. No tolerance for an
231
+ // enclosing folder or app.json fallback — we own the dev-server emit
232
+ // format, so any deviation indicates a corrupt bundle.
233
+ const appDir = unzipDir
234
+ let packageName: string
235
+ let manifestVersion: string
236
+ try {
237
+ const miniappJsonFile = new File(appDir, "miniapp.json")
238
+ if (!miniappJsonFile.exists) throw new Error("miniapp.json missing at zip root")
239
+ const manifest = JSON.parse(miniappJsonFile.textSync())
240
+ if (!manifest.packageName) throw new Error("miniapp.json missing packageName")
241
+ if (!manifest.version) throw new Error("miniapp.json missing version")
242
+ packageName = manifest.packageName
243
+ manifestVersion = manifest.version
244
+ } catch (error) {
245
+ console.error("Error reading miniapp.json from zip:", error)
246
+ throw "READ_MANIFEST_FAILED"
247
+ }
248
+ const version = versionOverride ?? manifestVersion
249
+ console.log(`ZIP: installing ${packageName} as version ${version}`)
250
+
251
+ const basePackageDir = new Directory(Paths.document, "lmas", packageName)
252
+ try {
253
+ if (!basePackageDir.exists) {
254
+ basePackageDir.create({intermediates: true})
255
+ }
256
+ } catch (error) {
257
+ console.error("Error creating the base package directory", error)
258
+ throw "CREATE_PACKAGE_DIR_FAILED"
259
+ }
260
+
261
+ const versionDir = new Directory(basePackageDir, version)
262
+ try {
263
+ if (!versionDir.exists) {
264
+ versionDir.create()
265
+ } else {
266
+ versionDir.delete()
267
+ versionDir.create()
268
+ }
269
+ } catch (error) {
270
+ console.error("Error creating the version directory", error)
271
+ throw "CREATE_VERSION_DIR_FAILED"
272
+ }
273
+
274
+ try {
275
+ const contents = appDir.list()
276
+ for (const item of contents) {
277
+ item.move(versionDir)
278
+ }
279
+ } catch (error) {
280
+ console.error("Error moving the contents of the folder to the destination directory", error)
281
+ throw "INSTALL_CONTENTS_FAILED"
282
+ }
283
+
284
+ console.log("ZIP: local mini app installed at", versionDir.uri)
285
+ printDirectory(versionDir, 2)
286
+ return {packageName, version}
287
+ }
288
+
289
+ /**
290
+ * Download a miniapp zip from `url`, unpack it, and install it under
291
+ * `lmas/<packageName>/<version>/`. Thin composition of
292
+ * {@link downloadMiniAppZip} + {@link unpackMiniApp} for remote bundles.
293
+ *
294
+ * @param versionOverride override the manifest's version field. Used by the
295
+ * dev miniapp caching path which stamps `dev-<ms>`
296
+ * so multiple snapshots can coexist alongside
297
+ * semver-installed versions.
298
+ */
299
+ async function downloadAndInstallMiniApp(
300
+ url: string,
301
+ versionOverride?: string,
302
+ ): Promise<{packageName: string; version: string}> {
303
+ const downloadedZipPath = await downloadMiniAppZip(url)
304
+ console.log("ZIP: done downloading, starting unzip")
305
+ return unpackMiniApp(downloadedZipPath, versionOverride)
306
+ }
307
+
308
+ type Listener = () => void
309
+
310
+ class AppRegistry {
311
+ private cachedApps: ClientApp[] = []
312
+ // Offline apps live in a separate layer so they survive the disk-rebuild
313
+ // path in getInstalledMiniapps (which reassigns cachedApps).
314
+ private offlineApps: ClientApp[] = []
315
+ /** Package names whose start() requires the on-device STT model (host-declared). */
316
+ private sttModelRequired = new Set<string>()
317
+ private refreshNeeded: boolean = true
318
+ private listeners = new Set<Listener>()
319
+
320
+ private static instance: AppRegistry | null = null
321
+
322
+ private constructor() {}
323
+
324
+ public static getInstance(): AppRegistry {
325
+ if (!AppRegistry.instance) {
326
+ AppRegistry.instance = new AppRegistry()
327
+ }
328
+ return AppRegistry.instance
329
+ }
330
+
331
+ /** Subscribe to install/uninstall events. Listener fires after refreshNeeded flips. */
332
+ public subscribe(fn: Listener): () => void {
333
+ this.listeners.add(fn)
334
+ return () => {
335
+ this.listeners.delete(fn)
336
+ }
337
+ }
338
+
339
+ private notify(): void {
340
+ for (const fn of this.listeners) {
341
+ try {
342
+ fn()
343
+ } catch (e) {
344
+ console.warn("AppRegistry: listener threw", e)
345
+ }
346
+ }
347
+ }
348
+
349
+ /**
350
+ * On-disk path for a given miniapp bundle version.
351
+ */
352
+ public getBundleDir(packageName: string, version: string): string {
353
+ const bundleDir = new Directory(Paths.document, "lmas", packageName, version)
354
+ return bundleDir.uri
355
+ }
356
+
357
+ /**
358
+ * Resolve the two-layer entry paths for an installed miniapp version.
359
+ * Returns absolute file:// URIs for `background` and (when present) `ui`.
360
+ *
361
+ * Legacy single-layer bundles (no `entry` object in manifest) fall back
362
+ * to `index.html` discovery so the WebView host keeps working unchanged.
363
+ * Two-layer bundles ship `entry.background` and optional `entry.ui`
364
+ * paths relative to the bundle root.
365
+ *
366
+ * Returns null if neither shape resolves to existing files on disk.
367
+ */
368
+ public getMiniappEntryPaths(
369
+ packageName: string,
370
+ version: string,
371
+ ): {background: string | null; ui: string | null} | null {
372
+ const manifest = this.getMiniappManifest(packageName, version) as {
373
+ entry?: {background?: string; ui?: string}
374
+ } | null
375
+ const bundleDir = this.getBundleDir(packageName, version)
376
+ const resolve = (rel: string): string | null => {
377
+ const trimmed = rel.replace(/^\.?\/+/, "")
378
+ const file = new File(bundleDir, trimmed)
379
+ return file.exists ? file.uri : null
380
+ }
381
+ if (manifest?.entry) {
382
+ console.log("manifest.entry", manifest.entry)
383
+ const bg = manifest.entry.background ? resolve(manifest.entry.background) : null
384
+ console.log("bg", bg)
385
+ const ui = manifest.entry.ui ? resolve(manifest.entry.ui) : null
386
+ console.log("ui", ui)
387
+ if (bg || ui) {
388
+ return {background: bg, ui: ui}
389
+ }
390
+ }
391
+ // Legacy single-bundle fallback — `index.html` at the bundle root.
392
+ const legacy = new File(new Directory(bundleDir.replace(/^file:\/\//, "")), "index.html")
393
+ return {
394
+ background: null,
395
+ ui: legacy.exists ? legacy.uri : null,
396
+ }
397
+ }
398
+
399
+ /**
400
+ * Verify a manifest declares an SDK / host version range compatible
401
+ * with the current host. Delegates to the pure
402
+ * {@link checkManifestVersions} helper — same shape, no React Native
403
+ * imports, unit-testable. Manifests missing either field pass
404
+ * through unchanged (legacy single-layer path).
405
+ */
406
+ public checkManifestVersions(
407
+ manifest: {sdkVersion?: string; minHostVersion?: string} | null,
408
+ options: {hostVersion: string; supportedSdkRange: string},
409
+ ): {ok: true} | {ok: false; reason: string} {
410
+ return checkManifestVersions(manifest, options)
411
+ }
412
+
413
+ /**
414
+ * Read and parse the miniapp manifest (miniapp.json with app.json fallback)
415
+ * from a given bundle directory.
416
+ */
417
+ public getMiniappManifest(packageName: string, version: string): any {
418
+ const bundleDir = new Directory(Paths.document, "lmas", packageName, version)
419
+ try {
420
+ const miniappJsonFile = new File(bundleDir, "miniapp.json")
421
+ if (miniappJsonFile.exists) {
422
+ return JSON.parse(miniappJsonFile.textSync())
423
+ }
424
+ } catch (e) {
425
+ console.warn("AppRegistry: Error reading miniapp.json, trying app.json fallback", e)
426
+ }
427
+ try {
428
+ const appJsonFile = new File(bundleDir, "app.json")
429
+ if (appJsonFile.exists) {
430
+ return JSON.parse(appJsonFile.textSync())
431
+ }
432
+ } catch (e) {
433
+ console.warn("AppRegistry: Error reading app.json fallback", e)
434
+ }
435
+ return null
436
+ }
437
+
438
+ /**
439
+ * Download and install a miniapp bundle from a URL. The URL must serve a
440
+ * zip whose root contains `miniapp.json` plus the bundle entry files.
441
+ *
442
+ * @param opts.versionOverride if set, install under this version instead
443
+ * of `manifest.version`. The dev caching path uses `dev-<ms>` so multiple
444
+ * snapshots can coexist alongside semver-installed versions.
445
+ */
446
+ public installFromUrl(
447
+ url: string,
448
+ opts?: {versionOverride?: string; releaseIdentity?: MiniappReleaseIdentity},
449
+ ): AsyncResult<void, Error> {
450
+ return Res.try_async(async () => {
451
+ const {packageName, version} = await downloadAndInstallMiniApp(url, opts?.versionOverride)
452
+ console.log("APP_REGISTRY: Downloaded and installed mini app")
453
+ this.finalizeInstall(
454
+ packageName,
455
+ version,
456
+ opts?.releaseIdentity ?? {source: version.startsWith("dev-") ? "dev_snapshot" : "direct_download"},
457
+ )
458
+ })
459
+ }
460
+
461
+ /**
462
+ * Install a miniapp from a zip already on local disk (e.g. a bundled asset
463
+ * copied into cache). Skips the HTTP download path that `installFromUrl`
464
+ * uses — `File.downloadFileAsync` is HTTP(S)-only and rejects file:// URIs.
465
+ *
466
+ * @param zipPath file:// URI of the local zip.
467
+ */
468
+ public installFromLocalZip(
469
+ zipPath: string,
470
+ opts?: {versionOverride?: string; releaseIdentity?: MiniappReleaseIdentity},
471
+ ): AsyncResult<{packageName: string; version: string}, Error> {
472
+ return Res.try_async(async () => {
473
+ const {packageName, version} = await unpackMiniApp(zipPath, opts?.versionOverride)
474
+ console.log("APP_REGISTRY: Installed mini app from local zip")
475
+ this.finalizeInstall(packageName, version, opts?.releaseIdentity ?? {source: "bundled_asset"})
476
+ return {packageName, version}
477
+ })
478
+ }
479
+
480
+ /**
481
+ * Post-install bookkeeping shared by every install path: clear stale dev
482
+ * artifacts on release installs, point the active-version at the just-
483
+ * installed bundle, and notify subscribers to refresh.
484
+ */
485
+ private finalizeInstall(packageName: string, version: string, releaseIdentity: MiniappReleaseIdentity): void {
486
+ // If this is a release install (semver, not dev-*) of a package that
487
+ // currently has dev-* snapshots, clear the dev state so the swap to
488
+ // "released" is clean. Otherwise the dev version would keep winning
489
+ // getActiveVersion's dev-precedence rule and the just-installed
490
+ // release wouldn't run.
491
+ const isDevInstall = version.startsWith("dev-")
492
+ if (!isDevInstall) {
493
+ this.clearDevArtifacts(packageName)
494
+ }
495
+
496
+ this.setActiveVersion(packageName, version)
497
+ storage.save(releaseIdentityKey(packageName, version), releaseIdentity)
498
+ this.refreshNeeded = true
499
+ this.notify()
500
+ }
501
+
502
+ public getReleaseIdentity(packageName: string, version: string): MiniappReleaseIdentity | null {
503
+ const result = storage.load<MiniappReleaseIdentity>(releaseIdentityKey(packageName, version))
504
+ return result.is_ok() ? result.value : null
505
+ }
506
+
507
+ public installFromJsonUrl(baseUrl: string): AsyncResult<{packageName: string; version: string; name: string}, Error> {
508
+ return Res.try_async(async () => {
509
+ const trimmed = baseUrl.replace(/\/$/, "")
510
+
511
+ const manifestRes = await fetch(`${trimmed}/miniapp.json`)
512
+ if (!manifestRes.ok) {
513
+ throw new Error(`Failed to fetch miniapp.json: ${manifestRes.status}`)
514
+ }
515
+ const manifest = (await manifestRes.json()) as Record<string, unknown>
516
+ const packageName = manifest.packageName as string | undefined
517
+ const version = manifest.version as string | undefined
518
+ const name = (manifest.name as string | undefined) ?? packageName ?? "Mini app"
519
+ if (!packageName) throw new Error("miniapp.json missing packageName")
520
+ if (!version) throw new Error("miniapp.json missing version")
521
+
522
+ const installRes = await appRegistry.installFromUrl(`${trimmed}/bundle.zip`)
523
+ if (installRes.is_error()) throw installRes.error
524
+
525
+ return {packageName, version, name}
526
+ })
527
+ }
528
+
529
+ /**
530
+ * Drop every dev-* version directory for a package plus ALL dev MMKV keys
531
+ * (URL/port/reachability + the home-tile metadata record). Called on a
532
+ * release install (dev → released transition) and on uninstall, so a dev
533
+ * package leaves nothing behind that `projectDevApps` could re-surface.
534
+ *
535
+ * Dev registrations live under a namespaced id (deriveDevPackageId), so a
536
+ * release install of the MANIFEST package no longer matches them here — the
537
+ * dev tile survives the restart-time auto-installers by construction, and
538
+ * this cleanup fires for the dev tile only via uninstall(itsNamespacedId).
539
+ * (Matching legacy un-namespaced records is still cleaned up, on purpose.)
540
+ */
541
+ private clearDevArtifacts(packageName: string): void {
542
+ try {
543
+ const pkgDir = new Directory(Paths.document, "lmas", packageName)
544
+ if (pkgDir.exists) {
545
+ for (const item of pkgDir.list()) {
546
+ if (item instanceof Directory && item.name.startsWith("dev-")) {
547
+ try {
548
+ storage.remove(releaseIdentityKey(packageName, item.name))
549
+ item.delete()
550
+ } catch (e) {
551
+ console.warn(`APP_REGISTRY: failed to delete ${item.name}:`, e)
552
+ }
553
+ }
554
+ }
555
+ }
556
+ } catch (e) {
557
+ console.warn(`APP_REGISTRY: clearDevArtifacts dir scan failed for ${packageName}:`, e)
558
+ }
559
+ storage.remove(`${packageName}_dev_url`)
560
+ storage.remove(`${packageName}_dev_port`)
561
+ storage.remove(`${packageName}_dev_mdns`)
562
+ storage.remove(`${packageName}_dev_last_reachable`)
563
+ // HTTP-direct dev miniapps are indexed by their real package name. A
564
+ // release install/uninstall of that same package should remove only its
565
+ // dev tile; unrelated dev miniapps must remain available.
566
+ if (readDevAppRecord(packageName)) unregisterDevApp(packageName)
567
+ }
568
+
569
+ /**
570
+ * Garbage-collect older `dev-*` version directories for this package,
571
+ * keeping the latest `keep` (by lexicographic sort, which matches
572
+ * timestamp ordering since dev-<ms> is zero-padded).
573
+ *
574
+ * Only touches `dev-*` versions; semver-installed versions are left alone.
575
+ */
576
+ public gcDevVersions(packageName: string, keep: number): void {
577
+ try {
578
+ const pkgDir = new Directory(Paths.document, "lmas", packageName)
579
+ if (!pkgDir.exists) return
580
+ const dirs = pkgDir
581
+ .list()
582
+ .filter((d): d is Directory => d instanceof Directory && d.name.startsWith("dev-"))
583
+ .sort((a, b) => (a.name < b.name ? 1 : -1))
584
+ for (let i = keep; i < dirs.length; i++) {
585
+ try {
586
+ dirs[i].delete()
587
+ } catch (e) {
588
+ console.warn(`APP_REGISTRY: failed to delete ${dirs[i].name}:`, e)
589
+ }
590
+ }
591
+ if (dirs.length > keep) this.refreshNeeded = true
592
+ } catch (e) {
593
+ console.warn(`APP_REGISTRY: gcDevVersions error for ${packageName}:`, e)
594
+ }
595
+ }
596
+
597
+ public uninstall(packageName: string, version?: string): AsyncResult<void, Error> {
598
+ return Res.try_async(async () => {
599
+ if (version) {
600
+ const lmaDir = new Directory(Paths.document, "lmas", packageName, version)
601
+ // Guard exists: a dev miniapp loads over HTTP and has no on-disk dir,
602
+ // so an unconditional delete() would throw and abort the cleanup below.
603
+ if (lmaDir.exists) lmaDir.delete()
604
+ storage.remove(releaseIdentityKey(packageName, version))
605
+ console.log("APP_REGISTRY: Uninstalled mini app version", version)
606
+ const packageDir = new Directory(Paths.document, "lmas", packageName)
607
+ if (packageDir.exists && packageDir.list().length === 0) {
608
+ packageDir.delete()
609
+ }
610
+ } else {
611
+ for (const installedVersion of this.getInstalledVersions(packageName)) {
612
+ storage.remove(releaseIdentityKey(packageName, installedVersion))
613
+ }
614
+ const packageDir = new Directory(Paths.document, "lmas", packageName)
615
+ if (packageDir.exists) {
616
+ packageDir.delete()
617
+ }
618
+ console.log("APP_REGISTRY: Uninstalled all versions of mini app", packageName)
619
+ }
620
+ // Always clear dev artifacts: for HTTP-direct dev miniapps the tile is
621
+ // backed by storage records (_dev_meta + dev_apps_index), not the disk
622
+ // dir, so without this the projected tile reappears on the next refresh.
623
+ this.clearDevArtifacts(packageName)
624
+ this.refreshNeeded = true
625
+ this.notify()
626
+ })
627
+ }
628
+
629
+ public getPackageNames(): string[] {
630
+ try {
631
+ const lmasDir = new Directory(Paths.document, "lmas")
632
+ if (!lmasDir.exists) return []
633
+ let lmas = lmasDir.list()
634
+ lmas = lmas.filter((lma): lma is Directory => lma instanceof Directory && lma.list().length > 0)
635
+ return lmas.map((lma) => lma.name)
636
+ } catch (error) {
637
+ console.error("APP_REGISTRY: Error getting locally installed package names", error)
638
+ return []
639
+ }
640
+ }
641
+
642
+ public getInstalledVersions(packageName: string): string[] {
643
+ try {
644
+ const lmaDir = new Directory(Paths.document, "lmas", packageName)
645
+ // Not installed yet is an expected state (e.g. preinstall sync probing
646
+ // versions before first install) — return [] without the error noise.
647
+ if (!lmaDir.exists) {
648
+ return []
649
+ }
650
+ const lma = lmaDir.list()
651
+ return lma.map((lma) => lma.name)
652
+ } catch (error) {
653
+ console.error("APP_REGISTRY: Error getting local applet versions", error)
654
+ return []
655
+ }
656
+ }
657
+
658
+ public async getActiveVersion(packageName: string): Promise<string> {
659
+ let versions = this.getInstalledVersions(packageName)
660
+ // Treat MMKV as a hint, not authority. A stored version may have been
661
+ // GC'd off disk without this pointer being updated.
662
+ let res = storage.load<string>(`${packageName}_active_version`)
663
+ if (res.is_ok() && versions.includes(res.value)) {
664
+ return res.value
665
+ }
666
+ // Dev versions take precedence over semver-installed versions.
667
+ const devVersions = versions
668
+ .filter((v) => v.startsWith("dev-"))
669
+ .sort()
670
+ .reverse()
671
+ if (devVersions.length > 0) {
672
+ this.setActiveVersion(packageName, devVersions[0])
673
+ return devVersions[0]
674
+ }
675
+ versions = versions.filter((v) => semver.valid(v))
676
+ versions.sort((a, b) => semver.rcompare(a, b))
677
+ this.setActiveVersion(packageName, versions[0])
678
+ return versions[0]
679
+ }
680
+
681
+ public setActiveVersion(packageName: string, version: string): Result<void, Error> {
682
+ return storage.save(`${packageName}_active_version`, version)
683
+ }
684
+
685
+ public getMetadata(packageName: string, version: string): InstalledInfo {
686
+ try {
687
+ const lmaDir = new Directory(Paths.document, "lmas", packageName, version)
688
+ const miniappJsonFile = new File(lmaDir, "miniapp.json")
689
+ const manifest = JSON.parse(miniappJsonFile.textSync())
690
+ const logoUrl = new File(lmaDir, "icon.png").uri
691
+ return {name: manifest.name, logoUrl: logoUrl}
692
+ } catch (error) {
693
+ console.error("APP_REGISTRY: Error getting local miniapp metadata", error)
694
+ return {name: "error", logoUrl: ""}
695
+ }
696
+ }
697
+
698
+ public getInstalledInfo(): InstalledLma[] {
699
+ const packageNames = this.getPackageNames()
700
+ const out: InstalledLma[] = []
701
+ for (const packageName of packageNames) {
702
+ const versionStrings = this.getInstalledVersions(packageName)
703
+ const installedVersion: InstalledLma = {packageName, versions: {}}
704
+ for (const versionString of versionStrings) {
705
+ installedVersion.versions[versionString] = this.getMetadata(packageName, versionString)
706
+ }
707
+ out.push(installedVersion)
708
+ }
709
+ return out
710
+ }
711
+
712
+ /**
713
+ * Merge disk-derived apps with the projected dev + offline layers,
714
+ * de-duping by packageName. Dev registrations use namespaced ids
715
+ * (deriveDevPackageId), so a dev tile and a real install of the same
716
+ * manifest package coexist as separate tiles; the dedupe below only bites
717
+ * legacy un-namespaced dev records. Native offline apps keep top priority.
718
+ */
719
+ private mergeProjectedApps(diskApps: ClientApp[]): ClientApp[] {
720
+ const offline = this.projectOfflineApps()
721
+ const offlinePackages = new Set(offline.map((app) => app.packageName))
722
+ const dev = this.projectDevApps().filter((app) => !offlinePackages.has(app.packageName))
723
+ const devPackages = new Set(dev.map((app) => app.packageName))
724
+ const installed = diskApps.filter(
725
+ (app) => !offlinePackages.has(app.packageName) && !devPackages.has(app.packageName),
726
+ )
727
+ return [...installed, ...dev, ...offline]
728
+ }
729
+
730
+ public async getInstalledMiniapps(): Promise<ClientApp[]> {
731
+ if (!this.refreshNeeded && this.cachedApps.length > 0) {
732
+ // Cache hit: re-project running from the registry. The cached array
733
+ // IS the disk-derived truth; running comes from the mount registry.
734
+ return this.mergeProjectedApps(
735
+ this.cachedApps.map((a) => ({
736
+ ...a,
737
+ running: miniappRunningRegistry.has(a.packageName),
738
+ })),
739
+ )
740
+ }
741
+
742
+ try {
743
+ const installedInfo = this.getInstalledInfo()
744
+ const out: ClientApp[] = []
745
+ for (const lmaInfo of installedInfo) {
746
+ const versionString = await this.getActiveVersion(lmaInfo.packageName)
747
+ const versionInfo = lmaInfo.versions[versionString]
748
+
749
+ const manifest = this.getMiniappManifest(lmaInfo.packageName, versionString) as {
750
+ permissions?: Array<string | {type: string; required?: boolean; description?: string}>
751
+ hardwareRequirements?: Array<{type: string; level: string; description?: string}>
752
+ type?: string
753
+ actions?: Array<{id?: unknown; description?: unknown; parameters?: unknown; outputSchema?: unknown; visibility?: unknown}>
754
+ } | null
755
+
756
+ const permissions = normalizeManifestPermissions(manifest?.permissions)
757
+ const hardwareRequirements = buildHardwareRequirements(manifest?.hardwareRequirements, lmaInfo.packageName)
758
+ const appType = normalizeManifestType(manifest?.type)
759
+
760
+ // Declared actions (for session.miniapps.list + invoke gating).
761
+ const actions = normalizeManifestActions(manifest?.actions)
762
+
763
+ // Dev miniapps live in the same lmas/ tree as installed ones, but
764
+ // their version directory name starts with "dev-".
765
+ const isMiniappDev = versionString.startsWith("dev-")
766
+ let devUrl: string | undefined
767
+ if (isMiniappDev) {
768
+ const devUrlRes = storage.load<string>(`${lmaInfo.packageName}_dev_url`)
769
+ if (devUrlRes.is_ok()) devUrl = devUrlRes.value
770
+ }
771
+
772
+ out.push({
773
+ packageName: lmaInfo.packageName,
774
+ version: versionString,
775
+ running: miniappRunningRegistry.has(lmaInfo.packageName),
776
+ local: true,
777
+ healthy: true,
778
+ loading: false,
779
+ offline: false,
780
+ hidden: false,
781
+ offlineRoute: "",
782
+ name: versionInfo.name,
783
+ webviewUrl: "",
784
+ logoUrl: versionInfo.logoUrl,
785
+ type: appType,
786
+ permissions,
787
+ hardwareRequirements,
788
+ // Always project actions (even []) so the invoke gate can enforce
789
+ // declared-action membership unconditionally — an app with no declared
790
+ // actions must reject every invoke, not bypass the check.
791
+ actions,
792
+ ...(isMiniappDev ? {isMiniappDev: true} : {}),
793
+ ...(devUrl ? {devUrl} : {}),
794
+ onStart: () => saveLocalAppRunningState(lmaInfo.packageName, true),
795
+ onStop: () => saveLocalAppRunningState(lmaInfo.packageName, false),
796
+ })
797
+ }
798
+
799
+ this.cachedApps = out
800
+ this.refreshNeeded = false
801
+ return this.mergeProjectedApps(this.cachedApps)
802
+ } catch (error) {
803
+ console.error("APP_REGISTRY: Error getting local applets", error)
804
+ return this.mergeProjectedApps(
805
+ this.cachedApps.map((a) => ({
806
+ ...a,
807
+ running: miniappRunningRegistry.has(a.packageName),
808
+ })),
809
+ )
810
+ }
811
+ }
812
+
813
+ /** Force the next getInstalledMiniapps() to re-derive from disk + records. */
814
+ public markRefreshNeeded(): void {
815
+ this.refreshNeeded = true
816
+ this.notify()
817
+ }
818
+
819
+ /**
820
+ * Project persisted dev-app metadata records into ClientApp tiles. Dev
821
+ * miniapps aren't installed to disk (they load over HTTP), so they don't
822
+ * appear in the `lmas/` scan — this surfaces them on the home screen so
823
+ * they're re-launchable without re-scanning the QR.
824
+ */
825
+ private projectDevApps(): ClientApp[] {
826
+ return getDevAppRecords().map((rec) => {
827
+ const permissions = normalizeManifestPermissions(rec.permissions)
828
+ const hardwareRequirements = buildHardwareRequirements(rec.hardwareRequirements, rec.packageName)
829
+ return {
830
+ packageName: rec.packageName,
831
+ version: undefined,
832
+ running: miniappRunningRegistry.has(rec.packageName),
833
+ local: true,
834
+ healthy: true,
835
+ loading: false,
836
+ offline: false,
837
+ hidden: false,
838
+ offlineRoute: "",
839
+ name: rec.name,
840
+ webviewUrl: "",
841
+ logoUrl: rec.iconUrl,
842
+ type: normalizeManifestType(rec.type),
843
+ permissions,
844
+ hardwareRequirements,
845
+ actions: normalizeManifestActions(rec.actions),
846
+ isMiniappDev: true,
847
+ devUrl: rec.devUrl,
848
+ devPort: rec.devPort,
849
+ onStart: () => saveLocalAppRunningState(rec.packageName, true),
850
+ onStop: () => saveLocalAppRunningState(rec.packageName, false),
851
+ }
852
+ })
853
+ }
854
+
855
+ private projectOfflineApps(): ClientApp[] {
856
+ // Offline apps don't go through miniappRunningRegistry (that's for
857
+ // MiniappHost-mounted webviews). Their running flag is persisted to
858
+ // MMKV by saveLocalAppRunningState — read it back here so refreshes
859
+ // don't blow away the active flag.
860
+ return this.offlineApps.map((a) => {
861
+ const running = getLocalAppRunningState(a.packageName)
862
+ const screenshot = getLocalAppScreenshot(a.packageName)
863
+
864
+ return {...a, running, screenshot}
865
+ })
866
+ }
867
+
868
+ // Register an offline (locally-routed) app. Survives disk rebuilds.
869
+ public installOfflineApp(app: ClientApp, opts?: {requiresLocalSttModel?: boolean}): void {
870
+ if (opts?.requiresLocalSttModel) {
871
+ this.sttModelRequired.add(app.packageName)
872
+ }
873
+ this.offlineApps.push({
874
+ ...app,
875
+ onStart: () => saveLocalAppRunningState(app.packageName, true),
876
+ onStop: () => saveLocalAppRunningState(app.packageName, false),
877
+ })
878
+ this.refreshNeeded = true
879
+ this.notify()
880
+ }
881
+
882
+ /**
883
+ * Registered as needing the on-device STT model before it can start (the
884
+ * host declares this per offline app; the apps store gates start() on it).
885
+ */
886
+ public requiresLocalSttModel(packageName: string): boolean {
887
+ return this.sttModelRequired.has(packageName)
888
+ }
889
+
890
+ public getMiniappHtml(packageName: string, version: string): Result<string, Error> {
891
+ return Res.try(() => {
892
+ const lmaDir = new Directory(Paths.document, "lmas", packageName, version)
893
+ const htmlFile = new File(lmaDir, "index.html")
894
+ return htmlFile.textSync()
895
+ })
896
+ }
897
+ }
898
+
899
+ /**
900
+ * Persist the running flag for a local miniapp (read on next cold boot so
901
+ * autostart picks the right set of apps). Exported for hosts that want to
902
+ * track running state independently.
903
+ */
904
+ export function saveLocalAppRunningState(packageName: string, status: boolean): void {
905
+ storage.save(`${packageName}_running`, status)
906
+ }
907
+
908
+ export function getLocalAppRunningState(packageName: string): boolean {
909
+ const res = storage.load<boolean>(`${packageName}_running`)
910
+ if (res.is_ok()) return res.value
911
+ return false
912
+ }
913
+
914
+ export function getLocalAppScreenshot(packageName: string): string | undefined {
915
+ const key = `${packageName}_screenshot`
916
+ const res = storage.load<string>(key)
917
+ if (res.is_error()) return undefined
918
+
919
+ const uri = res.value
920
+ if (uri.startsWith("file://")) {
921
+ try {
922
+ if (!new File(uri).exists) {
923
+ storage.remove(key)
924
+ return undefined
925
+ }
926
+ } catch {
927
+ storage.remove(key)
928
+ return undefined
929
+ }
930
+ }
931
+
932
+ return uri
933
+ }
934
+
935
+ /**
936
+ * Persisted metadata for a dev miniapp's home tile.
937
+ *
938
+ * Dev miniapps load directly off the dev server over HTTP and are NOT
939
+ * installed into `lmas/`, so the disk scan in `getInstalledMiniapps` can't
940
+ * see them. We persist a tiny record at scan / dev-URL-entry time so the
941
+ * tile survives across app launches and is re-launchable without re-scanning.
942
+ * `permissions` / `hardwareRequirements` are snapshotted from the manifest so
943
+ * the home-screen permission gate has data without a disk bundle.
944
+ */
945
+ export interface DevAppRecord {
946
+ packageName: string
947
+ name: string
948
+ iconUrl: string
949
+ devUrl: string
950
+ devPort?: number
951
+ /**
952
+ * Bonjour / mDNS hostname from the QR (`ComputerName.local`). Used as a
953
+ * failover host when the raw LAN IP in `devUrl` goes stale after a Wi-Fi
954
+ * change — phones that resolve `.local` can relaunch without re-scanning.
955
+ */
956
+ mdnsHost?: string
957
+ type?: AppletType
958
+ permissions?: Array<string | {type: string; required?: boolean; description?: string}>
959
+ hardwareRequirements?: Array<{type: string; level: string; description?: string}>
960
+ /** Manifest-declared actions — so dev-sideloaded miniapps can be invoked too. */
961
+ actions?: Array<{id?: unknown; description?: unknown; parameters?: unknown; outputSchema?: unknown; visibility?: unknown}>
962
+ /** Legacy single-slot migration field. New records use the real packageName directly. */
963
+ sourcePackageName?: string
964
+ /**
965
+ * Short-lived Core-verifiable proof emitted by `glassly dev`. This lets the
966
+ * dev runtime request auto-auth for the manifest package without letting
967
+ * arbitrary dev URLs claim any package name.
968
+ */
969
+ devAttestation?: string
970
+ }
971
+
972
+ const DEV_APPS_INDEX_KEY = "dev_apps_index"
973
+ const DEV_APP_ICONS_DIR = "dev-miniapp-icons"
974
+
975
+
976
+ function isPrivateLanHost(hostname: string): boolean {
977
+ return (
978
+ hostname === "localhost" ||
979
+ hostname.startsWith("192.168.") ||
980
+ hostname.startsWith("10.") ||
981
+ /^172\.(1[6-9]|2\d|3[0-1])\./.test(hostname)
982
+ )
983
+ }
984
+
985
+ function rewriteStaleDevUrl(value: string): string {
986
+ if (!__DEV__) return value
987
+ const host = configuredDevHost()
988
+ if (!host) return value
989
+
990
+ try {
991
+ const url = new URL(value)
992
+ if (url.hostname === host || !isPrivateLanHost(url.hostname)) return value
993
+ url.hostname = host
994
+ return url.toString().replace(/\/$/, "")
995
+ } catch {
996
+ return value
997
+ }
998
+ }
999
+
1000
+ function normalizeDevAppRecord(record: DevAppRecord): DevAppRecord {
1001
+ const devUrl = rewriteStaleDevUrl(record.devUrl)
1002
+ const iconUrl = rewriteStaleDevUrl(record.iconUrl)
1003
+ return devUrl === record.devUrl && iconUrl === record.iconUrl ? record : {...record, devUrl, iconUrl}
1004
+ }
1005
+
1006
+ /** Legacy package used by builds that supported only one dev miniapp. */
1007
+ export const DEV_APP_PACKAGE_NAME = "com.dev"
1008
+ export const DEV_APP_NAME = "Dev"
1009
+
1010
+ /**
1011
+ * Copy a dev-server icon into Documents so the tile remains branded after the
1012
+ * laptop/server disappears. A failed download is non-fatal: the remote URL is
1013
+ * retained and can still render while the server is reachable.
1014
+ */
1015
+ async function cacheDevAppIcon(packageName: string, iconUrl: string): Promise<string> {
1016
+ if (!/^https?:\/\//.test(iconUrl)) return iconUrl
1017
+
1018
+ try {
1019
+ const dir = new Directory(Paths.document, DEV_APP_ICONS_DIR)
1020
+ if (!dir.exists) dir.create({intermediates: true})
1021
+
1022
+ const safePackageName = packageName.replace(/[^a-zA-Z0-9._-]/g, "_")
1023
+ let extension = ".png"
1024
+ try {
1025
+ const match = new URL(iconUrl).pathname.match(/\.(png|jpe?g|webp|gif|svg)$/i)
1026
+ if (match) extension = `.${match[1].toLowerCase()}`
1027
+ } catch {
1028
+ // Keep the decoder-friendly .png fallback; image loaders sniff content.
1029
+ }
1030
+
1031
+ const target = new File(dir, `${safePackageName}${extension}`)
1032
+ const downloaded = await File.downloadFileAsync(iconUrl, target, {idempotent: true})
1033
+
1034
+ // Only remove older extensions AFTER the replacement is safely on disk;
1035
+ // a broken icon URL must not destroy the last known-good cached logo.
1036
+ for (const item of dir.list()) {
1037
+ if (item instanceof File && item.uri !== downloaded.uri && item.name.startsWith(`${safePackageName}.`)) {
1038
+ try {
1039
+ item.delete()
1040
+ } catch {
1041
+ // Best effort; the current icon has already been persisted.
1042
+ }
1043
+ }
1044
+ }
1045
+ return downloaded.uri
1046
+ } catch (error) {
1047
+ console.warn(`APP_REGISTRY: failed to cache dev icon for ${packageName}:`, error)
1048
+ return readDevAppRecord(packageName)?.iconUrl ?? iconUrl
1049
+ }
1050
+ }
1051
+
1052
+ function removeDevRecordKeys(packageName: string): void {
1053
+ const existing = readDevAppRecord(packageName)
1054
+ if (existing?.iconUrl.startsWith("file://")) {
1055
+ try {
1056
+ const icon = new File(existing.iconUrl)
1057
+ if (icon.exists) icon.delete()
1058
+ } catch (error) {
1059
+ console.warn(`APP_REGISTRY: failed to delete dev icon for ${packageName}:`, error)
1060
+ }
1061
+ }
1062
+ storage.remove(`${packageName}_dev_meta`)
1063
+ storage.remove(`${packageName}_dev_url`)
1064
+ storage.remove(`${packageName}_dev_port`)
1065
+ storage.remove(`${packageName}_dev_mdns`)
1066
+ storage.remove(`${packageName}_dev_last_reachable`)
1067
+ }
1068
+
1069
+ function readDevAppRecord(packageName: string): DevAppRecord | null {
1070
+ const res = storage.load<string>(`${packageName}_dev_meta`)
1071
+ if (!res.is_ok()) return null
1072
+ try {
1073
+ return JSON.parse(res.value) as DevAppRecord
1074
+ } catch {
1075
+ return null
1076
+ }
1077
+ }
1078
+
1079
+ /** Move the historical `com.dev` record onto its real manifest package key. */
1080
+ function migrateLegacyDevSlot(): void {
1081
+ const legacy = readDevAppRecord(DEV_APP_PACKAGE_NAME)
1082
+ const targetPackage = legacy?.sourcePackageName?.trim()
1083
+ if (!legacy || !targetPackage || targetPackage === DEV_APP_PACKAGE_NAME) return
1084
+
1085
+ const existingTarget = readDevAppRecord(targetPackage)
1086
+ const migrated: DevAppRecord = existingTarget ?? {
1087
+ ...legacy,
1088
+ packageName: targetPackage,
1089
+ sourcePackageName: targetPackage,
1090
+ }
1091
+ if (!existingTarget) storage.save(`${targetPackage}_dev_meta`, JSON.stringify(migrated))
1092
+
1093
+ const legacyUrl = storage.load<string>(`${DEV_APP_PACKAGE_NAME}_dev_url`)
1094
+ const targetUrl = storage.load<string>(`${targetPackage}_dev_url`)
1095
+ if (!targetUrl.is_ok()) {
1096
+ storage.save(`${targetPackage}_dev_url`, legacyUrl.is_ok() ? legacyUrl.value : migrated.devUrl)
1097
+ }
1098
+ const legacyPort = storage.load<number>(`${DEV_APP_PACKAGE_NAME}_dev_port`)
1099
+ const targetPort = storage.load<number>(`${targetPackage}_dev_port`)
1100
+ if (!targetPort.is_ok()) {
1101
+ const port = migrated.devPort ?? (legacyPort.is_ok() ? legacyPort.value : undefined)
1102
+ if (typeof port === "number" && Number.isFinite(port)) storage.save(`${targetPackage}_dev_port`, port)
1103
+ }
1104
+ const legacyMdns = storage.load<string>(`${DEV_APP_PACKAGE_NAME}_dev_mdns`)
1105
+ const targetMdns = storage.load<string>(`${targetPackage}_dev_mdns`)
1106
+ if (!targetMdns.is_ok() && legacyMdns.is_ok() && legacyMdns.value.trim()) {
1107
+ storage.save(`${targetPackage}_dev_mdns`, legacyMdns.value.trim())
1108
+ }
1109
+
1110
+ storage.remove(`${DEV_APP_PACKAGE_NAME}_dev_meta`)
1111
+ storage.remove(`${DEV_APP_PACKAGE_NAME}_dev_url`)
1112
+ storage.remove(`${DEV_APP_PACKAGE_NAME}_dev_port`)
1113
+ storage.remove(`${DEV_APP_PACKAGE_NAME}_dev_mdns`)
1114
+ storage.remove(`${DEV_APP_PACKAGE_NAME}_dev_last_reachable`)
1115
+
1116
+ const index = Array.from(new Set(getDevAppIndex().map((pkg) => (pkg === DEV_APP_PACKAGE_NAME ? targetPackage : pkg))))
1117
+ storage.save(DEV_APPS_INDEX_KEY, JSON.stringify(index))
1118
+ }
1119
+
1120
+ function readStoredMdnsHost(packageName: string): string | undefined {
1121
+ const res = storage.load<string>(`${packageName}_dev_mdns`)
1122
+ if (!res.is_ok()) return undefined
1123
+ return res.value.trim() || undefined
1124
+ }
1125
+
1126
+ /**
1127
+ * Namespace a dev registration's package id so it can never collide with a
1128
+ * real install of the same manifest package. Without this, the restart-time
1129
+ * auto-installers (bundled assets in MantleManager, the preinstalled
1130
+ * registry sync) treat their release install of the manifest package as a
1131
+ * dev→released transition and wipe the dev registration via
1132
+ * clearDevArtifacts — scanning a QR for a fork of a bundled miniapp lost the
1133
+ * dev tile on every app restart. Idempotent: an already-namespaced id passes
1134
+ * through unchanged, so re-deriving at call sites is safe.
1135
+ */
1136
+ export function deriveDevPackageId(packageName: string): string {
1137
+ const pkg = packageName.trim()
1138
+ return pkg.endsWith(".dev") ? pkg : `${pkg}.dev`
1139
+ }
1140
+
1141
+ /**
1142
+ * Register or update one dev miniapp. Records are keyed by the NAMESPACED id
1143
+ * (deriveDevPackageId), not the manifest package, so a dev tile coexists
1144
+ * with a real install of the same app and survives the auto-installers;
1145
+ * `sourcePackageName` keeps the manifest package for attestation/source
1146
+ * lookups. Different packages coexist; rescanning the same package updates
1147
+ * its record in place. Returns the stored record — its `packageName` is the
1148
+ * derived id callers must use for stop/foreground/navigation.
1149
+ */
1150
+ export async function registerDevApp(record: DevAppRecord): Promise<DevAppRecord> {
1151
+ migrateLegacyDevSlot()
1152
+ const rawPackageName = record.packageName.trim()
1153
+ if (!rawPackageName) throw new Error("Dev miniapp manifest is missing packageName")
1154
+ const packageName = deriveDevPackageId(rawPackageName)
1155
+ const sourcePackageName = rawPackageName.endsWith(".dev") ? rawPackageName.slice(0, -".dev".length) : rawPackageName
1156
+
1157
+ const iconUrl = await cacheDevAppIcon(packageName, record.iconUrl)
1158
+ // Relaunch paths (developer-URL screen, loadDevMiniapp) omit mdnsHost, so an
1159
+ // omitted field keeps whatever the QR scan stored instead of wiping the
1160
+ // `.local` failover host.
1161
+ const mdnsHost =
1162
+ record.mdnsHost !== undefined ? record.mdnsHost.trim() || undefined : readStoredMdnsHost(packageName)
1163
+ const devRecord: DevAppRecord = {
1164
+ ...record,
1165
+ packageName,
1166
+ sourcePackageName,
1167
+ name: record.name || DEV_APP_NAME,
1168
+ iconUrl,
1169
+ mdnsHost,
1170
+ }
1171
+ storage.save(`${packageName}_dev_meta`, JSON.stringify(devRecord))
1172
+ storage.save(`${packageName}_dev_url`, record.devUrl)
1173
+ if (typeof record.devPort === "number" && Number.isFinite(record.devPort)) {
1174
+ storage.save(`${packageName}_dev_port`, record.devPort)
1175
+ } else {
1176
+ storage.remove(`${packageName}_dev_port`)
1177
+ }
1178
+ if (mdnsHost) {
1179
+ storage.save(`${packageName}_dev_mdns`, mdnsHost)
1180
+ } else {
1181
+ storage.remove(`${packageName}_dev_mdns`)
1182
+ }
1183
+ const idx = getDevAppIndex()
1184
+ if (!idx.includes(packageName)) {
1185
+ idx.push(packageName)
1186
+ storage.save(DEV_APPS_INDEX_KEY, JSON.stringify(idx))
1187
+ }
1188
+ appRegistry.markRefreshNeeded()
1189
+ return devRecord
1190
+ }
1191
+
1192
+ /** Drop one dev miniapp's metadata, routing keys, and cached icon. */
1193
+ export function unregisterDevApp(packageName = DEV_APP_PACKAGE_NAME): void {
1194
+ removeDevRecordKeys(packageName)
1195
+ const idx = getDevAppIndex().filter((p) => p !== packageName)
1196
+ storage.save(DEV_APPS_INDEX_KEY, JSON.stringify(idx))
1197
+ appRegistry.markRefreshNeeded()
1198
+ }
1199
+
1200
+ function getDevAppIndex(): string[] {
1201
+ const res = storage.load<string>(DEV_APPS_INDEX_KEY)
1202
+ if (!res.is_ok()) return []
1203
+ try {
1204
+ const parsed = JSON.parse(res.value)
1205
+ return Array.isArray(parsed) ? (parsed as string[]) : []
1206
+ } catch {
1207
+ return []
1208
+ }
1209
+ }
1210
+
1211
+ /** Resolve the manifest package for a dev runtime (including the legacy slot). */
1212
+ export function getDevAppSourcePackage(packageName = DEV_APP_PACKAGE_NAME): string | null {
1213
+ migrateLegacyDevSlot()
1214
+ const rec = readDevAppRecord(packageName)
1215
+ return rec?.sourcePackageName ?? rec?.packageName ?? null
1216
+ }
1217
+
1218
+ export function getDevAppAttestation(packageName = DEV_APP_PACKAGE_NAME): string | null {
1219
+ migrateLegacyDevSlot()
1220
+ return readDevAppRecord(packageName)?.devAttestation ?? null
1221
+ }
1222
+
1223
+ export function getDevAppRecords(): DevAppRecord[] {
1224
+ migrateLegacyDevSlot()
1225
+ const out: DevAppRecord[] = []
1226
+ for (const pkg of getDevAppIndex()) {
1227
+ const res = storage.load<string>(`${pkg}_dev_meta`)
1228
+ if (!res.is_ok()) continue
1229
+ try {
1230
+ const record = JSON.parse(res.value) as DevAppRecord
1231
+ const normalized = normalizeDevAppRecord(record)
1232
+ if (normalized !== record) {
1233
+ storage.save(`${pkg}_dev_meta`, JSON.stringify(normalized))
1234
+ storage.save(`${pkg}_dev_url`, normalized.devUrl)
1235
+ }
1236
+ out.push(normalized)
1237
+ } catch {
1238
+ /* corrupt record — skip */
1239
+ }
1240
+ }
1241
+ return out
1242
+ }
1243
+
1244
+ const appRegistry = AppRegistry.getInstance()
1245
+ export default appRegistry