@oneuptime/common 13.0.6 → 13.0.7

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 (589) hide show
  1. package/Models/DatabaseModels/AIAgentOwnerTeam.ts +6 -0
  2. package/Models/DatabaseModels/AIAgentOwnerUser.ts +6 -0
  3. package/Models/DatabaseModels/Alert.ts +12 -0
  4. package/Models/DatabaseModels/AlertEpisodeOwnerTeam.ts +6 -1
  5. package/Models/DatabaseModels/AlertEpisodeOwnerUser.ts +6 -1
  6. package/Models/DatabaseModels/AlertOwnerTeam.ts +6 -1
  7. package/Models/DatabaseModels/AlertOwnerUser.ts +6 -1
  8. package/Models/DatabaseModels/CephClusterOwnerTeam.ts +6 -0
  9. package/Models/DatabaseModels/CephClusterOwnerUser.ts +6 -0
  10. package/Models/DatabaseModels/CloudResourceOwnerTeam.ts +6 -0
  11. package/Models/DatabaseModels/CloudResourceOwnerUser.ts +6 -0
  12. package/Models/DatabaseModels/DashboardOwnerTeam.ts +6 -1
  13. package/Models/DatabaseModels/DashboardOwnerUser.ts +6 -1
  14. package/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.ts +8 -0
  15. package/Models/DatabaseModels/DockerHostOwnerTeam.ts +6 -0
  16. package/Models/DatabaseModels/DockerHostOwnerUser.ts +6 -0
  17. package/Models/DatabaseModels/DockerSwarmClusterOwnerTeam.ts +6 -0
  18. package/Models/DatabaseModels/DockerSwarmClusterOwnerUser.ts +6 -0
  19. package/Models/DatabaseModels/HostOwnerTeam.ts +6 -0
  20. package/Models/DatabaseModels/HostOwnerUser.ts +6 -0
  21. package/Models/DatabaseModels/Incident.ts +12 -0
  22. package/Models/DatabaseModels/IncidentEpisodeOwnerTeam.ts +6 -1
  23. package/Models/DatabaseModels/IncidentEpisodeOwnerUser.ts +6 -1
  24. package/Models/DatabaseModels/IncidentOwnerTeam.ts +6 -1
  25. package/Models/DatabaseModels/IncidentOwnerUser.ts +6 -1
  26. package/Models/DatabaseModels/IncidentTemplateOwnerTeam.ts +6 -0
  27. package/Models/DatabaseModels/IncidentTemplateOwnerUser.ts +6 -0
  28. package/Models/DatabaseModels/IncomingCallPolicyOwnerTeam.ts +6 -1
  29. package/Models/DatabaseModels/IncomingCallPolicyOwnerUser.ts +6 -1
  30. package/Models/DatabaseModels/IoTFleetOwnerTeam.ts +6 -0
  31. package/Models/DatabaseModels/IoTFleetOwnerUser.ts +6 -0
  32. package/Models/DatabaseModels/KubernetesClusterOwnerTeam.ts +6 -0
  33. package/Models/DatabaseModels/KubernetesClusterOwnerUser.ts +6 -0
  34. package/Models/DatabaseModels/Monitor.ts +2 -3
  35. package/Models/DatabaseModels/MonitorGroupOwnerTeam.ts +6 -0
  36. package/Models/DatabaseModels/MonitorGroupOwnerUser.ts +6 -0
  37. package/Models/DatabaseModels/MonitorOwnerTeam.ts +6 -1
  38. package/Models/DatabaseModels/MonitorOwnerUser.ts +6 -1
  39. package/Models/DatabaseModels/MonitorTemplate.ts +2 -3
  40. package/Models/DatabaseModels/NetworkDeviceOwnerTeam.ts +6 -0
  41. package/Models/DatabaseModels/NetworkDeviceOwnerUser.ts +6 -0
  42. package/Models/DatabaseModels/OnCallDutyPolicyOwnerTeam.ts +6 -1
  43. package/Models/DatabaseModels/OnCallDutyPolicyOwnerUser.ts +6 -1
  44. package/Models/DatabaseModels/OnCallDutyPolicyScheduleOwnerTeam.ts +6 -1
  45. package/Models/DatabaseModels/OnCallDutyPolicyScheduleOwnerUser.ts +6 -1
  46. package/Models/DatabaseModels/PodmanHostOwnerTeam.ts +6 -0
  47. package/Models/DatabaseModels/PodmanHostOwnerUser.ts +6 -0
  48. package/Models/DatabaseModels/ProbeOwnerTeam.ts +6 -0
  49. package/Models/DatabaseModels/ProbeOwnerUser.ts +6 -0
  50. package/Models/DatabaseModels/ProxmoxClusterOwnerTeam.ts +6 -0
  51. package/Models/DatabaseModels/ProxmoxClusterOwnerUser.ts +6 -0
  52. package/Models/DatabaseModels/RumApplicationOwnerTeam.ts +6 -0
  53. package/Models/DatabaseModels/RumApplicationOwnerUser.ts +6 -0
  54. package/Models/DatabaseModels/RunbookOwnerTeam.ts +6 -1
  55. package/Models/DatabaseModels/RunbookOwnerUser.ts +6 -1
  56. package/Models/DatabaseModels/RunnerOwnerTeam.ts +6 -1
  57. package/Models/DatabaseModels/RunnerOwnerUser.ts +6 -1
  58. package/Models/DatabaseModels/ScheduledMaintenanceOwnerTeam.ts +6 -1
  59. package/Models/DatabaseModels/ScheduledMaintenanceOwnerUser.ts +6 -1
  60. package/Models/DatabaseModels/ScheduledMaintenanceTemplateOwnerTeam.ts +8 -0
  61. package/Models/DatabaseModels/ScheduledMaintenanceTemplateOwnerUser.ts +8 -0
  62. package/Models/DatabaseModels/ServerlessFunctionOwnerTeam.ts +6 -0
  63. package/Models/DatabaseModels/ServerlessFunctionOwnerUser.ts +6 -0
  64. package/Models/DatabaseModels/ServiceLevelObjectiveOwnerTeam.ts +6 -1
  65. package/Models/DatabaseModels/ServiceLevelObjectiveOwnerUser.ts +6 -1
  66. package/Models/DatabaseModels/ServiceOwnerTeam.ts +6 -0
  67. package/Models/DatabaseModels/ServiceOwnerUser.ts +6 -0
  68. package/Models/DatabaseModels/StatusPageOwnerTeam.ts +6 -1
  69. package/Models/DatabaseModels/StatusPageOwnerUser.ts +6 -1
  70. package/Models/DatabaseModels/VMwareVCenterOwnerTeam.ts +6 -0
  71. package/Models/DatabaseModels/VMwareVCenterOwnerUser.ts +6 -0
  72. package/Models/DatabaseModels/WorkflowOwnerTeam.ts +6 -1
  73. package/Models/DatabaseModels/WorkflowOwnerUser.ts +6 -1
  74. package/Scripts/benchmark-fanin-capacity.js +2 -2
  75. package/Server/API/AIAgentDataAPI.ts +1 -1
  76. package/Server/API/AIChatAPI.ts +6 -4
  77. package/Server/API/AIInvestigationAPI.ts +7 -0
  78. package/Server/API/StatusPageAPI.ts +13 -0
  79. package/Server/Infrastructure/Postgres/LocalMigrationGenerationDataSource.ts +1 -1
  80. package/Server/Infrastructure/Postgres/SchemaMigrations/1793500000000-MakeOwnerRowsUnique.ts +1057 -0
  81. package/Server/Infrastructure/Postgres/SchemaMigrations/1793700000000-AddAIInvestigationDecision.ts +25 -0
  82. package/Server/Infrastructure/Postgres/SchemaMigrations/1793800000000-RemoveMonitorDescriptionLengthLimit.ts +31 -0
  83. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +6 -0
  84. package/Server/Infrastructure/Postgres/SchemaMigrations/Readme.md +6 -4
  85. package/Server/Middleware/IdentityRateLimit.ts +34 -1
  86. package/Server/Middleware/PublicDashboardRateLimit.ts +169 -39
  87. package/Server/Services/AlertEpisodeService.ts +13 -34
  88. package/Server/Services/AlertGroupingEngineService.ts +7 -4
  89. package/Server/Services/AlertService.ts +13 -32
  90. package/Server/Services/CephClusterOwnerRuleEngineService.ts +18 -10
  91. package/Server/Services/CloudResourceOwnerRuleEngineService.ts +18 -10
  92. package/Server/Services/DashboardOwnerRuleEngineService.ts +18 -10
  93. package/Server/Services/DatabaseService.ts +101 -1
  94. package/Server/Services/DockerHostOwnerRuleEngineService.ts +18 -10
  95. package/Server/Services/DockerSwarmClusterOwnerRuleEngineService.ts +18 -10
  96. package/Server/Services/HostOwnerRuleEngineService.ts +18 -10
  97. package/Server/Services/IncidentEpisodeOwnerRuleEngineService.ts +6 -4
  98. package/Server/Services/IncidentEpisodeService.ts +15 -75
  99. package/Server/Services/IncidentGroupingEngineService.ts +7 -4
  100. package/Server/Services/IncidentService.ts +13 -32
  101. package/Server/Services/IncidentTemplateService.ts +13 -36
  102. package/Server/Services/IncomingCallPolicyOwnerRuleEngineService.ts +18 -10
  103. package/Server/Services/IoTFleetOwnerRuleEngineService.ts +18 -10
  104. package/Server/Services/KubernetesClusterOwnerRuleEngineService.ts +18 -10
  105. package/Server/Services/MonitorService.ts +13 -32
  106. package/Server/Services/NetworkDeviceOwnerRuleEngineService.ts +18 -10
  107. package/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.ts +18 -10
  108. package/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.ts +18 -10
  109. package/Server/Services/PodmanHostOwnerRuleEngineService.ts +18 -10
  110. package/Server/Services/ProxmoxClusterOwnerRuleEngineService.ts +18 -10
  111. package/Server/Services/RumApplicationOwnerRuleEngineService.ts +18 -10
  112. package/Server/Services/RunbookOwnerRuleEngineService.ts +18 -10
  113. package/Server/Services/ScheduledMaintenanceService.ts +13 -34
  114. package/Server/Services/ScheduledMaintenanceTemplateService.ts +12 -34
  115. package/Server/Services/ServerlessFunctionOwnerRuleEngineService.ts +18 -10
  116. package/Server/Services/ServiceOwnerRuleEngineService.ts +18 -10
  117. package/Server/Services/StatusPagePrivateUserService.ts +38 -29
  118. package/Server/Services/StatusPagePrivateUserSessionService.ts +49 -1
  119. package/Server/Services/StatusPageService.ts +59 -36
  120. package/Server/Services/UserSessionService.ts +6 -0
  121. package/Server/Services/VMwareVCenterOwnerRuleEngineService.ts +18 -10
  122. package/Server/Services/WorkflowOwnerRuleEngineService.ts +18 -10
  123. package/Server/Static/Brand/README.md +7 -7
  124. package/Server/Static/Vendor/README.md +7 -7
  125. package/Server/Types/Database/Permissions/OwnedScopePermission.ts +18 -9
  126. package/Server/Types/Database/Permissions/OwnerTableRegistry.ts +82 -0
  127. package/Server/Utils/AI/Chat/ChatAgentRunner.ts +21 -8
  128. package/Server/Utils/AI/Chat/ObservabilityChatPrompt.ts +41 -4
  129. package/Server/Utils/AI/CodeFix/CodeAgentWorkspaceGuard.ts +1 -1
  130. package/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.ts +1 -1
  131. package/Server/Utils/AI/SRE/AIInvestigationEngine.ts +13 -5
  132. package/Server/Utils/AI/SRE/AlertInvestigationRunner.ts +53 -13
  133. package/Server/Utils/AI/SRE/IncidentInvestigationRunner.ts +51 -14
  134. package/Server/Utils/AI/SRE/InvestigationEligibility.ts +292 -0
  135. package/Server/Utils/AI/SRE/InvestigationQueue.ts +25 -0
  136. package/Server/Utils/AI/Toolbox/Index.ts +43 -13
  137. package/Server/Utils/AI/Toolbox/ResourceTools.ts +952 -0
  138. package/Server/Utils/AI/Toolbox/RumTools.ts +424 -0
  139. package/Server/Utils/AI/Toolbox/ToolTypes.ts +10 -0
  140. package/Server/Utils/AI/Toolbox/TraceTools.ts +2 -1
  141. package/Server/Utils/Database/PostgresErrorTranslator.ts +14 -0
  142. package/Server/Utils/Monitor/Criteria/CompareCriteria.ts +137 -126
  143. package/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.ts +4 -1
  144. package/Server/Utils/Rules/OwnerRuleAssignment.ts +157 -6
  145. package/Server/Utils/Telemetry/TelemetryEntity.ts +205 -6
  146. package/SslCertificates/GlobalSign.crt +26 -0
  147. package/SslCertificates/Readme.md +3 -0
  148. package/Tests/App/AdminDashboard/EnterpriseLicenseInstanceActivity.test.tsx +451 -0
  149. package/Tests/App/Dashboard/AIInsightsChatPanel.test.tsx +881 -0
  150. package/Tests/App/Dashboard/AIInsightsPageContext.test.ts +458 -0
  151. package/Tests/App/Dashboard/AIInsightsResourceCitations.test.ts +124 -0
  152. package/Tests/App/Dashboard/AIInsightsResourcePageContext.test.ts +798 -0
  153. package/Tests/App/Dashboard/AskAiSuggestedPrompts.test.ts +7 -0
  154. package/Tests/App/Dashboard/DashboardChartWidgetZoom.test.tsx +104 -0
  155. package/Tests/App/Dashboard/DashboardCommandPalette.test.tsx +156 -64
  156. package/Tests/App/Dashboard/DiscoveryScanStatusMessage.test.tsx +970 -0
  157. package/Tests/App/Dashboard/DiscoveryScanWizardValidation.test.tsx +406 -12
  158. package/Tests/App/Dashboard/EmbeddedMetricEventScope.test.tsx +358 -0
  159. package/Tests/App/Dashboard/ErrorPatternEventScope.test.tsx +148 -0
  160. package/Tests/App/Dashboard/EventOverlayAdditionalResourceScope.test.ts +255 -0
  161. package/Tests/App/Dashboard/EventOverlayScope.test.ts +845 -0
  162. package/Tests/App/Dashboard/EventOverlayScopeHook.test.tsx +903 -0
  163. package/Tests/App/Dashboard/ExternalStatusPageCriteriaFilter.test.ts +3 -3
  164. package/Tests/App/Dashboard/InvestigationDrawer.test.tsx +21 -0
  165. package/Tests/App/Dashboard/InvestigationNotStarted.test.tsx +761 -0
  166. package/Tests/App/Dashboard/InvestigationPanel.test.tsx +7 -4
  167. package/Tests/App/Dashboard/InvestigationPanelStatus.test.tsx +15 -7
  168. package/Tests/App/Dashboard/MetricsViewerEventScopeNavigation.test.tsx +264 -0
  169. package/Tests/App/Dashboard/MonitorSummaryTestMonitorButton.test.tsx +342 -0
  170. package/Tests/App/Dashboard/MonitorTestForm.test.tsx +612 -0
  171. package/Tests/App/Dashboard/NavigationSearchKeywords.test.tsx +301 -0
  172. package/Tests/App/Dashboard/ServiceMapGraph.test.tsx +74 -2
  173. package/Tests/App/Dashboard/TextClampLayoutHarness.ts +224 -0
  174. package/Tests/Models/InventoryItemNaming.test.ts +54 -0
  175. package/Tests/Server/API/AIChatRouteAuthorization.test.ts +161 -0
  176. package/Tests/Server/API/AIInvestigationAPI.test.ts +14 -0
  177. package/Tests/Server/API/AIInvestigationAvailabilityAuthorization.test.ts +260 -0
  178. package/Tests/Server/API/EnterpriseLicenseReportUserCount.test.ts +133 -0
  179. package/Tests/Server/API/StatusPageMasterPasswordRateLimit.test.ts +482 -0
  180. package/Tests/Server/EnvironmentConfigOnCallCalendarFeed.test.ts +1 -1
  181. package/Tests/Server/Infrastructure/ClickhouseKeepAliveOptions.test.ts +1 -1
  182. package/Tests/Server/Infrastructure/ContainerBootConfiguration.test.ts +38 -16
  183. package/Tests/Server/Infrastructure/E2EClickHouseFixtureAccess.test.ts +106 -31
  184. package/Tests/Server/Infrastructure/ExampleDockerfiles.test.ts +46 -12
  185. package/Tests/Server/Infrastructure/Postgres/MonitorDescriptionMigration.test.ts +422 -0
  186. package/Tests/Server/Infrastructure/TelemetryExporterDeploymentConfig.test.ts +1 -1
  187. package/Tests/Server/Infrastructure/ValkeyDeploymentConfig.test.ts +25 -4
  188. package/Tests/Server/Middleware/IdentityRateLimit.test.ts +72 -0
  189. package/Tests/Server/Middleware/PublicDashboardRateLimit.test.ts +12 -12
  190. package/Tests/Server/Middleware/PublicDashboardRateLimitStatusPage.test.ts +800 -0
  191. package/Tests/Server/Services/AIInvestigationDecisionPostgres.test.ts +346 -0
  192. package/Tests/Server/Services/AddOwnersIdempotency.test.ts +471 -0
  193. package/Tests/Server/Services/DatabaseServiceAutoOwnerOnCreate.test.ts +250 -0
  194. package/Tests/Server/Services/DatabaseServiceUniqueColumnsTogether.test.ts +622 -0
  195. package/Tests/Server/Services/MonitorDescriptionValidation.test.ts +211 -0
  196. package/Tests/Server/Services/MonitorTemplateDescriptionPropagation.test.ts +269 -0
  197. package/Tests/Server/Services/OwnerRowUniqueness.test.ts +504 -0
  198. package/Tests/Server/Services/RuleRun/OwnerRuleEnginesGroupARun.test.ts +43 -0
  199. package/Tests/Server/Services/SessionRetention.test.ts +334 -0
  200. package/Tests/Server/Services/StatusPagePrivateUserInvitationPolicy.test.ts +172 -0
  201. package/Tests/Server/Services/StatusPagePrivateUserReadAccess.test.ts +178 -0
  202. package/Tests/Server/Services/StatusPagePrivateUserReadAccessPostgres.test.ts +311 -0
  203. package/Tests/Server/Services/StatusPagePrivateUserSessionService.test.ts +216 -1
  204. package/Tests/Server/Services/TeamComplianceServiceBehaviour.test.ts +1 -1
  205. package/Tests/Server/Services/UserOnCallLogNoNotificationRules.test.ts +1 -1
  206. package/Tests/Server/Types/Database/EventOverlayScopePostgres.test.ts +626 -0
  207. package/Tests/Server/Types/Database/Permissions/InfrastructureOwnershipScope.test.ts +668 -0
  208. package/Tests/Server/Types/Database/Permissions/SelectRejectionMessageContract.test.ts +1 -0
  209. package/Tests/Server/Types/Database/Permissions/UserNotificationRuleScoping.test.ts +1 -1
  210. package/Tests/Server/Utils/AI/AIIncidentGating.test.ts +16 -9
  211. package/Tests/Server/Utils/AI/ChatAgentRunner.test.ts +137 -1
  212. package/Tests/Server/Utils/AI/InvestigationEligibility.test.ts +697 -0
  213. package/Tests/Server/Utils/AI/ObservabilityChatPrompt.test.ts +105 -0
  214. package/Tests/Server/Utils/AI/RemediationHandoff.test.ts +16 -5
  215. package/Tests/Server/Utils/AI/ResourceTools.test.ts +1304 -0
  216. package/Tests/Server/Utils/AI/RumTools.test.ts +769 -0
  217. package/Tests/Server/Utils/Database/PostgresErrorTranslator.test.ts +63 -0
  218. package/Tests/Server/Utils/Monitor/Criteria/APIRequestCriteriaEvaluateOverTime.test.ts +11 -9
  219. package/Tests/Server/Utils/Monitor/Criteria/CompareCriteria.test.ts +62 -45
  220. package/Tests/Server/Utils/Monitor/Criteria/CompareCriteriaAggregation.test.ts +25 -24
  221. package/Tests/Server/Utils/Monitor/Criteria/CompareCriteriaHumanMessages.test.ts +513 -0
  222. package/Tests/Server/Utils/Monitor/Criteria/CustomCodeMonitorCriteria.test.ts +2 -2
  223. package/Tests/Server/Utils/Monitor/Criteria/DnsMonitorCriteria.test.ts +1 -1
  224. package/Tests/Server/Utils/Monitor/Criteria/ExternalStatusPageMonitorCriteria.test.ts +9 -9
  225. package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.test.ts +7 -5
  226. package/Tests/Server/Utils/Monitor/Criteria/ProfileMonitorCriteria.test.ts +2 -2
  227. package/Tests/Server/Utils/Monitor/Criteria/ServerMonitorCriteria.test.ts +4 -3
  228. package/Tests/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.test.ts +2 -2
  229. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorMetricUnits.test.ts +3 -2
  230. package/Tests/Server/Utils/Monitor/MonitorCriteriaHumanMessages.test.ts +529 -0
  231. package/Tests/Server/Utils/Rules/OwnerRuleAssignment.test.ts +412 -4
  232. package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsPollingClickhouseIntegration.test.ts +1 -1
  233. package/Tests/Server/Utils/TailwindBuildCopy.test.ts +14 -2
  234. package/Tests/Server/Utils/Telemetry/HostAssetAttributesFromOtlp.test.ts +235 -0
  235. package/Tests/Server/Utils/Telemetry/TelemetryEntity.test.ts +385 -2
  236. package/Tests/Server/Utils/VendorAssets.test.ts +17 -3
  237. package/Tests/Types/AI/AIChatPageContext.test.ts +0 -0
  238. package/Tests/Types/AI/AIResourceContext.test.ts +312 -0
  239. package/Tests/Types/Database/UniqueColumnsTogether.test.ts +100 -0
  240. package/Tests/Types/Monitor/MetricAndProfileDefaultCriteria.test.ts +4 -4
  241. package/Tests/Types/Monitor/MonitorStepRetryPersistence.test.ts +125 -0
  242. package/Tests/Types/WebsiteRequest.test.ts +44 -0
  243. package/Tests/UI/Components/Forms/MonitorDescriptionForm.test.tsx +410 -0
  244. package/Tests/UI/Components/ModelTable/BaseModelTableReadPermissions.test.tsx +439 -0
  245. package/Tests/UI/Components/NavBarMenuSearch.test.tsx +372 -0
  246. package/Tests/UI/EsbuildConfig.test.ts +1 -1
  247. package/Tests/UI/Monitor/MonitorStepRetrySettings.test.tsx +616 -0
  248. package/Tests/UI/ReactRouterSingletonBuild.test.ts +4 -2
  249. package/Tests/UI/Rum/ReplayEngine.test.ts +179 -0
  250. package/Tests/UI/Rum/ReplayHeader.test.tsx +23 -0
  251. package/Tests/UI/Rum/ReplayScrubber.test.tsx +88 -0
  252. package/Tests/UI/Rum/ReplayStageOverlays.test.tsx +83 -0
  253. package/Tests/UI/Rum/ReplayTabSwitcher.test.tsx +33 -0
  254. package/Tests/Utils/API.test.ts +96 -0
  255. package/Tests/Utils/HTTPResponseBodyReader.test.ts +188 -1
  256. package/Tests/Utils/Metrics/MetricEventScopeUrl.test.ts +101 -0
  257. package/Tests/Utils/Monitor/MonitorTestAvailabilityUtil.test.ts +256 -0
  258. package/Tests/Utils/Telemetry/HostIpAddresses.test.ts +105 -0
  259. package/Types/AI/AIChatPageContext.ts +87 -2
  260. package/Types/AI/AIChatTypes.ts +4 -0
  261. package/Types/AI/AIResourceContext.ts +198 -0
  262. package/Types/AI/InvestigationNotStartedReason.ts +30 -0
  263. package/Types/Database/UniqueColumnsTogether.ts +55 -0
  264. package/Types/Metrics/MetricQueryConfigData.ts +8 -0
  265. package/Types/Rum/WebVitals.ts +71 -0
  266. package/Types/WebsiteRequest.ts +2 -0
  267. package/UI/Components/EditionLabel/EditionLabel.tsx +7 -5
  268. package/UI/Components/KeyboardShortcut/Screenshots/README.md +1 -1
  269. package/UI/Components/ModelTable/BaseModelTable.tsx +8 -0
  270. package/UI/Components/Navbar/NavBar.tsx +2 -0
  271. package/UI/Components/Navbar/NavBarMenuModal.tsx +6 -2
  272. package/UI/esbuild-config.js +4 -4
  273. package/Utils/API.ts +10 -1
  274. package/Utils/Dashboard/HtmlWidgetDocument.ts +1 -1
  275. package/Utils/HTTPResponseBodyReader.ts +64 -8
  276. package/Utils/Metrics/MetricExplorerUrl.ts +19 -0
  277. package/Utils/Monitor/MonitorTestAvailabilityUtil.ts +92 -0
  278. package/Utils/Telemetry/HostIpAddresses.ts +46 -2
  279. package/build/dist/Models/DatabaseModels/AIAgentOwnerTeam.js +4 -1
  280. package/build/dist/Models/DatabaseModels/AIAgentOwnerTeam.js.map +1 -1
  281. package/build/dist/Models/DatabaseModels/AIAgentOwnerUser.js +4 -1
  282. package/build/dist/Models/DatabaseModels/AIAgentOwnerUser.js.map +1 -1
  283. package/build/dist/Models/DatabaseModels/Alert.js +12 -0
  284. package/build/dist/Models/DatabaseModels/Alert.js.map +1 -1
  285. package/build/dist/Models/DatabaseModels/AlertEpisodeOwnerTeam.js +3 -1
  286. package/build/dist/Models/DatabaseModels/AlertEpisodeOwnerTeam.js.map +1 -1
  287. package/build/dist/Models/DatabaseModels/AlertEpisodeOwnerUser.js +3 -1
  288. package/build/dist/Models/DatabaseModels/AlertEpisodeOwnerUser.js.map +1 -1
  289. package/build/dist/Models/DatabaseModels/AlertOwnerTeam.js +3 -1
  290. package/build/dist/Models/DatabaseModels/AlertOwnerTeam.js.map +1 -1
  291. package/build/dist/Models/DatabaseModels/AlertOwnerUser.js +3 -1
  292. package/build/dist/Models/DatabaseModels/AlertOwnerUser.js.map +1 -1
  293. package/build/dist/Models/DatabaseModels/CephClusterOwnerTeam.js +4 -1
  294. package/build/dist/Models/DatabaseModels/CephClusterOwnerTeam.js.map +1 -1
  295. package/build/dist/Models/DatabaseModels/CephClusterOwnerUser.js +4 -1
  296. package/build/dist/Models/DatabaseModels/CephClusterOwnerUser.js.map +1 -1
  297. package/build/dist/Models/DatabaseModels/CloudResourceOwnerTeam.js +4 -1
  298. package/build/dist/Models/DatabaseModels/CloudResourceOwnerTeam.js.map +1 -1
  299. package/build/dist/Models/DatabaseModels/CloudResourceOwnerUser.js +4 -1
  300. package/build/dist/Models/DatabaseModels/CloudResourceOwnerUser.js.map +1 -1
  301. package/build/dist/Models/DatabaseModels/DashboardOwnerTeam.js +3 -1
  302. package/build/dist/Models/DatabaseModels/DashboardOwnerTeam.js.map +1 -1
  303. package/build/dist/Models/DatabaseModels/DashboardOwnerUser.js +3 -1
  304. package/build/dist/Models/DatabaseModels/DashboardOwnerUser.js.map +1 -1
  305. package/build/dist/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.js +3 -0
  306. package/build/dist/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.js.map +1 -1
  307. package/build/dist/Models/DatabaseModels/DockerHostOwnerTeam.js +4 -1
  308. package/build/dist/Models/DatabaseModels/DockerHostOwnerTeam.js.map +1 -1
  309. package/build/dist/Models/DatabaseModels/DockerHostOwnerUser.js +4 -1
  310. package/build/dist/Models/DatabaseModels/DockerHostOwnerUser.js.map +1 -1
  311. package/build/dist/Models/DatabaseModels/DockerSwarmClusterOwnerTeam.js +4 -1
  312. package/build/dist/Models/DatabaseModels/DockerSwarmClusterOwnerTeam.js.map +1 -1
  313. package/build/dist/Models/DatabaseModels/DockerSwarmClusterOwnerUser.js +4 -1
  314. package/build/dist/Models/DatabaseModels/DockerSwarmClusterOwnerUser.js.map +1 -1
  315. package/build/dist/Models/DatabaseModels/HostOwnerTeam.js +4 -1
  316. package/build/dist/Models/DatabaseModels/HostOwnerTeam.js.map +1 -1
  317. package/build/dist/Models/DatabaseModels/HostOwnerUser.js +4 -1
  318. package/build/dist/Models/DatabaseModels/HostOwnerUser.js.map +1 -1
  319. package/build/dist/Models/DatabaseModels/Incident.js +12 -0
  320. package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
  321. package/build/dist/Models/DatabaseModels/IncidentEpisodeOwnerTeam.js +3 -1
  322. package/build/dist/Models/DatabaseModels/IncidentEpisodeOwnerTeam.js.map +1 -1
  323. package/build/dist/Models/DatabaseModels/IncidentEpisodeOwnerUser.js +3 -1
  324. package/build/dist/Models/DatabaseModels/IncidentEpisodeOwnerUser.js.map +1 -1
  325. package/build/dist/Models/DatabaseModels/IncidentOwnerTeam.js +3 -1
  326. package/build/dist/Models/DatabaseModels/IncidentOwnerTeam.js.map +1 -1
  327. package/build/dist/Models/DatabaseModels/IncidentOwnerUser.js +3 -1
  328. package/build/dist/Models/DatabaseModels/IncidentOwnerUser.js.map +1 -1
  329. package/build/dist/Models/DatabaseModels/IncidentTemplateOwnerTeam.js +4 -1
  330. package/build/dist/Models/DatabaseModels/IncidentTemplateOwnerTeam.js.map +1 -1
  331. package/build/dist/Models/DatabaseModels/IncidentTemplateOwnerUser.js +4 -1
  332. package/build/dist/Models/DatabaseModels/IncidentTemplateOwnerUser.js.map +1 -1
  333. package/build/dist/Models/DatabaseModels/IncomingCallPolicyOwnerTeam.js +3 -1
  334. package/build/dist/Models/DatabaseModels/IncomingCallPolicyOwnerTeam.js.map +1 -1
  335. package/build/dist/Models/DatabaseModels/IncomingCallPolicyOwnerUser.js +3 -1
  336. package/build/dist/Models/DatabaseModels/IncomingCallPolicyOwnerUser.js.map +1 -1
  337. package/build/dist/Models/DatabaseModels/IoTFleetOwnerTeam.js +4 -1
  338. package/build/dist/Models/DatabaseModels/IoTFleetOwnerTeam.js.map +1 -1
  339. package/build/dist/Models/DatabaseModels/IoTFleetOwnerUser.js +4 -1
  340. package/build/dist/Models/DatabaseModels/IoTFleetOwnerUser.js.map +1 -1
  341. package/build/dist/Models/DatabaseModels/KubernetesClusterOwnerTeam.js +4 -1
  342. package/build/dist/Models/DatabaseModels/KubernetesClusterOwnerTeam.js.map +1 -1
  343. package/build/dist/Models/DatabaseModels/KubernetesClusterOwnerUser.js +4 -1
  344. package/build/dist/Models/DatabaseModels/KubernetesClusterOwnerUser.js.map +1 -1
  345. package/build/dist/Models/DatabaseModels/Monitor.js +2 -3
  346. package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
  347. package/build/dist/Models/DatabaseModels/MonitorGroupOwnerTeam.js +4 -1
  348. package/build/dist/Models/DatabaseModels/MonitorGroupOwnerTeam.js.map +1 -1
  349. package/build/dist/Models/DatabaseModels/MonitorGroupOwnerUser.js +4 -1
  350. package/build/dist/Models/DatabaseModels/MonitorGroupOwnerUser.js.map +1 -1
  351. package/build/dist/Models/DatabaseModels/MonitorOwnerTeam.js +3 -1
  352. package/build/dist/Models/DatabaseModels/MonitorOwnerTeam.js.map +1 -1
  353. package/build/dist/Models/DatabaseModels/MonitorOwnerUser.js +3 -1
  354. package/build/dist/Models/DatabaseModels/MonitorOwnerUser.js.map +1 -1
  355. package/build/dist/Models/DatabaseModels/MonitorTemplate.js +2 -3
  356. package/build/dist/Models/DatabaseModels/MonitorTemplate.js.map +1 -1
  357. package/build/dist/Models/DatabaseModels/NetworkDeviceOwnerTeam.js +4 -1
  358. package/build/dist/Models/DatabaseModels/NetworkDeviceOwnerTeam.js.map +1 -1
  359. package/build/dist/Models/DatabaseModels/NetworkDeviceOwnerUser.js +4 -1
  360. package/build/dist/Models/DatabaseModels/NetworkDeviceOwnerUser.js.map +1 -1
  361. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyOwnerTeam.js +3 -1
  362. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyOwnerTeam.js.map +1 -1
  363. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyOwnerUser.js +3 -1
  364. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyOwnerUser.js.map +1 -1
  365. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleOwnerTeam.js +3 -1
  366. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleOwnerTeam.js.map +1 -1
  367. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleOwnerUser.js +3 -1
  368. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleOwnerUser.js.map +1 -1
  369. package/build/dist/Models/DatabaseModels/PodmanHostOwnerTeam.js +4 -1
  370. package/build/dist/Models/DatabaseModels/PodmanHostOwnerTeam.js.map +1 -1
  371. package/build/dist/Models/DatabaseModels/PodmanHostOwnerUser.js +4 -1
  372. package/build/dist/Models/DatabaseModels/PodmanHostOwnerUser.js.map +1 -1
  373. package/build/dist/Models/DatabaseModels/ProbeOwnerTeam.js +4 -1
  374. package/build/dist/Models/DatabaseModels/ProbeOwnerTeam.js.map +1 -1
  375. package/build/dist/Models/DatabaseModels/ProbeOwnerUser.js +4 -1
  376. package/build/dist/Models/DatabaseModels/ProbeOwnerUser.js.map +1 -1
  377. package/build/dist/Models/DatabaseModels/ProxmoxClusterOwnerTeam.js +4 -1
  378. package/build/dist/Models/DatabaseModels/ProxmoxClusterOwnerTeam.js.map +1 -1
  379. package/build/dist/Models/DatabaseModels/ProxmoxClusterOwnerUser.js +4 -1
  380. package/build/dist/Models/DatabaseModels/ProxmoxClusterOwnerUser.js.map +1 -1
  381. package/build/dist/Models/DatabaseModels/RumApplicationOwnerTeam.js +4 -1
  382. package/build/dist/Models/DatabaseModels/RumApplicationOwnerTeam.js.map +1 -1
  383. package/build/dist/Models/DatabaseModels/RumApplicationOwnerUser.js +4 -1
  384. package/build/dist/Models/DatabaseModels/RumApplicationOwnerUser.js.map +1 -1
  385. package/build/dist/Models/DatabaseModels/RunbookOwnerTeam.js +3 -1
  386. package/build/dist/Models/DatabaseModels/RunbookOwnerTeam.js.map +1 -1
  387. package/build/dist/Models/DatabaseModels/RunbookOwnerUser.js +3 -1
  388. package/build/dist/Models/DatabaseModels/RunbookOwnerUser.js.map +1 -1
  389. package/build/dist/Models/DatabaseModels/RunnerOwnerTeam.js +3 -1
  390. package/build/dist/Models/DatabaseModels/RunnerOwnerTeam.js.map +1 -1
  391. package/build/dist/Models/DatabaseModels/RunnerOwnerUser.js +3 -1
  392. package/build/dist/Models/DatabaseModels/RunnerOwnerUser.js.map +1 -1
  393. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceOwnerTeam.js +3 -1
  394. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceOwnerTeam.js.map +1 -1
  395. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceOwnerUser.js +3 -1
  396. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceOwnerUser.js.map +1 -1
  397. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplateOwnerTeam.js +6 -1
  398. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplateOwnerTeam.js.map +1 -1
  399. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplateOwnerUser.js +6 -1
  400. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplateOwnerUser.js.map +1 -1
  401. package/build/dist/Models/DatabaseModels/ServerlessFunctionOwnerTeam.js +4 -1
  402. package/build/dist/Models/DatabaseModels/ServerlessFunctionOwnerTeam.js.map +1 -1
  403. package/build/dist/Models/DatabaseModels/ServerlessFunctionOwnerUser.js +4 -1
  404. package/build/dist/Models/DatabaseModels/ServerlessFunctionOwnerUser.js.map +1 -1
  405. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerTeam.js +3 -1
  406. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerTeam.js.map +1 -1
  407. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerUser.js +3 -1
  408. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerUser.js.map +1 -1
  409. package/build/dist/Models/DatabaseModels/ServiceOwnerTeam.js +4 -1
  410. package/build/dist/Models/DatabaseModels/ServiceOwnerTeam.js.map +1 -1
  411. package/build/dist/Models/DatabaseModels/ServiceOwnerUser.js +4 -1
  412. package/build/dist/Models/DatabaseModels/ServiceOwnerUser.js.map +1 -1
  413. package/build/dist/Models/DatabaseModels/StatusPageOwnerTeam.js +3 -1
  414. package/build/dist/Models/DatabaseModels/StatusPageOwnerTeam.js.map +1 -1
  415. package/build/dist/Models/DatabaseModels/StatusPageOwnerUser.js +3 -1
  416. package/build/dist/Models/DatabaseModels/StatusPageOwnerUser.js.map +1 -1
  417. package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerTeam.js +4 -1
  418. package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerTeam.js.map +1 -1
  419. package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerUser.js +4 -1
  420. package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerUser.js.map +1 -1
  421. package/build/dist/Models/DatabaseModels/WorkflowOwnerTeam.js +3 -1
  422. package/build/dist/Models/DatabaseModels/WorkflowOwnerTeam.js.map +1 -1
  423. package/build/dist/Models/DatabaseModels/WorkflowOwnerUser.js +3 -1
  424. package/build/dist/Models/DatabaseModels/WorkflowOwnerUser.js.map +1 -1
  425. package/build/dist/Server/API/AIAgentDataAPI.js +1 -1
  426. package/build/dist/Server/API/AIChatAPI.js +3 -1
  427. package/build/dist/Server/API/AIChatAPI.js.map +1 -1
  428. package/build/dist/Server/API/AIInvestigationAPI.js +3 -0
  429. package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
  430. package/build/dist/Server/API/StatusPageAPI.js +9 -1
  431. package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
  432. package/build/dist/Server/Infrastructure/Postgres/LocalMigrationGenerationDataSource.js +1 -1
  433. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793500000000-MakeOwnerRowsUnique.js +602 -0
  434. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793500000000-MakeOwnerRowsUnique.js.map +1 -0
  435. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793700000000-AddAIInvestigationDecision.js +14 -0
  436. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793700000000-AddAIInvestigationDecision.js.map +1 -0
  437. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793800000000-RemoveMonitorDescriptionLengthLimit.js +20 -0
  438. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793800000000-RemoveMonitorDescriptionLengthLimit.js.map +1 -0
  439. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +6 -0
  440. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  441. package/build/dist/Server/Middleware/IdentityRateLimit.js +22 -1
  442. package/build/dist/Server/Middleware/IdentityRateLimit.js.map +1 -1
  443. package/build/dist/Server/Middleware/PublicDashboardRateLimit.js +117 -36
  444. package/build/dist/Server/Middleware/PublicDashboardRateLimit.js.map +1 -1
  445. package/build/dist/Server/Services/AlertEpisodeService.js +13 -31
  446. package/build/dist/Server/Services/AlertEpisodeService.js.map +1 -1
  447. package/build/dist/Server/Services/AlertGroupingEngineService.js +7 -4
  448. package/build/dist/Server/Services/AlertGroupingEngineService.js.map +1 -1
  449. package/build/dist/Server/Services/AlertService.js +13 -31
  450. package/build/dist/Server/Services/AlertService.js.map +1 -1
  451. package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js +12 -8
  452. package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js.map +1 -1
  453. package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js +12 -8
  454. package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js.map +1 -1
  455. package/build/dist/Server/Services/DashboardOwnerRuleEngineService.js +12 -8
  456. package/build/dist/Server/Services/DashboardOwnerRuleEngineService.js.map +1 -1
  457. package/build/dist/Server/Services/DatabaseService.js +71 -1
  458. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  459. package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js +12 -8
  460. package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js.map +1 -1
  461. package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js +12 -8
  462. package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js.map +1 -1
  463. package/build/dist/Server/Services/HostOwnerRuleEngineService.js +12 -8
  464. package/build/dist/Server/Services/HostOwnerRuleEngineService.js.map +1 -1
  465. package/build/dist/Server/Services/IncidentEpisodeOwnerRuleEngineService.js +6 -4
  466. package/build/dist/Server/Services/IncidentEpisodeOwnerRuleEngineService.js.map +1 -1
  467. package/build/dist/Server/Services/IncidentEpisodeService.js +15 -68
  468. package/build/dist/Server/Services/IncidentEpisodeService.js.map +1 -1
  469. package/build/dist/Server/Services/IncidentGroupingEngineService.js +7 -4
  470. package/build/dist/Server/Services/IncidentGroupingEngineService.js.map +1 -1
  471. package/build/dist/Server/Services/IncidentService.js +13 -31
  472. package/build/dist/Server/Services/IncidentService.js.map +1 -1
  473. package/build/dist/Server/Services/IncidentTemplateService.js +13 -31
  474. package/build/dist/Server/Services/IncidentTemplateService.js.map +1 -1
  475. package/build/dist/Server/Services/IncomingCallPolicyOwnerRuleEngineService.js +12 -8
  476. package/build/dist/Server/Services/IncomingCallPolicyOwnerRuleEngineService.js.map +1 -1
  477. package/build/dist/Server/Services/IoTFleetOwnerRuleEngineService.js +12 -8
  478. package/build/dist/Server/Services/IoTFleetOwnerRuleEngineService.js.map +1 -1
  479. package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js +12 -8
  480. package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js.map +1 -1
  481. package/build/dist/Server/Services/MonitorService.js +13 -31
  482. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  483. package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js +12 -8
  484. package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js.map +1 -1
  485. package/build/dist/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.js +12 -8
  486. package/build/dist/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.js.map +1 -1
  487. package/build/dist/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.js +12 -8
  488. package/build/dist/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.js.map +1 -1
  489. package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js +12 -8
  490. package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js.map +1 -1
  491. package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js +12 -8
  492. package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js.map +1 -1
  493. package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js +12 -8
  494. package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js.map +1 -1
  495. package/build/dist/Server/Services/RunbookOwnerRuleEngineService.js +12 -8
  496. package/build/dist/Server/Services/RunbookOwnerRuleEngineService.js.map +1 -1
  497. package/build/dist/Server/Services/ScheduledMaintenanceService.js +13 -31
  498. package/build/dist/Server/Services/ScheduledMaintenanceService.js.map +1 -1
  499. package/build/dist/Server/Services/ScheduledMaintenanceTemplateService.js +12 -29
  500. package/build/dist/Server/Services/ScheduledMaintenanceTemplateService.js.map +1 -1
  501. package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js +12 -8
  502. package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js.map +1 -1
  503. package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js +12 -8
  504. package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js.map +1 -1
  505. package/build/dist/Server/Services/StatusPagePrivateUserService.js +33 -25
  506. package/build/dist/Server/Services/StatusPagePrivateUserService.js.map +1 -1
  507. package/build/dist/Server/Services/StatusPagePrivateUserSessionService.js +36 -1
  508. package/build/dist/Server/Services/StatusPagePrivateUserSessionService.js.map +1 -1
  509. package/build/dist/Server/Services/StatusPageService.js +50 -35
  510. package/build/dist/Server/Services/StatusPageService.js.map +1 -1
  511. package/build/dist/Server/Services/UserSessionService.js +5 -0
  512. package/build/dist/Server/Services/UserSessionService.js.map +1 -1
  513. package/build/dist/Server/Services/VMwareVCenterOwnerRuleEngineService.js +12 -8
  514. package/build/dist/Server/Services/VMwareVCenterOwnerRuleEngineService.js.map +1 -1
  515. package/build/dist/Server/Services/WorkflowOwnerRuleEngineService.js +12 -8
  516. package/build/dist/Server/Services/WorkflowOwnerRuleEngineService.js.map +1 -1
  517. package/build/dist/Server/Types/Database/Permissions/OwnedScopePermission.js +15 -10
  518. package/build/dist/Server/Types/Database/Permissions/OwnedScopePermission.js.map +1 -1
  519. package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js +82 -0
  520. package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js.map +1 -1
  521. package/build/dist/Server/Utils/AI/Chat/ChatAgentRunner.js +12 -3
  522. package/build/dist/Server/Utils/AI/Chat/ChatAgentRunner.js.map +1 -1
  523. package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js +32 -4
  524. package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js.map +1 -1
  525. package/build/dist/Server/Utils/AI/CodeFix/CodeAgentWorkspaceGuard.js +1 -1
  526. package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.js +1 -1
  527. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js +8 -5
  528. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -1
  529. package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js +33 -13
  530. package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js.map +1 -1
  531. package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js +31 -10
  532. package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js.map +1 -1
  533. package/build/dist/Server/Utils/AI/SRE/InvestigationEligibility.js +205 -0
  534. package/build/dist/Server/Utils/AI/SRE/InvestigationEligibility.js.map +1 -0
  535. package/build/dist/Server/Utils/AI/SRE/InvestigationQueue.js +13 -0
  536. package/build/dist/Server/Utils/AI/SRE/InvestigationQueue.js.map +1 -1
  537. package/build/dist/Server/Utils/AI/Toolbox/Index.js +30 -6
  538. package/build/dist/Server/Utils/AI/Toolbox/Index.js.map +1 -1
  539. package/build/dist/Server/Utils/AI/Toolbox/ResourceTools.js +721 -0
  540. package/build/dist/Server/Utils/AI/Toolbox/ResourceTools.js.map +1 -0
  541. package/build/dist/Server/Utils/AI/Toolbox/RumTools.js +330 -0
  542. package/build/dist/Server/Utils/AI/Toolbox/RumTools.js.map +1 -0
  543. package/build/dist/Server/Utils/AI/Toolbox/ToolTypes.js.map +1 -1
  544. package/build/dist/Server/Utils/AI/Toolbox/TraceTools.js +1 -1
  545. package/build/dist/Server/Utils/AI/Toolbox/TraceTools.js.map +1 -1
  546. package/build/dist/Server/Utils/Database/PostgresErrorTranslator.js +11 -0
  547. package/build/dist/Server/Utils/Database/PostgresErrorTranslator.js.map +1 -1
  548. package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js +106 -101
  549. package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js.map +1 -1
  550. package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js +4 -2
  551. package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js.map +1 -1
  552. package/build/dist/Server/Utils/Rules/OwnerRuleAssignment.js +94 -0
  553. package/build/dist/Server/Utils/Rules/OwnerRuleAssignment.js.map +1 -1
  554. package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js +171 -6
  555. package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js.map +1 -1
  556. package/build/dist/Types/AI/AIChatPageContext.js +68 -2
  557. package/build/dist/Types/AI/AIChatPageContext.js.map +1 -1
  558. package/build/dist/Types/AI/AIChatTypes.js +4 -0
  559. package/build/dist/Types/AI/AIChatTypes.js.map +1 -1
  560. package/build/dist/Types/AI/AIResourceContext.js +162 -0
  561. package/build/dist/Types/AI/AIResourceContext.js.map +1 -0
  562. package/build/dist/Types/AI/InvestigationNotStartedReason.js +2 -0
  563. package/build/dist/Types/AI/InvestigationNotStartedReason.js.map +1 -0
  564. package/build/dist/Types/Database/UniqueColumnsTogether.js +19 -0
  565. package/build/dist/Types/Database/UniqueColumnsTogether.js.map +1 -0
  566. package/build/dist/Types/Metrics/MetricQueryConfigData.js.map +1 -1
  567. package/build/dist/Types/Rum/WebVitals.js +64 -0
  568. package/build/dist/Types/Rum/WebVitals.js.map +1 -0
  569. package/build/dist/Types/WebsiteRequest.js +2 -0
  570. package/build/dist/Types/WebsiteRequest.js.map +1 -1
  571. package/build/dist/UI/Components/EditionLabel/EditionLabel.js +7 -5
  572. package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
  573. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +7 -0
  574. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  575. package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
  576. package/build/dist/UI/Components/Navbar/NavBarMenuModal.js +4 -2
  577. package/build/dist/UI/Components/Navbar/NavBarMenuModal.js.map +1 -1
  578. package/build/dist/Utils/API.js +8 -4
  579. package/build/dist/Utils/API.js.map +1 -1
  580. package/build/dist/Utils/HTTPResponseBodyReader.js +50 -6
  581. package/build/dist/Utils/HTTPResponseBodyReader.js.map +1 -1
  582. package/build/dist/Utils/Metrics/MetricExplorerUrl.js +14 -3
  583. package/build/dist/Utils/Metrics/MetricExplorerUrl.js.map +1 -1
  584. package/build/dist/Utils/Monitor/MonitorTestAvailabilityUtil.js +68 -0
  585. package/build/dist/Utils/Monitor/MonitorTestAvailabilityUtil.js.map +1 -0
  586. package/build/dist/Utils/Telemetry/HostIpAddresses.js +42 -3
  587. package/build/dist/Utils/Telemetry/HostIpAddresses.js.map +1 -1
  588. package/package.json +5 -5
  589. package/test-setup.sh +2 -2
