@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
@@ -8,6 +8,15 @@ import {
8
8
  AiRemediationCommandPolicyVerdict,
9
9
  MAX_COMMAND_LENGTH_CHARS,
10
10
  } from "./AiRemediationCommandPolicyVerdict";
11
+ import AiResourceType, {
12
+ AI_RESOURCE_TYPE_INFO,
13
+ isAiResourceType,
14
+ } from "../ResourceAiAgent/AiResourceType";
15
+ import {
16
+ RESOURCE_AI_ALLOW_WRITES_ENV,
17
+ RESOURCE_AI_WRITE_TARGETS_ENV,
18
+ ResourceCommandTier,
19
+ } from "../ResourceAiAgent/ResourceAiAccess";
11
20
 
12
21
  /*
13
22
  * Defined in a leaf module of their own (no imports) so the pure kubectl
@@ -32,12 +41,17 @@ export { AiRemediationCommandPolicyVerdict, MAX_COMMAND_LENGTH_CHARS };
32
41
  * The only step types an AI remediation run may compose. The structured
33
42
  * Kubernetes step (restart/scale) stays runbook-only; AI reaches a cluster
34
43
  * through the Kubectl step instead, whose argv is tiered by KubectlPolicy
35
- * and which targets a Runner the cluster's AI page bound.
44
+ * and which targets a Runner the cluster's AI page bound. Every other
45
+ * infrastructure resource (Docker, Podman, Swarm, Proxmox, VMware, Ceph, a
46
+ * database server, a host) is reached through ResourceCommand, whose argv
47
+ * is tiered by the resource command policy and which targets the
48
+ * resource's own AI agent — never a Runner.
36
49
  */
37
50
  export const AI_COMMAND_STEP_TYPES: Array<RunbookStepType> = [
38
51
  RunbookStepType.Bash,
39
52
  RunbookStepType.SSH,
40
53
  RunbookStepType.Kubectl,
54
+ RunbookStepType.ResourceCommand,
41
55
  ];
42
56
 
