@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,6 +1,7 @@
1
1
  import DeviceReachabilityUtil, {
2
2
  NetworkDeviceReachability,
3
3
  } from "./DeviceReachabilityUtil";
4
+ import { NetworkDeviceMonitoringMethodUtil } from "../../Types/NetworkDevice/NetworkDeviceMonitoringMethod";
4
5
 
5
6
  /*
6
7
  * The one place that decides how healthy a single NetworkDevice is, and how
@@ -15,10 +16,12 @@ import DeviceReachabilityUtil, {
15
16
  *
16
17
  * So the rule moves here, and both halves read it:
17
18
  *
18
- * status — a monitor-stamped status wins outright; otherwise the shared
19
- * reachability rule (the OUTCOME of the last poll, never its
20
- * age) decides, and a device nothing has ever polled is
21
- * `unknown` rather than a failure.
19
+ * status — for a MONITOR-BACKED device the stamped monitor status is the
20
+ * verdict; for a probe-polled device the shared reachability
21
+ * rule (the OUTCOME of the last poll, never its age) decides and
22
+ * the stamp is informational only (see the input docs); a device
23
+ * nothing has ever polled — or a monitor-backed device nothing
24
+ * has yet reported on — is `unknown` rather than a failure.
22
25
  * degraded — an up device with dark ports. A switch that answers every
23
26
  * poll while three of its interfaces are down is not down, but
24
27
  * it is exactly what somebody is looking for.
@@ -55,9 +58,18 @@ export type NetworkDeviceHealthState =
55
58
  * The columns the classifier reads. Every caller selects exactly these.
56
59
  *
57
60
  * `monitorStatusIsOffline` is the OFFLINE end of the device's stamped
58
- * MonitorStatus row — `undefined` when no monitor backs the device (the
59
- * ordinary case for an SNMP-walked switch), which is what sends the
60
- * decision down to reachability.
61
+ * MonitorStatus row — `undefined` when nothing has stamped one, which is
62
+ * what sends the decision down to reachability.
63
+ *
64
+ * It is CONSULTED ONLY FOR A MONITOR-BACKED DEVICE (monitoringMethod
65
+ * "Monitor"). A probe-polled device can carry a stamp too — a Network
66
+ * Device monitor watching its walk writes one, and an "interface down →
67
+ * Offline" criterion will happily stamp Offline on a switch that answers
68
+ * every ping — but its health source is the poll: `isReachable` is what its
69
+ * pill, the summary tiles and the Status chip all read, and a classifier
70
+ * that let the stamp outrank it would colour the site card and the map red
71
+ * over a device whose own row reads Up. So for a probe-polled device the
72
+ * stamp stays informational and reachability decides.
61
73
  *
62
74
  * The offline end and not the operational end, because MonitorStatus is a
63
75
  * ladder rather than a pair: the seeded rows run Operational (1) ...
@@ -74,6 +86,24 @@ export interface DeviceHealthStateInput {
74
86
  lastPolledAt?: Date | string | null | undefined;
75
87
  lastSeenAt?: Date | string | null | undefined;
76
88
  pollingIntervalInMinutes?: number | null | undefined;
89
+ /*
90
+ * How this device's health is established. NULL, empty and anything
91
+ * unrecognised read as Probe — see NetworkDeviceMonitoringMethodUtil.parse,
92
+ * which is why an omitted value keeps every existing caller on the poll
93
+ * rule unchanged.
94
+ *
95
+ * Load-bearing twice. It decides whether `monitorStatusIsOffline` above is
96
+ * read at all (only for a monitor-backed device). And when a monitor-backed
97
+ * device has NO stamped status to read — nothing bound yet, or bound and
98
+ * never evaluated — the shared rule answers Pending ("unknown" here)
99
+ * rather than falling through to the poll columns, which on such a device
100
+ * are either NULL or, worse, the last thing a probe found before it
101
+ * stopped asking: a device switched from Probe to Monitor keeps its old
102
+ * lastSeenAt until the switch-over clears it, and a caller that dropped
103
+ * this field would let that months-old timestamp call the device "down" on
104
+ * the site card while its own row in the device list reads Pending.
105
+ */
106
+ monitoringMethod?: string | null | undefined;
77
107
  interfacesDown?: number | null | undefined;
