@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
@@ -5,7 +5,10 @@ import ObjectID from "../../Types/ObjectID";
5
5
  import SnmpScanConfigUtil, {
6
6
  DiscoveryScanSnmpConfig,
7
7
  } from "./SnmpScanConfigUtil";
8
- import { monitoringMethodForDiscoveredHost } from "./DiscoveryImportEligibility";
8
+ import {
9
+ isPingOnlyDiscoveredHost,
10
+ monitoringMethodForDiscoveredHost,
11
+ } from "./DiscoveryImportEligibility";
9
12
  import { normalizeReverseDnsName } from "./ReverseDnsNameUtil";
10
13
 
11
14
  /*
@@ -167,7 +170,8 @@ export function buildFallbackDeviceName(host: DiscoveredNetworkDevice): string {
167
170
  }
168
171
 
169
172
  /*
170
- * The scan columns the builder copies onto an SNMP device. The
173
+ * The scan columns the builder copies onto a device: the probe onto every
174
+ * device, the credentials onto the ones that answered SNMP. The
171
175
  * NetworkDeviceDiscoveryScan model satisfies this structurally, so both the
172
176
  * dashboard (holding a scan model) and the rule engine (holding a scan row it
173
177
  * selected itself) can pass their scan straight in.
@@ -177,7 +181,7 @@ export function buildFallbackDeviceName(host: DiscoveredNetworkDevice): string {
177
181
  * (and are still mirrored from the list's first entry). Neither is read
178
182
  * directly here — SnmpScanConfigUtil reconciles the two — but BOTH have to be
179
183
  * SELECTED by every caller, or the credentials silently arrive undefined and
180
- * the device is created unable to poll. That is what
184
+ * the device is created as a ping-only one. That is what
181
185
  * Common/Tests/Server/Services/AutoImportScanCredentialSelect.test.ts pins.
182
186
  */
