@oneuptime/common 14.0.9 → 14.0.10

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 (383) hide show
  1. package/Models/DatabaseModels/AutoRemediationSuggestion.ts +60 -0
  2. package/Models/DatabaseModels/CephCluster.ts +213 -0
  3. package/Models/DatabaseModels/DatabaseServer.ts +213 -0
  4. package/Models/DatabaseModels/DockerHost.ts +213 -0
  5. package/Models/DatabaseModels/DockerSwarmCluster.ts +213 -0
  6. package/Models/DatabaseModels/GlobalConfig.ts +1 -1
  7. package/Models/DatabaseModels/Host.ts +213 -0
  8. package/Models/DatabaseModels/Index.ts +2 -0
  9. package/Models/DatabaseModels/PodmanHost.ts +213 -0
  10. package/Models/DatabaseModels/ProxmoxCluster.ts +213 -0
  11. package/Models/DatabaseModels/ResourceAiAgent.ts +419 -0
  12. package/Models/DatabaseModels/RunnerJob.ts +144 -0
  13. package/Models/DatabaseModels/VMwareVCenter.ts +213 -0
  14. package/Server/API/AutoRemediationAPI.ts +392 -1
  15. package/Server/API/ResourceAiAccessAPI.ts +1669 -0
  16. package/Server/Infrastructure/Postgres/SchemaMigrations/1796300000000-AddResourceAiAgents.ts +423 -0
  17. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +2 -0
  18. package/Server/Infrastructure/Semaphore.ts +22 -0
  19. package/Server/Middleware/TelemetryIngest.ts +15 -5
  20. package/Server/Services/AnalyticsDatabaseService.ts +45 -1
  21. package/Server/Services/AutoRemediationRuleEngineService.ts +940 -112
  22. package/Server/Services/CephClusterService.ts +109 -1
  23. package/Server/Services/DatabaseServerService.ts +116 -1
  24. package/Server/Services/DockerHostService.ts +109 -1
  25. package/Server/Services/DockerSwarmClusterService.ts +113 -1
  26. package/Server/Services/HostService.ts +126 -4
  27. package/Server/Services/MetricRecordingRuleService.ts +47 -0
  28. package/Server/Services/PodmanHostService.ts +109 -1
  29. package/Server/Services/ProxmoxClusterService.ts +110 -1
  30. package/Server/Services/ResourceAiAccessService.ts +1439 -0
  31. package/Server/Services/ResourceAiAgentJobService.ts +202 -0
  32. package/Server/Services/ResourceAiAgentService.ts +2432 -0
  33. package/Server/Services/RunnerJobService.ts +611 -4
  34. package/Server/Services/TelemetryUsageBillingService.ts +28 -0
  35. package/Server/Services/TraceRecordingRuleService.ts +33 -0
  36. package/Server/Services/VMwareVCenterService.ts +110 -1
  37. package/Server/Utils/AI/Remediation/RemediationCommandTools.ts +1434 -32
  38. package/Server/Utils/AI/Remediation/RemediationExecutionRunner.ts +935 -21
  39. package/Server/Utils/AI/Remediation/RemediationPlanRunner.ts +25 -1
  40. package/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.ts +577 -0
  41. package/Server/Utils/AI/ResourceAccess/ResourceAccessContext.ts +271 -0
  42. package/Server/Utils/AI/ResourceAccess/ResourceAccessToolNames.ts +45 -0
  43. package/Server/Utils/AI/ResourceAccess/ResourceAiAccessSettings.ts +964 -0
  44. package/Server/Utils/AI/ResourceAccess/ResourceAiDeleteCleanup.ts +333 -0
  45. package/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.ts +873 -0
  46. package/Server/Utils/AI/SRE/AIInvestigationEngine.ts +72 -2
  47. package/Server/Utils/AI/SRE/AlertInvestigationRunner.ts +72 -5
  48. package/Server/Utils/AI/SRE/IncidentInvestigationRunner.ts +72 -5
  49. package/Server/Utils/AutoRemediation/CommandPlanExecutor.ts +396 -13
  50. package/Server/Utils/AutoRemediation/RemediationVerifier.ts +35 -2
  51. package/Server/Utils/Database/ProjectScopedReferenceValidator.ts +9 -1
  52. package/Server/Utils/SessionReplay/SessionReplayBudgetMetrics.ts +920 -0
  53. package/Server/Utils/SessionReplay/SessionReplayUsage.ts +84 -6
  54. package/Server/Utils/Workspace/MicrosoftTeams/Actions/Alert.ts +35 -15
  55. package/Server/Utils/Workspace/MicrosoftTeams/Actions/AlertEpisode.ts +33 -15
  56. package/Server/Utils/Workspace/MicrosoftTeams/Actions/Auth.ts +21 -1
  57. package/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.ts +298 -224
  58. package/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.ts +35 -15
  59. package/Server/Utils/Workspace/MicrosoftTeams/Actions/ScheduledMaintenance.ts +389 -175
  60. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +366 -143
  61. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsActivityDeduplicator.ts +163 -0
  62. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCardChoices.ts +396 -0
  63. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateCommands.ts +418 -0
  64. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsMessageSize.ts +152 -0
  65. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsReplies.ts +251 -0
  66. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsTimezone.ts +214 -0
  67. package/Tests/App/Dashboard/ClusterAccessNotice.test.tsx +93 -0
  68. package/Tests/App/Dashboard/DatabaseDocumentationMarkdown.test.ts +18 -6
  69. package/Tests/App/Dashboard/InvestigationInfrastructureTools.test.tsx +506 -0
  70. package/Tests/App/Dashboard/RemediationSuggestionCardDescription.test.tsx +209 -0
  71. package/Tests/App/Dashboard/RemediationSuggestionCardResource.test.tsx +317 -0
  72. package/Tests/App/Dashboard/ResourceAiAccessSettingsUtil.test.ts +921 -0
  73. package/Tests/App/Dashboard/ResourceAiAgentInstall.test.ts +860 -0
  74. package/Tests/App/Dashboard/ResourceAiAgentPage.test.tsx +1721 -0
  75. package/Tests/App/Dashboard/ResourceAiAgentStatus.test.ts +1002 -0
  76. package/Tests/App/Dashboard/ResourceAiInsightsPage.test.tsx +931 -0
  77. package/Tests/App/Dashboard/ResourceAiNavigation.test.tsx +575 -0
  78. package/Tests/App/Dashboard/RunbookStepTypeMaps.test.ts +38 -7
  79. package/Tests/Models/DatabaseModels/DatabaseServerModels.test.ts +33 -1
  80. package/Tests/Models/DatabaseModels/ResourceAiAccessColumns.test.ts +738 -0
  81. package/Tests/Models/DatabaseModels/ResourceAiAgentModel.test.ts +842 -0
  82. package/Tests/Server/API/AutoRemediationApproveResourceRound.test.ts +835 -0
  83. package/Tests/Server/API/ResourceAiAccessAPI.test.ts +2730 -0
  84. package/Tests/Server/Infrastructure/Postgres/AddDatabaseServerTablesMigration.test.ts +60 -0
  85. package/Tests/Server/Infrastructure/Postgres/AddResourceAiAgentsMigration.test.ts +659 -0
  86. package/Tests/Server/Infrastructure/SemaphoreMutex.test.ts +31 -0
  87. package/Tests/Server/Middleware/TelemetryIngestBrowserKey.test.ts +63 -5
  88. package/Tests/Server/Middleware/TelemetryIngestKubernetesAgentRunnerPinnedKey.test.ts +103 -5
  89. package/Tests/Server/Middleware/TelemetryIngestKubernetesAgentRunnerRateLimit.test.ts +19 -1
  90. package/Tests/Server/Services/AutoRemediationResourceRuleEngine.test.ts +1279 -0
  91. package/Tests/Server/Services/DatabaseServerService.test.ts +55 -0
  92. package/Tests/Server/Services/GroupTelemetryUsageExcludeNames.test.ts +299 -0
  93. package/Tests/Server/Services/HostServiceFindOrCreateMemo.test.ts +44 -0
  94. package/Tests/Server/Services/MonitorProbeServiceIntervalScheduling.test.ts +45 -6
  95. package/Tests/Server/Services/RecordingRuleReservedMetricName.test.ts +171 -0
  96. package/Tests/Server/Services/ResourceAiAccessChangeAuthorization.test.ts +256 -0
  97. package/Tests/Server/Services/ResourceAiAccessService.test.ts +1373 -0
  98. package/Tests/Server/Services/ResourceAiAgentJobService.test.ts +375 -0
  99. package/Tests/Server/Services/ResourceAiAgentServiceHelpers.test.ts +1114 -0
  100. package/Tests/Server/Services/ResourceAiAgentServiceLifecycle.test.ts +1050 -0
  101. package/Tests/Server/Services/ResourceAiAgentServiceRegister.test.ts +2251 -0
  102. package/Tests/Server/Services/ResourceAiSettingsCreate.test.ts +373 -0
  103. package/Tests/Server/Services/ResourceAiSettingsPermission.test.ts +1042 -0
  104. package/Tests/Server/Services/ResourceServiceDeleteCleansUpAi.test.ts +319 -0
  105. package/Tests/Server/Services/RunnerJobEnqueueKubectl.test.ts +105 -0
  106. package/Tests/Server/Services/RunnerJobEnqueueResourceCommand.test.ts +986 -0
  107. package/Tests/Server/Services/RunnerJobResourceCommandLane.test.ts +211 -0
  108. package/Tests/Server/Services/RunnerJobResourceCommandTimeoutAndRedaction.test.ts +352 -0
  109. package/Tests/Server/Services/TelemetryUsageBillingSloExclusion.test.ts +218 -0
  110. package/Tests/Server/TestingUtils/Services/FakeRunnerJobCount.ts +145 -0
  111. package/Tests/Server/Utils/AI/InvestigationInfrastructureAccessWiring.test.ts +453 -0
  112. package/Tests/Server/Utils/AI/InvestigationInfrastructureReport.test.ts +721 -0
  113. package/Tests/Server/Utils/AI/RemediationCommandTools.test.ts +94 -1
  114. package/Tests/Server/Utils/AI/RemediationCommandToolsResource.test.ts +1530 -0
  115. package/Tests/Server/Utils/AI/RemediationExecutionRunnerResourceMode.test.ts +1249 -0
  116. package/Tests/Server/Utils/AI/RemediationPlanRunner.test.ts +117 -0
  117. package/Tests/Server/Utils/AI/RemediationResourceCopyParity.test.ts +463 -0
  118. package/Tests/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.test.ts +722 -0
  119. package/Tests/Server/Utils/AI/ResourceAccess/ResourceAccessContext.test.ts +266 -0
  120. package/Tests/Server/Utils/AI/ResourceAccess/ResourceAiAccessSettings.test.ts +1220 -0
  121. package/Tests/Server/Utils/AI/ResourceAccess/ResourceAiDeleteCleanup.test.ts +569 -0
  122. package/Tests/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.test.ts +830 -0
  123. package/Tests/Server/Utils/AutoRemediation/CommandPlanExecutorResource.test.ts +717 -0
  124. package/Tests/Server/Utils/AutoRemediation/RemediationVerifierResourceFollowUp.test.ts +338 -0
  125. package/Tests/Server/Utils/Monitor/Criteria/SessionReplayBudgetTemplateCriteria.test.ts +422 -0
  126. package/Tests/Server/Utils/SessionReplay/SessionReplayBudgetMetrics.test.ts +1647 -0
  127. package/Tests/Server/Utils/SessionReplay/SessionReplayUsage.test.ts +143 -1
  128. package/Tests/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.test.ts +33 -3
  129. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsAccountNotLinked.test.ts +1093 -0
  130. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsActivityDeduplicator.test.ts +1049 -0
  131. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCardChoices.test.ts +1676 -0
  132. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateCards.test.ts +2884 -0
  133. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateCommands.test.ts +2490 -0
  134. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateSubmit.test.ts +2293 -0
  135. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateSubmitServerTimezone.test.ts +386 -0
  136. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsMessageSize.test.ts +1477 -0
  137. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsReplies.test.ts +1967 -0
  138. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsStripHtmlTags.test.ts +92 -0
  139. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsSubmittedFormRemoval.test.ts +1819 -0
  140. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsTimezone.test.ts +1033 -0
  141. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsTimezoneServerZone.test.ts +610 -0
  142. package/Tests/Server/Utils/Workspace/MicrosoftTeamsBotMessageHandling.test.ts +2610 -0
  143. package/Tests/Server/Utils/Workspace/MicrosoftTeamsCreateCommandsEndToEnd.test.ts +4672 -0
  144. package/Tests/Server/Utils/Workspace/WorkspaceCreateProjectReferences.test.ts +190 -65
  145. package/Tests/Types/AutoRemediation/AiRemediationCommandPlan.test.ts +10 -4
  146. package/Tests/Types/AutoRemediation/AiRemediationCommandPlanResourceCommand.test.ts +305 -0
  147. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCatalog.test.ts +277 -13
  148. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationUtil.test.ts +113 -0
  149. package/Tests/Types/Monitor/RumAlertTemplates.test.ts +773 -2
  150. package/Tests/Types/ResourceAiAgent/AiResourceType.test.ts +419 -0
  151. package/Tests/Types/ResourceAiAgent/ResourceAiAccess.test.ts +517 -0
  152. package/Tests/Types/Runbook/RunbookStepType.test.ts +147 -8
  153. package/Tests/UI/Rum/RecordingHealthDashboard.test.tsx +769 -1
  154. package/Tests/Utils/AiRemediation/Resource/CephCommandPolicy.test.ts +1653 -0
  155. package/Tests/Utils/AiRemediation/Resource/CephOutputRedaction.test.ts +204 -0
  156. package/Tests/Utils/AiRemediation/Resource/DatabaseCommandPolicy.test.ts +1077 -0
  157. package/Tests/Utils/AiRemediation/Resource/DatabaseDiagnosticCatalog.test.ts +558 -0
  158. package/Tests/Utils/AiRemediation/Resource/DatabaseQueryRedactor.test.ts +834 -0
  159. package/Tests/Utils/AiRemediation/Resource/DockerCliGrammar.test.ts +747 -0
  160. package/Tests/Utils/AiRemediation/Resource/DockerEngineCommandPolicy.test.ts +1259 -0
  161. package/Tests/Utils/AiRemediation/Resource/DockerOutputRedaction.test.ts +386 -0
  162. package/Tests/Utils/AiRemediation/Resource/DockerSwarmCommandPolicy.test.ts +782 -0
  163. package/Tests/Utils/AiRemediation/Resource/GovcCommandPolicy.test.ts +2259 -0
  164. package/Tests/Utils/AiRemediation/Resource/HostCommandPolicy.test.ts +2019 -0
  165. package/Tests/Utils/AiRemediation/Resource/ProxmoxCommandPolicy.test.ts +2497 -0
  166. package/Tests/Utils/AiRemediation/Resource/ResourceCommandPolicy.test.ts +1305 -0
  167. package/Tests/Utils/AiRemediation/Resource/ResourceCommandPolicyCore.test.ts +585 -0
  168. package/Tests/Utils/AiRemediation/Resource/ResourceOutputRedactor.test.ts +334 -0
  169. package/Tests/Utils/AiRemediation/Resource/ResourceOutputRedactorCopyParity.test.ts +98 -0
  170. package/Tests/Utils/AiRemediation/Resource/ResourcePolicyImportClosure.test.ts +391 -0
  171. package/Tests/Utils/AiRemediation/ResourceAiAgentPolicyCopyParity.test.ts +497 -0
  172. package/Tests/Utils/SessionReplay/SessionReplayBudgetMetricType.test.ts +383 -0
  173. package/Types/AI/ResourceAiAccessApi.ts +140 -0
  174. package/Types/AI/ResourceAiAccessPermissions.ts +126 -0
  175. package/Types/AutoRemediation/AiRemediationCommandPlan.ts +183 -2
  176. package/Types/Monitor/Recommendation/MonitorRecommendationCatalog.ts +55 -22
  177. package/Types/Monitor/Recommendation/MonitorRecommendationTypes.ts +35 -3
  178. package/Types/Monitor/RumAlertTemplates.ts +351 -4
  179. package/Types/ResourceAiAgent/AiResourceType.ts +310 -0
  180. package/Types/ResourceAiAgent/ResourceAiAccess.ts +574 -0
  181. package/Types/Rum/SessionReplayBudgetMetricType.ts +47 -0
  182. package/Types/Runbook/RunbookStepType.ts +29 -0
  183. package/Types/Telemetry/TelemetryIngestSurface.ts +14 -2
  184. package/Utils/AI/InvestigationReport.ts +121 -15
  185. package/Utils/AiRemediation/Resource/CephCommandPolicy.ts +1936 -0
  186. package/Utils/AiRemediation/Resource/DatabaseCommandPolicy.ts +166 -0
  187. package/Utils/AiRemediation/Resource/DatabaseDiagnosticCatalog.ts +1532 -0
  188. package/Utils/AiRemediation/Resource/DatabaseQueryRedactor.ts +1394 -0
  189. package/Utils/AiRemediation/Resource/DockerCliGrammar.ts +1839 -0
  190. package/Utils/AiRemediation/Resource/DockerEngineCommandPolicy.ts +490 -0
  191. package/Utils/AiRemediation/Resource/DockerSwarmCommandPolicy.ts +687 -0
  192. package/Utils/AiRemediation/Resource/GovcCommandPolicy.ts +2096 -0
  193. package/Utils/AiRemediation/Resource/HostCommandPolicy.ts +2982 -0
  194. package/Utils/AiRemediation/Resource/ProxmoxCommandPolicy.ts +1679 -0
  195. package/Utils/AiRemediation/Resource/ResourceCommandPolicy.ts +851 -0
  196. package/Utils/AiRemediation/Resource/ResourceCommandPolicyCore.ts +593 -0
  197. package/Utils/AiRemediation/Resource/ResourceOutputRedactor.ts +2812 -0
  198. package/Utils/SessionReplay/SessionReplayBudgetMetricType.ts +184 -0
  199. package/build/dist/Models/DatabaseModels/AutoRemediationSuggestion.js +62 -0
  200. package/build/dist/Models/DatabaseModels/AutoRemediationSuggestion.js.map +1 -1
  201. package/build/dist/Models/DatabaseModels/CephCluster.js +219 -0
  202. package/build/dist/Models/DatabaseModels/CephCluster.js.map +1 -1
  203. package/build/dist/Models/DatabaseModels/DatabaseServer.js +219 -0
  204. package/build/dist/Models/DatabaseModels/DatabaseServer.js.map +1 -1
  205. package/build/dist/Models/DatabaseModels/DockerHost.js +219 -0
  206. package/build/dist/Models/DatabaseModels/DockerHost.js.map +1 -1
  207. package/build/dist/Models/DatabaseModels/DockerSwarmCluster.js +219 -0
  208. package/build/dist/Models/DatabaseModels/DockerSwarmCluster.js.map +1 -1
  209. package/build/dist/Models/DatabaseModels/GlobalConfig.js +1 -1
  210. package/build/dist/Models/DatabaseModels/GlobalConfig.js.map +1 -1
  211. package/build/dist/Models/DatabaseModels/Host.js +219 -0
  212. package/build/dist/Models/DatabaseModels/Host.js.map +1 -1
  213. package/build/dist/Models/DatabaseModels/Index.js +2 -0
  214. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  215. package/build/dist/Models/DatabaseModels/PodmanHost.js +219 -0
  216. package/build/dist/Models/DatabaseModels/PodmanHost.js.map +1 -1
  217. package/build/dist/Models/DatabaseModels/ProxmoxCluster.js +219 -0
  218. package/build/dist/Models/DatabaseModels/ProxmoxCluster.js.map +1 -1
  219. package/build/dist/Models/DatabaseModels/ResourceAiAgent.js +439 -0
  220. package/build/dist/Models/DatabaseModels/ResourceAiAgent.js.map +1 -0
  221. package/build/dist/Models/DatabaseModels/RunnerJob.js +145 -0
  222. package/build/dist/Models/DatabaseModels/RunnerJob.js.map +1 -1
  223. package/build/dist/Models/DatabaseModels/VMwareVCenter.js +219 -0
  224. package/build/dist/Models/DatabaseModels/VMwareVCenter.js.map +1 -1
  225. package/build/dist/Server/API/AutoRemediationAPI.js +231 -1
  226. package/build/dist/Server/API/AutoRemediationAPI.js.map +1 -1
  227. package/build/dist/Server/API/ResourceAiAccessAPI.js +1119 -0
  228. package/build/dist/Server/API/ResourceAiAccessAPI.js.map +1 -0
  229. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796300000000-AddResourceAiAgents.js +168 -0
  230. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796300000000-AddResourceAiAgents.js.map +1 -0
  231. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +2 -0
  232. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  233. package/build/dist/Server/Infrastructure/Semaphore.js +6 -0
  234. package/build/dist/Server/Infrastructure/Semaphore.js.map +1 -1
  235. package/build/dist/Server/Middleware/TelemetryIngest.js +12 -5
  236. package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
  237. package/build/dist/Server/Services/AnalyticsDatabaseService.js +26 -1
  238. package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
  239. package/build/dist/Server/Services/AutoRemediationRuleEngineService.js +601 -3
  240. package/build/dist/Server/Services/AutoRemediationRuleEngineService.js.map +1 -1
  241. package/build/dist/Server/Services/CephClusterService.js +104 -0
  242. package/build/dist/Server/Services/CephClusterService.js.map +1 -1
  243. package/build/dist/Server/Services/DatabaseServerService.js +99 -0
  244. package/build/dist/Server/Services/DatabaseServerService.js.map +1 -1
  245. package/build/dist/Server/Services/DockerHostService.js +104 -0
  246. package/build/dist/Server/Services/DockerHostService.js.map +1 -1
  247. package/build/dist/Server/Services/DockerSwarmClusterService.js +104 -0
  248. package/build/dist/Server/Services/DockerSwarmClusterService.js.map +1 -1
  249. package/build/dist/Server/Services/HostService.js +114 -2
  250. package/build/dist/Server/Services/HostService.js.map +1 -1
  251. package/build/dist/Server/Services/MetricRecordingRuleService.js +46 -0
  252. package/build/dist/Server/Services/MetricRecordingRuleService.js.map +1 -1
  253. package/build/dist/Server/Services/PodmanHostService.js +104 -0
  254. package/build/dist/Server/Services/PodmanHostService.js.map +1 -1
  255. package/build/dist/Server/Services/ProxmoxClusterService.js +104 -0
  256. package/build/dist/Server/Services/ProxmoxClusterService.js.map +1 -1
  257. package/build/dist/Server/Services/ResourceAiAccessService.js +1028 -0
  258. package/build/dist/Server/Services/ResourceAiAccessService.js.map +1 -0
  259. package/build/dist/Server/Services/ResourceAiAgentJobService.js +173 -0
  260. package/build/dist/Server/Services/ResourceAiAgentJobService.js.map +1 -0
  261. package/build/dist/Server/Services/ResourceAiAgentService.js +1687 -0
  262. package/build/dist/Server/Services/ResourceAiAgentService.js.map +1 -0
  263. package/build/dist/Server/Services/RunnerJobService.js +344 -5
  264. package/build/dist/Server/Services/RunnerJobService.js.map +1 -1
  265. package/build/dist/Server/Services/TelemetryUsageBillingService.js +26 -0
  266. package/build/dist/Server/Services/TelemetryUsageBillingService.js.map +1 -1
  267. package/build/dist/Server/Services/TraceRecordingRuleService.js +37 -0
  268. package/build/dist/Server/Services/TraceRecordingRuleService.js.map +1 -1
  269. package/build/dist/Server/Services/VMwareVCenterService.js +104 -0
  270. package/build/dist/Server/Services/VMwareVCenterService.js.map +1 -1
  271. package/build/dist/Server/Utils/AI/Remediation/RemediationCommandTools.js +1029 -30
  272. package/build/dist/Server/Utils/AI/Remediation/RemediationCommandTools.js.map +1 -1
  273. package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js +633 -28
  274. package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js.map +1 -1
  275. package/build/dist/Server/Utils/AI/Remediation/RemediationPlanRunner.js +21 -1
  276. package/build/dist/Server/Utils/AI/Remediation/RemediationPlanRunner.js.map +1 -1
  277. package/build/dist/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.js +330 -0
  278. package/build/dist/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.js.map +1 -0
  279. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAccessContext.js +160 -0
  280. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAccessContext.js.map +1 -0
  281. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAccessToolNames.js +33 -0
  282. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAccessToolNames.js.map +1 -0
  283. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAiAccessSettings.js +640 -0
  284. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAiAccessSettings.js.map +1 -0
  285. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAiDeleteCleanup.js +226 -0
  286. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAiDeleteCleanup.js.map +1 -0
  287. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.js +600 -0
  288. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.js.map +1 -0
  289. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js +50 -4
  290. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -1
  291. package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js +55 -4
  292. package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js.map +1 -1
  293. package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js +55 -4
  294. package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js.map +1 -1
  295. package/build/dist/Server/Utils/AutoRemediation/CommandPlanExecutor.js +290 -13
  296. package/build/dist/Server/Utils/AutoRemediation/CommandPlanExecutor.js.map +1 -1
  297. package/build/dist/Server/Utils/AutoRemediation/RemediationVerifier.js +29 -1
  298. package/build/dist/Server/Utils/AutoRemediation/RemediationVerifier.js.map +1 -1
  299. package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js +9 -1
  300. package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js.map +1 -1
  301. package/build/dist/Server/Utils/SessionReplay/SessionReplayBudgetMetrics.js +627 -0
  302. package/build/dist/Server/Utils/SessionReplay/SessionReplayBudgetMetrics.js.map +1 -0
  303. package/build/dist/Server/Utils/SessionReplay/SessionReplayUsage.js +60 -5
  304. package/build/dist/Server/Utils/SessionReplay/SessionReplayUsage.js.map +1 -1
  305. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Alert.js +19 -15
  306. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Alert.js.map +1 -1
  307. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/AlertEpisode.js +19 -15
  308. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/AlertEpisode.js.map +1 -1
  309. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Auth.js +17 -1
  310. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Auth.js.map +1 -1
  311. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.js +183 -209
  312. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.js.map +1 -1
  313. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.js +19 -15
  314. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.js.map +1 -1
  315. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/ScheduledMaintenance.js +233 -167
  316. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/ScheduledMaintenance.js.map +1 -1
  317. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +263 -110
  318. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
  319. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsActivityDeduplicator.js +129 -0
  320. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsActivityDeduplicator.js.map +1 -0
  321. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCardChoices.js +266 -0
  322. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCardChoices.js.map +1 -0
  323. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateCommands.js +258 -0
  324. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateCommands.js.map +1 -0
  325. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsMessageSize.js +104 -0
  326. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsMessageSize.js.map +1 -0
  327. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsReplies.js +183 -0
  328. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsReplies.js.map +1 -0
  329. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsTimezone.js +123 -0
  330. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsTimezone.js.map +1 -0
  331. package/build/dist/Types/AI/ResourceAiAccessApi.js +30 -0
  332. package/build/dist/Types/AI/ResourceAiAccessApi.js.map +1 -0
  333. package/build/dist/Types/AI/ResourceAiAccessPermissions.js +98 -0
  334. package/build/dist/Types/AI/ResourceAiAccessPermissions.js.map +1 -0
  335. package/build/dist/Types/AutoRemediation/AiRemediationCommandPlan.js +116 -29
  336. package/build/dist/Types/AutoRemediation/AiRemediationCommandPlan.js.map +1 -1
  337. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js +47 -21
  338. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js.map +1 -1
  339. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js +5 -0
  340. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js.map +1 -1
  341. package/build/dist/Types/Monitor/RumAlertTemplates.js +199 -3
  342. package/build/dist/Types/Monitor/RumAlertTemplates.js.map +1 -1
  343. package/build/dist/Types/ResourceAiAgent/AiResourceType.js +242 -0
  344. package/build/dist/Types/ResourceAiAgent/AiResourceType.js.map +1 -0
  345. package/build/dist/Types/ResourceAiAgent/ResourceAiAccess.js +275 -0
  346. package/build/dist/Types/ResourceAiAgent/ResourceAiAccess.js.map +1 -0
  347. package/build/dist/Types/Rum/SessionReplayBudgetMetricType.js +45 -0
  348. package/build/dist/Types/Rum/SessionReplayBudgetMetricType.js.map +1 -0
  349. package/build/dist/Types/Runbook/RunbookStepType.js +27 -0
  350. package/build/dist/Types/Runbook/RunbookStepType.js.map +1 -1
  351. package/build/dist/Types/Telemetry/TelemetryIngestSurface.js +13 -2
  352. package/build/dist/Types/Telemetry/TelemetryIngestSurface.js.map +1 -1
  353. package/build/dist/Utils/AI/InvestigationReport.js +71 -11
  354. package/build/dist/Utils/AI/InvestigationReport.js.map +1 -1
  355. package/build/dist/Utils/AiRemediation/Resource/CephCommandPolicy.js +1462 -0
  356. package/build/dist/Utils/AiRemediation/Resource/CephCommandPolicy.js.map +1 -0
  357. package/build/dist/Utils/AiRemediation/Resource/DatabaseCommandPolicy.js +122 -0
  358. package/build/dist/Utils/AiRemediation/Resource/DatabaseCommandPolicy.js.map +1 -0
  359. package/build/dist/Utils/AiRemediation/Resource/DatabaseDiagnosticCatalog.js +1139 -0
  360. package/build/dist/Utils/AiRemediation/Resource/DatabaseDiagnosticCatalog.js.map +1 -0
  361. package/build/dist/Utils/AiRemediation/Resource/DatabaseQueryRedactor.js +1060 -0
  362. package/build/dist/Utils/AiRemediation/Resource/DatabaseQueryRedactor.js.map +1 -0
  363. package/build/dist/Utils/AiRemediation/Resource/DockerCliGrammar.js +1301 -0
  364. package/build/dist/Utils/AiRemediation/Resource/DockerCliGrammar.js.map +1 -0
  365. package/build/dist/Utils/AiRemediation/Resource/DockerEngineCommandPolicy.js +370 -0
  366. package/build/dist/Utils/AiRemediation/Resource/DockerEngineCommandPolicy.js.map +1 -0
  367. package/build/dist/Utils/AiRemediation/Resource/DockerSwarmCommandPolicy.js +498 -0
  368. package/build/dist/Utils/AiRemediation/Resource/DockerSwarmCommandPolicy.js.map +1 -0
  369. package/build/dist/Utils/AiRemediation/Resource/GovcCommandPolicy.js +1565 -0
  370. package/build/dist/Utils/AiRemediation/Resource/GovcCommandPolicy.js.map +1 -0
  371. package/build/dist/Utils/AiRemediation/Resource/HostCommandPolicy.js +2206 -0
  372. package/build/dist/Utils/AiRemediation/Resource/HostCommandPolicy.js.map +1 -0
  373. package/build/dist/Utils/AiRemediation/Resource/ProxmoxCommandPolicy.js +1129 -0
  374. package/build/dist/Utils/AiRemediation/Resource/ProxmoxCommandPolicy.js.map +1 -0
  375. package/build/dist/Utils/AiRemediation/Resource/ResourceCommandPolicy.js +565 -0
  376. package/build/dist/Utils/AiRemediation/Resource/ResourceCommandPolicy.js.map +1 -0
  377. package/build/dist/Utils/AiRemediation/Resource/ResourceCommandPolicyCore.js +408 -0
  378. package/build/dist/Utils/AiRemediation/Resource/ResourceCommandPolicyCore.js.map +1 -0
  379. package/build/dist/Utils/AiRemediation/Resource/ResourceOutputRedactor.js +1910 -0
  380. package/build/dist/Utils/AiRemediation/Resource/ResourceOutputRedactor.js.map +1 -0
  381. package/build/dist/Utils/SessionReplay/SessionReplayBudgetMetricType.js +160 -0
  382. package/build/dist/Utils/SessionReplay/SessionReplayBudgetMetricType.js.map +1 -0
  383. package/package.json +1 -1
