@meyicloud/meyi-insight-server 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (389) hide show
  1. package/dist/constants/incidentCategories.d.ts +18 -0
  2. package/dist/constants/incidentCategories.d.ts.map +1 -0
  3. package/dist/constants/incidentCategories.js +36 -0
  4. package/dist/constants/incidentCategories.js.map +1 -0
  5. package/dist/controllers/alert.controller.d.ts +12 -0
  6. package/dist/controllers/alert.controller.d.ts.map +1 -0
  7. package/dist/controllers/alert.controller.js +89 -0
  8. package/dist/controllers/alert.controller.js.map +1 -0
  9. package/dist/controllers/incident.controller.d.ts +16 -0
  10. package/dist/controllers/incident.controller.d.ts.map +1 -0
  11. package/dist/controllers/incident.controller.js +215 -0
  12. package/dist/controllers/incident.controller.js.map +1 -0
  13. package/dist/controllers/notification-provider.controller.d.ts +10 -0
  14. package/dist/controllers/notification-provider.controller.d.ts.map +1 -0
  15. package/dist/controllers/notification-provider.controller.js +59 -0
  16. package/dist/controllers/notification-provider.controller.js.map +1 -0
  17. package/dist/controllers/settings.controller.d.ts +7 -0
  18. package/dist/controllers/settings.controller.d.ts.map +1 -0
  19. package/dist/controllers/settings.controller.js +27 -0
  20. package/dist/controllers/settings.controller.js.map +1 -0
  21. package/dist/controllers/sop.controller.d.ts +11 -0
  22. package/dist/controllers/sop.controller.d.ts.map +1 -0
  23. package/dist/controllers/sop.controller.js +89 -0
  24. package/dist/controllers/sop.controller.js.map +1 -0
  25. package/dist/controllers/source.controller.d.ts +26 -0
  26. package/dist/controllers/source.controller.d.ts.map +1 -0
  27. package/dist/controllers/source.controller.js +333 -0
  28. package/dist/controllers/source.controller.js.map +1 -0
  29. package/dist/controllers/sourceDatadog.controller.d.ts +17 -0
  30. package/dist/controllers/sourceDatadog.controller.d.ts.map +1 -0
  31. package/dist/controllers/sourceDatadog.controller.js +169 -0
  32. package/dist/controllers/sourceDatadog.controller.js.map +1 -0
  33. package/dist/controllers/tenant.controller.d.ts +7 -0
  34. package/dist/controllers/tenant.controller.d.ts.map +1 -0
  35. package/dist/controllers/tenant.controller.js +33 -0
  36. package/dist/controllers/tenant.controller.js.map +1 -0
  37. package/dist/controllers/webhook.controller.d.ts +6 -0
  38. package/dist/controllers/webhook.controller.d.ts.map +1 -0
  39. package/dist/controllers/webhook.controller.js +83 -0
  40. package/dist/controllers/webhook.controller.js.map +1 -0
  41. package/dist/controllers/workflow.controller.d.ts +18 -0
  42. package/dist/controllers/workflow.controller.d.ts.map +1 -0
  43. package/dist/controllers/workflow.controller.js +118 -0
  44. package/dist/controllers/workflow.controller.js.map +1 -0
  45. package/dist/database/index.d.ts +7 -0
  46. package/dist/database/index.d.ts.map +1 -0
  47. package/dist/database/index.js +12 -0
  48. package/dist/database/index.js.map +1 -0
  49. package/dist/database/schema.d.ts +5358 -0
  50. package/dist/database/schema.d.ts.map +1 -0
  51. package/dist/database/schema.js +516 -0
  52. package/dist/database/schema.js.map +1 -0
  53. package/dist/features/sources/cloudtrail/controller.d.ts +38 -0
  54. package/dist/features/sources/cloudtrail/controller.d.ts.map +1 -0
  55. package/dist/features/sources/cloudtrail/controller.js +421 -0
  56. package/dist/features/sources/cloudtrail/controller.js.map +1 -0
  57. package/dist/features/sources/cloudtrail/routes.d.ts +6 -0
  58. package/dist/features/sources/cloudtrail/routes.d.ts.map +1 -0
  59. package/dist/features/sources/cloudtrail/routes.js +8 -0
  60. package/dist/features/sources/cloudtrail/routes.js.map +1 -0
  61. package/dist/features/sources/cloudtrail/schema.d.ts +2 -0
  62. package/dist/features/sources/cloudtrail/schema.d.ts.map +1 -0
  63. package/dist/features/sources/cloudtrail/schema.js +26 -0
  64. package/dist/features/sources/cloudtrail/schema.js.map +1 -0
  65. package/dist/features/sources/cloudtrail/stackTemplates.d.ts +3 -0
  66. package/dist/features/sources/cloudtrail/stackTemplates.d.ts.map +1 -0
  67. package/dist/features/sources/cloudtrail/stackTemplates.js +548 -0
  68. package/dist/features/sources/cloudtrail/stackTemplates.js.map +1 -0
  69. package/dist/features/sources/cloudtrail/template.d.ts +21 -0
  70. package/dist/features/sources/cloudtrail/template.d.ts.map +1 -0
  71. package/dist/features/sources/cloudtrail/template.js +1230 -0
  72. package/dist/features/sources/cloudtrail/template.js.map +1 -0
  73. package/dist/features/sources/cloudwatch/controller.d.ts +13 -0
  74. package/dist/features/sources/cloudwatch/controller.d.ts.map +1 -0
  75. package/dist/features/sources/cloudwatch/controller.js +514 -0
  76. package/dist/features/sources/cloudwatch/controller.js.map +1 -0
  77. package/dist/features/sources/cloudwatch/eventbridgeTemplate.d.ts +7 -0
  78. package/dist/features/sources/cloudwatch/eventbridgeTemplate.d.ts.map +1 -0
  79. package/dist/features/sources/cloudwatch/eventbridgeTemplate.js +230 -0
  80. package/dist/features/sources/cloudwatch/eventbridgeTemplate.js.map +1 -0
  81. package/dist/features/sources/cloudwatch/service.d.ts +50 -0
  82. package/dist/features/sources/cloudwatch/service.d.ts.map +1 -0
  83. package/dist/features/sources/cloudwatch/service.js +269 -0
  84. package/dist/features/sources/cloudwatch/service.js.map +1 -0
  85. package/dist/features/sources/cloudwatch/template.d.ts +26 -0
  86. package/dist/features/sources/cloudwatch/template.d.ts.map +1 -0
  87. package/dist/features/sources/cloudwatch/template.js +335 -0
  88. package/dist/features/sources/cloudwatch/template.js.map +1 -0
  89. package/dist/features/sources/cloudwatch/types.d.ts +26 -0
  90. package/dist/features/sources/cloudwatch/types.d.ts.map +1 -0
  91. package/dist/features/sources/cloudwatch/types.js +2 -0
  92. package/dist/features/sources/cloudwatch/types.js.map +1 -0
  93. package/dist/features/sources/grafana/controller.d.ts +18 -0
  94. package/dist/features/sources/grafana/controller.d.ts.map +1 -0
  95. package/dist/features/sources/grafana/controller.js +183 -0
  96. package/dist/features/sources/grafana/controller.js.map +1 -0
  97. package/dist/features/sources/grafana/routes.d.ts +6 -0
  98. package/dist/features/sources/grafana/routes.d.ts.map +1 -0
  99. package/dist/features/sources/grafana/routes.js +6 -0
  100. package/dist/features/sources/grafana/routes.js.map +1 -0
  101. package/dist/features/sources/grafana/schema.d.ts +2 -0
  102. package/dist/features/sources/grafana/schema.d.ts.map +1 -0
  103. package/dist/features/sources/grafana/schema.js +24 -0
  104. package/dist/features/sources/grafana/schema.js.map +1 -0
  105. package/dist/features/sources/grafana/service.d.ts +33 -0
  106. package/dist/features/sources/grafana/service.d.ts.map +1 -0
  107. package/dist/features/sources/grafana/service.js +215 -0
  108. package/dist/features/sources/grafana/service.js.map +1 -0
  109. package/dist/features/sources/index.d.ts +29 -0
  110. package/dist/features/sources/index.d.ts.map +1 -0
  111. package/dist/features/sources/index.js +47 -0
  112. package/dist/features/sources/index.js.map +1 -0
  113. package/dist/features/sources/observability/controller.d.ts +6 -0
  114. package/dist/features/sources/observability/controller.d.ts.map +1 -0
  115. package/dist/features/sources/observability/controller.js +16 -0
  116. package/dist/features/sources/observability/controller.js.map +1 -0
  117. package/dist/features/sources/observability/routes.d.ts +4 -0
  118. package/dist/features/sources/observability/routes.d.ts.map +1 -0
  119. package/dist/features/sources/observability/routes.js +8 -0
  120. package/dist/features/sources/observability/routes.js.map +1 -0
  121. package/dist/features/sources/observability/schema.d.ts +3 -0
  122. package/dist/features/sources/observability/schema.d.ts.map +1 -0
  123. package/dist/features/sources/observability/schema.js +44 -0
  124. package/dist/features/sources/observability/schema.js.map +1 -0
  125. package/dist/features/sources/observability/service.d.ts +36 -0
  126. package/dist/features/sources/observability/service.d.ts.map +1 -0
  127. package/dist/features/sources/observability/service.js +127 -0
  128. package/dist/features/sources/observability/service.js.map +1 -0
  129. package/dist/features/sources/prometheus/controller.d.ts +9 -0
  130. package/dist/features/sources/prometheus/controller.d.ts.map +1 -0
  131. package/dist/features/sources/prometheus/controller.js +359 -0
  132. package/dist/features/sources/prometheus/controller.js.map +1 -0
  133. package/dist/features/sources/prometheus/templates.d.ts +18 -0
  134. package/dist/features/sources/prometheus/templates.d.ts.map +1 -0
  135. package/dist/features/sources/prometheus/templates.js +244 -0
  136. package/dist/features/sources/prometheus/templates.js.map +1 -0
  137. package/dist/index.d.ts +7 -0
  138. package/dist/index.d.ts.map +1 -0
  139. package/dist/index.js +7 -0
  140. package/dist/index.js.map +1 -0
  141. package/dist/migrations/0007_pipeline_yaml_definitions.d.ts +3 -0
  142. package/dist/migrations/0007_pipeline_yaml_definitions.d.ts.map +1 -0
  143. package/dist/migrations/0007_pipeline_yaml_definitions.js +19 -0
  144. package/dist/migrations/0007_pipeline_yaml_definitions.js.map +1 -0
  145. package/dist/migrations/0008_tenant_isolation.d.ts +3 -0
  146. package/dist/migrations/0008_tenant_isolation.d.ts.map +1 -0
  147. package/dist/migrations/0008_tenant_isolation.js +42 -0
  148. package/dist/migrations/0008_tenant_isolation.js.map +1 -0
  149. package/dist/migrations/run.d.ts +6 -0
  150. package/dist/migrations/run.d.ts.map +1 -0
  151. package/dist/migrations/run.js +1262 -0
  152. package/dist/migrations/run.js.map +1 -0
  153. package/dist/models/alarm-group.model.d.ts +42 -0
  154. package/dist/models/alarm-group.model.d.ts.map +1 -0
  155. package/dist/models/alarm-group.model.js +98 -0
  156. package/dist/models/alarm-group.model.js.map +1 -0
  157. package/dist/models/alert.model.d.ts +54 -0
  158. package/dist/models/alert.model.d.ts.map +1 -0
  159. package/dist/models/alert.model.js +119 -0
  160. package/dist/models/alert.model.js.map +1 -0
  161. package/dist/models/dedup-config.model.d.ts +53 -0
  162. package/dist/models/dedup-config.model.d.ts.map +1 -0
  163. package/dist/models/dedup-config.model.js +157 -0
  164. package/dist/models/dedup-config.model.js.map +1 -0
  165. package/dist/models/grouping-config.model.d.ts +70 -0
  166. package/dist/models/grouping-config.model.d.ts.map +1 -0
  167. package/dist/models/grouping-config.model.js +174 -0
  168. package/dist/models/grouping-config.model.js.map +1 -0
  169. package/dist/models/incident-comment.model.d.ts +14 -0
  170. package/dist/models/incident-comment.model.d.ts.map +1 -0
  171. package/dist/models/incident-comment.model.js +38 -0
  172. package/dist/models/incident-comment.model.js.map +1 -0
  173. package/dist/models/incident-event.model.d.ts +16 -0
  174. package/dist/models/incident-event.model.d.ts.map +1 -0
  175. package/dist/models/incident-event.model.js +31 -0
  176. package/dist/models/incident-event.model.js.map +1 -0
  177. package/dist/models/incident.model.d.ts +47 -0
  178. package/dist/models/incident.model.d.ts.map +1 -0
  179. package/dist/models/incident.model.js +201 -0
  180. package/dist/models/incident.model.js.map +1 -0
  181. package/dist/models/normalization-config.model.d.ts +44 -0
  182. package/dist/models/normalization-config.model.d.ts.map +1 -0
  183. package/dist/models/normalization-config.model.js +153 -0
  184. package/dist/models/normalization-config.model.js.map +1 -0
  185. package/dist/models/notification-provider.model.d.ts +12 -0
  186. package/dist/models/notification-provider.model.d.ts.map +1 -0
  187. package/dist/models/notification-provider.model.js +48 -0
  188. package/dist/models/notification-provider.model.js.map +1 -0
  189. package/dist/models/pipeline-event.model.d.ts +15 -0
  190. package/dist/models/pipeline-event.model.d.ts.map +1 -0
  191. package/dist/models/pipeline-event.model.js +32 -0
  192. package/dist/models/pipeline-event.model.js.map +1 -0
  193. package/dist/models/settings.model.d.ts +8 -0
  194. package/dist/models/settings.model.d.ts.map +1 -0
  195. package/dist/models/settings.model.js +30 -0
  196. package/dist/models/settings.model.js.map +1 -0
  197. package/dist/models/sop.model.d.ts +58 -0
  198. package/dist/models/sop.model.d.ts.map +1 -0
  199. package/dist/models/sop.model.js +138 -0
  200. package/dist/models/sop.model.js.map +1 -0
  201. package/dist/models/source.model.d.ts +177 -0
  202. package/dist/models/source.model.d.ts.map +1 -0
  203. package/dist/models/source.model.js +794 -0
  204. package/dist/models/source.model.js.map +1 -0
  205. package/dist/models/tenant.model.d.ts +13 -0
  206. package/dist/models/tenant.model.d.ts.map +1 -0
  207. package/dist/models/tenant.model.js +28 -0
  208. package/dist/models/tenant.model.js.map +1 -0
  209. package/dist/models/workflow.model.d.ts +36 -0
  210. package/dist/models/workflow.model.d.ts.map +1 -0
  211. package/dist/models/workflow.model.js +136 -0
  212. package/dist/models/workflow.model.js.map +1 -0
  213. package/dist/pipeline/AlarmPipelineWorker.d.ts +18 -0
  214. package/dist/pipeline/AlarmPipelineWorker.d.ts.map +1 -0
  215. package/dist/pipeline/AlarmPipelineWorker.js +342 -0
  216. package/dist/pipeline/AlarmPipelineWorker.js.map +1 -0
  217. package/dist/pipeline/CanonicalAlarm.d.ts +59 -0
  218. package/dist/pipeline/CanonicalAlarm.d.ts.map +1 -0
  219. package/dist/pipeline/CanonicalAlarm.js +81 -0
  220. package/dist/pipeline/CanonicalAlarm.js.map +1 -0
  221. package/dist/pipeline/DedupService.d.ts +29 -0
  222. package/dist/pipeline/DedupService.d.ts.map +1 -0
  223. package/dist/pipeline/DedupService.js +172 -0
  224. package/dist/pipeline/DedupService.js.map +1 -0
  225. package/dist/pipeline/GroupFlushWorker.d.ts +16 -0
  226. package/dist/pipeline/GroupFlushWorker.d.ts.map +1 -0
  227. package/dist/pipeline/GroupFlushWorker.js +196 -0
  228. package/dist/pipeline/GroupFlushWorker.js.map +1 -0
  229. package/dist/pipeline/GroupingService.d.ts +27 -0
  230. package/dist/pipeline/GroupingService.d.ts.map +1 -0
  231. package/dist/pipeline/GroupingService.js +338 -0
  232. package/dist/pipeline/GroupingService.js.map +1 -0
  233. package/dist/pipeline/NormalizationRuleEngine.d.ts +5 -0
  234. package/dist/pipeline/NormalizationRuleEngine.d.ts.map +1 -0
  235. package/dist/pipeline/NormalizationRuleEngine.js +86 -0
  236. package/dist/pipeline/NormalizationRuleEngine.js.map +1 -0
  237. package/dist/pipeline/NormalizationService.d.ts +29 -0
  238. package/dist/pipeline/NormalizationService.d.ts.map +1 -0
  239. package/dist/pipeline/NormalizationService.js +275 -0
  240. package/dist/pipeline/NormalizationService.js.map +1 -0
  241. package/dist/pipeline/alarmQueue.d.ts +66 -0
  242. package/dist/pipeline/alarmQueue.d.ts.map +1 -0
  243. package/dist/pipeline/alarmQueue.js +254 -0
  244. package/dist/pipeline/alarmQueue.js.map +1 -0
  245. package/dist/pipeline/defaults/ensureDefaults.d.ts +3 -0
  246. package/dist/pipeline/defaults/ensureDefaults.d.ts.map +1 -0
  247. package/dist/pipeline/defaults/ensureDefaults.js +124 -0
  248. package/dist/pipeline/defaults/ensureDefaults.js.map +1 -0
  249. package/dist/pipeline/defaults/pipelineDefaults.d.ts +13 -0
  250. package/dist/pipeline/defaults/pipelineDefaults.d.ts.map +1 -0
  251. package/dist/pipeline/defaults/pipelineDefaults.js +266 -0
  252. package/dist/pipeline/defaults/pipelineDefaults.js.map +1 -0
  253. package/dist/pipeline/yaml/DedupYaml.d.ts +33 -0
  254. package/dist/pipeline/yaml/DedupYaml.d.ts.map +1 -0
  255. package/dist/pipeline/yaml/DedupYaml.js +25 -0
  256. package/dist/pipeline/yaml/DedupYaml.js.map +1 -0
  257. package/dist/pipeline/yaml/GroupingYaml.d.ts +49 -0
  258. package/dist/pipeline/yaml/GroupingYaml.d.ts.map +1 -0
  259. package/dist/pipeline/yaml/GroupingYaml.js +39 -0
  260. package/dist/pipeline/yaml/GroupingYaml.js.map +1 -0
  261. package/dist/pipeline/yaml/NormalizationYaml.d.ts +54 -0
  262. package/dist/pipeline/yaml/NormalizationYaml.d.ts.map +1 -0
  263. package/dist/pipeline/yaml/NormalizationYaml.js +23 -0
  264. package/dist/pipeline/yaml/NormalizationYaml.js.map +1 -0
  265. package/dist/pipeline/yaml/pipelineYaml.d.ts +11 -0
  266. package/dist/pipeline/yaml/pipelineYaml.d.ts.map +1 -0
  267. package/dist/pipeline/yaml/pipelineYaml.js +49 -0
  268. package/dist/pipeline/yaml/pipelineYaml.js.map +1 -0
  269. package/dist/realtime/events.d.ts +11 -0
  270. package/dist/realtime/events.d.ts.map +1 -0
  271. package/dist/realtime/events.js +21 -0
  272. package/dist/realtime/events.js.map +1 -0
  273. package/dist/routes/alert.routes.d.ts +4 -0
  274. package/dist/routes/alert.routes.d.ts.map +1 -0
  275. package/dist/routes/alert.routes.js +15 -0
  276. package/dist/routes/alert.routes.js.map +1 -0
  277. package/dist/routes/dedup-config.routes.d.ts +4 -0
  278. package/dist/routes/dedup-config.routes.d.ts.map +1 -0
  279. package/dist/routes/dedup-config.routes.js +82 -0
  280. package/dist/routes/dedup-config.routes.js.map +1 -0
  281. package/dist/routes/grouping-config.routes.d.ts +4 -0
  282. package/dist/routes/grouping-config.routes.d.ts.map +1 -0
  283. package/dist/routes/grouping-config.routes.js +82 -0
  284. package/dist/routes/grouping-config.routes.js.map +1 -0
  285. package/dist/routes/incident.routes.d.ts +4 -0
  286. package/dist/routes/incident.routes.d.ts.map +1 -0
  287. package/dist/routes/incident.routes.js +21 -0
  288. package/dist/routes/incident.routes.js.map +1 -0
  289. package/dist/routes/index.d.ts +47 -0
  290. package/dist/routes/index.d.ts.map +1 -0
  291. package/dist/routes/index.js +83 -0
  292. package/dist/routes/index.js.map +1 -0
  293. package/dist/routes/normalization-config.routes.d.ts +4 -0
  294. package/dist/routes/normalization-config.routes.d.ts.map +1 -0
  295. package/dist/routes/normalization-config.routes.js +199 -0
  296. package/dist/routes/normalization-config.routes.js.map +1 -0
  297. package/dist/routes/notification-provider.routes.d.ts +4 -0
  298. package/dist/routes/notification-provider.routes.d.ts.map +1 -0
  299. package/dist/routes/notification-provider.routes.js +13 -0
  300. package/dist/routes/notification-provider.routes.js.map +1 -0
  301. package/dist/routes/pipeline.routes.d.ts +8 -0
  302. package/dist/routes/pipeline.routes.d.ts.map +1 -0
  303. package/dist/routes/pipeline.routes.js +243 -0
  304. package/dist/routes/pipeline.routes.js.map +1 -0
  305. package/dist/routes/settings.routes.d.ts +4 -0
  306. package/dist/routes/settings.routes.d.ts.map +1 -0
  307. package/dist/routes/settings.routes.js +10 -0
  308. package/dist/routes/settings.routes.js.map +1 -0
  309. package/dist/routes/sop.routes.d.ts +4 -0
  310. package/dist/routes/sop.routes.d.ts.map +1 -0
  311. package/dist/routes/sop.routes.js +14 -0
  312. package/dist/routes/sop.routes.js.map +1 -0
  313. package/dist/routes/source.routes.d.ts +9 -0
  314. package/dist/routes/source.routes.d.ts.map +1 -0
  315. package/dist/routes/source.routes.js +31 -0
  316. package/dist/routes/source.routes.js.map +1 -0
  317. package/dist/routes/tenant.routes.d.ts +4 -0
  318. package/dist/routes/tenant.routes.d.ts.map +1 -0
  319. package/dist/routes/tenant.routes.js +10 -0
  320. package/dist/routes/tenant.routes.js.map +1 -0
  321. package/dist/routes/workflow.routes.d.ts +4 -0
  322. package/dist/routes/workflow.routes.d.ts.map +1 -0
  323. package/dist/routes/workflow.routes.js +18 -0
  324. package/dist/routes/workflow.routes.js.map +1 -0
  325. package/dist/server.d.ts +22 -0
  326. package/dist/server.d.ts.map +1 -0
  327. package/dist/server.js +76 -0
  328. package/dist/server.js.map +1 -0
  329. package/dist/service.d.ts +159 -0
  330. package/dist/service.d.ts.map +1 -0
  331. package/dist/service.js +156 -0
  332. package/dist/service.js.map +1 -0
  333. package/dist/services/alert.service.d.ts +76 -0
  334. package/dist/services/alert.service.d.ts.map +1 -0
  335. package/dist/services/alert.service.js +688 -0
  336. package/dist/services/alert.service.js.map +1 -0
  337. package/dist/services/connector.service.d.ts +65 -0
  338. package/dist/services/connector.service.d.ts.map +1 -0
  339. package/dist/services/connector.service.js +28 -0
  340. package/dist/services/connector.service.js.map +1 -0
  341. package/dist/services/incident.service.d.ts +108 -0
  342. package/dist/services/incident.service.d.ts.map +1 -0
  343. package/dist/services/incident.service.js +325 -0
  344. package/dist/services/incident.service.js.map +1 -0
  345. package/dist/services/notification-provider.service.d.ts +12 -0
  346. package/dist/services/notification-provider.service.d.ts.map +1 -0
  347. package/dist/services/notification-provider.service.js +25 -0
  348. package/dist/services/notification-provider.service.js.map +1 -0
  349. package/dist/services/settings.service.d.ts +8 -0
  350. package/dist/services/settings.service.d.ts.map +1 -0
  351. package/dist/services/settings.service.js +14 -0
  352. package/dist/services/settings.service.js.map +1 -0
  353. package/dist/services/sop.service.d.ts +60 -0
  354. package/dist/services/sop.service.d.ts.map +1 -0
  355. package/dist/services/sop.service.js +66 -0
  356. package/dist/services/sop.service.js.map +1 -0
  357. package/dist/services/source.service.d.ts +162 -0
  358. package/dist/services/source.service.d.ts.map +1 -0
  359. package/dist/services/source.service.js +124 -0
  360. package/dist/services/source.service.js.map +1 -0
  361. package/dist/services/tenant.service.d.ts +11 -0
  362. package/dist/services/tenant.service.d.ts.map +1 -0
  363. package/dist/services/tenant.service.js +22 -0
  364. package/dist/services/tenant.service.js.map +1 -0
  365. package/dist/services/workflow.service.d.ts +32 -0
  366. package/dist/services/workflow.service.d.ts.map +1 -0
  367. package/dist/services/workflow.service.js +291 -0
  368. package/dist/services/workflow.service.js.map +1 -0
  369. package/dist/standalone.d.ts +2 -0
  370. package/dist/standalone.d.ts.map +1 -0
  371. package/dist/standalone.js +55 -0
  372. package/dist/standalone.js.map +1 -0
  373. package/dist/tenancy.d.ts +5 -0
  374. package/dist/tenancy.d.ts.map +1 -0
  375. package/dist/tenancy.js +35 -0
  376. package/dist/tenancy.js.map +1 -0
  377. package/dist/utils/notificationTemplates.d.ts +98 -0
  378. package/dist/utils/notificationTemplates.d.ts.map +1 -0
  379. package/dist/utils/notificationTemplates.js +227 -0
  380. package/dist/utils/notificationTemplates.js.map +1 -0
  381. package/dist/utils/secretCrypto.d.ts +3 -0
  382. package/dist/utils/secretCrypto.d.ts.map +1 -0
  383. package/dist/utils/secretCrypto.js +40 -0
  384. package/dist/utils/secretCrypto.js.map +1 -0
  385. package/dist/utils/workflowYaml.d.ts +53 -0
  386. package/dist/utils/workflowYaml.d.ts.map +1 -0
  387. package/dist/utils/workflowYaml.js +269 -0
  388. package/dist/utils/workflowYaml.js.map +1 -0
  389. package/package.json +73 -0
