@oneuptime/common 12.0.25 → 12.0.27

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 (856) hide show
  1. package/Models/AnalyticsModels/Index.ts +2 -0
  2. package/Models/AnalyticsModels/ThreatIntelIndicator.ts +413 -0
  3. package/Models/DatabaseModels/AlertSeverity.ts +4 -1
  4. package/Models/DatabaseModels/CephClusterFeed.ts +625 -0
  5. package/Models/DatabaseModels/CloudResourceFeed.ts +625 -0
  6. package/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.ts +13 -0
  7. package/Models/DatabaseModels/DetectionRule.ts +9 -3
  8. package/Models/DatabaseModels/DockerHostFeed.ts +625 -0
  9. package/Models/DatabaseModels/DockerSwarmClusterFeed.ts +628 -0
  10. package/Models/DatabaseModels/GoogleSecOpsConnection.ts +9 -3
  11. package/Models/DatabaseModels/HostFeed.ts +625 -0
  12. package/Models/DatabaseModels/IncidentSeverity.ts +4 -1
  13. package/Models/DatabaseModels/Index.ts +22 -0
  14. package/Models/DatabaseModels/KubernetesClusterFeed.ts +628 -0
  15. package/Models/DatabaseModels/Monitor.ts +87 -0
  16. package/Models/DatabaseModels/NetworkDevice.ts +96 -5
  17. package/Models/DatabaseModels/NetworkDeviceAutoImportRule.ts +92 -6
  18. package/Models/DatabaseModels/NetworkDeviceDiscoveryScan.ts +301 -31
  19. package/Models/DatabaseModels/NetworkSite.ts +120 -0
  20. package/Models/DatabaseModels/OnCallDutyPolicyExecutionLog.ts +1 -0
  21. package/Models/DatabaseModels/PodmanHostFeed.ts +625 -0
  22. package/Models/DatabaseModels/ProxmoxClusterFeed.ts +626 -0
  23. package/Models/DatabaseModels/ScheduledMaintenance.ts +67 -0
  24. package/Models/DatabaseModels/ServiceFeed.ts +625 -0
  25. package/Models/DatabaseModels/TelemetrySourceMap.ts +474 -0
  26. package/Models/DatabaseModels/ThreatIntelFeed.ts +758 -0
  27. package/Models/DatabaseModels/UserOnCallLog.ts +1 -0
  28. package/Models/DatabaseModels/UserTotpAuth.ts +1 -0
  29. package/Models/DatabaseModels/UserWebAuthn.ts +1 -0
  30. package/Server/API/AlertAPI.ts +23 -1
  31. package/Server/API/BaseAPI.ts +14 -3
  32. package/Server/API/IncidentAPI.ts +41 -1
  33. package/Server/API/IncidentEpisodeAPI.ts +23 -1
  34. package/Server/API/MicrosoftTeamsAPI.ts +31 -2
  35. package/Server/API/ScheduledMaintenanceAPI.ts +23 -1
  36. package/Server/API/SlackAPI.ts +48 -0
  37. package/Server/API/TelemetryAPI.ts +167 -42
  38. package/Server/API/UserOnCallLogTimelineAPI.ts +75 -61
  39. package/Server/API/UserTotpAuthAPI.ts +67 -1
  40. package/Server/API/UserWebAuthnAPI.ts +44 -1
  41. package/Server/Infrastructure/Postgres/SchemaMigrations/1787923136162-MigrationName.ts +57 -0
  42. package/Server/Infrastructure/Postgres/SchemaMigrations/1789600000000-AddAutoProvisionedNetworkDeviceMonitors.ts +49 -0
  43. package/Server/Infrastructure/Postgres/SchemaMigrations/1789700000000-AddNetworkScaleIndexes.ts +129 -0
  44. package/Server/Infrastructure/Postgres/SchemaMigrations/1789800000000-WidenSecurityEventLastErrorColumns.ts +54 -0
  45. package/Server/Infrastructure/Postgres/SchemaMigrations/1789900000000-AddNetworkSiteRollupPolicyAndMaintenance.ts +64 -0
  46. package/Server/Infrastructure/Postgres/SchemaMigrations/1790000000000-AddTelemetrySourceMap.ts +64 -0
  47. package/Server/Infrastructure/Postgres/SchemaMigrations/1790000000001-AddSnmpConfigsToNetworkDeviceDiscoveryScan.ts +72 -0
  48. package/Server/Infrastructure/Postgres/SchemaMigrations/1790003445000-AddSnmpEnabledToNetworkDeviceDiscoveryScan.ts +31 -0
  49. package/Server/Infrastructure/Postgres/SchemaMigrations/1790100000000-AddResourceActivityFeeds.ts +489 -0
  50. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +18 -0
  51. package/Server/Middleware/IdentityRateLimit.ts +53 -3
  52. package/Server/Services/AIService.ts +181 -41
  53. package/Server/Services/CephClusterFeedService.ts +99 -0
  54. package/Server/Services/CephClusterLabelRuleEngineService.ts +29 -0
  55. package/Server/Services/CephClusterOwnerRuleEngineService.ts +23 -0
  56. package/Server/Services/CephClusterOwnerTeamService.ts +129 -0
  57. package/Server/Services/CephClusterOwnerUserService.ts +123 -0
  58. package/Server/Services/CephClusterService.ts +223 -2
  59. package/Server/Services/CloudResourceFeedService.ts +99 -0
  60. package/Server/Services/CloudResourceLabelRuleEngineService.ts +30 -0
  61. package/Server/Services/CloudResourceOwnerRuleEngineService.ts +33 -0
  62. package/Server/Services/CloudResourceOwnerTeamService.ts +129 -0
  63. package/Server/Services/CloudResourceOwnerUserService.ts +123 -0
  64. package/Server/Services/CloudResourceService.ts +227 -2
  65. package/Server/Services/DatabaseService.ts +265 -0
  66. package/Server/Services/DockerHostFeedService.ts +99 -0
  67. package/Server/Services/DockerHostLabelRuleEngineService.ts +29 -0
  68. package/Server/Services/DockerHostOwnerRuleEngineService.ts +23 -0
  69. package/Server/Services/DockerHostOwnerTeamService.ts +129 -0
  70. package/Server/Services/DockerHostOwnerUserService.ts +123 -0
  71. package/Server/Services/DockerHostService.ts +227 -2
  72. package/Server/Services/DockerSwarmClusterFeedService.ts +102 -0
  73. package/Server/Services/DockerSwarmClusterLabelRuleEngineService.ts +30 -0
  74. package/Server/Services/DockerSwarmClusterOwnerRuleEngineService.ts +24 -0
  75. package/Server/Services/DockerSwarmClusterOwnerTeamService.ts +133 -0
  76. package/Server/Services/DockerSwarmClusterOwnerUserService.ts +127 -0
  77. package/Server/Services/DockerSwarmClusterService.ts +229 -2
  78. package/Server/Services/EnterpriseLicenseService.ts +15 -7
  79. package/Server/Services/ExceptionAggregationService.ts +12 -2
  80. package/Server/Services/HostFeedService.ts +99 -0
  81. package/Server/Services/HostLabelRuleEngineService.ts +29 -0
  82. package/Server/Services/HostOwnerRuleEngineService.ts +23 -0
  83. package/Server/Services/HostOwnerTeamService.ts +129 -0
  84. package/Server/Services/HostOwnerUserService.ts +123 -0
  85. package/Server/Services/HostService.ts +215 -2
  86. package/Server/Services/IncidentService.ts +11 -0
  87. package/Server/Services/Index.ts +24 -0
  88. package/Server/Services/KubernetesClusterFeedService.ts +99 -0
  89. package/Server/Services/KubernetesClusterLabelRuleEngineService.ts +30 -0
  90. package/Server/Services/KubernetesClusterOwnerRuleEngineService.ts +24 -0
  91. package/Server/Services/KubernetesClusterOwnerTeamService.ts +133 -0
  92. package/Server/Services/KubernetesClusterOwnerUserService.ts +127 -0
  93. package/Server/Services/KubernetesClusterService.ts +231 -2
  94. package/Server/Services/LogAggregationService.ts +23 -280
  95. package/Server/Services/MetricAggregationService.ts +98 -1
  96. package/Server/Services/MonitorService.ts +177 -13
  97. package/Server/Services/MonitorTemplateService.ts +111 -0
  98. package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +777 -86
  99. package/Server/Services/NetworkDeviceAutoImportRuleService.ts +199 -16
  100. package/Server/Services/NetworkDeviceDiscoveryScanService.ts +1055 -14
  101. package/Server/Services/NetworkDeviceService.ts +750 -4
  102. package/Server/Services/NetworkInterfaceService.ts +415 -0
  103. package/Server/Services/NetworkSiteService.ts +485 -52
  104. package/Server/Services/PodmanHostFeedService.ts +99 -0
  105. package/Server/Services/PodmanHostLabelRuleEngineService.ts +29 -0
  106. package/Server/Services/PodmanHostOwnerRuleEngineService.ts +23 -0
  107. package/Server/Services/PodmanHostOwnerTeamService.ts +129 -0
  108. package/Server/Services/PodmanHostOwnerUserService.ts +123 -0
  109. package/Server/Services/PodmanHostService.ts +227 -2
  110. package/Server/Services/ProjectService.ts +16 -10
  111. package/Server/Services/ProxmoxClusterFeedService.ts +99 -0
  112. package/Server/Services/ProxmoxClusterLabelRuleEngineService.ts +30 -0
  113. package/Server/Services/ProxmoxClusterOwnerRuleEngineService.ts +24 -0
  114. package/Server/Services/ProxmoxClusterOwnerTeamService.ts +131 -0
  115. package/Server/Services/ProxmoxClusterOwnerUserService.ts +124 -0
  116. package/Server/Services/ProxmoxClusterService.ts +225 -2
  117. package/Server/Services/ScheduledMaintenanceStateTimelineService.ts +61 -0
  118. package/Server/Services/ServiceFeedService.ts +99 -0
  119. package/Server/Services/ServiceLabelRuleEngineService.ts +29 -0
  120. package/Server/Services/ServiceOwnerRuleEngineService.ts +26 -0
  121. package/Server/Services/ServiceOwnerTeamService.ts +129 -0
  122. package/Server/Services/ServiceOwnerUserService.ts +123 -0
  123. package/Server/Services/ServiceService.ts +227 -3
  124. package/Server/Services/StatusPageSubscriberService.ts +7 -0
  125. package/Server/Services/TelemetryAttributeService.ts +13 -3
  126. package/Server/Services/TelemetrySourceMapService.ts +307 -0
  127. package/Server/Services/ThreatIntelFeedService.ts +222 -0
  128. package/Server/Services/ThreatIntelIndicatorService.ts +428 -0
  129. package/Server/Services/TraceAggregationService.ts +101 -11
  130. package/Server/Services/UserService.ts +13 -6
  131. package/Server/Services/UserTwoFactorBackupCodeService.ts +127 -0
  132. package/Server/Services/UserWebhookService.ts +11 -2
  133. package/Server/Static/Brand/README.md +38 -0
  134. package/Server/Static/Brand/favicons/apple-touch-icon.png +0 -0
  135. package/Server/Static/Brand/favicons/favicon-16x16.png +0 -0
  136. package/Server/Static/Brand/favicons/favicon-32x32.png +0 -0
  137. package/Server/Static/Brand/favicons/favicon.ico +0 -0
  138. package/Server/Static/Brand/favicons/safari-pinned-tab.svg +31 -0
  139. package/Server/Static/Brand/hou-wb.svg +1 -0
  140. package/Server/Static/Brand/oneuptime-logo.svg +1 -0
  141. package/Server/Static/Brand/ou-wb.svg +1 -0
  142. package/Server/Static/Vendor/README.md +4 -0
  143. package/Server/Types/AnalyticsDatabase/ModelPermission.ts +13 -3
  144. package/Server/Types/Database/AggregateBy.ts +83 -0
  145. package/Server/Types/Database/AggregateResultUtil.ts +126 -0
  146. package/Server/Types/Database/JSONColumnQuery.ts +18 -0
  147. package/Server/Types/Database/QueryHelper.ts +40 -0
  148. package/Server/Types/Database/QueryUtil.ts +26 -0
  149. package/Server/Types/Workflow/Components/API/Utils.ts +10 -1
  150. package/Server/Types/Workflow/Components/JavaScript.ts +8 -0
  151. package/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.ts +9 -0
  152. package/Server/Utils/AI/SRE/InvestigationGrader.ts +18 -0
  153. package/Server/Utils/AnalyticsDatabase/AttributeFilterStatement.ts +422 -0
  154. package/Server/Utils/AnalyticsDatabase/StatementGenerator.ts +176 -0
  155. package/Server/Utils/DataSource/HttpFetch.ts +18 -0
  156. package/Server/Utils/Database/RelationIdUtil.ts +42 -0
  157. package/Server/Utils/Marketing/MarketingEventUtil.ts +38 -9
  158. package/Server/Utils/Monitor/Criteria/ServerMonitorCriteria.ts +34 -3
  159. package/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.ts +9 -1
  160. package/Server/Utils/Monitor/Criteria/SyntheticMonitor.ts +28 -10
  161. package/Server/Utils/Monitor/MonitorAlert.ts +541 -332
  162. package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +330 -64
  163. package/Server/Utils/Monitor/MonitorIncident.ts +640 -434
  164. package/Server/Utils/Monitor/MonitorResource.ts +226 -49
  165. package/Server/Utils/Monitor/NetworkDeviceWalkUtil.ts +46 -3
  166. package/Server/Utils/Monitor/NetworkInventoryUtil.ts +23 -102
  167. package/Server/Utils/Monitor/PerEntityCriteriaFanOut.ts +329 -0
  168. package/Server/Utils/NetworkDevice/DeviceHealthAggregation.ts +427 -0
  169. package/Server/Utils/NetworkSite/NetworkSiteMaintenanceSuppression.ts +310 -0
  170. package/Server/Utils/OnCallNotificationContext.ts +686 -0
  171. package/Server/Utils/PrivateNetworkWebhookConfig.ts +549 -0
  172. package/Server/Utils/ResourceFeed/ResourceFeedUtil.ts +139 -0
  173. package/Server/Utils/Response.ts +11 -1
  174. package/Server/Utils/SSRFProtection.ts +230 -60
  175. package/Server/Utils/SecurityEvent/ConnectorErrorMessage.ts +106 -0
  176. package/Server/Utils/SecurityEvent/DetectionRuleEvaluator.ts +84 -284
  177. package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.ts +47 -20
  178. package/Server/Utils/SecurityEvent/SecurityEventAlerting.ts +318 -0
  179. package/Server/Utils/SecurityEvent/ThreatIntel/TaxiiClient.ts +199 -0
  180. package/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelEnricher.ts +252 -0
  181. package/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.ts +739 -0
  182. package/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelMatcher.ts +533 -0
  183. package/Server/Utils/StartServer.ts +83 -56
  184. package/Server/Utils/StatusPageSubscriberWebhook.ts +3 -0
  185. package/Server/Utils/Telemetry/SourceMapResolver.ts +480 -0
  186. package/Server/Utils/TwoFactorBackupCodeNotification.ts +106 -0
  187. package/Server/Utils/VM/VMAPI.ts +3 -0
  188. package/Server/Utils/VM/VMRunner.ts +27 -1
  189. package/Server/Utils/VendorAssets.ts +42 -0
  190. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +136 -6
  191. package/Server/Views/AcknowledgeUserOnCallNotification.ejs +11 -9
  192. package/Server/Views/Partials/Head.ejs +9 -9
  193. package/Server/Views/Partials/OnCallNotificationDetails.ejs +48 -0
  194. package/Server/Views/ViewMessage.ejs +11 -9
  195. package/Tests/App/Accounts/LoginTwoFactorRecovery.test.tsx +972 -0
  196. package/Tests/App/Dashboard/AddNeighborToMonitoringModal.test.tsx +401 -0
  197. package/Tests/App/Dashboard/DiscoveryScanEditForm.test.tsx +707 -0
  198. package/Tests/App/Dashboard/DiscoveryScanWizardValidation.test.tsx +1908 -18
  199. package/Tests/App/Dashboard/ResourceFeed.test.tsx +230 -0
  200. package/Tests/App/Dashboard/ResourceFeedPageWiring.test.ts +216 -0
  201. package/Tests/App/Dashboard/TopologyAddToMonitoring.test.tsx +192 -0
  202. package/Tests/App/Dashboard/WorkspaceNotificationRuleConditions.test.tsx +439 -0
  203. package/Tests/Models/DatabaseModels/DateColumnDeserialization.test.ts +182 -0
  204. package/Tests/Models/DatabaseModels/RelationColumnModelTypeCoverage.test.ts +82 -0
  205. package/Tests/Models/DatabaseModels/ResourceFeedModels.test.ts +398 -0
  206. package/Tests/Models/DiscoveryScanNameColumn.test.ts +151 -16
  207. package/Tests/Models/DiscoveryScanSnmpEnabledColumn.test.ts +593 -0
  208. package/Tests/Models/NetworkDeviceCreateContract.test.ts +102 -0
  209. package/Tests/Server/API/AIGenerationProjectAIToggle.test.ts +607 -0
  210. package/Tests/Server/API/AIGenerationRequestBudget.test.ts +355 -0
  211. package/Tests/Server/API/AIKillSwitchBackstop.test.ts +602 -0
  212. package/Tests/Server/API/BaseAPIUpdateDateColumns.test.ts +154 -0
  213. package/Tests/Server/API/MicrosoftTeamsBotTestEndpoint.test.ts +335 -0
  214. package/Tests/Server/API/UserOnCallLogTimelineAcknowledgePage.test.ts +611 -0
  215. package/Tests/Server/API/UserTotpAuthAPI.test.ts +498 -4
  216. package/Tests/Server/API/UserWebAuthnBackupCodeMinting.test.ts +682 -0
  217. package/Tests/Server/Infrastructure/ExampleDockerfiles.test.ts +595 -0
  218. package/Tests/Server/Services/AIServiceDailyBudget.test.ts +9 -0
  219. package/Tests/Server/Services/AIServiceProjectAccess.test.ts +6 -0
  220. package/Tests/Server/Services/AutoImportScanCredentialSelect.test.ts +18 -0
  221. package/Tests/Server/Services/DatabaseServiceAggregateBy.test.ts +590 -0
  222. package/Tests/Server/Services/DatabaseServiceUpdateWriteRouting.test.ts +12 -0
  223. package/Tests/Server/Services/DiscoveryScanClaimHookFreeSafety.test.ts +162 -26
  224. package/Tests/Server/Services/EnterpriseLicenseServiceCreate.test.ts +292 -0
  225. package/Tests/Server/Services/FeedRetentionConsistency.test.ts +119 -12
  226. package/Tests/Server/Services/LogAggregationAttributeOperators.test.ts +109 -0
  227. package/Tests/Server/Services/MetricAggregationAttributeOperators.test.ts +170 -0
  228. package/Tests/Server/Services/MonitorTemplateServiceNetworkDeviceSync.test.ts +383 -0
  229. package/Tests/Server/Services/NetworkDeviceAutoImportRuleEngineService.test.ts +997 -3
  230. package/Tests/Server/Services/NetworkDeviceAutoImportRuleService.test.ts +830 -0
  231. package/Tests/Server/Services/NetworkDeviceAutoMonitorLifecycle.test.ts +528 -0
  232. package/Tests/Server/Services/NetworkDeviceDiscoveryScanService.test.ts +3141 -1
  233. package/Tests/Server/Services/NetworkDeviceRegisteredHostnames.test.ts +1023 -0
  234. package/Tests/Server/Services/NetworkDeviceSiteAssignmentRuleSkip.test.ts +728 -0
  235. package/Tests/Server/Services/NetworkInterfaceServiceUpsert.test.ts +795 -0
  236. package/Tests/Server/Services/NetworkSiteRollupPolicyAndMaintenance.test.ts +903 -0
  237. package/Tests/Server/Services/NetworkSiteService.test.ts +165 -24
  238. package/Tests/Server/Services/ProjectServiceChangePlan.test.ts +5 -3
  239. package/Tests/Server/Services/ProjectServiceCreateSubscriptionStarted.test.ts +5 -2
  240. package/Tests/Server/Services/ResourceCreationFeedWrites.test.ts +304 -0
  241. package/Tests/Server/Services/ResourceFeedServices.test.ts +269 -0
  242. package/Tests/Server/Services/ResourceOwnerFeedWrites.test.ts +245 -0
  243. package/Tests/Server/Services/SecurityEventLastErrorColumnWidth.test.ts +792 -0
  244. package/Tests/Server/Services/TelemetrySourceMapService.test.ts +483 -0
  245. package/Tests/Server/Services/ThreatIntelFeedService.test.ts +351 -0
  246. package/Tests/Server/Services/ThreatIntelIndicatorService.test.ts +366 -0
  247. package/Tests/Server/Services/TraceAggregationAttributeOperators.test.ts +507 -0
  248. package/Tests/Server/Services/UserTwoFactorBackupCodeGenerateIfNone.test.ts +705 -0
  249. package/Tests/Server/Services/WorkspaceNotificationRuleOnCallDutyPolicy.test.ts +306 -0
  250. package/Tests/Server/Types/Database/AggregateResultUtil.test.ts +386 -0
  251. package/Tests/Server/Types/Database/Permissions/SelectRejectionMessageContract.test.ts +424 -0
  252. package/Tests/Server/Types/Database/QueryHelperWildcard.test.ts +142 -0
  253. package/Tests/Server/Types/Workflow/Components/ApiComponentPrivateNetwork.test.ts +163 -0
  254. package/Tests/Server/Types/Workflow/Components/JavaScriptPrivateNetwork.test.ts +124 -0
  255. package/Tests/Server/Utils/AI/CodeFixAgentCompletion.test.ts +5 -0
  256. package/Tests/Server/Utils/AI/InvestigationGrader.test.ts +39 -1
  257. package/Tests/Server/Utils/AnalyticsDatabase/AttributeFilterStatement.test.ts +338 -0
  258. package/Tests/Server/Utils/AnalyticsDatabase/StatementGeneratorWildcard.test.ts +383 -0
  259. package/Tests/Server/Utils/Marketing/EmittedMarketingEvent.ts +23 -0
  260. package/Tests/Server/Utils/Marketing/MarketingEventUtil.test.ts +51 -0
  261. package/Tests/Server/Utils/Monitor/Criteria/SyntheticMonitorCriteria.test.ts +259 -0
  262. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorPerSeriesFanout.test.ts +557 -0
  263. package/Tests/Server/Utils/Monitor/MonitorDependencySuppressionCreatorSkip.test.ts +12 -2
  264. package/Tests/Server/Utils/Monitor/NetworkDeviceWalkLogWritePath.test.ts +404 -0
  265. package/Tests/Server/Utils/Monitor/NetworkDeviceWalkUtil.test.ts +8 -2
  266. package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +125 -98
  267. package/Tests/Server/Utils/Monitor/PerEntityCriteriaFanOut.test.ts +444 -0
  268. package/Tests/Server/Utils/Monitor/PerSeriesSecondEntityAlerting.test.ts +1112 -0
  269. package/Tests/Server/Utils/NetworkDevice/DeviceHealthAggregation.test.ts +717 -0
  270. package/Tests/Server/Utils/NetworkDevice/RulePatternValidator.test.ts +78 -0
  271. package/Tests/Server/Utils/NetworkSite/NetworkSiteMaintenanceSuppression.test.ts +363 -0
  272. package/Tests/Server/Utils/OfflineAssetHygiene.test.ts +35 -0
  273. package/Tests/Server/Utils/OnCallNotificationContext.test.ts +908 -0
  274. package/Tests/Server/Utils/PrivateNetworkWebhookConfig.test.ts +423 -0
  275. package/Tests/Server/Utils/ResourceFeed/ResourceFeedUtil.test.ts +191 -0
  276. package/Tests/Server/Utils/SSRFProtectionPrivateNetwork.test.ts +597 -0
  277. package/Tests/Server/Utils/SecurityEvent/ConnectorErrorMessage.test.ts +819 -0
  278. package/Tests/Server/Utils/SecurityEvent/DetectionRuleEvaluator.test.ts +381 -0
  279. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPoller.test.ts +417 -0
  280. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPollerFailureTaxonomy.test.ts +819 -0
  281. package/Tests/Server/Utils/SecurityEvent/SecurityEventAlerting.test.ts +246 -0
  282. package/Tests/Server/Utils/SecurityEvent/ThreatIntel/TaxiiClient.test.ts +282 -0
  283. package/Tests/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelEnricher.test.ts +312 -0
  284. package/Tests/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.test.ts +854 -0
  285. package/Tests/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelMatcher.test.ts +437 -0
  286. package/Tests/Server/Utils/StartServerErrorStatus.test.ts +225 -0
  287. package/Tests/Server/Utils/StatusPage/MonitorRulePatternValidator.test.ts +62 -0
  288. package/Tests/Server/Utils/StatusPageSubscriberWebhookPrivateNetwork.test.ts +119 -0
  289. package/Tests/Server/Utils/Telemetry/SourceMapResolver.test.ts +542 -0
  290. package/Tests/Server/Utils/TwoFactorBackupCodeNotification.test.ts +272 -0
  291. package/Tests/Server/Utils/VM/VMRunnerPrivateNetworkWiring.test.ts +111 -0
  292. package/Tests/Server/Utils/VendorAssets.test.ts +117 -0
  293. package/Tests/Server/Utils/Workspace/MicrosoftTeamsChannelSend.test.ts +101 -4
  294. package/Tests/Server/Utils/Workspace/MicrosoftTeamsInstallStateDiagnostics.test.ts +922 -0
  295. package/Tests/Server/Utils/Workspace/MicrosoftTeamsRosterDiagnosticMessages.test.ts +642 -0
  296. package/Tests/Server/Views/OnCallAcknowledgePage.test.ts +430 -0
  297. package/Tests/Types/API/HostnameAuthorityParsing.test.ts +1 -0
  298. package/Tests/Types/API/URLMailtoQueryString.test.ts +439 -0
  299. package/Tests/Types/API/URLQueryString.test.ts +481 -0
  300. package/Tests/Types/API/URLRouteQuerySeparation.test.ts +491 -0
  301. package/Tests/Types/BaseDatabase/Wildcard.test.ts +163 -0
  302. package/Tests/Types/BaseDatabase/WildcardPattern.test.ts +149 -0
  303. package/Tests/Types/Database/DateColumnValue.test.ts +265 -0
  304. package/Tests/Types/DateToIsoStringOrNull.test.ts +67 -0
  305. package/Tests/Types/Log/LogQueryToFilter.test.ts +218 -43
  306. package/Tests/Types/Monitor/KubernetesTemplateGroupByKeys.test.ts +225 -0
  307. package/Tests/Types/Monitor/TemplateGroupByKeys.test.ts +296 -0
  308. package/Tests/Types/NetworkAutomation/RuleRunResult.test.ts +102 -0
  309. package/Tests/Types/NetworkAutomation/RuleRunResultDescribe.test.ts +145 -0
  310. package/Tests/Types/NetworkSite/SiteHealthRollupPolicy.test.ts +58 -0
  311. package/Tests/Types/SerializableObjectDictionaryImportCycle.test.ts +15 -0
  312. package/Tests/Types/Telemetry/TelemetrySearchQuery.test.ts +620 -0
  313. package/Tests/Types/WhatsApp/WhatsAppTemplates.test.ts +110 -0
  314. package/Tests/Types/Workspace/NotificationRuleConditionUtil.test.ts +76 -6
  315. package/Tests/Types/Workspace/NotificationRules/NotificationRuleCondition.test.ts +16 -4
  316. package/Tests/Types/Workspace/NotificationRules/OnCallDutyPolicyConditions.test.ts +669 -0
  317. package/Tests/UI/Components/DictionaryFilterOperatorWildcard.test.ts +175 -0
  318. package/Tests/UI/Components/IconOpticalSize.test.tsx +377 -0
  319. package/Tests/UI/Components/LogsHistogramDragTooltip.test.tsx +393 -0
  320. package/Tests/UI/Components/LogsViewerHistogramZoom.test.tsx +248 -0
  321. package/Tests/UI/Components/TelemetryHistogramDragTooltip.test.tsx +205 -0
  322. package/Tests/UI/Components/UseHistogramZoom.test.tsx +262 -0
  323. package/Tests/UI/MicrosoftTeams/MicrosoftTeamsChatsCardInstallGuidance.test.tsx +332 -0
  324. package/Tests/UI/MicrosoftTeams/MicrosoftTeamsInstallGuidanceContent.test.tsx +643 -0
  325. package/Tests/Utils/Monitor/InterfaceInventoryUtil.test.ts +824 -0
  326. package/Tests/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.test.ts +626 -0
  327. package/Tests/Utils/Monitor/NetworkTopologyUtil.test.ts +718 -0
  328. package/Tests/Utils/NetworkDevice/DeviceHealthStateUtil.test.ts +59 -0
  329. package/Tests/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.test.ts +287 -2
  330. package/Tests/Utils/NetworkDiscovery/DiscoveryImportEligibility.test.ts +73 -0
  331. package/Tests/Utils/NetworkDiscovery/PingMonitorBuilder.test.ts +317 -0
  332. package/Tests/Utils/NetworkDiscovery/RescanIntervalUtil.test.ts +262 -0
  333. package/Tests/Utils/NetworkDiscovery/ScanModeUtil.test.ts +474 -0
  334. package/Tests/Utils/NetworkDiscovery/SnmpScanConfigUtil.test.ts +2442 -0
  335. package/Tests/Utils/NetworkSite/SiteMaintenanceUtil.test.ts +188 -0
  336. package/Tests/Utils/NetworkSite/SiteStatusRollupUtil.test.ts +522 -0
  337. package/Tests/Utils/NetworkSite/SiteUptimeUtil.test.ts +694 -0
  338. package/Tests/Utils/SecurityEvent/ThreatIntel/StixPatternParser.test.ts +281 -0
  339. package/Tests/Utils/Telemetry/CrossSignalScope.test.ts +87 -67
  340. package/Types/API/URL.ts +100 -28
  341. package/Types/AnalyticsDatabase/AnalyticsTableName.ts +8 -0
  342. package/Types/BaseDatabase/NotWildcard.ts +86 -0
  343. package/Types/BaseDatabase/Wildcard.ts +89 -0
  344. package/Types/BaseDatabase/WildcardPattern.ts +176 -0
  345. package/Types/Database/DateColumnValue.ts +184 -0
  346. package/Types/Database/TableColumn.ts +40 -5
  347. package/Types/Date.ts +37 -0
  348. package/Types/Email/EmailTemplateType.ts +1 -0
  349. package/Types/JSON.ts +8 -0
  350. package/Types/Log/LogQueryToFilter.ts +167 -129
  351. package/Types/Monitor/DockerAlertTemplates.ts +43 -12
  352. package/Types/Monitor/HostAlertTemplates.ts +31 -3
  353. package/Types/Monitor/KubernetesAlertTemplates.ts +98 -0
  354. package/Types/Monitor/MonitorStep.ts +49 -0
  355. package/Types/Monitor/PodmanAlertTemplates.ts +39 -12
  356. package/Types/Monitor/SnmpMonitor/CdpNeighbor.ts +14 -0
  357. package/Types/Monitor/SnmpMonitor/LldpNeighbor.ts +11 -0
  358. package/Types/Monitor/SnmpMonitor/NetworkTopology.ts +11 -4
  359. package/Types/NetworkAutomation/RuleRunResult.ts +191 -2
  360. package/Types/NetworkSite/SiteHealthRollupPolicy.ts +96 -0
  361. package/Types/Permission.ts +411 -0
  362. package/Types/Probe/ProbeApiIngestResponse.ts +42 -0
  363. package/Types/SecurityEvent/ThreatIntelConstants.ts +118 -0
  364. package/Types/SerializableObjectDictionary.ts +8 -0
  365. package/Types/Telemetry/SourceMap.ts +56 -0
  366. package/Types/Telemetry/TelemetrySearchQuery.ts +949 -0
  367. package/Types/Workspace/NotificationRules/NotificationRuleCondition.ts +12 -1
  368. package/UI/Components/Charts/Utils/useHistogramZoom.ts +101 -0
  369. package/UI/Components/Dictionary/DictionaryFilterOperator.ts +83 -0
  370. package/UI/Components/Icon/Icon.tsx +28 -1
  371. package/UI/Components/LogsViewer/LogsViewer.tsx +19 -3
  372. package/UI/Components/LogsViewer/components/LogSearchBar.tsx +26 -4
  373. package/UI/Components/LogsViewer/components/LogSearchHelp.tsx +34 -16
  374. package/UI/Components/LogsViewer/components/LogsHistogram.tsx +52 -1
  375. package/UI/Components/TelemetryViewer/TelemetryViewer.tsx +18 -2
  376. package/UI/Components/TelemetryViewer/components/TelemetryHistogram.tsx +52 -1
  377. package/UI/Components/TelemetryViewer/components/TelemetrySearchBar.tsx +15 -2
  378. package/Utils/Metrics/MetricExplorerUrl.ts +77 -15
  379. package/Utils/Monitor/InterfaceInventoryUtil.ts +251 -0
  380. package/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.ts +333 -0
  381. package/Utils/Monitor/NetworkTopologyUtil.ts +249 -28
  382. package/Utils/NetworkDevice/DeviceHealthStateUtil.ts +14 -6
  383. package/Utils/NetworkDiscovery/AutoImportRuleMatcher.ts +2 -0
  384. package/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.ts +49 -18
  385. package/Utils/NetworkDiscovery/PingMonitorBuilder.ts +215 -0
  386. package/Utils/NetworkDiscovery/RescanIntervalUtil.ts +148 -0
  387. package/Utils/NetworkDiscovery/ScanModeUtil.ts +105 -0
  388. package/Utils/NetworkDiscovery/SnmpScanConfigUtil.ts +827 -0
  389. package/Utils/NetworkSite/SiteMaintenanceUtil.ts +110 -0
  390. package/Utils/NetworkSite/SiteStatusRollupUtil.ts +350 -19
  391. package/Utils/NetworkSite/SiteUptimeUtil.ts +422 -21
  392. package/Utils/SecurityEvent/ThreatIntel/StixPatternParser.ts +383 -0
  393. package/Utils/Telemetry/CrossSignalScope.ts +37 -39
  394. package/build/dist/Models/AnalyticsModels/Index.js +2 -0
  395. package/build/dist/Models/AnalyticsModels/Index.js.map +1 -1
  396. package/build/dist/Models/AnalyticsModels/ThreatIntelIndicator.js +325 -0
  397. package/build/dist/Models/AnalyticsModels/ThreatIntelIndicator.js.map +1 -0
  398. package/build/dist/Models/DatabaseModels/AlertSeverity.js +4 -1
  399. package/build/dist/Models/DatabaseModels/AlertSeverity.js.map +1 -1
  400. package/build/dist/Models/DatabaseModels/CephClusterFeed.js +648 -0
  401. package/build/dist/Models/DatabaseModels/CephClusterFeed.js.map +1 -0
  402. package/build/dist/Models/DatabaseModels/CloudResourceFeed.js +648 -0
  403. package/build/dist/Models/DatabaseModels/CloudResourceFeed.js.map +1 -0
  404. package/build/dist/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.js +11 -0
  405. package/build/dist/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.js.map +1 -1
  406. package/build/dist/Models/DatabaseModels/DetectionRule.js +9 -3
  407. package/build/dist/Models/DatabaseModels/DetectionRule.js.map +1 -1
  408. package/build/dist/Models/DatabaseModels/DockerHostFeed.js +648 -0
  409. package/build/dist/Models/DatabaseModels/DockerHostFeed.js.map +1 -0
  410. package/build/dist/Models/DatabaseModels/DockerSwarmClusterFeed.js +648 -0
  411. package/build/dist/Models/DatabaseModels/DockerSwarmClusterFeed.js.map +1 -0
  412. package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js +9 -3
  413. package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js.map +1 -1
  414. package/build/dist/Models/DatabaseModels/HostFeed.js +648 -0
  415. package/build/dist/Models/DatabaseModels/HostFeed.js.map +1 -0
  416. package/build/dist/Models/DatabaseModels/IncidentSeverity.js +4 -1
  417. package/build/dist/Models/DatabaseModels/IncidentSeverity.js.map +1 -1
  418. package/build/dist/Models/DatabaseModels/Index.js +22 -0
  419. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  420. package/build/dist/Models/DatabaseModels/KubernetesClusterFeed.js +648 -0
  421. package/build/dist/Models/DatabaseModels/KubernetesClusterFeed.js.map +1 -0
  422. package/build/dist/Models/DatabaseModels/Monitor.js +81 -0
  423. package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
  424. package/build/dist/Models/DatabaseModels/NetworkDevice.js +103 -7
  425. package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
  426. package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js +91 -6
  427. package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js.map +1 -1
  428. package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js +276 -31
  429. package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -1
  430. package/build/dist/Models/DatabaseModels/NetworkSite.js +124 -1
  431. package/build/dist/Models/DatabaseModels/NetworkSite.js.map +1 -1
  432. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyExecutionLog.js +1 -0
  433. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyExecutionLog.js.map +1 -1
  434. package/build/dist/Models/DatabaseModels/PodmanHostFeed.js +648 -0
  435. package/build/dist/Models/DatabaseModels/PodmanHostFeed.js.map +1 -0
  436. package/build/dist/Models/DatabaseModels/ProxmoxClusterFeed.js +648 -0
  437. package/build/dist/Models/DatabaseModels/ProxmoxClusterFeed.js.map +1 -0
  438. package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js +66 -0
  439. package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js.map +1 -1
  440. package/build/dist/Models/DatabaseModels/ServiceFeed.js +648 -0
  441. package/build/dist/Models/DatabaseModels/ServiceFeed.js.map +1 -0
  442. package/build/dist/Models/DatabaseModels/TelemetrySourceMap.js +496 -0
  443. package/build/dist/Models/DatabaseModels/TelemetrySourceMap.js.map +1 -0
  444. package/build/dist/Models/DatabaseModels/ThreatIntelFeed.js +800 -0
  445. package/build/dist/Models/DatabaseModels/ThreatIntelFeed.js.map +1 -0
  446. package/build/dist/Models/DatabaseModels/UserOnCallLog.js +1 -0
  447. package/build/dist/Models/DatabaseModels/UserOnCallLog.js.map +1 -1
  448. package/build/dist/Models/DatabaseModels/UserTotpAuth.js +1 -0
  449. package/build/dist/Models/DatabaseModels/UserTotpAuth.js.map +1 -1
  450. package/build/dist/Models/DatabaseModels/UserWebAuthn.js +1 -0
  451. package/build/dist/Models/DatabaseModels/UserWebAuthn.js.map +1 -1
  452. package/build/dist/Server/API/AlertAPI.js +18 -1
  453. package/build/dist/Server/API/AlertAPI.js.map +1 -1
  454. package/build/dist/Server/API/BaseAPI.js +8 -1
  455. package/build/dist/Server/API/BaseAPI.js.map +1 -1
  456. package/build/dist/Server/API/IncidentAPI.js +35 -1
  457. package/build/dist/Server/API/IncidentAPI.js.map +1 -1
  458. package/build/dist/Server/API/IncidentEpisodeAPI.js +18 -1
  459. package/build/dist/Server/API/IncidentEpisodeAPI.js.map +1 -1
  460. package/build/dist/Server/API/MicrosoftTeamsAPI.js +30 -2
  461. package/build/dist/Server/API/MicrosoftTeamsAPI.js.map +1 -1
  462. package/build/dist/Server/API/ScheduledMaintenanceAPI.js +18 -1
  463. package/build/dist/Server/API/ScheduledMaintenanceAPI.js.map +1 -1
  464. package/build/dist/Server/API/SlackAPI.js +45 -0
  465. package/build/dist/Server/API/SlackAPI.js.map +1 -1
  466. package/build/dist/Server/API/TelemetryAPI.js +100 -35
  467. package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
  468. package/build/dist/Server/API/UserOnCallLogTimelineAPI.js +64 -59
  469. package/build/dist/Server/API/UserOnCallLogTimelineAPI.js.map +1 -1
  470. package/build/dist/Server/API/UserTotpAuthAPI.js +65 -1
  471. package/build/dist/Server/API/UserTotpAuthAPI.js.map +1 -1
  472. package/build/dist/Server/API/UserWebAuthnAPI.js +42 -1
  473. package/build/dist/Server/API/UserWebAuthnAPI.js.map +1 -1
  474. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787923136162-MigrationName.js +26 -0
  475. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787923136162-MigrationName.js.map +1 -0
  476. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789600000000-AddAutoProvisionedNetworkDeviceMonitors.js +22 -0
  477. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789600000000-AddAutoProvisionedNetworkDeviceMonitors.js.map +1 -0
  478. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789700000000-AddNetworkScaleIndexes.js +88 -0
  479. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789700000000-AddNetworkScaleIndexes.js.map +1 -0
  480. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789800000000-WidenSecurityEventLastErrorColumns.js +39 -0
  481. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789800000000-WidenSecurityEventLastErrorColumns.js.map +1 -0
  482. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789900000000-AddNetworkSiteRollupPolicyAndMaintenance.js +34 -0
  483. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789900000000-AddNetworkSiteRollupPolicyAndMaintenance.js.map +1 -0
  484. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790000000000-AddTelemetrySourceMap.js +32 -0
  485. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790000000000-AddTelemetrySourceMap.js.map +1 -0
  486. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790000000001-AddSnmpConfigsToNetworkDeviceDiscoveryScan.js +61 -0
  487. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790000000001-AddSnmpConfigsToNetworkDeviceDiscoveryScan.js.map +1 -0
  488. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790003445000-AddSnmpEnabledToNetworkDeviceDiscoveryScan.js +23 -0
  489. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790003445000-AddSnmpEnabledToNetworkDeviceDiscoveryScan.js.map +1 -0
  490. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790100000000-AddResourceActivityFeeds.js +179 -0
  491. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790100000000-AddResourceActivityFeeds.js.map +1 -0
  492. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +18 -0
  493. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  494. package/build/dist/Server/Middleware/IdentityRateLimit.js +40 -3
  495. package/build/dist/Server/Middleware/IdentityRateLimit.js.map +1 -1
  496. package/build/dist/Server/Services/AIService.js +177 -30
  497. package/build/dist/Server/Services/AIService.js.map +1 -1
  498. package/build/dist/Server/Services/CephClusterFeedService.js +89 -0
  499. package/build/dist/Server/Services/CephClusterFeedService.js.map +1 -0
  500. package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js +27 -3
  501. package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js.map +1 -1
  502. package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js +21 -0
  503. package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js.map +1 -1
  504. package/build/dist/Server/Services/CephClusterOwnerTeamService.js +120 -0
  505. package/build/dist/Server/Services/CephClusterOwnerTeamService.js.map +1 -1
  506. package/build/dist/Server/Services/CephClusterOwnerUserService.js +113 -0
  507. package/build/dist/Server/Services/CephClusterOwnerUserService.js.map +1 -1
  508. package/build/dist/Server/Services/CephClusterService.js +175 -1
  509. package/build/dist/Server/Services/CephClusterService.js.map +1 -1
  510. package/build/dist/Server/Services/CloudResourceFeedService.js +89 -0
  511. package/build/dist/Server/Services/CloudResourceFeedService.js.map +1 -0
  512. package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js +27 -3
  513. package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js.map +1 -1
  514. package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js +28 -3
  515. package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js.map +1 -1
  516. package/build/dist/Server/Services/CloudResourceOwnerTeamService.js +120 -0
  517. package/build/dist/Server/Services/CloudResourceOwnerTeamService.js.map +1 -1
  518. package/build/dist/Server/Services/CloudResourceOwnerUserService.js +113 -0
  519. package/build/dist/Server/Services/CloudResourceOwnerUserService.js.map +1 -1
  520. package/build/dist/Server/Services/CloudResourceService.js +177 -1
  521. package/build/dist/Server/Services/CloudResourceService.js.map +1 -1
  522. package/build/dist/Server/Services/DatabaseService.js +201 -0
  523. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  524. package/build/dist/Server/Services/DockerHostFeedService.js +89 -0
  525. package/build/dist/Server/Services/DockerHostFeedService.js.map +1 -0
  526. package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js +27 -3
  527. package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js.map +1 -1
  528. package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js +21 -0
  529. package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js.map +1 -1
  530. package/build/dist/Server/Services/DockerHostOwnerTeamService.js +120 -0
  531. package/build/dist/Server/Services/DockerHostOwnerTeamService.js.map +1 -1
  532. package/build/dist/Server/Services/DockerHostOwnerUserService.js +113 -0
  533. package/build/dist/Server/Services/DockerHostOwnerUserService.js.map +1 -1
  534. package/build/dist/Server/Services/DockerHostService.js +177 -1
  535. package/build/dist/Server/Services/DockerHostService.js.map +1 -1
  536. package/build/dist/Server/Services/DockerSwarmClusterFeedService.js +90 -0
  537. package/build/dist/Server/Services/DockerSwarmClusterFeedService.js.map +1 -0
  538. package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js +27 -3
  539. package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js.map +1 -1
  540. package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js +21 -0
  541. package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js.map +1 -1
  542. package/build/dist/Server/Services/DockerSwarmClusterOwnerTeamService.js +120 -0
  543. package/build/dist/Server/Services/DockerSwarmClusterOwnerTeamService.js.map +1 -1
  544. package/build/dist/Server/Services/DockerSwarmClusterOwnerUserService.js +113 -0
  545. package/build/dist/Server/Services/DockerSwarmClusterOwnerUserService.js.map +1 -1
  546. package/build/dist/Server/Services/DockerSwarmClusterService.js +175 -1
  547. package/build/dist/Server/Services/DockerSwarmClusterService.js.map +1 -1
  548. package/build/dist/Server/Services/EnterpriseLicenseService.js +40 -30
  549. package/build/dist/Server/Services/EnterpriseLicenseService.js.map +1 -1
  550. package/build/dist/Server/Services/ExceptionAggregationService.js +8 -2
  551. package/build/dist/Server/Services/ExceptionAggregationService.js.map +1 -1
  552. package/build/dist/Server/Services/HostFeedService.js +89 -0
  553. package/build/dist/Server/Services/HostFeedService.js.map +1 -0
  554. package/build/dist/Server/Services/HostLabelRuleEngineService.js +27 -3
  555. package/build/dist/Server/Services/HostLabelRuleEngineService.js.map +1 -1
  556. package/build/dist/Server/Services/HostOwnerRuleEngineService.js +21 -0
  557. package/build/dist/Server/Services/HostOwnerRuleEngineService.js.map +1 -1
  558. package/build/dist/Server/Services/HostOwnerTeamService.js +120 -0
  559. package/build/dist/Server/Services/HostOwnerTeamService.js.map +1 -1
  560. package/build/dist/Server/Services/HostOwnerUserService.js +113 -0
  561. package/build/dist/Server/Services/HostOwnerUserService.js.map +1 -1
  562. package/build/dist/Server/Services/HostService.js +175 -1
  563. package/build/dist/Server/Services/HostService.js.map +1 -1
  564. package/build/dist/Server/Services/IncidentService.js +10 -0
  565. package/build/dist/Server/Services/IncidentService.js.map +1 -1
  566. package/build/dist/Server/Services/Index.js +24 -0
  567. package/build/dist/Server/Services/Index.js.map +1 -1
  568. package/build/dist/Server/Services/KubernetesClusterFeedService.js +89 -0
  569. package/build/dist/Server/Services/KubernetesClusterFeedService.js.map +1 -0
  570. package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js +27 -3
  571. package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js.map +1 -1
  572. package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js +21 -0
  573. package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js.map +1 -1
  574. package/build/dist/Server/Services/KubernetesClusterOwnerTeamService.js +120 -0
  575. package/build/dist/Server/Services/KubernetesClusterOwnerTeamService.js.map +1 -1
  576. package/build/dist/Server/Services/KubernetesClusterOwnerUserService.js +113 -0
  577. package/build/dist/Server/Services/KubernetesClusterOwnerUserService.js.map +1 -1
  578. package/build/dist/Server/Services/KubernetesClusterService.js +177 -1
  579. package/build/dist/Server/Services/KubernetesClusterService.js.map +1 -1
  580. package/build/dist/Server/Services/LogAggregationService.js +19 -196
  581. package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
  582. package/build/dist/Server/Services/MetricAggregationService.js +59 -0
  583. package/build/dist/Server/Services/MetricAggregationService.js.map +1 -1
  584. package/build/dist/Server/Services/MonitorService.js +115 -13
  585. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  586. package/build/dist/Server/Services/MonitorTemplateService.js +86 -0
  587. package/build/dist/Server/Services/MonitorTemplateService.js.map +1 -1
  588. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +561 -67
  589. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
  590. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js +130 -16
  591. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js.map +1 -1
  592. package/build/dist/Server/Services/NetworkDeviceDiscoveryScanService.js +850 -8
  593. package/build/dist/Server/Services/NetworkDeviceDiscoveryScanService.js.map +1 -1
  594. package/build/dist/Server/Services/NetworkDeviceService.js +594 -5
  595. package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
  596. package/build/dist/Server/Services/NetworkInterfaceService.js +306 -0
  597. package/build/dist/Server/Services/NetworkInterfaceService.js.map +1 -1
  598. package/build/dist/Server/Services/NetworkSiteService.js +408 -47
  599. package/build/dist/Server/Services/NetworkSiteService.js.map +1 -1
  600. package/build/dist/Server/Services/PodmanHostFeedService.js +89 -0
  601. package/build/dist/Server/Services/PodmanHostFeedService.js.map +1 -0
  602. package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js +27 -3
  603. package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js.map +1 -1
  604. package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js +21 -0
  605. package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js.map +1 -1
  606. package/build/dist/Server/Services/PodmanHostOwnerTeamService.js +120 -0
  607. package/build/dist/Server/Services/PodmanHostOwnerTeamService.js.map +1 -1
  608. package/build/dist/Server/Services/PodmanHostOwnerUserService.js +113 -0
  609. package/build/dist/Server/Services/PodmanHostOwnerUserService.js.map +1 -1
  610. package/build/dist/Server/Services/PodmanHostService.js +177 -1
  611. package/build/dist/Server/Services/PodmanHostService.js.map +1 -1
  612. package/build/dist/Server/Services/ProjectService.js +40 -30
  613. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  614. package/build/dist/Server/Services/ProxmoxClusterFeedService.js +89 -0
  615. package/build/dist/Server/Services/ProxmoxClusterFeedService.js.map +1 -0
  616. package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js +27 -3
  617. package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js.map +1 -1
  618. package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js +21 -0
  619. package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js.map +1 -1
  620. package/build/dist/Server/Services/ProxmoxClusterOwnerTeamService.js +120 -0
  621. package/build/dist/Server/Services/ProxmoxClusterOwnerTeamService.js.map +1 -1
  622. package/build/dist/Server/Services/ProxmoxClusterOwnerUserService.js +113 -0
  623. package/build/dist/Server/Services/ProxmoxClusterOwnerUserService.js.map +1 -1
  624. package/build/dist/Server/Services/ProxmoxClusterService.js +175 -1
  625. package/build/dist/Server/Services/ProxmoxClusterService.js.map +1 -1
  626. package/build/dist/Server/Services/ScheduledMaintenanceStateTimelineService.js +56 -0
  627. package/build/dist/Server/Services/ScheduledMaintenanceStateTimelineService.js.map +1 -1
  628. package/build/dist/Server/Services/ServiceFeedService.js +89 -0
  629. package/build/dist/Server/Services/ServiceFeedService.js.map +1 -0
  630. package/build/dist/Server/Services/ServiceLabelRuleEngineService.js +27 -3
  631. package/build/dist/Server/Services/ServiceLabelRuleEngineService.js.map +1 -1
  632. package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js +24 -0
  633. package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js.map +1 -1
  634. package/build/dist/Server/Services/ServiceOwnerTeamService.js +120 -0
  635. package/build/dist/Server/Services/ServiceOwnerTeamService.js.map +1 -1
  636. package/build/dist/Server/Services/ServiceOwnerUserService.js +113 -0
  637. package/build/dist/Server/Services/ServiceOwnerUserService.js.map +1 -1
  638. package/build/dist/Server/Services/ServiceService.js +173 -2
  639. package/build/dist/Server/Services/ServiceService.js.map +1 -1
  640. package/build/dist/Server/Services/StatusPageSubscriberService.js +7 -0
  641. package/build/dist/Server/Services/StatusPageSubscriberService.js.map +1 -1
  642. package/build/dist/Server/Services/TelemetryAttributeService.js +9 -3
  643. package/build/dist/Server/Services/TelemetryAttributeService.js.map +1 -1
  644. package/build/dist/Server/Services/TelemetrySourceMapService.js +265 -0
  645. package/build/dist/Server/Services/TelemetrySourceMapService.js.map +1 -0
  646. package/build/dist/Server/Services/ThreatIntelFeedService.js +157 -0
  647. package/build/dist/Server/Services/ThreatIntelFeedService.js.map +1 -0
  648. package/build/dist/Server/Services/ThreatIntelIndicatorService.js +276 -0
  649. package/build/dist/Server/Services/ThreatIntelIndicatorService.js.map +1 -0
  650. package/build/dist/Server/Services/TraceAggregationService.js +62 -6
  651. package/build/dist/Server/Services/TraceAggregationService.js.map +1 -1
  652. package/build/dist/Server/Services/UserService.js +22 -13
  653. package/build/dist/Server/Services/UserService.js.map +1 -1
  654. package/build/dist/Server/Services/UserTwoFactorBackupCodeService.js +120 -0
  655. package/build/dist/Server/Services/UserTwoFactorBackupCodeService.js.map +1 -1
  656. package/build/dist/Server/Services/UserWebhookService.js +11 -2
  657. package/build/dist/Server/Services/UserWebhookService.js.map +1 -1
  658. package/build/dist/Server/Types/AnalyticsDatabase/ModelPermission.js +12 -1
  659. package/build/dist/Server/Types/AnalyticsDatabase/ModelPermission.js.map +1 -1
  660. package/build/dist/Server/Types/Database/AggregateBy.js +2 -0
  661. package/build/dist/Server/Types/Database/AggregateBy.js.map +1 -0
  662. package/build/dist/Server/Types/Database/AggregateResultUtil.js +90 -0
  663. package/build/dist/Server/Types/Database/AggregateResultUtil.js.map +1 -0
  664. package/build/dist/Server/Types/Database/JSONColumnQuery.js +14 -0
  665. package/build/dist/Server/Types/Database/JSONColumnQuery.js.map +1 -1
  666. package/build/dist/Server/Types/Database/QueryHelper.js +42 -0
  667. package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
  668. package/build/dist/Server/Types/Database/QueryUtil.js +18 -0
  669. package/build/dist/Server/Types/Database/QueryUtil.js.map +1 -1
  670. package/build/dist/Server/Types/Workflow/Components/API/Utils.js +10 -1
  671. package/build/dist/Server/Types/Workflow/Components/API/Utils.js.map +1 -1
  672. package/build/dist/Server/Types/Workflow/Components/JavaScript.js +8 -0
  673. package/build/dist/Server/Types/Workflow/Components/JavaScript.js.map +1 -1
  674. package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.js +8 -0
  675. package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.js.map +1 -1
  676. package/build/dist/Server/Utils/AI/SRE/InvestigationGrader.js +15 -0
  677. package/build/dist/Server/Utils/AI/SRE/InvestigationGrader.js.map +1 -1
  678. package/build/dist/Server/Utils/AnalyticsDatabase/AttributeFilterStatement.js +266 -0
  679. package/build/dist/Server/Utils/AnalyticsDatabase/AttributeFilterStatement.js.map +1 -0
  680. package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js +134 -0
  681. package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js.map +1 -1
  682. package/build/dist/Server/Utils/DataSource/HttpFetch.js +8 -0
  683. package/build/dist/Server/Utils/DataSource/HttpFetch.js.map +1 -1
  684. package/build/dist/Server/Utils/Database/RelationIdUtil.js +31 -0
  685. package/build/dist/Server/Utils/Database/RelationIdUtil.js.map +1 -1
  686. package/build/dist/Server/Utils/Marketing/MarketingEventUtil.js +26 -8
  687. package/build/dist/Server/Utils/Marketing/MarketingEventUtil.js.map +1 -1
  688. package/build/dist/Server/Utils/Monitor/Criteria/ServerMonitorCriteria.js +42 -17
  689. package/build/dist/Server/Utils/Monitor/Criteria/ServerMonitorCriteria.js.map +1 -1
  690. package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js +9 -1
  691. package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js.map +1 -1
  692. package/build/dist/Server/Utils/Monitor/Criteria/SyntheticMonitor.js +15 -2
  693. package/build/dist/Server/Utils/Monitor/Criteria/SyntheticMonitor.js.map +1 -1
  694. package/build/dist/Server/Utils/Monitor/MonitorAlert.js +386 -271
  695. package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
  696. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +278 -64
  697. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
  698. package/build/dist/Server/Utils/Monitor/MonitorIncident.js +469 -350
  699. package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
  700. package/build/dist/Server/Utils/Monitor/MonitorResource.js +183 -44
  701. package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
  702. package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js +46 -3
  703. package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js.map +1 -1
  704. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +18 -91
  705. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
  706. package/build/dist/Server/Utils/Monitor/PerEntityCriteriaFanOut.js +194 -0
  707. package/build/dist/Server/Utils/Monitor/PerEntityCriteriaFanOut.js.map +1 -0
  708. package/build/dist/Server/Utils/NetworkDevice/DeviceHealthAggregation.js +332 -0
  709. package/build/dist/Server/Utils/NetworkDevice/DeviceHealthAggregation.js.map +1 -0
  710. package/build/dist/Server/Utils/NetworkSite/NetworkSiteMaintenanceSuppression.js +279 -0
  711. package/build/dist/Server/Utils/NetworkSite/NetworkSiteMaintenanceSuppression.js.map +1 -0
  712. package/build/dist/Server/Utils/OnCallNotificationContext.js +415 -0
  713. package/build/dist/Server/Utils/OnCallNotificationContext.js.map +1 -0
  714. package/build/dist/Server/Utils/PrivateNetworkWebhookConfig.js +424 -0
  715. package/build/dist/Server/Utils/PrivateNetworkWebhookConfig.js.map +1 -0
  716. package/build/dist/Server/Utils/ResourceFeed/ResourceFeedUtil.js +108 -0
  717. package/build/dist/Server/Utils/ResourceFeed/ResourceFeedUtil.js.map +1 -0
  718. package/build/dist/Server/Utils/Response.js +12 -1
  719. package/build/dist/Server/Utils/Response.js.map +1 -1
  720. package/build/dist/Server/Utils/SSRFProtection.js +160 -58
  721. package/build/dist/Server/Utils/SSRFProtection.js.map +1 -1
  722. package/build/dist/Server/Utils/SecurityEvent/ConnectorErrorMessage.js +89 -0
  723. package/build/dist/Server/Utils/SecurityEvent/ConnectorErrorMessage.js.map +1 -0
  724. package/build/dist/Server/Utils/SecurityEvent/DetectionRuleEvaluator.js +75 -234
  725. package/build/dist/Server/Utils/SecurityEvent/DetectionRuleEvaluator.js.map +1 -1
  726. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js +41 -16
  727. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js.map +1 -1
  728. package/build/dist/Server/Utils/SecurityEvent/SecurityEventAlerting.js +217 -0
  729. package/build/dist/Server/Utils/SecurityEvent/SecurityEventAlerting.js.map +1 -0
  730. package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/TaxiiClient.js +103 -0
  731. package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/TaxiiClient.js.map +1 -0
  732. package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelEnricher.js +168 -0
  733. package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelEnricher.js.map +1 -0
  734. package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.js +527 -0
  735. package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.js.map +1 -0
  736. package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelMatcher.js +376 -0
  737. package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelMatcher.js.map +1 -0
  738. package/build/dist/Server/Utils/StartServer.js +70 -44
  739. package/build/dist/Server/Utils/StartServer.js.map +1 -1
  740. package/build/dist/Server/Utils/StatusPageSubscriberWebhook.js +3 -0
  741. package/build/dist/Server/Utils/StatusPageSubscriberWebhook.js.map +1 -1
  742. package/build/dist/Server/Utils/Telemetry/SourceMapResolver.js +327 -0
  743. package/build/dist/Server/Utils/Telemetry/SourceMapResolver.js.map +1 -0
  744. package/build/dist/Server/Utils/TwoFactorBackupCodeNotification.js +84 -0
  745. package/build/dist/Server/Utils/TwoFactorBackupCodeNotification.js.map +1 -0
  746. package/build/dist/Server/Utils/VM/VMAPI.js.map +1 -1
  747. package/build/dist/Server/Utils/VM/VMRunner.js +10 -1
  748. package/build/dist/Server/Utils/VM/VMRunner.js.map +1 -1
  749. package/build/dist/Server/Utils/VendorAssets.js +29 -0
  750. package/build/dist/Server/Utils/VendorAssets.js.map +1 -1
  751. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +121 -6
  752. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
  753. package/build/dist/Types/API/URL.js +88 -27
  754. package/build/dist/Types/API/URL.js.map +1 -1
  755. package/build/dist/Types/AnalyticsDatabase/AnalyticsTableName.js +8 -0
  756. package/build/dist/Types/AnalyticsDatabase/AnalyticsTableName.js.map +1 -1
  757. package/build/dist/Types/BaseDatabase/NotWildcard.js +72 -0
  758. package/build/dist/Types/BaseDatabase/NotWildcard.js.map +1 -0
  759. package/build/dist/Types/BaseDatabase/Wildcard.js +75 -0
  760. package/build/dist/Types/BaseDatabase/Wildcard.js.map +1 -0
  761. package/build/dist/Types/BaseDatabase/WildcardPattern.js +137 -0
  762. package/build/dist/Types/BaseDatabase/WildcardPattern.js.map +1 -0
  763. package/build/dist/Types/Database/DateColumnValue.js +125 -0
  764. package/build/dist/Types/Database/DateColumnValue.js.map +1 -0
  765. package/build/dist/Types/Database/TableColumn.js +18 -2
  766. package/build/dist/Types/Database/TableColumn.js.map +1 -1
  767. package/build/dist/Types/Date.js +31 -0
  768. package/build/dist/Types/Date.js.map +1 -1
  769. package/build/dist/Types/Email/EmailTemplateType.js +1 -0
  770. package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
  771. package/build/dist/Types/JSON.js +2 -0
  772. package/build/dist/Types/JSON.js.map +1 -1
  773. package/build/dist/Types/Log/LogQueryToFilter.js +111 -108
  774. package/build/dist/Types/Log/LogQueryToFilter.js.map +1 -1
  775. package/build/dist/Types/Monitor/DockerAlertTemplates.js +40 -16
  776. package/build/dist/Types/Monitor/DockerAlertTemplates.js.map +1 -1
  777. package/build/dist/Types/Monitor/HostAlertTemplates.js +29 -7
  778. package/build/dist/Types/Monitor/HostAlertTemplates.js.map +1 -1
  779. package/build/dist/Types/Monitor/KubernetesAlertTemplates.js +98 -4
  780. package/build/dist/Types/Monitor/KubernetesAlertTemplates.js.map +1 -1
  781. package/build/dist/Types/Monitor/MonitorStep.js +40 -0
  782. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  783. package/build/dist/Types/Monitor/PodmanAlertTemplates.js +36 -16
  784. package/build/dist/Types/Monitor/PodmanAlertTemplates.js.map +1 -1
  785. package/build/dist/Types/NetworkAutomation/RuleRunResult.js +90 -0
  786. package/build/dist/Types/NetworkAutomation/RuleRunResult.js.map +1 -1
  787. package/build/dist/Types/NetworkSite/SiteHealthRollupPolicy.js +84 -0
  788. package/build/dist/Types/NetworkSite/SiteHealthRollupPolicy.js.map +1 -0
  789. package/build/dist/Types/Permission.js +354 -0
  790. package/build/dist/Types/Permission.js.map +1 -1
  791. package/build/dist/Types/SecurityEvent/ThreatIntelConstants.js +100 -0
  792. package/build/dist/Types/SecurityEvent/ThreatIntelConstants.js.map +1 -0
  793. package/build/dist/Types/SerializableObjectDictionary.js +8 -0
  794. package/build/dist/Types/SerializableObjectDictionary.js.map +1 -1
  795. package/build/dist/Types/Telemetry/SourceMap.js +9 -0
  796. package/build/dist/Types/Telemetry/SourceMap.js.map +1 -0
  797. package/build/dist/Types/Telemetry/TelemetrySearchQuery.js +661 -0
  798. package/build/dist/Types/Telemetry/TelemetrySearchQuery.js.map +1 -0
  799. package/build/dist/Types/Workspace/NotificationRules/NotificationRuleCondition.js +12 -1
  800. package/build/dist/Types/Workspace/NotificationRules/NotificationRuleCondition.js.map +1 -1
  801. package/build/dist/UI/Components/Charts/Utils/useHistogramZoom.js +47 -0
  802. package/build/dist/UI/Components/Charts/Utils/useHistogramZoom.js.map +1 -0
  803. package/build/dist/UI/Components/Dictionary/DictionaryFilterOperator.js +67 -0
  804. package/build/dist/UI/Components/Dictionary/DictionaryFilterOperator.js.map +1 -1
  805. package/build/dist/UI/Components/Icon/Icon.js +28 -1
  806. package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
  807. package/build/dist/UI/Components/LogsViewer/LogsViewer.js +15 -3
  808. package/build/dist/UI/Components/LogsViewer/LogsViewer.js.map +1 -1
  809. package/build/dist/UI/Components/LogsViewer/components/LogSearchBar.js +25 -4
  810. package/build/dist/UI/Components/LogsViewer/components/LogSearchBar.js.map +1 -1
  811. package/build/dist/UI/Components/LogsViewer/components/LogSearchHelp.js +36 -16
  812. package/build/dist/UI/Components/LogsViewer/components/LogSearchHelp.js.map +1 -1
  813. package/build/dist/UI/Components/LogsViewer/components/LogsHistogram.js +33 -5
  814. package/build/dist/UI/Components/LogsViewer/components/LogsHistogram.js.map +1 -1
  815. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js +14 -2
  816. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js.map +1 -1
  817. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js +33 -5
  818. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js.map +1 -1
  819. package/build/dist/UI/Components/TelemetryViewer/components/TelemetrySearchBar.js +14 -2
  820. package/build/dist/UI/Components/TelemetryViewer/components/TelemetrySearchBar.js.map +1 -1
  821. package/build/dist/Utils/Metrics/MetricExplorerUrl.js +54 -9
  822. package/build/dist/Utils/Metrics/MetricExplorerUrl.js.map +1 -1
  823. package/build/dist/Utils/Monitor/InterfaceInventoryUtil.js +128 -0
  824. package/build/dist/Utils/Monitor/InterfaceInventoryUtil.js.map +1 -0
  825. package/build/dist/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.js +190 -0
  826. package/build/dist/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.js.map +1 -0
  827. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +206 -28
  828. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
  829. package/build/dist/Utils/NetworkDevice/DeviceHealthStateUtil.js +14 -7
  830. package/build/dist/Utils/NetworkDevice/DeviceHealthStateUtil.js.map +1 -1
  831. package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js.map +1 -1
  832. package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js +34 -18
  833. package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js.map +1 -1
  834. package/build/dist/Utils/NetworkDiscovery/PingMonitorBuilder.js +163 -0
  835. package/build/dist/Utils/NetworkDiscovery/PingMonitorBuilder.js.map +1 -0
  836. package/build/dist/Utils/NetworkDiscovery/RescanIntervalUtil.js +99 -0
  837. package/build/dist/Utils/NetworkDiscovery/RescanIntervalUtil.js.map +1 -0
  838. package/build/dist/Utils/NetworkDiscovery/ScanModeUtil.js +85 -0
  839. package/build/dist/Utils/NetworkDiscovery/ScanModeUtil.js.map +1 -0
  840. package/build/dist/Utils/NetworkDiscovery/SnmpScanConfigUtil.js +560 -0
  841. package/build/dist/Utils/NetworkDiscovery/SnmpScanConfigUtil.js.map +1 -0
  842. package/build/dist/Utils/NetworkSite/SiteMaintenanceUtil.js +56 -0
  843. package/build/dist/Utils/NetworkSite/SiteMaintenanceUtil.js.map +1 -0
  844. package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js +185 -10
  845. package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js.map +1 -1
  846. package/build/dist/Utils/NetworkSite/SiteUptimeUtil.js +248 -21
  847. package/build/dist/Utils/NetworkSite/SiteUptimeUtil.js.map +1 -1
  848. package/build/dist/Utils/SecurityEvent/ThreatIntel/StixPatternParser.js +255 -0
  849. package/build/dist/Utils/SecurityEvent/ThreatIntel/StixPatternParser.js.map +1 -0
  850. package/build/dist/Utils/Telemetry/CrossSignalScope.js +27 -30
  851. package/build/dist/Utils/Telemetry/CrossSignalScope.js.map +1 -1
  852. package/package.json +2 -1
  853. package/Tests/Types/Log/LogQueryParser.test.ts +0 -186
  854. package/Types/Log/LogQueryParser.ts +0 -252
  855. package/build/dist/Types/Log/LogQueryParser.js +0 -200
  856. package/build/dist/Types/Log/LogQueryParser.js.map +0 -1
