@oneuptime/common 12.0.32 → 12.0.33

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (597) hide show
  1. package/Models/AnalyticsModels/Span.ts +14 -0
  2. package/Models/DatabaseModels/EnterpriseLicense.ts +56 -0
  3. package/Models/DatabaseModels/Index.ts +10 -0
  4. package/Models/DatabaseModels/Monitor.ts +76 -0
  5. package/Models/DatabaseModels/NetworkAlertPolicy.ts +690 -0
  6. package/Models/DatabaseModels/NetworkDevice.ts +176 -1
  7. package/Models/DatabaseModels/NetworkSite.ts +201 -2
  8. package/Models/DatabaseModels/NetworkSiteType.ts +102 -3
  9. package/Models/DatabaseModels/NetworkSnmpCredentialProfile.ts +841 -0
  10. package/Models/DatabaseModels/TelemetryException.ts +119 -0
  11. package/Models/DatabaseModels/UserNotificationEmailRollupBatch.ts +334 -0
  12. package/Models/DatabaseModels/UserNotificationEmailRollupItem.ts +370 -0
  13. package/Models/DatabaseModels/UserNotificationEmailRollupSetting.ts +282 -0
  14. package/Server/API/EnterpriseLicenseAPI.ts +391 -64
  15. package/Server/API/LlmProviderAPI.ts +137 -22
  16. package/Server/EnvironmentConfig.ts +14 -0
  17. package/Server/Infrastructure/Postgres/SchemaMigrations/1790700000000-AddNetworkSiteTypeParentHierarchy.ts +55 -0
  18. package/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddEnterpriseLicenseUsageProvenance.ts +31 -0
  19. package/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddTelemetryExceptionErrorClass.ts +124 -0
  20. package/Server/Infrastructure/Postgres/SchemaMigrations/1791000000000-AddUserNotificationEmailRollup.ts +132 -0
  21. package/Server/Infrastructure/Postgres/SchemaMigrations/1791100000000-AddUserNotificationEmailRollupSetting.ts +79 -0
  22. package/Server/Infrastructure/Postgres/SchemaMigrations/1791200000000-AddNetworkSnmpCredentialProfilesAndAlertPolicies.ts +191 -0
  23. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +12 -0
  24. package/Server/Infrastructure/QueueWorker.ts +38 -8
  25. package/Server/Middleware/BearerTokenAuthorization.ts +12 -0
  26. package/Server/Middleware/ProjectAuthorization.ts +11 -0
  27. package/Server/Middleware/SCIMAuthorization.ts +12 -0
  28. package/Server/Middleware/TelemetryIngest.ts +11 -0
  29. package/Server/Services/AIBillingService.ts +101 -27
  30. package/Server/Services/EnterpriseLicenseInstanceService.ts +197 -0
  31. package/Server/Services/EnterpriseLicenseService.ts +55 -0
  32. package/Server/Services/Index.ts +10 -0
  33. package/Server/Services/MonitorService.ts +143 -21
  34. package/Server/Services/MonitorStatusTimelineService.ts +150 -8
  35. package/Server/Services/MonitorTemplateService.ts +217 -1
  36. package/Server/Services/NetworkAlertPolicyEngineService.ts +2159 -0
  37. package/Server/Services/NetworkAlertPolicyService.ts +944 -0
  38. package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +9 -10
  39. package/Server/Services/NetworkDeviceAutoImportRuleService.ts +60 -15
  40. package/Server/Services/NetworkDeviceService.ts +1032 -73
  41. package/Server/Services/NetworkSiteService.ts +1502 -129
  42. package/Server/Services/NetworkSiteTypeService.ts +1216 -0
  43. package/Server/Services/NetworkSnmpCredentialProfileService.ts +238 -0
  44. package/Server/Services/NotificationService.ts +118 -28
  45. package/Server/Services/ProjectService.ts +105 -48
  46. package/Server/Services/StatusPagePrivateUserService.ts +103 -3
  47. package/Server/Services/UserNotificationEmailRollupBatchService.ts +78 -0
  48. package/Server/Services/UserNotificationEmailRollupItemService.ts +79 -0
  49. package/Server/Services/UserNotificationEmailRollupSettingService.ts +113 -0
  50. package/Server/Services/UserNotificationSettingService.ts +62 -25
  51. package/Server/Services/UserService.ts +95 -0
  52. package/Server/Types/Database/QueryHelper.ts +2 -2
  53. package/Server/Utils/AI/Chat/ObservabilityChatPrompt.ts +14 -3
  54. package/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.ts +10 -0
  55. package/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.ts +10 -0
  56. package/Server/Utils/AI/SRE/Insights/InsightTriageRunner.ts +62 -1
  57. package/Server/Utils/AI/Toolbox/AlertTools.ts +15 -1
  58. package/Server/Utils/Billing/BillingFailureNoticeThrottle.ts +80 -0
  59. package/Server/Utils/DataSource/HttpFetch.ts +9 -2
  60. package/Server/Utils/EmailRollup/EmailRollupConstants.ts +98 -0
  61. package/Server/Utils/EmailRollup/EmailRollupFlushRunner.ts +872 -0
  62. package/Server/Utils/EmailRollup/EmailRollupRenderer.ts +781 -0
  63. package/Server/Utils/EmailRollup/EmailRollupWriter.ts +368 -0
  64. package/Server/Utils/LLM/LLMService.ts +78 -0
  65. package/Server/Utils/LogRedaction.ts +8 -0
  66. package/Server/Utils/Logger.ts +79 -1
  67. package/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.ts +190 -0
  68. package/Server/Utils/Monitor/Criteria/EvaluateOverTime.ts +9 -2
  69. package/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.ts +61 -1
  70. package/Server/Utils/Monitor/MonitorCriteriaDataExtractor.ts +14 -0
  71. package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +49 -0
  72. package/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.ts +255 -4
  73. package/Server/Utils/Monitor/MonitorMetricUtil.ts +41 -0
  74. package/Server/Utils/Monitor/MonitorTemplateUtil.ts +43 -0
  75. package/Server/Utils/Monitor/NetworkDeviceHydrationUtil.ts +499 -19
  76. package/Server/Utils/Monitor/NetworkDeviceMetricUtil.ts +66 -10
  77. package/Server/Utils/Monitor/NetworkDeviceWalkUtil.ts +238 -44
  78. package/Server/Utils/Monitor/NetworkInventoryUtil.ts +146 -39
  79. package/Server/Utils/NetworkDevice/DeviceHealthAggregation.ts +31 -18
  80. package/Server/Utils/NetworkSite/NetworkSiteHierarchyLock.ts +213 -0
  81. package/Server/Utils/OutboundUserAgent.ts +152 -0
  82. package/Server/Utils/StartServer.ts +51 -19
  83. package/Server/Utils/Telemetry/CaptureSpan.ts +32 -8
  84. package/Server/Utils/Telemetry/ErrorClassResolver.ts +120 -0
  85. package/Server/Utils/Telemetry/SpanUtil.ts +33 -0
  86. package/Server/Utils/Telemetry.ts +198 -51
  87. package/Server/Views/Partials/SensitiveUrlToken.ejs +140 -0
  88. package/Tests/App/Dashboard/AddNeighborToMonitoringModal.test.tsx +134 -33
  89. package/Tests/App/Dashboard/AskAiSuggestedPrompts.test.ts +279 -0
  90. package/Tests/App/Dashboard/DashboardEditPermissions.test.tsx +517 -0
  91. package/Tests/App/Dashboard/DashboardVariablesDiscard.test.tsx +26 -0
  92. package/Tests/App/Dashboard/DeviceStatusHero.test.tsx +588 -0
  93. package/Tests/App/Dashboard/DiscoveryScanWizardValidation.test.tsx +18 -9
  94. package/Tests/App/Dashboard/MonitorCreateFromMonitorBackedDevice.test.tsx +632 -0
  95. package/Tests/App/Dashboard/MonitorRecommendationCreateProgress.test.tsx +682 -0
  96. package/Tests/App/Dashboard/MonitorTypePicker.test.tsx +4 -2
  97. package/Tests/App/Dashboard/NetworkDeviceCreateFormMonitorBinding.test.tsx +676 -0
  98. package/Tests/App/Dashboard/NetworkDeviceCreateFormPingMonitor.test.tsx +791 -0
  99. package/Tests/App/Dashboard/NetworkDeviceCreateFormProbeAndSnmp.test.tsx +833 -0
  100. package/Tests/App/Dashboard/NetworkDeviceCriteriaFilter.test.ts +161 -0
  101. package/Tests/App/Dashboard/NetworkDeviceSettingsMonitoringSection.test.tsx +458 -0
  102. package/Tests/App/Dashboard/NetworkSideMenu.test.tsx +41 -5
  103. package/Tests/App/Dashboard/PingMonitorProvisioning.test.ts +368 -0
  104. package/Tests/App/Dashboard/RecommendationCard.test.tsx +796 -0
  105. package/Tests/App/Dashboard/RecommendationToolbar.test.tsx +519 -0
  106. package/Tests/App/Dashboard/RecommendationsList.test.tsx +661 -0
  107. package/Tests/App/Dashboard/UseBulkCreatePingMonitors.test.tsx +899 -0
  108. package/Tests/App/Dashboard/UseBulkSnmpCredentialProfileActions.test.tsx +732 -0
  109. package/Tests/App/SensitiveUrlTokenBootstrap.test.ts +256 -0
  110. package/Tests/App/StatusPage/StatusPageIndexPageRobotsMeta.test.ts +11 -1
  111. package/Tests/App/StatusPage/StatusPageLoginCodeBootstrap.test.ts +9 -4
  112. package/Tests/Models/NetworkSiteHierarchy.test.ts +41 -4
  113. package/Tests/Server/API/EnterpriseLicenseReportUserCount.test.ts +951 -7
  114. package/Tests/Server/API/LlmProviderConnectionTest.test.ts +522 -0
  115. package/Tests/Server/Infrastructure/Postgres/NetworkSnmpCredentialProfilesAndAlertPoliciesMigration.test.ts +854 -0
  116. package/Tests/Server/Infrastructure/Postgres/SchemaMigrationsOrdering.test.ts +18 -0
  117. package/Tests/Server/Infrastructure/Postgres/UserNotificationEmailRollupTableMigration.test.ts +535 -0
  118. package/Tests/Server/Services/AIChatPrivacyPin.test.ts +560 -0
  119. package/Tests/Server/Services/BillingRechargeOwnerEmailGuards.test.ts +783 -0
  120. package/Tests/Server/Services/EnterpriseLicenseInstanceServiceDeletionUsage.test.ts +707 -0
  121. package/Tests/Server/Services/EnterpriseLicenseServiceUsageAggregationLock.test.ts +329 -0
  122. package/Tests/Server/Services/MonitorServiceDeleteNetworkDeviceCleanup.test.ts +294 -0
  123. package/Tests/Server/Services/MonitorStatusBridgeProbePath.test.ts +802 -0
  124. package/Tests/Server/Services/MonitorStatusTimelineService.test.ts +72 -2
  125. package/Tests/Server/Services/NetworkAlertPolicyEngineHooks.test.ts +752 -0
  126. package/Tests/Server/Services/NetworkAlertPolicyEngineService.test.ts +1849 -0
  127. package/Tests/Server/Services/NetworkAlertPolicyModel.test.ts +1793 -0
  128. package/Tests/Server/Services/NetworkDeviceAutoImportRuleEngineService.test.ts +47 -4
  129. package/Tests/Server/Services/NetworkDeviceAutoImportRuleService.test.ts +97 -12
  130. package/Tests/Server/Services/NetworkDeviceAutoMonitorLifecycle.test.ts +148 -3
  131. package/Tests/Server/Services/NetworkDeviceMonitorBindingUpdateGuard.test.ts +514 -0
  132. package/Tests/Server/Services/NetworkDeviceMonitorStatusStamp.test.ts +447 -58
  133. package/Tests/Server/Services/NetworkDeviceMonitoringMethodTransition.test.ts +739 -0
  134. package/Tests/Server/Services/NetworkDevicePollingTenancy.test.ts +501 -0
  135. package/Tests/Server/Services/NetworkDeviceSiteDefaultProbe.test.ts +432 -0
  136. package/Tests/Server/Services/NetworkSiteMonitoringDefaults.test.ts +498 -0
  137. package/Tests/Server/Services/NetworkSiteRollupPolicyAndMaintenance.test.ts +337 -55
  138. package/Tests/Server/Services/NetworkSiteService.test.ts +1868 -131
  139. package/Tests/Server/Services/NetworkSiteTypeService.test.ts +1109 -0
  140. package/Tests/Server/Services/NetworkSnmpCredentialProfileModel.test.ts +926 -0
  141. package/Tests/Server/Services/NetworkSnmpCredentialProfileService.test.ts +796 -0
  142. package/Tests/Server/Services/ProjectServiceNetworkSiteTypeDefaults.test.ts +214 -0
  143. package/Tests/Server/Services/StatusPagePrivateUserEmailChangePasswordResetExpiry.test.ts +269 -0
  144. package/Tests/Server/Services/UserEmailChangePasswordResetExpiry.test.ts +472 -0
  145. package/Tests/Server/Services/UserNotificationEmailRollupModels.test.ts +569 -0
  146. package/Tests/Server/Services/UserNotificationEmailRollupSettingModel.test.ts +314 -0
  147. package/Tests/Server/Services/UserNotificationEmailRollupSettingService.test.ts +409 -0
  148. package/Tests/Server/Services/UserNotificationSettingRollupRouting.test.ts +856 -0
  149. package/Tests/Server/Services/UserNotificationSettingWorkspaceChannels.test.ts +102 -1
  150. package/Tests/Server/Types/Database/Permissions/DashboardAccessPermission.test.ts +321 -0
  151. package/Tests/Server/Types/Database/QueryHelperOperators.test.ts +17 -0
  152. package/Tests/Server/Utils/AI/AlertMonitorFilters.test.ts +124 -0
  153. package/Tests/Server/Utils/AI/Insights/InsightTriageRunner.test.ts +208 -0
  154. package/Tests/Server/Utils/AI/LLMServiceToolCalling.test.ts +235 -0
  155. package/Tests/Server/Utils/AI/ObservabilityChatPrompt.test.ts +253 -0
  156. package/Tests/Server/Utils/Captcha.test.ts +422 -0
  157. package/Tests/Server/Utils/DataSource/HttpFetch.test.ts +96 -2
  158. package/Tests/Server/Utils/Database/MigrationFailureLog.test.ts +466 -0
  159. package/Tests/Server/Utils/EmailRollup/EmailRollupFlushRunnerBehaviour.test.ts +1096 -0
  160. package/Tests/Server/Utils/EmailRollup/EmailRollupFlushRunnerClaim.test.ts +466 -0
  161. package/Tests/Server/Utils/EmailRollup/EmailRollupRenderer.test.ts +1428 -0
  162. package/Tests/Server/Utils/EmailRollup/EmailRollupTestHarness.ts +752 -0
  163. package/Tests/Server/Utils/EmailRollup/EmailRollupWriter.test.ts +864 -0
  164. package/Tests/Server/Utils/LoggerFaultDemotion.test.ts +346 -0
  165. package/Tests/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.test.ts +633 -0
  166. package/Tests/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.test.ts +196 -0
  167. package/Tests/Server/Utils/Monitor/DatabaseMetricWrite.test.ts +367 -0
  168. package/Tests/Server/Utils/Monitor/MonitorCriteriaObservationBuilderUnits.test.ts +100 -0
  169. package/Tests/Server/Utils/Monitor/MonitorStepResourceIdentity.test.ts +5 -0
  170. package/Tests/Server/Utils/Monitor/NetworkDeviceHydrationUtil.test.ts +512 -31
  171. package/Tests/Server/Utils/Monitor/NetworkDeviceMetricUtil.test.ts +252 -0
  172. package/Tests/Server/Utils/Monitor/NetworkDeviceWalkUtil.test.ts +479 -42
  173. package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +351 -5
  174. package/Tests/Server/Utils/NetworkDevice/DeviceHealthAggregation.test.ts +136 -12
  175. package/Tests/Server/Utils/NetworkSite/NetworkSiteHierarchyLock.test.ts +306 -0
  176. package/Tests/Server/Utils/OutboundUserAgent.test.ts +266 -0
  177. package/Tests/Server/Utils/SecurityEvent/ThreatIntel/TaxiiClientUserAgent.test.ts +141 -0
  178. package/Tests/Server/Utils/Telemetry/ErrorClassResolver.test.ts +298 -0
  179. package/Tests/Server/Utils/Telemetry.test.ts +456 -66
  180. package/Tests/Types/Monitor/DatabaseMetricCatalog.test.ts +388 -0
  181. package/Tests/Types/Monitor/MonitorStepDatabaseMonitor.test.ts +243 -0
  182. package/Tests/Types/Monitor/MonitorStepDefaultTelemetryConfig.test.ts +1 -0
  183. package/Tests/Types/Monitor/MonitorType.test.ts +1 -0
  184. package/Tests/Types/Monitor/MonitorTypeKeywords.test.ts +16 -7
  185. package/Tests/Types/Monitor/NetworkDeviceAlertPack.test.ts +60 -0
  186. package/Tests/Types/NetworkDevice/NetworkAlertPolicyScope.test.ts +655 -0
  187. package/Tests/Types/NetworkDevice/NetworkDeviceMonitoringMethod.test.ts +115 -26
  188. package/Tests/Types/NetworkSite/DefaultNetworkSiteType.test.ts +39 -0
  189. package/Tests/Types/NotificationSetting/NotificationEmailRollupPolicy.test.ts +299 -0
  190. package/Tests/Types/Telemetry/ErrorClass.test.ts +483 -0
  191. package/Tests/UI/Components/BasicRadioButtons.test.tsx +336 -0
  192. package/Tests/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.test.ts +15 -0
  193. package/Tests/UI/Components/ProgressBar.test.tsx +38 -2
  194. package/Tests/UI/Components/SideMenuItem.test.tsx +226 -4
  195. package/Tests/UI/Components/SideMenuSection.test.tsx +310 -0
  196. package/Tests/UI/Components/SideOverSubmitState.test.tsx +335 -0
  197. package/Tests/UI/Utils/PageScrollLock.test.tsx +377 -0
  198. package/Tests/UI/Utils/PermissionGate.test.ts +78 -0
  199. package/Tests/UI/Utils/SensitiveUrlToken.test.ts +140 -0
  200. package/Tests/Utils/EnterpriseLicenseSeats.test.ts +69 -0
  201. package/Tests/Utils/EnterpriseLicenseSync.test.ts +7 -1
  202. package/Tests/Utils/EnterpriseLicenseUsage.test.ts +433 -2
  203. package/Tests/Utils/Monitor/MonitorMetricType.test.ts +280 -1
  204. package/Tests/Utils/Monitor/MonitorSummarySnapshotUtil.test.ts +1 -0
  205. package/Tests/Utils/Monitor/NetworkTopologyUtil.test.ts +38 -0
  206. package/Tests/Utils/NetworkDevice/DeviceHealthStateUtil.test.ts +284 -23
  207. package/Tests/Utils/NetworkDevice/DeviceReachabilityUtil.test.ts +177 -0
  208. package/Tests/Utils/NetworkDevice/MonitoringMethodThreadedClassifiers.test.ts +992 -0
  209. package/Tests/Utils/NetworkDevice/NetworkAlertPolicyBootstrapUtil.test.ts +427 -0
  210. package/Tests/Utils/NetworkDevice/ReachabilityStampConsistency.test.ts +185 -0
  211. package/Tests/Utils/NetworkDevice/SnmpCredentialUtil.test.ts +268 -0
  212. package/Tests/Utils/NetworkDiscovery/AutoImportRuleMatcher.test.ts +55 -5
  213. package/Tests/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.test.ts +98 -21
  214. package/Tests/Utils/NetworkDiscovery/DiscoveryImportEligibility.test.ts +98 -20
  215. package/Tests/Utils/NetworkDiscovery/DiscoveryReverseDnsChain.test.ts +8 -7
  216. package/Tests/Utils/NetworkDiscovery/PingMonitorBuilderForAddress.test.ts +274 -0
  217. package/Tests/Utils/NetworkSite/SiteStatusRollupUtil.test.ts +230 -51
  218. package/Tests/Utils/NetworkSite/TypeHierarchyUtil.test.ts +209 -0
  219. package/Tests/Utils/Telemetry/CaptureSpanExportGating.test.ts +145 -0
  220. package/Types/AI/ExceptionAIClassification.ts +10 -24
  221. package/Types/Email/EmailTemplateType.ts +2 -0
  222. package/Types/EnterpriseLicense/EnterpriseLicenseInstanceSummary.ts +5 -0
  223. package/Types/EnterpriseLicense/EnterpriseLicenseUsageSnapshot.ts +13 -0
  224. package/Types/EnterpriseLicense/EnterpriseLicenseUserCountSource.ts +6 -0
  225. package/Types/Exception/ApiException.ts +10 -0
  226. package/Types/Exception/BadDataException.ts +11 -0
  227. package/Types/Exception/BadRequestException.ts +11 -0
  228. package/Types/Exception/Exception.ts +65 -0
  229. package/Types/Exception/ForbiddenException.ts +10 -0
  230. package/Types/Exception/NotAuthenticatedException.ts +10 -0
  231. package/Types/Exception/NotAuthorizedException.ts +10 -0
  232. package/Types/Exception/NotFoundException.ts +11 -0
  233. package/Types/Exception/PayloadTooLargeException.ts +11 -0
  234. package/Types/Exception/PaymentRequiredException.ts +10 -0
  235. package/Types/Exception/ServiceUnavailableException.ts +10 -0
  236. package/Types/Exception/SsoAuthorizationException.ts +10 -0
  237. package/Types/Exception/TenantNotFoundException.ts +11 -0
  238. package/Types/Exception/TimeoutException.ts +10 -0
  239. package/Types/Exception/TooManyRequestsException.ts +10 -0
  240. package/Types/Exception/UnableToReachServer.ts +10 -0
  241. package/Types/Exception/WebsiteRequestException.ts +10 -0
  242. package/Types/Monitor/CriteriaFilter.ts +60 -2
  243. package/Types/Monitor/DatabaseMetricCatalog.ts +693 -0
  244. package/Types/Monitor/DatabaseMonitor/DatabaseMonitorResponse.ts +83 -0
  245. package/Types/Monitor/MonitorCriteriaInstance.ts +76 -0
  246. package/Types/Monitor/MonitorMetricType.ts +71 -0
  247. package/Types/Monitor/MonitorStep.ts +76 -0
  248. package/Types/Monitor/MonitorStepDatabaseMonitor.ts +171 -0
  249. package/Types/Monitor/MonitorStepSqlMonitor.ts +2 -20
  250. package/Types/Monitor/MonitorType.ts +47 -1
  251. package/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.ts +22 -1
  252. package/Types/Monitor/SqlConnectionConfig.ts +31 -0
  253. package/Types/NetworkDevice/NetworkAlertPolicyScope.ts +343 -0
  254. package/Types/NetworkDevice/NetworkDeviceMonitoringMethod.ts +42 -22
  255. package/Types/NetworkSite/DefaultNetworkSiteTypeHierarchy.ts +30 -0
  256. package/Types/NotificationSetting/NotificationEmailRollupCategory.ts +255 -0
  257. package/Types/NotificationSetting/NotificationEmailRollupPolicy.ts +104 -0
  258. package/Types/Permission.ts +90 -0
  259. package/Types/Probe/ProbeMonitorResponse.ts +16 -0
  260. package/Types/Telemetry/ErrorClass.ts +274 -0
  261. package/Types/Telemetry/UnitOfWork.ts +59 -0
  262. package/UI/Components/CommandPalette/CommandPalette.tsx +2 -8
  263. package/UI/Components/EditionLabel/EditionLabel.tsx +4 -0
  264. package/UI/Components/Modal/Modal.tsx +2 -8
  265. package/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.ts +44 -0
  266. package/UI/Components/ProgressBar/ProgressBar.tsx +12 -1
  267. package/UI/Components/RadioButtons/BasicRadioButtons.tsx +37 -7
  268. package/UI/Components/SideMenu/SideMenu.tsx +123 -5
  269. package/UI/Components/SideMenu/SideMenuItem.tsx +76 -84
  270. package/UI/Components/SideMenu/SideMenuSection.tsx +55 -23
  271. package/UI/Components/SideOver/SideOver.tsx +21 -20
  272. package/UI/Utils/PageScrollLock.ts +79 -3
  273. package/UI/Utils/PermissionGate.ts +61 -0
  274. package/UI/Utils/SensitiveUrlToken.ts +112 -0
  275. package/UI/Utils/TestLLMProvider.ts +11 -0
  276. package/Utils/EnterpriseLicense/EnterpriseLicenseSeats.ts +16 -0
  277. package/Utils/EnterpriseLicense/EnterpriseLicenseUsage.ts +191 -11
  278. package/Utils/Monitor/MonitorMetricType.ts +153 -1
  279. package/Utils/Monitor/NetworkTopologyUtil.ts +23 -3
  280. package/Utils/NetworkDevice/DeviceHealthStateUtil.ts +65 -14
  281. package/Utils/NetworkDevice/DeviceReachabilityUtil.ts +43 -14
  282. package/Utils/NetworkDevice/NetworkAlertPolicyBootstrapUtil.ts +247 -0
  283. package/Utils/NetworkDevice/SnmpCredentialUtil.ts +68 -0
  284. package/Utils/NetworkDiscovery/AutoImportRuleMatcher.ts +15 -7
  285. package/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.ts +52 -17
  286. package/Utils/NetworkDiscovery/DiscoveryImportEligibility.ts +55 -23
  287. package/Utils/NetworkDiscovery/PingMonitorBuilder.ts +115 -13
  288. package/Utils/NetworkSite/SiteStatusRollupUtil.ts +66 -20
  289. package/Utils/NetworkSite/TypeHierarchyUtil.ts +313 -0
  290. package/build/dist/Models/AnalyticsModels/Span.js +14 -0
  291. package/build/dist/Models/AnalyticsModels/Span.js.map +1 -1
  292. package/build/dist/Models/DatabaseModels/EnterpriseLicense.js +59 -0
  293. package/build/dist/Models/DatabaseModels/EnterpriseLicense.js.map +1 -1
  294. package/build/dist/Models/DatabaseModels/Index.js +10 -0
  295. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  296. package/build/dist/Models/DatabaseModels/Monitor.js +75 -0
  297. package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
  298. package/build/dist/Models/DatabaseModels/NetworkAlertPolicy.js +713 -0
  299. package/build/dist/Models/DatabaseModels/NetworkAlertPolicy.js.map +1 -0
  300. package/build/dist/Models/DatabaseModels/NetworkDevice.js +180 -1
  301. package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
  302. package/build/dist/Models/DatabaseModels/NetworkSite.js +200 -2
  303. package/build/dist/Models/DatabaseModels/NetworkSite.js.map +1 -1
  304. package/build/dist/Models/DatabaseModels/NetworkSiteType.js +102 -3
  305. package/build/dist/Models/DatabaseModels/NetworkSiteType.js.map +1 -1
  306. package/build/dist/Models/DatabaseModels/NetworkSnmpCredentialProfile.js +878 -0
  307. package/build/dist/Models/DatabaseModels/NetworkSnmpCredentialProfile.js.map +1 -0
  308. package/build/dist/Models/DatabaseModels/TelemetryException.js +123 -0
  309. package/build/dist/Models/DatabaseModels/TelemetryException.js.map +1 -1
  310. package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupBatch.js +363 -0
  311. package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupBatch.js.map +1 -0
  312. package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupItem.js +402 -0
  313. package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupItem.js.map +1 -0
  314. package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupSetting.js +296 -0
  315. package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupSetting.js.map +1 -0
  316. package/build/dist/Server/API/EnterpriseLicenseAPI.js +273 -60
  317. package/build/dist/Server/API/EnterpriseLicenseAPI.js.map +1 -1
  318. package/build/dist/Server/API/LlmProviderAPI.js +108 -13
  319. package/build/dist/Server/API/LlmProviderAPI.js.map +1 -1
  320. package/build/dist/Server/EnvironmentConfig.js +12 -0
  321. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  322. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790700000000-AddNetworkSiteTypeParentHierarchy.js +24 -0
  323. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790700000000-AddNetworkSiteTypeParentHierarchy.js.map +1 -0
  324. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddEnterpriseLicenseUsageProvenance.js +16 -0
  325. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddEnterpriseLicenseUsageProvenance.js.map +1 -0
  326. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddTelemetryExceptionErrorClass.js +111 -0
  327. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddTelemetryExceptionErrorClass.js.map +1 -0
  328. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791000000000-AddUserNotificationEmailRollup.js +77 -0
  329. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791000000000-AddUserNotificationEmailRollup.js.map +1 -0
  330. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791100000000-AddUserNotificationEmailRollupSetting.js +50 -0
  331. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791100000000-AddUserNotificationEmailRollupSetting.js.map +1 -0
  332. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791200000000-AddNetworkSnmpCredentialProfilesAndAlertPolicies.js +83 -0
  333. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791200000000-AddNetworkSnmpCredentialProfilesAndAlertPolicies.js.map +1 -0
  334. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +12 -0
  335. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  336. package/build/dist/Server/Infrastructure/QueueWorker.js +33 -5
  337. package/build/dist/Server/Infrastructure/QueueWorker.js.map +1 -1
  338. package/build/dist/Server/Middleware/BearerTokenAuthorization.js +12 -0
  339. package/build/dist/Server/Middleware/BearerTokenAuthorization.js.map +1 -1
  340. package/build/dist/Server/Middleware/ProjectAuthorization.js +11 -0
  341. package/build/dist/Server/Middleware/ProjectAuthorization.js.map +1 -1
  342. package/build/dist/Server/Middleware/SCIMAuthorization.js +12 -0
  343. package/build/dist/Server/Middleware/SCIMAuthorization.js.map +1 -1
  344. package/build/dist/Server/Middleware/TelemetryIngest.js +11 -0
  345. package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
  346. package/build/dist/Server/Services/AIBillingService.js +70 -16
  347. package/build/dist/Server/Services/AIBillingService.js.map +1 -1
  348. package/build/dist/Server/Services/EnterpriseLicenseInstanceService.js +167 -0
  349. package/build/dist/Server/Services/EnterpriseLicenseInstanceService.js.map +1 -1
  350. package/build/dist/Server/Services/EnterpriseLicenseService.js +39 -0
  351. package/build/dist/Server/Services/EnterpriseLicenseService.js.map +1 -1
  352. package/build/dist/Server/Services/Index.js +10 -0
  353. package/build/dist/Server/Services/Index.js.map +1 -1
  354. package/build/dist/Server/Services/MonitorService.js +119 -21
  355. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  356. package/build/dist/Server/Services/MonitorStatusTimelineService.js +127 -8
  357. package/build/dist/Server/Services/MonitorStatusTimelineService.js.map +1 -1
  358. package/build/dist/Server/Services/MonitorTemplateService.js +162 -0
  359. package/build/dist/Server/Services/MonitorTemplateService.js.map +1 -1
  360. package/build/dist/Server/Services/NetworkAlertPolicyEngineService.js +1683 -0
  361. package/build/dist/Server/Services/NetworkAlertPolicyEngineService.js.map +1 -0
  362. package/build/dist/Server/Services/NetworkAlertPolicyService.js +732 -0
  363. package/build/dist/Server/Services/NetworkAlertPolicyService.js.map +1 -0
  364. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +10 -9
  365. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
  366. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js +54 -11
  367. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js.map +1 -1
  368. package/build/dist/Server/Services/NetworkDeviceService.js +841 -70
  369. package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
  370. package/build/dist/Server/Services/NetworkSiteService.js +1145 -107
  371. package/build/dist/Server/Services/NetworkSiteService.js.map +1 -1
  372. package/build/dist/Server/Services/NetworkSiteTypeService.js +863 -0
  373. package/build/dist/Server/Services/NetworkSiteTypeService.js.map +1 -1
  374. package/build/dist/Server/Services/NetworkSnmpCredentialProfileService.js +217 -0
  375. package/build/dist/Server/Services/NetworkSnmpCredentialProfileService.js.map +1 -0
  376. package/build/dist/Server/Services/NotificationService.js +80 -17
  377. package/build/dist/Server/Services/NotificationService.js.map +1 -1
  378. package/build/dist/Server/Services/ProjectService.js +66 -30
  379. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  380. package/build/dist/Server/Services/StatusPagePrivateUserService.js +92 -2
  381. package/build/dist/Server/Services/StatusPagePrivateUserService.js.map +1 -1
  382. package/build/dist/Server/Services/UserNotificationEmailRollupBatchService.js +76 -0
  383. package/build/dist/Server/Services/UserNotificationEmailRollupBatchService.js.map +1 -0
  384. package/build/dist/Server/Services/UserNotificationEmailRollupItemService.js +77 -0
  385. package/build/dist/Server/Services/UserNotificationEmailRollupItemService.js.map +1 -0
  386. package/build/dist/Server/Services/UserNotificationEmailRollupSettingService.js +111 -0
  387. package/build/dist/Server/Services/UserNotificationEmailRollupSettingService.js.map +1 -0
  388. package/build/dist/Server/Services/UserNotificationSettingService.js +46 -20
  389. package/build/dist/Server/Services/UserNotificationSettingService.js.map +1 -1
  390. package/build/dist/Server/Services/UserService.js +90 -0
  391. package/build/dist/Server/Services/UserService.js.map +1 -1
  392. package/build/dist/Server/Types/Database/QueryHelper.js +1 -1
  393. package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
  394. package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js +14 -3
  395. package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js.map +1 -1
  396. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js +10 -0
  397. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js.map +1 -1
  398. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js +10 -0
  399. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js.map +1 -1
  400. package/build/dist/Server/Utils/AI/SRE/Insights/InsightTriageRunner.js +54 -1
  401. package/build/dist/Server/Utils/AI/SRE/Insights/InsightTriageRunner.js.map +1 -1
  402. package/build/dist/Server/Utils/AI/Toolbox/AlertTools.js +18 -4
  403. package/build/dist/Server/Utils/AI/Toolbox/AlertTools.js.map +1 -1
  404. package/build/dist/Server/Utils/Billing/BillingFailureNoticeThrottle.js +59 -0
  405. package/build/dist/Server/Utils/Billing/BillingFailureNoticeThrottle.js.map +1 -0
  406. package/build/dist/Server/Utils/DataSource/HttpFetch.js +2 -1
  407. package/build/dist/Server/Utils/DataSource/HttpFetch.js.map +1 -1
  408. package/build/dist/Server/Utils/EmailRollup/EmailRollupConstants.js +91 -0
  409. package/build/dist/Server/Utils/EmailRollup/EmailRollupConstants.js.map +1 -0
  410. package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js +691 -0
  411. package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js.map +1 -0
  412. package/build/dist/Server/Utils/EmailRollup/EmailRollupRenderer.js +497 -0
  413. package/build/dist/Server/Utils/EmailRollup/EmailRollupRenderer.js.map +1 -0
  414. package/build/dist/Server/Utils/EmailRollup/EmailRollupWriter.js +257 -0
  415. package/build/dist/Server/Utils/EmailRollup/EmailRollupWriter.js.map +1 -0
  416. package/build/dist/Server/Utils/LLM/LLMService.js +64 -1
  417. package/build/dist/Server/Utils/LLM/LLMService.js.map +1 -1
  418. package/build/dist/Server/Utils/LogRedaction.js +8 -0
  419. package/build/dist/Server/Utils/LogRedaction.js.map +1 -1
  420. package/build/dist/Server/Utils/Logger.js +63 -1
  421. package/build/dist/Server/Utils/Logger.js.map +1 -1
  422. package/build/dist/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.js +141 -0
  423. package/build/dist/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.js.map +1 -0
  424. package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js +8 -1
  425. package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js.map +1 -1
  426. package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js +51 -1
  427. package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js.map +1 -1
  428. package/build/dist/Server/Utils/Monitor/MonitorCriteriaDataExtractor.js +7 -0
  429. package/build/dist/Server/Utils/Monitor/MonitorCriteriaDataExtractor.js.map +1 -1
  430. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +37 -0
  431. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
  432. package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js +158 -6
  433. package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js.map +1 -1
  434. package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js +33 -0
  435. package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js.map +1 -1
  436. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +32 -0
  437. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
  438. package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js +330 -21
  439. package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js.map +1 -1
  440. package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js +55 -10
  441. package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js.map +1 -1
  442. package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js +178 -49
  443. package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js.map +1 -1
  444. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +119 -29
  445. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
  446. package/build/dist/Server/Utils/NetworkDevice/DeviceHealthAggregation.js +30 -17
  447. package/build/dist/Server/Utils/NetworkDevice/DeviceHealthAggregation.js.map +1 -1
  448. package/build/dist/Server/Utils/NetworkSite/NetworkSiteHierarchyLock.js +158 -0
  449. package/build/dist/Server/Utils/NetworkSite/NetworkSiteHierarchyLock.js.map +1 -0
  450. package/build/dist/Server/Utils/OutboundUserAgent.js +123 -0
  451. package/build/dist/Server/Utils/OutboundUserAgent.js.map +1 -0
  452. package/build/dist/Server/Utils/StartServer.js +38 -14
  453. package/build/dist/Server/Utils/StartServer.js.map +1 -1
  454. package/build/dist/Server/Utils/Telemetry/CaptureSpan.js +28 -8
  455. package/build/dist/Server/Utils/Telemetry/CaptureSpan.js.map +1 -1
  456. package/build/dist/Server/Utils/Telemetry/ErrorClassResolver.js +95 -0
  457. package/build/dist/Server/Utils/Telemetry/ErrorClassResolver.js.map +1 -0
  458. package/build/dist/Server/Utils/Telemetry/SpanUtil.js +29 -0
  459. package/build/dist/Server/Utils/Telemetry/SpanUtil.js.map +1 -1
  460. package/build/dist/Server/Utils/Telemetry.js +162 -46
  461. package/build/dist/Server/Utils/Telemetry.js.map +1 -1
  462. package/build/dist/Types/AI/ExceptionAIClassification.js +10 -24
  463. package/build/dist/Types/AI/ExceptionAIClassification.js.map +1 -1
  464. package/build/dist/Types/Email/EmailTemplateType.js +1 -0
  465. package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
  466. package/build/dist/Types/EnterpriseLicense/EnterpriseLicenseUsageSnapshot.js +2 -0
  467. package/build/dist/Types/EnterpriseLicense/EnterpriseLicenseUsageSnapshot.js.map +1 -0
  468. package/build/dist/Types/EnterpriseLicense/EnterpriseLicenseUserCountSource.js +7 -0
  469. package/build/dist/Types/EnterpriseLicense/EnterpriseLicenseUserCountSource.js.map +1 -0
  470. package/build/dist/Types/Exception/ApiException.js +9 -0
  471. package/build/dist/Types/Exception/ApiException.js.map +1 -1
  472. package/build/dist/Types/Exception/BadDataException.js +10 -0
  473. package/build/dist/Types/Exception/BadDataException.js.map +1 -1
  474. package/build/dist/Types/Exception/BadRequestException.js +10 -0
  475. package/build/dist/Types/Exception/BadRequestException.js.map +1 -1
  476. package/build/dist/Types/Exception/Exception.js +56 -0
  477. package/build/dist/Types/Exception/Exception.js.map +1 -1
  478. package/build/dist/Types/Exception/ForbiddenException.js +9 -0
  479. package/build/dist/Types/Exception/ForbiddenException.js.map +1 -1
  480. package/build/dist/Types/Exception/NotAuthenticatedException.js +9 -0
  481. package/build/dist/Types/Exception/NotAuthenticatedException.js.map +1 -1
  482. package/build/dist/Types/Exception/NotAuthorizedException.js +9 -0
  483. package/build/dist/Types/Exception/NotAuthorizedException.js.map +1 -1
  484. package/build/dist/Types/Exception/NotFoundException.js +10 -0
  485. package/build/dist/Types/Exception/NotFoundException.js.map +1 -1
  486. package/build/dist/Types/Exception/PayloadTooLargeException.js +10 -0
  487. package/build/dist/Types/Exception/PayloadTooLargeException.js.map +1 -1
  488. package/build/dist/Types/Exception/PaymentRequiredException.js +9 -0
  489. package/build/dist/Types/Exception/PaymentRequiredException.js.map +1 -1
  490. package/build/dist/Types/Exception/ServiceUnavailableException.js +9 -0
  491. package/build/dist/Types/Exception/ServiceUnavailableException.js.map +1 -1
  492. package/build/dist/Types/Exception/SsoAuthorizationException.js +9 -0
  493. package/build/dist/Types/Exception/SsoAuthorizationException.js.map +1 -1
  494. package/build/dist/Types/Exception/TenantNotFoundException.js +10 -0
  495. package/build/dist/Types/Exception/TenantNotFoundException.js.map +1 -1
  496. package/build/dist/Types/Exception/TimeoutException.js +9 -0
  497. package/build/dist/Types/Exception/TimeoutException.js.map +1 -1
  498. package/build/dist/Types/Exception/TooManyRequestsException.js +9 -0
  499. package/build/dist/Types/Exception/TooManyRequestsException.js.map +1 -1
  500. package/build/dist/Types/Exception/UnableToReachServer.js +9 -0
  501. package/build/dist/Types/Exception/UnableToReachServer.js.map +1 -1
  502. package/build/dist/Types/Exception/WebsiteRequestException.js +9 -0
  503. package/build/dist/Types/Exception/WebsiteRequestException.js.map +1 -1
  504. package/build/dist/Types/Monitor/CriteriaFilter.js +45 -2
  505. package/build/dist/Types/Monitor/CriteriaFilter.js.map +1 -1
  506. package/build/dist/Types/Monitor/DatabaseMetricCatalog.js +594 -0
  507. package/build/dist/Types/Monitor/DatabaseMetricCatalog.js.map +1 -0
  508. package/build/dist/Types/Monitor/DatabaseMonitor/DatabaseMonitorResponse.js +21 -0
  509. package/build/dist/Types/Monitor/DatabaseMonitor/DatabaseMonitorResponse.js.map +1 -0
  510. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js +70 -0
  511. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
  512. package/build/dist/Types/Monitor/MonitorMetricType.js +61 -0
  513. package/build/dist/Types/Monitor/MonitorMetricType.js.map +1 -1
  514. package/build/dist/Types/Monitor/MonitorStep.js +54 -0
  515. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  516. package/build/dist/Types/Monitor/MonitorStepDatabaseMonitor.js +122 -0
  517. package/build/dist/Types/Monitor/MonitorStepDatabaseMonitor.js.map +1 -0
  518. package/build/dist/Types/Monitor/MonitorStepSqlMonitor.js.map +1 -1
  519. package/build/dist/Types/Monitor/MonitorType.js +45 -1
  520. package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
  521. package/build/dist/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.js +21 -1
  522. package/build/dist/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.js.map +1 -1
  523. package/build/dist/Types/Monitor/SqlConnectionConfig.js +2 -0
  524. package/build/dist/Types/Monitor/SqlConnectionConfig.js.map +1 -0
  525. package/build/dist/Types/NetworkDevice/NetworkAlertPolicyScope.js +172 -0
  526. package/build/dist/Types/NetworkDevice/NetworkAlertPolicyScope.js.map +1 -0
  527. package/build/dist/Types/NetworkDevice/NetworkDeviceMonitoringMethod.js +40 -22
  528. package/build/dist/Types/NetworkDevice/NetworkDeviceMonitoringMethod.js.map +1 -1
  529. package/build/dist/Types/NetworkSite/DefaultNetworkSiteTypeHierarchy.js +26 -0
  530. package/build/dist/Types/NetworkSite/DefaultNetworkSiteTypeHierarchy.js.map +1 -0
  531. package/build/dist/Types/NotificationSetting/NotificationEmailRollupCategory.js +186 -0
  532. package/build/dist/Types/NotificationSetting/NotificationEmailRollupCategory.js.map +1 -0
  533. package/build/dist/Types/NotificationSetting/NotificationEmailRollupPolicy.js +87 -0
  534. package/build/dist/Types/NotificationSetting/NotificationEmailRollupPolicy.js.map +1 -0
  535. package/build/dist/Types/Permission.js +80 -0
  536. package/build/dist/Types/Permission.js.map +1 -1
  537. package/build/dist/Types/Telemetry/ErrorClass.js +216 -0
  538. package/build/dist/Types/Telemetry/ErrorClass.js.map +1 -0
  539. package/build/dist/Types/Telemetry/UnitOfWork.js +59 -0
  540. package/build/dist/Types/Telemetry/UnitOfWork.js.map +1 -0
  541. package/build/dist/UI/Components/CommandPalette/CommandPalette.js +2 -7
  542. package/build/dist/UI/Components/CommandPalette/CommandPalette.js.map +1 -1
  543. package/build/dist/UI/Components/EditionLabel/EditionLabel.js +3 -0
  544. package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
  545. package/build/dist/UI/Components/Modal/Modal.js +2 -7
  546. package/build/dist/UI/Components/Modal/Modal.js.map +1 -1
  547. package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js +39 -0
  548. package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js.map +1 -1
  549. package/build/dist/UI/Components/ProgressBar/ProgressBar.js +12 -1
  550. package/build/dist/UI/Components/ProgressBar/ProgressBar.js.map +1 -1
  551. package/build/dist/UI/Components/RadioButtons/BasicRadioButtons.js +6 -6
  552. package/build/dist/UI/Components/RadioButtons/BasicRadioButtons.js.map +1 -1
  553. package/build/dist/UI/Components/SideMenu/SideMenu.js +67 -5
  554. package/build/dist/UI/Components/SideMenu/SideMenu.js.map +1 -1
  555. package/build/dist/UI/Components/SideMenu/SideMenuItem.js +49 -53
  556. package/build/dist/UI/Components/SideMenu/SideMenuItem.js.map +1 -1
  557. package/build/dist/UI/Components/SideMenu/SideMenuSection.js +25 -7
  558. package/build/dist/UI/Components/SideMenu/SideMenuSection.js.map +1 -1
  559. package/build/dist/UI/Components/SideOver/SideOver.js +5 -20
  560. package/build/dist/UI/Components/SideOver/SideOver.js.map +1 -1
  561. package/build/dist/UI/Utils/PageScrollLock.js +31 -3
  562. package/build/dist/UI/Utils/PageScrollLock.js.map +1 -1
  563. package/build/dist/UI/Utils/PermissionGate.js +42 -1
  564. package/build/dist/UI/Utils/PermissionGate.js.map +1 -1
  565. package/build/dist/UI/Utils/SensitiveUrlToken.js +97 -0
  566. package/build/dist/UI/Utils/SensitiveUrlToken.js.map +1 -0
  567. package/build/dist/UI/Utils/TestLLMProvider.js +4 -5
  568. package/build/dist/UI/Utils/TestLLMProvider.js.map +1 -1
  569. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js +15 -0
  570. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js.map +1 -1
  571. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js +111 -9
  572. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js.map +1 -1
  573. package/build/dist/Utils/Monitor/MonitorMetricType.js +109 -1
  574. package/build/dist/Utils/Monitor/MonitorMetricType.js.map +1 -1
  575. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +8 -3
  576. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
  577. package/build/dist/Utils/NetworkDevice/DeviceHealthStateUtil.js +27 -7
  578. package/build/dist/Utils/NetworkDevice/DeviceHealthStateUtil.js.map +1 -1
  579. package/build/dist/Utils/NetworkDevice/DeviceReachabilityUtil.js +7 -5
  580. package/build/dist/Utils/NetworkDevice/DeviceReachabilityUtil.js.map +1 -1
  581. package/build/dist/Utils/NetworkDevice/NetworkAlertPolicyBootstrapUtil.js +180 -0
  582. package/build/dist/Utils/NetworkDevice/NetworkAlertPolicyBootstrapUtil.js.map +1 -0
  583. package/build/dist/Utils/NetworkDevice/SnmpCredentialUtil.js +12 -0
  584. package/build/dist/Utils/NetworkDevice/SnmpCredentialUtil.js.map +1 -0
  585. package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js +15 -5
  586. package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js.map +1 -1
  587. package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js +44 -15
  588. package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js.map +1 -1
  589. package/build/dist/Utils/NetworkDiscovery/DiscoveryImportEligibility.js +52 -23
  590. package/build/dist/Utils/NetworkDiscovery/DiscoveryImportEligibility.js.map +1 -1
  591. package/build/dist/Utils/NetworkDiscovery/PingMonitorBuilder.js +85 -13
  592. package/build/dist/Utils/NetworkDiscovery/PingMonitorBuilder.js.map +1 -1
  593. package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js +30 -15
  594. package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js.map +1 -1
  595. package/build/dist/Utils/NetworkSite/TypeHierarchyUtil.js +191 -0
  596. package/build/dist/Utils/NetworkSite/TypeHierarchyUtil.js.map +1 -0
  597. package/package.json +2 -2
