@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,632 @@
1
+ import "@testing-library/jest-dom";
2
+ import {
3
+ afterEach,
4
+ beforeEach,
5
+ describe,
6
+ expect,
7
+ jest,
8
+ test,
9
+ } from "@jest/globals";
10
+ import { act, cleanup, render, screen, waitFor } from "@testing-library/react";
11
+ import * as React from "react";
12
+ import { MemoryRouter } from "react-router-dom";
13
+ import getJestMockFunction, { MockFunction } from "../../MockType";
14
+ import { getJestSpyOn } from "../../Spy";
15
+
16
+ /*
17
+ * The "Create Ping Monitor" button on a monitor-backed device's page opens
18
+ * the monitor create page with `?networkDeviceId=<id>`. What that page
19
+ * opens WITH, and what it does with the monitor once saved, is the whole
20
+ * change (OneUptime/oneuptime#3447): before, the link seeded a Network
21
+ * Device monitor — the SNMP shape, which neither pings the address nor binds
22
+ * to the device — and the save landed on the monitor, leaving the device on
23
+ * "Pending" with the binding still to be done by hand.
24
+ *
25
+ * MonitorCreateNetworkDeviceDeepLink.test.ts (App/Tests) pins the source.
26
+ * This drives the real page: the real deep-link read, the real seed-id
27
+ * resolver, the real Ping builder, the real bind helper — with ModelForm
28
+ * mocked to capture the props it is handed, the same approach as
29
+ * AddNeighborToMonitoringModal.test.tsx. The captured onSuccess is then
30
+ * invoked the way ModelForm would invoke it, un-awaited, so the bind and its
31
+ * failure path run exactly as they do in the browser.
32
+ */
33
+
34
+ type CapturedFormProps = {
35
+ initialValues: Record<string, unknown>;
36
+ onSuccess?: ((createdItem: unknown) => void) | undefined;
37
+ };
38
+
39
+ /** The two criteria switches the Ping builder sets deliberately. */
40
+ type CriteriaFlags = {
41
+ createIncidents?: boolean | undefined;
42
+ changeMonitorStatus?: boolean | undefined;
43
+ };
44
+
45
+ let capturedForm: CapturedFormProps | null = null;
46
+
47
+ jest.mock("../../../UI/Components/Forms/ModelForm", () => {
48
+ /*
49
+ * Everything but the component is real: Create.tsx imports FormType from
50
+ * here, and PayAsYouGo imports the ModelField type.
51
+ */
52
+ const actual: Record<string, unknown> = jest.requireActual(
53
+ "../../../UI/Components/Forms/ModelForm",
54
+ ) as Record<string, unknown>;
55
+
56
+ return {
57
+ __esModule: true,
58
+ ...actual,
59
+ default: (props: CapturedFormProps): React.ReactElement => {
60
+ capturedForm = props;
61
+ return <div data-testid="model-form" />;
62
+ },
63
+ };
64
+ });
65
+
66
+ const DEVICE_ID: string = "22222222-2222-4222-8222-222222222222";
67
+ const MONITOR_ID: string = "33333333-3333-4333-8333-333333333333";
68
+ const ONLINE_STATUS_ID: string = "44444444-4444-4444-8444-444444444444";
69
+ const OFFLINE_STATUS_ID: string = "55555555-5555-4555-8555-555555555555";
70
+ const INCIDENT_SEVERITY_ID: string = "66666666-6666-4666-8666-666666666666";
71
+ const ALERT_SEVERITY_ID: string = "77777777-7777-4777-8777-777777777777";
72
+ // The probe assigned to the device — the one that can reach it.
73
+ const DEVICE_PROBE_ID: string = "88888888-8888-4888-8888-888888888888";
74
+ // A global probe flagged "auto enable on new monitors": the project default.
75
+ const GLOBAL_PROBE_ID: string = "99999999-9999-4999-8999-999999999999";
76
+
77
+ /*
78
+ * The step editor is only rendered through ModelForm's getCustomElement,
79
+ * which the mock above never calls — and its import graph is most of the
80
+ * dashboard. A stub keeps the suite to the page under test.
81
+ */
82
+ jest.mock(
83
+ "../../../../App/FeatureSet/Dashboard/src/Components/Form/Monitor/MonitorSteps",
84
+ () => {
85
+ return {
86
+ __esModule: true,
87
+ default: (): React.ReactElement => {
88
+ return <div data-testid="monitor-steps" />;
89
+ },
90
+ };
91
+ },
92
+ );
93
+
94
+ /** The device's probe, and a global one flagged "auto enable": the default. */
95
+ const BRANCH_PROBE_ROW: Record<string, unknown> = {
96
+ _id: DEVICE_PROBE_ID,
97
+ name: "Branch probe",
98
+ isGlobalProbe: false,
99
+ shouldAutoEnableProbeOnNewMonitors: false,
100
+ };
101
+ const GLOBAL_PROBE_ROW: Record<string, unknown> = {
102
+ _id: GLOBAL_PROBE_ID,
103
+ name: "Global probe",
104
+ isGlobalProbe: true,
105
+ shouldAutoEnableProbeOnNewMonitors: true,
106
+ };
107
+
108
+ /*
109
+ * What the probe list request returns, swapped per test: the two probes by
110
+ * default, a list without the device's probe, or a rejection for the page's
111
+ * "probe list could not be loaded" path.
112
+ */
113
+ let probeListResult: () => Promise<
114
+ Array<Record<string, unknown>>
115
+ > = (): Promise<Array<Record<string, unknown>>> => {
116
+ return Promise.resolve([BRANCH_PROBE_ROW, GLOBAL_PROBE_ROW]);
117
+ };
118
+
119
+ jest.mock("../../../../App/FeatureSet/Dashboard/src/Utils/Probe", () => {
120
+ return {
121
+ __esModule: true,
122
+ default: {
123
+ getAllProbes: (): Promise<Array<Record<string, unknown>>> => {
124
+ return probeListResult();
125
+ },
126
+ },
127
+ };
128
+ });
129
+
130
+ /*
131
+ * What the page reads and writes through ModelAPI, dispatched on the model
132
+ * so one mock serves the device read, the probe-default project read, the
133
+ * three seed-id lists, and the bind. Every request is recorded so the tests
134
+ * can assert what was asked for, not only what came back.
135
+ */
136
+ let deviceRow: NetworkDevice | null = null;
137
+ let monitorStatusRows: Array<MonitorStatus> = [];
138
+ let incidentSeverityRows: Array<IncidentSeverity> = [];
139
+ let alertSeverityRows: Array<AlertSeverity> = [];
140
+ let getItemRequests: Array<{
141
+ modelType: unknown;
142
+ select?: Record<string, boolean> | undefined;
143
+ }> = [];
144
+ let updateRequests: Array<{
145
+ modelType: unknown;
146
+ id: ObjectID;
147
+ data: Record<string, unknown>;
148
+ }> = [];
149
+ let deleteRequests: Array<unknown> = [];
150
+ let bindResult: () => Promise<void> = (): Promise<void> => {
151
+ return Promise.resolve();
152
+ };
153
+
154
+ jest.mock("../../../UI/Utils/ModelAPI/ModelAPI", () => {
155
+ return {
156
+ __esModule: true,
157
+ default: {
158
+ getItem: (request: {
159
+ modelType: unknown;
160
+ select?: Record<string, boolean> | undefined;
161
+ }): Promise<unknown> => {
162
+ getItemRequests.push(request);
163
+
164
+ if (request.modelType === NetworkDevice) {
165
+ return Promise.resolve(deviceRow);
166
+ }
167
+
168
+ if (request.modelType === Project) {
169
+ return Promise.resolve({
170
+ doNotAddGlobalProbesByDefaultOnNewMonitors: false,
171
+ });
172
+ }
173
+
174
+ return Promise.resolve(null);
175
+ },
176
+ getList: (request: { modelType: unknown }): Promise<unknown> => {
177
+ let rows: Array<unknown> = [];
178
+
179
+ if (request.modelType === MonitorStatus) {
180
+ rows = monitorStatusRows;
181
+ } else if (request.modelType === IncidentSeverity) {
182
+ rows = incidentSeverityRows;
183
+ } else if (request.modelType === AlertSeverity) {
184
+ rows = alertSeverityRows;
185
+ }
186
+
187
+ return Promise.resolve({
188
+ data: rows,
189
+ count: rows.length,
190
+ skip: 0,
191
+ limit: rows.length,
192
+ });
193
+ },
194
+ updateById: (request: {
195
+ modelType: unknown;
196
+ id: ObjectID;
197
+ data: Record<string, unknown>;
198
+ }): Promise<void> => {
199
+ updateRequests.push(request);
200
+ return bindResult();
201
+ },
202
+ deleteItem: (request: unknown): Promise<void> => {
203
+ deleteRequests.push(request);
204
+ return Promise.resolve();
205
+ },
206
+ },
207
+ };
208
+ });
209
+
210
+ import MonitorCreate from "../../../../App/FeatureSet/Dashboard/src/Pages/Monitor/Create";
211
+ import AlertSeverity from "../../../Models/DatabaseModels/AlertSeverity";
212
+ import IncidentSeverity from "../../../Models/DatabaseModels/IncidentSeverity";
213
+ import Monitor from "../../../Models/DatabaseModels/Monitor";
214
+ import MonitorStatus from "../../../Models/DatabaseModels/MonitorStatus";
215
+ import NetworkDevice from "../../../Models/DatabaseModels/NetworkDevice";
216
+ import Project from "../../../Models/DatabaseModels/Project";
217
+ import Route from "../../../Types/API/Route";
218
+ import { JSONObject } from "../../../Types/JSON";
219
+ import MonitorCriteriaInstance from "../../../Types/Monitor/MonitorCriteriaInstance";
220
+ import MonitorStep from "../../../Types/Monitor/MonitorStep";
221
+ import MonitorSteps from "../../../Types/Monitor/MonitorSteps";
222
+ import MonitorType from "../../../Types/Monitor/MonitorType";
223
+ import NetworkDeviceMonitoringMethod, {
224
+ LEGACY_SNMP_MONITORING_METHOD,
225
+ } from "../../../Types/NetworkDevice/NetworkDeviceMonitoringMethod";
226
+ import ObjectID from "../../../Types/ObjectID";
227
+ import UiAnalytics from "../../../UI/Utils/Analytics";
228
+ import Navigation from "../../../UI/Utils/Navigation";
229
+ import ProjectUtil from "../../../UI/Utils/Project";
230
+ import {
231
+ PING_MONITOR_INTERVAL,
232
+ PingMonitorOrigin,
233
+ buildPingMonitorDescription,
234
+ } from "../../../Utils/NetworkDiscovery/PingMonitorBuilder";
235
+
236
+ /*
237
+ * Below the imports on purpose: the jest.mock factories above are hoisted,
238
+ * which leaves the imports evaluated AFTER any module-level constant that
239
+ * precedes them, and constructing an ObjectID up there runs before the
240
+ * class has been required.
241
+ */
242
+ const PROJECT_ID: ObjectID = new ObjectID(
243
+ "11111111-1111-4111-8111-111111111111",
244
+ );
245
+
246
+ function monitorStatus(data: {
247
+ id: string;
248
+ isOperationalState: boolean;
249
+ isOfflineState: boolean;
250
+ }): MonitorStatus {
251
+ const status: MonitorStatus = new MonitorStatus();
252
+ status.id = new ObjectID(data.id);
253
+ status.isOperationalState = data.isOperationalState;
254
+ status.isOfflineState = data.isOfflineState;
255
+ return status;
256
+ }
257
+
258
+ function incidentSeverity(id: string): IncidentSeverity {
259
+ const severity: IncidentSeverity = new IncidentSeverity();
260
+ severity.id = new ObjectID(id);
261
+ return severity;
262
+ }
263
+
264
+ function alertSeverity(id: string): AlertSeverity {
265
+ const severity: AlertSeverity = new AlertSeverity();
266
+ severity.id = new ObjectID(id);
267
+ return severity;
268
+ }
269
+
270
+ function networkDevice(data: {
271
+ monitoringMethod: string;
272
+ probeId: string | null;
273
+ }): NetworkDevice {
274
+ const device: NetworkDevice = new NetworkDevice();
275
+ device.id = new ObjectID(DEVICE_ID);
276
+ device.name = "Lobby AP";
277
+ device.hostname = "10.0.12.41";
278
+ device.monitoringMethod = data.monitoringMethod;
279
+ if (data.probeId) {
280
+ device.probeId = new ObjectID(data.probeId);
281
+ }
282
+ return device;
283
+ }
284
+
285
+ const navigateMock: MockFunction = getJestMockFunction();
286
+
287
+ function renderCreatePage(): void {
288
+ const project: Project = new Project();
289
+ project.id = PROJECT_ID;
290
+
291
+ render(
292
+ <MemoryRouter>
293
+ <MonitorCreate
294
+ pageRoute={new Route("/dashboard/monitors/create")}
295
+ currentProject={project}
296
+ hasPaymentMethod={true}
297
+ />
298
+ </MemoryRouter>,
299
+ );
300
+ }
301
+
302
+ async function openForm(): Promise<CapturedFormProps> {
303
+ renderCreatePage();
304
+
305
+ await waitFor(() => {
306
+ expect(capturedForm).not.toBeNull();
307
+ });
308
+
309
+ return capturedForm!;
310
+ }
311
+
312
+ /** What ModelForm hands onSuccess after a successful create. */
313
+ function createdMonitor(): Monitor {
314
+ const monitor: Monitor = new Monitor();
315
+ monitor.id = new ObjectID(MONITOR_ID);
316
+ monitor.monitorType = MonitorType.Ping;
317
+ return monitor;
318
+ }
319
+
320
+ function navigatedTo(): string {
321
+ expect(navigateMock).toHaveBeenCalledTimes(1);
322
+
323
+ const destination: { toString: () => string } = navigateMock.mock
324
+ .calls[0]![0] as { toString: () => string };
325
+
326
+ return destination.toString();
327
+ }
328
+
329
+ describe("the monitor create page opened from a network device", () => {
330
+ beforeEach(() => {
331
+ capturedForm = null;
332
+ getItemRequests = [];
333
+ updateRequests = [];
334
+ deleteRequests = [];
335
+ navigateMock.mockReset();
336
+ bindResult = (): Promise<void> => {
337
+ return Promise.resolve();
338
+ };
339
+ probeListResult = (): Promise<Array<Record<string, unknown>>> => {
340
+ return Promise.resolve([BRANCH_PROBE_ROW, GLOBAL_PROBE_ROW]);
341
+ };
342
+
343
+ deviceRow = networkDevice({
344
+ monitoringMethod: "Monitor",
345
+ probeId: DEVICE_PROBE_ID,
346
+ });
347
+ monitorStatusRows = [
348
+ monitorStatus({
349
+ id: ONLINE_STATUS_ID,
350
+ isOperationalState: true,
351
+ isOfflineState: false,
352
+ }),
353
+ monitorStatus({
354
+ id: OFFLINE_STATUS_ID,
355
+ isOperationalState: false,
356
+ isOfflineState: true,
357
+ }),
358
+ ];
359
+ incidentSeverityRows = [incidentSeverity(INCIDENT_SEVERITY_ID)];
360
+ alertSeverityRows = [alertSeverity(ALERT_SEVERITY_ID)];
361
+
362
+ jest.spyOn(ProjectUtil, "getCurrentProjectId").mockReturnValue(PROJECT_ID);
363
+ jest
364
+ .spyOn(Navigation, "getQueryStringByName")
365
+ .mockImplementation((paramName: string): string | null => {
366
+ return paramName === "networkDeviceId" ? DEVICE_ID : null;
367
+ });
368
+ getJestSpyOn(Navigation, "navigate").mockImplementation(
369
+ (...args: Array<unknown>): void => {
370
+ navigateMock(...args);
371
+ },
372
+ );
373
+ // Off the network: the revenue event is not what is under test.
374
+ getJestSpyOn(UiAnalytics, "captureRevenueEvent").mockImplementation(
375
+ (): void => {},
376
+ );
377
+ });
378
+
379
+ afterEach(() => {
380
+ cleanup();
381
+ jest.restoreAllMocks();
382
+ });
383
+
384
+ describe("a monitor-backed device", () => {
385
+ test("opens on a Ping monitor for the device's address, not the SNMP shape", async () => {
386
+ const form: CapturedFormProps = await openForm();
387
+
388
+ expect(form.initialValues["monitorType"]).toBe(MonitorType.Ping);
389
+ expect(form.initialValues["name"]).toBe("Ping Lobby AP");
390
+ expect(form.initialValues["description"]).toBe(
391
+ buildPingMonitorDescription({
392
+ address: "10.0.12.41",
393
+ origin: PingMonitorOrigin.DevicePage,
394
+ }),
395
+ );
396
+ expect(form.initialValues["monitoringInterval"]).toBe(
397
+ PING_MONITOR_INTERVAL,
398
+ );
399
+ });
400
+
401
+ test("the step pings the device's address, on the project's statuses, without opening incidents", async () => {
402
+ const form: CapturedFormProps = await openForm();
403
+
404
+ const steps: MonitorSteps = MonitorSteps.fromJSON(
405
+ form.initialValues["monitorSteps"] as JSONObject,
406
+ );
407
+ const step: MonitorStep | undefined =
408
+ steps.data?.monitorStepsInstanceArray[0];
409
+
410
+ expect(step?.data?.monitorDestination?.toString()).toBe("10.0.12.41");
411
+ expect(steps.data?.defaultMonitorStatusId?.toString()).toBe(
412
+ ONLINE_STATUS_ID,
413
+ );
414
+
415
+ /*
416
+ * The device page is one of the bulk-ish surfaces: an operator
417
+ * recording an access point wants its status, not a page for every
418
+ * missed ping. changeMonitorStatus stays on — that is what moves the
419
+ * device's pill.
420
+ */
421
+ const criteria: Array<CriteriaFlags> = (
422
+ step?.data?.monitorCriteria?.data?.monitorCriteriaInstanceArray || []
423
+ ).map((instance: MonitorCriteriaInstance): CriteriaFlags => {
424
+ return {
425
+ createIncidents: instance.data?.createIncidents,
426
+ changeMonitorStatus: instance.data?.changeMonitorStatus,
427
+ };
428
+ });
429
+
430
+ expect(criteria.length).toBeGreaterThan(0);
431
+ for (const instance of criteria) {
432
+ expect(instance.createIncidents).toBe(false);
433
+ }
434
+ expect(
435
+ criteria.some((instance: CriteriaFlags): boolean => {
436
+ return instance.changeMonitorStatus === true;
437
+ }),
438
+ ).toBe(true);
439
+ });
440
+
441
+ test("reads the method, address and probe in the one device request", async () => {
442
+ await openForm();
443
+
444
+ const deviceRead: { select?: Record<string, boolean> | undefined } =
445
+ getItemRequests.find((request: { modelType: unknown }) => {
446
+ return request.modelType === NetworkDevice;
447
+ })!;
448
+
449
+ expect(deviceRead).toBeDefined();
450
+ expect(deviceRead.select).toEqual({
451
+ name: true,
452
+ hostname: true,
453
+ monitoringMethod: true,
454
+ probeId: true,
455
+ });
456
+ });
457
+
458
+ test("pins the device's own probe over the project's default", async () => {
459
+ /*
460
+ * The default here is a GLOBAL probe, which lives on the public
461
+ * internet and cannot reach 10.0.12.41. Attaching it would fail every
462
+ * check and drive the device to Offline — a worse dead end than
463
+ * Pending, because it looks like an outage.
464
+ */
465
+ const form: CapturedFormProps = await openForm();
466
+
467
+ expect(form.initialValues["probes"]).toEqual([DEVICE_PROBE_ID]);
468
+ });
469
+
470
+ test("falls back to the project's default probes when the device has none", async () => {
471
+ deviceRow = networkDevice({ monitoringMethod: "Monitor", probeId: null });
472
+
473
+ const form: CapturedFormProps = await openForm();
474
+
475
+ expect(form.initialValues["probes"]).toEqual([GLOBAL_PROBE_ID]);
476
+ });
477
+
478
+ test("submits no probe selection when the probe list cannot be loaded", async () => {
479
+ /*
480
+ * The device's probe is known, but the picker has no options to show
481
+ * it in. Seeding it anyway would have BasicForm filter it against the
482
+ * (empty) options and submit probes: [] — which the server honours as
483
+ * "attach no probes", leaving a monitor nothing evaluates bound to the
484
+ * device, reading Up forever. No "probes" key at all is what makes the
485
+ * server fall back to the project defaults, as it did before the pin.
486
+ */
487
+ probeListResult = (): Promise<Array<Record<string, unknown>>> => {
488
+ return Promise.reject(new Error("Service Unavailable"));
489
+ };
490
+
491
+ const form: CapturedFormProps = await openForm();
492
+
493
+ expect("probes" in form.initialValues).toBe(false);
494
+ });
495
+
496
+ test("falls back to the defaults when the device's probe is not among the options", async () => {
497
+ // The device's probe was deleted, or is one this user cannot see.
498
+ probeListResult = (): Promise<Array<Record<string, unknown>>> => {
499
+ return Promise.resolve([GLOBAL_PROBE_ROW]);
500
+ };
501
+
502
+ const form: CapturedFormProps = await openForm();
503
+
504
+ expect(form.initialValues["probes"]).toEqual([GLOBAL_PROBE_ID]);
505
+ });
506
+
507
+ test("binds the saved monitor to the device and lands on the device", async () => {
508
+ const form: CapturedFormProps = await openForm();
509
+
510
+ act(() => {
511
+ form.onSuccess!(createdMonitor());
512
+ });
513
+
514
+ await waitFor(() => {
515
+ expect(updateRequests).toHaveLength(1);
516
+ });
517
+
518
+ expect(updateRequests[0]!.modelType).toBe(NetworkDevice);
519
+ expect(updateRequests[0]!.id.toString()).toBe(DEVICE_ID);
520
+ expect(updateRequests[0]!.data).toEqual({ monitorId: MONITOR_ID });
521
+
522
+ /*
523
+ * The device, not the monitor: binding re-stamps the device's status,
524
+ * and the device page is where that is visible.
525
+ */
526
+ await waitFor(() => {
527
+ expect(navigateMock).toHaveBeenCalled();
528
+ });
529
+ expect(navigatedTo()).toContain(`/network-devices/${DEVICE_ID}`);
530
+ expect(navigatedTo()).not.toContain(MONITOR_ID);
531
+ });
532
+
533
+ test("a bind that fails is reported in place of the form, and the monitor is kept", async () => {
534
+ bindResult = async (): Promise<void> => {
535
+ throw new Error("Forbidden");
536
+ };
537
+
538
+ const form: CapturedFormProps = await openForm();
539
+
540
+ act(() => {
541
+ form.onSuccess!(createdMonitor());
542
+ });
543
+
544
+ /*
545
+ * ModelForm does not await onSuccess, so a rejection would vanish. The
546
+ * message names what happened and where to finish the job by hand.
547
+ */
548
+ await screen.findByText(
549
+ "The monitor was created but could not be bound to the device: Forbidden. Bind it under the device's Settings → Monitor.",
550
+ );
551
+
552
+ expect(navigateMock).not.toHaveBeenCalled();
553
+ expect(screen.queryByTestId("model-form")).toBeNull();
554
+ // The operator reviewed and saved this monitor; it is not thrown away.
555
+ expect(deleteRequests).toHaveLength(0);
556
+ });
557
+ });
558
+
559
+ /*
560
+ * The other half of the deep link. Seeding a Ping monitor and binding it is
561
+ * a MONITOR-BACKED device's answer to "nothing reports on this device" — a
562
+ * probe-polled one is already pinged by its probe on its own schedule, so
563
+ * the link opens the ordinary Network Device shape and leaves the device's
564
+ * own polling alone. Binding here would be worse than useless: it would
565
+ * override a working poll with a second opinion.
566
+ *
567
+ * Run for both spellings the column can hold. `Probe` is what is written
568
+ * now; `"SNMP"` is the legacy string on every row created before the method
569
+ * enum lost that member, and it parses to Probe rather than to a third kind
570
+ * of device — so a row nobody has rewritten must take this path too.
571
+ */
572
+ describe.each([
573
+ ["Probe", NetworkDeviceMonitoringMethod.Probe],
574
+ ["the legacy SNMP string", LEGACY_SNMP_MONITORING_METHOD],
575
+ ])("a probe-polled device (%s)", (_label: string, method: string) => {
576
+ beforeEach(() => {
577
+ deviceRow = networkDevice({
578
+ monitoringMethod: method,
579
+ probeId: DEVICE_PROBE_ID,
580
+ });
581
+ });
582
+
583
+ test("opens on the Network Device shape", async () => {
584
+ const form: CapturedFormProps = await openForm();
585
+
586
+ expect(form.initialValues["monitorType"]).toBe(MonitorType.NetworkDevice);
587
+ expect(form.initialValues["name"]).toBe("Lobby AP Monitor");
588
+ /*
589
+ * Pinning the device's own probe is a Ping-monitor concern — it is what
590
+ * makes the seeded ping leave from something that can reach the address.
591
+ * The Network Device shape keeps the project's default probes.
592
+ */
593
+ expect(form.initialValues["probes"]).toEqual([GLOBAL_PROBE_ID]);
594
+ });
595
+
596
+ test("lands on the monitor, and binds nothing", async () => {
597
+ const form: CapturedFormProps = await openForm();
598
+
599
+ act(() => {
600
+ form.onSuccess!(createdMonitor());
601
+ });
602
+
603
+ await waitFor(() => {
604
+ expect(navigateMock).toHaveBeenCalled();
605
+ });
606
+ expect(navigatedTo()).toContain(MONITOR_ID);
607
+ expect(navigatedTo()).not.toContain(`/network-devices/${DEVICE_ID}`);
608
+ expect(updateRequests).toHaveLength(0);
609
+ });
610
+ });
611
+
612
+ describe("a project that cannot seed a Ping monitor", () => {
613
+ test("shows the resolver's message instead of a form that cannot be saved", async () => {
614
+ // No offline status: nothing for the "unreachable" criteria to move to.
615
+ monitorStatusRows = [
616
+ monitorStatus({
617
+ id: ONLINE_STATUS_ID,
618
+ isOperationalState: true,
619
+ isOfflineState: false,
620
+ }),
621
+ ];
622
+
623
+ renderCreatePage();
624
+
625
+ await screen.findByText(
626
+ "This project needs both an operational and an offline monitor status before Ping monitors can be created. Add them under Project Settings, then try again.",
627
+ );
628
+
629
+ expect(capturedForm).toBeNull();
630
+ });
631
+ });
632
+ });