@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,5 +1,9 @@
1
1
  import NetworkDevice from "../../../Models/DatabaseModels/NetworkDevice";
2
+ import NetworkSite from "../../../Models/DatabaseModels/NetworkSite";
3
+ import NetworkSnmpCredentialProfile from "../../../Models/DatabaseModels/NetworkSnmpCredentialProfile";
2
4
  import NetworkDeviceService from "../../Services/NetworkDeviceService";
5
+ import NetworkSiteService from "../../Services/NetworkSiteService";
6
+ import NetworkSnmpCredentialProfileService from "../../Services/NetworkSnmpCredentialProfileService";
3
7
  import MonitorStepSnmpMonitor from "../../../Types/Monitor/MonitorStepSnmpMonitor";
4
8
  import SnmpOid from "../../../Types/Monitor/SnmpMonitor/SnmpOid";
5
9
  import MonitorSteps from "../../../Types/Monitor/MonitorSteps";
@@ -14,8 +18,13 @@ import SnmpSecurityLevel from "../../../Types/Monitor/SnmpMonitor/SnmpSecurityLe
14
18
  import SnmpAuthProtocol from "../../../Types/Monitor/SnmpMonitor/SnmpAuthProtocol";
15
19
  import SnmpPrivProtocol from "../../../Types/Monitor/SnmpMonitor/SnmpPrivProtocol";
16
20
  import ObjectID from "../../../Types/ObjectID";
21
+ import { JSONObject } from "../../../Types/JSON";
17
22
  import IP from "../../../Types/IP/IP";
18
23
  import IpCanonicalUtil from "../../../Utils/IpCanonicalUtil";
24
+ import {
25
+ SnmpCredentialCarrier,
26
+ hasUsableCredentials,
27
+ } from "../../../Utils/NetworkDevice/SnmpCredentialUtil";
19
28
  import DnsResolutionCache from "./DnsResolutionCache";
20
29
  import logger from "../Logger";
21
30
 
@@ -31,15 +40,111 @@ export interface HydratableMonitor {
31
40
  monitorSteps?: MonitorSteps | undefined;
32
41
  }
33
42
 
