@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,767 @@
1
+ import BadDataException from "../../../../../Types/Exception/BadDataException";
2
+ import { JSONObject } from "../../../../../Types/JSON";
3
+ import NormalizedSecurityEvent from "../../../../../Types/SecurityEvent/NormalizedSecurityEvent";
4
+ import {
5
+ SecurityConnectorCheck,
6
+ SecurityConnectorSample,
7
+ } from "../../../../../Types/SecurityEvent/Connectors/ConnectorDiagnostics";
8
+ import SecurityEventConnectorProvider from "../../../../../Types/SecurityEvent/Connectors/SecurityEventConnectorProvider";
9
+ import {
10
+ ConnectorField,
11
+ SecurityEventConnectorDefinition,
12
+ getSecurityEventConnectorDefinition,
13
+ } from "../../../../../Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog";
14
+ import CrowdStrikeFalconNormalizer from "../../../../../Utils/SecurityEvent/Connectors/CrowdStrikeFalconNormalizer";
15
+ import {
16
+ parseEventTime,
17
+ readString,
18
+ readValue,
19
+ } from "../../../../../Utils/SecurityEvent/NormalizerHelpers";
20
+ import DataSourceHttpFetch, {
21
+ DataSourceHttpRequest,
22
+ DataSourceHttpResponse,
23
+ } from "../../../DataSource/HttpFetch";
24
+ import { redactLogString } from "../../../LogRedaction";
25
+ import ConnectorErrorMessage from "../../ConnectorErrorMessage";
26
+ import {
27
+ ConnectorFetchOptions,
28
+ ConnectorFetchResult,
29
+ ConnectorFetchWindow,
30
+ ConnectorTestOptions,
31
+ ConnectorTransport,
32
+ SecurityConnectorSettings,
33
+ SecurityEventConnector,
34
+ makeCheck,
35
+ readSettingString,
36
+ } from "../Types";
37
+ import CrowdStrikeFalconClient, {
38
+ CROWDSTRIKE_ALERTS_OFFSET_CEILING,
39
+ CROWDSTRIKE_ALERTS_PAGE_SIZE,
40
+ CROWDSTRIKE_FALCON_CLOUDS,
41
+ CrowdStrikeAlertCount,
42
+ CrowdStrikeAlertIdsPage,
43
+ CrowdStrikeFalconCloud,
44
+ getCrowdStrikeFalconBaseUrl,
45
+ } from "./CrowdStrikeFalconClient";
46
+
47
+ /*
48
+ * CrowdStrike Falcon connector: alerts through the Alerts API, listed by
49
+ * the time Falcon CREATED the alert (created_timestamp), never by the
50
+ * time of the underlying activity (`timestamp`). An alert Falcon raises
51
+ * an hour after the behaviour it describes still lands in the poll
52
+ * window that covers its creation, which is the whole point of the
53
+ * framework (see Connectors/Types.ts).
54
+ *
55
+ * Each page of the window costs two requests: an ids query
56
+ * (GET /alerts/queries/alerts/v2, sorted created_timestamp ascending)
57
+ * and one entity fetch (POST /alerts/entities/alerts/v2) for exactly that
58
+ * page's ids. The page size equals the entity batch size so the two
59
+ * never drift apart.
60
+ *
61
+ * Settings come from the catalog's keys: config.clientId, config.cloud
62
+ * and secrets.clientSecret.
63
+ */
64
+
65
+ interface ResumePoint {
66
+ resumeAfter: Date | undefined;
67
+ // True when the alerts read were not in created_timestamp order.
68
+ outOfOrder: boolean;
69
+ }
70
+
71
+ interface ParsedSettings {
72
+ clientId: string;
73
+ clientSecret: string;
74
+ cloud: CrowdStrikeFalconCloud;
75
+ }
76
+
77
+ /*
78
+ * Falcon API client ids are opaque hex strings today, but the format is
79
+ * not documented as a contract, so validation only rejects what can never
80
+ * be an id: whitespace, quotes and anything unreasonably long. A wrong id
81
+ * is caught by the authentication check instead.
82
+ */
83
+ const CLIENT_ID_REGEX: RegExp = /^[A-Za-z0-9_.:-]{8,128}$/;
84
+
85
+ const DAY_IN_MS: number = 24 * 60 * 60 * 1000;
86
+
87
+ const CHECK_NAME_AUTHENTICATION: string =
88
+ "Authenticate with CrowdStrike Falcon";
89
+ const CHECK_NAME_READ: string = "Read alerts from the Falcon Alerts API";
90
+ const CHECK_NAME_AVAILABLE: string = "Alerts available to import";
91
+
92
+ /*
93
+ * The production transport drops response headers on error statuses, so
94
+ * the X-RateLimit-RetryAfter value is only in the message when a transport
95
+ * kept it; the advice must not depend on it being there.
96
+ */
97
+ const RATE_LIMIT_REMEDIATION: string =
98
+ "Falcon is rate limiting this API client. Wait a few minutes (at least the X-RateLimit-RetryAfter period when the message names one) and test again; scheduled polls retry automatically.";
99
+
100
+ export default class CrowdStrikeFalconConnector
101
+ implements SecurityEventConnector
102
+ {
103
+ public provider: SecurityEventConnectorProvider =
104
+ SecurityEventConnectorProvider.CrowdStrikeFalcon;
105
+
106
+ private transport: ConnectorTransport;
107
+
108
+ public constructor(transport?: ConnectorTransport | undefined) {
109
+ this.transport =
110
+ transport ||
111
+ ((request: DataSourceHttpRequest): Promise<DataSourceHttpResponse> => {
112
+ return DataSourceHttpFetch.fetch(request);
113
+ });
114
+ }
115
+
116
+ private static getDefinition(): SecurityEventConnectorDefinition {
117
+ const definition: SecurityEventConnectorDefinition | undefined =
118
+ getSecurityEventConnectorDefinition(
119
+ SecurityEventConnectorProvider.CrowdStrikeFalcon,
120
+ );
121
+
122
+ if (!definition) {
123
+ throw new BadDataException(
124
+ "CrowdStrike Falcon is missing from the connector catalog.",
125
+ );
126
+ }
127
+
128
+ return definition;
129
+ }
130
+
131
+ /*
132
+ * Validation messages name the field the way the form does, read from
133
+ * the catalog so a retitled field cannot leave a stale name here.
134
+ */
135
+ private static fieldTitle(key: string): string {
136
+ const definition: SecurityEventConnectorDefinition = this.getDefinition();
137
+ const field: ConnectorField | undefined = [
138
+ ...definition.configFields,
139
+ ...definition.secretFields,
140
+ ].find((candidate: ConnectorField): boolean => {
141
+ return candidate.key === key;
142
+ });
143
+
144
+ return field?.title || key;
145
+ }
146
+
147
+ private static parseSettings(
148
+ settings: SecurityConnectorSettings,
149
+ ): ParsedSettings {
150
+ const clientId: string = readSettingString(settings.config, "clientId");
151
+ const cloud: string = (
152
+ readSettingString(settings.config, "cloud") || "us-1"
153
+ ).toLowerCase();
154
+ const clientSecret: string = readSettingString(
155
+ settings.secrets,
156
+ "clientSecret",
157
+ );
158
+
159
+ if (!clientId || !CLIENT_ID_REGEX.test(clientId)) {
160
+ throw new BadDataException(
161
+ `${this.fieldTitle("clientId")} must be the Falcon API client ID shown under API clients and keys in the Falcon console.`,
162
+ );
163
+ }
164
+
165
+ if (!getCrowdStrikeFalconBaseUrl(cloud)) {
166
+ throw new BadDataException(
167
+ `${this.fieldTitle("cloud")} must be one of: ${CROWDSTRIKE_FALCON_CLOUDS.join(", ")}.`,
168
+ );
169
+ }
170
+
171
+ if (!clientSecret) {
172
+ throw new BadDataException(
173
+ `${this.fieldTitle("clientSecret")} is required.`,
174
+ );
175
+ }
176
+
177
+ return { clientId, clientSecret, cloud: cloud as CrowdStrikeFalconCloud };
178
+ }
179
+
180
+ public validateSettings(settings: SecurityConnectorSettings): void {
181
+ CrowdStrikeFalconConnector.parseSettings(settings);
182
+ }
183
+
184
+ private buildClient(
185
+ parsed: ParsedSettings,
186
+ requestTimeoutInMs: number,
187
+ ): CrowdStrikeFalconClient {
188
+ return new CrowdStrikeFalconClient({
189
+ cloud: parsed.cloud,
190
+ clientId: parsed.clientId,
191
+ clientSecret: parsed.clientSecret,
192
+ transport: this.transport,
193
+ requestTimeoutInMs,
194
+ });
195
+ }
196
+
197
+ /*
198
+ * Three provider checks, in dependency order. Each later check is
199
+ * skipped rather than failed when an earlier one fails, so the report
200
+ * names one root cause instead of three symptoms of it.
201
+ */
202
+ public async testConnection(
203
+ settings: SecurityConnectorSettings,
204
+ options: ConnectorTestOptions,
205
+ ): Promise<Array<SecurityConnectorCheck>> {
206
+ const checks: Array<SecurityConnectorCheck> = [];
207
+ let parsed: ParsedSettings;
208
+ let startedAtMs: number = Date.now();
209
+
210
+ try {
211
+ parsed = CrowdStrikeFalconConnector.parseSettings(settings);
212
+ } catch (error) {
213
+ checks.push(
214
+ makeCheck({
215
+ key: "authentication",
216
+ name: CHECK_NAME_AUTHENTICATION,
217
+ status: "fail",
218
+ startedAtMs,
219
+ message: redactLogString(ConnectorErrorMessage.toMessage(error)),
220
+ remediation:
221
+ "Correct the highlighted setting and test again. Nothing was contacted.",
222
+ }),
223
+ );
224
+ return checks;
225
+ }
226
+
227
+ const client: CrowdStrikeFalconClient = this.buildClient(
228
+ parsed,
229
+ options.requestTimeoutInMs,
230
+ );
231
+
232
+ try {
233
+ await client.getAccessToken();
234
+ checks.push(
235
+ makeCheck({
236
+ key: "authentication",
237
+ name: CHECK_NAME_AUTHENTICATION,
238
+ status: "pass",
239
+ startedAtMs,
240
+ message: `Falcon issued an OAuth2 access token for the ${parsed.cloud.toUpperCase()} cloud (${new URL(client.getBaseUrl()).host}).`,
241
+ }),
242
+ );
243
+ } catch (error) {
244
+ const message: string = redactLogString(
245
+ ConnectorErrorMessage.toMessage(error, { truncate: false }),
246
+ );
247
+ checks.push(
248
+ makeCheck({
249
+ key: "authentication",
250
+ name: CHECK_NAME_AUTHENTICATION,
251
+ status: "fail",
252
+ startedAtMs,
253
+ message,
254
+ remediation: CrowdStrikeFalconConnector.authenticationRemediation(
255
+ message,
256
+ parsed.cloud,
257
+ ),
258
+ }),
259
+ );
260
+ checks.push(
261
+ CrowdStrikeFalconConnector.skipped(
262
+ "read-permission",
263
+ CHECK_NAME_READ,
264
+ "Skipped because authentication failed.",
265
+ ),
266
+ );
267
+ checks.push(
268
+ CrowdStrikeFalconConnector.skipped(
269
+ "detections-available",
270
+ CHECK_NAME_AVAILABLE,
271
+ "Skipped because authentication failed.",
272
+ ),
273
+ );
274
+ return checks;
275
+ }
276
+
277
+ const now: Date = new Date();
278
+ const dayAgo: Date = new Date(now.getTime() - DAY_IN_MS);
279
+ const weekAgo: Date = new Date(now.getTime() - 7 * DAY_IN_MS);
280
+
281
+ startedAtMs = Date.now();
282
+
283
+ try {
284
+ const page: CrowdStrikeAlertIdsPage = await client.queryAlertIds({
285
+ filter: CrowdStrikeFalconClient.buildCreatedTimestampFilter(
286
+ dayAgo,
287
+ now,
288
+ ),
289
+ limit: 1,
290
+ offset: 0,
291
+ });
292
+ checks.push(
293
+ makeCheck({
294
+ key: "read-permission",
295
+ name: CHECK_NAME_READ,
296
+ status: "pass",
297
+ startedAtMs,
298
+ message: `The Alerts API accepted a query with the Alerts: Read scope (${page.compositeIds.length} alert id${page.compositeIds.length === 1 ? "" : "s"} returned for a one-record probe over the last 24 hours).`,
299
+ }),
300
+ );
301
+ } catch (error) {
302
+ const message: string = redactLogString(
303
+ ConnectorErrorMessage.toMessage(error, { truncate: false }),
304
+ );
305
+ checks.push(
306
+ makeCheck({
307
+ key: "read-permission",
308
+ name: CHECK_NAME_READ,
309
+ status: "fail",
310
+ startedAtMs,
311
+ message,
312
+ remediation: CrowdStrikeFalconConnector.readRemediation(
313
+ message,
314
+ parsed.cloud,
315
+ ),
316
+ }),
317
+ );
318
+ checks.push(
319
+ CrowdStrikeFalconConnector.skipped(
320
+ "detections-available",
321
+ CHECK_NAME_AVAILABLE,
322
+ "Skipped because the read check failed.",
323
+ ),
324
+ );
325
+ return checks;
326
+ }
327
+
328
+ startedAtMs = Date.now();
329
+
330
+ try {
331
+ const last24h: CrowdStrikeAlertCount =
332
+ await client.countAlertsCreatedBetween({
333
+ startTime: dayAgo,
334
+ endTime: now,
335
+ });
336
+ const last7d: CrowdStrikeAlertCount =
337
+ await client.countAlertsCreatedBetween({
338
+ startTime: weekAgo,
339
+ endTime: now,
340
+ });
341
+
342
+ const label24h: string = CrowdStrikeFalconConnector.countLabel(last24h);
343
+ const label7d: string = CrowdStrikeFalconConnector.countLabel(last7d);
344
+ const nothing: boolean = last24h.count === 0 && last7d.count === 0;
345
+
346
+ checks.push(
347
+ makeCheck({
348
+ key: "detections-available",
349
+ name: CHECK_NAME_AVAILABLE,
350
+ status: nothing ? "warn" : "pass",
351
+ startedAtMs,
352
+ message: nothing
353
+ ? "No alerts were created in the last 7 days. Polling will import new alerts as Falcon creates them."
354
+ : `${label24h} alert${label24h === "1" ? "" : "s"} created in the last 24 hours and ${label7d} in the last 7 days.`,
355
+ ...(nothing
356
+ ? {
357
+ remediation:
358
+ "Confirm that alerts exist for this CID in the Falcon console (Endpoint security > Endpoint detections, or Next-Gen SIEM > Alerts). A CID with no sensors deployed produces none.",
359
+ }
360
+ : {}),
361
+ details: {
362
+ createdLast24h: label24h,
363
+ createdLast7d: label7d,
364
+ hasMoreLast24h: !last24h.exact,
365
+ hasMoreLast7d: !last7d.exact,
366
+ },
367
+ }),
368
+ );
369
+ } catch (error) {
370
+ const message: string = redactLogString(
371
+ ConnectorErrorMessage.toMessage(error, { truncate: false }),
372
+ );
373
+ checks.push(
374
+ makeCheck({
375
+ key: "detections-available",
376
+ name: CHECK_NAME_AVAILABLE,
377
+ status: "fail",
378
+ startedAtMs,
379
+ message,
380
+ remediation: CrowdStrikeFalconConnector.readRemediation(
381
+ message,
382
+ parsed.cloud,
383
+ ),
384
+ }),
385
+ );
386
+ }
387
+
388
+ return checks;
389
+ }
390
+
391
+ private static skipped(
392
+ key: string,
393
+ name: string,
394
+ message: string,
395
+ ): SecurityConnectorCheck {
396
+ return makeCheck({
397
+ key,
398
+ name,
399
+ status: "skip",
400
+ startedAtMs: Date.now(),
401
+ message,
402
+ });
403
+ }
404
+
405
+ private static countLabel(count: CrowdStrikeAlertCount): string {
406
+ return count.exact ? String(count.count) : `${count.count}+`;
407
+ }
408
+
409
+ /*
410
+ * Remediation keyed off the HTTP status the client put in the message,
411
+ * so the check tells the reader what to change instead of quoting
412
+ * Falcon. Falcon answers a client from another cloud with 401/403 at
413
+ * the token endpoint, which reads like a bad secret, so the cloud is
414
+ * named first.
415
+ */
416
+ private static authenticationRemediation(
417
+ message: string,
418
+ cloud: CrowdStrikeFalconCloud,
419
+ ): string {
420
+ if (message.includes("(HTTP 401)") || message.includes("(HTTP 403)")) {
421
+ return `Falcon rejected the client credentials. Check that the Falcon cloud (${cloud}) is the cloud your CID is hosted in (Support and resources > API clients and keys shows the cloud next to the client), that the Client ID matches that API client, and that the Client secret is the one issued with it. Secrets are shown once; if it was lost, reset it in the Falcon console and use Update credentials here.`;
422
+ }
423
+
424
+ if (message.includes("(HTTP 429)")) {
425
+ return RATE_LIMIT_REMEDIATION;
426
+ }
427
+
428
+ if (message.includes("could not be completed")) {
429
+ return `Falcon did not answer in time. Check outbound connectivity from the OneUptime API and worker processes to ${new URL(getCrowdStrikeFalconBaseUrl(cloud) || "https://api.crowdstrike.com").host}.`;
430
+ }
431
+
432
+ return "Read the message prefix to see which step failed, then follow the troubleshooting section of the CrowdStrike Falcon integration docs.";
433
+ }
434
+
435
+ private static readRemediation(
436
+ message: string,
437
+ cloud: CrowdStrikeFalconCloud,
438
+ ): string {
439
+ if (message.includes("(HTTP 403)")) {
440
+ return "The token was accepted but the Alerts API refused the query. In the Falcon console, open Support and resources > API clients and keys, edit this API client and enable the Alerts: Read scope, then save. Scope changes apply to the next token, so test again after a minute.";
441
+ }
442
+
443
+ if (message.includes("(HTTP 401)")) {
444
+ return `The token was minted but the Alerts API refused it. Check that the Falcon cloud (${cloud}) matches the cloud of the CID that issued the API client.`;
445
+ }
446
+
447
+ if (message.includes("(HTTP 429)")) {
448
+ return RATE_LIMIT_REMEDIATION;
449
+ }
450
+
451
+ if (message.includes("(HTTP 400)")) {
452
+ return "Falcon rejected the alerts query. The connector sends a fixed FQL filter on created_timestamp; copy the report and contact OneUptime support with it.";
453
+ }
454
+
455
+ if (message.includes("could not be completed")) {
456
+ return `Falcon did not answer in time. Check outbound connectivity from the OneUptime API and worker processes to ${new URL(getCrowdStrikeFalconBaseUrl(cloud) || "https://api.crowdstrike.com").host}.`;
457
+ }
458
+
459
+ return "Read the message prefix to see which step failed, then follow the troubleshooting section of the CrowdStrike Falcon integration docs.";
460
+ }
461
+
462
+ /*
463
+ * Read every alert created in the window, oldest first, page by page,
464
+ * within the request and event budgets and Falcon's 10,000 offset
465
+ * ceiling. When any of the three stops the read, the result is
466
+ * complete=false with resumeAfter set to the created_timestamp of the
467
+ * last alert read: the ids query sorts created_timestamp ascending, so
468
+ * every alert created before that point has been read, and the poller
469
+ * moves its cursor there and starts the next query again at offset 0.
470
+ * Without it the poller re-read the same first 9,000 alerts forever
471
+ * (review finding connector-bound-hit-permanent-stall).
472
+ */
473
+ public async fetchEvents(
474
+ settings: SecurityConnectorSettings,
475
+ window: ConnectorFetchWindow,
476
+ options: ConnectorFetchOptions,
477
+ ): Promise<ConnectorFetchResult> {
478
+ const parsed: ParsedSettings =
479
+ CrowdStrikeFalconConnector.parseSettings(settings);
480
+ const client: CrowdStrikeFalconClient = this.buildClient(
481
+ parsed,
482
+ options.requestTimeoutInMs,
483
+ );
484
+
485
+ const filter: string = CrowdStrikeFalconClient.buildCreatedTimestampFilter(
486
+ window.startTime,
487
+ window.endTime,
488
+ );
489
+ const warnings: Array<string> = [];
490
+ // Alerts in the order the ids query listed them, i.e. creation order.
491
+ const rawAlerts: Array<JSONObject> = [];
492
+ /*
493
+ * Offset paging runs over live data: an alert created between two
494
+ * pages shifts every later page by one, so an id can repeat. Repeats
495
+ * are dropped here rather than counted twice downstream.
496
+ */
497
+ const seenCompositeIds: Set<string> = new Set<string>();
498
+ let boundWarning: string | null = null;
499
+ let offset: number = 0;
500
+
501
+ for (;;) {
502
+ /*
503
+ * Every page costs an ids query and an entity fetch (plus the token
504
+ * request on the first page). The budget is checked before the pair
505
+ * so a page is never half-read.
506
+ */
507
+ const requestsNeeded: number = client.getRequestCount() === 0 ? 3 : 2;
508
+
509
+ if (client.getRequestCount() + requestsNeeded > options.maxRequests) {
510
+ boundWarning = `Stopped after ${client.getRequestCount()} requests before reading the whole window.`;
511
+ break;
512
+ }
513
+
514
+ /*
515
+ * Falcon's query index cannot page past 10,000 results. The window's
516
+ * remaining alerts are still reachable: the resume point lets the
517
+ * next poll query them from offset 0.
518
+ */
519
+ if (
520
+ offset + CROWDSTRIKE_ALERTS_PAGE_SIZE >
521
+ CROWDSTRIKE_ALERTS_OFFSET_CEILING
522
+ ) {
523
+ boundWarning = `Falcon's alerts query cannot page past ${CROWDSTRIKE_ALERTS_OFFSET_CEILING} results and this window holds more.`;
524
+ break;
525
+ }
526
+
527
+ const page: CrowdStrikeAlertIdsPage = await client.queryAlertIds({
528
+ filter,
529
+ limit: CROWDSTRIKE_ALERTS_PAGE_SIZE,
530
+ offset,
531
+ });
532
+
533
+ const newIds: Array<string> = page.compositeIds.filter(
534
+ (compositeId: string): boolean => {
535
+ if (seenCompositeIds.has(compositeId)) {
536
+ return false;
537
+ }
538
+
539
+ seenCompositeIds.add(compositeId);
540
+ return true;
541
+ },
542
+ );
543
+
544
+ const remaining: number = options.maxEvents - rawAlerts.length;
545
+ let idsToFetch: Array<string> = newIds;
546
+ let eventBoundHit: boolean = false;
547
+
548
+ if (newIds.length > remaining) {
549
+ idsToFetch = newIds.slice(0, Math.max(0, remaining));
550
+ eventBoundHit = true;
551
+ }
552
+
553
+ if (idsToFetch.length > 0) {
554
+ rawAlerts.push(
555
+ ...CrowdStrikeFalconConnector.inQueryOrder(
556
+ idsToFetch,
557
+ await client.getAlerts(idsToFetch),
558
+ ),
559
+ );
560
+ }
561
+
562
+ if (eventBoundHit) {
563
+ boundWarning = `Stopped after collecting ${options.maxEvents} alerts; the window holds more.`;
564
+ break;
565
+ }
566
+
567
+ offset += page.compositeIds.length;
568
+
569
+ /*
570
+ * The window is fully read when Falcon says so (offset reached the
571
+ * reported total) or when it returned a short page. Both are
572
+ * checked because `total` is occasionally absent.
573
+ */
574
+ const reachedTotal: boolean = page.total !== null && offset >= page.total;
575
+ const shortPage: boolean =
576
+ page.compositeIds.length < CROWDSTRIKE_ALERTS_PAGE_SIZE;
577
+
578
+ if (reachedTotal || shortPage || page.compositeIds.length === 0) {
579
+ break;
580
+ }
581
+
582
+ if (rawAlerts.length >= options.maxEvents) {
583
+ boundWarning = `Stopped after collecting ${options.maxEvents} alerts; the window holds more.`;
584
+ break;
585
+ }
586
+ }
587
+
588
+ const events: Array<NormalizedSecurityEvent> = [];
589
+ const samples: Array<SecurityConnectorSample> = [];
590
+ const failedAlerts: Set<JSONObject> = new Set<JSONObject>();
591
+ let rejectedCount: number = 0;
592
+ let failedCount: number = 0;
593
+
594
+ for (const raw of rawAlerts) {
595
+ if (!CrowdStrikeFalconNormalizer.isRecognized(raw)) {
596
+ rejectedCount++;
597
+ continue;
598
+ }
599
+
600
+ try {
601
+ const normalized: NormalizedSecurityEvent =
602
+ CrowdStrikeFalconNormalizer.normalize(raw);
603
+ events.push(normalized);
604
+
605
+ if (samples.length < options.sampleLimit) {
606
+ samples.push({
607
+ id: normalized.eventUid,
608
+ title: normalized.message,
609
+ severity: normalized.severityName,
610
+ createdTime: readString(raw, "created_timestamp") || undefined,
611
+ eventTime:
612
+ readString(raw, "timestamp") || normalized.time.toISOString(),
613
+ });
614
+ }
615
+ } catch {
616
+ failedCount++;
617
+ failedAlerts.add(raw);
618
+ }
619
+ }
620
+
621
+ let resumeAfter: Date | undefined = undefined;
622
+
623
+ if (boundWarning !== null) {
624
+ const resume: ResumePoint = CrowdStrikeFalconConnector.findResumePoint(
625
+ rawAlerts,
626
+ failedAlerts,
627
+ window,
628
+ );
629
+ resumeAfter = resume.resumeAfter;
630
+
631
+ warnings.push(
632
+ resumeAfter
633
+ ? `${boundWarning} Alerts are read oldest first; every alert created before ${resumeAfter.toISOString()} was read.`
634
+ : boundWarning,
635
+ );
636
+
637
+ if (resume.outOfOrder) {
638
+ warnings.push(
639
+ "Falcon returned alerts out of created_timestamp order, so this run cannot name a point to resume from.",
640
+ );
641
+ }
642
+ }
643
+
644
+ return {
645
+ events,
646
+ fetchedCount: rawAlerts.length,
647
+ rejectedCount,
648
+ failedCount,
649
+ complete: boundWarning === null,
650
+ requestCount: client.getRequestCount(),
651
+ warnings,
652
+ samples,
653
+ resumeAfter,
654
+ };
655
+ }
656
+
657
+ /*
658
+ * The entity fetch does not promise to answer in the order the ids were
659
+ * asked for, and the resume point depends on reading alerts in the ids
660
+ * query's created_timestamp order. Entities are put back in that order;
661
+ * one whose composite_id was not asked for keeps its response position
662
+ * after the rest, where it can only make the resume point more cautious.
663
+ */
664
+ private static inQueryOrder(
665
+ compositeIds: Array<string>,
666
+ entities: Array<JSONObject>,
667
+ ): Array<JSONObject> {
668
+ const positions: Map<string, number> = new Map<string, number>();
669
+
670
+ compositeIds.forEach((compositeId: string, index: number): void => {
671
+ if (!positions.has(compositeId)) {
672
+ positions.set(compositeId, index);
673
+ }
674
+ });
675
+
676
+ return entities
677
+ .map(
678
+ (
679
+ entity: JSONObject,
680
+ index: number,
681
+ ): { entity: JSONObject; index: number; rank: number } => {
682
+ const rank: number | undefined = positions.get(
683
+ readString(entity, "composite_id"),
684
+ );
685
+
686
+ return {
687
+ entity,
688
+ index,
689
+ rank: rank === undefined ? compositeIds.length : rank,
690
+ };
691
+ },
692
+ )
693
+ .sort(
694
+ (
695
+ left: { index: number; rank: number },
696
+ right: { index: number; rank: number },
697
+ ): number => {
698
+ return left.rank - right.rank || left.index - right.index;
699
+ },
700
+ )
701
+ .map((item: { entity: JSONObject }): JSONObject => {
702
+ return item.entity;
703
+ });
704
+ }
705
+
706
+ /*
707
+ * Where the next poll can resume after a bounded read: the
708
+ * created_timestamp of the last alert read. Two cases name no point, so
709
+ * the poller narrows its window instead of skipping anything:
710
+ * - an alert created earlier than one read before it means Falcon did
711
+ * not honour sort=created_timestamp.asc, and "everything before the
712
+ * last one was read" no longer holds;
713
+ * - an alert that failed normalization is never resumed past, since the
714
+ * poller retries normalization failures; the point stops at that
715
+ * alert's creation time (or is absent when it has none).
716
+ * Creation times outside the window are ignored: the FQL filter excludes
717
+ * them, so such a value cannot say anything about this window.
718
+ */
719
+ private static findResumePoint(
720
+ rawAlerts: Array<JSONObject>,
721
+ failedAlerts: Set<JSONObject>,
722
+ window: ConnectorFetchWindow,
723
+ ): ResumePoint {
724
+ const createdAtInWindow: (raw: JSONObject) => Date | null = (
725
+ raw: JSONObject,
726
+ ): Date | null => {
727
+ const createdAt: Date | null = parseEventTime(
728
+ readValue(raw, "created_timestamp"),
729
+ );
730
+
731
+ if (
732
+ createdAt &&
733
+ createdAt.getTime() >= window.startTime.getTime() &&
734
+ createdAt.getTime() < window.endTime.getTime()
735
+ ) {
736
+ return createdAt;
737
+ }
738
+
739
+ return null;
740
+ };
741
+
742
+ let latest: Date | null = null;
743
+
744
+ for (const raw of rawAlerts) {
745
+ const createdAt: Date | null = createdAtInWindow(raw);
746
+
747
+ if (createdAt && latest && createdAt.getTime() < latest.getTime()) {
748
+ return { resumeAfter: undefined, outOfOrder: true };
749
+ }
750
+
751
+ if (createdAt) {
752
+ latest = createdAt;
753
+ }
754
+ }
755
+
756
+ for (const raw of rawAlerts) {
757
+ if (failedAlerts.has(raw)) {
758
+ return {
759
+ resumeAfter: createdAtInWindow(raw) || undefined,
760
+ outOfOrder: false,
761
+ };
762
+ }
763
+ }
764
+
765
+ return { resumeAfter: latest || undefined, outOfOrder: false };
766
+ }
767
+ }