@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,268 @@
1
+ import { describe, expect, test } from "@jest/globals";
2
+ import NetworkDevice from "../../../Models/DatabaseModels/NetworkDevice";
3
+ import NetworkSnmpCredentialProfile from "../../../Models/DatabaseModels/NetworkSnmpCredentialProfile";
4
+ import {
5
+ SnmpCredentialCarrier,
6
+ hasUsableCredentials,
7
+ } from "../../../Utils/NetworkDevice/SnmpCredentialUtil";
8
+
9
+ /*
10
+ * hasUsableCredentials is the predicate behind the poller's resolution order:
11
+ * device columns, then the device's profile, then the site's profile, first
12
+ * usable set wins, and with none the device is only pinged. It cannot throw
13
+ * and it cannot look broken - a wrong answer just quietly leaves a device
14
+ * un-walked, or walks it with a set that will never authenticate - so the
15
+ * whole matrix is pinned here: every spelling of every version, crossed with
16
+ * every way a credential can be missing.
17
+ */
18
+
19
+ const EMPTY_VALUES: ReadonlyArray<string | null | undefined> = [
20
+ undefined,
21
+ null,
22
+ "",
23
+ " ",
24
+ " ",
25
+ "\t",
26
+ "\n",
27
+ ];
28
+
29
+ /*
30
+ * The stored spelling ("V2c"), the probe-contract spelling ("2c"), and the
31
+ * case drift a hand-written row produces. SnmpVersionUtil.parse accepts all
32
+ * of them, and this util must agree with parse rather than compare raw text.
33
+ */
34
+ const V1_SPELLINGS: ReadonlyArray<string> = ["V1", "v1", "1"];
35
+ const V2C_SPELLINGS: ReadonlyArray<string> = ["V2c", "v2c", "V2C", "2c", "2C"];
36
+ const V3_SPELLINGS: ReadonlyArray<string> = ["V3", "v3", "3"];
37
+
38
+ describe("hasUsableCredentials - v1 and v2c need a community string", () => {
39
+ test.each([...V1_SPELLINGS, ...V2C_SPELLINGS])(
40
+ "version %p with a community string is usable",
41
+ (version: string) => {
42
+ expect(
43
+ hasUsableCredentials({
44
+ snmpVersion: version,
45
+ snmpCommunityString: "public",
46
+ }),
47
+ ).toBe(true);
48
+ },
49
+ );
50
+
51
+ test.each([...V1_SPELLINGS, ...V2C_SPELLINGS])(
52
+ "version %p with a whitespace-padded community string is still usable",
53
+ (version: string) => {
54
+ expect(
55
+ hasUsableCredentials({
56
+ snmpVersion: version,
57
+ snmpCommunityString: " public ",
58
+ }),
59
+ ).toBe(true);
60
+ },
61
+ );
62
+
63
+ const missingCommunity: Array<[string, string | null | undefined]> = [];
64
+ for (const version of [...V1_SPELLINGS, ...V2C_SPELLINGS]) {
65
+ for (const empty of EMPTY_VALUES) {
66
+ missingCommunity.push([version, empty]);
67
+ }
68
+ }
69
+
70
+ test.each(missingCommunity)(
71
+ "version %p with community string %p is not usable",
72
+ (version: string, community: string | null | undefined) => {
73
+ expect(
74
+ hasUsableCredentials({
75
+ snmpVersion: version,
76
+ snmpCommunityString: community,
77
+ }),
78
+ ).toBe(false);
79
+ },
80
+ );
81
+
82
+ /*
83
+ * A v3 username on a v2c row is a leftover from switching the version in a
84
+ * form, not a credential v2c can send. It must not rescue the row.
85
+ */
86
+ test.each([...V1_SPELLINGS, ...V2C_SPELLINGS])(
87
+ "version %p is not rescued by a v3 username",
88
+ (version: string) => {
89
+ expect(
90
+ hasUsableCredentials({
91
+ snmpVersion: version,
92
+ snmpCommunityString: "",
93
+ snmpV3Username: "monitoring",
94
+ }),
95
+ ).toBe(false);
96
+ },
97
+ );
98
+ });
99
+
100
+ describe("hasUsableCredentials - v3 needs a security name", () => {
101
+ test.each(V3_SPELLINGS)(
102
+ "version %p with a username is usable",
103
+ (version: string) => {
104
+ expect(
105
+ hasUsableCredentials({
106
+ snmpVersion: version,
107
+ snmpV3Username: "monitoring",
108
+ }),
109
+ ).toBe(true);
110
+ },
111
+ );
112
+
113
+ /*
114
+ * Auth and privacy keys are legitimately absent at noAuthNoPriv, so the
115
+ * predicate reads neither: a v3 row is usable on its username alone. A key
116
+ * that is missing at a higher security level is the device's error to
117
+ * report, not this function's to predict.
118
+ */
119
+ test.each(V3_SPELLINGS)(
120
+ "version %p is usable on the username alone, with no keys at all",
121
+ (version: string) => {
122
+ const carrier: SnmpCredentialCarrier & {
123
+ snmpV3AuthKey?: string | undefined;
124
+ snmpV3PrivKey?: string | undefined;
125
+ } = {
126
+ snmpVersion: version,
127
+ snmpV3Username: "monitoring",
128
+ snmpV3AuthKey: undefined,
129
+ snmpV3PrivKey: undefined,
130
+ };
131
+
132
+ expect(hasUsableCredentials(carrier)).toBe(true);
133
+ },
134
+ );
135
+
136
+ const missingUsername: Array<[string, string | null | undefined]> = [];
137
+ for (const version of V3_SPELLINGS) {
138
+ for (const empty of EMPTY_VALUES) {
139
+ missingUsername.push([version, empty]);
140
+ }
141
+ }
142
+
143
+ test.each(missingUsername)(
144
+ "version %p with username %p is not usable",
145
+ (version: string, username: string | null | undefined) => {
146
+ expect(
147
+ hasUsableCredentials({
148
+ snmpVersion: version,
149
+ snmpV3Username: username,
150
+ }),
151
+ ).toBe(false);
152
+ },
153
+ );
154
+
155
+ /*
156
+ * The mirror of the v2c case above. A community string on a v3 row is what
157
+ * a device that was upgraded from v2c still carries; v3 cannot send it, so
158
+ * it must not make the row usable.
159
+ */
160
+ test.each(V3_SPELLINGS)(
161
+ "version %p is not rescued by a community string",
162
+ (version: string) => {
163
+ expect(
164
+ hasUsableCredentials({
165
+ snmpVersion: version,
166
+ snmpCommunityString: "public",
167
+ snmpV3Username: "",
168
+ }),
169
+ ).toBe(false);
170
+ },
171
+ );
172
+ });
173
+
174
+ describe("hasUsableCredentials - a missing or unrecognised version reads as v2c", () => {
175
+ /*
176
+ * The column default on both the device and the profile is "V2c", and
177
+ * SnmpVersionUtil.parse falls back to v2c for anything it does not
178
+ * recognise. A row with a community string and no version is therefore
179
+ * polled as v2c, and this predicate has to say so, or a freshly created
180
+ * profile that never had its version touched would count as unusable.
181
+ */
182
+ test.each([undefined, null, "", " ", "V4", "snmp", "2"])(
183
+ "version %p with a community string is usable, as v2c",
184
+ (version: string | null | undefined) => {
185
+ expect(
186
+ hasUsableCredentials({
187
+ snmpVersion: version,
188
+ snmpCommunityString: "public",
189
+ }),
190
+ ).toBe(true);
191
+ },
192
+ );
193
+
194
+ test.each([undefined, null, "", "V4"])(
195
+ "version %p with only a v3 username is not usable, because it is not v3",
196
+ (version: string | null | undefined) => {
197
+ expect(
198
+ hasUsableCredentials({
199
+ snmpVersion: version,
200
+ snmpV3Username: "monitoring",
201
+ }),
202
+ ).toBe(false);
203
+ },
204
+ );
205
+
206
+ test("an empty object is not usable", () => {
207
+ expect(hasUsableCredentials({})).toBe(false);
208
+ });
209
+ });
210
+
211
+ describe("hasUsableCredentials - accepts any row carrying the three fields", () => {
212
+ /*
213
+ * The resolution order asks this question of a NetworkDevice and then of a
214
+ * NetworkSnmpCredentialProfile, so both model classes have to be
215
+ * assignable to the parameter without a cast. These are compile-time
216
+ * assertions as much as runtime ones: if either model renames one of the
217
+ * three columns, ts-jest refuses to compile this file.
218
+ */
219
+ test("a NetworkDevice row is accepted as-is", () => {
220
+ const device: NetworkDevice = new NetworkDevice();
221
+ device.snmpVersion = "V2c";
222
+ device.snmpCommunityString = "public";
223
+
224
+ expect(hasUsableCredentials(device)).toBe(true);
225
+
226
+ device.snmpCommunityString = "";
227
+
228
+ expect(hasUsableCredentials(device)).toBe(false);
229
+ });
230
+
231
+ test("a NetworkSnmpCredentialProfile row is accepted as-is", () => {
232
+ const profile: NetworkSnmpCredentialProfile =
233
+ new NetworkSnmpCredentialProfile();
234
+ profile.snmpVersion = "V3";
235
+ profile.snmpV3Username = "monitoring";
236
+
237
+ expect(hasUsableCredentials(profile)).toBe(true);
238
+
239
+ profile.snmpV3Username = "";
240
+
241
+ expect(hasUsableCredentials(profile)).toBe(false);
242
+ });
243
+
244
+ /*
245
+ * A freshly constructed model has every column undefined. That is the
246
+ * state of a device registered with nothing but an address - the exact
247
+ * case profiles exist for - and it must read as "ping only".
248
+ */
249
+ test("a bare model with nothing set is not usable", () => {
250
+ expect(hasUsableCredentials(new NetworkDevice())).toBe(false);
251
+ expect(hasUsableCredentials(new NetworkSnmpCredentialProfile())).toBe(
252
+ false,
253
+ );
254
+ });
255
+
256
+ test("it never mutates the row it is asked about", () => {
257
+ const carrier: SnmpCredentialCarrier = {
258
+ snmpVersion: " v3 ",
259
+ snmpCommunityString: " public ",
260
+ snmpV3Username: " monitoring ",
261
+ };
262
+ const snapshot: SnmpCredentialCarrier = { ...carrier };
263
+
264
+ hasUsableCredentials(carrier);
265
+
266
+ expect(carrier).toEqual(snapshot);
267
+ });
268
+ });
@@ -380,12 +380,19 @@ describe("AutoImportRuleMatcher.ruleMatchesHost", () => {
380
380
  });
