@oneuptime/common 12.0.32 → 12.0.33

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (597) hide show
  1. package/Models/AnalyticsModels/Span.ts +14 -0
  2. package/Models/DatabaseModels/EnterpriseLicense.ts +56 -0
  3. package/Models/DatabaseModels/Index.ts +10 -0
  4. package/Models/DatabaseModels/Monitor.ts +76 -0
  5. package/Models/DatabaseModels/NetworkAlertPolicy.ts +690 -0
  6. package/Models/DatabaseModels/NetworkDevice.ts +176 -1
  7. package/Models/DatabaseModels/NetworkSite.ts +201 -2
  8. package/Models/DatabaseModels/NetworkSiteType.ts +102 -3
  9. package/Models/DatabaseModels/NetworkSnmpCredentialProfile.ts +841 -0
  10. package/Models/DatabaseModels/TelemetryException.ts +119 -0
  11. package/Models/DatabaseModels/UserNotificationEmailRollupBatch.ts +334 -0
  12. package/Models/DatabaseModels/UserNotificationEmailRollupItem.ts +370 -0
  13. package/Models/DatabaseModels/UserNotificationEmailRollupSetting.ts +282 -0
  14. package/Server/API/EnterpriseLicenseAPI.ts +391 -64
  15. package/Server/API/LlmProviderAPI.ts +137 -22
  16. package/Server/EnvironmentConfig.ts +14 -0
  17. package/Server/Infrastructure/Postgres/SchemaMigrations/1790700000000-AddNetworkSiteTypeParentHierarchy.ts +55 -0
  18. package/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddEnterpriseLicenseUsageProvenance.ts +31 -0
  19. package/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddTelemetryExceptionErrorClass.ts +124 -0
  20. package/Server/Infrastructure/Postgres/SchemaMigrations/1791000000000-AddUserNotificationEmailRollup.ts +132 -0
  21. package/Server/Infrastructure/Postgres/SchemaMigrations/1791100000000-AddUserNotificationEmailRollupSetting.ts +79 -0
  22. package/Server/Infrastructure/Postgres/SchemaMigrations/1791200000000-AddNetworkSnmpCredentialProfilesAndAlertPolicies.ts +191 -0
  23. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +12 -0
  24. package/Server/Infrastructure/QueueWorker.ts +38 -8
  25. package/Server/Middleware/BearerTokenAuthorization.ts +12 -0
  26. package/Server/Middleware/ProjectAuthorization.ts +11 -0
  27. package/Server/Middleware/SCIMAuthorization.ts +12 -0
  28. package/Server/Middleware/TelemetryIngest.ts +11 -0
  29. package/Server/Services/AIBillingService.ts +101 -27
  30. package/Server/Services/EnterpriseLicenseInstanceService.ts +197 -0
  31. package/Server/Services/EnterpriseLicenseService.ts +55 -0
  32. package/Server/Services/Index.ts +10 -0
  33. package/Server/Services/MonitorService.ts +143 -21
  34. package/Server/Services/MonitorStatusTimelineService.ts +150 -8
  35. package/Server/Services/MonitorTemplateService.ts +217 -1
  36. package/Server/Services/NetworkAlertPolicyEngineService.ts +2159 -0
  37. package/Server/Services/NetworkAlertPolicyService.ts +944 -0
  38. package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +9 -10
  39. package/Server/Services/NetworkDeviceAutoImportRuleService.ts +60 -15
  40. package/Server/Services/NetworkDeviceService.ts +1032 -73
  41. package/Server/Services/NetworkSiteService.ts +1502 -129
  42. package/Server/Services/NetworkSiteTypeService.ts +1216 -0
  43. package/Server/Services/NetworkSnmpCredentialProfileService.ts +238 -0
  44. package/Server/Services/NotificationService.ts +118 -28
  45. package/Server/Services/ProjectService.ts +105 -48
  46. package/Server/Services/StatusPagePrivateUserService.ts +103 -3
  47. package/Server/Services/UserNotificationEmailRollupBatchService.ts +78 -0
  48. package/Server/Services/UserNotificationEmailRollupItemService.ts +79 -0
  49. package/Server/Services/UserNotificationEmailRollupSettingService.ts +113 -0
  50. package/Server/Services/UserNotificationSettingService.ts +62 -25
  51. package/Server/Services/UserService.ts +95 -0
  52. package/Server/Types/Database/QueryHelper.ts +2 -2
  53. package/Server/Utils/AI/Chat/ObservabilityChatPrompt.ts +14 -3
  54. package/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.ts +10 -0
  55. package/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.ts +10 -0
  56. package/Server/Utils/AI/SRE/Insights/InsightTriageRunner.ts +62 -1
  57. package/Server/Utils/AI/Toolbox/AlertTools.ts +15 -1
  58. package/Server/Utils/Billing/BillingFailureNoticeThrottle.ts +80 -0
  59. package/Server/Utils/DataSource/HttpFetch.ts +9 -2
  60. package/Server/Utils/EmailRollup/EmailRollupConstants.ts +98 -0
  61. package/Server/Utils/EmailRollup/EmailRollupFlushRunner.ts +872 -0
  62. package/Server/Utils/EmailRollup/EmailRollupRenderer.ts +781 -0
  63. package/Server/Utils/EmailRollup/EmailRollupWriter.ts +368 -0
  64. package/Server/Utils/LLM/LLMService.ts +78 -0
  65. package/Server/Utils/LogRedaction.ts +8 -0
  66. package/Server/Utils/Logger.ts +79 -1
  67. package/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.ts +190 -0
  68. package/Server/Utils/Monitor/Criteria/EvaluateOverTime.ts +9 -2
  69. package/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.ts +61 -1
  70. package/Server/Utils/Monitor/MonitorCriteriaDataExtractor.ts +14 -0
  71. package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +49 -0
  72. package/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.ts +255 -4
  73. package/Server/Utils/Monitor/MonitorMetricUtil.ts +41 -0
  74. package/Server/Utils/Monitor/MonitorTemplateUtil.ts +43 -0
  75. package/Server/Utils/Monitor/NetworkDeviceHydrationUtil.ts +499 -19
  76. package/Server/Utils/Monitor/NetworkDeviceMetricUtil.ts +66 -10
  77. package/Server/Utils/Monitor/NetworkDeviceWalkUtil.ts +238 -44
  78. package/Server/Utils/Monitor/NetworkInventoryUtil.ts +146 -39
  79. package/Server/Utils/NetworkDevice/DeviceHealthAggregation.ts +31 -18
  80. package/Server/Utils/NetworkSite/NetworkSiteHierarchyLock.ts +213 -0
  81. package/Server/Utils/OutboundUserAgent.ts +152 -0
  82. package/Server/Utils/StartServer.ts +51 -19
  83. package/Server/Utils/Telemetry/CaptureSpan.ts +32 -8
  84. package/Server/Utils/Telemetry/ErrorClassResolver.ts +120 -0
  85. package/Server/Utils/Telemetry/SpanUtil.ts +33 -0
  86. package/Server/Utils/Telemetry.ts +198 -51
  87. package/Server/Views/Partials/SensitiveUrlToken.ejs +140 -0
  88. package/Tests/App/Dashboard/AddNeighborToMonitoringModal.test.tsx +134 -33
  89. package/Tests/App/Dashboard/AskAiSuggestedPrompts.test.ts +279 -0
  90. package/Tests/App/Dashboard/DashboardEditPermissions.test.tsx +517 -0
  91. package/Tests/App/Dashboard/DashboardVariablesDiscard.test.tsx +26 -0
  92. package/Tests/App/Dashboard/DeviceStatusHero.test.tsx +588 -0
  93. package/Tests/App/Dashboard/DiscoveryScanWizardValidation.test.tsx +18 -9
  94. package/Tests/App/Dashboard/MonitorCreateFromMonitorBackedDevice.test.tsx +632 -0
  95. package/Tests/App/Dashboard/MonitorRecommendationCreateProgress.test.tsx +682 -0
  96. package/Tests/App/Dashboard/MonitorTypePicker.test.tsx +4 -2
  97. package/Tests/App/Dashboard/NetworkDeviceCreateFormMonitorBinding.test.tsx +676 -0
  98. package/Tests/App/Dashboard/NetworkDeviceCreateFormPingMonitor.test.tsx +791 -0
  99. package/Tests/App/Dashboard/NetworkDeviceCreateFormProbeAndSnmp.test.tsx +833 -0
  100. package/Tests/App/Dashboard/NetworkDeviceCriteriaFilter.test.ts +161 -0
  101. package/Tests/App/Dashboard/NetworkDeviceSettingsMonitoringSection.test.tsx +458 -0
  102. package/Tests/App/Dashboard/NetworkSideMenu.test.tsx +41 -5
  103. package/Tests/App/Dashboard/PingMonitorProvisioning.test.ts +368 -0
  104. package/Tests/App/Dashboard/RecommendationCard.test.tsx +796 -0
  105. package/Tests/App/Dashboard/RecommendationToolbar.test.tsx +519 -0
  106. package/Tests/App/Dashboard/RecommendationsList.test.tsx +661 -0
  107. package/Tests/App/Dashboard/UseBulkCreatePingMonitors.test.tsx +899 -0
  108. package/Tests/App/Dashboard/UseBulkSnmpCredentialProfileActions.test.tsx +732 -0
  109. package/Tests/App/SensitiveUrlTokenBootstrap.test.ts +256 -0
  110. package/Tests/App/StatusPage/StatusPageIndexPageRobotsMeta.test.ts +11 -1
  111. package/Tests/App/StatusPage/StatusPageLoginCodeBootstrap.test.ts +9 -4
  112. package/Tests/Models/NetworkSiteHierarchy.test.ts +41 -4
  113. package/Tests/Server/API/EnterpriseLicenseReportUserCount.test.ts +951 -7
  114. package/Tests/Server/API/LlmProviderConnectionTest.test.ts +522 -0
  115. package/Tests/Server/Infrastructure/Postgres/NetworkSnmpCredentialProfilesAndAlertPoliciesMigration.test.ts +854 -0
  116. package/Tests/Server/Infrastructure/Postgres/SchemaMigrationsOrdering.test.ts +18 -0
  117. package/Tests/Server/Infrastructure/Postgres/UserNotificationEmailRollupTableMigration.test.ts +535 -0
  118. package/Tests/Server/Services/AIChatPrivacyPin.test.ts +560 -0
  119. package/Tests/Server/Services/BillingRechargeOwnerEmailGuards.test.ts +783 -0
  120. package/Tests/Server/Services/EnterpriseLicenseInstanceServiceDeletionUsage.test.ts +707 -0
  121. package/Tests/Server/Services/EnterpriseLicenseServiceUsageAggregationLock.test.ts +329 -0
  122. package/Tests/Server/Services/MonitorServiceDeleteNetworkDeviceCleanup.test.ts +294 -0
  123. package/Tests/Server/Services/MonitorStatusBridgeProbePath.test.ts +802 -0
  124. package/Tests/Server/Services/MonitorStatusTimelineService.test.ts +72 -2
  125. package/Tests/Server/Services/NetworkAlertPolicyEngineHooks.test.ts +752 -0
  126. package/Tests/Server/Services/NetworkAlertPolicyEngineService.test.ts +1849 -0
  127. package/Tests/Server/Services/NetworkAlertPolicyModel.test.ts +1793 -0
  128. package/Tests/Server/Services/NetworkDeviceAutoImportRuleEngineService.test.ts +47 -4
  129. package/Tests/Server/Services/NetworkDeviceAutoImportRuleService.test.ts +97 -12
  130. package/Tests/Server/Services/NetworkDeviceAutoMonitorLifecycle.test.ts +148 -3
  131. package/Tests/Server/Services/NetworkDeviceMonitorBindingUpdateGuard.test.ts +514 -0
  132. package/Tests/Server/Services/NetworkDeviceMonitorStatusStamp.test.ts +447 -58
  133. package/Tests/Server/Services/NetworkDeviceMonitoringMethodTransition.test.ts +739 -0
  134. package/Tests/Server/Services/NetworkDevicePollingTenancy.test.ts +501 -0
  135. package/Tests/Server/Services/NetworkDeviceSiteDefaultProbe.test.ts +432 -0
  136. package/Tests/Server/Services/NetworkSiteMonitoringDefaults.test.ts +498 -0
  137. package/Tests/Server/Services/NetworkSiteRollupPolicyAndMaintenance.test.ts +337 -55
  138. package/Tests/Server/Services/NetworkSiteService.test.ts +1868 -131
  139. package/Tests/Server/Services/NetworkSiteTypeService.test.ts +1109 -0
  140. package/Tests/Server/Services/NetworkSnmpCredentialProfileModel.test.ts +926 -0
  141. package/Tests/Server/Services/NetworkSnmpCredentialProfileService.test.ts +796 -0
  142. package/Tests/Server/Services/ProjectServiceNetworkSiteTypeDefaults.test.ts +214 -0
  143. package/Tests/Server/Services/StatusPagePrivateUserEmailChangePasswordResetExpiry.test.ts +269 -0
  144. package/Tests/Server/Services/UserEmailChangePasswordResetExpiry.test.ts +472 -0
  145. package/Tests/Server/Services/UserNotificationEmailRollupModels.test.ts +569 -0
  146. package/Tests/Server/Services/UserNotificationEmailRollupSettingModel.test.ts +314 -0
  147. package/Tests/Server/Services/UserNotificationEmailRollupSettingService.test.ts +409 -0
  148. package/Tests/Server/Services/UserNotificationSettingRollupRouting.test.ts +856 -0
  149. package/Tests/Server/Services/UserNotificationSettingWorkspaceChannels.test.ts +102 -1
  150. package/Tests/Server/Types/Database/Permissions/DashboardAccessPermission.test.ts +321 -0
  151. package/Tests/Server/Types/Database/QueryHelperOperators.test.ts +17 -0
  152. package/Tests/Server/Utils/AI/AlertMonitorFilters.test.ts +124 -0
  153. package/Tests/Server/Utils/AI/Insights/InsightTriageRunner.test.ts +208 -0
  154. package/Tests/Server/Utils/AI/LLMServiceToolCalling.test.ts +235 -0
  155. package/Tests/Server/Utils/AI/ObservabilityChatPrompt.test.ts +253 -0
  156. package/Tests/Server/Utils/Captcha.test.ts +422 -0
  157. package/Tests/Server/Utils/DataSource/HttpFetch.test.ts +96 -2
  158. package/Tests/Server/Utils/Database/MigrationFailureLog.test.ts +466 -0
  159. package/Tests/Server/Utils/EmailRollup/EmailRollupFlushRunnerBehaviour.test.ts +1096 -0
  160. package/Tests/Server/Utils/EmailRollup/EmailRollupFlushRunnerClaim.test.ts +466 -0
  161. package/Tests/Server/Utils/EmailRollup/EmailRollupRenderer.test.ts +1428 -0
  162. package/Tests/Server/Utils/EmailRollup/EmailRollupTestHarness.ts +752 -0
  163. package/Tests/Server/Utils/EmailRollup/EmailRollupWriter.test.ts +864 -0
  164. package/Tests/Server/Utils/LoggerFaultDemotion.test.ts +346 -0
  165. package/Tests/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.test.ts +633 -0
  166. package/Tests/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.test.ts +196 -0
  167. package/Tests/Server/Utils/Monitor/DatabaseMetricWrite.test.ts +367 -0
  168. package/Tests/Server/Utils/Monitor/MonitorCriteriaObservationBuilderUnits.test.ts +100 -0
  169. package/Tests/Server/Utils/Monitor/MonitorStepResourceIdentity.test.ts +5 -0
  170. package/Tests/Server/Utils/Monitor/NetworkDeviceHydrationUtil.test.ts +512 -31
  171. package/Tests/Server/Utils/Monitor/NetworkDeviceMetricUtil.test.ts +252 -0
  172. package/Tests/Server/Utils/Monitor/NetworkDeviceWalkUtil.test.ts +479 -42
  173. package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +351 -5
  174. package/Tests/Server/Utils/NetworkDevice/DeviceHealthAggregation.test.ts +136 -12
  175. package/Tests/Server/Utils/NetworkSite/NetworkSiteHierarchyLock.test.ts +306 -0
  176. package/Tests/Server/Utils/OutboundUserAgent.test.ts +266 -0
  177. package/Tests/Server/Utils/SecurityEvent/ThreatIntel/TaxiiClientUserAgent.test.ts +141 -0
  178. package/Tests/Server/Utils/Telemetry/ErrorClassResolver.test.ts +298 -0
  179. package/Tests/Server/Utils/Telemetry.test.ts +456 -66
  180. package/Tests/Types/Monitor/DatabaseMetricCatalog.test.ts +388 -0
  181. package/Tests/Types/Monitor/MonitorStepDatabaseMonitor.test.ts +243 -0
  182. package/Tests/Types/Monitor/MonitorStepDefaultTelemetryConfig.test.ts +1 -0
  183. package/Tests/Types/Monitor/MonitorType.test.ts +1 -0
  184. package/Tests/Types/Monitor/MonitorTypeKeywords.test.ts +16 -7
  185. package/Tests/Types/Monitor/NetworkDeviceAlertPack.test.ts +60 -0
  186. package/Tests/Types/NetworkDevice/NetworkAlertPolicyScope.test.ts +655 -0
  187. package/Tests/Types/NetworkDevice/NetworkDeviceMonitoringMethod.test.ts +115 -26
  188. package/Tests/Types/NetworkSite/DefaultNetworkSiteType.test.ts +39 -0
  189. package/Tests/Types/NotificationSetting/NotificationEmailRollupPolicy.test.ts +299 -0
  190. package/Tests/Types/Telemetry/ErrorClass.test.ts +483 -0
  191. package/Tests/UI/Components/BasicRadioButtons.test.tsx +336 -0
  192. package/Tests/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.test.ts +15 -0
  193. package/Tests/UI/Components/ProgressBar.test.tsx +38 -2
  194. package/Tests/UI/Components/SideMenuItem.test.tsx +226 -4
  195. package/Tests/UI/Components/SideMenuSection.test.tsx +310 -0
  196. package/Tests/UI/Components/SideOverSubmitState.test.tsx +335 -0
  197. package/Tests/UI/Utils/PageScrollLock.test.tsx +377 -0
  198. package/Tests/UI/Utils/PermissionGate.test.ts +78 -0
  199. package/Tests/UI/Utils/SensitiveUrlToken.test.ts +140 -0
  200. package/Tests/Utils/EnterpriseLicenseSeats.test.ts +69 -0
  201. package/Tests/Utils/EnterpriseLicenseSync.test.ts +7 -1
  202. package/Tests/Utils/EnterpriseLicenseUsage.test.ts +433 -2
  203. package/Tests/Utils/Monitor/MonitorMetricType.test.ts +280 -1
  204. package/Tests/Utils/Monitor/MonitorSummarySnapshotUtil.test.ts +1 -0
  205. package/Tests/Utils/Monitor/NetworkTopologyUtil.test.ts +38 -0
  206. package/Tests/Utils/NetworkDevice/DeviceHealthStateUtil.test.ts +284 -23
  207. package/Tests/Utils/NetworkDevice/DeviceReachabilityUtil.test.ts +177 -0
  208. package/Tests/Utils/NetworkDevice/MonitoringMethodThreadedClassifiers.test.ts +992 -0
  209. package/Tests/Utils/NetworkDevice/NetworkAlertPolicyBootstrapUtil.test.ts +427 -0
  210. package/Tests/Utils/NetworkDevice/ReachabilityStampConsistency.test.ts +185 -0
  211. package/Tests/Utils/NetworkDevice/SnmpCredentialUtil.test.ts +268 -0
  212. package/Tests/Utils/NetworkDiscovery/AutoImportRuleMatcher.test.ts +55 -5
  213. package/Tests/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.test.ts +98 -21
  214. package/Tests/Utils/NetworkDiscovery/DiscoveryImportEligibility.test.ts +98 -20
  215. package/Tests/Utils/NetworkDiscovery/DiscoveryReverseDnsChain.test.ts +8 -7
  216. package/Tests/Utils/NetworkDiscovery/PingMonitorBuilderForAddress.test.ts +274 -0
  217. package/Tests/Utils/NetworkSite/SiteStatusRollupUtil.test.ts +230 -51
  218. package/Tests/Utils/NetworkSite/TypeHierarchyUtil.test.ts +209 -0
  219. package/Tests/Utils/Telemetry/CaptureSpanExportGating.test.ts +145 -0
  220. package/Types/AI/ExceptionAIClassification.ts +10 -24
  221. package/Types/Email/EmailTemplateType.ts +2 -0
  222. package/Types/EnterpriseLicense/EnterpriseLicenseInstanceSummary.ts +5 -0
  223. package/Types/EnterpriseLicense/EnterpriseLicenseUsageSnapshot.ts +13 -0
  224. package/Types/EnterpriseLicense/EnterpriseLicenseUserCountSource.ts +6 -0
  225. package/Types/Exception/ApiException.ts +10 -0
  226. package/Types/Exception/BadDataException.ts +11 -0
  227. package/Types/Exception/BadRequestException.ts +11 -0
  228. package/Types/Exception/Exception.ts +65 -0
  229. package/Types/Exception/ForbiddenException.ts +10 -0
  230. package/Types/Exception/NotAuthenticatedException.ts +10 -0
  231. package/Types/Exception/NotAuthorizedException.ts +10 -0
  232. package/Types/Exception/NotFoundException.ts +11 -0
  233. package/Types/Exception/PayloadTooLargeException.ts +11 -0
  234. package/Types/Exception/PaymentRequiredException.ts +10 -0
  235. package/Types/Exception/ServiceUnavailableException.ts +10 -0
  236. package/Types/Exception/SsoAuthorizationException.ts +10 -0
  237. package/Types/Exception/TenantNotFoundException.ts +11 -0
  238. package/Types/Exception/TimeoutException.ts +10 -0
  239. package/Types/Exception/TooManyRequestsException.ts +10 -0
  240. package/Types/Exception/UnableToReachServer.ts +10 -0
  241. package/Types/Exception/WebsiteRequestException.ts +10 -0
  242. package/Types/Monitor/CriteriaFilter.ts +60 -2
  243. package/Types/Monitor/DatabaseMetricCatalog.ts +693 -0
  244. package/Types/Monitor/DatabaseMonitor/DatabaseMonitorResponse.ts +83 -0
  245. package/Types/Monitor/MonitorCriteriaInstance.ts +76 -0
  246. package/Types/Monitor/MonitorMetricType.ts +71 -0
  247. package/Types/Monitor/MonitorStep.ts +76 -0
  248. package/Types/Monitor/MonitorStepDatabaseMonitor.ts +171 -0
  249. package/Types/Monitor/MonitorStepSqlMonitor.ts +2 -20
  250. package/Types/Monitor/MonitorType.ts +47 -1
  251. package/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.ts +22 -1
  252. package/Types/Monitor/SqlConnectionConfig.ts +31 -0
  253. package/Types/NetworkDevice/NetworkAlertPolicyScope.ts +343 -0
  254. package/Types/NetworkDevice/NetworkDeviceMonitoringMethod.ts +42 -22
  255. package/Types/NetworkSite/DefaultNetworkSiteTypeHierarchy.ts +30 -0
  256. package/Types/NotificationSetting/NotificationEmailRollupCategory.ts +255 -0
  257. package/Types/NotificationSetting/NotificationEmailRollupPolicy.ts +104 -0
  258. package/Types/Permission.ts +90 -0
  259. package/Types/Probe/ProbeMonitorResponse.ts +16 -0
  260. package/Types/Telemetry/ErrorClass.ts +274 -0
  261. package/Types/Telemetry/UnitOfWork.ts +59 -0
  262. package/UI/Components/CommandPalette/CommandPalette.tsx +2 -8
  263. package/UI/Components/EditionLabel/EditionLabel.tsx +4 -0
  264. package/UI/Components/Modal/Modal.tsx +2 -8
  265. package/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.ts +44 -0
  266. package/UI/Components/ProgressBar/ProgressBar.tsx +12 -1
  267. package/UI/Components/RadioButtons/BasicRadioButtons.tsx +37 -7
  268. package/UI/Components/SideMenu/SideMenu.tsx +123 -5
  269. package/UI/Components/SideMenu/SideMenuItem.tsx +76 -84
  270. package/UI/Components/SideMenu/SideMenuSection.tsx +55 -23
  271. package/UI/Components/SideOver/SideOver.tsx +21 -20
  272. package/UI/Utils/PageScrollLock.ts +79 -3
  273. package/UI/Utils/PermissionGate.ts +61 -0
  274. package/UI/Utils/SensitiveUrlToken.ts +112 -0
  275. package/UI/Utils/TestLLMProvider.ts +11 -0
  276. package/Utils/EnterpriseLicense/EnterpriseLicenseSeats.ts +16 -0
  277. package/Utils/EnterpriseLicense/EnterpriseLicenseUsage.ts +191 -11
  278. package/Utils/Monitor/MonitorMetricType.ts +153 -1
  279. package/Utils/Monitor/NetworkTopologyUtil.ts +23 -3
  280. package/Utils/NetworkDevice/DeviceHealthStateUtil.ts +65 -14
  281. package/Utils/NetworkDevice/DeviceReachabilityUtil.ts +43 -14
  282. package/Utils/NetworkDevice/NetworkAlertPolicyBootstrapUtil.ts +247 -0
  283. package/Utils/NetworkDevice/SnmpCredentialUtil.ts +68 -0
  284. package/Utils/NetworkDiscovery/AutoImportRuleMatcher.ts +15 -7
  285. package/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.ts +52 -17
  286. package/Utils/NetworkDiscovery/DiscoveryImportEligibility.ts +55 -23
  287. package/Utils/NetworkDiscovery/PingMonitorBuilder.ts +115 -13
  288. package/Utils/NetworkSite/SiteStatusRollupUtil.ts +66 -20
  289. package/Utils/NetworkSite/TypeHierarchyUtil.ts +313 -0
  290. package/build/dist/Models/AnalyticsModels/Span.js +14 -0
  291. package/build/dist/Models/AnalyticsModels/Span.js.map +1 -1
  292. package/build/dist/Models/DatabaseModels/EnterpriseLicense.js +59 -0
  293. package/build/dist/Models/DatabaseModels/EnterpriseLicense.js.map +1 -1
  294. package/build/dist/Models/DatabaseModels/Index.js +10 -0
  295. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  296. package/build/dist/Models/DatabaseModels/Monitor.js +75 -0
  297. package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
  298. package/build/dist/Models/DatabaseModels/NetworkAlertPolicy.js +713 -0
  299. package/build/dist/Models/DatabaseModels/NetworkAlertPolicy.js.map +1 -0
  300. package/build/dist/Models/DatabaseModels/NetworkDevice.js +180 -1
  301. package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
  302. package/build/dist/Models/DatabaseModels/NetworkSite.js +200 -2
  303. package/build/dist/Models/DatabaseModels/NetworkSite.js.map +1 -1
  304. package/build/dist/Models/DatabaseModels/NetworkSiteType.js +102 -3
  305. package/build/dist/Models/DatabaseModels/NetworkSiteType.js.map +1 -1
  306. package/build/dist/Models/DatabaseModels/NetworkSnmpCredentialProfile.js +878 -0
  307. package/build/dist/Models/DatabaseModels/NetworkSnmpCredentialProfile.js.map +1 -0
  308. package/build/dist/Models/DatabaseModels/TelemetryException.js +123 -0
  309. package/build/dist/Models/DatabaseModels/TelemetryException.js.map +1 -1
  310. package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupBatch.js +363 -0
  311. package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupBatch.js.map +1 -0
  312. package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupItem.js +402 -0
  313. package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupItem.js.map +1 -0
  314. package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupSetting.js +296 -0
  315. package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupSetting.js.map +1 -0
  316. package/build/dist/Server/API/EnterpriseLicenseAPI.js +273 -60
  317. package/build/dist/Server/API/EnterpriseLicenseAPI.js.map +1 -1
  318. package/build/dist/Server/API/LlmProviderAPI.js +108 -13
  319. package/build/dist/Server/API/LlmProviderAPI.js.map +1 -1
  320. package/build/dist/Server/EnvironmentConfig.js +12 -0
  321. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  322. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790700000000-AddNetworkSiteTypeParentHierarchy.js +24 -0
  323. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790700000000-AddNetworkSiteTypeParentHierarchy.js.map +1 -0
  324. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddEnterpriseLicenseUsageProvenance.js +16 -0
  325. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddEnterpriseLicenseUsageProvenance.js.map +1 -0
  326. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddTelemetryExceptionErrorClass.js +111 -0
  327. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddTelemetryExceptionErrorClass.js.map +1 -0
  328. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791000000000-AddUserNotificationEmailRollup.js +77 -0
  329. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791000000000-AddUserNotificationEmailRollup.js.map +1 -0
  330. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791100000000-AddUserNotificationEmailRollupSetting.js +50 -0
  331. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791100000000-AddUserNotificationEmailRollupSetting.js.map +1 -0
  332. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791200000000-AddNetworkSnmpCredentialProfilesAndAlertPolicies.js +83 -0
  333. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791200000000-AddNetworkSnmpCredentialProfilesAndAlertPolicies.js.map +1 -0
  334. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +12 -0
  335. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  336. package/build/dist/Server/Infrastructure/QueueWorker.js +33 -5
  337. package/build/dist/Server/Infrastructure/QueueWorker.js.map +1 -1
  338. package/build/dist/Server/Middleware/BearerTokenAuthorization.js +12 -0
  339. package/build/dist/Server/Middleware/BearerTokenAuthorization.js.map +1 -1
  340. package/build/dist/Server/Middleware/ProjectAuthorization.js +11 -0
  341. package/build/dist/Server/Middleware/ProjectAuthorization.js.map +1 -1
  342. package/build/dist/Server/Middleware/SCIMAuthorization.js +12 -0
  343. package/build/dist/Server/Middleware/SCIMAuthorization.js.map +1 -1
  344. package/build/dist/Server/Middleware/TelemetryIngest.js +11 -0
  345. package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
  346. package/build/dist/Server/Services/AIBillingService.js +70 -16
  347. package/build/dist/Server/Services/AIBillingService.js.map +1 -1
  348. package/build/dist/Server/Services/EnterpriseLicenseInstanceService.js +167 -0
  349. package/build/dist/Server/Services/EnterpriseLicenseInstanceService.js.map +1 -1
  350. package/build/dist/Server/Services/EnterpriseLicenseService.js +39 -0
  351. package/build/dist/Server/Services/EnterpriseLicenseService.js.map +1 -1
  352. package/build/dist/Server/Services/Index.js +10 -0
  353. package/build/dist/Server/Services/Index.js.map +1 -1
  354. package/build/dist/Server/Services/MonitorService.js +119 -21
  355. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  356. package/build/dist/Server/Services/MonitorStatusTimelineService.js +127 -8
  357. package/build/dist/Server/Services/MonitorStatusTimelineService.js.map +1 -1
  358. package/build/dist/Server/Services/MonitorTemplateService.js +162 -0
  359. package/build/dist/Server/Services/MonitorTemplateService.js.map +1 -1
  360. package/build/dist/Server/Services/NetworkAlertPolicyEngineService.js +1683 -0
  361. package/build/dist/Server/Services/NetworkAlertPolicyEngineService.js.map +1 -0
  362. package/build/dist/Server/Services/NetworkAlertPolicyService.js +732 -0
  363. package/build/dist/Server/Services/NetworkAlertPolicyService.js.map +1 -0
  364. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +10 -9
  365. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
  366. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js +54 -11
  367. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js.map +1 -1
  368. package/build/dist/Server/Services/NetworkDeviceService.js +841 -70
  369. package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
  370. package/build/dist/Server/Services/NetworkSiteService.js +1145 -107
  371. package/build/dist/Server/Services/NetworkSiteService.js.map +1 -1
  372. package/build/dist/Server/Services/NetworkSiteTypeService.js +863 -0
  373. package/build/dist/Server/Services/NetworkSiteTypeService.js.map +1 -1
  374. package/build/dist/Server/Services/NetworkSnmpCredentialProfileService.js +217 -0
  375. package/build/dist/Server/Services/NetworkSnmpCredentialProfileService.js.map +1 -0
  376. package/build/dist/Server/Services/NotificationService.js +80 -17
  377. package/build/dist/Server/Services/NotificationService.js.map +1 -1
  378. package/build/dist/Server/Services/ProjectService.js +66 -30
  379. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  380. package/build/dist/Server/Services/StatusPagePrivateUserService.js +92 -2
  381. package/build/dist/Server/Services/StatusPagePrivateUserService.js.map +1 -1
  382. package/build/dist/Server/Services/UserNotificationEmailRollupBatchService.js +76 -0
  383. package/build/dist/Server/Services/UserNotificationEmailRollupBatchService.js.map +1 -0
  384. package/build/dist/Server/Services/UserNotificationEmailRollupItemService.js +77 -0
  385. package/build/dist/Server/Services/UserNotificationEmailRollupItemService.js.map +1 -0
  386. package/build/dist/Server/Services/UserNotificationEmailRollupSettingService.js +111 -0
  387. package/build/dist/Server/Services/UserNotificationEmailRollupSettingService.js.map +1 -0
  388. package/build/dist/Server/Services/UserNotificationSettingService.js +46 -20
  389. package/build/dist/Server/Services/UserNotificationSettingService.js.map +1 -1
  390. package/build/dist/Server/Services/UserService.js +90 -0
  391. package/build/dist/Server/Services/UserService.js.map +1 -1
  392. package/build/dist/Server/Types/Database/QueryHelper.js +1 -1
  393. package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
  394. package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js +14 -3
  395. package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js.map +1 -1
  396. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js +10 -0
  397. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js.map +1 -1
  398. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js +10 -0
  399. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js.map +1 -1
  400. package/build/dist/Server/Utils/AI/SRE/Insights/InsightTriageRunner.js +54 -1
  401. package/build/dist/Server/Utils/AI/SRE/Insights/InsightTriageRunner.js.map +1 -1
  402. package/build/dist/Server/Utils/AI/Toolbox/AlertTools.js +18 -4
  403. package/build/dist/Server/Utils/AI/Toolbox/AlertTools.js.map +1 -1
  404. package/build/dist/Server/Utils/Billing/BillingFailureNoticeThrottle.js +59 -0
  405. package/build/dist/Server/Utils/Billing/BillingFailureNoticeThrottle.js.map +1 -0
  406. package/build/dist/Server/Utils/DataSource/HttpFetch.js +2 -1
  407. package/build/dist/Server/Utils/DataSource/HttpFetch.js.map +1 -1
  408. package/build/dist/Server/Utils/EmailRollup/EmailRollupConstants.js +91 -0
  409. package/build/dist/Server/Utils/EmailRollup/EmailRollupConstants.js.map +1 -0
  410. package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js +691 -0
  411. package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js.map +1 -0
  412. package/build/dist/Server/Utils/EmailRollup/EmailRollupRenderer.js +497 -0
  413. package/build/dist/Server/Utils/EmailRollup/EmailRollupRenderer.js.map +1 -0
  414. package/build/dist/Server/Utils/EmailRollup/EmailRollupWriter.js +257 -0
  415. package/build/dist/Server/Utils/EmailRollup/EmailRollupWriter.js.map +1 -0
  416. package/build/dist/Server/Utils/LLM/LLMService.js +64 -1
  417. package/build/dist/Server/Utils/LLM/LLMService.js.map +1 -1
  418. package/build/dist/Server/Utils/LogRedaction.js +8 -0
  419. package/build/dist/Server/Utils/LogRedaction.js.map +1 -1
  420. package/build/dist/Server/Utils/Logger.js +63 -1
  421. package/build/dist/Server/Utils/Logger.js.map +1 -1
  422. package/build/dist/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.js +141 -0
  423. package/build/dist/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.js.map +1 -0
  424. package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js +8 -1
  425. package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js.map +1 -1
  426. package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js +51 -1
  427. package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js.map +1 -1
  428. package/build/dist/Server/Utils/Monitor/MonitorCriteriaDataExtractor.js +7 -0
  429. package/build/dist/Server/Utils/Monitor/MonitorCriteriaDataExtractor.js.map +1 -1
  430. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +37 -0
  431. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
  432. package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js +158 -6
  433. package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js.map +1 -1
  434. package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js +33 -0
  435. package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js.map +1 -1
  436. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +32 -0
  437. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
  438. package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js +330 -21
  439. package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js.map +1 -1
  440. package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js +55 -10
  441. package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js.map +1 -1
  442. package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js +178 -49
  443. package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js.map +1 -1
  444. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +119 -29
  445. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
  446. package/build/dist/Server/Utils/NetworkDevice/DeviceHealthAggregation.js +30 -17
  447. package/build/dist/Server/Utils/NetworkDevice/DeviceHealthAggregation.js.map +1 -1
  448. package/build/dist/Server/Utils/NetworkSite/NetworkSiteHierarchyLock.js +158 -0
  449. package/build/dist/Server/Utils/NetworkSite/NetworkSiteHierarchyLock.js.map +1 -0
  450. package/build/dist/Server/Utils/OutboundUserAgent.js +123 -0
  451. package/build/dist/Server/Utils/OutboundUserAgent.js.map +1 -0
  452. package/build/dist/Server/Utils/StartServer.js +38 -14
  453. package/build/dist/Server/Utils/StartServer.js.map +1 -1
  454. package/build/dist/Server/Utils/Telemetry/CaptureSpan.js +28 -8
  455. package/build/dist/Server/Utils/Telemetry/CaptureSpan.js.map +1 -1
  456. package/build/dist/Server/Utils/Telemetry/ErrorClassResolver.js +95 -0
  457. package/build/dist/Server/Utils/Telemetry/ErrorClassResolver.js.map +1 -0
  458. package/build/dist/Server/Utils/Telemetry/SpanUtil.js +29 -0
  459. package/build/dist/Server/Utils/Telemetry/SpanUtil.js.map +1 -1
  460. package/build/dist/Server/Utils/Telemetry.js +162 -46
  461. package/build/dist/Server/Utils/Telemetry.js.map +1 -1
  462. package/build/dist/Types/AI/ExceptionAIClassification.js +10 -24
  463. package/build/dist/Types/AI/ExceptionAIClassification.js.map +1 -1
  464. package/build/dist/Types/Email/EmailTemplateType.js +1 -0
  465. package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
  466. package/build/dist/Types/EnterpriseLicense/EnterpriseLicenseUsageSnapshot.js +2 -0
  467. package/build/dist/Types/EnterpriseLicense/EnterpriseLicenseUsageSnapshot.js.map +1 -0
  468. package/build/dist/Types/EnterpriseLicense/EnterpriseLicenseUserCountSource.js +7 -0
  469. package/build/dist/Types/EnterpriseLicense/EnterpriseLicenseUserCountSource.js.map +1 -0
  470. package/build/dist/Types/Exception/ApiException.js +9 -0
  471. package/build/dist/Types/Exception/ApiException.js.map +1 -1
  472. package/build/dist/Types/Exception/BadDataException.js +10 -0
  473. package/build/dist/Types/Exception/BadDataException.js.map +1 -1
  474. package/build/dist/Types/Exception/BadRequestException.js +10 -0
  475. package/build/dist/Types/Exception/BadRequestException.js.map +1 -1
  476. package/build/dist/Types/Exception/Exception.js +56 -0
  477. package/build/dist/Types/Exception/Exception.js.map +1 -1
  478. package/build/dist/Types/Exception/ForbiddenException.js +9 -0
  479. package/build/dist/Types/Exception/ForbiddenException.js.map +1 -1
  480. package/build/dist/Types/Exception/NotAuthenticatedException.js +9 -0
  481. package/build/dist/Types/Exception/NotAuthenticatedException.js.map +1 -1
  482. package/build/dist/Types/Exception/NotAuthorizedException.js +9 -0
  483. package/build/dist/Types/Exception/NotAuthorizedException.js.map +1 -1
  484. package/build/dist/Types/Exception/NotFoundException.js +10 -0
  485. package/build/dist/Types/Exception/NotFoundException.js.map +1 -1
  486. package/build/dist/Types/Exception/PayloadTooLargeException.js +10 -0
  487. package/build/dist/Types/Exception/PayloadTooLargeException.js.map +1 -1
  488. package/build/dist/Types/Exception/PaymentRequiredException.js +9 -0
  489. package/build/dist/Types/Exception/PaymentRequiredException.js.map +1 -1
  490. package/build/dist/Types/Exception/ServiceUnavailableException.js +9 -0
  491. package/build/dist/Types/Exception/ServiceUnavailableException.js.map +1 -1
  492. package/build/dist/Types/Exception/SsoAuthorizationException.js +9 -0
  493. package/build/dist/Types/Exception/SsoAuthorizationException.js.map +1 -1
  494. package/build/dist/Types/Exception/TenantNotFoundException.js +10 -0
  495. package/build/dist/Types/Exception/TenantNotFoundException.js.map +1 -1
  496. package/build/dist/Types/Exception/TimeoutException.js +9 -0
  497. package/build/dist/Types/Exception/TimeoutException.js.map +1 -1
  498. package/build/dist/Types/Exception/TooManyRequestsException.js +9 -0
  499. package/build/dist/Types/Exception/TooManyRequestsException.js.map +1 -1
  500. package/build/dist/Types/Exception/UnableToReachServer.js +9 -0
  501. package/build/dist/Types/Exception/UnableToReachServer.js.map +1 -1
  502. package/build/dist/Types/Exception/WebsiteRequestException.js +9 -0
  503. package/build/dist/Types/Exception/WebsiteRequestException.js.map +1 -1
  504. package/build/dist/Types/Monitor/CriteriaFilter.js +45 -2
  505. package/build/dist/Types/Monitor/CriteriaFilter.js.map +1 -1
  506. package/build/dist/Types/Monitor/DatabaseMetricCatalog.js +594 -0
  507. package/build/dist/Types/Monitor/DatabaseMetricCatalog.js.map +1 -0
  508. package/build/dist/Types/Monitor/DatabaseMonitor/DatabaseMonitorResponse.js +21 -0
  509. package/build/dist/Types/Monitor/DatabaseMonitor/DatabaseMonitorResponse.js.map +1 -0
  510. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js +70 -0
  511. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
  512. package/build/dist/Types/Monitor/MonitorMetricType.js +61 -0
  513. package/build/dist/Types/Monitor/MonitorMetricType.js.map +1 -1
  514. package/build/dist/Types/Monitor/MonitorStep.js +54 -0
  515. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  516. package/build/dist/Types/Monitor/MonitorStepDatabaseMonitor.js +122 -0
  517. package/build/dist/Types/Monitor/MonitorStepDatabaseMonitor.js.map +1 -0
  518. package/build/dist/Types/Monitor/MonitorStepSqlMonitor.js.map +1 -1
  519. package/build/dist/Types/Monitor/MonitorType.js +45 -1
  520. package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
  521. package/build/dist/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.js +21 -1
  522. package/build/dist/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.js.map +1 -1
  523. package/build/dist/Types/Monitor/SqlConnectionConfig.js +2 -0
  524. package/build/dist/Types/Monitor/SqlConnectionConfig.js.map +1 -0
  525. package/build/dist/Types/NetworkDevice/NetworkAlertPolicyScope.js +172 -0
  526. package/build/dist/Types/NetworkDevice/NetworkAlertPolicyScope.js.map +1 -0
  527. package/build/dist/Types/NetworkDevice/NetworkDeviceMonitoringMethod.js +40 -22
  528. package/build/dist/Types/NetworkDevice/NetworkDeviceMonitoringMethod.js.map +1 -1
  529. package/build/dist/Types/NetworkSite/DefaultNetworkSiteTypeHierarchy.js +26 -0
  530. package/build/dist/Types/NetworkSite/DefaultNetworkSiteTypeHierarchy.js.map +1 -0
  531. package/build/dist/Types/NotificationSetting/NotificationEmailRollupCategory.js +186 -0
  532. package/build/dist/Types/NotificationSetting/NotificationEmailRollupCategory.js.map +1 -0
  533. package/build/dist/Types/NotificationSetting/NotificationEmailRollupPolicy.js +87 -0
  534. package/build/dist/Types/NotificationSetting/NotificationEmailRollupPolicy.js.map +1 -0
  535. package/build/dist/Types/Permission.js +80 -0
  536. package/build/dist/Types/Permission.js.map +1 -1
  537. package/build/dist/Types/Telemetry/ErrorClass.js +216 -0
  538. package/build/dist/Types/Telemetry/ErrorClass.js.map +1 -0
  539. package/build/dist/Types/Telemetry/UnitOfWork.js +59 -0
  540. package/build/dist/Types/Telemetry/UnitOfWork.js.map +1 -0
  541. package/build/dist/UI/Components/CommandPalette/CommandPalette.js +2 -7
  542. package/build/dist/UI/Components/CommandPalette/CommandPalette.js.map +1 -1
  543. package/build/dist/UI/Components/EditionLabel/EditionLabel.js +3 -0
  544. package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
  545. package/build/dist/UI/Components/Modal/Modal.js +2 -7
  546. package/build/dist/UI/Components/Modal/Modal.js.map +1 -1
  547. package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js +39 -0
  548. package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js.map +1 -1
  549. package/build/dist/UI/Components/ProgressBar/ProgressBar.js +12 -1
  550. package/build/dist/UI/Components/ProgressBar/ProgressBar.js.map +1 -1
  551. package/build/dist/UI/Components/RadioButtons/BasicRadioButtons.js +6 -6
  552. package/build/dist/UI/Components/RadioButtons/BasicRadioButtons.js.map +1 -1
  553. package/build/dist/UI/Components/SideMenu/SideMenu.js +67 -5
  554. package/build/dist/UI/Components/SideMenu/SideMenu.js.map +1 -1
  555. package/build/dist/UI/Components/SideMenu/SideMenuItem.js +49 -53
  556. package/build/dist/UI/Components/SideMenu/SideMenuItem.js.map +1 -1
  557. package/build/dist/UI/Components/SideMenu/SideMenuSection.js +25 -7
  558. package/build/dist/UI/Components/SideMenu/SideMenuSection.js.map +1 -1
  559. package/build/dist/UI/Components/SideOver/SideOver.js +5 -20
  560. package/build/dist/UI/Components/SideOver/SideOver.js.map +1 -1
  561. package/build/dist/UI/Utils/PageScrollLock.js +31 -3
  562. package/build/dist/UI/Utils/PageScrollLock.js.map +1 -1
  563. package/build/dist/UI/Utils/PermissionGate.js +42 -1
  564. package/build/dist/UI/Utils/PermissionGate.js.map +1 -1
  565. package/build/dist/UI/Utils/SensitiveUrlToken.js +97 -0
  566. package/build/dist/UI/Utils/SensitiveUrlToken.js.map +1 -0
  567. package/build/dist/UI/Utils/TestLLMProvider.js +4 -5
  568. package/build/dist/UI/Utils/TestLLMProvider.js.map +1 -1
  569. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js +15 -0
  570. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js.map +1 -1
  571. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js +111 -9
  572. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js.map +1 -1
  573. package/build/dist/Utils/Monitor/MonitorMetricType.js +109 -1
  574. package/build/dist/Utils/Monitor/MonitorMetricType.js.map +1 -1
  575. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +8 -3
  576. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
  577. package/build/dist/Utils/NetworkDevice/DeviceHealthStateUtil.js +27 -7
  578. package/build/dist/Utils/NetworkDevice/DeviceHealthStateUtil.js.map +1 -1
  579. package/build/dist/Utils/NetworkDevice/DeviceReachabilityUtil.js +7 -5
  580. package/build/dist/Utils/NetworkDevice/DeviceReachabilityUtil.js.map +1 -1
  581. package/build/dist/Utils/NetworkDevice/NetworkAlertPolicyBootstrapUtil.js +180 -0
  582. package/build/dist/Utils/NetworkDevice/NetworkAlertPolicyBootstrapUtil.js.map +1 -0
  583. package/build/dist/Utils/NetworkDevice/SnmpCredentialUtil.js +12 -0
  584. package/build/dist/Utils/NetworkDevice/SnmpCredentialUtil.js.map +1 -0
  585. package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js +15 -5
  586. package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js.map +1 -1
  587. package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js +44 -15
  588. package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js.map +1 -1
  589. package/build/dist/Utils/NetworkDiscovery/DiscoveryImportEligibility.js +52 -23
  590. package/build/dist/Utils/NetworkDiscovery/DiscoveryImportEligibility.js.map +1 -1
  591. package/build/dist/Utils/NetworkDiscovery/PingMonitorBuilder.js +85 -13
  592. package/build/dist/Utils/NetworkDiscovery/PingMonitorBuilder.js.map +1 -1
  593. package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js +30 -15
  594. package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js.map +1 -1
  595. package/build/dist/Utils/NetworkSite/TypeHierarchyUtil.js +191 -0
  596. package/build/dist/Utils/NetworkSite/TypeHierarchyUtil.js.map +1 -0
  597. package/package.json +2 -2
