@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
@@ -40,6 +40,8 @@ import OnCallDutyPolicyScheduleLabelRuleEngineService from "./OnCallDutyPolicySc
40
40
  import OnCallDutyPolicyScheduleOwnerRuleEngineService from "./OnCallDutyPolicyScheduleOwnerRuleEngineService";
41
41
  import PushNotificationUtil from "../Utils/PushNotificationUtil";
42
42
  import { createWhatsAppMessageFromTemplate } from "../Utils/WhatsAppTemplateUtil";
43
+ import OnCallCalendarFeedCache from "../Infrastructure/OnCallCalendarFeedCache";
44
+ import OnCallShiftChangeListeners, { OnCallShiftChangeReason, } from "../Utils/OnCall/OnCallShiftChangeListeners";
43
45
  export class Service extends DatabaseService {
44
46
  constructor() {
45
47
  super(OnCallDutyPolicySchedule);
@@ -89,11 +91,145 @@ export class Service extends DatabaseService {
89
91
  });
90
92
  });
91
93
  }
94
+ /*
95
+ * Capture the members of each schedule being deleted. Their layer-user
96
+ * rows cascade away at the database level (no hooks run), so this is the
97
+ * last moment the ids are available; onDeleteSuccess uses them to purge
98
+ * those users' calendar-feed bodies and to tell the shift-change
99
+ * listeners whose shift lists just changed. Best-effort.
100
+ */
101
+ const deletedSchedules = [];
102
+ try {
103
+ const scheduleIds = callSchedules
104
+ .map((schedule) => {
105
+ return schedule.id;
106
+ })
107
+ .filter((id) => {
108
+ return Boolean(id);
109
+ });
110
+ const layerUsers = scheduleIds.length > 0
111
+ ? await OnCallDutyPolicyScheduleLayerUserService.findBy({
112
+ query: {
113
+ onCallDutyPolicyScheduleId: QueryHelper.any(scheduleIds),
114
+ },
115
+ select: {
116
+ userId: true,
117
+ onCallDutyPolicyScheduleId: true,
118
+ },
119
+ limit: LIMIT_PER_PROJECT,
120
+ skip: 0,
121
+ props: {
122
+ isRoot: true,
123
+ },
124
+ })
125
+ : [];
126
+ for (const schedule of callSchedules) {
127
+ if (!schedule.id) {
128
+ continue;
129
+ }
130
+ const scheduleIdString = schedule.id.toString();
131
+ deletedSchedules.push({
132
+ scheduleId: schedule.id,
133
+ projectId: schedule.projectId || null,
134
+ userIds: OnCallShiftChangeListeners.dedupe(layerUsers
135
+ .filter((layerUser) => {
136
+ var _a;
137
+ return (((_a = layerUser.onCallDutyPolicyScheduleId) === null || _a === void 0 ? void 0 : _a.toString()) ===
138
+ scheduleIdString);
139
+ })
140
+ .map((layerUser) => {
141
+ return layerUser.userId;
142
+ })
143
+ .filter((id) => {
144
+ return Boolean(id);
145
+ })),
146
+ });
147
+ }
148
+ }
149
+ catch (err) {
150
+ logger.error("Error capturing schedule members before delete (best-effort).");
151
+ logger.error(err);
152
+ }
92
153
  return {
93
154
  deleteBy: deleteBy,
94
- carryForward: {},
155
+ carryForward: { deletedSchedules },
95
156
  };
96
157
  }
