@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
@@ -465,13 +465,15 @@ afterEach(() => {
465
465
  });
466
466
 
467
467
  describe("InvestigationPanel report lifecycle", () => {
468
- test("renders nothing and briefly discovers a run when none exists yet", async () => {
468
+ test("explains a missing run and briefly checks whether one appears", async () => {
469
469
  postMock.mockResolvedValue(noInvestigationResponse() as never);
470
470
 
471
- const { container } = renderPanel();
471
+ renderPanel();
472
472
  await flush();
473
473
 
474
- expect(container).toBeEmptyDOMElement();
474
+ expect(
475
+ screen.getByText("No investigation has been recorded"),
476
+ ).toBeVisible();
475
477
  expect(jest.getTimerCount()).toBe(1);
476
478
 
477
479
  await advanceFastPolls(4);
@@ -706,7 +708,8 @@ describe("InvestigationPanel report lifecycle", () => {
706
708
  );
707
709
  await flush();
708
710
 
709
- expect(view.container).toBeEmptyDOMElement();
711
+ expect(screen.getByText("Checking investigation status…")).toBeVisible();
712
+ expect(screen.queryByTestId("investigation-markdown")).toBeNull();
710
713
  expect(onAnalysisAvailable).not.toHaveBeenCalled();
711
714
 
712
715
  await resolveDeferred(
@@ -148,7 +148,7 @@ describe("InvestigationPanel status reporting", () => {
148
148
  ),
149
149
  );
150
150
 
151
- const { container } = render(
151
+ render(
152
152
  <InvestigationPanel
153
153
  subjectType="incident"
154
154
  subjectId={SUBJECT_ID}
@@ -164,7 +164,9 @@ describe("InvestigationPanel status reporting", () => {
164
164
  });
165
165
 
166
166
  expect(onStatusChange).toHaveBeenCalledWith(null);
167
- expect(container).toBeEmptyDOMElement();
167
+ expect(
168
+ screen.getByText("No investigation has been recorded"),
169
+ ).toBeVisible();
168
170
  });
169
171
 
170
172
  test("discovers an AI run that is enqueued after the incident page loads", async () => {
@@ -447,13 +449,13 @@ describe("InvestigationPanel status reporting", () => {
447
449
  expect(jest.getTimerCount()).toBe(0);
448
450
  });
449
451
 
450
- test("degrades silently when the initial request fails", async () => {
452
+ test("shows an unavailable status when the initial request fails", async () => {
451
453
  const onStatusChange: MockFunction = getJestMockFunction();
452
454
  postMock.mockResolvedValue(
453
455
  new HTTPErrorResponse(500, { message: "boom" }, {}),
454
456
  );
455
457
 
456
- const { container } = render(
458
+ render(
457
459
  <InvestigationPanel
458
460
  subjectType="incident"
459
461
  subjectId={SUBJECT_ID}
@@ -464,7 +466,10 @@ describe("InvestigationPanel status reporting", () => {
464
466
  await waitFor(() => {
465
467
  expect(onStatusChange).toHaveBeenCalledWith(null);
466
468
  });
467
- expect(container).toBeEmptyDOMElement();
469
+ expect(
470
+ screen.getByText("Investigation status is unavailable"),
471
+ ).toBeVisible();
472
+ expect(screen.queryByText("Not investigated")).toBeNull();
468
473
  });
469
474
 
470
475
  test("preserves the last active status through a transient polling failure", async () => {
@@ -534,7 +539,7 @@ describe("InvestigationPanel status reporting", () => {
534
539
  new HTTPErrorResponse(503, { message: "try again" }, {}),
535
540
  );
536
541
 
537
- const { container, rerender } = render(
542
+ const { rerender } = render(
538
543
  <InvestigationPanel
539
544
  subjectType="incident"
540
545
  subjectId={SUBJECT_ID}
@@ -552,10 +557,13 @@ describe("InvestigationPanel status reporting", () => {
552
557
  );
553
558
 
554
559
  await waitFor(() => {
555
- expect(container).toBeEmptyDOMElement();
560
+ expect(
561
+ screen.getByText("Investigation status is unavailable"),
562
+ ).toBeVisible();
556
563
  expect(onStatusChange).toHaveBeenLastCalledWith(null);
557
564
  });
558
565
  expect(postMock).toHaveBeenCalledTimes(2);
566
+ expect(screen.queryByText("Investigating…")).toBeNull();
559
567
  });
560
568
 
561
569
  test("ignores a late response from the previous subject", async () => {
@@ -0,0 +1,264 @@
1
+ import "@testing-library/jest-dom";
2
+ import {
3
+ afterEach,
4
+ beforeEach,
5
+ describe,
6
+ expect,
7
+ jest,
8
+ test,
9
+ } from "@jest/globals";
10
+ import {
11
+ act,
12
+ cleanup,
13
+ fireEvent,
14
+ render,
15
+ screen,
16
+ } from "@testing-library/react";
17
+ import * as React from "react";
18
+ import MetricsViewer from "../../../../App/FeatureSet/Dashboard/src/Components/Metrics/MetricsViewer";
19
+ import MetricExplorerUrl, {
20
+ SerializedMetricQuery,
21
+ } from "../../../Utils/Metrics/MetricExplorerUrl";
22
+ import { buildQueryConfigsFromSerializedQueries } from "../../../../App/FeatureSet/Dashboard/src/Components/Metrics/Utils/MetricConfigReconstruct";
23
+ import MetricQueryConfigData from "../../../Types/Metrics/MetricQueryConfigData";
24
+ import MetricType from "../../../Models/DatabaseModels/MetricType";
25
+ import ObjectID from "../../../Types/ObjectID";
26
+ import Includes from "../../../Types/BaseDatabase/Includes";
27
+ import ServiceType from "../../../Types/Telemetry/ServiceType";
28
+ import Navigation from "../../../UI/Utils/Navigation";
29
+ import ProjectUtil from "../../../UI/Utils/Project";
30
+
31
+ /*
32
+ * Render the real list's row navigation with the data-loading and table
33
+ * chrome replaced. These boundaries do not participate in URL generation.
34
+ */
35
+ jest.mock("../../../UI/Components/TelemetryViewer/TelemetryViewer", () => {
36
+ return {
37
+ __esModule: true,
38
+ default: (props: {
39
+ renderRow: (metric: MetricType) => React.ReactElement;
40
+ }) => {
41
+ return props.renderRow({ name: "cpu.usage" } as MetricType);
42
+ },
43
+ };
44
+ });
45
+
46
+ jest.mock(
47
+ "../../../../App/FeatureSet/Dashboard/src/Components/Metrics/MetricRow",
48
+ () => {
49
+ return {
50
+ __esModule: true,
51
+ default: (props: { onClick: () => void }) => {
52
+ return <button onClick={props.onClick}>Open metric</button>;
53
+ },
54
+ };
55
+ },
56
+ );
57
+
58
+ jest.mock("../../../UI/Utils/ModelAPI/ModelAPI", () => {
59
+ return {
60
+ __esModule: true,
61
+ default: {
62
+ getList: () => {
63
+ return Promise.resolve({ data: [], count: 0 });
64
+ },
65
+ getCommonHeaders: () => {
66
+ return {};
67
+ },
68
+ },
69
+ };
70
+ });
71
+
72
+ jest.mock("../../../UI/Utils/AnalyticsModelAPI/AnalyticsModelAPI", () => {
73
+ return {
74
+ __esModule: true,
75
+ default: {
76
+ getList: () => {
77
+ return Promise.resolve({ data: [] });
78
+ },
79
+ aggregate: () => {
80
+ return Promise.resolve({ data: [] });
81
+ },
82
+ },
83
+ };
84
+ });
85
+
86
+ jest.mock("../../../UI/Utils/API/API", () => {
87
+ return {
88
+ __esModule: true,
89
+ default: {
90
+ post: () => {
91
+ return Promise.resolve({ data: { facets: {} } });
92
+ },
93
+ },
94
+ };
95
+ });
96
+
97
+ jest.mock(
98
+ "../../../../App/FeatureSet/Dashboard/src/Components/Metrics/Utils/Metrics",
99
+ () => {
100
+ return {
101
+ __esModule: true,
102
+ default: {
103
+ getTelemetryAttributes: () => {
104
+ return Promise.resolve([]);
105
+ },
106
+ fetchSparklineAggregates: () => {
107
+ return Promise.resolve(new Map());
108
+ },
109
+ },
110
+ };
111
+ },
112
+ );
113
+
114
+ jest.mock("../../../UI/Utils/Telemetry/UseTelemetryEntityNames", () => {
115
+ return {
116
+ __esModule: true,
117
+ default: () => {
118
+ return {};
119
+ },
120
+ };
121
+ });
122
+
123
+ const FIRST_ID: ObjectID = new ObjectID("11111111-0000-4000-8000-000000000001");
124
+ const SECOND_ID: ObjectID = new ObjectID(
125
+ "22222222-0000-4000-8000-000000000002",
126
+ );
127
+ let navigateSpy: ReturnType<typeof jest.spyOn>;
128
+
129
+ type ViewerProps = React.ComponentProps<typeof MetricsViewer>;
130
+
131
+ async function openMetric(props: ViewerProps): Promise<MetricQueryConfigData> {
132
+ await act(async () => {
133
+ render(<MetricsViewer {...props} disableUrlSync={true} />);
134
+ });
135
+ fireEvent.click(screen.getByRole("button", { name: "Open metric" }));
136
+ const url: globalThis.URL = new globalThis.URL(
137
+ navigateSpy.mock.calls[0]![0]!.toString(),
138
+ );
139
+ const queries: Array<SerializedMetricQuery> =
140
+ MetricExplorerUrl.parseMetricQueriesParam(
141
+ url.searchParams.get("metricQueries")!,
142
+ );
143
+ expect(queries).toHaveLength(1);
144
+ return buildQueryConfigsFromSerializedQueries(queries)[0]!;
145
+ }
146
+
147
+ beforeEach(() => {
148
+ jest.spyOn(ProjectUtil, "getCurrentProjectId").mockReturnValue(FIRST_ID);
149
+ navigateSpy = jest.spyOn(Navigation, "navigate").mockImplementation(() => {
150
+ return undefined;
151
+ });
152
+ });
153
+
154
+ afterEach(() => {
155
+ cleanup();
156
+ jest.restoreAllMocks();
157
+ });
158
+
159
+ describe("metric-list resource scope on row navigation", () => {
160
+ test("RUM's polymorphic entity id remains RUM when its metric has no attribute filter", async () => {
161
+ const query: MetricQueryConfigData = await openMetric({
162
+ serviceIds: [FIRST_ID],
163
+ scopeEntityType: ServiceType.RealUserMonitor,
164
+ });
165
+ expect(query.eventScope?.["primaryEntityType"]).toBe(
166
+ ServiceType.RealUserMonitor,
167
+ );
168
+ expect((query.eventScope?.["primaryEntityId"] as Includes).values).toEqual([
169
+ FIRST_ID.toString(),
170
+ ]);
171
+ expect(query.metricQueryData.filterData.attributes).toEqual({});
172
+ });
173
+
174
+ test("service scope retains every selected service id", async () => {
175
+ const query: MetricQueryConfigData = await openMetric({
176
+ serviceIds: [FIRST_ID, SECOND_ID],
177
+ });
178
+ expect(query.eventScope?.["primaryEntityType"]).toBe(
179
+ ServiceType.OpenTelemetry,
180
+ );
181
+ expect((query.eventScope?.["primaryEntityId"] as Includes).values).toEqual([
182
+ FIRST_ID.toString(),
183
+ SECOND_ID.toString(),
184
+ ]);
185
+ });
186
+
187
+ test("Inventory's opaque entity membership survives navigation", async () => {
188
+ const query: MetricQueryConfigData = await openMetric({
189
+ entityKeysFilter: ["inventory-entity"],
190
+ });
191
+ expect((query.eventScope?.["entityKeys"] as Includes).values).toEqual([
192
+ "inventory-entity",
193
+ ]);
194
+ expect(query.metricQueryData.filterData.attributes).toEqual({});
195
+ });
196
+
197
+ test.each<Record<string, string>>([
198
+ { "resource.host.name": "Web-01" },
199
+ { "resource.service.name": "Checkout" },
200
+ {
201
+ "resource.k8s.cluster.name": "Prod",
202
+ "resource.k8s.namespace.name": "Apps",
203
+ "resource.k8s.pod.name": "Checkout-1",
204
+ },
205
+ ])(
206
+ "Inventory's natural identity %p survives without losing its original case",
207
+ async (searchAttributes: Record<string, string>) => {
208
+ const query: MetricQueryConfigData = await openMetric({
209
+ entityKeysFilter: ["inventory-entity"],
210
+ entityKeyDisplays: {
211
+ "inventory-entity": {
212
+ displayKey: "Resource",
213
+ displayValue: "Example",
214
+ searchAttributes,
215
+ },
216
+ },
217
+ });
218
+ expect(query.eventScope).toEqual(searchAttributes);
219
+ expect(query.metricQueryData.filterData.attributes).toEqual({});
220
+ },
221
+ );
222
+
223
+ test("multiple inventory memberships remain bounded when one natural identity cannot represent them", async () => {
224
+ const query: MetricQueryConfigData = await openMetric({
225
+ entityKeysFilter: ["entity-a", "entity-b"],
226
+ entityKeyDisplays: {
227
+ "entity-a": {
228
+ displayKey: "Host",
229
+ displayValue: "Web-01",
230
+ searchAttributes: { "resource.host.name": "Web-01" },
231
+ },
232
+ },
233
+ });
234
+ expect((query.eventScope?.["entityKeys"] as Includes).values).toEqual([
235
+ "entity-a",
236
+ "entity-b",
237
+ ]);
238
+ });
239
+
240
+ test("legacy membership scopes survive without becoming synthetic attribute filters", async () => {
241
+ const query: MetricQueryConfigData = await openMetric({
242
+ entityScope: {
243
+ entityKeys: ["host-entity"],
244
+ attributeKey: "resource.host.name",
245
+ attributeValue: "web-01",
246
+ },
247
+ attributeFilters: { "resource.host.name": "web-01" },
248
+ });
249
+ expect(query.eventScope).toEqual({ "resource.host.name": "web-01" });
250
+ expect(query.metricQueryData.filterData.attributes).toEqual({
251
+ "resource.host.name": "web-01",
252
+ });
253
+ });
254
+
255
+ test("ordinary attribute-scoped charts retain their existing scope", async () => {
256
+ const query: MetricQueryConfigData = await openMetric({
257
+ attributeFilters: { "resource.k8s.cluster.name": "prod" },
258
+ });
259
+ expect(query.eventScope).toBeUndefined();
260
+ expect(query.metricQueryData.filterData.attributes).toEqual({
261
+ "resource.k8s.cluster.name": "prod",
262
+ });
263
+ });
264
+ });
@@ -0,0 +1,342 @@
1
+ import "@testing-library/jest-dom";
2
+ import {
3
+ afterEach,
4
+ beforeEach,
5
+ describe,
6
+ expect,
7
+ jest,
8
+ test,
9
+ } from "@jest/globals";
10
+ import { cleanup, render, screen, within } from "@testing-library/react";
11
+ import * as React from "react";
12
+ import Permission from "../../../Types/Permission";
13
+
14
+ /*
15
+ * https://github.com/OneUptime/oneuptime/issues/3867
16
+ *
17
+ * "Test Monitor" on the Monitor Overview's summary card.
18
+ *
19
+ * The card is where a reader already asks "is this working right now", so it
20
+ * is where the on-demand version of that question belongs. What these pin is
21
+ * when the action is offered at all - because the summary card renders for
22
+ * every monitor type except Manual, while a test only means something for the
23
+ * fourteen types a probe actually runs, and only when there are steps to run
24
+ * and something to run them on.
25
+ *
26
+ * The other half is coexistence: the card's right-hand slot already holds the
27
+ * "Showing results from:" probe picker, and an implementation that reached for
28
+ * the same slot would silently replace it - the regression that issue #2899
29
+ * was about. So every test that expects the button also checks the picker is
30
+ * still there.
31
+ *
32
+ * ModelAPI is stubbed because MonitorTestForm imports it; nothing here presses
33
+ * the button, so the stub only has to exist.
34
+ */
35
+
36
+ let currentPermissions: Array<Permission> = [Permission.ProjectAdmin];
37
+
38
+ jest.mock("../../../UI/Utils/ModelAPI/ModelAPI", () => {
39
+ return {
40
+ __esModule: true,
41
+ default: {
42
+ create: (): Promise<never> => {
43
+ return Promise.reject(new Error("not used"));
44
+ },
45
+ getItem: (): Promise<null> => {
46
+ return Promise.resolve(null);
47
+ },
48
+ },
49
+ };
50
+ });
51
+
52
+ jest.mock("../../../UI/Utils/Permission", () => {
53
+ return {
54
+ __esModule: true,
55
+ default: {
56
+ getAllPermissions: (): Array<Permission> => {
57
+ return currentPermissions;
58
+ },
59
+ getProjectPermissions: (): null => {
60
+ return null;
61
+ },
62
+ getGlobalPermissions: (): null => {
63
+ return null;
64
+ },
65
+ },
66
+ };
67
+ });
68
+
69
+ jest.mock("../../../UI/Utils/User", () => {
70
+ return {
71
+ __esModule: true,
72
+ default: {
73
+ isMasterAdmin: (): boolean => {
74
+ return false;
75
+ },
76
+ getUserId: (): null => {
77
+ return null;
78
+ },
79
+ },
80
+ };
81
+ });
82
+
83
+ import Summary from "../../../../App/FeatureSet/Dashboard/src/Components/Monitor/SummaryView/Summary";
84
+ import Probe from "../../../Models/DatabaseModels/Probe";
85
+ import MonitorStep from "../../../Types/Monitor/MonitorStep";
86
+ import MonitorSteps from "../../../Types/Monitor/MonitorSteps";
87
+ import MonitorType from "../../../Types/Monitor/MonitorType";
88
+ import ObjectID from "../../../Types/ObjectID";
89
+
90
+ const MONITOR_ID: string = "11111111-1111-4111-8111-111111111111";
91
+ const PROBE_ID: string = "44444444-4444-4444-8444-444444444444";
92
+ const DISABLED_PROBE_ID: string = "55555555-5555-4555-8555-555555555555";
93
+
94
+ function probe(id: string, name: string): Probe {
95
+ return Object.assign(new Probe(), { _id: id, name: name });
96
+ }
97
+
98
+ const ATTACHED_PROBES: Array<Probe> = [probe(PROBE_ID, "Ohio Probe")];
99
+
100
+ function stepsWith(count: number): MonitorSteps {
101
+ const monitorSteps: MonitorSteps = new MonitorSteps();
102
+
103
+ monitorSteps.data = {
104
+ monitorStepsInstanceArray: Array.from({ length: count }, () => {
105
+ return new MonitorStep();
106
+ }),
107
+ };
108
+
109
+ return monitorSteps;
110
+ }
111
+
112
+ interface SummaryOptions {
113
+ monitorType?: MonitorType | undefined;
114
+ monitorSteps?: MonitorSteps | undefined;
115
+ /*
116
+ * Spelled as its own flag rather than `monitorSteps: undefined`, which a
117
+ * `?? default` in this helper would silently turn back into the default -
118
+ * and the test would then assert the opposite of what it says.
119
+ */
120
+ withoutMonitorSteps?: boolean | undefined;
121
+ probes?: Array<Probe> | undefined;
122
+ disabledProbeIds?: Array<string> | undefined;
123
+ withoutMonitorId?: boolean | undefined;
124
+ }
125
+
126
+ function renderSummary(options: SummaryOptions = {}): void {
127
+ const monitorSteps: MonitorSteps | undefined = options.withoutMonitorSteps
128
+ ? undefined
129
+ : options.monitorSteps || stepsWith(1);
130
+
131
+ if (options.withoutMonitorId) {
132
+ render(
133
+ <Summary
134
+ monitorType={options.monitorType || MonitorType.Website}
135
+ monitorSteps={monitorSteps}
136
+ probes={options.probes || ATTACHED_PROBES}
137
+ disabledProbeIds={options.disabledProbeIds}
138
+ />,
139
+ );
140
+
141
+ return;
142
+ }
143
+
144
+ render(
145
+ <Summary
146
+ monitorType={options.monitorType || MonitorType.Website}
147
+ monitorSteps={monitorSteps}
148
+ monitorId={new ObjectID(MONITOR_ID)}
149
+ probes={options.probes || ATTACHED_PROBES}
150
+ disabledProbeIds={options.disabledProbeIds}
151
+ />,
152
+ );
153
+ }
154
+
155
+ function testButton(): HTMLElement | null {
156
+ return screen.queryByTestId("test-monitor-button");
157
+ }
158
+
159
+ function probePicker(): HTMLElement | null {
160
+ return screen.queryByRole("combobox");
161
+ }
162
+
163
+ beforeEach(() => {
164
+ currentPermissions = [Permission.ProjectAdmin];
165
+ });
166
+
167
+ afterEach(() => {
168
+ cleanup();
169
+ });
170
+
171
+ describe("the summary card offers a test", () => {
172
+ test("a probeable monitor with steps and a probe gets the button", () => {
173
+ renderSummary();
174
+
175
+ expect(testButton()).toBeInTheDocument();
176
+ });
177
+
178
+ test("the button lives on the Monitor Summary card itself", () => {
179
+ /*
180
+ * Queried through the card rather than the page, because a second
181
+ * component in the dashboard also renders a card titled "Monitor Summary"
182
+ * (the snapshot card on incident and alert pages). This one is the
183
+ * overview's.
184
+ */
185
+ renderSummary();
186
+
187
+ const card: HTMLElement = screen.getByTestId("card");
188
+
189
+ expect(
190
+ within(card).getByRole("heading", { name: "Monitor Summary" }),
191
+ ).toBeInTheDocument();
192
+ expect(within(card).getByTestId("test-monitor-button")).toBeInTheDocument();
193
+ });
194
+
195
+ test("the probe picker is still there next to it", () => {
196
+ /*
197
+ * The card's right-hand slot was already taken by "Showing results from:".
198
+ * Putting the button there instead of in the card's own actions slot would
199
+ * have removed the picker - and would have shipped green, because nothing
200
+ * else asserts the picker renders.
201
+ */
202
+ renderSummary();
203
+
204
+ expect(testButton()).toBeInTheDocument();
205
+ expect(probePicker()).toBeInTheDocument();
206
+ expect(screen.getByText("Showing results from:")).toBeInTheDocument();
207
+ });
208
+
209
+ test("the button is offered for every probeable monitor type", () => {
210
+ const probeableTypes: Array<MonitorType> = [
211
+ MonitorType.API,
212
+ MonitorType.Website,
213
+ MonitorType.IP,
214
+ MonitorType.Ping,
215
+ MonitorType.Port,
216
+ MonitorType.SSLCertificate,
217
+ MonitorType.SyntheticMonitor,
218
+ MonitorType.CustomJavaScriptCode,
219
+ MonitorType.DNS,
220
+ MonitorType.DNSSEC,
221
+ MonitorType.Domain,
222
+ MonitorType.SQLQuery,
223
+ MonitorType.Database,
224
+ MonitorType.ExternalStatusPage,
225
+ ];
226
+
227
+ for (const monitorType of probeableTypes) {
228
+ renderSummary({ monitorType: monitorType });
229
+
230
+ expect(testButton()).toBeInTheDocument();
231
+
232
+ cleanup();
233
+ }
234
+ });
235
+
236
+ test("an attached probe that is switched off can still be tested against", () => {
237
+ /*
238
+ * A disabled probe stops WATCHING the monitor; it still picks up a test,
239
+ * because the queue is claimed by probe id alone. Being able to test with
240
+ * it is how an operator checks a probe before switching it back on.
241
+ */
242
+ renderSummary({
243
+ probes: [
244
+ probe(PROBE_ID, "Ohio Probe"),
245
+ probe(DISABLED_PROBE_ID, "Attic"),
246
+ ],
247
+ disabledProbeIds: [DISABLED_PROBE_ID],
248
+ });
249
+
250
+ expect(testButton()).toBeInTheDocument();
251
+ });
252
+ });
253
+
254
+ describe("the summary card withholds a test", () => {
255
+ test("a monitor type no probe runs gets no button", () => {
256
+ /*
257
+ * The card still renders for these - they have their own summary - so the
258
+ * button has to be withheld at this call site rather than left to the form
259
+ * to render nothing, which would leave an empty slot in the header.
260
+ */
261
+ renderSummary({ monitorType: MonitorType.Logs });
262
+
263
+ expect(testButton()).not.toBeInTheDocument();
264
+ });
265
+
266
+ test("an incoming-request monitor gets no button", () => {
267
+ renderSummary({ monitorType: MonitorType.IncomingRequest });
268
+
269
+ expect(testButton()).not.toBeInTheDocument();
270
+ });
271
+
272
+ test("a server monitor gets no button", () => {
273
+ renderSummary({ monitorType: MonitorType.Server });
274
+
275
+ expect(testButton()).not.toBeInTheDocument();
276
+ });
277
+
278
+ test("a monitor with no steps gets no button", () => {
279
+ /*
280
+ * The row would be created and accepted, and the probe would return
281
+ * without reporting anything - so the only thing the user would ever see
282
+ * is the poll giving up two and a half minutes later.
283
+ */
284
+ renderSummary({ withoutMonitorSteps: true });
285
+
286
+ expect(testButton()).not.toBeInTheDocument();
287
+ });
288
+
289
+ test("a monitor with an empty steps array gets no button", () => {
290
+ renderSummary({ monitorSteps: stepsWith(0) });
291
+
292
+ expect(testButton()).not.toBeInTheDocument();
293
+ });
294
+
295
+ test("a monitor with nothing attached gets no button", () => {
296
+ /*
297
+ * The modal's "Select Probe" field is required and would have no options,
298
+ * so Run Test could never be submitted. The card already explains this
299
+ * case in its body.
300
+ */
301
+ renderSummary({ probes: [] });
302
+
303
+ expect(testButton()).not.toBeInTheDocument();
304
+ expect(probePicker()).not.toBeInTheDocument();
305
+ });
306
+
307
+ test("a read-only user gets no button", () => {
308
+ currentPermissions = [Permission.Viewer];
309
+
310
+ renderSummary();
311
+
312
+ expect(testButton()).not.toBeInTheDocument();
313
+ });
314
+
315
+ test("withholding the button leaves the rest of the card alone", () => {
316
+ renderSummary({ probes: [] });
317
+
318
+ expect(
319
+ screen.getByRole("heading", { name: "Monitor Summary" }),
320
+ ).toBeInTheDocument();
321
+ });
322
+
323
+ test("a manual monitor renders no card at all", () => {
324
+ renderSummary({ monitorType: MonitorType.Manual });
325
+
326
+ expect(screen.queryByTestId("card")).not.toBeInTheDocument();
327
+ expect(testButton()).not.toBeInTheDocument();
328
+ });
329
+ });
330
+
331
+ describe("what the card hands the test form", () => {
332
+ test("it still renders the button when the page has no monitor id", () => {
333
+ /*
334
+ * monitorId is optional on the card so that a caller which cannot supply
335
+ * one is not forced to; the overview page always does, which is what lets
336
+ * the server resolve this monitor's secrets for the run.
337
+ */
338
+ renderSummary({ withoutMonitorId: true });
339
+
340
+ expect(testButton()).toBeInTheDocument();
341
+ });
342
+ });