@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,678 @@
1
+ import CalendarEvent from "../../../Types/Calendar/CalendarEvent";
2
+ import OneUptimeDate from "../../../Types/Date";
3
+ import EventInterval from "../../../Types/Events/EventInterval";
4
+ import LayerUtil, {
5
+ LayerProps,
6
+ ROTATION_PERIOD_START_KEY,
7
+ } from "../../../Types/OnCallDutyPolicy/Layer";
8
+ import ScheduleShiftUtil, {
9
+ OnCallShift,
10
+ } from "../../../Types/OnCallDutyPolicy/ScheduleShiftUtil";
11
+ import ShiftSeamUtil from "../../../Types/OnCallDutyPolicy/ShiftSeamUtil";
12
+ import UserOverrideUtil, {
13
+ OVERRIDE_META_KEY,
14
+ OverrideEventMeta,
15
+ } from "../../../Types/OnCallDutyPolicy/UserOverrideUtil";
16
+ import {
17
+ at,
18
+ dailyRestriction,
19
+ noRestriction,
20
+ rotation,
21
+ user,
22
+ } from "./CalendarFeedTestFixtures";
23
+
24
+ /*
25
+ * groupEventsIntoShifts gained a `groupKey` option for the on-call calendar
26
+ * feed. The contract that matters most is that the DEFAULT behaviour is
27
+ * unchanged: every dashboard summary (LayersPreview, FinalScheduleSummary)
28
+ * calls it without a key and must keep producing byte-identical shifts.
29
+ *
30
+ * `legacyGroupEventsIntoShifts` below is a verbatim copy of the function as
31
+ * it was before the option existed; the regression tests compare against it.
32
+ */
33
+
34
+ const CONTIGUITY_TOLERANCE_SECONDS: number = 5;
35
+
36
+ function legacyGroupEventsIntoShifts(
37
+ events: Array<CalendarEvent>,
38
+ options?: { mergeAcrossGaps?: boolean | undefined } | undefined,
39
+ ): Array<OnCallShift> {
40
+ if (!events || events.length === 0) {
41
+ return [];
42
+ }
43
+
44
+ const mergeAcrossGaps: boolean = Boolean(options?.mergeAcrossGaps);
45
+
46
+ const sorted: Array<CalendarEvent> = [...events]
47
+ .filter((event: CalendarEvent) => {
48
+ return Boolean(event.title) && Boolean(event.start) && Boolean(event.end);
49
+ })
50
+ .sort((a: CalendarEvent, b: CalendarEvent) => {
51
+ if (OneUptimeDate.isBefore(a.start, b.start)) {
52
+ return -1;
53
+ }
54
+ if (OneUptimeDate.isAfter(a.start, b.start)) {
55
+ return 1;
56
+ }
57
+ return 0;
58
+ });
59
+
60
+ const shifts: Array<OnCallShift> = [];
61
+
62
+ for (const event of sorted) {
63
+ const userId: string = event.title;
64
+ const eventSeconds: number = OneUptimeDate.getDifferenceInSeconds(
65
+ event.end,
66
+ event.start,
67
+ );
68
+ const last: OnCallShift | undefined = shifts[shifts.length - 1];
69
+
70
+ const sameUser: boolean = Boolean(last) && last!.userId === userId;
71
+
72
+ const isContiguous: boolean =
73
+ Boolean(last) &&
74
+ OneUptimeDate.getDifferenceInSeconds(last!.end, event.start) <=
75
+ CONTIGUITY_TOLERANCE_SECONDS &&
76
+ OneUptimeDate.isOnOrBefore(last!.end, event.end);
77
+
78
+ if (last && sameUser && (mergeAcrossGaps || isContiguous)) {
79
+ if (OneUptimeDate.isAfter(event.end, last.end)) {
80
+ last.end = event.end;
81
+ }
82
+ last.coverageSeconds += eventSeconds;
83
+ continue;
84
+ }
85
+
86
+ shifts.push({
87
+ userId,
88
+ start: event.start,
89
+ end: event.end,
90
+ coverageSeconds: eventSeconds,
91
+ });
92
+ }
93
+
94
+ return shifts;
95
+ }
96
+
97
+ const UTC: string = "UTC";
98
+ const WINDOW_START: Date = at("2026-03-02T00:00:00Z");
99
+ const WINDOW_END: Date = at("2026-03-09T00:00:00Z");
100
+
101
+ function multiLayerFixture(withLayerMeta: boolean): Array<LayerProps> {
102
+ const primary: LayerProps = {
103
+ users: [user("A"), user("B")],
104
+ startDateTimeOfLayer: WINDOW_START,
105
+ restrictionTimes: dailyRestriction("09:00", "17:00", UTC),
106
+ handOffTime: at("2026-03-02T09:00:00Z"),
107
+ rotation: rotation(EventInterval.Day, 1),
108
+ timezone: UTC,
109
+ };
110
+
111
+ const fallback: LayerProps = {
112
+ users: [user("C"), user("A")],
113
+ startDateTimeOfLayer: WINDOW_START,
114
+ restrictionTimes: noRestriction(),
115
+ handOffTime: WINDOW_START,
116
+ rotation: rotation(EventInterval.Day, 2),
117
+ timezone: UTC,
118
+ };
119
+
120
+ if (withLayerMeta) {
121
+ primary.layerId = "layer-1";
122
+ primary.layerName = "Primary";
123
+ fallback.layerId = "layer-2";
124
+ fallback.layerName = "Fallback";
125
+ }
126
+
127
+ return [primary, fallback];
128
+ }
129
+
130
+ function expand(layers: Array<LayerProps>): Array<CalendarEvent> {
131
+ return new LayerUtil().getMultiLayerEvents({
132
+ layers,
133
+ calendarStartDate: WINDOW_START,
134
+ calendarEndDate: WINDOW_END,
135
+ });
136
+ }
137
+
138
+ function event(
139
+ userId: string,
140
+ start: Date,
141
+ end: Date,
142
+ extra?: Record<string, unknown> | undefined,
143
+ ): CalendarEvent {
144
+ return {
145
+ id: 0,
146
+ title: userId,
147
+ allDay: false,
148
+ start,
149
+ end,
150
+ ...(extra ?? {}),
151
+ } as CalendarEvent;
152
+ }
153
+
154
+ function project(shifts: Array<OnCallShift>): Array<string> {
155
+ return shifts.map((shift: OnCallShift) => {
156
+ return `${shift.userId}|${shift.start.toISOString()}|${shift.end.toISOString()}|${shift.coverageSeconds}`;
157
+ });
158
+ }
159
+
160
+ describe("ScheduleShiftUtil.groupEventsIntoShifts default grouping is unchanged", () => {
161
+ test("byte-identical to the legacy implementation on a multi-layer fixture (no layer metadata)", () => {
162
+ const events: Array<CalendarEvent> = expand(multiLayerFixture(false));
163
+ expect(events.length).toBeGreaterThan(5);
164
+
165
+ for (const mergeAcrossGaps of [false, true]) {
166
+ const current: Array<OnCallShift> =
167
+ ScheduleShiftUtil.groupEventsIntoShifts(events, { mergeAcrossGaps });
168
+ const legacy: Array<OnCallShift> = legacyGroupEventsIntoShifts(events, {
169
+ mergeAcrossGaps,
170
+ });
171
+
172
+ expect(JSON.stringify(current)).toBe(JSON.stringify(legacy));
173
+ expect(current).toEqual(legacy);
174
+ }
175
+ });
176
+
177
+ test("identical shifts (projection) when the events DO carry layer metadata", () => {
178
+ const events: Array<CalendarEvent> = expand(multiLayerFixture(true));
179
+
180
+ for (const mergeAcrossGaps of [false, true]) {
181
+ const current: Array<OnCallShift> =
182
+ ScheduleShiftUtil.groupEventsIntoShifts(events, { mergeAcrossGaps });
183
+ const legacy: Array<OnCallShift> = legacyGroupEventsIntoShifts(events, {
184
+ mergeAcrossGaps,
185
+ });
186
+
187
+ expect(project(current)).toEqual(project(legacy));
188
+ }
189
+ });
190
+
191
+ test("identical shifts (projection) after overrides are applied", () => {
192
+ const events: Array<CalendarEvent> =
193
+ UserOverrideUtil.applyOverridesToEvents({
194
+ events: expand(multiLayerFixture(false)),
195
+ overrides: [
196
+ {
197
+ overrideUserId: "A",
198
+ routeAlertsToUserId: "B",
199
+ startsAt: at("2026-03-03T11:00:00Z"),
200
+ endsAt: at("2026-03-03T13:00:00Z"),
201
+ },
202
+ {
203
+ // C holds the fallback 03-02..03-04; this sits in its evening.
204
+ overrideUserId: "C",
205
+ routeAlertsToUserId: "D",
206
+ startsAt: at("2026-03-02T18:00:00Z"),
207
+ endsAt: at("2026-03-02T22:00:00Z"),
208
+ },
209
+ ],
210
+ });
211
+
212
+ const current: Array<OnCallShift> =
213
+ ScheduleShiftUtil.groupEventsIntoShifts(events);
214
+ const legacy: Array<OnCallShift> = legacyGroupEventsIntoShifts(events);
215
+
216
+ expect(project(current)).toEqual(project(legacy));
217
+ // The substitute really is in there, so the comparison is meaningful.
218
+ expect(
219
+ current.some((shift: OnCallShift) => {
220
+ return shift.userId === "D";
221
+ }),
222
+ ).toBe(true);
223
+ });
224
+
225
+ test("hand-built events without metadata produce shift objects with exactly the legacy keys", () => {
226
+ const events: Array<CalendarEvent> = [
227
+ event("A", at("2026-03-02T09:00:00Z"), at("2026-03-02T12:00:00Z")),
228
+ event("A", at("2026-03-02T12:00:01Z"), at("2026-03-02T17:00:00Z")),
229
+ event("B", at("2026-03-02T17:00:01Z"), at("2026-03-02T20:00:00Z")),
230
+ ];
231
+
232
+ const shifts: Array<OnCallShift> =
233
+ ScheduleShiftUtil.groupEventsIntoShifts(events);
234
+
235
+ expect(shifts).toHaveLength(2);
236
+ expect(Object.keys(shifts[0]!)).toEqual([
237
+ "userId",
238
+ "start",
239
+ "end",
240
+ "coverageSeconds",
241
+ ]);
242
+ expect("override" in shifts[0]!).toBe(false);
243
+ expect("layerId" in shifts[0]!).toBe(false);
244
+ });
245
+
246
+ test("the 5 second contiguity tolerance and empty input are unchanged", () => {
247
+ expect(ScheduleShiftUtil.groupEventsIntoShifts([])).toEqual([]);
248
+
249
+ const events: Array<CalendarEvent> = [
250
+ event("A", at("2026-03-02T09:00:00Z"), at("2026-03-02T12:00:00Z")),
251
+ event("A", at("2026-03-02T12:00:05Z"), at("2026-03-02T13:00:00Z")),
252
+ event("A", at("2026-03-02T13:00:06Z"), at("2026-03-02T14:00:00Z")),
253
+ ];
254
+
255
+ expect(ScheduleShiftUtil.groupEventsIntoShifts(events)).toHaveLength(2);
256
+ });
257
+ });
258
+
259
+ describe("ScheduleShiftUtil.groupEventsIntoShifts with a custom groupKey", () => {
260
+ const overrideMeta: OverrideEventMeta = {
261
+ isOverride: true,
262
+ originalUserId: "B",
263
+ overrideUserId: "A",
264
+ overrideStartsAt: at("2026-03-02T12:00:00Z"),
265
+ overrideEndsAt: at("2026-03-02T15:00:00Z"),
266
+ };
267
+
268
+ test("groupKeyByUserOverrideAndLayer splits a layer handover between the same user", () => {
269
+ const events: Array<CalendarEvent> = [
270
+ event("A", at("2026-03-02T09:00:00Z"), at("2026-03-02T12:00:00Z"), {
271
+ layerId: "layer-1",
272
+ layerName: "Primary",
273
+ }),
274
+ event("A", at("2026-03-02T12:00:00Z"), at("2026-03-02T15:00:00Z"), {
275
+ layerId: "layer-2",
276
+ layerName: "Fallback",
277
+ }),
278
+ ];
279
+
280
+ const merged: Array<OnCallShift> =
281
+ ScheduleShiftUtil.groupEventsIntoShifts(events);
282
+ expect(merged).toHaveLength(1);
283
+
284
+ const split: Array<OnCallShift> = ScheduleShiftUtil.groupEventsIntoShifts(
285
+ events,
286
+ { groupKey: ScheduleShiftUtil.groupKeyByUserOverrideAndLayer },
287
+ );
288
+
289
+ expect(split).toHaveLength(2);
290
+ expect(split[0]!.layerId).toBe("layer-1");
291
+ expect(split[0]!.layerName).toBe("Primary");
292
+ expect(split[1]!.layerId).toBe("layer-2");
293
+ expect(split[1]!.layerName).toBe("Fallback");
294
+ expect(split[0]!.end.getTime()).toBe(split[1]!.start.getTime());
295
+ });
296
+
297
+ test("groupKeyByUserOverrideAndLayer keeps an override segment separate from the user's own shift", () => {
298
+ const events: Array<CalendarEvent> = [
299
+ event("A", at("2026-03-02T09:00:00Z"), at("2026-03-02T12:00:00Z")),
300
+ // A covering for B, immediately after A's own shift.
301
+ event("A", at("2026-03-02T12:00:00Z"), at("2026-03-02T15:00:00Z"), {
302
+ [OVERRIDE_META_KEY]: overrideMeta,
303
+ }),
304
+ event("A", at("2026-03-02T15:00:00Z"), at("2026-03-02T17:00:00Z")),
305
+ ];
306
+
307
+ expect(ScheduleShiftUtil.groupEventsIntoShifts(events)).toHaveLength(1);
308
+
309
+ const split: Array<OnCallShift> = ScheduleShiftUtil.groupEventsIntoShifts(
310
+ events,
311
+ { groupKey: ScheduleShiftUtil.groupKeyByUserOverrideAndLayer },
312
+ );
313
+
314
+ expect(split).toHaveLength(3);
315
+ expect("override" in split[0]!).toBe(false);
316
+ expect(split[1]!.override).toEqual(overrideMeta);
317
+ expect("override" in split[2]!).toBe(false);
318
+ });
319
+
320
+ test("two adjacent segments produced by the SAME override merge into one shift", () => {
321
+ const events: Array<CalendarEvent> = [
322
+ event("A", at("2026-03-02T12:00:00Z"), at("2026-03-02T13:00:00Z"), {
323
+ [OVERRIDE_META_KEY]: overrideMeta,
324
+ }),
325
+ event("A", at("2026-03-02T13:00:01Z"), at("2026-03-02T15:00:00Z"), {
326
+ [OVERRIDE_META_KEY]: overrideMeta,
327
+ }),
328
+ ];
329
+
330
+ const shifts: Array<OnCallShift> = ScheduleShiftUtil.groupEventsIntoShifts(
331
+ events,
332
+ { groupKey: ScheduleShiftUtil.groupKeyByUserOverrideAndLayer },
333
+ );
334
+
335
+ expect(shifts).toHaveLength(1);
336
+ expect(shifts[0]!.override).toEqual(overrideMeta);
337
+ expect(shifts[0]!.coverageSeconds).toBe(3600 + 7199);
338
+ });
339
+
340
+ test("a different override window for the same pair is a different key", () => {
341
+ const later: OverrideEventMeta = {
342
+ ...overrideMeta,
343
+ overrideStartsAt: at("2026-03-02T13:00:00Z"),
344
+ overrideEndsAt: at("2026-03-02T15:00:00Z"),
345
+ };
346
+
347
+ const events: Array<CalendarEvent> = [
348
+ event("A", at("2026-03-02T12:00:00Z"), at("2026-03-02T13:00:00Z"), {
349
+ [OVERRIDE_META_KEY]: overrideMeta,
350
+ }),
351
+ event("A", at("2026-03-02T13:00:00Z"), at("2026-03-02T15:00:00Z"), {
352
+ [OVERRIDE_META_KEY]: later,
353
+ }),
354
+ ];
355
+
356
+ const shifts: Array<OnCallShift> = ScheduleShiftUtil.groupEventsIntoShifts(
357
+ events,
358
+ { groupKey: ScheduleShiftUtil.groupKeyByUserOverrideAndLayer },
359
+ );
360
+
361
+ expect(shifts).toHaveLength(2);
362
+ });
363
+
364
+ test("an arbitrary key function decides grouping; the shift keeps the first segment's user", () => {
365
+ const events: Array<CalendarEvent> = [
366
+ event("A", at("2026-03-02T09:00:00Z"), at("2026-03-02T12:00:00Z")),
367
+ event("B", at("2026-03-02T12:00:00Z"), at("2026-03-02T15:00:00Z")),
368
+ ];
369
+
370
+ const shifts: Array<OnCallShift> = ScheduleShiftUtil.groupEventsIntoShifts(
371
+ events,
372
+ {
373
+ groupKey: (): string => {
374
+ return "everyone";
375
+ },
376
+ },
377
+ );
378
+
379
+ expect(shifts).toHaveLength(1);
380
+ expect(shifts[0]!.userId).toBe("A");
381
+ expect(shifts[0]!.end.getTime()).toBe(at("2026-03-02T15:00:00Z").getTime());
382
+ expect(shifts[0]!.coverageSeconds).toBe(6 * 3600);
383
+ });
384
+
385
+ test("a custom key still respects contiguity unless mergeAcrossGaps is set", () => {
386
+ const events: Array<CalendarEvent> = [
387
+ event("A", at("2026-03-02T09:00:00Z"), at("2026-03-02T12:00:00Z"), {
388
+ layerId: "layer-1",
389
+ }),
390
+ event("A", at("2026-03-02T14:00:00Z"), at("2026-03-02T17:00:00Z"), {
391
+ layerId: "layer-1",
392
+ }),
393
+ ];
394
+
395
+ expect(
396
+ ScheduleShiftUtil.groupEventsIntoShifts(events, {
397
+ groupKey: ScheduleShiftUtil.groupKeyByUserOverrideAndLayer,
398
+ }),
399
+ ).toHaveLength(2);
400
+
401
+ expect(
402
+ ScheduleShiftUtil.groupEventsIntoShifts(events, {
403
+ groupKey: ScheduleShiftUtil.groupKeyByUserOverrideAndLayer,
404
+ mergeAcrossGaps: true,
405
+ }),
406
+ ).toHaveLength(1);
407
+ });
408
+
409
+ test("engine-derived events with layer metadata group per layer under the feed key", () => {
410
+ const events: Array<CalendarEvent> = expand(multiLayerFixture(true));
411
+
412
+ const shifts: Array<OnCallShift> = ScheduleShiftUtil.groupEventsIntoShifts(
413
+ events,
414
+ { groupKey: ScheduleShiftUtil.groupKeyByUserOverrideAndLayer },
415
+ );
416
+
417
+ expect(shifts.length).toBeGreaterThan(0);
418
+ for (const shift of shifts) {
419
+ expect(["layer-1", "layer-2"]).toContain(shift.layerId);
420
+ if (shift.layerId === "layer-1") {
421
+ expect(["A", "B"]).toContain(shift.userId);
422
+ expect(shift.layerName).toBe("Primary");
423
+ } else {
424
+ expect(["C", "A"]).toContain(shift.userId);
425
+ expect(shift.layerName).toBe("Fallback");
426
+ }
427
+ }
428
+
429
+ // Never fewer shifts than the default grouping: the key only splits.
430
+ expect(shifts.length).toBeGreaterThanOrEqual(
431
+ ScheduleShiftUtil.groupEventsIntoShifts(events).length,
432
+ );
433
+ });
434
+
435
+ test("the default key helper equals the event title", () => {
436
+ const sample: CalendarEvent = event(
437
+ "user-x",
438
+ at("2026-03-02T09:00:00Z"),
439
+ at("2026-03-02T10:00:00Z"),
440
+ );
441
+ expect(ScheduleShiftUtil.defaultGroupKey(sample)).toBe("user-x");
442
+ expect(ScheduleShiftUtil.groupKeyByUserOverrideAndLayer(sample)).toBe(
443
+ "user-x|||",
444
+ );
445
+ });
446
+
447
+ test("the feed key carries the rotation period the engine stamped, except on override segments", () => {
448
+ const period: number = at("2026-03-02T00:00:00Z").getTime();
449
+
450
+ const plain: CalendarEvent = event(
451
+ "user-x",
452
+ at("2026-03-02T09:00:00Z"),
453
+ at("2026-03-02T10:00:00Z"),
454
+ { [ROTATION_PERIOD_START_KEY]: period },
455
+ );
456
+
457
+ expect(ScheduleShiftUtil.getEventRotationPeriodStart(plain)).toBe(period);
458
+ expect(ScheduleShiftUtil.groupKeyByUserOverrideAndLayer(plain)).toBe(
459
+ `user-x|||${period}`,
460
+ );
461
+
462
+ // The override window is the identity; it may legitimately span turns.
463
+ const covering: CalendarEvent = event(
464
+ "user-x",
465
+ at("2026-03-02T09:00:00Z"),
466
+ at("2026-03-02T10:00:00Z"),
467
+ {
468
+ [ROTATION_PERIOD_START_KEY]: period,
469
+ [OVERRIDE_META_KEY]: overrideMeta,
470
+ },
471
+ );
472
+
473
+ expect(ScheduleShiftUtil.groupKeyByUserOverrideAndLayer(covering)).toBe(
474
+ `user-x|B@${overrideMeta.overrideStartsAt.getTime()}-${overrideMeta.overrideEndsAt.getTime()}||`,
475
+ );
476
+ });
477
+
478
+ test("getEventRotationPeriodStart accepts Dates and ISO strings, ignores anything else", () => {
479
+ const period: Date = at("2026-03-02T00:00:00Z");
480
+
481
+ const asDate: CalendarEvent = event(
482
+ "u",
483
+ at("2026-03-02T09:00:00Z"),
484
+ at("2026-03-02T10:00:00Z"),
485
+ { [ROTATION_PERIOD_START_KEY]: period },
486
+ );
487
+ const asString: CalendarEvent = event(
488
+ "u",
489
+ at("2026-03-02T09:00:00Z"),
490
+ at("2026-03-02T10:00:00Z"),
491
+ { [ROTATION_PERIOD_START_KEY]: period.toISOString() },
492
+ );
493
+ const nonsense: CalendarEvent = event(
494
+ "u",
495
+ at("2026-03-02T09:00:00Z"),
496
+ at("2026-03-02T10:00:00Z"),
497
+ { [ROTATION_PERIOD_START_KEY]: { not: "a date" } },
498
+ );
499
+ const missing: CalendarEvent = event(
500
+ "u",
501
+ at("2026-03-02T09:00:00Z"),
502
+ at("2026-03-02T10:00:00Z"),
503
+ );
504
+
505
+ expect(ScheduleShiftUtil.getEventRotationPeriodStart(asDate)).toBe(
506
+ period.getTime(),
507
+ );
508
+ expect(ScheduleShiftUtil.getEventRotationPeriodStart(asString)).toBe(
509
+ period.getTime(),
510
+ );
511
+ expect(
512
+ ScheduleShiftUtil.getEventRotationPeriodStart(nonsense),
513
+ ).toBeUndefined();
514
+ expect(
515
+ ScheduleShiftUtil.getEventRotationPeriodStart(missing),
516
+ ).toBeUndefined();
517
+ });
518
+
519
+ test("getEventLayerId / getEventLayerName ignore non-string values", () => {
520
+ const sample: CalendarEvent = event(
521
+ "u",
522
+ at("2026-03-02T09:00:00Z"),
523
+ at("2026-03-02T10:00:00Z"),
524
+ { layerId: 42, layerName: null },
525
+ );
526
+ expect(ScheduleShiftUtil.getEventLayerId(sample)).toBeUndefined();
527
+ expect(ScheduleShiftUtil.getEventLayerName(sample)).toBeUndefined();
528
+ });
529
+ });
530
+
531
+ /*
532
+ * Regression: the feed's shift identity must not depend on where the feed
533
+ * window happens to start. Before the rotation period entered the group key,
534
+ * a run of consecutive turns held by the same user folded into ONE block that
535
+ * began at the first period overlapping the window and ended at the last one,
536
+ * so a subscriber's event silently changed its start (and therefore its UID)
537
+ * and grew its end every time the rolling window crossed a rotation boundary.
538
+ */
539
+ describe("ScheduleShiftUtil: consecutive turns of the same user stay separate shifts", () => {
540
+ const LAYER_START: Date = at("2026-03-02T00:00:00Z");
541
+
542
+ function weeklyLayer(users: Array<string>): LayerProps {
543
+ return {
544
+ users: users.map((id: string) => {
545
+ return user(id);
546
+ }),
547
+ startDateTimeOfLayer: LAYER_START,
548
+ restrictionTimes: noRestriction(),
549
+ handOffTime: LAYER_START,
550
+ rotation: rotation(EventInterval.Week, 1),
551
+ timezone: UTC,
552
+ layerId: "layer-1",
553
+ layerName: "Primary",
554
+ };
555
+ }
556
+
557
+ function feedShifts(
558
+ users: Array<string>,
559
+ windowStart: Date,
560
+ windowEnd: Date,
561
+ ): Array<OnCallShift> {
562
+ const events: Array<CalendarEvent> = new LayerUtil().getMultiLayerEvents({
563
+ layers: [weeklyLayer(users)],
564
+ calendarStartDate: windowStart,
565
+ calendarEndDate: windowEnd,
566
+ });
567
+
568
+ // Exactly what OnCallShiftMaterializer.toShifts does.
569
+ return ShiftSeamUtil.normalizeSeams(
570
+ ScheduleShiftUtil.groupEventsIntoShifts(events, {
571
+ mergeAcrossGaps: false,
572
+ groupKey: ScheduleShiftUtil.groupKeyByUserOverrideAndLayer,
573
+ }),
574
+ );
575
+ }
576
+
577
+ function starts(shifts: Array<OnCallShift>): Array<string> {
578
+ return shifts.map((shift: OnCallShift) => {
579
+ return shift.start.toISOString();
580
+ });
581
+ }
582
+
583
+ test("a single-user weekly layer yields one shift per week, not one block", () => {
584
+ const shifts: Array<OnCallShift> = feedShifts(
585
+ ["A"],
586
+ LAYER_START,
587
+ at("2026-03-30T00:00:00Z"),
588
+ );
589
+
590
+ expect(shifts.length).toBe(4);
591
+ for (const shift of shifts) {
592
+ expect(shift.userId).toBe("A");
593
+ // A week each, give or take the engine's 1 s seam.
594
+ expect(
595
+ shift.end.getTime() - shift.start.getTime(),
596
+ ).toBeGreaterThanOrEqual(7 * 24 * 3600 * 1000 - 5000);
597
+ expect(shift.end.getTime() - shift.start.getTime()).toBeLessThanOrEqual(
598
+ 7 * 24 * 3600 * 1000,
599
+ );
600
+ }
601
+ });
602
+
603
+ test("the same rotation period keeps the same start in two different windows", () => {
604
+ const early: Array<OnCallShift> = feedShifts(
605
+ ["A"],
606
+ LAYER_START,
607
+ at("2026-04-06T00:00:00Z"),
608
+ );
609
+ const later: Array<OnCallShift> = feedShifts(
610
+ ["A"],
611
+ at("2026-03-11T00:00:00Z"),
612
+ at("2026-04-13T00:00:00Z"),
613
+ );
614
+
615
+ // Every week both windows contain is the very same shift in both.
616
+ const shared: Array<string> = starts(early).filter((start: string) => {
617
+ return starts(later).includes(start);
618
+ });
619
+
620
+ expect(shared.length).toBeGreaterThan(1);
621
+ expect(starts(early)).toContain("2026-03-16T00:00:00.000Z");
622
+ expect(starts(later)).toContain("2026-03-16T00:00:00.000Z");
623
+ });
624
+
625
+ test("[A, A, B] keeps A's two turns apart while B stays one shift", () => {
626
+ const shifts: Array<OnCallShift> = feedShifts(
627
+ ["A", "A", "B"],
628
+ LAYER_START,
629
+ at("2026-03-23T00:00:00Z"),
630
+ );
631
+
632
+ expect(
633
+ shifts.map((shift: OnCallShift) => {
634
+ return shift.userId;
635
+ }),
636
+ ).toEqual(["A", "A", "B"]);
637
+ expect(starts(shifts)).toEqual([
638
+ "2026-03-02T00:00:00.000Z",
639
+ "2026-03-09T00:00:00.000Z",
640
+ "2026-03-16T00:00:00.000Z",
641
+ ]);
642
+ });
643
+
644
+ test("an override that spans a rotation boundary is still ONE shift", () => {
645
+ const events: Array<CalendarEvent> =
646
+ UserOverrideUtil.applyOverridesToEvents({
647
+ events: new LayerUtil().getMultiLayerEvents({
648
+ layers: [weeklyLayer(["A"])],
649
+ calendarStartDate: LAYER_START,
650
+ calendarEndDate: at("2026-03-23T00:00:00Z"),
651
+ }),
652
+ overrides: [
653
+ {
654
+ overrideUserId: "A",
655
+ routeAlertsToUserId: "B",
656
+ // Wednesday to Wednesday, straight through the Monday handover.
657
+ startsAt: at("2026-03-04T00:00:00Z"),
658
+ endsAt: at("2026-03-11T00:00:00Z"),
659
+ },
660
+ ],
661
+ });
662
+
663
+ const shifts: Array<OnCallShift> = ShiftSeamUtil.normalizeSeams(
664
+ ScheduleShiftUtil.groupEventsIntoShifts(events, {
665
+ mergeAcrossGaps: false,
666
+ groupKey: ScheduleShiftUtil.groupKeyByUserOverrideAndLayer,
667
+ }),
668
+ );
669
+
670
+ const covering: Array<OnCallShift> = shifts.filter((shift: OnCallShift) => {
671
+ return shift.userId === "B";
672
+ });
673
+
674
+ expect(covering).toHaveLength(1);
675
+ expect(covering[0]!.start.toISOString()).toBe("2026-03-04T00:00:00.000Z");
676
+ expect(covering[0]!.end.toISOString()).toBe("2026-03-11T00:00:00.000Z");
677
+ });
678
+ });