43
+ /*
44
+ * How the assigned probe polls a device on a given cycle.
45
+ *
46
+ * ping - ICMP reachability only. The device has no usable SNMP
47
+ * credentials anywhere, so there is nothing to walk it with.
48
+ * snmp - ICMP reachability AND an SNMP walk, run in parallel. The walk
49
+ * is never gated on the ping: ICMP-filtered SNMP gear stays Up.
50
+ *
51
+ * The mode travels both ways. The list handler stamps it on every device it
52
+ * hands out (so the probe knows whether to walk), and the probe stamps it on
53
+ * every result it reports (so the server knows whether a missing walk means
54
+ * "not attempted" or "lost"). A result with no mode at all comes from a
55
+ * probe older than ping-first polling, which only ever walked, so the
56
+ * ingest side reads a missing mode as "snmp".
57
+ */
58
+ export type NetworkDevicePollMode = "ping" | "snmp";
59
+
60
+ /*
61
+ * Everything needed to OPEN an SNMP session, as opposed to the three fields
62
+ * that decide whether one is worth opening at all (SnmpCredentialCarrier).
63
+ *
64
+ * Three different rows satisfy this shape and the resolver below picks
65
+ * between them per device: the device's own snmp* columns, the
66
+ * NetworkSnmpCredentialProfile the device points at, and the profile the
67
+ * device's SITE points at. Structural rather than a union of the two models
68
+ * on purpose — the assembly below must not be able to tell which row it was
69
+ * handed, or it would grow a branch that reads one of them differently.
70
+ *
71
+ * `| undefined` is spelled out on every field for the reason
72
+ * SnmpCredentialCarrier documents: the repo compiles with
73
+ * exactOptionalPropertyTypes, and a caller assembling a carrier from a
74
+ * partially selected row hands over explicit undefineds.
75
+ */
76
+ export interface SnmpConnectionCredentials extends SnmpCredentialCarrier {
77
+ snmpPort?: number | null | undefined;
78
+ // Only devices have this: the pre-column-flattening v3 JSON blob.
79
+ snmpV3Auth?: JSONObject | null | undefined;
80
+ snmpV3SecurityLevel?: string | null | undefined;
81
+ snmpV3AuthProtocol?: string | null | undefined;
82
+ snmpV3AuthKey?: string | null | undefined;
83
+ snmpV3PrivProtocol?: string | null | undefined;
84
+ snmpV3PrivKey?: string | null | undefined;
85
+ }
86
+
87
+ /*
88
+ * What one device's credentials resolved to, and therefore how it is polled
89
+ * this cycle. `carrier` is whichever row won the resolution order; when
90
+ * nothing usable was found anywhere it is the device's own columns and
91
+ * `pollMode` is "ping", so a caller can always build a config from it
92
+ * without a null check — it simply must not, in ping mode.
93
+ */
94
+ export interface ResolvedDeviceSnmpCredentials {
95
+ carrier: SnmpConnectionCredentials;
96
+ pollMode: NetworkDevicePollMode;
97
+ }
98
+
99
+ /*
100
+ * The batch answer. `unresolvedDeviceIds` are devices whose credentials
101
+ * depend on a row this cycle could not read (the profile or site lookup
102
+ * threw). They are NOT in `byDeviceId`, and every caller must skip them for
103
+ * the cycle rather than fall back to the device's own columns: falling back
104
+ * would poll a profile-credentialled device with no credentials at all,
105
+ * which the probe reports as Down and which therefore manufactures an
106
+ * outage out of a database blip.
107
+ */
108
+ export interface ResolvedSnmpCredentialsForBatch {
109
+ byDeviceId: Map<string, ResolvedDeviceSnmpCredentials>;
110
+ unresolvedDeviceIds: Set<string>;
111
+ }
112
+
34
113
  export default class NetworkDeviceHydrationUtil {
114
+ /*
115
+ * The poll-time decision: walk the device over SNMP, or only ping it?
116
+ *
117
+ * Purely a function of whether the credential carrier the caller resolved
118
+ * (see resolveSnmpCredentials: the device's own columns, its credential
119
+ * profile, or its site's) has enough to open an SNMP session with - see
120
+ * SnmpCredentialUtil.hasUsableCredentials for what "enough" means. It is
121
+ * deliberately NOT a function of the monitoring method: a Probe device is
122
+ * polled either way, and the method only says whether a probe polls it at
123
+ * all.
124
+ */
125
+ public static resolvePollMode(
126
+ carrier: SnmpCredentialCarrier,
127
+ ): NetworkDevicePollMode {
128
+ return hasUsableCredentials(carrier) ? "snmp" : "ping";
129
+ }
130
+
35
131
  /*
36
132
  * The device columns needed to assemble a probe-executable SNMP config.
37
133
  * Shared by monitor hydration below and the device polling claim
38
134
  * endpoint, so the two can never drift apart on which credentials they
39
135
  * load.
136
+ *
137
+ * `projectId`, `siteId` and `snmpCredentialProfileId` are part of the
138
+ * credential set, not extras: a device's credentials may live on a
139
+ * profile it or its site points at, and a profile is only usable when it
140
+ * belongs to the same project as the device (resolveSnmpCredentials drops
141
+ * it otherwise, and cannot compare what it did not select).
40
142
  */
41
143
  public static readonly snmpConfigSelect: {
42
144
  _id: true;
145
+ projectId: true;
146
+ siteId: true;
147
+ snmpCredentialProfileId: true;
43
148
  hostname: true;
44
149
  snmpVersion: true;
45
150
  snmpCommunityString: true;
@@ -53,6 +158,9 @@ export default class NetworkDeviceHydrationUtil {
53
158
  snmpV3PrivKey: true;
54
159
  } = {
55
160
  _id: true,
161
+ projectId: true,
162
+ siteId: true,
163
+ snmpCredentialProfileId: true,
56
164
  hostname: true,
57
165
  snmpVersion: true,
58
166
  snmpCommunityString: true,
@@ -67,24 +175,362 @@ export default class NetworkDeviceHydrationUtil {
67
175
  };
68
176
 
69
177
  /*
70
- * Assembles the concrete SNMP config a stateless probe can execute from a
71
- * device's stored connection identity. The caller chooses what to collect
178
+ * The columns a NetworkSnmpCredentialProfile contributes when it is the
179
+ * winning carrier. `projectId` is here for the tenancy comparison, which
180
+ * is the whole reason the profiles are loaded as root.
181
+ */
182
+ private static readonly credentialProfileSelect: {
183
+ _id: true;
184
+ projectId: true;
185
+ snmpVersion: true;
186
+ snmpCommunityString: true;
187
+ snmpPort: true;
188
+ snmpV3SecurityLevel: true;
189
+ snmpV3Username: true;
190
+ snmpV3AuthProtocol: true;
191
+ snmpV3AuthKey: true;
192
+ snmpV3PrivProtocol: true;
193
+ snmpV3PrivKey: true;
194
+ } = {
195
+ _id: true,
196
+ projectId: true,
197
+ snmpVersion: true,
198
+ snmpCommunityString: true,
199
+ snmpPort: true,
200
+ snmpV3SecurityLevel: true,
201
+ snmpV3Username: true,
202
+ snmpV3AuthProtocol: true,
203
+ snmpV3AuthKey: true,
204
+ snmpV3PrivProtocol: true,
205
+ snmpV3PrivKey: true,
206
+ };
207
+
208
+ /*
209
+ * Resolves, for a batch of devices, WHICH row each one is walked with -
210
+ * and therefore whether it is walked at all.
211
+ *
212
+ * Resolution order, first row with usable credentials wins:
213
+ * 1. the device's own snmp* columns,
214
+ * 2. the NetworkSnmpCredentialProfile the device points at,
215
+ * 3. the profile the device's SITE points at.
216
+ * With none of the three the device is pinged and never walked, and the
217
+ * carrier handed back is the device itself so the answer is always
218
+ * complete.
219
+ *
220
+ * TENANCY. Both lookups run as root, because a poll batch spans projects
221
+ * and there is no caller tenant to scope to. Root reads mean the FK is
222
+ * NOT a tenancy guarantee, so every profile is compared against the
223
+ * device's own projectId and a mismatch is DROPPED with an error log
224
+ * rather than used. A device pointed at another project's profile is
225
+ * therefore polled with NO credentials (ping) rather than with that
226
+ * project's community string - which is the difference between a device
227
+ * that reads Pending and a cross-tenant credential leak onto the wire.
228
+ *
229
+ * COST. Three queries per batch at the very worst, and zero for the
230
+ * common fleet where every device carries its own credentials: profiles
231
+ * are only looked up for devices that have no usable columns of their
232
+ * own, and sites only for those of them that still have nothing.
233
+ *
234
+ * This is the single resolver for BOTH the poll list handler and monitor
235
+ * hydration, so the walk a probe is told to run and the walk the monitor
236
+ * evaluation believes ran can never be based on different credentials.
237
+ */
238
+ public static async resolveSnmpCredentials(
239
+ devices: Array<NetworkDevice>,
240
+ ): Promise<ResolvedSnmpCredentialsForBatch> {
241
+ const byDeviceId: Map<string, ResolvedDeviceSnmpCredentials> = new Map();
242
+ const unresolvedDeviceIds: Set<string> = new Set();
243
+
244
+ /*
245
+ * A device whose own columns already open a session needs nothing read.
246
+ * Everything below is scoped to the rest, so a fleet that never adopted
247
+ * profiles pays for none of this.
248
+ */
249
+ const devicesNeedingLookup: Array<NetworkDevice> = [];
250
+
251
+ for (const device of devices) {
252
+ if (!device.id) {
253
+ continue;
254
+ }
255
+
256
+ if (hasUsableCredentials(device)) {
257
+ byDeviceId.set(device.id.toString(), {
258
+ carrier: device,
259
+ pollMode: NetworkDeviceHydrationUtil.resolvePollMode(device),
260
+ });
261
+ continue;
262
+ }
263
+
264
+ if (device.snmpCredentialProfileId || device.siteId) {
265
+ devicesNeedingLookup.push(device);
266
+ continue;
267
+ }
268
+
269
+ // Nothing of its own, nothing to inherit from: pinged only.
270
+ byDeviceId.set(device.id.toString(), {
271
+ carrier: device,
272
+ pollMode: NetworkDeviceHydrationUtil.resolvePollMode(device),
273
+ });
274
+ }
275
+
276
+ if (devicesNeedingLookup.length === 0) {
277
+ return {
278
+ byDeviceId: byDeviceId,
279
+ unresolvedDeviceIds: unresolvedDeviceIds,
280
+ };
281
+ }
282
+
283
+ const profilesById: Map<string, NetworkSnmpCredentialProfile> = new Map();
284
+ const siteProfileIdBySiteId: Map<string, string> = new Map();
285
+
286
+ try {
287
+ const deviceProfileIds: Array<string> = Array.from(
288
+ new Set(
289
+ devicesNeedingLookup.flatMap(
290
+ (device: NetworkDevice): Array<string> => {
291
+ return device.snmpCredentialProfileId
292
+ ? [device.snmpCredentialProfileId.toString()]
293
+ : [];
294
+ },
295
+ ),
296
+ ),
297
+ );
298
+
299
+ const siteIds: Array<string> = Array.from(
300
+ new Set(
301
+ devicesNeedingLookup.flatMap(
302
+ (device: NetworkDevice): Array<string> => {
303
+ return device.siteId ? [device.siteId.toString()] : [];
304
+ },
305
+ ),
306
+ ),
307
+ );
308
+
309
+ /*
310
+ * Round one: the profiles the devices name, and the sites they sit in
311
+ * (for the profile those sites name). Issued together because neither
312
+ * depends on the other.
313
+ */
314
+ const [deviceProfiles, sites]: [
315
+ Array<NetworkSnmpCredentialProfile>,
316
+ Array<NetworkSite>,
317
+ ] = await Promise.all([
318
+ NetworkDeviceHydrationUtil.loadCredentialProfiles(deviceProfileIds),
319
+ siteIds.length === 0
320
+ ? Promise.resolve([])
321
+ : NetworkSiteService.findBy({
322
+ query: {
323
+ _id: QueryHelper.any(siteIds),
324
+ },
325
+ select: {
326
+ _id: true,
327
+ projectId: true,
328
+ snmpCredentialProfileId: true,
329
+ },
330
+ limit: LIMIT_MAX,
331
+ skip: 0,
332
+ props: {
333
+ isRoot: true,
334
+ },
335
+ }),
336
+ ]);
337
+
338
+ for (const profile of deviceProfiles) {
339
+ if (profile.id) {
340
+ profilesById.set(profile.id.toString(), profile);
341
+ }
342
+ }
343
+
344
+ for (const site of sites) {
345
+ if (site.id && site.snmpCredentialProfileId) {
346
+ siteProfileIdBySiteId.set(
347
+ site.id.toString(),
348
+ site.snmpCredentialProfileId.toString(),
349
+ );
350
+ }
351
+ }
352
+
353
+ /*
354
+ * Round two: the profiles the sites name that were not already loaded
355
+ * as a device's own. Only ever one extra statement, and only when a
356
+ * site actually carries a profile.
357
+ */
358
+ const siteProfileIdsToLoad: Array<string> = Array.from(
359
+ new Set(siteProfileIdBySiteId.values()),
360
+ ).filter((profileId: string) => {
361
+ return !profilesById.has(profileId);
362
+ });
363
+
364
+ for (const profile of await NetworkDeviceHydrationUtil.loadCredentialProfiles(
365
+ siteProfileIdsToLoad,
366
+ )) {
367
+ if (profile.id) {
368
+ profilesById.set(profile.id.toString(), profile);
369
+ }
370
+ }
371
+ } catch (err) {
372
+ /*
373
+ * Skip these devices this cycle rather than polling them without the
374
+ * credentials they are configured with.
375
+ *
376
+ * The alternative - falling back to the device's own (empty) columns -
377
+ * would hand the probe a ping-mode device, and a device that has been
378
+ * answering SNMP would silently stop reporting interfaces, inventory
379
+ * and walk health for as long as the lookup keeps failing. Claiming
380
+ * has already advanced nextPollAt, so the cost of skipping is one
381
+ * interval; the cost of guessing is a wrong verdict.
382
+ */
383
+ logger.error(
384
+ `Could not resolve SNMP credential profiles for ${devicesNeedingLookup.length} network device(s); skipping them for this cycle rather than polling them without the credentials they are configured with.`,
385
+ );
386
+ logger.error(err);
387
+
388
+ for (const device of devicesNeedingLookup) {
389
+ if (device.id) {
390
+ unresolvedDeviceIds.add(device.id.toString());
391
+ }
392
+ }
393
+
394
+ return {
395
+ byDeviceId: byDeviceId,
396
+ unresolvedDeviceIds: unresolvedDeviceIds,
397
+ };
398
+ }
399
+
400
+ for (const device of devicesNeedingLookup) {
401
+ const deviceId: string = device.id!.toString();
402
+
403
+ const candidates: Array<NetworkSnmpCredentialProfile | undefined> = [
404
+ NetworkDeviceHydrationUtil.sameProjectProfile({
405
+ device: device,
406
+ profileId: device.snmpCredentialProfileId?.toString(),
407
+ profilesById: profilesById,
408
+ referencedBy: "device",
409
+ }),
410
+ NetworkDeviceHydrationUtil.sameProjectProfile({
411
+ device: device,
412
+ profileId: device.siteId
413
+ ? siteProfileIdBySiteId.get(device.siteId.toString())
414
+ : undefined,
415
+ profilesById: profilesById,
416
+ referencedBy: "site",
417
+ }),
418
+ ];
419
+
420
+ const winner: NetworkSnmpCredentialProfile | undefined = candidates.find(
421
+ (candidate: NetworkSnmpCredentialProfile | undefined) => {
422
+ return candidate !== undefined && hasUsableCredentials(candidate);
423
+ },
424
+ );
425
+
426
+ // No usable row anywhere: the device's own (empty) columns, pinged only.
427
+ const carrier: SnmpConnectionCredentials = winner || device;
428
+
429
+ byDeviceId.set(deviceId, {
430
+ carrier: carrier,
431
+ // One definition of "credentials -> mode", asked of the winning row.
432
+ pollMode: NetworkDeviceHydrationUtil.resolvePollMode(carrier),
433
+ });
434
+ }
435
+
436
+ return { byDeviceId: byDeviceId, unresolvedDeviceIds: unresolvedDeviceIds };
437
+ }
438
+
439
+ private static async loadCredentialProfiles(
440
+ profileIds: Array<string>,
441
+ ): Promise<Array<NetworkSnmpCredentialProfile>> {
442
+ if (profileIds.length === 0) {
443
+ return [];
444
+ }
445
+
446
+ return await NetworkSnmpCredentialProfileService.findBy({
447
+ query: {
448
+ _id: QueryHelper.any(profileIds),
449
+ },
450
+ select: NetworkDeviceHydrationUtil.credentialProfileSelect,
451
+ limit: LIMIT_MAX,
452
+ skip: 0,
453
+ props: {
454
+ isRoot: true,
455
+ },
456
+ });
457
+ }
458
+
459
+ /*
460
+ * The tenancy comparison, in the one place both references pass through.
461
+ * Returns the profile only when it exists AND belongs to the device's
462
+ * project; a cross-project reference is dropped loudly, because the only
463
+ * ways a row can get into that state are corrupted data or a write that
464
+ * predates the guards in NetworkDeviceService/NetworkSiteService - and in
465
+ * either case shipping those credentials to this project's probe is a
466
+ * credential leak, not a degraded poll.
467
+ */
468
+ private static sameProjectProfile(data: {
469
+ device: NetworkDevice;
470
+ profileId: string | undefined;
471
+ profilesById: Map<string, NetworkSnmpCredentialProfile>;
472
+ referencedBy: "device" | "site";
473
+ }): NetworkSnmpCredentialProfile | undefined {
474
+ if (!data.profileId) {
475
+ return undefined;
476
+ }
477
+
478
+ const profile: NetworkSnmpCredentialProfile | undefined =
479
+ data.profilesById.get(data.profileId);
480
+
481
+ if (!profile) {
482
+ // Deleted between the device's write and this poll; nothing to log loudly.
483
+ return undefined;
484
+ }
485
+
486
+ /*
487
+ * Both sides must be present AND equal. A row missing its projectId is
488
+ * not "unknown, therefore fine": it is a row whose tenancy cannot be
489
+ * established, and the credentials in it are about to be put on a
490
+ * specific project's wire. The only safe reading of an unverifiable
491
+ * reference is to refuse it.
492
+ */
493
+ const isSameProject: boolean = Boolean(
494
+ profile.projectId &&
495
+ data.device.projectId &&
496
+ profile.projectId.toString() === data.device.projectId.toString(),
497
+ );
498
+
499
+ if (!isSameProject) {
500
+ logger.error(
501
+ `Network device ${data.device.id?.toString()} resolves (via its ${data.referencedBy}) to SNMP Credential Profile ${data.profileId}, whose project does not match the device's. Dropping the profile: the device is pinged only until the reference is corrected.`,
502
+ );
503
+ return undefined;
504
+ }
505
+
506
+ return profile;
507
+ }
508
+
509
+ /*
510
+ * Assembles the concrete SNMP config a stateless probe can execute.
511
+ *
512
+ * `hostname` and `credentials` are separate parameters, and deliberately
513
+ * so: WHERE to connect always comes from the device, WHAT to connect with
514
+ * comes from whichever row won resolveSnmpCredentials' order. Passing the
515
+ * device for both was the old shape, and it made "poll this device with
516
+ * its site's profile" unrepresentable. The caller chooses what to collect
72
517
  * (OIDs / interface walk) — for device polling those come from the
73
518
  * device's own snmpOids/walkInterfaces columns.
74
519
  */
75
520
  public static buildSnmpMonitorConfig(data: {
76
- device: NetworkDevice;
521
+ hostname: string;
522
+ credentials: SnmpConnectionCredentials;
77
523
  oids: Array<SnmpOid>;
78
524
  monitorInterfaces: boolean;
79
525
  }): MonitorStepSnmpMonitor {
80
526
  return {
81
527
  snmpVersion: NetworkDeviceHydrationUtil.parseSnmpVersion(
82
- data.device.snmpVersion,
528
+ data.credentials.snmpVersion || undefined,
83
529
  ),
84
- hostname: data.device.hostname || "",
85
- port: data.device.snmpPort || 161,
86
- communityString: data.device.snmpCommunityString || undefined,
87
- snmpV3Auth: NetworkDeviceHydrationUtil.buildSnmpV3Auth(data.device),
530
+ hostname: data.hostname,
531
+ port: data.credentials.snmpPort || 161,
532
+ communityString: data.credentials.snmpCommunityString || undefined,
533
+ snmpV3Auth: NetworkDeviceHydrationUtil.buildSnmpV3Auth(data.credentials),
88
534
  oids: data.oids,
89
535
  timeout: 5000,
90
536
  retries: 3,
@@ -152,6 +598,16 @@ export default class NetworkDeviceHydrationUtil {
152
598
  }
153
599
  }
154
600
 
601
+ /*
602
+ * The same resolver the poll list handler uses, for the same devices.
603
+ * Sharing it is the point: a device walked with its site's profile must
604
+ * be EVALUATED against that walk too, and two independent readings of
605
+ * "which credentials does this device use" would eventually disagree —
606
+ * silently, and only for the devices that use a profile.
607
+ */
608
+ const resolvedCredentials: ResolvedSnmpCredentialsForBatch =
609
+ await NetworkDeviceHydrationUtil.resolveSnmpCredentials(devices);
610
+
155
611
  for (const monitor of monitors) {
156
612
  if (monitor.monitorType !== MonitorType.NetworkDevice) {
157
613
  continue;
@@ -175,6 +631,24 @@ export default class NetworkDeviceHydrationUtil {
175
631
  continue;
176
632
  }
177
633
 
634
+ const resolved: ResolvedDeviceSnmpCredentials | undefined =
635
+ resolvedCredentials.byDeviceId.get(deviceId);
636
+
637
+ /*
638
+ * Only ever absent when the credential lookup failed this cycle
639
+ * (resolveSnmpCredentials withholds those devices). Leave the step
640
+ * unhydrated rather than assembling a config from the device's own
641
+ * empty columns: the probe would open a session with SnmpMonitor's
642
+ * default "public" community and report a perfectly healthy device
643
+ * as failing its walk.
644
+ */
645
+ if (!resolved) {
646
+ logger.warn(
647
+ `Network Device monitor ${monitor.id?.toString()}: could not resolve SNMP credentials for device ${deviceId} this cycle. Leaving the step unhydrated rather than executing it without credentials.`,
648
+ );
649
+ continue;
650
+ }
651
+
178
652
  /*
179
653
  * Legacy path: reads the step's own (deprecated) oids and
180
654
  * monitorInterfaces. Only monitor TESTS still flow through here —
@@ -183,7 +657,8 @@ export default class NetworkDeviceHydrationUtil {
183
657
  */
184
658
  step.data.snmpMonitor =
185
659
  NetworkDeviceHydrationUtil.buildSnmpMonitorConfig({
186
- device: device,
660
+ hostname: device.hostname,
661
+ credentials: resolved.carrier,
187
662
  oids: step.data.networkDeviceMonitor?.oids || [],
188
663
  monitorInterfaces:
189
664
  step.data.networkDeviceMonitor?.monitorInterfaces !== false,
@@ -214,27 +689,32 @@ export default class NetworkDeviceHydrationUtil {
214
689
  * a silently defaulted algorithm.
215
690
  */
216
691
  private static buildSnmpV3Auth(
217
- device: NetworkDevice,
692
+ credentials: SnmpConnectionCredentials,
218
693
  ): SnmpV3Auth | undefined {
219
- if (device.snmpV3Username) {
694
+ if (credentials.snmpV3Username) {
220
695
  return {
221
696
  securityLevel:
222
- (device.snmpV3SecurityLevel as SnmpSecurityLevel) ||
697
+ (credentials.snmpV3SecurityLevel as SnmpSecurityLevel) ||
223
698
  SnmpSecurityLevel.NoAuthNoPriv,
224
- username: device.snmpV3Username,
699
+ username: credentials.snmpV3Username,
225
700
  authProtocol:
226
- (device.snmpV3AuthProtocol as SnmpAuthProtocol | undefined) ||
701
+ (credentials.snmpV3AuthProtocol as SnmpAuthProtocol | undefined) ||
227
702
  undefined,
228
- authKey: device.snmpV3AuthKey || undefined,
703
+ authKey: credentials.snmpV3AuthKey || undefined,
229
704
  privProtocol:
230
- (device.snmpV3PrivProtocol as SnmpPrivProtocol | undefined) ||
705
+ (credentials.snmpV3PrivProtocol as SnmpPrivProtocol | undefined) ||
231
706
  undefined,
232
- privKey: device.snmpV3PrivKey || undefined,
707
+ privKey: credentials.snmpV3PrivKey || undefined,
233
708
  };
234
709
  }
235
710
 
236
- // Legacy devices stored the whole object in the snmpV3Auth JSON column.
237
- const legacy: SnmpV3Auth | undefined = device.snmpV3Auth as
711
+ /*
712
+ * Legacy devices stored the whole object in the snmpV3Auth JSON column.
713
+ * Only devices ever had it — a credential profile is newer than the
714
+ * flattened columns — so this branch is unreachable for a profile
715
+ * carrier, which is exactly why the field is optional on the interface.
716
+ */
717
+ const legacy: SnmpV3Auth | undefined = credentials.snmpV3Auth as
238
718
  | SnmpV3Auth
239
719
  | undefined;
240
720
  if (legacy && legacy.username) {