@mentra/engine 0.1.0-beta.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 (842) hide show
  1. package/README.md +79 -0
  2. package/build/devtools.d.ts +11 -0
  3. package/build/devtools.d.ts.map +1 -0
  4. package/build/devtools.js +13 -0
  5. package/build/devtools.js.map +1 -0
  6. package/build/engine.d.ts +261 -0
  7. package/build/engine.d.ts.map +1 -0
  8. package/build/engine.js +170 -0
  9. package/build/engine.js.map +1 -0
  10. package/build/facades/dev.d.ts +58 -0
  11. package/build/facades/dev.d.ts.map +1 -0
  12. package/build/facades/dev.js +189 -0
  13. package/build/facades/dev.js.map +1 -0
  14. package/build/facades/display.d.ts +21 -0
  15. package/build/facades/display.d.ts.map +1 -0
  16. package/build/facades/display.js +17 -0
  17. package/build/facades/display.js.map +1 -0
  18. package/build/facades/displayMirror.d.ts +15 -0
  19. package/build/facades/displayMirror.d.ts.map +1 -0
  20. package/build/facades/displayMirror.js +29 -0
  21. package/build/facades/displayMirror.js.map +1 -0
  22. package/build/facades/gallery.d.ts +62 -0
  23. package/build/facades/gallery.d.ts.map +1 -0
  24. package/build/facades/gallery.js +61 -0
  25. package/build/facades/gallery.js.map +1 -0
  26. package/build/facades/glasses.d.ts +141 -0
  27. package/build/facades/glasses.d.ts.map +1 -0
  28. package/build/facades/glasses.js +199 -0
  29. package/build/facades/glasses.js.map +1 -0
  30. package/build/facades/glassesSettings.d.ts +13 -0
  31. package/build/facades/glassesSettings.d.ts.map +1 -0
  32. package/build/facades/glassesSettings.js +54 -0
  33. package/build/facades/glassesSettings.js.map +1 -0
  34. package/build/facades/glassesWifi.d.ts +25 -0
  35. package/build/facades/glassesWifi.d.ts.map +1 -0
  36. package/build/facades/glassesWifi.js +57 -0
  37. package/build/facades/glassesWifi.js.map +1 -0
  38. package/build/facades/miniapps.d.ts +43 -0
  39. package/build/facades/miniapps.d.ts.map +1 -0
  40. package/build/facades/miniapps.js +49 -0
  41. package/build/facades/miniapps.js.map +1 -0
  42. package/build/facades/notifications.d.ts +13 -0
  43. package/build/facades/notifications.d.ts.map +1 -0
  44. package/build/facades/notifications.js +12 -0
  45. package/build/facades/notifications.js.map +1 -0
  46. package/build/facades/ota.d.ts +103 -0
  47. package/build/facades/ota.d.ts.map +1 -0
  48. package/build/facades/ota.js +156 -0
  49. package/build/facades/ota.js.map +1 -0
  50. package/build/facades/pairing.d.ts +114 -0
  51. package/build/facades/pairing.d.ts.map +1 -0
  52. package/build/facades/pairing.js +275 -0
  53. package/build/facades/pairing.js.map +1 -0
  54. package/build/facades/permissions.d.ts +33 -0
  55. package/build/facades/permissions.d.ts.map +1 -0
  56. package/build/facades/permissions.js +155 -0
  57. package/build/facades/permissions.js.map +1 -0
  58. package/build/facades/phoneNotifications.d.ts +21 -0
  59. package/build/facades/phoneNotifications.d.ts.map +1 -0
  60. package/build/facades/phoneNotifications.js +51 -0
  61. package/build/facades/phoneNotifications.js.map +1 -0
  62. package/build/facades/reports.d.ts +36 -0
  63. package/build/facades/reports.d.ts.map +1 -0
  64. package/build/facades/reports.js +134 -0
  65. package/build/facades/reports.js.map +1 -0
  66. package/build/facades/session.d.ts +21 -0
  67. package/build/facades/session.d.ts.map +1 -0
  68. package/build/facades/session.js +52 -0
  69. package/build/facades/session.js.map +1 -0
  70. package/build/facades/settings.d.ts +37 -0
  71. package/build/facades/settings.d.ts.map +1 -0
  72. package/build/facades/settings.js +55 -0
  73. package/build/facades/settings.js.map +1 -0
  74. package/build/facades/speech.d.ts +30 -0
  75. package/build/facades/speech.d.ts.map +1 -0
  76. package/build/facades/speech.js +37 -0
  77. package/build/facades/speech.js.map +1 -0
  78. package/build/index.d.ts +43 -0
  79. package/build/index.d.ts.map +1 -0
  80. package/build/index.js +45 -0
  81. package/build/index.js.map +1 -0
  82. package/build/internal.d.ts +67 -0
  83. package/build/internal.d.ts.map +1 -0
  84. package/build/internal.js +90 -0
  85. package/build/internal.js.map +1 -0
  86. package/build/runtime/bootstrap.d.ts +83 -0
  87. package/build/runtime/bootstrap.d.ts.map +1 -0
  88. package/build/runtime/bootstrap.js +56 -0
  89. package/build/runtime/bootstrap.js.map +1 -0
  90. package/build/runtime/config.d.ts +146 -0
  91. package/build/runtime/config.d.ts.map +1 -0
  92. package/build/runtime/config.js +18 -0
  93. package/build/runtime/config.js.map +1 -0
  94. package/build/runtime/streamConfig.d.ts +4 -0
  95. package/build/runtime/streamConfig.d.ts.map +1 -0
  96. package/build/runtime/streamConfig.js +38 -0
  97. package/build/runtime/streamConfig.js.map +1 -0
  98. package/build/services/AppRegistry.d.ts +269 -0
  99. package/build/services/AppRegistry.d.ts.map +1 -0
  100. package/build/services/AppRegistry.js +1079 -0
  101. package/build/services/AppRegistry.js.map +1 -0
  102. package/build/services/AudioCloudUplink.d.ts +9 -0
  103. package/build/services/AudioCloudUplink.d.ts.map +1 -0
  104. package/build/services/AudioCloudUplink.js +48 -0
  105. package/build/services/AudioCloudUplink.js.map +1 -0
  106. package/build/services/AudioPlaybackService.d.ts +175 -0
  107. package/build/services/AudioPlaybackService.d.ts.map +1 -0
  108. package/build/services/AudioPlaybackService.js +705 -0
  109. package/build/services/AudioPlaybackService.js.map +1 -0
  110. package/build/services/AutomaticReportResult.d.ts +20 -0
  111. package/build/services/AutomaticReportResult.d.ts.map +1 -0
  112. package/build/services/AutomaticReportResult.js +29 -0
  113. package/build/services/AutomaticReportResult.js.map +1 -0
  114. package/build/services/BlobStore.d.ts +91 -0
  115. package/build/services/BlobStore.d.ts.map +1 -0
  116. package/build/services/BlobStore.js +668 -0
  117. package/build/services/BlobStore.js.map +1 -0
  118. package/build/services/CaptionsTesterReportService.d.ts +4 -0
  119. package/build/services/CaptionsTesterReportService.d.ts.map +1 -0
  120. package/build/services/CaptionsTesterReportService.js +80 -0
  121. package/build/services/CaptionsTesterReportService.js.map +1 -0
  122. package/build/services/CloudAudioSubscriptionSync.d.ts +24 -0
  123. package/build/services/CloudAudioSubscriptionSync.d.ts.map +1 -0
  124. package/build/services/CloudAudioSubscriptionSync.js +39 -0
  125. package/build/services/CloudAudioSubscriptionSync.js.map +1 -0
  126. package/build/services/CloudClientService.d.ts +143 -0
  127. package/build/services/CloudClientService.d.ts.map +1 -0
  128. package/build/services/CloudClientService.js +644 -0
  129. package/build/services/CloudClientService.js.map +1 -0
  130. package/build/services/CloudTranscriptE2EMetrics.d.ts +4 -0
  131. package/build/services/CloudTranscriptE2EMetrics.d.ts.map +1 -0
  132. package/build/services/CloudTranscriptE2EMetrics.js +24 -0
  133. package/build/services/CloudTranscriptE2EMetrics.js.map +1 -0
  134. package/build/services/ConnectionCoordinator.d.ts +51 -0
  135. package/build/services/ConnectionCoordinator.d.ts.map +1 -0
  136. package/build/services/ConnectionCoordinator.js +34 -0
  137. package/build/services/ConnectionCoordinator.js.map +1 -0
  138. package/build/services/DevServerBridge.d.ts +63 -0
  139. package/build/services/DevServerBridge.d.ts.map +1 -0
  140. package/build/services/DevServerBridge.js +294 -0
  141. package/build/services/DevServerBridge.js.map +1 -0
  142. package/build/services/DeviceEventRouter.d.ts +3 -0
  143. package/build/services/DeviceEventRouter.d.ts.map +1 -0
  144. package/build/services/DeviceEventRouter.js +190 -0
  145. package/build/services/DeviceEventRouter.js.map +1 -0
  146. package/build/services/DeviceStoreHydration.d.ts +38 -0
  147. package/build/services/DeviceStoreHydration.d.ts.map +1 -0
  148. package/build/services/DeviceStoreHydration.js +124 -0
  149. package/build/services/DeviceStoreHydration.js.map +1 -0
  150. package/build/services/DisplayProcessor.d.ts +223 -0
  151. package/build/services/DisplayProcessor.d.ts.map +1 -0
  152. package/build/services/DisplayProcessor.js +552 -0
  153. package/build/services/DisplayProcessor.js.map +1 -0
  154. package/build/services/GlassesReadiness.d.ts +41 -0
  155. package/build/services/GlassesReadiness.d.ts.map +1 -0
  156. package/build/services/GlassesReadiness.js +82 -0
  157. package/build/services/GlassesReadiness.js.map +1 -0
  158. package/build/services/GlassesSettingsSync.d.ts +33 -0
  159. package/build/services/GlassesSettingsSync.d.ts.map +1 -0
  160. package/build/services/GlassesSettingsSync.js +121 -0
  161. package/build/services/GlassesSettingsSync.js.map +1 -0
  162. package/build/services/GlassesStatusProjection.d.ts +3 -0
  163. package/build/services/GlassesStatusProjection.d.ts.map +1 -0
  164. package/build/services/GlassesStatusProjection.js +65 -0
  165. package/build/services/GlassesStatusProjection.js.map +1 -0
  166. package/build/services/HeadingService.d.ts +27 -0
  167. package/build/services/HeadingService.d.ts.map +1 -0
  168. package/build/services/HeadingService.js +96 -0
  169. package/build/services/HeadingService.js.map +1 -0
  170. package/build/services/LocalDisplayManager.d.ts +139 -0
  171. package/build/services/LocalDisplayManager.d.ts.map +1 -0
  172. package/build/services/LocalDisplayManager.js +579 -0
  173. package/build/services/LocalDisplayManager.js.map +1 -0
  174. package/build/services/LocalMiniappRuntime.d.ts +439 -0
  175. package/build/services/LocalMiniappRuntime.d.ts.map +1 -0
  176. package/build/services/LocalMiniappRuntime.js +3695 -0
  177. package/build/services/LocalMiniappRuntime.js.map +1 -0
  178. package/build/services/LocalSttFallbackCoordinator.d.ts +57 -0
  179. package/build/services/LocalSttFallbackCoordinator.d.ts.map +1 -0
  180. package/build/services/LocalSttFallbackCoordinator.js +137 -0
  181. package/build/services/LocalSttFallbackCoordinator.js.map +1 -0
  182. package/build/services/MentraJSCrashController.d.ts +97 -0
  183. package/build/services/MentraJSCrashController.d.ts.map +1 -0
  184. package/build/services/MentraJSCrashController.js +138 -0
  185. package/build/services/MentraJSCrashController.js.map +1 -0
  186. package/build/services/MentraJSCrashloopReportService.d.ts +9 -0
  187. package/build/services/MentraJSCrashloopReportService.d.ts.map +1 -0
  188. package/build/services/MentraJSCrashloopReportService.js +54 -0
  189. package/build/services/MentraJSCrashloopReportService.js.map +1 -0
  190. package/build/services/MentraJSLogPipeline.d.ts +87 -0
  191. package/build/services/MentraJSLogPipeline.d.ts.map +1 -0
  192. package/build/services/MentraJSLogPipeline.js +137 -0
  193. package/build/services/MentraJSLogPipeline.js.map +1 -0
  194. package/build/services/MentraJSRouter.d.ts +203 -0
  195. package/build/services/MentraJSRouter.d.ts.map +1 -0
  196. package/build/services/MentraJSRouter.js +480 -0
  197. package/build/services/MentraJSRouter.js.map +1 -0
  198. package/build/services/MentraUIRouter.d.ts +137 -0
  199. package/build/services/MentraUIRouter.d.ts.map +1 -0
  200. package/build/services/MentraUIRouter.js +210 -0
  201. package/build/services/MentraUIRouter.js.map +1 -0
  202. package/build/services/MicStateCoordinator.d.ts +37 -0
  203. package/build/services/MicStateCoordinator.d.ts.map +1 -0
  204. package/build/services/MicStateCoordinator.js +81 -0
  205. package/build/services/MicStateCoordinator.js.map +1 -0
  206. package/build/services/MiniappEngine.d.ts +31 -0
  207. package/build/services/MiniappEngine.d.ts.map +1 -0
  208. package/build/services/MiniappEngine.js +119 -0
  209. package/build/services/MiniappEngine.js.map +1 -0
  210. package/build/services/MiniappLauncher.d.ts +129 -0
  211. package/build/services/MiniappLauncher.d.ts.map +1 -0
  212. package/build/services/MiniappLauncher.js +291 -0
  213. package/build/services/MiniappLauncher.js.map +1 -0
  214. package/build/services/MiniappRunningRegistry.d.ts +24 -0
  215. package/build/services/MiniappRunningRegistry.d.ts.map +1 -0
  216. package/build/services/MiniappRunningRegistry.js +52 -0
  217. package/build/services/MiniappRunningRegistry.js.map +1 -0
  218. package/build/services/NativeHttpResponse.d.ts +3 -0
  219. package/build/services/NativeHttpResponse.d.ts.map +1 -0
  220. package/build/services/NativeHttpResponse.js +6 -0
  221. package/build/services/NativeHttpResponse.js.map +1 -0
  222. package/build/services/NavigationHandlers.d.ts +90 -0
  223. package/build/services/NavigationHandlers.d.ts.map +1 -0
  224. package/build/services/NavigationHandlers.js +379 -0
  225. package/build/services/NavigationHandlers.js.map +1 -0
  226. package/build/services/NavigationService.d.ts +254 -0
  227. package/build/services/NavigationService.d.ts.map +1 -0
  228. package/build/services/NavigationService.js +553 -0
  229. package/build/services/NavigationService.js.map +1 -0
  230. package/build/services/NotificationsEmitter.d.ts +28 -0
  231. package/build/services/NotificationsEmitter.d.ts.map +1 -0
  232. package/build/services/NotificationsEmitter.js +22 -0
  233. package/build/services/NotificationsEmitter.js.map +1 -0
  234. package/build/services/OfflineSpeechModelService.d.ts +33 -0
  235. package/build/services/OfflineSpeechModelService.d.ts.map +1 -0
  236. package/build/services/OfflineSpeechModelService.js +136 -0
  237. package/build/services/OfflineSpeechModelService.js.map +1 -0
  238. package/build/services/OtaInstallCoordinator.d.ts +195 -0
  239. package/build/services/OtaInstallCoordinator.d.ts.map +1 -0
  240. package/build/services/OtaInstallCoordinator.js +1047 -0
  241. package/build/services/OtaInstallCoordinator.js.map +1 -0
  242. package/build/services/OtaService.d.ts +3 -0
  243. package/build/services/OtaService.d.ts.map +1 -0
  244. package/build/services/OtaService.js +65 -0
  245. package/build/services/OtaService.js.map +1 -0
  246. package/build/services/OtaUpdateCheckService.d.ts +65 -0
  247. package/build/services/OtaUpdateCheckService.d.ts.map +1 -0
  248. package/build/services/OtaUpdateCheckService.js +260 -0
  249. package/build/services/OtaUpdateCheckService.js.map +1 -0
  250. package/build/services/PairingIdentity.d.ts +80 -0
  251. package/build/services/PairingIdentity.d.ts.map +1 -0
  252. package/build/services/PairingIdentity.js +145 -0
  253. package/build/services/PairingIdentity.js.map +1 -0
  254. package/build/services/PhoneCalendarHelpers.d.ts +32 -0
  255. package/build/services/PhoneCalendarHelpers.d.ts.map +1 -0
  256. package/build/services/PhoneCalendarHelpers.js +157 -0
  257. package/build/services/PhoneCalendarHelpers.js.map +1 -0
  258. package/build/services/PhoneCalendarService.d.ts +5 -0
  259. package/build/services/PhoneCalendarService.d.ts.map +1 -0
  260. package/build/services/PhoneCalendarService.js +24 -0
  261. package/build/services/PhoneCalendarService.js.map +1 -0
  262. package/build/services/PhoneCameraFovCoordinator.d.ts +28 -0
  263. package/build/services/PhoneCameraFovCoordinator.d.ts.map +1 -0
  264. package/build/services/PhoneCameraFovCoordinator.js +180 -0
  265. package/build/services/PhoneCameraFovCoordinator.js.map +1 -0
  266. package/build/services/PhoneLocationService.d.ts +36 -0
  267. package/build/services/PhoneLocationService.d.ts.map +1 -0
  268. package/build/services/PhoneLocationService.js +115 -0
  269. package/build/services/PhoneLocationService.js.map +1 -0
  270. package/build/services/PhoneNotificationsSync.d.ts +3 -0
  271. package/build/services/PhoneNotificationsSync.d.ts.map +1 -0
  272. package/build/services/PhoneNotificationsSync.js +35 -0
  273. package/build/services/PhoneNotificationsSync.js.map +1 -0
  274. package/build/services/PhonePhotoCoordinator.d.ts +103 -0
  275. package/build/services/PhonePhotoCoordinator.d.ts.map +1 -0
  276. package/build/services/PhonePhotoCoordinator.js +326 -0
  277. package/build/services/PhonePhotoCoordinator.js.map +1 -0
  278. package/build/services/PhoneStreamCoordinator.d.ts +168 -0
  279. package/build/services/PhoneStreamCoordinator.d.ts.map +1 -0
  280. package/build/services/PhoneStreamCoordinator.js +632 -0
  281. package/build/services/PhoneStreamCoordinator.js.map +1 -0
  282. package/build/services/PhoneVideoCoordinator.d.ts +50 -0
  283. package/build/services/PhoneVideoCoordinator.d.ts.map +1 -0
  284. package/build/services/PhoneVideoCoordinator.js +147 -0
  285. package/build/services/PhoneVideoCoordinator.js.map +1 -0
  286. package/build/services/STTModelManager.d.ts +65 -0
  287. package/build/services/STTModelManager.d.ts.map +1 -0
  288. package/build/services/STTModelManager.js +292 -0
  289. package/build/services/STTModelManager.js.map +1 -0
  290. package/build/services/SceneRenderer.d.ts +90 -0
  291. package/build/services/SceneRenderer.d.ts.map +1 -0
  292. package/build/services/SceneRenderer.js +248 -0
  293. package/build/services/SceneRenderer.js.map +1 -0
  294. package/build/services/SentenceTtsPipeline.d.ts +31 -0
  295. package/build/services/SentenceTtsPipeline.d.ts.map +1 -0
  296. package/build/services/SentenceTtsPipeline.js +67 -0
  297. package/build/services/SentenceTtsPipeline.js.map +1 -0
  298. package/build/services/StreamLifecycleController.d.ts +67 -0
  299. package/build/services/StreamLifecycleController.d.ts.map +1 -0
  300. package/build/services/StreamLifecycleController.js +152 -0
  301. package/build/services/StreamLifecycleController.js.map +1 -0
  302. package/build/services/TTSModelManager.d.ts +90 -0
  303. package/build/services/TTSModelManager.d.ts.map +1 -0
  304. package/build/services/TTSModelManager.js +366 -0
  305. package/build/services/TTSModelManager.js.map +1 -0
  306. package/build/services/TranscriptionRouting.d.ts +12 -0
  307. package/build/services/TranscriptionRouting.d.ts.map +1 -0
  308. package/build/services/TranscriptionRouting.js +24 -0
  309. package/build/services/TranscriptionRouting.js.map +1 -0
  310. package/build/services/WebviewBridge.d.ts +22 -0
  311. package/build/services/WebviewBridge.d.ts.map +1 -0
  312. package/build/services/WebviewBridge.js +47 -0
  313. package/build/services/WebviewBridge.js.map +1 -0
  314. package/build/services/asg/GalleryMediaIntegrityReportService.d.ts +17 -0
  315. package/build/services/asg/GalleryMediaIntegrityReportService.d.ts.map +1 -0
  316. package/build/services/asg/GalleryMediaIntegrityReportService.js +43 -0
  317. package/build/services/asg/GalleryMediaIntegrityReportService.js.map +1 -0
  318. package/build/services/asg/asgCameraApi.d.ts +205 -0
  319. package/build/services/asg/asgCameraApi.d.ts.map +1 -0
  320. package/build/services/asg/asgCameraApi.js +1410 -0
  321. package/build/services/asg/asgCameraApi.js.map +1 -0
  322. package/build/services/asg/cameraRollExportCoordinator.d.ts +60 -0
  323. package/build/services/asg/cameraRollExportCoordinator.d.ts.map +1 -0
  324. package/build/services/asg/cameraRollExportCoordinator.js +618 -0
  325. package/build/services/asg/cameraRollExportCoordinator.js.map +1 -0
  326. package/build/services/asg/cameraRollExportLedger.d.ts +44 -0
  327. package/build/services/asg/cameraRollExportLedger.d.ts.map +1 -0
  328. package/build/services/asg/cameraRollExportLedger.js +78 -0
  329. package/build/services/asg/cameraRollExportLedger.js.map +1 -0
  330. package/build/services/asg/galleryMediaValidation.d.ts +29 -0
  331. package/build/services/asg/galleryMediaValidation.d.ts.map +1 -0
  332. package/build/services/asg/galleryMediaValidation.js +149 -0
  333. package/build/services/asg/galleryMediaValidation.js.map +1 -0
  334. package/build/services/asg/galleryNotices.d.ts +33 -0
  335. package/build/services/asg/galleryNotices.d.ts.map +1 -0
  336. package/build/services/asg/galleryNotices.js +29 -0
  337. package/build/services/asg/galleryNotices.js.map +1 -0
  338. package/build/services/asg/galleryPathMigration.d.ts +3 -0
  339. package/build/services/asg/galleryPathMigration.d.ts.map +1 -0
  340. package/build/services/asg/galleryPathMigration.js +26 -0
  341. package/build/services/asg/galleryPathMigration.js.map +1 -0
  342. package/build/services/asg/gallerySettingsService.d.ts +20 -0
  343. package/build/services/asg/gallerySettingsService.d.ts.map +1 -0
  344. package/build/services/asg/gallerySettingsService.js +53 -0
  345. package/build/services/asg/gallerySettingsService.js.map +1 -0
  346. package/build/services/asg/gallerySyncNotifications.d.ts +56 -0
  347. package/build/services/asg/gallerySyncNotifications.d.ts.map +1 -0
  348. package/build/services/asg/gallerySyncNotifications.js +198 -0
  349. package/build/services/asg/gallerySyncNotifications.js.map +1 -0
  350. package/build/services/asg/gallerySyncService.d.ts +137 -0
  351. package/build/services/asg/gallerySyncService.d.ts.map +1 -0
  352. package/build/services/asg/gallerySyncService.js +1933 -0
  353. package/build/services/asg/gallerySyncService.js.map +1 -0
  354. package/build/services/asg/galleryTransferLedger.d.ts +58 -0
  355. package/build/services/asg/galleryTransferLedger.d.ts.map +1 -0
  356. package/build/services/asg/galleryTransferLedger.js +225 -0
  357. package/build/services/asg/galleryTransferLedger.js.map +1 -0
  358. package/build/services/asg/localNetworkTransport.d.ts +15 -0
  359. package/build/services/asg/localNetworkTransport.d.ts.map +1 -0
  360. package/build/services/asg/localNetworkTransport.js +144 -0
  361. package/build/services/asg/localNetworkTransport.js.map +1 -0
  362. package/build/services/asg/localStorageService.d.ts +146 -0
  363. package/build/services/asg/localStorageService.d.ts.map +1 -0
  364. package/build/services/asg/localStorageService.js +572 -0
  365. package/build/services/asg/localStorageService.js.map +1 -0
  366. package/build/services/asg/mediaProcessingQueue.d.ts +70 -0
  367. package/build/services/asg/mediaProcessingQueue.d.ts.map +1 -0
  368. package/build/services/asg/mediaProcessingQueue.js +451 -0
  369. package/build/services/asg/mediaProcessingQueue.js.map +1 -0
  370. package/build/services/asgOtaVersionUrl.d.ts +2 -0
  371. package/build/services/asgOtaVersionUrl.d.ts.map +1 -0
  372. package/build/services/asgOtaVersionUrl.js +36 -0
  373. package/build/services/asgOtaVersionUrl.js.map +1 -0
  374. package/build/services/blobPaths.d.ts +31 -0
  375. package/build/services/blobPaths.d.ts.map +1 -0
  376. package/build/services/blobPaths.js +86 -0
  377. package/build/services/blobPaths.js.map +1 -0
  378. package/build/services/cloudStreamApi.d.ts +59 -0
  379. package/build/services/cloudStreamApi.d.ts.map +1 -0
  380. package/build/services/cloudStreamApi.js +81 -0
  381. package/build/services/cloudStreamApi.js.map +1 -0
  382. package/build/services/gallerySyncClock.d.ts +17 -0
  383. package/build/services/gallerySyncClock.d.ts.map +1 -0
  384. package/build/services/gallerySyncClock.js +21 -0
  385. package/build/services/gallerySyncClock.js.map +1 -0
  386. package/build/services/glassesClockSync.d.ts +20 -0
  387. package/build/services/glassesClockSync.d.ts.map +1 -0
  388. package/build/services/glassesClockSync.js +97 -0
  389. package/build/services/glassesClockSync.js.map +1 -0
  390. package/build/services/manifestVersionGate.d.ts +28 -0
  391. package/build/services/manifestVersionGate.d.ts.map +1 -0
  392. package/build/services/manifestVersionGate.js +41 -0
  393. package/build/services/manifestVersionGate.js.map +1 -0
  394. package/build/services/mentraUiShim.d.ts +38 -0
  395. package/build/services/mentraUiShim.d.ts.map +1 -0
  396. package/build/services/mentraUiShim.js +360 -0
  397. package/build/services/mentraUiShim.js.map +1 -0
  398. package/build/services/navigation/roadNameResolver.d.ts +67 -0
  399. package/build/services/navigation/roadNameResolver.d.ts.map +1 -0
  400. package/build/services/navigation/roadNameResolver.js +96 -0
  401. package/build/services/navigation/roadNameResolver.js.map +1 -0
  402. package/build/services/navigation/routesApiCodec.d.ts +38 -0
  403. package/build/services/navigation/routesApiCodec.d.ts.map +1 -0
  404. package/build/services/navigation/routesApiCodec.js +68 -0
  405. package/build/services/navigation/routesApiCodec.js.map +1 -0
  406. package/build/services/otaDisplayState.d.ts +42 -0
  407. package/build/services/otaDisplayState.d.ts.map +1 -0
  408. package/build/services/otaDisplayState.js +92 -0
  409. package/build/services/otaDisplayState.js.map +1 -0
  410. package/build/services/otaInstallPolicy.d.ts +81 -0
  411. package/build/services/otaInstallPolicy.d.ts.map +1 -0
  412. package/build/services/otaInstallPolicy.js +96 -0
  413. package/build/services/otaInstallPolicy.js.map +1 -0
  414. package/build/services/otaLegacyMapping.d.ts +22 -0
  415. package/build/services/otaLegacyMapping.d.ts.map +1 -0
  416. package/build/services/otaLegacyMapping.js +56 -0
  417. package/build/services/otaLegacyMapping.js.map +1 -0
  418. package/build/services/slimStreamStatus.d.ts +7 -0
  419. package/build/services/slimStreamStatus.d.ts.map +1 -0
  420. package/build/services/slimStreamStatus.js +26 -0
  421. package/build/services/slimStreamStatus.js.map +1 -0
  422. package/build/stores/apps.d.ts +104 -0
  423. package/build/stores/apps.d.ts.map +1 -0
  424. package/build/stores/apps.js +492 -0
  425. package/build/stores/apps.js.map +1 -0
  426. package/build/stores/bluetoothSettingKeys.d.ts +4 -0
  427. package/build/stores/bluetoothSettingKeys.d.ts.map +1 -0
  428. package/build/stores/bluetoothSettingKeys.js +31 -0
  429. package/build/stores/bluetoothSettingKeys.js.map +1 -0
  430. package/build/stores/cloudClientStatus.d.ts +9 -0
  431. package/build/stores/cloudClientStatus.d.ts.map +1 -0
  432. package/build/stores/cloudClientStatus.js +24 -0
  433. package/build/stores/cloudClientStatus.js.map +1 -0
  434. package/build/stores/connection.d.ts +22 -0
  435. package/build/stores/connection.d.ts.map +1 -0
  436. package/build/stores/connection.js +43 -0
  437. package/build/stores/connection.js.map +1 -0
  438. package/build/stores/core.d.ts +15 -0
  439. package/build/stores/core.d.ts.map +1 -0
  440. package/build/stores/core.js +21 -0
  441. package/build/stores/core.js.map +1 -0
  442. package/build/stores/display.d.ts +24 -0
  443. package/build/stores/display.d.ts.map +1 -0
  444. package/build/stores/display.js +96 -0
  445. package/build/stores/display.js.map +1 -0
  446. package/build/stores/gallerySync.d.ts +101 -0
  447. package/build/stores/gallerySync.d.ts.map +1 -0
  448. package/build/stores/gallerySync.js +217 -0
  449. package/build/stores/gallerySync.js.map +1 -0
  450. package/build/stores/glasses.d.ts +62 -0
  451. package/build/stores/glasses.d.ts.map +1 -0
  452. package/build/stores/glasses.js +203 -0
  453. package/build/stores/glasses.js.map +1 -0
  454. package/build/stores/settings.d.ts +37 -0
  455. package/build/stores/settings.d.ts.map +1 -0
  456. package/build/stores/settings.js +922 -0
  457. package/build/stores/settings.js.map +1 -0
  458. package/build/types/applet.d.ts +96 -0
  459. package/build/types/applet.d.ts.map +1 -0
  460. package/build/types/applet.js +5 -0
  461. package/build/types/applet.js.map +1 -0
  462. package/build/types/asg.d.ts +53 -0
  463. package/build/types/asg.d.ts.map +1 -0
  464. package/build/types/asg.js +2 -0
  465. package/build/types/asg.js.map +1 -0
  466. package/build/types/capabilities/even-realities-g1.d.ts +12 -0
  467. package/build/types/capabilities/even-realities-g1.d.ts.map +1 -0
  468. package/build/types/capabilities/even-realities-g1.js +55 -0
  469. package/build/types/capabilities/even-realities-g1.js.map +1 -0
  470. package/build/types/capabilities/even-realities-g2.d.ts +12 -0
  471. package/build/types/capabilities/even-realities-g2.d.ts.map +1 -0
  472. package/build/types/capabilities/even-realities-g2.js +75 -0
  473. package/build/types/capabilities/even-realities-g2.js.map +1 -0
  474. package/build/types/capabilities/mentra-display.d.ts +12 -0
  475. package/build/types/capabilities/mentra-display.d.ts.map +1 -0
  476. package/build/types/capabilities/mentra-display.js +63 -0
  477. package/build/types/capabilities/mentra-display.js.map +1 -0
  478. package/build/types/capabilities/mentra-live.d.ts +12 -0
  479. package/build/types/capabilities/mentra-live.d.ts.map +1 -0
  480. package/build/types/capabilities/mentra-live.js +92 -0
  481. package/build/types/capabilities/mentra-live.js.map +1 -0
  482. package/build/types/capabilities/none.d.ts +13 -0
  483. package/build/types/capabilities/none.d.ts.map +1 -0
  484. package/build/types/capabilities/none.js +65 -0
  485. package/build/types/capabilities/none.js.map +1 -0
  486. package/build/types/capabilities/simulated-glasses.d.ts +13 -0
  487. package/build/types/capabilities/simulated-glasses.d.ts.map +1 -0
  488. package/build/types/capabilities/simulated-glasses.js +65 -0
  489. package/build/types/capabilities/simulated-glasses.js.map +1 -0
  490. package/build/types/capabilities/vuzix-z100.d.ts +12 -0
  491. package/build/types/capabilities/vuzix-z100.d.ts.map +1 -0
  492. package/build/types/capabilities/vuzix-z100.js +52 -0
  493. package/build/types/capabilities/vuzix-z100.js.map +1 -0
  494. package/build/types/enums.d.ts +40 -0
  495. package/build/types/enums.d.ts.map +1 -0
  496. package/build/types/enums.js +44 -0
  497. package/build/types/enums.js.map +1 -0
  498. package/build/types/hardware.d.ts +160 -0
  499. package/build/types/hardware.d.ts.map +1 -0
  500. package/build/types/hardware.js +36 -0
  501. package/build/types/hardware.js.map +1 -0
  502. package/build/types/index.d.ts +11 -0
  503. package/build/types/index.d.ts.map +1 -0
  504. package/build/types/index.js +10 -0
  505. package/build/types/index.js.map +1 -0
  506. package/build/utils/GlobalEventEmitter.d.ts +10 -0
  507. package/build/utils/GlobalEventEmitter.d.ts.map +1 -0
  508. package/build/utils/GlobalEventEmitter.js +13 -0
  509. package/build/utils/GlobalEventEmitter.js.map +1 -0
  510. package/build/utils/cloudClient/RnUdpAdapter.d.ts +3 -0
  511. package/build/utils/cloudClient/RnUdpAdapter.d.ts.map +1 -0
  512. package/build/utils/cloudClient/RnUdpAdapter.js +41 -0
  513. package/build/utils/cloudClient/RnUdpAdapter.js.map +1 -0
  514. package/build/utils/cloudClient/cloudSecureStore.d.ts +3 -0
  515. package/build/utils/cloudClient/cloudSecureStore.d.ts.map +1 -0
  516. package/build/utils/cloudClient/cloudSecureStore.js +26 -0
  517. package/build/utils/cloudClient/cloudSecureStore.js.map +1 -0
  518. package/build/utils/debouncedPatch.d.ts +6 -0
  519. package/build/utils/debouncedPatch.d.ts.map +1 -0
  520. package/build/utils/debouncedPatch.js +25 -0
  521. package/build/utils/debouncedPatch.js.map +1 -0
  522. package/build/utils/devLogging.d.ts +26 -0
  523. package/build/utils/devLogging.d.ts.map +1 -0
  524. package/build/utils/devLogging.js +116 -0
  525. package/build/utils/devLogging.js.map +1 -0
  526. package/build/utils/devMiniappLaunch.d.ts +44 -0
  527. package/build/utils/devMiniappLaunch.d.ts.map +1 -0
  528. package/build/utils/devMiniappLaunch.js +52 -0
  529. package/build/utils/devMiniappLaunch.js.map +1 -0
  530. package/build/utils/diagnosticContext.d.ts +3 -0
  531. package/build/utils/diagnosticContext.d.ts.map +1 -0
  532. package/build/utils/diagnosticContext.js +119 -0
  533. package/build/utils/diagnosticContext.js.map +1 -0
  534. package/build/utils/display/composer/ColumnComposer.d.ts +131 -0
  535. package/build/utils/display/composer/ColumnComposer.d.ts.map +1 -0
  536. package/build/utils/display/composer/ColumnComposer.js +204 -0
  537. package/build/utils/display/composer/ColumnComposer.js.map +1 -0
  538. package/build/utils/display/composer/index.d.ts +9 -0
  539. package/build/utils/display/composer/index.d.ts.map +1 -0
  540. package/build/utils/display/composer/index.js +9 -0
  541. package/build/utils/display/composer/index.js.map +1 -0
  542. package/build/utils/display/helpers/DisplayHelpers.d.ts +165 -0
  543. package/build/utils/display/helpers/DisplayHelpers.d.ts.map +1 -0
  544. package/build/utils/display/helpers/DisplayHelpers.js +312 -0
  545. package/build/utils/display/helpers/DisplayHelpers.js.map +1 -0
  546. package/build/utils/display/helpers/ScrollView.d.ts +183 -0
  547. package/build/utils/display/helpers/ScrollView.d.ts.map +1 -0
  548. package/build/utils/display/helpers/ScrollView.js +257 -0
  549. package/build/utils/display/helpers/ScrollView.js.map +1 -0
  550. package/build/utils/display/helpers/index.d.ts +11 -0
  551. package/build/utils/display/helpers/index.d.ts.map +1 -0
  552. package/build/utils/display/helpers/index.js +10 -0
  553. package/build/utils/display/helpers/index.js.map +1 -0
  554. package/build/utils/display/index.d.ts +174 -0
  555. package/build/utils/display/index.d.ts.map +1 -0
  556. package/build/utils/display/index.js +185 -0
  557. package/build/utils/display/index.js.map +1 -0
  558. package/build/utils/display/measurer/TextMeasurer.d.ts +160 -0
  559. package/build/utils/display/measurer/TextMeasurer.d.ts.map +1 -0
  560. package/build/utils/display/measurer/TextMeasurer.js +273 -0
  561. package/build/utils/display/measurer/TextMeasurer.js.map +1 -0
  562. package/build/utils/display/measurer/index.d.ts +10 -0
  563. package/build/utils/display/measurer/index.d.ts.map +1 -0
  564. package/build/utils/display/measurer/index.js +11 -0
  565. package/build/utils/display/measurer/index.js.map +1 -0
  566. package/build/utils/display/measurer/script-detection.d.ts +53 -0
  567. package/build/utils/display/measurer/script-detection.d.ts.map +1 -0
  568. package/build/utils/display/measurer/script-detection.js +184 -0
  569. package/build/utils/display/measurer/script-detection.js.map +1 -0
  570. package/build/utils/display/profiles/g1.d.ts +33 -0
  571. package/build/utils/display/profiles/g1.d.ts.map +1 -0
  572. package/build/utils/display/profiles/g1.js +213 -0
  573. package/build/utils/display/profiles/g1.js.map +1 -0
  574. package/build/utils/display/profiles/g2.d.ts +13 -0
  575. package/build/utils/display/profiles/g2.d.ts.map +1 -0
  576. package/build/utils/display/profiles/g2.js +34 -0
  577. package/build/utils/display/profiles/g2.js.map +1 -0
  578. package/build/utils/display/profiles/index.d.ts +12 -0
  579. package/build/utils/display/profiles/index.d.ts.map +1 -0
  580. package/build/utils/display/profiles/index.js +15 -0
  581. package/build/utils/display/profiles/index.js.map +1 -0
  582. package/build/utils/display/profiles/nex.d.ts +10 -0
  583. package/build/utils/display/profiles/nex.d.ts.map +1 -0
  584. package/build/utils/display/profiles/nex.js +150 -0
  585. package/build/utils/display/profiles/nex.js.map +1 -0
  586. package/build/utils/display/profiles/types.d.ts +103 -0
  587. package/build/utils/display/profiles/types.d.ts.map +1 -0
  588. package/build/utils/display/profiles/types.js +2 -0
  589. package/build/utils/display/profiles/types.js.map +1 -0
  590. package/build/utils/display/profiles/z100.d.ts +33 -0
  591. package/build/utils/display/profiles/z100.d.ts.map +1 -0
  592. package/build/utils/display/profiles/z100.js +182 -0
  593. package/build/utils/display/profiles/z100.js.map +1 -0
  594. package/build/utils/display/scene/degrade.d.ts +25 -0
  595. package/build/utils/display/scene/degrade.d.ts.map +1 -0
  596. package/build/utils/display/scene/degrade.js +64 -0
  597. package/build/utils/display/scene/degrade.js.map +1 -0
  598. package/build/utils/display/scene/differ.d.ts +38 -0
  599. package/build/utils/display/scene/differ.d.ts.map +1 -0
  600. package/build/utils/display/scene/differ.js +107 -0
  601. package/build/utils/display/scene/differ.js.map +1 -0
  602. package/build/utils/display/scene/index.d.ts +10 -0
  603. package/build/utils/display/scene/index.d.ts.map +1 -0
  604. package/build/utils/display/scene/index.js +6 -0
  605. package/build/utils/display/scene/index.js.map +1 -0
  606. package/build/utils/display/scene/process.d.ts +35 -0
  607. package/build/utils/display/scene/process.d.ts.map +1 -0
  608. package/build/utils/display/scene/process.js +187 -0
  609. package/build/utils/display/scene/process.js.map +1 -0
  610. package/build/utils/display/scene/store.d.ts +48 -0
  611. package/build/utils/display/scene/store.d.ts.map +1 -0
  612. package/build/utils/display/scene/store.js +0 -0
  613. package/build/utils/display/scene/store.js.map +1 -0
  614. package/build/utils/display/scene/types.d.ts +120 -0
  615. package/build/utils/display/scene/types.d.ts.map +1 -0
  616. package/build/utils/display/scene/types.js +0 -0
  617. package/build/utils/display/scene/types.js.map +1 -0
  618. package/build/utils/display/wrapper/TextWrapper.d.ts +102 -0
  619. package/build/utils/display/wrapper/TextWrapper.d.ts.map +1 -0
  620. package/build/utils/display/wrapper/TextWrapper.js +471 -0
  621. package/build/utils/display/wrapper/TextWrapper.js.map +1 -0
  622. package/build/utils/display/wrapper/index.d.ts +12 -0
  623. package/build/utils/display/wrapper/index.d.ts.map +1 -0
  624. package/build/utils/display/wrapper/index.js +12 -0
  625. package/build/utils/display/wrapper/index.js.map +1 -0
  626. package/build/utils/display/wrapper/types.d.ts +75 -0
  627. package/build/utils/display/wrapper/types.d.ts.map +1 -0
  628. package/build/utils/display/wrapper/types.js +11 -0
  629. package/build/utils/display/wrapper/types.js.map +1 -0
  630. package/build/utils/e2eMetrics.d.ts +6 -0
  631. package/build/utils/e2eMetrics.d.ts.map +1 -0
  632. package/build/utils/e2eMetrics.js +27 -0
  633. package/build/utils/e2eMetrics.js.map +1 -0
  634. package/build/utils/hardware/hardware.d.ts +42 -0
  635. package/build/utils/hardware/hardware.d.ts.map +1 -0
  636. package/build/utils/hardware/hardware.js +127 -0
  637. package/build/utils/hardware/hardware.js.map +1 -0
  638. package/build/utils/hardware/index.d.ts +2 -0
  639. package/build/utils/hardware/index.d.ts.map +1 -0
  640. package/build/utils/hardware/index.js +2 -0
  641. package/build/utils/hardware/index.js.map +1 -0
  642. package/build/utils/miniappGlobals.d.ts +60 -0
  643. package/build/utils/miniappGlobals.d.ts.map +1 -0
  644. package/build/utils/miniappGlobals.js +224 -0
  645. package/build/utils/miniappGlobals.js.map +1 -0
  646. package/build/utils/permissions/MediaLibraryPermissions.d.ts +45 -0
  647. package/build/utils/permissions/MediaLibraryPermissions.d.ts.map +1 -0
  648. package/build/utils/permissions/MediaLibraryPermissions.js +145 -0
  649. package/build/utils/permissions/MediaLibraryPermissions.js.map +1 -0
  650. package/build/utils/permissions/galleryDisplayName.d.ts +8 -0
  651. package/build/utils/permissions/galleryDisplayName.d.ts.map +1 -0
  652. package/build/utils/permissions/galleryDisplayName.js +25 -0
  653. package/build/utils/permissions/galleryDisplayName.js.map +1 -0
  654. package/build/utils/storage/index.d.ts +3 -0
  655. package/build/utils/storage/index.d.ts.map +1 -0
  656. package/build/utils/storage/index.js +3 -0
  657. package/build/utils/storage/index.js.map +1 -0
  658. package/build/utils/storage/storage.d.ts +24 -0
  659. package/build/utils/storage/storage.d.ts.map +1 -0
  660. package/build/utils/storage/storage.js +85 -0
  661. package/build/utils/storage/storage.js.map +1 -0
  662. package/build/utils/storage/zip.d.ts +3 -0
  663. package/build/utils/storage/zip.d.ts.map +1 -0
  664. package/build/utils/storage/zip.js +14 -0
  665. package/build/utils/storage/zip.js.map +1 -0
  666. package/build/utils/timers/index.d.ts +3 -0
  667. package/build/utils/timers/index.d.ts.map +1 -0
  668. package/build/utils/timers/index.js +3 -0
  669. package/build/utils/timers/index.js.map +1 -0
  670. package/build/utils/timers/timers.d.ts +9 -0
  671. package/build/utils/timers/timers.d.ts.map +1 -0
  672. package/build/utils/timers/timers.js +105 -0
  673. package/build/utils/timers/timers.js.map +1 -0
  674. package/package.json +120 -0
  675. package/src/devtools.ts +13 -0
  676. package/src/engine.ts +173 -0
  677. package/src/facades/dev.ts +198 -0
  678. package/src/facades/display.ts +17 -0
  679. package/src/facades/displayMirror.ts +33 -0
  680. package/src/facades/gallery.ts +69 -0
  681. package/src/facades/glasses.ts +206 -0
  682. package/src/facades/glassesSettings.ts +56 -0
  683. package/src/facades/glassesWifi.ts +68 -0
  684. package/src/facades/miniapps.ts +55 -0
  685. package/src/facades/notifications.ts +15 -0
  686. package/src/facades/ota.ts +174 -0
  687. package/src/facades/pairing.ts +329 -0
  688. package/src/facades/permissions.ts +165 -0
  689. package/src/facades/phoneNotifications.ts +50 -0
  690. package/src/facades/reports.ts +185 -0
  691. package/src/facades/session.ts +55 -0
  692. package/src/facades/settings.ts +57 -0
  693. package/src/facades/speech.ts +38 -0
  694. package/src/index.ts +191 -0
  695. package/src/internal.ts +159 -0
  696. package/src/runtime/bootstrap.ts +118 -0
  697. package/src/runtime/config.ts +147 -0
  698. package/src/runtime/streamConfig.ts +34 -0
  699. package/src/services/AppRegistry.ts +1190 -0
  700. package/src/services/AudioCloudUplink.ts +50 -0
  701. package/src/services/AudioPlaybackService.ts +813 -0
  702. package/src/services/AutomaticReportResult.ts +48 -0
  703. package/src/services/BlobStore.ts +746 -0
  704. package/src/services/CaptionsTesterReportService.ts +107 -0
  705. package/src/services/CloudAudioSubscriptionSync.ts +41 -0
  706. package/src/services/CloudClientService.ts +689 -0
  707. package/src/services/CloudTranscriptE2EMetrics.ts +27 -0
  708. package/src/services/ConnectionCoordinator.ts +65 -0
  709. package/src/services/DevServerBridge.ts +332 -0
  710. package/src/services/DeviceEventRouter.ts +238 -0
  711. package/src/services/DeviceStoreHydration.ts +130 -0
  712. package/src/services/DisplayProcessor.ts +775 -0
  713. package/src/services/GlassesReadiness.ts +103 -0
  714. package/src/services/GlassesSettingsSync.ts +134 -0
  715. package/src/services/GlassesStatusProjection.ts +73 -0
  716. package/src/services/HeadingService.ts +98 -0
  717. package/src/services/LocalDisplayManager.ts +703 -0
  718. package/src/services/LocalMiniappRuntime.ts +4213 -0
  719. package/src/services/LocalSttFallbackCoordinator.ts +147 -0
  720. package/src/services/MentraJSCrashController.ts +189 -0
  721. package/src/services/MentraJSCrashloopReportService.ts +66 -0
  722. package/src/services/MentraJSLogPipeline.ts +166 -0
  723. package/src/services/MentraJSRouter.ts +557 -0
  724. package/src/services/MentraUIRouter.ts +244 -0
  725. package/src/services/MicStateCoordinator.ts +94 -0
  726. package/src/services/MiniappEngine.ts +143 -0
  727. package/src/services/MiniappLauncher.ts +340 -0
  728. package/src/services/MiniappRunningRegistry.ts +57 -0
  729. package/src/services/NativeHttpResponse.ts +6 -0
  730. package/src/services/NavigationHandlers.ts +423 -0
  731. package/src/services/NavigationService.ts +731 -0
  732. package/src/services/NotificationsEmitter.ts +48 -0
  733. package/src/services/OfflineSpeechModelService.ts +168 -0
  734. package/src/services/OtaInstallCoordinator.ts +1205 -0
  735. package/src/services/OtaService.ts +83 -0
  736. package/src/services/OtaUpdateCheckService.ts +386 -0
  737. package/src/services/PairingIdentity.ts +154 -0
  738. package/src/services/PhoneCalendarHelpers.ts +212 -0
  739. package/src/services/PhoneCalendarService.ts +42 -0
  740. package/src/services/PhoneCameraFovCoordinator.ts +195 -0
  741. package/src/services/PhoneLocationService.ts +122 -0
  742. package/src/services/PhoneNotificationsSync.ts +44 -0
  743. package/src/services/PhonePhotoCoordinator.ts +409 -0
  744. package/src/services/PhoneStreamCoordinator.ts +777 -0
  745. package/src/services/PhoneVideoCoordinator.ts +189 -0
  746. package/src/services/STTModelManager.ts +360 -0
  747. package/src/services/SceneRenderer.ts +292 -0
  748. package/src/services/SentenceTtsPipeline.ts +106 -0
  749. package/src/services/StreamLifecycleController.ts +213 -0
  750. package/src/services/TTSModelManager.ts +466 -0
  751. package/src/services/TranscriptionRouting.ts +37 -0
  752. package/src/services/WebviewBridge.ts +50 -0
  753. package/src/services/asg/GalleryMediaIntegrityReportService.ts +70 -0
  754. package/src/services/asg/asgCameraApi.ts +1695 -0
  755. package/src/services/asg/cameraRollExportCoordinator.ts +627 -0
  756. package/src/services/asg/cameraRollExportLedger.ts +122 -0
  757. package/src/services/asg/galleryMediaValidation.ts +183 -0
  758. package/src/services/asg/galleryNotices.ts +61 -0
  759. package/src/services/asg/galleryPathMigration.ts +22 -0
  760. package/src/services/asg/gallerySettingsService.ts +68 -0
  761. package/src/services/asg/gallerySyncNotifications.ts +236 -0
  762. package/src/services/asg/gallerySyncService.ts +2269 -0
  763. package/src/services/asg/galleryTransferLedger.ts +312 -0
  764. package/src/services/asg/localNetworkTransport.ts +173 -0
  765. package/src/services/asg/localStorageService.ts +652 -0
  766. package/src/services/asg/mediaProcessingQueue.ts +518 -0
  767. package/src/services/asgOtaVersionUrl.ts +41 -0
  768. package/src/services/blobPaths.ts +86 -0
  769. package/src/services/cloudStreamApi.ts +154 -0
  770. package/src/services/gallerySyncClock.ts +39 -0
  771. package/src/services/glassesClockSync.ts +115 -0
  772. package/src/services/manifestVersionGate.ts +43 -0
  773. package/src/services/mentraUiShim.ts +366 -0
  774. package/src/services/navigation/roadNameResolver.ts +112 -0
  775. package/src/services/navigation/routesApiCodec.ts +69 -0
  776. package/src/services/otaDisplayState.ts +115 -0
  777. package/src/services/otaInstallPolicy.ts +106 -0
  778. package/src/services/otaLegacyMapping.ts +71 -0
  779. package/src/services/slimStreamStatus.ts +28 -0
  780. package/src/stores/apps.ts +614 -0
  781. package/src/stores/bluetoothSettingKeys.ts +36 -0
  782. package/src/stores/cloudClientStatus.ts +37 -0
  783. package/src/stores/connection.ts +69 -0
  784. package/src/stores/core.ts +32 -0
  785. package/src/stores/display.ts +121 -0
  786. package/src/stores/gallerySync.ts +380 -0
  787. package/src/stores/glasses.ts +309 -0
  788. package/src/stores/settings.ts +1001 -0
  789. package/src/types/applet.ts +112 -0
  790. package/src/types/asg.ts +58 -0
  791. package/src/types/capabilities/even-realities-g1.ts +67 -0
  792. package/src/types/capabilities/even-realities-g2.ts +88 -0
  793. package/src/types/capabilities/mentra-display.ts +75 -0
  794. package/src/types/capabilities/mentra-live.ts +103 -0
  795. package/src/types/capabilities/none.ts +76 -0
  796. package/src/types/capabilities/simulated-glasses.ts +76 -0
  797. package/src/types/capabilities/vuzix-z100.ts +64 -0
  798. package/src/types/enums.ts +43 -0
  799. package/src/types/hardware.ts +203 -0
  800. package/src/types/index.ts +37 -0
  801. package/src/utils/GlobalEventEmitter.ts +14 -0
  802. package/src/utils/cloudClient/RnUdpAdapter.ts +47 -0
  803. package/src/utils/cloudClient/cloudSecureStore.ts +28 -0
  804. package/src/utils/debouncedPatch.ts +28 -0
  805. package/src/utils/devLogging.ts +140 -0
  806. package/src/utils/devMiniappLaunch.ts +68 -0
  807. package/src/utils/diagnosticContext.ts +155 -0
  808. package/src/utils/display/composer/ColumnComposer.ts +285 -0
  809. package/src/utils/display/composer/index.ts +15 -0
  810. package/src/utils/display/helpers/DisplayHelpers.ts +413 -0
  811. package/src/utils/display/helpers/ScrollView.ts +337 -0
  812. package/src/utils/display/helpers/index.ts +14 -0
  813. package/src/utils/display/index.ts +273 -0
  814. package/src/utils/display/measurer/TextMeasurer.ts +346 -0
  815. package/src/utils/display/measurer/index.ts +21 -0
  816. package/src/utils/display/measurer/script-detection.ts +218 -0
  817. package/src/utils/display/profiles/g1.ts +236 -0
  818. package/src/utils/display/profiles/g2.ts +39 -0
  819. package/src/utils/display/profiles/index.ts +28 -0
  820. package/src/utils/display/profiles/nex.ts +166 -0
  821. package/src/utils/display/profiles/types.ts +132 -0
  822. package/src/utils/display/profiles/z100.ts +198 -0
  823. package/src/utils/display/scene/degrade.ts +80 -0
  824. package/src/utils/display/scene/differ.ts +128 -0
  825. package/src/utils/display/scene/index.ts +21 -0
  826. package/src/utils/display/scene/process.ts +214 -0
  827. package/src/utils/display/scene/store.ts +0 -0
  828. package/src/utils/display/scene/types.ts +0 -0
  829. package/src/utils/display/wrapper/TextWrapper.ts +546 -0
  830. package/src/utils/display/wrapper/index.ts +15 -0
  831. package/src/utils/display/wrapper/types.ts +102 -0
  832. package/src/utils/e2eMetrics.ts +30 -0
  833. package/src/utils/hardware/hardware.ts +166 -0
  834. package/src/utils/hardware/index.ts +1 -0
  835. package/src/utils/miniappGlobals.ts +260 -0
  836. package/src/utils/permissions/MediaLibraryPermissions.ts +161 -0
  837. package/src/utils/permissions/galleryDisplayName.ts +28 -0
  838. package/src/utils/storage/index.ts +2 -0
  839. package/src/utils/storage/storage.ts +101 -0
  840. package/src/utils/storage/zip.ts +13 -0
  841. package/src/utils/timers/index.ts +2 -0
  842. package/src/utils/timers/timers.ts +139 -0