158
+ /*
159
+ * A deleted schedule takes its shared feed with it (FK cascade) and drops
160
+ * out of its members' personal feeds; purge what was rendered from it and
161
+ * let the shift-change listeners (reminders) re-plan for those users. No
162
+ * version bump — the row is gone.
163
+ */
164
+ async onDeleteSuccess(onDelete, _itemIdsBeforeDelete) {
165
+ var _a;
166
+ const deletedSchedules = ((_a = onDelete.carryForward) === null || _a === void 0 ? void 0 : _a.deletedSchedules) || [];
167
+ for (const deleted of deletedSchedules) {
168
+ await this.propagateShiftConfigChange({
169
+ scheduleIds: [deleted.scheduleId],
170
+ projectId: deleted.projectId,
171
+ userIds: deleted.userIds,
172
+ reason: OnCallShiftChangeReason.ScheduleDeleted,
173
+ skipVersionBump: true,
174
+ });
175
+ }
176
+ return onDelete;
177
+ }
178
+ /*
179
+ * A rename or a timezone change alters every calendar event of the
180
+ * schedule (its title, and for a timezone change the instants themselves),
181
+ * so it must bump the schedule's shiftConfigVersion like any other
182
+ * configuration edit. The roster refresh writes through updateOneById with
183
+ * ignoreHooks, and the version bump itself is a raw statement, so neither
184
+ * re-enters this hook.
185
+ */
186
+ async onUpdateSuccess(onUpdate, updatedItemIds) {
187
+ var _a, _b;
188
+ const data = (((_a = onUpdate.updateBy) === null || _a === void 0 ? void 0 : _a.data) ||
189
+ {});
190
+ const touchesShiftConfiguration = data["name"] !== undefined || data["timezone"] !== undefined;
191
+ if (!touchesShiftConfiguration || updatedItemIds.length === 0) {
192
+ return onUpdate;
193
+ }
194
+ try {
195
+ const schedules = await this.findBy({
196
+ query: {
197
+ _id: QueryHelper.any(updatedItemIds),
198
+ },
199
+ select: {
200
+ _id: true,
201
+ projectId: true,
202
+ },
203
+ limit: LIMIT_PER_PROJECT,
204
+ skip: 0,
205
+ props: {
206
+ isRoot: true,
207
+ },
208
+ });
209
+ const byProject = new Map();
210
+ for (const schedule of schedules) {
211
+ if (!schedule.id) {
212
+ continue;
213
+ }
214
+ const projectKey = ((_b = schedule.projectId) === null || _b === void 0 ? void 0 : _b.toString()) || "";
215
+ const list = byProject.get(projectKey) || [];
216
+ list.push(schedule.id);
217
+ byProject.set(projectKey, list);
218
+ }
219
+ for (const [projectKey, scheduleIds] of byProject) {
220
+ await this.propagateShiftConfigChange({
221
+ scheduleIds,
222
+ projectId: projectKey ? new ObjectID(projectKey) : null,
223
+ reason: OnCallShiftChangeReason.ScheduleChanged,
224
+ });
225
+ }
226
+ }
227
+ catch (err) {
228
+ logger.error("Error propagating a schedule rename / timezone change to the calendar feeds (best-effort).");
229
+ logger.error(err);
230
+ }
231
+ return onUpdate;
232
+ }
97
233
  async getOnCallSchedulesWhereUserIsOnCallDuty(data) {
98
234
  const schedules = await this.findBy({
99
235
  query: {
@@ -895,7 +1031,7 @@ export class Service extends DatabaseService {
895
1031
  }
896
1032
  async getScheduleLayerProps(data) {
897
1033
  // get schedule layers.
898
- var _a, _b, _c;
1034
+ var _a, _b;
899
1035
  const scheduleId = data.scheduleId;
900
1036
  const layers = await OnCallDutyPolicyScheduleLayerService.findBy({
901
1037
  query: {
@@ -954,11 +1090,31 @@ export class Service extends DatabaseService {
954
1090
  },
955
1091
  });
956
1092
  const scheduleTimezone = ((_a = schedule === null || schedule === void 0 ? void 0 : schedule.timezone) === null || _a === void 0 ? void 0 : _a.toString()) || undefined;
1093
+ const { layerProps, scheduleUserIds } = this.buildLayerPropsFromRows({
1094
+ layers,
1095
+ layerUsers,
1096
+ scheduleTimezone,
1097
+ });
1098
+ const projectId = ((_b = layers[0]) === null || _b === void 0 ? void 0 : _b.projectId) || null;
1099
+ return { layerProps, projectId, scheduleUserIds };
1100
+ }
1101
+ /*
1102
+ * Compose LayerProps from persisted layer + layer-user rows. Shared by the
1103
+ * single-schedule loader the paging/roster path uses and the batched loader
1104
+ * the calendar feeds use, so both feed the engine byte-identical input.
1105
+ * Layers must already be sorted by order; layer users by order.
1106
+ *
1107
+ * Each LayerProps is stamped with the layer's id and name (informational;
1108
+ * the engine copies them onto its events) so consumers can tell which
1109
+ * layer a merged segment came from.
1110
+ */
1111
+ buildLayerPropsFromRows(data) {
1112
+ var _a, _b;
957
1113
  const layerProps = [];
958
1114
  const scheduleUserIds = [];
959
1115
  const seenUserIds = new Set();
960
- for (const layer of layers) {
961
- const usersForLayer = layerUsers
1116
+ for (const layer of data.layers) {
1117
+ const usersForLayer = data.layerUsers
962
1118
  .filter((layerUser) => {
963
1119
  var _a, _b;
964
1120
  return (((_a = layerUser.onCallDutyPolicyScheduleLayerId) === null || _a === void 0 ? void 0 : _a.toString()) ===
@@ -971,23 +1127,750 @@ export class Service extends DatabaseService {
971
1127
  return Boolean(user);
972
1128
  });
973
1129
  for (const user of usersForLayer) {
974
- const idStr = ((_b = user.id) === null || _b === void 0 ? void 0 : _b.toString()) || "";
1130
+ const idStr = ((_a = user.id) === null || _a === void 0 ? void 0 : _a.toString()) || "";
975
1131
  if (idStr && !seenUserIds.has(idStr)) {
976
1132
  seenUserIds.add(idStr);
977
1133
  scheduleUserIds.push(user.id);
978
1134
  }
979
1135
  }
980
- layerProps.push({
1136
+ const props = {
981
1137
  users: usersForLayer,
982
1138
  startDateTimeOfLayer: layer.startsAt,
983
1139
  restrictionTimes: layer.restrictionTimes,
984
1140
  rotation: layer.rotation,
985
1141
  handOffTime: layer.handOffTime,
986
- timezone: scheduleTimezone,
1142
+ timezone: data.scheduleTimezone,
1143
+ };
1144
+ const layerId = (_b = layer.id) === null || _b === void 0 ? void 0 : _b.toString();
1145
+ if (layerId) {
1146
+ props.layerId = layerId;
1147
+ }
1148
+ if (typeof layer.name === "string" && layer.name) {
1149
+ props.layerName = layer.name;
1150
+ }
1151
+ layerProps.push(props);
1152
+ }
1153
+ return { layerProps, scheduleUserIds };
1154
+ }
1155
+ /*
1156
+ * ---------------------------------------------------------------------------
1157
+ * Shift resolver — the source of truth for the calendar feeds, /my-shifts
1158
+ * and the shift reminders.
1159
+ * ---------------------------------------------------------------------------
1160
+ */
1161
+ /**
1162
+ * Resolve every on-call segment of ONE schedule that overlaps
1163
+ * [windowStart, windowEnd), in the exact order the paging and roster paths
1164
+ * use: layers -> engine -> overrides. Returns null when the schedule does
1165
+ * not exist. See getResolvedShiftSegmentsForSchedules for the rules.
1166
+ */
1167
+ async getResolvedShiftSegments(options) {
1168
+ const resolved = await this.getResolvedShiftSegmentsForSchedules({
1169
+ scheduleIds: [options.scheduleId],
1170
+ windowStart: options.windowStart,
1171
+ windowEnd: options.windowEnd,
1172
+ maxSimulationIterations: options.maxSimulationIterations,
1173
+ });
1174
+ return resolved[0] || null;
1175
+ }
1176
+ /**
1177
+ * Batched resolver: loads the layers, layer users, policy attachments and
1178
+ * overrides of every schedule with a handful of IN queries, then resolves
1179
+ * each schedule in memory.
1180
+ *
1181
+ * Per schedule:
1182
+ * 1. LayerProps exactly as the roster path builds them (plus layer ids).
1183
+ * 2. Expansion window = 2 rotation periods before windowStart .. 2 after
1184
+ * windowEnd, so the segments overlapping the window carry their TRUE
1185
+ * start and end rather than the engine's clamp to the window edge.
1186
+ * 3. ONE multi-layer engine expansion, bounded by maxSimulationIterations
1187
+ * (default: the engine's own caps); `truncated` reports a cap hit.
1188
+ * 4. Overrides in the roster's policy context: the single attached
1189
+ * policy's scoped overrides plus globals when exactly one policy is
1190
+ * attached, globals only otherwise — the same rule as
1191
+ * refreshCurrentUserIdAndHandoffTimeInSchedule (getSingleAttachedPolicyId).
1192
+ * 5. With two or more distinct attached policies AND a policy-scoped
1193
+ * override for a member overlapping the window, the same base events
1194
+ * are re-resolved once per such policy -> policyVariants. The
1195
+ * expensive expansion runs once; the override pass is cheap.
1196
+ * 6. lastModifiedAt = max(updatedAt) over layers, layer users,
1197
+ * participating overrides and attachments — never the schedule row.
1198
+ *
1199
+ * Schedules that no longer exist are skipped; the result is in the order
1200
+ * of the input ids.
1201
+ */
1202
+ async getResolvedShiftSegmentsForSchedules(options) {
1203
+ var _a;
1204
+ const scheduleIds = OnCallShiftChangeListeners.dedupe(options.scheduleIds);
1205
+ if (scheduleIds.length === 0) {
1206
+ return [];
1207
+ }
1208
+ if (!OneUptimeDate.isBefore(options.windowStart, options.windowEnd) &&
1209
+ options.windowStart.getTime() !== options.windowEnd.getTime()) {
1210
+ throw new BadDataException("windowStart must be before windowEnd");
1211
+ }
1212
+ const inputsById = await this.loadResolutionInputsForSchedules(scheduleIds);
1213
+ const prepared = [];
1214
+ const projectIds = new Set();
1215
+ let earliestStart = null;
1216
+ let latestEnd = null;
1217
+ for (const scheduleId of scheduleIds) {
1218
+ const inputs = inputsById.get(scheduleId.toString());
1219
+ if (!inputs) {
1220
+ continue;
1221
+ }
1222
+ const { layerProps, scheduleUserIds } = this.buildLayerPropsFromRows({
1223
+ layers: inputs.layers,
1224
+ layerUsers: inputs.layerUsers,
1225
+ scheduleTimezone: ((_a = inputs.schedule.timezone) === null || _a === void 0 ? void 0 : _a.toString()) || undefined,
1226
+ });
1227
+ const expansionStart = layerProps.length > 0
1228
+ ? this.computeResolutionWindowStart(layerProps, options.windowStart, 2)
1229
+ : options.windowStart;
1230
+ const expansionEnd = layerProps.length > 0
1231
+ ? this.computeResolutionWindowEndByPeriods(layerProps, options.windowEnd, 2)
1232
+ : options.windowEnd;
1233
+ if (inputs.schedule.projectId) {
1234
+ projectIds.add(inputs.schedule.projectId.toString());
1235
+ }
1236
+ if (!earliestStart ||
1237
+ OneUptimeDate.isBefore(expansionStart, earliestStart)) {
1238
+ earliestStart = expansionStart;
1239
+ }
1240
+ if (!latestEnd || OneUptimeDate.isAfter(expansionEnd, latestEnd)) {
1241
+ latestEnd = expansionEnd;
1242
+ }
1243
+ prepared.push({
1244
+ inputs,
1245
+ layerProps,
1246
+ scheduleUserIds,
1247
+ expansionStart,
1248
+ expansionEnd,
987
1249
  });
988
1250
  }
989
- const projectId = ((_c = layers[0]) === null || _c === void 0 ? void 0 : _c.projectId) || null;
990
- return { layerProps, projectId, scheduleUserIds };
1251
+ if (prepared.length === 0) {
1252
+ return [];
1253
+ }
1254
+ const allOverrides = projectIds.size > 0 && earliestStart && latestEnd
1255
+ ? await this.loadOverridesForProjects({
1256
+ projectIds: Array.from(projectIds).map((id) => {
1257
+ return new ObjectID(id);
1258
+ }),
1259
+ windowStart: earliestStart,
1260
+ windowEnd: latestEnd,
1261
+ })
1262
+ : [];
1263
+ const results = [];
1264
+ for (const item of prepared) {
1265
+ results.push(this.resolveScheduleInMemory({
1266
+ schedule: item.inputs.schedule,
1267
+ layers: item.inputs.layers,
1268
+ layerUsers: item.inputs.layerUsers,
1269
+ attachments: item.inputs.attachments,
1270
+ layerProps: item.layerProps,
1271
+ scheduleUserIds: item.scheduleUserIds,
1272
+ overrides: allOverrides,
1273
+ expansionStart: item.expansionStart,
1274
+ expansionEnd: item.expansionEnd,
1275
+ windowStart: options.windowStart,
1276
+ windowEnd: options.windowEnd,
1277
+ maxSimulationIterations: options.maxSimulationIterations,
1278
+ }));
1279
+ }
1280
+ return results;
1281
+ }
1282
+ /*
1283
+ * Everything the resolver needs for a batch of schedules, in four queries.
1284
+ * Schedules that do not exist simply have no entry.
1285
+ */
1286
+ async loadResolutionInputsForSchedules(scheduleIds) {
1287
+ var _a, _b, _c;
1288
+ const schedules = await this.findBy({
1289
+ query: {
1290
+ _id: QueryHelper.any(scheduleIds),
1291
+ },
1292
+ select: {
1293
+ _id: true,
1294
+ name: true,
1295
+ timezone: true,
1296
+ projectId: true,
1297
+ shiftConfigVersion: true,
1298
+ createdAt: true,
1299
+ },
1300
+ limit: LIMIT_PER_PROJECT,
1301
+ skip: 0,
1302
+ props: {
1303
+ isRoot: true,
1304
+ },
1305
+ });
1306
+ const byId = new Map();
1307
+ for (const schedule of schedules) {
1308
+ if (!schedule.id) {
1309
+ continue;
1310
+ }
1311
+ byId.set(schedule.id.toString(), {
1312
+ schedule,
1313
+ layers: [],
1314
+ layerUsers: [],
1315
+ attachments: [],
1316
+ });
1317
+ }
1318
+ if (byId.size === 0) {
1319
+ return byId;
1320
+ }
1321
+ const existingIds = Array.from(byId.keys()).map((id) => {
1322
+ return new ObjectID(id);
1323
+ });
1324
+ const [layers, layerUsers, attachments] = await Promise.all([
1325
+ OnCallDutyPolicyScheduleLayerService.findBy({
1326
+ query: {
1327
+ onCallDutyPolicyScheduleId: QueryHelper.any(existingIds),
1328
+ },
1329
+ select: {
1330
+ _id: true,
1331
+ order: true,
1332
+ name: true,
1333
+ description: true,
1334
+ startsAt: true,
1335
+ restrictionTimes: true,
1336
+ rotation: true,
1337
+ onCallDutyPolicyScheduleId: true,
1338
+ projectId: true,
1339
+ handOffTime: true,
1340
+ updatedAt: true,
1341
+ },
1342
+ sort: {
1343
+ order: SortOrder.Ascending,
1344
+ },
1345
+ limit: LIMIT_PER_PROJECT,
1346
+ skip: 0,
1347
+ props: {
1348
+ isRoot: true,
1349
+ },
1350
+ }),
1351
+ OnCallDutyPolicyScheduleLayerUserService.findBy({
1352
+ query: {
1353
+ onCallDutyPolicyScheduleId: QueryHelper.any(existingIds),
1354
+ },
1355
+ select: {
1356
+ _id: true,
1357
+ user: {
1358
+ _id: true,
1359
+ },
1360
+ userId: true,
1361
+ order: true,
1362
+ onCallDutyPolicyScheduleLayerId: true,
1363
+ onCallDutyPolicyScheduleId: true,
1364
+ updatedAt: true,
1365
+ },
1366
+ sort: {
1367
+ order: SortOrder.Ascending,
1368
+ },
1369
+ limit: LIMIT_PER_PROJECT,
1370
+ skip: 0,
1371
+ props: {
1372
+ isRoot: true,
1373
+ },
1374
+ }),
1375
+ OnCallDutyPolicyEscalationRuleScheduleService.findBy({
1376
+ query: {
1377
+ onCallDutyPolicyScheduleId: QueryHelper.any(existingIds),
1378
+ },
1379
+ select: {
1380
+ _id: true,
1381
+ onCallDutyPolicyScheduleId: true,
1382
+ onCallDutyPolicyId: true,
1383
+ onCallDutyPolicyEscalationRuleId: true,
1384
+ updatedAt: true,
1385
+ onCallDutyPolicy: {
1386
+ name: true,
1387
+ _id: true,
1388
+ },
1389
+ onCallDutyPolicyEscalationRule: {
1390
+ name: true,
1391
+ _id: true,
1392
+ order: true,
1393
+ },
1394
+ },
1395
+ limit: LIMIT_PER_PROJECT,
1396
+ skip: 0,
1397
+ props: {
1398
+ isRoot: true,
1399
+ },
1400
+ }),
1401
+ ]);
1402
+ for (const layer of layers) {
1403
+ const entry = byId.get(((_a = layer.onCallDutyPolicyScheduleId) === null || _a === void 0 ? void 0 : _a.toString()) || "");
1404
+ if (entry) {
1405
+ entry.layers.push(layer);
1406
+ }
1407
+ }
1408
+ for (const layerUser of layerUsers) {
1409
+ const entry = byId.get(((_b = layerUser.onCallDutyPolicyScheduleId) === null || _b === void 0 ? void 0 : _b.toString()) || "");
1410
+ if (entry) {
1411
+ entry.layerUsers.push(layerUser);
1412
+ }
1413
+ }
1414
+ for (const attachment of attachments) {
1415
+ const entry = byId.get(((_c = attachment.onCallDutyPolicyScheduleId) === null || _c === void 0 ? void 0 : _c.toString()) || "");
1416
+ if (entry) {
1417
+ entry.attachments.push(attachment);
1418
+ }
1419
+ }
1420
+ return byId;
1421
+ }
1422
+ /*
1423
+ * Every override (global AND policy-scoped) of the given projects that
1424
+ * overlaps [windowStart, windowEnd]. The per-schedule policy scoping and
1425
+ * member filtering happen in memory (see selectOverridesForSchedule), which
1426
+ * mirrors fetchOverridesForSchedule's query exactly but for many schedules
1427
+ * at once.
1428
+ */
1429
+ async loadOverridesForProjects(data) {
1430
+ if (data.projectIds.length === 0) {
1431
+ return [];
1432
+ }
1433
+ return await OnCallDutyPolicyUserOverrideService.findBy({
1434
+ query: {
1435
+ projectId: QueryHelper.any(data.projectIds),
1436
+ startsAt: QueryHelper.lessThanEqualTo(data.windowEnd),
1437
+ endsAt: QueryHelper.greaterThanEqualTo(data.windowStart),
1438
+ },
1439
+ select: {
1440
+ _id: true,
1441
+ projectId: true,
1442
+ startsAt: true,
1443
+ endsAt: true,
1444
+ overrideUserId: true,
1445
+ routeAlertsToUserId: true,
1446
+ onCallDutyPolicyId: true,
1447
+ updatedAt: true,
1448
+ },
1449
+ sort: {
1450
+ startsAt: SortOrder.Ascending,
1451
+ },
1452
+ limit: LIMIT_PER_PROJECT,
1453
+ skip: 0,
1454
+ props: {
1455
+ isRoot: true,
1456
+ },
1457
+ });
1458
+ }
1459
+ /*
1460
+ * The in-memory twin of fetchOverridesForSchedule: the overrides of this
1461
+ * schedule's project that overlap the window, whose overridden user is a
1462
+ * schedule member, scoped to `policyId` (that policy's plus globals) or to
1463
+ * globals only when no policy context is given.
1464
+ */
1465
+ selectOverridesForSchedule(data) {
1466
+ return data.overrides.filter((override) => {
1467
+ var _a, _b, _c;
1468
+ if (((_a = override.projectId) === null || _a === void 0 ? void 0 : _a.toString()) !== data.projectId) {
1469
+ return false;
1470
+ }
1471
+ if (!override.startsAt || !override.endsAt) {
1472
+ return false;
1473
+ }
1474
+ if (OneUptimeDate.isAfter(override.startsAt, data.windowEnd) ||
1475
+ OneUptimeDate.isBefore(override.endsAt, data.windowStart)) {
1476
+ return false;
1477
+ }
1478
+ if (!data.scheduleUserIds.has(((_b = override.overrideUserId) === null || _b === void 0 ? void 0 : _b.toString()) || "")) {
1479
+ return false;
1480
+ }
1481
+ const overridePolicyId = ((_c = override.onCallDutyPolicyId) === null || _c === void 0 ? void 0 : _c.toString()) || undefined;
1482
+ if (!overridePolicyId) {
1483
+ return true; // global
1484
+ }
1485
+ return Boolean(data.policyId) && overridePolicyId === data.policyId;
1486
+ });
1487
+ }
1488
+ toUserOverrideRecord(override) {
1489
+ var _a, _b, _c;
1490
+ return {
1491
+ overrideUserId: ((_a = override.overrideUserId) === null || _a === void 0 ? void 0 : _a.toString()) || "",
1492
+ routeAlertsToUserId: ((_b = override.routeAlertsToUserId) === null || _b === void 0 ? void 0 : _b.toString()) || "",
1493
+ startsAt: override.startsAt,
1494
+ endsAt: override.endsAt,
1495
+ onCallDutyPolicyId: ((_c = override.onCallDutyPolicyId) === null || _c === void 0 ? void 0 : _c.toString()) || null,
1496
+ };
1497
+ }
1498
+ /*
1499
+ * The pure part of the resolver: given everything already loaded, expand
1500
+ * once and resolve the base context plus any policy variants.
1501
+ */
1502
+ resolveScheduleInMemory(data) {
1503
+ var _a, _b, _c;
1504
+ const scheduleId = data.schedule.id.toString();
1505
+ const projectId = ((_a = data.schedule.projectId) === null || _a === void 0 ? void 0 : _a.toString()) || "";
1506
+ // Distinct (policy, rule) attachments, stable order.
1507
+ const attachedPolicies = this.toAttachedPolicies(data.attachments);
1508
+ const distinctPolicyIds = [];
1509
+ for (const policy of attachedPolicies) {
1510
+ if (!distinctPolicyIds.includes(policy.policyId)) {
1511
+ distinctPolicyIds.push(policy.policyId);
1512
+ }
1513
+ }
1514
+ // The roster rule: exactly one attached policy => resolve in its context.
1515
+ const baseContextPolicyId = distinctPolicyIds.length === 1 ? distinctPolicyIds[0] : undefined;
1516
+ // 1 + 2 + 3: one engine expansion over the widened window.
1517
+ let baseEvents = [];
1518
+ let truncated = false;
1519
+ if (data.layerProps.length > 0) {
1520
+ const expansion = this.layerUtil.getMultiLayerEventsWithMeta({
1521
+ layers: data.layerProps,
1522
+ calendarStartDate: data.expansionStart,
1523
+ calendarEndDate: data.expansionEnd,
1524
+ }, data.maxSimulationIterations !== undefined
1525
+ ? { maxSimulationIterations: data.maxSimulationIterations }
1526
+ : undefined);
1527
+ baseEvents = expansion.events;
1528
+ truncated = expansion.truncated;
1529
+ }
1530
+ const scheduleUserIdSet = new Set(data.scheduleUserIds.map((id) => {
1531
+ return id.toString();
1532
+ }));
1533
+ // 4: overrides in the base (roster) context.
1534
+ const baseOverrideRows = this.selectOverridesForSchedule({
1535
+ overrides: data.overrides,
1536
+ projectId,
1537
+ scheduleUserIds: scheduleUserIdSet,
1538
+ windowStart: data.expansionStart,
1539
+ windowEnd: data.expansionEnd,
1540
+ policyId: baseContextPolicyId,
1541
+ });
1542
+ const baseOverrides = baseOverrideRows.map((override) => {
1543
+ return this.toUserOverrideRecord(override);
1544
+ });
1545
+ const participatingOverrideRows = [
1546
+ ...baseOverrideRows,
1547
+ ];
1548
+ const participatingOverrides = [
1549
+ ...baseOverrides,
1550
+ ];
1551
+ let segments = baseEvents;
1552
+ if (baseOverrides.length > 0 && baseEvents.length > 0) {
1553
+ segments = UserOverrideUtil.applyOverridesToEvents({
1554
+ events: baseEvents,
1555
+ overrides: baseOverrides,
1556
+ currentOnCallDutyPolicyId: baseContextPolicyId,
1557
+ });
1558
+ }
1559
+ segments = this.filterEventsOverlappingWindow(segments, data.windowStart, data.windowEnd);
1560
+ // 5: policy variants.
1561
+ const policyVariants = [];
1562
+ if (distinctPolicyIds.length >= 2 && baseEvents.length > 0) {
1563
+ for (const policyId of distinctPolicyIds) {
1564
+ const scopedRows = this.selectOverridesForSchedule({
1565
+ overrides: data.overrides,
1566
+ projectId,
1567
+ scheduleUserIds: scheduleUserIdSet,
1568
+ windowStart: data.expansionStart,
1569
+ windowEnd: data.expansionEnd,
1570
+ policyId,
1571
+ }).filter((override) => {
1572
+ // Only the policy-scoped ones make this context differ.
1573
+ return Boolean(override.onCallDutyPolicyId);
1574
+ });
1575
+ if (scopedRows.length === 0) {
1576
+ continue;
1577
+ }
1578
+ const variantOverrideRows = [
1579
+ ...scopedRows,
1580
+ ...baseOverrideRows,
1581
+ ];
1582
+ const variantOverrides = variantOverrideRows.map((override) => {
1583
+ return this.toUserOverrideRecord(override);
1584
+ });
1585
+ for (const row of scopedRows) {
1586
+ participatingOverrideRows.push(row);
1587
+ }
1588
+ for (const record of variantOverrides.slice(0, scopedRows.length)) {
1589
+ participatingOverrides.push(record);
1590
+ }
1591
+ const variantSegments = this.filterEventsOverlappingWindow(UserOverrideUtil.applyOverridesToEvents({
1592
+ events: baseEvents,
1593
+ overrides: variantOverrides,
1594
+ currentOnCallDutyPolicyId: policyId,
1595
+ }), data.windowStart, data.windowEnd);
1596
+ const policyName = ((_b = attachedPolicies.find((policy) => {
1597
+ return policy.policyId === policyId;
1598
+ })) === null || _b === void 0 ? void 0 : _b.policyName) || "";
1599
+ policyVariants.push({
1600
+ policyId,
1601
+ policyName,
1602
+ segments: variantSegments,
1603
+ });
1604
+ }
1605
+ }
1606
+ // 6: lastModifiedAt — schedule row excluded.
1607
+ const lastModifiedAt = this.computeLastModifiedAt({
1608
+ schedule: data.schedule,
1609
+ layers: data.layers,
1610
+ layerUsers: data.layerUsers,
1611
+ attachments: data.attachments,
1612
+ overrides: participatingOverrideRows,
1613
+ });
1614
+ const scheduleInfo = {
1615
+ id: scheduleId,
1616
+ name: data.schedule.name || "",
1617
+ projectId,
1618
+ shiftConfigVersion: Service.toVersionNumber(data.schedule.shiftConfigVersion),
1619
+ };
1620
+ const timezone = ((_c = data.schedule.timezone) === null || _c === void 0 ? void 0 : _c.toString()) || undefined;
1621
+ if (timezone) {
1622
+ scheduleInfo.timezone = timezone;
1623
+ }
1624
+ return {
1625
+ schedule: scheduleInfo,
1626
+ segments,
1627
+ policyVariants,
1628
+ attachedPolicies,
1629
+ layerProps: data.layerProps,
1630
+ scheduleUserIds: Array.from(scheduleUserIdSet),
1631
+ overrides: participatingOverrides,
1632
+ lastModifiedAt,
1633
+ truncated,
1634
+ };
1635
+ }
1636
+ toAttachedPolicies(attachments) {
1637
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j;
1638
+ const seen = new Set();
1639
+ const policies = [];
1640
+ for (const attachment of attachments) {
1641
+ const policyId = ((_a = attachment.onCallDutyPolicyId) === null || _a === void 0 ? void 0 : _a.toString()) ||
1642
+ ((_c = (_b = attachment.onCallDutyPolicy) === null || _b === void 0 ? void 0 : _b.id) === null || _c === void 0 ? void 0 : _c.toString()) ||
1643
+ "";
1644
+ const ruleId = ((_d = attachment.onCallDutyPolicyEscalationRuleId) === null || _d === void 0 ? void 0 : _d.toString()) ||
1645
+ ((_f = (_e = attachment.onCallDutyPolicyEscalationRule) === null || _e === void 0 ? void 0 : _e.id) === null || _f === void 0 ? void 0 : _f.toString()) ||
1646
+ "";
1647
+ if (!policyId) {
1648
+ continue;
1649
+ }
1650
+ const key = `${policyId}:${ruleId}`;
1651
+ if (seen.has(key)) {
1652
+ continue;
1653
+ }
1654
+ seen.add(key);
1655
+ policies.push({
1656
+ policyId,
1657
+ policyName: ((_g = attachment.onCallDutyPolicy) === null || _g === void 0 ? void 0 : _g.name) || "",
1658
+ ruleId,
1659
+ ruleName: ((_h = attachment.onCallDutyPolicyEscalationRule) === null || _h === void 0 ? void 0 : _h.name) || "",
1660
+ ruleOrder: Service.toVersionNumber((_j = attachment.onCallDutyPolicyEscalationRule) === null || _j === void 0 ? void 0 : _j.order),
1661
+ });
1662
+ }
1663
+ policies.sort((a, b) => {
1664
+ if (a.policyName !== b.policyName) {
1665
+ return a.policyName < b.policyName ? -1 : 1;
1666
+ }
1667
+ if (a.policyId !== b.policyId) {
1668
+ return a.policyId < b.policyId ? -1 : 1;
1669
+ }
1670
+ if (a.ruleOrder !== b.ruleOrder) {
1671
+ return a.ruleOrder - b.ruleOrder;
1672
+ }
1673
+ return a.ruleId < b.ruleId ? -1 : a.ruleId > b.ruleId ? 1 : 0;
1674
+ });
1675
+ return policies;
1676
+ }
1677
+ computeLastModifiedAt(data) {
1678
+ let latest = null;
1679
+ const consider = (value) => {
1680
+ if (!value) {
1681
+ return;
1682
+ }
1683
+ const asDate = value instanceof Date ? value : new Date(value);
1684
+ if (Number.isNaN(asDate.getTime())) {
1685
+ return;
1686
+ }
1687
+ if (!latest || asDate.getTime() > latest.getTime()) {
1688
+ latest = asDate;
1689
+ }
1690
+ };
1691
+ for (const rows of [
1692
+ data.layers,
1693
+ data.layerUsers,
1694
+ data.attachments,
1695
+ data.overrides,
1696
+ ]) {
1697
+ for (const row of rows) {
1698
+ consider(row.updatedAt);
1699
+ }
1700
+ }
1701
+ if (latest) {
1702
+ return latest;
1703
+ }
1704
+ /*
1705
+ * Nothing configured yet (no layers, no attachments): fall back to when
1706
+ * the schedule was CREATED — stable, unlike its updatedAt — and finally
1707
+ * to the epoch so the value is always a valid instant.
1708
+ */
1709
+ if (data.schedule.createdAt) {
1710
+ const created = new Date(data.schedule.createdAt);
1711
+ if (!Number.isNaN(created.getTime())) {
1712
+ return created;
1713
+ }
1714
+ }
1715
+ return new Date(0);
1716
+ }
1717
+ filterEventsOverlappingWindow(events, windowStart, windowEnd) {
1718
+ return events.filter((event) => {
1719
+ if (!event || !event.start || !event.end) {
1720
+ return false;
1721
+ }
1722
+ return (event.start.getTime() < windowEnd.getTime() &&
1723
+ event.end.getTime() > windowStart.getTime());
1724
+ });
1725
+ }
1726
+ static toVersionNumber(value) {
1727
+ const parsed = typeof value === "number" ? value : parseInt(String(value !== null && value !== void 0 ? value : ""), 10);
1728
+ return Number.isFinite(parsed) && parsed >= 0 ? parsed : 0;
1729
+ }
1730
+ /*
1731
+ * ---------------------------------------------------------------------------
1732
+ * Change propagation — shiftConfigVersion, feed caches, listeners.
1733
+ * ---------------------------------------------------------------------------
1734
+ */
1735
+ /**
1736
+ * Atomically add one to shiftConfigVersion of each schedule, in a single
1737
+ * UPDATE per schedule (`SET col = COALESCE(col, 0) + 1`, no hooks, no
1738
+ * optimistic-lock bump — see atomicAddToColumnsByIdWithoutHooks). Best
1739
+ * effort: a failure is logged and never thrown, because this runs inside
1740
+ * the CRUD hooks of the user's edit and must not fail it.
1741
+ *
1742
+ * NEVER call this from refreshCurrentUserIdAndHandoffTimeInSchedule: the
1743
+ * roster refresh runs every handoff and touches no configuration, and the
1744
+ * version is what calendar clients see as SEQUENCE — bumping it there would
1745
+ * make every feed look edited every rotation period.
1746
+ */
1747
+ async bumpShiftConfigVersion(scheduleIds) {
1748
+ for (const scheduleId of OnCallShiftChangeListeners.dedupe(scheduleIds)) {
1749
+ try {
1750
+ await this.atomicAddToColumnsByIdWithoutHooks({
1751
+ id: scheduleId,
1752
+ add: { shiftConfigVersion: 1 },
1753
+ });
1754
+ }
1755
+ catch (err) {
1756
+ logger.error(`Error bumping shiftConfigVersion for schedule ${scheduleId.toString()} (best-effort).`);
1757
+ logger.error(err);
1758
+ }
1759
+ }
1760
+ }
1761
+ /**
1762
+ * The schedules in `projectId` whose layers include any of `userIds` —
1763
+ * the query refreshRostersForUserInProject uses, batched. Root read.
1764
+ */
1765
+ async getScheduleIdsForUsersInProject(data) {
1766
+ const userIds = OnCallShiftChangeListeners.dedupe(data.userIds);
1767
+ if (userIds.length === 0) {
1768
+ return [];
1769
+ }
1770
+ const layerUsers = await OnCallDutyPolicyScheduleLayerUserService.findBy({
1771
+ query: {
1772
+ projectId: data.projectId,
1773
+ userId: QueryHelper.any(userIds),
1774
+ },
1775
+ select: {
1776
+ onCallDutyPolicyScheduleId: true,
1777
+ },
1778
+ limit: LIMIT_PER_PROJECT,
1779
+ skip: 0,
1780
+ props: {
1781
+ isRoot: true,
1782
+ },
1783
+ });
1784
+ return OnCallShiftChangeListeners.dedupe(layerUsers
1785
+ .map((layerUser) => {
1786
+ return layerUser.onCallDutyPolicyScheduleId;
1787
+ })
1788
+ .filter((id) => {
1789
+ return Boolean(id);
1790
+ }));
1791
+ }
1792
+ /**
1793
+ * What every configuration hook calls after the roster refresh:
1794
+ * 1. bump shiftConfigVersion of the affected schedules (SEQUENCE / cache key),
1795
+ * 2. purge the calendar-feed caches of those schedules and of the users
1796
+ * the change names directly,
1797
+ * 3. tell the shift-change listeners (the reminder change pass) which
1798
+ * schedules and users to look at again — delivered in the background,
1799
+ * never awaited, never allowed to fail the edit.
1800
+ * Never throws.
1801
+ */
1802
+ async propagateShiftConfigChange(change) {
1803
+ try {
1804
+ const scheduleIds = OnCallShiftChangeListeners.dedupe(change.scheduleIds);
1805
+ const explicitUserIds = OnCallShiftChangeListeners.dedupe(change.userIds || []);
1806
+ if (scheduleIds.length > 0 && !change.skipVersionBump) {
1807
+ await this.bumpShiftConfigVersion(scheduleIds);
1808
+ }
1809
+ for (const scheduleId of scheduleIds) {
1810
+ try {
1811
+ await OnCallCalendarFeedCache.purgeForSchedule(scheduleId.toString());
1812
+ }
1813
+ catch (err) {
1814
+ logger.error(err);
1815
+ }
1816
+ }
1817
+ if (change.projectId) {
1818
+ for (const userId of explicitUserIds) {
1819
+ try {
1820
+ await OnCallCalendarFeedCache.purgeForUser(change.projectId.toString(), userId.toString());
1821
+ }
1822
+ catch (err) {
1823
+ logger.error(err);
1824
+ }
1825
+ }
1826
+ }
1827
+ let userIds = explicitUserIds;
1828
+ if (scheduleIds.length > 0) {
1829
+ try {
1830
+ const members = await OnCallDutyPolicyScheduleLayerUserService.findBy({
1831
+ query: {
1832
+ onCallDutyPolicyScheduleId: QueryHelper.any(scheduleIds),
1833
+ },
1834
+ select: {
1835
+ userId: true,
1836
+ },
1837
+ limit: LIMIT_PER_PROJECT,
1838
+ skip: 0,
1839
+ props: {
1840
+ isRoot: true,
1841
+ },
1842
+ });
1843
+ userIds = OnCallShiftChangeListeners.dedupe([
1844
+ ...explicitUserIds,
1845
+ ...members
1846
+ .map((member) => {
1847
+ return member.userId;
1848
+ })
1849
+ .filter((id) => {
1850
+ return Boolean(id);
1851
+ }),
1852
+ ]);
1853
+ }
1854
+ catch (err) {
1855
+ logger.error("Error loading schedule members for the shift-change event (best-effort).");
1856
+ logger.error(err);
1857
+ }
1858
+ }
1859
+ const event = OnCallShiftChangeListeners.buildEvent({
1860
+ projectId: change.projectId,
1861
+ scheduleIds,
1862
+ userIds,
1863
+ reason: change.reason,
1864
+ });
1865
+ // Background delivery; notify never rejects, the catch is belt-and-braces.
1866
+ OnCallShiftChangeListeners.notify(event).catch((err) => {
1867
+ logger.error(err);
1868
+ });
1869
+ }
1870
+ catch (err) {
1871
+ logger.error("Error propagating an on-call configuration change (best-effort).");
1872
+ logger.error(err);
1873
+ }
991
1874
  }
992
1875
  async fetchOverridesForSchedule(data) {
993
1876
  if (data.scheduleUserIds.length === 0) {
@@ -1148,6 +2031,39 @@ export class Service extends DatabaseService {
1148
2031
  }
1149
2032
  return windowStart;
1150
2033
  }
2034
+ /*
2035
+ * Mirror of computeResolutionWindowStart, stepping FORWARDS: the latest of
2036
+ * `from` plus `periodsForward` rotation periods across the layers (at least
2037
+ * a day). The calendar-feed resolver widens its expansion this far past the
2038
+ * requested window so the last overlapping segment carries its true end
2039
+ * instead of the engine's clamp to the window edge.
2040
+ */
2041
+ computeResolutionWindowEndByPeriods(layerProps, from, periodsForward) {
2042
+ let windowEnd = OneUptimeDate.addRemoveDays(from, 1);
2043
+ for (const layer of layerProps) {
2044
+ if (!layer.rotation) {
2045
+ continue;
2046
+ }
2047
+ let recurring;
2048
+ try {
2049
+ recurring =
2050
+ layer.rotation instanceof Recurring
2051
+ ? layer.rotation
2052
+ : Recurring.fromJSON(layer.rotation);
2053
+ }
2054
+ catch (_a) {
2055
+ continue;
2056
+ }
2057
+ let candidate = from;
2058
+ for (let i = 0; i < periodsForward; i++) {
2059
+ candidate = Recurring.getNextDateInterval(candidate, recurring);
2060
+ }
2061
+ if (OneUptimeDate.isAfter(candidate, windowEnd)) {
2062
+ windowEnd = candidate;
2063
+ }
2064
+ }
2065
+ return windowEnd;
2066
+ }
1151
2067
  /*
1152
2068
  * Recover the TRUE start of the current on-call coverage window for
1153
2069
  * `currentUserId`. getEventByIndexInSchedule always expands from `now`, and
@@ -1314,6 +2230,36 @@ export class Service extends DatabaseService {
1314
2230
  return new ObjectID(userId);
1315
2231
  }
1316
2232
  }
2233
+ __decorate([
2234
+ CaptureSpan(),
2235
+ __metadata("design:type", Function),
2236
+ __metadata("design:paramtypes", [Object]),
2237
+ __metadata("design:returntype", Promise)
2238
+ ], Service.prototype, "getResolvedShiftSegments", null);
2239
+ __decorate([
2240
+ CaptureSpan(),
2241
+ __metadata("design:type", Function),
2242
+ __metadata("design:paramtypes", [Object]),
2243
+ __metadata("design:returntype", Promise)
2244
+ ], Service.prototype, "getResolvedShiftSegmentsForSchedules", null);
2245
+ __decorate([
2246
+ CaptureSpan(),
2247
+ __metadata("design:type", Function),
2248
+ __metadata("design:paramtypes", [Array]),
2249
+ __metadata("design:returntype", Promise)
2250
+ ], Service.prototype, "bumpShiftConfigVersion", null);
2251
+ __decorate([
2252
+ CaptureSpan(),
2253
+ __metadata("design:type", Function),
2254
+ __metadata("design:paramtypes", [Object]),
2255
+ __metadata("design:returntype", Promise)
2256
+ ], Service.prototype, "getScheduleIdsForUsersInProject", null);
2257
+ __decorate([
2258
+ CaptureSpan(),
2259
+ __metadata("design:type", Function),
2260
+ __metadata("design:paramtypes", [Object]),
2261
+ __metadata("design:returntype", Promise)
2262
+ ], Service.prototype, "propagateShiftConfigChange", null);
1317
2263
  __decorate([
1318
2264
  CaptureSpan(),
1319
2265
  __metadata("design:type", Function),