@oneuptime/common 12.0.30 → 12.0.32

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 (645) hide show
  1. package/Models/AnalyticsModels/SecurityEvent.ts +48 -16
  2. package/Models/AnalyticsModels/ThreatIntelIndicator.ts +10 -5
  3. package/Models/DatabaseModels/AlertSeverity.ts +44 -0
  4. package/Models/DatabaseModels/AlertState.ts +0 -2
  5. package/Models/DatabaseModels/DetectionRule.ts +16 -5
  6. package/Models/DatabaseModels/Domain.ts +1 -1
  7. package/Models/DatabaseModels/GoogleSecOpsConnection.ts +14 -5
  8. package/Models/DatabaseModels/Incident.ts +1 -1
  9. package/Models/DatabaseModels/IncidentSeverity.ts +44 -0
  10. package/Models/DatabaseModels/IncidentTemplate.ts +1 -1
  11. package/Models/DatabaseModels/Index.ts +4 -0
  12. package/Models/DatabaseModels/MetricType.ts +0 -2
  13. package/Models/DatabaseModels/MonitorStatusTimeline.ts +0 -2
  14. package/Models/DatabaseModels/MonitorTest.ts +0 -2
  15. package/Models/DatabaseModels/NetworkDevice.ts +234 -5
  16. package/Models/DatabaseModels/NetworkDeviceAutoImportRule.ts +88 -0
  17. package/Models/DatabaseModels/NetworkDeviceDiscoveryScan.ts +22 -0
  18. package/Models/DatabaseModels/NetworkDeviceOidTemplate.ts +501 -0
  19. package/Models/DatabaseModels/NetworkDeviceRole.ts +648 -0
  20. package/Models/DatabaseModels/ScheduledMaintenance.ts +1 -1
  21. package/Models/DatabaseModels/ScheduledMaintenanceTemplate.ts +1 -1
  22. package/Models/DatabaseModels/StatusPageAnnouncement.ts +0 -2
  23. package/Models/DatabaseModels/StatusPageAnnouncementTemplate.ts +0 -2
  24. package/Models/DatabaseModels/StatusPagePrivateUser.ts +0 -2
  25. package/Models/DatabaseModels/StatusPageResource.ts +0 -2
  26. package/Models/DatabaseModels/StatusPageSubscriber.ts +0 -2
  27. package/Models/DatabaseModels/ThreatIntelFeed.ts +16 -5
  28. package/Server/API/GlobalConfigAPI.ts +362 -183
  29. package/Server/API/TelemetryAPI.ts +42 -4
  30. package/Server/EnvironmentConfig.ts +112 -0
  31. package/Server/Infrastructure/Postgres/SchemaMigrations/1790500000000-AddNetworkDeviceOidTemplate.ts +59 -0
  32. package/Server/Infrastructure/Postgres/SchemaMigrations/1790600000000-AddAutoImportRuleOidTemplate.ts +25 -0
  33. package/Server/Infrastructure/Postgres/SchemaMigrations/1790800000000-AddNetworkDeviceRoleTable.ts +72 -0
  34. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +6 -0
  35. package/Server/Middleware/MultipartFormData.ts +118 -32
  36. package/Server/Services/AlertEpisodeLabelRuleEngineService.ts +9 -1
  37. package/Server/Services/AlertEpisodeOnCallRuleEngineService.ts +9 -1
  38. package/Server/Services/AlertEpisodeOwnerRuleEngineService.ts +9 -1
  39. package/Server/Services/AlertEpisodePrivacyRuleEngineService.ts +9 -1
  40. package/Server/Services/AlertGroupingEngineService.ts +9 -1
  41. package/Server/Services/AlertLabelRuleEngineService.ts +9 -1
  42. package/Server/Services/AlertOnCallRuleEngineService.ts +9 -1
  43. package/Server/Services/AlertOwnerRuleEngineService.ts +9 -1
  44. package/Server/Services/AlertPrivacyRuleEngineService.ts +9 -1
  45. package/Server/Services/AlertReminderRuleService.ts +9 -1
  46. package/Server/Services/AutoRemediationRuleEngineService.ts +9 -1
  47. package/Server/Services/CephClusterLabelRuleEngineService.ts +9 -1
  48. package/Server/Services/CephClusterOwnerRuleEngineService.ts +9 -1
  49. package/Server/Services/CloudResourceLabelRuleEngineService.ts +9 -1
  50. package/Server/Services/CloudResourceOwnerRuleEngineService.ts +9 -1
  51. package/Server/Services/DashboardLabelRuleEngineService.ts +9 -1
  52. package/Server/Services/DashboardOwnerRuleEngineService.ts +9 -1
  53. package/Server/Services/DatabaseService.ts +39 -9
  54. package/Server/Services/DockerHostLabelRuleEngineService.ts +9 -1
  55. package/Server/Services/DockerHostOwnerRuleEngineService.ts +9 -1
  56. package/Server/Services/DockerSwarmClusterLabelRuleEngineService.ts +9 -1
  57. package/Server/Services/DockerSwarmClusterOwnerRuleEngineService.ts +9 -1
  58. package/Server/Services/HostLabelRuleEngineService.ts +9 -1
  59. package/Server/Services/HostOwnerRuleEngineService.ts +9 -1
  60. package/Server/Services/IncidentEpisodeLabelRuleEngineService.ts +9 -1
  61. package/Server/Services/IncidentEpisodeOnCallRuleEngineService.ts +9 -1
  62. package/Server/Services/IncidentEpisodeOwnerRuleEngineService.ts +9 -1
  63. package/Server/Services/IncidentEpisodePrivacyRuleEngineService.ts +9 -1
  64. package/Server/Services/IncidentGroupingEngineService.ts +9 -1
  65. package/Server/Services/IncidentLabelRuleEngineService.ts +9 -1
  66. package/Server/Services/IncidentOnCallRuleEngineService.ts +9 -1
  67. package/Server/Services/IncidentOwnerRuleEngineService.ts +9 -1
  68. package/Server/Services/IncidentPrivacyRuleEngineService.ts +9 -1
  69. package/Server/Services/IncidentReminderRuleService.ts +9 -1
  70. package/Server/Services/IncidentSlaRuleService.ts +9 -1
  71. package/Server/Services/IncomingCallPolicyLabelRuleEngineService.ts +9 -1
  72. package/Server/Services/IncomingCallPolicyOwnerRuleEngineService.ts +9 -1
  73. package/Server/Services/Index.ts +4 -0
  74. package/Server/Services/IoTFleetLabelRuleEngineService.ts +9 -1
  75. package/Server/Services/IoTFleetOwnerRuleEngineService.ts +9 -1
  76. package/Server/Services/KubernetesClusterLabelRuleEngineService.ts +9 -1
  77. package/Server/Services/KubernetesClusterOwnerRuleEngineService.ts +9 -1
  78. package/Server/Services/KubernetesResourceService.ts +5 -1
  79. package/Server/Services/MonitorLabelRuleEngineService.ts +9 -1
  80. package/Server/Services/MonitorOwnerRuleEngineService.ts +9 -1
  81. package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +35 -0
  82. package/Server/Services/NetworkDeviceAutoImportRuleService.ts +96 -0
  83. package/Server/Services/NetworkDeviceLabelRuleEngineService.ts +9 -1
  84. package/Server/Services/NetworkDeviceOidTemplateService.ts +201 -0
  85. package/Server/Services/NetworkDeviceOwnerRuleEngineService.ts +9 -1
  86. package/Server/Services/NetworkDeviceRoleService.ts +90 -0
  87. package/Server/Services/NetworkDeviceService.ts +209 -1
  88. package/Server/Services/OnCallDutyPolicyLabelRuleEngineService.ts +9 -1
  89. package/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.ts +9 -1
  90. package/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.ts +9 -1
  91. package/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.ts +9 -1
  92. package/Server/Services/PodmanHostLabelRuleEngineService.ts +9 -1
  93. package/Server/Services/PodmanHostOwnerRuleEngineService.ts +9 -1
  94. package/Server/Services/ProjectService.ts +85 -0
  95. package/Server/Services/ProxmoxClusterLabelRuleEngineService.ts +9 -1
  96. package/Server/Services/ProxmoxClusterOwnerRuleEngineService.ts +9 -1
  97. package/Server/Services/RumApplicationLabelRuleEngineService.ts +9 -1
  98. package/Server/Services/RumApplicationOwnerRuleEngineService.ts +9 -1
  99. package/Server/Services/RunbookLabelRuleEngineService.ts +9 -1
  100. package/Server/Services/RunbookOwnerRuleEngineService.ts +9 -1
  101. package/Server/Services/RunbookRuleEngineService.ts +9 -1
  102. package/Server/Services/ScheduledMaintenanceLabelRuleEngineService.ts +9 -1
  103. package/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.ts +9 -1
  104. package/Server/Services/ScheduledMaintenanceReminderRuleService.ts +9 -1
  105. package/Server/Services/ServerlessFunctionLabelRuleEngineService.ts +9 -1
  106. package/Server/Services/ServerlessFunctionOwnerRuleEngineService.ts +9 -1
  107. package/Server/Services/ServiceLabelRuleEngineService.ts +9 -1
  108. package/Server/Services/ServiceOwnerRuleEngineService.ts +9 -1
  109. package/Server/Services/StatusPageLabelRuleEngineService.ts +9 -1
  110. package/Server/Services/StatusPageMonitorRuleEngineService.ts +7 -0
  111. package/Server/Services/StatusPageOwnerRuleEngineService.ts +9 -1
  112. package/Server/Services/TelemetrySourceMapService.ts +266 -23
  113. package/Server/Services/UserNotificationSettingService.ts +0 -6
  114. package/Server/Services/UserService.ts +27 -0
  115. package/Server/Services/WorkflowLabelRuleEngineService.ts +9 -1
  116. package/Server/Services/WorkflowOwnerRuleEngineService.ts +9 -1
  117. package/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.ts +186 -0
  118. package/Server/Utils/Monitor/CapturedMetricAttributeUtil.ts +245 -0
  119. package/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.ts +21 -2
  120. package/Server/Utils/Monitor/MonitorMetricUtil.ts +55 -21
  121. package/Server/Utils/Monitor/MonitorTemplateUtil.ts +32 -0
  122. package/Server/Utils/Monitor/NetworkDeviceMetricUtil.ts +15 -2
  123. package/Server/Utils/Monitor/NetworkDeviceWalkUtil.ts +18 -1
  124. package/Server/Utils/Monitor/NetworkInventoryUtil.ts +10 -0
  125. package/Server/Utils/Monitor/SeriesResourceLabels.ts +34 -0
  126. package/Server/Utils/Rules/RuleEngineRuleRead.ts +48 -0
  127. package/Server/Utils/Telemetry/ExceptionSanitizer.ts +14 -1
  128. package/Server/Utils/Telemetry/LogExceptionExtractor.ts +14 -2
  129. package/Server/Utils/Telemetry/SourceMapResolver.ts +16 -5
  130. package/Server/Utils/Telemetry/StackTraceParser.ts +399 -0
  131. package/Tests/App/Dashboard/AddNeighborToMonitoringModal.test.tsx +31 -1
  132. package/Tests/App/Dashboard/DashboardChartWidgetZoom.test.tsx +35 -8
  133. package/Tests/App/Dashboard/DashboardCommandPalette.test.tsx +107 -3
  134. package/Tests/App/Dashboard/DashboardWideChartZoom.test.tsx +401 -0
  135. package/Tests/App/Dashboard/EventOverlayHook.test.tsx +125 -0
  136. package/Tests/App/Dashboard/HeaderImageAssets.test.tsx +93 -0
  137. package/Tests/App/Dashboard/MonitorTemplateColumnAndFacet.test.tsx +318 -0
  138. package/Tests/App/Dashboard/NetworkDeviceBulkDelete.test.tsx +357 -0
  139. package/Tests/App/Dashboard/NetworkSideMenu.test.tsx +590 -0
  140. package/Tests/App/Dashboard/OnCallReadinessSurfaces.test.tsx +3 -3
  141. package/Tests/App/Dashboard/SideMenuHarness.tsx +11 -3
  142. package/Tests/App/Dashboard/UserElementEmail.test.tsx +12 -4
  143. package/Tests/App/Dashboard/UserEmailCallSites.test.tsx +1 -1
  144. package/Tests/Models/DatabaseModels/DomainRoleTierCoverage.test.ts +14 -0
  145. package/Tests/Models/DatabaseModels/ModelRegistryInvariants.test.ts +543 -0
  146. package/Tests/Models/SecurityDomainAccessControl.test.ts +429 -0
  147. package/Tests/Server/API/GlobalConfigLicense.test.ts +657 -0
  148. package/Tests/Server/API/SecurityEventAttributesAPI.test.ts +84 -6
  149. package/Tests/Server/API/TelemetryResolveStackTraceAPI.test.ts +805 -0
  150. package/Tests/Server/Infrastructure/Postgres/AddOnCallCalendarFeedsMigration.test.ts +32 -7
  151. package/Tests/Server/Infrastructure/Postgres/NetworkDeviceRoleTableMigration.test.ts +476 -0
  152. package/Tests/Server/Middleware/IdentityRateLimit.test.ts +1144 -0
  153. package/Tests/Server/Middleware/MultipartFormData.test.ts +618 -3
  154. package/Tests/Server/Services/DatabaseServiceGenerateSlug.test.ts +215 -0
  155. package/Tests/Server/Services/MonitorLabelRuleEngineScale.test.ts +520 -0
  156. package/Tests/Server/Services/NetworkDeviceOidTemplateService.test.ts +332 -0
  157. package/Tests/Server/Services/NetworkDeviceOidTemplateWriteGuards.test.ts +409 -0
  158. package/Tests/Server/Services/NetworkDeviceRoleModel.test.ts +672 -0
  159. package/Tests/Server/Services/NetworkDeviceRuleEngines.test.ts +1 -1
  160. package/Tests/Server/Services/ProjectServiceCreateSubscriptionStarted.test.ts +67 -4
  161. package/Tests/Server/Services/RuleEngineRuleFetchLimit.test.ts +239 -0
  162. package/Tests/Server/Services/ScheduledMaintenanceSubscriberEndTime.test.ts +369 -0
  163. package/Tests/Server/Services/TelemetrySourceMapService.test.ts +1210 -2
  164. package/Tests/Server/Services/UserNotificationSettingMonitorDefaults.test.ts +248 -0
  165. package/Tests/Server/Services/UserNotificationSettingWorkspaceChannels.test.ts +43 -2
  166. package/Tests/Server/Services/UserServiceSeatLimit.test.ts +182 -0
  167. package/Tests/Server/Types/AnalyticsDatabase/SecurityEventModelPermission.test.ts +255 -0
  168. package/Tests/Server/Types/Database/Permissions/ReadBlockPermission.test.ts +212 -0
  169. package/Tests/Server/Types/Database/Permissions/SecurityRoleAccess.test.ts +413 -0
  170. package/Tests/Server/Utils/BasicCron.test.ts +283 -0
  171. package/Tests/Server/Utils/CodeRepository.test.ts +689 -0
  172. package/Tests/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.test.ts +495 -0
  173. package/Tests/Server/Utils/ExceptionSanitizer.test.ts +77 -0
  174. package/Tests/Server/Utils/IncomingCallPhoneNumber.test.ts +174 -0
  175. package/Tests/Server/Utils/Monitor/CapturedMetricAttributeUtil.test.ts +284 -0
  176. package/Tests/Server/Utils/Monitor/MonitorCustomMetricAttributes.test.ts +503 -0
  177. package/Tests/Server/Utils/Monitor/MonitorTemplatePrototypePollution.test.ts +106 -0
  178. package/Tests/Server/Utils/Monitor/NetworkDeviceWalkLogWritePath.test.ts +33 -4
  179. package/Tests/Server/Utils/Monitor/NetworkDeviceWalkUtil.test.ts +14 -4
  180. package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +44 -0
  181. package/Tests/Server/Utils/OpenAPISpec.test.ts +536 -0
  182. package/Tests/Server/Utils/Rules/RuleEngineRuleRead.test.ts +115 -0
  183. package/Tests/Server/Utils/StackTraceParser.test.ts +610 -0
  184. package/Tests/Server/Utils/Telemetry/LogExceptionExtractor.test.ts +0 -0
  185. package/Tests/Server/Utils/Telemetry/SourceMapLimits.test.ts +656 -0
  186. package/Tests/Server/Utils/Telemetry/SourceMapResolver.test.ts +100 -0
  187. package/Tests/Types/Monitor/SnmpMonitor/SnmpOidListUtil.test.ts +454 -0
  188. package/Tests/Types/NetworkDevice/DefaultNetworkDeviceRole.test.ts +417 -0
  189. package/Tests/Types/SecurityRolePermissions.test.ts +193 -0
  190. package/Tests/UI/Components/Charts/AnnotationLayout.test.ts +773 -0
  191. package/Tests/UI/Components/Charts/ChartAnnotationRail.test.tsx +789 -0
  192. package/Tests/UI/Components/Charts/ChartBucketIdentity.test.ts +254 -0
  193. package/Tests/UI/Components/Charts/ChartClickDoubleClickDisambiguation.test.tsx +221 -0
  194. package/Tests/UI/Components/Charts/ChartDoubleClickReset.test.tsx +220 -0
  195. package/Tests/UI/Components/Charts/TimeAnnotation.test.ts +471 -0
  196. package/Tests/UI/Components/EditionLabelLicenseRefresh.test.tsx +405 -0
  197. package/Tests/UI/Components/ErrorMessageRefreshControl.test.tsx +83 -0
  198. package/Tests/UI/Components/MarkdownConverters.test.ts +686 -0
  199. package/Tests/UI/Components/ModelTable/BaseModelTableBulkDelete.test.tsx +751 -0
  200. package/Tests/UI/Components/ModelTable/BaseModelTableColumnCustomization.test.tsx +475 -43
  201. package/Tests/UI/Components/ModelTable/BaseModelTableDeleteAndEmptyStates.test.tsx +341 -0
  202. package/Tests/UI/Components/ModelTable/ColumnPreference.test.ts +89 -0
  203. package/Tests/UI/Components/NavBarCommandKGating.test.tsx +103 -8
  204. package/Tests/UI/Components/OrderedStatesList.test.tsx +5 -5
  205. package/Tests/UI/Components/PendingProjectInvitations.test.tsx +1 -1
  206. package/Tests/UI/Components/SideMenuItem.test.tsx +30 -0
  207. package/Tests/UI/Components/TableSortAndMobileColumns.test.tsx +195 -0
  208. package/Tests/UI/Components/XAxis.test.ts +270 -5
  209. package/Tests/UI/Components/XAxisDaylightSaving.test.ts +113 -0
  210. package/Tests/UI/Styles/ChartFocusRing.test.ts +153 -0
  211. package/Tests/UI/Styles/ChartFocusRingCoverage.test.tsx +377 -0
  212. package/Tests/UI/Styles/ThemeStylesheet.ts +162 -0
  213. package/Tests/UI/Utils/TableColumnsToCsv.test.ts +30 -0
  214. package/Tests/UI/Utils/UseDashboardTimeRangeZoom.test.tsx +187 -0
  215. package/Tests/Utils/Dashboard/DashboardResourceListSharedArgs.test.ts +302 -0
  216. package/Tests/Utils/Dashboard/DashboardTimeRangeZoom.test.ts +242 -0
  217. package/Tests/Utils/EnterpriseLicenseSeats.test.ts +507 -0
  218. package/Tests/Utils/Monitor/NetworkDeviceRoleCatalog.test.ts +981 -0
  219. package/Tests/Utils/Monitor/NetworkTopologyRoleCatalog.test.ts +865 -0
  220. package/Tests/Utils/NetworkDevice/DeviceRoleKeyUtil.test.ts +538 -0
  221. package/Tests/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.test.ts +951 -1
  222. package/Tests/Utils/NetworkDiscovery/DiscoveredHostUtil.test.ts +238 -0
  223. package/Tests/Utils/NetworkDiscovery/DiscoveryReverseDnsChain.test.ts +1056 -0
  224. package/Tests/Utils/NetworkDiscovery/ReverseDnsNameUtil.test.ts +882 -0
  225. package/Tests/Utils/Slo/SloEvaluation.test.ts +171 -0
  226. package/Tests/Utils/Slug.test.ts +61 -1
  227. package/Tests/jest.setup.ts +19 -0
  228. package/Types/Date.ts +39 -0
  229. package/Types/Monitor/SnmpMonitor/NetworkTopology.ts +61 -0
  230. package/Types/Monitor/SnmpMonitor/SnmpOidListUtil.ts +333 -0
  231. package/Types/NetworkDevice/DefaultNetworkDeviceRole.ts +145 -0
  232. package/Types/Permission.ts +141 -0
  233. package/Types/Rum/SessionReplay.ts +21 -0
  234. package/Types/Telemetry/SourceMap.ts +8 -0
  235. package/UI/Components/Charts/Area/AreaChart.tsx +7 -0
  236. package/UI/Components/Charts/Bar/BarChart.tsx +6 -0
  237. package/UI/Components/Charts/ChartGroup/ChartGroup.tsx +9 -1
  238. package/UI/Components/Charts/ChartLibrary/Annotations/AnnotationHoverCard.tsx +176 -0
  239. package/UI/Components/Charts/ChartLibrary/Annotations/AnnotationLayout.ts +745 -0
  240. package/UI/Components/Charts/ChartLibrary/Annotations/ChartAnnotationLayer.tsx +576 -0
  241. package/UI/Components/Charts/ChartLibrary/Annotations/UseChartAnnotations.tsx +204 -0
  242. package/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.tsx +554 -545
  243. package/UI/Components/Charts/ChartLibrary/BarChart/BarChart.tsx +337 -371
  244. package/UI/Components/Charts/ChartLibrary/LineChart/LineChart.tsx +549 -540
  245. package/UI/Components/Charts/ChartLibrary/Types/FormattedReferenceRegion.ts +7 -3
  246. package/UI/Components/Charts/ChartLibrary/Types/FormattedTimeReferenceLine.ts +14 -3
  247. package/UI/Components/Charts/ChartLibrary/Utils/DoubleClick.ts +13 -0
  248. package/UI/Components/Charts/Line/LineChart.tsx +7 -0
  249. package/UI/Components/Charts/Types/ChartEventKind.ts +13 -0
  250. package/UI/Components/Charts/Types/ReferenceRegionProps.ts +6 -0
  251. package/UI/Components/Charts/Types/TimeReferenceLineProps.ts +20 -3
  252. package/UI/Components/Charts/Utils/TimeAnnotation.ts +69 -35
  253. package/UI/Components/Charts/Utils/XAxis.ts +125 -18
  254. package/UI/Components/EditionLabel/EditionLabel.tsx +280 -26
  255. package/UI/Components/ErrorMessage/ErrorMessage.tsx +21 -10
  256. package/UI/Components/Feed/FeedItem.tsx +4 -5
  257. package/UI/Components/Header/HeaderIconDropdownButton.tsx +1 -2
  258. package/UI/Components/Header/UserProfile/UserProfile.tsx +1 -2
  259. package/UI/Components/Image/Image.tsx +20 -3
  260. package/UI/Components/Markdown.tsx/MarkdownConverters.ts +0 -0
  261. package/UI/Components/MemberRoleAssignment/MemberRoleAssignment.tsx +1 -2
  262. package/UI/Components/ModelTable/BaseModelTable.tsx +200 -39
  263. package/UI/Components/Navbar/NavBar.tsx +62 -13
  264. package/UI/Components/Navbar/NavBarMenuModal.tsx +7 -2
  265. package/UI/Components/SideMenu/CountModelSideMenuItem.tsx +2 -0
  266. package/UI/Components/SideMenu/SideMenu.tsx +12 -2
  267. package/UI/Components/SideMenu/SideMenuItem.tsx +4 -1
  268. package/UI/Components/SideMenu/SideMenuSection.tsx +14 -2
  269. package/UI/Components/Table/TableHeader.tsx +64 -48
  270. package/UI/Components/Table/TableRow.tsx +13 -3
  271. package/UI/Styles/Theme.css +38 -0
  272. package/UI/Utils/UseDashboardTimeRangeZoom.ts +77 -0
  273. package/Utils/Dashboard/DashboardTimeRangeZoom.ts +118 -0
  274. package/Utils/EnterpriseLicense/EnterpriseLicenseSeats.ts +271 -0
  275. package/Utils/Monitor/NetworkDeviceRoleCatalog.ts +232 -0
  276. package/Utils/Monitor/NetworkDeviceRoleUtil.ts +2 -1
  277. package/Utils/Monitor/NetworkTopologyUtil.ts +116 -33
  278. package/Utils/NetworkDevice/DeviceRoleKeyUtil.ts +137 -0
  279. package/Utils/NetworkDiscovery/AutoImportRuleMatcher.ts +6 -0
  280. package/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.ts +141 -10
  281. package/Utils/NetworkDiscovery/DiscoveredHostUtil.ts +55 -3
  282. package/Utils/NetworkDiscovery/ReverseDnsNameUtil.ts +151 -0
  283. package/Utils/Rules/RuleEngineLimits.ts +32 -0
  284. package/Utils/Rules/RulePatternMatchUtil.ts +1 -1
  285. package/Utils/Slug.ts +34 -1
  286. package/build/dist/Models/AnalyticsModels/SecurityEvent.js +48 -16
  287. package/build/dist/Models/AnalyticsModels/SecurityEvent.js.map +1 -1
  288. package/build/dist/Models/AnalyticsModels/ThreatIntelIndicator.js +10 -5
  289. package/build/dist/Models/AnalyticsModels/ThreatIntelIndicator.js.map +1 -1
  290. package/build/dist/Models/DatabaseModels/AlertSeverity.js +46 -1
  291. package/build/dist/Models/DatabaseModels/AlertSeverity.js.map +1 -1
  292. package/build/dist/Models/DatabaseModels/AlertState.js +0 -2
  293. package/build/dist/Models/DatabaseModels/AlertState.js.map +1 -1
  294. package/build/dist/Models/DatabaseModels/DetectionRule.js +16 -5
  295. package/build/dist/Models/DatabaseModels/DetectionRule.js.map +1 -1
  296. package/build/dist/Models/DatabaseModels/Domain.js +1 -1
  297. package/build/dist/Models/DatabaseModels/Domain.js.map +1 -1
  298. package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js +14 -5
  299. package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js.map +1 -1
  300. package/build/dist/Models/DatabaseModels/Incident.js +1 -1
  301. package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
  302. package/build/dist/Models/DatabaseModels/IncidentSeverity.js +46 -1
  303. package/build/dist/Models/DatabaseModels/IncidentSeverity.js.map +1 -1
  304. package/build/dist/Models/DatabaseModels/IncidentTemplate.js +1 -1
  305. package/build/dist/Models/DatabaseModels/IncidentTemplate.js.map +1 -1
  306. package/build/dist/Models/DatabaseModels/Index.js +4 -0
  307. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  308. package/build/dist/Models/DatabaseModels/MetricType.js +0 -2
  309. package/build/dist/Models/DatabaseModels/MetricType.js.map +1 -1
  310. package/build/dist/Models/DatabaseModels/MonitorStatusTimeline.js +0 -2
  311. package/build/dist/Models/DatabaseModels/MonitorStatusTimeline.js.map +1 -1
  312. package/build/dist/Models/DatabaseModels/MonitorTest.js +0 -2
  313. package/build/dist/Models/DatabaseModels/MonitorTest.js.map +1 -1
  314. package/build/dist/Models/DatabaseModels/NetworkDevice.js +239 -6
  315. package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
  316. package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js +88 -0
  317. package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js.map +1 -1
  318. package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -1
  319. package/build/dist/Models/DatabaseModels/NetworkDeviceOidTemplate.js +521 -0
  320. package/build/dist/Models/DatabaseModels/NetworkDeviceOidTemplate.js.map +1 -0
  321. package/build/dist/Models/DatabaseModels/NetworkDeviceRole.js +677 -0
  322. package/build/dist/Models/DatabaseModels/NetworkDeviceRole.js.map +1 -0
  323. package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js +1 -1
  324. package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js.map +1 -1
  325. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplate.js +1 -1
  326. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplate.js.map +1 -1
  327. package/build/dist/Models/DatabaseModels/StatusPageAnnouncement.js +0 -2
  328. package/build/dist/Models/DatabaseModels/StatusPageAnnouncement.js.map +1 -1
  329. package/build/dist/Models/DatabaseModels/StatusPageAnnouncementTemplate.js +0 -2
  330. package/build/dist/Models/DatabaseModels/StatusPageAnnouncementTemplate.js.map +1 -1
  331. package/build/dist/Models/DatabaseModels/StatusPagePrivateUser.js +0 -2
  332. package/build/dist/Models/DatabaseModels/StatusPagePrivateUser.js.map +1 -1
  333. package/build/dist/Models/DatabaseModels/StatusPageResource.js +0 -2
  334. package/build/dist/Models/DatabaseModels/StatusPageResource.js.map +1 -1
  335. package/build/dist/Models/DatabaseModels/StatusPageSubscriber.js +0 -2
  336. package/build/dist/Models/DatabaseModels/StatusPageSubscriber.js.map +1 -1
  337. package/build/dist/Models/DatabaseModels/ThreatIntelFeed.js +16 -5
  338. package/build/dist/Models/DatabaseModels/ThreatIntelFeed.js.map +1 -1
  339. package/build/dist/Server/API/GlobalConfigAPI.js +293 -176
  340. package/build/dist/Server/API/GlobalConfigAPI.js.map +1 -1
  341. package/build/dist/Server/API/TelemetryAPI.js +31 -3
  342. package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
  343. package/build/dist/Server/EnvironmentConfig.js +83 -0
  344. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  345. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790500000000-AddNetworkDeviceOidTemplate.js +26 -0
  346. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790500000000-AddNetworkDeviceOidTemplate.js.map +1 -0
  347. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790600000000-AddAutoImportRuleOidTemplate.js +14 -0
  348. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790600000000-AddAutoImportRuleOidTemplate.js.map +1 -0
  349. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790800000000-AddNetworkDeviceRoleTable.js +39 -0
  350. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790800000000-AddNetworkDeviceRoleTable.js.map +1 -0
  351. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +6 -0
  352. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  353. package/build/dist/Server/Middleware/MultipartFormData.js +93 -28
  354. package/build/dist/Server/Middleware/MultipartFormData.js.map +1 -1
  355. package/build/dist/Server/Services/AlertEpisodeLabelRuleEngineService.js +8 -1
  356. package/build/dist/Server/Services/AlertEpisodeLabelRuleEngineService.js.map +1 -1
  357. package/build/dist/Server/Services/AlertEpisodeOnCallRuleEngineService.js +8 -1
  358. package/build/dist/Server/Services/AlertEpisodeOnCallRuleEngineService.js.map +1 -1
  359. package/build/dist/Server/Services/AlertEpisodeOwnerRuleEngineService.js +8 -1
  360. package/build/dist/Server/Services/AlertEpisodeOwnerRuleEngineService.js.map +1 -1
  361. package/build/dist/Server/Services/AlertEpisodePrivacyRuleEngineService.js +8 -1
  362. package/build/dist/Server/Services/AlertEpisodePrivacyRuleEngineService.js.map +1 -1
  363. package/build/dist/Server/Services/AlertGroupingEngineService.js +8 -1
  364. package/build/dist/Server/Services/AlertGroupingEngineService.js.map +1 -1
  365. package/build/dist/Server/Services/AlertLabelRuleEngineService.js +8 -1
  366. package/build/dist/Server/Services/AlertLabelRuleEngineService.js.map +1 -1
  367. package/build/dist/Server/Services/AlertOnCallRuleEngineService.js +8 -1
  368. package/build/dist/Server/Services/AlertOnCallRuleEngineService.js.map +1 -1
  369. package/build/dist/Server/Services/AlertOwnerRuleEngineService.js +8 -1
  370. package/build/dist/Server/Services/AlertOwnerRuleEngineService.js.map +1 -1
  371. package/build/dist/Server/Services/AlertPrivacyRuleEngineService.js +8 -1
  372. package/build/dist/Server/Services/AlertPrivacyRuleEngineService.js.map +1 -1
  373. package/build/dist/Server/Services/AlertReminderRuleService.js +8 -1
  374. package/build/dist/Server/Services/AlertReminderRuleService.js.map +1 -1
  375. package/build/dist/Server/Services/AutoRemediationRuleEngineService.js +8 -1
  376. package/build/dist/Server/Services/AutoRemediationRuleEngineService.js.map +1 -1
  377. package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js +8 -1
  378. package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js.map +1 -1
  379. package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js +8 -1
  380. package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js.map +1 -1
  381. package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js +8 -1
  382. package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js.map +1 -1
  383. package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js +8 -1
  384. package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js.map +1 -1
  385. package/build/dist/Server/Services/DashboardLabelRuleEngineService.js +8 -1
  386. package/build/dist/Server/Services/DashboardLabelRuleEngineService.js.map +1 -1
  387. package/build/dist/Server/Services/DashboardOwnerRuleEngineService.js +8 -1
  388. package/build/dist/Server/Services/DashboardOwnerRuleEngineService.js.map +1 -1
  389. package/build/dist/Server/Services/DatabaseService.js +31 -5
  390. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  391. package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js +8 -1
  392. package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js.map +1 -1
  393. package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js +8 -1
  394. package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js.map +1 -1
  395. package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js +8 -1
  396. package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js.map +1 -1
  397. package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js +8 -1
  398. package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js.map +1 -1
  399. package/build/dist/Server/Services/HostLabelRuleEngineService.js +8 -1
  400. package/build/dist/Server/Services/HostLabelRuleEngineService.js.map +1 -1
  401. package/build/dist/Server/Services/HostOwnerRuleEngineService.js +8 -1
  402. package/build/dist/Server/Services/HostOwnerRuleEngineService.js.map +1 -1
  403. package/build/dist/Server/Services/IncidentEpisodeLabelRuleEngineService.js +8 -1
  404. package/build/dist/Server/Services/IncidentEpisodeLabelRuleEngineService.js.map +1 -1
  405. package/build/dist/Server/Services/IncidentEpisodeOnCallRuleEngineService.js +8 -1
  406. package/build/dist/Server/Services/IncidentEpisodeOnCallRuleEngineService.js.map +1 -1
  407. package/build/dist/Server/Services/IncidentEpisodeOwnerRuleEngineService.js +8 -1
  408. package/build/dist/Server/Services/IncidentEpisodeOwnerRuleEngineService.js.map +1 -1
  409. package/build/dist/Server/Services/IncidentEpisodePrivacyRuleEngineService.js +8 -1
  410. package/build/dist/Server/Services/IncidentEpisodePrivacyRuleEngineService.js.map +1 -1
  411. package/build/dist/Server/Services/IncidentGroupingEngineService.js +8 -1
  412. package/build/dist/Server/Services/IncidentGroupingEngineService.js.map +1 -1
  413. package/build/dist/Server/Services/IncidentLabelRuleEngineService.js +8 -1
  414. package/build/dist/Server/Services/IncidentLabelRuleEngineService.js.map +1 -1
  415. package/build/dist/Server/Services/IncidentOnCallRuleEngineService.js +8 -1
  416. package/build/dist/Server/Services/IncidentOnCallRuleEngineService.js.map +1 -1
  417. package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js +8 -1
  418. package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js.map +1 -1
  419. package/build/dist/Server/Services/IncidentPrivacyRuleEngineService.js +8 -1
  420. package/build/dist/Server/Services/IncidentPrivacyRuleEngineService.js.map +1 -1
  421. package/build/dist/Server/Services/IncidentReminderRuleService.js +8 -1
  422. package/build/dist/Server/Services/IncidentReminderRuleService.js.map +1 -1
  423. package/build/dist/Server/Services/IncidentSlaRuleService.js +8 -1
  424. package/build/dist/Server/Services/IncidentSlaRuleService.js.map +1 -1
  425. package/build/dist/Server/Services/IncomingCallPolicyLabelRuleEngineService.js +8 -1
  426. package/build/dist/Server/Services/IncomingCallPolicyLabelRuleEngineService.js.map +1 -1
  427. package/build/dist/Server/Services/IncomingCallPolicyOwnerRuleEngineService.js +8 -1
  428. package/build/dist/Server/Services/IncomingCallPolicyOwnerRuleEngineService.js.map +1 -1
  429. package/build/dist/Server/Services/Index.js +4 -0
  430. package/build/dist/Server/Services/Index.js.map +1 -1
  431. package/build/dist/Server/Services/IoTFleetLabelRuleEngineService.js +8 -1
  432. package/build/dist/Server/Services/IoTFleetLabelRuleEngineService.js.map +1 -1
  433. package/build/dist/Server/Services/IoTFleetOwnerRuleEngineService.js +8 -1
  434. package/build/dist/Server/Services/IoTFleetOwnerRuleEngineService.js.map +1 -1
  435. package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js +8 -1
  436. package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js.map +1 -1
  437. package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js +8 -1
  438. package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js.map +1 -1
  439. package/build/dist/Server/Services/KubernetesResourceService.js +5 -1
  440. package/build/dist/Server/Services/KubernetesResourceService.js.map +1 -1
  441. package/build/dist/Server/Services/MonitorLabelRuleEngineService.js +8 -1
  442. package/build/dist/Server/Services/MonitorLabelRuleEngineService.js.map +1 -1
  443. package/build/dist/Server/Services/MonitorOwnerRuleEngineService.js +8 -1
  444. package/build/dist/Server/Services/MonitorOwnerRuleEngineService.js.map +1 -1
  445. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +30 -21
  446. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
  447. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js +64 -0
  448. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js.map +1 -1
  449. package/build/dist/Server/Services/NetworkDeviceLabelRuleEngineService.js +8 -1
  450. package/build/dist/Server/Services/NetworkDeviceLabelRuleEngineService.js.map +1 -1
  451. package/build/dist/Server/Services/NetworkDeviceOidTemplateService.js +180 -0
  452. package/build/dist/Server/Services/NetworkDeviceOidTemplateService.js.map +1 -0
  453. package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js +8 -1
  454. package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js.map +1 -1
  455. package/build/dist/Server/Services/NetworkDeviceRoleService.js +70 -0
  456. package/build/dist/Server/Services/NetworkDeviceRoleService.js.map +1 -0
  457. package/build/dist/Server/Services/NetworkDeviceService.js +154 -1
  458. package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
  459. package/build/dist/Server/Services/OnCallDutyPolicyLabelRuleEngineService.js +8 -1
  460. package/build/dist/Server/Services/OnCallDutyPolicyLabelRuleEngineService.js.map +1 -1
  461. package/build/dist/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.js +8 -1
  462. package/build/dist/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.js.map +1 -1
  463. package/build/dist/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.js +8 -1
  464. package/build/dist/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.js.map +1 -1
  465. package/build/dist/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.js +8 -1
  466. package/build/dist/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.js.map +1 -1
  467. package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js +8 -1
  468. package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js.map +1 -1
  469. package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js +8 -1
  470. package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js.map +1 -1
  471. package/build/dist/Server/Services/ProjectService.js +65 -0
  472. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  473. package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js +8 -1
  474. package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js.map +1 -1
  475. package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js +8 -1
  476. package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js.map +1 -1
  477. package/build/dist/Server/Services/RumApplicationLabelRuleEngineService.js +8 -1
  478. package/build/dist/Server/Services/RumApplicationLabelRuleEngineService.js.map +1 -1
  479. package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js +8 -1
  480. package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js.map +1 -1
  481. package/build/dist/Server/Services/RunbookLabelRuleEngineService.js +8 -1
  482. package/build/dist/Server/Services/RunbookLabelRuleEngineService.js.map +1 -1
  483. package/build/dist/Server/Services/RunbookOwnerRuleEngineService.js +8 -1
  484. package/build/dist/Server/Services/RunbookOwnerRuleEngineService.js.map +1 -1
  485. package/build/dist/Server/Services/RunbookRuleEngineService.js +8 -1
  486. package/build/dist/Server/Services/RunbookRuleEngineService.js.map +1 -1
  487. package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js +8 -1
  488. package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js.map +1 -1
  489. package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js +8 -1
  490. package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js.map +1 -1
  491. package/build/dist/Server/Services/ScheduledMaintenanceReminderRuleService.js +8 -1
  492. package/build/dist/Server/Services/ScheduledMaintenanceReminderRuleService.js.map +1 -1
  493. package/build/dist/Server/Services/ServerlessFunctionLabelRuleEngineService.js +8 -1
  494. package/build/dist/Server/Services/ServerlessFunctionLabelRuleEngineService.js.map +1 -1
  495. package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js +8 -1
  496. package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js.map +1 -1
  497. package/build/dist/Server/Services/ServiceLabelRuleEngineService.js +8 -1
  498. package/build/dist/Server/Services/ServiceLabelRuleEngineService.js.map +1 -1
  499. package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js +8 -1
  500. package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js.map +1 -1
  501. package/build/dist/Server/Services/StatusPageLabelRuleEngineService.js +8 -1
  502. package/build/dist/Server/Services/StatusPageLabelRuleEngineService.js.map +1 -1
  503. package/build/dist/Server/Services/StatusPageMonitorRuleEngineService.js +6 -0
  504. package/build/dist/Server/Services/StatusPageMonitorRuleEngineService.js.map +1 -1
  505. package/build/dist/Server/Services/StatusPageOwnerRuleEngineService.js +8 -1
  506. package/build/dist/Server/Services/StatusPageOwnerRuleEngineService.js.map +1 -1
  507. package/build/dist/Server/Services/TelemetrySourceMapService.js +213 -19
  508. package/build/dist/Server/Services/TelemetrySourceMapService.js.map +1 -1
  509. package/build/dist/Server/Services/UserNotificationSettingService.js +0 -1
  510. package/build/dist/Server/Services/UserNotificationSettingService.js.map +1 -1
  511. package/build/dist/Server/Services/UserService.js +25 -0
  512. package/build/dist/Server/Services/UserService.js.map +1 -1
  513. package/build/dist/Server/Services/WorkflowLabelRuleEngineService.js +8 -1
  514. package/build/dist/Server/Services/WorkflowLabelRuleEngineService.js.map +1 -1
  515. package/build/dist/Server/Services/WorkflowOwnerRuleEngineService.js +8 -1
  516. package/build/dist/Server/Services/WorkflowOwnerRuleEngineService.js.map +1 -1
  517. package/build/dist/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.js +145 -0
  518. package/build/dist/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.js.map +1 -0
  519. package/build/dist/Server/Utils/Monitor/CapturedMetricAttributeUtil.js +201 -0
  520. package/build/dist/Server/Utils/Monitor/CapturedMetricAttributeUtil.js.map +1 -0
  521. package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js +19 -2
  522. package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js.map +1 -1
  523. package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js +42 -23
  524. package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js.map +1 -1
  525. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +29 -0
  526. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
  527. package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js +11 -2
  528. package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js.map +1 -1
  529. package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js +16 -1
  530. package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js.map +1 -1
  531. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +10 -0
  532. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
  533. package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js +33 -0
  534. package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js.map +1 -1
  535. package/build/dist/Server/Utils/Rules/RuleEngineRuleRead.js +37 -0
  536. package/build/dist/Server/Utils/Rules/RuleEngineRuleRead.js.map +1 -0
  537. package/build/dist/Server/Utils/Telemetry/ExceptionSanitizer.js +12 -1
  538. package/build/dist/Server/Utils/Telemetry/ExceptionSanitizer.js.map +1 -1
  539. package/build/dist/Server/Utils/Telemetry/LogExceptionExtractor.js +14 -2
  540. package/build/dist/Server/Utils/Telemetry/LogExceptionExtractor.js.map +1 -1
  541. package/build/dist/Server/Utils/Telemetry/SourceMapResolver.js +15 -5
  542. package/build/dist/Server/Utils/Telemetry/SourceMapResolver.js.map +1 -1
  543. package/build/dist/Server/Utils/Telemetry/StackTraceParser.js +307 -0
  544. package/build/dist/Server/Utils/Telemetry/StackTraceParser.js.map +1 -1
  545. package/build/dist/Types/Date.js +27 -0
  546. package/build/dist/Types/Date.js.map +1 -1
  547. package/build/dist/Types/Monitor/SnmpMonitor/SnmpOidListUtil.js +253 -0
  548. package/build/dist/Types/Monitor/SnmpMonitor/SnmpOidListUtil.js.map +1 -0
  549. package/build/dist/Types/NetworkDevice/DefaultNetworkDeviceRole.js +105 -0
  550. package/build/dist/Types/NetworkDevice/DefaultNetworkDeviceRole.js.map +1 -0
  551. package/build/dist/Types/Permission.js +126 -0
  552. package/build/dist/Types/Permission.js.map +1 -1
  553. package/build/dist/Types/Rum/SessionReplay.js +19 -0
  554. package/build/dist/Types/Rum/SessionReplay.js.map +1 -1
  555. package/build/dist/UI/Components/Charts/Area/AreaChart.js +1 -1
  556. package/build/dist/UI/Components/Charts/Area/AreaChart.js.map +1 -1
  557. package/build/dist/UI/Components/Charts/Bar/BarChart.js +1 -1
  558. package/build/dist/UI/Components/Charts/Bar/BarChart.js.map +1 -1
  559. package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js +6 -1
  560. package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js.map +1 -1
  561. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/AnnotationHoverCard.js +83 -0
  562. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/AnnotationHoverCard.js.map +1 -0
  563. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/AnnotationLayout.js +531 -0
  564. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/AnnotationLayout.js.map +1 -0
  565. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/ChartAnnotationLayer.js +264 -0
  566. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/ChartAnnotationLayer.js.map +1 -0
  567. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/UseChartAnnotations.js +122 -0
  568. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/UseChartAnnotations.js.map +1 -0
  569. package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js +262 -234
  570. package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js.map +1 -1
  571. package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js +146 -153
  572. package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js.map +1 -1
  573. package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js +261 -233
  574. package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js.map +1 -1
  575. package/build/dist/UI/Components/Charts/ChartLibrary/Utils/DoubleClick.js +14 -0
  576. package/build/dist/UI/Components/Charts/ChartLibrary/Utils/DoubleClick.js.map +1 -0
  577. package/build/dist/UI/Components/Charts/Line/LineChart.js +1 -1
  578. package/build/dist/UI/Components/Charts/Line/LineChart.js.map +1 -1
  579. package/build/dist/UI/Components/Charts/Types/ChartEventKind.js +14 -0
  580. package/build/dist/UI/Components/Charts/Types/ChartEventKind.js.map +1 -0
  581. package/build/dist/UI/Components/Charts/Utils/TimeAnnotation.js +57 -28
  582. package/build/dist/UI/Components/Charts/Utils/TimeAnnotation.js.map +1 -1
  583. package/build/dist/UI/Components/Charts/Utils/XAxis.js +103 -17
  584. package/build/dist/UI/Components/Charts/Utils/XAxis.js.map +1 -1
  585. package/build/dist/UI/Components/EditionLabel/EditionLabel.js +198 -23
  586. package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
  587. package/build/dist/UI/Components/ErrorMessage/ErrorMessage.js +15 -5
  588. package/build/dist/UI/Components/ErrorMessage/ErrorMessage.js.map +1 -1
  589. package/build/dist/UI/Components/Feed/FeedItem.js +4 -5
  590. package/build/dist/UI/Components/Feed/FeedItem.js.map +1 -1
  591. package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js +1 -2
  592. package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js.map +1 -1
  593. package/build/dist/UI/Components/Header/UserProfile/UserProfile.js.map +1 -1
  594. package/build/dist/UI/Components/Image/Image.js +6 -1
  595. package/build/dist/UI/Components/Image/Image.js.map +1 -1
  596. package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js +0 -0
  597. package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js.map +1 -1
  598. package/build/dist/UI/Components/MemberRoleAssignment/MemberRoleAssignment.js +1 -2
  599. package/build/dist/UI/Components/MemberRoleAssignment/MemberRoleAssignment.js.map +1 -1
  600. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +143 -36
  601. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  602. package/build/dist/UI/Components/Navbar/NavBar.js +44 -9
  603. package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
  604. package/build/dist/UI/Components/Navbar/NavBarMenuModal.js +2 -2
  605. package/build/dist/UI/Components/Navbar/NavBarMenuModal.js.map +1 -1
  606. package/build/dist/UI/Components/SideMenu/CountModelSideMenuItem.js +1 -1
  607. package/build/dist/UI/Components/SideMenu/CountModelSideMenuItem.js.map +1 -1
  608. package/build/dist/UI/Components/SideMenu/SideMenu.js +9 -6
  609. package/build/dist/UI/Components/SideMenu/SideMenu.js.map +1 -1
  610. package/build/dist/UI/Components/SideMenu/SideMenuItem.js +1 -1
  611. package/build/dist/UI/Components/SideMenu/SideMenuItem.js.map +1 -1
  612. package/build/dist/UI/Components/SideMenu/SideMenuSection.js +7 -2
  613. package/build/dist/UI/Components/SideMenu/SideMenuSection.js.map +1 -1
  614. package/build/dist/UI/Components/Table/TableHeader.js +20 -22
  615. package/build/dist/UI/Components/Table/TableHeader.js.map +1 -1
  616. package/build/dist/UI/Components/Table/TableRow.js +13 -4
  617. package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
  618. package/build/dist/UI/Utils/UseDashboardTimeRangeZoom.js +42 -0
  619. package/build/dist/UI/Utils/UseDashboardTimeRangeZoom.js.map +1 -0
  620. package/build/dist/Utils/Dashboard/DashboardTimeRangeZoom.js +74 -0
  621. package/build/dist/Utils/Dashboard/DashboardTimeRangeZoom.js.map +1 -0
  622. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js +153 -0
  623. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js.map +1 -0
  624. package/build/dist/Utils/Monitor/NetworkDeviceRoleCatalog.js +126 -0
  625. package/build/dist/Utils/Monitor/NetworkDeviceRoleCatalog.js.map +1 -0
  626. package/build/dist/Utils/Monitor/NetworkDeviceRoleUtil.js +2 -1
  627. package/build/dist/Utils/Monitor/NetworkDeviceRoleUtil.js.map +1 -1
  628. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +67 -32
  629. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
  630. package/build/dist/Utils/NetworkDevice/DeviceRoleKeyUtil.js +114 -0
  631. package/build/dist/Utils/NetworkDevice/DeviceRoleKeyUtil.js.map +1 -0
  632. package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js.map +1 -1
  633. package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js +127 -7
  634. package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js.map +1 -1
  635. package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js +50 -3
  636. package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js.map +1 -1
  637. package/build/dist/Utils/NetworkDiscovery/ReverseDnsNameUtil.js +132 -0
  638. package/build/dist/Utils/NetworkDiscovery/ReverseDnsNameUtil.js.map +1 -0
  639. package/build/dist/Utils/Rules/RuleEngineLimits.js +31 -0
  640. package/build/dist/Utils/Rules/RuleEngineLimits.js.map +1 -0
  641. package/build/dist/Utils/Rules/RulePatternMatchUtil.js +1 -1
  642. package/build/dist/Utils/Slug.js +31 -1
  643. package/build/dist/Utils/Slug.js.map +1 -1
  644. package/jest.config.json +1 -0
  645. package/package.json +2 -2
