@oneuptime/common 13.0.5 → 13.0.6

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 (1091) hide show
  1. package/Models/AnalyticsModels/AuditLog.ts +81 -1
  2. package/Models/AnalyticsModels/SecurityEvent.ts +4 -4
  3. package/Models/DatabaseModels/Alert.ts +62 -0
  4. package/Models/DatabaseModels/GlobalConfig.ts +1 -1
  5. package/Models/DatabaseModels/Incident.ts +66 -0
  6. package/Models/DatabaseModels/IncidentEpisodePublicNote.ts +74 -0
  7. package/Models/DatabaseModels/IncidentPublicNote.ts +74 -0
  8. package/Models/DatabaseModels/Index.ts +6 -4
  9. package/Models/DatabaseModels/NetworkDevice.ts +67 -0
  10. package/Models/DatabaseModels/NetworkDeviceDiagnostic.ts +746 -0
  11. package/Models/DatabaseModels/NetworkDeviceDiscoveryScan.ts +151 -0
  12. package/Models/DatabaseModels/NetworkSiteAssignmentRule.ts +1 -1
  13. package/Models/DatabaseModels/Project.ts +41 -0
  14. package/Models/DatabaseModels/ScheduledMaintenancePublicNote.ts +74 -0
  15. package/Models/DatabaseModels/SecurityEventConnection.ts +11 -11
  16. package/Models/DatabaseModels/ServiceLevelObjective.ts +185 -8
  17. package/Models/DatabaseModels/ServiceLevelObjectiveBurnRateRule.ts +746 -43
  18. package/Models/DatabaseModels/ServiceLevelObjectiveFeed.ts +575 -0
  19. package/Models/DatabaseModels/ServiceLevelObjectiveMonitorRule.ts +582 -0
  20. package/Models/DatabaseModels/ServiceLevelObjectiveOwnerTeam.ts +16 -0
  21. package/Models/DatabaseModels/ServiceLevelObjectiveOwnerUser.ts +16 -0
  22. package/Models/DatabaseModels/StatusPageAnnouncement.ts +75 -0
  23. package/Models/DatabaseModels/ThreatIntelFeed.ts +1 -1
  24. package/Server/API/BaseAPI.ts +17 -0
  25. package/Server/API/BillingInvoiceAPI.ts +343 -30
  26. package/Server/API/BillingPaymentMethodAPI.ts +126 -5
  27. package/Server/API/DashboardAPI.ts +96 -2
  28. package/Server/API/SecurityEventConnectionAPI.ts +141 -11
  29. package/Server/API/StatusPageAPI.ts +308 -199
  30. package/Server/Infrastructure/Postgres/SchemaMigrations/1792800000000-AddNetworkDeviceDiagnostic.ts +83 -0
  31. package/Server/Infrastructure/Postgres/SchemaMigrations/1792900000000-AddNetworkDeviceDnsNameAndShortDeviceNames.ts +36 -0
  32. package/Server/Infrastructure/Postgres/SchemaMigrations/1793000000000-AddNetbiosLookupToNetworkDeviceDiscoveryScan.ts +29 -0
  33. package/Server/Infrastructure/Postgres/SchemaMigrations/1793100000000-SloProductOverhaul.ts +516 -0
  34. package/Server/Infrastructure/Postgres/SchemaMigrations/1793200000000-BackfillSloMonitorRulesAndAffectedResources.ts +98 -0
  35. package/Server/Infrastructure/Postgres/SchemaMigrations/1793300000000-AddDataResidencyToProject.ts +27 -0
  36. package/Server/Infrastructure/Postgres/SchemaMigrations/1793400000000-AddSubscriberUpdateNotificationStatus.ts +97 -0
  37. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +14 -0
  38. package/Server/Services/AlertEpisodeLabelRuleEngineService.ts +138 -67
  39. package/Server/Services/AlertEpisodeOwnerRuleEngineService.ts +213 -84
  40. package/Server/Services/AlertEpisodePrivacyRuleEngineService.ts +112 -35
  41. package/Server/Services/AlertLabelRuleEngineService.ts +299 -217
  42. package/Server/Services/AlertOwnerRuleEngineService.ts +572 -396
  43. package/Server/Services/AlertPrivacyRuleEngineService.ts +116 -40
  44. package/Server/Services/AlertService.ts +111 -4
  45. package/Server/Services/AuditLogService.ts +612 -59
  46. package/Server/Services/BillingInvoiceService.ts +112 -102
  47. package/Server/Services/BillingService.ts +539 -11
  48. package/Server/Services/CephClusterLabelRuleEngineService.ts +170 -109
  49. package/Server/Services/CephClusterOwnerRuleEngineService.ts +233 -115
  50. package/Server/Services/CloudResourceLabelRuleEngineService.ts +163 -100
  51. package/Server/Services/CloudResourceOwnerRuleEngineService.ts +236 -115
  52. package/Server/Services/DashboardLabelRuleEngineService.ts +145 -84
  53. package/Server/Services/DashboardOwnerRuleEngineService.ts +213 -95
  54. package/Server/Services/DatabaseService.ts +171 -21
  55. package/Server/Services/DockerHostLabelRuleEngineService.ts +171 -110
  56. package/Server/Services/DockerHostOwnerRuleEngineService.ts +233 -115
  57. package/Server/Services/DockerSwarmClusterLabelRuleEngineService.ts +181 -112
  58. package/Server/Services/DockerSwarmClusterOwnerRuleEngineService.ts +243 -118
  59. package/Server/Services/HostLabelRuleEngineService.ts +167 -106
  60. package/Server/Services/HostOwnerRuleEngineService.ts +229 -111
  61. package/Server/Services/IncidentEpisodeLabelRuleEngineService.ts +141 -67
  62. package/Server/Services/IncidentEpisodeOwnerRuleEngineService.ts +272 -72
  63. package/Server/Services/IncidentEpisodePrivacyRuleEngineService.ts +112 -35
  64. package/Server/Services/IncidentEpisodePublicNoteService.ts +24 -0
  65. package/Server/Services/IncidentLabelRuleEngineService.ts +279 -204
  66. package/Server/Services/IncidentOwnerRuleEngineService.ts +595 -425
  67. package/Server/Services/IncidentPrivacyRuleEngineService.ts +117 -44
  68. package/Server/Services/IncidentPublicNoteService.ts +24 -0
  69. package/Server/Services/IncidentService.ts +114 -3
  70. package/Server/Services/IncomingCallPolicyLabelRuleEngineService.ts +147 -83
  71. package/Server/Services/IncomingCallPolicyOwnerRuleEngineService.ts +221 -100
  72. package/Server/Services/Index.ts +6 -4
  73. package/Server/Services/IoTFleetLabelRuleEngineService.ts +145 -84
  74. package/Server/Services/IoTFleetOwnerRuleEngineService.ts +213 -95
  75. package/Server/Services/KubernetesClusterLabelRuleEngineService.ts +181 -112
  76. package/Server/Services/KubernetesClusterOwnerRuleEngineService.ts +243 -118
  77. package/Server/Services/LabelService.ts +23 -28
  78. package/Server/Services/MonitorLabelRuleEngineService.ts +152 -92
  79. package/Server/Services/MonitorOwnerRuleEngineService.ts +220 -104
  80. package/Server/Services/MonitorProbeService.ts +20 -2
  81. package/Server/Services/MonitorService.ts +11 -9
  82. package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +376 -5
  83. package/Server/Services/NetworkDeviceDiagnosticService.ts +417 -0
  84. package/Server/Services/NetworkDeviceLabelRuleEngineService.ts +147 -83
  85. package/Server/Services/NetworkDeviceOwnerRuleEngineService.ts +218 -97
  86. package/Server/Services/NetworkDeviceService.ts +39 -2
  87. package/Server/Services/OnCallDutyPolicyLabelRuleEngineService.ts +151 -80
  88. package/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.ts +222 -97
  89. package/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.ts +154 -83
  90. package/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.ts +225 -100
  91. package/Server/Services/PodmanHostLabelRuleEngineService.ts +171 -110
  92. package/Server/Services/PodmanHostOwnerRuleEngineService.ts +235 -115
  93. package/Server/Services/ProjectService.ts +111 -10
  94. package/Server/Services/ProxmoxClusterLabelRuleEngineService.ts +174 -110
  95. package/Server/Services/ProxmoxClusterOwnerRuleEngineService.ts +239 -116
  96. package/Server/Services/RumApplicationLabelRuleEngineService.ts +137 -73
  97. package/Server/Services/RumApplicationOwnerRuleEngineService.ts +200 -83
  98. package/Server/Services/RunbookLabelRuleEngineService.ts +146 -84
  99. package/Server/Services/RunbookOwnerRuleEngineService.ts +216 -95
  100. package/Server/Services/ScheduledMaintenanceLabelRuleEngineService.ts +324 -230
  101. package/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.ts +613 -428
  102. package/Server/Services/ScheduledMaintenancePublicNoteService.ts +24 -0
  103. package/Server/Services/ScheduledMaintenanceService.ts +43 -14
  104. package/Server/Services/SecurityEventConnectionService.ts +56 -4
  105. package/Server/Services/ServerlessFunctionLabelRuleEngineService.ts +143 -74
  106. package/Server/Services/ServerlessFunctionOwnerRuleEngineService.ts +206 -85
  107. package/Server/Services/ServiceLabelRuleEngineService.ts +172 -110
  108. package/Server/Services/ServiceLevelObjectiveBurnRateRuleService.ts +1057 -18
  109. package/Server/Services/ServiceLevelObjectiveFeedService.ts +108 -0
  110. package/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.ts +793 -97
  111. package/Server/Services/ServiceLevelObjectiveMonitorRuleService.ts +1069 -0
  112. package/Server/Services/ServiceLevelObjectiveOwnerTeamService.ts +240 -1
  113. package/Server/Services/ServiceLevelObjectiveOwnerUserService.ts +257 -1
  114. package/Server/Services/ServiceLevelObjectiveService.ts +1356 -56
  115. package/Server/Services/ServiceOwnerRuleEngineService.ts +238 -116
  116. package/Server/Services/StatusPageAnnouncementService.ts +13 -0
  117. package/Server/Services/StatusPageLabelRuleEngineService.ts +146 -85
  118. package/Server/Services/StatusPageOwnerRuleEngineService.ts +210 -99
  119. package/Server/Services/StatusPageSubscriberNotificationTemplateService.ts +28 -232
  120. package/Server/Services/StatusPageSubscriberService.ts +6 -0
  121. package/Server/Services/TelemetryUsageBillingService.ts +38 -7
  122. package/Server/Services/ThreatIntelFeedService.ts +1 -1
  123. package/Server/Services/VMwareVCenterLabelRuleEngineService.ts +173 -110
  124. package/Server/Services/VMwareVCenterOwnerRuleEngineService.ts +238 -116
  125. package/Server/Services/WorkflowLabelRuleEngineService.ts +145 -84
  126. package/Server/Services/WorkflowOwnerRuleEngineService.ts +215 -95
  127. package/Server/Types/Database/UpdateByID.ts +3 -0
  128. package/Server/Types/Database/UpdateOneBy.ts +7 -0
  129. package/Server/Utils/AI/AlertAIContextBuilder.ts +19 -0
  130. package/Server/Utils/AI/IncidentAIContextBuilder.ts +39 -0
  131. package/Server/Utils/AI/Toolbox/AlertTools.ts +37 -1
  132. package/Server/Utils/AI/Toolbox/IncidentTools.ts +22 -1
  133. package/Server/Utils/AI/Toolbox/SloTools.ts +416 -51
  134. package/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.ts +151 -13
  135. package/Server/Utils/Dashboard/PublicDashboardSloHistoryPolicy.ts +17 -4
  136. package/Server/Utils/Dashboard/PublicDashboardSloWidget.ts +155 -8
  137. package/Server/Utils/Database/ProjectScopedReferenceValidator.ts +16 -0
  138. package/Server/Utils/Database/RelationValueUtil.ts +106 -0
  139. package/Server/Utils/Monitor/Criteria/CompareCriteria.ts +6 -1
  140. package/Server/Utils/Monitor/Criteria/EvaluateOverTime.ts +22 -27
  141. package/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.ts +3 -1
  142. package/Server/Utils/Monitor/MonitorStepsProjectValidator.ts +50 -20
  143. package/Server/Utils/Monitor/NetworkDeviceHydrationUtil.ts +13 -1
  144. package/Server/Utils/Monitor/NetworkDeviceMetricUtil.ts +6 -11
  145. package/Server/Utils/Rules/MonitorRulePatternValidator.ts +51 -0
  146. package/Server/Utils/Rules/OwnerRuleAssignment.ts +110 -0
  147. package/Server/Utils/Rules/RuleRun/RuleApplication.ts +81 -0
  148. package/Server/Utils/Rules/RuleRun/RuleRunPermission.ts +188 -0
  149. package/Server/Utils/Rules/RuleRun/RuleRunRegistry.ts +803 -0
  150. package/Server/Utils/Rules/RuleRun/RuleRunner.ts +341 -0
  151. package/Server/Utils/SecurityEvent/ConnectorErrorMessage.ts +3 -2
  152. package/Server/Utils/SecurityEvent/Connectors/ConnectorPlatformHealth.ts +6 -4
  153. package/Server/Utils/SecurityEvent/{GoogleSecOps → Connectors/GoogleSecOps}/GoogleSecOpsClient.ts +263 -16
  154. package/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnector.ts +2101 -0
  155. package/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionPoller.ts +194 -14
  156. package/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionRunExecutor.ts +1 -2
  157. package/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionTester.ts +38 -7
  158. package/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectorRegistry.ts +2 -0
  159. package/Server/Utils/SecurityEvent/Connectors/Types.ts +242 -2
  160. package/Server/Utils/SecurityEvent/DetectionRuleEvaluator.ts +1 -1
  161. package/Server/Utils/SecurityEvent/SecurityEventDedupe.ts +3 -3
  162. package/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.ts +2 -2
  163. package/Server/Utils/SessionReplay/SessionReplayReadService.ts +217 -56
  164. package/Server/Utils/Slo/SloFeedUtil.ts +200 -0
  165. package/Server/Utils/Slo/SloLegacyMonitorLabelAdoption.ts +173 -0
  166. package/Server/Utils/Slo/SloMetricUtil.ts +327 -0
  167. package/Server/Utils/Slo/SloOwnerReferenceValidator.ts +208 -0
  168. package/Server/Utils/Slo/SloRecordReferenceValidator.ts +169 -0
  169. package/Server/Utils/StatusPage/MonitorRulePatternValidator.ts +6 -43
  170. package/Server/Utils/StatusPageResource.ts +50 -5
  171. package/Tests/App/Dashboard/AIInvestigationHeaderStatus.test.tsx +664 -15
  172. package/Tests/App/Dashboard/AddWidgetModal.test.tsx +4 -1
  173. package/Tests/App/Dashboard/AffectedResourcesSlo.test.tsx +307 -0
  174. package/Tests/App/Dashboard/ArchiveResourceCard.test.tsx +289 -0
  175. package/Tests/App/Dashboard/AuditLogsTable.test.tsx +598 -0
  176. package/Tests/App/Dashboard/BillingDefaultPaymentMethod.test.tsx +1046 -0
  177. package/Tests/App/Dashboard/BillingPaidUsageFlow.test.tsx +3 -0
  178. package/Tests/App/Dashboard/BillingPaymentMethodForm.test.tsx +201 -7
  179. package/Tests/App/Dashboard/BooleanSeriesCriteriaFilterText.test.ts +82 -0
  180. package/Tests/App/Dashboard/BreadcrumbCoverage.test.tsx +16 -1
  181. package/Tests/App/Dashboard/ChangeAlertStateAIHeader.test.tsx +116 -8
  182. package/Tests/App/Dashboard/ChatActivityFeed.test.tsx +168 -1
  183. package/Tests/App/Dashboard/ConnectionTestModal.test.tsx +1 -1
  184. package/Tests/App/Dashboard/ConnectorTestReportView.test.tsx +20 -3
  185. package/Tests/App/Dashboard/CorrelateFilterBuilder.test.tsx +1095 -1
  186. package/Tests/App/Dashboard/CorrelateFilterChips.test.tsx +910 -0
  187. package/Tests/App/Dashboard/CorrelateGraph.test.tsx +3747 -25
  188. package/Tests/App/Dashboard/CorrelateGraphHelpers.test.ts +1085 -0
  189. package/Tests/App/Dashboard/CorrelateInspector.test.tsx +1534 -0
  190. package/Tests/App/Dashboard/CorrelateNodeCard.test.tsx +965 -0
  191. package/Tests/App/Dashboard/CorrelateResultSummary.test.tsx +1525 -0
  192. package/Tests/App/Dashboard/CorrelationGraph.test.ts +1030 -0
  193. package/Tests/App/Dashboard/CorrelationGraphLayout.test.ts +526 -0
  194. package/Tests/App/Dashboard/DeviceDiagnostics.test.tsx +787 -0
  195. package/Tests/App/Dashboard/DeviceLatencyTrend.test.tsx +278 -0
  196. package/Tests/App/Dashboard/DiscoveryReviewInventoryRefresh.test.tsx +279 -0
  197. package/Tests/App/Dashboard/DiscoveryScanEditForm.test.tsx +87 -0
  198. package/Tests/App/Dashboard/DiscoveryScanWizardValidation.test.tsx +443 -8
  199. package/Tests/App/Dashboard/EntityFilterDropdownArchivedSlos.test.tsx +340 -0
  200. package/Tests/App/Dashboard/EventOverviewPages.test.tsx +98 -2
  201. package/Tests/App/Dashboard/ExceptionSegmentedControl.test.tsx +1020 -0
  202. package/Tests/App/Dashboard/InvestigationEvidenceList.test.tsx +268 -47
  203. package/Tests/App/Dashboard/InvestigationPanel.test.tsx +1114 -76
  204. package/Tests/App/Dashboard/InvestigationPanelStatus.test.tsx +124 -2
  205. package/Tests/App/Dashboard/InvestigationReportView.test.tsx +279 -176
  206. package/Tests/App/Dashboard/InvestigationRunDetails.test.tsx +1166 -0
  207. package/Tests/App/Dashboard/InvoicesPayInvoice.test.tsx +437 -0
  208. package/Tests/App/Dashboard/NetworkDeviceBulkDelete.test.tsx +65 -0
  209. package/Tests/App/Dashboard/NetworkTopologyLiveView.test.tsx +5 -0
  210. package/Tests/App/Dashboard/ResourceAuditLogsSideMenus.test.tsx +74 -0
  211. package/Tests/App/Dashboard/ResourceFeed.test.tsx +125 -5
  212. package/Tests/App/Dashboard/ResourceFeedPageWiring.test.ts +8 -1
  213. package/Tests/App/Dashboard/SecurityEventConnectionDiagnostics.test.tsx +1764 -0
  214. package/Tests/App/Dashboard/SecurityEventConnectionFormModal.test.tsx +1000 -64
  215. package/Tests/App/Dashboard/SecurityEventConnectionsEmptyState.test.tsx +448 -0
  216. package/Tests/App/Dashboard/SecurityEventConnectionsTable.test.tsx +739 -189
  217. package/Tests/App/Dashboard/SecurityEventSeverityPill.test.tsx +233 -0
  218. package/Tests/App/Dashboard/SecurityEventsEmptyState.test.tsx +282 -0
  219. package/Tests/App/Dashboard/SloActiveBurnEventsCard.test.tsx +538 -0
  220. package/Tests/App/Dashboard/SloBulkActionsArchive.test.tsx +252 -0
  221. package/Tests/App/Dashboard/SloDashboardTemplateWidgets.test.tsx +322 -518
  222. package/Tests/App/Dashboard/SloElement.test.tsx +194 -0
  223. package/Tests/App/Dashboard/SloFeed.test.tsx +289 -0
  224. package/Tests/App/Dashboard/SloHistoryCharts.test.tsx +471 -0
  225. package/Tests/App/Dashboard/SloHistorySeries.test.tsx +607 -0
  226. package/Tests/App/Dashboard/SloListWidget.test.tsx +783 -0
  227. package/Tests/App/Dashboard/SloMetricsPage.test.tsx +346 -0
  228. package/Tests/App/Dashboard/SloMonitorsPage.test.tsx +661 -0
  229. package/Tests/App/Dashboard/SloMonitorsSummaryCard.test.tsx +489 -0
  230. package/Tests/App/Dashboard/SloNavigationWiring.test.tsx +437 -0
  231. package/Tests/App/Dashboard/SloNoticeBanner.test.tsx +305 -0
  232. package/Tests/App/Dashboard/SloOverviewData.test.tsx +563 -0
  233. package/Tests/App/Dashboard/SloOverviewHero.test.tsx +311 -0
  234. package/Tests/App/Dashboard/SloOverviewKpiStrip.test.tsx +426 -0
  235. package/Tests/App/Dashboard/SloOverviewSidebarCards.test.tsx +493 -0
  236. package/Tests/App/Dashboard/SloSettings.test.tsx +633 -0
  237. package/Tests/App/Dashboard/SloStatusSummaryCards.test.tsx +403 -0
  238. package/Tests/App/Dashboard/SloViewSideMenuCounts.test.tsx +373 -0
  239. package/Tests/App/Dashboard/SloWidgetVariableBinding.test.tsx +689 -0
  240. package/Tests/App/Dashboard/TopologyConnectivitySection.test.tsx +206 -0
  241. package/Tests/App/Dashboard/TracesEntityNames.test.tsx +47 -15
  242. package/Tests/App/Dashboard/UseBulkShortenDeviceNames.test.tsx +1312 -0
  243. package/Tests/App/Dashboard/WidgetCatalog.test.ts +9 -1
  244. package/Tests/Models/AnalyticsModels/RumSessionReplayColumns.test.ts +14 -16
  245. package/Tests/Models/DatabaseModels/AuditLogModelConfiguration.test.ts +442 -0
  246. package/Tests/Models/DatabaseModels/DomainRoleTierCoverage.test.ts +9 -10
  247. package/Tests/Models/DatabaseModels/ResourceFeedModels.test.ts +48 -1
  248. package/Tests/Models/DatabaseModels/SloOverhaulModels.test.ts +835 -0
  249. package/Tests/Models/DatabaseModels/StaticRuleCriteriaInheritance.test.ts +3 -2
  250. package/Tests/Models/DiscoveryScanNetbiosLookupColumn.test.ts +328 -0
  251. package/Tests/Models/DiscoveryScanShortDeviceNamesColumn.test.ts +335 -0
  252. package/Tests/Models/NetworkDeviceDiagnosticContract.test.ts +194 -0
  253. package/Tests/Models/NetworkDeviceDnsNameColumn.test.ts +321 -0
  254. package/Tests/Models/ProjectDataResidencyColumn.test.ts +154 -0
  255. package/Tests/Models/SecurityDomainAccessControl.test.ts +181 -50
  256. package/Tests/Server/API/BaseAPI.test.ts +6 -0
  257. package/Tests/Server/API/BaseAPIUpdateMiscDataProps.test.ts +217 -0
  258. package/Tests/Server/API/BillingInvoiceAPI.test.ts +7 -0
  259. package/Tests/Server/API/BillingInvoiceAPIPaymentStates.test.ts +990 -0
  260. package/Tests/Server/API/BillingPaymentMethodAPI.test.ts +498 -0
  261. package/Tests/Server/API/DashboardPublicSloAPI.test.ts +405 -0
  262. package/Tests/Server/API/SecurityEventConnectionAPI.test.ts +901 -7
  263. package/Tests/Server/API/SessionReplayAPI.test.ts +116 -0
  264. package/Tests/Server/API/StatusPageManageSubscriptionRecipient.test.ts +857 -0
  265. package/Tests/Server/API/StatusPageManageSubscriptionTemplateVariables.test.ts +1084 -0
  266. package/Tests/Server/Infrastructure/Postgres/AddConfigurableRuleCriteriaMigration.test.ts +33 -3
  267. package/Tests/Server/Infrastructure/Postgres/AddDataResidencyToProjectMigration.test.ts +202 -0
  268. package/Tests/Server/Infrastructure/Postgres/AddNetbiosLookupToNetworkDeviceDiscoveryScanMigration.test.ts +330 -0
  269. package/Tests/Server/Infrastructure/Postgres/AddNetworkDeviceDnsNameAndShortDeviceNamesMigration.test.ts +340 -0
  270. package/Tests/Server/Infrastructure/Postgres/BackfillSloMonitorRulesAndAffectedResourcesMigration.test.ts +343 -0
  271. package/Tests/Server/Infrastructure/Postgres/SloProductOverhaulMigration.test.ts +801 -0
  272. package/Tests/Server/Services/AddSubscriberUpdateNotificationStatusMigration.test.ts +307 -0
  273. package/Tests/Server/Services/AuditLogService.test.ts +1124 -0
  274. package/Tests/Server/Services/AutoImportScanCredentialSelect.test.ts +200 -1
  275. package/Tests/Server/Services/BillingInvoiceServiceMutexRelease.test.ts +254 -0
  276. package/Tests/Server/Services/BillingService.test.ts +70 -0
  277. package/Tests/Server/Services/BillingServicePayInvoiceStates.test.ts +723 -0
  278. package/Tests/Server/Services/BillingServicePaymentMethodReads.test.ts +14 -2
  279. package/Tests/Server/Services/BillingServiceSubscriptionPaymentMethodSync.test.ts +1634 -0
  280. package/Tests/Server/Services/DatabaseServiceAuditRelationDiff.test.ts +492 -0
  281. package/Tests/Server/Services/DatabaseServicePasswordFieldSecrets.test.ts +629 -0
  282. package/Tests/Server/Services/IncidentAlertSloLinkSurvivesEdit.test.ts +431 -0
  283. package/Tests/Server/Services/IncidentAlertSloReferenceGuard.test.ts +358 -0
  284. package/Tests/Server/Services/MonitorProbeServicePastDueMonitoring.test.ts +362 -0
  285. package/Tests/Server/Services/NetworkDeviceAutoImportRuleEngineService.test.ts +1460 -1
  286. package/Tests/Server/Services/NetworkDeviceDiagnosticService.test.ts +962 -0
  287. package/Tests/Server/Services/NetworkDeviceDiscoveryScanService.test.ts +106 -0
  288. package/Tests/Server/Services/NetworkDeviceRuleEngines.test.ts +10 -1
  289. package/Tests/Server/Services/NetworkDeviceServicePastDueMonitoring.test.ts +335 -0
  290. package/Tests/Server/Services/NetworkDeviceSiteRuleDnsName.test.ts +568 -0
  291. package/Tests/Server/Services/ProjectDataResidencyPostgres.test.ts +344 -0
  292. package/Tests/Server/Services/ProjectServiceAuditLogSettingsCache.test.ts +187 -0
  293. package/Tests/Server/Services/ProjectServiceDataResidency.test.ts +369 -0
  294. package/Tests/Server/Services/ProjectServiceDataResidencySelfHosted.test.ts +176 -0
  295. package/Tests/Server/Services/ProjectServicePastDueMonitoring.test.ts +289 -0
  296. package/Tests/Server/Services/ResourceFeedServices.test.ts +24 -8
  297. package/Tests/Server/Services/RuleRun/IncidentAlertMaintenanceRuleEnginesRun.test.ts +1396 -0
  298. package/Tests/Server/Services/RuleRun/LabelRuleEnginesGroupARun.test.ts +917 -0
  299. package/Tests/Server/Services/RuleRun/LabelRuleEnginesGroupBRun.test.ts +1262 -0
  300. package/Tests/Server/Services/RuleRun/OwnerRuleEnginesGroupARun.test.ts +902 -0
  301. package/Tests/Server/Services/RuleRun/OwnerRuleEnginesGroupBRun.test.ts +1163 -0
  302. package/Tests/Server/Services/RuleRun/PrivacyRuleEnginesRun.test.ts +843 -0
  303. package/Tests/Server/Services/ScheduledMaintenanceSubscriberTemplateFormats.test.ts +465 -0
  304. package/Tests/Server/Services/SecurityEventConnectionService.test.ts +525 -4
  305. package/Tests/Server/Services/SecurityEventLastErrorColumnWidth.test.ts +77 -23
  306. package/Tests/Server/Services/ServiceLevelObjectiveBurnRateRuleFeedWrites.test.ts +777 -0
  307. package/Tests/Server/Services/ServiceLevelObjectiveBurnRateRuleOptions.test.ts +1399 -0
  308. package/Tests/Server/Services/ServiceLevelObjectiveBurnRateRuleService.test.ts +67 -74
  309. package/Tests/Server/Services/ServiceLevelObjectiveChildRowTenancy.test.ts +906 -0
  310. package/Tests/Server/Services/ServiceLevelObjectiveDeleteTenancy.test.ts +1029 -0
  311. package/Tests/Server/Services/ServiceLevelObjectiveFeedService.test.ts +313 -0
  312. package/Tests/Server/Services/ServiceLevelObjectiveFeedWrites.test.ts +1214 -0
  313. package/Tests/Server/Services/ServiceLevelObjectiveMarkdownLink.test.ts +289 -0
  314. package/Tests/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.test.ts +1455 -430
  315. package/Tests/Server/Services/ServiceLevelObjectiveMonitorRuleLegacyLabelAdoption.test.ts +634 -0
  316. package/Tests/Server/Services/ServiceLevelObjectiveMonitorRuleService.test.ts +1193 -0
  317. package/Tests/Server/Services/{SloMonitorLabelRuleHooks.test.ts → ServiceLevelObjectiveMonitorRuleTriggers.test.ts} +135 -41
  318. package/Tests/Server/Services/ServiceLevelObjectiveOwnerFeedWrites.test.ts +671 -0
  319. package/Tests/Server/Services/ServiceLevelObjectiveService.test.ts +180 -85
  320. package/Tests/Server/Services/ServiceLevelObjectiveServiceArchive.test.ts +537 -0
  321. package/Tests/Server/Services/ServiceLevelObjectiveServiceLegacyMonitorLabelWrite.test.ts +870 -0
  322. package/Tests/Server/Services/ServiceLevelObjectiveServiceMonitorRuleGuard.test.ts +343 -0
  323. package/Tests/Server/Services/ServiceLevelObjectiveServiceReEvaluation.test.ts +246 -0
  324. package/Tests/Server/Services/SloAffectedResourceCreatedFeed.test.ts +501 -0
  325. package/Tests/Server/Services/SloAffectedResourceLinkContract.test.ts +86 -0
  326. package/Tests/Server/Services/SloAffectedResourceMetricAttributes.test.ts +547 -0
  327. package/Tests/Server/Services/StaticRuleCriteriaRuntimeCoverage.test.ts +10 -4
  328. package/Tests/Server/Services/StatusPageMonitorRuleHooks.test.ts +7 -2
  329. package/Tests/Server/Services/StatusPageSubscriberNotificationTemplateCompile.test.ts +174 -0
  330. package/Tests/Server/Services/StatusPageSubscriberNotificationTemplateServiceVariables.test.ts +40 -0
  331. package/Tests/Server/Services/SubscriberUpdateNotificationHooks.test.ts +541 -0
  332. package/Tests/Server/Services/TelemetryUsageBillingSloExclusion.test.ts +288 -0
  333. package/Tests/Server/TestingUtils/PastDueMonitoringClaimSql.ts +177 -0
  334. package/Tests/Server/TestingUtils/Services/BillingServiceHelper.ts +51 -10
  335. package/Tests/Server/TestingUtils/__mocks__/Stripe.mock.ts +16 -1
  336. package/Tests/Server/Types/Database/Permissions/ProjectDataResidencyColumn.test.ts +386 -0
  337. package/Tests/Server/Types/Database/Permissions/SecurityRoleAccess.test.ts +26 -36
  338. package/Tests/Server/Utils/AI/SloAffectedResourceAIContext.test.ts +445 -0
  339. package/Tests/Server/Utils/AI/SloTools.test.ts +423 -1
  340. package/Tests/Server/Utils/AI/SloToolsArchive.test.ts +294 -0
  341. package/Tests/Server/Utils/AI/SloToolsRuleReadPermissions.test.ts +297 -0
  342. package/Tests/Server/Utils/Dashboard/PublicDashboardSloHistoryPolicy.test.ts +255 -10
  343. package/Tests/Server/Utils/Dashboard/SloTemplatePublicDashboard.test.ts +404 -750
  344. package/Tests/Server/Utils/Database/ProjectScopedReferenceValidator.test.ts +45 -0
  345. package/Tests/Server/Utils/Database/RelationValueUtil.test.ts +157 -0
  346. package/Tests/Server/Utils/Monitor/Criteria/BooleanSeriesEvaluateOverTime.test.ts +260 -0
  347. package/Tests/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.test.ts +181 -0
  348. package/Tests/Server/Utils/Monitor/Criteria/EvaluateOverTime.test.ts +147 -30
  349. package/Tests/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.test.ts +17 -0
  350. package/Tests/Server/Utils/Monitor/MonitorStepsProjectValidator.test.ts +136 -0
  351. package/Tests/Server/Utils/Monitor/MonitorStepsProjectValidatorLoadOrder.test.ts +472 -0
  352. package/Tests/Server/Utils/Monitor/NetworkDeviceHydrationUtil.test.ts +48 -2
  353. package/Tests/Server/Utils/Monitor/SloTemplateMetricEmitterContract.test.ts +435 -475
  354. package/Tests/Server/Utils/Rules/MonitorRulePatternValidator.test.ts +77 -0
  355. package/Tests/Server/Utils/Rules/OwnerRuleAssignment.test.ts +177 -0
  356. package/Tests/Server/Utils/Rules/RuleRun/RuleRunPermission.test.ts +365 -0
  357. package/Tests/Server/Utils/Rules/RuleRun/RuleRunRegistry.test.ts +173 -0
  358. package/Tests/Server/Utils/Rules/RuleRun/RuleRunner.test.ts +675 -0
  359. package/Tests/Server/Utils/SecurityEvent/ConnectorErrorMessage.test.ts +8 -8
  360. package/Tests/Server/Utils/SecurityEvent/Connectors/ConnectorFetchSummary.test.ts +261 -0
  361. package/Tests/Server/Utils/SecurityEvent/Connectors/ConnectorPlatformHealth.test.ts +68 -13
  362. package/Tests/Server/Utils/SecurityEvent/{GoogleSecOpsAuth.test.ts → Connectors/GoogleSecOps/GoogleSecOpsAuth.test.ts} +5 -5
  363. package/Tests/Server/Utils/SecurityEvent/{GoogleSecOpsClient.test.ts → Connectors/GoogleSecOps/GoogleSecOpsClient.test.ts} +4 -4
  364. package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnector.test.ts +483 -0
  365. package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnectorCuratedAndLateAlerts.test.ts +676 -0
  366. package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnectorFetchEvents.test.ts +1994 -0
  367. package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnectorFixtures.ts +332 -0
  368. package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnectorHttpIntegration.test.ts +680 -0
  369. package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnectorRequestContract.test.ts +1206 -0
  370. package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnectorTestConnection.test.ts +1136 -0
  371. package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsCuratedRuleCounts.test.ts +407 -0
  372. package/Tests/Server/Utils/SecurityEvent/{GoogleSecOpsErrorHandling.test.ts → Connectors/GoogleSecOps/GoogleSecOpsErrorHandling.test.ts} +5 -5
  373. package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsPollingAdaptiveCatchUp.test.ts +730 -0
  374. package/Tests/Server/Utils/SecurityEvent/{GoogleSecOpsClickhouseIntegration.test.ts → Connectors/GoogleSecOps/GoogleSecOpsPollingClickhouseIntegration.test.ts} +130 -35
  375. package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsPollingFailureTaxonomy.test.ts +772 -0
  376. package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsPollingFixtures.ts +648 -0
  377. package/Tests/Server/Utils/SecurityEvent/{GoogleSecOpsHttpIntegration.test.ts → Connectors/GoogleSecOps/GoogleSecOpsPollingHttpIntegration.test.ts} +230 -225
  378. package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsPollingIntegration.test.ts +1390 -0
  379. package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsPollingLoop.test.ts +981 -0
  380. package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsPollingNothingImportedRegression.test.ts +290 -0
  381. package/Tests/Server/Utils/SecurityEvent/{GoogleSecOpsRequestContract.test.ts → Connectors/GoogleSecOps/GoogleSecOpsRequestContract.test.ts} +2 -2
  382. package/Tests/Server/Utils/SecurityEvent/{GoogleSecOpsResponseParsing.test.ts → Connectors/GoogleSecOps/GoogleSecOpsResponseParsing.test.ts} +5 -5
  383. package/Tests/Server/Utils/SecurityEvent/{GoogleSecOpsSearchDetections.test.ts → Connectors/GoogleSecOps/GoogleSecOpsSearchDetections.test.ts} +38 -5
  384. package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsTesterIntegration.test.ts +421 -0
  385. package/Tests/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionPoller.test.ts +1445 -3
  386. package/Tests/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionRunExecutor.test.ts +14 -4
  387. package/Tests/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionTester.test.ts +313 -4
  388. package/Tests/Server/Utils/SessionReplay/SessionReplayReadServiceQueries.test.ts +352 -0
  389. package/Tests/Server/Utils/Slo/SloFeedUtil.test.ts +326 -0
  390. package/Tests/Server/Utils/Slo/SloLegacyMonitorLabelAdoption.test.ts +260 -0
  391. package/Tests/Server/Utils/Slo/SloMetricUtil.test.ts +592 -0
  392. package/Tests/Server/Utils/Slo/SloRecordReferenceValidator.test.ts +311 -0
  393. package/Tests/Server/Utils/StatusPageResource.test.ts +91 -3
  394. package/Tests/Types/Billing/SubscriptionStatus.test.ts +176 -0
  395. package/Tests/Types/Billing/SubscriptionStatusPastDueMonitoring.test.ts +187 -0
  396. package/Tests/Types/Dashboard/DashboardTemplateInvariants.test.ts +53 -7
  397. package/Tests/Types/Dashboard/SloDashboardTemplate.test.ts +816 -792
  398. package/Tests/Types/Monitor/CriteriaFilter.test.ts +216 -24
  399. package/Tests/Types/Monitor/MonitorStepDnssecMonitor.test.ts +14 -1
  400. package/Tests/Types/Monitor/MonitorStepDomainMonitor.test.ts +14 -1
  401. package/Tests/Types/Monitor/MonitorStepExternalStatusPageMonitor.test.ts +14 -1
  402. package/Tests/Types/Monitor/MonitorStepRetriesParsing.test.ts +201 -0
  403. package/Tests/Types/Rules/RuleRun.test.ts +315 -0
  404. package/Tests/Types/Rum/SessionReplayApiContracts.test.ts +60 -0
  405. package/Tests/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.test.ts +29 -4
  406. package/Tests/Types/StatusPage/SubscriberNotificationTemplateVariables.test.ts +217 -0
  407. package/Tests/Types/StatusPage/SubscriberUpdateNotification.test.ts +200 -0
  408. package/Tests/UI/Components/ActiveFilterChipsLockedFilters.test.tsx +141 -87
  409. package/Tests/UI/Components/AlertBanner.test.tsx +319 -0
  410. package/Tests/UI/Components/BulkArchiveActionsCopy.test.tsx +310 -0
  411. package/Tests/UI/Components/Detail/DetailIdIsUnique.test.tsx +87 -0
  412. package/Tests/UI/Components/Dropdown/DropdownClearable.test.tsx +393 -0
  413. package/Tests/UI/Components/Dropdown/DropdownMultiSelectChipAccessibleName.test.tsx +64 -0
  414. package/Tests/UI/Components/EmptyState/EmptyState.test.tsx +335 -4
  415. package/Tests/UI/Components/EmptyState/EmptyStateGuideLinks.test.tsx +337 -0
  416. package/Tests/UI/Components/Forms/ModelFormJsonColumns.test.tsx +21 -20
  417. package/Tests/UI/Components/LabelRuleImportExport.test.tsx +15 -2
  418. package/Tests/UI/Components/LockedFilterChip.test.tsx +281 -144
  419. package/Tests/UI/Components/MoreMenu.test.tsx +133 -0
  420. package/Tests/UI/Components/MoreMenuMotion.test.tsx +84 -3
  421. package/Tests/UI/Components/RuleCriteria/RuleCriteriaModelTable.test.tsx +3 -3
  422. package/Tests/UI/Components/RuleRun/RuleDetailFields.test.tsx +336 -0
  423. package/Tests/UI/Components/RuleRun/RuleTable.test.tsx +304 -0
  424. package/Tests/UI/Components/RuleRun/RunRuleNowModal.test.tsx +231 -0
  425. package/Tests/UI/Components/RuleRun/RunRulesBulkAction.test.ts +213 -0
  426. package/Tests/UI/Components/TelemetryActiveFilterChipsLockedFilters.test.tsx +124 -61
  427. package/Tests/UI/Rum/ReplayEngine.test.ts +154 -0
  428. package/Tests/UI/Rum/ReplayHeader.test.tsx +234 -123
  429. package/Tests/UI/Rum/ReplayPinControl.test.tsx +122 -0
  430. package/Tests/UI/Rum/ReplayPlayerChrome.test.tsx +245 -0
  431. package/Tests/UI/Rum/ReplayRail.test.tsx +294 -0
  432. package/Tests/UI/Rum/ReplayScrubber.test.tsx +213 -1
  433. package/Tests/UI/Rum/ReplayStage.test.tsx +565 -172
  434. package/Tests/UI/Rum/ReplayStageOverlays.test.tsx +260 -3
  435. package/Tests/UI/Rum/ReplayTabSwitcher.test.tsx +1391 -0
  436. package/Tests/UI/Rum/ReplayTimeline.test.tsx +222 -0
  437. package/Tests/UI/Utils/DashboardStackingLayers.test.ts +8 -1
  438. package/Tests/UI/Utils/RuleRunClient.test.ts +303 -0
  439. package/Tests/UI/Utils/Telemetry/TelemetryEntityNames.test.ts +1 -0
  440. package/Tests/Utils/Dashboard/Components/DashboardComponentDefaults.test.ts +2 -0
  441. package/Tests/Utils/Dashboard/Components/DashboardSloListComponent.test.ts +206 -0
  442. package/Tests/Utils/Dashboard/DashboardSloComponent.test.ts +36 -2
  443. package/Tests/Utils/Dashboard/SloTemplateVariableScoping.test.ts +409 -588
  444. package/Tests/Utils/Dashboard/SloWidgetSource.test.ts +351 -0
  445. package/Tests/Utils/Markdown/MarkdownEscape.test.ts +361 -0
  446. package/Tests/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.test.ts +1425 -118
  447. package/Tests/Utils/NetworkDiscovery/DiscoveredHostUtil.test.ts +188 -3
  448. package/Tests/Utils/NetworkDiscovery/DiscoveryReverseDnsChain.test.ts +661 -13
  449. package/Tests/Utils/NetworkDiscovery/NetbiosNameUtil.test.ts +349 -0
  450. package/Tests/Utils/NetworkDiscovery/RunImportedDeviceNaming.test.ts +656 -0
  451. package/Tests/Utils/NetworkDiscovery/ShortDeviceNamePlanner.test.ts +1020 -0
  452. package/Tests/Utils/NetworkDiscovery/ShortHostnameUtil.test.ts +619 -0
  453. package/Tests/Utils/NetworkSite/CidrMatchUtil.test.ts +317 -0
  454. package/Tests/Utils/Project/DataResidency.test.ts +198 -0
  455. package/Tests/Utils/Rules/RuleRunSummary.test.ts +394 -0
  456. package/Tests/Utils/Slo/SloAffectedResourceMarkdown.test.ts +302 -0
  457. package/Tests/Utils/Slo/SloBurnRateTemplate.test.ts +468 -0
  458. package/Tests/Utils/Slo/SloEvaluation.test.ts +20 -4
  459. package/Tests/Utils/Slo/SloFeedMarkdown.test.ts +1185 -0
  460. package/Tests/Utils/Slo/SloHealth.test.ts +262 -0
  461. package/Tests/Utils/Slo/SloHistoryMetricName.test.ts +102 -0
  462. package/Tests/Utils/Slo/SloListWidgetFormat.test.ts +522 -0
  463. package/Tests/Utils/Slo/SloMetricType.test.ts +355 -0
  464. package/Tests/Utils/Slo/SloMonitorRuleCriteria.test.ts +387 -0
  465. package/Tests/Utils/Slo/SloMonitorStatusSummary.test.ts +210 -0
  466. package/Tests/Utils/Slo/SloOverviewText.test.ts +226 -0
  467. package/Tests/Utils/Slo/SloProjection.test.ts +1039 -0
  468. package/Tests/Utils/Slo/SloWidgetFormat.test.ts +47 -0
  469. package/Tests/Utils/Telemetry/LockedFilterSearch.test.ts +1 -80
  470. package/Types/BaseDatabase/EnableAuditLogOn.ts +41 -0
  471. package/Types/Billing/SubscriptionStatus.ts +39 -4
  472. package/Types/Dashboard/DashboardComponentType.ts +1 -0
  473. package/Types/Dashboard/DashboardComponents/ComponentArgument.ts +5 -0
  474. package/Types/Dashboard/DashboardComponents/DashboardSloComponent.ts +10 -0
  475. package/Types/Dashboard/DashboardComponents/DashboardSloListComponent.ts +29 -0
  476. package/Types/Dashboard/DashboardTemplates.ts +290 -297
  477. package/Types/Database/EnableAuditLog.ts +23 -1
  478. package/Types/Email/EmailTemplateType.ts +4 -0
  479. package/Types/Monitor/CriteriaFilter.ts +55 -8
  480. package/Types/Monitor/MonitorStep.ts +5 -2
  481. package/Types/Monitor/MonitorStepDnsMonitor.ts +3 -1
  482. package/Types/Monitor/MonitorStepDnssecMonitor.ts +3 -1
  483. package/Types/Monitor/MonitorStepDomainMonitor.ts +3 -1
  484. package/Types/Monitor/MonitorStepExternalStatusPageMonitor.ts +3 -1
  485. package/Types/Monitor/MonitorStepRetries.ts +59 -0
  486. package/Types/Monitor/MonitorStepSnmpMonitor.ts +9 -2
  487. package/Types/NetworkDevice/NetworkDeviceDiagnosticResult.ts +104 -0
  488. package/Types/NetworkDevice/NetworkDeviceDiagnosticStatus.ts +47 -0
  489. package/Types/NetworkDevice/NetworkDeviceDiagnosticType.ts +47 -0
  490. package/Types/NetworkDevice/NetworkDevicePingMetricNames.ts +20 -0
  491. package/Types/Permission.ts +127 -0
  492. package/Types/Rules/RuleCriteriaFieldRegistry.ts +5 -0
  493. package/Types/Rules/RuleRun.ts +518 -0
  494. package/Types/Rum/SessionReplayApi.ts +18 -0
  495. package/Types/SecurityEvent/Connectors/ConnectorDiagnostics.ts +6 -0
  496. package/Types/SecurityEvent/Connectors/SecurityEventConnectionDiagnostics.ts +30 -4
  497. package/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.ts +108 -1
  498. package/Types/SecurityEvent/Connectors/SecurityEventConnectorProvider.ts +6 -2
  499. package/Types/ServiceLevelObjective/SloHistoryMetricName.ts +25 -0
  500. package/Types/ServiceLevelObjective/SloMetricType.ts +49 -0
  501. package/Types/StatusPage/StatusPageSubscriberNotificationEventType.ts +4 -0
  502. package/Types/StatusPage/SubscriberNotificationTemplateVariables.ts +331 -0
  503. package/Types/StatusPage/SubscriberNotificationTrigger.ts +12 -0
  504. package/Types/StatusPage/SubscriberUpdateNotification.ts +89 -0
  505. package/Types/Telemetry/LockedFilterDetail.ts +7 -28
  506. package/Types/Telemetry/ServiceType.ts +7 -0
  507. package/Typings/Index.d.ts +53 -3
  508. package/UI/Components/AlertBanner/AlertBanner.tsx +85 -27
  509. package/UI/Components/BulkUpdate/BulkArchiveActions.tsx +21 -2
  510. package/UI/Components/Detail/Detail.tsx +9 -2
  511. package/UI/Components/Dropdown/Dropdown.tsx +64 -1
  512. package/UI/Components/EmptyState/EmptyState.tsx +27 -3
  513. package/UI/Components/EmptyState/EmptyStateGuideLinks.tsx +124 -0
  514. package/UI/Components/Forms/ModelForm.tsx +6 -5
  515. package/UI/Components/LabelRule/LabelRuleTable.tsx +8 -2
  516. package/UI/Components/LogsViewer/LogsViewer.tsx +2 -6
  517. package/UI/Components/LogsViewer/components/ActiveFilterChips.tsx +2 -13
  518. package/UI/Components/LogsViewer/types.ts +2 -2
  519. package/UI/Components/MoreMenu/MoreMenu.tsx +14 -3
  520. package/UI/Components/RuleRun/RuleDetailFields.tsx +359 -0
  521. package/UI/Components/RuleRun/RuleTable.tsx +183 -0
  522. package/UI/Components/RuleRun/RuleView.tsx +170 -0
  523. package/UI/Components/RuleRun/RunRuleNowModal.tsx +147 -0
  524. package/UI/Components/RuleRun/RunRulesBulkAction.ts +103 -0
  525. package/UI/Components/TelemetryViewer/TelemetryViewer.tsx +2 -6
  526. package/UI/Components/TelemetryViewer/components/LockedFilterChip.tsx +38 -104
  527. package/UI/Components/TelemetryViewer/components/TelemetryActiveFilterChips.tsx +2 -18
  528. package/UI/Components/TelemetryViewer/types.ts +2 -2
  529. package/UI/Utils/Rules/RuleRunClient.ts +178 -0
  530. package/UI/Utils/Telemetry/TelemetryEntityNames.ts +8 -0
  531. package/Utils/Dashboard/Components/DashboardSloComponent.ts +19 -2
  532. package/Utils/Dashboard/Components/DashboardSloListComponent.ts +126 -0
  533. package/Utils/Dashboard/Components/Index.ts +7 -0
  534. package/Utils/Dashboard/SloWidgetSource.ts +188 -0
  535. package/Utils/Markdown/MarkdownEscape.ts +63 -0
  536. package/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.ts +161 -36
  537. package/Utils/NetworkDiscovery/DiscoveredHostUtil.ts +25 -0
  538. package/Utils/NetworkDiscovery/NetbiosNameUtil.ts +146 -0
  539. package/Utils/NetworkDiscovery/RunImportedDeviceNaming.ts +390 -0
  540. package/Utils/NetworkDiscovery/ShortDeviceNamePlanner.ts +291 -0
  541. package/Utils/NetworkDiscovery/ShortHostnameUtil.ts +91 -0
  542. package/Utils/NetworkSite/CidrMatchUtil.ts +37 -12
  543. package/Utils/Project/DataResidency.ts +63 -0
  544. package/Utils/Rules/RuleRunSummary.ts +323 -0
  545. package/Utils/Slo/SloAffectedResourceMarkdown.ts +123 -0
  546. package/Utils/Slo/SloBurnRateTemplate.ts +373 -0
  547. package/Utils/Slo/SloFeedMarkdown.ts +1507 -0
  548. package/Utils/Slo/SloHealth.ts +96 -9
  549. package/Utils/Slo/SloListWidgetFormat.ts +370 -0
  550. package/Utils/Slo/SloMetricType.ts +237 -0
  551. package/Utils/Slo/SloMonitorRuleCriteria.ts +364 -0
  552. package/Utils/Slo/SloMonitorStatusSummary.ts +210 -0
  553. package/Utils/Slo/SloOverviewText.ts +265 -0
  554. package/Utils/Slo/SloProjection.ts +967 -0
  555. package/Utils/Slo/SloWidgetFormat.ts +12 -2
  556. package/Utils/Telemetry/LockedFilterSearch.ts +3 -49
  557. package/build/dist/Models/AnalyticsModels/AuditLog.js +70 -1
  558. package/build/dist/Models/AnalyticsModels/AuditLog.js.map +1 -1
  559. package/build/dist/Models/AnalyticsModels/SecurityEvent.js +4 -4
  560. package/build/dist/Models/DatabaseModels/Alert.js +60 -0
  561. package/build/dist/Models/DatabaseModels/Alert.js.map +1 -1
  562. package/build/dist/Models/DatabaseModels/GlobalConfig.js +1 -1
  563. package/build/dist/Models/DatabaseModels/GlobalConfig.js.map +1 -1
  564. package/build/dist/Models/DatabaseModels/Incident.js +64 -0
  565. package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
  566. package/build/dist/Models/DatabaseModels/IncidentEpisodePublicNote.js +75 -0
  567. package/build/dist/Models/DatabaseModels/IncidentEpisodePublicNote.js.map +1 -1
  568. package/build/dist/Models/DatabaseModels/IncidentPublicNote.js +75 -0
  569. package/build/dist/Models/DatabaseModels/IncidentPublicNote.js.map +1 -1
  570. package/build/dist/Models/DatabaseModels/Index.js +6 -4
  571. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  572. package/build/dist/Models/DatabaseModels/NetworkDevice.js +68 -0
  573. package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
  574. package/build/dist/Models/DatabaseModels/NetworkDeviceDiagnostic.js +772 -0
  575. package/build/dist/Models/DatabaseModels/NetworkDeviceDiagnostic.js.map +1 -0
  576. package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js +140 -0
  577. package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -1
  578. package/build/dist/Models/DatabaseModels/NetworkSiteAssignmentRule.js +1 -1
  579. package/build/dist/Models/DatabaseModels/NetworkSiteAssignmentRule.js.map +1 -1
  580. package/build/dist/Models/DatabaseModels/Project.js +42 -0
  581. package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
  582. package/build/dist/Models/DatabaseModels/ScheduledMaintenancePublicNote.js +75 -0
  583. package/build/dist/Models/DatabaseModels/ScheduledMaintenancePublicNote.js.map +1 -1
  584. package/build/dist/Models/DatabaseModels/SecurityEventConnection.js +11 -11
  585. package/build/dist/Models/DatabaseModels/ServiceLevelObjective.js +192 -10
  586. package/build/dist/Models/DatabaseModels/ServiceLevelObjective.js.map +1 -1
  587. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveBurnRateRule.js +798 -96
  588. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveBurnRateRule.js.map +1 -1
  589. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveFeed.js +596 -0
  590. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveFeed.js.map +1 -0
  591. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveMonitorRule.js +590 -0
  592. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveMonitorRule.js.map +1 -0
  593. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerTeam.js +16 -0
  594. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerTeam.js.map +1 -1
  595. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerUser.js +16 -0
  596. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerUser.js.map +1 -1
  597. package/build/dist/Models/DatabaseModels/StatusPageAnnouncement.js +75 -0
  598. package/build/dist/Models/DatabaseModels/StatusPageAnnouncement.js.map +1 -1
  599. package/build/dist/Models/DatabaseModels/ThreatIntelFeed.js +1 -1
  600. package/build/dist/Server/API/BaseAPI.js +14 -0
  601. package/build/dist/Server/API/BaseAPI.js.map +1 -1
  602. package/build/dist/Server/API/BillingInvoiceAPI.js +233 -19
  603. package/build/dist/Server/API/BillingInvoiceAPI.js.map +1 -1
  604. package/build/dist/Server/API/BillingPaymentMethodAPI.js +86 -5
  605. package/build/dist/Server/API/BillingPaymentMethodAPI.js.map +1 -1
  606. package/build/dist/Server/API/DashboardAPI.js +72 -2
  607. package/build/dist/Server/API/DashboardAPI.js.map +1 -1
  608. package/build/dist/Server/API/SecurityEventConnectionAPI.js +102 -10
  609. package/build/dist/Server/API/SecurityEventConnectionAPI.js.map +1 -1
  610. package/build/dist/Server/API/StatusPageAPI.js +236 -154
  611. package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
  612. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792800000000-AddNetworkDeviceDiagnostic.js +34 -0
  613. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792800000000-AddNetworkDeviceDiagnostic.js.map +1 -0
  614. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792900000000-AddNetworkDeviceDnsNameAndShortDeviceNames.js +24 -0
  615. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792900000000-AddNetworkDeviceDnsNameAndShortDeviceNames.js.map +1 -0
  616. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793000000000-AddNetbiosLookupToNetworkDeviceDiscoveryScan.js +21 -0
  617. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793000000000-AddNetbiosLookupToNetworkDeviceDiscoveryScan.js.map +1 -0
  618. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793100000000-SloProductOverhaul.js +207 -0
  619. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793100000000-SloProductOverhaul.js.map +1 -0
  620. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793200000000-BackfillSloMonitorRulesAndAffectedResources.js +72 -0
  621. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793200000000-BackfillSloMonitorRulesAndAffectedResources.js.map +1 -0
  622. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793300000000-AddDataResidencyToProject.js +20 -0
  623. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793300000000-AddDataResidencyToProject.js.map +1 -0
  624. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793400000000-AddSubscriberUpdateNotificationStatus.js +46 -0
  625. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793400000000-AddSubscriberUpdateNotificationStatus.js.map +1 -0
  626. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +14 -0
  627. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  628. package/build/dist/Server/Services/AlertEpisodeLabelRuleEngineService.js +112 -56
  629. package/build/dist/Server/Services/AlertEpisodeLabelRuleEngineService.js.map +1 -1
  630. package/build/dist/Server/Services/AlertEpisodeOwnerRuleEngineService.js +167 -68
  631. package/build/dist/Server/Services/AlertEpisodeOwnerRuleEngineService.js.map +1 -1
  632. package/build/dist/Server/Services/AlertEpisodePrivacyRuleEngineService.js +87 -26
  633. package/build/dist/Server/Services/AlertEpisodePrivacyRuleEngineService.js.map +1 -1
  634. package/build/dist/Server/Services/AlertLabelRuleEngineService.js +270 -203
  635. package/build/dist/Server/Services/AlertLabelRuleEngineService.js.map +1 -1
  636. package/build/dist/Server/Services/AlertOwnerRuleEngineService.js +498 -354
  637. package/build/dist/Server/Services/AlertOwnerRuleEngineService.js.map +1 -1
  638. package/build/dist/Server/Services/AlertPrivacyRuleEngineService.js +97 -34
  639. package/build/dist/Server/Services/AlertPrivacyRuleEngineService.js.map +1 -1
  640. package/build/dist/Server/Services/AlertService.js +91 -8
  641. package/build/dist/Server/Services/AlertService.js.map +1 -1
  642. package/build/dist/Server/Services/AuditLogService.js +408 -44
  643. package/build/dist/Server/Services/AuditLogService.js.map +1 -1
  644. package/build/dist/Server/Services/BillingInvoiceService.js +94 -85
  645. package/build/dist/Server/Services/BillingInvoiceService.js.map +1 -1
  646. package/build/dist/Server/Services/BillingService.js +406 -14
  647. package/build/dist/Server/Services/BillingService.js.map +1 -1
  648. package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js +141 -92
  649. package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js.map +1 -1
  650. package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js +189 -101
  651. package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js.map +1 -1
  652. package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js +135 -86
  653. package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js.map +1 -1
  654. package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js +189 -100
  655. package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js.map +1 -1
  656. package/build/dist/Server/Services/DashboardLabelRuleEngineService.js +117 -69
  657. package/build/dist/Server/Services/DashboardLabelRuleEngineService.js.map +1 -1
  658. package/build/dist/Server/Services/DashboardOwnerRuleEngineService.js +171 -83
  659. package/build/dist/Server/Services/DashboardOwnerRuleEngineService.js.map +1 -1
  660. package/build/dist/Server/Services/DatabaseService.js +125 -18
  661. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  662. package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js +141 -92
  663. package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js.map +1 -1
  664. package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js +189 -101
  665. package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js.map +1 -1
  666. package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js +145 -91
  667. package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js.map +1 -1
  668. package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js +191 -101
  669. package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js.map +1 -1
  670. package/build/dist/Server/Services/HostLabelRuleEngineService.js +141 -92
  671. package/build/dist/Server/Services/HostLabelRuleEngineService.js.map +1 -1
  672. package/build/dist/Server/Services/HostOwnerRuleEngineService.js +190 -102
  673. package/build/dist/Server/Services/HostOwnerRuleEngineService.js.map +1 -1
  674. package/build/dist/Server/Services/IncidentEpisodeLabelRuleEngineService.js +112 -56
  675. package/build/dist/Server/Services/IncidentEpisodeLabelRuleEngineService.js.map +1 -1
  676. package/build/dist/Server/Services/IncidentEpisodeOwnerRuleEngineService.js +220 -63
  677. package/build/dist/Server/Services/IncidentEpisodeOwnerRuleEngineService.js.map +1 -1
  678. package/build/dist/Server/Services/IncidentEpisodePrivacyRuleEngineService.js +87 -26
  679. package/build/dist/Server/Services/IncidentEpisodePrivacyRuleEngineService.js.map +1 -1
  680. package/build/dist/Server/Services/IncidentEpisodePublicNoteService.js +24 -0
  681. package/build/dist/Server/Services/IncidentEpisodePublicNoteService.js.map +1 -1
  682. package/build/dist/Server/Services/IncidentLabelRuleEngineService.js +258 -192
  683. package/build/dist/Server/Services/IncidentLabelRuleEngineService.js.map +1 -1
  684. package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js +519 -376
  685. package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js.map +1 -1
  686. package/build/dist/Server/Services/IncidentPrivacyRuleEngineService.js +95 -32
  687. package/build/dist/Server/Services/IncidentPrivacyRuleEngineService.js.map +1 -1
  688. package/build/dist/Server/Services/IncidentPublicNoteService.js +24 -0
  689. package/build/dist/Server/Services/IncidentPublicNoteService.js.map +1 -1
  690. package/build/dist/Server/Services/IncidentService.js +90 -5
  691. package/build/dist/Server/Services/IncidentService.js.map +1 -1
  692. package/build/dist/Server/Services/IncomingCallPolicyLabelRuleEngineService.js +113 -65
  693. package/build/dist/Server/Services/IncomingCallPolicyLabelRuleEngineService.js.map +1 -1
  694. package/build/dist/Server/Services/IncomingCallPolicyOwnerRuleEngineService.js +171 -83
  695. package/build/dist/Server/Services/IncomingCallPolicyOwnerRuleEngineService.js.map +1 -1
  696. package/build/dist/Server/Services/Index.js +6 -4
  697. package/build/dist/Server/Services/Index.js.map +1 -1
  698. package/build/dist/Server/Services/IoTFleetLabelRuleEngineService.js +117 -69
  699. package/build/dist/Server/Services/IoTFleetLabelRuleEngineService.js.map +1 -1
  700. package/build/dist/Server/Services/IoTFleetOwnerRuleEngineService.js +171 -83
  701. package/build/dist/Server/Services/IoTFleetOwnerRuleEngineService.js.map +1 -1
  702. package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js +145 -91
  703. package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js.map +1 -1
  704. package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js +191 -101
  705. package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js.map +1 -1
  706. package/build/dist/Server/Services/LabelService.js +20 -25
  707. package/build/dist/Server/Services/LabelService.js.map +1 -1
  708. package/build/dist/Server/Services/MonitorLabelRuleEngineService.js +123 -77
  709. package/build/dist/Server/Services/MonitorLabelRuleEngineService.js.map +1 -1
  710. package/build/dist/Server/Services/MonitorOwnerRuleEngineService.js +167 -82
  711. package/build/dist/Server/Services/MonitorOwnerRuleEngineService.js.map +1 -1
  712. package/build/dist/Server/Services/MonitorProbeService.js +18 -2
  713. package/build/dist/Server/Services/MonitorProbeService.js.map +1 -1
  714. package/build/dist/Server/Services/MonitorService.js +11 -9
  715. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  716. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +287 -5
  717. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
  718. package/build/dist/Server/Services/NetworkDeviceDiagnosticService.js +333 -0
  719. package/build/dist/Server/Services/NetworkDeviceDiagnosticService.js.map +1 -0
  720. package/build/dist/Server/Services/NetworkDeviceLabelRuleEngineService.js +117 -69
  721. package/build/dist/Server/Services/NetworkDeviceLabelRuleEngineService.js.map +1 -1
  722. package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js +171 -83
  723. package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js.map +1 -1
  724. package/build/dist/Server/Services/NetworkDeviceService.js +36 -2
  725. package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
  726. package/build/dist/Server/Services/OnCallDutyPolicyLabelRuleEngineService.js +117 -64
  727. package/build/dist/Server/Services/OnCallDutyPolicyLabelRuleEngineService.js.map +1 -1
  728. package/build/dist/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.js +173 -83
  729. package/build/dist/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.js.map +1 -1
  730. package/build/dist/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.js +116 -65
  731. package/build/dist/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.js.map +1 -1
  732. package/build/dist/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.js +171 -83
  733. package/build/dist/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.js.map +1 -1
  734. package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js +141 -92
  735. package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js.map +1 -1
  736. package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js +189 -101
  737. package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js.map +1 -1
  738. package/build/dist/Server/Services/ProjectService.js +82 -10
  739. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  740. package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js +141 -92
  741. package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js.map +1 -1
  742. package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js +189 -101
  743. package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js.map +1 -1
  744. package/build/dist/Server/Services/RumApplicationLabelRuleEngineService.js +111 -63
  745. package/build/dist/Server/Services/RumApplicationLabelRuleEngineService.js.map +1 -1
  746. package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js +161 -77
  747. package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js.map +1 -1
  748. package/build/dist/Server/Services/RunbookLabelRuleEngineService.js +117 -69
  749. package/build/dist/Server/Services/RunbookLabelRuleEngineService.js.map +1 -1
  750. package/build/dist/Server/Services/RunbookOwnerRuleEngineService.js +171 -83
  751. package/build/dist/Server/Services/RunbookOwnerRuleEngineService.js.map +1 -1
  752. package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js +280 -209
  753. package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js.map +1 -1
  754. package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js +521 -376
  755. package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js.map +1 -1
  756. package/build/dist/Server/Services/ScheduledMaintenancePublicNoteService.js +24 -0
  757. package/build/dist/Server/Services/ScheduledMaintenancePublicNoteService.js.map +1 -1
  758. package/build/dist/Server/Services/ScheduledMaintenanceService.js +24 -8
  759. package/build/dist/Server/Services/ScheduledMaintenanceService.js.map +1 -1
  760. package/build/dist/Server/Services/SecurityEventConnectionService.js +43 -3
  761. package/build/dist/Server/Services/SecurityEventConnectionService.js.map +1 -1
  762. package/build/dist/Server/Services/ServerlessFunctionLabelRuleEngineService.js +115 -62
  763. package/build/dist/Server/Services/ServerlessFunctionLabelRuleEngineService.js.map +1 -1
  764. package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js +163 -77
  765. package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js.map +1 -1
  766. package/build/dist/Server/Services/ServiceLabelRuleEngineService.js +141 -92
  767. package/build/dist/Server/Services/ServiceLabelRuleEngineService.js.map +1 -1
  768. package/build/dist/Server/Services/ServiceLevelObjectiveBurnRateRuleService.js +769 -18
  769. package/build/dist/Server/Services/ServiceLevelObjectiveBurnRateRuleService.js.map +1 -1
  770. package/build/dist/Server/Services/ServiceLevelObjectiveFeedService.js +96 -0
  771. package/build/dist/Server/Services/ServiceLevelObjectiveFeedService.js.map +1 -0
  772. package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.js +614 -87
  773. package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.js.map +1 -1
  774. package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleService.js +844 -0
  775. package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleService.js.map +1 -0
  776. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerTeamService.js +207 -1
  777. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerTeamService.js.map +1 -1
  778. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerUserService.js +221 -1
  779. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerUserService.js.map +1 -1
  780. package/build/dist/Server/Services/ServiceLevelObjectiveService.js +997 -50
  781. package/build/dist/Server/Services/ServiceLevelObjectiveService.js.map +1 -1
  782. package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js +191 -102
  783. package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js.map +1 -1
  784. package/build/dist/Server/Services/StatusPageAnnouncementService.js +12 -0
  785. package/build/dist/Server/Services/StatusPageAnnouncementService.js.map +1 -1
  786. package/build/dist/Server/Services/StatusPageLabelRuleEngineService.js +118 -70
  787. package/build/dist/Server/Services/StatusPageLabelRuleEngineService.js.map +1 -1
  788. package/build/dist/Server/Services/StatusPageOwnerRuleEngineService.js +158 -76
  789. package/build/dist/Server/Services/StatusPageOwnerRuleEngineService.js.map +1 -1
  790. package/build/dist/Server/Services/StatusPageSubscriberNotificationTemplateService.js +19 -215
  791. package/build/dist/Server/Services/StatusPageSubscriberNotificationTemplateService.js.map +1 -1
  792. package/build/dist/Server/Services/StatusPageSubscriberService.js +6 -0
  793. package/build/dist/Server/Services/StatusPageSubscriberService.js.map +1 -1
  794. package/build/dist/Server/Services/TelemetryUsageBillingService.js +27 -5
  795. package/build/dist/Server/Services/TelemetryUsageBillingService.js.map +1 -1
  796. package/build/dist/Server/Services/ThreatIntelFeedService.js +1 -1
  797. package/build/dist/Server/Services/VMwareVCenterLabelRuleEngineService.js +141 -92
  798. package/build/dist/Server/Services/VMwareVCenterLabelRuleEngineService.js.map +1 -1
  799. package/build/dist/Server/Services/VMwareVCenterOwnerRuleEngineService.js +189 -101
  800. package/build/dist/Server/Services/VMwareVCenterOwnerRuleEngineService.js.map +1 -1
  801. package/build/dist/Server/Services/WorkflowLabelRuleEngineService.js +117 -69
  802. package/build/dist/Server/Services/WorkflowLabelRuleEngineService.js.map +1 -1
  803. package/build/dist/Server/Services/WorkflowOwnerRuleEngineService.js +171 -83
  804. package/build/dist/Server/Services/WorkflowOwnerRuleEngineService.js.map +1 -1
  805. package/build/dist/Server/Utils/AI/AlertAIContextBuilder.js +17 -0
  806. package/build/dist/Server/Utils/AI/AlertAIContextBuilder.js.map +1 -1
  807. package/build/dist/Server/Utils/AI/IncidentAIContextBuilder.js +31 -0
  808. package/build/dist/Server/Utils/AI/IncidentAIContextBuilder.js.map +1 -1
  809. package/build/dist/Server/Utils/AI/Toolbox/AlertTools.js +24 -1
  810. package/build/dist/Server/Utils/AI/Toolbox/AlertTools.js.map +1 -1
  811. package/build/dist/Server/Utils/AI/Toolbox/IncidentTools.js +21 -1
  812. package/build/dist/Server/Utils/AI/Toolbox/IncidentTools.js.map +1 -1
  813. package/build/dist/Server/Utils/AI/Toolbox/SloTools.js +337 -53
  814. package/build/dist/Server/Utils/AI/Toolbox/SloTools.js.map +1 -1
  815. package/build/dist/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.js +108 -15
  816. package/build/dist/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.js.map +1 -1
  817. package/build/dist/Server/Utils/Dashboard/PublicDashboardSloHistoryPolicy.js +2 -2
  818. package/build/dist/Server/Utils/Dashboard/PublicDashboardSloHistoryPolicy.js.map +1 -1
  819. package/build/dist/Server/Utils/Dashboard/PublicDashboardSloWidget.js +115 -6
  820. package/build/dist/Server/Utils/Dashboard/PublicDashboardSloWidget.js.map +1 -1
  821. package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js +13 -0
  822. package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js.map +1 -1
  823. package/build/dist/Server/Utils/Database/RelationValueUtil.js +82 -0
  824. package/build/dist/Server/Utils/Database/RelationValueUtil.js.map +1 -0
  825. package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js +10 -6
  826. package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js.map +1 -1
  827. package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js +17 -21
  828. package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js.map +1 -1
  829. package/build/dist/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.js +5 -4
  830. package/build/dist/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.js.map +1 -1
  831. package/build/dist/Server/Utils/Monitor/MonitorStepsProjectValidator.js +50 -10
  832. package/build/dist/Server/Utils/Monitor/MonitorStepsProjectValidator.js.map +1 -1
  833. package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js +13 -1
  834. package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js.map +1 -1
  835. package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js +6 -10
  836. package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js.map +1 -1
  837. package/build/dist/Server/Utils/Rules/MonitorRulePatternValidator.js +34 -0
  838. package/build/dist/Server/Utils/Rules/MonitorRulePatternValidator.js.map +1 -0
  839. package/build/dist/Server/Utils/Rules/OwnerRuleAssignment.js +69 -0
  840. package/build/dist/Server/Utils/Rules/OwnerRuleAssignment.js.map +1 -0
  841. package/build/dist/Server/Utils/Rules/RuleRun/RuleApplication.js +25 -0
  842. package/build/dist/Server/Utils/Rules/RuleRun/RuleApplication.js.map +1 -0
  843. package/build/dist/Server/Utils/Rules/RuleRun/RuleRunPermission.js +128 -0
  844. package/build/dist/Server/Utils/Rules/RuleRun/RuleRunPermission.js.map +1 -0
  845. package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js +746 -0
  846. package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js.map +1 -0
  847. package/build/dist/Server/Utils/Rules/RuleRun/RuleRunner.js +221 -0
  848. package/build/dist/Server/Utils/Rules/RuleRun/RuleRunner.js.map +1 -0
  849. package/build/dist/Server/Utils/SecurityEvent/ConnectorErrorMessage.js +3 -2
  850. package/build/dist/Server/Utils/SecurityEvent/ConnectorErrorMessage.js.map +1 -1
  851. package/build/dist/Server/Utils/SecurityEvent/Connectors/ConnectorPlatformHealth.js +6 -4
  852. package/build/dist/Server/Utils/SecurityEvent/Connectors/ConnectorPlatformHealth.js.map +1 -1
  853. package/build/dist/Server/Utils/SecurityEvent/{GoogleSecOps → Connectors/GoogleSecOps}/GoogleSecOpsClient.js +174 -14
  854. package/build/dist/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsClient.js.map +1 -0
  855. package/build/dist/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnector.js +1417 -0
  856. package/build/dist/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnector.js.map +1 -0
  857. package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionPoller.js +138 -18
  858. package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionPoller.js.map +1 -1
  859. package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionRunExecutor.js +1 -2
  860. package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionRunExecutor.js.map +1 -1
  861. package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionTester.js +23 -18
  862. package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionTester.js.map +1 -1
  863. package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectorRegistry.js +2 -0
  864. package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectorRegistry.js.map +1 -1
  865. package/build/dist/Server/Utils/SecurityEvent/Connectors/Types.js +95 -0
  866. package/build/dist/Server/Utils/SecurityEvent/Connectors/Types.js.map +1 -1
  867. package/build/dist/Server/Utils/SecurityEvent/DetectionRuleEvaluator.js +1 -1
  868. package/build/dist/Server/Utils/SecurityEvent/SecurityEventDedupe.js +3 -3
  869. package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.js +2 -2
  870. package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js +118 -40
  871. package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js.map +1 -1
  872. package/build/dist/Server/Utils/Slo/SloFeedUtil.js +150 -0
  873. package/build/dist/Server/Utils/Slo/SloFeedUtil.js.map +1 -0
  874. package/build/dist/Server/Utils/Slo/SloLegacyMonitorLabelAdoption.js +136 -0
  875. package/build/dist/Server/Utils/Slo/SloLegacyMonitorLabelAdoption.js.map +1 -0
  876. package/build/dist/Server/Utils/Slo/SloMetricUtil.js +269 -0
  877. package/build/dist/Server/Utils/Slo/SloMetricUtil.js.map +1 -0
  878. package/build/dist/Server/Utils/Slo/SloOwnerReferenceValidator.js +134 -0
  879. package/build/dist/Server/Utils/Slo/SloOwnerReferenceValidator.js.map +1 -0
  880. package/build/dist/Server/Utils/Slo/SloRecordReferenceValidator.js +137 -0
  881. package/build/dist/Server/Utils/Slo/SloRecordReferenceValidator.js.map +1 -0
  882. package/build/dist/Server/Utils/StatusPage/MonitorRulePatternValidator.js +6 -26
  883. package/build/dist/Server/Utils/StatusPage/MonitorRulePatternValidator.js.map +1 -1
  884. package/build/dist/Server/Utils/StatusPageResource.js +31 -5
  885. package/build/dist/Server/Utils/StatusPageResource.js.map +1 -1
  886. package/build/dist/Types/Billing/SubscriptionStatus.js +37 -3
  887. package/build/dist/Types/Billing/SubscriptionStatus.js.map +1 -1
  888. package/build/dist/Types/Dashboard/DashboardComponentType.js +1 -0
  889. package/build/dist/Types/Dashboard/DashboardComponentType.js.map +1 -1
  890. package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js +5 -0
  891. package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js.map +1 -1
  892. package/build/dist/Types/Dashboard/DashboardComponents/DashboardSloListComponent.js +2 -0
  893. package/build/dist/Types/Dashboard/DashboardComponents/DashboardSloListComponent.js.map +1 -0
  894. package/build/dist/Types/Dashboard/DashboardTemplates.js +275 -286
  895. package/build/dist/Types/Dashboard/DashboardTemplates.js.map +1 -1
  896. package/build/dist/Types/Database/EnableAuditLog.js +19 -1
  897. package/build/dist/Types/Database/EnableAuditLog.js.map +1 -1
  898. package/build/dist/Types/Email/EmailTemplateType.js +4 -0
  899. package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
  900. package/build/dist/Types/Monitor/CriteriaFilter.js +45 -6
  901. package/build/dist/Types/Monitor/CriteriaFilter.js.map +1 -1
  902. package/build/dist/Types/Monitor/MonitorStep.js +2 -0
  903. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  904. package/build/dist/Types/Monitor/MonitorStepDnsMonitor.js +3 -1
  905. package/build/dist/Types/Monitor/MonitorStepDnsMonitor.js.map +1 -1
  906. package/build/dist/Types/Monitor/MonitorStepDnssecMonitor.js +3 -1
  907. package/build/dist/Types/Monitor/MonitorStepDnssecMonitor.js.map +1 -1
  908. package/build/dist/Types/Monitor/MonitorStepDomainMonitor.js +3 -1
  909. package/build/dist/Types/Monitor/MonitorStepDomainMonitor.js.map +1 -1
  910. package/build/dist/Types/Monitor/MonitorStepExternalStatusPageMonitor.js +3 -1
  911. package/build/dist/Types/Monitor/MonitorStepExternalStatusPageMonitor.js.map +1 -1
  912. package/build/dist/Types/Monitor/MonitorStepRetries.js +47 -0
  913. package/build/dist/Types/Monitor/MonitorStepRetries.js.map +1 -0
  914. package/build/dist/Types/Monitor/MonitorStepSnmpMonitor.js +3 -1
  915. package/build/dist/Types/Monitor/MonitorStepSnmpMonitor.js.map +1 -1
  916. package/build/dist/Types/NetworkDevice/NetworkDeviceDiagnosticResult.js +29 -0
  917. package/build/dist/Types/NetworkDevice/NetworkDeviceDiagnosticResult.js.map +1 -0
  918. package/build/dist/Types/NetworkDevice/NetworkDeviceDiagnosticStatus.js +37 -0
  919. package/build/dist/Types/NetworkDevice/NetworkDeviceDiagnosticStatus.js.map +1 -0
  920. package/build/dist/Types/NetworkDevice/NetworkDeviceDiagnosticType.js +42 -0
  921. package/build/dist/Types/NetworkDevice/NetworkDeviceDiagnosticType.js.map +1 -0
  922. package/build/dist/Types/NetworkDevice/NetworkDevicePingMetricNames.js +20 -0
  923. package/build/dist/Types/NetworkDevice/NetworkDevicePingMetricNames.js.map +1 -0
  924. package/build/dist/Types/Permission.js +114 -0
  925. package/build/dist/Types/Permission.js.map +1 -1
  926. package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js +5 -0
  927. package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js.map +1 -1
  928. package/build/dist/Types/Rules/RuleRun.js +267 -0
  929. package/build/dist/Types/Rules/RuleRun.js.map +1 -0
  930. package/build/dist/Types/Rum/SessionReplayApi.js.map +1 -1
  931. package/build/dist/Types/SecurityEvent/Connectors/ConnectorDiagnostics.js.map +1 -1
  932. package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectionDiagnostics.js +16 -1
  933. package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectionDiagnostics.js.map +1 -1
  934. package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.js +65 -0
  935. package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.js.map +1 -1
  936. package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectorProvider.js +6 -2
  937. package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectorProvider.js.map +1 -1
  938. package/build/dist/Types/ServiceLevelObjective/SloHistoryMetricName.js +26 -0
  939. package/build/dist/Types/ServiceLevelObjective/SloHistoryMetricName.js.map +1 -0
  940. package/build/dist/Types/ServiceLevelObjective/SloMetricType.js +45 -0
  941. package/build/dist/Types/ServiceLevelObjective/SloMetricType.js.map +1 -0
  942. package/build/dist/Types/StatusPage/StatusPageSubscriberNotificationEventType.js +4 -0
  943. package/build/dist/Types/StatusPage/StatusPageSubscriberNotificationEventType.js.map +1 -1
  944. package/build/dist/Types/StatusPage/SubscriberNotificationTemplateVariables.js +295 -0
  945. package/build/dist/Types/StatusPage/SubscriberNotificationTemplateVariables.js.map +1 -0
  946. package/build/dist/Types/StatusPage/SubscriberNotificationTrigger.js +13 -0
  947. package/build/dist/Types/StatusPage/SubscriberNotificationTrigger.js.map +1 -0
  948. package/build/dist/Types/StatusPage/SubscriberUpdateNotification.js +67 -0
  949. package/build/dist/Types/StatusPage/SubscriberUpdateNotification.js.map +1 -0
  950. package/build/dist/Types/Telemetry/LockedFilterDetail.js +7 -7
  951. package/build/dist/Types/Telemetry/ServiceType.js +7 -0
  952. package/build/dist/Types/Telemetry/ServiceType.js.map +1 -1
  953. package/build/dist/UI/Components/AlertBanner/AlertBanner.js +48 -19
  954. package/build/dist/UI/Components/AlertBanner/AlertBanner.js.map +1 -1
  955. package/build/dist/UI/Components/BulkUpdate/BulkArchiveActions.js +10 -2
  956. package/build/dist/UI/Components/BulkUpdate/BulkArchiveActions.js.map +1 -1
  957. package/build/dist/UI/Components/Detail/Detail.js +12 -3
  958. package/build/dist/UI/Components/Detail/Detail.js.map +1 -1
  959. package/build/dist/UI/Components/Dropdown/Dropdown.js +33 -5
  960. package/build/dist/UI/Components/Dropdown/Dropdown.js.map +1 -1
  961. package/build/dist/UI/Components/EmptyState/EmptyState.js +3 -3
  962. package/build/dist/UI/Components/EmptyState/EmptyState.js.map +1 -1
  963. package/build/dist/UI/Components/EmptyState/EmptyStateGuideLinks.js +47 -0
  964. package/build/dist/UI/Components/EmptyState/EmptyStateGuideLinks.js.map +1 -0
  965. package/build/dist/UI/Components/Forms/ModelForm.js +6 -5
  966. package/build/dist/UI/Components/Forms/ModelForm.js.map +1 -1
  967. package/build/dist/UI/Components/LabelRule/LabelRuleTable.js +6 -2
  968. package/build/dist/UI/Components/LabelRule/LabelRuleTable.js.map +1 -1
  969. package/build/dist/UI/Components/LogsViewer/LogsViewer.js +1 -1
  970. package/build/dist/UI/Components/LogsViewer/LogsViewer.js.map +1 -1
  971. package/build/dist/UI/Components/LogsViewer/components/ActiveFilterChips.js +0 -2
  972. package/build/dist/UI/Components/LogsViewer/components/ActiveFilterChips.js.map +1 -1
  973. package/build/dist/UI/Components/MoreMenu/MoreMenu.js +3 -1
  974. package/build/dist/UI/Components/MoreMenu/MoreMenu.js.map +1 -1
  975. package/build/dist/UI/Components/RuleRun/RuleDetailFields.js +226 -0
  976. package/build/dist/UI/Components/RuleRun/RuleDetailFields.js.map +1 -0
  977. package/build/dist/UI/Components/RuleRun/RuleTable.js +97 -0
  978. package/build/dist/UI/Components/RuleRun/RuleTable.js.map +1 -0
  979. package/build/dist/UI/Components/RuleRun/RuleView.js +83 -0
  980. package/build/dist/UI/Components/RuleRun/RuleView.js.map +1 -0
  981. package/build/dist/UI/Components/RuleRun/RunRuleNowModal.js +74 -0
  982. package/build/dist/UI/Components/RuleRun/RunRuleNowModal.js.map +1 -0
  983. package/build/dist/UI/Components/RuleRun/RunRulesBulkAction.js +78 -0
  984. package/build/dist/UI/Components/RuleRun/RunRulesBulkAction.js.map +1 -0
  985. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js +1 -1
  986. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js.map +1 -1
  987. package/build/dist/UI/Components/TelemetryViewer/components/LockedFilterChip.js +24 -50
  988. package/build/dist/UI/Components/TelemetryViewer/components/LockedFilterChip.js.map +1 -1
  989. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryActiveFilterChips.js +0 -4
  990. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryActiveFilterChips.js.map +1 -1
  991. package/build/dist/UI/Utils/Rules/RuleRunClient.js +98 -0
  992. package/build/dist/UI/Utils/Rules/RuleRunClient.js.map +1 -0
  993. package/build/dist/UI/Utils/Telemetry/TelemetryEntityNames.js +8 -0
  994. package/build/dist/UI/Utils/Telemetry/TelemetryEntityNames.js.map +1 -1
  995. package/build/dist/Utils/Dashboard/Components/DashboardSloComponent.js +16 -2
  996. package/build/dist/Utils/Dashboard/Components/DashboardSloComponent.js.map +1 -1
  997. package/build/dist/Utils/Dashboard/Components/DashboardSloListComponent.js +94 -0
  998. package/build/dist/Utils/Dashboard/Components/DashboardSloListComponent.js.map +1 -0
  999. package/build/dist/Utils/Dashboard/Components/Index.js +4 -0
  1000. package/build/dist/Utils/Dashboard/Components/Index.js.map +1 -1
  1001. package/build/dist/Utils/Dashboard/SloWidgetSource.js +125 -0
  1002. package/build/dist/Utils/Dashboard/SloWidgetSource.js.map +1 -0
  1003. package/build/dist/Utils/Markdown/MarkdownEscape.js +49 -0
  1004. package/build/dist/Utils/Markdown/MarkdownEscape.js.map +1 -0
  1005. package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js +112 -34
  1006. package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js.map +1 -1
  1007. package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js +22 -0
  1008. package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js.map +1 -1
  1009. package/build/dist/Utils/NetworkDiscovery/NetbiosNameUtil.js +129 -0
  1010. package/build/dist/Utils/NetworkDiscovery/NetbiosNameUtil.js.map +1 -0
  1011. package/build/dist/Utils/NetworkDiscovery/RunImportedDeviceNaming.js +255 -0
  1012. package/build/dist/Utils/NetworkDiscovery/RunImportedDeviceNaming.js.map +1 -0
  1013. package/build/dist/Utils/NetworkDiscovery/ShortDeviceNamePlanner.js +184 -0
  1014. package/build/dist/Utils/NetworkDiscovery/ShortDeviceNamePlanner.js.map +1 -0
  1015. package/build/dist/Utils/NetworkDiscovery/ShortHostnameUtil.js +79 -0
  1016. package/build/dist/Utils/NetworkDiscovery/ShortHostnameUtil.js.map +1 -0
  1017. package/build/dist/Utils/NetworkSite/CidrMatchUtil.js +21 -12
  1018. package/build/dist/Utils/NetworkSite/CidrMatchUtil.js.map +1 -1
  1019. package/build/dist/Utils/Project/DataResidency.js +51 -0
  1020. package/build/dist/Utils/Project/DataResidency.js.map +1 -0
  1021. package/build/dist/Utils/Rules/RuleRunSummary.js +197 -0
  1022. package/build/dist/Utils/Rules/RuleRunSummary.js.map +1 -0
  1023. package/build/dist/Utils/Slo/SloAffectedResourceMarkdown.js +51 -0
  1024. package/build/dist/Utils/Slo/SloAffectedResourceMarkdown.js.map +1 -0
  1025. package/build/dist/Utils/Slo/SloBurnRateTemplate.js +228 -0
  1026. package/build/dist/Utils/Slo/SloBurnRateTemplate.js.map +1 -0
  1027. package/build/dist/Utils/Slo/SloFeedMarkdown.js +934 -0
  1028. package/build/dist/Utils/Slo/SloFeedMarkdown.js.map +1 -0
  1029. package/build/dist/Utils/Slo/SloHealth.js +75 -9
  1030. package/build/dist/Utils/Slo/SloHealth.js.map +1 -1
  1031. package/build/dist/Utils/Slo/SloListWidgetFormat.js +217 -0
  1032. package/build/dist/Utils/Slo/SloListWidgetFormat.js.map +1 -0
  1033. package/build/dist/Utils/Slo/SloMetricType.js +212 -0
  1034. package/build/dist/Utils/Slo/SloMetricType.js.map +1 -0
  1035. package/build/dist/Utils/Slo/SloMonitorRuleCriteria.js +216 -0
  1036. package/build/dist/Utils/Slo/SloMonitorRuleCriteria.js.map +1 -0
  1037. package/build/dist/Utils/Slo/SloMonitorStatusSummary.js +129 -0
  1038. package/build/dist/Utils/Slo/SloMonitorStatusSummary.js.map +1 -0
  1039. package/build/dist/Utils/Slo/SloOverviewText.js +110 -0
  1040. package/build/dist/Utils/Slo/SloOverviewText.js.map +1 -0
  1041. package/build/dist/Utils/Slo/SloProjection.js +448 -0
  1042. package/build/dist/Utils/Slo/SloProjection.js.map +1 -0
  1043. package/build/dist/Utils/Slo/SloWidgetFormat.js +4 -2
  1044. package/build/dist/Utils/Slo/SloWidgetFormat.js.map +1 -1
  1045. package/build/dist/Utils/Telemetry/LockedFilterSearch.js +1 -26
  1046. package/build/dist/Utils/Telemetry/LockedFilterSearch.js.map +1 -1
  1047. package/package.json +1 -1
  1048. package/Models/DatabaseModels/GoogleSecOpsConnection.ts +0 -447
  1049. package/Models/DatabaseModels/GoogleSecOpsConnectionRun.ts +0 -263
  1050. package/Server/API/GoogleSecOpsConnectionAPI.ts +0 -320
  1051. package/Server/Services/GoogleSecOpsConnectionRunService.ts +0 -10
  1052. package/Server/Services/GoogleSecOpsConnectionService.ts +0 -116
  1053. package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsConnectionTester.ts +0 -777
  1054. package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.ts +0 -1373
  1055. package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.ts +0 -512
  1056. package/Tests/App/Dashboard/GoogleSecOpsConnectionForm.test.tsx +0 -838
  1057. package/Tests/App/Dashboard/GoogleSecOpsConnectionsErrors.test.tsx +0 -441
  1058. package/Tests/App/Dashboard/GoogleSecOpsDiagnostics.test.tsx +0 -1001
  1059. package/Tests/Server/API/GoogleSecOpsConnectionAPI.test.ts +0 -657
  1060. package/Tests/Server/Services/GoogleSecOpsDiagnosticsModel.test.ts +0 -153
  1061. package/Tests/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsConnectionTester.test.ts +0 -784
  1062. package/Tests/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.test.ts +0 -823
  1063. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsDiagnostics.test.ts +0 -918
  1064. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPoller.test.ts +0 -738
  1065. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPollerFailureTaxonomy.test.ts +0 -874
  1066. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPollerHardening.test.ts +0 -1297
  1067. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsThreePassPoller.test.ts +0 -1577
  1068. package/Tests/UI/Components/LockedFilterActions.test.tsx +0 -396
  1069. package/Types/SecurityEvent/GoogleSecOpsDiagnostics.ts +0 -111
  1070. package/UI/Components/TelemetryViewer/components/LockedFilterActions.tsx +0 -205
  1071. package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js +0 -478
  1072. package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js.map +0 -1
  1073. package/build/dist/Models/DatabaseModels/GoogleSecOpsConnectionRun.js +0 -287
  1074. package/build/dist/Models/DatabaseModels/GoogleSecOpsConnectionRun.js.map +0 -1
  1075. package/build/dist/Server/API/GoogleSecOpsConnectionAPI.js +0 -231
  1076. package/build/dist/Server/API/GoogleSecOpsConnectionAPI.js.map +0 -1
  1077. package/build/dist/Server/Services/GoogleSecOpsConnectionRunService.js +0 -9
  1078. package/build/dist/Server/Services/GoogleSecOpsConnectionRunService.js.map +0 -1
  1079. package/build/dist/Server/Services/GoogleSecOpsConnectionService.js +0 -70
  1080. package/build/dist/Server/Services/GoogleSecOpsConnectionService.js.map +0 -1
  1081. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient.js.map +0 -1
  1082. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsConnectionTester.js +0 -537
  1083. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsConnectionTester.js.map +0 -1
  1084. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js +0 -1034
  1085. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js.map +0 -1
  1086. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.js +0 -410
  1087. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.js.map +0 -1
  1088. package/build/dist/Types/SecurityEvent/GoogleSecOpsDiagnostics.js +0 -2
  1089. package/build/dist/Types/SecurityEvent/GoogleSecOpsDiagnostics.js.map +0 -1
  1090. package/build/dist/UI/Components/TelemetryViewer/components/LockedFilterActions.js +0 -88
  1091. package/build/dist/UI/Components/TelemetryViewer/components/LockedFilterActions.js.map +0 -1