@@ -0,0 +1,506 @@
1
+ import "@testing-library/jest-dom";
2
+ import { afterEach, describe, expect, jest, test } from "@jest/globals";
3
+ import { cleanup, render, screen, within } from "@testing-library/react";
4
+ import * as React from "react";
5
+ import getJestMockFunction, { MockFunction } from "../../MockType";
6
+
7
+ /*
8
+ * How the investigation panel words the tools that reach infrastructure
9
+ * resources through their AI agents (run_infrastructure_command,
10
+ * list_infrastructure_access) — the same way it words kubectl, and never
11
+ * as telemetry queries:
12
+ *
13
+ * - their outcomes ("Succeeded", "The command returned an error",
14
+ * "2 resources"), evidence descriptions and notes;
15
+ * - the activity feed's labels and failure wording ("did not run on the
16
+ * infrastructure", "no result came back — it may have run");
17
+ * - the run summary: infrastructure calls are taken out of "telemetry
18
+ * queries" and counted as their own usage item;
19
+ * - the kubectl-only names and summary stay exactly as they were.
20
+ */
21
+
22
+ const postMock: MockFunction = getJestMockFunction();
23
+
24
+ jest.mock("../../../UI/Utils/API/API", () => {
25
+ return {
26
+ __esModule: true,
27
+ default: {
28
+ post: (...args: Array<unknown>) => {
29
+ return postMock(...args);
30
+ },
31
+ getFriendlyMessage: (): string => {
32
+ return "error";
33
+ },
34
+ },
35
+ };
36
+ });
37
+
38
+ jest.mock("../../../UI/Utils/ModelAPI/ModelAPI", () => {
39
+ return {
40
+ __esModule: true,
41
+ default: {
42
+ getCommonHeaders: (): Record<string, string> => {
43
+ return {};
44
+ },
45
+ },
46
+ };
47
+ });
48
+
49
+ jest.mock(
50
+ "../../../../App/FeatureSet/Dashboard/src/Components/AIChat/Widgets/WidgetRenderer",
51
+ () => {
52
+ return {
53
+ __esModule: true,
54
+ default: (): React.ReactElement => {
55
+ return React.createElement("div", { "data-testid": "evidence-widget" });
56
+ },
57
+ };
58
+ },
59
+ );
60
+
61
+ import ChatActivityFeed, {
62
+ CLUSTER_TOOL_NAMES,
63
+ InfrastructureActivitySummary,
64
+ KubectlActivitySummary,
65
+ summarizeKubectlActivity,
66
+ } from "../../../../App/FeatureSet/Dashboard/src/Components/AIChat/ChatActivityFeed";
67
+ import {
68
+ describeClusterEvidenceTool,
69
+ describeClusterToolOutcome,
70
+ formatEvidenceOutcome,
71
+ getClusterEvidenceNote,
72
+ INFRASTRUCTURE_RESULT_UNKNOWN_EVENT_PREFIX,
73
+ INFRASTRUCTURE_TOOL_NAMES,
74
+ isClusterToolName,
75
+ isInfrastructureResultUnknownMessage,
76
+ isInfrastructureToolName,
77
+ isLiveInfrastructureToolName,
78
+ } from "../../../../App/FeatureSet/Dashboard/src/Components/AI/ClusterToolFormat";
79
+ import {
80
+ describeInfrastructureUsage,
81
+ InvestigationUsageLine,
82
+ } from "../../../../App/FeatureSet/Dashboard/src/Components/AI/InvestigationReport/InvestigationRunDetails";
83
+ import { describeEvidenceTool } from "../../../../App/FeatureSet/Dashboard/src/Utils/InvestigationEvidenceFormat";
84
+ import {
85
+ LIST_INFRASTRUCTURE_ACCESS_TOOL_NAME,
86
+ RUN_INFRASTRUCTURE_COMMAND_TOOL_NAME,
87
+ } from "../../../Server/Utils/AI/ResourceAccess/ResourceAccessToolNames";
88
+ import AIRunEvent from "../../../Models/DatabaseModels/AIRunEvent";
89
+ import { AIRunEventResultSummary } from "../../../Types/AI/AIChatTypes";
90
+ import AIRunEventType from "../../../Types/AI/AIRunEventType";
91
+ import IconProp from "../../../Types/Icon/IconProp";
92
+ import {
93
+ LIST_CLUSTER_ACCESS_TOOL_NAME,
94
+ RUN_KUBECTL_TOOL_NAME,
95
+ } from "../../../Types/Kubernetes/KubernetesClusterAiAccessToolNames";
96
+ import ObjectID from "../../../Types/ObjectID";
97
+
98
+ interface StepEvent {
99
+ eventType: AIRunEventType;
100
+ toolName?: string | undefined;
101
+ resultSummary?: AIRunEventResultSummary | undefined;
102
+ }
103
+
104
+ function events(steps: Array<StepEvent>): Array<AIRunEvent> {
105
+ return steps.map((step: StepEvent): AIRunEvent => {
106
+ const event: AIRunEvent = new AIRunEvent(ObjectID.generate());
107
+ event.eventType = step.eventType;
108
+
109
+ if (step.toolName) {
110
+ event.toolName = step.toolName;
111
+ }
112
+
113
+ if (step.resultSummary) {
114
+ event.resultSummary = step.resultSummary;
115
+ }
116
+
117
+ return event;
118
+ });
119
+ }
120
+
121
+ const RESULT_UNKNOWN_MESSAGE: string = `${INFRASTRUCTURE_RESULT_UNKNOWN_EVENT_PREFIX} the Docker AI agent of Docker host "web-1" took the command, but no result came back, so whether it ran is unknown.`;
122
+
123
+ function infrastructure(
124
+ outcome: "succeeded" | "errored" | "not-run" | "unknown",
125
+ ): Array<StepEvent> {
126
+ return [
127
+ {
128
+ eventType: AIRunEventType.ToolCallStarted,
129
+ toolName: RUN_INFRASTRUCTURE_COMMAND_TOOL_NAME,
130
+ },
131
+ outcome === "not-run" || outcome === "unknown"
132
+ ? {
133
+ eventType: AIRunEventType.ToolCallFailed,
134
+ toolName: RUN_INFRASTRUCTURE_COMMAND_TOOL_NAME,
135
+ resultSummary: {
136
+ errorMessage:
137
+ outcome === "unknown"
138
+ ? RESULT_UNKNOWN_MESSAGE
139
+ : 'No command was run on Docker host "web-1": the Docker AI agent did not pick up the command in time.',
140
+ },
141
+ }
142
+ : {
143
+ eventType: AIRunEventType.ToolCallCompleted,
144
+ toolName: RUN_INFRASTRUCTURE_COMMAND_TOOL_NAME,
145
+ resultSummary: {
146
+ rowCount: outcome === "succeeded" ? 1 : 0,
147
+ durationInMs: 2000,
148
+ },
149
+ },
150
+ ];
151
+ }
152
+
153
+ afterEach(() => {
154
+ cleanup();
155
+ });
156
+
157
+ describe("the infrastructure tool names", () => {
158
+ test("are their own list, and the cluster list is unchanged", () => {
159
+ expect(INFRASTRUCTURE_TOOL_NAMES).toEqual([
160
+ RUN_INFRASTRUCTURE_COMMAND_TOOL_NAME,
161
+ LIST_INFRASTRUCTURE_ACCESS_TOOL_NAME,
162
+ ]);
163
+ expect(CLUSTER_TOOL_NAMES).toEqual([
164
+ RUN_KUBECTL_TOOL_NAME,
165
+ LIST_CLUSTER_ACCESS_TOOL_NAME,
166
+ ]);
167
+ expect(isClusterToolName(RUN_INFRASTRUCTURE_COMMAND_TOOL_NAME)).toBe(false);
168
+ expect(isInfrastructureToolName(RUN_INFRASTRUCTURE_COMMAND_TOOL_NAME)).toBe(
169
+ true,
170
+ );
171
+ expect(isInfrastructureToolName(RUN_KUBECTL_TOOL_NAME)).toBe(false);
172
+ expect(isInfrastructureToolName(undefined)).toBe(false);
173
+ });
174
+
175
+ test("are live infrastructure like the cluster tools; telemetry is not", () => {
176
+ for (const toolName of [
177
+ RUN_KUBECTL_TOOL_NAME,
178
+ LIST_CLUSTER_ACCESS_TOOL_NAME,
179
+ RUN_INFRASTRUCTURE_COMMAND_TOOL_NAME,
180
+ LIST_INFRASTRUCTURE_ACCESS_TOOL_NAME,
181
+ ]) {
182
+ expect(isLiveInfrastructureToolName(toolName)).toBe(true);
183
+ }
184
+
185
+ expect(isLiveInfrastructureToolName("query_metrics")).toBe(false);
186
+ expect(isLiveInfrastructureToolName(null)).toBe(false);
187
+ });
188
+
189
+ test("recognise the server's result-unknown event", () => {
190
+ expect(isInfrastructureResultUnknownMessage(RESULT_UNKNOWN_MESSAGE)).toBe(
191
+ true,
192
+ );
193
+ expect(
194
+ isInfrastructureResultUnknownMessage(
195
+ 'No command was run on Docker host "web-1".',
196
+ ),
197
+ ).toBe(false);
198
+ expect(isInfrastructureResultUnknownMessage(undefined)).toBe(false);
199
+ });
200
+ });
201
+
202
+ describe("infrastructure tool outcomes and evidence", () => {
203
+ test("a command says whether it succeeded or returned an error, never rows", () => {
204
+ expect(
205
+ describeClusterToolOutcome(RUN_INFRASTRUCTURE_COMMAND_TOOL_NAME, 1),
206
+ ).toEqual({ label: "Succeeded", detail: "succeeded", isError: false });
207
+ expect(
208
+ describeClusterToolOutcome(RUN_INFRASTRUCTURE_COMMAND_TOOL_NAME, 0),
209
+ ).toEqual({
210
+ label: "The command returned an error",
211
+ detail: "the command returned an error",
212
+ isError: true,
213
+ });
214
+ expect(formatEvidenceOutcome(RUN_INFRASTRUCTURE_COMMAND_TOOL_NAME, 1)).toBe(
215
+ "Succeeded",
216
+ );
217
+ });
218
+
219
+ test("a listing counts resources", () => {
220
+ expect(
221
+ describeClusterToolOutcome(LIST_INFRASTRUCTURE_ACCESS_TOOL_NAME, 0)
222
+ ?.label,
223
+ ).toBe("No resources");
224
+ expect(
225
+ describeClusterToolOutcome(LIST_INFRASTRUCTURE_ACCESS_TOOL_NAME, 1)
226
+ ?.label,
227
+ ).toBe("1 resource");
228
+ expect(
229
+ describeClusterToolOutcome(LIST_INFRASTRUCTURE_ACCESS_TOOL_NAME, 3)
230
+ ?.detail,
231
+ ).toBe("3 resources");
232
+ });
233
+
234
+ test("describes each tool and never promises rows", () => {
235
+ expect(describeEvidenceTool(RUN_INFRASTRUCTURE_COMMAND_TOOL_NAME)).toEqual({
236
+ description: "Ran a read-only infrastructure command",
237
+ icon: IconProp.Terminal,
238
+ category: "Infrastructure",
239
+ });
240
+ expect(
241
+ describeClusterEvidenceTool(LIST_INFRASTRUCTURE_ACCESS_TOOL_NAME),
242
+ ).toEqual({
243
+ description: "Listed the infrastructure OneUptime AI can inspect",
244
+ icon: IconProp.Server,
245
+ category: "Infrastructure",
246
+ });
247
+
248
+ for (const toolName of INFRASTRUCTURE_TOOL_NAMES) {
249
+ const note: string | null = getClusterEvidenceNote(toolName);
250
+ expect(note).toBeTruthy();
251
+ expect(note).not.toContain("its rows");
252
+ }
253
+ });
254
+
255
+ test("leaves the kubectl wording as it was", () => {
256
+ expect(describeClusterToolOutcome(RUN_KUBECTL_TOOL_NAME, 0)?.label).toBe(
257
+ "kubectl returned an error",
258
+ );
259
+ expect(describeClusterToolOutcome("query_metrics", 3)).toBeNull();
260
+ });
261
+ });
262
+
263
+ describe("summarizeKubectlActivity with infrastructure calls", () => {
264
+ test("keeps infrastructure calls out of telemetry and counts them on their own", () => {
265
+ const summary: KubectlActivitySummary = summarizeKubectlActivity(
266
+ events([
267
+ { eventType: AIRunEventType.RunStarted },
268
+ {
269
+ eventType: AIRunEventType.ToolCallStarted,
270
+ toolName: LIST_INFRASTRUCTURE_ACCESS_TOOL_NAME,
271
+ },
272
+ {
273
+ eventType: AIRunEventType.ToolCallCompleted,
274
+ toolName: LIST_INFRASTRUCTURE_ACCESS_TOOL_NAME,
275
+ resultSummary: { rowCount: 2 },
276
+ },
277
+ ...infrastructure("succeeded"),
278
+ ...infrastructure("errored"),
279
+ ...infrastructure("not-run"),
280
+ ...infrastructure("unknown"),
281
+ ]),
282
+ );
283
+
284
+ expect(summary.executed).toBe(0);
285
+ expect(summary.notRun).toBe(0);
286
+ // Every infrastructure call started is not a telemetry query.
287
+ expect(summary.clusterToolCalls).toBe(5);
288
+ expect(summary.infrastructure).toEqual({
289
+ executed: 2,
290
+ succeeded: 1,
291
+ notRun: 1,
292
+ unknown: 1,
293
+ });
294
+ });
295
+
296
+ test("leaves the summary exactly as it was without infrastructure calls", () => {
297
+ const summary: KubectlActivitySummary = summarizeKubectlActivity(
298
+ events([
299
+ { eventType: AIRunEventType.RunStarted },
300
+ {
301
+ eventType: AIRunEventType.ToolCallStarted,
302
+ toolName: RUN_KUBECTL_TOOL_NAME,
303
+ },
304
+ ]),
305
+ );
306
+
307
+ expect(summary).toEqual({
308
+ executed: 0,
309
+ succeeded: 0,
310
+ notRun: 0,
311
+ unknown: 0,
312
+ clusterToolCalls: 1,
313
+ });
314
+ expect("infrastructure" in summary).toBe(false);
315
+ });
316
+
317
+ test("counts only the latest attempt", () => {
318
+ const summary: KubectlActivitySummary = summarizeKubectlActivity(
319
+ events([
320
+ { eventType: AIRunEventType.RunStarted },
321
+ ...infrastructure("succeeded"),
322
+ { eventType: AIRunEventType.RunStarted },
323
+ ...infrastructure("not-run"),
324
+ ]),
325
+ );
326
+
327
+ expect(summary.infrastructure).toEqual({
328
+ executed: 0,
329
+ succeeded: 0,
330
+ notRun: 1,
331
+ unknown: 0,
332
+ });
333
+ });
334
+ });
335
+
336
+ describe("ChatActivityFeed infrastructure steps", () => {
337
+ test("labels a command and says whether it succeeded, returned an error or never ran", () => {
338
+ render(
339
+ <ChatActivityFeed
340
+ events={events([
341
+ ...infrastructure("succeeded"),
342
+ ...infrastructure("errored"),
343
+ ...infrastructure("not-run"),
344
+ ])}
345
+ hideChrome={true}
346
+ />,
347
+ );
348
+
349
+ expect(
350
+ screen.getAllByText("Running a command on the infrastructure"),
351
+ ).toHaveLength(3);
352
+ expect(screen.getByText("· succeeded · 2.0s")).toBeVisible();
353
+ expect(
354
+ screen.getByText("· the command returned an error · 2.0s"),
355
+ ).toBeVisible();
356
+ expect(
357
+ screen.getByText("· did not run on the infrastructure"),
358
+ ).toBeVisible();
359
+ expect(screen.queryByText(/row/)).toBeNull();
360
+ expect(screen.queryByText(/retrying/)).toBeNull();
361
+ });
362
+
363
+ test("says a command whose result never came back may have run", () => {
364
+ render(
365
+ <ChatActivityFeed
366
+ events={events([...infrastructure("unknown")])}
367
+ hideChrome={true}
368
+ />,
369
+ );
370
+
371
+ expect(
372
+ screen.getByText("· no result came back — it may have run"),
373
+ ).toBeVisible();
374
+ expect(screen.queryByText(/did not run/)).toBeNull();
375
+ });
376
+
377
+ test("labels the listing and counts it in resources", () => {
378
+ render(
379
+ <ChatActivityFeed
380
+ events={events([
381
+ {
382
+ eventType: AIRunEventType.ToolCallStarted,
383
+ toolName: LIST_INFRASTRUCTURE_ACCESS_TOOL_NAME,
384
+ },
385
+ {
386
+ eventType: AIRunEventType.ToolCallCompleted,
387
+ toolName: LIST_INFRASTRUCTURE_ACCESS_TOOL_NAME,
388
+ resultSummary: { rowCount: 2 },
389
+ },
390
+ ])}
391
+ hideChrome={true}
392
+ />,
393
+ );
394
+
395
+ expect(screen.getByText("Checking infrastructure access")).toBeVisible();
396
+ expect(screen.getByText("· 2 resources")).toBeVisible();
397
+ });
398
+ });
399
+
400
+ describe("describeInfrastructureUsage", () => {
401
+ function activity(
402
+ overrides: Partial<InfrastructureActivitySummary> = {},
403
+ ): InfrastructureActivitySummary {
404
+ return { executed: 0, succeeded: 0, notRun: 0, unknown: 0, ...overrides };
405
+ }
406
+
407
+ test.each<[string, InfrastructureActivitySummary | undefined, string | null]>(
408
+ [
409
+ ["no activity", undefined, null],
410
+ ["nothing tried", activity(), null],
411
+ [
412
+ "one that ran",
413
+ activity({ executed: 1, succeeded: 1 }),
414
+ "1 infrastructure command",
415
+ ],
416
+ [
417
+ "some that failed or never ran",
418
+ activity({ executed: 3, succeeded: 2, notRun: 1, unknown: 1 }),
419
+ "3 infrastructure commands (1 failed, 1 did not run, 1 returned no result)",
420
+ ],
421
+ [
422
+ "only never ran",
423
+ activity({ notRun: 2 }),
424
+ "2 infrastructure commands did not run",
425
+ ],
426
+ [
427
+ "only unknown",
428
+ activity({ unknown: 1 }),
429
+ "1 infrastructure command returned no result",
430
+ ],
431
+ [
432
+ "never ran and unknown",
433
+ activity({ notRun: 1, unknown: 2 }),
434
+ "3 infrastructure commands without a result (1 did not run, 2 returned no result)",
435
+ ],
436
+ ],
437
+ )(
438
+ "words %s",
439
+ (
440
+ _label: string,
441
+ summary: InfrastructureActivitySummary | undefined,
442
+ expected: string | null,
443
+ ) => {
444
+ expect(describeInfrastructureUsage(summary)).toBe(expected);
445
+ },
446
+ );
447
+ });
448
+
449
+ describe("InvestigationUsageLine with infrastructure commands", () => {
450
+ function usageItems(
451
+ toolCallCount: number,
452
+ kubectlActivity: KubectlActivitySummary,
453
+ ): Array<string> {
454
+ render(
455
+ <InvestigationUsageLine
456
+ usage={{ toolCallCount, totalTokens: 0 }}
457
+ kubectlActivity={kubectlActivity}
458
+ showReadOnly={false}
459
+ />,
460
+ );
461
+ return within(screen.getByRole("list", { name: "Investigation usage" }))
462
+ .getAllByRole("listitem")
463
+ .map((item: HTMLElement): string => {
464
+ return item.textContent || "";
465
+ });
466
+ }
467
+
468
+ test("counts telemetry without the infrastructure calls and says what those did", () => {
469
+ expect(
470
+ usageItems(5, {
471
+ executed: 0,
472
+ succeeded: 0,
473
+ notRun: 0,
474
+ clusterToolCalls: 3,
475
+ infrastructure: { executed: 2, succeeded: 2, notRun: 0, unknown: 0 },
476
+ }),
477
+ ).toEqual(["2 telemetry queries", "2 infrastructure commands"]);
478
+ });
479
+
480
+ test("shows kubectl and infrastructure apart", () => {
481
+ expect(
482
+ usageItems(6, {
483
+ executed: 1,
484
+ succeeded: 1,
485
+ notRun: 0,
486
+ clusterToolCalls: 3,
487
+ infrastructure: { executed: 1, succeeded: 0, notRun: 0, unknown: 0 },
488
+ }),
489
+ ).toEqual([
490
+ "3 telemetry queries",
491
+ "1 kubectl command",
492
+ "1 infrastructure command (1 failed)",
493
+ ]);
494
+ });
495
+
496
+ test("adds nothing for a run without infrastructure calls", () => {
497
+ expect(
498
+ usageItems(3, {
499
+ executed: 1,
500
+ succeeded: 1,
501
+ notRun: 0,
502
+ clusterToolCalls: 1,
503
+ }),
504
+ ).toEqual(["2 telemetry queries", "1 kubectl command"]);
505
+ });
506
+ });