@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
@@ -45,7 +45,14 @@ interface AssetResponse {
45
45
 
46
46
  const INDEX_PAGE: string = "<html>index</html>";
47
47
 
48
- const REPOSITORY_ROOT: string = path.resolve(__dirname, "..", "..", "..", "..");
48
+ const REPOSITORY_ROOT: string = path.resolve(
49
+ __dirname,
50
+ "..",
51
+ "..",
52
+ "..",
53
+ "..",
54
+ "..",
55
+ );
49
56
 
50
57
  describe("vendored browser assets", () => {
51
58
  let server: Server;
@@ -167,7 +174,7 @@ describe("vendored browser assets", () => {
167
174
  .trim();
168
175
 
169
176
  expect(tracked.split("\n").filter(Boolean)).toEqual([
170
- "Common/Server/Static/Vendor/tailwind/tailwind-3.4.5.js",
177
+ "packages/Common/Server/Static/Vendor/tailwind/tailwind-3.4.5.js",
171
178
  ]);
172
179
  });
173
180
  });
@@ -201,7 +208,12 @@ describe("vendored browser assets", () => {
201
208
  test("writes it to the path each index.ejs asks for", () => {
202
209
  expect(esbuildConfig).toContain('"assets/js"');
203
210
 
204
- const appRoot: string = path.join(REPOSITORY_ROOT, "App", "FeatureSet");
211
+ const appRoot: string = path.join(
212
+ REPOSITORY_ROOT,
213
+ "packages",
214
+ "App",
215
+ "FeatureSet",
216
+ );
205
217
 
206
218
  for (const [service, routePrefix] of [
207
219
  ["Dashboard", "dashboard"],
@@ -372,6 +384,7 @@ describe("vendored browser assets", () => {
372
384
  const copies: Array<string> = [
373
385
  path.join(
374
386
  REPOSITORY_ROOT,
387
+ "packages",
375
388
  "Common",
376
389
  "UI",
377
390
  "Images",
@@ -381,6 +394,7 @@ describe("vendored browser assets", () => {
381
394
  ),
382
395
  path.join(
383
396
  REPOSITORY_ROOT,
397
+ "packages",
384
398
  "Home",
385
399
  "Static",
386
400
  "img",
@@ -0,0 +1,312 @@
1
+ import AIChatPageContextType, {
2
+ AIChatPageContext,
3
+ AIChatPageContextHelper,
4
+ } from "../../../Types/AI/AIChatPageContext";
5
+ import {
6
+ AIResourceSubresourceKind,
7
+ AIResourceType,
8
+ getAIResourceDefinition,
9
+ isAIResourceType,
10
+ } from "../../../Types/AI/AIResourceContext";
11
+ import { JSONObject } from "../../../Types/JSON";
12
+ import ServiceType from "../../../Types/Telemetry/ServiceType";
13
+ import { describe, expect, test } from "@jest/globals";
14
+
15
+ const RESOURCE_ID: string = "11111111-1111-4111-8111-111111111111";
16
+
17
+ function resource(overrides: JSONObject = {}): JSONObject {
18
+ return {
19
+ type: AIChatPageContextType.Resource,
20
+ resourceType: AIResourceType.KubernetesCluster,
21
+ entityId: RESOURCE_ID,
22
+ ...overrides,
23
+ };
24
+ }
25
+
26
+ describe("infrastructure resource context validation", () => {
27
+ test.each(Object.values(AIResourceType))(
28
+ "%s detail requires a parent UUID and strips arbitrary client data",
29
+ (resourceType: AIResourceType) => {
30
+ expect(
31
+ AIChatPageContextHelper.sanitize(
32
+ resource({
33
+ resourceType,
34
+ entityTitle: "Production\n cluster",
35
+ projectId: "another-project",
36
+ credentials: { password: "never-forward" },
37
+ filters: { arbitrary: "never-forward" },
38
+ }),
39
+ ),
40
+ ).toEqual({
41
+ type: AIChatPageContextType.Resource,
42
+ resourceType,
43
+ entityId: RESOURCE_ID,
44
+ entityTitle: "Production cluster",
45
+ });
46
+ expect(
47
+ AIChatPageContextHelper.sanitize(
48
+ resource({ resourceType, entityId: "settings" }),
49
+ ),
50
+ ).toBeUndefined();
51
+ },
52
+ );
53
+
54
+ test.each(Object.values(AIResourceType))(
55
+ "%s list retains its kind without carrying a selected entity",
56
+ (resourceType: AIResourceType) => {
57
+ expect(
58
+ AIChatPageContextHelper.sanitize({
59
+ type: AIChatPageContextType.ResourcesList,
60
+ resourceType,
61
+ entityId: RESOURCE_ID,
62
+ entityTitle: "ignored",
63
+ subresource: { kind: "Pod", key: "ignored" },
64
+ }),
65
+ ).toEqual({ type: AIChatPageContextType.ResourcesList, resourceType });
66
+ },
67
+ );
68
+
69
+ test.each([
70
+ undefined,
71
+ null,
72
+ "",
73
+ "kubernetes",
74
+ "Unknown",
75
+ "__proto__",
76
+ 123,
77
+ {},
78
+ ])("rejects missing or invalid resource kind %p", (resourceType: unknown) => {
79
+ expect(isAIResourceType(resourceType)).toBe(false);
80
+ expect(
81
+ AIChatPageContextHelper.sanitize(
82
+ resource({ resourceType } as JSONObject),
83
+ ),
84
+ ).toBeUndefined();
85
+ });
86
+
87
+ test("IoT fleet telemetry keeps its historical discriminator", () => {
88
+ expect(getAIResourceDefinition(AIResourceType.IoTFleet)).toEqual(
89
+ expect.objectContaining({
90
+ type: AIResourceType.IoTFleet,
91
+ serviceType: ServiceType.IoTDevice,
92
+ facetKey: "iotFleetId",
93
+ }),
94
+ );
95
+ });
96
+
97
+ test.each([
98
+ [AIResourceType.Host, AIResourceSubresourceKind.Process, "1234"],
99
+ [
100
+ AIResourceType.DockerHost,
101
+ AIResourceSubresourceKind.Container,
102
+ "checkout",
103
+ ],
104
+ [
105
+ AIResourceType.PodmanHost,
106
+ AIResourceSubresourceKind.Container,
107
+ "checkout",
108
+ ],
109
+ [
110
+ AIResourceType.KubernetesCluster,
111
+ AIResourceSubresourceKind.Pod,
112
+ "checkout-7c87",
113
+ ],
114
+ [
115
+ AIResourceType.DockerSwarmCluster,
116
+ AIResourceSubresourceKind.Task,
117
+ "task-a123",
118
+ ],
119
+ [
120
+ AIResourceType.ProxmoxCluster,
121
+ AIResourceSubresourceKind.Guest,
122
+ "qemu/100",
123
+ ],
124
+ [
125
+ AIResourceType.VMwareVCenter,
126
+ AIResourceSubresourceKind.VirtualMachine,
127
+ "vm-23",
128
+ ],
129
+ [AIResourceType.CephCluster, AIResourceSubresourceKind.Osd, "osd.3"],
130
+ [
131
+ AIResourceType.ServerlessFunction,
132
+ AIResourceSubresourceKind.Instance,
133
+ "instance-2",
134
+ ],
135
+ [
136
+ AIResourceType.CloudResource,
137
+ AIResourceSubresourceKind.Instance,
138
+ "i-0123",
139
+ ],
140
+ [AIResourceType.IoTFleet, AIResourceSubresourceKind.Device, "device/123"],
141
+ [AIResourceType.NetworkDevice, AIResourceSubresourceKind.Interface, "eth0"],
142
+ ] as Array<[AIResourceType, AIResourceSubresourceKind, string]>)(
143
+ "%s child %s preserves its external identity separately from the parent UUID",
144
+ (
145
+ resourceType: AIResourceType,
146
+ kind: AIResourceSubresourceKind,
147
+ key: string,
148
+ ) => {
149
+ expect(
150
+ AIChatPageContextHelper.sanitize(
151
+ resource({
152
+ resourceType,
153
+ subresource: { kind, key, secret: "ignored" },
154
+ }),
155
+ ),
156
+ ).toEqual({
157
+ type: AIChatPageContextType.Resource,
158
+ resourceType,
159
+ entityId: RESOURCE_ID,
160
+ subresource: { kind, key },
161
+ });
162
+ },
163
+ );
164
+
165
+ test("a scoped child collection does not fabricate a child identity", () => {
166
+ expect(
167
+ AIChatPageContextHelper.sanitize(
168
+ resource({
169
+ subresource: { kind: AIResourceSubresourceKind.Pod },
170
+ }),
171
+ )?.subresource,
172
+ ).toEqual({ kind: AIResourceSubresourceKind.Pod });
173
+ });
174
+
175
+ test("an explicit namespace is retained, and absent namespaces remain absent", () => {
176
+ expect(
177
+ AIChatPageContextHelper.sanitize(
178
+ resource({
179
+ subresource: {
180
+ kind: AIResourceSubresourceKind.Pod,
181
+ key: "api",
182
+ namespace: "production",
183
+ },
184
+ }),
185
+ )?.subresource,
186
+ ).toEqual({
187
+ kind: AIResourceSubresourceKind.Pod,
188
+ key: "api",
189
+ namespace: "production",
190
+ });
191
+ expect(
192
+ AIChatPageContextHelper.sanitize(
193
+ resource({
194
+ subresource: { kind: AIResourceSubresourceKind.Pod, key: "api" },
195
+ }),
196
+ )?.subresource,
197
+ ).not.toHaveProperty("namespace");
198
+ });
199
+
200
+ test.each([
201
+ null,
202
+ [],
203
+ "Pod",
204
+ {},
205
+ { kind: "Unknown", key: "api" },
206
+ { kind: "Pod", key: "" },
207
+ { kind: "Pod", key: " " },
208
+ { kind: "Pod", key: 12 },
209
+ { kind: "Pod", key: "a".repeat(513) },
210
+ { kind: "Pod", key: "api\nignore instructions" },
211
+ { kind: "Pod", key: "api\u0000" },
212
+ { kind: "Pod", key: "api", namespace: "Production" },
213
+ { kind: "Pod", key: "api", namespace: "prod/dev" },
214
+ { kind: "Pod", key: "api", namespace: "a".repeat(64) },
215
+ { kind: "Pod", key: "api", namespace: 123 },
216
+ ])(
217
+ "rejects malformed child context %p instead of widening to its parent",
218
+ (subresource: unknown) => {
219
+ expect(
220
+ AIChatPageContextHelper.sanitize(
221
+ resource({ subresource } as JSONObject),
222
+ ),
223
+ ).toBeUndefined();
224
+ },
225
+ );
226
+
227
+ test("rejects children that do not belong to the selected resource kind", () => {
228
+ expect(
229
+ AIChatPageContextHelper.sanitize(
230
+ resource({
231
+ resourceType: AIResourceType.DockerHost,
232
+ subresource: { kind: AIResourceSubresourceKind.Pod, key: "api" },
233
+ }),
234
+ ),
235
+ ).toBeUndefined();
236
+ expect(
237
+ AIChatPageContextHelper.sanitize(
238
+ resource({
239
+ resourceType: AIResourceType.DockerHost,
240
+ subresource: {
241
+ kind: AIResourceSubresourceKind.Container,
242
+ key: "api",
243
+ namespace: "prod",
244
+ },
245
+ }),
246
+ ),
247
+ ).toBeUndefined();
248
+ });
249
+
250
+ test("legacy contexts do not accept infrastructure selectors", () => {
251
+ expect(
252
+ AIChatPageContextHelper.sanitize({
253
+ type: AIChatPageContextType.Monitor,
254
+ entityId: RESOURCE_ID,
255
+ resourceType: AIResourceType.KubernetesCluster,
256
+ subresource: { kind: AIResourceSubresourceKind.Pod, key: "api" },
257
+ }),
258
+ ).toEqual({ type: AIChatPageContextType.Monitor, entityId: RESOURCE_ID });
259
+ });
260
+ });
261
+
262
+ describe("conversation subject identity", () => {
263
+ const parent: AIChatPageContext = {
264
+ type: AIChatPageContextType.Resource,
265
+ resourceType: AIResourceType.KubernetesCluster,
266
+ entityId: RESOURCE_ID,
267
+ entityTitle: "Production",
268
+ };
269
+
270
+ test("renaming the presentation title does not change the subject", () => {
271
+ expect(AIChatPageContextHelper.getIdentity(parent)).toBe(
272
+ AIChatPageContextHelper.getIdentity({
273
+ ...parent,
274
+ entityTitle: "Renamed",
275
+ }),
276
+ );
277
+ });
278
+
279
+ test("switching resource kind with the same UUID changes the subject", () => {
280
+ expect(AIChatPageContextHelper.getIdentity(parent)).not.toBe(
281
+ AIChatPageContextHelper.getIdentity({
282
+ ...parent,
283
+ resourceType: AIResourceType.DockerHost,
284
+ }),
285
+ );
286
+ });
287
+
288
+ test("child and namespace changes cannot reuse the previous subject", () => {
289
+ const pod: AIChatPageContext = {
290
+ ...parent,
291
+ subresource: {
292
+ kind: AIResourceSubresourceKind.Pod,
293
+ key: "api",
294
+ namespace: "prod",
295
+ },
296
+ };
297
+ for (const child of [
298
+ undefined,
299
+ { kind: AIResourceSubresourceKind.Pod, key: "worker", namespace: "prod" },
300
+ { kind: AIResourceSubresourceKind.Pod, key: "api", namespace: "dev" },
301
+ {
302
+ kind: AIResourceSubresourceKind.Deployment,
303
+ key: "api",
304
+ namespace: "prod",
305
+ },
306
+ ]) {
307
+ expect(AIChatPageContextHelper.getIdentity(pod)).not.toBe(
308
+ AIChatPageContextHelper.getIdentity({ ...parent, subresource: child }),
309
+ );
310
+ }
311
+ });
312
+ });
@@ -0,0 +1,100 @@
1
+ import BaseModel from "../../../Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel";
2
+ import UniqueColumnsTogether, {
3
+ UniqueColumnsTogetherMetadata,
4
+ } from "../../../Types/Database/UniqueColumnsTogether";
5
+ import { describe, expect, test } from "@jest/globals";
6
+
7
+ /*
8
+ * @UniqueColumnsTogether is read off the model PROTOTYPE by
9
+ * DatabaseService.create (see issue #3394), so the ways a prototype value can
10
+ * go wrong are the ways this can: a second decorator overwriting the first, a
11
+ * subclass writing into its parent's list, or a caller's array being mutated
12
+ * after the fact.
13
+ */
14
+
15
+ describe("UniqueColumnsTogether", () => {
16
+ test("a model without it declares no constraint", () => {
17
+ class Plain extends BaseModel {}
18
+
19
+ expect(new Plain().getUniqueColumnsTogether()).toEqual([]);
20
+ });
21
+
22
+ test("records the columns and the message", () => {
23
+ @UniqueColumnsTogether(
24
+ ["incidentId", "teamId", "projectId"],
25
+ "This team is already an owner of this incident.",
26
+ )
27
+ class Owner extends BaseModel {}
28
+
29
+ expect(new Owner().getUniqueColumnsTogether()).toEqual([
30
+ {
31
+ columnNames: ["incidentId", "teamId", "projectId"],
32
+ errorMessage: "This team is already an owner of this incident.",
33
+ },
34
+ ]);
35
+ });
36
+
37
+ test("is stackable - a second declaration does not replace the first", () => {
38
+ @UniqueColumnsTogether(["projectId", "name"], "Name is taken.")
39
+ @UniqueColumnsTogether(["projectId", "slug"], "Slug is taken.")
40
+ class Twice extends BaseModel {}
41
+
42
+ const constraints: Array<UniqueColumnsTogetherMetadata> =
43
+ new Twice().getUniqueColumnsTogether();
44
+
45
+ expect(constraints).toHaveLength(2);
46
+ expect(
47
+ constraints.map((c: UniqueColumnsTogetherMetadata) => {
48
+ return c.errorMessage;
49
+ }),
50
+ ).toEqual(expect.arrayContaining(["Name is taken.", "Slug is taken."]));
51
+ });
52
+
53
+ test("a subclass adds to its own list and leaves the parent's alone", () => {
54
+ @UniqueColumnsTogether(["projectId", "name"], "Name is taken.")
55
+ class Parent extends BaseModel {}
56
+
57
+ @UniqueColumnsTogether(["projectId", "slug"], "Slug is taken.")
58
+ class Child extends Parent {}
59
+
60
+ expect(new Parent().getUniqueColumnsTogether()).toEqual([
61
+ { columnNames: ["projectId", "name"], errorMessage: "Name is taken." },
62
+ ]);
63
+ expect(new Child().getUniqueColumnsTogether()).toEqual([
64
+ { columnNames: ["projectId", "slug"], errorMessage: "Slug is taken." },
65
+ ]);
66
+ });
67
+
68
+ test("an undecorated subclass inherits its parent's constraint", () => {
69
+ @UniqueColumnsTogether(["projectId", "name"], "Name is taken.")
70
+ class Parent extends BaseModel {}
71
+
72
+ class Child extends Parent {}
73
+
74
+ expect(new Child().getUniqueColumnsTogether()).toHaveLength(1);
75
+ });
76
+
77
+ test("keeps its own copy of the column list", () => {
78
+ const columns: Array<string> = ["projectId", "name"];
79
+
80
+ @UniqueColumnsTogether(columns, "Name is taken.")
81
+ class Owner extends BaseModel {}
82
+
83
+ columns.push("somethingElse");
84
+
85
+ expect(new Owner().getUniqueColumnsTogether()[0]!.columnNames).toEqual([
86
+ "projectId",
87
+ "name",
88
+ ]);
89
+ });
90
+
91
+ test("is not an own property, so it never ends up in a serialized row", () => {
92
+ @UniqueColumnsTogether(["projectId", "name"], "Name is taken.")
93
+ class Owner extends BaseModel {}
94
+
95
+ const model: Owner = new Owner();
96
+
97
+ expect(Object.keys(model)).not.toContain("uniqueColumnsTogether");
98
+ expect(JSON.stringify(model)).not.toContain("Name is taken.");
99
+ });
100
+ });
@@ -651,7 +651,7 @@ describe("Default criteria for metric-backed and profile monitors", () => {
651
651
  });
652
652
 
653
653
  expect(result).toBeTruthy();
654
- expect(result).toContain("greater than");
654
+ expect(result).toContain("above the 0 threshold");
655
655
  },
656
656
  );
657
657
 
@@ -676,7 +676,7 @@ describe("Default criteria for metric-backed and profile monitors", () => {
676
676
  });
677
677
 
678
678
  expect(result).toBeTruthy();
679
- expect(result).toContain("equal to 0");
679
+ expect(result).toContain("equal to the 0 threshold");
680
680
  },
681
681
  );
682
682
 
@@ -744,7 +744,7 @@ describe("Default criteria for metric-backed and profile monitors", () => {
744
744
 
745
745
  expect(result).toBeTruthy();
746
746
  expect(result).toContain("Profile Count");
747
- expect(result).toContain("greater than");
747
+ expect(result).toContain("above the 0 threshold");
748
748
  });
749
749
 
750
750
  test("Profiles online criteria does not match when none arrived", async () => {
@@ -764,7 +764,7 @@ describe("Default criteria for metric-backed and profile monitors", () => {
764
764
 
765
765
  expect(result).toBeTruthy();
766
766
  expect(result).toContain("Profile Count");
767
- expect(result).toContain("equal to 0");
767
+ expect(result).toContain("equal to the 0 threshold");
768
768
  });
769
769
 
770
770
  test("Profiles offline criteria does not match when profiles arrived", async () => {
@@ -0,0 +1,125 @@
1
+ import HTTPMethod from "../../../Types/API/HTTPMethod";
2
+ import { JSONArray, JSONObject, ObjectType } from "../../../Types/JSON";
3
+ import JSONFunctions from "../../../Types/JSONFunctions";
4
+ import MonitorCriteria from "../../../Types/Monitor/MonitorCriteria";
5
+ import MonitorStep from "../../../Types/Monitor/MonitorStep";
6
+ import MonitorSteps from "../../../Types/Monitor/MonitorSteps";
7
+
8
+ function apiPayload(retryCounts: Array<number | null | undefined>): JSONObject {
9
+ return {
10
+ _type: ObjectType.MonitorSteps,
11
+ value: {
12
+ defaultMonitorStatusId: "11111111-1111-4111-8111-111111111111",
13
+ monitorStepsInstanceArray: retryCounts.map(
14
+ (retryCount: number | null | undefined): JSONObject => {
15
+ return {
16
+ _type: ObjectType.MonitorStep,
17
+ value: {
18
+ id: "22222222-2222-4222-8222-222222222222",
19
+ monitorDestination: {
20
+ _type: ObjectType.URL,
21
+ value: "https://example.com/health",
22
+ },
23
+ monitorCriteria: new MonitorCriteria().toJSON(),
24
+ requestType: HTTPMethod.GET,
25
+ allowSelfSignedCertificates: true,
26
+ ...(retryCount === undefined ? {} : { retryCount }),
27
+ },
28
+ };
29
+ },
30
+ ),
31
+ },
32
+ };
33
+ }
34
+
35
+ function stepValues(payload: JSONObject): Array<JSONObject> {
36
+ return (
37
+ (payload["value"] as JSONObject)["monitorStepsInstanceArray"] as JSONArray
38
+ ).map((step: JSONObject): JSONObject => {
39
+ return step["value"] as JSONObject;
40
+ });
41
+ }
42
+
43
+ function databaseRoundTrip(steps: MonitorSteps): MonitorSteps {
44
+ // Exercise the same transformer used for the Monitor's JSON database column.
45
+ const persisted: JSONObject = MonitorSteps.getDatabaseTransformer().to(steps);
46
+ return MonitorSteps.getDatabaseTransformer().from(
47
+ JSON.parse(JSON.stringify(persisted)),
48
+ ) as MonitorSteps;
49
+ }
50
+
51
+ describe("API monitor retry settings across persistence", () => {
52
+ test.each([undefined, null, 0, 1, 2, 3])(
53
+ "preserves retryCount %s through API decoding, database storage, and GET serialization",
54
+ (retryCount: number | null | undefined): void => {
55
+ const payload: JSONObject = apiPayload([retryCount]);
56
+ const originalPayload: string = JSON.stringify(payload);
57
+ const expected: number | undefined = retryCount ?? undefined;
58
+ const decoded: MonitorSteps = JSONFunctions.deserialize({
59
+ monitorSteps: payload,
60
+ })["monitorSteps"] as MonitorSteps;
61
+
62
+ expect(decoded).toBeInstanceOf(MonitorSteps);
63
+ expect(decoded.data!.monitorStepsInstanceArray[0]!.data!.retryCount).toBe(
64
+ expected,
65
+ );
66
+
67
+ const stored: MonitorSteps = databaseRoundTrip(decoded);
68
+ const cloned: MonitorSteps = MonitorSteps.clone(stored);
69
+ const response: JSONObject = JSON.parse(JSON.stringify(cloned.toJSON()));
70
+ const value: JSONObject = stepValues(response)[0]!;
71
+
72
+ expect(value["retryCount"]).toBe(expected);
73
+ if (expected === undefined) {
74
+ // Missing is inherited from the probe, not an explicit choice of 3.
75
+ expect(value).not.toHaveProperty("retryCount");
76
+ } else {
77
+ expect(value).toHaveProperty("retryCount", expected);
78
+ }
79
+ expect(value["requestType"]).toBe(HTTPMethod.GET);
80
+ expect(value["allowSelfSignedCertificates"]).toBe(true);
81
+ expect(JSON.stringify(payload)).toBe(originalPayload);
82
+ },
83
+ );
84
+
85
+ test("an unrelated criteria edit does not turn an inherited retry count into an override", (): void => {
86
+ const steps: MonitorSteps = MonitorSteps.fromJSON(apiPayload([undefined]));
87
+ const edited: MonitorSteps = MonitorSteps.clone(databaseRoundTrip(steps));
88
+ edited.data!.monitorStepsInstanceArray[0]!.setRequestType(HTTPMethod.POST);
89
+
90
+ const saved: MonitorSteps = databaseRoundTrip(edited);
91
+ expect(stepValues(saved.toJSON())[0]).not.toHaveProperty("retryCount");
92
+ expect(saved.data!.monitorStepsInstanceArray[0]!.data!.requestType).toBe(
93
+ HTTPMethod.POST,
94
+ );
95
+ });
96
+
97
+ test.each([0, 1, 2, 3])(
98
+ "an explicit edit to %s is stored and clearing it restores inheritance",
99
+ (retryCount: number): void => {
100
+ const steps: MonitorSteps = MonitorSteps.fromJSON(
101
+ apiPayload([undefined]),
102
+ );
103
+ steps.data!.monitorStepsInstanceArray[0]!.setRetryCount(retryCount);
104
+ const saved: MonitorSteps = databaseRoundTrip(steps);
105
+ expect(stepValues(saved.toJSON())[0]!["retryCount"]).toBe(retryCount);
106
+
107
+ saved.data!.monitorStepsInstanceArray[0]!.setRetryCount(undefined);
108
+ const cleared: MonitorSteps = databaseRoundTrip(saved);
109
+ expect(stepValues(cleared.toJSON())[0]).not.toHaveProperty("retryCount");
110
+ },
111
+ );
112
+
113
+ test("multiple steps keep their independent inherited and explicit retry settings", (): void => {
114
+ const steps: MonitorSteps = databaseRoundTrip(
115
+ MonitorSteps.fromJSON(apiPayload([undefined, 0, 2, null, 3])),
116
+ );
117
+ expect(
118
+ steps.data!.monitorStepsInstanceArray.map(
119
+ (step: MonitorStep): number | undefined => {
120
+ return step.data!.retryCount;
121
+ },
122
+ ),
123
+ ).toEqual([undefined, 0, 2, undefined, 3]);
124
+ });
125
+ });
@@ -272,6 +272,50 @@ describe("WebsiteRequest.fetch", () => {
272
272
  expect(budget.remainingBytes).toBe(100 - Buffer.byteLength(bodyText));
273
273
  });
274
274
 
275
+ test.each([200, 400, 503])(
276
+ "should cancel a stalled status %s body even after Axios has settled",
277
+ async (status: number) => {
278
+ const controller: AbortController = new AbortController();
279
+ let resolveReading: () => void = (): void => {};
280
+ const reading: Promise<void> = new Promise((resolve: () => void) => {
281
+ resolveReading = resolve;
282
+ });
283
+ const body: Readable = new Readable({
284
+ read: (): void => {
285
+ resolveReading();
286
+ },
287
+ });
288
+ const response: {
289
+ status: number;
290
+ data: Readable;
291
+ headers: Record<string, string>;
292
+ } = { status: status, data: body, headers: {} };
293
+ if (status >= 400) {
294
+ axiosMock.mockRejectedValueOnce({
295
+ isAxiosError: true,
296
+ response: response,
297
+ });
298
+ } else {
299
+ axiosMock.mockResolvedValueOnce(response);
300
+ }
301
+
302
+ const pending: Promise<WebsiteResponse> = WebsiteRequest.fetch(url, {
303
+ signal: controller.signal,
304
+ responseBodyBudget: new HTTPResponseBodyBudget(100),
305
+ });
306
+ const rejected: Promise<void> = expect(pending).rejects.toMatchObject({
307
+ name: "AbortError",
308
+ });
309
+
310
+ await reading;
311
+ controller.abort();
312
+ await rejected;
313
+
314
+ expect(body.destroyed).toBe(true);
315
+ expect(axiosMock).toHaveBeenCalledTimes(1);
316
+ },
317
+ );
318
+
275
319
  test("should strip a leading UTF-8 BOM from a budgeted HTML stream", async () => {
276
320
  const html: string = "<html><body>bounded</body></html>";
277
321
  const bodyText: string = `\uFEFF${html}`;