@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
@@ -16,15 +16,22 @@ import {
16
16
  waitFor,
17
17
  within,
18
18
  } from "@testing-library/react";
19
+ import userEvent from "@testing-library/user-event";
20
+ import { UserEvent } from "@testing-library/user-event/dist/types/setup/setup";
19
21
  import { Mock } from "jest-mock";
20
- import React from "react";
22
+ import React, { ReactElement } from "react";
21
23
  import { MemoryRouter } from "react-router-dom";
22
24
  import { INLINE_TEST_SETTINGS_CHANGED_MESSAGE } from "../../../../App/FeatureSet/Dashboard/src/Components/SecurityEvents/ConnectionTestModal";
23
25
  import SecurityEventConnectionFormModal, {
26
+ CONNECTION_TEST_CHOOSE_PROVIDER_MESSAGE,
24
27
  configFieldName,
28
+ connectionTestDisabledReason,
29
+ connectionTestNeedsSecretsMessage,
30
+ fieldTypeFor,
25
31
  readSecurityEventConnectionForm,
26
32
  removeSecretFieldName,
27
33
  secretFieldName,
34
+ secretFieldTypeFor,
28
35
  securityEventConnectionTestBody,
29
36
  securityEventConnectionUpdatePayload,
30
37
  } from "../../../../App/FeatureSet/Dashboard/src/Components/SecurityEvents/SecurityEventConnectionFormModal";
@@ -35,7 +42,15 @@ import HashedString from "../../../Types/HashedString";
35
42
  import { JSONObject } from "../../../Types/JSON";
36
43
  import ObjectID from "../../../Types/ObjectID";
37
44
  import { SecurityConnectorTestReport } from "../../../Types/SecurityEvent/Connectors/ConnectorDiagnostics";
45
+ import {
46
+ ConnectorField,
47
+ SecurityEventConnectorDefinition,
48
+ getSecurityEventConnectorDefinition,
49
+ } from "../../../Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog";
38
50
  import SecurityEventConnectorProvider from "../../../Types/SecurityEvent/Connectors/SecurityEventConnectorProvider";
51
+ import { GOOGLE_SECOPS_SUPPORTED_REGIONS } from "../../../Types/SecurityEvent/GoogleSecOpsRegion";
52
+ import { ComponentProps as CodeEditorProps } from "../../../UI/Components/CodeEditor/CodeEditor";
53
+ import FormFieldSchemaType from "../../../UI/Components/Forms/Types/FormFieldSchemaType";
39
54
  import API from "../../../UI/Utils/API/API";
40
55
  import ModelAPI from "../../../UI/Utils/ModelAPI/ModelAPI";
41
56
  import ProjectUtil from "../../../UI/Utils/Project";
@@ -48,9 +63,36 @@ type CallbackMock = Mock<() => void>;
48
63
  * pinning are the seams: which fields a provider choice reveals, what the
49
64
  * submit sends for create and edit (secrets omitted when blank), and the
50
65
  * body "Test these settings" posts before anything is saved. The real
51
- * BasicFormModal, BasicForm and CardSelect are exercised; only transport
52
- * and the project id are replaced.
66
+ * BasicFormModal, BasicForm and CardSelect are exercised; only transport,
67
+ * the project id and Monaco's browser-only editor are replaced.
68
+ */
69
+
70
+ /*
71
+ * A JSON field renders Monaco, which cannot run in jsdom. The stand-in is a
72
+ * textarea wired to the same props, so the form's own label, value,
73
+ * placeholder and JSON syntax validation are still the real ones.
53
74
  */
75
+ jest.mock("../../../UI/Components/CodeEditor/CodeEditor", () => {
76
+ return {
77
+ __esModule: true,
78
+ default: (props: CodeEditorProps): ReactElement => {
79
+ return (
80
+ <>
81
+ <textarea
82
+ aria-labelledby={props.ariaLabelledby}
83
+ placeholder={props.placeholder}
84
+ value={props.value ?? props.initialValue ?? ""}
85
+ onChange={(event: React.ChangeEvent<HTMLTextAreaElement>): void => {
86
+ props.onChange?.(event.target.value);
87
+ }}
88
+ onBlur={props.onBlur}
89
+ />
90
+ {props.error && <span role="alert">{props.error}</span>}
91
+ </>
92
+ );
93
+ },
94
+ };
95
+ });
54
96
 
