@oneuptime/common 13.0.5 → 13.0.7

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 (1566) hide show
  1. package/Models/AnalyticsModels/AuditLog.ts +81 -1
  2. package/Models/AnalyticsModels/SecurityEvent.ts +4 -4
  3. package/Models/DatabaseModels/AIAgentOwnerTeam.ts +6 -0
  4. package/Models/DatabaseModels/AIAgentOwnerUser.ts +6 -0
  5. package/Models/DatabaseModels/Alert.ts +74 -0
  6. package/Models/DatabaseModels/AlertEpisodeOwnerTeam.ts +6 -1
  7. package/Models/DatabaseModels/AlertEpisodeOwnerUser.ts +6 -1
  8. package/Models/DatabaseModels/AlertOwnerTeam.ts +6 -1
  9. package/Models/DatabaseModels/AlertOwnerUser.ts +6 -1
  10. package/Models/DatabaseModels/CephClusterOwnerTeam.ts +6 -0
  11. package/Models/DatabaseModels/CephClusterOwnerUser.ts +6 -0
  12. package/Models/DatabaseModels/CloudResourceOwnerTeam.ts +6 -0
  13. package/Models/DatabaseModels/CloudResourceOwnerUser.ts +6 -0
  14. package/Models/DatabaseModels/DashboardOwnerTeam.ts +6 -1
  15. package/Models/DatabaseModels/DashboardOwnerUser.ts +6 -1
  16. package/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.ts +8 -0
  17. package/Models/DatabaseModels/DockerHostOwnerTeam.ts +6 -0
  18. package/Models/DatabaseModels/DockerHostOwnerUser.ts +6 -0
  19. package/Models/DatabaseModels/DockerSwarmClusterOwnerTeam.ts +6 -0
  20. package/Models/DatabaseModels/DockerSwarmClusterOwnerUser.ts +6 -0
  21. package/Models/DatabaseModels/GlobalConfig.ts +1 -1
  22. package/Models/DatabaseModels/HostOwnerTeam.ts +6 -0
  23. package/Models/DatabaseModels/HostOwnerUser.ts +6 -0
  24. package/Models/DatabaseModels/Incident.ts +78 -0
  25. package/Models/DatabaseModels/IncidentEpisodeOwnerTeam.ts +6 -1
  26. package/Models/DatabaseModels/IncidentEpisodeOwnerUser.ts +6 -1
  27. package/Models/DatabaseModels/IncidentEpisodePublicNote.ts +74 -0
  28. package/Models/DatabaseModels/IncidentOwnerTeam.ts +6 -1
  29. package/Models/DatabaseModels/IncidentOwnerUser.ts +6 -1
  30. package/Models/DatabaseModels/IncidentPublicNote.ts +74 -0
  31. package/Models/DatabaseModels/IncidentTemplateOwnerTeam.ts +6 -0
  32. package/Models/DatabaseModels/IncidentTemplateOwnerUser.ts +6 -0
  33. package/Models/DatabaseModels/IncomingCallPolicyOwnerTeam.ts +6 -1
  34. package/Models/DatabaseModels/IncomingCallPolicyOwnerUser.ts +6 -1
  35. package/Models/DatabaseModels/Index.ts +6 -4
  36. package/Models/DatabaseModels/IoTFleetOwnerTeam.ts +6 -0
  37. package/Models/DatabaseModels/IoTFleetOwnerUser.ts +6 -0
  38. package/Models/DatabaseModels/KubernetesClusterOwnerTeam.ts +6 -0
  39. package/Models/DatabaseModels/KubernetesClusterOwnerUser.ts +6 -0
  40. package/Models/DatabaseModels/Monitor.ts +2 -3
  41. package/Models/DatabaseModels/MonitorGroupOwnerTeam.ts +6 -0
  42. package/Models/DatabaseModels/MonitorGroupOwnerUser.ts +6 -0
  43. package/Models/DatabaseModels/MonitorOwnerTeam.ts +6 -1
  44. package/Models/DatabaseModels/MonitorOwnerUser.ts +6 -1
  45. package/Models/DatabaseModels/MonitorTemplate.ts +2 -3
  46. package/Models/DatabaseModels/NetworkDevice.ts +67 -0
  47. package/Models/DatabaseModels/NetworkDeviceDiagnostic.ts +746 -0
  48. package/Models/DatabaseModels/NetworkDeviceDiscoveryScan.ts +151 -0
  49. package/Models/DatabaseModels/NetworkDeviceOwnerTeam.ts +6 -0
  50. package/Models/DatabaseModels/NetworkDeviceOwnerUser.ts +6 -0
  51. package/Models/DatabaseModels/NetworkSiteAssignmentRule.ts +1 -1
  52. package/Models/DatabaseModels/OnCallDutyPolicyOwnerTeam.ts +6 -1
  53. package/Models/DatabaseModels/OnCallDutyPolicyOwnerUser.ts +6 -1
  54. package/Models/DatabaseModels/OnCallDutyPolicyScheduleOwnerTeam.ts +6 -1
  55. package/Models/DatabaseModels/OnCallDutyPolicyScheduleOwnerUser.ts +6 -1
  56. package/Models/DatabaseModels/PodmanHostOwnerTeam.ts +6 -0
  57. package/Models/DatabaseModels/PodmanHostOwnerUser.ts +6 -0
  58. package/Models/DatabaseModels/ProbeOwnerTeam.ts +6 -0
  59. package/Models/DatabaseModels/ProbeOwnerUser.ts +6 -0
  60. package/Models/DatabaseModels/Project.ts +41 -0
  61. package/Models/DatabaseModels/ProxmoxClusterOwnerTeam.ts +6 -0
  62. package/Models/DatabaseModels/ProxmoxClusterOwnerUser.ts +6 -0
  63. package/Models/DatabaseModels/RumApplicationOwnerTeam.ts +6 -0
  64. package/Models/DatabaseModels/RumApplicationOwnerUser.ts +6 -0
  65. package/Models/DatabaseModels/RunbookOwnerTeam.ts +6 -1
  66. package/Models/DatabaseModels/RunbookOwnerUser.ts +6 -1
  67. package/Models/DatabaseModels/RunnerOwnerTeam.ts +6 -1
  68. package/Models/DatabaseModels/RunnerOwnerUser.ts +6 -1
  69. package/Models/DatabaseModels/ScheduledMaintenanceOwnerTeam.ts +6 -1
  70. package/Models/DatabaseModels/ScheduledMaintenanceOwnerUser.ts +6 -1
  71. package/Models/DatabaseModels/ScheduledMaintenancePublicNote.ts +74 -0
  72. package/Models/DatabaseModels/ScheduledMaintenanceTemplateOwnerTeam.ts +8 -0
  73. package/Models/DatabaseModels/ScheduledMaintenanceTemplateOwnerUser.ts +8 -0
  74. package/Models/DatabaseModels/SecurityEventConnection.ts +11 -11
  75. package/Models/DatabaseModels/ServerlessFunctionOwnerTeam.ts +6 -0
  76. package/Models/DatabaseModels/ServerlessFunctionOwnerUser.ts +6 -0
  77. package/Models/DatabaseModels/ServiceLevelObjective.ts +185 -8
  78. package/Models/DatabaseModels/ServiceLevelObjectiveBurnRateRule.ts +746 -43
  79. package/Models/DatabaseModels/ServiceLevelObjectiveFeed.ts +575 -0
  80. package/Models/DatabaseModels/ServiceLevelObjectiveMonitorRule.ts +582 -0
  81. package/Models/DatabaseModels/ServiceLevelObjectiveOwnerTeam.ts +22 -1
  82. package/Models/DatabaseModels/ServiceLevelObjectiveOwnerUser.ts +22 -1
  83. package/Models/DatabaseModels/ServiceOwnerTeam.ts +6 -0
  84. package/Models/DatabaseModels/ServiceOwnerUser.ts +6 -0
  85. package/Models/DatabaseModels/StatusPageAnnouncement.ts +75 -0
  86. package/Models/DatabaseModels/StatusPageOwnerTeam.ts +6 -1
  87. package/Models/DatabaseModels/StatusPageOwnerUser.ts +6 -1
  88. package/Models/DatabaseModels/ThreatIntelFeed.ts +1 -1
  89. package/Models/DatabaseModels/VMwareVCenterOwnerTeam.ts +6 -0
  90. package/Models/DatabaseModels/VMwareVCenterOwnerUser.ts +6 -0
  91. package/Models/DatabaseModels/WorkflowOwnerTeam.ts +6 -1
  92. package/Models/DatabaseModels/WorkflowOwnerUser.ts +6 -1
  93. package/Scripts/benchmark-fanin-capacity.js +2 -2
  94. package/Server/API/AIAgentDataAPI.ts +1 -1
  95. package/Server/API/AIChatAPI.ts +6 -4
  96. package/Server/API/AIInvestigationAPI.ts +7 -0
  97. package/Server/API/BaseAPI.ts +17 -0
  98. package/Server/API/BillingInvoiceAPI.ts +343 -30
  99. package/Server/API/BillingPaymentMethodAPI.ts +126 -5
  100. package/Server/API/DashboardAPI.ts +96 -2
  101. package/Server/API/SecurityEventConnectionAPI.ts +141 -11
  102. package/Server/API/StatusPageAPI.ts +321 -199
  103. package/Server/Infrastructure/Postgres/LocalMigrationGenerationDataSource.ts +1 -1
  104. package/Server/Infrastructure/Postgres/SchemaMigrations/1792800000000-AddNetworkDeviceDiagnostic.ts +83 -0
  105. package/Server/Infrastructure/Postgres/SchemaMigrations/1792900000000-AddNetworkDeviceDnsNameAndShortDeviceNames.ts +36 -0
  106. package/Server/Infrastructure/Postgres/SchemaMigrations/1793000000000-AddNetbiosLookupToNetworkDeviceDiscoveryScan.ts +29 -0
  107. package/Server/Infrastructure/Postgres/SchemaMigrations/1793100000000-SloProductOverhaul.ts +516 -0
  108. package/Server/Infrastructure/Postgres/SchemaMigrations/1793200000000-BackfillSloMonitorRulesAndAffectedResources.ts +98 -0
  109. package/Server/Infrastructure/Postgres/SchemaMigrations/1793300000000-AddDataResidencyToProject.ts +27 -0
  110. package/Server/Infrastructure/Postgres/SchemaMigrations/1793400000000-AddSubscriberUpdateNotificationStatus.ts +97 -0
  111. package/Server/Infrastructure/Postgres/SchemaMigrations/1793500000000-MakeOwnerRowsUnique.ts +1057 -0
  112. package/Server/Infrastructure/Postgres/SchemaMigrations/1793700000000-AddAIInvestigationDecision.ts +25 -0
  113. package/Server/Infrastructure/Postgres/SchemaMigrations/1793800000000-RemoveMonitorDescriptionLengthLimit.ts +31 -0
  114. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +20 -0
  115. package/Server/Infrastructure/Postgres/SchemaMigrations/Readme.md +6 -4
  116. package/Server/Middleware/IdentityRateLimit.ts +34 -1
  117. package/Server/Middleware/PublicDashboardRateLimit.ts +169 -39
  118. package/Server/Services/AlertEpisodeLabelRuleEngineService.ts +138 -67
  119. package/Server/Services/AlertEpisodeOwnerRuleEngineService.ts +213 -84
  120. package/Server/Services/AlertEpisodePrivacyRuleEngineService.ts +112 -35
  121. package/Server/Services/AlertEpisodeService.ts +13 -34
  122. package/Server/Services/AlertGroupingEngineService.ts +7 -4
  123. package/Server/Services/AlertLabelRuleEngineService.ts +299 -217
  124. package/Server/Services/AlertOwnerRuleEngineService.ts +572 -396
  125. package/Server/Services/AlertPrivacyRuleEngineService.ts +116 -40
  126. package/Server/Services/AlertService.ts +124 -36
  127. package/Server/Services/AuditLogService.ts +612 -59
  128. package/Server/Services/BillingInvoiceService.ts +112 -102
  129. package/Server/Services/BillingService.ts +539 -11
  130. package/Server/Services/CephClusterLabelRuleEngineService.ts +170 -109
  131. package/Server/Services/CephClusterOwnerRuleEngineService.ts +237 -111
  132. package/Server/Services/CloudResourceLabelRuleEngineService.ts +163 -100
  133. package/Server/Services/CloudResourceOwnerRuleEngineService.ts +240 -111
  134. package/Server/Services/DashboardLabelRuleEngineService.ts +145 -84
  135. package/Server/Services/DashboardOwnerRuleEngineService.ts +217 -91
  136. package/Server/Services/DatabaseService.ts +272 -22
  137. package/Server/Services/DockerHostLabelRuleEngineService.ts +171 -110
  138. package/Server/Services/DockerHostOwnerRuleEngineService.ts +237 -111
  139. package/Server/Services/DockerSwarmClusterLabelRuleEngineService.ts +181 -112
  140. package/Server/Services/DockerSwarmClusterOwnerRuleEngineService.ts +247 -114
  141. package/Server/Services/HostLabelRuleEngineService.ts +167 -106
  142. package/Server/Services/HostOwnerRuleEngineService.ts +233 -107
  143. package/Server/Services/IncidentEpisodeLabelRuleEngineService.ts +141 -67
  144. package/Server/Services/IncidentEpisodeOwnerRuleEngineService.ts +274 -72
  145. package/Server/Services/IncidentEpisodePrivacyRuleEngineService.ts +112 -35
  146. package/Server/Services/IncidentEpisodePublicNoteService.ts +24 -0
  147. package/Server/Services/IncidentEpisodeService.ts +15 -75
  148. package/Server/Services/IncidentGroupingEngineService.ts +7 -4
  149. package/Server/Services/IncidentLabelRuleEngineService.ts +279 -204
  150. package/Server/Services/IncidentOwnerRuleEngineService.ts +595 -425
  151. package/Server/Services/IncidentPrivacyRuleEngineService.ts +117 -44
  152. package/Server/Services/IncidentPublicNoteService.ts +24 -0
  153. package/Server/Services/IncidentService.ts +127 -35
  154. package/Server/Services/IncidentTemplateService.ts +13 -36
  155. package/Server/Services/IncomingCallPolicyLabelRuleEngineService.ts +147 -83
  156. package/Server/Services/IncomingCallPolicyOwnerRuleEngineService.ts +225 -96
  157. package/Server/Services/Index.ts +6 -4
  158. package/Server/Services/IoTFleetLabelRuleEngineService.ts +145 -84
  159. package/Server/Services/IoTFleetOwnerRuleEngineService.ts +217 -91
  160. package/Server/Services/KubernetesClusterLabelRuleEngineService.ts +181 -112
  161. package/Server/Services/KubernetesClusterOwnerRuleEngineService.ts +247 -114
  162. package/Server/Services/LabelService.ts +23 -28
  163. package/Server/Services/MonitorLabelRuleEngineService.ts +152 -92
  164. package/Server/Services/MonitorOwnerRuleEngineService.ts +220 -104
  165. package/Server/Services/MonitorProbeService.ts +20 -2
  166. package/Server/Services/MonitorService.ts +24 -41
  167. package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +376 -5
  168. package/Server/Services/NetworkDeviceDiagnosticService.ts +417 -0
  169. package/Server/Services/NetworkDeviceLabelRuleEngineService.ts +147 -83
  170. package/Server/Services/NetworkDeviceOwnerRuleEngineService.ts +222 -93
  171. package/Server/Services/NetworkDeviceService.ts +39 -2
  172. package/Server/Services/OnCallDutyPolicyLabelRuleEngineService.ts +151 -80
  173. package/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.ts +226 -93
  174. package/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.ts +154 -83
  175. package/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.ts +229 -96
  176. package/Server/Services/PodmanHostLabelRuleEngineService.ts +171 -110
  177. package/Server/Services/PodmanHostOwnerRuleEngineService.ts +239 -111
  178. package/Server/Services/ProjectService.ts +111 -10
  179. package/Server/Services/ProxmoxClusterLabelRuleEngineService.ts +174 -110
  180. package/Server/Services/ProxmoxClusterOwnerRuleEngineService.ts +243 -112
  181. package/Server/Services/RumApplicationLabelRuleEngineService.ts +137 -73
  182. package/Server/Services/RumApplicationOwnerRuleEngineService.ts +204 -79
  183. package/Server/Services/RunbookLabelRuleEngineService.ts +146 -84
  184. package/Server/Services/RunbookOwnerRuleEngineService.ts +220 -91
  185. package/Server/Services/ScheduledMaintenanceLabelRuleEngineService.ts +324 -230
  186. package/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.ts +613 -428
  187. package/Server/Services/ScheduledMaintenancePublicNoteService.ts +24 -0
  188. package/Server/Services/ScheduledMaintenanceService.ts +56 -48
  189. package/Server/Services/ScheduledMaintenanceTemplateService.ts +12 -34
  190. package/Server/Services/SecurityEventConnectionService.ts +56 -4
  191. package/Server/Services/ServerlessFunctionLabelRuleEngineService.ts +143 -74
  192. package/Server/Services/ServerlessFunctionOwnerRuleEngineService.ts +210 -81
  193. package/Server/Services/ServiceLabelRuleEngineService.ts +172 -110
  194. package/Server/Services/ServiceLevelObjectiveBurnRateRuleService.ts +1057 -18
  195. package/Server/Services/ServiceLevelObjectiveFeedService.ts +108 -0
  196. package/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.ts +793 -97
  197. package/Server/Services/ServiceLevelObjectiveMonitorRuleService.ts +1069 -0
  198. package/Server/Services/ServiceLevelObjectiveOwnerTeamService.ts +240 -1
  199. package/Server/Services/ServiceLevelObjectiveOwnerUserService.ts +257 -1
  200. package/Server/Services/ServiceLevelObjectiveService.ts +1356 -56
  201. package/Server/Services/ServiceOwnerRuleEngineService.ts +242 -112
  202. package/Server/Services/StatusPageAnnouncementService.ts +13 -0
  203. package/Server/Services/StatusPageLabelRuleEngineService.ts +146 -85
  204. package/Server/Services/StatusPageOwnerRuleEngineService.ts +210 -99
  205. package/Server/Services/StatusPagePrivateUserService.ts +38 -29
  206. package/Server/Services/StatusPagePrivateUserSessionService.ts +49 -1
  207. package/Server/Services/StatusPageService.ts +59 -36
  208. package/Server/Services/StatusPageSubscriberNotificationTemplateService.ts +28 -232
  209. package/Server/Services/StatusPageSubscriberService.ts +6 -0
  210. package/Server/Services/TelemetryUsageBillingService.ts +38 -7
  211. package/Server/Services/ThreatIntelFeedService.ts +1 -1
  212. package/Server/Services/UserSessionService.ts +6 -0
  213. package/Server/Services/VMwareVCenterLabelRuleEngineService.ts +173 -110
  214. package/Server/Services/VMwareVCenterOwnerRuleEngineService.ts +242 -112
  215. package/Server/Services/WorkflowLabelRuleEngineService.ts +145 -84
  216. package/Server/Services/WorkflowOwnerRuleEngineService.ts +219 -91
  217. package/Server/Static/Brand/README.md +7 -7
  218. package/Server/Static/Vendor/README.md +7 -7
  219. package/Server/Types/Database/Permissions/OwnedScopePermission.ts +18 -9
  220. package/Server/Types/Database/Permissions/OwnerTableRegistry.ts +82 -0
  221. package/Server/Types/Database/UpdateByID.ts +3 -0
  222. package/Server/Types/Database/UpdateOneBy.ts +7 -0
  223. package/Server/Utils/AI/AlertAIContextBuilder.ts +19 -0
  224. package/Server/Utils/AI/Chat/ChatAgentRunner.ts +21 -8
  225. package/Server/Utils/AI/Chat/ObservabilityChatPrompt.ts +41 -4
  226. package/Server/Utils/AI/CodeFix/CodeAgentWorkspaceGuard.ts +1 -1
  227. package/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.ts +1 -1
  228. package/Server/Utils/AI/IncidentAIContextBuilder.ts +39 -0
  229. package/Server/Utils/AI/SRE/AIInvestigationEngine.ts +13 -5
  230. package/Server/Utils/AI/SRE/AlertInvestigationRunner.ts +53 -13
  231. package/Server/Utils/AI/SRE/IncidentInvestigationRunner.ts +51 -14
  232. package/Server/Utils/AI/SRE/InvestigationEligibility.ts +292 -0
  233. package/Server/Utils/AI/SRE/InvestigationQueue.ts +25 -0
  234. package/Server/Utils/AI/Toolbox/AlertTools.ts +37 -1
  235. package/Server/Utils/AI/Toolbox/IncidentTools.ts +22 -1
  236. package/Server/Utils/AI/Toolbox/Index.ts +43 -13
  237. package/Server/Utils/AI/Toolbox/ResourceTools.ts +952 -0
  238. package/Server/Utils/AI/Toolbox/RumTools.ts +424 -0
  239. package/Server/Utils/AI/Toolbox/SloTools.ts +416 -51
  240. package/Server/Utils/AI/Toolbox/ToolTypes.ts +10 -0
  241. package/Server/Utils/AI/Toolbox/TraceTools.ts +2 -1
  242. package/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.ts +151 -13
  243. package/Server/Utils/Dashboard/PublicDashboardSloHistoryPolicy.ts +17 -4
  244. package/Server/Utils/Dashboard/PublicDashboardSloWidget.ts +155 -8
  245. package/Server/Utils/Database/PostgresErrorTranslator.ts +14 -0
  246. package/Server/Utils/Database/ProjectScopedReferenceValidator.ts +16 -0
  247. package/Server/Utils/Database/RelationValueUtil.ts +106 -0
  248. package/Server/Utils/Monitor/Criteria/CompareCriteria.ts +143 -127
  249. package/Server/Utils/Monitor/Criteria/EvaluateOverTime.ts +22 -27
  250. package/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.ts +4 -1
  251. package/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.ts +3 -1
  252. package/Server/Utils/Monitor/MonitorStepsProjectValidator.ts +50 -20
  253. package/Server/Utils/Monitor/NetworkDeviceHydrationUtil.ts +13 -1
  254. package/Server/Utils/Monitor/NetworkDeviceMetricUtil.ts +6 -11
  255. package/Server/Utils/Rules/MonitorRulePatternValidator.ts +51 -0
  256. package/Server/Utils/Rules/OwnerRuleAssignment.ts +261 -0
  257. package/Server/Utils/Rules/RuleRun/RuleApplication.ts +81 -0
  258. package/Server/Utils/Rules/RuleRun/RuleRunPermission.ts +188 -0
  259. package/Server/Utils/Rules/RuleRun/RuleRunRegistry.ts +803 -0
  260. package/Server/Utils/Rules/RuleRun/RuleRunner.ts +341 -0
  261. package/Server/Utils/SecurityEvent/ConnectorErrorMessage.ts +3 -2
  262. package/Server/Utils/SecurityEvent/Connectors/ConnectorPlatformHealth.ts +6 -4
  263. package/Server/Utils/SecurityEvent/{GoogleSecOps → Connectors/GoogleSecOps}/GoogleSecOpsClient.ts +263 -16
  264. package/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnector.ts +2101 -0
  265. package/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionPoller.ts +194 -14
  266. package/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionRunExecutor.ts +1 -2
  267. package/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionTester.ts +38 -7
  268. package/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectorRegistry.ts +2 -0
  269. package/Server/Utils/SecurityEvent/Connectors/Types.ts +242 -2
  270. package/Server/Utils/SecurityEvent/DetectionRuleEvaluator.ts +1 -1
  271. package/Server/Utils/SecurityEvent/SecurityEventDedupe.ts +3 -3
  272. package/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.ts +2 -2
  273. package/Server/Utils/SessionReplay/SessionReplayReadService.ts +217 -56
  274. package/Server/Utils/Slo/SloFeedUtil.ts +200 -0
  275. package/Server/Utils/Slo/SloLegacyMonitorLabelAdoption.ts +173 -0
  276. package/Server/Utils/Slo/SloMetricUtil.ts +327 -0
  277. package/Server/Utils/Slo/SloOwnerReferenceValidator.ts +208 -0
  278. package/Server/Utils/Slo/SloRecordReferenceValidator.ts +169 -0
  279. package/Server/Utils/StatusPage/MonitorRulePatternValidator.ts +6 -43
  280. package/Server/Utils/StatusPageResource.ts +50 -5
  281. package/Server/Utils/Telemetry/TelemetryEntity.ts +205 -6
  282. package/SslCertificates/GlobalSign.crt +26 -0
  283. package/SslCertificates/Readme.md +3 -0
  284. package/Tests/App/AdminDashboard/EnterpriseLicenseInstanceActivity.test.tsx +451 -0
  285. package/Tests/App/Dashboard/AIInsightsChatPanel.test.tsx +881 -0
  286. package/Tests/App/Dashboard/AIInsightsPageContext.test.ts +458 -0
  287. package/Tests/App/Dashboard/AIInsightsResourceCitations.test.ts +124 -0
  288. package/Tests/App/Dashboard/AIInsightsResourcePageContext.test.ts +798 -0
  289. package/Tests/App/Dashboard/AIInvestigationHeaderStatus.test.tsx +664 -15
  290. package/Tests/App/Dashboard/AddWidgetModal.test.tsx +4 -1
  291. package/Tests/App/Dashboard/AffectedResourcesSlo.test.tsx +307 -0
  292. package/Tests/App/Dashboard/ArchiveResourceCard.test.tsx +289 -0
  293. package/Tests/App/Dashboard/AskAiSuggestedPrompts.test.ts +7 -0
  294. package/Tests/App/Dashboard/AuditLogsTable.test.tsx +598 -0
  295. package/Tests/App/Dashboard/BillingDefaultPaymentMethod.test.tsx +1046 -0
  296. package/Tests/App/Dashboard/BillingPaidUsageFlow.test.tsx +3 -0
  297. package/Tests/App/Dashboard/BillingPaymentMethodForm.test.tsx +201 -7
  298. package/Tests/App/Dashboard/BooleanSeriesCriteriaFilterText.test.ts +82 -0
  299. package/Tests/App/Dashboard/BreadcrumbCoverage.test.tsx +16 -1
  300. package/Tests/App/Dashboard/ChangeAlertStateAIHeader.test.tsx +116 -8
  301. package/Tests/App/Dashboard/ChatActivityFeed.test.tsx +168 -1
  302. package/Tests/App/Dashboard/ConnectionTestModal.test.tsx +1 -1
  303. package/Tests/App/Dashboard/ConnectorTestReportView.test.tsx +20 -3
  304. package/Tests/App/Dashboard/CorrelateFilterBuilder.test.tsx +1095 -1
  305. package/Tests/App/Dashboard/CorrelateFilterChips.test.tsx +910 -0
  306. package/Tests/App/Dashboard/CorrelateGraph.test.tsx +3747 -25
  307. package/Tests/App/Dashboard/CorrelateGraphHelpers.test.ts +1085 -0
  308. package/Tests/App/Dashboard/CorrelateInspector.test.tsx +1534 -0
  309. package/Tests/App/Dashboard/CorrelateNodeCard.test.tsx +965 -0
  310. package/Tests/App/Dashboard/CorrelateResultSummary.test.tsx +1525 -0
  311. package/Tests/App/Dashboard/CorrelationGraph.test.ts +1030 -0
  312. package/Tests/App/Dashboard/CorrelationGraphLayout.test.ts +526 -0
  313. package/Tests/App/Dashboard/DashboardChartWidgetZoom.test.tsx +104 -0
  314. package/Tests/App/Dashboard/DashboardCommandPalette.test.tsx +156 -64
  315. package/Tests/App/Dashboard/DeviceDiagnostics.test.tsx +787 -0
  316. package/Tests/App/Dashboard/DeviceLatencyTrend.test.tsx +278 -0
  317. package/Tests/App/Dashboard/DiscoveryReviewInventoryRefresh.test.tsx +279 -0
  318. package/Tests/App/Dashboard/DiscoveryScanEditForm.test.tsx +87 -0
  319. package/Tests/App/Dashboard/DiscoveryScanStatusMessage.test.tsx +970 -0
  320. package/Tests/App/Dashboard/DiscoveryScanWizardValidation.test.tsx +849 -20
  321. package/Tests/App/Dashboard/EmbeddedMetricEventScope.test.tsx +358 -0
  322. package/Tests/App/Dashboard/EntityFilterDropdownArchivedSlos.test.tsx +340 -0
  323. package/Tests/App/Dashboard/ErrorPatternEventScope.test.tsx +148 -0
  324. package/Tests/App/Dashboard/EventOverlayAdditionalResourceScope.test.ts +255 -0
  325. package/Tests/App/Dashboard/EventOverlayScope.test.ts +845 -0
  326. package/Tests/App/Dashboard/EventOverlayScopeHook.test.tsx +903 -0
  327. package/Tests/App/Dashboard/EventOverviewPages.test.tsx +98 -2
  328. package/Tests/App/Dashboard/ExceptionSegmentedControl.test.tsx +1020 -0
  329. package/Tests/App/Dashboard/ExternalStatusPageCriteriaFilter.test.ts +3 -3
  330. package/Tests/App/Dashboard/InvestigationDrawer.test.tsx +21 -0
  331. package/Tests/App/Dashboard/InvestigationEvidenceList.test.tsx +268 -47
  332. package/Tests/App/Dashboard/InvestigationNotStarted.test.tsx +761 -0
  333. package/Tests/App/Dashboard/InvestigationPanel.test.tsx +1122 -81
  334. package/Tests/App/Dashboard/InvestigationPanelStatus.test.tsx +139 -9
  335. package/Tests/App/Dashboard/InvestigationReportView.test.tsx +279 -176
  336. package/Tests/App/Dashboard/InvestigationRunDetails.test.tsx +1166 -0
  337. package/Tests/App/Dashboard/InvoicesPayInvoice.test.tsx +437 -0
  338. package/Tests/App/Dashboard/MetricsViewerEventScopeNavigation.test.tsx +264 -0
  339. package/Tests/App/Dashboard/MonitorSummaryTestMonitorButton.test.tsx +342 -0
  340. package/Tests/App/Dashboard/MonitorTestForm.test.tsx +612 -0
  341. package/Tests/App/Dashboard/NavigationSearchKeywords.test.tsx +301 -0
  342. package/Tests/App/Dashboard/NetworkDeviceBulkDelete.test.tsx +65 -0
  343. package/Tests/App/Dashboard/NetworkTopologyLiveView.test.tsx +5 -0
  344. package/Tests/App/Dashboard/ResourceAuditLogsSideMenus.test.tsx +74 -0
  345. package/Tests/App/Dashboard/ResourceFeed.test.tsx +125 -5
  346. package/Tests/App/Dashboard/ResourceFeedPageWiring.test.ts +8 -1
  347. package/Tests/App/Dashboard/SecurityEventConnectionDiagnostics.test.tsx +1764 -0
  348. package/Tests/App/Dashboard/SecurityEventConnectionFormModal.test.tsx +1000 -64
  349. package/Tests/App/Dashboard/SecurityEventConnectionsEmptyState.test.tsx +448 -0
  350. package/Tests/App/Dashboard/SecurityEventConnectionsTable.test.tsx +739 -189
  351. package/Tests/App/Dashboard/SecurityEventSeverityPill.test.tsx +233 -0
  352. package/Tests/App/Dashboard/SecurityEventsEmptyState.test.tsx +282 -0
  353. package/Tests/App/Dashboard/ServiceMapGraph.test.tsx +74 -2
  354. package/Tests/App/Dashboard/SloActiveBurnEventsCard.test.tsx +538 -0
  355. package/Tests/App/Dashboard/SloBulkActionsArchive.test.tsx +252 -0
  356. package/Tests/App/Dashboard/SloDashboardTemplateWidgets.test.tsx +322 -518
  357. package/Tests/App/Dashboard/SloElement.test.tsx +194 -0
  358. package/Tests/App/Dashboard/SloFeed.test.tsx +289 -0
  359. package/Tests/App/Dashboard/SloHistoryCharts.test.tsx +471 -0
  360. package/Tests/App/Dashboard/SloHistorySeries.test.tsx +607 -0
  361. package/Tests/App/Dashboard/SloListWidget.test.tsx +783 -0
  362. package/Tests/App/Dashboard/SloMetricsPage.test.tsx +346 -0
  363. package/Tests/App/Dashboard/SloMonitorsPage.test.tsx +661 -0
  364. package/Tests/App/Dashboard/SloMonitorsSummaryCard.test.tsx +489 -0
  365. package/Tests/App/Dashboard/SloNavigationWiring.test.tsx +437 -0
  366. package/Tests/App/Dashboard/SloNoticeBanner.test.tsx +305 -0
  367. package/Tests/App/Dashboard/SloOverviewData.test.tsx +563 -0
  368. package/Tests/App/Dashboard/SloOverviewHero.test.tsx +311 -0
  369. package/Tests/App/Dashboard/SloOverviewKpiStrip.test.tsx +426 -0
  370. package/Tests/App/Dashboard/SloOverviewSidebarCards.test.tsx +493 -0
  371. package/Tests/App/Dashboard/SloSettings.test.tsx +633 -0
  372. package/Tests/App/Dashboard/SloStatusSummaryCards.test.tsx +403 -0
  373. package/Tests/App/Dashboard/SloViewSideMenuCounts.test.tsx +373 -0
  374. package/Tests/App/Dashboard/SloWidgetVariableBinding.test.tsx +689 -0
  375. package/Tests/App/Dashboard/TextClampLayoutHarness.ts +224 -0
  376. package/Tests/App/Dashboard/TopologyConnectivitySection.test.tsx +206 -0
  377. package/Tests/App/Dashboard/TracesEntityNames.test.tsx +47 -15
  378. package/Tests/App/Dashboard/UseBulkShortenDeviceNames.test.tsx +1312 -0
  379. package/Tests/App/Dashboard/WidgetCatalog.test.ts +9 -1
  380. package/Tests/Models/AnalyticsModels/RumSessionReplayColumns.test.ts +14 -16
  381. package/Tests/Models/DatabaseModels/AuditLogModelConfiguration.test.ts +442 -0
  382. package/Tests/Models/DatabaseModels/DomainRoleTierCoverage.test.ts +9 -10
  383. package/Tests/Models/DatabaseModels/ResourceFeedModels.test.ts +48 -1
  384. package/Tests/Models/DatabaseModels/SloOverhaulModels.test.ts +835 -0
  385. package/Tests/Models/DatabaseModels/StaticRuleCriteriaInheritance.test.ts +3 -2
  386. package/Tests/Models/DiscoveryScanNetbiosLookupColumn.test.ts +328 -0
  387. package/Tests/Models/DiscoveryScanShortDeviceNamesColumn.test.ts +335 -0
  388. package/Tests/Models/InventoryItemNaming.test.ts +54 -0
  389. package/Tests/Models/NetworkDeviceDiagnosticContract.test.ts +194 -0
  390. package/Tests/Models/NetworkDeviceDnsNameColumn.test.ts +321 -0
  391. package/Tests/Models/ProjectDataResidencyColumn.test.ts +154 -0
  392. package/Tests/Models/SecurityDomainAccessControl.test.ts +181 -50
  393. package/Tests/Server/API/AIChatRouteAuthorization.test.ts +161 -0
  394. package/Tests/Server/API/AIInvestigationAPI.test.ts +14 -0
  395. package/Tests/Server/API/AIInvestigationAvailabilityAuthorization.test.ts +260 -0
  396. package/Tests/Server/API/BaseAPI.test.ts +6 -0
  397. package/Tests/Server/API/BaseAPIUpdateMiscDataProps.test.ts +217 -0
  398. package/Tests/Server/API/BillingInvoiceAPI.test.ts +7 -0
  399. package/Tests/Server/API/BillingInvoiceAPIPaymentStates.test.ts +990 -0
  400. package/Tests/Server/API/BillingPaymentMethodAPI.test.ts +498 -0
  401. package/Tests/Server/API/DashboardPublicSloAPI.test.ts +405 -0
  402. package/Tests/Server/API/EnterpriseLicenseReportUserCount.test.ts +133 -0
  403. package/Tests/Server/API/SecurityEventConnectionAPI.test.ts +901 -7
  404. package/Tests/Server/API/SessionReplayAPI.test.ts +116 -0
  405. package/Tests/Server/API/StatusPageManageSubscriptionRecipient.test.ts +857 -0
  406. package/Tests/Server/API/StatusPageManageSubscriptionTemplateVariables.test.ts +1084 -0
  407. package/Tests/Server/API/StatusPageMasterPasswordRateLimit.test.ts +482 -0
  408. package/Tests/Server/EnvironmentConfigOnCallCalendarFeed.test.ts +1 -1
  409. package/Tests/Server/Infrastructure/ClickhouseKeepAliveOptions.test.ts +1 -1
  410. package/Tests/Server/Infrastructure/ContainerBootConfiguration.test.ts +38 -16
  411. package/Tests/Server/Infrastructure/E2EClickHouseFixtureAccess.test.ts +106 -31
  412. package/Tests/Server/Infrastructure/ExampleDockerfiles.test.ts +46 -12
  413. package/Tests/Server/Infrastructure/Postgres/AddConfigurableRuleCriteriaMigration.test.ts +33 -3
  414. package/Tests/Server/Infrastructure/Postgres/AddDataResidencyToProjectMigration.test.ts +202 -0
  415. package/Tests/Server/Infrastructure/Postgres/AddNetbiosLookupToNetworkDeviceDiscoveryScanMigration.test.ts +330 -0
  416. package/Tests/Server/Infrastructure/Postgres/AddNetworkDeviceDnsNameAndShortDeviceNamesMigration.test.ts +340 -0
  417. package/Tests/Server/Infrastructure/Postgres/BackfillSloMonitorRulesAndAffectedResourcesMigration.test.ts +343 -0
  418. package/Tests/Server/Infrastructure/Postgres/MonitorDescriptionMigration.test.ts +422 -0
  419. package/Tests/Server/Infrastructure/Postgres/SloProductOverhaulMigration.test.ts +801 -0
  420. package/Tests/Server/Infrastructure/TelemetryExporterDeploymentConfig.test.ts +1 -1
  421. package/Tests/Server/Infrastructure/ValkeyDeploymentConfig.test.ts +25 -4
  422. package/Tests/Server/Middleware/IdentityRateLimit.test.ts +72 -0
  423. package/Tests/Server/Middleware/PublicDashboardRateLimit.test.ts +12 -12
  424. package/Tests/Server/Middleware/PublicDashboardRateLimitStatusPage.test.ts +800 -0
  425. package/Tests/Server/Services/AIInvestigationDecisionPostgres.test.ts +346 -0
  426. package/Tests/Server/Services/AddOwnersIdempotency.test.ts +471 -0
  427. package/Tests/Server/Services/AddSubscriberUpdateNotificationStatusMigration.test.ts +307 -0
  428. package/Tests/Server/Services/AuditLogService.test.ts +1124 -0
  429. package/Tests/Server/Services/AutoImportScanCredentialSelect.test.ts +200 -1
  430. package/Tests/Server/Services/BillingInvoiceServiceMutexRelease.test.ts +254 -0
  431. package/Tests/Server/Services/BillingService.test.ts +70 -0
  432. package/Tests/Server/Services/BillingServicePayInvoiceStates.test.ts +723 -0
  433. package/Tests/Server/Services/BillingServicePaymentMethodReads.test.ts +14 -2
  434. package/Tests/Server/Services/BillingServiceSubscriptionPaymentMethodSync.test.ts +1634 -0
  435. package/Tests/Server/Services/DatabaseServiceAuditRelationDiff.test.ts +492 -0
  436. package/Tests/Server/Services/DatabaseServiceAutoOwnerOnCreate.test.ts +250 -0
  437. package/Tests/Server/Services/DatabaseServicePasswordFieldSecrets.test.ts +629 -0
  438. package/Tests/Server/Services/DatabaseServiceUniqueColumnsTogether.test.ts +622 -0
  439. package/Tests/Server/Services/IncidentAlertSloLinkSurvivesEdit.test.ts +431 -0
  440. package/Tests/Server/Services/IncidentAlertSloReferenceGuard.test.ts +358 -0
  441. package/Tests/Server/Services/MonitorDescriptionValidation.test.ts +211 -0
  442. package/Tests/Server/Services/MonitorProbeServicePastDueMonitoring.test.ts +362 -0
  443. package/Tests/Server/Services/MonitorTemplateDescriptionPropagation.test.ts +269 -0
  444. package/Tests/Server/Services/NetworkDeviceAutoImportRuleEngineService.test.ts +1460 -1
  445. package/Tests/Server/Services/NetworkDeviceDiagnosticService.test.ts +962 -0
  446. package/Tests/Server/Services/NetworkDeviceDiscoveryScanService.test.ts +106 -0
  447. package/Tests/Server/Services/NetworkDeviceRuleEngines.test.ts +10 -1
  448. package/Tests/Server/Services/NetworkDeviceServicePastDueMonitoring.test.ts +335 -0
  449. package/Tests/Server/Services/NetworkDeviceSiteRuleDnsName.test.ts +568 -0
  450. package/Tests/Server/Services/OwnerRowUniqueness.test.ts +504 -0
  451. package/Tests/Server/Services/ProjectDataResidencyPostgres.test.ts +344 -0
  452. package/Tests/Server/Services/ProjectServiceAuditLogSettingsCache.test.ts +187 -0
  453. package/Tests/Server/Services/ProjectServiceDataResidency.test.ts +369 -0
  454. package/Tests/Server/Services/ProjectServiceDataResidencySelfHosted.test.ts +176 -0
  455. package/Tests/Server/Services/ProjectServicePastDueMonitoring.test.ts +289 -0
  456. package/Tests/Server/Services/ResourceFeedServices.test.ts +24 -8
  457. package/Tests/Server/Services/RuleRun/IncidentAlertMaintenanceRuleEnginesRun.test.ts +1396 -0
  458. package/Tests/Server/Services/RuleRun/LabelRuleEnginesGroupARun.test.ts +917 -0
  459. package/Tests/Server/Services/RuleRun/LabelRuleEnginesGroupBRun.test.ts +1262 -0
  460. package/Tests/Server/Services/RuleRun/OwnerRuleEnginesGroupARun.test.ts +945 -0
  461. package/Tests/Server/Services/RuleRun/OwnerRuleEnginesGroupBRun.test.ts +1163 -0
  462. package/Tests/Server/Services/RuleRun/PrivacyRuleEnginesRun.test.ts +843 -0
  463. package/Tests/Server/Services/ScheduledMaintenanceSubscriberTemplateFormats.test.ts +465 -0
  464. package/Tests/Server/Services/SecurityEventConnectionService.test.ts +525 -4
  465. package/Tests/Server/Services/SecurityEventLastErrorColumnWidth.test.ts +77 -23
  466. package/Tests/Server/Services/ServiceLevelObjectiveBurnRateRuleFeedWrites.test.ts +777 -0
  467. package/Tests/Server/Services/ServiceLevelObjectiveBurnRateRuleOptions.test.ts +1399 -0
  468. package/Tests/Server/Services/ServiceLevelObjectiveBurnRateRuleService.test.ts +67 -74
  469. package/Tests/Server/Services/ServiceLevelObjectiveChildRowTenancy.test.ts +906 -0
  470. package/Tests/Server/Services/ServiceLevelObjectiveDeleteTenancy.test.ts +1029 -0
  471. package/Tests/Server/Services/ServiceLevelObjectiveFeedService.test.ts +313 -0
  472. package/Tests/Server/Services/ServiceLevelObjectiveFeedWrites.test.ts +1214 -0
  473. package/Tests/Server/Services/ServiceLevelObjectiveMarkdownLink.test.ts +289 -0
  474. package/Tests/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.test.ts +1455 -430
  475. package/Tests/Server/Services/ServiceLevelObjectiveMonitorRuleLegacyLabelAdoption.test.ts +634 -0
  476. package/Tests/Server/Services/ServiceLevelObjectiveMonitorRuleService.test.ts +1193 -0
  477. package/Tests/Server/Services/{SloMonitorLabelRuleHooks.test.ts → ServiceLevelObjectiveMonitorRuleTriggers.test.ts} +135 -41
  478. package/Tests/Server/Services/ServiceLevelObjectiveOwnerFeedWrites.test.ts +671 -0
  479. package/Tests/Server/Services/ServiceLevelObjectiveService.test.ts +180 -85
  480. package/Tests/Server/Services/ServiceLevelObjectiveServiceArchive.test.ts +537 -0
  481. package/Tests/Server/Services/ServiceLevelObjectiveServiceLegacyMonitorLabelWrite.test.ts +870 -0
  482. package/Tests/Server/Services/ServiceLevelObjectiveServiceMonitorRuleGuard.test.ts +343 -0
  483. package/Tests/Server/Services/ServiceLevelObjectiveServiceReEvaluation.test.ts +246 -0
  484. package/Tests/Server/Services/SessionRetention.test.ts +334 -0
  485. package/Tests/Server/Services/SloAffectedResourceCreatedFeed.test.ts +501 -0
  486. package/Tests/Server/Services/SloAffectedResourceLinkContract.test.ts +86 -0
  487. package/Tests/Server/Services/SloAffectedResourceMetricAttributes.test.ts +547 -0
  488. package/Tests/Server/Services/StaticRuleCriteriaRuntimeCoverage.test.ts +10 -4
  489. package/Tests/Server/Services/StatusPageMonitorRuleHooks.test.ts +7 -2
  490. package/Tests/Server/Services/StatusPagePrivateUserInvitationPolicy.test.ts +172 -0
  491. package/Tests/Server/Services/StatusPagePrivateUserReadAccess.test.ts +178 -0
  492. package/Tests/Server/Services/StatusPagePrivateUserReadAccessPostgres.test.ts +311 -0
  493. package/Tests/Server/Services/StatusPagePrivateUserSessionService.test.ts +216 -1
  494. package/Tests/Server/Services/StatusPageSubscriberNotificationTemplateCompile.test.ts +174 -0
  495. package/Tests/Server/Services/StatusPageSubscriberNotificationTemplateServiceVariables.test.ts +40 -0
  496. package/Tests/Server/Services/SubscriberUpdateNotificationHooks.test.ts +541 -0
  497. package/Tests/Server/Services/TeamComplianceServiceBehaviour.test.ts +1 -1
  498. package/Tests/Server/Services/TelemetryUsageBillingSloExclusion.test.ts +288 -0
  499. package/Tests/Server/Services/UserOnCallLogNoNotificationRules.test.ts +1 -1
  500. package/Tests/Server/TestingUtils/PastDueMonitoringClaimSql.ts +177 -0
  501. package/Tests/Server/TestingUtils/Services/BillingServiceHelper.ts +51 -10
  502. package/Tests/Server/TestingUtils/__mocks__/Stripe.mock.ts +16 -1
  503. package/Tests/Server/Types/Database/EventOverlayScopePostgres.test.ts +626 -0
  504. package/Tests/Server/Types/Database/Permissions/InfrastructureOwnershipScope.test.ts +668 -0
  505. package/Tests/Server/Types/Database/Permissions/ProjectDataResidencyColumn.test.ts +386 -0
  506. package/Tests/Server/Types/Database/Permissions/SecurityRoleAccess.test.ts +26 -36
  507. package/Tests/Server/Types/Database/Permissions/SelectRejectionMessageContract.test.ts +1 -0
  508. package/Tests/Server/Types/Database/Permissions/UserNotificationRuleScoping.test.ts +1 -1
  509. package/Tests/Server/Utils/AI/AIIncidentGating.test.ts +16 -9
  510. package/Tests/Server/Utils/AI/ChatAgentRunner.test.ts +137 -1
  511. package/Tests/Server/Utils/AI/InvestigationEligibility.test.ts +697 -0
  512. package/Tests/Server/Utils/AI/ObservabilityChatPrompt.test.ts +105 -0
  513. package/Tests/Server/Utils/AI/RemediationHandoff.test.ts +16 -5
  514. package/Tests/Server/Utils/AI/ResourceTools.test.ts +1304 -0
  515. package/Tests/Server/Utils/AI/RumTools.test.ts +769 -0
  516. package/Tests/Server/Utils/AI/SloAffectedResourceAIContext.test.ts +445 -0
  517. package/Tests/Server/Utils/AI/SloTools.test.ts +423 -1
  518. package/Tests/Server/Utils/AI/SloToolsArchive.test.ts +294 -0
  519. package/Tests/Server/Utils/AI/SloToolsRuleReadPermissions.test.ts +297 -0
  520. package/Tests/Server/Utils/Dashboard/PublicDashboardSloHistoryPolicy.test.ts +255 -10
  521. package/Tests/Server/Utils/Dashboard/SloTemplatePublicDashboard.test.ts +404 -750
  522. package/Tests/Server/Utils/Database/PostgresErrorTranslator.test.ts +63 -0
  523. package/Tests/Server/Utils/Database/ProjectScopedReferenceValidator.test.ts +45 -0
  524. package/Tests/Server/Utils/Database/RelationValueUtil.test.ts +157 -0
  525. package/Tests/Server/Utils/Monitor/Criteria/APIRequestCriteriaEvaluateOverTime.test.ts +11 -9
  526. package/Tests/Server/Utils/Monitor/Criteria/BooleanSeriesEvaluateOverTime.test.ts +260 -0
  527. package/Tests/Server/Utils/Monitor/Criteria/CompareCriteria.test.ts +62 -45
  528. package/Tests/Server/Utils/Monitor/Criteria/CompareCriteriaAggregation.test.ts +25 -24
  529. package/Tests/Server/Utils/Monitor/Criteria/CompareCriteriaHumanMessages.test.ts +513 -0
  530. package/Tests/Server/Utils/Monitor/Criteria/CustomCodeMonitorCriteria.test.ts +2 -2
  531. package/Tests/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.test.ts +181 -0
  532. package/Tests/Server/Utils/Monitor/Criteria/DnsMonitorCriteria.test.ts +1 -1
  533. package/Tests/Server/Utils/Monitor/Criteria/EvaluateOverTime.test.ts +147 -30
  534. package/Tests/Server/Utils/Monitor/Criteria/ExternalStatusPageMonitorCriteria.test.ts +9 -9
  535. package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.test.ts +7 -5
  536. package/Tests/Server/Utils/Monitor/Criteria/ProfileMonitorCriteria.test.ts +2 -2
  537. package/Tests/Server/Utils/Monitor/Criteria/ServerMonitorCriteria.test.ts +4 -3
  538. package/Tests/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.test.ts +2 -2
  539. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorMetricUnits.test.ts +3 -2
  540. package/Tests/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.test.ts +17 -0
  541. package/Tests/Server/Utils/Monitor/MonitorCriteriaHumanMessages.test.ts +529 -0
  542. package/Tests/Server/Utils/Monitor/MonitorStepsProjectValidator.test.ts +136 -0
  543. package/Tests/Server/Utils/Monitor/MonitorStepsProjectValidatorLoadOrder.test.ts +472 -0
  544. package/Tests/Server/Utils/Monitor/NetworkDeviceHydrationUtil.test.ts +48 -2
  545. package/Tests/Server/Utils/Monitor/SloTemplateMetricEmitterContract.test.ts +435 -475
  546. package/Tests/Server/Utils/Rules/MonitorRulePatternValidator.test.ts +77 -0
  547. package/Tests/Server/Utils/Rules/OwnerRuleAssignment.test.ts +585 -0
  548. package/Tests/Server/Utils/Rules/RuleRun/RuleRunPermission.test.ts +365 -0
  549. package/Tests/Server/Utils/Rules/RuleRun/RuleRunRegistry.test.ts +173 -0
  550. package/Tests/Server/Utils/Rules/RuleRun/RuleRunner.test.ts +675 -0
  551. package/Tests/Server/Utils/SecurityEvent/ConnectorErrorMessage.test.ts +8 -8
  552. package/Tests/Server/Utils/SecurityEvent/Connectors/ConnectorFetchSummary.test.ts +261 -0
  553. package/Tests/Server/Utils/SecurityEvent/Connectors/ConnectorPlatformHealth.test.ts +68 -13
  554. package/Tests/Server/Utils/SecurityEvent/{GoogleSecOpsAuth.test.ts → Connectors/GoogleSecOps/GoogleSecOpsAuth.test.ts} +5 -5
  555. package/Tests/Server/Utils/SecurityEvent/{GoogleSecOpsClient.test.ts → Connectors/GoogleSecOps/GoogleSecOpsClient.test.ts} +4 -4
  556. package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnector.test.ts +483 -0
  557. package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnectorCuratedAndLateAlerts.test.ts +676 -0
  558. package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnectorFetchEvents.test.ts +1994 -0
  559. package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnectorFixtures.ts +332 -0
  560. package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnectorHttpIntegration.test.ts +680 -0
  561. package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnectorRequestContract.test.ts +1206 -0
  562. package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnectorTestConnection.test.ts +1136 -0
  563. package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsCuratedRuleCounts.test.ts +407 -0
  564. package/Tests/Server/Utils/SecurityEvent/{GoogleSecOpsErrorHandling.test.ts → Connectors/GoogleSecOps/GoogleSecOpsErrorHandling.test.ts} +5 -5
  565. package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsPollingAdaptiveCatchUp.test.ts +730 -0
  566. package/Tests/Server/Utils/SecurityEvent/{GoogleSecOpsClickhouseIntegration.test.ts → Connectors/GoogleSecOps/GoogleSecOpsPollingClickhouseIntegration.test.ts} +131 -36
  567. package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsPollingFailureTaxonomy.test.ts +772 -0
  568. package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsPollingFixtures.ts +648 -0
  569. package/Tests/Server/Utils/SecurityEvent/{GoogleSecOpsHttpIntegration.test.ts → Connectors/GoogleSecOps/GoogleSecOpsPollingHttpIntegration.test.ts} +230 -225
  570. package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsPollingIntegration.test.ts +1390 -0
  571. package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsPollingLoop.test.ts +981 -0
  572. package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsPollingNothingImportedRegression.test.ts +290 -0
  573. package/Tests/Server/Utils/SecurityEvent/{GoogleSecOpsRequestContract.test.ts → Connectors/GoogleSecOps/GoogleSecOpsRequestContract.test.ts} +2 -2
  574. package/Tests/Server/Utils/SecurityEvent/{GoogleSecOpsResponseParsing.test.ts → Connectors/GoogleSecOps/GoogleSecOpsResponseParsing.test.ts} +5 -5
  575. package/Tests/Server/Utils/SecurityEvent/{GoogleSecOpsSearchDetections.test.ts → Connectors/GoogleSecOps/GoogleSecOpsSearchDetections.test.ts} +38 -5
  576. package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsTesterIntegration.test.ts +421 -0
  577. package/Tests/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionPoller.test.ts +1445 -3
  578. package/Tests/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionRunExecutor.test.ts +14 -4
  579. package/Tests/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionTester.test.ts +313 -4
  580. package/Tests/Server/Utils/SessionReplay/SessionReplayReadServiceQueries.test.ts +352 -0
  581. package/Tests/Server/Utils/Slo/SloFeedUtil.test.ts +326 -0
  582. package/Tests/Server/Utils/Slo/SloLegacyMonitorLabelAdoption.test.ts +260 -0
  583. package/Tests/Server/Utils/Slo/SloMetricUtil.test.ts +592 -0
  584. package/Tests/Server/Utils/Slo/SloRecordReferenceValidator.test.ts +311 -0
  585. package/Tests/Server/Utils/StatusPageResource.test.ts +91 -3
  586. package/Tests/Server/Utils/TailwindBuildCopy.test.ts +14 -2
  587. package/Tests/Server/Utils/Telemetry/HostAssetAttributesFromOtlp.test.ts +235 -0
  588. package/Tests/Server/Utils/Telemetry/TelemetryEntity.test.ts +385 -2
  589. package/Tests/Server/Utils/VendorAssets.test.ts +17 -3
  590. package/Tests/Types/AI/AIChatPageContext.test.ts +0 -0
  591. package/Tests/Types/AI/AIResourceContext.test.ts +312 -0
  592. package/Tests/Types/Billing/SubscriptionStatus.test.ts +176 -0
  593. package/Tests/Types/Billing/SubscriptionStatusPastDueMonitoring.test.ts +187 -0
  594. package/Tests/Types/Dashboard/DashboardTemplateInvariants.test.ts +53 -7
  595. package/Tests/Types/Dashboard/SloDashboardTemplate.test.ts +816 -792
  596. package/Tests/Types/Database/UniqueColumnsTogether.test.ts +100 -0
  597. package/Tests/Types/Monitor/CriteriaFilter.test.ts +216 -24
  598. package/Tests/Types/Monitor/MetricAndProfileDefaultCriteria.test.ts +4 -4
  599. package/Tests/Types/Monitor/MonitorStepDnssecMonitor.test.ts +14 -1
  600. package/Tests/Types/Monitor/MonitorStepDomainMonitor.test.ts +14 -1
  601. package/Tests/Types/Monitor/MonitorStepExternalStatusPageMonitor.test.ts +14 -1
  602. package/Tests/Types/Monitor/MonitorStepRetriesParsing.test.ts +201 -0
  603. package/Tests/Types/Monitor/MonitorStepRetryPersistence.test.ts +125 -0
  604. package/Tests/Types/Rules/RuleRun.test.ts +315 -0
  605. package/Tests/Types/Rum/SessionReplayApiContracts.test.ts +60 -0
  606. package/Tests/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.test.ts +29 -4
  607. package/Tests/Types/StatusPage/SubscriberNotificationTemplateVariables.test.ts +217 -0
  608. package/Tests/Types/StatusPage/SubscriberUpdateNotification.test.ts +200 -0
  609. package/Tests/Types/WebsiteRequest.test.ts +44 -0
  610. package/Tests/UI/Components/ActiveFilterChipsLockedFilters.test.tsx +141 -87
  611. package/Tests/UI/Components/AlertBanner.test.tsx +319 -0
  612. package/Tests/UI/Components/BulkArchiveActionsCopy.test.tsx +310 -0
  613. package/Tests/UI/Components/Detail/DetailIdIsUnique.test.tsx +87 -0
  614. package/Tests/UI/Components/Dropdown/DropdownClearable.test.tsx +393 -0
  615. package/Tests/UI/Components/Dropdown/DropdownMultiSelectChipAccessibleName.test.tsx +64 -0
  616. package/Tests/UI/Components/EmptyState/EmptyState.test.tsx +335 -4
  617. package/Tests/UI/Components/EmptyState/EmptyStateGuideLinks.test.tsx +337 -0
  618. package/Tests/UI/Components/Forms/ModelFormJsonColumns.test.tsx +21 -20
  619. package/Tests/UI/Components/Forms/MonitorDescriptionForm.test.tsx +410 -0
  620. package/Tests/UI/Components/LabelRuleImportExport.test.tsx +15 -2
  621. package/Tests/UI/Components/LockedFilterChip.test.tsx +281 -144
  622. package/Tests/UI/Components/ModelTable/BaseModelTableReadPermissions.test.tsx +439 -0
  623. package/Tests/UI/Components/MoreMenu.test.tsx +133 -0
  624. package/Tests/UI/Components/MoreMenuMotion.test.tsx +84 -3
  625. package/Tests/UI/Components/NavBarMenuSearch.test.tsx +372 -0
  626. package/Tests/UI/Components/RuleCriteria/RuleCriteriaModelTable.test.tsx +3 -3
  627. package/Tests/UI/Components/RuleRun/RuleDetailFields.test.tsx +336 -0
  628. package/Tests/UI/Components/RuleRun/RuleTable.test.tsx +304 -0
  629. package/Tests/UI/Components/RuleRun/RunRuleNowModal.test.tsx +231 -0
  630. package/Tests/UI/Components/RuleRun/RunRulesBulkAction.test.ts +213 -0
  631. package/Tests/UI/Components/TelemetryActiveFilterChipsLockedFilters.test.tsx +124 -61
  632. package/Tests/UI/EsbuildConfig.test.ts +1 -1
  633. package/Tests/UI/Monitor/MonitorStepRetrySettings.test.tsx +616 -0
  634. package/Tests/UI/ReactRouterSingletonBuild.test.ts +4 -2
  635. package/Tests/UI/Rum/ReplayEngine.test.ts +333 -0
  636. package/Tests/UI/Rum/ReplayHeader.test.tsx +257 -123
  637. package/Tests/UI/Rum/ReplayPinControl.test.tsx +122 -0
  638. package/Tests/UI/Rum/ReplayPlayerChrome.test.tsx +245 -0
  639. package/Tests/UI/Rum/ReplayRail.test.tsx +294 -0
  640. package/Tests/UI/Rum/ReplayScrubber.test.tsx +301 -1
  641. package/Tests/UI/Rum/ReplayStage.test.tsx +565 -172
  642. package/Tests/UI/Rum/ReplayStageOverlays.test.tsx +343 -3
  643. package/Tests/UI/Rum/ReplayTabSwitcher.test.tsx +1424 -0
  644. package/Tests/UI/Rum/ReplayTimeline.test.tsx +222 -0
  645. package/Tests/UI/Utils/DashboardStackingLayers.test.ts +8 -1
  646. package/Tests/UI/Utils/RuleRunClient.test.ts +303 -0
  647. package/Tests/UI/Utils/Telemetry/TelemetryEntityNames.test.ts +1 -0
  648. package/Tests/Utils/API.test.ts +96 -0
  649. package/Tests/Utils/Dashboard/Components/DashboardComponentDefaults.test.ts +2 -0
  650. package/Tests/Utils/Dashboard/Components/DashboardSloListComponent.test.ts +206 -0
  651. package/Tests/Utils/Dashboard/DashboardSloComponent.test.ts +36 -2
  652. package/Tests/Utils/Dashboard/SloTemplateVariableScoping.test.ts +409 -588
  653. package/Tests/Utils/Dashboard/SloWidgetSource.test.ts +351 -0
  654. package/Tests/Utils/HTTPResponseBodyReader.test.ts +188 -1
  655. package/Tests/Utils/Markdown/MarkdownEscape.test.ts +361 -0
  656. package/Tests/Utils/Metrics/MetricEventScopeUrl.test.ts +101 -0
  657. package/Tests/Utils/Monitor/MonitorTestAvailabilityUtil.test.ts +256 -0
  658. package/Tests/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.test.ts +1425 -118
  659. package/Tests/Utils/NetworkDiscovery/DiscoveredHostUtil.test.ts +188 -3
  660. package/Tests/Utils/NetworkDiscovery/DiscoveryReverseDnsChain.test.ts +661 -13
  661. package/Tests/Utils/NetworkDiscovery/NetbiosNameUtil.test.ts +349 -0
  662. package/Tests/Utils/NetworkDiscovery/RunImportedDeviceNaming.test.ts +656 -0
  663. package/Tests/Utils/NetworkDiscovery/ShortDeviceNamePlanner.test.ts +1020 -0
  664. package/Tests/Utils/NetworkDiscovery/ShortHostnameUtil.test.ts +619 -0
  665. package/Tests/Utils/NetworkSite/CidrMatchUtil.test.ts +317 -0
  666. package/Tests/Utils/Project/DataResidency.test.ts +198 -0
  667. package/Tests/Utils/Rules/RuleRunSummary.test.ts +394 -0
  668. package/Tests/Utils/Slo/SloAffectedResourceMarkdown.test.ts +302 -0
  669. package/Tests/Utils/Slo/SloBurnRateTemplate.test.ts +468 -0
  670. package/Tests/Utils/Slo/SloEvaluation.test.ts +20 -4
  671. package/Tests/Utils/Slo/SloFeedMarkdown.test.ts +1185 -0
  672. package/Tests/Utils/Slo/SloHealth.test.ts +262 -0
  673. package/Tests/Utils/Slo/SloHistoryMetricName.test.ts +102 -0
  674. package/Tests/Utils/Slo/SloListWidgetFormat.test.ts +522 -0
  675. package/Tests/Utils/Slo/SloMetricType.test.ts +355 -0
  676. package/Tests/Utils/Slo/SloMonitorRuleCriteria.test.ts +387 -0
  677. package/Tests/Utils/Slo/SloMonitorStatusSummary.test.ts +210 -0
  678. package/Tests/Utils/Slo/SloOverviewText.test.ts +226 -0
  679. package/Tests/Utils/Slo/SloProjection.test.ts +1039 -0
  680. package/Tests/Utils/Slo/SloWidgetFormat.test.ts +47 -0
  681. package/Tests/Utils/Telemetry/HostIpAddresses.test.ts +105 -0
  682. package/Tests/Utils/Telemetry/LockedFilterSearch.test.ts +1 -80
  683. package/Types/AI/AIChatPageContext.ts +87 -2
  684. package/Types/AI/AIChatTypes.ts +4 -0
  685. package/Types/AI/AIResourceContext.ts +198 -0
  686. package/Types/AI/InvestigationNotStartedReason.ts +30 -0
  687. package/Types/BaseDatabase/EnableAuditLogOn.ts +41 -0
  688. package/Types/Billing/SubscriptionStatus.ts +39 -4
  689. package/Types/Dashboard/DashboardComponentType.ts +1 -0
  690. package/Types/Dashboard/DashboardComponents/ComponentArgument.ts +5 -0
  691. package/Types/Dashboard/DashboardComponents/DashboardSloComponent.ts +10 -0
  692. package/Types/Dashboard/DashboardComponents/DashboardSloListComponent.ts +29 -0
  693. package/Types/Dashboard/DashboardTemplates.ts +290 -297
  694. package/Types/Database/EnableAuditLog.ts +23 -1
  695. package/Types/Database/UniqueColumnsTogether.ts +55 -0
  696. package/Types/Email/EmailTemplateType.ts +4 -0
  697. package/Types/Metrics/MetricQueryConfigData.ts +8 -0
  698. package/Types/Monitor/CriteriaFilter.ts +55 -8
  699. package/Types/Monitor/MonitorStep.ts +5 -2
  700. package/Types/Monitor/MonitorStepDnsMonitor.ts +3 -1
  701. package/Types/Monitor/MonitorStepDnssecMonitor.ts +3 -1
  702. package/Types/Monitor/MonitorStepDomainMonitor.ts +3 -1
  703. package/Types/Monitor/MonitorStepExternalStatusPageMonitor.ts +3 -1
  704. package/Types/Monitor/MonitorStepRetries.ts +59 -0
  705. package/Types/Monitor/MonitorStepSnmpMonitor.ts +9 -2
  706. package/Types/NetworkDevice/NetworkDeviceDiagnosticResult.ts +104 -0
  707. package/Types/NetworkDevice/NetworkDeviceDiagnosticStatus.ts +47 -0
  708. package/Types/NetworkDevice/NetworkDeviceDiagnosticType.ts +47 -0
  709. package/Types/NetworkDevice/NetworkDevicePingMetricNames.ts +20 -0
  710. package/Types/Permission.ts +127 -0
  711. package/Types/Rules/RuleCriteriaFieldRegistry.ts +5 -0
  712. package/Types/Rules/RuleRun.ts +518 -0
  713. package/Types/Rum/SessionReplayApi.ts +18 -0
  714. package/Types/Rum/WebVitals.ts +71 -0
  715. package/Types/SecurityEvent/Connectors/ConnectorDiagnostics.ts +6 -0
  716. package/Types/SecurityEvent/Connectors/SecurityEventConnectionDiagnostics.ts +30 -4
  717. package/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.ts +108 -1
  718. package/Types/SecurityEvent/Connectors/SecurityEventConnectorProvider.ts +6 -2
  719. package/Types/ServiceLevelObjective/SloHistoryMetricName.ts +25 -0
  720. package/Types/ServiceLevelObjective/SloMetricType.ts +49 -0
  721. package/Types/StatusPage/StatusPageSubscriberNotificationEventType.ts +4 -0
  722. package/Types/StatusPage/SubscriberNotificationTemplateVariables.ts +331 -0
  723. package/Types/StatusPage/SubscriberNotificationTrigger.ts +12 -0
  724. package/Types/StatusPage/SubscriberUpdateNotification.ts +89 -0
  725. package/Types/Telemetry/LockedFilterDetail.ts +7 -28
  726. package/Types/Telemetry/ServiceType.ts +7 -0
  727. package/Types/WebsiteRequest.ts +2 -0
  728. package/Typings/Index.d.ts +53 -3
  729. package/UI/Components/AlertBanner/AlertBanner.tsx +85 -27
  730. package/UI/Components/BulkUpdate/BulkArchiveActions.tsx +21 -2
  731. package/UI/Components/Detail/Detail.tsx +9 -2
  732. package/UI/Components/Dropdown/Dropdown.tsx +64 -1
  733. package/UI/Components/EditionLabel/EditionLabel.tsx +7 -5
  734. package/UI/Components/EmptyState/EmptyState.tsx +27 -3
  735. package/UI/Components/EmptyState/EmptyStateGuideLinks.tsx +124 -0
  736. package/UI/Components/Forms/ModelForm.tsx +6 -5
  737. package/UI/Components/KeyboardShortcut/Screenshots/README.md +1 -1
  738. package/UI/Components/LabelRule/LabelRuleTable.tsx +8 -2
  739. package/UI/Components/LogsViewer/LogsViewer.tsx +2 -6
  740. package/UI/Components/LogsViewer/components/ActiveFilterChips.tsx +2 -13
  741. package/UI/Components/LogsViewer/types.ts +2 -2
  742. package/UI/Components/ModelTable/BaseModelTable.tsx +8 -0
  743. package/UI/Components/MoreMenu/MoreMenu.tsx +14 -3
  744. package/UI/Components/Navbar/NavBar.tsx +2 -0
  745. package/UI/Components/Navbar/NavBarMenuModal.tsx +6 -2
  746. package/UI/Components/RuleRun/RuleDetailFields.tsx +359 -0
  747. package/UI/Components/RuleRun/RuleTable.tsx +183 -0
  748. package/UI/Components/RuleRun/RuleView.tsx +170 -0
  749. package/UI/Components/RuleRun/RunRuleNowModal.tsx +147 -0
  750. package/UI/Components/RuleRun/RunRulesBulkAction.ts +103 -0
  751. package/UI/Components/TelemetryViewer/TelemetryViewer.tsx +2 -6
  752. package/UI/Components/TelemetryViewer/components/LockedFilterChip.tsx +38 -104
  753. package/UI/Components/TelemetryViewer/components/TelemetryActiveFilterChips.tsx +2 -18
  754. package/UI/Components/TelemetryViewer/types.ts +2 -2
  755. package/UI/Utils/Rules/RuleRunClient.ts +178 -0
  756. package/UI/Utils/Telemetry/TelemetryEntityNames.ts +8 -0
  757. package/UI/esbuild-config.js +4 -4
  758. package/Utils/API.ts +10 -1
  759. package/Utils/Dashboard/Components/DashboardSloComponent.ts +19 -2
  760. package/Utils/Dashboard/Components/DashboardSloListComponent.ts +126 -0
  761. package/Utils/Dashboard/Components/Index.ts +7 -0
  762. package/Utils/Dashboard/HtmlWidgetDocument.ts +1 -1
  763. package/Utils/Dashboard/SloWidgetSource.ts +188 -0
  764. package/Utils/HTTPResponseBodyReader.ts +64 -8
  765. package/Utils/Markdown/MarkdownEscape.ts +63 -0
  766. package/Utils/Metrics/MetricExplorerUrl.ts +19 -0
  767. package/Utils/Monitor/MonitorTestAvailabilityUtil.ts +92 -0
  768. package/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.ts +161 -36
  769. package/Utils/NetworkDiscovery/DiscoveredHostUtil.ts +25 -0
  770. package/Utils/NetworkDiscovery/NetbiosNameUtil.ts +146 -0
  771. package/Utils/NetworkDiscovery/RunImportedDeviceNaming.ts +390 -0
  772. package/Utils/NetworkDiscovery/ShortDeviceNamePlanner.ts +291 -0
  773. package/Utils/NetworkDiscovery/ShortHostnameUtil.ts +91 -0
  774. package/Utils/NetworkSite/CidrMatchUtil.ts +37 -12
  775. package/Utils/Project/DataResidency.ts +63 -0
  776. package/Utils/Rules/RuleRunSummary.ts +323 -0
  777. package/Utils/Slo/SloAffectedResourceMarkdown.ts +123 -0
  778. package/Utils/Slo/SloBurnRateTemplate.ts +373 -0
  779. package/Utils/Slo/SloFeedMarkdown.ts +1507 -0
  780. package/Utils/Slo/SloHealth.ts +96 -9
  781. package/Utils/Slo/SloListWidgetFormat.ts +370 -0
  782. package/Utils/Slo/SloMetricType.ts +237 -0
  783. package/Utils/Slo/SloMonitorRuleCriteria.ts +364 -0
  784. package/Utils/Slo/SloMonitorStatusSummary.ts +210 -0
  785. package/Utils/Slo/SloOverviewText.ts +265 -0
  786. package/Utils/Slo/SloProjection.ts +967 -0
  787. package/Utils/Slo/SloWidgetFormat.ts +12 -2
  788. package/Utils/Telemetry/HostIpAddresses.ts +46 -2
  789. package/Utils/Telemetry/LockedFilterSearch.ts +3 -49
  790. package/build/dist/Models/AnalyticsModels/AuditLog.js +70 -1
  791. package/build/dist/Models/AnalyticsModels/AuditLog.js.map +1 -1
  792. package/build/dist/Models/AnalyticsModels/SecurityEvent.js +4 -4
  793. package/build/dist/Models/DatabaseModels/AIAgentOwnerTeam.js +4 -1
  794. package/build/dist/Models/DatabaseModels/AIAgentOwnerTeam.js.map +1 -1
  795. package/build/dist/Models/DatabaseModels/AIAgentOwnerUser.js +4 -1
  796. package/build/dist/Models/DatabaseModels/AIAgentOwnerUser.js.map +1 -1
  797. package/build/dist/Models/DatabaseModels/Alert.js +72 -0
  798. package/build/dist/Models/DatabaseModels/Alert.js.map +1 -1
  799. package/build/dist/Models/DatabaseModels/AlertEpisodeOwnerTeam.js +3 -1
  800. package/build/dist/Models/DatabaseModels/AlertEpisodeOwnerTeam.js.map +1 -1
  801. package/build/dist/Models/DatabaseModels/AlertEpisodeOwnerUser.js +3 -1
  802. package/build/dist/Models/DatabaseModels/AlertEpisodeOwnerUser.js.map +1 -1
  803. package/build/dist/Models/DatabaseModels/AlertOwnerTeam.js +3 -1
  804. package/build/dist/Models/DatabaseModels/AlertOwnerTeam.js.map +1 -1
  805. package/build/dist/Models/DatabaseModels/AlertOwnerUser.js +3 -1
  806. package/build/dist/Models/DatabaseModels/AlertOwnerUser.js.map +1 -1
  807. package/build/dist/Models/DatabaseModels/CephClusterOwnerTeam.js +4 -1
  808. package/build/dist/Models/DatabaseModels/CephClusterOwnerTeam.js.map +1 -1
  809. package/build/dist/Models/DatabaseModels/CephClusterOwnerUser.js +4 -1
  810. package/build/dist/Models/DatabaseModels/CephClusterOwnerUser.js.map +1 -1
  811. package/build/dist/Models/DatabaseModels/CloudResourceOwnerTeam.js +4 -1
  812. package/build/dist/Models/DatabaseModels/CloudResourceOwnerTeam.js.map +1 -1
  813. package/build/dist/Models/DatabaseModels/CloudResourceOwnerUser.js +4 -1
  814. package/build/dist/Models/DatabaseModels/CloudResourceOwnerUser.js.map +1 -1
  815. package/build/dist/Models/DatabaseModels/DashboardOwnerTeam.js +3 -1
  816. package/build/dist/Models/DatabaseModels/DashboardOwnerTeam.js.map +1 -1
  817. package/build/dist/Models/DatabaseModels/DashboardOwnerUser.js +3 -1
  818. package/build/dist/Models/DatabaseModels/DashboardOwnerUser.js.map +1 -1
  819. package/build/dist/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.js +3 -0
  820. package/build/dist/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.js.map +1 -1
  821. package/build/dist/Models/DatabaseModels/DockerHostOwnerTeam.js +4 -1
  822. package/build/dist/Models/DatabaseModels/DockerHostOwnerTeam.js.map +1 -1
  823. package/build/dist/Models/DatabaseModels/DockerHostOwnerUser.js +4 -1
  824. package/build/dist/Models/DatabaseModels/DockerHostOwnerUser.js.map +1 -1
  825. package/build/dist/Models/DatabaseModels/DockerSwarmClusterOwnerTeam.js +4 -1
  826. package/build/dist/Models/DatabaseModels/DockerSwarmClusterOwnerTeam.js.map +1 -1
  827. package/build/dist/Models/DatabaseModels/DockerSwarmClusterOwnerUser.js +4 -1
  828. package/build/dist/Models/DatabaseModels/DockerSwarmClusterOwnerUser.js.map +1 -1
  829. package/build/dist/Models/DatabaseModels/GlobalConfig.js +1 -1
  830. package/build/dist/Models/DatabaseModels/GlobalConfig.js.map +1 -1
  831. package/build/dist/Models/DatabaseModels/HostOwnerTeam.js +4 -1
  832. package/build/dist/Models/DatabaseModels/HostOwnerTeam.js.map +1 -1
  833. package/build/dist/Models/DatabaseModels/HostOwnerUser.js +4 -1
  834. package/build/dist/Models/DatabaseModels/HostOwnerUser.js.map +1 -1
  835. package/build/dist/Models/DatabaseModels/Incident.js +76 -0
  836. package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
  837. package/build/dist/Models/DatabaseModels/IncidentEpisodeOwnerTeam.js +3 -1
  838. package/build/dist/Models/DatabaseModels/IncidentEpisodeOwnerTeam.js.map +1 -1
  839. package/build/dist/Models/DatabaseModels/IncidentEpisodeOwnerUser.js +3 -1
  840. package/build/dist/Models/DatabaseModels/IncidentEpisodeOwnerUser.js.map +1 -1
  841. package/build/dist/Models/DatabaseModels/IncidentEpisodePublicNote.js +75 -0
  842. package/build/dist/Models/DatabaseModels/IncidentEpisodePublicNote.js.map +1 -1
  843. package/build/dist/Models/DatabaseModels/IncidentOwnerTeam.js +3 -1
  844. package/build/dist/Models/DatabaseModels/IncidentOwnerTeam.js.map +1 -1
  845. package/build/dist/Models/DatabaseModels/IncidentOwnerUser.js +3 -1
  846. package/build/dist/Models/DatabaseModels/IncidentOwnerUser.js.map +1 -1
  847. package/build/dist/Models/DatabaseModels/IncidentPublicNote.js +75 -0
  848. package/build/dist/Models/DatabaseModels/IncidentPublicNote.js.map +1 -1
  849. package/build/dist/Models/DatabaseModels/IncidentTemplateOwnerTeam.js +4 -1
  850. package/build/dist/Models/DatabaseModels/IncidentTemplateOwnerTeam.js.map +1 -1
  851. package/build/dist/Models/DatabaseModels/IncidentTemplateOwnerUser.js +4 -1
  852. package/build/dist/Models/DatabaseModels/IncidentTemplateOwnerUser.js.map +1 -1
  853. package/build/dist/Models/DatabaseModels/IncomingCallPolicyOwnerTeam.js +3 -1
  854. package/build/dist/Models/DatabaseModels/IncomingCallPolicyOwnerTeam.js.map +1 -1
  855. package/build/dist/Models/DatabaseModels/IncomingCallPolicyOwnerUser.js +3 -1
  856. package/build/dist/Models/DatabaseModels/IncomingCallPolicyOwnerUser.js.map +1 -1
  857. package/build/dist/Models/DatabaseModels/Index.js +6 -4
  858. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  859. package/build/dist/Models/DatabaseModels/IoTFleetOwnerTeam.js +4 -1
  860. package/build/dist/Models/DatabaseModels/IoTFleetOwnerTeam.js.map +1 -1
  861. package/build/dist/Models/DatabaseModels/IoTFleetOwnerUser.js +4 -1
  862. package/build/dist/Models/DatabaseModels/IoTFleetOwnerUser.js.map +1 -1
  863. package/build/dist/Models/DatabaseModels/KubernetesClusterOwnerTeam.js +4 -1
  864. package/build/dist/Models/DatabaseModels/KubernetesClusterOwnerTeam.js.map +1 -1
  865. package/build/dist/Models/DatabaseModels/KubernetesClusterOwnerUser.js +4 -1
  866. package/build/dist/Models/DatabaseModels/KubernetesClusterOwnerUser.js.map +1 -1
  867. package/build/dist/Models/DatabaseModels/Monitor.js +2 -3
  868. package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
  869. package/build/dist/Models/DatabaseModels/MonitorGroupOwnerTeam.js +4 -1
  870. package/build/dist/Models/DatabaseModels/MonitorGroupOwnerTeam.js.map +1 -1
  871. package/build/dist/Models/DatabaseModels/MonitorGroupOwnerUser.js +4 -1
  872. package/build/dist/Models/DatabaseModels/MonitorGroupOwnerUser.js.map +1 -1
  873. package/build/dist/Models/DatabaseModels/MonitorOwnerTeam.js +3 -1
  874. package/build/dist/Models/DatabaseModels/MonitorOwnerTeam.js.map +1 -1
  875. package/build/dist/Models/DatabaseModels/MonitorOwnerUser.js +3 -1
  876. package/build/dist/Models/DatabaseModels/MonitorOwnerUser.js.map +1 -1
  877. package/build/dist/Models/DatabaseModels/MonitorTemplate.js +2 -3
  878. package/build/dist/Models/DatabaseModels/MonitorTemplate.js.map +1 -1
  879. package/build/dist/Models/DatabaseModels/NetworkDevice.js +68 -0
  880. package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
  881. package/build/dist/Models/DatabaseModels/NetworkDeviceDiagnostic.js +772 -0
  882. package/build/dist/Models/DatabaseModels/NetworkDeviceDiagnostic.js.map +1 -0
  883. package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js +140 -0
  884. package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -1
  885. package/build/dist/Models/DatabaseModels/NetworkDeviceOwnerTeam.js +4 -1
  886. package/build/dist/Models/DatabaseModels/NetworkDeviceOwnerTeam.js.map +1 -1
  887. package/build/dist/Models/DatabaseModels/NetworkDeviceOwnerUser.js +4 -1
  888. package/build/dist/Models/DatabaseModels/NetworkDeviceOwnerUser.js.map +1 -1
  889. package/build/dist/Models/DatabaseModels/NetworkSiteAssignmentRule.js +1 -1
  890. package/build/dist/Models/DatabaseModels/NetworkSiteAssignmentRule.js.map +1 -1
  891. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyOwnerTeam.js +3 -1
  892. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyOwnerTeam.js.map +1 -1
  893. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyOwnerUser.js +3 -1
  894. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyOwnerUser.js.map +1 -1
  895. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleOwnerTeam.js +3 -1
  896. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleOwnerTeam.js.map +1 -1
  897. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleOwnerUser.js +3 -1
  898. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleOwnerUser.js.map +1 -1
  899. package/build/dist/Models/DatabaseModels/PodmanHostOwnerTeam.js +4 -1
  900. package/build/dist/Models/DatabaseModels/PodmanHostOwnerTeam.js.map +1 -1
  901. package/build/dist/Models/DatabaseModels/PodmanHostOwnerUser.js +4 -1
  902. package/build/dist/Models/DatabaseModels/PodmanHostOwnerUser.js.map +1 -1
  903. package/build/dist/Models/DatabaseModels/ProbeOwnerTeam.js +4 -1
  904. package/build/dist/Models/DatabaseModels/ProbeOwnerTeam.js.map +1 -1
  905. package/build/dist/Models/DatabaseModels/ProbeOwnerUser.js +4 -1
  906. package/build/dist/Models/DatabaseModels/ProbeOwnerUser.js.map +1 -1
  907. package/build/dist/Models/DatabaseModels/Project.js +42 -0
  908. package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
  909. package/build/dist/Models/DatabaseModels/ProxmoxClusterOwnerTeam.js +4 -1
  910. package/build/dist/Models/DatabaseModels/ProxmoxClusterOwnerTeam.js.map +1 -1
  911. package/build/dist/Models/DatabaseModels/ProxmoxClusterOwnerUser.js +4 -1
  912. package/build/dist/Models/DatabaseModels/ProxmoxClusterOwnerUser.js.map +1 -1
  913. package/build/dist/Models/DatabaseModels/RumApplicationOwnerTeam.js +4 -1
  914. package/build/dist/Models/DatabaseModels/RumApplicationOwnerTeam.js.map +1 -1
  915. package/build/dist/Models/DatabaseModels/RumApplicationOwnerUser.js +4 -1
  916. package/build/dist/Models/DatabaseModels/RumApplicationOwnerUser.js.map +1 -1
  917. package/build/dist/Models/DatabaseModels/RunbookOwnerTeam.js +3 -1
  918. package/build/dist/Models/DatabaseModels/RunbookOwnerTeam.js.map +1 -1
  919. package/build/dist/Models/DatabaseModels/RunbookOwnerUser.js +3 -1
  920. package/build/dist/Models/DatabaseModels/RunbookOwnerUser.js.map +1 -1
  921. package/build/dist/Models/DatabaseModels/RunnerOwnerTeam.js +3 -1
  922. package/build/dist/Models/DatabaseModels/RunnerOwnerTeam.js.map +1 -1
  923. package/build/dist/Models/DatabaseModels/RunnerOwnerUser.js +3 -1
  924. package/build/dist/Models/DatabaseModels/RunnerOwnerUser.js.map +1 -1
  925. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceOwnerTeam.js +3 -1
  926. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceOwnerTeam.js.map +1 -1
  927. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceOwnerUser.js +3 -1
  928. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceOwnerUser.js.map +1 -1
  929. package/build/dist/Models/DatabaseModels/ScheduledMaintenancePublicNote.js +75 -0
  930. package/build/dist/Models/DatabaseModels/ScheduledMaintenancePublicNote.js.map +1 -1
  931. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplateOwnerTeam.js +6 -1
  932. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplateOwnerTeam.js.map +1 -1
  933. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplateOwnerUser.js +6 -1
  934. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplateOwnerUser.js.map +1 -1
  935. package/build/dist/Models/DatabaseModels/SecurityEventConnection.js +11 -11
  936. package/build/dist/Models/DatabaseModels/ServerlessFunctionOwnerTeam.js +4 -1
  937. package/build/dist/Models/DatabaseModels/ServerlessFunctionOwnerTeam.js.map +1 -1
  938. package/build/dist/Models/DatabaseModels/ServerlessFunctionOwnerUser.js +4 -1
  939. package/build/dist/Models/DatabaseModels/ServerlessFunctionOwnerUser.js.map +1 -1
  940. package/build/dist/Models/DatabaseModels/ServiceLevelObjective.js +192 -10
  941. package/build/dist/Models/DatabaseModels/ServiceLevelObjective.js.map +1 -1
  942. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveBurnRateRule.js +798 -96
  943. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveBurnRateRule.js.map +1 -1
  944. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveFeed.js +596 -0
  945. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveFeed.js.map +1 -0
  946. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveMonitorRule.js +590 -0
  947. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveMonitorRule.js.map +1 -0
  948. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerTeam.js +19 -1
  949. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerTeam.js.map +1 -1
  950. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerUser.js +19 -1
  951. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerUser.js.map +1 -1
  952. package/build/dist/Models/DatabaseModels/ServiceOwnerTeam.js +4 -1
  953. package/build/dist/Models/DatabaseModels/ServiceOwnerTeam.js.map +1 -1
  954. package/build/dist/Models/DatabaseModels/ServiceOwnerUser.js +4 -1
  955. package/build/dist/Models/DatabaseModels/ServiceOwnerUser.js.map +1 -1
  956. package/build/dist/Models/DatabaseModels/StatusPageAnnouncement.js +75 -0
  957. package/build/dist/Models/DatabaseModels/StatusPageAnnouncement.js.map +1 -1
  958. package/build/dist/Models/DatabaseModels/StatusPageOwnerTeam.js +3 -1
  959. package/build/dist/Models/DatabaseModels/StatusPageOwnerTeam.js.map +1 -1
  960. package/build/dist/Models/DatabaseModels/StatusPageOwnerUser.js +3 -1
  961. package/build/dist/Models/DatabaseModels/StatusPageOwnerUser.js.map +1 -1
  962. package/build/dist/Models/DatabaseModels/ThreatIntelFeed.js +1 -1
  963. package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerTeam.js +4 -1
  964. package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerTeam.js.map +1 -1
  965. package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerUser.js +4 -1
  966. package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerUser.js.map +1 -1
  967. package/build/dist/Models/DatabaseModels/WorkflowOwnerTeam.js +3 -1
  968. package/build/dist/Models/DatabaseModels/WorkflowOwnerTeam.js.map +1 -1
  969. package/build/dist/Models/DatabaseModels/WorkflowOwnerUser.js +3 -1
  970. package/build/dist/Models/DatabaseModels/WorkflowOwnerUser.js.map +1 -1
  971. package/build/dist/Server/API/AIAgentDataAPI.js +1 -1
  972. package/build/dist/Server/API/AIChatAPI.js +3 -1
  973. package/build/dist/Server/API/AIChatAPI.js.map +1 -1
  974. package/build/dist/Server/API/AIInvestigationAPI.js +3 -0
  975. package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
  976. package/build/dist/Server/API/BaseAPI.js +14 -0
  977. package/build/dist/Server/API/BaseAPI.js.map +1 -1
  978. package/build/dist/Server/API/BillingInvoiceAPI.js +233 -19
  979. package/build/dist/Server/API/BillingInvoiceAPI.js.map +1 -1
  980. package/build/dist/Server/API/BillingPaymentMethodAPI.js +86 -5
  981. package/build/dist/Server/API/BillingPaymentMethodAPI.js.map +1 -1
  982. package/build/dist/Server/API/DashboardAPI.js +72 -2
  983. package/build/dist/Server/API/DashboardAPI.js.map +1 -1
  984. package/build/dist/Server/API/SecurityEventConnectionAPI.js +102 -10
  985. package/build/dist/Server/API/SecurityEventConnectionAPI.js.map +1 -1
  986. package/build/dist/Server/API/StatusPageAPI.js +245 -155
  987. package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
  988. package/build/dist/Server/Infrastructure/Postgres/LocalMigrationGenerationDataSource.js +1 -1
  989. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792800000000-AddNetworkDeviceDiagnostic.js +34 -0
  990. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792800000000-AddNetworkDeviceDiagnostic.js.map +1 -0
  991. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792900000000-AddNetworkDeviceDnsNameAndShortDeviceNames.js +24 -0
  992. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792900000000-AddNetworkDeviceDnsNameAndShortDeviceNames.js.map +1 -0
  993. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793000000000-AddNetbiosLookupToNetworkDeviceDiscoveryScan.js +21 -0
  994. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793000000000-AddNetbiosLookupToNetworkDeviceDiscoveryScan.js.map +1 -0
  995. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793100000000-SloProductOverhaul.js +207 -0
  996. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793100000000-SloProductOverhaul.js.map +1 -0
  997. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793200000000-BackfillSloMonitorRulesAndAffectedResources.js +72 -0
  998. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793200000000-BackfillSloMonitorRulesAndAffectedResources.js.map +1 -0
  999. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793300000000-AddDataResidencyToProject.js +20 -0
  1000. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793300000000-AddDataResidencyToProject.js.map +1 -0
  1001. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793400000000-AddSubscriberUpdateNotificationStatus.js +46 -0
  1002. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793400000000-AddSubscriberUpdateNotificationStatus.js.map +1 -0
  1003. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793500000000-MakeOwnerRowsUnique.js +602 -0
  1004. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793500000000-MakeOwnerRowsUnique.js.map +1 -0
  1005. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793700000000-AddAIInvestigationDecision.js +14 -0
  1006. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793700000000-AddAIInvestigationDecision.js.map +1 -0
  1007. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793800000000-RemoveMonitorDescriptionLengthLimit.js +20 -0
  1008. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793800000000-RemoveMonitorDescriptionLengthLimit.js.map +1 -0
  1009. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +20 -0
  1010. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  1011. package/build/dist/Server/Middleware/IdentityRateLimit.js +22 -1
  1012. package/build/dist/Server/Middleware/IdentityRateLimit.js.map +1 -1
  1013. package/build/dist/Server/Middleware/PublicDashboardRateLimit.js +117 -36
  1014. package/build/dist/Server/Middleware/PublicDashboardRateLimit.js.map +1 -1
  1015. package/build/dist/Server/Services/AlertEpisodeLabelRuleEngineService.js +112 -56
  1016. package/build/dist/Server/Services/AlertEpisodeLabelRuleEngineService.js.map +1 -1
  1017. package/build/dist/Server/Services/AlertEpisodeOwnerRuleEngineService.js +167 -68
  1018. package/build/dist/Server/Services/AlertEpisodeOwnerRuleEngineService.js.map +1 -1
  1019. package/build/dist/Server/Services/AlertEpisodePrivacyRuleEngineService.js +87 -26
  1020. package/build/dist/Server/Services/AlertEpisodePrivacyRuleEngineService.js.map +1 -1
  1021. package/build/dist/Server/Services/AlertEpisodeService.js +13 -31
  1022. package/build/dist/Server/Services/AlertEpisodeService.js.map +1 -1
  1023. package/build/dist/Server/Services/AlertGroupingEngineService.js +7 -4
  1024. package/build/dist/Server/Services/AlertGroupingEngineService.js.map +1 -1
  1025. package/build/dist/Server/Services/AlertLabelRuleEngineService.js +270 -203
  1026. package/build/dist/Server/Services/AlertLabelRuleEngineService.js.map +1 -1
  1027. package/build/dist/Server/Services/AlertOwnerRuleEngineService.js +498 -354
  1028. package/build/dist/Server/Services/AlertOwnerRuleEngineService.js.map +1 -1
  1029. package/build/dist/Server/Services/AlertPrivacyRuleEngineService.js +97 -34
  1030. package/build/dist/Server/Services/AlertPrivacyRuleEngineService.js.map +1 -1
  1031. package/build/dist/Server/Services/AlertService.js +104 -39
  1032. package/build/dist/Server/Services/AlertService.js.map +1 -1
  1033. package/build/dist/Server/Services/AuditLogService.js +408 -44
  1034. package/build/dist/Server/Services/AuditLogService.js.map +1 -1
  1035. package/build/dist/Server/Services/BillingInvoiceService.js +94 -85
  1036. package/build/dist/Server/Services/BillingInvoiceService.js.map +1 -1
  1037. package/build/dist/Server/Services/BillingService.js +406 -14
  1038. package/build/dist/Server/Services/BillingService.js.map +1 -1
  1039. package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js +141 -92
  1040. package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js.map +1 -1
  1041. package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js +191 -99
  1042. package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js.map +1 -1
  1043. package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js +135 -86
  1044. package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js.map +1 -1
  1045. package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js +192 -99
  1046. package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js.map +1 -1
  1047. package/build/dist/Server/Services/DashboardLabelRuleEngineService.js +117 -69
  1048. package/build/dist/Server/Services/DashboardLabelRuleEngineService.js.map +1 -1
  1049. package/build/dist/Server/Services/DashboardOwnerRuleEngineService.js +173 -81
  1050. package/build/dist/Server/Services/DashboardOwnerRuleEngineService.js.map +1 -1
  1051. package/build/dist/Server/Services/DatabaseService.js +196 -19
  1052. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  1053. package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js +141 -92
  1054. package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js.map +1 -1
  1055. package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js +191 -99
  1056. package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js.map +1 -1
  1057. package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js +145 -91
  1058. package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js.map +1 -1
  1059. package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js +193 -99
  1060. package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js.map +1 -1
  1061. package/build/dist/Server/Services/HostLabelRuleEngineService.js +141 -92
  1062. package/build/dist/Server/Services/HostLabelRuleEngineService.js.map +1 -1
  1063. package/build/dist/Server/Services/HostOwnerRuleEngineService.js +193 -101
  1064. package/build/dist/Server/Services/HostOwnerRuleEngineService.js.map +1 -1
  1065. package/build/dist/Server/Services/IncidentEpisodeLabelRuleEngineService.js +112 -56
  1066. package/build/dist/Server/Services/IncidentEpisodeLabelRuleEngineService.js.map +1 -1
  1067. package/build/dist/Server/Services/IncidentEpisodeOwnerRuleEngineService.js +222 -63
  1068. package/build/dist/Server/Services/IncidentEpisodeOwnerRuleEngineService.js.map +1 -1
  1069. package/build/dist/Server/Services/IncidentEpisodePrivacyRuleEngineService.js +87 -26
  1070. package/build/dist/Server/Services/IncidentEpisodePrivacyRuleEngineService.js.map +1 -1
  1071. package/build/dist/Server/Services/IncidentEpisodePublicNoteService.js +24 -0
  1072. package/build/dist/Server/Services/IncidentEpisodePublicNoteService.js.map +1 -1
  1073. package/build/dist/Server/Services/IncidentEpisodeService.js +15 -68
  1074. package/build/dist/Server/Services/IncidentEpisodeService.js.map +1 -1
  1075. package/build/dist/Server/Services/IncidentGroupingEngineService.js +7 -4
  1076. package/build/dist/Server/Services/IncidentGroupingEngineService.js.map +1 -1
  1077. package/build/dist/Server/Services/IncidentLabelRuleEngineService.js +258 -192
  1078. package/build/dist/Server/Services/IncidentLabelRuleEngineService.js.map +1 -1
  1079. package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js +519 -376
  1080. package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js.map +1 -1
  1081. package/build/dist/Server/Services/IncidentPrivacyRuleEngineService.js +95 -32
  1082. package/build/dist/Server/Services/IncidentPrivacyRuleEngineService.js.map +1 -1
  1083. package/build/dist/Server/Services/IncidentPublicNoteService.js +24 -0
  1084. package/build/dist/Server/Services/IncidentPublicNoteService.js.map +1 -1
  1085. package/build/dist/Server/Services/IncidentService.js +103 -36
  1086. package/build/dist/Server/Services/IncidentService.js.map +1 -1
  1087. package/build/dist/Server/Services/IncidentTemplateService.js +13 -31
  1088. package/build/dist/Server/Services/IncidentTemplateService.js.map +1 -1
  1089. package/build/dist/Server/Services/IncomingCallPolicyLabelRuleEngineService.js +113 -65
  1090. package/build/dist/Server/Services/IncomingCallPolicyLabelRuleEngineService.js.map +1 -1
  1091. package/build/dist/Server/Services/IncomingCallPolicyOwnerRuleEngineService.js +173 -81
  1092. package/build/dist/Server/Services/IncomingCallPolicyOwnerRuleEngineService.js.map +1 -1
  1093. package/build/dist/Server/Services/Index.js +6 -4
  1094. package/build/dist/Server/Services/Index.js.map +1 -1
  1095. package/build/dist/Server/Services/IoTFleetLabelRuleEngineService.js +117 -69
  1096. package/build/dist/Server/Services/IoTFleetLabelRuleEngineService.js.map +1 -1
  1097. package/build/dist/Server/Services/IoTFleetOwnerRuleEngineService.js +173 -81
  1098. package/build/dist/Server/Services/IoTFleetOwnerRuleEngineService.js.map +1 -1
  1099. package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js +145 -91
  1100. package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js.map +1 -1
  1101. package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js +193 -99
  1102. package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js.map +1 -1
  1103. package/build/dist/Server/Services/LabelService.js +20 -25
  1104. package/build/dist/Server/Services/LabelService.js.map +1 -1
  1105. package/build/dist/Server/Services/MonitorLabelRuleEngineService.js +123 -77
  1106. package/build/dist/Server/Services/MonitorLabelRuleEngineService.js.map +1 -1
  1107. package/build/dist/Server/Services/MonitorOwnerRuleEngineService.js +167 -82
  1108. package/build/dist/Server/Services/MonitorOwnerRuleEngineService.js.map +1 -1
  1109. package/build/dist/Server/Services/MonitorProbeService.js +18 -2
  1110. package/build/dist/Server/Services/MonitorProbeService.js.map +1 -1
  1111. package/build/dist/Server/Services/MonitorService.js +24 -40
  1112. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  1113. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +287 -5
  1114. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
  1115. package/build/dist/Server/Services/NetworkDeviceDiagnosticService.js +333 -0
  1116. package/build/dist/Server/Services/NetworkDeviceDiagnosticService.js.map +1 -0
  1117. package/build/dist/Server/Services/NetworkDeviceLabelRuleEngineService.js +117 -69
  1118. package/build/dist/Server/Services/NetworkDeviceLabelRuleEngineService.js.map +1 -1
  1119. package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js +173 -81
  1120. package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js.map +1 -1
  1121. package/build/dist/Server/Services/NetworkDeviceService.js +36 -2
  1122. package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
  1123. package/build/dist/Server/Services/OnCallDutyPolicyLabelRuleEngineService.js +117 -64
  1124. package/build/dist/Server/Services/OnCallDutyPolicyLabelRuleEngineService.js.map +1 -1
  1125. package/build/dist/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.js +175 -81
  1126. package/build/dist/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.js.map +1 -1
  1127. package/build/dist/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.js +116 -65
  1128. package/build/dist/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.js.map +1 -1
  1129. package/build/dist/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.js +173 -81
  1130. package/build/dist/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.js.map +1 -1
  1131. package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js +141 -92
  1132. package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js.map +1 -1
  1133. package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js +191 -99
  1134. package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js.map +1 -1
  1135. package/build/dist/Server/Services/ProjectService.js +82 -10
  1136. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  1137. package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js +141 -92
  1138. package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js.map +1 -1
  1139. package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js +191 -99
  1140. package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js.map +1 -1
  1141. package/build/dist/Server/Services/RumApplicationLabelRuleEngineService.js +111 -63
  1142. package/build/dist/Server/Services/RumApplicationLabelRuleEngineService.js.map +1 -1
  1143. package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js +164 -76
  1144. package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js.map +1 -1
  1145. package/build/dist/Server/Services/RunbookLabelRuleEngineService.js +117 -69
  1146. package/build/dist/Server/Services/RunbookLabelRuleEngineService.js.map +1 -1
  1147. package/build/dist/Server/Services/RunbookOwnerRuleEngineService.js +173 -81
  1148. package/build/dist/Server/Services/RunbookOwnerRuleEngineService.js.map +1 -1
  1149. package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js +280 -209
  1150. package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js.map +1 -1
  1151. package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js +521 -376
  1152. package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js.map +1 -1
  1153. package/build/dist/Server/Services/ScheduledMaintenancePublicNoteService.js +24 -0
  1154. package/build/dist/Server/Services/ScheduledMaintenancePublicNoteService.js.map +1 -1
  1155. package/build/dist/Server/Services/ScheduledMaintenanceService.js +37 -39
  1156. package/build/dist/Server/Services/ScheduledMaintenanceService.js.map +1 -1
  1157. package/build/dist/Server/Services/ScheduledMaintenanceTemplateService.js +12 -29
  1158. package/build/dist/Server/Services/ScheduledMaintenanceTemplateService.js.map +1 -1
  1159. package/build/dist/Server/Services/SecurityEventConnectionService.js +43 -3
  1160. package/build/dist/Server/Services/SecurityEventConnectionService.js.map +1 -1
  1161. package/build/dist/Server/Services/ServerlessFunctionLabelRuleEngineService.js +115 -62
  1162. package/build/dist/Server/Services/ServerlessFunctionLabelRuleEngineService.js.map +1 -1
  1163. package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js +166 -76
  1164. package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js.map +1 -1
  1165. package/build/dist/Server/Services/ServiceLabelRuleEngineService.js +141 -92
  1166. package/build/dist/Server/Services/ServiceLabelRuleEngineService.js.map +1 -1
  1167. package/build/dist/Server/Services/ServiceLevelObjectiveBurnRateRuleService.js +769 -18
  1168. package/build/dist/Server/Services/ServiceLevelObjectiveBurnRateRuleService.js.map +1 -1
  1169. package/build/dist/Server/Services/ServiceLevelObjectiveFeedService.js +96 -0
  1170. package/build/dist/Server/Services/ServiceLevelObjectiveFeedService.js.map +1 -0
  1171. package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.js +614 -87
  1172. package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.js.map +1 -1
  1173. package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleService.js +844 -0
  1174. package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleService.js.map +1 -0
  1175. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerTeamService.js +207 -1
  1176. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerTeamService.js.map +1 -1
  1177. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerUserService.js +221 -1
  1178. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerUserService.js.map +1 -1
  1179. package/build/dist/Server/Services/ServiceLevelObjectiveService.js +997 -50
  1180. package/build/dist/Server/Services/ServiceLevelObjectiveService.js.map +1 -1
  1181. package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js +193 -100
  1182. package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js.map +1 -1
  1183. package/build/dist/Server/Services/StatusPageAnnouncementService.js +12 -0
  1184. package/build/dist/Server/Services/StatusPageAnnouncementService.js.map +1 -1
  1185. package/build/dist/Server/Services/StatusPageLabelRuleEngineService.js +118 -70
  1186. package/build/dist/Server/Services/StatusPageLabelRuleEngineService.js.map +1 -1
  1187. package/build/dist/Server/Services/StatusPageOwnerRuleEngineService.js +158 -76
  1188. package/build/dist/Server/Services/StatusPageOwnerRuleEngineService.js.map +1 -1
  1189. package/build/dist/Server/Services/StatusPagePrivateUserService.js +33 -25
  1190. package/build/dist/Server/Services/StatusPagePrivateUserService.js.map +1 -1
  1191. package/build/dist/Server/Services/StatusPagePrivateUserSessionService.js +36 -1
  1192. package/build/dist/Server/Services/StatusPagePrivateUserSessionService.js.map +1 -1
  1193. package/build/dist/Server/Services/StatusPageService.js +50 -35
  1194. package/build/dist/Server/Services/StatusPageService.js.map +1 -1
  1195. package/build/dist/Server/Services/StatusPageSubscriberNotificationTemplateService.js +19 -215
  1196. package/build/dist/Server/Services/StatusPageSubscriberNotificationTemplateService.js.map +1 -1
  1197. package/build/dist/Server/Services/StatusPageSubscriberService.js +6 -0
  1198. package/build/dist/Server/Services/StatusPageSubscriberService.js.map +1 -1
  1199. package/build/dist/Server/Services/TelemetryUsageBillingService.js +27 -5
  1200. package/build/dist/Server/Services/TelemetryUsageBillingService.js.map +1 -1
  1201. package/build/dist/Server/Services/ThreatIntelFeedService.js +1 -1
  1202. package/build/dist/Server/Services/UserSessionService.js +5 -0
  1203. package/build/dist/Server/Services/UserSessionService.js.map +1 -1
  1204. package/build/dist/Server/Services/VMwareVCenterLabelRuleEngineService.js +141 -92
  1205. package/build/dist/Server/Services/VMwareVCenterLabelRuleEngineService.js.map +1 -1
  1206. package/build/dist/Server/Services/VMwareVCenterOwnerRuleEngineService.js +191 -99
  1207. package/build/dist/Server/Services/VMwareVCenterOwnerRuleEngineService.js.map +1 -1
  1208. package/build/dist/Server/Services/WorkflowLabelRuleEngineService.js +117 -69
  1209. package/build/dist/Server/Services/WorkflowLabelRuleEngineService.js.map +1 -1
  1210. package/build/dist/Server/Services/WorkflowOwnerRuleEngineService.js +173 -81
  1211. package/build/dist/Server/Services/WorkflowOwnerRuleEngineService.js.map +1 -1
  1212. package/build/dist/Server/Types/Database/Permissions/OwnedScopePermission.js +15 -10
  1213. package/build/dist/Server/Types/Database/Permissions/OwnedScopePermission.js.map +1 -1
  1214. package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js +82 -0
  1215. package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js.map +1 -1
  1216. package/build/dist/Server/Utils/AI/AlertAIContextBuilder.js +17 -0
  1217. package/build/dist/Server/Utils/AI/AlertAIContextBuilder.js.map +1 -1
  1218. package/build/dist/Server/Utils/AI/Chat/ChatAgentRunner.js +12 -3
  1219. package/build/dist/Server/Utils/AI/Chat/ChatAgentRunner.js.map +1 -1
  1220. package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js +32 -4
  1221. package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js.map +1 -1
  1222. package/build/dist/Server/Utils/AI/CodeFix/CodeAgentWorkspaceGuard.js +1 -1
  1223. package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.js +1 -1
  1224. package/build/dist/Server/Utils/AI/IncidentAIContextBuilder.js +31 -0
  1225. package/build/dist/Server/Utils/AI/IncidentAIContextBuilder.js.map +1 -1
  1226. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js +8 -5
  1227. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -1
  1228. package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js +33 -13
  1229. package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js.map +1 -1
  1230. package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js +31 -10
  1231. package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js.map +1 -1
  1232. package/build/dist/Server/Utils/AI/SRE/InvestigationEligibility.js +205 -0
  1233. package/build/dist/Server/Utils/AI/SRE/InvestigationEligibility.js.map +1 -0
  1234. package/build/dist/Server/Utils/AI/SRE/InvestigationQueue.js +13 -0
  1235. package/build/dist/Server/Utils/AI/SRE/InvestigationQueue.js.map +1 -1
  1236. package/build/dist/Server/Utils/AI/Toolbox/AlertTools.js +24 -1
  1237. package/build/dist/Server/Utils/AI/Toolbox/AlertTools.js.map +1 -1
  1238. package/build/dist/Server/Utils/AI/Toolbox/IncidentTools.js +21 -1
  1239. package/build/dist/Server/Utils/AI/Toolbox/IncidentTools.js.map +1 -1
  1240. package/build/dist/Server/Utils/AI/Toolbox/Index.js +30 -6
  1241. package/build/dist/Server/Utils/AI/Toolbox/Index.js.map +1 -1
  1242. package/build/dist/Server/Utils/AI/Toolbox/ResourceTools.js +721 -0
  1243. package/build/dist/Server/Utils/AI/Toolbox/ResourceTools.js.map +1 -0
  1244. package/build/dist/Server/Utils/AI/Toolbox/RumTools.js +330 -0
  1245. package/build/dist/Server/Utils/AI/Toolbox/RumTools.js.map +1 -0
  1246. package/build/dist/Server/Utils/AI/Toolbox/SloTools.js +337 -53
  1247. package/build/dist/Server/Utils/AI/Toolbox/SloTools.js.map +1 -1
  1248. package/build/dist/Server/Utils/AI/Toolbox/ToolTypes.js.map +1 -1
  1249. package/build/dist/Server/Utils/AI/Toolbox/TraceTools.js +1 -1
  1250. package/build/dist/Server/Utils/AI/Toolbox/TraceTools.js.map +1 -1
  1251. package/build/dist/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.js +108 -15
  1252. package/build/dist/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.js.map +1 -1
  1253. package/build/dist/Server/Utils/Dashboard/PublicDashboardSloHistoryPolicy.js +2 -2
  1254. package/build/dist/Server/Utils/Dashboard/PublicDashboardSloHistoryPolicy.js.map +1 -1
  1255. package/build/dist/Server/Utils/Dashboard/PublicDashboardSloWidget.js +115 -6
  1256. package/build/dist/Server/Utils/Dashboard/PublicDashboardSloWidget.js.map +1 -1
  1257. package/build/dist/Server/Utils/Database/PostgresErrorTranslator.js +11 -0
  1258. package/build/dist/Server/Utils/Database/PostgresErrorTranslator.js.map +1 -1
  1259. package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js +13 -0
  1260. package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js.map +1 -1
  1261. package/build/dist/Server/Utils/Database/RelationValueUtil.js +82 -0
  1262. package/build/dist/Server/Utils/Database/RelationValueUtil.js.map +1 -0
  1263. package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js +115 -106
  1264. package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js.map +1 -1
  1265. package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js +17 -21
  1266. package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js.map +1 -1
  1267. package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js +4 -2
  1268. package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js.map +1 -1
  1269. package/build/dist/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.js +5 -4
  1270. package/build/dist/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.js.map +1 -1
  1271. package/build/dist/Server/Utils/Monitor/MonitorStepsProjectValidator.js +50 -10
  1272. package/build/dist/Server/Utils/Monitor/MonitorStepsProjectValidator.js.map +1 -1
  1273. package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js +13 -1
  1274. package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js.map +1 -1
  1275. package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js +6 -10
  1276. package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js.map +1 -1
  1277. package/build/dist/Server/Utils/Rules/MonitorRulePatternValidator.js +34 -0
  1278. package/build/dist/Server/Utils/Rules/MonitorRulePatternValidator.js.map +1 -0
  1279. package/build/dist/Server/Utils/Rules/OwnerRuleAssignment.js +163 -0
  1280. package/build/dist/Server/Utils/Rules/OwnerRuleAssignment.js.map +1 -0
  1281. package/build/dist/Server/Utils/Rules/RuleRun/RuleApplication.js +25 -0
  1282. package/build/dist/Server/Utils/Rules/RuleRun/RuleApplication.js.map +1 -0
  1283. package/build/dist/Server/Utils/Rules/RuleRun/RuleRunPermission.js +128 -0
  1284. package/build/dist/Server/Utils/Rules/RuleRun/RuleRunPermission.js.map +1 -0
  1285. package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js +746 -0
  1286. package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js.map +1 -0
  1287. package/build/dist/Server/Utils/Rules/RuleRun/RuleRunner.js +221 -0
  1288. package/build/dist/Server/Utils/Rules/RuleRun/RuleRunner.js.map +1 -0
  1289. package/build/dist/Server/Utils/SecurityEvent/ConnectorErrorMessage.js +3 -2
  1290. package/build/dist/Server/Utils/SecurityEvent/ConnectorErrorMessage.js.map +1 -1
  1291. package/build/dist/Server/Utils/SecurityEvent/Connectors/ConnectorPlatformHealth.js +6 -4
  1292. package/build/dist/Server/Utils/SecurityEvent/Connectors/ConnectorPlatformHealth.js.map +1 -1
  1293. package/build/dist/Server/Utils/SecurityEvent/{GoogleSecOps → Connectors/GoogleSecOps}/GoogleSecOpsClient.js +174 -14
  1294. package/build/dist/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsClient.js.map +1 -0
  1295. package/build/dist/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnector.js +1417 -0
  1296. package/build/dist/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnector.js.map +1 -0
  1297. package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionPoller.js +138 -18
  1298. package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionPoller.js.map +1 -1
  1299. package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionRunExecutor.js +1 -2
  1300. package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionRunExecutor.js.map +1 -1
  1301. package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionTester.js +23 -18
  1302. package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionTester.js.map +1 -1
  1303. package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectorRegistry.js +2 -0
  1304. package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectorRegistry.js.map +1 -1
  1305. package/build/dist/Server/Utils/SecurityEvent/Connectors/Types.js +95 -0
  1306. package/build/dist/Server/Utils/SecurityEvent/Connectors/Types.js.map +1 -1
  1307. package/build/dist/Server/Utils/SecurityEvent/DetectionRuleEvaluator.js +1 -1
  1308. package/build/dist/Server/Utils/SecurityEvent/SecurityEventDedupe.js +3 -3
  1309. package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.js +2 -2
  1310. package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js +118 -40
  1311. package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js.map +1 -1
  1312. package/build/dist/Server/Utils/Slo/SloFeedUtil.js +150 -0
  1313. package/build/dist/Server/Utils/Slo/SloFeedUtil.js.map +1 -0
  1314. package/build/dist/Server/Utils/Slo/SloLegacyMonitorLabelAdoption.js +136 -0
  1315. package/build/dist/Server/Utils/Slo/SloLegacyMonitorLabelAdoption.js.map +1 -0
  1316. package/build/dist/Server/Utils/Slo/SloMetricUtil.js +269 -0
  1317. package/build/dist/Server/Utils/Slo/SloMetricUtil.js.map +1 -0
  1318. package/build/dist/Server/Utils/Slo/SloOwnerReferenceValidator.js +134 -0
  1319. package/build/dist/Server/Utils/Slo/SloOwnerReferenceValidator.js.map +1 -0
  1320. package/build/dist/Server/Utils/Slo/SloRecordReferenceValidator.js +137 -0
  1321. package/build/dist/Server/Utils/Slo/SloRecordReferenceValidator.js.map +1 -0
  1322. package/build/dist/Server/Utils/StatusPage/MonitorRulePatternValidator.js +6 -26
  1323. package/build/dist/Server/Utils/StatusPage/MonitorRulePatternValidator.js.map +1 -1
  1324. package/build/dist/Server/Utils/StatusPageResource.js +31 -5
  1325. package/build/dist/Server/Utils/StatusPageResource.js.map +1 -1
  1326. package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js +171 -6
  1327. package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js.map +1 -1
  1328. package/build/dist/Types/AI/AIChatPageContext.js +68 -2
  1329. package/build/dist/Types/AI/AIChatPageContext.js.map +1 -1
  1330. package/build/dist/Types/AI/AIChatTypes.js +4 -0
  1331. package/build/dist/Types/AI/AIChatTypes.js.map +1 -1
  1332. package/build/dist/Types/AI/AIResourceContext.js +162 -0
  1333. package/build/dist/Types/AI/AIResourceContext.js.map +1 -0
  1334. package/build/dist/Types/AI/InvestigationNotStartedReason.js +2 -0
  1335. package/build/dist/Types/AI/InvestigationNotStartedReason.js.map +1 -0
  1336. package/build/dist/Types/Billing/SubscriptionStatus.js +37 -3
  1337. package/build/dist/Types/Billing/SubscriptionStatus.js.map +1 -1
  1338. package/build/dist/Types/Dashboard/DashboardComponentType.js +1 -0
  1339. package/build/dist/Types/Dashboard/DashboardComponentType.js.map +1 -1
  1340. package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js +5 -0
  1341. package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js.map +1 -1
  1342. package/build/dist/Types/Dashboard/DashboardComponents/DashboardSloListComponent.js +2 -0
  1343. package/build/dist/Types/Dashboard/DashboardComponents/DashboardSloListComponent.js.map +1 -0
  1344. package/build/dist/Types/Dashboard/DashboardTemplates.js +275 -286
  1345. package/build/dist/Types/Dashboard/DashboardTemplates.js.map +1 -1
  1346. package/build/dist/Types/Database/EnableAuditLog.js +19 -1
  1347. package/build/dist/Types/Database/EnableAuditLog.js.map +1 -1
  1348. package/build/dist/Types/Database/UniqueColumnsTogether.js +19 -0
  1349. package/build/dist/Types/Database/UniqueColumnsTogether.js.map +1 -0
  1350. package/build/dist/Types/Email/EmailTemplateType.js +4 -0
  1351. package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
  1352. package/build/dist/Types/Metrics/MetricQueryConfigData.js.map +1 -1
  1353. package/build/dist/Types/Monitor/CriteriaFilter.js +45 -6
  1354. package/build/dist/Types/Monitor/CriteriaFilter.js.map +1 -1
  1355. package/build/dist/Types/Monitor/MonitorStep.js +2 -0
  1356. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  1357. package/build/dist/Types/Monitor/MonitorStepDnsMonitor.js +3 -1
  1358. package/build/dist/Types/Monitor/MonitorStepDnsMonitor.js.map +1 -1
  1359. package/build/dist/Types/Monitor/MonitorStepDnssecMonitor.js +3 -1
  1360. package/build/dist/Types/Monitor/MonitorStepDnssecMonitor.js.map +1 -1
  1361. package/build/dist/Types/Monitor/MonitorStepDomainMonitor.js +3 -1
  1362. package/build/dist/Types/Monitor/MonitorStepDomainMonitor.js.map +1 -1
  1363. package/build/dist/Types/Monitor/MonitorStepExternalStatusPageMonitor.js +3 -1
  1364. package/build/dist/Types/Monitor/MonitorStepExternalStatusPageMonitor.js.map +1 -1
  1365. package/build/dist/Types/Monitor/MonitorStepRetries.js +47 -0
  1366. package/build/dist/Types/Monitor/MonitorStepRetries.js.map +1 -0
  1367. package/build/dist/Types/Monitor/MonitorStepSnmpMonitor.js +3 -1
  1368. package/build/dist/Types/Monitor/MonitorStepSnmpMonitor.js.map +1 -1
  1369. package/build/dist/Types/NetworkDevice/NetworkDeviceDiagnosticResult.js +29 -0
  1370. package/build/dist/Types/NetworkDevice/NetworkDeviceDiagnosticResult.js.map +1 -0
  1371. package/build/dist/Types/NetworkDevice/NetworkDeviceDiagnosticStatus.js +37 -0
  1372. package/build/dist/Types/NetworkDevice/NetworkDeviceDiagnosticStatus.js.map +1 -0
  1373. package/build/dist/Types/NetworkDevice/NetworkDeviceDiagnosticType.js +42 -0
  1374. package/build/dist/Types/NetworkDevice/NetworkDeviceDiagnosticType.js.map +1 -0
  1375. package/build/dist/Types/NetworkDevice/NetworkDevicePingMetricNames.js +20 -0
  1376. package/build/dist/Types/NetworkDevice/NetworkDevicePingMetricNames.js.map +1 -0
  1377. package/build/dist/Types/Permission.js +114 -0
  1378. package/build/dist/Types/Permission.js.map +1 -1
  1379. package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js +5 -0
  1380. package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js.map +1 -1
  1381. package/build/dist/Types/Rules/RuleRun.js +267 -0
  1382. package/build/dist/Types/Rules/RuleRun.js.map +1 -0
  1383. package/build/dist/Types/Rum/SessionReplayApi.js.map +1 -1
  1384. package/build/dist/Types/Rum/WebVitals.js +64 -0
  1385. package/build/dist/Types/Rum/WebVitals.js.map +1 -0
  1386. package/build/dist/Types/SecurityEvent/Connectors/ConnectorDiagnostics.js.map +1 -1
  1387. package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectionDiagnostics.js +16 -1
  1388. package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectionDiagnostics.js.map +1 -1
  1389. package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.js +65 -0
  1390. package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.js.map +1 -1
  1391. package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectorProvider.js +6 -2
  1392. package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectorProvider.js.map +1 -1
  1393. package/build/dist/Types/ServiceLevelObjective/SloHistoryMetricName.js +26 -0
  1394. package/build/dist/Types/ServiceLevelObjective/SloHistoryMetricName.js.map +1 -0
  1395. package/build/dist/Types/ServiceLevelObjective/SloMetricType.js +45 -0
  1396. package/build/dist/Types/ServiceLevelObjective/SloMetricType.js.map +1 -0
  1397. package/build/dist/Types/StatusPage/StatusPageSubscriberNotificationEventType.js +4 -0
  1398. package/build/dist/Types/StatusPage/StatusPageSubscriberNotificationEventType.js.map +1 -1
  1399. package/build/dist/Types/StatusPage/SubscriberNotificationTemplateVariables.js +295 -0
  1400. package/build/dist/Types/StatusPage/SubscriberNotificationTemplateVariables.js.map +1 -0
  1401. package/build/dist/Types/StatusPage/SubscriberNotificationTrigger.js +13 -0
  1402. package/build/dist/Types/StatusPage/SubscriberNotificationTrigger.js.map +1 -0
  1403. package/build/dist/Types/StatusPage/SubscriberUpdateNotification.js +67 -0
  1404. package/build/dist/Types/StatusPage/SubscriberUpdateNotification.js.map +1 -0
  1405. package/build/dist/Types/Telemetry/LockedFilterDetail.js +7 -7
  1406. package/build/dist/Types/Telemetry/ServiceType.js +7 -0
  1407. package/build/dist/Types/Telemetry/ServiceType.js.map +1 -1
  1408. package/build/dist/Types/WebsiteRequest.js +2 -0
  1409. package/build/dist/Types/WebsiteRequest.js.map +1 -1
  1410. package/build/dist/UI/Components/AlertBanner/AlertBanner.js +48 -19
  1411. package/build/dist/UI/Components/AlertBanner/AlertBanner.js.map +1 -1
  1412. package/build/dist/UI/Components/BulkUpdate/BulkArchiveActions.js +10 -2
  1413. package/build/dist/UI/Components/BulkUpdate/BulkArchiveActions.js.map +1 -1
  1414. package/build/dist/UI/Components/Detail/Detail.js +12 -3
  1415. package/build/dist/UI/Components/Detail/Detail.js.map +1 -1
  1416. package/build/dist/UI/Components/Dropdown/Dropdown.js +33 -5
  1417. package/build/dist/UI/Components/Dropdown/Dropdown.js.map +1 -1
  1418. package/build/dist/UI/Components/EditionLabel/EditionLabel.js +7 -5
  1419. package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
  1420. package/build/dist/UI/Components/EmptyState/EmptyState.js +3 -3
  1421. package/build/dist/UI/Components/EmptyState/EmptyState.js.map +1 -1
  1422. package/build/dist/UI/Components/EmptyState/EmptyStateGuideLinks.js +47 -0
  1423. package/build/dist/UI/Components/EmptyState/EmptyStateGuideLinks.js.map +1 -0
  1424. package/build/dist/UI/Components/Forms/ModelForm.js +6 -5
  1425. package/build/dist/UI/Components/Forms/ModelForm.js.map +1 -1
  1426. package/build/dist/UI/Components/LabelRule/LabelRuleTable.js +6 -2
  1427. package/build/dist/UI/Components/LabelRule/LabelRuleTable.js.map +1 -1
  1428. package/build/dist/UI/Components/LogsViewer/LogsViewer.js +1 -1
  1429. package/build/dist/UI/Components/LogsViewer/LogsViewer.js.map +1 -1
  1430. package/build/dist/UI/Components/LogsViewer/components/ActiveFilterChips.js +0 -2
  1431. package/build/dist/UI/Components/LogsViewer/components/ActiveFilterChips.js.map +1 -1
  1432. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +7 -0
  1433. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  1434. package/build/dist/UI/Components/MoreMenu/MoreMenu.js +3 -1
  1435. package/build/dist/UI/Components/MoreMenu/MoreMenu.js.map +1 -1
  1436. package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
  1437. package/build/dist/UI/Components/Navbar/NavBarMenuModal.js +4 -2
  1438. package/build/dist/UI/Components/Navbar/NavBarMenuModal.js.map +1 -1
  1439. package/build/dist/UI/Components/RuleRun/RuleDetailFields.js +226 -0
  1440. package/build/dist/UI/Components/RuleRun/RuleDetailFields.js.map +1 -0
  1441. package/build/dist/UI/Components/RuleRun/RuleTable.js +97 -0
  1442. package/build/dist/UI/Components/RuleRun/RuleTable.js.map +1 -0
  1443. package/build/dist/UI/Components/RuleRun/RuleView.js +83 -0
  1444. package/build/dist/UI/Components/RuleRun/RuleView.js.map +1 -0
  1445. package/build/dist/UI/Components/RuleRun/RunRuleNowModal.js +74 -0
  1446. package/build/dist/UI/Components/RuleRun/RunRuleNowModal.js.map +1 -0
  1447. package/build/dist/UI/Components/RuleRun/RunRulesBulkAction.js +78 -0
  1448. package/build/dist/UI/Components/RuleRun/RunRulesBulkAction.js.map +1 -0
  1449. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js +1 -1
  1450. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js.map +1 -1
  1451. package/build/dist/UI/Components/TelemetryViewer/components/LockedFilterChip.js +24 -50
  1452. package/build/dist/UI/Components/TelemetryViewer/components/LockedFilterChip.js.map +1 -1
  1453. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryActiveFilterChips.js +0 -4
  1454. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryActiveFilterChips.js.map +1 -1
  1455. package/build/dist/UI/Utils/Rules/RuleRunClient.js +98 -0
  1456. package/build/dist/UI/Utils/Rules/RuleRunClient.js.map +1 -0
  1457. package/build/dist/UI/Utils/Telemetry/TelemetryEntityNames.js +8 -0
  1458. package/build/dist/UI/Utils/Telemetry/TelemetryEntityNames.js.map +1 -1
  1459. package/build/dist/Utils/API.js +8 -4
  1460. package/build/dist/Utils/API.js.map +1 -1
  1461. package/build/dist/Utils/Dashboard/Components/DashboardSloComponent.js +16 -2
  1462. package/build/dist/Utils/Dashboard/Components/DashboardSloComponent.js.map +1 -1
  1463. package/build/dist/Utils/Dashboard/Components/DashboardSloListComponent.js +94 -0
  1464. package/build/dist/Utils/Dashboard/Components/DashboardSloListComponent.js.map +1 -0
  1465. package/build/dist/Utils/Dashboard/Components/Index.js +4 -0
  1466. package/build/dist/Utils/Dashboard/Components/Index.js.map +1 -1
  1467. package/build/dist/Utils/Dashboard/SloWidgetSource.js +125 -0
  1468. package/build/dist/Utils/Dashboard/SloWidgetSource.js.map +1 -0
  1469. package/build/dist/Utils/HTTPResponseBodyReader.js +50 -6
  1470. package/build/dist/Utils/HTTPResponseBodyReader.js.map +1 -1
  1471. package/build/dist/Utils/Markdown/MarkdownEscape.js +49 -0
  1472. package/build/dist/Utils/Markdown/MarkdownEscape.js.map +1 -0
  1473. package/build/dist/Utils/Metrics/MetricExplorerUrl.js +14 -3
  1474. package/build/dist/Utils/Metrics/MetricExplorerUrl.js.map +1 -1
  1475. package/build/dist/Utils/Monitor/MonitorTestAvailabilityUtil.js +68 -0
  1476. package/build/dist/Utils/Monitor/MonitorTestAvailabilityUtil.js.map +1 -0
  1477. package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js +112 -34
  1478. package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js.map +1 -1
  1479. package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js +22 -0
  1480. package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js.map +1 -1
  1481. package/build/dist/Utils/NetworkDiscovery/NetbiosNameUtil.js +129 -0
  1482. package/build/dist/Utils/NetworkDiscovery/NetbiosNameUtil.js.map +1 -0
  1483. package/build/dist/Utils/NetworkDiscovery/RunImportedDeviceNaming.js +255 -0
  1484. package/build/dist/Utils/NetworkDiscovery/RunImportedDeviceNaming.js.map +1 -0
  1485. package/build/dist/Utils/NetworkDiscovery/ShortDeviceNamePlanner.js +184 -0
  1486. package/build/dist/Utils/NetworkDiscovery/ShortDeviceNamePlanner.js.map +1 -0
  1487. package/build/dist/Utils/NetworkDiscovery/ShortHostnameUtil.js +79 -0
  1488. package/build/dist/Utils/NetworkDiscovery/ShortHostnameUtil.js.map +1 -0
  1489. package/build/dist/Utils/NetworkSite/CidrMatchUtil.js +21 -12
  1490. package/build/dist/Utils/NetworkSite/CidrMatchUtil.js.map +1 -1
  1491. package/build/dist/Utils/Project/DataResidency.js +51 -0
  1492. package/build/dist/Utils/Project/DataResidency.js.map +1 -0
  1493. package/build/dist/Utils/Rules/RuleRunSummary.js +197 -0
  1494. package/build/dist/Utils/Rules/RuleRunSummary.js.map +1 -0
  1495. package/build/dist/Utils/Slo/SloAffectedResourceMarkdown.js +51 -0
  1496. package/build/dist/Utils/Slo/SloAffectedResourceMarkdown.js.map +1 -0
  1497. package/build/dist/Utils/Slo/SloBurnRateTemplate.js +228 -0
  1498. package/build/dist/Utils/Slo/SloBurnRateTemplate.js.map +1 -0
  1499. package/build/dist/Utils/Slo/SloFeedMarkdown.js +934 -0
  1500. package/build/dist/Utils/Slo/SloFeedMarkdown.js.map +1 -0
  1501. package/build/dist/Utils/Slo/SloHealth.js +75 -9
  1502. package/build/dist/Utils/Slo/SloHealth.js.map +1 -1
  1503. package/build/dist/Utils/Slo/SloListWidgetFormat.js +217 -0
  1504. package/build/dist/Utils/Slo/SloListWidgetFormat.js.map +1 -0
  1505. package/build/dist/Utils/Slo/SloMetricType.js +212 -0
  1506. package/build/dist/Utils/Slo/SloMetricType.js.map +1 -0
  1507. package/build/dist/Utils/Slo/SloMonitorRuleCriteria.js +216 -0
  1508. package/build/dist/Utils/Slo/SloMonitorRuleCriteria.js.map +1 -0
  1509. package/build/dist/Utils/Slo/SloMonitorStatusSummary.js +129 -0
  1510. package/build/dist/Utils/Slo/SloMonitorStatusSummary.js.map +1 -0
  1511. package/build/dist/Utils/Slo/SloOverviewText.js +110 -0
  1512. package/build/dist/Utils/Slo/SloOverviewText.js.map +1 -0
  1513. package/build/dist/Utils/Slo/SloProjection.js +448 -0
  1514. package/build/dist/Utils/Slo/SloProjection.js.map +1 -0
  1515. package/build/dist/Utils/Slo/SloWidgetFormat.js +4 -2
  1516. package/build/dist/Utils/Slo/SloWidgetFormat.js.map +1 -1
  1517. package/build/dist/Utils/Telemetry/HostIpAddresses.js +42 -3
  1518. package/build/dist/Utils/Telemetry/HostIpAddresses.js.map +1 -1
  1519. package/build/dist/Utils/Telemetry/LockedFilterSearch.js +1 -26
  1520. package/build/dist/Utils/Telemetry/LockedFilterSearch.js.map +1 -1
  1521. package/package.json +5 -5
  1522. package/test-setup.sh +2 -2
  1523. package/Models/DatabaseModels/GoogleSecOpsConnection.ts +0 -447
  1524. package/Models/DatabaseModels/GoogleSecOpsConnectionRun.ts +0 -263
  1525. package/Server/API/GoogleSecOpsConnectionAPI.ts +0 -320
  1526. package/Server/Services/GoogleSecOpsConnectionRunService.ts +0 -10
  1527. package/Server/Services/GoogleSecOpsConnectionService.ts +0 -116
  1528. package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsConnectionTester.ts +0 -777
  1529. package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.ts +0 -1373
  1530. package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.ts +0 -512
  1531. package/Tests/App/Dashboard/GoogleSecOpsConnectionForm.test.tsx +0 -838
  1532. package/Tests/App/Dashboard/GoogleSecOpsConnectionsErrors.test.tsx +0 -441
  1533. package/Tests/App/Dashboard/GoogleSecOpsDiagnostics.test.tsx +0 -1001
  1534. package/Tests/Server/API/GoogleSecOpsConnectionAPI.test.ts +0 -657
  1535. package/Tests/Server/Services/GoogleSecOpsDiagnosticsModel.test.ts +0 -153
  1536. package/Tests/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsConnectionTester.test.ts +0 -784
  1537. package/Tests/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.test.ts +0 -823
  1538. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsDiagnostics.test.ts +0 -918
  1539. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPoller.test.ts +0 -738
  1540. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPollerFailureTaxonomy.test.ts +0 -874
  1541. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPollerHardening.test.ts +0 -1297
  1542. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsThreePassPoller.test.ts +0 -1577
  1543. package/Tests/UI/Components/LockedFilterActions.test.tsx +0 -396
  1544. package/Types/SecurityEvent/GoogleSecOpsDiagnostics.ts +0 -111
  1545. package/UI/Components/TelemetryViewer/components/LockedFilterActions.tsx +0 -205
  1546. package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js +0 -478
  1547. package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js.map +0 -1
  1548. package/build/dist/Models/DatabaseModels/GoogleSecOpsConnectionRun.js +0 -287
  1549. package/build/dist/Models/DatabaseModels/GoogleSecOpsConnectionRun.js.map +0 -1
  1550. package/build/dist/Server/API/GoogleSecOpsConnectionAPI.js +0 -231
  1551. package/build/dist/Server/API/GoogleSecOpsConnectionAPI.js.map +0 -1
  1552. package/build/dist/Server/Services/GoogleSecOpsConnectionRunService.js +0 -9
  1553. package/build/dist/Server/Services/GoogleSecOpsConnectionRunService.js.map +0 -1
  1554. package/build/dist/Server/Services/GoogleSecOpsConnectionService.js +0 -70
  1555. package/build/dist/Server/Services/GoogleSecOpsConnectionService.js.map +0 -1
  1556. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient.js.map +0 -1
  1557. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsConnectionTester.js +0 -537
  1558. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsConnectionTester.js.map +0 -1
  1559. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js +0 -1034
  1560. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js.map +0 -1
  1561. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.js +0 -410
  1562. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.js.map +0 -1
  1563. package/build/dist/Types/SecurityEvent/GoogleSecOpsDiagnostics.js +0 -2
  1564. package/build/dist/Types/SecurityEvent/GoogleSecOpsDiagnostics.js.map +0 -1
  1565. package/build/dist/UI/Components/TelemetryViewer/components/LockedFilterActions.js +0 -88
  1566. package/build/dist/UI/Components/TelemetryViewer/components/LockedFilterActions.js.map +0 -1
