@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,1057 @@
1
+ import { MigrationInterface, QueryRunner } from "typeorm";
2
+
3
+ /*
4
+ * Makes owner rows unique: one <Resource>OwnerTeam row per (resource, team,
5
+ * project) and one <Resource>OwnerUser row per (resource, user, project).
6
+ * https://github.com/OneUptime/oneuptime/issues/3394
7
+ *
8
+ * Only the dashboard used to prevent a second row for the same owner. The
9
+ * REST API, workflows, monitor criteria and the other internal paths inserted
10
+ * unconditionally, and every row fires its own feed item and owner
11
+ * notification - so a duplicate row was a duplicate notification.
12
+ *
13
+ * The composite index these tables already had (or, on the 38 that had none,
14
+ * a new one on the same columns) is now UNIQUE. The index statements below
15
+ * are what generate-postgres-migration produced (down() aside - see there),
16
+ * and the entities declare the indexes with `{ unique: true }`, so TypeORM
17
+ * keeps owning them.
18
+ *
19
+ * NOT PARTIAL
20
+ *
21
+ * Owner rows are hard-deleted (DatabaseService.deleteBy uses
22
+ * repository.delete), so no soft-deleted row can hold an owner slot hostage,
23
+ * and a plain unique index is expressible in @Index - unlike the partial
24
+ * indexes in migration 1786200000000, which had to be hand-owned.
25
+ *
26
+ * REPAIR BEFORE CREATE
27
+ *
28
+ * A unique index cannot be built over existing duplicates, so each table is
29
+ * repaired first. Within a group of duplicates exactly one row survives:
30
+ *
31
+ * 1. a live row over a soft-deleted one,
32
+ * 2. then a row whose owner was already notified over one still waiting to
33
+ * be - the owner-added job notifies every row still at
34
+ * isOwnerNotified = false, so keeping a pending duplicate of an owner
35
+ * who was already told would tell them again,
36
+ * 3. then the oldest (createdAt, then _id), so the result is deterministic.
37
+ *
38
+ * The others are DELETED. The index covers every row, so a soft delete would
39
+ * not take a row out of it. Nothing references an owner row by foreign key,
40
+ * so the delete cascades nowhere; the surviving row still records the same
41
+ * owner of the same resource. A table with no duplicates is left untouched.
42
+ *
43
+ * The groups are found with one GROUP BY per table before any row is ranked,
44
+ * so the tables that hold no duplicates - nearly all of them - are only
45
+ * scanned once.
46
+ */
47
+
48
+ interface OwnerTable {
49
+ table: string;
50
+ // resource id, owner id, project id - the columns of the unique index.
51
+ columns: Array<string>;
52
+ hasIsOwnerNotified: boolean;
53
+ }
54
+
55
+ const OWNER_TABLES: Array<OwnerTable> = [
56
+ {
57
+ table: "AIAgentOwnerTeam",
58
+ columns: ["aiAgentId", "teamId", "projectId"],
59
+ hasIsOwnerNotified: true,
60
+ },
61
+ {
62
+ table: "AIAgentOwnerUser",
63
+ columns: ["aiAgentId", "userId", "projectId"],
64
+ hasIsOwnerNotified: true,
65
+ },
66
+ {
67
+ table: "AlertEpisodeOwnerTeam",
68
+ columns: ["alertEpisodeId", "teamId", "projectId"],
69
+ hasIsOwnerNotified: true,
70
+ },
71
+ {
72
+ table: "AlertEpisodeOwnerUser",
73
+ columns: ["alertEpisodeId", "userId", "projectId"],
74
+ hasIsOwnerNotified: true,
75
+ },
76
+ {
77
+ table: "AlertOwnerTeam",
78
+ columns: ["alertId", "teamId", "projectId"],
79
+ hasIsOwnerNotified: true,
80
+ },
81
+ {
82
+ table: "AlertOwnerUser",
83
+ columns: ["alertId", "userId", "projectId"],
84
+ hasIsOwnerNotified: true,
85
+ },
86
+ {
87
+ table: "CephClusterOwnerTeam",
88
+ columns: ["cephClusterId", "teamId", "projectId"],
89
+ hasIsOwnerNotified: true,
90
+ },
91
+ {
92
+ table: "CephClusterOwnerUser",
93
+ columns: ["cephClusterId", "userId", "projectId"],
94
+ hasIsOwnerNotified: true,
95
+ },
96
+ {
97
+ table: "CloudResourceOwnerTeam",
98
+ columns: ["cloudResourceId", "teamId", "projectId"],
99
+ hasIsOwnerNotified: true,
100
+ },
101
+ {
102
+ table: "CloudResourceOwnerUser",
103
+ columns: ["cloudResourceId", "userId", "projectId"],
104
+ hasIsOwnerNotified: true,
105
+ },
106
+ {
107
+ table: "DashboardOwnerTeam",
108
+ columns: ["dashboardId", "teamId", "projectId"],
109
+ hasIsOwnerNotified: true,
110
+ },
111
+ {
112
+ table: "DashboardOwnerUser",
113
+ columns: ["dashboardId", "userId", "projectId"],
114
+ hasIsOwnerNotified: true,
115
+ },
116
+ {
117
+ table: "DockerHostOwnerTeam",
118
+ columns: ["dockerHostId", "teamId", "projectId"],
119
+ hasIsOwnerNotified: true,
120
+ },
121
+ {
122
+ table: "DockerHostOwnerUser",
123
+ columns: ["dockerHostId", "userId", "projectId"],
124
+ hasIsOwnerNotified: true,
125
+ },
126
+ {
127
+ table: "DockerSwarmClusterOwnerTeam",
128
+ columns: ["dockerSwarmClusterId", "teamId", "projectId"],
129
+ hasIsOwnerNotified: true,
130
+ },
131
+ {
132
+ table: "DockerSwarmClusterOwnerUser",
133
+ columns: ["dockerSwarmClusterId", "userId", "projectId"],
134
+ hasIsOwnerNotified: true,
135
+ },
136
+ {
137
+ table: "HostOwnerTeam",
138
+ columns: ["hostId", "teamId", "projectId"],
139
+ hasIsOwnerNotified: true,
140
+ },
141
+ {
142
+ table: "HostOwnerUser",
143
+ columns: ["hostId", "userId", "projectId"],
144
+ hasIsOwnerNotified: true,
145
+ },
146
+ {
147
+ table: "IncidentEpisodeOwnerTeam",
148
+ columns: ["incidentEpisodeId", "teamId", "projectId"],
149
+ hasIsOwnerNotified: true,
150
+ },
151
+ {
152
+ table: "IncidentEpisodeOwnerUser",
153
+ columns: ["incidentEpisodeId", "userId", "projectId"],
154
+ hasIsOwnerNotified: true,
155
+ },
156
+ {
157
+ table: "IncidentOwnerTeam",
158
+ columns: ["incidentId", "teamId", "projectId"],
159
+ hasIsOwnerNotified: true,
160
+ },
161
+ {
162
+ table: "IncidentOwnerUser",
163
+ columns: ["incidentId", "userId", "projectId"],
164
+ hasIsOwnerNotified: true,
165
+ },
166
+ {
167
+ table: "IncidentTemplateOwnerTeam",
168
+ columns: ["incidentTemplateId", "teamId", "projectId"],
169
+ hasIsOwnerNotified: true,
170
+ },
171
+ {
172
+ table: "IncidentTemplateOwnerUser",
173
+ columns: ["incidentTemplateId", "userId", "projectId"],
174
+ hasIsOwnerNotified: true,
175
+ },
176
+ {
177
+ table: "IncomingCallPolicyOwnerTeam",
178
+ columns: ["incomingCallPolicyId", "teamId", "projectId"],
179
+ hasIsOwnerNotified: true,
180
+ },
181
+ {
182
+ table: "IncomingCallPolicyOwnerUser",
183
+ columns: ["incomingCallPolicyId", "userId", "projectId"],
184
+ hasIsOwnerNotified: true,
185
+ },
186
+ {
187
+ table: "IoTFleetOwnerTeam",
188
+ columns: ["iotFleetId", "teamId", "projectId"],
189
+ hasIsOwnerNotified: true,
190
+ },
191
+ {
192
+ table: "IoTFleetOwnerUser",
193
+ columns: ["iotFleetId", "userId", "projectId"],
194
+ hasIsOwnerNotified: true,
195
+ },
196
+ {
197
+ table: "KubernetesClusterOwnerTeam",
198
+ columns: ["kubernetesClusterId", "teamId", "projectId"],
199
+ hasIsOwnerNotified: true,
200
+ },
201
+ {
202
+ table: "KubernetesClusterOwnerUser",
203
+ columns: ["kubernetesClusterId", "userId", "projectId"],
204
+ hasIsOwnerNotified: true,
205
+ },
206
+ {
207
+ table: "MonitorGroupOwnerTeam",
208
+ columns: ["monitorGroupId", "teamId", "projectId"],
209
+ hasIsOwnerNotified: true,
210
+ },
211
+ {
212
+ table: "MonitorGroupOwnerUser",
213
+ columns: ["monitorGroupId", "userId", "projectId"],
214
+ hasIsOwnerNotified: true,
215
+ },
216
+ {
217
+ table: "MonitorOwnerTeam",
218
+ columns: ["monitorId", "teamId", "projectId"],
219
+ hasIsOwnerNotified: true,
220
+ },
221
+ {
222
+ table: "MonitorOwnerUser",
223
+ columns: ["monitorId", "userId", "projectId"],
224
+ hasIsOwnerNotified: true,
225
+ },
226
+ {
227
+ table: "NetworkDeviceOwnerTeam",
228
+ columns: ["networkDeviceId", "teamId", "projectId"],
229
+ hasIsOwnerNotified: true,
230
+ },
231
+ {
232
+ table: "NetworkDeviceOwnerUser",
233
+ columns: ["networkDeviceId", "userId", "projectId"],
234
+ hasIsOwnerNotified: true,
235
+ },
236
+ {
237
+ table: "OnCallDutyPolicyOwnerTeam",
238
+ columns: ["onCallDutyPolicyId", "teamId", "projectId"],
239
+ hasIsOwnerNotified: true,
240
+ },
241
+ {
242
+ table: "OnCallDutyPolicyOwnerUser",
243
+ columns: ["onCallDutyPolicyId", "userId", "projectId"],
244
+ hasIsOwnerNotified: true,
245
+ },
246
+ {
247
+ table: "OnCallDutyPolicyScheduleOwnerTeam",
248
+ columns: ["onCallDutyPolicyScheduleId", "teamId", "projectId"],
249
+ hasIsOwnerNotified: true,
250
+ },
251
+ {
252
+ table: "OnCallDutyPolicyScheduleOwnerUser",
253
+ columns: ["onCallDutyPolicyScheduleId", "userId", "projectId"],
254
+ hasIsOwnerNotified: true,
255
+ },
256
+ {
257
+ table: "PodmanHostOwnerTeam",
258
+ columns: ["podmanHostId", "teamId", "projectId"],
259
+ hasIsOwnerNotified: true,
260
+ },
261
+ {
262
+ table: "PodmanHostOwnerUser",
263
+ columns: ["podmanHostId", "userId", "projectId"],
264
+ hasIsOwnerNotified: true,
265
+ },
266
+ {
267
+ table: "ProbeOwnerTeam",
268
+ columns: ["probeId", "teamId", "projectId"],
269
+ hasIsOwnerNotified: true,
270
+ },
271
+ {
272
+ table: "ProbeOwnerUser",
273
+ columns: ["probeId", "userId", "projectId"],
274
+ hasIsOwnerNotified: true,
275
+ },
276
+ {
277
+ table: "ProxmoxClusterOwnerTeam",
278
+ columns: ["proxmoxClusterId", "teamId", "projectId"],
279
+ hasIsOwnerNotified: true,
280
+ },
281
+ {
282
+ table: "ProxmoxClusterOwnerUser",
283
+ columns: ["proxmoxClusterId", "userId", "projectId"],
284
+ hasIsOwnerNotified: true,
285
+ },
286
+ {
287
+ table: "RumApplicationOwnerTeam",
288
+ columns: ["rumApplicationId", "teamId", "projectId"],
289
+ hasIsOwnerNotified: true,
290
+ },
291
+ {
292
+ table: "RumApplicationOwnerUser",
293
+ columns: ["rumApplicationId", "userId", "projectId"],
294
+ hasIsOwnerNotified: true,
295
+ },
296
+ {
297
+ table: "RunbookOwnerTeam",
298
+ columns: ["runbookId", "teamId", "projectId"],
299
+ hasIsOwnerNotified: true,
300
+ },
301
+ {
302
+ table: "RunbookOwnerUser",
303
+ columns: ["runbookId", "userId", "projectId"],
304
+ hasIsOwnerNotified: true,
305
+ },
306
+ {
307
+ table: "RunnerOwnerTeam",
308
+ columns: ["runnerId", "teamId", "projectId"],
309
+ hasIsOwnerNotified: true,
310
+ },
311
+ {
312
+ table: "RunnerOwnerUser",
313
+ columns: ["runnerId", "userId", "projectId"],
314
+ hasIsOwnerNotified: true,
315
+ },
316
+ {
317
+ table: "ScheduledMaintenanceOwnerTeam",
318
+ columns: ["scheduledMaintenanceId", "teamId", "projectId"],
319
+ hasIsOwnerNotified: true,
320
+ },
321
+ {
322
+ table: "ScheduledMaintenanceOwnerUser",
323
+ columns: ["scheduledMaintenanceId", "userId", "projectId"],
324
+ hasIsOwnerNotified: true,
325
+ },
326
+ {
327
+ table: "ScheduledMaintenanceTemplateOwnerTeam",
328
+ columns: ["scheduledMaintenanceTemplateId", "teamId", "projectId"],
329
+ hasIsOwnerNotified: false,
330
+ },
331
+ {
332
+ table: "ScheduledMaintenanceTemplateOwnerUser",
333
+ columns: ["scheduledMaintenanceTemplateId", "userId", "projectId"],
334
+ hasIsOwnerNotified: false,
335
+ },
336
+ {
337
+ table: "ServerlessFunctionOwnerTeam",
338
+ columns: ["serverlessFunctionId", "teamId", "projectId"],
339
+ hasIsOwnerNotified: true,
340
+ },
341
+ {
342
+ table: "ServerlessFunctionOwnerUser",
343
+ columns: ["serverlessFunctionId", "userId", "projectId"],
344
+ hasIsOwnerNotified: true,
345
+ },
346
+ {
347
+ table: "ServiceLevelObjectiveOwnerTeam",
348
+ columns: ["serviceLevelObjectiveId", "teamId", "projectId"],
349
+ hasIsOwnerNotified: true,
350
+ },
351
+ {
352
+ table: "ServiceLevelObjectiveOwnerUser",
353
+ columns: ["serviceLevelObjectiveId", "userId", "projectId"],
354
+ hasIsOwnerNotified: true,
355
+ },
356
+ {
357
+ table: "ServiceOwnerTeam",
358
+ columns: ["serviceId", "teamId", "projectId"],
359
+ hasIsOwnerNotified: false,
360
+ },
361
+ {
362
+ table: "ServiceOwnerUser",
363
+ columns: ["serviceId", "userId", "projectId"],
364
+ hasIsOwnerNotified: false,
365
+ },
366
+ {
367
+ table: "StatusPageOwnerTeam",
368
+ columns: ["statusPageId", "teamId", "projectId"],
369
+ hasIsOwnerNotified: true,
370
+ },
371
+ {
372
+ table: "StatusPageOwnerUser",
373
+ columns: ["statusPageId", "userId", "projectId"],
374
+ hasIsOwnerNotified: true,
375
+ },
376
+ {
377
+ table: "VMwareVCenterOwnerTeam",
378
+ columns: ["vmwareVCenterId", "teamId", "projectId"],
379
+ hasIsOwnerNotified: true,
380
+ },
381
+ {
382
+ table: "VMwareVCenterOwnerUser",
383
+ columns: ["vmwareVCenterId", "userId", "projectId"],
384
+ hasIsOwnerNotified: true,
385
+ },
386
+ {
387
+ table: "WorkflowOwnerTeam",
388
+ columns: ["workflowId", "teamId", "projectId"],
389
+ hasIsOwnerNotified: true,
390
+ },
391
+ {
392
+ table: "WorkflowOwnerUser",
393
+ columns: ["workflowId", "userId", "projectId"],
394
+ hasIsOwnerNotified: true,
395
+ },
396
+ ];
397
+
398
+ export class MakeOwnerRowsUnique1793500000000 implements MigrationInterface {
399
+ public name: string = "MakeOwnerRowsUnique1793500000000";
400
+
401
+ public async up(queryRunner: QueryRunner): Promise<void> {
402
+ for (const ownerTable of OWNER_TABLES) {
403
+ await this.deleteDuplicateOwners(queryRunner, ownerTable);
404
+ }
405
+
406
+ await queryRunner.query(
407
+ `DROP INDEX "public"."IDX_4490b10d3394a9be5f27f8fc3b"`,
408
+ );
409
+ await queryRunner.query(
410
+ `DROP INDEX "public"."IDX_1d8d2229e31e4ec13ec99c79ae"`,
411
+ );
412
+ await queryRunner.query(
413
+ `DROP INDEX "public"."IDX_7b7272644aab237d503ed3429a"`,
414
+ );
415
+ await queryRunner.query(
416
+ `DROP INDEX "public"."IDX_6f6246149ab744fd62ada06ee5"`,
417
+ );
418
+ await queryRunner.query(
419
+ `DROP INDEX "public"."IDX_34f21c8ae164fb90be806818a8"`,
420
+ );
421
+ await queryRunner.query(
422
+ `DROP INDEX "public"."IDX_1539db4bbd6ada58abb940b058"`,
423
+ );
424
+ await queryRunner.query(
425
+ `DROP INDEX "public"."IDX_377b22d5ffc7f1e3d5085a27ea"`,
426
+ );
427
+ await queryRunner.query(
428
+ `DROP INDEX "public"."IDX_abc604b71465bc5579525ff256"`,
429
+ );
430
+ await queryRunner.query(
431
+ `DROP INDEX "public"."IDX_3c8d9da5d5cd959c953094653b"`,
432
+ );
433
+ await queryRunner.query(
434
+ `DROP INDEX "public"."IDX_9f9eff007b40602f856803c50a"`,
435
+ );
436
+ await queryRunner.query(
437
+ `DROP INDEX "public"."IDX_b737666365dbea2e4c914fc6d3"`,
438
+ );
439
+ await queryRunner.query(
440
+ `DROP INDEX "public"."IDX_a4621b7155a01292b92569549f"`,
441
+ );
442
+ await queryRunner.query(
443
+ `DROP INDEX "public"."IDX_4873976169085f14bdc39e168d"`,
444
+ );
445
+ await queryRunner.query(
446
+ `DROP INDEX "public"."IDX_a9f80dc4f648f0957ce695dc61"`,
447
+ );
448
+ await queryRunner.query(
449
+ `DROP INDEX "public"."IDX_23cb5a85c555d015abb14021bd"`,
450
+ );
451
+ await queryRunner.query(
452
+ `DROP INDEX "public"."IDX_9a2480665e9ab79bef464a8c57"`,
453
+ );
454
+ await queryRunner.query(
455
+ `DROP INDEX "public"."IDX_5144d0de37b0f040ca2d71abad"`,
456
+ );
457
+ await queryRunner.query(
458
+ `DROP INDEX "public"."IDX_3a5b7e91e8b9ee59041517906c"`,
459
+ );
460
+ await queryRunner.query(
461
+ `DROP INDEX "public"."IDX_7b57159bdf315d24ac3116739c"`,
462
+ );
463
+ await queryRunner.query(
464
+ `DROP INDEX "public"."IDX_d02f1b9d7f33e124ca2deda720"`,
465
+ );
466
+ await queryRunner.query(
467
+ `DROP INDEX "public"."IDX_dfbcaebaa02d06a556fd2e155c"`,
468
+ );
469
+ await queryRunner.query(
470
+ `DROP INDEX "public"."IDX_042a7841d65141fb940de9d881"`,
471
+ );
472
+ await queryRunner.query(
473
+ `DROP INDEX "public"."IDX_79c03a537d5c1f4dbeb8beb355"`,
474
+ );
475
+ await queryRunner.query(
476
+ `DROP INDEX "public"."IDX_74c82db90ec03c884ba9da813a"`,
477
+ );
478
+ await queryRunner.query(
479
+ `DROP INDEX "public"."IDX_c715213fcbbb6e127c939e77d5"`,
480
+ );
481
+ await queryRunner.query(
482
+ `DROP INDEX "public"."IDX_f9aa734977a4131f79216083e2"`,
483
+ );
484
+ await queryRunner.query(
485
+ `DROP INDEX "public"."IDX_be7506765e639c732a90783147"`,
486
+ );
487
+ await queryRunner.query(
488
+ `DROP INDEX "public"."IDX_53e4404ae86c9de055cf1dee02"`,
489
+ );
490
+ await queryRunner.query(
491
+ `DROP INDEX "public"."IDX_b4fd29eeca8c655246fc86e6ba"`,
492
+ );
493
+ await queryRunner.query(
494
+ `DROP INDEX "public"."IDX_8a02ec21317c3701dbab53e43d"`,
495
+ );
496
+ await queryRunner.query(
497
+ `CREATE UNIQUE INDEX "IDX_11c6b59fc829f8147d46bddd2b" ON "KubernetesClusterOwnerTeam" ("kubernetesClusterId", "teamId", "projectId") `,
498
+ );
499
+ await queryRunner.query(
500
+ `CREATE UNIQUE INDEX "IDX_7a3ab0c19695f86724009d0926" ON "KubernetesClusterOwnerUser" ("kubernetesClusterId", "userId", "projectId") `,
501
+ );
502
+ await queryRunner.query(
503
+ `CREATE UNIQUE INDEX "IDX_110a58ade0d1744b8d6c832a1d" ON "NetworkDeviceOwnerTeam" ("networkDeviceId", "teamId", "projectId") `,
504
+ );
505
+ await queryRunner.query(
506
+ `CREATE UNIQUE INDEX "IDX_24546d5de391b1c6fcff074842" ON "NetworkDeviceOwnerUser" ("networkDeviceId", "userId", "projectId") `,
507
+ );
508
+ await queryRunner.query(
509
+ `CREATE UNIQUE INDEX "IDX_44da1e8e6844ed0bb23c365487" ON "DockerHostOwnerTeam" ("dockerHostId", "teamId", "projectId") `,
510
+ );
511
+ await queryRunner.query(
512
+ `CREATE UNIQUE INDEX "IDX_ce1b388e6e68733a35812b45fc" ON "DockerHostOwnerUser" ("dockerHostId", "userId", "projectId") `,
513
+ );
514
+ await queryRunner.query(
515
+ `CREATE UNIQUE INDEX "IDX_0fe42310a08e84122c058d9a36" ON "PodmanHostOwnerTeam" ("podmanHostId", "teamId", "projectId") `,
516
+ );
517
+ await queryRunner.query(
518
+ `CREATE UNIQUE INDEX "IDX_27c39edd22d991939693b08963" ON "PodmanHostOwnerUser" ("podmanHostId", "userId", "projectId") `,
519
+ );
520
+ await queryRunner.query(
521
+ `CREATE UNIQUE INDEX "IDX_e8255ffba6701a426fb6218bf5" ON "ProxmoxClusterOwnerTeam" ("proxmoxClusterId", "teamId", "projectId") `,
522
+ );
523
+ await queryRunner.query(
524
+ `CREATE UNIQUE INDEX "IDX_b81360b62734aade7cd8942bc6" ON "DockerSwarmClusterOwnerTeam" ("dockerSwarmClusterId", "teamId", "projectId") `,
525
+ );
526
+ await queryRunner.query(
527
+ `CREATE UNIQUE INDEX "IDX_05e4e7a95b3bdb6de7523c4265" ON "ProxmoxClusterOwnerUser" ("proxmoxClusterId", "userId", "projectId") `,
528
+ );
529
+ await queryRunner.query(
530
+ `CREATE UNIQUE INDEX "IDX_1b57f437aa7d183c103441eaf0" ON "DockerSwarmClusterOwnerUser" ("dockerSwarmClusterId", "userId", "projectId") `,
531
+ );
532
+ await queryRunner.query(
533
+ `CREATE UNIQUE INDEX "IDX_274979c9c9f53857fdb9dd4add" ON "IoTFleetOwnerTeam" ("iotFleetId", "teamId", "projectId") `,
534
+ );
535
+ await queryRunner.query(
536
+ `CREATE UNIQUE INDEX "IDX_31ef8630b4fac368db98aab9a2" ON "IoTFleetOwnerUser" ("iotFleetId", "userId", "projectId") `,
537
+ );
538
+ await queryRunner.query(
539
+ `CREATE UNIQUE INDEX "IDX_2c8bb7d2d9e0f69a70acdbb3b2" ON "CephClusterOwnerTeam" ("cephClusterId", "teamId", "projectId") `,
540
+ );
541
+ await queryRunner.query(
542
+ `CREATE UNIQUE INDEX "IDX_493141a06c1a0e8eb9338827c4" ON "CephClusterOwnerUser" ("cephClusterId", "userId", "projectId") `,
543
+ );
544
+ await queryRunner.query(
545
+ `CREATE UNIQUE INDEX "IDX_9a6bd2017e0d9ad69c4a7cb83e" ON "VMwareVCenterOwnerTeam" ("vmwareVCenterId", "teamId", "projectId") `,
546
+ );
547
+ await queryRunner.query(
548
+ `CREATE UNIQUE INDEX "IDX_6f340ef127218ec4d0c50a7c87" ON "VMwareVCenterOwnerUser" ("vmwareVCenterId", "userId", "projectId") `,
549
+ );
550
+ await queryRunner.query(
551
+ `CREATE UNIQUE INDEX "IDX_3f0e121832ab6eddcb165328e2" ON "HostOwnerTeam" ("hostId", "teamId", "projectId") `,
552
+ );
553
+ await queryRunner.query(
554
+ `CREATE UNIQUE INDEX "IDX_475d30964cfbe0040019345d16" ON "HostOwnerUser" ("hostId", "userId", "projectId") `,
555
+ );
556
+ await queryRunner.query(
557
+ `CREATE UNIQUE INDEX "IDX_912ddc627eb4e8ca3f93a701c9" ON "ServerlessFunctionOwnerTeam" ("serverlessFunctionId", "teamId", "projectId") `,
558
+ );
559
+ await queryRunner.query(
560
+ `CREATE UNIQUE INDEX "IDX_f8efcb93010641cf8712bbd3f6" ON "ServerlessFunctionOwnerUser" ("serverlessFunctionId", "userId", "projectId") `,
561
+ );
562
+ await queryRunner.query(
563
+ `CREATE UNIQUE INDEX "IDX_2eb4784b49cc7012fd8be34911" ON "CloudResourceOwnerTeam" ("cloudResourceId", "teamId", "projectId") `,
564
+ );
565
+ await queryRunner.query(
566
+ `CREATE UNIQUE INDEX "IDX_2956fbee991fc0eada674617d7" ON "CloudResourceOwnerUser" ("cloudResourceId", "userId", "projectId") `,
567
+ );
568
+ await queryRunner.query(
569
+ `CREATE UNIQUE INDEX "IDX_24b4e231f58db2b6ff1df458b6" ON "RumApplicationOwnerTeam" ("rumApplicationId", "teamId", "projectId") `,
570
+ );
571
+ await queryRunner.query(
572
+ `CREATE UNIQUE INDEX "IDX_d5b096e3c2b664829c4bf021d9" ON "RumApplicationOwnerUser" ("rumApplicationId", "userId", "projectId") `,
573
+ );
574
+ await queryRunner.query(
575
+ `CREATE UNIQUE INDEX "IDX_4490b10d3394a9be5f27f8fc3b" ON "IncidentOwnerTeam" ("incidentId", "teamId", "projectId") `,
576
+ );
577
+ await queryRunner.query(
578
+ `CREATE UNIQUE INDEX "IDX_1d8d2229e31e4ec13ec99c79ae" ON "IncidentOwnerUser" ("incidentId", "userId", "projectId") `,
579
+ );
580
+ await queryRunner.query(
581
+ `CREATE UNIQUE INDEX "IDX_5ea13ac7a467e4532d18881e71" ON "IncidentTemplateOwnerTeam" ("incidentTemplateId", "teamId", "projectId") `,
582
+ );
583
+ await queryRunner.query(
584
+ `CREATE UNIQUE INDEX "IDX_9f40fdc8d3b6da5ee7fa30c1fb" ON "IncidentTemplateOwnerUser" ("incidentTemplateId", "userId", "projectId") `,
585
+ );
586
+ await queryRunner.query(
587
+ `CREATE UNIQUE INDEX "IDX_632005436db02ad442c7bcb634" ON "MonitorGroupOwnerTeam" ("monitorGroupId", "teamId", "projectId") `,
588
+ );
589
+ await queryRunner.query(
590
+ `CREATE UNIQUE INDEX "IDX_4ce33f4ec2b613851ec00d5ad9" ON "MonitorGroupOwnerUser" ("monitorGroupId", "userId", "projectId") `,
591
+ );
592
+ await queryRunner.query(
593
+ `CREATE UNIQUE INDEX "IDX_7b7272644aab237d503ed3429a" ON "MonitorOwnerTeam" ("monitorId", "teamId", "projectId") `,
594
+ );
595
+ await queryRunner.query(
596
+ `CREATE UNIQUE INDEX "IDX_6f6246149ab744fd62ada06ee5" ON "MonitorOwnerUser" ("monitorId", "userId", "projectId") `,
597
+ );
598
+ await queryRunner.query(
599
+ `CREATE UNIQUE INDEX "IDX_34f21c8ae164fb90be806818a8" ON "OnCallDutyPolicyOwnerTeam" ("onCallDutyPolicyId", "teamId", "projectId") `,
600
+ );
601
+ await queryRunner.query(
602
+ `CREATE UNIQUE INDEX "IDX_1539db4bbd6ada58abb940b058" ON "OnCallDutyPolicyOwnerUser" ("onCallDutyPolicyId", "userId", "projectId") `,
603
+ );
604
+ await queryRunner.query(
605
+ `CREATE UNIQUE INDEX "IDX_377b22d5ffc7f1e3d5085a27ea" ON "OnCallDutyPolicyScheduleOwnerTeam" ("onCallDutyPolicyScheduleId", "teamId", "projectId") `,
606
+ );
607
+ await queryRunner.query(
608
+ `CREATE UNIQUE INDEX "IDX_abc604b71465bc5579525ff256" ON "OnCallDutyPolicyScheduleOwnerUser" ("onCallDutyPolicyScheduleId", "userId", "projectId") `,
609
+ );
610
+ await queryRunner.query(
611
+ `CREATE UNIQUE INDEX "IDX_3c8d9da5d5cd959c953094653b" ON "IncomingCallPolicyOwnerTeam" ("incomingCallPolicyId", "teamId", "projectId") `,
612
+ );
613
+ await queryRunner.query(
614
+ `CREATE UNIQUE INDEX "IDX_9f9eff007b40602f856803c50a" ON "IncomingCallPolicyOwnerUser" ("incomingCallPolicyId", "userId", "projectId") `,
615
+ );
616
+ await queryRunner.query(
617
+ `CREATE UNIQUE INDEX "IDX_e853141fb4c21e905ce36dc60f" ON "ProbeOwnerTeam" ("probeId", "teamId", "projectId") `,
618
+ );
619
+ await queryRunner.query(
620
+ `CREATE UNIQUE INDEX "IDX_eafc36eb1963f058440702fc6e" ON "ProbeOwnerUser" ("probeId", "userId", "projectId") `,
621
+ );
622
+ await queryRunner.query(
623
+ `CREATE UNIQUE INDEX "IDX_c1889b64104f9b28ef6228c12e" ON "AIAgentOwnerTeam" ("aiAgentId", "teamId", "projectId") `,
624
+ );
625
+ await queryRunner.query(
626
+ `CREATE UNIQUE INDEX "IDX_3847a3fc0f1f00a73622ca6369" ON "AIAgentOwnerUser" ("aiAgentId", "userId", "projectId") `,
627
+ );
628
+ await queryRunner.query(
629
+ `CREATE UNIQUE INDEX "IDX_b737666365dbea2e4c914fc6d3" ON "ScheduledMaintenanceOwnerTeam" ("scheduledMaintenanceId", "teamId", "projectId") `,
630
+ );
631
+ await queryRunner.query(
632
+ `CREATE UNIQUE INDEX "IDX_a4621b7155a01292b92569549f" ON "ScheduledMaintenanceOwnerUser" ("scheduledMaintenanceId", "userId", "projectId") `,
633
+ );
634
+ await queryRunner.query(
635
+ `CREATE UNIQUE INDEX "IDX_3149703f26e38aaa65de2d2653" ON "ServiceOwnerTeam" ("serviceId", "teamId", "projectId") `,
636
+ );
637
+ await queryRunner.query(
638
+ `CREATE UNIQUE INDEX "IDX_b65a160e622610345018d1eb0c" ON "ServiceOwnerUser" ("serviceId", "userId", "projectId") `,
639
+ );
640
+ await queryRunner.query(
641
+ `CREATE UNIQUE INDEX "IDX_4873976169085f14bdc39e168d" ON "StatusPageOwnerTeam" ("statusPageId", "teamId", "projectId") `,
642
+ );
643
+ await queryRunner.query(
644
+ `CREATE UNIQUE INDEX "IDX_a9f80dc4f648f0957ce695dc61" ON "StatusPageOwnerUser" ("statusPageId", "userId", "projectId") `,
645
+ );
646
+ await queryRunner.query(
647
+ `CREATE UNIQUE INDEX "IDX_23cb5a85c555d015abb14021bd" ON "WorkflowOwnerTeam" ("workflowId", "teamId", "projectId") `,
648
+ );
649
+ await queryRunner.query(
650
+ `CREATE UNIQUE INDEX "IDX_9a2480665e9ab79bef464a8c57" ON "WorkflowOwnerUser" ("workflowId", "userId", "projectId") `,
651
+ );
652
+ await queryRunner.query(
653
+ `CREATE UNIQUE INDEX "IDX_5144d0de37b0f040ca2d71abad" ON "RunnerOwnerTeam" ("runnerId", "teamId", "projectId") `,
654
+ );
655
+ await queryRunner.query(
656
+ `CREATE UNIQUE INDEX "IDX_3a5b7e91e8b9ee59041517906c" ON "RunnerOwnerUser" ("runnerId", "userId", "projectId") `,
657
+ );
658
+ await queryRunner.query(
659
+ `CREATE UNIQUE INDEX "IDX_7b57159bdf315d24ac3116739c" ON "RunbookOwnerTeam" ("runbookId", "teamId", "projectId") `,
660
+ );
661
+ await queryRunner.query(
662
+ `CREATE UNIQUE INDEX "IDX_d02f1b9d7f33e124ca2deda720" ON "RunbookOwnerUser" ("runbookId", "userId", "projectId") `,
663
+ );
664
+ await queryRunner.query(
665
+ `CREATE UNIQUE INDEX "IDX_c916d6412aff8d51222300efc9" ON "ScheduledMaintenanceTemplateOwnerTeam" ("scheduledMaintenanceTemplateId", "teamId", "projectId") `,
666
+ );
667
+ await queryRunner.query(
668
+ `CREATE UNIQUE INDEX "IDX_881bd5d826e4f5ec3cba63760f" ON "ScheduledMaintenanceTemplateOwnerUser" ("scheduledMaintenanceTemplateId", "userId", "projectId") `,
669
+ );
670
+ await queryRunner.query(
671
+ `CREATE UNIQUE INDEX "IDX_dfbcaebaa02d06a556fd2e155c" ON "AlertOwnerTeam" ("alertId", "teamId", "projectId") `,
672
+ );
673
+ await queryRunner.query(
674
+ `CREATE UNIQUE INDEX "IDX_042a7841d65141fb940de9d881" ON "AlertOwnerUser" ("alertId", "userId", "projectId") `,
675
+ );
676
+ await queryRunner.query(
677
+ `CREATE UNIQUE INDEX "IDX_79c03a537d5c1f4dbeb8beb355" ON "AlertEpisodeOwnerUser" ("alertEpisodeId", "userId", "projectId") `,
678
+ );
679
+ await queryRunner.query(
680
+ `CREATE UNIQUE INDEX "IDX_74c82db90ec03c884ba9da813a" ON "AlertEpisodeOwnerTeam" ("alertEpisodeId", "teamId", "projectId") `,
681
+ );
682
+ await queryRunner.query(
683
+ `CREATE UNIQUE INDEX "IDX_c715213fcbbb6e127c939e77d5" ON "IncidentEpisodeOwnerUser" ("incidentEpisodeId", "userId", "projectId") `,
684
+ );
685
+ await queryRunner.query(
686
+ `CREATE UNIQUE INDEX "IDX_f9aa734977a4131f79216083e2" ON "IncidentEpisodeOwnerTeam" ("incidentEpisodeId", "teamId", "projectId") `,
687
+ );
688
+ await queryRunner.query(
689
+ `CREATE UNIQUE INDEX "IDX_be7506765e639c732a90783147" ON "ServiceLevelObjectiveOwnerUser" ("serviceLevelObjectiveId", "userId", "projectId") `,
690
+ );
691
+ await queryRunner.query(
692
+ `CREATE UNIQUE INDEX "IDX_53e4404ae86c9de055cf1dee02" ON "ServiceLevelObjectiveOwnerTeam" ("serviceLevelObjectiveId", "teamId", "projectId") `,
693
+ );
694
+ await queryRunner.query(
695
+ `CREATE UNIQUE INDEX "IDX_b4fd29eeca8c655246fc86e6ba" ON "DashboardOwnerTeam" ("dashboardId", "teamId", "projectId") `,
696
+ );
697
+ await queryRunner.query(
698
+ `CREATE UNIQUE INDEX "IDX_8a02ec21317c3701dbab53e43d" ON "DashboardOwnerUser" ("dashboardId", "userId", "projectId") `,
699
+ );
700
+ }
701
+
702
+ public async down(queryRunner: QueryRunner): Promise<void> {
703
+ /*
704
+ * Only the indexes are reversible. The duplicates removed in up() are
705
+ * gone, and bringing them back would bring back the double notifications.
706
+ *
707
+ * The non-unique indexes are recreated in their original column order
708
+ * (resource, owner, project). The generator lists the columns in table
709
+ * order instead, which would not be the index that was dropped.
710
+ */
711
+ await queryRunner.query(
712
+ `DROP INDEX "public"."IDX_8a02ec21317c3701dbab53e43d"`,
713
+ );
714
+ await queryRunner.query(
715
+ `DROP INDEX "public"."IDX_b4fd29eeca8c655246fc86e6ba"`,
716
+ );
717
+ await queryRunner.query(
718
+ `DROP INDEX "public"."IDX_53e4404ae86c9de055cf1dee02"`,
719
+ );
720
+ await queryRunner.query(
721
+ `DROP INDEX "public"."IDX_be7506765e639c732a90783147"`,
722
+ );
723
+ await queryRunner.query(
724
+ `DROP INDEX "public"."IDX_f9aa734977a4131f79216083e2"`,
725
+ );
726
+ await queryRunner.query(
727
+ `DROP INDEX "public"."IDX_c715213fcbbb6e127c939e77d5"`,
728
+ );
729
+ await queryRunner.query(
730
+ `DROP INDEX "public"."IDX_74c82db90ec03c884ba9da813a"`,
731
+ );
732
+ await queryRunner.query(
733
+ `DROP INDEX "public"."IDX_79c03a537d5c1f4dbeb8beb355"`,
734
+ );
735
+ await queryRunner.query(
736
+ `DROP INDEX "public"."IDX_042a7841d65141fb940de9d881"`,
737
+ );
738
+ await queryRunner.query(
739
+ `DROP INDEX "public"."IDX_dfbcaebaa02d06a556fd2e155c"`,
740
+ );
741
+ await queryRunner.query(
742
+ `DROP INDEX "public"."IDX_881bd5d826e4f5ec3cba63760f"`,
743
+ );
744
+ await queryRunner.query(
745
+ `DROP INDEX "public"."IDX_c916d6412aff8d51222300efc9"`,
746
+ );
747
+ await queryRunner.query(
748
+ `DROP INDEX "public"."IDX_d02f1b9d7f33e124ca2deda720"`,
749
+ );
750
+ await queryRunner.query(
751
+ `DROP INDEX "public"."IDX_7b57159bdf315d24ac3116739c"`,
752
+ );
753
+ await queryRunner.query(
754
+ `DROP INDEX "public"."IDX_3a5b7e91e8b9ee59041517906c"`,
755
+ );
756
+ await queryRunner.query(
757
+ `DROP INDEX "public"."IDX_5144d0de37b0f040ca2d71abad"`,
758
+ );
759
+ await queryRunner.query(
760
+ `DROP INDEX "public"."IDX_9a2480665e9ab79bef464a8c57"`,
761
+ );
762
+ await queryRunner.query(
763
+ `DROP INDEX "public"."IDX_23cb5a85c555d015abb14021bd"`,
764
+ );
765
+ await queryRunner.query(
766
+ `DROP INDEX "public"."IDX_a9f80dc4f648f0957ce695dc61"`,
767
+ );
768
+ await queryRunner.query(
769
+ `DROP INDEX "public"."IDX_4873976169085f14bdc39e168d"`,
770
+ );
771
+ await queryRunner.query(
772
+ `DROP INDEX "public"."IDX_b65a160e622610345018d1eb0c"`,
773
+ );
774
+ await queryRunner.query(
775
+ `DROP INDEX "public"."IDX_3149703f26e38aaa65de2d2653"`,
776
+ );
777
+ await queryRunner.query(
778
+ `DROP INDEX "public"."IDX_a4621b7155a01292b92569549f"`,
779
+ );
780
+ await queryRunner.query(
781
+ `DROP INDEX "public"."IDX_b737666365dbea2e4c914fc6d3"`,
782
+ );
783
+ await queryRunner.query(
784
+ `DROP INDEX "public"."IDX_3847a3fc0f1f00a73622ca6369"`,
785
+ );
786
+ await queryRunner.query(
787
+ `DROP INDEX "public"."IDX_c1889b64104f9b28ef6228c12e"`,
788
+ );
789
+ await queryRunner.query(
790
+ `DROP INDEX "public"."IDX_eafc36eb1963f058440702fc6e"`,
791
+ );
792
+ await queryRunner.query(
793
+ `DROP INDEX "public"."IDX_e853141fb4c21e905ce36dc60f"`,
794
+ );
795
+ await queryRunner.query(
796
+ `DROP INDEX "public"."IDX_9f9eff007b40602f856803c50a"`,
797
+ );
798
+ await queryRunner.query(
799
+ `DROP INDEX "public"."IDX_3c8d9da5d5cd959c953094653b"`,
800
+ );
801
+ await queryRunner.query(
802
+ `DROP INDEX "public"."IDX_abc604b71465bc5579525ff256"`,
803
+ );
804
+ await queryRunner.query(
805
+ `DROP INDEX "public"."IDX_377b22d5ffc7f1e3d5085a27ea"`,
806
+ );
807
+ await queryRunner.query(
808
+ `DROP INDEX "public"."IDX_1539db4bbd6ada58abb940b058"`,
809
+ );
810
+ await queryRunner.query(
811
+ `DROP INDEX "public"."IDX_34f21c8ae164fb90be806818a8"`,
812
+ );
813
+ await queryRunner.query(
814
+ `DROP INDEX "public"."IDX_6f6246149ab744fd62ada06ee5"`,
815
+ );
816
+ await queryRunner.query(
817
+ `DROP INDEX "public"."IDX_7b7272644aab237d503ed3429a"`,
818
+ );
819
+ await queryRunner.query(
820
+ `DROP INDEX "public"."IDX_4ce33f4ec2b613851ec00d5ad9"`,
821
+ );
822
+ await queryRunner.query(
823
+ `DROP INDEX "public"."IDX_632005436db02ad442c7bcb634"`,
824
+ );
825
+ await queryRunner.query(
826
+ `DROP INDEX "public"."IDX_9f40fdc8d3b6da5ee7fa30c1fb"`,
827
+ );
828
+ await queryRunner.query(
829
+ `DROP INDEX "public"."IDX_5ea13ac7a467e4532d18881e71"`,
830
+ );
831
+ await queryRunner.query(
832
+ `DROP INDEX "public"."IDX_1d8d2229e31e4ec13ec99c79ae"`,
833
+ );
834
+ await queryRunner.query(
835
+ `DROP INDEX "public"."IDX_4490b10d3394a9be5f27f8fc3b"`,
836
+ );
837
+ await queryRunner.query(
838
+ `DROP INDEX "public"."IDX_d5b096e3c2b664829c4bf021d9"`,
839
+ );
840
+ await queryRunner.query(
841
+ `DROP INDEX "public"."IDX_24b4e231f58db2b6ff1df458b6"`,
842
+ );
843
+ await queryRunner.query(
844
+ `DROP INDEX "public"."IDX_2956fbee991fc0eada674617d7"`,
845
+ );
846
+ await queryRunner.query(
847
+ `DROP INDEX "public"."IDX_2eb4784b49cc7012fd8be34911"`,
848
+ );
849
+ await queryRunner.query(
850
+ `DROP INDEX "public"."IDX_f8efcb93010641cf8712bbd3f6"`,
851
+ );
852
+ await queryRunner.query(
853
+ `DROP INDEX "public"."IDX_912ddc627eb4e8ca3f93a701c9"`,
854
+ );
855
+ await queryRunner.query(
856
+ `DROP INDEX "public"."IDX_475d30964cfbe0040019345d16"`,
857
+ );
858
+ await queryRunner.query(
859
+ `DROP INDEX "public"."IDX_3f0e121832ab6eddcb165328e2"`,
860
+ );
861
+ await queryRunner.query(
862
+ `DROP INDEX "public"."IDX_6f340ef127218ec4d0c50a7c87"`,
863
+ );
864
+ await queryRunner.query(
865
+ `DROP INDEX "public"."IDX_9a6bd2017e0d9ad69c4a7cb83e"`,
866
+ );
867
+ await queryRunner.query(
868
+ `DROP INDEX "public"."IDX_493141a06c1a0e8eb9338827c4"`,
869
+ );
870
+ await queryRunner.query(
871
+ `DROP INDEX "public"."IDX_2c8bb7d2d9e0f69a70acdbb3b2"`,
872
+ );
873
+ await queryRunner.query(
874
+ `DROP INDEX "public"."IDX_31ef8630b4fac368db98aab9a2"`,
875
+ );
876
+ await queryRunner.query(
877
+ `DROP INDEX "public"."IDX_274979c9c9f53857fdb9dd4add"`,
878
+ );
879
+ await queryRunner.query(
880
+ `DROP INDEX "public"."IDX_1b57f437aa7d183c103441eaf0"`,
881
+ );
882
+ await queryRunner.query(
883
+ `DROP INDEX "public"."IDX_05e4e7a95b3bdb6de7523c4265"`,
884
+ );
885
+ await queryRunner.query(
886
+ `DROP INDEX "public"."IDX_b81360b62734aade7cd8942bc6"`,
887
+ );
888
+ await queryRunner.query(
889
+ `DROP INDEX "public"."IDX_e8255ffba6701a426fb6218bf5"`,
890
+ );
891
+ await queryRunner.query(
892
+ `DROP INDEX "public"."IDX_27c39edd22d991939693b08963"`,
893
+ );
894
+ await queryRunner.query(
895
+ `DROP INDEX "public"."IDX_0fe42310a08e84122c058d9a36"`,
896
+ );
897
+ await queryRunner.query(
898
+ `DROP INDEX "public"."IDX_ce1b388e6e68733a35812b45fc"`,
899
+ );
900
+ await queryRunner.query(
901
+ `DROP INDEX "public"."IDX_44da1e8e6844ed0bb23c365487"`,
902
+ );
903
+ await queryRunner.query(
904
+ `DROP INDEX "public"."IDX_24546d5de391b1c6fcff074842"`,
905
+ );
906
+ await queryRunner.query(
907
+ `DROP INDEX "public"."IDX_110a58ade0d1744b8d6c832a1d"`,
908
+ );
909
+ await queryRunner.query(
910
+ `DROP INDEX "public"."IDX_7a3ab0c19695f86724009d0926"`,
911
+ );
912
+ await queryRunner.query(
913
+ `DROP INDEX "public"."IDX_11c6b59fc829f8147d46bddd2b"`,
914
+ );
915
+ await queryRunner.query(
916
+ `CREATE INDEX "IDX_8a02ec21317c3701dbab53e43d" ON "DashboardOwnerUser" ("dashboardId", "userId", "projectId") `,
917
+ );
918
+ await queryRunner.query(
919
+ `CREATE INDEX "IDX_b4fd29eeca8c655246fc86e6ba" ON "DashboardOwnerTeam" ("dashboardId", "teamId", "projectId") `,
920
+ );
921
+ await queryRunner.query(
922
+ `CREATE INDEX "IDX_53e4404ae86c9de055cf1dee02" ON "ServiceLevelObjectiveOwnerTeam" ("serviceLevelObjectiveId", "teamId", "projectId") `,
923
+ );
924
+ await queryRunner.query(
925
+ `CREATE INDEX "IDX_be7506765e639c732a90783147" ON "ServiceLevelObjectiveOwnerUser" ("serviceLevelObjectiveId", "userId", "projectId") `,
926
+ );
927
+ await queryRunner.query(
928
+ `CREATE INDEX "IDX_f9aa734977a4131f79216083e2" ON "IncidentEpisodeOwnerTeam" ("incidentEpisodeId", "teamId", "projectId") `,
929
+ );
930
+ await queryRunner.query(
931
+ `CREATE INDEX "IDX_c715213fcbbb6e127c939e77d5" ON "IncidentEpisodeOwnerUser" ("incidentEpisodeId", "userId", "projectId") `,
932
+ );
933
+ await queryRunner.query(
934
+ `CREATE INDEX "IDX_74c82db90ec03c884ba9da813a" ON "AlertEpisodeOwnerTeam" ("alertEpisodeId", "teamId", "projectId") `,
935
+ );
936
+ await queryRunner.query(
937
+ `CREATE INDEX "IDX_79c03a537d5c1f4dbeb8beb355" ON "AlertEpisodeOwnerUser" ("alertEpisodeId", "userId", "projectId") `,
938
+ );
939
+ await queryRunner.query(
940
+ `CREATE INDEX "IDX_042a7841d65141fb940de9d881" ON "AlertOwnerUser" ("alertId", "userId", "projectId") `,
941
+ );
942
+ await queryRunner.query(
943
+ `CREATE INDEX "IDX_dfbcaebaa02d06a556fd2e155c" ON "AlertOwnerTeam" ("alertId", "teamId", "projectId") `,
944
+ );
945
+ await queryRunner.query(
946
+ `CREATE INDEX "IDX_d02f1b9d7f33e124ca2deda720" ON "RunbookOwnerUser" ("runbookId", "userId", "projectId") `,
947
+ );
948
+ await queryRunner.query(
949
+ `CREATE INDEX "IDX_7b57159bdf315d24ac3116739c" ON "RunbookOwnerTeam" ("runbookId", "teamId", "projectId") `,
950
+ );
951
+ await queryRunner.query(
952
+ `CREATE INDEX "IDX_3a5b7e91e8b9ee59041517906c" ON "RunnerOwnerUser" ("runnerId", "userId", "projectId") `,
953
+ );
954
+ await queryRunner.query(
955
+ `CREATE INDEX "IDX_5144d0de37b0f040ca2d71abad" ON "RunnerOwnerTeam" ("runnerId", "teamId", "projectId") `,
956
+ );
957
+ await queryRunner.query(
958
+ `CREATE INDEX "IDX_9a2480665e9ab79bef464a8c57" ON "WorkflowOwnerUser" ("workflowId", "userId", "projectId") `,
959
+ );
960
+ await queryRunner.query(
961
+ `CREATE INDEX "IDX_23cb5a85c555d015abb14021bd" ON "WorkflowOwnerTeam" ("workflowId", "teamId", "projectId") `,
962
+ );
963
+ await queryRunner.query(
964
+ `CREATE INDEX "IDX_a9f80dc4f648f0957ce695dc61" ON "StatusPageOwnerUser" ("statusPageId", "userId", "projectId") `,
965
+ );
966
+ await queryRunner.query(
967
+ `CREATE INDEX "IDX_4873976169085f14bdc39e168d" ON "StatusPageOwnerTeam" ("statusPageId", "teamId", "projectId") `,
968
+ );
969
+ await queryRunner.query(
970
+ `CREATE INDEX "IDX_a4621b7155a01292b92569549f" ON "ScheduledMaintenanceOwnerUser" ("scheduledMaintenanceId", "userId", "projectId") `,
971
+ );
972
+ await queryRunner.query(
973
+ `CREATE INDEX "IDX_b737666365dbea2e4c914fc6d3" ON "ScheduledMaintenanceOwnerTeam" ("scheduledMaintenanceId", "teamId", "projectId") `,
974
+ );
975
+ await queryRunner.query(
976
+ `CREATE INDEX "IDX_9f9eff007b40602f856803c50a" ON "IncomingCallPolicyOwnerUser" ("incomingCallPolicyId", "userId", "projectId") `,
977
+ );
978
+ await queryRunner.query(
979
+ `CREATE INDEX "IDX_3c8d9da5d5cd959c953094653b" ON "IncomingCallPolicyOwnerTeam" ("incomingCallPolicyId", "teamId", "projectId") `,
980
+ );
981
+ await queryRunner.query(
982
+ `CREATE INDEX "IDX_abc604b71465bc5579525ff256" ON "OnCallDutyPolicyScheduleOwnerUser" ("onCallDutyPolicyScheduleId", "userId", "projectId") `,
983
+ );
984
+ await queryRunner.query(
985
+ `CREATE INDEX "IDX_377b22d5ffc7f1e3d5085a27ea" ON "OnCallDutyPolicyScheduleOwnerTeam" ("onCallDutyPolicyScheduleId", "teamId", "projectId") `,
986
+ );
987
+ await queryRunner.query(
988
+ `CREATE INDEX "IDX_1539db4bbd6ada58abb940b058" ON "OnCallDutyPolicyOwnerUser" ("onCallDutyPolicyId", "userId", "projectId") `,
989
+ );
990
+ await queryRunner.query(
991
+ `CREATE INDEX "IDX_34f21c8ae164fb90be806818a8" ON "OnCallDutyPolicyOwnerTeam" ("onCallDutyPolicyId", "teamId", "projectId") `,
992
+ );
993
+ await queryRunner.query(
994
+ `CREATE INDEX "IDX_6f6246149ab744fd62ada06ee5" ON "MonitorOwnerUser" ("monitorId", "userId", "projectId") `,
995
+ );
996
+ await queryRunner.query(
997
+ `CREATE INDEX "IDX_7b7272644aab237d503ed3429a" ON "MonitorOwnerTeam" ("monitorId", "teamId", "projectId") `,
998
+ );
999
+ await queryRunner.query(
1000
+ `CREATE INDEX "IDX_1d8d2229e31e4ec13ec99c79ae" ON "IncidentOwnerUser" ("incidentId", "userId", "projectId") `,
1001
+ );
1002
+ await queryRunner.query(
1003
+ `CREATE INDEX "IDX_4490b10d3394a9be5f27f8fc3b" ON "IncidentOwnerTeam" ("incidentId", "teamId", "projectId") `,
1004
+ );
1005
+ }
1006
+
1007
+ private async deleteDuplicateOwners(
1008
+ queryRunner: QueryRunner,
1009
+ ownerTable: OwnerTable,
1010
+ ): Promise<void> {
1011
+ const key: string = ownerTable.columns
1012
+ .map((column: string): string => {
1013
+ return `"${column}"`;
1014
+ })
1015
+ .join(", ");
1016
+
1017
+ const partitionBy: string = ownerTable.columns
1018
+ .map((column: string): string => {
1019
+ return `t."${column}"`;
1020
+ })
1021
+ .join(", ");
1022
+
1023
+ const joinOnKey: string = ownerTable.columns
1024
+ .map((column: string): string => {
1025
+ return `d."${column}" = t."${column}"`;
1026
+ })
1027
+ .join(" AND ");
1028
+
1029
+ const survivorOrder: string = [
1030
+ `(t."deletedAt" IS NOT NULL) ASC`,
1031
+ ...(ownerTable.hasIsOwnerNotified ? [`t."isOwnerNotified" DESC`] : []),
1032
+ `t."createdAt" ASC`,
1033
+ `t._id ASC`,
1034
+ ].join(", ");
1035
+
1036
+ await queryRunner.query(`
1037
+ WITH duplicate_groups AS (
1038
+ SELECT ${key}
1039
+ FROM "${ownerTable.table}"
1040
+ GROUP BY ${key}
1041
+ HAVING COUNT(*) > 1
1042
+ ),
1043
+ ranked AS (
1044
+ SELECT t._id,
1045
+ ROW_NUMBER() OVER (
1046
+ PARTITION BY ${partitionBy}
1047
+ ORDER BY ${survivorOrder}
1048
+ ) AS rn
1049
+ FROM "${ownerTable.table}" t
1050
+ JOIN duplicate_groups d ON ${joinOnKey}
1051
+ )
1052
+ DELETE FROM "${ownerTable.table}" t
1053
+ USING ranked r
1054
+ WHERE t._id = r._id AND r.rn > 1;
1055
+ `);
1056
+ }
1057
+ }