@oneuptime/common 12.0.29 → 12.0.31

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 (664) hide show
  1. package/Models/AnalyticsModels/SecurityEvent.ts +48 -16
  2. package/Models/AnalyticsModels/ThreatIntelIndicator.ts +10 -5
  3. package/Models/DatabaseModels/AlertSeverity.ts +44 -0
  4. package/Models/DatabaseModels/DetectionRule.ts +16 -5
  5. package/Models/DatabaseModels/GoogleSecOpsConnection.ts +14 -5
  6. package/Models/DatabaseModels/IncidentSeverity.ts +44 -0
  7. package/Models/DatabaseModels/Index.ts +13 -0
  8. package/Models/DatabaseModels/NetworkDevice.ts +113 -3
  9. package/Models/DatabaseModels/NetworkDeviceAutoImportRule.ts +88 -0
  10. package/Models/DatabaseModels/NetworkDeviceDiscoveryScan.ts +22 -0
  11. package/Models/DatabaseModels/NetworkDeviceOidTemplate.ts +499 -0
  12. package/Models/DatabaseModels/OnCallDutyPolicySchedule.ts +43 -0
  13. package/Models/DatabaseModels/OnCallDutyPolicyScheduleCalendarFeed.ts +662 -0
  14. package/Models/DatabaseModels/ProjectOnCallCalendarFeed.ts +584 -0
  15. package/Models/DatabaseModels/ThreatIntelFeed.ts +16 -5
  16. package/Models/DatabaseModels/UserOnCallCalendarFeed.ts +546 -0
  17. package/Models/DatabaseModels/UserOnCallShiftReminder.ts +231 -0
  18. package/Models/DatabaseModels/UserOnCallShiftReminderLog.ts +331 -0
  19. package/Server/API/GlobalConfigAPI.ts +362 -183
  20. package/Server/API/OnCallCalendarAPI.ts +2194 -0
  21. package/Server/API/TelemetryAPI.ts +42 -4
  22. package/Server/EnvironmentConfig.ts +250 -0
  23. package/Server/Infrastructure/OnCallCalendarFeedCache.ts +1050 -0
  24. package/Server/Infrastructure/Postgres/SchemaMigrations/1790400000000-AddOnCallCalendarFeeds.ts +253 -0
  25. package/Server/Infrastructure/Postgres/SchemaMigrations/1790500000000-AddNetworkDeviceOidTemplate.ts +59 -0
  26. package/Server/Infrastructure/Postgres/SchemaMigrations/1790600000000-AddAutoImportRuleOidTemplate.ts +25 -0
  27. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +6 -0
  28. package/Server/Middleware/MultipartFormData.ts +118 -32
  29. package/Server/Middleware/OnCallCalendarFeedRateLimit.ts +487 -0
  30. package/Server/Services/AlertEpisodeLabelRuleEngineService.ts +9 -1
  31. package/Server/Services/AlertEpisodeOnCallRuleEngineService.ts +9 -1
  32. package/Server/Services/AlertEpisodeOwnerRuleEngineService.ts +9 -1
  33. package/Server/Services/AlertEpisodePrivacyRuleEngineService.ts +9 -1
  34. package/Server/Services/AlertGroupingEngineService.ts +9 -1
  35. package/Server/Services/AlertLabelRuleEngineService.ts +9 -1
  36. package/Server/Services/AlertOnCallRuleEngineService.ts +9 -1
  37. package/Server/Services/AlertOwnerRuleEngineService.ts +9 -1
  38. package/Server/Services/AlertPrivacyRuleEngineService.ts +9 -1
  39. package/Server/Services/AlertReminderRuleService.ts +9 -1
  40. package/Server/Services/AutoRemediationRuleEngineService.ts +9 -1
  41. package/Server/Services/CephClusterLabelRuleEngineService.ts +9 -1
  42. package/Server/Services/CephClusterOwnerRuleEngineService.ts +9 -1
  43. package/Server/Services/CloudResourceLabelRuleEngineService.ts +9 -1
  44. package/Server/Services/CloudResourceOwnerRuleEngineService.ts +9 -1
  45. package/Server/Services/DashboardLabelRuleEngineService.ts +9 -1
  46. package/Server/Services/DashboardOwnerRuleEngineService.ts +9 -1
  47. package/Server/Services/DockerHostLabelRuleEngineService.ts +9 -1
  48. package/Server/Services/DockerHostOwnerRuleEngineService.ts +9 -1
  49. package/Server/Services/DockerSwarmClusterLabelRuleEngineService.ts +9 -1
  50. package/Server/Services/DockerSwarmClusterOwnerRuleEngineService.ts +9 -1
  51. package/Server/Services/HostLabelRuleEngineService.ts +9 -1
  52. package/Server/Services/HostOwnerRuleEngineService.ts +9 -1
  53. package/Server/Services/IncidentEpisodeLabelRuleEngineService.ts +9 -1
  54. package/Server/Services/IncidentEpisodeOnCallRuleEngineService.ts +9 -1
  55. package/Server/Services/IncidentEpisodeOwnerRuleEngineService.ts +9 -1
  56. package/Server/Services/IncidentEpisodePrivacyRuleEngineService.ts +9 -1
  57. package/Server/Services/IncidentGroupingEngineService.ts +9 -1
  58. package/Server/Services/IncidentLabelRuleEngineService.ts +9 -1
  59. package/Server/Services/IncidentOnCallRuleEngineService.ts +9 -1
  60. package/Server/Services/IncidentOwnerRuleEngineService.ts +9 -1
  61. package/Server/Services/IncidentPrivacyRuleEngineService.ts +9 -1
  62. package/Server/Services/IncidentReminderRuleService.ts +9 -1
  63. package/Server/Services/IncidentSlaRuleService.ts +9 -1
  64. package/Server/Services/IncomingCallPolicyLabelRuleEngineService.ts +9 -1
  65. package/Server/Services/IncomingCallPolicyOwnerRuleEngineService.ts +9 -1
  66. package/Server/Services/Index.ts +14 -0
  67. package/Server/Services/IoTFleetLabelRuleEngineService.ts +9 -1
  68. package/Server/Services/IoTFleetOwnerRuleEngineService.ts +9 -1
  69. package/Server/Services/KubernetesClusterLabelRuleEngineService.ts +9 -1
  70. package/Server/Services/KubernetesClusterOwnerRuleEngineService.ts +9 -1
  71. package/Server/Services/KubernetesResourceService.ts +5 -1
  72. package/Server/Services/MonitorLabelRuleEngineService.ts +9 -1
  73. package/Server/Services/MonitorOwnerRuleEngineService.ts +9 -1
  74. package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +35 -0
  75. package/Server/Services/NetworkDeviceAutoImportRuleService.ts +96 -0
  76. package/Server/Services/NetworkDeviceLabelRuleEngineService.ts +9 -1
  77. package/Server/Services/NetworkDeviceOidTemplateService.ts +201 -0
  78. package/Server/Services/NetworkDeviceOwnerRuleEngineService.ts +9 -1
  79. package/Server/Services/NetworkDeviceService.ts +209 -1
  80. package/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.ts +32 -0
  81. package/Server/Services/OnCallDutyPolicyLabelRuleEngineService.ts +9 -1
  82. package/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.ts +9 -1
  83. package/Server/Services/OnCallDutyPolicyScheduleCalendarFeedService.ts +260 -0
  84. package/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.ts +9 -1
  85. package/Server/Services/OnCallDutyPolicyScheduleLayerService.ts +70 -3
  86. package/Server/Services/OnCallDutyPolicyScheduleLayerUserService.ts +138 -3
  87. package/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.ts +9 -1
  88. package/Server/Services/OnCallDutyPolicyScheduleService.ts +1465 -134
  89. package/Server/Services/OnCallDutyPolicyUserOverrideService.ts +167 -31
  90. package/Server/Services/PodmanHostLabelRuleEngineService.ts +9 -1
  91. package/Server/Services/PodmanHostOwnerRuleEngineService.ts +9 -1
  92. package/Server/Services/ProjectOnCallCalendarFeedService.ts +192 -0
  93. package/Server/Services/ProxmoxClusterLabelRuleEngineService.ts +9 -1
  94. package/Server/Services/ProxmoxClusterOwnerRuleEngineService.ts +9 -1
  95. package/Server/Services/RumApplicationLabelRuleEngineService.ts +9 -1
  96. package/Server/Services/RumApplicationOwnerRuleEngineService.ts +9 -1
  97. package/Server/Services/RunbookLabelRuleEngineService.ts +9 -1
  98. package/Server/Services/RunbookOwnerRuleEngineService.ts +9 -1
  99. package/Server/Services/RunbookRuleEngineService.ts +9 -1
  100. package/Server/Services/ScheduledMaintenanceLabelRuleEngineService.ts +9 -1
  101. package/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.ts +9 -1
  102. package/Server/Services/ScheduledMaintenanceReminderRuleService.ts +9 -1
  103. package/Server/Services/ServerlessFunctionLabelRuleEngineService.ts +9 -1
  104. package/Server/Services/ServerlessFunctionOwnerRuleEngineService.ts +9 -1
  105. package/Server/Services/ServiceLabelRuleEngineService.ts +9 -1
  106. package/Server/Services/ServiceOwnerRuleEngineService.ts +9 -1
  107. package/Server/Services/StatusPageLabelRuleEngineService.ts +9 -1
  108. package/Server/Services/StatusPageMonitorRuleEngineService.ts +7 -0
  109. package/Server/Services/StatusPageOwnerRuleEngineService.ts +9 -1
  110. package/Server/Services/TeamMemberService.ts +489 -1
  111. package/Server/Services/TeamService.ts +50 -0
  112. package/Server/Services/TelemetrySourceMapService.ts +266 -23
  113. package/Server/Services/UserNotificationSettingService.ts +44 -1
  114. package/Server/Services/UserOnCallCalendarFeedService.ts +159 -0
  115. package/Server/Services/UserOnCallShiftReminderLogService.ts +151 -0
  116. package/Server/Services/UserOnCallShiftReminderService.ts +112 -0
  117. package/Server/Services/UserService.ts +27 -0
  118. package/Server/Services/WorkflowLabelRuleEngineService.ts +9 -1
  119. package/Server/Services/WorkflowOwnerRuleEngineService.ts +9 -1
  120. package/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.ts +186 -0
  121. package/Server/Utils/Monitor/CapturedMetricAttributeUtil.ts +245 -0
  122. package/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.ts +21 -2
  123. package/Server/Utils/Monitor/MonitorMetricUtil.ts +55 -21
  124. package/Server/Utils/Monitor/MonitorTemplateUtil.ts +32 -0
  125. package/Server/Utils/Monitor/NetworkDeviceMetricUtil.ts +15 -2
  126. package/Server/Utils/Monitor/NetworkDeviceWalkUtil.ts +18 -1
  127. package/Server/Utils/Monitor/NetworkInventoryUtil.ts +10 -0
  128. package/Server/Utils/Monitor/SeriesResourceLabels.ts +34 -0
  129. package/Server/Utils/OnCall/CalendarFeedToken.ts +241 -0
  130. package/Server/Utils/OnCall/OnCallCalendarFeedRenderer.ts +1488 -0
  131. package/Server/Utils/OnCall/OnCallCalendarFeedUrls.ts +230 -0
  132. package/Server/Utils/OnCall/OnCallShiftChangeListeners.ts +227 -0
  133. package/Server/Utils/OnCall/OnCallShiftMaterializer.ts +1127 -0
  134. package/Server/Utils/OnCall/OnCallShiftReminderListener.ts +174 -0
  135. package/Server/Utils/OnCall/OnCallShiftReminderRunner.ts +2584 -0
  136. package/Server/Utils/Response.ts +134 -0
  137. package/Server/Utils/Rules/RuleEngineRuleRead.ts +48 -0
  138. package/Server/Utils/StartServer.ts +10 -0
  139. package/Server/Utils/Telemetry/AppMetrics.ts +51 -0
  140. package/Server/Utils/Telemetry/ExceptionSanitizer.ts +14 -1
  141. package/Server/Utils/Telemetry/LogExceptionExtractor.ts +14 -2
  142. package/Server/Utils/Telemetry/SourceMapResolver.ts +16 -5
  143. package/Server/Utils/Telemetry/StackTraceParser.ts +399 -0
  144. package/Tests/App/Dashboard/EventOverlayHook.test.tsx +125 -0
  145. package/Tests/App/Dashboard/HeaderImageAssets.test.tsx +93 -0
  146. package/Tests/App/Dashboard/OnCallCalendarFeedLinks.test.tsx +229 -0
  147. package/Tests/App/Dashboard/OnCallCalendarFeedPlanGate.test.tsx +489 -0
  148. package/Tests/App/Dashboard/OnCallCalendarFeedSideMenus.test.tsx +149 -0
  149. package/Tests/App/Dashboard/OnCallCalendarFeedUtil.test.ts +855 -0
  150. package/Tests/App/Dashboard/OnCallPersonalCalendarFeed.test.tsx +1209 -0
  151. package/Tests/App/Dashboard/OnCallReadinessSurfaces.test.tsx +3 -3
  152. package/Tests/App/Dashboard/OnCallSharedCalendarFeedCard.test.tsx +1019 -0
  153. package/Tests/App/Dashboard/OnCallShiftRemindersAndUpcomingShifts.test.tsx +655 -0
  154. package/Tests/App/Dashboard/UserElementEmail.test.tsx +12 -4
  155. package/Tests/App/Dashboard/UserEmailCallSites.test.tsx +1 -1
  156. package/Tests/App/Dashboard/UserSettingsSetupChecklistModel.test.ts +73 -0
  157. package/Tests/Models/DatabaseModels/DomainRoleTierCoverage.test.ts +14 -0
  158. package/Tests/Models/DatabaseModels/ModelRegistryInvariants.test.ts +469 -0
  159. package/Tests/Models/OnCallCalendarFeedModels.test.ts +642 -0
  160. package/Tests/Models/OnCallDutyPolicyScheduleCalendarFeed.test.ts +288 -0
  161. package/Tests/Models/OnCallDutyPolicyScheduleShiftConfigVersion.test.ts +88 -0
  162. package/Tests/Models/SecurityDomainAccessControl.test.ts +429 -0
  163. package/Tests/Models/UserOnCallShiftReminderModels.test.ts +368 -0
  164. package/Tests/Server/API/GlobalConfigLicense.test.ts +657 -0
  165. package/Tests/Server/API/Helpers.ts +8 -0
  166. package/Tests/Server/API/OnCallCalendarAPI.test.ts +4461 -0
  167. package/Tests/Server/API/SecurityEventAttributesAPI.test.ts +84 -6
  168. package/Tests/Server/API/TelemetryResolveStackTraceAPI.test.ts +805 -0
  169. package/Tests/Server/EnvironmentConfigOnCallCalendarFeed.test.ts +357 -0
  170. package/Tests/Server/Infrastructure/OnCallCalendarFeedCache.test.ts +1589 -0
  171. package/Tests/Server/Infrastructure/Postgres/AddOnCallCalendarFeedsMigration.test.ts +394 -0
  172. package/Tests/Server/Middleware/IdentityRateLimit.test.ts +1144 -0
  173. package/Tests/Server/Middleware/MultipartFormData.test.ts +618 -3
  174. package/Tests/Server/Middleware/OnCallCalendarFeedRateLimit.test.ts +1365 -0
  175. package/Tests/Server/Services/FeedRetentionConsistency.test.ts +70 -0
  176. package/Tests/Server/Services/MonitorLabelRuleEngineScale.test.ts +520 -0
  177. package/Tests/Server/Services/NetworkDeviceOidTemplateService.test.ts +332 -0
  178. package/Tests/Server/Services/NetworkDeviceOidTemplateWriteGuards.test.ts +409 -0
  179. package/Tests/Server/Services/OnCallCalendarFeedServices.test.ts +1103 -0
  180. package/Tests/Server/Services/OnCallDutyPolicyScheduleResolver.test.ts +1037 -0
  181. package/Tests/Server/Services/OnCallShiftConfigPropagation.test.ts +1270 -0
  182. package/Tests/Server/Services/RuleEngineRuleFetchLimit.test.ts +239 -0
  183. package/Tests/Server/Services/TeamDeleteMemberCleanup.test.ts +156 -0
  184. package/Tests/Server/Services/TeamMemberOnCallCleanup.test.ts +755 -0
  185. package/Tests/Server/Services/TelemetrySourceMapService.test.ts +1210 -2
  186. package/Tests/Server/Services/UserNotificationSettingShiftReminderDefaults.test.ts +267 -0
  187. package/Tests/Server/Services/UserOnCallShiftReminderServices.test.ts +583 -0
  188. package/Tests/Server/Services/UserServiceSeatLimit.test.ts +182 -0
  189. package/Tests/Server/Types/AnalyticsDatabase/SecurityEventModelPermission.test.ts +255 -0
  190. package/Tests/Server/Types/Database/Permissions/OnCallCalendarFeedPermissions.test.ts +254 -0
  191. package/Tests/Server/Types/Database/Permissions/ReadBlockPermission.test.ts +212 -0
  192. package/Tests/Server/Types/Database/Permissions/SecurityRoleAccess.test.ts +413 -0
  193. package/Tests/Server/Utils/CodeRepository.test.ts +689 -0
  194. package/Tests/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.test.ts +495 -0
  195. package/Tests/Server/Utils/ExceptionSanitizer.test.ts +77 -0
  196. package/Tests/Server/Utils/Monitor/CapturedMetricAttributeUtil.test.ts +284 -0
  197. package/Tests/Server/Utils/Monitor/MonitorCustomMetricAttributes.test.ts +503 -0
  198. package/Tests/Server/Utils/Monitor/MonitorTemplatePrototypePollution.test.ts +106 -0
  199. package/Tests/Server/Utils/Monitor/NetworkDeviceWalkLogWritePath.test.ts +33 -4
  200. package/Tests/Server/Utils/Monitor/NetworkDeviceWalkUtil.test.ts +14 -4
  201. package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +44 -0
  202. package/Tests/Server/Utils/OnCall/CalendarFeedToken.test.ts +467 -0
  203. package/Tests/Server/Utils/OnCall/OnCallCalendarFeedRenderer.test.ts +2142 -0
  204. package/Tests/Server/Utils/OnCall/OnCallCalendarFeedUrls.test.ts +278 -0
  205. package/Tests/Server/Utils/OnCall/OnCallResolverTestHarness.ts +440 -0
  206. package/Tests/Server/Utils/OnCall/OnCallShiftChangeListeners.test.ts +314 -0
  207. package/Tests/Server/Utils/OnCall/OnCallShiftMaterializer.test.ts +1502 -0
  208. package/Tests/Server/Utils/OnCall/OnCallShiftReminderListener.test.ts +491 -0
  209. package/Tests/Server/Utils/OnCall/OnCallShiftReminderRunner.test.ts +3088 -0
  210. package/Tests/Server/Utils/OnCall/OnCallShiftReminderTestHarness.ts +910 -0
  211. package/Tests/Server/Utils/OpenAPISpec.test.ts +536 -0
  212. package/Tests/Server/Utils/ResponseSendCalendarResponse.test.ts +561 -0
  213. package/Tests/Server/Utils/Rules/RuleEngineRuleRead.test.ts +115 -0
  214. package/Tests/Server/Utils/StackTraceParser.test.ts +610 -0
  215. package/Tests/Server/Utils/StartServerEncryptionSecretWarning.test.ts +64 -0
  216. package/Tests/Server/Utils/Telemetry/AppMetrics.test.ts +29 -0
  217. package/Tests/Server/Utils/Telemetry/LogExceptionExtractor.test.ts +0 -0
  218. package/Tests/Server/Utils/Telemetry/SourceMapLimits.test.ts +656 -0
  219. package/Tests/Server/Utils/Telemetry/SourceMapResolver.test.ts +100 -0
  220. package/Tests/Types/Calendar/ICalendar.test.ts +488 -0
  221. package/Tests/Types/Monitor/SnmpMonitor/SnmpOidListUtil.test.ts +454 -0
  222. package/Tests/Types/NotificationSetting/NotificationSettingEventType.test.ts +53 -0
  223. package/Tests/Types/OnCallDutyPolicy/CalendarFeedTestFixtures.ts +310 -0
  224. package/Tests/Types/OnCallDutyPolicy/CalendarFeedWindow.test.ts +205 -0
  225. package/Tests/Types/OnCallDutyPolicy/LayerUtilLayerMetaAndIterationCap.test.ts +458 -0
  226. package/Tests/Types/OnCallDutyPolicy/MaterializedShift.test.ts +197 -0
  227. package/Tests/Types/OnCallDutyPolicy/OnCallCalendarFeedUtil.test.ts +1986 -0
  228. package/Tests/Types/OnCallDutyPolicy/ScheduleShiftUtilGroupKey.test.ts +678 -0
  229. package/Tests/Types/OnCallDutyPolicy/ShiftSeamUtil.test.ts +417 -0
  230. package/Tests/Types/SecurityRolePermissions.test.ts +193 -0
  231. package/Tests/UI/Components/Charts/AnnotationLayout.test.ts +773 -0
  232. package/Tests/UI/Components/Charts/ChartAnnotationRail.test.tsx +789 -0
  233. package/Tests/UI/Components/Charts/ChartBucketIdentity.test.ts +254 -0
  234. package/Tests/UI/Components/Charts/TimeAnnotation.test.ts +471 -0
  235. package/Tests/UI/Components/EditionLabelLicenseRefresh.test.tsx +405 -0
  236. package/Tests/UI/Components/ErrorMessageRefreshControl.test.tsx +83 -0
  237. package/Tests/UI/Components/MarkdownConverters.test.ts +686 -0
  238. package/Tests/UI/Components/ModelTable/BaseModelTableDeleteAndEmptyStates.test.tsx +341 -0
  239. package/Tests/UI/Components/OrderedStatesList.test.tsx +5 -5
  240. package/Tests/UI/Components/PendingProjectInvitations.test.tsx +1 -1
  241. package/Tests/UI/Components/TableSortAndMobileColumns.test.tsx +195 -0
  242. package/Tests/UI/Components/XAxis.test.ts +270 -5
  243. package/Tests/UI/Components/XAxisDaylightSaving.test.ts +113 -0
  244. package/Tests/UI/Styles/ChartFocusRing.test.ts +153 -0
  245. package/Tests/UI/Styles/ChartFocusRingCoverage.test.tsx +377 -0
  246. package/Tests/UI/Styles/ThemeStylesheet.ts +162 -0
  247. package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +10 -0
  248. package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +2 -0
  249. package/Tests/Utils/EnterpriseLicenseSeats.test.ts +507 -0
  250. package/Tests/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.test.ts +951 -1
  251. package/Tests/Utils/NetworkDiscovery/DiscoveredHostUtil.test.ts +238 -0
  252. package/Tests/Utils/NetworkDiscovery/DiscoveryReverseDnsChain.test.ts +1056 -0
  253. package/Tests/Utils/NetworkDiscovery/ReverseDnsNameUtil.test.ts +882 -0
  254. package/Types/Calendar/ICalendar.ts +442 -0
  255. package/Types/Date.ts +39 -0
  256. package/Types/Email/EmailTemplateType.ts +2 -0
  257. package/Types/Monitor/SnmpMonitor/SnmpOidListUtil.ts +333 -0
  258. package/Types/NotificationSetting/NotificationSettingEventType.ts +4 -0
  259. package/Types/OnCallDutyPolicy/CalendarFeedWindow.ts +140 -0
  260. package/Types/OnCallDutyPolicy/Layer.ts +190 -35
  261. package/Types/OnCallDutyPolicy/MaterializedShift.ts +274 -0
  262. package/Types/OnCallDutyPolicy/OnCallCalendarFeedUtil.ts +1415 -0
  263. package/Types/OnCallDutyPolicy/ScheduleShiftUtil.ts +159 -4
  264. package/Types/OnCallDutyPolicy/ShiftSeamUtil.ts +106 -0
  265. package/Types/Permission.ts +96 -0
  266. package/Types/Rum/SessionReplay.ts +21 -0
  267. package/Types/Telemetry/SourceMap.ts +8 -0
  268. package/UI/Components/Charts/ChartLibrary/Annotations/AnnotationHoverCard.tsx +176 -0
  269. package/UI/Components/Charts/ChartLibrary/Annotations/AnnotationLayout.ts +745 -0
  270. package/UI/Components/Charts/ChartLibrary/Annotations/ChartAnnotationLayer.tsx +576 -0
  271. package/UI/Components/Charts/ChartLibrary/Annotations/UseChartAnnotations.tsx +204 -0
  272. package/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.tsx +491 -544
  273. package/UI/Components/Charts/ChartLibrary/BarChart/BarChart.tsx +324 -372
  274. package/UI/Components/Charts/ChartLibrary/LineChart/LineChart.tsx +487 -540
  275. package/UI/Components/Charts/ChartLibrary/Types/FormattedReferenceRegion.ts +7 -3
  276. package/UI/Components/Charts/ChartLibrary/Types/FormattedTimeReferenceLine.ts +14 -3
  277. package/UI/Components/Charts/Types/ChartEventKind.ts +13 -0
  278. package/UI/Components/Charts/Types/ReferenceRegionProps.ts +6 -0
  279. package/UI/Components/Charts/Types/TimeReferenceLineProps.ts +20 -3
  280. package/UI/Components/Charts/Utils/TimeAnnotation.ts +69 -35
  281. package/UI/Components/Charts/Utils/XAxis.ts +125 -18
  282. package/UI/Components/EditionLabel/EditionLabel.tsx +280 -26
  283. package/UI/Components/ErrorMessage/ErrorMessage.tsx +21 -10
  284. package/UI/Components/Feed/FeedItem.tsx +4 -5
  285. package/UI/Components/Header/HeaderIconDropdownButton.tsx +1 -2
  286. package/UI/Components/Header/UserProfile/UserProfile.tsx +1 -2
  287. package/UI/Components/Image/Image.tsx +20 -3
  288. package/UI/Components/Markdown.tsx/MarkdownConverters.ts +0 -0
  289. package/UI/Components/MemberRoleAssignment/MemberRoleAssignment.tsx +1 -2
  290. package/UI/Components/ModelTable/BaseModelTable.tsx +150 -24
  291. package/UI/Components/Table/TableHeader.tsx +64 -48
  292. package/UI/Components/Table/TableRow.tsx +13 -3
  293. package/UI/Styles/Theme.css +38 -0
  294. package/Utils/EnterpriseLicense/EnterpriseLicenseSeats.ts +271 -0
  295. package/Utils/NetworkDiscovery/AutoImportRuleMatcher.ts +6 -0
  296. package/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.ts +141 -10
  297. package/Utils/NetworkDiscovery/DiscoveredHostUtil.ts +55 -3
  298. package/Utils/NetworkDiscovery/ReverseDnsNameUtil.ts +151 -0
  299. package/Utils/Rules/RuleEngineLimits.ts +32 -0
  300. package/build/dist/Models/AnalyticsModels/SecurityEvent.js +48 -16
  301. package/build/dist/Models/AnalyticsModels/SecurityEvent.js.map +1 -1
  302. package/build/dist/Models/AnalyticsModels/ThreatIntelIndicator.js +10 -5
  303. package/build/dist/Models/AnalyticsModels/ThreatIntelIndicator.js.map +1 -1
  304. package/build/dist/Models/DatabaseModels/AlertSeverity.js +46 -1
  305. package/build/dist/Models/DatabaseModels/AlertSeverity.js.map +1 -1
  306. package/build/dist/Models/DatabaseModels/DetectionRule.js +16 -5
  307. package/build/dist/Models/DatabaseModels/DetectionRule.js.map +1 -1
  308. package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js +14 -5
  309. package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js.map +1 -1
  310. package/build/dist/Models/DatabaseModels/IncidentSeverity.js +46 -1
  311. package/build/dist/Models/DatabaseModels/IncidentSeverity.js.map +1 -1
  312. package/build/dist/Models/DatabaseModels/Index.js +13 -0
  313. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  314. package/build/dist/Models/DatabaseModels/NetworkDevice.js +115 -3
  315. package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
  316. package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js +88 -0
  317. package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js.map +1 -1
  318. package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -1
  319. package/build/dist/Models/DatabaseModels/NetworkDeviceOidTemplate.js +519 -0
  320. package/build/dist/Models/DatabaseModels/NetworkDeviceOidTemplate.js.map +1 -0
  321. package/build/dist/Models/DatabaseModels/OnCallDutyPolicySchedule.js +44 -0
  322. package/build/dist/Models/DatabaseModels/OnCallDutyPolicySchedule.js.map +1 -1
  323. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleCalendarFeed.js +699 -0
  324. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleCalendarFeed.js.map +1 -0
  325. package/build/dist/Models/DatabaseModels/ProjectOnCallCalendarFeed.js +620 -0
  326. package/build/dist/Models/DatabaseModels/ProjectOnCallCalendarFeed.js.map +1 -0
  327. package/build/dist/Models/DatabaseModels/ThreatIntelFeed.js +16 -5
  328. package/build/dist/Models/DatabaseModels/ThreatIntelFeed.js.map +1 -1
  329. package/build/dist/Models/DatabaseModels/UserOnCallCalendarFeed.js +585 -0
  330. package/build/dist/Models/DatabaseModels/UserOnCallCalendarFeed.js.map +1 -0
  331. package/build/dist/Models/DatabaseModels/UserOnCallShiftReminder.js +247 -0
  332. package/build/dist/Models/DatabaseModels/UserOnCallShiftReminder.js.map +1 -0
  333. package/build/dist/Models/DatabaseModels/UserOnCallShiftReminderLog.js +355 -0
  334. package/build/dist/Models/DatabaseModels/UserOnCallShiftReminderLog.js.map +1 -0
  335. package/build/dist/Server/API/GlobalConfigAPI.js +293 -176
  336. package/build/dist/Server/API/GlobalConfigAPI.js.map +1 -1
  337. package/build/dist/Server/API/OnCallCalendarAPI.js +1371 -0
  338. package/build/dist/Server/API/OnCallCalendarAPI.js.map +1 -0
  339. package/build/dist/Server/API/TelemetryAPI.js +31 -3
  340. package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
  341. package/build/dist/Server/EnvironmentConfig.js +185 -0
  342. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  343. package/build/dist/Server/Infrastructure/OnCallCalendarFeedCache.js +663 -0
  344. package/build/dist/Server/Infrastructure/OnCallCalendarFeedCache.js.map +1 -0
  345. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790400000000-AddOnCallCalendarFeeds.js +103 -0
  346. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790400000000-AddOnCallCalendarFeeds.js.map +1 -0
  347. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790500000000-AddNetworkDeviceOidTemplate.js +26 -0
  348. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790500000000-AddNetworkDeviceOidTemplate.js.map +1 -0
  349. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790600000000-AddAutoImportRuleOidTemplate.js +14 -0
  350. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790600000000-AddAutoImportRuleOidTemplate.js.map +1 -0
  351. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +6 -0
  352. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  353. package/build/dist/Server/Middleware/MultipartFormData.js +93 -28
  354. package/build/dist/Server/Middleware/MultipartFormData.js.map +1 -1
  355. package/build/dist/Server/Middleware/OnCallCalendarFeedRateLimit.js +342 -0
  356. package/build/dist/Server/Middleware/OnCallCalendarFeedRateLimit.js.map +1 -0
  357. package/build/dist/Server/Services/AlertEpisodeLabelRuleEngineService.js +8 -1
  358. package/build/dist/Server/Services/AlertEpisodeLabelRuleEngineService.js.map +1 -1
  359. package/build/dist/Server/Services/AlertEpisodeOnCallRuleEngineService.js +8 -1
  360. package/build/dist/Server/Services/AlertEpisodeOnCallRuleEngineService.js.map +1 -1
  361. package/build/dist/Server/Services/AlertEpisodeOwnerRuleEngineService.js +8 -1
  362. package/build/dist/Server/Services/AlertEpisodeOwnerRuleEngineService.js.map +1 -1
  363. package/build/dist/Server/Services/AlertEpisodePrivacyRuleEngineService.js +8 -1
  364. package/build/dist/Server/Services/AlertEpisodePrivacyRuleEngineService.js.map +1 -1
  365. package/build/dist/Server/Services/AlertGroupingEngineService.js +8 -1
  366. package/build/dist/Server/Services/AlertGroupingEngineService.js.map +1 -1
  367. package/build/dist/Server/Services/AlertLabelRuleEngineService.js +8 -1
  368. package/build/dist/Server/Services/AlertLabelRuleEngineService.js.map +1 -1
  369. package/build/dist/Server/Services/AlertOnCallRuleEngineService.js +8 -1
  370. package/build/dist/Server/Services/AlertOnCallRuleEngineService.js.map +1 -1
  371. package/build/dist/Server/Services/AlertOwnerRuleEngineService.js +8 -1
  372. package/build/dist/Server/Services/AlertOwnerRuleEngineService.js.map +1 -1
  373. package/build/dist/Server/Services/AlertPrivacyRuleEngineService.js +8 -1
  374. package/build/dist/Server/Services/AlertPrivacyRuleEngineService.js.map +1 -1
  375. package/build/dist/Server/Services/AlertReminderRuleService.js +8 -1
  376. package/build/dist/Server/Services/AlertReminderRuleService.js.map +1 -1
  377. package/build/dist/Server/Services/AutoRemediationRuleEngineService.js +8 -1
  378. package/build/dist/Server/Services/AutoRemediationRuleEngineService.js.map +1 -1
  379. package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js +8 -1
  380. package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js.map +1 -1
  381. package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js +8 -1
  382. package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js.map +1 -1
  383. package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js +8 -1
  384. package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js.map +1 -1
  385. package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js +8 -1
  386. package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js.map +1 -1
  387. package/build/dist/Server/Services/DashboardLabelRuleEngineService.js +8 -1
  388. package/build/dist/Server/Services/DashboardLabelRuleEngineService.js.map +1 -1
  389. package/build/dist/Server/Services/DashboardOwnerRuleEngineService.js +8 -1
  390. package/build/dist/Server/Services/DashboardOwnerRuleEngineService.js.map +1 -1
  391. package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js +8 -1
  392. package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js.map +1 -1
  393. package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js +8 -1
  394. package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js.map +1 -1
  395. package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js +8 -1
  396. package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js.map +1 -1
  397. package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js +8 -1
  398. package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js.map +1 -1
  399. package/build/dist/Server/Services/HostLabelRuleEngineService.js +8 -1
  400. package/build/dist/Server/Services/HostLabelRuleEngineService.js.map +1 -1
  401. package/build/dist/Server/Services/HostOwnerRuleEngineService.js +8 -1
  402. package/build/dist/Server/Services/HostOwnerRuleEngineService.js.map +1 -1
  403. package/build/dist/Server/Services/IncidentEpisodeLabelRuleEngineService.js +8 -1
  404. package/build/dist/Server/Services/IncidentEpisodeLabelRuleEngineService.js.map +1 -1
  405. package/build/dist/Server/Services/IncidentEpisodeOnCallRuleEngineService.js +8 -1
  406. package/build/dist/Server/Services/IncidentEpisodeOnCallRuleEngineService.js.map +1 -1
  407. package/build/dist/Server/Services/IncidentEpisodeOwnerRuleEngineService.js +8 -1
  408. package/build/dist/Server/Services/IncidentEpisodeOwnerRuleEngineService.js.map +1 -1
  409. package/build/dist/Server/Services/IncidentEpisodePrivacyRuleEngineService.js +8 -1
  410. package/build/dist/Server/Services/IncidentEpisodePrivacyRuleEngineService.js.map +1 -1
  411. package/build/dist/Server/Services/IncidentGroupingEngineService.js +8 -1
  412. package/build/dist/Server/Services/IncidentGroupingEngineService.js.map +1 -1
  413. package/build/dist/Server/Services/IncidentLabelRuleEngineService.js +8 -1
  414. package/build/dist/Server/Services/IncidentLabelRuleEngineService.js.map +1 -1
  415. package/build/dist/Server/Services/IncidentOnCallRuleEngineService.js +8 -1
  416. package/build/dist/Server/Services/IncidentOnCallRuleEngineService.js.map +1 -1
  417. package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js +8 -1
  418. package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js.map +1 -1
  419. package/build/dist/Server/Services/IncidentPrivacyRuleEngineService.js +8 -1
  420. package/build/dist/Server/Services/IncidentPrivacyRuleEngineService.js.map +1 -1
  421. package/build/dist/Server/Services/IncidentReminderRuleService.js +8 -1
  422. package/build/dist/Server/Services/IncidentReminderRuleService.js.map +1 -1
  423. package/build/dist/Server/Services/IncidentSlaRuleService.js +8 -1
  424. package/build/dist/Server/Services/IncidentSlaRuleService.js.map +1 -1
  425. package/build/dist/Server/Services/IncomingCallPolicyLabelRuleEngineService.js +8 -1
  426. package/build/dist/Server/Services/IncomingCallPolicyLabelRuleEngineService.js.map +1 -1
  427. package/build/dist/Server/Services/IncomingCallPolicyOwnerRuleEngineService.js +8 -1
  428. package/build/dist/Server/Services/IncomingCallPolicyOwnerRuleEngineService.js.map +1 -1
  429. package/build/dist/Server/Services/Index.js +14 -0
  430. package/build/dist/Server/Services/Index.js.map +1 -1
  431. package/build/dist/Server/Services/IoTFleetLabelRuleEngineService.js +8 -1
  432. package/build/dist/Server/Services/IoTFleetLabelRuleEngineService.js.map +1 -1
  433. package/build/dist/Server/Services/IoTFleetOwnerRuleEngineService.js +8 -1
  434. package/build/dist/Server/Services/IoTFleetOwnerRuleEngineService.js.map +1 -1
  435. package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js +8 -1
  436. package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js.map +1 -1
  437. package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js +8 -1
  438. package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js.map +1 -1
  439. package/build/dist/Server/Services/KubernetesResourceService.js +5 -1
  440. package/build/dist/Server/Services/KubernetesResourceService.js.map +1 -1
  441. package/build/dist/Server/Services/MonitorLabelRuleEngineService.js +8 -1
  442. package/build/dist/Server/Services/MonitorLabelRuleEngineService.js.map +1 -1
  443. package/build/dist/Server/Services/MonitorOwnerRuleEngineService.js +8 -1
  444. package/build/dist/Server/Services/MonitorOwnerRuleEngineService.js.map +1 -1
  445. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +30 -21
  446. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
  447. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js +64 -0
  448. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js.map +1 -1
  449. package/build/dist/Server/Services/NetworkDeviceLabelRuleEngineService.js +8 -1
  450. package/build/dist/Server/Services/NetworkDeviceLabelRuleEngineService.js.map +1 -1
  451. package/build/dist/Server/Services/NetworkDeviceOidTemplateService.js +180 -0
  452. package/build/dist/Server/Services/NetworkDeviceOidTemplateService.js.map +1 -0
  453. package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js +8 -1
  454. package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js.map +1 -1
  455. package/build/dist/Server/Services/NetworkDeviceService.js +154 -1
  456. package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
  457. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js +20 -0
  458. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js.map +1 -1
  459. package/build/dist/Server/Services/OnCallDutyPolicyLabelRuleEngineService.js +8 -1
  460. package/build/dist/Server/Services/OnCallDutyPolicyLabelRuleEngineService.js.map +1 -1
  461. package/build/dist/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.js +8 -1
  462. package/build/dist/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.js.map +1 -1
  463. package/build/dist/Server/Services/OnCallDutyPolicyScheduleCalendarFeedService.js +219 -0
  464. package/build/dist/Server/Services/OnCallDutyPolicyScheduleCalendarFeedService.js.map +1 -0
  465. package/build/dist/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.js +8 -1
  466. package/build/dist/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.js.map +1 -1
  467. package/build/dist/Server/Services/OnCallDutyPolicyScheduleLayerService.js +47 -3
  468. package/build/dist/Server/Services/OnCallDutyPolicyScheduleLayerService.js.map +1 -1
  469. package/build/dist/Server/Services/OnCallDutyPolicyScheduleLayerUserService.js +112 -3
  470. package/build/dist/Server/Services/OnCallDutyPolicyScheduleLayerUserService.js.map +1 -1
  471. package/build/dist/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.js +8 -1
  472. package/build/dist/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.js.map +1 -1
  473. package/build/dist/Server/Services/OnCallDutyPolicyScheduleService.js +955 -9
  474. package/build/dist/Server/Services/OnCallDutyPolicyScheduleService.js.map +1 -1
  475. package/build/dist/Server/Services/OnCallDutyPolicyUserOverrideService.js +93 -6
  476. package/build/dist/Server/Services/OnCallDutyPolicyUserOverrideService.js.map +1 -1
  477. package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js +8 -1
  478. package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js.map +1 -1
  479. package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js +8 -1
  480. package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js.map +1 -1
  481. package/build/dist/Server/Services/ProjectOnCallCalendarFeedService.js +157 -0
  482. package/build/dist/Server/Services/ProjectOnCallCalendarFeedService.js.map +1 -0
  483. package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js +8 -1
  484. package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js.map +1 -1
  485. package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js +8 -1
  486. package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js.map +1 -1
  487. package/build/dist/Server/Services/RumApplicationLabelRuleEngineService.js +8 -1
  488. package/build/dist/Server/Services/RumApplicationLabelRuleEngineService.js.map +1 -1
  489. package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js +8 -1
  490. package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js.map +1 -1
  491. package/build/dist/Server/Services/RunbookLabelRuleEngineService.js +8 -1
  492. package/build/dist/Server/Services/RunbookLabelRuleEngineService.js.map +1 -1
  493. package/build/dist/Server/Services/RunbookOwnerRuleEngineService.js +8 -1
  494. package/build/dist/Server/Services/RunbookOwnerRuleEngineService.js.map +1 -1
  495. package/build/dist/Server/Services/RunbookRuleEngineService.js +8 -1
  496. package/build/dist/Server/Services/RunbookRuleEngineService.js.map +1 -1
  497. package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js +8 -1
  498. package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js.map +1 -1
  499. package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js +8 -1
  500. package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js.map +1 -1
  501. package/build/dist/Server/Services/ScheduledMaintenanceReminderRuleService.js +8 -1
  502. package/build/dist/Server/Services/ScheduledMaintenanceReminderRuleService.js.map +1 -1
  503. package/build/dist/Server/Services/ServerlessFunctionLabelRuleEngineService.js +8 -1
  504. package/build/dist/Server/Services/ServerlessFunctionLabelRuleEngineService.js.map +1 -1
  505. package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js +8 -1
  506. package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js.map +1 -1
  507. package/build/dist/Server/Services/ServiceLabelRuleEngineService.js +8 -1
  508. package/build/dist/Server/Services/ServiceLabelRuleEngineService.js.map +1 -1
  509. package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js +8 -1
  510. package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js.map +1 -1
  511. package/build/dist/Server/Services/StatusPageLabelRuleEngineService.js +8 -1
  512. package/build/dist/Server/Services/StatusPageLabelRuleEngineService.js.map +1 -1
  513. package/build/dist/Server/Services/StatusPageMonitorRuleEngineService.js +6 -0
  514. package/build/dist/Server/Services/StatusPageMonitorRuleEngineService.js.map +1 -1
  515. package/build/dist/Server/Services/StatusPageOwnerRuleEngineService.js +8 -1
  516. package/build/dist/Server/Services/StatusPageOwnerRuleEngineService.js.map +1 -1
  517. package/build/dist/Server/Services/TeamMemberService.js +396 -1
  518. package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
  519. package/build/dist/Server/Services/TeamService.js +43 -0
  520. package/build/dist/Server/Services/TeamService.js.map +1 -1
  521. package/build/dist/Server/Services/TelemetrySourceMapService.js +213 -19
  522. package/build/dist/Server/Services/TelemetrySourceMapService.js.map +1 -1
  523. package/build/dist/Server/Services/UserNotificationSettingService.js +26 -1
  524. package/build/dist/Server/Services/UserNotificationSettingService.js.map +1 -1
  525. package/build/dist/Server/Services/UserOnCallCalendarFeedService.js +140 -0
  526. package/build/dist/Server/Services/UserOnCallCalendarFeedService.js.map +1 -0
  527. package/build/dist/Server/Services/UserOnCallShiftReminderLogService.js +116 -0
  528. package/build/dist/Server/Services/UserOnCallShiftReminderLogService.js.map +1 -0
  529. package/build/dist/Server/Services/UserOnCallShiftReminderService.js +92 -0
  530. package/build/dist/Server/Services/UserOnCallShiftReminderService.js.map +1 -0
  531. package/build/dist/Server/Services/UserService.js +25 -0
  532. package/build/dist/Server/Services/UserService.js.map +1 -1
  533. package/build/dist/Server/Services/WorkflowLabelRuleEngineService.js +8 -1
  534. package/build/dist/Server/Services/WorkflowLabelRuleEngineService.js.map +1 -1
  535. package/build/dist/Server/Services/WorkflowOwnerRuleEngineService.js +8 -1
  536. package/build/dist/Server/Services/WorkflowOwnerRuleEngineService.js.map +1 -1
  537. package/build/dist/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.js +145 -0
  538. package/build/dist/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.js.map +1 -0
  539. package/build/dist/Server/Utils/Monitor/CapturedMetricAttributeUtil.js +201 -0
  540. package/build/dist/Server/Utils/Monitor/CapturedMetricAttributeUtil.js.map +1 -0
  541. package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js +19 -2
  542. package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js.map +1 -1
  543. package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js +42 -23
  544. package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js.map +1 -1
  545. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +29 -0
  546. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
  547. package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js +11 -2
  548. package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js.map +1 -1
  549. package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js +16 -1
  550. package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js.map +1 -1
  551. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +10 -0
  552. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
  553. package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js +33 -0
  554. package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js.map +1 -1
  555. package/build/dist/Server/Utils/OnCall/CalendarFeedToken.js +161 -0
  556. package/build/dist/Server/Utils/OnCall/CalendarFeedToken.js.map +1 -0
  557. package/build/dist/Server/Utils/OnCall/OnCallCalendarFeedRenderer.js +983 -0
  558. package/build/dist/Server/Utils/OnCall/OnCallCalendarFeedRenderer.js.map +1 -0
  559. package/build/dist/Server/Utils/OnCall/OnCallCalendarFeedUrls.js +155 -0
  560. package/build/dist/Server/Utils/OnCall/OnCallCalendarFeedUrls.js.map +1 -0
  561. package/build/dist/Server/Utils/OnCall/OnCallShiftChangeListeners.js +145 -0
  562. package/build/dist/Server/Utils/OnCall/OnCallShiftChangeListeners.js.map +1 -0
  563. package/build/dist/Server/Utils/OnCall/OnCallShiftMaterializer.js +752 -0
  564. package/build/dist/Server/Utils/OnCall/OnCallShiftMaterializer.js.map +1 -0
  565. package/build/dist/Server/Utils/OnCall/OnCallShiftReminderListener.js +92 -0
  566. package/build/dist/Server/Utils/OnCall/OnCallShiftReminderListener.js.map +1 -0
  567. package/build/dist/Server/Utils/OnCall/OnCallShiftReminderRunner.js +1786 -0
  568. package/build/dist/Server/Utils/OnCall/OnCallShiftReminderRunner.js.map +1 -0
  569. package/build/dist/Server/Utils/Response.js +97 -0
  570. package/build/dist/Server/Utils/Response.js.map +1 -1
  571. package/build/dist/Server/Utils/Rules/RuleEngineRuleRead.js +37 -0
  572. package/build/dist/Server/Utils/Rules/RuleEngineRuleRead.js.map +1 -0
  573. package/build/dist/Server/Utils/StartServer.js +9 -1
  574. package/build/dist/Server/Utils/StartServer.js.map +1 -1
  575. package/build/dist/Server/Utils/Telemetry/AppMetrics.js +41 -0
  576. package/build/dist/Server/Utils/Telemetry/AppMetrics.js.map +1 -1
  577. package/build/dist/Server/Utils/Telemetry/ExceptionSanitizer.js +12 -1
  578. package/build/dist/Server/Utils/Telemetry/ExceptionSanitizer.js.map +1 -1
  579. package/build/dist/Server/Utils/Telemetry/LogExceptionExtractor.js +14 -2
  580. package/build/dist/Server/Utils/Telemetry/LogExceptionExtractor.js.map +1 -1
  581. package/build/dist/Server/Utils/Telemetry/SourceMapResolver.js +15 -5
  582. package/build/dist/Server/Utils/Telemetry/SourceMapResolver.js.map +1 -1
  583. package/build/dist/Server/Utils/Telemetry/StackTraceParser.js +307 -0
  584. package/build/dist/Server/Utils/Telemetry/StackTraceParser.js.map +1 -1
  585. package/build/dist/Types/Calendar/ICalendar.js +290 -0
  586. package/build/dist/Types/Calendar/ICalendar.js.map +1 -0
  587. package/build/dist/Types/Date.js +27 -0
  588. package/build/dist/Types/Date.js.map +1 -1
  589. package/build/dist/Types/Email/EmailTemplateType.js +2 -0
  590. package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
  591. package/build/dist/Types/Monitor/SnmpMonitor/SnmpOidListUtil.js +253 -0
  592. package/build/dist/Types/Monitor/SnmpMonitor/SnmpOidListUtil.js.map +1 -0
  593. package/build/dist/Types/NotificationSetting/NotificationSettingEventType.js +3 -0
  594. package/build/dist/Types/NotificationSetting/NotificationSettingEventType.js.map +1 -1
  595. package/build/dist/Types/OnCallDutyPolicy/CalendarFeedWindow.js +97 -0
  596. package/build/dist/Types/OnCallDutyPolicy/CalendarFeedWindow.js.map +1 -0
  597. package/build/dist/Types/OnCallDutyPolicy/Layer.js +113 -19
  598. package/build/dist/Types/OnCallDutyPolicy/Layer.js.map +1 -1
  599. package/build/dist/Types/OnCallDutyPolicy/MaterializedShift.js +134 -0
  600. package/build/dist/Types/OnCallDutyPolicy/MaterializedShift.js.map +1 -0
  601. package/build/dist/Types/OnCallDutyPolicy/OnCallCalendarFeedUtil.js +800 -0
  602. package/build/dist/Types/OnCallDutyPolicy/OnCallCalendarFeedUtil.js.map +1 -0
  603. package/build/dist/Types/OnCallDutyPolicy/ScheduleShiftUtil.js +97 -3
  604. package/build/dist/Types/OnCallDutyPolicy/ScheduleShiftUtil.js.map +1 -1
  605. package/build/dist/Types/OnCallDutyPolicy/ShiftSeamUtil.js +77 -0
  606. package/build/dist/Types/OnCallDutyPolicy/ShiftSeamUtil.js.map +1 -0
  607. package/build/dist/Types/Permission.js +86 -0
  608. package/build/dist/Types/Permission.js.map +1 -1
  609. package/build/dist/Types/Rum/SessionReplay.js +19 -0
  610. package/build/dist/Types/Rum/SessionReplay.js.map +1 -1
  611. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/AnnotationHoverCard.js +83 -0
  612. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/AnnotationHoverCard.js.map +1 -0
  613. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/AnnotationLayout.js +531 -0
  614. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/AnnotationLayout.js.map +1 -0
  615. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/ChartAnnotationLayer.js +264 -0
  616. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/ChartAnnotationLayer.js.map +1 -0
  617. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/UseChartAnnotations.js +122 -0
  618. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/UseChartAnnotations.js.map +1 -0
  619. package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js +213 -233
  620. package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js.map +1 -1
  621. package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js +139 -152
  622. package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js.map +1 -1
  623. package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js +212 -232
  624. package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js.map +1 -1
  625. package/build/dist/UI/Components/Charts/Types/ChartEventKind.js +14 -0
  626. package/build/dist/UI/Components/Charts/Types/ChartEventKind.js.map +1 -0
  627. package/build/dist/UI/Components/Charts/Utils/TimeAnnotation.js +57 -28
  628. package/build/dist/UI/Components/Charts/Utils/TimeAnnotation.js.map +1 -1
  629. package/build/dist/UI/Components/Charts/Utils/XAxis.js +103 -17
  630. package/build/dist/UI/Components/Charts/Utils/XAxis.js.map +1 -1
  631. package/build/dist/UI/Components/EditionLabel/EditionLabel.js +198 -23
  632. package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
  633. package/build/dist/UI/Components/ErrorMessage/ErrorMessage.js +15 -5
  634. package/build/dist/UI/Components/ErrorMessage/ErrorMessage.js.map +1 -1
  635. package/build/dist/UI/Components/Feed/FeedItem.js +4 -5
  636. package/build/dist/UI/Components/Feed/FeedItem.js.map +1 -1
  637. package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js +1 -2
  638. package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js.map +1 -1
  639. package/build/dist/UI/Components/Header/UserProfile/UserProfile.js.map +1 -1
  640. package/build/dist/UI/Components/Image/Image.js +6 -1
  641. package/build/dist/UI/Components/Image/Image.js.map +1 -1
  642. package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js +0 -0
  643. package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js.map +1 -1
  644. package/build/dist/UI/Components/MemberRoleAssignment/MemberRoleAssignment.js +1 -2
  645. package/build/dist/UI/Components/MemberRoleAssignment/MemberRoleAssignment.js.map +1 -1
  646. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +104 -23
  647. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  648. package/build/dist/UI/Components/Table/TableHeader.js +20 -22
  649. package/build/dist/UI/Components/Table/TableHeader.js.map +1 -1
  650. package/build/dist/UI/Components/Table/TableRow.js +13 -4
  651. package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
  652. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js +153 -0
  653. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js.map +1 -0
  654. package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js.map +1 -1
  655. package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js +127 -7
  656. package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js.map +1 -1
  657. package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js +50 -3
  658. package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js.map +1 -1
  659. package/build/dist/Utils/NetworkDiscovery/ReverseDnsNameUtil.js +132 -0
  660. package/build/dist/Utils/NetworkDiscovery/ReverseDnsNameUtil.js.map +1 -0
  661. package/build/dist/Utils/Rules/RuleEngineLimits.js +31 -0
  662. package/build/dist/Utils/Rules/RuleEngineLimits.js.map +1 -0
  663. package/jest.config.json +1 -0
  664. package/package.json +2 -2
