@oneuptime/common 13.0.7 → 13.0.8

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 (463) hide show
  1. package/Models/DatabaseModels/OnCallDutyPolicyScheduleCalendarFeed.ts +1 -1
  2. package/Models/DatabaseModels/ProjectOnCallCalendarFeed.ts +1 -1
  3. package/Models/DatabaseModels/UserOnCallCalendarFeed.ts +1 -1
  4. package/Server/API/AIBillingAPI.ts +1 -0
  5. package/Server/API/AIInsightAPI.ts +1 -4
  6. package/Server/API/AIInvestigationAPI.ts +1 -4
  7. package/Server/API/AIReadinessAPI.ts +4 -5
  8. package/Server/API/AlertAPI.ts +1 -0
  9. package/Server/API/AutoRemediationAPI.ts +1 -4
  10. package/Server/API/BaseAPI.ts +13 -0
  11. package/Server/API/BaseAnalyticsAPI.ts +80 -9
  12. package/Server/API/BillingAPI.ts +2 -0
  13. package/Server/API/BillingInvoiceAPI.ts +1 -0
  14. package/Server/API/BillingPaymentMethodAPI.ts +2 -0
  15. package/Server/API/CodeFixRunAPI.ts +1 -3
  16. package/Server/API/CommonAPI.ts +68 -4
  17. package/Server/API/DashboardAPI.ts +12 -12
  18. package/Server/API/GlobalConfigAPI.ts +17 -0
  19. package/Server/API/IncidentAPI.ts +2 -0
  20. package/Server/API/IncidentEpisodeAPI.ts +1 -0
  21. package/Server/API/NotificationAPI.ts +1 -0
  22. package/Server/API/OnCallCalendarAPI.ts +4 -5
  23. package/Server/API/OnCallDutyPolicyAPI.ts +7 -0
  24. package/Server/API/OnCallReadinessAPI.ts +4 -1
  25. package/Server/API/OnCallScheduleTimelineAPI.ts +731 -0
  26. package/Server/API/ProjectAPI.ts +1 -0
  27. package/Server/API/ScheduledMaintenanceAPI.ts +1 -0
  28. package/Server/API/StatusPageAPI.ts +161 -32
  29. package/Server/API/TeamMemberAPI.ts +3 -0
  30. package/Server/API/UserCallAPI.ts +2 -0
  31. package/Server/API/UserEmailAPI.ts +2 -0
  32. package/Server/API/UserIncomingCallNumberAPI.ts +2 -0
  33. package/Server/API/UserMicrosoftTeamsAPI.ts +1 -0
  34. package/Server/API/UserSlackAPI.ts +1 -0
  35. package/Server/API/UserSmsAPI.ts +2 -0
  36. package/Server/API/UserTotpAuthAPI.ts +1 -0
  37. package/Server/API/UserWebAuthnAPI.ts +2 -0
  38. package/Server/API/UserWebhookAPI.ts +1 -0
  39. package/Server/API/UserWhatsAppAPI.ts +2 -0
  40. package/Server/Middleware/MasterAdminAuthorization.ts +13 -2
  41. package/Server/Middleware/UserAuthorization.ts +79 -5
  42. package/Server/Services/ApiKeyPermissionService.ts +101 -4
  43. package/Server/Services/DatabaseService.ts +245 -0
  44. package/Server/Services/DetectionRuleService.ts +5 -4
  45. package/Server/Services/OnCallDutyPolicyChildService.ts +261 -0
  46. package/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.ts +2 -2
  47. package/Server/Services/OnCallDutyPolicyEscalationRuleService.ts +2 -2
  48. package/Server/Services/OnCallDutyPolicyEscalationRuleTeamService.ts +2 -2
  49. package/Server/Services/OnCallDutyPolicyEscalationRuleUserService.ts +2 -2
  50. package/Server/Services/PayAsYouGoBillingService.ts +23 -28
  51. package/Server/Services/ProjectService.ts +18 -0
  52. package/Server/Services/RumSessionPinService.ts +274 -22
  53. package/Server/Services/TeamPermissionService.ts +120 -26
  54. package/Server/Services/ThreatIntelFeedService.ts +6 -3
  55. package/Server/Types/Database/Permissions/BasePermission.ts +9 -7
  56. package/Server/Types/Database/Permissions/Index.ts +75 -11
  57. package/Server/Types/Database/Permissions/TablePermission.ts +24 -28
  58. package/Server/Utils/AI/AIChatPrivacyFilter.ts +8 -0
  59. package/Server/Utils/AI/AIRunPrivacyFilter.ts +8 -0
  60. package/Server/Utils/MasterAdminPageAccess.ts +61 -0
  61. package/Server/Utils/Monitor/MonitorAlert.ts +3 -1
  62. package/Server/Utils/Monitor/MonitorIncident.ts +3 -1
  63. package/Server/Utils/OnCall/OnCallCalendarFeedRenderer.ts +1 -1
  64. package/Server/Utils/Realtime.ts +163 -45
  65. package/Server/Utils/SecurityEvent/DetectionRuleEvaluator.ts +11 -28
  66. package/Server/Utils/SecurityEvent/GoogleSecOpsSeverityRepair.ts +170 -0
  67. package/Server/Utils/SecurityEvent/Sigma/SigmaClickhouseCompiler.ts +1 -1
  68. package/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.ts +6 -2
  69. package/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelMatcher.ts +10 -9
  70. package/Tests/App/Dashboard/AffectedResourcesPicker.test.tsx +1059 -0
  71. package/Tests/App/Dashboard/AffectedResourcesPickerEditForm.test.tsx +376 -0
  72. package/Tests/App/Dashboard/AffectedResourcesPickerHiddenTypes.test.tsx +757 -0
  73. package/Tests/App/Dashboard/AffectedResourcesSummaryStep.test.tsx +307 -0
  74. package/Tests/App/Dashboard/ArgumentsFormGroupByUnlistedAttributes.test.tsx +131 -0
  75. package/Tests/App/Dashboard/DashboardHeaderRequests.test.tsx +1 -1
  76. package/Tests/App/Dashboard/DashboardMonitorLabelVariable.test.tsx +9 -1
  77. package/Tests/App/Dashboard/DashboardVariableAllContract.test.tsx +24 -0
  78. package/Tests/App/Dashboard/DashboardVariableSelector.test.tsx +162 -8
  79. package/Tests/App/Dashboard/EntityFilterDropdownArchivedSlos.test.tsx +105 -6
  80. package/Tests/App/Dashboard/EntityFilterDropdownUnlistedSelection.test.tsx +434 -0
  81. package/Tests/App/Dashboard/EscalationRuleReadiness.test.tsx +276 -1
  82. package/Tests/App/Dashboard/OnCallCalendarFeedSideMenus.test.tsx +9 -1
  83. package/Tests/App/Dashboard/PayAsYouGoConsentGate.test.tsx +58 -42
  84. package/Tests/App/Dashboard/PayAsYouGoNotices.test.tsx +42 -5
  85. package/Tests/App/Dashboard/ResourceAuditLogsSideMenus.test.tsx +34 -23
  86. package/Tests/App/Dashboard/ScheduleTimeline.test.tsx +1580 -0
  87. package/Tests/App/Dashboard/ScheduleTimelineAPI.test.ts +280 -0
  88. package/Tests/App/Dashboard/ScheduleTimelineModel.test.ts +673 -0
  89. package/Tests/App/Dashboard/SecurityEventConnectionDiagnostics.test.tsx +95 -68
  90. package/Tests/App/Dashboard/SecurityEventsDetectionRulesPage.test.tsx +86 -3
  91. package/Tests/App/Dashboard/SecurityEventsEmptyState.test.tsx +28 -3
  92. package/Tests/App/Dashboard/SecurityEventsExplorer.test.tsx +761 -0
  93. package/Tests/App/Dashboard/SecurityEventsGuideContent.test.ts +1313 -0
  94. package/Tests/App/Dashboard/SecurityEventsHowItWorksCard.test.tsx +536 -0
  95. package/Tests/App/Dashboard/SecurityEventsNoResults.test.tsx +222 -0
  96. package/Tests/App/Dashboard/SecurityEventsThreatIntelPage.test.tsx +199 -0
  97. package/Tests/App/Dashboard/SecurityEventsVolumeChart.test.tsx +321 -0
  98. package/Tests/App/Dashboard/SloOverviewHero.test.tsx +171 -36
  99. package/Tests/App/Dashboard/SloViewSideMenu.test.tsx +215 -0
  100. package/Tests/App/Dashboard/SloViewSideMenuCounts.test.tsx +40 -3
  101. package/Tests/App/PublicDashboard/DashboardVariableSelector.test.tsx +12 -4
  102. package/Tests/App/PublicDashboard/PublicDashboardWidgetListAuth.test.tsx +623 -0
  103. package/Tests/Models/OnCallCalendarFeedModels.test.ts +23 -1
  104. package/Tests/Server/API/AIChatRouteAuthorization.test.ts +138 -5
  105. package/Tests/Server/API/AIGenerationProjectAIToggle.test.ts +187 -0
  106. package/Tests/Server/API/AIInvestigationAvailabilityAuthorization.test.ts +51 -3
  107. package/Tests/Server/API/AIInvestigationEvidenceAPI.test.ts +55 -2
  108. package/Tests/Server/API/BaseAnalyticsAPIAggregateCache.test.ts +729 -0
  109. package/Tests/Server/API/BillingPayAsYouGoStatus.test.ts +93 -7
  110. package/Tests/Server/API/BillingPaymentMethodAPI.test.ts +36 -3
  111. package/Tests/Server/API/CommonAPIAuthGuard.test.ts +1003 -24
  112. package/Tests/Server/API/DashboardPublicRateLimit.test.ts +6 -3
  113. package/Tests/Server/API/ExpiredSessionAIRoutes.test.ts +708 -0
  114. package/Tests/Server/API/ExpiredSessionCustomRoutes.test.ts +928 -0
  115. package/Tests/Server/API/ExpiredSessionMonitorTemplate.test.ts +319 -0
  116. package/Tests/Server/API/ExpiredSessionOnCallDutyPolicy.test.ts +336 -0
  117. package/Tests/Server/API/ExpiredSessionRouteGuards.test.ts +820 -0
  118. package/Tests/Server/API/GlobalConfigLicense.test.ts +140 -0
  119. package/Tests/Server/API/NotificationChannelVerificationAPI.test.ts +115 -12
  120. package/Tests/Server/API/OnCallCalendarAPI.test.ts +375 -8
  121. package/Tests/Server/API/OnCallReadinessAPI.test.ts +175 -17
  122. package/Tests/Server/API/OnCallScheduleTimelineAPI.test.ts +1513 -0
  123. package/Tests/Server/API/OnCallSetupReminderAPI.test.ts +119 -7
  124. package/Tests/Server/API/ProjectScopedCustomRouteAuth.test.ts +111 -4
  125. package/Tests/Server/API/PublicRouteInvalidAccessToken.test.ts +615 -0
  126. package/Tests/Server/API/SecurityEventAttributesAPI.test.ts +89 -2
  127. package/Tests/Server/API/SessionReplayAPI.test.ts +121 -0
  128. package/Tests/Server/API/StatusPageMasterPasswordRateLimit.test.ts +4 -2
  129. package/Tests/Server/API/StatusPagePostmortemVisibility.test.ts +441 -0
  130. package/Tests/Server/API/StatusPageTestEmailReportAuth.test.ts +664 -0
  131. package/Tests/Server/API/TeamMemberRemoveUserFromProjectAPI.test.ts +7 -0
  132. package/Tests/Server/API/UserIncomingCallNumberApi.test.ts +6 -0
  133. package/Tests/Server/API/UserNotificationSettingAPI.test.ts +65 -4
  134. package/Tests/Server/API/UserProjectsAPI.test.ts +63 -3
  135. package/Tests/Server/API/UserTotpAuthAPI.test.ts +48 -2
  136. package/Tests/Server/API/UserWebAuthnAuthenticationOptionsRoute.test.ts +11 -2
  137. package/Tests/Server/API/UserWebAuthnBackupCodeMinting.test.ts +46 -3
  138. package/Tests/Server/API/UserWebAuthnPasskeyAPI.test.ts +18 -2
  139. package/Tests/Server/API/ZZVerifyChatsAuth.test.ts +24 -7
  140. package/Tests/Server/Middleware/ExpiredSessionUserMiddleware.test.ts +563 -0
  141. package/Tests/Server/Middleware/MasterAdminAuthorization.test.ts +299 -19
  142. package/Tests/Server/Middleware/PublicRouteUserMiddleware.test.ts +453 -0
  143. package/Tests/Server/Services/AIChatPrivacyPin.test.ts +24 -0
  144. package/Tests/Server/Services/ApiKeyPermissionSecurity.test.ts +2 -0
  145. package/Tests/Server/Services/ApiKeyPermissionService.test.ts +3 -3
  146. package/Tests/Server/Services/DatabaseServiceCreateSuppliedId.test.ts +147 -0
  147. package/Tests/Server/Services/DatabaseServiceLoginBeforeHooks.test.ts +1078 -0
  148. package/Tests/Server/Services/DatabaseServiceTenantRelationGuard.test.ts +259 -0
  149. package/Tests/Server/Services/DatabaseServiceWriteOperatorValues.test.ts +147 -0
  150. package/Tests/Server/Services/MonitorPayAsYouGoBilling.test.ts +115 -1
  151. package/Tests/Server/Services/OnCallChildCreateAuthorizationPostgres.test.ts +711 -0
  152. package/Tests/Server/Services/OnCallDutyPolicyChildService.test.ts +733 -0
  153. package/Tests/Server/Services/PayAsYouGoBillingService.test.ts +190 -140
  154. package/Tests/Server/Services/PayAsYouGoStripeRateLimitBudget.test.ts +4 -9
  155. package/Tests/Server/Services/PermissionBlockDeletion.test.ts +780 -0
  156. package/Tests/Server/Services/PermissionBlockDeletionPostgres.test.ts +628 -0
  157. package/Tests/Server/Services/ProjectServiceCreateSubscriptionStarted.test.ts +77 -1
  158. package/Tests/Server/Services/RumSessionPinCreatePermission.test.ts +715 -0
  159. package/Tests/Server/Services/TeamMemberMultiTenantReadPostgres.test.ts +394 -0
  160. package/Tests/Server/Services/TeamPrivilegeEscalation.test.ts +6 -0
  161. package/Tests/Server/Services/TelemetryPayAsYouGoBilling.test.ts +131 -0
  162. package/Tests/Server/Services/UserNotificationRuleAdminGuards.test.ts +13 -2
  163. package/Tests/Server/Types/Database/Permissions/ModelPermissionAnonymousRefusal.test.ts +518 -0
  164. package/Tests/Server/Types/Database/Permissions/MultiTenantPermissions.test.ts +350 -0
  165. package/Tests/Server/Types/Database/Permissions/OnCallCalendarFeedPermissions.test.ts +282 -25
  166. package/Tests/Server/Types/Database/Permissions/TableLevelBlockPermission.test.ts +459 -0
  167. package/Tests/Server/Utils/AI/AIRunPrivacyFilter.test.ts +101 -9
  168. package/Tests/Server/Utils/AI/ChatAgentHelpers.test.ts +88 -4
  169. package/Tests/Server/Utils/AI/Toolbox/ExceptionTools.test.ts +459 -0
  170. package/Tests/Server/Utils/AI/Toolbox/LogTools.test.ts +794 -0
  171. package/Tests/Server/Utils/AI/Toolbox/RecentChangesTools.test.ts +574 -0
  172. package/Tests/Server/Utils/AI/Toolbox/SecurityEventTools.test.ts +596 -0
  173. package/Tests/Server/Utils/CaptchaRequestAndLogging.test.ts +395 -0
  174. package/Tests/Server/Utils/MasterAdminPageAccess.test.ts +251 -0
  175. package/Tests/Server/Utils/Monitor/MonitorActionTimestamps.test.ts +616 -0
  176. package/Tests/Server/Utils/Realtime.test.ts +502 -0
  177. package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnectorSeverity.test.ts +216 -0
  178. package/Tests/Server/Utils/SecurityEvent/DetectionRuleEvaluator.test.ts +142 -0
  179. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsSeverityRepair.test.ts +140 -0
  180. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsSeverityRepairClickhouseIntegration.test.ts +542 -0
  181. package/Tests/Server/Utils/Telemetry/ChangeEventRow.test.ts +743 -0
  182. package/Tests/Server/Utils/Telemetry/RuntimeMetrics.test.ts +465 -0
  183. package/Tests/Server/Utils/Workspace/MicrosoftTeams/Messages/Alert.test.ts +202 -0
  184. package/Tests/Server/Utils/Workspace/MicrosoftTeams/Messages/Incident.test.ts +194 -0
  185. package/Tests/Server/Utils/Workspace/MicrosoftTeams/Messages/ScheduledMaintenance.test.ts +231 -0
  186. package/Tests/Server/Utils/Workspace/Slack/Messages/Alert.test.ts +194 -0
  187. package/Tests/Server/Utils/Workspace/Slack/Messages/AlertEpisode.test.ts +194 -0
  188. package/Tests/Server/Utils/Workspace/Slack/Messages/Incident.test.ts +194 -0
  189. package/Tests/Server/Utils/Workspace/Slack/Messages/IncidentEpisode.test.ts +194 -0
  190. package/Tests/Server/Utils/Workspace/Slack/Messages/ScheduledMaintenance.test.ts +247 -0
  191. package/Tests/Types/AI/AIInsightEvidence.test.ts +206 -0
  192. package/Tests/Types/BaseDatabase/DatabaseCommonInteractionPropsUtilAnonymous.test.ts +144 -0
  193. package/Tests/Types/Call/CallProvider.test.ts +528 -0
  194. package/Tests/Types/Kubernetes/KubernetesCostIngest.test.ts +236 -0
  195. package/Tests/Types/OnCallDutyPolicy/ScheduleTimeline.test.ts +736 -0
  196. package/Tests/Types/OnCallDutyPolicy/ScheduleTimelineLayout.test.ts +996 -0
  197. package/Tests/Types/SecurityEvent/SigmaRule.test.ts +142 -0
  198. package/Tests/Types/Workflow/Components/JSON.test.ts +182 -0
  199. package/Tests/UI/Components/BasicFormDropdownNormalization.test.tsx +116 -1
  200. package/Tests/UI/Components/Dropdown/DropdownAsyncOptions.test.tsx +81 -0
  201. package/Tests/UI/Components/EditionLabelLicenseRefresh.test.tsx +89 -1
  202. package/Tests/UI/Components/EventAttachmentList.test.tsx +174 -0
  203. package/Tests/UI/Components/Forms/BasicFormBurnRateTemplateDefaults.test.tsx +395 -0
  204. package/Tests/UI/Components/Forms/BasicFormCollapsibleSections.test.tsx +286 -0
  205. package/Tests/UI/Components/Forms/FormSummary.test.tsx +128 -0
  206. package/Tests/UI/Components/ModelTable/BaseModelTableQueryChange.test.tsx +365 -0
  207. package/Tests/UI/Components/OpenAuthenticatedUrl.test.ts +358 -0
  208. package/Tests/UI/Components/SessionAwareImage.test.tsx +496 -0
  209. package/Tests/UI/Components/TelemetryHistogramZeroBuckets.test.tsx +190 -0
  210. package/Tests/UI/Components/TooltipInteractive.test.tsx +97 -0
  211. package/Tests/UI/MicrosoftTeams/MicrosoftTeamsChatsCardInstallGuidance.test.tsx +1 -1
  212. package/Tests/UI/Monitor/EvaluationLogListTimestamps.test.tsx +367 -0
  213. package/Tests/UI/Utils/API/BaseAPIRefreshSession.test.ts +1087 -0
  214. package/Tests/UI/Utils/API/DashboardHost.ts +12 -0
  215. package/Tests/UI/Utils/API/FakeAxiosServer.ts +183 -0
  216. package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +10 -0
  217. package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +2 -0
  218. package/Tests/UI/Utils/Cookie.test.ts +440 -0
  219. package/Tests/UI/Utils/ModelAPIRequestClient.test.ts +278 -0
  220. package/Tests/UI/Utils/Navigation.test.ts +33 -0
  221. package/Tests/UI/Utils/PricingPlan.test.ts +295 -0
  222. package/Tests/UI/Utils/Realtime.test.ts +759 -0
  223. package/Tests/UI/Utils/Telemetry/Telemetry.test.ts +500 -0
  224. package/Tests/Utils/APIInstanceDispatch.test.ts +311 -0
  225. package/Tests/Utils/SecurityEvent/GoogleSecOpsAlertNormalizerSeverity.test.ts +565 -0
  226. package/Types/BaseDatabase/DatabaseCommonInteractionPropsUtil.ts +40 -0
  227. package/Types/Monitor/MonitorEvaluationSummary.ts +3 -0
  228. package/Types/OnCallDutyPolicy/ScheduleTimeline.ts +507 -0
  229. package/Types/OnCallDutyPolicy/ScheduleTimelineLayout.ts +589 -0
  230. package/Types/Realtime/EventName.ts +11 -0
  231. package/Types/SecurityEvent/DetectionFindingConstants.ts +14 -0
  232. package/Types/SecurityEvent/OcsfSeverity.ts +31 -26
  233. package/Types/SecurityEvent/SigmaRule.ts +51 -0
  234. package/Types/SecurityEvent/ThreatIntelConstants.ts +18 -0
  235. package/UI/Components/AttachmentList/EventAttachmentList.tsx +30 -2
  236. package/UI/Components/Dashboard/DashboardVariableControl.tsx +12 -2
  237. package/UI/Components/Dropdown/Dropdown.tsx +6 -1
  238. package/UI/Components/EditionLabel/EditionLabel.tsx +12 -0
  239. package/UI/Components/EventItem/EventItem.tsx +12 -1
  240. package/UI/Components/Forms/BasicForm.tsx +151 -126
  241. package/UI/Components/Forms/CollapsibleFormSection.tsx +63 -0
  242. package/UI/Components/Forms/Fields/FormField.tsx +10 -4
  243. package/UI/Components/Forms/FormSummary.tsx +7 -0
  244. package/UI/Components/Forms/Types/Field.ts +10 -0
  245. package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +2 -1
  246. package/UI/Components/Markdown.tsx/SessionAwareImage.tsx +122 -0
  247. package/UI/Components/ModelTable/BaseModelTable.tsx +34 -5
  248. package/UI/Components/ModelTable/TableView.tsx +1 -1
  249. package/UI/Components/TelemetryViewer/components/TelemetryHistogram.tsx +8 -1
  250. package/UI/Components/Tooltip/Tooltip.tsx +8 -1
  251. package/UI/Utils/API/API.ts +173 -12
  252. package/UI/Utils/API/RequestOptions.ts +11 -0
  253. package/UI/Utils/AnalyticsModelAPI/AnalyticsModelAPI.ts +31 -7
  254. package/UI/Utils/ModelAPI/ModelAPI.ts +30 -9
  255. package/UI/Utils/Navigation.ts +9 -0
  256. package/UI/Utils/OpenAuthenticatedUrl.ts +154 -0
  257. package/UI/Utils/Realtime.ts +176 -30
  258. package/Utils/API.ts +14 -5
  259. package/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.ts +157 -7
  260. package/Utils/SecurityEvent/Sigma/SigmaRuleParser.ts +9 -17
  261. package/Utils/Slo/SloBurnRateTemplate.ts +2 -2
  262. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleCalendarFeed.js +1 -1
  263. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleCalendarFeed.js.map +1 -1
  264. package/build/dist/Models/DatabaseModels/ProjectOnCallCalendarFeed.js +1 -1
  265. package/build/dist/Models/DatabaseModels/ProjectOnCallCalendarFeed.js.map +1 -1
  266. package/build/dist/Models/DatabaseModels/UserOnCallCalendarFeed.js +1 -1
  267. package/build/dist/Models/DatabaseModels/UserOnCallCalendarFeed.js.map +1 -1
  268. package/build/dist/Server/API/AIBillingAPI.js +1 -1
  269. package/build/dist/Server/API/AIBillingAPI.js.map +1 -1
  270. package/build/dist/Server/API/AIInsightAPI.js +1 -4
  271. package/build/dist/Server/API/AIInsightAPI.js.map +1 -1
  272. package/build/dist/Server/API/AIInvestigationAPI.js +1 -4
  273. package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
  274. package/build/dist/Server/API/AIReadinessAPI.js +1 -3
  275. package/build/dist/Server/API/AIReadinessAPI.js.map +1 -1
  276. package/build/dist/Server/API/AlertAPI.js +1 -1
  277. package/build/dist/Server/API/AlertAPI.js.map +1 -1
  278. package/build/dist/Server/API/AutoRemediationAPI.js +1 -4
  279. package/build/dist/Server/API/AutoRemediationAPI.js.map +1 -1
  280. package/build/dist/Server/API/BaseAPI.js +12 -0
  281. package/build/dist/Server/API/BaseAPI.js.map +1 -1
  282. package/build/dist/Server/API/BaseAnalyticsAPI.js +55 -10
  283. package/build/dist/Server/API/BaseAnalyticsAPI.js.map +1 -1
  284. package/build/dist/Server/API/BillingAPI.js +2 -2
  285. package/build/dist/Server/API/BillingAPI.js.map +1 -1
  286. package/build/dist/Server/API/BillingInvoiceAPI.js +1 -1
  287. package/build/dist/Server/API/BillingInvoiceAPI.js.map +1 -1
  288. package/build/dist/Server/API/BillingPaymentMethodAPI.js +2 -2
  289. package/build/dist/Server/API/BillingPaymentMethodAPI.js.map +1 -1
  290. package/build/dist/Server/API/CodeFixRunAPI.js +1 -3
  291. package/build/dist/Server/API/CodeFixRunAPI.js.map +1 -1
  292. package/build/dist/Server/API/CommonAPI.js +50 -5
  293. package/build/dist/Server/API/CommonAPI.js.map +1 -1
  294. package/build/dist/Server/API/DashboardAPI.js +12 -12
  295. package/build/dist/Server/API/DashboardAPI.js.map +1 -1
  296. package/build/dist/Server/API/GlobalConfigAPI.js +12 -0
  297. package/build/dist/Server/API/GlobalConfigAPI.js.map +1 -1
  298. package/build/dist/Server/API/IncidentAPI.js +2 -2
  299. package/build/dist/Server/API/IncidentAPI.js.map +1 -1
  300. package/build/dist/Server/API/IncidentEpisodeAPI.js +1 -1
  301. package/build/dist/Server/API/IncidentEpisodeAPI.js.map +1 -1
  302. package/build/dist/Server/API/NotificationAPI.js +1 -1
  303. package/build/dist/Server/API/NotificationAPI.js.map +1 -1
  304. package/build/dist/Server/API/OnCallCalendarAPI.js +1 -4
  305. package/build/dist/Server/API/OnCallCalendarAPI.js.map +1 -1
  306. package/build/dist/Server/API/OnCallDutyPolicyAPI.js +6 -0
  307. package/build/dist/Server/API/OnCallDutyPolicyAPI.js.map +1 -1
  308. package/build/dist/Server/API/OnCallReadinessAPI.js +4 -1
  309. package/build/dist/Server/API/OnCallReadinessAPI.js.map +1 -1
  310. package/build/dist/Server/API/OnCallScheduleTimelineAPI.js +494 -0
  311. package/build/dist/Server/API/OnCallScheduleTimelineAPI.js.map +1 -0
  312. package/build/dist/Server/API/ProjectAPI.js +1 -1
  313. package/build/dist/Server/API/ProjectAPI.js.map +1 -1
  314. package/build/dist/Server/API/ScheduledMaintenanceAPI.js +1 -1
  315. package/build/dist/Server/API/ScheduledMaintenanceAPI.js.map +1 -1
  316. package/build/dist/Server/API/StatusPageAPI.js +125 -33
  317. package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
  318. package/build/dist/Server/API/TeamMemberAPI.js +3 -3
  319. package/build/dist/Server/API/TeamMemberAPI.js.map +1 -1
  320. package/build/dist/Server/API/UserCallAPI.js +2 -2
  321. package/build/dist/Server/API/UserCallAPI.js.map +1 -1
  322. package/build/dist/Server/API/UserEmailAPI.js +2 -2
  323. package/build/dist/Server/API/UserEmailAPI.js.map +1 -1
  324. package/build/dist/Server/API/UserIncomingCallNumberAPI.js +2 -2
  325. package/build/dist/Server/API/UserIncomingCallNumberAPI.js.map +1 -1
  326. package/build/dist/Server/API/UserMicrosoftTeamsAPI.js +1 -1
  327. package/build/dist/Server/API/UserMicrosoftTeamsAPI.js.map +1 -1
  328. package/build/dist/Server/API/UserSlackAPI.js +1 -1
  329. package/build/dist/Server/API/UserSlackAPI.js.map +1 -1
  330. package/build/dist/Server/API/UserSmsAPI.js +2 -2
  331. package/build/dist/Server/API/UserSmsAPI.js.map +1 -1
  332. package/build/dist/Server/API/UserTotpAuthAPI.js +1 -1
  333. package/build/dist/Server/API/UserTotpAuthAPI.js.map +1 -1
  334. package/build/dist/Server/API/UserWebAuthnAPI.js +2 -2
  335. package/build/dist/Server/API/UserWebAuthnAPI.js.map +1 -1
  336. package/build/dist/Server/API/UserWebhookAPI.js +1 -1
  337. package/build/dist/Server/API/UserWebhookAPI.js.map +1 -1
  338. package/build/dist/Server/API/UserWhatsAppAPI.js +2 -2
  339. package/build/dist/Server/API/UserWhatsAppAPI.js.map +1 -1
  340. package/build/dist/Server/Middleware/MasterAdminAuthorization.js +11 -2
  341. package/build/dist/Server/Middleware/MasterAdminAuthorization.js.map +1 -1
  342. package/build/dist/Server/Middleware/UserAuthorization.js +64 -4
  343. package/build/dist/Server/Middleware/UserAuthorization.js.map +1 -1
  344. package/build/dist/Server/Services/ApiKeyPermissionService.js +80 -4
  345. package/build/dist/Server/Services/ApiKeyPermissionService.js.map +1 -1
  346. package/build/dist/Server/Services/DatabaseService.js +171 -0
  347. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  348. package/build/dist/Server/Services/DetectionRuleService.js +4 -4
  349. package/build/dist/Server/Services/DetectionRuleService.js.map +1 -1
  350. package/build/dist/Server/Services/OnCallDutyPolicyChildService.js +170 -0
  351. package/build/dist/Server/Services/OnCallDutyPolicyChildService.js.map +1 -0
  352. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js +2 -2
  353. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js.map +1 -1
  354. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleService.js +2 -2
  355. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleService.js.map +1 -1
  356. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleTeamService.js +2 -2
  357. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleTeamService.js.map +1 -1
  358. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleUserService.js +2 -2
  359. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleUserService.js.map +1 -1
  360. package/build/dist/Server/Services/PayAsYouGoBillingService.js +20 -27
  361. package/build/dist/Server/Services/PayAsYouGoBillingService.js.map +1 -1
  362. package/build/dist/Server/Services/ProjectService.js +17 -0
  363. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  364. package/build/dist/Server/Services/RumSessionPinService.js +180 -16
  365. package/build/dist/Server/Services/RumSessionPinService.js.map +1 -1
  366. package/build/dist/Server/Services/TeamPermissionService.js +89 -27
  367. package/build/dist/Server/Services/TeamPermissionService.js.map +1 -1
  368. package/build/dist/Server/Services/ThreatIntelFeedService.js +5 -4
  369. package/build/dist/Server/Services/ThreatIntelFeedService.js.map +1 -1
  370. package/build/dist/Server/Types/Database/Permissions/BasePermission.js +9 -6
  371. package/build/dist/Server/Types/Database/Permissions/BasePermission.js.map +1 -1
  372. package/build/dist/Server/Types/Database/Permissions/Index.js +60 -6
  373. package/build/dist/Server/Types/Database/Permissions/Index.js.map +1 -1
  374. package/build/dist/Server/Types/Database/Permissions/TablePermission.js +14 -13
  375. package/build/dist/Server/Types/Database/Permissions/TablePermission.js.map +1 -1
  376. package/build/dist/Server/Utils/AI/AIChatPrivacyFilter.js +7 -0
  377. package/build/dist/Server/Utils/AI/AIChatPrivacyFilter.js.map +1 -1
  378. package/build/dist/Server/Utils/AI/AIRunPrivacyFilter.js +7 -0
  379. package/build/dist/Server/Utils/AI/AIRunPrivacyFilter.js.map +1 -1
  380. package/build/dist/Server/Utils/MasterAdminPageAccess.js +39 -0
  381. package/build/dist/Server/Utils/MasterAdminPageAccess.js.map +1 -0
  382. package/build/dist/Server/Utils/Monitor/MonitorAlert.js +3 -1
  383. package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
  384. package/build/dist/Server/Utils/Monitor/MonitorIncident.js +3 -1
  385. package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
  386. package/build/dist/Server/Utils/Realtime.js +126 -37
  387. package/build/dist/Server/Utils/Realtime.js.map +1 -1
  388. package/build/dist/Server/Utils/SecurityEvent/DetectionRuleEvaluator.js +7 -25
  389. package/build/dist/Server/Utils/SecurityEvent/DetectionRuleEvaluator.js.map +1 -1
  390. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOpsSeverityRepair.js +127 -0
  391. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOpsSeverityRepair.js.map +1 -0
  392. package/build/dist/Server/Utils/SecurityEvent/Sigma/SigmaClickhouseCompiler.js +1 -1
  393. package/build/dist/Server/Utils/SecurityEvent/Sigma/SigmaClickhouseCompiler.js.map +1 -1
  394. package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.js +3 -2
  395. package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.js.map +1 -1
  396. package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelMatcher.js +4 -8
  397. package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelMatcher.js.map +1 -1
  398. package/build/dist/Types/BaseDatabase/DatabaseCommonInteractionPropsUtil.js +31 -1
  399. package/build/dist/Types/BaseDatabase/DatabaseCommonInteractionPropsUtil.js.map +1 -1
  400. package/build/dist/Types/OnCallDutyPolicy/ScheduleTimeline.js +321 -0
  401. package/build/dist/Types/OnCallDutyPolicy/ScheduleTimeline.js.map +1 -0
  402. package/build/dist/Types/OnCallDutyPolicy/ScheduleTimelineLayout.js +372 -0
  403. package/build/dist/Types/OnCallDutyPolicy/ScheduleTimelineLayout.js.map +1 -0
  404. package/build/dist/Types/Realtime/EventName.js +10 -0
  405. package/build/dist/Types/Realtime/EventName.js.map +1 -1
  406. package/build/dist/Types/SecurityEvent/DetectionFindingConstants.js +11 -0
  407. package/build/dist/Types/SecurityEvent/DetectionFindingConstants.js.map +1 -1
  408. package/build/dist/Types/SecurityEvent/OcsfSeverity.js +30 -25
  409. package/build/dist/Types/SecurityEvent/OcsfSeverity.js.map +1 -1
  410. package/build/dist/Types/SecurityEvent/SigmaRule.js +47 -0
  411. package/build/dist/Types/SecurityEvent/SigmaRule.js.map +1 -1
  412. package/build/dist/Types/SecurityEvent/ThreatIntelConstants.js +14 -0
  413. package/build/dist/Types/SecurityEvent/ThreatIntelConstants.js.map +1 -1
  414. package/build/dist/UI/Components/AttachmentList/EventAttachmentList.js +9 -4
  415. package/build/dist/UI/Components/AttachmentList/EventAttachmentList.js.map +1 -1
  416. package/build/dist/UI/Components/Dashboard/DashboardVariableControl.js +10 -2
  417. package/build/dist/UI/Components/Dashboard/DashboardVariableControl.js.map +1 -1
  418. package/build/dist/UI/Components/Dropdown/Dropdown.js +5 -1
  419. package/build/dist/UI/Components/Dropdown/Dropdown.js.map +1 -1
  420. package/build/dist/UI/Components/EditionLabel/EditionLabel.js +11 -0
  421. package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
  422. package/build/dist/UI/Components/EventItem/EventItem.js +2 -2
  423. package/build/dist/UI/Components/EventItem/EventItem.js.map +1 -1
  424. package/build/dist/UI/Components/Forms/BasicForm.js +70 -64
  425. package/build/dist/UI/Components/Forms/BasicForm.js.map +1 -1
  426. package/build/dist/UI/Components/Forms/CollapsibleFormSection.js +27 -0
  427. package/build/dist/UI/Components/Forms/CollapsibleFormSection.js.map +1 -0
  428. package/build/dist/UI/Components/Forms/Fields/FormField.js +10 -7
  429. package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
  430. package/build/dist/UI/Components/Forms/FormSummary.js +7 -0
  431. package/build/dist/UI/Components/Forms/FormSummary.js.map +1 -1
  432. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js +2 -1
  433. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js.map +1 -1
  434. package/build/dist/UI/Components/Markdown.tsx/SessionAwareImage.js +84 -0
  435. package/build/dist/UI/Components/Markdown.tsx/SessionAwareImage.js.map +1 -0
  436. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +14 -1
  437. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  438. package/build/dist/UI/Components/ModelTable/TableView.js +1 -1
  439. package/build/dist/UI/Components/ModelTable/TableView.js.map +1 -1
  440. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js +8 -1
  441. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js.map +1 -1
  442. package/build/dist/UI/Components/Tooltip/Tooltip.js +2 -1
  443. package/build/dist/UI/Components/Tooltip/Tooltip.js.map +1 -1
  444. package/build/dist/UI/Utils/API/API.js +143 -19
  445. package/build/dist/UI/Utils/API/API.js.map +1 -1
  446. package/build/dist/UI/Utils/AnalyticsModelAPI/AnalyticsModelAPI.js +21 -7
  447. package/build/dist/UI/Utils/AnalyticsModelAPI/AnalyticsModelAPI.js.map +1 -1
  448. package/build/dist/UI/Utils/ModelAPI/ModelAPI.js +26 -9
  449. package/build/dist/UI/Utils/ModelAPI/ModelAPI.js.map +1 -1
  450. package/build/dist/UI/Utils/Navigation.js +8 -0
  451. package/build/dist/UI/Utils/Navigation.js.map +1 -1
  452. package/build/dist/UI/Utils/OpenAuthenticatedUrl.js +92 -0
  453. package/build/dist/UI/Utils/OpenAuthenticatedUrl.js.map +1 -0
  454. package/build/dist/UI/Utils/Realtime.js +120 -15
  455. package/build/dist/UI/Utils/Realtime.js.map +1 -1
  456. package/build/dist/Utils/API.js +13 -5
  457. package/build/dist/Utils/API.js.map +1 -1
  458. package/build/dist/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.js +123 -6
  459. package/build/dist/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.js.map +1 -1
  460. package/build/dist/Utils/SecurityEvent/Sigma/SigmaRuleParser.js +4 -18
  461. package/build/dist/Utils/SecurityEvent/Sigma/SigmaRuleParser.js.map +1 -1
  462. package/build/dist/Utils/Slo/SloBurnRateTemplate.js +2 -2
  463. package/package.json +1 -1
