@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,238 @@
1
+ import DatabaseService from "./DatabaseService";
2
+ import NetworkDeviceService from "./NetworkDeviceService";
3
+ import NetworkSiteService from "./NetworkSiteService";
4
+ import Model from "../../Models/DatabaseModels/NetworkSnmpCredentialProfile";
5
+ import CreateBy from "../Types/Database/CreateBy";
6
+ import DeleteBy from "../Types/Database/DeleteBy";
7
+ import Query from "../Types/Database/Query";
8
+ import UpdateBy from "../Types/Database/UpdateBy";
9
+ import { OnCreate, OnDelete, OnUpdate } from "../Types/Database/Hooks";
10
+ import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
11
+ import DatabaseCommonInteractionProps from "../../Types/BaseDatabase/DatabaseCommonInteractionProps";
12
+ import LIMIT_MAX from "../../Types/Database/LimitMax";
13
+ import BadDataException from "../../Types/Exception/BadDataException";
14
+ import ObjectID from "../../Types/ObjectID";
15
+ import PositiveNumber from "../../Types/PositiveNumber";
16
+ import {
17
+ SnmpCredentialCarrier,
18
+ hasUsableCredentials,
19
+ } from "../../Utils/NetworkDevice/SnmpCredentialUtil";
20
+
21
+ /*
22
+ * A profile is a row of credentials that other rows point at, and most of
23
+ * what is interesting about it happens elsewhere: the poller resolves it
24
+ * (device columns, then device profile, then site profile), the model's
25
+ * column access control keeps its secrets from the roles that may not read
26
+ * them, and DatabaseService encrypts those secrets at rest. There is no
27
+ * fan-out on edit because nothing is copied out of a profile - a device
28
+ * using one is walked with whatever the profile says at poll time.
29
+ *
30
+ * The service owns two things.
31
+ *
32
+ * THE NAME. It is unique per project and it is the label every device and
33
+ * site listing shows for the profile it joins, so a trailing space must not
34
+ * be what makes "Branch v2c" and "Branch v2c " two different profiles, and a
35
+ * blank one must not get past the required check by being three spaces long.
36
+ *
37
+ * THE DELETE GUARD. Both foreign keys onto this table are ON DELETE SET NULL,
38
+ * so deleting a profile that devices or sites still use does not fail - it
39
+ * silently drops every one of them down the resolution order, and a device
40
+ * whose site has no profile either goes from walked to ping-only on its next
41
+ * poll with nothing anywhere to say why. Refuse instead, and say how many
42
+ * devices and sites are in the way. Sites count separately from devices
43
+ * because a site can hold the last reference to a profile while no device
44
+ * points at it directly - that is exactly what "set it once per site" means.
45
+ */
46
+ export class Service extends DatabaseService<Model> {
47
+ public constructor() {
48
+ super(Model);
49
+ }
50
+
51
+ /**
52
+ * "Does this profile carry enough to open an SNMP session with?" -
53
+ * delegated to the pure util so the poller can ask the same question of a
54
+ * device row with the same function. Exposed here so a caller holding the
55
+ * service does not have to know where the predicate lives.
56
+ */
57
+ public hasUsableCredentials(profile: SnmpCredentialCarrier): boolean {
58
+ return hasUsableCredentials(profile);
59
+ }
60
+
61
+ @CaptureSpan()
62
+ protected override async onBeforeCreate(
63
+ createBy: CreateBy<Model>,
64
+ ): Promise<OnCreate<Model>> {
65
+ createBy.data.name = this.normalizeName(createBy.data.name);
66
+
67
+ return { createBy, carryForward: null };
68
+ }
69
+
70
+ @CaptureSpan()
71
+ protected override async onBeforeUpdate(
72
+ updateBy: UpdateBy<Model>,
73
+ ): Promise<OnUpdate<Model>> {
74
+ /*
75
+ * `!== undefined` rather than a truthiness check: an update that does not
76
+ * mention the name (a description edit, a rotated community string) must
77
+ * leave it alone, while an update that sets it to "" or null is a blank
78
+ * name and is refused the same way a blank create is.
79
+ */
80
+ if (updateBy.data.name !== undefined) {
81
+ updateBy.data.name = this.normalizeName(updateBy.data.name);
82
+ }
83
+
84
+ return { updateBy, carryForward: null };
85
+ }
86
+
87
+ /*
88
+ * Refuse to delete a profile that any device or any site still points at.
89
+ *
90
+ * Counting rather than keeping a rollup column is deliberate - a maintained
91
+ * counter would make this row hot under every device create and rebind,
92
+ * and NetworkDeviceOidTemplateService set the precedent for exactly this
93
+ * guard. Both counts are always taken and both are always reported, so
94
+ * the operator learns in one message everything that has to move before
95
+ * the delete can go through, rather than clearing the devices and then
96
+ * being told about the sites.
97
+ */
98
+ @CaptureSpan()
99
+ protected override async onBeforeDelete(
100
+ deleteBy: DeleteBy<Model>,
101
+ ): Promise<OnDelete<Model>> {
102
+ const profilesToDelete: Array<Model> = await this.findBy({
103
+ /*
104
+ * This hook runs BEFORE DatabaseService permission-checks the query, so
105
+ * a raw isRoot read of deleteBy.query would hand back other tenants'
106
+ * profiles. Re-apply the caller's tenant, exactly as NetworkSiteService
107
+ * and NetworkDeviceOidTemplateService do for the same reason.
108
+ */
109
+ query: this.scopeQueryToCallerTenant(deleteBy.query, deleteBy.props),
110
+ select: {
111
+ _id: true,
112
+ name: true,
113
+ projectId: true,
114
+ },
115
+ limit: LIMIT_MAX,
116
+ skip: 0,
117
+ props: {
118
+ isRoot: true,
119
+ },
120
+ });
121
+
122
+ for (const profile of profilesToDelete) {
123
+ if (!profile.id || !profile.projectId) {
124
+ continue;
125
+ }
126
+
127
+ const [linkedDeviceCount, linkedSiteCount]: [number, number] =
128
+ await Promise.all([
129
+ this.countLinkedDevices({
130
+ profileId: profile.id,
131
+ projectId: profile.projectId,
132
+ }),
133
+ this.countLinkedSites({
134
+ profileId: profile.id,
135
+ projectId: profile.projectId,
136
+ }),
137
+ ]);
138
+
139
+ if (linkedDeviceCount > 0 || linkedSiteCount > 0) {
140
+ throw new BadDataException(
141
+ `This SNMP Credential Profile is used by ${linkedDeviceCount} devices and ${linkedSiteCount} sites. Remove it from them first, or point them at another profile.`,
142
+ );
143
+ }
144
+ }
145
+
146
+ return { deleteBy, carryForward: null };
147
+ }
148
+
149
+ /**
150
+ * How many devices point at this profile directly. Used by the delete
151
+ * guard above and available to the profile page.
152
+ *
153
+ * Read as root, scoped to the profile's own project: the caller who may
154
+ * delete a profile is not necessarily allowed to read every device, and a
155
+ * partial count would let the delete through with devices still attached.
156
+ */
157
+ @CaptureSpan()
158
+ public async countLinkedDevices(data: {
159
+ profileId: ObjectID;
160
+ projectId: ObjectID;
161
+ }): Promise<number> {
162
+ const count: PositiveNumber = await NetworkDeviceService.countBy({
163
+ query: {
164
+ projectId: data.projectId,
165
+ snmpCredentialProfileId: data.profileId,
166
+ },
167
+ props: {
168
+ isRoot: true,
169
+ },
170
+ });
171
+
172
+ return count.toNumber();
173
+ }
174
+
175
+ /**
176
+ * How many sites carry this profile as their default. Same shape and same
177
+ * reasoning as countLinkedDevices.
178
+ */
179
+ @CaptureSpan()
180
+ public async countLinkedSites(data: {
181
+ profileId: ObjectID;
182
+ projectId: ObjectID;
183
+ }): Promise<number> {
184
+ const count: PositiveNumber = await NetworkSiteService.countBy({
185
+ query: {
186
+ projectId: data.projectId,
187
+ snmpCredentialProfileId: data.profileId,
188
+ },
189
+ props: {
190
+ isRoot: true,
191
+ },
192
+ });
193
+
194
+ return count.toNumber();
195
+ }
196
+
197
+ /*
198
+ * See NetworkSiteService for the full explanation: hooks run before
199
+ * ModelPermission scopes the caller's query, so anything a hook reads with
200
+ * isRoot has to be re-scoped by hand or it spans projects.
201
+ */
202
+ private scopeQueryToCallerTenant(
203
+ query: Query<Model>,
204
+ props: DatabaseCommonInteractionProps,
205
+ ): Query<Model> {
206
+ if (props.isRoot || !props.tenantId) {
207
+ return query;
208
+ }
209
+
210
+ return {
211
+ ...query,
212
+ projectId: props.tenantId,
213
+ };
214
+ }
215
+
216
+ /*
217
+ * The name as it will be stored, or a BadDataException. Only a plain string
218
+ * is accepted: the column is also used as a label, and a raw SQL expression
219
+ * (the other shape PartialEntity allows) has no business being one.
220
+ */
221
+ private normalizeName(name: unknown): string {
222
+ if (typeof name !== "string") {
223
+ throw new BadDataException("SNMP Credential Profile name is required.");
224
+ }
225
+
226
+ const trimmed: string = name.trim();
227
+
228
+ if (!trimmed) {
229
+ throw new BadDataException(
230
+ "SNMP Credential Profile name cannot be blank.",
231
+ );
232
+ }
233
+
234
+ return trimmed;
235
+ }
236
+ }
237
+
238
+ export default new Service();
@@ -12,6 +12,10 @@ import ObjectID from "../../Types/ObjectID";
12
12
  import Project from "../../Models/DatabaseModels/Project";