@@ -1,6 +1,8 @@
1
1
  import DatabaseConfig from "../DatabaseConfig";
2
+ import { EncryptionSecret } from "../EnvironmentConfig";
2
3
  import CreateBy from "../Types/Database/CreateBy";
3
- import { OnCreate } from "../Types/Database/Hooks";
4
+ import UpdateBy from "../Types/Database/UpdateBy";
5
+ import { OnCreate, OnUpdate } from "../Types/Database/Hooks";
4
6
  import logger from "../Utils/Logger";
5
7
  import DatabaseService from "./DatabaseService";
6
8
  import MailService from "./MailService";
@@ -13,6 +15,9 @@ import Protocol from "../../Types/API/Protocol";
13
15
  import URL from "../../Types/API/URL";
14
16
  import OneUptimeDate from "../../Types/Date";
15
17
  import EmailTemplateType from "../../Types/Email/EmailTemplateType";
18
+ import LIMIT_MAX from "../../Types/Database/LimitMax";
19
+ import Email from "../../Types/Email";
20
+ import HashedString from "../../Types/HashedString";
16
21
  import BadDataException from "../../Types/Exception/BadDataException";
17
22
  import ObjectID from "../../Types/ObjectID";
18
23
  import StatusPage from "../../Models/DatabaseModels/StatusPage";