381
381
  });
382
382
 
383
+ /*
384
+ * The gate asks what the host ANSWERED, not how it would be monitored.
385
+ *
386
+ * Under ping-first polling (issue #3562) every discovered host imports as a
387
+ * probe-polled device — a ping-only host is a first-class device now, not a
388
+ * monitor-backed stub. So `monitoringMethodForDiscoveredHost` is a constant
389
+ * and cannot express this question; only `isPingOnlyDiscoveredHost` can.
390
+ * The gate itself is unchanged and still default-closed: an SNMP credential
391
+ * typo makes a whole subnet report as ping-only, and a rule silently
392
+ * importing hundreds of half-identified hosts on that typo is the failure
393
+ * mode it exists to prevent.
394
+ */
383
395
  describe("the ping-only gate", () => {
384
- /*
385
- * An SNMP credential typo makes a whole subnet report as ping-only; a
386
- * rule silently importing hundreds of half-identified hosts on that typo
387
- * is the failure mode the default-closed gate exists to prevent.
388
- */
389
396
  it("does not let an import rule claim a ping-only host by default", () => {
390
397
  expect(
391
398
  AutoImportRuleMatcher.ruleMatchesHost(
@@ -395,6 +402,49 @@ describe("AutoImportRuleMatcher.ruleMatchesHost", () => {
395
402
  ).toBe(false);
396
403
  });
397
404
 
405
+ /*
406
+ * The regression, stated as the fact it depends on. The gate briefly ran
407
+ * off the imported monitoring method, which now answers Probe for every
408
+ * host — so it never fired at all and the default-closed gate was open
409
+ * for the whole fleet. This pins it to the host's own SNMP answer: two
410
+ * hosts identical in every field the rule matches on, differing only in
411
+ * `snmpReachable`, must be claimed differently.
412
+ */
413
+ it("keys on the host's SNMP answer, not on the method it would import under", () => {
414
+ const rule: AutoImportRuleCandidate = { ipMatchTarget: "10.0.0.0/24" };
415
+
416
+ expect(
417
+ AutoImportRuleMatcher.ruleMatchesHost(
418
+ rule,
419
+ host({ snmpReachable: true }),
420
+ ),
421
+ ).toBe(true);
422
+ expect(
423
+ AutoImportRuleMatcher.ruleMatchesHost(
424
+ rule,
425
+ host({ snmpReachable: false }),
426
+ ),
427
+ ).toBe(false);
428
+ });
429
+
430
+ /*
431
+ * And through the whole rule set, which is the surface the engine and the
432
+ * dry-run dialog actually call: a ping-only host does not import at all
433
+ * on a rule that never opted in.
434
+ */
435
+ it("leaves a ping-only host unimported by an evaluation that did not opt in", () => {
436
+ const evaluation: AutoImportHostEvaluation =
437
+ AutoImportRuleMatcher.evaluateHost(
438
+ [{ ipMatchTarget: "10.0.0.0/24" }],
439
+ host({ snmpReachable: false }),
440
+ );
441
+
442
+ expect(evaluation.shouldImport).toBe(false);
443
+ expect(evaluation.matchedRules).toEqual([]);
444
+ // Not a veto — nothing claimed it, which reads differently in a dry run.
445
+ expect(evaluation.excludedByRule).toBeUndefined();
446
+ });
447
+
398
448
  it("lets an import rule claim a ping-only host after the explicit opt-in", () => {
399
449
  expect(
400
450
  AutoImportRuleMatcher.ruleMatchesHost(
@@ -203,8 +203,10 @@ describe("buildNetworkDeviceFromDiscoveredHost - vendor template auto-apply flag
203
203
  });
204
204
 
205
205
  /*
206
- * A ping-only host is never SNMP-polled, so no poll can ever fingerprint
207
- * its vendor — the flag would be a dead toggle that reads as a promise.
206
+ * A ping-only host imports with no credentials, so no poll fingerprints
207
+ * its vendor until an operator adds some — the flag would be a dead toggle
208
+ * that reads as a promise. The device is still the scan's probe's to ping;
209
+ * what it lacks is the SNMP data the template auto-apply keys off.
208
210
  */
209
211
  it("stays off on a ping-only host even when requested", () => {
210
212
  const device: NetworkDevice = buildNetworkDeviceFromDiscoveredHost({
@@ -227,7 +229,7 @@ describe("buildNetworkDeviceFromDiscoveredHost - SNMP host", () => {
227
229
  // The address is both the hostname and the registered-host dedup key.
228
230
  expect(device.hostname).toBe("10.0.0.5");
229
231
  expect(device.description).toBe("Cisco IOS Software, C2960X");
230
- expect(device.monitoringMethod).toBe(NetworkDeviceMonitoringMethod.Snmp);
232
+ expect(device.monitoringMethod).toBe(NetworkDeviceMonitoringMethod.Probe);
231
233
  });
232
234
 
233
235
  /*
@@ -411,19 +413,25 @@ describe("buildNetworkDeviceFromDiscoveredHost - a scan with several SNMP config
411
413
 
412
414
  describe("buildNetworkDeviceFromDiscoveredHost - ping-only host", () => {
413
415
  /*
414
- * A ping-only host becomes a monitor-backed device: recorded so it can
415
- * belong to a site and appear on the topology map, with binding a monitor
416
- * to it a separate deliberate step. Credentials it never answered to must
417
- * not ride along.
416
+ * A ping-only host becomes a Probe device the scan's probe pings: it has
417
+ * a status from its first poll, belongs to a site, appears on the topology
418
+ * map, and gets walked the day an operator adds credentials. Credentials
419
+ * it never answered to must not ride along.
420
+ *
421
+ * (It used to become a monitor-backed device with no probe and polling
422
+ * off, and sat on "Pending" until a Ping monitor was hand-bound — issue
423
+ * #3447. The three assertions that changed here are the ones that end
424
+ * that: Probe, the scan's probe, polling on.)
418
425
  */
419
- it("builds a monitor-backed device with polling off and no credentials", () => {
426
+ it("builds a Probe device on the scan's probe with polling on and no credentials", () => {
420
427
  const device: NetworkDevice = build({
421
428
  host: snmpHost({ snmpReachable: false, sysName: undefined }),
422
429
  });
423
430
 
424
- expect(device.monitoringMethod).toBe(NetworkDeviceMonitoringMethod.Monitor);
425
- expect(device.isPollingEnabled).toBe(false);
426
- expect(device.probeId).toBeUndefined();
431
+ expect(device.monitoringMethod).toBe(NetworkDeviceMonitoringMethod.Probe);
432
+ expect(device.isPollingEnabled).toBe(true);
433
+ expect(device.probeId).toBeInstanceOf(ObjectID);
434
+ expect(device.probeId?.toString()).toBe(PROBE_ID.toString());
427
435
  expect(device.snmpVersion).toBeUndefined();
428
436
  expect(device.snmpCommunityString).toBeUndefined();
429
437
  expect(device.snmpPort).toBeUndefined();
@@ -443,7 +451,7 @@ describe("buildNetworkDeviceFromDiscoveredHost - ping-only host", () => {
443
451
  * the same probe-written jsonb row, and nothing in the database enforces
444
452
  * that a ping-only row leaves the first one unset — an older result, a
445
453
  * partially-rewritten row, or a probe bug is enough. The builder must decide
446
- * on the monitoring method and return BEFORE it ever looks a config up, so
454
+ * that the host is ping-only and return BEFORE it ever looks a config up, so
447
455
  * that a stray id can never conjure credentials onto a device that answered
448
456
  * nothing but a ping.
449
457
  */
@@ -456,14 +464,84 @@ describe("buildNetworkDeviceFromDiscoveredHost - ping-only host", () => {
456
464
  scan: multiConfigScanSource(),
457
465
  });
458
466
 
459
- expect(device.monitoringMethod).toBe(NetworkDeviceMonitoringMethod.Monitor);
460
- expect(device.isPollingEnabled).toBe(false);
461
- expect(device.probeId).toBeUndefined();
467
+ expect(device.monitoringMethod).toBe(NetworkDeviceMonitoringMethod.Probe);
468
+ expect(device.isPollingEnabled).toBe(true);
469
+ expect(device.probeId?.toString()).toBe(PROBE_ID.toString());
462
470
  expect(device.snmpVersion).toBeUndefined();
463
471
  expect(device.snmpCommunityString).toBeUndefined();
464
472
  expect(device.snmpPort).toBeUndefined();
465
473
  expectNoV3Credentials(device);
466
474
  });
475
+
476
+ /*
477
+ * The OID template an auto-import rule links is SNMP data the host did not
478
+ * supply; attaching it would promise a collection that cannot start until
479
+ * credentials exist. Kept off, like the vendor-template flag above.
480
+ */
481
+ it("does not attach the rule's OID template to a ping-only host", () => {
482
+ const device: NetworkDevice = buildNetworkDeviceFromDiscoveredHost({
483
+ projectId: PROJECT_ID,
484
+ host: snmpHost({ snmpReachable: false }),
485
+ scan: fullScanSource(),
486
+ oidTemplateId: new ObjectID("44444444-4444-4444-8444-444444444444"),
487
+ });
488
+
489
+ expect(device.oidTemplateId).toBeUndefined();
490
+ });
491
+
492
+ /*
493
+ * A scan with no probe at all — an API-written row, or a scan whose probe
494
+ * was deleted between the sweep and the import. The device is still a
495
+ * Probe device with polling on; it simply has no probe to be claimed by
496
+ * until one is assigned, which the Settings form requires. Nothing here
497
+ * may throw or silently fall back to Monitor.
498
+ */
499
+ it("still builds a Probe device with polling on when the scan names no probe", () => {
500
+ const device: NetworkDevice = build({
501
+ host: snmpHost({ snmpReachable: false }),
502
+ scan: { ...fullScanSource(), probeId: undefined },
503
+ });
504
+
505
+ expect(device.monitoringMethod).toBe(NetworkDeviceMonitoringMethod.Probe);
506
+ expect(device.isPollingEnabled).toBe(true);
507
+ expect(device.probeId).toBeUndefined();
508
+ });
509
+ });
510
+
511
+ describe("buildNetworkDeviceFromDiscoveredHost - both kinds of host share the recipe", () => {
512
+ /*
513
+ * The point of ping-first polling from the import side: the ONLY thing
514
+ * that differs between an SNMP host and a ping-only one is the credentials.
515
+ * Method, probe and polling are identical, so an edit that reintroduced a
516
+ * "ping-only hosts are different" branch on any of the three fails here.
517
+ */
518
+ it("differ only in the credentials they carry", () => {
519
+ const snmpDevice: NetworkDevice = build({
520
+ host: snmpHost({ snmpReachable: true }),
521
+ });
522
+ const pingOnlyDevice: NetworkDevice = build({
523
+ host: snmpHost({ snmpReachable: false }),
524
+ });
525
+
526
+ expect(pingOnlyDevice.monitoringMethod).toBe(snmpDevice.monitoringMethod);
527
+ expect(pingOnlyDevice.isPollingEnabled).toBe(snmpDevice.isPollingEnabled);
528
+ expect(pingOnlyDevice.probeId?.toString()).toBe(
529
+ snmpDevice.probeId?.toString(),
530
+ );
531
+
532
+ // Anti-vacuity: the SNMP device really does carry what the other lacks.
533
+ expect(snmpDevice.snmpCommunityString).toBe("public");
534
+ expect(pingOnlyDevice.snmpCommunityString).toBeUndefined();
535
+ });
536
+
537
+ it("writes polling on explicitly rather than leaving it to the column", () => {
538
+ for (const snmpReachable of [true, false, undefined]) {
539
+ expect(
540
+ build({ host: snmpHost({ snmpReachable: snmpReachable }) })
541
+ .isPollingEnabled,
542
+ ).toBe(true);
543
+ }
544
+ });
467
545
  });
468
546
 
469
547
  describe("buildDeviceName", () => {
@@ -848,10 +926,10 @@ describe("the reverse-DNS name (issue #3529)", () => {
848
926
  expect(device.name).toBe("core-gw.corp.example.com");
849
927
  });
850
928
 
851
- test("a ping-only host still imports as a monitor-backed device", () => {
929
+ test("a ping-only host still imports as a credential-less Probe device", () => {
852
930
  /*
853
931
  * Naming must not change WHAT a host imports as. A PTR record says
854
- * nothing about whether the device can be SNMP-polled.
932
+ * nothing about whether the device answered SNMP.
855
933
  */
856
934
  const device: NetworkDevice = buildNetworkDeviceFromDiscoveredHost({
857
935
  projectId: PROJECT_ID,
@@ -864,10 +942,9 @@ describe("the reverse-DNS name (issue #3529)", () => {
864
942
  });
865
943
 
866
944
  expect(device.name).toBe("cam-lobby.corp.example.com");
867
- expect(device.monitoringMethod).toBe(
868
- NetworkDeviceMonitoringMethod.Monitor,
869
- );
870
- expect(device.isPollingEnabled).toBe(false);
945
+ expect(device.monitoringMethod).toBe(NetworkDeviceMonitoringMethod.Probe);
946
+ expect(device.isPollingEnabled).toBe(true);
947
+ expect(device.probeId?.toString()).toBe(PROBE_ID.toString());
871
948
  expect(device.snmpCommunityString).toBeUndefined();
872
949
  });
873
950
 
@@ -1,5 +1,6 @@
1
1
  import {
2
2
  isImportableDiscoveredHost,
3
+ isPingOnlyDiscoveredHost,
3
4
  monitoringMethodForDiscoveredHost,
4
5
  } from "../../../Utils/NetworkDiscovery/DiscoveryImportEligibility";
5
6
  import NetworkDeviceMonitoringMethod from "../../../Types/NetworkDevice/NetworkDeviceMonitoringMethod";
@@ -7,16 +8,23 @@ import type { DiscoveredNetworkDevice } from "../../../Models/DatabaseModels/Net
7
8
  import { describe, expect, test } from "@jest/globals";
8
9
 
9
10
  /*
10
- * monitoringMethodForDiscoveredHost is the single decision, shared by the
11
- * dashboard's Review dialog and the server-side auto-import rule engine, for
12
- * HOW a discovered host imports. The two must never disagree: the group a
13
- * host is shown under and the method a rule imports it with are the same call.
11
+ * The two decisions, shared by the dashboard's Review dialog and the
12
+ * server-side auto-import rule engine, for HOW a discovered host imports.
13
+ * The two must never disagree: the group a host is shown under and the
14
+ * device a rule imports it as are the same call.
14
15
  *
15
- * The one subtlety it guards (issue #3023 / legacy scans): only an EXPLICIT
16
- * snmpReachable === false is ping-only. undefined means a legacy scan row from
17
- * before the field existed, where every host answered SNMP, so it must read as
18
- * SNMP — not Monitor. And a nullish host must not throw, because a single junk
19
- * element in the jsonb array used to take the whole page down from a table cell.
16
+ * Under ping-first polling every host imports as a Probe device the scan's
17
+ * probe pings it, and walks it over SNMP when it has credentials — so
18
+ * `monitoringMethodForDiscoveredHost` has one answer for every input, and the
19
+ * host-level question that still matters is `isPingOnlyDiscoveredHost`:
20
+ * whether the host carries the scan's credentials or none.
21
+ *
22
+ * The one subtlety that predicate guards (issue #3023 / legacy scans): only an
23
+ * EXPLICIT snmpReachable === false is ping-only. undefined means a legacy scan
24
+ * row from before the field existed, where every host answered SNMP, so it
25
+ * must read as an SNMP host. And a nullish host must not throw, because a
26
+ * single junk element in the jsonb array used to take the whole page down from
27
+ * a table cell.
20
28
  */
21
29
 
22
30
  function host(
@@ -26,38 +34,108 @@ function host(
26
34
  }
27
35
 
28
36
  describe("monitoringMethodForDiscoveredHost", () => {
29
- test("an explicit snmpReachable === false is a monitor-backed device", () => {
37
+ /*
38
+ * Ping-only hosts used to import as monitor-backed devices with no probe
39
+ * and polling off, and sat on "Pending" until an operator hand-bound a
40
+ * Ping monitor (issue #3447). Reachability is a built-in capability of
41
+ * every probe-polled device now, so the host the probe just pinged is a
42
+ * Probe device like any other.
43
+ */
44
+ test("an explicit snmpReachable === false is a Probe device, not a monitor-backed one", () => {
30
45
  expect(
31
46
  monitoringMethodForDiscoveredHost(host({ snmpReachable: false })),
32
- ).toBe(NetworkDeviceMonitoringMethod.Monitor);
47
+ ).toBe(NetworkDeviceMonitoringMethod.Probe);
33
48
  });
34
49
 
35
- test("snmpReachable === true is an SNMP device", () => {
50
+ test("snmpReachable === true is a Probe device", () => {
36
51
  expect(
37
52
  monitoringMethodForDiscoveredHost(host({ snmpReachable: true })),
38
- ).toBe(NetworkDeviceMonitoringMethod.Snmp);
53
+ ).toBe(NetworkDeviceMonitoringMethod.Probe);
39
54
  });
40
55
 
41
- test("undefined snmpReachable (legacy scan) reads as SNMP, not Monitor", () => {
56
+ test("undefined snmpReachable (legacy scan) is a Probe device", () => {
42
57
  expect(monitoringMethodForDiscoveredHost(host({}))).toBe(
43
- NetworkDeviceMonitoringMethod.Snmp,
58
+ NetworkDeviceMonitoringMethod.Probe,
44
59
  );
45
60
  expect(
46
61
  monitoringMethodForDiscoveredHost(host({ snmpReachable: undefined })),
47
- ).toBe(NetworkDeviceMonitoringMethod.Snmp);
62
+ ).toBe(NetworkDeviceMonitoringMethod.Probe);
48
63
  });
49
64
 
50
- test("a null host reads as SNMP rather than throwing", () => {
65
+ test("a null host reads as Probe rather than throwing", () => {
51
66
  expect(monitoringMethodForDiscoveredHost(null)).toBe(
52
- NetworkDeviceMonitoringMethod.Snmp,
67
+ NetworkDeviceMonitoringMethod.Probe,
53
68
  );
54
69
  });
55
70
 
56
- test("an undefined host reads as SNMP rather than throwing", () => {
71
+ test("an undefined host reads as Probe rather than throwing", () => {
57
72
  expect(monitoringMethodForDiscoveredHost(undefined)).toBe(
58
- NetworkDeviceMonitoringMethod.Snmp,
73
+ NetworkDeviceMonitoringMethod.Probe,
59
74
  );
60
75
  });
76
+
77
+ /*
78
+ * Discovery never has grounds to choose the Monitor override: every host it
79
+ * offers was reached by the probe that found it. Stated as a sweep over
80
+ * every shape the field can take, so a future "return Monitor when X"
81
+ * cannot creep back in on one branch.
82
+ */
83
+ test("never answers Monitor, whatever the host looks like", () => {
84
+ const hosts: Array<DiscoveredNetworkDevice | null | undefined> = [
85
+ host({ snmpReachable: false }),
86
+ host({ snmpReachable: true }),
87
+ host({}),
88
+ host({ snmpReachable: false, isAlreadyRegistered: true }),
89
+ null,
90
+ undefined,
91
+ ];
92
+
93
+ for (const candidate of hosts) {
94
+ expect(monitoringMethodForDiscoveredHost(candidate)).not.toBe(
95
+ NetworkDeviceMonitoringMethod.Monitor,
96
+ );
97
+ }
98
+ });
99
+ });
100
+
101
+ describe("isPingOnlyDiscoveredHost", () => {
102
+ test("an explicit snmpReachable === false is ping-only", () => {
103
+ expect(isPingOnlyDiscoveredHost(host({ snmpReachable: false }))).toBe(true);
104
+ });
105
+
106
+ test("snmpReachable === true is an SNMP host", () => {
107
+ expect(isPingOnlyDiscoveredHost(host({ snmpReachable: true }))).toBe(false);
108
+ });
109
+
110
+ test("undefined snmpReachable (legacy scan) reads as an SNMP host, not ping-only", () => {
111
+ /*
112
+ * Every host on a scan stored before the field existed answered SNMP —
113
+ * ping-only sweeps did not exist yet. Reading undefined as ping-only
114
+ * would strip those devices of the scan's credentials on import.
115
+ */
116
+ expect(isPingOnlyDiscoveredHost(host({}))).toBe(false);
117
+ expect(isPingOnlyDiscoveredHost(host({ snmpReachable: undefined }))).toBe(
118
+ false,
119
+ );
120
+ });
121
+
122
+ test("a nullish host reads as an SNMP host rather than throwing", () => {
123
+ expect(isPingOnlyDiscoveredHost(null)).toBe(false);
124
+ expect(isPingOnlyDiscoveredHost(undefined)).toBe(false);
125
+ });
126
+
127
+ test("only snmpReachable decides — every other field is ignored", () => {
128
+ expect(
129
+ isPingOnlyDiscoveredHost(
130
+ host({
131
+ isAlreadyRegistered: true,
132
+ sysDescr: "Some host",
133
+ sysName: "named-anyway",
134
+ snmpReachable: false,
135
+ }),
136
+ ),
137
+ ).toBe(true);
138
+ });
61
139
  });
62
140
 
63
141
  describe("isImportableDiscoveredHost", () => {