@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
@@ -1,7 +1,11 @@
1
1
  import { describe, expect, test } from "@jest/globals";
2
2
  import OneUptimeDate from "../../../Types/Date";
3
+ import NetworkDeviceMonitoringMethod, {
4
+ LEGACY_SNMP_MONITORING_METHOD,
5
+ } from "../../../Types/NetworkDevice/NetworkDeviceMonitoringMethod";
3
6
  import {
4
7
  DeviceHealthCounts,
8
+ DeviceHealthStateInput,
5
9
  NetworkDeviceHealthState,
6
10
  addDeviceHealth,
7
11
  deviceAttentionCount,
@@ -16,11 +20,25 @@ import {
16
20
  * has to look at.
17
21
  *
18
22
  * Everything the hierarchy view claims about an estate of 21,700 devices is
19
- * this function summed up, so every branch of it is pinned here: what a
20
- * monitor's verdict overrides, what a dark port does to a device that is
21
- * otherwise answering, and — the one that matters most — what stays
22
- * "unknown" instead of being quietly counted as either a failure or a
23
- * success.
23
+ * this function summed up, so every branch of it is pinned here: which kind
24
+ * of device a stamped monitor status speaks for, what a dark port does to a
25
+ * device that is otherwise answering, and — the one that matters most —
26
+ * what stays "unknown" instead of being quietly counted as either a failure
27
+ * or a success.
28
+ *
29
+ * The precedence rule (issue #3562, ping-first polling). Under SNMP-first
30
+ * polling a stamped MonitorStatus outranked the poll on EVERY device, and
31
+ * that no longer holds: every probe-polled device is now pinged on its
32
+ * schedule, so it always has a poll verdict of its own, and the monitors
33
+ * that stamp it (a Network Device monitor watching its SNMP walk, with an
34
+ * "interface down → Offline" criterion) are watching something narrower
35
+ * than reachability. The rule is therefore split by kind of device:
36
+ *
37
+ * monitor-backed ("Monitor") — nothing polls it, so the stamp IS its
38
+ * health, and no stamp means Pending.
39
+ * probe-polled (anything else, including NULL, "" and the legacy "SNMP")
40
+ * — the poll decides; the stamp is
41
+ * informational and never consulted.
24
42
  */
25
43
 
26
44
  const NOW: Date = OneUptimeDate.fromString("2026-08-21T12:00:00.000Z");
@@ -31,13 +49,38 @@ const minutesAgo: MinutesAgoFunction = (minutes: number): Date => {
31
49
  return new Date(NOW.getTime() - minutes * 60 * 1000);
32
50
  };
33
51
 
34
- describe("deviceHealthState — a monitor's verdict is the system of record", () => {
35
- test("a status the ladder does not call offline makes the device up, whatever the poll says", () => {
52
+ /*
53
+ * Every spelling of "this device is polled by its probe" that reaches the
54
+ * classifier from a real row. NULL and "" are rows written before the column
55
+ * existed; "SNMP" is the retired first value of the enum, and a device that
56
+ * carried it was probe-polled all along (the probe just did not ping it
57
+ * yet). All four must take the poll branch identically — a device that read
58
+ * as monitor-backed on one of them would have the stamp outrank its own
59
+ * poll, which is the regression this whole describe block exists to catch.
60
+ */
61
+ const PROBE_POLLED_METHODS: Array<string | null | undefined> = [
62
+ // The real values, so a renamed member fails here and not in production.
63
+ NetworkDeviceMonitoringMethod.Probe,
64
+ LEGACY_SNMP_MONITORING_METHOD,
65
+ "",
66
+ null,
67
+ undefined,
68
+ ];
69
+
70
+ // The one value on which a stamped MonitorStatus is the device's verdict.
71
+ const MONITOR_BACKED: string = NetworkDeviceMonitoringMethod.Monitor;
72
+
73
+ describe("deviceHealthState — a monitor's verdict is the system of record for a MONITOR-BACKED device", () => {
74
+ test("a status the ladder does not call offline makes the device up, whatever the poll leftovers say", () => {
36
75
  expect(
37
76
  deviceHealthState(
38
77
  {
78
+ monitoringMethod: MONITOR_BACKED,
39
79
  monitorStatusIsOffline: false,
40
- // The SNMP side would say Down on its own.
80
+ /*
81
+ * Leftovers from before the device was switched over to a bound
82
+ * monitor. Nothing polls it now, so these must not be read.
83
+ */
41
84
  isReachable: false,
42
85
  lastPolledAt: minutesAgo(1),
43
86
  },
@@ -46,10 +89,11 @@ describe("deviceHealthState — a monitor's verdict is the system of record", ()
46
89
  ).toBe("healthy");
47
90
  });
48
91
 
49
- test("an offline monitor status makes the device down, whatever the poll says", () => {
92
+ test("an offline monitor status makes the device down, whatever the poll leftovers say", () => {
50
93
  expect(
51
94
  deviceHealthState(
52
95
  {
96
+ monitoringMethod: MONITOR_BACKED,
53
97
  monitorStatusIsOffline: true,
54
98
  isReachable: true,
55
99
  lastPolledAt: minutesAgo(1),
@@ -63,19 +107,154 @@ describe("deviceHealthState — a monitor's verdict is the system of record", ()
63
107
  test("a monitor-backed device that is up can still be degraded by its ports", () => {
64
108
  expect(
65
109
  deviceHealthState(
66
- { monitorStatusIsOffline: false, interfacesDown: 3 },
110
+ {
111
+ monitoringMethod: MONITOR_BACKED,
112
+ monitorStatusIsOffline: false,
113
+ interfacesDown: 3,
114
+ },
67
115
  NOW,
68
116
  ),
69
117
  ).toBe("degraded");
70
118
  });
71
119
 
72
120
  /*
73
- * `undefined` means "no monitor is attached", which is the ordinary case
74
- * for an SNMP-walked switch. It must not be read as a verdict of any kind
75
- * doing so would either paint every switch in the estate down or hide
76
- * every real outage behind a stamped green.
121
+ * The Pending case. A monitor-backed device with nothing stamped has
122
+ * either had no monitor bound to it yet (discovery used to import
123
+ * ping-only hosts that way on purpose) or has one that has never been
124
+ * evaluated. Neither is a verdict, and the device list says "Pending"
125
+ * about the very same row — reading a green or a red here would put the
126
+ * site card at odds with the pill under it.
77
127
  */
78
- test("an absent monitor status defers to reachability rather than deciding", () => {
128
+ test("a monitor-backed device nothing has stamped is unknown, not a verdict", () => {
129
+ expect(deviceHealthState({ monitoringMethod: MONITOR_BACKED }, NOW)).toBe(
130
+ "unknown",
131
+ );
132
+ expect(
133
+ deviceHealthState(
134
+ { monitoringMethod: MONITOR_BACKED, monitorStatusIsOffline: undefined },
135
+ NOW,
136
+ ),
137
+ ).toBe("unknown");
138
+ expect(
139
+ deviceHealthState(
140
+ { monitoringMethod: MONITOR_BACKED, monitorStatusIsOffline: null },
141
+ NOW,
142
+ ),
143
+ ).toBe("unknown");
144
+ // Not even dark ports promote a Pending device to a verdict.
145
+ expect(
146
+ deviceHealthState(
147
+ { monitoringMethod: MONITOR_BACKED, interfacesDown: 3 },
148
+ NOW,
149
+ ),
150
+ ).toBe("unknown");
151
+ });
152
+ });
153
+
154
+ /*
155
+ * The other direction, and the reason the split exists (issue #3562).
156
+ *
157
+ * A probe-polled switch that answers every ping can carry a stamped Offline
158
+ * status: a Network Device monitor with an "interface down → Offline"
159
+ * criterion stamps one the moment a single port goes dark, and the SNMP
160
+ * walk failing on a credential change does the same. Letting that stamp
161
+ * decide here painted the site card and the topology node RED while the
162
+ * device's own row in the device list — which reads `isReachable` — said Up.
163
+ * These pin the stamp back down to informational for every device the probe
164
+ * polls.
165
+ */
166
+ describe("deviceHealthState — a PROBE-POLLED device is judged by its poll, never by a stamp", () => {
167
+ test.each(PROBE_POLLED_METHODS)(
168
+ "monitoringMethod %p: a stamped Offline does not override an answering poll",
169
+ (monitoringMethod: string | null | undefined) => {
170
+ expect(
171
+ deviceHealthState(
172
+ {
173
+ monitoringMethod: monitoringMethod,
174
+ // An "interface down → Offline" criterion fired.
175
+ monitorStatusIsOffline: true,
176
+ // ...but the device answered its ping one minute ago.
177
+ isReachable: true,
178
+ lastPolledAt: minutesAgo(1),
179
+ lastSeenAt: minutesAgo(1),
180
+ },
181
+ NOW,
182
+ ),
183
+ ).toBe("healthy");
184
+ },
185
+ );
186
+
187
+ test.each(PROBE_POLLED_METHODS)(
188
+ "monitoringMethod %p: a stamped Operational does not rescue a failing poll",
189
+ (monitoringMethod: string | null | undefined) => {
190
+ expect(
191
+ deviceHealthState(
192
+ {
193
+ monitoringMethod: monitoringMethod,
194
+ monitorStatusIsOffline: false,
195
+ isReachable: false,
196
+ lastPolledAt: minutesAgo(1),
197
+ },
198
+ NOW,
199
+ ),
200
+ ).toBe("down");
201
+ },
202
+ );
203
+
204
+ /*
205
+ * The whole point of the split, stated as the invariant an operator sees:
206
+ * the interface-down criterion that stamps a switch Offline must move the
207
+ * device's own dark-port count and nothing else. A site of answering
208
+ * devices stays green with one degraded switch in it, and the map you
209
+ * reach by clicking that card draws the same switch amber rather than red.
210
+ */
211
+ test("an interface-down stamp on an answering switch reads degraded, not down", () => {
212
+ expect(
213
+ deviceHealthState(
214
+ {
215
+ monitoringMethod: NetworkDeviceMonitoringMethod.Probe,
216
+ monitorStatusIsOffline: true,
217
+ isReachable: true,
218
+ lastPolledAt: minutesAgo(1),
219
+ lastSeenAt: minutesAgo(1),
220
+ interfacesDown: 3,
221
+ },
222
+ NOW,
223
+ ),
224
+ ).toBe("degraded");
225
+ });
226
+
227
+ /*
228
+ * A probe-polled device with a failing SNMP walk still answers ping, so
229
+ * `isReachable` is true (reachability is ping OR walk) and the device is
230
+ * up. The walk's own verdict lives in isSnmpReachable and is a separate,
231
+ * explanatory pill — it is not this classifier's input at all, which is
232
+ * why a ping-only device can never be coloured by "SNMP failing".
233
+ */
234
+ test("a failing SNMP walk on a device that answers ping is not a health verdict", () => {
235
+ expect(
236
+ deviceHealthState(
237
+ {
238
+ monitoringMethod: NetworkDeviceMonitoringMethod.Probe,
239
+ // The walk failed, so a Network Device monitor stamped it Offline.
240
+ monitorStatusIsOffline: true,
241
+ // Reachability is ping OR walk, and the ping answered.
242
+ isReachable: true,
243
+ lastPolledAt: minutesAgo(1),
244
+ lastSeenAt: minutesAgo(1),
245
+ },
246
+ NOW,
247
+ ),
248
+ ).toBe("healthy");
249
+ });
250
+
251
+ /*
252
+ * `undefined` means no monitor has stamped this device at all, which is
253
+ * the ordinary case for a probe-polled one. It must not be read as a
254
+ * verdict of any kind — doing so would either paint every switch in the
255
+ * estate down or hide every real outage behind a stamped green.
256
+ */
257
+ test("an absent monitor status leaves the poll in charge, as always", () => {
79
258
  expect(
80
259
  deviceHealthState(
81
260
  {
@@ -109,7 +288,10 @@ describe("deviceHealthState — a monitor's verdict is the system of record", ()
109
288
  * networks, which is precisely what a shared classifier is for.
110
289
  *
111
290
  * NetworkDeviceTopology.ts resolves the ladder with
112
- * `status.isOfflineState ? "down" : "up"`. These pin the same answer here.
291
+ * `status.isOfflineState ? "down" : "up"` and, since ping-first polling,
292
+ * only for a monitor-backed device (it applies the same isMonitorBacked gate
293
+ * this module does). So every device below is monitor-backed: that is the
294
+ * one kind of device on which a rung of the ladder decides anything.
113
295
  */
114
296
  describe("the MonitorStatus ladder — a middle rung is not an outage", () => {
115
297
  type LadderRow = {
@@ -126,7 +308,7 @@ describe("the MonitorStatus ladder — a middle rung is not an outage", () => {
126
308
  { name: "Offline", isOperationalState: false, isOfflineState: true },
127
309
  ];
128
310
 
129
- // Exactly what NetworkDeviceTopology.ts does with a status row.
311
+ // Exactly what NetworkDeviceTopology.ts does with a monitor-backed row.
130
312
  function mapVerdict(row: LadderRow): "up" | "down" {
131
313
  return row.isOfflineState ? "down" : "up";
132
314
  }
@@ -135,7 +317,10 @@ describe("the MonitorStatus ladder — a middle rung is not an outage", () => {
135
317
  "$name: the rollup agrees with the map about up/down",
136
318
  (row: LadderRow) => {
137
319
  const state: NetworkDeviceHealthState = deviceHealthState(
138
- { monitorStatusIsOffline: row.isOfflineState },
320
+ {
321
+ monitoringMethod: MONITOR_BACKED,
322
+ monitorStatusIsOffline: row.isOfflineState,
323
+ },
139
324
  NOW,
140
325
  );
141
326
  const rollupSaysDown: boolean = state === "down";
@@ -144,9 +329,12 @@ describe("the MonitorStatus ladder — a middle rung is not an outage", () => {
144
329
  );
145
330
 
146
331
  test("a Degraded device with no dark ports is healthy, not down", () => {
147
- expect(deviceHealthState({ monitorStatusIsOffline: false }, NOW)).toBe(
148
- "healthy",
149
- );
332
+ expect(
333
+ deviceHealthState(
334
+ { monitoringMethod: MONITOR_BACKED, monitorStatusIsOffline: false },
335
+ NOW,
336
+ ),
337
+ ).toBe("healthy");
150
338
  });
151
339
 
152
340
  /*
@@ -158,7 +346,10 @@ describe("the MonitorStatus ladder — a middle rung is not an outage", () => {
158
346
  const downRungs: Array<string> = LADDER.filter((row: LadderRow) => {
159
347
  return (
160
348
  deviceHealthState(
161
- { monitorStatusIsOffline: row.isOfflineState },
349
+ {
350
+ monitoringMethod: MONITOR_BACKED,
351
+ monitorStatusIsOffline: row.isOfflineState,
352
+ },
162
353
  NOW,
163
354
  ) === "down"
164
355
  );
@@ -167,9 +358,46 @@ describe("the MonitorStatus ladder — a middle rung is not an outage", () => {
167
358
  });
168
359
  expect(downRungs).toEqual(["Offline"]);
169
360
  });
361
+
362
+ /*
363
+ * ...and the same ladder against a PROBE-POLLED device, where no rung of
364
+ * it decides anything. Every one of the four reads by the poll instead, so
365
+ * the switch that answered its ping is healthy on all four rungs —
366
+ * including Offline, which is exactly what an "interface down" criterion
367
+ * stamps on a switch with one dark port.
368
+ */
369
+ test.each(LADDER)(
370
+ "$name: a probe-polled device ignores the rung entirely and reads by its poll",
371
+ (row: LadderRow) => {
372
+ expect(
373
+ deviceHealthState(
374
+ {
375
+ monitoringMethod: NetworkDeviceMonitoringMethod.Probe,
376
+ monitorStatusIsOffline: row.isOfflineState,
377
+ isReachable: true,
378
+ lastPolledAt: minutesAgo(1),
379
+ lastSeenAt: minutesAgo(1),
380
+ },
381
+ NOW,
382
+ ),
383
+ ).toBe("healthy");
384
+
385
+ expect(
386
+ deviceHealthState(
387
+ {
388
+ monitoringMethod: NetworkDeviceMonitoringMethod.Probe,
389
+ monitorStatusIsOffline: row.isOfflineState,
390
+ isReachable: false,
391
+ lastPolledAt: minutesAgo(1),
392
+ },
393
+ NOW,
394
+ ),
395
+ ).toBe("down");
396
+ },
397
+ );
170
398
  });
171
399
 
172
- describe("deviceHealthState — reachability, when nothing is stamped", () => {
400
+ describe("deviceHealthState — the poll rule, which every probe-polled device reads", () => {
173
401
  test("the probe asked and got nothing: down", () => {
174
402
  expect(
175
403
  deviceHealthState(
@@ -224,6 +452,39 @@ describe("deviceHealthState — reachability, when nothing is stamped", () => {
224
452
  "down",
225
453
  );
226
454
  });
455
+
456
+ /*
457
+ * Issue #3562. A monitor-backed device is never polled, so whatever its
458
+ * poll columns hold is either NULL or what a probe last found before it
459
+ * stopped asking — a device switched over to a bound monitor keeps a
460
+ * lastSeenAt from months ago. With nothing stamped yet the only honest
461
+ * answer is "unknown", which is also what the device list says about the
462
+ * same row; letting the legacy freshness branch read that timestamp would
463
+ * put the site card at odds with the pill under it.
464
+ */
465
+ test("a monitor-backed device nothing has reported on is unknown, whatever its leftover poll columns say", () => {
466
+ const leftovers: DeviceHealthStateInput = {
467
+ isReachable: null,
468
+ lastSeenAt: minutesAgo(60 * 24 * 30),
469
+ pollingIntervalInMinutes: 5,
470
+ };
471
+
472
+ // The legacy branch, for a device that IS polled: staleness decides.
473
+ expect(deviceHealthState(leftovers, NOW)).toBe("down");
474
+ expect(
475
+ deviceHealthState(
476
+ { ...leftovers, monitoringMethod: MONITOR_BACKED },
477
+ NOW,
478
+ ),
479
+ ).toBe("unknown");
480
+ // ...and a mirrored outcome without a stamp is not a verdict either.
481
+ expect(
482
+ deviceHealthState(
483
+ { ...leftovers, isReachable: true, monitoringMethod: MONITOR_BACKED },
484
+ NOW,
485
+ ),
486
+ ).toBe("unknown");
487
+ });
227
488
  });
228
489
 
229
490
  describe("deviceHealthState — degraded", () => {
@@ -860,3 +860,180 @@ describe("which rows count as monitor-backed", () => {
860
860
  expect(result.isMonitorBacked).toBe(false);
861
861
  });
862
862
  });
863
+
864
+ /*
865
+ * The QUALIFIER inputs (issue #3562, ping-first polling).
866
+ *
867
+ * Every probe-polled device is PINGED on its schedule and additionally
868
+ * WALKED over SNMP only when credentials resolve for it, so `isReachable` is
869
+ * "the ping answered OR the walk succeeded" and the walk's own verdict lives
870
+ * separately in `isSnmpReachable` — NULL when no walk was attempted, which is
871
+ * every ping-only device forever. `probeId` and `isPollingEnabled` say
872
+ * whether the device can be polled at all.
873
+ *
874
+ * All four ride on this input so a surface can hand its whole row over once
875
+ * and put a second, explanatory pill ("SNMP failing", "No probe") beside the
876
+ * verdict. NONE of them moves the verdict, and that is load-bearing rather
877
+ * than incidental: the pill, the summary tiles and the Status filter are all
878
+ * SQL over `isReachable` alone, so a verdict that consulted a fifth column
879
+ * could not be counted or filtered by the list that renders it. Wire
880
+ * `isSnmpReachable` in here and a ping-only device — NULL walk, answering
881
+ * ping — starts reading Down or Pending on the map and the site card while
882
+ * its own row says Up.
883
+ */
884
+ describe("the qualifier columns ride along without moving the verdict", () => {
885
+ // The verdict-deciding columns, held fixed while the qualifiers vary.
886
+ const ANSWERING: DeviceReachabilityInput = {
887
+ isReachable: true,
888
+ lastPolledAt: minutesAgo(1),
889
+ lastSeenAt: minutesAgo(1),
890
+ pollingIntervalInMinutes: 5,
891
+ };
892
+
893
+ const NOT_ANSWERING: DeviceReachabilityInput = {
894
+ isReachable: false,
895
+ lastPolledAt: minutesAgo(1),
896
+ lastSeenAt: minutesAgo(60),
897
+ pollingIntervalInMinutes: 5,
898
+ };
899
+
900
+ /*
901
+ * The three states of the walk: it succeeded, it failed, or no walk was
902
+ * attempted at all (a ping-only device — no usable credentials).
903
+ */
904
+ const WALK_OUTCOMES: Array<[string, boolean | null]> = [
905
+ ["a successful walk", true],
906
+ ["a failed walk", false],
907
+ ["no walk at all (ping-only)", null],
908
+ ];
909
+
910
+ test.each(WALK_OUTCOMES)(
911
+ "%s leaves an answering device Up",
912
+ (_label: string, isSnmpReachable: boolean | null) => {
913
+ expect(
914
+ statusOf({
915
+ ...ANSWERING,
916
+ isSnmpReachable: isSnmpReachable,
917
+ lastSnmpSeenAt: isSnmpReachable === true ? minutesAgo(1) : null,
918
+ }),
919
+ ).toBe(NetworkDeviceReachability.Up);
920
+ },
921
+ );
922
+
923
+ test.each(WALK_OUTCOMES)(
924
+ "%s leaves a device that answered nothing Down",
925
+ (_label: string, isSnmpReachable: boolean | null) => {
926
+ expect(
927
+ statusOf({
928
+ ...NOT_ANSWERING,
929
+ isSnmpReachable: isSnmpReachable,
930
+ }),
931
+ ).toBe(NetworkDeviceReachability.Down);
932
+ },
933
+ );
934
+
935
+ /*
936
+ * The exact row the split exists for: a switch whose SNMP credentials were
937
+ * rotated. The walk fails every cycle, the ping answers every cycle, and
938
+ * `isReachable` records the OR — so the device is Up and the failing walk
939
+ * is somebody else's pill to render.
940
+ */
941
+ test("a failing walk on a device that still answers ping is Up, not Down", () => {
942
+ expect(
943
+ statusOf({
944
+ isReachable: true,
945
+ isSnmpReachable: false,
946
+ lastPolledAt: minutesAgo(1),
947
+ lastSeenAt: minutesAgo(1),
948
+ lastSnmpSeenAt: minutesAgo(60 * 24 * 7),
949
+ pollingIntervalInMinutes: 5,
950
+ }),
951
+ ).toBe(NetworkDeviceReachability.Up);
952
+ });
953
+
954
+ /*
955
+ * ...and a ping-only device is never "SNMP failing": its walk verdict is
956
+ * NULL because no walk was attempted, which must read no differently from
957
+ * a device whose walk succeeded.
958
+ */
959
+ test("a ping-only device (NULL walk verdict) reads exactly as a walked one", () => {
960
+ const pingOnly: NetworkDeviceReachability = statusOf({
961
+ ...ANSWERING,
962
+ isSnmpReachable: null,
963
+ lastSnmpSeenAt: null,
964
+ });
965
+ const walked: NetworkDeviceReachability = statusOf({
966
+ ...ANSWERING,
967
+ isSnmpReachable: true,
968
+ lastSnmpSeenAt: minutesAgo(1),
969
+ });
970
+
971
+ expect(pingOnly).toBe(walked);
972
+ expect(pingOnly).toBe(NetworkDeviceReachability.Up);
973
+ });
974
+
975
+ /*
976
+ * A device with no probe, or with polling switched off, cannot be polled —
977
+ * but neither fact is a verdict about the device. Whatever its last poll
978
+ * said still stands until something contradicts it, and a device with no
979
+ * poll on record stays Pending. Turning either into Down would paint a
980
+ * whole fleet red the moment somebody paused polling for a maintenance
981
+ * window.
982
+ */
983
+ test("no probe and polling switched off qualify the verdict, they do not set it", () => {
984
+ for (const probeId of [null, undefined, "probe-1"]) {
985
+ for (const isPollingEnabled of [true, false, null, undefined]) {
986
+ expect(
987
+ statusOf({
988
+ ...ANSWERING,
989
+ probeId: probeId,
990
+ isPollingEnabled: isPollingEnabled,
991
+ }),
992
+ ).toBe(NetworkDeviceReachability.Up);
993
+ expect(
994
+ statusOf({
995
+ ...NOT_ANSWERING,
996
+ probeId: probeId,
997
+ isPollingEnabled: isPollingEnabled,
998
+ }),
999
+ ).toBe(NetworkDeviceReachability.Down);
1000
+ // Nothing polled yet: still Pending, not Down.
1001
+ expect(
1002
+ statusOf({
1003
+ probeId: probeId,
1004
+ isPollingEnabled: isPollingEnabled,
1005
+ }),
1006
+ ).toBe(NetworkDeviceReachability.Pending);
1007
+ }
1008
+ }
1009
+ });
1010
+
1011
+ /*
1012
+ * And the whole set at once, stated as the invariant rather than case by
1013
+ * case: for fixed verdict columns, no combination of the four qualifiers
1014
+ * changes the answer.
1015
+ */
1016
+ test("no combination of the four qualifiers changes the verdict", () => {
1017
+ for (const base of [ANSWERING, NOT_ANSWERING]) {
1018
+ const expected: NetworkDeviceReachability = statusOf(base);
1019
+
1020
+ for (const isSnmpReachable of [true, false, null, undefined]) {
1021
+ for (const lastSnmpSeenAt of [minutesAgo(1), minutesAgo(99999), null]) {
1022
+ for (const probeId of [null, "probe-1"]) {
1023
+ for (const isPollingEnabled of [true, false]) {
1024
+ expect(
1025
+ statusOf({
1026
+ ...base,
1027
+ isSnmpReachable: isSnmpReachable,
1028
+ lastSnmpSeenAt: lastSnmpSeenAt,
1029
+ probeId: probeId,
1030
+ isPollingEnabled: isPollingEnabled,
1031
+ }),
1032
+ ).toBe(expected);
1033
+ }
1034
+ }
1035
+ }
1036
+ }
1037
+ }
1038
+ });
1039
+ });