183
187
  export interface DiscoveredDeviceScanSource {
@@ -197,11 +201,18 @@ export interface DiscoveredDeviceScanSource {
197
201
  /**
198
202
  * The NetworkDevice a discovered host imports as.
199
203
  *
200
- * An SNMP-reachable host becomes a polled device carrying the scan's probe
201
- * and credentials. A ping-only host becomes a monitor-backed device with no
202
- * probe, no credentials and polling off: it is recorded so it can belong to a
203
- * site and appear on the topology map, and binding a monitor to it stays a
204
- * separate, deliberate step.
204
+ * Every host becomes a Probe device polled by the scan's probe — the probe
205
+ * that just proved the host answers, so the one that can keep asking. An
206
+ * SNMP-reachable host also carries the credential set that answered it, so
207
+ * its first poll walks it for interfaces, inventory and health. A ping-only
208
+ * host carries no credentials at all: the probe pings it and nothing more, it
209
+ * has a status from its first poll, and adding credentials later on its
210
+ * Settings page is what turns the walk on.
211
+ *
212
+ * (It used to import as a monitor-backed device with no probe and polling
213
+ * off, which left it on "Pending" until an operator hand-bound a Ping monitor
214
+ * — issue #3447. Reachability is a built-in capability of every probe-polled
215
+ * device now, so that dead end is gone.)
205
216
  *
206
217
  * The caller supplies the name (normally `buildDeviceName(host)`) so the
207
218
  * name-collision retry can rebuild the same device under
@@ -263,12 +274,41 @@ export function buildNetworkDeviceFromDiscoveredHost(data: {
263
274
  monitoringMethodForDiscoveredHost(host);
264
275
  device.monitoringMethod = monitoringMethod;
265
276
 
266
- if (monitoringMethod === NetworkDeviceMonitoringMethod.Monitor) {
277
+ /*
278
+ * The scan's probe, on EVERY device. It is the probe that just reached this
279
+ * host — over ping at the very least — so it is the one that can keep
280
+ * polling it. Written explicitly rather than left to the column default:
281
+ * a Probe device with no probe is claimed by nothing and never polls, which
282
+ * is the "Pending forever" the whole change exists to end.
283
+ */
284
+ if (data.scan.probeId) {
285
+ // Re-wrapped: the scan may hold a serialized id rather than an ObjectID.
286
+ device.probeId = new ObjectID(data.scan.probeId.toString());
287
+ }
288
+
289
+ /*
290
+ * Polling on, for both kinds of host. The column defaults to true, but this
291
+ * function is the recipe both import paths share and "the probe polls this
292
+ * device" is the whole point of it, so the recipe says so itself rather
293
+ * than trusting a default that a ping-only host used to override to false.
294
+ */
295
+ device.isPollingEnabled = true;
296
+
297
+ if (isPingOnlyDiscoveredHost(host)) {
267
298
  /*
268
- * A ping-only host is never SNMP-polled, so the vendor-template
269
- * auto-apply (which keys off a polled sysObjectID) stays off too.
299
+ * A ping-only host carries NO credentials, decided BEFORE any config is
300
+ * looked up: `snmpConfigId` and `snmpReachable` are two fields of the
301
+ * same probe-written jsonb row, and nothing enforces that a ping-only row
302
+ * leaves the first one unset. A device that answered nothing but a ping
303
+ * must not import carrying a community string it rejected — it would be
304
+ * walked with it on every poll and read as an SNMP failure rather than
305
+ * as the credential-less device it is. The probe pings it and nothing
306
+ * more until credentials are added on its Settings page.
307
+ *
308
+ * The OID template and the vendor-template auto-apply stay off too: both
309
+ * key off SNMP data — a polled sysObjectID, a walked OID list — that
310
+ * this host did not supply and will not until it has credentials.
270
311
  */
271
- device.isPollingEnabled = false;
272
312
  return device;
273
313
  }
274
314
 
@@ -280,11 +320,6 @@ export function buildNetworkDeviceFromDiscoveredHost(data: {
280
320
  device.autoApplyVendorHealthTemplate = true;
281
321
  }
282
322
 
283
- if (data.scan.probeId) {
284
- // Re-wrapped: the scan may hold a serialized id rather than an ObjectID.
285
- device.probeId = new ObjectID(data.scan.probeId.toString());
286
- }
287
-
288
323
  /*
289
324
  * THE credential set that answered this host, not the scan's first one.
290
325
  *
@@ -4,10 +4,19 @@ import NetworkDeviceMonitoringMethod from "../../Types/NetworkDevice/NetworkDevi
4
4
  /*
5
5
  * Pure, react-free import rule for discovery scan results.
6
6
  *
7
- * Every host the sweep found alive is importable; what differs is HOW. A host
8
- * that answered SNMP becomes a polled device with the scan's credentials. A
9
- * host that answered only ping becomes a monitor-backed device: no probe, no
10
- * credentials, health supplied later by a monitor the operator binds to it.
7
+ * Every host the sweep found alive is importable, and every one of them
8
+ * imports as a probe-polled device: the scan's probe pings it on its schedule,
9
+ * and walks it over SNMP as well when it has credentials. What differs between
10
+ * a host that answered SNMP and one that only answered ping is therefore not
11
+ * HOW it is monitored but WHAT rides along — the SNMP host carries the scan's
12
+ * credential set that answered it, the ping-only host carries none and is
13
+ * simply pinged until somebody adds credentials.
14
+ *
15
+ * That is a change from the SNMP-first era, when a ping-only host had to
16
+ * import as a monitor-backed device with no probe and polling off, and read
17
+ * "Pending" until an operator hand-bound a Ping monitor to it (issue #3447).
18
+ * Reachability is a built-in capability of every probe-polled device now, so
19
+ * the ping-only host gets a status from its first poll like any other.
11
20
  *
12
21
  * Ping-only hosts used to be refused outright, on the reasoning that they
13
22
  * would turn up as ARP/FDB endpoints once their switch was monitored. That is
@@ -20,33 +29,56 @@ import NetworkDeviceMonitoringMethod from "../../Types/NetworkDevice/NetworkDevi
20
29
  * because the dashboard's Review dialog and the server-side auto-import rule
21
30
  * engine both decide "how does this host import" through it, and the two must
22
31
  * never disagree: the group a host is shown under in the dialog and the
23
- * monitoring method a rule imports it with are the same decision.
32
+ * device a rule imports it as are the same decision.
24
33
  */
25
34
 
35
+ /**
36
+ * True when the host answered ping but not SNMP — the "No SNMP" group in the
37
+ * Review dialog, and the host that imports with no credentials.
38
+ *
39
+ * Only an EXPLICIT snmpReachable === false is ping-only: scans stored before
40
+ * the field existed carry undefined, and every host on those scans answered
41
+ * SNMP (ping-only sweeps did not exist yet), so legacy rows keep importing
42
+ * with the scan's credentials.
43
+ *
44
+ * Nullish hosts read as NOT ping-only rather than throwing. `discoveredDevices`
45
+ * is jsonb written verbatim from the probe's payload and the only guard on it
46
+ * (DiscoveryScanOutcome.getDiscoveredHosts) checks that the VALUE is an array
47
+ * — never that its elements are objects. A single null element used to take
48
+ * the whole page down from inside a table cell or a modal body, where a thrown
49
+ * TypeError has nowhere useful to go. Every other kind of junk element (a
50
+ * number, a string, {}) already read as an SNMP host; null is simply
51
+ * consistent with them.
52
+ */
53
+ export function isPingOnlyDiscoveredHost(
54
+ host: DiscoveredNetworkDevice | null | undefined,
55
+ ): boolean {
56
+ return host?.snmpReachable === false;
57
+ }
58
+
26
59
  /**
27
60
  * Which monitoring method a discovered host should be imported under.
28
61
  *
29
- * Only an EXPLICIT snmpReachable === false means ping-only: scans stored
30
- * before the field existed carry undefined, and every host on those scans
31
- * answered SNMP (ping-only sweeps did not exist yet), so legacy rows keep
32
- * importing as SNMP devices.
62
+ * Probe, for every host. Under ping-first polling there is no discovered host
63
+ * a probe cannot monitor: the scan's probe just proved the host answers ping,
64
+ * and that is all a probe-polled device needs to have a status. SNMP is an
65
+ * enrichment layered on top when the host answered it, and
66
+ * `buildNetworkDeviceFromDiscoveredHost` decides that by
67
+ * `isPingOnlyDiscoveredHost`, not by this function.
68
+ *
69
+ * `Monitor` — a bound monitor's status IS the device's status — is an override
70
+ * an operator chooses on a device's Settings page for gear a probe cannot
71
+ * reach at all. Discovery never has grounds to choose it: every host it offers
72
+ * was reached by the probe that found it.
73
+ *
74
+ * Kept as a function, with the host as its argument, because it is the one
75
+ * seam through which the dialog and the rule engine ask the question, and a
76
+ * future rule that DID need to look at the host would land here.
33
77
  */
34
78
  export function monitoringMethodForDiscoveredHost(
35
- host: DiscoveredNetworkDevice | null | undefined,
79
+ _host: DiscoveredNetworkDevice | null | undefined,
36
80
  ): NetworkDeviceMonitoringMethod {
37
- /*
38
- * Nullish hosts read as SNMP rather than throwing. `discoveredDevices` is
39
- * jsonb written verbatim from the probe's payload and the only guard on it
40
- * (DiscoveryScanOutcome.getDiscoveredHosts) checks that the VALUE is an
41
- * array — never that its elements are objects. A single null element used
42
- * to take the whole page down from inside a table cell or a modal body,
43
- * where a thrown TypeError has nowhere useful to go. Every other kind of
44
- * junk element (a number, a string, {}) already read as SNMP; null is now
45
- * simply consistent with them.
46
- */
47
- return host?.snmpReachable === false
48
- ? NetworkDeviceMonitoringMethod.Monitor
49
- : NetworkDeviceMonitoringMethod.Snmp;
81
+ return NetworkDeviceMonitoringMethod.Probe;
50
82
  }
51
83
 
52
84
  /** True when the discovered host can be imported as a Network Device. */
@@ -93,6 +93,41 @@ export interface BuildPingMonitorData {
93
93
  seedIds: MonitorCriteriaSeedIds;
94
94
  }
95
95
 
96
+ /**
97
+ * Where a Ping monitor is being built FROM. The sentence it writes into the
98
+ * monitor's description is the only thing that differs, and it matters: an
99
+ * operator reading the monitor list months later should be told whether a
100
+ * scan, a form, or a bulk action put it there.
101
+ */
102
+ export enum PingMonitorOrigin {
103
+ // A host that answered a discovery sweep's ping but not its SNMP probe.
104
+ DiscoveryImport = "DiscoveryImport",
105
+ // The device create form, with "create a Ping monitor" ticked.
106
+ DeviceCreateForm = "DeviceCreateForm",
107
+ // The "Create Ping Monitor" button on a device's Overview or Monitors page.
108
+ DevicePage = "DevicePage",
109
+ // The device list's bulk "Create Ping Monitors" action.
110
+ BulkAction = "BulkAction",
111
+ }
112
+
113
+ export interface BuildPingMonitorForAddressData {
114
+ projectId: ObjectID;
115
+ /*
116
+ * The device's address as recorded on the device — an IP or a hostname.
117
+ * NetworkDevice.hostname is free text and required, so this is never empty
118
+ * for a real device; it is still validated because the bulk action and the
119
+ * create form both hand over whatever the operator typed.
120
+ */
121
+ address: string;
122
+ /*
123
+ * The name of the NetworkDevice this monitor will be bound to, so the two
124
+ * read as a pair in a monitor list that also contains unrelated monitors.
125
+ */
126
+ deviceName: string;
127
+ seedIds: MonitorCriteriaSeedIds;
128
+ origin: PingMonitorOrigin;
129
+ }
130
+
96
131
  /**
97
132
  * The monitor's name: "Ping <device name>", clamped to the column.
98
133
  *
@@ -157,24 +192,54 @@ function suppressIncidentCreation(step: MonitorStep): void {
157
192
  }
158
193
 
159
194
  /**
160
- * One ping-only discovered host -> the Ping monitor that will report its
161
- * health once bound to the device through `NetworkDevice.monitorId`.
195
+ * The sentence a provisioned monitor carries so its origin is legible later.
196
+ * Exported so the surfaces that build one can be tested against the exact
197
+ * wording rather than a paraphrase.
198
+ */
199
+ export function buildPingMonitorDescription(data: {
200
+ address: string;
201
+ origin: PingMonitorOrigin;
202
+ }): string {
203
+ const reachability: string = `Reachability for ${data.address}`;
204
+
205
+ switch (data.origin) {
206
+ case PingMonitorOrigin.DiscoveryImport:
207
+ return `${reachability}, created when this device was imported from a network discovery scan. The device answered ping but not SNMP, so this monitor is what reports whether it is up.`;
208
+ case PingMonitorOrigin.DeviceCreateForm:
209
+ return `${reachability}, created with this network device. The device is monitor-backed — nothing polls it over SNMP — so this monitor is what reports whether it is up.`;
210
+ case PingMonitorOrigin.BulkAction:
211
+ return `${reachability}, created by the device list's "Create Ping Monitors" action. The device is monitor-backed — nothing polls it over SNMP — so this monitor is what reports whether it is up.`;
212
+ case PingMonitorOrigin.DevicePage:
213
+ default:
214
+ return `${reachability}, created from this network device's page. The device is monitor-backed — nothing polls it over SNMP — so this monitor is what reports whether it is up.`;
215
+ }
216
+ }
217
+
218
+ /**
219
+ * One device address -> the Ping monitor that will report the device's
220
+ * health once bound to it through `NetworkDevice.monitorId`.
162
221
  *
163
- * The caller creates this monitor FIRST, then creates the device carrying the
164
- * new monitor's id: `NetworkDeviceService.onCreateSuccess` stamps the
165
- * monitor's current status onto the device at bind time, so the device's
166
- * status pill resolves on the first render rather than waiting for the
167
- * monitor's next status CHANGE (which on a healthy network may never come —
168
- * that was OneUptime/oneuptime#3392).
222
+ * This is the shape every provisioning surface shares: discovery import, the
223
+ * device create form, the "Create Ping Monitor" button on a device's page and
224
+ * the bulk action on the device list. They differ only in where the address
225
+ * and the name come from and in the origin sentence; the monitor itself
226
+ * type, interval, criteria, incident suppression is identical, which is
227
+ * what lets an operator treat every provisioned monitor the same way.
228
+ *
229
+ * Order of operations is the caller's: discovery creates the monitor FIRST
230
+ * and then the device carrying its id (so the create-time stamp resolves the
231
+ * pill immediately), while the create form and the bulk action create or
232
+ * already have the device and bind afterwards — which re-stamps through
233
+ * `NetworkDeviceService.onUpdateSuccess`, so the pill resolves just the same.
169
234
  */
170
- export function buildPingMonitorForDiscoveredHost(
171
- data: BuildPingMonitorData,
235
+ export function buildPingMonitorForAddress(
236
+ data: BuildPingMonitorForAddressData,
172
237
  ): Monitor {
173
- const address: string = (data.host?.ipAddress || "").trim();
238
+ const address: string = (data.address || "").trim();
174
239
 
175
240
  if (!address) {
176
241
  throw new Error(
177
- "A discovered host needs an address before a Ping monitor can be built for it.",
242
+ "A device needs an address before a Ping monitor can be built for it.",
178
243
  );
179
244
  }
180
245
 
@@ -182,7 +247,10 @@ export function buildPingMonitorForDiscoveredHost(
182
247
 
183
248
  monitor.projectId = new ObjectID(data.projectId.toString());
184
249
  monitor.name = buildPingMonitorName(data.deviceName);
185
- monitor.description = `Reachability for ${address}, created when this device was imported from a network discovery scan. The device answered ping but not SNMP, so this monitor is what reports whether it is up.`;
250
+ monitor.description = buildPingMonitorDescription({
251
+ address: address,
252
+ origin: data.origin,
253
+ });
186
254
  monitor.monitorType = MonitorType.Ping;
187
255
  monitor.monitoringInterval = PING_MONITOR_INTERVAL;
188
256
 
@@ -213,3 +281,37 @@ export function buildPingMonitorForDiscoveredHost(
213
281
 
214
282
  return monitor;
215
283
  }
284
+
285
+ /**
286
+ * One ping-only discovered host -> the Ping monitor that will report its
287
+ * health once bound to the device through `NetworkDevice.monitorId`.
288
+ *
289
+ * The caller creates this monitor FIRST, then creates the device carrying the
290
+ * new monitor's id: `NetworkDeviceService.onCreateSuccess` stamps the
291
+ * monitor's current status onto the device at bind time, so the device's
292
+ * status pill resolves on the first render rather than waiting for the
293
+ * monitor's next status CHANGE (which on a healthy network may never come —
294
+ * that was OneUptime/oneuptime#3392).
295
+ *
296
+ * A thin adapter over `buildPingMonitorForAddress`: the only thing a
297
+ * discovered host contributes is its address.
298
+ */
299
+ export function buildPingMonitorForDiscoveredHost(
300
+ data: BuildPingMonitorData,
301
+ ): Monitor {
302
+ const address: string = (data.host?.ipAddress || "").trim();
303
+
304
+ if (!address) {
305
+ throw new Error(
306
+ "A discovered host needs an address before a Ping monitor can be built for it.",
307
+ );
308
+ }
309
+
310
+ return buildPingMonitorForAddress({
311
+ projectId: data.projectId,
312
+ address: address,
313
+ deviceName: data.deviceName,
314
+ seedIds: data.seedIds,
315
+ origin: PingMonitorOrigin.DiscoveryImport,
316
+ });
317
+ }
@@ -1,6 +1,7 @@
1
1
  import DeviceReachabilityUtil, {
2
2
  NetworkDeviceReachability,
3
3
  } from "../NetworkDevice/DeviceReachabilityUtil";
4
+ import { NetworkDeviceMonitoringMethodUtil } from "../../Types/NetworkDevice/NetworkDeviceMonitoringMethod";
4
5
  import SiteHealthRollupPolicy, {
5
6
  DefaultSiteOfflineThresholdPercent,
6
7
  } from "../../Types/NetworkSite/SiteHealthRollupPolicy";
@@ -25,14 +26,26 @@ import SiteHealthRollupPolicy, {
25
26
  *
26
27
  * Both policies agree on which devices get a vote at all: a device that has
27
28
  * never reported anything is not evidence of an outage and is skipped by
28
- * each of them.
29
+ * each of them. And both agree on what a device's vote IS: for a
30
+ * monitor-backed device the stamped MonitorStatus, for a probe-polled one
31
+ * the outcome of its last poll — the stamp on a probe-polled device is
32
+ * informational (see the field docs), the same precedence the device list
33
+ * pill, the site card and the map apply.
29
34
  */
30
35
 
31
36
  // One device's health inputs, denormalized by the rollup engine.
32
37
  export interface DeviceHealthState {
33
38
  /*
34
39
  * The MonitorStatus stamped by the monitor bridge (string form). When set
35
- * together with its priority, it is the device's authoritative status.
40
+ * together with its priority ON A MONITOR-BACKED DEVICE, it is the
41
+ * device's authoritative status.
42
+ *
43
+ * A probe-polled device can carry one too — a Network Device monitor
44
+ * watching its walk stamps it, and an "interface down → Offline" criterion
45
+ * will stamp Offline on a switch that answers every ping. Its health
46
+ * source is the poll (`isReachable`, which is what its own pill reads), so
47
+ * the stamp is ignored here for it, or one dark port would turn a site of
48
+ * answering devices offline while every row under it reads Up.
36
49
  */
37
50
  currentMonitorStatusId?: string | null | undefined;
38
51
  // Priority of that status row; missing when the row no longer exists.
@@ -50,16 +63,32 @@ export interface DeviceHealthState {
50
63
  */
51
64
  monitorStatusIsOperational?: boolean | null | undefined;
52
65
  /*
53
- * The SNMP fallback for devices no monitor stamps, resolved by the shared
54
- * DeviceReachabilityUtil rule: the OUTCOME of the last poll, not the age
55
- * of the last success. Rolling a site up from freshness alone is what
56
- * turned "the probe is behind on a 900-device fleet" into a red site card
57
- * over devices that were all answering.
66
+ * The poll verdict for probe-polled devices, resolved by the shared
67
+ * DeviceReachabilityUtil rule: the OUTCOME of the last poll (ping, or the
68
+ * SNMP walk), not the age of the last success. Rolling a site up from
69
+ * freshness alone is what turned "the probe is behind on a 900-device
70
+ * fleet" into a red site card over devices that were all answering.
58
71
  */
59
72
  isReachable?: boolean | null | undefined;
60
73
  lastPolledAt?: Date | null | undefined;
61
74
  lastSeenAt?: Date | null | undefined;
62
75
  pollingIntervalInMinutes?: number | null | undefined;
76
+ /*
77
+ * How this device's health is established. NULL, empty and anything
78
+ * unrecognised read as Probe — see NetworkDeviceMonitoringMethodUtil.parse,
79
+ * which is why an omitted value keeps every existing caller on the poll
80
+ * rule unchanged.
81
+ *
82
+ * Load-bearing twice. It decides whether the stamped status above is the
83
+ * device's vote at all (only for a monitor-backed device). And a
84
+ * monitor-backed device (monitoringMethod "Monitor") that has no stamp
85
+ * yet — or whose stamped row could not be resolved — has poll columns
86
+ * that mean nothing (NULL, or the last thing a probe found before it
87
+ * stopped asking). The shared rule reads it as Pending and both policies
88
+ * skip it, exactly as they skip a never-polled probe device, rather than
89
+ * letting a months-old lastSeenAt cast a vote against the site.
90
+ */
91
+ monitoringMethod?: string | null | undefined;
63
92
  /*
64
93
  * How many real devices this entry stands for.
65
94
  *
@@ -118,13 +147,13 @@ export class SiteStatusRollupUtil {
118
147
  * operational/offline rows) - the caller treats null as "leave the site's
119
148
  * status untouched".
120
149
  *
121
- * Per device: a stamped monitor status (with a known priority) wins;
122
- * otherwise the device's SNMP reachability maps Up to the project's
123
- * isOperationalState row and Down to its isOfflineState row. A device
124
- * that has never been polled contributes nothing at all - it is not
125
- * evidence of an outage, and counting it as one used to pin a site red
126
- * for as long as it took the first walk to land. Priority ties keep the
127
- * first contributor (stable).
150
+ * Per device: on a monitor-backed device a stamped monitor status (with a
151
+ * known priority) is the vote; otherwise the device's poll reachability
152
+ * maps Up to the project's isOperationalState row and Down to its
153
+ * isOfflineState row. A device that has never been polled contributes
154
+ * nothing at all - it is not evidence of an outage, and counting it as
155
+ * one used to pin a site red for as long as it took the first poll to
156
+ * land. Priority ties keep the first contributor (stable).
128
157
  */
129
158
  public static worstStatus(data: {
130
159
  deviceStates: Array<DeviceHealthState>;
@@ -148,6 +177,7 @@ export class SiteStatusRollupUtil {
148
177
  let candidate: RollupStatusOption | null = null;
149
178
 
150
179
  if (
180
+ SiteStatusRollupUtil.isStampAuthoritative(device) &&
151
181
  device.currentMonitorStatusId &&
152
182
  typeof device.monitorStatusPriority === "number" &&
153
183
  Number.isFinite(device.monitorStatusPriority)
@@ -200,12 +230,12 @@ export class SiteStatusRollupUtil {
200
230
  * How the subtree splits between operational and not, in DEVICES rather
201
231
  * than in buckets.
202
232
  *
203
- * A device counts as non-operational when its stamped MonitorStatus is not
204
- * the operational one, or - for devices no monitor stamps - when its SNMP
205
- * reachability is Down. Never-reported devices are excluded from both the
206
- * numerator and the denominator, so a region half-way through its first
207
- * discovery walk is scored on the half that has answered rather than
208
- * marked down for the half that has not.
233
+ * A monitor-backed device counts as non-operational when its stamped
234
+ * MonitorStatus is not the operational one; a probe-polled device when its
235
+ * poll reachability is Down. Never-reported devices are excluded from both
236
+ * the numerator and the denominator, so a region half-way through its
237
+ * first discovery walk is scored on the half that has answered rather
238
+ * than marked down for the half that has not.
209
239
  */
210
240
  public static deviceHealthShare(data: {
211
241
  deviceStates: Array<DeviceHealthState>;
@@ -238,6 +268,7 @@ export class SiteStatusRollupUtil {
238
268
  const count: number = SiteStatusRollupUtil.deviceCountOf(device);
239
269
 
240
270
  if (
271
+ SiteStatusRollupUtil.isStampAuthoritative(device) &&
241
272
  device.currentMonitorStatusId &&
242
273
  typeof device.monitorStatusIsOperational === "boolean"
243
274
  ) {
@@ -415,6 +446,19 @@ export class SiteStatusRollupUtil {
415
446
  return Math.floor(value);
416
447
  }
417
448
 
449
+ /*
450
+ * Whether this device's stamped MonitorStatus is its vote — true only for
451
+ * a monitor-backed device. One gate for both policies, so the same fleet
452
+ * cannot read differently depending on which one a site uses; and the
453
+ * same gate DeviceHealthStateUtil and the topology map apply, so the site
454
+ * card, the map and this rollup describe one network.
455
+ */
456
+ private static isStampAuthoritative(device: DeviceHealthState): boolean {
457
+ return NetworkDeviceMonitoringMethodUtil.isMonitorBacked(
458
+ device.monitoringMethod,
459
+ );
460
+ }
461
+
418
462
  private static deviceCountOf(device: DeviceHealthState): number {
419
463
  if (
420
464
  typeof device.deviceCount !== "number" ||
@@ -436,6 +480,8 @@ export class SiteStatusRollupUtil {
436
480
  lastPolledAt: device.lastPolledAt,
437
481
  lastSeenAt: device.lastSeenAt,
438
482
  pollingIntervalInMinutes: device.pollingIntervalInMinutes,
483
+ // See the field docs: decides whether the columns above mean anything.
484
+ monitoringMethod: device.monitoringMethod,
439
485
  },
440
486
  now,
441
487
  );