@oneuptime/common 13.0.4 → 13.0.5

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 (673) hide show
  1. package/Models/DatabaseModels/Index.ts +4 -0
  2. package/Models/DatabaseModels/RumApplication.ts +1 -1
  3. package/Models/DatabaseModels/SecurityEventConnection.ts +457 -0
  4. package/Models/DatabaseModels/SecurityEventConnectionRun.ts +263 -0
  5. package/Models/DatabaseModels/TelemetryIngestionKey.ts +2 -2
  6. package/Server/API/AIInvestigationAPI.ts +484 -24
  7. package/Server/API/GoogleSecOpsConnectionAPI.ts +249 -8
  8. package/Server/API/SecurityEventConnectionAPI.ts +250 -0
  9. package/Server/API/TelemetryAPI.ts +402 -265
  10. package/Server/Infrastructure/Postgres/SchemaMigrations/1792700000000-AddSecurityEventConnections.ts +99 -0
  11. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +2 -0
  12. package/Server/Middleware/TelemetryIngest.ts +101 -6
  13. package/Server/Services/ExceptionAggregationService.ts +7 -16
  14. package/Server/Services/GoogleSecOpsConnectionService.ts +15 -0
  15. package/Server/Services/Index.ts +4 -0
  16. package/Server/Services/InventoryItemService.ts +28 -0
  17. package/Server/Services/LogAggregationService.ts +17 -23
  18. package/Server/Services/MetricAggregationService.ts +4 -14
  19. package/Server/Services/SecurityEventConnectionRunService.ts +10 -0
  20. package/Server/Services/SecurityEventConnectionService.ts +538 -0
  21. package/Server/Services/TraceAggregationService.ts +77 -28
  22. package/Server/Types/AnalyticsDatabase/ModelPermission.ts +9 -0
  23. package/Server/Utils/AI/Chat/ObservabilityAssistant.ts +13 -1
  24. package/Server/Utils/AI/SRE/AIInvestigationEngine.ts +15 -1
  25. package/Server/Utils/AI/SRE/InvestigationEvidence.ts +658 -0
  26. package/Server/Utils/AI/SRE/InvestigationReferences.ts +324 -0
  27. package/Server/Utils/AI/Toolbox/Index.ts +38 -0
  28. package/Server/Utils/AI/Toolbox/TimelineTools.ts +9 -2
  29. package/Server/Utils/AnalyticsDatabase/StatementGenerator.ts +80 -0
  30. package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +5 -3
  31. package/Server/Utils/SecurityEvent/Connectors/AwsSecurityHub/AwsSecurityHubClient.ts +1108 -0
  32. package/Server/Utils/SecurityEvent/Connectors/AwsSecurityHub/AwsSecurityHubConnector.ts +732 -0
  33. package/Server/Utils/SecurityEvent/Connectors/ConnectorPlatformHealth.ts +495 -0
  34. package/Server/Utils/SecurityEvent/Connectors/CrowdStrikeFalcon/CrowdStrikeFalconClient.ts +689 -0
  35. package/Server/Utils/SecurityEvent/Connectors/CrowdStrikeFalcon/CrowdStrikeFalconConnector.ts +767 -0
  36. package/Server/Utils/SecurityEvent/Connectors/ElasticSecurity/ElasticSecurityClient.ts +571 -0
  37. package/Server/Utils/SecurityEvent/Connectors/ElasticSecurity/ElasticSecurityConnector.ts +827 -0
  38. package/Server/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdr/MicrosoftDefenderXdrClient.ts +610 -0
  39. package/Server/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdr/MicrosoftDefenderXdrConnector.ts +549 -0
  40. package/Server/Utils/SecurityEvent/Connectors/MicrosoftSentinel/MicrosoftSentinelClient.ts +830 -0
  41. package/Server/Utils/SecurityEvent/Connectors/MicrosoftSentinel/MicrosoftSentinelConnector.ts +684 -0
  42. package/Server/Utils/SecurityEvent/Connectors/Okta/OktaClient.ts +487 -0
  43. package/Server/Utils/SecurityEvent/Connectors/Okta/OktaConnector.ts +778 -0
  44. package/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionPoller.ts +1002 -0
  45. package/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionRunExecutor.ts +556 -0
  46. package/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionTester.ts +275 -0
  47. package/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectorRegistry.ts +53 -0
  48. package/Server/Utils/SecurityEvent/Connectors/Splunk/SplunkClient.ts +709 -0
  49. package/Server/Utils/SecurityEvent/Connectors/Splunk/SplunkConnector.ts +596 -0
  50. package/Server/Utils/SecurityEvent/Connectors/Types.ts +191 -0
  51. package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient.ts +353 -65
  52. package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsConnectionTester.ts +777 -0
  53. package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.ts +747 -148
  54. package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.ts +48 -2
  55. package/Server/Utils/SecurityEvent/SecurityEventDedupe.ts +81 -0
  56. package/Server/Utils/SessionReplay/SessionReplayReadService.ts +741 -40
  57. package/Server/Utils/StartServer.ts +10 -0
  58. package/Server/Utils/Telemetry/EntityRegistry.ts +8 -0
  59. package/Server/Utils/Telemetry/KubernetesResourceAttributes.ts +108 -0
  60. package/Server/Utils/Telemetry/ResourceEntityFilter.ts +174 -93
  61. package/Server/Utils/Telemetry/ResourceFacetPlanner.ts +251 -0
  62. package/Server/Utils/Telemetry/ResourceFacetResolver.ts +248 -413
  63. package/Server/Utils/Telemetry/ServiceDependencyDiscovery.ts +668 -0
  64. package/Server/Utils/Telemetry/TraceContextPropagation.ts +348 -0
  65. package/Server/Utils/Telemetry.ts +18 -0
  66. package/Tests/App/Dashboard/AIInvestigationHeaderStatus.test.tsx +413 -0
  67. package/Tests/App/Dashboard/AIRootCauseFeedItem.test.tsx +285 -0
  68. package/Tests/App/Dashboard/AffectedResourcesDisplay.test.tsx +242 -0
  69. package/Tests/App/Dashboard/AlertEpisodeViewFields.test.tsx +601 -15
  70. package/Tests/App/Dashboard/ChangeAlertStateAIHeader.test.tsx +835 -0
  71. package/Tests/App/Dashboard/CloudResourceTelemetryScope.test.ts +41 -0
  72. package/Tests/App/Dashboard/ConnectionTestModal.test.tsx +604 -0
  73. package/Tests/App/Dashboard/ConnectorTestReportView.test.tsx +738 -0
  74. package/Tests/App/Dashboard/DashboardLazyPages.test.tsx +153 -6
  75. package/Tests/App/Dashboard/EntityDetailPanel.test.tsx +165 -0
  76. package/Tests/App/Dashboard/EpisodeChangeState.test.tsx +1069 -0
  77. package/Tests/App/Dashboard/EpisodeMembersCard.test.tsx +772 -0
  78. package/Tests/App/Dashboard/EventOverviewPages.test.tsx +2354 -0
  79. package/Tests/App/Dashboard/EventOverviewSkeleton.test.tsx +210 -0
  80. package/Tests/App/Dashboard/EventStatBar.test.tsx +392 -0
  81. package/Tests/App/Dashboard/EventStatusPanel.test.tsx +247 -0
  82. package/Tests/App/Dashboard/ExceptionAIAssistance.test.tsx +606 -0
  83. package/Tests/App/Dashboard/ExceptionBreadcrumbTimeline.test.tsx +273 -0
  84. package/Tests/App/Dashboard/ExceptionDetailSideMenu.test.tsx +176 -0
  85. package/Tests/App/Dashboard/ExceptionOverviewCards.test.tsx +366 -0
  86. package/Tests/App/Dashboard/ExceptionSignalPages.test.tsx +371 -0
  87. package/Tests/App/Dashboard/ExceptionStackFrameViewer.test.tsx +440 -0
  88. package/Tests/App/Dashboard/ExceptionSummary.test.tsx +381 -0
  89. package/Tests/App/Dashboard/ExceptionTriage.test.tsx +306 -0
  90. package/Tests/App/Dashboard/ExceptionsResourceFacets.test.tsx +604 -0
  91. package/Tests/App/Dashboard/ExceptionsViewerEntityChips.test.tsx +706 -0
  92. package/Tests/App/Dashboard/FeedOrdering.test.ts +32 -0
  93. package/Tests/App/Dashboard/GoogleSecOpsConnectionForm.test.tsx +838 -0
  94. package/Tests/App/Dashboard/GoogleSecOpsConnectionsErrors.test.tsx +18 -0
  95. package/Tests/App/Dashboard/GoogleSecOpsDiagnostics.test.tsx +297 -20
  96. package/Tests/App/Dashboard/IncidentEpisodeViewFields.test.tsx +618 -13
  97. package/Tests/App/Dashboard/InfrastructureExplorer.test.tsx +254 -207
  98. package/Tests/App/Dashboard/InfrastructureGraph.test.tsx +303 -135
  99. package/Tests/App/Dashboard/InvestigationEvidenceList.test.tsx +1251 -0
  100. package/Tests/App/Dashboard/InvestigationFeedRefresh.test.tsx +303 -0
  101. package/Tests/App/Dashboard/InvestigationPanel.test.tsx +876 -8
  102. package/Tests/App/Dashboard/InvestigationPanelStatus.test.tsx +35 -0
  103. package/Tests/App/Dashboard/InvestigationReferenceLink.test.tsx +177 -0
  104. package/Tests/App/Dashboard/InvestigationReportView.test.tsx +1295 -0
  105. package/Tests/App/Dashboard/KubernetesImageReferenceView.test.tsx +114 -0
  106. package/Tests/App/Dashboard/KubernetesLogsTabChips.test.tsx +285 -0
  107. package/Tests/App/Dashboard/LogsEntityChipNames.test.tsx +316 -0
  108. package/Tests/App/Dashboard/LogsResourceFacetChips.test.tsx +361 -0
  109. package/Tests/App/Dashboard/ProfileTableEntityNames.test.tsx +432 -0
  110. package/Tests/App/Dashboard/ProfileViewEntityName.test.tsx +250 -0
  111. package/Tests/App/Dashboard/ResourceArchiveSettings.test.tsx +10 -0
  112. package/Tests/App/Dashboard/ResourceLogsTabsBareLayout.test.tsx +700 -0
  113. package/Tests/App/Dashboard/ResourcePageEntityNameProps.test.tsx +803 -0
  114. package/Tests/App/Dashboard/RumSessionReplaySideMenu.test.tsx +11 -1
  115. package/Tests/App/Dashboard/ScheduledMaintenanceChangeState.test.tsx +1026 -0
  116. package/Tests/App/Dashboard/ScheduledMaintenanceFeedRefresh.test.tsx +436 -0
  117. package/Tests/App/Dashboard/ScheduledMaintenanceOverviewPage.test.tsx +1195 -0
  118. package/Tests/App/Dashboard/SecurityEventConnectionFormModal.test.tsx +1022 -0
  119. package/Tests/App/Dashboard/SecurityEventConnectionsTable.test.tsx +905 -0
  120. package/Tests/App/Dashboard/SecurityEventsSideMenu.test.tsx +247 -0
  121. package/Tests/App/Dashboard/ServiceMapGraph.test.tsx +375 -274
  122. package/Tests/App/Dashboard/SessionReplayAuditTable.test.tsx +410 -0
  123. package/Tests/App/Dashboard/TelemetryResourceRetentionSettings.test.tsx +774 -0
  124. package/Tests/App/Dashboard/TopErrorsPanelResourceNames.test.tsx +316 -0
  125. package/Tests/App/Dashboard/TopologyDataLoading.test.tsx +30 -0
  126. package/Tests/App/Dashboard/TopologyPageNavigation.test.tsx +88 -24
  127. package/Tests/App/Dashboard/TraceExplorer.test.tsx +1590 -0
  128. package/Tests/App/Dashboard/TraceWaterfall.test.tsx +488 -0
  129. package/Tests/App/Dashboard/TracesAnalyticsSeriesLabels.test.tsx +367 -0
  130. package/Tests/App/Dashboard/TracesEntityNames.test.tsx +585 -0
  131. package/Tests/App/Dashboard/TracesResourceFacets.test.tsx +613 -0
  132. package/Tests/App/Dashboard/UseServiceNames.test.tsx +359 -0
  133. package/Tests/Models/DatabaseModels/DomainRoleTierCoverage.test.ts +7 -0
  134. package/Tests/Models/InventoryItemNaming.test.ts +132 -16
  135. package/Tests/Models/SecurityDomainAccessControl.test.ts +61 -17
  136. package/Tests/Server/API/AIInvestigationAPI.test.ts +611 -2
  137. package/Tests/Server/API/AIInvestigationEvidenceAPI.test.ts +1098 -0
  138. package/Tests/Server/API/GoogleSecOpsConnectionAPI.test.ts +409 -0
  139. package/Tests/Server/API/SecurityEventConnectionAPI.test.ts +856 -0
  140. package/Tests/Server/API/SessionReplayAPI.test.ts +528 -1
  141. package/Tests/Server/API/TelemetryFacetsAPI.test.ts +810 -0
  142. package/Tests/Server/Infrastructure/E2EClickHouseFixtureAccess.test.ts +240 -0
  143. package/Tests/Server/Middleware/TelemetryIngestBrowserKey.test.ts +229 -0
  144. package/Tests/Server/Services/InventoryItemDisplayName.test.ts +66 -0
  145. package/Tests/Server/Services/OpenTelemetryResourceRetentionMemo.test.ts +28 -1
  146. package/Tests/Server/Services/SecurityEventConnectionService.test.ts +1233 -0
  147. package/Tests/Server/Services/TelemetryIngestionKeyValidation.test.ts +53 -0
  148. package/Tests/Server/Services/TelemetryResourceFacetCounting.test.ts +218 -0
  149. package/Tests/Server/Services/TelemetryResourceFacetFilters.test.ts +155 -1
  150. package/Tests/Server/Services/TraceAggregationExceptionScope.test.ts +142 -0
  151. package/Tests/Server/Services/TraceAnalyticsResourceDisplayNames.test.ts +85 -24
  152. package/Tests/Server/Types/Database/Permissions/SecurityRoleAccess.test.ts +33 -0
  153. package/Tests/Server/Utils/AI/InvestigationEvidence.test.ts +1395 -0
  154. package/Tests/Server/Utils/AI/InvestigationReferences.test.ts +616 -0
  155. package/Tests/Server/Utils/AI/TimelineTools.test.ts +119 -0
  156. package/Tests/Server/Utils/AI/Toolbox/AIToolbox.test.ts +151 -0
  157. package/Tests/Server/Utils/AnalyticsDatabase/StatementGenerator.test.ts +65 -0
  158. package/Tests/Server/Utils/AnalyticsDatabase/StatementGeneratorExceptionScope.test.ts +224 -0
  159. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorPerSeriesFanout.test.ts +55 -2
  160. package/Tests/Server/Utils/SecurityEvent/Connectors/AwsSecurityHub/AwsSecurityHubClient.test.ts +1240 -0
  161. package/Tests/Server/Utils/SecurityEvent/Connectors/AwsSecurityHub/AwsSecurityHubConnector.test.ts +1853 -0
  162. package/Tests/Server/Utils/SecurityEvent/Connectors/ConnectorPlatformHealth.test.ts +1129 -0
  163. package/Tests/Server/Utils/SecurityEvent/Connectors/CrowdStrikeFalcon/CrowdStrikeFalconClient.test.ts +1066 -0
  164. package/Tests/Server/Utils/SecurityEvent/Connectors/CrowdStrikeFalcon/CrowdStrikeFalconConnector.test.ts +1568 -0
  165. package/Tests/Server/Utils/SecurityEvent/Connectors/ElasticSecurity/ElasticSecurityClient.test.ts +930 -0
  166. package/Tests/Server/Utils/SecurityEvent/Connectors/ElasticSecurity/ElasticSecurityConnector.test.ts +1409 -0
  167. package/Tests/Server/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdr/MicrosoftDefenderXdrClient.test.ts +763 -0
  168. package/Tests/Server/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdr/MicrosoftDefenderXdrConnector.test.ts +1296 -0
  169. package/Tests/Server/Utils/SecurityEvent/Connectors/MicrosoftSentinel/MicrosoftSentinelClient.test.ts +1102 -0
  170. package/Tests/Server/Utils/SecurityEvent/Connectors/MicrosoftSentinel/MicrosoftSentinelConnector.test.ts +1174 -0
  171. package/Tests/Server/Utils/SecurityEvent/Connectors/Okta/OktaClient.test.ts +1032 -0
  172. package/Tests/Server/Utils/SecurityEvent/Connectors/Okta/OktaConnector.test.ts +1558 -0
  173. package/Tests/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionPoller.test.ts +3041 -0
  174. package/Tests/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionRunExecutor.test.ts +1168 -0
  175. package/Tests/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionTester.test.ts +906 -0
  176. package/Tests/Server/Utils/SecurityEvent/Connectors/Splunk/SplunkClient.test.ts +1068 -0
  177. package/Tests/Server/Utils/SecurityEvent/Connectors/Splunk/SplunkConnector.test.ts +1004 -0
  178. package/Tests/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsConnectionTester.test.ts +784 -0
  179. package/Tests/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.test.ts +113 -1
  180. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsClient.test.ts +5 -1
  181. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsDiagnostics.test.ts +93 -13
  182. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsHttpIntegration.test.ts +23 -1
  183. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPoller.test.ts +25 -3
  184. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPollerFailureTaxonomy.test.ts +22 -8
  185. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPollerHardening.test.ts +82 -16
  186. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsSearchDetections.test.ts +730 -0
  187. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsThreePassPoller.test.ts +1577 -0
  188. package/Tests/Server/Utils/SessionReplay/SessionReplayOriginAllowlist.test.ts +41 -0
  189. package/Tests/Server/Utils/SessionReplay/SessionReplayReadServiceQueries.test.ts +1453 -18
  190. package/Tests/Server/Utils/Telemetry/KubernetesResourceAttributes.test.ts +162 -0
  191. package/Tests/Server/Utils/Telemetry/ResourceEntityFilter.test.ts +460 -13
  192. package/Tests/Server/Utils/Telemetry/ResourceFacetPlanner.test.ts +678 -0
  193. package/Tests/Server/Utils/Telemetry/ResourceFacetResolver.test.ts +348 -2
  194. package/Tests/Server/Utils/Telemetry/ServiceDependencyDiscovery.test.ts +525 -0
  195. package/Tests/Server/Utils/Telemetry/TraceContextPropagation.test.ts +420 -0
  196. package/Tests/Types/Rum/SessionReplayApiContracts.test.ts +73 -0
  197. package/Tests/Types/Rum/SessionReplayTransportContracts.test.ts +95 -0
  198. package/Tests/Types/SecurityEvent/Connectors/ConnectorDiagnostics.test.ts +82 -0
  199. package/Tests/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.test.ts +314 -0
  200. package/Tests/Types/Telemetry/ExceptionSpanScope.test.ts +89 -0
  201. package/Tests/Types/Telemetry/ResourceEntityFacet.test.ts +96 -0
  202. package/Tests/Types/Telemetry/ResourceFacetCatalog.test.ts +304 -0
  203. package/Tests/UI/Components/ActiveFilterChipsLockedFilters.test.tsx +357 -0
  204. package/Tests/UI/Components/Card.test.tsx +312 -1
  205. package/Tests/UI/Components/CardModelDetailHeaderLayout.test.tsx +253 -0
  206. package/Tests/UI/Components/CardModelDetailRefresher.test.tsx +342 -0
  207. package/Tests/UI/Components/Checkbox.test.tsx +79 -0
  208. package/Tests/UI/Components/CopyTextButton.test.tsx +142 -0
  209. package/Tests/UI/Components/DetailCompactStyle.test.tsx +621 -0
  210. package/Tests/UI/Components/ErrorBoundary.test.tsx +60 -0
  211. package/Tests/UI/Components/FacetSections.test.tsx +581 -0
  212. package/Tests/UI/Components/FacetSidebarControls.test.tsx +812 -0
  213. package/Tests/UI/Components/FacetVisibility.test.ts +429 -0
  214. package/Tests/UI/Components/LockedFilterActions.test.tsx +396 -0
  215. package/Tests/UI/Components/LockedFilterChip.test.tsx +651 -0
  216. package/Tests/UI/Components/LogsEntityNames.test.ts +1769 -0
  217. package/Tests/UI/Components/LogsEntityNamesComponents.test.tsx +696 -0
  218. package/Tests/UI/Components/LogsFacetSidebarHiddenFacets.test.tsx +600 -0
  219. package/Tests/UI/Components/LogsViewerEntityNames.test.tsx +713 -0
  220. package/Tests/UI/Components/MarkdownInlineReferences.test.tsx +2079 -0
  221. package/Tests/UI/Components/MemberRoleAssignment.test.tsx +446 -0
  222. package/Tests/UI/Components/ModelDetailRefetch.test.tsx +397 -0
  223. package/Tests/UI/Components/ModelListRefetch.test.tsx +233 -0
  224. package/Tests/UI/Components/ModelPageModelChange.test.tsx +409 -0
  225. package/Tests/UI/Components/PaginationIntegration.test.tsx +25 -0
  226. package/Tests/UI/Components/ResourceFacetConfigs.test.ts +172 -0
  227. package/Tests/UI/Components/SavedViewsSidebarIntegration.test.tsx +32 -14
  228. package/Tests/UI/Components/TableSortAndMobileColumns.test.tsx +44 -1
  229. package/Tests/UI/Components/TelemetryActiveFilterChipsLockedFilters.test.tsx +304 -0
  230. package/Tests/UI/Components/TelemetryFacetSidebarHiddenFacets.test.tsx +718 -0
  231. package/Tests/UI/Monitor/EvaluationLogList.test.tsx +303 -0
  232. package/Tests/UI/Monitor/MonitorSummarySnapshotRender.test.tsx +55 -1
  233. package/Tests/UI/Rum/FidelityNotices.test.ts +22 -0
  234. package/Tests/UI/Rum/RecordingHealthCard.test.tsx +120 -136
  235. package/Tests/UI/Rum/RecordingHealthDashboard.test.tsx +988 -0
  236. package/Tests/UI/Rum/ReplayCard.test.tsx +32 -0
  237. package/Tests/UI/Rum/ReplayCorrelationPanel.test.tsx +709 -12
  238. package/Tests/UI/Rum/ReplayHeader.test.tsx +50 -1
  239. package/Tests/UI/Rum/ReplayPinControl.test.tsx +67 -10
  240. package/Tests/UI/Rum/ReplayPlayerChrome.test.tsx +41 -12
  241. package/Tests/UI/Rum/ReplayStage.test.tsx +663 -1
  242. package/Tests/UI/Rum/ReplayStageOverlays.test.tsx +173 -0
  243. package/Tests/UI/Rum/ReplayUi.test.tsx +189 -2
  244. package/Tests/UI/Rum/ReplayUserSessionsMenu.test.tsx +91 -0
  245. package/Tests/UI/Rum/SessionReplayEmptyState.test.tsx +1 -1
  246. package/Tests/UI/Rum/SessionReplaySettingsPolicyLoading.test.tsx +585 -0
  247. package/Tests/UI/Rum/SessionReplayTable.test.tsx +844 -51
  248. package/Tests/UI/Rum/SessionReplayUsersTable.test.tsx +29 -1
  249. package/Tests/UI/Telemetry/TelemetryDetailPanel.test.tsx +288 -0
  250. package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +31 -1
  251. package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +6 -0
  252. package/Tests/UI/Utils/Clipboard.test.ts +154 -0
  253. package/Tests/UI/Utils/Navigation.test.ts +24 -0
  254. package/Tests/UI/Utils/Telemetry/TelemetryEntityNames.test.ts +2205 -0
  255. package/Tests/UI/Utils/Telemetry/UseTelemetryEntityNames.test.tsx +844 -0
  256. package/Tests/Utils/AI/InvestigationReport.test.ts +2430 -0
  257. package/Tests/Utils/APIOutgoingRequestTracer.test.ts +137 -0
  258. package/Tests/Utils/Rum/SessionReplayHealthDiagnosis.test.ts +40 -0
  259. package/Tests/Utils/Rum/SessionReplayRecordingEnded.test.ts +619 -0
  260. package/Tests/Utils/SecurityEvent/Connectors/AwsSecurityHubNormalizer.test.ts +631 -0
  261. package/Tests/Utils/SecurityEvent/Connectors/CrowdStrikeFalconNormalizer.test.ts +479 -0
  262. package/Tests/Utils/SecurityEvent/Connectors/ElasticSecurityNormalizer.test.ts +507 -0
  263. package/Tests/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdrNormalizer.test.ts +686 -0
  264. package/Tests/Utils/SecurityEvent/Connectors/MicrosoftSentinelNormalizer.test.ts +474 -0
  265. package/Tests/Utils/SecurityEvent/Connectors/OktaNormalizer.test.ts +736 -0
  266. package/Tests/Utils/SecurityEvent/Connectors/SplunkNormalizer.test.ts +407 -0
  267. package/Tests/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.test.ts +129 -0
  268. package/Tests/Utils/Telemetry/CrossSignalScope.test.ts +57 -1
  269. package/Tests/Utils/Telemetry/EntityRelationship.test.ts +36 -0
  270. package/Tests/Utils/Telemetry/LockedFilterSearch.test.ts +600 -0
  271. package/Tests/Utils/Telemetry/NetworkHost.test.ts +48 -0
  272. package/Tests/Utils/Telemetry/OriginAllowList.test.ts +154 -0
  273. package/Tests/Utils/Traces/CriticalPath.test.ts +25 -0
  274. package/Types/AI/AIChatTypes.ts +8 -0
  275. package/Types/AI/InvestigationEvidence.ts +96 -0
  276. package/Types/Monitor/MonitorEvaluationSummary.ts +5 -0
  277. package/Types/Permission.ts +2 -2
  278. package/Types/Rum/SessionReplay.ts +109 -0
  279. package/Types/Rum/SessionReplayApi.ts +31 -0
  280. package/Types/SecurityEvent/Connectors/ConnectorDiagnostics.ts +111 -0
  281. package/Types/SecurityEvent/Connectors/SecurityEventConnectionDiagnostics.ts +87 -0
  282. package/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.ts +492 -0
  283. package/Types/SecurityEvent/Connectors/SecurityEventConnectorProvider.ts +41 -0
  284. package/Types/SecurityEvent/GoogleSecOpsDiagnostics.ts +56 -1
  285. package/Types/SecurityEvent/GoogleSecOpsRegion.ts +34 -0
  286. package/Types/Telemetry/EntityType.ts +14 -0
  287. package/Types/Telemetry/ExceptionSpanScope.ts +83 -0
  288. package/Types/Telemetry/LockedFilterDetail.ts +46 -0
  289. package/Types/Telemetry/ResourceEntityFacet.ts +17 -10
  290. package/Types/Telemetry/ResourceFacetCatalog.ts +171 -0
  291. package/UI/Components/Card/Card.tsx +118 -83
  292. package/UI/Components/Checkbox/Checkbox.tsx +8 -5
  293. package/UI/Components/CopyTextButton/CopyTextButton.tsx +7 -1
  294. package/UI/Components/CustomFields/CustomFieldsDetail.tsx +4 -1
  295. package/UI/Components/Detail/Detail.tsx +137 -22
  296. package/UI/Components/ErrorBoundary.tsx +38 -0
  297. package/UI/Components/LogsViewer/LogsEntityNames.ts +912 -0
  298. package/UI/Components/LogsViewer/LogsViewer.tsx +156 -77
  299. package/UI/Components/LogsViewer/components/ActiveFilterChips.tsx +28 -11
  300. package/UI/Components/LogsViewer/components/FacetSection.tsx +66 -79
  301. package/UI/Components/LogsViewer/components/FacetValueRow.tsx +17 -2
  302. package/UI/Components/LogsViewer/components/LogDetailsPanel.tsx +45 -5
  303. package/UI/Components/LogsViewer/components/LogsAnalyticsView.tsx +100 -19
  304. package/UI/Components/LogsViewer/components/LogsFacetSidebar.tsx +156 -39
  305. package/UI/Components/LogsViewer/components/LogsTable.tsx +30 -8
  306. package/UI/Components/LogsViewer/types.ts +6 -0
  307. package/UI/Components/Markdown.tsx/InlineReferences.tsx +628 -0
  308. package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +385 -312
  309. package/UI/Components/MemberRoleAssignment/MemberRoleAssignment.tsx +50 -22
  310. package/UI/Components/ModelDetail/CardModelDetail.tsx +15 -0
  311. package/UI/Components/ModelDetail/ModelDetail.tsx +64 -19
  312. package/UI/Components/ModelList/ModelList.tsx +33 -8
  313. package/UI/Components/Page/ModelPage.tsx +119 -54
  314. package/UI/Components/Table/Table.tsx +8 -0
  315. package/UI/Components/Table/TableRow.tsx +13 -5
  316. package/UI/Components/TelemetryViewer/FacetVisibility.ts +229 -0
  317. package/UI/Components/TelemetryViewer/ResourceFacetConfigs.ts +46 -0
  318. package/UI/Components/TelemetryViewer/TelemetryViewer.tsx +11 -0
  319. package/UI/Components/TelemetryViewer/components/FacetSearchInput.tsx +79 -0
  320. package/UI/Components/TelemetryViewer/components/FacetSectionHeader.tsx +69 -0
  321. package/UI/Components/TelemetryViewer/components/FacetShowMoreButton.tsx +36 -0
  322. package/UI/Components/TelemetryViewer/components/HiddenFacetsFooter.tsx +88 -0
  323. package/UI/Components/TelemetryViewer/components/LockedFilterActions.tsx +205 -0
  324. package/UI/Components/TelemetryViewer/components/LockedFilterChip.tsx +496 -0
  325. package/UI/Components/TelemetryViewer/components/TelemetryActiveFilterChips.tsx +30 -10
  326. package/UI/Components/TelemetryViewer/components/TelemetryDetailPanel.tsx +203 -10
  327. package/UI/Components/TelemetryViewer/components/TelemetryFacetSection.tsx +60 -73
  328. package/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.tsx +94 -7
  329. package/UI/Components/TelemetryViewer/components/TelemetryFacetValueRow.tsx +17 -2
  330. package/UI/Components/TelemetryViewer/types.ts +19 -0
  331. package/UI/Components/TelemetryViewer/useFacetSearchExemptions.ts +158 -0
  332. package/UI/Components/TelemetryViewer/useFacetSectionSearch.ts +102 -0
  333. package/UI/Utils/Clipboard.ts +68 -2
  334. package/UI/Utils/Navigation.ts +17 -2
  335. package/UI/Utils/Telemetry/TelemetryEntityNames.ts +620 -0
  336. package/UI/Utils/Telemetry/UseTelemetryEntityNames.ts +151 -0
  337. package/Utils/AI/InvestigationReport.ts +1789 -0
  338. package/Utils/API.ts +90 -1
  339. package/Utils/Rum/SessionReplayHealth.ts +11 -0
  340. package/Utils/Rum/SessionReplayRecordingEnded.ts +134 -0
  341. package/Utils/SecurityEvent/Connectors/AwsSecurityHubNormalizer.ts +427 -0
  342. package/Utils/SecurityEvent/Connectors/CrowdStrikeFalconNormalizer.ts +197 -0
  343. package/Utils/SecurityEvent/Connectors/ElasticSecurityNormalizer.ts +464 -0
  344. package/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdrNormalizer.ts +567 -0
  345. package/Utils/SecurityEvent/Connectors/MicrosoftSentinelNormalizer.ts +299 -0
  346. package/Utils/SecurityEvent/Connectors/OktaNormalizer.ts +467 -0
  347. package/Utils/SecurityEvent/Connectors/SplunkNormalizer.ts +439 -0
  348. package/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.ts +124 -12
  349. package/Utils/Telemetry/CrossSignalScope.ts +22 -8
  350. package/Utils/Telemetry/EntityRelationship.ts +8 -0
  351. package/Utils/Telemetry/LockedFilterSearch.ts +412 -0
  352. package/Utils/Telemetry/NetworkHost.ts +43 -0
  353. package/Utils/Telemetry/OriginAllowList.ts +139 -4
  354. package/Utils/Traces/CriticalPath.ts +10 -4
  355. package/build/dist/Models/DatabaseModels/Index.js +4 -0
  356. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  357. package/build/dist/Models/DatabaseModels/RumApplication.js +1 -1
  358. package/build/dist/Models/DatabaseModels/RumApplication.js.map +1 -1
  359. package/build/dist/Models/DatabaseModels/SecurityEventConnection.js +490 -0
  360. package/build/dist/Models/DatabaseModels/SecurityEventConnection.js.map +1 -0
  361. package/build/dist/Models/DatabaseModels/SecurityEventConnectionRun.js +287 -0
  362. package/build/dist/Models/DatabaseModels/SecurityEventConnectionRun.js.map +1 -0
  363. package/build/dist/Models/DatabaseModels/TelemetryIngestionKey.js +2 -2
  364. package/build/dist/Models/DatabaseModels/TelemetryIngestionKey.js.map +1 -1
  365. package/build/dist/Server/API/AIInvestigationAPI.js +336 -27
  366. package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
  367. package/build/dist/Server/API/GoogleSecOpsConnectionAPI.js +182 -7
  368. package/build/dist/Server/API/GoogleSecOpsConnectionAPI.js.map +1 -1
  369. package/build/dist/Server/API/SecurityEventConnectionAPI.js +171 -0
  370. package/build/dist/Server/API/SecurityEventConnectionAPI.js.map +1 -0
  371. package/build/dist/Server/API/TelemetryAPI.js +248 -170
  372. package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
  373. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792700000000-AddSecurityEventConnections.js +40 -0
  374. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792700000000-AddSecurityEventConnections.js.map +1 -0
  375. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +2 -0
  376. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  377. package/build/dist/Server/Middleware/TelemetryIngest.js +57 -4
  378. package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
  379. package/build/dist/Server/Services/ExceptionAggregationService.js +7 -16
  380. package/build/dist/Server/Services/ExceptionAggregationService.js.map +1 -1
  381. package/build/dist/Server/Services/GoogleSecOpsConnectionService.js +8 -0
  382. package/build/dist/Server/Services/GoogleSecOpsConnectionService.js.map +1 -1
  383. package/build/dist/Server/Services/Index.js +4 -0
  384. package/build/dist/Server/Services/Index.js.map +1 -1
  385. package/build/dist/Server/Services/InventoryItemService.js +22 -0
  386. package/build/dist/Server/Services/InventoryItemService.js.map +1 -1
  387. package/build/dist/Server/Services/LogAggregationService.js +8 -17
  388. package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
  389. package/build/dist/Server/Services/MetricAggregationService.js +4 -14
  390. package/build/dist/Server/Services/MetricAggregationService.js.map +1 -1
  391. package/build/dist/Server/Services/SecurityEventConnectionRunService.js +9 -0
  392. package/build/dist/Server/Services/SecurityEventConnectionRunService.js.map +1 -0
  393. package/build/dist/Server/Services/SecurityEventConnectionService.js +356 -0
  394. package/build/dist/Server/Services/SecurityEventConnectionService.js.map +1 -0
  395. package/build/dist/Server/Services/TraceAggregationService.js +51 -25
  396. package/build/dist/Server/Services/TraceAggregationService.js.map +1 -1
  397. package/build/dist/Server/Types/AnalyticsDatabase/ModelPermission.js +9 -0
  398. package/build/dist/Server/Types/AnalyticsDatabase/ModelPermission.js.map +1 -1
  399. package/build/dist/Server/Utils/AI/Chat/ObservabilityAssistant.js +3 -0
  400. package/build/dist/Server/Utils/AI/Chat/ObservabilityAssistant.js.map +1 -1
  401. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js +14 -7
  402. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -1
  403. package/build/dist/Server/Utils/AI/SRE/InvestigationEvidence.js +468 -0
  404. package/build/dist/Server/Utils/AI/SRE/InvestigationEvidence.js.map +1 -0
  405. package/build/dist/Server/Utils/AI/SRE/InvestigationReferences.js +230 -0
  406. package/build/dist/Server/Utils/AI/SRE/InvestigationReferences.js.map +1 -0
  407. package/build/dist/Server/Utils/AI/Toolbox/Index.js +32 -0
  408. package/build/dist/Server/Utils/AI/Toolbox/Index.js.map +1 -1
  409. package/build/dist/Server/Utils/AI/Toolbox/TimelineTools.js +6 -2
  410. package/build/dist/Server/Utils/AI/Toolbox/TimelineTools.js.map +1 -1
  411. package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js +59 -0
  412. package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js.map +1 -1
  413. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +5 -3
  414. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
  415. package/build/dist/Server/Utils/SecurityEvent/Connectors/AwsSecurityHub/AwsSecurityHubClient.js +752 -0
  416. package/build/dist/Server/Utils/SecurityEvent/Connectors/AwsSecurityHub/AwsSecurityHubClient.js.map +1 -0
  417. package/build/dist/Server/Utils/SecurityEvent/Connectors/AwsSecurityHub/AwsSecurityHubConnector.js +493 -0
  418. package/build/dist/Server/Utils/SecurityEvent/Connectors/AwsSecurityHub/AwsSecurityHubConnector.js.map +1 -0
  419. package/build/dist/Server/Utils/SecurityEvent/Connectors/ConnectorPlatformHealth.js +352 -0
  420. package/build/dist/Server/Utils/SecurityEvent/Connectors/ConnectorPlatformHealth.js.map +1 -0
  421. package/build/dist/Server/Utils/SecurityEvent/Connectors/CrowdStrikeFalcon/CrowdStrikeFalconClient.js +405 -0
  422. package/build/dist/Server/Utils/SecurityEvent/Connectors/CrowdStrikeFalcon/CrowdStrikeFalconClient.js.map +1 -0
  423. package/build/dist/Server/Utils/SecurityEvent/Connectors/CrowdStrikeFalcon/CrowdStrikeFalconConnector.js +466 -0
  424. package/build/dist/Server/Utils/SecurityEvent/Connectors/CrowdStrikeFalcon/CrowdStrikeFalconConnector.js.map +1 -0
  425. package/build/dist/Server/Utils/SecurityEvent/Connectors/ElasticSecurity/ElasticSecurityClient.js +344 -0
  426. package/build/dist/Server/Utils/SecurityEvent/Connectors/ElasticSecurity/ElasticSecurityClient.js.map +1 -0
  427. package/build/dist/Server/Utils/SecurityEvent/Connectors/ElasticSecurity/ElasticSecurityConnector.js +511 -0
  428. package/build/dist/Server/Utils/SecurityEvent/Connectors/ElasticSecurity/ElasticSecurityConnector.js.map +1 -0
  429. package/build/dist/Server/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdr/MicrosoftDefenderXdrClient.js +406 -0
  430. package/build/dist/Server/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdr/MicrosoftDefenderXdrClient.js.map +1 -0
  431. package/build/dist/Server/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdr/MicrosoftDefenderXdrConnector.js +336 -0
  432. package/build/dist/Server/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdr/MicrosoftDefenderXdrConnector.js.map +1 -0
  433. package/build/dist/Server/Utils/SecurityEvent/Connectors/MicrosoftSentinel/MicrosoftSentinelClient.js +474 -0
  434. package/build/dist/Server/Utils/SecurityEvent/Connectors/MicrosoftSentinel/MicrosoftSentinelClient.js.map +1 -0
  435. package/build/dist/Server/Utils/SecurityEvent/Connectors/MicrosoftSentinel/MicrosoftSentinelConnector.js +417 -0
  436. package/build/dist/Server/Utils/SecurityEvent/Connectors/MicrosoftSentinel/MicrosoftSentinelConnector.js.map +1 -0
  437. package/build/dist/Server/Utils/SecurityEvent/Connectors/Okta/OktaClient.js +314 -0
  438. package/build/dist/Server/Utils/SecurityEvent/Connectors/Okta/OktaClient.js.map +1 -0
  439. package/build/dist/Server/Utils/SecurityEvent/Connectors/Okta/OktaConnector.js +494 -0
  440. package/build/dist/Server/Utils/SecurityEvent/Connectors/Okta/OktaConnector.js.map +1 -0
  441. package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionPoller.js +719 -0
  442. package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionPoller.js.map +1 -0
  443. package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionRunExecutor.js +404 -0
  444. package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionRunExecutor.js.map +1 -0
  445. package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionTester.js +209 -0
  446. package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionTester.js.map +1 -0
  447. package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectorRegistry.js +40 -0
  448. package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectorRegistry.js.map +1 -0
  449. package/build/dist/Server/Utils/SecurityEvent/Connectors/Splunk/SplunkClient.js +494 -0
  450. package/build/dist/Server/Utils/SecurityEvent/Connectors/Splunk/SplunkClient.js.map +1 -0
  451. package/build/dist/Server/Utils/SecurityEvent/Connectors/Splunk/SplunkConnector.js +379 -0
  452. package/build/dist/Server/Utils/SecurityEvent/Connectors/Splunk/SplunkConnector.js.map +1 -0
  453. package/build/dist/Server/Utils/SecurityEvent/Connectors/Types.js +27 -0
  454. package/build/dist/Server/Utils/SecurityEvent/Connectors/Types.js.map +1 -0
  455. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient.js +234 -61
  456. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient.js.map +1 -1
  457. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsConnectionTester.js +537 -0
  458. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsConnectionTester.js.map +1 -0
  459. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js +572 -115
  460. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js.map +1 -1
  461. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.js +35 -1
  462. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.js.map +1 -1
  463. package/build/dist/Server/Utils/SecurityEvent/SecurityEventDedupe.js +52 -0
  464. package/build/dist/Server/Utils/SecurityEvent/SecurityEventDedupe.js.map +1 -0
  465. package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js +521 -32
  466. package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js.map +1 -1
  467. package/build/dist/Server/Utils/StartServer.js +10 -0
  468. package/build/dist/Server/Utils/StartServer.js.map +1 -1
  469. package/build/dist/Server/Utils/Telemetry/EntityRegistry.js +8 -0
  470. package/build/dist/Server/Utils/Telemetry/EntityRegistry.js.map +1 -1
  471. package/build/dist/Server/Utils/Telemetry/KubernetesResourceAttributes.js +80 -0
  472. package/build/dist/Server/Utils/Telemetry/KubernetesResourceAttributes.js.map +1 -0
  473. package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js +122 -67
  474. package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js.map +1 -1
  475. package/build/dist/Server/Utils/Telemetry/ResourceFacetPlanner.js +146 -0
  476. package/build/dist/Server/Utils/Telemetry/ResourceFacetPlanner.js.map +1 -0
  477. package/build/dist/Server/Utils/Telemetry/ResourceFacetResolver.js +174 -248
  478. package/build/dist/Server/Utils/Telemetry/ResourceFacetResolver.js.map +1 -1
  479. package/build/dist/Server/Utils/Telemetry/ServiceDependencyDiscovery.js +492 -0
  480. package/build/dist/Server/Utils/Telemetry/ServiceDependencyDiscovery.js.map +1 -0
  481. package/build/dist/Server/Utils/Telemetry/TraceContextPropagation.js +259 -0
  482. package/build/dist/Server/Utils/Telemetry/TraceContextPropagation.js.map +1 -0
  483. package/build/dist/Server/Utils/Telemetry.js +11 -5
  484. package/build/dist/Server/Utils/Telemetry.js.map +1 -1
  485. package/build/dist/Types/AI/InvestigationEvidence.js +2 -0
  486. package/build/dist/Types/AI/InvestigationEvidence.js.map +1 -0
  487. package/build/dist/Types/Permission.js +2 -2
  488. package/build/dist/Types/Permission.js.map +1 -1
  489. package/build/dist/Types/Rum/SessionReplay.js +95 -0
  490. package/build/dist/Types/Rum/SessionReplay.js.map +1 -1
  491. package/build/dist/Types/Rum/SessionReplayApi.js.map +1 -1
  492. package/build/dist/Types/SecurityEvent/Connectors/ConnectorDiagnostics.js +18 -0
  493. package/build/dist/Types/SecurityEvent/Connectors/ConnectorDiagnostics.js.map +1 -0
  494. package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectionDiagnostics.js +2 -0
  495. package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectionDiagnostics.js.map +1 -0
  496. package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.js +374 -0
  497. package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.js.map +1 -0
  498. package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectorProvider.js +35 -0
  499. package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectorProvider.js.map +1 -0
  500. package/build/dist/Types/SecurityEvent/GoogleSecOpsRegion.js +35 -0
  501. package/build/dist/Types/SecurityEvent/GoogleSecOpsRegion.js.map +1 -0
  502. package/build/dist/Types/Telemetry/EntityType.js +14 -0
  503. package/build/dist/Types/Telemetry/EntityType.js.map +1 -1
  504. package/build/dist/Types/Telemetry/ExceptionSpanScope.js +59 -0
  505. package/build/dist/Types/Telemetry/ExceptionSpanScope.js.map +1 -0
  506. package/build/dist/Types/Telemetry/LockedFilterDetail.js +16 -0
  507. package/build/dist/Types/Telemetry/LockedFilterDetail.js.map +1 -0
  508. package/build/dist/Types/Telemetry/ResourceEntityFacet.js +16 -10
  509. package/build/dist/Types/Telemetry/ResourceEntityFacet.js.map +1 -1
  510. package/build/dist/Types/Telemetry/ResourceFacetCatalog.js +119 -0
  511. package/build/dist/Types/Telemetry/ResourceFacetCatalog.js.map +1 -0
  512. package/build/dist/UI/Components/Card/Card.js +34 -17
  513. package/build/dist/UI/Components/Card/Card.js.map +1 -1
  514. package/build/dist/UI/Components/Checkbox/Checkbox.js +6 -4
  515. package/build/dist/UI/Components/Checkbox/Checkbox.js.map +1 -1
  516. package/build/dist/UI/Components/CopyTextButton/CopyTextButton.js +5 -1
  517. package/build/dist/UI/Components/CopyTextButton/CopyTextButton.js.map +1 -1
  518. package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js +1 -1
  519. package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js.map +1 -1
  520. package/build/dist/UI/Components/Detail/Detail.js +63 -13
  521. package/build/dist/UI/Components/Detail/Detail.js.map +1 -1
  522. package/build/dist/UI/Components/ErrorBoundary.js +34 -0
  523. package/build/dist/UI/Components/ErrorBoundary.js.map +1 -1
  524. package/build/dist/UI/Components/LogsViewer/LogsEntityNames.js +535 -0
  525. package/build/dist/UI/Components/LogsViewer/LogsEntityNames.js.map +1 -0
  526. package/build/dist/UI/Components/LogsViewer/LogsViewer.js +117 -57
  527. package/build/dist/UI/Components/LogsViewer/LogsViewer.js.map +1 -1
  528. package/build/dist/UI/Components/LogsViewer/components/ActiveFilterChips.js +5 -7
  529. package/build/dist/UI/Components/LogsViewer/components/ActiveFilterChips.js.map +1 -1
  530. package/build/dist/UI/Components/LogsViewer/components/FacetSection.js +31 -44
  531. package/build/dist/UI/Components/LogsViewer/components/FacetSection.js.map +1 -1
  532. package/build/dist/UI/Components/LogsViewer/components/FacetValueRow.js +17 -3
  533. package/build/dist/UI/Components/LogsViewer/components/FacetValueRow.js.map +1 -1
  534. package/build/dist/UI/Components/LogsViewer/components/LogDetailsPanel.js +19 -3
  535. package/build/dist/UI/Components/LogsViewer/components/LogDetailsPanel.js.map +1 -1
  536. package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js +64 -18
  537. package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js.map +1 -1
  538. package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js +100 -41
  539. package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js.map +1 -1
  540. package/build/dist/UI/Components/LogsViewer/components/LogsTable.js +13 -5
  541. package/build/dist/UI/Components/LogsViewer/components/LogsTable.js.map +1 -1
  542. package/build/dist/UI/Components/LogsViewer/types.js.map +1 -1
  543. package/build/dist/UI/Components/Markdown.tsx/InlineReferences.js +403 -0
  544. package/build/dist/UI/Components/Markdown.tsx/InlineReferences.js.map +1 -0
  545. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js +197 -179
  546. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js.map +1 -1
  547. package/build/dist/UI/Components/MemberRoleAssignment/MemberRoleAssignment.js +30 -21
  548. package/build/dist/UI/Components/MemberRoleAssignment/MemberRoleAssignment.js.map +1 -1
  549. package/build/dist/UI/Components/ModelDetail/CardModelDetail.js +12 -0
  550. package/build/dist/UI/Components/ModelDetail/CardModelDetail.js.map +1 -1
  551. package/build/dist/UI/Components/ModelDetail/ModelDetail.js +46 -12
  552. package/build/dist/UI/Components/ModelDetail/ModelDetail.js.map +1 -1
  553. package/build/dist/UI/Components/ModelList/ModelList.js +26 -7
  554. package/build/dist/UI/Components/ModelList/ModelList.js.map +1 -1
  555. package/build/dist/UI/Components/Page/ModelPage.js +62 -34
  556. package/build/dist/UI/Components/Page/ModelPage.js.map +1 -1
  557. package/build/dist/UI/Components/Table/Table.js +3 -1
  558. package/build/dist/UI/Components/Table/Table.js.map +1 -1
  559. package/build/dist/UI/Components/Table/TableRow.js +8 -1
  560. package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
  561. package/build/dist/UI/Components/TelemetryViewer/FacetVisibility.js +111 -0
  562. package/build/dist/UI/Components/TelemetryViewer/FacetVisibility.js.map +1 -0
  563. package/build/dist/UI/Components/TelemetryViewer/ResourceFacetConfigs.js +22 -0
  564. package/build/dist/UI/Components/TelemetryViewer/ResourceFacetConfigs.js.map +1 -0
  565. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js +1 -1
  566. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js.map +1 -1
  567. package/build/dist/UI/Components/TelemetryViewer/components/FacetSearchInput.js +36 -0
  568. package/build/dist/UI/Components/TelemetryViewer/components/FacetSearchInput.js.map +1 -0
  569. package/build/dist/UI/Components/TelemetryViewer/components/FacetSectionHeader.js +21 -0
  570. package/build/dist/UI/Components/TelemetryViewer/components/FacetSectionHeader.js.map +1 -0
  571. package/build/dist/UI/Components/TelemetryViewer/components/FacetShowMoreButton.js +14 -0
  572. package/build/dist/UI/Components/TelemetryViewer/components/FacetShowMoreButton.js.map +1 -0
  573. package/build/dist/UI/Components/TelemetryViewer/components/HiddenFacetsFooter.js +27 -0
  574. package/build/dist/UI/Components/TelemetryViewer/components/HiddenFacetsFooter.js.map +1 -0
  575. package/build/dist/UI/Components/TelemetryViewer/components/LockedFilterActions.js +88 -0
  576. package/build/dist/UI/Components/TelemetryViewer/components/LockedFilterActions.js.map +1 -0
  577. package/build/dist/UI/Components/TelemetryViewer/components/LockedFilterChip.js +228 -0
  578. package/build/dist/UI/Components/TelemetryViewer/components/LockedFilterChip.js.map +1 -0
  579. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryActiveFilterChips.js +6 -6
  580. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryActiveFilterChips.js.map +1 -1
  581. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryDetailPanel.js +111 -12
  582. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryDetailPanel.js.map +1 -1
  583. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSection.js +27 -40
  584. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSection.js.map +1 -1
  585. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js +70 -10
  586. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js.map +1 -1
  587. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetValueRow.js +17 -3
  588. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetValueRow.js.map +1 -1
  589. package/build/dist/UI/Components/TelemetryViewer/types.js +0 -4
  590. package/build/dist/UI/Components/TelemetryViewer/types.js.map +1 -1
  591. package/build/dist/UI/Components/TelemetryViewer/useFacetSearchExemptions.js +70 -0
  592. package/build/dist/UI/Components/TelemetryViewer/useFacetSearchExemptions.js.map +1 -0
  593. package/build/dist/UI/Components/TelemetryViewer/useFacetSectionSearch.js +52 -0
  594. package/build/dist/UI/Components/TelemetryViewer/useFacetSectionSearch.js.map +1 -0
  595. package/build/dist/UI/Utils/Clipboard.js +59 -2
  596. package/build/dist/UI/Utils/Clipboard.js.map +1 -1
  597. package/build/dist/UI/Utils/Navigation.js +11 -2
  598. package/build/dist/UI/Utils/Navigation.js.map +1 -1
  599. package/build/dist/UI/Utils/Telemetry/TelemetryEntityNames.js +471 -0
  600. package/build/dist/UI/Utils/Telemetry/TelemetryEntityNames.js.map +1 -0
  601. package/build/dist/UI/Utils/Telemetry/UseTelemetryEntityNames.js +113 -0
  602. package/build/dist/UI/Utils/Telemetry/UseTelemetryEntityNames.js.map +1 -0
  603. package/build/dist/Utils/AI/InvestigationReport.js +1241 -0
  604. package/build/dist/Utils/AI/InvestigationReport.js.map +1 -0
  605. package/build/dist/Utils/API.js +25 -0
  606. package/build/dist/Utils/API.js.map +1 -1
  607. package/build/dist/Utils/Rum/SessionReplayHealth.js +10 -0
  608. package/build/dist/Utils/Rum/SessionReplayHealth.js.map +1 -1
  609. package/build/dist/Utils/Rum/SessionReplayRecordingEnded.js +54 -0
  610. package/build/dist/Utils/Rum/SessionReplayRecordingEnded.js.map +1 -0
  611. package/build/dist/Utils/SecurityEvent/Connectors/AwsSecurityHubNormalizer.js +311 -0
  612. package/build/dist/Utils/SecurityEvent/Connectors/AwsSecurityHubNormalizer.js.map +1 -0
  613. package/build/dist/Utils/SecurityEvent/Connectors/CrowdStrikeFalconNormalizer.js +150 -0
  614. package/build/dist/Utils/SecurityEvent/Connectors/CrowdStrikeFalconNormalizer.js.map +1 -0
  615. package/build/dist/Utils/SecurityEvent/Connectors/ElasticSecurityNormalizer.js +328 -0
  616. package/build/dist/Utils/SecurityEvent/Connectors/ElasticSecurityNormalizer.js.map +1 -0
  617. package/build/dist/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdrNormalizer.js +405 -0
  618. package/build/dist/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdrNormalizer.js.map +1 -0
  619. package/build/dist/Utils/SecurityEvent/Connectors/MicrosoftSentinelNormalizer.js +212 -0
  620. package/build/dist/Utils/SecurityEvent/Connectors/MicrosoftSentinelNormalizer.js.map +1 -0
  621. package/build/dist/Utils/SecurityEvent/Connectors/OktaNormalizer.js +351 -0
  622. package/build/dist/Utils/SecurityEvent/Connectors/OktaNormalizer.js.map +1 -0
  623. package/build/dist/Utils/SecurityEvent/Connectors/SplunkNormalizer.js +348 -0
  624. package/build/dist/Utils/SecurityEvent/Connectors/SplunkNormalizer.js.map +1 -0
  625. package/build/dist/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.js +103 -10
  626. package/build/dist/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.js.map +1 -1
  627. package/build/dist/Utils/Telemetry/CrossSignalScope.js +16 -5
  628. package/build/dist/Utils/Telemetry/CrossSignalScope.js.map +1 -1
  629. package/build/dist/Utils/Telemetry/EntityRelationship.js +7 -0
  630. package/build/dist/Utils/Telemetry/EntityRelationship.js.map +1 -1
  631. package/build/dist/Utils/Telemetry/LockedFilterSearch.js +277 -0
  632. package/build/dist/Utils/Telemetry/LockedFilterSearch.js.map +1 -0
  633. package/build/dist/Utils/Telemetry/NetworkHost.js +39 -0
  634. package/build/dist/Utils/Telemetry/NetworkHost.js.map +1 -0
  635. package/build/dist/Utils/Telemetry/OriginAllowList.js +105 -4
  636. package/build/dist/Utils/Telemetry/OriginAllowList.js.map +1 -1
  637. package/build/dist/Utils/Traces/CriticalPath.js +9 -4
  638. package/build/dist/Utils/Traces/CriticalPath.js.map +1 -1
  639. package/package.json +1 -1
  640. package/Tests/UI/Rum/RecordingHealthStrip.test.tsx +0 -600
  641. package/UI/Components/GanttChart/Bar/BarLabel.tsx +0 -17
  642. package/UI/Components/GanttChart/Bar/Index.tsx +0 -149
  643. package/UI/Components/GanttChart/ChartContainer.tsx +0 -50
  644. package/UI/Components/GanttChart/Index.tsx +0 -90
  645. package/UI/Components/GanttChart/Row/Index.tsx +0 -22
  646. package/UI/Components/GanttChart/Row/Row.tsx +0 -231
  647. package/UI/Components/GanttChart/Row/RowLabel.tsx +0 -30
  648. package/UI/Components/GanttChart/Rows.tsx +0 -59
  649. package/UI/Components/GanttChart/Timeline/Index.tsx +0 -46
  650. package/UI/Components/GanttChart/Timeline/TimelineInterval.tsx +0 -33
  651. package/UI/Components/GanttChart/Timeline/TimelineIntervalMarks.tsx +0 -43
  652. package/build/dist/UI/Components/GanttChart/Bar/BarLabel.js +0 -8
  653. package/build/dist/UI/Components/GanttChart/Bar/BarLabel.js.map +0 -1
  654. package/build/dist/UI/Components/GanttChart/Bar/Index.js +0 -77
  655. package/build/dist/UI/Components/GanttChart/Bar/Index.js.map +0 -1
  656. package/build/dist/UI/Components/GanttChart/ChartContainer.js +0 -33
  657. package/build/dist/UI/Components/GanttChart/ChartContainer.js.map +0 -1
  658. package/build/dist/UI/Components/GanttChart/Index.js +0 -39
  659. package/build/dist/UI/Components/GanttChart/Index.js.map +0 -1
  660. package/build/dist/UI/Components/GanttChart/Row/Index.js +0 -7
  661. package/build/dist/UI/Components/GanttChart/Row/Index.js.map +0 -1
  662. package/build/dist/UI/Components/GanttChart/Row/Row.js +0 -106
  663. package/build/dist/UI/Components/GanttChart/Row/Row.js.map +0 -1
  664. package/build/dist/UI/Components/GanttChart/Row/RowLabel.js +0 -10
  665. package/build/dist/UI/Components/GanttChart/Row/RowLabel.js.map +0 -1
  666. package/build/dist/UI/Components/GanttChart/Rows.js +0 -19
  667. package/build/dist/UI/Components/GanttChart/Rows.js.map +0 -1
  668. package/build/dist/UI/Components/GanttChart/Timeline/Index.js +0 -16
  669. package/build/dist/UI/Components/GanttChart/Timeline/Index.js.map +0 -1
  670. package/build/dist/UI/Components/GanttChart/Timeline/TimelineInterval.js +0 -13
  671. package/build/dist/UI/Components/GanttChart/Timeline/TimelineInterval.js.map +0 -1
  672. package/build/dist/UI/Components/GanttChart/Timeline/TimelineIntervalMarks.js +0 -13
  673. package/build/dist/UI/Components/GanttChart/Timeline/TimelineIntervalMarks.js.map +0 -1