43
57
  export enum AiRemediationCommandExecutionStatus {
@@ -84,6 +98,14 @@ export interface AiRemediationCommand {
84
98
  sequence: number;
85
99
  // One of AI_COMMAND_STEP_TYPES. SSH requires credentialId.
86
100
  stepType: RunbookStepType;
101
+ /*
102
+ * The access target the command runs through. For Bash/SSH (and a
103
+ * Kubectl step through a Runner) a Runner row; for a Kubectl step through
104
+ * the Kubernetes AI agent the KubernetesAiAgent row id and
105
+ * KUBERNETES_AI_AGENT_DISPLAY_NAME; for a ResourceCommand step the
106
+ * ResourceAiAgent row id and the type's agentDisplayName ("Docker AI
107
+ * agent").
108
+ */
87
109
  runnerId: string;
88
110
  runnerNameSnapshot: string;
89
111
  credentialId?: string | undefined;
@@ -96,6 +118,17 @@ export interface AiRemediationCommand {
96
118
  kubernetesClusterId?: string | undefined;
97
119
  kubernetesClusterNameSnapshot?: string | undefined;
98
120
  kubectlTier?: KubectlCommandTier | undefined;
121
+ /*
122
+ * ResourceCommand only: the resource the command runs against and the
123
+ * tier the resource command policy assigned when the plan was composed.
124
+ * The tier is informational on the card; execution re-evaluates it. A
125
+ * ResourceCommand step never carries a credential — the resource's AI
126
+ * agent uses only credentials from its own environment.
127
+ */
128
+ resourceType?: AiResourceType | undefined;
129
+ resourceId?: string | undefined;
130
+ resourceNameSnapshot?: string | undefined;
131
+ resourceCommandTier?: ResourceCommandTier | undefined;
99
132
  command: string;
100
133
  timeoutInMs: number;
101
134
  // Why the AI wants to run this — shown verbatim on the approval card.
@@ -286,6 +319,62 @@ export const KUBECTL_BYPASS_MODE_SUMMARY: string =
286
319
 
287
320
  export const KUBECTL_EVERY_MODE_LIMITS_SUMMARY: string = `In every mode, Bypass approval included: ${KUBECTL_NEVER_RUNS_SUMMARY}; ${KUBECTL_ALWAYS_ASKS_SUMMARY}; the cluster's in-cluster Runner never changes its own namespace, nor a namespace outside the ones its chart lets it change, nor nodes when its chart turned node operations off; and an unattended run becomes a proposal when the hourly per-cluster circuit breaker trips or another unattended round already holds the cluster.`;
288
321
 
322
+ /*
323
+ * The resource command tiers and the unattended resource modes in the words
324
+ * every resource remediation prompt, tool description and feed item uses —
325
+ * for the Docker and Podman hosts, Docker Swarm, Proxmox, VMware and Ceph
326
+ * clusters, database servers and hosts reached through their resource AI
327
+ * agents. They restate the ResourceCommandTier and ResourceAiRemediationMode
328
+ * doc comments in Types/ResourceAiAgent/ResourceAiAccess and must keep
329
+ * matching them — and the resource command policy (ResourceCommandPolicy),
330
+ * which is what actually decides. What each kind of resource accepts is its
331
+ * tool policy's own guide (ResourceCommandPolicy.getWriteCommandGuide); these
332
+ * are the rules every kind shares. One copy, so a prompt can never describe
333
+ * a tier the policy no longer has.
334
+ */
335
+
336
+ // SafeWrite: what an Automatic resource runs without a human.
337
+ export const RESOURCE_SAFE_CHANGES_SUMMARY: string =
338
+ "a reversible change to exactly ONE named object — restart or start one container, a rolling restart of one service, start one VM, restart one unit, cancel one query — never several objects at once";
339
+
340
+ // RiskyWrite: needs a human unless the allowlist names it or approvals are bypassed.
341
+ export const RESOURCE_RISKIER_CHANGES_SUMMARY: string =
342
+ "a change that can take something down or alter what runs — stop, kill or pause a container, update limits, scale a service to zero, shut down, power off or reset a VM, mark an OSD out, stop a unit, terminate a session — and a change to several objects at once";
343
+
344
+ /*
345
+ * Asks a human whatever the resource's mode, allowlist included: what the
346
+ * resource command policy marks requiresHuman (the canonical mode text in
347
+ * ResourceAiAccess).
348
+ */
349
+ export const RESOURCE_ALWAYS_ASKS_SUMMARY: string =
350
+ "a change the resource's command policy marks as always needing a human (draining a Swarm node, migrating a VM, putting an ESXi host into maintenance, killing a process on a host, ...) always needs a human, in every mode — Bypass approval and the allowlist included";
351
+
352
+ // Denied: never runs, whoever approves it.
353
+ export const RESOURCE_NEVER_RUNS_SUMMARY: string =
354
+ "destructive commands never run, even with approval: exec, run, rm, prune, deleting or destroying anything, anything that reads or changes credentials, anything the resource's command policy does not know, and anything written as a shell line (pipes, redirects, ;, &&, $( ), sudo)";
355
+
356
+ // How the resource's allowlist is read.
357
+ export const RESOURCE_ALLOWLIST_SUMMARY: string =
358
+ "the resource's command allowlist is matched word by word: a pattern must have exactly as many words as the command, a * stands for exactly one whole word (never part of one), and every other word must be spelled exactly as the command spells it";
359
+
360
+ /*
361
+ * The every-mode clause about unattended resource runs (the resource
362
+ * sibling of ClusterAccessContext's UNATTENDED_ROUND_BECOMES_PROPOSAL_SUMMARY).
363
+ */
364
+ export const RESOURCE_UNATTENDED_ROUND_BECOMES_PROPOSAL_SUMMARY: string =
365
+ "an unattended run becomes a proposal when the hourly per-resource circuit breaker trips or another unattended round already holds the resource";
366
+
367
+ export const RESOURCE_AUTOMATIC_MODE_SUMMARY: string = `Automatic: safe changes run without a human (${RESOURCE_SAFE_CHANGES_SUMMARY}). A riskier change (${RESOURCE_RISKIER_CHANGES_SUMMARY}) never runs without one: when the round could only find riskier fixes it ends by proposing exactly those for one-click approval; when it also ran safe fixes, a riskier fix is proposed only if verification shows the safe ones did not recover the signal (the follow-up round, which asks). Shapes on the resource's command allowlist run on their own.`;
368
+
369
+ /*
370
+ * Interpolated into prompts and feed copy on its own, so it names the
371
+ * exceptions instead of pointing at a list "below".
372
+ */
373
+ export const RESOURCE_BYPASS_MODE_SUMMARY: string =
374
+ "Bypass approval: AI does not ask. Every change the policy allows — safe AND riskier — runs on its own, follow-up rounds included, except for what always needs a human.";
375
+
376
+ export const RESOURCE_EVERY_MODE_LIMITS_SUMMARY: string = `In every mode, Bypass approval included: ${RESOURCE_NEVER_RUNS_SUMMARY}; ${RESOURCE_ALWAYS_ASKS_SUMMARY}; the resource's AI agent changes nothing unless it was started with ${RESOURCE_AI_ALLOW_WRITES_ENV}=true, never changes its own protected targets (itself and what it runs in), and with ${RESOURCE_AI_WRITE_TARGETS_ENV} set changes only the targets it names; and ${RESOURCE_UNATTENDED_ROUND_BECOMES_PROPOSAL_SUMMARY}.`;
377
+
289
378
  export class AiRemediationCommandPlanUtil {
290
379
  /*
291
380
  * Parse a jsonb column value back into a typed plan. Fail-closed: any
@@ -348,6 +437,28 @@ export class AiRemediationCommandPlanUtil {
348
437
  return null;
349
438
  }
350
439
 
440
+ /*
441
+ * A ResourceCommand step names its resource by type and id, runs
442
+ * through the resource's AI agent (runnerId holds the ResourceAiAgent
443
+ * id) and never carries a credential or a cluster. Anything else is a
444
+ * plan this build cannot execute safely, so the whole plan is refused.
445
+ */
446
+ let resourceFields: Pick<
447
+ AiRemediationCommand,
448
+ | "resourceType"
449
+ | "resourceId"
450
+ | "resourceNameSnapshot"
451
+ | "resourceCommandTier"
452
+ > | null = null;
453
+
454
+ if (stepType === RunbookStepType.ResourceCommand) {
455
+ resourceFields = AiRemediationCommandPlanUtil.parseResourceFields(obj);
456
+
457
+ if (!resourceFields) {
458
+ return null;
459
+ }
460
+ }
461
+
351
462
  const kubectlTierRaw: string = String(obj["kubectlTier"] || "");
352
463
  const kubectlTier: KubectlCommandTier | undefined = Object.values(
353
464
  KubectlCommandTier,
@@ -383,7 +494,10 @@ export class AiRemediationCommandPlanUtil {
383
494
  runnerNameSnapshot:
384
495
  typeof obj["runnerNameSnapshot"] === "string"
385
496
  ? obj["runnerNameSnapshot"]
386
- : "Runner",
497
+ : resourceFields?.resourceType
498
+ ? AI_RESOURCE_TYPE_INFO[resourceFields.resourceType]
499
+ .agentDisplayName
500
+ : "Runner",
387
501
  credentialId:
388
502
  typeof obj["credentialId"] === "string"
389
503
  ? obj["credentialId"]
@@ -401,6 +515,7 @@ export class AiRemediationCommandPlanUtil {
401
515
  ? obj["kubernetesClusterNameSnapshot"]
402
516
  : undefined,
403
517
  kubectlTier,
518
+ ...(resourceFields || {}),
404
519
  command: command,
405
520
  timeoutInMs: timeoutInMs,
406
521
  rationale: typeof obj["rationale"] === "string" ? obj["rationale"] : "",
@@ -461,6 +576,72 @@ export class AiRemediationCommandPlanUtil {
461
576
  return plan;
462
577
  }
463
578
 
579
+ /*
580
+ * The resource fields of a stored ResourceCommand step, or null when the
581
+ * step must not be trusted: an unknown resourceType, a blank resourceId,
582
+ * any credential or cluster field, or a tier that is Denied or not a
583
+ * tier at all.
584
+ */
585
+ private static parseResourceFields(
586
+ obj: JSONObject,
587
+ ): Pick<
588
+ AiRemediationCommand,
589
+ | "resourceType"
590
+ | "resourceId"
591
+ | "resourceNameSnapshot"
592
+ | "resourceCommandTier"
593
+ > | null {
594
+ const resourceType: unknown = obj["resourceType"];
595
+
596
+ if (!isAiResourceType(resourceType)) {
597
+ return null;
598
+ }
599
+
600
+ const resourceId: unknown = obj["resourceId"];
601
+
602
+ if (typeof resourceId !== "string" || !resourceId.trim()) {
603
+ return null;
604
+ }
605
+
606
+ for (const field of [
607
+ "credentialId",
608
+ "credentialNameSnapshot",
609
+ "credential",
610
+ "kubernetesClusterId",
611
+ ]) {
612
+ if (obj[field] !== undefined && obj[field] !== null) {
613
+ return null;
614
+ }
615
+ }
616
+
617
+ const tierRaw: unknown = obj["resourceCommandTier"];
618
+ let resourceCommandTier: ResourceCommandTier | undefined = undefined;
619
+
620
+ if (tierRaw !== undefined && tierRaw !== null && tierRaw !== "") {
621
+ if (
622
+ typeof tierRaw !== "string" ||
623
+ !(Object.values(ResourceCommandTier) as Array<string>).includes(
624
+ tierRaw,
625
+ ) ||
626
+ tierRaw === ResourceCommandTier.Denied
627
+ ) {
628
+ return null;
629
+ }
630
+
631
+ resourceCommandTier = tierRaw as ResourceCommandTier;
632
+ }
633
+
634
+ return {
635
+ resourceType,
636
+ resourceId,
637
+ resourceNameSnapshot:
638
+ typeof obj["resourceNameSnapshot"] === "string"
639
+ ? obj["resourceNameSnapshot"]
640
+ : undefined,
641
+ resourceCommandTier,
642
+ };
643
+ }
644
+
464
645
  public static toJSON(plan: AiRemediationCommandPlan): JSONObject {
465
646
  return JSON.parse(JSON.stringify(plan)) as JSONObject;
466
647
  }
@@ -51,6 +51,7 @@ import {
51
51
  import {
52
52
  RumAlertTemplate,
53
53
  getAllRumAlertTemplates,
54
+ getRumAlertTemplates,
54
55
  } from "../RumAlertTemplates";
55
56
  import {
56
57
  ServiceAlertTemplate,
@@ -96,8 +97,8 @@ export interface MonitorRecommendationResourceTypeDefinition {
96
97
  * Most resource types ignore the argument entirely — every Kubernetes
97
98
  * cluster is offered the same eighteen recommendations, and a
98
99
  * zero-argument function satisfies this type, so those are declared
99
- * exactly as they were. Services and databases are the exceptions: see
100
- * `MonitorRecommendationContext`.
100
+ * exactly as they were. Services, databases and RUM applications are the
101
+ * exceptions: see `MonitorRecommendationContext`.
101
102
  *
102
103
  * Passing no context means "nothing is known about this resource", and the
103
104
  * only honest answer to that is the context-free subset. It does NOT mean
@@ -356,28 +357,58 @@ function getIoTRecommendations(): Array<MonitorRecommendation> {
356
357
  });
357
358
  }
358
359
 
359
- function getRumRecommendations(): Array<MonitorRecommendation> {
360
+ /*
361
+ * The RUM adapter — two functions for the same reason as Service's.
362
+ *
363
+ * `getRumRecommendations` answers "what should THIS application be offered":
364
+ * everything except the session replay budget alerts, which wait until the
365
+ * application records replays (and, for the monthly pair, has a monthly
366
+ * budget), because only then does the sweep write the series they watch.
367
+ * `getAllRumRecommendations` answers "what can an application ever be
368
+ * offered" — without it, a dismissed or created budget alert could not be
369
+ * resolved back from its id.
370
+ */
371
+ function normalizeRumTemplate(
372
+ template: RumAlertTemplate,
373
+ ): MonitorRecommendation {
374
+ return normalize({
375
+ resourceType: MonitorRecommendationResourceType.RumApplication,
376
+ monitorType: template.monitorType,
377
+ template: template,
378
+ getMonitorStep: (args: MonitorRecommendationArgs) => {
379
+ return template.getMonitorStep({
380
+ rumApplicationId: args.resourceIdentifier,
381
+ onlineMonitorStatusId: args.onlineMonitorStatusId,
382
+ offlineMonitorStatusId: args.offlineMonitorStatusId,
383
+ defaultIncidentSeverityId: args.defaultIncidentSeverityId,
384
+ defaultAlertSeverityId: args.defaultAlertSeverityId,
385
+ monitorName: args.monitorName,
386
+ });
387
+ },
388
+ });
389
+ }
390
+
391
+ function getRumRecommendations(
392
+ context?: MonitorRecommendationContext | undefined,
393
+ ): Array<MonitorRecommendation> {
394
+ return getRumAlertTemplates({
395
+ sessionReplayEnabled: context?.sessionReplayEnabled,
396
+ sessionReplayHasRecorded: context?.sessionReplayHasRecorded,
397
+ sessionReplayMonthlyBudgetInGB: context?.sessionReplayMonthlyBudgetInGB,
398
+ }).map((template: RumAlertTemplate) => {
399
+ return normalizeRumTemplate(template);
400
+ });
401
+ }
402
+
403
+ function getAllRumRecommendations(): Array<MonitorRecommendation> {
360
404
  return getAllRumAlertTemplates().map((template: RumAlertTemplate) => {
361
- return normalize({
362
- resourceType: MonitorRecommendationResourceType.RumApplication,
363
- monitorType: template.monitorType,
364
- template: template,
365
- getMonitorStep: (args: MonitorRecommendationArgs) => {
366
- return template.getMonitorStep({
367
- rumApplicationId: args.resourceIdentifier,
368
- onlineMonitorStatusId: args.onlineMonitorStatusId,
369
- offlineMonitorStatusId: args.offlineMonitorStatusId,
370
- defaultIncidentSeverityId: args.defaultIncidentSeverityId,
371
- defaultAlertSeverityId: args.defaultAlertSeverityId,
372
- monitorName: args.monitorName,
373
- });
374
- },
375
- });
405
+ return normalizeRumTemplate(template);
376
406
  });
377
407
  }
378
408
 
379
409
  /*
380
- * The Service adapter, and the only one that is two functions rather than one.
410
+ * The Service adapter, the first that is two functions rather than one (the
411
+ * RUM adapter above and the database adapter below follow its pattern).
381
412
  *
382
413
  * `getServiceRecommendations` answers "what should THIS service be offered",
383
414
  * which depends on its runtime. `getAllServiceRecommendations` answers "what
@@ -573,6 +604,7 @@ const RESOURCE_TYPE_DEFINITIONS: Array<MonitorRecommendationResourceTypeDefiniti
573
604
  identifierFieldName: "rumApplicationId",
574
605
  icon: IconProp.Globe,
575
606
  getRecommendations: getRumRecommendations,
607
+ getAllPossibleRecommendations: getAllRumRecommendations,
576
608
  },
577
609
  {
578
610
  resourceType: MonitorRecommendationResourceType.Service,
@@ -657,9 +689,10 @@ export default class MonitorRecommendationCatalog {
657
689
  *
658
690
  * This, not `getRecommendations(resourceType)`, is what a per-type
659
691
  * invariant has to run over: with no context a database is offered nothing
660
- * at all (there is no engine-agnostic database template) and a service only
661
- * its language-agnostic subset, so a check written against the context-free
662
- * set would silently skip every engine- and runtime-specific template.
692
+ * at all (there is no engine-agnostic database template), a service only
693
+ * its language-agnostic subset and a RUM application none of its session
694
+ * replay budget alerts, so a check written against the context-free set
695
+ * would silently skip every engine-, runtime- and replay-specific template.
663
696
  */
664
697
  public static getAllPossibleRecommendations(
665
698
  resourceType: MonitorRecommendationResourceType,
@@ -30,6 +30,11 @@ export enum MonitorRecommendationResourceType {
30
30
  VMware = "VMware",
31
31
  Ceph = "Ceph",
32
32
  IoTDevice = "IoTDevice",
33
+ /*
34
+ * A RUM (browser) application. Its recommendation set gains the session
35
+ * replay storage budget alerts once it records replays — see
36
+ * `MonitorRecommendationContext`.
37
+ */
33
38
  RumApplication = "RumApplication",
34
39
  /*
35
40
  * An APM telemetry service — a backend process reporting OTel traces,
@@ -58,12 +63,14 @@ export enum MonitorRecommendationResourceType {
58
63
  * exist on a Go service, and recommending them there produces monitors that
59
64
  * silently never fire, which is worse than recommending nothing. Databases
60
65
  * are the same by engine: PostgreSQL's receiver and Redis's share no metric
61
- * name.
66
+ * name. And a RUM application is only offered its session replay budget
67
+ * alerts once it records replays, because only then are those metrics
68
+ * written for it.
62
69
  *
63
70
  * Optional everywhere, and every field inside it is optional too, so a caller
64
71
  * that knows nothing still gets the subset that is true of every resource of
65
- * the type — the language-agnostic recommendations for a service, and none
66
- * for a database — rather than a guess.
72
+ * the type — the language-agnostic recommendations for a service, none for a
73
+ * database, and no budget alerts for a RUM application — rather than a guess.
67
74
  */
68
75
  export interface MonitorRecommendationContext {
69
76
  /*
@@ -92,6 +99,31 @@ export interface MonitorRecommendationContext {
92
99
  * `null` / `undefined` mean "not known" and withhold nothing.
93
100
  */
94
101
  databaseEngineMetricsReported?: boolean | null | undefined;
102
+ /*
103
+ * A RUM application's `isSessionReplayEnabled`: the first of the three
104
+ * facts that decide whether it is offered its session replay storage budget
105
+ * alerts (see `getRumAlertTemplates`). The budget sweep only writes those
106
+ * metrics for an application that has session replay on AND has recorded,
107
+ * and the monthly ones only while it has a monthly budget; a monitor over a
108
+ * series nobody writes never fires.
109
+ *
110
+ * Unlike `databaseEngineMetricsReported`, `null` / `undefined` in all three
111
+ * mean "not known" and WITHHOLD: these alerts are an addition to a set that
112
+ * is complete without them, so a page that knows nothing shows exactly what
113
+ * it showed before they existed.
114
+ */
115
+ sessionReplayEnabled?: boolean | null | undefined;
116
+ /*
117
+ * Whether a replay was ever accepted for the application (its
118
+ * `sessionReplayLastChunkReceivedAt` is set). The switch alone says
119
+ * nothing: it is on by default, on every RUM application.
120
+ */
121
+ sessionReplayHasRecorded?: boolean | null | undefined;
122
+ /*
123
+ * Its `sessionReplayMonthlyBudgetInGB` (GiB, like every replay "GB"). Only
124
+ * a finite number above 0 is a budget; 0, blank and anything else is none.
125
+ */
126
+ sessionReplayMonthlyBudgetInGB?: number | null | undefined;
95
127
  }
96
128
 
97
129
  /*