@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
@@ -0,0 +1,25 @@
1
+ import { MigrationInterface, QueryRunner } from "typeorm";
2
+
3
+ export class AddAIInvestigationDecision1793700000000
4
+ implements MigrationInterface
5
+ {
6
+ public name: string = "AddAIInvestigationDecision1793700000000";
7
+
8
+ public async up(queryRunner: QueryRunner): Promise<void> {
9
+ await queryRunner.query(
10
+ `ALTER TABLE "Incident" ADD "aiInvestigationDecision" jsonb`,
11
+ );
12
+ await queryRunner.query(
13
+ `ALTER TABLE "Alert" ADD "aiInvestigationDecision" jsonb`,
14
+ );
15
+ }
16
+
17
+ public async down(queryRunner: QueryRunner): Promise<void> {
18
+ await queryRunner.query(
19
+ `ALTER TABLE "Alert" DROP COLUMN "aiInvestigationDecision"`,
20
+ );
21
+ await queryRunner.query(
22
+ `ALTER TABLE "Incident" DROP COLUMN "aiInvestigationDecision"`,
23
+ );
24
+ }
25
+ }
@@ -0,0 +1,31 @@
1
+ import { MigrationInterface, QueryRunner } from "typeorm";
2
+
3
+ /*
4
+ * Generated with npm run generate-postgres-migration. Replace TypeORM's
5
+ * DROP/ADD pairs with equivalent in-place type changes to preserve existing
6
+ * descriptions. Rollback refuses values over 500 characters instead of
7
+ * silently truncating them.
8
+ */
9
+ export class RemoveMonitorDescriptionLengthLimit1793800000000
10
+ implements MigrationInterface
11
+ {
12
+ public name: string = "RemoveMonitorDescriptionLengthLimit1793800000000";
13
+
14
+ public async up(queryRunner: QueryRunner): Promise<void> {
15
+ await queryRunner.query(
16
+ `ALTER TABLE "MonitorTemplate" ALTER COLUMN "monitorDescription" TYPE text`,
17
+ );
18
+ await queryRunner.query(
19
+ `ALTER TABLE "Monitor" ALTER COLUMN "description" TYPE text`,
20
+ );
21
+ }
22
+
23
+ public async down(queryRunner: QueryRunner): Promise<void> {
24
+ await queryRunner.query(
25
+ `ALTER TABLE "Monitor" ALTER COLUMN "description" TYPE character varying(500)`,
26
+ );
27
+ await queryRunner.query(
28
+ `ALTER TABLE "MonitorTemplate" ALTER COLUMN "monitorDescription" TYPE character varying(500)`,
29
+ );
30
+ }
31
+ }
@@ -1,3 +1,5 @@
1
+ import { AddAIInvestigationDecision1793700000000 } from "./1793700000000-AddAIInvestigationDecision";
2
+ import { RemoveMonitorDescriptionLengthLimit1793800000000 } from "./1793800000000-RemoveMonitorDescriptionLengthLimit";
1
3
  import { AddConfigurableRuleCriteria1792500000000 } from "./1792500000000-AddConfigurableRuleCriteria";
2
4
  import { AddGoogleSecOpsDiagnostics1792300000000 } from "./1792300000000-AddGoogleSecOpsDiagnostics";
3
5
  import { AddIncomingCallPolicyPhoneNumbers1792600000000 } from "./1792600000000-AddIncomingCallPolicyPhoneNumbers";
@@ -9,6 +11,7 @@ import { SloProductOverhaul1793100000000 } from "./1793100000000-SloProductOverh
9
11
  import { BackfillSloMonitorRulesAndAffectedResources1793200000000 } from "./1793200000000-BackfillSloMonitorRulesAndAffectedResources";
10
12
  import { AddDataResidencyToProject1793300000000 } from "./1793300000000-AddDataResidencyToProject";
11
13
  import { AddSubscriberUpdateNotificationStatus1793400000000 } from "./1793400000000-AddSubscriberUpdateNotificationStatus";
14
+ import { MakeOwnerRowsUnique1793500000000 } from "./1793500000000-MakeOwnerRowsUnique";
12
15
  import { AddSloBurnRateRuleIncidents1792400000000 } from "./1792400000000-AddSloBurnRateRuleIncidents";
