@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 +1 @@
1
- {"version":3,"sources":["../../../src/builtins/alerts/alerts.addon.ts"],"sourcesContent":["import {\n EventCategory,\n type KnownEventCategory,\n type SystemEvent,\n type ProviderRegistration,\n} from '@camstack/types'\nimport type { Alert, AlertSeverity, AlertStatus } from '@camstack/types'\nimport { BaseAddon, AlertSchema, alertsCapability, createEvent , errMsg } from '@camstack/types'\n\n// ── Category → severity mapping ─────────────────────────────────────\n\ninterface CategoryMapping {\n readonly severity: AlertSeverity\n readonly titleTemplate: string\n}\n\nconst CATEGORY_MAPPINGS: Readonly<Record<string, CategoryMapping>> = {\n // ── Critical — always surface ──────────────────────────────────────\n 'addon.crashed': { severity: 'error', titleTemplate: 'Addon crashed' },\n 'addon.error': { severity: 'error', titleTemplate: 'Addon error' },\n 'process.crashed': { severity: 'error', titleTemplate: 'Process crashed' },\n 'recording.error': { severity: 'error', titleTemplate: 'Recording error' },\n 'recording.storage.critical': { severity: 'warning', titleTemplate: 'Storage critical' },\n 'notification.failed': { severity: 'error', titleTemplate: 'Notification failed' },\n\n // ── Cluster — agent connect/disconnect ─────────────────────────────\n 'agent.online': { severity: 'info', titleTemplate: 'Agent connected' },\n 'agent.offline': { severity: 'warning', titleTemplate: 'Agent disconnected' },\n\n // ── System lifecycle ──────────────────────────────────────────────\n 'system.boot': { severity: 'info', titleTemplate: 'System boot' },\n 'system.restarting': { severity: 'warning', titleTemplate: 'System restarting' },\n\n // ── Device lifecycle (add/remove only, not settings tweaks) ───────\n 'device.registered': { severity: 'info', titleTemplate: 'Device registered' },\n 'device.unregistered': { severity: 'warning', titleTemplate: 'Device unregistered' },\n\n // ── Package management ────────────────────────────────────────────\n 'addon.installed': { severity: 'info', titleTemplate: 'Addon installed' },\n 'addon.updated': { severity: 'info', titleTemplate: 'Addon updated' },\n 'addon.uninstalled': { severity: 'info', titleTemplate: 'Addon uninstalled' },\n\n // ── Backup (rare, important) ──────────────────────────────────────\n 'backup.completed': { severity: 'info', titleTemplate: 'Backup completed' },\n 'backup.restored': { severity: 'info', titleTemplate: 'Backup restored' },\n\n // ── Model downloads (in-progress merging path) ────────────────────\n 'model.download.progress': { severity: 'info', titleTemplate: 'Model download' },\n}\n\nconst TRACKED_CATEGORIES = Object.keys(CATEGORY_MAPPINGS)\n\n/**\n * `[ALERT-CENTER-EVENTS]` — rate limiting. Events that fire thousands of\n * times a minute (flaky cam reconnecting, chatty integration, …) would\n * flood the alert feed and push genuinely important alerts off the\n * visible page. We collapse bursts into a single throttled summary per\n * `(category, source.id)` tuple: the first N events within the window\n * still surface as individual alerts, but once the source crosses the\n * threshold we stop emitting alerts for it and wait out the window.\n *\n * A standalone category-count map is cleared on every window rollover.\n * Keep the threshold generous enough that legitimate bursts of ~a few\n * per minute still get through, but strict enough that a reconnect loop\n * firing every second gets muted.\n */\nconst RATE_LIMIT_WINDOW_MS = 60_000\nconst RATE_LIMIT_MAX_PER_SOURCE = 5\n\n/** Parse a raw settings record into a validated Alert. */\nfunction parseAlert(record: { id: string; data: Record<string, unknown> }): Alert {\n return AlertSchema.parse({ id: record.id, ...record.data })\n}\n\n// ── Alert Center Addon ─────────────────────────────────────────────\n\ninterface AlertCenterConfig {\n readonly maxAlerts: number\n readonly retentionDays: number\n}\n\nconst DEFAULT_CONFIG: AlertCenterConfig = {\n maxAlerts: 500,\n retentionDays: 30,\n}\n\nconst ALERTS_COLLECTION = 'alerts'\nconst EVENT_SOURCE = { type: 'addon', id: 'alert-center' } as const\n\n/**\n * Alert Center addon — core builtin that persists alerts in a\n * structured SQLite table and serves them to the admin UI.\n *\n * Registers as an `alerts` collection provider and subscribes to\n * important EventBus categories to create/update alerts automatically.\n */\nexport class AlertCenterAddon extends BaseAddon<AlertCenterConfig> {\n private unsubscribers: readonly (() => void)[] = []\n\n constructor() {\n super({ ...DEFAULT_CONFIG })\n }\n\n /**\n * Per `(category, source.id)` counter used to rate-limit chatty\n * events. Entries are pruned lazily when they age out of\n * `RATE_LIMIT_WINDOW_MS`; see `shouldSuppressByRate()` below.\n */\n private readonly rateLimitCounters = new Map<string, { firstAt: number; count: number; suppressedLogged: boolean }>()\n\n protected async onInitialize(): Promise<ProviderRegistration[]> {\n const alertsProvider = {\n emit: (alert: Alert) => this.emitAlert(alert),\n update: (input: { alertId: string; patch: Partial<Alert> }) =>\n this.updateAlert(input.alertId, input.patch),\n list: (filter?: { unreadOnly?: boolean; limit?: number }) =>\n this.listAlerts(filter),\n getUnreadCount: () => this.getUnreadCount(),\n markRead: (input: { alertId: string }) => this.markRead(input.alertId),\n markAllRead: () => this.markAllRead(),\n dismiss: (input: { alertId: string }) => this.dismiss(input.alertId),\n }\n\n const unsubs: (() => void)[] = []\n for (const category of TRACKED_CATEGORIES) {\n const unsub = this.ctx.eventBus.subscribe(\n { category: category as KnownEventCategory },\n (event: SystemEvent) => { void this.handleEvent(category, event) },\n )\n unsubs.push(unsub)\n }\n this.unsubscribers = unsubs\n\n this.ctx.logger.info('Initialized', { meta: { trackedCategoriesCount: TRACKED_CATEGORIES.length } })\n return [{ capability: alertsCapability, provider: alertsProvider }]\n }\n\n protected async onShutdown(): Promise<void> {\n for (const unsub of this.unsubscribers) {\n unsub()\n }\n this.unsubscribers = []\n }\n\n protected globalSettingsSchema() {\n return this.schema({\n sections: [{\n id: 'alerts',\n title: 'Alert Center',\n description: 'Configure alert storage and retention.',\n columns: 1,\n fields: [\n this.field({\n type: 'number', key: 'maxAlerts', label: 'Maximum stored alerts',\n description: 'Oldest read alerts are deleted when this limit is exceeded.',\n min: 50, max: 5000, step: 50, default: 500,\n }),\n this.field({\n type: 'number', key: 'retentionDays', label: 'Alert retention (days)',\n description: 'Alerts older than this are automatically removed.',\n min: 1, max: 365, step: 1, default: 30,\n }),\n ],\n }],\n })\n }\n\n // ── Public methods (called by the tRPC router) ────────────────────\n\n async listAlerts(filter?: { unreadOnly?: boolean; limit?: number }): Promise<readonly Alert[]> {\n const backend = this.ctx.api.settingsStore\n if (!backend) return []\n\n const whereClause: Record<string, unknown> = {}\n if (filter?.unreadOnly) {\n whereClause.read = false\n }\n\n const records = await backend.query.query({ collection: ALERTS_COLLECTION, filter: {\n where: Object.keys(whereClause).length > 0 ? whereClause : undefined,\n orderBy: { field: 'updatedAt', direction: 'desc' },\n limit: filter?.limit ?? 100,\n } })\n\n return records.map(parseAlert)\n }\n\n async getUnreadCount(): Promise<number> {\n const backend = this.ctx.api.settingsStore\n if (!backend) return 0\n\n return backend.count.query({ collection: ALERTS_COLLECTION, filter: { where: { read: false } } })\n }\n\n async markRead(alertId: string): Promise<void> {\n await this.mergeUpdate(alertId, { read: true, updatedAt: Date.now() })\n }\n\n async markAllRead(): Promise<void> {\n const backend = this.ctx.api.settingsStore\n if (!backend) return\n\n const unread = await backend.query.query({ collection: ALERTS_COLLECTION, filter: { where: { read: false } } })\n const now = Date.now()\n for (const record of unread) {\n await this.mergeUpdate(record.id, { read: true, updatedAt: now })\n }\n }\n\n async dismiss(alertId: string): Promise<void> {\n await this.mergeUpdate(alertId, {\n status: 'dismissed' satisfies AlertStatus,\n read: true,\n updatedAt: Date.now(),\n })\n }\n\n // ── Private: event handling ──────────────────────────────────────\n\n private async handleEvent(category: string, event: SystemEvent): Promise<void> {\n try {\n if (category === 'model.download.progress') {\n // Model download progress has its own in-progress merging path\n // that intentionally overwrites a single alert per model, so\n // rate limiting does not apply here — the merger itself is the\n // collapse mechanism.\n await this.handleModelDownload(event)\n return\n }\n\n const mapping = CATEGORY_MAPPINGS[category]\n if (!mapping) return\n\n if (this.shouldSuppressByRate(category, event)) return\n\n const message = this.buildMessage(category, event.data)\n const alert: Alert = {\n id: crypto.randomUUID(),\n category,\n severity: mapping.severity,\n title: mapping.titleTemplate,\n message,\n status: 'active',\n read: false,\n createdAt: Date.now(),\n updatedAt: Date.now(),\n source: event.source ? { type: event.source.type, id: String(event.source.id) } : undefined,\n metadata: event.data,\n }\n\n await this.emitAlert(alert)\n } catch (err) {\n this.ctx.logger?.warn(\n 'Failed to handle event',\n { meta: { category, error: errMsg(err) } },\n )\n }\n }\n\n private async handleModelDownload(event: SystemEvent): Promise<void> {\n const data = event.data\n const modelId = (data.modelId as string | undefined) ?? 'unknown'\n const progress = (data.progress as number | undefined) ?? 0\n const stableId = `model-download:${modelId}`\n\n const backend = this.ctx.api.settingsStore\n if (!backend) return\n\n // Check if an in-progress alert already exists for this model\n const existing = await backend.query.query({ collection: ALERTS_COLLECTION, filter: {\n where: { id: stableId },\n } })\n\n if (existing.length > 0) {\n // Update existing alert (read-merge-write)\n const now = Date.now()\n if (progress >= 100) {\n await this.mergeUpdate(stableId, {\n status: 'completed' satisfies AlertStatus,\n progress: 100,\n message: `Model \"${modelId}\" download completed`,\n updatedAt: now,\n })\n this.emitAlertUpdatedEvent(stableId, { status: 'completed', progress: 100 })\n } else if (progress < 0) {\n await this.mergeUpdate(stableId, {\n status: 'failed' satisfies AlertStatus,\n message: `Model \"${modelId}\" download failed`,\n updatedAt: now,\n })\n this.emitAlertUpdatedEvent(stableId, { status: 'failed' })\n } else {\n await this.mergeUpdate(stableId, {\n progress,\n message: `Downloading model \"${modelId}\" — ${String(Math.round(progress))}%`,\n updatedAt: now,\n })\n this.emitAlertUpdatedEvent(stableId, { progress })\n }\n } else {\n // Create new in-progress alert\n const alert: Alert = {\n id: stableId,\n category: EventCategory.ModelDownloadProgress,\n severity: 'info',\n title: 'Model download',\n message: `Downloading model \"${modelId}\" — ${String(Math.round(progress))}%`,\n status: 'in-progress',\n progress,\n read: false,\n createdAt: Date.now(),\n updatedAt: Date.now(),\n source: event.source ? { type: event.source.type, id: String(event.source.id) } : undefined,\n metadata: { modelId },\n }\n\n await this.persistAlert(alert)\n this.emitAlertCreatedEvent(alert)\n }\n }\n\n /**\n * `[ALERT-CENTER-EVENTS]` — rate limit a `(category, source.id)`\n * tuple. Returns `true` when the caller should DROP this event\n * without persisting an alert, and `false` when the alert should\n * proceed normally.\n *\n * Heuristic: the first `RATE_LIMIT_MAX_PER_SOURCE` events within a\n * `RATE_LIMIT_WINDOW_MS` window go through. Once the threshold is\n * crossed, subsequent events are suppressed until the window rolls\n * over. When the threshold is first crossed, the suppression is\n * logged once so operators know why they're not seeing the follow-\n * up alerts; after the window rolls over the next event is\n * un-suppressed and starts a new window.\n */\n private shouldSuppressByRate(category: string, event: SystemEvent): boolean {\n const sourceId = event.source?.id ?? 'unknown'\n const key = `${category}::${sourceId}`\n const now = Date.now()\n const entry = this.rateLimitCounters.get(key)\n\n if (!entry || now - entry.firstAt > RATE_LIMIT_WINDOW_MS) {\n // First event of a new window — always allow, start the counter.\n this.rateLimitCounters.set(key, { firstAt: now, count: 1, suppressedLogged: false })\n return false\n }\n\n entry.count += 1\n if (entry.count <= RATE_LIMIT_MAX_PER_SOURCE) return false\n\n // Over threshold — suppress the rest of this window.\n if (!entry.suppressedLogged) {\n entry.suppressedLogged = true\n this.ctx.logger?.info(\n 'rate-limiting suppressing remainder of window',\n { meta: { category, sourceId, maxPerSource: RATE_LIMIT_MAX_PER_SOURCE, windowSeconds: RATE_LIMIT_WINDOW_MS / 1000 } },\n )\n }\n return true\n }\n\n private buildMessage(category: string, data: Record<string, unknown>): string {\n const addonId = data.addonId as string | undefined\n const deviceId = data.deviceId as string | undefined\n const error = data.error as string | undefined\n const processId = data.processId as string | undefined\n\n switch (category) {\n case 'addon.crashed':\n return `Addon \"${addonId ?? 'unknown'}\" crashed${error ? `: ${error}` : ''}`\n case 'addon.error':\n return `Addon \"${addonId ?? 'unknown'}\" error${error ? `: ${error}` : ''}`\n case 'addon.installed':\n return `Addon \"${addonId ?? 'unknown'}\" installed`\n case 'addon.updated': {\n const from = data.fromVersion as string | undefined\n const to = data.toVersion as string | undefined\n return `Addon \"${addonId ?? 'unknown'}\" updated${from && to ? ` from ${from} to ${to}` : ''}`\n }\n case 'addon.uninstalled':\n return `Addon \"${addonId ?? 'unknown'}\" uninstalled`\n case 'device.registered':\n return `Device \"${data.name as string | undefined ?? deviceId ?? 'unknown'}\" registered`\n case 'device.unregistered':\n return `Device \"${deviceId ?? 'unknown'}\" unregistered`\n case 'agent.online':\n return `Agent \"${data.agentId as string | undefined ?? data.nodeId as string | undefined ?? 'unknown'}\" connected`\n case 'agent.offline':\n return `Agent \"${data.agentId as string | undefined ?? data.nodeId as string | undefined ?? 'unknown'}\" disconnected${data.reason ? `: ${String(data.reason)}` : ''}`\n case 'backup.completed':\n return `Backup completed${data.targetId ? ` (${String(data.targetId)})` : ''}`\n case 'backup.restored':\n return `Backup restored${data.source ? ` from ${String(data.source)}` : ''}`\n case 'notification.failed':\n return `Notification failed${error ? `: ${error}` : ''}`\n case 'system.restarting':\n return `System restarting${data.reason ? ` — ${String(data.reason)}` : ''}`\n case 'recording.error':\n return `Recording error on device \"${deviceId ?? 'unknown'}\"${error ? `: ${error}` : ''}`\n case 'recording.storage.critical':\n return `Storage critical for device \"${deviceId ?? 'unknown'}\"`\n case 'system.boot':\n return `System booted in \"${data.mode as string | undefined ?? 'unknown'}\" mode`\n case 'process.crashed':\n return `Process \"${processId ?? 'unknown'}\" crashed`\n default:\n return `Event: ${category}`\n }\n }\n\n // ── Private: persistence ─────────────────────────────────────────\n\n private async emitAlert(alert: Alert): Promise<void> {\n await this.persistAlert(alert)\n this.emitAlertCreatedEvent(alert)\n await this.enforceMaxAlerts()\n await this.enforceRetention()\n }\n\n private async updateAlert(alertId: string, patch: Partial<Alert>): Promise<void> {\n await this.mergeUpdate(alertId, { ...patch, updatedAt: Date.now() })\n this.emitAlertUpdatedEvent(alertId, patch)\n }\n\n /**\n * Read-merge-write: SettingsBackend.update() replaces the entire `data` blob,\n * so we must read the existing record, merge the patch, and write back.\n */\n private async mergeUpdate(id: string, patch: Record<string, unknown>): Promise<void> {\n const backend = this.ctx.api.settingsStore\n if (!backend) return\n\n const raw = await backend.get.query({ collection: ALERTS_COLLECTION, key: id })\n if (raw === null || raw === undefined || typeof raw !== 'object') return\n const existing: Record<string, unknown> = Object.fromEntries(Object.entries(raw))\n await backend.set.mutate({ collection: ALERTS_COLLECTION, key: id, value: { ...existing, ...patch } })\n }\n\n private async persistAlert(alert: Alert): Promise<void> {\n const backend = this.ctx.api.settingsStore\n if (!backend) return\n\n // Serialize alert to a plain Record for SQLite JSON storage\n const data: Record<string, unknown> = {\n id: alert.id,\n category: alert.category,\n severity: alert.severity,\n title: alert.title,\n message: alert.message,\n status: alert.status,\n read: alert.read,\n createdAt: alert.createdAt,\n updatedAt: alert.updatedAt,\n ...(alert.progress !== undefined ? { progress: alert.progress } : {}),\n ...(alert.source ? { source: alert.source } : {}),\n ...(alert.metadata ? { metadata: alert.metadata } : {}),\n }\n await backend.set.mutate({ collection: ALERTS_COLLECTION, key: alert.id, value: data })\n }\n\n private emitAlertCreatedEvent(alert: Alert): void {\n this.ctx.eventBus?.emit(createEvent('alert.created', EVENT_SOURCE, {\n id: alert.id,\n category: alert.category,\n severity: alert.severity,\n title: alert.title,\n status: alert.status,\n }))\n }\n\n private emitAlertUpdatedEvent(alertId: string, patch: Partial<Alert>): void {\n const patchRecord: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(patch)) {\n patchRecord[key] = value\n }\n this.ctx.eventBus?.emit(createEvent('alert.updated', EVENT_SOURCE, {\n alertId,\n patch: patchRecord,\n }))\n }\n\n private async enforceMaxAlerts(): Promise<void> {\n const backend = this.ctx.api.settingsStore\n if (!backend) return\n\n const total = await backend.count.query({ collection: ALERTS_COLLECTION })\n if (total <= this.config.maxAlerts) return\n\n // Delete oldest read alerts\n const excess = total - this.config.maxAlerts\n const oldest = await backend.query.query({ collection: ALERTS_COLLECTION, filter: {\n where: { read: true },\n orderBy: { field: 'createdAt', direction: 'asc' },\n limit: excess,\n } })\n\n for (const record of oldest) {\n await backend.delete.mutate({ collection: ALERTS_COLLECTION, key: record.id })\n }\n }\n\n private async enforceRetention(): Promise<void> {\n const backend = this.ctx.api.settingsStore\n if (!backend) return\n\n const cutoff = Date.now() - this.config.retentionDays * 24 * 60 * 60 * 1000\n const expired = await backend.query.query({ collection: ALERTS_COLLECTION, filter: {\n where: { read: true },\n orderBy: { field: 'createdAt', direction: 'asc' },\n } })\n\n for (const record of expired) {\n if (Number(record.data['createdAt'] ?? 0) < cutoff) {\n await backend.delete.mutate({ collection: ALERTS_COLLECTION, key: record.id })\n }\n }\n }\n}\n\nexport default AlertCenterAddon\n"],"mappings":"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","names":["import_types"]}
1
+ {"version":3,"file":"alerts.addon.js","names":[],"sources":["../../../src/builtins/alerts/alerts.addon.ts"],"sourcesContent":["import {\n EventCategory,\n type KnownEventCategory,\n type SystemEvent,\n type ProviderRegistration,\n} from '@camstack/types'\nimport type { Alert, AlertSeverity, AlertStatus } from '@camstack/types'\nimport { BaseAddon, AlertSchema, alertsCapability, createEvent , errMsg } from '@camstack/types'\n\n// ── Category → severity mapping ─────────────────────────────────────\n\ninterface CategoryMapping {\n readonly severity: AlertSeverity\n readonly titleTemplate: string\n}\n\nconst CATEGORY_MAPPINGS: Readonly<Record<string, CategoryMapping>> = {\n // ── Critical — always surface ──────────────────────────────────────\n 'addon.crashed': { severity: 'error', titleTemplate: 'Addon crashed' },\n 'addon.error': { severity: 'error', titleTemplate: 'Addon error' },\n 'process.crashed': { severity: 'error', titleTemplate: 'Process crashed' },\n 'recording.error': { severity: 'error', titleTemplate: 'Recording error' },\n 'recording.storage.critical': { severity: 'warning', titleTemplate: 'Storage critical' },\n 'notification.failed': { severity: 'error', titleTemplate: 'Notification failed' },\n\n // ── Cluster — agent connect/disconnect ─────────────────────────────\n 'agent.online': { severity: 'info', titleTemplate: 'Agent connected' },\n 'agent.offline': { severity: 'warning', titleTemplate: 'Agent disconnected' },\n\n // ── System lifecycle ──────────────────────────────────────────────\n 'system.boot': { severity: 'info', titleTemplate: 'System boot' },\n 'system.restarting': { severity: 'warning', titleTemplate: 'System restarting' },\n\n // ── Device lifecycle (add/remove only, not settings tweaks) ───────\n 'device.registered': { severity: 'info', titleTemplate: 'Device registered' },\n 'device.unregistered': { severity: 'warning', titleTemplate: 'Device unregistered' },\n\n // ── Package management ────────────────────────────────────────────\n 'addon.installed': { severity: 'info', titleTemplate: 'Addon installed' },\n 'addon.updated': { severity: 'info', titleTemplate: 'Addon updated' },\n 'addon.uninstalled': { severity: 'info', titleTemplate: 'Addon uninstalled' },\n\n // ── Addon health (kernel-level monitor — emitted post-grace) ──────\n // `addon.load-failed` and `addon.load-recovered` use a stable id\n // pattern (`addon-load-failed:<packageName>`) so the recovery path\n // can dismiss the matching active alert. See handleAddonLoadFailed\n // / handleAddonLoadRecovered below — those bypass CATEGORY_MAPPINGS\n // for the merge logic, but the mapping entries here also drive the\n // severity / title for the generic surface.\n 'addon.load-failed': { severity: 'error', titleTemplate: 'Addon failed to load' },\n 'addon.load-recovered': { severity: 'info', titleTemplate: 'Addon recovered' },\n\n // ── Backup (rare, important) ──────────────────────────────────────\n 'backup.completed': { severity: 'info', titleTemplate: 'Backup completed' },\n 'backup.restored': { severity: 'info', titleTemplate: 'Backup restored' },\n\n // ── Model downloads (in-progress merging path) ────────────────────\n 'model.download.progress': { severity: 'info', titleTemplate: 'Model download' },\n}\n\nconst TRACKED_CATEGORIES = Object.keys(CATEGORY_MAPPINGS)\n\n/**\n * `[ALERT-CENTER-EVENTS]` — rate limiting. Events that fire thousands of\n * times a minute (flaky cam reconnecting, chatty integration, …) would\n * flood the alert feed and push genuinely important alerts off the\n * visible page. We collapse bursts into a single throttled summary per\n * `(category, source.id)` tuple: the first N events within the window\n * still surface as individual alerts, but once the source crosses the\n * threshold we stop emitting alerts for it and wait out the window.\n *\n * A standalone category-count map is cleared on every window rollover.\n * Keep the threshold generous enough that legitimate bursts of ~a few\n * per minute still get through, but strict enough that a reconnect loop\n * firing every second gets muted.\n */\nconst RATE_LIMIT_WINDOW_MS = 60_000\nconst RATE_LIMIT_MAX_PER_SOURCE = 5\n\n/** Parse a raw settings record into a validated Alert. */\nfunction parseAlert(record: { id: string; data: Record<string, unknown> }): Alert {\n return AlertSchema.parse({ id: record.id, ...record.data })\n}\n\n// ── Alert Center Addon ─────────────────────────────────────────────\n\ninterface AlertCenterConfig {\n readonly maxAlerts: number\n readonly retentionDays: number\n}\n\nconst DEFAULT_CONFIG: AlertCenterConfig = {\n maxAlerts: 500,\n retentionDays: 30,\n}\n\nconst ALERTS_COLLECTION = 'alerts'\nconst EVENT_SOURCE = { type: 'addon', id: 'alert-center' } as const\n\n/**\n * Alert Center addon — core builtin that persists alerts in a\n * structured SQLite table and serves them to the admin UI.\n *\n * Registers as an `alerts` collection provider and subscribes to\n * important EventBus categories to create/update alerts automatically.\n */\nexport class AlertCenterAddon extends BaseAddon<AlertCenterConfig> {\n private unsubscribers: readonly (() => void)[] = []\n\n constructor() {\n super({ ...DEFAULT_CONFIG })\n }\n\n /**\n * Per `(category, source.id)` counter used to rate-limit chatty\n * events. Entries are pruned lazily when they age out of\n * `RATE_LIMIT_WINDOW_MS`; see `shouldSuppressByRate()` below.\n */\n private readonly rateLimitCounters = new Map<string, { firstAt: number; count: number; suppressedLogged: boolean }>()\n\n protected async onInitialize(): Promise<ProviderRegistration[]> {\n const alertsProvider = {\n emit: (alert: Alert) => this.emitAlert(alert),\n update: (input: { alertId: string; patch: Partial<Alert> }) =>\n this.updateAlert(input.alertId, input.patch),\n list: (filter?: { unreadOnly?: boolean; limit?: number }) =>\n this.listAlerts(filter),\n getUnreadCount: () => this.getUnreadCount(),\n markRead: (input: { alertId: string }) => this.markRead(input.alertId),\n markAllRead: () => this.markAllRead(),\n dismiss: (input: { alertId: string }) => this.dismiss(input.alertId),\n }\n\n const unsubs: (() => void)[] = []\n for (const category of TRACKED_CATEGORIES) {\n const unsub = this.ctx.eventBus.subscribe(\n { category: category as KnownEventCategory },\n (event: SystemEvent) => { void this.handleEvent(category, event) },\n )\n unsubs.push(unsub)\n }\n this.unsubscribers = unsubs\n\n this.ctx.logger.info('Initialized', { meta: { trackedCategoriesCount: TRACKED_CATEGORIES.length } })\n return [{ capability: alertsCapability, provider: alertsProvider }]\n }\n\n protected async onShutdown(): Promise<void> {\n for (const unsub of this.unsubscribers) {\n unsub()\n }\n this.unsubscribers = []\n }\n\n protected globalSettingsSchema() {\n return this.schema({\n sections: [{\n id: 'alerts',\n title: 'Alert Center',\n description: 'Configure alert storage and retention.',\n columns: 1,\n fields: [\n this.field({\n type: 'number', key: 'maxAlerts', label: 'Maximum stored alerts',\n description: 'Oldest read alerts are deleted when this limit is exceeded.',\n min: 50, max: 5000, step: 50, default: 500,\n }),\n this.field({\n type: 'number', key: 'retentionDays', label: 'Alert retention (days)',\n description: 'Alerts older than this are automatically removed.',\n min: 1, max: 365, step: 1, default: 30,\n }),\n ],\n }],\n })\n }\n\n // ── Public methods (called by the tRPC router) ────────────────────\n\n async listAlerts(filter?: { unreadOnly?: boolean; limit?: number }): Promise<readonly Alert[]> {\n const backend = this.ctx.api.settingsStore\n if (!backend) return []\n\n const whereClause: Record<string, unknown> = {}\n if (filter?.unreadOnly) {\n whereClause.read = false\n }\n\n const records = await backend.query.query({ collection: ALERTS_COLLECTION, filter: {\n where: Object.keys(whereClause).length > 0 ? whereClause : undefined,\n orderBy: { field: 'updatedAt', direction: 'desc' },\n limit: filter?.limit ?? 100,\n } })\n\n return records.map(parseAlert)\n }\n\n async getUnreadCount(): Promise<number> {\n const backend = this.ctx.api.settingsStore\n if (!backend) return 0\n\n return backend.count.query({ collection: ALERTS_COLLECTION, filter: { where: { read: false } } })\n }\n\n async markRead(alertId: string): Promise<void> {\n await this.mergeUpdate(alertId, { read: true, updatedAt: Date.now() })\n }\n\n async markAllRead(): Promise<void> {\n const backend = this.ctx.api.settingsStore\n if (!backend) return\n\n const unread = await backend.query.query({ collection: ALERTS_COLLECTION, filter: { where: { read: false } } })\n const now = Date.now()\n for (const record of unread) {\n await this.mergeUpdate(record.id, { read: true, updatedAt: now })\n }\n }\n\n async dismiss(alertId: string): Promise<void> {\n await this.mergeUpdate(alertId, {\n status: 'dismissed' satisfies AlertStatus,\n read: true,\n updatedAt: Date.now(),\n })\n }\n\n // ── Private: event handling ──────────────────────────────────────\n\n private async handleEvent(category: string, event: SystemEvent): Promise<void> {\n try {\n if (category === 'model.download.progress') {\n // Model download progress has its own in-progress merging path\n // that intentionally overwrites a single alert per model, so\n // rate limiting does not apply here — the merger itself is the\n // collapse mechanism.\n await this.handleModelDownload(event)\n return\n }\n\n if (category === EventCategory.AddonLoadFailed) {\n await this.handleAddonLoadFailed(event)\n return\n }\n if (category === EventCategory.AddonLoadRecovered) {\n await this.handleAddonLoadRecovered(event)\n return\n }\n\n const mapping = CATEGORY_MAPPINGS[category]\n if (!mapping) return\n\n if (this.shouldSuppressByRate(category, event)) return\n\n const message = this.buildMessage(category, event.data)\n const alert: Alert = {\n id: crypto.randomUUID(),\n category,\n severity: mapping.severity,\n title: mapping.titleTemplate,\n message,\n status: 'active',\n read: false,\n createdAt: Date.now(),\n updatedAt: Date.now(),\n source: event.source ? { type: event.source.type, id: String(event.source.id) } : undefined,\n metadata: event.data,\n }\n\n await this.emitAlert(alert)\n } catch (err) {\n this.ctx.logger?.warn(\n 'Failed to handle event',\n { meta: { category, error: errMsg(err) } },\n )\n }\n }\n\n private async handleModelDownload(event: SystemEvent): Promise<void> {\n const data = event.data\n const modelId = (data.modelId as string | undefined) ?? 'unknown'\n const progress = (data.progress as number | undefined) ?? 0\n const stableId = `model-download:${modelId}`\n\n const backend = this.ctx.api.settingsStore\n if (!backend) return\n\n // Check if an in-progress alert already exists for this model\n const existing = await backend.query.query({ collection: ALERTS_COLLECTION, filter: {\n where: { id: stableId },\n } })\n\n if (existing.length > 0) {\n // Update existing alert (read-merge-write)\n const now = Date.now()\n if (progress >= 100) {\n await this.mergeUpdate(stableId, {\n status: 'completed' satisfies AlertStatus,\n progress: 100,\n message: `Model \"${modelId}\" download completed`,\n updatedAt: now,\n })\n this.emitAlertUpdatedEvent(stableId, { status: 'completed', progress: 100 })\n } else if (progress < 0) {\n await this.mergeUpdate(stableId, {\n status: 'failed' satisfies AlertStatus,\n message: `Model \"${modelId}\" download failed`,\n updatedAt: now,\n })\n this.emitAlertUpdatedEvent(stableId, { status: 'failed' })\n } else {\n await this.mergeUpdate(stableId, {\n progress,\n message: `Downloading model \"${modelId}\" — ${String(Math.round(progress))}%`,\n updatedAt: now,\n })\n this.emitAlertUpdatedEvent(stableId, { progress })\n }\n } else {\n // Create new in-progress alert\n const alert: Alert = {\n id: stableId,\n category: EventCategory.ModelDownloadProgress,\n severity: 'info',\n title: 'Model download',\n message: `Downloading model \"${modelId}\" — ${String(Math.round(progress))}%`,\n status: 'in-progress',\n progress,\n read: false,\n createdAt: Date.now(),\n updatedAt: Date.now(),\n source: event.source ? { type: event.source.type, id: String(event.source.id) } : undefined,\n metadata: { modelId },\n }\n\n await this.persistAlert(alert)\n this.emitAlertCreatedEvent(alert)\n }\n }\n\n /**\n * `[ALERT-CENTER-EVENTS]` — rate limit a `(category, source.id)`\n * tuple. Returns `true` when the caller should DROP this event\n * without persisting an alert, and `false` when the alert should\n * proceed normally.\n *\n * Heuristic: the first `RATE_LIMIT_MAX_PER_SOURCE` events within a\n * `RATE_LIMIT_WINDOW_MS` window go through. Once the threshold is\n * crossed, subsequent events are suppressed until the window rolls\n * over. When the threshold is first crossed, the suppression is\n * logged once so operators know why they're not seeing the follow-\n * up alerts; after the window rolls over the next event is\n * un-suppressed and starts a new window.\n */\n private shouldSuppressByRate(category: string, event: SystemEvent): boolean {\n const sourceId = event.source?.id ?? 'unknown'\n const key = `${category}::${sourceId}`\n const now = Date.now()\n const entry = this.rateLimitCounters.get(key)\n\n if (!entry || now - entry.firstAt > RATE_LIMIT_WINDOW_MS) {\n // First event of a new window — always allow, start the counter.\n this.rateLimitCounters.set(key, { firstAt: now, count: 1, suppressedLogged: false })\n return false\n }\n\n entry.count += 1\n if (entry.count <= RATE_LIMIT_MAX_PER_SOURCE) return false\n\n // Over threshold — suppress the rest of this window.\n if (!entry.suppressedLogged) {\n entry.suppressedLogged = true\n this.ctx.logger?.info(\n 'rate-limiting suppressing remainder of window',\n { meta: { category, sourceId, maxPerSource: RATE_LIMIT_MAX_PER_SOURCE, windowSeconds: RATE_LIMIT_WINDOW_MS / 1000 } },\n )\n }\n return true\n }\n\n /**\n * AddonLoadFailed — kernel's AddonHealthMonitor has post-grace\n * failed an addon load/init. Upsert a stable-id alert keyed by\n * `addon-load-failed:<packageName>` so the recovery path can\n * dismiss it. Severity=error, persistent until dismissed or\n * auto-resolved.\n *\n * The action `retry` carries the package name so the admin UI can\n * dispatch `addons.retryLoad(packageName)` directly from the alert\n * card without the operator opening the Addons page.\n */\n private async handleAddonLoadFailed(event: SystemEvent): Promise<void> {\n const data = event.data\n const packageName = String(data['packageName'] ?? '')\n if (!packageName) return\n const addonId = data['addonId'] as string | undefined\n const errorObj = data['error'] as { message?: string; stack?: string } | undefined\n const retryCount = Number(data['retryCount'] ?? 0)\n const nextRetryAt = data['nextRetryAt'] as number | null | undefined\n\n const stableId = `addon-load-failed:${packageName}`\n const message = errorObj?.message\n ? `${addonId ? `${addonId} — ` : ''}${errorObj.message}`\n : `Addon ${addonId ?? packageName} failed to load`\n\n const alert: Alert = {\n id: stableId,\n category: EventCategory.AddonLoadFailed,\n severity: 'error',\n title: `Addon failed: ${addonId ?? packageName}`,\n message,\n status: 'active',\n read: false,\n createdAt: Date.now(),\n updatedAt: Date.now(),\n source: { type: 'addon', id: packageName },\n metadata: {\n packageName,\n addonId,\n retryCount,\n nextRetryAt,\n stack: errorObj?.stack,\n },\n }\n await this.emitAlert(alert)\n }\n\n /**\n * AddonLoadRecovered — addon previously alerting is back to healthy.\n * Dismiss the matching alert so the operator's badge count drops.\n */\n private async handleAddonLoadRecovered(event: SystemEvent): Promise<void> {\n const data = event.data\n const packageName = String(data['packageName'] ?? '')\n if (!packageName) return\n const stableId = `addon-load-failed:${packageName}`\n try {\n await this.dismiss(stableId)\n } catch (err) {\n // Non-fatal: alert may have already been dismissed manually\n // or never created (e.g. recovery during grace period).\n this.ctx.logger?.debug(\n 'AddonLoadRecovered: dismiss failed (likely already dismissed)',\n { meta: { stableId, error: errMsg(err) } },\n )\n }\n }\n\n private buildMessage(category: string, data: Record<string, unknown>): string {\n const addonId = data.addonId as string | undefined\n const deviceId = data.deviceId as string | undefined\n const error = data.error as string | undefined\n const processId = data.processId as string | undefined\n\n switch (category) {\n case 'addon.crashed':\n return `Addon \"${addonId ?? 'unknown'}\" crashed${error ? `: ${error}` : ''}`\n case 'addon.error':\n return `Addon \"${addonId ?? 'unknown'}\" error${error ? `: ${error}` : ''}`\n case 'addon.installed':\n return `Addon \"${addonId ?? 'unknown'}\" installed`\n case 'addon.updated': {\n const from = data.fromVersion as string | undefined\n const to = data.toVersion as string | undefined\n return `Addon \"${addonId ?? 'unknown'}\" updated${from && to ? ` from ${from} to ${to}` : ''}`\n }\n case 'addon.uninstalled':\n return `Addon \"${addonId ?? 'unknown'}\" uninstalled`\n case 'device.registered':\n return `Device \"${data.name as string | undefined ?? deviceId ?? 'unknown'}\" registered`\n case 'device.unregistered':\n return `Device \"${deviceId ?? 'unknown'}\" unregistered`\n case 'agent.online':\n return `Agent \"${data.agentId as string | undefined ?? data.nodeId as string | undefined ?? 'unknown'}\" connected`\n case 'agent.offline':\n return `Agent \"${data.agentId as string | undefined ?? data.nodeId as string | undefined ?? 'unknown'}\" disconnected${data.reason ? `: ${String(data.reason)}` : ''}`\n case 'backup.completed':\n return `Backup completed${data.targetId ? ` (${String(data.targetId)})` : ''}`\n case 'backup.restored':\n return `Backup restored${data.source ? ` from ${String(data.source)}` : ''}`\n case 'notification.failed':\n return `Notification failed${error ? `: ${error}` : ''}`\n case 'system.restarting':\n return `System restarting${data.reason ? ` — ${String(data.reason)}` : ''}`\n case 'recording.error':\n return `Recording error on device \"${deviceId ?? 'unknown'}\"${error ? `: ${error}` : ''}`\n case 'recording.storage.critical':\n return `Storage critical for device \"${deviceId ?? 'unknown'}\"`\n case 'system.boot':\n return `System booted in \"${data.mode as string | undefined ?? 'unknown'}\" mode`\n case 'process.crashed':\n return `Process \"${processId ?? 'unknown'}\" crashed`\n default:\n return `Event: ${category}`\n }\n }\n\n // ── Private: persistence ─────────────────────────────────────────\n\n private async emitAlert(alert: Alert): Promise<void> {\n await this.persistAlert(alert)\n this.emitAlertCreatedEvent(alert)\n await this.enforceMaxAlerts()\n await this.enforceRetention()\n }\n\n private async updateAlert(alertId: string, patch: Partial<Alert>): Promise<void> {\n await this.mergeUpdate(alertId, { ...patch, updatedAt: Date.now() })\n this.emitAlertUpdatedEvent(alertId, patch)\n }\n\n /**\n * Read-merge-write: SettingsBackend.update() replaces the entire `data` blob,\n * so we must read the existing record, merge the patch, and write back.\n */\n private async mergeUpdate(id: string, patch: Record<string, unknown>): Promise<void> {\n const backend = this.ctx.api.settingsStore\n if (!backend) return\n\n const raw = await backend.get.query({ collection: ALERTS_COLLECTION, key: id })\n if (raw === null || raw === undefined || typeof raw !== 'object') return\n const existing: Record<string, unknown> = Object.fromEntries(Object.entries(raw))\n await backend.set.mutate({ collection: ALERTS_COLLECTION, key: id, value: { ...existing, ...patch } })\n }\n\n private async persistAlert(alert: Alert): Promise<void> {\n const backend = this.ctx.api.settingsStore\n if (!backend) return\n\n // Serialize alert to a plain Record for SQLite JSON storage\n const data: Record<string, unknown> = {\n id: alert.id,\n category: alert.category,\n severity: alert.severity,\n title: alert.title,\n message: alert.message,\n status: alert.status,\n read: alert.read,\n createdAt: alert.createdAt,\n updatedAt: alert.updatedAt,\n ...(alert.progress !== undefined ? { progress: alert.progress } : {}),\n ...(alert.source ? { source: alert.source } : {}),\n ...(alert.metadata ? { metadata: alert.metadata } : {}),\n }\n await backend.set.mutate({ collection: ALERTS_COLLECTION, key: alert.id, value: data })\n }\n\n private emitAlertCreatedEvent(alert: Alert): void {\n this.ctx.eventBus?.emit(createEvent('alert.created', EVENT_SOURCE, {\n id: alert.id,\n category: alert.category,\n severity: alert.severity,\n title: alert.title,\n status: alert.status,\n }))\n }\n\n private emitAlertUpdatedEvent(alertId: string, patch: Partial<Alert>): void {\n const patchRecord: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(patch)) {\n patchRecord[key] = value\n }\n this.ctx.eventBus?.emit(createEvent('alert.updated', EVENT_SOURCE, {\n alertId,\n patch: patchRecord,\n }))\n }\n\n private async enforceMaxAlerts(): Promise<void> {\n const backend = this.ctx.api.settingsStore\n if (!backend) return\n\n const total = await backend.count.query({ collection: ALERTS_COLLECTION })\n if (total <= this.config.maxAlerts) return\n\n // Delete oldest read alerts\n const excess = total - this.config.maxAlerts\n const oldest = await backend.query.query({ collection: ALERTS_COLLECTION, filter: {\n where: { read: true },\n orderBy: { field: 'createdAt', direction: 'asc' },\n limit: excess,\n } })\n\n for (const record of oldest) {\n await backend.delete.mutate({ collection: ALERTS_COLLECTION, key: record.id })\n }\n }\n\n private async enforceRetention(): Promise<void> {\n const backend = this.ctx.api.settingsStore\n if (!backend) return\n\n const cutoff = Date.now() - this.config.retentionDays * 24 * 60 * 60 * 1000\n const expired = await backend.query.query({ collection: ALERTS_COLLECTION, filter: {\n where: { read: true },\n orderBy: { field: 'createdAt', direction: 'asc' },\n } })\n\n for (const record of expired) {\n if (Number(record.data['createdAt'] ?? 0) < cutoff) {\n await backend.delete.mutate({ collection: ALERTS_COLLECTION, key: record.id })\n }\n }\n }\n}\n\nexport default AlertCenterAddon\n"],"mappings":"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"}