@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,845 @@
1
+ import { describe, expect, test } from "@jest/globals";
2
+ import {
3
+ EVENT_OVERLAY_SCOPE_QUERY_LIMIT,
4
+ EventOverlayScope,
5
+ getEventOverlayScope,
6
+ } from "../../../../App/FeatureSet/Dashboard/src/Components/Metrics/Utils/EventOverlayScope";
7
+ import EqualTo from "../../../Types/BaseDatabase/EqualTo";
8
+ import Includes from "../../../Types/BaseDatabase/Includes";
9
+ import IncludesNone from "../../../Types/BaseDatabase/IncludesNone";
10
+ import NotEqual from "../../../Types/BaseDatabase/NotEqual";
11
+ import Search from "../../../Types/BaseDatabase/Search";
12
+ import Wildcard from "../../../Types/BaseDatabase/Wildcard";
13
+ import ObjectID from "../../../Types/ObjectID";
14
+ import MetricQueryConfigData from "../../../Types/Metrics/MetricQueryConfigData";
15
+ import ServiceType from "../../../Types/Telemetry/ServiceType";
16
+
17
+ const RESOURCE_A: string = "11111111-1111-4111-8111-111111111111";
18
+ const RESOURCE_B: string = "22222222-2222-4222-8222-222222222222";
19
+
20
+ function config(
21
+ attributes: Record<string, unknown> = {},
22
+ ): MetricQueryConfigData {
23
+ return {
24
+ metricQueryData: { filterData: { metricName: "cpu", attributes } },
25
+ } as MetricQueryConfigData;
26
+ }
27
+
28
+ function scope(attributes: Record<string, unknown>): EventOverlayScope {
29
+ return getEventOverlayScope([config(attributes)]);
30
+ }
31
+
32
+ function expectSuppressed(result: EventOverlayScope): void {
33
+ expect(result.incidentQueries).toEqual([]);
34
+ expect(result.alertQueries).toEqual([]);
35
+ }
36
+
37
+ const ID_RELATIONS: Array<[string, string]> = [
38
+ ["monitorId", "monitors"],
39
+ ["monitorIds", "monitors"],
40
+ ["sloId", "serviceLevelObjectives"],
41
+ ["serviceLevelObjectiveId", "serviceLevelObjectives"],
42
+ ["serviceLevelObjectiveIds", "serviceLevelObjectives"],
43
+ ["hostId", "hosts"],
44
+ ["hostIds", "hosts"],
45
+ ["dockerHostId", "dockerHosts"],
46
+ ["dockerHostIds", "dockerHosts"],
47
+ ["podmanHostId", "podmanHosts"],
48
+ ["podmanHostIds", "podmanHosts"],
49
+ ["kubernetesClusterId", "kubernetesClusters"],
50
+ ["kubernetesClusterIds", "kubernetesClusters"],
51
+ ["kubernetesResourceId", "kubernetesResources"],
52
+ ["kubernetesResourceIds", "kubernetesResources"],
53
+ ["kubernetesContainerId", "kubernetesContainers"],
54
+ ["kubernetesContainerIds", "kubernetesContainers"],
55
+ ["dockerResourceId", "dockerResources"],
56
+ ["dockerResourceIds", "dockerResources"],
57
+ ["podmanResourceId", "podmanResources"],
58
+ ["podmanResourceIds", "podmanResources"],
59
+ ["proxmoxClusterId", "proxmoxClusters"],
60
+ ["proxmoxClusterIds", "proxmoxClusters"],
61
+ ["vmwareVCenterId", "vmwareVCenters"],
62
+ ["vmwareVCenterIds", "vmwareVCenters"],
63
+ ["cephClusterId", "cephClusters"],
64
+ ["cephClusterIds", "cephClusters"],
65
+ ["dockerSwarmClusterId", "dockerSwarmClusters"],
66
+ ["dockerSwarmClusterIds", "dockerSwarmClusters"],
67
+ ["iotFleetId", "iotFleets"],
68
+ ["iotFleetIds", "iotFleets"],
69
+ ["serviceId", "services"],
70
+ ["serviceIds", "services"],
71
+ ["services", "services"],
72
+ ];
73
+
74
+ const NAME_RELATIONS: Array<[string, string, string]> = [
75
+ ["host.name", "hosts", "hostIdentifier"],
76
+ ["oneuptime.host.name", "hosts", "hostIdentifier"],
77
+ ["oneuptime.docker.host.name", "dockerHosts", "hostIdentifier"],
78
+ ["oneuptime.podman.host.name", "podmanHosts", "hostIdentifier"],
79
+ ["k8s.cluster.name", "kubernetesClusters", "clusterIdentifier"],
80
+ [
81
+ "oneuptime.kubernetes.cluster.name",
82
+ "kubernetesClusters",
83
+ "clusterIdentifier",
84
+ ],
85
+ ["proxmox.cluster.name", "proxmoxClusters", "name"],
86
+ ["vmware.vcenter.name", "vmwareVCenters", "name"],
87
+ ["ceph.cluster.name", "cephClusters", "name"],
88
+ ["docker.swarm.cluster.name", "dockerSwarmClusters", "name"],
89
+ ["iot.fleet.name", "iotFleets", "name"],
90
+ ["service.name", "services", "name"],
91
+ ["oneuptime.service.name", "services", "name"],
92
+ ];
93
+
94
+ describe("event overlay resource scope", () => {
95
+ test.each(ID_RELATIONS)(
96
+ "filters both event types by %s",
97
+ (key: string, relation: string) => {
98
+ const result: EventOverlayScope = scope({ [key]: RESOURCE_A });
99
+ expect(result.incidentQueries).toEqual([
100
+ { [relation]: { _id: RESOURCE_A } },
101
+ ]);
102
+ expect(result.alertQueries).toEqual([
103
+ relation === "monitors"
104
+ ? { monitorId: RESOURCE_A }
105
+ : { [relation]: { _id: RESOURCE_A } },
106
+ ]);
107
+ expect(result.changeEventQueries).toEqual([
108
+ relation === "services"
109
+ ? { primaryEntityId: RESOURCE_A }
110
+ : { attributes: { [key]: RESOURCE_A } },
111
+ ]);
112
+ },
113
+ );
114
+
115
+ test.each(ID_RELATIONS)(
116
+ "expands %s memberships without dropping the scope",
117
+ (key: string, relation: string) => {
118
+ const result: EventOverlayScope = scope({
119
+ [key]: new Includes([RESOURCE_B, RESOURCE_A, RESOURCE_A]),
120
+ });
121
+ expect(result.incidentQueries).toEqual([
122
+ { [relation]: { _id: RESOURCE_A } },
123
+ { [relation]: { _id: RESOURCE_B } },
124
+ ]);
125
+ expect(result.alertQueries).toEqual(
126
+ relation === "monitors"
127
+ ? [{ monitorId: RESOURCE_A }, { monitorId: RESOURCE_B }]
128
+ : [
129
+ { [relation]: { _id: RESOURCE_A } },
130
+ { [relation]: { _id: RESOURCE_B } },
131
+ ],
132
+ );
133
+ },
134
+ );
135
+
136
+ for (const prefix of ["", "resource."]) {
137
+ test.each(NAME_RELATIONS)(
138
+ `maps ${prefix}%s to its exact resource relation`,
139
+ (key: string, relation: string, column: string) => {
140
+ const result: EventOverlayScope = scope({
141
+ [`${prefix}${key}`]: "production",
142
+ });
143
+ expect(result.incidentQueries).toEqual([
144
+ { [relation]: { [column]: "production" } },
145
+ ]);
146
+ expect(result.alertQueries).toEqual(result.incidentQueries);
147
+ expect(result.changeEventQueries).toEqual([
148
+ { attributes: { [`${prefix}${key}`]: "production" } },
149
+ ]);
150
+ },
151
+ );
152
+
153
+ test.each([
154
+ ["oneuptime.host.id", "hosts"],
155
+ ["oneuptime.docker.host.id", "dockerHosts"],
156
+ ["oneuptime.podman.host.id", "podmanHosts"],
157
+ ["oneuptime.kubernetes.cluster.id", "kubernetesClusters"],
158
+ ["oneuptime.service.id", "services"],
159
+ ])(`uses stamped ${prefix}%s ids`, (key: string, relation: string) => {
160
+ expect(
161
+ scope({ [`${prefix}${key}`]: RESOURCE_A }).incidentQueries,
162
+ ).toEqual([{ [relation]: { _id: RESOURCE_A } }]);
163
+ });
164
+ }
165
+
166
+ test.each(["monitorIds", "serviceLevelObjectiveIds"])(
167
+ "recognizes the generated %s Search(UUID) metric filter",
168
+ (key: string) => {
169
+ expect(scope({ [key]: new Search(RESOURCE_A) })).toEqual(
170
+ scope({ [key]: RESOURCE_A }),
171
+ );
172
+ expect(scope({ [key]: new Search(RESOURCE_A).toJSON() })).toEqual(
173
+ scope({ [key]: RESOURCE_A }),
174
+ );
175
+ expectSuppressed(scope({ [key]: new Search(RESOURCE_A.slice(0, 8)) }));
176
+ },
177
+ );
178
+
179
+ test("accepts equality, ObjectID and serialized membership values", () => {
180
+ expect(scope({ monitorId: new ObjectID(RESOURCE_A) })).toEqual(
181
+ scope({ monitorId: RESOURCE_A }),
182
+ );
183
+ expect(scope({ monitorId: new EqualTo(RESOURCE_A) })).toEqual(
184
+ scope({ monitorId: RESOURCE_A }),
185
+ );
186
+ expect(
187
+ scope({ monitorId: new Includes([RESOURCE_A, RESOURCE_B]).toJSON() }),
188
+ ).toEqual(scope({ monitorId: [RESOURCE_A, RESOURCE_B] }));
189
+ expect(
190
+ scope({ "resource.host.name": new EqualTo("production").toJSON() }),
191
+ ).toEqual(scope({ "resource.host.name": "production" }));
192
+ });
193
+
194
+ test.each([
195
+ undefined,
196
+ null,
197
+ "",
198
+ " ",
199
+ "not-a-uuid",
200
+ new Includes([]),
201
+ new NotEqual(RESOURCE_A),
202
+ new IncludesNone([RESOURCE_A]),
203
+ new Search("prod"),
204
+ new Wildcard(["prod*"]),
205
+ ])(
206
+ "fails closed for invalid or non-exact resource identity %p",
207
+ (value: unknown) => {
208
+ const result: EventOverlayScope = scope({ monitorId: value });
209
+ expectSuppressed(result);
210
+ expect(result.changeEventQueries).toEqual([]);
211
+ },
212
+ );
213
+
214
+ test.each([
215
+ new Search("prod"),
216
+ new NotEqual("prod"),
217
+ new IncludesNone(["prod"]),
218
+ new Wildcard(["prod*"]),
219
+ new Includes([]),
220
+ "",
221
+ null,
222
+ ])("does not broaden a resource name filter %p", (value: unknown) => {
223
+ expectSuppressed(scope({ "resource.host.name": value }));
224
+ });
225
+
226
+ test("keeps names with quotes or punctuation as plain predicate values", () => {
227
+ const name: string = "host' OR 1=1 -- / East";
228
+ expect(scope({ "resource.host.name": name }).incidentQueries).toEqual([
229
+ { hosts: { hostIdentifier: name } },
230
+ ]);
231
+ });
232
+
233
+ test.each([
234
+ [ServiceType.Monitor, "monitors"],
235
+ [ServiceType.ServiceLevelObjective, "serviceLevelObjectives"],
236
+ [ServiceType.Host, "hosts"],
237
+ [ServiceType.DockerHost, "dockerHosts"],
238
+ [ServiceType.PodmanHost, "podmanHosts"],
239
+ [ServiceType.KubernetesCluster, "kubernetesClusters"],
240
+ [ServiceType.ProxmoxCluster, "proxmoxClusters"],
241
+ [ServiceType.VMwareVCenter, "vmwareVCenters"],
242
+ [ServiceType.CephCluster, "cephClusters"],
243
+ [ServiceType.DockerSwarmCluster, "dockerSwarmClusters"],
244
+ [ServiceType.IoTDevice, "iotFleets"],
245
+ [ServiceType.OpenTelemetry, "services"],
246
+ ])(
247
+ "scopes polymorphic primaryEntityId of type %s",
248
+ (type: ServiceType, relation: string) => {
249
+ const result: EventOverlayScope = scope({
250
+ primaryEntityId: RESOURCE_A,
251
+ primaryEntityType: type,
252
+ });
253
+ expect(result.incidentQueries).toEqual([
254
+ { [relation]: { _id: RESOURCE_A } },
255
+ ]);
256
+ expect(result.alertQueries).toEqual([
257
+ type === ServiceType.Monitor
258
+ ? { monitorId: RESOURCE_A }
259
+ : { [relation]: { _id: RESOURCE_A } },
260
+ ]);
261
+ expect(result.changeEventQueries).toEqual(
262
+ type === ServiceType.OpenTelemetry
263
+ ? [{ primaryEntityId: RESOURCE_A }]
264
+ : [],
265
+ );
266
+ },
267
+ );
268
+
269
+ test.each([
270
+ ServiceType.NetworkDevice,
271
+ ServiceType.ServerlessFunction,
272
+ ServiceType.CloudResource,
273
+ ServiceType.RealUserMonitor,
274
+ ServiceType.Unknown,
275
+ ServiceType.ScheduledMaintenance,
276
+ undefined,
277
+ ])(
278
+ "does not treat primary type %s as a telemetry Service",
279
+ (type: ServiceType | undefined) => {
280
+ const result: EventOverlayScope = scope({
281
+ primaryEntityId: RESOURCE_A,
282
+ primaryEntityType: type,
283
+ });
284
+ expectSuppressed(result);
285
+ expect(result.changeEventQueries).toEqual([]);
286
+ },
287
+ );
288
+
289
+ test.each([
290
+ "networkDeviceId",
291
+ "serverlessFunctionId",
292
+ "cloudResourceId",
293
+ "rumApplicationId",
294
+ "iotDeviceId",
295
+ "entityIds",
296
+ "entityKeys",
297
+ "monitorGroupId",
298
+ ])(
299
+ "does not load unrelated incidents for unsupported %s scope",
300
+ (key: string) => {
301
+ expectSuppressed(scope({ [key]: RESOURCE_A }));
302
+ expectSuppressed(
303
+ scope({ [key]: RESOURCE_A, "resource.host.name": "prod" }),
304
+ );
305
+ },
306
+ );
307
+
308
+ test("reads analytics identity fields alongside the attribute filter grammar", () => {
309
+ const query: MetricQueryConfigData = config();
310
+ Object.assign(query.metricQueryData.filterData, {
311
+ primaryEntityId: RESOURCE_A,
312
+ primaryEntityType: ServiceType.Monitor,
313
+ });
314
+ expect(getEventOverlayScope([query]).incidentQueries).toEqual([
315
+ { monitors: { _id: RESOURCE_A } },
316
+ ]);
317
+ });
318
+
319
+ test("shows only the requested incident or alert for event-id metrics", () => {
320
+ expect(scope({ incidentId: RESOURCE_A }).incidentQueries).toEqual([
321
+ { _id: RESOURCE_A },
322
+ ]);
323
+ expect(scope({ incidentId: RESOURCE_A }).alertQueries).toEqual([]);
324
+ expect(scope({ alertId: RESOURCE_A }).alertQueries).toEqual([
325
+ { _id: RESOURCE_A },
326
+ ]);
327
+ expect(scope({ alertId: RESOURCE_A }).incidentQueries).toEqual([]);
328
+ expect(
329
+ scope({
330
+ primaryEntityId: RESOURCE_A,
331
+ primaryEntityType: ServiceType.Incident,
332
+ }).incidentQueries,
333
+ ).toEqual([{ _id: RESOURCE_A }]);
334
+ expect(
335
+ scope({
336
+ primaryEntityId: RESOURCE_A,
337
+ primaryEntityType: ServiceType.Alert,
338
+ }).alertQueries,
339
+ ).toEqual([{ _id: RESOURCE_A }]);
340
+ });
341
+
342
+ test("keeps multiple resource dimensions conjunctive", () => {
343
+ const result: EventOverlayScope = scope({
344
+ monitorId: RESOURCE_A,
345
+ "resource.host.name": "prod",
346
+ "resource.service.name": "api",
347
+ });
348
+ expect(result.incidentQueries).toEqual([
349
+ {
350
+ monitors: { _id: RESOURCE_A },
351
+ hosts: { hostIdentifier: "prod" },
352
+ services: { name: "api" },
353
+ },
354
+ ]);
355
+ expect(result.alertQueries).toEqual([
356
+ {
357
+ monitorId: RESOURCE_A,
358
+ hosts: { hostIdentifier: "prod" },
359
+ services: { name: "api" },
360
+ },
361
+ ]);
362
+ });
363
+
364
+ test("keeps an exact service namespace", () => {
365
+ expect(
366
+ scope({
367
+ "resource.service.name": "api",
368
+ "resource.service.namespace": "prod",
369
+ }).incidentQueries,
370
+ ).toEqual([{ services: { name: "api", serviceNamespace: "prod" } }]);
371
+ });
372
+
373
+ test.each([
374
+ ["docker", "dockerHosts"],
375
+ ["podman", "podmanHosts"],
376
+ ])(
377
+ "uses %s host identity without linking ordinary Hosts",
378
+ (runtime: string, relation: string) => {
379
+ expect(
380
+ scope({
381
+ "resource.host.name": "prod",
382
+ "resource.container.runtime": runtime,
383
+ }).incidentQueries,
384
+ ).toEqual([{ [relation]: { hostIdentifier: "prod" } }]);
385
+ },
386
+ );
387
+
388
+ test.each([
389
+ ["docker", "dockerResources", "dockerHosts"],
390
+ ["podman", "podmanResources", "podmanHosts"],
391
+ ])(
392
+ "narrows %s container charts",
393
+ (runtime: string, relation: string, parent: string) => {
394
+ expect(
395
+ scope({
396
+ "resource.host.name": "prod",
397
+ "resource.container.runtime": runtime,
398
+ "resource.container.name": "web",
399
+ }).incidentQueries,
400
+ ).toEqual([
401
+ {
402
+ [relation]: {
403
+ name: "web",
404
+ kind: "Container",
405
+ [parent === "dockerHosts" ? "dockerHost" : "podmanHost"]: {
406
+ hostIdentifier: "prod",
407
+ },
408
+ },
409
+ },
410
+ ]);
411
+ expect(
412
+ scope({
413
+ "resource.host.name": "prod",
414
+ "resource.container.runtime": runtime,
415
+ "resource.container.id": "container-sha",
416
+ }).alertQueries,
417
+ ).toEqual([
418
+ {
419
+ [relation]: {
420
+ containerId: "container-sha",
421
+ kind: "Container",
422
+ [parent === "dockerHosts" ? "dockerHost" : "podmanHost"]: {
423
+ hostIdentifier: "prod",
424
+ },
425
+ },
426
+ },
427
+ ]);
428
+ },
429
+ );
430
+
431
+ test("does not guess a container runtime", () => {
432
+ expectSuppressed(
433
+ scope({ "resource.host.name": "prod", "resource.container.name": "web" }),
434
+ );
435
+ expectSuppressed(
436
+ scope({
437
+ "resource.host.name": "prod",
438
+ "resource.container.runtime": new Includes(["docker", "podman"]),
439
+ }),
440
+ );
441
+ });
442
+
443
+ test.each([
444
+ ["node", "Node"],
445
+ ["pod", "Pod"],
446
+ ["deployment", "Deployment"],
447
+ ["statefulset", "StatefulSet"],
448
+ ["daemonset", "DaemonSet"],
449
+ ["job", "Job"],
450
+ ["cronjob", "CronJob"],
451
+ ["namespace", "Namespace"],
452
+ ["replicaset", "ReplicaSet"],
453
+ ["service", "Service"],
454
+ ["persistentvolume", "PersistentVolume"],
455
+ ["persistentvolumeclaim", "PersistentVolumeClaim"],
456
+ ])(
457
+ "narrows Kubernetes %s charts to the matching resource kind",
458
+ (key: string, kind: string) => {
459
+ const result: EventOverlayScope = scope({
460
+ "resource.k8s.cluster.name": "prod",
461
+ [`resource.k8s.${key}.name`]: "web",
462
+ });
463
+ expect(result.incidentQueries).toEqual([
464
+ {
465
+ kubernetesResources: {
466
+ name: "web",
467
+ kind,
468
+ kubernetesCluster: { clusterIdentifier: "prod" },
469
+ },
470
+ },
471
+ ]);
472
+ expect(result.alertQueries).toEqual(result.incidentQueries);
473
+ },
474
+ );
475
+
476
+ test("uses namespace membership of the named workload", () => {
477
+ expect(
478
+ scope({
479
+ "resource.k8s.cluster.name": "prod",
480
+ "resource.k8s.pod.name": "web",
481
+ "resource.k8s.namespace.name": "team-a",
482
+ }).incidentQueries,
483
+ ).toEqual([
484
+ {
485
+ kubernetesResources: {
486
+ name: "web",
487
+ kind: "Pod",
488
+ namespaceKey: "team-a",
489
+ kubernetesCluster: { clusterIdentifier: "prod" },
490
+ },
491
+ },
492
+ ]);
493
+ });
494
+
495
+ test("scopes Kubernetes container identity and namespace", () => {
496
+ expect(
497
+ scope({
498
+ "resource.k8s.cluster.name": "prod",
499
+ "resource.k8s.container.name": "web",
500
+ "resource.k8s.namespace.name": "team-a",
501
+ }).incidentQueries,
502
+ ).toEqual([
503
+ {
504
+ kubernetesContainers: {
505
+ name: "web",
506
+ podNamespaceKey: "team-a",
507
+ kubernetesCluster: { clusterIdentifier: "prod" },
508
+ },
509
+ },
510
+ ]);
511
+ });
512
+
513
+ test("matches a container's own pod and cluster without requiring extra event links", () => {
514
+ expect(
515
+ scope({
516
+ "resource.k8s.cluster.name": "prod",
517
+ "resource.k8s.container.name": "web",
518
+ "resource.k8s.pod.name": "web-123",
519
+ "resource.k8s.namespace.name": "team-a",
520
+ }).incidentQueries,
521
+ ).toEqual([
522
+ {
523
+ kubernetesContainers: {
524
+ name: "web",
525
+ podName: "web-123",
526
+ podNamespaceKey: "team-a",
527
+ kubernetesCluster: { clusterIdentifier: "prod" },
528
+ },
529
+ },
530
+ ]);
531
+ });
532
+
533
+ test("keeps generic Kubernetes container name and namespace on the same child", () => {
534
+ expect(
535
+ scope({
536
+ "resource.k8s.cluster.name": "prod",
537
+ "resource.container.name": "web",
538
+ "resource.k8s.pod.name": "web-123",
539
+ "resource.k8s.namespace.name": "team-a",
540
+ }).incidentQueries,
541
+ ).toEqual([
542
+ {
543
+ kubernetesContainers: {
544
+ name: "web",
545
+ podName: "web-123",
546
+ podNamespaceKey: "team-a",
547
+ kubernetesCluster: { clusterIdentifier: "prod" },
548
+ },
549
+ },
550
+ ]);
551
+ });
552
+
553
+ test("does not invent a change-event attribute value for an unresolved entity scope object", () => {
554
+ const result: EventOverlayScope = scope({
555
+ entityScope: { entityKeys: ["opaque-key"] },
556
+ });
557
+ expectSuppressed(result);
558
+ expect(result.changeEventQueries).toEqual([]);
559
+ });
560
+
561
+ test.each([
562
+ "serviceId",
563
+ "serviceIds",
564
+ "services",
565
+ "oneuptime.service.id",
566
+ "resource.oneuptime.service.id",
567
+ ])("loads service deployments by primary entity for %s", (key: string) => {
568
+ expect(scope({ [key]: RESOURCE_A }).changeEventQueries).toEqual([
569
+ { primaryEntityId: RESOURCE_A },
570
+ ]);
571
+ });
572
+
573
+ test("keeps explicit event scope when row navigation lacks chart attributes", () => {
574
+ const query: MetricQueryConfigData = config();
575
+ query.eventScope = {
576
+ primaryEntityId: new Includes([RESOURCE_A]),
577
+ primaryEntityType: ServiceType.RealUserMonitor,
578
+ };
579
+ expectSuppressed(getEventOverlayScope([query]));
580
+ query.eventScope = { entityKeys: new Includes(["opaque-key"]) };
581
+ expectSuppressed(getEventOverlayScope([query]));
582
+ });
583
+
584
+ test("explicit event scope overrides duplicate chart identities while retaining independent filters", () => {
585
+ const query: MetricQueryConfigData = config({
586
+ monitorId: RESOURCE_B,
587
+ "resource.service.name": "api",
588
+ });
589
+ query.eventScope = { monitorId: RESOURCE_A };
590
+ expect(getEventOverlayScope([query]).incidentQueries).toEqual([
591
+ { monitors: { _id: RESOURCE_A }, services: { name: "api" } },
592
+ ]);
593
+ });
594
+
595
+ test("explicit polymorphic identity overrides an analytics filter with the same key", () => {
596
+ const query: MetricQueryConfigData = config();
597
+ Object.assign(query.metricQueryData.filterData, {
598
+ primaryEntityId: RESOURCE_B,
599
+ primaryEntityType: ServiceType.OpenTelemetry,
600
+ });
601
+ query.eventScope = {
602
+ primaryEntityId: RESOURCE_A,
603
+ primaryEntityType: ServiceType.Monitor,
604
+ };
605
+ expect(getEventOverlayScope([query]).incidentQueries).toEqual([
606
+ { monitors: { _id: RESOURCE_A } },
607
+ ]);
608
+ });
609
+
610
+ test("declared but empty event scope does not become project-wide", () => {
611
+ const query: MetricQueryConfigData = config();
612
+ query.eventScope = {};
613
+ expect(getEventOverlayScope([query])).toEqual({
614
+ incidentQueries: [],
615
+ alertQueries: [],
616
+ changeEventQueries: [],
617
+ });
618
+ });
619
+
620
+ test("matches the parent id of an explicitly scoped child resource", () => {
621
+ expect(
622
+ scope({ dockerResourceId: RESOURCE_B, dockerHostId: RESOURCE_A })
623
+ .incidentQueries,
624
+ ).toEqual([
625
+ { dockerResources: { _id: RESOURCE_B, dockerHost: { _id: RESOURCE_A } } },
626
+ ]);
627
+ expect(
628
+ scope({
629
+ kubernetesResourceId: RESOURCE_B,
630
+ kubernetesClusterId: RESOURCE_A,
631
+ }).incidentQueries,
632
+ ).toEqual([
633
+ {
634
+ kubernetesResources: {
635
+ _id: RESOURCE_B,
636
+ kubernetesCluster: { _id: RESOURCE_A },
637
+ },
638
+ },
639
+ ]);
640
+ });
641
+
642
+ test("suppresses unrelated events for the actual cloud environment telemetry attributes", () => {
643
+ const attributes: Record<string, string> = {
644
+ "resource.cloud.platform": "aws_ec2",
645
+ "resource.cloud.account.id": "123",
646
+ "resource.cloud.region": "eu-west-1",
647
+ };
648
+ expectSuppressed(scope(attributes));
649
+ expect(scope(attributes).changeEventQueries).toEqual([{ attributes }]);
650
+ });
651
+
652
+ test("a runtime-only chart does not imply project-wide incidents", () => {
653
+ expectSuppressed(scope({ "resource.container.runtime": "docker" }));
654
+ expect(
655
+ scope({ "resource.container.runtime": "docker" }).changeEventQueries,
656
+ ).toEqual([{ attributes: { "resource.container.runtime": "docker" } }]);
657
+ });
658
+
659
+ test.each([
660
+ ["resource.proxmox.cluster.name", "proxmoxClusters", "id", "qemu/101"],
661
+ ["resource.iot.fleet.name", "iotFleets", "id", "device-101"],
662
+ ["resource.ceph.cluster.name", "cephClusters", "ceph_daemon", "osd.3"],
663
+ ["resource.ceph.cluster.name", "cephClusters", "pool_id", "3"],
664
+ [
665
+ "resource.vmware.vcenter.name",
666
+ "vmwareVCenters",
667
+ "resource.vcenter.vm.id",
668
+ "vm-101",
669
+ ],
670
+ [
671
+ "resource.vmware.vcenter.name",
672
+ "vmwareVCenters",
673
+ "resource.vcenter.host.name",
674
+ "esxi-1",
675
+ ],
676
+ [
677
+ "resource.vmware.vcenter.name",
678
+ "vmwareVCenters",
679
+ "resource.vcenter.datastore.name",
680
+ "datastore-1",
681
+ ],
682
+ [
683
+ "resource.vmware.vcenter.name",
684
+ "vmwareVCenters",
685
+ "resource.vcenter.cluster.name",
686
+ "cluster-1",
687
+ ],
688
+ ])(
689
+ "narrows %s descendant %s by the breaching-series identity",
690
+ (key: string, relation: string, childKey: string, value: string) => {
691
+ const result: EventOverlayScope = scope({
692
+ [key]: "prod",
693
+ [childKey]: value,
694
+ });
695
+ expect(result.incidentQueries).toEqual([
696
+ { [relation]: { name: "prod" }, seriesLabels: { [childKey]: value } },
697
+ ]);
698
+ expect(result.alertQueries).toEqual(result.incidentQueries);
699
+ },
700
+ );
701
+
702
+ test("retains project-wide events only for genuinely unscoped metrics", () => {
703
+ const unscoped: EventOverlayScope = {
704
+ incidentQueries: [{}],
705
+ alertQueries: [{}],
706
+ changeEventQueries: [{}],
707
+ };
708
+ expect(getEventOverlayScope(undefined)).toEqual(unscoped);
709
+ expect(getEventOverlayScope([])).toEqual(unscoped);
710
+ expect(scope({ projectId: RESOURCE_A, probeId: RESOURCE_B })).toEqual(
711
+ unscoped,
712
+ );
713
+ expect(scope({ "http.method": "GET" })).toEqual(unscoped);
714
+ });
715
+
716
+ test("deduplicates repeated resource queries and canonicalizes the refresh identity", () => {
717
+ const first: MetricQueryConfigData = config({
718
+ "resource.service.name": "api",
719
+ monitorId: RESOURCE_A,
720
+ });
721
+ const second: MetricQueryConfigData = config({ monitorId: RESOURCE_B });
722
+ const reversed: MetricQueryConfigData = config({
723
+ monitorId: RESOURCE_A,
724
+ "resource.service.name": "api",
725
+ });
726
+ expect(JSON.stringify(getEventOverlayScope([first, second, first]))).toBe(
727
+ JSON.stringify(getEventOverlayScope([second, reversed])),
728
+ );
729
+ expect(
730
+ getEventOverlayScope([
731
+ config({ monitorId: RESOURCE_A }),
732
+ config({ monitorId: RESOURCE_A }),
733
+ ]).incidentQueries,
734
+ ).toHaveLength(1);
735
+ });
736
+
737
+ test("adding a blank draft does not broaden a selected monitor's events", () => {
738
+ const selected: MetricQueryConfigData = config({ monitorId: RESOURCE_A });
739
+ const draft: MetricQueryConfigData = config();
740
+ draft.metricQueryData.filterData.metricName = "";
741
+ expect(getEventOverlayScope([selected, draft])).toEqual(
742
+ getEventOverlayScope([selected]),
743
+ );
744
+ expect(getEventOverlayScope([draft, selected])).toEqual(
745
+ getEventOverlayScope([selected]),
746
+ );
747
+ });
748
+
749
+ test("a view containing only unnamed drafts requests no event sources", () => {
750
+ const blank: MetricQueryConfigData = config();
751
+ blank.metricQueryData.filterData.metricName = "";
752
+ const whitespace: MetricQueryConfigData = config({ "http.method": "GET" });
753
+ whitespace.metricQueryData.filterData.metricName = " ";
754
+ const missingName: MetricQueryConfigData = {
755
+ metricQueryData: { filterData: {} },
756
+ };
757
+ expect(getEventOverlayScope([blank, whitespace, missingName])).toEqual({
758
+ incidentQueries: [],
759
+ alertQueries: [],
760
+ changeEventQueries: [],
761
+ });
762
+ });
763
+
764
+ test("unrecognized explicit event metadata never becomes project-wide", () => {
765
+ const query: MetricQueryConfigData = config();
766
+ query.eventScope = { "custom.inventory.identity": "specific-resource" };
767
+ expect(getEventOverlayScope([query])).toEqual({
768
+ incidentQueries: [],
769
+ alertQueries: [],
770
+ changeEventQueries: [],
771
+ });
772
+ query.metricQueryData.filterData.metricName = "";
773
+ expect(getEventOverlayScope([query])).toEqual({
774
+ incidentQueries: [],
775
+ alertQueries: [],
776
+ changeEventQueries: [],
777
+ });
778
+ });
779
+
780
+ test("keeps meaningful scope-only contexts without a metric name", () => {
781
+ const query: MetricQueryConfigData = {
782
+ metricQueryData: {
783
+ filterData: { attributes: { monitorId: RESOURCE_A } },
784
+ },
785
+ };
786
+ expect(getEventOverlayScope([query])).toEqual(
787
+ scope({ monitorId: RESOURCE_A }),
788
+ );
789
+ query.metricQueryData.filterData.metricName = "";
790
+ expect(getEventOverlayScope([query])).toEqual(
791
+ scope({ monitorId: RESOURCE_A }),
792
+ );
793
+ });
794
+
795
+ test("keeps explicitly declared metadata on an unnamed query", () => {
796
+ const query: MetricQueryConfigData = {
797
+ metricQueryData: { filterData: {} },
798
+ eventScope: { monitorId: RESOURCE_A },
799
+ };
800
+ expect(getEventOverlayScope([query])).toEqual(
801
+ scope({ monitorId: RESOURCE_A }),
802
+ );
803
+ query.eventScope = {};
804
+ expect(getEventOverlayScope([query])).toEqual({
805
+ incidentQueries: [],
806
+ alertQueries: [],
807
+ changeEventQueries: [],
808
+ });
809
+ });
810
+
811
+ test("does not broaden when query memberships exceed the bounded request budget", () => {
812
+ const values: Array<string> = Array.from(
813
+ { length: EVENT_OVERLAY_SCOPE_QUERY_LIMIT + 1 },
814
+ (_: unknown, index: number): string => {
815
+ return `host-${index}`;
816
+ },
817
+ );
818
+ expectSuppressed(scope({ "resource.host.name": new Includes(values) }));
819
+ expectSuppressed(
820
+ getEventOverlayScope(
821
+ values.map((value: string): MetricQueryConfigData => {
822
+ return config({ "resource.host.name": value });
823
+ }),
824
+ ),
825
+ );
826
+ });
827
+
828
+ test("does not broaden inconsistent filters for one resource", () => {
829
+ expectSuppressed(scope({ monitorId: RESOURCE_A, monitorIds: RESOURCE_B }));
830
+ expectSuppressed(
831
+ scope({ "host.name": "one", "resource.host.name": "two" }),
832
+ );
833
+ });
834
+
835
+ test("does not mutate query configs or their operator values", () => {
836
+ const membership: Includes = new Includes([RESOURCE_B, RESOURCE_A]);
837
+ const query: MetricQueryConfigData = config({
838
+ "resource.host.name": membership,
839
+ });
840
+ const before: string = JSON.stringify(query);
841
+ getEventOverlayScope([query]);
842
+ expect(JSON.stringify(query)).toBe(before);
843
+ expect(membership.values).toEqual([RESOURCE_B, RESOURCE_A]);
844
+ });
845
+ });