@@ -23,7 +23,6 @@ import SortOrder from "../../Types/BaseDatabase/SortOrder";
23
23
  import LIMIT_MAX, { LIMIT_PER_PROJECT } from "../../Types/Database/LimitMax";
24
24
  import BadDataException from "../../Types/Exception/BadDataException";
25
25
  import ObjectID from "../../Types/ObjectID";
26
- import Typeof from "../../Types/Typeof";
27
26
  import StatusPageSubscriberNotificationStatus from "../../Types/StatusPage/StatusPageSubscriberNotificationStatus";
28
27
  import Monitor from "../../Models/DatabaseModels/Monitor";
29
28
  import Model from "../../Models/DatabaseModels/ScheduledMaintenance";
@@ -75,6 +74,7 @@ import NotificationRuleWorkspaceChannel from "../../Types/Workspace/Notification
75
74
  import { MessageBlocksByWorkspaceType } from "./WorkspaceNotificationRuleService";
76
75
  import ScheduledMaintenanceWorkspaceMessages from "../Utils/Workspace/WorkspaceMessages/ScheduledMaintenance";
77
76
  import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
77
+ import OwnerRuleAssignment from "../Utils/Rules/OwnerRuleAssignment";
78
78
  import ProjectService from "./ProjectService";
79
79
  import StatusPageSubscriberNotificationTemplateService, {
80
80
  Service as StatusPageSubscriberNotificationTemplateServiceClass,
@@ -1447,39 +1447,18 @@ ${scheduledMaintenance.description || "No description provided."}
1447
1447
  notifyOwners: boolean,
1448
1448
  props: DatabaseCommonInteractionProps,
1449
1449
  ): Promise<void> {
1450
- for (let teamId of teamIds) {
1451
- if (typeof teamId === Typeof.String) {
1452
- teamId = new ObjectID(teamId.toString());
1453
- }
1454
-
1455
- const teamOwner: ScheduledMaintenanceOwnerTeam =
1456
- new ScheduledMaintenanceOwnerTeam();
1457
- teamOwner.scheduledMaintenanceId = scheduledMaintenanceId;
1458
- teamOwner.projectId = projectId;
1459
- teamOwner.teamId = teamId;
1460
- teamOwner.isOwnerNotified = !notifyOwners;
1461
-
1462
- await ScheduledMaintenanceOwnerTeamService.create({
1463
- data: teamOwner,
1464
- props: props,
1465
- });
1466
- }
1467
-
1468
- for (let userId of userIds) {
1469
- if (typeof userId === Typeof.String) {
1470
- userId = new ObjectID(userId.toString());
1471
- }
1472
- const teamOwner: ScheduledMaintenanceOwnerUser =
1473
- new ScheduledMaintenanceOwnerUser();
1474
- teamOwner.scheduledMaintenanceId = scheduledMaintenanceId;
1475
- teamOwner.projectId = projectId;
1476
- teamOwner.isOwnerNotified = !notifyOwners;
1477
- teamOwner.userId = userId;
1478
- await ScheduledMaintenanceOwnerUserService.create({
1479
- data: teamOwner,
1480
- props: props,
1481
- });
1482
- }
1450
+ // Owners already on the event are skipped, not added a second time.
1451
+ await OwnerRuleAssignment.addOwners({
1452
+ ownerUserService: ScheduledMaintenanceOwnerUserService,
1453
+ ownerTeamService: ScheduledMaintenanceOwnerTeamService,
1454
+ resourceIdColumn: "scheduledMaintenanceId",
1455
+ resourceId: scheduledMaintenanceId,
1456
+ projectId: projectId,
1457
+ userIds: userIds,
1458
+ teamIds: teamIds,
1459
+ isOwnerNotified: !notifyOwners,
1460
+ props: props,
1461
+ });
1483
1462
  }