@@ -6,12 +6,20 @@ import BadDataException from "../../Types/Exception/BadDataException";
6
6
  import ObjectID from "../../Types/ObjectID";
7
7
  import SortOrder from "../../Types/BaseDatabase/SortOrder";
8
8
  import LIMIT_MAX from "../../Types/Database/LimitMax";
9
+ import PositiveNumber from "../../Types/PositiveNumber";
9
10
  import QueryHelper from "../Types/Database/QueryHelper";
10
11
  import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
12
+ import logger from "../Utils/Logger";
11
13
  import SourceMapResolver, {
14
+ MAX_FRAMES_TO_RESOLVE,
12
15
  MAX_SOURCE_MAP_SIZE_IN_BYTES,
13
16
  SourceMapBundle,
14
17
  } from "../Utils/Telemetry/SourceMapResolver";
18
+ import {
19
+ SourceMapMaxBytesPerResolve,
20
+ SourceMapMaxMapsPerRelease,
21
+ SourceMapRetentionInDays,
22
+ } from "../EnvironmentConfig";
15
23
  import {
16
24
  MinifiedStackFrame,
17
25
  ResolvedStackFrame,
@@ -23,17 +31,24 @@ export { MAX_SOURCE_MAP_SIZE_IN_BYTES };
23
31
  /*
24
32
  * How long uploaded maps are kept. Old releases age out automatically —
25
33
  * a map is only useful while exceptions from its release are still within
26
- * telemetry retention, and 90 days comfortably exceeds the default.
34
+ * telemetry retention, and the default comfortably exceeds it.
35
+ * SOURCE_MAP_RETENTION_DAYS overrides it.
27
36
  */
28
- export const SOURCE_MAP_RETENTION_DAYS: number = 90;
37
+ export const SOURCE_MAP_RETENTION_DAYS: number = SourceMapRetentionInDays;
29
38
 
30
39
  /*
31
- * How many maps one (service, release) pair may hold. Enforced by the
32
- * upload endpoint (existing bundles + new bundles must fit) and used as
33
- * the resolver's read limit, so nothing stored is ever silently ignored.
34
- * A build rarely emits more than a few dozen chunks with maps.
40
+ * How many distinct bundles one (service, release) pair may hold, from
41
+ * SOURCE_MAP_MAX_MAPS_PER_RELEASE.
42
+ *
43
+ * This is a WRITE gate and nothing else: the upload endpoint checks that
44
+ * existing bundles + new bundles fit, and rejects with a 400 naming the
45
+ * limit. It used to double as the resolver's read limit, which coupled two
46
+ * different quantities — distinct bundle paths on the write side, rows on
47
+ * the read side — and made raising it dangerous. resolveFramesForService now
48
+ * bounds itself by BYTES loaded (SourceMapMaxBytesPerResolve), so a release
49
+ * that fits this ceiling always resolves in full.
35
50
  */
36
- export const MAX_SOURCE_MAPS_PER_RELEASE: number = 100;
51
+ export const MAX_SOURCE_MAPS_PER_RELEASE: number = SourceMapMaxMapsPerRelease;
37
52
 
38
53
  export class Service extends DatabaseService<Model> {
39
54
  public constructor() {
@@ -74,11 +89,116 @@ export class Service extends DatabaseService<Model> {
74
89
  throw new BadDataException("Service version is required.");
75
90
  }
76
91
 
92
+ await this.assertReleaseHasRoomFor(createBy);
93
+
77
94
  createBy.data.sizeInBytes = Buffer.byteLength(content, "utf8");
78
95
 
79
96
  return { createBy, carryForward: null };
80
97
  }
81
98
 
99
+ /**
100
+ * Enforce the per-release ceiling on the create path itself.
101
+ *
102
+ * The upload endpoint checks the whole batch up front, which is where the
103
+ * useful error message lives — but TelemetrySourceMap is a full CRUD
104
+ * resource, so POST /api/telemetry-source-map reaches create() without ever
105
+ * passing that check. Without this the configured ceiling was advisory on
106
+ * that path, and a release could quietly grow past what the operator set.
107
+ *
108
+ * Two steps, so the common case stays cheap: an indexed COUNT on every
109
+ * insert, and the exact distinct-bundle answer only once that COUNT says
110
+ * the release is at the boundary. A release is written once per CI run, and
111
+ * on the upload path the batch check has already passed, so the second step
112
+ * is effectively unreachable there.
113
+ */
114
+ @CaptureSpan()
115
+ private async assertReleaseHasRoomFor(
116
+ createBy: CreateBy<Model>,
117
+ ): Promise<void> {
118
+ const projectId: ObjectID | undefined =
119
+ createBy.data.projectId || createBy.props.tenantId || undefined;
120
+ const serviceId: ObjectID | undefined =
121
+ createBy.data.serviceId || undefined;
122
+ const serviceVersion: string | undefined = createBy.data.serviceVersion;
123
+
124
+ /*
125
+ * Not a silent pass: a create missing any of these cannot be scoped to a
126
+ * release, and the tenant column / required-column checks reject it on
127
+ * their own with a better message than a count could give.
128
+ */
129
+ if (!projectId || !serviceId || !serviceVersion) {
130
+ return;
131
+ }
132
+
133
+ /*
134
+ * Cheap check first, and it is the one that runs in practice: a COUNT of
135
+ * ROWS on the (projectId, serviceId, serviceVersion) index. Below the
136
+ * ceiling there is nothing to decide, whatever the rows contain.
137
+ */
138
+ const existingRowCount: PositiveNumber = await this.countBy({
139
+ query: {
140
+ projectId: projectId,
141
+ serviceId: serviceId,
142
+ serviceVersion: serviceVersion,
143
+ },
144
+ skip: 0,
145
+ limit: LIMIT_MAX,
146
+ props: {
147
+ isRoot: true,
148
+ },
149
+ });
150
+
151
+ if (existingRowCount.toNumber() < MAX_SOURCE_MAPS_PER_RELEASE) {
152
+ return;
153
+ }
154
+
155
+ /*
156
+ * At or above the ceiling on rows — but rows are not the unit the ceiling
157
+ * is expressed in. The model deliberately allows more than one row per
158
+ * bundle (a racing double upload must not fail CI), so rejecting on the
159
+ * row count would fail a legitimate re-upload of a full release purely
160
+ * because a duplicate row exists. Pay for the exact answer only here,
161
+ * where the fast path has already established this is the boundary.
162
+ */
163
+ const storedBundlePaths: Array<string> =
164
+ await this.getStoredBundlePathsForRelease({
165
+ projectId: projectId,
166
+ serviceId: serviceId,
167
+ serviceVersion: serviceVersion,
168
+ });
169
+
170
+ const distinctBundlePaths: Set<string> = new Set(
171
+ storedBundlePaths.map((bundlePath: string) => {
172
+ return SourceMapResolver.normalizePath(bundlePath);
173
+ }),
174
+ );
175
+
176
+ /*
177
+ * Normalized, which makes this backstop slightly MORE permissive than the
178
+ * upload endpoint's raw-path gate. That is the right direction for a
179
+ * backstop: it must never be the thing that fails a request the primary
180
+ * gate already approved.
181
+ */
182
+ const incomingBundlePath: string = SourceMapResolver.normalizePath(
183
+ createBy.data.bundlePath || "",
184
+ );
185
+
186
+ /*
187
+ * Adding a row for a bundle the release already holds does not grow the
188
+ * release, so it stays allowed even at the ceiling. Only a NEW distinct
189
+ * bundle is refused.
190
+ */
191
+ if (distinctBundlePaths.has(incomingBundlePath)) {
192
+ return;
193
+ }
194
+
195
+ if (distinctBundlePaths.size >= MAX_SOURCE_MAPS_PER_RELEASE) {
196
+ throw new BadDataException(
197
+ `This release already holds ${distinctBundlePaths.size} source maps, which is the limit of ${MAX_SOURCE_MAPS_PER_RELEASE} per release. Delete unused maps, use a new serviceVersion, or raise SOURCE_MAP_MAX_MAPS_PER_RELEASE.`,
198
+ );
199
+ }
200
+ }
201
+
82
202
  /**
83
203
  * Bundle paths currently stored for a (project, service, release) tuple.
84
204
  * Used by the upload endpoint to enforce the per-release ceiling without
@@ -182,15 +302,26 @@ export class Service extends DatabaseService<Model> {
182
302
  }),
183
303
  resolvedCount: 0,
184
304
  sourceMapCount: 0,
305
+ sourceMapsSkippedForSize: 0,
185
306
  };
186
307
  }
187
308
 
188
309
  /*
189
- * Two-step fetch: list bundle paths first (cheap), then pull content
190
- * only for bundles that at least one frame can match. Maps can be tens
191
- * of megabytes each and a release may store up to
192
- * MAX_SOURCE_MAPS_PER_RELEASE of them loading them all for every
193
- * exception view would be a memory hazard for no benefit.
310
+ * Two-step fetch: list bundle paths first (cheap — no content), then pull
311
+ * content only for the bundles a frame can match, and only as many of
312
+ * those as the byte budget allows. Maps can be tens of megabytes each, so
313
+ * loading a whole release for every exception view would be a memory
314
+ * hazard for no benefit.
315
+ *
316
+ * The listing reads with LIMIT_MAX rather than the per-release ceiling.
317
+ * The ceiling counts distinct bundle PATHS, while a read limit counts
318
+ * ROWS, and duplicate rows for one bundle are deliberately allowed (see
319
+ * the model: a racing double upload must not fail CI). With the two
320
+ * numbers equal, one duplicate row was enough to push a distinct bundle
321
+ * out of resolution — it stored fine, showed in the dashboard, and
322
+ * silently never resolved. Reading everything and deduping afterwards
323
+ * removes that coupling; memory is bounded below by bytes, not by how
324
+ * many rows a content-free listing returns.
194
325
  */
195
326
  const sourceMapRows: Array<Model> = await this.findBy({
196
327
  query: {
@@ -202,11 +333,12 @@ export class Service extends DatabaseService<Model> {
202
333
  _id: true,
203
334
  bundlePath: true,
204
335
  createdAt: true,
336
+ sizeInBytes: true,
205
337
  },
206
338
  sort: {
207
339
  createdAt: SortOrder.Descending,
208
340
  },
209
- limit: MAX_SOURCE_MAPS_PER_RELEASE,
341
+ limit: LIMIT_MAX,
210
342
  skip: 0,
211
343
  props: {
212
344
  isRoot: true,
@@ -237,16 +369,121 @@ export class Service extends DatabaseService<Model> {
237
369
  dedupedRows.push(row);
238
370
  }
239
371
 
240
- const matchedRows: Array<Model> = dedupedRows.filter((row: Model) => {
241
- return data.frames.some((frame: MinifiedStackFrame) => {
242
- return (
243
- SourceMapResolver.getMatchScore(
244
- frame.fileName,
245
- row.bundlePath || "",
246
- ) > 0
372
+ /*
373
+ * Only the frames resolveFrames will actually attempt can pull a map in.
374
+ * Matching against every frame would let a caller-supplied array drive an
375
+ * O(rows x frames) scan and select maps that could never be used anyway —
376
+ * the frames array is parsed from client-supplied stack trace text, so it
377
+ * is capped rather than trusted (the API rejects absurd lengths outright).
378
+ */
379
+ const framesForMatching: Array<MinifiedStackFrame> = data.frames.slice(
380
+ 0,
381
+ MAX_FRAMES_TO_RESOLVE,
382
+ );
383
+
384
+ /*
385
+ * Score every candidate against those frames. The score is how many
386
+ * trailing path segments the frame and the bundle share, so a frame
387
+ * "static/main.a8f1.js" prefers the bundle that agrees on "static/" over
388
+ * one that only agrees on the file name. That ordering is what makes the
389
+ * byte budget below defensible: when not everything fits, what gets
390
+ * dropped is the weakest match, not an arbitrary row.
391
+ */
392
+ const scoredRows: Array<{
393
+ row: Model;
394
+ score: number;
395
+ sizeInBytes: number;
396
+ }> = [];
397
+
398
+ for (const row of dedupedRows) {
399
+ let bestScore: number = 0;
400
+
401
+ for (const frame of framesForMatching) {
402
+ const score: number = SourceMapResolver.getMatchScore(
403
+ frame.fileName,
404
+ row.bundlePath || "",
247
405
  );
248
- });
249
- });
406
+
407
+ if (score > bestScore) {
408
+ bestScore = score;
409
+ }
410
+ }
411
+
412
+ if (bestScore > 0) {
413
+ scoredRows.push({
414
+ row: row,
415
+ score: bestScore,
416
+ /*
417
+ * onBeforeCreate stamps sizeInBytes on every insert, so a missing
418
+ * value means a row written straight to the database. Charge it the
419
+ * per-map ceiling rather than nothing: an unknown size must not be
420
+ * the way to slip past a budget meant to bound memory.
421
+ */
422
+ sizeInBytes:
423
+ typeof row.sizeInBytes === "number" &&
424
+ Number.isFinite(row.sizeInBytes) &&
425
+ row.sizeInBytes > 0
426
+ ? row.sizeInBytes
427
+ : MAX_SOURCE_MAP_SIZE_IN_BYTES,
428
+ });
429
+ }
430
+ }
431
+
432
+ scoredRows.sort(
433
+ (
434
+ a: { row: Model; score: number; sizeInBytes: number },
435
+ b: { row: Model; score: number; sizeInBytes: number },
436
+ ) => {
437
+ if (b.score !== a.score) {
438
+ return b.score - a.score;
439
+ }
440
+
441
+ // Same match quality: prefer the newer upload, as the dedupe does.
442
+ const aTime: number = a.row.createdAt
443
+ ? new Date(a.row.createdAt).getTime()
444
+ : 0;
445
+ const bTime: number = b.row.createdAt
446
+ ? new Date(b.row.createdAt).getTime()
447
+ : 0;
448
+
449
+ return bTime - aTime;
450
+ },
451
+ );
452
+
453
+ /*
454
+ * The byte budget. This is the bound that used to be implied by the
455
+ * per-release count and is a far tighter one, because it measures the
456
+ * thing that actually consumes memory. Lower-scoring maps that still fit
457
+ * are kept (hence continue, not break) so a single oversized map does not
458
+ * cost the rest of the stack trace its symbols.
459
+ *
460
+ * The best-scoring map is always attempted even if it alone exceeds the
461
+ * budget: a budget configured below the per-map ceiling should degrade to
462
+ * "one map at a time", not to "nothing ever resolves". Peak is therefore
463
+ * max(SourceMapMaxBytesPerResolve, MAX_SOURCE_MAP_SIZE_IN_BYTES).
464
+ */
465
+ const matchedRows: Array<Model> = [];
466
+ let budgetUsedInBytes: number = 0;
467
+ let sourceMapsSkippedForSize: number = 0;
468
+
469
+ for (const scored of scoredRows) {
470
+ const wouldExceedBudget: boolean =
471
+ budgetUsedInBytes + scored.sizeInBytes > SourceMapMaxBytesPerResolve;
472
+
473
+ if (wouldExceedBudget && matchedRows.length > 0) {
474
+ sourceMapsSkippedForSize++;
475
+ continue;
476
+ }
477
+
478
+ budgetUsedInBytes += scored.sizeInBytes;
479
+ matchedRows.push(scored.row);
480
+ }
481
+
482
+ if (sourceMapsSkippedForSize > 0) {
483
+ logger.warn(
484
+ `Source map resolution skipped ${sourceMapsSkippedForSize} matching map(s) for service ${data.serviceId.toString()} release ${data.serviceVersion}: loading them would exceed SOURCE_MAP_MAX_BYTES_PER_RESOLVE (${SourceMapMaxBytesPerResolve} bytes).`,
485
+ );
486
+ }
250
487
 
251
488
  const bundles: Array<SourceMapBundle> = [];
252
489
 
@@ -269,7 +506,7 @@ export class Service extends DatabaseService<Model> {
269
506
  bundlePath: true,
270
507
  content: true,
271
508
  },
272
- limit: MAX_SOURCE_MAPS_PER_RELEASE,
509
+ limit: matchedRows.length,
273
510
  skip: 0,
274
511
  props: {
275
512
  isRoot: true,
@@ -300,6 +537,12 @@ export class Service extends DatabaseService<Model> {
300
537
  * distinguishable from "no maps uploaded".
301
538
  */
302
539
  sourceMapCount: dedupedRows.length,
540
+ /*
541
+ * Non-zero means symbols are missing because of the byte budget, not
542
+ * because the maps were never uploaded — the one distinction a user
543
+ * staring at a half-resolved stack trace cannot make for themselves.
544
+ */
545
+ sourceMapsSkippedForSize: sourceMapsSkippedForSize,
303
546
  };
304
547
  }
305
548
  }
@@ -800,12 +800,6 @@ export class Service extends DatabaseService<UserNotificationSetting> {
800
800
  userId: ObjectID,
801
801
  projectId: ObjectID,
802
802
  ): Promise<void> {
803
- await this.addNotificationSettingIfNotExists(
804
- userId,
805
- projectId,
806
- NotificationSettingEventType.SEND_MONITOR_STATUS_CHANGED_OWNER_NOTIFICATION,
807
- );
808
-
809
803
  await this.addNotificationSettingIfNotExists(
810
804
  userId,
811
805
  projectId,
@@ -58,6 +58,7 @@ import Name from "../../Types/Name";
58
58
  import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
59
59
  import Timezone from "../../Types/Timezone";
60
60
  import InMemoryTTLCache from "../Infrastructure/InMemoryTTLCache";
61
+ import EnterpriseLicenseSeatUtil from "../Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil";
61
62
 
62
63
  /*
63
64
  * Names the Redis mutex that serializes the first-Master-Admin election across
@@ -184,6 +185,32 @@ export class Service extends DatabaseService<Model> {
184
185
  protected override async onBeforeCreate(
185
186
  createBy: CreateBy<Model>,
186
187
  ): Promise<OnCreate<Model>> {
188
+ /*
189
+ * The enterprise seat limit, enforced here because this is the one place
190
+ * every new user passes through: team invitations, self-service signup,
191
+ * SSO/OIDC just-in-time provisioning, SCIM, and the Admin Dashboard all
192
+ * end up in `create`. Enforcing on the invitation instead would leave
193
+ * signup and SSO as open doors around it.
194
+ *
195
+ * No isRoot exemption on purpose — invitations create the invited user as
196
+ * root, so exempting root would exempt invitations, which is the exact
197
+ * thing this is here to bound. It is a no-op on Community Edition and on
198
+ * oneuptime.com (see EnterpriseLicenseSeatUtil.isSeatLimitEnforceable),
199
+ * and it never counts the User table on a licence with no seat limit.
200
+ */
201
+ await EnterpriseLicenseSeatUtil.assertSeatAvailableForNewUser({
202
+ getLocalUserCount: async (): Promise<number> => {
203
+ const userCount: PositiveNumber = await this.countBy({
204
+ query: {},
205
+ props: {
206
+ isRoot: true,
207
+ },
208
+ });
209
+
210
+ return userCount.toNumber();
211
+ },
212
+ });
213
+
187
214
  /*
188
215
  * clickIds / firstTouchAttribution are publicly creatable jsonb columns
189
216
  * (set during signup). Unlike the varchar(500) utm columns they have no
@@ -6,6 +6,8 @@ import WorkflowService from "./WorkflowService";
6
6
  import ObjectID from "../../Types/ObjectID";
7
7
  import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
8
8
  import logger, { LogAttributes } from "../Utils/Logger";
9
+ import { MAX_RULES_EVALUATED_PER_PROJECT } from "../../Utils/Rules/RuleEngineLimits";
10
+ import logIfRuleReadWasTruncated from "../Utils/Rules/RuleEngineRuleRead";
9
11
 
10
12
  class WorkflowLabelRuleEngineServiceClass {
11
13
  /**
@@ -35,10 +37,16 @@ class WorkflowLabelRuleEngineServiceClass {
35
37
  workflowDescriptionPattern: true,
36
38
  labelsToAdd: { _id: true },
37
39
  },
38
- limit: 100,
40
+ limit: MAX_RULES_EVALUATED_PER_PROJECT,
39
41
  skip: 0,
40
42
  });
41
43
 
44
+ logIfRuleReadWasTruncated({
45
+ ruleKind: "WorkflowLabelRule",
46
+ projectId: workflow.projectId,
47
+ rulesRead: rules.length,
48
+ });
49
+
42
50
  if (rules.length === 0) {
43
51
  return;
44
52
  }
@@ -10,6 +10,8 @@ import WorkflowService from "./WorkflowService";
10
10
  import ObjectID from "../../Types/ObjectID";
11
11
  import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
12
12
  import logger, { LogAttributes } from "../Utils/Logger";
13
+ import { MAX_RULES_EVALUATED_PER_PROJECT } from "../../Utils/Rules/RuleEngineLimits";
14
+ import logIfRuleReadWasTruncated from "../Utils/Rules/RuleEngineRuleRead";
13
15
 
14
16
  class WorkflowOwnerRuleEngineServiceClass {
15
17
  /**
@@ -42,10 +44,16 @@ class WorkflowOwnerRuleEngineServiceClass {
42
44
  ownerUsers: { _id: true },
43
45
  ownerTeams: { _id: true },
44
46
  },
45
- limit: 100,
47
+ limit: MAX_RULES_EVALUATED_PER_PROJECT,
46
48
  skip: 0,
47
49
  });
48
50
 
51
+ logIfRuleReadWasTruncated({
52
+ ruleKind: "WorkflowOwnerRule",
53
+ projectId: workflow.projectId,
54
+ rulesRead: rules.length,
55
+ });
56
+
49
57
  if (rules.length === 0) {
50
58
  return;
51
59
  }
@@ -0,0 +1,186 @@
1
+ import GlobalConfig from "../../../Models/DatabaseModels/GlobalConfig";
2
+ import EnterpriseLicenseInstanceSummary from "../../../Types/EnterpriseLicense/EnterpriseLicenseInstanceSummary";
3
+ import BadDataException from "../../../Types/Exception/BadDataException";
4
+ import ObjectID from "../../../Types/ObjectID";
5
+ import EnterpriseLicenseSeatsUtil, {
6
+ SeatUsage,
7
+ } from "../../../Utils/EnterpriseLicense/EnterpriseLicenseSeats";
8
+ import { IsBillingEnabled, IsEnterpriseEdition } from "../../EnvironmentConfig";
9
+ import GlobalConfigService from "../../Services/GlobalConfigService";
10
+
11
+ /*
12
+ * Counts the users on THIS installation. Passed in rather than called
13
+ * directly so this util never has to import UserService — and, more usefully,
14
+ * so the count is only paid for on the installations that actually enforce a
15
+ * limit. On Community Edition and on oneuptime.com itself the callbacks below
16
+ * are never invoked.
17
+ */
18
+ export type GetLocalUserCountFunction = () => Promise<number>;
19
+
20
+ /*
21
+ * Enforcement of the enterprise license seat limit on a self-hosted
22
+ * installation.
23
+ *
24
+ * The limit itself is set on oneuptime.com and mirrored into GlobalConfig by
25
+ * the daily report job (and by validating or refreshing the license by hand).
26
+ * This is the half that acts on it: it is the only thing standing between a
27
+ * customer's license terms and an unbounded User table.
28
+ *
29
+ * The seat arithmetic lives in Common/Utils/EnterpriseLicense/EnterpriseLicenseSeats
30
+ * as a pure function; everything here is about reading the license state and
31
+ * deciding whether the installation is one that enforces at all.
32
+ */
33
+ export default class EnterpriseLicenseSeatUtil {
34
+ /*
35
+ * Whether this process is an installation whose users are governed by an
36
+ * enterprise license at all.
37
+ *
38
+ * Community Edition has no license and no limit. oneuptime.com runs with
39
+ * billing enabled and bounds seats through subscriptions instead
40
+ * (TeamMemberService.onBeforeCreate) — enforcing a license limit there as
41
+ * well would be a second, wrong answer to the same question.
42
+ */
43
+ public static isSeatLimitEnforceable(): boolean {
44
+ return IsEnterpriseEdition && !IsBillingEnabled;
45
+ }
46
+
47
+ /*
48
+ * Seat usage derived from an already-loaded GlobalConfig row. Kept separate
49
+ * from the loading so a caller that has the row in hand — the license
50
+ * endpoint, which has just read it — does not read it a second time.
51
+ *
52
+ * A null config (a fresh installation whose GlobalConfig has not been seeded
53
+ * yet) yields no limit, which is the same answer as a licence with no seat
54
+ * limit set.
55
+ */
56
+ public static getSeatUsageFromGlobalConfig(data: {
57
+ config: GlobalConfig | null;
58
+ localUserCount: number;
59
+ }): SeatUsage {
60
+ const config: GlobalConfig | null = data.config;
61
+
62
+ const instances: Array<EnterpriseLicenseInstanceSummary> = Array.isArray(
63
+ config?.enterpriseLicenseInstances,
64
+ )
65
+ ? config.enterpriseLicenseInstances
66
+ : [];
67
+
68
+ return EnterpriseLicenseSeatsUtil.getSeatUsage({
69
+ userLimit: config?.enterpriseLicenseUserLimit,
70
+ localUserCount: data.localUserCount,
71
+ aggregatedUserCount: config?.enterpriseLicenseCurrentUserCount,
72
+ instances: instances,
73
+ thisInstanceId: config?.instanceId ? config.instanceId.toString() : null,
74
+ });
75
+ }
76
+
77
+ /*
78
+ * Seat usage for this installation right now, or null on an installation
79
+ * that does not enforce a seat limit.
80
+ *
81
+ * Null rather than an unenforced SeatUsage so callers cannot accidentally
82
+ * present Community Edition with a seat report it has no business having,
83
+ * and so the user count is never queried there.
84
+ */
85
+ public static async getSeatUsage(data: {
86
+ getLocalUserCount: GetLocalUserCountFunction;
87
+ }): Promise<SeatUsage | null> {
88
+ if (!this.isSeatLimitEnforceable()) {
89
+ return null;
90
+ }
91
+
92
+ const config: GlobalConfig | null = await GlobalConfigService.findOneById({
93
+ id: ObjectID.getZeroObjectID(),
94
+ select: {
95
+ enterpriseLicenseUserLimit: true,
96
+ enterpriseLicenseCurrentUserCount: true,
97
+ enterpriseLicenseInstances: true,
98
+ instanceId: true,
99
+ },
100
+ props: {
101
+ isRoot: true,
102
+ },
103
+ });
104
+
105
+ return this.getSeatUsageForLoadedGlobalConfig({
106
+ config: config,
107
+ getLocalUserCount: data.getLocalUserCount,
108
+ });
109
+ }
110
+
111
+ /*
112
+ * The same answer as getSeatUsage, for a caller that has already loaded the
113
+ * GlobalConfig row (the license endpoint reads it to build its response, and
114
+ * reading it twice per request would be silly).
115
+ *
116
+ * The row must have been selected with enterpriseLicenseUserLimit,
117
+ * enterpriseLicenseCurrentUserCount, enterpriseLicenseInstances and
118
+ * instanceId, or the numbers here are a fiction built from missing columns.
119
+ */
120
+ public static async getSeatUsageForLoadedGlobalConfig(data: {
121
+ config: GlobalConfig | null;
122
+ getLocalUserCount: GetLocalUserCountFunction;
123
+ }): Promise<SeatUsage | null> {
124
+ if (!this.isSeatLimitEnforceable()) {
125
+ return null;
126
+ }
127
+
128
+ /*
129
+ * The seat limit is read before the users are counted, and the count is
130
+ * skipped entirely when there is no limit. An unlimited licence is the
131
+ * common case on a large installation, and that is exactly the
132
+ * installation where counting the User table on every user creation would
133
+ * be worth avoiding.
134
+ */
135
+ const withoutLocalUsers: SeatUsage = this.getSeatUsageFromGlobalConfig({
136
+ config: data.config,
137
+ localUserCount: 0,
138
+ });
139
+
140
+ if (!withoutLocalUsers.isEnforced) {
141
+ return withoutLocalUsers;
142
+ }
143
+
144
+ return this.getSeatUsageFromGlobalConfig({
145
+ config: data.config,
146
+ localUserCount: await data.getLocalUserCount(),
147
+ });
148
+ }
149
+
150
+ /*
151
+ * Throws if this installation cannot take another user.
152
+ *
153
+ * Called from UserService.onBeforeCreate, which every path that creates a
154
+ * user goes through — team invitations, self-service signup, SSO and OIDC
155
+ * just-in-time provisioning, SCIM, and the Admin Dashboard. Enforcing on the
156
+ * User row rather than on the invitation is what makes that true: a seat is
157
+ * consumed by a person existing on the installation, not by the particular
158
+ * door they came through.
159
+ *
160
+ * It is also why this deliberately does NOT exempt root/internal writes.
161
+ * Team invitations create the invited user with `isRoot: true`, so an
162
+ * isRoot escape hatch here would exempt the single most important path.
163
+ */
164
+ public static async assertSeatAvailableForNewUser(data: {
165
+ getLocalUserCount: GetLocalUserCountFunction;
166
+ }): Promise<void> {
167
+ const seatUsage: SeatUsage | null = await this.getSeatUsage({
168
+ getLocalUserCount: data.getLocalUserCount,
169
+ });
170
+
171
+ if (!seatUsage || !seatUsage.isEnforced) {
172
+ return;
173
+ }
174
+
175
+ if (seatUsage.hasSeatForNewUser) {
176
+ return;
177
+ }
178
+
179
+ throw new BadDataException(
180
+ EnterpriseLicenseSeatsUtil.getSeatLimitReachedMessage({
181
+ seatsInUse: seatUsage.seatsInUse,
182
+ userLimit: seatUsage.userLimit as number,
183
+ }),
184
+ );
185
+ }
186
+ }