@oneuptime/common 12.0.24 → 12.0.26

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 (870) hide show
  1. package/Models/AnalyticsModels/Index.ts +2 -0
  2. package/Models/AnalyticsModels/Span.ts +101 -0
  3. package/Models/AnalyticsModels/ThreatIntelIndicator.ts +413 -0
  4. package/Models/DatabaseModels/AlertSeverity.ts +4 -1
  5. package/Models/DatabaseModels/CephClusterFeed.ts +625 -0
  6. package/Models/DatabaseModels/CloudResourceFeed.ts +625 -0
  7. package/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.ts +13 -0
  8. package/Models/DatabaseModels/DetectionRule.ts +9 -3
  9. package/Models/DatabaseModels/DockerHostFeed.ts +625 -0
  10. package/Models/DatabaseModels/DockerSwarmClusterFeed.ts +628 -0
  11. package/Models/DatabaseModels/GoogleSecOpsConnection.ts +9 -3
  12. package/Models/DatabaseModels/HostFeed.ts +625 -0
  13. package/Models/DatabaseModels/IncidentSeverity.ts +4 -1
  14. package/Models/DatabaseModels/Index.ts +22 -0
  15. package/Models/DatabaseModels/KubernetesClusterFeed.ts +628 -0
  16. package/Models/DatabaseModels/Monitor.ts +87 -0
  17. package/Models/DatabaseModels/NetworkDevice.ts +96 -5
  18. package/Models/DatabaseModels/NetworkDeviceAutoImportRule.ts +92 -6
  19. package/Models/DatabaseModels/NetworkDeviceDiscoveryScan.ts +301 -31
  20. package/Models/DatabaseModels/NetworkSite.ts +120 -0
  21. package/Models/DatabaseModels/OnCallDutyPolicyExecutionLog.ts +1 -0
  22. package/Models/DatabaseModels/PodmanHostFeed.ts +625 -0
  23. package/Models/DatabaseModels/ProxmoxClusterFeed.ts +626 -0
  24. package/Models/DatabaseModels/ScheduledMaintenance.ts +67 -0
  25. package/Models/DatabaseModels/ServiceFeed.ts +625 -0
  26. package/Models/DatabaseModels/TelemetrySourceMap.ts +474 -0
  27. package/Models/DatabaseModels/ThreatIntelFeed.ts +758 -0
  28. package/Models/DatabaseModels/UserOnCallLog.ts +1 -0
  29. package/Models/DatabaseModels/UserTotpAuth.ts +1 -0
  30. package/Models/DatabaseModels/UserWebAuthn.ts +1 -0
  31. package/Server/API/AlertAPI.ts +23 -1
  32. package/Server/API/BaseAPI.ts +14 -27
  33. package/Server/API/IncidentAPI.ts +41 -1
  34. package/Server/API/IncidentEpisodeAPI.ts +23 -1
  35. package/Server/API/MicrosoftTeamsAPI.ts +31 -2
  36. package/Server/API/ScheduledMaintenanceAPI.ts +23 -1
  37. package/Server/API/SlackAPI.ts +48 -2
  38. package/Server/API/TelemetryAPI.ts +167 -42
  39. package/Server/API/UserOnCallLogTimelineAPI.ts +75 -61
  40. package/Server/API/UserTotpAuthAPI.ts +67 -1
  41. package/Server/API/UserWebAuthnAPI.ts +44 -1
  42. package/Server/Infrastructure/Postgres/SchemaMigrations/1787923136162-MigrationName.ts +57 -0
  43. package/Server/Infrastructure/Postgres/SchemaMigrations/1789600000000-AddAutoProvisionedNetworkDeviceMonitors.ts +49 -0
  44. package/Server/Infrastructure/Postgres/SchemaMigrations/1789700000000-AddNetworkScaleIndexes.ts +129 -0
  45. package/Server/Infrastructure/Postgres/SchemaMigrations/1789800000000-WidenSecurityEventLastErrorColumns.ts +54 -0
  46. package/Server/Infrastructure/Postgres/SchemaMigrations/1789900000000-AddNetworkSiteRollupPolicyAndMaintenance.ts +64 -0
  47. package/Server/Infrastructure/Postgres/SchemaMigrations/1790000000000-AddTelemetrySourceMap.ts +64 -0
  48. package/Server/Infrastructure/Postgres/SchemaMigrations/1790000000001-AddSnmpConfigsToNetworkDeviceDiscoveryScan.ts +72 -0
  49. package/Server/Infrastructure/Postgres/SchemaMigrations/1790003445000-AddSnmpEnabledToNetworkDeviceDiscoveryScan.ts +31 -0
  50. package/Server/Infrastructure/Postgres/SchemaMigrations/1790100000000-AddResourceActivityFeeds.ts +489 -0
  51. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +18 -0
  52. package/Server/Middleware/IdentityRateLimit.ts +53 -3
  53. package/Server/Middleware/SlackAuthorization.ts +96 -18
  54. package/Server/Services/AIService.ts +181 -41
  55. package/Server/Services/CephClusterFeedService.ts +99 -0
  56. package/Server/Services/CephClusterLabelRuleEngineService.ts +29 -0
  57. package/Server/Services/CephClusterOwnerRuleEngineService.ts +23 -0
  58. package/Server/Services/CephClusterOwnerTeamService.ts +129 -0
  59. package/Server/Services/CephClusterOwnerUserService.ts +123 -0
  60. package/Server/Services/CephClusterService.ts +223 -2
  61. package/Server/Services/CloudResourceFeedService.ts +99 -0
  62. package/Server/Services/CloudResourceLabelRuleEngineService.ts +30 -0
  63. package/Server/Services/CloudResourceOwnerRuleEngineService.ts +33 -0
  64. package/Server/Services/CloudResourceOwnerTeamService.ts +129 -0
  65. package/Server/Services/CloudResourceOwnerUserService.ts +123 -0
  66. package/Server/Services/CloudResourceService.ts +227 -2
  67. package/Server/Services/DatabaseService.ts +265 -0
  68. package/Server/Services/DockerHostFeedService.ts +99 -0
  69. package/Server/Services/DockerHostLabelRuleEngineService.ts +29 -0
  70. package/Server/Services/DockerHostOwnerRuleEngineService.ts +23 -0
  71. package/Server/Services/DockerHostOwnerTeamService.ts +129 -0
  72. package/Server/Services/DockerHostOwnerUserService.ts +123 -0
  73. package/Server/Services/DockerHostService.ts +227 -2
  74. package/Server/Services/DockerSwarmClusterFeedService.ts +102 -0
  75. package/Server/Services/DockerSwarmClusterLabelRuleEngineService.ts +30 -0
  76. package/Server/Services/DockerSwarmClusterOwnerRuleEngineService.ts +24 -0
  77. package/Server/Services/DockerSwarmClusterOwnerTeamService.ts +133 -0
  78. package/Server/Services/DockerSwarmClusterOwnerUserService.ts +127 -0
  79. package/Server/Services/DockerSwarmClusterService.ts +229 -2
  80. package/Server/Services/EnterpriseLicenseService.ts +15 -7
  81. package/Server/Services/ExceptionAggregationService.ts +12 -2
  82. package/Server/Services/HostFeedService.ts +99 -0
  83. package/Server/Services/HostLabelRuleEngineService.ts +29 -0
  84. package/Server/Services/HostOwnerRuleEngineService.ts +23 -0
  85. package/Server/Services/HostOwnerTeamService.ts +129 -0
  86. package/Server/Services/HostOwnerUserService.ts +123 -0
  87. package/Server/Services/HostService.ts +215 -2
  88. package/Server/Services/IncidentService.ts +11 -0
  89. package/Server/Services/Index.ts +24 -0
  90. package/Server/Services/KubernetesClusterFeedService.ts +99 -0
  91. package/Server/Services/KubernetesClusterLabelRuleEngineService.ts +30 -0
  92. package/Server/Services/KubernetesClusterOwnerRuleEngineService.ts +24 -0
  93. package/Server/Services/KubernetesClusterOwnerTeamService.ts +133 -0
  94. package/Server/Services/KubernetesClusterOwnerUserService.ts +127 -0
  95. package/Server/Services/KubernetesClusterService.ts +231 -2
  96. package/Server/Services/LogAggregationService.ts +23 -280
  97. package/Server/Services/MetricAggregationService.ts +98 -1
  98. package/Server/Services/MonitorService.ts +177 -13
  99. package/Server/Services/MonitorTemplateService.ts +111 -0
  100. package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +777 -86
  101. package/Server/Services/NetworkDeviceAutoImportRuleService.ts +199 -16
  102. package/Server/Services/NetworkDeviceDiscoveryScanService.ts +1055 -14
  103. package/Server/Services/NetworkDeviceService.ts +750 -4
  104. package/Server/Services/NetworkInterfaceService.ts +415 -0
  105. package/Server/Services/NetworkSiteService.ts +485 -52
  106. package/Server/Services/PodmanHostFeedService.ts +99 -0
  107. package/Server/Services/PodmanHostLabelRuleEngineService.ts +29 -0
  108. package/Server/Services/PodmanHostOwnerRuleEngineService.ts +23 -0
  109. package/Server/Services/PodmanHostOwnerTeamService.ts +129 -0
  110. package/Server/Services/PodmanHostOwnerUserService.ts +123 -0
  111. package/Server/Services/PodmanHostService.ts +227 -2
  112. package/Server/Services/ProjectService.ts +16 -10
  113. package/Server/Services/ProxmoxClusterFeedService.ts +99 -0
  114. package/Server/Services/ProxmoxClusterLabelRuleEngineService.ts +30 -0
  115. package/Server/Services/ProxmoxClusterOwnerRuleEngineService.ts +24 -0
  116. package/Server/Services/ProxmoxClusterOwnerTeamService.ts +131 -0
  117. package/Server/Services/ProxmoxClusterOwnerUserService.ts +124 -0
  118. package/Server/Services/ProxmoxClusterService.ts +225 -2
  119. package/Server/Services/ScheduledMaintenanceStateTimelineService.ts +61 -0
  120. package/Server/Services/ServiceFeedService.ts +99 -0
  121. package/Server/Services/ServiceLabelRuleEngineService.ts +29 -0
  122. package/Server/Services/ServiceOwnerRuleEngineService.ts +26 -0
  123. package/Server/Services/ServiceOwnerTeamService.ts +129 -0
  124. package/Server/Services/ServiceOwnerUserService.ts +123 -0
  125. package/Server/Services/ServiceService.ts +227 -3
  126. package/Server/Services/StatusPageSubscriberService.ts +7 -0
  127. package/Server/Services/TelemetryAttributeService.ts +13 -3
  128. package/Server/Services/TelemetrySourceMapService.ts +307 -0
  129. package/Server/Services/ThreatIntelFeedService.ts +222 -0
  130. package/Server/Services/ThreatIntelIndicatorService.ts +428 -0
  131. package/Server/Services/TraceAggregationService.ts +101 -11
  132. package/Server/Services/UserService.ts +13 -6
  133. package/Server/Services/UserTwoFactorBackupCodeService.ts +127 -0
  134. package/Server/Services/UserWebhookService.ts +11 -2
  135. package/Server/Static/Brand/README.md +38 -0
  136. package/Server/Static/Brand/favicons/apple-touch-icon.png +0 -0
  137. package/Server/Static/Brand/favicons/favicon-16x16.png +0 -0
  138. package/Server/Static/Brand/favicons/favicon-32x32.png +0 -0
  139. package/Server/Static/Brand/favicons/favicon.ico +0 -0
  140. package/Server/Static/Brand/favicons/safari-pinned-tab.svg +31 -0
  141. package/Server/Static/Brand/hou-wb.svg +1 -0
  142. package/Server/Static/Brand/oneuptime-logo.svg +1 -0
  143. package/Server/Static/Brand/ou-wb.svg +1 -0
  144. package/Server/Static/Vendor/README.md +4 -0
  145. package/Server/Types/AnalyticsDatabase/ModelPermission.ts +13 -3
  146. package/Server/Types/Database/AggregateBy.ts +83 -0
  147. package/Server/Types/Database/AggregateResultUtil.ts +126 -0
  148. package/Server/Types/Database/JSONColumnQuery.ts +18 -0
  149. package/Server/Types/Database/QueryHelper.ts +40 -0
  150. package/Server/Types/Database/QueryUtil.ts +26 -0
  151. package/Server/Types/Workflow/Components/API/Utils.ts +10 -1
  152. package/Server/Types/Workflow/Components/JavaScript.ts +8 -0
  153. package/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.ts +9 -0
  154. package/Server/Utils/AI/SRE/InvestigationGrader.ts +18 -0
  155. package/Server/Utils/AnalyticsDatabase/AttributeFilterStatement.ts +422 -0
  156. package/Server/Utils/AnalyticsDatabase/StatementGenerator.ts +176 -0
  157. package/Server/Utils/DataSource/HttpFetch.ts +18 -0
  158. package/Server/Utils/Database/RelationIdUtil.ts +42 -0
  159. package/Server/Utils/Marketing/MarketingEventUtil.ts +38 -9
  160. package/Server/Utils/Monitor/Criteria/ServerMonitorCriteria.ts +34 -3
  161. package/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.ts +9 -1
  162. package/Server/Utils/Monitor/Criteria/SyntheticMonitor.ts +28 -10
  163. package/Server/Utils/Monitor/MonitorAlert.ts +541 -332
  164. package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +330 -64
  165. package/Server/Utils/Monitor/MonitorIncident.ts +640 -434
  166. package/Server/Utils/Monitor/MonitorResource.ts +226 -49
  167. package/Server/Utils/Monitor/NetworkDeviceWalkUtil.ts +46 -3
  168. package/Server/Utils/Monitor/NetworkInventoryUtil.ts +23 -102
  169. package/Server/Utils/Monitor/PerEntityCriteriaFanOut.ts +329 -0
  170. package/Server/Utils/NetworkDevice/DeviceHealthAggregation.ts +427 -0
  171. package/Server/Utils/NetworkSite/NetworkSiteMaintenanceSuppression.ts +310 -0
  172. package/Server/Utils/OnCallNotificationContext.ts +686 -0
  173. package/Server/Utils/PrivateNetworkWebhookConfig.ts +549 -0
  174. package/Server/Utils/ResourceFeed/ResourceFeedUtil.ts +139 -0
  175. package/Server/Utils/Response.ts +11 -1
  176. package/Server/Utils/SSRFProtection.ts +230 -60
  177. package/Server/Utils/SecurityEvent/ConnectorErrorMessage.ts +106 -0
  178. package/Server/Utils/SecurityEvent/DetectionRuleEvaluator.ts +84 -284
  179. package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.ts +47 -20
  180. package/Server/Utils/SecurityEvent/SecurityEventAlerting.ts +318 -0
  181. package/Server/Utils/SecurityEvent/ThreatIntel/TaxiiClient.ts +199 -0
  182. package/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelEnricher.ts +252 -0
  183. package/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.ts +739 -0
  184. package/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelMatcher.ts +533 -0
  185. package/Server/Utils/StartServer.ts +83 -56
  186. package/Server/Utils/StatusPageSubscriberWebhook.ts +3 -0
  187. package/Server/Utils/Telemetry/LlmMetricSpend.ts +56 -5
  188. package/Server/Utils/Telemetry/LlmSpan.ts +46 -0
  189. package/Server/Utils/Telemetry/SourceMapResolver.ts +480 -0
  190. package/Server/Utils/TwoFactorBackupCodeNotification.ts +106 -0
  191. package/Server/Utils/VM/VMAPI.ts +3 -0
  192. package/Server/Utils/VM/VMRunner.ts +27 -1
  193. package/Server/Utils/VendorAssets.ts +42 -0
  194. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +136 -6
  195. package/Server/Utils/Workspace/Slack/Actions/Auth.ts +0 -12
  196. package/Server/Views/AcknowledgeUserOnCallNotification.ejs +11 -9
  197. package/Server/Views/Partials/Head.ejs +9 -9
  198. package/Server/Views/Partials/OnCallNotificationDetails.ejs +48 -0
  199. package/Server/Views/ViewMessage.ejs +11 -9
  200. package/Tests/App/Accounts/LoginTwoFactorRecovery.test.tsx +972 -0
  201. package/Tests/App/Dashboard/AddNeighborToMonitoringModal.test.tsx +401 -0
  202. package/Tests/App/Dashboard/DiscoveryScanEditForm.test.tsx +707 -0
  203. package/Tests/App/Dashboard/DiscoveryScanWizardValidation.test.tsx +1908 -18
  204. package/Tests/App/Dashboard/LlmCallsTableIdentity.test.tsx +322 -0
  205. package/Tests/App/Dashboard/LlmOverview.test.tsx +335 -0
  206. package/Tests/App/Dashboard/LlmSpanDisplay.test.ts +391 -0
  207. package/Tests/App/Dashboard/LlmUsageBreakdown.test.tsx +1007 -0
  208. package/Tests/App/Dashboard/ResourceFeed.test.tsx +230 -0
  209. package/Tests/App/Dashboard/ResourceFeedPageWiring.test.ts +216 -0
  210. package/Tests/App/Dashboard/TopologyAddToMonitoring.test.tsx +192 -0
  211. package/Tests/App/Dashboard/WorkspaceNotificationRuleConditions.test.tsx +439 -0
  212. package/Tests/Models/DatabaseModels/DateColumnDeserialization.test.ts +182 -0
  213. package/Tests/Models/DatabaseModels/RelationColumnModelTypeCoverage.test.ts +82 -0
  214. package/Tests/Models/DatabaseModels/ResourceFeedModels.test.ts +398 -0
  215. package/Tests/Models/DiscoveryScanNameColumn.test.ts +151 -16
  216. package/Tests/Models/DiscoveryScanSnmpEnabledColumn.test.ts +593 -0
  217. package/Tests/Models/NetworkDeviceCreateContract.test.ts +102 -0
  218. package/Tests/Server/API/AIGenerationProjectAIToggle.test.ts +607 -0
  219. package/Tests/Server/API/AIGenerationRequestBudget.test.ts +355 -0
  220. package/Tests/Server/API/AIKillSwitchBackstop.test.ts +602 -0
  221. package/Tests/Server/API/BaseAPI.test.ts +41 -0
  222. package/Tests/Server/API/BaseAPIUpdateDateColumns.test.ts +154 -0
  223. package/Tests/Server/API/BaseAPIUpdatePayloadValidation.test.ts +9 -16
  224. package/Tests/Server/API/MicrosoftTeamsBotTestEndpoint.test.ts +335 -0
  225. package/Tests/Server/API/UserOnCallLogTimelineAcknowledgePage.test.ts +611 -0
  226. package/Tests/Server/API/UserTotpAuthAPI.test.ts +498 -4
  227. package/Tests/Server/API/UserWebAuthnBackupCodeMinting.test.ts +682 -0
  228. package/Tests/Server/Infrastructure/ExampleDockerfiles.test.ts +595 -0
  229. package/Tests/Server/Middleware/SlackAuthorization.test.ts +262 -5
  230. package/Tests/Server/Services/AIServiceDailyBudget.test.ts +9 -0
  231. package/Tests/Server/Services/AIServiceProjectAccess.test.ts +6 -0
  232. package/Tests/Server/Services/AutoImportScanCredentialSelect.test.ts +18 -0
  233. package/Tests/Server/Services/DatabaseServiceAggregateBy.test.ts +590 -0
  234. package/Tests/Server/Services/DatabaseServiceUpdateWriteRouting.test.ts +12 -0
  235. package/Tests/Server/Services/DiscoveryScanClaimHookFreeSafety.test.ts +162 -26
  236. package/Tests/Server/Services/EnterpriseLicenseServiceCreate.test.ts +292 -0
  237. package/Tests/Server/Services/FeedRetentionConsistency.test.ts +119 -12
  238. package/Tests/Server/Services/LogAggregationAttributeOperators.test.ts +109 -0
  239. package/Tests/Server/Services/MetricAggregationAttributeOperators.test.ts +170 -0
  240. package/Tests/Server/Services/MonitorTemplateServiceNetworkDeviceSync.test.ts +383 -0
  241. package/Tests/Server/Services/NetworkDeviceAutoImportRuleEngineService.test.ts +997 -3
  242. package/Tests/Server/Services/NetworkDeviceAutoImportRuleService.test.ts +830 -0
  243. package/Tests/Server/Services/NetworkDeviceAutoMonitorLifecycle.test.ts +528 -0
  244. package/Tests/Server/Services/NetworkDeviceDiscoveryScanService.test.ts +3141 -1
  245. package/Tests/Server/Services/NetworkDeviceRegisteredHostnames.test.ts +1023 -0
  246. package/Tests/Server/Services/NetworkDeviceSiteAssignmentRuleSkip.test.ts +728 -0
  247. package/Tests/Server/Services/NetworkInterfaceServiceUpsert.test.ts +795 -0
  248. package/Tests/Server/Services/NetworkSiteRollupPolicyAndMaintenance.test.ts +903 -0
  249. package/Tests/Server/Services/NetworkSiteService.test.ts +165 -24
  250. package/Tests/Server/Services/ProjectServiceChangePlan.test.ts +5 -3
  251. package/Tests/Server/Services/ProjectServiceCreateSubscriptionStarted.test.ts +5 -2
  252. package/Tests/Server/Services/ResourceCreationFeedWrites.test.ts +304 -0
  253. package/Tests/Server/Services/ResourceFeedServices.test.ts +269 -0
  254. package/Tests/Server/Services/ResourceOwnerFeedWrites.test.ts +245 -0
  255. package/Tests/Server/Services/SecurityEventLastErrorColumnWidth.test.ts +792 -0
  256. package/Tests/Server/Services/TelemetrySourceMapService.test.ts +483 -0
  257. package/Tests/Server/Services/ThreatIntelFeedService.test.ts +351 -0
  258. package/Tests/Server/Services/ThreatIntelIndicatorService.test.ts +366 -0
  259. package/Tests/Server/Services/TraceAggregationAttributeOperators.test.ts +507 -0
  260. package/Tests/Server/Services/UserTwoFactorBackupCodeGenerateIfNone.test.ts +705 -0
  261. package/Tests/Server/Services/WorkspaceNotificationRuleOnCallDutyPolicy.test.ts +306 -0
  262. package/Tests/Server/Types/Database/AggregateResultUtil.test.ts +386 -0
  263. package/Tests/Server/Types/Database/Permissions/SelectRejectionMessageContract.test.ts +424 -0
  264. package/Tests/Server/Types/Database/QueryHelperWildcard.test.ts +142 -0
  265. package/Tests/Server/Types/Workflow/Components/ApiComponentPrivateNetwork.test.ts +163 -0
  266. package/Tests/Server/Types/Workflow/Components/JavaScriptPrivateNetwork.test.ts +124 -0
  267. package/Tests/Server/Utils/AI/CodeFixAgentCompletion.test.ts +5 -0
  268. package/Tests/Server/Utils/AI/InvestigationGrader.test.ts +39 -1
  269. package/Tests/Server/Utils/AnalyticsDatabase/AttributeFilterStatement.test.ts +338 -0
  270. package/Tests/Server/Utils/AnalyticsDatabase/StatementGeneratorWildcard.test.ts +383 -0
  271. package/Tests/Server/Utils/Marketing/EmittedMarketingEvent.ts +23 -0
  272. package/Tests/Server/Utils/Marketing/MarketingEventUtil.test.ts +51 -0
  273. package/Tests/Server/Utils/Monitor/Criteria/SyntheticMonitorCriteria.test.ts +259 -0
  274. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorPerSeriesFanout.test.ts +557 -0
  275. package/Tests/Server/Utils/Monitor/MonitorDependencySuppressionCreatorSkip.test.ts +12 -2
  276. package/Tests/Server/Utils/Monitor/NetworkDeviceWalkLogWritePath.test.ts +404 -0
  277. package/Tests/Server/Utils/Monitor/NetworkDeviceWalkUtil.test.ts +8 -2
  278. package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +125 -98
  279. package/Tests/Server/Utils/Monitor/PerEntityCriteriaFanOut.test.ts +444 -0
  280. package/Tests/Server/Utils/Monitor/PerSeriesSecondEntityAlerting.test.ts +1112 -0
  281. package/Tests/Server/Utils/NetworkDevice/DeviceHealthAggregation.test.ts +717 -0
  282. package/Tests/Server/Utils/NetworkDevice/RulePatternValidator.test.ts +78 -0
  283. package/Tests/Server/Utils/NetworkSite/NetworkSiteMaintenanceSuppression.test.ts +363 -0
  284. package/Tests/Server/Utils/OfflineAssetHygiene.test.ts +35 -0
  285. package/Tests/Server/Utils/OnCallNotificationContext.test.ts +908 -0
  286. package/Tests/Server/Utils/PrivateNetworkWebhookConfig.test.ts +423 -0
  287. package/Tests/Server/Utils/ResourceFeed/ResourceFeedUtil.test.ts +191 -0
  288. package/Tests/Server/Utils/SSRFProtectionPrivateNetwork.test.ts +597 -0
  289. package/Tests/Server/Utils/SecurityEvent/ConnectorErrorMessage.test.ts +819 -0
  290. package/Tests/Server/Utils/SecurityEvent/DetectionRuleEvaluator.test.ts +381 -0
  291. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPoller.test.ts +417 -0
  292. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPollerFailureTaxonomy.test.ts +819 -0
  293. package/Tests/Server/Utils/SecurityEvent/SecurityEventAlerting.test.ts +246 -0
  294. package/Tests/Server/Utils/SecurityEvent/ThreatIntel/TaxiiClient.test.ts +282 -0
  295. package/Tests/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelEnricher.test.ts +312 -0
  296. package/Tests/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.test.ts +854 -0
  297. package/Tests/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelMatcher.test.ts +437 -0
  298. package/Tests/Server/Utils/StartServerErrorStatus.test.ts +225 -0
  299. package/Tests/Server/Utils/StatusPage/MonitorRulePatternValidator.test.ts +62 -0
  300. package/Tests/Server/Utils/StatusPageSubscriberWebhookPrivateNetwork.test.ts +119 -0
  301. package/Tests/Server/Utils/Telemetry/LlmCostBudgetEvaluator.test.ts +37 -18
  302. package/Tests/Server/Utils/Telemetry/LlmMetricSpend.test.ts +143 -2
  303. package/Tests/Server/Utils/Telemetry/LlmSpan.test.ts +804 -0
  304. package/Tests/Server/Utils/Telemetry/SourceMapResolver.test.ts +542 -0
  305. package/Tests/Server/Utils/TwoFactorBackupCodeNotification.test.ts +272 -0
  306. package/Tests/Server/Utils/VM/VMRunnerPrivateNetworkWiring.test.ts +111 -0
  307. package/Tests/Server/Utils/VendorAssets.test.ts +117 -0
  308. package/Tests/Server/Utils/Workspace/MicrosoftTeamsChannelSend.test.ts +101 -4
  309. package/Tests/Server/Utils/Workspace/MicrosoftTeamsInstallStateDiagnostics.test.ts +922 -0
  310. package/Tests/Server/Utils/Workspace/MicrosoftTeamsRosterDiagnosticMessages.test.ts +642 -0
  311. package/Tests/Server/Views/OnCallAcknowledgePage.test.ts +430 -0
  312. package/Tests/Types/API/URLQueryString.test.ts +472 -0
  313. package/Tests/Types/BaseDatabase/Wildcard.test.ts +163 -0
  314. package/Tests/Types/BaseDatabase/WildcardPattern.test.ts +149 -0
  315. package/Tests/Types/Database/DateColumnValue.test.ts +265 -0
  316. package/Tests/Types/DateToIsoStringOrNull.test.ts +67 -0
  317. package/Tests/Types/Log/LogQueryToFilter.test.ts +218 -43
  318. package/Tests/Types/Monitor/KubernetesTemplateGroupByKeys.test.ts +225 -0
  319. package/Tests/Types/Monitor/TemplateGroupByKeys.test.ts +296 -0
  320. package/Tests/Types/NetworkAutomation/RuleRunResult.test.ts +102 -0
  321. package/Tests/Types/NetworkAutomation/RuleRunResultDescribe.test.ts +145 -0
  322. package/Tests/Types/NetworkSite/SiteHealthRollupPolicy.test.ts +58 -0
  323. package/Tests/Types/SerializableObjectDictionaryImportCycle.test.ts +15 -0
  324. package/Tests/Types/Telemetry/LlmMetricConventions.test.ts +391 -0
  325. package/Tests/Types/Telemetry/TelemetrySearchQuery.test.ts +620 -0
  326. package/Tests/Types/WhatsApp/WhatsAppTemplates.test.ts +110 -0
  327. package/Tests/Types/Workspace/NotificationRuleConditionUtil.test.ts +76 -6
  328. package/Tests/Types/Workspace/NotificationRules/NotificationRuleCondition.test.ts +16 -4
  329. package/Tests/Types/Workspace/NotificationRules/OnCallDutyPolicyConditions.test.ts +669 -0
  330. package/Tests/UI/Components/DictionaryFilterOperatorWildcard.test.ts +175 -0
  331. package/Tests/UI/Components/IconOpticalSize.test.tsx +377 -0
  332. package/Tests/UI/MicrosoftTeams/MicrosoftTeamsChatsCardInstallGuidance.test.tsx +332 -0
  333. package/Tests/UI/MicrosoftTeams/MicrosoftTeamsInstallGuidanceContent.test.tsx +643 -0
  334. package/Tests/Utils/Monitor/InterfaceInventoryUtil.test.ts +824 -0
  335. package/Tests/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.test.ts +626 -0
  336. package/Tests/Utils/Monitor/NetworkTopologyUtil.test.ts +718 -0
  337. package/Tests/Utils/NetworkDevice/DeviceHealthStateUtil.test.ts +59 -0
  338. package/Tests/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.test.ts +287 -2
  339. package/Tests/Utils/NetworkDiscovery/DiscoveryImportEligibility.test.ts +73 -0
  340. package/Tests/Utils/NetworkDiscovery/PingMonitorBuilder.test.ts +317 -0
  341. package/Tests/Utils/NetworkDiscovery/RescanIntervalUtil.test.ts +262 -0
  342. package/Tests/Utils/NetworkDiscovery/ScanModeUtil.test.ts +474 -0
  343. package/Tests/Utils/NetworkDiscovery/SnmpScanConfigUtil.test.ts +2442 -0
  344. package/Tests/Utils/NetworkSite/SiteMaintenanceUtil.test.ts +188 -0
  345. package/Tests/Utils/NetworkSite/SiteStatusRollupUtil.test.ts +522 -0
  346. package/Tests/Utils/NetworkSite/SiteUptimeUtil.test.ts +694 -0
  347. package/Tests/Utils/SecurityEvent/ThreatIntel/StixPatternParser.test.ts +281 -0
  348. package/Tests/Utils/Telemetry/CrossSignalScope.test.ts +87 -67
  349. package/Tests/Utils/Telemetry/LlmMetricQuery.test.ts +298 -0
  350. package/Types/API/URL.ts +45 -10
  351. package/Types/AnalyticsDatabase/AnalyticsTableName.ts +8 -0
  352. package/Types/BaseDatabase/NotWildcard.ts +86 -0
  353. package/Types/BaseDatabase/Wildcard.ts +89 -0
  354. package/Types/BaseDatabase/WildcardPattern.ts +176 -0
  355. package/Types/Database/DateColumnValue.ts +184 -0
  356. package/Types/Database/TableColumn.ts +40 -5
  357. package/Types/Date.ts +37 -0
  358. package/Types/Email/EmailTemplateType.ts +1 -0
  359. package/Types/JSON.ts +8 -0
  360. package/Types/Log/LogQueryToFilter.ts +167 -129
  361. package/Types/Monitor/DockerAlertTemplates.ts +43 -12
  362. package/Types/Monitor/HostAlertTemplates.ts +31 -3
  363. package/Types/Monitor/KubernetesAlertTemplates.ts +98 -0
  364. package/Types/Monitor/MonitorStep.ts +49 -0
  365. package/Types/Monitor/PodmanAlertTemplates.ts +39 -12
  366. package/Types/Monitor/SnmpMonitor/CdpNeighbor.ts +14 -0
  367. package/Types/Monitor/SnmpMonitor/LldpNeighbor.ts +11 -0
  368. package/Types/Monitor/SnmpMonitor/NetworkTopology.ts +11 -4
  369. package/Types/NetworkAutomation/RuleRunResult.ts +191 -2
  370. package/Types/NetworkSite/SiteHealthRollupPolicy.ts +96 -0
  371. package/Types/Permission.ts +411 -0
  372. package/Types/Probe/ProbeApiIngestResponse.ts +42 -0
  373. package/Types/SecurityEvent/ThreatIntelConstants.ts +118 -0
  374. package/Types/SerializableObjectDictionary.ts +8 -0
  375. package/Types/Telemetry/LlmConventions.ts +255 -0
  376. package/Types/Telemetry/LlmMetricConventions.ts +212 -7
  377. package/Types/Telemetry/SourceMap.ts +56 -0
  378. package/Types/Telemetry/TelemetrySearchQuery.ts +949 -0
  379. package/Types/Workspace/NotificationRules/NotificationRuleCondition.ts +12 -1
  380. package/UI/Components/Dictionary/DictionaryFilterOperator.ts +83 -0
  381. package/UI/Components/Icon/Icon.tsx +28 -1
  382. package/UI/Components/LogsViewer/components/LogSearchBar.tsx +26 -4
  383. package/UI/Components/LogsViewer/components/LogSearchHelp.tsx +34 -16
  384. package/UI/Components/TelemetryViewer/components/TelemetrySearchBar.tsx +15 -2
  385. package/Utils/Metrics/MetricExplorerUrl.ts +77 -15
  386. package/Utils/Monitor/InterfaceInventoryUtil.ts +251 -0
  387. package/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.ts +333 -0
  388. package/Utils/Monitor/NetworkTopologyUtil.ts +249 -28
  389. package/Utils/NetworkDevice/DeviceHealthStateUtil.ts +14 -6
  390. package/Utils/NetworkDiscovery/AutoImportRuleMatcher.ts +2 -0
  391. package/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.ts +49 -18
  392. package/Utils/NetworkDiscovery/PingMonitorBuilder.ts +215 -0
  393. package/Utils/NetworkDiscovery/RescanIntervalUtil.ts +148 -0
  394. package/Utils/NetworkDiscovery/ScanModeUtil.ts +105 -0
  395. package/Utils/NetworkDiscovery/SnmpScanConfigUtil.ts +827 -0
  396. package/Utils/NetworkSite/SiteMaintenanceUtil.ts +110 -0
  397. package/Utils/NetworkSite/SiteStatusRollupUtil.ts +350 -19
  398. package/Utils/NetworkSite/SiteUptimeUtil.ts +422 -21
  399. package/Utils/SecurityEvent/ThreatIntel/StixPatternParser.ts +383 -0
  400. package/Utils/Telemetry/CrossSignalScope.ts +37 -39
  401. package/Utils/Telemetry/LlmMetricQuery.ts +83 -0
  402. package/build/dist/Models/AnalyticsModels/Index.js +2 -0
  403. package/build/dist/Models/AnalyticsModels/Index.js.map +1 -1
  404. package/build/dist/Models/AnalyticsModels/Span.js +89 -0
  405. package/build/dist/Models/AnalyticsModels/Span.js.map +1 -1
  406. package/build/dist/Models/AnalyticsModels/ThreatIntelIndicator.js +325 -0
  407. package/build/dist/Models/AnalyticsModels/ThreatIntelIndicator.js.map +1 -0
  408. package/build/dist/Models/DatabaseModels/AlertSeverity.js +4 -1
  409. package/build/dist/Models/DatabaseModels/AlertSeverity.js.map +1 -1
  410. package/build/dist/Models/DatabaseModels/CephClusterFeed.js +648 -0
  411. package/build/dist/Models/DatabaseModels/CephClusterFeed.js.map +1 -0
  412. package/build/dist/Models/DatabaseModels/CloudResourceFeed.js +648 -0
  413. package/build/dist/Models/DatabaseModels/CloudResourceFeed.js.map +1 -0
  414. package/build/dist/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.js +11 -0
  415. package/build/dist/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.js.map +1 -1
  416. package/build/dist/Models/DatabaseModels/DetectionRule.js +9 -3
  417. package/build/dist/Models/DatabaseModels/DetectionRule.js.map +1 -1
  418. package/build/dist/Models/DatabaseModels/DockerHostFeed.js +648 -0
  419. package/build/dist/Models/DatabaseModels/DockerHostFeed.js.map +1 -0
  420. package/build/dist/Models/DatabaseModels/DockerSwarmClusterFeed.js +648 -0
  421. package/build/dist/Models/DatabaseModels/DockerSwarmClusterFeed.js.map +1 -0
  422. package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js +9 -3
  423. package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js.map +1 -1
  424. package/build/dist/Models/DatabaseModels/HostFeed.js +648 -0
  425. package/build/dist/Models/DatabaseModels/HostFeed.js.map +1 -0
  426. package/build/dist/Models/DatabaseModels/IncidentSeverity.js +4 -1
  427. package/build/dist/Models/DatabaseModels/IncidentSeverity.js.map +1 -1
  428. package/build/dist/Models/DatabaseModels/Index.js +22 -0
  429. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  430. package/build/dist/Models/DatabaseModels/KubernetesClusterFeed.js +648 -0
  431. package/build/dist/Models/DatabaseModels/KubernetesClusterFeed.js.map +1 -0
  432. package/build/dist/Models/DatabaseModels/Monitor.js +81 -0
  433. package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
  434. package/build/dist/Models/DatabaseModels/NetworkDevice.js +103 -7
  435. package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
  436. package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js +91 -6
  437. package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js.map +1 -1
  438. package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js +276 -31
  439. package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -1
  440. package/build/dist/Models/DatabaseModels/NetworkSite.js +124 -1
  441. package/build/dist/Models/DatabaseModels/NetworkSite.js.map +1 -1
  442. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyExecutionLog.js +1 -0
  443. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyExecutionLog.js.map +1 -1
  444. package/build/dist/Models/DatabaseModels/PodmanHostFeed.js +648 -0
  445. package/build/dist/Models/DatabaseModels/PodmanHostFeed.js.map +1 -0
  446. package/build/dist/Models/DatabaseModels/ProxmoxClusterFeed.js +648 -0
  447. package/build/dist/Models/DatabaseModels/ProxmoxClusterFeed.js.map +1 -0
  448. package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js +66 -0
  449. package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js.map +1 -1
  450. package/build/dist/Models/DatabaseModels/ServiceFeed.js +648 -0
  451. package/build/dist/Models/DatabaseModels/ServiceFeed.js.map +1 -0
  452. package/build/dist/Models/DatabaseModels/TelemetrySourceMap.js +496 -0
  453. package/build/dist/Models/DatabaseModels/TelemetrySourceMap.js.map +1 -0
  454. package/build/dist/Models/DatabaseModels/ThreatIntelFeed.js +800 -0
  455. package/build/dist/Models/DatabaseModels/ThreatIntelFeed.js.map +1 -0
  456. package/build/dist/Models/DatabaseModels/UserOnCallLog.js +1 -0
  457. package/build/dist/Models/DatabaseModels/UserOnCallLog.js.map +1 -1
  458. package/build/dist/Models/DatabaseModels/UserTotpAuth.js +1 -0
  459. package/build/dist/Models/DatabaseModels/UserTotpAuth.js.map +1 -1
  460. package/build/dist/Models/DatabaseModels/UserWebAuthn.js +1 -0
  461. package/build/dist/Models/DatabaseModels/UserWebAuthn.js.map +1 -1
  462. package/build/dist/Server/API/AlertAPI.js +18 -1
  463. package/build/dist/Server/API/AlertAPI.js.map +1 -1
  464. package/build/dist/Server/API/BaseAPI.js +11 -20
  465. package/build/dist/Server/API/BaseAPI.js.map +1 -1
  466. package/build/dist/Server/API/IncidentAPI.js +35 -1
  467. package/build/dist/Server/API/IncidentAPI.js.map +1 -1
  468. package/build/dist/Server/API/IncidentEpisodeAPI.js +18 -1
  469. package/build/dist/Server/API/IncidentEpisodeAPI.js.map +1 -1
  470. package/build/dist/Server/API/MicrosoftTeamsAPI.js +30 -2
  471. package/build/dist/Server/API/MicrosoftTeamsAPI.js.map +1 -1
  472. package/build/dist/Server/API/ScheduledMaintenanceAPI.js +18 -1
  473. package/build/dist/Server/API/ScheduledMaintenanceAPI.js.map +1 -1
  474. package/build/dist/Server/API/SlackAPI.js +45 -2
  475. package/build/dist/Server/API/SlackAPI.js.map +1 -1
  476. package/build/dist/Server/API/TelemetryAPI.js +100 -35
  477. package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
  478. package/build/dist/Server/API/UserOnCallLogTimelineAPI.js +64 -59
  479. package/build/dist/Server/API/UserOnCallLogTimelineAPI.js.map +1 -1
  480. package/build/dist/Server/API/UserTotpAuthAPI.js +65 -1
  481. package/build/dist/Server/API/UserTotpAuthAPI.js.map +1 -1
  482. package/build/dist/Server/API/UserWebAuthnAPI.js +42 -1
  483. package/build/dist/Server/API/UserWebAuthnAPI.js.map +1 -1
  484. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787923136162-MigrationName.js +26 -0
  485. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787923136162-MigrationName.js.map +1 -0
  486. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789600000000-AddAutoProvisionedNetworkDeviceMonitors.js +22 -0
  487. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789600000000-AddAutoProvisionedNetworkDeviceMonitors.js.map +1 -0
  488. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789700000000-AddNetworkScaleIndexes.js +88 -0
  489. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789700000000-AddNetworkScaleIndexes.js.map +1 -0
  490. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789800000000-WidenSecurityEventLastErrorColumns.js +39 -0
  491. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789800000000-WidenSecurityEventLastErrorColumns.js.map +1 -0
  492. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789900000000-AddNetworkSiteRollupPolicyAndMaintenance.js +34 -0
  493. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789900000000-AddNetworkSiteRollupPolicyAndMaintenance.js.map +1 -0
  494. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790000000000-AddTelemetrySourceMap.js +32 -0
  495. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790000000000-AddTelemetrySourceMap.js.map +1 -0
  496. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790000000001-AddSnmpConfigsToNetworkDeviceDiscoveryScan.js +61 -0
  497. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790000000001-AddSnmpConfigsToNetworkDeviceDiscoveryScan.js.map +1 -0
  498. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790003445000-AddSnmpEnabledToNetworkDeviceDiscoveryScan.js +23 -0
  499. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790003445000-AddSnmpEnabledToNetworkDeviceDiscoveryScan.js.map +1 -0
  500. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790100000000-AddResourceActivityFeeds.js +179 -0
  501. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790100000000-AddResourceActivityFeeds.js.map +1 -0
  502. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +18 -0
  503. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  504. package/build/dist/Server/Middleware/IdentityRateLimit.js +40 -3
  505. package/build/dist/Server/Middleware/IdentityRateLimit.js.map +1 -1
  506. package/build/dist/Server/Middleware/SlackAuthorization.js +58 -7
  507. package/build/dist/Server/Middleware/SlackAuthorization.js.map +1 -1
  508. package/build/dist/Server/Services/AIService.js +177 -30
  509. package/build/dist/Server/Services/AIService.js.map +1 -1
  510. package/build/dist/Server/Services/CephClusterFeedService.js +89 -0
  511. package/build/dist/Server/Services/CephClusterFeedService.js.map +1 -0
  512. package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js +27 -3
  513. package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js.map +1 -1
  514. package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js +21 -0
  515. package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js.map +1 -1
  516. package/build/dist/Server/Services/CephClusterOwnerTeamService.js +120 -0
  517. package/build/dist/Server/Services/CephClusterOwnerTeamService.js.map +1 -1
  518. package/build/dist/Server/Services/CephClusterOwnerUserService.js +113 -0
  519. package/build/dist/Server/Services/CephClusterOwnerUserService.js.map +1 -1
  520. package/build/dist/Server/Services/CephClusterService.js +175 -1
  521. package/build/dist/Server/Services/CephClusterService.js.map +1 -1
  522. package/build/dist/Server/Services/CloudResourceFeedService.js +89 -0
  523. package/build/dist/Server/Services/CloudResourceFeedService.js.map +1 -0
  524. package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js +27 -3
  525. package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js.map +1 -1
  526. package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js +28 -3
  527. package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js.map +1 -1
  528. package/build/dist/Server/Services/CloudResourceOwnerTeamService.js +120 -0
  529. package/build/dist/Server/Services/CloudResourceOwnerTeamService.js.map +1 -1
  530. package/build/dist/Server/Services/CloudResourceOwnerUserService.js +113 -0
  531. package/build/dist/Server/Services/CloudResourceOwnerUserService.js.map +1 -1
  532. package/build/dist/Server/Services/CloudResourceService.js +177 -1
  533. package/build/dist/Server/Services/CloudResourceService.js.map +1 -1
  534. package/build/dist/Server/Services/DatabaseService.js +201 -0
  535. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  536. package/build/dist/Server/Services/DockerHostFeedService.js +89 -0
  537. package/build/dist/Server/Services/DockerHostFeedService.js.map +1 -0
  538. package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js +27 -3
  539. package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js.map +1 -1
  540. package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js +21 -0
  541. package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js.map +1 -1
  542. package/build/dist/Server/Services/DockerHostOwnerTeamService.js +120 -0
  543. package/build/dist/Server/Services/DockerHostOwnerTeamService.js.map +1 -1
  544. package/build/dist/Server/Services/DockerHostOwnerUserService.js +113 -0
  545. package/build/dist/Server/Services/DockerHostOwnerUserService.js.map +1 -1
  546. package/build/dist/Server/Services/DockerHostService.js +177 -1
  547. package/build/dist/Server/Services/DockerHostService.js.map +1 -1
  548. package/build/dist/Server/Services/DockerSwarmClusterFeedService.js +90 -0
  549. package/build/dist/Server/Services/DockerSwarmClusterFeedService.js.map +1 -0
  550. package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js +27 -3
  551. package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js.map +1 -1
  552. package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js +21 -0
  553. package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js.map +1 -1
  554. package/build/dist/Server/Services/DockerSwarmClusterOwnerTeamService.js +120 -0
  555. package/build/dist/Server/Services/DockerSwarmClusterOwnerTeamService.js.map +1 -1
  556. package/build/dist/Server/Services/DockerSwarmClusterOwnerUserService.js +113 -0
  557. package/build/dist/Server/Services/DockerSwarmClusterOwnerUserService.js.map +1 -1
  558. package/build/dist/Server/Services/DockerSwarmClusterService.js +175 -1
  559. package/build/dist/Server/Services/DockerSwarmClusterService.js.map +1 -1
  560. package/build/dist/Server/Services/EnterpriseLicenseService.js +40 -30
  561. package/build/dist/Server/Services/EnterpriseLicenseService.js.map +1 -1
  562. package/build/dist/Server/Services/ExceptionAggregationService.js +8 -2
  563. package/build/dist/Server/Services/ExceptionAggregationService.js.map +1 -1
  564. package/build/dist/Server/Services/HostFeedService.js +89 -0
  565. package/build/dist/Server/Services/HostFeedService.js.map +1 -0
  566. package/build/dist/Server/Services/HostLabelRuleEngineService.js +27 -3
  567. package/build/dist/Server/Services/HostLabelRuleEngineService.js.map +1 -1
  568. package/build/dist/Server/Services/HostOwnerRuleEngineService.js +21 -0
  569. package/build/dist/Server/Services/HostOwnerRuleEngineService.js.map +1 -1
  570. package/build/dist/Server/Services/HostOwnerTeamService.js +120 -0
  571. package/build/dist/Server/Services/HostOwnerTeamService.js.map +1 -1
  572. package/build/dist/Server/Services/HostOwnerUserService.js +113 -0
  573. package/build/dist/Server/Services/HostOwnerUserService.js.map +1 -1
  574. package/build/dist/Server/Services/HostService.js +175 -1
  575. package/build/dist/Server/Services/HostService.js.map +1 -1
  576. package/build/dist/Server/Services/IncidentService.js +10 -0
  577. package/build/dist/Server/Services/IncidentService.js.map +1 -1
  578. package/build/dist/Server/Services/Index.js +24 -0
  579. package/build/dist/Server/Services/Index.js.map +1 -1
  580. package/build/dist/Server/Services/KubernetesClusterFeedService.js +89 -0
  581. package/build/dist/Server/Services/KubernetesClusterFeedService.js.map +1 -0
  582. package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js +27 -3
  583. package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js.map +1 -1
  584. package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js +21 -0
  585. package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js.map +1 -1
  586. package/build/dist/Server/Services/KubernetesClusterOwnerTeamService.js +120 -0
  587. package/build/dist/Server/Services/KubernetesClusterOwnerTeamService.js.map +1 -1
  588. package/build/dist/Server/Services/KubernetesClusterOwnerUserService.js +113 -0
  589. package/build/dist/Server/Services/KubernetesClusterOwnerUserService.js.map +1 -1
  590. package/build/dist/Server/Services/KubernetesClusterService.js +177 -1
  591. package/build/dist/Server/Services/KubernetesClusterService.js.map +1 -1
  592. package/build/dist/Server/Services/LogAggregationService.js +19 -196
  593. package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
  594. package/build/dist/Server/Services/MetricAggregationService.js +59 -0
  595. package/build/dist/Server/Services/MetricAggregationService.js.map +1 -1
  596. package/build/dist/Server/Services/MonitorService.js +115 -13
  597. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  598. package/build/dist/Server/Services/MonitorTemplateService.js +86 -0
  599. package/build/dist/Server/Services/MonitorTemplateService.js.map +1 -1
  600. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +561 -67
  601. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
  602. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js +130 -16
  603. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js.map +1 -1
  604. package/build/dist/Server/Services/NetworkDeviceDiscoveryScanService.js +850 -8
  605. package/build/dist/Server/Services/NetworkDeviceDiscoveryScanService.js.map +1 -1
  606. package/build/dist/Server/Services/NetworkDeviceService.js +594 -5
  607. package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
  608. package/build/dist/Server/Services/NetworkInterfaceService.js +306 -0
  609. package/build/dist/Server/Services/NetworkInterfaceService.js.map +1 -1
  610. package/build/dist/Server/Services/NetworkSiteService.js +408 -47
  611. package/build/dist/Server/Services/NetworkSiteService.js.map +1 -1
  612. package/build/dist/Server/Services/PodmanHostFeedService.js +89 -0
  613. package/build/dist/Server/Services/PodmanHostFeedService.js.map +1 -0
  614. package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js +27 -3
  615. package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js.map +1 -1
  616. package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js +21 -0
  617. package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js.map +1 -1
  618. package/build/dist/Server/Services/PodmanHostOwnerTeamService.js +120 -0
  619. package/build/dist/Server/Services/PodmanHostOwnerTeamService.js.map +1 -1
  620. package/build/dist/Server/Services/PodmanHostOwnerUserService.js +113 -0
  621. package/build/dist/Server/Services/PodmanHostOwnerUserService.js.map +1 -1
  622. package/build/dist/Server/Services/PodmanHostService.js +177 -1
  623. package/build/dist/Server/Services/PodmanHostService.js.map +1 -1
  624. package/build/dist/Server/Services/ProjectService.js +40 -30
  625. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  626. package/build/dist/Server/Services/ProxmoxClusterFeedService.js +89 -0
  627. package/build/dist/Server/Services/ProxmoxClusterFeedService.js.map +1 -0
  628. package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js +27 -3
  629. package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js.map +1 -1
  630. package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js +21 -0
  631. package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js.map +1 -1
  632. package/build/dist/Server/Services/ProxmoxClusterOwnerTeamService.js +120 -0
  633. package/build/dist/Server/Services/ProxmoxClusterOwnerTeamService.js.map +1 -1
  634. package/build/dist/Server/Services/ProxmoxClusterOwnerUserService.js +113 -0
  635. package/build/dist/Server/Services/ProxmoxClusterOwnerUserService.js.map +1 -1
  636. package/build/dist/Server/Services/ProxmoxClusterService.js +175 -1
  637. package/build/dist/Server/Services/ProxmoxClusterService.js.map +1 -1
  638. package/build/dist/Server/Services/ScheduledMaintenanceStateTimelineService.js +56 -0
  639. package/build/dist/Server/Services/ScheduledMaintenanceStateTimelineService.js.map +1 -1
  640. package/build/dist/Server/Services/ServiceFeedService.js +89 -0
  641. package/build/dist/Server/Services/ServiceFeedService.js.map +1 -0
  642. package/build/dist/Server/Services/ServiceLabelRuleEngineService.js +27 -3
  643. package/build/dist/Server/Services/ServiceLabelRuleEngineService.js.map +1 -1
  644. package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js +24 -0
  645. package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js.map +1 -1
  646. package/build/dist/Server/Services/ServiceOwnerTeamService.js +120 -0
  647. package/build/dist/Server/Services/ServiceOwnerTeamService.js.map +1 -1
  648. package/build/dist/Server/Services/ServiceOwnerUserService.js +113 -0
  649. package/build/dist/Server/Services/ServiceOwnerUserService.js.map +1 -1
  650. package/build/dist/Server/Services/ServiceService.js +173 -2
  651. package/build/dist/Server/Services/ServiceService.js.map +1 -1
  652. package/build/dist/Server/Services/StatusPageSubscriberService.js +7 -0
  653. package/build/dist/Server/Services/StatusPageSubscriberService.js.map +1 -1
  654. package/build/dist/Server/Services/TelemetryAttributeService.js +9 -3
  655. package/build/dist/Server/Services/TelemetryAttributeService.js.map +1 -1
  656. package/build/dist/Server/Services/TelemetrySourceMapService.js +265 -0
  657. package/build/dist/Server/Services/TelemetrySourceMapService.js.map +1 -0
  658. package/build/dist/Server/Services/ThreatIntelFeedService.js +157 -0
  659. package/build/dist/Server/Services/ThreatIntelFeedService.js.map +1 -0
  660. package/build/dist/Server/Services/ThreatIntelIndicatorService.js +276 -0
  661. package/build/dist/Server/Services/ThreatIntelIndicatorService.js.map +1 -0
  662. package/build/dist/Server/Services/TraceAggregationService.js +62 -6
  663. package/build/dist/Server/Services/TraceAggregationService.js.map +1 -1
  664. package/build/dist/Server/Services/UserService.js +22 -13
  665. package/build/dist/Server/Services/UserService.js.map +1 -1
  666. package/build/dist/Server/Services/UserTwoFactorBackupCodeService.js +120 -0
  667. package/build/dist/Server/Services/UserTwoFactorBackupCodeService.js.map +1 -1
  668. package/build/dist/Server/Services/UserWebhookService.js +11 -2
  669. package/build/dist/Server/Services/UserWebhookService.js.map +1 -1
  670. package/build/dist/Server/Types/AnalyticsDatabase/ModelPermission.js +12 -1
  671. package/build/dist/Server/Types/AnalyticsDatabase/ModelPermission.js.map +1 -1
  672. package/build/dist/Server/Types/Database/AggregateBy.js +2 -0
  673. package/build/dist/Server/Types/Database/AggregateBy.js.map +1 -0
  674. package/build/dist/Server/Types/Database/AggregateResultUtil.js +90 -0
  675. package/build/dist/Server/Types/Database/AggregateResultUtil.js.map +1 -0
  676. package/build/dist/Server/Types/Database/JSONColumnQuery.js +14 -0
  677. package/build/dist/Server/Types/Database/JSONColumnQuery.js.map +1 -1
  678. package/build/dist/Server/Types/Database/QueryHelper.js +42 -0
  679. package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
  680. package/build/dist/Server/Types/Database/QueryUtil.js +18 -0
  681. package/build/dist/Server/Types/Database/QueryUtil.js.map +1 -1
  682. package/build/dist/Server/Types/Workflow/Components/API/Utils.js +10 -1
  683. package/build/dist/Server/Types/Workflow/Components/API/Utils.js.map +1 -1
  684. package/build/dist/Server/Types/Workflow/Components/JavaScript.js +8 -0
  685. package/build/dist/Server/Types/Workflow/Components/JavaScript.js.map +1 -1
  686. package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.js +8 -0
  687. package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.js.map +1 -1
  688. package/build/dist/Server/Utils/AI/SRE/InvestigationGrader.js +15 -0
  689. package/build/dist/Server/Utils/AI/SRE/InvestigationGrader.js.map +1 -1
  690. package/build/dist/Server/Utils/AnalyticsDatabase/AttributeFilterStatement.js +266 -0
  691. package/build/dist/Server/Utils/AnalyticsDatabase/AttributeFilterStatement.js.map +1 -0
  692. package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js +134 -0
  693. package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js.map +1 -1
  694. package/build/dist/Server/Utils/DataSource/HttpFetch.js +8 -0
  695. package/build/dist/Server/Utils/DataSource/HttpFetch.js.map +1 -1
  696. package/build/dist/Server/Utils/Database/RelationIdUtil.js +31 -0
  697. package/build/dist/Server/Utils/Database/RelationIdUtil.js.map +1 -1
  698. package/build/dist/Server/Utils/Marketing/MarketingEventUtil.js +26 -8
  699. package/build/dist/Server/Utils/Marketing/MarketingEventUtil.js.map +1 -1
  700. package/build/dist/Server/Utils/Monitor/Criteria/ServerMonitorCriteria.js +42 -17
  701. package/build/dist/Server/Utils/Monitor/Criteria/ServerMonitorCriteria.js.map +1 -1
  702. package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js +9 -1
  703. package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js.map +1 -1
  704. package/build/dist/Server/Utils/Monitor/Criteria/SyntheticMonitor.js +15 -2
  705. package/build/dist/Server/Utils/Monitor/Criteria/SyntheticMonitor.js.map +1 -1
  706. package/build/dist/Server/Utils/Monitor/MonitorAlert.js +386 -271
  707. package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
  708. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +278 -64
  709. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
  710. package/build/dist/Server/Utils/Monitor/MonitorIncident.js +469 -350
  711. package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
  712. package/build/dist/Server/Utils/Monitor/MonitorResource.js +183 -44
  713. package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
  714. package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js +46 -3
  715. package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js.map +1 -1
  716. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +18 -91
  717. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
  718. package/build/dist/Server/Utils/Monitor/PerEntityCriteriaFanOut.js +194 -0
  719. package/build/dist/Server/Utils/Monitor/PerEntityCriteriaFanOut.js.map +1 -0
  720. package/build/dist/Server/Utils/NetworkDevice/DeviceHealthAggregation.js +332 -0
  721. package/build/dist/Server/Utils/NetworkDevice/DeviceHealthAggregation.js.map +1 -0
  722. package/build/dist/Server/Utils/NetworkSite/NetworkSiteMaintenanceSuppression.js +279 -0
  723. package/build/dist/Server/Utils/NetworkSite/NetworkSiteMaintenanceSuppression.js.map +1 -0
  724. package/build/dist/Server/Utils/OnCallNotificationContext.js +415 -0
  725. package/build/dist/Server/Utils/OnCallNotificationContext.js.map +1 -0
  726. package/build/dist/Server/Utils/PrivateNetworkWebhookConfig.js +424 -0
  727. package/build/dist/Server/Utils/PrivateNetworkWebhookConfig.js.map +1 -0
  728. package/build/dist/Server/Utils/ResourceFeed/ResourceFeedUtil.js +108 -0
  729. package/build/dist/Server/Utils/ResourceFeed/ResourceFeedUtil.js.map +1 -0
  730. package/build/dist/Server/Utils/Response.js +12 -1
  731. package/build/dist/Server/Utils/Response.js.map +1 -1
  732. package/build/dist/Server/Utils/SSRFProtection.js +160 -58
  733. package/build/dist/Server/Utils/SSRFProtection.js.map +1 -1
  734. package/build/dist/Server/Utils/SecurityEvent/ConnectorErrorMessage.js +89 -0
  735. package/build/dist/Server/Utils/SecurityEvent/ConnectorErrorMessage.js.map +1 -0
  736. package/build/dist/Server/Utils/SecurityEvent/DetectionRuleEvaluator.js +75 -234
  737. package/build/dist/Server/Utils/SecurityEvent/DetectionRuleEvaluator.js.map +1 -1
  738. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js +41 -16
  739. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js.map +1 -1
  740. package/build/dist/Server/Utils/SecurityEvent/SecurityEventAlerting.js +217 -0
  741. package/build/dist/Server/Utils/SecurityEvent/SecurityEventAlerting.js.map +1 -0
  742. package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/TaxiiClient.js +103 -0
  743. package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/TaxiiClient.js.map +1 -0
  744. package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelEnricher.js +168 -0
  745. package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelEnricher.js.map +1 -0
  746. package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.js +527 -0
  747. package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.js.map +1 -0
  748. package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelMatcher.js +376 -0
  749. package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelMatcher.js.map +1 -0
  750. package/build/dist/Server/Utils/StartServer.js +70 -44
  751. package/build/dist/Server/Utils/StartServer.js.map +1 -1
  752. package/build/dist/Server/Utils/StatusPageSubscriberWebhook.js +3 -0
  753. package/build/dist/Server/Utils/StatusPageSubscriberWebhook.js.map +1 -1
  754. package/build/dist/Server/Utils/Telemetry/LlmMetricSpend.js +52 -3
  755. package/build/dist/Server/Utils/Telemetry/LlmMetricSpend.js.map +1 -1
  756. package/build/dist/Server/Utils/Telemetry/LlmSpan.js +24 -1
  757. package/build/dist/Server/Utils/Telemetry/LlmSpan.js.map +1 -1
  758. package/build/dist/Server/Utils/Telemetry/SourceMapResolver.js +327 -0
  759. package/build/dist/Server/Utils/Telemetry/SourceMapResolver.js.map +1 -0
  760. package/build/dist/Server/Utils/TwoFactorBackupCodeNotification.js +84 -0
  761. package/build/dist/Server/Utils/TwoFactorBackupCodeNotification.js.map +1 -0
  762. package/build/dist/Server/Utils/VM/VMAPI.js.map +1 -1
  763. package/build/dist/Server/Utils/VM/VMRunner.js +10 -1
  764. package/build/dist/Server/Utils/VM/VMRunner.js.map +1 -1
  765. package/build/dist/Server/Utils/VendorAssets.js +29 -0
  766. package/build/dist/Server/Utils/VendorAssets.js.map +1 -1
  767. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +121 -6
  768. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
  769. package/build/dist/Server/Utils/Workspace/Slack/Actions/Auth.js +0 -10
  770. package/build/dist/Server/Utils/Workspace/Slack/Actions/Auth.js.map +1 -1
  771. package/build/dist/Types/API/URL.js +40 -10
  772. package/build/dist/Types/API/URL.js.map +1 -1
  773. package/build/dist/Types/AnalyticsDatabase/AnalyticsTableName.js +8 -0
  774. package/build/dist/Types/AnalyticsDatabase/AnalyticsTableName.js.map +1 -1
  775. package/build/dist/Types/BaseDatabase/NotWildcard.js +72 -0
  776. package/build/dist/Types/BaseDatabase/NotWildcard.js.map +1 -0
  777. package/build/dist/Types/BaseDatabase/Wildcard.js +75 -0
  778. package/build/dist/Types/BaseDatabase/Wildcard.js.map +1 -0
  779. package/build/dist/Types/BaseDatabase/WildcardPattern.js +137 -0
  780. package/build/dist/Types/BaseDatabase/WildcardPattern.js.map +1 -0
  781. package/build/dist/Types/Database/DateColumnValue.js +125 -0
  782. package/build/dist/Types/Database/DateColumnValue.js.map +1 -0
  783. package/build/dist/Types/Database/TableColumn.js +18 -2
  784. package/build/dist/Types/Database/TableColumn.js.map +1 -1
  785. package/build/dist/Types/Date.js +31 -0
  786. package/build/dist/Types/Date.js.map +1 -1
  787. package/build/dist/Types/Email/EmailTemplateType.js +1 -0
  788. package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
  789. package/build/dist/Types/JSON.js +2 -0
  790. package/build/dist/Types/JSON.js.map +1 -1
  791. package/build/dist/Types/Log/LogQueryToFilter.js +111 -108
  792. package/build/dist/Types/Log/LogQueryToFilter.js.map +1 -1
  793. package/build/dist/Types/Monitor/DockerAlertTemplates.js +40 -16
  794. package/build/dist/Types/Monitor/DockerAlertTemplates.js.map +1 -1
  795. package/build/dist/Types/Monitor/HostAlertTemplates.js +29 -7
  796. package/build/dist/Types/Monitor/HostAlertTemplates.js.map +1 -1
  797. package/build/dist/Types/Monitor/KubernetesAlertTemplates.js +98 -4
  798. package/build/dist/Types/Monitor/KubernetesAlertTemplates.js.map +1 -1
  799. package/build/dist/Types/Monitor/MonitorStep.js +40 -0
  800. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  801. package/build/dist/Types/Monitor/PodmanAlertTemplates.js +36 -16
  802. package/build/dist/Types/Monitor/PodmanAlertTemplates.js.map +1 -1
  803. package/build/dist/Types/NetworkAutomation/RuleRunResult.js +90 -0
  804. package/build/dist/Types/NetworkAutomation/RuleRunResult.js.map +1 -1
  805. package/build/dist/Types/NetworkSite/SiteHealthRollupPolicy.js +84 -0
  806. package/build/dist/Types/NetworkSite/SiteHealthRollupPolicy.js.map +1 -0
  807. package/build/dist/Types/Permission.js +354 -0
  808. package/build/dist/Types/Permission.js.map +1 -1
  809. package/build/dist/Types/SecurityEvent/ThreatIntelConstants.js +100 -0
  810. package/build/dist/Types/SecurityEvent/ThreatIntelConstants.js.map +1 -0
  811. package/build/dist/Types/SerializableObjectDictionary.js +8 -0
  812. package/build/dist/Types/SerializableObjectDictionary.js.map +1 -1
  813. package/build/dist/Types/Telemetry/LlmConventions.js +236 -0
  814. package/build/dist/Types/Telemetry/LlmConventions.js.map +1 -1
  815. package/build/dist/Types/Telemetry/LlmMetricConventions.js +197 -5
  816. package/build/dist/Types/Telemetry/LlmMetricConventions.js.map +1 -1
  817. package/build/dist/Types/Telemetry/SourceMap.js +9 -0
  818. package/build/dist/Types/Telemetry/SourceMap.js.map +1 -0
  819. package/build/dist/Types/Telemetry/TelemetrySearchQuery.js +661 -0
  820. package/build/dist/Types/Telemetry/TelemetrySearchQuery.js.map +1 -0
  821. package/build/dist/Types/Workspace/NotificationRules/NotificationRuleCondition.js +12 -1
  822. package/build/dist/Types/Workspace/NotificationRules/NotificationRuleCondition.js.map +1 -1
  823. package/build/dist/UI/Components/Dictionary/DictionaryFilterOperator.js +67 -0
  824. package/build/dist/UI/Components/Dictionary/DictionaryFilterOperator.js.map +1 -1
  825. package/build/dist/UI/Components/Icon/Icon.js +28 -1
  826. package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
  827. package/build/dist/UI/Components/LogsViewer/components/LogSearchBar.js +25 -4
  828. package/build/dist/UI/Components/LogsViewer/components/LogSearchBar.js.map +1 -1
  829. package/build/dist/UI/Components/LogsViewer/components/LogSearchHelp.js +36 -16
  830. package/build/dist/UI/Components/LogsViewer/components/LogSearchHelp.js.map +1 -1
  831. package/build/dist/UI/Components/TelemetryViewer/components/TelemetrySearchBar.js +14 -2
  832. package/build/dist/UI/Components/TelemetryViewer/components/TelemetrySearchBar.js.map +1 -1
  833. package/build/dist/Utils/Metrics/MetricExplorerUrl.js +54 -9
  834. package/build/dist/Utils/Metrics/MetricExplorerUrl.js.map +1 -1
  835. package/build/dist/Utils/Monitor/InterfaceInventoryUtil.js +128 -0
  836. package/build/dist/Utils/Monitor/InterfaceInventoryUtil.js.map +1 -0
  837. package/build/dist/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.js +190 -0
  838. package/build/dist/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.js.map +1 -0
  839. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +206 -28
  840. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
  841. package/build/dist/Utils/NetworkDevice/DeviceHealthStateUtil.js +14 -7
  842. package/build/dist/Utils/NetworkDevice/DeviceHealthStateUtil.js.map +1 -1
  843. package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js.map +1 -1
  844. package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js +34 -18
  845. package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js.map +1 -1
  846. package/build/dist/Utils/NetworkDiscovery/PingMonitorBuilder.js +163 -0
  847. package/build/dist/Utils/NetworkDiscovery/PingMonitorBuilder.js.map +1 -0
  848. package/build/dist/Utils/NetworkDiscovery/RescanIntervalUtil.js +99 -0
  849. package/build/dist/Utils/NetworkDiscovery/RescanIntervalUtil.js.map +1 -0
  850. package/build/dist/Utils/NetworkDiscovery/ScanModeUtil.js +85 -0
  851. package/build/dist/Utils/NetworkDiscovery/ScanModeUtil.js.map +1 -0
  852. package/build/dist/Utils/NetworkDiscovery/SnmpScanConfigUtil.js +560 -0
  853. package/build/dist/Utils/NetworkDiscovery/SnmpScanConfigUtil.js.map +1 -0
  854. package/build/dist/Utils/NetworkSite/SiteMaintenanceUtil.js +56 -0
  855. package/build/dist/Utils/NetworkSite/SiteMaintenanceUtil.js.map +1 -0
  856. package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js +185 -10
  857. package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js.map +1 -1
  858. package/build/dist/Utils/NetworkSite/SiteUptimeUtil.js +248 -21
  859. package/build/dist/Utils/NetworkSite/SiteUptimeUtil.js.map +1 -1
  860. package/build/dist/Utils/SecurityEvent/ThreatIntel/StixPatternParser.js +255 -0
  861. package/build/dist/Utils/SecurityEvent/ThreatIntel/StixPatternParser.js.map +1 -0
  862. package/build/dist/Utils/Telemetry/CrossSignalScope.js +27 -30
  863. package/build/dist/Utils/Telemetry/CrossSignalScope.js.map +1 -1
  864. package/build/dist/Utils/Telemetry/LlmMetricQuery.js +57 -1
  865. package/build/dist/Utils/Telemetry/LlmMetricQuery.js.map +1 -1
  866. package/package.json +2 -1
  867. package/Tests/Types/Log/LogQueryParser.test.ts +0 -186
  868. package/Types/Log/LogQueryParser.ts +0 -252
  869. package/build/dist/Types/Log/LogQueryParser.js +0 -200
  870. package/build/dist/Types/Log/LogQueryParser.js.map +0 -1