@@ -0,0 +1,719 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import BadDataException from "../../../../Types/Exception/BadDataException";
11
+ import SecurityEventConnection from "../../../../Models/DatabaseModels/SecurityEventConnection";
12
+ import LIMIT_MAX from "../../../../Types/Database/LimitMax";
13
+ import OneUptimeDate from "../../../../Types/Date";
14
+ import { getSecurityEventConnectorDefinition, } from "../../../../Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog";
15
+ import { resolveTelemetryRetentionInDays } from "../../../../Types/Telemetry/TelemetryRetentionConfig";
16
+ import Semaphore, { SemaphoreLockTimeoutError, } from "../../../Infrastructure/Semaphore";
17
+ import OTelIngestService from "../../../Services/OpenTelemetryIngestService";
18
+ import SecurityEventConnectionService from "../../../Services/SecurityEventConnectionService";
19
+ import SecurityEventService from "../../../Services/SecurityEventService";
20
+ import logger from "../../Logger";
21
+ import { redactLogString } from "../../LogRedaction";
22
+ import CaptureSpan from "../../Telemetry/CaptureSpan";
23
+ import ConnectorErrorMessage from "../ConnectorErrorMessage";
24
+ import SecurityEventDedupe from "../SecurityEventDedupe";
25
+ import { buildSecurityEventDbRow } from "../SecurityEventRow";
26
+ import ThreatIntelEnricher from "../ThreatIntel/ThreatIntelEnricher";
27
+ import SecurityEventConnectorRegistry from "./SecurityEventConnectorRegistry";
28
+ /*
29
+ * The generic pull loop behind every Security Event Connection.
30
+ *
31
+ * Window and cursor rules, in order of what they protect against:
32
+ * - the first poll looks back a full day (DEFAULT_INITIAL_LOOKBACK), so a
33
+ * new connection shows the customer their recent records immediately
34
+ * instead of an empty window they read as "broken";
35
+ * - every later poll starts the provider's cursorOverlapInMinutes before
36
+ * the saved cursor, so a record created on a window boundary, or one
37
+ * the source made readable late, is not skipped (the dedupe lookup makes
38
+ * the overlap harmless);
39
+ * - a poll reads at most one chunk PAST THE CURSOR (the overlap is extra).
40
+ * Measuring the chunk from the window start instead would let a chunk
41
+ * no longer than the overlap end at or before the cursor, so the cursor
42
+ * could never move forward again. The chunk starts at a day, so a stale
43
+ * cursor catches up in daily windows, and adapts from poll to poll
44
+ * through lastPollResult.nextChunkMinutes;
45
+ * - a window read completely moves the cursor to its end and doubles the
46
+ * chunk back towards a day;
47
+ * - a window that could not be read in one run must never pin polling
48
+ * (review finding F1: the held window was re-read forever and nothing
49
+ * newer was ever imported). A connector that reads in ascending creation
50
+ * order reports resumeAfter and the cursor moves there. Otherwise the
51
+ * cursor holds and the chunk halves; a one-minute chunk that still
52
+ * cannot be read moves the cursor past that minute with a loud lastError,
53
+ * trading a bounded, reported gap for never stalling;
54
+ * - after that forced advance, later windows never start before the
55
+ * skipped minute's end (overlapFloor) until the overlap has moved past
56
+ * it, so a long overlap cannot drag every following poll back over the
57
+ * same overflowing minute;
58
+ * - a run that fails outright holds the cursor and keeps the chunk: an
59
+ * authentication or transport failure says nothing about volume.
60
+ *
61
+ * Every poll that does not fail therefore moves the cursor forward or
62
+ * halves the chunk, so a connection moves within log2(MAX/MIN) + 1 polls.
63
+ *
64
+ * The window is on the SOURCE'S CREATION TIME, never the underlying event
65
+ * time (see Connectors/Types.ts).
66
+ */
67
+ export const DEFAULT_INITIAL_LOOKBACK_IN_MINUTES = 24 * 60;
68
+ // The longest stretch past the cursor one poll reads, and the first chunk.
69
+ export const MAX_CHUNK_MINUTES = 24 * 60;
70
+ /*
71
+ * The shortest chunk. Halving stops here: a one-minute chunk that still
72
+ * holds more records than one run can read is skipped past (forcedAdvance).
73
+ */
74
+ export const MIN_CHUNK_MINUTES = 1;
75
+ /*
76
+ * Transport deadlines as connectors and the shared HTTP client word them:
77
+ * "timed out after N seconds" (Sentinel, AWS Security Hub), axios's
78
+ * "timeout of Nms exceeded" (surfaced inside "... did not complete: ...")
79
+ * and a socket-level ETIMEDOUT.
80
+ */
81
+ const TIMEOUT_ERROR_PATTERN = /timed out|timeout of \d+ms exceeded|ETIMEDOUT/i;
82
+ /*
83
+ * Only for a catalog entry without a usable cursorOverlapInMinutes, so a
84
+ * malformed definition still re-reads the boundary instead of skipping it.
85
+ */
86
+ export const DEFAULT_CURSOR_OVERLAP_IN_MINUTES = 1;
87
+ export const MAX_FETCH_REQUESTS = 20;
88
+ export const MAX_EVENTS_PER_RUN = 10000;
89
+ export const MAX_DIAGNOSTIC_SAMPLES = 25;
90
+ export const MAX_RANGE_MS = 7 * 24 * 60 * 60 * 1000;
91
+ export const POLL_REQUEST_TIMEOUT_IN_MS = 60 * 1000;
92
+ export const SECURITY_EVENT_SOURCE_LOCK_NAMESPACE = "SecurityEventConnectionSource";
93
+ const MINUTE_IN_MS = 60 * 1000;
94
+ export class RecordedConnectionPollFailure extends Error {
95
+ }
96
+ export default class SecurityEventConnectionPoller {
97
+ static async pollAllDueConnections() {
98
+ var _a, _b;
99
+ const connections = await SecurityEventConnectionService.findBy({
100
+ query: { isEnabled: true },
101
+ select: {
102
+ _id: true,
103
+ projectId: true,
104
+ name: true,
105
+ provider: true,
106
+ pollIntervalInMinutes: true,
107
+ lastPolledAt: true,
108
+ },
109
+ skip: 0,
110
+ limit: LIMIT_MAX,
111
+ props: { isRoot: true },
112
+ });
113
+ const now = OneUptimeDate.getCurrentDate();
114
+ for (const connection of connections) {
115
+ const intervalInMinutes = Math.max(1, connection.pollIntervalInMinutes || 5);
116
+ if (connection.lastPolledAt) {
117
+ const dueAt = OneUptimeDate.addRemoveMinutes(connection.lastPolledAt, intervalInMinutes);
118
+ if (OneUptimeDate.isAfter(dueAt, now)) {
119
+ continue;
120
+ }
121
+ }
122
+ try {
123
+ const ingested = await this.pollConnection(connection);
124
+ logger.info(`SecurityEventConnectionPoller: connection ${(_a = connection.id) === null || _a === void 0 ? void 0 : _a.toString()} ingested ${ingested} security events.`);
125
+ }
126
+ catch (error) {
127
+ logger.error(`SecurityEventConnectionPoller: error polling connection ${(_b = connection.id) === null || _b === void 0 ? void 0 : _b.toString()}:`);
128
+ logger.error(error);
129
+ if (error instanceof RecordedConnectionPollFailure) {
130
+ continue;
131
+ }
132
+ if (connection.id) {
133
+ const connectionId = connection.id;
134
+ await ConnectorErrorMessage.recordFailure({
135
+ label: `SecurityEventConnectionPoller: connection ${connectionId.toString()}`,
136
+ write: async () => {
137
+ await SecurityEventConnectionService.updateOneById({
138
+ id: connectionId,
139
+ data: {
140
+ lastPolledAt: OneUptimeDate.getCurrentDate(),
141
+ lastError: redactLogString(ConnectorErrorMessage.toMessage(error, { truncate: false })),
142
+ },
143
+ props: { isRoot: true },
144
+ });
145
+ },
146
+ });
147
+ }
148
+ }
149
+ }
150
+ }
151
+ static async pollConnection(connection, overrides) {
152
+ const result = await this.executeConnection(connection, { type: "poll" }, overrides);
153
+ if (result.status === "failed") {
154
+ throw new RecordedConnectionPollFailure(result.error || "Security event connection poll failed.");
155
+ }
156
+ return result.ingestedCount;
157
+ }
158
+ /*
159
+ * Source-scoped serialization: ClickHouse does not deduplicate eventUid,
160
+ * so lookup-then-insert is only safe under this lock. The key is the
161
+ * project plus the provider, which is also the dedupe scope
162
+ * (vendorName/productName), so two connections to the same product in
163
+ * one project cannot race each other.
164
+ */
165
+ static async executeConnection(connection, options, overrides) {
166
+ var _a;
167
+ this.validateConnection(connection);
168
+ if (options.type === "test" || options.type === "preview") {
169
+ return this.executeUnlocked(connection, options, overrides);
170
+ }
171
+ let mutex;
172
+ try {
173
+ mutex = await Semaphore.lock({
174
+ namespace: SECURITY_EVENT_SOURCE_LOCK_NAMESPACE,
175
+ key: `${connection.projectId.toString()}:${connection.provider}`,
176
+ lockTimeout: 30000,
177
+ acquireTimeout: 10000,
178
+ retryInterval: 100,
179
+ });
180
+ }
181
+ catch (error) {
182
+ /*
183
+ * A historical import or another connection to the same product is
184
+ * still writing. That is contention, not a broken connection: say so
185
+ * in the run instead of surfacing a raw lock error, and leave the
186
+ * connection's lastError alone (executeUnlocked never ran).
187
+ */
188
+ if (error instanceof SemaphoreLockTimeoutError) {
189
+ throw new BadDataException("Another poll or import for this source is still running in this project. This run was skipped; polling continues on the next scheduled tick.");
190
+ }
191
+ throw error;
192
+ }
193
+ try {
194
+ const current = overrides
195
+ ? connection
196
+ : await SecurityEventConnectionService.findOneById({
197
+ id: connection.id,
198
+ select: {
199
+ _id: true,
200
+ projectId: true,
201
+ name: true,
202
+ provider: true,
203
+ config: true,
204
+ secrets: true,
205
+ alertingOnly: true,
206
+ cursor: true,
207
+ /*
208
+ * nextChunkMinutes lives in the previous poll's result. Without
209
+ * it every poll would restart at a full day and a window that
210
+ * needs narrowing would never narrow.
211
+ */
212
+ lastPollResult: true,
213
+ },
214
+ props: { isRoot: true },
215
+ });
216
+ if (!current ||
217
+ ((_a = current.projectId) === null || _a === void 0 ? void 0 : _a.toString()) !== connection.projectId.toString()) {
218
+ throw new BadDataException("Security event connection no longer exists in this project.");
219
+ }
220
+ return await this.executeUnlocked(current, options, overrides);
221
+ }
222
+ finally {
223
+ try {
224
+ await Semaphore.release(mutex);
225
+ }
226
+ catch (error) {
227
+ logger.error(`SecurityEventConnectionPoller: could not release source lock: ${redactLogString(ConnectorErrorMessage.toMessage(error))}`);
228
+ }
229
+ }
230
+ }
231
+ static validateConnection(connection) {
232
+ if (!connection.id || !connection.projectId || !connection.provider) {
233
+ throw new BadDataException("Security event connection is missing id, projectId or provider.");
234
+ }
235
+ }
236
+ static getWindow(connection, options, now = OneUptimeDate.getCurrentDate()) {
237
+ let endTime = now;
238
+ let startTime = OneUptimeDate.addRemoveMinutes(now, -DEFAULT_INITIAL_LOOKBACK_IN_MINUTES);
239
+ const warnings = [];
240
+ let hasUsableCursor = false;
241
+ if (options.type === "preview" || options.type === "backfill") {
242
+ startTime = new Date(options.startTime || "");
243
+ endTime = new Date(options.endTime || "");
244
+ if (!Number.isFinite(startTime.getTime()) ||
245
+ !Number.isFinite(endTime.getTime()) ||
246
+ startTime >= endTime ||
247
+ endTime.getTime() > now.getTime() + 60000 ||
248
+ endTime.getTime() - startTime.getTime() > MAX_RANGE_MS) {
249
+ throw new BadDataException("Select a valid past time range of at most seven days.");
250
+ }
251
+ }
252
+ else if (options.type === "test") {
253
+ startTime = OneUptimeDate.addRemoveMinutes(now, -24 * 60);
254
+ }
255
+ else if (options.type === "poll") {
256
+ const overlapInMinutes = this.getCursorOverlapInMinutes(connection.provider);
257
+ const chunkLimitInMinutes = this.getChunkLimitInMinutes(connection.lastPollResult);
258
+ let progressFrom = startTime;
259
+ let overlapFloor = undefined;
260
+ if (connection.cursor) {
261
+ const cursorTime = new Date(connection.cursor);
262
+ if (!Number.isFinite(cursorTime.getTime())) {
263
+ warnings.push("The saved cursor is unreadable; polling the default 24 hour window.");
264
+ }
265
+ else if (cursorTime >= now) {
266
+ warnings.push("The saved cursor is in the future; polling the default 24 hour window.");
267
+ }
268
+ else {
269
+ hasUsableCursor = true;
270
+ progressFrom = cursorTime;
271
+ startTime = OneUptimeDate.addRemoveMinutes(cursorTime, -overlapInMinutes);
272
+ /*
273
+ * After a forced advance the overlap must not reach back over the
274
+ * minute that overflowed: every such poll would overflow on the
275
+ * same records and force one more minute past, skipping up to the
276
+ * whole overlap (30 minutes for AWS Security Hub) instead of one.
277
+ * A floor later than the cursor cannot come from this poller, so
278
+ * it is ignored rather than allowed to skip ground.
279
+ */
280
+ const floor = this.readOverlapFloor(connection.lastPollResult);
281
+ if (floor && floor <= cursorTime && startTime < floor) {
282
+ overlapFloor = floor;
283
+ startTime = floor;
284
+ }
285
+ }
286
+ }
287
+ const chunkEnd = OneUptimeDate.addRemoveMinutes(progressFrom, chunkLimitInMinutes);
288
+ if (chunkEnd < endTime) {
289
+ endTime = chunkEnd;
290
+ warnings.push(`Catching up from ${hasUsableCursor ? "the saved cursor" : "the start of the default 24 hour window"} in ${chunkLimitInMinutes === MAX_CHUNK_MINUTES ? "24 hour" : `${chunkLimitInMinutes} minute`} windows. Later records will be fetched by subsequent polls.`);
291
+ }
292
+ return {
293
+ startTime,
294
+ endTime,
295
+ warnings,
296
+ hasUsableCursor,
297
+ overlapInMinutes,
298
+ progressFrom,
299
+ overlapFloor,
300
+ requestedChunkMinutes: chunkLimitInMinutes,
301
+ chunkMinutes: Math.max(MIN_CHUNK_MINUTES, Math.ceil((endTime.getTime() - progressFrom.getTime()) / MINUTE_IN_MS)),
302
+ };
303
+ }
304
+ return { startTime, endTime, warnings, hasUsableCursor };
305
+ }
306
+ /*
307
+ * The chunk the previous poll asked for. Anything that is not an integer
308
+ * in [MIN, MAX] (no previous poll, a row written before adaptive chunks
309
+ * existed, a hand-edited value) falls back to a full day, which is the
310
+ * behaviour a connection had before chunks adapted.
311
+ */
312
+ static getChunkLimitInMinutes(lastPollResult) {
313
+ const stored = lastPollResult === null || lastPollResult === void 0 ? void 0 : lastPollResult["nextChunkMinutes"];
314
+ if (typeof stored === "number" &&
315
+ Number.isInteger(stored) &&
316
+ stored >= MIN_CHUNK_MINUTES &&
317
+ stored <= MAX_CHUNK_MINUTES) {
318
+ return stored;
319
+ }
320
+ return MAX_CHUNK_MINUTES;
321
+ }
322
+ static readOverlapFloor(lastPollResult) {
323
+ const stored = lastPollResult === null || lastPollResult === void 0 ? void 0 : lastPollResult["overlapFloor"];
324
+ if (typeof stored !== "string") {
325
+ return undefined;
326
+ }
327
+ const floor = new Date(stored);
328
+ return Number.isFinite(floor.getTime()) ? floor : undefined;
329
+ }
330
+ static getCursorOverlapInMinutes(provider) {
331
+ var _a;
332
+ const overlap = (_a = getSecurityEventConnectorDefinition(provider)) === null || _a === void 0 ? void 0 : _a.cursorOverlapInMinutes;
333
+ if (typeof overlap === "number" &&
334
+ Number.isFinite(overlap) &&
335
+ overlap >= 0) {
336
+ return overlap;
337
+ }
338
+ return DEFAULT_CURSOR_OVERLAP_IN_MINUTES;
339
+ }
340
+ static async executeUnlocked(connection, options, overrides) {
341
+ const definition = getSecurityEventConnectorDefinition(connection.provider);
342
+ if (!definition) {
343
+ throw new BadDataException("Security event connection has an unsupported provider.");
344
+ }
345
+ const window = this.getWindow(connection, options);
346
+ const startedMs = Date.now();
347
+ const result = Object.assign(Object.assign({ type: options.type, provider: definition.provider }, (options.runId ? { runId: options.runId } : {})), { status: "running", startedAt: new Date(startedMs).toISOString(), completedAt: new Date(startedMs).toISOString(), durationMs: 0, windowStart: window.startTime.toISOString(), windowEnd: window.endTime.toISOString(), fetchedCount: 0, ingestedCount: 0, duplicateCount: 0, rejectedCount: 0, failedCount: 0, complete: true, requestCount: 0, warnings: window.warnings, samples: [], checks: [] });
348
+ let phase = "Validate configuration";
349
+ let phaseStartedMs = Date.now();
350
+ /*
351
+ * What the connector said about how far it got, kept outside the try so
352
+ * the cursor decision after it can use them.
353
+ */
354
+ let resumeAfter = undefined;
355
+ let onlyNormalizationFailed = false;
356
+ try {
357
+ const connector = (overrides === null || overrides === void 0 ? void 0 : overrides.connector) ||
358
+ SecurityEventConnectorRegistry.getConnector(definition.provider);
359
+ const settings = (overrides === null || overrides === void 0 ? void 0 : overrides.settings) ||
360
+ (await SecurityEventConnectionService.getConnectorSettings(connection));
361
+ connector.validateSettings(settings);
362
+ result.checks.push({
363
+ key: "configuration",
364
+ name: phase,
365
+ status: "pass",
366
+ durationMs: Date.now() - phaseStartedMs,
367
+ message: `The ${definition.title} configuration and credentials are present and well formed.`,
368
+ });
369
+ if (options.type === "test") {
370
+ phase = `Check access to ${definition.title}`;
371
+ phaseStartedMs = Date.now();
372
+ const checks = await connector.testConnection(settings, {
373
+ requestTimeoutInMs: POLL_REQUEST_TIMEOUT_IN_MS,
374
+ });
375
+ result.checks.push(...checks);
376
+ const failed = checks.find((check) => {
377
+ return check.status === "fail";
378
+ });
379
+ if (failed) {
380
+ throw new BadDataException(`${failed.name}: ${failed.message}`);
381
+ }
382
+ }
383
+ else {
384
+ phase = `Read ${definition.importedRecordName}s from ${definition.title}`;
385
+ phaseStartedMs = Date.now();
386
+ const fetched = await connector.fetchEvents(settings, { startTime: window.startTime, endTime: window.endTime }, {
387
+ maxRequests: MAX_FETCH_REQUESTS,
388
+ maxEvents: MAX_EVENTS_PER_RUN,
389
+ requestTimeoutInMs: POLL_REQUEST_TIMEOUT_IN_MS,
390
+ sampleLimit: MAX_DIAGNOSTIC_SAMPLES,
391
+ });
392
+ result.fetchedCount = fetched.fetchedCount;
393
+ result.rejectedCount = fetched.rejectedCount;
394
+ result.failedCount = fetched.failedCount;
395
+ result.requestCount = fetched.requestCount;
396
+ result.samples = fetched.samples.slice(0, MAX_DIAGNOSTIC_SAMPLES);
397
+ result.warnings.push(...fetched.warnings);
398
+ /*
399
+ * Rejected objects are not a reason to hold the cursor: a record the
400
+ * normalizer does not recognize will not become recognizable by
401
+ * re-reading the same window, so holding would pin polling behind it
402
+ * until the window can no longer reach the present. They are counted
403
+ * and warned about instead. Normalization FAILURES make the window
404
+ * incomplete, since a transient bug deserves a retry; the adaptive
405
+ * chunk below narrows around them and finally moves past them, so a
406
+ * record that never normalizes cannot pin polling either.
407
+ */
408
+ result.complete =
409
+ result.complete && fetched.complete && fetched.failedCount === 0;
410
+ /*
411
+ * A resume point only means something when the connector itself
412
+ * stopped early; a fetch that read its whole window has nothing to
413
+ * resume from.
414
+ */
415
+ resumeAfter = fetched.complete ? undefined : fetched.resumeAfter;
416
+ onlyNormalizationFailed = fetched.complete && fetched.failedCount > 0;
417
+ if (fetched.rejectedCount) {
418
+ result.warnings.push(`${fetched.rejectedCount} returned records were discarded because they do not look like ${definition.title} ${definition.importedRecordName}s.`);
419
+ }
420
+ if (fetched.failedCount) {
421
+ result.warnings.push(`${fetched.failedCount} records could not be normalized and were not imported.`);
422
+ }
423
+ result.checks.push({
424
+ key: "read",
425
+ name: phase,
426
+ status: fetched.failedCount
427
+ ? "fail"
428
+ : fetched.rejectedCount
429
+ ? "warn"
430
+ : "pass",
431
+ durationMs: Date.now() - phaseStartedMs,
432
+ message: `${fetched.events.length} ${definition.importedRecordName}s recognized; ${fetched.rejectedCount} rejected; ${fetched.failedCount} failed; ${fetched.requestCount} request${fetched.requestCount === 1 ? "" : "s"}.`,
433
+ });
434
+ if (options.type === "poll" || options.type === "backfill") {
435
+ phase = "Import records";
436
+ phaseStartedMs = Date.now();
437
+ await this.ingest(connection, definition, fetched.events, result);
438
+ result.checks.push({
439
+ key: "import",
440
+ name: phase,
441
+ status: "pass",
442
+ durationMs: Date.now() - phaseStartedMs,
443
+ message: `${result.ingestedCount} imported; ${result.duplicateCount} already imported.`,
444
+ });
445
+ }
446
+ }
447
+ result.status = !result.complete
448
+ ? "partial"
449
+ : options.type === "test" || result.fetchedCount > 0
450
+ ? "success"
451
+ : "empty";
452
+ }
453
+ catch (error) {
454
+ result.status = "failed";
455
+ result.complete = false;
456
+ result.error = redactLogString(ConnectorErrorMessage.toMessage(error, { truncate: false }));
457
+ result.checks.push({
458
+ key: "failure",
459
+ name: phase,
460
+ status: "fail",
461
+ durationMs: Date.now() - phaseStartedMs,
462
+ message: result.error,
463
+ });
464
+ }
465
+ result.completedAt = OneUptimeDate.getCurrentDate().toISOString();
466
+ result.durationMs = Math.max(0, Date.now() - startedMs);
467
+ // Decided before logging so the chunk warnings are logged with the rest.
468
+ const cursor = options.type === "poll"
469
+ ? this.planPollCursor({
470
+ window,
471
+ result,
472
+ resumeAfter,
473
+ onlyNormalizationFailed,
474
+ })
475
+ : undefined;
476
+ for (const warning of result.warnings) {
477
+ logger.warn(`SecurityEventConnectionPoller: connection ${connection.id.toString()}: ${warning}`);
478
+ }
479
+ if (options.type === "poll") {
480
+ await SecurityEventConnectionService.updateOneById({
481
+ id: connection.id,
482
+ data: Object.assign(Object.assign(Object.assign({ lastPolledAt: new Date(result.completedAt), lastPollResult: result,
483
+ // A forced advance puts its warning first, so lastError leads with it.
484
+ lastError: (result.error ||
485
+ (result.complete
486
+ ? null
487
+ : result.warnings.join(" ") ||
488
+ "Poll incomplete.")) }, (cursor ? { cursor } : {})), (result.complete
489
+ ? { lastSuccessfulPollAt: new Date(result.completedAt) }
490
+ : {})), (result.ingestedCount
491
+ ? { lastEventIngestedAt: new Date(result.completedAt) }
492
+ : {})),
493
+ props: { isRoot: true },
494
+ });
495
+ }
496
+ else if (options.type === "backfill" && result.ingestedCount) {
497
+ await SecurityEventConnectionService.updateOneById({
498
+ id: connection.id,
499
+ data: { lastEventIngestedAt: new Date(result.completedAt) },
500
+ props: { isRoot: true },
501
+ });
502
+ }
503
+ return result;
504
+ }
505
+ /*
506
+ * The F1 cursor and chunk rules for one scheduled poll. Records
507
+ * chunkMinutes, nextChunkMinutes and forcedAdvance on the result, adds the
508
+ * warning that explains what the next poll does, and returns the cursor to
509
+ * write (undefined keeps the stored cursor).
510
+ *
511
+ * Invariant: a cursor written after a usable cursor is strictly later than
512
+ * it. windowEnd is later because the chunk is measured from the cursor,
513
+ * and a resume point must be later to count as progress. The only other
514
+ * write is the first-poll anchor, which replaces a missing or unusable
515
+ * cursor.
516
+ *
517
+ * overlapFloor: a forced advance sets it to its window end; any other
518
+ * poll carries the floor its window was clamped to, and drops it once the
519
+ * cursor minus the overlap no longer reaches back past it.
520
+ */
521
+ static planPollCursor(data) {
522
+ var _a, _b, _c;
523
+ const { window, result } = data;
524
+ const overlapInMinutes = (_a = window.overlapInMinutes) !== null && _a !== void 0 ? _a : DEFAULT_CURSOR_OVERLAP_IN_MINUTES;
525
+ const progressFrom = window.progressFrom || window.startTime;
526
+ const chunkMinutes = (_b = window.chunkMinutes) !== null && _b !== void 0 ? _b : MAX_CHUNK_MINUTES;
527
+ const requestedChunkMinutes = (_c = window.requestedChunkMinutes) !== null && _c !== void 0 ? _c : MAX_CHUNK_MINUTES;
528
+ /*
529
+ * The first poll has no cursor to hold. Anchoring one overlap past the
530
+ * window start makes the next poll's window start at the same instant,
531
+ * instead of restarting a day before whenever it runs.
532
+ */
533
+ const firstPollAnchor = window.hasUsableCursor
534
+ ? undefined
535
+ : OneUptimeDate.addRemoveMinutes(window.startTime, overlapInMinutes).toISOString();
536
+ result.chunkMinutes = chunkMinutes;
537
+ if (window.overlapFloor) {
538
+ result.overlapFloor = window.overlapFloor.toISOString();
539
+ }
540
+ if (result.status === "failed") {
541
+ /*
542
+ * A failure is not a volume signal, so the cursor and the requested
543
+ * chunk are kept — with one exception. A request that timed out on a
544
+ * wide window usually means the window itself is too heavy (Splunk
545
+ * sorts the whole window on the search head before returning a row),
546
+ * and retrying the same window would time out forever. Halve it, as a
547
+ * poll that could not read its window would.
548
+ */
549
+ if (chunkMinutes > MIN_CHUNK_MINUTES &&
550
+ TIMEOUT_ERROR_PATTERN.test(result.error || "")) {
551
+ const nextChunkMinutes = Math.max(MIN_CHUNK_MINUTES, Math.floor(chunkMinutes / 2));
552
+ result.nextChunkMinutes = nextChunkMinutes;
553
+ result.warnings.push(`The source did not answer in time for this window; the next poll reads a ${nextChunkMinutes} minute window from the same starting point.`);
554
+ return firstPollAnchor;
555
+ }
556
+ result.nextChunkMinutes = requestedChunkMinutes;
557
+ return firstPollAnchor;
558
+ }
559
+ if (result.complete) {
560
+ // A finished poll never shrinks the chunk; after narrowing it doubles back.
561
+ result.nextChunkMinutes = Math.min(MAX_CHUNK_MINUTES, Math.max(requestedChunkMinutes, chunkMinutes * 2));
562
+ return result.windowEnd;
563
+ }
564
+ /*
565
+ * Progress means past the previous cursor, not merely past the window
566
+ * start: records inside the overlap were already read by an earlier
567
+ * poll, so resuming inside it would re-read the same records forever.
568
+ * Without a usable cursor the previous "cursor" is the first-poll anchor
569
+ * (window start plus overlap). The saved cursor is used directly rather
570
+ * than window start plus overlap, because an overlap floor moves the
571
+ * window start later and would otherwise hide real progress.
572
+ */
573
+ const previousCursorMs = window.hasUsableCursor
574
+ ? progressFrom.getTime()
575
+ : window.startTime.getTime() + overlapInMinutes * MINUTE_IN_MS;
576
+ const resumeAfterMs = data.resumeAfter instanceof Date &&
577
+ Number.isFinite(data.resumeAfter.getTime())
578
+ ? data.resumeAfter.getTime()
579
+ : undefined;
580
+ if (resumeAfterMs !== undefined &&
581
+ resumeAfterMs > previousCursorMs &&
582
+ resumeAfterMs <= window.endTime.getTime()) {
583
+ const resumeAt = new Date(resumeAfterMs).toISOString();
584
+ // The connector reads ascending, so the same length keeps moving.
585
+ result.nextChunkMinutes = requestedChunkMinutes;
586
+ /*
587
+ * Resume exactly where this poll stopped, without the overlap. The
588
+ * overlap exists for records delivered late while a connection is
589
+ * caught up; during a backlog it only re-reads what this poll just
590
+ * read. With a 30 minute overlap (AWS Security Hub) and more than one
591
+ * run's worth of records inside those 30 minutes, every following poll
592
+ * would re-read only duplicates, never pass the cursor, and end in a
593
+ * forced advance past records nobody read. The floor is dropped once
594
+ * the cursor has moved one overlap past it, which restores the overlap.
595
+ */
596
+ result.overlapFloor = resumeAt;
597
+ result.warnings.push(`This poll stopped before the end of its window after reading records created up to ${resumeAt}; the next poll resumes from there.`);
598
+ return resumeAt;
599
+ }
600
+ if (chunkMinutes > MIN_CHUNK_MINUTES) {
601
+ const nextChunkMinutes = Math.max(MIN_CHUNK_MINUTES, Math.floor(chunkMinutes / 2));
602
+ result.nextChunkMinutes = nextChunkMinutes;
603
+ result.warnings.push(data.onlyNormalizationFailed
604
+ ? `Some records in this window could not be normalized; the next poll reads a ${nextChunkMinutes} minute window from the same starting point to retry them.`
605
+ : `This window holds more records than one poll can read; the next poll reads a ${nextChunkMinutes} minute window from the same starting point.`);
606
+ return firstPollAnchor;
607
+ }
608
+ /*
609
+ * A one-minute chunk that still cannot be read. Narrowing further is
610
+ * impossible and holding would stall the connection for good, so move
611
+ * past this minute and say so loudly. The warning goes first so it
612
+ * also leads lastError.
613
+ */
614
+ const minuteStart = progressFrom.toISOString();
615
+ result.forcedAdvance = true;
616
+ result.nextChunkMinutes = MIN_CHUNK_MINUTES;
617
+ result.overlapFloor = result.windowEnd;
618
+ result.warnings.unshift(data.onlyNormalizationFailed
619
+ ? `${result.failedCount} records created in the one minute from ${minuteStart} to ${result.windowEnd} could not be normalized. Polling moved past this minute so newer records keep arriving; use Import this time range in Diagnostics on this minute to retry them.`
620
+ : `More records were created in the one minute from ${minuteStart} to ${result.windowEnd} than one poll can read. Polling moved past this minute so newer records keep arriving; use Import this time range in Diagnostics on this minute to recover what one run can read.`);
621
+ return result.windowEnd;
622
+ }
623
+ static async ingest(connection, definition, normalized, result) {
624
+ if (!normalized.length) {
625
+ return;
626
+ }
627
+ const seen = new Set();
628
+ const unique = normalized.filter((event) => {
629
+ if (seen.has(event.eventUid)) {
630
+ result.duplicateCount++;
631
+ return false;
632
+ }
633
+ seen.add(event.eventUid);
634
+ return true;
635
+ });
636
+ const existing = await SecurityEventDedupe.findExistingEventUids({
637
+ projectId: connection.projectId,
638
+ vendorName: definition.vendorName,
639
+ productName: definition.productName,
640
+ ids: unique.map((event) => {
641
+ return event.eventUid;
642
+ }),
643
+ });
644
+ const fresh = unique.filter((event) => {
645
+ if (existing.has(event.eventUid)) {
646
+ result.duplicateCount++;
647
+ return false;
648
+ }
649
+ return true;
650
+ });
651
+ if (!fresh.length) {
652
+ return;
653
+ }
654
+ const serviceMetadata = await OTelIngestService.telemetryServiceFromName({
655
+ serviceName: definition.productName,
656
+ projectId: connection.projectId,
657
+ });
658
+ const retentionDays = resolveTelemetryRetentionInDays({
659
+ pillar: "securityEvents",
660
+ serviceConfig: serviceMetadata.serviceRetentionConfig,
661
+ serviceRetentionInDays: serviceMetadata.serviceRetentionInDays,
662
+ projectConfig: serviceMetadata.projectRetentionConfig,
663
+ projectRetentionInDays: serviceMetadata.projectRetentionInDays,
664
+ });
665
+ await ThreatIntelEnricher.enrichNormalizedEvents({
666
+ projectId: connection.projectId,
667
+ events: fresh,
668
+ });
669
+ const rows = fresh.map((event) => {
670
+ event.vendorName = definition.vendorName;
671
+ event.productName = definition.productName;
672
+ event.attributes["oneuptime.security_connection.id"] =
673
+ connection.id.toString();
674
+ event.attributes["oneuptime.security_connection.provider"] =
675
+ definition.provider;
676
+ return buildSecurityEventDbRow({
677
+ normalized: event,
678
+ projectId: connection.projectId,
679
+ serviceMetadata,
680
+ retentionDays,
681
+ });
682
+ });
683
+ /*
684
+ * The source lock cannot be released before buffered writes are
685
+ * visible, so this low-volume path asks for synchronous acknowledgement
686
+ * regardless of the high-volume telemetry defaults.
687
+ */
688
+ await SecurityEventService.insertJsonRows(rows, {
689
+ clickhouseSettings: { async_insert: 0, insert_distributed_sync: 1 },
690
+ });
691
+ result.ingestedCount = rows.length;
692
+ const times = rows
693
+ .map((row) => {
694
+ return new Date(String(row["time"]).replace(" ", "T") + "Z").toISOString();
695
+ })
696
+ .sort();
697
+ result.eventTimeStart = times[0];
698
+ result.eventTimeEnd = times[times.length - 1];
699
+ }
700
+ }
701
+ __decorate([
702
+ CaptureSpan(),
703
+ __metadata("design:type", Function),
704
+ __metadata("design:paramtypes", []),
705
+ __metadata("design:returntype", Promise)
706
+ ], SecurityEventConnectionPoller, "pollAllDueConnections", null);
707
+ __decorate([
708
+ CaptureSpan(),
709
+ __metadata("design:type", Function),
710
+ __metadata("design:paramtypes", [SecurityEventConnection, Object]),
711
+ __metadata("design:returntype", Promise)
712
+ ], SecurityEventConnectionPoller, "pollConnection", null);
713
+ __decorate([
714
+ CaptureSpan(),
715
+ __metadata("design:type", Function),
716
+ __metadata("design:paramtypes", [SecurityEventConnection, Object, Object]),
717
+ __metadata("design:returntype", Promise)
718
+ ], SecurityEventConnectionPoller, "executeConnection", null);
719
+ //# sourceMappingURL=SecurityEventConnectionPoller.js.map