@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
@@ -12,6 +12,8 @@ import BadDataException from "../../Types/Exception/BadDataException";
12
12
  import CommonAPI from "./CommonAPI";
13
13
  import DatabaseCommonInteractionProps from "../../Types/BaseDatabase/DatabaseCommonInteractionProps";
14
14
  import TelemetryType from "../../Types/Telemetry/TelemetryType";
15
+ import { parseExceptionSpanScope } from "../../Types/Telemetry/ExceptionSpanScope";
16
+ import ServiceType from "../../Types/Telemetry/ServiceType";
15
17
  import TelemetryAttributeService from "../Services/TelemetryAttributeService";
16
18
  import TelemetrySourceMapService from "../Services/TelemetrySourceMapService";
17
19
  import SourceMapResolver, {
@@ -104,10 +106,11 @@ import RumSession from "../../Models/AnalyticsModels/RumSession";
104
106
  import ObjectID from "../../Types/ObjectID";
105
107
  import OneUptimeDate from "../../Types/Date";
106
108
  import { JSONArray, JSONObject } from "../../Types/JSON";
107
- import ResourceFacetResolver, {
108
- ResolvedFacetValue,
109
- ResourceFacetSpec,
110
- } from "../Utils/Telemetry/ResourceFacetResolver";
109
+ import ResourceFacetResolver from "../Utils/Telemetry/ResourceFacetResolver";
110
+ import ResourceFacetPlanner, {
111
+ ListedResourceFacets,
112
+ } from "../Utils/Telemetry/ResourceFacetPlanner";
113
+ import { RESOURCE_FACET_CATALOG_KEYS } from "../../Types/Telemetry/ResourceFacetCatalog";
111
114
  import ResourceEntityFilter, {
112
115
  ResourceEntityScope,
113
116
  } from "../Utils/Telemetry/ResourceEntityFilter";
@@ -130,6 +133,8 @@ import SessionReplayReadService, {
130
133
  DEFAULT_SESSION_REPLAY_USERS_LIMIT,
131
134
  MAX_SESSION_REPLAY_FOR_EXCEPTION_LIMIT,
132
135
  MAX_SESSION_REPLAY_LIST_LIMIT,
136
+ MAX_SESSION_REPLAY_SESSION_ID_LENGTH,
137
+ MAX_SESSION_REPLAY_SUMMARIES_BATCH_SIZE,
133
138
  MAX_SESSION_REPLAY_USERS_LIMIT,
134
139
  SESSION_REPLAY_EXCEPTION_WINDOW_PADDING_MS,
135
140
  SessionReplayApplicationActivitySummary,
@@ -142,6 +147,7 @@ import SessionReplayReadService, {
142
147
  SessionReplayManifest,
143
148
  SessionReplaySessionHeader,
144
149
  SessionReplaySessionIdentity,
150
+ SessionReplaySummary,
145
151
  SessionReplayUsersCursor,
146
152
  SessionReplayUsersResult,
147
153
  } from "../Utils/SessionReplay/SessionReplayReadService";
@@ -760,9 +766,10 @@ router.post(
760
766
 
761
767
  /*
762
768
  * Per-facet partial-match filter applied at the Postgres source-of-truth
763
- * lookup stage. Only consulted for resource facets (primaryEntityId /
764
- * hostId / dockerHostId / kubernetesClusterId) — other facets continue
765
- * to filter client-side over the loaded value list.
769
+ * lookup stage. Only consulted for resource facets (primaryEntityId and
770
+ * every ResourceFacetCatalog key — hostId / kubernetesClusterId / ...)
771
+ * — other facets continue to filter client-side over the loaded value
772
+ * list.
766
773
  */
767
774
  const facetSearchText: Record<string, string> | undefined = body[
768
775
  "facetSearchText"
@@ -780,79 +787,43 @@ router.post(
780
787
  await resolveResourceScopesFromBody(body, projectId);
781
788
 
782
789
  /*
783
- * Run facet queries in parallel so a slow individual facet can't
784
- * starve the endpoint. Per-facet errors degrade gracefully to [].
790
+ * One ClickHouse GROUP BY per facet, in parallel so a slow facet can't
791
+ * starve the endpoint; per-facet errors degrade gracefully to [].
792
+ * Resource facets come back as the Postgres source-of-truth list
793
+ * (filtered by facetSearchText, enriched with displayName) with those
794
+ * counts merged in, so low-volume resources stay visible and search
795
+ * reaches resources outside the window. Their lists are fetched FIRST:
796
+ * a resource type the project has none of skips its ClickHouse scan
797
+ * entirely (see ResourceFacetPlanner).
785
798
  */
786
- const facetResults: Array<readonly [string, Array<FacetValue>]> =
787
- await Promise.all(
788
- facetKeys.map(
789
- async (
790
- facetKey: string,
791
- ): Promise<readonly [string, Array<FacetValue>]> => {
792
- try {
793
- const request: FacetRequest = {
794
- projectId,
795
- startTime,
796
- endTime,
797
- facetKey,
798
- limit,
799
- serviceIds,
800
- entityKeys,
801
- resourceScopes,
802
- severityTexts,
803
- bodySearchText,
804
- traceIds,
805
- spanIds,
806
- sessionIds,
807
- attributes,
808
- };
809
- const values: Array<FacetValue> =
810
- await LogAggregationService.getFacetValues(request);
811
- return [facetKey, values] as const;
812
- } catch {
813
- return [facetKey, [] as Array<FacetValue>] as const;
814
- }
815
- },
816
- ),
817
- );
818
-
819
- const facets: Record<string, Array<FacetValue>> = Object.fromEntries(
820
- facetResults,
821
- );
822
-
823
- /*
824
- * Replace resource-facet results with the Postgres source-of-truth list
825
- * (filtered by facetSearchText and enriched with displayName). See the
826
- * trace facets handler above for the rationale — same pattern, same
827
- * benefit: low-volume resources stay visible and search can reach
828
- * resources outside the ClickHouse sample window.
829
- */
830
- const resourceSpecs: Array<ResourceFacetSpec> = facetKeys
831
- .filter((key: string): boolean => {
832
- return ResourceFacetResolver.isResourceFacet(key);
833
- })
834
- .map((key: string): ResourceFacetSpec => {
835
- const counts: Map<string, number> = new Map();
836
- for (const fv of facets[key] || []) {
837
- counts.set(fv.value, fv.count);
838
- }
839
- return {
840
- facetKey: key,
841
- counts,
842
- searchText: facetSearchText?.[key],
799
+ const facets: Record<
800
+ string,
801
+ Array<FacetValue>
802
+ > = await ResourceFacetPlanner.countPerFacet({
803
+ projectId,
804
+ facetKeys,
805
+ facetSearchText,
806
+ limit,
807
+ countFacet: (facetKey: string): Promise<Array<FacetValue>> => {
808
+ const request: FacetRequest = {
809
+ projectId,
810
+ startTime,
811
+ endTime,
812
+ facetKey,
843
813
  limit,
814
+ serviceIds,
815
+ entityKeys,
816
+ resourceScopes,
817
+ severityTexts,
818
+ bodySearchText,
819
+ traceIds,
820
+ spanIds,
821
+ sessionIds,
822
+ attributes,
844
823
  };
845
- });
846
-
847
- if (resourceSpecs.length > 0) {
848
- const resolved: Record<
849
- string,
850
- Array<ResolvedFacetValue>
851
- > = await ResourceFacetResolver.resolve(projectId, resourceSpecs);
852
- for (const key of Object.keys(resolved)) {
853
- facets[key] = resolved[key] as Array<FacetValue>;
854
- }
855
- }
824
+ return LogAggregationService.getFacetValues(request);
825
+ },
826
+ });
856
827
 
857
828
  return Response.sendJsonObjectResponse(req, res, {
858
829
  facets: facets as unknown as JSONObject,
@@ -865,13 +836,16 @@ router.post(
865
836
 
866
837
  /**
867
838
  * Resolve the `resourceFilters` field — the explorers' non-Service resource
868
- * facet selections (Kubernetes cluster / host / docker host / podman host),
869
- * sent as Postgres ids into the scopes the aggregation services compile.
839
+ * facet selections (any ResourceFacetCatalog type: host / Kubernetes cluster
840
+ * / Proxmox cluster / serverless function / ...), sent as Postgres ids —
841
+ * into the scopes the aggregation services compile.
870
842
  *
871
843
  * Kept out of the sync body parsers because turning an id into an entity
872
844
  * key needs a Postgres round trip: the id names a row whose identifying
873
- * value (`clusterIdentifier` / `hostIdentifier`) is what ingest hashed into
874
- * `entityKeys`.
845
+ * value (`hostIdentifier` / `clusterIdentifier` / a cluster `name` / ...) is
846
+ * what ingest hashed into `entityKeys` and stamped as a resource attribute.
847
+ * Types without such an identity keep an id-only scope (see
848
+ * ResourceEntityFilter).
875
849
  *
876
850
  * Returns undefined when nothing was selected so the request field stays
877
851
  * absent rather than becoming an empty array.
@@ -967,6 +941,30 @@ function parseAttributeFilterRecord(
967
941
  return filters;
968
942
  }
969
943
 
944
+ /*
945
+ * An exception scope that is present but malformed is a client bug, and
946
+ * dropping it would silently chart every span in the project under an
947
+ * exception's heading — so it is refused instead.
948
+ */
949
+ function parseTraceExceptionScope(
950
+ raw: unknown,
951
+ ): TraceFilters["exceptionScope"] {
952
+ if (raw === undefined || raw === null) {
953
+ return undefined;
954
+ }
955
+
956
+ const scope: TraceFilters["exceptionScope"] | null =
957
+ parseExceptionSpanScope(raw);
958
+
959
+ if (!scope) {
960
+ throw new BadDataException(
961
+ "exceptionScope must have a fingerprint and, optionally, a primaryEntityId UUID.",
962
+ );
963
+ }
964
+
965
+ return scope;
966
+ }
967
+
970
968
  /*
971
969
  * Shared body parsing for every trace aggregation endpoint (histogram,
972
970
  * facets, analytics). Defensive about shapes: arrays are validated and
@@ -1064,6 +1062,7 @@ function parseTraceFilterBody(body: JSONObject): TraceFilters {
1064
1062
  typeof body["hasException"] === "boolean"
1065
1063
  ? (body["hasException"] as boolean)
1066
1064
  : undefined,
1065
+ exceptionScope: parseTraceExceptionScope(body["exceptionScope"]),
1067
1066
  minDurationNano:
1068
1067
  typeof body["minDurationNano"] === "number"
1069
1068
  ? (body["minDurationNano"] as number)
@@ -1195,9 +1194,10 @@ router.post(
1195
1194
 
1196
1195
  /*
1197
1196
  * Per-facet partial-match filter applied at the Postgres source-of-truth
1198
- * lookup stage. Only consulted for resource facets (primaryEntityId /
1199
- * hostId / dockerHostId / kubernetesClusterId) — other facets continue
1200
- * to filter client-side over the loaded value list.
1197
+ * lookup stage. Only consulted for resource facets (primaryEntityId and
1198
+ * every ResourceFacetCatalog key — hostId / kubernetesClusterId / ...)
1199
+ * — other facets continue to filter client-side over the loaded value
1200
+ * list.
1201
1201
  */
1202
1202
  const facetSearchText: Record<string, string> | undefined = body[
1203
1203
  "facetSearchText"
@@ -1221,9 +1221,8 @@ router.post(
1221
1221
  };
1222
1222
 
1223
1223
  /*
1224
- * Resource facets (primaryEntityId / hostId / dockerHostId / k8s
1225
- * cluster ...) and statusCode are counted with an exact,
1226
- * projection-backed GROUP BY
1224
+ * Resource facets (primaryEntityId and every ResourceFacetCatalog key)
1225
+ * and statusCode are counted with an exact, projection-backed GROUP BY
1227
1226
  * in getResourceFacetCounts(). The recent-N sample below saturates with
1228
1227
  * whichever service is chattiest right now and reports 0 for every other
1229
1228
  * service regardless of its true volume over the window — the "top 1000"
@@ -1242,10 +1241,20 @@ router.post(
1242
1241
  },
1243
1242
  );
1244
1243
 
1245
- const needsAccurateCounts: boolean =
1246
- facetKeys.includes("statusCode") ||
1247
- facetKeys.some((key: string): boolean => {
1248
- return ResourceFacetResolver.isResourceFacet(key);
1244
+ /*
1245
+ * Resource facets list their Postgres rows FIRST. The exact counts are
1246
+ * one shared GROUP BY for statusCode and every resource facet, so it
1247
+ * only runs when statusCode is requested or some requested resource
1248
+ * facet listed a row to merge counts into — a sidebar whose resource
1249
+ * types the project has none of skips the scan entirely. The listing
1250
+ * still overlaps the sample / root-span / exception queries.
1251
+ */
1252
+ const resourceListing: Promise<ListedResourceFacets> =
1253
+ ResourceFacetPlanner.listResourceFacets({
1254
+ projectId: databaseProps.tenantId,
1255
+ facetKeys,
1256
+ facetSearchText,
1257
+ limit,
1249
1258
  });
1250
1259
  const wantsRootSpan: boolean = facetKeys.includes("isRootSpan");
1251
1260
  const wantsHasException: boolean = facetKeys.includes("hasException");
@@ -1266,8 +1275,15 @@ router.post(
1266
1275
  * the projection-backed sample / resource / root-span queries keeps it
1267
1276
  * off the critical path. Each query keeps its own degrade-to-empty catch.
1268
1277
  */
1269
- const [sampledFacets, accurate, rootSpanCounts, exceptionCounts]: [
1278
+ const [
1279
+ sampledFacets,
1280
+ listedResourceFacets,
1281
+ accurate,
1282
+ rootSpanCounts,
1283
+ exceptionCounts,
1284
+ ]: [
1270
1285
  Record<string, Array<TraceFacetValue>>,
1286
+ ListedResourceFacets,
1271
1287
  {
1272
1288
  serviceCounts: Map<string, number>;
1273
1289
  statusCounts: Map<string, number>;
@@ -1289,17 +1305,34 @@ router.post(
1289
1305
  );
1290
1306
  })
1291
1307
  : Promise.resolve({} as Record<string, Array<TraceFacetValue>>),
1292
- needsAccurateCounts
1293
- ? TraceAggregationService.getResourceFacetCounts(multiRequest).catch(
1294
- () => {
1295
- /*
1296
- * Degrade gracefully: resource facets still enumerate via
1297
- * Postgres (count 0), statusCode falls back to empty.
1298
- */
1299
- return emptyAccurate;
1300
- },
1301
- )
1302
- : Promise.resolve(emptyAccurate),
1308
+ resourceListing,
1309
+ resourceListing.then(
1310
+ (
1311
+ listed: ListedResourceFacets,
1312
+ ): Promise<{
1313
+ serviceCounts: Map<string, number>;
1314
+ statusCounts: Map<string, number>;
1315
+ }> => {
1316
+ if (
1317
+ !ResourceFacetPlanner.needsTraceResourceFacetCounts({
1318
+ facetKeys,
1319
+ listed,
1320
+ })
1321
+ ) {
1322
+ return Promise.resolve(emptyAccurate);
1323
+ }
1324
+
1325
+ return TraceAggregationService.getResourceFacetCounts(
1326
+ multiRequest,
1327
+ ).catch(() => {
1328
+ /*
1329
+ * Degrade gracefully: resource facets still enumerate via
1330
+ * Postgres (count 0), statusCode falls back to empty.
1331
+ */
1332
+ return emptyAccurate;
1333
+ });
1334
+ },
1335
+ ),
1303
1336
  wantsRootSpan
1304
1337
  ? TraceAggregationService.getRootSpanCounts(multiRequest).catch(
1305
1338
  () => {
@@ -1360,38 +1393,27 @@ router.post(
1360
1393
  }
1361
1394
 
1362
1395
  /*
1363
- * Replace resource-facet results with the Postgres source-of-truth list
1396
+ * Resource facets answer with the Postgres source-of-truth list
1364
1397
  * (filtered by facetSearchText and enriched with displayName). Every
1365
1398
  * resource facet shares the same exact primaryEntityId -> count map;
1366
1399
  * resource ids are globally unique, so each facet only ever resolves its own
1367
1400
  * entities. Entities with no telemetry in the window surface with count
1368
1401
  * 0 instead of being hidden, and the search box can find resources
1369
- * beyond the loaded subset.
1402
+ * beyond the loaded subset. A facet that listed nothing answers [].
1370
1403
  */
1371
- const resourceSpecs: Array<ResourceFacetSpec> = facetKeys
1372
- .filter((key: string): boolean => {
1373
- return ResourceFacetResolver.isResourceFacet(key);
1374
- })
1375
- .map((key: string): ResourceFacetSpec => {
1376
- return {
1377
- facetKey: key,
1378
- counts: serviceCounts,
1379
- searchText: facetSearchText?.[key],
1380
- limit,
1381
- };
1382
- });
1404
+ const resourceFacets: Record<
1405
+ string,
1406
+ Array<TraceFacetValue>
1407
+ > = ResourceFacetPlanner.mergeResourceFacetCounts({
1408
+ facetKeys,
1409
+ listed: listedResourceFacets,
1410
+ countsFor: (): Map<string, number> => {
1411
+ return serviceCounts;
1412
+ },
1413
+ });
1383
1414
 
1384
- if (resourceSpecs.length > 0) {
1385
- const resolved: Record<
1386
- string,
1387
- Array<ResolvedFacetValue>
1388
- > = await ResourceFacetResolver.resolve(
1389
- databaseProps.tenantId,
1390
- resourceSpecs,
1391
- );
1392
- for (const key of Object.keys(resolved)) {
1393
- facets[key] = resolved[key] as Array<TraceFacetValue>;
1394
- }
1415
+ for (const key of Object.keys(resourceFacets)) {
1416
+ facets[key] = resourceFacets[key] || [];
1395
1417
  }
1396
1418
 
1397
1419
  return Response.sendJsonObjectResponse(req, res, {
@@ -1651,10 +1673,7 @@ router.post(
1651
1673
  ? (body["facetKeys"] as Array<string>)
1652
1674
  : [
1653
1675
  "primaryEntityId",
1654
- "hostId",
1655
- "dockerHostId",
1656
- "podmanHostId",
1657
- "kubernetesClusterId",
1676
+ ...RESOURCE_FACET_CATALOG_KEYS,
1658
1677
  "exceptionType",
1659
1678
  "environment",
1660
1679
  ];
@@ -1712,76 +1731,39 @@ router.post(
1712
1731
  const projectId: ObjectID = databaseProps.tenantId;
1713
1732
 
1714
1733
  /*
1715
- * Per-facet ClickHouse query in parallel. Per-facet errors degrade
1734
+ * Per-facet ClickHouse query in parallel; per-facet errors degrade
1716
1735
  * gracefully to [] so a slow / failing facet can't block the others.
1736
+ * Resource facets answer with the Postgres source-of-truth list
1737
+ * (filtered by facetSearchText, enriched with displayName), listed
1738
+ * first so a type with no rows skips its count query. Same flow as the
1739
+ * log facets endpoint.
1717
1740
  */
1718
- const facetResults: Array<readonly [string, Array<ExceptionFacetValue>]> =
1719
- await Promise.all(
1720
- facetKeys.map(
1721
- async (
1722
- facetKey: string,
1723
- ): Promise<readonly [string, Array<ExceptionFacetValue>]> => {
1724
- try {
1725
- const request: ExceptionFacetRequest = {
1726
- projectId,
1727
- startTime,
1728
- endTime,
1729
- facetKey,
1730
- limit,
1731
- serviceIds,
1732
- exceptionTypes,
1733
- environments,
1734
- fingerprints,
1735
- traceIds,
1736
- escaped,
1737
- messageSearchText,
1738
- };
1739
- const values: Array<ExceptionFacetValue> =
1740
- await ExceptionAggregationService.getFacetValues(request);
1741
- return [facetKey, values] as const;
1742
- } catch {
1743
- return [facetKey, [] as Array<ExceptionFacetValue>] as const;
1744
- }
1745
- },
1746
- ),
1747
- );
1748
-
1749
1741
  const facets: Record<
1750
1742
  string,
1751
1743
  Array<ExceptionFacetValue>
1752
- > = Object.fromEntries(facetResults);
1753
-
1754
- /*
1755
- * Replace resource-facet results with the Postgres source-of-truth list
1756
- * (filtered by facetSearchText and enriched with displayName). Same
1757
- * pattern as the trace/log facets endpoints.
1758
- */
1759
- const resourceSpecs: Array<ResourceFacetSpec> = facetKeys
1760
- .filter((key: string): boolean => {
1761
- return ResourceFacetResolver.isResourceFacet(key);
1762
- })
1763
- .map((key: string): ResourceFacetSpec => {
1764
- const counts: Map<string, number> = new Map();
1765
- for (const fv of facets[key] || []) {
1766
- counts.set(fv.value, fv.count);
1767
- }
1768
- return {
1769
- facetKey: key,
1770
- counts,
1771
- searchText: facetSearchText?.[key],
1744
+ > = await ResourceFacetPlanner.countPerFacet({
1745
+ projectId,
1746
+ facetKeys,
1747
+ facetSearchText,
1748
+ limit,
1749
+ countFacet: (facetKey: string): Promise<Array<ExceptionFacetValue>> => {
1750
+ const request: ExceptionFacetRequest = {
1751
+ projectId,
1752
+ startTime,
1753
+ endTime,
1754
+ facetKey,
1772
1755
  limit,
1756
+ serviceIds,
1757
+ exceptionTypes,
1758
+ environments,
1759
+ fingerprints,
1760
+ traceIds,
1761
+ escaped,
1762
+ messageSearchText,
1773
1763
  };
1774
- });
1775
-
1776
- if (resourceSpecs.length > 0) {
1777
- const resolved: Record<
1778
- string,
1779
- Array<ResolvedFacetValue>
1780
- > = await ResourceFacetResolver.resolve(projectId, resourceSpecs);
1781
- for (const key of Object.keys(resolved)) {
1782
- facets[key] = resolved[key] as Array<ExceptionFacetValue>;
1783
- }
1784
- }
1764
+ return ExceptionAggregationService.getFacetValues(request);
1765
+ },
1766
+ });
1785
1767
 
1786
1768
  return Response.sendJsonObjectResponse(req, res, {
1787
1769
  facets: facets as unknown as JSONObject,
@@ -1818,13 +1800,7 @@ router.post(
1818
1800
 
1819
1801
  const facetKeys: Array<string> = body["facetKeys"]
1820
1802
  ? (body["facetKeys"] as Array<string>)
1821
- : [
1822
- "primaryEntityId",
1823
- "hostId",
1824
- "dockerHostId",
1825
- "podmanHostId",
1826
- "kubernetesClusterId",
1827
- ];
1803
+ : ["primaryEntityId", ...RESOURCE_FACET_CATALOG_KEYS];
1828
1804
 
1829
1805
  const startTime: Date = body["startTime"]
1830
1806
  ? OneUptimeDate.fromString(body["startTime"] as string)
@@ -1858,72 +1834,35 @@ router.post(
1858
1834
  const projectId: ObjectID = databaseProps.tenantId;
1859
1835
 
1860
1836
  /*
1861
- * Per-facet ClickHouse GROUP BY in parallel. Per-facet errors degrade
1862
- * to [] so a slow facet doesn't block the rest.
1837
+ * Per-facet ClickHouse GROUP BY in parallel; per-facet errors degrade
1838
+ * to [] so a slow facet doesn't block the rest. Resource facets answer
1839
+ * with the Postgres source-of-truth list (filtered by facetSearchText,
1840
+ * enriched with displayName), listed first so a type with no rows
1841
+ * skips its count query. Same flow as the log / exception facets
1842
+ * endpoints.
1863
1843
  */
1864
- const facetResults: Array<readonly [string, Array<MetricFacetValue>]> =
1865
- await Promise.all(
1866
- facetKeys.map(
1867
- async (
1868
- facetKey: string,
1869
- ): Promise<readonly [string, Array<MetricFacetValue>]> => {
1870
- try {
1871
- const request: MetricFacetRequest = {
1872
- projectId,
1873
- startTime,
1874
- endTime,
1875
- facetKey,
1876
- limit,
1877
- serviceIds,
1878
- metricNames,
1879
- attributes,
1880
- };
1881
- const values: Array<MetricFacetValue> =
1882
- await MetricAggregationService.getFacetValues(request);
1883
- return [facetKey, values] as const;
1884
- } catch {
1885
- return [facetKey, [] as Array<MetricFacetValue>] as const;
1886
- }
1887
- },
1888
- ),
1889
- );
1890
-
1891
1844
  const facets: Record<
1892
1845
  string,
1893
1846
  Array<MetricFacetValue>
1894
- > = Object.fromEntries(facetResults);
1895
-
1896
- /*
1897
- * Replace resource-facet results with the Postgres source-of-truth list
1898
- * (filtered by facetSearchText and enriched with displayName). Same
1899
- * pattern as the trace / log / exception facets endpoints.
1900
- */
1901
- const resourceSpecs: Array<ResourceFacetSpec> = facetKeys
1902
- .filter((key: string): boolean => {
1903
- return ResourceFacetResolver.isResourceFacet(key);
1904
- })
1905
- .map((key: string): ResourceFacetSpec => {
1906
- const counts: Map<string, number> = new Map();
1907
- for (const fv of facets[key] || []) {
1908
- counts.set(fv.value, fv.count);
1909
- }
1910
- return {
1911
- facetKey: key,
1912
- counts,
1913
- searchText: facetSearchText?.[key],
1847
+ > = await ResourceFacetPlanner.countPerFacet({
1848
+ projectId,
1849
+ facetKeys,
1850
+ facetSearchText,
1851
+ limit,
1852
+ countFacet: (facetKey: string): Promise<Array<MetricFacetValue>> => {
1853
+ const request: MetricFacetRequest = {
1854
+ projectId,
1855
+ startTime,
1856
+ endTime,
1857
+ facetKey,
1914
1858
  limit,
1859
+ serviceIds,
1860
+ metricNames,
1861
+ attributes,
1915
1862
  };
1916
- });
1917
-
1918
- if (resourceSpecs.length > 0) {
1919
- const resolved: Record<
1920
- string,
1921
- Array<ResolvedFacetValue>
1922
- > = await ResourceFacetResolver.resolve(projectId, resourceSpecs);
1923
- for (const key of Object.keys(resolved)) {
1924
- facets[key] = resolved[key] as Array<MetricFacetValue>;
1925
- }
1926
- }
1863
+ return MetricAggregationService.getFacetValues(request);
1864
+ },
1865
+ });
1927
1866
 
1928
1867
  return Response.sendJsonObjectResponse(req, res, {
1929
1868
  facets: facets as unknown as JSONObject,
@@ -3544,7 +3483,7 @@ router.post(
3544
3483
  * Session replay playback
3545
3484
  * ---------------------------------------------------------------------
3546
3485
  *
3547
- * These five routes are the ONLY reader of RumSessionV1 / RumSessionChunkV1:
3486
+ * These routes are the ONLY reader of RumSessionV1 / RumSessionChunkV1:
3548
3487
  * both analytics models deliberately omit `crudApiPath`, so there is no
3549
3488
  * generic CRUD surface for them and ModelPermission is NEVER invoked on
3550
3489
  * this path.
@@ -3630,6 +3569,26 @@ const SESSION_REPLAY_LIST_PERMISSIONS: Array<Permission> = [
3630
3569
  Permission.ReadRumSessionReplayPayload,
3631
3570
  ];
3632
3571
 
3572
+ /*
3573
+ * The optional audit-table enrichment must admit an audit-only reviewer so a
3574
+ * 403 from the shared browser API does not navigate them away from the audit
3575
+ * page. The handler still returns metadata only after a separate LIST-scope
3576
+ * check for the resolved application; audit access alone receives an empty,
3577
+ * successful response.
3578
+ */
3579
+ const SESSION_REPLAY_SUMMARY_PERMISSIONS: Array<Permission> = [
3580
+ ...SESSION_REPLAY_LIST_PERMISSIONS,
3581
+ Permission.ReadRumSessionReplayAudit,
3582
+ ];
3583
+
3584
+ const requireSessionReplaySummaryAccess: Array<RequestHandler> = [
3585
+ UserMiddleware.getUserMiddleware,
3586
+ UserMiddleware.requireUserAuthentication,
3587
+ UserMiddleware.requirePermission({
3588
+ permissions: SESSION_REPLAY_SUMMARY_PERMISSIONS,
3589
+ }),
3590
+ ];
3591
+
3633
3592
  const SESSION_REPLAY_PAYLOAD_PERMISSIONS: Array<Permission> = [
3634
3593
  Permission.ProjectOwner,
3635
3594
  Permission.ProjectAdmin,
@@ -4075,6 +4034,40 @@ const canReadIdentifiedUserLabel: CanReadIdentifiedUserLabelFunction = (data: {
4075
4034
  });
4076
4035
  };
4077
4036
 
4037
+ type CanReadSessionReplayListMetadataFunction = (data: {
4038
+ databaseProps: DatabaseCommonInteractionProps;
4039
+ application: RumApplication;
4040
+ }) => boolean;
4041
+
4042
+ /*
4043
+ * Audit-only roles may load the summaries route so the optional request can
4044
+ * fail closed without a browser-wide forbidden redirect. They still must not
4045
+ * gain the session-list metadata this endpoint projects. Re-evaluate the
4046
+ * list scope against the already-resolved application and turn unsupported
4047
+ * scope shapes into "no metadata" rather than an authorization error.
4048
+ */
4049
+ const canReadSessionReplayListMetadata: CanReadSessionReplayListMetadataFunction =
4050
+ (data: {
4051
+ databaseProps: DatabaseCommonInteractionProps;
4052
+ application: RumApplication;
4053
+ }): boolean => {
4054
+ let scope: SessionReplayScope;
4055
+
4056
+ try {
4057
+ scope = getSessionReplayLabelScope(
4058
+ data.databaseProps,
4059
+ SESSION_REPLAY_LIST_PERMISSIONS,
4060
+ );
4061
+ } catch {
4062
+ return false;
4063
+ }
4064
+
4065
+ return isApplicationInSessionReplayScope({
4066
+ scope: scope,
4067
+ application: data.application,
4068
+ });
4069
+ };
4070
+
4078
4071
  /*
4079
4072
  * The set of applications a label-scoped caller may reach, for the
4080
4073
  * project-wide exception lookup which has no single application to
@@ -4559,8 +4552,6 @@ type ReadSessionIdFromBodyFunction = (body: JSONObject) => string;
4559
4552
  * callers exist - but it is a cap: an unbounded caller-supplied string
4560
4553
  * reaches ClickHouse as a bound parameter on a hot path.
4561
4554
  */
4562
- const MAX_SESSION_REPLAY_SESSION_ID_LENGTH: number = 128;
4563
-
4564
4555
  const readSessionIdFromBody: ReadSessionIdFromBodyFunction = (
4565
4556
  body: JSONObject,
4566
4557
  ): string => {
@@ -4579,6 +4570,51 @@ const readSessionIdFromBody: ReadSessionIdFromBodyFunction = (
4579
4570
  return sessionId;
4580
4571
  };
4581
4572
 
4573
+ type ReadSessionIdsFromBodyFunction = (body: JSONObject) => Array<string>;
4574
+
4575
+ /*
4576
+ * The summaries route accepts one audit-table page at a time. Validate the
4577
+ * raw array before de-duplicating it so repeated values cannot be used to
4578
+ * bypass the request-size ceiling, then preserve first-occurrence order.
4579
+ */
4580
+ const readSessionIdsFromBody: ReadSessionIdsFromBodyFunction = (
4581
+ body: JSONObject,
4582
+ ): Array<string> => {
4583
+ const value: unknown = body["sessionIds"];
4584
+
4585
+ if (!Array.isArray(value) || value.length === 0) {
4586
+ throw new BadDataException("sessionIds must be a non-empty array");
4587
+ }
4588
+
4589
+ if (value.length > MAX_SESSION_REPLAY_SUMMARIES_BATCH_SIZE) {
4590
+ throw new BadDataException(
4591
+ `sessionIds must contain at most ${MAX_SESSION_REPLAY_SUMMARIES_BATCH_SIZE} ids`,
4592
+ );
4593
+ }
4594
+
4595
+ const sessionIds: Array<string> = [];
4596
+ const seen: Set<string> = new Set<string>();
4597
+
4598
+ for (const sessionId of value) {
4599
+ if (typeof sessionId !== "string" || sessionId.length === 0) {
4600
+ throw new BadDataException("Every sessionId must be a non-empty string");
4601
+ }
4602
+
4603
+ if (sessionId.length > MAX_SESSION_REPLAY_SESSION_ID_LENGTH) {
4604
+ throw new BadDataException(
4605
+ `Every sessionId must be at most ${MAX_SESSION_REPLAY_SESSION_ID_LENGTH} characters.`,
4606
+ );
4607
+ }
4608
+
4609
+ if (!seen.has(sessionId)) {
4610
+ seen.add(sessionId);
4611
+ sessionIds.push(sessionId);
4612
+ }
4613
+ }
4614
+
4615
+ return sessionIds;
4616
+ };
4617
+
4582
4618
  /*
4583
4619
  * Caps on the list's filter inputs.
4584
4620
  *
@@ -5133,6 +5169,79 @@ router.post(
5133
5169
  },
5134
5170
  );
5135
5171
 
5172
+ // --- Session Replay Summary Batch Endpoint ---
5173
+
5174
+ /*
5175
+ * Audit rows store only the session id. Resolve one page of those ids into
5176
+ * compact, non-identity session context. Audit-only callers receive an empty
5177
+ * success; session-list metadata is returned only after the resolved
5178
+ * application passes the list scope. The service performs one
5179
+ * application-pinned argMax query, so this route never turns an audit page
5180
+ * into an N+1 ClickHouse workload.
5181
+ */
5182
+ router.post(
5183
+ "/telemetry/rum/session-replay/summaries",
5184
+ ...requireSessionReplaySummaryAccess,
5185
+ async (
5186
+ req: ExpressRequest,
5187
+ res: ExpressResponse,
5188
+ next: NextFunction,
5189
+ ): Promise<void> => {
5190
+ try {
5191
+ const databaseProps: DatabaseCommonInteractionProps =
5192
+ await CommonAPI.getDatabaseCommonInteractionProps(req);
5193
+
5194
+ if (!databaseProps?.tenantId) {
5195
+ return Response.sendErrorResponse(
5196
+ req,
5197
+ res,
5198
+ new BadDataException("Invalid Project ID"),
5199
+ );
5200
+ }
5201
+
5202
+ assertSessionReplayPlan(databaseProps);
5203
+
5204
+ const projectId: ObjectID = databaseProps.tenantId;
5205
+ const body: JSONObject = req.body as JSONObject;
5206
+ const rumApplicationId: ObjectID = readObjectIdFromBody(
5207
+ body,
5208
+ "rumApplicationId",
5209
+ );
5210
+ const sessionIds: Array<string> = readSessionIdsFromBody(body);
5211
+
5212
+ const application: RumApplication =
5213
+ await assertSessionReplayApplicationAccess({
5214
+ projectId: projectId,
5215
+ rumApplicationId: rumApplicationId,
5216
+ databaseProps: databaseProps,
5217
+ permissions: SESSION_REPLAY_SUMMARY_PERMISSIONS,
5218
+ });
5219
+
5220
+ if (
5221
+ !canReadSessionReplayListMetadata({
5222
+ databaseProps: databaseProps,
5223
+ application: application,
5224
+ })
5225
+ ) {
5226
+ return Response.sendJsonObjectResponse(req, res, { sessions: [] });
5227
+ }
5228
+
5229
+ const sessions: Array<SessionReplaySummary> =
5230
+ await SessionReplayReadService.getSessionSummaries({
5231
+ projectId: projectId,
5232
+ rumApplicationId: rumApplicationId,
5233
+ sessionIds: sessionIds,
5234
+ });
5235
+
5236
+ return Response.sendJsonObjectResponse(req, res, {
5237
+ sessions: sessions as unknown as JSONArray,
5238
+ });
5239
+ } catch (err: unknown) {
5240
+ next(err);
5241
+ }
5242
+ },
5243
+ );
5244
+
5136
5245
  // --- Session Replay Users Endpoint ---
5137
5246
 
5138
5247
  /*
@@ -6056,6 +6165,32 @@ router.post(
6056
6165
  );
6057
6166
  }
6058
6167
 
6168
+ const primaryEntityId: ObjectID | undefined =
6169
+ readOptionalObjectIdFromBody(body, "primaryEntityId");
6170
+ const rawPrimaryEntityType: unknown = body["primaryEntityType"];
6171
+ let primaryEntityType: ServiceType | undefined = undefined;
6172
+
6173
+ if (
6174
+ rawPrimaryEntityType !== undefined &&
6175
+ rawPrimaryEntityType !== null &&
6176
+ rawPrimaryEntityType !== ""
6177
+ ) {
6178
+ if (
6179
+ typeof rawPrimaryEntityType !== "string" ||
6180
+ !Object.values(ServiceType).includes(
6181
+ rawPrimaryEntityType as ServiceType,
6182
+ )
6183
+ ) {
6184
+ throw new BadDataException("primaryEntityType is not valid");
6185
+ }
6186
+
6187
+ primaryEntityType = rawPrimaryEntityType as ServiceType;
6188
+ }
6189
+
6190
+ if (primaryEntityId === undefined && primaryEntityType !== undefined) {
6191
+ throw new BadDataException("primaryEntityId is required with its type");
6192
+ }
6193
+
6059
6194
  /*
6060
6195
  * An exception is not scoped to a RUM application, so there is no
6061
6196
  * single application to authorize against. Restrict the query to
@@ -6116,6 +6251,8 @@ router.post(
6116
6251
  await SessionReplayReadService.getSessionsForException({
6117
6252
  projectId: projectId,
6118
6253
  exceptionFingerprint: fingerprint,
6254
+ ...(primaryEntityId !== undefined && { primaryEntityId }),
6255
+ ...(primaryEntityType !== undefined && { primaryEntityType }),
6119
6256
  accessibleRumApplicationIds: accessibleApplications.applicationIds,
6120
6257
  ...(startTime !== undefined && { startTime }),
6121
6258
  ...(endTime !== undefined && { endTime }),