13
16
  import { AddUserWebAuthnPurpose1792200000000 } from "./1792200000000-AddUserWebAuthnPurpose";
14
17
  import InitialMigration from "./1717605043663-InitialMigration";
@@ -1194,4 +1197,7 @@ export default [
1194
1197
  BackfillSloMonitorRulesAndAffectedResources1793200000000,
1195
1198
  AddDataResidencyToProject1793300000000,
1196
1199
  AddSubscriberUpdateNotificationStatus1793400000000,
1200
+ MakeOwnerRowsUnique1793500000000,
1201
+ AddAIInvestigationDecision1793700000000,
1202
+ RemoveMonitorDescriptionLengthLimit1793800000000,
1197
1203
  ];
@@ -1,11 +1,13 @@
1
- To create a new migration:
1
+ To create a new migration, run this from the repository root and then register
2
+ the generated class in `Index.ts` (import it and append it to the exported array):
2
3
 
3
4
  ```
4
- bash migration-create.sh <name>
5
+ npm run generate-postgres-migration
5
6
  ```
6
7
 
7
- To run a migration:
8
+ Registered migrations run when the app starts. To check that the registered
9
+ migrations match the models:
8
10
 
9
11
  ```
10
- bash migration-run.sh
12
+ npm run check-postgres-schema-drift
11
13
  ```
@@ -14,7 +14,9 @@ import TooManyRequestsException from "../../Types/Exception/TooManyRequestsExcep
14
14
  * Attempt limiting for the anonymous identity routes that accept a
15
15
  * credential: POST /login, POST /verify-totp-auth, POST /verify-webauthn-auth
16
16
  * and POST /verify-totp-enrolment
17
- * (App/FeatureSet/Identity/API/Authentication.ts).
17
+ * (App/FeatureSet/Identity/API/Authentication.ts), and the status page
18
+ * private user POST /login
19
+ * (App/FeatureSet/Identity/API/StatusPageAuthentication.ts).
18
20
  *
19
21
  * WHY THESE ROUTES NEED IT
20
22
  *
