@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,1004 @@
1
+ import { describe, expect, test } from "@jest/globals";
2
+ import SplunkConnector from "../../../../../../Server/Utils/SecurityEvent/Connectors/Splunk/SplunkConnector";
3
+ import {
4
+ ConnectorFetchResult,
5
+ SecurityConnectorSettings,
6
+ } from "../../../../../../Server/Utils/SecurityEvent/Connectors/Types";
7
+ import {
8
+ DataSourceHttpRequest,
9
+ DataSourceHttpResponse,
10
+ } from "../../../../../../Server/Utils/DataSource/HttpFetch";
11
+ import APIException from "../../../../../../Types/Exception/ApiException";
12
+ import BadDataException from "../../../../../../Types/Exception/BadDataException";
13
+ import Dictionary from "../../../../../../Types/Dictionary";
14
+ import { JSONObject } from "../../../../../../Types/JSON";
15
+ import { SecurityConnectorCheck } from "../../../../../../Types/SecurityEvent/Connectors/ConnectorDiagnostics";
16
+ import SecurityEventConnectorProvider from "../../../../../../Types/SecurityEvent/Connectors/SecurityEventConnectorProvider";
17
+ import {
18
+ SecurityEventConnectorDefinition,
19
+ getSecurityEventConnectorDefinition,
20
+ } from "../../../../../../Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog";
21
+
22
+ /*
23
+ * The Splunk connector as the framework calls it: settings validation
24
+ * keyed by the catalog's field titles, the three test checks and their
25
+ * remediation per failure mode, and a creation-time fetch that reads the
26
+ * window oldest first, respects the event and request bounds, marks
27
+ * itself incomplete with a resume point when a bound stops it, and never
28
+ * leaks a credential.
29
+ */
30
+
31
+ const BASE_URL: string = "https://splunk.example.com:8089";
32
+ const API_TOKEN: string =
33
+ "eyJraWQiOiJzcGx1bmsuc2VjcmV0IiwiYWxnIjoiSFM1MTIiLCJ2ZXIiOiJ2MiIsInR0eXAiOiJzdGF0aWMifQ.eyJpc3MiOiJhZG1pbiJ9.c2lnbmF0dXJlLXNpZ25hdHVyZS1zaWduYXR1cmU";
34
+ const PASSWORD: string = "hunter2-Sup3rSecret";
35
+ const START: Date = new Date("2026-09-12T10:00:00.000Z");
36
+ const END: Date = new Date("2026-09-13T10:00:00.000Z");
37
+
38
+ type Responder = (
39
+ request: DataSourceHttpRequest,
40
+ ) => DataSourceHttpResponse | Promise<DataSourceHttpResponse>;
41
+
42
+ interface Harness {
43
+ requests: Array<DataSourceHttpRequest>;
44
+ connector: SplunkConnector;
45
+ }
46
+
47
+ function settings(
48
+ overrides: Partial<SecurityConnectorSettings> = {},
49
+ ): SecurityConnectorSettings {
50
+ return {
51
+ provider: SecurityEventConnectorProvider.SplunkEnterpriseSecurity,
52
+ config: { url: BASE_URL, searchString: "index=notable" },
53
+ secrets: { apiToken: API_TOKEN },
54
+ alertingOnly: false,
55
+ ...overrides,
56
+ };
57
+ }
58
+
59
+ function text(code: number, body: string): DataSourceHttpResponse {
60
+ let bodyJson: unknown = undefined;
61
+
62
+ try {
63
+ bodyJson = JSON.parse(body);
64
+ } catch {
65
+ bodyJson = undefined;
66
+ }
67
+
68
+ return { statusCode: code, bodyText: body, bodyJson, headers: {} };
69
+ }
70
+
71
+ function contextResponse(): DataSourceHttpResponse {
72
+ return text(
73
+ 200,
74
+ JSON.stringify({
75
+ entry: [
76
+ {
77
+ name: "context",
78
+ content: {
79
+ capabilities: ["search"],
80
+ roles: ["oneuptime_reader", "user"],
81
+ username: "oneuptime",
82
+ },
83
+ },
84
+ ],
85
+ }),
86
+ );
87
+ }
88
+
89
+ function notable(eventId: string, index: number): JSONObject {
90
+ return {
91
+ _bkt: "notable~12~C8D6C9F5-4C3B-4F3E-9A3E-0F2B2C9D4E1A",
92
+ _cd: `12:${4800 + index}`,
93
+ _time: `2026-09-12T1${index}:15:00.000+00:00`,
94
+ event_id: eventId,
95
+ rule_name: "Access - Brute Force Access Behavior Detected - Rule",
96
+ rule_title: `Brute force against wkstn-04${index}`,
97
+ urgency: "high",
98
+ status_label: "New",
99
+ src: "10.20.30.40",
100
+ dest: `wkstn-04${index}`,
101
+ user: "alice",
102
+ orig_time: "1789209300",
103
+ };
104
+ }
105
+
106
+ function ndjson(rows: Array<JSONObject>): DataSourceHttpResponse {
107
+ const lines: Array<string> = rows.map(
108
+ (row: JSONObject, index: number): string => {
109
+ return JSON.stringify({
110
+ preview: false,
111
+ offset: index,
112
+ ...(index === rows.length - 1 ? { lastrow: true } : {}),
113
+ result: row,
114
+ });
115
+ },
116
+ );
117
+
118
+ return {
119
+ statusCode: 200,
120
+ bodyText: lines.join("\n") + "\n",
121
+ bodyJson: undefined,
122
+ headers: {},
123
+ };
124
+ }
125
+
126
+ function countRow(count: number): DataSourceHttpResponse {
127
+ return ndjson([{ count: String(count) }]);
128
+ }
129
+
130
+ function buildHarness(options: {
131
+ context?: Responder;
132
+ exports?: Array<Responder>;
133
+ }): Harness {
134
+ const requests: Array<DataSourceHttpRequest> = [];
135
+ const exportResponders: Array<Responder> = [...(options.exports || [])];
136
+
137
+ const connector: SplunkConnector = new SplunkConnector(
138
+ async (request: DataSourceHttpRequest): Promise<DataSourceHttpResponse> => {
139
+ requests.push(request);
140
+
141
+ if (request.url.includes("/services/authentication/current-context")) {
142
+ return (options.context || contextResponse)(request);
143
+ }
144
+
145
+ const responder: Responder | undefined = exportResponders.shift();
146
+
147
+ if (!responder) {
148
+ throw new Error(`Unexpected request to ${request.url}`);
149
+ }
150
+
151
+ return responder(request);
152
+ },
153
+ );
154
+
155
+ return { requests, connector };
156
+ }
157
+
158
+ function checkByKey(
159
+ checks: Array<SecurityConnectorCheck>,
160
+ key: string,
161
+ ): SecurityConnectorCheck {
162
+ const check: SecurityConnectorCheck | undefined = checks.find(
163
+ (candidate: SecurityConnectorCheck): boolean => {
164
+ return candidate.key === key;
165
+ },
166
+ );
167
+
168
+ if (!check) {
169
+ throw new Error(`Missing check ${key}`);
170
+ }
171
+
172
+ return check;
173
+ }
174
+
175
+ function headSize(request: DataSourceHttpRequest): number {
176
+ const search: string = (request.body as Dictionary<string>)["search"] || "";
177
+ const match: RegExpMatchArray | null = search.match(/\| head (\d+)$/);
178
+ return match ? Number(match[1]) : Number.NaN;
179
+ }
180
+
181
+ describe("SplunkConnector", () => {
182
+ const definition: SecurityEventConnectorDefinition =
183
+ getSecurityEventConnectorDefinition(
184
+ SecurityEventConnectorProvider.SplunkEnterpriseSecurity,
185
+ )!;
186
+
187
+ test("registers under the catalog's provider key", () => {
188
+ expect(new SplunkConnector().provider).toBe("splunk");
189
+ expect(definition.provider).toBe(new SplunkConnector().provider);
190
+ });
191
+
192
+ describe("validateSettings", () => {
193
+ test("accepts a token-authenticated connection with the default search", () => {
194
+ expect(() => {
195
+ return new SplunkConnector().validateSettings(
196
+ settings({ config: { url: BASE_URL } }),
197
+ );
198
+ }).not.toThrow();
199
+ });
200
+
201
+ test("accepts username and password when no token is set", () => {
202
+ expect(() => {
203
+ return new SplunkConnector().validateSettings(
204
+ settings({
205
+ config: { url: BASE_URL, username: "oneuptime" },
206
+ secrets: { password: PASSWORD },
207
+ }),
208
+ );
209
+ }).not.toThrow();
210
+ });
211
+
212
+ test("names the catalog field titles in every rejection", () => {
213
+ const connector: SplunkConnector = new SplunkConnector();
214
+
215
+ expect(() => {
216
+ return connector.validateSettings(settings({ config: {} }));
217
+ }).toThrow("Splunk management URL is required.");
218
+
219
+ expect(() => {
220
+ return connector.validateSettings(
221
+ settings({ config: { url: "http://splunk.example.com:8089" } }),
222
+ );
223
+ }).toThrow(BadDataException);
224
+
225
+ expect(() => {
226
+ return connector.validateSettings(
227
+ settings({ config: { url: BASE_URL }, secrets: {} }),
228
+ );
229
+ }).toThrow(
230
+ "Provide an Authentication token, or a Username and Password.",
231
+ );
232
+
233
+ expect(() => {
234
+ return connector.validateSettings(
235
+ settings({
236
+ config: { url: BASE_URL, username: "oneuptime" },
237
+ secrets: {},
238
+ }),
239
+ );
240
+ }).toThrow(/^Password is required when a Username is set/);
241
+
242
+ expect(() => {
243
+ return connector.validateSettings(
244
+ settings({
245
+ config: { url: BASE_URL },
246
+ secrets: { password: PASSWORD },
247
+ }),
248
+ );
249
+ }).toThrow("Username is required when a Password is set.");
250
+
251
+ expect(() => {
252
+ return connector.validateSettings(
253
+ settings({
254
+ config: {
255
+ url: BASE_URL,
256
+ searchString: "index=notable earliest=-1d",
257
+ },
258
+ }),
259
+ );
260
+ }).toThrow(/earliest or latest/);
261
+ });
262
+ });
263
+
264
+ describe("testConnection", () => {
265
+ test("passes all three checks and reports user, roles, endpoint version and counts", async () => {
266
+ const harness: Harness = buildHarness({
267
+ exports: [
268
+ (): DataSourceHttpResponse => {
269
+ return ndjson([notable("A1", 0)]);
270
+ },
271
+ (): DataSourceHttpResponse => {
272
+ return countRow(12);
273
+ },
274
+ (): DataSourceHttpResponse => {
275
+ return countRow(140);
276
+ },
277
+ ],
278
+ });
279
+
280
+ const checks: Array<SecurityConnectorCheck> =
281
+ await harness.connector.testConnection(settings(), {
282
+ requestTimeoutInMs: 15000,
283
+ });
284
+
285
+ expect(
286
+ checks.map((check: SecurityConnectorCheck): string => {
287
+ return `${check.key}:${check.status}`;
288
+ }),
289
+ ).toEqual([
290
+ "authentication:pass",
291
+ "read-permission:pass",
292
+ "detections-available:pass",
293
+ ]);
294
+
295
+ const authentication: SecurityConnectorCheck = checkByKey(
296
+ checks,
297
+ "authentication",
298
+ );
299
+ expect(authentication.message).toContain("authentication token");
300
+ expect(authentication.message).toContain("user oneuptime");
301
+ expect(authentication.message).toContain("oneuptime_reader, user");
302
+ expect(authentication.details).toEqual({
303
+ username: "oneuptime",
304
+ roles: ["oneuptime_reader", "user"],
305
+ hasSearchCapability: true,
306
+ });
307
+
308
+ const read: SecurityConnectorCheck = checkByKey(
309
+ checks,
310
+ "read-permission",
311
+ );
312
+ expect(read.message).toContain("search/v2/jobs/export");
313
+ expect(read.message).toContain("1 record returned");
314
+ expect(read.details).toEqual({ apiVersion: "v2" });
315
+
316
+ const available: SecurityConnectorCheck = checkByKey(
317
+ checks,
318
+ "detections-available",
319
+ );
320
+ expect(available.message).toBe(
321
+ "12 records created in the last 24 hours and 140 in the last 7 days.",
322
+ );
323
+ expect(available.details).toEqual({
324
+ createdLast24h: 12,
325
+ createdLast7d: 140,
326
+ hasMoreLast24h: false,
327
+ hasMoreLast7d: false,
328
+ });
329
+
330
+ // One context probe, a one-row read (head 2 = cap + 1), then two counts.
331
+ expect(harness.requests).toHaveLength(4);
332
+ expect(headSize(harness.requests[1]!)).toBe(2);
333
+ // Any row proves the search runs, so the probe does not sort a day.
334
+ expect((harness.requests[1]!.body as Dictionary<string>)["search"]).toBe(
335
+ "search index=notable | fields * | head 2",
336
+ );
337
+ expect((harness.requests[2]!.body as Dictionary<string>)["search"]).toBe(
338
+ "search index=notable | stats count",
339
+ );
340
+ for (const request of harness.requests) {
341
+ expect(request.timeoutInMs).toBe(15000);
342
+ }
343
+ });
344
+
345
+ test("warns instead of passing when nothing was created in the last 7 days", async () => {
346
+ const harness: Harness = buildHarness({
347
+ exports: [
348
+ (): DataSourceHttpResponse => {
349
+ return text(200, "");
350
+ },
351
+ (): DataSourceHttpResponse => {
352
+ return countRow(0);
353
+ },
354
+ (): DataSourceHttpResponse => {
355
+ return text(200, "");
356
+ },
357
+ ],
358
+ });
359
+
360
+ const checks: Array<SecurityConnectorCheck> =
361
+ await harness.connector.testConnection(settings(), {
362
+ requestTimeoutInMs: 1000,
363
+ });
364
+
365
+ const available: SecurityConnectorCheck = checkByKey(
366
+ checks,
367
+ "detections-available",
368
+ );
369
+ expect(available.status).toBe("warn");
370
+ expect(available.message).toContain("No records matched");
371
+ expect(available.remediation).toContain("Incident Review");
372
+ });
373
+
374
+ test("fails authentication on an invalid setting without contacting Splunk", async () => {
375
+ const harness: Harness = buildHarness({});
376
+
377
+ const checks: Array<SecurityConnectorCheck> =
378
+ await harness.connector.testConnection(
379
+ settings({ config: { url: BASE_URL }, secrets: {} }),
380
+ { requestTimeoutInMs: 1000 },
381
+ );
382
+
383
+ expect(checks).toHaveLength(1);
384
+ expect(checks[0]!.key).toBe("authentication");
385
+ expect(checks[0]!.status).toBe("fail");
386
+ expect(checks[0]!.message).toContain("Authentication token");
387
+ expect(checks[0]!.remediation).toContain("Nothing was contacted");
388
+ expect(harness.requests).toHaveLength(0);
389
+ });
390
+
391
+ test("fails authentication on a 401, skips the rest, and points at Settings > Tokens", async () => {
392
+ const harness: Harness = buildHarness({
393
+ context: (): DataSourceHttpResponse => {
394
+ return text(
395
+ 401,
396
+ JSON.stringify({
397
+ messages: [
398
+ { type: "WARN", text: "call not properly authenticated" },
399
+ ],
400
+ }),
401
+ );
402
+ },
403
+ });
404
+
405
+ const checks: Array<SecurityConnectorCheck> =
406
+ await harness.connector.testConnection(settings(), {
407
+ requestTimeoutInMs: 1000,
408
+ });
409
+
410
+ expect(
411
+ checks.map((check: SecurityConnectorCheck): string => {
412
+ return `${check.key}:${check.status}`;
413
+ }),
414
+ ).toEqual([
415
+ "authentication:fail",
416
+ "read-permission:skip",
417
+ "detections-available:skip",
418
+ ]);
419
+ expect(checks[0]!.message).toMatch(
420
+ /^Splunk Enterprise Security authentication request failed \(HTTP 401\)/,
421
+ );
422
+ expect(checks[0]!.remediation).toContain("Settings > Tokens");
423
+ expect(checks[0]!.message).not.toContain(API_TOKEN);
424
+ expect(harness.requests).toHaveLength(1);
425
+ });
426
+
427
+ test("fails authentication with the port hint when the URL answers HTML", async () => {
428
+ const harness: Harness = buildHarness({
429
+ context: (): DataSourceHttpResponse => {
430
+ return text(200, "<!DOCTYPE html><html><title>Splunk</title></html>");
431
+ },
432
+ });
433
+
434
+ const checks: Array<SecurityConnectorCheck> =
435
+ await harness.connector.testConnection(settings(), {
436
+ requestTimeoutInMs: 1000,
437
+ });
438
+
439
+ expect(checks[0]!.status).toBe("fail");
440
+ expect(checks[0]!.remediation).toContain("8089");
441
+ });
442
+
443
+ test("fails authentication with the connectivity hint on a timeout", async () => {
444
+ const harness: Harness = buildHarness({
445
+ context: (): DataSourceHttpResponse => {
446
+ throw new BadDataException(
447
+ "Could not reach data source: timeout of 1000ms exceeded",
448
+ );
449
+ },
450
+ });
451
+
452
+ const checks: Array<SecurityConnectorCheck> =
453
+ await harness.connector.testConnection(settings(), {
454
+ requestTimeoutInMs: 1000,
455
+ });
456
+
457
+ expect(checks[0]!.status).toBe("fail");
458
+ expect(checks[0]!.message).toMatch(
459
+ /^Splunk Enterprise Security authentication request did not complete: /,
460
+ );
461
+ expect(checks[0]!.remediation).toContain("private addresses are refused");
462
+ });
463
+
464
+ test("fails read-permission on a 403 with the role remediation and skips availability", async () => {
465
+ const harness: Harness = buildHarness({
466
+ exports: [
467
+ (): DataSourceHttpResponse => {
468
+ return text(
469
+ 403,
470
+ JSON.stringify({
471
+ messages: [
472
+ {
473
+ type: "ERROR",
474
+ text: "You (user=oneuptime) do not have permission to perform this operation (requires capability: search)",
475
+ },
476
+ ],
477
+ }),
478
+ );
479
+ },
480
+ ],
481
+ });
482
+
483
+ const checks: Array<SecurityConnectorCheck> =
484
+ await harness.connector.testConnection(settings(), {
485
+ requestTimeoutInMs: 1000,
486
+ });
487
+
488
+ expect(
489
+ checks.map((check: SecurityConnectorCheck): string => {
490
+ return `${check.key}:${check.status}`;
491
+ }),
492
+ ).toEqual([
493
+ "authentication:pass",
494
+ "read-permission:fail",
495
+ "detections-available:skip",
496
+ ]);
497
+ const read: SecurityConnectorCheck = checkByKey(
498
+ checks,
499
+ "read-permission",
500
+ );
501
+ expect(read.message).toMatch(
502
+ /^Splunk Enterprise Security search export failed \(HTTP 403\)/,
503
+ );
504
+ expect(read.remediation).toContain("search capability");
505
+ expect(read.remediation).toContain("notable");
506
+ });
507
+
508
+ test("fails read-permission on a 400 with the search remediation", async () => {
509
+ const harness: Harness = buildHarness({
510
+ exports: [
511
+ (): DataSourceHttpResponse => {
512
+ return text(
513
+ 400,
514
+ JSON.stringify({
515
+ messages: [
516
+ {
517
+ type: "FATAL",
518
+ text: "Error in 'search' command: Unable to parse the search",
519
+ },
520
+ ],
521
+ }),
522
+ );
523
+ },
524
+ ],
525
+ });
526
+
527
+ const checks: Array<SecurityConnectorCheck> =
528
+ await harness.connector.testConnection(settings(), {
529
+ requestTimeoutInMs: 1000,
530
+ });
531
+
532
+ const read: SecurityConnectorCheck = checkByKey(
533
+ checks,
534
+ "read-permission",
535
+ );
536
+ expect(read.status).toBe("fail");
537
+ expect(read.remediation).toContain("Fix the Search setting");
538
+ });
539
+
540
+ test("fails detections-available on a 429 with the throttling remediation", async () => {
541
+ const harness: Harness = buildHarness({
542
+ exports: [
543
+ (): DataSourceHttpResponse => {
544
+ return ndjson([notable("A1", 0)]);
545
+ },
546
+ (): DataSourceHttpResponse => {
547
+ return text(429, "Too Many Requests");
548
+ },
549
+ ],
550
+ });
551
+
552
+ const checks: Array<SecurityConnectorCheck> =
553
+ await harness.connector.testConnection(settings(), {
554
+ requestTimeoutInMs: 1000,
555
+ });
556
+
557
+ const available: SecurityConnectorCheck = checkByKey(
558
+ checks,
559
+ "detections-available",
560
+ );
561
+ expect(available.status).toBe("fail");
562
+ expect(available.message).toMatch(
563
+ /^Splunk Enterprise Security count search failed \(HTTP 429\)/,
564
+ );
565
+ expect(available.remediation).toContain("throttling");
566
+ });
567
+
568
+ test("reports the deprecated v1 endpoint when v2 answers 404", async () => {
569
+ const harness: Harness = buildHarness({
570
+ exports: [
571
+ (): DataSourceHttpResponse => {
572
+ return text(404, "Not Found");
573
+ },
574
+ (): DataSourceHttpResponse => {
575
+ return ndjson([notable("A1", 0)]);
576
+ },
577
+ (): DataSourceHttpResponse => {
578
+ return countRow(1);
579
+ },
580
+ (): DataSourceHttpResponse => {
581
+ return countRow(3);
582
+ },
583
+ ],
584
+ });
585
+
586
+ const checks: Array<SecurityConnectorCheck> =
587
+ await harness.connector.testConnection(settings(), {
588
+ requestTimeoutInMs: 1000,
589
+ });
590
+
591
+ const read: SecurityConnectorCheck = checkByKey(
592
+ checks,
593
+ "read-permission",
594
+ );
595
+ expect(read.status).toBe("pass");
596
+ expect(read.message).toContain("deprecated search/jobs/export");
597
+ expect(read.details).toEqual({ apiVersion: "v1" });
598
+ expect(checkByKey(checks, "detections-available").status).toBe("pass");
599
+ });
600
+
601
+ test("uses basic authentication and names it in the passing message", async () => {
602
+ const harness: Harness = buildHarness({
603
+ exports: [
604
+ (): DataSourceHttpResponse => {
605
+ return ndjson([]);
606
+ },
607
+ (): DataSourceHttpResponse => {
608
+ return countRow(0);
609
+ },
610
+ (): DataSourceHttpResponse => {
611
+ return countRow(1);
612
+ },
613
+ ],
614
+ });
615
+
616
+ const checks: Array<SecurityConnectorCheck> =
617
+ await harness.connector.testConnection(
618
+ settings({
619
+ config: { url: BASE_URL, username: "oneuptime" },
620
+ secrets: { password: PASSWORD },
621
+ }),
622
+ { requestTimeoutInMs: 1000 },
623
+ );
624
+
625
+ expect(checkByKey(checks, "authentication").message).toContain(
626
+ "username and password",
627
+ );
628
+ expect(harness.requests[0]!.headers?.["Authorization"]).toBe(
629
+ `Basic ${Buffer.from(`oneuptime:${PASSWORD}`).toString("base64")}`,
630
+ );
631
+ for (const check of checks) {
632
+ expect(JSON.stringify(check)).not.toContain(PASSWORD);
633
+ }
634
+ });
635
+ });
636
+
637
+ describe("fetchEvents", () => {
638
+ test("reads the window by creation time, normalizes with the catalog's vendor and product, and builds samples", async () => {
639
+ const harness: Harness = buildHarness({
640
+ exports: [
641
+ (): DataSourceHttpResponse => {
642
+ return ndjson([
643
+ notable("A1", 0),
644
+ notable("B2", 1),
645
+ notable("C3", 2),
646
+ ]);
647
+ },
648
+ ],
649
+ });
650
+
651
+ const result: ConnectorFetchResult = await harness.connector.fetchEvents(
652
+ settings(),
653
+ { startTime: START, endTime: END },
654
+ {
655
+ maxRequests: 20,
656
+ maxEvents: 100,
657
+ requestTimeoutInMs: 30000,
658
+ sampleLimit: 2,
659
+ },
660
+ );
661
+
662
+ expect(result.complete).toBe(true);
663
+ expect(result.resumeAfter).toBeUndefined();
664
+ expect(result.warnings).toEqual([]);
665
+ expect(result.requestCount).toBe(1);
666
+ expect(result.fetchedCount).toBe(3);
667
+ expect(result.rejectedCount).toBe(0);
668
+ expect(result.failedCount).toBe(0);
669
+ expect(result.events).toHaveLength(3);
670
+
671
+ for (const event of result.events) {
672
+ expect(event.vendorName).toBe(definition.vendorName);
673
+ expect(event.productName).toBe(definition.productName);
674
+ expect(event.classUid).toBe(2004);
675
+ }
676
+
677
+ expect(
678
+ result.events.map((event: { eventUid: string }): string => {
679
+ return event.eventUid;
680
+ }),
681
+ ).toEqual(["A1", "B2", "C3"]);
682
+
683
+ expect(result.samples).toHaveLength(2);
684
+ expect(result.samples[0]).toEqual({
685
+ id: "A1",
686
+ title: "Brute force against wkstn-040",
687
+ severity: "High",
688
+ createdTime: "2026-09-12T10:15:00.000Z",
689
+ eventTime: "2026-09-12T10:35:00.000Z",
690
+ });
691
+
692
+ const request: DataSourceHttpRequest = harness.requests[0]!;
693
+ const body: Dictionary<string> = request.body as Dictionary<string>;
694
+ expect(new URL(request.url).pathname).toBe(
695
+ "/services/search/v2/jobs/export",
696
+ );
697
+ expect(Object.keys(body).sort()).toEqual([
698
+ "earliest_time",
699
+ "latest_time",
700
+ "output_mode",
701
+ "search",
702
+ ]);
703
+ expect(body["earliest_time"]).toBe(String(START.getTime() / 1000));
704
+ expect(body["latest_time"]).toBe(String(END.getTime() / 1000));
705
+ expect(body["search"]).toBe(
706
+ "search index=notable | fields * | sort 0 _time | head 101",
707
+ );
708
+ expect(headSize(request)).toBe(101);
709
+ expect(request.timeoutInMs).toBe(30000);
710
+ });
711
+
712
+ /*
713
+ * Review finding bound-hit-window-never-advances: this test used to
714
+ * assert that a capped read only warned "the cursor is held", which
715
+ * re-read the same rows on every poll. A capped read now keeps the
716
+ * oldest rows (sorted ascending by Splunk) and reports the `_time` of
717
+ * the last one as the resume point.
718
+ */
719
+ test("stops at the event bound with the oldest rows and reports the last row's _time as the resume point", async () => {
720
+ const harness: Harness = buildHarness({
721
+ exports: [
722
+ (): DataSourceHttpResponse => {
723
+ // Splunk answers in the order `sort 0 _time` produces.
724
+ return ndjson([
725
+ notable("A1", 0),
726
+ notable("B2", 1),
727
+ notable("C3", 2),
728
+ ]);
729
+ },
730
+ ],
731
+ });
732
+
733
+ const result: ConnectorFetchResult = await harness.connector.fetchEvents(
734
+ settings(),
735
+ { startTime: START, endTime: END },
736
+ {
737
+ maxRequests: 20,
738
+ maxEvents: 2,
739
+ requestTimeoutInMs: 1000,
740
+ sampleLimit: 5,
741
+ },
742
+ );
743
+
744
+ expect(result.complete).toBe(false);
745
+ expect(result.events).toHaveLength(2);
746
+ expect(
747
+ result.events.map((event: { eventUid: string }): string => {
748
+ return event.eventUid;
749
+ }),
750
+ ).toEqual(["A1", "B2"]);
751
+ expect(result.fetchedCount).toBe(2);
752
+ expect(result.resumeAfter?.toISOString()).toBe(
753
+ "2026-09-12T11:15:00.000Z",
754
+ );
755
+ expect(result.warnings).toEqual([
756
+ "Stopped after collecting 2 records; the window holds more. Records are read oldest first, and the last one read was created at 2026-09-12T11:15:00.000Z, where the next poll can resume.",
757
+ ]);
758
+ expect(headSize(harness.requests[0]!)).toBe(3);
759
+ expect((harness.requests[0]!.body as Dictionary<string>)["search"]).toBe(
760
+ "search index=notable | fields * | sort 0 _time | head 3",
761
+ );
762
+ });
763
+
764
+ test("resumes from the last readable _time when the final row has none", async () => {
765
+ const withoutTime: JSONObject = notable("B2", 1);
766
+ delete withoutTime["_time"];
767
+
768
+ const harness: Harness = buildHarness({
769
+ exports: [
770
+ (): DataSourceHttpResponse => {
771
+ return ndjson([notable("A1", 0), withoutTime, notable("C3", 2)]);
772
+ },
773
+ ],
774
+ });
775
+
776
+ const result: ConnectorFetchResult = await harness.connector.fetchEvents(
777
+ settings(),
778
+ { startTime: START, endTime: END },
779
+ {
780
+ maxRequests: 20,
781
+ maxEvents: 2,
782
+ requestTimeoutInMs: 1000,
783
+ sampleLimit: 5,
784
+ },
785
+ );
786
+
787
+ expect(result.complete).toBe(false);
788
+ expect(result.resumeAfter?.toISOString()).toBe(
789
+ "2026-09-12T10:15:00.000Z",
790
+ );
791
+ });
792
+
793
+ test("reports no resume point when no row read carries a _time, or the last one lies past the window end", async () => {
794
+ const noTime: JSONObject = notable("A1", 0);
795
+ delete noTime["_time"];
796
+ const pastEnd: JSONObject = {
797
+ ...notable("B2", 1),
798
+ _time: "2026-09-14T10:15:00.000+00:00",
799
+ };
800
+
801
+ for (const rows of [
802
+ [noTime, { ...noTime, event_id: "A2" }, notable("C3", 2)],
803
+ [notable("A1", 0), pastEnd, notable("C3", 2)],
804
+ ]) {
805
+ const harness: Harness = buildHarness({
806
+ exports: [
807
+ (): DataSourceHttpResponse => {
808
+ return ndjson(rows);
809
+ },
810
+ ],
811
+ });
812
+
813
+ const result: ConnectorFetchResult =
814
+ await harness.connector.fetchEvents(
815
+ settings(),
816
+ { startTime: START, endTime: END },
817
+ {
818
+ maxRequests: 20,
819
+ maxEvents: 2,
820
+ requestTimeoutInMs: 1000,
821
+ sampleLimit: 5,
822
+ },
823
+ );
824
+
825
+ expect(result.complete).toBe(false);
826
+ expect(result.resumeAfter).toBeUndefined();
827
+ }
828
+ });
829
+
830
+ test("refuses to read with a zero request budget and reports it instead of exceeding it", async () => {
831
+ const harness: Harness = buildHarness({});
832
+
833
+ const result: ConnectorFetchResult = await harness.connector.fetchEvents(
834
+ settings(),
835
+ { startTime: START, endTime: END },
836
+ {
837
+ maxRequests: 0,
838
+ maxEvents: 10,
839
+ requestTimeoutInMs: 1000,
840
+ sampleLimit: 5,
841
+ },
842
+ );
843
+
844
+ expect(result.complete).toBe(false);
845
+ expect(result.resumeAfter).toBeUndefined();
846
+ expect(result.requestCount).toBe(0);
847
+ expect(result.warnings[0]).toContain("request budget");
848
+ expect(harness.requests).toHaveLength(0);
849
+ });
850
+
851
+ test("falls back to v1 within the request budget and warns about the deprecated endpoint", async () => {
852
+ const harness: Harness = buildHarness({
853
+ exports: [
854
+ (): DataSourceHttpResponse => {
855
+ return text(404, "Not Found");
856
+ },
857
+ (): DataSourceHttpResponse => {
858
+ return ndjson([notable("A1", 0)]);
859
+ },
860
+ ],
861
+ });
862
+
863
+ const result: ConnectorFetchResult = await harness.connector.fetchEvents(
864
+ settings(),
865
+ { startTime: START, endTime: END },
866
+ {
867
+ maxRequests: 1,
868
+ maxEvents: 10,
869
+ requestTimeoutInMs: 1000,
870
+ sampleLimit: 5,
871
+ },
872
+ );
873
+
874
+ expect(result.complete).toBe(true);
875
+ expect(result.resumeAfter).toBeUndefined();
876
+ expect(result.events).toHaveLength(1);
877
+ expect(result.requestCount).toBe(2);
878
+ expect(
879
+ result.warnings.some((warning: string): boolean => {
880
+ return warning.includes("deprecated search/jobs/export");
881
+ }),
882
+ ).toBe(true);
883
+ expect(
884
+ result.warnings.some((warning: string): boolean => {
885
+ return warning.includes("budget of 1");
886
+ }),
887
+ ).toBe(true);
888
+ });
889
+
890
+ test("counts rows the normalizer does not recognize as rejected", async () => {
891
+ const harness: Harness = buildHarness({
892
+ exports: [
893
+ (): DataSourceHttpResponse => {
894
+ return ndjson([notable("A1", 0), { count: "3" }, { foo: "bar" }]);
895
+ },
896
+ ],
897
+ });
898
+
899
+ const result: ConnectorFetchResult = await harness.connector.fetchEvents(
900
+ settings(),
901
+ { startTime: START, endTime: END },
902
+ {
903
+ maxRequests: 20,
904
+ maxEvents: 10,
905
+ requestTimeoutInMs: 1000,
906
+ sampleLimit: 5,
907
+ },
908
+ );
909
+
910
+ expect(result.fetchedCount).toBe(3);
911
+ expect(result.rejectedCount).toBe(2);
912
+ expect(result.events).toHaveLength(1);
913
+ });
914
+
915
+ test("throws with the step prefix for authentication, permission, throttling and server failures", async () => {
916
+ for (const status of [401, 403, 429, 500]) {
917
+ const harness: Harness = buildHarness({
918
+ exports: [
919
+ (): DataSourceHttpResponse => {
920
+ return text(
921
+ status,
922
+ JSON.stringify({
923
+ messages: [
924
+ { type: "ERROR", text: `rejected Bearer ${API_TOKEN}` },
925
+ ],
926
+ }),
927
+ );
928
+ },
929
+ ],
930
+ });
931
+
932
+ let thrown: unknown = undefined;
933
+
934
+ try {
935
+ await harness.connector.fetchEvents(
936
+ settings(),
937
+ { startTime: START, endTime: END },
938
+ {
939
+ maxRequests: 20,
940
+ maxEvents: 10,
941
+ requestTimeoutInMs: 1000,
942
+ sampleLimit: 5,
943
+ },
944
+ );
945
+ } catch (error) {
946
+ thrown = error;
947
+ }
948
+
949
+ expect(thrown).toBeInstanceOf(APIException);
950
+ expect((thrown as APIException).message).toMatch(
951
+ new RegExp(
952
+ `^Splunk Enterprise Security search export failed \\(HTTP ${status}\\): `,
953
+ ),
954
+ );
955
+ expect((thrown as APIException).message).not.toContain(API_TOKEN);
956
+ }
957
+ });
958
+
959
+ test("throws with the step prefix when the transport times out", async () => {
960
+ const harness: Harness = buildHarness({
961
+ exports: [
962
+ (): DataSourceHttpResponse => {
963
+ throw new BadDataException(
964
+ "Could not reach data source: timeout of 1000ms exceeded",
965
+ );
966
+ },
967
+ ],
968
+ });
969
+
970
+ await expect(
971
+ harness.connector.fetchEvents(
972
+ settings(),
973
+ { startTime: START, endTime: END },
974
+ {
975
+ maxRequests: 20,
976
+ maxEvents: 10,
977
+ requestTimeoutInMs: 1000,
978
+ sampleLimit: 5,
979
+ },
980
+ ),
981
+ ).rejects.toThrow(
982
+ "Splunk Enterprise Security search export did not complete: Could not reach data source: timeout of 1000ms exceeded",
983
+ );
984
+ });
985
+
986
+ test("throws a BadDataException for invalid settings before any request", async () => {
987
+ const harness: Harness = buildHarness({});
988
+
989
+ await expect(
990
+ harness.connector.fetchEvents(
991
+ settings({ secrets: {} }),
992
+ { startTime: START, endTime: END },
993
+ {
994
+ maxRequests: 20,
995
+ maxEvents: 10,
996
+ requestTimeoutInMs: 1000,
997
+ sampleLimit: 5,
998
+ },
999
+ ),
1000
+ ).rejects.toBeInstanceOf(BadDataException);
1001
+ expect(harness.requests).toHaveLength(0);
1002
+ });
1003
+ });
1004
+ });