@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
@@ -13,7 +13,12 @@ import BaseAPI from "./BaseAPI";
13
13
  import LIMIT_MAX from "../../Types/Database/LimitMax";
14
14
  import PositiveNumber from "../../Types/PositiveNumber";
15
15
  import LlmProvider from "../../Models/DatabaseModels/LlmProvider";
16
- import LLMService, { LLMProviderConfig } from "../Utils/LLM/LLMService";
16
+ import LLMService, {
17
+ LLMCompletionResponse,
18
+ LLMProviderConfig,
19
+ LLMToolCall,
20
+ LLMToolDefinition,
21
+ } from "../Utils/LLM/LLMService";
17
22
  import LlmType from "../../Types/LLM/LlmType";
18
23
  import BadDataException from "../../Types/Exception/BadDataException";
19
24
  import Exception from "../../Types/Exception/Exception";
@@ -22,6 +27,20 @@ import { JSONObject } from "../../Types/JSON";
22
27
  import ObjectID from "../../Types/ObjectID";
23
28
  import logger from "../Utils/Logger";
24
29
 
30
+ /*
31
+ * The smallest possible tool: no arguments, one obvious reason to call it.
32
+ * A provider that can call tools at all can call this one.
33
+ */
34
+ const CONNECTION_TEST_TOOL: LLMToolDefinition = {
35
+ name: "connection_test_ping",
36
+ description:
37
+ "Call this tool to confirm that tool calling works. Takes no arguments.",
38
+ inputSchema: {
39
+ type: "object",
40
+ properties: {},
41
+ },
42
+ };
43
+
25
44
  export default class LlmProviderAPI extends BaseAPI<
26
45
  LlmProvider,
27
46
  LlmProviderServiceType
@@ -176,8 +195,12 @@ export default class LlmProviderAPI extends BaseAPI<
176
195
  ...(provider.modelName ? { modelName: provider.modelName } : {}),
177
196
  };
178
197
 
179
- try {
180
- await LLMService.getCompletion({
198
+ const runTestCompletion: (
199
+ withTools: boolean,
200
+ ) => Promise<LLMCompletionResponse> = (
201
+ withTools: boolean,
202
+ ): Promise<LLMCompletionResponse> => {
203
+ return LLMService.getCompletion({
181
204
  messages: [
182
205
  {
183
206
  role: "system",
@@ -186,11 +209,24 @@ export default class LlmProviderAPI extends BaseAPI<
186
209
  },
187
210
  {
188
211
  role: "user",
189
- content: "Reply with the word: OK",
212
+ content: withTools
213
+ ? `Call the ${CONNECTION_TEST_TOOL.name} tool, then reply with the word: OK`
214
+ : "Reply with the word: OK",
190
215
  },
191
216
  ],
217
+ ...(withTools ? { tools: [CONNECTION_TEST_TOOL] } : {}),
192
218
  temperature: 0,
193
- maxTokens: 16,
219
+ /*
220
+ * Wildly generous for a one-word reply, on purpose. The verdict
221
+ * this route now reports depends on the model getting far
222
+ * enough to emit a tool call, and on a reasoning model
223
+ * (gpt-5, o-series) the thinking tokens are billed against this
224
+ * same cap — at a small cap those models routinely stop at
225
+ * "length" with nothing emitted, and a perfectly tool-capable
226
+ * provider would be reported as unverified. One button click,
227
+ * rarely pressed: the headroom costs nothing worth saving.
228
+ */
229
+ maxTokens: 4096,
194
230
  /*
195
231
  * A connection test is a person waiting on a verdict, not a
196
232
  * chat turn worth saving. The default ten-attempt ladder would
@@ -198,37 +234,116 @@ export default class LlmProviderAPI extends BaseAPI<
198
234
  * exists to give — take the better part of a minute to arrive.
199
235
  * One retry still absorbs a single blip.
200
236
  */
201
- requestRetries: 1,
237
+ /*
238
+ * The retry ladder only fires on retryable errors, so the
239
+ * fallback attempt below costs one extra round trip rather than
240
+ * a second ladder — except against an unreachable host, which
241
+ * is why the fallback takes no retries of its own.
242
+ */
243
+ requestRetries: withTools ? 1 : 0,
202
244
  llmProviderConfig: llmProviderConfig,
203
245
  ...(provider.additionalParams
204
246
  ? { additionalParams: provider.additionalParams }
205
247
  : {}),
206
248
  });
207
- } catch (err) {
208
- logger.error(err);
249
+ };
209
250
 
251
+ let testResponse: LLMCompletionResponse | null = null;
252
+ let toolsOfferFailed: boolean = false;
253
+
254
+ try {
255
+ /*
256
+ * Ask of the provider what Ask AI actually asks of it, not just
257
+ * "are you reachable". Every OneUptime AI feature reads the
258
+ * user's data exclusively through tools, so a model or endpoint
259
+ * that holds a conversation but cannot call one is unusable for
260
+ * all of them — and the way that surfaces to the user is the
261
+ * assistant insisting it has no tool for what they asked, which
262
+ * reads as a missing feature rather than a misconfigured
263
+ * provider. This button is the only place an operator gets a
264
+ * verdict, so it has to test the capability the product depends
265
+ * on.
266
+ */
267
+ testResponse = await runTestCompletion(true);
268
+ } catch (err) {
210
269
  /*
211
- * Surface the provider's own error (bad key, unknown model,
212
- * unreachable base URL, etc.) so the user can fix their config.
270
+ * Some OpenAI-compatible backends reject an unknown `tools` field
271
+ * outright. Falling back to the original tool-less prompt keeps
272
+ * this button answering the question it has always answered —
273
+ * "is my API key, model and base URL right?" — instead of
274
+ * reporting a broken connection for a provider that merely
275
+ * cannot call tools. Only if THAT fails too is the provider
276
+ * genuinely unreachable.
213
277
  */
214
- const providerMessage: string =
215
- err instanceof Exception
216
- ? err.message
217
- : "Failed to connect to the LLM provider. Please verify the API key, model name, and base URL.";
278
+ logger.error(err);
218
279
 
219
- return Response.sendErrorResponse(
220
- req,
221
- res,
222
- new BadDataException(
223
- `LLM Provider test failed: ${providerMessage.substring(0, 1000)}`,
224
- ),
280
+ try {
281
+ testResponse = await runTestCompletion(false);
282
+ toolsOfferFailed = true;
283
+ } catch (retryErr) {
284
+ logger.error(retryErr);
285
+
286
+ /*
287
+ * Surface the provider's own error (bad key, unknown model,
288
+ * unreachable base URL, etc.) so the user can fix their config.
289
+ */
290
+ const providerMessage: string =
291
+ retryErr instanceof Exception
292
+ ? retryErr.message
293
+ : "Failed to connect to the LLM provider. Please verify the API key, model name, and base URL.";
294
+
295
+ return Response.sendErrorResponse(
296
+ req,
297
+ res,
298
+ new BadDataException(
299
+ `LLM Provider test failed: ${providerMessage.substring(0, 1000)}`,
300
+ ),
301
+ );
302
+ }
303
+ }
304
+
305
+ /*
306
+ * A missing tool call is a warning, never a failure: a provider can
307
+ * be perfectly well configured for everything except tool calling,
308
+ * and refusing to certify it would block a working setup. Saying
309
+ * nothing would be worse — the operator would leave believing Ask
310
+ * AI works, and find out only when it tells a user it has no tool.
311
+ */
312
+ const calledTheTestTool: boolean =
313
+ !toolsOfferFailed &&
314
+ Boolean(
315
+ testResponse?.toolCalls?.some((toolCall: LLMToolCall) => {
316
+ return toolCall.name === CONNECTION_TEST_TOOL.name;
317
+ }),
225
318
  );
319
+
320
+ /*
321
+ * A reply that ran into the output cap proves nothing either way:
322
+ * the model may have been about to call the tool. Report that as
323
+ * undetermined rather than sending the operator off to replace a
324
+ * model that may be entirely capable.
325
+ */
326
+ const wasTruncated: boolean =
327
+ !calledTheTestTool && testResponse?.stopReason === "length";
328
+
329
+ let message: string =
330
+ "Connection successful. The LLM provider responded to a test prompt and used tool calling.";
331
+
332
+ if (wasTruncated) {
333
+ message =
334
+ "Connection successful, but tool calling could not be determined — the reply hit the output limit before any tool call appeared. This says nothing either way about the model; try the test again.";
335
+ } else if (!calledTheTestTool) {
336
+ const why: string = toolsOfferFailed
337
+ ? "the test request that offered a tool failed, and only a plain prompt succeeded"
338
+ : "the model answered in prose instead of calling the tool it was offered";
339
+
340
+ message = `Connection successful, but tool calling could not be verified — ${why}. OneUptime's AI features (Ask AI, investigations) read your data through tools, so a provider that cannot call them will answer that it has no tool for the question. Check that this model and endpoint support tool/function calling.`;
226
341
  }
227
342
 
228
343
  return Response.sendJsonObjectResponse(req, res, {
229
344
  success: true,
230
- message:
231
- "Connection successful. The LLM provider responded to a test prompt.",
345
+ supportsToolCalling: calledTheTestTool,
346
+ message: message,
232
347
  });
233
348
  } catch (err) {
234
349
  next(err);
@@ -830,6 +830,20 @@ export const IpWhitelist: string = process.env["IP_WHITELIST"] || "";
830
830
  export const DisableTelemetry: boolean =
831
831
  process.env["DISABLE_TELEMETRY"] === "true";
832
832
 
833
+ /*
834
+ * Master switch for fault classification (code-fault / user-error /
835
+ * expected-denial / infrastructure). When false, ErrorClassResolver reports
836
+ * CodeFault for everything, so every thrown value is recorded as an exception
837
+ * event, marked ERROR and logged at ERROR — exactly the pre-classification
838
+ * behaviour.
839
+ *
840
+ * Default ON. It exists so a regression in classification is a config flip on
841
+ * a running fleet rather than a redeploy, which matters because this runs on
842
+ * the universal error path of every decorated method in the product.
843
+ */
844
+ export const TelemetryErrorClassEnabled: boolean =
845
+ process.env["TELEMETRY_ERROR_CLASS_ENABLED"] !== "false";
846
+
833
847
  /*
834
848
  * Opt out of the daily "is a newer OneUptime released?" check against the
835
849
  * GitHub API. Deliberately separate from DISABLE_TELEMETRY, which turns off
@@ -0,0 +1,55 @@
1
+ import { MigrationInterface, QueryRunner } from "typeorm";
2
+
3
+ export class AddNetworkSiteTypeParentHierarchy1790700000000
4
+ implements MigrationInterface
5
+ {
6
+ public name: string = "AddNetworkSiteTypeParentHierarchy1790700000000";
7
+
8
+ public async up(queryRunner: QueryRunner): Promise<void> {
9
+ await queryRunner.query(
10
+ `ALTER TABLE "NetworkSite" DROP CONSTRAINT "FK_33a461f17262b0a4d5be6948ebe"`,
11
+ );
12
+ await queryRunner.query(
13
+ `ALTER TABLE "NetworkSite" DROP CONSTRAINT "FK_7de8eaaa47632114c6864d67d35"`,
14
+ );
15
+ await queryRunner.query(
16
+ `ALTER TABLE "NetworkSiteType" ADD "parentNetworkSiteTypeId" uuid`,
17
+ );
18
+ await queryRunner.query(
19
+ `CREATE INDEX "IDX_d693eaf5e12242179e348daf09" ON "NetworkSiteType" ("projectId", "parentNetworkSiteTypeId") `,
20
+ );
21
+ await queryRunner.query(
22
+ `ALTER TABLE "NetworkSiteType" ADD CONSTRAINT "FK_ee9400ec824926d129b31d5fcf0" FOREIGN KEY ("parentNetworkSiteTypeId") REFERENCES "NetworkSiteType"("_id") ON DELETE NO ACTION ON UPDATE NO ACTION`,
23
+ );
24
+ await queryRunner.query(
25
+ `ALTER TABLE "NetworkSite" ADD CONSTRAINT "FK_7de8eaaa47632114c6864d67d35" FOREIGN KEY ("networkSiteTypeId") REFERENCES "NetworkSiteType"("_id") ON DELETE NO ACTION ON UPDATE NO ACTION`,
26
+ );
27
+ await queryRunner.query(
28
+ `ALTER TABLE "NetworkSite" ADD CONSTRAINT "FK_33a461f17262b0a4d5be6948ebe" FOREIGN KEY ("parentSiteId") REFERENCES "NetworkSite"("_id") ON DELETE NO ACTION ON UPDATE NO ACTION`,
29
+ );
30
+ }
31
+
32
+ public async down(queryRunner: QueryRunner): Promise<void> {
33
+ await queryRunner.query(
34
+ `ALTER TABLE "NetworkSite" DROP CONSTRAINT "FK_33a461f17262b0a4d5be6948ebe"`,
35
+ );
36
+ await queryRunner.query(
37
+ `ALTER TABLE "NetworkSite" DROP CONSTRAINT "FK_7de8eaaa47632114c6864d67d35"`,
38
+ );
39
+ await queryRunner.query(
40
+ `ALTER TABLE "NetworkSiteType" DROP CONSTRAINT "FK_ee9400ec824926d129b31d5fcf0"`,
41
+ );
42
+ await queryRunner.query(
43
+ `DROP INDEX "public"."IDX_d693eaf5e12242179e348daf09"`,
44
+ );
45
+ await queryRunner.query(
46
+ `ALTER TABLE "NetworkSiteType" DROP COLUMN "parentNetworkSiteTypeId"`,
47
+ );
48
+ await queryRunner.query(
49
+ `ALTER TABLE "NetworkSite" ADD CONSTRAINT "FK_7de8eaaa47632114c6864d67d35" FOREIGN KEY ("networkSiteTypeId") REFERENCES "NetworkSiteType"("_id") ON DELETE SET NULL ON UPDATE NO ACTION`,
50
+ );
51
+ await queryRunner.query(
52
+ `ALTER TABLE "NetworkSite" ADD CONSTRAINT "FK_33a461f17262b0a4d5be6948ebe" FOREIGN KEY ("parentSiteId") REFERENCES "NetworkSite"("_id") ON DELETE SET NULL ON UPDATE NO ACTION`,
53
+ );
54
+ }
55
+ }
@@ -0,0 +1,31 @@
1
+ import { MigrationInterface, QueryRunner } from "typeorm";
2
+
3
+ export class AddEnterpriseLicenseUsageProvenance1790900000000
4
+ implements MigrationInterface
5
+ {
6
+ public name: string = "AddEnterpriseLicenseUsageProvenance1790900000000";
7
+
8
+ public async up(queryRunner: QueryRunner): Promise<void> {
9
+ await queryRunner.query(
10
+ `ALTER TABLE "EnterpriseLicense" ADD "userCountSource" character varying(100)`,
11
+ );
12
+ await queryRunner.query(
13
+ `ALTER TABLE "EnterpriseLicense" ADD "legacyUserCount" integer`,
14
+ );
15
+ await queryRunner.query(
16
+ `ALTER TABLE "EnterpriseLicense" ADD "legacyUserCountUpdatedAt" TIMESTAMP WITH TIME ZONE`,
17
+ );
18
+ }
19
+
20
+ public async down(queryRunner: QueryRunner): Promise<void> {
21
+ await queryRunner.query(
22
+ `ALTER TABLE "EnterpriseLicense" DROP COLUMN "legacyUserCountUpdatedAt"`,
23
+ );
24
+ await queryRunner.query(
25
+ `ALTER TABLE "EnterpriseLicense" DROP COLUMN "legacyUserCount"`,
26
+ );
27
+ await queryRunner.query(
28
+ `ALTER TABLE "EnterpriseLicense" DROP COLUMN "userCountSource"`,
29
+ );
30
+ }
31
+ }
@@ -0,0 +1,124 @@
1
+ import { MigrationInterface, QueryRunner } from "typeorm";
2
+
3
+ /*
4
+ * The fault class becomes a first-class, always-populated column on the
5
+ * exception group, instead of a nullable AI verdict.
6
+ *
7
+ * Both columns are NOT NULL DEFAULT on purpose, and that is the whole point of
8
+ * this migration rather than an incidental choice. The Issues list scopes with
9
+ * `IncludesNone(NON_ACTIONABLE_ERROR_CLASSES)`, which compiles to SQL
10
+ * `"errorClass" NOT IN ('user-error', 'expected-denial')`. In SQL,
11
+ * `NULL NOT IN (...)` evaluates to NULL — falsy, not true — so with a nullable
12
+ * column every unclassified row would fail that predicate and vanish from the
13
+ * "show me the real failures" view. That is the exact inverse of the intended
14
+ * fail-safe. With NOT NULL DEFAULT 'unknown', a row nobody classified carries
15
+ * a value that is not in the suppressed set, so it is an Issue by
16
+ * construction, and the ADD COLUMN backfills every existing row in one pass.
17
+ *
18
+ * aiClassification is left in place: it is the same vocabulary under its older
19
+ * name (see Types/Telemetry/ErrorClass) and is still what the triage runner
20
+ * writes, so dropping it here would break that writer. It is copied across
21
+ * below and can be retired once every writer has moved to errorClass.
22
+ */
23
+ export class AddTelemetryExceptionErrorClass1790900000000
24
+ implements MigrationInterface
25
+ {
26
+ public name: string = "AddTelemetryExceptionErrorClass1790900000000";
27
+
28
+ public async up(queryRunner: QueryRunner): Promise<void> {
29
+ await queryRunner.query(
30
+ `ALTER TABLE "TelemetryException" ADD "errorClass" character varying(100) NOT NULL DEFAULT 'unknown'`,
31
+ );
32
+ await queryRunner.query(
33
+ `ALTER TABLE "TelemetryException" ADD "errorClassSource" character varying(100) NOT NULL DEFAULT 'default'`,
34
+ );
35
+
36
+ /*
37
+ * Carry the existing AI verdicts over. Same five string values, so this is
38
+ * a rename rather than a translation.
39
+ *
40
+ * Deliberately not filtered to the known enum members: a value this does
41
+ * not recognise still fails the `NOT IN ('user-error', 'expected-denial')`
42
+ * scope and therefore stays visible, which is the safe direction. Silently
43
+ * dropping it to 'unknown' would lose information for no gain.
44
+ */
45
+ await queryRunner.query(`
46
+ UPDATE "TelemetryException"
47
+ SET "errorClass" = "aiClassification", "errorClassSource" = 'ai'
48
+ WHERE "aiClassification" IS NOT NULL
49
+ `);
50
+
51
+ /*
52
+ * Reconstruct what the emitting code would have declared, for groups the
53
+ * AI never looked at, so the Issues list is quiet on day one instead of
54
+ * only for exceptions raised after this deploy.
55
+ *
56
+ * Every class listed here overrides getErrorClass to UserError or
57
+ * ExpectedDenial. Both collapse to 'user-error' here: the two are
58
+ * interchangeable for the only thing this backfill drives (they are the
59
+ * two members of NON_ACTIONABLE_ERROR_CLASSES), and guessing the finer
60
+ * split from a type name alone would be inventing precision the data does
61
+ * not have. Live traffic re-stamps the precise class on the next
62
+ * occurrence.
63
+ *
64
+ * Spelling matters here and is easy to get wrong: exceptionType comes from
65
+ * the constructor name, so it is 'SSOAuthorizationException' (the file is
66
+ * SsoAuthorizationException.ts) and 'UnableToReachServer' (no trailing
67
+ * Exception). MasterPasswordRequiredException carries no override of its
68
+ * own — it inherits ExpectedDenial from NotAuthenticatedException — so it
69
+ * has to be listed explicitly.
70
+ *
71
+ * The bare numeric values are the same exceptions seen through an older
72
+ * emit path (and through third-party SDKs), which reported the numeric
73
+ * status as exception.type rather than the class name. 408 and 415 are
74
+ * deliberately ABSENT: they are TimeoutException and UnableToReachServer,
75
+ * which are Infrastructure — real failures that must keep showing up as
76
+ * Issues. 500 and 503 are absent for the same reason.
77
+ *
78
+ * Guarded on "aiClassification" IS NULL so it cannot overwrite an AI
79
+ * verdict. Type name is a class-level GENERALISATION ("BadDataException
80
+ * usually means the caller sent something wrong"), whereas the AI looked
81
+ * at this specific group; and the only disagreement that matters is one
82
+ * where the AI said code-fault and this would flip it to user-error, i.e.
83
+ * hide a real failure. Deferring keeps the failure mode as
84
+ * over-reporting.
85
+ */
86
+ await queryRunner.query(`
87
+ UPDATE "TelemetryException"
88
+ SET "errorClass" = 'user-error', "errorClassSource" = 'declared'
89
+ WHERE "aiClassification" IS NULL
90
+ AND (
91
+ "exceptionType" IN (
92
+ 'BadDataException',
93
+ 'BadRequestException',
94
+ 'NotFoundException',
95
+ 'PayloadTooLargeException',
96
+ 'TenantNotFoundException',
97
+ 'ForbiddenException',
98
+ 'NotAuthenticatedException',
99
+ 'NotAuthorizedException',
100
+ 'PaymentRequiredException',
101
+ 'SSOAuthorizationException',
102
+ 'MasterPasswordRequiredException',
103
+ 'TooManyRequestsException'
104
+ )
105
+ OR "exceptionType" IN (
106
+ '400', '401', '402', '403', '404', '405', '406', '413', '422', '429'
107
+ )
108
+ )
109
+ `);
110
+ }
111
+
112
+ /*
113
+ * Nothing to un-backfill: both columns go away, and aiClassification — the
114
+ * only source the backfill read — was never modified.
115
+ */
116
+ public async down(queryRunner: QueryRunner): Promise<void> {
117
+ await queryRunner.query(
118
+ `ALTER TABLE "TelemetryException" DROP COLUMN "errorClassSource"`,
119
+ );
120
+ await queryRunner.query(
121
+ `ALTER TABLE "TelemetryException" DROP COLUMN "errorClass"`,
122
+ );
123
+ }
124
+ }
@@ -0,0 +1,132 @@
1
+ import { MigrationInterface, QueryRunner } from "typeorm";
2
+
3
+ /*
4
+ * The two tables behind owner email burst coalescing: a queue of notifications
5
+ * that is simultaneously the product's first per-recipient email volume record,
6
+ * and a ledger of the flushes that drained it.
7
+ *
8
+ * Regenerating this migration would silently reverse four decisions, so each is
9
+ * written down here rather than left to be rediscovered.
10
+ *
11
+ * The UNIQUE index on UserNotificationEmailRollupBatch (projectId, userId,
12
+ * toEmail, claimEpochStartsAt) IS the exactly-once mechanism across worker
13
+ * replicas, not an integrity nicety. A conditional UPDATE cannot substitute for
14
+ * it: DatabaseService._updateBy resolves its predicate in a separate _findBy and
15
+ * then writes per row by _id, never re-checking the predicate at write time, so
16
+ * "update the row if nobody has claimed it" is a check-then-act race. An INSERT
17
+ * under this index is atomic in Postgres, and the loser's unique violation is
18
+ * how the second replica learns to stand down. Because claimEpochStartsAt is a
19
+ * five-minute wall-clock bucket, the same index also hard-caps a recipient at
20
+ * twelve rollup emails an hour.
21
+ *
22
+ * All four projectId / userId foreign keys are ON DELETE CASCADE. Queued mail
23
+ * about a deleted project, addressed to a deleted user, must go with them; there
24
+ * is nothing to preserve and nothing sensible to send.
25
+ *
26
+ * rollupBatchId deliberately carries NO foreign key. A CASCADE would delete
27
+ * items when their batch is pruned at thirty days while the items themselves are
28
+ * kept for seven, and a SET NULL would un-stamp already-sent items and re-send a
29
+ * month-old rollup. The column is a stamp, not a relation.
30
+ *
31
+ * sentAt is nullable with no default because NULL means "still pending", which
32
+ * is exactly true of every row that will ever exist. That is what removes the
33
+ * need for any data migration or backfill: both tables start empty, which is the
34
+ * correct state on every install, new or upgraded.
35
+ *
36
+ * eventType is character varying(500), not (100) like most short text in this
37
+ * schema. The stored NotificationSettingEventType values are English prose
38
+ * sentences - the longest today is 92 characters - and
39
+ * DatabaseService.checkMaxLengthOfFields throws on overflow, which on this code
40
+ * path would route every notification through the write path's fail-open catch.
41
+ */
42
+ export class AddUserNotificationEmailRollup1791000000000
43
+ implements MigrationInterface
44
+ {
45
+ public name: string = "AddUserNotificationEmailRollup1791000000000";
46
+
47
+ public async up(queryRunner: QueryRunner): Promise<void> {
48
+ await queryRunner.query(
49
+ `CREATE TABLE "UserNotificationEmailRollupItem" ("_id" uuid NOT NULL DEFAULT uuid_generate_v4(), "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), "updatedAt" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), "deletedAt" TIMESTAMP WITH TIME ZONE, "version" integer NOT NULL, "projectId" uuid NOT NULL, "userId" uuid NOT NULL, "toEmail" character varying(100) NOT NULL, "eventType" character varying(500) NOT NULL, "rollupCategory" character varying(100) NOT NULL, "subject" character varying(500) NOT NULL, "viewLink" text, "sentAt" TIMESTAMP WITH TIME ZONE, "rollupBatchId" uuid, CONSTRAINT "PK_7a4125bfac97ef5ab00115dda89" PRIMARY KEY ("_id"))`,
50
+ );
51
+ await queryRunner.query(
52
+ `CREATE INDEX "IDX_a801450828b245c04caa1903bb" ON "UserNotificationEmailRollupItem" ("projectId") `,
53
+ );
54
+ await queryRunner.query(
55
+ `CREATE INDEX "IDX_45ee190ea4724e6795ff3d0402" ON "UserNotificationEmailRollupItem" ("userId") `,
56
+ );
57
+ await queryRunner.query(
58
+ `CREATE INDEX "IDX_519a1a3aba8c1de67d63137e30" ON "UserNotificationEmailRollupItem" ("rollupBatchId") `,
59
+ );
60
+ await queryRunner.query(
61
+ `CREATE INDEX "IDX_103a2b3c5914ddfd4088942798" ON "UserNotificationEmailRollupItem" ("sentAt", "createdAt") `,
62
+ );
63
+ await queryRunner.query(
64
+ `CREATE INDEX "IDX_ed339bd9a070c8299e9ba0a4ad" ON "UserNotificationEmailRollupItem" ("projectId", "userId", "toEmail", "rollupCategory", "createdAt") `,
65
+ );
66
+ await queryRunner.query(
67
+ `CREATE TABLE "UserNotificationEmailRollupBatch" ("_id" uuid NOT NULL DEFAULT uuid_generate_v4(), "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), "updatedAt" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), "deletedAt" TIMESTAMP WITH TIME ZONE, "version" integer NOT NULL, "projectId" uuid NOT NULL, "userId" uuid NOT NULL, "toEmail" character varying(100) NOT NULL, "claimEpochStartsAt" TIMESTAMP WITH TIME ZONE NOT NULL, "claimedAt" TIMESTAMP WITH TIME ZONE NOT NULL, "sentAt" TIMESTAMP WITH TIME ZONE, "itemCount" integer, "status" character varying(100) NOT NULL, "statusMessage" character varying(500), CONSTRAINT "PK_b4fdcbba719e877a310525c134f" PRIMARY KEY ("_id"))`,
68
+ );
69
+ await queryRunner.query(
70
+ `CREATE INDEX "IDX_2ae4bc5b89abee188172985d93" ON "UserNotificationEmailRollupBatch" ("projectId") `,
71
+ );
72
+ await queryRunner.query(
73
+ `CREATE INDEX "IDX_c6d5acfdf3f3781427a5ff8349" ON "UserNotificationEmailRollupBatch" ("userId") `,
74
+ );
75
+ await queryRunner.query(
76
+ `CREATE UNIQUE INDEX "IDX_6f9067198db90df3e5e4c1d2a2" ON "UserNotificationEmailRollupBatch" ("projectId", "userId", "toEmail", "claimEpochStartsAt") `,
77
+ );
78
+ await queryRunner.query(
79
+ `ALTER TABLE "UserNotificationEmailRollupItem" ADD CONSTRAINT "FK_a801450828b245c04caa1903bb7" FOREIGN KEY ("projectId") REFERENCES "Project"("_id") ON DELETE CASCADE ON UPDATE NO ACTION`,
80
+ );
81
+ await queryRunner.query(
82
+ `ALTER TABLE "UserNotificationEmailRollupItem" ADD CONSTRAINT "FK_45ee190ea4724e6795ff3d04027" FOREIGN KEY ("userId") REFERENCES "User"("_id") ON DELETE CASCADE ON UPDATE NO ACTION`,
83
+ );
84
+ await queryRunner.query(
85
+ `ALTER TABLE "UserNotificationEmailRollupBatch" ADD CONSTRAINT "FK_2ae4bc5b89abee188172985d93a" FOREIGN KEY ("projectId") REFERENCES "Project"("_id") ON DELETE CASCADE ON UPDATE NO ACTION`,
86
+ );
87
+ await queryRunner.query(
88
+ `ALTER TABLE "UserNotificationEmailRollupBatch" ADD CONSTRAINT "FK_c6d5acfdf3f3781427a5ff83498" FOREIGN KEY ("userId") REFERENCES "User"("_id") ON DELETE CASCADE ON UPDATE NO ACTION`,
89
+ );
90
+ }
91
+
92
+ public async down(queryRunner: QueryRunner): Promise<void> {
93
+ await queryRunner.query(
94
+ `ALTER TABLE "UserNotificationEmailRollupBatch" DROP CONSTRAINT "FK_c6d5acfdf3f3781427a5ff83498"`,
95
+ );
96
+ await queryRunner.query(
97
+ `ALTER TABLE "UserNotificationEmailRollupBatch" DROP CONSTRAINT "FK_2ae4bc5b89abee188172985d93a"`,
98
+ );
99
+ await queryRunner.query(
100
+ `ALTER TABLE "UserNotificationEmailRollupItem" DROP CONSTRAINT "FK_45ee190ea4724e6795ff3d04027"`,
101
+ );
102
+ await queryRunner.query(
103
+ `ALTER TABLE "UserNotificationEmailRollupItem" DROP CONSTRAINT "FK_a801450828b245c04caa1903bb7"`,
104
+ );
105
+ await queryRunner.query(
106
+ `DROP INDEX "public"."IDX_6f9067198db90df3e5e4c1d2a2"`,
107
+ );
108
+ await queryRunner.query(
109
+ `DROP INDEX "public"."IDX_c6d5acfdf3f3781427a5ff8349"`,
110
+ );
111
+ await queryRunner.query(
112
+ `DROP INDEX "public"."IDX_2ae4bc5b89abee188172985d93"`,
113
+ );
114
+ await queryRunner.query(`DROP TABLE "UserNotificationEmailRollupBatch"`);
115
+ await queryRunner.query(
116
+ `DROP INDEX "public"."IDX_ed339bd9a070c8299e9ba0a4ad"`,
117
+ );
118
+ await queryRunner.query(
119
+ `DROP INDEX "public"."IDX_103a2b3c5914ddfd4088942798"`,
120
+ );
121
+ await queryRunner.query(
122
+ `DROP INDEX "public"."IDX_519a1a3aba8c1de67d63137e30"`,
123
+ );
124
+ await queryRunner.query(
125
+ `DROP INDEX "public"."IDX_45ee190ea4724e6795ff3d0402"`,
126
+ );
127
+ await queryRunner.query(
128
+ `DROP INDEX "public"."IDX_a801450828b245c04caa1903bb"`,
129
+ );
130
+ await queryRunner.query(`DROP TABLE "UserNotificationEmailRollupItem"`);
131
+ }
132
+ }
@@ -0,0 +1,79 @@
1
+ import { MigrationInterface, QueryRunner } from "typeorm";
2
+
3
+ /*
4
+ * The per-user escape hatch from owner email burst rollup: one row per
5
+ * (user, project) saying whether that person's notification emails may be
6
+ * coalesced during a burst.
7
+ *
8
+ * Two decisions here that a regeneration would silently reverse.
9
+ *
10
+ * isEnabled is NOT NULL DEFAULT TRUE, and the table starts empty. Rollup is on
11
+ * by default and there is no backfill, so almost nobody will ever have a row;
12
+ * the read path treats an absent row and isEnabled = true identically, which
13
+ * is what lets this ship without writing a row for a single existing member.
14
+ * Flip the default to false and every project member silently opts out of a
15
+ * feature they were never asked about.
16
+ *
17
+ * Both foreign keys are ON DELETE CASCADE. A preference about a deleted
18
+ * project, held by a deleted user, has nothing left to express - and the
19
+ * tenant column is NOT NULL, so SET NULL could not be satisfied anyway.
20
+ *
21
+ * There is deliberately no UNIQUE index on (projectId, userId), even though
22
+ * the service treats the pair as unique. The dashboard creates the row lazily
23
+ * on the first toggle and the service's check-then-create narrows the race;
24
+ * adding the constraint would be a correctness improvement but it would turn
25
+ * the losing side of that race from a harmless duplicate into a 500 on a
26
+ * settings page, and both rows say the same thing in every flow the UI can
27
+ * produce. Worth revisiting if the row ever carries more than one field.
28
+ */
29
+ export class AddUserNotificationEmailRollupSetting1791100000000
30
+ implements MigrationInterface
31
+ {
32
+ public name: string = "AddUserNotificationEmailRollupSetting1791100000000";
33
+
34
+ public async up(queryRunner: QueryRunner): Promise<void> {
35
+ await queryRunner.query(
36
+ `CREATE TABLE "UserNotificationEmailRollupSetting" ("_id" uuid NOT NULL DEFAULT uuid_generate_v4(), "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), "updatedAt" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), "deletedAt" TIMESTAMP WITH TIME ZONE, "version" integer NOT NULL, "projectId" uuid NOT NULL, "userId" uuid NOT NULL, "isEnabled" boolean NOT NULL DEFAULT true, "createdByUserId" uuid, "deletedByUserId" uuid, CONSTRAINT "PK_2d06015d532e73decda61f6c729" PRIMARY KEY ("_id"))`,
37
+ );
38
+ await queryRunner.query(
39
+ `CREATE INDEX "IDX_fc43fd93f6c9b84517ec70a756" ON "UserNotificationEmailRollupSetting" ("projectId") `,
40
+ );
41
+ await queryRunner.query(
42
+ `CREATE INDEX "IDX_0eb2b532417a885a83ef3a246c" ON "UserNotificationEmailRollupSetting" ("userId") `,
43
+ );
44
+ await queryRunner.query(
45
+ `ALTER TABLE "UserNotificationEmailRollupSetting" ADD CONSTRAINT "FK_fc43fd93f6c9b84517ec70a756e" FOREIGN KEY ("projectId") REFERENCES "Project"("_id") ON DELETE CASCADE ON UPDATE NO ACTION`,
46
+ );
47
+ await queryRunner.query(
48
+ `ALTER TABLE "UserNotificationEmailRollupSetting" ADD CONSTRAINT "FK_0eb2b532417a885a83ef3a246cf" FOREIGN KEY ("userId") REFERENCES "User"("_id") ON DELETE CASCADE ON UPDATE NO ACTION`,
49
+ );
50
+ await queryRunner.query(
51
+ `ALTER TABLE "UserNotificationEmailRollupSetting" ADD CONSTRAINT "FK_b3e85e262ece458665f3b67ec9c" FOREIGN KEY ("createdByUserId") REFERENCES "User"("_id") ON DELETE SET NULL ON UPDATE NO ACTION`,
52
+ );
53
+ await queryRunner.query(
54
+ `ALTER TABLE "UserNotificationEmailRollupSetting" ADD CONSTRAINT "FK_4f8b04650019cb0b9e4cee5f561" FOREIGN KEY ("deletedByUserId") REFERENCES "User"("_id") ON DELETE SET NULL ON UPDATE NO ACTION`,
55
+ );
56
+ }
57
+
58
+ public async down(queryRunner: QueryRunner): Promise<void> {
59
+ await queryRunner.query(
60
+ `ALTER TABLE "UserNotificationEmailRollupSetting" DROP CONSTRAINT "FK_4f8b04650019cb0b9e4cee5f561"`,
61
+ );
62
+ await queryRunner.query(
63
+ `ALTER TABLE "UserNotificationEmailRollupSetting" DROP CONSTRAINT "FK_b3e85e262ece458665f3b67ec9c"`,
64
+ );
65
+ await queryRunner.query(
66
+ `ALTER TABLE "UserNotificationEmailRollupSetting" DROP CONSTRAINT "FK_0eb2b532417a885a83ef3a246cf"`,
67
+ );
68
+ await queryRunner.query(
69
+ `ALTER TABLE "UserNotificationEmailRollupSetting" DROP CONSTRAINT "FK_fc43fd93f6c9b84517ec70a756e"`,
70
+ );
71
+ await queryRunner.query(
72
+ `DROP INDEX "public"."IDX_0eb2b532417a885a83ef3a246c"`,
73
+ );
74
+ await queryRunner.query(
75
+ `DROP INDEX "public"."IDX_fc43fd93f6c9b84517ec70a756"`,
76
+ );
77
+ await queryRunner.query(`DROP TABLE "UserNotificationEmailRollupSetting"`);
78
+ }
79
+ }