@camstack/core 0.1.15 → 0.1.17

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 (382) hide show
  1. package/dist/addon/addon-api-factory.d.ts +36 -0
  2. package/dist/addon/addon-api-factory.d.ts.map +1 -0
  3. package/dist/addon-routes/addon-route-registry.d.ts +38 -0
  4. package/dist/addon-routes/addon-route-registry.d.ts.map +1 -0
  5. package/dist/auth/api-key-manager.d.ts +27 -0
  6. package/dist/auth/api-key-manager.d.ts.map +1 -0
  7. package/dist/auth/auth-manager.d.ts +47 -0
  8. package/dist/auth/auth-manager.d.ts.map +1 -0
  9. package/dist/auth/parse-record.d.ts +19 -0
  10. package/dist/auth/parse-record.d.ts.map +1 -0
  11. package/dist/auth/scoped-token-manager.d.ts +18 -0
  12. package/dist/auth/scoped-token-manager.d.ts.map +1 -0
  13. package/dist/auth/user-manager.d.ts +34 -0
  14. package/dist/auth/user-manager.d.ts.map +1 -0
  15. package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.d.ts +54 -0
  16. package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.d.ts.map +1 -0
  17. package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.js +223 -217
  18. package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.js.map +1 -1
  19. package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.mjs +216 -7
  20. package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.mjs.map +1 -1
  21. package/dist/builtins/addon-pages-aggregator/index.d.ts +2 -0
  22. package/dist/builtins/addon-pages-aggregator/index.d.ts.map +1 -0
  23. package/dist/builtins/addon-pages-aggregator/index.js +6 -221
  24. package/dist/builtins/addon-pages-aggregator/index.mjs +2 -9
  25. package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.d.ts +33 -0
  26. package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.d.ts.map +1 -0
  27. package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.js +199 -197
  28. package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.js.map +1 -1
  29. package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.mjs +192 -7
  30. package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.mjs.map +1 -1
  31. package/dist/builtins/addon-widgets-aggregator/index.d.ts +2 -0
  32. package/dist/builtins/addon-widgets-aggregator/index.d.ts.map +1 -0
  33. package/dist/builtins/addon-widgets-aggregator/index.js +6 -201
  34. package/dist/builtins/addon-widgets-aggregator/index.mjs +2 -9
  35. package/dist/builtins/alerts/alerts.addon.d.ts +82 -0
  36. package/dist/builtins/alerts/alerts.addon.d.ts.map +1 -0
  37. package/dist/builtins/alerts/alerts.addon.js +590 -430
  38. package/dist/builtins/alerts/alerts.addon.js.map +1 -1
  39. package/dist/builtins/alerts/alerts.addon.mjs +595 -7
  40. package/dist/builtins/alerts/alerts.addon.mjs.map +1 -1
  41. package/dist/builtins/alerts/index.d.ts +2 -0
  42. package/dist/builtins/alerts/index.d.ts.map +1 -0
  43. package/dist/builtins/alerts/index.js +3 -443
  44. package/dist/builtins/alerts/index.mjs +2 -8
  45. package/dist/builtins/auth-orchestrator/auth-orchestrator.addon.d.ts +8 -0
  46. package/dist/builtins/auth-orchestrator/auth-orchestrator.addon.d.ts.map +1 -0
  47. package/dist/builtins/auth-orchestrator/auth-orchestrator.addon.js +56 -0
  48. package/dist/builtins/auth-orchestrator/auth-orchestrator.addon.js.map +1 -0
  49. package/dist/builtins/auth-orchestrator/auth-orchestrator.addon.mjs +50 -0
  50. package/dist/builtins/auth-orchestrator/auth-orchestrator.addon.mjs.map +1 -0
  51. package/dist/builtins/auth-orchestrator/index.d.ts +2 -0
  52. package/dist/builtins/auth-orchestrator/index.d.ts.map +1 -0
  53. package/dist/builtins/auth-orchestrator/index.js +7 -0
  54. package/dist/builtins/auth-orchestrator/index.mjs +2 -0
  55. package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.d.ts +148 -0
  56. package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.d.ts.map +1 -0
  57. package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.js +7639 -0
  58. package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.js.map +1 -0
  59. package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.mjs +7627 -0
  60. package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.mjs.map +1 -0
  61. package/dist/builtins/backup-orchestrator/cron-helpers.d.ts +24 -0
  62. package/dist/builtins/backup-orchestrator/cron-helpers.d.ts.map +1 -0
  63. package/dist/builtins/backup-orchestrator/destination-policy.d.ts +73 -0
  64. package/dist/builtins/backup-orchestrator/destination-policy.d.ts.map +1 -0
  65. package/dist/builtins/backup-orchestrator/download-helpers.d.ts +13 -0
  66. package/dist/builtins/backup-orchestrator/download-helpers.d.ts.map +1 -0
  67. package/dist/builtins/backup-orchestrator/index.d.ts +3 -0
  68. package/dist/builtins/backup-orchestrator/index.d.ts.map +1 -0
  69. package/dist/builtins/backup-orchestrator/index.js +7 -0
  70. package/dist/builtins/backup-orchestrator/index.mjs +2 -0
  71. package/dist/builtins/backup-orchestrator/manifest-store.d.ts +78 -0
  72. package/dist/builtins/backup-orchestrator/manifest-store.d.ts.map +1 -0
  73. package/dist/builtins/console-logging/console-destination.d.ts +14 -0
  74. package/dist/builtins/console-logging/console-destination.d.ts.map +1 -0
  75. package/dist/builtins/console-logging/console-logging.addon.d.ts +26 -0
  76. package/dist/builtins/console-logging/console-logging.addon.d.ts.map +1 -0
  77. package/dist/builtins/console-logging/index.d.ts +4 -0
  78. package/dist/builtins/console-logging/index.d.ts.map +1 -0
  79. package/dist/builtins/console-logging/index.js +99 -235
  80. package/dist/builtins/console-logging/index.js.map +1 -1
  81. package/dist/builtins/console-logging/index.mjs +95 -9
  82. package/dist/builtins/console-logging/index.mjs.map +1 -1
  83. package/dist/builtins/device-manager/device-event-propagator.d.ts +27 -0
  84. package/dist/builtins/device-manager/device-event-propagator.d.ts.map +1 -0
  85. package/dist/builtins/device-manager/device-manager.addon.d.ts +259 -0
  86. package/dist/builtins/device-manager/device-manager.addon.d.ts.map +1 -0
  87. package/dist/builtins/device-manager/device-manager.addon.js +2125 -2127
  88. package/dist/builtins/device-manager/device-manager.addon.js.map +1 -1
  89. package/dist/builtins/device-manager/device-manager.addon.mjs +2145 -7
  90. package/dist/builtins/device-manager/device-manager.addon.mjs.map +1 -1
  91. package/dist/builtins/device-manager/index.d.ts +3 -0
  92. package/dist/builtins/device-manager/index.d.ts.map +1 -0
  93. package/dist/builtins/device-manager/index.js +6 -2156
  94. package/dist/builtins/device-manager/index.mjs +2 -10
  95. package/dist/builtins/hub-forwarder/hub-forwarder-destination.d.ts +45 -0
  96. package/dist/builtins/hub-forwarder/hub-forwarder-destination.d.ts.map +1 -0
  97. package/dist/builtins/hub-forwarder/hub-forwarder.addon.d.ts +16 -0
  98. package/dist/builtins/hub-forwarder/hub-forwarder.addon.d.ts.map +1 -0
  99. package/dist/builtins/hub-forwarder/index.d.ts +4 -0
  100. package/dist/builtins/hub-forwarder/index.d.ts.map +1 -0
  101. package/dist/builtins/hub-forwarder/index.js +150 -291
  102. package/dist/builtins/hub-forwarder/index.js.map +1 -1
  103. package/dist/builtins/hub-forwarder/index.mjs +145 -9
  104. package/dist/builtins/hub-forwarder/index.mjs.map +1 -1
  105. package/dist/builtins/local-auth/auth-schema.d.ts +12 -0
  106. package/dist/builtins/local-auth/auth-schema.d.ts.map +1 -0
  107. package/dist/builtins/local-auth/index.d.ts +2 -0
  108. package/dist/builtins/local-auth/index.d.ts.map +1 -0
  109. package/dist/builtins/local-auth/index.js +3 -623
  110. package/dist/builtins/local-auth/index.mjs +2 -8
  111. package/dist/builtins/local-auth/local-auth.addon.d.ts +17 -0
  112. package/dist/builtins/local-auth/local-auth.addon.d.ts.map +1 -0
  113. package/dist/builtins/local-auth/local-auth.addon.js +6861 -589
  114. package/dist/builtins/local-auth/local-auth.addon.js.map +1 -1
  115. package/dist/builtins/local-auth/local-auth.addon.mjs +6883 -7
  116. package/dist/builtins/local-auth/local-auth.addon.mjs.map +1 -1
  117. package/dist/builtins/local-network/index.d.ts +3 -0
  118. package/dist/builtins/local-network/index.d.ts.map +1 -0
  119. package/dist/builtins/local-network/index.js +9 -0
  120. package/dist/builtins/local-network/index.mjs +2 -0
  121. package/dist/builtins/local-network/local-network.addon.d.ts +110 -0
  122. package/dist/builtins/local-network/local-network.addon.d.ts.map +1 -0
  123. package/dist/builtins/local-network/local-network.addon.js +399 -0
  124. package/dist/builtins/local-network/local-network.addon.js.map +1 -0
  125. package/dist/builtins/local-network/local-network.addon.mjs +387 -0
  126. package/dist/builtins/local-network/local-network.addon.mjs.map +1 -0
  127. package/dist/builtins/mesh-orchestrator/index.d.ts +2 -0
  128. package/dist/builtins/mesh-orchestrator/index.d.ts.map +1 -0
  129. package/dist/builtins/mesh-orchestrator/index.js +7 -0
  130. package/dist/builtins/mesh-orchestrator/index.mjs +2 -0
  131. package/dist/builtins/mesh-orchestrator/mesh-orchestrator.addon.d.ts +9 -0
  132. package/dist/builtins/mesh-orchestrator/mesh-orchestrator.addon.d.ts.map +1 -0
  133. package/dist/builtins/mesh-orchestrator/mesh-orchestrator.addon.js +83 -0
  134. package/dist/builtins/mesh-orchestrator/mesh-orchestrator.addon.js.map +1 -0
  135. package/dist/builtins/mesh-orchestrator/mesh-orchestrator.addon.mjs +77 -0
  136. package/dist/builtins/mesh-orchestrator/mesh-orchestrator.addon.mjs.map +1 -0
  137. package/dist/builtins/native-metrics/index.d.ts +3 -0
  138. package/dist/builtins/native-metrics/index.d.ts.map +1 -0
  139. package/dist/builtins/native-metrics/native-metrics-provider.d.ts +49 -0
  140. package/dist/builtins/native-metrics/native-metrics-provider.d.ts.map +1 -0
  141. package/dist/builtins/native-metrics/native-metrics.addon.d.ts +74 -0
  142. package/dist/builtins/native-metrics/native-metrics.addon.d.ts.map +1 -0
  143. package/dist/builtins/native-metrics/native-metrics.addon.js +887 -861
  144. package/dist/builtins/native-metrics/native-metrics.addon.js.map +1 -1
  145. package/dist/builtins/native-metrics/native-metrics.addon.mjs +914 -5
  146. package/dist/builtins/native-metrics/native-metrics.addon.mjs.map +1 -1
  147. package/dist/builtins/platform-probe/index.d.ts +12 -0
  148. package/dist/builtins/platform-probe/index.d.ts.map +1 -0
  149. package/dist/builtins/platform-probe/index.js +539 -0
  150. package/dist/builtins/platform-probe/index.js.map +1 -0
  151. package/dist/builtins/platform-probe/index.mjs +530 -0
  152. package/dist/builtins/platform-probe/index.mjs.map +1 -0
  153. package/dist/builtins/platform-probe/inference-config-resolver.d.ts +30 -0
  154. package/dist/builtins/platform-probe/inference-config-resolver.d.ts.map +1 -0
  155. package/dist/builtins/platform-probe/platform-scorer.d.ts +22 -0
  156. package/dist/builtins/platform-probe/platform-scorer.d.ts.map +1 -0
  157. package/dist/builtins/remote-access-orchestrator/index.d.ts +2 -0
  158. package/dist/builtins/remote-access-orchestrator/index.d.ts.map +1 -0
  159. package/dist/builtins/remote-access-orchestrator/index.js +7 -0
  160. package/dist/builtins/remote-access-orchestrator/index.mjs +2 -0
  161. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.d.ts +9 -0
  162. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.d.ts.map +1 -0
  163. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.js +72 -0
  164. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.js.map +1 -0
  165. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.mjs +66 -0
  166. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.mjs.map +1 -0
  167. package/dist/builtins/snapshot/index.d.ts +3 -0
  168. package/dist/builtins/snapshot/index.d.ts.map +1 -0
  169. package/dist/builtins/snapshot/index.js +481 -491
  170. package/dist/builtins/snapshot/index.js.map +1 -1
  171. package/dist/builtins/snapshot/index.mjs +475 -464
  172. package/dist/builtins/snapshot/index.mjs.map +1 -1
  173. package/dist/builtins/snapshot/snapshot.addon.d.ts +121 -0
  174. package/dist/builtins/snapshot/snapshot.addon.d.ts.map +1 -0
  175. package/dist/builtins/sqlite-storage/config-store.d.ts +9 -0
  176. package/dist/builtins/sqlite-storage/config-store.d.ts.map +1 -0
  177. package/dist/builtins/sqlite-storage/device-store.d.ts +24 -0
  178. package/dist/builtins/sqlite-storage/device-store.d.ts.map +1 -0
  179. package/dist/builtins/sqlite-storage/filesystem-storage-provider.d.ts +87 -0
  180. package/dist/builtins/sqlite-storage/filesystem-storage-provider.d.ts.map +1 -0
  181. package/dist/builtins/sqlite-storage/filesystem-storage.addon.d.ts +32 -0
  182. package/dist/builtins/sqlite-storage/filesystem-storage.addon.d.ts.map +1 -0
  183. package/dist/builtins/sqlite-storage/filesystem-storage.addon.js +312 -56
  184. package/dist/builtins/sqlite-storage/filesystem-storage.addon.js.map +1 -1
  185. package/dist/builtins/sqlite-storage/filesystem-storage.addon.mjs +305 -7
  186. package/dist/builtins/sqlite-storage/filesystem-storage.addon.mjs.map +1 -1
  187. package/dist/builtins/sqlite-storage/index.d.ts +12 -0
  188. package/dist/builtins/sqlite-storage/index.d.ts.map +1 -0
  189. package/dist/builtins/sqlite-storage/index.js +229 -1001
  190. package/dist/builtins/sqlite-storage/index.js.map +1 -1
  191. package/dist/builtins/sqlite-storage/index.mjs +268 -26
  192. package/dist/builtins/sqlite-storage/index.mjs.map +1 -1
  193. package/dist/builtins/sqlite-storage/integration-registry.d.ts +28 -0
  194. package/dist/builtins/sqlite-storage/integration-registry.d.ts.map +1 -0
  195. package/dist/builtins/sqlite-storage/settings-store.d.ts +40 -0
  196. package/dist/builtins/sqlite-storage/settings-store.d.ts.map +1 -0
  197. package/dist/builtins/sqlite-storage/sql-schema.d.ts +33 -0
  198. package/dist/builtins/sqlite-storage/sql-schema.d.ts.map +1 -0
  199. package/dist/builtins/sqlite-storage/sqlite-settings-backend.d.ts +94 -0
  200. package/dist/builtins/sqlite-storage/sqlite-settings-backend.d.ts.map +1 -0
  201. package/dist/builtins/sqlite-storage/sqlite-settings.addon.d.ts +15 -0
  202. package/dist/builtins/sqlite-storage/sqlite-settings.addon.d.ts.map +1 -0
  203. package/dist/builtins/sqlite-storage/sqlite-settings.addon.js +586 -653
  204. package/dist/builtins/sqlite-storage/sqlite-settings.addon.js.map +1 -1
  205. package/dist/builtins/sqlite-storage/sqlite-settings.addon.mjs +582 -7
  206. package/dist/builtins/sqlite-storage/sqlite-settings.addon.mjs.map +1 -1
  207. package/dist/builtins/storage-orchestrator/index.d.ts +7 -0
  208. package/dist/builtins/storage-orchestrator/index.d.ts.map +1 -0
  209. package/dist/builtins/storage-orchestrator/index.js +9 -0
  210. package/dist/builtins/storage-orchestrator/index.mjs +2 -0
  211. package/dist/builtins/storage-orchestrator/location-store.d.ts +50 -0
  212. package/dist/builtins/storage-orchestrator/location-store.d.ts.map +1 -0
  213. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.d.ts +60 -0
  214. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.d.ts.map +1 -0
  215. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.js +755 -0
  216. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.js.map +1 -0
  217. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.mjs +746 -0
  218. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.mjs.map +1 -0
  219. package/dist/builtins/storage-orchestrator/storage-orchestrator.service.d.ts +121 -0
  220. package/dist/builtins/storage-orchestrator/storage-orchestrator.service.d.ts.map +1 -0
  221. package/dist/builtins/system-backup/system-backup.service.d.ts +138 -0
  222. package/dist/builtins/system-backup/system-backup.service.d.ts.map +1 -0
  223. package/dist/builtins/system-config/index.d.ts +2 -0
  224. package/dist/builtins/system-config/index.d.ts.map +1 -0
  225. package/dist/builtins/system-config/index.js +6 -188
  226. package/dist/builtins/system-config/index.mjs +2 -10
  227. package/dist/builtins/system-config/system-config.addon.d.ts +11 -0
  228. package/dist/builtins/system-config/system-config.addon.d.ts.map +1 -0
  229. package/dist/builtins/system-config/system-config.addon.js +227 -180
  230. package/dist/builtins/system-config/system-config.addon.js.map +1 -1
  231. package/dist/builtins/system-config/system-config.addon.mjs +226 -7
  232. package/dist/builtins/system-config/system-config.addon.mjs.map +1 -1
  233. package/dist/builtins/turn-orchestrator/index.d.ts +2 -0
  234. package/dist/builtins/turn-orchestrator/index.d.ts.map +1 -0
  235. package/dist/builtins/turn-orchestrator/index.js +7 -0
  236. package/dist/builtins/turn-orchestrator/index.mjs +2 -0
  237. package/dist/builtins/turn-orchestrator/turn-orchestrator.addon.d.ts +10 -0
  238. package/dist/builtins/turn-orchestrator/turn-orchestrator.addon.d.ts.map +1 -0
  239. package/dist/builtins/turn-orchestrator/turn-orchestrator.addon.js +78 -0
  240. package/dist/builtins/turn-orchestrator/turn-orchestrator.addon.js.map +1 -0
  241. package/dist/builtins/turn-orchestrator/turn-orchestrator.addon.mjs +72 -0
  242. package/dist/builtins/turn-orchestrator/turn-orchestrator.addon.mjs.map +1 -0
  243. package/dist/builtins/winston-logging/index.d.ts +4 -0
  244. package/dist/builtins/winston-logging/index.d.ts.map +1 -0
  245. package/dist/builtins/winston-logging/index.js +153 -300
  246. package/dist/builtins/winston-logging/index.js.map +1 -1
  247. package/dist/builtins/winston-logging/index.mjs +144 -9
  248. package/dist/builtins/winston-logging/index.mjs.map +1 -1
  249. package/dist/builtins/winston-logging/winston-destination.d.ts +22 -0
  250. package/dist/builtins/winston-logging/winston-destination.d.ts.map +1 -0
  251. package/dist/builtins/winston-logging/winston-logging.addon.d.ts +20 -0
  252. package/dist/builtins/winston-logging/winston-logging.addon.d.ts.map +1 -0
  253. package/dist/chunk-C13QxCFV.js +50 -0
  254. package/dist/chunk-hT5z_Zn9.mjs +35 -0
  255. package/dist/download/model-download-service.d.ts +42 -0
  256. package/dist/download/model-download-service.d.ts.map +1 -0
  257. package/dist/download/model-downloader.d.ts +32 -0
  258. package/dist/download/model-downloader.d.ts.map +1 -0
  259. package/dist/events/event-bus.d.ts +11 -0
  260. package/dist/events/event-bus.d.ts.map +1 -0
  261. package/dist/events/system-event-bus.d.ts +15 -0
  262. package/dist/events/system-event-bus.d.ts.map +1 -0
  263. package/dist/feature/feature-manager.d.ts +12 -0
  264. package/dist/feature/feature-manager.d.ts.map +1 -0
  265. package/dist/formatter-C-5An4Bl.mjs +164 -0
  266. package/dist/formatter-C-5An4Bl.mjs.map +1 -0
  267. package/dist/formatter-Dr_6NNZc.js +169 -0
  268. package/dist/formatter-Dr_6NNZc.js.map +1 -0
  269. package/dist/index.d.ts +76 -1696
  270. package/dist/index.d.ts.map +1 -0
  271. package/dist/index.js +7780 -8035
  272. package/dist/index.js.map +1 -1
  273. package/dist/index.mjs +7707 -2148
  274. package/dist/index.mjs.map +1 -1
  275. package/dist/lifecycle/lifecycle-state-machine.d.ts +29 -0
  276. package/dist/lifecycle/lifecycle-state-machine.d.ts.map +1 -0
  277. package/dist/logging/formatter.d.ts +31 -0
  278. package/dist/logging/formatter.d.ts.map +1 -0
  279. package/dist/logging/log-manager.d.ts +52 -0
  280. package/dist/logging/log-manager.d.ts.map +1 -0
  281. package/dist/logging/log-ring-buffer.d.ts +48 -0
  282. package/dist/logging/log-ring-buffer.d.ts.map +1 -0
  283. package/dist/logging/scoped-logger.d.ts +18 -0
  284. package/dist/logging/scoped-logger.d.ts.map +1 -0
  285. package/dist/network/network-quality.d.ts +12 -0
  286. package/dist/network/network-quality.d.ts.map +1 -0
  287. package/dist/notification/notification-service.d.ts +38 -0
  288. package/dist/notification/notification-service.d.ts.map +1 -0
  289. package/dist/notification/toast-service.d.ts +23 -0
  290. package/dist/notification/toast-service.d.ts.map +1 -0
  291. package/dist/pipeline/engine-manager-resolver.d.ts +16 -0
  292. package/dist/pipeline/engine-manager-resolver.d.ts.map +1 -0
  293. package/dist/pipeline/pipeline-runner.d.ts +9 -0
  294. package/dist/pipeline/pipeline-runner.d.ts.map +1 -0
  295. package/dist/pipeline/pipeline-validator.d.ts +14 -0
  296. package/dist/pipeline/pipeline-validator.d.ts.map +1 -0
  297. package/dist/process/resource-monitor.d.ts +12 -0
  298. package/dist/process/resource-monitor.d.ts.map +1 -0
  299. package/dist/python/python-env-manager.d.ts +13 -0
  300. package/dist/python/python-env-manager.d.ts.map +1 -0
  301. package/dist/repl/interfaces.d.ts +32 -0
  302. package/dist/repl/interfaces.d.ts.map +1 -0
  303. package/dist/repl/repl-engine.d.ts +9 -0
  304. package/dist/repl/repl-engine.d.ts.map +1 -0
  305. package/dist/resource-monitor-CmuWlmap.js +76 -0
  306. package/dist/resource-monitor-CmuWlmap.js.map +1 -0
  307. package/dist/resource-monitor-DcQdKGYU.mjs +59 -0
  308. package/dist/resource-monitor-DcQdKGYU.mjs.map +1 -0
  309. package/dist/storage/fs-storage-backend.d.ts +41 -0
  310. package/dist/storage/fs-storage-backend.d.ts.map +1 -0
  311. package/dist/storage/storage-location-manager.d.ts +24 -0
  312. package/dist/storage/storage-location-manager.d.ts.map +1 -0
  313. package/dist/storage/storage-manager.d.ts +77 -0
  314. package/dist/storage/storage-manager.d.ts.map +1 -0
  315. package/dist/tls/cert-manager.d.ts +27 -0
  316. package/dist/tls/cert-manager.d.ts.map +1 -0
  317. package/dist/tls/index.d.ts +2 -0
  318. package/dist/tls/index.d.ts.map +1 -0
  319. package/package.json +119 -23
  320. package/dist/builtins/addon-pages-aggregator/index.js.map +0 -1
  321. package/dist/builtins/addon-pages-aggregator/index.mjs.map +0 -1
  322. package/dist/builtins/addon-widgets-aggregator/index.js.map +0 -1
  323. package/dist/builtins/addon-widgets-aggregator/index.mjs.map +0 -1
  324. package/dist/builtins/alerts/index.js.map +0 -1
  325. package/dist/builtins/alerts/index.mjs.map +0 -1
  326. package/dist/builtins/device-manager/index.js.map +0 -1
  327. package/dist/builtins/device-manager/index.mjs.map +0 -1
  328. package/dist/builtins/local-auth/index.js.map +0 -1
  329. package/dist/builtins/local-auth/index.mjs.map +0 -1
  330. package/dist/builtins/local-backup/index.js +0 -173
  331. package/dist/builtins/local-backup/index.js.map +0 -1
  332. package/dist/builtins/local-backup/index.mjs +0 -10
  333. package/dist/builtins/local-backup/index.mjs.map +0 -1
  334. package/dist/builtins/system-config/index.js.map +0 -1
  335. package/dist/builtins/system-config/index.mjs.map +0 -1
  336. package/dist/chunk-2CIYKDRN.mjs +0 -1
  337. package/dist/chunk-2CIYKDRN.mjs.map +0 -1
  338. package/dist/chunk-2F76X6NL.mjs +0 -136
  339. package/dist/chunk-2F76X6NL.mjs.map +0 -1
  340. package/dist/chunk-2QUFBZ7M.mjs +0 -1
  341. package/dist/chunk-2QUFBZ7M.mjs.map +0 -1
  342. package/dist/chunk-3BK2Y7GY.mjs +0 -593
  343. package/dist/chunk-3BK2Y7GY.mjs.map +0 -1
  344. package/dist/chunk-4OOHFJHT.mjs +0 -421
  345. package/dist/chunk-4OOHFJHT.mjs.map +0 -1
  346. package/dist/chunk-4XHB7IHT.mjs +0 -809
  347. package/dist/chunk-4XHB7IHT.mjs.map +0 -1
  348. package/dist/chunk-6M2HSSTQ.mjs +0 -98
  349. package/dist/chunk-6M2HSSTQ.mjs.map +0 -1
  350. package/dist/chunk-7FI7SQS7.mjs +0 -135
  351. package/dist/chunk-7FI7SQS7.mjs.map +0 -1
  352. package/dist/chunk-ED57RCQE.mjs +0 -171
  353. package/dist/chunk-ED57RCQE.mjs.map +0 -1
  354. package/dist/chunk-FZN56HGQ.mjs +0 -626
  355. package/dist/chunk-FZN56HGQ.mjs.map +0 -1
  356. package/dist/chunk-GL4OOB25.mjs +0 -51
  357. package/dist/chunk-GL4OOB25.mjs.map +0 -1
  358. package/dist/chunk-KDG2NTDB.mjs +0 -137
  359. package/dist/chunk-KDG2NTDB.mjs.map +0 -1
  360. package/dist/chunk-NRBQWBDM.mjs +0 -191
  361. package/dist/chunk-NRBQWBDM.mjs.map +0 -1
  362. package/dist/chunk-O4V246GG.mjs +0 -2137
  363. package/dist/chunk-O4V246GG.mjs.map +0 -1
  364. package/dist/chunk-QT57H266.mjs +0 -163
  365. package/dist/chunk-QT57H266.mjs.map +0 -1
  366. package/dist/chunk-QX4RH25I.mjs +0 -141
  367. package/dist/chunk-QX4RH25I.mjs.map +0 -1
  368. package/dist/chunk-TB562PZX.mjs +0 -86
  369. package/dist/chunk-TB562PZX.mjs.map +0 -1
  370. package/dist/chunk-TDYPZXK5.mjs +0 -1
  371. package/dist/chunk-TDYPZXK5.mjs.map +0 -1
  372. package/dist/chunk-UJI4LN5P.mjs +0 -36
  373. package/dist/chunk-UJI4LN5P.mjs.map +0 -1
  374. package/dist/chunk-W6RTHQGP.mjs +0 -1
  375. package/dist/chunk-W6RTHQGP.mjs.map +0 -1
  376. package/dist/chunk-ZELBCPDC.mjs +0 -369
  377. package/dist/chunk-ZELBCPDC.mjs.map +0 -1
  378. package/dist/index.d.mts +0 -1696
  379. package/dist/resource-monitor-UZUGPIAU.mjs +0 -9
  380. package/dist/resource-monitor-UZUGPIAU.mjs.map +0 -1
  381. package/dist/storage-location-manager-HFNB3PCS.mjs +0 -7
  382. package/dist/storage-location-manager-HFNB3PCS.mjs.map +0 -1