@@ -0,0 +1,1023 @@
1
+ import NetworkDeviceService from "../../../Server/Services/NetworkDeviceService";
2
+ import NetworkDevice from "../../../Models/DatabaseModels/NetworkDevice";
3
+ import ObjectID from "../../../Types/ObjectID";
4
+ import LIMIT_MAX from "../../../Types/Database/LimitMax";
5
+ import DatabaseCommonInteractionProps from "../../../Types/BaseDatabase/DatabaseCommonInteractionProps";
6
+ import { JSONObject } from "../../../Types/JSON";
7
+ import { FindOperator } from "typeorm";
8
+ import { afterEach, beforeEach, describe, expect, it } from "@jest/globals";
9
+
10
+ /*
11
+ * "Which of THESE addresses already have a device in this project."
12
+ *
13
+ * The probe's discovery-scan result endpoint asks this of every host a sweep
14
+ * found, and the answer decides whether the dashboard offers the host as
15
+ * importable. A WRONG "not registered" is not a cosmetic miss: the reviewer
16
+ * clicks import and a second device appears at an address that already had
17
+ * one.
18
+ *
19
+ * The walk this replaced got that wrong at scale, and this suite exists to
20
+ * pin the shape that cannot. It paged every device in the project with
21
+ * `ORDER BY createdAt LIMIT 10000 OFFSET n` — and a bulk discovery import
22
+ * stamps every device it creates with the SAME createdAt, so on a fleet of
23
+ * 80,000 devices all 80,000 shared one sort value. LIMIT/OFFSET over a
24
+ * single-valued sort key is not stable: Postgres may return a row twice
25
+ * across two pages and never return another at all, and the row it never
26
+ * returned reads as "not registered". The walk also cost eight sequential
27
+ * full-table scans inside a request the probe synchronously waits on.
28
+ *
29
+ * So the tests here are mostly about STATEMENTS, not results: how many reads
30
+ * are issued, which addresses each one asks about, and — the load-bearing
31
+ * one — that the read count is a function of the SWEEP's size alone and never
32
+ * of what any page returned. Those assertions used to live in the API's own
33
+ * test (App/Tests/Telemetry/ProbeIngestDiscoveryScan.test.ts) because the API
34
+ * did the paging; they belong here now that it does not.
35
+ *
36
+ * No Postgres: findBy is spied on the service singleton and the tests read
37
+ * the query objects it was handed.
38
+ */
39
+
40
+ const PROJECT_ID: ObjectID = new ObjectID(
41
+ "11111111-1111-4111-8111-111111111111",
42
+ );
43
+ const OTHER_PROJECT_ID: ObjectID = new ObjectID(
44
+ "22222222-2222-4222-8222-222222222222",
45
+ );
46
+
47
+ /*
48
+ * Must track HOSTNAME_LOOKUP_CHUNK_SIZE in NetworkDeviceService. Written out
49
+ * rather than imported (it is module-private) so that changing the service
50
+ * constant fails HERE — the number is a promise about the longest literal
51
+ * `IN (...)` list this code will ever hand the planner, and a promise nobody
52
+ * asserts is not a promise.
53
+ */
54
+ const CHUNK_SIZE: number = 500;
55
+
56
+ const ROOT_PROPS: DatabaseCommonInteractionProps = {
57
+ isRoot: true,
58
+ };
59
+
60
+ let findBySpy: jest.SpyInstance;
61
+
62
+ function deviceAt(hostname: string): NetworkDevice {
63
+ const device: NetworkDevice = new NetworkDevice();
64
+ device.hostname = hostname;
65
+ return device;
66
+ }
67
+
68
+ // A row the query returned that carries no hostname at all.
69
+ function deviceWithNoHostname(): NetworkDevice {
70
+ return new NetworkDevice();
71
+ }
72
+
73
+ /*
74
+ * `count` distinct, well-formed addresses. Kept under 40 x 256 so every
75
+ * generated address is unique — a duplicate would silently weaken the
76
+ * chunk-arithmetic cases below, which count on the input being distinct.
77
+ */
78
+ function addresses(count: number, secondOctet: number = 99): Array<string> {
79
+ const list: Array<string> = [];
80
+
81
+ for (let index: number = 0; index < count; index++) {
82
+ list.push(`10.${secondOctet}.${Math.floor(index / 256)}.${index % 256}`);
83
+ }
84
+
85
+ return list;
86
+ }
87
+
88
+ function findByArgs(callIndex: number): JSONObject {
89
+ return findBySpy.mock.calls[callIndex]![0] as JSONObject;
90
+ }
91
+
92
+ function queryOf(callIndex: number): JSONObject {
93
+ return findByArgs(callIndex)["query"] as JSONObject;
94
+ }
95
+
96
+ /*
97
+ * The addresses one read actually asked about. QueryHelper.any renders the
98
+ * chunk into a TypeORM Raw operator — `(alias IN (:...rid))` with a RANDOM
99
+ * parameter name — so the list is recovered from the operator's parameters
100
+ * rather than from a key a test could hard-code.
101
+ */
102
+ function askedAboutInCall(callIndex: number): Array<string> {
103
+ const operator: FindOperator<string> = queryOf(callIndex)[
104
+ "hostname"
105
+ ] as unknown as FindOperator<string>;
106
+
107
+ const parameters: Record<string, unknown> =
108
+ (operator.objectLiteralParameters || {}) as Record<string, unknown>;
109
+
110
+ const values: Array<unknown> =
111
+ (Object.values(parameters)[0] as Array<unknown>) || [];
112
+
113
+ return values.map((value: unknown): string => {
114
+ return String(value);
115
+ });
116
+ }
117
+
118
+ // Every address asked about, across every read, in the order they were asked.
119
+ function askedAbout(): Array<string> {
120
+ const asked: Array<string> = [];
121
+
122
+ for (let index: number = 0; index < findBySpy.mock.calls.length; index++) {
123
+ asked.push(...askedAboutInCall(index));
124
+ }
125
+
126
+ return asked;
127
+ }
128
+
129
+ function chunkSizes(): Array<number> {
130
+ const sizes: Array<number> = [];
131
+
132
+ for (let index: number = 0; index < findBySpy.mock.calls.length; index++) {
133
+ sizes.push(askedAboutInCall(index).length);
134
+ }
135
+
136
+ return sizes;
137
+ }
138
+
139
+ beforeEach(() => {
140
+ findBySpy = jest.spyOn(NetworkDeviceService, "findBy").mockResolvedValue([]);
141
+ });
142
+
143
+ afterEach(() => {
144
+ jest.restoreAllMocks();
145
+ });
146
+
147
+ describe("NetworkDeviceService.getDevicesByHostnames — the read it issues", () => {
148
+ it("asks one indexed lookup for the addresses it was given", async () => {
149
+ await NetworkDeviceService.getDevicesByHostnames({
150
+ projectId: PROJECT_ID,
151
+ hostnames: ["10.0.0.5", "10.0.0.6", "10.0.0.7"],
152
+ select: { _id: true },
153
+ props: ROOT_PROPS,
154
+ });
155
+
156
+ expect(findBySpy).toHaveBeenCalledTimes(1);
157
+ expect(askedAboutInCall(0)).toEqual(["10.0.0.5", "10.0.0.6", "10.0.0.7"]);
158
+ });
159
+
160
+ /*
161
+ * A hostname predicate is the whole point. Without it this is a table scan
162
+ * that happens to be filtered in Node — which is exactly the walk that was
163
+ * removed.
164
+ */
165
+ it("filters by hostname in the database, with an IN list", async () => {
166
+ await NetworkDeviceService.getDevicesByHostnames({
167
+ projectId: PROJECT_ID,
168
+ hostnames: ["10.0.0.5"],
169
+ select: { _id: true },
170
+ props: ROOT_PROPS,
171
+ });
172
+
173
+ const operator: FindOperator<string> = queryOf(0)[
174
+ "hostname"
175
+ ] as unknown as FindOperator<string>;
176
+
177
+ expect(operator.type).toBe("raw");
178
+ expect(operator.getSql!(`"NetworkDevice"."hostname"`)).toMatch(
179
+ /IN \(:\.\.\./,
180
+ );
181
+ });
182
+
183
+ /*
184
+ * The addresses come off the wire — a probe reports whatever the sweep saw.
185
+ * They travel as a bound parameter list, never spliced into the statement
186
+ * text.
187
+ */
188
+ it("binds the address list as a parameter rather than writing it into the statement", async () => {
189
+ await NetworkDeviceService.getDevicesByHostnames({
190
+ projectId: PROJECT_ID,
191
+ hostnames: ['10.0.0.5\'; DROP TABLE "NetworkDevice"; --'],
192
+ select: { _id: true },
193
+ props: ROOT_PROPS,
194
+ });
195
+
196
+ const operator: FindOperator<string> = queryOf(0)[
197
+ "hostname"
198
+ ] as unknown as FindOperator<string>;
199
+
200
+ const sql: string = operator.getSql!(`"NetworkDevice"."hostname"`);
201
+
202
+ expect(sql).not.toContain("DROP TABLE");
203
+ expect(sql).not.toContain("10.0.0.5");
204
+ // It is still asked about — as a value.
205
+ expect(askedAboutInCall(0)).toEqual([
206
+ '10.0.0.5\'; DROP TABLE "NetworkDevice"; --',
207
+ ]);
208
+ });
209
+
210
+ it("scopes every read to the project it was asked about", async () => {
211
+ await NetworkDeviceService.getDevicesByHostnames({
212
+ projectId: PROJECT_ID,
213
+ hostnames: addresses(CHUNK_SIZE + 1),
214
+ select: { _id: true },
215
+ props: ROOT_PROPS,
216
+ });
217
+
218
+ expect(findBySpy).toHaveBeenCalledTimes(2);
219
+
220
+ for (let index: number = 0; index < 2; index++) {
221
+ expect((queryOf(index)["projectId"] as ObjectID).toString()).toBe(
222
+ PROJECT_ID.toString(),
223
+ );
224
+ }
225
+ });
226
+
227
+ it("a different project asks a different question", async () => {
228
+ await NetworkDeviceService.getDevicesByHostnames({
229
+ projectId: OTHER_PROJECT_ID,
230
+ hostnames: ["10.0.0.5"],
231
+ select: { _id: true },
232
+ props: ROOT_PROPS,
233
+ });
234
+
235
+ expect((queryOf(0)["projectId"] as ObjectID).toString()).toBe(
236
+ OTHER_PROJECT_ID.toString(),
237
+ );
238
+ });
239
+
240
+ /*
241
+ * Project and address, and nothing else. Notably NOT `isArchived: false`,
242
+ * which the fleet-counting queries on this service do use: an archived
243
+ * device still occupies its address, so it must still read as registered or
244
+ * an import would create a second device there.
245
+ */
246
+ it("narrows by project and address only", async () => {
247
+ await NetworkDeviceService.getDevicesByHostnames({
248
+ projectId: PROJECT_ID,
249
+ hostnames: ["10.0.0.5"],
250
+ select: { _id: true },
251
+ props: ROOT_PROPS,
252
+ });
253
+
254
+ expect(Object.keys(queryOf(0)).sort()).toEqual(["hostname", "projectId"]);
255
+ });
256
+
257
+ /*
258
+ * The old walk's ORDER BY createdAt is the specific thing that made it
259
+ * wrong — every row of a bulk import shares one createdAt, so ordering by
260
+ * it ordered nothing, and the OFFSET pages that rode on it overlapped and
261
+ * skipped. Nothing here may sort, and nothing here may offset.
262
+ */
263
+ it("never orders the read and never offsets into it", async () => {
264
+ await NetworkDeviceService.getDevicesByHostnames({
265
+ projectId: PROJECT_ID,
266
+ hostnames: addresses(CHUNK_SIZE * 2 + 3),
267
+ select: { _id: true },
268
+ props: ROOT_PROPS,
269
+ });
270
+
271
+ expect(findBySpy).toHaveBeenCalledTimes(3);
272
+
273
+ for (let index: number = 0; index < 3; index++) {
274
+ expect(findByArgs(index)["sort"]).toEqual({});
275
+ expect((findByArgs(index)["sort"] as JSONObject)["createdAt"]).toBe(
276
+ undefined,
277
+ );
278
+ expect(findByArgs(index)["skip"]).toBe(0);
279
+ expect(findByArgs(index)["limit"]).toBe(LIMIT_MAX);
280
+ }
281
+ });
282
+
283
+ it("keeps the caller's select and always reads the hostname it keys by", async () => {
284
+ await NetworkDeviceService.getDevicesByHostnames({
285
+ projectId: PROJECT_ID,
286
+ hostnames: ["10.0.0.5"],
287
+ select: { _id: true, monitoringMethod: true },
288
+ props: ROOT_PROPS,
289
+ });
290
+
291
+ expect(findByArgs(0)["select"]).toEqual({
292
+ _id: true,
293
+ monitoringMethod: true,
294
+ hostname: true,
295
+ });
296
+ });
297
+
298
+ it("a caller that selects nothing still gets the hostname", async () => {
299
+ await NetworkDeviceService.getDevicesByHostnames({
300
+ projectId: PROJECT_ID,
301
+ hostnames: ["10.0.0.5"],
302
+ select: {},
303
+ props: ROOT_PROPS,
304
+ });
305
+
306
+ expect(findByArgs(0)["select"]).toEqual({ hostname: true });
307
+ });
308
+
309
+ /*
310
+ * The returned Map is keyed by hostname, so a caller that opted the column
311
+ * out would get a map of nothing. The column is forced on, not trusted.
312
+ */
313
+ it("a caller that opts the hostname out is overruled", async () => {
314
+ await NetworkDeviceService.getDevicesByHostnames({
315
+ projectId: PROJECT_ID,
316
+ hostnames: ["10.0.0.5"],
317
+ select: { hostname: false },
318
+ props: ROOT_PROPS,
319
+ });
320
+
321
+ expect((findByArgs(0)["select"] as JSONObject)["hostname"]).toBe(true);
322
+ });
323
+
324
+ it("hands the caller's props through to every read", async () => {
325
+ const props: DatabaseCommonInteractionProps = { isRoot: true };
326
+
327
+ await NetworkDeviceService.getDevicesByHostnames({
328
+ projectId: PROJECT_ID,
329
+ hostnames: addresses(CHUNK_SIZE + 1),
330
+ select: { _id: true },
331
+ props: props,
332
+ });
333
+
334
+ expect(findByArgs(0)["props"]).toBe(props);
335
+ expect(findByArgs(1)["props"]).toBe(props);
336
+ });
337
+ });
338
+
339
+ describe("NetworkDeviceService.getDevicesByHostnames — chunking", () => {
340
+ /*
341
+ * The whole list is rendered into the statement text as a literal
342
+ * `IN (...)`, and a sweep may cover tens of thousands of addresses
343
+ * (ScanTargetUtil.MAX_SCAN_HOSTS). One IN list that long costs more to
344
+ * parse and plan than the lookups it saves.
345
+ */
346
+ it("asks the database nothing when there is nothing to ask about", async () => {
347
+ const found: Map<string, NetworkDevice> =
348
+ await NetworkDeviceService.getDevicesByHostnames({
349
+ projectId: PROJECT_ID,
350
+ hostnames: [],
351
+ select: { _id: true },
352
+ props: ROOT_PROPS,
353
+ });
354
+
355
+ expect(findBySpy).not.toHaveBeenCalled();
356
+ expect(found.size).toBe(0);
357
+ });
358
+
359
+ it("a list of only blank addresses asks the database nothing", async () => {
360
+ const found: Map<string, NetworkDevice> =
361
+ await NetworkDeviceService.getDevicesByHostnames({
362
+ projectId: PROJECT_ID,
363
+ hostnames: ["", "", ""],
364
+ select: { _id: true },
365
+ props: ROOT_PROPS,
366
+ });
367
+
368
+ expect(findBySpy).not.toHaveBeenCalled();
369
+ expect(found.size).toBe(0);
370
+ });
371
+
372
+ it("one address below the bound is one read", async () => {
373
+ await NetworkDeviceService.getDevicesByHostnames({
374
+ projectId: PROJECT_ID,
375
+ hostnames: addresses(CHUNK_SIZE - 1),
376
+ select: { _id: true },
377
+ props: ROOT_PROPS,
378
+ });
379
+
380
+ expect(chunkSizes()).toEqual([CHUNK_SIZE - 1]);
381
+ });
382
+
383
+ it("exactly the bound is still one read", async () => {
384
+ await NetworkDeviceService.getDevicesByHostnames({
385
+ projectId: PROJECT_ID,
386
+ hostnames: addresses(CHUNK_SIZE),
387
+ select: { _id: true },
388
+ props: ROOT_PROPS,
389
+ });
390
+
391
+ expect(chunkSizes()).toEqual([CHUNK_SIZE]);
392
+ });
393
+
394
+ it("one over the bound splits into a full chunk and a remainder", async () => {
395
+ await NetworkDeviceService.getDevicesByHostnames({
396
+ projectId: PROJECT_ID,
397
+ hostnames: addresses(CHUNK_SIZE + 1),
398
+ select: { _id: true },
399
+ props: ROOT_PROPS,
400
+ });
401
+
402
+ expect(chunkSizes()).toEqual([CHUNK_SIZE, 1]);
403
+ });
404
+
405
+ it("two full chunks are two reads, not three", async () => {
406
+ await NetworkDeviceService.getDevicesByHostnames({
407
+ projectId: PROJECT_ID,
408
+ hostnames: addresses(CHUNK_SIZE * 2),
409
+ select: { _id: true },
410
+ props: ROOT_PROPS,
411
+ });
412
+
413
+ expect(chunkSizes()).toEqual([CHUNK_SIZE, CHUNK_SIZE]);
414
+ });
415
+
416
+ it("one over two full chunks adds a one-address read", async () => {
417
+ await NetworkDeviceService.getDevicesByHostnames({
418
+ projectId: PROJECT_ID,
419
+ hostnames: addresses(CHUNK_SIZE * 2 + 1),
420
+ select: { _id: true },
421
+ props: ROOT_PROPS,
422
+ });
423
+
424
+ expect(chunkSizes()).toEqual([CHUNK_SIZE, CHUNK_SIZE, 1]);
425
+ });
426
+
427
+ /*
428
+ * The scale that motivated the change: a /18 sweep. Twenty indexed reads,
429
+ * not one statement with a 10,000-item IN list and not 10,000 statements.
430
+ */
431
+ it("a 10,000-address sweep costs twenty reads", async () => {
432
+ const wanted: Array<string> = addresses(10000);
433
+
434
+ await NetworkDeviceService.getDevicesByHostnames({
435
+ projectId: PROJECT_ID,
436
+ hostnames: wanted,
437
+ select: { _id: true },
438
+ props: ROOT_PROPS,
439
+ });
440
+
441
+ expect(findBySpy).toHaveBeenCalledTimes(20);
442
+
443
+ for (const size of chunkSizes()) {
444
+ expect(size).toBeLessThanOrEqual(CHUNK_SIZE);
445
+ }
446
+ });
447
+
448
+ /*
449
+ * A partition, not a sample and not an overlap: every address asked about
450
+ * exactly once, in input order. This is the property the old OFFSET paging
451
+ * could not hold, and losing it is what created duplicate devices.
452
+ */
453
+ it("the chunks partition the input exactly — nothing asked twice, nothing dropped", async () => {
454
+ const wanted: Array<string> = addresses(CHUNK_SIZE * 2 + 137);
455
+
456
+ await NetworkDeviceService.getDevicesByHostnames({
457
+ projectId: PROJECT_ID,
458
+ hostnames: wanted,
459
+ select: { _id: true },
460
+ props: ROOT_PROPS,
461
+ });
462
+
463
+ const asked: Array<string> = askedAbout();
464
+
465
+ expect(asked).toEqual(wanted);
466
+ expect(new Set<string>(asked).size).toBe(wanted.length);
467
+ });
468
+
469
+ it("the same question chunks the same way every time", async () => {
470
+ const wanted: Array<string> = addresses(CHUNK_SIZE + 7);
471
+
472
+ await NetworkDeviceService.getDevicesByHostnames({
473
+ projectId: PROJECT_ID,
474
+ hostnames: wanted,
475
+ select: { _id: true },
476
+ props: ROOT_PROPS,
477
+ });
478
+
479
+ const first: Array<Array<string>> = [
480
+ askedAboutInCall(0),
481
+ askedAboutInCall(1),
482
+ ];
483
+
484
+ findBySpy.mockClear();
485
+
486
+ await NetworkDeviceService.getDevicesByHostnames({
487
+ projectId: PROJECT_ID,
488
+ hostnames: wanted,
489
+ select: { _id: true },
490
+ props: ROOT_PROPS,
491
+ });
492
+
493
+ expect([askedAboutInCall(0), askedAboutInCall(1)]).toEqual(first);
494
+ });
495
+ });
496
+
497
+ describe("NetworkDeviceService.getDevicesByHostnames — the addresses it asks about", () => {
498
+ it("asks about a repeated address once", async () => {
499
+ await NetworkDeviceService.getDevicesByHostnames({
500
+ projectId: PROJECT_ID,
501
+ hostnames: ["10.0.0.5", "10.0.0.6", "10.0.0.5", "10.0.0.6"],
502
+ select: { _id: true },
503
+ props: ROOT_PROPS,
504
+ });
505
+
506
+ expect(findBySpy).toHaveBeenCalledTimes(1);
507
+ expect(askedAboutInCall(0)).toEqual(["10.0.0.5", "10.0.0.6"]);
508
+ });
509
+
510
+ /*
511
+ * Deduplication happens BEFORE chunking, so a noisy sweep that reports the
512
+ * same handful of addresses hundreds of times still costs one read — not
513
+ * one read per 500 repetitions.
514
+ */
515
+ it("600 repetitions of two addresses is one read, not two", async () => {
516
+ const noisy: Array<string> = [];
517
+
518
+ for (let index: number = 0; index < 300; index++) {
519
+ noisy.push("10.0.0.5", "10.0.0.6");
520
+ }
521
+
522
+ await NetworkDeviceService.getDevicesByHostnames({
523
+ projectId: PROJECT_ID,
524
+ hostnames: noisy,
525
+ select: { _id: true },
526
+ props: ROOT_PROPS,
527
+ });
528
+
529
+ expect(findBySpy).toHaveBeenCalledTimes(1);
530
+ expect(askedAboutInCall(0)).toEqual(["10.0.0.5", "10.0.0.6"]);
531
+ });
532
+
533
+ it("501 entries with only 500 distinct addresses fit in one read", async () => {
534
+ const wanted: Array<string> = addresses(CHUNK_SIZE);
535
+
536
+ await NetworkDeviceService.getDevicesByHostnames({
537
+ projectId: PROJECT_ID,
538
+ hostnames: [...wanted, wanted[0]!],
539
+ select: { _id: true },
540
+ props: ROOT_PROPS,
541
+ });
542
+
543
+ expect(chunkSizes()).toEqual([CHUNK_SIZE]);
544
+ });
545
+
546
+ it("keeps first-seen order when it drops duplicates", async () => {
547
+ await NetworkDeviceService.getDevicesByHostnames({
548
+ projectId: PROJECT_ID,
549
+ hostnames: ["10.0.0.9", "10.0.0.5", "10.0.0.9", "10.0.0.7"],
550
+ select: { _id: true },
551
+ props: ROOT_PROPS,
552
+ });
553
+
554
+ expect(askedAboutInCall(0)).toEqual(["10.0.0.9", "10.0.0.5", "10.0.0.7"]);
555
+ });
556
+
557
+ /*
558
+ * The API's caller maps a discovered host with no ipAddress to the empty
559
+ * string. Asking the database `hostname IN ('')` would be a wasted lookup,
560
+ * and a device row that somehow carried an empty hostname would come back
561
+ * and flag that host as already registered.
562
+ */
563
+ it("drops blank addresses before it asks", async () => {
564
+ await NetworkDeviceService.getDevicesByHostnames({
565
+ projectId: PROJECT_ID,
566
+ hostnames: ["10.0.0.5", "", "10.0.0.6", ""],
567
+ select: { _id: true },
568
+ props: ROOT_PROPS,
569
+ });
570
+
571
+ expect(askedAboutInCall(0)).toEqual(["10.0.0.5", "10.0.0.6"]);
572
+ });
573
+
574
+ /*
575
+ * `Boolean("0")` is true. A hostname of "0" is a strange address but a real
576
+ * value, and dropping it would report a registered device as importable.
577
+ */
578
+ it('the string "0" is a real address, not a blank one', async () => {
579
+ await NetworkDeviceService.getDevicesByHostnames({
580
+ projectId: PROJECT_ID,
581
+ hostnames: ["0", "", "10.0.0.5"],
582
+ select: { _id: true },
583
+ props: ROOT_PROPS,
584
+ });
585
+
586
+ expect(askedAboutInCall(0)).toEqual(["0", "10.0.0.5"]);
587
+ });
588
+
589
+ /*
590
+ * Dedup runs before chunking, so what decides the number of reads is the
591
+ * DISTINCT count crossing the bound — not the entry count.
592
+ */
593
+ it("1,000 entries covering 501 distinct addresses is two reads", async () => {
594
+ const distinct: Array<string> = addresses(CHUNK_SIZE + 1);
595
+ const noisy: Array<string> = [...distinct];
596
+
597
+ while (noisy.length < 1000) {
598
+ noisy.push(distinct[noisy.length % distinct.length]!);
599
+ }
600
+
601
+ await NetworkDeviceService.getDevicesByHostnames({
602
+ projectId: PROJECT_ID,
603
+ hostnames: noisy,
604
+ select: { _id: true },
605
+ props: ROOT_PROPS,
606
+ });
607
+
608
+ expect(chunkSizes()).toEqual([CHUNK_SIZE, 1]);
609
+ });
610
+
611
+ it("a list that is 500 real addresses plus blanks is still one read", async () => {
612
+ const wanted: Array<string> = addresses(CHUNK_SIZE);
613
+
614
+ await NetworkDeviceService.getDevicesByHostnames({
615
+ projectId: PROJECT_ID,
616
+ hostnames: [...wanted, "", "", ""],
617
+ select: { _id: true },
618
+ props: ROOT_PROPS,
619
+ });
620
+
621
+ expect(chunkSizes()).toEqual([CHUNK_SIZE]);
622
+ });
623
+ });
624
+
625
+ describe("NetworkDeviceService.getDevicesByHostnames — the map it returns", () => {
626
+ it("keys each device it found by its address", async () => {
627
+ const five: NetworkDevice = deviceAt("10.0.0.5");
628
+ const six: NetworkDevice = deviceAt("10.0.0.6");
629
+ findBySpy.mockResolvedValue([five, six]);
630
+
631
+ const found: Map<string, NetworkDevice> =
632
+ await NetworkDeviceService.getDevicesByHostnames({
633
+ projectId: PROJECT_ID,
634
+ hostnames: ["10.0.0.5", "10.0.0.6"],
635
+ select: { _id: true },
636
+ props: ROOT_PROPS,
637
+ });
638
+
639
+ expect(found.size).toBe(2);
640
+ expect(found.get("10.0.0.5")).toBe(five);
641
+ expect(found.get("10.0.0.6")).toBe(six);
642
+ });
643
+
644
+ it("an address with no device is simply absent", async () => {
645
+ findBySpy.mockResolvedValue([deviceAt("10.0.0.5")]);
646
+
647
+ const found: Map<string, NetworkDevice> =
648
+ await NetworkDeviceService.getDevicesByHostnames({
649
+ projectId: PROJECT_ID,
650
+ hostnames: ["10.0.0.5", "10.0.0.6"],
651
+ select: { _id: true },
652
+ props: ROOT_PROPS,
653
+ });
654
+
655
+ expect(found.has("10.0.0.5")).toBe(true);
656
+ expect(found.has("10.0.0.6")).toBe(false);
657
+ });
658
+
659
+ /*
660
+ * A row with no hostname cannot answer "is this address registered", and
661
+ * keying it under "" would make the empty string look registered to any
662
+ * caller that asked about a host with no address.
663
+ */
664
+ it("a row with no hostname is skipped, not keyed under the empty string", async () => {
665
+ findBySpy.mockResolvedValue([deviceAt("10.0.0.5"), deviceWithNoHostname()]);
666
+
667
+ const found: Map<string, NetworkDevice> =
668
+ await NetworkDeviceService.getDevicesByHostnames({
669
+ projectId: PROJECT_ID,
670
+ hostnames: ["10.0.0.5"],
671
+ select: { _id: true },
672
+ props: ROOT_PROPS,
673
+ });
674
+
675
+ expect(found.size).toBe(1);
676
+ expect(found.has("")).toBe(false);
677
+ });
678
+
679
+ it("merges the rows from every chunk into one map", async () => {
680
+ findBySpy
681
+ .mockResolvedValueOnce([deviceAt("10.99.0.0")])
682
+ .mockResolvedValueOnce([deviceAt("10.99.1.244")]);
683
+
684
+ const found: Map<string, NetworkDevice> =
685
+ await NetworkDeviceService.getDevicesByHostnames({
686
+ projectId: PROJECT_ID,
687
+ hostnames: addresses(CHUNK_SIZE + 1),
688
+ select: { _id: true },
689
+ props: ROOT_PROPS,
690
+ });
691
+
692
+ expect(findBySpy).toHaveBeenCalledTimes(2);
693
+ expect(found.size).toBe(2);
694
+ expect(found.has("10.99.0.0")).toBe(true);
695
+ // Only reachable via the SECOND chunk — the case a lost page used to drop.
696
+ expect(found.has("10.99.1.244")).toBe(true);
697
+ });
698
+
699
+ it("returns an empty map when the project has none of these addresses", async () => {
700
+ findBySpy.mockResolvedValue([]);
701
+
702
+ const found: Map<string, NetworkDevice> =
703
+ await NetworkDeviceService.getDevicesByHostnames({
704
+ projectId: PROJECT_ID,
705
+ hostnames: ["10.0.0.5", "10.0.0.6"],
706
+ select: { _id: true },
707
+ props: ROOT_PROPS,
708
+ });
709
+
710
+ expect(found.size).toBe(0);
711
+ });
712
+
713
+ /*
714
+ * A row keyed by the address it carries, not by the address that was asked
715
+ * for. The two are the same for every query this issues; stated here so
716
+ * that a change to the predicate has to face the question deliberately.
717
+ */
718
+ it("keys a row by the address the row itself carries", async () => {
719
+ findBySpy.mockResolvedValue([deviceAt("10.0.0.99")]);
720
+
721
+ const found: Map<string, NetworkDevice> =
722
+ await NetworkDeviceService.getDevicesByHostnames({
723
+ projectId: PROJECT_ID,
724
+ hostnames: ["10.0.0.5"],
725
+ select: { _id: true },
726
+ props: ROOT_PROPS,
727
+ });
728
+
729
+ expect(Array.from(found.keys())).toEqual(["10.0.0.99"]);
730
+ });
731
+
732
+ /*
733
+ * Two devices at one address is a broken inventory, not something this
734
+ * lookup can resolve. It answers with one of them — the last seen — rather
735
+ * than dropping the address, because "registered" is still the truth.
736
+ */
737
+ it("two rows sharing an address collapse to the last one seen", async () => {
738
+ const first: NetworkDevice = deviceAt("10.0.0.5");
739
+ const second: NetworkDevice = deviceAt("10.0.0.5");
740
+ findBySpy.mockResolvedValue([first, second]);
741
+
742
+ const found: Map<string, NetworkDevice> =
743
+ await NetworkDeviceService.getDevicesByHostnames({
744
+ projectId: PROJECT_ID,
745
+ hostnames: ["10.0.0.5"],
746
+ select: { _id: true },
747
+ props: ROOT_PROPS,
748
+ });
749
+
750
+ expect(found.size).toBe(1);
751
+ expect(found.get("10.0.0.5")).toBe(second);
752
+ });
753
+
754
+ it("a read that fails rejects rather than answering 'none of them'", async () => {
755
+ const boom: Error = new Error("db down");
756
+ findBySpy.mockRejectedValue(boom);
757
+
758
+ await expect(
759
+ NetworkDeviceService.getDevicesByHostnames({
760
+ projectId: PROJECT_ID,
761
+ hostnames: ["10.0.0.5"],
762
+ select: { _id: true },
763
+ props: ROOT_PROPS,
764
+ }),
765
+ ).rejects.toThrow("db down");
766
+ });
767
+
768
+ /*
769
+ * A chunk that fails stops the whole lookup. Carrying on would return a
770
+ * partial answer indistinguishable from a complete one — and every address
771
+ * in the chunks it skipped would read as unregistered.
772
+ */
773
+ it("a failure on a later chunk rejects and stops asking", async () => {
774
+ findBySpy
775
+ .mockResolvedValueOnce([])
776
+ .mockRejectedValueOnce(new Error("db down"));
777
+
778
+ await expect(
779
+ NetworkDeviceService.getDevicesByHostnames({
780
+ projectId: PROJECT_ID,
781
+ hostnames: addresses(CHUNK_SIZE * 3),
782
+ select: { _id: true },
783
+ props: ROOT_PROPS,
784
+ }),
785
+ ).rejects.toThrow("db down");
786
+
787
+ // The third chunk is never asked about.
788
+ expect(findBySpy).toHaveBeenCalledTimes(2);
789
+ });
790
+ });
791
+
792
+ describe("NetworkDeviceService.getRegisteredHostnames", () => {
793
+ it("answers with the addresses that already have a device", async () => {
794
+ findBySpy.mockResolvedValue([deviceAt("10.0.0.5")]);
795
+
796
+ const registered: Set<string> =
797
+ await NetworkDeviceService.getRegisteredHostnames({
798
+ projectId: PROJECT_ID,
799
+ hostnames: ["10.0.0.5", "10.0.0.6"],
800
+ props: ROOT_PROPS,
801
+ });
802
+
803
+ expect(registered.has("10.0.0.5")).toBe(true);
804
+ expect(registered.has("10.0.0.6")).toBe(false);
805
+ });
806
+
807
+ /*
808
+ * A Set, so the caller's per-host `has` is a hash lookup. The endpoint runs
809
+ * this over every host a sweep found.
810
+ */
811
+ it("answers with a Set", async () => {
812
+ findBySpy.mockResolvedValue([deviceAt("10.0.0.5")]);
813
+
814
+ const registered: Set<string> =
815
+ await NetworkDeviceService.getRegisteredHostnames({
816
+ projectId: PROJECT_ID,
817
+ hostnames: ["10.0.0.5"],
818
+ props: ROOT_PROPS,
819
+ });
820
+
821
+ expect(registered).toBeInstanceOf(Set);
822
+ expect(registered.size).toBe(1);
823
+ });
824
+
825
+ // Existence is the whole question, so hostname is the only column read.
826
+ it("reads only the column it answers with", async () => {
827
+ await NetworkDeviceService.getRegisteredHostnames({
828
+ projectId: PROJECT_ID,
829
+ hostnames: ["10.0.0.5"],
830
+ props: ROOT_PROPS,
831
+ });
832
+
833
+ expect(findByArgs(0)["select"]).toEqual({ hostname: true });
834
+ });
835
+
836
+ it("chunks the same way its row-returning sibling does", async () => {
837
+ await NetworkDeviceService.getRegisteredHostnames({
838
+ projectId: PROJECT_ID,
839
+ hostnames: addresses(CHUNK_SIZE + 1),
840
+ props: ROOT_PROPS,
841
+ });
842
+
843
+ expect(chunkSizes()).toEqual([CHUNK_SIZE, 1]);
844
+ });
845
+
846
+ it("scopes the question to the project it was given", async () => {
847
+ await NetworkDeviceService.getRegisteredHostnames({
848
+ projectId: OTHER_PROJECT_ID,
849
+ hostnames: ["10.0.0.5"],
850
+ props: ROOT_PROPS,
851
+ });
852
+
853
+ expect((queryOf(0)["projectId"] as ObjectID).toString()).toBe(
854
+ OTHER_PROJECT_ID.toString(),
855
+ );
856
+ });
857
+
858
+ it("an empty sweep asks nothing and answers with an empty set", async () => {
859
+ const registered: Set<string> =
860
+ await NetworkDeviceService.getRegisteredHostnames({
861
+ projectId: PROJECT_ID,
862
+ hostnames: [],
863
+ props: ROOT_PROPS,
864
+ });
865
+
866
+ expect(findBySpy).not.toHaveBeenCalled();
867
+ expect(registered.size).toBe(0);
868
+ });
869
+
870
+ // The two methods are one query with two shapes of answer.
871
+ it("answers with exactly the keys of the map its sibling returns", async () => {
872
+ findBySpy.mockResolvedValue([deviceAt("10.0.0.5"), deviceAt("10.0.0.7")]);
873
+
874
+ const asked: Array<string> = ["10.0.0.5", "10.0.0.6", "10.0.0.7"];
875
+
876
+ const found: Map<string, NetworkDevice> =
877
+ await NetworkDeviceService.getDevicesByHostnames({
878
+ projectId: PROJECT_ID,
879
+ hostnames: asked,
880
+ select: { _id: true },
881
+ props: ROOT_PROPS,
882
+ });
883
+
884
+ const registered: Set<string> =
885
+ await NetworkDeviceService.getRegisteredHostnames({
886
+ projectId: PROJECT_ID,
887
+ hostnames: asked,
888
+ props: ROOT_PROPS,
889
+ });
890
+
891
+ expect(Array.from(registered).sort()).toEqual(
892
+ Array.from(found.keys()).sort(),
893
+ );
894
+ });
895
+
896
+ it("collects the answer across every chunk", async () => {
897
+ findBySpy
898
+ .mockResolvedValueOnce([deviceAt("10.99.0.0")])
899
+ .mockResolvedValueOnce([deviceAt("10.99.1.244")]);
900
+
901
+ const registered: Set<string> =
902
+ await NetworkDeviceService.getRegisteredHostnames({
903
+ projectId: PROJECT_ID,
904
+ hostnames: addresses(CHUNK_SIZE + 1),
905
+ props: ROOT_PROPS,
906
+ });
907
+
908
+ expect(Array.from(registered).sort()).toEqual(["10.99.0.0", "10.99.1.244"]);
909
+ });
910
+
911
+ /*
912
+ * Swallowing the failure and answering "none of these are registered" would
913
+ * present every host in the sweep as importable, and the reviewer's import
914
+ * would then duplicate the whole estate. Failing loudly is the safe answer.
915
+ */
916
+ it("a read that fails rejects rather than reporting every host as new", async () => {
917
+ findBySpy.mockRejectedValue(new Error("db down"));
918
+
919
+ await expect(
920
+ NetworkDeviceService.getRegisteredHostnames({
921
+ projectId: PROJECT_ID,
922
+ hostnames: ["10.0.0.5"],
923
+ props: ROOT_PROPS,
924
+ }),
925
+ ).rejects.toThrow("db down");
926
+ });
927
+ });
928
+
929
+ /*
930
+ * The specific failure mode the old implementation had, asserted directly.
931
+ *
932
+ * The walk kept paging while a page came back full — `if (existing.length <
933
+ * LIMIT_MAX) break;` — so the number of statements it issued was a function
934
+ * of how many devices the PROJECT had. This lookup's cost must depend only on
935
+ * how many addresses the SWEEP found; a full page is just a full page.
936
+ */
937
+ describe("NetworkDeviceService hostname lookups — the walk they replaced", () => {
938
+ function fullPage(): Array<NetworkDevice> {
939
+ const page: Array<NetworkDevice> = [];
940
+
941
+ for (let index: number = 0; index < LIMIT_MAX; index++) {
942
+ page.push(deviceAt(`10.42.${Math.floor(index / 256)}.${index % 256}`));
943
+ }
944
+
945
+ return page;
946
+ }
947
+
948
+ it("a full page of results never triggers a follow-up page", async () => {
949
+ findBySpy.mockResolvedValue(fullPage());
950
+
951
+ await NetworkDeviceService.getRegisteredHostnames({
952
+ projectId: PROJECT_ID,
953
+ hostnames: ["10.0.0.5", "10.0.0.6"],
954
+ props: ROOT_PROPS,
955
+ });
956
+
957
+ expect(findBySpy).toHaveBeenCalledTimes(1);
958
+ });
959
+
960
+ it("the number of reads is set by the sweep, not by the size of the fleet", async () => {
961
+ findBySpy.mockResolvedValue(fullPage());
962
+
963
+ await NetworkDeviceService.getRegisteredHostnames({
964
+ projectId: PROJECT_ID,
965
+ hostnames: addresses(CHUNK_SIZE + 1),
966
+ props: ROOT_PROPS,
967
+ });
968
+
969
+ // Two chunks of addresses — two reads, regardless of what came back.
970
+ expect(findBySpy).toHaveBeenCalledTimes(2);
971
+ });
972
+
973
+ it("no read is ever ordered by createdAt", async () => {
974
+ await NetworkDeviceService.getRegisteredHostnames({
975
+ projectId: PROJECT_ID,
976
+ hostnames: addresses(CHUNK_SIZE * 3),
977
+ props: ROOT_PROPS,
978
+ });
979
+
980
+ expect(findBySpy).toHaveBeenCalledTimes(3);
981
+
982
+ for (let index: number = 0; index < 3; index++) {
983
+ const sort: JSONObject = findByArgs(index)["sort"] as JSONObject;
984
+ expect(sort["createdAt"]).toBe(undefined);
985
+ }
986
+ });
987
+
988
+ it("no read ever offsets into a result set", async () => {
989
+ await NetworkDeviceService.getRegisteredHostnames({
990
+ projectId: PROJECT_ID,
991
+ hostnames: addresses(CHUNK_SIZE * 3),
992
+ props: ROOT_PROPS,
993
+ });
994
+
995
+ for (let index: number = 0; index < 3; index++) {
996
+ expect(findByArgs(index)["skip"]).toBe(0);
997
+ }
998
+ });
999
+
1000
+ /*
1001
+ * The end-to-end shape of the bug: a project whose devices all share one
1002
+ * createdAt. Here that is simply irrelevant — the answer is decided by the
1003
+ * address predicate, so an address that exists is found on the first and
1004
+ * only read that asks about it.
1005
+ */
1006
+ it("finds an address that a same-createdAt fleet used to hide", async () => {
1007
+ const wanted: Array<string> = addresses(CHUNK_SIZE + 1);
1008
+ const lastAddress: string = wanted[wanted.length - 1]!;
1009
+
1010
+ findBySpy
1011
+ .mockResolvedValueOnce(fullPage())
1012
+ .mockResolvedValueOnce([deviceAt(lastAddress)]);
1013
+
1014
+ const registered: Set<string> =
1015
+ await NetworkDeviceService.getRegisteredHostnames({
1016
+ projectId: PROJECT_ID,
1017
+ hostnames: wanted,
1018
+ props: ROOT_PROPS,
1019
+ });
1020
+
1021
+ expect(registered.has(lastAddress)).toBe(true);
1022
+ });
1023
+ });