@@ -0,0 +1,274 @@
1
+ /*
2
+ * The fault domain of a thrown value: whose problem is it?
3
+ *
4
+ * This is the canonical vocabulary for the whole platform. It was originally
5
+ * introduced as `ExceptionAIClassification` — an after-the-fact LLM verdict on
6
+ * an already-ingested exception group — but the same five values are what the
7
+ * emitting code needs in order to decide, at the moment an error is thrown,
8
+ * whether it is worth waking anyone up. That file now re-exports this one so
9
+ * there is exactly ONE answer to "what kind of failure is this" in the
10
+ * codebase, with several possible sources (declared > human > AI > default).
11
+ *
12
+ * - CodeFault: a defect in the monitored code — the only class the automatic
13
+ * fix lane opens pull requests for. This is the BASE DEFAULT on purpose:
14
+ * forgetting to classify an exception must leave it noisy, never silent.
15
+ * - UserError: expected consequence of invalid end-user input (bad
16
+ * parameters, malformed values). The right change, if any, is earlier
17
+ * validation and clearer error UX — routed to a human, never auto-fixed.
18
+ * - ExpectedDenial: an intentional check doing its job (auth failure,
19
+ * plan/paywall denial, scanner/fuzzer probe tripping validation).
20
+ * Never auto-fixed; optionally auto-archived.
21
+ * - Infrastructure: environmental conditions (timeouts, connection resets,
22
+ * resource exhaustion) where a code "fix" is usually tuning — routed to a
23
+ * human. NOTE: this stays an Issue. It is a real failure, just not one to
24
+ * auto-fix.
25
+ * - Unknown: triage could not decide — treated conservatively (no automatic
26
+ * fix, and still shown).
27
+ */
28
+ enum ErrorClass {
29
+ CodeFault = "code-fault",
30
+ UserError = "user-error",
31
+ ExpectedDenial = "expected-denial",
32
+ Infrastructure = "infrastructure",
33
+ Unknown = "unknown",
34
+ }
35
+
36
+ /*
37
+ * The classes that do NOT warrant an Issue. Everything else — including
38
+ * Infrastructure and Unknown — stays loud.
39
+ *
40
+ * Exported as the single list so the emit path, the ingest path, the Issues
41
+ * list default scope and the AI detectors can never drift apart on which
42
+ * classes are suppressed.
43
+ */
44
+ export const NON_ACTIONABLE_ERROR_CLASSES: ReadonlyArray<ErrorClass> = [
45
+ ErrorClass.UserError,
46
+ ErrorClass.ExpectedDenial,
47
+ ];
48
+
49
+ export function isNonActionableErrorClass(value: unknown): boolean {
50
+ return NON_ACTIONABLE_ERROR_CLASSES.includes(value as ErrorClass);
51
+ }
52
+
53
+ /**
54
+ * Every value the enum can take, for validating strings that arrive from
55
+ * outside (an OTLP attribute, a database column written by an older release).
56
+ */
57
+ export function toErrorClass(value: unknown): ErrorClass | null {
58
+ if (typeof value !== "string") {
59
+ return null;
60
+ }
61
+
62
+ const match: ErrorClass | undefined = Object.values(ErrorClass).find(
63
+ (candidate: ErrorClass) => {
64
+ return candidate === value;
65
+ },
66
+ );
67
+
68
+ return match ?? null;
69
+ }
70
+
71
+ /*
72
+ * `Symbol.for` rather than `Symbol()`: Common/ ships its own node_modules and
73
+ * is consumed by App/, Probe/, Runner/ and others, so this module can be
74
+ * instantiated more than once in a single process. A unique symbol would not
75
+ * match across those instances and a tag written by one copy would be
76
+ * invisible to another. The global symbol registry is keyed by string, so all
77
+ * copies agree.
78
+ */
79
+ const ERROR_CLASS_SYMBOL: symbol = Symbol.for("oneuptime.error.class");
80
+ const ERROR_CLASS_AUTHORITATIVE_SYMBOL: symbol = Symbol.for(
81
+ "oneuptime.error.class.authoritative",
82
+ );
83
+ const ERROR_REPORTED_SYMBOL: symbol = Symbol.for("oneuptime.error.reported");
84
+
85
+ /**
86
+ * A fault domain plus how much to trust it.
87
+ *
88
+ * `authoritative: false` is a CLASS-LEVEL default — "BadDataException usually
89
+ * means the caller sent something wrong". It is a generalisation, so it is
90
+ * subject to the unit-of-work promotion: outside an HTTP request there is no
91
+ * caller, and the generalisation does not hold.
92
+ *
93
+ * `authoritative: true` is a SITE-LEVEL declaration — a developer looked at
94
+ * one specific throw or one specific log line and said what it is. That is a
95
+ * deliberate, reviewable judgment about a single place in the code, so it is
96
+ * never second-guessed. This is what lets a probe report "the endpoint we were
97
+ * asked to check is down" as a non-defect even though a probe check has no
98
+ * HTTP request around it.
99
+ */
100
+ export interface DeclaredErrorClass {
101
+ errorClass: ErrorClass;
102
+ authoritative: boolean;
103
+ }
104
+
105
+ type Taggable = { [key: symbol]: unknown };
106
+
107
+ function canTag(value: unknown): value is Taggable {
108
+ return (
109
+ value !== null && (typeof value === "object" || typeof value === "function")
110
+ );
111
+ }
112
+
113
+ /**
114
+ * Attach a fault domain to a thrown value.
115
+ *
116
+ * `enumerable: false` keeps it invisible to `JSON.stringify`,
117
+ * `Logger.redactBody` and `Telemetry.getExceptionAttributes`, so tagging can
118
+ * never change what a log line or a span attribute bag looks like.
119
+ *
120
+ * Never throws: this runs from the `Exception` constructor and from catch
121
+ * blocks, where a frozen object or a hostile Proxy must not take down the
122
+ * error path. Returns the value so it can be tagged inline.
123
+ */
124
+ export function tagErrorClass<T>(
125
+ value: T,
126
+ errorClass: ErrorClass,
127
+ authoritative: boolean = false,
128
+ ): T {
129
+ if (!canTag(value)) {
130
+ return value;
131
+ }
132
+
133
+ try {
134
+ Object.defineProperty(value, ERROR_CLASS_SYMBOL, {
135
+ value: errorClass,
136
+ enumerable: false,
137
+ writable: true,
138
+ configurable: true,
139
+ });
140
+
141
+ if (authoritative) {
142
+ Object.defineProperty(value, ERROR_CLASS_AUTHORITATIVE_SYMBOL, {
143
+ value: true,
144
+ enumerable: false,
145
+ writable: true,
146
+ configurable: true,
147
+ });
148
+ }
149
+ } catch {
150
+ // Frozen / sealed / exotic object — the resolver falls back to CodeFault.
151
+ }
152
+
153
+ return value;
154
+ }
155
+
156
+ /**
157
+ * Declare the fault domain for ONE specific throw or log line, overriding the
158
+ * class-level default and exempting it from the unit-of-work promotion.
159
+ */
160
+ export function tagErrorClassAuthoritative<T>(
161
+ value: T,
162
+ errorClass: ErrorClass,
163
+ ): T {
164
+ return tagErrorClass(value, errorClass, true);
165
+ }
166
+
167
+ /**
168
+ * Read the fault domain a thrown value declared for itself, or null when it
169
+ * declared none.
170
+ *
171
+ * A null return is meaningful and must stay distinct from
172
+ * `ErrorClass.Unknown`: "nobody predicted this" is the strongest possible
173
+ * signal that it is a bug, whereas Unknown means "we looked and could not
174
+ * tell". Callers turn null into CodeFault.
175
+ *
176
+ * Also duck-types off a plain `errorClass` property so an error crossing a
177
+ * process or module boundary (where the symbol is lost) can still declare
178
+ * itself.
179
+ */
180
+ export function declaredErrorClass(value: unknown): DeclaredErrorClass | null {
181
+ if (!canTag(value)) {
182
+ return null;
183
+ }
184
+
185
+ try {
186
+ const authoritative: boolean =
187
+ value[ERROR_CLASS_AUTHORITATIVE_SYMBOL] === true;
188
+
189
+ const tagged: ErrorClass | null = toErrorClass(value[ERROR_CLASS_SYMBOL]);
190
+
191
+ if (tagged !== null) {
192
+ return { errorClass: tagged, authoritative: authoritative };
193
+ }
194
+
195
+ /*
196
+ * Duck-type off a plain property too, so an error that crossed a process
197
+ * or module boundary (where the symbol is lost) can still declare itself.
198
+ * A property survives serialization, so treat it as a deliberate
199
+ * declaration.
200
+ */
201
+ const ducked: ErrorClass | null = toErrorClass(
202
+ (value as { errorClass?: unknown }).errorClass,
203
+ );
204
+
205
+ if (ducked !== null) {
206
+ return { errorClass: ducked, authoritative: true };
207
+ }
208
+
209
+ return null;
210
+ } catch {
211
+ // Throwing getter on an exotic thrown value.
212
+ return null;
213
+ }
214
+ }
215
+
216
+ /**
217
+ * Mark a thrown value as already reported, returning whether it had ALREADY
218
+ * been marked.
219
+ *
220
+ * This is what stops one thrown error from filing N exception events as it
221
+ * propagates through N `@CaptureSpan` frames. The fingerprint hashes no spanId
222
+ * and no span name, so without this every frame's event lands in the same
223
+ * group and `occuranceCount` jumps by the depth of the call stack — measured
224
+ * at 3 for a create with a missing field and 6 for a permission-denied
225
+ * get-list.
226
+ *
227
+ * Untaggable values (a thrown string, a frozen object) always report `false`,
228
+ * i.e. they are reported every time. Over-reporting is the safe direction.
229
+ */
230
+ export function markErrorReported(value: unknown): boolean {
231
+ if (!canTag(value)) {
232
+ return false;
233
+ }
234
+
235
+ try {
236
+ const alreadyReported: boolean = value[ERROR_REPORTED_SYMBOL] === true;
237
+
238
+ if (!alreadyReported) {
239
+ Object.defineProperty(value, ERROR_REPORTED_SYMBOL, {
240
+ value: true,
241
+ enumerable: false,
242
+ writable: true,
243
+ configurable: true,
244
+ });
245
+ }
246
+
247
+ return alreadyReported;
248
+ } catch {
249
+ return false;
250
+ }
251
+ }
252
+
253
+ /**
254
+ * Test seam: forget that a value was reported. Only used by tests that reuse
255
+ * one error object across cases.
256
+ */
257
+ export function clearErrorReported(value: unknown): void {
258
+ if (!canTag(value)) {
259
+ return;
260
+ }
261
+
262
+ try {
263
+ Object.defineProperty(value, ERROR_REPORTED_SYMBOL, {
264
+ value: false,
265
+ enumerable: false,
266
+ writable: true,
267
+ configurable: true,
268
+ });
269
+ } catch {
270
+ // Nothing to clear.
271
+ }
272
+ }
273
+
274
+ export default ErrorClass;
@@ -0,0 +1,59 @@
1
+ /*
2
+ * What kind of work was in flight when something happened.
3
+ *
4
+ * This is the axis that makes class-based fault classification safe. The same
5
+ * exception class means different things depending on who asked for the work:
6
+ *
7
+ * throw new BadDataException("Monitor type required to create monitor.")
8
+ * -> inside an HTTP request: the caller sent a bad request. Not our bug.
9
+ *
10
+ * throw new BadDataException("No job found with name: " + name)
11
+ * -> inside a cron registration: an internal invariant we violated.
12
+ * Very much our bug.
13
+ *
14
+ * They are indistinguishable at the throw site and perfectly distinguishable
15
+ * by unit of work, so ErrorClassResolver promotes user-error and
16
+ * expected-denial back to code-fault everywhere except an HTTP request.
17
+ *
18
+ * Seed this EXPLICITLY at every entry point. TelemetryContext.runWithContext
19
+ * inherits the enclosing scope's attributes, so an unset value would let a
20
+ * request's "http-request" marker leak into background work started from
21
+ * inside that request.
22
+ */
23
+ export enum UnitOfWork {
24
+ HttpRequest = "http-request",
25
+ WorkerJob = "worker-job",
26
+ CronJob = "cron-job",
27
+ ProbeCheck = "probe-check",
28
+ Notification = "notification",
29
+ Startup = "startup",
30
+ }
31
+
32
+ /**
33
+ * Which deployment role produced this telemetry.
34
+ *
35
+ * Distinct from UnitOfWork, and distinct from `service.name`: the Helm chart
36
+ * runs the worker as a separate Deployment but from the same image and the
37
+ * same entrypoint (it only flips DISABLE_QUEUE_WORKERS), so worker pods report
38
+ * `service.name = "api"`. Until that changes — which re-keys every worker
39
+ * exception fingerprint and therefore needs its own release — this attribute
40
+ * is how "which component" becomes filterable.
41
+ */
42
+ export enum TelemetryComponent {
43
+ Api = "api",
44
+ Worker = "worker",
45
+ Cron = "cron",
46
+ Probe = "probe",
47
+ Notification = "notification",
48
+ }
49
+
50
+ /**
51
+ * Ambient TelemetryContext / span attribute keys. String constants rather than
52
+ * inline literals so the emit path, drop filters, dashboards and tests cannot
53
+ * drift apart on spelling.
54
+ */
55
+ export const UNIT_OF_WORK_ATTRIBUTE_KEY: string = "oneuptime.unit_of_work";
56
+ export const COMPONENT_ATTRIBUTE_KEY: string = "oneuptime.component";
57
+
58
+ /** Span/log attribute carrying the resolved fault domain. */
59
+ export const ERROR_CLASS_ATTRIBUTE_KEY: string = "error.class";
@@ -8,7 +8,7 @@ import KeyboardKey, {
8
8
  } from "../KeyboardShortcut/KeyboardKey";