@@ -79,13 +79,16 @@ jest.mock("../../../UI/Components/Markdown.tsx/LazyMarkdownViewer", () => {
79
79
  });
80
80
 
81
81
  /*
82
- * The feed owns the "will this draw any steps?" predicate, because several
83
- * event types only close a step an earlier event opened. The panel asks it
84
- * instead of counting raw events, so the mock has to answer too — and
85
- * hasRenderableActivityMock lets a test make the two disagree, which is the
86
- * case that used to render an empty framed box.
82
+ * The feed owns "how many steps will this draw?", because several event
83
+ * types only close a step an earlier event opened. The panel and its run
84
+ * details ask it instead of counting raw events, so the mock has to answer
85
+ * too. countActivityStepsMock lets a test make events and steps disagree
86
+ * the case that used to frame an empty box — and hasRenderableActivityMock
87
+ * follows it by default, exactly as the real predicate does, so the two
88
+ * exports can never contradict each other unless a test says so.
87
89
  */
88
90
  const hasRenderableActivityMock: MockFunction = getJestMockFunction();
91
+ const countActivityStepsMock: MockFunction = getJestMockFunction();
89
92
 
90
93
  // Evidence rows render through the chat widgets; their output is not under test.
91
94
  jest.mock(
@@ -115,6 +118,9 @@ jest.mock(
115
118
  hasRenderableActivity: (events: Array<AIRunEvent>): boolean => {
116
119
  return hasRenderableActivityMock(events) as boolean;
117
120
  },
121
+ countActivitySteps: (events: Array<AIRunEvent>): number => {
122
+ return countActivityStepsMock(events) as number;
123
+ },
118
124
  };
119
125
  },