@@ -55,17 +60,112 @@ export class Service extends DatabaseService<Model> {
55
60
  };
56
61
  }
57
62
 
63
+ /**
64
+ * Kill any outstanding password-reset link for a status page user whose
65
+ * email address is about to change.
66
+ *
67
+ * Same invariant, and the same reasoning, as
68
+ * `UserService.expirePasswordResetTokensForEmailChange`: the link is a
69
+ * bearer credential addressed to one mailbox, and `/status-page-api/
70
+ * reset-password` finds the row by token hash and status page alone, never
71
+ * by the address the link was mailed to. Left unexpired, a link sent to the
72
+ * old address keeps working against the account at its new one.
73
+ *
74
+ * This path is worth closing even though a status page user cannot edit
75
+ * their own email: project admins can (the column carries `update` for
76
+ * ProjectAdmin and StatusPageAdmin), and `StatusPageSCIM.ts` rewrites it
77
+ * from the directory. "Move this subscriber to their new address" is the
78
+ * same rescue action, done by somebody else on the user's behalf, and it has
79
+ * to invalidate old links for the same reason.
80
+ *
81
+ * Cleared before the write, and only for rows whose address actually
82
+ * changes, so a SCIM push that re-sends an unchanged address does not
83
+ * invalidate a reset link the user is part-way through using.
84
+ */
85
+ @CaptureSpan()
86
+ protected override async onBeforeUpdate(
87
+ updateBy: UpdateBy<Model>,
88
+ ): Promise<OnUpdate<Model>> {
89
+ if (updateBy.data.email) {
90
+ const newEmail: string = (updateBy.data.email as Email)
91
+ .toString()
92
+ .toLowerCase();
93
+
94
+ const existingUsers: Array<Model> = await this.findBy({
95
+ query: updateBy.query,
96
+ select: {
97
+ _id: true,
98
+ email: true,
99
+ },
100
+ props: updateBy.props,
101
+ limit: LIMIT_MAX,
102
+ skip: 0,
103
+ });
104
+
105
+ for (const user of existingUsers) {
106
+ if (!user.id) {
107
+ continue;
108
+ }
109
+
110
+ /*
111
+ * A row whose `email` did not come back is treated as changed -- that
112
+ * only happens when the caller could not read the column, and on a
113
+ * credential the safe assumption is the one that expires the token.
114
+ */
115
+ const currentEmail: string | undefined = user.email
116
+ ?.toString()
117
+ .toLowerCase();
118
+
119
+ if (currentEmail === newEmail) {
120
+ continue;
121
+ }
122
+
123
+ await this.updateOneById({
124
+ id: user.id,
125
+ data: {
126
+ resetPasswordToken: null!,
127
+ resetPasswordExpires: null!,
128
+ },
129
+ props: {
130
+ isRoot: true,
131
+ ignoreHooks: true,
132
+ },
133
+ });
134
+ }
135
+ }
136
+
137
+ return {
138
+ updateBy: updateBy,
139
+ carryForward: null,
140
+ };
141
+ }
142
+
58
143
  @CaptureSpan()