@@ -0,0 +1,1079 @@
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
+ import { Directory, Paths, File } from "expo-file-system";
20
+ import { unzip } from "react-native-zip-archive";
21
+ import semver from "semver";
22
+ import { result as Res } from "typesafe-ts";
23
+ import { HardwareRequirementLevel, HardwareType } from "../types";
24
+ import { getConfigValues } from "../runtime/bootstrap";
25
+ import { storage } from "../utils/storage/storage";
26
+ import { printDirectory } from "../utils/storage/zip";
27
+ import { checkManifestVersions } from "./manifestVersionGate";
28
+ import { miniappRunningRegistry } from "./MiniappRunningRegistry";
29
+ const ALLOWED_PERMISSION_TYPES = new Set([
30
+ "MICROPHONE",
31
+ "CAMERA",
32
+ "CALENDAR",
33
+ "LOCATION",
34
+ "BACKGROUND_LOCATION",
35
+ "READ_NOTIFICATIONS",
36
+ "POST_NOTIFICATIONS",
37
+ ]);
38
+ /**
39
+ * Normalize the `permissions` field from a miniapp.json manifest.
40
+ *
41
+ * New miniapps ship `[{type, required?, description?}]` objects. A few older
42
+ * installed bundles may have `["MICROPHONE", ...]` plain strings. Accept both.
43
+ */
44
+ export function normalizeManifestPermissions(raw) {
45
+ if (!Array.isArray(raw))
46
+ return [];
47
+ const out = [];
48
+ for (const p of raw) {
49
+ if (typeof p === "string") {
50
+ if (ALLOWED_PERMISSION_TYPES.has(p)) {
51
+ out.push({ type: p, required: true });
52
+ }
53
+ }
54
+ else if (p && typeof p === "object" && typeof p.type === "string") {
55
+ if (ALLOWED_PERMISSION_TYPES.has(p.type)) {
56
+ out.push({
57
+ type: p.type,
58
+ ...(typeof p.required === "boolean" ? { required: p.required } : {}),
59
+ ...(typeof p.description === "string" ? { description: p.description } : {}),
60
+ });
61
+ }
62
+ }
63
+ }
64
+ return out;
65
+ }
66
+ function normalizeManifestType(raw) {
67
+ return raw === "background" || raw === "system_dashboard" || raw === "standard" ? raw : "standard";
68
+ }
69
+ /**
70
+ * Normalize a manifest's `actions` into DeclaredAction[]. Defensive — keeps only
71
+ * well-formed `{id, description}` entries (installed/dev bundles may be
72
+ * malformed). Shared by installed (disk) and dev-sideload projection so both
73
+ * surface declared actions to session.miniapps.list + the invoke gate.
74
+ */
75
+ export function normalizeManifestActions(raw) {
76
+ if (!Array.isArray(raw))
77
+ return [];
78
+ const out = [];
79
+ for (const a of raw) {
80
+ if (a && typeof a.id === "string" && typeof a.description === "string") {
81
+ out.push({
82
+ id: a.id,
83
+ description: a.description,
84
+ ...(a.parameters && typeof a.parameters === "object"
85
+ ? { parameters: a.parameters }
86
+ : {}),
87
+ });
88
+ }
89
+ }
90
+ return out;
91
+ }
92
+ /**
93
+ * Convert declared hardwareRequirements from a miniapp.json manifest into
94
+ * runtime `HardwareRequirement[]`, always appending `{EXIST, REQUIRED}` so
95
+ * launchers show "Glasses Required" when no glasses are connected.
96
+ *
97
+ * Malformed entries are dropped with a single warning per package so the
98
+ * rest of the manifest still works.
99
+ */
100
+ export function buildHardwareRequirements(raw, packageName) {
101
+ const out = [];
102
+ const validTypes = new Set(Object.values(HardwareType));
103
+ const validLevels = new Set(Object.values(HardwareRequirementLevel));
104
+ if (!Array.isArray(raw)) {
105
+ if (raw !== undefined) {
106
+ console.warn(`APP_REGISTRY: ${packageName} has invalid hardwareRequirements (not an array); treating as []`);
107
+ }
108
+ }
109
+ else {
110
+ let warned = false;
111
+ for (const r of raw) {
112
+ if (!r ||
113
+ typeof r !== "object" ||
114
+ typeof r.type !== "string" ||
115
+ typeof r.level !== "string" ||
116
+ !validTypes.has(r.type) ||
117
+ !validLevels.has(r.level)) {
118
+ if (!warned) {
119
+ console.warn(`APP_REGISTRY: ${packageName} has malformed hardwareRequirements entry; skipping invalid entries`, r);
120
+ warned = true;
121
+ }
122
+ continue;
123
+ }
124
+ out.push({
125
+ type: r.type,
126
+ level: r.level,
127
+ ...(typeof r.description === "string" ? { description: r.description } : {}),
128
+ });
129
+ }
130
+ }
131
+ // Always require glasses to be connected for any local miniapp.
132
+ out.push({ type: HardwareType.EXIST, level: HardwareRequirementLevel.REQUIRED });
133
+ return out;
134
+ }
135
+ /**
136
+ * Download a miniapp zip from `url` into the cache and return its local path.
137
+ *
138
+ * `File.downloadFileAsync` is HTTP(S)-only, so this path is for remote bundles
139
+ * (dev server, store). Bundled-asset installs already have a local zip and
140
+ * should call {@link unpackMiniApp} directly.
141
+ */
142
+ async function downloadMiniAppZip(url) {
143
+ const downloadDir = new Directory(Paths.cache, "lma_downloads");
144
+ try {
145
+ if (!downloadDir.exists) {
146
+ downloadDir.create();
147
+ }
148
+ }
149
+ catch (error) {
150
+ console.error("ZIP: Error creating download directory", error);
151
+ throw "CREATE_DOWNLOAD_DIR_FAILED";
152
+ }
153
+ // Pre-delete any cached file with the same name. Both `mentra-miniapp dev`
154
+ // and `mentra-miniapp release` serve their zip at /bundle.zip, so URLs
155
+ // collide on the cache filename. Without this delete, a stale dev-snapshot
156
+ // (containing the project source tree) gets unzipped instead of the
157
+ // release build → white screen because index.html points at TSX files.
158
+ const targetFileName = url.split("/").pop() ?? "bundle.zip";
159
+ const existingFile = new File(downloadDir, targetFileName);
160
+ if (existingFile.exists) {
161
+ try {
162
+ existingFile.delete();
163
+ }
164
+ catch (e) {
165
+ console.warn("ZIP: failed to delete stale cached download:", e);
166
+ }
167
+ }
168
+ try {
169
+ const output = await File.downloadFileAsync(url, downloadDir);
170
+ return output.uri;
171
+ }
172
+ catch (error) {
173
+ console.error("ZIP: Error downloading zip file", error);
174
+ throw "DOWNLOAD_FAILED";
175
+ }
176
+ }
177
+ /**
178
+ * Unpack a local miniapp zip and install it under
179
+ * `lmas/<packageName>/<version>/`.
180
+ *
181
+ * Zip layout: flat — files at root, `miniapp.json` at the top level. We're
182
+ * strict on shape so we fail loudly on malformed bundles.
183
+ *
184
+ * @param zipPath file:// URI of the zip on local disk.
185
+ * @param versionOverride override the manifest's version field. Used by the
186
+ * dev miniapp caching path which stamps `dev-<ms>`
187
+ * so multiple snapshots can coexist alongside
188
+ * semver-installed versions.
189
+ */
190
+ async function unpackMiniApp(zipPath, versionOverride) {
191
+ const unzipDir = new Directory(Paths.cache, "lma_unzip");
192
+ try {
193
+ if (unzipDir.exists)
194
+ unzipDir.delete();
195
+ unzipDir.create();
196
+ }
197
+ catch (error) {
198
+ console.error("ZIP: Error creating or deleting the unzip directory", error);
199
+ throw "CREATE_CACHE_DIR_FAILED";
200
+ }
201
+ try {
202
+ console.log("ZIP: unzipping", zipPath);
203
+ await unzip(zipPath, unzipDir.uri);
204
+ }
205
+ catch (error) {
206
+ console.error("Error unzipping zip file", error);
207
+ throw "UNZIP_FAILED";
208
+ }
209
+ // Strict zip shape: miniapp.json at unzip root. No tolerance for an
210
+ // enclosing folder or app.json fallback — we own the dev-server emit
211
+ // format, so any deviation indicates a corrupt bundle.
212
+ const appDir = unzipDir;
213
+ let packageName;
214
+ let manifestVersion;
215
+ try {
216
+ const miniappJsonFile = new File(appDir, "miniapp.json");
217
+ if (!miniappJsonFile.exists)
218
+ throw new Error("miniapp.json missing at zip root");
219
+ const manifest = JSON.parse(miniappJsonFile.textSync());
220
+ if (!manifest.packageName)
221
+ throw new Error("miniapp.json missing packageName");
222
+ if (!manifest.version)
223
+ throw new Error("miniapp.json missing version");
224
+ packageName = manifest.packageName;
225
+ manifestVersion = manifest.version;
226
+ }
227
+ catch (error) {
228
+ console.error("Error reading miniapp.json from zip:", error);
229
+ throw "READ_MANIFEST_FAILED";
230
+ }
231
+ const version = versionOverride ?? manifestVersion;
232
+ console.log(`ZIP: installing ${packageName} as version ${version}`);
233
+ const basePackageDir = new Directory(Paths.document, "lmas", packageName);
234
+ try {
235
+ if (!basePackageDir.exists) {
236
+ basePackageDir.create({ intermediates: true });
237
+ }
238
+ }
239
+ catch (error) {
240
+ console.error("Error creating the base package directory", error);
241
+ throw "CREATE_PACKAGE_DIR_FAILED";
242
+ }
243
+ const versionDir = new Directory(basePackageDir, version);
244
+ try {
245
+ if (!versionDir.exists) {
246
+ versionDir.create();
247
+ }
248
+ else {
249
+ versionDir.delete();
250
+ versionDir.create();
251
+ }
252
+ }
253
+ catch (error) {
254
+ console.error("Error creating the version directory", error);
255
+ throw "CREATE_VERSION_DIR_FAILED";
256
+ }
257
+ try {
258
+ const contents = appDir.list();
259
+ for (const item of contents) {
260
+ item.move(versionDir);
261
+ }
262
+ }
263
+ catch (error) {
264
+ console.error("Error moving the contents of the folder to the destination directory", error);
265
+ throw "INSTALL_CONTENTS_FAILED";
266
+ }
267
+ console.log("ZIP: local mini app installed at", versionDir.uri);
268
+ printDirectory(versionDir, 2);
269
+ return { packageName, version };
270
+ }
271
+ /**
272
+ * Download a miniapp zip from `url`, unpack it, and install it under
273
+ * `lmas/<packageName>/<version>/`. Thin composition of
274
+ * {@link downloadMiniAppZip} + {@link unpackMiniApp} for remote bundles.
275
+ *
276
+ * @param versionOverride override the manifest's version field. Used by the
277
+ * dev miniapp caching path which stamps `dev-<ms>`
278
+ * so multiple snapshots can coexist alongside
279
+ * semver-installed versions.
280
+ */
281
+ async function downloadAndInstallMiniApp(url, versionOverride) {
282
+ const downloadedZipPath = await downloadMiniAppZip(url);
283
+ console.log("ZIP: done downloading, starting unzip");
284
+ return unpackMiniApp(downloadedZipPath, versionOverride);
285
+ }
286
+ class AppRegistry {
287
+ cachedApps = [];
288
+ // Offline apps live in a separate layer so they survive the disk-rebuild
289
+ // path in getInstalledMiniapps (which reassigns cachedApps).
290
+ offlineApps = [];
291
+ /** Package names whose start() requires the on-device STT model (host-declared). */
292
+ sttModelRequired = new Set();
293
+ refreshNeeded = true;
294
+ listeners = new Set();
295
+ static instance = null;
296
+ constructor() { }
297
+ static getInstance() {
298
+ if (!AppRegistry.instance) {
299
+ AppRegistry.instance = new AppRegistry();
300
+ }
301
+ return AppRegistry.instance;
302
+ }
303
+ /** Subscribe to install/uninstall events. Listener fires after refreshNeeded flips. */
304
+ subscribe(fn) {
305
+ this.listeners.add(fn);
306
+ return () => {
307
+ this.listeners.delete(fn);
308
+ };
309
+ }
310
+ notify() {
311
+ for (const fn of this.listeners) {
312
+ try {
313
+ fn();
314
+ }
315
+ catch (e) {
316
+ console.warn("AppRegistry: listener threw", e);
317
+ }
318
+ }
319
+ }
320
+ /**
321
+ * On-disk path for a given miniapp bundle version.
322
+ */
323
+ getBundleDir(packageName, version) {
324
+ const bundleDir = new Directory(Paths.document, "lmas", packageName, version);
325
+ return bundleDir.uri;
326
+ }
327
+ /**
328
+ * Resolve the two-layer entry paths for an installed miniapp version.
329
+ * Returns absolute file:// URIs for `background` and (when present) `ui`.
330
+ *
331
+ * Legacy single-layer bundles (no `entry` object in manifest) fall back
332
+ * to `index.html` discovery so the WebView host keeps working unchanged.
333
+ * Two-layer bundles ship `entry.background` and optional `entry.ui`
334
+ * paths relative to the bundle root.
335
+ *
336
+ * Returns null if neither shape resolves to existing files on disk.
337
+ */
338
+ getMiniappEntryPaths(packageName, version) {
339
+ const manifest = this.getMiniappManifest(packageName, version);
340
+ const bundleDir = this.getBundleDir(packageName, version);
341
+ const resolve = (rel) => {
342
+ const trimmed = rel.replace(/^\.?\/+/, "");
343
+ const file = new File(bundleDir, trimmed);
344
+ return file.exists ? file.uri : null;
345
+ };
346
+ if (manifest?.entry) {
347
+ console.log("manifest.entry", manifest.entry);
348
+ const bg = manifest.entry.background ? resolve(manifest.entry.background) : null;
349
+ console.log("bg", bg);
350
+ const ui = manifest.entry.ui ? resolve(manifest.entry.ui) : null;
351
+ console.log("ui", ui);
352
+ if (bg || ui) {
353
+ return { background: bg, ui: ui };
354
+ }
355
+ }
356
+ // Legacy single-bundle fallback — `index.html` at the bundle root.
357
+ const legacy = new File(new Directory(bundleDir.replace(/^file:\/\//, "")), "index.html");
358
+ return {
359
+ background: null,
360
+ ui: legacy.exists ? legacy.uri : null,
361
+ };
362
+ }
363
+ /**
364
+ * Verify a manifest declares an SDK / host version range compatible
365
+ * with the current host. Delegates to the pure
366
+ * {@link checkManifestVersions} helper — same shape, no React Native
367
+ * imports, unit-testable. Manifests missing either field pass
368
+ * through unchanged (legacy single-layer path).
369
+ */
370
+ checkManifestVersions(manifest, options) {
371
+ return checkManifestVersions(manifest, options);
372
+ }
373
+ /**
374
+ * Read and parse the miniapp manifest (miniapp.json with app.json fallback)
375
+ * from a given bundle directory.
376
+ */
377
+ getMiniappManifest(packageName, version) {
378
+ const bundleDir = new Directory(Paths.document, "lmas", packageName, version);
379
+ try {
380
+ const miniappJsonFile = new File(bundleDir, "miniapp.json");
381
+ if (miniappJsonFile.exists) {
382
+ return JSON.parse(miniappJsonFile.textSync());
383
+ }
384
+ }
385
+ catch (e) {
386
+ console.warn("AppRegistry: Error reading miniapp.json, trying app.json fallback", e);
387
+ }
388
+ try {
389
+ const appJsonFile = new File(bundleDir, "app.json");
390
+ if (appJsonFile.exists) {
391
+ return JSON.parse(appJsonFile.textSync());
392
+ }
393
+ }
394
+ catch (e) {
395
+ console.warn("AppRegistry: Error reading app.json fallback", e);
396
+ }
397
+ return null;
398
+ }
399
+ /**
400
+ * Download and install a miniapp bundle from a URL. The URL must serve a
401
+ * zip whose root contains `miniapp.json` plus the bundle entry files.
402
+ *
403
+ * @param opts.versionOverride if set, install under this version instead
404
+ * of `manifest.version`. The dev caching path uses `dev-<ms>` so multiple
405
+ * snapshots can coexist alongside semver-installed versions.
406
+ */
407
+ installFromUrl(url, opts) {
408
+ return Res.try_async(async () => {
409
+ const { packageName, version } = await downloadAndInstallMiniApp(url, opts?.versionOverride);
410
+ console.log("APP_REGISTRY: Downloaded and installed mini app");
411
+ this.finalizeInstall(packageName, version);
412
+ });
413
+ }
414
+ /**
415
+ * Install a miniapp from a zip already on local disk (e.g. a bundled asset
416
+ * copied into cache). Skips the HTTP download path that `installFromUrl`
417
+ * uses — `File.downloadFileAsync` is HTTP(S)-only and rejects file:// URIs.
418
+ *
419
+ * @param zipPath file:// URI of the local zip.
420
+ */
421
+ installFromLocalZip(zipPath, opts) {
422
+ return Res.try_async(async () => {
423
+ const { packageName, version } = await unpackMiniApp(zipPath, opts?.versionOverride);
424
+ console.log("APP_REGISTRY: Installed mini app from local zip");
425
+ this.finalizeInstall(packageName, version);
426
+ return { packageName, version };
427
+ });
428
+ }
429
+ /**
430
+ * Post-install bookkeeping shared by every install path: clear stale dev
431
+ * artifacts on release installs, point the active-version at the just-
432
+ * installed bundle, and notify subscribers to refresh.
433
+ */
434
+ finalizeInstall(packageName, version) {
435
+ // If this is a release install (semver, not dev-*) of a package that
436
+ // currently has dev-* snapshots, clear the dev state so the swap to
437
+ // "released" is clean. Otherwise the dev version would keep winning
438
+ // getActiveVersion's dev-precedence rule and the just-installed
439
+ // release wouldn't run.
440
+ const isDevInstall = version.startsWith("dev-");
441
+ if (!isDevInstall) {
442
+ this.clearDevArtifacts(packageName);
443
+ }
444
+ this.setActiveVersion(packageName, version);
445
+ this.refreshNeeded = true;
446
+ this.notify();
447
+ }
448
+ installFromJsonUrl(baseUrl) {
449
+ return Res.try_async(async () => {
450
+ const trimmed = baseUrl.replace(/\/$/, "");
451
+ const manifestRes = await fetch(`${trimmed}/miniapp.json`);
452
+ if (!manifestRes.ok) {
453
+ throw new Error(`Failed to fetch miniapp.json: ${manifestRes.status}`);
454
+ }
455
+ const manifest = (await manifestRes.json());
456
+ const packageName = manifest.packageName;
457
+ const version = manifest.version;
458
+ const name = manifest.name ?? packageName ?? "Mini app";
459
+ if (!packageName)
460
+ throw new Error("miniapp.json missing packageName");
461
+ if (!version)
462
+ throw new Error("miniapp.json missing version");
463
+ const installRes = await appRegistry.installFromUrl(`${trimmed}/bundle.zip`);
464
+ if (installRes.is_error())
465
+ throw installRes.error;
466
+ return { packageName, version, name };
467
+ });
468
+ }
469
+ /**
470
+ * Drop every dev-* version directory for a package plus ALL dev MMKV keys
471
+ * (URL/port/reachability + the home-tile metadata record). Called on a
472
+ * release install (dev → released transition) and on uninstall, so a dev
473
+ * package leaves nothing behind that `projectDevApps` could re-surface.
474
+ */
475
+ clearDevArtifacts(packageName) {
476
+ try {
477
+ const pkgDir = new Directory(Paths.document, "lmas", packageName);
478
+ if (pkgDir.exists) {
479
+ for (const item of pkgDir.list()) {
480
+ if (item instanceof Directory && item.name.startsWith("dev-")) {
481
+ try {
482
+ item.delete();
483
+ }
484
+ catch (e) {
485
+ console.warn(`APP_REGISTRY: failed to delete ${item.name}:`, e);
486
+ }
487
+ }
488
+ }
489
+ }
490
+ }
491
+ catch (e) {
492
+ console.warn(`APP_REGISTRY: clearDevArtifacts dir scan failed for ${packageName}:`, e);
493
+ }
494
+ storage.remove(`${packageName}_dev_url`);
495
+ storage.remove(`${packageName}_dev_port`);
496
+ storage.remove(`${packageName}_dev_last_reachable`);
497
+ // HTTP-direct dev miniapps are indexed by their real package name. A
498
+ // release install/uninstall of that same package should remove only its
499
+ // dev tile; unrelated dev miniapps must remain available.
500
+ if (readDevAppRecord(packageName))
501
+ unregisterDevApp(packageName);
502
+ }
503
+ /**
504
+ * Garbage-collect older `dev-*` version directories for this package,
505
+ * keeping the latest `keep` (by lexicographic sort, which matches
506
+ * timestamp ordering since dev-<ms> is zero-padded).
507
+ *
508
+ * Only touches `dev-*` versions; semver-installed versions are left alone.
509
+ */
510
+ gcDevVersions(packageName, keep) {
511
+ try {
512
+ const pkgDir = new Directory(Paths.document, "lmas", packageName);
513
+ if (!pkgDir.exists)
514
+ return;
515
+ const dirs = pkgDir
516
+ .list()
517
+ .filter((d) => d instanceof Directory && d.name.startsWith("dev-"))
518
+ .sort((a, b) => (a.name < b.name ? 1 : -1));
519
+ for (let i = keep; i < dirs.length; i++) {
520
+ try {
521
+ dirs[i].delete();
522
+ }
523
+ catch (e) {
524
+ console.warn(`APP_REGISTRY: failed to delete ${dirs[i].name}:`, e);
525
+ }
526
+ }
527
+ if (dirs.length > keep)
528
+ this.refreshNeeded = true;
529
+ }
530
+ catch (e) {
531
+ console.warn(`APP_REGISTRY: gcDevVersions error for ${packageName}:`, e);
532
+ }
533
+ }
534
+ uninstall(packageName, version) {
535
+ return Res.try_async(async () => {
536
+ if (version) {
537
+ const lmaDir = new Directory(Paths.document, "lmas", packageName, version);
538
+ // Guard exists: a dev miniapp loads over HTTP and has no on-disk dir,
539
+ // so an unconditional delete() would throw and abort the cleanup below.
540
+ if (lmaDir.exists)
541
+ lmaDir.delete();
542
+ console.log("APP_REGISTRY: Uninstalled mini app version", version);
543
+ const packageDir = new Directory(Paths.document, "lmas", packageName);
544
+ if (packageDir.exists && packageDir.list().length === 0) {
545
+ packageDir.delete();
546
+ }
547
+ }
548
+ else {
549
+ const packageDir = new Directory(Paths.document, "lmas", packageName);
550
+ if (packageDir.exists) {
551
+ packageDir.delete();
552
+ }
553
+ console.log("APP_REGISTRY: Uninstalled all versions of mini app", packageName);
554
+ }
555
+ // Always clear dev artifacts: for HTTP-direct dev miniapps the tile is
556
+ // backed by storage records (_dev_meta + dev_apps_index), not the disk
557
+ // dir, so without this the projected tile reappears on the next refresh.
558
+ this.clearDevArtifacts(packageName);
559
+ this.refreshNeeded = true;
560
+ this.notify();
561
+ });
562
+ }
563
+ getPackageNames() {
564
+ try {
565
+ const lmasDir = new Directory(Paths.document, "lmas");
566
+ if (!lmasDir.exists)
567
+ return [];
568
+ let lmas = lmasDir.list();
569
+ lmas = lmas.filter((lma) => lma instanceof Directory && lma.list().length > 0);
570
+ return lmas.map((lma) => lma.name);
571
+ }
572
+ catch (error) {
573
+ console.error("APP_REGISTRY: Error getting locally installed package names", error);
574
+ return [];
575
+ }
576
+ }
577
+ getInstalledVersions(packageName) {
578
+ try {
579
+ const lmaDir = new Directory(Paths.document, "lmas", packageName);
580
+ // Not installed yet is an expected state (e.g. preinstall sync probing
581
+ // versions before first install) — return [] without the error noise.
582
+ if (!lmaDir.exists) {
583
+ return [];
584
+ }
585
+ const lma = lmaDir.list();
586
+ return lma.map((lma) => lma.name);
587
+ }
588
+ catch (error) {
589
+ console.error("APP_REGISTRY: Error getting local applet versions", error);
590
+ return [];
591
+ }
592
+ }
593
+ async getActiveVersion(packageName) {
594
+ let versions = this.getInstalledVersions(packageName);
595
+ // Treat MMKV as a hint, not authority. A stored version may have been
596
+ // GC'd off disk without this pointer being updated.
597
+ let res = storage.load(`${packageName}_active_version`);
598
+ if (res.is_ok() && versions.includes(res.value)) {
599
+ return res.value;
600
+ }
601
+ // Dev versions take precedence over semver-installed versions.
602
+ const devVersions = versions
603
+ .filter((v) => v.startsWith("dev-"))
604
+ .sort()
605
+ .reverse();
606
+ if (devVersions.length > 0) {
607
+ this.setActiveVersion(packageName, devVersions[0]);
608
+ return devVersions[0];
609
+ }
610
+ versions = versions.filter((v) => semver.valid(v));
611
+ versions.sort((a, b) => semver.rcompare(a, b));
612
+ this.setActiveVersion(packageName, versions[0]);
613
+ return versions[0];
614
+ }
615
+ setActiveVersion(packageName, version) {
616
+ return storage.save(`${packageName}_active_version`, version);
617
+ }
618
+ getMetadata(packageName, version) {
619
+ try {
620
+ const lmaDir = new Directory(Paths.document, "lmas", packageName, version);
621
+ const miniappJsonFile = new File(lmaDir, "miniapp.json");
622
+ const manifest = JSON.parse(miniappJsonFile.textSync());
623
+ const logoUrl = new File(lmaDir, "icon.png").uri;
624
+ return { name: manifest.name, logoUrl: logoUrl };
625
+ }
626
+ catch (error) {
627
+ console.error("APP_REGISTRY: Error getting local miniapp metadata", error);
628
+ return { name: "error", logoUrl: "" };
629
+ }
630
+ }
631
+ getInstalledInfo() {
632
+ const packageNames = this.getPackageNames();
633
+ const out = [];
634
+ for (const packageName of packageNames) {
635
+ const versionStrings = this.getInstalledVersions(packageName);
636
+ const installedVersion = { packageName, versions: {} };
637
+ for (const versionString of versionStrings) {
638
+ installedVersion.versions[versionString] = this.getMetadata(packageName, versionString);
639
+ }
640
+ out.push(installedVersion);
641
+ }
642
+ return out;
643
+ }
644
+ /**
645
+ * Merge disk-derived apps with the projected dev + offline layers,
646
+ * de-duping by packageName. An active dev registration wins over an older
647
+ * disk install of the same package; installing a release clears that dev
648
+ * registration in finalizeInstall. Native offline apps keep top priority.
649
+ */
650
+ mergeProjectedApps(diskApps) {
651
+ const offline = this.projectOfflineApps();
652
+ const offlinePackages = new Set(offline.map((app) => app.packageName));
653
+ const dev = this.projectDevApps().filter((app) => !offlinePackages.has(app.packageName));
654
+ const devPackages = new Set(dev.map((app) => app.packageName));
655
+ const installed = diskApps.filter((app) => !offlinePackages.has(app.packageName) && !devPackages.has(app.packageName));
656
+ return [...installed, ...dev, ...offline];
657
+ }
658
+ async getInstalledMiniapps() {
659
+ if (!this.refreshNeeded && this.cachedApps.length > 0) {
660
+ // Cache hit: re-project running from the registry. The cached array
661
+ // IS the disk-derived truth; running comes from the mount registry.
662
+ return this.mergeProjectedApps(this.cachedApps.map((a) => ({
663
+ ...a,
664
+ running: miniappRunningRegistry.has(a.packageName),
665
+ })));
666
+ }
667
+ try {
668
+ const installedInfo = this.getInstalledInfo();
669
+ const out = [];
670
+ for (const lmaInfo of installedInfo) {
671
+ const versionString = await this.getActiveVersion(lmaInfo.packageName);
672
+ const versionInfo = lmaInfo.versions[versionString];
673
+ const manifest = this.getMiniappManifest(lmaInfo.packageName, versionString);
674
+ const permissions = normalizeManifestPermissions(manifest?.permissions);
675
+ const hardwareRequirements = buildHardwareRequirements(manifest?.hardwareRequirements, lmaInfo.packageName);
676
+ const appType = normalizeManifestType(manifest?.type);
677
+ // Declared actions (for session.miniapps.list + invoke gating).
678
+ const actions = normalizeManifestActions(manifest?.actions);
679
+ // Dev miniapps live in the same lmas/ tree as installed ones, but
680
+ // their version directory name starts with "dev-".
681
+ const isMiniappDev = versionString.startsWith("dev-");
682
+ let devUrl;
683
+ if (isMiniappDev) {
684
+ const devUrlRes = storage.load(`${lmaInfo.packageName}_dev_url`);
685
+ if (devUrlRes.is_ok())
686
+ devUrl = devUrlRes.value;
687
+ }
688
+ out.push({
689
+ packageName: lmaInfo.packageName,
690
+ version: versionString,
691
+ running: miniappRunningRegistry.has(lmaInfo.packageName),
692
+ local: true,
693
+ healthy: true,
694
+ loading: false,
695
+ offline: false,
696
+ hidden: false,
697
+ offlineRoute: "",
698
+ name: versionInfo.name,
699
+ webviewUrl: "",
700
+ logoUrl: versionInfo.logoUrl,
701
+ type: appType,
702
+ permissions,
703
+ hardwareRequirements,
704
+ // Always project actions (even []) so the invoke gate can enforce
705
+ // declared-action membership unconditionally — an app with no declared
706
+ // actions must reject every invoke, not bypass the check.
707
+ actions,
708
+ ...(isMiniappDev ? { isMiniappDev: true } : {}),
709
+ ...(devUrl ? { devUrl } : {}),
710
+ onStart: () => saveLocalAppRunningState(lmaInfo.packageName, true),
711
+ onStop: () => saveLocalAppRunningState(lmaInfo.packageName, false),
712
+ });
713
+ }
714
+ this.cachedApps = out;
715
+ this.refreshNeeded = false;
716
+ return this.mergeProjectedApps(this.cachedApps);
717
+ }
718
+ catch (error) {
719
+ console.error("APP_REGISTRY: Error getting local applets", error);
720
+ return this.mergeProjectedApps(this.cachedApps.map((a) => ({
721
+ ...a,
722
+ running: miniappRunningRegistry.has(a.packageName),
723
+ })));
724
+ }
725
+ }
726
+ /** Force the next getInstalledMiniapps() to re-derive from disk + records. */
727
+ markRefreshNeeded() {
728
+ this.refreshNeeded = true;
729
+ this.notify();
730
+ }
731
+ /**
732
+ * Project persisted dev-app metadata records into ClientApp tiles. Dev
733
+ * miniapps aren't installed to disk (they load over HTTP), so they don't
734
+ * appear in the `lmas/` scan — this surfaces them on the home screen so
735
+ * they're re-launchable without re-scanning the QR.
736
+ */
737
+ projectDevApps() {
738
+ return getDevAppRecords().map((rec) => {
739
+ const permissions = normalizeManifestPermissions(rec.permissions);
740
+ const hardwareRequirements = buildHardwareRequirements(rec.hardwareRequirements, rec.packageName);
741
+ return {
742
+ packageName: rec.packageName,
743
+ version: undefined,
744
+ running: miniappRunningRegistry.has(rec.packageName),
745
+ local: true,
746
+ healthy: true,
747
+ loading: false,
748
+ offline: false,
749
+ hidden: false,
750
+ offlineRoute: "",
751
+ name: rec.name,
752
+ webviewUrl: "",
753
+ logoUrl: rec.iconUrl,
754
+ type: normalizeManifestType(rec.type),
755
+ permissions,
756
+ hardwareRequirements,
757
+ actions: normalizeManifestActions(rec.actions),
758
+ isMiniappDev: true,
759
+ devUrl: rec.devUrl,
760
+ devPort: rec.devPort,
761
+ onStart: () => saveLocalAppRunningState(rec.packageName, true),
762
+ onStop: () => saveLocalAppRunningState(rec.packageName, false),
763
+ };
764
+ });
765
+ }
766
+ projectOfflineApps() {
767
+ // Offline apps don't go through miniappRunningRegistry (that's for
768
+ // MiniappHost-mounted webviews). Their running flag is persisted to
769
+ // MMKV by saveLocalAppRunningState — read it back here so refreshes
770
+ // don't blow away the active flag.
771
+ return this.offlineApps.map((a) => {
772
+ const running = getLocalAppRunningState(a.packageName);
773
+ const screenshot = getLocalAppScreenshot(a.packageName);
774
+ return { ...a, running, screenshot };
775
+ });
776
+ }
777
+ // Register an offline (locally-routed) app. Survives disk rebuilds.
778
+ installOfflineApp(app, opts) {
779
+ if (opts?.requiresLocalSttModel) {
780
+ this.sttModelRequired.add(app.packageName);
781
+ }
782
+ this.offlineApps.push({
783
+ ...app,
784
+ onStart: () => saveLocalAppRunningState(app.packageName, true),
785
+ onStop: () => saveLocalAppRunningState(app.packageName, false),
786
+ });
787
+ this.refreshNeeded = true;
788
+ this.notify();
789
+ }
790
+ /**
791
+ * Registered as needing the on-device STT model before it can start (the
792
+ * host declares this per offline app; the apps store gates start() on it).
793
+ */
794
+ requiresLocalSttModel(packageName) {
795
+ return this.sttModelRequired.has(packageName);
796
+ }
797
+ getMiniappHtml(packageName, version) {
798
+ return Res.try(() => {
799
+ const lmaDir = new Directory(Paths.document, "lmas", packageName, version);
800
+ const htmlFile = new File(lmaDir, "index.html");
801
+ return htmlFile.textSync();
802
+ });
803
+ }
804
+ }
805
+ /**
806
+ * Persist the running flag for a local miniapp (read on next cold boot so
807
+ * autostart picks the right set of apps). Exported for hosts that want to
808
+ * track running state independently.
809
+ */
810
+ export function saveLocalAppRunningState(packageName, status) {
811
+ storage.save(`${packageName}_running`, status);
812
+ }
813
+ export function getLocalAppRunningState(packageName) {
814
+ const res = storage.load(`${packageName}_running`);
815
+ if (res.is_ok())
816
+ return res.value;
817
+ return false;
818
+ }
819
+ export function getLocalAppScreenshot(packageName) {
820
+ const key = `${packageName}_screenshot`;
821
+ const res = storage.load(key);
822
+ if (res.is_error())
823
+ return undefined;
824
+ const uri = res.value;
825
+ if (uri.startsWith("file://")) {
826
+ try {
827
+ if (!new File(uri).exists) {
828
+ storage.remove(key);
829
+ return undefined;
830
+ }
831
+ }
832
+ catch {
833
+ storage.remove(key);
834
+ return undefined;
835
+ }
836
+ }
837
+ return uri;
838
+ }
839
+ const DEV_APPS_INDEX_KEY = "dev_apps_index";
840
+ const DEV_APP_ICONS_DIR = "dev-miniapp-icons";
841
+ function configuredDevHost() {
842
+ // Explicit escape hatch first; otherwise the host-injected Metro host (the
843
+ // address this dev bundle was served from — always current for the network
844
+ // the phone is on). Deliberately NOT the EXPO_PUBLIC_CLOUD_* URLs: those are
845
+ // cloud endpoints, a different machine entirely from the laptop running the
846
+ // miniapp dev server, and rewriting a dev URL to a cloud host would break it.
847
+ const explicit = process.env.EXPO_PUBLIC_LOCAL_MINIAPP_HOST;
848
+ if (explicit) {
849
+ try {
850
+ return new URL(explicit).hostname;
851
+ }
852
+ catch {
853
+ if (/^[\w.-]+$/.test(explicit))
854
+ return explicit;
855
+ }
856
+ }
857
+ return getConfigValues().devServerHost?.();
858
+ }
859
+ function isPrivateLanHost(hostname) {
860
+ return (hostname === "localhost" ||
861
+ hostname.startsWith("192.168.") ||
862
+ hostname.startsWith("10.") ||
863
+ /^172\.(1[6-9]|2\d|3[0-1])\./.test(hostname));
864
+ }
865
+ function rewriteStaleDevUrl(value) {
866
+ if (!__DEV__)
867
+ return value;
868
+ const host = configuredDevHost();
869
+ if (!host)
870
+ return value;
871
+ try {
872
+ const url = new URL(value);
873
+ if (url.hostname === host || !isPrivateLanHost(url.hostname))
874
+ return value;
875
+ url.hostname = host;
876
+ return url.toString().replace(/\/$/, "");
877
+ }
878
+ catch {
879
+ return value;
880
+ }
881
+ }
882
+ function normalizeDevAppRecord(record) {
883
+ const devUrl = rewriteStaleDevUrl(record.devUrl);
884
+ const iconUrl = rewriteStaleDevUrl(record.iconUrl);
885
+ return devUrl === record.devUrl && iconUrl === record.iconUrl ? record : { ...record, devUrl, iconUrl };
886
+ }
887
+ /** Legacy package used by builds that supported only one dev miniapp. */
888
+ export const DEV_APP_PACKAGE_NAME = "com.dev";
889
+ export const DEV_APP_NAME = "Dev";
890
+ /**
891
+ * Copy a dev-server icon into Documents so the tile remains branded after the
892
+ * laptop/server disappears. A failed download is non-fatal: the remote URL is
893
+ * retained and can still render while the server is reachable.
894
+ */
895
+ async function cacheDevAppIcon(packageName, iconUrl) {
896
+ if (!/^https?:\/\//.test(iconUrl))
897
+ return iconUrl;
898
+ try {
899
+ const dir = new Directory(Paths.document, DEV_APP_ICONS_DIR);
900
+ if (!dir.exists)
901
+ dir.create({ intermediates: true });
902
+ const safePackageName = packageName.replace(/[^a-zA-Z0-9._-]/g, "_");
903
+ let extension = ".png";
904
+ try {
905
+ const match = new URL(iconUrl).pathname.match(/\.(png|jpe?g|webp|gif|svg)$/i);
906
+ if (match)
907
+ extension = `.${match[1].toLowerCase()}`;
908
+ }
909
+ catch {
910
+ // Keep the decoder-friendly .png fallback; image loaders sniff content.
911
+ }
912
+ const target = new File(dir, `${safePackageName}${extension}`);
913
+ const downloaded = await File.downloadFileAsync(iconUrl, target, { idempotent: true });
914
+ // Only remove older extensions AFTER the replacement is safely on disk;
915
+ // a broken icon URL must not destroy the last known-good cached logo.
916
+ for (const item of dir.list()) {
917
+ if (item instanceof File && item.uri !== downloaded.uri && item.name.startsWith(`${safePackageName}.`)) {
918
+ try {
919
+ item.delete();
920
+ }
921
+ catch {
922
+ // Best effort; the current icon has already been persisted.
923
+ }
924
+ }
925
+ }
926
+ return downloaded.uri;
927
+ }
928
+ catch (error) {
929
+ console.warn(`APP_REGISTRY: failed to cache dev icon for ${packageName}:`, error);
930
+ return readDevAppRecord(packageName)?.iconUrl ?? iconUrl;
931
+ }
932
+ }
933
+ function removeDevRecordKeys(packageName) {
934
+ const existing = readDevAppRecord(packageName);
935
+ if (existing?.iconUrl.startsWith("file://")) {
936
+ try {
937
+ const icon = new File(existing.iconUrl);
938
+ if (icon.exists)
939
+ icon.delete();
940
+ }
941
+ catch (error) {
942
+ console.warn(`APP_REGISTRY: failed to delete dev icon for ${packageName}:`, error);
943
+ }
944
+ }
945
+ storage.remove(`${packageName}_dev_meta`);
946
+ storage.remove(`${packageName}_dev_url`);
947
+ storage.remove(`${packageName}_dev_port`);
948
+ storage.remove(`${packageName}_dev_last_reachable`);
949
+ }
950
+ function readDevAppRecord(packageName) {
951
+ const res = storage.load(`${packageName}_dev_meta`);
952
+ if (!res.is_ok())
953
+ return null;
954
+ try {
955
+ return JSON.parse(res.value);
956
+ }
957
+ catch {
958
+ return null;
959
+ }
960
+ }
961
+ /** Move the historical `com.dev` record onto its real manifest package key. */
962
+ function migrateLegacyDevSlot() {
963
+ const legacy = readDevAppRecord(DEV_APP_PACKAGE_NAME);
964
+ const targetPackage = legacy?.sourcePackageName?.trim();
965
+ if (!legacy || !targetPackage || targetPackage === DEV_APP_PACKAGE_NAME)
966
+ return;
967
+ const existingTarget = readDevAppRecord(targetPackage);
968
+ const migrated = existingTarget ?? {
969
+ ...legacy,
970
+ packageName: targetPackage,
971
+ sourcePackageName: targetPackage,
972
+ };
973
+ if (!existingTarget)
974
+ storage.save(`${targetPackage}_dev_meta`, JSON.stringify(migrated));
975
+ const legacyUrl = storage.load(`${DEV_APP_PACKAGE_NAME}_dev_url`);
976
+ const targetUrl = storage.load(`${targetPackage}_dev_url`);
977
+ if (!targetUrl.is_ok()) {
978
+ storage.save(`${targetPackage}_dev_url`, legacyUrl.is_ok() ? legacyUrl.value : migrated.devUrl);
979
+ }
980
+ const legacyPort = storage.load(`${DEV_APP_PACKAGE_NAME}_dev_port`);
981
+ const targetPort = storage.load(`${targetPackage}_dev_port`);
982
+ if (!targetPort.is_ok()) {
983
+ const port = migrated.devPort ?? (legacyPort.is_ok() ? legacyPort.value : undefined);
984
+ if (typeof port === "number" && Number.isFinite(port))
985
+ storage.save(`${targetPackage}_dev_port`, port);
986
+ }
987
+ storage.remove(`${DEV_APP_PACKAGE_NAME}_dev_meta`);
988
+ storage.remove(`${DEV_APP_PACKAGE_NAME}_dev_url`);
989
+ storage.remove(`${DEV_APP_PACKAGE_NAME}_dev_port`);
990
+ storage.remove(`${DEV_APP_PACKAGE_NAME}_dev_last_reachable`);
991
+ const index = Array.from(new Set(getDevAppIndex().map((pkg) => (pkg === DEV_APP_PACKAGE_NAME ? targetPackage : pkg))));
992
+ storage.save(DEV_APPS_INDEX_KEY, JSON.stringify(index));
993
+ }
994
+ /**
995
+ * Register or update one dev miniapp under its real manifest package. Different
996
+ * package names coexist; rescanning the same package updates that package only.
997
+ */
998
+ export async function registerDevApp(record) {
999
+ migrateLegacyDevSlot();
1000
+ const packageName = record.packageName.trim();
1001
+ if (!packageName)
1002
+ throw new Error("Dev miniapp manifest is missing packageName");
1003
+ const iconUrl = await cacheDevAppIcon(packageName, record.iconUrl);
1004
+ const devRecord = {
1005
+ ...record,
1006
+ packageName,
1007
+ sourcePackageName: packageName,
1008
+ name: record.name || DEV_APP_NAME,
1009
+ iconUrl,
1010
+ };
1011
+ storage.save(`${packageName}_dev_meta`, JSON.stringify(devRecord));
1012
+ storage.save(`${packageName}_dev_url`, record.devUrl);
1013
+ if (typeof record.devPort === "number" && Number.isFinite(record.devPort)) {
1014
+ storage.save(`${packageName}_dev_port`, record.devPort);
1015
+ }
1016
+ else {
1017
+ storage.remove(`${packageName}_dev_port`);
1018
+ }
1019
+ const idx = getDevAppIndex();
1020
+ if (!idx.includes(packageName)) {
1021
+ idx.push(packageName);
1022
+ storage.save(DEV_APPS_INDEX_KEY, JSON.stringify(idx));
1023
+ }
1024
+ appRegistry.markRefreshNeeded();
1025
+ }
1026
+ /** Drop one dev miniapp's metadata, routing keys, and cached icon. */
1027
+ export function unregisterDevApp(packageName = DEV_APP_PACKAGE_NAME) {
1028
+ removeDevRecordKeys(packageName);
1029
+ const idx = getDevAppIndex().filter((p) => p !== packageName);
1030
+ storage.save(DEV_APPS_INDEX_KEY, JSON.stringify(idx));
1031
+ appRegistry.markRefreshNeeded();
1032
+ }
1033
+ function getDevAppIndex() {
1034
+ const res = storage.load(DEV_APPS_INDEX_KEY);
1035
+ if (!res.is_ok())
1036
+ return [];
1037
+ try {
1038
+ const parsed = JSON.parse(res.value);
1039
+ return Array.isArray(parsed) ? parsed : [];
1040
+ }
1041
+ catch {
1042
+ return [];
1043
+ }
1044
+ }
1045
+ /** Resolve the manifest package for a dev runtime (including the legacy slot). */
1046
+ export function getDevAppSourcePackage(packageName = DEV_APP_PACKAGE_NAME) {
1047
+ migrateLegacyDevSlot();
1048
+ const rec = readDevAppRecord(packageName);
1049
+ return rec?.sourcePackageName ?? rec?.packageName ?? null;
1050
+ }
1051
+ export function getDevAppAttestation(packageName = DEV_APP_PACKAGE_NAME) {
1052
+ migrateLegacyDevSlot();
1053
+ return readDevAppRecord(packageName)?.devAttestation ?? null;
1054
+ }
1055
+ export function getDevAppRecords() {
1056
+ migrateLegacyDevSlot();
1057
+ const out = [];
1058
+ for (const pkg of getDevAppIndex()) {
1059
+ const res = storage.load(`${pkg}_dev_meta`);
1060
+ if (!res.is_ok())
1061
+ continue;
1062
+ try {
1063
+ const record = JSON.parse(res.value);
1064
+ const normalized = normalizeDevAppRecord(record);
1065
+ if (normalized !== record) {
1066
+ storage.save(`${pkg}_dev_meta`, JSON.stringify(normalized));
1067
+ storage.save(`${pkg}_dev_url`, normalized.devUrl);
1068
+ }
1069
+ out.push(normalized);
1070
+ }
1071
+ catch {
1072
+ /* corrupt record — skip */
1073
+ }
1074
+ }
1075
+ return out;
1076
+ }
1077
+ const appRegistry = AppRegistry.getInstance();
1078
+ export default appRegistry;
1079
+ //# sourceMappingURL=AppRegistry.js.map