@@ -62,6 +62,20 @@ export default class MonitorIncident {
62
62
  * incidents are treated like any other for dedupe/resolve.
63
63
  */
64
64
  breachingSeriesFingerprints?: Set<string> | undefined;
65
+ /**
66
+ * The breaching fingerprints of EACH criteria evaluated on this
67
+ * tick, keyed by criteria id — a criteria that ran and matched
68
+ * nothing maps to an empty set.
69
+ *
70
+ * Without this, "is this series still breaching?" was answered from
71
+ * the winning criteria's set alone, so a host held critical by
72
+ * criteria A silently auto-resolved another host's still-valid
73
+ * incident from criteria B. A criteria absent from this dictionary
74
+ * was not evaluated at all, and its open incidents are left alone.
75
+ */
76
+ breachingSeriesFingerprintsByCriteriaId?:
77
+ | Dictionary<Set<string>>
78
+ | undefined;
65
79
  /**
66
80
  * Event-driven (incoming-request / webhook) mode. When true, an open
67
81
  * incident carrying a seriesFingerprint is never auto-resolved here —
@@ -100,6 +114,8 @@ export default class MonitorIncident {
100
114
 
101
115
  // check if should close the incident.
102
116
 
117
+ const resolvedIncidentIds: Set<string> = new Set<string>();
118
+
103
119
  for (const openIncident of openIncidents) {
104
120
  const shouldClose: boolean = this.shouldCloseIncident({
105
121
  openIncident,
@@ -107,10 +123,14 @@ export default class MonitorIncident {
107
123
  input.autoResolveCriteriaInstanceIdIncidentIdsDictionary,
108
124
  criteriaInstance: input.criteriaInstance,
109
125
  breachingSeriesFingerprints: input.breachingSeriesFingerprints,
126
+ breachingSeriesFingerprintsByCriteriaId:
127
+ input.breachingSeriesFingerprintsByCriteriaId,
110
128
  disableSeriesAbsenceResolution: input.disableSeriesAbsenceResolution,
111
129
  });
112
130
 
113
131
  if (shouldClose) {
132
+ resolvedIncidentIds.add(openIncident.id!.toString());
133
+
114
134
  // then resolve incident.
115
135
  await this.resolveOpenIncident({
116
136
  openIncident: openIncident,
@@ -133,7 +153,20 @@ export default class MonitorIncident {
133
153
  }
134
154
  }
135
155
 
136
- return openIncidents;
156
+ /*
157
+ * Return the incidents still open AFTER this pass. The create path
158
+ * dedupes against this list, and an incident this pass just resolved
159
+ * must not count as "already active" — that combination resolved a
160
+ * stale whole-monitor incident and then refused to create the
161
+ * per-series incidents meant to replace it.
162
+ */
163
+ if (resolvedIncidentIds.size === 0) {
164
+ return openIncidents;
165
+ }
166
+
167
+ return openIncidents.filter((openIncident: Incident) => {
168
+ return !resolvedIncidentIds.has(openIncident.id!.toString());
169
+ });
137
170
  }
