@oneuptime/common 12.0.32 → 12.0.33

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 (597) hide show
  1. package/Models/AnalyticsModels/Span.ts +14 -0
  2. package/Models/DatabaseModels/EnterpriseLicense.ts +56 -0
  3. package/Models/DatabaseModels/Index.ts +10 -0
  4. package/Models/DatabaseModels/Monitor.ts +76 -0
  5. package/Models/DatabaseModels/NetworkAlertPolicy.ts +690 -0
  6. package/Models/DatabaseModels/NetworkDevice.ts +176 -1
  7. package/Models/DatabaseModels/NetworkSite.ts +201 -2
  8. package/Models/DatabaseModels/NetworkSiteType.ts +102 -3
  9. package/Models/DatabaseModels/NetworkSnmpCredentialProfile.ts +841 -0
  10. package/Models/DatabaseModels/TelemetryException.ts +119 -0
  11. package/Models/DatabaseModels/UserNotificationEmailRollupBatch.ts +334 -0
  12. package/Models/DatabaseModels/UserNotificationEmailRollupItem.ts +370 -0
  13. package/Models/DatabaseModels/UserNotificationEmailRollupSetting.ts +282 -0
  14. package/Server/API/EnterpriseLicenseAPI.ts +391 -64
  15. package/Server/API/LlmProviderAPI.ts +137 -22
  16. package/Server/EnvironmentConfig.ts +14 -0
  17. package/Server/Infrastructure/Postgres/SchemaMigrations/1790700000000-AddNetworkSiteTypeParentHierarchy.ts +55 -0
  18. package/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddEnterpriseLicenseUsageProvenance.ts +31 -0
  19. package/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddTelemetryExceptionErrorClass.ts +124 -0
  20. package/Server/Infrastructure/Postgres/SchemaMigrations/1791000000000-AddUserNotificationEmailRollup.ts +132 -0
  21. package/Server/Infrastructure/Postgres/SchemaMigrations/1791100000000-AddUserNotificationEmailRollupSetting.ts +79 -0
  22. package/Server/Infrastructure/Postgres/SchemaMigrations/1791200000000-AddNetworkSnmpCredentialProfilesAndAlertPolicies.ts +191 -0
  23. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +12 -0
  24. package/Server/Infrastructure/QueueWorker.ts +38 -8
  25. package/Server/Middleware/BearerTokenAuthorization.ts +12 -0
  26. package/Server/Middleware/ProjectAuthorization.ts +11 -0
  27. package/Server/Middleware/SCIMAuthorization.ts +12 -0
  28. package/Server/Middleware/TelemetryIngest.ts +11 -0
  29. package/Server/Services/AIBillingService.ts +101 -27
  30. package/Server/Services/EnterpriseLicenseInstanceService.ts +197 -0
  31. package/Server/Services/EnterpriseLicenseService.ts +55 -0
  32. package/Server/Services/Index.ts +10 -0
  33. package/Server/Services/MonitorService.ts +143 -21
  34. package/Server/Services/MonitorStatusTimelineService.ts +150 -8
  35. package/Server/Services/MonitorTemplateService.ts +217 -1
  36. package/Server/Services/NetworkAlertPolicyEngineService.ts +2159 -0
  37. package/Server/Services/NetworkAlertPolicyService.ts +944 -0
  38. package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +9 -10
  39. package/Server/Services/NetworkDeviceAutoImportRuleService.ts +60 -15
  40. package/Server/Services/NetworkDeviceService.ts +1032 -73
  41. package/Server/Services/NetworkSiteService.ts +1502 -129
  42. package/Server/Services/NetworkSiteTypeService.ts +1216 -0
  43. package/Server/Services/NetworkSnmpCredentialProfileService.ts +238 -0
  44. package/Server/Services/NotificationService.ts +118 -28
  45. package/Server/Services/ProjectService.ts +105 -48
  46. package/Server/Services/StatusPagePrivateUserService.ts +103 -3
  47. package/Server/Services/UserNotificationEmailRollupBatchService.ts +78 -0
  48. package/Server/Services/UserNotificationEmailRollupItemService.ts +79 -0
  49. package/Server/Services/UserNotificationEmailRollupSettingService.ts +113 -0
  50. package/Server/Services/UserNotificationSettingService.ts +62 -25
  51. package/Server/Services/UserService.ts +95 -0
  52. package/Server/Types/Database/QueryHelper.ts +2 -2
  53. package/Server/Utils/AI/Chat/ObservabilityChatPrompt.ts +14 -3
  54. package/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.ts +10 -0
  55. package/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.ts +10 -0
  56. package/Server/Utils/AI/SRE/Insights/InsightTriageRunner.ts +62 -1
  57. package/Server/Utils/AI/Toolbox/AlertTools.ts +15 -1
  58. package/Server/Utils/Billing/BillingFailureNoticeThrottle.ts +80 -0
  59. package/Server/Utils/DataSource/HttpFetch.ts +9 -2
  60. package/Server/Utils/EmailRollup/EmailRollupConstants.ts +98 -0
  61. package/Server/Utils/EmailRollup/EmailRollupFlushRunner.ts +872 -0
  62. package/Server/Utils/EmailRollup/EmailRollupRenderer.ts +781 -0
  63. package/Server/Utils/EmailRollup/EmailRollupWriter.ts +368 -0
  64. package/Server/Utils/LLM/LLMService.ts +78 -0
  65. package/Server/Utils/LogRedaction.ts +8 -0
  66. package/Server/Utils/Logger.ts +79 -1
  67. package/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.ts +190 -0
  68. package/Server/Utils/Monitor/Criteria/EvaluateOverTime.ts +9 -2
  69. package/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.ts +61 -1
  70. package/Server/Utils/Monitor/MonitorCriteriaDataExtractor.ts +14 -0
  71. package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +49 -0
  72. package/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.ts +255 -4
  73. package/Server/Utils/Monitor/MonitorMetricUtil.ts +41 -0
  74. package/Server/Utils/Monitor/MonitorTemplateUtil.ts +43 -0
  75. package/Server/Utils/Monitor/NetworkDeviceHydrationUtil.ts +499 -19
  76. package/Server/Utils/Monitor/NetworkDeviceMetricUtil.ts +66 -10
  77. package/Server/Utils/Monitor/NetworkDeviceWalkUtil.ts +238 -44
  78. package/Server/Utils/Monitor/NetworkInventoryUtil.ts +146 -39
  79. package/Server/Utils/NetworkDevice/DeviceHealthAggregation.ts +31 -18
  80. package/Server/Utils/NetworkSite/NetworkSiteHierarchyLock.ts +213 -0
  81. package/Server/Utils/OutboundUserAgent.ts +152 -0
  82. package/Server/Utils/StartServer.ts +51 -19
  83. package/Server/Utils/Telemetry/CaptureSpan.ts +32 -8
  84. package/Server/Utils/Telemetry/ErrorClassResolver.ts +120 -0
  85. package/Server/Utils/Telemetry/SpanUtil.ts +33 -0
  86. package/Server/Utils/Telemetry.ts +198 -51
  87. package/Server/Views/Partials/SensitiveUrlToken.ejs +140 -0
  88. package/Tests/App/Dashboard/AddNeighborToMonitoringModal.test.tsx +134 -33
  89. package/Tests/App/Dashboard/AskAiSuggestedPrompts.test.ts +279 -0
  90. package/Tests/App/Dashboard/DashboardEditPermissions.test.tsx +517 -0
  91. package/Tests/App/Dashboard/DashboardVariablesDiscard.test.tsx +26 -0
  92. package/Tests/App/Dashboard/DeviceStatusHero.test.tsx +588 -0
  93. package/Tests/App/Dashboard/DiscoveryScanWizardValidation.test.tsx +18 -9
  94. package/Tests/App/Dashboard/MonitorCreateFromMonitorBackedDevice.test.tsx +632 -0
  95. package/Tests/App/Dashboard/MonitorRecommendationCreateProgress.test.tsx +682 -0
  96. package/Tests/App/Dashboard/MonitorTypePicker.test.tsx +4 -2
  97. package/Tests/App/Dashboard/NetworkDeviceCreateFormMonitorBinding.test.tsx +676 -0
  98. package/Tests/App/Dashboard/NetworkDeviceCreateFormPingMonitor.test.tsx +791 -0
  99. package/Tests/App/Dashboard/NetworkDeviceCreateFormProbeAndSnmp.test.tsx +833 -0
  100. package/Tests/App/Dashboard/NetworkDeviceCriteriaFilter.test.ts +161 -0
  101. package/Tests/App/Dashboard/NetworkDeviceSettingsMonitoringSection.test.tsx +458 -0
  102. package/Tests/App/Dashboard/NetworkSideMenu.test.tsx +41 -5
  103. package/Tests/App/Dashboard/PingMonitorProvisioning.test.ts +368 -0
  104. package/Tests/App/Dashboard/RecommendationCard.test.tsx +796 -0
  105. package/Tests/App/Dashboard/RecommendationToolbar.test.tsx +519 -0
  106. package/Tests/App/Dashboard/RecommendationsList.test.tsx +661 -0
  107. package/Tests/App/Dashboard/UseBulkCreatePingMonitors.test.tsx +899 -0
  108. package/Tests/App/Dashboard/UseBulkSnmpCredentialProfileActions.test.tsx +732 -0
  109. package/Tests/App/SensitiveUrlTokenBootstrap.test.ts +256 -0
  110. package/Tests/App/StatusPage/StatusPageIndexPageRobotsMeta.test.ts +11 -1
  111. package/Tests/App/StatusPage/StatusPageLoginCodeBootstrap.test.ts +9 -4
  112. package/Tests/Models/NetworkSiteHierarchy.test.ts +41 -4
  113. package/Tests/Server/API/EnterpriseLicenseReportUserCount.test.ts +951 -7
  114. package/Tests/Server/API/LlmProviderConnectionTest.test.ts +522 -0
  115. package/Tests/Server/Infrastructure/Postgres/NetworkSnmpCredentialProfilesAndAlertPoliciesMigration.test.ts +854 -0
  116. package/Tests/Server/Infrastructure/Postgres/SchemaMigrationsOrdering.test.ts +18 -0
  117. package/Tests/Server/Infrastructure/Postgres/UserNotificationEmailRollupTableMigration.test.ts +535 -0
  118. package/Tests/Server/Services/AIChatPrivacyPin.test.ts +560 -0
  119. package/Tests/Server/Services/BillingRechargeOwnerEmailGuards.test.ts +783 -0
  120. package/Tests/Server/Services/EnterpriseLicenseInstanceServiceDeletionUsage.test.ts +707 -0
  121. package/Tests/Server/Services/EnterpriseLicenseServiceUsageAggregationLock.test.ts +329 -0
  122. package/Tests/Server/Services/MonitorServiceDeleteNetworkDeviceCleanup.test.ts +294 -0
  123. package/Tests/Server/Services/MonitorStatusBridgeProbePath.test.ts +802 -0
  124. package/Tests/Server/Services/MonitorStatusTimelineService.test.ts +72 -2
  125. package/Tests/Server/Services/NetworkAlertPolicyEngineHooks.test.ts +752 -0
  126. package/Tests/Server/Services/NetworkAlertPolicyEngineService.test.ts +1849 -0
  127. package/Tests/Server/Services/NetworkAlertPolicyModel.test.ts +1793 -0
  128. package/Tests/Server/Services/NetworkDeviceAutoImportRuleEngineService.test.ts +47 -4
  129. package/Tests/Server/Services/NetworkDeviceAutoImportRuleService.test.ts +97 -12
  130. package/Tests/Server/Services/NetworkDeviceAutoMonitorLifecycle.test.ts +148 -3
  131. package/Tests/Server/Services/NetworkDeviceMonitorBindingUpdateGuard.test.ts +514 -0
  132. package/Tests/Server/Services/NetworkDeviceMonitorStatusStamp.test.ts +447 -58
  133. package/Tests/Server/Services/NetworkDeviceMonitoringMethodTransition.test.ts +739 -0
  134. package/Tests/Server/Services/NetworkDevicePollingTenancy.test.ts +501 -0
  135. package/Tests/Server/Services/NetworkDeviceSiteDefaultProbe.test.ts +432 -0
  136. package/Tests/Server/Services/NetworkSiteMonitoringDefaults.test.ts +498 -0
  137. package/Tests/Server/Services/NetworkSiteRollupPolicyAndMaintenance.test.ts +337 -55
  138. package/Tests/Server/Services/NetworkSiteService.test.ts +1868 -131
  139. package/Tests/Server/Services/NetworkSiteTypeService.test.ts +1109 -0
  140. package/Tests/Server/Services/NetworkSnmpCredentialProfileModel.test.ts +926 -0
  141. package/Tests/Server/Services/NetworkSnmpCredentialProfileService.test.ts +796 -0
  142. package/Tests/Server/Services/ProjectServiceNetworkSiteTypeDefaults.test.ts +214 -0
  143. package/Tests/Server/Services/StatusPagePrivateUserEmailChangePasswordResetExpiry.test.ts +269 -0
  144. package/Tests/Server/Services/UserEmailChangePasswordResetExpiry.test.ts +472 -0
  145. package/Tests/Server/Services/UserNotificationEmailRollupModels.test.ts +569 -0
  146. package/Tests/Server/Services/UserNotificationEmailRollupSettingModel.test.ts +314 -0
  147. package/Tests/Server/Services/UserNotificationEmailRollupSettingService.test.ts +409 -0
  148. package/Tests/Server/Services/UserNotificationSettingRollupRouting.test.ts +856 -0
  149. package/Tests/Server/Services/UserNotificationSettingWorkspaceChannels.test.ts +102 -1
  150. package/Tests/Server/Types/Database/Permissions/DashboardAccessPermission.test.ts +321 -0
  151. package/Tests/Server/Types/Database/QueryHelperOperators.test.ts +17 -0
  152. package/Tests/Server/Utils/AI/AlertMonitorFilters.test.ts +124 -0
  153. package/Tests/Server/Utils/AI/Insights/InsightTriageRunner.test.ts +208 -0
  154. package/Tests/Server/Utils/AI/LLMServiceToolCalling.test.ts +235 -0
  155. package/Tests/Server/Utils/AI/ObservabilityChatPrompt.test.ts +253 -0
  156. package/Tests/Server/Utils/Captcha.test.ts +422 -0
  157. package/Tests/Server/Utils/DataSource/HttpFetch.test.ts +96 -2
  158. package/Tests/Server/Utils/Database/MigrationFailureLog.test.ts +466 -0
  159. package/Tests/Server/Utils/EmailRollup/EmailRollupFlushRunnerBehaviour.test.ts +1096 -0
  160. package/Tests/Server/Utils/EmailRollup/EmailRollupFlushRunnerClaim.test.ts +466 -0
  161. package/Tests/Server/Utils/EmailRollup/EmailRollupRenderer.test.ts +1428 -0
  162. package/Tests/Server/Utils/EmailRollup/EmailRollupTestHarness.ts +752 -0
  163. package/Tests/Server/Utils/EmailRollup/EmailRollupWriter.test.ts +864 -0
  164. package/Tests/Server/Utils/LoggerFaultDemotion.test.ts +346 -0
  165. package/Tests/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.test.ts +633 -0
  166. package/Tests/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.test.ts +196 -0
  167. package/Tests/Server/Utils/Monitor/DatabaseMetricWrite.test.ts +367 -0
  168. package/Tests/Server/Utils/Monitor/MonitorCriteriaObservationBuilderUnits.test.ts +100 -0
  169. package/Tests/Server/Utils/Monitor/MonitorStepResourceIdentity.test.ts +5 -0
  170. package/Tests/Server/Utils/Monitor/NetworkDeviceHydrationUtil.test.ts +512 -31
  171. package/Tests/Server/Utils/Monitor/NetworkDeviceMetricUtil.test.ts +252 -0
  172. package/Tests/Server/Utils/Monitor/NetworkDeviceWalkUtil.test.ts +479 -42
  173. package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +351 -5
  174. package/Tests/Server/Utils/NetworkDevice/DeviceHealthAggregation.test.ts +136 -12
  175. package/Tests/Server/Utils/NetworkSite/NetworkSiteHierarchyLock.test.ts +306 -0
  176. package/Tests/Server/Utils/OutboundUserAgent.test.ts +266 -0
  177. package/Tests/Server/Utils/SecurityEvent/ThreatIntel/TaxiiClientUserAgent.test.ts +141 -0
  178. package/Tests/Server/Utils/Telemetry/ErrorClassResolver.test.ts +298 -0
  179. package/Tests/Server/Utils/Telemetry.test.ts +456 -66
  180. package/Tests/Types/Monitor/DatabaseMetricCatalog.test.ts +388 -0
  181. package/Tests/Types/Monitor/MonitorStepDatabaseMonitor.test.ts +243 -0
  182. package/Tests/Types/Monitor/MonitorStepDefaultTelemetryConfig.test.ts +1 -0
  183. package/Tests/Types/Monitor/MonitorType.test.ts +1 -0
  184. package/Tests/Types/Monitor/MonitorTypeKeywords.test.ts +16 -7
  185. package/Tests/Types/Monitor/NetworkDeviceAlertPack.test.ts +60 -0
  186. package/Tests/Types/NetworkDevice/NetworkAlertPolicyScope.test.ts +655 -0
  187. package/Tests/Types/NetworkDevice/NetworkDeviceMonitoringMethod.test.ts +115 -26
  188. package/Tests/Types/NetworkSite/DefaultNetworkSiteType.test.ts +39 -0
  189. package/Tests/Types/NotificationSetting/NotificationEmailRollupPolicy.test.ts +299 -0
  190. package/Tests/Types/Telemetry/ErrorClass.test.ts +483 -0
  191. package/Tests/UI/Components/BasicRadioButtons.test.tsx +336 -0
  192. package/Tests/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.test.ts +15 -0
  193. package/Tests/UI/Components/ProgressBar.test.tsx +38 -2
  194. package/Tests/UI/Components/SideMenuItem.test.tsx +226 -4
  195. package/Tests/UI/Components/SideMenuSection.test.tsx +310 -0
  196. package/Tests/UI/Components/SideOverSubmitState.test.tsx +335 -0
  197. package/Tests/UI/Utils/PageScrollLock.test.tsx +377 -0
  198. package/Tests/UI/Utils/PermissionGate.test.ts +78 -0
  199. package/Tests/UI/Utils/SensitiveUrlToken.test.ts +140 -0
  200. package/Tests/Utils/EnterpriseLicenseSeats.test.ts +69 -0
  201. package/Tests/Utils/EnterpriseLicenseSync.test.ts +7 -1
  202. package/Tests/Utils/EnterpriseLicenseUsage.test.ts +433 -2
  203. package/Tests/Utils/Monitor/MonitorMetricType.test.ts +280 -1
  204. package/Tests/Utils/Monitor/MonitorSummarySnapshotUtil.test.ts +1 -0
  205. package/Tests/Utils/Monitor/NetworkTopologyUtil.test.ts +38 -0
  206. package/Tests/Utils/NetworkDevice/DeviceHealthStateUtil.test.ts +284 -23
  207. package/Tests/Utils/NetworkDevice/DeviceReachabilityUtil.test.ts +177 -0
  208. package/Tests/Utils/NetworkDevice/MonitoringMethodThreadedClassifiers.test.ts +992 -0
  209. package/Tests/Utils/NetworkDevice/NetworkAlertPolicyBootstrapUtil.test.ts +427 -0
  210. package/Tests/Utils/NetworkDevice/ReachabilityStampConsistency.test.ts +185 -0
  211. package/Tests/Utils/NetworkDevice/SnmpCredentialUtil.test.ts +268 -0
  212. package/Tests/Utils/NetworkDiscovery/AutoImportRuleMatcher.test.ts +55 -5
  213. package/Tests/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.test.ts +98 -21
  214. package/Tests/Utils/NetworkDiscovery/DiscoveryImportEligibility.test.ts +98 -20
  215. package/Tests/Utils/NetworkDiscovery/DiscoveryReverseDnsChain.test.ts +8 -7
  216. package/Tests/Utils/NetworkDiscovery/PingMonitorBuilderForAddress.test.ts +274 -0
  217. package/Tests/Utils/NetworkSite/SiteStatusRollupUtil.test.ts +230 -51
  218. package/Tests/Utils/NetworkSite/TypeHierarchyUtil.test.ts +209 -0
  219. package/Tests/Utils/Telemetry/CaptureSpanExportGating.test.ts +145 -0
  220. package/Types/AI/ExceptionAIClassification.ts +10 -24
  221. package/Types/Email/EmailTemplateType.ts +2 -0
  222. package/Types/EnterpriseLicense/EnterpriseLicenseInstanceSummary.ts +5 -0
  223. package/Types/EnterpriseLicense/EnterpriseLicenseUsageSnapshot.ts +13 -0
  224. package/Types/EnterpriseLicense/EnterpriseLicenseUserCountSource.ts +6 -0
  225. package/Types/Exception/ApiException.ts +10 -0
  226. package/Types/Exception/BadDataException.ts +11 -0
  227. package/Types/Exception/BadRequestException.ts +11 -0
  228. package/Types/Exception/Exception.ts +65 -0
  229. package/Types/Exception/ForbiddenException.ts +10 -0
  230. package/Types/Exception/NotAuthenticatedException.ts +10 -0
  231. package/Types/Exception/NotAuthorizedException.ts +10 -0
  232. package/Types/Exception/NotFoundException.ts +11 -0
  233. package/Types/Exception/PayloadTooLargeException.ts +11 -0
  234. package/Types/Exception/PaymentRequiredException.ts +10 -0
  235. package/Types/Exception/ServiceUnavailableException.ts +10 -0
  236. package/Types/Exception/SsoAuthorizationException.ts +10 -0
  237. package/Types/Exception/TenantNotFoundException.ts +11 -0
  238. package/Types/Exception/TimeoutException.ts +10 -0
  239. package/Types/Exception/TooManyRequestsException.ts +10 -0
  240. package/Types/Exception/UnableToReachServer.ts +10 -0
  241. package/Types/Exception/WebsiteRequestException.ts +10 -0
  242. package/Types/Monitor/CriteriaFilter.ts +60 -2
  243. package/Types/Monitor/DatabaseMetricCatalog.ts +693 -0
  244. package/Types/Monitor/DatabaseMonitor/DatabaseMonitorResponse.ts +83 -0
  245. package/Types/Monitor/MonitorCriteriaInstance.ts +76 -0
  246. package/Types/Monitor/MonitorMetricType.ts +71 -0
  247. package/Types/Monitor/MonitorStep.ts +76 -0
  248. package/Types/Monitor/MonitorStepDatabaseMonitor.ts +171 -0
  249. package/Types/Monitor/MonitorStepSqlMonitor.ts +2 -20
  250. package/Types/Monitor/MonitorType.ts +47 -1
  251. package/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.ts +22 -1
  252. package/Types/Monitor/SqlConnectionConfig.ts +31 -0
  253. package/Types/NetworkDevice/NetworkAlertPolicyScope.ts +343 -0
  254. package/Types/NetworkDevice/NetworkDeviceMonitoringMethod.ts +42 -22
  255. package/Types/NetworkSite/DefaultNetworkSiteTypeHierarchy.ts +30 -0
  256. package/Types/NotificationSetting/NotificationEmailRollupCategory.ts +255 -0
  257. package/Types/NotificationSetting/NotificationEmailRollupPolicy.ts +104 -0
  258. package/Types/Permission.ts +90 -0
  259. package/Types/Probe/ProbeMonitorResponse.ts +16 -0
  260. package/Types/Telemetry/ErrorClass.ts +274 -0
  261. package/Types/Telemetry/UnitOfWork.ts +59 -0
  262. package/UI/Components/CommandPalette/CommandPalette.tsx +2 -8
  263. package/UI/Components/EditionLabel/EditionLabel.tsx +4 -0
  264. package/UI/Components/Modal/Modal.tsx +2 -8
  265. package/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.ts +44 -0
  266. package/UI/Components/ProgressBar/ProgressBar.tsx +12 -1
  267. package/UI/Components/RadioButtons/BasicRadioButtons.tsx +37 -7
  268. package/UI/Components/SideMenu/SideMenu.tsx +123 -5
  269. package/UI/Components/SideMenu/SideMenuItem.tsx +76 -84
  270. package/UI/Components/SideMenu/SideMenuSection.tsx +55 -23
  271. package/UI/Components/SideOver/SideOver.tsx +21 -20
  272. package/UI/Utils/PageScrollLock.ts +79 -3
  273. package/UI/Utils/PermissionGate.ts +61 -0
  274. package/UI/Utils/SensitiveUrlToken.ts +112 -0
  275. package/UI/Utils/TestLLMProvider.ts +11 -0
  276. package/Utils/EnterpriseLicense/EnterpriseLicenseSeats.ts +16 -0
  277. package/Utils/EnterpriseLicense/EnterpriseLicenseUsage.ts +191 -11
  278. package/Utils/Monitor/MonitorMetricType.ts +153 -1
  279. package/Utils/Monitor/NetworkTopologyUtil.ts +23 -3
  280. package/Utils/NetworkDevice/DeviceHealthStateUtil.ts +65 -14
  281. package/Utils/NetworkDevice/DeviceReachabilityUtil.ts +43 -14
  282. package/Utils/NetworkDevice/NetworkAlertPolicyBootstrapUtil.ts +247 -0
  283. package/Utils/NetworkDevice/SnmpCredentialUtil.ts +68 -0
  284. package/Utils/NetworkDiscovery/AutoImportRuleMatcher.ts +15 -7
  285. package/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.ts +52 -17
  286. package/Utils/NetworkDiscovery/DiscoveryImportEligibility.ts +55 -23
  287. package/Utils/NetworkDiscovery/PingMonitorBuilder.ts +115 -13
  288. package/Utils/NetworkSite/SiteStatusRollupUtil.ts +66 -20
  289. package/Utils/NetworkSite/TypeHierarchyUtil.ts +313 -0
  290. package/build/dist/Models/AnalyticsModels/Span.js +14 -0
  291. package/build/dist/Models/AnalyticsModels/Span.js.map +1 -1
  292. package/build/dist/Models/DatabaseModels/EnterpriseLicense.js +59 -0
  293. package/build/dist/Models/DatabaseModels/EnterpriseLicense.js.map +1 -1
  294. package/build/dist/Models/DatabaseModels/Index.js +10 -0
  295. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  296. package/build/dist/Models/DatabaseModels/Monitor.js +75 -0
  297. package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
  298. package/build/dist/Models/DatabaseModels/NetworkAlertPolicy.js +713 -0
  299. package/build/dist/Models/DatabaseModels/NetworkAlertPolicy.js.map +1 -0
  300. package/build/dist/Models/DatabaseModels/NetworkDevice.js +180 -1
  301. package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
  302. package/build/dist/Models/DatabaseModels/NetworkSite.js +200 -2
  303. package/build/dist/Models/DatabaseModels/NetworkSite.js.map +1 -1
  304. package/build/dist/Models/DatabaseModels/NetworkSiteType.js +102 -3
  305. package/build/dist/Models/DatabaseModels/NetworkSiteType.js.map +1 -1
  306. package/build/dist/Models/DatabaseModels/NetworkSnmpCredentialProfile.js +878 -0
  307. package/build/dist/Models/DatabaseModels/NetworkSnmpCredentialProfile.js.map +1 -0
  308. package/build/dist/Models/DatabaseModels/TelemetryException.js +123 -0
  309. package/build/dist/Models/DatabaseModels/TelemetryException.js.map +1 -1
  310. package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupBatch.js +363 -0
  311. package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupBatch.js.map +1 -0
  312. package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupItem.js +402 -0
  313. package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupItem.js.map +1 -0
  314. package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupSetting.js +296 -0
  315. package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupSetting.js.map +1 -0
  316. package/build/dist/Server/API/EnterpriseLicenseAPI.js +273 -60
  317. package/build/dist/Server/API/EnterpriseLicenseAPI.js.map +1 -1
  318. package/build/dist/Server/API/LlmProviderAPI.js +108 -13
  319. package/build/dist/Server/API/LlmProviderAPI.js.map +1 -1
  320. package/build/dist/Server/EnvironmentConfig.js +12 -0
  321. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  322. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790700000000-AddNetworkSiteTypeParentHierarchy.js +24 -0
  323. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790700000000-AddNetworkSiteTypeParentHierarchy.js.map +1 -0
  324. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddEnterpriseLicenseUsageProvenance.js +16 -0
  325. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddEnterpriseLicenseUsageProvenance.js.map +1 -0
  326. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddTelemetryExceptionErrorClass.js +111 -0
  327. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddTelemetryExceptionErrorClass.js.map +1 -0
  328. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791000000000-AddUserNotificationEmailRollup.js +77 -0
  329. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791000000000-AddUserNotificationEmailRollup.js.map +1 -0
  330. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791100000000-AddUserNotificationEmailRollupSetting.js +50 -0
  331. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791100000000-AddUserNotificationEmailRollupSetting.js.map +1 -0
  332. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791200000000-AddNetworkSnmpCredentialProfilesAndAlertPolicies.js +83 -0
  333. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791200000000-AddNetworkSnmpCredentialProfilesAndAlertPolicies.js.map +1 -0
  334. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +12 -0
  335. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  336. package/build/dist/Server/Infrastructure/QueueWorker.js +33 -5
  337. package/build/dist/Server/Infrastructure/QueueWorker.js.map +1 -1
  338. package/build/dist/Server/Middleware/BearerTokenAuthorization.js +12 -0
  339. package/build/dist/Server/Middleware/BearerTokenAuthorization.js.map +1 -1
  340. package/build/dist/Server/Middleware/ProjectAuthorization.js +11 -0
  341. package/build/dist/Server/Middleware/ProjectAuthorization.js.map +1 -1
  342. package/build/dist/Server/Middleware/SCIMAuthorization.js +12 -0
  343. package/build/dist/Server/Middleware/SCIMAuthorization.js.map +1 -1
  344. package/build/dist/Server/Middleware/TelemetryIngest.js +11 -0
  345. package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
  346. package/build/dist/Server/Services/AIBillingService.js +70 -16
  347. package/build/dist/Server/Services/AIBillingService.js.map +1 -1
  348. package/build/dist/Server/Services/EnterpriseLicenseInstanceService.js +167 -0
  349. package/build/dist/Server/Services/EnterpriseLicenseInstanceService.js.map +1 -1
  350. package/build/dist/Server/Services/EnterpriseLicenseService.js +39 -0
  351. package/build/dist/Server/Services/EnterpriseLicenseService.js.map +1 -1
  352. package/build/dist/Server/Services/Index.js +10 -0
  353. package/build/dist/Server/Services/Index.js.map +1 -1
  354. package/build/dist/Server/Services/MonitorService.js +119 -21
  355. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  356. package/build/dist/Server/Services/MonitorStatusTimelineService.js +127 -8
  357. package/build/dist/Server/Services/MonitorStatusTimelineService.js.map +1 -1
  358. package/build/dist/Server/Services/MonitorTemplateService.js +162 -0
  359. package/build/dist/Server/Services/MonitorTemplateService.js.map +1 -1
  360. package/build/dist/Server/Services/NetworkAlertPolicyEngineService.js +1683 -0
  361. package/build/dist/Server/Services/NetworkAlertPolicyEngineService.js.map +1 -0
  362. package/build/dist/Server/Services/NetworkAlertPolicyService.js +732 -0
  363. package/build/dist/Server/Services/NetworkAlertPolicyService.js.map +1 -0
  364. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +10 -9
  365. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
  366. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js +54 -11
  367. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js.map +1 -1
  368. package/build/dist/Server/Services/NetworkDeviceService.js +841 -70
  369. package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
  370. package/build/dist/Server/Services/NetworkSiteService.js +1145 -107
  371. package/build/dist/Server/Services/NetworkSiteService.js.map +1 -1
  372. package/build/dist/Server/Services/NetworkSiteTypeService.js +863 -0
  373. package/build/dist/Server/Services/NetworkSiteTypeService.js.map +1 -1
  374. package/build/dist/Server/Services/NetworkSnmpCredentialProfileService.js +217 -0
  375. package/build/dist/Server/Services/NetworkSnmpCredentialProfileService.js.map +1 -0
  376. package/build/dist/Server/Services/NotificationService.js +80 -17
  377. package/build/dist/Server/Services/NotificationService.js.map +1 -1
  378. package/build/dist/Server/Services/ProjectService.js +66 -30
  379. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  380. package/build/dist/Server/Services/StatusPagePrivateUserService.js +92 -2
  381. package/build/dist/Server/Services/StatusPagePrivateUserService.js.map +1 -1
  382. package/build/dist/Server/Services/UserNotificationEmailRollupBatchService.js +76 -0
  383. package/build/dist/Server/Services/UserNotificationEmailRollupBatchService.js.map +1 -0
  384. package/build/dist/Server/Services/UserNotificationEmailRollupItemService.js +77 -0
  385. package/build/dist/Server/Services/UserNotificationEmailRollupItemService.js.map +1 -0
  386. package/build/dist/Server/Services/UserNotificationEmailRollupSettingService.js +111 -0
  387. package/build/dist/Server/Services/UserNotificationEmailRollupSettingService.js.map +1 -0
  388. package/build/dist/Server/Services/UserNotificationSettingService.js +46 -20
  389. package/build/dist/Server/Services/UserNotificationSettingService.js.map +1 -1
  390. package/build/dist/Server/Services/UserService.js +90 -0
  391. package/build/dist/Server/Services/UserService.js.map +1 -1
  392. package/build/dist/Server/Types/Database/QueryHelper.js +1 -1
  393. package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
  394. package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js +14 -3
  395. package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js.map +1 -1
  396. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js +10 -0
  397. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js.map +1 -1
  398. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js +10 -0
  399. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js.map +1 -1
  400. package/build/dist/Server/Utils/AI/SRE/Insights/InsightTriageRunner.js +54 -1
  401. package/build/dist/Server/Utils/AI/SRE/Insights/InsightTriageRunner.js.map +1 -1
  402. package/build/dist/Server/Utils/AI/Toolbox/AlertTools.js +18 -4
  403. package/build/dist/Server/Utils/AI/Toolbox/AlertTools.js.map +1 -1
  404. package/build/dist/Server/Utils/Billing/BillingFailureNoticeThrottle.js +59 -0
  405. package/build/dist/Server/Utils/Billing/BillingFailureNoticeThrottle.js.map +1 -0
  406. package/build/dist/Server/Utils/DataSource/HttpFetch.js +2 -1
  407. package/build/dist/Server/Utils/DataSource/HttpFetch.js.map +1 -1
  408. package/build/dist/Server/Utils/EmailRollup/EmailRollupConstants.js +91 -0
  409. package/build/dist/Server/Utils/EmailRollup/EmailRollupConstants.js.map +1 -0
  410. package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js +691 -0
  411. package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js.map +1 -0
  412. package/build/dist/Server/Utils/EmailRollup/EmailRollupRenderer.js +497 -0
  413. package/build/dist/Server/Utils/EmailRollup/EmailRollupRenderer.js.map +1 -0
  414. package/build/dist/Server/Utils/EmailRollup/EmailRollupWriter.js +257 -0
  415. package/build/dist/Server/Utils/EmailRollup/EmailRollupWriter.js.map +1 -0
  416. package/build/dist/Server/Utils/LLM/LLMService.js +64 -1
  417. package/build/dist/Server/Utils/LLM/LLMService.js.map +1 -1
  418. package/build/dist/Server/Utils/LogRedaction.js +8 -0
  419. package/build/dist/Server/Utils/LogRedaction.js.map +1 -1
  420. package/build/dist/Server/Utils/Logger.js +63 -1
  421. package/build/dist/Server/Utils/Logger.js.map +1 -1
  422. package/build/dist/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.js +141 -0
  423. package/build/dist/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.js.map +1 -0
  424. package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js +8 -1
  425. package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js.map +1 -1
  426. package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js +51 -1
  427. package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js.map +1 -1
  428. package/build/dist/Server/Utils/Monitor/MonitorCriteriaDataExtractor.js +7 -0
  429. package/build/dist/Server/Utils/Monitor/MonitorCriteriaDataExtractor.js.map +1 -1
  430. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +37 -0
  431. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
  432. package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js +158 -6
  433. package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js.map +1 -1
  434. package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js +33 -0
  435. package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js.map +1 -1
  436. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +32 -0
  437. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
  438. package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js +330 -21
  439. package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js.map +1 -1
  440. package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js +55 -10
  441. package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js.map +1 -1
  442. package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js +178 -49
  443. package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js.map +1 -1
  444. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +119 -29
  445. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
  446. package/build/dist/Server/Utils/NetworkDevice/DeviceHealthAggregation.js +30 -17
  447. package/build/dist/Server/Utils/NetworkDevice/DeviceHealthAggregation.js.map +1 -1
  448. package/build/dist/Server/Utils/NetworkSite/NetworkSiteHierarchyLock.js +158 -0
  449. package/build/dist/Server/Utils/NetworkSite/NetworkSiteHierarchyLock.js.map +1 -0
  450. package/build/dist/Server/Utils/OutboundUserAgent.js +123 -0
  451. package/build/dist/Server/Utils/OutboundUserAgent.js.map +1 -0
  452. package/build/dist/Server/Utils/StartServer.js +38 -14
  453. package/build/dist/Server/Utils/StartServer.js.map +1 -1
  454. package/build/dist/Server/Utils/Telemetry/CaptureSpan.js +28 -8
  455. package/build/dist/Server/Utils/Telemetry/CaptureSpan.js.map +1 -1
  456. package/build/dist/Server/Utils/Telemetry/ErrorClassResolver.js +95 -0
  457. package/build/dist/Server/Utils/Telemetry/ErrorClassResolver.js.map +1 -0
  458. package/build/dist/Server/Utils/Telemetry/SpanUtil.js +29 -0
  459. package/build/dist/Server/Utils/Telemetry/SpanUtil.js.map +1 -1
  460. package/build/dist/Server/Utils/Telemetry.js +162 -46
  461. package/build/dist/Server/Utils/Telemetry.js.map +1 -1
  462. package/build/dist/Types/AI/ExceptionAIClassification.js +10 -24
  463. package/build/dist/Types/AI/ExceptionAIClassification.js.map +1 -1
  464. package/build/dist/Types/Email/EmailTemplateType.js +1 -0
  465. package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
  466. package/build/dist/Types/EnterpriseLicense/EnterpriseLicenseUsageSnapshot.js +2 -0
  467. package/build/dist/Types/EnterpriseLicense/EnterpriseLicenseUsageSnapshot.js.map +1 -0
  468. package/build/dist/Types/EnterpriseLicense/EnterpriseLicenseUserCountSource.js +7 -0
  469. package/build/dist/Types/EnterpriseLicense/EnterpriseLicenseUserCountSource.js.map +1 -0
  470. package/build/dist/Types/Exception/ApiException.js +9 -0
  471. package/build/dist/Types/Exception/ApiException.js.map +1 -1
  472. package/build/dist/Types/Exception/BadDataException.js +10 -0
  473. package/build/dist/Types/Exception/BadDataException.js.map +1 -1
  474. package/build/dist/Types/Exception/BadRequestException.js +10 -0
  475. package/build/dist/Types/Exception/BadRequestException.js.map +1 -1
  476. package/build/dist/Types/Exception/Exception.js +56 -0
  477. package/build/dist/Types/Exception/Exception.js.map +1 -1
  478. package/build/dist/Types/Exception/ForbiddenException.js +9 -0
  479. package/build/dist/Types/Exception/ForbiddenException.js.map +1 -1
  480. package/build/dist/Types/Exception/NotAuthenticatedException.js +9 -0
  481. package/build/dist/Types/Exception/NotAuthenticatedException.js.map +1 -1
  482. package/build/dist/Types/Exception/NotAuthorizedException.js +9 -0
  483. package/build/dist/Types/Exception/NotAuthorizedException.js.map +1 -1
  484. package/build/dist/Types/Exception/NotFoundException.js +10 -0
  485. package/build/dist/Types/Exception/NotFoundException.js.map +1 -1
  486. package/build/dist/Types/Exception/PayloadTooLargeException.js +10 -0
  487. package/build/dist/Types/Exception/PayloadTooLargeException.js.map +1 -1
  488. package/build/dist/Types/Exception/PaymentRequiredException.js +9 -0
  489. package/build/dist/Types/Exception/PaymentRequiredException.js.map +1 -1
  490. package/build/dist/Types/Exception/ServiceUnavailableException.js +9 -0
  491. package/build/dist/Types/Exception/ServiceUnavailableException.js.map +1 -1
  492. package/build/dist/Types/Exception/SsoAuthorizationException.js +9 -0
  493. package/build/dist/Types/Exception/SsoAuthorizationException.js.map +1 -1
  494. package/build/dist/Types/Exception/TenantNotFoundException.js +10 -0
  495. package/build/dist/Types/Exception/TenantNotFoundException.js.map +1 -1
  496. package/build/dist/Types/Exception/TimeoutException.js +9 -0
  497. package/build/dist/Types/Exception/TimeoutException.js.map +1 -1
  498. package/build/dist/Types/Exception/TooManyRequestsException.js +9 -0
  499. package/build/dist/Types/Exception/TooManyRequestsException.js.map +1 -1
  500. package/build/dist/Types/Exception/UnableToReachServer.js +9 -0
  501. package/build/dist/Types/Exception/UnableToReachServer.js.map +1 -1
  502. package/build/dist/Types/Exception/WebsiteRequestException.js +9 -0
  503. package/build/dist/Types/Exception/WebsiteRequestException.js.map +1 -1
  504. package/build/dist/Types/Monitor/CriteriaFilter.js +45 -2
  505. package/build/dist/Types/Monitor/CriteriaFilter.js.map +1 -1
  506. package/build/dist/Types/Monitor/DatabaseMetricCatalog.js +594 -0
  507. package/build/dist/Types/Monitor/DatabaseMetricCatalog.js.map +1 -0
  508. package/build/dist/Types/Monitor/DatabaseMonitor/DatabaseMonitorResponse.js +21 -0
  509. package/build/dist/Types/Monitor/DatabaseMonitor/DatabaseMonitorResponse.js.map +1 -0
  510. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js +70 -0
  511. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
  512. package/build/dist/Types/Monitor/MonitorMetricType.js +61 -0
  513. package/build/dist/Types/Monitor/MonitorMetricType.js.map +1 -1
  514. package/build/dist/Types/Monitor/MonitorStep.js +54 -0
  515. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  516. package/build/dist/Types/Monitor/MonitorStepDatabaseMonitor.js +122 -0
  517. package/build/dist/Types/Monitor/MonitorStepDatabaseMonitor.js.map +1 -0
  518. package/build/dist/Types/Monitor/MonitorStepSqlMonitor.js.map +1 -1
  519. package/build/dist/Types/Monitor/MonitorType.js +45 -1
  520. package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
  521. package/build/dist/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.js +21 -1
  522. package/build/dist/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.js.map +1 -1
  523. package/build/dist/Types/Monitor/SqlConnectionConfig.js +2 -0
  524. package/build/dist/Types/Monitor/SqlConnectionConfig.js.map +1 -0
  525. package/build/dist/Types/NetworkDevice/NetworkAlertPolicyScope.js +172 -0
  526. package/build/dist/Types/NetworkDevice/NetworkAlertPolicyScope.js.map +1 -0
  527. package/build/dist/Types/NetworkDevice/NetworkDeviceMonitoringMethod.js +40 -22
  528. package/build/dist/Types/NetworkDevice/NetworkDeviceMonitoringMethod.js.map +1 -1
  529. package/build/dist/Types/NetworkSite/DefaultNetworkSiteTypeHierarchy.js +26 -0
  530. package/build/dist/Types/NetworkSite/DefaultNetworkSiteTypeHierarchy.js.map +1 -0
  531. package/build/dist/Types/NotificationSetting/NotificationEmailRollupCategory.js +186 -0
  532. package/build/dist/Types/NotificationSetting/NotificationEmailRollupCategory.js.map +1 -0
  533. package/build/dist/Types/NotificationSetting/NotificationEmailRollupPolicy.js +87 -0
  534. package/build/dist/Types/NotificationSetting/NotificationEmailRollupPolicy.js.map +1 -0
  535. package/build/dist/Types/Permission.js +80 -0
  536. package/build/dist/Types/Permission.js.map +1 -1
  537. package/build/dist/Types/Telemetry/ErrorClass.js +216 -0
  538. package/build/dist/Types/Telemetry/ErrorClass.js.map +1 -0
  539. package/build/dist/Types/Telemetry/UnitOfWork.js +59 -0
  540. package/build/dist/Types/Telemetry/UnitOfWork.js.map +1 -0
  541. package/build/dist/UI/Components/CommandPalette/CommandPalette.js +2 -7
  542. package/build/dist/UI/Components/CommandPalette/CommandPalette.js.map +1 -1
  543. package/build/dist/UI/Components/EditionLabel/EditionLabel.js +3 -0
  544. package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
  545. package/build/dist/UI/Components/Modal/Modal.js +2 -7
  546. package/build/dist/UI/Components/Modal/Modal.js.map +1 -1
  547. package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js +39 -0
  548. package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js.map +1 -1
  549. package/build/dist/UI/Components/ProgressBar/ProgressBar.js +12 -1
  550. package/build/dist/UI/Components/ProgressBar/ProgressBar.js.map +1 -1
  551. package/build/dist/UI/Components/RadioButtons/BasicRadioButtons.js +6 -6
  552. package/build/dist/UI/Components/RadioButtons/BasicRadioButtons.js.map +1 -1
  553. package/build/dist/UI/Components/SideMenu/SideMenu.js +67 -5
  554. package/build/dist/UI/Components/SideMenu/SideMenu.js.map +1 -1
  555. package/build/dist/UI/Components/SideMenu/SideMenuItem.js +49 -53
  556. package/build/dist/UI/Components/SideMenu/SideMenuItem.js.map +1 -1
  557. package/build/dist/UI/Components/SideMenu/SideMenuSection.js +25 -7
  558. package/build/dist/UI/Components/SideMenu/SideMenuSection.js.map +1 -1
  559. package/build/dist/UI/Components/SideOver/SideOver.js +5 -20
  560. package/build/dist/UI/Components/SideOver/SideOver.js.map +1 -1
  561. package/build/dist/UI/Utils/PageScrollLock.js +31 -3
  562. package/build/dist/UI/Utils/PageScrollLock.js.map +1 -1
  563. package/build/dist/UI/Utils/PermissionGate.js +42 -1
  564. package/build/dist/UI/Utils/PermissionGate.js.map +1 -1
  565. package/build/dist/UI/Utils/SensitiveUrlToken.js +97 -0
  566. package/build/dist/UI/Utils/SensitiveUrlToken.js.map +1 -0
  567. package/build/dist/UI/Utils/TestLLMProvider.js +4 -5
  568. package/build/dist/UI/Utils/TestLLMProvider.js.map +1 -1
  569. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js +15 -0
  570. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js.map +1 -1
  571. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js +111 -9
  572. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js.map +1 -1
  573. package/build/dist/Utils/Monitor/MonitorMetricType.js +109 -1
  574. package/build/dist/Utils/Monitor/MonitorMetricType.js.map +1 -1
  575. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +8 -3
  576. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
  577. package/build/dist/Utils/NetworkDevice/DeviceHealthStateUtil.js +27 -7
  578. package/build/dist/Utils/NetworkDevice/DeviceHealthStateUtil.js.map +1 -1
  579. package/build/dist/Utils/NetworkDevice/DeviceReachabilityUtil.js +7 -5
  580. package/build/dist/Utils/NetworkDevice/DeviceReachabilityUtil.js.map +1 -1
  581. package/build/dist/Utils/NetworkDevice/NetworkAlertPolicyBootstrapUtil.js +180 -0
  582. package/build/dist/Utils/NetworkDevice/NetworkAlertPolicyBootstrapUtil.js.map +1 -0
  583. package/build/dist/Utils/NetworkDevice/SnmpCredentialUtil.js +12 -0
  584. package/build/dist/Utils/NetworkDevice/SnmpCredentialUtil.js.map +1 -0
  585. package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js +15 -5
  586. package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js.map +1 -1
  587. package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js +44 -15
  588. package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js.map +1 -1
  589. package/build/dist/Utils/NetworkDiscovery/DiscoveryImportEligibility.js +52 -23
  590. package/build/dist/Utils/NetworkDiscovery/DiscoveryImportEligibility.js.map +1 -1
  591. package/build/dist/Utils/NetworkDiscovery/PingMonitorBuilder.js +85 -13
  592. package/build/dist/Utils/NetworkDiscovery/PingMonitorBuilder.js.map +1 -1
  593. package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js +30 -15
  594. package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js.map +1 -1
  595. package/build/dist/Utils/NetworkSite/TypeHierarchyUtil.js +191 -0
  596. package/build/dist/Utils/NetworkSite/TypeHierarchyUtil.js.map +1 -0
  597. package/package.json +2 -2