59
144
  protected override async onCreateSuccess(
60
145
  _onCreate: OnCreate<Model>,
61
146
  createdItem: Model,
62
147
  ): Promise<Model> {
63
- // send email to the user.
148
+ /*
149
+ * The invite link doubles as this user's first password-reset link, so the
150
+ * column has to hold what `/status-page-api/reset-password` looks rows up
151
+ * by: the SHA-256 of the token, never the token itself. That endpoint
152
+ * hashes whatever the link carried and queries by the digest, so a raw
153
+ * token stored here matches nothing and the welcome link is dead on
154
+ * arrival -- and it would also leave a working bearer credential sitting
155
+ * in the database in plaintext.
156
+ *
157
+ * Same split as `/status-page-api/forgot-password`: the digest is
158
+ * persisted, the raw token is only ever mailed.
159
+ */
64
160
  const token: string = ObjectID.generate().toString();
161
+ const hashedToken: string = await HashedString.hashValue(
162
+ token,
163
+ EncryptionSecret,
164
+ );
65
165
  await this.updateOneById({
66
166
  id: createdItem.id!,
67
167
  data: {
68
- resetPasswordToken: token,
168
+ resetPasswordToken: hashedToken,
69
169
  resetPasswordExpires: OneUptimeDate.getOneDayAfter(),
70
170
  },
71
171
  props: {
@@ -0,0 +1,78 @@
1
+ import CreateBy from "../Types/Database/CreateBy";
2
+ import DeleteBy from "../Types/Database/DeleteBy";
3
+ import UpdateBy from "../Types/Database/UpdateBy";
4
+ import { OnCreate, OnDelete, OnUpdate } from "../Types/Database/Hooks";
5
+ import DatabaseService from "./DatabaseService";
6
+ import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
7
+ import { ROLLUP_BATCH_RETENTION_DAYS } from "../Utils/EmailRollup/EmailRollupConstants";
8
+ import Model from "../../Models/DatabaseModels/UserNotificationEmailRollupBatch";
9
+ import NotAuthorizedException from "../../Types/Exception/NotAuthorizedException";
10
+
11
+ /*
12
+ * The rollup claim ledger. Root only in every direction: an insert here is
13
+ * what wins an epoch, so a caller who could create one could stop the next
14
+ * rollup being sent, and one who could delete one could make it be sent
15
+ * twice.
16
+ *
17
+ * Retention is set UNCONDITIONALLY, deliberately unlike EmailLogService,
18
+ * which only registers its retention when billing is enabled. The
19
+ * HardDelete:HardDeleteOlderItemsInDatabase cron iterates every service in
20
+ * the Services array with no billing check, so a gated call would simply
21
+ * never prune on a self-hosted install.
22
+ *
23
+ * Thirty days rather than the items' seven: a batch row is the record of how
24
+ * many notifications one email replaced, which is the number the whole
25
+ * feature is judged on, and it is one row per flush rather than one per
26
+ * notification. Pruning it cannot orphan anything, because rollupBatchId on
27
+ * the item table is deliberately a bare column with no foreign key.
28
+ */
29
+ export class Service extends DatabaseService<Model> {
30
+ public constructor() {
31
+ super(Model);
32
+ this.hardDeleteItemsOlderThanInDays(
33
+ "createdAt",
34
+ ROLLUP_BATCH_RETENTION_DAYS,
35
+ );
36
+ }
37
+
38
+ @CaptureSpan()
39
+ protected override async onBeforeCreate(
40
+ createBy: CreateBy<Model>,
41
+ ): Promise<OnCreate<Model>> {
42
+ if (!createBy.props.isRoot) {
43
+ throw new NotAuthorizedException(
44
+ "Notification email rollup batches are claimed by the flush worker only.",
45
+ );
46
+ }
47
+
48
+ return { createBy, carryForward: null };
49
+ }
50
+
51
+ @CaptureSpan()
52
+ protected override async onBeforeUpdate(
53
+ updateBy: UpdateBy<Model>,
54
+ ): Promise<OnUpdate<Model>> {
55
+ if (!updateBy.props.isRoot) {
56
+ throw new NotAuthorizedException(
57
+ "Notification email rollup batches are claimed by the flush worker only.",
58
+ );
59
+ }
60
+
61
+ return { updateBy, carryForward: null };
62
+ }
63
+
64
+ @CaptureSpan()
65
+ protected override async onBeforeDelete(
66
+ deleteBy: DeleteBy<Model>,
67
+ ): Promise<OnDelete<Model>> {
68
+ if (!deleteBy.props.isRoot) {
69
+ throw new NotAuthorizedException(
70
+ "Notification email rollup batches are claimed by the flush worker only.",
71
+ );
72
+ }
73
+
74
+ return { deleteBy, carryForward: null };
75
+ }
76
+ }
77
+
78
+ export default new Service();
@@ -0,0 +1,79 @@
1
+ import CreateBy from "../Types/Database/CreateBy";
2
+ import DeleteBy from "../Types/Database/DeleteBy";
3
+ import UpdateBy from "../Types/Database/UpdateBy";
4
+ import { OnCreate, OnDelete, OnUpdate } from "../Types/Database/Hooks";
5
+ import DatabaseService from "./DatabaseService";
6
+ import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
7
+ import { ROLLUP_ITEM_RETENTION_DAYS } from "../Utils/EmailRollup/EmailRollupConstants";
8
+ import Model from "../../Models/DatabaseModels/UserNotificationEmailRollupItem";
9
+ import NotAuthorizedException from "../../Types/Exception/NotAuthorizedException";
10
+
11
+ /*
12
+ * The owner-email rollup queue and volume ledger. Root only in every
13
+ * direction: a pending row is the thing that makes a deferred notification
14
+ * eventually arrive, so nothing outside the notification write path and the
15
+ * flush sweep may insert, edit or remove one.
16
+ *
17
+ * Retention is set UNCONDITIONALLY, deliberately unlike EmailLogService,
18
+ * which only registers its retention when billing is enabled. The
19
+ * HardDelete:HardDeleteOlderItemsInDatabase cron iterates every service in
20
+ * the Services array and honours whatever retention it declares, with no
21
+ * billing check anywhere in the loop - so gating the call on IsBillingEnabled
22
+ * would leave a self-hosted install accumulating one row per owner email
23
+ * forever, which for the exact customer this feature exists for is thousands
24
+ * of rows a day.
25
+ *
26
+ * Seven days is chosen against the two things that read the table: the burst
27
+ * counter, which looks back BURST_WINDOW_MINUTES, and a human answering "what
28
+ * flooded this inbox last week".
29
+ */
30
+ export class Service extends DatabaseService<Model> {
31
+ public constructor() {
32
+ super(Model);
33
+ this.hardDeleteItemsOlderThanInDays(
34
+ "createdAt",
35
+ ROLLUP_ITEM_RETENTION_DAYS,
36
+ );
37
+ }
38
+
39
+ @CaptureSpan()
40
+ protected override async onBeforeCreate(
41
+ createBy: CreateBy<Model>,
42
+ ): Promise<OnCreate<Model>> {
43
+ if (!createBy.props.isRoot) {
44
+ throw new NotAuthorizedException(
45
+ "Notification email rollup items are written by the notification pipeline only.",
46
+ );
47
+ }
48
+
49
+ return { createBy, carryForward: null };
50
+ }
51
+
52
+ @CaptureSpan()
53
+ protected override async onBeforeUpdate(
54
+ updateBy: UpdateBy<Model>,
55
+ ): Promise<OnUpdate<Model>> {
56
+ if (!updateBy.props.isRoot) {
57
+ throw new NotAuthorizedException(
58
+ "Notification email rollup items are written by the notification pipeline only.",
59
+ );
60
+ }
61
+
62
+ return { updateBy, carryForward: null };
63
+ }
64
+
65
+ @CaptureSpan()
66
+ protected override async onBeforeDelete(
67
+ deleteBy: DeleteBy<Model>,
68
+ ): Promise<OnDelete<Model>> {
69
+ if (!deleteBy.props.isRoot) {
70
+ throw new NotAuthorizedException(
71
+ "Notification email rollup items are written by the notification pipeline only.",
72
+ );
73
+ }
74
+
75
+ return { deleteBy, carryForward: null };
76
+ }
77
+ }
78
+
79
+ export default new Service();
@@ -0,0 +1,113 @@
1
+ import DatabaseService from "./DatabaseService";
2
+ import CreateBy from "../Types/Database/CreateBy";
3
+ import { OnCreate } from "../Types/Database/Hooks";
4
+ import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
5
+ import Model from "../../Models/DatabaseModels/UserNotificationEmailRollupSetting";
6
+ import BadDataException from "../../Types/Exception/BadDataException";
7
+ import ObjectID from "../../Types/ObjectID";
8
+
9
+ /*
10
+ * The escape hatch from owner-email burst rollup, one row per (user, project).
11
+ *
12
+ * The read below is the ONLY place the preference is consulted, and it is
13
+ * deliberately not cached. A cache would mean a person who has just clicked
14
+ * "send me every email immediately" keeps getting batched mail for the length
15
+ * of the TTL - which is precisely the complaint the toggle exists to answer,
16
+ * reproduced by the mechanism meant to serve it. The query is a single indexed
17
+ * row on a table with at most one row per project member, on a path that
18
+ * already runs a dozen queries, and the write path only reaches it when it is
19
+ * about to DEFER - never on the common below-the-threshold send.
20
+ */
21
+ export class Service extends DatabaseService<Model> {
22
+ public constructor() {
23
+ super(Model);
24
+ }
25
+
26
+ /*
27
+ * True when this person's owner notification emails may be coalesced.
28
+ *
29
+ * Absent row means enabled. Rollup ships on by default with no backfill, so
30
+ * almost nobody has a row here; treating "no row" as anything other than the
31
+ * default would make the feature depend on data that does not exist.
32
+ *
33
+ * This does NOT swallow errors. The one caller reads it inside the write
34
+ * path's fail-open catch, which turns any failure into an immediate send -
35
+ * the same direction this method's `false` means, and the same direction
36
+ * every other failure in that path takes.
37
+ */
38
+ @CaptureSpan()
39
+ public async isRollupEnabledForUser(data: {
40
+ userId: ObjectID;
41
+ projectId: ObjectID;
42
+ }): Promise<boolean> {
43
+ const setting: Model | null = await this.findOneBy({
44
+ query: {
45
+ userId: data.userId,
46
+ projectId: data.projectId,
47
+ },
48
+ select: {
49
+ isEnabled: true,
50
+ },
51
+ props: {
52
+ isRoot: true,
53
+ },
54
+ });
55
+
56
+ if (!setting) {
57
+ return true;
58
+ }
59
+
60
+ /*
61
+ * Only an explicit false opts out. A row whose isEnabled somehow arrived
62
+ * NULL - a hand-written insert, a column added ahead of its default - is
63
+ * not an opt-out, because opting somebody out of individual emails is the
64
+ * change that needs to have been asked for.
65
+ */
66
+ return setting.isEnabled !== false;
67
+ }
68
+
69
+ @CaptureSpan()
70
+ protected override async onBeforeCreate(
71
+ createBy: CreateBy<Model>,
72
+ ): Promise<OnCreate<Model>> {
73
+ if (!createBy.data.projectId) {
74
+ throw new BadDataException("projectId is required");
75
+ }
76
+
77
+ if (!createBy.data.userId) {
78
+ throw new BadDataException("userId is required");
79
+ }
80
+
81
+ /*
82
+ * One row per person per project. The page creates lazily on the first
83
+ * toggle, so a double click or two open tabs would otherwise leave two
84
+ * rows and make findOneBy's answer depend on which one it happened to
85
+ * pick. There is no unique index behind this check - the same
86
+ * check-then-create shape UserNotificationSettingService.onBeforeCreate
87
+ * already uses - so it narrows the window rather than closing it; the read
88
+ * above tolerates a duplicate because both rows say the same thing in
89
+ * every flow the UI can produce.
90
+ */
91
+ const existingCount: number = (
92
+ await this.countBy({
93
+ query: {
94
+ projectId: createBy.data.projectId,
95
+ userId: createBy.data.userId,
96
+ },
97
+ props: {
98
+ isRoot: true,
99
+ },
100
+ })
101
+ ).toNumber();
102
+
103
+ if (existingCount > 0) {
104
+ throw new BadDataException(
105
+ "An email rollup setting already exists for this user in this project.",
106
+ );
107
+ }
108
+
109
+ return { createBy, carryForward: null };
110
+ }
111
+ }
112
+
113
+ export default new Service();
@@ -3,7 +3,6 @@ import { OnCreate } from "../Types/Database/Hooks";
3
3
  import logger from "../Utils/Logger";
4
4
  import CallService from "./CallService";
5
5
  import DatabaseService from "./DatabaseService";
6
- import MailService from "./MailService";
7
6
  import ProjectCallSMSConfigService from "./ProjectCallSMSConfigService";
8
7
  import SmsService from "./SmsService";
9
8
  import TeamMemberService from "./TeamMemberService";
@@ -51,6 +50,7 @@ import {
51
50
  WorkspaceMessageBlock,
52
51
  WorkspacePayloadMarkdown,
53
52
  } from "../../Types/Workspace/WorkspaceMessagePayload";
53
+ import EmailRollupWriter from "../Utils/EmailRollup/EmailRollupWriter";
54
54
  import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
55
55
  import { appendRecipientToWhatsAppMessage } from "../Utils/WhatsAppTemplateUtil";
56
56
 
@@ -76,6 +76,16 @@ export class Service extends DatabaseService<UserNotificationSetting> {
76
76
  */
77
77
  whatsAppMessage?: WhatsAppMessagePayload | undefined;
78
78
  telegramMessage?: TelegramMessagePayload | undefined;
79
+ /*
80
+ * Bypasses burst coalescing for this send, before any rollup bookkeeping
81
+ * runs. Some producers reuse another family's event type: the SLA-breach
82
+ * job at App/FeatureSet/Workers/Jobs/IncidentSla/CheckSlaBreaches.ts sends
83
+ * under EmailTemplateType.IncidentOwnerResourceCreated at :265 and reuses
84
+ * SEND_INCIDENT_CREATED_OWNER_NOTIFICATION at :286, so the event type
85
+ * alone cannot express that this particular message is urgent. Only a
86
+ * caller knows that, so only a caller can say so.
87
+ */
88
+ forceImmediate?: boolean | undefined;
79
89
  incidentId?: ObjectID | undefined;
80
90
  alertId?: ObjectID | undefined;
81
91
  alertEpisodeId?: ObjectID | undefined;
@@ -140,33 +150,60 @@ export class Service extends DatabaseService<UserNotificationSetting> {
140
150
  });
141
151
 
142
152
  for (const userEmail of userEmails) {
143
- MailService.sendMail(
144
- {
145
- ...data.emailEnvelope,
146
- toEmail: userEmail.email!,
147
- },
148
- {
153
+ /*
154
+ * The one seam where an owner email can be held back. Below the
155
+ * burst threshold this is byte-for-byte the send that was here
156
+ * before - same envelope, same correlation ids, still
157
+ * fire-and-forget inside the writer - and above it the message is
158
+ * queued for a rollup instead of dropped. Awaited, unlike the raw
159
+ * send it replaces, because the queue row has to exist before this
160
+ * method returns; the writer itself never awaits MailService.
161
+ *
162
+ * data.emailEnvelope is passed by reference and is never mutated by
163
+ * the writer, which the Telegram fallback below and the Slack /
164
+ * Microsoft Teams bodies further down depend on: all three
165
+ * synthesise their message from data.emailEnvelope.subject.
166
+ *
167
+ * Guarded even though sendOrRollup is written not to throw. The send
168
+ * it replaces was fire-and-forget, so one bad address could never
169
+ * cost another address its email - let alone cost this notification
170
+ * its SMS, call, push, Telegram, workspace and webhook deliveries
171
+ * further down. Awaiting reintroduces that possibility; this catch
172
+ * takes it back out.
173
+ */
174
+ try {
175
+ await EmailRollupWriter.sendOrRollup({
149
176
  projectId: data.projectId,
150
- incidentId: data.incidentId,
151
- alertId: data.alertId,
152
- alertEpisodeId: data.alertEpisodeId,
153
- incidentEpisodeId: data.incidentEpisodeId,
154
- monitorId: data.monitorId,
155
- scheduledMaintenanceId: data.scheduledMaintenanceId,
156
- statusPageId: data.statusPageId,
157
- statusPageAnnouncementId: data.statusPageAnnouncementId,
158
177
  userId: data.userId,
159
- teamId: data.teamId,
160
- // OnCall-related fields
161
- onCallPolicyId: data.onCallPolicyId,
162
- onCallPolicyEscalationRuleId: data.onCallPolicyEscalationRuleId,
163
- onCallDutyPolicyExecutionLogTimelineId:
164
- data.onCallDutyPolicyExecutionLogTimelineId,
165
- onCallScheduleId: data.onCallScheduleId,
166
- },
167
- ).catch((err: Error) => {
178
+ toEmail: userEmail.email!,
179
+ eventType: data.eventType,
180
+ emailEnvelope: data.emailEnvelope,
181
+ mailOptions: {
182
+ projectId: data.projectId,
183
+ incidentId: data.incidentId,
184
+ alertId: data.alertId,
185
+ alertEpisodeId: data.alertEpisodeId,
186
+ incidentEpisodeId: data.incidentEpisodeId,
187
+ monitorId: data.monitorId,
188
+ scheduledMaintenanceId: data.scheduledMaintenanceId,
189
+ statusPageId: data.statusPageId,
190
+ statusPageAnnouncementId: data.statusPageAnnouncementId,
191
+ userId: data.userId,
192
+ teamId: data.teamId,
193
+ // OnCall-related fields
194
+ onCallPolicyId: data.onCallPolicyId,
195
+ onCallPolicyEscalationRuleId: data.onCallPolicyEscalationRuleId,
196
+ onCallDutyPolicyExecutionLogTimelineId:
197
+ data.onCallDutyPolicyExecutionLogTimelineId,
198
+ onCallScheduleId: data.onCallScheduleId,
199
+ },
200
+ ...(data.forceImmediate !== undefined && {
201
+ forceImmediate: data.forceImmediate,
202
+ }),
203
+ });
204
+ } catch (err) {
168
205
  logger.error(err);
169
- });
206
+ }
170
207
  }
171
208
  }
172
209
 
@@ -353,6 +353,13 @@ export class Service extends DatabaseService<Model> {
353
353
  carryForward = users;
354
354
  }
355
355
 
356
+ if (updateBy.data.email) {
357
+ await this.expirePasswordResetTokensForEmailChange({
358
+ newEmail: updateBy.data.email as Email,
359
+ existingUsers: carryForward,
360
+ });
361
+ }
362
+
356
363
  /*
357
364
  * There used to be a guard here refusing to set `enableTwoFactorAuth` on
358
365
  * an account with no verified authenticator, on the grounds that doing so
@@ -412,6 +419,94 @@ export class Service extends DatabaseService<Model> {
412
419
  return { updateBy, carryForward: carryForward };
413
420
  }
414
421
 
422
+ /**
423
+ * Kill any outstanding password-reset link for every account whose email
424
+ * address this update is about to change.
425
+ *
426
+ * A reset link is a bearer credential addressed to ONE mailbox: holding it
427
+ * proves only that somebody could read mail sent to the address the account
428
+ * had when the link was minted. Move the account to a different address and
429
+ * that proof is about a mailbox the account no longer uses, so the link has
430
+ * to die with the address it was sent to.
431
+ *
432
+ * Without this, changing your email is not the account-recovery step that
433
+ * users -- and our own "You have changed your email" mail -- take it to be:
434
+ *
435
+ * 1. An attacker who can read the victim's mailbox requests a password
436
+ * reset and does NOT spend the link. Nothing about the account looks
437
+ * wrong, because nothing has changed yet.
438
+ * 2. The victim notices the mailbox is compromised and moves the account
439
+ * to an address the attacker cannot read. This is exactly the advice
440
+ * they would be given, and they now believe they are safe.
441
+ * 3. The attacker spends the link from step 1. `/reset-password` finds the
442
+ * row BY TOKEN HASH ALONE -- it never looks at the email address -- so
443
+ * it happily sets a new password on the account at its NEW address, and
444
+ * the victim is locked out of an account they had just rescued.
445
+ *
446
+ * Cleared BEFORE the email is written rather than afterwards in
447
+ * `onUpdateSuccess`, so there is no instant in which the new address is
448
+ * committed while a link mailed to the old one is still redeemable. The
449
+ * price of that ordering is that an email update which subsequently fails
450
+ * has still burned a pending link, and the user has to request another one.
451
+ * For a credential that is the right way round.
452
+ *
453
+ * Only rows whose address actually CHANGES are touched. Directory syncs
454
+ * rewrite `email` with the value it already has on every push (see
455
+ * `App/FeatureSet/Identity/API/SCIM.ts`, which updates whenever either the
456
+ * email or the name is present), and clearing on those would let an
457
+ * unrelated SCIM run invalidate a reset link the user is part-way through
458
+ * using.
459
+ *
460
+ * A row that came back with no `email` at all is treated as changed. That
461
+ * happens when the caller could not read the column, and on a credential the
462
+ * safe assumption is the one that expires the token.
463
+ *
464
+ * NOTE: this runs from `onBeforeUpdate`, so an email write made with
465
+ * `ignoreHooks: true` would slip past it. Nothing does that today -- the
466
+ * dashboard, the SCIM endpoints and the admin API all go through the hooks
467
+ * -- and any new caller that writes `email` hook-free has to clear these two
468
+ * columns itself.
469
+ */
470
+ @CaptureSpan()
471
+ private async expirePasswordResetTokensForEmailChange(data: {
472
+ newEmail: Email;
473
+ existingUsers: Array<Model>;
474
+ }): Promise<void> {
475
+ const newEmail: string = data.newEmail.toString().toLowerCase();
476
+
477
+ for (const user of data.existingUsers) {
478
+ if (!user.id) {
479
+ continue;
480
+ }
481
+
482
+ const currentEmail: string | undefined = user.email
483
+ ?.toString()
484
+ .toLowerCase();
485
+
486
+ if (currentEmail === newEmail) {
487
+ continue;
488
+ }
489
+
490
+ await this.updateOneById({
491
+ id: user.id,
492
+ data: {
493
+ resetPasswordToken: null!,
494
+ resetPasswordExpires: null!,
495
+ },
496
+ /*
497
+ * Root because `resetPasswordToken` is declared with `update: []` --
498
+ * no permission can write it -- and hook-free because this IS the
499
+ * update hook; re-entering it would have this write go looking for an
500
+ * email change of its own.
501
+ */
502
+ props: {
503
+ isRoot: true,
504
+ ignoreHooks: true,
505
+ },
506
+ });
507
+ }
508
+ }
509
+
415
510
  @CaptureSpan()
416
511
  protected override async onBeforeDelete(
417
512
  deleteBy: DeleteBy<Model>,
@@ -656,7 +656,7 @@ export default class QueryHelper {
656
656
  }
657
657
 
658
658
  @CaptureSpan()
659
- public static greaterThan<T extends number | Date>(
659
+ public static greaterThan<T extends number | Date | ObjectID>(
660
660
  value: T,
661
661
  ): FindWhereProperty<any> {
662
662
  const rid: string = Text.generateRandomText(10);
@@ -665,7 +665,7 @@ export default class QueryHelper {
665
665
  return `(${alias} > :${rid})`;
666
666
  },
667
667
  {
668
- [rid]: value,
668
+ [rid]: value instanceof ObjectID ? value.toString() : value,
669
669
  },
670
670
  ) as FindWhereProperty<any>;
671
671
  }
@@ -61,14 +61,25 @@ function buildEntityContextGuidance(context: AIChatPageContext): string {
61
61
  }
62
62
  }
63
63
 
64
+ /*
65
+ * Per-area guidance for list and explorer pages. This text is the only
66
+ * capability claim in the request that is scoped to the page the user is on,
67
+ * so the model weighs it against the tool schemas — which means it must never
68
+ * describe a tool as NARROWER than it is. It previously summarised
69
+ * query_incidents as "recent incidents, or one by incidentId", and the model
70
+ * paraphrased that back as "I have no tool to list active incidents, give me
71
+ * an incidentId" on the very page whose own suggested prompt card asks
72
+ * "which incidents are currently active or unresolved?". Every affordance an
73
+ * area page's suggested prompts depend on has to be named here.
74
+ */
64
75
  function buildAreaContextGuidance(type: AIChatPageContextType): string {
65
76
  switch (type) {
66
77
  case AIChatPageContextType.IncidentsList:
67
- return `the incidents list. Questions about "these incidents" or incident activity are answered with query_incidents (recent incidents, or one by incidentId) and search_incidents (free-text search over past incidents).`;
78
+ return `the incidents list. Questions about "these incidents" or incident activity are answered with query_incidents: pass state="active" to list every incident that is unresolved RIGHT NOW (this drops the time window, so incidents opened weeks ago are still returned), leave state unset for recent activity in a window, or pass incidentId for one incident's full details. search_incidents does free-text search over past incidents.`;
68
79
  case AIChatPageContextType.AlertsList:
69
- return `the alerts list. Questions about alert activity are answered with query_alerts.`;
80
+ return `the alerts list. Questions about alert activity are answered with query_alerts: pass state="active" to list every alert that is unresolved RIGHT NOW regardless of age, leave state unset for recent activity in a window, or pass alertId for one alert's full details.`;
70
81
  case AIChatPageContextType.MonitorsList:
71
- return `the monitors list. Questions about monitors and their status are answered with query_monitors.`;
82
+ return `the monitors list. Questions about monitors and their status are answered with query_monitors: pass problemsOnly=true to list the monitors that are NOT operational right now, or monitorId for one monitor's details and its recent status timeline.`;
72
83
  case AIChatPageContextType.ScheduledMaintenanceList:
73
84
  return `the scheduled maintenance list. Questions about maintenance windows are answered with query_scheduled_maintenance (past, ongoing and upcoming events; one event by scheduledMaintenanceId). recent_changes also merges maintenance into a chronological feed alongside other changes.`;
74
85
  case AIChatPageContextType.LogsExplorer: