@oneuptime/common 12.0.32 → 12.0.33

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (597) hide show
  1. package/Models/AnalyticsModels/Span.ts +14 -0
  2. package/Models/DatabaseModels/EnterpriseLicense.ts +56 -0
  3. package/Models/DatabaseModels/Index.ts +10 -0
  4. package/Models/DatabaseModels/Monitor.ts +76 -0
  5. package/Models/DatabaseModels/NetworkAlertPolicy.ts +690 -0
  6. package/Models/DatabaseModels/NetworkDevice.ts +176 -1
  7. package/Models/DatabaseModels/NetworkSite.ts +201 -2
  8. package/Models/DatabaseModels/NetworkSiteType.ts +102 -3
  9. package/Models/DatabaseModels/NetworkSnmpCredentialProfile.ts +841 -0
  10. package/Models/DatabaseModels/TelemetryException.ts +119 -0
  11. package/Models/DatabaseModels/UserNotificationEmailRollupBatch.ts +334 -0
  12. package/Models/DatabaseModels/UserNotificationEmailRollupItem.ts +370 -0
  13. package/Models/DatabaseModels/UserNotificationEmailRollupSetting.ts +282 -0
  14. package/Server/API/EnterpriseLicenseAPI.ts +391 -64
  15. package/Server/API/LlmProviderAPI.ts +137 -22
  16. package/Server/EnvironmentConfig.ts +14 -0
  17. package/Server/Infrastructure/Postgres/SchemaMigrations/1790700000000-AddNetworkSiteTypeParentHierarchy.ts +55 -0
  18. package/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddEnterpriseLicenseUsageProvenance.ts +31 -0
  19. package/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddTelemetryExceptionErrorClass.ts +124 -0
  20. package/Server/Infrastructure/Postgres/SchemaMigrations/1791000000000-AddUserNotificationEmailRollup.ts +132 -0
  21. package/Server/Infrastructure/Postgres/SchemaMigrations/1791100000000-AddUserNotificationEmailRollupSetting.ts +79 -0
  22. package/Server/Infrastructure/Postgres/SchemaMigrations/1791200000000-AddNetworkSnmpCredentialProfilesAndAlertPolicies.ts +191 -0
  23. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +12 -0
  24. package/Server/Infrastructure/QueueWorker.ts +38 -8
  25. package/Server/Middleware/BearerTokenAuthorization.ts +12 -0
  26. package/Server/Middleware/ProjectAuthorization.ts +11 -0
  27. package/Server/Middleware/SCIMAuthorization.ts +12 -0
  28. package/Server/Middleware/TelemetryIngest.ts +11 -0
  29. package/Server/Services/AIBillingService.ts +101 -27
  30. package/Server/Services/EnterpriseLicenseInstanceService.ts +197 -0
  31. package/Server/Services/EnterpriseLicenseService.ts +55 -0
  32. package/Server/Services/Index.ts +10 -0
  33. package/Server/Services/MonitorService.ts +143 -21
  34. package/Server/Services/MonitorStatusTimelineService.ts +150 -8
  35. package/Server/Services/MonitorTemplateService.ts +217 -1
  36. package/Server/Services/NetworkAlertPolicyEngineService.ts +2159 -0
  37. package/Server/Services/NetworkAlertPolicyService.ts +944 -0
  38. package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +9 -10
  39. package/Server/Services/NetworkDeviceAutoImportRuleService.ts +60 -15
  40. package/Server/Services/NetworkDeviceService.ts +1032 -73
  41. package/Server/Services/NetworkSiteService.ts +1502 -129
  42. package/Server/Services/NetworkSiteTypeService.ts +1216 -0
  43. package/Server/Services/NetworkSnmpCredentialProfileService.ts +238 -0
  44. package/Server/Services/NotificationService.ts +118 -28
  45. package/Server/Services/ProjectService.ts +105 -48
  46. package/Server/Services/StatusPagePrivateUserService.ts +103 -3
  47. package/Server/Services/UserNotificationEmailRollupBatchService.ts +78 -0
  48. package/Server/Services/UserNotificationEmailRollupItemService.ts +79 -0
  49. package/Server/Services/UserNotificationEmailRollupSettingService.ts +113 -0
  50. package/Server/Services/UserNotificationSettingService.ts +62 -25
  51. package/Server/Services/UserService.ts +95 -0
  52. package/Server/Types/Database/QueryHelper.ts +2 -2
  53. package/Server/Utils/AI/Chat/ObservabilityChatPrompt.ts +14 -3
  54. package/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.ts +10 -0
  55. package/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.ts +10 -0
  56. package/Server/Utils/AI/SRE/Insights/InsightTriageRunner.ts +62 -1
  57. package/Server/Utils/AI/Toolbox/AlertTools.ts +15 -1
  58. package/Server/Utils/Billing/BillingFailureNoticeThrottle.ts +80 -0
  59. package/Server/Utils/DataSource/HttpFetch.ts +9 -2
  60. package/Server/Utils/EmailRollup/EmailRollupConstants.ts +98 -0
  61. package/Server/Utils/EmailRollup/EmailRollupFlushRunner.ts +872 -0
  62. package/Server/Utils/EmailRollup/EmailRollupRenderer.ts +781 -0
  63. package/Server/Utils/EmailRollup/EmailRollupWriter.ts +368 -0
  64. package/Server/Utils/LLM/LLMService.ts +78 -0
  65. package/Server/Utils/LogRedaction.ts +8 -0
  66. package/Server/Utils/Logger.ts +79 -1
  67. package/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.ts +190 -0
  68. package/Server/Utils/Monitor/Criteria/EvaluateOverTime.ts +9 -2
  69. package/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.ts +61 -1
  70. package/Server/Utils/Monitor/MonitorCriteriaDataExtractor.ts +14 -0
  71. package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +49 -0
  72. package/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.ts +255 -4
  73. package/Server/Utils/Monitor/MonitorMetricUtil.ts +41 -0
  74. package/Server/Utils/Monitor/MonitorTemplateUtil.ts +43 -0
  75. package/Server/Utils/Monitor/NetworkDeviceHydrationUtil.ts +499 -19
  76. package/Server/Utils/Monitor/NetworkDeviceMetricUtil.ts +66 -10
  77. package/Server/Utils/Monitor/NetworkDeviceWalkUtil.ts +238 -44
  78. package/Server/Utils/Monitor/NetworkInventoryUtil.ts +146 -39
  79. package/Server/Utils/NetworkDevice/DeviceHealthAggregation.ts +31 -18
  80. package/Server/Utils/NetworkSite/NetworkSiteHierarchyLock.ts +213 -0
  81. package/Server/Utils/OutboundUserAgent.ts +152 -0
  82. package/Server/Utils/StartServer.ts +51 -19
  83. package/Server/Utils/Telemetry/CaptureSpan.ts +32 -8
  84. package/Server/Utils/Telemetry/ErrorClassResolver.ts +120 -0
  85. package/Server/Utils/Telemetry/SpanUtil.ts +33 -0
  86. package/Server/Utils/Telemetry.ts +198 -51
  87. package/Server/Views/Partials/SensitiveUrlToken.ejs +140 -0
  88. package/Tests/App/Dashboard/AddNeighborToMonitoringModal.test.tsx +134 -33
  89. package/Tests/App/Dashboard/AskAiSuggestedPrompts.test.ts +279 -0
  90. package/Tests/App/Dashboard/DashboardEditPermissions.test.tsx +517 -0
  91. package/Tests/App/Dashboard/DashboardVariablesDiscard.test.tsx +26 -0
  92. package/Tests/App/Dashboard/DeviceStatusHero.test.tsx +588 -0
  93. package/Tests/App/Dashboard/DiscoveryScanWizardValidation.test.tsx +18 -9
  94. package/Tests/App/Dashboard/MonitorCreateFromMonitorBackedDevice.test.tsx +632 -0
  95. package/Tests/App/Dashboard/MonitorRecommendationCreateProgress.test.tsx +682 -0
  96. package/Tests/App/Dashboard/MonitorTypePicker.test.tsx +4 -2
  97. package/Tests/App/Dashboard/NetworkDeviceCreateFormMonitorBinding.test.tsx +676 -0
  98. package/Tests/App/Dashboard/NetworkDeviceCreateFormPingMonitor.test.tsx +791 -0
  99. package/Tests/App/Dashboard/NetworkDeviceCreateFormProbeAndSnmp.test.tsx +833 -0
  100. package/Tests/App/Dashboard/NetworkDeviceCriteriaFilter.test.ts +161 -0
  101. package/Tests/App/Dashboard/NetworkDeviceSettingsMonitoringSection.test.tsx +458 -0
  102. package/Tests/App/Dashboard/NetworkSideMenu.test.tsx +41 -5
  103. package/Tests/App/Dashboard/PingMonitorProvisioning.test.ts +368 -0
  104. package/Tests/App/Dashboard/RecommendationCard.test.tsx +796 -0
  105. package/Tests/App/Dashboard/RecommendationToolbar.test.tsx +519 -0
  106. package/Tests/App/Dashboard/RecommendationsList.test.tsx +661 -0
  107. package/Tests/App/Dashboard/UseBulkCreatePingMonitors.test.tsx +899 -0
  108. package/Tests/App/Dashboard/UseBulkSnmpCredentialProfileActions.test.tsx +732 -0
  109. package/Tests/App/SensitiveUrlTokenBootstrap.test.ts +256 -0
  110. package/Tests/App/StatusPage/StatusPageIndexPageRobotsMeta.test.ts +11 -1
  111. package/Tests/App/StatusPage/StatusPageLoginCodeBootstrap.test.ts +9 -4
  112. package/Tests/Models/NetworkSiteHierarchy.test.ts +41 -4
  113. package/Tests/Server/API/EnterpriseLicenseReportUserCount.test.ts +951 -7
  114. package/Tests/Server/API/LlmProviderConnectionTest.test.ts +522 -0
  115. package/Tests/Server/Infrastructure/Postgres/NetworkSnmpCredentialProfilesAndAlertPoliciesMigration.test.ts +854 -0
  116. package/Tests/Server/Infrastructure/Postgres/SchemaMigrationsOrdering.test.ts +18 -0
  117. package/Tests/Server/Infrastructure/Postgres/UserNotificationEmailRollupTableMigration.test.ts +535 -0
  118. package/Tests/Server/Services/AIChatPrivacyPin.test.ts +560 -0
  119. package/Tests/Server/Services/BillingRechargeOwnerEmailGuards.test.ts +783 -0
  120. package/Tests/Server/Services/EnterpriseLicenseInstanceServiceDeletionUsage.test.ts +707 -0
  121. package/Tests/Server/Services/EnterpriseLicenseServiceUsageAggregationLock.test.ts +329 -0
  122. package/Tests/Server/Services/MonitorServiceDeleteNetworkDeviceCleanup.test.ts +294 -0
  123. package/Tests/Server/Services/MonitorStatusBridgeProbePath.test.ts +802 -0
  124. package/Tests/Server/Services/MonitorStatusTimelineService.test.ts +72 -2
  125. package/Tests/Server/Services/NetworkAlertPolicyEngineHooks.test.ts +752 -0
  126. package/Tests/Server/Services/NetworkAlertPolicyEngineService.test.ts +1849 -0
  127. package/Tests/Server/Services/NetworkAlertPolicyModel.test.ts +1793 -0
  128. package/Tests/Server/Services/NetworkDeviceAutoImportRuleEngineService.test.ts +47 -4
  129. package/Tests/Server/Services/NetworkDeviceAutoImportRuleService.test.ts +97 -12
  130. package/Tests/Server/Services/NetworkDeviceAutoMonitorLifecycle.test.ts +148 -3
  131. package/Tests/Server/Services/NetworkDeviceMonitorBindingUpdateGuard.test.ts +514 -0
  132. package/Tests/Server/Services/NetworkDeviceMonitorStatusStamp.test.ts +447 -58
  133. package/Tests/Server/Services/NetworkDeviceMonitoringMethodTransition.test.ts +739 -0
  134. package/Tests/Server/Services/NetworkDevicePollingTenancy.test.ts +501 -0
  135. package/Tests/Server/Services/NetworkDeviceSiteDefaultProbe.test.ts +432 -0
  136. package/Tests/Server/Services/NetworkSiteMonitoringDefaults.test.ts +498 -0
  137. package/Tests/Server/Services/NetworkSiteRollupPolicyAndMaintenance.test.ts +337 -55
  138. package/Tests/Server/Services/NetworkSiteService.test.ts +1868 -131
  139. package/Tests/Server/Services/NetworkSiteTypeService.test.ts +1109 -0
  140. package/Tests/Server/Services/NetworkSnmpCredentialProfileModel.test.ts +926 -0
  141. package/Tests/Server/Services/NetworkSnmpCredentialProfileService.test.ts +796 -0
  142. package/Tests/Server/Services/ProjectServiceNetworkSiteTypeDefaults.test.ts +214 -0
  143. package/Tests/Server/Services/StatusPagePrivateUserEmailChangePasswordResetExpiry.test.ts +269 -0
  144. package/Tests/Server/Services/UserEmailChangePasswordResetExpiry.test.ts +472 -0
  145. package/Tests/Server/Services/UserNotificationEmailRollupModels.test.ts +569 -0
  146. package/Tests/Server/Services/UserNotificationEmailRollupSettingModel.test.ts +314 -0
  147. package/Tests/Server/Services/UserNotificationEmailRollupSettingService.test.ts +409 -0
  148. package/Tests/Server/Services/UserNotificationSettingRollupRouting.test.ts +856 -0
  149. package/Tests/Server/Services/UserNotificationSettingWorkspaceChannels.test.ts +102 -1
  150. package/Tests/Server/Types/Database/Permissions/DashboardAccessPermission.test.ts +321 -0
  151. package/Tests/Server/Types/Database/QueryHelperOperators.test.ts +17 -0
  152. package/Tests/Server/Utils/AI/AlertMonitorFilters.test.ts +124 -0
  153. package/Tests/Server/Utils/AI/Insights/InsightTriageRunner.test.ts +208 -0
  154. package/Tests/Server/Utils/AI/LLMServiceToolCalling.test.ts +235 -0
  155. package/Tests/Server/Utils/AI/ObservabilityChatPrompt.test.ts +253 -0
  156. package/Tests/Server/Utils/Captcha.test.ts +422 -0
  157. package/Tests/Server/Utils/DataSource/HttpFetch.test.ts +96 -2
  158. package/Tests/Server/Utils/Database/MigrationFailureLog.test.ts +466 -0
  159. package/Tests/Server/Utils/EmailRollup/EmailRollupFlushRunnerBehaviour.test.ts +1096 -0
  160. package/Tests/Server/Utils/EmailRollup/EmailRollupFlushRunnerClaim.test.ts +466 -0
  161. package/Tests/Server/Utils/EmailRollup/EmailRollupRenderer.test.ts +1428 -0
  162. package/Tests/Server/Utils/EmailRollup/EmailRollupTestHarness.ts +752 -0
  163. package/Tests/Server/Utils/EmailRollup/EmailRollupWriter.test.ts +864 -0
  164. package/Tests/Server/Utils/LoggerFaultDemotion.test.ts +346 -0
  165. package/Tests/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.test.ts +633 -0
  166. package/Tests/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.test.ts +196 -0
  167. package/Tests/Server/Utils/Monitor/DatabaseMetricWrite.test.ts +367 -0
  168. package/Tests/Server/Utils/Monitor/MonitorCriteriaObservationBuilderUnits.test.ts +100 -0
  169. package/Tests/Server/Utils/Monitor/MonitorStepResourceIdentity.test.ts +5 -0
  170. package/Tests/Server/Utils/Monitor/NetworkDeviceHydrationUtil.test.ts +512 -31
  171. package/Tests/Server/Utils/Monitor/NetworkDeviceMetricUtil.test.ts +252 -0
  172. package/Tests/Server/Utils/Monitor/NetworkDeviceWalkUtil.test.ts +479 -42
  173. package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +351 -5
  174. package/Tests/Server/Utils/NetworkDevice/DeviceHealthAggregation.test.ts +136 -12
  175. package/Tests/Server/Utils/NetworkSite/NetworkSiteHierarchyLock.test.ts +306 -0
  176. package/Tests/Server/Utils/OutboundUserAgent.test.ts +266 -0
  177. package/Tests/Server/Utils/SecurityEvent/ThreatIntel/TaxiiClientUserAgent.test.ts +141 -0
  178. package/Tests/Server/Utils/Telemetry/ErrorClassResolver.test.ts +298 -0
  179. package/Tests/Server/Utils/Telemetry.test.ts +456 -66
  180. package/Tests/Types/Monitor/DatabaseMetricCatalog.test.ts +388 -0
  181. package/Tests/Types/Monitor/MonitorStepDatabaseMonitor.test.ts +243 -0
  182. package/Tests/Types/Monitor/MonitorStepDefaultTelemetryConfig.test.ts +1 -0
  183. package/Tests/Types/Monitor/MonitorType.test.ts +1 -0
  184. package/Tests/Types/Monitor/MonitorTypeKeywords.test.ts +16 -7
  185. package/Tests/Types/Monitor/NetworkDeviceAlertPack.test.ts +60 -0
  186. package/Tests/Types/NetworkDevice/NetworkAlertPolicyScope.test.ts +655 -0
  187. package/Tests/Types/NetworkDevice/NetworkDeviceMonitoringMethod.test.ts +115 -26
  188. package/Tests/Types/NetworkSite/DefaultNetworkSiteType.test.ts +39 -0
  189. package/Tests/Types/NotificationSetting/NotificationEmailRollupPolicy.test.ts +299 -0
  190. package/Tests/Types/Telemetry/ErrorClass.test.ts +483 -0
  191. package/Tests/UI/Components/BasicRadioButtons.test.tsx +336 -0
  192. package/Tests/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.test.ts +15 -0
  193. package/Tests/UI/Components/ProgressBar.test.tsx +38 -2
  194. package/Tests/UI/Components/SideMenuItem.test.tsx +226 -4
  195. package/Tests/UI/Components/SideMenuSection.test.tsx +310 -0
  196. package/Tests/UI/Components/SideOverSubmitState.test.tsx +335 -0
  197. package/Tests/UI/Utils/PageScrollLock.test.tsx +377 -0
  198. package/Tests/UI/Utils/PermissionGate.test.ts +78 -0
  199. package/Tests/UI/Utils/SensitiveUrlToken.test.ts +140 -0
  200. package/Tests/Utils/EnterpriseLicenseSeats.test.ts +69 -0
  201. package/Tests/Utils/EnterpriseLicenseSync.test.ts +7 -1
  202. package/Tests/Utils/EnterpriseLicenseUsage.test.ts +433 -2
  203. package/Tests/Utils/Monitor/MonitorMetricType.test.ts +280 -1
  204. package/Tests/Utils/Monitor/MonitorSummarySnapshotUtil.test.ts +1 -0
  205. package/Tests/Utils/Monitor/NetworkTopologyUtil.test.ts +38 -0
  206. package/Tests/Utils/NetworkDevice/DeviceHealthStateUtil.test.ts +284 -23
  207. package/Tests/Utils/NetworkDevice/DeviceReachabilityUtil.test.ts +177 -0
  208. package/Tests/Utils/NetworkDevice/MonitoringMethodThreadedClassifiers.test.ts +992 -0
  209. package/Tests/Utils/NetworkDevice/NetworkAlertPolicyBootstrapUtil.test.ts +427 -0
  210. package/Tests/Utils/NetworkDevice/ReachabilityStampConsistency.test.ts +185 -0
  211. package/Tests/Utils/NetworkDevice/SnmpCredentialUtil.test.ts +268 -0
  212. package/Tests/Utils/NetworkDiscovery/AutoImportRuleMatcher.test.ts +55 -5
  213. package/Tests/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.test.ts +98 -21
  214. package/Tests/Utils/NetworkDiscovery/DiscoveryImportEligibility.test.ts +98 -20
  215. package/Tests/Utils/NetworkDiscovery/DiscoveryReverseDnsChain.test.ts +8 -7
  216. package/Tests/Utils/NetworkDiscovery/PingMonitorBuilderForAddress.test.ts +274 -0
  217. package/Tests/Utils/NetworkSite/SiteStatusRollupUtil.test.ts +230 -51
  218. package/Tests/Utils/NetworkSite/TypeHierarchyUtil.test.ts +209 -0
  219. package/Tests/Utils/Telemetry/CaptureSpanExportGating.test.ts +145 -0
  220. package/Types/AI/ExceptionAIClassification.ts +10 -24
  221. package/Types/Email/EmailTemplateType.ts +2 -0
  222. package/Types/EnterpriseLicense/EnterpriseLicenseInstanceSummary.ts +5 -0
  223. package/Types/EnterpriseLicense/EnterpriseLicenseUsageSnapshot.ts +13 -0
  224. package/Types/EnterpriseLicense/EnterpriseLicenseUserCountSource.ts +6 -0
  225. package/Types/Exception/ApiException.ts +10 -0
  226. package/Types/Exception/BadDataException.ts +11 -0
  227. package/Types/Exception/BadRequestException.ts +11 -0
  228. package/Types/Exception/Exception.ts +65 -0
  229. package/Types/Exception/ForbiddenException.ts +10 -0
  230. package/Types/Exception/NotAuthenticatedException.ts +10 -0
  231. package/Types/Exception/NotAuthorizedException.ts +10 -0
  232. package/Types/Exception/NotFoundException.ts +11 -0
  233. package/Types/Exception/PayloadTooLargeException.ts +11 -0
  234. package/Types/Exception/PaymentRequiredException.ts +10 -0
  235. package/Types/Exception/ServiceUnavailableException.ts +10 -0
  236. package/Types/Exception/SsoAuthorizationException.ts +10 -0
  237. package/Types/Exception/TenantNotFoundException.ts +11 -0
  238. package/Types/Exception/TimeoutException.ts +10 -0
  239. package/Types/Exception/TooManyRequestsException.ts +10 -0
  240. package/Types/Exception/UnableToReachServer.ts +10 -0
  241. package/Types/Exception/WebsiteRequestException.ts +10 -0
  242. package/Types/Monitor/CriteriaFilter.ts +60 -2
  243. package/Types/Monitor/DatabaseMetricCatalog.ts +693 -0
  244. package/Types/Monitor/DatabaseMonitor/DatabaseMonitorResponse.ts +83 -0
  245. package/Types/Monitor/MonitorCriteriaInstance.ts +76 -0
  246. package/Types/Monitor/MonitorMetricType.ts +71 -0
  247. package/Types/Monitor/MonitorStep.ts +76 -0
  248. package/Types/Monitor/MonitorStepDatabaseMonitor.ts +171 -0
  249. package/Types/Monitor/MonitorStepSqlMonitor.ts +2 -20
  250. package/Types/Monitor/MonitorType.ts +47 -1
  251. package/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.ts +22 -1
  252. package/Types/Monitor/SqlConnectionConfig.ts +31 -0
  253. package/Types/NetworkDevice/NetworkAlertPolicyScope.ts +343 -0
  254. package/Types/NetworkDevice/NetworkDeviceMonitoringMethod.ts +42 -22
  255. package/Types/NetworkSite/DefaultNetworkSiteTypeHierarchy.ts +30 -0
  256. package/Types/NotificationSetting/NotificationEmailRollupCategory.ts +255 -0
  257. package/Types/NotificationSetting/NotificationEmailRollupPolicy.ts +104 -0
  258. package/Types/Permission.ts +90 -0
  259. package/Types/Probe/ProbeMonitorResponse.ts +16 -0
  260. package/Types/Telemetry/ErrorClass.ts +274 -0
  261. package/Types/Telemetry/UnitOfWork.ts +59 -0
  262. package/UI/Components/CommandPalette/CommandPalette.tsx +2 -8
  263. package/UI/Components/EditionLabel/EditionLabel.tsx +4 -0
  264. package/UI/Components/Modal/Modal.tsx +2 -8
  265. package/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.ts +44 -0
  266. package/UI/Components/ProgressBar/ProgressBar.tsx +12 -1
  267. package/UI/Components/RadioButtons/BasicRadioButtons.tsx +37 -7
  268. package/UI/Components/SideMenu/SideMenu.tsx +123 -5
  269. package/UI/Components/SideMenu/SideMenuItem.tsx +76 -84
  270. package/UI/Components/SideMenu/SideMenuSection.tsx +55 -23
  271. package/UI/Components/SideOver/SideOver.tsx +21 -20
  272. package/UI/Utils/PageScrollLock.ts +79 -3
  273. package/UI/Utils/PermissionGate.ts +61 -0
  274. package/UI/Utils/SensitiveUrlToken.ts +112 -0
  275. package/UI/Utils/TestLLMProvider.ts +11 -0
  276. package/Utils/EnterpriseLicense/EnterpriseLicenseSeats.ts +16 -0
  277. package/Utils/EnterpriseLicense/EnterpriseLicenseUsage.ts +191 -11
  278. package/Utils/Monitor/MonitorMetricType.ts +153 -1
  279. package/Utils/Monitor/NetworkTopologyUtil.ts +23 -3
  280. package/Utils/NetworkDevice/DeviceHealthStateUtil.ts +65 -14
  281. package/Utils/NetworkDevice/DeviceReachabilityUtil.ts +43 -14
  282. package/Utils/NetworkDevice/NetworkAlertPolicyBootstrapUtil.ts +247 -0
  283. package/Utils/NetworkDevice/SnmpCredentialUtil.ts +68 -0
  284. package/Utils/NetworkDiscovery/AutoImportRuleMatcher.ts +15 -7
  285. package/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.ts +52 -17
  286. package/Utils/NetworkDiscovery/DiscoveryImportEligibility.ts +55 -23
  287. package/Utils/NetworkDiscovery/PingMonitorBuilder.ts +115 -13
  288. package/Utils/NetworkSite/SiteStatusRollupUtil.ts +66 -20
  289. package/Utils/NetworkSite/TypeHierarchyUtil.ts +313 -0
  290. package/build/dist/Models/AnalyticsModels/Span.js +14 -0
  291. package/build/dist/Models/AnalyticsModels/Span.js.map +1 -1
  292. package/build/dist/Models/DatabaseModels/EnterpriseLicense.js +59 -0
  293. package/build/dist/Models/DatabaseModels/EnterpriseLicense.js.map +1 -1
  294. package/build/dist/Models/DatabaseModels/Index.js +10 -0
  295. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  296. package/build/dist/Models/DatabaseModels/Monitor.js +75 -0
  297. package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
  298. package/build/dist/Models/DatabaseModels/NetworkAlertPolicy.js +713 -0
  299. package/build/dist/Models/DatabaseModels/NetworkAlertPolicy.js.map +1 -0
  300. package/build/dist/Models/DatabaseModels/NetworkDevice.js +180 -1
  301. package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
  302. package/build/dist/Models/DatabaseModels/NetworkSite.js +200 -2
  303. package/build/dist/Models/DatabaseModels/NetworkSite.js.map +1 -1
  304. package/build/dist/Models/DatabaseModels/NetworkSiteType.js +102 -3
  305. package/build/dist/Models/DatabaseModels/NetworkSiteType.js.map +1 -1
  306. package/build/dist/Models/DatabaseModels/NetworkSnmpCredentialProfile.js +878 -0
  307. package/build/dist/Models/DatabaseModels/NetworkSnmpCredentialProfile.js.map +1 -0
  308. package/build/dist/Models/DatabaseModels/TelemetryException.js +123 -0
  309. package/build/dist/Models/DatabaseModels/TelemetryException.js.map +1 -1
  310. package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupBatch.js +363 -0
  311. package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupBatch.js.map +1 -0
  312. package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupItem.js +402 -0
  313. package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupItem.js.map +1 -0
  314. package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupSetting.js +296 -0
  315. package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupSetting.js.map +1 -0
  316. package/build/dist/Server/API/EnterpriseLicenseAPI.js +273 -60
  317. package/build/dist/Server/API/EnterpriseLicenseAPI.js.map +1 -1
  318. package/build/dist/Server/API/LlmProviderAPI.js +108 -13
  319. package/build/dist/Server/API/LlmProviderAPI.js.map +1 -1
  320. package/build/dist/Server/EnvironmentConfig.js +12 -0
  321. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  322. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790700000000-AddNetworkSiteTypeParentHierarchy.js +24 -0
  323. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790700000000-AddNetworkSiteTypeParentHierarchy.js.map +1 -0
  324. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddEnterpriseLicenseUsageProvenance.js +16 -0
  325. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddEnterpriseLicenseUsageProvenance.js.map +1 -0
  326. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddTelemetryExceptionErrorClass.js +111 -0
  327. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddTelemetryExceptionErrorClass.js.map +1 -0
  328. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791000000000-AddUserNotificationEmailRollup.js +77 -0
  329. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791000000000-AddUserNotificationEmailRollup.js.map +1 -0
  330. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791100000000-AddUserNotificationEmailRollupSetting.js +50 -0
  331. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791100000000-AddUserNotificationEmailRollupSetting.js.map +1 -0
  332. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791200000000-AddNetworkSnmpCredentialProfilesAndAlertPolicies.js +83 -0
  333. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791200000000-AddNetworkSnmpCredentialProfilesAndAlertPolicies.js.map +1 -0
  334. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +12 -0
  335. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  336. package/build/dist/Server/Infrastructure/QueueWorker.js +33 -5
  337. package/build/dist/Server/Infrastructure/QueueWorker.js.map +1 -1
  338. package/build/dist/Server/Middleware/BearerTokenAuthorization.js +12 -0
  339. package/build/dist/Server/Middleware/BearerTokenAuthorization.js.map +1 -1
  340. package/build/dist/Server/Middleware/ProjectAuthorization.js +11 -0
  341. package/build/dist/Server/Middleware/ProjectAuthorization.js.map +1 -1
  342. package/build/dist/Server/Middleware/SCIMAuthorization.js +12 -0
  343. package/build/dist/Server/Middleware/SCIMAuthorization.js.map +1 -1
  344. package/build/dist/Server/Middleware/TelemetryIngest.js +11 -0
  345. package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
  346. package/build/dist/Server/Services/AIBillingService.js +70 -16
  347. package/build/dist/Server/Services/AIBillingService.js.map +1 -1
  348. package/build/dist/Server/Services/EnterpriseLicenseInstanceService.js +167 -0
  349. package/build/dist/Server/Services/EnterpriseLicenseInstanceService.js.map +1 -1
  350. package/build/dist/Server/Services/EnterpriseLicenseService.js +39 -0
  351. package/build/dist/Server/Services/EnterpriseLicenseService.js.map +1 -1
  352. package/build/dist/Server/Services/Index.js +10 -0
  353. package/build/dist/Server/Services/Index.js.map +1 -1
  354. package/build/dist/Server/Services/MonitorService.js +119 -21
  355. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  356. package/build/dist/Server/Services/MonitorStatusTimelineService.js +127 -8
  357. package/build/dist/Server/Services/MonitorStatusTimelineService.js.map +1 -1
  358. package/build/dist/Server/Services/MonitorTemplateService.js +162 -0
  359. package/build/dist/Server/Services/MonitorTemplateService.js.map +1 -1
  360. package/build/dist/Server/Services/NetworkAlertPolicyEngineService.js +1683 -0
  361. package/build/dist/Server/Services/NetworkAlertPolicyEngineService.js.map +1 -0
  362. package/build/dist/Server/Services/NetworkAlertPolicyService.js +732 -0
  363. package/build/dist/Server/Services/NetworkAlertPolicyService.js.map +1 -0
  364. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +10 -9
  365. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
  366. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js +54 -11
  367. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js.map +1 -1
  368. package/build/dist/Server/Services/NetworkDeviceService.js +841 -70
  369. package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
  370. package/build/dist/Server/Services/NetworkSiteService.js +1145 -107
  371. package/build/dist/Server/Services/NetworkSiteService.js.map +1 -1
  372. package/build/dist/Server/Services/NetworkSiteTypeService.js +863 -0
  373. package/build/dist/Server/Services/NetworkSiteTypeService.js.map +1 -1
  374. package/build/dist/Server/Services/NetworkSnmpCredentialProfileService.js +217 -0
  375. package/build/dist/Server/Services/NetworkSnmpCredentialProfileService.js.map +1 -0
  376. package/build/dist/Server/Services/NotificationService.js +80 -17
  377. package/build/dist/Server/Services/NotificationService.js.map +1 -1
  378. package/build/dist/Server/Services/ProjectService.js +66 -30
  379. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  380. package/build/dist/Server/Services/StatusPagePrivateUserService.js +92 -2
  381. package/build/dist/Server/Services/StatusPagePrivateUserService.js.map +1 -1
  382. package/build/dist/Server/Services/UserNotificationEmailRollupBatchService.js +76 -0
  383. package/build/dist/Server/Services/UserNotificationEmailRollupBatchService.js.map +1 -0
  384. package/build/dist/Server/Services/UserNotificationEmailRollupItemService.js +77 -0
  385. package/build/dist/Server/Services/UserNotificationEmailRollupItemService.js.map +1 -0
  386. package/build/dist/Server/Services/UserNotificationEmailRollupSettingService.js +111 -0
  387. package/build/dist/Server/Services/UserNotificationEmailRollupSettingService.js.map +1 -0
  388. package/build/dist/Server/Services/UserNotificationSettingService.js +46 -20
  389. package/build/dist/Server/Services/UserNotificationSettingService.js.map +1 -1
  390. package/build/dist/Server/Services/UserService.js +90 -0
  391. package/build/dist/Server/Services/UserService.js.map +1 -1
  392. package/build/dist/Server/Types/Database/QueryHelper.js +1 -1
  393. package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
  394. package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js +14 -3
  395. package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js.map +1 -1
  396. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js +10 -0
  397. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js.map +1 -1
  398. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js +10 -0
  399. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js.map +1 -1
  400. package/build/dist/Server/Utils/AI/SRE/Insights/InsightTriageRunner.js +54 -1
  401. package/build/dist/Server/Utils/AI/SRE/Insights/InsightTriageRunner.js.map +1 -1
  402. package/build/dist/Server/Utils/AI/Toolbox/AlertTools.js +18 -4
  403. package/build/dist/Server/Utils/AI/Toolbox/AlertTools.js.map +1 -1
  404. package/build/dist/Server/Utils/Billing/BillingFailureNoticeThrottle.js +59 -0
  405. package/build/dist/Server/Utils/Billing/BillingFailureNoticeThrottle.js.map +1 -0
  406. package/build/dist/Server/Utils/DataSource/HttpFetch.js +2 -1
  407. package/build/dist/Server/Utils/DataSource/HttpFetch.js.map +1 -1
  408. package/build/dist/Server/Utils/EmailRollup/EmailRollupConstants.js +91 -0
  409. package/build/dist/Server/Utils/EmailRollup/EmailRollupConstants.js.map +1 -0
  410. package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js +691 -0
  411. package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js.map +1 -0
  412. package/build/dist/Server/Utils/EmailRollup/EmailRollupRenderer.js +497 -0
  413. package/build/dist/Server/Utils/EmailRollup/EmailRollupRenderer.js.map +1 -0
  414. package/build/dist/Server/Utils/EmailRollup/EmailRollupWriter.js +257 -0
  415. package/build/dist/Server/Utils/EmailRollup/EmailRollupWriter.js.map +1 -0
  416. package/build/dist/Server/Utils/LLM/LLMService.js +64 -1
  417. package/build/dist/Server/Utils/LLM/LLMService.js.map +1 -1
  418. package/build/dist/Server/Utils/LogRedaction.js +8 -0
  419. package/build/dist/Server/Utils/LogRedaction.js.map +1 -1
  420. package/build/dist/Server/Utils/Logger.js +63 -1
  421. package/build/dist/Server/Utils/Logger.js.map +1 -1
  422. package/build/dist/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.js +141 -0
  423. package/build/dist/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.js.map +1 -0
  424. package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js +8 -1
  425. package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js.map +1 -1
  426. package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js +51 -1
  427. package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js.map +1 -1
  428. package/build/dist/Server/Utils/Monitor/MonitorCriteriaDataExtractor.js +7 -0
  429. package/build/dist/Server/Utils/Monitor/MonitorCriteriaDataExtractor.js.map +1 -1
  430. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +37 -0
  431. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
  432. package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js +158 -6
  433. package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js.map +1 -1
  434. package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js +33 -0
  435. package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js.map +1 -1
  436. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +32 -0
  437. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
  438. package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js +330 -21
  439. package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js.map +1 -1
  440. package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js +55 -10
  441. package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js.map +1 -1
  442. package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js +178 -49
  443. package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js.map +1 -1
  444. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +119 -29
  445. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
  446. package/build/dist/Server/Utils/NetworkDevice/DeviceHealthAggregation.js +30 -17
  447. package/build/dist/Server/Utils/NetworkDevice/DeviceHealthAggregation.js.map +1 -1
  448. package/build/dist/Server/Utils/NetworkSite/NetworkSiteHierarchyLock.js +158 -0
  449. package/build/dist/Server/Utils/NetworkSite/NetworkSiteHierarchyLock.js.map +1 -0
  450. package/build/dist/Server/Utils/OutboundUserAgent.js +123 -0
  451. package/build/dist/Server/Utils/OutboundUserAgent.js.map +1 -0
  452. package/build/dist/Server/Utils/StartServer.js +38 -14
  453. package/build/dist/Server/Utils/StartServer.js.map +1 -1
  454. package/build/dist/Server/Utils/Telemetry/CaptureSpan.js +28 -8
  455. package/build/dist/Server/Utils/Telemetry/CaptureSpan.js.map +1 -1
  456. package/build/dist/Server/Utils/Telemetry/ErrorClassResolver.js +95 -0
  457. package/build/dist/Server/Utils/Telemetry/ErrorClassResolver.js.map +1 -0
  458. package/build/dist/Server/Utils/Telemetry/SpanUtil.js +29 -0
  459. package/build/dist/Server/Utils/Telemetry/SpanUtil.js.map +1 -1
  460. package/build/dist/Server/Utils/Telemetry.js +162 -46
  461. package/build/dist/Server/Utils/Telemetry.js.map +1 -1
  462. package/build/dist/Types/AI/ExceptionAIClassification.js +10 -24
  463. package/build/dist/Types/AI/ExceptionAIClassification.js.map +1 -1
  464. package/build/dist/Types/Email/EmailTemplateType.js +1 -0
  465. package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
  466. package/build/dist/Types/EnterpriseLicense/EnterpriseLicenseUsageSnapshot.js +2 -0
  467. package/build/dist/Types/EnterpriseLicense/EnterpriseLicenseUsageSnapshot.js.map +1 -0
  468. package/build/dist/Types/EnterpriseLicense/EnterpriseLicenseUserCountSource.js +7 -0
  469. package/build/dist/Types/EnterpriseLicense/EnterpriseLicenseUserCountSource.js.map +1 -0
  470. package/build/dist/Types/Exception/ApiException.js +9 -0
  471. package/build/dist/Types/Exception/ApiException.js.map +1 -1
  472. package/build/dist/Types/Exception/BadDataException.js +10 -0
  473. package/build/dist/Types/Exception/BadDataException.js.map +1 -1
  474. package/build/dist/Types/Exception/BadRequestException.js +10 -0
  475. package/build/dist/Types/Exception/BadRequestException.js.map +1 -1
  476. package/build/dist/Types/Exception/Exception.js +56 -0
  477. package/build/dist/Types/Exception/Exception.js.map +1 -1
  478. package/build/dist/Types/Exception/ForbiddenException.js +9 -0
  479. package/build/dist/Types/Exception/ForbiddenException.js.map +1 -1
  480. package/build/dist/Types/Exception/NotAuthenticatedException.js +9 -0
  481. package/build/dist/Types/Exception/NotAuthenticatedException.js.map +1 -1
  482. package/build/dist/Types/Exception/NotAuthorizedException.js +9 -0
  483. package/build/dist/Types/Exception/NotAuthorizedException.js.map +1 -1
  484. package/build/dist/Types/Exception/NotFoundException.js +10 -0
  485. package/build/dist/Types/Exception/NotFoundException.js.map +1 -1
  486. package/build/dist/Types/Exception/PayloadTooLargeException.js +10 -0
  487. package/build/dist/Types/Exception/PayloadTooLargeException.js.map +1 -1
  488. package/build/dist/Types/Exception/PaymentRequiredException.js +9 -0
  489. package/build/dist/Types/Exception/PaymentRequiredException.js.map +1 -1
  490. package/build/dist/Types/Exception/ServiceUnavailableException.js +9 -0
  491. package/build/dist/Types/Exception/ServiceUnavailableException.js.map +1 -1
  492. package/build/dist/Types/Exception/SsoAuthorizationException.js +9 -0
  493. package/build/dist/Types/Exception/SsoAuthorizationException.js.map +1 -1
  494. package/build/dist/Types/Exception/TenantNotFoundException.js +10 -0
  495. package/build/dist/Types/Exception/TenantNotFoundException.js.map +1 -1
  496. package/build/dist/Types/Exception/TimeoutException.js +9 -0
  497. package/build/dist/Types/Exception/TimeoutException.js.map +1 -1
  498. package/build/dist/Types/Exception/TooManyRequestsException.js +9 -0
  499. package/build/dist/Types/Exception/TooManyRequestsException.js.map +1 -1
  500. package/build/dist/Types/Exception/UnableToReachServer.js +9 -0
  501. package/build/dist/Types/Exception/UnableToReachServer.js.map +1 -1
  502. package/build/dist/Types/Exception/WebsiteRequestException.js +9 -0
  503. package/build/dist/Types/Exception/WebsiteRequestException.js.map +1 -1
  504. package/build/dist/Types/Monitor/CriteriaFilter.js +45 -2
  505. package/build/dist/Types/Monitor/CriteriaFilter.js.map +1 -1
  506. package/build/dist/Types/Monitor/DatabaseMetricCatalog.js +594 -0
  507. package/build/dist/Types/Monitor/DatabaseMetricCatalog.js.map +1 -0
  508. package/build/dist/Types/Monitor/DatabaseMonitor/DatabaseMonitorResponse.js +21 -0
  509. package/build/dist/Types/Monitor/DatabaseMonitor/DatabaseMonitorResponse.js.map +1 -0
  510. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js +70 -0
  511. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
  512. package/build/dist/Types/Monitor/MonitorMetricType.js +61 -0
  513. package/build/dist/Types/Monitor/MonitorMetricType.js.map +1 -1
  514. package/build/dist/Types/Monitor/MonitorStep.js +54 -0
  515. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  516. package/build/dist/Types/Monitor/MonitorStepDatabaseMonitor.js +122 -0
  517. package/build/dist/Types/Monitor/MonitorStepDatabaseMonitor.js.map +1 -0
  518. package/build/dist/Types/Monitor/MonitorStepSqlMonitor.js.map +1 -1
  519. package/build/dist/Types/Monitor/MonitorType.js +45 -1
  520. package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
  521. package/build/dist/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.js +21 -1
  522. package/build/dist/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.js.map +1 -1
  523. package/build/dist/Types/Monitor/SqlConnectionConfig.js +2 -0
  524. package/build/dist/Types/Monitor/SqlConnectionConfig.js.map +1 -0
  525. package/build/dist/Types/NetworkDevice/NetworkAlertPolicyScope.js +172 -0
  526. package/build/dist/Types/NetworkDevice/NetworkAlertPolicyScope.js.map +1 -0
  527. package/build/dist/Types/NetworkDevice/NetworkDeviceMonitoringMethod.js +40 -22
  528. package/build/dist/Types/NetworkDevice/NetworkDeviceMonitoringMethod.js.map +1 -1
  529. package/build/dist/Types/NetworkSite/DefaultNetworkSiteTypeHierarchy.js +26 -0
  530. package/build/dist/Types/NetworkSite/DefaultNetworkSiteTypeHierarchy.js.map +1 -0
  531. package/build/dist/Types/NotificationSetting/NotificationEmailRollupCategory.js +186 -0
  532. package/build/dist/Types/NotificationSetting/NotificationEmailRollupCategory.js.map +1 -0
  533. package/build/dist/Types/NotificationSetting/NotificationEmailRollupPolicy.js +87 -0
  534. package/build/dist/Types/NotificationSetting/NotificationEmailRollupPolicy.js.map +1 -0
  535. package/build/dist/Types/Permission.js +80 -0
  536. package/build/dist/Types/Permission.js.map +1 -1
  537. package/build/dist/Types/Telemetry/ErrorClass.js +216 -0
  538. package/build/dist/Types/Telemetry/ErrorClass.js.map +1 -0
  539. package/build/dist/Types/Telemetry/UnitOfWork.js +59 -0
  540. package/build/dist/Types/Telemetry/UnitOfWork.js.map +1 -0
  541. package/build/dist/UI/Components/CommandPalette/CommandPalette.js +2 -7
  542. package/build/dist/UI/Components/CommandPalette/CommandPalette.js.map +1 -1
  543. package/build/dist/UI/Components/EditionLabel/EditionLabel.js +3 -0
  544. package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
  545. package/build/dist/UI/Components/Modal/Modal.js +2 -7
  546. package/build/dist/UI/Components/Modal/Modal.js.map +1 -1
  547. package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js +39 -0
  548. package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js.map +1 -1
  549. package/build/dist/UI/Components/ProgressBar/ProgressBar.js +12 -1
  550. package/build/dist/UI/Components/ProgressBar/ProgressBar.js.map +1 -1
  551. package/build/dist/UI/Components/RadioButtons/BasicRadioButtons.js +6 -6
  552. package/build/dist/UI/Components/RadioButtons/BasicRadioButtons.js.map +1 -1
  553. package/build/dist/UI/Components/SideMenu/SideMenu.js +67 -5
  554. package/build/dist/UI/Components/SideMenu/SideMenu.js.map +1 -1
  555. package/build/dist/UI/Components/SideMenu/SideMenuItem.js +49 -53
  556. package/build/dist/UI/Components/SideMenu/SideMenuItem.js.map +1 -1
  557. package/build/dist/UI/Components/SideMenu/SideMenuSection.js +25 -7
  558. package/build/dist/UI/Components/SideMenu/SideMenuSection.js.map +1 -1
  559. package/build/dist/UI/Components/SideOver/SideOver.js +5 -20
  560. package/build/dist/UI/Components/SideOver/SideOver.js.map +1 -1
  561. package/build/dist/UI/Utils/PageScrollLock.js +31 -3
  562. package/build/dist/UI/Utils/PageScrollLock.js.map +1 -1
  563. package/build/dist/UI/Utils/PermissionGate.js +42 -1
  564. package/build/dist/UI/Utils/PermissionGate.js.map +1 -1
  565. package/build/dist/UI/Utils/SensitiveUrlToken.js +97 -0
  566. package/build/dist/UI/Utils/SensitiveUrlToken.js.map +1 -0
  567. package/build/dist/UI/Utils/TestLLMProvider.js +4 -5
  568. package/build/dist/UI/Utils/TestLLMProvider.js.map +1 -1
  569. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js +15 -0
  570. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js.map +1 -1
  571. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js +111 -9
  572. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js.map +1 -1
  573. package/build/dist/Utils/Monitor/MonitorMetricType.js +109 -1
  574. package/build/dist/Utils/Monitor/MonitorMetricType.js.map +1 -1
  575. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +8 -3
  576. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
  577. package/build/dist/Utils/NetworkDevice/DeviceHealthStateUtil.js +27 -7
  578. package/build/dist/Utils/NetworkDevice/DeviceHealthStateUtil.js.map +1 -1
  579. package/build/dist/Utils/NetworkDevice/DeviceReachabilityUtil.js +7 -5
  580. package/build/dist/Utils/NetworkDevice/DeviceReachabilityUtil.js.map +1 -1
  581. package/build/dist/Utils/NetworkDevice/NetworkAlertPolicyBootstrapUtil.js +180 -0
  582. package/build/dist/Utils/NetworkDevice/NetworkAlertPolicyBootstrapUtil.js.map +1 -0
  583. package/build/dist/Utils/NetworkDevice/SnmpCredentialUtil.js +12 -0
  584. package/build/dist/Utils/NetworkDevice/SnmpCredentialUtil.js.map +1 -0
  585. package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js +15 -5
  586. package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js.map +1 -1
  587. package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js +44 -15
  588. package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js.map +1 -1
  589. package/build/dist/Utils/NetworkDiscovery/DiscoveryImportEligibility.js +52 -23
  590. package/build/dist/Utils/NetworkDiscovery/DiscoveryImportEligibility.js.map +1 -1
  591. package/build/dist/Utils/NetworkDiscovery/PingMonitorBuilder.js +85 -13
  592. package/build/dist/Utils/NetworkDiscovery/PingMonitorBuilder.js.map +1 -1
  593. package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js +30 -15
  594. package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js.map +1 -1
  595. package/build/dist/Utils/NetworkSite/TypeHierarchyUtil.js +191 -0
  596. package/build/dist/Utils/NetworkSite/TypeHierarchyUtil.js.map +1 -0
  597. package/package.json +2 -2
@@ -1,9 +1,872 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import QueryHelper from "../Types/Database/QueryHelper";
1
11
  import DatabaseService from "./DatabaseService";
12
+ import NetworkSiteService from "./NetworkSiteService";
13
+ import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
14
+ import RelationIdUtil from "../Utils/Database/RelationIdUtil";
15
+ import NetworkSiteHierarchyLock from "../Utils/NetworkSite/NetworkSiteHierarchyLock";
2
16
  import Model from "../../Models/DatabaseModels/NetworkSiteType";
17
+ import NetworkSiteTypeHierarchyUtil from "../../Utils/NetworkSite/TypeHierarchyUtil";
18
+ import SortOrder from "../../Types/BaseDatabase/SortOrder";
19
+ import BadDataException from "../../Types/Exception/BadDataException";
20
+ import LIMIT_MAX from "../../Types/Database/LimitMax";
21
+ import PositiveNumber from "../../Types/PositiveNumber";
22
+ const PARENT_NETWORK_SITE_TYPE_KEYS = [
23
+ "parentNetworkSiteTypeId",
24
+ "parentNetworkSiteType",
25
+ ];
26
+ const PROJECT_KEYS = ["projectId", "project"];
27
+ const EXISTING_SITES_DO_NOT_MATCH_MESSAGE = "This site type's parent cannot be changed because existing sites do not match the proposed hierarchy. Create a new site type under the desired parent, then move and reassign the sites to it.";
28
+ const REFERENCE_VALIDATION_BATCH_SIZE = 1000;
29
+ const normalizeId = (id) => {
30
+ return id.toString().toLowerCase();
31
+ };
32
+ const sameId = (left, right) => {
33
+ return normalizeId(left) === normalizeId(right);
34
+ };
35
+ /*
36
+ * Model instances contain properties initialised to undefined. Those are
37
+ * omissions, not writes: TypeORM drops them before producing INSERT/SET.
38
+ * Null, on the other hand, is an explicit request to make this a root type.
39
+ */
40
+ const isAnyKeyWritten = (data, keys) => {
41
+ return keys.some((key) => {
42
+ return key in data && data[key] !== undefined;
43
+ });
44
+ };
45
+ const assertNoSqlExpression = (data, keys) => {
46
+ for (const key of keys) {
47
+ if (typeof data[key] === "function") {
48
+ throw new BadDataException(`${key} cannot be set to a raw SQL expression because the site type hierarchy must be validated against an actual parent ID.`);
49
+ }
50
+ }
51
+ };
52
+ const assertIsUnitLevelIsNotSqlExpression = (data) => {
53
+ if (typeof data["isUnitLevel"] === "function") {
54
+ throw new BadDataException("isUnitLevel cannot be set to a raw SQL expression because unit-level leaf rules must be validated against an actual boolean value.");
55
+ }
56
+ };
3
57
  export class Service extends DatabaseService {
4
58
  constructor() {
5
59
  super(Model);
6
60
  }
61
+ /*
62
+ * NetworkSite and NetworkSiteType validate one shared graph. Keep the Redis
63
+ * mutex around the complete DatabaseService mutation (before hooks, write,
64
+ * and success hooks), not inside an individual hook, so every error path
65
+ * releases it and a concurrent site/type request cannot validate stale
66
+ * project state.
67
+ */
68
+ async create(createBy) {
69
+ if (createBy.props.ignoreHooks) {
70
+ return await super.create(createBy);
71
+ }
72
+ const projectId = createBy.props.tenantId ||
73
+ this.readProjectId(createBy.data) ||
74
+ null;
75
+ return await NetworkSiteHierarchyLock.runExclusive({
76
+ projectIds: projectId ? [projectId] : [],
77
+ operation: async () => {
78
+ return await super.create(createBy);
79
+ },
80
+ });
81
+ }
82
+ async updateOneBy(updateOneBy) {
83
+ if (updateOneBy.props.ignoreHooks ||
84
+ !this.updateTouchesHierarchy(updateOneBy.data)) {
85
+ return await super.updateOneBy(updateOneBy);
86
+ }
87
+ const projectIds = await this.findMutationProjectIds({
88
+ query: updateOneBy.query,
89
+ props: updateOneBy.props,
90
+ limit: 1,
91
+ skip: 0,
92
+ isDelete: false,
93
+ });
94
+ return await NetworkSiteHierarchyLock.runExclusive({
95
+ projectIds,
96
+ operation: async () => {
97
+ return await super.updateOneBy(updateOneBy);
98
+ },
99
+ });
100
+ }
101
+ async updateBy(updateBy) {
102
+ if (updateBy.props.ignoreHooks ||
103
+ !this.updateTouchesHierarchy(updateBy.data)) {
104
+ return await super.updateBy(updateBy);
105
+ }
106
+ const projectIds = await this.findMutationProjectIds({
107
+ query: updateBy.query,
108
+ props: updateBy.props,
109
+ limit: this.positiveNumberValue(updateBy.limit, LIMIT_MAX),
110
+ skip: this.positiveNumberValue(updateBy.skip, 0),
111
+ isDelete: false,
112
+ });
113
+ return await NetworkSiteHierarchyLock.runExclusive({
114
+ projectIds,
115
+ operation: async () => {
116
+ return await super.updateBy(updateBy);
117
+ },
118
+ });
119
+ }
120
+ async deleteOneBy(deleteOneBy) {
121
+ if (deleteOneBy.props.ignoreHooks) {
122
+ return await super.deleteOneBy(deleteOneBy);
123
+ }
124
+ const projectIds = await this.findMutationProjectIds({
125
+ query: deleteOneBy.query,
126
+ props: deleteOneBy.props,
127
+ limit: 1,
128
+ skip: 0,
129
+ isDelete: true,
130
+ });
131
+ return await NetworkSiteHierarchyLock.runExclusive({
132
+ projectIds,
133
+ operation: async () => {
134
+ return await super.deleteOneBy(deleteOneBy);
135
+ },
136
+ });
137
+ }
138
+ async deleteBy(deleteBy) {
139
+ if (deleteBy.props.ignoreHooks) {
140
+ return await super.deleteBy(deleteBy);
141
+ }
142
+ const projectIds = await this.findMutationProjectIds({
143
+ query: deleteBy.query,
144
+ props: deleteBy.props,
145
+ limit: this.positiveNumberValue(deleteBy.limit, LIMIT_MAX),
146
+ skip: this.positiveNumberValue(deleteBy.skip, 0),
147
+ isDelete: true,
148
+ });
149
+ return await NetworkSiteHierarchyLock.runExclusive({
150
+ projectIds,
151
+ operation: async () => {
152
+ return await super.deleteBy(deleteBy);
153
+ },
154
+ });
155
+ }
156
+ async hardDeleteBy(deleteBy) {
157
+ if (deleteBy.props.ignoreHooks) {
158
+ return await super.hardDeleteBy(deleteBy);
159
+ }
160
+ /*
161
+ * The retention cron uses one root deletedAt query across all projects.
162
+ * Convert it to a closed batch of unused leaf types before locking. A
163
+ * parent and child can therefore never be split by the batch limit; once
164
+ * leaves are removed, the cron's next iteration can work upward.
165
+ */
166
+ if (!NetworkSiteHierarchyLock.isSafeRootMutationScope({
167
+ query: deleteBy.query,
168
+ props: deleteBy.props,
169
+ tenantScopeIsClosed: true,
170
+ })) {
171
+ return await this.hardDeleteClosedLeafBatch(deleteBy);
172
+ }
173
+ const projectIds = await this.findMutationProjectIds({
174
+ query: deleteBy.query,
175
+ props: deleteBy.props,
176
+ limit: this.positiveNumberValue(deleteBy.limit, LIMIT_MAX),
177
+ skip: this.positiveNumberValue(deleteBy.skip, 0),
178
+ isDelete: true,
179
+ });
180
+ return await NetworkSiteHierarchyLock.runExclusive({
181
+ projectIds,
182
+ operation: async () => {
183
+ return await super.hardDeleteBy(deleteBy);
184
+ },
185
+ });
186
+ }
187
+ updateTouchesHierarchy(data) {
188
+ const record = data;
189
+ return (isAnyKeyWritten(record, PARENT_NETWORK_SITE_TYPE_KEYS) ||
190
+ ("isUnitLevel" in record && record["isUnitLevel"] !== undefined) ||
191
+ isAnyKeyWritten(record, PROJECT_KEYS));
192
+ }
193
+ positiveNumberValue(value, fallback) {
194
+ if (value instanceof PositiveNumber) {
195
+ return value.toNumber();
196
+ }
197
+ return value !== null && value !== void 0 ? value : fallback;
198
+ }
199
+ async hardDeleteClosedLeafBatch(deleteBy) {
200
+ const requestedLimit = this.positiveNumberValue(deleteBy.limit, LIMIT_MAX);
201
+ if (requestedLimit <= 0) {
202
+ return 0;
203
+ }
204
+ const scanPageSize = Math.min(REFERENCE_VALIDATION_BATCH_SIZE, requestedLimit);
205
+ const leafTypes = [];
206
+ let scanSkip = this.positiveNumberValue(deleteBy.skip, 0);
207
+ while (leafTypes.length < requestedLimit) {
208
+ const candidates = await this.findBy({
209
+ query: deleteBy.query,
210
+ select: { _id: true, projectId: true },
211
+ sort: { _id: SortOrder.Ascending },
212
+ limit: scanPageSize,
213
+ skip: scanSkip,
214
+ props: { isRoot: true },
215
+ });
216
+ if (candidates.length === 0) {
217
+ break;
218
+ }
219
+ const candidateIds = candidates
220
+ .map((candidate) => {
221
+ return candidate.id || null;
222
+ })
223
+ .filter((id) => {
224
+ return Boolean(id);
225
+ });
226
+ const referencedTypeIds = new Set();
227
+ for (let candidateOffset = 0; candidateOffset < candidateIds.length; candidateOffset += REFERENCE_VALIDATION_BATCH_SIZE) {
228
+ const candidateIdBatch = candidateIds.slice(candidateOffset, candidateOffset + REFERENCE_VALIDATION_BATCH_SIZE);
229
+ let childSkip = 0;
230
+ while (candidateIdBatch.length > 0) {
231
+ const childTypes = await this.findBy({
232
+ query: {
233
+ parentNetworkSiteTypeId: QueryHelper.any(candidateIdBatch),
234
+ },
235
+ select: { parentNetworkSiteTypeId: true },
236
+ sort: { _id: SortOrder.Ascending },
237
+ limit: REFERENCE_VALIDATION_BATCH_SIZE,
238
+ skip: childSkip,
239
+ props: { isRoot: true },
240
+ });
241
+ for (const childType of childTypes) {
242
+ if (childType.parentNetworkSiteTypeId) {
243
+ referencedTypeIds.add(normalizeId(childType.parentNetworkSiteTypeId));
244
+ }
245
+ }
246
+ if (childTypes.length < REFERENCE_VALIDATION_BATCH_SIZE) {
247
+ break;
248
+ }
249
+ childSkip += childTypes.length;
250
+ }
251
+ let siteSkip = 0;
252
+ while (candidateIdBatch.length > 0) {
253
+ const sites = await NetworkSiteService.findBy({
254
+ query: {
255
+ networkSiteTypeId: QueryHelper.any(candidateIdBatch),
256
+ },
257
+ select: { networkSiteTypeId: true },
258
+ sort: { _id: SortOrder.Ascending },
259
+ limit: REFERENCE_VALIDATION_BATCH_SIZE,
260
+ skip: siteSkip,
261
+ props: { isRoot: true },
262
+ });
263
+ for (const site of sites) {
264
+ if (site.networkSiteTypeId) {
265
+ referencedTypeIds.add(normalizeId(site.networkSiteTypeId));
266
+ }
267
+ }
268
+ if (sites.length < REFERENCE_VALIDATION_BATCH_SIZE) {
269
+ break;
270
+ }
271
+ siteSkip += sites.length;
272
+ }
273
+ }
274
+ for (const candidate of candidates) {
275
+ if (candidate.id &&
276
+ candidate.projectId &&
277
+ !referencedTypeIds.has(normalizeId(candidate.id))) {
278
+ leafTypes.push(candidate);
279
+ if (leafTypes.length === requestedLimit) {
280
+ break;
281
+ }
282
+ }
283
+ }
284
+ scanSkip += candidates.length;
285
+ if (candidates.length < scanPageSize) {
286
+ break;
287
+ }
288
+ }
289
+ if (leafTypes.length === 0) {
290
+ return 0;
291
+ }
292
+ const leafTypeIds = leafTypes.map((networkSiteType) => {
293
+ return networkSiteType.id;
294
+ });
295
+ return await NetworkSiteHierarchyLock.runExclusive({
296
+ projectIds: leafTypes.map((networkSiteType) => {
297
+ return networkSiteType.projectId;
298
+ }),
299
+ operation: async () => {
300
+ return await super.hardDeleteBy(Object.assign(Object.assign({}, deleteBy), { query: Object.assign(Object.assign({}, deleteBy.query), { _id: QueryHelper.any(leafTypeIds) }), limit: leafTypeIds.length, skip: 0 }));
301
+ },
302
+ });
303
+ }
304
+ async findMutationProjectIds(data) {
305
+ NetworkSiteHierarchyLock.assertSafeRootMutationScope({
306
+ query: data.query,
307
+ props: data.props,
308
+ tenantScopeIsClosed: data.isDelete,
309
+ });
310
+ const networkSiteTypes = await this.findBy({
311
+ query: data.isDelete
312
+ ? this.scopeDeleteQueryToCallerTenant(data.query, data.props)
313
+ : this.scopeQueryToCallerTenant(data.query, data.props),
314
+ select: { projectId: true },
315
+ limit: data.limit,
316
+ skip: data.skip,
317
+ props: { isRoot: true },
318
+ });
319
+ const projectIds = networkSiteTypes
320
+ .map((networkSiteType) => {
321
+ return networkSiteType.projectId;
322
+ })
323
+ .filter((projectId) => {
324
+ return Boolean(projectId);
325
+ });
326
+ projectIds.push(...NetworkSiteHierarchyLock.getExplicitProjectIds(data.query));
327
+ if (projectIds.length === 0 && data.props.tenantId) {
328
+ projectIds.push(data.props.tenantId);
329
+ }
330
+ const seenProjectIds = new Set();
331
+ return projectIds.filter((projectId) => {
332
+ const normalizedProjectId = normalizeId(projectId);
333
+ if (seenProjectIds.has(normalizedProjectId)) {
334
+ return false;
335
+ }
336
+ seenProjectIds.add(normalizedProjectId);
337
+ return true;
338
+ });
339
+ }
340
+ scopeQueryToCallerTenant(query, props) {
341
+ if (props.isRoot || props.isMasterAdmin || !props.tenantId) {
342
+ return query;
343
+ }
344
+ return Object.assign(Object.assign({}, query), { projectId: props.tenantId });
345
+ }
346
+ /*
347
+ * DeletePermission retains tenant scoping for root callers that provide a
348
+ * tenantId. The hierarchy preflight must select the identical window.
349
+ */
350
+ scopeDeleteQueryToCallerTenant(query, props) {
351
+ if (!props.tenantId || props.isMultiTenantRequest) {
352
+ return query;
353
+ }
354
+ return Object.assign(Object.assign({}, query), { projectId: props.tenantId });
355
+ }
356
+ readProjectId(data) {
357
+ for (const key of PROJECT_KEYS) {
358
+ const value = data[key];
359
+ const isExplicitClear = value === null || value === "";
360
+ if (typeof value === "function") {
361
+ throw new BadDataException(`${key} cannot be set to a raw SQL expression because the Network Site Type project must be validated against an actual ID.`);
362
+ }
363
+ if (value !== undefined &&
364
+ !isExplicitClear &&
365
+ !RelationIdUtil.read(data, [key])) {
366
+ throw new BadDataException(`${key} must contain a valid Project ID.`);
367
+ }
368
+ }
369
+ return RelationIdUtil.readConsistent(data, PROJECT_KEYS, "project");
370
+ }
371
+ /*
372
+ * Dashboard entity pickers submit the relation object; services and
373
+ * migrations usually submit the scalar FK. Validate both, and refuse a
374
+ * contradictory pair rather than relying on ORM precedence for the shared
375
+ * join column.
376
+ */
377
+ readParentId(data) {
378
+ assertNoSqlExpression(data, PARENT_NETWORK_SITE_TYPE_KEYS);
379
+ for (const key of PARENT_NETWORK_SITE_TYPE_KEYS) {
380
+ const value = data[key];
381
+ const isExplicitClear = value === null || value === "";
382
+ if (value !== undefined &&
383
+ !isExplicitClear &&
384
+ !RelationIdUtil.read(data, [key])) {
385
+ throw new BadDataException(`${key} must contain a valid Network Site Type ID.`);
386
+ }
387
+ }
388
+ return RelationIdUtil.readConsistent(data, PARENT_NETWORK_SITE_TYPE_KEYS, "parent Network Site Type");
389
+ }
390
+ async getNextSiblingOrder(data) {
391
+ const siblings = await this.findAllNetworkSiteTypes({
392
+ query: {
393
+ projectId: data.projectId,
394
+ parentNetworkSiteTypeId: data.parentNetworkSiteTypeId
395
+ ? data.parentNetworkSiteTypeId
396
+ : QueryHelper.isNull(),
397
+ },
398
+ select: { order: true },
399
+ });
400
+ const maxOrder = siblings.reduce((currentMax, sibling) => {
401
+ return typeof sibling.order === "number"
402
+ ? Math.max(currentMax !== null && currentMax !== void 0 ? currentMax : sibling.order, sibling.order)
403
+ : currentMax;
404
+ }, null);
405
+ return maxOrder === null ? 1 : maxOrder + 1;
406
+ }
407
+ async findAllNetworkSiteTypes(data) {
408
+ const networkSiteTypes = [];
409
+ let skip = 0;
410
+ while (true) {
411
+ const page = await this.findBy({
412
+ query: data.query,
413
+ select: data.select,
414
+ sort: { _id: SortOrder.Ascending },
415
+ limit: LIMIT_MAX,
416
+ skip,
417
+ props: { isRoot: true },
418
+ });
419
+ networkSiteTypes.push(...page);
420
+ if (page.length < LIMIT_MAX) {
421
+ return networkSiteTypes;
422
+ }
423
+ skip += page.length;
424
+ }
425
+ }
426
+ /*
427
+ * Network estates regularly exceed LIMIT_MAX. Every hierarchy invariant is
428
+ * universal ("all sites match"), so silently validating only the first page
429
+ * would make its result depend on row order. A stable id sort also prevents
430
+ * offset pages from overlapping while these read-only checks run.
431
+ */
432
+ async findAllNetworkSites(data) {
433
+ const sites = [];
434
+ let skip = 0;
435
+ while (true) {
436
+ const page = await NetworkSiteService.findBy({
437
+ query: data.query,
438
+ select: data.select,
439
+ sort: { _id: SortOrder.Ascending },
440
+ limit: LIMIT_MAX,
441
+ skip,
442
+ props: { isRoot: true },
443
+ });
444
+ sites.push(...page);
445
+ if (page.length < LIMIT_MAX) {
446
+ return sites;
447
+ }
448
+ skip += page.length;
449
+ }
450
+ }
451
+ async assertParentIsValid(data) {
452
+ if (data.networkSiteTypeId &&
453
+ sameId(data.networkSiteTypeId, data.parentNetworkSiteTypeId)) {
454
+ throw new BadDataException("A Network Site Type cannot be its own parent.");
455
+ }
456
+ const parent = await this.findOneById({
457
+ id: data.parentNetworkSiteTypeId,
458
+ select: {
459
+ _id: true,
460
+ projectId: true,
461
+ isUnitLevel: true,
462
+ },
463
+ props: { isRoot: true },
464
+ });
465
+ if (!parent) {
466
+ throw new BadDataException("Parent Network Site Type not found.");
467
+ }
468
+ if (!parent.projectId || !sameId(parent.projectId, data.projectId)) {
469
+ throw new BadDataException("Parent Network Site Type must belong to the same project.");
470
+ }
471
+ if (parent.isUnitLevel === true) {
472
+ throw new BadDataException("A unit-level Network Site Type cannot have child types.");
473
+ }
474
+ if (!data.networkSiteTypeId) {
475
+ return;
476
+ }
477
+ const networkSiteTypes = await this.findAllNetworkSiteTypes({
478
+ query: { projectId: data.projectId },
479
+ select: {
480
+ _id: true,
481
+ parentNetworkSiteTypeId: true,
482
+ },
483
+ });
484
+ const movingType = new Model();
485
+ movingType.id = data.networkSiteTypeId;
486
+ const parentIsDescendant = NetworkSiteTypeHierarchyUtil.getDescendantNetworkSiteTypes({
487
+ networkSiteType: movingType,
488
+ networkSiteTypes,
489
+ }).some((descendant) => {
490
+ return Boolean(descendant.id && sameId(descendant.id, data.parentNetworkSiteTypeId));
491
+ });
492
+ if (parentIsDescendant) {
493
+ throw new BadDataException("A Network Site Type cannot be moved under one of its descendants.");
494
+ }
495
+ }
496
+ /*
497
+ * Changing a type definition must not retroactively make the concrete site
498
+ * tree invalid. A root type may only describe root sites; a child type may
499
+ * only describe sites whose actual parent has the declared parent type.
500
+ */
501
+ async assertExistingSitesMatchProposedParent(data) {
502
+ const sites = await this.findAllNetworkSites({
503
+ query: { networkSiteTypeId: data.networkSiteTypeId },
504
+ select: {
505
+ _id: true,
506
+ parentSiteId: true,
507
+ },
508
+ });
509
+ if (sites.length === 0) {
510
+ return;
511
+ }
512
+ if (!data.proposedParentNetworkSiteTypeId) {
513
+ if (sites.some((site) => {
514
+ return Boolean(site.parentSiteId);
515
+ })) {
516
+ throw new BadDataException(EXISTING_SITES_DO_NOT_MATCH_MESSAGE);
517
+ }
518
+ return;
519
+ }
520
+ const parentSiteIds = [];
521
+ const distinctParentSiteIds = new Set();
522
+ for (const site of sites) {
523
+ if (!site.parentSiteId) {
524
+ throw new BadDataException(EXISTING_SITES_DO_NOT_MATCH_MESSAGE);
525
+ }
526
+ const normalizedParentSiteId = normalizeId(site.parentSiteId);
527
+ if (!distinctParentSiteIds.has(normalizedParentSiteId)) {
528
+ distinctParentSiteIds.add(normalizedParentSiteId);
529
+ parentSiteIds.push(site.parentSiteId);
530
+ }
531
+ }
532
+ const parentSites = [];
533
+ for (let offset = 0; offset < parentSiteIds.length; offset += LIMIT_MAX) {
534
+ const parentSiteIdBatch = parentSiteIds.slice(offset, offset + LIMIT_MAX);
535
+ parentSites.push(...(await this.findAllNetworkSites({
536
+ query: {
537
+ _id: QueryHelper.any(parentSiteIdBatch.map((parentSiteId) => {
538
+ return parentSiteId.toString();
539
+ })),
540
+ },
541
+ select: {
542
+ _id: true,
543
+ networkSiteTypeId: true,
544
+ },
545
+ })));
546
+ }
547
+ const parentTypeBySiteId = new Map();
548
+ for (const parentSite of parentSites) {
549
+ if (parentSite.id && parentSite.networkSiteTypeId) {
550
+ parentTypeBySiteId.set(normalizeId(parentSite.id), parentSite.networkSiteTypeId);
551
+ }
552
+ }
553
+ const hasMismatch = parentSiteIds.some((parentSiteId) => {
554
+ const actualParentTypeId = parentTypeBySiteId.get(normalizeId(parentSiteId));
555
+ return (!actualParentTypeId ||
556
+ !sameId(actualParentTypeId, data.proposedParentNetworkSiteTypeId));
557
+ });
558
+ if (hasMismatch) {
559
+ throw new BadDataException(EXISTING_SITES_DO_NOT_MATCH_MESSAGE);
560
+ }
561
+ }
562
+ async assertTypesCanBecomeUnitLevel(networkSiteTypes) {
563
+ const networkSiteTypeIds = networkSiteTypes
564
+ .map((networkSiteType) => {
565
+ return networkSiteType.id;
566
+ })
567
+ .filter((id) => {
568
+ return Boolean(id);
569
+ });
570
+ if (networkSiteTypeIds.length === 0) {
571
+ return;
572
+ }
573
+ const projectIds = [
574
+ ...new Set(networkSiteTypes
575
+ .map((networkSiteType) => {
576
+ var _a;
577
+ return (_a = networkSiteType.projectId) === null || _a === void 0 ? void 0 : _a.toString();
578
+ })
579
+ .filter((projectId) => {
580
+ return Boolean(projectId);
581
+ })),
582
+ ];
583
+ const child = await this.findOneBy({
584
+ query: Object.assign({ parentNetworkSiteTypeId: QueryHelper.any(networkSiteTypeIds.map((id) => {
585
+ return id.toString();
586
+ })) }, (projectIds.length > 0
587
+ ? { projectId: QueryHelper.any(projectIds) }
588
+ : {})),
589
+ select: { _id: true },
590
+ props: { isRoot: true },
591
+ });
592
+ if (child) {
593
+ throw new BadDataException("A Network Site Type with child types cannot be made unit-level.");
594
+ }
595
+ const sitesOfTypes = await this.findAllNetworkSites({
596
+ query: {
597
+ networkSiteTypeId: QueryHelper.any(networkSiteTypeIds.map((id) => {
598
+ return id.toString();
599
+ })),
600
+ },
601
+ select: { _id: true },
602
+ });
603
+ const siteIds = sitesOfTypes
604
+ .map((site) => {
605
+ var _a;
606
+ return (_a = site.id) === null || _a === void 0 ? void 0 : _a.toString();
607
+ })
608
+ .filter((id) => {
609
+ return Boolean(id);
610
+ });
611
+ if (siteIds.length === 0) {
612
+ return;
613
+ }
614
+ for (let offset = 0; offset < siteIds.length; offset += REFERENCE_VALIDATION_BATCH_SIZE) {
615
+ const childSite = await NetworkSiteService.findOneBy({
616
+ query: Object.assign({ parentSiteId: QueryHelper.any(siteIds.slice(offset, offset + REFERENCE_VALIDATION_BATCH_SIZE)) }, (projectIds.length > 0
617
+ ? { projectId: QueryHelper.any(projectIds) }
618
+ : {})),
619
+ select: { _id: true },
620
+ props: { isRoot: true },
621
+ });
622
+ if (childSite) {
623
+ throw new BadDataException("A Network Site Type whose sites have child sites cannot be made unit-level.");
624
+ }
625
+ }
626
+ }
627
+ async onBeforeCreate(createBy) {
628
+ const data = createBy.data;
629
+ assertIsUnitLevelIsNotSqlExpression(data);
630
+ const parentNetworkSiteTypeId = this.readParentId(data);
631
+ const projectId = createBy.props.tenantId || this.readProjectId(data) || null;
632
+ if (!projectId) {
633
+ throw new BadDataException("Project ID is required.");
634
+ }
635
+ if (parentNetworkSiteTypeId) {
636
+ await this.assertParentIsValid({
637
+ networkSiteTypeId: createBy.data.id,
638
+ parentNetworkSiteTypeId,
639
+ projectId,
640
+ });
641
+ }
642
+ if (createBy.data.order === undefined || createBy.data.order === null) {
643
+ createBy.data.order = await this.getNextSiblingOrder({
644
+ projectId,
645
+ parentNetworkSiteTypeId,
646
+ });
647
+ }
648
+ return { createBy, carryForward: null };
649
+ }
650
+ async onBeforeUpdate(updateBy) {
651
+ const data = (updateBy.data ||
652
+ {});
653
+ assertIsUnitLevelIsNotSqlExpression(data);
654
+ const isParentWritten = isAnyKeyWritten(data, PARENT_NETWORK_SITE_TYPE_KEYS);
655
+ const isBecomingUnitLevel = data["isUnitLevel"] === true;
656
+ const isProjectWritten = isAnyKeyWritten(data, PROJECT_KEYS);
657
+ const proposedProjectId = isProjectWritten
658
+ ? this.readProjectId(data)
659
+ : null;
660
+ if (!isParentWritten && !isBecomingUnitLevel && !isProjectWritten) {
661
+ return { updateBy, carryForward: null };
662
+ }
663
+ if (isProjectWritten && !proposedProjectId) {
664
+ throw new BadDataException("A Network Site Type cannot be moved to another project.");
665
+ }
666
+ const proposedParentNetworkSiteTypeId = isParentWritten
667
+ ? this.readParentId(data)
668
+ : null;
669
+ const updateLimit = updateBy.limit instanceof PositiveNumber
670
+ ? updateBy.limit.toNumber()
671
+ : updateBy.limit || LIMIT_MAX;
672
+ const updateSkip = updateBy.skip instanceof PositiveNumber
673
+ ? updateBy.skip.toNumber()
674
+ : updateBy.skip || 0;
675
+ const networkSiteTypesBeingUpdated = await this.findBy({
676
+ query: this.scopeQueryToCallerTenant(updateBy.query, updateBy.props),
677
+ select: {
678
+ _id: true,
679
+ projectId: true,
680
+ parentNetworkSiteTypeId: true,
681
+ isUnitLevel: true,
682
+ },
683
+ limit: updateLimit,
684
+ skip: updateSkip,
685
+ props: { isRoot: true },
686
+ });
687
+ if (isProjectWritten) {
688
+ for (const networkSiteType of networkSiteTypesBeingUpdated) {
689
+ if (!networkSiteType.projectId ||
690
+ !proposedProjectId ||
691
+ !sameId(networkSiteType.projectId, proposedProjectId)) {
692
+ throw new BadDataException("A Network Site Type cannot be moved to another project.");
693
+ }
694
+ }
695
+ }
696
+ if (!isParentWritten && !isBecomingUnitLevel) {
697
+ return { updateBy, carryForward: null };
698
+ }
699
+ if (isBecomingUnitLevel) {
700
+ await this.assertTypesCanBecomeUnitLevel(networkSiteTypesBeingUpdated.filter((networkSiteType) => {
701
+ return networkSiteType.isUnitLevel !== true;
702
+ }));
703
+ }
704
+ if (isParentWritten) {
705
+ for (const networkSiteType of networkSiteTypesBeingUpdated) {
706
+ if (!networkSiteType.id || !networkSiteType.projectId) {
707
+ continue;
708
+ }
709
+ if (proposedParentNetworkSiteTypeId) {
710
+ await this.assertParentIsValid({
711
+ networkSiteTypeId: networkSiteType.id,
712
+ parentNetworkSiteTypeId: proposedParentNetworkSiteTypeId,
713
+ projectId: networkSiteType.projectId,
714
+ });
715
+ }
716
+ const currentParentId = NetworkSiteTypeHierarchyUtil.getParentId(networkSiteType);
717
+ const parentChanged = proposedParentNetworkSiteTypeId
718
+ ? !currentParentId ||
719
+ !sameId(currentParentId, proposedParentNetworkSiteTypeId)
720
+ : Boolean(currentParentId);
721
+ if (parentChanged) {
722
+ await this.assertExistingSitesMatchProposedParent({
723
+ networkSiteTypeId: networkSiteType.id,
724
+ proposedParentNetworkSiteTypeId,
725
+ });
726
+ if (networkSiteTypesBeingUpdated.length === 1 &&
727
+ data["order"] === undefined) {
728
+ updateBy.data.order = await this.getNextSiblingOrder({
729
+ projectId: networkSiteType.projectId,
730
+ parentNetworkSiteTypeId: proposedParentNetworkSiteTypeId,
731
+ });
732
+ }
733
+ }
734
+ }
735
+ }
736
+ return { updateBy, carryForward: null };
737
+ }
738
+ async onBeforeDelete(deleteBy) {
739
+ const deleteLimit = deleteBy.limit instanceof PositiveNumber
740
+ ? deleteBy.limit.toNumber()
741
+ : deleteBy.limit || LIMIT_MAX;
742
+ const deleteSkip = deleteBy.skip instanceof PositiveNumber
743
+ ? deleteBy.skip.toNumber()
744
+ : deleteBy.skip || 0;
745
+ const networkSiteTypesBeingDeleted = await this.findBy({
746
+ query: this.scopeDeleteQueryToCallerTenant(deleteBy.query, deleteBy.props),
747
+ select: { _id: true, projectId: true },
748
+ limit: deleteLimit,
749
+ skip: deleteSkip,
750
+ props: { isRoot: true },
751
+ });
752
+ const ids = networkSiteTypesBeingDeleted
753
+ .map((networkSiteType) => {
754
+ return networkSiteType.id;
755
+ })
756
+ .filter((id) => {
757
+ return Boolean(id);
758
+ });
759
+ if (ids.length === 0) {
760
+ return { deleteBy, carryForward: null };
761
+ }
762
+ const idStrings = ids.map((id) => {
763
+ return id.toString();
764
+ });
765
+ const deletingIds = new Set(idStrings.map((id) => {
766
+ return normalizeId(id);
767
+ }));
768
+ const projectIdStrings = [
769
+ ...new Set(networkSiteTypesBeingDeleted
770
+ .map((networkSiteType) => {
771
+ var _a;
772
+ return (_a = networkSiteType.projectId) === null || _a === void 0 ? void 0 : _a.toString();
773
+ })
774
+ .filter((projectId) => {
775
+ return Boolean(projectId);
776
+ })),
777
+ ];
778
+ for (let parentOffset = 0; parentOffset < idStrings.length; parentOffset += REFERENCE_VALIDATION_BATCH_SIZE) {
779
+ const parentIdBatch = idStrings.slice(parentOffset, parentOffset + REFERENCE_VALIDATION_BATCH_SIZE);
780
+ let childSkip = 0;
781
+ while (true) {
782
+ const childTypes = await this.findBy({
783
+ query: Object.assign({ parentNetworkSiteTypeId: QueryHelper.any(parentIdBatch) }, (projectIdStrings.length > 0
784
+ ? { projectId: QueryHelper.any(projectIdStrings) }
785
+ : {})),
786
+ select: { _id: true },
787
+ sort: { _id: SortOrder.Ascending },
788
+ limit: REFERENCE_VALIDATION_BATCH_SIZE,
789
+ skip: childSkip,
790
+ props: { isRoot: true },
791
+ });
792
+ const hasSurvivingChild = childTypes.some((child) => {
793
+ return !child.id || !deletingIds.has(normalizeId(child.id));
794
+ });
795
+ if (hasSurvivingChild) {
796
+ throw new BadDataException("A Network Site Type cannot be deleted while child types use it as their parent.");
797
+ }
798
+ if (childTypes.length < REFERENCE_VALIDATION_BATCH_SIZE) {
799
+ break;
800
+ }
801
+ childSkip += childTypes.length;
802
+ }
803
+ const site = await NetworkSiteService.findOneBy({
804
+ query: {
805
+ networkSiteTypeId: QueryHelper.any(parentIdBatch),
806
+ },
807
+ select: { _id: true },
808
+ props: { isRoot: true },
809
+ });
810
+ if (site) {
811
+ throw new BadDataException("A Network Site Type cannot be deleted while Network Sites use it.");
812
+ }
813
+ }
814
+ return { deleteBy, carryForward: null };
815
+ }
7
816
  }
