@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
@@ -52,6 +52,12 @@ import { AppVersion, Env, DisableTelemetry } from "../EnvironmentConfig";
52
52
  import logger from "./Logger";
53
53
  import GracefulShutdown, { ShutdownPriority } from "./GracefulShutdown";
54
54
  import ContextSpanProcessor from "./Telemetry/ContextSpanProcessor";
55
+ import ErrorClassResolver from "./Telemetry/ErrorClassResolver";
56
+ import ErrorClass, {
57
+ isNonActionableErrorClass,
58
+ markErrorReported,
59
+ } from "../../Types/Telemetry/ErrorClass";
60
+ import { ERROR_CLASS_ATTRIBUTE_KEY } from "../../Types/Telemetry/UnitOfWork";
55
61
  import RuntimeMetrics from "./Telemetry/RuntimeMetrics";
56
62
 
57
63
  type ResourceWithRawAttributes = Resource & {
@@ -540,70 +546,158 @@ export default class Telemetry {
540
546
  return this.getTracer().startActiveSpan(name, data.options || {}, data.fn);
541
547
  }
542
548
 
549
+ /*
550
+ * Span event names. The exception name is load-bearing: the ingest side
551
+ * mints an ExceptionInstance row and a TelemetryException group for every
552
+ * span event literally named "exception" (OtelTracesIngestService
553
+ * getSpanEvents), with no severity, status or handled/unhandled filter. An
554
+ * event under any OTHER name is still pushed to the span's `events` column
555
+ * and still renders in the Traces UI — it simply never becomes an Issue.
556
+ *
557
+ * That is the entire mechanism by which a user error stops paging us, and
558
+ * it needs no ingest change, no schema change and no migration.
559
+ */
560
+ private static readonly SPAN_EVENT_EXCEPTION: string = "exception";
561
+ private static readonly SPAN_EVENT_FAULT: string = "fault";
562
+
563
+ private static faultCounter: TelemetryCounter | null = null;
564
+
565
+ /**
566
+ * Record a thrown value on a span AND end the span.
567
+ *
568
+ * Kept as the name every @CaptureSpan frame calls, so the decorator's
569
+ * contract is unchanged.
570
+ */
543
571
  public static recordExceptionMarkSpanAsErrorAndEndSpan(data: {
544
572
  span: Span;
545
573
  exception: unknown;
574
+ }): void {
575
+ try {
576
+ this.recordExceptionOnSpan(data);
577
+ } finally {
578
+ this.endSpan(data.span);
579
+ }
580
+ }
581
+
582
+ /**
583
+ * Record a thrown value on a span WITHOUT ending it, for callers that own
584
+ * the span's lifetime (QueueWorker's root job span ends it in its own
585
+ * `finally`).
586
+ *
587
+ * What this does, and why each part matters:
588
+ *
589
+ * 1. RESOLVES A FAULT DOMAIN. code-fault and infrastructure are real
590
+ * failures and behave exactly as before. user-error and expected-denial
591
+ * are the platform correctly refusing a request, so they get a `fault`
592
+ * event instead of an `exception` event and the span status is left
593
+ * alone.
594
+ *
595
+ * 2. REPORTS ONCE PER THROWN VALUE. One error crossing N decorated frames
596
+ * used to emit N exception events and N logger.error lines. The
597
+ * fingerprint hashes no spanId and no span name, so all N landed in the
598
+ * same group and occuranceCount jumped by the depth of the call stack
599
+ * (measured: 3 for a create with a missing field, 6 for a
600
+ * permission-denied get-list). Outer frames still set ERROR status and
601
+ * still carry the queryable exception.* attributes, so the trace shows
602
+ * the full error path — only the duplicate EVENT and the duplicate LOG
603
+ * are suppressed.
604
+ *
605
+ * 3. BUILDS THE EVENT ITSELF rather than calling span.recordException. The
606
+ * SDK reads `exception.code` BEFORE `exception.name` when deciding
607
+ * `exception.type` (sdk-trace-base Span.recordException), and every
608
+ * OneUptime ExceptionCode IS an HTTP status — so exceptions were being
609
+ * typed "401"/"400"/"500". Constructing the event here removes that trap
610
+ * structurally instead of relying on every caller to normalize first.
611
+ *
612
+ * 4. COUNTS EVERYTHING. `oneuptime.fault.count` is incremented for every
613
+ * class, suppressed or not, so suppression is never invisible. A metric
614
+ * also outlives trace retention, which a span event does not.
615
+ *
616
+ * Never throws: this is the universal catch path, and a throw here would
617
+ * mask the original error.
618
+ */
619
+ public static recordExceptionOnSpan(data: {
620
+ span: Span;
621
+ exception: unknown;
546
622
  }): void {
547
623
  const { span, exception } = data;
548
624
 
549
- /*
550
- * This runs on the universal catch path of every @CaptureSpan-decorated
551
- * function, so it must NEVER throw — a throw here would mask the original
552
- * error and skip marking the span. The whole body is wrapped defensively
553
- * and the span is always marked-as-error and ended (in the finally).
554
- */
555
625
  try {
556
626
  const exceptionAttributes: Attributes =
557
627
  this.getExceptionAttributes(exception);
558
628
 
559
- // log the exception as well
560
- logger.error(exception);
629
+ const errorClass: ErrorClass = ErrorClassResolver.resolve(exception);
630
+ const alreadyReported: boolean = markErrorReported(exception);
561
631
 
562
- /*
563
- * Span *events* (from recordException) are not reliably surfaced when the
564
- * span is read back, and setStatus on its own only records the error CODE,
565
- * not the message. So we also attach the exception details as queryable
566
- * span attributes — including DB driver fields like the failing constraint
567
- * and table — so the actual cause is visible in the trace UI instead of an
568
- * empty "Error" status.
569
- */
570
- span.setAttributes(exceptionAttributes);
632
+ const exceptionType: string =
633
+ (exceptionAttributes["exception.type"] as string) || "Error";
634
+ const exceptionMessage: string =
635
+ (exceptionAttributes["exception.message"] as string) || "";
636
+
637
+ if (!alreadyReported) {
638
+ // Logger applies the same classification and demotes to WARN severity.
639
+ logger.error(exception);
640
+ }
571
641
 
572
642
  /*
573
- * A NORMALIZED {name, message, stack} is handed to recordException
574
- * rather than the raw thrown value, because the OTel SDK reads
575
- * `exception.code` BEFORE `exception.name` when deciding
576
- * `exception.type` (sdk-trace-base Span.recordException). OneUptime's
577
- * Exception base class exposes an HTTP STATUS as `code`
578
- * (NotAuthenticatedException = 401, BadDataException = 400,
579
- * ServerException = 500 see Types/Exception/ExceptionCode), so every
580
- * exception this platform raises was being typed "401"/"400"/"500".
581
- *
582
- * That type is the exception event's identity downstream: it is hashed
583
- * into the TelemetryException group fingerprint and it is what the
584
- * Issues list and the AI insight titles show. A whole service's worth of
585
- * unrelated failures collapsed into "401", telling nobody anything.
586
- *
587
- * The payload is built from the attributes getExceptionAttributes has
588
- * already extracted, which means it inherits their truncation (4k
589
- * message, 8k stack) and their crash-safety — a hostile thrown value is
590
- * read exactly once, defensively, rather than twice.
643
+ * Span *events* are not reliably surfaced when the span is read back,
644
+ * and setStatus on its own only records the error CODE, not the message.
645
+ * So the exception details are also attached as queryable span
646
+ * attributes including DB driver fields like the failing constraint
647
+ * and table so the actual cause is visible in the trace UI instead of
648
+ * an empty "Error" status. Done for every class, on every frame: it is
649
+ * what makes `attributes.exception.type` usable as a drop-filter
650
+ * predicate at any depth.
591
651
  */
592
- span.recordException({
593
- name: (exceptionAttributes["exception.type"] as string) || "Error",
594
- message: (exceptionAttributes["exception.message"] as string) || "",
595
- ...(exceptionAttributes["exception.stacktrace"]
596
- ? {
597
- stack: exceptionAttributes["exception.stacktrace"] as string,
598
- }
599
- : {}),
600
- } as SpanException);
601
- span.setStatus({
602
- code: SpanStatusCode.ERROR,
603
- message:
604
- (exceptionAttributes["exception.message"] as string | undefined) ||
605
- "Error",
652
+ span.setAttributes({
653
+ ...exceptionAttributes,
654
+ [ERROR_CLASS_ATTRIBUTE_KEY]: errorClass,
606
655
  });
656
+
657
+ if (!isNonActionableErrorClass(errorClass)) {
658
+ if (!alreadyReported) {
659
+ span.addEvent(this.SPAN_EVENT_EXCEPTION, {
660
+ "exception.type": exceptionType,
661
+ "exception.message": exceptionMessage,
662
+ ...(exceptionAttributes["exception.stacktrace"]
663
+ ? {
664
+ "exception.stacktrace": exceptionAttributes[
665
+ "exception.stacktrace"
666
+ ] as string,
667
+ }
668
+ : {}),
669
+ });
670
+ }
671
+
672
+ span.setStatus({
673
+ code: SpanStatusCode.ERROR,
674
+ message: exceptionMessage || "Error",
675
+ });
676
+ } else if (!alreadyReported) {
677
+ /*
678
+ * Deliberately NOT named "exception" and deliberately carrying no
679
+ * `exception.*` keys: the first stops the trace ingest path from
680
+ * building an Issue, the second stops LogExceptionExtractor Path A
681
+ * from resurrecting one out of a log record. The event is still
682
+ * stored and still rendered.
683
+ *
684
+ * No setStatus at all. OTel says a 4xx on a SERVER span must stay
685
+ * Unset, and setStatus({code: UNSET}) is a documented no-op — so
686
+ * "leave it unset" is implemented as "do not call it".
687
+ */
688
+ span.addEvent(this.SPAN_EVENT_FAULT, {
689
+ [ERROR_CLASS_ATTRIBUTE_KEY]: errorClass,
690
+ "error.type": exceptionType,
691
+ "error.message": exceptionMessage,
692
+ ...(exceptionAttributes["exception.code"]
693
+ ? {
694
+ "error.code": exceptionAttributes["exception.code"] as string,
695
+ }
696
+ : {}),
697
+ });
698
+ }
699
+
700
+ this.incrementFaultCounter(errorClass, exceptionType);
607
701
  } catch {
608
702
  // Enrichment failed on some exotic thrown value — still flag the span.
609
703
  try {
@@ -611,8 +705,34 @@ export default class Telemetry {
611
705
  } catch {
612
706
  // span may already be ended; nothing more we can do.
613
707
  }
614
- } finally {
615
- this.endSpan(span);
708
+ }
709
+ }
710
+
711
+ /*
712
+ * Built lazily and through Telemetry.getCounter directly rather than through
713
+ * AppMetrics — AppMetrics imports Telemetry, so registering there would
714
+ * close an import cycle on the error path.
715
+ */
716
+ private static incrementFaultCounter(
717
+ errorClass: ErrorClass,
718
+ exceptionType: string,
719
+ ): void {
720
+ try {
721
+ if (!this.faultCounter) {
722
+ this.faultCounter = this.getCounter({
723
+ name: "oneuptime.fault.count",
724
+ description:
725
+ "Faults by fault domain and type, including the ones deliberately kept out of the Issues list.",
726
+ unit: "1",
727
+ });
728
+ }
729
+
730
+ this.faultCounter.add(1, {
731
+ [ERROR_CLASS_ATTRIBUTE_KEY]: errorClass,
732
+ "error.type": exceptionType,
733
+ });
734
+ } catch {
735
+ // Metrics must never break the error path.
616
736
  }
617
737
  }
618
738
 
@@ -783,7 +903,34 @@ export default class Telemetry {
783
903
  }
784
904
  }
785
905
 
906
+ /*
907
+ * Ending a span twice makes the SDK log
908
+ * "You can only call end() on a span once" via diag. That happened on EVERY
909
+ * error path: the recorder's finally ended the span, and CaptureSpan then
910
+ * ended it again in its own finally / .finally(). Guard here rather than at
911
+ * the call sites so any future caller is safe too.
912
+ */
786
913
  public static endSpan(span: Span): void {
914
+ try {
915
+ const endTime: unknown = (span as unknown as { endTime?: Array<number> })
916
+ .endTime;
917
+
918
+ /*
919
+ * sdk-trace-base sets endTime to [0, 0] until the span ends. A span
920
+ * implementation that does not expose it (a no-op span, a test double)
921
+ * falls through and is ended normally.
922
+ */
923
+ if (
924
+ Array.isArray(endTime) &&
925
+ endTime.length === 2 &&
926
+ !(endTime[0] === 0 && endTime[1] === 0)
927
+ ) {
928
+ return;
929
+ }
930
+ } catch {
931
+ // Fall through and end it.
932
+ }
933
+
787
934
  span.end();
788
935
  }
789
936
  }
@@ -0,0 +1,140 @@
1
+ <%#
2
+ Takes single-use bearer tokens out of the address bar before any
3
+ third-party tag can read them.
4
+
5
+ Password reset and email verification links carry their token in the URL
6
+ *path* — /accounts/reset-password/<token>, /accounts/verify-email/<token>,
7
+ /reset-password/<token> on a status page. Every analytics and advertising
8
+ tag on the page reports the page URL as a matter of course, so the token
9
+ left the browser to whoever the container happened to be loading. Measured
10
+ on production before this partial existed, a single visit to
11
+ /accounts/reset-password/<token> sent the token to five third parties:
12
+ region1.analytics.google.com, www.google.com, bat.bing.com, q.quora.com and
13
+ alb.reddit.com. A reset token is a bearer credential for the account, so
14
+ anyone with read access to any of those ad or analytics dashboards — inside
15
+ OneUptime or at the vendor — could take the account over for as long as the
16
+ token stayed valid.
17
+
18
+ Two mechanisms, in this order:
19
+
20
+ 1. The token is moved into sessionStorage and `history.replaceState`
21
+ rewrites the path to the token-free route. This runs synchronously in
22
+ <head>, before the Google Tag Manager snippet below it, so every tag the
23
+ container loads sees only /accounts/reset-password. Analytics is NOT
24
+ disabled by this — the signup funnel still reports — it just no longer
25
+ sees the credential. It also keeps the token out of the browser's own
26
+ history, which replaceState overwrites rather than appends to.
27
+
28
+ 2. If step 1 did not finish — no History API, a storage exception, a URL
29
+ the parser rejected — the token is still in the address bar, and the
30
+ partial fails closed by setting
31
+ __ONEUPTIME_SENSITIVE_URL_TOKEN_PENDING__. The Google Tag Manager
32
+ snippet on each page checks that flag and does not start the container
33
+ at all. Losing a page view is the cheaper failure.
34
+
35
+ The reset flow itself keeps working in both cases: the client reads the
36
+ token through Common/UI/Utils/SensitiveUrlToken, which prefers the
37
+ stash and falls back to the path when the bootstrap could not clean it.
38
+
39
+ MUST be included as the first thing in <head>, ahead of Google Tag Manager
40
+ and ahead of every external <script>. A tag that loads before this runs is
41
+ a tag that sees the token. Common/Tests/App/SensitiveUrlTokenBootstrap.test.ts
42
+ asserts that ordering for each page that includes it.
43
+
44
+ TOKEN_ROUTES below is duplicated in Common/UI/Utils/SensitiveUrlToken.ts,
45
+ which has to agree about which routes carry a token; the same test asserts
46
+ the two lists match. Add a route to both or to neither.
47
+ -%>
48
+ <meta name="referrer" content="no-referrer" />
49
+ <script>
50
+ (function (win) {
51
+ var STORAGE_KEY = "oneuptime-sensitive-url-token";
52
+
53
+ /*
54
+ * Route segments whose NEXT path segment is a single-use bearer token.
55
+ * Matched against the second-to-last segment, so this covers
56
+ * /accounts/reset-password/<token>, /reset-password/<token> and
57
+ * /status-page/<id>/reset-password/<token> alike.
58
+ */
59
+ var TOKEN_ROUTES = ["reset-password", "verify-email"];
60
+
61
+ function segmentsOf(pathname) {
62
+ var parts = String(pathname || "").split("/");
63
+ var kept = [];
64
+
65
+ for (var i = 0; i < parts.length; i++) {
66
+ if (parts[i] !== "") {
67
+ kept.push(parts[i]);
68
+ }
69
+ }
70
+
71
+ return kept;
72
+ }
73
+
74
+ /* True when the last segment of this path is a bearer token. */
75
+ function carriesToken(pathname) {
76
+ var segments = segmentsOf(pathname);
77
+
78
+ if (segments.length < 2) {
79
+ return false;
80
+ }
81
+
82
+ var parent = segments[segments.length - 2];
83
+
84
+ for (var i = 0; i < TOKEN_ROUTES.length; i++) {
85
+ if (parent === TOKEN_ROUTES[i]) {
86
+ return true;
87
+ }
88
+ }
89
+
90
+ return false;
91
+ }
92
+
93
+ var pending = true;
94
+
95
+ try {
96
+ var url = new URL(win.location.href);
97
+
98
+ if (carriesToken(url.pathname)) {
99
+ var segments = segmentsOf(url.pathname);
100
+ var token = segments.pop();
101
+
102
+ try {
103
+ token = decodeURIComponent(token);
104
+ } catch (_decodeError) {
105
+ /* A malformed escape sequence is handed on verbatim. */
106
+ }
107
+
108
+ try {
109
+ win.sessionStorage.setItem(STORAGE_KEY, token);
110
+ } catch (_storageError) {
111
+ /*
112
+ * Private mode and blocked storage. The in-memory handoff
113
+ * does not survive a reload, but it does survive the SPA
114
+ * boot, which is all the flow needs.
115
+ */
116
+ win.__ONEUPTIME_SENSITIVE_URL_TOKEN__ = token;
117
+ }
118
+
119
+ win.history.replaceState(
120
+ win.history.state,
121
+ "",
122
+ "/" + segments.join("/") + url.search + url.hash
123
+ );
124
+ }
125
+
126
+ /*
127
+ * Read the address bar back rather than trusting the rewrite. This
128
+ * is the whole safety condition: analytics runs only if the token
129
+ * is demonstrably no longer in the URL those tags are about to
130
+ * report.
131
+ */
132
+ pending = carriesToken(win.location.pathname);
133
+ } catch (_bootstrapError) {
134
+ /* Fail closed: something went wrong, so assume the token is exposed. */
135
+ pending = true;
136
+ }
137
+
138
+ win.__ONEUPTIME_SENSITIVE_URL_TOKEN_PENDING__ = pending;
139
+ })(window);
140
+ </script>
@@ -14,6 +14,7 @@ import {
14
14
  NetworkTopologyEdge,
15
15
  NetworkTopologyNode,
16
16
  } from "../../../Types/Monitor/SnmpMonitor/NetworkTopology";
17
+ import NetworkDevice from "../../../Models/DatabaseModels/NetworkDevice";
17
18
 
18
19
  /*
19
20
  * Issue #3435 — what the "Add to Monitoring" dialog actually opens with.
@@ -25,6 +26,12 @@ import {
25
26
  * initialValues object is type-safe, render-safe, and puts the operator back
26
27
  * to retyping what OneUptime already discovered.
27
28
  *
29
+ * Every device the dialog creates is probe-polled: there is no monitoring
30
+ * method to choose, the probe is required for a phone exactly as for a
31
+ * switch, and the SNMP step is optional for both. The cases below that used
32
+ * to split on "will this device be polled?" now assert that no such split
33
+ * exists.
34
+ *
28
35
  * The form itself is configuration passed as props, so ModelFormModal is
29
36
  * mocked to capture them and the capture is asserted directly — the same
30
37
  * approach DiscoveryScanWizardValidation.test.tsx uses for the Discovery
@@ -35,11 +42,18 @@ type CapturedModalProps = {
35
42
  title: string;
36
43
  description: string;
37
44
  initialValues: Record<string, unknown>;
45
+ onBeforeCreate?:
46
+ | ((
47
+ item: NetworkDevice,
48
+ miscDataProps: Record<string, unknown>,
49
+ ) => Promise<NetworkDevice>)
50
+ | undefined;
38
51
  formProps: {
39
- steps: Array<{ id: string; title: string }>;
52
+ steps: Array<{ id: string; title: string; showIf?: unknown }>;
40
53
  fields: Array<{
41
54
  field: Record<string, boolean>;
42
55
  required?: boolean | undefined;
56
+ stepId?: string | undefined;
43
57
  dropdownOptions?: Array<{ label: string; value: string }> | undefined;
44
58
  }>;
45
59
  };
@@ -250,13 +264,49 @@ describe("the Add to Monitoring dialog", () => {
250
264
  });
251
265
 
252
266
  /*
253
- * A phone is never SNMP-walkable, so opening on SNMP would create a device
254
- * that queues a walk it can only fail and then reads "pending" forever.
267
+ * There is no monitoring-method question any more. A phone is never
268
+ * SNMP-walkable, but it is pingable and pinging is all a probe-polled
269
+ * device needs to have a status — so the dialog asks nothing and writes
270
+ * Probe on the way out. ModelForm sends only the fields it renders, which
271
+ * is why the method travels through onBeforeCreate rather than
272
+ * initialValues: a seeded value with no field behind it would never reach
273
+ * the server.
255
274
  */
256
- test("opens a leaf device on monitor-backed rather than SNMP", async () => {
275
+ test("asks no monitoring-method question and writes Probe on the way out", async () => {
257
276
  const props: CapturedModalProps = await openDialog();
258
277
 
259
- expect(props.initialValues["monitoringMethod"]).toBe("Monitor");
278
+ expect(fieldFor(props, "monitoringMethod")).toBeUndefined();
279
+ expect(props.initialValues["monitoringMethod"]).toBeUndefined();
280
+ expect(props.onBeforeCreate).toBeDefined();
281
+
282
+ const device: NetworkDevice = await props.onBeforeCreate!(
283
+ new NetworkDevice(),
284
+ {},
285
+ );
286
+
287
+ expect(device.monitoringMethod).toBe("Probe");
288
+ });
289
+
290
+ /*
291
+ * And the same for an infrastructure peer: the method is not a function of
292
+ * the role, so a switch and a phone leave the dialog identically.
293
+ */
294
+ test("writes Probe for a walkable peer too", async () => {
295
+ const props: CapturedModalProps = await openDialog({
296
+ ...PHONE_NODE,
297
+ role: "switch",
298
+ roleKey: "switch",
299
+ roleLabel: "Switch",
300
+ roleId: SWITCH_ROLE_ID,
301
+ isSnmpWalkableRole: true,
302
+ });
303
+
304
+ const device: NetworkDevice = await props.onBeforeCreate!(
305
+ new NetworkDevice(),
306
+ {},
307
+ );
308
+
309
+ expect(device.monitoringMethod).toBe("Probe");
260
310
  });
261
311
 
262
312
  /*
@@ -309,20 +359,22 @@ describe("the Add to Monitoring dialog", () => {
309
359
  });
310
360
 
311
361
  /*
312
- * The probe is only offered to a device something will actually poll
313
- * a monitor-backed device has no poller, and the field is hidden on that
314
- * branch anyway.
362
+ * The probe is inherited for EVERY device. It used to be withheld from a
363
+ * leaf device, which opened on a monitor-backed branch with the probe
364
+ * field hidden; a phone is as probe-polled as a switch now, so the probe
365
+ * its neighbours agree on is the right head start for both. The phone
366
+ * fixture carries the handset's isSnmpWalkableRole: false, which is
367
+ * exactly the case the seed used to be withheld from.
315
368
  */
316
- test("inherits a probe for a device that will be polled", async () => {
369
+ test("inherits a probe for a leaf device", async () => {
370
+ const props: CapturedModalProps = await openDialog();
371
+
372
+ expect(props.initialValues["probe"]).toBe("probe-a");
373
+ });
374
+
375
+ test("inherits a probe for a walkable device", async () => {
317
376
  const props: CapturedModalProps = await openDialog({
318
377
  ...PHONE_NODE,
319
- /*
320
- * The whole role stamp, not just `role`: the configured
321
- * isSnmpWalkableRole is what decides the monitoring method now, and the
322
- * phone fixture carries the handset's (false). Overriding only the
323
- * built-in role would leave the flag saying "nothing will poll this",
324
- * which is the opposite of what this test is about.
325
- */
326
378
  role: "switch",
327
379
  roleKey: "switch",
328
380
  roleLabel: "Switch",
@@ -330,14 +382,19 @@ describe("the Add to Monitoring dialog", () => {
330
382
  isSnmpWalkableRole: true,
331
383
  });
332
384
 
333
- expect(props.initialValues["monitoringMethod"]).toBe("SNMP");
334
385
  expect(props.initialValues["probe"]).toBe("probe-a");
335
386
  });
336
387
 
337
- test("does not hand a probe to a device nothing will poll", async () => {
388
+ /*
389
+ * Required for a phone exactly as for a switch: a probe-polled device with
390
+ * no probe is claimed by nothing and never polls, which is the "Pending
391
+ * forever" this flow exists to end. The server does not insist, so the
392
+ * form does.
393
+ */
394
+ test("requires a probe for a leaf device", async () => {
338
395
  const props: CapturedModalProps = await openDialog();
339
396
 
340
- expect(props.initialValues["probe"]).toBeUndefined();
397
+ expect(fieldFor(props, "probe")?.required).toBe(true);
341
398
  });
342
399
 
343
400
  /*
@@ -361,16 +418,16 @@ describe("the Add to Monitoring dialog", () => {
361
418
  });
362
419
 
363
420
  /*
364
- * The create form on the Devices list requires a monitor for a
365
- * monitor-backed device. Here it must not: an operator adopting a phone
366
- * from the map has no Ping monitor for it yet, and the server has always
367
- * allowed the two to be bound later the same contract the discovery
368
- * import relies on.
421
+ * No Monitor binding field at all. The binding is the override for gear a
422
+ * probe cannot reach, chosen on a device's Settings page; a neighbour the
423
+ * probe just heard about from the switch beside it is, by construction,
424
+ * reachable — so the dialog does not offer a field whose only honest value
425
+ * here is "empty".
369
426
  */
370
- test("does not demand a monitor that does not exist yet", async () => {
427
+ test("has no monitor binding field", async () => {
371
428
  const props: CapturedModalProps = await openDialog();
372
429
 
373
- expect(fieldFor(props, "monitor")?.required).toBe(false);
430
+ expect(fieldFor(props, "monitor")).toBeUndefined();
374
431
  });
375
432
 
376
433
  test("still demands the two things a device cannot exist without", async () => {
@@ -414,18 +471,62 @@ describe("the Add to Monitoring dialog", () => {
414
471
  ]);
415
472
  });
416
473
 
417
- test("walks the operator through the same steps the Devices form does", async () => {
474
+ test("walks the operator through Device Details, Probe & Site and SNMP", async () => {
418
475
  const props: CapturedModalProps = await openDialog();
419
476
 
420
477
  expect(
421
478
  props.formProps.steps.map((step: { id: string }) => {
422
479
  return step.id;
423
480
  }),
424
- ).toEqual([
425
- "monitoring-method",
426
- "device-details",
427
- "probe-and-site",
428
- "snmp",
429
- ]);
481
+ ).toEqual(["device-details", "probe-and-site", "snmp"]);
482
+ });
483
+
484
+ /*
485
+ * The SNMP step is walked through by every device, a phone included. It
486
+ * used to be hidden wholesale for a leaf device (nothing polled it, so
487
+ * nothing could use a credential); now the probe walks whatever it has
488
+ * credentials for, and leaving the step empty is the "ping only" answer.
489
+ */
490
+ test("shows the SNMP step to a leaf device, unconditionally", async () => {
491
+ const props: CapturedModalProps = await openDialog();
492
+
493
+ const snmpStep: { id: string; showIf?: unknown } | undefined =
494
+ props.formProps.steps.find((step: { id: string }) => {
495
+ return step.id === "snmp";
496
+ });
497
+
498
+ expect(snmpStep).toBeDefined();
499
+ expect(snmpStep?.showIf).toBeUndefined();
500
+ expect(fieldFor(props, "snmpVersion")).toBeDefined();
501
+ expect(fieldFor(props, "snmpCommunityString")?.required).toBe(false);
502
+ });
503
+
504
+ /*
505
+ * Every step the wizard declares is claimed by a field, and every field
506
+ * names a declared step — the two silent failures NetworkFormStepsInvariants
507
+ * pins against the source, asserted here against the props the form is
508
+ * actually handed.
509
+ */
510
+ test("every field lands on a step the wizard declares, and no step is empty", async () => {
511
+ const props: CapturedModalProps = await openDialog();
512
+
513
+ const declared: Array<string> = props.formProps.steps.map(
514
+ (step: { id: string }) => {
515
+ return step.id;
516
+ },
517
+ );
518
+ const used: Array<string> = props.formProps.fields.map(
519
+ (field: { stepId?: string | undefined }) => {
520
+ return field.stepId || "";
521
+ },
522
+ );
523
+
524
+ for (const stepId of used) {
525
+ expect(declared).toContain(stepId);
526
+ }
527
+
528
+ for (const stepId of declared) {
529
+ expect(used).toContain(stepId);
530
+ }
430
531
  });
431
532
  });