@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,745 @@
1
+ import ChartEventKind from "../../Types/ChartEventKind";
2
+ import FormattedReferenceRegion from "../Types/FormattedReferenceRegion";
3
+ import FormattedTimeReferenceLine from "../Types/FormattedTimeReferenceLine";
4
+
5
+ /*
6
+ * Geometry for the annotation rail, in SVG user units. recharts sizes its
7
+ * <svg> in CSS pixels with no viewBox scaling, so these are also CSS
8
+ * pixels — which is what lets the HTML hover card be positioned from the
9
+ * same numbers the SVG chips are drawn with.
10
+ */
11
+
12
+ /** Height of the strip that holds region pills, when any region exists. */
13
+ export const REGION_RAIL_HEIGHT: number = 13;
14
+
15
+ /** Height of the strip that holds event chips. */
16
+ export const MARKER_RAIL_HEIGHT: number = 16;
17
+
18
+ /** Gap between the two strips, and between the rail and the plot. */
19
+ export const RAIL_GAP: number = 4;
20
+
21
+ /** The chart's own `margin.top` when it carries no annotations. */
22
+ export const BARE_CHART_MARGIN_TOP: number = 5;
23
+
24
+ /** Diameter of the chip drawn for a cluster holding exactly one marker. */
25
+ export const SINGLE_MARKER_CHIP_SIZE: number = 13;
26
+
27
+ /** Width of a counted chip, per digit in the count. */
28
+ export const CHIP_WIDTH_PER_DIGIT: number = 7;
29
+
30
+ /** Base width a counted chip gets before its digits are added. */
31
+ export const COUNTED_CHIP_BASE_WIDTH: number = 11;
32
+
33
+ /*
34
+ * Two chips closer than this collapse into one. Sized so neighbouring
35
+ * chips keep a visible gap at the widest single-marker chip.
36
+ */
37
+ export const DEFAULT_CLUSTER_SEPARATION_PX: number = 18;
38
+
39
+ /*
40
+ * A chart wider than a phone still cannot carry more chips than this
41
+ * without them reading as noise; past it the separation widens until the
42
+ * count fits. Chosen so the busiest realistic window (the event overlay
43
+ * fetches up to 50 of each source) still resolves in a few passes.
44
+ */
45
+ export const MAX_CLUSTERS: number = 22;
46
+
47
+ /** Each widening pass multiplies the separation by this much. */
48
+ const CLUSTER_SEPARATION_GROWTH: number = 1.6;
49
+
50
+ /** Bounded so a pathological chart cannot spin here. */
51
+ const MAX_CLUSTER_PASSES: number = 8;
52
+
53
+ /*
54
+ * Fallback marker colours, matched to the app's event overlay so a caller
55
+ * that sets `kind` but no `color` still gets the familiar palette.
56
+ */
57
+ export const KIND_COLORS: Record<ChartEventKind, string> = {
58
+ [ChartEventKind.Incident]: "#f87171", // red-400
59
+ [ChartEventKind.Alert]: "#fbbf24", // amber-400
60
+ [ChartEventKind.Change]: "#6366f1", // indigo-500
61
+ [ChartEventKind.Generic]: "#64748b", // slate-500
62
+ };
63
+
64
+ /*
65
+ * Which kind speaks for a cluster: the chip takes the colour of the most
66
+ * serious thing inside it, so a deploy sharing a bucket with an incident
67
+ * never paints the cluster indigo.
68
+ */
69
+ const KIND_PRIORITY: Record<ChartEventKind, number> = {
70
+ [ChartEventKind.Incident]: 3,
71
+ [ChartEventKind.Alert]: 2,
72
+ [ChartEventKind.Change]: 1,
73
+ [ChartEventKind.Generic]: 0,
74
+ };
75
+
76
+ export interface PositionedMarker {
77
+ /** Centre of the marker's x-axis bucket, in SVG user units. */
78
+ xPixel: number;
79
+ /** Index into the chart's category list — ties break on it, so stable. */
80
+ categoryIndex: number;
81
+ marker: FormattedTimeReferenceLine;
82
+ }
83
+
84
+ export interface MarkerCluster {
85
+ /** Stable across renders for the same data — used as the hover key. */
86
+ id: string;
87
+ /** Where the chip and hairline are drawn. */
88
+ xPixel: number;
89
+ /** The x-axis label the cluster sits on, for the hover card heading. */
90
+ formattedX: string;
91
+ markers: Array<FormattedTimeReferenceLine>;
92
+ /** Colour of the chip and hairline. */
93
+ color: string;
94
+ /** Set when every marker in the cluster asked for a dashed line. */
95
+ strokeDasharray: string | undefined;
96
+ kind: ChartEventKind;
97
+ }
98
+
99
+ export interface PositionedRegion {
100
+ id: string;
101
+ /** Left edge in SVG user units, already ordered so x1 <= x2. */
102
+ x1: number;
103
+ /** Right edge in SVG user units. */
104
+ x2: number;
105
+ color: string;
106
+ region: FormattedReferenceRegion;
107
+ }
108
+
109
+ /** Maps a category index to its pixel x on the chart's x-axis. */
110
+ export type CategoryXResolver = (categoryIndex: number) => number | null;
111
+
112
+ /** The (index, coordinate) pairs recharts reports for the rendered ticks. */
113
+ export interface AxisTick {
114
+ value: unknown;
115
+ coordinate: number;
116
+ index: number;
117
+ }
118
+
119
+ export interface PlotBox {
120
+ x: number;
121
+ y: number;
122
+ width: number;
123
+ height: number;
124
+ }
125
+
126
+ /**
127
+ * How recharts lays the categories out. Line and area charts use a point
128
+ * scale (categories sit on evenly spaced points, first and last on the
129
+ * edges); bar charts use a band scale (each category owns a band and sits
130
+ * at its centre). Only the no-ticks fallback needs to tell them apart.
131
+ */
132
+ export type CategoryScaleKind = "point" | "band";
133
+
134
+ /**
135
+ * Build the index-to-pixel mapping the rail is drawn from.
136
+ *
137
+ * recharts' categorical scale is a point scale, so category positions are
138
+ * exactly linear in index; two rendered ticks are enough to recover the
139
+ * whole line, padding included. Going through the ticks rather than
140
+ * through `scale(label)` is what makes the rail survive a repeated label —
141
+ * the scale refuses to resolve any label at all once its domain holds a
142
+ * duplicate, which a sub-hour axis over a multi-day window always does.
143
+ *
144
+ * Falls back to plot geometry when the ticks cannot be trusted: a chart
145
+ * showing only its first and last tick, or a tick whose value no longer
146
+ * matches the row it indexes, would otherwise fit a wrong line.
147
+ */
148
+ export function buildCategoryXResolver(data: {
149
+ ticks: ReadonlyArray<AxisTick> | undefined;
150
+ categoryLabels: Array<string>;
151
+ plotArea: PlotBox;
152
+ /** The chart's `XAxis padding`, which tick coordinates already include. */
153
+ axisPaddingPx: number;
154
+ scaleKind: CategoryScaleKind;
155
+ }): CategoryXResolver {
156
+ const categoryCount: number = data.categoryLabels.length;
157
+
158
+ const usable: Array<AxisTick> = (data.ticks || []).filter(
159
+ (tick: AxisTick): boolean => {
160
+ return (
161
+ Number.isFinite(tick.coordinate) &&
162
+ Number.isInteger(tick.index) &&
163
+ tick.index >= 0 &&
164
+ tick.index < categoryCount &&
165
+ /*
166
+ * `startEndOnly` hands recharts synthetic explicit ticks whose
167
+ * index does not address the row it names; fitting on those would
168
+ * skew every marker.
169
+ */
170
+ tick.value === data.categoryLabels[tick.index]
171
+ );
172
+ },
173
+ );
174
+
175
+ const first: AxisTick | undefined = usable[0];
176
+ const last: AxisTick | undefined = usable[usable.length - 1];
177
+
178
+ if (first && last && last.index !== first.index) {
179
+ const step: number =
180
+ (last.coordinate - first.coordinate) / (last.index - first.index);
181
+ return (categoryIndex: number): number | null => {
182
+ if (categoryIndex < 0 || categoryIndex >= categoryCount) {
183
+ return null;
184
+ }
185
+ return first.coordinate + (categoryIndex - first.index) * step;
186
+ };
187
+ }
188
+
189
+ // Analytic fallback: the same scale geometry, derived by hand.
190
+ return (categoryIndex: number): number | null => {
191
+ if (categoryIndex < 0 || categoryIndex >= categoryCount) {
192
+ return null;
193
+ }
194
+ const innerWidth: number = data.plotArea.width - data.axisPaddingPx * 2;
195
+ if (categoryCount === 0 || innerWidth <= 0) {
196
+ return data.plotArea.x + data.plotArea.width / 2;
197
+ }
198
+ const innerLeft: number = data.plotArea.x + data.axisPaddingPx;
199
+
200
+ if (data.scaleKind === "band") {
201
+ const bandWidth: number = innerWidth / categoryCount;
202
+ return innerLeft + (categoryIndex + 0.5) * bandWidth;
203
+ }
204
+
205
+ if (categoryCount === 1) {
206
+ return data.plotArea.x + data.plotArea.width / 2;
207
+ }
208
+ const step: number = innerWidth / (categoryCount - 1);
209
+ return innerLeft + categoryIndex * step;
210
+ };
211
+ }
212
+
213
+ /*
214
+ * Severity colours are project-editable rows, so a marker can arrive in
215
+ * near-white or near-black. The chart surface flips with the theme and SVG
216
+ * cannot ask which one it is on, so instead of picking a contrasting
217
+ * colour per theme we pull every marker colour into a mid band that is
218
+ * legible on both: light enough to read on the dark surface (#172033),
219
+ * dark enough to read on the light one (#ffffff). Hue and saturation are
220
+ * preserved, so a red severity still reads as red.
221
+ */
222
+
223
+ /** Relative luminance floor, so a marker cannot vanish on white. */
224
+ const MIN_ANNOTATION_LUMINANCE: number = 0.09;
225
+
226
+ /** Relative luminance ceiling, so a marker cannot vanish on the dark surface. */
227
+ const MAX_ANNOTATION_LUMINANCE: number = 0.62;
228
+
229
+ interface Rgb {
230
+ r: number;
231
+ g: number;
232
+ b: number;
233
+ }
234
+
235
+ function parseHexColor(color: string): Rgb | null {
236
+ const match: RegExpMatchArray | null = color
237
+ .trim()
238
+ .match(/^#([0-9a-f]{3}|[0-9a-f]{6})$/i);
239
+ if (!match) {
240
+ return null;
241
+ }
242
+ const digits: string = match[1]!;
243
+ const full: string =
244
+ digits.length === 3
245
+ ? digits
246
+ .split("")
247
+ .map((digit: string): string => {
248
+ return digit + digit;
249
+ })
250
+ .join("")
251
+ : digits;
252
+ return {
253
+ r: parseInt(full.slice(0, 2), 16),
254
+ g: parseInt(full.slice(2, 4), 16),
255
+ b: parseInt(full.slice(4, 6), 16),
256
+ };
257
+ }
258
+
259
+ function toHexChannel(value: number): string {
260
+ const clamped: number = Math.max(0, Math.min(255, Math.round(value)));
261
+ return clamped.toString(16).padStart(2, "0");
262
+ }
263
+
264
+ /** WCAG relative luminance, 0 (black) to 1 (white). */
265
+ export function getRelativeLuminance(color: string): number | null {
266
+ const rgb: Rgb | null = parseHexColor(color);
267
+ if (!rgb) {
268
+ return null;
269
+ }
270
+ const channel: (raw: number) => number = (raw: number): number => {
271
+ const value: number = raw / 255;
272
+ return value <= 0.03928
273
+ ? value / 12.92
274
+ : Math.pow((value + 0.055) / 1.055, 2.4);
275
+ };
276
+ return (
277
+ 0.2126 * channel(rgb.r) + 0.7152 * channel(rgb.g) + 0.0722 * channel(rgb.b)
278
+ );
279
+ }
280
+
281
+ /**
282
+ * Pull a caller's colour into the band that reads on both themes. Colours
283
+ * already inside the band are returned untouched, and anything that is not
284
+ * a plain hex (a CSS var, a named colour) is passed through — the caller
285
+ * owns it, and guessing at its luminance would be worse than trusting it.
286
+ */
287
+ export function toAnnotationColor(color: string): string {
288
+ const rgb: Rgb | null = parseHexColor(color);
289
+ if (!rgb) {
290
+ return color;
291
+ }
292
+ const luminance: number | null = getRelativeLuminance(color);
293
+ if (luminance === null) {
294
+ return color;
295
+ }
296
+ if (
297
+ luminance >= MIN_ANNOTATION_LUMINANCE &&
298
+ luminance <= MAX_ANNOTATION_LUMINANCE
299
+ ) {
300
+ return color;
301
+ }
302
+
303
+ /*
304
+ * Blend toward black or white until the luminance lands on the boundary.
305
+ * Luminance is not linear in sRGB, so the blend ratio is approximated and
306
+ * then verified — a handful of steps is plenty and keeps this pure.
307
+ */
308
+ const towardWhite: boolean = luminance < MIN_ANNOTATION_LUMINANCE;
309
+ const target: number = towardWhite
310
+ ? MIN_ANNOTATION_LUMINANCE
311
+ : MAX_ANNOTATION_LUMINANCE;
312
+ const anchor: number = towardWhite ? 255 : 0;
313
+
314
+ /*
315
+ * Binary search on the blend ratio, keeping the last blend that actually
316
+ * landed inside the band. Returning the last PROBE instead would hand
317
+ * back a colour a hair outside it, which makes the function
318
+ * non-idempotent — clamping a clamped colour would move it again.
319
+ */
320
+ let low: number = 0;
321
+ let high: number = 1;
322
+ let best: string | null = null;
323
+ for (let step: number = 0; step < 14; step++) {
324
+ const ratio: number = (low + high) / 2;
325
+ const blended: string = `#${toHexChannel(
326
+ rgb.r + (anchor - rgb.r) * ratio,
327
+ )}${toHexChannel(rgb.g + (anchor - rgb.g) * ratio)}${toHexChannel(
328
+ rgb.b + (anchor - rgb.b) * ratio,
329
+ )}`;
330
+ const blendedLuminance: number | null = getRelativeLuminance(blended);
331
+ if (blendedLuminance === null) {
332
+ break;
333
+ }
334
+ if (
335
+ blendedLuminance >= MIN_ANNOTATION_LUMINANCE &&
336
+ blendedLuminance <= MAX_ANNOTATION_LUMINANCE
337
+ ) {
338
+ best = blended;
339
+ }
340
+ if (towardWhite === blendedLuminance < target) {
341
+ low = ratio;
342
+ } else {
343
+ high = ratio;
344
+ }
345
+ }
346
+
347
+ /*
348
+ * A hue so saturated that no blend along this axis lands in the band
349
+ * (a pure primary, say) keeps its own colour — a wrong colour would be
350
+ * a worse answer than a slightly out-of-band one.
351
+ */
352
+ return best ?? color;
353
+ }
354
+
355
+ export function getMarkerKind(
356
+ marker: FormattedTimeReferenceLine,
357
+ ): ChartEventKind {
358
+ return marker.original.kind || ChartEventKind.Generic;
359
+ }
360
+
361
+ export function getMarkerColor(marker: FormattedTimeReferenceLine): string {
362
+ return toAnnotationColor(
363
+ marker.original.color || KIND_COLORS[getMarkerKind(marker)]!,
364
+ );
365
+ }
366
+
367
+ /**
368
+ * Total vertical space the rail needs above the plot, including the gap
369
+ * that separates it from the topmost gridline. Zero when there is nothing
370
+ * to draw, so an un-annotated chart keeps every pixel of its plot.
371
+ */
372
+ export function getRailHeight(data: {
373
+ hasMarkers: boolean;
374
+ hasRegions: boolean;
375
+ }): number {
376
+ if (!data.hasMarkers && !data.hasRegions) {
377
+ return 0;
378
+ }
379
+ let height: number = 0;
380
+ if (data.hasRegions) {
381
+ height += REGION_RAIL_HEIGHT + RAIL_GAP;
382
+ }
383
+ if (data.hasMarkers) {
384
+ height += MARKER_RAIL_HEIGHT;
385
+ }
386
+ return height + RAIL_GAP;
387
+ }
388
+
389
+ /**
390
+ * The chart's `margin.top`.
391
+ *
392
+ * The rail needs a clear strip between the chart's top edge and the plot.
393
+ * A top-aligned legend already sits in that gap and is laid out from its
394
+ * own reserved height, so when there is one the strip is bought by padding
395
+ * that height instead (see `getRailHeight`'s caller) and the margin stays
396
+ * at its bare value. With no legend the margin is the only thing between
397
+ * the SVG edge and the plot, so it has to carry the rail itself —
398
+ * otherwise chips render above the SVG's own top edge and are clipped.
399
+ */
400
+ export function getChartMarginTop(data: {
401
+ hasMarkers: boolean;
402
+ hasRegions: boolean;
403
+ hasTopLegend: boolean;
404
+ }): number {
405
+ if (data.hasTopLegend) {
406
+ return BARE_CHART_MARGIN_TOP;
407
+ }
408
+ const railHeight: number = getRailHeight(data);
409
+ if (railHeight === 0) {
410
+ return BARE_CHART_MARGIN_TOP;
411
+ }
412
+ return Math.max(BARE_CHART_MARGIN_TOP, railHeight);
413
+ }
414
+
415
+ /*
416
+ * The rail hangs off the plot's top edge, so it needs `plotTop` to be at
417
+ * least `getRailHeight()` — which the chart guarantees through its margin
418
+ * or its legend padding. When something upstream reports less headroom
419
+ * than that (a legend that measures as zero-height, for instance), the
420
+ * rows slide down to the chart's own top edge rather than off it: an
421
+ * overlapping rail is a cosmetic problem, an invisible one is a missing
422
+ * feature.
423
+ */
424
+ function clampRailTop(desiredTop: number): number {
425
+ return Math.max(0, desiredTop);
426
+ }
427
+
428
+ /**
429
+ * Top edge of the region pill strip, given where the plot starts.
430
+ *
431
+ * `hasMarkers` is not cosmetic: the strip is measured down from the top of
432
+ * the reserved rail, and a regions-only chart reserves one row less than a
433
+ * chart carrying both, so assuming the marker strip is there would float
434
+ * the pill a row above the space the chart actually made for it.
435
+ */
436
+ export function getRegionRailY(
437
+ plotTop: number,
438
+ hasMarkers: boolean = true,
439
+ ): number {
440
+ return clampRailTop(
441
+ plotTop - getRailHeight({ hasMarkers, hasRegions: true }),
442
+ );
443
+ }
444
+
445
+ /**
446
+ * Top edge of the event chip strip. Sits directly above the plot whether
447
+ * or not the region strip is present.
448
+ */
449
+ export function getMarkerRailY(plotTop: number): number {
450
+ return clampRailTop(plotTop - RAIL_GAP - MARKER_RAIL_HEIGHT);
451
+ }
452
+
453
+ /*
454
+ * SVG has no text-overflow, so a label that outgrows its pill has to be cut
455
+ * by hand. Average glyph advance for the app's UI font, as a fraction of
456
+ * the font size — close enough at 9px that the ellipsis lands within a
457
+ * character of the true break, and the pill's clip path covers the rest.
458
+ */
459
+ const AVERAGE_GLYPH_WIDTH_RATIO: number = 0.55;
460
+
461
+ /** Room the ellipsis itself needs, in glyph widths. */
462
+ const ELLIPSIS_GLYPHS: number = 1;
463
+
464
+ /**
465
+ * Cut a label to what fits in `maxWidthPx`, ending in an ellipsis when
466
+ * anything was dropped. Returns null when not even one character fits —
467
+ * the caller then draws the pill bare and leaves the name to the hover
468
+ * card, which reads better than a one-letter stub.
469
+ */
470
+ export function truncateLabelToWidth(data: {
471
+ label: string;
472
+ maxWidthPx: number;
473
+ fontSizePx: number;
474
+ }): string | null {
475
+ const glyphWidth: number = data.fontSizePx * AVERAGE_GLYPH_WIDTH_RATIO;
476
+ if (glyphWidth <= 0) {
477
+ return null;
478
+ }
479
+
480
+ const fittingGlyphs: number = Math.floor(data.maxWidthPx / glyphWidth);
481
+ if (fittingGlyphs <= 0) {
482
+ return null;
483
+ }
484
+ if (data.label.length <= fittingGlyphs) {
485
+ return data.label;
486
+ }
487
+
488
+ const keep: number = fittingGlyphs - ELLIPSIS_GLYPHS;
489
+ if (keep <= 0) {
490
+ return null;
491
+ }
492
+
493
+ return `${data.label.slice(0, keep).trimEnd()}\u2026`;
494
+ }
495
+
496
+ /** Width of the chip drawn for a cluster of `count` markers. */
497
+ export function getChipWidth(count: number): number {
498
+ if (count <= 1) {
499
+ return SINGLE_MARKER_CHIP_SIZE;
500
+ }
501
+ const digits: number = String(count).length;
502
+ return COUNTED_CHIP_BASE_WIDTH + CHIP_WIDTH_PER_DIGIT * digits;
503
+ }
504
+
505
+ /**
506
+ * Resolve every marker onto a pixel on the x-axis, dropping the ones whose
507
+ * bucket is not on the axis (a window change can outrun the annotations by
508
+ * a render).
509
+ *
510
+ * Markers keep their caller-supplied order inside a bucket, so the same
511
+ * data always produces the same cluster contents.
512
+ */
513
+ export function positionMarkers(data: {
514
+ markers: Array<FormattedTimeReferenceLine>;
515
+ resolveX: CategoryXResolver;
516
+ }): Array<PositionedMarker> {
517
+ const positioned: Array<PositionedMarker> = [];
518
+
519
+ for (const marker of data.markers) {
520
+ const xPixel: number | null = data.resolveX(marker.bucketIndex);
521
+ if (xPixel === null || !Number.isFinite(xPixel)) {
522
+ continue;
523
+ }
524
+ positioned.push({ xPixel, categoryIndex: marker.bucketIndex, marker });
525
+ }
526
+
527
+ /*
528
+ * Sorted by position, then by the caller's order within a bucket, so a
529
+ * cluster's rows read the way the producer listed them.
530
+ */
531
+ positioned.sort((a: PositionedMarker, b: PositionedMarker): number => {
532
+ return a.xPixel - b.xPixel;
533
+ });
534
+
535
+ return positioned;
536
+ }
537
+
538
+ function pickClusterKind(
539
+ markers: Array<FormattedTimeReferenceLine>,
540
+ ): ChartEventKind {
541
+ let best: ChartEventKind = ChartEventKind.Generic;
542
+ for (const marker of markers) {
543
+ const kind: ChartEventKind = getMarkerKind(marker);
544
+ if (KIND_PRIORITY[kind]! > KIND_PRIORITY[best]!) {
545
+ best = kind;
546
+ }
547
+ }
548
+ return best;
549
+ }
550
+
551
+ /*
552
+ * The chip shows the cluster's most serious event, so that event's colour
553
+ * is the chip's colour. With no kinds to separate them (the common case
554
+ * for a caller that only sets `color`), the first marker speaks.
555
+ */
556
+ function pickClusterColor(
557
+ markers: Array<FormattedTimeReferenceLine>,
558
+ kind: ChartEventKind,
559
+ ): string {
560
+ let fallback: string | undefined = undefined;
561
+ for (const marker of markers) {
562
+ if (getMarkerKind(marker) === kind) {
563
+ return getMarkerColor(marker);
564
+ }
565
+ fallback = fallback ?? getMarkerColor(marker);
566
+ }
567
+ return fallback ?? KIND_COLORS[kind]!;
568
+ }
569
+
570
+ function buildCluster(members: Array<PositionedMarker>): MarkerCluster {
571
+ const markers: Array<FormattedTimeReferenceLine> = members.map(
572
+ (member: PositionedMarker): FormattedTimeReferenceLine => {
573
+ return member.marker;
574
+ },
575
+ );
576
+ const kind: ChartEventKind = pickClusterKind(markers);
577
+
578
+ /*
579
+ * A mixed cluster gets a solid line: dashes mean "change event", and a
580
+ * cluster holding an incident is not one.
581
+ */
582
+ const dashes: Array<string | undefined> = markers.map(
583
+ (marker: FormattedTimeReferenceLine): string | undefined => {
584
+ return marker.original.strokeDasharray;
585
+ },
586
+ );
587
+ const firstDash: string | undefined = dashes[0];
588
+ const everyDashMatches: boolean = dashes.every(
589
+ (dash: string | undefined): boolean => {
590
+ return dash === firstDash;
591
+ },
592
+ );
593
+
594
+ const anchor: PositionedMarker = members[0]!;
595
+
596
+ return {
597
+ /*
598
+ * Keyed on the anchor's bucket, not its pixel: a resize moves every
599
+ * chip, and a pixel-keyed id would remount the whole rail (and drop an
600
+ * open hover card) on each frame of a window drag.
601
+ */
602
+ id: `cluster-${anchor.categoryIndex}-${members.length}`,
603
+ xPixel: anchor.xPixel,
604
+ formattedX: anchor.marker.formattedX,
605
+ markers,
606
+ color: pickClusterColor(markers, kind),
607
+ strokeDasharray: everyDashMatches ? firstDash : undefined,
608
+ kind,
609
+ };
610
+ }
611
+
612
+ function clusterOnce(data: {
613
+ positioned: Array<PositionedMarker>;
614
+ separationPx: number;
615
+ }): Array<MarkerCluster> {
616
+ const clusters: Array<MarkerCluster> = [];
617
+ let members: Array<PositionedMarker> = [];
618
+
619
+ for (const candidate of data.positioned) {
620
+ const anchor: PositionedMarker | undefined = members[0];
621
+ if (!anchor || candidate.xPixel - anchor.xPixel <= data.separationPx) {
622
+ members.push(candidate);
623
+ continue;
624
+ }
625
+ clusters.push(buildCluster(members));
626
+ members = [candidate];
627
+ }
628
+
629
+ if (members.length > 0) {
630
+ clusters.push(buildCluster(members));
631
+ }
632
+
633
+ return clusters;
634
+ }
635
+
636
+ /**
637
+ * Collapse markers that would draw on top of each other into counted
638
+ * chips.
639
+ *
640
+ * The pass is greedy left-to-right and anchored on the first marker of
641
+ * each cluster, so a chip always sits on a real event rather than on the
642
+ * average of several. When the result is still denser than the rail can
643
+ * carry, the separation widens and the pass repeats — an unreadable comb
644
+ * of 50 hairlines becomes a readable handful of counted chips.
645
+ */
646
+ export function clusterMarkers(data: {
647
+ positioned: Array<PositionedMarker>;
648
+ separationPx?: number | undefined;
649
+ maxClusters?: number | undefined;
650
+ }): Array<MarkerCluster> {
651
+ if (data.positioned.length === 0) {
652
+ return [];
653
+ }
654
+
655
+ const maxClusters: number = data.maxClusters ?? MAX_CLUSTERS;
656
+ let separationPx: number = data.separationPx ?? DEFAULT_CLUSTER_SEPARATION_PX;
657
+
658
+ let clusters: Array<MarkerCluster> = clusterOnce({
659
+ positioned: data.positioned,
660
+ separationPx,
661
+ });
662
+
663
+ for (
664
+ let pass: number = 0;
665
+ pass < MAX_CLUSTER_PASSES && clusters.length > maxClusters;
666
+ pass++
667
+ ) {
668
+ separationPx = separationPx * CLUSTER_SEPARATION_GROWTH;
669
+ clusters = clusterOnce({ positioned: data.positioned, separationPx });
670
+ }
671
+
672
+ return clusters;
673
+ }
674
+
675
+ /**
676
+ * Resolve regions onto pixel spans, dropping any whose endpoints are not
677
+ * on the axis. A region that resolves to a single bucket still gets a
678
+ * minimum width so it stays visible.
679
+ */
680
+ export function positionRegions(data: {
681
+ regions: Array<FormattedReferenceRegion>;
682
+ resolveX: CategoryXResolver;
683
+ minWidthPx?: number | undefined;
684
+ }): Array<PositionedRegion> {
685
+ const minWidthPx: number = data.minWidthPx ?? 2;
686
+ const positioned: Array<PositionedRegion> = [];
687
+
688
+ for (let index: number = 0; index < data.regions.length; index++) {
689
+ const region: FormattedReferenceRegion = data.regions[index]!;
690
+ const startX: number | null = data.resolveX(region.startBucketIndex);
691
+ const endX: number | null = data.resolveX(region.endBucketIndex);
692
+ if (
693
+ startX === null ||
694
+ endX === null ||
695
+ !Number.isFinite(startX) ||
696
+ !Number.isFinite(endX)
697
+ ) {
698
+ continue;
699
+ }
700
+
701
+ const x1: number = Math.min(startX, endX);
702
+ const x2: number = Math.max(startX, endX);
703
+
704
+ positioned.push({
705
+ /*
706
+ * Keyed on buckets rather than pixels, for the same reason clusters
707
+ * are — a resize must not remount the region.
708
+ */
709
+ id: `region-${index}-${region.startBucketIndex}-${region.endBucketIndex}`,
710
+ x1,
711
+ x2: Math.max(x2, x1 + minWidthPx),
712
+ color: toAnnotationColor(
713
+ region.original.color || KIND_COLORS[ChartEventKind.Change]!,
714
+ ),
715
+ region,
716
+ });
717
+ }
718
+
719
+ return positioned;
720
+ }
721
+
722
+ /**
723
+ * Keep the hover card inside the chart. Cards are centred on their chip
724
+ * until that would push them past an edge, then they slide back in.
725
+ */
726
+ export function clampHoverCardLeft(data: {
727
+ anchorX: number;
728
+ cardWidth: number;
729
+ chartWidth: number;
730
+ edgeInset?: number | undefined;
731
+ }): number {
732
+ const edgeInset: number = data.edgeInset ?? 4;
733
+ const ideal: number = data.anchorX - data.cardWidth / 2;
734
+ const maxLeft: number = data.chartWidth - data.cardWidth - edgeInset;
735
+
736
+ /*
737
+ * A card wider than the chart cannot satisfy both edges; pinning it to
738
+ * the left one keeps its start readable rather than its middle.
739
+ */
740
+ if (maxLeft <= edgeInset) {
741
+ return edgeInset;
742
+ }
743
+
744
+ return Math.min(Math.max(ideal, edgeInset), maxLeft);
745
+ }