@@ -111,6 +113,14 @@ export enum IdentityRateLimitBucket {
111
113
  /* POST /login. Password guessing. */
112
114
  Login = "login",
113
115
 
116
+ /*
117
+ * POST /status-page/login -- a status page private user's password. The
118
+ * same guessing as /login against a different set of accounts, so its own
119
+ * counter: attempts against a status page login must not refuse dashboard
120
+ * sign-ins from the same address, or the other way round.
121
+ */
122
+ StatusPageLogin = "status-page-login",
123
+
114
124
  /*
115
125
  * POST /verify-totp-auth, POST /verify-webauthn-auth and
116
126
  * POST /verify-totp-enrolment -- the second step, reached with a valid
@@ -227,6 +237,25 @@ const LOGIN_BUCKET: BucketConfig = {
227
237
  ),
228
238
  };
229
239
 
240
+ /*
241
+ * Status page private user password budget. The same numbers as the dashboard
242
+ * login for the same reasons, with its own settings.
243
+ */
244
+ const STATUS_PAGE_LOGIN_BUCKET: BucketConfig = {
245
+ windowSeconds: parsePositiveIntFromEnv(
246
+ "IDENTITY_STATUS_PAGE_LOGIN_RATE_LIMIT_WINDOW_SECONDS",
247
+ 15 * 60,
248
+ ),
249
+ perAccountLimit: parsePositiveIntFromEnv(
250
+ "IDENTITY_STATUS_PAGE_LOGIN_RATE_LIMIT_PER_ACCOUNT_PER_WINDOW",
251
+ 10,
252
+ ),
253
+ perIpLimit: parsePositiveIntFromEnv(
254
+ "IDENTITY_STATUS_PAGE_LOGIN_RATE_LIMIT_PER_IP_PER_WINDOW",
255
+ 150,
256
+ ),
257
+ };
258
+
230
259
  /*
231
260
  * Second step budget.
232
261
  *
@@ -541,6 +570,10 @@ export default class IdentityRateLimit {
541
570
  return WEBAUTHN_CHALLENGE_BUCKET;
542
571
  }
543
572
 
573
+ if (bucket === IdentityRateLimitBucket.StatusPageLogin) {
574
+ return STATUS_PAGE_LOGIN_BUCKET;
575
+ }
576
+
544
577
  return LOGIN_BUCKET;
545
578
  }
546
579
 
@@ -21,15 +21,23 @@ import TooManyRequestsException from "../../Types/Exception/TooManyRequestsExcep
21
21
  * Why this exists: holding a public dashboard id was previously enough to
22
22
  * drive unbounded ClickHouse and Postgres work — a 400-day SLO-style
23
23
  * aggregation, or a metrics aggregation at the finest bucket interval,
24
- * issued in a loop. /master-password was worse still: it verifies a bcrypt
24
+ * issued in a loop. /master-password was worse still: it verifies a scrypt
25
25
  * hash per request, so with no attempt limit it is an online
26
- * password-guessing oracle that also burns a CPU-bound hash per guess.
26
+ * password-guessing oracle that also burns a CPU- and memory-bound hash per
27
+ * guess.
27
28
  *
28
29
  * One limiter covers the whole surface rather than per-route budgets. The
29
30
  * routes differ enormously in cost, but the thing being bounded is request
30
31
  * volume from a single origin, and a uniform ceiling is the one an operator
31
32
  * can reason about. Only /master-password gets its own, much tighter bucket,
32
33
  * because it is the one route where the abuse is guessing rather than load.
34
+ *
35
+ * The status page master password route (/status-page-api/master-password,
36
+ * rewritten to /api/status-page) is the same oracle on a different surface,
37
+ * so it is served by this limiter too, on a bucket of its own. It shares the
38
+ * mechanics — two counters, trusted client address, fail closed — but not the
39
+ * counters themselves: its keys live under a separate prefix, so guesses
40
+ * against a status page neither spend nor draw on a dashboard's allowance.
33
41
  */
34
42
 
35
43
  /*
@@ -50,6 +58,10 @@ import TooManyRequestsException from "../../Types/Exception/TooManyRequestsExcep
50
58
  * allowance for free.
51
59
  */
52
60
  export enum PublicDashboardRateLimitScope {
61
+ /*
62
+ * The per-resource counter: the dashboard, or the status page for the
63
+ * status page bucket.
64
+ */
53
65
  Dashboard = "dashboard",
54
66
  Ip = "ip",
55
67
  }
@@ -58,8 +70,14 @@ export enum PublicDashboardRateLimitBucket {
58
70
  /* Every public dashboard read route. */
59
71
  Read = "read",
60
72
 
61
- /* /master-password only. Tighter, because each request costs a bcrypt. */
73
+ /*
74
+ * Dashboard /master-password only. Tighter, because each request costs a
75
+ * password hash.
76
+ */
62
77
  MasterPassword = "master-password",
78
+
79
+ /* Status page /master-password. Same budget shape, separate counters. */
80
+ StatusPageMasterPassword = "status-page-master-password",
63
81
  }
64
82
 
65
83
  export enum PublicDashboardRateLimitOutcome {
@@ -107,12 +125,59 @@ const parsePositiveIntFromEnv: (envKey: string, fallback: number) => number = (
107
125
  return parsedValue;
108
126
  };
109
127
 
128
+ /*
129
+ * A public surface the limiter serves. Everything that differs between the
130
+ * dashboard and status page routes lives here, so the counting and decision
131
+ * logic below stays one implementation.
132
+ */
133
+ interface RateLimitedSurface {
134
+ /*
135
+ * Redis namespace. One per surface, so the two never share a counter and a
136
+ * SCAN for one surface's keys never shows the other's.
137
+ */
138
+ keyPrefix: string;
139
+
140
+ /* Marks the per-resource counter in the key. */
141
+ resourceKeyTag: string;
142
+
143
+ /* What the per-resource counter is called in log lines. */
144
+ resourceLabel: string;
145
+
146
+ /* The resource this request is about, as a bounded key segment. */
147
+ resolveResourceKey: (req: ExpressRequest) => string;
148
+ }
149
+
110
150
  interface BucketConfig {
111
151
  windowSeconds: number;
112
- perDashboardLimit: number;
152
+ perResourceLimit: number;
113
153
  perIpLimit: number;
154
+ surface: RateLimitedSurface;
155
+
156
+ /*
157
+ * An authentication attempt counter rather than a load control: refuses
158
+ * when the counter is unavailable, and says "password" when it rejects.
159
+ */
160
+ isPasswordAttempt: boolean;
114
161
  }
115
162
 
163
+ const DASHBOARD_SURFACE: RateLimitedSurface = {
164
+ keyPrefix: "pdash:rl:",
165
+ resourceKeyTag: "d",
166
+ resourceLabel: "dashboard",
167
+ resolveResourceKey: (req: ExpressRequest): string => {
168
+ return PublicDashboardRateLimit.resolveDashboardKey(req);
169
+ },
170
+ };
171
+
172
+ const STATUS_PAGE_SURFACE: RateLimitedSurface = {
173
+ keyPrefix: "pspage:rl:",
174
+ resourceKeyTag: "s",
175
+ resourceLabel: "status page",
176
+ resolveResourceKey: (req: ExpressRequest): string => {
177
+ return PublicDashboardRateLimit.resolveStatusPageKey(req);
178
+ },
179
+ };
180
+
116
181
  /*
117
182
  * Read budget.
118
183
  *
@@ -135,7 +200,7 @@ const READ_BUCKET: BucketConfig = {
135
200
  "PUBLIC_DASHBOARD_RATE_LIMIT_WINDOW_SECONDS",
136
201
  60,
137
202
  ),
138
- perDashboardLimit: parsePositiveIntFromEnv(
203
+ perResourceLimit: parsePositiveIntFromEnv(
139
204
  "PUBLIC_DASHBOARD_RATE_LIMIT_PER_DASHBOARD_PER_WINDOW",
140
205
  600,
141
206
  ),
@@ -143,21 +208,23 @@ const READ_BUCKET: BucketConfig = {
143
208
  "PUBLIC_DASHBOARD_RATE_LIMIT_PER_IP_PER_WINDOW",
144
209
  1800,
145
210
  ),
211
+ surface: DASHBOARD_SURFACE,
212
+ isPasswordAttempt: false,
146
213
  };
147
214
 
148
215
  /*
149
216
  * Master password budget. This is an authentication attempt counter, not a
150
217
  * load control, so it is sized for humans rather than for load: 15 tries per
151
218
  * 15 minutes covers a team behind one office address each mistyping a shared
152
- * password, and still takes guessing from roughly 600 attempts a minute (what
153
- * a bcrypt verify allows unthrottled) down to one a minute.
219
+ * password, and still takes guessing from as fast as the process can hash
220
+ * down to one a minute.
154
221
  */
155
222
  const MASTER_PASSWORD_BUCKET: BucketConfig = {
156
223
  windowSeconds: parsePositiveIntFromEnv(
157
224
  "PUBLIC_DASHBOARD_MASTER_PASSWORD_RATE_LIMIT_WINDOW_SECONDS",
158
225
  15 * 60,
159
226
  ),
160
- perDashboardLimit: parsePositiveIntFromEnv(
227
+ perResourceLimit: parsePositiveIntFromEnv(
161
228
  "PUBLIC_DASHBOARD_MASTER_PASSWORD_RATE_LIMIT_PER_DASHBOARD_PER_WINDOW",
162
229
  15,
163
230
  ),
@@ -165,9 +232,31 @@ const MASTER_PASSWORD_BUCKET: BucketConfig = {
165
232
  "PUBLIC_DASHBOARD_MASTER_PASSWORD_RATE_LIMIT_PER_IP_PER_WINDOW",
166
233
  45,
167
234
  ),
235
+ surface: DASHBOARD_SURFACE,
236
+ isPasswordAttempt: true,
168
237
  };
169
238
 
170
- const KEY_PREFIX: string = "pdash:rl:";
239
+ /*
240
+ * Status page master password budget. Same reasoning and the same defaults as
241
+ * the dashboard one, with its own settings so an operator can tune one
242
+ * surface without touching the other.
243
+ */
244
+ const STATUS_PAGE_MASTER_PASSWORD_BUCKET: BucketConfig = {
245
+ windowSeconds: parsePositiveIntFromEnv(
246
+ "STATUS_PAGE_MASTER_PASSWORD_RATE_LIMIT_WINDOW_SECONDS",
247
+ 15 * 60,
248
+ ),
249
+ perResourceLimit: parsePositiveIntFromEnv(
250
+ "STATUS_PAGE_MASTER_PASSWORD_RATE_LIMIT_PER_STATUS_PAGE_PER_WINDOW",
251
+ 15,
252
+ ),
253
+ perIpLimit: parsePositiveIntFromEnv(
254
+ "STATUS_PAGE_MASTER_PASSWORD_RATE_LIMIT_PER_IP_PER_WINDOW",
255
+ 45,
256
+ ),
257
+ surface: STATUS_PAGE_SURFACE,
258
+ isPasswordAttempt: true,
259
+ };
171
260
 
172
261
  /*
173
262
  * Counter keys outlive their window by one full window, so a request landing
@@ -276,6 +365,30 @@ export default class PublicDashboardRateLimit {
276
365
  return "invalid";
277
366
  }
278
367
 
368
+ /*
369
+ * The status page this request is about, as a key segment.
370
+ *
371
+ * The status page master password route names it only by :statusPageId,
372
+ * and a value that is not an id cannot match a status page, so there is no
373
+ * domain form here: everything else shares the one "invalid" bucket, which
374
+ * bounds Redis memory against junk path segments.
375
+ */
376
+ public static resolveStatusPageKey(req: ExpressRequest): string {
377
+ const raw: unknown = req.params?.["statusPageId"];
378
+
379
+ if (typeof raw !== "string" || raw.trim().length === 0) {
380
+ return "none";
381
+ }
382
+
383
+ const value: string = raw.trim();
384
+
385
+ if (ObjectID.isValidUUID(value)) {
386
+ return `id:${value.toLowerCase()}`;
387
+ }
388
+
389
+ return "invalid";
390
+ }
391
+
279
392
  private static sanitizeKeySegment(value: string): string {
280
393
  return (
281
394
  value
@@ -291,9 +404,14 @@ export default class PublicDashboardRateLimit {
291
404
  private static getBucketConfig(
292
405
  bucket: PublicDashboardRateLimitBucket,
293
406
  ): BucketConfig {
294
- return bucket === PublicDashboardRateLimitBucket.MasterPassword
295
- ? MASTER_PASSWORD_BUCKET
296
- : READ_BUCKET;
407
+ switch (bucket) {
408
+ case PublicDashboardRateLimitBucket.MasterPassword:
409
+ return MASTER_PASSWORD_BUCKET;
410
+ case PublicDashboardRateLimitBucket.StatusPageMasterPassword:
411
+ return STATUS_PAGE_MASTER_PASSWORD_BUCKET;
412
+ default:
413
+ return READ_BUCKET;
414
+ }
297
415
  }
298
416
 
299
417
  /*
@@ -304,7 +422,8 @@ export default class PublicDashboardRateLimit {
304
422
  * created a key.
305
423
  */
306
424
  public static async consume(data: {
307
- dashboardKey: string;
425
+ /* From resolveDashboardKey or resolveStatusPageKey, to match the bucket. */
426
+ resourceKey: string;
308
427
  clientIp: string;
309
428
  bucket: PublicDashboardRateLimitBucket;
310
429
  }): Promise<PublicDashboardRateLimitDecision> {
@@ -321,14 +440,16 @@ export default class PublicDashboardRateLimit {
321
440
  const windowMs: number = config.windowSeconds * 1000;
322
441
  const windowIndex: number = Math.floor(Date.now() / windowMs);
323
442
 
324
- const dashboardCounterKey: string = `${KEY_PREFIX}${data.bucket}:d:${data.dashboardKey}:${data.clientIp}:${windowIndex}`;
325
- const ipCounterKey: string = `${KEY_PREFIX}${data.bucket}:i:${data.clientIp}:${windowIndex}`;
443
+ const surface: RateLimitedSurface = config.surface;
444
+
445
+ const resourceCounterKey: string = `${surface.keyPrefix}${data.bucket}:${surface.resourceKeyTag}:${data.resourceKey}:${data.clientIp}:${windowIndex}`;
446
+ const ipCounterKey: string = `${surface.keyPrefix}${data.bucket}:i:${data.clientIp}:${windowIndex}`;
326
447
 
327
448
  try {
328
449
  const pipelineResults: Array<[Error | null, unknown]> | null =
329
450
  (await client
330
451
  .pipeline()
331
- .incr(dashboardCounterKey)
452
+ .incr(resourceCounterKey)
332
453
  .incr(ipCounterKey)
333
454
  .exec()) as Array<[Error | null, unknown]> | null;
334
455
 
@@ -336,7 +457,7 @@ export default class PublicDashboardRateLimit {
336
457
  throw new Error("Rate limit pipeline returned no result");
337
458
  }
338
459
 
339
- const dashboardCount: number = PublicDashboardRateLimit.readCounterResult(
460
+ const resourceCount: number = PublicDashboardRateLimit.readCounterResult(
340
461
  pipelineResults[0],
341
462
  );
342
463
  const ipCount: number = PublicDashboardRateLimit.readCounterResult(
@@ -352,8 +473,8 @@ export default class PublicDashboardRateLimit {
352
473
  const ttlSeconds: number = config.windowSeconds * TTL_MULTIPLIER;
353
474
  const keysToExpire: Array<string> = [];
354
475
 
355
- if (dashboardCount === 1) {
356
- keysToExpire.push(dashboardCounterKey);
476
+ if (resourceCount === 1) {
477
+ keysToExpire.push(resourceCounterKey);
357
478
  }
358
479
 
359
480
  if (ipCount === 1) {
@@ -375,17 +496,17 @@ export default class PublicDashboardRateLimit {
375
496
  PublicDashboardRateLimit.getSecondsUntilWindowEnd(config.windowSeconds);
376
497
 
377
498
  /*
378
- * Dashboard counter is reported first when both are over, because it is
379
- * the more specific of the two and the more useful thing to see in a log
380
- * line.
499
+ * The per-resource counter is reported first when both are over,
500
+ * because it is the more specific of the two and the more useful thing
501
+ * to see in a log line.
381
502
  */
382
- if (dashboardCount > config.perDashboardLimit) {
503
+ if (resourceCount > config.perResourceLimit) {
383
504
  return {
384
505
  outcome: PublicDashboardRateLimitOutcome.RateLimited,
385
506
  retryAfterSeconds,
386
507
  scope: PublicDashboardRateLimitScope.Dashboard,
387
508
  isFirstRejectionInWindow:
388
- dashboardCount === config.perDashboardLimit + 1,
509
+ resourceCount === config.perResourceLimit + 1,
389
510
  };
390
511
  }
391
512
 
@@ -407,7 +528,7 @@ export default class PublicDashboardRateLimit {
407
528
  */
408
529
  if (PublicDashboardRateLimit.shouldLogCounterUnavailable(data.bucket)) {
409
530
  logger.warn(
410
- `PublicDashboardRateLimit: counter failed for ${data.dashboardKey}`,
531
+ `PublicDashboardRateLimit: counter failed for ${config.surface.resourceLabel} ${data.resourceKey}`,
411
532
  );
412
533
  logger.warn(err);
413
534
  }
@@ -450,8 +571,9 @@ export default class PublicDashboardRateLimit {
450
571
 
451
572
  /*
452
573
  * Express middleware. Registered ahead of UserMiddleware on every public
453
- * dashboard route so a flood is rejected before it costs a session lookup,
454
- * let alone a database read.
574
+ * dashboard route, and on the status page master password route, so a
575
+ * flood is rejected before it costs a session lookup, let alone a database
576
+ * read or a password hash.
455
577
  */
456
578
  public static getMiddleware(
457
579
  bucket: PublicDashboardRateLimitBucket = PublicDashboardRateLimitBucket.Read,
@@ -465,13 +587,14 @@ export default class PublicDashboardRateLimit {
465
587
  res: ExpressResponse,
466
588
  next: NextFunction,
467
589
  ): Promise<void> => {
468
- const dashboardKey: string =
469
- PublicDashboardRateLimit.resolveDashboardKey(req);
590
+ const config: BucketConfig =
591
+ PublicDashboardRateLimit.getBucketConfig(bucket);
592
+ const resourceKey: string = config.surface.resolveResourceKey(req);
470
593
  const clientIp: string = PublicDashboardRateLimit.resolveClientIp(req);
471
594
 
472
595
  const decision: PublicDashboardRateLimitDecision =
473
596
  await PublicDashboardRateLimit.consume({
474
- dashboardKey,
597
+ resourceKey,
475
598
  clientIp,
476
599
  bucket,
477
600
  });
@@ -485,8 +608,13 @@ export default class PublicDashboardRateLimit {
485
608
  }
486
609
 
487
610
  if (decision.isFirstRejectionInWindow) {
611
+ const scopeLabel: string =
612
+ decision.scope === PublicDashboardRateLimitScope.Ip
613
+ ? "ip"
614
+ : config.surface.resourceLabel;
615
+
488
616
  logger.warn(
489
- `PublicDashboardRateLimit: rejected ${bucket} request for ${dashboardKey} from ${clientIp} (${decision.scope} limit)`,
617
+ `PublicDashboardRateLimit: rejected ${bucket} request for ${config.surface.resourceLabel} ${resourceKey} from ${clientIp} (${scopeLabel} limit)`,
490
618
  );
491
619
  }
492
620
 
@@ -494,7 +622,7 @@ export default class PublicDashboardRateLimit {
494
622
  req,
495
623
  res,
496
624
  new TooManyRequestsException(
497
- bucket === PublicDashboardRateLimitBucket.MasterPassword
625
+ config.isPasswordAttempt
498
626
  ? "Too many password attempts. Please try again later."
499
627
  : "Too many requests. Please try again later.",
500
628
  ),
@@ -505,7 +633,8 @@ export default class PublicDashboardRateLimit {
505
633
  decision.outcome === PublicDashboardRateLimitOutcome.CounterUnavailable
506
634
  ) {
507
635
  /*
508
- * The two buckets fail in opposite directions, on purpose.
636
+ * The read and password buckets fail in opposite directions, on
637
+ * purpose.
509
638
  *
510
639
  * Reads fail OPEN. These are unauthenticated read-only endpoints and
511
640
  * the counter is a load control; blacking out every customer's public
@@ -513,15 +642,16 @@ export default class PublicDashboardRateLimit {
513
642
  * unbounded window for the duration of that blip, which is itself
514
643
  * alarmed on.
515
644
  *
516
- * /master-password fails CLOSED. There the counter is not a load
517
- * control, it is the only thing bounding password guesses. Serving
518
- * the endpoint without it means serving an unlimited guessing oracle,
519
- * so we answer 503 and let the viewer retry when Redis is back.
645
+ * /master-password (dashboard and status page alike) fails CLOSED.
646
+ * There the counter is not a load control, it is the only thing
647
+ * bounding password guesses. Serving the endpoint without it means
648
+ * serving an unlimited guessing oracle, so we answer 503 and let the
649
+ * viewer retry when Redis is back.
520
650
  */
521
- if (bucket === PublicDashboardRateLimitBucket.MasterPassword) {
651
+ if (config.isPasswordAttempt) {
522
652
  if (PublicDashboardRateLimit.shouldLogCounterUnavailable(bucket)) {
523
653
  logger.error(
524
- `PublicDashboardRateLimit: rate limit counter unavailable, refusing master password attempts for ${dashboardKey}`,
654
+ `PublicDashboardRateLimit: rate limit counter unavailable, refusing master password attempts for ${config.surface.resourceLabel} ${resourceKey}`,
525
655
  );
526
656
  }
527
657
 
@@ -47,8 +47,8 @@ import { LIMIT_PER_PROJECT } from "../../Types/Database/LimitMax";
47
47
  import NotificationRuleWorkspaceChannel from "../../Types/Workspace/NotificationRules/NotificationRuleWorkspaceChannel";
48
48
  import WorkspaceType from "../../Types/Workspace/WorkspaceType";
49
49
  import AlertEpisodeWorkspaceMessages from "../Utils/Workspace/WorkspaceMessages/AlertEpisode";
50
+ import OwnerRuleAssignment from "../Utils/Rules/OwnerRuleAssignment";
50
51
  import { MessageBlocksByWorkspaceType } from "./WorkspaceNotificationRuleService";
51
- import Typeof from "../../Types/Typeof";
52
52
  import AlertService from "./AlertService";
53
53
  import OnCallDutyPolicyService from "./OnCallDutyPolicyService";
54
54
  import AlertEpisodeLabelRuleEngineService from "./AlertEpisodeLabelRuleEngineService";
@@ -1277,39 +1277,18 @@ export class Service extends DatabaseService<Model> {
1277
1277
  notifyOwners: boolean,
1278
1278
  props: DatabaseCommonInteractionProps,
1279
1279
  ): Promise<void> {
1280
- for (let teamId of teamIds) {
1281
- if (typeof teamId === Typeof.String) {
1282
- teamId = new ObjectID(teamId.toString());
1283
- }
1284
-
1285
- const teamOwner: AlertEpisodeOwnerTeam = new AlertEpisodeOwnerTeam();
1286
- teamOwner.alertEpisodeId = episodeId;
1287
- teamOwner.projectId = projectId;
1288
- teamOwner.teamId = teamId;
1289
- teamOwner.isOwnerNotified = !notifyOwners;
1290
-
1291
- await AlertEpisodeOwnerTeamService.create({
1292
- data: teamOwner,
1293
- props: props,
1294
- });
1295
- }
1296
-
1297
- for (let userId of userIds) {
1298
- if (typeof userId === Typeof.String) {
1299
- userId = new ObjectID(userId.toString());
1300
- }
1301
-
1302
- const userOwner: AlertEpisodeOwnerUser = new AlertEpisodeOwnerUser();
1303
- userOwner.alertEpisodeId = episodeId;
1304
- userOwner.projectId = projectId;
1305
- userOwner.userId = userId;
1306
- userOwner.isOwnerNotified = !notifyOwners;
1307
-
1308
- await AlertEpisodeOwnerUserService.create({
1309
- data: userOwner,
1310
- props: props,
1311
- });
1312
- }
1280
+ // Owners already on the episode are skipped, not added a second time.
1281
+ await OwnerRuleAssignment.addOwners({
1282
+ ownerUserService: AlertEpisodeOwnerUserService,
1283
+ ownerTeamService: AlertEpisodeOwnerTeamService,
1284
+ resourceIdColumn: "alertEpisodeId",
1285
+ resourceId: episodeId,
1286
+ projectId: projectId,
1287
+ userIds: userIds,
1288
+ teamIds: teamIds,
1289
+ isOwnerNotified: !notifyOwners,
1290
+ props: props,
1291
+ });
1313
1292
  }
1314
1293
  }
1315
1294
 
@@ -12,6 +12,7 @@ import Monitor from "../../Models/DatabaseModels/Monitor";
12
12
  import AlertSeverity from "../../Models/DatabaseModels/AlertSeverity";
13
13
  import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
14
14
  import logger, { LogAttributes } from "../Utils/Logger";
15
+ import OwnerRuleAssignment from "../Utils/Rules/OwnerRuleAssignment";
15
16
  import SortOrder from "../../Types/BaseDatabase/SortOrder";
16
17
  import OneUptimeDate from "../../Types/Date";
17
18
  import QueryHelper from "../Types/Database/QueryHelper";
@@ -846,8 +847,9 @@ class AlertGroupingEngineServiceClass {
846
847
  ownerUser.projectId = alert.projectId!;
847
848
  ownerUser.alertEpisodeId = createdEpisode.id;
848
849
  ownerUser.userId = user.id;
849
- await AlertEpisodeOwnerUserService.create({
850
- data: ownerUser,
850
+ await OwnerRuleAssignment.createOwner({
851
+ ownerService: AlertEpisodeOwnerUserService,
852
+ owner: ownerUser,
851
853
  props: {
852
854
  isRoot: true,
853
855
  },
@@ -877,8 +879,9 @@ class AlertGroupingEngineServiceClass {
877
879
  ownerTeam.projectId = alert.projectId!;
878
880
  ownerTeam.alertEpisodeId = createdEpisode.id;
879
881
  ownerTeam.teamId = team.id;
880
- await AlertEpisodeOwnerTeamService.create({
881
- data: ownerTeam,
882
+ await OwnerRuleAssignment.createOwner({
883
+ ownerService: AlertEpisodeOwnerTeamService,
884
+ owner: ownerTeam,
882
885
  props: {
883
886
  isRoot: true,
884
887
  },