@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
@@ -9,6 +9,7 @@ import DataSourceHttpFetch, {
9
9
  DataSourceHttpRequest,
10
10
  DataSourceHttpResponse,
11
11
  } from "../../../../Server/Utils/DataSource/HttpFetch";
12
+ import OutboundUserAgent from "../../../../Server/Utils/OutboundUserAgent";
12
13
  import { DataSourceConnectionSettings } from "../../../../Server/Utils/DataSource/Types";
13
14
  import {
14
15
  DATA_SOURCE_MAX_RESPONSE_SIZE_IN_BYTES,
@@ -367,14 +368,17 @@ describe("DataSourceHttpFetch.fetch - egress guard runs before axios", () => {
367
368
  });
368
369
 
369
370
  describe("DataSourceHttpFetch.fetch - headers and body encoding", () => {
370
- test("passes request headers through to axios untouched", async () => {
371
+ test("passes request headers through to axios untouched, plus our User-Agent", async () => {
371
372
  const headers: Dictionary<string> = {
372
373
  "X-Api-Key": "secret-key",
373
374
  Authorization: "Bearer token-123",
374
375
  };
375
376
  await DataSourceHttpFetch.fetch(makeRequest({ headers: headers }));
376
377
  const config: AxiosRequestConfig = getAxiosConfig();
377
- expect(config.headers).toEqual(headers);
378
+ expect(config.headers).toEqual({
379
+ ...headers,
380
+ "User-Agent": OutboundUserAgent.get(),
381
+ });
378
382
  });
379
383
 
380
384
  test("GET requests never send a body, even when one is provided", async () => {
@@ -439,6 +443,96 @@ describe("DataSourceHttpFetch.fetch - headers and body encoding", () => {
439
443
  });
440
444
  });
441
445
 
446
+ /*
447
+ * Regression cover for issue #3555: a bare `axios/<version>` User-Agent got
448
+ * every outbound request 403'd by the target's WAF before it reached the
449
+ * API. The transport now names the product on every request unless the
450
+ * caller deliberately set its own UA.
451
+ */
452
+ describe("DataSourceHttpFetch.fetch - outbound User-Agent", () => {
453
+ function getSentHeaders(callIndex: number = 0): Dictionary<string> {
454
+ return getAxiosConfig(callIndex).headers as Dictionary<string>;
455
+ }
456
+
457
+ test("sends a descriptive User-Agent when the caller set none", async () => {
458
+ await DataSourceHttpFetch.fetch(makeRequest());
459
+ expect(getSentHeaders()["User-Agent"]).toBe(OutboundUserAgent.get());
460
+ });
461
+
462
+ test("the User-Agent names OneUptime and is never axios' default", async () => {
463
+ await DataSourceHttpFetch.fetch(makeRequest());
464
+ const userAgent: string = getSentHeaders()["User-Agent"] as string;
465
+
466
+ expect(userAgent.startsWith("OneUptime")).toBe(true);
467
+ expect(userAgent).toContain("https://oneuptime.com");
468
+ expect(userAgent.toLowerCase()).not.toContain("axios");
469
+ });
470
+
471
+ test("axios is never left to pick the User-Agent itself — the header is always set", async () => {
472
+ await DataSourceHttpFetch.fetch(makeRequest({ headers: {} }));
473
+ await DataSourceHttpFetch.fetch(
474
+ makeRequest({ method: "POST", body: { q: "up" } }),
475
+ );
476
+
477
+ for (const callIndex of [0, 1]) {
478
+ const userAgent: string | undefined =
479
+ getSentHeaders(callIndex)["User-Agent"];
480
+ expect(typeof userAgent).toBe("string");
481
+ expect((userAgent as string).trim()).not.toBe("");
482
+ }
483
+ });
484
+
485
+ test("a caller's explicit User-Agent wins — a data source may demand its own", async () => {
486
+ await DataSourceHttpFetch.fetch(
487
+ makeRequest({
488
+ headers: { "User-Agent": "AcmeSOC/3.1 (soc@acme.example)" },
489
+ }),
490
+ );
491
+ expect(getSentHeaders()["User-Agent"]).toBe(
492
+ "AcmeSOC/3.1 (soc@acme.example)",
493
+ );
494
+ });
495
+
496
+ test("a caller's lowercase user-agent wins without a second casing being sent", async () => {
497
+ await DataSourceHttpFetch.fetch(
498
+ makeRequest({ headers: { "user-agent": "AcmeSOC/3.1" } }),
499
+ );
500
+ const headers: Dictionary<string> = getSentHeaders();
501
+
502
+ expect(headers["user-agent"]).toBe("AcmeSOC/3.1");
503
+ expect(headers["User-Agent"]).toBeUndefined();
504
+ });
505
+
506
+ test("a blank User-Agent is replaced rather than sent as-is", async () => {
507
+ await DataSourceHttpFetch.fetch(
508
+ makeRequest({ headers: { "User-Agent": " " } }),
509
+ );
510
+ expect(getSentHeaders()["User-Agent"]).toBe(OutboundUserAgent.get());
511
+ });
512
+
513
+ test("it rides alongside auth headers rather than displacing them", async () => {
514
+ const headers: Dictionary<string> = DataSourceHttpFetch.buildAuthHeaders({
515
+ dataSourceType: DataSourceType.RestApi,
516
+ url: "https://api.example.com",
517
+ apiToken: "tok-abc",
518
+ });
519
+
520
+ await DataSourceHttpFetch.fetch(makeRequest({ headers: headers }));
521
+ const sent: Dictionary<string> = getSentHeaders();
522
+
523
+ expect(sent["Authorization"]).toBe("Bearer tok-abc");
524
+ expect(sent["User-Agent"]).toBe(OutboundUserAgent.get());
525
+ });
526
+
527
+ test("the caller's header dictionary is not mutated — pagination reuses it", async () => {
528
+ const headers: Dictionary<string> = { Accept: "application/json" };
529
+
530
+ await DataSourceHttpFetch.fetch(makeRequest({ headers: headers }));
531
+
532
+ expect(headers).toEqual({ Accept: "application/json" });
533
+ });
534
+ });
535
+
442
536
  describe("DataSourceHttpFetch.buildAuthHeaders", () => {
443
537
  function makeSettings(
444
538
  overrides?: Partial<DataSourceConnectionSettings>,
@@ -0,0 +1,466 @@
1
+ import {
2
+ MigrationFailureType,
3
+ recordMigrationFailure,
4
+ scrubMigrationErrorText,
5
+ } from "../../../../Server/Utils/Database/MigrationFailureLog";
6
+ import { DataSource } from "typeorm";
7
+ import { describe, expect, it } from "@jest/globals";
8
+
9
+ /*
10
+ * The migration-failure diagnostic log.
11
+ *
12
+ * This module exists so the admin health page can say WHY a migration is
13
+ * pending rather than only that it is behind, which means the free-form text of
14
+ * a database error gets persisted and then rendered back to an operator. Two
15
+ * properties carry the weight, and neither one announces itself when it breaks:
16
+ *
17
+ * 1. The text is scrubbed first. Connection errors echo the DSN they failed
18
+ * to dial - `postgres://oneuptime:<password>@host/db` - and a failing DDL
19
+ * quotes its literal defaults, so an unscrubbed error message parks the
20
+ * database password in a table and puts it on a web page. A regex that
21
+ * stops matching still produces a row, still renders, and reads exactly
22
+ * like a working one.
23
+ *
24
+ * 2. Nothing here ever throws. Every write is best-effort by design: it runs
25
+ * on the failure path of a boot or migrate Job, where the caller is
26
+ * already holding a real error. A diagnostic that escalated would mask the
27
+ * failure it was written to explain - and on a first rollout the
28
+ * "MigrationFailure" table does not exist yet, so the INSERT genuinely
29
+ * does fail on the run that most needs the original error to survive.
30
+ *
31
+ * The row is written with raw SQL against a caller-supplied DataSource, which
32
+ * is what lets the assertions below drive it with a stub instead of a database.
33
+ */
34
+
35
+ // Mirrors the module's own bounds; a row must not be able to bloat the table.
36
+ const MAX_ERROR_MESSAGE_LENGTH: number = 10000;
37
+ const MAX_ERROR_STACK_LENGTH: number = 20000;
38
+
39
+ interface RecordedQuery {
40
+ sql: string;
41
+ parameters: Array<unknown>;
42
+ }
43
+
44
+ /*
45
+ * A DataSource stand-in that records what would have been executed. Only
46
+ * `query` is reached by the code under test, so the cast is narrow and the stub
47
+ * cannot silently absorb a call to some other member.
48
+ */
49
+ function stubDataSource(recorded: Array<RecordedQuery>): DataSource {
50
+ return {
51
+ query: (sql: string, parameters: Array<unknown>): Promise<void> => {
52
+ recorded.push({ sql, parameters });
53
+ return Promise.resolve();
54
+ },
55
+ } as unknown as DataSource;
56
+ }
57
+
58
+ function throwingDataSource(error: Error): DataSource {
59
+ return {
60
+ query: (): Promise<void> => {
61
+ return Promise.reject(error);
62
+ },
63
+ } as unknown as DataSource;
64
+ }
65
+
66
+ // Positional parameters of the INSERT, in the order the statement binds them.
67
+ const MESSAGE_PARAMETER: number = 2;
68
+ const STACK_PARAMETER: number = 3;
69
+
70
+ describe("scrubMigrationErrorText", () => {
71
+ describe("connection strings", () => {
72
+ it("masks the password in a DSN the error echoed back", () => {
73
+ expect(
74
+ scrubMigrationErrorText(
75
+ 'could not connect to postgres://oneuptime:sup3r-s3cret@db:5432/oneuptime"',
76
+ ),
77
+ ).toBe(
78
+ 'could not connect to postgres://oneuptime:***REDACTED***@db:5432/oneuptime"',
79
+ );
80
+ });
81
+
82
+ it("keeps the scheme and the username, which are what identify the failure", () => {
83
+ /*
84
+ * Redacting the whole DSN would be safe and useless: an operator reading
85
+ * the health page needs to know which host and which role could not
86
+ * connect. Only the password is a credential.
87
+ */
88
+ const scrubbed: string = scrubMigrationErrorText(
89
+ "postgres://readonly:hunter2@primary.internal:5432/app",
90
+ );
91
+
92
+ expect(scrubbed).toContain("postgres://readonly:");
93
+ expect(scrubbed).toContain("@primary.internal:5432/app");
94
+ expect(scrubbed).not.toContain("hunter2");
95
+ });
96
+
97
+ it("masks every DSN in a message that names more than one", () => {
98
+ const scrubbed: string = scrubMigrationErrorText(
99
+ "failed over from postgres://a:first@one/db to postgres://b:second@two/db",
100
+ );
101
+
102
+ expect(scrubbed).not.toContain("first");
103
+ expect(scrubbed).not.toContain("second");
104
+ expect(scrubbed.match(/\*\*\*REDACTED\*\*\*/g)).toHaveLength(2);
105
+ });
106
+
107
+ it("masks schemes other than postgres", () => {
108
+ // The same error text can carry a redis or amqp URL from a side effect.
109
+ for (const scheme of ["redis", "amqp", "mongodb+srv", "clickhouse"]) {
110
+ expect(
111
+ scrubMigrationErrorText(`${scheme}://user:leaked@host:1234/x`),
112
+ ).not.toContain("leaked");
113
+ }
114
+ });
115
+
116
+ it("leaves a URL that carries no credentials untouched", () => {
117
+ const harmless: string = "see https://oneuptime.com/docs/migrations";
118
+ expect(scrubMigrationErrorText(harmless)).toBe(harmless);
119
+ });
120
+ });
121
+
122
+ describe("keyword-introduced secrets", () => {
123
+ it.each([
124
+ ["password", "password=letmein"],
125
+ ["secret", "secret=letmein"],
126
+ ["token", "token=letmein"],
127
+ ["api_key", "api_key=letmein"],
128
+ ["api-key", "api-key=letmein"],
129
+ ["apikey", "apikey=letmein"],
130
+ ["credential", "credential=letmein"],
131
+ ["private_key", "private_key=letmein"],
132
+ ["auth_token", "auth_token=letmein"],
133
+ ["access_key", "access_key=letmein"],
134
+ ])("masks a value introduced by %s", (_label: string, text: string) => {
135
+ const scrubbed: string = scrubMigrationErrorText(text);
136
+
137
+ expect(scrubbed).not.toContain("letmein");
138
+ expect(scrubbed).toContain("***REDACTED***");
139
+ });
140
+
141
+ it("matches the keyword whatever its case", () => {
142
+ expect(scrubMigrationErrorText("PASSWORD=letmein")).not.toContain(
143
+ "letmein",
144
+ );
145
+ expect(scrubMigrationErrorText("Api_Key: letmein")).not.toContain(
146
+ "letmein",
147
+ );
148
+ });
149
+
150
+ it("masks a single-quoted literal, as a failing DDL default would quote it", () => {
151
+ const scrubbed: string = scrubMigrationErrorText(
152
+ `ALTER TABLE "User" ADD "x" text DEFAULT password='p@ss word'`,
153
+ );
154
+
155
+ expect(scrubbed).not.toContain("p@ss word");
156
+ expect(scrubbed).toContain("***REDACTED***");
157
+ });
158
+
159
+ it("masks a double-quoted literal", () => {
160
+ expect(scrubMigrationErrorText('token: "abc def"')).not.toContain(
161
+ "abc def",
162
+ );
163
+ });
164
+
165
+ it("keeps the keyword and separator so the message still reads", () => {
166
+ expect(scrubMigrationErrorText("password: letmein")).toBe(
167
+ "password: ***REDACTED***",
168
+ );
169
+ expect(scrubMigrationErrorText("password=letmein")).toBe(
170
+ "password=***REDACTED***",
171
+ );
172
+ });
173
+
174
+ it("stops at the delimiter rather than swallowing the rest of the message", () => {
175
+ /*
176
+ * The tail of a migration error is the part an operator acts on. A
177
+ * greedy match would redact the failure itself along with the secret.
178
+ */
179
+ const scrubbed: string = scrubMigrationErrorText(
180
+ "connect failed (password=letmein, host=db) while running migration",
181
+ );
182
+
183
+ expect(scrubbed).not.toContain("letmein");
184
+ expect(scrubbed).toContain("host=db");
185
+ expect(scrubbed).toContain("while running migration");
186
+ });
187
+ });
188
+
189
+ describe("as a whole", () => {
190
+ it("scrubs a DSN and a keyword secret in the same message", () => {
191
+ const scrubbed: string = scrubMigrationErrorText(
192
+ "postgres://app:dsnpass@db/x rejected password=kwpass",
193
+ );
194
+
195
+ expect(scrubbed).not.toContain("dsnpass");
196
+ expect(scrubbed).not.toContain("kwpass");
197
+ });
198
+
199
+ it("is idempotent, so text scrubbed twice is unchanged the second time", () => {
200
+ /*
201
+ * The message is scrubbed on the way into the row; anything that scrubs
202
+ * again on the way out must not mangle the redaction marker.
203
+ */
204
+ const once: string = scrubMigrationErrorText(
205
+ "postgres://app:p@db/x and password=q",
206
+ );
207
+
208
+ expect(scrubMigrationErrorText(once)).toBe(once);
209
+ });
210
+
211
+ it("returns an empty string unchanged rather than throwing", () => {
212
+ expect(scrubMigrationErrorText("")).toBe("");
213
+ });
214
+
215
+ it("leaves ordinary migration errors completely alone", () => {
216
+ const ordinary: string =
217
+ 'relation "Monitor" already exists — column "name" of relation "User" does not exist';
218
+
219
+ expect(scrubMigrationErrorText(ordinary)).toBe(ordinary);
220
+ });
221
+ });
222
+ });
223
+
224
+ describe("recordMigrationFailure", () => {
225
+ it("writes one row and reports that it did", async () => {
226
+ const recorded: Array<RecordedQuery> = [];
227
+
228
+ const wrote: boolean = await recordMigrationFailure(
229
+ stubDataSource(recorded),
230
+ {
231
+ migrationName: "AddMonitorTable1790900000000",
232
+ migrationType: MigrationFailureType.PostgresSchema,
233
+ error: new Error("relation already exists"),
234
+ },
235
+ );
236
+
237
+ expect(wrote).toBe(true);
238
+ expect(recorded).toHaveLength(1);
239
+ expect(recorded[0]!.sql).toContain('INSERT INTO "MigrationFailure"');
240
+ expect(recorded[0]!.parameters[0]).toBe("AddMonitorTable1790900000000");
241
+ expect(recorded[0]!.parameters[1]).toBe(
242
+ MigrationFailureType.PostgresSchema,
243
+ );
244
+ expect(recorded[0]!.parameters[MESSAGE_PARAMETER]).toBe(
245
+ "relation already exists",
246
+ );
247
+ });
248
+
249
+ it("records the runner the migration belongs to", async () => {
250
+ const recorded: Array<RecordedQuery> = [];
251
+
252
+ await recordMigrationFailure(stubDataSource(recorded), {
253
+ migrationName: "BackfillMonitorStatus",
254
+ migrationType: MigrationFailureType.DataMigration,
255
+ error: new Error("boom"),
256
+ });
257
+
258
+ expect(recorded[0]!.parameters[1]).toBe(MigrationFailureType.DataMigration);
259
+ });
260
+
261
+ it("scrubs the credential out of the message before it is stored", async () => {
262
+ /*
263
+ * The row is read back by the admin health page, so an unscrubbed message
264
+ * is a password on a web page as well as one in a table.
265
+ */
266
+ const recorded: Array<RecordedQuery> = [];
267
+
268
+ await recordMigrationFailure(stubDataSource(recorded), {
269
+ migrationName: "AddMonitorTable1790900000000",
270
+ migrationType: MigrationFailureType.PostgresSchema,
271
+ error: new Error(
272
+ "connect ECONNREFUSED postgres://oneuptime:sup3r-s3cret@db:5432/oneuptime",
273
+ ),
274
+ });
275
+
276
+ const message: string = recorded[0]!.parameters[
277
+ MESSAGE_PARAMETER
278
+ ] as string;
279
+
280
+ expect(message).not.toContain("sup3r-s3cret");
281
+ expect(message).toContain("***REDACTED***");
282
+ });
283
+
284
+ it("scrubs the stack too, not only the message", async () => {
285
+ const recorded: Array<RecordedQuery> = [];
286
+
287
+ const error: Error = new Error("connect failed");
288
+ error.stack =
289
+ "Error: connect failed\n at dial (postgres://u:stackpw@db/x)";
290
+
291
+ await recordMigrationFailure(stubDataSource(recorded), {
292
+ migrationName: "AddMonitorTable1790900000000",
293
+ migrationType: MigrationFailureType.PostgresSchema,
294
+ error,
295
+ });
296
+
297
+ const stack: string = recorded[0]!.parameters[STACK_PARAMETER] as string;
298
+
299
+ expect(stack).not.toContain("stackpw");
300
+ expect(stack).toContain("***REDACTED***");
301
+ });
302
+
303
+ it("stores a null stack when the error carries none", async () => {
304
+ const recorded: Array<RecordedQuery> = [];
305
+
306
+ await recordMigrationFailure(stubDataSource(recorded), {
307
+ migrationName: "AddMonitorTable1790900000000",
308
+ migrationType: MigrationFailureType.PostgresSchema,
309
+ // Not an Error, so there is no stack to take.
310
+ error: "a bare string rejection",
311
+ });
312
+
313
+ expect(recorded[0]!.parameters[STACK_PARAMETER]).toBeNull();
314
+ });
315
+
316
+ it("stringifies a rejection that is not an Error", async () => {
317
+ const recorded: Array<RecordedQuery> = [];
318
+
319
+ await recordMigrationFailure(stubDataSource(recorded), {
320
+ migrationName: "AddMonitorTable1790900000000",
321
+ migrationType: MigrationFailureType.PostgresSchema,
322
+ error: "a bare string rejection",
323
+ });
324
+
325
+ expect(recorded[0]!.parameters[MESSAGE_PARAMETER]).toBe(
326
+ "a bare string rejection",
327
+ );
328
+ });
329
+
330
+ it("falls back to the error name when the message is empty", async () => {
331
+ /*
332
+ * An empty message would render as a blank explanation on the health page,
333
+ * which reads as "no error" rather than "an error we cannot describe".
334
+ */
335
+ const recorded: Array<RecordedQuery> = [];
336
+
337
+ const error: Error = new Error("");
338
+ error.name = "QueryFailedError";
339
+
340
+ await recordMigrationFailure(stubDataSource(recorded), {
341
+ migrationName: "AddMonitorTable1790900000000",
342
+ migrationType: MigrationFailureType.PostgresSchema,
343
+ error,
344
+ });
345
+
346
+ expect(recorded[0]!.parameters[MESSAGE_PARAMETER]).toBe("QueryFailedError");
347
+ });
348
+
349
+ it("bounds the message so a pathological error cannot bloat the table", async () => {
350
+ const recorded: Array<RecordedQuery> = [];
351
+
352
+ await recordMigrationFailure(stubDataSource(recorded), {
353
+ migrationName: "AddMonitorTable1790900000000",
354
+ migrationType: MigrationFailureType.PostgresSchema,
355
+ error: new Error("x".repeat(MAX_ERROR_MESSAGE_LENGTH + 5000)),
356
+ });
357
+
358
+ expect((recorded[0]!.parameters[MESSAGE_PARAMETER] as string).length).toBe(
359
+ MAX_ERROR_MESSAGE_LENGTH,
360
+ );
361
+ });
362
+
363
+ it("bounds the stack as well", async () => {
364
+ const recorded: Array<RecordedQuery> = [];
365
+
366
+ const error: Error = new Error("boom");
367
+ error.stack = "y".repeat(MAX_ERROR_STACK_LENGTH + 5000);
368
+
369
+ await recordMigrationFailure(stubDataSource(recorded), {
370
+ migrationName: "AddMonitorTable1790900000000",
371
+ migrationType: MigrationFailureType.PostgresSchema,
372
+ error,
373
+ });
374
+
375
+ expect((recorded[0]!.parameters[STACK_PARAMETER] as string).length).toBe(
376
+ MAX_ERROR_STACK_LENGTH,
377
+ );
378
+ });
379
+
380
+ it("stamps the row with a version so an INSERT never relies on a column default", async () => {
381
+ const recorded: Array<RecordedQuery> = [];
382
+
383
+ await recordMigrationFailure(stubDataSource(recorded), {
384
+ migrationName: "AddMonitorTable1790900000000",
385
+ migrationType: MigrationFailureType.PostgresSchema,
386
+ error: new Error("boom"),
387
+ });
388
+
389
+ expect(recorded[0]!.sql).toContain('"attemptedAt"');
390
+ expect(recorded[0]!.sql).toContain('"hostName"');
391
+ expect(recorded[0]!.sql).toContain('"appVersion"');
392
+ // attemptedAt is bound, not defaulted, so the row is honest about when.
393
+ expect(recorded[0]!.parameters[4]).toBeInstanceOf(Date);
394
+ });
395
+
396
+ describe("when the write itself fails", () => {
397
+ /*
398
+ * The case this module was written for. On a first rollout the
399
+ * "MigrationFailure" table does not exist yet, so the very run that most
400
+ * needs the original migration error to survive is the run where this
401
+ * INSERT throws.
402
+ */
403
+ it("swallows the error rather than masking the migration failure", async () => {
404
+ const failure: Promise<boolean> = recordMigrationFailure(
405
+ throwingDataSource(
406
+ new Error('relation "MigrationFailure" does not exist'),
407
+ ),
408
+ {
409
+ migrationName: "AddMonitorTable1790900000000",
410
+ migrationType: MigrationFailureType.PostgresSchema,
411
+ error: new Error("the real migration error"),
412
+ },
413
+ );
414
+
415
+ await expect(failure).resolves.toBe(false);
416
+ });
417
+
418
+ it("reports false rather than a silent success", async () => {
419
+ /*
420
+ * The return value is how a caller can tell the diagnostic landed. A
421
+ * swallowed error that still returned true would make a lost row
422
+ * indistinguishable from a written one.
423
+ */
424
+ const wrote: boolean = await recordMigrationFailure(
425
+ throwingDataSource(new Error("connection terminated")),
426
+ {
427
+ migrationName: "AddMonitorTable1790900000000",
428
+ migrationType: MigrationFailureType.PostgresSchema,
429
+ error: new Error("the real migration error"),
430
+ },
431
+ );
432
+
433
+ expect(wrote).toBe(false);
434
+ });
435
+
436
+ it("does not throw even when building the row would", async () => {
437
+ // A rejection whose String() throws — the ugliest input available.
438
+ const hostile: unknown = {
439
+ toString: (): string => {
440
+ throw new Error("cannot stringify");
441
+ },
442
+ };
443
+
444
+ const recorded: Array<RecordedQuery> = [];
445
+
446
+ await expect(
447
+ recordMigrationFailure(stubDataSource(recorded), {
448
+ migrationName: "AddMonitorTable1790900000000",
449
+ migrationType: MigrationFailureType.PostgresSchema,
450
+ error: hostile,
451
+ }),
452
+ ).resolves.toBe(false);
453
+ });
454
+ });
455
+ });
456
+
457
+ describe("MigrationFailureType", () => {
458
+ it("stores each runner verbatim, since the value is persisted", () => {
459
+ /*
460
+ * These strings live in rows that outlive any deployment. Renaming one
461
+ * orphans every row already written under the old value.
462
+ */
463
+ expect(MigrationFailureType.PostgresSchema).toBe("PostgresSchema");
464
+ expect(MigrationFailureType.DataMigration).toBe("DataMigration");
465
+ });
466
+ });