@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,589 @@
1
+ import OneUptimeDate from "../Date";
2
+ import moment from "moment-timezone";
3
+
4
+ /*
5
+ * The geometry of the schedule timeline, kept free of React so every rule
6
+ * that decides WHERE something is drawn is unit-tested on its own.
7
+ *
8
+ * Two ideas carry the whole file:
9
+ *
10
+ * 1. Days are computed in the VIEW timezone, never the browser's. A week is
11
+ * Monday 00:00 to the next Monday 00:00 on the wall clock of the zone the
12
+ * reader picked, so "Tuesday" means the same thing in the header and in
13
+ * the tooltip, whatever machine the page is open on.
14
+ *
15
+ * 2. Positions are in COLUMN space, not in raw time. Every day column has the
16
+ * same width, but a DST day lasts 23 or 25 hours, so a bar positioned by
17
+ * (t - rangeStart) / rangeLength would drift off its column by up to an
18
+ * hour across a clock change. Instead an instant is placed in the column
19
+ * of its day, at the fraction of that day that has elapsed, and a shift
20
+ * that ends at local midnight always ends exactly on a gridline.
21
+ */
22
+
23
+ export enum TimelineViewMode {
24
+ Week = "week",
25
+ Month = "month",
26
+ }
27
+
28
+ export interface TimelineDay {
29
+ // "YYYY-MM-DD" in the view timezone.
30
+ key: string;
31
+ start: Date;
32
+ end: Date;
33
+ dayOfMonth: number;
34
+ // "Mon"
35
+ weekdayShort: string;
36
+ // "M"
37
+ weekdayNarrow: string;
38
+ // "Sep"
39
+ monthShort: string;
40
+ isWeekend: boolean;
41
+ isFirstOfMonth: boolean;
42
+ }
43
+
44
+ export interface TimelineRange {
45
+ mode: TimelineViewMode;
46
+ timezone: string;
47
+ start: Date;
48
+ end: Date;
49
+ days: Array<TimelineDay>;
50
+ }
51
+
52
+ export interface TimeInterval {
53
+ start: Date;
54
+ end: Date;
55
+ }
56
+
57
+ export interface PositionedInterval<T extends TimeInterval> {
58
+ item: T;
59
+ // Both in percent of the day area (0-100).
60
+ left: number;
61
+ width: number;
62
+ // The interval is cut at the range edge; its true start / end is outside.
63
+ continuesBefore: boolean;
64
+ continuesAfter: boolean;
65
+ }
66
+
67
+ const MILLISECONDS_PER_MINUTE: number = 60 * 1000;
68
+
69
+ const HEX_COLOR_PATTERN: RegExp = /^[0-9a-fA-F]{6}$/;
70
+
71
+ export default class ScheduleTimelineLayout {
72
+ /*
73
+ * The days on screen for `mode` around `anchor`, in `timezone`:
74
+ * Week -> the ISO week (Monday first) containing the anchor;
75
+ * Month -> the calendar month containing the anchor.
76
+ *
77
+ * Days are walked as plain calendar dates and each day's edge is parsed in
78
+ * the zone, rather than by stepping a zoned moment a day at a time. In the
79
+ * zones whose DST gap is AT midnight (America/Santiago, America/Havana,
80
+ * Asia/Beirut, Atlantic/Azores, Africa/Cairo) there is no 00:00 on the
81
+ * change day; stepping a zoned moment lands an hour off and drags the
82
+ * neighbouring day's edge with it, while parsing the date resolves to the
83
+ * first instant that day actually has.
84
+ */
85
+ public static getRange(data: {
86
+ mode: TimelineViewMode;
87
+ anchor: Date;
88
+ timezone: string;
89
+ }): TimelineRange {
90
+ const anchorDate: moment.Moment = ScheduleTimelineLayout.getCalendarDate(
91
+ data.anchor,
92
+ data.timezone,
93
+ );
94
+
95
+ const firstDate: moment.Moment =
96
+ data.mode === TimelineViewMode.Month
97
+ ? anchorDate.clone().startOf("month")
98
+ : anchorDate.clone().startOf("isoWeek");
99
+
100
+ const dayCount: number =
101
+ data.mode === TimelineViewMode.Month ? firstDate.daysInMonth() : 7;
102
+
103
+ const days: Array<TimelineDay> = [];
104
+
105
+ for (let index: number = 0; index < dayCount; index++) {
106
+ const date: moment.Moment = firstDate.clone().add(index, "days");
107
+ const isoWeekday: number = date.isoWeekday();
108
+
109
+ days.push({
110
+ key: date.format("YYYY-MM-DD"),
111
+ start: ScheduleTimelineLayout.getStartOfLocalDay(date, data.timezone),
112
+ end: ScheduleTimelineLayout.getStartOfLocalDay(
113
+ date.clone().add(1, "day"),
114
+ data.timezone,
115
+ ),
116
+ dayOfMonth: date.date(),
117
+ weekdayShort: date.format("ddd"),
118
+ weekdayNarrow: date.format("dd").charAt(0),
119
+ monthShort: date.format("MMM"),
120
+ isWeekend: isoWeekday === 6 || isoWeekday === 7,
121
+ isFirstOfMonth: date.date() === 1,
122
+ });
123
+ }
124
+
125
+ return {
126
+ mode: data.mode,
127
+ timezone: data.timezone,
128
+ start: days[0]!.start,
129
+ end: days[days.length - 1]!.end,
130
+ days,
131
+ };
132
+ }
133
+
134
+ /*
135
+ * An anchor inside the week / month before or after: local noon of that
136
+ * period's first day. Noon rather than midnight, so no anchor ever sits on
137
+ * an edge that a DST change or a later zone switch could move.
138
+ */
139
+ public static shiftAnchor(data: {
140
+ mode: TimelineViewMode;
141
+ anchor: Date;
142
+ timezone: string;
143
+ direction: 1 | -1;
144
+ }): Date {
145
+ const anchorDate: moment.Moment = ScheduleTimelineLayout.getCalendarDate(
146
+ data.anchor,
147
+ data.timezone,
148
+ );
149
+
150
+ const target: moment.Moment =
151
+ data.mode === TimelineViewMode.Month
152
+ ? anchorDate.clone().startOf("month").add(data.direction, "month")
153
+ : anchorDate
154
+ .clone()
155
+ .startOf("isoWeek")
156
+ .add(data.direction * 7, "days");
157
+
158
+ return moment
159
+ .tz(
160
+ `${target.format("YYYY-MM-DD")} 12:00`,
161
+ "YYYY-MM-DD HH:mm",
162
+ data.timezone,
163
+ )
164
+ .toDate();
165
+ }
166
+
167
+ /*
168
+ * The same wall-clock moment in another zone. Used when the reader changes
169
+ * the view zone, so the dates on screen stay the dates on screen: the same
170
+ * INSTANT would fall on the previous day in any zone west of the old one
171
+ * and quietly page the view back a week or a month.
172
+ */
173
+ public static moveAnchorToTimezone(data: {
174
+ anchor: Date;
175
+ fromTimezone: string;
176
+ toTimezone: string;
177
+ }): Date {
178
+ const wallClock: string = moment
179
+ .tz(data.anchor, data.fromTimezone)
180
+ .format("YYYY-MM-DDTHH:mm:ss");
181
+
182
+ return moment
183
+ .tz(wallClock, "YYYY-MM-DDTHH:mm:ss", data.toTimezone)
184
+ .toDate();
185
+ }
186
+
187
+ // The calendar date of `date` in `timezone`, as a zone-free UTC moment.
188
+ private static getCalendarDate(date: Date, timezone: string): moment.Moment {
189
+ return moment.utc(
190
+ moment.tz(date, timezone).format("YYYY-MM-DD"),
191
+ "YYYY-MM-DD",
192
+ );
193
+ }
194
+
195
+ // The first instant of a calendar date in `timezone` (DST-gap safe).
196
+ private static getStartOfLocalDay(
197
+ calendarDate: moment.Moment,
198
+ timezone: string,
199
+ ): Date {
200
+ return moment
201
+ .tz(calendarDate.format("YYYY-MM-DD"), "YYYY-MM-DD", timezone)
202
+ .toDate();
203
+ }
204
+
205
+ /*
206
+ * "September 14 – 20, 2026", "Sep 28 – Oct 4, 2026",
207
+ * "Dec 28, 2026 – Jan 3, 2027" or "September 2026".
208
+ */
209
+ public static getRangeLabel(range: TimelineRange): string {
210
+ const first: moment.Moment = moment.tz(range.start, range.timezone);
211
+
212
+ if (range.mode === TimelineViewMode.Month) {
213
+ return first.format("MMMM YYYY");
214
+ }
215
+
216
+ const lastDay: TimelineDay | undefined = range.days[range.days.length - 1];
217
+ const last: moment.Moment = moment.tz(
218
+ lastDay ? lastDay.start : range.start,
219
+ range.timezone,
220
+ );
221
+
222
+ if (first.year() !== last.year()) {
223
+ return `${first.format("MMM D, YYYY")} – ${last.format("MMM D, YYYY")}`;
224
+ }
225
+
226
+ if (first.month() !== last.month()) {
227
+ return `${first.format("MMM D")} – ${last.format("MMM D, YYYY")}`;
228
+ }
229
+
230
+ return `${first.format("MMMM D")} – ${last.format("D, YYYY")}`;
231
+ }
232
+
233
+ // "YYYY-MM-DD" of the day containing `date` in `timezone`.
234
+ public static getDayKey(date: Date, timezone: string): string {
235
+ return moment.tz(date, timezone).format("YYYY-MM-DD");
236
+ }
237
+
238
+ public static isWithinRange(date: Date, range: TimeInterval): boolean {
239
+ return (
240
+ date.getTime() >= range.start.getTime() &&
241
+ date.getTime() < range.end.getTime()
242
+ );
243
+ }
244
+
245
+ /*
246
+ * Where `instant` falls across the day columns, from 0 (the left edge of
247
+ * the first day) to 1 (the right edge of the last). See the file comment
248
+ * for why this is column space rather than raw time.
249
+ */
250
+ public static getFraction(instant: Date, range: TimelineRange): number {
251
+ const days: Array<TimelineDay> = range.days;
252
+
253
+ if (days.length === 0) {
254
+ return 0;
255
+ }
256
+
257
+ const time: number = instant.getTime();
258
+
259
+ if (time <= days[0]!.start.getTime()) {
260
+ return 0;
261
+ }
262
+
263
+ if (time >= days[days.length - 1]!.end.getTime()) {
264
+ return 1;
265
+ }
266
+
267
+ let low: number = 0;
268
+ let high: number = days.length - 1;
269
+
270
+ while (low < high) {
271
+ const mid: number = Math.floor((low + high + 1) / 2);
272
+
273
+ if (days[mid]!.start.getTime() <= time) {
274
+ low = mid;
275
+ } else {
276
+ high = mid - 1;
277
+ }
278
+ }
279
+
280
+ const day: TimelineDay = days[low]!;
281
+ const dayLength: number = day.end.getTime() - day.start.getTime();
282
+ const withinDay: number =
283
+ dayLength > 0 ? (time - day.start.getTime()) / dayLength : 0;
284
+
285
+ return (low + Math.min(1, Math.max(0, withinDay))) / days.length;
286
+ }
287
+
288
+ /*
289
+ * Place intervals on the day area. Anything that does not overlap the
290
+ * range is dropped; anything that runs past an edge is cut there and says
291
+ * so, so the bar can square off that end instead of pretending to start or
292
+ * stop at the edge of the screen.
293
+ */
294
+ public static positionIntervals<T extends TimeInterval>(
295
+ items: Array<T>,
296
+ range: TimelineRange,
297
+ ): Array<PositionedInterval<T>> {
298
+ const out: Array<PositionedInterval<T>> = [];
299
+
300
+ for (const item of items) {
301
+ if (
302
+ item.end.getTime() <= range.start.getTime() ||
303
+ item.start.getTime() >= range.end.getTime()
304
+ ) {
305
+ continue;
306
+ }
307
+
308
+ const left: number =
309
+ ScheduleTimelineLayout.getFraction(item.start, range) * 100;
310
+ const right: number =
311
+ ScheduleTimelineLayout.getFraction(item.end, range) * 100;
312
+
313
+ if (right <= left) {
314
+ continue;
315
+ }
316
+
317
+ out.push({
318
+ item,
319
+ left,
320
+ width: right - left,
321
+ continuesBefore: item.start.getTime() < range.start.getTime(),
322
+ continuesAfter: item.end.getTime() > range.end.getTime(),
323
+ });
324
+ }
325
+
326
+ return out;
327
+ }
328
+
329
+ /*
330
+ * The stretches of [windowStart, windowEnd) that no interval covers,
331
+ * ignoring holes shorter than `minimumGapMs` (the engine's one-second seams
332
+ * and similar slivers would otherwise draw as hairlines). Overlapping and
333
+ * unsorted input is fine.
334
+ */
335
+ public static computeGaps(
336
+ intervals: Array<TimeInterval>,
337
+ windowStart: Date,
338
+ windowEnd: Date,
339
+ minimumGapMs: number = MILLISECONDS_PER_MINUTE,
340
+ ): Array<TimeInterval> {
341
+ const startTime: number = windowStart.getTime();
342
+ const endTime: number = windowEnd.getTime();
343
+
344
+ if (endTime <= startTime) {
345
+ return [];
346
+ }
347
+
348
+ const sorted: Array<TimeInterval> = intervals
349
+ .filter((interval: TimeInterval) => {
350
+ return (
351
+ interval.end.getTime() > startTime &&
352
+ interval.start.getTime() < endTime &&
353
+ interval.end.getTime() > interval.start.getTime()
354
+ );
355
+ })
356
+ .sort((a: TimeInterval, b: TimeInterval) => {
357
+ return a.start.getTime() - b.start.getTime();
358
+ });
359
+
360
+ const gaps: Array<TimeInterval> = [];
361
+ let cursor: number = startTime;
362
+
363
+ const pushGap: (from: number, to: number) => void = (
364
+ from: number,
365
+ to: number,
366
+ ): void => {
367
+ if (to - from >= Math.max(1, minimumGapMs)) {
368
+ gaps.push({ start: new Date(from), end: new Date(to) });
369
+ }
370
+ };
371
+
372
+ for (const interval of sorted) {
373
+ const intervalStart: number = Math.max(
374
+ startTime,
375
+ interval.start.getTime(),
376
+ );
377
+ const intervalEnd: number = Math.min(endTime, interval.end.getTime());
378
+
379
+ if (intervalStart > cursor) {
380
+ pushGap(cursor, intervalStart);
381
+ }
382
+
383
+ cursor = Math.max(cursor, intervalEnd);
384
+ }
385
+
386
+ if (cursor < endTime) {
387
+ pushGap(cursor, endTime);
388
+ }
389
+
390
+ return gaps;
391
+ }
392
+
393
+ // The first interval containing `now`, if any.
394
+ public static findActive<T extends TimeInterval>(
395
+ items: Array<T>,
396
+ now: Date,
397
+ ): T | null {
398
+ for (const item of items) {
399
+ if (
400
+ item.start.getTime() <= now.getTime() &&
401
+ item.end.getTime() > now.getTime()
402
+ ) {
403
+ return item;
404
+ }
405
+ }
406
+
407
+ return null;
408
+ }
409
+
410
+ /*
411
+ * "Mon, Sep 14, 09:00 → Mon, Sep 21, 09:00", or
412
+ * "Mon, Sep 14, 09:00 – 17:00" when both ends are on the same day. The end
413
+ * is exclusive, so a shift ending at midnight reads "→ Tue, 00:00".
414
+ */
415
+ public static formatInterval(data: {
416
+ start: Date;
417
+ end: Date;
418
+ timezone: string;
419
+ use12HourFormat?: boolean | undefined;
420
+ }): string {
421
+ const use12HourFormat: boolean =
422
+ data.use12HourFormat ?? OneUptimeDate.getUserPrefers12HourFormat();
423
+ const timeFormat: string = use12HourFormat ? "h:mm A" : "HH:mm";
424
+ const dateFormat: string = "ddd, MMM D";
425
+
426
+ const start: moment.Moment = moment.tz(data.start, data.timezone);
427
+ const end: moment.Moment = moment.tz(data.end, data.timezone);
428
+
429
+ const startText: string = `${start.format(dateFormat)}, ${start.format(
430
+ timeFormat,
431
+ )}`;
432
+
433
+ if (start.format("YYYY-MM-DD") === end.format("YYYY-MM-DD")) {
434
+ return `${startText} – ${end.format(timeFormat)}`;
435
+ }
436
+
437
+ const sameYear: boolean = start.year() === end.year();
438
+ const endDateFormat: string = sameYear ? dateFormat : "ddd, MMM D, YYYY";
439
+
440
+ return `${startText} → ${end.format(endDateFormat)}, ${end.format(
441
+ timeFormat,
442
+ )}`;
443
+ }
444
+
445
+ // "7d", "3d 12h", "8h", "8h 30m", "45m", "<1m".
446
+ public static formatDuration(milliseconds: number): string {
447
+ if (
448
+ !Number.isFinite(milliseconds) ||
449
+ milliseconds < MILLISECONDS_PER_MINUTE
450
+ ) {
451
+ return "<1m";
452
+ }
453
+
454
+ const totalMinutes: number = Math.round(
455
+ milliseconds / MILLISECONDS_PER_MINUTE,
456
+ );
457
+ const days: number = Math.floor(totalMinutes / (24 * 60));
458
+ const hours: number = Math.floor((totalMinutes % (24 * 60)) / 60);
459
+ const minutes: number = totalMinutes % 60;
460
+
461
+ if (days > 0) {
462
+ return hours > 0 ? `${days}d ${hours}h` : `${days}d`;
463
+ }
464
+
465
+ if (hours > 0) {
466
+ return minutes > 0 ? `${hours}h ${minutes}m` : `${hours}h`;
467
+ }
468
+
469
+ return `${minutes}m`;
470
+ }
471
+
472
+ /*
473
+ * Hours on call inside the window, summed over the intervals (each cut to
474
+ * the window). Overlaps are NOT merged: two schedules at once are two
475
+ * rosters, and the legend reports load, not wall-clock presence.
476
+ */
477
+ public static sumWithin(
478
+ intervals: Array<TimeInterval>,
479
+ window: TimeInterval,
480
+ ): number {
481
+ let total: number = 0;
482
+
483
+ for (const interval of intervals) {
484
+ const start: number = Math.max(
485
+ interval.start.getTime(),
486
+ window.start.getTime(),
487
+ );
488
+ const end: number = Math.min(
489
+ interval.end.getTime(),
490
+ window.end.getTime(),
491
+ );
492
+
493
+ if (end > start) {
494
+ total += end - start;
495
+ }
496
+ }
497
+
498
+ return total;
499
+ }
500
+
501
+ /*
502
+ * Whether the reader may page to the previous / next range: only while
503
+ * part of that range is still inside the window the server can draw.
504
+ */
505
+ public static getNavigability(data: {
506
+ mode: TimelineViewMode;
507
+ anchor: Date;
508
+ timezone: string;
509
+ addressable: TimeInterval;
510
+ }): { canGoBack: boolean; canGoForward: boolean } {
511
+ const previous: TimelineRange = ScheduleTimelineLayout.getRange({
512
+ mode: data.mode,
513
+ timezone: data.timezone,
514
+ anchor: ScheduleTimelineLayout.shiftAnchor({ ...data, direction: -1 }),
515
+ });
516
+
517
+ const next: TimelineRange = ScheduleTimelineLayout.getRange({
518
+ mode: data.mode,
519
+ timezone: data.timezone,
520
+ anchor: ScheduleTimelineLayout.shiftAnchor({ ...data, direction: 1 }),
521
+ });
522
+
523
+ return {
524
+ canGoBack: previous.end.getTime() > data.addressable.start.getTime(),
525
+ canGoForward: next.start.getTime() < data.addressable.end.getTime(),
526
+ };
527
+ }
528
+
529
+ /*
530
+ * `#rrggbb` (or `#rgb`) at `alpha`, as an rgba() string. Anything that is
531
+ * not a hex colour is returned untouched so a bad value degrades to a solid
532
+ * colour rather than to no colour at all.
533
+ */
534
+ public static withAlpha(color: string, alpha: number): string {
535
+ const rgb: [number, number, number] | null =
536
+ ScheduleTimelineLayout.parseHex(color);
537
+
538
+ if (!rgb) {
539
+ return color;
540
+ }
541
+
542
+ const clamped: number = Math.min(1, Math.max(0, alpha));
543
+
544
+ return `rgba(${rgb[0]}, ${rgb[1]}, ${rgb[2]}, ${clamped})`;
545
+ }
546
+
547
+ /*
548
+ * Near-black or white, whichever reads on `color`. The per-user palette
549
+ * runs from black to yellow and lime, so a fixed text colour is unreadable
550
+ * on some avatars.
551
+ */
552
+ public static getContrastTextColor(color: string): string {
553
+ const rgb: [number, number, number] | null =
554
+ ScheduleTimelineLayout.parseHex(color);
555
+
556
+ if (!rgb) {
557
+ return "#ffffff";
558
+ }
559
+
560
+ const luminance: number =
561
+ (0.299 * rgb[0] + 0.587 * rgb[1] + 0.114 * rgb[2]) / 255;
562
+
563
+ return luminance > 0.62 ? "#111827" : "#ffffff";
564
+ }
565
+
566
+ private static parseHex(color: string): [number, number, number] | null {
567
+ const hex: string = color.trim().replace(/^#/, "");
568
+
569
+ const full: string =
570
+ hex.length === 3
571
+ ? hex
572
+ .split("")
573
+ .map((char: string) => {
574
+ return char + char;
575
+ })
576
+ .join("")
577
+ : hex;
578
+
579
+ if (!HEX_COLOR_PATTERN.test(full)) {
580
+ return null;
581
+ }
582
+
583
+ return [
584
+ parseInt(full.slice(0, 2), 16),
585
+ parseInt(full.slice(2, 4), 16),
586
+ parseInt(full.slice(4, 6), 16),
587
+ ];
588
+ }
589
+ }
@@ -1,5 +1,16 @@
1
1
  enum EventName {
2
2
  ListenToModalEvent = "ListenToModelEvent",
3
+
4
+ /*
5
+ * Server -> client. A ListenToModelEvent was refused because the socket's
6
+ * handshake carried no access token, or one that no longer decodes (the
7
+ * dashboard's access token lives 15 minutes; the handshake cookie lives as
8
+ * long as the connection). The payload is the refused ListenToModelEventJSON.
9
+ *
10
+ * The socket can not be re-authenticated in place: the cookie is read from
11
+ * the handshake, so the client has to refresh its session and reconnect.
12
+ */
13
+ AuthenticationRequired = "AuthenticationRequired",
3
14
  }
4
15
 
5
16
  export default EventName;
@@ -33,3 +33,17 @@ export const DETECTION_GROUP_VALUE_ATTRIBUTE: string =
33
33
  "oneuptime.detection.group_value";
34
34
  export const DETECTION_SIGMA_ID_ATTRIBUTE: string =
35
35
  "oneuptime.detection.sigma_id";
36
+
37
+ // Save-time bounds for DetectionRule.evaluationIntervalInMinutes.
38
+ export const DETECTION_EVALUATION_INTERVAL_MIN_IN_MINUTES: number = 1;
39
+ export const DETECTION_EVALUATION_INTERVAL_MAX_IN_MINUTES: number = 1440;
40
+
41
+ /*
42
+ * Cap on how far back one evaluation may scan, whatever lastEvaluatedAt
43
+ * says — a rule re-enabled after a month must not trigger a month-long
44
+ * table scan.
45
+ */
46
+ export const DETECTION_MAX_LOOKBACK_IN_MINUTES: number = 24 * 60;
47
+
48
+ // One alert per distinct group value per cycle, at most.
49
+ export const DETECTION_MAX_GROUPS_PER_EVALUATION: number = 100;
@@ -43,6 +43,36 @@ export function ocsfSeverityFromId(id: number): OcsfSeverity {
43
43
  return OcsfSeverity.Unknown;
44
44
  }
45
45
 
46
+ /*
47
+ * Upper-cased severity text -> OCSF severity. Exported so SQL that grades
48
+ * stored rows (the Google SecOps severity backfill) is generated from this
49
+ * table instead of restating it.
50
+ */
51
+ export const OCSF_SEVERITY_ALIASES: Readonly<Record<string, OcsfSeverity>> = {
52
+ UNKNOWN: OcsfSeverity.Unknown,
53
+ UNKNOWN_SEVERITY: OcsfSeverity.Unknown,
54
+ NONE: OcsfSeverity.Informational,
55
+ INFO: OcsfSeverity.Informational,
56
+ INFORMATION: OcsfSeverity.Informational,
57
+ INFORMATIONAL: OcsfSeverity.Informational,
58
+ NOTICE: OcsfSeverity.Informational,
59
+ DEBUG: OcsfSeverity.Informational,
60
+ LOW: OcsfSeverity.Low,
61
+ WARN: OcsfSeverity.Low,
62
+ WARNING: OcsfSeverity.Low,
63
+ MEDIUM: OcsfSeverity.Medium,
64
+ MODERATE: OcsfSeverity.Medium,
65
+ ERR: OcsfSeverity.Medium,
66
+ ERROR: OcsfSeverity.Medium,
67
+ HIGH: OcsfSeverity.High,
68
+ SEVERE: OcsfSeverity.High,
69
+ CRITICAL: OcsfSeverity.Critical,
70
+ CRIT: OcsfSeverity.Critical,
71
+ ALERT: OcsfSeverity.Critical,
72
+ FATAL: OcsfSeverity.Fatal,
73
+ EMERGENCY: OcsfSeverity.Fatal,
74
+ };
75
+
46
76
  /*
47
77
  * Loose severity text -> OCSF severity. Accepts the dialects we ingest:
48
78
  * UDM security_result severities (EMERGENCY/ALERT/CRITICAL/ERROR/HIGH/...),
@@ -57,32 +87,7 @@ export function normalizeOcsfSeverity(text: string): OcsfSeverity | null {
57
87
  return null;
58
88
  }
59
89
 
60
- const aliases: Record<string, OcsfSeverity> = {
61
- UNKNOWN: OcsfSeverity.Unknown,
62
- UNKNOWN_SEVERITY: OcsfSeverity.Unknown,
63
- NONE: OcsfSeverity.Informational,
64
- INFO: OcsfSeverity.Informational,
65
- INFORMATION: OcsfSeverity.Informational,
66
- INFORMATIONAL: OcsfSeverity.Informational,
67
- NOTICE: OcsfSeverity.Informational,
68
- DEBUG: OcsfSeverity.Informational,
69
- LOW: OcsfSeverity.Low,
70
- WARN: OcsfSeverity.Low,
71
- WARNING: OcsfSeverity.Low,
72
- MEDIUM: OcsfSeverity.Medium,
73
- MODERATE: OcsfSeverity.Medium,
74
- ERR: OcsfSeverity.Medium,
75
- ERROR: OcsfSeverity.Medium,
76
- HIGH: OcsfSeverity.High,
77
- SEVERE: OcsfSeverity.High,
78
- CRITICAL: OcsfSeverity.Critical,
79
- CRIT: OcsfSeverity.Critical,
80
- ALERT: OcsfSeverity.Critical,
81
- FATAL: OcsfSeverity.Fatal,
82
- EMERGENCY: OcsfSeverity.Fatal,
83
- };
84
-
85
- return aliases[normalized] || null;
90
+ return OCSF_SEVERITY_ALIASES[normalized] || null;
86
91
  }
87
92
 
88
93
  export default OcsfSeverity;