55
97
  const PROJECT_ID: ObjectID = new ObjectID(
56
98
  "11111111-1111-4111-8111-111111111111",
@@ -62,6 +104,57 @@ const AWS_TEMPORARY_KEY_ID: string = "ASIASYNTHETIC0000001";
62
104
  const AWS_LONG_LIVED_KEY_ID: string = "AKIASYNTHETIC0000002";
63
105
  const AWS_SECRET: string = "aws-secret-access-key-synthetic";
64
106
 
107
+ const GOOGLE: string = SecurityEventConnectorProvider.GoogleSecOps;
108
+ const GOOGLE_REGION: string = "europe";
109
+ const GOOGLE_INSTANCE: string =
110
+ "projects/acme/locations/europe/instances/chronicle";
111
+ /*
112
+ * Google's published endpoint prefixes, pinned independently of the shared
113
+ * constant so a truncated or broadened list in that source of truth fails.
114
+ */
115
+ const EXPECTED_GOOGLE_REGIONS: Array<string> = [
116
+ "us",
117
+ "eu",
118
+ "europe",
119
+ "africa-south1",
120
+ "asia-east1",
121
+ "asia-northeast1",
122
+ "asia-northeast3",
123
+ "asia-south1",
124
+ "asia-southeast1",
125
+ "asia-southeast2",
126
+ "australia-southeast1",
127
+ "europe-central2",
128
+ "europe-west12",
129
+ "europe-west2",
130
+ "europe-west3",
131
+ "europe-west6",
132
+ "europe-west9",
133
+ "me-central1",
134
+ "me-central2",
135
+ "me-west1",
136
+ "northamerica-northeast2",
137
+ "southamerica-east1",
138
+ ];
139
+ /*
140
+ * A pasted key as Google downloads it: pretty-printed across lines, a
141
+ * private key whose \n escapes are two literal characters, and the trailing
142
+ * newline a copy from a file usually carries. Every byte must reach the
143
+ * secrets blob.
144
+ */
145
+ const GOOGLE_KEY: string = `${JSON.stringify(
146
+ {
147
+ type: "service_account",
148
+ client_email: "secops-reader@acme.example",
149
+ private_key:
150
+ "-----BEGIN PRIVATE KEY-----\\nsynthetic-key-material\\n-----END PRIVATE KEY-----\\n",
151
+ },
152
+ null,
153
+ 2,
154
+ )}\n`;
155
+ const GOOGLE_NEEDS_KEY_MESSAGE: string =
156
+ "Paste the Service account JSON to test these settings before saving. A saved connection can be tested from its row's Test connection action.";
157
+
65
158
  function report(): SecurityConnectorTestReport {
66
159
  return {
67
160
  provider: "okta",
@@ -131,6 +224,25 @@ function splunkConnection(): SecurityEventConnection {
131
224
  return connection;
132
225
  }
133
226
 
227
+ // A connection carried over from the retired SecOps page with Detections on.
228
+ function googleConnection(
229
+ alertingOnly: boolean = false,
230
+ ): SecurityEventConnection {
231
+ const connection: SecurityEventConnection = new SecurityEventConnection();
232
+ connection._id = CONNECTION_ID;
233
+ connection.projectId = PROJECT_ID;
234
+ connection.name = "Customer SecOps";
235
+ connection.provider = SecurityEventConnectorProvider.GoogleSecOps;
236
+ connection.config = {
237
+ region: GOOGLE_REGION,
238
+ instanceResourceName: GOOGLE_INSTANCE,
239
+ };
240
+ connection.isEnabled = true;
241
+ connection.pollIntervalInMinutes = 5;
242
+ connection.alertingOnly = alertingOnly;
243
+ return connection;
244
+ }
245
+
134
246
  function removeToggles(): Array<HTMLElement> {
135
247
  return screen.queryAllByRole("switch", { name: /^Remove the stored/ });
136
248
  }
@@ -157,6 +269,15 @@ async function next(): Promise<void> {
157
269
  });
158
270
  }
159
271
 
272
+ async function goToStep(title: string): Promise<void> {
273
+ await act(async (): Promise<void> => {
274
+ fireEvent.click(within(progress()).getByText(title));
275
+ });
276
+ await waitFor((): void => {
277
+ expect(activeStep()).toBe(title);
278
+ });
279
+ }
280
+
160
281
  function fill(label: RegExp, value: string): void {
161
282
  fireEvent.change(screen.getByLabelText(label), { target: { value } });
162
283
  }
@@ -198,23 +319,54 @@ async function renderModal(
198
319
  return { onClose, onSaved };
199
320
  }
200
321
 
322
+ function regionCombobox(): HTMLElement {
323
+ return screen.getByRole("combobox", { name: /^Region/ });
324
+ }
325
+
326
+ function serviceAccountEditor(): HTMLElement {
327
+ return screen.getByRole("textbox", { name: /^Service account JSON/ });
328
+ }
329
+
330
+ function alertsCheckbox(): HTMLElement {
331
+ return screen.getByRole("checkbox", { name: "Alerts" });
332
+ }
333
+
334
+ function detectionsCheckbox(): HTMLElement {
335
+ return screen.getByRole("checkbox", { name: "Detections" });
336
+ }
337
+
338
+ function testButton(): HTMLElement {
339
+ return screen.getByRole("button", { name: "Test these settings" });
340
+ }
341
+
342
+ function lastPostBody(): JSONObject {
343
+ const calls: Array<Array<unknown>> = jest.mocked(API.post).mock.calls;
344
+ return (calls[calls.length - 1]?.[0] as unknown as JSONObject)[
345
+ "data"
346
+ ] as JSONObject;
347
+ }
348
+
349
+ function mockTransport(): void {
350
+ jest.spyOn(ProjectUtil, "getCurrentProjectId").mockReturnValue(PROJECT_ID);
351
+ jest
352
+ .spyOn(ModelAPI, "getCommonHeaders")
353
+ .mockReturnValue({ "project-id": PROJECT_ID.toString() });
354
+ jest
355
+ .spyOn(ModelAPI, "create")
356
+ .mockResolvedValue(new HTTPResponse(200, {}, {}));
357
+ jest
358
+ .spyOn(ModelAPI, "updateById")
359
+ .mockResolvedValue(new HTTPResponse(200, {}, {}));
360
+ jest
361
+ .spyOn(API, "post")
362
+ .mockResolvedValue(
363
+ new HTTPResponse(200, report() as unknown as JSONObject, {}),
364
+ );
365
+ }
366
+
201
367
  describe("SecurityEventConnectionFormModal (create)", () => {
202
368
  beforeEach((): void => {
203
- jest.spyOn(ProjectUtil, "getCurrentProjectId").mockReturnValue(PROJECT_ID);
204
- jest
205
- .spyOn(ModelAPI, "getCommonHeaders")
206
- .mockReturnValue({ "project-id": PROJECT_ID.toString() });
207
- jest
208
- .spyOn(ModelAPI, "create")
209
- .mockResolvedValue(new HTTPResponse(200, {}, {}));
210
- jest
211
- .spyOn(ModelAPI, "updateById")
212
- .mockResolvedValue(new HTTPResponse(200, {}, {}));
213
- jest
214
- .spyOn(API, "post")
215
- .mockResolvedValue(
216
- new HTTPResponse(200, report() as unknown as JSONObject, {}),
217
- );
369
+ mockTransport();
218
370
  });
219
371
 
220
372
  afterEach((): void => {
@@ -247,6 +399,7 @@ describe("SecurityEventConnectionFormModal (create)", () => {
247
399
  "Elastic Security",
248
400
  "AWS Security Hub",
249
401
  "Okta System Log",
402
+ "Google SecOps",
250
403
  ]) {
251
404
  expect(
252
405
  within(group).getByRole("radio", { name: new RegExp(title) }),
@@ -290,12 +443,7 @@ describe("SecurityEventConnectionFormModal (create)", () => {
290
443
  screen.queryByLabelText(/^Okta organization URL/),
291
444
  ).not.toBeInTheDocument();
292
445
 
293
- await act(async (): Promise<void> => {
294
- fireEvent.click(within(progress()).getByText("Provider"));
295
- });
296
- await waitFor((): void => {
297
- expect(activeStep()).toBe("Provider");
298
- });
446
+ await goToStep("Provider");
299
447
  await chooseProvider("Okta System Log");
300
448
  await next();
301
449
 
@@ -336,6 +484,42 @@ describe("SecurityEventConnectionFormModal (create)", () => {
336
484
  expect(API.post).not.toHaveBeenCalled();
337
485
  });
338
486
 
487
+ test("Test these settings waits for a required credential on create and says which one", async (): Promise<void> => {
488
+ await renderModal();
489
+ await chooseProvider("Okta System Log");
490
+ await next();
491
+ fill(/^Okta organization URL/, OKTA_ORG_URL);
492
+ await next();
493
+ expect(activeStep()).toBe("Credentials");
494
+
495
+ expect(testButton()).toBeDisabled();
496
+ expect(
497
+ screen.getByText(
498
+ "Enter the API token to test these settings before saving. A saved connection can be tested from its row's Test connection action.",
499
+ ),
500
+ ).toBeVisible();
501
+ fireEvent.click(testButton());
502
+ expect(API.post).not.toHaveBeenCalled();
503
+
504
+ // Whitespace is not a credential.
505
+ await act(async (): Promise<void> => {
506
+ fireEvent.change(screen.getByLabelText(/^API token/), {
507
+ target: { value: " " },
508
+ });
509
+ });
510
+ expect(testButton()).toBeDisabled();
511
+
512
+ await act(async (): Promise<void> => {
513
+ fireEvent.change(screen.getByLabelText(/^API token/), {
514
+ target: { value: OKTA_TOKEN },
515
+ });
516
+ });
517
+ expect(testButton()).toBeEnabled();
518
+ expect(
519
+ screen.queryByText(/to test these settings before saving/),
520
+ ).not.toBeInTheDocument();
521
+ });
522
+
339
523
  test("Test these settings posts the unsaved provider, config and secrets without saving", async (): Promise<void> => {
340
524
  await renderModal();
341
525
  await chooseProvider("Okta System Log");
@@ -349,9 +533,7 @@ describe("SecurityEventConnectionFormModal (create)", () => {
349
533
  fireEvent.change(tokenInput, { target: { value: OKTA_TOKEN } });
350
534
 
351
535
  await act(async (): Promise<void> => {
352
- fireEvent.click(
353
- screen.getByRole("button", { name: "Test these settings" }),
354
- );
536
+ fireEvent.click(testButton());
355
537
  });
356
538
 
357
539
  expect(await screen.findByText("All checks passed")).toBeVisible();
@@ -383,9 +565,7 @@ describe("SecurityEventConnectionFormModal (create)", () => {
383
565
  });
384
566
 
385
567
  await act(async (): Promise<void> => {
386
- fireEvent.click(
387
- screen.getByRole("button", { name: "Test these settings" }),
388
- );
568
+ fireEvent.click(testButton());
389
569
  });
390
570
  expect(await screen.findByText("All checks passed")).toBeVisible();
391
571
 
@@ -404,9 +584,7 @@ describe("SecurityEventConnectionFormModal (create)", () => {
404
584
  ).toBeVisible();
405
585
 
406
586
  await act(async (): Promise<void> => {
407
- fireEvent.click(
408
- screen.getByRole("button", { name: "Test these settings" }),
409
- );
587
+ fireEvent.click(testButton());
410
588
  });
411
589
  expect(await screen.findByText("All checks passed")).toBeVisible();
412
590
  expect(API.post).toHaveBeenCalledTimes(2);
@@ -453,18 +631,14 @@ describe("SecurityEventConnectionFormModal (create)", () => {
453
631
  });
454
632
 
455
633
  await act(async (): Promise<void> => {
456
- fireEvent.click(
457
- screen.getByRole("button", { name: "Test these settings" }),
458
- );
634
+ fireEvent.click(testButton());
459
635
  });
460
636
 
461
637
  expect(
462
638
  await screen.findByText("Configuration: orgUrl must be an https URL."),
463
639
  ).toBeVisible();
464
640
  expect(screen.getByLabelText(/^API token/)).toHaveValue(OKTA_TOKEN);
465
- expect(
466
- screen.getByRole("button", { name: "Test these settings" }),
467
- ).toBeEnabled();
641
+ expect(testButton()).toBeEnabled();
468
642
  });
469
643
 
470
644
  test("creates the model with the provider's config, a secrets JSON string and the polling defaults", async (): Promise<void> => {
@@ -491,10 +665,13 @@ describe("SecurityEventConnectionFormModal (create)", () => {
491
665
  "aria-checked",
492
666
  "true",
493
667
  );
494
- // Sentinel has no alerting-only distinction, so the toggle stays hidden.
668
+ // Sentinel has no alerting-only distinction, so neither control shows.
495
669
  expect(
496
670
  screen.queryByRole("switch", { name: /^Alerts only/ }),
497
671
  ).not.toBeInTheDocument();
672
+ expect(
673
+ screen.queryByRole("group", { name: "Data to import" }),
674
+ ).not.toBeInTheDocument();
498
675
 
499
676
  await act(async (): Promise<void> => {
500
677
  fireEvent.click(footerButton("Create connection"));
@@ -575,21 +752,7 @@ describe("SecurityEventConnectionFormModal (create)", () => {
575
752
 
576
753
  describe("SecurityEventConnectionFormModal (edit and credentials)", () => {
577
754
  beforeEach((): void => {
578
- jest.spyOn(ProjectUtil, "getCurrentProjectId").mockReturnValue(PROJECT_ID);
579
- jest
580
- .spyOn(ModelAPI, "getCommonHeaders")
581
- .mockReturnValue({ "project-id": PROJECT_ID.toString() });
582
- jest
583
- .spyOn(ModelAPI, "create")
584
- .mockResolvedValue(new HTTPResponse(200, {}, {}));
585
- jest
586
- .spyOn(ModelAPI, "updateById")
587
- .mockResolvedValue(new HTTPResponse(200, {}, {}));
588
- jest
589
- .spyOn(API, "post")
590
- .mockResolvedValue(
591
- new HTTPResponse(200, report() as unknown as JSONObject, {}),
592
- );
755
+ mockTransport();
593
756
  });
594
757
 
595
758
  afterEach((): void => {
@@ -628,6 +791,8 @@ describe("SecurityEventConnectionFormModal (edit and credentials)", () => {
628
791
  expect(
629
792
  screen.getByText(/Leave blank to keep the stored value\./),
630
793
  ).toBeVisible();
794
+ // A saved connection tests with its stored token, so nothing is missing.
795
+ expect(testButton()).toBeEnabled();
631
796
 
632
797
  // Blank credentials do not block the step on edit.
633
798
  await next();
@@ -667,15 +832,13 @@ describe("SecurityEventConnectionFormModal (edit and credentials)", () => {
667
832
  expect(onSaved).toHaveBeenCalledTimes(1);
668
833
  });
669
834
 
670
- test("Test these settings on edit sends the connection id with the unsaved edits", async (): Promise<void> => {
835
+ test("Test these settings on edit sends the connection id with the unsaved edits and the scope", async (): Promise<void> => {
671
836
  await renderModal({ connection: oktaConnection() });
672
837
  fill(/^Event filter/, 'eventType sw "security"');
673
838
  await next();
674
839
 
675
840
  await act(async (): Promise<void> => {
676
- fireEvent.click(
677
- screen.getByRole("button", { name: "Test these settings" }),
678
- );
841
+ fireEvent.click(testButton());
679
842
  });
680
843
 
681
844
  expect(await screen.findByText("All checks passed")).toBeVisible();
@@ -685,6 +848,7 @@ describe("SecurityEventConnectionFormModal (edit and credentials)", () => {
685
848
  connectionId: CONNECTION_ID,
686
849
  config: { orgUrl: OKTA_ORG_URL, filter: 'eventType sw "security"' },
687
850
  secrets: {},
851
+ alertingOnly: true,
688
852
  });
689
853
  });
690
854
 
@@ -773,9 +937,7 @@ describe("SecurityEventConnectionFormModal (edit and credentials)", () => {
773
937
  expect(removeToken).toHaveAttribute("aria-checked", "true");
774
938
 
775
939
  await act(async (): Promise<void> => {
776
- fireEvent.click(
777
- screen.getByRole("button", { name: "Test these settings" }),
778
- );
940
+ fireEvent.click(testButton());
779
941
  });
780
942
  expect(await screen.findByText("All checks passed")).toBeVisible();
781
943
  const testCall: JSONObject = jest.mocked(API.post).mock
@@ -784,6 +946,7 @@ describe("SecurityEventConnectionFormModal (edit and credentials)", () => {
784
946
  connectionId: CONNECTION_ID,
785
947
  config: { region: "us-east-1", accessKeyId: AWS_LONG_LIVED_KEY_ID },
786
948
  secrets: { secretAccessKey: AWS_SECRET, sessionToken: null },
949
+ alertingOnly: true,
787
950
  });
788
951
 
789
952
  await next();
@@ -853,6 +1016,538 @@ describe("SecurityEventConnectionFormModal (edit and credentials)", () => {
853
1016
  });
854
1017
  });
855
1018
 
1019
+ /*
1020
+ * Google SecOps used to have its own page, form and model. As a catalog
1021
+ * provider it has to keep everything that form guaranteed: an explicit
1022
+ * region pick from Google's list, a key edited as JSON and stored as the
1023
+ * pasted text, and "Data to import" (Alerts always, Detections optional)
1024
+ * mapped onto alertingOnly with the right polarity.
1025
+ */
1026
+ describe("SecurityEventConnectionFormModal (poll interval bounds)", () => {
1027
+ /*
1028
+ * Every provider shares one Poll Interval field, bounded to whole minutes
1029
+ * from 1 to 1440. The retired Google SecOps form suite pinned those bounds
1030
+ * and nothing else did once it was deleted, so a dropped or widened
1031
+ * validation would let a connection be saved that polls never or
1032
+ * constantly. The edit form is used because it reaches the Polling step
1033
+ * without choosing a provider; the field is the same on create.
1034
+ */
1035
+ beforeEach((): void => {
1036
+ mockTransport();
1037
+ });
1038
+
1039
+ afterEach((): void => {
1040
+ cleanup();
1041
+ jest.restoreAllMocks();
1042
+ });
1043
+
1044
+ function pollIntervalInput(): HTMLElement {
1045
+ return screen.getByRole("spinbutton", { name: /^Poll Interval/ });
1046
+ }
1047
+
1048
+ async function openPollingStep(): Promise<CallbackMock> {
1049
+ const { onSaved }: { onSaved: CallbackMock } = await renderModal({
1050
+ connection: oktaConnection(),
1051
+ });
1052
+ await next();
1053
+ await next();
1054
+ expect(activeStep()).toBe("Polling");
1055
+ expect(pollIntervalInput()).toHaveValue(10);
1056
+ return onSaved;
1057
+ }
1058
+
1059
+ async function saveWithInterval(value: string): Promise<void> {
1060
+ fireEvent.change(pollIntervalInput(), { target: { value } });
1061
+ await act(async (): Promise<void> => {
1062
+ fireEvent.click(footerButton("Save changes"));
1063
+ });
1064
+ }
1065
+
1066
+ test.each([
1067
+ {
1068
+ value: "0",
1069
+ error: "Poll Interval (Minutes) should not be less than 1.",
1070
+ },
1071
+ {
1072
+ value: "1441",
1073
+ error: "Poll Interval (Minutes) should not be more than 1440.",
1074
+ },
1075
+ ])(
1076
+ "$value minutes blocks saving with the form's bound message",
1077
+ async ({ value, error }: { value: string; error: string }) => {
1078
+ const onSaved: CallbackMock = await openPollingStep();
1079
+
1080
+ await saveWithInterval(value);
1081
+
1082
+ expect(await screen.findByText(error)).toBeVisible();
1083
+ expect(activeStep()).toBe("Polling");
1084
+ expect(ModelAPI.updateById).not.toHaveBeenCalled();
1085
+ expect(onSaved).not.toHaveBeenCalled();
1086
+ },
1087
+ );
1088
+
1089
+ test.each([1, 1440])(
1090
+ "%s minutes is inside the bounds and is saved",
1091
+ async (minutes: number) => {
1092
+ const onSaved: CallbackMock = await openPollingStep();
1093
+
1094
+ await saveWithInterval(String(minutes));
1095
+
1096
+ await waitFor((): void => {
1097
+ expect(ModelAPI.updateById).toHaveBeenCalledTimes(1);
1098
+ });
1099
+ const update: { id: ObjectID; data: JSONObject } = jest.mocked(
1100
+ ModelAPI.updateById,
1101
+ ).mock.calls[0]?.[0] as { id: ObjectID; data: JSONObject };
1102
+ expect(update.data["pollIntervalInMinutes"]).toBe(minutes);
1103
+ expect(
1104
+ screen.queryByText(/^Poll Interval \(Minutes\) should not be/),
1105
+ ).not.toBeInTheDocument();
1106
+ expect(onSaved).toHaveBeenCalledTimes(1);
1107
+ },
1108
+ );
1109
+ });
1110
+
1111
+ describe("SecurityEventConnectionFormModal (Google SecOps)", () => {
1112
+ beforeEach((): void => {
1113
+ mockTransport();
1114
+ });
1115
+
1116
+ afterEach((): void => {
1117
+ cleanup();
1118
+ jest.restoreAllMocks();
1119
+ });
1120
+
1121
+ async function openGoogleConnectionStep(): Promise<UserEvent> {
1122
+ await renderModal();
1123
+ await chooseProvider("Google SecOps");
1124
+ await next();
1125
+ expect(activeStep()).toBe("Connection");
1126
+ return userEvent.setup({ delay: null });
1127
+ }
1128
+
1129
+ async function selectRegion(user: UserEvent, region: string): Promise<void> {
1130
+ await user.click(regionCombobox());
1131
+ await user.click(
1132
+ await screen.findByRole("option", { name: region, exact: true }),
1133
+ );
1134
+ }
1135
+
1136
+ async function reachGoogleCredentials(user: UserEvent): Promise<void> {
1137
+ await selectRegion(user, GOOGLE_REGION);
1138
+ fill(/^Instance resource name/, GOOGLE_INSTANCE);
1139
+ await next();
1140
+ expect(activeStep()).toBe("Credentials");
1141
+ }
1142
+
1143
+ async function pasteKey(value: string): Promise<void> {
1144
+ await act(async (): Promise<void> => {
1145
+ fireEvent.change(serviceAccountEditor(), { target: { value } });
1146
+ });
1147
+ }
1148
+
1149
+ test("the region is a required pick from exactly Google's endpoint list, with nothing preselected", async (): Promise<void> => {
1150
+ const user: UserEvent = await openGoogleConnectionStep();
1151
+
1152
+ expect(screen.getByText("Google SecOps settings")).toBeVisible();
1153
+ expect(
1154
+ screen.getByRole("link", { name: /Google SecOps setup guide/ }),
1155
+ ).toHaveAttribute(
1156
+ "href",
1157
+ expect.stringMatching(/\/integrations\/google-secops$/),
1158
+ );
1159
+ expect(screen.getByText("Select a region", { exact: true })).toBeVisible();
1160
+ expect(
1161
+ screen.getByPlaceholderText(
1162
+ "projects/{project}/locations/{location}/instances/{instance}",
1163
+ ),
1164
+ ).toBeVisible();
1165
+
1166
+ await user.click(regionCombobox());
1167
+ const listbox: HTMLElement = await screen.findByRole("listbox");
1168
+ expect(
1169
+ within(listbox)
1170
+ .getAllByRole("option")
1171
+ .map((option: HTMLElement): string => {
1172
+ return option.textContent || "";
1173
+ }),
1174
+ ).toEqual(EXPECTED_GOOGLE_REGIONS);
1175
+ expect([...GOOGLE_SECOPS_SUPPORTED_REGIONS]).toEqual(
1176
+ EXPECTED_GOOGLE_REGIONS,
1177
+ );
1178
+ await user.keyboard("{Escape}");
1179
+
1180
+ // Nothing is preselected: leaving the step without a pick is refused.
1181
+ fill(/^Instance resource name/, GOOGLE_INSTANCE);
1182
+ await next();
1183
+ expect(await screen.findByText("Region is required.")).toBeVisible();
1184
+ expect(activeStep()).toBe("Connection");
1185
+ });
1186
+
1187
+ test("typed text is not a region selection", async (): Promise<void> => {
1188
+ const user: UserEvent = await openGoogleConnectionStep();
1189
+
1190
+ await user.type(regionCombobox(), "us-central1");
1191
+ expect(regionCombobox()).toHaveValue("us-central1");
1192
+ expect(screen.queryByRole("option")).not.toBeInTheDocument();
1193
+ fill(/^Instance resource name/, GOOGLE_INSTANCE);
1194
+ await next();
1195
+
1196
+ expect(await screen.findByText("Region is required.")).toBeVisible();
1197
+ expect(activeStep()).toBe("Connection");
1198
+ expect(API.post).not.toHaveBeenCalled();
1199
+ });
1200
+
1201
+ test("the key is a JSON editor, and testing waits for it to be pasted", async (): Promise<void> => {
1202
+ const user: UserEvent = await openGoogleConnectionStep();
1203
+ await reachGoogleCredentials(user);
1204
+
1205
+ const editor: HTMLElement = serviceAccountEditor();
1206
+ expect(editor.tagName).toBe("TEXTAREA");
1207
+ expect(editor).toHaveAttribute(
1208
+ "placeholder",
1209
+ '{ "client_email": "...", "private_key": "..." }',
1210
+ );
1211
+ expect(
1212
+ within(dialog()).queryByLabelText(/^Service account JSON/, {
1213
+ selector: 'input[type="password"]',
1214
+ }),
1215
+ ).not.toBeInTheDocument();
1216
+ expect(screen.getByText("Google SecOps credentials")).toBeVisible();
1217
+
1218
+ expect(testButton()).toBeDisabled();
1219
+ expect(screen.getByText(GOOGLE_NEEDS_KEY_MESSAGE)).toBeVisible();
1220
+
1221
+ await pasteKey(GOOGLE_KEY);
1222
+ expect(testButton()).toBeEnabled();
1223
+ expect(
1224
+ screen.queryByText(GOOGLE_NEEDS_KEY_MESSAGE),
1225
+ ).not.toBeInTheDocument();
1226
+ });
1227
+
1228
+ test.each(["{", '{"client_email":"reader@example.com",}', "credentials"])(
1229
+ "malformed service-account JSON %j cannot leave the Credentials step",
1230
+ async (malformed: string): Promise<void> => {
1231
+ const user: UserEvent = await openGoogleConnectionStep();
1232
+ await reachGoogleCredentials(user);
1233
+ await pasteKey(malformed);
1234
+ await next();
1235
+
1236
+ expect(
1237
+ (
1238
+ await screen.findAllByText(/Service account JSON is not valid JSON\./)
1239
+ )[0],
1240
+ ).toBeVisible();
1241
+ expect(activeStep()).toBe("Credentials");
1242
+ expect(ModelAPI.create).not.toHaveBeenCalled();
1243
+ },
1244
+ );
1245
+
1246
+ test("Test these settings sends the scalar region and the pasted key byte for byte", async (): Promise<void> => {
1247
+ const user: UserEvent = await openGoogleConnectionStep();
1248
+ await reachGoogleCredentials(user);
1249
+ await pasteKey(GOOGLE_KEY);
1250
+
1251
+ await act(async (): Promise<void> => {
1252
+ fireEvent.click(testButton());
1253
+ });
1254
+ expect(await screen.findByText("All checks passed")).toBeVisible();
1255
+
1256
+ const body: JSONObject = lastPostBody();
1257
+ expect(body).toEqual({
1258
+ provider: GOOGLE,
1259
+ config: { region: GOOGLE_REGION, instanceResourceName: GOOGLE_INSTANCE },
1260
+ secrets: { serviceAccountJson: GOOGLE_KEY },
1261
+ alertingOnly: true,
1262
+ });
1263
+ const secrets: JSONObject = body["secrets"] as JSONObject;
1264
+ expect(typeof secrets["serviceAccountJson"]).toBe("string");
1265
+ expect(secrets["serviceAccountJson"]).toContain("\n");
1266
+ expect((body["config"] as JSONObject)["region"]).not.toEqual({
1267
+ label: GOOGLE_REGION,
1268
+ value: GOOGLE_REGION,
1269
+ });
1270
+ });
1271
+
1272
+ test("Data to import replaces the Alerts only toggle: Alerts fixed, Detections off by default", async (): Promise<void> => {
1273
+ const { onSaved }: { onSaved: CallbackMock } = await renderModal();
1274
+ await chooseProvider("Google SecOps");
1275
+ await next();
1276
+ const user: UserEvent = userEvent.setup({ delay: null });
1277
+ await reachGoogleCredentials(user);
1278
+ await pasteKey(GOOGLE_KEY);
1279
+ await next();
1280
+ expect(activeStep()).toBe("Polling");
1281
+
1282
+ const group: HTMLElement = screen.getByRole("group", {
1283
+ name: "Data to import",
1284
+ });
1285
+ expect(group).toBeVisible();
1286
+ expect(
1287
+ screen.getByText(
1288
+ "Alerts are always imported because Google's API always returns them. Select Detections to also import rule matches that did not generate an alert.",
1289
+ ),
1290
+ ).toBeVisible();
1291
+ expect(alertsCheckbox()).toBeChecked();
1292
+ expect(alertsCheckbox()).toBeDisabled();
1293
+ expect(alertsCheckbox()).toHaveAttribute(
1294
+ "title",
1295
+ "Google's alerts API always includes alerts.",
1296
+ );
1297
+ expect(detectionsCheckbox()).not.toBeChecked();
1298
+ expect(detectionsCheckbox()).toBeEnabled();
1299
+ expect(
1300
+ screen.queryByRole("switch", { name: /^Alerts only/ }),
1301
+ ).not.toBeInTheDocument();
1302
+
1303
+ // The fixed option is not an input a person can clear.
1304
+ expect(alertsCheckbox()).toHaveAttribute("readonly");
1305
+
1306
+ fill(/^Name/, "Customer SecOps");
1307
+ await act(async (): Promise<void> => {
1308
+ fireEvent.click(footerButton("Create connection"));
1309
+ });
1310
+
1311
+ await waitFor((): void => {
1312
+ expect(ModelAPI.create).toHaveBeenCalledTimes(1);
1313
+ });
1314
+ const created: { model: SecurityEventConnection } = jest.mocked(
1315
+ ModelAPI.create,
1316
+ ).mock.calls[0]?.[0] as { model: SecurityEventConnection };
1317
+ expect(created.model.provider).toBe(GOOGLE);
1318
+ expect(created.model.alertingOnly).toBe(true);
1319
+ expect(created.model.config).toEqual({
1320
+ region: GOOGLE_REGION,
1321
+ instanceResourceName: GOOGLE_INSTANCE,
1322
+ });
1323
+ expect(typeof created.model.secrets).toBe("string");
1324
+ expect(JSON.parse(created.model.secrets as string)).toEqual({
1325
+ serviceAccountJson: GOOGLE_KEY,
1326
+ });
1327
+ expect(created.model.pollIntervalInMinutes).toBe(5);
1328
+ expect(created.model.isEnabled).toBe(true);
1329
+ expect(onSaved).toHaveBeenCalledTimes(1);
1330
+ });
1331
+
1332
+ test("selecting Detections creates the connection with alertingOnly false and keeps it across steps", async (): Promise<void> => {
1333
+ await renderModal();
1334
+ await chooseProvider("Google SecOps");
1335
+ await next();
1336
+ const user: UserEvent = userEvent.setup({ delay: null });
1337
+ await reachGoogleCredentials(user);
1338
+ await pasteKey(GOOGLE_KEY);
1339
+ await next();
1340
+
1341
+ await act(async (): Promise<void> => {
1342
+ fireEvent.click(screen.getByText("Detections", { exact: true }));
1343
+ });
1344
+ expect(detectionsCheckbox()).toBeChecked();
1345
+ fill(/^Name/, "Customer SecOps");
1346
+
1347
+ await goToStep("Credentials");
1348
+ expect(serviceAccountEditor()).toHaveValue(GOOGLE_KEY);
1349
+ await goToStep("Connection");
1350
+ expect(screen.getByText(GOOGLE_REGION, { exact: true })).toBeVisible();
1351
+ await next();
1352
+ await next();
1353
+ expect(activeStep()).toBe("Polling");
1354
+ expect(detectionsCheckbox()).toBeChecked();
1355
+
1356
+ await act(async (): Promise<void> => {
1357
+ fireEvent.click(footerButton("Create connection"));
1358
+ });
1359
+ await waitFor((): void => {
1360
+ expect(ModelAPI.create).toHaveBeenCalledTimes(1);
1361
+ });
1362
+ const created: { model: SecurityEventConnection } = jest.mocked(
1363
+ ModelAPI.create,
1364
+ ).mock.calls[0]?.[0] as { model: SecurityEventConnection };
1365
+ expect(created.model.alertingOnly).toBe(false);
1366
+ expect(JSON.parse(created.model.secrets as string)).toEqual({
1367
+ serviceAccountJson: GOOGLE_KEY,
1368
+ });
1369
+ });
1370
+
1371
+ test("editing shows the stored scope, keeps the key optional and tests the unsaved scope with the stored key", async (): Promise<void> => {
1372
+ const { onSaved }: { onSaved: CallbackMock } = await renderModal({
1373
+ connection: googleConnection(false),
1374
+ });
1375
+
1376
+ expect(
1377
+ screen.getByRole("dialog", { name: "Edit connection: Customer SecOps" }),
1378
+ ).toBeVisible();
1379
+ expect(screen.getByText(GOOGLE_REGION, { exact: true })).toBeVisible();
1380
+ expect(screen.getByLabelText(/^Instance resource name/)).toHaveValue(
1381
+ GOOGLE_INSTANCE,
1382
+ );
1383
+
1384
+ await next();
1385
+ expect(activeStep()).toBe("Credentials");
1386
+ expect(serviceAccountEditor()).toHaveValue("");
1387
+ expect(serviceAccountEditor()).toHaveAttribute("placeholder", "Unchanged");
1388
+ expect(
1389
+ screen.getByText(/Leave blank to keep the stored value\./),
1390
+ ).toBeVisible();
1391
+ expect(removeToggles()).toHaveLength(0);
1392
+ expect(testButton()).toBeEnabled();
1393
+
1394
+ await act(async (): Promise<void> => {
1395
+ fireEvent.click(testButton());
1396
+ });
1397
+ expect(await screen.findByText("All checks passed")).toBeVisible();
1398
+ expect(lastPostBody()).toEqual({
1399
+ connectionId: CONNECTION_ID,
1400
+ config: { region: GOOGLE_REGION, instanceResourceName: GOOGLE_INSTANCE },
1401
+ secrets: {},
1402
+ alertingOnly: false,
1403
+ });
1404
+
1405
+ // A blank key does not block the step on edit.
1406
+ await next();
1407
+ expect(activeStep()).toBe("Polling");
1408
+ expect(detectionsCheckbox()).toBeChecked();
1409
+ await act(async (): Promise<void> => {
1410
+ fireEvent.click(detectionsCheckbox());
1411
+ });
1412
+ expect(detectionsCheckbox()).not.toBeChecked();
1413
+
1414
+ // The unsaved scope change is what the next test runs with.
1415
+ await goToStep("Credentials");
1416
+ await act(async (): Promise<void> => {
1417
+ fireEvent.click(testButton());
1418
+ });
1419
+ await waitFor((): void => {
1420
+ expect(API.post).toHaveBeenCalledTimes(2);
1421
+ });
1422
+ expect(lastPostBody()).toEqual({
1423
+ connectionId: CONNECTION_ID,
1424
+ config: { region: GOOGLE_REGION, instanceResourceName: GOOGLE_INSTANCE },
1425
+ secrets: {},
1426
+ alertingOnly: true,
1427
+ });
1428
+
1429
+ await next();
1430
+ expect(activeStep()).toBe("Polling");
1431
+ await act(async (): Promise<void> => {
1432
+ fireEvent.click(footerButton("Save changes"));
1433
+ });
1434
+ await waitFor((): void => {
1435
+ expect(ModelAPI.updateById).toHaveBeenCalledTimes(1);
1436
+ });
1437
+ const update: { data: JSONObject } = jest.mocked(ModelAPI.updateById).mock
1438
+ .calls[0]?.[0] as { data: JSONObject };
1439
+ expect(update.data).toEqual({
1440
+ name: "Customer SecOps",
1441
+ description: "",
1442
+ config: { region: GOOGLE_REGION, instanceResourceName: GOOGLE_INSTANCE },
1443
+ isEnabled: true,
1444
+ pollIntervalInMinutes: 5,
1445
+ alertingOnly: true,
1446
+ });
1447
+ expect(update.data).not.toHaveProperty("secrets");
1448
+ expect(onSaved).toHaveBeenCalledTimes(1);
1449
+ });
1450
+
1451
+ test("an alerts-only connection opens with Detections cleared, and checking it saves alertingOnly false", async (): Promise<void> => {
1452
+ await renderModal({ connection: googleConnection(true) });
1453
+ await next();
1454
+ await next();
1455
+ expect(activeStep()).toBe("Polling");
1456
+ expect(alertsCheckbox()).toBeChecked();
1457
+ expect(detectionsCheckbox()).not.toBeChecked();
1458
+
1459
+ await act(async (): Promise<void> => {
1460
+ fireEvent.click(detectionsCheckbox());
1461
+ });
1462
+ await act(async (): Promise<void> => {
1463
+ fireEvent.click(footerButton("Save changes"));
1464
+ });
1465
+ await waitFor((): void => {
1466
+ expect(ModelAPI.updateById).toHaveBeenCalledTimes(1);
1467
+ });
1468
+ const update: { data: JSONObject } = jest.mocked(ModelAPI.updateById).mock
1469
+ .calls[0]?.[0] as { data: JSONObject };
1470
+ expect(update.data["alertingOnly"]).toBe(false);
1471
+ });
1472
+
1473
+ test("editing with a new key sends it as the pasted string, newlines intact", async (): Promise<void> => {
1474
+ await renderModal({ connection: googleConnection(true) });
1475
+ await next();
1476
+ await pasteKey(GOOGLE_KEY);
1477
+ await next();
1478
+ await act(async (): Promise<void> => {
1479
+ fireEvent.click(footerButton("Save changes"));
1480
+ });
1481
+ await waitFor((): void => {
1482
+ expect(ModelAPI.updateById).toHaveBeenCalledTimes(1);
1483
+ });
1484
+ const update: { data: JSONObject } = jest.mocked(ModelAPI.updateById).mock
1485
+ .calls[0]?.[0] as { data: JSONObject };
1486
+ expect(JSON.parse(update.data["secrets"] as string)).toEqual({
1487
+ serviceAccountJson: GOOGLE_KEY,
1488
+ });
1489
+ });
1490
+
1491
+ test("Update credentials rotates the key in a JSON editor and sends only the new key string", async (): Promise<void> => {
1492
+ const { onSaved }: { onSaved: CallbackMock } = await renderModal({
1493
+ connection: googleConnection(true),
1494
+ credentialsOnly: true,
1495
+ });
1496
+
1497
+ expect(
1498
+ screen.getByRole("dialog", {
1499
+ name: "Update credentials: Customer SecOps",
1500
+ }),
1501
+ ).toBeVisible();
1502
+ expect(
1503
+ within(progress())
1504
+ .getAllByRole("listitem")
1505
+ .map((item: HTMLElement): string => {
1506
+ return item.textContent || "";
1507
+ }),
1508
+ ).toEqual(["Credentials"]);
1509
+ expect(serviceAccountEditor().tagName).toBe("TEXTAREA");
1510
+ expect(
1511
+ screen.queryByRole("group", { name: "Data to import" }),
1512
+ ).not.toBeInTheDocument();
1513
+
1514
+ await act(async (): Promise<void> => {
1515
+ fireEvent.click(footerButton("Update credentials"));
1516
+ });
1517
+ expect(
1518
+ (
1519
+ await screen.findAllByText(/Enter at least one credential to update/)
1520
+ )[0],
1521
+ ).toBeVisible();
1522
+
1523
+ await pasteKey(GOOGLE_KEY);
1524
+ await act(async (): Promise<void> => {
1525
+ fireEvent.click(testButton());
1526
+ });
1527
+ expect(await screen.findByText("All checks passed")).toBeVisible();
1528
+ expect(lastPostBody()).toEqual({
1529
+ connectionId: CONNECTION_ID,
1530
+ secrets: { serviceAccountJson: GOOGLE_KEY },
1531
+ });
1532
+
1533
+ await act(async (): Promise<void> => {
1534
+ fireEvent.click(footerButton("Update credentials"));
1535
+ });
1536
+ await waitFor((): void => {
1537
+ expect(ModelAPI.updateById).toHaveBeenCalledTimes(1);
1538
+ });
1539
+ const update: { data: JSONObject } = jest.mocked(ModelAPI.updateById).mock
1540
+ .calls[0]?.[0] as { data: JSONObject };
1541
+ expect(update.data).toEqual({
1542
+ secrets: JSON.stringify({ serviceAccountJson: GOOGLE_KEY }),
1543
+ });
1544
+ expect(
1545
+ JSON.parse(update.data["secrets"] as string)["serviceAccountJson"],
1546
+ ).toBe(GOOGLE_KEY);
1547
+ expect(onSaved).toHaveBeenCalledTimes(1);
1548
+ });
1549
+ });
1550
+
856
1551
  describe("form value mapping", () => {
857
1552
  const okta: string = SecurityEventConnectorProvider.OktaSystemLog;
858
1553
  const aws: string = SecurityEventConnectorProvider.AwsSecurityHub;
@@ -906,6 +1601,16 @@ describe("form value mapping", () => {
906
1601
  [configFieldName(sentinel, "cloud")]: "public",
907
1602
  });
908
1603
  expect(asString.config["cloud"]).toBe("public");
1604
+
1605
+ const region: ReturnType<typeof readSecurityEventConnectionForm> =
1606
+ readSecurityEventConnectionForm({
1607
+ provider: GOOGLE,
1608
+ [configFieldName(GOOGLE, "region")]: {
1609
+ label: GOOGLE_REGION,
1610
+ value: GOOGLE_REGION,
1611
+ },
1612
+ });
1613
+ expect(region.config).toEqual({ region: GOOGLE_REGION });
909
1614
  });
910
1615
 
911
1616
  test("refuses to map without a provider", (): void => {
@@ -913,11 +1618,75 @@ describe("form value mapping", () => {
913
1618
  readSecurityEventConnectionForm({ name: "No provider" });
914
1619
  }).toThrow("Choose a provider before saving.");
915
1620
  expect((): void => {
916
- readSecurityEventConnectionForm({ provider: "google-secops" });
1621
+ readSecurityEventConnectionForm({ provider: "not-a-provider" });
917
1622
  }).toThrow("Choose a provider before saving.");
918
1623
  });
919
1624
 
920
- test("the test body carries unsaved settings on create and the id plus overlays on edit", (): void => {
1625
+ /*
1626
+ * The failure mode of f5279e6ec1: a credential stored as something other
1627
+ * than the text that was entered. A JSON secret is never trimmed, parsed
1628
+ * or wrapped on its way into the secrets blob.
1629
+ */
1630
+ test("a JSON secret is kept as the exact pasted string", (): void => {
1631
+ const padded: string = ` ${GOOGLE_KEY}\n\n`;
1632
+ const submission: ReturnType<typeof readSecurityEventConnectionForm> =
1633
+ readSecurityEventConnectionForm({
1634
+ provider: GOOGLE,
1635
+ [configFieldName(GOOGLE, "region")]: GOOGLE_REGION,
1636
+ [configFieldName(GOOGLE, "instanceResourceName")]:
1637
+ ` ${GOOGLE_INSTANCE} `,
1638
+ [secretFieldName(GOOGLE, "serviceAccountJson")]: padded,
1639
+ alertingOnly: false,
1640
+ });
1641
+
1642
+ expect(submission.secrets).toEqual({ serviceAccountJson: padded });
1643
+ expect(submission.config).toEqual({
1644
+ region: GOOGLE_REGION,
1645
+ instanceResourceName: GOOGLE_INSTANCE,
1646
+ });
1647
+ expect(submission.alertingOnly).toBe(false);
1648
+ expect(
1649
+ securityEventConnectionUpdatePayload(submission, true)["secrets"],
1650
+ ).toBe(JSON.stringify({ serviceAccountJson: padded }));
1651
+ expect(
1652
+ JSON.parse(
1653
+ securityEventConnectionUpdatePayload(submission, true)[
1654
+ "secrets"
1655
+ ] as string,
1656
+ )["serviceAccountJson"],
1657
+ ).toBe(padded);
1658
+ });
1659
+
1660
+ test("a blank JSON secret means unchanged, and a non-string value is sent as its JSON text", (): void => {
1661
+ for (const blank of ["", " ", "\n\t\n", null, undefined]) {
1662
+ expect(
1663
+ readSecurityEventConnectionForm({
1664
+ provider: GOOGLE,
1665
+ [secretFieldName(GOOGLE, "serviceAccountJson")]: blank,
1666
+ }).secrets,
1667
+ ).toEqual({});
1668
+ }
1669
+
1670
+ const parsed: JSONObject = { client_email: "reader@acme.example" };
1671
+ expect(
1672
+ readSecurityEventConnectionForm({
1673
+ provider: GOOGLE,
1674
+ [secretFieldName(GOOGLE, "serviceAccountJson")]: parsed,
1675
+ }).secrets,
1676
+ ).toEqual({ serviceAccountJson: JSON.stringify(parsed) });
1677
+
1678
+ // Defensive: a wrapped value still yields its text, never an envelope.
1679
+ expect(
1680
+ readSecurityEventConnectionForm({
1681
+ provider: GOOGLE,
1682
+ [secretFieldName(GOOGLE, "serviceAccountJson")]: new HashedString(
1683
+ GOOGLE_KEY,
1684
+ ) as unknown as string,
1685
+ }).secrets,
1686
+ ).toEqual({ serviceAccountJson: GOOGLE_KEY });
1687
+ });
1688
+
1689
+ test("the test body carries unsaved settings on create and the id plus overlays and scope on edit", (): void => {
921
1690
  const values: JSONObject = {
922
1691
  provider: okta,
923
1692
  [configFieldName(okta, "orgUrl")]: OKTA_ORG_URL,
@@ -941,8 +1710,10 @@ describe("form value mapping", () => {
941
1710
  connectionId: CONNECTION_ID,
942
1711
  config: { orgUrl: OKTA_ORG_URL },
943
1712
  secrets: {},
1713
+ alertingOnly: false,
944
1714
  });
945
1715
 
1716
+ // Credentials only: the stored settings are tested with the new secrets.
946
1717
  expect(
947
1718
  securityEventConnectionTestBody({
948
1719
  values: {
@@ -958,6 +1729,33 @@ describe("form value mapping", () => {
958
1729
  });
959
1730
  });
960
1731
 
1732
+ test("the edit test body reports Data to import in alertingOnly's polarity", (): void => {
1733
+ const base: JSONObject = {
1734
+ [configFieldName(GOOGLE, "region")]: GOOGLE_REGION,
1735
+ [configFieldName(GOOGLE, "instanceResourceName")]: GOOGLE_INSTANCE,
1736
+ };
1737
+
1738
+ expect(
1739
+ securityEventConnectionTestBody({
1740
+ values: { ...base, alertingOnly: false },
1741
+ connection: googleConnection(true),
1742
+ })["alertingOnly"],
1743
+ ).toBe(false);
1744
+ expect(
1745
+ securityEventConnectionTestBody({
1746
+ values: { ...base, alertingOnly: true },
1747
+ connection: googleConnection(false),
1748
+ })["alertingOnly"],
1749
+ ).toBe(true);
1750
+ // Anything but an explicit false is alerts-only, as the saved default is.
1751
+ expect(
1752
+ securityEventConnectionTestBody({
1753
+ values: { ...base },
1754
+ connection: googleConnection(false),
1755
+ })["alertingOnly"],
1756
+ ).toBe(true);
1757
+ });
1758
+
961
1759
  test("a Remove toggle maps an optional secret to null and is ignored for a required one", (): void => {
962
1760
  const submission: ReturnType<typeof readSecurityEventConnectionForm> =
963
1761
  readSecurityEventConnectionForm({
@@ -1020,3 +1818,141 @@ describe("form value mapping", () => {
1020
1818
  ).toEqual({ secrets: JSON.stringify({ apiToken: OKTA_TOKEN }) });
1021
1819
  });
1022
1820
  });
1821
+
1822
+ describe("field types and test readiness", () => {
1823
+ function field(overrides: Partial<ConnectorField>): ConnectorField {
1824
+ return {
1825
+ key: "value",
1826
+ title: "Value",
1827
+ description: "",
1828
+ type: "text",
1829
+ required: true,
1830
+ ...overrides,
1831
+ };
1832
+ }
1833
+
1834
+ test("a json field renders as the JSON editor for config and secrets; other secrets stay masked", (): void => {
1835
+ expect(fieldTypeFor(field({ type: "json" }))).toBe(
1836
+ FormFieldSchemaType.JSON,
1837
+ );
1838
+ expect(secretFieldTypeFor(field({ type: "json" }))).toBe(
1839
+ FormFieldSchemaType.JSON,
1840
+ );
1841
+ expect(secretFieldTypeFor(field({ type: "password" }))).toBe(
1842
+ FormFieldSchemaType.Password,
1843
+ );
1844
+ // Whatever else a secret is declared as, it is never shown in clear text.
1845
+ expect(secretFieldTypeFor(field({ type: "text" }))).toBe(
1846
+ FormFieldSchemaType.Password,
1847
+ );
1848
+ expect(fieldTypeFor(field({ type: "dropdown" }))).toBe(
1849
+ FormFieldSchemaType.Dropdown,
1850
+ );
1851
+ expect(fieldTypeFor(field({ type: "url" }))).toBe(FormFieldSchemaType.URL);
1852
+ expect(fieldTypeFor(field({ type: "number" }))).toBe(
1853
+ FormFieldSchemaType.Number,
1854
+ );
1855
+ expect(fieldTypeFor(field({ type: "toggle" }))).toBe(
1856
+ FormFieldSchemaType.Toggle,
1857
+ );
1858
+ expect(fieldTypeFor(field({ type: "text" }))).toBe(
1859
+ FormFieldSchemaType.Text,
1860
+ );
1861
+ });
1862
+
1863
+ test("the Google SecOps catalog entry is what the form above relies on", (): void => {
1864
+ const definition: SecurityEventConnectorDefinition | undefined =
1865
+ getSecurityEventConnectorDefinition(GOOGLE);
1866
+
1867
+ expect(
1868
+ definition?.configFields.map((item: ConnectorField) => {
1869
+ return [item.key, item.type, item.required, item.defaultValue];
1870
+ }),
1871
+ ).toEqual([
1872
+ ["region", "dropdown", true, undefined],
1873
+ ["instanceResourceName", "text", true, undefined],
1874
+ ]);
1875
+ expect(
1876
+ definition?.secretFields.map((item: ConnectorField) => {
1877
+ return [item.key, item.title, item.type, item.required];
1878
+ }),
1879
+ ).toEqual([["serviceAccountJson", "Service account JSON", "json", true]]);
1880
+ expect(definition?.supportsAlertingOnlyToggle).toBe(true);
1881
+ expect(definition?.alertingOnlyControl?.title).toBe("Data to import");
1882
+ });
1883
+
1884
+ test("the needs-credentials message names what is missing in the form's own words", (): void => {
1885
+ expect(
1886
+ connectionTestNeedsSecretsMessage([
1887
+ field({ title: "Service account JSON", type: "json" }),
1888
+ ]),
1889
+ ).toBe(GOOGLE_NEEDS_KEY_MESSAGE);
1890
+ expect(
1891
+ connectionTestNeedsSecretsMessage([
1892
+ field({ title: "Client ID", type: "password" }),
1893
+ field({ title: "Client secret", type: "password" }),
1894
+ field({ title: "Key", type: "json" }),
1895
+ ]),
1896
+ ).toBe(
1897
+ "Enter the Client ID, Client secret and Key to test these settings before saving. A saved connection can be tested from its row's Test connection action.",
1898
+ );
1899
+ expect(
1900
+ connectionTestNeedsSecretsMessage([
1901
+ field({ title: "API token", type: "password" }),
1902
+ field({ title: "Secret", type: "password" }),
1903
+ ]),
1904
+ ).toBe(
1905
+ "Enter the API token and Secret to test these settings before saving. A saved connection can be tested from its row's Test connection action.",
1906
+ );
1907
+ });
1908
+
1909
+ test("testing is blocked without a provider, and on create only by a blank required secret", (): void => {
1910
+ expect(connectionTestDisabledReason({ values: {} })).toBe(
1911
+ CONNECTION_TEST_CHOOSE_PROVIDER_MESSAGE,
1912
+ );
1913
+ expect(
1914
+ connectionTestDisabledReason({ values: { provider: "not-a-provider" } }),
1915
+ ).toBe(CONNECTION_TEST_CHOOSE_PROVIDER_MESSAGE);
1916
+
1917
+ expect(connectionTestDisabledReason({ values: { provider: GOOGLE } })).toBe(
1918
+ GOOGLE_NEEDS_KEY_MESSAGE,
1919
+ );
1920
+ expect(
1921
+ connectionTestDisabledReason({
1922
+ values: {
1923
+ provider: GOOGLE,
1924
+ [secretFieldName(GOOGLE, "serviceAccountJson")]: " \n ",
1925
+ },
1926
+ }),
1927
+ ).toBe(GOOGLE_NEEDS_KEY_MESSAGE);
1928
+ expect(
1929
+ connectionTestDisabledReason({
1930
+ values: {
1931
+ provider: GOOGLE,
1932
+ [secretFieldName(GOOGLE, "serviceAccountJson")]: GOOGLE_KEY,
1933
+ },
1934
+ }),
1935
+ ).toBeUndefined();
1936
+
1937
+ // An optional secret left blank never blocks.
1938
+ expect(
1939
+ connectionTestDisabledReason({
1940
+ values: {
1941
+ provider: SecurityEventConnectorProvider.AwsSecurityHub,
1942
+ [secretFieldName(
1943
+ SecurityEventConnectorProvider.AwsSecurityHub,
1944
+ "secretAccessKey",
1945
+ )]: AWS_SECRET,
1946
+ },
1947
+ }),
1948
+ ).toBeUndefined();
1949
+
1950
+ // A saved connection tests with what is stored.
1951
+ expect(
1952
+ connectionTestDisabledReason({
1953
+ values: {},
1954
+ connection: googleConnection(true),
1955
+ }),
1956
+ ).toBeUndefined();
1957
+ });
1958
+ });