@oneuptime/common 12.0.32 → 12.0.33

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (597) hide show
  1. package/Models/AnalyticsModels/Span.ts +14 -0
  2. package/Models/DatabaseModels/EnterpriseLicense.ts +56 -0
  3. package/Models/DatabaseModels/Index.ts +10 -0
  4. package/Models/DatabaseModels/Monitor.ts +76 -0
  5. package/Models/DatabaseModels/NetworkAlertPolicy.ts +690 -0
  6. package/Models/DatabaseModels/NetworkDevice.ts +176 -1
  7. package/Models/DatabaseModels/NetworkSite.ts +201 -2
  8. package/Models/DatabaseModels/NetworkSiteType.ts +102 -3
  9. package/Models/DatabaseModels/NetworkSnmpCredentialProfile.ts +841 -0
  10. package/Models/DatabaseModels/TelemetryException.ts +119 -0
  11. package/Models/DatabaseModels/UserNotificationEmailRollupBatch.ts +334 -0
  12. package/Models/DatabaseModels/UserNotificationEmailRollupItem.ts +370 -0
  13. package/Models/DatabaseModels/UserNotificationEmailRollupSetting.ts +282 -0
  14. package/Server/API/EnterpriseLicenseAPI.ts +391 -64
  15. package/Server/API/LlmProviderAPI.ts +137 -22
  16. package/Server/EnvironmentConfig.ts +14 -0
  17. package/Server/Infrastructure/Postgres/SchemaMigrations/1790700000000-AddNetworkSiteTypeParentHierarchy.ts +55 -0
  18. package/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddEnterpriseLicenseUsageProvenance.ts +31 -0
  19. package/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddTelemetryExceptionErrorClass.ts +124 -0
  20. package/Server/Infrastructure/Postgres/SchemaMigrations/1791000000000-AddUserNotificationEmailRollup.ts +132 -0
  21. package/Server/Infrastructure/Postgres/SchemaMigrations/1791100000000-AddUserNotificationEmailRollupSetting.ts +79 -0
  22. package/Server/Infrastructure/Postgres/SchemaMigrations/1791200000000-AddNetworkSnmpCredentialProfilesAndAlertPolicies.ts +191 -0
  23. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +12 -0
  24. package/Server/Infrastructure/QueueWorker.ts +38 -8
  25. package/Server/Middleware/BearerTokenAuthorization.ts +12 -0
  26. package/Server/Middleware/ProjectAuthorization.ts +11 -0
  27. package/Server/Middleware/SCIMAuthorization.ts +12 -0
  28. package/Server/Middleware/TelemetryIngest.ts +11 -0
  29. package/Server/Services/AIBillingService.ts +101 -27
  30. package/Server/Services/EnterpriseLicenseInstanceService.ts +197 -0
  31. package/Server/Services/EnterpriseLicenseService.ts +55 -0
  32. package/Server/Services/Index.ts +10 -0
  33. package/Server/Services/MonitorService.ts +143 -21
  34. package/Server/Services/MonitorStatusTimelineService.ts +150 -8
  35. package/Server/Services/MonitorTemplateService.ts +217 -1
  36. package/Server/Services/NetworkAlertPolicyEngineService.ts +2159 -0
  37. package/Server/Services/NetworkAlertPolicyService.ts +944 -0
  38. package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +9 -10
  39. package/Server/Services/NetworkDeviceAutoImportRuleService.ts +60 -15
  40. package/Server/Services/NetworkDeviceService.ts +1032 -73
  41. package/Server/Services/NetworkSiteService.ts +1502 -129
  42. package/Server/Services/NetworkSiteTypeService.ts +1216 -0
  43. package/Server/Services/NetworkSnmpCredentialProfileService.ts +238 -0
  44. package/Server/Services/NotificationService.ts +118 -28
  45. package/Server/Services/ProjectService.ts +105 -48
  46. package/Server/Services/StatusPagePrivateUserService.ts +103 -3
  47. package/Server/Services/UserNotificationEmailRollupBatchService.ts +78 -0
  48. package/Server/Services/UserNotificationEmailRollupItemService.ts +79 -0
  49. package/Server/Services/UserNotificationEmailRollupSettingService.ts +113 -0
  50. package/Server/Services/UserNotificationSettingService.ts +62 -25
  51. package/Server/Services/UserService.ts +95 -0
  52. package/Server/Types/Database/QueryHelper.ts +2 -2
  53. package/Server/Utils/AI/Chat/ObservabilityChatPrompt.ts +14 -3
  54. package/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.ts +10 -0
  55. package/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.ts +10 -0
  56. package/Server/Utils/AI/SRE/Insights/InsightTriageRunner.ts +62 -1
  57. package/Server/Utils/AI/Toolbox/AlertTools.ts +15 -1
  58. package/Server/Utils/Billing/BillingFailureNoticeThrottle.ts +80 -0
  59. package/Server/Utils/DataSource/HttpFetch.ts +9 -2
  60. package/Server/Utils/EmailRollup/EmailRollupConstants.ts +98 -0
  61. package/Server/Utils/EmailRollup/EmailRollupFlushRunner.ts +872 -0
  62. package/Server/Utils/EmailRollup/EmailRollupRenderer.ts +781 -0
  63. package/Server/Utils/EmailRollup/EmailRollupWriter.ts +368 -0
  64. package/Server/Utils/LLM/LLMService.ts +78 -0
  65. package/Server/Utils/LogRedaction.ts +8 -0
  66. package/Server/Utils/Logger.ts +79 -1
  67. package/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.ts +190 -0
  68. package/Server/Utils/Monitor/Criteria/EvaluateOverTime.ts +9 -2
  69. package/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.ts +61 -1
  70. package/Server/Utils/Monitor/MonitorCriteriaDataExtractor.ts +14 -0
  71. package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +49 -0
  72. package/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.ts +255 -4
  73. package/Server/Utils/Monitor/MonitorMetricUtil.ts +41 -0
  74. package/Server/Utils/Monitor/MonitorTemplateUtil.ts +43 -0
  75. package/Server/Utils/Monitor/NetworkDeviceHydrationUtil.ts +499 -19
  76. package/Server/Utils/Monitor/NetworkDeviceMetricUtil.ts +66 -10
  77. package/Server/Utils/Monitor/NetworkDeviceWalkUtil.ts +238 -44
  78. package/Server/Utils/Monitor/NetworkInventoryUtil.ts +146 -39
  79. package/Server/Utils/NetworkDevice/DeviceHealthAggregation.ts +31 -18
  80. package/Server/Utils/NetworkSite/NetworkSiteHierarchyLock.ts +213 -0
  81. package/Server/Utils/OutboundUserAgent.ts +152 -0
  82. package/Server/Utils/StartServer.ts +51 -19
  83. package/Server/Utils/Telemetry/CaptureSpan.ts +32 -8
  84. package/Server/Utils/Telemetry/ErrorClassResolver.ts +120 -0
  85. package/Server/Utils/Telemetry/SpanUtil.ts +33 -0
  86. package/Server/Utils/Telemetry.ts +198 -51
  87. package/Server/Views/Partials/SensitiveUrlToken.ejs +140 -0
  88. package/Tests/App/Dashboard/AddNeighborToMonitoringModal.test.tsx +134 -33
  89. package/Tests/App/Dashboard/AskAiSuggestedPrompts.test.ts +279 -0
  90. package/Tests/App/Dashboard/DashboardEditPermissions.test.tsx +517 -0
  91. package/Tests/App/Dashboard/DashboardVariablesDiscard.test.tsx +26 -0
  92. package/Tests/App/Dashboard/DeviceStatusHero.test.tsx +588 -0
  93. package/Tests/App/Dashboard/DiscoveryScanWizardValidation.test.tsx +18 -9
  94. package/Tests/App/Dashboard/MonitorCreateFromMonitorBackedDevice.test.tsx +632 -0
  95. package/Tests/App/Dashboard/MonitorRecommendationCreateProgress.test.tsx +682 -0
  96. package/Tests/App/Dashboard/MonitorTypePicker.test.tsx +4 -2
  97. package/Tests/App/Dashboard/NetworkDeviceCreateFormMonitorBinding.test.tsx +676 -0
  98. package/Tests/App/Dashboard/NetworkDeviceCreateFormPingMonitor.test.tsx +791 -0
  99. package/Tests/App/Dashboard/NetworkDeviceCreateFormProbeAndSnmp.test.tsx +833 -0
  100. package/Tests/App/Dashboard/NetworkDeviceCriteriaFilter.test.ts +161 -0
  101. package/Tests/App/Dashboard/NetworkDeviceSettingsMonitoringSection.test.tsx +458 -0
  102. package/Tests/App/Dashboard/NetworkSideMenu.test.tsx +41 -5
  103. package/Tests/App/Dashboard/PingMonitorProvisioning.test.ts +368 -0
  104. package/Tests/App/Dashboard/RecommendationCard.test.tsx +796 -0
  105. package/Tests/App/Dashboard/RecommendationToolbar.test.tsx +519 -0
  106. package/Tests/App/Dashboard/RecommendationsList.test.tsx +661 -0
  107. package/Tests/App/Dashboard/UseBulkCreatePingMonitors.test.tsx +899 -0
  108. package/Tests/App/Dashboard/UseBulkSnmpCredentialProfileActions.test.tsx +732 -0
  109. package/Tests/App/SensitiveUrlTokenBootstrap.test.ts +256 -0
  110. package/Tests/App/StatusPage/StatusPageIndexPageRobotsMeta.test.ts +11 -1
  111. package/Tests/App/StatusPage/StatusPageLoginCodeBootstrap.test.ts +9 -4
  112. package/Tests/Models/NetworkSiteHierarchy.test.ts +41 -4
  113. package/Tests/Server/API/EnterpriseLicenseReportUserCount.test.ts +951 -7
  114. package/Tests/Server/API/LlmProviderConnectionTest.test.ts +522 -0
  115. package/Tests/Server/Infrastructure/Postgres/NetworkSnmpCredentialProfilesAndAlertPoliciesMigration.test.ts +854 -0
  116. package/Tests/Server/Infrastructure/Postgres/SchemaMigrationsOrdering.test.ts +18 -0
  117. package/Tests/Server/Infrastructure/Postgres/UserNotificationEmailRollupTableMigration.test.ts +535 -0
  118. package/Tests/Server/Services/AIChatPrivacyPin.test.ts +560 -0
  119. package/Tests/Server/Services/BillingRechargeOwnerEmailGuards.test.ts +783 -0
  120. package/Tests/Server/Services/EnterpriseLicenseInstanceServiceDeletionUsage.test.ts +707 -0
  121. package/Tests/Server/Services/EnterpriseLicenseServiceUsageAggregationLock.test.ts +329 -0
  122. package/Tests/Server/Services/MonitorServiceDeleteNetworkDeviceCleanup.test.ts +294 -0
  123. package/Tests/Server/Services/MonitorStatusBridgeProbePath.test.ts +802 -0
  124. package/Tests/Server/Services/MonitorStatusTimelineService.test.ts +72 -2
  125. package/Tests/Server/Services/NetworkAlertPolicyEngineHooks.test.ts +752 -0
  126. package/Tests/Server/Services/NetworkAlertPolicyEngineService.test.ts +1849 -0
  127. package/Tests/Server/Services/NetworkAlertPolicyModel.test.ts +1793 -0
  128. package/Tests/Server/Services/NetworkDeviceAutoImportRuleEngineService.test.ts +47 -4
  129. package/Tests/Server/Services/NetworkDeviceAutoImportRuleService.test.ts +97 -12
  130. package/Tests/Server/Services/NetworkDeviceAutoMonitorLifecycle.test.ts +148 -3
  131. package/Tests/Server/Services/NetworkDeviceMonitorBindingUpdateGuard.test.ts +514 -0
  132. package/Tests/Server/Services/NetworkDeviceMonitorStatusStamp.test.ts +447 -58
  133. package/Tests/Server/Services/NetworkDeviceMonitoringMethodTransition.test.ts +739 -0
  134. package/Tests/Server/Services/NetworkDevicePollingTenancy.test.ts +501 -0
  135. package/Tests/Server/Services/NetworkDeviceSiteDefaultProbe.test.ts +432 -0
  136. package/Tests/Server/Services/NetworkSiteMonitoringDefaults.test.ts +498 -0
  137. package/Tests/Server/Services/NetworkSiteRollupPolicyAndMaintenance.test.ts +337 -55
  138. package/Tests/Server/Services/NetworkSiteService.test.ts +1868 -131
  139. package/Tests/Server/Services/NetworkSiteTypeService.test.ts +1109 -0
  140. package/Tests/Server/Services/NetworkSnmpCredentialProfileModel.test.ts +926 -0
  141. package/Tests/Server/Services/NetworkSnmpCredentialProfileService.test.ts +796 -0
  142. package/Tests/Server/Services/ProjectServiceNetworkSiteTypeDefaults.test.ts +214 -0
  143. package/Tests/Server/Services/StatusPagePrivateUserEmailChangePasswordResetExpiry.test.ts +269 -0
  144. package/Tests/Server/Services/UserEmailChangePasswordResetExpiry.test.ts +472 -0
  145. package/Tests/Server/Services/UserNotificationEmailRollupModels.test.ts +569 -0
  146. package/Tests/Server/Services/UserNotificationEmailRollupSettingModel.test.ts +314 -0
  147. package/Tests/Server/Services/UserNotificationEmailRollupSettingService.test.ts +409 -0
  148. package/Tests/Server/Services/UserNotificationSettingRollupRouting.test.ts +856 -0
  149. package/Tests/Server/Services/UserNotificationSettingWorkspaceChannels.test.ts +102 -1
  150. package/Tests/Server/Types/Database/Permissions/DashboardAccessPermission.test.ts +321 -0
  151. package/Tests/Server/Types/Database/QueryHelperOperators.test.ts +17 -0
  152. package/Tests/Server/Utils/AI/AlertMonitorFilters.test.ts +124 -0
  153. package/Tests/Server/Utils/AI/Insights/InsightTriageRunner.test.ts +208 -0
  154. package/Tests/Server/Utils/AI/LLMServiceToolCalling.test.ts +235 -0
  155. package/Tests/Server/Utils/AI/ObservabilityChatPrompt.test.ts +253 -0
  156. package/Tests/Server/Utils/Captcha.test.ts +422 -0
  157. package/Tests/Server/Utils/DataSource/HttpFetch.test.ts +96 -2
  158. package/Tests/Server/Utils/Database/MigrationFailureLog.test.ts +466 -0
  159. package/Tests/Server/Utils/EmailRollup/EmailRollupFlushRunnerBehaviour.test.ts +1096 -0
  160. package/Tests/Server/Utils/EmailRollup/EmailRollupFlushRunnerClaim.test.ts +466 -0
  161. package/Tests/Server/Utils/EmailRollup/EmailRollupRenderer.test.ts +1428 -0
  162. package/Tests/Server/Utils/EmailRollup/EmailRollupTestHarness.ts +752 -0
  163. package/Tests/Server/Utils/EmailRollup/EmailRollupWriter.test.ts +864 -0
  164. package/Tests/Server/Utils/LoggerFaultDemotion.test.ts +346 -0
  165. package/Tests/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.test.ts +633 -0
  166. package/Tests/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.test.ts +196 -0
  167. package/Tests/Server/Utils/Monitor/DatabaseMetricWrite.test.ts +367 -0
  168. package/Tests/Server/Utils/Monitor/MonitorCriteriaObservationBuilderUnits.test.ts +100 -0
  169. package/Tests/Server/Utils/Monitor/MonitorStepResourceIdentity.test.ts +5 -0
  170. package/Tests/Server/Utils/Monitor/NetworkDeviceHydrationUtil.test.ts +512 -31
  171. package/Tests/Server/Utils/Monitor/NetworkDeviceMetricUtil.test.ts +252 -0
  172. package/Tests/Server/Utils/Monitor/NetworkDeviceWalkUtil.test.ts +479 -42
  173. package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +351 -5
  174. package/Tests/Server/Utils/NetworkDevice/DeviceHealthAggregation.test.ts +136 -12
  175. package/Tests/Server/Utils/NetworkSite/NetworkSiteHierarchyLock.test.ts +306 -0
  176. package/Tests/Server/Utils/OutboundUserAgent.test.ts +266 -0
  177. package/Tests/Server/Utils/SecurityEvent/ThreatIntel/TaxiiClientUserAgent.test.ts +141 -0
  178. package/Tests/Server/Utils/Telemetry/ErrorClassResolver.test.ts +298 -0
  179. package/Tests/Server/Utils/Telemetry.test.ts +456 -66
  180. package/Tests/Types/Monitor/DatabaseMetricCatalog.test.ts +388 -0
  181. package/Tests/Types/Monitor/MonitorStepDatabaseMonitor.test.ts +243 -0
  182. package/Tests/Types/Monitor/MonitorStepDefaultTelemetryConfig.test.ts +1 -0
  183. package/Tests/Types/Monitor/MonitorType.test.ts +1 -0
  184. package/Tests/Types/Monitor/MonitorTypeKeywords.test.ts +16 -7
  185. package/Tests/Types/Monitor/NetworkDeviceAlertPack.test.ts +60 -0
  186. package/Tests/Types/NetworkDevice/NetworkAlertPolicyScope.test.ts +655 -0
  187. package/Tests/Types/NetworkDevice/NetworkDeviceMonitoringMethod.test.ts +115 -26
  188. package/Tests/Types/NetworkSite/DefaultNetworkSiteType.test.ts +39 -0
  189. package/Tests/Types/NotificationSetting/NotificationEmailRollupPolicy.test.ts +299 -0
  190. package/Tests/Types/Telemetry/ErrorClass.test.ts +483 -0
  191. package/Tests/UI/Components/BasicRadioButtons.test.tsx +336 -0
  192. package/Tests/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.test.ts +15 -0
  193. package/Tests/UI/Components/ProgressBar.test.tsx +38 -2
  194. package/Tests/UI/Components/SideMenuItem.test.tsx +226 -4
  195. package/Tests/UI/Components/SideMenuSection.test.tsx +310 -0
  196. package/Tests/UI/Components/SideOverSubmitState.test.tsx +335 -0
  197. package/Tests/UI/Utils/PageScrollLock.test.tsx +377 -0
  198. package/Tests/UI/Utils/PermissionGate.test.ts +78 -0
  199. package/Tests/UI/Utils/SensitiveUrlToken.test.ts +140 -0
  200. package/Tests/Utils/EnterpriseLicenseSeats.test.ts +69 -0
  201. package/Tests/Utils/EnterpriseLicenseSync.test.ts +7 -1
  202. package/Tests/Utils/EnterpriseLicenseUsage.test.ts +433 -2
  203. package/Tests/Utils/Monitor/MonitorMetricType.test.ts +280 -1
  204. package/Tests/Utils/Monitor/MonitorSummarySnapshotUtil.test.ts +1 -0
  205. package/Tests/Utils/Monitor/NetworkTopologyUtil.test.ts +38 -0
  206. package/Tests/Utils/NetworkDevice/DeviceHealthStateUtil.test.ts +284 -23
  207. package/Tests/Utils/NetworkDevice/DeviceReachabilityUtil.test.ts +177 -0
  208. package/Tests/Utils/NetworkDevice/MonitoringMethodThreadedClassifiers.test.ts +992 -0
  209. package/Tests/Utils/NetworkDevice/NetworkAlertPolicyBootstrapUtil.test.ts +427 -0
  210. package/Tests/Utils/NetworkDevice/ReachabilityStampConsistency.test.ts +185 -0
  211. package/Tests/Utils/NetworkDevice/SnmpCredentialUtil.test.ts +268 -0
  212. package/Tests/Utils/NetworkDiscovery/AutoImportRuleMatcher.test.ts +55 -5
  213. package/Tests/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.test.ts +98 -21
  214. package/Tests/Utils/NetworkDiscovery/DiscoveryImportEligibility.test.ts +98 -20
  215. package/Tests/Utils/NetworkDiscovery/DiscoveryReverseDnsChain.test.ts +8 -7
  216. package/Tests/Utils/NetworkDiscovery/PingMonitorBuilderForAddress.test.ts +274 -0
  217. package/Tests/Utils/NetworkSite/SiteStatusRollupUtil.test.ts +230 -51
  218. package/Tests/Utils/NetworkSite/TypeHierarchyUtil.test.ts +209 -0
  219. package/Tests/Utils/Telemetry/CaptureSpanExportGating.test.ts +145 -0
  220. package/Types/AI/ExceptionAIClassification.ts +10 -24
  221. package/Types/Email/EmailTemplateType.ts +2 -0
  222. package/Types/EnterpriseLicense/EnterpriseLicenseInstanceSummary.ts +5 -0
  223. package/Types/EnterpriseLicense/EnterpriseLicenseUsageSnapshot.ts +13 -0
  224. package/Types/EnterpriseLicense/EnterpriseLicenseUserCountSource.ts +6 -0
  225. package/Types/Exception/ApiException.ts +10 -0
  226. package/Types/Exception/BadDataException.ts +11 -0
  227. package/Types/Exception/BadRequestException.ts +11 -0
  228. package/Types/Exception/Exception.ts +65 -0
  229. package/Types/Exception/ForbiddenException.ts +10 -0
  230. package/Types/Exception/NotAuthenticatedException.ts +10 -0
  231. package/Types/Exception/NotAuthorizedException.ts +10 -0
  232. package/Types/Exception/NotFoundException.ts +11 -0
  233. package/Types/Exception/PayloadTooLargeException.ts +11 -0
  234. package/Types/Exception/PaymentRequiredException.ts +10 -0
  235. package/Types/Exception/ServiceUnavailableException.ts +10 -0
  236. package/Types/Exception/SsoAuthorizationException.ts +10 -0
  237. package/Types/Exception/TenantNotFoundException.ts +11 -0
  238. package/Types/Exception/TimeoutException.ts +10 -0
  239. package/Types/Exception/TooManyRequestsException.ts +10 -0
  240. package/Types/Exception/UnableToReachServer.ts +10 -0
  241. package/Types/Exception/WebsiteRequestException.ts +10 -0
  242. package/Types/Monitor/CriteriaFilter.ts +60 -2
  243. package/Types/Monitor/DatabaseMetricCatalog.ts +693 -0
  244. package/Types/Monitor/DatabaseMonitor/DatabaseMonitorResponse.ts +83 -0
  245. package/Types/Monitor/MonitorCriteriaInstance.ts +76 -0
  246. package/Types/Monitor/MonitorMetricType.ts +71 -0
  247. package/Types/Monitor/MonitorStep.ts +76 -0
  248. package/Types/Monitor/MonitorStepDatabaseMonitor.ts +171 -0
  249. package/Types/Monitor/MonitorStepSqlMonitor.ts +2 -20
  250. package/Types/Monitor/MonitorType.ts +47 -1
  251. package/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.ts +22 -1
  252. package/Types/Monitor/SqlConnectionConfig.ts +31 -0
  253. package/Types/NetworkDevice/NetworkAlertPolicyScope.ts +343 -0
  254. package/Types/NetworkDevice/NetworkDeviceMonitoringMethod.ts +42 -22
  255. package/Types/NetworkSite/DefaultNetworkSiteTypeHierarchy.ts +30 -0
  256. package/Types/NotificationSetting/NotificationEmailRollupCategory.ts +255 -0
  257. package/Types/NotificationSetting/NotificationEmailRollupPolicy.ts +104 -0
  258. package/Types/Permission.ts +90 -0
  259. package/Types/Probe/ProbeMonitorResponse.ts +16 -0
  260. package/Types/Telemetry/ErrorClass.ts +274 -0
  261. package/Types/Telemetry/UnitOfWork.ts +59 -0
  262. package/UI/Components/CommandPalette/CommandPalette.tsx +2 -8
  263. package/UI/Components/EditionLabel/EditionLabel.tsx +4 -0
  264. package/UI/Components/Modal/Modal.tsx +2 -8
  265. package/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.ts +44 -0
  266. package/UI/Components/ProgressBar/ProgressBar.tsx +12 -1
  267. package/UI/Components/RadioButtons/BasicRadioButtons.tsx +37 -7
  268. package/UI/Components/SideMenu/SideMenu.tsx +123 -5
  269. package/UI/Components/SideMenu/SideMenuItem.tsx +76 -84
  270. package/UI/Components/SideMenu/SideMenuSection.tsx +55 -23
  271. package/UI/Components/SideOver/SideOver.tsx +21 -20
  272. package/UI/Utils/PageScrollLock.ts +79 -3
  273. package/UI/Utils/PermissionGate.ts +61 -0
  274. package/UI/Utils/SensitiveUrlToken.ts +112 -0
  275. package/UI/Utils/TestLLMProvider.ts +11 -0
  276. package/Utils/EnterpriseLicense/EnterpriseLicenseSeats.ts +16 -0
  277. package/Utils/EnterpriseLicense/EnterpriseLicenseUsage.ts +191 -11
  278. package/Utils/Monitor/MonitorMetricType.ts +153 -1
  279. package/Utils/Monitor/NetworkTopologyUtil.ts +23 -3
  280. package/Utils/NetworkDevice/DeviceHealthStateUtil.ts +65 -14
  281. package/Utils/NetworkDevice/DeviceReachabilityUtil.ts +43 -14
  282. package/Utils/NetworkDevice/NetworkAlertPolicyBootstrapUtil.ts +247 -0
  283. package/Utils/NetworkDevice/SnmpCredentialUtil.ts +68 -0
  284. package/Utils/NetworkDiscovery/AutoImportRuleMatcher.ts +15 -7
  285. package/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.ts +52 -17
  286. package/Utils/NetworkDiscovery/DiscoveryImportEligibility.ts +55 -23
  287. package/Utils/NetworkDiscovery/PingMonitorBuilder.ts +115 -13
  288. package/Utils/NetworkSite/SiteStatusRollupUtil.ts +66 -20
  289. package/Utils/NetworkSite/TypeHierarchyUtil.ts +313 -0
  290. package/build/dist/Models/AnalyticsModels/Span.js +14 -0
  291. package/build/dist/Models/AnalyticsModels/Span.js.map +1 -1
  292. package/build/dist/Models/DatabaseModels/EnterpriseLicense.js +59 -0
  293. package/build/dist/Models/DatabaseModels/EnterpriseLicense.js.map +1 -1
  294. package/build/dist/Models/DatabaseModels/Index.js +10 -0
  295. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  296. package/build/dist/Models/DatabaseModels/Monitor.js +75 -0
  297. package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
  298. package/build/dist/Models/DatabaseModels/NetworkAlertPolicy.js +713 -0
  299. package/build/dist/Models/DatabaseModels/NetworkAlertPolicy.js.map +1 -0
  300. package/build/dist/Models/DatabaseModels/NetworkDevice.js +180 -1
  301. package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
  302. package/build/dist/Models/DatabaseModels/NetworkSite.js +200 -2
  303. package/build/dist/Models/DatabaseModels/NetworkSite.js.map +1 -1
  304. package/build/dist/Models/DatabaseModels/NetworkSiteType.js +102 -3
  305. package/build/dist/Models/DatabaseModels/NetworkSiteType.js.map +1 -1
  306. package/build/dist/Models/DatabaseModels/NetworkSnmpCredentialProfile.js +878 -0
  307. package/build/dist/Models/DatabaseModels/NetworkSnmpCredentialProfile.js.map +1 -0
  308. package/build/dist/Models/DatabaseModels/TelemetryException.js +123 -0
  309. package/build/dist/Models/DatabaseModels/TelemetryException.js.map +1 -1
  310. package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupBatch.js +363 -0
  311. package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupBatch.js.map +1 -0
  312. package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupItem.js +402 -0
  313. package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupItem.js.map +1 -0
  314. package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupSetting.js +296 -0
  315. package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupSetting.js.map +1 -0
  316. package/build/dist/Server/API/EnterpriseLicenseAPI.js +273 -60
  317. package/build/dist/Server/API/EnterpriseLicenseAPI.js.map +1 -1
  318. package/build/dist/Server/API/LlmProviderAPI.js +108 -13
  319. package/build/dist/Server/API/LlmProviderAPI.js.map +1 -1
  320. package/build/dist/Server/EnvironmentConfig.js +12 -0
  321. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  322. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790700000000-AddNetworkSiteTypeParentHierarchy.js +24 -0
  323. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790700000000-AddNetworkSiteTypeParentHierarchy.js.map +1 -0
  324. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddEnterpriseLicenseUsageProvenance.js +16 -0
  325. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddEnterpriseLicenseUsageProvenance.js.map +1 -0
  326. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddTelemetryExceptionErrorClass.js +111 -0
  327. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddTelemetryExceptionErrorClass.js.map +1 -0
  328. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791000000000-AddUserNotificationEmailRollup.js +77 -0
  329. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791000000000-AddUserNotificationEmailRollup.js.map +1 -0
  330. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791100000000-AddUserNotificationEmailRollupSetting.js +50 -0
  331. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791100000000-AddUserNotificationEmailRollupSetting.js.map +1 -0
  332. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791200000000-AddNetworkSnmpCredentialProfilesAndAlertPolicies.js +83 -0
  333. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791200000000-AddNetworkSnmpCredentialProfilesAndAlertPolicies.js.map +1 -0
  334. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +12 -0
  335. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  336. package/build/dist/Server/Infrastructure/QueueWorker.js +33 -5
  337. package/build/dist/Server/Infrastructure/QueueWorker.js.map +1 -1
  338. package/build/dist/Server/Middleware/BearerTokenAuthorization.js +12 -0
  339. package/build/dist/Server/Middleware/BearerTokenAuthorization.js.map +1 -1
  340. package/build/dist/Server/Middleware/ProjectAuthorization.js +11 -0
  341. package/build/dist/Server/Middleware/ProjectAuthorization.js.map +1 -1
  342. package/build/dist/Server/Middleware/SCIMAuthorization.js +12 -0
  343. package/build/dist/Server/Middleware/SCIMAuthorization.js.map +1 -1
  344. package/build/dist/Server/Middleware/TelemetryIngest.js +11 -0
  345. package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
  346. package/build/dist/Server/Services/AIBillingService.js +70 -16
  347. package/build/dist/Server/Services/AIBillingService.js.map +1 -1
  348. package/build/dist/Server/Services/EnterpriseLicenseInstanceService.js +167 -0
  349. package/build/dist/Server/Services/EnterpriseLicenseInstanceService.js.map +1 -1
  350. package/build/dist/Server/Services/EnterpriseLicenseService.js +39 -0
  351. package/build/dist/Server/Services/EnterpriseLicenseService.js.map +1 -1
  352. package/build/dist/Server/Services/Index.js +10 -0
  353. package/build/dist/Server/Services/Index.js.map +1 -1
  354. package/build/dist/Server/Services/MonitorService.js +119 -21
  355. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  356. package/build/dist/Server/Services/MonitorStatusTimelineService.js +127 -8
  357. package/build/dist/Server/Services/MonitorStatusTimelineService.js.map +1 -1
  358. package/build/dist/Server/Services/MonitorTemplateService.js +162 -0
  359. package/build/dist/Server/Services/MonitorTemplateService.js.map +1 -1
  360. package/build/dist/Server/Services/NetworkAlertPolicyEngineService.js +1683 -0
  361. package/build/dist/Server/Services/NetworkAlertPolicyEngineService.js.map +1 -0
  362. package/build/dist/Server/Services/NetworkAlertPolicyService.js +732 -0
  363. package/build/dist/Server/Services/NetworkAlertPolicyService.js.map +1 -0
  364. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +10 -9
  365. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
  366. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js +54 -11
  367. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js.map +1 -1
  368. package/build/dist/Server/Services/NetworkDeviceService.js +841 -70
  369. package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
  370. package/build/dist/Server/Services/NetworkSiteService.js +1145 -107
  371. package/build/dist/Server/Services/NetworkSiteService.js.map +1 -1
  372. package/build/dist/Server/Services/NetworkSiteTypeService.js +863 -0
  373. package/build/dist/Server/Services/NetworkSiteTypeService.js.map +1 -1
  374. package/build/dist/Server/Services/NetworkSnmpCredentialProfileService.js +217 -0
  375. package/build/dist/Server/Services/NetworkSnmpCredentialProfileService.js.map +1 -0
  376. package/build/dist/Server/Services/NotificationService.js +80 -17
  377. package/build/dist/Server/Services/NotificationService.js.map +1 -1
  378. package/build/dist/Server/Services/ProjectService.js +66 -30
  379. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  380. package/build/dist/Server/Services/StatusPagePrivateUserService.js +92 -2
  381. package/build/dist/Server/Services/StatusPagePrivateUserService.js.map +1 -1
  382. package/build/dist/Server/Services/UserNotificationEmailRollupBatchService.js +76 -0
  383. package/build/dist/Server/Services/UserNotificationEmailRollupBatchService.js.map +1 -0
  384. package/build/dist/Server/Services/UserNotificationEmailRollupItemService.js +77 -0
  385. package/build/dist/Server/Services/UserNotificationEmailRollupItemService.js.map +1 -0
  386. package/build/dist/Server/Services/UserNotificationEmailRollupSettingService.js +111 -0
  387. package/build/dist/Server/Services/UserNotificationEmailRollupSettingService.js.map +1 -0
  388. package/build/dist/Server/Services/UserNotificationSettingService.js +46 -20
  389. package/build/dist/Server/Services/UserNotificationSettingService.js.map +1 -1
  390. package/build/dist/Server/Services/UserService.js +90 -0
  391. package/build/dist/Server/Services/UserService.js.map +1 -1
  392. package/build/dist/Server/Types/Database/QueryHelper.js +1 -1
  393. package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
  394. package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js +14 -3
  395. package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js.map +1 -1
  396. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js +10 -0
  397. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js.map +1 -1
  398. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js +10 -0
  399. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js.map +1 -1
  400. package/build/dist/Server/Utils/AI/SRE/Insights/InsightTriageRunner.js +54 -1
  401. package/build/dist/Server/Utils/AI/SRE/Insights/InsightTriageRunner.js.map +1 -1
  402. package/build/dist/Server/Utils/AI/Toolbox/AlertTools.js +18 -4
  403. package/build/dist/Server/Utils/AI/Toolbox/AlertTools.js.map +1 -1
  404. package/build/dist/Server/Utils/Billing/BillingFailureNoticeThrottle.js +59 -0
  405. package/build/dist/Server/Utils/Billing/BillingFailureNoticeThrottle.js.map +1 -0
  406. package/build/dist/Server/Utils/DataSource/HttpFetch.js +2 -1
  407. package/build/dist/Server/Utils/DataSource/HttpFetch.js.map +1 -1
  408. package/build/dist/Server/Utils/EmailRollup/EmailRollupConstants.js +91 -0
  409. package/build/dist/Server/Utils/EmailRollup/EmailRollupConstants.js.map +1 -0
  410. package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js +691 -0
  411. package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js.map +1 -0
  412. package/build/dist/Server/Utils/EmailRollup/EmailRollupRenderer.js +497 -0
  413. package/build/dist/Server/Utils/EmailRollup/EmailRollupRenderer.js.map +1 -0
  414. package/build/dist/Server/Utils/EmailRollup/EmailRollupWriter.js +257 -0
  415. package/build/dist/Server/Utils/EmailRollup/EmailRollupWriter.js.map +1 -0
  416. package/build/dist/Server/Utils/LLM/LLMService.js +64 -1
  417. package/build/dist/Server/Utils/LLM/LLMService.js.map +1 -1
  418. package/build/dist/Server/Utils/LogRedaction.js +8 -0
  419. package/build/dist/Server/Utils/LogRedaction.js.map +1 -1
  420. package/build/dist/Server/Utils/Logger.js +63 -1
  421. package/build/dist/Server/Utils/Logger.js.map +1 -1
  422. package/build/dist/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.js +141 -0
  423. package/build/dist/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.js.map +1 -0
  424. package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js +8 -1
  425. package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js.map +1 -1
  426. package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js +51 -1
  427. package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js.map +1 -1
  428. package/build/dist/Server/Utils/Monitor/MonitorCriteriaDataExtractor.js +7 -0
  429. package/build/dist/Server/Utils/Monitor/MonitorCriteriaDataExtractor.js.map +1 -1
  430. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +37 -0
  431. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
  432. package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js +158 -6
  433. package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js.map +1 -1
  434. package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js +33 -0
  435. package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js.map +1 -1
  436. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +32 -0
  437. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
  438. package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js +330 -21
  439. package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js.map +1 -1
  440. package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js +55 -10
  441. package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js.map +1 -1
  442. package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js +178 -49
  443. package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js.map +1 -1
  444. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +119 -29
  445. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
  446. package/build/dist/Server/Utils/NetworkDevice/DeviceHealthAggregation.js +30 -17
  447. package/build/dist/Server/Utils/NetworkDevice/DeviceHealthAggregation.js.map +1 -1
  448. package/build/dist/Server/Utils/NetworkSite/NetworkSiteHierarchyLock.js +158 -0
  449. package/build/dist/Server/Utils/NetworkSite/NetworkSiteHierarchyLock.js.map +1 -0
  450. package/build/dist/Server/Utils/OutboundUserAgent.js +123 -0
  451. package/build/dist/Server/Utils/OutboundUserAgent.js.map +1 -0
  452. package/build/dist/Server/Utils/StartServer.js +38 -14
  453. package/build/dist/Server/Utils/StartServer.js.map +1 -1
  454. package/build/dist/Server/Utils/Telemetry/CaptureSpan.js +28 -8
  455. package/build/dist/Server/Utils/Telemetry/CaptureSpan.js.map +1 -1
  456. package/build/dist/Server/Utils/Telemetry/ErrorClassResolver.js +95 -0
  457. package/build/dist/Server/Utils/Telemetry/ErrorClassResolver.js.map +1 -0
  458. package/build/dist/Server/Utils/Telemetry/SpanUtil.js +29 -0
  459. package/build/dist/Server/Utils/Telemetry/SpanUtil.js.map +1 -1
  460. package/build/dist/Server/Utils/Telemetry.js +162 -46
  461. package/build/dist/Server/Utils/Telemetry.js.map +1 -1
  462. package/build/dist/Types/AI/ExceptionAIClassification.js +10 -24
  463. package/build/dist/Types/AI/ExceptionAIClassification.js.map +1 -1
  464. package/build/dist/Types/Email/EmailTemplateType.js +1 -0
  465. package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
  466. package/build/dist/Types/EnterpriseLicense/EnterpriseLicenseUsageSnapshot.js +2 -0
  467. package/build/dist/Types/EnterpriseLicense/EnterpriseLicenseUsageSnapshot.js.map +1 -0
  468. package/build/dist/Types/EnterpriseLicense/EnterpriseLicenseUserCountSource.js +7 -0
  469. package/build/dist/Types/EnterpriseLicense/EnterpriseLicenseUserCountSource.js.map +1 -0
  470. package/build/dist/Types/Exception/ApiException.js +9 -0
  471. package/build/dist/Types/Exception/ApiException.js.map +1 -1
  472. package/build/dist/Types/Exception/BadDataException.js +10 -0
  473. package/build/dist/Types/Exception/BadDataException.js.map +1 -1
  474. package/build/dist/Types/Exception/BadRequestException.js +10 -0
  475. package/build/dist/Types/Exception/BadRequestException.js.map +1 -1
  476. package/build/dist/Types/Exception/Exception.js +56 -0
  477. package/build/dist/Types/Exception/Exception.js.map +1 -1
  478. package/build/dist/Types/Exception/ForbiddenException.js +9 -0
  479. package/build/dist/Types/Exception/ForbiddenException.js.map +1 -1
  480. package/build/dist/Types/Exception/NotAuthenticatedException.js +9 -0
  481. package/build/dist/Types/Exception/NotAuthenticatedException.js.map +1 -1
  482. package/build/dist/Types/Exception/NotAuthorizedException.js +9 -0
  483. package/build/dist/Types/Exception/NotAuthorizedException.js.map +1 -1
  484. package/build/dist/Types/Exception/NotFoundException.js +10 -0
  485. package/build/dist/Types/Exception/NotFoundException.js.map +1 -1
  486. package/build/dist/Types/Exception/PayloadTooLargeException.js +10 -0
  487. package/build/dist/Types/Exception/PayloadTooLargeException.js.map +1 -1
  488. package/build/dist/Types/Exception/PaymentRequiredException.js +9 -0
  489. package/build/dist/Types/Exception/PaymentRequiredException.js.map +1 -1
  490. package/build/dist/Types/Exception/ServiceUnavailableException.js +9 -0
  491. package/build/dist/Types/Exception/ServiceUnavailableException.js.map +1 -1
  492. package/build/dist/Types/Exception/SsoAuthorizationException.js +9 -0
  493. package/build/dist/Types/Exception/SsoAuthorizationException.js.map +1 -1
  494. package/build/dist/Types/Exception/TenantNotFoundException.js +10 -0
  495. package/build/dist/Types/Exception/TenantNotFoundException.js.map +1 -1
  496. package/build/dist/Types/Exception/TimeoutException.js +9 -0
  497. package/build/dist/Types/Exception/TimeoutException.js.map +1 -1
  498. package/build/dist/Types/Exception/TooManyRequestsException.js +9 -0
  499. package/build/dist/Types/Exception/TooManyRequestsException.js.map +1 -1
  500. package/build/dist/Types/Exception/UnableToReachServer.js +9 -0
  501. package/build/dist/Types/Exception/UnableToReachServer.js.map +1 -1
  502. package/build/dist/Types/Exception/WebsiteRequestException.js +9 -0
  503. package/build/dist/Types/Exception/WebsiteRequestException.js.map +1 -1
  504. package/build/dist/Types/Monitor/CriteriaFilter.js +45 -2
  505. package/build/dist/Types/Monitor/CriteriaFilter.js.map +1 -1
  506. package/build/dist/Types/Monitor/DatabaseMetricCatalog.js +594 -0
  507. package/build/dist/Types/Monitor/DatabaseMetricCatalog.js.map +1 -0
  508. package/build/dist/Types/Monitor/DatabaseMonitor/DatabaseMonitorResponse.js +21 -0
  509. package/build/dist/Types/Monitor/DatabaseMonitor/DatabaseMonitorResponse.js.map +1 -0
  510. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js +70 -0
  511. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
  512. package/build/dist/Types/Monitor/MonitorMetricType.js +61 -0
  513. package/build/dist/Types/Monitor/MonitorMetricType.js.map +1 -1
  514. package/build/dist/Types/Monitor/MonitorStep.js +54 -0
  515. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  516. package/build/dist/Types/Monitor/MonitorStepDatabaseMonitor.js +122 -0
  517. package/build/dist/Types/Monitor/MonitorStepDatabaseMonitor.js.map +1 -0
  518. package/build/dist/Types/Monitor/MonitorStepSqlMonitor.js.map +1 -1
  519. package/build/dist/Types/Monitor/MonitorType.js +45 -1
  520. package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
  521. package/build/dist/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.js +21 -1
  522. package/build/dist/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.js.map +1 -1
  523. package/build/dist/Types/Monitor/SqlConnectionConfig.js +2 -0
  524. package/build/dist/Types/Monitor/SqlConnectionConfig.js.map +1 -0
  525. package/build/dist/Types/NetworkDevice/NetworkAlertPolicyScope.js +172 -0
  526. package/build/dist/Types/NetworkDevice/NetworkAlertPolicyScope.js.map +1 -0
  527. package/build/dist/Types/NetworkDevice/NetworkDeviceMonitoringMethod.js +40 -22
  528. package/build/dist/Types/NetworkDevice/NetworkDeviceMonitoringMethod.js.map +1 -1
  529. package/build/dist/Types/NetworkSite/DefaultNetworkSiteTypeHierarchy.js +26 -0
  530. package/build/dist/Types/NetworkSite/DefaultNetworkSiteTypeHierarchy.js.map +1 -0
  531. package/build/dist/Types/NotificationSetting/NotificationEmailRollupCategory.js +186 -0
  532. package/build/dist/Types/NotificationSetting/NotificationEmailRollupCategory.js.map +1 -0
  533. package/build/dist/Types/NotificationSetting/NotificationEmailRollupPolicy.js +87 -0
  534. package/build/dist/Types/NotificationSetting/NotificationEmailRollupPolicy.js.map +1 -0
  535. package/build/dist/Types/Permission.js +80 -0
  536. package/build/dist/Types/Permission.js.map +1 -1
  537. package/build/dist/Types/Telemetry/ErrorClass.js +216 -0
  538. package/build/dist/Types/Telemetry/ErrorClass.js.map +1 -0
  539. package/build/dist/Types/Telemetry/UnitOfWork.js +59 -0
  540. package/build/dist/Types/Telemetry/UnitOfWork.js.map +1 -0
  541. package/build/dist/UI/Components/CommandPalette/CommandPalette.js +2 -7
  542. package/build/dist/UI/Components/CommandPalette/CommandPalette.js.map +1 -1
  543. package/build/dist/UI/Components/EditionLabel/EditionLabel.js +3 -0
  544. package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
  545. package/build/dist/UI/Components/Modal/Modal.js +2 -7
  546. package/build/dist/UI/Components/Modal/Modal.js.map +1 -1
  547. package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js +39 -0
  548. package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js.map +1 -1
  549. package/build/dist/UI/Components/ProgressBar/ProgressBar.js +12 -1
  550. package/build/dist/UI/Components/ProgressBar/ProgressBar.js.map +1 -1
  551. package/build/dist/UI/Components/RadioButtons/BasicRadioButtons.js +6 -6
  552. package/build/dist/UI/Components/RadioButtons/BasicRadioButtons.js.map +1 -1
  553. package/build/dist/UI/Components/SideMenu/SideMenu.js +67 -5
  554. package/build/dist/UI/Components/SideMenu/SideMenu.js.map +1 -1
  555. package/build/dist/UI/Components/SideMenu/SideMenuItem.js +49 -53
  556. package/build/dist/UI/Components/SideMenu/SideMenuItem.js.map +1 -1
  557. package/build/dist/UI/Components/SideMenu/SideMenuSection.js +25 -7
  558. package/build/dist/UI/Components/SideMenu/SideMenuSection.js.map +1 -1
  559. package/build/dist/UI/Components/SideOver/SideOver.js +5 -20
  560. package/build/dist/UI/Components/SideOver/SideOver.js.map +1 -1
  561. package/build/dist/UI/Utils/PageScrollLock.js +31 -3
  562. package/build/dist/UI/Utils/PageScrollLock.js.map +1 -1
  563. package/build/dist/UI/Utils/PermissionGate.js +42 -1
  564. package/build/dist/UI/Utils/PermissionGate.js.map +1 -1
  565. package/build/dist/UI/Utils/SensitiveUrlToken.js +97 -0
  566. package/build/dist/UI/Utils/SensitiveUrlToken.js.map +1 -0
  567. package/build/dist/UI/Utils/TestLLMProvider.js +4 -5
  568. package/build/dist/UI/Utils/TestLLMProvider.js.map +1 -1
  569. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js +15 -0
  570. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js.map +1 -1
  571. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js +111 -9
  572. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js.map +1 -1
  573. package/build/dist/Utils/Monitor/MonitorMetricType.js +109 -1
  574. package/build/dist/Utils/Monitor/MonitorMetricType.js.map +1 -1
  575. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +8 -3
  576. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
  577. package/build/dist/Utils/NetworkDevice/DeviceHealthStateUtil.js +27 -7
  578. package/build/dist/Utils/NetworkDevice/DeviceHealthStateUtil.js.map +1 -1
  579. package/build/dist/Utils/NetworkDevice/DeviceReachabilityUtil.js +7 -5
  580. package/build/dist/Utils/NetworkDevice/DeviceReachabilityUtil.js.map +1 -1
  581. package/build/dist/Utils/NetworkDevice/NetworkAlertPolicyBootstrapUtil.js +180 -0
  582. package/build/dist/Utils/NetworkDevice/NetworkAlertPolicyBootstrapUtil.js.map +1 -0
  583. package/build/dist/Utils/NetworkDevice/SnmpCredentialUtil.js +12 -0
  584. package/build/dist/Utils/NetworkDevice/SnmpCredentialUtil.js.map +1 -0
  585. package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js +15 -5
  586. package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js.map +1 -1
  587. package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js +44 -15
  588. package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js.map +1 -1
  589. package/build/dist/Utils/NetworkDiscovery/DiscoveryImportEligibility.js +52 -23
  590. package/build/dist/Utils/NetworkDiscovery/DiscoveryImportEligibility.js.map +1 -1
  591. package/build/dist/Utils/NetworkDiscovery/PingMonitorBuilder.js +85 -13
  592. package/build/dist/Utils/NetworkDiscovery/PingMonitorBuilder.js.map +1 -1
  593. package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js +30 -15
  594. package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js.map +1 -1
  595. package/build/dist/Utils/NetworkSite/TypeHierarchyUtil.js +191 -0
  596. package/build/dist/Utils/NetworkSite/TypeHierarchyUtil.js.map +1 -0
  597. package/package.json +2 -2