13
13
  import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
14
14
  import SlackUtil from "../Utils/Workspace/Slack/Slack";
15
+ import {
16
+ BillingFailureNoticeKind,
17
+ shouldSendBillingFailureNotice,
18
+ } from "../Utils/Billing/BillingFailureNoticeThrottle";
15
19
  import URL from "../../Types/API/URL";
16
20
  import Exception from "../../Types/Exception/Exception";
17
21
 
@@ -24,7 +28,27 @@ export class NotificationService extends BaseService {
24
28
  public async rechargeBalance(
25
29
  projectId: ObjectID,
26
30
  amountInUSD: number,
31
+ options?: {
32
+ /*
33
+ * Whether a successful recharge is worth telling the owners about.
34
+ *
35
+ * True for the manual "Recharge" button in Project Settings, where the
36
+ * email is the only confirmation a person gets that their card was
37
+ * charged: Project.sendInvoicesByEmail defaults to false, so the Stripe
38
+ * invoice is filed rather than sent, and the Slack notification is an
39
+ * operator webhook that most installs never configure.
40
+ *
41
+ * False for rechargeIfBalanceIsLow, which runs inline on every SMS,
42
+ * call, WhatsApp and Telegram attempt - there, "we topped your balance
43
+ * up" is not news, and during a paging storm it is one email to every
44
+ * owner per recharge.
45
+ */
46
+ sendOwnerConfirmationEmail?: boolean | undefined;
47
+ },
27
48
  ): Promise<number> {
49
+ const sendOwnerConfirmationEmail: boolean =
50
+ options?.sendOwnerConfirmationEmail !== false;
51
+
28
52
  const project: Project | null = await ProjectService.findOneById({
29
53
  id: projectId,
30
54
  select: {
@@ -48,13 +72,36 @@ export class NotificationService extends BaseService {
48
72
  return 0;
49
73
  }
50
74
 
75
+ /*
76
+ * The no-payment-method branch below throws, and that throw lands in this
77
+ * method's own catch. Without this the FIRST no-payment-method failure
78
+ * sends two "ACTION REQUIRED" emails about the same fact, one from each
79
+ * place. This is a local flag rather than a mutation of `project` so it is
80
+ * obvious it exists only to coordinate those two blocks.
81
+ */
82
+ let ownersAlreadyToldAboutThisFailure: boolean = false;
83
+
51
84
  try {
52
85
  if (
53
86
  !(await BillingService.hasPaymentMethods(
54
87
  project.paymentProviderCustomerId!,
55
88
  ))
56
89
  ) {
57
- if (!project.failedCallAndSMSBalanceChargeNotificationSentToOwners) {
90
+ /*
91
+ * The same 24h window as the catch below, for the same reason: the
92
+ * project boolean this branch used to latch on is cleared only by a
93
+ * SUCCESSFUL recharge, so a project that never manages one was told
94
+ * once and then never again. A window says it once a day until
95
+ * somebody fixes it, which is what an ACTION REQUIRED message is for.
96
+ */
97
+ ownersAlreadyToldAboutThisFailure = true;
98
+
99
+ const shouldTellOwners: boolean = await shouldSendBillingFailureNotice({
100
+ projectId: project.id!,
101
+ kind: BillingFailureNoticeKind.SmsAndCallRechargeFailed,
102
+ });
103
+
104
+ if (shouldTellOwners) {
58
105
  await ProjectService.updateOneById({
59
106
  data: {
60
107
  failedCallAndSMSBalanceChargeNotificationSentToOwners: true,
@@ -110,16 +157,27 @@ export class NotificationService extends BaseService {
110
157
  },
111
158
  });
112
159
 
113
- await ProjectService.sendEmailToProjectOwners(
114
- project.id!,
115
- "SMS and Call Recharge Successful for project - " +
116
- (project.name || ""),
117
- `We have successfully recharged your SMS and Call balance for project - ${
118
- project.name || ""
119
- } by ${amountInUSD} USD. Your current balance is ${
120
- updatedAmount / 100
121
- } USD.`,
122
- );
160
+ /*
161
+ * The confirmation is suppressed for AUTO-recharge only. This used to
162
+ * fire unconditionally, and because rechargeIfBalanceIsLow runs inline
163
+ * on every SMS, call, WhatsApp and Telegram attempt, a project that
164
+ * auto-recharges during a paging storm mailed every owner once per
165
+ * recharge. Somebody who deliberately clicked "Recharge" still gets
166
+ * told: nothing else reliably tells them, because
167
+ * Project.sendInvoicesByEmail defaults to false.
168
+ */
169
+ if (sendOwnerConfirmationEmail) {
170
+ await ProjectService.sendEmailToProjectOwners(
171
+ project.id!,
172
+ "SMS and Call Recharge Successful for project - " +
173
+ (project.name || ""),
174
+ `We have successfully recharged your SMS and Call balance for project - ${
175
+ project.name || ""
176
+ } by ${amountInUSD} USD. Your current balance is ${
177
+ updatedAmount / 100
178
+ } USD.`,
179
+ );
180
+ }
123
181
 
124
182
  // Send Slack notification for balance refill
125
183
  this.sendBalanceRefillSlackNotification({
@@ -137,23 +195,46 @@ export class NotificationService extends BaseService {
137
195
 
138
196
  return updatedAmount;
139
197
  } catch (err) {
140
- await ProjectService.updateOneById({
141
- data: {
142
- failedCallAndSMSBalanceChargeNotificationSentToOwners: true,
143
- },
144
- id: project.id!,
145
- props: {
146
- isRoot: true,
147
- },
148
- });
149
- await ProjectService.sendEmailToProjectOwners(
150
- project.id!,
151
- "ACTION REQUIRED: SMS and Call Recharge Failed for project - " +
152
- (project.name || ""),
153
- `We have tried recharged your SMS and Call balance for project - ${
154
- project.name || ""
155
- } and failed. Please make sure your payment method is upto date and has sufficient balance. You can add new payment methods in Project Settings.`,
156
- );
198
+ /*
199
+ * This block used to write failedCallAndSMSBalanceChargeNotificationSent
200
+ * ToOwners and then send WITHOUT ever reading it, so a project with a
201
+ * declined card mailed every owner once per paging attempt - inline on
202
+ * every SMS and call, during the outage the pages were about.
203
+ *
204
+ * The guard is a 24h window rather than that boolean deliberately. The
205
+ * boolean is only cleared by a successful recharge, so latching on it
206
+ * would mean: no card -> mail once and latch -> owner adds a card -> the
207
+ * card is declined -> the recharge can never succeed -> the latch never
208
+ * clears -> nobody is ever told the new card failed, and paging quietly
209
+ * stops. A window collapses the storm to one email a day and still
210
+ * reports a new failure within a day. See BillingFailureNoticeThrottle.
211
+ */
212
+ if (!ownersAlreadyToldAboutThisFailure) {
213
+ const shouldTellOwners: boolean = await shouldSendBillingFailureNotice({
214
+ projectId: project.id!,
215
+ kind: BillingFailureNoticeKind.SmsAndCallRechargeFailed,
216
+ });
217
+
218
+ if (shouldTellOwners) {
219
+ await ProjectService.updateOneById({
220
+ data: {
221
+ failedCallAndSMSBalanceChargeNotificationSentToOwners: true,
222
+ },
223
+ id: project.id!,
224
+ props: {
225
+ isRoot: true,
226
+ },
227
+ });
228
+ await ProjectService.sendEmailToProjectOwners(
229
+ project.id!,
230
+ "ACTION REQUIRED: SMS and Call Recharge Failed for project - " +
231
+ (project.name || ""),
232
+ `We have tried recharged your SMS and Call balance for project - ${
233
+ project.name || ""
234
+ } and failed. Please make sure your payment method is upto date and has sufficient balance. You can add new payment methods in Project Settings.`,
235
+ );
236
+ }
237
+ }
157
238
  logger.error(err, { projectId: projectId?.toString() } as LogAttributes);
158
239
  throw err;
159
240
  }
@@ -214,6 +295,15 @@ export class NotificationService extends BaseService {
214
295
  const updatedAmount: number = await this.rechargeBalance(
215
296
  projectId,
216
297
  autoRechargeSmsOrCallByBalanceInUSD,
298
+ {
299
+ /*
300
+ * This method is called inline from SmsService, CallService,
301
+ * WhatsAppService and TelegramService on EVERY notification
302
+ * attempt, so a success email here is one message to every owner
303
+ * per recharge, in the middle of the storm that caused it.
304
+ */
305
+ sendOwnerConfirmationEmail: false,
306
+ },
217
307
  );
218
308
  project.smsOrCallCurrentBalanceInUSDCents = updatedAmount;
219
309
  }
@@ -65,6 +65,7 @@ import {
65
65
  } from "../../Types/BrandColors";
66
66
  import Color from "../../Types/Color";
67
67
  import LIMIT_MAX from "../../Types/Database/LimitMax";
68
+ import SortOrder from "../../Types/BaseDatabase/SortOrder";
68
69
  import QueryDeepPartialEntity from "../../Types/Database/PartialEntity";
69
70
  import OneUptimeDate from "../../Types/Date";
70
71
  import EmailTemplateType from "../../Types/Email/EmailTemplateType";
@@ -85,6 +86,10 @@ import {
85
86
  DEFAULT_NETWORK_DEVICE_ROLES,
86
87
  DefaultNetworkDeviceRole,
87
88
  } from "../../Types/NetworkDevice/DefaultNetworkDeviceRole";
89
+ import {
90
+ DefaultNetworkSiteTypeCreationOrder,
91
+ DefaultNetworkSiteTypeParent,
92
+ } from "../../Types/NetworkSite/DefaultNetworkSiteTypeHierarchy";
88
93
  import Model from "../../Models/DatabaseModels/Project";
89
94
  import BaseModel from "../../Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel";
90
95
  import PromoCode from "../../Models/DatabaseModels/PromoCode";
@@ -1912,21 +1917,50 @@ These are no longer recorded against the project and have to be cancelled by han
1912
1917
  * addDefaultAlertSeverity / addDefaultAlertState.
1913
1918
  */
1914
1919
  @CaptureSpan()
1915
- public async addDefaultNetworkSiteTypes(createdItem: Model): Promise<Model> {
1920
+ public async addDefaultNetworkSiteTypes(
1921
+ createdItem: Model,
1922
+ options?: { setParentRelationships?: boolean },
1923
+ ): Promise<Model> {
1916
1924
  const projectId: ObjectID = createdItem.id!;
1917
1925
 
1918
- // Idempotent see getExistingProjectScopedNames.
1919
- const existingNames: Set<string | undefined> =
1920
- await this.getExistingProjectScopedNames(
1921
- NetworkSiteTypeService,
1922
- projectId,
1923
- );
1926
+ const existingNetworkSiteTypes: Array<NetworkSiteType> = [];
1927
+ let networkSiteTypeSkip: number = 0;
1928
+
1929
+ while (true) {
1930
+ const page: Array<NetworkSiteType> = await NetworkSiteTypeService.findBy({
1931
+ query: { projectId },
1932
+ select: { _id: true, name: true },
1933
+ sort: { _id: SortOrder.Ascending },
1934
+ limit: LIMIT_MAX,
1935
+ skip: networkSiteTypeSkip,
1936
+ props: { isRoot: true },
1937
+ });
1938
+
1939
+ existingNetworkSiteTypes.push(...page);
1940
+
1941
+ if (page.length < LIMIT_MAX) {
1942
+ break;
1943
+ }
1944
+
1945
+ networkSiteTypeSkip += page.length;
1946
+ }
1947
+
1948
+ const networkSiteTypeByName: Map<string, NetworkSiteType> = new Map<
1949
+ string,
1950
+ NetworkSiteType
1951
+ >();
1952
+
1953
+ for (const networkSiteType of existingNetworkSiteTypes) {
1954
+ if (networkSiteType.name) {
1955
+ networkSiteTypeByName.set(networkSiteType.name, networkSiteType);
1956
+ }
1957
+ }
1924
1958
 
1925
1959
  /*
1926
- * Listed broadest-first: the array position is the hierarchy level, so the
1927
- * index drives `order` (1..7, lower = higher in the hierarchy). Names come
1928
- * from DefaultNetworkSiteType so that enum stays the single source of
1929
- * truth for the defaults, shared with the backfill data migration.
1960
+ * DefaultNetworkSiteTypeCreationOrder lists parents before children, so a
1961
+ * parent's ID is always available by the time its child is created. The
1962
+ * parent mapping itself is shared with the data migration that repairs
1963
+ * projects created before type parents existed.
1930
1964
  *
1931
1965
  * isUnitLevel is true for "Unit" only. It is load-bearing, not a label:
1932
1966
  * the network map drills sites of a unit-level type into their device
@@ -1934,81 +1968,104 @@ These are no longer recorded against the project and have to be cancelled by han
1934
1968
  * as units. Downstream code keys off this flag rather than the name,
1935
1969
  * because the name is user-editable once seeded.
1936
1970
  */
1937
- const defaultNetworkSiteTypes: Array<{
1938
- name: DefaultNetworkSiteType;
1939
- description: string;
1940
- isUnitLevel: boolean;
1941
- }> = [
1942
- {
1943
- name: DefaultNetworkSiteType.AccountType,
1971
+ const defaultNetworkSiteTypes: Readonly<
1972
+ Record<
1973
+ DefaultNetworkSiteType,
1974
+ {
1975
+ description: string;
1976
+ isUnitLevel: boolean;
1977
+ }
1978
+ >
1979
+ > = {
1980
+ [DefaultNetworkSiteType.AccountType]: {
1944
1981
  description:
1945
1982
  "Top level grouping - the kind of account the sites underneath it belong to.",
1946
1983
  isUnitLevel: false,
1947
1984
  },
1948
- {
1949
- name: DefaultNetworkSiteType.Region,
1985
+ [DefaultNetworkSiteType.Region]: {
1950
1986
  description:
1951
1987
  "A broad geographic region that groups markets and the sites within them.",
1952
1988
  isUnitLevel: false,
1953
1989
  },
1954
- {
1955
- name: DefaultNetworkSiteType.Franchisee,
1990
+ [DefaultNetworkSiteType.Franchisee]: {
1956
1991
  description:
1957
1992
  "An operator or franchise partner responsible for a group of sites.",
1958
1993
  isUnitLevel: false,
1959
1994
  },
1960
- {
1961
- name: DefaultNetworkSiteType.Market,
1995
+ [DefaultNetworkSiteType.Market]: {
1962
1996
  description: "A metro or trade area that groups the sites within it.",
1963
1997
  isUnitLevel: false,
1964
1998
  },
1965
- {
1966
- name: DefaultNetworkSiteType.Unit,
1999
+ [DefaultNetworkSiteType.Unit]: {
1967
2000
  description:
1968
2001
  "An individual location with network devices. This is the leaf level of the hierarchy.",
1969
2002
  isUnitLevel: true,
1970
2003
  },
1971
- {
1972
- name: DefaultNetworkSiteType.DataCenter,
2004
+ [DefaultNetworkSiteType.DataCenter]: {
1973
2005
  description:
1974
2006
  "A data center or core facility that hosts shared infrastructure.",
1975
2007
  isUnitLevel: false,
1976
2008
  },
1977
- {
1978
- name: DefaultNetworkSiteType.Other,
2009
+ [DefaultNetworkSiteType.Other]: {
1979
2010
  description: "Any site that does not fit the other levels.",
1980
2011
  isUnitLevel: false,
1981
2012
  },
1982
- ];
2013
+ };
1983
2014
 
1984
- for (
1985
- let index: number = 0;
1986
- index < defaultNetworkSiteTypes.length;
1987
- index++
1988
- ) {
2015
+ /*
2016
+ * `order` is a sibling display order, not a proxy for depth. Increment a
2017
+ * separate counter per parent: the default chain's only child is 1 at each
2018
+ * level, while the three roots are Account Type (1), Data Center (2), and
2019
+ * Other (3).
2020
+ */
2021
+ const nextOrderByParent: Map<DefaultNetworkSiteType | null, number> =
2022
+ new Map<DefaultNetworkSiteType | null, number>();
2023
+
2024
+ for (const name of DefaultNetworkSiteTypeCreationOrder) {
1989
2025
  const defaultNetworkSiteType: {
1990
- name: DefaultNetworkSiteType;
1991
2026
  description: string;
1992
2027
  isUnitLevel: boolean;
1993
- } = defaultNetworkSiteTypes[index]!;
1994
-
1995
- if (existingNames.has(defaultNetworkSiteType.name)) {
2028
+ } = defaultNetworkSiteTypes[name];
2029
+ const parentName: DefaultNetworkSiteType | null =
2030
+ options?.setParentRelationships === false
2031
+ ? null
2032
+ : DefaultNetworkSiteTypeParent[name];
2033
+ const siblingOrder: number = (nextOrderByParent.get(parentName) || 0) + 1;
2034
+ nextOrderByParent.set(parentName, siblingOrder);
2035
+
2036
+ if (networkSiteTypeByName.has(name)) {
1996
2037
  continue;
1997
2038
  }
1998
2039
 
1999
2040
  const networkSiteType: NetworkSiteType = new NetworkSiteType();
2000
- networkSiteType.name = defaultNetworkSiteType.name;
2041
+ networkSiteType.name = name;
2001
2042
  networkSiteType.description = defaultNetworkSiteType.description;
2002
2043
  networkSiteType.isUnitLevel = defaultNetworkSiteType.isUnitLevel;
2003
2044
  networkSiteType.projectId = projectId;
2004
- networkSiteType.order = index + 1;
2045
+ networkSiteType.order = siblingOrder;
2005
2046
 
2006
- await NetworkSiteTypeService.create({
2007
- data: networkSiteType,
2008
- props: {
2009
- isRoot: true,
2010
- },
2011
- });
2047
+ if (parentName) {
2048
+ const parent: NetworkSiteType | undefined =
2049
+ networkSiteTypeByName.get(parentName);
2050
+
2051
+ if (!parent?.id) {
2052
+ throw new BadDataException(
2053
+ `Cannot create the default ${name} Network Site Type because its ${parentName} parent could not be resolved.`,
2054
+ );
2055
+ }
2056
+
2057
+ networkSiteType.parentNetworkSiteTypeId = parent.id;
2058
+ }
2059
+
2060
+ const createdNetworkSiteType: NetworkSiteType =
2061
+ await NetworkSiteTypeService.create({
2062
+ data: networkSiteType,
2063
+ props: {
2064
+ isRoot: true,
2065
+ },
2066
+ });
2067
+
2068
+ networkSiteTypeByName.set(name, createdNetworkSiteType);
2012
2069
  }
2013
2070
 
2014
2071
  return createdItem;