@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,161 @@
1
+ import CriteriaFilterUtil from "../../../../App/FeatureSet/Dashboard/src/Utils/Form/Monitor/CriteriaFilter";
2
+ import { CheckOn, FilterType } from "../../../Types/Monitor/CriteriaFilter";
3
+ import MonitorType from "../../../Types/Monitor/MonitorType";
4
+ import { DropdownOption } from "../../../UI/Components/Dropdown/Dropdown";
5
+ import SnmpMonitorCriteria from "../../../Server/Utils/Monitor/Criteria/SnmpMonitorCriteria";
6
+ import { describe, expect, test } from "@jest/globals";
7
+
8
+ /*
9
+ * WHY THIS FILE EXISTS
10
+ *
11
+ * The criteria a Network Device monitor can be built from are decided in two
12
+ * places that have no compile-time link to each other: the CheckOn enum plus
13
+ * the server evaluator (SnmpMonitorCriteria), and this dashboard catalog,
14
+ * which filters the enum down to what the form offers per monitor type.
15
+ *
16
+ * Adding a CheckOn to the enum and teaching the evaluator to answer it does
17
+ * NOT make it selectable — the catalog filters it out by omission, silently,
18
+ * with no type error and no failing test. That is exactly how
19
+ * CheckOn.SnmpWalkIsSucceeding shipped server-side while remaining invisible
20
+ * in the form: the alert-pack template could use it, but nobody could pick it
21
+ * by hand.
22
+ *
23
+ * So this file holds the catalog to the evaluator: every SNMP check the
24
+ * server can answer is offered, each with filter types it can actually be
25
+ * compared with, and nothing is offered that the server would ignore.
26
+ */
27
+
28
+ function values(options: Array<DropdownOption>): Array<string> {
29
+ return options.map((option: DropdownOption): string => {
30
+ return option.value.toString();
31
+ });
32
+ }
33
+
34
+ const NETWORK_DEVICE_CHECK_ONS: Array<string> = values(
35
+ CriteriaFilterUtil.getCheckOnOptionsByMonitorType(MonitorType.NetworkDevice),
36
+ );
37
+
38
+ describe("what a Network Device monitor can be built from", () => {
39
+ /*
40
+ * Written as an exact list rather than a "contains" so that a CheckOn added
41
+ * to the enum for another monitor type cannot leak into this form, and so
42
+ * that removing one is a deliberate edit here.
43
+ */
44
+ test("offers exactly the SNMP checks, and only those", () => {
45
+ expect(NETWORK_DEVICE_CHECK_ONS).toEqual([
46
+ CheckOn.SnmpOidValue,
47
+ CheckOn.SnmpOidExists,
48
+ CheckOn.SnmpResponseTime,
49
+ CheckOn.SnmpIsOnline,
50
+ CheckOn.SnmpWalkIsSucceeding,
51
+ CheckOn.SnmpInterfaceIsDown,
52
+ CheckOn.SnmpTrapReceived,
53
+ CheckOn.SnmpInterfaceUtilizationPercent,
54
+ CheckOn.SnmpInterfaceErrorsPerSecond,
55
+ ]);
56
+ });
57
+
58
+ /*
59
+ * THE ASSERTION THIS FILE EXISTS FOR.
60
+ *
61
+ * Reachability and the walk are different questions now. A device is
62
+ * online when it answers ping OR its walk succeeds, so a switch whose SNMP
63
+ * agent has died — wrong community after a config push, an ACL change, the
64
+ * agent simply stopped — keeps answering ping and stays Online, while
65
+ * interfaces, topology and inventory quietly stop arriving. "SNMP Walk Is
66
+ * Succeeding" is the only criterion that catches that, and a catalog that
67
+ * omitted it would leave the failure unalertable by hand.
68
+ */
69
+ test("the walk can be alerted on separately from reachability", () => {
70
+ expect(NETWORK_DEVICE_CHECK_ONS).toContain(CheckOn.SnmpWalkIsSucceeding);
71
+ expect(NETWORK_DEVICE_CHECK_ONS).toContain(CheckOn.SnmpIsOnline);
72
+ });
73
+
74
+ /*
75
+ * Both are yes/no questions, so a threshold comparison would be
76
+ * meaningless; offering "Greater Than" on "Is Online" is how a criterion
77
+ * gets built that can never be true.
78
+ */
79
+ test.each([CheckOn.SnmpWalkIsSucceeding, CheckOn.SnmpIsOnline])(
80
+ "%s is compared as true or false and nothing else",
81
+ (checkOn: CheckOn) => {
82
+ expect(
83
+ values(CriteriaFilterUtil.getFilterTypeOptionsByCheckOn(checkOn)),
84
+ ).toEqual([FilterType.True, FilterType.False]);
85
+ },
86
+ );
87
+
88
+ /*
89
+ * The other direction: an SNMP check must not appear on a monitor type
90
+ * whose probe never walks anything, or the form would offer a criterion
91
+ * that is never evaluated and so never breaches.
92
+ */
93
+ test.each([MonitorType.Website, MonitorType.Ping, MonitorType.Port])(
94
+ "%s is not offered the SNMP walk check",
95
+ (monitorType: MonitorType) => {
96
+ expect(
97
+ values(CriteriaFilterUtil.getCheckOnOptionsByMonitorType(monitorType)),
98
+ ).not.toContain(CheckOn.SnmpWalkIsSucceeding);
99
+ },
100
+ );
101
+ });
102
+
103
+ describe("the catalog agrees with the server evaluator", () => {
104
+ /*
105
+ * The link the type system does not give us. Every walk-dependent check
106
+ * the evaluator knows about — the ones it returns null for when a poll ran
107
+ * no walk — has to be selectable, or the server can answer a question the
108
+ * form cannot ask.
109
+ *
110
+ * isWalkDependentCheckOn is private on the evaluator because nothing in
111
+ * production needs it; it is reached here through the class object so that
112
+ * this test breaks when the evaluator's list grows, which is precisely the
113
+ * moment the catalog needs updating.
114
+ */
115
+ test("every walk-dependent check the evaluator knows is offered in the form", () => {
116
+ type IsWalkDependentFunction = (checkOn: CheckOn) => boolean;
117
+
118
+ const isWalkDependent: IsWalkDependentFunction = (
119
+ SnmpMonitorCriteria as unknown as {
120
+ isWalkDependentCheckOn: IsWalkDependentFunction;
121
+ }
122
+ ).isWalkDependentCheckOn;
123
+
124
+ expect(typeof isWalkDependent).toBe("function");
125
+
126
+ const walkDependent: Array<CheckOn> = Object.values(CheckOn).filter(
127
+ (checkOn: CheckOn): boolean => {
128
+ return isWalkDependent(checkOn);
129
+ },
130
+ );
131
+
132
+ // A guard against the reflection above silently matching nothing.
133
+ expect(walkDependent.length).toBeGreaterThan(3);
134
+
135
+ for (const checkOn of walkDependent) {
136
+ expect({ checkOn: checkOn, offered: true }).toEqual({
137
+ checkOn: checkOn,
138
+ offered: NETWORK_DEVICE_CHECK_ONS.includes(checkOn),
139
+ });
140
+ }
141
+ });
142
+
143
+ /*
144
+ * ...and reachability is NOT walk-dependent, which is the whole point of
145
+ * separating the two. If it ever became walk-dependent, a ping-only device
146
+ * would stop being evaluated for reachability at all and would sit at its
147
+ * last verdict forever.
148
+ */
149
+ test("reachability is not walk-dependent", () => {
150
+ type IsWalkDependentFunction = (checkOn: CheckOn) => boolean;
151
+
152
+ const isWalkDependent: IsWalkDependentFunction = (
153
+ SnmpMonitorCriteria as unknown as {
154
+ isWalkDependentCheckOn: IsWalkDependentFunction;
155
+ }
156
+ ).isWalkDependentCheckOn;
157
+
158
+ expect(isWalkDependent(CheckOn.SnmpIsOnline)).toBe(false);
159
+ expect(isWalkDependent(CheckOn.SnmpWalkIsSucceeding)).toBe(true);
160
+ });
161
+ });
@@ -0,0 +1,458 @@
1
+ import "@testing-library/jest-dom";
2
+ import { cleanup, render, waitFor } from "@testing-library/react";
3
+ import React, { ReactElement } from "react";
4
+ import { MemoryRouter } from "react-router-dom";
5
+ import {
6
+ afterEach,
7
+ beforeEach,
8
+ describe,
9
+ expect,
10
+ jest,
11
+ test,
12
+ } from "@jest/globals";
13
+ import NetworkDeviceMonitoringMethod from "../../../Types/NetworkDevice/NetworkDeviceMonitoringMethod";
14
+ import NetworkSnmpCredentialProfile from "../../../Models/DatabaseModels/NetworkSnmpCredentialProfile";
15
+ import ObjectID from "../../../Types/ObjectID";
16
+ import FormFieldSchemaType from "../../../UI/Components/Forms/Types/FormFieldSchemaType";
17
+ import {
18
+ DropdownOption,
19
+ DropdownValue,
20
+ } from "../../../UI/Components/Dropdown/Dropdown";
21
+
22
+ /*
23
+ * The device Settings page under ping-first polling.
24
+ *
25
+ * A probe-polled device is pinged whether or not it has SNMP credentials, so
26
+ * this page is where three things now have to be true and stay true:
27
+ *
28
+ * - the monitoring method is offered as "Probe" (the normal choice) versus
29
+ * "Bound monitor" (the override), in those words, because the create
30
+ * form no longer asks and this is the only place the choice is made;
31
+ * - the SNMP step is shown for a probe-polled device (credentials are
32
+ * optional on it), offers a credential profile, and has a "Ping only"
33
+ * affordance that blanks the device's own credentials on the way to a
34
+ * save — a v3 device cannot otherwise be made ping-only without knowing
35
+ * that the username is what the probe keys on;
36
+ * - the polling card (probe, interval, toggle) is editable for a
37
+ * probe-polled device and NOT for a bound-monitor override, which
38
+ * nothing polls.
39
+ *
40
+ * CardModelDetail is replaced by a prop recorder keyed on the card's name —
41
+ * the point is what the page hands each card, not re-testing the card.
42
+ */
43
+
44
+ jest.mock("react-i18next", () => {
45
+ return {
46
+ useTranslation: () => {
47
+ return {
48
+ t: (key: string): string => {
49
+ return key;
50
+ },
51
+ };
52
+ },
53
+ };
54
+ });
55
+
56
+ jest.mock("../../../UI/Utils/Permission", () => {
57
+ return {
58
+ __esModule: true,
59
+ default: {
60
+ getAllPermissions: () => {
61
+ return [];
62
+ },
63
+ getProjectPermissions: () => {
64
+ return [];
65
+ },
66
+ getGlobalPermissions: () => {
67
+ return [];
68
+ },
69
+ },
70
+ };
71
+ });
72
+
73
+ jest.mock("../../../UI/Utils/User", () => {
74
+ return {
75
+ __esModule: true,
76
+ default: {
77
+ isMasterAdmin: () => {
78
+ return false;
79
+ },
80
+ getUserId: () => {
81
+ return null;
82
+ },
83
+ },
84
+ };
85
+ });
86
+
87
+ const DEVICE_ID: ObjectID = new ObjectID(
88
+ "22222222-0000-4000-8000-000000000001",
89
+ );
90
+ const PROJECT_ID: ObjectID = new ObjectID(
91
+ "11111111-0000-4000-8000-000000000001",
92
+ );
93
+
94
+ jest.mock("../../../UI/Utils/Navigation", () => {
95
+ return {
96
+ __esModule: true,
97
+ default: {
98
+ getLastParamAsObjectID: () => {
99
+ return DEVICE_ID;
100
+ },
101
+ navigate: () => {
102
+ // no-op
103
+ },
104
+ getQueryStringByName: () => {
105
+ return null;
106
+ },
107
+ },
108
+ };
109
+ });
110
+
111
+ jest.mock("../../../UI/Utils/Project", () => {
112
+ return {
113
+ __esModule: true,
114
+ default: {
115
+ getCurrentProjectId: () => {
116
+ return PROJECT_ID;
117
+ },
118
+ },
119
+ };
120
+ });
121
+
122
+ /* What the page's device read returns: flipped per test. */
123
+ let deviceMonitoringMethod: string | undefined = undefined;
124
+
125
+ jest.mock("../../../UI/Utils/ModelAPI/ModelAPI", () => {
126
+ return {
127
+ __esModule: true,
128
+ default: {
129
+ getItem: () => {
130
+ return Promise.resolve({ monitoringMethod: deviceMonitoringMethod });
131
+ },
132
+ getList: () => {
133
+ return Promise.resolve({ data: [], count: 0 });
134
+ },
135
+ },
136
+ };
137
+ });
138
+
139
+ jest.mock("../../../../App/FeatureSet/Dashboard/src/Utils/Probe", () => {
140
+ return {
141
+ __esModule: true,
142
+ default: {
143
+ getAllProbes: async () => {
144
+ return [{ _id: "probe-1", name: "Branch probe" }];
145
+ },
146
+ },
147
+ };
148
+ });
149
+
150
+ jest.mock(
151
+ "../../../../App/FeatureSet/Dashboard/src/Components/TelemetryResource/ArchiveResourceCard",
152
+ () => {
153
+ return {
154
+ __esModule: true,
155
+ default: () => {
156
+ return null;
157
+ },
158
+ };
159
+ },
160
+ );
161
+
162
+ type FormValuesLike = Record<string, unknown>;
163
+
164
+ type CapturedFormField = {
165
+ field?: Record<string, unknown> | undefined;
166
+ overrideField?: Record<string, unknown> | undefined;
167
+ overrideFieldKey?: string | undefined;
168
+ title?: string | undefined;
169
+ stepId?: string | undefined;
170
+ description?: string | undefined;
171
+ fieldType?: FormFieldSchemaType | undefined;
172
+ required?: boolean | ((values: FormValuesLike) => boolean) | undefined;
173
+ showIf?: ((values: FormValuesLike) => boolean) | undefined;
174
+ dropdownOptions?: Array<{ label: string; value: string }> | undefined;
175
+ dropdownModal?: { type: unknown } | undefined;
176
+ onChange?:
177
+ | ((
178
+ value: unknown,
179
+ currentFormValues: FormValuesLike,
180
+ setNewFormValues: (values: FormValuesLike) => void,
181
+ ) => void)
182
+ | undefined;
183
+ };
184
+
185
+ type CapturedFormStep = {
186
+ id: string;
187
+ title: string;
188
+ showIf?: ((values: FormValuesLike) => boolean) | undefined;
189
+ };
190
+
191
+ type CapturedCardProps = {
192
+ name: string;
193
+ isEditable?: boolean | undefined;
194
+ cardProps?: { description?: string | undefined } | undefined;
195
+ formSteps?: Array<CapturedFormStep> | undefined;
196
+ formFields?: Array<CapturedFormField> | undefined;
197
+ onSaveSuccess?: ((item: unknown) => void) | undefined;
198
+ };
199
+
200
+ const capturedCards: Map<string, CapturedCardProps> = new Map();
201
+
202
+ jest.mock("../../../UI/Components/ModelDetail/CardModelDetail", () => {
203
+ return {
204
+ __esModule: true,
205
+ default: (props: CapturedCardProps) => {
206
+ capturedCards.set(props.name, props);
207
+ return null;
208
+ },
209
+ };
210
+ });
211
+
212
+ import NetworkDeviceSettingsPage, {
213
+ PING_ONLY_FIELD_KEY,
214
+ } from "../../../../App/FeatureSet/Dashboard/src/Pages/NetworkDevice/View/Settings";
215
+ import PageComponentProps from "../../../../App/FeatureSet/Dashboard/src/Pages/PageComponentProps";
216
+ import Route from "../../../Types/API/Route";
217
+
218
+ const PAGE_PROPS: PageComponentProps = {
219
+ pageRoute: new Route("/dashboard/network-devices/view/settings"),
220
+ currentProject: null,
221
+ hasPaymentMethod: true,
222
+ };
223
+
224
+ async function renderPage(): Promise<Map<string, CapturedCardProps>> {
225
+ const Page: (props: PageComponentProps) => ReactElement =
226
+ NetworkDeviceSettingsPage as unknown as (
227
+ props: PageComponentProps,
228
+ ) => ReactElement;
229
+
230
+ render(
231
+ <MemoryRouter>
232
+ <Page {...PAGE_PROPS} />
233
+ </MemoryRouter>,
234
+ );
235
+
236
+ await waitFor(() => {
237
+ expect(capturedCards.has("Device Settings")).toBe(true);
238
+ expect(capturedCards.has("Polling & Data Collection")).toBe(true);
239
+ });
240
+
241
+ return capturedCards;
242
+ }
243
+
244
+ function fieldFor(card: CapturedCardProps, key: string): CapturedFormField {
245
+ const match: CapturedFormField | undefined = (card.formFields || []).find(
246
+ (field: CapturedFormField): boolean => {
247
+ return (
248
+ Object.keys(field.field || {})[0] === key ||
249
+ field.overrideFieldKey === key
250
+ );
251
+ },
252
+ );
253
+
254
+ expect({ key: key, found: Boolean(match) }).toEqual({
255
+ key: key,
256
+ found: true,
257
+ });
258
+
259
+ return match!;
260
+ }
261
+
262
+ function isShown(field: CapturedFormField, values: FormValuesLike): boolean {
263
+ return field.showIf ? field.showIf(values) : true;
264
+ }
265
+
266
+ const PROBE_VALUES: FormValuesLike = {
267
+ monitoringMethod: NetworkDeviceMonitoringMethod.Probe,
268
+ };
269
+ const LEGACY_SNMP_VALUES: FormValuesLike = { monitoringMethod: "SNMP" };
270
+ const MONITOR_VALUES: FormValuesLike = {
271
+ monitoringMethod: NetworkDeviceMonitoringMethod.Monitor,
272
+ };
273
+
274
+ describe("the device Settings page", () => {
275
+ beforeEach(() => {
276
+ capturedCards.clear();
277
+ deviceMonitoringMethod = NetworkDeviceMonitoringMethod.Probe;
278
+ window.localStorage.clear();
279
+ });
280
+
281
+ afterEach(() => {
282
+ cleanup();
283
+ jest.clearAllMocks();
284
+ });
285
+
286
+ describe("the monitoring method", () => {
287
+ test("is offered as Probe (normal) versus Bound monitor (override), in those words", async () => {
288
+ const cards: Map<string, CapturedCardProps> = await renderPage();
289
+ const method: CapturedFormField = fieldFor(
290
+ cards.get("Device Settings")!,
291
+ "monitoringMethod",
292
+ );
293
+
294
+ const labels: Array<string> = (method.dropdownOptions || []).map(
295
+ (option: { label: string }): string => {
296
+ return option.label;
297
+ },
298
+ );
299
+
300
+ expect(
301
+ method.dropdownOptions?.map((option: DropdownOption): DropdownValue => {
302
+ return option.value;
303
+ }),
304
+ ).toEqual([
305
+ NetworkDeviceMonitoringMethod.Probe,
306
+ NetworkDeviceMonitoringMethod.Monitor,
307
+ ]);
308
+ expect(labels[0]).toMatch(/^Probe — /);
309
+ expect(labels[0]).toContain("pinged");
310
+ expect(labels[1]).toMatch(/^Bound monitor — /);
311
+ expect(labels[1]).toContain("override");
312
+ expect(method.description).toContain("Probe is the normal choice");
313
+ });
314
+
315
+ test("the bound-monitor field is shown only for the override", async () => {
316
+ const cards: Map<string, CapturedCardProps> = await renderPage();
317
+ const monitor: CapturedFormField = fieldFor(
318
+ cards.get("Device Settings")!,
319
+ "monitor",
320
+ );
321
+
322
+ expect(isShown(monitor, MONITOR_VALUES)).toBe(true);
323
+ expect(isShown(monitor, PROBE_VALUES)).toBe(false);
324
+ expect(isShown(monitor, LEGACY_SNMP_VALUES)).toBe(false);
325
+ expect(monitor.required).toBe(false);
326
+ });
327
+ });
328
+
329
+ describe("the SNMP step", () => {
330
+ test("is shown for a probe-polled device (including legacy SNMP rows) and hidden for a bound-monitor override", async () => {
331
+ const cards: Map<string, CapturedCardProps> = await renderPage();
332
+ const snmpStep: CapturedFormStep | undefined = cards
333
+ .get("Device Settings")!
334
+ .formSteps?.find((step: CapturedFormStep): boolean => {
335
+ return step.id === "snmp";
336
+ });
337
+
338
+ expect(snmpStep).toBeDefined();
339
+ expect(snmpStep!.showIf!(PROBE_VALUES)).toBe(true);
340
+ expect(snmpStep!.showIf!(LEGACY_SNMP_VALUES)).toBe(true);
341
+ expect(snmpStep!.showIf!({})).toBe(true);
342
+ expect(snmpStep!.showIf!(MONITOR_VALUES)).toBe(false);
343
+ });
344
+
345
+ test("offers a credential profile bound to the profile model, optional, and says the device's own credentials win", async () => {
346
+ const cards: Map<string, CapturedCardProps> = await renderPage();
347
+ const profile: CapturedFormField = fieldFor(
348
+ cards.get("Device Settings")!,
349
+ "snmpCredentialProfile",
350
+ );
351
+
352
+ expect(profile.stepId).toBe("snmp");
353
+ expect(profile.required).toBe(false);
354
+ expect(profile.dropdownModal?.type).toBe(NetworkSnmpCredentialProfile);
355
+ expect(profile.description).toContain("own credentials below win");
356
+ expect(profile.description).toContain("site can carry a default");
357
+ });
358
+
359
+ test("the Ping only box blanks the device's own credentials when ticked", async () => {
360
+ const cards: Map<string, CapturedCardProps> = await renderPage();
361
+ const pingOnly: CapturedFormField = fieldFor(
362
+ cards.get("Device Settings")!,
363
+ PING_ONLY_FIELD_KEY,
364
+ );
365
+
366
+ expect(pingOnly.fieldType).toBe(FormFieldSchemaType.Checkbox);
367
+ expect(pingOnly.stepId).toBe("snmp");
368
+ expect(pingOnly.field).toBeUndefined();
369
+ expect(pingOnly.overrideField).toEqual({ [PING_ONLY_FIELD_KEY]: true });
370
+
371
+ let next: FormValuesLike | null = null;
372
+ pingOnly.onChange!(
373
+ true,
374
+ {
375
+ ...PROBE_VALUES,
376
+ snmpVersion: "V3",
377
+ snmpV3Username: "netops",
378
+ snmpV3AuthKey: "secret",
379
+ snmpV3PrivKey: "secret2",
380
+ snmpCommunityString: "public",
381
+ },
382
+ (values: FormValuesLike): void => {
383
+ next = values;
384
+ },
385
+ );
386
+
387
+ expect(next).not.toBeNull();
388
+ expect(next!["snmpCommunityString"]).toBe("");
389
+ expect(next!["snmpV3Username"]).toBe("");
390
+ expect(next!["snmpV3AuthKey"]).toBe("");
391
+ expect(next!["snmpV3PrivKey"]).toBe("");
392
+ // Everything else is left alone — the version in particular.
393
+ expect(next!["snmpVersion"]).toBe("V3");
394
+ });
395
+
396
+ test("the Ping only box does nothing when unticked", async () => {
397
+ const cards: Map<string, CapturedCardProps> = await renderPage();
398
+ const pingOnly: CapturedFormField = fieldFor(
399
+ cards.get("Device Settings")!,
400
+ PING_ONLY_FIELD_KEY,
401
+ );
402
+
403
+ let calls: number = 0;
404
+ pingOnly.onChange!(
405
+ false,
406
+ { ...PROBE_VALUES, snmpCommunityString: "public" },
407
+ (): void => {
408
+ calls++;
409
+ },
410
+ );
411
+
412
+ expect(calls).toBe(0);
413
+ });
414
+ });
415
+
416
+ describe("the polling card", () => {
417
+ test("is editable for a probe-polled device", async () => {
418
+ deviceMonitoringMethod = NetworkDeviceMonitoringMethod.Probe;
419
+
420
+ const cards: Map<string, CapturedCardProps> = await renderPage();
421
+ const polling: CapturedCardProps = cards.get(
422
+ "Polling & Data Collection",
423
+ )!;
424
+
425
+ expect(polling.isEditable).toBe(true);
426
+ expect(polling.cardProps?.description).toContain("pings this device");
427
+ expect(fieldFor(polling, "probe").required).toBe(true);
428
+ });
429
+
430
+ test("is read-only, and says why, for a bound-monitor override", async () => {
431
+ deviceMonitoringMethod = NetworkDeviceMonitoringMethod.Monitor;
432
+
433
+ const cards: Map<string, CapturedCardProps> = await renderPage();
434
+
435
+ await waitFor(() => {
436
+ expect(cards.get("Polling & Data Collection")!.isEditable).toBe(false);
437
+ });
438
+
439
+ expect(
440
+ cards.get("Polling & Data Collection")!.cardProps?.description,
441
+ ).toContain("nothing polls it");
442
+ });
443
+
444
+ test("a legacy SNMP row is treated as probe-polled", async () => {
445
+ deviceMonitoringMethod = "SNMP";
446
+
447
+ const cards: Map<string, CapturedCardProps> = await renderPage();
448
+
449
+ expect(cards.get("Polling & Data Collection")!.isEditable).toBe(true);
450
+ });
451
+
452
+ test("the Device Settings card re-reads the method after a save", async () => {
453
+ const cards: Map<string, CapturedCardProps> = await renderPage();
454
+
455
+ expect(cards.get("Device Settings")!.onSaveSuccess).toBeDefined();
456
+ });
457
+ });
458
+ });
@@ -209,6 +209,33 @@ const EXPECTED_SECTIONS: Array<ExpectedMenuSection> = [
209
209
  "OID Collection Templates",
210
210
  ],