@@ -0,0 +1,1507 @@
1
+ import SloStatus from "../../Types/ServiceLevelObjective/SloStatus";
2
+ import SloWindowType from "../../Types/ServiceLevelObjective/SloWindowType";
3
+ import { escapeMarkdownInline } from "../Markdown/MarkdownEscape";
4
+
5
+ /*
6
+ * The words of the SLO feed.
7
+ *
8
+ * Every SLO feed item is written by server code - the SLO service hooks, the
9
+ * burn rate rule service and the evaluation worker - but what it SAYS lives
10
+ * here, in one module with no database, React or window import, for two
11
+ * reasons:
12
+ *
13
+ * - Safety. Feed items render without the markdown viewer's safe mode, and
14
+ * almost every value in them is user-controlled: SLO, monitor, rule, label
15
+ * and status names, descriptions, timezones. Everything that is not a
16
+ * number we computed goes through escapeMarkdownInline exactly once, here,
17
+ * so no caller can forget to and no caller can do it twice.
18
+ *
19
+ * - Change detection. "What changed" is decided by comparing a row read
20
+ * before an update with the row read after it. That comparison has to
21
+ * agree with how the value is shown ("99.9%" -> "99.9%" is not a change,
22
+ * a label set in a different order is not a change), so the diff and the
23
+ * formatting sit side by side and are unit-tested together.
24
+ */
25
+
26
+ export const SLO_FEED_NOT_SET_TEXT: string = "_not set_";
27
+ export const SLO_FEED_NONE_TEXT: string = "_none_";
28
+
29
+ /*
30
+ * A description is free text of any length; the feed is a timeline, not an
31
+ * editor. Long values are cut here and the full text stays one click away on
32
+ * the SLO itself.
33
+ */
34
+ const MAX_INLINE_TEXT_LENGTH: number = 160;
35
+
36
+ // Names listed inline in a single "Labels: a, b, c" style value.
37
+ const MAX_LISTED_NAMES: number = 10;
38
+
39
+ // Monitors named in the one-line summary of an attach/detach item.
40
+ const MAX_SUMMARY_MONITORS: number = 3;
41
+
42
+ // Monitors listed in More Information before collapsing into "and N more".
43
+ const MAX_DETAIL_MONITORS: number = 50;
44
+
45
+ export type SloFeedRow = Record<string, unknown>;
46
+
47
+ export interface SloFeedMarkdown {
48
+ feedInfoInMarkdown: string;
49
+ moreInformationInMarkdown: string;
50
+ }
51
+
52
+ /*
53
+ * ---------------------------------------------------------------------------
54
+ * Numbers and durations
55
+ * ---------------------------------------------------------------------------
56
+ */
57
+
58
+ export type FormatSloFeedNumberFunction = (
59
+ value: number,
60
+ maximumFractionDigits?: number,
61
+ ) => string;
62
+
63
+ /*
64
+ * Rounds for reading, never for deciding. "-0" is folded into "0" because a
65
+ * budget that rounds to zero is not "negative zero percent" to anybody.
66
+ */
67
+ export const formatSloFeedNumber: FormatSloFeedNumberFunction = (
68
+ value: number,
69
+ maximumFractionDigits: number = 2,
70
+ ): string => {
71
+ if (!Number.isFinite(value)) {
72
+ return "0";
73
+ }
74
+
75
+ const factor: number = Math.pow(10, maximumFractionDigits);
76
+ const rounded: number = Math.round(value * factor) / factor;
77
+
78
+ return (Object.is(rounded, -0) ? 0 : rounded).toString();
79
+ };
80
+
81
+ export type FormatSloFeedPercentFunction = (
82
+ value: number,
83
+ maximumFractionDigits?: number,
84
+ ) => string;
85
+
86
+ export const formatSloFeedPercent: FormatSloFeedPercentFunction = (
87
+ value: number,
88
+ maximumFractionDigits: number = 2,
89
+ ): string => {
90
+ return `${formatSloFeedNumber(value, maximumFractionDigits)}%`;
91
+ };
92
+
93
+ type PluralizeFunction = (count: string, singular: string) => string;
94
+
95
+ const pluralize: PluralizeFunction = (
96
+ count: string,
97
+ singular: string,
98
+ ): string => {
99
+ return `${count} ${count === "1" ? singular : `${singular}s`}`;
100
+ };
101
+
102
+ export type FormatSloFeedMinutesFunction = (minutes: number) => string;
103
+
104
+ /*
105
+ * Burn rate windows are stored in minutes but thought about in hours and days
106
+ * ("1 hour", "6 hours"), so a whole number of hours or days is shown as one.
107
+ */
108
+ export const formatSloFeedMinutes: FormatSloFeedMinutesFunction = (
109
+ minutes: number,
110
+ ): string => {
111
+ if (!Number.isFinite(minutes)) {
112
+ return SLO_FEED_NOT_SET_TEXT;
113
+ }
114
+
115
+ if (minutes !== 0 && minutes % 1440 === 0) {
116
+ return pluralize(formatSloFeedNumber(minutes / 1440), "day");
117
+ }
118
+
119
+ if (minutes !== 0 && minutes % 60 === 0) {
120
+ return pluralize(formatSloFeedNumber(minutes / 60), "hour");
121
+ }
122
+
123
+ return pluralize(formatSloFeedNumber(minutes), "minute");
124
+ };
125
+
126
+ export type FormatSloFeedDurationFunction = (seconds: number) => string;
127
+
128
+ /*
129
+ * An error budget in the unit a person would say it in: seconds only when it
130
+ * really is seconds, minutes up to two hours, then hours, then days. The sign
131
+ * is dropped - callers say "remaining" or "over budget" around it.
132
+ */
133
+ export const formatSloFeedDuration: FormatSloFeedDurationFunction = (
134
+ seconds: number,
135
+ ): string => {
136
+ const absoluteSeconds: number = Number.isFinite(seconds)
137
+ ? Math.abs(seconds)
138
+ : 0;
139
+
140
+ if (absoluteSeconds < 60) {
141
+ return pluralize(formatSloFeedNumber(absoluteSeconds, 0), "second");
142
+ }
143
+
144
+ if (absoluteSeconds < 2 * 60 * 60) {
145
+ return pluralize(formatSloFeedNumber(absoluteSeconds / 60, 0), "minute");
146
+ }
147
+
148
+ if (absoluteSeconds < 48 * 60 * 60) {
149
+ return pluralize(formatSloFeedNumber(absoluteSeconds / 3600, 1), "hour");
150
+ }
151
+
152
+ return pluralize(formatSloFeedNumber(absoluteSeconds / 86400, 1), "day");
153
+ };
154
+
155
+ /*
156
+ * ---------------------------------------------------------------------------
157
+ * Text and relations
158
+ * ---------------------------------------------------------------------------
159
+ */
160
+
161
+ export type FormatSloFeedTextFunction = (
162
+ value: unknown,
163
+ maximumLength?: number,
164
+ ) => string;
165
+
166
+ /*
167
+ * User text for the middle of a sentence: escaped, trimmed, and cut at a
168
+ * length a timeline can carry. Cutting happens BEFORE escaping so an escape
169
+ * sequence can never be split in half and leave a dangling backslash.
170
+ */
171
+ export const formatSloFeedText: FormatSloFeedTextFunction = (
172
+ value: unknown,
173
+ maximumLength: number = MAX_INLINE_TEXT_LENGTH,
174
+ ): string => {
175
+ if (value === undefined || value === null) {
176
+ return "";
177
+ }
178
+
179
+ const text: string = String(value).replace(/\s+/g, " ").trim();
180
+
181
+ if (text.length <= maximumLength) {
182
+ return escapeMarkdownInline(text);
183
+ }
184
+
185
+ return `${escapeMarkdownInline(text.substring(0, maximumLength).trimEnd())}…`;
186
+ };
187
+
188
+ type NormalizeIdFunction = (value: string) => string | null;
189
+
190
+ /*
191
+ * Ids are uuids, and Postgres hands them back lower-case whatever case an API
192
+ * caller wrote them in - so "the same monitor" must compare equal across both.
193
+ */
194
+ const normalizeId: NormalizeIdFunction = (value: string): string | null => {
195
+ const id: string = value.trim().toLowerCase();
196
+
197
+ return id && id !== "[object object]" ? id : null;
198
+ };
199
+
200
+ type ToIdStringFunction = (value: unknown) => string | null;
201
+
202
+ const toIdString: ToIdStringFunction = (value: unknown): string | null => {
203
+ if (value === undefined || value === null) {
204
+ return null;
205
+ }
206
+
207
+ if (typeof value === "object") {
208
+ const record: Record<string, unknown> = value as Record<string, unknown>;
209
+
210
+ // A model row (`_id` string / `id` ObjectID) or a `{ _id }` payload stub.
211
+ if (record["_id"] !== undefined && record["_id"] !== null) {
212
+ return normalizeId(String(record["_id"]));
213
+ }
214
+
215
+ if (record["id"] !== undefined && record["id"] !== null) {
216
+ return normalizeId(String(record["id"]));
217
+ }
218
+ }
219
+
220
+ // A bare id string, or an ObjectID whose toString is the id.
221
+ return normalizeId(String(value));
222
+ };
223
+
224
+ export type GetSloFeedEntityIdsFunction = (value: unknown) => Array<string>;
225
+
226
+ /*
227
+ * The ids in a many-to-many value, whatever shape it arrived in: model rows
228
+ * read from the database, `{ _id }` stubs from the dashboard form, bare id
229
+ * strings or ObjectIDs from the API. Sorted and de-duplicated, so two sets
230
+ * that differ only in order compare equal.
231
+ */
232
+ export const getSloFeedEntityIds: GetSloFeedEntityIdsFunction = (
233
+ value: unknown,
234
+ ): Array<string> => {
235
+ if (!Array.isArray(value)) {
236
+ return [];
237
+ }
238
+
239
+ const ids: Set<string> = new Set<string>();
240
+
241
+ for (const item of value) {
242
+ const id: string | null = toIdString(item);
243
+
244
+ if (id) {
245
+ ids.add(id);
246
+ }
247
+ }
248
+
249
+ return Array.from(ids).sort();
250
+ };
251
+
252
+ type GetEntityNameFunction = (item: unknown) => string;
253
+
254
+ const getEntityName: GetEntityNameFunction = (item: unknown): string => {
255
+ if (!item || typeof item !== "object") {
256
+ return "";
257
+ }
258
+
259
+ const record: Record<string, unknown> = item as Record<string, unknown>;
260
+
261
+ // User.name is a Name value object, Label.name a string - both stringify.
262
+ for (const key of ["name", "email"]) {
263
+ const candidate: unknown = record[key];
264
+
265
+ if (candidate !== undefined && candidate !== null) {
266
+ const text: string = String(candidate).trim();
267
+
268
+ if (text) {
269
+ return text;
270
+ }
271
+ }
272
+ }
273
+
274
+ return "";
275
+ };
276
+
277
+ export type FormatSloFeedEntityNamesFunction = (value: unknown) => string;
278
+
279
+ /*
280
+ * "Production, Tier 1" for a label set, alphabetical so the before and after
281
+ * of an unchanged set read identically. A related row whose name could not be
282
+ * read is still counted rather than silently dropped.
283
+ */
284
+ export const formatSloFeedEntityNames: FormatSloFeedEntityNamesFunction = (
285
+ value: unknown,
286
+ ): string => {
287
+ if (!Array.isArray(value) || value.length === 0) {
288
+ return SLO_FEED_NONE_TEXT;
289
+ }
290
+
291
+ const names: Array<string> = value
292
+ .map((item: unknown): string => {
293
+ return getEntityName(item) || "Unnamed";
294
+ })
295
+ .sort((a: string, b: string): number => {
296
+ return a.localeCompare(b);
297
+ });
298
+
299
+ const listed: Array<string> = names
300
+ .slice(0, MAX_LISTED_NAMES)
301
+ .map((name: string): string => {
302
+ return formatSloFeedText(name, 80);
303
+ });
304
+
305
+ const remaining: number = names.length - listed.length;
306
+
307
+ return remaining > 0
308
+ ? `${listed.join(", ")} and ${remaining} more`
309
+ : listed.join(", ");
310
+ };
311
+
312
+ export type NormalizeSloFeedBooleanFunction = (
313
+ value: unknown,
314
+ ) => boolean | null;
315
+
316
+ /*
317
+ * The CRUD API does not coerce Boolean columns, so "false" can reach a hook as
318
+ * a string. Anything that is not recognisably true or false is "not set".
319
+ */
320
+ export const normalizeSloFeedBoolean: NormalizeSloFeedBooleanFunction = (
321
+ value: unknown,
322
+ ): boolean | null => {
323
+ if (value === true || value === false) {
324
+ return value;
325
+ }
326
+
327
+ if (typeof value === "string") {
328
+ const normalized: string = value.trim().toLowerCase();
329
+
330
+ if (normalized === "true" || normalized === "1") {
331
+ return true;
332
+ }
333
+
334
+ if (normalized === "false" || normalized === "0") {
335
+ return false;
336
+ }
337
+
338
+ return null;
339
+ }
340
+
341
+ if (typeof value === "number") {
342
+ return value !== 0;
343
+ }
344
+
345
+ return null;
346
+ };
347
+
348
+ type NormalizeNumberFunction = (value: unknown) => number | null;
349
+
350
+ const normalizeNumber: NormalizeNumberFunction = (
351
+ value: unknown,
352
+ ): number | null => {
353
+ if (value === undefined || value === null || value === "") {
354
+ return null;
355
+ }
356
+
357
+ const numeric: number = typeof value === "number" ? value : Number(value);
358
+
359
+ return Number.isFinite(numeric) ? numeric : null;
360
+ };
361
+
362
+ /*
363
+ * ---------------------------------------------------------------------------
364
+ * Column changes
365
+ * ---------------------------------------------------------------------------
366
+ */
367
+
368
+ export enum SloFeedValueKind {
369
+ // Short user text shown in full (a name, a timezone, an enum value).
370
+ Text = "Text",
371
+ // Free text shown truncated, and never quoted in a one-line summary.
372
+ LongText = "LongText",
373
+ // Compared, never printed: templates and notes can be long markdown.
374
+ Opaque = "Opaque",
375
+ Percent = "Percent",
376
+ Days = "Days",
377
+ Minutes = "Minutes",
378
+ // A burn rate multiple, e.g. 14.4x.
379
+ Multiplier = "Multiplier",
380
+ Count = "Count",
381
+ Boolean = "Boolean",
382
+ // A many-to-many relation selected as rows with a name.
383
+ EntityList = "EntityList",
384
+ // A foreign key column whose name is read from `relationProperty`.
385
+ EntityReference = "EntityReference",
386
+ }
387
+
388
+ export interface SloFeedColumn {
389
+ column: string;
390
+ title: string;
391
+ kind: SloFeedValueKind;
392
+ // EntityReference only: the relation that carries the referenced row's name.
393
+ relationProperty?: string | undefined;
394
+ // What an unset value reads as, when "not set" would be misleading.
395
+ emptyText?: string | undefined;
396
+ // EntityList / EntityReference: columns to select on the related rows.
397
+ relationSelect?: Record<string, true> | undefined;
398
+ }
399
+
400
+ export interface SloFeedColumnChange {
401
+ column: string;
402
+ title: string;
403
+ kind: SloFeedValueKind;
404
+ // null when there was no before-row to compare against.
405
+ from: string | null;
406
+ to: string;
407
+ }
408
+
409
+ const DEFAULT_RELATION_SELECT: Record<string, true> = {
410
+ _id: true,
411
+ name: true,
412
+ };
413
+
414
+ export type GetSloFeedColumnsInPayloadFunction = (
415
+ data: unknown,
416
+ columns: Array<SloFeedColumn>,
417
+ ) => Array<SloFeedColumn>;
418
+
419
+ /*
420
+ * The watched columns an update payload actually writes. A key present with
421
+ * the value `undefined` writes nothing, so it does not count - otherwise a
422
+ * form that spreads an object with an undefined field would cost a read and
423
+ * post an item about a column it never touched.
424
+ */
425
+ export const getSloFeedColumnsInPayload: GetSloFeedColumnsInPayloadFunction = (
426
+ data: unknown,
427
+ columns: Array<SloFeedColumn>,
428
+ ): Array<SloFeedColumn> => {
429
+ if (!data || typeof data !== "object") {
430
+ return [];
431
+ }
432
+
433
+ const record: Record<string, unknown> = data as Record<string, unknown>;
434
+
435
+ return columns.filter((column: SloFeedColumn): boolean => {
436
+ return (
437
+ Object.prototype.hasOwnProperty.call(record, column.column) &&
438
+ record[column.column] !== undefined
439
+ );
440
+ });
441
+ };
442
+
443
+ export type GetSloFeedSelectFunction = (
444
+ columns: Array<SloFeedColumn>,
445
+ ) => Record<string, unknown>;
446
+
447
+ /*
448
+ * The select for a before/after read of exactly the columns being watched,
449
+ * with relation columns expanded to the fields the feed prints.
450
+ */
451
+ export const getSloFeedSelect: GetSloFeedSelectFunction = (
452
+ columns: Array<SloFeedColumn>,
453
+ ): Record<string, unknown> => {
454
+ const select: Record<string, unknown> = {};
455
+
456
+ for (const column of columns) {
457
+ if (column.kind === SloFeedValueKind.EntityList) {
458
+ select[column.column] = {
459
+ ...(column.relationSelect || DEFAULT_RELATION_SELECT),
460
+ };
461
+ continue;
462
+ }
463
+
464
+ select[column.column] = true;
465
+
466
+ if (
467
+ column.kind === SloFeedValueKind.EntityReference &&
468
+ column.relationProperty
469
+ ) {
470
+ select[column.relationProperty] = {
471
+ ...(column.relationSelect || DEFAULT_RELATION_SELECT),
472
+ };
473
+ }
474
+ }
475
+
476
+ return select;
477
+ };
478
+
479
+ export type IsSloFeedValueEqualFunction = (
480
+ column: SloFeedColumn,
481
+ before: SloFeedRow,
482
+ after: SloFeedRow,
483
+ ) => boolean;
484
+
485
+ export const isSloFeedValueEqual: IsSloFeedValueEqualFunction = (
486
+ column: SloFeedColumn,
487
+ before: SloFeedRow,
488
+ after: SloFeedRow,
489
+ ): boolean => {
490
+ const beforeValue: unknown = before[column.column];
491
+ const afterValue: unknown = after[column.column];
492
+
493
+ switch (column.kind) {
494
+ case SloFeedValueKind.EntityList:
495
+ return (
496
+ getSloFeedEntityIds(beforeValue).join(",") ===
497
+ getSloFeedEntityIds(afterValue).join(",")
498
+ );
499
+ case SloFeedValueKind.EntityReference:
500
+ return toIdString(beforeValue) === toIdString(afterValue);
501
+ case SloFeedValueKind.Percent:
502
+ case SloFeedValueKind.Days:
503
+ case SloFeedValueKind.Minutes:
504
+ case SloFeedValueKind.Multiplier:
505
+ case SloFeedValueKind.Count:
506
+ return normalizeNumber(beforeValue) === normalizeNumber(afterValue);
507
+ case SloFeedValueKind.Boolean:
508
+ return (
509
+ normalizeSloFeedBoolean(beforeValue) ===
510
+ normalizeSloFeedBoolean(afterValue)
511
+ );
512
+ default:
513
+ // Text kinds: an empty string and a null are both "not set".
514
+ return (
515
+ String(beforeValue ?? "").trim() === String(afterValue ?? "").trim()
516
+ );
517
+ }
518
+ };
519
+
520
+ export type FormatSloFeedValueFunction = (
521
+ column: SloFeedColumn,
522
+ row: SloFeedRow,
523
+ ) => string;
524
+
525
+ export const formatSloFeedValue: FormatSloFeedValueFunction = (
526
+ column: SloFeedColumn,
527
+ row: SloFeedRow,
528
+ ): string => {
529
+ const value: unknown = row[column.column];
530
+ const emptyText: string = column.emptyText || SLO_FEED_NOT_SET_TEXT;
531
+
532
+ switch (column.kind) {
533
+ case SloFeedValueKind.EntityList:
534
+ return formatSloFeedEntityNames(value);
535
+ case SloFeedValueKind.EntityReference: {
536
+ if (!toIdString(value)) {
537
+ return emptyText;
538
+ }
539
+
540
+ const name: string = column.relationProperty
541
+ ? getEntityName(row[column.relationProperty])
542
+ : "";
543
+
544
+ // The row is referenced but its name could not be read.
545
+ return name ? formatSloFeedText(name, 80) : "_a deleted item_";
546
+ }
547
+ case SloFeedValueKind.Boolean: {
548
+ const flag: boolean | null = normalizeSloFeedBoolean(value);
549
+
550
+ if (flag === null) {
551
+ return emptyText;
552
+ }
553
+
554
+ return flag ? "On" : "Off";
555
+ }
556
+ case SloFeedValueKind.Percent:
557
+ case SloFeedValueKind.Days:
558
+ case SloFeedValueKind.Minutes:
559
+ case SloFeedValueKind.Multiplier:
560
+ case SloFeedValueKind.Count: {
561
+ const numeric: number | null = normalizeNumber(value);
562
+
563
+ if (numeric === null) {
564
+ return emptyText;
565
+ }
566
+
567
+ if (column.kind === SloFeedValueKind.Percent) {
568
+ return formatSloFeedPercent(numeric, 3);
569
+ }
570
+
571
+ if (column.kind === SloFeedValueKind.Days) {
572
+ return pluralize(formatSloFeedNumber(numeric), "day");
573
+ }
574
+
575
+ if (column.kind === SloFeedValueKind.Minutes) {
576
+ return formatSloFeedMinutes(numeric);
577
+ }
578
+
579
+ if (column.kind === SloFeedValueKind.Multiplier) {
580
+ return `${formatSloFeedNumber(numeric)}x`;
581
+ }
582
+
583
+ return formatSloFeedNumber(numeric);
584
+ }
585
+ case SloFeedValueKind.Opaque:
586
+ return String(value ?? "").trim() ? "_set_" : emptyText;
587
+ default: {
588
+ const text: string = formatSloFeedText(value);
589
+
590
+ return text || emptyText;
591
+ }
592
+ }
593
+ };
594
+
595
+ export type GetSloFeedColumnChangesFunction = (data: {
596
+ columns: Array<SloFeedColumn>;
597
+ before: SloFeedRow | null;
598
+ after: SloFeedRow;
599
+ }) => Array<SloFeedColumnChange>;
600
+
601
+ /*
602
+ * The changes worth telling somebody about. With a before-row, a column whose
603
+ * value did not actually change is dropped - a settings form re-submits every
604
+ * field it shows, and "Target: 99.9% -> 99.9%" is noise. Without one (the
605
+ * before-read failed, or the write path deliberately takes none), every
606
+ * written column is reported with its new value only.
607
+ */
608
+ export const getSloFeedColumnChanges: GetSloFeedColumnChangesFunction = (data: {
609
+ columns: Array<SloFeedColumn>;
610
+ before: SloFeedRow | null;
611
+ after: SloFeedRow;
612
+ }): Array<SloFeedColumnChange> => {
613
+ const changes: Array<SloFeedColumnChange> = [];
614
+
615
+ for (const column of data.columns) {
616
+ if (data.before && isSloFeedValueEqual(column, data.before, data.after)) {
617
+ continue;
618
+ }
619
+
620
+ changes.push({
621
+ column: column.column,
622
+ title: column.title,
623
+ kind: column.kind,
624
+ from: data.before ? formatSloFeedValue(column, data.before) : null,
625
+ to: formatSloFeedValue(column, data.after),
626
+ });
627
+ }
628
+
629
+ return changes;
630
+ };
631
+
632
+ type JoinTitlesFunction = (titles: Array<string>) => string;
633
+
634
+ // "**A**", "**A** and **B**", "**A**, **B** and **C**".
635
+ const joinTitles: JoinTitlesFunction = (titles: Array<string>): string => {
636
+ const bold: Array<string> = titles.map((title: string): string => {
637
+ return `**${title}**`;
638
+ });
639
+
640
+ if (bold.length <= 1) {
641
+ return bold.join("");
642
+ }
643
+
644
+ return `${bold.slice(0, -1).join(", ")} and ${bold[bold.length - 1]}`;
645
+ };
646
+
647
+ type FormatChangeLineFunction = (change: SloFeedColumnChange) => string;
648
+
649
+ const formatChangeLine: FormatChangeLineFunction = (
650
+ change: SloFeedColumnChange,
651
+ ): string => {
652
+ if (change.kind === SloFeedValueKind.Opaque) {
653
+ return `**${change.title}**: changed`;
654
+ }
655
+
656
+ if (change.from === null) {
657
+ return `**${change.title}**: ${change.to}`;
658
+ }
659
+
660
+ return `**${change.title}**: ${change.from} → ${change.to}`;
661
+ };
662
+
663
+ type FormatChangeSummaryFunction = (
664
+ changes: Array<SloFeedColumnChange>,
665
+ ) => string;
666
+
667
+ /*
668
+ * A single short change is spelled out in the one-line summary, so the
669
+ * timeline answers "what changed" without opening anything. Several changes,
670
+ * or a long one, are named in the summary and spelled out in More Information.
671
+ */
672
+ const formatChangeSummary: FormatChangeSummaryFunction = (
673
+ changes: Array<SloFeedColumnChange>,
674
+ ): string => {
675
+ const onlyChange: SloFeedColumnChange | undefined =
676
+ changes.length === 1 ? changes[0] : undefined;
677
+
678
+ if (
679
+ onlyChange &&
680
+ onlyChange.kind !== SloFeedValueKind.LongText &&
681
+ onlyChange.kind !== SloFeedValueKind.Opaque
682
+ ) {
683
+ return onlyChange.from === null
684
+ ? `**${onlyChange.title}** set to ${onlyChange.to}`
685
+ : `**${onlyChange.title}** changed from ${onlyChange.from} to ${onlyChange.to}`;
686
+ }
687
+
688
+ return `${joinTitles(
689
+ changes.map((change: SloFeedColumnChange): string => {
690
+ return change.title;
691
+ }),
692
+ )} changed`;
693
+ };
694
+
695
+ /*
696
+ * ---------------------------------------------------------------------------
697
+ * SLO lifecycle items
698
+ * ---------------------------------------------------------------------------
699
+ */
700
+
701
+ /*
702
+ * The SLO columns whose edit earns a "was updated" item. A whitelist, never a
703
+ * blacklist: the evaluation worker writes this row on every tick (SLI, budget,
704
+ * burn rate, status, cadence stamps) and a blacklist would let the next worker
705
+ * column added to the model post an item every few minutes per SLO.
706
+ *
707
+ * isEnabled / isArchived and the monitor set are watched too, but get items
708
+ * of their own (see SLO_FEED_WATCHED_COLUMN_NAMES).
709
+ */
710
+ export const SLO_FEED_UPDATE_COLUMNS: Array<SloFeedColumn> = [
711
+ { column: "name", title: "Name", kind: SloFeedValueKind.Text },
712
+ {
713
+ column: "description",
714
+ title: "Description",
715
+ kind: SloFeedValueKind.LongText,
716
+ },
717
+ { column: "labels", title: "Labels", kind: SloFeedValueKind.EntityList },
718
+ {
719
+ column: "targetPercentage",
720
+ title: "Target",
721
+ kind: SloFeedValueKind.Percent,
722
+ },
723
+ {
724
+ column: "windowType",
725
+ title: "Compliance window",
726
+ kind: SloFeedValueKind.Text,
727
+ },
728
+ {
729
+ column: "windowDays",
730
+ title: "Rolling window length",
731
+ kind: SloFeedValueKind.Days,
732
+ },
733
+ {
734
+ column: "timezone",
735
+ title: "Timezone",
736
+ kind: SloFeedValueKind.Text,
737
+ emptyText: "UTC (default)",
738
+ },
739
+ {
740
+ column: "atRiskThresholdPercentage",
741
+ title: "At-risk threshold",
742
+ kind: SloFeedValueKind.Percent,
743
+ emptyText: "_default_",
744
+ },
745
+ {
746
+ column: "multiMonitorMode",
747
+ title: "Multi-monitor mode",
748
+ kind: SloFeedValueKind.Text,
749
+ },
750
+ {
751
+ column: "downtimeMonitorStatuses",
752
+ title: "Downtime monitor statuses",
753
+ kind: SloFeedValueKind.EntityList,
754
+ },
755
+ ];
756
+
757
+ export const SLO_FEED_IS_ENABLED_COLUMN: SloFeedColumn = {
758
+ column: "isEnabled",
759
+ title: "Enabled",
760
+ kind: SloFeedValueKind.Boolean,
761
+ };
762
+
763
+ export const SLO_FEED_IS_ARCHIVED_COLUMN: SloFeedColumn = {
764
+ column: "isArchived",
765
+ title: "Archived",
766
+ kind: SloFeedValueKind.Boolean,
767
+ };
768
+
769
+ export const SLO_FEED_MONITORS_COLUMN: SloFeedColumn = {
770
+ column: "monitors",
771
+ title: "Monitors",
772
+ kind: SloFeedValueKind.EntityList,
773
+ };
774
+
775
+ export type GetSloFeedWatchedColumnsFunction = (data: {
776
+ payload: unknown;
777
+ // Only hand-made monitor edits are this feed's to describe - see the caller.
778
+ includeMonitors: boolean;
779
+ }) => Array<SloFeedColumn>;
780
+
781
+ export const getSloFeedWatchedColumns: GetSloFeedWatchedColumnsFunction =
782
+ (data: {
783
+ payload: unknown;
784
+ includeMonitors: boolean;
785
+ }): Array<SloFeedColumn> => {
786
+ const watched: Array<SloFeedColumn> = [
787
+ ...SLO_FEED_UPDATE_COLUMNS,
788
+ SLO_FEED_IS_ENABLED_COLUMN,
789
+ SLO_FEED_IS_ARCHIVED_COLUMN,
790
+ ];
791
+
792
+ if (data.includeMonitors) {
793
+ watched.push(SLO_FEED_MONITORS_COLUMN);
794
+ }
795
+
796
+ return getSloFeedColumnsInPayload(data.payload, watched);
797
+ };
798
+
799
+ export interface SloFeedBurnRateRuleSummary {
800
+ name?: string | undefined;
801
+ burnRateThreshold?: number | undefined;
802
+ longWindowInMinutes?: number | undefined;
803
+ shortWindowInMinutes?: number | undefined;
804
+ }
805
+
806
+ type DescribeBurnRateConditionFunction = (
807
+ rule: SloFeedBurnRateRuleSummary,
808
+ ) => string | null;
809
+
810
+ // "above 14.4x over 1 hour, confirmed over 5 minutes".
811
+ const describeBurnRateCondition: DescribeBurnRateConditionFunction = (
812
+ rule: SloFeedBurnRateRuleSummary,
813
+ ): string | null => {
814
+ const threshold: number | null = normalizeNumber(rule.burnRateThreshold);
815
+ const longWindow: number | null = normalizeNumber(rule.longWindowInMinutes);
816
+ const shortWindow: number | null = normalizeNumber(rule.shortWindowInMinutes);
817
+
818
+ if (threshold === null || longWindow === null) {
819
+ return null;
820
+ }
821
+
822
+ const confirmation: string =
823
+ shortWindow === null
824
+ ? ""
825
+ : `, confirmed over ${formatSloFeedMinutes(shortWindow)}`;
826
+
827
+ return `burn rate above ${formatSloFeedNumber(threshold)}x over ${formatSloFeedMinutes(longWindow)}${confirmation}`;
828
+ };
829
+
830
+ export type DescribeSloFeedWindowFunction = (data: {
831
+ windowType?: SloWindowType | string | undefined | null;
832
+ windowDays?: number | undefined | null;
833
+ timezone?: string | undefined | null;
834
+ }) => string;
835
+
836
+ export const describeSloFeedWindow: DescribeSloFeedWindowFunction = (data: {
837
+ windowType?: SloWindowType | string | undefined | null;
838
+ windowDays?: number | undefined | null;
839
+ timezone?: string | undefined | null;
840
+ }): string => {
841
+ if (data.windowType === SloWindowType.CalendarMonth) {
842
+ const timezone: string = formatSloFeedText(data.timezone) || "UTC";
843
+
844
+ return `Calendar month (${timezone})`;
845
+ }
846
+
847
+ const windowDays: number | null = normalizeNumber(data.windowDays);
848
+
849
+ // The worker measures a rolling window with no length as 30 days.
850
+ return `Rolling ${pluralize(formatSloFeedNumber(windowDays ?? 30), "day")}`;
851
+ };
852
+
853
+ export type GetSloCreatedFeedMarkdownFunction = (data: {
854
+ sloMarkdownLink: string;
855
+ // Already-safe markdown for the creating user, or null for no user.
856
+ createdByUserMarkdown: string | null;
857
+ targetPercentage?: number | undefined | null;
858
+ windowType?: SloWindowType | string | undefined | null;
859
+ windowDays?: number | undefined | null;
860
+ timezone?: string | undefined | null;
861
+ sliType?: string | undefined | null;
862
+ atRiskThresholdPercentage?: number | undefined | null;
863
+ description?: string | undefined | null;
864
+ defaultBurnRateRules: Array<SloFeedBurnRateRuleSummary>;
865
+ }) => SloFeedMarkdown;
866
+
867
+ export const getSloCreatedFeedMarkdown: GetSloCreatedFeedMarkdownFunction =
868
+ (data: {
869
+ sloMarkdownLink: string;
870
+ createdByUserMarkdown: string | null;
871
+ targetPercentage?: number | undefined | null;
872
+ windowType?: SloWindowType | string | undefined | null;
873
+ windowDays?: number | undefined | null;
874
+ timezone?: string | undefined | null;
875
+ sliType?: string | undefined | null;
876
+ atRiskThresholdPercentage?: number | undefined | null;
877
+ description?: string | undefined | null;
878
+ defaultBurnRateRules: Array<SloFeedBurnRateRuleSummary>;
879
+ }): SloFeedMarkdown => {
880
+ const details: Array<string> = [
881
+ data.createdByUserMarkdown
882
+ ? `**Created by**: ${data.createdByUserMarkdown}`
883
+ : "**Created by**: No user - it was created through the OneUptime API or by an automation.",
884
+ ];
885
+
886
+ const target: number | null = normalizeNumber(data.targetPercentage);
887
+
888
+ if (target !== null) {
889
+ details.push(`**Target**: ${formatSloFeedPercent(target, 3)}`);
890
+ }
891
+
892
+ details.push(`**Compliance window**: ${describeSloFeedWindow(data)}`);
893
+
894
+ if (data.sliType) {
895
+ details.push(`**SLI**: ${formatSloFeedText(data.sliType)}`);
896
+ }
897
+
898
+ const atRisk: number | null = normalizeNumber(
899
+ data.atRiskThresholdPercentage,
900
+ );
901
+
902
+ if (atRisk !== null) {
903
+ details.push(
904
+ `**At-risk threshold**: ${formatSloFeedPercent(atRisk)} of the error budget remaining`,
905
+ );
906
+ }
907
+
908
+ /*
909
+ * The two default rules are part of what "creating an SLO" means, so they
910
+ * are described here rather than as two more items that would bury the
911
+ * creation under its own bookkeeping.
912
+ */
913
+ const rules: Array<string> = data.defaultBurnRateRules.map(
914
+ (rule: SloFeedBurnRateRuleSummary): string => {
915
+ const name: string = formatSloFeedText(rule.name) || "Unnamed rule";
916
+ const condition: string | null = describeBurnRateCondition(rule);
917
+
918
+ return condition ? `${name} (${condition})` : name;
919
+ },
920
+ );
921
+
922
+ if (rules.length > 0) {
923
+ details.push(`**Default burn rate rules**: ${rules.join("; ")}`);
924
+ }
925
+
926
+ const description: string = formatSloFeedText(data.description);
927
+
928
+ if (description) {
929
+ details.push(`**Description**: ${description}`);
930
+ }
931
+
932
+ return {
933
+ feedInfoInMarkdown: data.createdByUserMarkdown
934
+ ? `🎯 ${data.sloMarkdownLink} was created by **${data.createdByUserMarkdown}**.`
935
+ : `🎯 ${data.sloMarkdownLink} was created.`,
936
+ moreInformationInMarkdown: details.join("\n\n"),
937
+ };
938
+ };
939
+
940
+ export type GetSloUpdatedFeedMarkdownFunction = (data: {
941
+ sloMarkdownLink: string;
942
+ changes: Array<SloFeedColumnChange>;
943
+ }) => SloFeedMarkdown;
944
+
945
+ export const getSloUpdatedFeedMarkdown: GetSloUpdatedFeedMarkdownFunction =
946
+ (data: {
947
+ sloMarkdownLink: string;
948
+ changes: Array<SloFeedColumnChange>;
949
+ }): SloFeedMarkdown => {
950
+ return {
951
+ feedInfoInMarkdown: `📝 ${data.sloMarkdownLink} was updated: ${formatChangeSummary(data.changes)}.`,
952
+ moreInformationInMarkdown: data.changes
953
+ .map(formatChangeLine)
954
+ .join("\n\n"),
955
+ };
956
+ };
957
+
958
+ export type GetSloEnabledFeedMarkdownFunction = (data: {
959
+ sloMarkdownLink: string;
960
+ isEnabled: boolean;
961
+ isArchived: boolean;
962
+ }) => SloFeedMarkdown;
963
+
964
+ export const getSloEnabledFeedMarkdown: GetSloEnabledFeedMarkdownFunction =
965
+ (data: {
966
+ sloMarkdownLink: string;
967
+ isEnabled: boolean;
968
+ isArchived: boolean;
969
+ }): SloFeedMarkdown => {
970
+ if (data.isEnabled) {
971
+ return {
972
+ feedInfoInMarkdown: `▶️ ${data.sloMarkdownLink} was enabled.`,
973
+ moreInformationInMarkdown: data.isArchived
974
+ ? "The SLO is still archived, so it stays out of evaluation until it is restored from the archive."
975
+ : "Evaluation resumes on the next worker tick, which recalculates the SLI, error budget and status.",
976
+ };
977
+ }
978
+
979
+ return {
980
+ feedInfoInMarkdown: `⏸️ ${data.sloMarkdownLink} was disabled.`,
981
+ moreInformationInMarkdown:
982
+ "A disabled SLO is not evaluated: its SLI, error budget and status stop updating and its burn rate rules do not fire. Any burn rate alerts and incidents its rules had open were resolved.",
983
+ };
984
+ };
985
+
986
+ export type GetSloArchivedFeedMarkdownFunction = (data: {
987
+ sloMarkdownLink: string;
988
+ isArchived: boolean;
989
+ isEnabled: boolean;
990
+ }) => SloFeedMarkdown;
991
+
992
+ export const getSloArchivedFeedMarkdown: GetSloArchivedFeedMarkdownFunction =
993
+ (data: {
994
+ sloMarkdownLink: string;
995
+ isArchived: boolean;
996
+ isEnabled: boolean;
997
+ }): SloFeedMarkdown => {
998
+ if (data.isArchived) {
999
+ return {
1000
+ feedInfoInMarkdown: `🗄️ ${data.sloMarkdownLink} was archived.`,
1001
+ moreInformationInMarkdown:
1002
+ "Archived SLOs are hidden from the SLO list and are not evaluated. Any burn rate alerts and incidents its rules had open were resolved.",
1003
+ };
1004
+ }
1005
+
1006
+ return {
1007
+ feedInfoInMarkdown: `♻️ ${data.sloMarkdownLink} was restored from the archive.`,
1008
+ moreInformationInMarkdown: data.isEnabled
1009
+ ? "The SLO is back on the SLO list and is evaluated again from the next worker tick."
1010
+ : "The SLO is back on the SLO list. It is still disabled, so it is not evaluated until it is enabled.",
1011
+ };
1012
+ };
1013
+
1014
+ export interface SloFeedMonitorReference {
1015
+ name: string;
1016
+ // Absolute dashboard URL of the monitor.
1017
+ link: string;
1018
+ }
1019
+
1020
+ export type GetSloMonitorsChangedFeedMarkdownFunction = (data: {
1021
+ sloMarkdownLink: string;
1022
+ monitors: Array<SloFeedMonitorReference>;
1023
+ change: "attached" | "detached";
1024
+ }) => SloFeedMarkdown;
1025
+
1026
+ export const getSloMonitorsChangedFeedMarkdown: GetSloMonitorsChangedFeedMarkdownFunction =
1027
+ (data: {
1028
+ sloMarkdownLink: string;
1029
+ monitors: Array<SloFeedMonitorReference>;
1030
+ change: "attached" | "detached";
1031
+ }): SloFeedMarkdown => {
1032
+ const sorted: Array<SloFeedMonitorReference> = [...data.monitors].sort(
1033
+ (a: SloFeedMonitorReference, b: SloFeedMonitorReference): number => {
1034
+ return a.name.localeCompare(b.name);
1035
+ },
1036
+ );
1037
+
1038
+ const links: Array<string> = sorted.map(
1039
+ (monitor: SloFeedMonitorReference): string => {
1040
+ const name: string =
1041
+ formatSloFeedText(monitor.name, 80) || "Unnamed monitor";
1042
+
1043
+ return `[${name}](${monitor.link})`;
1044
+ },
1045
+ );
1046
+
1047
+ const emoji: string = data.change === "attached" ? "🔗" : "✂️";
1048
+ const preposition: string = data.change === "attached" ? "to" : "from";
1049
+
1050
+ let feedInfoInMarkdown: string;
1051
+
1052
+ if (links.length === 1) {
1053
+ feedInfoInMarkdown = `${emoji} Monitor ${links[0]} was ${data.change} ${preposition} ${data.sloMarkdownLink}.`;
1054
+ } else {
1055
+ const named: Array<string> = links.slice(0, MAX_SUMMARY_MONITORS);
1056
+ const unnamed: number = links.length - named.length;
1057
+
1058
+ feedInfoInMarkdown = `${emoji} ${links.length} monitors were ${data.change} ${preposition} ${data.sloMarkdownLink}: ${named.join(", ")}${unnamed > 0 ? ` and ${unnamed} more` : ""}.`;
1059
+ }
1060
+
1061
+ const listed: Array<string> = links.slice(0, MAX_DETAIL_MONITORS);
1062
+ const remaining: number = links.length - listed.length;
1063
+
1064
+ const lines: Array<string> = [
1065
+ `**Monitors ${data.change}**:`,
1066
+ listed
1067
+ .map((link: string): string => {
1068
+ return `- ${link}`;
1069
+ })
1070
+ .join("\n") + (remaining > 0 ? `\n- and ${remaining} more` : ""),
1071
+ "The SLO is measured against its new monitor set from the next worker tick.",
1072
+ ];
1073
+
1074
+ return {
1075
+ feedInfoInMarkdown: feedInfoInMarkdown,
1076
+ moreInformationInMarkdown: lines.join("\n\n"),
1077
+ };
1078
+ };
1079
+
1080
+ /*
1081
+ * ---------------------------------------------------------------------------
1082
+ * Status transitions (evaluation worker)
1083
+ * ---------------------------------------------------------------------------
1084
+ */
1085
+
1086
+ export type GetSloStatusEmojiFunction = (status: SloStatus) => string;
1087
+
1088
+ export const getSloStatusEmoji: GetSloStatusEmojiFunction = (
1089
+ status: SloStatus,
1090
+ ): string => {
1091
+ switch (status) {
1092
+ case SloStatus.Healthy:
1093
+ return "🟢";
1094
+ case SloStatus.AtRisk:
1095
+ return "🟡";
1096
+ case SloStatus.BudgetExhausted:
1097
+ return "🔴";
1098
+ case SloStatus.Paused:
1099
+ return "⏸️";
1100
+ default:
1101
+ return "⚠️";
1102
+ }
1103
+ };
1104
+
1105
+ export interface SloFeedStatusMeasurement {
1106
+ sliPercentage: number;
1107
+ targetPercentage: number;
1108
+ errorBudgetRemainingPercentage: number;
1109
+ errorBudgetRemainingSeconds: number;
1110
+ currentBurnRate: number;
1111
+ currentBurnRateWindowInMinutes: number;
1112
+ atRiskThresholdPercentage: number;
1113
+ }
1114
+
1115
+ export type GetSloStatusChangedFeedMarkdownFunction = (data: {
1116
+ sloMarkdownLink: string;
1117
+ // The status before this transition; unset for an SLO never evaluated.
1118
+ previousStatus?: SloStatus | undefined | null;
1119
+ newStatus: SloStatus;
1120
+ // A real measurement (the evaluation path) ...
1121
+ measurement?: SloFeedStatusMeasurement | undefined;
1122
+ // ... or why there is none (the Paused / Misconfigured guards).
1123
+ reason?: string | undefined;
1124
+ }) => SloFeedMarkdown;
1125
+
1126
+ export const getSloStatusChangedFeedMarkdown: GetSloStatusChangedFeedMarkdownFunction =
1127
+ (data: {
1128
+ sloMarkdownLink: string;
1129
+ previousStatus?: SloStatus | undefined | null;
1130
+ newStatus: SloStatus;
1131
+ measurement?: SloFeedStatusMeasurement | undefined;
1132
+ reason?: string | undefined;
1133
+ }): SloFeedMarkdown => {
1134
+ const details: Array<string> = [
1135
+ `**Status**: ${data.previousStatus || "Not evaluated yet"} → ${data.newStatus}`,
1136
+ ];
1137
+
1138
+ if (data.reason) {
1139
+ details.push(`**Why**: ${data.reason}`);
1140
+ }
1141
+
1142
+ if (data.measurement) {
1143
+ const measurement: SloFeedStatusMeasurement = data.measurement;
1144
+
1145
+ /*
1146
+ * Four decimals on the SLI: targets go to 99.999, and an SLI that rounds
1147
+ * UP to its own target would read as healthy when it is not.
1148
+ */
1149
+ details.push(
1150
+ `**SLI**: ${formatSloFeedPercent(measurement.sliPercentage, 4)} against a ${formatSloFeedPercent(measurement.targetPercentage, 3)} target`,
1151
+ );
1152
+
1153
+ const budgetDuration: string = formatSloFeedDuration(
1154
+ measurement.errorBudgetRemainingSeconds,
1155
+ );
1156
+
1157
+ details.push(
1158
+ measurement.errorBudgetRemainingSeconds < 0
1159
+ ? `**Error budget remaining**: ${formatSloFeedPercent(measurement.errorBudgetRemainingPercentage)} (over budget by ${budgetDuration})`
1160
+ : `**Error budget remaining**: ${formatSloFeedPercent(measurement.errorBudgetRemainingPercentage)} (${budgetDuration})`,
1161
+ );
1162
+
1163
+ details.push(
1164
+ `**Current burn rate**: ${formatSloFeedNumber(measurement.currentBurnRate)}x over the last ${formatSloFeedMinutes(measurement.currentBurnRateWindowInMinutes)}`,
1165
+ );
1166
+
1167
+ details.push(
1168
+ `**At-risk threshold**: ${formatSloFeedPercent(measurement.atRiskThresholdPercentage)} of the error budget remaining`,
1169
+ );
1170
+ }
1171
+
1172
+ if (
1173
+ data.newStatus === SloStatus.Paused ||
1174
+ data.newStatus === SloStatus.Misconfigured
1175
+ ) {
1176
+ details.push(
1177
+ `While the SLO is ${data.newStatus}, its SLI and error budget are not recalculated and its burn rate rules do not fire. Any burn rate alerts and incidents its rules had open were resolved.`,
1178
+ );
1179
+ }
1180
+
1181
+ const was: string = data.previousStatus
1182
+ ? ` (was ${data.previousStatus})`
1183
+ : "";
1184
+
1185
+ return {
1186
+ feedInfoInMarkdown: `${getSloStatusEmoji(data.newStatus)} ${data.sloMarkdownLink} is now **${data.newStatus}**${was}.`,
1187
+ moreInformationInMarkdown: details.join("\n\n"),
1188
+ };
1189
+ };
1190
+
1191
+ /*
1192
+ * ---------------------------------------------------------------------------
1193
+ * Burn rate rules
1194
+ * ---------------------------------------------------------------------------
1195
+ */
1196
+
1197
+ const USER_RELATION_SELECT: Record<string, true> = {
1198
+ _id: true,
1199
+ name: true,
1200
+ email: true,
1201
+ };
1202
+
1203
+ /*
1204
+ * The burn rate rule columns whose edit earns a "changed" item. A whitelist
1205
+ * for the same reason as the SLO's: the evaluation worker stamps the rule's
1206
+ * lifecycle columns (lastAlertCreatedAt and friends) through the hooked update
1207
+ * path every time it fires or resolves.
1208
+ */
1209
+ export const SLO_BURN_RATE_RULE_FEED_COLUMNS: Array<SloFeedColumn> = [
1210
+ { column: "name", title: "Name", kind: SloFeedValueKind.Text },
1211
+ { column: "isEnabled", title: "Enabled", kind: SloFeedValueKind.Boolean },
1212
+ {
1213
+ column: "burnRateThreshold",
1214
+ title: "Burn rate threshold",
1215
+ kind: SloFeedValueKind.Multiplier,
1216
+ },
1217
+ {
1218
+ column: "longWindowInMinutes",
1219
+ title: "Long window",
1220
+ kind: SloFeedValueKind.Minutes,
1221
+ },
1222
+ {
1223
+ column: "shortWindowInMinutes",
1224
+ title: "Short window",
1225
+ kind: SloFeedValueKind.Minutes,
1226
+ },
1227
+ {
1228
+ column: "refireSuppressionMinutes",
1229
+ title: "Re-fire suppression",
1230
+ kind: SloFeedValueKind.Minutes,
1231
+ emptyText: "_default_",
1232
+ },
1233
+ {
1234
+ column: "minimumSampleCount",
1235
+ title: "Minimum sample count",
1236
+ kind: SloFeedValueKind.Count,
1237
+ },
1238
+ {
1239
+ column: "shouldCreateAlert",
1240
+ title: "Create alert",
1241
+ kind: SloFeedValueKind.Boolean,
1242
+ },
1243
+ {
1244
+ column: "alertSeverityId",
1245
+ title: "Alert severity",
1246
+ kind: SloFeedValueKind.EntityReference,
1247
+ relationProperty: "alertSeverity",
1248
+ },
1249
+ {
1250
+ column: "onCallDutyPolicies",
1251
+ title: "Alert on-call policies",
1252
+ kind: SloFeedValueKind.EntityList,
1253
+ },
1254
+ {
1255
+ column: "alertTitleTemplate",
1256
+ title: "Alert title template",
1257
+ kind: SloFeedValueKind.Opaque,
1258
+ },
1259
+ {
1260
+ column: "alertDescriptionTemplate",
1261
+ title: "Alert description template",
1262
+ kind: SloFeedValueKind.Opaque,
1263
+ },
1264
+ {
1265
+ column: "alertRemediationNotes",
1266
+ title: "Alert remediation notes",
1267
+ kind: SloFeedValueKind.Opaque,
1268
+ },
1269
+ {
1270
+ column: "isAlertPrivate",
1271
+ title: "Private alert",
1272
+ kind: SloFeedValueKind.Boolean,
1273
+ },
1274
+ {
1275
+ column: "autoResolveAlert",
1276
+ title: "Auto-resolve alert",
1277
+ kind: SloFeedValueKind.Boolean,
1278
+ },
1279
+ {
1280
+ column: "alertLabels",
1281
+ title: "Alert labels",
1282
+ kind: SloFeedValueKind.EntityList,
1283
+ },
1284
+ {
1285
+ column: "alertOwnerTeams",
1286
+ title: "Alert owner teams",
1287
+ kind: SloFeedValueKind.EntityList,
1288
+ },
1289
+ {
1290
+ column: "alertOwnerUsers",
1291
+ title: "Alert owner users",
1292
+ kind: SloFeedValueKind.EntityList,
1293
+ relationSelect: USER_RELATION_SELECT,
1294
+ },
1295
+ {
1296
+ column: "shouldCreateIncident",
1297
+ title: "Declare incident",
1298
+ kind: SloFeedValueKind.Boolean,
1299
+ },
1300
+ {
1301
+ column: "incidentSeverityId",
1302
+ title: "Incident severity",
1303
+ kind: SloFeedValueKind.EntityReference,
1304
+ relationProperty: "incidentSeverity",
1305
+ },
1306
+ {
1307
+ column: "incidentOnCallDutyPolicies",
1308
+ title: "Incident on-call policies",
1309
+ kind: SloFeedValueKind.EntityList,
1310
+ },
1311
+ {
1312
+ column: "incidentTitleTemplate",
1313
+ title: "Incident title template",
1314
+ kind: SloFeedValueKind.Opaque,
1315
+ },
1316
+ {
1317
+ column: "incidentDescriptionTemplate",
1318
+ title: "Incident description template",
1319
+ kind: SloFeedValueKind.Opaque,
1320
+ },
1321
+ {
1322
+ column: "incidentRemediationNotes",
1323
+ title: "Incident remediation notes",
1324
+ kind: SloFeedValueKind.Opaque,
1325
+ },
1326
+ {
1327
+ column: "isIncidentPrivate",
1328
+ title: "Private incident",
1329
+ kind: SloFeedValueKind.Boolean,
1330
+ },
1331
+ {
1332
+ column: "autoResolveIncident",
1333
+ title: "Auto-resolve incident",
1334
+ kind: SloFeedValueKind.Boolean,
1335
+ },
1336
+ {
1337
+ column: "incidentLabels",
1338
+ title: "Incident labels",
1339
+ kind: SloFeedValueKind.EntityList,
1340
+ },
1341
+ {
1342
+ column: "incidentOwnerTeams",
1343
+ title: "Incident owner teams",
1344
+ kind: SloFeedValueKind.EntityList,
1345
+ },
1346
+ {
1347
+ column: "incidentOwnerUsers",
1348
+ title: "Incident owner users",
1349
+ kind: SloFeedValueKind.EntityList,
1350
+ relationSelect: USER_RELATION_SELECT,
1351
+ },
1352
+ {
1353
+ column: "addSloOwnersAsOwners",
1354
+ title: "Add SLO owners as owners",
1355
+ kind: SloFeedValueKind.Boolean,
1356
+ },
1357
+ ];
1358
+
1359
+ export interface SloFeedBurnRateRuleDetails extends SloFeedBurnRateRuleSummary {
1360
+ isEnabled?: boolean | undefined;
1361
+ shouldCreateAlert?: boolean | undefined;
1362
+ shouldCreateIncident?: boolean | undefined;
1363
+ }
1364
+
1365
+ type DescribeRuleOutputsFunction = (
1366
+ rule: SloFeedBurnRateRuleDetails,
1367
+ ) => string | null;
1368
+
1369
+ const describeRuleOutputs: DescribeRuleOutputsFunction = (
1370
+ rule: SloFeedBurnRateRuleDetails,
1371
+ ): string | null => {
1372
+ const alert: boolean | null = normalizeSloFeedBoolean(rule.shouldCreateAlert);
1373
+ const incident: boolean | null = normalizeSloFeedBoolean(
1374
+ rule.shouldCreateIncident,
1375
+ );
1376
+
1377
+ if (alert === null && incident === null) {
1378
+ return null;
1379
+ }
1380
+
1381
+ // The column defaults: a rule raises an alert unless told otherwise.
1382
+ const raisesAlert: boolean = alert !== false;
1383
+ const declaresIncident: boolean = incident === true;
1384
+
1385
+ if (raisesAlert && declaresIncident) {
1386
+ return "raises an alert and declares an incident";
1387
+ }
1388
+
1389
+ if (declaresIncident) {
1390
+ return "declares an incident";
1391
+ }
1392
+
1393
+ return raisesAlert ? "raises an alert" : "raises nothing";
1394
+ };
1395
+
1396
+ type GetRuleDetailsFunction = (
1397
+ rule: SloFeedBurnRateRuleDetails,
1398
+ ) => Array<string>;
1399
+
1400
+ const getRuleDetails: GetRuleDetailsFunction = (
1401
+ rule: SloFeedBurnRateRuleDetails,
1402
+ ): Array<string> => {
1403
+ const details: Array<string> = [];
1404
+ const condition: string | null = describeBurnRateCondition(rule);
1405
+
1406
+ if (condition) {
1407
+ details.push(`**Fires on**: ${condition}`);
1408
+ }
1409
+
1410
+ const outputs: string | null = describeRuleOutputs(rule);
1411
+
1412
+ if (outputs) {
1413
+ details.push(`**When it fires**: it ${outputs}`);
1414
+ }
1415
+
1416
+ const enabled: boolean | null = normalizeSloFeedBoolean(rule.isEnabled);
1417
+
1418
+ if (enabled !== null) {
1419
+ details.push(`**Enabled**: ${enabled ? "Yes" : "No"}`);
1420
+ }
1421
+
1422
+ return details;
1423
+ };
1424
+
1425
+ type FormatRuleNameFunction = (name: string | undefined | null) => string;
1426
+
1427
+ const formatRuleName: FormatRuleNameFunction = (
1428
+ name: string | undefined | null,
1429
+ ): string => {
1430
+ return formatSloFeedText(name, 80) || "Unnamed rule";
1431
+ };
1432
+
1433
+ export type GetBurnRateRuleAddedFeedMarkdownFunction = (data: {
1434
+ sloMarkdownLink: string;
1435
+ rule: SloFeedBurnRateRuleDetails;
1436
+ }) => SloFeedMarkdown;
1437
+
1438
+ export const getBurnRateRuleAddedFeedMarkdown: GetBurnRateRuleAddedFeedMarkdownFunction =
1439
+ (data: {
1440
+ sloMarkdownLink: string;
1441
+ rule: SloFeedBurnRateRuleDetails;
1442
+ }): SloFeedMarkdown => {
1443
+ return {
1444
+ feedInfoInMarkdown: `🔥 Burn rate rule **${formatRuleName(data.rule.name)}** was added to ${data.sloMarkdownLink}.`,
1445
+ moreInformationInMarkdown: getRuleDetails(data.rule).join("\n\n"),
1446
+ };
1447
+ };
1448
+
1449
+ export type GetBurnRateRuleChangedFeedMarkdownFunction = (data: {
1450
+ sloMarkdownLink: string;
1451
+ ruleName: string | undefined | null;
1452
+ changes: Array<SloFeedColumnChange>;
1453
+ }) => SloFeedMarkdown;
1454
+
1455
+ export const getBurnRateRuleChangedFeedMarkdown: GetBurnRateRuleChangedFeedMarkdownFunction =
1456
+ (data: {
1457
+ sloMarkdownLink: string;
1458
+ ruleName: string | undefined | null;
1459
+ changes: Array<SloFeedColumnChange>;
1460
+ }): SloFeedMarkdown => {
1461
+ const ruleName: string = formatRuleName(data.ruleName);
1462
+ const onlyChange: SloFeedColumnChange | undefined =
1463
+ data.changes.length === 1 ? data.changes[0] : undefined;
1464
+
1465
+ // Turning a rule on or off is the one change people scan the feed for.
1466
+ if (onlyChange && onlyChange.column === "isEnabled") {
1467
+ const isEnabled: boolean = onlyChange.to === "On";
1468
+
1469
+ return {
1470
+ feedInfoInMarkdown: `🔥 Burn rate rule **${ruleName}** on ${data.sloMarkdownLink} was ${isEnabled ? "enabled" : "disabled"}.`,
1471
+ moreInformationInMarkdown: isEnabled
1472
+ ? "The rule is evaluated again on the next worker tick."
1473
+ : "A disabled rule does not fire. Any alerts and incidents it had open were resolved.",
1474
+ };
1475
+ }
1476
+
1477
+ return {
1478
+ feedInfoInMarkdown: `🔥 Burn rate rule **${ruleName}** on ${data.sloMarkdownLink} was updated: ${formatChangeSummary(data.changes)}.`,
1479
+ moreInformationInMarkdown: data.changes
1480
+ .map(formatChangeLine)
1481
+ .join("\n\n"),
1482
+ };
1483
+ };
1484
+
1485
+ export type GetBurnRateRuleRemovedFeedMarkdownFunction = (data: {
1486
+ sloMarkdownLink: string;
1487
+ rule: SloFeedBurnRateRuleDetails;
1488
+ }) => SloFeedMarkdown;
1489
+
1490
+ export const getBurnRateRuleRemovedFeedMarkdown: GetBurnRateRuleRemovedFeedMarkdownFunction =
1491
+ (data: {
1492
+ sloMarkdownLink: string;
1493
+ rule: SloFeedBurnRateRuleDetails;
1494
+ }): SloFeedMarkdown => {
1495
+ return {
1496
+ feedInfoInMarkdown: `🔥 Burn rate rule **${formatRuleName(data.rule.name)}** was removed from ${data.sloMarkdownLink}.`,
1497
+ moreInformationInMarkdown: [
1498
+ ...getRuleDetails({
1499
+ name: data.rule.name,
1500
+ burnRateThreshold: data.rule.burnRateThreshold,
1501
+ longWindowInMinutes: data.rule.longWindowInMinutes,
1502
+ shortWindowInMinutes: data.rule.shortWindowInMinutes,
1503
+ }),
1504
+ "Any alerts and incidents the rule had open were resolved.",
1505
+ ].join("\n\n"),
1506
+ };
1507
+ };