1484
1463
 
1485
1464
  @CaptureSpan()
@@ -4,7 +4,6 @@ import ScheduledMaintenanceTemplateOwnerTeamService from "./ScheduledMaintenance
4
4
  import ScheduledMaintenanceTemplateOwnerUserService from "./ScheduledMaintenanceTemplateOwnerUserService";
5
5
  import DatabaseCommonInteractionProps from "../../Types/BaseDatabase/DatabaseCommonInteractionProps";
6
6
  import ObjectID from "../../Types/ObjectID";
7
- import Typeof from "../../Types/Typeof";
8
7
  import Model from "../../Models/DatabaseModels/ScheduledMaintenanceTemplate";
9
8
  import MonitorStatusService from "./MonitorStatusService";
10
9
  import Dictionary from "../../Types/Dictionary";
@@ -12,8 +11,6 @@ import ProjectScopedReferenceValidator, {
12
11
  ProjectScopedReference,
13
12
  resolveReferenceId,
14
13
  } from "../Utils/Database/ProjectScopedReferenceValidator";
15
- import ScheduledMaintenanceTemplateOwnerTeam from "../../Models/DatabaseModels/ScheduledMaintenanceTemplateOwnerTeam";
16
- import ScheduledMaintenanceTemplateOwnerUser from "../../Models/DatabaseModels/ScheduledMaintenanceTemplateOwnerUser";
17
14
  import CreateBy from "../Types/Database/CreateBy";