211
211
  },
212
+ /*
213
+ * The named credential sets a device is walked WITH, beside the OID
214
+ * templates that say what it COLLECTS. Settings rather than Rules:
215
+ * nothing here runs on its own, it is a definition a device points at.
216
+ */
217
+ {
218
+ title: "SNMP Credentials",
219
+ pageMapKey: PageMap.NETWORK_DEVICE_SETTINGS_SNMP_CREDENTIAL_PROFILES,
220
+ getBreadcrumbs: getNetworkDeviceBreadcrumbs,
221
+ breadcrumbTitles: [
222
+ "Project",
223
+ "Network",
224
+ "Settings",
225
+ "SNMP Credentials",
226
+ ],
227
+ },
228
+ /*
229
+ * Alert policies are a definition too ("alert on devices like these"),
230
+ * which is why they sit here and not under Rules: the engine that
231
+ * provisions the monitors is what runs, and it has no page of its own.
232
+ */
233
+ {
234
+ title: "Alert Policies",
235
+ pageMapKey: PageMap.NETWORK_DEVICE_SETTINGS_ALERT_POLICIES,
236
+ getBreadcrumbs: getNetworkDeviceBreadcrumbs,
237
+ breadcrumbTitles: ["Project", "Network", "Settings", "Alert Policies"],
238
+ },
212
239
  {
213
240
  title: "Site Types",
214
241
  pageMapKey: PageMap.NETWORK_SITE_SETTINGS_SITE_TYPES,
@@ -260,7 +287,16 @@ function expectActiveLink(title: string): void {
260
287
 
261
288
  expect(anchor).toHaveClass("text-indigo-700");
262
289
  expect(anchor).not.toHaveClass("text-gray-600");
263
- expect(anchor.querySelector(".h-5.bg-indigo-600")).not.toBeNull();
290
+ /*
291
+ * The rail beside an active row. Matched on its colour and its non-zero
292
+ * height rather than on an exact height class: the point of the assertion is
293
+ * that the rail is drawn at all, and pinning "h-5" made a restyle of the
294
+ * shared menu fail here rather than in the side-menu suite that owns it.
295
+ */
296
+ const rail: Element | null = anchor.querySelector(".bg-indigo-600");
297
+
298
+ expect(rail).not.toBeNull();
299
+ expect(rail?.className).not.toContain("h-0");
264
300
  }
265
301
 
266
302
  function expectCompleteMenu(): void {
@@ -341,7 +377,7 @@ describe("Network side menu", () => {
341
377
  await renderNetworkMenu();
342
378
 
343
379
  expect(isExpanded("Settings")).toBe(false);
344
- expect(linksIn("Settings")).toHaveLength(3);
380
+ expect(linksIn("Settings")).toHaveLength(5);
345
381
 
346
382
  fireEvent.click(sectionToggle("Settings"));
347
383
  expect(isExpanded("Settings")).toBe(true);
@@ -353,11 +389,11 @@ describe("Network side menu", () => {
353
389
  });
354
390
 
355
391
  describe("coverage", () => {
356
- test("keeps all nineteen destinations reachable exactly once", async () => {
392
+ test("keeps all twenty-one destinations reachable exactly once", async () => {
357
393
  await renderNetworkMenu();
358
394
 
359
- expect(EXPECTED_ENTRIES).toHaveLength(19);
360
- expect(allLinks()).toHaveLength(19);
395
+ expect(EXPECTED_ENTRIES).toHaveLength(21);
396
+ expect(allLinks()).toHaveLength(21);
361
397
  expect(hrefsInMenu().sort()).toEqual(
362
398
  EXPECTED_ENTRIES.map(expectedHref).sort(),
363
399
  );