@@ -0,0 +1,275 @@
1
+ import yaml from "js-yaml";
2
+ import Handlebars from "handlebars";
3
+ import { normalizePayload } from "../services/alert.service.js";
4
+ import { CanonicalAlarmSchema, buildFingerprint } from "./CanonicalAlarm.js";
5
+ import { parseNormalizationYaml } from "./yaml/pipelineYaml.js";
6
+ import { applyCategoryRules, applySeverityRules } from "./NormalizationRuleEngine.js";
7
+ const HBS_TEMPLATE_TIMEOUT_MS = 1000;
8
+ /**
9
+ * Sandboxed Handlebars environment.
10
+ * preventProtoAccess: true blocks prototype-chain traversal (CVE class of attacks).
11
+ * noProtoAccess is set at compile time via options below.
12
+ */
13
+ const hbsEnv = Handlebars.create();
14
+ hbsEnv.registerHelper("default", (value, fallback) => value ?? fallback);
15
+ export class NormalizationService {
16
+ normalizationConfigModel;
17
+ pipelineEventModel;
18
+ constructor(normalizationConfigModel, pipelineEventModel) {
19
+ this.normalizationConfigModel = normalizationConfigModel;
20
+ this.pipelineEventModel = pipelineEventModel;
21
+ }
22
+ /**
23
+ * Stage 1 + 2: Resolve the normalization config and apply it to produce a CanonicalAlarm.
24
+ *
25
+ * Resolution order: source_id → source_type → global → built-in fallback
26
+ *
27
+ * On failure: writes a dlq pipeline_event and returns null.
28
+ * The caller (AlarmPipelineWorker) handles null by marking the alarm as dlq.
29
+ */
30
+ async normalize(params) {
31
+ const { alarmId, sourceId, sourceType, sourceName, receivedAt, tenantId } = params;
32
+ let { rawPayload } = params;
33
+ // Unwrap SNS Notification envelop if present (common for CloudTrail, CloudWatch, etc.)
34
+ if (rawPayload && typeof rawPayload === "object") {
35
+ const rp = rawPayload;
36
+ if (rp.Type === "Notification" && typeof rp.Message === "string") {
37
+ try {
38
+ const parsed = JSON.parse(rp.Message);
39
+ if (parsed && typeof parsed === "object") {
40
+ rawPayload = parsed;
41
+ }
42
+ }
43
+ catch (e) {
44
+ // keep original if not JSON
45
+ }
46
+ }
47
+ }
48
+ // ── Stage 1: Resolve config ───────────────────────────────────────────────
49
+ let config = null;
50
+ let matchReason = "built-in fallback";
51
+ let matchedConfigId;
52
+ try {
53
+ config = await this.normalizationConfigModel.findByPriority(sourceId, sourceType, tenantId);
54
+ if (config) {
55
+ matchReason = config.sourceId
56
+ ? `source_id match: "${config.name}"`
57
+ : config.sourceType
58
+ ? `source_type match: "${config.name}"`
59
+ : `global match: "${config.name}"`;
60
+ matchedConfigId = config.id;
61
+ }
62
+ }
63
+ catch (err) {
64
+ console.warn("[NormalizationService] Config lookup failed, using built-in:", err.message);
65
+ }
66
+ // ── Stage 2: Normalize ────────────────────────────────────────────────────
67
+ try {
68
+ let canonical;
69
+ if (config && config.fieldMapping) {
70
+ canonical = await this.applyFieldMapping(config.fieldMapping, rawPayload, sourceType, sourceId, sourceName, tenantId);
71
+ }
72
+ else {
73
+ canonical = this.applyBuiltIn(rawPayload, sourceType, sourceId, sourceName, tenantId);
74
+ }
75
+ if (config && config.yamlDefinition) {
76
+ const parsed = parseNormalizationYaml(config.yamlDefinition);
77
+ if (parsed.ok) {
78
+ if (parsed.data.category_rules) {
79
+ const category = applyCategoryRules(canonical, parsed.data.category_rules);
80
+ canonical.additionalConfiguration = {
81
+ ...(canonical.additionalConfiguration || {}),
82
+ category
83
+ };
84
+ }
85
+ if (parsed.data.severity_rules) {
86
+ canonical.severity = applySeverityRules(canonical, parsed.data.severity_rules);
87
+ }
88
+ }
89
+ }
90
+ await this.pipelineEventModel.append({
91
+ alarmId,
92
+ stage: "normalization",
93
+ status: "ok",
94
+ matchedConfigId,
95
+ meta: { matchReason },
96
+ });
97
+ const configAccount = canonical.additionalConfiguration?.accountId;
98
+ if (!canonical.accountId && configAccount) {
99
+ canonical.accountId = configAccount;
100
+ }
101
+ if (canonical.accountId && canonical.additionalConfiguration && typeof canonical.additionalConfiguration === 'object') {
102
+ canonical.additionalConfiguration.accountId = canonical.accountId;
103
+ }
104
+ return canonical;
105
+ }
106
+ catch (err) {
107
+ console.error("[NormalizationService] Normalization failed:", err.message);
108
+ await this.pipelineEventModel.append({
109
+ alarmId,
110
+ stage: "normalization",
111
+ status: "error",
112
+ matchedConfigId,
113
+ meta: { matchReason, error: err.message },
114
+ });
115
+ return null; // Caller marks alarm as dlq
116
+ }
117
+ }
118
+ // ── Built-in fallback ───────────────────────────────────────────────────────
119
+ applyBuiltIn(rawPayload, sourceType, sourceId, sourceName, tenantId) {
120
+ // Delegate to existing normalizePayload() which has all source branches
121
+ const normalized = normalizePayload(sourceType, rawPayload);
122
+ // Derive state from severity / source type
123
+ const state = this.inferState(sourceType, rawPayload, normalized.severity);
124
+ const fp = buildFingerprint({
125
+ source: sourceType,
126
+ resourceId: normalized.resourceId,
127
+ metricName: normalized.metricName,
128
+ alertName: normalized.alertName,
129
+ state,
130
+ });
131
+ return CanonicalAlarmSchema.parse({
132
+ source: sourceType,
133
+ tenantId: tenantId ?? "default",
134
+ resourceId: normalized.resourceId,
135
+ resourceName: normalized.resourceName,
136
+ resourceType: normalized.resourceType,
137
+ alertName: normalized.alertName,
138
+ severity: normalized.severity,
139
+ description: normalized.description,
140
+ state,
141
+ metricName: normalized.metricName,
142
+ metricValue: normalized.metricValue,
143
+ metricUnit: normalized.metricUnit,
144
+ labels: normalized.labels,
145
+ tags: normalized.tags,
146
+ fingerprint: fp,
147
+ downTime: normalized.downTime ?? new Date().toISOString(),
148
+ rawPayload,
149
+ sourceId,
150
+ sourceName,
151
+ accountId: normalized.accountId,
152
+ additionalConfiguration: normalized.additionalConfiguration,
153
+ });
154
+ }
155
+ // ── User config: YAML + Handlebars field mapping ──────────────────────────
156
+ async applyFieldMapping(fieldMappingYaml, rawPayload, sourceType, sourceId, sourceName, tenantId) {
157
+ // Parse YAML field mapping
158
+ const mapping = yaml.load(fieldMappingYaml);
159
+ if (!mapping || typeof mapping !== "object") {
160
+ throw new Error("field_mapping YAML is invalid or empty");
161
+ }
162
+ const payload = rawPayload;
163
+ const result = {};
164
+ for (const [canonicalField, template] of Object.entries(mapping)) {
165
+ try {
166
+ // preventProtoAccess blocks __proto__ traversal in templates (P5 hardening)
167
+ const compiled = hbsEnv.compile(String(template), {
168
+ noEscape: true,
169
+ preventIndent: true,
170
+ strict: false,
171
+ });
172
+ // Execute with a timeout to prevent runaway templates
173
+ const value = await Promise.race([
174
+ Promise.resolve().then(() => compiled(payload, { allowProtoPropertiesByDefault: false, allowProtoMethodsByDefault: false })),
175
+ new Promise((_, reject) => setTimeout(() => reject(new Error(`Template '${canonicalField}' exceeded ${HBS_TEMPLATE_TIMEOUT_MS}ms`)), HBS_TEMPLATE_TIMEOUT_MS)),
176
+ ]);
177
+ result[canonicalField] = String(value ?? "").trim() || undefined;
178
+ }
179
+ catch (err) {
180
+ // Individual field failure is non-fatal — log and skip the field
181
+ console.warn(`[NormalizationService] Template error for field '${canonicalField}':`, err.message);
182
+ }
183
+ }
184
+ const state = result.state ?? "unknown";
185
+ const fp = buildFingerprint({
186
+ source: sourceType,
187
+ resourceId: result.resourceId ?? "unknown",
188
+ metricName: result.metricName,
189
+ alertName: result.alertName,
190
+ state,
191
+ });
192
+ const coreFields = new Set([
193
+ "source", "tenantId", "resourceId", "resourceName", "resourceType",
194
+ "alertName", "severity", "description", "state", "metricName",
195
+ "metricValue", "metricUnit", "labels", "tags", "fingerprint",
196
+ "downTime", "rawPayload", "sourceId", "sourceName", "additionalConfiguration"
197
+ ]);
198
+ const extras = {};
199
+ for (const [k, v] of Object.entries(result)) {
200
+ if (!coreFields.has(k) && v !== undefined) {
201
+ extras[k] = v;
202
+ }
203
+ }
204
+ const mergedConfig = {
205
+ ...extras,
206
+ ...(result.additionalConfiguration || {}),
207
+ };
208
+ let tags = {};
209
+ if (typeof result.tags === "object" && result.tags !== null) {
210
+ tags = result.tags;
211
+ }
212
+ else if (typeof result.tags === "string") {
213
+ try {
214
+ const parsed = JSON.parse(result.tags);
215
+ if (typeof parsed === "object" && parsed !== null)
216
+ tags = parsed;
217
+ }
218
+ catch { /* ignore */ }
219
+ }
220
+ return CanonicalAlarmSchema.parse({
221
+ source: sourceType,
222
+ tenantId: tenantId ?? "default",
223
+ resourceId: result.resourceId ?? "unknown",
224
+ resourceName: result.resourceName ?? "Unknown",
225
+ resourceType: result.resourceType ?? sourceType,
226
+ alertName: result.alertName ?? "Alert",
227
+ severity: result.severity ?? "high",
228
+ description: result.description,
229
+ state,
230
+ metricName: result.metricName,
231
+ metricValue: result.metricValue,
232
+ metricUnit: result.metricUnit,
233
+ labels: result.labels,
234
+ tags,
235
+ fingerprint: fp,
236
+ downTime: result.downTime ?? new Date().toISOString(),
237
+ rawPayload,
238
+ sourceId,
239
+ sourceName,
240
+ additionalConfiguration: Object.keys(mergedConfig).length > 0 ? mergedConfig : undefined,
241
+ });
242
+ }
243
+ // ── State inference ───────────────────────────────────────────────────────
244
+ inferState(sourceType, rawPayload, severity) {
245
+ const body = rawPayload;
246
+ if (sourceType === "cloudwatch") {
247
+ const state = body?.NewStateValue;
248
+ if (state === "OK")
249
+ return "resolved";
250
+ if (state === "ALARM")
251
+ return "firing";
252
+ return "unknown";
253
+ }
254
+ if (sourceType === "cloudtrail") {
255
+ // CloudTrail events are point-in-time security occurrences — there is no OK/resolved state.
256
+ return "firing";
257
+ }
258
+ if (sourceType === "grafana") {
259
+ const alerts = Array.isArray(body?.alerts) ? body.alerts : [body];
260
+ const status = alerts[0]?.status;
261
+ return status === "resolved" ? "resolved" : status === "firing" ? "firing" : "unknown";
262
+ }
263
+ if (sourceType === "prometheus") {
264
+ const status = body?.status;
265
+ return status === "resolved" ? "resolved" : status === "firing" ? "firing" : "unknown";
266
+ }
267
+ if (sourceType === "datadog") {
268
+ const alertType = body?.alert_type;
269
+ return alertType === "recovery" ? "resolved" : "firing";
270
+ }
271
+ // For meyi_pulse and custom: low severity = resolved, else firing
272
+ return severity === "low" ? "resolved" : "firing";
273
+ }
274
+ }
275
+ //# sourceMappingURL=NormalizationService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NormalizationService.js","sourceRoot":"","sources":["../../src/pipeline/NormalizationService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ import { Queue } from "bullmq";
2
+ import { Redis } from "ioredis";
3
+ import type { PipelineJobData } from "./CanonicalAlarm.js";
4
+ export declare function parseRedisUrl(redisUrl: string): {
5
+ host: string;
6
+ port: number;
7
+ password?: string;
8
+ db: number;
9
+ };
10
+ /**
11
+ * Create and return a shared IORedis client for direct Redis operations
12
+ * (dedup SETNX, flap detection sorted sets, distributed locks).
13
+ *
14
+ * The host app passes redisUrl so that the lifecycle matches the DB injection
15
+ * pattern (Q1, Q4). Falls back to REDIS_URL env var.
16
+ */
17
+ export declare function createRedisClient(redisUrl?: string): Redis;
18
+ /**
19
+ * Returns the shared ioredis client (for DedupService direct ops).
20
+ * Returns null if Redis has not been initialized yet.
21
+ */
22
+ export declare function getRedisClient(): Redis | null;
23
+ /**
24
+ * Returns true if Redis is currently reachable.
25
+ * Used by DedupService to decide whether to use Redis ops or DB fallback (P3).
26
+ */
27
+ export declare function isRedisAvailable(): boolean;
28
+ /**
29
+ * Attempt to connect to Redis. Safe to call on startup — resolves without
30
+ * throwing even if Redis is unreachable (the P3 fallback path handles it).
31
+ */
32
+ export declare function connectRedis(redisUrl?: string): Promise<boolean>;
33
+ /**
34
+ * Gracefully close the shared ioredis connection (call during server shutdown).
35
+ */
36
+ export declare function closeRedis(): Promise<void>;
37
+ /**
38
+ * Get (or lazily create) the BullMQ alarm-pipeline queue.
39
+ * Uses plain connection options to avoid the BullMQ/ioredis dual-package conflict.
40
+ */
41
+ export declare function getAlarmQueue(): Queue | null;
42
+ export declare function getGroupFlushQueue(): Queue | null;
43
+ /**
44
+ * Connect Redis and initialize the alarm queue URL.
45
+ * Safe to call on startup — falls back gracefully if Redis is unreachable (P3).
46
+ */
47
+ export declare function connectRedisAndQueue(redisUrl?: string): Promise<boolean>;
48
+ /**
49
+ * Enqueue a raw webhook payload for async pipeline processing.
50
+ *
51
+ * Returns true if enqueued successfully.
52
+ * Returns false if Redis is unavailable — caller must use sync fallback (P3).
53
+ */
54
+ export declare function enqueueAlarm(jobData: PipelineJobData): Promise<boolean>;
55
+ export interface GroupFlushJobData {
56
+ groupId: string;
57
+ type?: 'incident-create' | 'group-close';
58
+ timeoutSeconds?: number;
59
+ }
60
+ export declare function enqueueIncidentCreate(groupId: string, delayMs: number): Promise<boolean>;
61
+ export declare function enqueueGroupClose(groupId: string, delayMs: number, timeoutSeconds: number): Promise<boolean>;
62
+ /**
63
+ * Close the BullMQ queue gracefully (call during server shutdown).
64
+ */
65
+ export declare function closeAlarmQueue(): Promise<void>;
66
+ //# sourceMappingURL=alarmQueue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"alarmQueue.d.ts","sourceRoot":"","sources":["../../src/pipeline/alarmQueue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAC/B,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAI3D,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAY7G;AAkBD;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,KAAK,CA2C1D;AAED;;;GAGG;AACH,wBAAgB,cAAc,IAAI,KAAK,GAAG,IAAI,CAE7C;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,OAAO,CAE1C;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAuBtE;AAED;;GAEG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAMhD;AAWD;;;GAGG;AACH,wBAAgB,aAAa,IAAI,KAAK,GAAG,IAAI,CAsB5C;AAED,wBAAgB,kBAAkB,IAAI,KAAK,GAAG,IAAI,CAsBjD;AAUD;;;GAGG;AACH,wBAAsB,oBAAoB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAG9E;AAED;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,CAY7E;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,iBAAiB,GAAG,aAAa,CAAC;IACzC,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAW9F;AAED,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAYlH;AAED;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CASrD"}
@@ -0,0 +1,254 @@
1
+ import { Queue } from "bullmq";
2
+ import { Redis } from "ioredis";
3
+ // ─── Redis URL Parsing ────────────────────────────────────────────────────────
4
+ export function parseRedisUrl(redisUrl) {
5
+ try {
6
+ const url = new URL(redisUrl);
7
+ return {
8
+ host: url.hostname || "localhost",
9
+ port: parseInt(url.port || "6379", 10),
10
+ password: url.password || undefined,
11
+ db: url.pathname ? parseInt(url.pathname.slice(1) || "0", 10) : 0,
12
+ };
13
+ }
14
+ catch {
15
+ return { host: "localhost", port: 6379, db: 0 };
16
+ }
17
+ }
18
+ // ─── Shared IORedis Client ────────────────────────────────────────────────────
19
+ //
20
+ // Used by DedupService for direct SETNX / ZADD / GET operations.
21
+ // NOTE: BullMQ v5 bundles its own ioredis internally and does NOT accept an
22
+ // external ioredis instance as a connection — it must use plain connection
23
+ // options ({ host, port, ... }). The two ioredis instances are intentionally
24
+ // separate to avoid the dual-package type conflict.
25
+ let _redisClient = null;
26
+ let _redisAvailable = false;
27
+ function isRedisVersionSupported(version) {
28
+ const major = Number(String(version || "0").split(".")[0]);
29
+ return Number.isFinite(major) && major >= 5;
30
+ }
31
+ /**
32
+ * Create and return a shared IORedis client for direct Redis operations
33
+ * (dedup SETNX, flap detection sorted sets, distributed locks).
34
+ *
35
+ * The host app passes redisUrl so that the lifecycle matches the DB injection
36
+ * pattern (Q1, Q4). Falls back to REDIS_URL env var.
37
+ */
38
+ export function createRedisClient(redisUrl) {
39
+ if (_redisClient)
40
+ return _redisClient;
41
+ const url = redisUrl ?? process.env.REDIS_URL ?? "redis://localhost:6379";
42
+ const client = new Redis(url, {
43
+ enableReadyCheck: false,
44
+ lazyConnect: true,
45
+ retryStrategy: (times) => Math.min(times * 200, 5000),
46
+ });
47
+ client.on("connect", () => {
48
+ _redisAvailable = true;
49
+ console.info("[AlarmQueue] Redis connected");
50
+ });
51
+ client.on("ready", () => {
52
+ _redisAvailable = true;
53
+ });
54
+ client.on("error", (err) => {
55
+ // Log the error but do NOT immediately mark Redis as unavailable.
56
+ // Transient errors (ECONNRESET, etc.) are automatically retried by ioredis.
57
+ // Only 'close' / 'end' mean we've truly lost the connection.
58
+ console.warn("[AlarmQueue] Redis error (will retry):", err.message);
59
+ });
60
+ client.on("close", () => {
61
+ _redisAvailable = false;
62
+ console.warn("[AlarmQueue] Redis connection closed");
63
+ });
64
+ client.on("end", () => {
65
+ _redisAvailable = false;
66
+ console.warn("[AlarmQueue] Redis connection ended");
67
+ });
68
+ client.on("reconnecting", () => {
69
+ console.info("[AlarmQueue] Redis reconnecting...");
70
+ });
71
+ _redisClient = client;
72
+ return client;
73
+ }
74
+ /**
75
+ * Returns the shared ioredis client (for DedupService direct ops).
76
+ * Returns null if Redis has not been initialized yet.
77
+ */
78
+ export function getRedisClient() {
79
+ return _redisClient;
80
+ }
81
+ /**
82
+ * Returns true if Redis is currently reachable.
83
+ * Used by DedupService to decide whether to use Redis ops or DB fallback (P3).
84
+ */
85
+ export function isRedisAvailable() {
86
+ return _redisAvailable;
87
+ }
88
+ /**
89
+ * Attempt to connect to Redis. Safe to call on startup — resolves without
90
+ * throwing even if Redis is unreachable (the P3 fallback path handles it).
91
+ */
92
+ export async function connectRedis(redisUrl) {
93
+ const client = createRedisClient(redisUrl);
94
+ try {
95
+ await client.connect();
96
+ const info = await client.info("server");
97
+ const version = info.match(/^redis_version:(.+)$/m)?.[1]?.trim();
98
+ if (!isRedisVersionSupported(version)) {
99
+ _redisAvailable = false;
100
+ await client.quit().catch(() => { });
101
+ _redisClient = null;
102
+ console.warn(`[AlarmQueue] Redis ${version || "unknown"} is unsupported; BullMQ requires Redis >= 5. Pipeline will use DB fallback (P3).`);
103
+ return false;
104
+ }
105
+ _redisAvailable = true;
106
+ return true;
107
+ }
108
+ catch (err) {
109
+ _redisAvailable = false;
110
+ console.warn("[AlarmQueue] Redis unavailable on startup — pipeline will use DB fallback (P3):", err.message);
111
+ return false;
112
+ }
113
+ }
114
+ /**
115
+ * Gracefully close the shared ioredis connection (call during server shutdown).
116
+ */
117
+ export async function closeRedis() {
118
+ if (_redisClient) {
119
+ await _redisClient.quit().catch(() => { });
120
+ _redisClient = null;
121
+ _redisAvailable = false;
122
+ }
123
+ }
124
+ // ─── BullMQ Alarm Queue ───────────────────────────────────────────────────────
125
+ //
126
+ // BullMQ v5 bundles its own ioredis and requires plain connection options
127
+ // (not an external Redis instance). We parse the URL into { host, port, ... }.
128
+ let _alarmQueue = null;
129
+ let _groupFlushQueue = null;
130
+ let _configuredRedisUrl;
131
+ /**
132
+ * Get (or lazily create) the BullMQ alarm-pipeline queue.
133
+ * Uses plain connection options to avoid the BullMQ/ioredis dual-package conflict.
134
+ */
135
+ export function getAlarmQueue() {
136
+ if (!_redisAvailable)
137
+ return null;
138
+ if (_alarmQueue)
139
+ return _alarmQueue;
140
+ const url = _configuredRedisUrl ?? process.env.REDIS_URL ?? "redis://localhost:6379";
141
+ const conn = parseRedisUrl(url);
142
+ _alarmQueue = new Queue("alarm-pipeline", {
143
+ connection: {
144
+ ...conn,
145
+ maxRetriesPerRequest: null, // Required by BullMQ
146
+ enableReadyCheck: false,
147
+ },
148
+ defaultJobOptions: {
149
+ attempts: 3,
150
+ backoff: { type: "exponential", delay: 2000 },
151
+ removeOnComplete: { count: 500 },
152
+ removeOnFail: { count: 200 },
153
+ },
154
+ });
155
+ return _alarmQueue;
156
+ }
157
+ export function getGroupFlushQueue() {
158
+ if (!_redisAvailable)
159
+ return null;
160
+ if (_groupFlushQueue)
161
+ return _groupFlushQueue;
162
+ const url = _configuredRedisUrl ?? process.env.REDIS_URL ?? "redis://localhost:6379";
163
+ const conn = parseRedisUrl(url);
164
+ _groupFlushQueue = new Queue("group-flush", {
165
+ connection: {
166
+ ...conn,
167
+ maxRetriesPerRequest: null,
168
+ enableReadyCheck: false,
169
+ },
170
+ defaultJobOptions: {
171
+ attempts: 3,
172
+ backoff: { type: "exponential", delay: 2000 },
173
+ removeOnComplete: { count: 100 },
174
+ removeOnFail: { count: 100 },
175
+ },
176
+ });
177
+ return _groupFlushQueue;
178
+ }
179
+ /**
180
+ * Store the Redis URL so getAlarmQueue() can use it after connectRedis().
181
+ * Called internally by connectRedis().
182
+ */
183
+ function setConfiguredRedisUrl(url) {
184
+ _configuredRedisUrl = url;
185
+ }
186
+ /**
187
+ * Connect Redis and initialize the alarm queue URL.
188
+ * Safe to call on startup — falls back gracefully if Redis is unreachable (P3).
189
+ */
190
+ export async function connectRedisAndQueue(redisUrl) {
191
+ setConfiguredRedisUrl(redisUrl ?? process.env.REDIS_URL);
192
+ return connectRedis(redisUrl);
193
+ }
194
+ /**
195
+ * Enqueue a raw webhook payload for async pipeline processing.
196
+ *
197
+ * Returns true if enqueued successfully.
198
+ * Returns false if Redis is unavailable — caller must use sync fallback (P3).
199
+ */
200
+ export async function enqueueAlarm(jobData) {
201
+ const queue = getAlarmQueue();
202
+ if (!queue || !_redisAvailable)
203
+ return false;
204
+ try {
205
+ await queue.add("process", jobData);
206
+ return true;
207
+ }
208
+ catch (err) {
209
+ _redisAvailable = false;
210
+ console.warn("[AlarmQueue] Failed to enqueue alarm job:", err.message);
211
+ return false;
212
+ }
213
+ }
214
+ export async function enqueueIncidentCreate(groupId, delayMs) {
215
+ const queue = getGroupFlushQueue();
216
+ if (!queue || !_redisAvailable)
217
+ return false;
218
+ try {
219
+ await queue.add("incident-create", { groupId, type: 'incident-create' }, { delay: delayMs, jobId: `incident_create_${groupId}` });
220
+ return true;
221
+ }
222
+ catch (err) {
223
+ console.warn("[AlarmQueue] Failed to enqueue incident create job:", err.message);
224
+ return false;
225
+ }
226
+ }
227
+ export async function enqueueGroupClose(groupId, delayMs, timeoutSeconds) {
228
+ const queue = getGroupFlushQueue();
229
+ if (!queue || !_redisAvailable)
230
+ return false;
231
+ try {
232
+ // Append timestamp to jobId so re-enqueues from within the worker aren't ignored by BullMQ
233
+ await queue.add("group-close", { groupId, type: 'group-close', timeoutSeconds }, { delay: delayMs, jobId: `group_close_${groupId}_${Date.now()}` });
234
+ return true;
235
+ }
236
+ catch (err) {
237
+ console.warn("[AlarmQueue] Failed to enqueue group close job:", err.message);
238
+ return false;
239
+ }
240
+ }
241
+ /**
242
+ * Close the BullMQ queue gracefully (call during server shutdown).
243
+ */
244
+ export async function closeAlarmQueue() {
245
+ if (_alarmQueue) {
246
+ await _alarmQueue.close().catch(() => { });
247
+ _alarmQueue = null;
248
+ }
249
+ if (_groupFlushQueue) {
250
+ await _groupFlushQueue.close().catch(() => { });
251
+ _groupFlushQueue = null;
252
+ }
253
+ }
254
+ //# sourceMappingURL=alarmQueue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"alarmQueue.js","sourceRoot":"","sources":["../../src/pipeline/alarmQueue.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function ensureSourcePipelineDefaults(db: any, sourceId: string, sourceType: string, tenantId: string | null): Promise<void>;
2
+ export declare function ensureTenantPipelineDefaults(db: any, tenantId: string): Promise<void>;
3
+ //# sourceMappingURL=ensureDefaults.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ensureDefaults.d.ts","sourceRoot":"","sources":["../../../src/pipeline/defaults/ensureDefaults.ts"],"names":[],"mappings":"AAKA,wBAAsB,4BAA4B,CAAC,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,iBAyHxH;AAED,wBAAsB,4BAA4B,CAAC,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,iBAE3E"}