@@ -0,0 +1,682 @@
1
+ /*
2
+ * The main entry, not "/extend-expect": the latter no longer ships type
3
+ * declarations, so every jest-dom matcher in this file fails to typecheck and
4
+ * the whole suite is skipped before a single assertion runs.
5
+ */
6
+ import "@testing-library/jest-dom";
7
+ import { render, RenderResult, screen, within } from "@testing-library/react";
8
+ import React from "react";
9
+ import { describe, expect, test } from "@jest/globals";
10
+ import CreateProgressPanel from "../../../../App/FeatureSet/Dashboard/src/Components/Recommendations/MonitorRecommendationCreateProgress";
11
+ import MonitorRecommendationCreateRunner, {
12
+ MonitorRecommendationCreateItemProgress,
13
+ MonitorRecommendationCreateItemStatus,
14
+ MonitorRecommendationCreateProgress,
15
+ } from "../../../../App/FeatureSet/Dashboard/src/Components/Recommendations/MonitorRecommendationCreateRunner";
16
+
17
+ /*
18
+ * The panel a user stares at for the better part of a minute after pressing
19
+ * Create on a batch of recommendations. Everything asserted here is something
20
+ * that, if it broke, would leave that minute unexplained:
21
+ *
22
+ * - a bar that counts only successes stalls short of the end forever on any
23
+ * run that had a failure, so the panel says "still working" about a batch
24
+ * that finished;
25
+ * - rows that appear one at a time reproduce the original complaint, which
26
+ * was that NOTHING appeared until the first monitor had already landed —
27
+ * the longest silence in the operation was the one right after the click;
28
+ * - a Failed row that does not carry its error message loses that error for
29
+ * good, because the run no longer aborts and nothing else in the app
30
+ * records why one monitor out of eighteen did not get made.
31
+ *
32
+ * The counts below are always derived from the item statuses rather than
33
+ * written out by hand, so a test cannot accidentally assert against a progress
34
+ * shape the runner would never emit.
35
+ */
36
+
37
+ type MakeItemFunction = (data: {
38
+ recommendationId: string;
39
+ name: string;
40
+ status: MonitorRecommendationCreateItemStatus;
41
+ errorMessage?: string | undefined;
42
+ }) => MonitorRecommendationCreateItemProgress;
43
+
44
+ const makeItem: MakeItemFunction = (data: {
45
+ recommendationId: string;
46
+ name: string;
47
+ status: MonitorRecommendationCreateItemStatus;
48
+ errorMessage?: string | undefined;
49
+ }): MonitorRecommendationCreateItemProgress => {
50
+ return {
51
+ recommendationId: data.recommendationId,
52
+ name: data.name,
53
+ status: data.status,
54
+ errorMessage: data.errorMessage,
55
+ };
56
+ };
57
+
58
+ type CountWithStatusFunction = (
59
+ items: Array<MonitorRecommendationCreateItemProgress>,
60
+ status: MonitorRecommendationCreateItemStatus,
61
+ ) => number;
62
+
63
+ const countWithStatus: CountWithStatusFunction = (
64
+ items: Array<MonitorRecommendationCreateItemProgress>,
65
+ status: MonitorRecommendationCreateItemStatus,
66
+ ): number => {
67
+ return items.filter(
68
+ (item: MonitorRecommendationCreateItemProgress): boolean => {
69
+ return item.status === status;
70
+ },
71
+ ).length;
72
+ };
73
+
74
+ type MakeProgressFunction = (
75
+ items: Array<MonitorRecommendationCreateItemProgress>,
76
+ ) => MonitorRecommendationCreateProgress;
77
+
78
+ const makeProgress: MakeProgressFunction = (
79
+ items: Array<MonitorRecommendationCreateItemProgress>,
80
+ ): MonitorRecommendationCreateProgress => {
81
+ const createdCount: number = countWithStatus(
82
+ items,
83
+ MonitorRecommendationCreateItemStatus.Created,
84
+ );
85
+ const failedCount: number = countWithStatus(
86
+ items,
87
+ MonitorRecommendationCreateItemStatus.Failed,
88
+ );
89
+
90
+ return {
91
+ items: items,
92
+ totalCount: items.length,
93
+ createdCount: createdCount,
94
+ failedCount: failedCount,
95
+ isComplete: createdCount + failedCount === items.length,
96
+ };
97
+ };
98
+
99
+ type RenderPanelFunction = (
100
+ progress: MonitorRecommendationCreateProgress,
101
+ ) => RenderResult;
102
+
103
+ const renderPanel: RenderPanelFunction = (
104
+ progress: MonitorRecommendationCreateProgress,
105
+ ): RenderResult => {
106
+ return render(<CreateProgressPanel progress={progress} />);
107
+ };
108
+
109
+ type GetRowFunction = (recommendationId: string) => HTMLElement;
110
+
111
+ const getRow: GetRowFunction = (recommendationId: string): HTMLElement => {
112
+ return screen.getByTestId(
113
+ `monitor-recommendation-create-progress-item-${recommendationId}`,
114
+ );
115
+ };
116
+
117
+ /*
118
+ * The status indicator is the row's first child — a tick, a cross, a spinner
119
+ * or a hollow ring. Comparing its markup rather than a class name is what lets
120
+ * "these four statuses look different from each other" be asserted as one
121
+ * fact, instead of four assertions that could all be satisfied by the same
122
+ * glyph.
123
+ */
124
+ type GetStatusIndicatorMarkupFunction = (recommendationId: string) => string;
125
+
126
+ const getStatusIndicatorMarkup: GetStatusIndicatorMarkupFunction = (
127
+ recommendationId: string,
128
+ ): string => {
129
+ const indicator: Element | null = getRow(recommendationId).firstElementChild;
130
+
131
+ return indicator ? indicator.outerHTML : "";
132
+ };
133
+
134
+ type GetSummaryFunction = () => HTMLElement;
135
+
136
+ const getSummary: GetSummaryFunction = (): HTMLElement => {
137
+ return screen.getByTestId("monitor-recommendation-create-progress-summary");
138
+ };
139
+
140
+ type GetRowNamesFunction = () => Array<string>;
141
+
142
+ const getRowNames: GetRowNamesFunction = (): Array<string> => {
143
+ return screen.getAllByRole("listitem").map((row: HTMLElement): string => {
144
+ return row.textContent || "";
145
+ });
146
+ };
147
+
148
+ describe("MonitorRecommendationCreateProgress", () => {
149
+ describe("the progress bar", () => {
150
+ /*
151
+ * The regression that matters most in this file. The bar is fed
152
+ * created + failed, not created: a batch of four where one has already
153
+ * failed and two have landed is three quarters done. A bar wired to
154
+ * createdCount would read "2 of 4" here and, on a run where anything at
155
+ * all failed, would never reach the end — leaving a finished operation
156
+ * looking like a hung one.
157
+ */
158
+ test("counts failures as settled work, so a half-failed batch is not stuck short of the end", () => {
159
+ renderPanel(
160
+ makeProgress([
161
+ makeItem({
162
+ recommendationId: "one",
163
+ name: "Node CPU",
164
+ status: MonitorRecommendationCreateItemStatus.Created,
165
+ }),
166
+ makeItem({
167
+ recommendationId: "two",
168
+ name: "Node memory",
169
+ status: MonitorRecommendationCreateItemStatus.Created,
170
+ }),
171
+ makeItem({
172
+ recommendationId: "three",
173
+ name: "Pod restarts",
174
+ status: MonitorRecommendationCreateItemStatus.Failed,
175
+ errorMessage: "Monitor limit reached on this plan.",
176
+ }),
177
+ makeItem({
178
+ recommendationId: "four",
179
+ name: "Disk pressure",
180
+ status: MonitorRecommendationCreateItemStatus.Creating,
181
+ }),
182
+ ]),
183
+ );
184
+
185
+ expect(screen.getByTestId("progress-bar-count")).toHaveTextContent(
186
+ "3 of 4 monitors",
187
+ );
188
+ expect(screen.getByRole("progressbar")).toHaveAttribute(
189
+ "aria-valuenow",
190
+ "75",
191
+ );
192
+
193
+ // What the created-only reading would have been.
194
+ expect(screen.getByTestId("progress-bar-count")).not.toHaveTextContent(
195
+ "2 of 4 monitors",
196
+ );
197
+ });
198
+
199
+ test("fills the bar completely once the last item has settled, even though one of them failed", () => {
200
+ renderPanel(
201
+ makeProgress([
202
+ makeItem({
203
+ recommendationId: "one",
204
+ name: "Node CPU",
205
+ status: MonitorRecommendationCreateItemStatus.Created,
206
+ }),
207
+ makeItem({
208
+ recommendationId: "two",
209
+ name: "Node memory",
210
+ status: MonitorRecommendationCreateItemStatus.Created,
211
+ }),
212
+ makeItem({
213
+ recommendationId: "three",
214
+ name: "Pod restarts",
215
+ status: MonitorRecommendationCreateItemStatus.Created,
216
+ }),
217
+ makeItem({
218
+ recommendationId: "four",
219
+ name: "Disk pressure",
220
+ status: MonitorRecommendationCreateItemStatus.Failed,
221
+ errorMessage: "Monitor limit reached on this plan.",
222
+ }),
223
+ ]),
224
+ );
225
+
226
+ expect(screen.getByTestId("progress-bar-count")).toHaveTextContent(
227
+ "4 of 4 monitors",
228
+ );
229
+ expect(screen.getByRole("progressbar")).toHaveAttribute(
230
+ "aria-valuenow",
231
+ "100",
232
+ );
233
+ });
234
+
235
+ test("starts empty rather than skipping ahead, so the bar means what it says on the first frame", () => {
236
+ renderPanel(
237
+ makeProgress([
238
+ makeItem({
239
+ recommendationId: "one",
240
+ name: "Node CPU",
241
+ status: MonitorRecommendationCreateItemStatus.Pending,
242
+ }),
243
+ makeItem({
244
+ recommendationId: "two",
245
+ name: "Node memory",
246
+ status: MonitorRecommendationCreateItemStatus.Pending,
247
+ }),
248
+ ]),
249
+ );
250
+
251
+ expect(screen.getByTestId("progress-bar-count")).toHaveTextContent(
252
+ "0 of 2 monitors",
253
+ );
254
+ expect(screen.getByRole("progressbar")).toHaveAttribute(
255
+ "aria-valuenow",
256
+ "0",
257
+ );
258
+ });
259
+ });
260
+
261
+ describe("the item list", () => {
262
+ /*
263
+ * The original complaint, in one assertion. Before this panel existed the
264
+ * user saw nothing at all until the first create had come back from the
265
+ * server — several seconds of a button that had visibly been pressed and
266
+ * an interface that had visibly done nothing. Every planned monitor is
267
+ * listed from the first render, Pending ones included.
268
+ */
269
+ test("lists every planned monitor the instant the batch starts, before a single one has been created", () => {
270
+ const progress: MonitorRecommendationCreateProgress = makeProgress([
271
+ makeItem({
272
+ recommendationId: "one",
273
+ name: "Node CPU is high",
274
+ status: MonitorRecommendationCreateItemStatus.Pending,
275
+ }),
276
+ makeItem({
277
+ recommendationId: "two",
278
+ name: "Node memory is high",
279
+ status: MonitorRecommendationCreateItemStatus.Pending,
280
+ }),
281
+ makeItem({
282
+ recommendationId: "three",
283
+ name: "Pods are restarting",
284
+ status: MonitorRecommendationCreateItemStatus.Pending,
285
+ }),
286
+ ]);
287
+
288
+ renderPanel(progress);
289
+
290
+ expect(progress.createdCount).toBe(0);
291
+ expect(screen.getAllByRole("listitem")).toHaveLength(3);
292
+
293
+ expect(getRow("one")).toBeInTheDocument();
294
+ expect(getRow("two")).toBeInTheDocument();
295
+ expect(getRow("three")).toBeInTheDocument();
296
+
297
+ expect(screen.getByText("Node CPU is high")).toBeInTheDocument();
298
+ expect(screen.getByText("Node memory is high")).toBeInTheDocument();
299
+ expect(screen.getByText("Pods are restarting")).toBeInTheDocument();
300
+ });
301
+
302
+ /*
303
+ * The list is the user's map of a sequential run: the row that is spinning
304
+ * has to stay where they last looked, and the rows above it have to be the
305
+ * ones already dealt with. Re-ordering by status would move the whole list
306
+ * under them on every emission.
307
+ */
308
+ test("keeps the plan's order as items move through their statuses", () => {
309
+ renderPanel(
310
+ makeProgress([
311
+ makeItem({
312
+ recommendationId: "one",
313
+ name: "Node CPU is high",
314
+ status: MonitorRecommendationCreateItemStatus.Created,
315
+ }),
316
+ makeItem({
317
+ recommendationId: "two",
318
+ name: "Node memory is high",
319
+ status: MonitorRecommendationCreateItemStatus.Creating,
320
+ }),
321
+ makeItem({
322
+ recommendationId: "three",
323
+ name: "Pods are restarting",
324
+ status: MonitorRecommendationCreateItemStatus.Pending,
325
+ }),
326
+ ]),
327
+ );
328
+
329
+ expect(getRowNames()).toEqual([
330
+ "Node CPU is high",
331
+ "Node memory is high",
332
+ "Pods are restarting",
333
+ ]);
334
+ });
335
+ });
336
+
337
+ describe("the status of one row", () => {
338
+ type RenderOneOfEachStatusFunction = () => void;
339
+
340
+ const renderOneOfEachStatus: RenderOneOfEachStatusFunction = (): void => {
341
+ renderPanel(
342
+ makeProgress([
343
+ makeItem({
344
+ recommendationId: "created",
345
+ name: "Node CPU is high",
346
+ status: MonitorRecommendationCreateItemStatus.Created,
347
+ }),
348
+ makeItem({
349
+ recommendationId: "creating",
350
+ name: "Node memory is high",
351
+ status: MonitorRecommendationCreateItemStatus.Creating,
352
+ }),
353
+ makeItem({
354
+ recommendationId: "failed",
355
+ name: "Pods are restarting",
356
+ status: MonitorRecommendationCreateItemStatus.Failed,
357
+ errorMessage: "Monitor limit reached on this plan.",
358
+ }),
359
+ makeItem({
360
+ recommendationId: "pending",
361
+ name: "Disk is filling up",
362
+ status: MonitorRecommendationCreateItemStatus.Pending,
363
+ }),
364
+ ]),
365
+ );
366
+ };
367
+
368
+ /*
369
+ * Four statuses, four different-looking rows. Asserted as one set rather
370
+ * than four class checks because the failure worth catching is two
371
+ * statuses collapsing onto the same glyph — a Pending row that renders the
372
+ * same tick as a Created one reads as eighteen finished monitors half a
373
+ * minute before any of them exist.
374
+ */
375
+ test("gives each of the four statuses its own indicator", () => {
376
+ renderOneOfEachStatus();
377
+
378
+ const markups: Array<string> = [
379
+ getStatusIndicatorMarkup("created"),
380
+ getStatusIndicatorMarkup("creating"),
381
+ getStatusIndicatorMarkup("failed"),
382
+ getStatusIndicatorMarkup("pending"),
383
+ ];
384
+
385
+ for (const markup of markups) {
386
+ expect(markup).not.toBe("");
387
+ }
388
+
389
+ expect(new Set<string>(markups).size).toBe(4);
390
+ });
391
+
392
+ test("marks a created row in green and a failed one in red, the two colours a user scans for", () => {
393
+ renderOneOfEachStatus();
394
+
395
+ expect(getStatusIndicatorMarkup("created")).toContain("text-green-500");
396
+ expect(getStatusIndicatorMarkup("failed")).toContain("text-red-500");
397
+ });
398
+
399
+ test("spins the row that is actually in flight, so 'still working' points at one monitor", () => {
400
+ renderOneOfEachStatus();
401
+
402
+ expect(getStatusIndicatorMarkup("creating")).toContain("animate-spin");
403
+ expect(getStatusIndicatorMarkup("created")).not.toContain("animate-spin");
404
+ expect(getStatusIndicatorMarkup("pending")).not.toContain("animate-spin");
405
+ });
406
+
407
+ /*
408
+ * A hollow ring, not a greyed tick: any tick shape at a glance down a list
409
+ * of ticks reads as done, whatever colour it is drawn in.
410
+ */
411
+ test("draws a queued row as an empty ring rather than a tick in another colour", () => {
412
+ renderOneOfEachStatus();
413
+
414
+ const pendingMarkup: string = getStatusIndicatorMarkup("pending");
415
+
416
+ expect(pendingMarkup).toContain("rounded-full");
417
+ expect(pendingMarkup).not.toContain("<svg");
418
+ });
419
+
420
+ test("dims the name of a queued row and not of one that has landed", () => {
421
+ renderOneOfEachStatus();
422
+
423
+ expect(
424
+ within(getRow("pending")).getByText("Disk is filling up"),
425
+ ).toHaveClass("text-gray-400");
426
+ expect(
427
+ within(getRow("created")).getByText("Node CPU is high"),
428
+ ).not.toHaveClass("text-gray-400");
429
+ });
430
+
431
+ /*
432
+ * The run no longer aborts on the first rejection, so a batch can finish
433
+ * with three of eighteen missing. This row is the only place the app ever
434
+ * says which three and why — nothing is persisted, and the list reloads
435
+ * behind the panel showing only what did get created.
436
+ */
437
+ test("a failed row carries its error message, which exists nowhere else", () => {
438
+ renderOneOfEachStatus();
439
+
440
+ expect(
441
+ within(getRow("failed")).getByText(
442
+ "Monitor limit reached on this plan.",
443
+ ),
444
+ ).toBeInTheDocument();
445
+ });
446
+
447
+ test("does not attach that error to the rows that did not fail", () => {
448
+ renderOneOfEachStatus();
449
+
450
+ expect(getRow("created")).not.toHaveTextContent(
451
+ "Monitor limit reached on this plan.",
452
+ );
453
+ expect(getRow("pending")).not.toHaveTextContent(
454
+ "Monitor limit reached on this plan.",
455
+ );
456
+ });
457
+
458
+ test("reports each failure separately when several of them failed differently", () => {
459
+ renderPanel(
460
+ makeProgress([
461
+ makeItem({
462
+ recommendationId: "one",
463
+ name: "Node CPU is high",
464
+ status: MonitorRecommendationCreateItemStatus.Failed,
465
+ errorMessage: "Monitor limit reached on this plan.",
466
+ }),
467
+ makeItem({
468
+ recommendationId: "two",
469
+ name: "Node memory is high",
470
+ status: MonitorRecommendationCreateItemStatus.Failed,
471
+ errorMessage: "A monitor with this name already exists.",
472
+ }),
473
+ ]),
474
+ );
475
+
476
+ expect(getRow("one")).toHaveTextContent(
477
+ "Monitor limit reached on this plan.",
478
+ );
479
+ expect(getRow("two")).toHaveTextContent(
480
+ "A monitor with this name already exists.",
481
+ );
482
+ });
483
+ });
484
+
485
+ describe("the summary line", () => {
486
+ /*
487
+ * The sentence itself lives on the runner, because "which of these numbers
488
+ * is the headline" is a decision rather than a formatting detail. What the
489
+ * panel owes is to render THAT sentence — a panel that rolled its own
490
+ * would drift from it the first time either changed.
491
+ */
492
+ test("renders the runner's sentence while the batch is still running", () => {
493
+ const progress: MonitorRecommendationCreateProgress = makeProgress([
494
+ makeItem({
495
+ recommendationId: "one",
496
+ name: "Node CPU is high",
497
+ status: MonitorRecommendationCreateItemStatus.Created,
498
+ }),
499
+ makeItem({
500
+ recommendationId: "two",
501
+ name: "Node memory is high",
502
+ status: MonitorRecommendationCreateItemStatus.Creating,
503
+ }),
504
+ ]);
505
+
506
+ renderPanel(progress);
507
+
508
+ expect(progress.isComplete).toBe(false);
509
+ expect(getSummary()).toHaveTextContent(
510
+ MonitorRecommendationCreateRunner.getSummaryText(progress),
511
+ );
512
+ });
513
+
514
+ test("renders the runner's sentence once the batch has finished with failures", () => {
515
+ const progress: MonitorRecommendationCreateProgress = makeProgress([
516
+ makeItem({
517
+ recommendationId: "one",
518
+ name: "Node CPU is high",
519
+ status: MonitorRecommendationCreateItemStatus.Created,
520
+ }),
521
+ makeItem({
522
+ recommendationId: "two",
523
+ name: "Node memory is high",
524
+ status: MonitorRecommendationCreateItemStatus.Created,
525
+ }),
526
+ makeItem({
527
+ recommendationId: "three",
528
+ name: "Pods are restarting",
529
+ status: MonitorRecommendationCreateItemStatus.Failed,
530
+ errorMessage: "Monitor limit reached on this plan.",
531
+ }),
532
+ makeItem({
533
+ recommendationId: "four",
534
+ name: "Disk is filling up",
535
+ status: MonitorRecommendationCreateItemStatus.Failed,
536
+ errorMessage: "A monitor with this name already exists.",
537
+ }),
538
+ ]);
539
+
540
+ renderPanel(progress);
541
+
542
+ expect(progress.isComplete).toBe(true);
543
+ expect(getSummary()).toHaveTextContent(
544
+ MonitorRecommendationCreateRunner.getSummaryText(progress),
545
+ );
546
+
547
+ /*
548
+ * Pinned separately from the delegation above: the count of failures is
549
+ * the one number a user has to be told, and a summary that rendered the
550
+ * right function but the wrong progress would still satisfy the
551
+ * equality check.
552
+ */
553
+ expect(getSummary()).toHaveTextContent("2 failed");
554
+ });
555
+
556
+ /*
557
+ * Red is reserved for a finished run that lost something. Colouring the
558
+ * in-progress sentence red would alarm the user in the middle of a run
559
+ * that is going perfectly well; leaving the failed one grey would let a
560
+ * partial failure slide past unnoticed, which is the whole reason the run
561
+ * is allowed to continue past a failure at all.
562
+ */
563
+ test("styles a finished-with-failures summary as an error", () => {
564
+ renderPanel(
565
+ makeProgress([
566
+ makeItem({
567
+ recommendationId: "one",
568
+ name: "Node CPU is high",
569
+ status: MonitorRecommendationCreateItemStatus.Created,
570
+ }),
571
+ makeItem({
572
+ recommendationId: "two",
573
+ name: "Node memory is high",
574
+ status: MonitorRecommendationCreateItemStatus.Failed,
575
+ errorMessage: "Monitor limit reached on this plan.",
576
+ }),
577
+ ]),
578
+ );
579
+
580
+ expect(getSummary()).toHaveClass("text-red-700");
581
+ });
582
+
583
+ test("does not style the in-progress summary as an error", () => {
584
+ renderPanel(
585
+ makeProgress([
586
+ makeItem({
587
+ recommendationId: "one",
588
+ name: "Node CPU is high",
589
+ status: MonitorRecommendationCreateItemStatus.Failed,
590
+ errorMessage: "Monitor limit reached on this plan.",
591
+ }),
592
+ makeItem({
593
+ recommendationId: "two",
594
+ name: "Node memory is high",
595
+ status: MonitorRecommendationCreateItemStatus.Creating,
596
+ }),
597
+ ]),
598
+ );
599
+
600
+ expect(getSummary()).not.toHaveClass("text-red-700");
601
+ expect(getSummary()).toHaveClass("text-gray-600");
602
+ });
603
+
604
+ test("does not style a clean finished run as an error", () => {
605
+ renderPanel(
606
+ makeProgress([
607
+ makeItem({
608
+ recommendationId: "one",
609
+ name: "Node CPU is high",
610
+ status: MonitorRecommendationCreateItemStatus.Created,
611
+ }),
612
+ makeItem({
613
+ recommendationId: "two",
614
+ name: "Node memory is high",
615
+ status: MonitorRecommendationCreateItemStatus.Created,
616
+ }),
617
+ ]),
618
+ );
619
+
620
+ expect(getSummary()).not.toHaveClass("text-red-700");
621
+ });
622
+ });
623
+
624
+ describe("assistive technology", () => {
625
+ /*
626
+ * The entire content of this panel is a thing that changes on its own
627
+ * while the user does nothing, which is exactly what a live region is
628
+ * for. Without it a screen-reader user presses Create and is told nothing
629
+ * further until they go hunting for the panel — and the one announcement
630
+ * that matters, that two of the eighteen failed, is the one they would
631
+ * never hear.
632
+ */
633
+ test("announces itself as a live region, because it changes without the user acting", () => {
634
+ renderPanel(
635
+ makeProgress([
636
+ makeItem({
637
+ recommendationId: "one",
638
+ name: "Node CPU is high",
639
+ status: MonitorRecommendationCreateItemStatus.Creating,
640
+ }),
641
+ ]),
642
+ );
643
+
644
+ const panel: HTMLElement = screen.getByTestId(
645
+ "monitor-recommendation-create-progress",
646
+ );
647
+
648
+ expect(panel).toHaveAttribute("role", "status");
649
+ expect(panel).toHaveAttribute("aria-live", "polite");
650
+ expect(panel).toContainElement(getSummary());
651
+ });
652
+ });
653
+
654
+ describe("an empty batch", () => {
655
+ /*
656
+ * Reachable in ordinary use: every selected recommendation can be filtered
657
+ * out of the plan before the run starts (a teammate dismissed them, or the
658
+ * monitors already exist), and `getInitialProgress([])` is then handed
659
+ * straight to this panel. The division behind the bar's percentage has a
660
+ * zero denominator here, so the guard being asserted is simply that the
661
+ * panel still renders instead of taking the whole side panel down with it.
662
+ */
663
+ test("renders a zero-item batch instead of crashing on the empty denominator", () => {
664
+ const progress: MonitorRecommendationCreateProgress = makeProgress([]);
665
+
666
+ expect(() => {
667
+ renderPanel(progress);
668
+ }).not.toThrow();
669
+
670
+ expect(
671
+ screen.getByTestId("monitor-recommendation-create-progress"),
672
+ ).toBeInTheDocument();
673
+ expect(screen.getByTestId("progress-bar-count")).toHaveTextContent(
674
+ "0 of 0 monitors",
675
+ );
676
+ expect(screen.queryAllByRole("listitem")).toHaveLength(0);
677
+ expect(getSummary()).toHaveTextContent(
678
+ MonitorRecommendationCreateRunner.getSummaryText(progress),
679
+ );
680
+ });
681
+ });
682
+ });
@@ -121,7 +121,7 @@ describe("Monitor type picker", () => {
121
121
 
122
122
  /*
123
123
  * The whole point of the change. Every type used to render at once - nine
124
- * headings and 29 cards, about six thousand pixels of them.
124
+ * headings and 31 cards, about six thousand pixels of them.
125
125
  */
126
126
  test("the long tail starts folded away behind its headings", () => {
127
127
  renderPicker();
@@ -175,7 +175,9 @@ describe("Monitor type picker", () => {
175
175
  describe("finding a type by the words a user already knows", () => {
176
176
  test.each([
177
177
  ["k8s", MonitorType.Kubernetes],
178
- ["postgres", MonitorType.SQLQuery],
178
+ // An engine name means health series; "query" means the escape hatch.
179
+ ["postgres", MonitorType.Database],
180
+ ["query", MonitorType.SQLQuery],
179
181
  ["heartbeat", MonitorType.IncomingRequest],
180
182
  ["tls", MonitorType.SSLCertificate],
181
183
  ["snmp", MonitorType.NetworkDevice],