@marinoscar/platform-api 0.1.0-next.18 → 0.1.0-next.20

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 (598) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/README.md +1 -0
  3. package/dist/ai/runtime/ai-limits.service.d.ts.map +1 -1
  4. package/dist/ai/runtime/ai-limits.service.js +8 -1
  5. package/dist/ai/runtime/ai-limits.service.js.map +1 -1
  6. package/dist/ai/usage/ai-usage-admin.controller.d.ts +6 -3
  7. package/dist/ai/usage/ai-usage-admin.controller.d.ts.map +1 -1
  8. package/dist/ai/usage/ai-usage-admin.controller.js +31 -17
  9. package/dist/ai/usage/ai-usage-admin.controller.js.map +1 -1
  10. package/dist/ai/usage/ai-usage.controller.d.ts +5 -2
  11. package/dist/ai/usage/ai-usage.controller.d.ts.map +1 -1
  12. package/dist/ai/usage/ai-usage.controller.js +18 -11
  13. package/dist/ai/usage/ai-usage.controller.js.map +1 -1
  14. package/dist/ai/usage/ai-usage.service.d.ts +19 -4
  15. package/dist/ai/usage/ai-usage.service.d.ts.map +1 -1
  16. package/dist/ai/usage/ai-usage.service.js +84 -43
  17. package/dist/ai/usage/ai-usage.service.js.map +1 -1
  18. package/dist/ai/usage/dto/ai-usage.dto.d.ts +8 -0
  19. package/dist/ai/usage/dto/ai-usage.dto.d.ts.map +1 -1
  20. package/dist/ai/usage/dto/ai-usage.dto.js +16 -5
  21. package/dist/ai/usage/dto/ai-usage.dto.js.map +1 -1
  22. package/dist/alerts/alerts-admin.controller.d.ts +40 -0
  23. package/dist/alerts/alerts-admin.controller.d.ts.map +1 -0
  24. package/dist/alerts/alerts-admin.controller.js +297 -0
  25. package/dist/alerts/alerts-admin.controller.js.map +1 -0
  26. package/dist/alerts/alerts-context.service.d.ts +64 -0
  27. package/dist/alerts/alerts-context.service.d.ts.map +1 -0
  28. package/dist/alerts/alerts-context.service.js +190 -0
  29. package/dist/alerts/alerts-context.service.js.map +1 -0
  30. package/dist/alerts/alerts-dispatch.service.d.ts +53 -0
  31. package/dist/alerts/alerts-dispatch.service.d.ts.map +1 -0
  32. package/dist/alerts/alerts-dispatch.service.js +135 -0
  33. package/dist/alerts/alerts-dispatch.service.js.map +1 -0
  34. package/dist/alerts/alerts-evaluation.service.d.ts +88 -0
  35. package/dist/alerts/alerts-evaluation.service.d.ts.map +1 -0
  36. package/dist/alerts/alerts-evaluation.service.js +296 -0
  37. package/dist/alerts/alerts-evaluation.service.js.map +1 -0
  38. package/dist/alerts/alerts-event.listener.d.ts +22 -0
  39. package/dist/alerts/alerts-event.listener.d.ts.map +1 -0
  40. package/dist/alerts/alerts-event.listener.js +72 -0
  41. package/dist/alerts/alerts-event.listener.js.map +1 -0
  42. package/dist/alerts/alerts-incidents.service.d.ts +86 -0
  43. package/dist/alerts/alerts-incidents.service.d.ts.map +1 -0
  44. package/dist/alerts/alerts-incidents.service.js +144 -0
  45. package/dist/alerts/alerts-incidents.service.js.map +1 -0
  46. package/dist/alerts/alerts-rules.service.d.ts +73 -0
  47. package/dist/alerts/alerts-rules.service.d.ts.map +1 -0
  48. package/dist/alerts/alerts-rules.service.js +205 -0
  49. package/dist/alerts/alerts-rules.service.js.map +1 -0
  50. package/dist/alerts/alerts-seed.service.d.ts +25 -0
  51. package/dist/alerts/alerts-seed.service.d.ts.map +1 -0
  52. package/dist/alerts/alerts-seed.service.js +82 -0
  53. package/dist/alerts/alerts-seed.service.js.map +1 -0
  54. package/dist/alerts/alerts.constants.d.ts +53 -0
  55. package/dist/alerts/alerts.constants.d.ts.map +1 -0
  56. package/dist/alerts/alerts.constants.js +57 -0
  57. package/dist/alerts/alerts.constants.js.map +1 -0
  58. package/dist/alerts/alerts.errors.d.ts +44 -0
  59. package/dist/alerts/alerts.errors.d.ts.map +1 -0
  60. package/dist/alerts/alerts.errors.js +47 -0
  61. package/dist/alerts/alerts.errors.js.map +1 -0
  62. package/dist/alerts/alerts.metrics.d.ts +60 -0
  63. package/dist/alerts/alerts.metrics.d.ts.map +1 -0
  64. package/dist/alerts/alerts.metrics.js +135 -0
  65. package/dist/alerts/alerts.metrics.js.map +1 -0
  66. package/dist/alerts/alerts.module.d.ts +35 -0
  67. package/dist/alerts/alerts.module.d.ts.map +1 -0
  68. package/dist/alerts/alerts.module.js +96 -0
  69. package/dist/alerts/alerts.module.js.map +1 -0
  70. package/dist/alerts/alerts.options.d.ts +64 -0
  71. package/dist/alerts/alerts.options.d.ts.map +1 -0
  72. package/dist/alerts/alerts.options.js +34 -0
  73. package/dist/alerts/alerts.options.js.map +1 -0
  74. package/dist/alerts/alerts.permissions.d.ts +27 -0
  75. package/dist/alerts/alerts.permissions.d.ts.map +1 -0
  76. package/dist/alerts/alerts.permissions.js +29 -0
  77. package/dist/alerts/alerts.permissions.js.map +1 -0
  78. package/dist/alerts/alerts.types.d.ts +182 -0
  79. package/dist/alerts/alerts.types.d.ts.map +1 -0
  80. package/dist/alerts/alerts.types.js +3 -0
  81. package/dist/alerts/alerts.types.js.map +1 -0
  82. package/dist/alerts/data/alerts-db.d.ts +169 -0
  83. package/dist/alerts/data/alerts-db.d.ts.map +1 -0
  84. package/dist/alerts/data/alerts-db.js +18 -0
  85. package/dist/alerts/data/alerts-db.js.map +1 -0
  86. package/dist/alerts/dto/alerts.dto.d.ts +132 -0
  87. package/dist/alerts/dto/alerts.dto.d.ts.map +1 -0
  88. package/dist/alerts/dto/alerts.dto.js +42 -0
  89. package/dist/alerts/dto/alerts.dto.js.map +1 -0
  90. package/dist/alerts/handlers/alerts-evaluate-event.handler.d.ts +23 -0
  91. package/dist/alerts/handlers/alerts-evaluate-event.handler.d.ts.map +1 -0
  92. package/dist/alerts/handlers/alerts-evaluate-event.handler.js +71 -0
  93. package/dist/alerts/handlers/alerts-evaluate-event.handler.js.map +1 -0
  94. package/dist/alerts/handlers/alerts-evaluate.handler.d.ts +25 -0
  95. package/dist/alerts/handlers/alerts-evaluate.handler.d.ts.map +1 -0
  96. package/dist/alerts/handlers/alerts-evaluate.handler.js +54 -0
  97. package/dist/alerts/handlers/alerts-evaluate.handler.js.map +1 -0
  98. package/dist/alerts/handlers/alerts-incidents-purge.handler.d.ts +29 -0
  99. package/dist/alerts/handlers/alerts-incidents-purge.handler.d.ts.map +1 -0
  100. package/dist/alerts/handlers/alerts-incidents-purge.handler.js +76 -0
  101. package/dist/alerts/handlers/alerts-incidents-purge.handler.js.map +1 -0
  102. package/dist/alerts/index.d.ts +45 -0
  103. package/dist/alerts/index.d.ts.map +1 -0
  104. package/dist/alerts/index.js +108 -0
  105. package/dist/alerts/index.js.map +1 -0
  106. package/dist/alerts/kinds/alert-kind.registry.d.ts +33 -0
  107. package/dist/alerts/kinds/alert-kind.registry.d.ts.map +1 -0
  108. package/dist/alerts/kinds/alert-kind.registry.js +63 -0
  109. package/dist/alerts/kinds/alert-kind.registry.js.map +1 -0
  110. package/dist/alerts/kinds/builtin-kinds.d.ts +18 -0
  111. package/dist/alerts/kinds/builtin-kinds.d.ts.map +1 -0
  112. package/dist/alerts/kinds/builtin-kinds.js +33 -0
  113. package/dist/alerts/kinds/builtin-kinds.js.map +1 -0
  114. package/dist/alerts/kinds/metric-threshold.kind.d.ts +11 -0
  115. package/dist/alerts/kinds/metric-threshold.kind.d.ts.map +1 -0
  116. package/dist/alerts/kinds/metric-threshold.kind.js +63 -0
  117. package/dist/alerts/kinds/metric-threshold.kind.js.map +1 -0
  118. package/dist/alerts/kinds/metric-threshold.sql.d.ts +41 -0
  119. package/dist/alerts/kinds/metric-threshold.sql.d.ts.map +1 -0
  120. package/dist/alerts/kinds/metric-threshold.sql.js +124 -0
  121. package/dist/alerts/kinds/metric-threshold.sql.js.map +1 -0
  122. package/dist/alerts/kinds/node-event.kind.d.ts +44 -0
  123. package/dist/alerts/kinds/node-event.kind.d.ts.map +1 -0
  124. package/dist/alerts/kinds/node-event.kind.js +113 -0
  125. package/dist/alerts/kinds/node-event.kind.js.map +1 -0
  126. package/dist/alerts/kinds/node-offline.kind.d.ts +11 -0
  127. package/dist/alerts/kinds/node-offline.kind.d.ts.map +1 -0
  128. package/dist/alerts/kinds/node-offline.kind.js +41 -0
  129. package/dist/alerts/kinds/node-offline.kind.js.map +1 -0
  130. package/dist/alerts/kinds/telemetry-unavailable.kind.d.ts +11 -0
  131. package/dist/alerts/kinds/telemetry-unavailable.kind.d.ts.map +1 -0
  132. package/dist/alerts/kinds/telemetry-unavailable.kind.js +40 -0
  133. package/dist/alerts/kinds/telemetry-unavailable.kind.js.map +1 -0
  134. package/dist/alerts/kinds/verdict.kind.d.ts +13 -0
  135. package/dist/alerts/kinds/verdict.kind.d.ts.map +1 -0
  136. package/dist/alerts/kinds/verdict.kind.js +34 -0
  137. package/dist/alerts/kinds/verdict.kind.js.map +1 -0
  138. package/dist/alerts/notifications/alerts.notifications.d.ts +77 -0
  139. package/dist/alerts/notifications/alerts.notifications.d.ts.map +1 -0
  140. package/dist/alerts/notifications/alerts.notifications.js +145 -0
  141. package/dist/alerts/notifications/alerts.notifications.js.map +1 -0
  142. package/dist/alerts/starter-rules.d.ts +21 -0
  143. package/dist/alerts/starter-rules.d.ts.map +1 -0
  144. package/dist/alerts/starter-rules.js +141 -0
  145. package/dist/alerts/starter-rules.js.map +1 -0
  146. package/dist/alerts/state/alert-state-machine.d.ts +92 -0
  147. package/dist/alerts/state/alert-state-machine.d.ts.map +1 -0
  148. package/dist/alerts/state/alert-state-machine.js +96 -0
  149. package/dist/alerts/state/alert-state-machine.js.map +1 -0
  150. package/dist/alerts/tasks/alerts-evaluate.task.d.ts +18 -0
  151. package/dist/alerts/tasks/alerts-evaluate.task.d.ts.map +1 -0
  152. package/dist/alerts/tasks/alerts-evaluate.task.js +61 -0
  153. package/dist/alerts/tasks/alerts-evaluate.task.js.map +1 -0
  154. package/dist/alerts/tasks/alerts-purge.task.d.ts +15 -0
  155. package/dist/alerts/tasks/alerts-purge.task.d.ts.map +1 -0
  156. package/dist/alerts/tasks/alerts-purge.task.js +58 -0
  157. package/dist/alerts/tasks/alerts-purge.task.js.map +1 -0
  158. package/dist/alerts/testing/conformance.d.ts +58 -0
  159. package/dist/alerts/testing/conformance.d.ts.map +1 -0
  160. package/dist/alerts/testing/conformance.js +198 -0
  161. package/dist/alerts/testing/conformance.js.map +1 -0
  162. package/dist/alerts/testing/fakes.d.ts +80 -0
  163. package/dist/alerts/testing/fakes.d.ts.map +1 -0
  164. package/dist/alerts/testing/fakes.js +230 -0
  165. package/dist/alerts/testing/fakes.js.map +1 -0
  166. package/dist/alerts/testing/index.d.ts +5 -0
  167. package/dist/alerts/testing/index.d.ts.map +1 -0
  168. package/dist/alerts/testing/index.js +15 -0
  169. package/dist/alerts/testing/index.js.map +1 -0
  170. package/dist/core/index.d.ts +3 -0
  171. package/dist/core/index.d.ts.map +1 -1
  172. package/dist/core/index.js +13 -2
  173. package/dist/core/index.js.map +1 -1
  174. package/dist/core/net/ip-classify.d.ts +39 -0
  175. package/dist/core/net/ip-classify.d.ts.map +1 -0
  176. package/dist/core/net/ip-classify.js +196 -0
  177. package/dist/core/net/ip-classify.js.map +1 -0
  178. package/dist/core/timezone/request-time-zone.d.ts +61 -0
  179. package/dist/core/timezone/request-time-zone.d.ts.map +1 -0
  180. package/dist/core/timezone/request-time-zone.js +71 -0
  181. package/dist/core/timezone/request-time-zone.js.map +1 -0
  182. package/dist/credentials/testing/conformance.d.ts.map +1 -1
  183. package/dist/credentials/testing/conformance.js +1 -0
  184. package/dist/credentials/testing/conformance.js.map +1 -1
  185. package/dist/email/email-settings.controller.d.ts +5 -2
  186. package/dist/email/email-settings.controller.d.ts.map +1 -1
  187. package/dist/email/email-settings.controller.js +11 -5
  188. package/dist/email/email-settings.controller.js.map +1 -1
  189. package/dist/email/email-test-send.service.d.ts +11 -1
  190. package/dist/email/email-test-send.service.d.ts.map +1 -1
  191. package/dist/email/email-test-send.service.js +17 -3
  192. package/dist/email/email-test-send.service.js.map +1 -1
  193. package/dist/email/index.d.ts +2 -2
  194. package/dist/email/index.d.ts.map +1 -1
  195. package/dist/email/index.js +3 -1
  196. package/dist/email/index.js.map +1 -1
  197. package/dist/email/templates/backup-failed.email.d.ts.map +1 -1
  198. package/dist/email/templates/backup-failed.email.js +9 -5
  199. package/dist/email/templates/backup-failed.email.js.map +1 -1
  200. package/dist/email/templates/format-date.d.ts +39 -0
  201. package/dist/email/templates/format-date.d.ts.map +1 -0
  202. package/dist/email/templates/format-date.js +103 -0
  203. package/dist/email/templates/format-date.js.map +1 -0
  204. package/dist/email/templates/index.d.ts +2 -0
  205. package/dist/email/templates/index.d.ts.map +1 -1
  206. package/dist/email/templates/index.js +4 -1
  207. package/dist/email/templates/index.js.map +1 -1
  208. package/dist/email/templates/job-failed.email.d.ts +1 -1
  209. package/dist/email/templates/job-failed.email.d.ts.map +1 -1
  210. package/dist/email/templates/job-failed.email.js +6 -6
  211. package/dist/email/templates/job-failed.email.js.map +1 -1
  212. package/dist/email/templates/node-offline.email.d.ts.map +1 -1
  213. package/dist/email/templates/node-offline.email.js +11 -7
  214. package/dist/email/templates/node-offline.email.js.map +1 -1
  215. package/dist/email/templates/render-context.d.ts +5 -0
  216. package/dist/email/templates/render-context.d.ts.map +1 -1
  217. package/dist/email/templates/render-context.js.map +1 -1
  218. package/dist/email/templates/restore-completed.email.d.ts.map +1 -1
  219. package/dist/email/templates/restore-completed.email.js +9 -5
  220. package/dist/email/templates/restore-completed.email.js.map +1 -1
  221. package/dist/email/templates/role-changed.email.d.ts +1 -1
  222. package/dist/email/templates/role-changed.email.d.ts.map +1 -1
  223. package/dist/email/templates/role-changed.email.js +6 -7
  224. package/dist/email/templates/role-changed.email.js.map +1 -1
  225. package/dist/email/templates/test-email.email.d.ts +1 -1
  226. package/dist/email/templates/test-email.email.d.ts.map +1 -1
  227. package/dist/email/templates/test-email.email.js +6 -11
  228. package/dist/email/templates/test-email.email.js.map +1 -1
  229. package/dist/exports/export-job.d.ts +1 -0
  230. package/dist/exports/export-job.d.ts.map +1 -1
  231. package/dist/exports/export-job.js +2 -0
  232. package/dist/exports/export-job.js.map +1 -1
  233. package/dist/exports/export.types.d.ts +8 -0
  234. package/dist/exports/export.types.d.ts.map +1 -1
  235. package/dist/exports/exports.controller.d.ts +4 -2
  236. package/dist/exports/exports.controller.d.ts.map +1 -1
  237. package/dist/exports/exports.controller.js +15 -6
  238. package/dist/exports/exports.controller.js.map +1 -1
  239. package/dist/exports/exports.service.d.ts +5 -0
  240. package/dist/exports/exports.service.d.ts.map +1 -1
  241. package/dist/exports/exports.service.js +3 -0
  242. package/dist/exports/exports.service.js.map +1 -1
  243. package/dist/exports/handlers/export-run.handler.d.ts.map +1 -1
  244. package/dist/exports/handlers/export-run.handler.js +4 -1
  245. package/dist/exports/handlers/export-run.handler.js.map +1 -1
  246. package/dist/exports/index.d.ts +1 -0
  247. package/dist/exports/index.d.ts.map +1 -1
  248. package/dist/exports/index.js +7 -2
  249. package/dist/exports/index.js.map +1 -1
  250. package/dist/exports/testing/conformance.d.ts.map +1 -1
  251. package/dist/exports/testing/conformance.js +1 -0
  252. package/dist/exports/testing/conformance.js.map +1 -1
  253. package/dist/host/http/cors-options.d.ts +5 -1
  254. package/dist/host/http/cors-options.d.ts.map +1 -1
  255. package/dist/host/http/cors-options.js.map +1 -1
  256. package/dist/identity/pat/pat.controller.d.ts +4 -3
  257. package/dist/identity/pat/pat.controller.d.ts.map +1 -1
  258. package/dist/identity/pat/pat.controller.js +19 -5
  259. package/dist/identity/pat/pat.controller.js.map +1 -1
  260. package/dist/identity/pat/pat.service.d.ts +21 -0
  261. package/dist/identity/pat/pat.service.d.ts.map +1 -1
  262. package/dist/identity/pat/pat.service.js +27 -10
  263. package/dist/identity/pat/pat.service.js.map +1 -1
  264. package/dist/jobs/data/jobs-db.d.ts +26 -0
  265. package/dist/jobs/data/jobs-db.d.ts.map +1 -1
  266. package/dist/jobs/index.d.ts +1 -1
  267. package/dist/jobs/index.d.ts.map +1 -1
  268. package/dist/jobs/index.js.map +1 -1
  269. package/dist/manifest/platform-model-ownership.d.ts +1 -1
  270. package/dist/manifest/platform-model-ownership.d.ts.map +1 -1
  271. package/dist/manifest/platform-model-ownership.js +30 -1
  272. package/dist/manifest/platform-model-ownership.js.map +1 -1
  273. package/dist/manifest/platform-permissions.d.ts +6 -2
  274. package/dist/manifest/platform-permissions.d.ts.map +1 -1
  275. package/dist/manifest/platform-permissions.js +56 -44
  276. package/dist/manifest/platform-permissions.js.map +1 -1
  277. package/dist/manifest/platform-user-owned-models.d.ts.map +1 -1
  278. package/dist/manifest/platform-user-owned-models.js +16 -0
  279. package/dist/manifest/platform-user-owned-models.js.map +1 -1
  280. package/dist/nodes/dto/node-admin.dto.d.ts +5 -0
  281. package/dist/nodes/dto/node-admin.dto.d.ts.map +1 -1
  282. package/dist/nodes/dto/node-admin.dto.js +19 -0
  283. package/dist/nodes/dto/node-admin.dto.js.map +1 -1
  284. package/dist/nodes/dto/node-control-plane.dto.d.ts +26 -0
  285. package/dist/nodes/dto/node-control-plane.dto.d.ts.map +1 -1
  286. package/dist/nodes/dto/node-event.dto.d.ts +100 -0
  287. package/dist/nodes/dto/node-event.dto.d.ts.map +1 -0
  288. package/dist/nodes/dto/node-event.dto.js +239 -0
  289. package/dist/nodes/dto/node-event.dto.js.map +1 -0
  290. package/dist/nodes/dto/node-response.dto.d.ts +21 -0
  291. package/dist/nodes/dto/node-response.dto.d.ts.map +1 -1
  292. package/dist/nodes/dto/node-response.dto.js +42 -1
  293. package/dist/nodes/dto/node-response.dto.js.map +1 -1
  294. package/dist/nodes/events/node-event.event.d.ts +41 -0
  295. package/dist/nodes/events/node-event.event.d.ts.map +1 -0
  296. package/dist/nodes/events/node-event.event.js +69 -0
  297. package/dist/nodes/events/node-event.event.js.map +1 -0
  298. package/dist/nodes/handlers/node-events-purge.handler.d.ts +31 -0
  299. package/dist/nodes/handlers/node-events-purge.handler.d.ts.map +1 -0
  300. package/dist/nodes/handlers/node-events-purge.handler.js +91 -0
  301. package/dist/nodes/handlers/node-events-purge.handler.js.map +1 -0
  302. package/dist/nodes/index.d.ts +11 -4
  303. package/dist/nodes/index.d.ts.map +1 -1
  304. package/dist/nodes/index.js +20 -1
  305. package/dist/nodes/index.js.map +1 -1
  306. package/dist/nodes/node-events.service.d.ts +87 -0
  307. package/dist/nodes/node-events.service.d.ts.map +1 -0
  308. package/dist/nodes/node-events.service.js +271 -0
  309. package/dist/nodes/node-events.service.js.map +1 -0
  310. package/dist/nodes/node-fleet-metrics.service.d.ts +10 -1
  311. package/dist/nodes/node-fleet-metrics.service.d.ts.map +1 -1
  312. package/dist/nodes/node-fleet-metrics.service.js +31 -0
  313. package/dist/nodes/node-fleet-metrics.service.js.map +1 -1
  314. package/dist/nodes/node-lifecycle.service.d.ts +16 -1
  315. package/dist/nodes/node-lifecycle.service.d.ts.map +1 -1
  316. package/dist/nodes/node-lifecycle.service.js +7 -0
  317. package/dist/nodes/node-lifecycle.service.js.map +1 -1
  318. package/dist/nodes/nodes-admin.controller.d.ts +5 -1
  319. package/dist/nodes/nodes-admin.controller.d.ts.map +1 -1
  320. package/dist/nodes/nodes-admin.controller.js +32 -2
  321. package/dist/nodes/nodes-admin.controller.js.map +1 -1
  322. package/dist/nodes/nodes.controller.d.ts +7 -3
  323. package/dist/nodes/nodes.controller.d.ts.map +1 -1
  324. package/dist/nodes/nodes.controller.js +46 -6
  325. package/dist/nodes/nodes.controller.js.map +1 -1
  326. package/dist/nodes/nodes.metrics.d.ts +23 -1
  327. package/dist/nodes/nodes.metrics.d.ts.map +1 -1
  328. package/dist/nodes/nodes.metrics.js +80 -1
  329. package/dist/nodes/nodes.metrics.js.map +1 -1
  330. package/dist/nodes/nodes.module.d.ts.map +1 -1
  331. package/dist/nodes/nodes.module.js +6 -0
  332. package/dist/nodes/nodes.module.js.map +1 -1
  333. package/dist/nodes/nodes.options.d.ts +17 -0
  334. package/dist/nodes/nodes.options.d.ts.map +1 -1
  335. package/dist/nodes/nodes.options.js +13 -2
  336. package/dist/nodes/nodes.options.js.map +1 -1
  337. package/dist/nodes/nodes.service.d.ts +3 -1
  338. package/dist/nodes/nodes.service.d.ts.map +1 -1
  339. package/dist/nodes/nodes.service.js +14 -3
  340. package/dist/nodes/nodes.service.js.map +1 -1
  341. package/dist/nodes/tasks/node-events-purge.task.d.ts +13 -0
  342. package/dist/nodes/tasks/node-events-purge.task.d.ts.map +1 -0
  343. package/dist/nodes/tasks/node-events-purge.task.js +73 -0
  344. package/dist/nodes/tasks/node-events-purge.task.js.map +1 -0
  345. package/dist/notifications/channels/browser-notification.channel.js +1 -1
  346. package/dist/notifications/channels/browser-notification.channel.js.map +1 -1
  347. package/dist/notifications/channels/browser-templates.d.ts +12 -1
  348. package/dist/notifications/channels/browser-templates.d.ts.map +1 -1
  349. package/dist/notifications/channels/browser-templates.js +5 -4
  350. package/dist/notifications/channels/browser-templates.js.map +1 -1
  351. package/dist/notifications/channels/email-notification.channel.d.ts.map +1 -1
  352. package/dist/notifications/channels/email-notification.channel.js +3 -3
  353. package/dist/notifications/channels/email-notification.channel.js.map +1 -1
  354. package/dist/notifications/channels/push-notification.channel.js +1 -1
  355. package/dist/notifications/channels/push-notification.channel.js.map +1 -1
  356. package/dist/notifications/index.d.ts +1 -1
  357. package/dist/notifications/index.d.ts.map +1 -1
  358. package/dist/notifications/notification.types.d.ts +15 -0
  359. package/dist/notifications/notification.types.d.ts.map +1 -1
  360. package/dist/notifications/notification.types.js.map +1 -1
  361. package/dist/notifications/notifications.service.d.ts.map +1 -1
  362. package/dist/notifications/notifications.service.js +8 -0
  363. package/dist/notifications/notifications.service.js.map +1 -1
  364. package/dist/notifications/push-config.controller.d.ts +5 -2
  365. package/dist/notifications/push-config.controller.d.ts.map +1 -1
  366. package/dist/notifications/push-config.controller.js +11 -5
  367. package/dist/notifications/push-config.controller.js.map +1 -1
  368. package/dist/notifications/push-test.service.d.ts +1 -1
  369. package/dist/notifications/push-test.service.d.ts.map +1 -1
  370. package/dist/notifications/push-test.service.js +6 -4
  371. package/dist/notifications/push-test.service.js.map +1 -1
  372. package/dist/settings/settings-resolver.d.ts +28 -1
  373. package/dist/settings/settings-resolver.d.ts.map +1 -1
  374. package/dist/settings/settings-resolver.js +41 -0
  375. package/dist/settings/settings-resolver.js.map +1 -1
  376. package/dist/settings/settings.module.d.ts.map +1 -1
  377. package/dist/settings/settings.module.js +9 -4
  378. package/dist/settings/settings.module.js.map +1 -1
  379. package/dist/settings/user-settings/user-settings.service.d.ts.map +1 -1
  380. package/dist/settings/user-settings/user-settings.service.js +2 -4
  381. package/dist/settings/user-settings/user-settings.service.js.map +1 -1
  382. package/dist/sharing/grants/grants.service.js +2 -2
  383. package/dist/sharing/grants/grants.service.js.map +1 -1
  384. package/dist/sharing/groups/group-invites.service.js +1 -1
  385. package/dist/sharing/groups/group-invites.service.js.map +1 -1
  386. package/dist/sharing/groups/sharing-effects.d.ts +2 -1
  387. package/dist/sharing/groups/sharing-effects.d.ts.map +1 -1
  388. package/dist/sharing/groups/sharing-effects.js +4 -4
  389. package/dist/sharing/groups/sharing-effects.js.map +1 -1
  390. package/dist/sharing/index.d.ts +1 -1
  391. package/dist/sharing/index.d.ts.map +1 -1
  392. package/dist/sharing/index.js.map +1 -1
  393. package/dist/sharing/notifications/group-invitation.templates.d.ts +23 -0
  394. package/dist/sharing/notifications/group-invitation.templates.d.ts.map +1 -1
  395. package/dist/sharing/notifications/group-invitation.templates.js +17 -2
  396. package/dist/sharing/notifications/group-invitation.templates.js.map +1 -1
  397. package/dist/sharing/notifications/shared-with-you.templates.d.ts +1 -1
  398. package/dist/sharing/notifications/shared-with-you.templates.d.ts.map +1 -1
  399. package/dist/sharing/notifications/shared-with-you.templates.js +3 -2
  400. package/dist/sharing/notifications/shared-with-you.templates.js.map +1 -1
  401. package/dist/sharing/ports.d.ts +15 -2
  402. package/dist/sharing/ports.d.ts.map +1 -1
  403. package/dist/sharing/ports.js.map +1 -1
  404. package/dist/telemetry/dashboard/telemetry-dashboard.service.d.ts +30 -8
  405. package/dist/telemetry/dashboard/telemetry-dashboard.service.d.ts.map +1 -1
  406. package/dist/telemetry/dashboard/telemetry-dashboard.service.js +12 -0
  407. package/dist/telemetry/dashboard/telemetry-dashboard.service.js.map +1 -1
  408. package/dist/telemetry/dashboard/telemetry-dashboard.verdict.d.ts +15 -0
  409. package/dist/telemetry/dashboard/telemetry-dashboard.verdict.d.ts.map +1 -1
  410. package/dist/telemetry/dashboard/telemetry-dashboard.verdict.js +17 -2
  411. package/dist/telemetry/dashboard/telemetry-dashboard.verdict.js.map +1 -1
  412. package/dist/telemetry/dto/telemetry-dashboard.dto.d.ts +3 -3
  413. package/dist/telemetry/index.d.ts +4 -2
  414. package/dist/telemetry/index.d.ts.map +1 -1
  415. package/dist/telemetry/index.js +4 -1
  416. package/dist/telemetry/index.js.map +1 -1
  417. package/dist/telemetry/metrics/groups/nodes.metric-group.d.ts.map +1 -1
  418. package/dist/telemetry/metrics/groups/nodes.metric-group.js +77 -0
  419. package/dist/telemetry/metrics/groups/nodes.metric-group.js.map +1 -1
  420. package/dist/telemetry/metrics/metric-verdict.d.ts +1 -1
  421. package/dist/telemetry/metrics/metric-verdict.d.ts.map +1 -1
  422. package/dist/telemetry/metrics/metric-verdict.js +15 -1
  423. package/dist/telemetry/metrics/metric-verdict.js.map +1 -1
  424. package/dist/telemetry/query/telemetry-query-facade.d.ts +1 -1
  425. package/dist/telemetry/query/telemetry-query-facade.d.ts.map +1 -1
  426. package/dist/telemetry/query/telemetry-query-facade.js.map +1 -1
  427. package/dist/telemetry/query/telemetry-query.service.d.ts +2 -2
  428. package/dist/telemetry/query/telemetry-query.service.d.ts.map +1 -1
  429. package/dist/telemetry/query/telemetry-query.service.js +4 -0
  430. package/dist/telemetry/query/telemetry-query.service.js.map +1 -1
  431. package/dist/telemetry/stack/dto/telemetry-stack.dto.d.ts +1 -1
  432. package/dist/telemetry/telemetry-support-bundle.section.d.ts +4 -4
  433. package/dist/telemetry/telemetry.module.d.ts.map +1 -1
  434. package/dist/telemetry/telemetry.module.js +1 -0
  435. package/dist/telemetry/telemetry.module.js.map +1 -1
  436. package/dist/telemetry/testing/metric-schema.fixture.d.ts.map +1 -1
  437. package/dist/telemetry/testing/metric-schema.fixture.js +56 -0
  438. package/dist/telemetry/testing/metric-schema.fixture.js.map +1 -1
  439. package/dist/user-data/platform-user-data.d.ts.map +1 -1
  440. package/dist/user-data/platform-user-data.js +2 -0
  441. package/dist/user-data/platform-user-data.js.map +1 -1
  442. package/dist/webhooks/data/webhooks-db.d.ts +176 -0
  443. package/dist/webhooks/data/webhooks-db.d.ts.map +1 -0
  444. package/dist/webhooks/data/webhooks-db.js +14 -0
  445. package/dist/webhooks/data/webhooks-db.js.map +1 -0
  446. package/dist/webhooks/egress/egress-guard.d.ts +99 -0
  447. package/dist/webhooks/egress/egress-guard.d.ts.map +1 -0
  448. package/dist/webhooks/egress/egress-guard.js +172 -0
  449. package/dist/webhooks/egress/egress-guard.js.map +1 -0
  450. package/dist/webhooks/egress/transport.d.ts +58 -0
  451. package/dist/webhooks/egress/transport.d.ts.map +1 -0
  452. package/dist/webhooks/egress/transport.js +115 -0
  453. package/dist/webhooks/egress/transport.js.map +1 -0
  454. package/dist/webhooks/handlers/webhook-deliver.handler.d.ts +76 -0
  455. package/dist/webhooks/handlers/webhook-deliver.handler.d.ts.map +1 -0
  456. package/dist/webhooks/handlers/webhook-deliver.handler.js +332 -0
  457. package/dist/webhooks/handlers/webhook-deliver.handler.js.map +1 -0
  458. package/dist/webhooks/handlers/webhook-fanout.handler.d.ts +28 -0
  459. package/dist/webhooks/handlers/webhook-fanout.handler.d.ts.map +1 -0
  460. package/dist/webhooks/handlers/webhook-fanout.handler.js +73 -0
  461. package/dist/webhooks/handlers/webhook-fanout.handler.js.map +1 -0
  462. package/dist/webhooks/handlers/webhook-purge.handler.d.ts +33 -0
  463. package/dist/webhooks/handlers/webhook-purge.handler.d.ts.map +1 -0
  464. package/dist/webhooks/handlers/webhook-purge.handler.js +77 -0
  465. package/dist/webhooks/handlers/webhook-purge.handler.js.map +1 -0
  466. package/dist/webhooks/http/admin-webhooks.controller.d.ts +36 -0
  467. package/dist/webhooks/http/admin-webhooks.controller.d.ts.map +1 -0
  468. package/dist/webhooks/http/admin-webhooks.controller.js +250 -0
  469. package/dist/webhooks/http/admin-webhooks.controller.js.map +1 -0
  470. package/dist/webhooks/http/org-webhooks.controller.d.ts +36 -0
  471. package/dist/webhooks/http/org-webhooks.controller.d.ts.map +1 -0
  472. package/dist/webhooks/http/org-webhooks.controller.js +249 -0
  473. package/dist/webhooks/http/org-webhooks.controller.js.map +1 -0
  474. package/dist/webhooks/http/scope-context.d.ts +17 -0
  475. package/dist/webhooks/http/scope-context.d.ts.map +1 -0
  476. package/dist/webhooks/http/scope-context.js +28 -0
  477. package/dist/webhooks/http/scope-context.js.map +1 -0
  478. package/dist/webhooks/http/webhook.dto.d.ts +174 -0
  479. package/dist/webhooks/http/webhook.dto.d.ts.map +1 -0
  480. package/dist/webhooks/http/webhook.dto.js +58 -0
  481. package/dist/webhooks/http/webhook.dto.js.map +1 -0
  482. package/dist/webhooks/http/webhooks.controller.d.ts +36 -0
  483. package/dist/webhooks/http/webhooks.controller.d.ts.map +1 -0
  484. package/dist/webhooks/http/webhooks.controller.js +243 -0
  485. package/dist/webhooks/http/webhooks.controller.js.map +1 -0
  486. package/dist/webhooks/index.d.ts +43 -0
  487. package/dist/webhooks/index.d.ts.map +1 -0
  488. package/dist/webhooks/index.js +147 -0
  489. package/dist/webhooks/index.js.map +1 -0
  490. package/dist/webhooks/listeners/webhook-event.listeners.d.ts +23 -0
  491. package/dist/webhooks/listeners/webhook-event.listeners.d.ts.map +1 -0
  492. package/dist/webhooks/listeners/webhook-event.listeners.js +120 -0
  493. package/dist/webhooks/listeners/webhook-event.listeners.js.map +1 -0
  494. package/dist/webhooks/notifications/webhook-notification.channel.d.ts +31 -0
  495. package/dist/webhooks/notifications/webhook-notification.channel.d.ts.map +1 -0
  496. package/dist/webhooks/notifications/webhook-notification.channel.js +127 -0
  497. package/dist/webhooks/notifications/webhook-notification.channel.js.map +1 -0
  498. package/dist/webhooks/notifications/webhook-notifications.d.ts +98 -0
  499. package/dist/webhooks/notifications/webhook-notifications.d.ts.map +1 -0
  500. package/dist/webhooks/notifications/webhook-notifications.js +150 -0
  501. package/dist/webhooks/notifications/webhook-notifications.js.map +1 -0
  502. package/dist/webhooks/ports.d.ts +29 -0
  503. package/dist/webhooks/ports.d.ts.map +1 -0
  504. package/dist/webhooks/ports.js +23 -0
  505. package/dist/webhooks/ports.js.map +1 -0
  506. package/dist/webhooks/registry/builtin-events.d.ts +57 -0
  507. package/dist/webhooks/registry/builtin-events.d.ts.map +1 -0
  508. package/dist/webhooks/registry/builtin-events.js +113 -0
  509. package/dist/webhooks/registry/builtin-events.js.map +1 -0
  510. package/dist/webhooks/registry/webhook-catalog.d.ts +63 -0
  511. package/dist/webhooks/registry/webhook-catalog.d.ts.map +1 -0
  512. package/dist/webhooks/registry/webhook-catalog.js +123 -0
  513. package/dist/webhooks/registry/webhook-catalog.js.map +1 -0
  514. package/dist/webhooks/registry/webhook-event.registry.d.ts +116 -0
  515. package/dist/webhooks/registry/webhook-event.registry.d.ts.map +1 -0
  516. package/dist/webhooks/registry/webhook-event.registry.js +152 -0
  517. package/dist/webhooks/registry/webhook-event.registry.js.map +1 -0
  518. package/dist/webhooks/signing.d.ts +31 -0
  519. package/dist/webhooks/signing.d.ts.map +1 -0
  520. package/dist/webhooks/signing.js +48 -0
  521. package/dist/webhooks/signing.js.map +1 -0
  522. package/dist/webhooks/tasks/webhook-purge.task.d.ts +17 -0
  523. package/dist/webhooks/tasks/webhook-purge.task.d.ts.map +1 -0
  524. package/dist/webhooks/tasks/webhook-purge.task.js +68 -0
  525. package/dist/webhooks/tasks/webhook-purge.task.js.map +1 -0
  526. package/dist/webhooks/testing/conformance.d.ts +61 -0
  527. package/dist/webhooks/testing/conformance.d.ts.map +1 -0
  528. package/dist/webhooks/testing/conformance.js +316 -0
  529. package/dist/webhooks/testing/conformance.js.map +1 -0
  530. package/dist/webhooks/testing/in-memory.d.ts +156 -0
  531. package/dist/webhooks/testing/in-memory.d.ts.map +1 -0
  532. package/dist/webhooks/testing/in-memory.js +323 -0
  533. package/dist/webhooks/testing/in-memory.js.map +1 -0
  534. package/dist/webhooks/testing/index.d.ts +7 -0
  535. package/dist/webhooks/testing/index.d.ts.map +1 -0
  536. package/dist/webhooks/testing/index.js +25 -0
  537. package/dist/webhooks/testing/index.js.map +1 -0
  538. package/dist/webhooks/testing/kit.d.ts +86 -0
  539. package/dist/webhooks/testing/kit.d.ts.map +1 -0
  540. package/dist/webhooks/testing/kit.js +113 -0
  541. package/dist/webhooks/testing/kit.js.map +1 -0
  542. package/dist/webhooks/webhook-endpoints.service.d.ts +142 -0
  543. package/dist/webhooks/webhook-endpoints.service.d.ts.map +1 -0
  544. package/dist/webhooks/webhook-endpoints.service.js +366 -0
  545. package/dist/webhooks/webhook-endpoints.service.js.map +1 -0
  546. package/dist/webhooks/webhook-envelope.d.ts +36 -0
  547. package/dist/webhooks/webhook-envelope.d.ts.map +1 -0
  548. package/dist/webhooks/webhook-envelope.js +46 -0
  549. package/dist/webhooks/webhook-envelope.js.map +1 -0
  550. package/dist/webhooks/webhook-secrets.service.d.ts +49 -0
  551. package/dist/webhooks/webhook-secrets.service.d.ts.map +1 -0
  552. package/dist/webhooks/webhook-secrets.service.js +118 -0
  553. package/dist/webhooks/webhook-secrets.service.js.map +1 -0
  554. package/dist/webhooks/webhook-views.d.ts +34 -0
  555. package/dist/webhooks/webhook-views.d.ts.map +1 -0
  556. package/dist/webhooks/webhook-views.js +83 -0
  557. package/dist/webhooks/webhook-views.js.map +1 -0
  558. package/dist/webhooks/webhooks.access.d.ts +28 -0
  559. package/dist/webhooks/webhooks.access.d.ts.map +1 -0
  560. package/dist/webhooks/webhooks.access.js +55 -0
  561. package/dist/webhooks/webhooks.access.js.map +1 -0
  562. package/dist/webhooks/webhooks.constants.d.ts +73 -0
  563. package/dist/webhooks/webhooks.constants.d.ts.map +1 -0
  564. package/dist/webhooks/webhooks.constants.js +100 -0
  565. package/dist/webhooks/webhooks.constants.js.map +1 -0
  566. package/dist/webhooks/webhooks.credentials.d.ts +28 -0
  567. package/dist/webhooks/webhooks.credentials.d.ts.map +1 -0
  568. package/dist/webhooks/webhooks.credentials.js +51 -0
  569. package/dist/webhooks/webhooks.credentials.js.map +1 -0
  570. package/dist/webhooks/webhooks.errors.d.ts +25 -0
  571. package/dist/webhooks/webhooks.errors.d.ts.map +1 -0
  572. package/dist/webhooks/webhooks.errors.js +65 -0
  573. package/dist/webhooks/webhooks.errors.js.map +1 -0
  574. package/dist/webhooks/webhooks.metrics.d.ts +24 -0
  575. package/dist/webhooks/webhooks.metrics.d.ts.map +1 -0
  576. package/dist/webhooks/webhooks.metrics.js +70 -0
  577. package/dist/webhooks/webhooks.metrics.js.map +1 -0
  578. package/dist/webhooks/webhooks.module.d.ts +29 -0
  579. package/dist/webhooks/webhooks.module.d.ts.map +1 -0
  580. package/dist/webhooks/webhooks.module.js +108 -0
  581. package/dist/webhooks/webhooks.module.js.map +1 -0
  582. package/dist/webhooks/webhooks.options.d.ts +119 -0
  583. package/dist/webhooks/webhooks.options.d.ts.map +1 -0
  584. package/dist/webhooks/webhooks.options.js +80 -0
  585. package/dist/webhooks/webhooks.options.js.map +1 -0
  586. package/dist/webhooks/webhooks.permissions.d.ts +47 -0
  587. package/dist/webhooks/webhooks.permissions.d.ts.map +1 -0
  588. package/dist/webhooks/webhooks.permissions.js +83 -0
  589. package/dist/webhooks/webhooks.permissions.js.map +1 -0
  590. package/dist/webhooks/webhooks.repository.d.ts +162 -0
  591. package/dist/webhooks/webhooks.repository.d.ts.map +1 -0
  592. package/dist/webhooks/webhooks.repository.js +246 -0
  593. package/dist/webhooks/webhooks.repository.js.map +1 -0
  594. package/dist/webhooks/webhooks.service.d.ts +91 -0
  595. package/dist/webhooks/webhooks.service.d.ts.map +1 -0
  596. package/dist/webhooks/webhooks.service.js +216 -0
  597. package/dist/webhooks/webhooks.service.js.map +1 -0
  598. package/package.json +19 -3
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.alertRuleKindRegistry = void 0;
4
+ exports.registerAlertRuleKind = registerAlertRuleKind;
5
+ exports.parseAlertConfig = parseAlertConfig;
6
+ const index_1 = require("../../core/index");
7
+ const alerts_1 = require("@marinoscar/platform-contract/alerts");
8
+ const alerts_errors_1 = require("../alerts.errors");
9
+ /**
10
+ * Every registered rule kind. Open: an app adds its own with
11
+ * {@link registerAlertRuleKind} at import time, before the application
12
+ * bootstraps (the registry freezes then).
13
+ *
14
+ * @extensionPoint registry
15
+ * @stability experimental
16
+ */
17
+ exports.alertRuleKindRegistry = (0, index_1.defineRegistry)({
18
+ name: 'alert-rule-kinds',
19
+ idOf: (kind) => kind.id,
20
+ idPattern: alerts_1.ALERT_KIND_PATTERN,
21
+ validate: (kind) => {
22
+ if (typeof kind.evaluate !== 'function')
23
+ throw new Error('an alert rule kind needs an evaluate function');
24
+ if (!kind.configSchema || typeof kind.configSchema.safeParse !== 'function') {
25
+ throw new Error('an alert rule kind needs a zod configSchema');
26
+ }
27
+ },
28
+ describeDuplicate: (existing) => `Duplicate alert rule kind "${existing.id}". Kind ids are persisted on rules; pick a new id.`,
29
+ });
30
+ /**
31
+ * Registers a rule kind. Kind ids are PERMANENT once rules of the kind exist.
32
+ *
33
+ * @param kind - the kind.
34
+ * @throws RegistryError `INVALID_ID`, `INVALID_ENTRY`, `DUPLICATE_ID` or `FROZEN`.
35
+ *
36
+ * @extensionPoint registry
37
+ * @stability experimental
38
+ */
39
+ function registerAlertRuleKind(kind) {
40
+ exports.alertRuleKindRegistry.register(kind);
41
+ }
42
+ /**
43
+ * Validates `config` against the schema of `kind`, returning the parsed (and
44
+ * defaulted) value.
45
+ *
46
+ * @param kind - the kind id.
47
+ * @param config - the raw config.
48
+ * @returns the parsed config.
49
+ * @throws AlertConfigError `ALERT_UNKNOWN_KIND` or `ALERT_INVALID_CONFIG`.
50
+ *
51
+ * @stability experimental
52
+ */
53
+ function parseAlertConfig(kind, config) {
54
+ const def = exports.alertRuleKindRegistry.get(kind);
55
+ if (!def)
56
+ throw new alerts_errors_1.AlertConfigError('ALERT_UNKNOWN_KIND', `There is no alert rule kind "${kind}".`);
57
+ const parsed = def.configSchema.safeParse(config ?? {});
58
+ if (!parsed.success) {
59
+ throw new alerts_errors_1.AlertConfigError('ALERT_INVALID_CONFIG', `The config does not match the "${kind}" kind.`, parsed.error.issues.map((issue) => ({ path: issue.path.join('.'), message: issue.message })));
60
+ }
61
+ return parsed.data;
62
+ }
63
+ //# sourceMappingURL=alert-kind.registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"alert-kind.registry.js","sourceRoot":"","sources":["../../../src/alerts/kinds/alert-kind.registry.ts"],"names":[],"mappings":";;;AAsCA,sDAEC;AAaD,4CAYC;AA/DD,4CAAkD;AAClD,iEAA0E;AAC1E,oDAAoD;AAGpD;;;;;;;GAOG;AACU,QAAA,qBAAqB,GAAG,IAAA,sBAAc,EAAgB;IACjE,IAAI,EAAE,kBAAkB;IACxB,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE;IACvB,SAAS,EAAE,2BAAkB;IAC7B,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE;QACjB,IAAI,OAAO,IAAI,CAAC,QAAQ,KAAK,UAAU;YAAE,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QAC1G,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,OAAQ,IAAI,CAAC,YAA0B,CAAC,SAAS,KAAK,UAAU,EAAE,CAAC;YAC3F,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;IACD,iBAAiB,EAAE,CAAC,QAAQ,EAAE,EAAE,CAC9B,8BAA8B,QAAQ,CAAC,EAAE,oDAAoD;CAChG,CAAC,CAAC;AAEH;;;;;;;;GAQG;AACH,SAAgB,qBAAqB,CAAI,IAAsB;IAC7D,6BAAqB,CAAC,QAAQ,CAAC,IAAqB,CAAC,CAAC;AACxD,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAgB,gBAAgB,CAAC,IAAY,EAAE,MAAe;IAC5D,MAAM,GAAG,GAAG,6BAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC5C,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,gCAAgB,CAAC,oBAAoB,EAAE,gCAAgC,IAAI,IAAI,CAAC,CAAC;IACrG,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,CAAC,SAAS,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;IACxD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,IAAI,gCAAgB,CACxB,sBAAsB,EACtB,kCAAkC,IAAI,SAAS,EAC/C,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAC7F,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { AlertRuleKind } from '../alerts.types';
2
+ /**
3
+ * The five kinds the slice ships, in registration order.
4
+ *
5
+ * @stability experimental
6
+ */
7
+ export declare const BUILTIN_ALERT_KINDS: readonly AlertRuleKind[];
8
+ /**
9
+ * Registers the built-in kinds. IDEMPOTENT: a kind already registered with the
10
+ * built-in definition is skipped (`AlertsModule.forRoot` and an app may both
11
+ * call it).
12
+ *
13
+ * @throws RegistryError `FROZEN` when something is left to register after the application bootstrapped.
14
+ *
15
+ * @stability experimental
16
+ */
17
+ export declare function registerBuiltinAlertKinds(): void;
18
+ //# sourceMappingURL=builtin-kinds.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builtin-kinds.d.ts","sourceRoot":"","sources":["../../../src/alerts/kinds/builtin-kinds.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAQrD;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,EAAE,SAAS,aAAa,EAAiG,CAAC;AAE1J;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,IAAI,IAAI,CAKhD"}
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BUILTIN_ALERT_KINDS = void 0;
4
+ exports.registerBuiltinAlertKinds = registerBuiltinAlertKinds;
5
+ const alert_kind_registry_1 = require("./alert-kind.registry");
6
+ const metric_threshold_kind_1 = require("./metric-threshold.kind");
7
+ const node_event_kind_1 = require("./node-event.kind");
8
+ const node_offline_kind_1 = require("./node-offline.kind");
9
+ const telemetry_unavailable_kind_1 = require("./telemetry-unavailable.kind");
10
+ const verdict_kind_1 = require("./verdict.kind");
11
+ /**
12
+ * The five kinds the slice ships, in registration order.
13
+ *
14
+ * @stability experimental
15
+ */
16
+ exports.BUILTIN_ALERT_KINDS = [metric_threshold_kind_1.metricThresholdKind, node_event_kind_1.nodeEventKind, verdict_kind_1.verdictKind, node_offline_kind_1.nodeOfflineKind, telemetry_unavailable_kind_1.telemetryUnavailableKind];
17
+ /**
18
+ * Registers the built-in kinds. IDEMPOTENT: a kind already registered with the
19
+ * built-in definition is skipped (`AlertsModule.forRoot` and an app may both
20
+ * call it).
21
+ *
22
+ * @throws RegistryError `FROZEN` when something is left to register after the application bootstrapped.
23
+ *
24
+ * @stability experimental
25
+ */
26
+ function registerBuiltinAlertKinds() {
27
+ for (const kind of exports.BUILTIN_ALERT_KINDS) {
28
+ if (alert_kind_registry_1.alertRuleKindRegistry.get(kind.id) === kind)
29
+ continue;
30
+ (0, alert_kind_registry_1.registerAlertRuleKind)(kind);
31
+ }
32
+ }
33
+ //# sourceMappingURL=builtin-kinds.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builtin-kinds.js","sourceRoot":"","sources":["../../../src/alerts/kinds/builtin-kinds.ts"],"names":[],"mappings":";;;AAwBA,8DAKC;AA5BD,+DAAqF;AACrF,mEAA8D;AAC9D,uDAAkD;AAClD,2DAAsD;AACtD,6EAAwE;AACxE,iDAA6C;AAE7C;;;;GAIG;AACU,QAAA,mBAAmB,GAA6B,CAAC,2CAAmB,EAAE,+BAAa,EAAE,0BAAW,EAAE,mCAAe,EAAE,qDAAwB,CAAC,CAAC;AAE1J;;;;;;;;GAQG;AACH,SAAgB,yBAAyB;IACvC,KAAK,MAAM,IAAI,IAAI,2BAAmB,EAAE,CAAC;QACvC,IAAI,2CAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,IAAI;YAAE,SAAS;QAC1D,IAAA,2CAAqB,EAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { type MetricThresholdConfig } from '@marinoscar/platform-contract/alerts';
2
+ import type { AlertRuleKind } from '../alerts.types';
3
+ /**
4
+ * `metric_threshold`: one aggregate of one telemetry metric over a window,
5
+ * compared to a threshold, per group. Runs ONE statement through the guarded
6
+ * telemetry facade; an unreachable store throws `AlertStoreUnavailableError`.
7
+ *
8
+ * @stability experimental
9
+ */
10
+ export declare const metricThresholdKind: AlertRuleKind<MetricThresholdConfig>;
11
+ //# sourceMappingURL=metric-threshold.kind.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metric-threshold.kind.d.ts","sourceRoot":"","sources":["../../../src/alerts/kinds/metric-threshold.kind.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsE,KAAK,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAEtJ,OAAO,KAAK,EAAE,aAAa,EAAiB,MAAM,iBAAiB,CAAC;AAuBpE;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,EAAE,aAAa,CAAC,qBAAqB,CAkCpE,CAAC"}
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.metricThresholdKind = void 0;
4
+ const alerts_1 = require("@marinoscar/platform-contract/alerts");
5
+ const metric_threshold_sql_1 = require("./metric-threshold.sql");
6
+ /** Most label sets one evaluation reads. */
7
+ const MAX_GROUPS = 200;
8
+ const SYMBOL = {
9
+ gt: '>',
10
+ gte: '>=',
11
+ lt: '<',
12
+ lte: '<=',
13
+ eq: '=',
14
+ neq: '!=',
15
+ };
16
+ function describeConfig(config) {
17
+ return `${config.aggregation}(${config.metric}) over ${config.windowSeconds}s ${SYMBOL[config.comparator]} ${config.threshold}`;
18
+ }
19
+ function formatValue(value) {
20
+ return Number.isInteger(value) ? String(value) : value.toFixed(2);
21
+ }
22
+ /**
23
+ * `metric_threshold`: one aggregate of one telemetry metric over a window,
24
+ * compared to a threshold, per group. Runs ONE statement through the guarded
25
+ * telemetry facade; an unreachable store throws `AlertStoreUnavailableError`.
26
+ *
27
+ * @stability experimental
28
+ */
29
+ exports.metricThresholdKind = {
30
+ id: alerts_1.ALERT_KIND_IDS.METRIC_THRESHOLD,
31
+ label: 'Metric threshold',
32
+ description: 'An aggregate of one telemetry metric over a time window compared to a threshold, per group.',
33
+ configSchema: alerts_1.metricThresholdConfigSchema,
34
+ async evaluate(ctx, rule) {
35
+ const { config } = rule;
36
+ const telemetry = await ctx.telemetry();
37
+ const table = (0, metric_threshold_sql_1.resolveMetricTable)(config.metric, telemetry.tables);
38
+ if (!table)
39
+ throw new Error(`The telemetry store has no table for the metric "${config.metric}" (yet).`);
40
+ const sql = (0, metric_threshold_sql_1.buildMetricThresholdSql)(config, table, telemetry.query, ctx.now);
41
+ const result = await telemetry.query.query(sql, { maxRows: MAX_GROUPS });
42
+ const groupBy = config.groupBy ?? [];
43
+ return result.rows.map((row) => {
44
+ const labels = {};
45
+ groupBy.forEach((column, index) => {
46
+ const raw = row[index];
47
+ labels[column] = raw === null || raw === undefined ? '' : String(raw);
48
+ });
49
+ const raw = row[groupBy.length];
50
+ const value = raw === null || raw === undefined ? Number.NaN : Number(raw);
51
+ const known = Number.isFinite(value);
52
+ const where = Object.keys(labels).length > 0 ? ` for ${Object.entries(labels).map(([k, v]) => `${k}=${v}`).join(', ')}` : '';
53
+ return {
54
+ labels,
55
+ value: known ? value : null,
56
+ breached: known && (0, metric_threshold_sql_1.compareValue)(value, config.comparator, config.threshold),
57
+ summary: `${rule.name}: ${config.aggregation} of ${config.metric} is ${known ? formatValue(value) : 'unknown'}${where} (${SYMBOL[config.comparator]} ${config.threshold})`.slice(0, 500),
58
+ };
59
+ });
60
+ },
61
+ describe: (rule) => describeConfig(rule.config),
62
+ };
63
+ //# sourceMappingURL=metric-threshold.kind.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metric-threshold.kind.js","sourceRoot":"","sources":["../../../src/alerts/kinds/metric-threshold.kind.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import type { AlertComparator, MetricThresholdConfig } from '@marinoscar/platform-contract/alerts';
2
+ import type { TelemetryQueryFacade } from '../../telemetry/index';
3
+ import type { AlertMetricTable } from '../alerts.types';
4
+ /** The suffixes the store appends to a metric's table name, by unit or kind. */
5
+ export declare const METRIC_TABLE_SUFFIXES: readonly ["", "_total", "_bytes", "_seconds", "_ratio", "_percent"];
6
+ /**
7
+ * The table a metric name or table name resolves to: the name with `.` turned
8
+ * into `_`, as is, or with one of the store's unit suffixes.
9
+ *
10
+ * @param metric - a dotted metric name (`app.jobs.settled`) or a table name.
11
+ * @param tables - the store's metric tables.
12
+ * @returns the table, or `null` when the store has none.
13
+ *
14
+ * @stability experimental
15
+ */
16
+ export declare function resolveMetricTable(metric: string, tables: ReadonlyMap<string, AlertMetricTable>): AlertMetricTable | null;
17
+ /**
18
+ * Whether `value` breaches `threshold` under `comparator`.
19
+ *
20
+ * @param value - the observed value.
21
+ * @param comparator - the rule's comparator.
22
+ * @param threshold - the rule's threshold.
23
+ * @returns the verdict.
24
+ *
25
+ * @stability experimental
26
+ */
27
+ export declare function compareValue(value: number, comparator: AlertComparator, threshold: number): boolean;
28
+ /**
29
+ * Builds the statement for one rule over one table. Throws when a named
30
+ * column is not a column of the table.
31
+ *
32
+ * @param config - the rule's parsed config.
33
+ * @param table - the resolved metric table.
34
+ * @param query - the facade (its builders quote; its dialect spells the columns).
35
+ * @param now - the end of the window.
36
+ * @returns one SELECT. The result columns are the `groupBy` columns (as text), then `value`.
37
+ *
38
+ * @stability experimental
39
+ */
40
+ export declare function buildMetricThresholdSql(config: MetricThresholdConfig, table: AlertMetricTable, query: Pick<TelemetryQueryFacade, 'sql' | 'dialect'>, now: Date): string;
41
+ //# sourceMappingURL=metric-threshold.sql.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metric-threshold.sql.d.ts","sourceRoot":"","sources":["../../../src/alerts/kinds/metric-threshold.sql.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAEnG,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAcxD,gFAAgF;AAChF,eAAO,MAAM,qBAAqB,qEAAsE,CAAC;AAEzG;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,gBAAgB,CAAC,GAC5C,gBAAgB,GAAG,IAAI,CAOzB;AAED;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAenG;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,qBAAqB,EAC7B,KAAK,EAAE,gBAAgB,EACvB,KAAK,EAAE,IAAI,CAAC,oBAAoB,EAAE,KAAK,GAAG,SAAS,CAAC,EACpD,GAAG,EAAE,IAAI,GACR,MAAM,CAwDR"}
@@ -0,0 +1,124 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.METRIC_TABLE_SUFFIXES = void 0;
4
+ exports.resolveMetricTable = resolveMetricTable;
5
+ exports.compareValue = compareValue;
6
+ exports.buildMetricThresholdSql = buildMetricThresholdSql;
7
+ // =============================================================================
8
+ // The one statement a `metric_threshold` rule runs (issue #1047)
9
+ // =============================================================================
10
+ //
11
+ // EVERY value that reaches the SQL goes through the facade's builders
12
+ // (`sql.ident` for a column, `sql.literal` for a filter value, `sql.timestamp`
13
+ // for the window): nothing from a rule's config is concatenated. The only
14
+ // other interpolated numbers are integers this file computes itself from the
15
+ // validated window. Column names a rule names (`groupBy`, a filter's `attr`)
16
+ // are additionally required to be columns of the resolved table.
17
+ // =============================================================================
18
+ /** The suffixes the store appends to a metric's table name, by unit or kind. */
19
+ exports.METRIC_TABLE_SUFFIXES = ['', '_total', '_bytes', '_seconds', '_ratio', '_percent'];
20
+ /**
21
+ * The table a metric name or table name resolves to: the name with `.` turned
22
+ * into `_`, as is, or with one of the store's unit suffixes.
23
+ *
24
+ * @param metric - a dotted metric name (`app.jobs.settled`) or a table name.
25
+ * @param tables - the store's metric tables.
26
+ * @returns the table, or `null` when the store has none.
27
+ *
28
+ * @stability experimental
29
+ */
30
+ function resolveMetricTable(metric, tables) {
31
+ const base = metric.replace(/\./g, '_');
32
+ for (const suffix of exports.METRIC_TABLE_SUFFIXES) {
33
+ const table = tables.get(`${base}${suffix}`);
34
+ if (table)
35
+ return table;
36
+ }
37
+ return null;
38
+ }
39
+ /**
40
+ * Whether `value` breaches `threshold` under `comparator`.
41
+ *
42
+ * @param value - the observed value.
43
+ * @param comparator - the rule's comparator.
44
+ * @param threshold - the rule's threshold.
45
+ * @returns the verdict.
46
+ *
47
+ * @stability experimental
48
+ */
49
+ function compareValue(value, comparator, threshold) {
50
+ switch (comparator) {
51
+ case 'gt':
52
+ return value > threshold;
53
+ case 'gte':
54
+ return value >= threshold;
55
+ case 'lt':
56
+ return value < threshold;
57
+ case 'lte':
58
+ return value <= threshold;
59
+ case 'eq':
60
+ return value === threshold;
61
+ case 'neq':
62
+ return value !== threshold;
63
+ }
64
+ }
65
+ /**
66
+ * Builds the statement for one rule over one table. Throws when a named
67
+ * column is not a column of the table.
68
+ *
69
+ * @param config - the rule's parsed config.
70
+ * @param table - the resolved metric table.
71
+ * @param query - the facade (its builders quote; its dialect spells the columns).
72
+ * @param now - the end of the window.
73
+ * @returns one SELECT. The result columns are the `groupBy` columns (as text), then `value`.
74
+ *
75
+ * @stability experimental
76
+ */
77
+ function buildMetricThresholdSql(config, table, query, now) {
78
+ const { sql, dialect } = query;
79
+ const groupBy = config.groupBy ?? [];
80
+ const filters = config.filters ?? [];
81
+ for (const column of [...groupBy, ...filters.map((f) => f.attr)]) {
82
+ if (!table.columns.has(column)) {
83
+ throw new Error(`The metric table "${table.name}" has no column "${column}".`);
84
+ }
85
+ }
86
+ if (!Number.isInteger(config.windowSeconds) || config.windowSeconds < 1) {
87
+ throw new RangeError('windowSeconds must be a positive integer');
88
+ }
89
+ const from = new Date(now.getTime() - config.windowSeconds * 1000);
90
+ const ts = dialect.timestampColumn;
91
+ const value = sql.ident(dialect.valueColumn);
92
+ const where = [
93
+ sql.between(ts, from, now),
94
+ ...filters.map((f) => `${sql.ident(f.attr)} ${f.op === 'eq' ? '=' : '<>'} ${sql.literal(f.value)}`),
95
+ ].join(' AND ');
96
+ const groupSelect = groupBy.map((column) => `${dialect.castText(sql.ident(column))} AS ${sql.ident(column)}`);
97
+ const groupRef = groupBy.map((column) => sql.ident(column));
98
+ const tail = groupRef.length > 0 ? ` GROUP BY ${groupRef.join(', ')}` : '';
99
+ if (config.aggregation === 'rate') {
100
+ // A counter's increase per series (max - min over the window), summed across
101
+ // the series that share the group, per minute. Resets inside the window are
102
+ // not corrected for: a reset reads as a smaller increase, never a false one.
103
+ const seriesColumns = [...new Set([...table.tags, ...groupBy])];
104
+ const inner = `SELECT ${[...seriesColumns.map((c) => sql.ident(c)), `MAX(${value}) - MIN(${value}) AS ${sql.ident('inc')}`].join(', ')} ` +
105
+ `FROM ${sql.ident(table.name)} WHERE ${where}` +
106
+ (seriesColumns.length > 0 ? ` GROUP BY ${seriesColumns.map((c) => sql.ident(c)).join(', ')}` : '');
107
+ const minutes = config.windowSeconds / 60;
108
+ const outerSelect = [
109
+ ...groupBy.map((column) => `${dialect.castText(sql.ident(column))} AS ${sql.ident(column)}`),
110
+ `SUM(${sql.ident('inc')}) / ${minutes} AS ${sql.ident('value')}`,
111
+ ];
112
+ return `SELECT ${outerSelect.join(', ')} FROM (${inner}) AS ${sql.ident('series')}${tail}`;
113
+ }
114
+ const aggregate = {
115
+ avg: `AVG(${value})`,
116
+ max: `MAX(${value})`,
117
+ min: `MIN(${value})`,
118
+ sum: `SUM(${value})`,
119
+ last: `last_value(${value} ORDER BY ${sql.ident(ts)})`,
120
+ }[config.aggregation];
121
+ return (`SELECT ${[...groupSelect, `${aggregate} AS ${sql.ident('value')}`].join(', ')} ` +
122
+ `FROM ${sql.ident(table.name)} WHERE ${where}${tail}`);
123
+ }
124
+ //# sourceMappingURL=metric-threshold.sql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metric-threshold.sql.js","sourceRoot":"","sources":["../../../src/alerts/kinds/metric-threshold.sql.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import { type NodeEventConfig } from '@marinoscar/platform-contract/alerts';
2
+ import type { AlertRuleKind } from '../alerts.types';
3
+ /**
4
+ * Whether a dotted event type matches one pattern: exact, or `prefix.*`.
5
+ *
6
+ * @param pattern - `power.battery_low` or `power.*`.
7
+ * @param type - the event type.
8
+ * @returns whether it matches.
9
+ *
10
+ * @stability experimental
11
+ */
12
+ export declare function eventTypeMatches(pattern: string, type: string): boolean;
13
+ /**
14
+ * How a node event relates to a rule: it triggers it, recovers it, or is unrelated (`null`).
15
+ *
16
+ * @stability experimental
17
+ */
18
+ export type NodeEventClassification = 'trigger' | 'recovery' | null;
19
+ /**
20
+ * Classifies one event against a rule's config.
21
+ *
22
+ * @param config - the rule's parsed config.
23
+ * @param event - the event (type, severity, attrs, node).
24
+ * @returns `trigger`, `recovery` or `null`.
25
+ *
26
+ * @stability experimental
27
+ */
28
+ export declare function classifyNodeEvent(config: NodeEventConfig, event: {
29
+ nodeId: string;
30
+ type: string;
31
+ severity: string;
32
+ attrs: unknown;
33
+ }): NodeEventClassification;
34
+ /**
35
+ * `node_event`: a worker node reported a matching event. Reads the
36
+ * `worker_node_events` table (not the telemetry store), so it works with
37
+ * telemetry off. Per node the NEWEST classified event inside
38
+ * `resolveAfterSeconds` decides: a trigger breaches, a recovery clears, and a
39
+ * node with no such event inside the window is absent (clear).
40
+ *
41
+ * @stability experimental
42
+ */
43
+ export declare const nodeEventKind: AlertRuleKind<NodeEventConfig>;
44
+ //# sourceMappingURL=node-event.kind.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-event.kind.d.ts","sourceRoot":"","sources":["../../../src/alerts/kinds/node-event.kind.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,eAAe,EACrB,MAAM,sCAAsC,CAAC;AAE9C,OAAO,KAAK,EAAyB,aAAa,EAAiB,MAAM,iBAAiB,CAAC;AAO3F;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAEvE;AAYD;;;;GAIG;AACH,MAAM,MAAM,uBAAuB,GAAG,SAAS,GAAG,UAAU,GAAG,IAAI,CAAC;AAEpE;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,eAAe,EACvB,KAAK,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GACxE,uBAAuB,CAazB;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,aAAa,EAAE,aAAa,CAAC,eAAe,CAsDxD,CAAC"}
@@ -0,0 +1,113 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.nodeEventKind = void 0;
4
+ exports.eventTypeMatches = eventTypeMatches;
5
+ exports.classifyNodeEvent = classifyNodeEvent;
6
+ const alerts_1 = require("@marinoscar/platform-contract/alerts");
7
+ const SEVERITY_RANK = { info: 0, warning: 1, critical: 2 };
8
+ /** Most events one evaluation reads. */
9
+ const MAX_EVENTS = 2_000;
10
+ /**
11
+ * Whether a dotted event type matches one pattern: exact, or `prefix.*`.
12
+ *
13
+ * @param pattern - `power.battery_low` or `power.*`.
14
+ * @param type - the event type.
15
+ * @returns whether it matches.
16
+ *
17
+ * @stability experimental
18
+ */
19
+ function eventTypeMatches(pattern, type) {
20
+ return pattern.endsWith('.*') ? type.startsWith(pattern.slice(0, -1)) : pattern === type;
21
+ }
22
+ function typeIn(patterns, type) {
23
+ return patterns.some((pattern) => eventTypeMatches(pattern, type));
24
+ }
25
+ function attrsMatch(wanted, attrs) {
26
+ if (!wanted)
27
+ return true;
28
+ const have = (attrs && typeof attrs === 'object' ? attrs : {});
29
+ return Object.entries(wanted).every(([key, value]) => String(have[key]) === String(value));
30
+ }
31
+ /**
32
+ * Classifies one event against a rule's config.
33
+ *
34
+ * @param config - the rule's parsed config.
35
+ * @param event - the event (type, severity, attrs, node).
36
+ * @returns `trigger`, `recovery` or `null`.
37
+ *
38
+ * @stability experimental
39
+ */
40
+ function classifyNodeEvent(config, event) {
41
+ if (config.nodeIds && config.nodeIds.length > 0 && !config.nodeIds.includes(event.nodeId))
42
+ return null;
43
+ if (typeIn(config.eventTypes, event.type) &&
44
+ (SEVERITY_RANK[event.severity] ?? 0) >= (SEVERITY_RANK[config.minSeverity ?? 'info'] ?? 0) &&
45
+ attrsMatch(config.attrs, event.attrs)) {
46
+ return 'trigger';
47
+ }
48
+ if (config.recovery && typeIn(config.recovery.eventTypes, event.type) && attrsMatch(config.recovery.attrs, event.attrs)) {
49
+ return 'recovery';
50
+ }
51
+ return null;
52
+ }
53
+ /**
54
+ * `node_event`: a worker node reported a matching event. Reads the
55
+ * `worker_node_events` table (not the telemetry store), so it works with
56
+ * telemetry off. Per node the NEWEST classified event inside
57
+ * `resolveAfterSeconds` decides: a trigger breaches, a recovery clears, and a
58
+ * node with no such event inside the window is absent (clear).
59
+ *
60
+ * @stability experimental
61
+ */
62
+ exports.nodeEventKind = {
63
+ id: alerts_1.ALERT_KIND_IDS.NODE_EVENT,
64
+ label: 'Node event',
65
+ description: 'A worker node reported a matching event (for example it switched to battery). Clears on a recovery event or after a set time.',
66
+ configSchema: alerts_1.nodeEventConfigSchema,
67
+ eventDriven: true,
68
+ async evaluate(ctx, rule) {
69
+ const { config } = rule;
70
+ const since = new Date(ctx.now.getTime() - config.resolveAfterSeconds * 1000);
71
+ const patterns = [...config.eventTypes, ...(config.recovery?.eventTypes ?? [])];
72
+ const exact = patterns.filter((p) => !p.endsWith('.*'));
73
+ const prefixes = patterns.filter((p) => p.endsWith('.*')).map((p) => p.slice(0, -1));
74
+ const events = await ctx.db.workerNodeEvent.findMany({
75
+ where: {
76
+ receivedAt: { gte: since },
77
+ OR: [...(exact.length > 0 ? [{ type: { in: exact } }] : []), ...prefixes.map((prefix) => ({ type: { startsWith: prefix } }))],
78
+ },
79
+ orderBy: { receivedAt: 'asc' },
80
+ take: MAX_EVENTS,
81
+ });
82
+ const latest = new Map();
83
+ for (const event of events) {
84
+ const kind = classifyNodeEvent(config, event);
85
+ if (kind)
86
+ latest.set(event.nodeId, { kind, type: event.type });
87
+ }
88
+ if (latest.size === 0)
89
+ return [];
90
+ const nodes = await ctx.db.workerNode.findMany({ where: { id: { in: [...latest.keys()] } }, select: { id: true, name: true } });
91
+ const names = new Map(nodes.map((node) => [node.id, node.name]));
92
+ return [...latest.entries()].map(([nodeId, state]) => {
93
+ const name = names.get(nodeId) ?? nodeId;
94
+ return {
95
+ labels: { 'node.id': nodeId, 'node.name': name },
96
+ value: null,
97
+ breached: state.kind === 'trigger',
98
+ summary: state.kind === 'trigger'
99
+ ? `${rule.name}: node ${name} reported ${state.type}`
100
+ : `${rule.name}: node ${name} recovered (${state.type})`,
101
+ };
102
+ });
103
+ },
104
+ matchesEvent(config, event) {
105
+ return classifyNodeEvent(config, event) !== null;
106
+ },
107
+ describe: (rule) => {
108
+ const { config } = rule;
109
+ const recovery = config.recovery ? `; clears on ${config.recovery.eventTypes.join(', ')}` : '';
110
+ return `A node reports ${config.eventTypes.join(', ')}${recovery}; otherwise clears after ${config.resolveAfterSeconds}s`;
111
+ },
112
+ };
113
+ //# sourceMappingURL=node-event.kind.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-event.kind.js","sourceRoot":"","sources":["../../../src/alerts/kinds/node-event.kind.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { AlertRuleKind } from '../alerts.types';
2
+ /**
3
+ * `node_offline`: a worker node is stale or offline, by the same rule the
4
+ * fleet page uses (`deriveNodeHealth`). A node an operator DISABLED is left
5
+ * out (disabling is intent, not failure). A node that deregistered gracefully
6
+ * is `offline` too and alerts until the fleet's offline retention prunes it.
7
+ *
8
+ * @stability experimental
9
+ */
10
+ export declare const nodeOfflineKind: AlertRuleKind<Record<string, never>>;
11
+ //# sourceMappingURL=node-offline.kind.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-offline.kind.d.ts","sourceRoot":"","sources":["../../../src/alerts/kinds/node-offline.kind.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAGrD;;;;;;;GAOG;AACH,eAAO,MAAM,eAAe,EAAE,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CA8BhE,CAAC"}
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.nodeOfflineKind = void 0;
4
+ const alerts_1 = require("@marinoscar/platform-contract/alerts");
5
+ const index_1 = require("../../nodes/index");
6
+ /**
7
+ * `node_offline`: a worker node is stale or offline, by the same rule the
8
+ * fleet page uses (`deriveNodeHealth`). A node an operator DISABLED is left
9
+ * out (disabling is intent, not failure). A node that deregistered gracefully
10
+ * is `offline` too and alerts until the fleet's offline retention prunes it.
11
+ *
12
+ * @stability experimental
13
+ */
14
+ exports.nodeOfflineKind = {
15
+ id: alerts_1.ALERT_KIND_IDS.NODE_OFFLINE,
16
+ label: 'Node offline',
17
+ description: 'A worker node stopped heartbeating (stale) or was marked offline.',
18
+ configSchema: alerts_1.emptyAlertConfigSchema,
19
+ async evaluate(ctx, rule) {
20
+ const staleSeconds = await ctx.staleHeartbeatSeconds();
21
+ const nodes = await ctx.db.workerNode.findMany({
22
+ where: { status: { not: 'disabled' } },
23
+ select: { id: true, name: true, status: true, lastHeartbeatAt: true },
24
+ take: 1_000,
25
+ });
26
+ return nodes.map((node) => {
27
+ const health = (0, index_1.deriveNodeHealth)({ status: node.status, lastHeartbeatAt: node.lastHeartbeatAt }, staleSeconds, ctx.now);
28
+ const breached = health !== 'healthy';
29
+ return {
30
+ labels: { 'node.id': node.id, 'node.name': node.name },
31
+ value: breached ? 1 : 0,
32
+ breached,
33
+ summary: breached
34
+ ? `${rule.name}: node ${node.name} is ${health}${node.lastHeartbeatAt ? ` (last heartbeat ${node.lastHeartbeatAt.toISOString()})` : ' (never sent a heartbeat)'}`
35
+ : `${rule.name}: node ${node.name} is healthy`,
36
+ };
37
+ });
38
+ },
39
+ describe: () => 'A worker node is stale or offline',
40
+ };
41
+ //# sourceMappingURL=node-offline.kind.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-offline.kind.js","sourceRoot":"","sources":["../../../src/alerts/kinds/node-offline.kind.ts"],"names":[],"mappings":";;;AAAA,iEAAqH;AAGrH,6CAAqD;AAErD;;;;;;;GAOG;AACU,QAAA,eAAe,GAAyC;IACnE,EAAE,EAAE,uBAAc,CAAC,YAAY;IAC/B,KAAK,EAAE,cAAc;IACrB,WAAW,EAAE,mEAAmE;IAChF,YAAY,EAAE,+BAAyF;IACvG,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI;QACtB,MAAM,YAAY,GAAG,MAAM,GAAG,CAAC,qBAAqB,EAAE,CAAC;QACvD,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;YAC7C,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,EAAE;YACtC,MAAM,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE;YACrE,IAAI,EAAE,KAAK;SACZ,CAAC,CAAC;QACH,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAoB,EAAE;YAC1C,MAAM,MAAM,GAAG,IAAA,wBAAgB,EAC7B,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,eAAe,EAAE,IAAI,CAAC,eAAe,EAAE,EAC9D,YAAY,EACZ,GAAG,CAAC,GAAG,CACR,CAAC;YACF,MAAM,QAAQ,GAAG,MAAM,KAAK,SAAS,CAAC;YACtC,OAAO;gBACL,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC,IAAI,EAAE;gBACtD,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACvB,QAAQ;gBACR,OAAO,EAAE,QAAQ;oBACf,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,UAAU,IAAI,CAAC,IAAI,OAAO,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,oBAAoB,IAAI,CAAC,eAAe,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,2BAA2B,EAAE;oBACjK,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,UAAU,IAAI,CAAC,IAAI,aAAa;aACjD,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IACD,QAAQ,EAAE,GAAG,EAAE,CAAC,mCAAmC;CACpD,CAAC"}