78
108
  }
79
109
 
@@ -96,11 +126,13 @@ export interface DeviceHealthCounts {
96
126
  /**
97
127
  * The state of one device.
98
128
  *
99
- * Order is load-bearing. A stamped monitor status is the operator's own
100
- * system of record and beats everything; then hard-down beats everything
101
- * else, because a device that does not answer has interface counts that
102
- * are by definition stale; then and only for a device known to be up —
103
- * dark ports make it degraded.
129
+ * Order is load-bearing. On a monitor-backed device the stamped monitor
130
+ * status is the operator's own system of record and beats everything; on a
131
+ * probe-polled one the poll's outcome does (the stamp is informational
132
+ * see the input docs); then hard-down beats everything else, because a
133
+ * device that does not answer has interface counts that are by definition
134
+ * stale; then — and only for a device known to be up — dark ports make it
135
+ * degraded.
104
136
  *
105
137
  * Note what this means for a device stamped "Degraded": the ladder does not
106
138
  * call it offline, so it is up, and it lands in "degraded" only if it also
@@ -119,9 +151,19 @@ export function deviceHealthState(
119
151
 
120
152
  let isUp: boolean;
121
153
 
154
+ /*
155
+ * The stamp is read for a monitor-backed device and nothing else. The
156
+ * shared reachability rule below applies the same gate, so the two
157
+ * branches cannot be reached with different ideas of what kind of device
158
+ * this is.
159
+ */
160
+ const isMonitorBacked: boolean =
161
+ NetworkDeviceMonitoringMethodUtil.isMonitorBacked(device.monitoringMethod);
162
+
122
163
  if (
123
- device.monitorStatusIsOffline === true ||
124
- device.monitorStatusIsOffline === false
164
+ isMonitorBacked &&
165
+ (device.monitorStatusIsOffline === true ||
166
+ device.monitorStatusIsOffline === false)
125
167
  ) {
126
168
  // Anything the ladder does not call OFFLINE is up. See the input docs.
127
169
  isUp = !device.monitorStatusIsOffline;
@@ -133,6 +175,15 @@ export function deviceHealthState(
133
175
  lastPolledAt: device.lastPolledAt,
134
176
  lastSeenAt: device.lastSeenAt,
135
177
  pollingIntervalInMinutes: device.pollingIntervalInMinutes,
178
+ /*
179
+ * Carried so the shared rule knows whether the poll columns above
180
+ * mean anything. A monitor-backed device only reaches this branch
181
+ * with NO stamped status (the one above took every stamped one),
182
+ * so for it this is exactly the "Pending" case — see the input
183
+ * docs. A probe-polled device always reaches it, stamp or no
184
+ * stamp, and is judged by its poll.
185
+ */
186
+ monitoringMethod: device.monitoringMethod,
136
187
  },
137
188
  now,
138
189
  );
@@ -1,5 +1,6 @@
1
1
  import OneUptimeDate from "../../Types/Date";
2
2
  import { NetworkDeviceMonitoringMethodUtil } from "../../Types/NetworkDevice/NetworkDeviceMonitoringMethod";
3
+ import ObjectID from "../../Types/ObjectID";
3
4
 
4
5
  /*
5
6
  * The one place that decides whether a NetworkDevice is reachable.
@@ -21,13 +22,15 @@ import { NetworkDeviceMonitoringMethodUtil } from "../../Types/NetworkDevice/Net
21
22
  * window.
22
23
  *
23
24
  * So reachability is now the OUTCOME of the most recent poll —
24
- * NetworkDevice.isReachable, stamped by the walk pipeline on every ingested
25
- * walk and freshness is only a backstop for "the polling pipeline itself
26
- * stopped", measured generously against the device's own interval.
25
+ * NetworkDevice.isReachable, stamped by the poll pipeline on every ingested
26
+ * poll (a ping, plus the SNMP walk on a device that has credentials; the
27
+ * device is reachable when either answers) and freshness is only a
28
+ * backstop for "the polling pipeline itself stopped", measured generously
29
+ * against the device's own interval.
27
30
  *
28
31
  * All of which is about a device that gets POLLED. A monitor-backed device
29
- * (monitoringMethod "Monitor") is never polled at all: no probe, no
30
- * credentials, no walk. Every poll column on such a row is NULL forever, so
32
+ * (monitoringMethod "Monitor") is never polled at all: no probe, no ping,
33
+ * no walk. Every poll column on such a row is NULL forever, so
31
34
  * the rule above can only ever answer "Pending" for it — which is
32
35
  * OneUptime/oneuptime#3392, a correctly bound ping-only device stuck on
33
36
  * Pending. Its health comes from the Monitor bound to it, stamped onto
@@ -69,12 +72,13 @@ export const DEVICE_MIN_STALE_WINDOW_IN_MINUTES: number = 60;
69
72
  // The columns this util reads. Every caller selects exactly these.
70
73
  export interface DeviceReachabilityInput {
71
74
  /*
72
- * Outcome of the most recent poll: true = the device answered, false = the
73
- * probe could not reach it, null/undefined = never polled, or a row
74
- * written before this column existed.
75
+ * Outcome of the most recent poll: true = the device answered (ping, or
76
+ * the SNMP walk either is enough), false = the probe could not reach it
77
+ * by any means, null/undefined = never polled, or a row written before
78
+ * this column existed.
75
79
  */
76
80
  isReachable?: boolean | null | undefined;
77
- // When the probe last ATTEMPTED a walk, whatever the outcome.
81
+ // When the probe last ATTEMPTED a poll, whatever the outcome.
78
82
  lastPolledAt?: Date | string | null | undefined;
79
83
  // When the device last ANSWERED one.
80
84
  lastSeenAt?: Date | string | null | undefined;
@@ -82,7 +86,7 @@ export interface DeviceReachabilityInput {
82
86
  pollingIntervalInMinutes?: number | null | undefined;
83
87
  /*
84
88
  * How this device's health is established. NULL, empty and anything
85
- * unrecognised read as SNMP — see NetworkDeviceMonitoringMethodUtil.parse,
89
+ * unrecognised read as Probe — see NetworkDeviceMonitoringMethodUtil.parse,
86
90
  * which is why an omitted value keeps every existing caller on the poll
87
91
  * rule unchanged.
88
92
  */
@@ -102,6 +106,31 @@ export interface DeviceReachabilityInput {
102
106
  * way for the same reason.
103
107
  */
104
108
  monitorStatusIsOffline?: boolean | null | undefined;
109
+
110
+ /*
111
+ * QUALIFIER inputs. None of the four below moves the Up / Down / Pending
112
+ * verdict — the rule above is deliberately decided by `isReachable` alone,
113
+ * so the pill, the summary tiles and the Status chip (all SQL over that one
114
+ * column) can never disagree. They ride on the same input so a surface can
115
+ * hand its whole row over once and put the second, explanatory pill
116
+ * ("SNMP failing", "No probe") beside the verdict; see the predicates in
117
+ * the dashboard's DeviceStatusUtil.
118
+ *
119
+ * `isSnmpReachable`: the outcome of the last SNMP WALK, separate from the
120
+ * ping — false is a device that answers ping but not SNMP (credentials, or
121
+ * SNMP disabled on the box), NULL is "no walk was attempted": no usable
122
+ * credentials, or never polled.
123
+ */
124
+ isSnmpReachable?: boolean | null | undefined;
125
+ // When the last SUCCESSFUL walk completed; only moves on a success.
126
+ lastSnmpSeenAt?: Date | string | null | undefined;
127
+ /*
128
+ * Which probe polls the device, and whether it is allowed to. A probe-polled
129
+ * device with no probe, or with polling switched off, can never be polled
130
+ * and is Pending for as long as that stays true.
131
+ */
132
+ probeId?: ObjectID | string | null | undefined;
133
+ isPollingEnabled?: boolean | null | undefined;
105
134
  }
106
135
 
107
136
  export interface DeviceReachabilityResult {
@@ -119,10 +148,10 @@ export interface DeviceReachabilityResult {
119
148
  // Latest of lastPolledAt / lastSeenAt; null when neither is set.
120
149
  lastContactAt: Date | null;
121
150
  /*
122
- * True when this verdict came from the bound Monitor rather than from an
123
- * SNMP poll. Carried so a surface can word its pill and its tooltip for
124
- * what actually decided the answer — "the last SNMP poll reached this
125
- * device" is a lie on a device nothing polls.
151
+ * True when this verdict came from the bound Monitor rather than from a
152
+ * probe's poll. Carried so a surface can word its pill and its tooltip for
153
+ * what actually decided the answer — "the last poll reached this device"
154
+ * is a lie on a device nothing polls.
126
155
  */
127
156
  isMonitorBacked: boolean;
128
157
  }
@@ -0,0 +1,247 @@
1
+ import MonitorTemplate from "../../Models/DatabaseModels/MonitorTemplate";
2
+ import NetworkAlertPolicy from "../../Models/DatabaseModels/NetworkAlertPolicy";
3
+ import { CriteriaAlert } from "../../Types/Monitor/CriteriaAlert";
4
+ import { CriteriaIncident } from "../../Types/Monitor/CriteriaIncident";
5
+ import MonitorCriteria from "../../Types/Monitor/MonitorCriteria";
6
+ import MonitorCriteriaInstance from "../../Types/Monitor/MonitorCriteriaInstance";
7
+ import MonitorStep from "../../Types/Monitor/MonitorStep";
8
+ import { MonitorStepNetworkDeviceMonitorUtil } from "../../Types/Monitor/MonitorStepNetworkDeviceMonitor";
9
+ import MonitorSteps from "../../Types/Monitor/MonitorSteps";
10
+ import MonitorType from "../../Types/Monitor/MonitorType";
11
+ import NetworkDeviceAlertPackUtil from "../../Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack";
12
+ import { NetworkAlertPolicyScopeUtil } from "../../Types/NetworkDevice/NetworkAlertPolicyScope";
13
+ import ObjectID from "../../Types/ObjectID";
14
+
15
+ /*
16
+ * The "one click to alerting" path for network devices.
17
+ *
18
+ * An alert policy is only useful once it has a Network Device monitor
19
+ * template to clone, and building one by hand means walking the monitor
20
+ * template form: pick the type, add a step, add five criteria, fill in a
21
+ * severity and a status on each. Most operators want exactly the Recommended
22
+ * Alert Pack (NetworkDeviceAlertPack) on every device, so this util builds
23
+ * that template and the policy that applies it to the whole project, and the
24
+ * settings page find-or-creates the pair from its empty state.
25
+ *
26
+ * FIND-OR-CREATE BY MARKER. The template carries RECOMMENDED_TEMPLATE_MARKER
27
+ * in its description. The name is what an operator renames; the marker is
28
+ * what the bootstrap looks for, so clicking "create the recommended policy"
29
+ * twice — or after the recommended policy was deleted and its template kept
30
+ * — reuses the template instead of minting a second one, and instead of
31
+ * tripping the policy service's "another policy already uses this template"
32
+ * refusal on a duplicate nobody meant to make.
33
+ *
34
+ * WHY THE ITEMS ARE FILLED IN HERE. NetworkDeviceAlertPackUtil deliberately
35
+ * leaves severities and on-call policies for the user to complete on the
36
+ * monitor form. A policy's monitors are never opened in that form — the
37
+ * engine clones them — so a criteria whose `createIncidents` is on but whose
38
+ * `incidents` list is empty would clone into monitors that fire nothing.
39
+ * Every incident-creating item therefore gets one CriteriaIncident and every
40
+ * alert-creating item one CriteriaAlert, both auto-resolving, at the
41
+ * project's lowest-order severity (PingMonitorSeedIds resolves that).
42
+ *
43
+ * NO DEVICE ON THE TEMPLATE STEP. A Network Device step names the device it
44
+ * watches; a template step is a placeholder the engine rebinds per device
45
+ * (NetworkDeviceMonitorTemplateUtil.rebindMonitorSteps), which requires the
46
+ * `networkDeviceMonitor` block to exist and ignores what id it holds. The
47
+ * step is built with the block present and the id unset, which the
48
+ * template's reference validator skips rather than rejects.
49
+ *
50
+ * Pure: no database, no permissions. The caller persists both rows through
51
+ * ModelAPI / the services so tenancy, billing and the policy engine's hooks
52
+ * all run.
53
+ */
54
+
55
+ export const RECOMMENDED_TEMPLATE_MARKER: string =
56
+ "[oneuptime:network-alert-pack:v1]";
57
+
58
+ export const RECOMMENDED_TEMPLATE_NAME: string =
59
+ "Network device alert pack (recommended)";
60
+
61
+ export const RECOMMENDED_POLICY_NAME: string = "Alert on every device";
62
+
63
+ export interface RecommendedMonitorTemplateSeedIds {
64
+ projectId: ObjectID;
65
+ incidentSeverityId: ObjectID;
66
+ alertSeverityId: ObjectID;
67
+ onlineMonitorStatusId: ObjectID;
68
+ offlineMonitorStatusId: ObjectID;
69
+ }
70
+
71
+ export interface RecommendedPolicySeedIds {
72
+ projectId: ObjectID;
73
+ monitorTemplateId: ObjectID;
74
+ }
75
+
76
+ /*
77
+ * The slice of a MonitorTemplate the marker check reads. Kept to one
78
+ * optional field so a caller that listed templates with a narrow `select`
79
+ * can still ask.
80
+ */
81
+ export interface RecommendedTemplateCandidate {
82
+ templateDescription?: string | undefined;
83
+ }
84
+
85
+ export default class NetworkAlertPolicyBootstrapUtil {
86
+ /**
87
+ * The template every device's monitor is cloned from: a Network Device
88
+ * template whose single step carries the Recommended Alert Pack, with an
89
+ * incident or an alert filled in on every item.
90
+ */
91
+ public static buildRecommendedMonitorTemplate(
92
+ data: RecommendedMonitorTemplateSeedIds,
93
+ ): MonitorTemplate {
94
+ const criteriaInstances: Array<MonitorCriteriaInstance> =
95
+ NetworkDeviceAlertPackUtil.buildCriteriaInstances({
96
+ downMonitorStatusId: data.offlineMonitorStatusId,
97
+ });
98
+
99
+ for (const criteriaInstance of criteriaInstances) {
100
+ NetworkAlertPolicyBootstrapUtil.fillCriteriaActions({
101
+ criteriaInstance: criteriaInstance,
102
+ incidentSeverityId: data.incidentSeverityId,
103
+ alertSeverityId: data.alertSeverityId,
104
+ });
105
+ }
106
+
107
+ const monitorCriteria: MonitorCriteria = new MonitorCriteria();
108
+ monitorCriteria.data = {
109
+ monitorCriteriaInstanceArray: criteriaInstances,
110
+ };
111
+
112
+ const monitorStep: MonitorStep = new MonitorStep();
113
+ monitorStep.data!.networkDeviceMonitor =
114
+ MonitorStepNetworkDeviceMonitorUtil.getDefault();
115
+ monitorStep.data!.monitorCriteria = monitorCriteria;
116
+
117
+ const monitorSteps: MonitorSteps = new MonitorSteps();
118
+ monitorSteps.data = {
119
+ monitorStepsInstanceArray: [monitorStep],
120
+ /*
121
+ * Where the monitor goes when no pack item matches — the device is
122
+ * reachable, its walk succeeds, its interfaces are up. Without this a
123
+ * monitor that once went Offline would never come back.
124
+ */
125
+ defaultMonitorStatusId: new ObjectID(
126
+ data.onlineMonitorStatusId.toString(),
127
+ ),
128
+ };
129
+
130
+ const template: MonitorTemplate = new MonitorTemplate();
131
+ template.projectId = new ObjectID(data.projectId.toString());
132
+ template.templateName = RECOMMENDED_TEMPLATE_NAME;
133
+ template.templateDescription =
134
+ NetworkAlertPolicyBootstrapUtil.buildRecommendedTemplateDescription();
135
+ template.monitorType = MonitorType.NetworkDevice;
136
+ template.monitorSteps = monitorSteps;
137
+ /*
138
+ * Left blank on purpose: a policy's monitors are named after the device
139
+ * alone, and a default monitor name would become a suffix on every one
140
+ * of them (the auto-import precedent, issue #3486).
141
+ */
142
+ template.monitorDescription =
143
+ "Provisioned by a Network Alert Policy. Edit the policy's template to change what this monitor alerts on; it is re-synced from the template, so edits made here are overwritten.";
144
+
145
+ return template;
146
+ }
147
+
148
+ /**
149
+ * The policy that applies the template to every device in the project.
150
+ * Unscoped on purpose — that is what "recommended" means here, and the
151
+ * settings table says "All devices" against it so nobody misreads the
152
+ * reach.
153
+ */
154
+ public static buildRecommendedPolicy(
155
+ data: RecommendedPolicySeedIds,
156
+ ): NetworkAlertPolicy {
157
+ const policy: NetworkAlertPolicy = new NetworkAlertPolicy();
158
+ policy.projectId = new ObjectID(data.projectId.toString());
159
+ policy.name = RECOMMENDED_POLICY_NAME;
160
+ policy.description =
161
+ "Every probe-polled device in the project gets a Network Device monitor cloned from the recommended alert pack: an incident when it stops answering ping and SNMP or an interface goes down, and an alert when its SNMP walk fails, an interface saturates or an interface logs errors. A device with no SNMP credentials is pinged rather than walked, so only the reachability item can fire on it until credentials are set. Narrow the scope to sites, roles or labels to cover fewer devices.";
162
+ policy.isEnabled = true;
163
+ policy.monitorTemplateId = new ObjectID(data.monitorTemplateId.toString());
164
+ policy.scope = NetworkAlertPolicyScopeUtil.normalize({});
165
+
166
+ return policy;
167
+ }
168
+
169
+ /** Whether a template is the one this util minted, by its marker. */
170
+ public static isRecommendedTemplate(
171
+ template: RecommendedTemplateCandidate | null | undefined,
172
+ ): boolean {
173
+ return (template?.templateDescription || "").includes(
174
+ RECOMMENDED_TEMPLATE_MARKER,
175
+ );
176
+ }
177
+
178
+ /**
179
+ * The recommended template among a project's templates, or null. The
180
+ * first marked one wins so a project that somehow holds two keeps reusing
181
+ * the same one rather than alternating.
182
+ */
183
+ public static findRecommendedTemplate<
184
+ TTemplate extends RecommendedTemplateCandidate,
185
+ >(templates: Array<TTemplate>): TTemplate | null {
186
+ for (const template of templates) {
187
+ if (NetworkAlertPolicyBootstrapUtil.isRecommendedTemplate(template)) {
188
+ return template;
189
+ }
190
+ }
191
+
192
+ return null;
193
+ }
194
+
195
+ /**
196
+ * The description the marker lives in. The marker is on its own line at
197
+ * the end so an operator can rewrite the prose above it without losing
198
+ * the tag that makes the template findable.
199
+ */
200
+ public static buildRecommendedTemplateDescription(): string {
201
+ return `The Recommended Alert Pack for network devices: an incident when a device stops answering ping and SNMP or an interface goes down, an alert when the SNMP walk fails, an interface runs above 80% utilization or an interface logs errors. Created by the "Create the recommended policy" action under Network > Settings > Alert Policies; edit the criteria here and every monitor the policy provisions follows. Keep the marker below so the action can find this template again.\n\n${RECOMMENDED_TEMPLATE_MARKER}`;
202
+ }
203
+
204
+ /*
205
+ * One CriteriaIncident on an incident-creating item, one CriteriaAlert on
206
+ * an alert-creating one, titled after the pack item so the incident an
207
+ * operator is paged with reads "Device unreachable", not "Criteria 1".
208
+ */
209
+ private static fillCriteriaActions(data: {
210
+ criteriaInstance: MonitorCriteriaInstance;
211
+ incidentSeverityId: ObjectID;
212
+ alertSeverityId: ObjectID;
213
+ }): void {
214
+ const criteriaData: MonitorCriteriaInstance["data"] =
215
+ data.criteriaInstance.data;
216
+
217
+ if (!criteriaData) {
218
+ return;
219
+ }
220
+
221
+ if (criteriaData.createIncidents) {
222
+ const incident: CriteriaIncident = {
223
+ id: ObjectID.generate().toString(),
224
+ title: criteriaData.name,
225
+ description: criteriaData.description,
226
+ incidentSeverityId: new ObjectID(data.incidentSeverityId.toString()),
227
+ autoResolveIncident: true,
228
+ onCallPolicyIds: [],
229
+ };
230
+
231
+ criteriaData.incidents = [incident];
232
+ }
233
+
234
+ if (criteriaData.createAlerts) {
235
+ const alert: CriteriaAlert = {
236
+ id: ObjectID.generate().toString(),
237
+ title: criteriaData.name,
238
+ description: criteriaData.description,
239
+ alertSeverityId: new ObjectID(data.alertSeverityId.toString()),
240
+ autoResolveAlert: true,
241
+ onCallPolicyIds: [],
242
+ };
243
+
244
+ criteriaData.alerts = [alert];
245
+ }
246
+ }
247
+ }
@@ -0,0 +1,68 @@
1
+ import { SnmpVersionUtil } from "../../Types/Monitor/SnmpMonitor/SnmpVersion";
2
+
3
+ /*
4
+ * "Does this row carry enough to open an SNMP session with?"
5
+ *
6
+ * The question is asked of three different rows in turn at poll time - the
7
+ * device's own snmp* columns, the profile the device points at, and the
8
+ * profile the device's site points at - and the first row that answers yes is
9
+ * the one the device is walked with. A device with no usable set anywhere is
10
+ * pinged and never walked. So this function is the resolution order's
11
+ * predicate, and it is deliberately shaped to accept ANY object carrying the
12
+ * three fields it reads rather than a NetworkDevice or a
13
+ * NetworkSnmpCredentialProfile specifically: the caller hands it whichever
14
+ * row it is looking at and gets the same answer for each.
15
+ *
16
+ * "Usable" is the minimum an SNMP session needs to be attempted, not a
17
+ * guarantee it will succeed:
18
+ *
19
+ * - v1 / v2c: a non-empty community string. There is nothing else to send.
20
+ * - v3: a non-empty security name (username). Auth and privacy keys are
21
+ * legitimately absent at noAuthNoPriv, so their absence must not make a
22
+ * v3 row unusable; a wrong key at a higher level is the device's error to
23
+ * report, not this function's to predict.
24
+ *
25
+ * Whitespace-only values count as empty. A community string of " " is what
26
+ * a form submits when an operator clears the field without the browser
27
+ * sending null, and it is not a credential anything will accept.
28
+ *
29
+ * The version is read through SnmpVersionUtil.parse, never compared as raw
30
+ * text, for the reason that module documents: the stored spelling is "V3"
31
+ * and the enum's is "3", and a raw comparison sends a v3 row down the v2c
32
+ * branch. parse() treats a missing or unrecognised version as v2c, which is
33
+ * also the column default on both the device and the profile - so a row with
34
+ * a community string and no version at all is usable, exactly as it would be
35
+ * polled.
36
+ */
37
+
38
+ /*
39
+ * `| undefined` is spelled out on each field because the repo compiles with
40
+ * exactOptionalPropertyTypes: a caller building the carrier from a row it
41
+ * only partially selected (`{ snmpVersion: row.snmpVersion }`) hands over an
42
+ * explicit undefined, and that must type-check as readily as an omitted key.
43
+ */
44
+ export interface SnmpCredentialCarrier {
45
+ snmpVersion?: string | null | undefined;
46
+ snmpCommunityString?: string | null | undefined;
47
+ snmpV3Username?: string | null | undefined;
48
+ }
49
+
50
+ export type HasUsableCredentialsFunction = (
51
+ carrier: SnmpCredentialCarrier,
52
+ ) => boolean;
53
+
54
+ function isNonEmpty(value: string | null | undefined): boolean {
55
+ return typeof value === "string" && value.trim().length > 0;
56
+ }
57
+
58
+ export const hasUsableCredentials: HasUsableCredentialsFunction = (
59
+ carrier: SnmpCredentialCarrier,
60
+ ): boolean => {
61
+ if (SnmpVersionUtil.isV3(carrier.snmpVersion)) {
62
+ return isNonEmpty(carrier.snmpV3Username);
63
+ }
64
+
65
+ return isNonEmpty(carrier.snmpCommunityString);
66
+ };
67
+
68
+ export default hasUsableCredentials;
@@ -1,9 +1,8 @@
1
1
  import { DiscoveredNetworkDevice } from "../../Models/DatabaseModels/NetworkDeviceDiscoveryScan";
2
- import NetworkDeviceMonitoringMethod from "../../Types/NetworkDevice/NetworkDeviceMonitoringMethod";
3
2
  import ObjectID from "../../Types/ObjectID";
4
3
  import CidrMatchUtil from "../NetworkSite/CidrMatchUtil";
5
4
  import RulePatternMatchUtil from "../Rules/RulePatternMatchUtil";
6
- import { monitoringMethodForDiscoveredHost } from "./DiscoveryImportEligibility";
5
+ import { isPingOnlyDiscoveredHost } from "./DiscoveryImportEligibility";
7
6
  import ScanTargetUtil from "./ScanTargetUtil";
8
7
 
9
8
  /*
@@ -134,12 +133,21 @@ export function matchesOidPattern(
134
133
  }
135
134
 
136
135
  export class AutoImportRuleMatcher {
137
- // True when the host answered ping but not SNMP.
136
+ /*
137
+ * True when the host answered ping but not SNMP.
138
+ *
139
+ * Asked of the host's own SNMP answer (`isPingOnlyDiscoveredHost`), NOT of
140
+ * the method it would import under. Under ping-first polling EVERY
141
+ * discovered host imports as a Probe device, so
142
+ * `monitoringMethodForDiscoveredHost` is a constant — routing this gate
143
+ * through it made `isPingOnlyHost` permanently false and silently opened
144
+ * the default-closed gate below: one SNMP credential typo would have
145
+ * imported a whole subnet of half-identified hosts through rules that never
146
+ * opted in. How a host is MONITORED and what it ANSWERED are two different
147
+ * questions now, and this one is the second.
148
+ */
138
149
  private static isPingOnlyHost(host: DiscoveredNetworkDevice): boolean {
139
- return (
140
- monitoringMethodForDiscoveredHost(host) ===
141
- NetworkDeviceMonitoringMethod.Monitor
142
- );
150
+ return isPingOnlyDiscoveredHost(host);
143
151
  }
144
152
 
145
153
  /*