817
+ __decorate([
818
+ CaptureSpan(),
819
+ __metadata("design:type", Function),
820
+ __metadata("design:paramtypes", [Object]),
821
+ __metadata("design:returntype", Promise)
822
+ ], Service.prototype, "create", null);
823
+ __decorate([
824
+ CaptureSpan(),
825
+ __metadata("design:type", Function),
826
+ __metadata("design:paramtypes", [Object]),
827
+ __metadata("design:returntype", Promise)
828
+ ], Service.prototype, "updateOneBy", null);
829
+ __decorate([
830
+ CaptureSpan(),
831
+ __metadata("design:type", Function),
832
+ __metadata("design:paramtypes", [Object]),
833
+ __metadata("design:returntype", Promise)
834
+ ], Service.prototype, "updateBy", null);
835
+ __decorate([
836
+ CaptureSpan(),
837
+ __metadata("design:type", Function),
838
+ __metadata("design:paramtypes", [Object]),
839
+ __metadata("design:returntype", Promise)
840
+ ], Service.prototype, "deleteOneBy", null);
841
+ __decorate([
842
+ CaptureSpan(),
843
+ __metadata("design:type", Function),
844
+ __metadata("design:paramtypes", [Object]),
845
+ __metadata("design:returntype", Promise)
846
+ ], Service.prototype, "deleteBy", null);
847
+ __decorate([
848
+ CaptureSpan(),
849
+ __metadata("design:type", Function),
850
+ __metadata("design:paramtypes", [Object]),
851
+ __metadata("design:returntype", Promise)
852
+ ], Service.prototype, "hardDeleteBy", null);
853
+ __decorate([
854
+ CaptureSpan(),
855
+ __metadata("design:type", Function),
856
+ __metadata("design:paramtypes", [Object]),
857
+ __metadata("design:returntype", Promise)
858
+ ], Service.prototype, "onBeforeCreate", null);
859
+ __decorate([
860
+ CaptureSpan(),
861
+ __metadata("design:type", Function),
862
+ __metadata("design:paramtypes", [Object]),
863
+ __metadata("design:returntype", Promise)
864
+ ], Service.prototype, "onBeforeUpdate", null);
865
+ __decorate([
866
+ CaptureSpan(),
867
+ __metadata("design:type", Function),
868
+ __metadata("design:paramtypes", [Object]),
869
+ __metadata("design:returntype", Promise)
870
+ ], Service.prototype, "onBeforeDelete", null);
8
871
  export default new Service();
9
872
  //# sourceMappingURL=NetworkSiteTypeService.js.map