@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,1241 @@
1
+ /*
2
+ * Pure helpers for reading an AI investigation report.
3
+ *
4
+ * The investigation engine posts one markdown blob: a branded heading, the
5
+ * model's own "Summary / Most likely root cause / Evidence / Suggested next
6
+ * steps" note, a server-authored "Evidence checked" list and a footer
7
+ * (AIInvestigationEngine.buildBrandedMarkdown). The dashboard wants to lay
8
+ * those parts out separately, and the server wants the evidence labels and
9
+ * the incident/alert numbers the note mentions.
10
+ *
11
+ * Everything here is text-only and dependency-free so it loads the same in
12
+ * the dashboard bundle, the API server and Common jest. None of it turns
13
+ * model-authored text into links or HTML: callers get plain strings and
14
+ * numbers, and resolve anything clickable from their own database rows.
15
+ */
16
+ export const AI_ROOT_CAUSE_HEADING_TEXT = "AI — Automated Root Cause Analysis";
17
+ export var InvestigationReportSectionKind;
18
+ (function (InvestigationReportSectionKind) {
19
+ InvestigationReportSectionKind["Summary"] = "Summary";
20
+ InvestigationReportSectionKind["RootCause"] = "RootCause";
21
+ InvestigationReportSectionKind["Evidence"] = "Evidence";
22
+ InvestigationReportSectionKind["NextSteps"] = "NextSteps";
23
+ InvestigationReportSectionKind["Other"] = "Other";
24
+ })(InvestigationReportSectionKind || (InvestigationReportSectionKind = {}));
25
+ export const DEFAULT_EVENT_REFERENCE_LIMIT = 25;
26
+ /*
27
+ * Citation marker "[C12]". A fresh RegExp per call because the global flag
28
+ * makes a shared instance stateful (lastIndex) across callers.
29
+ */
30
+ export function getCitationMarkerRegex() {
31
+ return /\[(C\d{1,3})\]/g;
32
+ }
33
+ /*
34
+ * Known labels, keyed by their normalised (lower-cased, whitespace-collapsed)
35
+ * text. A Map rather than an object literal so a heading such as
36
+ * "constructor" can never resolve to an Object.prototype member.
37
+ */
38
+ const KNOWN_LABELS = new Map([
39
+ ["summary", InvestigationReportSectionKind.Summary],
40
+ ["tl;dr", InvestigationReportSectionKind.Summary],
41
+ ["tl; dr", InvestigationReportSectionKind.Summary],
42
+ ["tldr", InvestigationReportSectionKind.Summary],
43
+ ["most likely root cause", InvestigationReportSectionKind.RootCause],
44
+ ["likely root cause", InvestigationReportSectionKind.RootCause],
45
+ ["probable root cause", InvestigationReportSectionKind.RootCause],
46
+ ["root cause", InvestigationReportSectionKind.RootCause],
47
+ ["root cause hypothesis", InvestigationReportSectionKind.RootCause],
48
+ ["evidence", InvestigationReportSectionKind.Evidence],
49
+ ["key evidence", InvestigationReportSectionKind.Evidence],
50
+ ["supporting evidence", InvestigationReportSectionKind.Evidence],
51
+ ["key findings", InvestigationReportSectionKind.Evidence],
52
+ ["findings", InvestigationReportSectionKind.Evidence],
53
+ ["suggested next steps", InvestigationReportSectionKind.NextSteps],
54
+ ["next steps", InvestigationReportSectionKind.NextSteps],
55
+ ["recommended next steps", InvestigationReportSectionKind.NextSteps],
56
+ ["recommended actions", InvestigationReportSectionKind.NextSteps],
57
+ ["recommendations", InvestigationReportSectionKind.NextSteps],
58
+ ["evidence checked", "EvidenceChecked"],
59
+ ]);
60
+ const BRAND_HEADING_MARKER = "automated root cause analysis";
61
+ const FOOTER_PREFIX = "Investigated automatically by OneUptime AI";
62
+ const LINE_ENDING_REGEX = /\r\n?/g;
63
+ const WHITESPACE_RUN_REGEX = /\s+/g;
64
+ const BLANK_LINE_SPLIT_REGEX = /\n[ \t]*\n/;
65
+ // Fences may sit inside list items, so any indentation opens one.
66
+ const FENCE_OPEN_REGEX = /^[ \t]*(`{3,}|~{3,})(.*)$/;
67
+ const FENCE_CLOSE_REGEX = /^[ \t]*(`{3,}|~{3,})[ \t]*$/;
68
+ // Four spaces or a tab is an indented code block, never a section label.
69
+ const INDENTED_CODE_REGEX = /^(?: {4}|\t)/;
70
+ const ATX_HEADING_REGEX = /^ {0,3}#{1,6}(?:[ \t]+(.*))?$/;
71
+ const THEMATIC_BREAK_REGEX = /^ {0,3}(?:(?:-[ \t]*){3,}|(?:\*[ \t]*){3,}|(?:_[ \t]*){3,})$/;
72
+ const LEADING_PARENTHETICAL_REGEX = /^[ \t]*(\([^()]{1,80}\))/;
73
+ /*
74
+ * Longest text worth looking up as a label: the longest known label plus a
75
+ * decorative prefix, a colon and a "(medium confidence)" style qualifier.
76
+ */
77
+ const MAX_KNOWN_LABEL_INPUT_LENGTH = 160;
78
+ const LEADING_NUMBERING_REGEX = /^\d{1,2}[.)][ \t]+/;
79
+ const ENDS_WITH_SENTENCE_PUNCTUATION_REGEX = /[.!?]$/;
80
+ // A label needs some text beyond emphasis markers and punctuation ("**_**").
81
+ const HAS_LABEL_TEXT_REGEX = /[^\s*_~`#:.—–-]/;
82
+ const CITATION_MARKER_TEST_REGEX = /\[C\d{1,3}\]/;
83
+ /*
84
+ * "**Label** rest" / "__Label__ rest". The optional second group lets
85
+ * "***Label***" (bold italic) unwrap cleanly instead of leaving a stray "*".
86
+ */
87
+ const STRONG_LEAD_REGEX = /^(\*\*|__)(\*|_)?(.+?)\2?\1(.*)$/;
88
+ const SEPARATOR_PREFIX_REGEX = /^(?:[:—–]|-{1,2})[ \t]*/;
89
+ // The text before the first ":" of a plain "Summary: body" line.
90
+ const PLAIN_LABEL_REGEX = /^[A-Za-z][A-Za-z \t;,()]{0,60}$/;
91
+ // Bold-only lines longer than this read as emphasised prose, not a label.
92
+ const MAX_BOLD_LABEL_LENGTH = 80;
93
+ // Bold and plain labels rank below every ATX heading level (1-6).
94
+ const BOLD_LABEL_RANK = 7;
95
+ const LIST_ITEM_REGEX = /^[ \t]*(?:[-*+]|\d{1,3}[.)])(?:[ \t]+|$)/;
96
+ const LIST_CONTINUATION_REGEX = /^[ \t]{2,}\S/;
97
+ const LEADING_WHITESPACE_REGEX = /^[ \t]/;
98
+ /*
99
+ * "- **[C1]** label — 7 row(s)". The label is greedy so a label that itself
100
+ * contains " — " keeps everything up to the LAST " — N row(s)".
101
+ */
102
+ const EVIDENCE_CHECKED_ENTRY_REGEX = /^[ \t]*(?:[-*+]|\d{1,3}[.)])[ \t]+(?:\*\*|__)?\[(C\d{1,3})\](?:\*\*|__)?(.+)[ \t][—–-][ \t]+(\d+)[ \t]+rows?(?:\(s\))?[ \t]*$/i;
103
+ // The entry regex backtracks over the label; never feed it a runaway line.
104
+ const MAX_EVIDENCE_CHECKED_LINE_LENGTH = 2000;
105
+ const FOOTER_EMPHASIS_REGEX = /^(\*\*|__|\*|_)([\s\S]+)\1$/;
106
+ const FOOTER_USING_REGEX = /\busing[ \t]+/;
107
+ const FOOTER_QUERIES_RUN_REGEX = /\bquer(?:y|ies)[ \t]+run\b/i;
108
+ const DIGIT_REGEX = /\d/;
109
+ const EVENT_REFERENCE_PATTERN = "#(\\d{1,9})(?!\\w)";
110
+ const WORD_CHARACTER_REGEX = /\w/;
111
+ const WHITESPACE_CHARACTER_REGEX = /\s/;
112
+ const FORBIDDEN_BEFORE_REFERENCE = "&/#";
113
+ /*
114
+ * Punctuation that may sit between a qualifier word and its "#": "incidents:
115
+ * #1", "alerts (#2", "alert [#3]" and, where the raw markdown is scanned,
116
+ * "**Alerts** #4". Bounded so a stray word far back is never read.
117
+ */
118
+ const QUALIFIER_GAP_PUNCTUATION = ":([*_";
119
+ const MAX_QUALIFIER_GAP_PUNCTUATION = 4;
120
+ /*
121
+ * Words that put a "#N" in some other numbering: a scheduled maintenance
122
+ * event, an episode, a pull request, a build, a list position. The number is
123
+ * not an incident or an alert, so it must not fall back to the subject's
124
+ * kind and link to whichever record happens to share it.
125
+ */
126
+ const NON_EVENT_QUALIFIER_WORDS = new Set([
127
+ "maintenance",
128
+ "maintenances",
129
+ "episode",
130
+ "episodes",
131
+ "pr",
132
+ "prs",
133
+ "mr",
134
+ "mrs",
135
+ "pull",
136
+ "request",
137
+ "requests",
138
+ "issue",
139
+ "issues",
140
+ "ticket",
141
+ "tickets",
142
+ "bug",
143
+ "bugs",
144
+ "commit",
145
+ "commits",
146
+ "build",
147
+ "builds",
148
+ "deploy",
149
+ "deploys",
150
+ "deployment",
151
+ "deployments",
152
+ "release",
153
+ "releases",
154
+ "version",
155
+ "versions",
156
+ "run",
157
+ "runs",
158
+ "job",
159
+ "jobs",
160
+ "pipeline",
161
+ "pipelines",
162
+ "step",
163
+ "steps",
164
+ "attempt",
165
+ "attempts",
166
+ "retry",
167
+ "retries",
168
+ "item",
169
+ "items",
170
+ "line",
171
+ "lines",
172
+ "row",
173
+ "rows",
174
+ "port",
175
+ "ports",
176
+ "pod",
177
+ "pods",
178
+ "replica",
179
+ "replicas",
180
+ "node",
181
+ "nodes",
182
+ "shard",
183
+ "shards",
184
+ "worker",
185
+ "workers",
186
+ "instance",
187
+ "instances",
188
+ "page",
189
+ "pages",
190
+ "phase",
191
+ "phases",
192
+ "stage",
193
+ "stages",
194
+ "option",
195
+ "options",
196
+ "rank",
197
+ "priority",
198
+ "no",
199
+ "number",
200
+ "monitor",
201
+ "monitors",
202
+ ]);
203
+ // Longer than any qualifier or non-event word: never worth lower-casing.
204
+ const MAX_QUALIFIER_WORD_LENGTH = 16;
205
+ const SIBLING_SEPARATOR_REGEX = /^(?:[ \t\n]*,[ \t\n]*(?:(?:and|or)[ \t\n]+)?|[ \t\n]+(?:and|or)[ \t\n]+)$/i;
206
+ // ", and " with generous whitespace; a longer gap is never a list separator.
207
+ const MAX_SIBLING_SEPARATOR_LENGTH = 16;
208
+ /*
209
+ * Stands in for an inline code span while scanning for references: not
210
+ * whitespace (so a qualifier cannot reach across it), not a word character
211
+ * and not one of the characters that block a reference.
212
+ */
213
+ const CODE_SPAN_PLACEHOLDER = String.fromCharCode(0xfffc);
214
+ function normaliseLineEndings(markdown) {
215
+ if (typeof markdown !== "string") {
216
+ return "";
217
+ }
218
+ return markdown.replace(LINE_ENDING_REGEX, "\n");
219
+ }
220
+ /*
221
+ * Marks every line that belongs to a fenced code block, fence lines
222
+ * included. Nothing inside a fence may start a section, a footer or an
223
+ * evidence block. An unclosed fence runs to the end of the document, as it
224
+ * does when the markdown is rendered.
225
+ */
226
+ function markFencedLines(lines) {
227
+ const fenced = [];
228
+ let openFence = null;
229
+ for (const line of lines) {
230
+ if (openFence === null) {
231
+ const open = FENCE_OPEN_REGEX.exec(line);
232
+ const marker = (open === null || open === void 0 ? void 0 : open[1]) || "";
233
+ const info = (open === null || open === void 0 ? void 0 : open[2]) || "";
234
+ // A backtick fence's info string cannot contain a backtick ("```a```" is inline code).
235
+ if (marker && !(marker.charAt(0) === "`" && info.includes("`"))) {
236
+ openFence = marker;
237
+ fenced.push(true);
238
+ continue;
239
+ }
240
+ fenced.push(false);
241
+ continue;
242
+ }
243
+ fenced.push(true);
244
+ const close = FENCE_CLOSE_REGEX.exec(line);
245
+ const closeMarker = (close === null || close === void 0 ? void 0 : close[1]) || "";
246
+ if (closeMarker &&
247
+ closeMarker.charAt(0) === openFence.charAt(0) &&
248
+ closeMarker.length >= openFence.length) {
249
+ openFence = null;
250
+ }
251
+ }
252
+ return fenced;
253
+ }
254
+ // Emoji and pictographic symbols a model likes to put in front of a heading.
255
+ function isDecorativeCodePoint(codePoint) {
256
+ return ((codePoint >= 0x2000 && codePoint <= 0x2bff) ||
257
+ codePoint >= 0x1f000 ||
258
+ codePoint === 0xfe0f ||
259
+ codePoint === 0x200d);
260
+ }
261
+ function stripLeadingDecoration(label) {
262
+ let cursor = 0;
263
+ while (cursor < label.length) {
264
+ const codePoint = label.codePointAt(cursor) || 0;
265
+ const character = String.fromCodePoint(codePoint);
266
+ if (!WHITESPACE_CHARACTER_REGEX.test(character) &&
267
+ !isDecorativeCodePoint(codePoint)) {
268
+ break;
269
+ }
270
+ cursor += character.length;
271
+ }
272
+ return label.slice(cursor).replace(LEADING_NUMBERING_REGEX, "");
273
+ }
274
+ /*
275
+ * The trailing-edge helpers below are plain string scans on purpose. The
276
+ * obvious regexes (/[ \t]*:[ \t]*$/, /(?:^|[ \t]+)#+[ \t]*$/ ...) backtrack
277
+ * quadratically over a long run of spaces, and this text is model-authored:
278
+ * one 20 KB line froze the parser for a minute when they were regexes.
279
+ */
280
+ function endsWithColon(value) {
281
+ return value.trimEnd().endsWith(":");
282
+ }
283
+ function stripTrailingColon(value) {
284
+ const trimmed = value.trimEnd();
285
+ return trimmed.endsWith(":") ? trimmed.slice(0, -1).trimEnd() : trimmed;
286
+ }
287
+ // "Most likely root cause (medium confidence)" -> "Most likely root cause".
288
+ function stripTrailingParenthetical(value) {
289
+ const trimmed = value.trimEnd();
290
+ if (!trimmed.endsWith(")")) {
291
+ return trimmed;
292
+ }
293
+ const open = trimmed.lastIndexOf("(");
294
+ if (open === -1 || trimmed.slice(open + 1, -1).includes(")")) {
295
+ return trimmed;
296
+ }
297
+ return trimmed.slice(0, open).trimEnd();
298
+ }
299
+ // "## Summary ##" -> "Summary"; "## C#" keeps its hash.
300
+ function stripAtxClosingSequence(value) {
301
+ const trimmed = value.trimEnd();
302
+ let end = trimmed.length;
303
+ while (end > 0 && trimmed.charAt(end - 1) === "#") {
304
+ end--;
305
+ }
306
+ if (end === trimmed.length) {
307
+ return trimmed;
308
+ }
309
+ if (end === 0) {
310
+ return "";
311
+ }
312
+ const before = trimmed.charAt(end - 1);
313
+ return before === " " || before === "\t"
314
+ ? trimmed.slice(0, end).trimEnd()
315
+ : trimmed;
316
+ }
317
+ /*
318
+ * Splits "Summary — body" / "Summary – body" / "Summary - body" at the first
319
+ * dash separator. A hyphen only separates with whitespace on both sides, so
320
+ * "on-call" never splits.
321
+ */
322
+ function splitAtFirstDash(value) {
323
+ for (let index = 0; index < value.length; index++) {
324
+ const character = value.charAt(index);
325
+ if (character === "—" || character === "–") {
326
+ return { label: value.slice(0, index), rest: value.slice(index + 1) };
327
+ }
328
+ if (character !== "-" || index === 0) {
329
+ continue;
330
+ }
331
+ const previous = value.charAt(index - 1);
332
+ let after = index + 1;
333
+ if (value.charAt(after) === "-") {
334
+ after++;
335
+ }
336
+ const next = value.charAt(after);
337
+ if ((previous === " " || previous === "\t") &&
338
+ (next === " " || next === "\t")) {
339
+ return { label: value.slice(0, index), rest: value.slice(after) };
340
+ }
341
+ }
342
+ return null;
343
+ }
344
+ /*
345
+ * Removes wrapping emphasis and a trailing colon, inside or outside the
346
+ * emphasis: "**Summary:**", "**Summary**:", "__Summary__", "***Summary***".
347
+ */
348
+ function cleanLabel(raw) {
349
+ let label = stripTrailingColon(raw.trim());
350
+ for (const delimiter of ["**", "__", "*", "_"]) {
351
+ const isWrapped = label.length > delimiter.length * 2 &&
352
+ label.startsWith(delimiter) &&
353
+ label.endsWith(delimiter) &&
354
+ !label
355
+ .slice(delimiter.length, label.length - delimiter.length)
356
+ .includes(delimiter);
357
+ if (isWrapped) {
358
+ label = stripTrailingColon(label.slice(delimiter.length, label.length - delimiter.length).trim());
359
+ }
360
+ }
361
+ return label;
362
+ }
363
+ function tidyTitle(label) {
364
+ const collapsed = label.replace(WHITESPACE_RUN_REGEX, " ").trim();
365
+ const stripped = stripLeadingDecoration(collapsed).trim();
366
+ return stripped || collapsed;
367
+ }
368
+ function lookupLabel(label) {
369
+ // Every known label is short; anything longer is prose.
370
+ if (label.length > MAX_KNOWN_LABEL_INPUT_LENGTH) {
371
+ return null;
372
+ }
373
+ const key = stripTrailingColon(stripTrailingParenthetical(stripLeadingDecoration(label)))
374
+ .replace(WHITESPACE_RUN_REGEX, " ")
375
+ .trim()
376
+ .toLowerCase();
377
+ return KNOWN_LABELS.get(key) || null;
378
+ }
379
+ function looksLikeBoldLabel(title) {
380
+ return (HAS_LABEL_TEXT_REGEX.test(title) &&
381
+ title.length <= MAX_BOLD_LABEL_LENGTH &&
382
+ !ENDS_WITH_SENTENCE_PUNCTUATION_REGEX.test(title) &&
383
+ !CITATION_MARKER_TEST_REGEX.test(title));
384
+ }
385
+ /*
386
+ * "**Label**", "**Label:**", "**Label** — body", "**Label:** body",
387
+ * "**Label** (medium confidence) — body". A bold phrase followed by prose
388
+ * with no separator ("**Root cause** is unclear") is not a label line.
389
+ */
390
+ function matchStrongLead(content) {
391
+ const lead = STRONG_LEAD_REGEX.exec(content);
392
+ if (!lead) {
393
+ return null;
394
+ }
395
+ const inner = lead[3] || "";
396
+ let rest = lead[4] || "";
397
+ const label = cleanLabel(inner);
398
+ if (!label) {
399
+ return null;
400
+ }
401
+ const innerEndsWithColon = endsWithColon(inner);
402
+ let qualifier = "";
403
+ const parenthetical = LEADING_PARENTHETICAL_REGEX.exec(rest);
404
+ if (parenthetical) {
405
+ qualifier = parenthetical[1] || "";
406
+ rest = rest.slice(parenthetical[0].length);
407
+ }
408
+ const restTrimmed = rest.trim();
409
+ let inlineBody = "";
410
+ let isBare = false;
411
+ if (restTrimmed === "" || restTrimmed === ":") {
412
+ isBare = qualifier === "";
413
+ }
414
+ else {
415
+ const separator = SEPARATOR_PREFIX_REGEX.exec(restTrimmed);
416
+ if (separator) {
417
+ inlineBody = restTrimmed.slice(separator[0].length).trim();
418
+ }
419
+ else if (innerEndsWithColon) {
420
+ // "**Root cause:** body" and "**Root cause:** (medium confidence) body".
421
+ inlineBody = restTrimmed;
422
+ }
423
+ else {
424
+ return null;
425
+ }
426
+ }
427
+ const title = tidyTitle(qualifier ? `${label} ${qualifier}` : label);
428
+ const kind = lookupLabel(label);
429
+ isBare = isBare && looksLikeBoldLabel(title);
430
+ if (kind === null && !isBare) {
431
+ return null;
432
+ }
433
+ return { kind, title, inlineBody, isBare };
434
+ }
435
+ // "Summary: body" — only for known labels.
436
+ function matchPlainLabel(content) {
437
+ const colon = content.indexOf(":");
438
+ if (colon <= 0) {
439
+ return null;
440
+ }
441
+ const label = content.slice(0, colon).trim();
442
+ if (!PLAIN_LABEL_REGEX.test(label)) {
443
+ return null;
444
+ }
445
+ const kind = lookupLabel(label);
446
+ if (kind === null) {
447
+ return null;
448
+ }
449
+ const inlineBody = content.slice(colon + 1).trim();
450
+ return {
451
+ kind,
452
+ title: tidyTitle(label),
453
+ inlineBody,
454
+ isBare: inlineBody === "",
455
+ };
456
+ }
457
+ function matchHeading(headingText) {
458
+ const text = stripAtxClosingSequence(headingText).trim();
459
+ if (!text) {
460
+ return null;
461
+ }
462
+ const full = cleanLabel(text);
463
+ const fullKind = lookupLabel(full);
464
+ if (fullKind !== null) {
465
+ return {
466
+ kind: fullKind,
467
+ title: tidyTitle(full),
468
+ inlineBody: "",
469
+ isBare: true,
470
+ };
471
+ }
472
+ // "## Summary: body", "## **Summary** — body", "## Summary — body".
473
+ const lead = text.startsWith("**") || text.startsWith("__")
474
+ ? matchStrongLead(text)
475
+ : matchPlainLabel(text);
476
+ if (lead && lead.kind !== null) {
477
+ return Object.assign(Object.assign({}, lead), { isBare: lead.inlineBody === "" });
478
+ }
479
+ const dash = splitAtFirstDash(text);
480
+ if (dash) {
481
+ const dashLabel = cleanLabel(dash.label);
482
+ const dashKind = lookupLabel(dashLabel);
483
+ const dashBody = dash.rest.trim();
484
+ if (dashKind !== null) {
485
+ return {
486
+ kind: dashKind,
487
+ title: tidyTitle(dashLabel),
488
+ inlineBody: dashBody,
489
+ isBare: dashBody === "",
490
+ };
491
+ }
492
+ }
493
+ // Any other heading may open an "Other" section, titled as written.
494
+ return {
495
+ kind: null,
496
+ title: tidyTitle(full || text),
497
+ inlineBody: "",
498
+ isBare: true,
499
+ };
500
+ }
501
+ // "### Evidence" -> 3. Only called on a line ATX_HEADING_REGEX accepted.
502
+ function countLeadingHashes(line) {
503
+ const content = line.trimStart();
504
+ let level = 0;
505
+ while (level < content.length && content.charAt(level) === "#") {
506
+ level++;
507
+ }
508
+ return level;
509
+ }
510
+ /*
511
+ * How deep a label sits in the outline: its heading level, with bold and
512
+ * plain labels below every heading.
513
+ */
514
+ function getLabelRank(match) {
515
+ return match.headingLevel || BOLD_LABEL_RANK;
516
+ }
517
+ function matchSectionStart(line) {
518
+ // "*****" is a thematic break, not an empty bold label.
519
+ if (INDENTED_CODE_REGEX.test(line) || THEMATIC_BREAK_REGEX.test(line)) {
520
+ return null;
521
+ }
522
+ const heading = ATX_HEADING_REGEX.exec(line);
523
+ if (heading) {
524
+ const headingMatch = matchHeading(heading[1] || "");
525
+ return headingMatch
526
+ ? Object.assign(Object.assign({}, headingMatch), { headingLevel: countLeadingHashes(line) }) : null;
527
+ }
528
+ const content = line.trim();
529
+ if (!content) {
530
+ return null;
531
+ }
532
+ if (content.startsWith("**") || content.startsWith("__")) {
533
+ return matchStrongLead(content);
534
+ }
535
+ return matchPlainLabel(content);
536
+ }
537
+ function isBrandHeading(line) {
538
+ const heading = ATX_HEADING_REGEX.exec(line);
539
+ return Boolean(heading && (heading[1] || "").toLowerCase().includes(BRAND_HEADING_MARKER));
540
+ }
541
+ /*
542
+ * The footer is the LAST thematic break (outside code) followed by nothing
543
+ * but one emphasis paragraph starting with the OneUptime AI footer text.
544
+ */
545
+ function findFooter(lines, fenced) {
546
+ let breakIndex = -1;
547
+ for (let index = lines.length - 1; index >= 0; index--) {
548
+ if (!fenced[index] && THEMATIC_BREAK_REGEX.test(lines[index] || "")) {
549
+ breakIndex = index;
550
+ break;
551
+ }
552
+ }
553
+ if (breakIndex < 0) {
554
+ return null;
555
+ }
556
+ const trailing = lines
557
+ .slice(breakIndex + 1)
558
+ .join("\n")
559
+ .trim();
560
+ if (!trailing || BLANK_LINE_SPLIT_REGEX.test(trailing)) {
561
+ return null;
562
+ }
563
+ const paragraph = trailing
564
+ .split("\n")
565
+ .map((line) => {
566
+ return line.trim();
567
+ })
568
+ .join(" ");
569
+ const emphasis = FOOTER_EMPHASIS_REGEX.exec(paragraph);
570
+ const text = ((emphasis === null || emphasis === void 0 ? void 0 : emphasis[2]) || "").trim();
571
+ if (!text.startsWith(FOOTER_PREFIX)) {
572
+ return null;
573
+ }
574
+ const footer = { text };
575
+ const modelName = readFooterModelName(text);
576
+ if (modelName) {
577
+ footer.modelName = modelName;
578
+ }
579
+ const queryCount = readFooterQueryCount(text);
580
+ if (queryCount !== undefined) {
581
+ footer.queryCount = queryCount;
582
+ }
583
+ return { breakIndex, footer };
584
+ }
585
+ /*
586
+ * "... telemetry using gpt-4.1-mini. This is ..." -> "gpt-4.1-mini". The
587
+ * name ends at the first "." followed by whitespace or the end, so dots
588
+ * inside a model name survive. A scan rather than a lazy regex, which
589
+ * rescans the rest of the text for every "using".
590
+ */
591
+ function readFooterModelName(text) {
592
+ const using = FOOTER_USING_REGEX.exec(text);
593
+ if (!using) {
594
+ return undefined;
595
+ }
596
+ const start = using.index + using[0].length;
597
+ for (let index = start; index < text.length; index++) {
598
+ if (text.charAt(index) === "." &&
599
+ (index + 1 === text.length ||
600
+ WHITESPACE_CHARACTER_REGEX.test(text.charAt(index + 1)))) {
601
+ return text.slice(start, index).trim() || undefined;
602
+ }
603
+ }
604
+ return undefined;
605
+ }
606
+ // "... 7 queries run ..." / "... 1 query run ..." -> 7 / 1.
607
+ function readFooterQueryCount(text) {
608
+ const queries = FOOTER_QUERIES_RUN_REGEX.exec(text);
609
+ if (!queries) {
610
+ return undefined;
611
+ }
612
+ let cursor = queries.index - 1;
613
+ const spaceEnd = cursor;
614
+ while (cursor >= 0 &&
615
+ (text.charAt(cursor) === " " || text.charAt(cursor) === "\t")) {
616
+ cursor--;
617
+ }
618
+ if (cursor === spaceEnd) {
619
+ return undefined;
620
+ }
621
+ const digitsEnd = cursor + 1;
622
+ while (cursor >= 0 && DIGIT_REGEX.test(text.charAt(cursor))) {
623
+ cursor--;
624
+ }
625
+ const digits = text.slice(cursor + 1, digitsEnd);
626
+ // The engine's tool-call budget is tiny; a huge number is not a count.
627
+ if (!digits || digits.length > 9) {
628
+ return undefined;
629
+ }
630
+ return parseInt(digits, 10);
631
+ }
632
+ /*
633
+ * The lines an "Evidence checked" block owns: its label line, then list
634
+ * items (with their indented continuations) and the blank lines between
635
+ * them. The first other line ends the block, so prose that follows it is
636
+ * never swallowed.
637
+ */
638
+ function findEvidenceCheckedBlockEnd(lines, fenced, labelIndex, contentEnd) {
639
+ let end = labelIndex + 1;
640
+ let cursor = labelIndex + 1;
641
+ let insideList = false;
642
+ while (cursor < contentEnd) {
643
+ const line = lines[cursor] || "";
644
+ if (fenced[cursor]) {
645
+ break;
646
+ }
647
+ if (!line.trim()) {
648
+ cursor++;
649
+ continue;
650
+ }
651
+ if (LIST_ITEM_REGEX.test(line)) {
652
+ insideList = true;
653
+ }
654
+ else if (!(insideList && LIST_CONTINUATION_REGEX.test(line))) {
655
+ break;
656
+ }
657
+ cursor++;
658
+ end = cursor;
659
+ }
660
+ return end;
661
+ }
662
+ function parseEvidenceCheckedEntries(lines) {
663
+ const entries = [];
664
+ const seen = new Set();
665
+ for (const line of lines) {
666
+ if (line.length > MAX_EVIDENCE_CHECKED_LINE_LENGTH) {
667
+ continue;
668
+ }
669
+ const entry = EVIDENCE_CHECKED_ENTRY_REGEX.exec(line);
670
+ if (!entry) {
671
+ continue;
672
+ }
673
+ const citationId = (entry[1] || "").toUpperCase();
674
+ const label = (entry[2] || "").trim();
675
+ if (!citationId || !label || seen.has(citationId)) {
676
+ continue;
677
+ }
678
+ seen.add(citationId);
679
+ entries.push({
680
+ citationId,
681
+ label,
682
+ rowCount: parseInt(entry[3] || "0", 10),
683
+ });
684
+ }
685
+ return entries;
686
+ }
687
+ function createEmptyReport() {
688
+ return {
689
+ isStructured: false,
690
+ preamble: "",
691
+ sections: [],
692
+ summary: undefined,
693
+ rootCause: undefined,
694
+ evidence: undefined,
695
+ nextSteps: undefined,
696
+ evidenceChecked: [],
697
+ footer: undefined,
698
+ bodyMarkdown: "",
699
+ };
700
+ }
701
+ /*
702
+ * Joins the kept lines of [from, to). Untrimmed on purpose: a section body
703
+ * is appended to its inline first line, and the blank line between them is
704
+ * what keeps them separate paragraphs.
705
+ */
706
+ function joinKeptLines(lines, kept, from, to) {
707
+ const output = [];
708
+ let lastWasRemoved = false;
709
+ for (let index = from; index < to; index++) {
710
+ if (!kept[index]) {
711
+ lastWasRemoved = true;
712
+ continue;
713
+ }
714
+ const line = lines[index] || "";
715
+ const previous = output[output.length - 1];
716
+ /*
717
+ * Keep a blank line where a block was cut out, so the text on either
718
+ * side cannot merge into one paragraph.
719
+ */
720
+ if (lastWasRemoved &&
721
+ line.trim() !== "" &&
722
+ (previous === undefined || previous.trim() !== "")) {
723
+ output.push("");
724
+ }
725
+ lastWasRemoved = false;
726
+ output.push(line);
727
+ }
728
+ return output.join("\n");
729
+ }
730
+ /*
731
+ * Every kept line outside code that reads like a section label, in order.
732
+ * An indented line inside a list continues a list item ("1. Roll back", then
733
+ * " Evidence: pool at 100%"), so it never starts a section: that would cut
734
+ * the list in two and could hand the rest of it to another section kind.
735
+ */
736
+ function findSectionCandidates(lines, fenced, kept, contentEnd) {
737
+ const candidates = [];
738
+ let insideList = false;
739
+ for (let index = 0; index < contentEnd; index++) {
740
+ const line = lines[index] || "";
741
+ // Blank lines keep the list context: a list item may span paragraphs.
742
+ if (!kept[index] || fenced[index] || !line.trim()) {
743
+ continue;
744
+ }
745
+ const isIndented = LEADING_WHITESPACE_REGEX.test(line);
746
+ if (THEMATIC_BREAK_REGEX.test(line)) {
747
+ insideList = false;
748
+ }
749
+ else if (LIST_ITEM_REGEX.test(line)) {
750
+ insideList = true;
751
+ }
752
+ else if (!isIndented) {
753
+ insideList = false;
754
+ }
755
+ else if (insideList) {
756
+ continue;
757
+ }
758
+ const match = matchSectionStart(line);
759
+ if (match) {
760
+ candidates.push({ index, match });
761
+ }
762
+ }
763
+ return candidates;
764
+ }
765
+ /*
766
+ * Turns label candidates into the section starts the report is cut at.
767
+ *
768
+ * Recognised labels always start a section (one with no body is dropped
769
+ * later, as before). Unknown headings and bold-only labels, including a
770
+ * model-authored "Evidence checked", start an "Other" section only once the
771
+ * structured part of the note has begun, and only when they are not part of
772
+ * the section already open:
773
+ *
774
+ * - a heading deeper than the recognised heading that opened the section
775
+ * ("## Evidence" then "### Metrics") belongs to it;
776
+ * - a label directly under a label with no body of its own makes that
777
+ * label a group heading ("## Most likely root cause" then "### Pool
778
+ * exhaustion"), and the group's later labels at the same depth or deeper
779
+ * stay in it too;
780
+ * - a label with nothing under it ("**Confidence: medium**" at the end) is
781
+ * a line of the open section, not an empty section of its own.
782
+ *
783
+ * So a section title is never lost because its body opens with a sub-label,
784
+ * and no content is ever dropped.
785
+ */
786
+ function resolveSectionStarts(lines, kept, allCandidates, contentEnd) {
787
+ /*
788
+ * Kept lines with text before each index, so "is there any content in
789
+ * [from, to)" is O(1) however many labels a section swallows.
790
+ */
791
+ const contentBefore = [0];
792
+ for (let index = 0; index < lines.length; index++) {
793
+ const hasText = kept[index] === true && (lines[index] || "").trim() !== "";
794
+ contentBefore.push((contentBefore[index] || 0) + (hasText ? 1 : 0));
795
+ }
796
+ const hasKeptContent = (from, to) => {
797
+ return (to > from && (contentBefore[to] || 0) - (contentBefore[from] || 0) > 0);
798
+ };
799
+ const isRecognised = (match) => {
800
+ return match.kind !== null && match.kind !== "EvidenceChecked";
801
+ };
802
+ /*
803
+ * A heading at the same or a shallower level than the heading before it is
804
+ * its peer, never its sub-label ("## Impact" then "## Timeline").
805
+ */
806
+ const isPeerHeading = (openLevel, match) => {
807
+ const level = match.headingLevel || 0;
808
+ return openLevel > 0 && level > 0 && level <= openLevel;
809
+ };
810
+ // A label with inline text ("Evidence checked: logs") is just a line of prose.
811
+ const candidates = allCandidates.filter((candidate) => {
812
+ return (kept[candidate.index] === true &&
813
+ (isRecognised(candidate.match) || candidate.match.isBare));
814
+ });
815
+ /*
816
+ * Whether an "Other" label at this position has a body: text before the
817
+ * next label, or a next label that would become its sub-label and itself
818
+ * has a body. Walked backwards so a run of labels costs linear time.
819
+ */
820
+ const hasBody = candidates.map(() => {
821
+ return false;
822
+ });
823
+ for (let position = candidates.length - 1; position >= 0; position--) {
824
+ const candidate = candidates[position];
825
+ const next = candidates[position + 1];
826
+ if (!candidate) {
827
+ continue;
828
+ }
829
+ hasBody[position] =
830
+ hasKeptContent(candidate.index + 1, next ? next.index : contentEnd) ||
831
+ Boolean(next &&
832
+ !isRecognised(next.match) &&
833
+ !isPeerHeading(candidate.match.headingLevel || 0, next.match) &&
834
+ hasBody[position + 1]);
835
+ }
836
+ const starts = [];
837
+ candidates.forEach((candidate, position) => {
838
+ const match = candidate.match;
839
+ const headingLevel = match.headingLevel || 0;
840
+ if (match.kind !== null && match.kind !== "EvidenceChecked") {
841
+ starts.push({
842
+ index: candidate.index,
843
+ kind: match.kind,
844
+ title: match.title,
845
+ inlineBody: match.inlineBody,
846
+ headingLevel,
847
+ });
848
+ return;
849
+ }
850
+ const open = starts[starts.length - 1];
851
+ // Before the first recognised section, labels are preamble content.
852
+ if (!open) {
853
+ return;
854
+ }
855
+ const rank = getLabelRank(match);
856
+ // A sub-heading of the recognised heading that opened the section.
857
+ if (open.kind !== InvestigationReportSectionKind.Other &&
858
+ open.headingLevel > 0 &&
859
+ headingLevel > open.headingLevel) {
860
+ return;
861
+ }
862
+ // The first label under a label with no body: that label is a group heading.
863
+ if (open.inlineBody === "" &&
864
+ !hasKeptContent(open.index + 1, candidate.index) &&
865
+ !isPeerHeading(open.headingLevel, match)) {
866
+ open.subLabelRank = rank;
867
+ return;
868
+ }
869
+ // The group's later labels, at its sub-labels' depth or deeper.
870
+ if (open.subLabelRank !== undefined && rank >= open.subLabelRank) {
871
+ return;
872
+ }
873
+ // A label with nothing under it is a line of the open section.
874
+ if (!hasBody[position]) {
875
+ return;
876
+ }
877
+ starts.push({
878
+ index: candidate.index,
879
+ kind: InvestigationReportSectionKind.Other,
880
+ title: match.title,
881
+ inlineBody: "",
882
+ headingLevel,
883
+ });
884
+ });
885
+ return starts;
886
+ }
887
+ export function parseInvestigationReport(markdown) {
888
+ const normalised = normaliseLineEndings(markdown);
889
+ if (!normalised.trim()) {
890
+ return createEmptyReport();
891
+ }
892
+ const lines = normalised.split("\n");
893
+ const fenced = markFencedLines(lines);
894
+ const kept = lines.map(() => {
895
+ return true;
896
+ });
897
+ // 1. The branded heading, when it is the first thing in the document.
898
+ const firstContentIndex = lines.findIndex((line) => {
899
+ return line.trim() !== "";
900
+ });
901
+ if (firstContentIndex >= 0 &&
902
+ !fenced[firstContentIndex] &&
903
+ isBrandHeading(lines[firstContentIndex] || "")) {
904
+ kept[firstContentIndex] = false;
905
+ }
906
+ // 2. The footer.
907
+ const footerMatch = findFooter(lines, fenced);
908
+ const contentEnd = footerMatch
909
+ ? footerMatch.breakIndex
910
+ : lines.length;
911
+ for (let index = contentEnd; index < lines.length; index++) {
912
+ kept[index] = false;
913
+ }
914
+ // 3. Every line that could start a section.
915
+ const candidates = findSectionCandidates(lines, fenced, kept, contentEnd);
916
+ /*
917
+ * 4. Only the LAST bare "Evidence checked" label can be the server's list.
918
+ * Earlier ones were written by the model and stay ordinary content.
919
+ */
920
+ let evidenceChecked = [];
921
+ let evidenceCheckedIndex = -1;
922
+ for (const candidate of candidates) {
923
+ if (candidate.match.kind === "EvidenceChecked" && candidate.match.isBare) {
924
+ evidenceCheckedIndex = candidate.index;
925
+ }
926
+ }
927
+ if (evidenceCheckedIndex >= 0) {
928
+ const blockEnd = findEvidenceCheckedBlockEnd(lines, fenced, evidenceCheckedIndex, contentEnd);
929
+ const entries = parseEvidenceCheckedEntries(lines.slice(evidenceCheckedIndex + 1, blockEnd));
930
+ const queryCount = footerMatch === null || footerMatch === void 0 ? void 0 : footerMatch.footer.queryCount;
931
+ /*
932
+ * The server writes one entry per citation, at most one citation per
933
+ * query, and no block at all when there are no citations. A footer
934
+ * saying "0 queries run", or fewer queries than entries, therefore means
935
+ * the model wrote this block: it stays in the body as model content.
936
+ * Without a readable count (no footer, an older format) it is trusted.
937
+ */
938
+ const isServerBlock = queryCount === undefined ||
939
+ (queryCount > 0 && entries.length <= queryCount);
940
+ if (isServerBlock) {
941
+ evidenceChecked = entries;
942
+ for (let index = evidenceCheckedIndex; index < blockEnd; index++) {
943
+ kept[index] = false;
944
+ }
945
+ }
946
+ }
947
+ // 5. Resolve candidates into section starts.
948
+ const starts = resolveSectionStarts(lines, kept, candidates, contentEnd);
949
+ const firstStart = starts[0];
950
+ const preamble = joinKeptLines(lines, kept, 0, firstStart ? firstStart.index : contentEnd).trim();
951
+ const sections = [];
952
+ starts.forEach((start, position) => {
953
+ const next = starts[position + 1];
954
+ const body = joinKeptLines(lines, kept, start.index + 1, next ? next.index : contentEnd);
955
+ const sectionMarkdown = `${start.inlineBody}\n${body}`.trim();
956
+ if (!sectionMarkdown) {
957
+ return;
958
+ }
959
+ sections.push({
960
+ kind: start.kind,
961
+ title: start.title,
962
+ markdown: sectionMarkdown,
963
+ });
964
+ });
965
+ const firstOfKind = (kind) => {
966
+ var _a;
967
+ return (_a = sections.find((section) => {
968
+ return section.kind === kind;
969
+ })) === null || _a === void 0 ? void 0 : _a.markdown;
970
+ };
971
+ const summary = firstOfKind(InvestigationReportSectionKind.Summary);
972
+ const rootCause = firstOfKind(InvestigationReportSectionKind.RootCause);
973
+ return {
974
+ isStructured: summary !== undefined || rootCause !== undefined,
975
+ preamble,
976
+ sections,
977
+ summary,
978
+ rootCause,
979
+ evidence: firstOfKind(InvestigationReportSectionKind.Evidence),
980
+ nextSteps: firstOfKind(InvestigationReportSectionKind.NextSteps),
981
+ evidenceChecked,
982
+ footer: footerMatch === null || footerMatch === void 0 ? void 0 : footerMatch.footer,
983
+ bodyMarkdown: joinKeptLines(lines, kept, 0, lines.length).trim(),
984
+ };
985
+ }
986
+ /*
987
+ * The qualifier word directly before a reference: "incident #12", "Alerts
988
+ * #3", "prior incidents: #6954", "alerts (#100". "blocked" means a word from
989
+ * another numbering ("PR #45"). Scans backwards over a bounded gap and word,
990
+ * so the cost never grows with the text.
991
+ */
992
+ function readQualifierBefore(text, hashIndex) {
993
+ let cursor = hashIndex - 1;
994
+ let punctuationCount = 0;
995
+ while (cursor >= 0) {
996
+ const character = text.charAt(cursor);
997
+ if (WHITESPACE_CHARACTER_REGEX.test(character)) {
998
+ cursor--;
999
+ continue;
1000
+ }
1001
+ if (QUALIFIER_GAP_PUNCTUATION.includes(character) &&
1002
+ punctuationCount < MAX_QUALIFIER_GAP_PUNCTUATION) {
1003
+ punctuationCount++;
1004
+ cursor--;
1005
+ continue;
1006
+ }
1007
+ break;
1008
+ }
1009
+ // Nothing between the word and "#" ("incident-#12" has a hyphen there).
1010
+ if (cursor === hashIndex - 1) {
1011
+ return null;
1012
+ }
1013
+ const wordEnd = cursor + 1;
1014
+ const wordStartLimit = wordEnd - MAX_QUALIFIER_WORD_LENGTH - 1;
1015
+ while (cursor >= 0 &&
1016
+ cursor >= wordStartLimit &&
1017
+ WORD_CHARACTER_REGEX.test(text.charAt(cursor))) {
1018
+ cursor--;
1019
+ }
1020
+ // The word runs on past the longest qualifier, so it is none of them.
1021
+ if (cursor >= 0 && WORD_CHARACTER_REGEX.test(text.charAt(cursor))) {
1022
+ return null;
1023
+ }
1024
+ let wordStart = cursor + 1;
1025
+ // "__Alerts__ #3": "_" is a word character, but here it is emphasis.
1026
+ while (wordStart < wordEnd && text.charAt(wordStart) === "_") {
1027
+ wordStart++;
1028
+ }
1029
+ const word = text.slice(wordStart, wordEnd).toLowerCase();
1030
+ if (word === "incident" || word === "incidents") {
1031
+ return "incident";
1032
+ }
1033
+ if (word === "alert" || word === "alerts") {
1034
+ return "alert";
1035
+ }
1036
+ if (NON_EVENT_QUALIFIER_WORDS.has(word)) {
1037
+ return "blocked";
1038
+ }
1039
+ return null;
1040
+ }
1041
+ /*
1042
+ * Every "#123" in one text run with the qualifier it reads, "blocked" ones
1043
+ * included. tokenizeEventReferences documents the rules.
1044
+ */
1045
+ function scanEventReferences(text) {
1046
+ const scanned = [];
1047
+ if (typeof text !== "string" || !text.includes("#")) {
1048
+ return scanned;
1049
+ }
1050
+ const referenceRegex = new RegExp(EVENT_REFERENCE_PATTERN, "g");
1051
+ let match = referenceRegex.exec(text);
1052
+ while (match) {
1053
+ const start = match.index;
1054
+ const digits = match[1] || "";
1055
+ const before = start > 0 ? text.charAt(start - 1) : "";
1056
+ const isBlocked = before !== "" &&
1057
+ (WORD_CHARACTER_REGEX.test(before) ||
1058
+ FORBIDDEN_BEFORE_REFERENCE.includes(before));
1059
+ if (!isBlocked && digits) {
1060
+ const end = start + 1 + digits.length;
1061
+ const previous = scanned[scanned.length - 1];
1062
+ let qualifier = readQualifierBefore(text, start);
1063
+ if (qualifier === null &&
1064
+ previous &&
1065
+ previous.qualifier !== null &&
1066
+ start - previous.end <= MAX_SIBLING_SEPARATOR_LENGTH &&
1067
+ SIBLING_SEPARATOR_REGEX.test(text.slice(previous.end, start))) {
1068
+ qualifier = previous.qualifier;
1069
+ }
1070
+ scanned.push({
1071
+ qualifier,
1072
+ number: parseInt(digits, 10),
1073
+ start,
1074
+ end,
1075
+ });
1076
+ }
1077
+ match = referenceRegex.exec(text);
1078
+ }
1079
+ return scanned;
1080
+ }
1081
+ /*
1082
+ * Finds "#123" style references in plain text (one text run). A reference is
1083
+ * "#" + 1-9 digits, not preceded by a word character, "&", "/" or "#", and not
1084
+ * followed by a word character.
1085
+ *
1086
+ * An immediately preceding qualifier word ("incident", "incidents", "alert",
1087
+ * "alerts", case-insensitive) sets `kind`. It may be separated from the "#"
1088
+ * by whitespace and a little punctuation (":", "(", "[", "*", "_"). A
1089
+ * qualifier also carries to directly following comma/"and"/"or"-separated
1090
+ * siblings ("incidents #1, #2 and #3").
1091
+ *
1092
+ * A number after a word from another numbering ("scheduled maintenance #42",
1093
+ * "PR #45", "step #1") is not returned at all, and neither are its siblings
1094
+ * ("PRs #45, #46"): it is not an incident or alert of any kind.
1095
+ */
1096
+ export function tokenizeEventReferences(text) {
1097
+ const tokens = [];
1098
+ for (const reference of scanEventReferences(text)) {
1099
+ if (reference.qualifier === "blocked") {
1100
+ continue;
1101
+ }
1102
+ tokens.push({
1103
+ kind: reference.qualifier,
1104
+ number: reference.number,
1105
+ start: reference.start,
1106
+ end: reference.end,
1107
+ });
1108
+ }
1109
+ return tokens;
1110
+ }
1111
+ /*
1112
+ * Replaces inline code spans with a placeholder so references inside them
1113
+ * are ignored. A span opens with a run of N backticks and closes at the next
1114
+ * run of exactly N; an unmatched run is literal text.
1115
+ */
1116
+ function maskInlineCode(text) {
1117
+ if (!text.includes("`")) {
1118
+ return text;
1119
+ }
1120
+ let output = "";
1121
+ let cursor = 0;
1122
+ while (cursor < text.length) {
1123
+ const openStart = text.indexOf("`", cursor);
1124
+ if (openStart === -1) {
1125
+ output += text.slice(cursor);
1126
+ break;
1127
+ }
1128
+ let openEnd = openStart;
1129
+ while (openEnd < text.length && text.charAt(openEnd) === "`") {
1130
+ openEnd++;
1131
+ }
1132
+ const runLength = openEnd - openStart;
1133
+ let search = openEnd;
1134
+ let closeEnd = -1;
1135
+ while (search < text.length) {
1136
+ const nextStart = text.indexOf("`", search);
1137
+ if (nextStart === -1) {
1138
+ break;
1139
+ }
1140
+ let nextEnd = nextStart;
1141
+ while (nextEnd < text.length && text.charAt(nextEnd) === "`") {
1142
+ nextEnd++;
1143
+ }
1144
+ if (nextEnd - nextStart === runLength) {
1145
+ closeEnd = nextEnd;
1146
+ break;
1147
+ }
1148
+ search = nextEnd;
1149
+ }
1150
+ if (closeEnd === -1) {
1151
+ output += text.slice(cursor, openEnd);
1152
+ cursor = openEnd;
1153
+ continue;
1154
+ }
1155
+ output += text.slice(cursor, openStart) + CODE_SPAN_PLACEHOLDER;
1156
+ cursor = closeEnd;
1157
+ }
1158
+ return output;
1159
+ }
1160
+ /*
1161
+ * References across a whole markdown document, skipping fenced code blocks
1162
+ * and inline code spans. Returns unique {kind, number} pairs in first-seen
1163
+ * order, with null kinds replaced by `defaultKind`, capped at `limit`. An
1164
+ * unqualified number the document also qualifies as the other kind is left
1165
+ * out (see below). Callers resolving a posted report should pass its
1166
+ * bodyMarkdown, so the server's own evidence labels are not read as prose.
1167
+ */
1168
+ export function extractEventReferences(markdown, defaultKind, limit = DEFAULT_EVENT_REFERENCE_LIMIT) {
1169
+ const references = [];
1170
+ const maxReferences = Math.floor(limit);
1171
+ if (!(maxReferences > 0)) {
1172
+ return references;
1173
+ }
1174
+ const normalised = normaliseLineEndings(markdown);
1175
+ if (!normalised.includes("#")) {
1176
+ return references;
1177
+ }
1178
+ const lines = normalised.split("\n");
1179
+ const fenced = markFencedLines(lines);
1180
+ /*
1181
+ * Group the non-code lines into blocks separated by fences and blank
1182
+ * lines: a code span never crosses either, so an unmatched backtick in one
1183
+ * paragraph cannot hide references in the next.
1184
+ */
1185
+ const blocks = [];
1186
+ let current = [];
1187
+ lines.forEach((line, index) => {
1188
+ if (fenced[index] || !line.trim()) {
1189
+ if (current.length > 0) {
1190
+ blocks.push(current.join("\n"));
1191
+ current = [];
1192
+ }
1193
+ return;
1194
+ }
1195
+ current.push(line);
1196
+ });
1197
+ if (current.length > 0) {
1198
+ blocks.push(current.join("\n"));
1199
+ }
1200
+ const scanned = [];
1201
+ for (const block of blocks) {
1202
+ for (const reference of scanEventReferences(maskInlineCode(block))) {
1203
+ scanned.push(reference);
1204
+ }
1205
+ }
1206
+ /*
1207
+ * An unqualified "#12" is taken as the subject's kind, except when the
1208
+ * same document also names 12 as something else: explicitly the OTHER
1209
+ * kind ("alert #12 fired ... #12 kept firing" on an incident) or in another
1210
+ * numbering ("scheduled maintenance #12 ... during #12"). The bare number
1211
+ * most likely means that, so it is not looked up as the subject's kind at
1212
+ * all: it stays plain text rather than linking to an unrelated record.
1213
+ */
1214
+ const otherKind = defaultKind === "incident" ? "alert" : "incident";
1215
+ const numbersNamedOtherwise = new Set();
1216
+ for (const reference of scanned) {
1217
+ if (reference.qualifier === otherKind ||
1218
+ reference.qualifier === "blocked") {
1219
+ numbersNamedOtherwise.add(reference.number);
1220
+ }
1221
+ }
1222
+ const seen = new Set();
1223
+ for (const token of scanned) {
1224
+ if (token.qualifier === "blocked" ||
1225
+ (token.qualifier === null && numbersNamedOtherwise.has(token.number))) {
1226
+ continue;
1227
+ }
1228
+ const kind = token.qualifier || defaultKind;
1229
+ const key = `${kind}:${token.number}`;
1230
+ if (seen.has(key)) {
1231
+ continue;
1232
+ }
1233
+ seen.add(key);
1234
+ references.push({ kind, number: token.number });
1235
+ if (references.length >= maxReferences) {
1236
+ return references;
1237
+ }
1238
+ }
1239
+ return references;
1240
+ }
1241
+ //# sourceMappingURL=InvestigationReport.js.map