@@ -1,443 +1,603 @@
1
- "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __export = (target, all) => {
7
- for (var name in all)
8
- __defProp(target, name, { get: all[name], enumerable: true });
9
- };
10
- var __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
-
20
- // src/builtins/alerts/alerts.addon.ts
21
- var alerts_addon_exports = {};
22
- __export(alerts_addon_exports, {
23
- AlertCenterAddon: () => AlertCenterAddon,
24
- default: () => alerts_addon_default
1
+ Object.defineProperties(exports, {
2
+ __esModule: { value: true },
3
+ [Symbol.toStringTag]: { value: "Module" }
25
4
  });
26
- module.exports = __toCommonJS(alerts_addon_exports);
27
- var import_types = require("@camstack/types");
28
- var import_types2 = require("@camstack/types");
5
+ require("../../chunk-C13QxCFV.js");
6
+ let _camstack_types = require("@camstack/types");
7
+ //#region src/builtins/alerts/alerts.addon.ts
29
8
  var CATEGORY_MAPPINGS = {
30
- // ── Critical — always surface ──────────────────────────────────────
31
- "addon.crashed": { severity: "error", titleTemplate: "Addon crashed" },
32
- "addon.error": { severity: "error", titleTemplate: "Addon error" },
33
- "process.crashed": { severity: "error", titleTemplate: "Process crashed" },
34
- "recording.error": { severity: "error", titleTemplate: "Recording error" },
35
- "recording.storage.critical": { severity: "warning", titleTemplate: "Storage critical" },
36
- "notification.failed": { severity: "error", titleTemplate: "Notification failed" },
37
- // ── Cluster — agent connect/disconnect ─────────────────────────────
38
- "agent.online": { severity: "info", titleTemplate: "Agent connected" },
39
- "agent.offline": { severity: "warning", titleTemplate: "Agent disconnected" },
40
- // ── System lifecycle ──────────────────────────────────────────────
41
- "system.boot": { severity: "info", titleTemplate: "System boot" },
42
- "system.restarting": { severity: "warning", titleTemplate: "System restarting" },
43
- // ── Device lifecycle (add/remove only, not settings tweaks) ───────
44
- "device.registered": { severity: "info", titleTemplate: "Device registered" },
45
- "device.unregistered": { severity: "warning", titleTemplate: "Device unregistered" },
46
- // ── Package management ────────────────────────────────────────────
47
- "addon.installed": { severity: "info", titleTemplate: "Addon installed" },
48
- "addon.updated": { severity: "info", titleTemplate: "Addon updated" },
49
- "addon.uninstalled": { severity: "info", titleTemplate: "Addon uninstalled" },
50
- // ── Backup (rare, important) ──────────────────────────────────────
51
- "backup.completed": { severity: "info", titleTemplate: "Backup completed" },
52
- "backup.restored": { severity: "info", titleTemplate: "Backup restored" },
53
- // ── Model downloads (in-progress merging path) ────────────────────
54
- "model.download.progress": { severity: "info", titleTemplate: "Model download" }
9
+ "addon.crashed": {
10
+ severity: "error",
11
+ titleTemplate: "Addon crashed"
12
+ },
13
+ "addon.error": {
14
+ severity: "error",
15
+ titleTemplate: "Addon error"
16
+ },
17
+ "process.crashed": {
18
+ severity: "error",
19
+ titleTemplate: "Process crashed"
20
+ },
21
+ "recording.error": {
22
+ severity: "error",
23
+ titleTemplate: "Recording error"
24
+ },
25
+ "recording.storage.critical": {
26
+ severity: "warning",
27
+ titleTemplate: "Storage critical"
28
+ },
29
+ "notification.failed": {
30
+ severity: "error",
31
+ titleTemplate: "Notification failed"
32
+ },
33
+ "agent.online": {
34
+ severity: "info",
35
+ titleTemplate: "Agent connected"
36
+ },
37
+ "agent.offline": {
38
+ severity: "warning",
39
+ titleTemplate: "Agent disconnected"
40
+ },
41
+ "system.boot": {
42
+ severity: "info",
43
+ titleTemplate: "System boot"
44
+ },
45
+ "system.restarting": {
46
+ severity: "warning",
47
+ titleTemplate: "System restarting"
48
+ },
49
+ "device.registered": {
50
+ severity: "info",
51
+ titleTemplate: "Device registered"
52
+ },
53
+ "device.unregistered": {
54
+ severity: "warning",
55
+ titleTemplate: "Device unregistered"
56
+ },
57
+ "addon.installed": {
58
+ severity: "info",
59
+ titleTemplate: "Addon installed"
60
+ },
61
+ "addon.updated": {
62
+ severity: "info",
63
+ titleTemplate: "Addon updated"
64
+ },
65
+ "addon.uninstalled": {
66
+ severity: "info",
67
+ titleTemplate: "Addon uninstalled"
68
+ },
69
+ "addon.load-failed": {
70
+ severity: "error",
71
+ titleTemplate: "Addon failed to load"
72
+ },
73
+ "addon.load-recovered": {
74
+ severity: "info",
75
+ titleTemplate: "Addon recovered"
76
+ },
77
+ "backup.completed": {
78
+ severity: "info",
79
+ titleTemplate: "Backup completed"
80
+ },
81
+ "backup.restored": {
82
+ severity: "info",
83
+ titleTemplate: "Backup restored"
84
+ },
85
+ "model.download.progress": {
86
+ severity: "info",
87
+ titleTemplate: "Model download"
88
+ }
55
89
  };
56
90
  var TRACKED_CATEGORIES = Object.keys(CATEGORY_MAPPINGS);
91
+ /**
92
+ * `[ALERT-CENTER-EVENTS]` — rate limiting. Events that fire thousands of
93
+ * times a minute (flaky cam reconnecting, chatty integration, …) would
94
+ * flood the alert feed and push genuinely important alerts off the
95
+ * visible page. We collapse bursts into a single throttled summary per
96
+ * `(category, source.id)` tuple: the first N events within the window
97
+ * still surface as individual alerts, but once the source crosses the
98
+ * threshold we stop emitting alerts for it and wait out the window.
99
+ *
100
+ * A standalone category-count map is cleared on every window rollover.
101
+ * Keep the threshold generous enough that legitimate bursts of ~a few
102
+ * per minute still get through, but strict enough that a reconnect loop
103
+ * firing every second gets muted.
104
+ */
57
105
  var RATE_LIMIT_WINDOW_MS = 6e4;
58
106
  var RATE_LIMIT_MAX_PER_SOURCE = 5;
107
+ /** Parse a raw settings record into a validated Alert. */
59
108
  function parseAlert(record) {
60
- return import_types2.AlertSchema.parse({ id: record.id, ...record.data });
109
+ return _camstack_types.AlertSchema.parse({
110
+ id: record.id,
111
+ ...record.data
112
+ });
61
113
  }
62
114
  var DEFAULT_CONFIG = {
63
- maxAlerts: 500,
64
- retentionDays: 30
115
+ maxAlerts: 500,
116
+ retentionDays: 30
65
117
  };
66
118
  var ALERTS_COLLECTION = "alerts";
67
- var EVENT_SOURCE = { type: "addon", id: "alert-center" };
68
- var AlertCenterAddon = class extends import_types2.BaseAddon {
69
- unsubscribers = [];
70
- constructor() {
71
- super({ ...DEFAULT_CONFIG });
72
- }
73
- /**
74
- * Per `(category, source.id)` counter used to rate-limit chatty
75
- * events. Entries are pruned lazily when they age out of
76
- * `RATE_LIMIT_WINDOW_MS`; see `shouldSuppressByRate()` below.
77
- */
78
- rateLimitCounters = /* @__PURE__ */ new Map();
79
- async onInitialize() {
80
- const alertsProvider = {
81
- emit: (alert) => this.emitAlert(alert),
82
- update: (input) => this.updateAlert(input.alertId, input.patch),
83
- list: (filter) => this.listAlerts(filter),
84
- getUnreadCount: () => this.getUnreadCount(),
85
- markRead: (input) => this.markRead(input.alertId),
86
- markAllRead: () => this.markAllRead(),
87
- dismiss: (input) => this.dismiss(input.alertId)
88
- };
89
- const unsubs = [];
90
- for (const category of TRACKED_CATEGORIES) {
91
- const unsub = this.ctx.eventBus.subscribe(
92
- { category },
93
- (event) => {
94
- void this.handleEvent(category, event);
95
- }
96
- );
97
- unsubs.push(unsub);
98
- }
99
- this.unsubscribers = unsubs;
100
- this.ctx.logger.info("Initialized", { meta: { trackedCategoriesCount: TRACKED_CATEGORIES.length } });
101
- return [{ capability: import_types2.alertsCapability, provider: alertsProvider }];
102
- }
103
- async onShutdown() {
104
- for (const unsub of this.unsubscribers) {
105
- unsub();
106
- }
107
- this.unsubscribers = [];
108
- }
109
- globalSettingsSchema() {
110
- return this.schema({
111
- sections: [{
112
- id: "alerts",
113
- title: "Alert Center",
114
- description: "Configure alert storage and retention.",
115
- columns: 1,
116
- fields: [
117
- this.field({
118
- type: "number",
119
- key: "maxAlerts",
120
- label: "Maximum stored alerts",
121
- description: "Oldest read alerts are deleted when this limit is exceeded.",
122
- min: 50,
123
- max: 5e3,
124
- step: 50,
125
- default: 500
126
- }),
127
- this.field({
128
- type: "number",
129
- key: "retentionDays",
130
- label: "Alert retention (days)",
131
- description: "Alerts older than this are automatically removed.",
132
- min: 1,
133
- max: 365,
134
- step: 1,
135
- default: 30
136
- })
137
- ]
138
- }]
139
- });
140
- }
141
- // ── Public methods (called by the tRPC router) ────────────────────
142
- async listAlerts(filter) {
143
- const backend = this.ctx.api.settingsStore;
144
- if (!backend) return [];
145
- const whereClause = {};
146
- if (filter?.unreadOnly) {
147
- whereClause.read = false;
148
- }
149
- const records = await backend.query.query({ collection: ALERTS_COLLECTION, filter: {
150
- where: Object.keys(whereClause).length > 0 ? whereClause : void 0,
151
- orderBy: { field: "updatedAt", direction: "desc" },
152
- limit: filter?.limit ?? 100
153
- } });
154
- return records.map(parseAlert);
155
- }
156
- async getUnreadCount() {
157
- const backend = this.ctx.api.settingsStore;
158
- if (!backend) return 0;
159
- return backend.count.query({ collection: ALERTS_COLLECTION, filter: { where: { read: false } } });
160
- }
161
- async markRead(alertId) {
162
- await this.mergeUpdate(alertId, { read: true, updatedAt: Date.now() });
163
- }
164
- async markAllRead() {
165
- const backend = this.ctx.api.settingsStore;
166
- if (!backend) return;
167
- const unread = await backend.query.query({ collection: ALERTS_COLLECTION, filter: { where: { read: false } } });
168
- const now = Date.now();
169
- for (const record of unread) {
170
- await this.mergeUpdate(record.id, { read: true, updatedAt: now });
171
- }
172
- }
173
- async dismiss(alertId) {
174
- await this.mergeUpdate(alertId, {
175
- status: "dismissed",
176
- read: true,
177
- updatedAt: Date.now()
178
- });
179
- }
180
- // ── Private: event handling ──────────────────────────────────────
181
- async handleEvent(category, event) {
182
- try {
183
- if (category === "model.download.progress") {
184
- await this.handleModelDownload(event);
185
- return;
186
- }
187
- const mapping = CATEGORY_MAPPINGS[category];
188
- if (!mapping) return;
189
- if (this.shouldSuppressByRate(category, event)) return;
190
- const message = this.buildMessage(category, event.data);
191
- const alert = {
192
- id: crypto.randomUUID(),
193
- category,
194
- severity: mapping.severity,
195
- title: mapping.titleTemplate,
196
- message,
197
- status: "active",
198
- read: false,
199
- createdAt: Date.now(),
200
- updatedAt: Date.now(),
201
- source: event.source ? { type: event.source.type, id: String(event.source.id) } : void 0,
202
- metadata: event.data
203
- };
204
- await this.emitAlert(alert);
205
- } catch (err) {
206
- this.ctx.logger?.warn(
207
- "Failed to handle event",
208
- { meta: { category, error: (0, import_types2.errMsg)(err) } }
209
- );
210
- }
211
- }
212
- async handleModelDownload(event) {
213
- const data = event.data;
214
- const modelId = data.modelId ?? "unknown";
215
- const progress = data.progress ?? 0;
216
- const stableId = `model-download:${modelId}`;
217
- const backend = this.ctx.api.settingsStore;
218
- if (!backend) return;
219
- const existing = await backend.query.query({ collection: ALERTS_COLLECTION, filter: {
220
- where: { id: stableId }
221
- } });
222
- if (existing.length > 0) {
223
- const now = Date.now();
224
- if (progress >= 100) {
225
- await this.mergeUpdate(stableId, {
226
- status: "completed",
227
- progress: 100,
228
- message: `Model "${modelId}" download completed`,
229
- updatedAt: now
230
- });
231
- this.emitAlertUpdatedEvent(stableId, { status: "completed", progress: 100 });
232
- } else if (progress < 0) {
233
- await this.mergeUpdate(stableId, {
234
- status: "failed",
235
- message: `Model "${modelId}" download failed`,
236
- updatedAt: now
237
- });
238
- this.emitAlertUpdatedEvent(stableId, { status: "failed" });
239
- } else {
240
- await this.mergeUpdate(stableId, {
241
- progress,
242
- message: `Downloading model "${modelId}" \u2014 ${String(Math.round(progress))}%`,
243
- updatedAt: now
244
- });
245
- this.emitAlertUpdatedEvent(stableId, { progress });
246
- }
247
- } else {
248
- const alert = {
249
- id: stableId,
250
- category: import_types.EventCategory.ModelDownloadProgress,
251
- severity: "info",
252
- title: "Model download",
253
- message: `Downloading model "${modelId}" \u2014 ${String(Math.round(progress))}%`,
254
- status: "in-progress",
255
- progress,
256
- read: false,
257
- createdAt: Date.now(),
258
- updatedAt: Date.now(),
259
- source: event.source ? { type: event.source.type, id: String(event.source.id) } : void 0,
260
- metadata: { modelId }
261
- };
262
- await this.persistAlert(alert);
263
- this.emitAlertCreatedEvent(alert);
264
- }
265
- }
266
- /**
267
- * `[ALERT-CENTER-EVENTS]` — rate limit a `(category, source.id)`
268
- * tuple. Returns `true` when the caller should DROP this event
269
- * without persisting an alert, and `false` when the alert should
270
- * proceed normally.
271
- *
272
- * Heuristic: the first `RATE_LIMIT_MAX_PER_SOURCE` events within a
273
- * `RATE_LIMIT_WINDOW_MS` window go through. Once the threshold is
274
- * crossed, subsequent events are suppressed until the window rolls
275
- * over. When the threshold is first crossed, the suppression is
276
- * logged once so operators know why they're not seeing the follow-
277
- * up alerts; after the window rolls over the next event is
278
- * un-suppressed and starts a new window.
279
- */
280
- shouldSuppressByRate(category, event) {
281
- const sourceId = event.source?.id ?? "unknown";
282
- const key = `${category}::${sourceId}`;
283
- const now = Date.now();
284
- const entry = this.rateLimitCounters.get(key);
285
- if (!entry || now - entry.firstAt > RATE_LIMIT_WINDOW_MS) {
286
- this.rateLimitCounters.set(key, { firstAt: now, count: 1, suppressedLogged: false });
287
- return false;
288
- }
289
- entry.count += 1;
290
- if (entry.count <= RATE_LIMIT_MAX_PER_SOURCE) return false;
291
- if (!entry.suppressedLogged) {
292
- entry.suppressedLogged = true;
293
- this.ctx.logger?.info(
294
- "rate-limiting suppressing remainder of window",
295
- { meta: { category, sourceId, maxPerSource: RATE_LIMIT_MAX_PER_SOURCE, windowSeconds: RATE_LIMIT_WINDOW_MS / 1e3 } }
296
- );
297
- }
298
- return true;
299
- }
300
- buildMessage(category, data) {
301
- const addonId = data.addonId;
302
- const deviceId = data.deviceId;
303
- const error = data.error;
304
- const processId = data.processId;
305
- switch (category) {
306
- case "addon.crashed":
307
- return `Addon "${addonId ?? "unknown"}" crashed${error ? `: ${error}` : ""}`;
308
- case "addon.error":
309
- return `Addon "${addonId ?? "unknown"}" error${error ? `: ${error}` : ""}`;
310
- case "addon.installed":
311
- return `Addon "${addonId ?? "unknown"}" installed`;
312
- case "addon.updated": {
313
- const from = data.fromVersion;
314
- const to = data.toVersion;
315
- return `Addon "${addonId ?? "unknown"}" updated${from && to ? ` from ${from} to ${to}` : ""}`;
316
- }
317
- case "addon.uninstalled":
318
- return `Addon "${addonId ?? "unknown"}" uninstalled`;
319
- case "device.registered":
320
- return `Device "${data.name ?? deviceId ?? "unknown"}" registered`;
321
- case "device.unregistered":
322
- return `Device "${deviceId ?? "unknown"}" unregistered`;
323
- case "agent.online":
324
- return `Agent "${data.agentId ?? data.nodeId ?? "unknown"}" connected`;
325
- case "agent.offline":
326
- return `Agent "${data.agentId ?? data.nodeId ?? "unknown"}" disconnected${data.reason ? `: ${String(data.reason)}` : ""}`;
327
- case "backup.completed":
328
- return `Backup completed${data.targetId ? ` (${String(data.targetId)})` : ""}`;
329
- case "backup.restored":
330
- return `Backup restored${data.source ? ` from ${String(data.source)}` : ""}`;
331
- case "notification.failed":
332
- return `Notification failed${error ? `: ${error}` : ""}`;
333
- case "system.restarting":
334
- return `System restarting${data.reason ? ` \u2014 ${String(data.reason)}` : ""}`;
335
- case "recording.error":
336
- return `Recording error on device "${deviceId ?? "unknown"}"${error ? `: ${error}` : ""}`;
337
- case "recording.storage.critical":
338
- return `Storage critical for device "${deviceId ?? "unknown"}"`;
339
- case "system.boot":
340
- return `System booted in "${data.mode ?? "unknown"}" mode`;
341
- case "process.crashed":
342
- return `Process "${processId ?? "unknown"}" crashed`;
343
- default:
344
- return `Event: ${category}`;
345
- }
346
- }
347
- // ── Private: persistence ─────────────────────────────────────────
348
- async emitAlert(alert) {
349
- await this.persistAlert(alert);
350
- this.emitAlertCreatedEvent(alert);
351
- await this.enforceMaxAlerts();
352
- await this.enforceRetention();
353
- }
354
- async updateAlert(alertId, patch) {
355
- await this.mergeUpdate(alertId, { ...patch, updatedAt: Date.now() });
356
- this.emitAlertUpdatedEvent(alertId, patch);
357
- }
358
- /**
359
- * Read-merge-write: SettingsBackend.update() replaces the entire `data` blob,
360
- * so we must read the existing record, merge the patch, and write back.
361
- */
362
- async mergeUpdate(id, patch) {
363
- const backend = this.ctx.api.settingsStore;
364
- if (!backend) return;
365
- const raw = await backend.get.query({ collection: ALERTS_COLLECTION, key: id });
366
- if (raw === null || raw === void 0 || typeof raw !== "object") return;
367
- const existing = Object.fromEntries(Object.entries(raw));
368
- await backend.set.mutate({ collection: ALERTS_COLLECTION, key: id, value: { ...existing, ...patch } });
369
- }
370
- async persistAlert(alert) {
371
- const backend = this.ctx.api.settingsStore;
372
- if (!backend) return;
373
- const data = {
374
- id: alert.id,
375
- category: alert.category,
376
- severity: alert.severity,
377
- title: alert.title,
378
- message: alert.message,
379
- status: alert.status,
380
- read: alert.read,
381
- createdAt: alert.createdAt,
382
- updatedAt: alert.updatedAt,
383
- ...alert.progress !== void 0 ? { progress: alert.progress } : {},
384
- ...alert.source ? { source: alert.source } : {},
385
- ...alert.metadata ? { metadata: alert.metadata } : {}
386
- };
387
- await backend.set.mutate({ collection: ALERTS_COLLECTION, key: alert.id, value: data });
388
- }
389
- emitAlertCreatedEvent(alert) {
390
- this.ctx.eventBus?.emit((0, import_types2.createEvent)("alert.created", EVENT_SOURCE, {
391
- id: alert.id,
392
- category: alert.category,
393
- severity: alert.severity,
394
- title: alert.title,
395
- status: alert.status
396
- }));
397
- }
398
- emitAlertUpdatedEvent(alertId, patch) {
399
- const patchRecord = {};
400
- for (const [key, value] of Object.entries(patch)) {
401
- patchRecord[key] = value;
402
- }
403
- this.ctx.eventBus?.emit((0, import_types2.createEvent)("alert.updated", EVENT_SOURCE, {
404
- alertId,
405
- patch: patchRecord
406
- }));
407
- }
408
- async enforceMaxAlerts() {
409
- const backend = this.ctx.api.settingsStore;
410
- if (!backend) return;
411
- const total = await backend.count.query({ collection: ALERTS_COLLECTION });
412
- if (total <= this.config.maxAlerts) return;
413
- const excess = total - this.config.maxAlerts;
414
- const oldest = await backend.query.query({ collection: ALERTS_COLLECTION, filter: {
415
- where: { read: true },
416
- orderBy: { field: "createdAt", direction: "asc" },
417
- limit: excess
418
- } });
419
- for (const record of oldest) {
420
- await backend.delete.mutate({ collection: ALERTS_COLLECTION, key: record.id });
421
- }
422
- }
423
- async enforceRetention() {
424
- const backend = this.ctx.api.settingsStore;
425
- if (!backend) return;
426
- const cutoff = Date.now() - this.config.retentionDays * 24 * 60 * 60 * 1e3;
427
- const expired = await backend.query.query({ collection: ALERTS_COLLECTION, filter: {
428
- where: { read: true },
429
- orderBy: { field: "createdAt", direction: "asc" }
430
- } });
431
- for (const record of expired) {
432
- if (Number(record.data["createdAt"] ?? 0) < cutoff) {
433
- await backend.delete.mutate({ collection: ALERTS_COLLECTION, key: record.id });
434
- }
435
- }
436
- }
119
+ var EVENT_SOURCE = {
120
+ type: "addon",
121
+ id: "alert-center"
437
122
  };
438
- var alerts_addon_default = AlertCenterAddon;
439
- // Annotate the CommonJS export names for ESM import in node:
440
- 0 && (module.exports = {
441
- AlertCenterAddon
442
- });
123
+ /**
124
+ * Alert Center addon core builtin that persists alerts in a
125
+ * structured SQLite table and serves them to the admin UI.
126
+ *
127
+ * Registers as an `alerts` collection provider and subscribes to
128
+ * important EventBus categories to create/update alerts automatically.
129
+ */
130
+ var AlertCenterAddon = class extends _camstack_types.BaseAddon {
131
+ unsubscribers = [];
132
+ constructor() {
133
+ super({ ...DEFAULT_CONFIG });
134
+ }
135
+ /**
136
+ * Per `(category, source.id)` counter used to rate-limit chatty
137
+ * events. Entries are pruned lazily when they age out of
138
+ * `RATE_LIMIT_WINDOW_MS`; see `shouldSuppressByRate()` below.
139
+ */
140
+ rateLimitCounters = /* @__PURE__ */ new Map();
141
+ async onInitialize() {
142
+ const alertsProvider = {
143
+ emit: (alert) => this.emitAlert(alert),
144
+ update: (input) => this.updateAlert(input.alertId, input.patch),
145
+ list: (filter) => this.listAlerts(filter),
146
+ getUnreadCount: () => this.getUnreadCount(),
147
+ markRead: (input) => this.markRead(input.alertId),
148
+ markAllRead: () => this.markAllRead(),
149
+ dismiss: (input) => this.dismiss(input.alertId)
150
+ };
151
+ const unsubs = [];
152
+ for (const category of TRACKED_CATEGORIES) {
153
+ const unsub = this.ctx.eventBus.subscribe({ category }, (event) => {
154
+ this.handleEvent(category, event);
155
+ });
156
+ unsubs.push(unsub);
157
+ }
158
+ this.unsubscribers = unsubs;
159
+ this.ctx.logger.info("Initialized", { meta: { trackedCategoriesCount: TRACKED_CATEGORIES.length } });
160
+ return [{
161
+ capability: _camstack_types.alertsCapability,
162
+ provider: alertsProvider
163
+ }];
164
+ }
165
+ async onShutdown() {
166
+ for (const unsub of this.unsubscribers) unsub();
167
+ this.unsubscribers = [];
168
+ }
169
+ globalSettingsSchema() {
170
+ return this.schema({ sections: [{
171
+ id: "alerts",
172
+ title: "Alert Center",
173
+ description: "Configure alert storage and retention.",
174
+ columns: 1,
175
+ fields: [this.field({
176
+ type: "number",
177
+ key: "maxAlerts",
178
+ label: "Maximum stored alerts",
179
+ description: "Oldest read alerts are deleted when this limit is exceeded.",
180
+ min: 50,
181
+ max: 5e3,
182
+ step: 50,
183
+ default: 500
184
+ }), this.field({
185
+ type: "number",
186
+ key: "retentionDays",
187
+ label: "Alert retention (days)",
188
+ description: "Alerts older than this are automatically removed.",
189
+ min: 1,
190
+ max: 365,
191
+ step: 1,
192
+ default: 30
193
+ })]
194
+ }] });
195
+ }
196
+ async listAlerts(filter) {
197
+ const backend = this.ctx.api.settingsStore;
198
+ if (!backend) return [];
199
+ const whereClause = {};
200
+ if (filter?.unreadOnly) whereClause.read = false;
201
+ return (await backend.query.query({
202
+ collection: ALERTS_COLLECTION,
203
+ filter: {
204
+ where: Object.keys(whereClause).length > 0 ? whereClause : void 0,
205
+ orderBy: {
206
+ field: "updatedAt",
207
+ direction: "desc"
208
+ },
209
+ limit: filter?.limit ?? 100
210
+ }
211
+ })).map(parseAlert);
212
+ }
213
+ async getUnreadCount() {
214
+ const backend = this.ctx.api.settingsStore;
215
+ if (!backend) return 0;
216
+ return backend.count.query({
217
+ collection: ALERTS_COLLECTION,
218
+ filter: { where: { read: false } }
219
+ });
220
+ }
221
+ async markRead(alertId) {
222
+ await this.mergeUpdate(alertId, {
223
+ read: true,
224
+ updatedAt: Date.now()
225
+ });
226
+ }
227
+ async markAllRead() {
228
+ const backend = this.ctx.api.settingsStore;
229
+ if (!backend) return;
230
+ const unread = await backend.query.query({
231
+ collection: ALERTS_COLLECTION,
232
+ filter: { where: { read: false } }
233
+ });
234
+ const now = Date.now();
235
+ for (const record of unread) await this.mergeUpdate(record.id, {
236
+ read: true,
237
+ updatedAt: now
238
+ });
239
+ }
240
+ async dismiss(alertId) {
241
+ await this.mergeUpdate(alertId, {
242
+ status: "dismissed",
243
+ read: true,
244
+ updatedAt: Date.now()
245
+ });
246
+ }
247
+ async handleEvent(category, event) {
248
+ try {
249
+ if (category === "model.download.progress") {
250
+ await this.handleModelDownload(event);
251
+ return;
252
+ }
253
+ if (category === _camstack_types.EventCategory.AddonLoadFailed) {
254
+ await this.handleAddonLoadFailed(event);
255
+ return;
256
+ }
257
+ if (category === _camstack_types.EventCategory.AddonLoadRecovered) {
258
+ await this.handleAddonLoadRecovered(event);
259
+ return;
260
+ }
261
+ const mapping = CATEGORY_MAPPINGS[category];
262
+ if (!mapping) return;
263
+ if (this.shouldSuppressByRate(category, event)) return;
264
+ const message = this.buildMessage(category, event.data);
265
+ const alert = {
266
+ id: crypto.randomUUID(),
267
+ category,
268
+ severity: mapping.severity,
269
+ title: mapping.titleTemplate,
270
+ message,
271
+ status: "active",
272
+ read: false,
273
+ createdAt: Date.now(),
274
+ updatedAt: Date.now(),
275
+ source: event.source ? {
276
+ type: event.source.type,
277
+ id: String(event.source.id)
278
+ } : void 0,
279
+ metadata: event.data
280
+ };
281
+ await this.emitAlert(alert);
282
+ } catch (err) {
283
+ this.ctx.logger?.warn("Failed to handle event", { meta: {
284
+ category,
285
+ error: (0, _camstack_types.errMsg)(err)
286
+ } });
287
+ }
288
+ }
289
+ async handleModelDownload(event) {
290
+ const data = event.data;
291
+ const modelId = data.modelId ?? "unknown";
292
+ const progress = data.progress ?? 0;
293
+ const stableId = `model-download:${modelId}`;
294
+ const backend = this.ctx.api.settingsStore;
295
+ if (!backend) return;
296
+ if ((await backend.query.query({
297
+ collection: ALERTS_COLLECTION,
298
+ filter: { where: { id: stableId } }
299
+ })).length > 0) {
300
+ const now = Date.now();
301
+ if (progress >= 100) {
302
+ await this.mergeUpdate(stableId, {
303
+ status: "completed",
304
+ progress: 100,
305
+ message: `Model "${modelId}" download completed`,
306
+ updatedAt: now
307
+ });
308
+ this.emitAlertUpdatedEvent(stableId, {
309
+ status: "completed",
310
+ progress: 100
311
+ });
312
+ } else if (progress < 0) {
313
+ await this.mergeUpdate(stableId, {
314
+ status: "failed",
315
+ message: `Model "${modelId}" download failed`,
316
+ updatedAt: now
317
+ });
318
+ this.emitAlertUpdatedEvent(stableId, { status: "failed" });
319
+ } else {
320
+ await this.mergeUpdate(stableId, {
321
+ progress,
322
+ message: `Downloading model "${modelId}" — ${String(Math.round(progress))}%`,
323
+ updatedAt: now
324
+ });
325
+ this.emitAlertUpdatedEvent(stableId, { progress });
326
+ }
327
+ } else {
328
+ const alert = {
329
+ id: stableId,
330
+ category: _camstack_types.EventCategory.ModelDownloadProgress,
331
+ severity: "info",
332
+ title: "Model download",
333
+ message: `Downloading model "${modelId}" — ${String(Math.round(progress))}%`,
334
+ status: "in-progress",
335
+ progress,
336
+ read: false,
337
+ createdAt: Date.now(),
338
+ updatedAt: Date.now(),
339
+ source: event.source ? {
340
+ type: event.source.type,
341
+ id: String(event.source.id)
342
+ } : void 0,
343
+ metadata: { modelId }
344
+ };
345
+ await this.persistAlert(alert);
346
+ this.emitAlertCreatedEvent(alert);
347
+ }
348
+ }
349
+ /**
350
+ * `[ALERT-CENTER-EVENTS]` — rate limit a `(category, source.id)`
351
+ * tuple. Returns `true` when the caller should DROP this event
352
+ * without persisting an alert, and `false` when the alert should
353
+ * proceed normally.
354
+ *
355
+ * Heuristic: the first `RATE_LIMIT_MAX_PER_SOURCE` events within a
356
+ * `RATE_LIMIT_WINDOW_MS` window go through. Once the threshold is
357
+ * crossed, subsequent events are suppressed until the window rolls
358
+ * over. When the threshold is first crossed, the suppression is
359
+ * logged once so operators know why they're not seeing the follow-
360
+ * up alerts; after the window rolls over the next event is
361
+ * un-suppressed and starts a new window.
362
+ */
363
+ shouldSuppressByRate(category, event) {
364
+ const sourceId = event.source?.id ?? "unknown";
365
+ const key = `${category}::${sourceId}`;
366
+ const now = Date.now();
367
+ const entry = this.rateLimitCounters.get(key);
368
+ if (!entry || now - entry.firstAt > RATE_LIMIT_WINDOW_MS) {
369
+ this.rateLimitCounters.set(key, {
370
+ firstAt: now,
371
+ count: 1,
372
+ suppressedLogged: false
373
+ });
374
+ return false;
375
+ }
376
+ entry.count += 1;
377
+ if (entry.count <= RATE_LIMIT_MAX_PER_SOURCE) return false;
378
+ if (!entry.suppressedLogged) {
379
+ entry.suppressedLogged = true;
380
+ this.ctx.logger?.info("rate-limiting suppressing remainder of window", { meta: {
381
+ category,
382
+ sourceId,
383
+ maxPerSource: RATE_LIMIT_MAX_PER_SOURCE,
384
+ windowSeconds: RATE_LIMIT_WINDOW_MS / 1e3
385
+ } });
386
+ }
387
+ return true;
388
+ }
389
+ /**
390
+ * AddonLoadFailed — kernel's AddonHealthMonitor has post-grace
391
+ * failed an addon load/init. Upsert a stable-id alert keyed by
392
+ * `addon-load-failed:<packageName>` so the recovery path can
393
+ * dismiss it. Severity=error, persistent until dismissed or
394
+ * auto-resolved.
395
+ *
396
+ * The action `retry` carries the package name so the admin UI can
397
+ * dispatch `addons.retryLoad(packageName)` directly from the alert
398
+ * card without the operator opening the Addons page.
399
+ */
400
+ async handleAddonLoadFailed(event) {
401
+ const data = event.data;
402
+ const packageName = String(data["packageName"] ?? "");
403
+ if (!packageName) return;
404
+ const addonId = data["addonId"];
405
+ const errorObj = data["error"];
406
+ const retryCount = Number(data["retryCount"] ?? 0);
407
+ const nextRetryAt = data["nextRetryAt"];
408
+ const stableId = `addon-load-failed:${packageName}`;
409
+ const message = errorObj?.message ? `${addonId ? `${addonId} — ` : ""}${errorObj.message}` : `Addon ${addonId ?? packageName} failed to load`;
410
+ const alert = {
411
+ id: stableId,
412
+ category: _camstack_types.EventCategory.AddonLoadFailed,
413
+ severity: "error",
414
+ title: `Addon failed: ${addonId ?? packageName}`,
415
+ message,
416
+ status: "active",
417
+ read: false,
418
+ createdAt: Date.now(),
419
+ updatedAt: Date.now(),
420
+ source: {
421
+ type: "addon",
422
+ id: packageName
423
+ },
424
+ metadata: {
425
+ packageName,
426
+ addonId,
427
+ retryCount,
428
+ nextRetryAt,
429
+ stack: errorObj?.stack
430
+ }
431
+ };
432
+ await this.emitAlert(alert);
433
+ }
434
+ /**
435
+ * AddonLoadRecovered — addon previously alerting is back to healthy.
436
+ * Dismiss the matching alert so the operator's badge count drops.
437
+ */
438
+ async handleAddonLoadRecovered(event) {
439
+ const data = event.data;
440
+ const packageName = String(data["packageName"] ?? "");
441
+ if (!packageName) return;
442
+ const stableId = `addon-load-failed:${packageName}`;
443
+ try {
444
+ await this.dismiss(stableId);
445
+ } catch (err) {
446
+ this.ctx.logger?.debug("AddonLoadRecovered: dismiss failed (likely already dismissed)", { meta: {
447
+ stableId,
448
+ error: (0, _camstack_types.errMsg)(err)
449
+ } });
450
+ }
451
+ }
452
+ buildMessage(category, data) {
453
+ const addonId = data.addonId;
454
+ const deviceId = data.deviceId;
455
+ const error = data.error;
456
+ const processId = data.processId;
457
+ switch (category) {
458
+ case "addon.crashed": return `Addon "${addonId ?? "unknown"}" crashed${error ? `: ${error}` : ""}`;
459
+ case "addon.error": return `Addon "${addonId ?? "unknown"}" error${error ? `: ${error}` : ""}`;
460
+ case "addon.installed": return `Addon "${addonId ?? "unknown"}" installed`;
461
+ case "addon.updated": {
462
+ const from = data.fromVersion;
463
+ const to = data.toVersion;
464
+ return `Addon "${addonId ?? "unknown"}" updated${from && to ? ` from ${from} to ${to}` : ""}`;
465
+ }
466
+ case "addon.uninstalled": return `Addon "${addonId ?? "unknown"}" uninstalled`;
467
+ case "device.registered": return `Device "${data.name ?? deviceId ?? "unknown"}" registered`;
468
+ case "device.unregistered": return `Device "${deviceId ?? "unknown"}" unregistered`;
469
+ case "agent.online": return `Agent "${data.agentId ?? data.nodeId ?? "unknown"}" connected`;
470
+ case "agent.offline": return `Agent "${data.agentId ?? data.nodeId ?? "unknown"}" disconnected${data.reason ? `: ${String(data.reason)}` : ""}`;
471
+ case "backup.completed": return `Backup completed${data.targetId ? ` (${String(data.targetId)})` : ""}`;
472
+ case "backup.restored": return `Backup restored${data.source ? ` from ${String(data.source)}` : ""}`;
473
+ case "notification.failed": return `Notification failed${error ? `: ${error}` : ""}`;
474
+ case "system.restarting": return `System restarting${data.reason ? ` — ${String(data.reason)}` : ""}`;
475
+ case "recording.error": return `Recording error on device "${deviceId ?? "unknown"}"${error ? `: ${error}` : ""}`;
476
+ case "recording.storage.critical": return `Storage critical for device "${deviceId ?? "unknown"}"`;
477
+ case "system.boot": return `System booted in "${data.mode ?? "unknown"}" mode`;
478
+ case "process.crashed": return `Process "${processId ?? "unknown"}" crashed`;
479
+ default: return `Event: ${category}`;
480
+ }
481
+ }
482
+ async emitAlert(alert) {
483
+ await this.persistAlert(alert);
484
+ this.emitAlertCreatedEvent(alert);
485
+ await this.enforceMaxAlerts();
486
+ await this.enforceRetention();
487
+ }
488
+ async updateAlert(alertId, patch) {
489
+ await this.mergeUpdate(alertId, {
490
+ ...patch,
491
+ updatedAt: Date.now()
492
+ });
493
+ this.emitAlertUpdatedEvent(alertId, patch);
494
+ }
495
+ /**
496
+ * Read-merge-write: SettingsBackend.update() replaces the entire `data` blob,
497
+ * so we must read the existing record, merge the patch, and write back.
498
+ */
499
+ async mergeUpdate(id, patch) {
500
+ const backend = this.ctx.api.settingsStore;
501
+ if (!backend) return;
502
+ const raw = await backend.get.query({
503
+ collection: ALERTS_COLLECTION,
504
+ key: id
505
+ });
506
+ if (raw === null || raw === void 0 || typeof raw !== "object") return;
507
+ const existing = Object.fromEntries(Object.entries(raw));
508
+ await backend.set.mutate({
509
+ collection: ALERTS_COLLECTION,
510
+ key: id,
511
+ value: {
512
+ ...existing,
513
+ ...patch
514
+ }
515
+ });
516
+ }
517
+ async persistAlert(alert) {
518
+ const backend = this.ctx.api.settingsStore;
519
+ if (!backend) return;
520
+ const data = {
521
+ id: alert.id,
522
+ category: alert.category,
523
+ severity: alert.severity,
524
+ title: alert.title,
525
+ message: alert.message,
526
+ status: alert.status,
527
+ read: alert.read,
528
+ createdAt: alert.createdAt,
529
+ updatedAt: alert.updatedAt,
530
+ ...alert.progress !== void 0 ? { progress: alert.progress } : {},
531
+ ...alert.source ? { source: alert.source } : {},
532
+ ...alert.metadata ? { metadata: alert.metadata } : {}
533
+ };
534
+ await backend.set.mutate({
535
+ collection: ALERTS_COLLECTION,
536
+ key: alert.id,
537
+ value: data
538
+ });
539
+ }
540
+ emitAlertCreatedEvent(alert) {
541
+ this.ctx.eventBus?.emit((0, _camstack_types.createEvent)("alert.created", EVENT_SOURCE, {
542
+ id: alert.id,
543
+ category: alert.category,
544
+ severity: alert.severity,
545
+ title: alert.title,
546
+ status: alert.status
547
+ }));
548
+ }
549
+ emitAlertUpdatedEvent(alertId, patch) {
550
+ const patchRecord = {};
551
+ for (const [key, value] of Object.entries(patch)) patchRecord[key] = value;
552
+ this.ctx.eventBus?.emit((0, _camstack_types.createEvent)("alert.updated", EVENT_SOURCE, {
553
+ alertId,
554
+ patch: patchRecord
555
+ }));
556
+ }
557
+ async enforceMaxAlerts() {
558
+ const backend = this.ctx.api.settingsStore;
559
+ if (!backend) return;
560
+ const total = await backend.count.query({ collection: ALERTS_COLLECTION });
561
+ if (total <= this.config.maxAlerts) return;
562
+ const excess = total - this.config.maxAlerts;
563
+ const oldest = await backend.query.query({
564
+ collection: ALERTS_COLLECTION,
565
+ filter: {
566
+ where: { read: true },
567
+ orderBy: {
568
+ field: "createdAt",
569
+ direction: "asc"
570
+ },
571
+ limit: excess
572
+ }
573
+ });
574
+ for (const record of oldest) await backend.delete.mutate({
575
+ collection: ALERTS_COLLECTION,
576
+ key: record.id
577
+ });
578
+ }
579
+ async enforceRetention() {
580
+ const backend = this.ctx.api.settingsStore;
581
+ if (!backend) return;
582
+ const cutoff = Date.now() - this.config.retentionDays * 24 * 60 * 60 * 1e3;
583
+ const expired = await backend.query.query({
584
+ collection: ALERTS_COLLECTION,
585
+ filter: {
586
+ where: { read: true },
587
+ orderBy: {
588
+ field: "createdAt",
589
+ direction: "asc"
590
+ }
591
+ }
592
+ });
593
+ for (const record of expired) if (Number(record.data["createdAt"] ?? 0) < cutoff) await backend.delete.mutate({
594
+ collection: ALERTS_COLLECTION,
595
+ key: record.id
596
+ });
597
+ }
598
+ };
599
+ //#endregion
600
+ exports.AlertCenterAddon = AlertCenterAddon;
601
+ exports.default = AlertCenterAddon;
602
+
443
603
  //# sourceMappingURL=alerts.addon.js.map