@@ -0,0 +1,616 @@
1
+ import Alert from "../../../../Models/DatabaseModels/Alert";
2
+ import Incident from "../../../../Models/DatabaseModels/Incident";
3
+ import Monitor from "../../../../Models/DatabaseModels/Monitor";
4
+ import AlertService from "../../../../Server/Services/AlertService";
5
+ import AlertStateTimelineService from "../../../../Server/Services/AlertStateTimelineService";
6
+ import HostService from "../../../../Server/Services/HostService";
7
+ import IncidentService from "../../../../Server/Services/IncidentService";
8
+ import IncidentStateTimelineService from "../../../../Server/Services/IncidentStateTimelineService";
9
+ import NetworkDeviceOwnerUserService from "../../../../Server/Services/NetworkDeviceOwnerUserService";
10
+ import ProjectScopedReferenceValidator from "../../../../Server/Utils/Database/ProjectScopedReferenceValidator";
11
+ import MonitorAlert from "../../../../Server/Utils/Monitor/MonitorAlert";
12
+ import MonitorIncident from "../../../../Server/Utils/Monitor/MonitorIncident";
13
+ import MonitorResourceContextUtil from "../../../../Server/Utils/Monitor/MonitorResourceContext";
14
+ import OneUptimeDate from "../../../../Types/Date";
15
+ import Dictionary from "../../../../Types/Dictionary";
16
+ import { JSONObject } from "../../../../Types/JSON";
17
+ import MonitorCriteriaInstance from "../../../../Types/Monitor/MonitorCriteriaInstance";
18
+ import MonitorEvaluationSummary, {
19
+ MonitorEvaluationEvent,
20
+ } from "../../../../Types/Monitor/MonitorEvaluationSummary";
21
+ import MonitorSummarySnapshot, {
22
+ MonitorSummarySnapshotSource,
23
+ MonitorSummarySnapshotVersion,
24
+ } from "../../../../Types/Monitor/MonitorSummarySnapshot";
25
+ import MonitorType from "../../../../Types/Monitor/MonitorType";
26
+ import ObjectID from "../../../../Types/ObjectID";
27
+ import { PerSeriesCriteriaMatch } from "../../../../Types/Probe/ProbeApiIngestResponse";
28
+ import ProbeMonitorResponse from "../../../../Types/Probe/ProbeMonitorResponse";
29
+ import MonitorSummarySnapshotUtil from "../../../../Utils/Monitor/MonitorSummarySnapshotUtil";
30
+ import {
31
+ afterEach,
32
+ beforeEach,
33
+ describe,
34
+ expect,
35
+ it,
36
+ jest,
37
+ } from "@jest/globals";
38
+
39
+ /*
40
+ * The real creators import the template sandbox, but these fixtures do not
41
+ * execute JavaScript templates or need the native isolated-vm addon.
42
+ */
43
+ jest.mock("isolated-vm", () => {
44
+ return {};
45
+ });
46
+
47
+ type EntityKind = "alert" | "incident";
48
+ type Entity = Alert | Incident;
49
+
50
+ const ENTITY_KINDS: Array<EntityKind> = ["alert", "incident"];
51
+
52
+ const PROJECT_ID: ObjectID = new ObjectID(
53
+ "11111111-1111-4111-8111-111111111111",
54
+ );
55
+ const MONITOR_ID: ObjectID = new ObjectID(
56
+ "22222222-2222-4222-8222-222222222222",
57
+ );
58
+ const SEVERITY_ID: ObjectID = new ObjectID(
59
+ "33333333-3333-4333-8333-333333333333",
60
+ );
61
+ const OWNER_ID: ObjectID = new ObjectID("44444444-4444-4444-8444-444444444444");
62
+ const RESOLVED_STATE_ID: ObjectID = new ObjectID(
63
+ "55555555-5555-4555-8555-555555555555",
64
+ );
65
+ const FIRST_CREATED_AT: Date = new Date("2026-09-17T14:20:00.000Z");
66
+ const SECOND_CREATED_AT: Date = new Date("2026-09-18T08:45:00.000Z");
67
+ const CHECK_AT: Date = new Date("2026-09-18T10:32:00.000Z");
68
+ const NEXT_CHECK_AT: Date = new Date("2026-09-18T10:37:00.000Z");
69
+ const DATABASE_CREATED_AT: Date = new Date("2026-09-18T10:32:03.000Z");
70
+ const AFTER_OWNERS_AT: Date = new Date("2026-09-18T10:32:30.000Z");
71
+ const CRITERIA_ID: string = "criteria-high-cpu";
72
+ const TEMPLATE_ID: string = "template-high-cpu";
73
+
74
+ function monitor(): Monitor {
75
+ const model: Monitor = new Monitor();
76
+ model._id = MONITOR_ID.toString();
77
+ model.projectId = PROJECT_ID;
78
+ model.monitorType = MonitorType.Metrics;
79
+ model.name = "CPU by host";
80
+ return model;
81
+ }
82
+
83
+ function criteria(): MonitorCriteriaInstance {
84
+ const instance: MonitorCriteriaInstance = new MonitorCriteriaInstance();
85
+ instance.data!.id = CRITERIA_ID;
86
+ instance.data!.name = "CPU above threshold";
87
+ instance.data!.createAlerts = true;
88
+ instance.data!.createIncidents = true;
89
+ instance.data!.alerts = [
90
+ {
91
+ id: TEMPLATE_ID,
92
+ title: "High CPU",
93
+ description: "CPU is above the threshold.",
94
+ alertSeverityId: SEVERITY_ID,
95
+ autoResolveAlert: false,
96
+ ownerUserIds: [OWNER_ID],
97
+ },
98
+ ];
99
+ instance.data!.incidents = [
100
+ {
101
+ id: TEMPLATE_ID,
102
+ title: "High CPU",
103
+ description: "CPU is above the threshold.",
104
+ incidentSeverityId: SEVERITY_ID,
105
+ autoResolveIncident: false,
106
+ ownerUserIds: [OWNER_ID],
107
+ },
108
+ ];
109
+ return instance;
110
+ }
111
+
112
+ function openEntity(input: {
113
+ kind: EntityKind;
114
+ id: string;
115
+ createdAt?: Date | undefined;
116
+ fingerprint?: string | undefined;
117
+ criteriaId?: string | undefined;
118
+ templateId?: string | undefined;
119
+ }): Entity {
120
+ const entity: Entity = input.kind === "alert" ? new Alert() : new Incident();
121
+ entity._id = input.id;
122
+ entity.projectId = PROJECT_ID;
123
+ entity.title = "High CPU on an existing host";
124
+ if (input.createdAt !== undefined) {
125
+ entity.createdAt = input.createdAt;
126
+ } else {
127
+ delete entity.createdAt;
128
+ }
129
+ entity.createdCriteriaId = input.criteriaId || CRITERIA_ID;
130
+ if (input.fingerprint !== undefined) {
131
+ entity.seriesFingerprint = input.fingerprint;
132
+ }
133
+ if (entity instanceof Alert) {
134
+ entity.alertNumber = 372;
135
+ entity.alertNumberWithPrefix = "ALT-372";
136
+ } else {
137
+ entity.createdIncidentTemplateId = input.templateId || TEMPLATE_ID;
138
+ entity.incidentNumber = 372;
139
+ entity.incidentNumberWithPrefix = "INC-372";
140
+ }
141
+ return entity;
142
+ }
143
+
144
+ function series(fingerprint: string): PerSeriesCriteriaMatch {
145
+ return {
146
+ criteriaMetId: CRITERIA_ID,
147
+ fingerprint,
148
+ labels: { "host.name": fingerprint },
149
+ rootCause: `High CPU on ${fingerprint}`,
150
+ };
151
+ }
152
+
153
+ function summary(): MonitorEvaluationSummary {
154
+ return {
155
+ evaluatedAt: CHECK_AT,
156
+ criteriaResults: [],
157
+ events: [],
158
+ };
159
+ }
160
+
161
+ function relatedCreatedAt(
162
+ kind: EntityKind,
163
+ event: MonitorEvaluationEvent,
164
+ ): Date | undefined {
165
+ return kind === "alert"
166
+ ? event.relatedAlertCreatedAt
167
+ : event.relatedIncidentCreatedAt;
168
+ }
169
+
170
+ function relatedId(
171
+ kind: EntityKind,
172
+ event: MonitorEvaluationEvent,
173
+ ): string | undefined {
174
+ return kind === "alert" ? event.relatedAlertId : event.relatedIncidentId;
175
+ }
176
+
177
+ const DATA_TO_PROCESS: ProbeMonitorResponse = {
178
+ projectId: PROJECT_ID,
179
+ monitorId: MONITOR_ID,
180
+ monitoredAt: CHECK_AT,
181
+ } as unknown as ProbeMonitorResponse;
182
+
183
+ describe.each(ENTITY_KINDS)(
184
+ "Monitor summary %s action timestamps",
185
+ (kind: EntityKind) => {
186
+ let openEntities: Array<Entity> = [];
187
+ let createdEntities: Array<Entity> = [];
188
+ let currentDate: Date = CHECK_AT;
189
+ let databaseCreatedAt: Date | undefined = DATABASE_CREATED_AT;
190
+ let seriesCreatedAt: Dictionary<Date> = {};
191
+
192
+ async function evaluate(
193
+ input: {
194
+ matchesPerSeries?: Array<PerSeriesCriteriaMatch> | undefined;
195
+ suppliedOpenEntities?: Array<Entity> | undefined;
196
+ evaluationSummary?: MonitorEvaluationSummary | undefined;
197
+ monitorSummary?: MonitorSummarySnapshot | undefined;
198
+ suppressedSeriesFingerprints?: Set<string> | undefined;
199
+ } = {},
200
+ ): Promise<MonitorEvaluationSummary> {
201
+ const evaluationSummary: MonitorEvaluationSummary =
202
+ input.evaluationSummary || summary();
203
+ const commonInput: {
204
+ criteriaInstance: MonitorCriteriaInstance;
205
+ monitor: Monitor;
206
+ dataToProcess: ProbeMonitorResponse;
207
+ rootCause: string;
208
+ evaluationSummary: MonitorEvaluationSummary;
209
+ monitorSummary?: MonitorSummarySnapshot | undefined;
210
+ matchesPerSeries?: Array<PerSeriesCriteriaMatch> | undefined;
211
+ suppressedSeriesFingerprints?: Set<string> | undefined;
212
+ props: Record<string, never>;
213
+ } = {
214
+ criteriaInstance: criteria(),
215
+ monitor: monitor(),
216
+ dataToProcess: DATA_TO_PROCESS,
217
+ rootCause: "CPU is above the threshold",
218
+ evaluationSummary,
219
+ monitorSummary: input.monitorSummary,
220
+ matchesPerSeries: input.matchesPerSeries,
221
+ suppressedSeriesFingerprints: input.suppressedSeriesFingerprints,
222
+ props: {},
223
+ };
224
+
225
+ if (kind === "alert") {
226
+ await MonitorAlert.criteriaMetCreateAlertsAndUpdateMonitorStatus({
227
+ ...commonInput,
228
+ autoResolveCriteriaInstanceIdAlertIdsDictionary: {},
229
+ openAlerts: input.suppliedOpenEntities as Array<Alert> | undefined,
230
+ });
231
+ } else {
232
+ await MonitorIncident.criteriaMetCreateIncidentsAndUpdateMonitorStatus({
233
+ ...commonInput,
234
+ autoResolveCriteriaInstanceIdIncidentIdsDictionary: {},
235
+ openIncidents: input.suppliedOpenEntities as
236
+ | Array<Incident>
237
+ | undefined,
238
+ });
239
+ }
240
+
241
+ return evaluationSummary;
242
+ }
243
+
244
+ function recordCreation(entity: Entity): void {
245
+ entity._id = `created-${createdEntities.length + 1}`;
246
+ const createdAt: Date | undefined =
247
+ seriesCreatedAt[entity.seriesFingerprint || ""] || databaseCreatedAt;
248
+ if (createdAt !== undefined) {
249
+ entity.createdAt = createdAt;
250
+ } else {
251
+ delete entity.createdAt;
252
+ }
253
+ createdEntities.push(entity);
254
+ }
255
+
256
+ beforeEach(() => {
257
+ openEntities = [];
258
+ createdEntities = [];
259
+ currentDate = CHECK_AT;
260
+ databaseCreatedAt = DATABASE_CREATED_AT;
261
+ seriesCreatedAt = {};
262
+
263
+ jest.spyOn(OneUptimeDate, "getCurrentDate").mockImplementation(() => {
264
+ return currentDate;
265
+ });
266
+ jest.spyOn(AlertService, "findBy").mockImplementation(async () => {
267
+ return openEntities as Array<Alert>;
268
+ });
269
+ jest.spyOn(IncidentService, "findBy").mockImplementation(async () => {
270
+ return openEntities as Array<Incident>;
271
+ });
272
+ jest
273
+ .spyOn(ProjectScopedReferenceValidator, "isUsableInProject")
274
+ .mockResolvedValue(true);
275
+ jest
276
+ .spyOn(MonitorResourceContextUtil, "resolveResourceContextForMonitor")
277
+ .mockResolvedValue({
278
+ hostIds: [],
279
+ dockerHostIds: [],
280
+ podmanHostIds: [],
281
+ kubernetesClusterIds: [],
282
+ serviceIds: [],
283
+ proxmoxClusterIds: [],
284
+ vmwareVCenterIds: [],
285
+ cephClusterIds: [],
286
+ dockerSwarmClusterIds: [],
287
+ iotFleetIds: [],
288
+ });
289
+ jest.spyOn(HostService, "findBy").mockResolvedValue([]);
290
+ jest
291
+ .spyOn(NetworkDeviceOwnerUserService, "getDeviceOwnersForMonitor")
292
+ .mockResolvedValue({ ownerUserIds: [], ownerTeamIds: [] });
293
+ jest
294
+ .spyOn(AlertService, "create")
295
+ .mockImplementation(async (createBy: unknown): Promise<Alert> => {
296
+ const entity: Alert = (createBy as { data: Alert }).data;
297
+ recordCreation(entity);
298
+ return entity;
299
+ });
300
+ jest
301
+ .spyOn(IncidentService, "create")
302
+ .mockImplementation(async (createBy: unknown): Promise<Incident> => {
303
+ const entity: Incident = (createBy as { data: Incident }).data;
304
+ recordCreation(entity);
305
+ return entity;
306
+ });
307
+ /*
308
+ * Owner assignment happens after persistence. Its completion time is
309
+ * deliberately later than the database's createdAt timestamp.
310
+ */
311
+ jest.spyOn(AlertService, "addOwners").mockImplementation(async () => {
312
+ currentDate = AFTER_OWNERS_AT;
313
+ });
314
+ jest.spyOn(IncidentService, "addOwners").mockImplementation(async () => {
315
+ currentDate = AFTER_OWNERS_AT;
316
+ });
317
+ jest
318
+ .spyOn(AlertStateTimelineService, "getResolvedStateIdForProject")
319
+ .mockResolvedValue(RESOLVED_STATE_ID);
320
+ jest
321
+ .spyOn(IncidentStateTimelineService, "getResolvedStateIdForProject")
322
+ .mockResolvedValue(RESOLVED_STATE_ID);
323
+ jest
324
+ .spyOn(AlertStateTimelineService, "create")
325
+ .mockResolvedValue(undefined as never);
326
+ jest
327
+ .spyOn(IncidentStateTimelineService, "create")
328
+ .mockResolvedValue(undefined as never);
329
+ });
330
+
331
+ afterEach(() => {
332
+ jest.restoreAllMocks();
333
+ });
334
+
335
+ it("selects the persisted creation date when loading active records", async () => {
336
+ openEntities = [
337
+ openEntity({ kind, id: "active", createdAt: FIRST_CREATED_AT }),
338
+ ];
339
+
340
+ const result: MonitorEvaluationSummary = await evaluate();
341
+
342
+ expect(
343
+ kind === "alert" ? AlertService.findBy : IncidentService.findBy,
344
+ ).toHaveBeenCalledWith(
345
+ expect.objectContaining({
346
+ select: expect.objectContaining({ createdAt: true }),
347
+ }),
348
+ );
349
+ expect(result.events).toHaveLength(1);
350
+ expect(result.events[0]!.type).toBe(`${kind}-skipped`);
351
+ expect(relatedId(kind, result.events[0]!)).toBe("active");
352
+ expect(relatedCreatedAt(kind, result.events[0]!)).toEqual(
353
+ FIRST_CREATED_AT,
354
+ );
355
+ expect(result.events[0]!.at).toEqual(CHECK_AT);
356
+ expect(createdEntities).toHaveLength(0);
357
+ });
358
+
359
+ it("keeps each series' own creation date when open records arrive in a different order", async () => {
360
+ openEntities = [
361
+ openEntity({
362
+ kind,
363
+ id: "other-criteria",
364
+ fingerprint: "host-a",
365
+ criteriaId: "other",
366
+ createdAt: CHECK_AT,
367
+ }),
368
+ openEntity({
369
+ kind,
370
+ id: "active-b",
371
+ fingerprint: "host-b",
372
+ createdAt: SECOND_CREATED_AT,
373
+ }),
374
+ openEntity({
375
+ kind,
376
+ id: "active-a",
377
+ fingerprint: "host-a",
378
+ createdAt: FIRST_CREATED_AT,
379
+ }),
380
+ ];
381
+
382
+ const result: MonitorEvaluationSummary = await evaluate({
383
+ matchesPerSeries: [series("host-a"), series("host-b")],
384
+ });
385
+
386
+ expect(result.events).toHaveLength(2);
387
+ expect(
388
+ result.events.map((event: MonitorEvaluationEvent) => {
389
+ return [
390
+ relatedId(kind, event),
391
+ relatedCreatedAt(kind, event),
392
+ event.at,
393
+ ];
394
+ }),
395
+ ).toEqual([
396
+ ["active-a", FIRST_CREATED_AT, CHECK_AT],
397
+ ["active-b", SECOND_CREATED_AT, CHECK_AT],
398
+ ]);
399
+ expect(createdEntities).toHaveLength(0);
400
+ });
401
+
402
+ it("keeps creation dates stable across repeated monitor checks", async () => {
403
+ openEntities = [
404
+ openEntity({ kind, id: "active", createdAt: FIRST_CREATED_AT }),
405
+ ];
406
+
407
+ const first: MonitorEvaluationSummary = await evaluate();
408
+ currentDate = NEXT_CHECK_AT;
409
+ const second: MonitorEvaluationSummary = await evaluate();
410
+
411
+ expect(first.events[0]!.at).toEqual(CHECK_AT);
412
+ expect(second.events[0]!.at).toEqual(NEXT_CHECK_AT);
413
+ expect(relatedCreatedAt(kind, first.events[0]!)).toEqual(
414
+ FIRST_CREATED_AT,
415
+ );
416
+ expect(relatedCreatedAt(kind, second.events[0]!)).toEqual(
417
+ FIRST_CREATED_AT,
418
+ );
419
+ expect(createdEntities).toHaveLength(0);
420
+ });
421
+
422
+ it("uses the creation date from the caller's previously loaded active records", async () => {
423
+ const result: MonitorEvaluationSummary = await evaluate({
424
+ suppliedOpenEntities: [
425
+ openEntity({ kind, id: "supplied", createdAt: SECOND_CREATED_AT }),
426
+ ],
427
+ });
428
+
429
+ expect(AlertService.findBy).not.toHaveBeenCalled();
430
+ expect(IncidentService.findBy).not.toHaveBeenCalled();
431
+ expect(relatedId(kind, result.events[0]!)).toBe("supplied");
432
+ expect(relatedCreatedAt(kind, result.events[0]!)).toEqual(
433
+ SECOND_CREATED_AT,
434
+ );
435
+ expect(result.events[0]!.at).toEqual(CHECK_AT);
436
+ });
437
+
438
+ it("does not invent a creation date for an active record whose date is unavailable", async () => {
439
+ openEntities = [openEntity({ kind, id: "legacy-active" })];
440
+
441
+ const result: MonitorEvaluationSummary = await evaluate();
442
+
443
+ expect(result.events).toHaveLength(1);
444
+ expect(result.events[0]!.type).toBe(`${kind}-skipped`);
445
+ expect(relatedCreatedAt(kind, result.events[0]!)).toBeUndefined();
446
+ expect(result.events[0]!.at).toEqual(CHECK_AT);
447
+ expect(createdEntities).toHaveLength(0);
448
+ });
449
+
450
+ it("timestamps new creation with the database date even when owner assignment finishes later", async () => {
451
+ const result: MonitorEvaluationSummary = await evaluate();
452
+
453
+ expect(
454
+ kind === "alert" ? AlertService.addOwners : IncidentService.addOwners,
455
+ ).toHaveBeenCalledTimes(1);
456
+ expect(currentDate).toEqual(AFTER_OWNERS_AT);
457
+ expect(result.events).toHaveLength(1);
458
+ expect(result.events[0]!.type).toBe(`${kind}-created`);
459
+ expect(result.events[0]!.at).toEqual(DATABASE_CREATED_AT);
460
+ expect(result.events[0]!.at).not.toEqual(CHECK_AT);
461
+ expect(result.events[0]!.at).not.toEqual(AFTER_OWNERS_AT);
462
+ });
463
+
464
+ it("falls back to the current action time when creation returns no database date", async () => {
465
+ databaseCreatedAt = undefined;
466
+
467
+ const result: MonitorEvaluationSummary = await evaluate();
468
+
469
+ expect(result.events).toHaveLength(1);
470
+ expect(result.events[0]!.type).toBe(`${kind}-created`);
471
+ expect(result.events[0]!.at).toEqual(AFTER_OWNERS_AT);
472
+ });
473
+
474
+ it("uses each new series' database timestamp independently", async () => {
475
+ const secondDatabaseDate: Date = new Date("2026-09-18T10:32:35.000Z");
476
+ seriesCreatedAt = {
477
+ "host-a": DATABASE_CREATED_AT,
478
+ "host-b": secondDatabaseDate,
479
+ };
480
+
481
+ const result: MonitorEvaluationSummary = await evaluate({
482
+ matchesPerSeries: [series("host-a"), series("host-b")],
483
+ });
484
+
485
+ expect(createdEntities).toHaveLength(2);
486
+ expect(
487
+ result.events.map((event: MonitorEvaluationEvent) => {
488
+ return [event.type, event.at];
489
+ }),
490
+ ).toEqual([
491
+ [`${kind}-created`, DATABASE_CREATED_AT],
492
+ [`${kind}-created`, secondDatabaseDate],
493
+ ]);
494
+ });
495
+
496
+ it("leaves scheduled-maintenance skips at the evaluation time without a related creation date", async () => {
497
+ const result: MonitorEvaluationSummary = await evaluate({
498
+ matchesPerSeries: [series("host-a")],
499
+ suppressedSeriesFingerprints: new Set<string>(["host-a"]),
500
+ });
501
+
502
+ expect(result.events).toHaveLength(1);
503
+ expect(result.events[0]!.type).toBe(`${kind}-skipped`);
504
+ expect(result.events[0]!.at).toEqual(CHECK_AT);
505
+ expect(relatedCreatedAt(kind, result.events[0]!)).toBeUndefined();
506
+ expect(relatedId(kind, result.events[0]!)).toBeUndefined();
507
+ expect(createdEntities).toHaveLength(0);
508
+ });
509
+
510
+ it("timestamps resolution at recovery rather than at the record's creation", async () => {
511
+ openEntities = [
512
+ openEntity({ kind, id: "recovering", createdAt: FIRST_CREATED_AT }),
513
+ ];
514
+ const evaluationSummary: MonitorEvaluationSummary = summary();
515
+ const commonInput: {
516
+ monitorId: ObjectID;
517
+ rootCause: string;
518
+ criteriaInstance: null;
519
+ dataToProcess: ProbeMonitorResponse;
520
+ evaluationSummary: MonitorEvaluationSummary;
521
+ } = {
522
+ monitorId: MONITOR_ID,
523
+ rootCause: "CPU recovered",
524
+ criteriaInstance: null,
525
+ dataToProcess: DATA_TO_PROCESS,
526
+ evaluationSummary,
527
+ };
528
+ if (kind === "alert") {
529
+ await MonitorAlert.checkOpenAlertsAndCloseIfResolved({
530
+ ...commonInput,
531
+ autoResolveCriteriaInstanceIdAlertIdsDictionary: {
532
+ [CRITERIA_ID]: [TEMPLATE_ID],
533
+ },
534
+ });
535
+ } else {
536
+ await MonitorIncident.checkOpenIncidentsAndCloseIfResolved({
537
+ ...commonInput,
538
+ autoResolveCriteriaInstanceIdIncidentIdsDictionary: {
539
+ [CRITERIA_ID]: [TEMPLATE_ID],
540
+ },
541
+ });
542
+ }
543
+
544
+ expect(evaluationSummary.events).toHaveLength(1);
545
+ expect(evaluationSummary.events[0]!.type).toBe(`${kind}-resolved`);
546
+ expect(evaluationSummary.events[0]!.at).toEqual(CHECK_AT);
547
+ expect(
548
+ relatedCreatedAt(kind, evaluationSummary.events[0]!),
549
+ ).toBeUndefined();
550
+ });
551
+
552
+ it("persists an already-active entity's creation date in the summary captured on a newly created entity", async () => {
553
+ openEntities = [
554
+ openEntity({
555
+ kind,
556
+ id: "active-a",
557
+ fingerprint: "host-a",
558
+ createdAt: FIRST_CREATED_AT,
559
+ }),
560
+ ];
561
+ const evaluationSummary: MonitorEvaluationSummary = summary();
562
+ const monitorSummary: MonitorSummarySnapshot = {
563
+ version: MonitorSummarySnapshotVersion,
564
+ source: MonitorSummarySnapshotSource.Captured,
565
+ monitorType: MonitorType.Metrics,
566
+ capturedAt: CHECK_AT,
567
+ evaluationSummary,
568
+ };
569
+
570
+ await evaluate({
571
+ matchesPerSeries: [series("host-a"), series("host-b")],
572
+ evaluationSummary,
573
+ monitorSummary,
574
+ });
575
+
576
+ expect(createdEntities).toHaveLength(1);
577
+ const stored: JSONObject = JSON.parse(
578
+ JSON.stringify(createdEntities[0]!.monitorSummary),
579
+ ) as JSONObject;
580
+ const restored: MonitorSummarySnapshot | null =
581
+ MonitorSummarySnapshotUtil.deserialize(stored);
582
+ const restoredEvent: MonitorEvaluationEvent =
583
+ restored!.evaluationSummary!.events[0]!;
584
+
585
+ expect(restoredEvent.type).toBe(`${kind}-skipped`);
586
+ expect(relatedId(kind, restoredEvent)).toBe("active-a");
587
+ expect(relatedCreatedAt(kind, restoredEvent)).toBeInstanceOf(Date);
588
+ expect(relatedCreatedAt(kind, restoredEvent)).toEqual(FIRST_CREATED_AT);
589
+ expect(restoredEvent.at).toBeInstanceOf(Date);
590
+ expect(restoredEvent.at).toEqual(CHECK_AT);
591
+ expect(
592
+ MonitorSummarySnapshotUtil.toSummaryInfoProps(restored!)
593
+ .evaluationSummary!.events[0],
594
+ ).toEqual(restoredEvent);
595
+ });
596
+
597
+ it("preserves both distinct timestamps in plain JSON monitor logs", async () => {
598
+ openEntities = [
599
+ openEntity({ kind, id: "active", createdAt: FIRST_CREATED_AT }),
600
+ ];
601
+ const result: MonitorEvaluationSummary = await evaluate();
602
+ const stored: { events: Array<Record<string, string>> } = JSON.parse(
603
+ JSON.stringify(result),
604
+ ) as { events: Array<Record<string, string>> };
605
+
606
+ expect(
607
+ stored.events[0]![
608
+ kind === "alert"
609
+ ? "relatedAlertCreatedAt"
610
+ : "relatedIncidentCreatedAt"
611
+ ],
612
+ ).toBe(FIRST_CREATED_AT.toISOString());
613
+ expect(stored.events[0]!["at"]).toBe(CHECK_AT.toISOString());
614
+ });
615
+ },
616
+ );