@@ -0,0 +1,427 @@
1
+ import { describe, expect, test } from "@jest/globals";
2
+ import MonitorTemplate from "../../../Models/DatabaseModels/MonitorTemplate";
3
+ import NetworkAlertPolicy from "../../../Models/DatabaseModels/NetworkAlertPolicy";
4
+ import { JSONObject } from "../../../Types/JSON";
5
+ import MonitorCriteriaInstance from "../../../Types/Monitor/MonitorCriteriaInstance";
6
+ import MonitorStep from "../../../Types/Monitor/MonitorStep";
7
+ import MonitorSteps from "../../../Types/Monitor/MonitorSteps";
8
+ import MonitorType from "../../../Types/Monitor/MonitorType";
9
+ import NetworkDeviceAlertPackUtil, {
10
+ NetworkDeviceAlertPackItem,
11
+ } from "../../../Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack";
12
+ import { NetworkAlertPolicyScopeUtil } from "../../../Types/NetworkDevice/NetworkAlertPolicyScope";
13
+ import ObjectID from "../../../Types/ObjectID";
14
+ import NetworkDeviceMonitorTemplateUtil from "../../../Utils/Monitor/NetworkDeviceMonitorTemplateUtil";
15
+ import NetworkAlertPolicyBootstrapUtil, {
16
+ RECOMMENDED_POLICY_NAME,
17
+ RECOMMENDED_TEMPLATE_MARKER,
18
+ RECOMMENDED_TEMPLATE_NAME,
19
+ RecommendedMonitorTemplateSeedIds,
20
+ } from "../../../Utils/NetworkDevice/NetworkAlertPolicyBootstrapUtil";
21
+
22
+ /*
23
+ * The bootstrap is the one path that builds a Network Device template with
24
+ * nobody looking at the monitor form, so nothing catches a half-filled
25
+ * criteria before the engine clones it onto a fleet. What has to hold:
26
+ *
27
+ * - the template is a Network Device template whose one step carries the
28
+ * alert pack, item for item;
29
+ * - every incident-creating item has an incident, every alert-creating
30
+ * item has an alert, at the severities it was given, auto-resolving;
31
+ * - the statuses are threaded through: offline on the incident items,
32
+ * online as the step's default;
33
+ * - the step has no device (the engine binds one per device) but has the
34
+ * block the engine's rebind requires;
35
+ * - the marker is a fixed string in the description, so the settings page
36
+ * finds the template again instead of minting a second one;
37
+ * - the recommended policy is unscoped and points at the template.
38
+ */
39
+
40
+ const PROJECT_ID: ObjectID = new ObjectID(
41
+ "11111111-1111-4111-8111-111111111111",
42
+ );
43
+ const INCIDENT_SEVERITY_ID: ObjectID = new ObjectID(
44
+ "22222222-2222-4222-8222-222222222222",
45
+ );
46
+ const ALERT_SEVERITY_ID: ObjectID = new ObjectID(
47
+ "33333333-3333-4333-8333-333333333333",
48
+ );
49
+ const ONLINE_STATUS_ID: ObjectID = new ObjectID(
50
+ "44444444-4444-4444-8444-444444444444",
51
+ );
52
+ const OFFLINE_STATUS_ID: ObjectID = new ObjectID(
53
+ "55555555-5555-4555-8555-555555555555",
54
+ );
55
+ const TEMPLATE_ID: ObjectID = new ObjectID(
56
+ "66666666-6666-4666-8666-666666666666",
57
+ );
58
+ const DEVICE_ID: ObjectID = new ObjectID(
59
+ "77777777-7777-4777-8777-777777777777",
60
+ );
61
+
62
+ const SEED_IDS: RecommendedMonitorTemplateSeedIds = {
63
+ projectId: PROJECT_ID,
64
+ incidentSeverityId: INCIDENT_SEVERITY_ID,
65
+ alertSeverityId: ALERT_SEVERITY_ID,
66
+ onlineMonitorStatusId: ONLINE_STATUS_ID,
67
+ offlineMonitorStatusId: OFFLINE_STATUS_ID,
68
+ };
69
+
70
+ type BuildTemplateFunction = () => MonitorTemplate;
71
+
72
+ const buildTemplate: BuildTemplateFunction = (): MonitorTemplate => {
73
+ return NetworkAlertPolicyBootstrapUtil.buildRecommendedMonitorTemplate(
74
+ SEED_IDS,
75
+ );
76
+ };
77
+
78
+ type CriteriaOfFunction = (
79
+ template: MonitorTemplate,
80
+ ) => Array<MonitorCriteriaInstance>;
81
+
82
+ const criteriaOf: CriteriaOfFunction = (
83
+ template: MonitorTemplate,
84
+ ): Array<MonitorCriteriaInstance> => {
85
+ const step: MonitorStep | undefined =
86
+ template.monitorSteps?.data?.monitorStepsInstanceArray[0];
87
+
88
+ return step?.data?.monitorCriteria?.data?.monitorCriteriaInstanceArray || [];
89
+ };
90
+
91
+ describe("NetworkAlertPolicyBootstrapUtil.buildRecommendedMonitorTemplate", () => {
92
+ test("is a Network Device template in the project, named and marked", () => {
93
+ const template: MonitorTemplate = buildTemplate();
94
+
95
+ expect(template.monitorType).toBe(MonitorType.NetworkDevice);
96
+ expect(template.projectId?.toString()).toBe(PROJECT_ID.toString());
97
+ expect(template.templateName).toBe(RECOMMENDED_TEMPLATE_NAME);
98
+ expect(template.templateDescription).toContain(RECOMMENDED_TEMPLATE_MARKER);
99
+ /*
100
+ * Deliberately blank: a default monitor name becomes a suffix on every
101
+ * provisioned monitor's name.
102
+ */
103
+ expect(template.monitorName).toBeUndefined();
104
+ });
105
+
106
+ /*
107
+ * The settings page finds the template by this string. Changing it would
108
+ * orphan every template already minted and make the action mint another.
109
+ */
110
+ test("the marker is a fixed, versioned string", () => {
111
+ expect(RECOMMENDED_TEMPLATE_MARKER).toBe(
112
+ "[oneuptime:network-alert-pack:v1]",
113
+ );
114
+ });
115
+
116
+ test("has exactly one step, carrying the alert pack item for item", () => {
117
+ const template: MonitorTemplate = buildTemplate();
118
+ const packItems: Array<NetworkDeviceAlertPackItem> =
119
+ NetworkDeviceAlertPackUtil.getPackItems();
120
+
121
+ expect(template.monitorSteps?.data?.monitorStepsInstanceArray).toHaveLength(
122
+ 1,
123
+ );
124
+
125
+ const criteria: Array<MonitorCriteriaInstance> = criteriaOf(template);
126
+
127
+ expect(criteria).toHaveLength(packItems.length);
128
+ expect(
129
+ criteria.map((criteriaInstance: MonitorCriteriaInstance): string => {
130
+ return criteriaInstance.data?.name || "";
131
+ }),
132
+ ).toEqual(
133
+ packItems.map((item: NetworkDeviceAlertPackItem): string => {
134
+ return item.name;
135
+ }),
136
+ );
137
+
138
+ for (const criteriaInstance of criteria) {
139
+ expect(criteriaInstance.data?.isEnabled).toBe(true);
140
+ expect(criteriaInstance.data?.filters.length).toBeGreaterThan(0);
141
+ }
142
+ });
143
+
144
+ test("every pack item has either an incident or an alert filled in, never neither", () => {
145
+ const criteria: Array<MonitorCriteriaInstance> =
146
+ criteriaOf(buildTemplate());
147
+
148
+ for (const criteriaInstance of criteria) {
149
+ const incidents: number = criteriaInstance.data?.incidents.length || 0;
150
+ const alerts: number = criteriaInstance.data?.alerts.length || 0;
151
+
152
+ expect(incidents + alerts).toBeGreaterThan(0);
153
+
154
+ if (criteriaInstance.data?.createIncidents) {
155
+ expect(incidents).toBe(1);
156
+ } else {
157
+ expect(incidents).toBe(0);
158
+ }
159
+
160
+ if (criteriaInstance.data?.createAlerts) {
161
+ expect(alerts).toBe(1);
162
+ } else {
163
+ expect(alerts).toBe(0);
164
+ }
165
+ }
166
+ });
167
+
168
+ test("incident items carry the incident severity, auto-resolve and are titled after the item", () => {
169
+ const criteria: Array<MonitorCriteriaInstance> =
170
+ criteriaOf(buildTemplate());
171
+
172
+ const incidentItems: Array<MonitorCriteriaInstance> = criteria.filter(
173
+ (criteriaInstance: MonitorCriteriaInstance): boolean => {
174
+ return Boolean(criteriaInstance.data?.createIncidents);
175
+ },
176
+ );
177
+
178
+ expect(incidentItems.length).toBeGreaterThan(0);
179
+
180
+ for (const criteriaInstance of incidentItems) {
181
+ const incident: MonitorCriteriaInstance["data"] extends infer D
182
+ ? D extends { incidents: Array<infer I> }
183
+ ? I
184
+ : never
185
+ : never = criteriaInstance.data!.incidents[0]!;
186
+
187
+ expect(incident.incidentSeverityId?.toString()).toBe(
188
+ INCIDENT_SEVERITY_ID.toString(),
189
+ );
190
+ expect(incident.autoResolveIncident).toBe(true);
191
+ expect(incident.title).toBe(criteriaInstance.data?.name);
192
+ expect(incident.description).toBe(criteriaInstance.data?.description);
193
+ expect(incident.id).toBeTruthy();
194
+ expect(incident.onCallPolicyIds).toEqual([]);
195
+ }
196
+ });
197
+
198
+ test("alert items carry the alert severity, auto-resolve and are titled after the item", () => {
199
+ const criteria: Array<MonitorCriteriaInstance> =
200
+ criteriaOf(buildTemplate());
201
+
202
+ const alertItems: Array<MonitorCriteriaInstance> = criteria.filter(
203
+ (criteriaInstance: MonitorCriteriaInstance): boolean => {
204
+ return Boolean(criteriaInstance.data?.createAlerts);
205
+ },
206
+ );
207
+
208
+ expect(alertItems.length).toBeGreaterThan(0);
209
+
210
+ for (const criteriaInstance of alertItems) {
211
+ const alert: MonitorCriteriaInstance["data"] extends infer D
212
+ ? D extends { alerts: Array<infer A> }
213
+ ? A
214
+ : never
215
+ : never = criteriaInstance.data!.alerts[0]!;
216
+
217
+ expect(alert.alertSeverityId?.toString()).toBe(
218
+ ALERT_SEVERITY_ID.toString(),
219
+ );
220
+ expect(alert.autoResolveAlert).toBe(true);
221
+ expect(alert.title).toBe(criteriaInstance.data?.name);
222
+ expect(alert.description).toBe(criteriaInstance.data?.description);
223
+ expect(alert.id).toBeTruthy();
224
+ }
225
+ });
226
+
227
+ test("threads the offline status onto incident items and the online status onto the step default", () => {
228
+ const template: MonitorTemplate = buildTemplate();
229
+
230
+ expect(
231
+ template.monitorSteps?.data?.defaultMonitorStatusId?.toString(),
232
+ ).toBe(ONLINE_STATUS_ID.toString());
233
+
234
+ for (const criteriaInstance of criteriaOf(template)) {
235
+ expect(criteriaInstance.data?.monitorStatusId?.toString()).toBe(
236
+ OFFLINE_STATUS_ID.toString(),
237
+ );
238
+
239
+ if (criteriaInstance.data?.createIncidents) {
240
+ expect(criteriaInstance.data?.changeMonitorStatus).toBe(true);
241
+ } else {
242
+ // An alert is not an outage; the monitor's status stays put.
243
+ expect(criteriaInstance.data?.changeMonitorStatus).toBe(false);
244
+ }
245
+ }
246
+ });
247
+
248
+ /*
249
+ * The engine clones the template per device and writes the device id into
250
+ * the step; the block it writes into has to exist, and the id has to be
251
+ * empty so the template's reference validator skips it rather than
252
+ * looking up a device that is not there.
253
+ */
254
+ test("the step carries a Network Device block with no device, and the engine can rebind it", () => {
255
+ const template: MonitorTemplate = buildTemplate();
256
+ const step: MonitorStep =
257
+ template.monitorSteps!.data!.monitorStepsInstanceArray[0]!;
258
+
259
+ expect(step.data?.networkDeviceMonitor).toBeDefined();
260
+ expect(step.data?.networkDeviceMonitor?.networkDeviceId).toBeUndefined();
261
+
262
+ const rebound: MonitorSteps =
263
+ NetworkDeviceMonitorTemplateUtil.rebindMonitorSteps({
264
+ monitorSteps: template.monitorSteps,
265
+ networkDeviceId: DEVICE_ID,
266
+ });
267
+
268
+ expect(
269
+ rebound.data?.monitorStepsInstanceArray[0]?.data?.networkDeviceMonitor
270
+ ?.networkDeviceId,
271
+ ).toBe(DEVICE_ID.toString());
272
+ // The template itself is not mutated by the rebind.
273
+ expect(step.data?.networkDeviceMonitor?.networkDeviceId).toBeUndefined();
274
+ });
275
+
276
+ /*
277
+ * The template reaches the server as JSON (ModelAPI serializes it) and is
278
+ * read back through MonitorSteps.fromJSON on every use. A shape that does
279
+ * not survive that round trip would be accepted at create and useless
280
+ * afterwards.
281
+ */
282
+ test("survives a JSON round trip with its criteria and actions intact", () => {
283
+ const template: MonitorTemplate = buildTemplate();
284
+ const json: JSONObject = template.monitorSteps!.toJSON();
285
+ const restored: MonitorSteps = MonitorSteps.fromJSON(json);
286
+
287
+ expect(restored.data?.defaultMonitorStatusId?.toString()).toBe(
288
+ ONLINE_STATUS_ID.toString(),
289
+ );
290
+
291
+ const restoredCriteria: Array<MonitorCriteriaInstance> =
292
+ restored.data?.monitorStepsInstanceArray[0]?.data?.monitorCriteria?.data
293
+ ?.monitorCriteriaInstanceArray || [];
294
+
295
+ expect(restoredCriteria).toHaveLength(
296
+ NetworkDeviceAlertPackUtil.getPackItems().length,
297
+ );
298
+
299
+ for (const criteriaInstance of restoredCriteria) {
300
+ const incidents: number = criteriaInstance.data?.incidents.length || 0;
301
+ const alerts: number = criteriaInstance.data?.alerts.length || 0;
302
+
303
+ expect(incidents + alerts).toBeGreaterThan(0);
304
+ }
305
+ });
306
+
307
+ test("builds fresh ids on every call, so two projects never share a criteria id", () => {
308
+ const first: Array<MonitorCriteriaInstance> = criteriaOf(buildTemplate());
309
+ const second: Array<MonitorCriteriaInstance> = criteriaOf(buildTemplate());
310
+
311
+ const firstIds: Set<string> = new Set<string>(
312
+ first.map((criteriaInstance: MonitorCriteriaInstance): string => {
313
+ return criteriaInstance.data!.id;
314
+ }),
315
+ );
316
+
317
+ for (const criteriaInstance of second) {
318
+ expect(firstIds.has(criteriaInstance.data!.id)).toBe(false);
319
+ }
320
+ });
321
+ });
322
+
323
+ describe("NetworkAlertPolicyBootstrapUtil.buildRecommendedPolicy", () => {
324
+ test("is an enabled, unscoped policy on the template in the project", () => {
325
+ const policy: NetworkAlertPolicy =
326
+ NetworkAlertPolicyBootstrapUtil.buildRecommendedPolicy({
327
+ projectId: PROJECT_ID,
328
+ monitorTemplateId: TEMPLATE_ID,
329
+ });
330
+
331
+ expect(policy.name).toBe(RECOMMENDED_POLICY_NAME);
332
+ expect(policy.projectId?.toString()).toBe(PROJECT_ID.toString());
333
+ expect(policy.monitorTemplateId?.toString()).toBe(TEMPLATE_ID.toString());
334
+ expect(policy.isEnabled).toBe(true);
335
+ expect(policy.description).toBeTruthy();
336
+ expect(NetworkAlertPolicyScopeUtil.isUnscoped(policy.scope)).toBe(true);
337
+ expect(NetworkAlertPolicyScopeUtil.describe(policy.scope)).toBe(
338
+ "All devices",
339
+ );
340
+ });
341
+
342
+ /*
343
+ * The policy's description is what an operator reads on the settings page
344
+ * against a policy that covers everything, and four of the pack's five
345
+ * items read an SNMP walk. A device with no credentials is pinged rather
346
+ * than walked, so on it those four are never evaluated — describing the
347
+ * pack without that caveat promises interface and walk alerting that a
348
+ * ping-only estate will never see.
349
+ */
350
+ test("its description says a ping-only device only gets the reachability item", () => {
351
+ const policy: NetworkAlertPolicy =
352
+ NetworkAlertPolicyBootstrapUtil.buildRecommendedPolicy({
353
+ projectId: PROJECT_ID,
354
+ monitorTemplateId: TEMPLATE_ID,
355
+ });
356
+
357
+ expect(policy.description).toContain("pinged rather than walked");
358
+ expect(policy.description).toContain("only the reachability item can fire");
359
+ });
360
+ });
361
+
362
+ describe("NetworkAlertPolicyBootstrapUtil.isRecommendedTemplate / findRecommendedTemplate", () => {
363
+ test("recognises the template it built, and only by its marker", () => {
364
+ expect(
365
+ NetworkAlertPolicyBootstrapUtil.isRecommendedTemplate(buildTemplate()),
366
+ ).toBe(true);
367
+
368
+ const renamed: MonitorTemplate = buildTemplate();
369
+ renamed.templateName = "Our alert pack";
370
+ expect(NetworkAlertPolicyBootstrapUtil.isRecommendedTemplate(renamed)).toBe(
371
+ true,
372
+ );
373
+
374
+ const sameNameNoMarker: MonitorTemplate = new MonitorTemplate();
375
+ sameNameNoMarker.templateName = RECOMMENDED_TEMPLATE_NAME;
376
+ sameNameNoMarker.templateDescription = "Hand made.";
377
+ expect(
378
+ NetworkAlertPolicyBootstrapUtil.isRecommendedTemplate(sameNameNoMarker),
379
+ ).toBe(false);
380
+
381
+ expect(NetworkAlertPolicyBootstrapUtil.isRecommendedTemplate(null)).toBe(
382
+ false,
383
+ );
384
+ expect(
385
+ NetworkAlertPolicyBootstrapUtil.isRecommendedTemplate(
386
+ new MonitorTemplate(),
387
+ ),
388
+ ).toBe(false);
389
+ });
390
+
391
+ test("finds the first marked template in a list, and null when there is none", () => {
392
+ const plain: MonitorTemplate = new MonitorTemplate();
393
+ plain.templateDescription = "Reachability only.";
394
+
395
+ const marked: MonitorTemplate = buildTemplate();
396
+ const alsoMarked: MonitorTemplate = buildTemplate();
397
+
398
+ expect(
399
+ NetworkAlertPolicyBootstrapUtil.findRecommendedTemplate([
400
+ plain,
401
+ marked,
402
+ alsoMarked,
403
+ ]),
404
+ ).toBe(marked);
405
+
406
+ expect(
407
+ NetworkAlertPolicyBootstrapUtil.findRecommendedTemplate([plain]),
408
+ ).toBeNull();
409
+
410
+ expect(
411
+ NetworkAlertPolicyBootstrapUtil.findRecommendedTemplate([]),
412
+ ).toBeNull();
413
+ });
414
+
415
+ /*
416
+ * An operator may rewrite the prose; the marker sits on its own line at
417
+ * the end so it survives an edit to the sentence above it.
418
+ */
419
+ test("the marker sits on its own last line of the description", () => {
420
+ const description: string =
421
+ NetworkAlertPolicyBootstrapUtil.buildRecommendedTemplateDescription();
422
+
423
+ const lines: Array<string> = description.trim().split("\n");
424
+
425
+ expect(lines[lines.length - 1]).toBe(RECOMMENDED_TEMPLATE_MARKER);
426
+ });
427
+ });
@@ -0,0 +1,185 @@
1
+ import DeviceReachabilityUtil, {
2
+ NetworkDeviceReachability,
3
+ } from "../../../Utils/NetworkDevice/DeviceReachabilityUtil";
4
+ import NetworkDeviceMonitoringMethod from "../../../Types/NetworkDevice/NetworkDeviceMonitoringMethod";
5
+ import MonitorService from "../../../Server/Services/MonitorService";
6
+ import NetworkDeviceService from "../../../Server/Services/NetworkDeviceService";
7
+ import NetworkSiteService from "../../../Server/Services/NetworkSiteService";
8
+ import Monitor from "../../../Models/DatabaseModels/Monitor";
9
+ import NetworkDevice from "../../../Models/DatabaseModels/NetworkDevice";
10
+ import ObjectID from "../../../Types/ObjectID";
11
+ import { afterEach, describe, expect, test } from "@jest/globals";
12
+
13
+ /*
14
+ * A monitor-backed NetworkDevice is judged on two surfaces by two rules:
15
+ *
16
+ * - the pill (and the site rollup, the topology node, the Overview hero)
17
+ * reads the stamped MonitorStatus row through DeviceReachabilityUtil,
18
+ * which looks ONLY at `isOfflineState`;
19
+ * - the device list's summary tiles and Status facet count and filter in
20
+ * SQL over `isReachable`, which the server now stamps from the same
21
+ * monitor as `!isOfflineState`.
22
+ *
23
+ * Two rules over the same fact can only stay honest if they are the same
24
+ * rule. MonitorStatus is a ladder, not a pair — a "Degraded" row is neither
25
+ * operational nor offline — so the rung where they could most easily
26
+ * diverge is the middle one: read the operational flag on one side and the
27
+ * offline flag on the other and a degraded-but-reachable device is green in
28
+ * the pill and red in the tiles. What is pinned here is that, for every
29
+ * rung and for "no status yet", the boolean the server writes into
30
+ * `isReachable` is exactly the verdict the pill renders.
31
+ */
32
+
33
+ interface LadderRung {
34
+ name: string;
35
+ isOperationalState: boolean;
36
+ isOfflineState: boolean;
37
+ }
38
+
39
+ // The three rungs a MonitorStatus row can occupy, as the model flags them.
40
+ const LADDER: Array<LadderRung> = [
41
+ { name: "Operational", isOperationalState: true, isOfflineState: false },
42
+ { name: "Degraded", isOperationalState: false, isOfflineState: false },
43
+ { name: "Offline", isOperationalState: false, isOfflineState: true },
44
+ ];
45
+
46
+ function pillVerdict(
47
+ monitorStatusIsOffline: boolean | undefined,
48
+ ): NetworkDeviceReachability {
49
+ return DeviceReachabilityUtil.getStatus({
50
+ monitoringMethod: NetworkDeviceMonitoringMethod.Monitor,
51
+ monitorStatusIsOffline: monitorStatusIsOffline,
52
+ });
53
+ }
54
+
55
+ describe("the pill's rule for a monitor-backed device", () => {
56
+ test.each(LADDER)(
57
+ "$name: reachable exactly when the row is not offline",
58
+ (rung: LadderRung) => {
59
+ const isUp: boolean =
60
+ pillVerdict(rung.isOfflineState) === NetworkDeviceReachability.Up;
61
+
62
+ expect(isUp).toBe(!rung.isOfflineState);
63
+ },
64
+ );
65
+
66
+ /*
67
+ * The rung that tells the two flags apart. Its operational flag is false,
68
+ * and if either side read that flag this device would be Down there.
69
+ */
70
+ test("Degraded is Up, so the operational flag is not what decides", () => {
71
+ const degraded: LadderRung = LADDER.find((rung: LadderRung) => {
72
+ return rung.name === "Degraded";
73
+ })!;
74
+
75
+ expect(degraded.isOperationalState).toBe(false);
76
+ expect(pillVerdict(degraded.isOfflineState)).toBe(
77
+ NetworkDeviceReachability.Up,
78
+ );
79
+ });
80
+
81
+ test("Offline is Down", () => {
82
+ expect(pillVerdict(true)).toBe(NetworkDeviceReachability.Down);
83
+ });
84
+
85
+ /*
86
+ * No status yet — nothing bound, or bound and never evaluated — is a real
87
+ * Pending, and the server stamps NULL for it, which is what the tiles
88
+ * count as Pending too.
89
+ */
90
+ test("no status at all is Pending", () => {
91
+ expect(pillVerdict(undefined)).toBe(NetworkDeviceReachability.Pending);
92
+ expect(pillVerdict(null as unknown as undefined)).toBe(
93
+ NetworkDeviceReachability.Pending,
94
+ );
95
+ });
96
+ });
97
+
98
+ /*
99
+ * The same ladder through the server. refreshStampedMonitorStatus is what
100
+ * writes `isReachable` for a monitor-backed device; drive it with a monitor
101
+ * on each rung and check the boolean it writes against the pill's verdict
102
+ * for that rung. The seams are the three it touches: read the device, read
103
+ * the monitor, write the columns.
104
+ */
105
+ describe("the value the server stamps into isReachable", () => {
106
+ const DEVICE_ID: ObjectID = new ObjectID(
107
+ "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa",
108
+ );
109
+ const PROJECT_ID: ObjectID = new ObjectID(
110
+ "bbbbbbbb-bbbb-4bbb-8bbb-bbbbbbbbbbbb",
111
+ );
112
+ const MONITOR_ID: ObjectID = new ObjectID(
113
+ "cccccccc-cccc-4ccc-8ccc-cccccccccccc",
114
+ );
115
+
116
+ afterEach(() => {
117
+ jest.restoreAllMocks();
118
+ });
119
+
120
+ async function stampedIsReachable(
121
+ monitor: Monitor | null,
122
+ ): Promise<boolean | null | undefined> {
123
+ jest.spyOn(NetworkDeviceService, "findOneById").mockResolvedValue({
124
+ id: DEVICE_ID,
125
+ _id: DEVICE_ID.toString(),
126
+ projectId: PROJECT_ID,
127
+ monitoringMethod: NetworkDeviceMonitoringMethod.Monitor,
128
+ monitorId: MONITOR_ID,
129
+ // A stale value on every column, so the write is never skipped.
130
+ currentMonitorStatusId: ObjectID.generate(),
131
+ isReachable: undefined,
132
+ } as unknown as NetworkDevice);
133
+ jest.spyOn(MonitorService, "findOneBy").mockResolvedValue(monitor);
134
+ jest
135
+ .spyOn(NetworkSiteService, "recomputeRollupForSiteAndAncestors")
136
+ .mockResolvedValue(undefined as never);
137
+
138
+ const update: jest.SpyInstance = jest
139
+ .spyOn(NetworkDeviceService, "updateColumnsByIdWithoutHooks")
140
+ .mockResolvedValue(undefined as never);
141
+
142
+ await NetworkDeviceService.refreshStampedMonitorStatus({
143
+ deviceId: DEVICE_ID,
144
+ clearWhenNotMonitorBacked: false,
145
+ });
146
+
147
+ expect(update).toHaveBeenCalledTimes(1);
148
+
149
+ return (
150
+ update.mock.calls[0]![0].data as unknown as {
151
+ isReachable: boolean | null | undefined;
152
+ }
153
+ ).isReachable;
154
+ }
155
+
156
+ test.each(LADDER)(
157
+ "$name: equals the pill's verdict",
158
+ async (rung: LadderRung) => {
159
+ const stamped: boolean | null | undefined = await stampedIsReachable({
160
+ id: MONITOR_ID,
161
+ _id: MONITOR_ID.toString(),
162
+ currentMonitorStatusId: ObjectID.generate(),
163
+ currentMonitorStatus: {
164
+ isOperationalState: rung.isOperationalState,
165
+ isOfflineState: rung.isOfflineState,
166
+ },
167
+ } as unknown as Monitor);
168
+
169
+ expect(stamped).toBe(
170
+ pillVerdict(rung.isOfflineState) === NetworkDeviceReachability.Up,
171
+ );
172
+ },
173
+ );
174
+
175
+ test("no status: NULL, which is the pill's Pending", async () => {
176
+ const stamped: boolean | null | undefined = await stampedIsReachable({
177
+ id: MONITOR_ID,
178
+ _id: MONITOR_ID.toString(),
179
+ currentMonitorStatusId: undefined,
180
+ } as unknown as Monitor);
181
+
182
+ expect(stamped).toBeNull();
183
+ expect(pillVerdict(undefined)).toBe(NetworkDeviceReachability.Pending);
184
+ });
185
+ });