138
171
 
139
172
  /**
@@ -264,6 +297,26 @@ export default class MonitorIncident {
264
297
  * reference `{{host.name}}` etc. via the template engine.
265
298
  */
266
299
  matchesPerSeries?: Array<PerSeriesCriteriaMatch> | undefined;
300
+ /**
301
+ * The still-open incidents, when the caller has already run the
302
+ * resolve pass itself.
303
+ *
304
+ * A single evaluation can fan out across several matching criteria
305
+ * (host A critical while host B is only warning). The resolve pass
306
+ * has to run exactly once, with every criteria's breaching set in
307
+ * hand — running it once per criteria would let each criteria
308
+ * absence-resolve the others' incidents. So MonitorResource runs it
309
+ * up front and hands the survivors here.
310
+ */
311
+ openIncidents?: Array<Incident> | undefined;
312
+ /**
313
+ * Per-criteria breaching fingerprints, forwarded to the resolve pass
314
+ * when this method runs it itself. See
315
+ * checkOpenIncidentsAndCloseIfResolved.
316
+ */
317
+ breachingSeriesFingerprintsByCriteriaId?:
318
+ | Dictionary<Set<string>>
319
+ | undefined;
267
320
  /**
268
321
  * Series fingerprints whose underlying resource (host, docker host,
269
322
  * kubernetes cluster, or service) is inside an ongoing scheduled
@@ -318,22 +371,45 @@ export default class MonitorIncident {
318
371
 
319
372
  // check active incidents and if there are open incidents, do not cretae anothr incident.
320
373
  const openIncidents: Array<Incident> =
321
- await this.checkOpenIncidentsAndCloseIfResolved({
322
- monitorId: input.monitor.id!,
323
- autoResolveCriteriaInstanceIdIncidentIdsDictionary:
324
- input.autoResolveCriteriaInstanceIdIncidentIdsDictionary,
325
- rootCause: input.rootCause,
326
- criteriaInstance: input.criteriaInstance,
327
- dataToProcess: input.dataToProcess,
328
- evaluationSummary: input.evaluationSummary,
329
- breachingSeriesFingerprints,
330
- disableSeriesAbsenceResolution: input.disableSeriesAbsenceResolution,
331
- });
374
+ input.openIncidents !== undefined
375
+ ? input.openIncidents
376
+ : await this.checkOpenIncidentsAndCloseIfResolved({
377
+ monitorId: input.monitor.id!,
378
+ autoResolveCriteriaInstanceIdIncidentIdsDictionary:
379
+ input.autoResolveCriteriaInstanceIdIncidentIdsDictionary,
380
+ rootCause: input.rootCause,
381
+ criteriaInstance: input.criteriaInstance,
382
+ dataToProcess: input.dataToProcess,
383
+ evaluationSummary: input.evaluationSummary,
384
+ breachingSeriesFingerprints,
385
+ breachingSeriesFingerprintsByCriteriaId:
386
+ input.breachingSeriesFingerprintsByCriteriaId,
387
+ disableSeriesAbsenceResolution:
388
+ input.disableSeriesAbsenceResolution,
389
+ });
332
390
 
333
391
  if (!input.criteriaInstance.data?.createIncidents) {
334
392
  return;
335
393
  }
336
394
 
395
+ /*
396
+ * Checked once, up front. It used to be tested deep inside the
397
+ * template x series loops with a `return`, which on a grouped
398
+ * monitor abandoned every series after the first.
399
+ */
400
+ if (DisableAutomaticIncidentCreation) {
401
+ input.evaluationSummary?.events.push({
402
+ type: "incident-skipped",
403
+ title: "Incident creation skipped",
404
+ message:
405
+ "Automatic incident creation is disabled by environment configuration.",
406
+ relatedCriteriaId: input.criteriaInstance.data?.id,
407
+ at: OneUptimeDate.getCurrentDate(),
408
+ });
409
+
410
+ return;
411
+ }
412
+
337
413
  /*
338
414
  * Alert-dependency suppression: a parent monitor is in a suppressing
339
415
  * status (offline by default), so skip creating any incident for this
@@ -406,434 +482,455 @@ export default class MonitorIncident {
406
482
  for (const criteriaIncident of input.criteriaInstance.data?.incidents ||
407
483
  []) {
408
484
  for (const seriesMatch of seriesToProcess) {
409
- const seriesFingerprint: string | undefined = seriesMatch?.fingerprint;
410
- const seriesLabels: JSONObject | undefined = seriesMatch?.labels;
411
- const seriesRootCause: string =
412
- seriesMatch?.rootCause || input.rootCause;
413
-
414
- /*
415
- * Per-series scheduled-maintenance suppression: this series'
416
- * resource is inside an ongoing maintenance window, so skip
417
- * creating an incident for it. Other series on the same monitor
418
- * whose resources are not under maintenance still get incidents.
419
- * Note: we only suppress *new* creation — any incident already
420
- * open for this series is left to the normal resolve path
421
- * (checkOpenIncidentsAndCloseIfResolved still sees the full
422
- * breaching set), so a real incident raised before maintenance
423
- * is not silently closed.
424
- */
425
- if (
426
- seriesFingerprint &&
427
- input.suppressedSeriesFingerprints?.has(seriesFingerprint)
428
- ) {
429
- logger.debug(
430
- `${input.monitor.id?.toString()} - Skipping incident for series ${seriesFingerprint}: its resource is under an active scheduled maintenance window.`,
431
- incidentLogAttributes,
432
- );
433
-
434
- input.evaluationSummary?.events.push({
435
- type: "incident-skipped",
436
- title: "Incident suppressed by scheduled maintenance",
437
- message:
438
- "Skipped creating an incident because the resource for this series is under an active scheduled maintenance window.",
439
- relatedCriteriaId: input.criteriaInstance.data?.id,
440
- at: OneUptimeDate.getCurrentDate(),
441
- });
442
- continue;
443
- }
485
+ try {
486
+ const seriesFingerprint: string | undefined =
487
+ seriesMatch?.fingerprint;
488
+ const seriesLabels: JSONObject | undefined = seriesMatch?.labels;
489
+ const seriesRootCause: string =
490
+ seriesMatch?.rootCause || input.rootCause;
444
491
 
445
- /*
446
- * Dedupe match must mirror the create path below (which sets
447
- * `createdCriteriaId` / `createdIncidentTemplateId` only when the
448
- * corresponding id is present). A criteria incident template can be
449
- * missing its `id` (legacy/API-authored criteria), so guard the
450
- * `.toString()` with `?.` an unguarded call previously threw
451
- * "Cannot read properties of undefined (reading 'toString')" here and
452
- * failed the probe/telemetry queue job on every cycle for the affected
453
- * monitor. Normalise both sides to `undefined` on missing so a created
454
- * incident (whose template id was left NULL) still matches itself next
455
- * cycle instead of being recreated as a duplicate.
456
- */
457
- const alreadyOpenIncident: Incident | undefined = openIncidents.find(
458
- (incident: Incident) => {
459
- return (
460
- (incident.createdCriteriaId || undefined) ===
461
- (input.criteriaInstance.data?.id?.toString() || undefined) &&
462
- (incident.createdIncidentTemplateId || undefined) ===
463
- (criteriaIncident.id?.toString() || undefined) &&
464
- (incident.seriesFingerprint || undefined) === seriesFingerprint
492
+ /*
493
+ * Per-series scheduled-maintenance suppression: this series'
494
+ * resource is inside an ongoing maintenance window, so skip
495
+ * creating an incident for it. Other series on the same monitor
496
+ * whose resources are not under maintenance still get incidents.
497
+ * Note: we only suppress *new* creation any incident already
498
+ * open for this series is left to the normal resolve path
499
+ * (checkOpenIncidentsAndCloseIfResolved still sees the full
500
+ * breaching set), so a real incident raised before maintenance
501
+ * is not silently closed.
502
+ */
503
+ if (
504
+ seriesFingerprint &&
505
+ input.suppressedSeriesFingerprints?.has(seriesFingerprint)
506
+ ) {
507
+ logger.debug(
508
+ `${input.monitor.id?.toString()} - Skipping incident for series ${seriesFingerprint}: its resource is under an active scheduled maintenance window.`,
509
+ incidentLogAttributes,
465
510
  );
466
- },
467
- );
468
-
469
- const hasAlreadyOpenIncident: boolean = Boolean(alreadyOpenIncident);
470
511
 
471
- logger.debug(
472
- `${input.monitor.id?.toString()} - Open Incident ${alreadyOpenIncident?.id?.toString()}`,
473
- incidentLogAttributes,
474
- );
475
-
476
- logger.debug(
477
- `${input.monitor.id?.toString()} - Has open incident ${hasAlreadyOpenIncident}`,
478
- incidentLogAttributes,
479
- );
512
+ input.evaluationSummary?.events.push({
513
+ type: "incident-skipped",
514
+ title: "Incident suppressed by scheduled maintenance",
515
+ message:
516
+ "Skipped creating an incident because the resource for this series is under an active scheduled maintenance window.",
517
+ relatedCriteriaId: input.criteriaInstance.data?.id,
518
+ at: OneUptimeDate.getCurrentDate(),
519
+ });
520
+ continue;
521
+ }
480
522
 
481
- if (hasAlreadyOpenIncident) {
482
523
  /*
483
- * Use the open incident's already-rendered title when
484
- * available the template (`criteriaIncident.title`) still
485
- * contains unresolved `{{…}}` placeholders because it's the
486
- * criterion's template string, not the instance's rendered
487
- * output. Falling back to the template only when the open
488
- * incident somehow has no title.
524
+ * Dedupe match must mirror the create path below (which sets
525
+ * `createdCriteriaId` / `createdIncidentTemplateId` only when the
526
+ * corresponding id is present). A criteria incident template can be
527
+ * missing its `id` (legacy/API-authored criteria), so guard the
528
+ * `.toString()` with `?.` an unguarded call previously threw
529
+ * "Cannot read properties of undefined (reading 'toString')" here and
530
+ * failed the probe/telemetry queue job on every cycle for the affected
531
+ * monitor. Normalise both sides to `undefined` on missing so a created
532
+ * incident (whose template id was left NULL) still matches itself next
533
+ * cycle instead of being recreated as a duplicate.
489
534
  */
490
- const renderedTitle: string =
491
- alreadyOpenIncident?.title || criteriaIncident.title;
492
-
493
- input.evaluationSummary?.events.push({
494
- type: "incident-skipped",
495
- title: `Incident already active: ${renderedTitle}`,
496
- message:
497
- "Skipped creating a new incident because an active incident exists for this criteria.",
498
- relatedCriteriaId: input.criteriaInstance.data?.id,
499
- relatedIncidentId: alreadyOpenIncident?.id?.toString(),
500
- relatedIncidentNumber: alreadyOpenIncident?.incidentNumber,
501
- relatedIncidentNumberWithPrefix:
502
- alreadyOpenIncident?.incidentNumberWithPrefix,
503
- at: OneUptimeDate.getCurrentDate(),
504
- });
505
- continue;
506
- }
507
-
508
- logger.debug(
509
- `${input.monitor.id?.toString()} - Create incident.`,
510
- incidentLogAttributes,
511
- );
512
-
513
- const incident: Incident = new Incident();
514
- const storageMap: JSONObject =
515
- MonitorTemplateUtil.buildTemplateStorageMap({
516
- monitorType: input.monitor.monitorType!,
517
- dataToProcess: input.dataToProcess,
518
- monitor: input.monitor,
519
- seriesLabels,
520
- });
521
-
522
- incident.title = MonitorTemplateUtil.processTemplateString({
523
- value: criteriaIncident.title,
524
- storageMap,
525
- });
526
- incident.description = MonitorTemplateUtil.processTemplateString({
527
- value: criteriaIncident.description,
528
- storageMap,
529
- });
535
+ const alreadyOpenIncident: Incident | undefined = openIncidents.find(
536
+ (incident: Incident) => {
537
+ return (
538
+ (incident.createdCriteriaId || undefined) ===
539
+ (input.criteriaInstance.data?.id?.toString() || undefined) &&
540
+ (incident.createdIncidentTemplateId || undefined) ===
541
+ (criteriaIncident.id?.toString() || undefined) &&
542
+ (incident.seriesFingerprint || undefined) === seriesFingerprint
543
+ );
544
+ },
545
+ );
530
546
 
531
- /*
532
- * Resolve the incident severity. `criteriaIncident.incidentSeverityId`
533
- * can be a truthy-but-EMPTY ObjectID (id === "") — a stored
534
- * `{"_type":"ObjectID","value":""}` deserializes to `new ObjectID("")`,
535
- * which is an object so `!incidentSeverityId` is false. That empty id
536
- * serializes to "" for the `uuid` (not-null) column and lands as NULL,
537
- * throwing 23502 inside the probe-ingest worker and retrying forever.
538
- * Use `?.toString()` truthiness so an empty/blank ObjectID is treated
539
- * the same as "missing" and falls through to the project-default lookup.
540
- */
541
- /*
542
- * A criteria severity that belongs to *another* project is rejected by
543
- * IncidentService on create. Throwing here would fail the whole
544
- * probe/telemetry ingest job for this monitor — no incident, and no
545
- * payload or monitor log persisted either, because those run after the
546
- * create. Treat it as "missing" and fall back to this project's own
547
- * default, which is also what stops the bad id spreading onto new
548
- * incidents. monitorSteps can still hold one: the 1785240000000
549
- * repair skipped ids it could not resolve.
550
- */
551
- const isCriteriaSeverityUsable: boolean =
552
- await ProjectScopedReferenceValidator.isUsableInProject({
553
- projectId: input.monitor.projectId!,
554
- id: criteriaIncident.incidentSeverityId,
555
- service: IncidentSeverityService,
556
- });
547
+ const hasAlreadyOpenIncident: boolean = Boolean(alreadyOpenIncident);
557
548
 
558
- if (
559
- criteriaIncident.incidentSeverityId?.toString() &&
560
- !isCriteriaSeverityUsable
561
- ) {
562
- logger.error(
563
- `${input.monitor.id?.toString()} - Criteria "${
564
- input.criteriaInstance.data?.name
565
- }" references incident severity ${criteriaIncident.incidentSeverityId.toString()}, which does not belong to project ${input.monitor.projectId?.toString()}. Falling back to this project's default severity.`,
549
+ logger.debug(
550
+ `${input.monitor.id?.toString()} - Open Incident ${alreadyOpenIncident?.id?.toString()}`,
551
+ incidentLogAttributes,
566
552
  );
567
- }
568
553
 
569
- if (!isCriteriaSeverityUsable) {
570
- // pick the critical (first/lowest-order root) severity.
571
-
572
- const severity: IncidentSeverity | null =
573
- await IncidentSeverityService.findOneBy({
574
- query: {
575
- projectId: input.monitor.projectId!,
576
- },
577
- sort: {
578
- order: SortOrder.Ascending,
579
- },
580
- props: {
581
- isRoot: true,
582
- },
583
- select: {
584
- _id: true,
585
- },
586
- });
554
+ logger.debug(
555
+ `${input.monitor.id?.toString()} - Has open incident ${hasAlreadyOpenIncident}`,
556
+ incidentLogAttributes,
557
+ );
587
558
 
588
- if (!severity?.id?.toString()) {
559
+ if (hasAlreadyOpenIncident) {
589
560
  /*
590
- * The project has no incident severity configured. Throwing here
591
- * would fail the entire probe/telemetry ingest job, which then
592
- * retries forever for a misconfiguration the worker cannot fix.
593
- * Skip incident creation gracefully and log instead.
561
+ * Use the open incident's already-rendered title when
562
+ * available the template (`criteriaIncident.title`) still
563
+ * contains unresolved `{{…}}` placeholders because it's the
564
+ * criterion's template string, not the instance's rendered
565
+ * output. Falling back to the template only when the open
566
+ * incident somehow has no title.
594
567
  */
595
- logger.error(
596
- `${input.monitor.id?.toString()} - Cannot create incident: project ${input.monitor.projectId?.toString()} has no incident severity configured. Skipping incident creation for criteria "${
597
- input.criteriaInstance.data?.name
598
- }".`,
599
- );
568
+ const renderedTitle: string =
569
+ alreadyOpenIncident?.title || criteriaIncident.title;
600
570
 
601
571
  input.evaluationSummary?.events.push({
602
572
  type: "incident-skipped",
603
- title: "Incident creation skipped",
573
+ title: `Incident already active: ${renderedTitle}`,
604
574
  message:
605
- "Skipped creating an incident because the project has no incident severity configured.",
575
+ "Skipped creating a new incident because an active incident exists for this criteria.",
606
576
  relatedCriteriaId: input.criteriaInstance.data?.id,
577
+ relatedIncidentId: alreadyOpenIncident?.id?.toString(),
578
+ relatedIncidentNumber: alreadyOpenIncident?.incidentNumber,
579
+ relatedIncidentNumberWithPrefix:
580
+ alreadyOpenIncident?.incidentNumberWithPrefix,
607
581
  at: OneUptimeDate.getCurrentDate(),
608
582
  });
609
583
  continue;
610
584
  }
611
585
 
612
- incident.incidentSeverityId = severity.id!;
613
- } else {
614
- incident.incidentSeverityId = criteriaIncident.incidentSeverityId!;
615
- }
586
+ logger.debug(
587
+ `${input.monitor.id?.toString()} - Create incident.`,
588
+ incidentLogAttributes,
589
+ );
616
590
 
617
- incident.monitors = [input.monitor];
618
- incident.projectId = input.monitor.projectId!;
619
- incident.rootCause = seriesRootCause;
620
- incident.createdStateLog = JSON.parse(
621
- JSON.stringify(input.dataToProcess, null, 2),
622
- );
591
+ const incident: Incident = new Incident();
592
+ const storageMap: JSONObject =
593
+ MonitorTemplateUtil.buildTemplateStorageMap({
594
+ monitorType: input.monitor.monitorType!,
595
+ dataToProcess: input.dataToProcess,
596
+ monitor: input.monitor,
597
+ seriesLabels,
598
+ });
623
599
 
624
- /*
625
- * Same capture on every incident this evaluation opens - they all
626
- * came from the one check.
627
- */
628
- const serializedMonitorSummary: JSONObject | null =
629
- MonitorSummarySnapshotUtil.serialize(input.monitorSummary);
600
+ incident.title = MonitorTemplateUtil.processTemplateString({
601
+ value: criteriaIncident.title,
602
+ storageMap,
603
+ });
604
+ incident.description = MonitorTemplateUtil.processTemplateString({
605
+ value: criteriaIncident.description,
606
+ storageMap,
607
+ });
630
608
 
631
- if (serializedMonitorSummary) {
632
- incident.monitorSummary = serializedMonitorSummary;
633
- }
609
+ /*
610
+ * Resolve the incident severity. `criteriaIncident.incidentSeverityId`
611
+ * can be a truthy-but-EMPTY ObjectID (id === "") — a stored
612
+ * `{"_type":"ObjectID","value":""}` deserializes to `new ObjectID("")`,
613
+ * which is an object so `!incidentSeverityId` is false. That empty id
614
+ * serializes to "" for the `uuid` (not-null) column and lands as NULL,
615
+ * throwing 23502 inside the probe-ingest worker and retrying forever.
616
+ * Use `?.toString()` truthiness so an empty/blank ObjectID is treated
617
+ * the same as "missing" and falls through to the project-default lookup.
618
+ */
619
+ /*
620
+ * A criteria severity that belongs to *another* project is rejected by
621
+ * IncidentService on create. Throwing here would fail the whole
622
+ * probe/telemetry ingest job for this monitor — no incident, and no
623
+ * payload or monitor log persisted either, because those run after the
624
+ * create. Treat it as "missing" and fall back to this project's own
625
+ * default, which is also what stops the bad id spreading onto new
626
+ * incidents. monitorSteps can still hold one: the 1785240000000
627
+ * repair skipped ids it could not resolve.
628
+ */
629
+ const isCriteriaSeverityUsable: boolean =
630
+ await ProjectScopedReferenceValidator.isUsableInProject({
631
+ projectId: input.monitor.projectId!,
632
+ id: criteriaIncident.incidentSeverityId,
633
+ service: IncidentSeverityService,
634
+ });
634
635
 
635
- /*
636
- * Guard against missing ids — these are optional reference fields and
637
- * must not crash incident creation (which runs inside the probe /
638
- * telemetry queue workers). A missing id previously threw
639
- * "Cannot read properties of undefined (reading 'toString')" and failed
640
- * the job on every cycle for the affected monitor.
641
- */
642
- if (input.criteriaInstance.data?.id) {
643
- incident.createdCriteriaId =
644
- input.criteriaInstance.data.id.toString();
645
- }
636
+ if (
637
+ criteriaIncident.incidentSeverityId?.toString() &&
638
+ !isCriteriaSeverityUsable
639
+ ) {
640
+ logger.error(
641
+ `${input.monitor.id?.toString()} - Criteria "${
642
+ input.criteriaInstance.data?.name
643
+ }" references incident severity ${criteriaIncident.incidentSeverityId.toString()}, which does not belong to project ${input.monitor.projectId?.toString()}. Falling back to this project's default severity.`,
644
+ );
645
+ }
646
646
 
647
- if (criteriaIncident.id) {
648
- incident.createdIncidentTemplateId = criteriaIncident.id.toString();
649
- }
647
+ if (!isCriteriaSeverityUsable) {
648
+ // pick the critical (first/lowest-order root) severity.
649
+
650
+ const severity: IncidentSeverity | null =
651
+ await IncidentSeverityService.findOneBy({
652
+ query: {
653
+ projectId: input.monitor.projectId!,
654
+ },
655
+ sort: {
656
+ order: SortOrder.Ascending,
657
+ },
658
+ props: {
659
+ isRoot: true,
660
+ },
661
+ select: {
662
+ _id: true,
663
+ },
664
+ });
665
+
666
+ if (!severity?.id?.toString()) {
667
+ /*
668
+ * The project has no incident severity configured. Throwing here
669
+ * would fail the entire probe/telemetry ingest job, which then
670
+ * retries forever for a misconfiguration the worker cannot fix.
671
+ * Skip incident creation gracefully and log instead.
672
+ */
673
+ logger.error(
674
+ `${input.monitor.id?.toString()} - Cannot create incident: project ${input.monitor.projectId?.toString()} has no incident severity configured. Skipping incident creation for criteria "${
675
+ input.criteriaInstance.data?.name
676
+ }".`,
677
+ );
650
678
 
651
- if (seriesFingerprint) {
652
- incident.seriesFingerprint = seriesFingerprint;
653
- }
654
- if (seriesLabels && Object.keys(seriesLabels).length > 0) {
655
- incident.seriesLabels = seriesLabels;
679
+ input.evaluationSummary?.events.push({
680
+ type: "incident-skipped",
681
+ title: "Incident creation skipped",
682
+ message:
683
+ "Skipped creating an incident because the project has no incident severity configured.",
684
+ relatedCriteriaId: input.criteriaInstance.data?.id,
685
+ at: OneUptimeDate.getCurrentDate(),
686
+ });
687
+ continue;
688
+ }
656
689
 
657
- await SeriesResourceLinker.linkSeriesResourcesToModel({
658
- model: incident,
659
- seriesLabels,
660
- projectId: input.monitor.projectId!,
661
- monitorType: input.monitor.monitorType,
662
- });
663
- }
690
+ incident.incidentSeverityId = severity.id!;
691
+ } else {
692
+ incident.incidentSeverityId = criteriaIncident.incidentSeverityId!;
693
+ }
664
694
 
665
- /*
666
- * Deterministic resource link from the monitor's step config
667
- * (resolved once above). Runs for both grouped and ungrouped
668
- * incidents and merges with anything the series-label path
669
- * resolved, so the per-resource Activity tabs always see
670
- * monitor-created incidents.
671
- */
672
- SeriesResourceLinker.attachResolvedResources({
673
- model: incident,
674
- resolved: resourceContext,
675
- });
695
+ incident.monitors = [input.monitor];
696
+ incident.projectId = input.monitor.projectId!;
697
+ incident.rootCause = seriesRootCause;
698
+ incident.createdStateLog = JSON.parse(
699
+ JSON.stringify(input.dataToProcess, null, 2),
700
+ );
676
701
 
677
- incident.onCallDutyPolicies =
678
- criteriaIncident.onCallPolicyIds?.map((id: ObjectID) => {
679
- const onCallPolicy: OnCallDutyPolicy = new OnCallDutyPolicy();
680
- onCallPolicy._id = id.toString();
681
- return onCallPolicy;
682
- }) || [];
683
-
684
- // Set labels from criteria
685
- incident.labels =
686
- criteriaIncident.labelIds?.map((id: ObjectID) => {
687
- const label: Label = new Label();
688
- label._id = id.toString();
689
- return label;
690
- }) || [];
691
-
692
- incident.isCreatedAutomatically = true;
693
-
694
- // Set status page visibility (defaults to true if not specified)
695
- if (criteriaIncident.showIncidentOnStatusPage !== undefined) {
696
- incident.isVisibleOnStatusPage =
697
- criteriaIncident.showIncidentOnStatusPage;
698
- }
702
+ /*
703
+ * Same capture on every incident this evaluation opens - they all
704
+ * came from the one check.
705
+ */
706
+ const serializedMonitorSummary: JSONObject | null =
707
+ MonitorSummarySnapshotUtil.serialize(input.monitorSummary);
699
708
 
700
- if (criteriaIncident.isPrivate === true) {
701
- incident.isPrivate = true;
702
- }
709
+ if (serializedMonitorSummary) {
710
+ incident.monitorSummary = serializedMonitorSummary;
711
+ }
703
712
 
704
- if (input.props.telemetryQuery) {
705
- incident.telemetryQuery = input.props.telemetryQuery;
706
- }
713
+ /*
714
+ * Guard against missing ids — these are optional reference fields and
715
+ * must not crash incident creation (which runs inside the probe /
716
+ * telemetry queue workers). A missing id previously threw
717
+ * "Cannot read properties of undefined (reading 'toString')" and failed
718
+ * the job on every cycle for the affected monitor.
719
+ */
720
+ if (input.criteriaInstance.data?.id) {
721
+ incident.createdCriteriaId =
722
+ input.criteriaInstance.data.id.toString();
723
+ }
707
724
 
708
- if (
709
- input.dataToProcess &&
710
- (input.dataToProcess as ProbeMonitorResponse).probeId
711
- ) {
712
- incident.createdByProbeId = (
713
- input.dataToProcess as ProbeMonitorResponse
714
- ).probeId;
715
- }
725
+ if (criteriaIncident.id) {
726
+ incident.createdIncidentTemplateId = criteriaIncident.id.toString();
727
+ }
716
728
 
717
- if (criteriaIncident.remediationNotes) {
718
- incident.remediationNotes = MonitorTemplateUtil.processTemplateString(
719
- {
720
- value: criteriaIncident.remediationNotes,
721
- storageMap,
722
- },
723
- );
724
- }
729
+ if (seriesFingerprint) {
730
+ incident.seriesFingerprint = seriesFingerprint;
731
+ }
732
+ if (seriesLabels && Object.keys(seriesLabels).length > 0) {
733
+ incident.seriesLabels = seriesLabels;
734
+
735
+ await SeriesResourceLinker.linkSeriesResourcesToModel({
736
+ model: incident,
737
+ seriesLabels,
738
+ projectId: input.monitor.projectId!,
739
+ monitorType: input.monitor.monitorType,
740
+ });
741
+ }
725
742
 
726
- if (DisableAutomaticIncidentCreation) {
727
- input.evaluationSummary?.events.push({
728
- type: "incident-skipped",
729
- title: "Incident creation skipped",
730
- message:
731
- "Automatic incident creation is disabled by environment configuration.",
732
- relatedCriteriaId: input.criteriaInstance.data?.id,
733
- at: OneUptimeDate.getCurrentDate(),
743
+ /*
744
+ * Deterministic resource link from the monitor's step config
745
+ * (resolved once above). Runs for both grouped and ungrouped
746
+ * incidents and merges with anything the series-label path
747
+ * resolved, so the per-resource Activity tabs always see
748
+ * monitor-created incidents.
749
+ */
750
+ SeriesResourceLinker.attachResolvedResources({
751
+ model: incident,
752
+ resolved: resourceContext,
734
753
  });
735
- return;
736
- }
737
754
 
738
- const createdIncident: Incident = await IncidentService.create({
739
- data: incident,
740
- props: {
741
- isRoot: true,
742
- },
743
- });
755
+ incident.onCallDutyPolicies =
756
+ criteriaIncident.onCallPolicyIds?.map((id: ObjectID) => {
757
+ const onCallPolicy: OnCallDutyPolicy = new OnCallDutyPolicy();
758
+ onCallPolicy._id = id.toString();
759
+ return onCallPolicy;
760
+ }) || [];
761
+
762
+ // Set labels from criteria
763
+ incident.labels =
764
+ criteriaIncident.labelIds?.map((id: ObjectID) => {
765
+ const label: Label = new Label();
766
+ label._id = id.toString();
767
+ return label;
768
+ }) || [];
769
+
770
+ incident.isCreatedAutomatically = true;
771
+
772
+ // Set status page visibility (defaults to true if not specified)
773
+ if (criteriaIncident.showIncidentOnStatusPage !== undefined) {
774
+ incident.isVisibleOnStatusPage =
775
+ criteriaIncident.showIncidentOnStatusPage;
776
+ }
744
777
 
745
- /*
746
- * Add owner teams and users after incident creation. Owners
747
- * configured on the criteria template are merged (deduped) with the
748
- * owners of the network device this monitor watches, so device
749
- * ownership flows into the incidents its monitor raises.
750
- */
751
- if (networkDeviceOwners === null) {
752
- networkDeviceOwners =
753
- await NetworkDeviceOwnerUserService.getDeviceOwnersForMonitor({
754
- monitor: input.monitor,
755
- monitorStepId: (
756
- input.dataToProcess as ProbeMonitorResponse
757
- ).monitorStepId?.toString(),
758
- });
759
- }
778
+ if (criteriaIncident.isPrivate === true) {
779
+ incident.isPrivate = true;
780
+ }
760
781
 
761
- const ownerUserIds: Array<ObjectID> = this.mergeOwnerIds(
762
- criteriaIncident.ownerUserIds || [],
763
- networkDeviceOwners.ownerUserIds,
764
- );
782
+ if (input.props.telemetryQuery) {
783
+ incident.telemetryQuery = input.props.telemetryQuery;
784
+ }
765
785
 
766
- const ownerTeamIds: Array<ObjectID> = this.mergeOwnerIds(
767
- criteriaIncident.ownerTeamIds || [],
768
- networkDeviceOwners.ownerTeamIds,
769
- );
786
+ if (
787
+ input.dataToProcess &&
788
+ (input.dataToProcess as ProbeMonitorResponse).probeId
789
+ ) {
790
+ incident.createdByProbeId = (
791
+ input.dataToProcess as ProbeMonitorResponse
792
+ ).probeId;
793
+ }
794
+
795
+ if (criteriaIncident.remediationNotes) {
796
+ incident.remediationNotes =
797
+ MonitorTemplateUtil.processTemplateString({
798
+ value: criteriaIncident.remediationNotes,
799
+ storageMap,
800
+ });
801
+ }
770
802
 
771
- if (ownerTeamIds.length || ownerUserIds.length) {
772
- await IncidentService.addOwners(
773
- input.monitor.projectId!,
774
- createdIncident.id!,
775
- ownerUserIds,
776
- ownerTeamIds,
777
- true, // notify owners
778
- {
803
+ const createdIncident: Incident = await IncidentService.create({
804
+ data: incident,
805
+ props: {
779
806
  isRoot: true,
780
807
  },
808
+ });
809
+
810
+ /*
811
+ * Add owner teams and users after incident creation. Owners
812
+ * configured on the criteria template are merged (deduped) with the
813
+ * owners of the network device this monitor watches, so device
814
+ * ownership flows into the incidents its monitor raises.
815
+ */
816
+ if (networkDeviceOwners === null) {
817
+ networkDeviceOwners =
818
+ await NetworkDeviceOwnerUserService.getDeviceOwnersForMonitor({
819
+ monitor: input.monitor,
820
+ monitorStepId: (
821
+ input.dataToProcess as ProbeMonitorResponse
822
+ ).monitorStepId?.toString(),
823
+ });
824
+ }
825
+
826
+ const ownerUserIds: Array<ObjectID> = this.mergeOwnerIds(
827
+ criteriaIncident.ownerUserIds || [],
828
+ networkDeviceOwners.ownerUserIds,
781
829
  );
782
- }
783
830
 
784
- // Add incident member role assignments after incident creation
785
- if (
786
- criteriaIncident.incidentMemberRoles &&
787
- criteriaIncident.incidentMemberRoles.length > 0
788
- ) {
789
- for (const roleAssignment of criteriaIncident.incidentMemberRoles) {
790
- try {
791
- const assignment: IncidentMemberRoleAssignment =
792
- roleAssignment as IncidentMemberRoleAssignment;
793
-
794
- if (assignment.roleId && assignment.userId) {
795
- const incidentMember: IncidentMember = new IncidentMember();
796
- incidentMember.incidentId = createdIncident.id!;
797
- incidentMember.projectId = input.monitor.projectId!;
798
- incidentMember.userId = new ObjectID(
799
- assignment.userId.toString(),
800
- );
801
- incidentMember.incidentRoleId = new ObjectID(
802
- assignment.roleId.toString(),
803
- );
831
+ const ownerTeamIds: Array<ObjectID> = this.mergeOwnerIds(
832
+ criteriaIncident.ownerTeamIds || [],
833
+ networkDeviceOwners.ownerTeamIds,
834
+ );
804
835
 
805
- await IncidentMemberService.create({
806
- data: incidentMember,
807
- props: {
808
- isRoot: true,
809
- },
810
- });
836
+ if (ownerTeamIds.length || ownerUserIds.length) {
837
+ await IncidentService.addOwners(
838
+ input.monitor.projectId!,
839
+ createdIncident.id!,
840
+ ownerUserIds,
841
+ ownerTeamIds,
842
+ true, // notify owners
843
+ {
844
+ isRoot: true,
845
+ },
846
+ );
847
+ }
811
848
 
812
- logger.debug(
813
- `${input.monitor.id?.toString()} - Assigned incident member role ${assignment.roleId.toString()} to user ${assignment.userId.toString()}`,
849
+ // Add incident member role assignments after incident creation
850
+ if (
851
+ criteriaIncident.incidentMemberRoles &&
852
+ criteriaIncident.incidentMemberRoles.length > 0
853
+ ) {
854
+ for (const roleAssignment of criteriaIncident.incidentMemberRoles) {
855
+ try {
856
+ const assignment: IncidentMemberRoleAssignment =
857
+ roleAssignment as IncidentMemberRoleAssignment;
858
+
859
+ if (assignment.roleId && assignment.userId) {
860
+ const incidentMember: IncidentMember = new IncidentMember();
861
+ incidentMember.incidentId = createdIncident.id!;
862
+ incidentMember.projectId = input.monitor.projectId!;
863
+ incidentMember.userId = new ObjectID(
864
+ assignment.userId.toString(),
865
+ );
866
+ incidentMember.incidentRoleId = new ObjectID(
867
+ assignment.roleId.toString(),
868
+ );
869
+
870
+ await IncidentMemberService.create({
871
+ data: incidentMember,
872
+ props: {
873
+ isRoot: true,
874
+ },
875
+ });
876
+
877
+ logger.debug(
878
+ `${input.monitor.id?.toString()} - Assigned incident member role ${assignment.roleId.toString()} to user ${assignment.userId.toString()}`,
879
+ incidentLogAttributes,
880
+ );
881
+ }
882
+ } catch (memberError) {
883
+ logger.error(
884
+ `${input.monitor.id?.toString()} - Failed to assign incident member role: ${memberError}`,
814
885
  incidentLogAttributes,
815
886
  );
816
887
  }
817
- } catch (memberError) {
818
- logger.error(
819
- `${input.monitor.id?.toString()} - Failed to assign incident member role: ${memberError}`,
820
- incidentLogAttributes,
821
- );
822
888
  }
823
889
  }
824
- }
825
890
 
826
- input.evaluationSummary?.events.push({
827
- type: "incident-created",
828
- title: `Incident created: ${createdIncident.title || criteriaIncident.title}`,
829
- message: `Incident triggered from criteria "${input.criteriaInstance.data?.name || "Unnamed criteria"}".`,
830
- relatedCriteriaId: input.criteriaInstance.data?.id,
831
- relatedIncidentId: createdIncident.id?.toString(),
832
- relatedIncidentNumber: createdIncident.incidentNumber,
833
- relatedIncidentNumberWithPrefix:
834
- createdIncident.incidentNumberWithPrefix,
835
- at: OneUptimeDate.getCurrentDate(),
836
- });
891
+ input.evaluationSummary?.events.push({
892
+ type: "incident-created",
893
+ title: `Incident created: ${createdIncident.title || criteriaIncident.title}`,
894
+ message: `Incident triggered from criteria "${input.criteriaInstance.data?.name || "Unnamed criteria"}".`,
895
+ relatedCriteriaId: input.criteriaInstance.data?.id,
896
+ relatedIncidentId: createdIncident.id?.toString(),
897
+ relatedIncidentNumber: createdIncident.incidentNumber,
898
+ relatedIncidentNumberWithPrefix:
899
+ createdIncident.incidentNumberWithPrefix,
900
+ at: OneUptimeDate.getCurrentDate(),
901
+ });
902
+ } catch (err) {
903
+ /*
904
+ * One series must not take the rest of the fleet down with it.
905
+ * Everything in this loop happens per host/container/key and
906
+ * touches the database; an error thrown from here used to
907
+ * propagate out of MonitorResource (which has no catch, only a
908
+ * `finally` that releases the lock) and abandon every series
909
+ * after the failing one, plus the monitor log for the tick.
910
+ */
911
+ logger.error(
912
+ `${input.monitor.id?.toString()} - Failed to create incident${
913
+ seriesMatch?.fingerprint
914
+ ? ` for series ${seriesMatch.fingerprint}`
915
+ : ""
916
+ }.`,
917
+ );
918
+ logger.error(err);
919
+
920
+ input.evaluationSummary?.events.push({
921
+ type: "incident-skipped",
922
+ title: "Incident creation failed",
923
+ message: `Could not create an incident${
924
+ seriesMatch?.fingerprint
925
+ ? ` for series ${seriesMatch.fingerprint}`
926
+ : ""
927
+ }: ${err instanceof Error ? err.message : String(err)}`,
928
+ relatedCriteriaId: input.criteriaInstance.data?.id,
929
+ at: OneUptimeDate.getCurrentDate(),
930
+ });
931
+
932
+ continue;
933
+ }
837
934
  }
838
935
  }
839
936
  }
@@ -929,6 +1026,106 @@ export default class MonitorIncident {
929
1026
  }
930
1027
  }
931
1028
 
1029
+ /**
1030
+ * Is `openIncident`'s series still breaching the criteria that raised
1031
+ * it?
1032
+ *
1033
+ * Prefers the per-criteria dictionary, which answers the question for
1034
+ * the criteria that actually owns this incident. The single-set
1035
+ * fallback only knows the winning criteria's breaches, so it has to
1036
+ * approximate with `createIncidents` — a criteria that creates no
1037
+ * incidents is a recovery criteria whose "matches" are healthy series,
1038
+ * and counting those as breaches would pin an offline incident open
1039
+ * forever.
1040
+ */
1041
+ private static isSeriesStillBreaching(input: {
1042
+ openIncident: Incident;
1043
+ criteriaInstance: MonitorCriteriaInstance | null;
1044
+ openSeriesFingerprint: string;
1045
+ breachingSeriesFingerprints: Set<string>;
1046
+ breachingSeriesFingerprintsByCriteriaId?:
1047
+ | Dictionary<Set<string>>
1048
+ | undefined;
1049
+ }): boolean {
1050
+ const owningCriteriaId: string | undefined =
1051
+ input.openIncident.createdCriteriaId?.toString() || undefined;
1052
+
1053
+ if (input.breachingSeriesFingerprintsByCriteriaId && owningCriteriaId) {
1054
+ return Boolean(
1055
+ input.breachingSeriesFingerprintsByCriteriaId[owningCriteriaId]?.has(
1056
+ input.openSeriesFingerprint,
1057
+ ),
1058
+ );
1059
+ }
1060
+
1061
+ const matchedCriteriaCreatesIncidents: boolean =
1062
+ input.criteriaInstance?.data?.createIncidents === true;
1063
+
1064
+ return (
1065
+ matchedCriteriaCreatesIncidents &&
1066
+ input.breachingSeriesFingerprints.has(input.openSeriesFingerprint)
1067
+ );
1068
+ }
1069
+
1070
+ private static wasCriteriaEvaluated(input: {
1071
+ openIncident: Incident;
1072
+ breachingSeriesFingerprintsByCriteriaId: Dictionary<Set<string>>;
1073
+ }): boolean {
1074
+ const owningCriteriaId: string | undefined =
1075
+ input.openIncident.createdCriteriaId?.toString() || undefined;
1076
+
1077
+ if (!owningCriteriaId) {
1078
+ return true;
1079
+ }
1080
+
1081
+ return (
1082
+ input.breachingSeriesFingerprintsByCriteriaId[owningCriteriaId] !==
1083
+ undefined
1084
+ );
1085
+ }
1086
+
1087
+ /**
1088
+ * Did the criteria that raised this incident opt into auto-resolve for
1089
+ * the template that raised it?
1090
+ *
1091
+ * An incident whose `createdIncidentTemplateId` is missing (legacy or
1092
+ * API-authored criteria whose template carries no id) is matched
1093
+ * against the criteria as a whole. Requiring an exact template id
1094
+ * there meant such an incident could never auto-resolve — and, because
1095
+ * it stayed open, its criteria could never raise a new one either.
1096
+ */
1097
+ private static isAutoResolveConfiguredForIncident(input: {
1098
+ openIncident: Incident;
1099
+ autoResolveCriteriaInstanceIdIncidentIdsDictionary: Dictionary<
1100
+ Array<string>
1101
+ >;
1102
+ }): boolean {
1103
+ const createdCriteriaId: string | undefined =
1104
+ input.openIncident.createdCriteriaId?.toString() || undefined;
1105
+
1106
+ if (!createdCriteriaId) {
1107
+ return false;
1108
+ }
1109
+
1110
+ const autoResolveTemplates: Array<string> | undefined =
1111
+ input.autoResolveCriteriaInstanceIdIncidentIdsDictionary[
1112
+ createdCriteriaId
1113
+ ];
1114
+
1115
+ if (!autoResolveTemplates || autoResolveTemplates.length === 0) {
1116
+ return false;
1117
+ }
1118
+
1119
+ const createdTemplateId: string | undefined =
1120
+ input.openIncident.createdIncidentTemplateId?.toString() || undefined;
1121
+
1122
+ if (!createdTemplateId) {
1123
+ return true;
1124
+ }
1125
+
1126
+ return autoResolveTemplates.includes(createdTemplateId);
1127
+ }
1128
+
932
1129
  private static shouldCloseIncident(input: {
933
1130
  openIncident: Incident;
934
1131
  autoResolveCriteriaInstanceIdIncidentIdsDictionary: Dictionary<
@@ -936,6 +1133,9 @@ export default class MonitorIncident {
936
1133
  >;
937
1134
  criteriaInstance: MonitorCriteriaInstance | null; // null if no criteia met.
938
1135
  breachingSeriesFingerprints?: Set<string> | undefined;
1136
+ breachingSeriesFingerprintsByCriteriaId?:
1137
+ | Dictionary<Set<string>>
1138
+ | undefined;
939
1139
  disableSeriesAbsenceResolution?: boolean | undefined;
940
1140
  }): boolean {
941
1141
  const openSeriesFingerprint: string | undefined =
@@ -956,69 +1156,75 @@ export default class MonitorIncident {
956
1156
  return false;
957
1157
  }
958
1158
 
959
- /*
960
- * Per-series auto-resolve: when the monitor emits a breaching-
961
- * series set and this open incident has a fingerprint, resolve
962
- * whenever the fingerprint is no longer in the set — regardless
963
- * of whether some *other* series is still breaching the same
964
- * criteria. This is the whole point of per-host incidents.
965
- */
966
- if (
967
- input.breachingSeriesFingerprints !== undefined &&
968
- openSeriesFingerprint
969
- ) {
1159
+ // Per-series mode: this evaluation knows which series are breaching.
1160
+ if (input.breachingSeriesFingerprints !== undefined) {
970
1161
  /*
971
- * The breaching set is the matched criteria's per-series matches.
972
- * Only ONE criteria wins per evaluation tick, so on a recovery
973
- * tick the matched criteria is the RECOVERY criteria (e.g.
974
- * Min(iot_device_up) >= 1) and its "matches" are healthy series
975
- * NOT breaches. Treating them as breaching would leave the open
976
- * offline incident's fingerprint in the set and pin it open
977
- * forever once no other series is down. So membership only counts
978
- * as still-breaching when the matched criteria actually creates
979
- * incidents (an offline/breach criteria); a recovery criteria
980
- * (createIncidents=false) contributes no breaches and lets the
981
- * per-series incident auto-resolve.
1162
+ * A whole-monitor incident (no fingerprint) on a monitor that now
1163
+ * raises incidents per series. It was raised before the monitor
1164
+ * was grouped, and nothing can ever dedupe against it again —
1165
+ * every incident from here on carries a fingerprint. Left alone it
1166
+ * stays open forever while its replacements come and go. Resolve
1167
+ * it, on the same auto-resolve terms as any other incident from
1168
+ * its criteria.
982
1169
  */
983
- const matchedCriteriaCreatesIncidents: boolean =
984
- input.criteriaInstance?.data?.createIncidents === true;
985
-
986
- const stillBreaching: boolean =
987
- matchedCriteriaCreatesIncidents &&
988
- input.breachingSeriesFingerprints.has(openSeriesFingerprint);
1170
+ if (!openSeriesFingerprint) {
1171
+ if (input.disableSeriesAbsenceResolution) {
1172
+ return false;
1173
+ }
989
1174
 
990
- if (stillBreaching) {
991
- return false;
1175
+ return MonitorIncident.isAutoResolveConfiguredForIncident({
1176
+ openIncident: input.openIncident,
1177
+ autoResolveCriteriaInstanceIdIncidentIdsDictionary:
1178
+ input.autoResolveCriteriaInstanceIdIncidentIdsDictionary,
1179
+ });
992
1180
  }
993
1181
 
994
1182
  /*
995
- * Series no longer breaching. Only auto-close if the criteria
996
- * was configured to auto-resolve in the first place; otherwise
997
- * stay open so a human can acknowledge.
1183
+ * Per-series auto-resolve: resolve whenever this fingerprint is no
1184
+ * longer breaching the criteria that raised it regardless of
1185
+ * whether some *other* series is still breaching. That is the
1186
+ * whole point of per-host incidents.
998
1187
  */
999
- if (!input.openIncident.createdCriteriaId?.toString()) {
1000
- return false;
1001
- }
1002
-
1003
- if (!input.openIncident.createdIncidentTemplateId?.toString()) {
1188
+ if (
1189
+ MonitorIncident.isSeriesStillBreaching({
1190
+ openIncident: input.openIncident,
1191
+ criteriaInstance: input.criteriaInstance,
1192
+ openSeriesFingerprint,
1193
+ breachingSeriesFingerprints: input.breachingSeriesFingerprints,
1194
+ breachingSeriesFingerprintsByCriteriaId:
1195
+ input.breachingSeriesFingerprintsByCriteriaId,
1196
+ })
1197
+ ) {
1004
1198
  return false;
1005
1199
  }
1006
1200
 
1007
- const autoResolveTemplates: Array<string> | undefined =
1008
- input.autoResolveCriteriaInstanceIdIncidentIdsDictionary[
1009
- input.openIncident.createdCriteriaId.toString()
1010
- ];
1011
-
1201
+ /*
1202
+ * The criteria that raised this incident was not evaluated on this
1203
+ * tick at all (disabled, deleted, or the monitor stops at its
1204
+ * first match). Absence of a breaching set for it is not evidence
1205
+ * of recovery, so leave the incident alone.
1206
+ */
1012
1207
  if (
1013
- autoResolveTemplates &&
1014
- autoResolveTemplates.includes(
1015
- input.openIncident.createdIncidentTemplateId.toString(),
1016
- )
1208
+ input.breachingSeriesFingerprintsByCriteriaId &&
1209
+ !MonitorIncident.wasCriteriaEvaluated({
1210
+ openIncident: input.openIncident,
1211
+ breachingSeriesFingerprintsByCriteriaId:
1212
+ input.breachingSeriesFingerprintsByCriteriaId,
1213
+ })
1017
1214
  ) {
1018
- return true;
1215
+ return false;
1019
1216
  }
1020
1217
 
1021
- return false;
1218
+ /*
1219
+ * Series no longer breaching. Only auto-close if the criteria was
1220
+ * configured to auto-resolve in the first place; otherwise stay
1221
+ * open so a human can acknowledge.
1222
+ */
1223
+ return MonitorIncident.isAutoResolveConfiguredForIncident({
1224
+ openIncident: input.openIncident,
1225
+ autoResolveCriteriaInstanceIdIncidentIdsDictionary:
1226
+ input.autoResolveCriteriaInstanceIdIncidentIdsDictionary,
1227
+ });
1022
1228
  }
1023
1229
 
1024
1230
  if (