@@ -0,0 +1,789 @@
1
+ import "@testing-library/jest-dom";
2
+ import { cleanup, fireEvent, render, screen } from "@testing-library/react";
3
+ import React from "react";
4
+ import { afterEach, describe, expect, test } from "@jest/globals";
5
+
6
+ /*
7
+ * ResponsiveContainer measures its parent, which is always 0x0 in jsdom, so
8
+ * the chart renders nothing without a fixed size. Same shim as
9
+ * ChartXAxisDataKey.test.tsx — every assertion here is about rendered
10
+ * GEOMETRY, and a 0x0 chart draws no marks at all, which would make the
11
+ * whole file pass for the wrong reason.
12
+ */
13
+ jest.mock("recharts", () => {
14
+ const actual: Record<string, any> = jest.requireActual("recharts") as Record<
15
+ string,
16
+ any
17
+ >;
18
+ return {
19
+ ...actual,
20
+ ResponsiveContainer: ({ children }: { children: React.ReactElement }) => {
21
+ return React.cloneElement(children, { width: 800, height: 400 });
22
+ },
23
+ };
24
+ });
25
+
26
+ import AreaChartElement from "../../../../UI/Components/Charts/Area/AreaChart";
27
+ import BarChartElement from "../../../../UI/Components/Charts/Bar/BarChart";
28
+ import LineChartElement from "../../../../UI/Components/Charts/Line/LineChart";
29
+ import ChartCurve from "../../../../UI/Components/Charts/Types/ChartCurve";
30
+ import ChartEventKind from "../../../../UI/Components/Charts/Types/ChartEventKind";
31
+ import ChartReferenceRegionProps from "../../../../UI/Components/Charts/Types/ReferenceRegionProps";
32
+ import ChartTimeReferenceLineProps from "../../../../UI/Components/Charts/Types/TimeReferenceLineProps";
33
+ import DataPoint from "../../../../UI/Components/Charts/Types/DataPoint";
34
+ import SeriesPoint from "../../../../UI/Components/Charts/Types/SeriesPoints";
35
+ import {
36
+ XAxis as ChartXAxis,
37
+ XAxisAggregateType,
38
+ } from "../../../../UI/Components/Charts/Types/XAxis/XAxis";
39
+ import XAxisType from "../../../../UI/Components/Charts/Types/XAxis/XAxisType";
40
+ import YAxis, {
41
+ YAxisPrecision,
42
+ } from "../../../../UI/Components/Charts/Types/YAxis/YAxis";
43
+ import YAxisType from "../../../../UI/Components/Charts/Types/YAxis/YAxisType";
44
+
45
+ /*
46
+ * Event indicators used to be drawn as recharts <ReferenceLine>s labelled
47
+ * with rotated text inside the plot: labels collided with each other and
48
+ * with the axis, and past six markers they were hidden outright. They are
49
+ * now a rail of chips above the plot, each with a hover card. These tests
50
+ * hold the parts of that which are observable in jsdom — what is drawn,
51
+ * what is reachable, and what a click does.
52
+ */
53
+
54
+ const START: Date = new Date("2026-03-02T00:00:00.000Z");
55
+ const END: Date = new Date("2026-03-02T06:00:00.000Z");
56
+
57
+ function buildPoints(): Array<DataPoint> {
58
+ const points: Array<DataPoint> = [];
59
+ for (let index: number = 0; index < 24; index++) {
60
+ points.push({
61
+ x: new Date(START.getTime() + index * 15 * 60 * 1000),
62
+ y: 100 + index,
63
+ });
64
+ }
65
+ return points;
66
+ }
67
+
68
+ function buildSeries(): Array<SeriesPoint> {
69
+ return [{ seriesName: "latency", data: buildPoints() }];
70
+ }
71
+
72
+ const X_AXIS: ChartXAxis = {
73
+ legend: "Time",
74
+ options: {
75
+ type: XAxisType.Time,
76
+ min: START,
77
+ max: END,
78
+ aggregateType: XAxisAggregateType.Average,
79
+ },
80
+ };
81
+
82
+ const Y_AXIS: YAxis = {
83
+ legend: "ms",
84
+ options: {
85
+ type: YAxisType.Number,
86
+ min: "auto",
87
+ max: "auto",
88
+ precision: YAxisPrecision.NoDecimals,
89
+ formatter: (value: number): string => {
90
+ return `${value} ms`;
91
+ },
92
+ },
93
+ };
94
+
95
+ function minutesIn(minutes: number): Date {
96
+ return new Date(START.getTime() + minutes * 60 * 1000);
97
+ }
98
+
99
+ interface ChartUnderTestProps {
100
+ timeReferenceLines?: Array<ChartTimeReferenceLineProps> | undefined;
101
+ referenceRegions?: Array<ChartReferenceRegionProps> | undefined;
102
+ showLegend?: boolean | undefined;
103
+ }
104
+
105
+ interface ChartUnderTest {
106
+ name: string;
107
+ render: (props: ChartUnderTestProps) => React.ReactElement;
108
+ }
109
+
110
+ const CHARTS: Array<ChartUnderTest> = [
111
+ {
112
+ name: "LineChart",
113
+ render: (props: ChartUnderTestProps): React.ReactElement => {
114
+ return (
115
+ <LineChartElement
116
+ data={buildSeries()}
117
+ xAxis={X_AXIS}
118
+ yAxis={Y_AXIS}
119
+ curve={ChartCurve.MONOTONE}
120
+ heightInPx={400}
121
+ sync={false}
122
+ syncid="annotation-rail-test"
123
+ showLegend={props.showLegend ?? true}
124
+ timeReferenceLines={props.timeReferenceLines}
125
+ referenceRegions={props.referenceRegions}
126
+ />
127
+ );
128
+ },
129
+ },
130
+ {
131
+ name: "AreaChart",
132
+ render: (props: ChartUnderTestProps): React.ReactElement => {
133
+ return (
134
+ <AreaChartElement
135
+ data={buildSeries()}
136
+ xAxis={X_AXIS}
137
+ yAxis={Y_AXIS}
138
+ curve={ChartCurve.MONOTONE}
139
+ heightInPx={400}
140
+ sync={false}
141
+ syncid="annotation-rail-test"
142
+ showLegend={props.showLegend ?? true}
143
+ timeReferenceLines={props.timeReferenceLines}
144
+ referenceRegions={props.referenceRegions}
145
+ />
146
+ );
147
+ },
148
+ },
149
+ {
150
+ name: "BarChart",
151
+ render: (props: ChartUnderTestProps): React.ReactElement => {
152
+ return (
153
+ <BarChartElement
154
+ data={buildSeries()}
155
+ xAxis={X_AXIS}
156
+ yAxis={Y_AXIS}
157
+ heightInPx={400}
158
+ sync={false}
159
+ syncid="annotation-rail-test"
160
+ showLegend={props.showLegend ?? true}
161
+ timeReferenceLines={props.timeReferenceLines}
162
+ referenceRegions={props.referenceRegions}
163
+ />
164
+ );
165
+ },
166
+ },
167
+ ];
168
+
169
+ function chips(container: HTMLElement): Array<HTMLElement> {
170
+ return Array.from(
171
+ container.querySelectorAll('[data-testid="chart-annotation-chip"]'),
172
+ ) as Array<HTMLElement>;
173
+ }
174
+
175
+ function hairlines(container: HTMLElement): Array<SVGLineElement> {
176
+ return Array.from(
177
+ container.querySelectorAll('[data-testid="chart-annotation-hairline"]'),
178
+ ) as Array<SVGLineElement>;
179
+ }
180
+
181
+ afterEach((): void => {
182
+ cleanup();
183
+ });
184
+
185
+ describe.each(
186
+ CHARTS.map((chart: ChartUnderTest): [string, ChartUnderTest] => {
187
+ return [chart.name, chart];
188
+ }),
189
+ )("%s event marker rail", (_name: string, chart: ChartUnderTest) => {
190
+ test("draws a chip and a hairline for a single marker", () => {
191
+ const { container } = render(
192
+ chart.render({
193
+ timeReferenceLines: [
194
+ {
195
+ date: minutesIn(90),
196
+ label: "Incident: API is down",
197
+ kind: ChartEventKind.Incident,
198
+ color: "#f87171",
199
+ },
200
+ ],
201
+ }),
202
+ );
203
+
204
+ expect(chips(container)).toHaveLength(1);
205
+ expect(hairlines(container)).toHaveLength(1);
206
+ expect(chips(container)[0]!.dataset["annotationCount"]).toBe("1");
207
+ expect(chips(container)[0]!.dataset["annotationKind"]).toBe("incident");
208
+ });
209
+
210
+ test("six markers all draw — no cap hides them any more", () => {
211
+ /*
212
+ * The old renderer hid every inline label past six markers. Nothing is
213
+ * capped now; density is handled by clustering instead.
214
+ */
215
+ const lines: Array<ChartTimeReferenceLineProps> = [
216
+ 15, 60, 120, 180, 240, 300,
217
+ ].map((minutes: number): ChartTimeReferenceLineProps => {
218
+ return { date: minutesIn(minutes), label: `event at ${minutes}` };
219
+ });
220
+
221
+ const { container } = render(chart.render({ timeReferenceLines: lines }));
222
+
223
+ expect(chips(container)).toHaveLength(6);
224
+ });
225
+
226
+ test("markers on top of each other collapse into one counted chip", () => {
227
+ const lines: Array<ChartTimeReferenceLineProps> = [
228
+ { date: minutesIn(120), label: "Incident: one" },
229
+ { date: minutesIn(121), label: "Alert: two" },
230
+ { date: minutesIn(122), label: "Deploy: three" },
231
+ ];
232
+
233
+ const { container } = render(chart.render({ timeReferenceLines: lines }));
234
+
235
+ const rendered: Array<HTMLElement> = chips(container);
236
+ expect(rendered).toHaveLength(1);
237
+ expect(rendered[0]!.dataset["annotationCount"]).toBe("3");
238
+ });
239
+
240
+ test("a marker outside the charted window draws nothing", () => {
241
+ const { container } = render(
242
+ chart.render({
243
+ timeReferenceLines: [
244
+ { date: new Date(END.getTime() + 86400000), label: "next week" },
245
+ ],
246
+ }),
247
+ );
248
+
249
+ expect(chips(container)).toHaveLength(0);
250
+ });
251
+
252
+ test("no annotations means no rail in the DOM at all", () => {
253
+ const { container } = render(chart.render({}));
254
+
255
+ expect(
256
+ container.querySelector('[data-testid="chart-annotation-layer"]'),
257
+ ).toBeNull();
258
+ expect(chips(container)).toHaveLength(0);
259
+ });
260
+
261
+ test("a region draws a band, its edges, and a pill", () => {
262
+ const { container } = render(
263
+ chart.render({
264
+ referenceRegions: [
265
+ {
266
+ startDate: minutesIn(60),
267
+ endDate: minutesIn(180),
268
+ label: "Scheduled maintenance",
269
+ color: "#6366f1",
270
+ },
271
+ ],
272
+ }),
273
+ );
274
+
275
+ expect(
276
+ container.querySelectorAll(
277
+ '[data-testid="chart-annotation-region-band"]',
278
+ ),
279
+ ).toHaveLength(1);
280
+ expect(
281
+ container.querySelectorAll('[data-testid="chart-annotation-region"]'),
282
+ ).toHaveLength(1);
283
+ });
284
+
285
+ test("clicking a lone marker opens its record", () => {
286
+ const onClick: () => void = jest.fn() as unknown as () => void;
287
+
288
+ const { container } = render(
289
+ chart.render({
290
+ timeReferenceLines: [
291
+ { date: minutesIn(90), label: "Incident: API is down", onClick },
292
+ ],
293
+ }),
294
+ );
295
+
296
+ fireEvent.click(chips(container)[0]!);
297
+
298
+ expect(onClick).toHaveBeenCalledTimes(1);
299
+ });
300
+
301
+ test("clicking a cluster opens its card instead of guessing a record", () => {
302
+ const first: () => void = jest.fn() as unknown as () => void;
303
+ const second: () => void = jest.fn() as unknown as () => void;
304
+
305
+ const { container } = render(
306
+ chart.render({
307
+ timeReferenceLines: [
308
+ { date: minutesIn(120), label: "Incident: one", onClick: first },
309
+ { date: minutesIn(121), label: "Alert: two", onClick: second },
310
+ ],
311
+ }),
312
+ );
313
+
314
+ fireEvent.click(chips(container)[0]!);
315
+
316
+ expect(first).not.toHaveBeenCalled();
317
+ expect(second).not.toHaveBeenCalled();
318
+ expect(
319
+ screen.getByTestId("chart-annotation-hover-card"),
320
+ ).toBeInTheDocument();
321
+ });
322
+
323
+ test("markers carry an accessible name and are reachable by keyboard", () => {
324
+ const onClick: () => void = jest.fn() as unknown as () => void;
325
+
326
+ const { container } = render(
327
+ chart.render({
328
+ timeReferenceLines: [
329
+ { date: minutesIn(90), label: "Incident: API is down", onClick },
330
+ ],
331
+ }),
332
+ );
333
+
334
+ const chip: HTMLElement = chips(container)[0]!;
335
+ expect(chip.getAttribute("role")).toBe("button");
336
+ expect(chip.getAttribute("tabindex")).toBe("0");
337
+ expect(chip.getAttribute("aria-label")).toContain("Incident: API is down");
338
+
339
+ fireEvent.keyDown(chip, { key: "Enter" });
340
+ expect(onClick).toHaveBeenCalledTimes(1);
341
+ });
342
+
343
+ test("a press on a chip never reaches the chart's drag-to-select", () => {
344
+ /*
345
+ * The chart starts a range selection on mousedown. Without this guard
346
+ * clicking a marker both navigates and leaves a stray selection behind.
347
+ */
348
+ const onMouseDown: () => void = jest.fn() as unknown as () => void;
349
+
350
+ const { container } = render(
351
+ <div onMouseDown={onMouseDown}>
352
+ {chart.render({
353
+ timeReferenceLines: [{ date: minutesIn(90), label: "Incident" }],
354
+ })}
355
+ </div>,
356
+ );
357
+
358
+ fireEvent.mouseDown(chips(container)[0]!);
359
+
360
+ expect(onMouseDown).not.toHaveBeenCalled();
361
+ });
362
+
363
+ test("the hairline spans exactly the plot, and the chip sits above it", () => {
364
+ /*
365
+ * The rail's whole premise: the marker is anchored to the plot but its
366
+ * chip lives in the margin above, where no data can be occluded. The
367
+ * old renderer painted a rotated label straight down the middle of the
368
+ * series instead.
369
+ */
370
+ const { container } = render(
371
+ chart.render({
372
+ timeReferenceLines: [{ date: minutesIn(90), label: "Incident" }],
373
+ // No legend, so the chart's own top margin reserves the rail.
374
+ showLegend: false,
375
+ }),
376
+ );
377
+
378
+ const hairline: SVGLineElement = hairlines(container)[0]!;
379
+ const plotTop: number = Number(hairline.getAttribute("y1"));
380
+ const plotBottom: number = Number(hairline.getAttribute("y2"));
381
+ expect(plotBottom).toBeGreaterThan(plotTop);
382
+
383
+ const chipRect: Element = chips(container)[0]!.querySelector("rect[rx]")!;
384
+ const chipBottom: number =
385
+ Number(chipRect.getAttribute("y")) +
386
+ Number(chipRect.getAttribute("height"));
387
+ expect(chipBottom).toBeLessThanOrEqual(plotTop);
388
+
389
+ // Both are on the same vertical, so the chip labels the right instant.
390
+ expect(chipRect.getAttribute("x")).not.toBeNull();
391
+ expect(Number(hairline.getAttribute("x1"))).toBeGreaterThan(0);
392
+ });
393
+
394
+ test("the rail never renders above the top of the chart", () => {
395
+ const { container } = render(
396
+ chart.render({
397
+ timeReferenceLines: [{ date: minutesIn(90), label: "Incident" }],
398
+ referenceRegions: [
399
+ {
400
+ startDate: minutesIn(60),
401
+ endDate: minutesIn(180),
402
+ label: "Maintenance",
403
+ },
404
+ ],
405
+ /*
406
+ * With a legend, jsdom reports it as zero-height and the rail
407
+ * clamps onto the chart's edge; without one the margin reserves
408
+ * the strip properly. Both must stay on-canvas, so both are run.
409
+ */
410
+ showLegend: false,
411
+ }),
412
+ );
413
+
414
+ for (const rect of Array.from(container.querySelectorAll("rect"))) {
415
+ const y: string | null = rect.getAttribute("y");
416
+ if (y !== null) {
417
+ expect(Number(y)).toBeGreaterThanOrEqual(0);
418
+ }
419
+ }
420
+ });
421
+
422
+ test("a legend that reserves no height still leaves the rail on-canvas", () => {
423
+ /*
424
+ * The rail's strip is bought by padding the legend's reserved height,
425
+ * so a legend reporting none would hang the rail above the SVG edge
426
+ * and delete the feature. It clamps onto the edge instead.
427
+ */
428
+ const { container } = render(
429
+ chart.render({
430
+ timeReferenceLines: [{ date: minutesIn(90), label: "Incident" }],
431
+ referenceRegions: [
432
+ {
433
+ startDate: minutesIn(60),
434
+ endDate: minutesIn(180),
435
+ label: "Maintenance",
436
+ },
437
+ ],
438
+ showLegend: true,
439
+ }),
440
+ );
441
+
442
+ expect(chips(container)).toHaveLength(1);
443
+ for (const rect of Array.from(container.querySelectorAll("rect"))) {
444
+ const y: string | null = rect.getAttribute("y");
445
+ if (y !== null) {
446
+ expect(Number(y)).toBeGreaterThanOrEqual(0);
447
+ }
448
+ }
449
+ });
450
+ });
451
+
452
+ describe("marker hover card", () => {
453
+ const chart: ChartUnderTest = CHARTS[0]!;
454
+
455
+ test("hovering a chip lists every event in it, with full titles", () => {
456
+ /*
457
+ * The label is why this redesign exists: it used to be rotated 10px
458
+ * text painted down the plot, truncated to 40 characters, and hidden
459
+ * outright past six markers. In the card it is ordinary HTML.
460
+ */
461
+ const longTitle: string =
462
+ "Incident: checkout-api p99 latency breached its SLO for the third time today";
463
+
464
+ const { container } = render(
465
+ chart.render({
466
+ timeReferenceLines: [
467
+ {
468
+ date: minutesIn(120),
469
+ label: longTitle,
470
+ subtitle: "Incident · Sev1",
471
+ kind: ChartEventKind.Incident,
472
+ },
473
+ {
474
+ date: minutesIn(121),
475
+ label: "Alert: 5xx rate above 2%",
476
+ subtitle: "Alert · Warning",
477
+ kind: ChartEventKind.Alert,
478
+ },
479
+ ],
480
+ }),
481
+ );
482
+
483
+ fireEvent.mouseOver(chips(container)[0]!);
484
+
485
+ const card: HTMLElement = screen.getByTestId("chart-annotation-hover-card");
486
+ expect(card).toHaveTextContent(longTitle);
487
+ expect(card).toHaveTextContent("Alert: 5xx rate above 2%");
488
+ expect(card).toHaveTextContent("Incident · Sev1");
489
+ expect(card).toHaveTextContent("2 events");
490
+ });
491
+
492
+ test("a row in the card opens that event", () => {
493
+ const first: () => void = jest.fn() as unknown as () => void;
494
+ const second: () => void = jest.fn() as unknown as () => void;
495
+
496
+ const { container } = render(
497
+ chart.render({
498
+ timeReferenceLines: [
499
+ { date: minutesIn(120), label: "Incident: one", onClick: first },
500
+ { date: minutesIn(121), label: "Alert: two", onClick: second },
501
+ ],
502
+ }),
503
+ );
504
+
505
+ fireEvent.mouseOver(chips(container)[0]!);
506
+ const rows: Array<HTMLElement> = screen.getAllByTestId(
507
+ "chart-annotation-hover-row",
508
+ );
509
+ expect(rows).toHaveLength(2);
510
+
511
+ fireEvent.click(rows[1]!);
512
+ expect(second).toHaveBeenCalledTimes(1);
513
+ expect(first).not.toHaveBeenCalled();
514
+ });
515
+
516
+ test("an event with no detail page gets an inert row, not a dead link", () => {
517
+ const { container } = render(
518
+ chart.render({
519
+ timeReferenceLines: [
520
+ { date: minutesIn(120), label: "Deploy: v2.31.0" },
521
+ { date: minutesIn(121), label: "Deploy: v2.31.1" },
522
+ ],
523
+ }),
524
+ );
525
+
526
+ fireEvent.mouseOver(chips(container)[0]!);
527
+ const rows: Array<HTMLElement> = screen.getAllByTestId(
528
+ "chart-annotation-hover-row",
529
+ );
530
+
531
+ expect(rows[0]).toBeDisabled();
532
+ });
533
+
534
+ test("focusing a chip opens the card, blurring it closes it", () => {
535
+ const { container } = render(
536
+ chart.render({
537
+ timeReferenceLines: [
538
+ { date: minutesIn(120), label: "Incident: one" },
539
+ { date: minutesIn(121), label: "Alert: two" },
540
+ ],
541
+ }),
542
+ );
543
+
544
+ fireEvent.focus(chips(container)[0]!);
545
+ expect(
546
+ screen.getByTestId("chart-annotation-hover-card"),
547
+ ).toBeInTheDocument();
548
+ });
549
+
550
+ test("hovering a region names it", () => {
551
+ const { container } = render(
552
+ chart.render({
553
+ referenceRegions: [
554
+ {
555
+ startDate: minutesIn(60),
556
+ endDate: minutesIn(180),
557
+ label: "Scheduled maintenance",
558
+ subtitle: "Database upgrade",
559
+ },
560
+ ],
561
+ }),
562
+ );
563
+
564
+ fireEvent.mouseOver(
565
+ container.querySelector('[data-testid="chart-annotation-region"]')!,
566
+ );
567
+
568
+ const card: HTMLElement = screen.getByTestId("chart-annotation-hover-card");
569
+ expect(card).toHaveTextContent("Scheduled maintenance");
570
+ expect(card).toHaveTextContent("Database upgrade");
571
+ });
572
+
573
+ test("a re-render with an equal-but-new marker array keeps the card open", () => {
574
+ /*
575
+ * Callers hand these charts inline array literals
576
+ * (IncidentRootCauseMetricChart does), so every parent render produces a
577
+ * referentially-new-but-equal array. An identity-keyed reset would shut
578
+ * the card on each one — and a dashboard's auto-refresh tick makes that
579
+ * constant, which is to say the card could never be clicked.
580
+ */
581
+ function markers(): Array<ChartTimeReferenceLineProps> {
582
+ return [
583
+ { date: minutesIn(120), label: "Incident: one" },
584
+ { date: minutesIn(121), label: "Alert: two" },
585
+ ];
586
+ }
587
+
588
+ const { container, rerender } = render(
589
+ chart.render({ timeReferenceLines: markers() }),
590
+ );
591
+
592
+ fireEvent.mouseOver(chips(container)[0]!);
593
+ expect(
594
+ screen.getByTestId("chart-annotation-hover-card"),
595
+ ).toBeInTheDocument();
596
+
597
+ // Same markers, brand new array — exactly what a parent render hands over.
598
+ rerender(chart.render({ timeReferenceLines: markers() }));
599
+
600
+ expect(
601
+ screen.getByTestId("chart-annotation-hover-card"),
602
+ ).toBeInTheDocument();
603
+ });
604
+
605
+ test("annotations actually moving does close a stale card", () => {
606
+ const { container, rerender } = render(
607
+ chart.render({
608
+ timeReferenceLines: [
609
+ { date: minutesIn(120), label: "Incident: one" },
610
+ { date: minutesIn(121), label: "Alert: two" },
611
+ ],
612
+ }),
613
+ );
614
+
615
+ fireEvent.mouseOver(chips(container)[0]!);
616
+ expect(
617
+ screen.getByTestId("chart-annotation-hover-card"),
618
+ ).toBeInTheDocument();
619
+
620
+ rerender(
621
+ chart.render({
622
+ timeReferenceLines: [
623
+ { date: minutesIn(300), label: "Incident: elsewhere" },
624
+ { date: minutesIn(301), label: "Alert: elsewhere" },
625
+ ],
626
+ }),
627
+ );
628
+
629
+ expect(
630
+ screen.queryByTestId("chart-annotation-hover-card"),
631
+ ).not.toBeInTheDocument();
632
+ });
633
+
634
+ test("Enter on a clustered chip puts focus on its first event", () => {
635
+ /*
636
+ * A clustered event exists ONLY in the card, and the card renders after
637
+ * the whole SVG in DOM order — so Tab from the chip goes to the next
638
+ * chip, never into the card. Without focus being moved deliberately, a
639
+ * keyboard user could open a lone event but never a clustered one, and
640
+ * clustering is automatic.
641
+ */
642
+ const first: () => void = jest.fn() as unknown as () => void;
643
+ const second: () => void = jest.fn() as unknown as () => void;
644
+
645
+ const { container } = render(
646
+ chart.render({
647
+ timeReferenceLines: [
648
+ { date: minutesIn(120), label: "Incident: one", onClick: first },
649
+ { date: minutesIn(121), label: "Alert: two", onClick: second },
650
+ ],
651
+ }),
652
+ );
653
+
654
+ const chip: HTMLElement = chips(container)[0]!;
655
+ expect(chip.dataset["annotationCount"]).toBe("2");
656
+
657
+ fireEvent.focus(chip);
658
+ fireEvent.keyDown(chip, { key: "Enter" });
659
+
660
+ const rows: Array<HTMLElement> = screen.getAllByTestId(
661
+ "chart-annotation-hover-row",
662
+ );
663
+ expect(rows[0]).toHaveFocus();
664
+
665
+ // And activating the focused row opens that event.
666
+ fireEvent.click(rows[0]!);
667
+ expect(first).toHaveBeenCalledTimes(1);
668
+ });
669
+
670
+ test("the card survives the chip's blur when focus moves into it", () => {
671
+ /*
672
+ * Taking focus blurs the chip, and the chip's blur schedules the close.
673
+ * The card has to cancel that on its own focus or it would shut 140ms
674
+ * later, taking the focus with it.
675
+ */
676
+ const { container } = render(
677
+ chart.render({
678
+ timeReferenceLines: [
679
+ { date: minutesIn(120), label: "Incident: one" },
680
+ { date: minutesIn(121), label: "Alert: two" },
681
+ ],
682
+ }),
683
+ );
684
+
685
+ const chip: HTMLElement = chips(container)[0]!;
686
+ fireEvent.focus(chip);
687
+ fireEvent.keyDown(chip, { key: "Enter" });
688
+
689
+ const card: HTMLElement = screen.getByTestId("chart-annotation-hover-card");
690
+ // The chip losing focus to the card must not schedule a close.
691
+ fireEvent.blur(chip);
692
+ fireEvent.focus(card);
693
+
694
+ expect(
695
+ screen.getByTestId("chart-annotation-hover-card"),
696
+ ).toBeInTheDocument();
697
+ });
698
+
699
+ test("Escape closes an open card", () => {
700
+ const { container } = render(
701
+ chart.render({
702
+ timeReferenceLines: [
703
+ { date: minutesIn(120), label: "Incident: one" },
704
+ { date: minutesIn(121), label: "Alert: two" },
705
+ ],
706
+ }),
707
+ );
708
+
709
+ fireEvent.mouseOver(chips(container)[0]!);
710
+ const card: HTMLElement = screen.getByTestId("chart-annotation-hover-card");
711
+
712
+ fireEvent.keyDown(card, { key: "Escape" });
713
+
714
+ expect(
715
+ screen.queryByTestId("chart-annotation-hover-card"),
716
+ ).not.toBeInTheDocument();
717
+ });
718
+
719
+ test("no card is shown until something is hovered", () => {
720
+ render(
721
+ chart.render({
722
+ timeReferenceLines: [{ date: minutesIn(120), label: "Incident: one" }],
723
+ }),
724
+ );
725
+
726
+ expect(
727
+ screen.queryByTestId("chart-annotation-hover-card"),
728
+ ).not.toBeInTheDocument();
729
+ });
730
+ });
731
+
732
+ describe("marker rail density", () => {
733
+ const chart: ChartUnderTest = CHARTS[0]!;
734
+
735
+ test("fifty markers become a readable handful of chips, losing none", () => {
736
+ const lines: Array<ChartTimeReferenceLineProps> = Array.from(
737
+ { length: 50 },
738
+ (_unused: unknown, index: number): ChartTimeReferenceLineProps => {
739
+ return {
740
+ date: minutesIn(index * 7),
741
+ label: `Alert: number ${index}`,
742
+ kind: ChartEventKind.Alert,
743
+ };
744
+ },
745
+ );
746
+
747
+ const { container } = render(chart.render({ timeReferenceLines: lines }));
748
+
749
+ const rendered: Array<HTMLElement> = chips(container);
750
+ expect(rendered.length).toBeGreaterThan(0);
751
+ expect(rendered.length).toBeLessThanOrEqual(22);
752
+
753
+ const total: number = rendered.reduce(
754
+ (sum: number, chip: HTMLElement): number => {
755
+ return sum + Number(chip.dataset["annotationCount"]);
756
+ },
757
+ 0,
758
+ );
759
+ // Every marker is still reachable through some chip.
760
+ expect(total).toBe(50);
761
+ });
762
+
763
+ test("a chip takes the colour of the worst thing inside it", () => {
764
+ const { container } = render(
765
+ chart.render({
766
+ timeReferenceLines: [
767
+ {
768
+ date: minutesIn(120),
769
+ label: "Deploy: v1",
770
+ kind: ChartEventKind.Change,
771
+ color: "#6366f1",
772
+ },
773
+ {
774
+ date: minutesIn(121),
775
+ label: "Incident: outage",
776
+ kind: ChartEventKind.Incident,
777
+ color: "#f87171",
778
+ },
779
+ ],
780
+ }),
781
+ );
782
+
783
+ const chip: HTMLElement = chips(container)[0]!;
784
+ expect(chip.dataset["annotationKind"]).toBe("incident");
785
+ expect(chip.querySelector("rect[rx]")!.getAttribute("fill")).toBe(
786
+ "#f87171",
787
+ );
788
+ });
789
+ });