9
9
  import IconProp from "../../../Types/Icon/IconProp";
10
10
  import useTranslateValue from "../../Utils/Translation";
11
- import { lockPageScroll, unlockPageScroll } from "../../Utils/PageScrollLock";
11
+ import { usePageScrollLock } from "../../Utils/PageScrollLock";
12
12
  import {
13
13
  PaletteCommand,
14
14
  PaletteSearchProvider,
@@ -194,13 +194,7 @@ const CommandPalettePanel: FunctionComponent<PanelProps> = (
194
194
  }, []);
195
195
 
196
196
  // The page behind the palette must not scroll while it is open.
197
- useEffect(() => {
198
- lockPageScroll();
199
-
200
- return () => {
201
- unlockPageScroll();
202
- };
203
- }, []);
197
+ usePageScrollLock(true);
204
198
 
205
199
  useEffect(() => {
206
200
  inputRef.current?.focus();
@@ -92,6 +92,10 @@ const parseLicenseInstances: ParseLicenseInstancesFunction = (
92
92
  typeof instance["userCount"] === "number"
93
93
  ? instance["userCount"]
94
94
  : null,
95
+ isCountedTowardsUsage:
96
+ typeof instance["isCountedTowardsUsage"] === "boolean"
97
+ ? instance["isCountedTowardsUsage"]
98
+ : undefined,
95
99
  lastReportedAt:
96
100
  typeof instance["lastReportedAt"] === "string"
97
101
  ? instance["lastReportedAt"]
@@ -8,7 +8,7 @@ import { VeryLightGray } from "../../../Types/BrandColors";
8
8
  import IconProp from "../../../Types/Icon/IconProp";
9
9
  import useTranslateValue from "../../Utils/Translation";
10
10
  import { wasPressConsumedByAnAnchoredPopup } from "../../Types/LayeredDismissal";
11
- import { lockPageScroll, unlockPageScroll } from "../../Utils/PageScrollLock";
11
+ import { usePageScrollLock } from "../../Utils/PageScrollLock";
12
12
  import React, {
13
13
  FunctionComponent,
14
14
  ReactElement,
@@ -125,13 +125,7 @@ const Modal: FunctionComponent<ComponentProps> = (
125
125
  };
126
126
  }, []);
127
127
 
128
- useEffect(() => {
129
- lockPageScroll();
130
-
131
- return () => {
132
- unlockPageScroll();
133
- };
134
- }, []);
128
+ usePageScrollLock(true);
135
129
 
136
130
  useEffect(() => {
137
131
  const content: HTMLDivElement | null = contentRef.current;
@@ -538,6 +538,50 @@ export default class TemplateVariablesCatalog {
538
538
  ],
539
539
  };
540
540
 
541
+ case MonitorType.Database:
542
+ return {
543
+ title: "Database Health",
544
+ variables: [
545
+ {
546
+ key: "isOnline",
547
+ description: "True if the database accepted the connection.",
548
+ },
549
+ {
550
+ key: "responseTimeInMs",
551
+ description: "Time to connect and run the baseline query.",
552
+ },
553
+ { key: "failureCause", description: "Failure reason." },
554
+ {
555
+ key: "connectionError",
556
+ description:
557
+ "Connection error, when the database was unreachable.",
558
+ },
559
+ {
560
+ key: "engineVersion",
561
+ description: "Version string the database server reported.",
562
+ },
563
+ {
564
+ key: "collectedGroups",
565
+ description: "Metric groups that produced values on this check.",
566
+ },
567
+ {
568
+ key: "unavailableGroups",
569
+ description:
570
+ "Array of {group, reason, message, remediation} for groups that produced nothing.",
571
+ },
572
+ {
573
+ key: "collectionIssueSummary",
574
+ description:
575
+ "One-line summary of the unavailable groups - empty when everything was collected.",
576
+ },
577
+ {
578
+ key: "metrics",
579
+ description:
580
+ "Collected values keyed by metric name. A metric that was not collected is absent.",
581
+ },
582
+ ],
583
+ };
584
+
541
585
  case MonitorType.ExternalStatusPage:
542
586
  return {
543
587
  title: "External Status Page",
@@ -28,7 +28,18 @@ const ProgressBar: FunctionComponent<ComponentProps> = (
28
28
  let percent: number = 0;
29
29
 
30
30
  try {
31
- percent = (props.count * 100) / props.totalCount;
31
+ /*
32
+ * Dividing by zero does not throw in JavaScript — it yields NaN, which
33
+ * the catch below never sees. `Math.ceil(NaN)` is NaN, and NaN then
34
+ * reaches the DOM three times over: as `width: NaN%` (which the browser
35
+ * silently discards, leaving an empty track), as aria-valuenow, and as
36
+ * the visible "NaN%" readout beside the count. Every caller that had
37
+ * noticed guarded its own render on a non-zero total; the ones that had
38
+ * not simply showed it.
39
+ */
40
+ if (props.totalCount > 0) {
41
+ percent = (props.count * 100) / props.totalCount;
42
+ }
32
43
  } catch (err) {
33
44
  Logger.error(err as Error);
34
45
  // do nothing.
@@ -55,23 +55,53 @@ const BasicRadioButton: FunctionComponent<ComponentProps> = (
55
55
 
56
56
  return (
57
57
  <div key={i}>
58
- <div className="flex items-center">
58
+ {/*
59
+ * items-start, and the description on its own line.
60
+ *
61
+ * Both spans used to sit inline inside one label, separated
62
+ * by `ml-1 sm:ml-0` — which cancels the only gap between
63
+ * them at every breakpoint from `sm` up, i.e. on every
64
+ * desktop. The result rendered as "Create an alertNotifies
65
+ * the team and runs the on-call policy." Stacking them also
66
+ * lets a long description wrap under the title instead of
67
+ * under the radio.
68
+ */}
69
+ <div className="flex items-start">
70
+ {/*
71
+ * htmlFor, and an id to point it at.
72
+ *
73
+ * The label was a bare sibling of the input, so nothing
74
+ * tied them together: the radio had no accessible name at
75
+ * all (a screen reader announced "radio button, not
76
+ * checked" and never read "Create an alert"), and the only
77
+ * hit target was the 16px dot — clicking the words did
78
+ * nothing. GroupRadioButtons next door gets this right by
79
+ * wrapping the input; this shape needs the explicit link.
80
+ */}
59
81
  <input
82
+ id={`${id}-${i}`}
60
83
  type="radio"
61
84
  name={id}
62
85
  checked={checked}
63
86
  onChange={() => {
64
87
  handleChange(radioButton.value);
65
88
  }}
66
- className="h-4 w-4 border-gray-300 text-indigo-600 focus:ring-indigo-600"
89
+ className="mt-1 h-4 w-4 flex-shrink-0 border-gray-300 text-indigo-600 focus:ring-indigo-600"
67
90
  />
68
- <label className="ml-3 block text-sm font-medium leading-6 text-gray-900">
69
- <span className="font-medium text-gray-900">
91
+ <label
92
+ htmlFor={`${id}-${i}`}
93
+ className="ml-3 block cursor-pointer text-sm leading-6 text-gray-900"
94
+ >
95
+ <span className="block font-medium text-gray-900">
70
96
  {radioButton.title}
71
97
  </span>
72
- <span className="ml-1 text-gray-500 sm:ml-0">
73
- {radioButton.description}
74
- </span>
98
+ {radioButton.description ? (
99
+ <span className="mt-0.5 block text-sm leading-5 text-gray-500">
100
+ {radioButton.description}
101
+ </span>
102
+ ) : (
103
+ <></>
104
+ )}
75
105
  </label>
76
106
  </div>
77
107
  {checked && radioButton.children}
@@ -94,6 +94,94 @@ const SideMenu: FunctionComponent<ComponentProps> = (props: ComponentProps) => {
94
94
  }
95
95
  };
96
96
 
97
+ /*
98
+ * Walks the JSX children of a `<SideMenu>` written in the hand-rolled form
99
+ * and returns whichever entry points at the current page.
100
+ *
101
+ * It matches on the shape of the props rather than on component identity —
102
+ * an element with a `link` is a menu entry, an element with a `title` and
103
+ * children is a section — so it keeps working for the components built on
104
+ * top of SideMenuItem, and simply finds nothing for anything else (a
105
+ * fragment, a comment, a caller's own wrapper div) rather than throwing.
106
+ */
107
+ type ActiveMenuItem = {
108
+ sectionTitle?: string;
109
+ itemTitle?: string;
110
+ icon?: IconProp;
111
+ };
112
+
113
+ type FindActiveInChildrenFunction = (
114
+ children: ReactElement | Array<ReactElement> | undefined,
115
+ sectionTitle?: string | undefined,
116
+ ) => ActiveMenuItem;
117
+
118
+ const findActiveInChildren: FindActiveInChildrenFunction = (
119
+ children: ReactElement | Array<ReactElement> | undefined,
120
+ sectionTitle?: string | undefined,
121
+ ): ActiveMenuItem => {
122
+ if (!children) {
123
+ return {};
124
+ }
125
+
126
+ for (const child of React.Children.toArray(children)) {
127
+ if (!React.isValidElement(child)) {
128
+ continue;
129
+ }
130
+
131
+ const childProps: {
132
+ link?: Link | undefined;
133
+ activeRoute?: Link["to"] | undefined;
134
+ icon?: IconProp | undefined;
135
+ title?: string | undefined;
136
+ children?: ReactElement | Array<ReactElement> | undefined;
137
+ } = child.props as {
138
+ link?: Link | undefined;
139
+ activeRoute?: Link["to"] | undefined;
140
+ icon?: IconProp | undefined;
141
+ title?: string | undefined;
142
+ children?: ReactElement | Array<ReactElement> | undefined;
143
+ };
144
+
145
+ /*
146
+ * `activeRoute` first, matching the two loops above: an entry whose link
147
+ * carries query state points somewhere the current URL never equals, and
148
+ * declares the route that decides selection separately.
149
+ */
150
+ const matchRoute: Link["to"] | undefined =
151
+ childProps.activeRoute || childProps.link?.to;
152
+
153
+ if (
154
+ childProps.link &&
155
+ matchRoute &&
156
+ Navigation.isOnThisPage(matchRoute)
157
+ ) {
158
+ const result: ActiveMenuItem = { itemTitle: childProps.link.title };
159
+
160
+ if (sectionTitle) {
161
+ result.sectionTitle = sectionTitle;
162
+ }
163
+ if (childProps.icon) {
164
+ result.icon = childProps.icon;
165
+ }
166
+
167
+ return result;
168
+ }
169
+
170
+ if (childProps.children) {
171
+ const nested: ActiveMenuItem = findActiveInChildren(
172
+ childProps.children,
173
+ childProps.title || sectionTitle,
174
+ );
175
+
176
+ if (nested.itemTitle) {
177
+ return nested;
178
+ }
179
+ }
180
+ }
181
+
182
+ return {};
183
+ };
184
+
97
185
  // Function to find the active menu item and section - much simpler now!
98
186
  const findActiveMenuItem: () => {
99
187
  sectionTitle?: string;
@@ -144,7 +232,23 @@ const SideMenu: FunctionComponent<ComponentProps> = (props: ComponentProps) => {
144
232
  }
145
233
  }
146
234
 
147
- return {};
235
+ /*
236
+ * ...and finally the hand-written JSX form.
237
+ *
238
+ * Roughly half the menus in the product are written as
239
+ * `<SideMenu><SideMenuSection>…<SideMenuItem/>…` rather than as a
240
+ * `sections` array — including every resource View menu. Neither loop
241
+ * above can see those, so on a phone all of them labelled their toggle
242
+ * with the fallback word "Navigation" instead of the page the user is
243
+ * actually on. The summary is the ONLY thing naming the current page
244
+ * while the menu is closed, which is most of the time on a phone.
245
+ *
246
+ * This reads the same two props off the elements the caller wrote, so it
247
+ * covers SideMenuItem, CountModelSideMenuItem and the per-feature items
248
+ * built on top of them (RecommendationsSideMenuItem) without knowing
249
+ * anything about their types.
250
+ */
251
+ return findActiveInChildren(props.children);
148
252
  };
149
253
 
150
254
  const activeItem: {
@@ -421,7 +525,15 @@ const SideMenu: FunctionComponent<ComponentProps> = (props: ComponentProps) => {
421
525
  // Desktop view
422
526
  return (
423
527
  <aside
424
- className={`hidden md:block w-52 lg:w-60 flex-shrink-0 mb-10 ${props.className || ""}`}
528
+ /*
529
+ * w-56 rather than w-52. Page.tsx lays the menu out beside a
530
+ * `flex-1 min-w-0` content column, so this class is the only thing
531
+ * setting the sidebar's width — and at 208px the longest shipped titles
532
+ * ("Scheduled Maintenance", "Recommendations" beside a badge) were
533
+ * ellipsised on every page that has them. 16px buys those back without
534
+ * taking a visible bite out of the content column.
535
+ */
536
+ className={`hidden md:block w-56 lg:w-64 flex-shrink-0 mb-10 ${props.className || ""}`}
425
537
  role="navigation"
426
538
  aria-label="Main navigation"
427
539
  >
@@ -436,11 +548,17 @@ const SideMenu: FunctionComponent<ComponentProps> = (props: ComponentProps) => {
436
548
  className="sticky"
437
549
  style={{ top: "calc(var(--app-header-height, 0px) + 1.5rem)" }}
438
550
  >
551
+ {/*
552
+ * rounded-xl and a plain border-gray-200, matching Card and InfoCard.
553
+ * The menu sits directly beside those, and it was the only page-level
554
+ * surface in the product with a 1rem radius and a translucent border —
555
+ * which read as a slightly different shade of white next to them.
556
+ */}
439
557
  <div
440
558
  className={`
441
559
  flex flex-col
442
- bg-white rounded-2xl
443
- border border-gray-200/80
560
+ bg-white rounded-xl
561
+ border border-gray-200
444
562
  shadow-sm
445
563
  overflow-hidden
446
564
  `}
@@ -463,7 +581,7 @@ const SideMenu: FunctionComponent<ComponentProps> = (props: ComponentProps) => {
463
581
 
464
582
  {/* Menu Content */}
465
583
  <nav className="p-2 min-h-0 overflow-y-auto">
466
- <div className="space-y-0.5">{renderMenuContent()}</div>
584
+ <div className="space-y-1">{renderMenuContent()}</div>
467
585
  </nav>
468
586
 
469
587
  {/* Optional Footer */}