18
15
  import OneUptimeDate from "../../Types/Date";
19
16
  import Recurring from "../../Types/Events/Recurring";
@@ -22,6 +19,7 @@ import QueryDeepPartialEntity from "../../Types/Database/PartialEntity";
22
19
  import LIMIT_MAX from "../../Types/Database/LimitMax";
23
20
  import BadDataException from "../../Types/Exception/BadDataException";
24
21
  import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
22
+ import OwnerRuleAssignment from "../Utils/Rules/OwnerRuleAssignment";
25
23
 
26
24
  export class Service extends DatabaseService<Model> {
27
25
  public constructor() {
@@ -385,37 +383,17 @@ export class Service extends DatabaseService<Model> {
385
383
  teamIds: Array<ObjectID>,
386
384
  props: DatabaseCommonInteractionProps,
387
385
  ): Promise<void> {
388
- for (let teamId of teamIds) {
389
- if (typeof teamId === Typeof.String) {
390
- teamId = new ObjectID(teamId.toString());
391
- }
392
-
393
- const teamOwner: ScheduledMaintenanceTemplateOwnerTeam =
394
- new ScheduledMaintenanceTemplateOwnerTeam();
395
- teamOwner.scheduledMaintenanceTemplateId = scheduledMaintenanceTemplateId;
396
- teamOwner.projectId = projectId;
397
- teamOwner.teamId = teamId;
398
-
399
- await ScheduledMaintenanceTemplateOwnerTeamService.create({
400
- data: teamOwner,
401
- props: props,
402
- });
403
- }
404
-
405
- for (let userId of userIds) {
406
- if (typeof userId === Typeof.String) {
407
- userId = new ObjectID(userId.toString());
408
- }
409
- const teamOwner: ScheduledMaintenanceTemplateOwnerUser =
410
- new ScheduledMaintenanceTemplateOwnerUser();
411
- teamOwner.scheduledMaintenanceTemplateId = scheduledMaintenanceTemplateId;
412
- teamOwner.projectId = projectId;
413
- teamOwner.userId = userId;
414
- await ScheduledMaintenanceTemplateOwnerUserService.create({
415
- data: teamOwner,
416
- props: props,
417
- });
418
- }
386
+ // Owners already on the template are skipped, not added a second time.
387
+ await OwnerRuleAssignment.addOwners({
388
+ ownerUserService: ScheduledMaintenanceTemplateOwnerUserService,
389
+ ownerTeamService: ScheduledMaintenanceTemplateOwnerTeamService,
390
+ resourceIdColumn: "scheduledMaintenanceTemplateId",
391
+ resourceId: scheduledMaintenanceTemplateId,
392
+ projectId: projectId,
393
+ userIds: userIds,
394
+ teamIds: teamIds,
395
+ props: props,
396
+ });
419
397
  }
420
398
  }
421
399
  export default new Service();
@@ -240,11 +240,15 @@ class ServerlessFunctionOwnerRuleEngineServiceClass
240
240
  owner.projectId = serverlessFunction.projectId;
241
241
  owner.userId = new ObjectID(userId);
242
242
  owner.isOwnerNotified = !notify;
243
- await ServerlessFunctionOwnerUserService.create({
244
- data: owner,
245
- props: { isRoot: true },
246
- });
247
- ownersAdded++;
243
+ if (
244
+ await OwnerRuleAssignment.createOwner({
245
+ ownerService: ServerlessFunctionOwnerUserService,
246
+ owner: owner,
247
+ props: { isRoot: true },
248
+ })
249
+ ) {
250
+ ownersAdded++;
251
+ }
248
252
  }
249
253
 
250
254
  for (const teamId of teamIds) {
@@ -254,11 +258,15 @@ class ServerlessFunctionOwnerRuleEngineServiceClass
254
258
  owner.projectId = serverlessFunction.projectId;
255
259
  owner.teamId = new ObjectID(teamId);
256
260
  owner.isOwnerNotified = !notify;
257
- await ServerlessFunctionOwnerTeamService.create({
258
- data: owner,
259
- props: { isRoot: true },
260
- });
261
- ownersAdded++;
261
+ if (
262
+ await OwnerRuleAssignment.createOwner({
263
+ ownerService: ServerlessFunctionOwnerTeamService,
264
+ owner: owner,
265
+ props: { isRoot: true },
266
+ })
267
+ ) {
268
+ ownersAdded++;
269
+ }
262
270
  }
263
271
  }
264
272
 
@@ -249,11 +249,15 @@ class ServiceOwnerRuleEngineServiceClass
249
249
  owner.serviceId = service.id;
250
250
  owner.projectId = service.projectId;
251
251
  owner.userId = new ObjectID(userId);
252
- await ServiceOwnerUserService.create({
253
- data: owner,
254
- props: { isRoot: true },
255
- });
256
- ownersAdded++;
252
+ if (
253
+ await OwnerRuleAssignment.createOwner({
254
+ ownerService: ServiceOwnerUserService,
255
+ owner: owner,
256
+ props: { isRoot: true },
257
+ })
258
+ ) {
259
+ ownersAdded++;
260
+ }
257
261
  }
258
262
 
259
263
  for (const teamId of teamIds) {
@@ -261,11 +265,15 @@ class ServiceOwnerRuleEngineServiceClass
261
265
  owner.serviceId = service.id;
262
266
  owner.projectId = service.projectId;
263
267
  owner.teamId = new ObjectID(teamId);
264
- await ServiceOwnerTeamService.create({
265
- data: owner,
266
- props: { isRoot: true },
267
- });
268
- ownersAdded++;
268
+ if (
269
+ await OwnerRuleAssignment.createOwner({
270
+ ownerService: ServiceOwnerTeamService,
271
+ owner: owner,
272
+ props: { isRoot: true },
273
+ })
274
+ ) {
275
+ ownersAdded++;
276
+ }
269
277
  }
270
278
  }
271
279
 
@@ -145,35 +145,6 @@ export class Service extends DatabaseService<Model> {
145
145
  _onCreate: OnCreate<Model>,
146
146
  createdItem: Model,
147
147
  ): Promise<Model> {
148
- /*
149
- * The invite link doubles as this user's first password-reset link, so the
150
- * column has to hold what `/status-page-api/reset-password` looks rows up
151
- * by: the SHA-256 of the token, never the token itself. That endpoint
152
- * hashes whatever the link carried and queries by the digest, so a raw
153
- * token stored here matches nothing and the welcome link is dead on
154
- * arrival -- and it would also leave a working bearer credential sitting
155
- * in the database in plaintext.
156
- *
157
- * Same split as `/status-page-api/forgot-password`: the digest is
158
- * persisted, the raw token is only ever mailed.
159
- */
160
- const token: string = ObjectID.generate().toString();
161
- const hashedToken: string = await HashedString.hashValue(
162
- token,
163
- EncryptionSecret,
164
- );
165
- await this.updateOneById({
166
- id: createdItem.id!,
167
- data: {
168
- resetPasswordToken: hashedToken,
169
- resetPasswordExpires: OneUptimeDate.getOneDayAfter(),
170
- },
171
- props: {
172
- isRoot: true,
173
- ignoreHooks: true,
174
- },
175
- });
176
-
177
148
  if (createdItem.isSsoUser) {
178
149
  return createdItem;
179
150
  }
@@ -190,6 +161,7 @@ export class Service extends DatabaseService<Model> {
190
161
  pageTitle: true,
191
162
  logoFileId: true,
192
163
  projectId: true,
164
+ requireSsoForLogin: true,
193
165
  smtpConfig: {
194
166
  _id: true,
195
167
  transportType: true,
@@ -214,6 +186,43 @@ export class Service extends DatabaseService<Model> {
214
186
  throw new BadDataException("Status Page not found");
215
187
  }
216
188
 
189
+ /*
190
+ * SCIM and admin-created users must follow the page's login policy too.
191
+ * Do not create a password-reset credential when only SSO can be used.
192
+ */
193
+ if (statusPage.requireSsoForLogin) {
194
+ return createdItem;
195
+ }
196
+
197
+ /*
198
+ * The invite link doubles as this user's first password-reset link, so the
199
+ * column has to hold what `/status-page-api/reset-password` looks rows up
200
+ * by: the SHA-256 of the token, never the token itself. That endpoint
201
+ * hashes whatever the link carried and queries by the digest, so a raw
202
+ * token stored here matches nothing and the welcome link is dead on
203
+ * arrival -- and it would also leave a working bearer credential sitting
204
+ * in the database in plaintext.
205
+ *
206
+ * Same split as `/status-page-api/forgot-password`: the digest is
207
+ * persisted, the raw token is only ever mailed.
208
+ */
209
+ const token: string = ObjectID.generate().toString();
210
+ const hashedToken: string = await HashedString.hashValue(
211
+ token,
212
+ EncryptionSecret,
213
+ );
214
+ await this.updateOneById({
215
+ id: createdItem.id!,
216
+ data: {
217
+ resetPasswordToken: hashedToken,
218
+ resetPasswordExpires: OneUptimeDate.getOneDayAfter(),
219
+ },
220
+ props: {
221
+ isRoot: true,
222
+ ignoreHooks: true,
223
+ },
224
+ });
225
+
217
226
  const statusPageName: string | undefined =
218
227
  statusPage.pageTitle || statusPage.name;
219
228
 
@@ -1,4 +1,5 @@
1
1
  import DatabaseService from "./DatabaseService";
2
+ import StatusPagePrivateUserService from "./StatusPagePrivateUserService";
2
3
  import Model from "../../Models/DatabaseModels/StatusPagePrivateUserSession";
3
4
  import ObjectID from "../../Types/ObjectID";
4
5
  import { JSONObject } from "../../Types/JSON";
@@ -9,7 +10,7 @@ import Text from "../../Types/Text";
9
10
  import logger from "../Utils/Logger";
10
11
  import Exception from "../../Types/Exception/Exception";
11
12
  import BadDataException from "../../Types/Exception/BadDataException";
12
- import { JsonContains, MoreThan, UpdateResult } from "typeorm";
13
+ import { IsNull, JsonContains, MoreThan, UpdateResult } from "typeorm";
13
14
 
14
15
  export interface SessionMetadata {
15
16
  session: Model;
@@ -75,6 +76,12 @@ export class Service extends DatabaseService<Model> {
75
76
 
76
77
  public constructor() {
77
78
  super(Model);
79
+
80
+ /*
81
+ * Login codes use this same column for their five-minute expiry. Purge
82
+ * expired credentials and their device metadata after 30 more days.
83
+ */
84
+ this.hardDeleteItemsOlderThanInDays("refreshTokenExpiresAt", 30);
78
85
  }
79
86
 
80
87
  public async createSession(
@@ -98,6 +105,9 @@ export class Service extends DatabaseService<Model> {
98
105
  },
99
106
  });
100
107
 
108
+ // Password sign-in and both SSO callbacks issue their session here.
109
+ await this.recordSuccessfulSignIn(options);
110
+
101
111
  return {
102
112
  session: createdSession,
103
113
  refreshToken,
@@ -233,6 +243,8 @@ export class Service extends DatabaseService<Model> {
233
243
  if (
234
244
  !session?.id ||
235
245
  !session.statusPageId ||
246
+ !session.statusPagePrivateUserId ||
247
+ !session.projectId ||
236
248
  !this.isLoginCodeSession(session) ||
237
249
  session.statusPageId.toString() !== options.statusPageId.toString()
238
250
  ) {
@@ -291,6 +303,12 @@ export class Service extends DatabaseService<Model> {
291
303
 
292
304
  Object.assign(session, updatePayload);
293
305
 
306
+ await this.recordSuccessfulSignIn({
307
+ projectId: session.projectId,
308
+ statusPageId: session.statusPageId,
309
+ statusPagePrivateUserId: session.statusPagePrivateUserId,
310
+ });
311
+
294
312
  return {
295
313
  session,
296
314
  refreshToken,
@@ -365,6 +383,36 @@ export class Service extends DatabaseService<Model> {
365
383
  await this.revokeSessionById(session.id, options);
366
384
  }
367
385
 
386
+ private async recordSuccessfulSignIn(
387
+ options: Pick<
388
+ CreateSessionOptions,
389
+ "projectId" | "statusPageId" | "statusPagePrivateUserId"
390
+ >,
391
+ ): Promise<void> {
392
+ /*
393
+ * Scope the write to the complete identity carried by the session. A
394
+ * deleted or moved user must not gain activity from an old login code.
395
+ */
396
+ try {
397
+ await StatusPagePrivateUserService.getRepository().update(
398
+ {
399
+ _id: options.statusPagePrivateUserId.toString(),
400
+ projectId: options.projectId,
401
+ statusPageId: options.statusPageId,
402
+ deletedAt: IsNull(),
403
+ },
404
+ {
405
+ lastActive: OneUptimeDate.getCurrentDate(),
406
+ },
407
+ );
408
+ } catch {
409
+ // Activity bookkeeping must not burn an already-consumed login code.
410
+ logger.warn(
411
+ `Failed to record sign-in activity for status page private user ${options.statusPagePrivateUserId.toString()}`,
412
+ );
413
+ }
414
+ }
415
+
368
416
  private buildSessionModel(
369
417
  options: CreateSessionOptions,
370
418
  tokenMeta: { refreshToken: string; refreshTokenExpiresAt: Date },
@@ -17,6 +17,7 @@ import StatusPageLabelRuleEngineService from "./StatusPageLabelRuleEngineService
17
17
  import StatusPageOwnerRuleEngineService from "./StatusPageOwnerRuleEngineService";
18
18
  import StatusPageOwnerTeamService from "./StatusPageOwnerTeamService";
19
19
  import StatusPageOwnerUserService from "./StatusPageOwnerUserService";
20
+ import StatusPagePrivateUserSessionService from "./StatusPagePrivateUserSessionService";
20
21
  import TeamMemberService from "./TeamMemberService";
21
22
  import Hostname from "../../Types/API/Hostname";
22
23
  import Protocol from "../../Types/API/Protocol";
@@ -28,12 +29,12 @@ import BadDataException from "../../Types/Exception/BadDataException";
28
29
  import JSONWebTokenData from "../../Types/JsonWebTokenData";
29
30
  import ObjectID from "../../Types/ObjectID";
30
31
  import PositiveNumber from "../../Types/PositiveNumber";
31
- import Typeof from "../../Types/Typeof";
32
32
  import MonitorStatus from "../../Models/DatabaseModels/MonitorStatus";
33
33
  import StatusPage from "../../Models/DatabaseModels/StatusPage";
34
34
  import StatusPageDomain from "../../Models/DatabaseModels/StatusPageDomain";
35
35
  import StatusPageOwnerTeam from "../../Models/DatabaseModels/StatusPageOwnerTeam";
36
36
  import StatusPageOwnerUser from "../../Models/DatabaseModels/StatusPageOwnerUser";
37
+ import StatusPagePrivateUserSession from "../../Models/DatabaseModels/StatusPagePrivateUserSession";
37
38
  import User from "../../Models/DatabaseModels/User";
38
39
  import {
39
40
  AllowedStatusPageCountInFreePlan,
@@ -69,6 +70,7 @@ import UptimeUtil, { UptimeWindow } from "../../Utils/Uptime/UptimeUtil";
69
70
  import UptimePrecision from "../../Types/StatusPage/UptimePrecision";
70
71
  import IP from "../../Types/IP/IP";
71
72
  import { resolveClientIp } from "../Utils/ClientIp";
73
+ import OwnerRuleAssignment from "../Utils/Rules/OwnerRuleAssignment";
72
74
  import NotAuthenticatedException from "../../Types/Exception/NotAuthenticatedException";
73
75
  import ForbiddenException from "../../Types/Exception/ForbiddenException";
74
76
  import MasterPasswordRequiredException from "../../Types/Exception/MasterPasswordRequiredException";
@@ -509,37 +511,18 @@ export class Service extends DatabaseService<StatusPage> {
509
511
  notifyOwners: boolean,
510
512
  props: DatabaseCommonInteractionProps,
511
513
  ): Promise<void> {
512
- for (let teamId of teamIds) {
513
- if (typeof teamId === Typeof.String) {
514
- teamId = new ObjectID(teamId.toString());
515
- }
516
-
517
- const teamOwner: StatusPageOwnerTeam = new StatusPageOwnerTeam();
518
- teamOwner.statusPageId = statusPageId;
519
- teamOwner.projectId = projectId;
520
- teamOwner.teamId = teamId;
521
- teamOwner.isOwnerNotified = !notifyOwners;
522
-
523
- await StatusPageOwnerTeamService.create({
524
- data: teamOwner,
525
- props: props,
526
- });
527
- }
528
-
529
- for (let userId of userIds) {
530
- if (typeof userId === Typeof.String) {
531
- userId = new ObjectID(userId.toString());
532
- }
533
- const teamOwner: StatusPageOwnerUser = new StatusPageOwnerUser();
534
- teamOwner.statusPageId = statusPageId;
535
- teamOwner.projectId = projectId;
536
- teamOwner.userId = userId;
537
- teamOwner.isOwnerNotified = !notifyOwners;
538
- await StatusPageOwnerUserService.create({
539
- data: teamOwner,
540
- props: props,
541
- });
542
- }
514
+ // Owners already on the status page are skipped, not added a second time.
515
+ await OwnerRuleAssignment.addOwners({
516
+ ownerUserService: StatusPageOwnerUserService,
517
+ ownerTeamService: StatusPageOwnerTeamService,
518
+ resourceIdColumn: "statusPageId",
519
+ resourceId: statusPageId,
520
+ projectId: projectId,
521
+ userIds: userIds,
522
+ teamIds: teamIds,
523
+ isOwnerNotified: !notifyOwners,
524
+ props: props,
525
+ });
543
526
  }
544
527
 
545
528
  @CaptureSpan()
@@ -658,10 +641,50 @@ export class Service extends DatabaseService<StatusPage> {
658
641
  token as string,
659
642
  );
660
643
 
661
- if (decoded.statusPageId?.toString() === statusPageId.toString()) {
662
- return {
663
- hasReadAccess: true,
664
- };
644
+ if (
645
+ statusPage &&
646
+ decoded.statusPageId?.toString() === statusPageId.toString() &&
647
+ decoded.sessionId &&
648
+ ObjectID.isValidUUID(decoded.sessionId.toString()) &&
649
+ decoded.userId &&
650
+ ObjectID.isValidUUID(decoded.userId.toString())
651
+ ) {
652
+ /*
653
+ * One primary-key lookup joined to the private user. Do not cache
654
+ * authorization: revocation and soft deletion must take effect on
655
+ * the next request, even while the access JWT remains unexpired.
656
+ */
657
+ const session: StatusPagePrivateUserSession | null =
658
+ await StatusPagePrivateUserSessionService.getQueryBuilder(
659
+ "session",
660
+ )
661
+ .select(["session._id", "session.additionalInfo"])
662
+ .innerJoin("session.statusPagePrivateUser", "privateUser")
663
+ .where("session._id = :sessionId", {
664
+ sessionId: decoded.sessionId.toString(),
665
+ })
666
+ .andWhere("session.statusPageId = :statusPageId", {
667
+ statusPageId: statusPageId.toString(),
668
+ })
669
+ .andWhere("session.statusPagePrivateUserId = :userId", {
670
+ userId: decoded.userId.toString(),
671
+ })
672
+ .andWhere("privateUser.statusPageId = :statusPageId")
673
+ .andWhere("privateUser.deletedAt IS NULL")
674
+ .andWhere("session.isRevoked = false")
675
+ .andWhere("session.refreshTokenExpiresAt > :now", {
676
+ now: OneUptimeDate.getCurrentDate(),
677
+ })
678
+ .getOne();
679
+
680
+ if (
681
+ session &&
682
+ !StatusPagePrivateUserSessionService.isLoginCodeSession(session)
683
+ ) {
684
+ return {
685
+ hasReadAccess: true,
686
+ };
687
+ }
665
688
  }
666
689
  } catch (err) {
667
690
  logger.error(err, {
@@ -58,6 +58,12 @@ export class Service extends DatabaseService<Model> {
58
58
 
59
59
  public constructor() {
60
60
  super(Model);
61
+
62
+ /*
63
+ * Bound retention of expired and revoked sessions, including device data,
64
+ * without deleting sessions that have renewed their refresh credentials.
65
+ */
66
+ this.hardDeleteItemsOlderThanInDays("refreshTokenExpiresAt", 30);
61
67
  }
62
68
 
63
69
  public async createSession(
@@ -253,11 +253,15 @@ class VMwareVCenterOwnerRuleEngineServiceClass
253
253
  owner.projectId = vmwareVCenter.projectId;
254
254
  owner.userId = new ObjectID(userId);
255
255
  owner.isOwnerNotified = !notify;
256
- await VMwareVCenterOwnerUserService.create({
257
- data: owner,
258
- props: { isRoot: true },
259
- });
260
- ownersAdded++;
256
+ if (
257
+ await OwnerRuleAssignment.createOwner({
258
+ ownerService: VMwareVCenterOwnerUserService,
259
+ owner: owner,
260
+ props: { isRoot: true },
261
+ })
262
+ ) {
263
+ ownersAdded++;
264
+ }
261
265
  }
262
266
 
263
267
  for (const teamId of teamIds) {
@@ -266,11 +270,15 @@ class VMwareVCenterOwnerRuleEngineServiceClass
266
270
  owner.projectId = vmwareVCenter.projectId;
267
271
  owner.teamId = new ObjectID(teamId);
268
272
  owner.isOwnerNotified = !notify;
269
- await VMwareVCenterOwnerTeamService.create({
270
- data: owner,
271
- props: { isRoot: true },
272
- });
273
- ownersAdded++;
273
+ if (
274
+ await OwnerRuleAssignment.createOwner({
275
+ ownerService: VMwareVCenterOwnerTeamService,
276
+ owner: owner,
277
+ props: { isRoot: true },
278
+ })
279
+ ) {
280
+ ownersAdded++;
281
+ }
274
282
  }
275
283
  }
276
284
 
@@ -245,11 +245,15 @@ class WorkflowOwnerRuleEngineServiceClass
245
245
  owner.projectId = workflow.projectId;
246
246
  owner.userId = new ObjectID(userId);
247
247
  owner.isOwnerNotified = !notify;
248
- await WorkflowOwnerUserService.create({
249
- data: owner,
250
- props: { isRoot: true },
251
- });
252
- ownersAdded++;
248
+ if (
249
+ await OwnerRuleAssignment.createOwner({
250
+ ownerService: WorkflowOwnerUserService,
251
+ owner: owner,
252
+ props: { isRoot: true },
253
+ })
254
+ ) {
255
+ ownersAdded++;
256
+ }
253
257
  }
254
258
 
255
259
  for (const teamId of teamIds) {
@@ -258,11 +262,15 @@ class WorkflowOwnerRuleEngineServiceClass
258
262
  owner.projectId = workflow.projectId;
259
263
  owner.teamId = new ObjectID(teamId);
260
264
  owner.isOwnerNotified = !notify;
261
- await WorkflowOwnerTeamService.create({
262
- data: owner,
263
- props: { isRoot: true },
264
- });
265
- ownersAdded++;
265
+ if (
266
+ await OwnerRuleAssignment.createOwner({
267
+ ownerService: WorkflowOwnerTeamService,
268
+ owner: owner,
269
+ props: { isRoot: true },
270
+ })
271
+ ) {
272
+ ownersAdded++;
273
+ }
266
274
  }
267
275
  }
268
276