120
126
  );
@@ -126,6 +132,7 @@ import AIRunEvent from "../../../Models/DatabaseModels/AIRunEvent";
126
132
  import HTTPErrorResponse from "../../../Types/API/HTTPErrorResponse";
127
133
  import AIRunCodeFixRecommendation from "../../../Types/AI/AIRunCodeFixRecommendation";
128
134
  import AIRunEventType from "../../../Types/AI/AIRunEventType";
135
+ import AIRunHumanVerdict from "../../../Types/AI/AIRunHumanVerdict";
129
136
  import AIRunStatus from "../../../Types/AI/AIRunStatus";
130
137
  import { JSONArray, JSONObject } from "../../../Types/JSON";
131
138
  import ObjectID from "../../../Types/ObjectID";
@@ -301,6 +308,7 @@ function renderPanel(data?: {
301
308
  onAnalysisAvailable?: (() => void) | undefined;
302
309
  onStatusChange?: ((status: AIRunStatus | null) => void) | undefined;
303
310
  onReportSummaryChange?: ((summary: string | null) => void) | undefined;
311
+ onVerdictChange?: ((verdict: AIRunHumanVerdict | null) => void) | undefined;
304
312
  }): ReturnType<typeof render> {
305
313
  return render(
306
314
  <InvestigationPanel
@@ -309,6 +317,7 @@ function renderPanel(data?: {
309
317
  onAnalysisAvailable={data?.onAnalysisAvailable}
310
318
  onStatusChange={data?.onStatusChange}
311
319
  onReportSummaryChange={data?.onReportSummaryChange}
320
+ onVerdictChange={data?.onVerdictChange}
312
321
  />,
313
322
  );
314
323
  }
@@ -372,17 +381,59 @@ function lastActivityProps(): ActivityFeedProps {
372
381
  return calls[calls.length - 1]![0]!;
373
382
  }
374
383
 
384
+ /*
385
+ * A completed run ends with one collapsed section holding its evidence, its
386
+ * activity and what it cost. Its body stays mounted while collapsed, so the
387
+ * role queries below (which skip hidden content) only find what a reader
388
+ * could actually reach; tests open the section before reaching inside it.
389
+ */
390
+ function runDetails(): HTMLElement {
391
+ return screen.getByTestId("investigation-details");
392
+ }
393
+
394
+ function detailsToggle(): HTMLElement {
395
+ return screen.getByTestId("investigation-details-toggle");
396
+ }
397
+
398
+ function detailsBody(): HTMLElement {
399
+ const bodyId: string | null = detailsToggle().getAttribute("aria-controls");
400
+ expect(bodyId).toBeTruthy();
401
+ return document.getElementById(bodyId!)!;
402
+ }
403
+
404
+ function openDetails(): void {
405
+ expect(detailsToggle()).toHaveAttribute("aria-expanded", "false");
406
+ fireEvent.click(detailsToggle());
407
+ expect(detailsToggle()).toHaveAttribute("aria-expanded", "true");
408
+ }
409
+
410
+ function detailsTab(name: RegExp): HTMLElement {
411
+ return within(
412
+ screen.getByRole("tablist", { name: "Investigation details" }),
413
+ ).getByRole("tab", { name });
414
+ }
415
+
416
+ function evidenceList(): HTMLElement {
417
+ return screen.getByRole("list", { name: "Evidence checked" });
418
+ }
419
+
375
420
  beforeEach(() => {
376
421
  jest.useFakeTimers();
377
422
  jest.setSystemTime(new Date(COMPLETED_AT));
378
423
  getCommonHeadersMock.mockReturnValue({});
379
424
  /*
380
425
  * Default to the real component's behaviour for the ordinary event shapes
381
- * these tests use: every step-opening event draws a step.
426
+ * these tests use: every step-opening event draws a step, and there is
427
+ * activity to render exactly when at least one step is drawn.
382
428
  */
429
+ countActivityStepsMock.mockImplementation(
430
+ (events: Array<AIRunEvent>): number => {
431
+ return events.length;
432
+ },
433
+ );
383
434
  hasRenderableActivityMock.mockImplementation(
384
435
  (events: Array<AIRunEvent>): boolean => {
385
- return events.length > 0;
436
+ return (countActivityStepsMock(events) as number) > 0;
386
437
  },
387
438
  );
388
439
  getFriendlyMessageMock.mockImplementation((error: unknown): string => {
@@ -409,17 +460,20 @@ afterEach(() => {
409
460
  markdownViewerMock.mockReset();
410
461
  activityFeedMock.mockReset();
411
462
  hasRenderableActivityMock.mockReset();
463
+ countActivityStepsMock.mockReset();
412
464
  widgetRendererMock.mockReset();
413
465
  });
414
466
 
415
467
  describe("InvestigationPanel report lifecycle", () => {
416
- test("renders nothing and briefly discovers a run when none exists yet", async () => {
468
+ test("explains a missing run and briefly checks whether one appears", async () => {
417
469
  postMock.mockResolvedValue(noInvestigationResponse() as never);
418
470
 
419
- const { container } = renderPanel();
471
+ renderPanel();
420
472
  await flush();
421
473
 
422
- expect(container).toBeEmptyDOMElement();
474
+ expect(
475
+ screen.getByText("No investigation has been recorded"),
476
+ ).toBeVisible();
423
477
  expect(jest.getTimerCount()).toBe(1);
424
478
 
425
479
  await advanceFastPolls(4);
@@ -459,7 +513,7 @@ describe("InvestigationPanel report lifecycle", () => {
459
513
  expect(getCommonHeadersMock).toHaveBeenCalledTimes(1);
460
514
  });
461
515
 
462
- test("renders the completed report safely and demotes activity to a disclosure", async () => {
516
+ test("renders the completed report safely and folds its activity into a collapsed section", async () => {
463
517
  const onAnalysisAvailable: MockFunction = getJestMockFunction();
464
518
  postMock.mockResolvedValue(completedResponse() as never);
465
519
 
@@ -487,21 +541,29 @@ describe("InvestigationPanel report lifecycle", () => {
487
541
  expect(
488
542
  screen.getByRole("heading", { level: 4, name: "Root cause" }),
489
543
  ).toBeInTheDocument();
490
- expect(screen.getByText("Investigation activity")).toBeInTheDocument();
544
+ /*
545
+ * This report carries no evidence, so the section is only the activity
546
+ * and is named for it. It starts collapsed: the report is the answer.
547
+ */
548
+ expect(detailsToggle()).toHaveTextContent("Investigation activity");
549
+ expect(detailsToggle()).toHaveAttribute("aria-expanded", "false");
550
+ expect(detailsBody()).not.toBeVisible();
491
551
  expect(lastActivityProps()).toEqual(
492
552
  expect.objectContaining({
493
553
  hideChrome: true,
494
554
  showLiveIndicator: false,
495
- maxVisibleSteps: 10,
496
555
  }),
497
556
  );
498
557
 
499
558
  const usage: HTMLElement = screen.getByLabelText("Investigation usage");
559
+ expect(usage).toBeVisible();
500
560
  expect(usage).toHaveTextContent("2 telemetry queries");
501
- expect(usage).toHaveTextContent("1,234 tokens");
502
561
  expect(usage).toHaveTextContent(
503
562
  "Read-only — nothing in your systems was changed",
504
563
  );
564
+ expect(screen.getByLabelText("Model and tokens")).toHaveTextContent(
565
+ "1,234 tokens",
566
+ );
505
567
  expect(fixButton()).toBeEnabled();
506
568
  expect(screen.getByRole("button", { name: "Confirmed" })).toBeEnabled();
507
569
  expect(screen.getByRole("button", { name: "Rejected" })).toBeEnabled();
@@ -531,6 +593,8 @@ describe("InvestigationPanel report lifecycle", () => {
531
593
  expect(screen.getByText("Preparing investigation report…")).toBeVisible();
532
594
  expect(screen.getByText("Preparing the final report")).toBeVisible();
533
595
  expect(screen.queryByTestId("investigation-markdown")).toBeNull();
596
+ // The steps can already be checked while the report is being written.
597
+ expect(detailsToggle()).toHaveTextContent("Investigation activity");
534
598
  expect(onAnalysisAvailable).not.toHaveBeenCalled();
535
599
 
536
600
  /* Status, run id, events and recommendation remain identical. */
@@ -644,7 +708,8 @@ describe("InvestigationPanel report lifecycle", () => {
644
708
  );
645
709
  await flush();
646
710
 
647
- expect(view.container).toBeEmptyDOMElement();
711
+ expect(screen.getByText("Checking investigation status…")).toBeVisible();
712
+ expect(screen.queryByTestId("investigation-markdown")).toBeNull();
648
713
  expect(onAnalysisAvailable).not.toHaveBeenCalled();
649
714
 
650
715
  await resolveDeferred(
@@ -678,6 +743,19 @@ describe("InvestigationPanel report lifecycle", () => {
678
743
  expect(
679
744
  screen.getByText("No investigation report was published."),
680
745
  ).toBeVisible();
746
+ /*
747
+ * No steps were recorded, so the notice does not point at an activity
748
+ * section that is not there, and there is nothing to expand: the run's
749
+ * usage is all that is left to say.
750
+ */
751
+ expect(
752
+ screen.getByText("The run finished without a final analysis."),
753
+ ).toBeVisible();
754
+ expect(screen.queryByText(/Investigation activity/)).toBeNull();
755
+ expect(screen.queryByTestId("investigation-details-toggle")).toBeNull();
756
+ expect(screen.getByLabelText("Investigation usage")).toHaveTextContent(
757
+ "0 telemetry queries",
758
+ );
681
759
  expect(fixButton()).toBeDisabled();
682
760
  expect(screen.getByRole("button", { name: "Confirmed" })).toBeDisabled();
683
761
  expect(screen.getByRole("button", { name: "Rejected" })).toBeDisabled();
@@ -771,14 +849,16 @@ describe("InvestigationPanel card states", () => {
771
849
  expect(screen.getByText("Starting investigation…")).toBeVisible();
772
850
  });
773
851
 
774
- test("puts a copy control on the report so it can be pasted elsewhere", async () => {
852
+ test("puts a copy control and a verify-first note on the report", async () => {
775
853
  postMock.mockResolvedValue(completedResponse() as never);
776
854
 
777
855
  renderPanel();
778
856
  await flush();
779
857
 
780
858
  const report: HTMLElement = screen.getByLabelText("Investigation report");
781
- expect(report).toHaveTextContent("AI generated");
859
+ expect(report).toHaveTextContent(
860
+ "AI-generated first pass — verify before acting.",
861
+ );
782
862
  expect(report).toContainElement(
783
863
  screen.getByRole("button", { name: "Copy report" }),
784
864
  );
@@ -813,6 +893,45 @@ describe("InvestigationPanel card states", () => {
813
893
  },
814
894
  );
815
895
 
896
+ /*
897
+ * A failed run has no report and no collapsed details, so what it ran and
898
+ * the read-only guarantee close its own activity frame instead — a reader
899
+ * deciding whether a half-finished run touched anything finds the answer
900
+ * right under the steps it took.
901
+ */
902
+ test("ends a failed run's activity with what it ran and that it changed nothing", async () => {
903
+ postMock.mockResolvedValue(
904
+ successfulResponse(
905
+ investigationPayload({
906
+ status: AIRunStatus.Error,
907
+ errorMessage: "The model provider timed out.",
908
+ events: [activityEvent],
909
+ toolCallCount: 3,
910
+ totalTokens: 900,
911
+ }),
912
+ ) as never,
913
+ );
914
+
915
+ renderPanel();
916
+ await flush();
917
+
918
+ const activity: HTMLElement = screen.getByRole("region", {
919
+ name: "Investigation activity",
920
+ });
921
+ const usage: HTMLElement = within(activity).getByRole("list", {
922
+ name: "Investigation usage",
923
+ });
924
+ expect(activity.lastElementChild).toBe(usage);
925
+ expect(usage).toBeVisible();
926
+ expect(usage).toHaveTextContent("3 telemetry queries");
927
+ expect(usage).toHaveTextContent("900 tokens");
928
+ expect(usage).toHaveTextContent(
929
+ "Read-only — nothing in your systems was changed",
930
+ );
931
+ expect(screen.queryByTestId("investigation-details")).toBeNull();
932
+ expect(screen.getAllByLabelText("Investigation usage")).toHaveLength(1);
933
+ });
934
+
816
935
  /*
817
936
  * Events and rendered steps are not the same thing: RunFailed and the
818
937
  * completion halves of tool/LLM calls only close a step an earlier event
@@ -821,7 +940,7 @@ describe("InvestigationPanel card states", () => {
821
940
  * an empty panel instead of saying what happened.
822
941
  */
823
942
  test("explains an empty trail instead of framing a blank panel", async () => {
824
- hasRenderableActivityMock.mockReturnValue(false);
943
+ countActivityStepsMock.mockReturnValue(0);
825
944
  postMock.mockResolvedValue(
826
945
  successfulResponse(
827
946
  investigationPayload({
@@ -841,8 +960,14 @@ describe("InvestigationPanel card states", () => {
841
960
  ).toBeVisible();
842
961
  });
843
962
 
844
- test("hides the completed activity disclosure when no step would render", async () => {
845
- hasRenderableActivityMock.mockReturnValue(false);
963
+ /*
964
+ * The same event/step mismatch on a completed run: with no evidence and no
965
+ * step to draw, a collapsed section would open onto nothing. The run's
966
+ * usage is all there is, so it stands alone — tokens included, since there
967
+ * is no body to hold them.
968
+ */
969
+ test("offers nothing to expand when a completed run has no evidence and no step would render", async () => {
970
+ countActivityStepsMock.mockReturnValue(0);
846
971
  postMock.mockResolvedValue(completedResponse() as never);
847
972
 
848
973
  renderPanel();
@@ -850,9 +975,17 @@ describe("InvestigationPanel card states", () => {
850
975
 
851
976
  expect(screen.getByLabelText("Investigation report")).toBeInTheDocument();
852
977
  expect(screen.queryByText("Investigation activity")).toBeNull();
978
+ expect(screen.queryByTestId("investigation-details-toggle")).toBeNull();
979
+ expect(screen.queryByTestId("investigation-activity")).toBeNull();
980
+
981
+ const usage: HTMLElement = screen.getByLabelText("Investigation usage");
982
+ expect(usage).toBeVisible();
983
+ expect(usage).toHaveTextContent("2 telemetry queries");
984
+ expect(usage).toHaveTextContent("1,234 tokens");
985
+ expect(usage).not.toHaveTextContent("step");
853
986
  });
854
987
 
855
- test("reports a single query without pluralising it", async () => {
988
+ test("reports a single query and step without pluralising them", async () => {
856
989
  postMock.mockResolvedValue(
857
990
  completedResponse({ toolCallCount: 1, totalTokens: 0 }) as never,
858
991
  );
@@ -862,8 +995,50 @@ describe("InvestigationPanel card states", () => {
862
995
 
863
996
  const usage: HTMLElement = screen.getByLabelText("Investigation usage");
864
997
  expect(usage).toHaveTextContent("1 telemetry query");
998
+ expect(usage).not.toHaveTextContent("queries");
999
+ expect(usage).toHaveTextContent("1 step");
1000
+ expect(usage).not.toHaveTextContent("steps");
865
1001
  expect(usage).not.toHaveTextContent("tokens");
866
1002
  });
1003
+
1004
+ /*
1005
+ * The no-report notice used to send every reader to "the activity below",
1006
+ * even when no step had been recorded and there was nothing below to read.
1007
+ */
1008
+ test("points the no-report notice at the activity only when there is some", async () => {
1009
+ postMock.mockResolvedValue(
1010
+ completedResponse({
1011
+ analysisMarkdown: null,
1012
+ isAnalysisPending: false,
1013
+ }) as never,
1014
+ );
1015
+
1016
+ renderPanel();
1017
+ await flush();
1018
+
1019
+ expect(
1020
+ screen.getByText(
1021
+ "The run finished without a final analysis. Its steps are under Investigation activity below.",
1022
+ ),
1023
+ ).toBeVisible();
1024
+
1025
+ /*
1026
+ * Evidence only exists beside a report, so the section is the activity
1027
+ * alone: named for it, and without tabs once opened.
1028
+ */
1029
+ expect(detailsToggle()).toHaveTextContent("Investigation activity");
1030
+ expect(detailsToggle()).not.toHaveTextContent("Evidence");
1031
+ expect(screen.getByLabelText("Investigation usage")).toHaveTextContent(
1032
+ "2 telemetry queries",
1033
+ );
1034
+
1035
+ openDetails();
1036
+
1037
+ expect(screen.queryByRole("tablist")).toBeNull();
1038
+ expect(screen.queryByRole("tabpanel")).toBeNull();
1039
+ expect(screen.queryByLabelText("Evidence checked")).toBeNull();
1040
+ expect(screen.getByTestId("investigation-activity")).toBeVisible();
1041
+ });
867
1042
  });
868
1043
 
869
1044
  /*
@@ -1956,18 +2131,25 @@ describe("InvestigationPanel structured report", () => {
1956
2131
  renderPanel();
1957
2132
  await flush();
1958
2133
 
1959
- const evidence: HTMLElement = screen.getByRole("region", {
1960
- name: "Evidence checked",
1961
- });
1962
- expect(within(evidence).getByText("2 queries")).toBeVisible();
1963
- expect(
1964
- within(evidence).getByRole("button", { name: /Active incidents/ }),
1965
- ).toHaveAttribute("aria-expanded", "false");
1966
2134
  expect(
1967
2135
  screen
1968
2136
  .getByLabelText("Investigation report")
1969
- .compareDocumentPosition(evidence) & Node.DOCUMENT_POSITION_FOLLOWING,
2137
+ .compareDocumentPosition(runDetails()) &
2138
+ Node.DOCUMENT_POSITION_FOLLOWING,
1970
2139
  ).toBeTruthy();
2140
+
2141
+ openDetails();
2142
+
2143
+ // The tab carries the query count the old list header used to show.
2144
+ expect(detailsTab(/^Evidence checked/)).toHaveTextContent(
2145
+ "Evidence checked2",
2146
+ );
2147
+ const evidence: HTMLElement = evidenceList();
2148
+ expect(runDetails()).toContainElement(evidence);
2149
+ expect(within(evidence).getAllByRole("listitem")).toHaveLength(2);
2150
+ expect(
2151
+ within(evidence).getByRole("button", { name: /Active incidents/ }),
2152
+ ).toHaveAttribute("aria-expanded", "false");
1971
2153
  // Rendering evidence never re-runs anything by itself.
1972
2154
  expect(evidencePosts()).toHaveLength(0);
1973
2155
  expect(jest.getTimerCount()).toBe(1);
@@ -1987,6 +2169,7 @@ describe("InvestigationPanel structured report", () => {
1987
2169
 
1988
2170
  renderPanel();
1989
2171
  await flush();
2172
+ openDetails();
1990
2173
 
1991
2174
  const toggle: HTMLElement = screen.getByRole("button", {
1992
2175
  name: /Active incidents \(7 total\)/,
@@ -2019,10 +2202,12 @@ describe("InvestigationPanel structured report", () => {
2019
2202
 
2020
2203
  renderPanel();
2021
2204
  await flush();
2205
+ openDetails();
2022
2206
 
2023
- const evidence: HTMLElement = screen.getByRole("region", {
2024
- name: "Evidence checked",
2025
- });
2207
+ const evidence: HTMLElement = evidenceList();
2208
+ expect(detailsTab(/^Evidence checked/)).toHaveTextContent(
2209
+ "Evidence checked2",
2210
+ );
2026
2211
  expect(evidence).toHaveTextContent("Active incidents (7 total)");
2027
2212
  expect(evidence).toHaveTextContent("Logs 17:20 – 18:20 (1 shown)");
2028
2213
  expect(within(evidence).queryAllByRole("button")).toHaveLength(0);
@@ -2045,17 +2230,15 @@ describe("InvestigationPanel structured report", () => {
2045
2230
 
2046
2231
  renderPanel();
2047
2232
  await flush();
2048
- expect(
2049
- within(screen.getByLabelText("Evidence checked")).queryAllByRole(
2050
- "button",
2051
- ),
2052
- ).toHaveLength(0);
2233
+ openDetails();
2234
+ expect(within(evidenceList()).getAllByRole("listitem")).toHaveLength(2);
2235
+ expect(within(evidenceList()).queryAllByRole("button")).toHaveLength(0);
2053
2236
 
2054
2237
  await tick(SETTLED_POLL_INTERVAL_MS);
2055
2238
 
2056
- expect(
2057
- within(screen.getByLabelText("Evidence checked")).getAllByRole("button"),
2058
- ).toHaveLength(2);
2239
+ // Still open on the same list, now with a toggle per query.
2240
+ expect(detailsToggle()).toHaveAttribute("aria-expanded", "true");
2241
+ expect(within(evidenceList()).getAllByRole("button")).toHaveLength(2);
2059
2242
  });
2060
2243
 
2061
2244
  test("never shows evidence without the report it belongs to", async () => {
@@ -2073,6 +2256,13 @@ describe("InvestigationPanel structured report", () => {
2073
2256
 
2074
2257
  expect(screen.getByText("Preparing the final report")).toBeVisible();
2075
2258
  expect(screen.queryByLabelText("Evidence checked")).toBeNull();
2259
+
2260
+ // The section still offers the run's steps, and only those.
2261
+ expect(detailsToggle()).toHaveTextContent("Investigation activity");
2262
+ openDetails();
2263
+ expect(screen.queryByRole("tablist")).toBeNull();
2264
+ expect(screen.queryByLabelText("Evidence checked")).toBeNull();
2265
+ expect(screen.getByTestId("investigation-activity")).toBeVisible();
2076
2266
  });
2077
2267
 
2078
2268
  test("drops evidence when the report disappears on a later poll", async () => {
@@ -2085,10 +2275,12 @@ describe("InvestigationPanel structured report", () => {
2085
2275
  renderPanel();
2086
2276
  await flush();
2087
2277
  expect(screen.getByLabelText("Evidence checked")).toBeInTheDocument();
2278
+ expect(detailsToggle()).toHaveTextContent("Evidence and activity");
2088
2279
 
2089
2280
  await tick(SETTLED_POLL_INTERVAL_MS);
2090
2281
 
2091
2282
  expect(screen.queryByLabelText("Evidence checked")).toBeNull();
2283
+ expect(detailsToggle()).toHaveTextContent("Investigation activity");
2092
2284
  expect(
2093
2285
  screen.getByText("No investigation report was published."),
2094
2286
  ).toBeVisible();
@@ -2110,13 +2302,11 @@ describe("InvestigationPanel structured report", () => {
2110
2302
 
2111
2303
  renderPanel();
2112
2304
  await flush();
2305
+ openDetails();
2113
2306
 
2114
2307
  // Nothing valid survived, so the legacy list and plain numbers are used.
2115
- expect(
2116
- within(screen.getByLabelText("Evidence checked")).queryAllByRole(
2117
- "button",
2118
- ),
2119
- ).toHaveLength(0);
2308
+ expect(within(evidenceList()).getAllByRole("listitem")).toHaveLength(2);
2309
+ expect(within(evidenceList()).queryAllByRole("button")).toHaveLength(0);
2120
2310
  expect(
2121
2311
  lastInlineReferences().renderEventReference!({
2122
2312
  kind: "incident",
@@ -2126,7 +2316,27 @@ describe("InvestigationPanel structured report", () => {
2126
2316
  ).toBeNull();
2127
2317
  });
2128
2318
 
2129
- test("a citation chip expands, scrolls to and highlights its evidence row", async () => {
2319
+ /*
2320
+ * The report's chips are rendered by the markdown viewer, which is mocked
2321
+ * here, so render the panel's own chip renderer output and click it the
2322
+ * way a reader would.
2323
+ */
2324
+ function clickCitation(citationId: string, name: string): void {
2325
+ const chip: React.ReactElement | null =
2326
+ lastInlineReferences().renderCitation!(citationId);
2327
+ expect(chip).not.toBeNull();
2328
+ render(chip!);
2329
+
2330
+ const chipButton: HTMLElement = screen.getByRole("button", { name });
2331
+ fireEvent.click(chipButton);
2332
+ }
2333
+
2334
+ /*
2335
+ * The evidence sits in a section that starts collapsed, so a chip that only
2336
+ * highlighted its row would highlight something nobody can see. The chip
2337
+ * has to open the section on the Evidence tab first.
2338
+ */
2339
+ test("a citation chip opens the collapsed details and expands, scrolls to and highlights its row", async () => {
2130
2340
  routePosts({
2131
2341
  investigation: (): unknown => {
2132
2342
  return Promise.resolve(structuredResponse());
@@ -2136,6 +2346,8 @@ describe("InvestigationPanel structured report", () => {
2136
2346
  renderPanel();
2137
2347
  await flush();
2138
2348
  expect(jest.getTimerCount()).toBe(1);
2349
+ expect(detailsToggle()).toHaveAttribute("aria-expanded", "false");
2350
+ expect(detailsBody()).not.toBeVisible();
2139
2351
 
2140
2352
  const chip: React.ReactElement | null =
2141
2353
  lastInlineReferences().renderCitation!("C2");
@@ -2150,10 +2362,19 @@ describe("InvestigationPanel structured report", () => {
2150
2362
  fireEvent.click(chipButton);
2151
2363
  await flush();
2152
2364
 
2153
- const toggle: HTMLElement = within(
2154
- screen.getByLabelText("Evidence checked"),
2155
- ).getByRole("button", { name: /Logs 17:20/ });
2365
+ expect(detailsToggle()).toHaveAttribute("aria-expanded", "true");
2366
+ expect(detailsBody()).toBeVisible();
2367
+ expect(detailsTab(/^Evidence checked/)).toHaveAttribute(
2368
+ "aria-selected",
2369
+ "true",
2370
+ );
2371
+
2372
+ const toggle: HTMLElement = within(evidenceList()).getByRole("button", {
2373
+ name: /Logs 17:20/,
2374
+ });
2375
+ expect(toggle).toBeVisible();
2156
2376
  expect(toggle).toHaveAttribute("aria-expanded", "true");
2377
+ expect(toggle).toHaveFocus();
2157
2378
  expect(toggle.closest("li")).toHaveAttribute("data-highlighted", "true");
2158
2379
  expect(scrollIntoViewMock).toHaveBeenCalledWith({
2159
2380
  block: "nearest",
@@ -2168,6 +2389,157 @@ describe("InvestigationPanel structured report", () => {
2168
2389
 
2169
2390
  expect(toggle.closest("li")).not.toHaveAttribute("data-highlighted");
2170
2391
  expect(jest.getTimerCount()).toBe(1);
2392
+ // The highlight fades; the section the reader was taken to stays open.
2393
+ expect(detailsToggle()).toHaveAttribute("aria-expanded", "true");
2394
+ });
2395
+
2396
+ test("a citation chip switches an open section from Activity to Evidence", async () => {
2397
+ routePosts({
2398
+ investigation: (): unknown => {
2399
+ return Promise.resolve(structuredResponse());
2400
+ },
2401
+ });
2402
+
2403
+ renderPanel();
2404
+ await flush();
2405
+ openDetails();
2406
+ fireEvent.click(detailsTab(/^Activity/));
2407
+ expect(screen.getByTestId("investigation-activity")).toBeVisible();
2408
+ expect(screen.queryByRole("list", { name: "Evidence checked" })).toBeNull();
2409
+
2410
+ clickCitation("C1", "Citation C1: Active incidents (7 total)");
2411
+ await flush();
2412
+
2413
+ expect(detailsToggle()).toHaveAttribute("aria-expanded", "true");
2414
+ expect(detailsTab(/^Evidence checked/)).toHaveAttribute(
2415
+ "aria-selected",
2416
+ "true",
2417
+ );
2418
+ expect(detailsTab(/^Activity/)).toHaveAttribute("aria-selected", "false");
2419
+ expect(screen.getByTestId("investigation-activity")).not.toBeVisible();
2420
+
2421
+ const toggle: HTMLElement = within(evidenceList()).getByRole("button", {
2422
+ name: /Active incidents/,
2423
+ });
2424
+ expect(toggle).toBeVisible();
2425
+ expect(toggle).toHaveAttribute("aria-expanded", "true");
2426
+ expect(toggle).toHaveFocus();
2427
+ expect(toggle.closest("li")).toHaveAttribute("data-highlighted", "true");
2428
+ expect(scrollIntoViewMock).toHaveBeenCalledTimes(1);
2429
+ });
2430
+
2431
+ /*
2432
+ * An older API sends no structured evidence, so the report's own list is
2433
+ * shown and its rows have no toggle. The row itself takes focus, or a
2434
+ * keyboard or screen-reader user would be left on the chip.
2435
+ */
2436
+ test("a citation chip on an older report reveals and focuses its plain row", async () => {
2437
+ postMock.mockResolvedValue(
2438
+ completedResponse({ analysisMarkdown: STRUCTURED_REPORT }) as never,
2439
+ );
2440
+
2441
+ renderPanel();
2442
+ await flush();
2443
+ expect(detailsToggle()).toHaveAttribute("aria-expanded", "false");
2444
+
2445
+ clickCitation("C2", "Citation C2: Logs 17:20 – 18:20 (1 shown)");
2446
+ await flush();
2447
+
2448
+ expect(detailsToggle()).toHaveAttribute("aria-expanded", "true");
2449
+ expect(detailsTab(/^Evidence checked/)).toHaveAttribute(
2450
+ "aria-selected",
2451
+ "true",
2452
+ );
2453
+
2454
+ const row: HTMLElement = within(evidenceList())
2455
+ .getAllByRole("listitem")
2456
+ .find((item: HTMLElement): boolean => {
2457
+ return item.textContent?.includes("Logs 17:20") === true;
2458
+ })!;
2459
+ expect(row).toBeVisible();
2460
+ expect(row).toHaveFocus();
2461
+ expect(row).toHaveAttribute("data-highlighted", "true");
2462
+ expect(scrollIntoViewMock).toHaveBeenCalledTimes(1);
2463
+ // A plain row has nothing to re-run.
2464
+ expect(evidencePosts()).toHaveLength(0);
2465
+ });
2466
+
2467
+ /*
2468
+ * A chip's request lives in the panel, so it outlives the evidence list
2469
+ * when the report briefly disappears between polls. When the list comes
2470
+ * back it must not replay that old request — scrolling the page and
2471
+ * stealing focus with no click behind it.
2472
+ */
2473
+ test("does not replay a chip when the evidence comes back on a later poll", async () => {
2474
+ let investigationCalls: number = 0;
2475
+ routePosts({
2476
+ investigation: (): unknown => {
2477
+ investigationCalls += 1;
2478
+ return Promise.resolve(
2479
+ investigationCalls === 2
2480
+ ? structuredResponse({ analysisMarkdown: null })
2481
+ : structuredResponse(),
2482
+ );
2483
+ },
2484
+ });
2485
+
2486
+ renderPanel();
2487
+ await flush();
2488
+ clickCitation("C2", "Citation C2: Logs 17:20 – 18:20 (1 shown)");
2489
+ await flush();
2490
+ expect(scrollIntoViewMock).toHaveBeenCalledTimes(1);
2491
+ await tick(2000);
2492
+
2493
+ await tick(SETTLED_POLL_INTERVAL_MS);
2494
+ expect(screen.queryByLabelText("Evidence checked")).toBeNull();
2495
+ expect(screen.getByTestId("investigation-activity")).toBeVisible();
2496
+
2497
+ await tick(SETTLED_POLL_INTERVAL_MS);
2498
+ expect(investigationPostCount()).toBe(3);
2499
+
2500
+ const toggle: HTMLElement = within(evidenceList()).getByRole("button", {
2501
+ name: /Logs 17:20/,
2502
+ });
2503
+ expect(toggle).toBeVisible();
2504
+ expect(toggle).toHaveAttribute("aria-expanded", "false");
2505
+ expect(toggle).not.toHaveFocus();
2506
+ expect(document.querySelector('[data-highlighted="true"]')).toBeNull();
2507
+ expect(scrollIntoViewMock).toHaveBeenCalledTimes(1);
2508
+ expect(evidencePosts()).toHaveLength(1);
2509
+ });
2510
+
2511
+ test("a new run on the same subject starts collapsed, even after a chip opened the last one", async () => {
2512
+ let investigationCalls: number = 0;
2513
+ routePosts({
2514
+ investigation: (): unknown => {
2515
+ investigationCalls += 1;
2516
+ return Promise.resolve(
2517
+ investigationCalls === 1
2518
+ ? structuredResponse()
2519
+ : structuredResponse({ runId: NEXT_RUN_ID }),
2520
+ );
2521
+ },
2522
+ });
2523
+
2524
+ renderPanel();
2525
+ await flush();
2526
+ clickCitation("C2", "Citation C2: Logs 17:20 – 18:20 (1 shown)");
2527
+ await flush();
2528
+ expect(detailsToggle()).toHaveAttribute("aria-expanded", "true");
2529
+
2530
+ await tick(SETTLED_POLL_INTERVAL_MS);
2531
+
2532
+ expect(investigationPostCount()).toBe(2);
2533
+ expect(detailsToggle()).toHaveAttribute("aria-expanded", "false");
2534
+ expect(detailsBody()).not.toBeVisible();
2535
+
2536
+ openDetails();
2537
+
2538
+ expect(
2539
+ within(evidenceList()).getByRole("button", { name: /Logs 17:20/ }),
2540
+ ).toHaveAttribute("aria-expanded", "false");
2541
+ expect(document.querySelector('[data-highlighted="true"]')).toBeNull();
2542
+ expect(scrollIntoViewMock).toHaveBeenCalledTimes(1);
2171
2543
  });
2172
2544
 
2173
2545
  test("leaves a citation that is not in the evidence as plain text", async () => {
@@ -2255,6 +2627,7 @@ describe("InvestigationPanel structured report", () => {
2255
2627
 
2256
2628
  const view: ReturnType<typeof render> = renderPanel();
2257
2629
  await flush();
2630
+ openDetails();
2258
2631
  fireEvent.click(
2259
2632
  screen.getByRole("button", { name: /Active incidents \(7 total\)/ }),
2260
2633
  );
@@ -2271,6 +2644,8 @@ describe("InvestigationPanel structured report", () => {
2271
2644
  );
2272
2645
 
2273
2646
  expect(screen.queryByText(/Previous subject rows/)).toBeNull();
2647
+ // The new subject's details start collapsed like any other.
2648
+ openDetails();
2274
2649
  const toggle: HTMLElement = screen.getByRole("button", {
2275
2650
  name: /Active incidents \(7 total\)/,
2276
2651
  });
@@ -2315,18 +2690,40 @@ describe("InvestigationPanel structured report", () => {
2315
2690
  ).toBeUndefined();
2316
2691
  });
2317
2692
 
2318
- test("names the model and asks for verification in the usage strip", async () => {
2693
+ /*
2694
+ * Collapsed, the header answers "what did it do, and did it touch
2695
+ * anything?". What the run cost and which model wrote the report are for
2696
+ * the reader who opens the details, and the verify-first note belongs on
2697
+ * the report it qualifies.
2698
+ */
2699
+ test("names the model and its tokens inside the details, not in the collapsed header", async () => {
2319
2700
  postMock.mockResolvedValue(structuredResponse() as never);
2320
2701
 
2321
2702
  renderPanel();
2322
2703
  await flush();
2323
2704
 
2324
2705
  const usage: HTMLElement = screen.getByLabelText("Investigation usage");
2325
- expect(usage).toHaveTextContent("Model gpt-5");
2326
- expect(usage).toHaveTextContent(
2706
+ expect(usage).toBeVisible();
2707
+ expect(usage).toHaveTextContent("2 telemetry queries");
2708
+ expect(usage).not.toHaveTextContent("tokens");
2709
+ expect(usage).not.toHaveTextContent("gpt-5");
2710
+
2711
+ const cost: HTMLElement = screen.getByLabelText("Model and tokens");
2712
+ expect(detailsBody()).toContainElement(cost);
2713
+ expect(cost).not.toBeVisible();
2714
+ expect(cost).toHaveTextContent("1,234 tokens");
2715
+ expect(cost).toHaveTextContent("Model gpt-5");
2716
+ // Counts and the guarantee are already in the header; no repeats.
2717
+ expect(cost).not.toHaveTextContent("telemetry");
2718
+ expect(cost).not.toHaveTextContent("Read-only");
2719
+
2720
+ openDetails();
2721
+
2722
+ expect(screen.getByRole("list", { name: "Model and tokens" })).toBe(cost);
2723
+ expect(cost).toBeVisible();
2724
+ expect(screen.getByLabelText("Investigation report")).toHaveTextContent(
2327
2725
  "AI-generated first pass — verify before acting.",
2328
2726
  );
2329
- expect(usage).toHaveTextContent("2 telemetry queries");
2330
2727
  });
2331
2728
 
2332
2729
  test("does not ask to verify a report that does not exist", async () => {
@@ -2344,8 +2741,10 @@ describe("InvestigationPanel structured report", () => {
2344
2741
  await flush();
2345
2742
 
2346
2743
  const usage: HTMLElement = screen.getByLabelText("Investigation usage");
2347
- expect(usage).not.toHaveTextContent("verify before acting");
2744
+ expect(usage).toHaveTextContent("3 telemetry queries");
2348
2745
  expect(usage).not.toHaveTextContent("Model");
2746
+ expect(screen.queryByText(/verify before acting/)).toBeNull();
2747
+ expect(screen.queryByLabelText("Model and tokens")).toBeNull();
2349
2748
  });
2350
2749
 
2351
2750
  test("titles the act and rate blocks with headings instead of icon-in-paragraph", async () => {
@@ -2364,44 +2763,338 @@ describe("InvestigationPanel structured report", () => {
2364
2763
  });
2365
2764
  });
2366
2765
 
2367
- describe("InvestigationPanel report summary callback", () => {
2368
- function nonNullCalls(callback: MockFunction): Array<unknown> {
2369
- return callback.mock.calls
2370
- .map((call: Array<unknown>): unknown => {
2371
- return call[0];
2372
- })
2373
- .filter((value: unknown): boolean => {
2374
- return value !== null;
2766
+ /*
2767
+ * "Evidence checked", "Investigation activity" and the usage strip used to be
2768
+ * three stacked boxes under the report. They are now one section that starts
2769
+ * collapsed: the report is the answer, this is its working. Collapsed, it
2770
+ * still has to say what the run did and that it changed nothing, because a
2771
+ * responder asks that before trusting the report at all.
2772
+ */
2773
+ describe("InvestigationPanel run details", () => {
2774
+ function tabNames(): Array<string> {
2775
+ return within(
2776
+ screen.getByRole("tablist", { name: "Investigation details" }),
2777
+ )
2778
+ .getAllByRole("tab")
2779
+ .map((tab: HTMLElement): string => {
2780
+ return tab.textContent || "";
2375
2781
  });
2376
2782
  }
2377
2783
 
2378
- test("reports the TL;DR of a completed report", async () => {
2379
- const onReportSummaryChange: MockFunction = getJestMockFunction();
2380
- postMock.mockResolvedValue(
2381
- structuredResponse({ analysisTldr: TLDR }) as never,
2382
- );
2784
+ test("starts collapsed and still says what the run did in its header", async () => {
2785
+ postMock.mockResolvedValue(structuredResponse() as never);
2383
2786
 
2384
- renderPanel({ onReportSummaryChange });
2787
+ renderPanel();
2385
2788
  await flush();
2386
2789
 
2387
- expect(onReportSummaryChange).toHaveBeenLastCalledWith(TLDR);
2388
- expect(nonNullCalls(onReportSummaryChange)).toEqual([TLDR]);
2790
+ const section: HTMLElement = screen.getByRole("region", {
2791
+ name: "Evidence and activity",
2792
+ });
2793
+ expect(section).toBe(runDetails());
2794
+
2795
+ /*
2796
+ * The toggle is named by the title alone: the usage line beside it is
2797
+ * not part of the button, so a screen reader hears a short name.
2798
+ */
2799
+ const toggle: HTMLElement = within(section).getByRole("button", {
2800
+ name: "Evidence and activity",
2801
+ });
2802
+ expect(toggle).toBe(detailsToggle());
2803
+ expect(
2804
+ within(section).getByRole("heading", {
2805
+ level: 3,
2806
+ name: "Evidence and activity",
2807
+ }),
2808
+ ).toContainElement(toggle);
2809
+ expect(toggle).toHaveAttribute("aria-expanded", "false");
2810
+ expect(detailsBody()).not.toBeVisible();
2811
+ expect(section).toContainElement(detailsBody());
2812
+ expect(screen.queryByRole("tablist")).toBeNull();
2813
+ expect(screen.queryByRole("list", { name: "Evidence checked" })).toBeNull();
2814
+ expect(screen.getByTestId("investigation-activity")).not.toBeVisible();
2815
+
2816
+ const usage: HTMLElement = within(section).getByRole("list", {
2817
+ name: "Investigation usage",
2818
+ });
2819
+ expect(usage).toBeVisible();
2820
+ expect(
2821
+ within(usage)
2822
+ .getAllByRole("listitem")
2823
+ .map((item: HTMLElement): string => {
2824
+ return item.textContent || "";
2825
+ }),
2826
+ ).toEqual([
2827
+ "2 telemetry queries",
2828
+ "1 step",
2829
+ "Read-only — nothing in your systems was changed",
2830
+ ]);
2389
2831
  });
2390
2832
 
2391
- test("falls back to the report's Summary as plain text without a TL;DR", async () => {
2392
- const onReportSummaryChange: MockFunction = getJestMockFunction();
2393
- postMock.mockResolvedValue(structuredResponse() as never);
2833
+ /*
2834
+ * The run's tool-call count also includes calls that failed and never
2835
+ * became evidence. Inside a section whose Evidence tab lists the queries,
2836
+ * the header has to count the same queries, or the two numbers a reader
2837
+ * sees side by side disagree. Without evidence the run's own count is all
2838
+ * there is.
2839
+ */
2840
+ test("counts the queries the Evidence tab lists, not the run's raw call count", async () => {
2841
+ postMock
2842
+ .mockResolvedValueOnce(structuredResponse({ toolCallCount: 3 }) as never)
2843
+ .mockResolvedValue(
2844
+ structuredResponse({ toolCallCount: 3, evidence: [] }) as never,
2845
+ );
2394
2846
 
2395
- renderPanel({ onReportSummaryChange });
2847
+ renderPanel();
2396
2848
  await flush();
2397
2849
 
2398
- expect(onReportSummaryChange).toHaveBeenLastCalledWith(REPORT_SUMMARY);
2399
- });
2850
+ expect(screen.getByLabelText("Investigation usage")).toHaveTextContent(
2851
+ "2 telemetry queries",
2852
+ );
2853
+ openDetails();
2854
+ expect(detailsTab(/^Evidence checked/)).toHaveTextContent(
2855
+ "Evidence checked2",
2856
+ );
2400
2857
 
2401
- test("bounds a long Summary", async () => {
2402
- const onReportSummaryChange: MockFunction = getJestMockFunction();
2403
- postMock.mockResolvedValue(
2404
- completedResponse({
2858
+ /*
2859
+ * An older API: the report's own list still names the queries, so the
2860
+ * header follows it rather than the raw call count.
2861
+ */
2862
+ await tick(SETTLED_POLL_INTERVAL_MS);
2863
+
2864
+ expect(within(evidenceList()).queryAllByRole("button")).toHaveLength(0);
2865
+ expect(screen.getByLabelText("Investigation usage")).toHaveTextContent(
2866
+ "2 telemetry queries",
2867
+ );
2868
+ });
2869
+
2870
+ test("falls back to the run's call count when there is no evidence at all", async () => {
2871
+ postMock.mockResolvedValue(
2872
+ completedResponse({ toolCallCount: 3 }) as never,
2873
+ );
2874
+
2875
+ renderPanel();
2876
+ await flush();
2877
+
2878
+ expect(detailsToggle()).toHaveTextContent("Investigation activity");
2879
+ expect(screen.getByLabelText("Investigation usage")).toHaveTextContent(
2880
+ "3 telemetry queries",
2881
+ );
2882
+ });
2883
+
2884
+ test("opening reveals the tabs and the evidence list, and closing hides them again", async () => {
2885
+ postMock.mockResolvedValue(structuredResponse() as never);
2886
+
2887
+ renderPanel();
2888
+ await flush();
2889
+ openDetails();
2890
+
2891
+ expect(detailsBody()).toBeVisible();
2892
+ expect(tabNames()).toEqual(["Evidence checked2", "Activity1"]);
2893
+
2894
+ const evidenceTab: HTMLElement = detailsTab(/^Evidence checked/);
2895
+ expect(evidenceTab).toHaveAttribute("aria-selected", "true");
2896
+ expect(evidenceTab).toHaveAttribute("tabindex", "0");
2897
+ expect(detailsTab(/^Activity/)).toHaveAttribute("aria-selected", "false");
2898
+ expect(detailsTab(/^Activity/)).toHaveAttribute("tabindex", "-1");
2899
+
2900
+ // Only the selected panel is reachable, and it is named by its tab.
2901
+ const panel: HTMLElement = screen.getByRole("tabpanel");
2902
+ expect(panel).toBe(
2903
+ screen.getByRole("tabpanel", { name: /^Evidence checked/ }),
2904
+ );
2905
+ expect(evidenceTab).toHaveAttribute("aria-controls", panel.id);
2906
+ expect(panel).toHaveAttribute("tabindex", "0");
2907
+ expect(panel).toContainElement(evidenceList());
2908
+ expect(
2909
+ within(evidenceList()).getByRole("button", { name: /Active incidents/ }),
2910
+ ).toBeVisible();
2911
+ expect(
2912
+ within(evidenceList()).getByRole("button", { name: /Logs 17:20/ }),
2913
+ ).toBeVisible();
2914
+ expect(screen.getByTestId("investigation-activity")).not.toBeVisible();
2915
+
2916
+ fireEvent.click(detailsToggle());
2917
+
2918
+ expect(detailsToggle()).toHaveAttribute("aria-expanded", "false");
2919
+ expect(detailsBody()).not.toBeVisible();
2920
+ expect(screen.queryByRole("tablist")).toBeNull();
2921
+ expect(screen.queryByRole("tabpanel")).toBeNull();
2922
+ expect(screen.queryByRole("list", { name: "Evidence checked" })).toBeNull();
2923
+ // The header's summary does not depend on the body being open.
2924
+ expect(screen.getByLabelText("Investigation usage")).toBeVisible();
2925
+ });
2926
+
2927
+ test("switches between the evidence and activity tabs", async () => {
2928
+ postMock.mockResolvedValue(structuredResponse() as never);
2929
+
2930
+ renderPanel();
2931
+ await flush();
2932
+ openDetails();
2933
+
2934
+ fireEvent.click(detailsTab(/^Activity/));
2935
+
2936
+ expect(detailsTab(/^Activity/)).toHaveAttribute("aria-selected", "true");
2937
+ expect(detailsTab(/^Evidence checked/)).toHaveAttribute(
2938
+ "aria-selected",
2939
+ "false",
2940
+ );
2941
+ const activityPanel: HTMLElement = screen.getByRole("tabpanel", {
2942
+ name: /^Activity/,
2943
+ });
2944
+ expect(activityPanel).toContainElement(
2945
+ screen.getByTestId("investigation-activity"),
2946
+ );
2947
+ expect(screen.getByTestId("investigation-activity")).toBeVisible();
2948
+ expect(screen.queryByRole("list", { name: "Evidence checked" })).toBeNull();
2949
+
2950
+ // The footer belongs to the body, not to one tab.
2951
+ expect(
2952
+ screen.getByRole("list", { name: "Model and tokens" }),
2953
+ ).toBeVisible();
2954
+
2955
+ fireEvent.click(detailsTab(/^Evidence checked/));
2956
+
2957
+ expect(evidenceList()).toBeVisible();
2958
+ expect(screen.getByTestId("investigation-activity")).not.toBeVisible();
2959
+ });
2960
+
2961
+ /*
2962
+ * The old disclosure advertised the raw event count and showed only the
2963
+ * last ten steps. Several event types only close a step, so the count the
2964
+ * reader sees has to be the steps the feed draws — and a finished run is
2965
+ * short enough to show its whole trail.
2966
+ */
2967
+ test("counts the steps the feed draws and shows the whole finished trail", async () => {
2968
+ const events: JSONArray = [];
2969
+
2970
+ for (let index: number = 0; index < 24; index++) {
2971
+ events.push({
2972
+ _id: `55555555-5555-4555-8555-${String(index).padStart(12, "0")}`,
2973
+ sequence: index + 1,
2974
+ eventType:
2975
+ index % 2 === 0
2976
+ ? AIRunEventType.ToolCallStarted
2977
+ : AIRunEventType.ToolCallCompleted,
2978
+ toolName: "search_logs",
2979
+ createdAt: new Date("2026-08-07T10:00:00.000Z"),
2980
+ });
2981
+ }
2982
+
2983
+ countActivityStepsMock.mockReturnValue(12);
2984
+ postMock.mockResolvedValue(structuredResponse({ events }) as never);
2985
+
2986
+ renderPanel();
2987
+ await flush();
2988
+
2989
+ const usage: HTMLElement = screen.getByLabelText("Investigation usage");
2990
+ expect(usage).toHaveTextContent("12 steps");
2991
+ expect(usage).not.toHaveTextContent("24");
2992
+
2993
+ openDetails();
2994
+
2995
+ expect(tabNames()).toEqual(["Evidence checked2", "Activity12"]);
2996
+ expect(lastActivityProps().events).toHaveLength(24);
2997
+ expect(lastActivityProps()).toEqual(
2998
+ expect.objectContaining({
2999
+ hideChrome: true,
3000
+ showLiveIndicator: false,
3001
+ maxVisibleSteps: 12,
3002
+ }),
3003
+ );
3004
+ });
3005
+
3006
+ /*
3007
+ * Evidence can land on a later poll than the report. A reader who opened
3008
+ * the section onto the activity is reading it; the arriving evidence adds
3009
+ * a tab beside it rather than yanking the view to the new first tab.
3010
+ */
3011
+ test("keeps a reader on the activity when evidence arrives after they opened it", async () => {
3012
+ postMock
3013
+ .mockResolvedValueOnce(completedResponse() as never)
3014
+ .mockResolvedValue(structuredResponse() as never);
3015
+
3016
+ renderPanel();
3017
+ await flush();
3018
+ openDetails();
3019
+
3020
+ expect(detailsToggle()).toHaveTextContent("Investigation activity");
3021
+ expect(screen.queryByRole("tablist")).toBeNull();
3022
+ expect(screen.getByTestId("investigation-activity")).toBeVisible();
3023
+
3024
+ await tick(SETTLED_POLL_INTERVAL_MS);
3025
+
3026
+ expect(detailsToggle()).toHaveTextContent("Evidence and activity");
3027
+ expect(detailsToggle()).toHaveAttribute("aria-expanded", "true");
3028
+ expect(tabNames()).toEqual(["Evidence checked2", "Activity1"]);
3029
+ expect(detailsTab(/^Activity/)).toHaveAttribute("aria-selected", "true");
3030
+ expect(detailsTab(/^Evidence checked/)).toHaveAttribute(
3031
+ "aria-selected",
3032
+ "false",
3033
+ );
3034
+ expect(screen.getByTestId("investigation-activity")).toBeVisible();
3035
+ expect(screen.queryByRole("list", { name: "Evidence checked" })).toBeNull();
3036
+ });
3037
+
3038
+ /*
3039
+ * The counterpart: nobody has looked yet, so there is nothing to keep, and
3040
+ * the section opens on the evidence like any report that has some.
3041
+ */
3042
+ test("opens on the evidence when it arrived before the reader looked", async () => {
3043
+ postMock
3044
+ .mockResolvedValueOnce(completedResponse() as never)
3045
+ .mockResolvedValue(structuredResponse() as never);
3046
+
3047
+ renderPanel();
3048
+ await flush();
3049
+ await tick(SETTLED_POLL_INTERVAL_MS);
3050
+ openDetails();
3051
+
3052
+ expect(detailsTab(/^Evidence checked/)).toHaveAttribute(
3053
+ "aria-selected",
3054
+ "true",
3055
+ );
3056
+ expect(evidenceList()).toBeVisible();
3057
+ });
3058
+ });
3059
+
3060
+ describe("InvestigationPanel report summary callback", () => {
3061
+ function nonNullCalls(callback: MockFunction): Array<unknown> {
3062
+ return callback.mock.calls
3063
+ .map((call: Array<unknown>): unknown => {
3064
+ return call[0];
3065
+ })
3066
+ .filter((value: unknown): boolean => {
3067
+ return value !== null;
3068
+ });
3069
+ }
3070
+
3071
+ test("reports the TL;DR of a completed report", async () => {
3072
+ const onReportSummaryChange: MockFunction = getJestMockFunction();
3073
+ postMock.mockResolvedValue(
3074
+ structuredResponse({ analysisTldr: TLDR }) as never,
3075
+ );
3076
+
3077
+ renderPanel({ onReportSummaryChange });
3078
+ await flush();
3079
+
3080
+ expect(onReportSummaryChange).toHaveBeenLastCalledWith(TLDR);
3081
+ expect(nonNullCalls(onReportSummaryChange)).toEqual([TLDR]);
3082
+ });
3083
+
3084
+ test("falls back to the report's Summary as plain text without a TL;DR", async () => {
3085
+ const onReportSummaryChange: MockFunction = getJestMockFunction();
3086
+ postMock.mockResolvedValue(structuredResponse() as never);
3087
+
3088
+ renderPanel({ onReportSummaryChange });
3089
+ await flush();
3090
+
3091
+ expect(onReportSummaryChange).toHaveBeenLastCalledWith(REPORT_SUMMARY);
3092
+ });
3093
+
3094
+ test("bounds a long Summary", async () => {
3095
+ const onReportSummaryChange: MockFunction = getJestMockFunction();
3096
+ postMock.mockResolvedValue(
3097
+ completedResponse({
2405
3098
  analysisMarkdown: `**Summary** — ${"pool exhausted ".repeat(60)}\n\n**Root cause** — a deploy.`,
2406
3099
  }) as never,
2407
3100
  );
@@ -2410,10 +3103,28 @@ describe("InvestigationPanel report summary callback", () => {
2410
3103
  await flush();
2411
3104
 
2412
3105
  const summary: string = nonNullCalls(onReportSummaryChange)[0] as string;
2413
- expect(summary.length).toBeLessThanOrEqual(280);
3106
+ // Bounded by the analysisTldr column; the header clamps it on screen.
3107
+ expect(summary.length).toBeLessThanOrEqual(500);
3108
+ expect(summary.length).toBeGreaterThan(280);
2414
3109
  expect(summary.endsWith("…")).toBe(true);
2415
3110
  });
2416
3111
 
3112
+ test("reports a TL;DR at the server's 320-character cap whole", async () => {
3113
+ const onReportSummaryChange: MockFunction = getJestMockFunction();
3114
+ const longTldr: string =
3115
+ "checkout-api release 2026.09.14-2 restarted at 17:52:04 with DB_POOL_MAX=10 instead of 40, so requests waited up to 2s in pg.pool.connect for an orders-db connection and p95 latency rose from ~310 ms to 2.35 s (db.client.connections.usage pinned at 10/10). Rolling back to 2026.09.14-1 cleared it, as in #1017 and #1029.";
3116
+
3117
+ expect(longTldr).toHaveLength(320);
3118
+ postMock.mockResolvedValue(
3119
+ structuredResponse({ analysisTldr: longTldr }) as never,
3120
+ );
3121
+
3122
+ renderPanel({ onReportSummaryChange });
3123
+ await flush();
3124
+
3125
+ expect(nonNullCalls(onReportSummaryChange)).toEqual([longTldr]);
3126
+ });
3127
+
2417
3128
  test("reports null when a report has neither a TL;DR nor a Summary", async () => {
2418
3129
  const onReportSummaryChange: MockFunction = getJestMockFunction();
2419
3130
  postMock.mockResolvedValue(completedResponse() as never);
@@ -2561,3 +3272,333 @@ describe("InvestigationPanel report summary callback", () => {
2561
3272
  expect(second).toHaveBeenLastCalledWith("A newer summary.");
2562
3273
  });
2563
3274
  });
3275
+
3276
+ /*
3277
+ * The header shows a responder's verdict next to the report's summary, so the
3278
+ * panel reports it on the summary's terms: once per change, null until a
3279
+ * report is on screen, and afresh for every subject.
3280
+ */
3281
+ describe("InvestigationPanel verdict callback", () => {
3282
+ function reportedVerdicts(callback: MockFunction): Array<unknown> {
3283
+ return callback.mock.calls.map((call: Array<unknown>): unknown => {
3284
+ return call[0];
3285
+ });
3286
+ }
3287
+
3288
+ function nonNullVerdicts(callback: MockFunction): Array<unknown> {
3289
+ return reportedVerdicts(callback).filter((value: unknown): boolean => {
3290
+ return value !== null;
3291
+ });
3292
+ }
3293
+
3294
+ test.each(Object.values(AIRunHumanVerdict))(
3295
+ "reports a %s verdict saved with the completed report",
3296
+ async (verdict: AIRunHumanVerdict) => {
3297
+ const onVerdictChange: MockFunction = getJestMockFunction();
3298
+ postMock.mockResolvedValue(
3299
+ structuredResponse({ humanVerdict: verdict }) as never,
3300
+ );
3301
+
3302
+ renderPanel({ onVerdictChange });
3303
+ await flush();
3304
+
3305
+ expect(onVerdictChange).toHaveBeenLastCalledWith(verdict);
3306
+ expect(nonNullVerdicts(onVerdictChange)).toEqual([verdict]);
3307
+ },
3308
+ );
3309
+
3310
+ test("reports null for a report nobody has rated", async () => {
3311
+ const onVerdictChange: MockFunction = getJestMockFunction();
3312
+ postMock.mockResolvedValue(structuredResponse() as never);
3313
+
3314
+ renderPanel({ onVerdictChange });
3315
+ await flush();
3316
+
3317
+ expect(onVerdictChange).toHaveBeenCalledWith(null);
3318
+ expect(nonNullVerdicts(onVerdictChange)).toEqual([]);
3319
+ });
3320
+
3321
+ test("reports no verdict it cannot name", async () => {
3322
+ const onVerdictChange: MockFunction = getJestMockFunction();
3323
+ postMock.mockResolvedValue(
3324
+ structuredResponse({ humanVerdict: "Edited" }) as never,
3325
+ );
3326
+
3327
+ renderPanel({ onVerdictChange });
3328
+ await flush();
3329
+
3330
+ expect(nonNullVerdicts(onVerdictChange)).toEqual([]);
3331
+ });
3332
+
3333
+ test.each([
3334
+ [
3335
+ "while a new run is in flight",
3336
+ (): ApiResponse => {
3337
+ return successfulResponse(
3338
+ investigationPayload({
3339
+ status: AIRunStatus.Running,
3340
+ humanVerdict: AIRunHumanVerdict.Confirmed,
3341
+ }),
3342
+ );
3343
+ },
3344
+ ],
3345
+ [
3346
+ "while the report is still being prepared",
3347
+ (): ApiResponse => {
3348
+ return completedResponse({
3349
+ analysisMarkdown: null,
3350
+ isAnalysisPending: true,
3351
+ humanVerdict: AIRunHumanVerdict.Confirmed,
3352
+ });
3353
+ },
3354
+ ],
3355
+ ])(
3356
+ "reports no verdict %s",
3357
+ async (_label: string, response: () => ApiResponse) => {
3358
+ const onVerdictChange: MockFunction = getJestMockFunction();
3359
+ postMock.mockResolvedValue(response() as never);
3360
+
3361
+ renderPanel({ onVerdictChange });
3362
+ await flush();
3363
+
3364
+ expect(nonNullVerdicts(onVerdictChange)).toEqual([]);
3365
+ },
3366
+ );
3367
+
3368
+ test("reports a rating the moment it is made, and a changed one", async () => {
3369
+ const onVerdictChange: MockFunction = getJestMockFunction();
3370
+ postMock
3371
+ .mockResolvedValueOnce(structuredResponse() as never)
3372
+ .mockResolvedValueOnce(successfulResponse({}) as never)
3373
+ .mockResolvedValueOnce(successfulResponse({}) as never);
3374
+
3375
+ renderPanel({ onVerdictChange });
3376
+ await flush();
3377
+ expect(nonNullVerdicts(onVerdictChange)).toEqual([]);
3378
+
3379
+ fireEvent.click(screen.getByRole("button", { name: "Confirmed" }));
3380
+ // Optimistic, like the panel's own pill: before the save resolves.
3381
+ expect(onVerdictChange).toHaveBeenLastCalledWith(
3382
+ AIRunHumanVerdict.Confirmed,
3383
+ );
3384
+ await flush();
3385
+
3386
+ fireEvent.click(screen.getByRole("button", { name: "Change" }));
3387
+ fireEvent.click(screen.getByRole("button", { name: "Rejected" }));
3388
+ await flush();
3389
+
3390
+ expect(nonNullVerdicts(onVerdictChange)).toEqual([
3391
+ AIRunHumanVerdict.Confirmed,
3392
+ AIRunHumanVerdict.Rejected,
3393
+ ]);
3394
+ expect(onVerdictChange).toHaveBeenLastCalledWith(
3395
+ AIRunHumanVerdict.Rejected,
3396
+ );
3397
+ });
3398
+
3399
+ test("takes a rating back out when the save fails", async () => {
3400
+ const onVerdictChange: MockFunction = getJestMockFunction();
3401
+ postMock
3402
+ .mockResolvedValueOnce(structuredResponse() as never)
3403
+ .mockResolvedValueOnce(
3404
+ new HTTPErrorResponse(
3405
+ 500,
3406
+ { message: "Verdict storage is unavailable." },
3407
+ {},
3408
+ ) as never,
3409
+ );
3410
+
3411
+ renderPanel({ onVerdictChange });
3412
+ await flush();
3413
+ fireEvent.click(screen.getByRole("button", { name: "Rejected" }));
3414
+ await flush();
3415
+
3416
+ expect(screen.getByRole("alert")).toHaveTextContent(
3417
+ "Could not save your verdict",
3418
+ );
3419
+ expect(nonNullVerdicts(onVerdictChange)).toEqual([
3420
+ AIRunHumanVerdict.Rejected,
3421
+ ]);
3422
+ expect(onVerdictChange).toHaveBeenLastCalledWith(null);
3423
+ });
3424
+
3425
+ test("a poll started before a rating saved cannot flip the reported verdict", async () => {
3426
+ const onVerdictChange: MockFunction = getJestMockFunction();
3427
+ const stalePoll: Deferred<ApiResponse> = createDeferred<ApiResponse>();
3428
+ postMock
3429
+ .mockResolvedValueOnce(structuredResponse() as never)
3430
+ .mockReturnValueOnce(stalePoll.promise as never)
3431
+ .mockResolvedValueOnce(successfulResponse({}) as never);
3432
+
3433
+ renderPanel({ onVerdictChange });
3434
+ await flush();
3435
+ await tick(SETTLED_POLL_INTERVAL_MS);
3436
+ expect(postMock).toHaveBeenCalledTimes(2);
3437
+
3438
+ fireEvent.click(screen.getByRole("button", { name: "Confirmed" }));
3439
+ await flush();
3440
+ const callsAfterRating: number = onVerdictChange.mock.calls.length;
3441
+
3442
+ await resolveDeferred(
3443
+ stalePoll,
3444
+ structuredResponse({ humanVerdict: null }),
3445
+ );
3446
+
3447
+ expect(onVerdictChange).toHaveBeenCalledTimes(callsAfterRating);
3448
+ expect(onVerdictChange).toHaveBeenLastCalledWith(
3449
+ AIRunHumanVerdict.Confirmed,
3450
+ );
3451
+ });
3452
+
3453
+ test("follows a verdict another responder saves", async () => {
3454
+ const onVerdictChange: MockFunction = getJestMockFunction();
3455
+ postMock
3456
+ .mockResolvedValueOnce(structuredResponse() as never)
3457
+ .mockResolvedValue(
3458
+ structuredResponse({
3459
+ humanVerdict: AIRunHumanVerdict.Rejected,
3460
+ }) as never,
3461
+ );
3462
+
3463
+ renderPanel({ onVerdictChange });
3464
+ await flush();
3465
+ expect(nonNullVerdicts(onVerdictChange)).toEqual([]);
3466
+
3467
+ await tick(SETTLED_POLL_INTERVAL_MS);
3468
+
3469
+ expect(onVerdictChange).toHaveBeenLastCalledWith(
3470
+ AIRunHumanVerdict.Rejected,
3471
+ );
3472
+ });
3473
+
3474
+ test("does not repeat an unchanged verdict across polls", async () => {
3475
+ const onVerdictChange: MockFunction = getJestMockFunction();
3476
+ postMock.mockResolvedValue(
3477
+ structuredResponse({
3478
+ humanVerdict: AIRunHumanVerdict.Confirmed,
3479
+ }) as never,
3480
+ );
3481
+
3482
+ renderPanel({ onVerdictChange });
3483
+ await flush();
3484
+ const callsAfterLoad: number = onVerdictChange.mock.calls.length;
3485
+
3486
+ await tick(SETTLED_POLL_INTERVAL_MS);
3487
+ await tick(SETTLED_POLL_INTERVAL_MS);
3488
+
3489
+ expect(investigationPostCount()).toBe(3);
3490
+ expect(onVerdictChange).toHaveBeenCalledTimes(callsAfterLoad);
3491
+ expect(nonNullVerdicts(onVerdictChange)).toEqual([
3492
+ AIRunHumanVerdict.Confirmed,
3493
+ ]);
3494
+ });
3495
+
3496
+ test("drops the verdict when a new run starts", async () => {
3497
+ const onVerdictChange: MockFunction = getJestMockFunction();
3498
+ postMock
3499
+ .mockResolvedValueOnce(
3500
+ structuredResponse({
3501
+ humanVerdict: AIRunHumanVerdict.Confirmed,
3502
+ }) as never,
3503
+ )
3504
+ .mockResolvedValue(
3505
+ successfulResponse(
3506
+ investigationPayload({
3507
+ status: AIRunStatus.Queued,
3508
+ runId: NEXT_RUN_ID,
3509
+ }),
3510
+ ) as never,
3511
+ );
3512
+
3513
+ renderPanel({ onVerdictChange });
3514
+ await flush();
3515
+ expect(onVerdictChange).toHaveBeenLastCalledWith(
3516
+ AIRunHumanVerdict.Confirmed,
3517
+ );
3518
+
3519
+ await tick(SETTLED_POLL_INTERVAL_MS);
3520
+
3521
+ expect(onVerdictChange).toHaveBeenLastCalledWith(null);
3522
+ });
3523
+
3524
+ test("reports null the moment the subject changes, then the new verdict", async () => {
3525
+ const onVerdictChange: MockFunction = getJestMockFunction();
3526
+ const nextSubject: Deferred<ApiResponse> = createDeferred<ApiResponse>();
3527
+ postMock
3528
+ .mockResolvedValueOnce(
3529
+ structuredResponse({
3530
+ humanVerdict: AIRunHumanVerdict.Confirmed,
3531
+ }) as never,
3532
+ )
3533
+ .mockReturnValueOnce(nextSubject.promise as never);
3534
+
3535
+ const view: ReturnType<typeof render> = renderPanel({ onVerdictChange });
3536
+ await flush();
3537
+ expect(onVerdictChange).toHaveBeenLastCalledWith(
3538
+ AIRunHumanVerdict.Confirmed,
3539
+ );
3540
+
3541
+ view.rerender(
3542
+ <InvestigationPanel
3543
+ subjectType="alert"
3544
+ subjectId={ALERT_ID}
3545
+ onVerdictChange={onVerdictChange}
3546
+ />,
3547
+ );
3548
+ await flush();
3549
+
3550
+ // Before the alert's report arrives, and without a stale confirmation.
3551
+ expect(onVerdictChange).toHaveBeenLastCalledWith(null);
3552
+
3553
+ await resolveDeferred(
3554
+ nextSubject,
3555
+ structuredResponse({
3556
+ runId: NEXT_RUN_ID,
3557
+ humanVerdict: AIRunHumanVerdict.Rejected,
3558
+ }),
3559
+ );
3560
+
3561
+ expect(onVerdictChange).toHaveBeenLastCalledWith(
3562
+ AIRunHumanVerdict.Rejected,
3563
+ );
3564
+ expect(nonNullVerdicts(onVerdictChange)).toEqual([
3565
+ AIRunHumanVerdict.Confirmed,
3566
+ AIRunHumanVerdict.Rejected,
3567
+ ]);
3568
+ });
3569
+
3570
+ test("uses the latest callback without re-reporting", async () => {
3571
+ const first: MockFunction = getJestMockFunction();
3572
+ const second: MockFunction = getJestMockFunction();
3573
+ postMock.mockResolvedValue(
3574
+ structuredResponse({
3575
+ humanVerdict: AIRunHumanVerdict.Confirmed,
3576
+ }) as never,
3577
+ );
3578
+
3579
+ const view: ReturnType<typeof render> = renderPanel({
3580
+ onVerdictChange: first,
3581
+ });
3582
+ await flush();
3583
+ expect(first).toHaveBeenLastCalledWith(AIRunHumanVerdict.Confirmed);
3584
+ const firstCallCount: number = first.mock.calls.length;
3585
+
3586
+ view.rerender(
3587
+ <InvestigationPanel
3588
+ subjectType="incident"
3589
+ subjectId={INCIDENT_ID}
3590
+ onVerdictChange={second}
3591
+ />,
3592
+ );
3593
+ await flush();
3594
+ expect(second).not.toHaveBeenCalled();
3595
+
3596
+ postMock.mockResolvedValue(
3597
+ structuredResponse({ humanVerdict: AIRunHumanVerdict.Rejected }) as never,
3598
+ );
3599
+ await tick(SETTLED_POLL_INTERVAL_MS);
3600
+
3601
+ expect(reportedVerdicts(second)).toEqual([AIRunHumanVerdict.Rejected]);
3602
+ expect(first).toHaveBeenCalledTimes(firstCallCount);
3603
+ });
3604
+ });