@oneuptime/common 14.0.9 → 14.0.11

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 (1146) hide show
  1. package/Models/DatabaseModels/AIConversation.ts +127 -1
  2. package/Models/DatabaseModels/AutoRemediationSuggestion.ts +60 -0
  3. package/Models/DatabaseModels/CephCluster.ts +225 -0
  4. package/Models/DatabaseModels/CloudResource.ts +12 -0
  5. package/Models/DatabaseModels/DatabaseServer.ts +225 -0
  6. package/Models/DatabaseModels/DockerHost.ts +225 -0
  7. package/Models/DatabaseModels/DockerSwarmCluster.ts +225 -0
  8. package/Models/DatabaseModels/GlobalConfig.ts +1 -1
  9. package/Models/DatabaseModels/GlobalOidc.ts +0 -4
  10. package/Models/DatabaseModels/GlobalOidcProject.ts +0 -4
  11. package/Models/DatabaseModels/GlobalSso.ts +0 -4
  12. package/Models/DatabaseModels/GlobalSsoProject.ts +0 -4
  13. package/Models/DatabaseModels/Host.ts +225 -0
  14. package/Models/DatabaseModels/IncidentForm.ts +594 -0
  15. package/Models/DatabaseModels/IncidentFormSubmission.ts +283 -0
  16. package/Models/DatabaseModels/IncidentTemplate.ts +59 -0
  17. package/Models/DatabaseModels/Index.ts +16 -0
  18. package/Models/DatabaseModels/IoTFleet.ts +12 -0
  19. package/Models/DatabaseModels/KubernetesCluster.ts +12 -0
  20. package/Models/DatabaseModels/MessageQueue.ts +1102 -0
  21. package/Models/DatabaseModels/MessageQueueLabelRule.ts +553 -0
  22. package/Models/DatabaseModels/MessageQueueOwnerRule.ts +633 -0
  23. package/Models/DatabaseModels/MessageQueueOwnerTeam.ts +491 -0
  24. package/Models/DatabaseModels/MessageQueueOwnerUser.ts +490 -0
  25. package/Models/DatabaseModels/PodmanHost.ts +225 -0
  26. package/Models/DatabaseModels/Project.ts +59 -0
  27. package/Models/DatabaseModels/ProjectOidc.ts +0 -4
  28. package/Models/DatabaseModels/ProjectSso.ts +0 -4
  29. package/Models/DatabaseModels/ProxmoxCluster.ts +225 -0
  30. package/Models/DatabaseModels/ResourceAiAgent.ts +419 -0
  31. package/Models/DatabaseModels/RumApplication.ts +12 -0
  32. package/Models/DatabaseModels/RunnerJob.ts +144 -0
  33. package/Models/DatabaseModels/ServerlessFunction.ts +12 -0
  34. package/Models/DatabaseModels/Service.ts +12 -0
  35. package/Models/DatabaseModels/StatusPageOidc.ts +0 -4
  36. package/Models/DatabaseModels/StatusPageSso.ts +0 -4
  37. package/Models/DatabaseModels/TeamComplianceSetting.ts +47 -2
  38. package/Models/DatabaseModels/VMwareVCenter.ts +225 -0
  39. package/Server/API/AIChatAPI.ts +13 -114
  40. package/Server/API/AIInvestigationAPI.ts +3 -3
  41. package/Server/API/AIInvestigationConversationAPI.ts +266 -0
  42. package/Server/API/AutoRemediationAPI.ts +392 -1
  43. package/Server/API/IncidentFormAPI.ts +376 -0
  44. package/Server/API/ProjectOIDC.ts +16 -25
  45. package/Server/API/ProjectSSO.ts +16 -24
  46. package/Server/API/ResourceAiAccessAPI.ts +1669 -0
  47. package/Server/API/StatusPageAPI.ts +42 -77
  48. package/Server/Enterprise/EnterpriseEdition.ts +93 -28
  49. package/Server/Enterprise/EnterpriseFeature.ts +25 -3
  50. package/Server/Enterprise/EnterpriseLicenseSnapshot.ts +1 -1
  51. package/Server/Enterprise/EnterpriseServerModule.ts +4 -1
  52. package/Server/EnvironmentConfig.ts +1 -1
  53. package/Server/Infrastructure/Postgres/SchemaMigrations/1796300000000-AddResourceAiAgents.ts +423 -0
  54. package/Server/Infrastructure/Postgres/SchemaMigrations/1796400000000-AddIncidentForms.ts +129 -0
  55. package/Server/Infrastructure/Postgres/SchemaMigrations/1796500000000-AddTeamComplianceRuleNotificationChannels.ts +52 -0
  56. package/Server/Infrastructure/Postgres/SchemaMigrations/1796600000000-AddAIInvestigationConversationAndTimeLimits.ts +75 -0
  57. package/Server/Infrastructure/Postgres/SchemaMigrations/1796700000000-AddMessageQueueTables.ts +477 -0
  58. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +10 -0
  59. package/Server/Infrastructure/Semaphore.ts +22 -0
  60. package/Server/Middleware/IncidentFormRateLimit.ts +847 -0
  61. package/Server/Middleware/TelemetryIngest.ts +15 -5
  62. package/Server/Middleware/UserAuthorization.ts +16 -38
  63. package/Server/Services/AIService.ts +10 -13
  64. package/Server/Services/AnalyticsDatabaseService.ts +45 -1
  65. package/Server/Services/AutoRemediationRuleEngineService.ts +940 -112
  66. package/Server/Services/CephClusterService.ts +109 -1
  67. package/Server/Services/DatabaseServerService.ts +116 -1
  68. package/Server/Services/DockerHostService.ts +109 -1
  69. package/Server/Services/DockerSwarmClusterService.ts +113 -1
  70. package/Server/Services/HostService.ts +126 -4
  71. package/Server/Services/IncidentCustomFieldService.ts +112 -2
  72. package/Server/Services/IncidentEpisodeMemberService.ts +24 -4
  73. package/Server/Services/IncidentEpisodeService.ts +10 -1
  74. package/Server/Services/IncidentFormService.ts +1566 -0
  75. package/Server/Services/IncidentFormSubmissionService.ts +97 -0
  76. package/Server/Services/IncidentGroupingEngineService.ts +45 -8
  77. package/Server/Services/IncidentService.ts +123 -5
  78. package/Server/Services/IncidentTemplateService.ts +22 -0
  79. package/Server/Services/Index.ts +14 -0
  80. package/Server/Services/MessageQueueLabelRuleEngineService.ts +321 -0
  81. package/Server/Services/MessageQueueLabelRuleService.ts +14 -0
  82. package/Server/Services/MessageQueueOwnerRuleEngineService.ts +412 -0
  83. package/Server/Services/MessageQueueOwnerRuleService.ts +14 -0
  84. package/Server/Services/MessageQueueOwnerTeamService.ts +62 -0
  85. package/Server/Services/MessageQueueOwnerUserService.ts +62 -0
  86. package/Server/Services/MessageQueueService.ts +1463 -0
  87. package/Server/Services/MetricRecordingRuleService.ts +47 -0
  88. package/Server/Services/OpenTelemetryIngestService.ts +37 -4
  89. package/Server/Services/PodmanHostService.ts +109 -1
  90. package/Server/Services/ProjectService.ts +0 -59
  91. package/Server/Services/ProxmoxClusterService.ts +110 -1
  92. package/Server/Services/ResourceAiAccessService.ts +1439 -0
  93. package/Server/Services/ResourceAiAgentJobService.ts +202 -0
  94. package/Server/Services/ResourceAiAgentService.ts +2432 -0
  95. package/Server/Services/RunnerJobService.ts +611 -4
  96. package/Server/Services/StatusPagePrivateUserService.ts +1 -4
  97. package/Server/Services/StatusPageService.ts +1 -51
  98. package/Server/Services/TeamComplianceSettingService.ts +163 -42
  99. package/Server/Services/TelemetryUsageBillingService.ts +28 -0
  100. package/Server/Services/TraceRecordingRuleService.ts +33 -0
  101. package/Server/Services/UserNotificationRuleService.ts +8 -1
  102. package/Server/Services/VMwareVCenterService.ts +110 -1
  103. package/Server/Services/WorkspaceNotificationSummaryService.ts +12 -3
  104. package/Server/Types/Database/Permissions/CreatePermission.ts +17 -3
  105. package/Server/Types/Database/Permissions/EditionPermission.ts +140 -38
  106. package/Server/Types/Database/Permissions/OwnerTableRegistry.ts +16 -0
  107. package/Server/Types/Database/Permissions/TablePermission.ts +3 -3
  108. package/Server/Types/Database/Permissions/UpdatePermission.ts +20 -6
  109. package/Server/Utils/AI/Chat/AgentContextCompactor.ts +200 -0
  110. package/Server/Utils/AI/Chat/ChatAgentRunner.ts +307 -48
  111. package/Server/Utils/AI/Chat/ChatRunCancellation.ts +156 -0
  112. package/Server/Utils/AI/Chat/ObservabilityAssistant.ts +78 -18
  113. package/Server/Utils/AI/Chat/ObservabilityChatPrompt.ts +1 -1
  114. package/Server/Utils/AI/Chat/ToolOutputPager.ts +322 -0
  115. package/Server/Utils/AI/ClusterAccess/KubectlInvestigationToolkit.ts +88 -30
  116. package/Server/Utils/AI/ClusterAccess/KubectlJobRunner.ts +13 -1
  117. package/Server/Utils/AI/CodeFix/CodeFixReadiness.ts +0 -32
  118. package/Server/Utils/AI/CodeFix/FixRunBudget.ts +27 -25
  119. package/Server/Utils/AI/Remediation/RemediationCommandTools.ts +1442 -34
  120. package/Server/Utils/AI/Remediation/RemediationExecutionRunner.ts +968 -34
  121. package/Server/Utils/AI/Remediation/RemediationPlanRunner.ts +25 -1
  122. package/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.ts +622 -0
  123. package/Server/Utils/AI/ResourceAccess/ResourceAccessContext.ts +271 -0
  124. package/Server/Utils/AI/ResourceAccess/ResourceAccessToolNames.ts +45 -0
  125. package/Server/Utils/AI/ResourceAccess/ResourceAiAccessSettings.ts +964 -0
  126. package/Server/Utils/AI/ResourceAccess/ResourceAiDeleteCleanup.ts +333 -0
  127. package/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.ts +882 -0
  128. package/Server/Utils/AI/SRE/AIInvestigationEngine.ts +125 -12
  129. package/Server/Utils/AI/SRE/AlertInvestigationRunner.ts +99 -15
  130. package/Server/Utils/AI/SRE/IncidentInvestigationRunner.ts +99 -15
  131. package/Server/Utils/AI/SRE/InvestigationQueue.ts +16 -19
  132. package/Server/Utils/AI/SRE/InvestigationThread.ts +646 -0
  133. package/Server/Utils/AI/SRE/InvestigationThreadService.ts +715 -0
  134. package/Server/Utils/AI/Toolbox/Serializer.ts +10 -3
  135. package/Server/Utils/AutoRemediation/CommandPlanExecutor.ts +396 -13
  136. package/Server/Utils/AutoRemediation/RemediationVerifier.ts +35 -2
  137. package/Server/Utils/Database/ProjectScopedReferenceValidator.ts +9 -1
  138. package/Server/Utils/EditionEnforcement.ts +19 -202
  139. package/Server/Utils/LLM/LLMService.ts +259 -63
  140. package/Server/Utils/RelaxedScimTeamLocksReport.ts +245 -0
  141. package/Server/Utils/Rules/RuleRun/RuleRunRegistry.ts +25 -0
  142. package/Server/Utils/SameOriginRequest.ts +203 -0
  143. package/Server/Utils/SessionReplay/SessionReplayBudgetMetrics.ts +920 -0
  144. package/Server/Utils/SessionReplay/SessionReplayUsage.ts +84 -6
  145. package/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.ts +2 -0
  146. package/Server/Utils/Telemetry/EntityRegistry.ts +4 -1
  147. package/Server/Utils/Telemetry/MessageQueueDiscovery.ts +1402 -0
  148. package/Server/Utils/Telemetry/ResourceEntityFilter.ts +4 -1
  149. package/Server/Utils/VendorAssets.ts +3 -3
  150. package/Server/Utils/Workspace/MicrosoftTeams/Actions/Alert.ts +35 -15
  151. package/Server/Utils/Workspace/MicrosoftTeams/Actions/AlertEpisode.ts +33 -15
  152. package/Server/Utils/Workspace/MicrosoftTeams/Actions/Auth.ts +21 -1
  153. package/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.ts +301 -225
  154. package/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.ts +38 -16
  155. package/Server/Utils/Workspace/MicrosoftTeams/Actions/ScheduledMaintenance.ts +389 -175
  156. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +376 -144
  157. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsActivityDeduplicator.ts +163 -0
  158. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCardChoices.ts +396 -0
  159. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateCommands.ts +418 -0
  160. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsMessageSize.ts +152 -0
  161. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsReplies.ts +251 -0
  162. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsTimezone.ts +214 -0
  163. package/Tests/App/Accounts/IncidentFormPage.test.tsx +2036 -0
  164. package/Tests/App/Accounts/IncidentFormServerMessages.test.ts +119 -0
  165. package/Tests/App/Accounts/IncidentFormUtils.test.ts +1157 -0
  166. package/Tests/App/Accounts/LoginPasskey.test.tsx +6 -4
  167. package/Tests/App/Accounts/LoginSso.test.tsx +724 -0
  168. package/Tests/App/AdminDashboard/AdminAuthenticationRequireSso.test.tsx +338 -0
  169. package/Tests/App/AdminDashboard/AdminAuthenticationSsoCardLocales.test.tsx +331 -0
  170. package/Tests/App/AdminDashboard/AdminEnterprisePluginPage.test.tsx +47 -33
  171. package/Tests/App/AdminDashboard/GlobalSsoOidcPages.test.tsx +1021 -0
  172. package/Tests/App/Dashboard/AffectedResourcesDisplay.test.tsx +876 -78
  173. package/Tests/App/Dashboard/AffectedResourcesSlo.test.tsx +20 -3
  174. package/Tests/App/Dashboard/CephProxmoxVMwareDocumentationCards.test.tsx +359 -0
  175. package/Tests/App/Dashboard/CephSetupGuide.test.ts +961 -0
  176. package/Tests/App/Dashboard/CloudDocumentationCard.test.tsx +381 -95
  177. package/Tests/App/Dashboard/CloudSetupGuide.test.ts +1463 -0
  178. package/Tests/App/Dashboard/ClusterAccessNotice.test.tsx +267 -12
  179. package/Tests/App/Dashboard/ContainerSetupGuideCards.test.tsx +345 -0
  180. package/Tests/App/Dashboard/CoreListEmptyStates.test.tsx +501 -0
  181. package/Tests/App/Dashboard/DashboardLazyPages.test.tsx +0 -1
  182. package/Tests/App/Dashboard/DatabaseDocumentationCard.test.tsx +400 -0
  183. package/Tests/App/Dashboard/DatabaseDocumentationMarkdown.test.ts +23 -6
  184. package/Tests/App/Dashboard/DatabaseSetupGuide.test.ts +1869 -0
  185. package/Tests/App/Dashboard/DatabaseTelemetryScope.test.ts +44 -0
  186. package/Tests/App/Dashboard/DatabaseTelemetryTabs.test.tsx +50 -9
  187. package/Tests/App/Dashboard/DockerSetupGuide.test.ts +899 -0
  188. package/Tests/App/Dashboard/DockerSwarmSetupGuide.test.ts +964 -0
  189. package/Tests/App/Dashboard/EnterpriseFeatureUpgrade.test.tsx +141 -7
  190. package/Tests/App/Dashboard/EnterprisePluginPage.test.tsx +52 -39
  191. package/Tests/App/Dashboard/EventOverviewPages.test.tsx +7 -1
  192. package/Tests/App/Dashboard/GettingStartedTaskRoutes.test.tsx +331 -0
  193. package/Tests/App/Dashboard/HomeOverviewStatsFirstRun.test.tsx +925 -0
  194. package/Tests/App/Dashboard/HostDocumentationCard.test.tsx +225 -0
  195. package/Tests/App/Dashboard/HostSetupGuide.test.ts +1183 -0
  196. package/Tests/App/Dashboard/IdentityEnterpriseShells.test.tsx +69 -45
  197. package/Tests/App/Dashboard/IncidentCreateTemplateCustomFieldSettings.test.tsx +745 -0
  198. package/Tests/App/Dashboard/IncidentCreateTemplateOwners.test.tsx +414 -0
  199. package/Tests/App/Dashboard/IncidentCustomFieldCreateSettingsForm.test.ts +1042 -0
  200. package/Tests/App/Dashboard/IncidentCustomFieldSettingsCard.test.tsx +1816 -0
  201. package/Tests/App/Dashboard/IncidentFormPlan.test.ts +89 -0
  202. package/Tests/App/Dashboard/IncidentFormShareLinkCard.test.tsx +846 -0
  203. package/Tests/App/Dashboard/IncidentFormsPages.test.tsx +1324 -0
  204. package/Tests/App/Dashboard/IncidentTemplateCustomFieldSettings.test.tsx +630 -0
  205. package/Tests/App/Dashboard/IncidentsSideMenu.test.tsx +13 -0
  206. package/Tests/App/Dashboard/IncomingEmailMonitorLinkVerifyHint.test.tsx +104 -0
  207. package/Tests/App/Dashboard/InvestigationConversation.test.tsx +1107 -0
  208. package/Tests/App/Dashboard/InvestigationConversationData.test.ts +546 -0
  209. package/Tests/App/Dashboard/InvestigationEvidenceList.test.tsx +170 -5
  210. package/Tests/App/Dashboard/InvestigationInfrastructureTools.test.tsx +506 -0
  211. package/Tests/App/Dashboard/InvestigationNotStarted.test.tsx +207 -2
  212. package/Tests/App/Dashboard/InvestigationPanel.test.tsx +729 -34
  213. package/Tests/App/Dashboard/InvestigationPanelStatus.test.tsx +9 -21
  214. package/Tests/App/Dashboard/InvestigationReportView.test.tsx +274 -37
  215. package/Tests/App/Dashboard/InvestigationStatusBadge.test.tsx +130 -0
  216. package/Tests/App/Dashboard/IoTDocumentationCard.test.tsx +218 -0
  217. package/Tests/App/Dashboard/IoTSetupGuide.test.ts +1124 -0
  218. package/Tests/App/Dashboard/KubernetesClusterAiAccessSettings.test.ts +20 -6
  219. package/Tests/App/Dashboard/KubernetesClusterAiDocumentationMarkdown.test.ts +107 -83
  220. package/Tests/App/Dashboard/KubernetesSetupGuide.test.ts +787 -0
  221. package/Tests/App/Dashboard/MessageQueueBreadcrumbs.test.tsx +228 -0
  222. package/Tests/App/Dashboard/MessageQueueBrokerHealth.test.tsx +1538 -0
  223. package/Tests/App/Dashboard/MessageQueueBrokerHealthMetricChart.test.tsx +969 -0
  224. package/Tests/App/Dashboard/MessageQueueBrokerHealthReads.test.ts +889 -0
  225. package/Tests/App/Dashboard/MessageQueueBrokerMetricsReach.test.ts +236 -0
  226. package/Tests/App/Dashboard/MessageQueueDocumentationCard.test.tsx +479 -0
  227. package/Tests/App/Dashboard/MessageQueueListPages.test.tsx +1232 -0
  228. package/Tests/App/Dashboard/MessageQueueMetricDescriptions.test.ts +244 -0
  229. package/Tests/App/Dashboard/MessageQueueMonitorLink.test.ts +952 -0
  230. package/Tests/App/Dashboard/MessageQueueMonitorLinkMonitorCreate.test.tsx +859 -0
  231. package/Tests/App/Dashboard/MessageQueueOverview.test.tsx +1773 -0
  232. package/Tests/App/Dashboard/MessageQueueOverviewPresentation.test.ts +196 -0
  233. package/Tests/App/Dashboard/MessageQueuePresentation.test.ts +799 -0
  234. package/Tests/App/Dashboard/MessageQueueProducersConsumers.test.tsx +680 -0
  235. package/Tests/App/Dashboard/MessageQueueRoutes.test.tsx +383 -0
  236. package/Tests/App/Dashboard/MessageQueueRulePages.test.tsx +278 -0
  237. package/Tests/App/Dashboard/MessageQueueSetupGuide.test.ts +2778 -0
  238. package/Tests/App/Dashboard/MessageQueueSideMenus.test.tsx +273 -0
  239. package/Tests/App/Dashboard/MessageQueueSpanPopulations.test.ts +930 -0
  240. package/Tests/App/Dashboard/MessageQueueSpanStore.ts +351 -0
  241. package/Tests/App/Dashboard/MessageQueueTelemetryScope.test.ts +375 -0
  242. package/Tests/App/Dashboard/MessageQueueTelemetryScopeTabs.test.tsx +668 -0
  243. package/Tests/App/Dashboard/MessageQueueViewPages.test.tsx +685 -0
  244. package/Tests/App/Dashboard/MonitorAndHomeNotOperationalMenus.test.tsx +342 -0
  245. package/Tests/App/Dashboard/MonitorCreateFirstRunDefaults.test.tsx +623 -0
  246. package/Tests/App/Dashboard/MonitorCreateFromMonitorBackedDevice.test.tsx +442 -0
  247. package/Tests/App/Dashboard/MonitorLogsPageViewSummary.test.tsx +814 -0
  248. package/Tests/App/Dashboard/MonitorSetupCardBodies.test.tsx +246 -0
  249. package/Tests/App/Dashboard/NavigationSearchKeywords.test.tsx +8 -0
  250. package/Tests/App/Dashboard/OnboardingSsoEmptyState.test.tsx +27 -12
  251. package/Tests/App/Dashboard/PlanGatedPage.test.tsx +292 -0
  252. package/Tests/App/Dashboard/PodmanSetupGuide.test.ts +948 -0
  253. package/Tests/App/Dashboard/ProductOrientation.test.tsx +5 -4
  254. package/Tests/App/Dashboard/ProductSettingsSectionCollapsed.test.tsx +266 -0
  255. package/Tests/App/Dashboard/ProxmoxSetupGuide.test.ts +1318 -0
  256. package/Tests/App/Dashboard/RemediationSuggestionCardDescription.test.tsx +209 -0
  257. package/Tests/App/Dashboard/RemediationSuggestionCardResource.test.tsx +317 -0
  258. package/Tests/App/Dashboard/ResourceAiAccessSettingsUtil.test.ts +921 -0
  259. package/Tests/App/Dashboard/ResourceAiAgentAttentionServerParity.test.ts +555 -0
  260. package/Tests/App/Dashboard/ResourceAiAgentInstall.test.ts +860 -0
  261. package/Tests/App/Dashboard/ResourceAiAgentPage.test.tsx +2010 -0
  262. package/Tests/App/Dashboard/ResourceAiAgentStatus.test.ts +1455 -0
  263. package/Tests/App/Dashboard/ResourceAiInsightsPage.test.tsx +931 -0
  264. package/Tests/App/Dashboard/ResourceAiNavigation.test.tsx +575 -0
  265. package/Tests/App/Dashboard/ResourceArchiveSettings.test.tsx +16 -0
  266. package/Tests/App/Dashboard/ResourceConnectionGuideCard.test.tsx +444 -0
  267. package/Tests/App/Dashboard/ResourceConnectionGuideOverviewsInfra.test.tsx +798 -0
  268. package/Tests/App/Dashboard/ResourceConnectionGuideOverviewsPlatforms.test.tsx +717 -0
  269. package/Tests/App/Dashboard/ResourceConnectionGuides.test.ts +981 -0
  270. package/Tests/App/Dashboard/ResourceConnectionState.test.ts +132 -0
  271. package/Tests/App/Dashboard/RumDocumentationCard.test.tsx +293 -0
  272. package/Tests/App/Dashboard/RumSessionReplayRetentionSettings.test.tsx +467 -0
  273. package/Tests/App/Dashboard/RumSetupGuide.test.ts +758 -0
  274. package/Tests/App/Dashboard/RunbookStepTypeMaps.test.ts +38 -7
  275. package/Tests/App/Dashboard/ScheduledMaintenanceOverviewPage.test.tsx +25 -0
  276. package/Tests/App/Dashboard/ServerlessDocumentationCard.test.tsx +254 -0
  277. package/Tests/App/Dashboard/ServerlessSetupGuide.test.ts +1074 -0
  278. package/Tests/App/Dashboard/SetupGuide.test.ts +246 -0
  279. package/Tests/App/Dashboard/SetupGuideCard.test.tsx +756 -0
  280. package/Tests/App/Dashboard/SloListSideMenu.test.tsx +120 -0
  281. package/Tests/App/Dashboard/SsoPages.test.tsx +833 -0
  282. package/Tests/App/Dashboard/TelemetryDocumentation.test.tsx +253 -0
  283. package/Tests/App/Dashboard/TelemetryRetentionShells.test.tsx +730 -0
  284. package/Tests/App/Dashboard/VMwareSetupGuide.test.ts +1033 -0
  285. package/Tests/App/StatusPage/StatusPageSsoEmptyState.test.tsx +87 -7
  286. package/Tests/Models/DatabaseModels/DatabaseServerModels.test.ts +61 -10
  287. package/Tests/Models/DatabaseModels/IncidentFormModel.test.ts +1250 -0
  288. package/Tests/Models/DatabaseModels/MessageQueueModels.test.ts +1983 -0
  289. package/Tests/Models/DatabaseModels/ResourceAiAccessColumns.test.ts +738 -0
  290. package/Tests/Models/DatabaseModels/ResourceAiAgentModel.test.ts +842 -0
  291. package/Tests/Models/DatabaseModels/StaticRuleCriteriaInheritance.test.ts +4 -2
  292. package/Tests/Models/DatabaseModels/TeamComplianceSettingModel.test.ts +190 -14
  293. package/Tests/Models/IncidentTemplateCustomFieldSettingsColumn.test.ts +291 -0
  294. package/Tests/Server/API/AIInvestigationConversationAPI.test.ts +412 -0
  295. package/Tests/Server/API/AutoRemediationApproveResourceRound.test.ts +835 -0
  296. package/Tests/Server/API/GlobalConfigLicense.test.ts +38 -9
  297. package/Tests/Server/API/IncidentFormAPI.test.ts +942 -0
  298. package/Tests/Server/API/IncidentFormPublicRoutes.test.ts +1653 -0
  299. package/Tests/Server/API/KubernetesClusterAiAccessAPI.test.ts +2 -1
  300. package/Tests/Server/API/ResourceAiAccessAPI.test.ts +2730 -0
  301. package/Tests/Server/API/{SsoProviderListingsEdition.test.ts → SsoProviderListings.test.ts} +164 -110
  302. package/Tests/Server/Enterprise/EnterpriseEdition.test.ts +76 -54
  303. package/Tests/Server/Enterprise/EnterpriseFeatureActive.test.ts +125 -42
  304. package/Tests/Server/Enterprise/EnterpriseLicenseSnapshot.test.ts +36 -10
  305. package/Tests/Server/Enterprise/EnterpriseModelFeatureMap.test.ts +51 -9
  306. package/Tests/Server/Enterprise/FakeEnterpriseModule.ts +13 -8
  307. package/Tests/Server/Enterprise/SsoInCommunityEdition.test.ts +540 -0
  308. package/Tests/Server/Infrastructure/Postgres/AddConfigurableRuleCriteriaMigration.test.ts +3 -0
  309. package/Tests/Server/Infrastructure/Postgres/AddDatabaseServerTablesMigration.test.ts +60 -0
  310. package/Tests/Server/Infrastructure/Postgres/AddIncidentFormsMigration.test.ts +438 -0
  311. package/Tests/Server/Infrastructure/Postgres/AddResourceAiAgentsMigration.test.ts +659 -0
  312. package/Tests/Server/Infrastructure/Postgres/AddTeamComplianceRuleNotificationChannelsMigration.test.ts +255 -0
  313. package/Tests/Server/Infrastructure/Postgres/MessageQueueTablesMigration.test.ts +637 -0
  314. package/Tests/Server/Infrastructure/SemaphoreMutex.test.ts +31 -0
  315. package/Tests/Server/Middleware/IncidentFormRateLimit.test.ts +1630 -0
  316. package/Tests/Server/Middleware/TelemetryIngestBrowserKey.test.ts +63 -5
  317. package/Tests/Server/Middleware/TelemetryIngestKubernetesAgentRunnerPinnedKey.test.ts +103 -5
  318. package/Tests/Server/Middleware/TelemetryIngestKubernetesAgentRunnerRateLimit.test.ts +19 -1
  319. package/Tests/Server/Middleware/UserAuthorization.test.ts +16 -17
  320. package/Tests/Server/Middleware/UserAuthorizationSsoEnforcement.test.ts +544 -0
  321. package/Tests/Server/Services/AIServiceDailyBudget.test.ts +37 -8
  322. package/Tests/Server/Services/AutoRemediationResourceRuleEngine.test.ts +1279 -0
  323. package/Tests/Server/Services/DatabaseServerService.test.ts +55 -0
  324. package/Tests/Server/Services/GroupTelemetryUsageExcludeNames.test.ts +299 -0
  325. package/Tests/Server/Services/HostServiceFindOrCreateMemo.test.ts +44 -0
  326. package/Tests/Server/Services/IncidentCreatedFeedTitle.test.ts +212 -0
  327. package/Tests/Server/Services/IncidentCustomFieldDeleteFormQuestions.test.ts +297 -0
  328. package/Tests/Server/Services/IncidentFormOwnersCreatedNotification.test.ts +497 -0
  329. package/Tests/Server/Services/IncidentFormPostgres.test.ts +958 -0
  330. package/Tests/Server/Services/IncidentFormPublicForm.test.ts +1260 -0
  331. package/Tests/Server/Services/IncidentFormPublicSubmission.test.ts +2520 -0
  332. package/Tests/Server/Services/IncidentFormRegistration.test.ts +159 -0
  333. package/Tests/Server/Services/IncidentFormService.test.ts +663 -0
  334. package/Tests/Server/Services/IncidentFormSubmissionService.test.ts +430 -0
  335. package/Tests/Server/Services/IncidentFormSubmissionTemplateBranch.test.ts +473 -0
  336. package/Tests/Server/Services/IncidentGroupingTemplateSubstitution.test.ts +81 -0
  337. package/Tests/Server/Services/IncidentTemplateCustomFieldSettings.test.ts +262 -0
  338. package/Tests/Server/Services/IncidentTemplateOwnersOnDeclare.test.ts +566 -0
  339. package/Tests/Server/Services/IncidentTitleMarkdownSinks.test.ts +640 -0
  340. package/Tests/Server/Services/LlmLogServiceTokenAggregateParams.test.ts +3 -3
  341. package/Tests/Server/Services/MessageQueueOwnerServices.test.ts +440 -0
  342. package/Tests/Server/Services/MessageQueueRegistries.test.ts +577 -0
  343. package/Tests/Server/Services/MessageQueueRuleEngines.test.ts +900 -0
  344. package/Tests/Server/Services/MessageQueueService.test.ts +2210 -0
  345. package/Tests/Server/Services/MessageQueueSqlPostgres.test.ts +1271 -0
  346. package/Tests/Server/Services/MonitorProbeServiceIntervalScheduling.test.ts +45 -6
  347. package/Tests/Server/Services/OpenTelemetryResourceRetentionMemo.test.ts +28 -1
  348. package/Tests/Server/Services/OpenTelemetryRetentionOverrideEdition.test.ts +474 -0
  349. package/Tests/Server/Services/OpenTelemetryServiceResolutionCache.test.ts +21 -0
  350. package/Tests/Server/Services/OwnerRowUniqueness.test.ts +3 -0
  351. package/Tests/Server/Services/ProjectServiceAuditLogLicense.test.ts +0 -1
  352. package/Tests/Server/Services/RecordingRuleReservedMetricName.test.ts +171 -0
  353. package/Tests/Server/Services/ResourceAiAccessChangeAuthorization.test.ts +256 -0
  354. package/Tests/Server/Services/ResourceAiAccessService.test.ts +1373 -0
  355. package/Tests/Server/Services/ResourceAiAgentJobService.test.ts +375 -0
  356. package/Tests/Server/Services/ResourceAiAgentServiceHelpers.test.ts +1114 -0
  357. package/Tests/Server/Services/ResourceAiAgentServiceLifecycle.test.ts +1050 -0
  358. package/Tests/Server/Services/ResourceAiAgentServiceRegister.test.ts +2251 -0
  359. package/Tests/Server/Services/ResourceAiSettingsCreate.test.ts +373 -0
  360. package/Tests/Server/Services/ResourceAiSettingsPermission.test.ts +1042 -0
  361. package/Tests/Server/Services/ResourceServiceDeleteCleansUpAi.test.ts +319 -0
  362. package/Tests/Server/Services/RuleRun/LabelRuleEnginesGroupBRun.test.ts +56 -6
  363. package/Tests/Server/Services/RuleRun/OwnerRuleEnginesGroupBRun.test.ts +30 -1
  364. package/Tests/Server/Services/RunnerJobEnqueueKubectl.test.ts +105 -0
  365. package/Tests/Server/Services/RunnerJobEnqueueResourceCommand.test.ts +986 -0
  366. package/Tests/Server/Services/RunnerJobResourceCommandLane.test.ts +211 -0
  367. package/Tests/Server/Services/RunnerJobResourceCommandTimeoutAndRedaction.test.ts +352 -0
  368. package/Tests/Server/Services/SsoRequirementReads.test.ts +454 -0
  369. package/Tests/Server/Services/SsoRequirementWrites.test.ts +529 -0
  370. package/Tests/Server/Services/StaticRuleCriteriaRuntimeCoverage.test.ts +3 -3
  371. package/Tests/Server/Services/StatusPagePrivateUserInvitationPolicy.test.ts +107 -89
  372. package/Tests/Server/Services/TeamComplianceSettingPostgres.test.ts +1068 -176
  373. package/Tests/Server/Services/TeamComplianceSettingService.test.ts +1962 -200
  374. package/Tests/Server/Services/TelemetryUsageBillingSloExclusion.test.ts +218 -0
  375. package/Tests/Server/TestingUtils/Services/FakeRunnerJobCount.ts +145 -0
  376. package/Tests/Server/Types/Database/Permissions/EditionPermission.test.ts +654 -297
  377. package/Tests/Server/Types/Database/Permissions/RetentionOverrideColumns.test.ts +784 -0
  378. package/Tests/Server/Types/Database/Permissions/SsoScalePlanGate.test.ts +418 -0
  379. package/Tests/Server/Utils/AI/AIAlertGating.test.ts +0 -1
  380. package/Tests/Server/Utils/AI/AIInvestigationEngineRunLimits.test.ts +136 -0
  381. package/Tests/Server/Utils/AI/AIInvestigationQueue.test.ts +15 -14
  382. package/Tests/Server/Utils/AI/AgentContextCompactor.test.ts +351 -0
  383. package/Tests/Server/Utils/AI/ChatAgentRunnerSharedThread.test.ts +842 -0
  384. package/Tests/Server/Utils/AI/ChatRunCancellation.test.ts +195 -0
  385. package/Tests/Server/Utils/AI/CodeFixReadiness.test.ts +10 -57
  386. package/Tests/Server/Utils/AI/FixRunBudget.test.ts +20 -24
  387. package/Tests/Server/Utils/AI/Insights/InvestigationQueueInsightSubject.test.ts +7 -30
  388. package/Tests/Server/Utils/AI/InvestigationClusterAccessWiring.test.ts +225 -29
  389. package/Tests/Server/Utils/AI/InvestigationInfrastructureAccessWiring.test.ts +694 -0
  390. package/Tests/Server/Utils/AI/InvestigationInfrastructureReport.test.ts +721 -0
  391. package/Tests/Server/Utils/AI/InvestigationThread.test.ts +580 -0
  392. package/Tests/Server/Utils/AI/InvestigationThreadService.test.ts +801 -0
  393. package/Tests/Server/Utils/AI/KubectlInvestigationToolkit.test.ts +525 -43
  394. package/Tests/Server/Utils/AI/KubectlJobRunner.test.ts +4 -2
  395. package/Tests/Server/Utils/AI/LLMServiceUnreachableProvider.test.ts +435 -0
  396. package/Tests/Server/Utils/AI/ObservabilityAssistantLimits.test.ts +462 -0
  397. package/Tests/Server/Utils/AI/RemediationCommandTools.test.ts +94 -1
  398. package/Tests/Server/Utils/AI/RemediationCommandToolsResource.test.ts +1530 -0
  399. package/Tests/Server/Utils/AI/RemediationExecutionRunner.test.ts +14 -25
  400. package/Tests/Server/Utils/AI/RemediationExecutionRunnerResourceMode.test.ts +1251 -0
  401. package/Tests/Server/Utils/AI/RemediationPlanRunner.test.ts +117 -0
  402. package/Tests/Server/Utils/AI/RemediationResourceCopyParity.test.ts +463 -0
  403. package/Tests/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.test.ts +1004 -0
  404. package/Tests/Server/Utils/AI/ResourceAccess/ResourceAccessContext.test.ts +266 -0
  405. package/Tests/Server/Utils/AI/ResourceAccess/ResourceAiAccessSettings.test.ts +1220 -0
  406. package/Tests/Server/Utils/AI/ResourceAccess/ResourceAiDeleteCleanup.test.ts +569 -0
  407. package/Tests/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.test.ts +834 -0
  408. package/Tests/Server/Utils/AI/ToolOutputPager.test.ts +382 -0
  409. package/Tests/Server/Utils/AI/ToolResultSerializer.test.ts +23 -4
  410. package/Tests/Server/Utils/AI/Toolbox/LogTools.test.ts +25 -6
  411. package/Tests/Server/Utils/AI/Toolbox/Serializer.test.ts +14 -3
  412. package/Tests/Server/Utils/AutoRemediation/CommandPlanExecutorResource.test.ts +717 -0
  413. package/Tests/Server/Utils/AutoRemediation/RemediationVerifierResourceFollowUp.test.ts +338 -0
  414. package/Tests/Server/Utils/EditionEnforcement.test.ts +107 -147
  415. package/Tests/Server/Utils/Monitor/Criteria/SessionReplayBudgetTemplateCriteria.test.ts +422 -0
  416. package/Tests/Server/Utils/{CommunityEditionSsoReport.test.ts → RelaxedScimTeamLocksReport.test.ts} +212 -208
  417. package/Tests/Server/Utils/SameOriginRequest.test.ts +372 -0
  418. package/Tests/Server/Utils/SessionReplay/SessionReplayBudgetMetrics.test.ts +1647 -0
  419. package/Tests/Server/Utils/SessionReplay/SessionReplayUsage.test.ts +143 -1
  420. package/Tests/Server/Utils/Telemetry/EntityRegistry.test.ts +20 -0
  421. package/Tests/Server/Utils/Telemetry/MessageQueueDiscovery.test.ts +2590 -0
  422. package/Tests/Server/Utils/Telemetry/MessageQueueSpanQueryTwin.ts +246 -0
  423. package/Tests/Server/Utils/Telemetry/TelemetryEntity.test.ts +23 -0
  424. package/Tests/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.test.ts +33 -3
  425. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsAccountNotLinked.test.ts +1093 -0
  426. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsActivityDeduplicator.test.ts +1049 -0
  427. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCardChoices.test.ts +1676 -0
  428. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateCards.test.ts +2884 -0
  429. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateCommands.test.ts +2490 -0
  430. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateSubmit.test.ts +2293 -0
  431. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateSubmitServerTimezone.test.ts +386 -0
  432. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsMessageSize.test.ts +1477 -0
  433. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsReplies.test.ts +1967 -0
  434. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsStripHtmlTags.test.ts +92 -0
  435. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsSubmittedFormRemoval.test.ts +1819 -0
  436. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsTimezone.test.ts +1033 -0
  437. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsTimezoneServerZone.test.ts +610 -0
  438. package/Tests/Server/Utils/Workspace/MicrosoftTeamsBotMessageHandling.test.ts +2610 -0
  439. package/Tests/Server/Utils/Workspace/MicrosoftTeamsCreateCommandsEndToEnd.test.ts +4672 -0
  440. package/Tests/Server/Utils/Workspace/WorkspaceCreateProjectReferences.test.ts +190 -65
  441. package/Tests/Types/AI/AIAgentRunLimits.test.ts +255 -0
  442. package/Tests/Types/AutoRemediation/AiRemediationCommandPlan.test.ts +10 -4
  443. package/Tests/Types/AutoRemediation/AiRemediationCommandPlanResourceCommand.test.ts +305 -0
  444. package/Tests/Types/Code/JsonSyntax.test.ts +1300 -0
  445. package/Tests/Types/CustomField/CustomFieldCreateSettings.test.ts +1113 -0
  446. package/Tests/Types/CustomField/CustomFieldMappingCatalog.test.ts +91 -0
  447. package/Tests/Types/CustomField/CustomFieldValueValidator.test.ts +30 -0
  448. package/Tests/Types/Incident/IncidentFormIpAllowlist.test.ts +227 -0
  449. package/Tests/Types/Incident/IncidentFormPublic.test.ts +1916 -0
  450. package/Tests/Types/MessageQueue/MessageQueueEntityKey.test.ts +916 -0
  451. package/Tests/Types/MessageQueue/MessageQueueIdentity.test.ts +567 -0
  452. package/Tests/Types/MessageQueue/MessageQueueManualIdentity.test.ts +686 -0
  453. package/Tests/Types/MessageQueue/MessageQueueMetricCatalog.test.ts +1726 -0
  454. package/Tests/Types/MessageQueue/MessageQueueMetricResolution.test.ts +1758 -0
  455. package/Tests/Types/MessageQueue/MessagingInstrumentationFixtures.test.ts +4686 -0
  456. package/Tests/Types/MessageQueue/MessagingSystem.test.ts +840 -0
  457. package/Tests/Types/MessageQueue/MessagingTelemetryFixtures.ts +3287 -0
  458. package/Tests/Types/MessageQueue/MessagingTelemetryResolver.test.ts +2966 -0
  459. package/Tests/Types/Monitor/MessageQueueAlertTemplates.test.ts +5401 -0
  460. package/Tests/Types/Monitor/MetricEngineFold.ts +154 -0
  461. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCatalog.test.ts +277 -13
  462. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationUtil.test.ts +113 -0
  463. package/Tests/Types/Monitor/RumAlertTemplates.test.ts +773 -2
  464. package/Tests/Types/ResourceAiAgent/AiResourceType.test.ts +419 -0
  465. package/Tests/Types/ResourceAiAgent/ResourceAiAccess.test.ts +519 -0
  466. package/Tests/Types/Runbook/RunbookStepType.test.ts +147 -8
  467. package/Tests/Types/Team/ComplianceRule.test.ts +588 -37
  468. package/Tests/Types/Team/TeamComplianceStatus.test.ts +64 -11
  469. package/Tests/Types/XML.test.ts +51 -0
  470. package/Tests/UI/Components/CodeEditor/CodeEditor.test.tsx +2362 -0
  471. package/Tests/UI/Components/CodeEditor/CodeEditorCommands.test.ts +810 -0
  472. package/Tests/UI/Components/CodeEditor/CodeEditorHighlight.test.ts +338 -0
  473. package/Tests/UI/Components/CodeEditor/CodeEditorLanguages.test.ts +222 -0
  474. package/Tests/UI/Components/CodeEditor/CodeEditorStyles.test.ts +807 -0
  475. package/Tests/UI/Components/CodeEditor/NoMonaco.test.ts +245 -0
  476. package/Tests/UI/Components/CodeEditor/YamlEditor.test.tsx +729 -0
  477. package/Tests/UI/Components/CopyTextButton.test.tsx +76 -0
  478. package/Tests/UI/Components/EditionLabelLapseCopy.ts +51 -14
  479. package/Tests/UI/Components/EditionLabelLicenseStatus.test.tsx +131 -23
  480. package/Tests/UI/Components/ErrorMessageAction.test.tsx +142 -0
  481. package/Tests/UI/Components/FacetSidebarInScope.test.tsx +459 -0
  482. package/Tests/UI/Components/FacetValuesInScope.test.ts +270 -0
  483. package/Tests/UI/Components/Forms/FormFieldCodeEditors.test.tsx +294 -0
  484. package/Tests/UI/Components/Forms/FormFieldMarkdown.test.tsx +126 -0
  485. package/Tests/UI/Components/Forms/FormFieldYaml.test.tsx +22 -75
  486. package/Tests/UI/Components/Forms/ModelFormOnBeforeCreateMiscData.test.tsx +254 -0
  487. package/Tests/UI/Components/Icon.test.tsx +32 -0
  488. package/Tests/UI/Components/Input.test.tsx +31 -0
  489. package/Tests/UI/Components/LockedFilterChipScope.test.tsx +501 -0
  490. package/Tests/UI/Components/MarkdownConverters.test.ts +253 -1
  491. package/Tests/UI/Components/MarkdownEditor.test.tsx +2785 -2
  492. package/Tests/UI/Components/MarkdownEditorHistory.test.ts +243 -0
  493. package/Tests/UI/Components/MarkdownListEditing.test.ts +1118 -0
  494. package/Tests/UI/Components/MarkdownPaste.test.ts +1180 -0
  495. package/Tests/UI/Components/MarkdownViewerCopy.test.tsx +466 -0
  496. package/Tests/UI/Components/MarkdownVisualEditing.test.ts +1089 -0
  497. package/Tests/UI/Components/ModelTable/BaseModelTableEmptyStateAction.test.tsx +623 -0
  498. package/Tests/UI/Components/ResetObjectID.test.tsx +282 -0
  499. package/Tests/UI/Components/RuleCriteria/RuleCriteriaModelTable.test.tsx +3 -3
  500. package/Tests/UI/Components/Table/EmptyTableMessage.test.ts +439 -0
  501. package/Tests/UI/Components/Table/TableEmptyState.test.tsx +352 -0
  502. package/Tests/UI/Components/TableRowMobileTitles.test.tsx +78 -0
  503. package/Tests/UI/Components/TextArea.test.tsx +19 -0
  504. package/Tests/UI/Components/Workflow/ModelColumnEditor.render.test.tsx +12 -29
  505. package/Tests/UI/Components/fixtures/MarkdownPasteFixtures.ts +460 -0
  506. package/Tests/UI/EsbuildConfig.test.ts +115 -39
  507. package/Tests/UI/EsbuildEnterpriseAlias.test.ts +4 -4
  508. package/Tests/UI/Monitor/MonitorLogSummaryRender.test.tsx +377 -0
  509. package/Tests/UI/Rum/RecordingHealthDashboard.test.tsx +769 -1
  510. package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +81 -1
  511. package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +17 -0
  512. package/Tests/Utils/AiRemediation/Resource/CephCommandPolicy.test.ts +1653 -0
  513. package/Tests/Utils/AiRemediation/Resource/CephOutputRedaction.test.ts +204 -0
  514. package/Tests/Utils/AiRemediation/Resource/DatabaseCommandPolicy.test.ts +1077 -0
  515. package/Tests/Utils/AiRemediation/Resource/DatabaseDiagnosticCatalog.test.ts +558 -0
  516. package/Tests/Utils/AiRemediation/Resource/DatabaseQueryRedactor.test.ts +834 -0
  517. package/Tests/Utils/AiRemediation/Resource/DockerCliGrammar.test.ts +747 -0
  518. package/Tests/Utils/AiRemediation/Resource/DockerEngineCommandPolicy.test.ts +1259 -0
  519. package/Tests/Utils/AiRemediation/Resource/DockerOutputRedaction.test.ts +386 -0
  520. package/Tests/Utils/AiRemediation/Resource/DockerSwarmCommandPolicy.test.ts +782 -0
  521. package/Tests/Utils/AiRemediation/Resource/GovcCommandPolicy.test.ts +2259 -0
  522. package/Tests/Utils/AiRemediation/Resource/HostCommandPolicy.test.ts +2019 -0
  523. package/Tests/Utils/AiRemediation/Resource/ProxmoxCommandPolicy.test.ts +2497 -0
  524. package/Tests/Utils/AiRemediation/Resource/ResourceCommandPolicy.test.ts +1305 -0
  525. package/Tests/Utils/AiRemediation/Resource/ResourceCommandPolicyCore.test.ts +585 -0
  526. package/Tests/Utils/AiRemediation/Resource/ResourceOutputRedactor.test.ts +334 -0
  527. package/Tests/Utils/AiRemediation/Resource/ResourceOutputRedactorCopyParity.test.ts +98 -0
  528. package/Tests/Utils/AiRemediation/Resource/ResourcePolicyImportClosure.test.ts +391 -0
  529. package/Tests/Utils/AiRemediation/ResourceAiAgentPolicyCopyParity.test.ts +497 -0
  530. package/Tests/Utils/LabelRuleImportExport.test.ts +5 -0
  531. package/Tests/Utils/Markdown/DashboardMarkdownRenderer.ts +81 -0
  532. package/Tests/Utils/Markdown/UntrustedMarkdown.test.ts +1339 -0
  533. package/Tests/Utils/Monitor/MonitorLogSummaryUtil.test.ts +862 -0
  534. package/Tests/Utils/SessionReplay/SessionReplayBudgetMetricType.test.ts +383 -0
  535. package/Types/AI/AIAgentRunLimits.ts +146 -0
  536. package/Types/AI/ResourceAiAccessApi.ts +140 -0
  537. package/Types/AI/ResourceAiAccessPermissions.ts +126 -0
  538. package/Types/AutoRemediation/AiRemediationCommandPlan.ts +183 -2
  539. package/Types/Code/CodeType.ts +2 -0
  540. package/Types/Code/JsonSyntax.ts +923 -0
  541. package/Types/CustomField/CustomFieldCreateSettings.ts +549 -0
  542. package/Types/CustomField/CustomFieldMappingCatalog.ts +77 -0
  543. package/Types/CustomField/CustomFieldValueValidator.ts +10 -7
  544. package/Types/EnterpriseLicense/EnterpriseLicensePeriods.ts +1 -1
  545. package/Types/Icon/IconProp.ts +2 -0
  546. package/Types/Incident/IncidentFormIpAllowlist.ts +206 -0
  547. package/Types/Incident/IncidentFormPublic.ts +1145 -0
  548. package/Types/Kubernetes/KubernetesClusterAiAccess.ts +10 -3
  549. package/Types/MessageQueue/MessageQueueIdentity.ts +256 -0
  550. package/Types/MessageQueue/MessageQueueManualIdentity.ts +325 -0
  551. package/Types/MessageQueue/MessageQueueMetricCatalog.ts +1357 -0
  552. package/Types/MessageQueue/MessagingSystem.ts +518 -0
  553. package/Types/MessageQueue/MessagingTelemetryResolver.ts +2311 -0
  554. package/Types/Monitor/MessageQueueAlertTemplates.ts +2128 -0
  555. package/Types/Monitor/Recommendation/MonitorRecommendationCatalog.ts +55 -22
  556. package/Types/Monitor/Recommendation/MonitorRecommendationTypes.ts +35 -3
  557. package/Types/Monitor/RumAlertTemplates.ts +351 -4
  558. package/Types/Permission.ts +310 -0
  559. package/Types/ResourceAiAgent/AiResourceType.ts +310 -0
  560. package/Types/ResourceAiAgent/ResourceAiAccess.ts +580 -0
  561. package/Types/Rules/RuleCriteriaFieldRegistry.ts +12 -0
  562. package/Types/Rules/RuleRun.ts +4 -0
  563. package/Types/Rum/SessionReplayBudgetMetricType.ts +47 -0
  564. package/Types/Runbook/RunbookStepType.ts +29 -0
  565. package/Types/Team/ComplianceNotificationChannel.ts +4 -3
  566. package/Types/Team/ComplianceRule.ts +71 -18
  567. package/Types/Team/ComplianceRuleType.ts +2 -2
  568. package/Types/Team/TeamComplianceStatus.ts +6 -2
  569. package/Types/Telemetry/EntityType.ts +16 -0
  570. package/Types/Telemetry/LockedFilterDetail.ts +22 -0
  571. package/Types/Telemetry/TelemetryIngestSurface.ts +14 -2
  572. package/Types/XML.ts +26 -0
  573. package/UI/Components/CodeEditor/CodeEditor.css +379 -0
  574. package/UI/Components/CodeEditor/CodeEditor.tsx +1128 -294
  575. package/UI/Components/CodeEditor/CodeEditorCommands.ts +774 -0
  576. package/UI/Components/CodeEditor/CodeEditorHighlight.ts +106 -0
  577. package/UI/Components/CodeEditor/CodeEditorLanguages.ts +164 -0
  578. package/UI/Components/CodeEditor/YamlEditor.tsx +28 -326
  579. package/UI/Components/CopyTextButton/CopyTextButton.tsx +5 -1
  580. package/UI/Components/CustomFields/CustomFieldModelFormFields.tsx +6 -25
  581. package/UI/Components/EditionLabel/EditionLabel.tsx +14 -13
  582. package/UI/Components/ErrorMessage/ErrorMessage.tsx +11 -1
  583. package/UI/Components/Forms/Fields/FormField.tsx +8 -0
  584. package/UI/Components/Forms/Types/Field.ts +8 -0
  585. package/UI/Components/Icon/Icon.tsx +18 -0
  586. package/UI/Components/Input/Input.tsx +11 -4
  587. package/UI/Components/LogsViewer/LogsViewer.tsx +4 -0
  588. package/UI/Components/LogsViewer/components/LogsFacetSidebar.tsx +21 -3
  589. package/UI/Components/Markdown.tsx/MarkdownConverters.ts +0 -0
  590. package/UI/Components/Markdown.tsx/MarkdownEditor.tsx +877 -79
  591. package/UI/Components/Markdown.tsx/MarkdownEditorHistory.ts +284 -0
  592. package/UI/Components/Markdown.tsx/MarkdownListEditing.ts +1362 -0
  593. package/UI/Components/Markdown.tsx/MarkdownPaste.ts +1326 -0
  594. package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +106 -10
  595. package/UI/Components/Markdown.tsx/MarkdownVisualEditing.ts +1032 -0
  596. package/UI/Components/ModelTable/BaseModelTable.tsx +85 -7
  597. package/UI/Components/ResetObjectID/ResetObjectID.tsx +35 -9
  598. package/UI/Components/Table/EmptyTableMessage.ts +81 -0
  599. package/UI/Components/Table/Table.tsx +50 -21
  600. package/UI/Components/Table/TableRow.tsx +9 -1
  601. package/UI/Components/TelemetryViewer/FacetVisibility.ts +97 -2
  602. package/UI/Components/TelemetryViewer/TelemetryViewer.tsx +13 -0
  603. package/UI/Components/TelemetryViewer/components/LockedFilterChip.tsx +214 -7
  604. package/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.tsx +21 -3
  605. package/UI/Components/TextArea/TextArea.tsx +9 -2
  606. package/UI/Components/Workflow/ModelFieldPicker.tsx +10 -12
  607. package/UI/Styles/Theme.css +8 -0
  608. package/UI/esbuild-config.js +2 -32
  609. package/Utils/AI/InvestigationReport.ts +121 -15
  610. package/Utils/AiRemediation/Resource/CephCommandPolicy.ts +1936 -0
  611. package/Utils/AiRemediation/Resource/DatabaseCommandPolicy.ts +166 -0
  612. package/Utils/AiRemediation/Resource/DatabaseDiagnosticCatalog.ts +1532 -0
  613. package/Utils/AiRemediation/Resource/DatabaseQueryRedactor.ts +1394 -0
  614. package/Utils/AiRemediation/Resource/DockerCliGrammar.ts +1839 -0
  615. package/Utils/AiRemediation/Resource/DockerEngineCommandPolicy.ts +490 -0
  616. package/Utils/AiRemediation/Resource/DockerSwarmCommandPolicy.ts +687 -0
  617. package/Utils/AiRemediation/Resource/GovcCommandPolicy.ts +2096 -0
  618. package/Utils/AiRemediation/Resource/HostCommandPolicy.ts +2982 -0
  619. package/Utils/AiRemediation/Resource/ProxmoxCommandPolicy.ts +1679 -0
  620. package/Utils/AiRemediation/Resource/ResourceCommandPolicy.ts +851 -0
  621. package/Utils/AiRemediation/Resource/ResourceCommandPolicyCore.ts +593 -0
  622. package/Utils/AiRemediation/Resource/ResourceOutputRedactor.ts +2812 -0
  623. package/Utils/LabelRuleImportExport.ts +2 -0
  624. package/Utils/Markdown/UntrustedMarkdown.ts +1513 -0
  625. package/Utils/Monitor/IncomingEmailMonitorRequestUtil.ts +41 -0
  626. package/Utils/Monitor/MonitorLogSummaryUtil.ts +212 -0
  627. package/Utils/SessionReplay/SessionReplayBudgetMetricType.ts +184 -0
  628. package/Utils/Telemetry/EntityKey.ts +48 -0
  629. package/build/dist/Models/DatabaseModels/AIConversation.js +125 -1
  630. package/build/dist/Models/DatabaseModels/AIConversation.js.map +1 -1
  631. package/build/dist/Models/DatabaseModels/AutoRemediationSuggestion.js +62 -0
  632. package/build/dist/Models/DatabaseModels/AutoRemediationSuggestion.js.map +1 -1
  633. package/build/dist/Models/DatabaseModels/CephCluster.js +231 -0
  634. package/build/dist/Models/DatabaseModels/CephCluster.js.map +1 -1
  635. package/build/dist/Models/DatabaseModels/CloudResource.js +12 -0
  636. package/build/dist/Models/DatabaseModels/CloudResource.js.map +1 -1
  637. package/build/dist/Models/DatabaseModels/DatabaseServer.js +231 -0
  638. package/build/dist/Models/DatabaseModels/DatabaseServer.js.map +1 -1
  639. package/build/dist/Models/DatabaseModels/DockerHost.js +231 -0
  640. package/build/dist/Models/DatabaseModels/DockerHost.js.map +1 -1
  641. package/build/dist/Models/DatabaseModels/DockerSwarmCluster.js +231 -0
  642. package/build/dist/Models/DatabaseModels/DockerSwarmCluster.js.map +1 -1
  643. package/build/dist/Models/DatabaseModels/GlobalConfig.js +1 -1
  644. package/build/dist/Models/DatabaseModels/GlobalConfig.js.map +1 -1
  645. package/build/dist/Models/DatabaseModels/GlobalOidc.js +0 -4
  646. package/build/dist/Models/DatabaseModels/GlobalOidc.js.map +1 -1
  647. package/build/dist/Models/DatabaseModels/GlobalOidcProject.js +0 -4
  648. package/build/dist/Models/DatabaseModels/GlobalOidcProject.js.map +1 -1
  649. package/build/dist/Models/DatabaseModels/GlobalSso.js +0 -4
  650. package/build/dist/Models/DatabaseModels/GlobalSso.js.map +1 -1
  651. package/build/dist/Models/DatabaseModels/GlobalSsoProject.js +0 -4
  652. package/build/dist/Models/DatabaseModels/GlobalSsoProject.js.map +1 -1
  653. package/build/dist/Models/DatabaseModels/Host.js +231 -0
  654. package/build/dist/Models/DatabaseModels/Host.js.map +1 -1
  655. package/build/dist/Models/DatabaseModels/IncidentForm.js +605 -0
  656. package/build/dist/Models/DatabaseModels/IncidentForm.js.map +1 -0
  657. package/build/dist/Models/DatabaseModels/IncidentFormSubmission.js +299 -0
  658. package/build/dist/Models/DatabaseModels/IncidentFormSubmission.js.map +1 -0
  659. package/build/dist/Models/DatabaseModels/IncidentTemplate.js +60 -0
  660. package/build/dist/Models/DatabaseModels/IncidentTemplate.js.map +1 -1
  661. package/build/dist/Models/DatabaseModels/Index.js +16 -0
  662. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  663. package/build/dist/Models/DatabaseModels/IoTFleet.js +12 -0
  664. package/build/dist/Models/DatabaseModels/IoTFleet.js.map +1 -1
  665. package/build/dist/Models/DatabaseModels/KubernetesCluster.js +12 -0
  666. package/build/dist/Models/DatabaseModels/KubernetesCluster.js.map +1 -1
  667. package/build/dist/Models/DatabaseModels/MessageQueue.js +1106 -0
  668. package/build/dist/Models/DatabaseModels/MessageQueue.js.map +1 -0
  669. package/build/dist/Models/DatabaseModels/MessageQueueLabelRule.js +562 -0
  670. package/build/dist/Models/DatabaseModels/MessageQueueLabelRule.js.map +1 -0
  671. package/build/dist/Models/DatabaseModels/MessageQueueOwnerRule.js +643 -0
  672. package/build/dist/Models/DatabaseModels/MessageQueueOwnerRule.js.map +1 -0
  673. package/build/dist/Models/DatabaseModels/MessageQueueOwnerTeam.js +506 -0
  674. package/build/dist/Models/DatabaseModels/MessageQueueOwnerTeam.js.map +1 -0
  675. package/build/dist/Models/DatabaseModels/MessageQueueOwnerUser.js +505 -0
  676. package/build/dist/Models/DatabaseModels/MessageQueueOwnerUser.js.map +1 -0
  677. package/build/dist/Models/DatabaseModels/PodmanHost.js +231 -0
  678. package/build/dist/Models/DatabaseModels/PodmanHost.js.map +1 -1
  679. package/build/dist/Models/DatabaseModels/Project.js +61 -0
  680. package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
  681. package/build/dist/Models/DatabaseModels/ProjectOidc.js +0 -4
  682. package/build/dist/Models/DatabaseModels/ProjectOidc.js.map +1 -1
  683. package/build/dist/Models/DatabaseModels/ProjectSso.js +0 -4
  684. package/build/dist/Models/DatabaseModels/ProjectSso.js.map +1 -1
  685. package/build/dist/Models/DatabaseModels/ProxmoxCluster.js +231 -0
  686. package/build/dist/Models/DatabaseModels/ProxmoxCluster.js.map +1 -1
  687. package/build/dist/Models/DatabaseModels/ResourceAiAgent.js +439 -0
  688. package/build/dist/Models/DatabaseModels/ResourceAiAgent.js.map +1 -0
  689. package/build/dist/Models/DatabaseModels/RumApplication.js +12 -0
  690. package/build/dist/Models/DatabaseModels/RumApplication.js.map +1 -1
  691. package/build/dist/Models/DatabaseModels/RunnerJob.js +145 -0
  692. package/build/dist/Models/DatabaseModels/RunnerJob.js.map +1 -1
  693. package/build/dist/Models/DatabaseModels/ServerlessFunction.js +12 -0
  694. package/build/dist/Models/DatabaseModels/ServerlessFunction.js.map +1 -1
  695. package/build/dist/Models/DatabaseModels/Service.js +12 -0
  696. package/build/dist/Models/DatabaseModels/Service.js.map +1 -1
  697. package/build/dist/Models/DatabaseModels/StatusPageOidc.js +0 -4
  698. package/build/dist/Models/DatabaseModels/StatusPageOidc.js.map +1 -1
  699. package/build/dist/Models/DatabaseModels/StatusPageSso.js +0 -4
  700. package/build/dist/Models/DatabaseModels/StatusPageSso.js.map +1 -1
  701. package/build/dist/Models/DatabaseModels/TeamComplianceSetting.js +49 -3
  702. package/build/dist/Models/DatabaseModels/TeamComplianceSetting.js.map +1 -1
  703. package/build/dist/Models/DatabaseModels/VMwareVCenter.js +231 -0
  704. package/build/dist/Models/DatabaseModels/VMwareVCenter.js.map +1 -1
  705. package/build/dist/Server/API/AIChatAPI.js +9 -103
  706. package/build/dist/Server/API/AIChatAPI.js.map +1 -1
  707. package/build/dist/Server/API/AIInvestigationAPI.js +3 -3
  708. package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
  709. package/build/dist/Server/API/AIInvestigationConversationAPI.js +162 -0
  710. package/build/dist/Server/API/AIInvestigationConversationAPI.js.map +1 -0
  711. package/build/dist/Server/API/AutoRemediationAPI.js +231 -1
  712. package/build/dist/Server/API/AutoRemediationAPI.js.map +1 -1
  713. package/build/dist/Server/API/IncidentFormAPI.js +245 -0
  714. package/build/dist/Server/API/IncidentFormAPI.js.map +1 -0
  715. package/build/dist/Server/API/ProjectOIDC.js +16 -24
  716. package/build/dist/Server/API/ProjectOIDC.js.map +1 -1
  717. package/build/dist/Server/API/ProjectSSO.js +16 -24
  718. package/build/dist/Server/API/ProjectSSO.js.map +1 -1
  719. package/build/dist/Server/API/ResourceAiAccessAPI.js +1119 -0
  720. package/build/dist/Server/API/ResourceAiAccessAPI.js.map +1 -0
  721. package/build/dist/Server/API/StatusPageAPI.js +42 -75
  722. package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
  723. package/build/dist/Server/Enterprise/EnterpriseEdition.js +79 -25
  724. package/build/dist/Server/Enterprise/EnterpriseEdition.js.map +1 -1
  725. package/build/dist/Server/Enterprise/EnterpriseFeature.js +24 -3
  726. package/build/dist/Server/Enterprise/EnterpriseFeature.js.map +1 -1
  727. package/build/dist/Server/Enterprise/EnterpriseLicenseSnapshot.js +1 -1
  728. package/build/dist/Server/Enterprise/EnterpriseServerModule.js.map +1 -1
  729. package/build/dist/Server/EnvironmentConfig.js +1 -1
  730. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796300000000-AddResourceAiAgents.js +168 -0
  731. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796300000000-AddResourceAiAgents.js.map +1 -0
  732. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796400000000-AddIncidentForms.js +63 -0
  733. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796400000000-AddIncidentForms.js.map +1 -0
  734. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796500000000-AddTeamComplianceRuleNotificationChannels.js +41 -0
  735. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796500000000-AddTeamComplianceRuleNotificationChannels.js.map +1 -0
  736. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796600000000-AddAIInvestigationConversationAndTimeLimits.js +40 -0
  737. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796600000000-AddAIInvestigationConversationAndTimeLimits.js.map +1 -0
  738. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796700000000-AddMessageQueueTables.js +183 -0
  739. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796700000000-AddMessageQueueTables.js.map +1 -0
  740. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +10 -0
  741. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  742. package/build/dist/Server/Infrastructure/Semaphore.js +6 -0
  743. package/build/dist/Server/Infrastructure/Semaphore.js.map +1 -1
  744. package/build/dist/Server/Middleware/IncidentFormRateLimit.js +559 -0
  745. package/build/dist/Server/Middleware/IncidentFormRateLimit.js.map +1 -0
  746. package/build/dist/Server/Middleware/TelemetryIngest.js +12 -5
  747. package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
  748. package/build/dist/Server/Middleware/UserAuthorization.js +11 -30
  749. package/build/dist/Server/Middleware/UserAuthorization.js.map +1 -1
  750. package/build/dist/Server/Services/AIService.js +10 -13
  751. package/build/dist/Server/Services/AIService.js.map +1 -1
  752. package/build/dist/Server/Services/AnalyticsDatabaseService.js +26 -1
  753. package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
  754. package/build/dist/Server/Services/AutoRemediationRuleEngineService.js +601 -3
  755. package/build/dist/Server/Services/AutoRemediationRuleEngineService.js.map +1 -1
  756. package/build/dist/Server/Services/CephClusterService.js +104 -0
  757. package/build/dist/Server/Services/CephClusterService.js.map +1 -1
  758. package/build/dist/Server/Services/DatabaseServerService.js +99 -0
  759. package/build/dist/Server/Services/DatabaseServerService.js.map +1 -1
  760. package/build/dist/Server/Services/DockerHostService.js +104 -0
  761. package/build/dist/Server/Services/DockerHostService.js.map +1 -1
  762. package/build/dist/Server/Services/DockerSwarmClusterService.js +104 -0
  763. package/build/dist/Server/Services/DockerSwarmClusterService.js.map +1 -1
  764. package/build/dist/Server/Services/HostService.js +114 -2
  765. package/build/dist/Server/Services/HostService.js.map +1 -1
  766. package/build/dist/Server/Services/IncidentCustomFieldService.js +83 -0
  767. package/build/dist/Server/Services/IncidentCustomFieldService.js.map +1 -1
  768. package/build/dist/Server/Services/IncidentEpisodeMemberService.js +8 -4
  769. package/build/dist/Server/Services/IncidentEpisodeMemberService.js.map +1 -1
  770. package/build/dist/Server/Services/IncidentEpisodeService.js +10 -1
  771. package/build/dist/Server/Services/IncidentEpisodeService.js.map +1 -1
  772. package/build/dist/Server/Services/IncidentFormService.js +1202 -0
  773. package/build/dist/Server/Services/IncidentFormService.js.map +1 -0
  774. package/build/dist/Server/Services/IncidentFormSubmissionService.js +91 -0
  775. package/build/dist/Server/Services/IncidentFormSubmissionService.js.map +1 -0
  776. package/build/dist/Server/Services/IncidentGroupingEngineService.js +20 -8
  777. package/build/dist/Server/Services/IncidentGroupingEngineService.js.map +1 -1
  778. package/build/dist/Server/Services/IncidentService.js +106 -4
  779. package/build/dist/Server/Services/IncidentService.js.map +1 -1
  780. package/build/dist/Server/Services/IncidentTemplateService.js +18 -0
  781. package/build/dist/Server/Services/IncidentTemplateService.js.map +1 -1
  782. package/build/dist/Server/Services/Index.js +14 -0
  783. package/build/dist/Server/Services/Index.js.map +1 -1
  784. package/build/dist/Server/Services/MessageQueueLabelRuleEngineService.js +262 -0
  785. package/build/dist/Server/Services/MessageQueueLabelRuleEngineService.js.map +1 -0
  786. package/build/dist/Server/Services/MessageQueueLabelRuleService.js +13 -0
  787. package/build/dist/Server/Services/MessageQueueLabelRuleService.js.map +1 -0
  788. package/build/dist/Server/Services/MessageQueueOwnerRuleEngineService.js +334 -0
  789. package/build/dist/Server/Services/MessageQueueOwnerRuleEngineService.js.map +1 -0
  790. package/build/dist/Server/Services/MessageQueueOwnerRuleService.js +13 -0
  791. package/build/dist/Server/Services/MessageQueueOwnerRuleService.js.map +1 -0
  792. package/build/dist/Server/Services/MessageQueueOwnerTeamService.js +62 -0
  793. package/build/dist/Server/Services/MessageQueueOwnerTeamService.js.map +1 -0
  794. package/build/dist/Server/Services/MessageQueueOwnerUserService.js +62 -0
  795. package/build/dist/Server/Services/MessageQueueOwnerUserService.js.map +1 -0
  796. package/build/dist/Server/Services/MessageQueueService.js +1140 -0
  797. package/build/dist/Server/Services/MessageQueueService.js.map +1 -0
  798. package/build/dist/Server/Services/MetricRecordingRuleService.js +46 -0
  799. package/build/dist/Server/Services/MetricRecordingRuleService.js.map +1 -1
  800. package/build/dist/Server/Services/OpenTelemetryIngestService.js +25 -4
  801. package/build/dist/Server/Services/OpenTelemetryIngestService.js.map +1 -1
  802. package/build/dist/Server/Services/PodmanHostService.js +104 -0
  803. package/build/dist/Server/Services/PodmanHostService.js.map +1 -1
  804. package/build/dist/Server/Services/ProjectService.js +0 -54
  805. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  806. package/build/dist/Server/Services/ProxmoxClusterService.js +104 -0
  807. package/build/dist/Server/Services/ProxmoxClusterService.js.map +1 -1
  808. package/build/dist/Server/Services/ResourceAiAccessService.js +1028 -0
  809. package/build/dist/Server/Services/ResourceAiAccessService.js.map +1 -0
  810. package/build/dist/Server/Services/ResourceAiAgentJobService.js +173 -0
  811. package/build/dist/Server/Services/ResourceAiAgentJobService.js.map +1 -0
  812. package/build/dist/Server/Services/ResourceAiAgentService.js +1687 -0
  813. package/build/dist/Server/Services/ResourceAiAgentService.js.map +1 -0
  814. package/build/dist/Server/Services/RunnerJobService.js +344 -5
  815. package/build/dist/Server/Services/RunnerJobService.js.map +1 -1
  816. package/build/dist/Server/Services/StatusPagePrivateUserService.js +1 -4
  817. package/build/dist/Server/Services/StatusPagePrivateUserService.js.map +1 -1
  818. package/build/dist/Server/Services/StatusPageService.js +0 -46
  819. package/build/dist/Server/Services/StatusPageService.js.map +1 -1
  820. package/build/dist/Server/Services/TeamComplianceSettingService.js +120 -31
  821. package/build/dist/Server/Services/TeamComplianceSettingService.js.map +1 -1
  822. package/build/dist/Server/Services/TelemetryUsageBillingService.js +26 -0
  823. package/build/dist/Server/Services/TelemetryUsageBillingService.js.map +1 -1
  824. package/build/dist/Server/Services/TraceRecordingRuleService.js +37 -0
  825. package/build/dist/Server/Services/TraceRecordingRuleService.js.map +1 -1
  826. package/build/dist/Server/Services/UserNotificationRuleService.js +8 -1
  827. package/build/dist/Server/Services/UserNotificationRuleService.js.map +1 -1
  828. package/build/dist/Server/Services/VMwareVCenterService.js +104 -0
  829. package/build/dist/Server/Services/VMwareVCenterService.js.map +1 -1
  830. package/build/dist/Server/Services/WorkspaceNotificationSummaryService.js +12 -3
  831. package/build/dist/Server/Services/WorkspaceNotificationSummaryService.js.map +1 -1
  832. package/build/dist/Server/Types/Database/Permissions/CreatePermission.js +6 -3
  833. package/build/dist/Server/Types/Database/Permissions/CreatePermission.js.map +1 -1
  834. package/build/dist/Server/Types/Database/Permissions/EditionPermission.js +109 -37
  835. package/build/dist/Server/Types/Database/Permissions/EditionPermission.js.map +1 -1
  836. package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js +16 -0
  837. package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js.map +1 -1
  838. package/build/dist/Server/Types/Database/Permissions/TablePermission.js +3 -3
  839. package/build/dist/Server/Types/Database/Permissions/UpdatePermission.js +9 -6
  840. package/build/dist/Server/Types/Database/Permissions/UpdatePermission.js.map +1 -1
  841. package/build/dist/Server/Utils/AI/Chat/AgentContextCompactor.js +128 -0
  842. package/build/dist/Server/Utils/AI/Chat/AgentContextCompactor.js.map +1 -0
  843. package/build/dist/Server/Utils/AI/Chat/ChatAgentRunner.js +192 -50
  844. package/build/dist/Server/Utils/AI/Chat/ChatAgentRunner.js.map +1 -1
  845. package/build/dist/Server/Utils/AI/Chat/ChatRunCancellation.js +133 -0
  846. package/build/dist/Server/Utils/AI/Chat/ChatRunCancellation.js.map +1 -0
  847. package/build/dist/Server/Utils/AI/Chat/ObservabilityAssistant.js +53 -13
  848. package/build/dist/Server/Utils/AI/Chat/ObservabilityAssistant.js.map +1 -1
  849. package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js +1 -1
  850. package/build/dist/Server/Utils/AI/Chat/ToolOutputPager.js +206 -0
  851. package/build/dist/Server/Utils/AI/Chat/ToolOutputPager.js.map +1 -0
  852. package/build/dist/Server/Utils/AI/ClusterAccess/KubectlInvestigationToolkit.js +53 -26
  853. package/build/dist/Server/Utils/AI/ClusterAccess/KubectlInvestigationToolkit.js.map +1 -1
  854. package/build/dist/Server/Utils/AI/ClusterAccess/KubectlJobRunner.js +4 -2
  855. package/build/dist/Server/Utils/AI/ClusterAccess/KubectlJobRunner.js.map +1 -1
  856. package/build/dist/Server/Utils/AI/CodeFix/CodeFixReadiness.js +1 -29
  857. package/build/dist/Server/Utils/AI/CodeFix/CodeFixReadiness.js.map +1 -1
  858. package/build/dist/Server/Utils/AI/CodeFix/FixRunBudget.js +24 -24
  859. package/build/dist/Server/Utils/AI/CodeFix/FixRunBudget.js.map +1 -1
  860. package/build/dist/Server/Utils/AI/Remediation/RemediationCommandTools.js +1036 -32
  861. package/build/dist/Server/Utils/AI/Remediation/RemediationCommandTools.js.map +1 -1
  862. package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js +661 -41
  863. package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js.map +1 -1
  864. package/build/dist/Server/Utils/AI/Remediation/RemediationPlanRunner.js +21 -1
  865. package/build/dist/Server/Utils/AI/Remediation/RemediationPlanRunner.js.map +1 -1
  866. package/build/dist/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.js +354 -0
  867. package/build/dist/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.js.map +1 -0
  868. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAccessContext.js +160 -0
  869. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAccessContext.js.map +1 -0
  870. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAccessToolNames.js +33 -0
  871. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAccessToolNames.js.map +1 -0
  872. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAiAccessSettings.js +640 -0
  873. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAiAccessSettings.js.map +1 -0
  874. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAiDeleteCleanup.js +226 -0
  875. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAiDeleteCleanup.js.map +1 -0
  876. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.js +602 -0
  877. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.js.map +1 -0
  878. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js +90 -14
  879. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -1
  880. package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js +73 -10
  881. package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js.map +1 -1
  882. package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js +73 -10
  883. package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js.map +1 -1
  884. package/build/dist/Server/Utils/AI/SRE/InvestigationQueue.js +15 -18
  885. package/build/dist/Server/Utils/AI/SRE/InvestigationQueue.js.map +1 -1
  886. package/build/dist/Server/Utils/AI/SRE/InvestigationThread.js +412 -0
  887. package/build/dist/Server/Utils/AI/SRE/InvestigationThread.js.map +1 -0
  888. package/build/dist/Server/Utils/AI/SRE/InvestigationThreadService.js +495 -0
  889. package/build/dist/Server/Utils/AI/SRE/InvestigationThreadService.js.map +1 -0
  890. package/build/dist/Server/Utils/AI/Toolbox/Serializer.js +10 -3
  891. package/build/dist/Server/Utils/AI/Toolbox/Serializer.js.map +1 -1
  892. package/build/dist/Server/Utils/AutoRemediation/CommandPlanExecutor.js +290 -13
  893. package/build/dist/Server/Utils/AutoRemediation/CommandPlanExecutor.js.map +1 -1
  894. package/build/dist/Server/Utils/AutoRemediation/RemediationVerifier.js +29 -1
  895. package/build/dist/Server/Utils/AutoRemediation/RemediationVerifier.js.map +1 -1
  896. package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js +9 -1
  897. package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js.map +1 -1
  898. package/build/dist/Server/Utils/EditionEnforcement.js +20 -158
  899. package/build/dist/Server/Utils/EditionEnforcement.js.map +1 -1
  900. package/build/dist/Server/Utils/LLM/LLMService.js +193 -54
  901. package/build/dist/Server/Utils/LLM/LLMService.js.map +1 -1
  902. package/build/dist/Server/Utils/RelaxedScimTeamLocksReport.js +160 -0
  903. package/build/dist/Server/Utils/RelaxedScimTeamLocksReport.js.map +1 -0
  904. package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js +25 -0
  905. package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js.map +1 -1
  906. package/build/dist/Server/Utils/SameOriginRequest.js +151 -0
  907. package/build/dist/Server/Utils/SameOriginRequest.js.map +1 -0
  908. package/build/dist/Server/Utils/SessionReplay/SessionReplayBudgetMetrics.js +627 -0
  909. package/build/dist/Server/Utils/SessionReplay/SessionReplayBudgetMetrics.js.map +1 -0
  910. package/build/dist/Server/Utils/SessionReplay/SessionReplayUsage.js +60 -5
  911. package/build/dist/Server/Utils/SessionReplay/SessionReplayUsage.js.map +1 -1
  912. package/build/dist/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.js +2 -0
  913. package/build/dist/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.js.map +1 -1
  914. package/build/dist/Server/Utils/Telemetry/EntityRegistry.js +4 -1
  915. package/build/dist/Server/Utils/Telemetry/EntityRegistry.js.map +1 -1
  916. package/build/dist/Server/Utils/Telemetry/MessageQueueDiscovery.js +1015 -0
  917. package/build/dist/Server/Utils/Telemetry/MessageQueueDiscovery.js.map +1 -0
  918. package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js +4 -1
  919. package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js.map +1 -1
  920. package/build/dist/Server/Utils/VendorAssets.js +3 -3
  921. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Alert.js +19 -15
  922. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Alert.js.map +1 -1
  923. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/AlertEpisode.js +19 -15
  924. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/AlertEpisode.js.map +1 -1
  925. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Auth.js +17 -1
  926. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Auth.js.map +1 -1
  927. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.js +186 -210
  928. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.js.map +1 -1
  929. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.js +22 -16
  930. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.js.map +1 -1
  931. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/ScheduledMaintenance.js +233 -167
  932. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/ScheduledMaintenance.js.map +1 -1
  933. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +273 -111
  934. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
  935. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsActivityDeduplicator.js +129 -0
  936. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsActivityDeduplicator.js.map +1 -0
  937. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCardChoices.js +266 -0
  938. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCardChoices.js.map +1 -0
  939. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateCommands.js +258 -0
  940. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateCommands.js.map +1 -0
  941. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsMessageSize.js +104 -0
  942. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsMessageSize.js.map +1 -0
  943. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsReplies.js +183 -0
  944. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsReplies.js.map +1 -0
  945. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsTimezone.js +123 -0
  946. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsTimezone.js.map +1 -0
  947. package/build/dist/Types/AI/AIAgentRunLimits.js +91 -0
  948. package/build/dist/Types/AI/AIAgentRunLimits.js.map +1 -0
  949. package/build/dist/Types/AI/ResourceAiAccessApi.js +30 -0
  950. package/build/dist/Types/AI/ResourceAiAccessApi.js.map +1 -0
  951. package/build/dist/Types/AI/ResourceAiAccessPermissions.js +98 -0
  952. package/build/dist/Types/AI/ResourceAiAccessPermissions.js.map +1 -0
  953. package/build/dist/Types/AutoRemediation/AiRemediationCommandPlan.js +116 -29
  954. package/build/dist/Types/AutoRemediation/AiRemediationCommandPlan.js.map +1 -1
  955. package/build/dist/Types/Code/CodeType.js +2 -0
  956. package/build/dist/Types/Code/CodeType.js.map +1 -1
  957. package/build/dist/Types/Code/JsonSyntax.js +604 -0
  958. package/build/dist/Types/Code/JsonSyntax.js.map +1 -0
  959. package/build/dist/Types/CustomField/CustomFieldCreateSettings.js +310 -0
  960. package/build/dist/Types/CustomField/CustomFieldCreateSettings.js.map +1 -0
  961. package/build/dist/Types/CustomField/CustomFieldMappingCatalog.js +38 -0
  962. package/build/dist/Types/CustomField/CustomFieldMappingCatalog.js.map +1 -1
  963. package/build/dist/Types/CustomField/CustomFieldValueValidator.js +10 -7
  964. package/build/dist/Types/CustomField/CustomFieldValueValidator.js.map +1 -1
  965. package/build/dist/Types/EnterpriseLicense/EnterpriseLicensePeriods.js +1 -1
  966. package/build/dist/Types/Icon/IconProp.js +2 -0
  967. package/build/dist/Types/Icon/IconProp.js.map +1 -1
  968. package/build/dist/Types/Incident/IncidentFormIpAllowlist.js +119 -0
  969. package/build/dist/Types/Incident/IncidentFormIpAllowlist.js.map +1 -0
  970. package/build/dist/Types/Incident/IncidentFormPublic.js +678 -0
  971. package/build/dist/Types/Incident/IncidentFormPublic.js.map +1 -0
  972. package/build/dist/Types/Kubernetes/KubernetesClusterAiAccess.js +10 -3
  973. package/build/dist/Types/Kubernetes/KubernetesClusterAiAccess.js.map +1 -1
  974. package/build/dist/Types/MessageQueue/MessageQueueIdentity.js +184 -0
  975. package/build/dist/Types/MessageQueue/MessageQueueIdentity.js.map +1 -0
  976. package/build/dist/Types/MessageQueue/MessageQueueManualIdentity.js +190 -0
  977. package/build/dist/Types/MessageQueue/MessageQueueManualIdentity.js.map +1 -0
  978. package/build/dist/Types/MessageQueue/MessageQueueMetricCatalog.js +1057 -0
  979. package/build/dist/Types/MessageQueue/MessageQueueMetricCatalog.js.map +1 -0
  980. package/build/dist/Types/MessageQueue/MessagingSystem.js +394 -0
  981. package/build/dist/Types/MessageQueue/MessagingSystem.js.map +1 -0
  982. package/build/dist/Types/MessageQueue/MessagingTelemetryResolver.js +1768 -0
  983. package/build/dist/Types/MessageQueue/MessagingTelemetryResolver.js.map +1 -0
  984. package/build/dist/Types/Monitor/MessageQueueAlertTemplates.js +1207 -0
  985. package/build/dist/Types/Monitor/MessageQueueAlertTemplates.js.map +1 -0
  986. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js +47 -21
  987. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js.map +1 -1
  988. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js +5 -0
  989. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js.map +1 -1
  990. package/build/dist/Types/Monitor/RumAlertTemplates.js +199 -3
  991. package/build/dist/Types/Monitor/RumAlertTemplates.js.map +1 -1
  992. package/build/dist/Types/Permission.js +274 -0
  993. package/build/dist/Types/Permission.js.map +1 -1
  994. package/build/dist/Types/ResourceAiAgent/AiResourceType.js +242 -0
  995. package/build/dist/Types/ResourceAiAgent/AiResourceType.js.map +1 -0
  996. package/build/dist/Types/ResourceAiAgent/ResourceAiAccess.js +281 -0
  997. package/build/dist/Types/ResourceAiAgent/ResourceAiAccess.js.map +1 -0
  998. package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js +12 -0
  999. package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js.map +1 -1
  1000. package/build/dist/Types/Rules/RuleRun.js +4 -0
  1001. package/build/dist/Types/Rules/RuleRun.js.map +1 -1
  1002. package/build/dist/Types/Rum/SessionReplayBudgetMetricType.js +45 -0
  1003. package/build/dist/Types/Rum/SessionReplayBudgetMetricType.js.map +1 -0
  1004. package/build/dist/Types/Runbook/RunbookStepType.js +27 -0
  1005. package/build/dist/Types/Runbook/RunbookStepType.js.map +1 -1
  1006. package/build/dist/Types/Team/ComplianceNotificationChannel.js +4 -3
  1007. package/build/dist/Types/Team/ComplianceNotificationChannel.js.map +1 -1
  1008. package/build/dist/Types/Team/ComplianceRule.js +48 -14
  1009. package/build/dist/Types/Team/ComplianceRule.js.map +1 -1
  1010. package/build/dist/Types/Team/ComplianceRuleType.js +2 -2
  1011. package/build/dist/Types/Telemetry/EntityType.js +16 -0
  1012. package/build/dist/Types/Telemetry/EntityType.js.map +1 -1
  1013. package/build/dist/Types/Telemetry/TelemetryIngestSurface.js +13 -2
  1014. package/build/dist/Types/Telemetry/TelemetryIngestSurface.js.map +1 -1
  1015. package/build/dist/Types/XML.js +23 -0
  1016. package/build/dist/Types/XML.js.map +1 -1
  1017. package/build/dist/UI/Components/CodeEditor/CodeEditor.js +641 -266
  1018. package/build/dist/UI/Components/CodeEditor/CodeEditor.js.map +1 -1
  1019. package/build/dist/UI/Components/CodeEditor/CodeEditorCommands.js +464 -0
  1020. package/build/dist/UI/Components/CodeEditor/CodeEditorCommands.js.map +1 -0
  1021. package/build/dist/UI/Components/CodeEditor/CodeEditorHighlight.js +69 -0
  1022. package/build/dist/UI/Components/CodeEditor/CodeEditorHighlight.js.map +1 -0
  1023. package/build/dist/UI/Components/CodeEditor/CodeEditorLanguages.js +108 -0
  1024. package/build/dist/UI/Components/CodeEditor/CodeEditorLanguages.js.map +1 -0
  1025. package/build/dist/UI/Components/CodeEditor/YamlEditor.js +14 -186
  1026. package/build/dist/UI/Components/CodeEditor/YamlEditor.js.map +1 -1
  1027. package/build/dist/UI/Components/CopyTextButton/CopyTextButton.js +5 -1
  1028. package/build/dist/UI/Components/CopyTextButton/CopyTextButton.js.map +1 -1
  1029. package/build/dist/UI/Components/CustomFields/CustomFieldModelFormFields.js +5 -14
  1030. package/build/dist/UI/Components/CustomFields/CustomFieldModelFormFields.js.map +1 -1
  1031. package/build/dist/UI/Components/EditionLabel/EditionLabel.js +14 -13
  1032. package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
  1033. package/build/dist/UI/Components/ErrorMessage/ErrorMessage.js +1 -1
  1034. package/build/dist/UI/Components/ErrorMessage/ErrorMessage.js.map +1 -1
  1035. package/build/dist/UI/Components/Forms/Fields/FormField.js +8 -3
  1036. package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
  1037. package/build/dist/UI/Components/Icon/Icon.js +8 -0
  1038. package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
  1039. package/build/dist/UI/Components/Input/Input.js +11 -3
  1040. package/build/dist/UI/Components/Input/Input.js.map +1 -1
  1041. package/build/dist/UI/Components/LogsViewer/LogsViewer.js +2 -1
  1042. package/build/dist/UI/Components/LogsViewer/LogsViewer.js.map +1 -1
  1043. package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js +14 -4
  1044. package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js.map +1 -1
  1045. package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js +0 -0
  1046. package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js.map +1 -1
  1047. package/build/dist/UI/Components/Markdown.tsx/MarkdownEditor.js +710 -65
  1048. package/build/dist/UI/Components/Markdown.tsx/MarkdownEditor.js.map +1 -1
  1049. package/build/dist/UI/Components/Markdown.tsx/MarkdownEditorHistory.js +238 -0
  1050. package/build/dist/UI/Components/Markdown.tsx/MarkdownEditorHistory.js.map +1 -0
  1051. package/build/dist/UI/Components/Markdown.tsx/MarkdownListEditing.js +1028 -0
  1052. package/build/dist/UI/Components/Markdown.tsx/MarkdownListEditing.js.map +1 -0
  1053. package/build/dist/UI/Components/Markdown.tsx/MarkdownPaste.js +1088 -0
  1054. package/build/dist/UI/Components/Markdown.tsx/MarkdownPaste.js.map +1 -0
  1055. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js +70 -10
  1056. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js.map +1 -1
  1057. package/build/dist/UI/Components/Markdown.tsx/MarkdownVisualEditing.js +887 -0
  1058. package/build/dist/UI/Components/Markdown.tsx/MarkdownVisualEditing.js.map +1 -0
  1059. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +57 -6
  1060. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  1061. package/build/dist/UI/Components/ResetObjectID/ResetObjectID.js +7 -5
  1062. package/build/dist/UI/Components/ResetObjectID/ResetObjectID.js.map +1 -1
  1063. package/build/dist/UI/Components/Table/EmptyTableMessage.js +51 -0
  1064. package/build/dist/UI/Components/Table/EmptyTableMessage.js.map +1 -0
  1065. package/build/dist/UI/Components/Table/Table.js +30 -11
  1066. package/build/dist/UI/Components/Table/Table.js.map +1 -1
  1067. package/build/dist/UI/Components/Table/TableRow.js +9 -2
  1068. package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
  1069. package/build/dist/UI/Components/TelemetryViewer/FacetVisibility.js +63 -1
  1070. package/build/dist/UI/Components/TelemetryViewer/FacetVisibility.js.map +1 -1
  1071. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js +4 -2
  1072. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js.map +1 -1
  1073. package/build/dist/UI/Components/TelemetryViewer/components/LockedFilterChip.js +91 -10
  1074. package/build/dist/UI/Components/TelemetryViewer/components/LockedFilterChip.js.map +1 -1
  1075. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js +14 -4
  1076. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js.map +1 -1
  1077. package/build/dist/UI/Components/TextArea/TextArea.js +9 -3
  1078. package/build/dist/UI/Components/TextArea/TextArea.js.map +1 -1
  1079. package/build/dist/UI/Components/Workflow/ModelFieldPicker.js +1 -2
  1080. package/build/dist/UI/Components/Workflow/ModelFieldPicker.js.map +1 -1
  1081. package/build/dist/Utils/AI/InvestigationReport.js +71 -11
  1082. package/build/dist/Utils/AI/InvestigationReport.js.map +1 -1
  1083. package/build/dist/Utils/AiRemediation/Resource/CephCommandPolicy.js +1462 -0
  1084. package/build/dist/Utils/AiRemediation/Resource/CephCommandPolicy.js.map +1 -0
  1085. package/build/dist/Utils/AiRemediation/Resource/DatabaseCommandPolicy.js +122 -0
  1086. package/build/dist/Utils/AiRemediation/Resource/DatabaseCommandPolicy.js.map +1 -0
  1087. package/build/dist/Utils/AiRemediation/Resource/DatabaseDiagnosticCatalog.js +1139 -0
  1088. package/build/dist/Utils/AiRemediation/Resource/DatabaseDiagnosticCatalog.js.map +1 -0
  1089. package/build/dist/Utils/AiRemediation/Resource/DatabaseQueryRedactor.js +1060 -0
  1090. package/build/dist/Utils/AiRemediation/Resource/DatabaseQueryRedactor.js.map +1 -0
  1091. package/build/dist/Utils/AiRemediation/Resource/DockerCliGrammar.js +1301 -0
  1092. package/build/dist/Utils/AiRemediation/Resource/DockerCliGrammar.js.map +1 -0
  1093. package/build/dist/Utils/AiRemediation/Resource/DockerEngineCommandPolicy.js +370 -0
  1094. package/build/dist/Utils/AiRemediation/Resource/DockerEngineCommandPolicy.js.map +1 -0
  1095. package/build/dist/Utils/AiRemediation/Resource/DockerSwarmCommandPolicy.js +498 -0
  1096. package/build/dist/Utils/AiRemediation/Resource/DockerSwarmCommandPolicy.js.map +1 -0
  1097. package/build/dist/Utils/AiRemediation/Resource/GovcCommandPolicy.js +1565 -0
  1098. package/build/dist/Utils/AiRemediation/Resource/GovcCommandPolicy.js.map +1 -0
  1099. package/build/dist/Utils/AiRemediation/Resource/HostCommandPolicy.js +2206 -0
  1100. package/build/dist/Utils/AiRemediation/Resource/HostCommandPolicy.js.map +1 -0
  1101. package/build/dist/Utils/AiRemediation/Resource/ProxmoxCommandPolicy.js +1129 -0
  1102. package/build/dist/Utils/AiRemediation/Resource/ProxmoxCommandPolicy.js.map +1 -0
  1103. package/build/dist/Utils/AiRemediation/Resource/ResourceCommandPolicy.js +565 -0
  1104. package/build/dist/Utils/AiRemediation/Resource/ResourceCommandPolicy.js.map +1 -0
  1105. package/build/dist/Utils/AiRemediation/Resource/ResourceCommandPolicyCore.js +408 -0
  1106. package/build/dist/Utils/AiRemediation/Resource/ResourceCommandPolicyCore.js.map +1 -0
  1107. package/build/dist/Utils/AiRemediation/Resource/ResourceOutputRedactor.js +1910 -0
  1108. package/build/dist/Utils/AiRemediation/Resource/ResourceOutputRedactor.js.map +1 -0
  1109. package/build/dist/Utils/LabelRuleImportExport.js +2 -0
  1110. package/build/dist/Utils/LabelRuleImportExport.js.map +1 -1
  1111. package/build/dist/Utils/Markdown/UntrustedMarkdown.js +988 -0
  1112. package/build/dist/Utils/Markdown/UntrustedMarkdown.js.map +1 -0
  1113. package/build/dist/Utils/Monitor/IncomingEmailMonitorRequestUtil.js +34 -0
  1114. package/build/dist/Utils/Monitor/IncomingEmailMonitorRequestUtil.js.map +1 -0
  1115. package/build/dist/Utils/Monitor/MonitorLogSummaryUtil.js +148 -0
  1116. package/build/dist/Utils/Monitor/MonitorLogSummaryUtil.js.map +1 -0
  1117. package/build/dist/Utils/SessionReplay/SessionReplayBudgetMetricType.js +160 -0
  1118. package/build/dist/Utils/SessionReplay/SessionReplayBudgetMetricType.js.map +1 -0
  1119. package/build/dist/Utils/Telemetry/EntityKey.js +36 -0
  1120. package/build/dist/Utils/Telemetry/EntityKey.js.map +1 -1
  1121. package/package.json +1 -3
  1122. package/Server/Utils/CommunityEditionSsoReport.ts +0 -361
  1123. package/Tests/App/Accounts/LoginSsoEdition.test.tsx +0 -616
  1124. package/Tests/App/AdminDashboard/AdminAuthenticationSsoEdition.test.tsx +0 -217
  1125. package/Tests/App/AdminDashboard/GlobalSSOEnterpriseShells.test.tsx +0 -271
  1126. package/Tests/App/Dashboard/CloudDocumentationMarkdown.test.ts +0 -215
  1127. package/Tests/App/Dashboard/TelemetryResourceRetentionSettings.test.tsx +0 -784
  1128. package/Tests/Server/Middleware/UserAuthorizationEditionEnforcement.test.ts +0 -518
  1129. package/Tests/Server/Services/SsoRequirementReadMasking.test.ts +0 -419
  1130. package/Tests/Server/Services/SsoRequirementWriteGuard.test.ts +0 -769
  1131. package/Tests/UI/Components/CodeEditor.test.tsx +0 -638
  1132. package/Tests/UI/Components/MonacoLoader.test.ts +0 -67
  1133. package/Tests/UI/Components/MonacoRuntime.test.ts +0 -121
  1134. package/Tests/UI/Components/Telemetry/TelemetryRetentionConfigForm.test.tsx +0 -329
  1135. package/Tests/UI/Components/YamlEditor.test.tsx +0 -847
  1136. package/UI/Components/CodeEditor/MonacoLoader.ts +0 -36
  1137. package/UI/Components/Telemetry/TelemetryRetentionConfigForm.tsx +0 -319
  1138. package/UI/Components/Telemetry/TelemetryRetentionConfigSummary.tsx +0 -223
  1139. package/build/dist/Server/Utils/CommunityEditionSsoReport.js +0 -223
  1140. package/build/dist/Server/Utils/CommunityEditionSsoReport.js.map +0 -1
  1141. package/build/dist/UI/Components/CodeEditor/MonacoLoader.js +0 -34
  1142. package/build/dist/UI/Components/CodeEditor/MonacoLoader.js.map +0 -1
  1143. package/build/dist/UI/Components/Telemetry/TelemetryRetentionConfigForm.js +0 -171
  1144. package/build/dist/UI/Components/Telemetry/TelemetryRetentionConfigForm.js.map +0 -1
  1145. package/build/dist/UI/Components/Telemetry/TelemetryRetentionConfigSummary.js +0 -119
  1146. package/build/dist/UI/Components/Telemetry/TelemetryRetentionConfigSummary.js.map +0 -1
@@ -24,10 +24,47 @@ import {
24
24
  MAX_COMMAND_TIMEOUT_MS,
25
25
  MAX_PLAN_COMMANDS,
26
26
  MIN_COMMAND_TIMEOUT_MS,
27
+ RESOURCE_ALLOWLIST_SUMMARY,
28
+ RESOURCE_ALWAYS_ASKS_SUMMARY,
29
+ RESOURCE_NEVER_RUNS_SUMMARY,
30
+ RESOURCE_RISKIER_CHANGES_SUMMARY,
31
+ RESOURCE_SAFE_CHANGES_SUMMARY,
32
+ RESOURCE_UNATTENDED_ROUND_BECOMES_PROPOSAL_SUMMARY,
27
33
  getKubectlAlwaysAsksSummary,
28
34
  getKubectlRiskierChangesSummary,
29
35
  getKubectlSafeChangesSummary,
30
36
  } from "../../../../Types/AutoRemediation/AiRemediationCommandPlan";
37
+ import AiResourceType, {
38
+ AI_RESOURCE_TYPE_INFO,
39
+ ALL_AI_RESOURCE_TYPES,
40
+ AiResourceTypeInfo,
41
+ isAiResourceType,
42
+ } from "../../../../Types/ResourceAiAgent/AiResourceType";
43
+ import {
44
+ MAX_RESOURCE_COMMAND_TIMEOUT_MS,
45
+ RESOURCE_AI_ALLOW_WRITES_ENV,
46
+ RESOURCE_AI_WRITE_TARGETS_ENV,
47
+ ResourceAiAccessGap,
48
+ ResourceAiAccessStatus,
49
+ ResourceAiAgentPosture,
50
+ ResourceAiRemediationMode,
51
+ ResourceCommandTier,
52
+ isUnattendedResourceRemediationMode,
53
+ } from "../../../../Types/ResourceAiAgent/ResourceAiAccess";
54
+ import ResourceCommandPolicy from "../../../../Utils/AiRemediation/Resource/ResourceCommandPolicy";
55
+ import {
56
+ ResourceAutoExecutionVerdict,
57
+ ResourceCommandPolicyResult,
58
+ } from "../../../../Utils/AiRemediation/Resource/ResourceCommandPolicyCore";
59
+ import ResourceAiAccessService, {
60
+ describeResourceNoun,
61
+ } from "../../../Services/ResourceAiAccessService";
62
+ import ResourceCommandJobRunner, {
63
+ RESOURCE_COMMAND_CLAIM_TIMEOUT_MS,
64
+ ResourceCommandJobOutcome,
65
+ ResourceCommandRunState,
66
+ } from "../ResourceAccess/ResourceCommandJobRunner";
67
+ import { RUN_INFRASTRUCTURE_COMMAND_TOOL_NAME } from "../ResourceAccess/ResourceAccessToolNames";
31
68
  import {
32
69
  KUBECTL_ALLOW_NODE_OPERATIONS_ENV,
33
70
  KUBECTL_WRITE_NAMESPACES_ENV,
@@ -36,6 +73,7 @@ import {
36
73
  KubernetesAiRemediationMode,
37
74
  KubernetesClusterAiAccessStatus,
38
75
  KubernetesRunnerPosture,
76
+ MAX_KUBECTL_OUTPUT_CHARS_FOR_LLM,
39
77
  isKubernetesAgentRunnerName,
40
78
  isKubernetesAgentRunnerPosture,
41
79
  getKubernetesAiAccessTargetKind,
@@ -61,6 +99,11 @@ import AutoRemediationRuleEngineService, {
61
99
  ClusterBreakerState,
62
100
  ClusterRoundHold,
63
101
  MAX_AUTO_EXECUTIONS_PER_RULE_PER_HOUR,
102
+ RESOURCE_BREAKER_LOCK_NAMESPACE,
103
+ ResourceBreakerState,
104
+ ResourceRoundHold,
105
+ doesResourceModeRunRoundUnattended,
106
+ getResourceBreakerLockKey,
64
107
  } from "../../../Services/AutoRemediationRuleEngineService";
65
108
  import AutoRemediationSuggestionService from "../../../Services/AutoRemediationSuggestionService";
66
109
  import KubernetesClusterAiAccessService from "../../../Services/KubernetesClusterAiAccessService";
@@ -69,6 +112,7 @@ import RunbookCredentialService from "../../../Services/RunbookCredentialService
69
112
  import RunnerJobService, {
70
113
  isTerminalAgentJobStatus,
71
114
  MAX_AI_COMMAND_JOBS_PER_PROJECT_PER_HOUR,
115
+ MAX_AI_RESOURCE_COMMAND_JOBS_PER_PROJECT_PER_HOUR,
72
116
  } from "../../../Services/RunnerJobService";
73
117
  import RunnerService from "../../../Services/RunnerService";
74
118
  import QueryHelper from "../../../Types/Database/QueryHelper";
@@ -192,7 +236,12 @@ export const AI_COMMAND_CLAIM_TIMEOUT_MS: number = 60_000;
192
236
  */
193
237
  const HEARTBEAT_TOUCH_INTERVAL_MS: number = 15_000;
194
238
 
195
- const MAX_OUTPUT_CHARS_FOR_LLM: number = 6000;
239
+ /*
240
+ * What the model sees of a Bash/SSH command's output — the same cap as a
241
+ * kubectl command's, generous enough that a diagnostic's answer is never
242
+ * cut off in the part that matters.
243
+ */
244
+ const MAX_OUTPUT_CHARS_FOR_LLM: number = MAX_KUBECTL_OUTPUT_CHARS_FOR_LLM;
196
245
 
197
246
  // A reason that already ends a sentence.
198
247
  const SENTENCE_END_PATTERN: RegExp = /[.!?]$/;
@@ -213,6 +262,39 @@ const CLUSTER_BREAKER_LOCK_NAMESPACE: string = "AutoRemediationClusterBreaker";
213
262
  const CLUSTER_BREAKER_LOCK_TIMEOUT_MS: number = 60_000;
214
263
  const CLUSTER_BREAKER_LOCK_ACQUIRE_TIMEOUT_MS: number = 20_000;
215
264
 
265
+ /*
266
+ * What the model is told when a resource command ran but did not finish
267
+ * (no exit code): the change may have landed before the agent stopped it.
268
+ */
269
+ const RESOURCE_UNFINISHED_CHECK_FIRST: string = `The command did not finish (the resource's AI agent stopped it before it reported an exit code), so it MAY have changed the resource. Before you reissue this command, or run anything that depends on it, check with a read (${RUN_INFRASTRUCTURE_COMMAND_TOOL_NAME}) whether it took effect. Do NOT resend it blindly.`;
270
+
271
+ /*
272
+ * The key a resource target, and the commands aimed at it, are matched by:
273
+ * the type and the (case-insensitive) id.
274
+ */
275
+ function getResourceKey(
276
+ resourceType: string | undefined,
277
+ resourceId: string | undefined,
278
+ ): string {
279
+ if (!resourceType || !resourceId) {
280
+ return "";
281
+ }
282
+
283
+ return `${resourceType}:${resourceId.toLowerCase()}`;
284
+ }
285
+
286
+ // 'Docker host "web-1"' — how the toolkit names a resource in copy.
287
+ function describeResourceLabel(data: {
288
+ resourceType?: string | undefined;
289
+ resourceName?: string | undefined;
290
+ }): string {
291
+ return `${
292
+ isAiResourceType(data.resourceType)
293
+ ? describeResourceNoun(data.resourceType)
294
+ : "resource"
295
+ } "${data.resourceName || "(unknown)"}"`;
296
+ }
297
+
216
298
  export type RemediationCommandMode = "Suggest" | "FullAuto";
217
299
 
218
300
  /*
@@ -315,6 +397,37 @@ export interface RemediationCommandToolkitOptions {
315
397
  | undefined;
316
398
  }
317
399
  | undefined;
400
+ /*
401
+ * A resource round's one target: an infrastructure resource (a Docker or
402
+ * Podman host, a Docker Swarm, Proxmox, VMware or Ceph cluster, a
403
+ * database server, a host) whose AI page allows remediation, reached
404
+ * through its resource AI agent. Present (non-empty) only on a resource
405
+ * round, which then offers ResourceCommand steps — and only those.
406
+ */
407
+ resourceTargets?: Array<ResourceAiAccessStatus> | undefined;
408
+ /*
409
+ * clusterHold for a resource: how the run's FIRST change on the resource
410
+ * checks, under the per-resource breaker lock, that no other AI run holds
411
+ * it (AutoRemediationRuleEngineService.findRoundHoldingResource).
412
+ */
413
+ resourceHold?:
414
+ | {
415
+ anyOrder: boolean;
416
+ subject?:
417
+ | {
418
+ incidentId?: ObjectID | undefined;
419
+ alertId?: ObjectID | undefined;
420
+ }
421
+ | undefined;
422
+ }
423
+ | undefined;
424
+ /*
425
+ * A resource round's number for its signal (1 when absent). The live
426
+ * mode is re-checked against it before every change: Automatic runs only
427
+ * round 1 unattended, so a follow-up that started under Bypass approval
428
+ * stops running changes once the resource is on Automatic.
429
+ */
430
+ resourceRoundNumber?: number | undefined;
318
431
  }
319
432
 
320
433
  interface CommandArgsParseResult {
@@ -334,6 +447,11 @@ export default class RemediationCommandToolkit {
334
447
  * treats them as if they had never been targets.
335
448
  */
336
449
  private revokedClusterIds: Set<string> = new Set<string>();
450
+ /*
451
+ * The same for resource targets (by getResourceKey): their AI page
452
+ * stopped allowing this run to change them mid-run.
453
+ */
454
+ private revokedResourceKeys: Set<string> = new Set<string>();
337
455
  /*
338
456
  * Commands this run sent to a Runner that never reached kubectl. They are
339
457
  * not executed commands, but their jobs exist: their sequence numbers
@@ -364,8 +482,40 @@ export default class RemediationCommandToolkit {
364
482
  public getCommandsNeedingApproval(): Array<RemediationCommandNeedingApproval> {
365
483
  return this.commandsNeedingApproval.filter(
366
484
  (kept: RemediationCommandNeedingApproval) => {
367
- return !this.revokedClusterIds.has(
368
- kept.command.kubernetesClusterId || "",
485
+ return (
486
+ !this.revokedClusterIds.has(kept.command.kubernetesClusterId || "") &&
487
+ !this.revokedResourceKeys.has(
488
+ getResourceKey(kept.command.resourceType, kept.command.resourceId),
489
+ )
490
+ );
491
+ },
492
+ );
493
+ }
494
+
495
+ /*
496
+ * Is this a resource round? Fixed at construction (from the targets it was
497
+ * given, not the ones still allowed), so the tools the model was handed
498
+ * never change shape mid-run.
499
+ */
500
+ public isResourceRound(): boolean {
501
+ return (this.options.resourceTargets || []).length > 0;
502
+ }
503
+
504
+ /*
505
+ * The resources this run may still change: remediation-ready, with an AI
506
+ * agent, and not revoked by a live re-check.
507
+ */
508
+ public getResourceTargets(): Array<ResourceAiAccessStatus> {
509
+ return (this.options.resourceTargets || []).filter(
510
+ (resource: ResourceAiAccessStatus): boolean => {
511
+ return (
512
+ resource.isRemediationReady &&
513
+ isAiResourceType(resource.resourceType) &&
514
+ resource.agent !== null &&
515
+ Boolean(resource.agent?.agentId) &&
516
+ !this.revokedResourceKeys.has(
517
+ getResourceKey(resource.resourceType, resource.resourceId),
518
+ )
369
519
  );
370
520
  },
371
521
  );
@@ -407,8 +557,9 @@ export default class RemediationCommandToolkit {
407
557
  return {
408
558
  definition: {
409
559
  name: "list_command_targets",
410
- description:
411
- "List where this remediation may run commands: Runners (Bash runs on the Runner's host; SSH runs on an assigned credential's host) and Kubernetes clusters (Kubectl runs through the cluster's Kubernetes AI agent or Runner). Call this before composing any command.",
560
+ description: this.isResourceRound()
561
+ ? "List where this remediation may run commands: the infrastructure resource this round is about (stepType ResourceCommand runs ONE command on it through its own AI agent), with its resourceId, programs, remediation mode, write scope and command allowlist. Call this before composing any command."
562
+ : "List where this remediation may run commands: Runners (Bash runs on the Runner's host; SSH runs on an assigned credential's host) and Kubernetes clusters (Kubectl runs through the cluster's Kubernetes AI agent or Runner). Call this before composing any command.",
412
563
  inputSchema: {
413
564
  type: "object",
414
565
  properties: {},
@@ -525,6 +676,49 @@ export default class RemediationCommandToolkit {
525
676
  });
526
677
  }
527
678
 
679
+ for (const resource of this.getResourceTargets()) {
680
+ const info: AiResourceTypeInfo =
681
+ AI_RESOURCE_TYPE_INFO[resource.resourceType];
682
+
683
+ rows.push({
684
+ targetType: "Resource",
685
+ resourceType: resource.resourceType,
686
+ resourceId: resource.resourceId,
687
+ name: resource.resourceName,
688
+ stepTypes: "ResourceCommand",
689
+ via: `its ${info.agentDisplayName}`,
690
+ programs: info.programs.join(", "),
691
+ // One idea per field, as for clusters (the serializer caps each).
692
+ remediationMode: this.describeResourceModeForLlm(resource),
693
+ safeChanges: RESOURCE_SAFE_CHANGES_SUMMARY,
694
+ riskierChanges: RESOURCE_RISKIER_CHANGES_SUMMARY,
695
+ alwaysNeedsAHuman: RESOURCE_ALWAYS_ASKS_SUMMARY,
696
+ neverRuns: RESOURCE_NEVER_RUNS_SUMMARY,
697
+ writeScope:
698
+ RemediationCommandToolkit.describeResourceWriteScope(resource),
699
+ commandAllowlist:
700
+ resource.aiCommandAllowlist.length > 0
701
+ ? resource.aiCommandAllowlist.join(" | ")
702
+ : "(none)",
703
+ allowlistMatching: RESOURCE_ALLOWLIST_SUMMARY,
704
+ });
705
+ }
706
+
707
+ if (rows.length === 0 && this.isResourceRound()) {
708
+ return {
709
+ success: true,
710
+ textForLlm:
711
+ "The infrastructure resource this round is about no longer allows AI remediation (its AI agent page changed during this run, or its AI agent went away). You cannot run or propose commands — say so in your analysis.",
712
+ result: {
713
+ dataForLlm: "(no command targets available)",
714
+ rowCount: 0,
715
+ citationLabel: "Available command targets",
716
+ redactionCount: 0,
717
+ isTruncated: false,
718
+ },
719
+ };
720
+ }
721
+
528
722
  if (rows.length === 0) {
529
723
  return {
530
724
  success: true,
@@ -586,6 +780,126 @@ export default class RemediationCommandToolkit {
586
780
  return "RequireApproval: every kubectl change is proposed for one-click approval";
587
781
  }
588
782
 
783
+ /*
784
+ * describeClusterModeForLlm for a resource: the canonical
785
+ * ResourceAiRemediationMode semantics in one field of at most the
786
+ * serializer's 500 characters.
787
+ */
788
+ private describeResourceModeForLlm(resource: ResourceAiAccessStatus): string {
789
+ if (
790
+ resource.aiRemediationMode === ResourceAiRemediationMode.BypassApproval
791
+ ) {
792
+ return `BypassApproval: AI does not ask — every change the policy allows, safeChanges AND riskierChanges, runs without a human, except alwaysNeedsAHuman${
793
+ this.options.proposesRefusedCommands
794
+ ? " (submit such a change anyway: it is refused, recorded, and proposed for one-click approval when this round ends if no other change ran)"
795
+ : ""
796
+ }; and ${RESOURCE_UNATTENDED_ROUND_BECOMES_PROPOSAL_SUMMARY}`;
797
+ }
798
+
799
+ if (resource.aiRemediationMode === ResourceAiRemediationMode.Automatic) {
800
+ return `Automatic: safeChanges run without a human; riskierChanges never run inline unless the commandAllowlist names their exact shape, and alwaysNeedsAHuman never does — ${
801
+ this.options.proposesRefusedCommands
802
+ ? "submit it anyway: it is refused, recorded, and proposed for one-click approval when this round ends if no other change ran; put it in your written recommendations too"
803
+ : "put it in your written recommendations for a human"
804
+ }; and ${RESOURCE_UNATTENDED_ROUND_BECOMES_PROPOSAL_SUMMARY}`;
805
+ }
806
+
807
+ return "RequireApproval: every change is proposed for one-click approval";
808
+ }
809
+
810
+ /*
811
+ * Where the resource's AI agent lets AI-composed writes land, as it last
812
+ * reported (its posture): read-only unless ONEUPTIME_AI_ALLOW_WRITES is
813
+ * true, never its protected targets, and — with ONEUPTIME_AI_WRITE_TARGETS
814
+ * set — only the targets its globs name.
815
+ */
816
+ public static describeResourceWriteScope(
817
+ resource: ResourceAiAccessStatus,
818
+ ): string {
819
+ const posture: ResourceAiAgentPosture | null | undefined =
820
+ resource.agent?.posture;
821
+
822
+ if (!posture) {
823
+ return "not reported by the agent yet, so it runs no change";
824
+ }
825
+
826
+ if (posture.allowWrites !== true) {
827
+ return `read-only (${RESOURCE_AI_ALLOW_WRITES_ENV} is not true on the agent): it refuses every change`;
828
+ }
829
+
830
+ const parts: Array<string> = [
831
+ posture.writeTargets.length > 0
832
+ ? `changes only targets matching ${RESOURCE_AI_WRITE_TARGETS_ENV}=${posture.writeTargets.join(",")} — name each target exactly`
833
+ : "changes any target its command policy allows",
834
+ ];
835
+
836
+ if (posture.protectedTargets.length > 0) {
837
+ parts.push(
838
+ `never its protected targets (${posture.protectedTargets
839
+ .slice(0, 10)
840
+ .join(", ")}): itself and what it runs in`,
841
+ );
842
+ }
843
+
844
+ return parts.join("; ");
845
+ }
846
+
847
+ /*
848
+ * Why the resource's AI agent would refuse this write, going by the
849
+ * posture it reported — or null when it would not. The rule is the
850
+ * agent's own (ResourceCommandPolicy.getWriteScopeRefusal: read-only
851
+ * unless ONEUPTIME_AI_ALLOW_WRITES is true, never a protected target,
852
+ * only the ONEUPTIME_AI_WRITE_TARGETS globs when set), the one the enqueue
853
+ * chokepoint asks too. Reads and Denied commands are not this rule's
854
+ * business (the policy refuses the latter on its own).
855
+ */
856
+ public static getResourceWriteScopeRefusal(data: {
857
+ resource: ResourceAiAccessStatus;
858
+ command: string;
859
+ }): string | null {
860
+ if (!isAiResourceType(data.resource.resourceType)) {
861
+ return "The resource type is unknown, so no change can run on it.";
862
+ }
863
+
864
+ const policy: ResourceCommandPolicyResult =
865
+ ResourceCommandPolicy.evaluateCommand({
866
+ resourceType: data.resource.resourceType,
867
+ command: data.command,
868
+ });
869
+
870
+ if (
871
+ policy.tier === ResourceCommandTier.Read ||
872
+ policy.tier === ResourceCommandTier.Denied
873
+ ) {
874
+ return null;
875
+ }
876
+
877
+ const posture: ResourceAiAgentPosture | null | undefined =
878
+ data.resource.agent?.posture;
879
+
880
+ return ResourceCommandPolicy.getWriteScopeRefusal({
881
+ result: policy,
882
+ allowWrites: posture?.allowWrites === true,
883
+ writeTargets: posture?.writeTargets || [],
884
+ protectedTargets: posture?.protectedTargets || [],
885
+ resourceType: data.resource.resourceType,
886
+ });
887
+ }
888
+
889
+ /*
890
+ * What to do about a resource write-scope refusal, for the approve route
891
+ * and the model: the agent's own environment decides.
892
+ */
893
+ public static getResourceScopeRefusalNextStep(
894
+ resourceType: AiResourceType,
895
+ ): string {
896
+ const agentName: string = isAiResourceType(resourceType)
897
+ ? AI_RESOURCE_TYPE_INFO[resourceType].agentDisplayName
898
+ : "resource's AI agent";
899
+
900
+ return `Dismiss the suggestion and let a new plan be composed, or change the ${agentName}'s write access (${RESOURCE_AI_ALLOW_WRITES_ENV} and ${RESOURCE_AI_WRITE_TARGETS_ENV} in its environment), restart it, and approve again.`;
901
+ }
902
+
589
903
  /*
590
904
  * Which kubectl changes the model may be offered on this cluster. A
591
905
  * Runner that reported node operations off refuses every one, approved
@@ -932,6 +1246,29 @@ export default class RemediationCommandToolkit {
932
1246
  */
933
1247
 
934
1248
  private buildExecuteTool(): ObservabilityAssistantExtraTool {
1249
+ if (this.isResourceRound()) {
1250
+ return {
1251
+ definition: {
1252
+ name: "execute_remediation_command",
1253
+ description: this.describeResourceExecuteTool(),
1254
+ inputSchema: {
1255
+ type: "object",
1256
+ properties: this.buildCommandSchemaProperties(),
1257
+ required: [
1258
+ "stepType",
1259
+ "resourceId",
1260
+ "command",
1261
+ "rationale",
1262
+ "expectedEffect",
1263
+ ],
1264
+ },
1265
+ },
1266
+ execute: async (args: JSONObject): Promise<ToolCallOutcome> => {
1267
+ return this.executeCommand(args);
1268
+ },
1269
+ };
1270
+ }
1271
+
935
1272
  return {
936
1273
  definition: {
937
1274
  name: "execute_remediation_command",
@@ -952,7 +1289,109 @@ export default class RemediationCommandToolkit {
952
1289
  };
953
1290
  }
954
1291
 
1292
+ /*
1293
+ * What each resource this round may change accepts, by tier — its tool
1294
+ * policy's own guide, once per policy.
1295
+ */
1296
+ private describeResourceWriteGuides(): string {
1297
+ const sections: Array<string> = [];
1298
+ const seenPolicies: Set<string> = new Set<string>();
1299
+
1300
+ for (const type of ALL_AI_RESOURCE_TYPES) {
1301
+ const resources: Array<ResourceAiAccessStatus> = (
1302
+ this.options.resourceTargets || []
1303
+ ).filter((resource: ResourceAiAccessStatus): boolean => {
1304
+ return resource.resourceType === type;
1305
+ });
1306
+
1307
+ if (resources.length === 0) {
1308
+ continue;
1309
+ }
1310
+
1311
+ const policyName: string = ResourceCommandPolicy.getToolPolicy(type).name;
1312
+
1313
+ if (seenPolicies.has(policyName)) {
1314
+ continue;
1315
+ }
1316
+
1317
+ seenPolicies.add(policyName);
1318
+
1319
+ sections.push(
1320
+ `${resources
1321
+ .map((resource: ResourceAiAccessStatus): string => {
1322
+ return `${AI_RESOURCE_TYPE_INFO[type].displayName} "${resource.resourceName}" (resourceId: ${resource.resourceId})`;
1323
+ })
1324
+ .join(
1325
+ ", ",
1326
+ )} — changes it accepts:\n${ResourceCommandPolicy.getWriteCommandGuide(
1327
+ type,
1328
+ )}`,
1329
+ );
1330
+ }
1331
+
1332
+ return sections.join("\n\n");
1333
+ }
1334
+
1335
+ // execute_remediation_command's description on a resource round.
1336
+ private describeResourceExecuteTool(): string {
1337
+ return `Execute ONE remediation change immediately on the infrastructure resource this round is about, through its own AI agent: stepType ResourceCommand with the resource's resourceId. One command per call, written as the program followed by its arguments — never a shell line. This tool is for CHANGES only — a read-only command goes through ${RUN_INFRASTRUCTURE_COMMAND_TOOL_NAME} and is refused here. Safe changes run (${RESOURCE_SAFE_CHANGES_SUMMARY}). Riskier changes (${RESOURCE_RISKIER_CHANGES_SUMMARY}) are refused unless the resource's command allowlist names their exact shape (${RESOURCE_ALLOWLIST_SUMMARY}) or the resource bypasses approvals — ${
1338
+ this.options.proposesRefusedCommands
1339
+ ? "a refused riskier change is recorded and proposed for one-click approval when this round ends, provided no other change ran"
1340
+ : "put those in your recommendations"
1341
+ }. Whatever the mode, ${RESOURCE_ALWAYS_ASKS_SUMMARY}; ${RESOURCE_UNATTENDED_ROUND_BECOMES_PROPOSAL_SUMMARY}; ${RESOURCE_NEVER_RUNS_SUMMARY}. A change the resource's AI agent would refuse (it runs read-only, or the target is protected or outside its writeScope in list_command_targets) is refused before it runs. At most ${MAX_AUTO_EXECUTED_COMMANDS_PER_RUN} commands may be sent per remediation. Provide a rollbackCommand whenever the command changes state and an undo exists.\n\n${this.describeResourceWriteGuides()}`;
1342
+ }
1343
+
1344
+ /*
1345
+ * The command schema of a resource round: ResourceCommand only, on the
1346
+ * round's resource — never a Runner, a cluster or a credential.
1347
+ */
1348
+ private buildResourceCommandSchemaProperties(): JSONObject {
1349
+ return {
1350
+ resourceId: {
1351
+ type: "string",
1352
+ description:
1353
+ "The resource to change: its resourceId from list_command_targets.",
1354
+ },
1355
+ stepType: {
1356
+ type: "string",
1357
+ enum: ["ResourceCommand"],
1358
+ description:
1359
+ "ResourceCommand runs ONE command on the resource through its own AI agent.",
1360
+ },
1361
+ command: {
1362
+ type: "string",
1363
+ description:
1364
+ 'The exact command, one line starting with one of the resource\'s programs (list_command_targets), e.g. "docker restart web", "docker service update --force api", "systemctl restart nginx", "pvesh create /nodes/pve1/qemu/100/status/start", "govc vm.power -on /DC/vm/web-01", "ceph osd in 3" or "db cancel-query 4242". No pipes, redirects, chaining, substitution or sudo.',
1365
+ },
1366
+ timeoutInMs: {
1367
+ type: "number",
1368
+ description: `Execution timeout in milliseconds (default ${Math.min(
1369
+ DEFAULT_COMMAND_TIMEOUT_MS,
1370
+ MAX_RESOURCE_COMMAND_TIMEOUT_MS,
1371
+ )}, max ${MAX_RESOURCE_COMMAND_TIMEOUT_MS}).`,
1372
+ },
1373
+ rationale: {
1374
+ type: "string",
1375
+ description:
1376
+ "Why this command remediates the incident — shown to humans verbatim.",
1377
+ },
1378
+ expectedEffect: {
1379
+ type: "string",
1380
+ description: "What you expect to observe if it works.",
1381
+ },
1382
+ rollbackCommand: {
1383
+ type: "string",
1384
+ description:
1385
+ "Optional undo command for the same resource, run unattended if verification later fails. Must pass the same policy, and — unless the resource bypasses approvals — be a safe change on ONE named object, e.g. docker start <container> after docker stop <container>, or systemctl start <unit> after systemctl stop <unit>.",
1386
+ },
1387
+ };
1388
+ }
1389
+
955
1390
  private buildCommandSchemaProperties(): JSONObject {
1391
+ if (this.isResourceRound()) {
1392
+ return this.buildResourceCommandSchemaProperties();
1393
+ }
1394
+
956
1395
  return {
957
1396
  runnerId: {
958
1397
  type: "string",
@@ -1074,6 +1513,44 @@ export default class RemediationCommandToolkit {
1074
1513
  }
1075
1514
  }
1076
1515
 
1516
+ if (command.stepType === RunbookStepType.ResourceCommand) {
1517
+ /*
1518
+ * Reads belong to run_infrastructure_command, for the reason they
1519
+ * belong to run_kubectl on a cluster: sent here, a read would count
1520
+ * as an executed fix, take a breaker slot and could auto-resolve the
1521
+ * signal in the name of a change that changed nothing.
1522
+ */
1523
+ if (command.resourceCommandTier === ResourceCommandTier.Read) {
1524
+ return this.failure(
1525
+ `"${command.command}" is read-only. Run it with ${RUN_INFRASTRUCTURE_COMMAND_TOOL_NAME}, which does not count as a remediation command — this tool is for changes only. Nothing was executed.`,
1526
+ );
1527
+ }
1528
+
1529
+ // The resource as its AI page stands NOW, as for a cluster.
1530
+ const liveRefusal: FullAutoRefusal | null =
1531
+ await this.refreshResourceTarget(command);
1532
+
1533
+ if (liveRefusal) {
1534
+ this.recordNeedingApproval(command, liveRefusal);
1535
+ return this.failure(liveRefusal.text);
1536
+ }
1537
+
1538
+ /*
1539
+ * The agent's write scope as it reports it NOW: a write it would
1540
+ * refuse is never enqueued — nor kept for a proposal, which no click
1541
+ * could make runnable.
1542
+ */
1543
+ const liveResource: ResourceAiAccessStatus | undefined =
1544
+ this.findResourceTarget(command.resourceType, command.resourceId);
1545
+ const scopeRefusal: string | null = liveResource
1546
+ ? this.getResourceCommandScopeRefusal(liveResource, command)
1547
+ : null;
1548
+
1549
+ if (scopeRefusal) {
1550
+ return this.failure(scopeRefusal);
1551
+ }
1552
+ }
1553
+
1077
1554
  /*
1078
1555
  * FullAuto gate: the full policy. Anything that is not AutoApproved is
1079
1556
  * refused here; the model is told why so it can pick an allowlisted
@@ -1088,22 +1565,59 @@ export default class RemediationCommandToolkit {
1088
1565
 
1089
1566
  command.policyVerdict = AiRemediationCommandPolicyVerdict.AutoApproved;
1090
1567
 
1091
- // Project-wide hourly storm brake across all AI command jobs.
1092
- const jobsInLastHour: number = (
1093
- await RunnerJobService.countBy({
1094
- query: {
1095
- projectId: this.options.projectId,
1096
- origin: RunnerJobOrigin.AiRemediation,
1097
- createdAt: QueryHelper.greaterThan(OneUptimeDate.getSomeHoursAgo(1)),
1098
- },
1099
- props: { isRoot: true },
1100
- })
1101
- ).toNumber();
1568
+ if (command.stepType === RunbookStepType.ResourceCommand) {
1569
+ /*
1570
+ * The resource lane's own hourly brake, counted the way the enqueue
1571
+ * chokepoint counts it (ResourceCommand rows only): pre-checked here
1572
+ * so the model gets a useful refusal instead of a thrown one.
1573
+ */
1574
+ const resourceJobsInLastHour: number = (
1575
+ await RunnerJobService.countBy({
1576
+ query: {
1577
+ projectId: this.options.projectId,
1578
+ origin: RunnerJobOrigin.AiRemediation,
1579
+ stepType: RunbookStepType.ResourceCommand,
1580
+ createdAt: QueryHelper.greaterThan(
1581
+ OneUptimeDate.getSomeHoursAgo(1),
1582
+ ),
1583
+ },
1584
+ props: { isRoot: true },
1585
+ })
1586
+ ).toNumber();
1102
1587
 
1103
- if (jobsInLastHour >= MAX_AI_COMMAND_JOBS_PER_PROJECT_PER_HOUR) {
1104
- return this.failure(
1105
- `This project has hit its hourly AI-command limit (${MAX_AI_COMMAND_JOBS_PER_PROJECT_PER_HOUR}). No further commands can run this hour. Summarize and hand off to a human.`,
1106
- );
1588
+ if (
1589
+ resourceJobsInLastHour >=
1590
+ MAX_AI_RESOURCE_COMMAND_JOBS_PER_PROJECT_PER_HOUR
1591
+ ) {
1592
+ return this.failure(
1593
+ `This project has hit its hourly limit on AI commands on its infrastructure (${MAX_AI_RESOURCE_COMMAND_JOBS_PER_PROJECT_PER_HOUR}). No further commands can run this hour. Summarize and hand off to a human.`,
1594
+ );
1595
+ }
1596
+ } else {
1597
+ /*
1598
+ * Project-wide hourly storm brake across the kubectl and Runner AI
1599
+ * command jobs, counted the way the enqueue chokepoints count it:
1600
+ * resource commands have their own brake above and never count here.
1601
+ */
1602
+ const jobsInLastHour: number = (
1603
+ await RunnerJobService.countBy({
1604
+ query: {
1605
+ projectId: this.options.projectId,
1606
+ origin: RunnerJobOrigin.AiRemediation,
1607
+ stepType: QueryHelper.notEquals(RunbookStepType.ResourceCommand),
1608
+ createdAt: QueryHelper.greaterThan(
1609
+ OneUptimeDate.getSomeHoursAgo(1),
1610
+ ),
1611
+ },
1612
+ props: { isRoot: true },
1613
+ })
1614
+ ).toNumber();
1615
+
1616
+ if (jobsInLastHour >= MAX_AI_COMMAND_JOBS_PER_PROJECT_PER_HOUR) {
1617
+ return this.failure(
1618
+ `This project has hit its hourly AI-command limit (${MAX_AI_COMMAND_JOBS_PER_PROJECT_PER_HOUR}). No further commands can run this hour. Summarize and hand off to a human.`,
1619
+ );
1620
+ }
1107
1621
  }
1108
1622
 
1109
1623
  /*
@@ -1129,6 +1643,22 @@ export default class RemediationCommandToolkit {
1129
1643
  clusterSlotLock = reservation.mutex;
1130
1644
  }
1131
1645
 
1646
+ // The same for the run's first change on a resource.
1647
+ if (
1648
+ command.stepType === RunbookStepType.ResourceCommand &&
1649
+ !this.hasChangedResource(command.resourceType, command.resourceId)
1650
+ ) {
1651
+ const reservation: ClusterSlotReservation =
1652
+ await this.reserveResourceSlot(command);
1653
+
1654
+ if (reservation.refusal) {
1655
+ this.recordNeedingApproval(command, reservation.refusal);
1656
+ return this.failure(reservation.refusal.text);
1657
+ }
1658
+
1659
+ clusterSlotLock = reservation.mutex;
1660
+ }
1661
+
1132
1662
  const releaseClusterSlotLock: () => Promise<void> =
1133
1663
  async (): Promise<void> => {
1134
1664
  if (!clusterSlotLock) {
@@ -1194,6 +1724,8 @@ export default class RemediationCommandToolkit {
1194
1724
  * whose wait broke): it may have run. Its citation says so.
1195
1725
  */
1196
1726
  let kubectlResultUnknown: boolean = false;
1727
+ // The same for a resource command the agent took with no result back.
1728
+ let resourceResultUnknown: boolean = false;
1197
1729
 
1198
1730
  try {
1199
1731
  if (command.stepType === RunbookStepType.Kubectl) {
@@ -1306,9 +1838,104 @@ export default class RemediationCommandToolkit {
1306
1838
  } else {
1307
1839
  outcomeText = KubectlJobRunner.describeForLlm(outcome);
1308
1840
  }
1309
- } else {
1310
- const job: RunnerJob = await RunnerJobService.enqueueAiCommand({
1311
- projectId: this.options.projectId,
1841
+ } else if (command.stepType === RunbookStepType.ResourceCommand) {
1842
+ /*
1843
+ * The kubectl lane's shape for a resource: enqueue through the
1844
+ * resource chokepoint (which re-runs the policy, the binding, the
1845
+ * switch and the agent's write scope), name the job on the record
1846
+ * BEFORE the wait, release the breaker slot, wait, and read the
1847
+ * finished job exactly as the investigation lane reads it
1848
+ * (ResourceCommandJobRunner: run state, redaction, access failure).
1849
+ */
1850
+ const resourceType: AiResourceType =
1851
+ command.resourceType as AiResourceType;
1852
+ const resourceId: ObjectID = new ObjectID(command.resourceId!);
1853
+
1854
+ const job: RunnerJob = await RunnerJobService.enqueueAiResourceCommand({
1855
+ projectId: this.options.projectId,
1856
+ aiRunId: this.options.aiRunId,
1857
+ origin: RunnerJobOrigin.AiRemediation,
1858
+ autoRemediationSuggestionId: this.options.suggestionId,
1859
+ resourceType,
1860
+ resourceId,
1861
+ stepId: `${INLINE_COMMAND_STEP_ID_PREFIX}${command.sequence}`,
1862
+ targetResourceAiAgentId: new ObjectID(command.runnerId),
1863
+ command: command.command,
1864
+ timeoutInMs: command.timeoutInMs,
1865
+ claimTimeoutInMs: RESOURCE_COMMAND_CLAIM_TIMEOUT_MS,
1866
+ });
1867
+
1868
+ command.execution.runnerJobId = job.id?.toString();
1869
+ await this.persistPlanProgress();
1870
+
1871
+ // The job row is the breaker reservation: the next holder counts it.
1872
+ await afterEnqueue();
1873
+
1874
+ const terminalJob: RunnerJob = await this.waitForJobWithHeartbeat({
1875
+ jobId: job.id!,
1876
+ claimTimeoutInMs: RESOURCE_COMMAND_CLAIM_TIMEOUT_MS,
1877
+ executionTimeoutInMs: command.timeoutInMs,
1878
+ });
1879
+
1880
+ const outcome: ResourceCommandJobOutcome =
1881
+ await ResourceCommandJobRunner.readFinishedJob({
1882
+ job,
1883
+ terminalJob,
1884
+ command: command.command,
1885
+ resourceType,
1886
+ claimTimeoutInMs: RESOURCE_COMMAND_CLAIM_TIMEOUT_MS,
1887
+ executionTimeoutInMs: command.timeoutInMs,
1888
+ });
1889
+
1890
+ await ResourceCommandJobRunner.recordOutcomeOnResource({
1891
+ resourceType,
1892
+ resourceId,
1893
+ outcome,
1894
+ });
1895
+
1896
+ // Certainly never ran: a failed tool call, off the record.
1897
+ if (outcome.runState === ResourceCommandRunState.NotRun) {
1898
+ return await this.settleNeverRan(command, {
1899
+ displayCommand: outcome.displayCommand,
1900
+ errorMessage: outcome.errorMessage,
1901
+ claimTimedOut: outcome.claimTimedOut === true,
1902
+ });
1903
+ }
1904
+
1905
+ command.execution.status = outcome.succeeded
1906
+ ? AiRemediationCommandExecutionStatus.Succeeded
1907
+ : AiRemediationCommandExecutionStatus.Failed;
1908
+ command.execution.completedAt =
1909
+ OneUptimeDate.getCurrentDate().toISOString();
1910
+ command.execution.exitCode = outcome.exitCode;
1911
+ command.execution.output = outcome.output;
1912
+ redactionCount = outcome.redactionCount ?? 0;
1913
+ isTruncated = outcome.isTruncated ?? false;
1914
+ if (!outcome.succeeded) {
1915
+ command.execution.errorMessage = outcome.errorMessage;
1916
+ }
1917
+
1918
+ if (outcome.runState === ResourceCommandRunState.Unknown) {
1919
+ resourceResultUnknown = true;
1920
+ outcomeText = this.describeResultUnknown(command, {
1921
+ displayCommand: outcome.displayCommand,
1922
+ reason: outcome.errorMessage,
1923
+ });
1924
+ } else if (!outcome.succeeded && typeof outcome.exitCode !== "number") {
1925
+ // The program ran but was stopped before it finished.
1926
+ outcomeText = `${ResourceCommandJobRunner.describeForLlm({
1927
+ outcome,
1928
+ resourceType,
1929
+ })}\n${RESOURCE_UNFINISHED_CHECK_FIRST}`;
1930
+ } else {
1931
+ outcomeText = ResourceCommandJobRunner.describeForLlm({
1932
+ outcome,
1933
+ resourceType,
1934
+ });
1935
+ }
1936
+ } else {
1937
+ const job: RunnerJob = await RunnerJobService.enqueueAiCommand({
1938
+ projectId: this.options.projectId,
1312
1939
  aiRunId: this.options.aiRunId,
1313
1940
  autoRemediationSuggestionId: this.options.suggestionId,
1314
1941
  stepId: `${INLINE_COMMAND_STEP_ID_PREFIX}${command.sequence}`,
@@ -1380,6 +2007,22 @@ export default class RemediationCommandToolkit {
1380
2007
  });
1381
2008
  }
1382
2009
 
2010
+ /*
2011
+ * The resource chokepoint refused the command (its policy, binding,
2012
+ * switch, brake and write-scope checks run before the row is
2013
+ * written): no job exists, so it certainly never ran.
2014
+ */
2015
+ if (
2016
+ command.stepType === RunbookStepType.ResourceCommand &&
2017
+ !command.execution.runnerJobId
2018
+ ) {
2019
+ return await this.settleNeverRan(command, {
2020
+ displayCommand: command.command,
2021
+ errorMessage: this.redactResourceText(command, message),
2022
+ claimTimedOut: false,
2023
+ });
2024
+ }
2025
+
1383
2026
  command.execution.status = AiRemediationCommandExecutionStatus.Failed;
1384
2027
  command.execution.completedAt =
1385
2028
  OneUptimeDate.getCurrentDate().toISOString();
@@ -1396,6 +2039,17 @@ export default class RemediationCommandToolkit {
1396
2039
  displayCommand: command.command,
1397
2040
  reason: `Waiting for its result failed: ${message}`,
1398
2041
  });
2042
+ } else if (command.stepType === RunbookStepType.ResourceCommand) {
2043
+ // The same for a resource's agent.
2044
+ command.execution.errorMessage = this.redactResourceText(
2045
+ command,
2046
+ message,
2047
+ );
2048
+ resourceResultUnknown = true;
2049
+ outcomeText = this.describeResultUnknown(command, {
2050
+ displayCommand: command.command,
2051
+ reason: `Waiting for its result failed: ${message}`,
2052
+ });
1399
2053
  } else {
1400
2054
  outcomeText = `Command FAILED before completion: ${message}`;
1401
2055
  }
@@ -1414,13 +2068,46 @@ export default class RemediationCommandToolkit {
1414
2068
  ? kubectlResultUnknown
1415
2069
  ? `Sent to cluster "${command.kubernetesClusterNameSnapshot}", result unknown: ${this.summarizeCommand(command.command)}`
1416
2070
  : `Executed on cluster "${command.kubernetesClusterNameSnapshot}": ${this.summarizeCommand(command.command)}`
1417
- : `Executed on Runner "${command.runnerNameSnapshot}": ${this.summarizeCommand(command.command)}`,
2071
+ : command.stepType === RunbookStepType.ResourceCommand
2072
+ ? resourceResultUnknown
2073
+ ? `Sent to ${this.describeCommandResource(command)}, result unknown: ${this.summarizeCommand(command.command)}`
2074
+ : `Executed on ${this.describeCommandResource(command)}: ${this.summarizeCommand(command.command)}`
2075
+ : `Executed on Runner "${command.runnerNameSnapshot}": ${this.summarizeCommand(command.command)}`,
1418
2076
  redactionCount,
1419
2077
  isTruncated,
1420
2078
  },
1421
2079
  };
1422
2080
  }
1423
2081
 
2082
+ // 'Docker host "web-1"' for a ResourceCommand step, from its snapshot.
2083
+ private describeCommandResource(command: AiRemediationCommand): string {
2084
+ const info: AiResourceTypeInfo | null = isAiResourceType(
2085
+ command.resourceType,
2086
+ )
2087
+ ? AI_RESOURCE_TYPE_INFO[command.resourceType]
2088
+ : null;
2089
+
2090
+ return `${info ? info.displayName : "resource"} "${
2091
+ command.resourceNameSnapshot || command.resourceId || "(unknown)"
2092
+ }"`;
2093
+ }
2094
+
2095
+ // A resource program's text, through the resource redaction.
2096
+ private redactResourceText(
2097
+ command: AiRemediationCommand,
2098
+ text: string,
2099
+ ): string {
2100
+ if (!isAiResourceType(command.resourceType)) {
2101
+ return ToolResultSerializer.redact(text).text;
2102
+ }
2103
+
2104
+ return ResourceCommandJobRunner.redactAndCap({
2105
+ output: text,
2106
+ resourceType: command.resourceType,
2107
+ program: command.command.trim().split(/\s+/)[0] || "",
2108
+ }).text;
2109
+ }
2110
+
1424
2111
  /*
1425
2112
  * A kubectl command whose job certainly never reached kubectl (no Runner
1426
2113
  * claimed it, the server or the Runner refused it, kubectl could not
@@ -1444,6 +2131,23 @@ export default class RemediationCommandToolkit {
1444
2131
  this.neverRanCount += 1;
1445
2132
  await this.persistPlanProgress();
1446
2133
 
2134
+ if (command.stepType === RunbookStepType.ResourceCommand) {
2135
+ const label: string = this.describeCommandResource(command);
2136
+ const noun: string = isAiResourceType(command.resourceType)
2137
+ ? describeResourceNoun(command.resourceType)
2138
+ : "resource";
2139
+
2140
+ return this.failure(
2141
+ `"${data.displayCommand}" did NOT run on ${label}: ${
2142
+ data.errorMessage || "the job never reached the resource's AI agent."
2143
+ } Nothing changed on the ${noun} and nothing was recorded as executed. ${
2144
+ data.claimTimedOut
2145
+ ? `Do NOT send more commands to this ${noun} in this run — its AI agent is not picking them up; say so in your analysis.`
2146
+ : "Do NOT resend the same command; fix what the refusal names, or put the change in your recommendations for a human."
2147
+ }`,
2148
+ );
2149
+ }
2150
+
1447
2151
  return this.failure(
1448
2152
  `"${data.displayCommand}" did NOT run on cluster "${
1449
2153
  command.kubernetesClusterNameSnapshot || command.kubernetesClusterId
@@ -1465,6 +2169,31 @@ export default class RemediationCommandToolkit {
1465
2169
  command: AiRemediationCommand,
1466
2170
  data: { displayCommand: string; reason: string | undefined },
1467
2171
  ): string {
2172
+ if (command.stepType === RunbookStepType.ResourceCommand) {
2173
+ const resourceReason: string = this.redactResourceText(
2174
+ command,
2175
+ (data.reason || "No result came back for this command.").trim(),
2176
+ ).trim();
2177
+ const noun: string = isAiResourceType(command.resourceType)
2178
+ ? describeResourceNoun(command.resourceType)
2179
+ : "resource";
2180
+
2181
+ return [
2182
+ `${data.displayCommand}`,
2183
+ `RESULT UNKNOWN on ${this.describeCommandResource(command)}: ${
2184
+ SENTENCE_END_PATTERN.test(resourceReason)
2185
+ ? resourceReason
2186
+ : `${resourceReason}.`
2187
+ }`,
2188
+ `The command reached the ${noun}'s AI agent, so it MAY have run and changed the ${noun}. It stays on this round's record as a command that may have run, and verification judges it${
2189
+ command.rollbackCommand
2190
+ ? "; if the service does not recover, its rollbackCommand is not run blind — a human is asked to check and undo it"
2191
+ : ""
2192
+ }.`,
2193
+ `Before you reissue this command, or run anything that depends on it, check with a read (${RUN_INFRASTRUCTURE_COMMAND_TOOL_NAME}) whether it took effect. Do NOT resend it blindly.`,
2194
+ ].join("\n");
2195
+ }
2196
+
1468
2197
  const reason: string = KubectlOutputRedactor.redact(
1469
2198
  (data.reason || "No result came back for this command.").trim(),
1470
2199
  ).text;
@@ -1522,6 +2251,40 @@ export default class RemediationCommandToolkit {
1522
2251
  return null;
1523
2252
  }
1524
2253
 
2254
+ /*
2255
+ * getCommandScopeRefusal for a resource: whether its AI agent would
2256
+ * refuse this command or its rollback (getResourceWriteScopeRefusal),
2257
+ * worded for the model.
2258
+ */
2259
+ private getResourceCommandScopeRefusal(
2260
+ resource: ResourceAiAccessStatus,
2261
+ command: Pick<AiRemediationCommand, "command" | "rollbackCommand">,
2262
+ ): string | null {
2263
+ const forward: string | null =
2264
+ RemediationCommandToolkit.getResourceWriteScopeRefusal({
2265
+ resource,
2266
+ command: command.command,
2267
+ });
2268
+
2269
+ if (forward) {
2270
+ return `${forward} The command was neither run nor recorded.`;
2271
+ }
2272
+
2273
+ if (command.rollbackCommand) {
2274
+ const rollback: string | null =
2275
+ RemediationCommandToolkit.getResourceWriteScopeRefusal({
2276
+ resource,
2277
+ command: command.rollbackCommand,
2278
+ });
2279
+
2280
+ if (rollback) {
2281
+ return `The rollbackCommand would be refused when it has to run: ${rollback} The command was neither run nor recorded — give a rollback the agent may run, or omit it.`;
2282
+ }
2283
+ }
2284
+
2285
+ return null;
2286
+ }
2287
+
1525
2288
  /*
1526
2289
  * Null when the command may auto-execute in FullAuto; otherwise why not.
1527
2290
  * Bash/SSH: denylist, structural guard and the rule allowlist, for the
@@ -1603,6 +2366,10 @@ export default class RemediationCommandToolkit {
1603
2366
  return null;
1604
2367
  }
1605
2368
 
2369
+ if (command.stepType === RunbookStepType.ResourceCommand) {
2370
+ return this.getResourceFullAutoRefusal(command);
2371
+ }
2372
+
1606
2373
  const policy: CommandPolicyResult = CommandPolicy.evaluateCommand({
1607
2374
  command: command.command,
1608
2375
  allowlistPatterns: this.options.allowlistPatterns,
@@ -1706,6 +2473,123 @@ export default class RemediationCommandToolkit {
1706
2473
  : "Include this action in your final recommendations for a human.";
1707
2474
  }
1708
2475
 
2476
+ /*
2477
+ * The FullAuto gate for a resource command — the kubectl branch of
2478
+ * getFullAutoRefusal, on the resource command policy: the resource's
2479
+ * (live) mode must run unattended, the ladder
2480
+ * (ResourceCommandPolicy.evaluateForAutoExecution with the resource's
2481
+ * allowlist, bypass = BypassApproval) must auto-approve the command, and
2482
+ * its rollback — which runs unattended — must auto-approve too. A refusal
2483
+ * a human's click would lift carries an approvalReason.
2484
+ */
2485
+ private getResourceFullAutoRefusal(
2486
+ command: AiRemediationCommand,
2487
+ ): FullAutoRefusal | null {
2488
+ const resource: ResourceAiAccessStatus | undefined =
2489
+ this.findResourceTarget(command.resourceType, command.resourceId);
2490
+
2491
+ if (!resource) {
2492
+ return {
2493
+ text: "The resource is no longer a valid target. Use list_command_targets.",
2494
+ };
2495
+ }
2496
+
2497
+ const label: string = describeResourceLabel(resource);
2498
+
2499
+ if (!isUnattendedResourceRemediationMode(resource.aiRemediationMode)) {
2500
+ return {
2501
+ text: `${label.charAt(0).toUpperCase()}${label.slice(1)} requires human approval for every change, so nothing can execute inline in this run. ${this.describeWhereRefusedChangesGo()}`,
2502
+ approvalReason: `${label} asks for approval of every change`,
2503
+ };
2504
+ }
2505
+
2506
+ const bypassApproval: boolean =
2507
+ resource.aiRemediationMode === ResourceAiRemediationMode.BypassApproval;
2508
+
2509
+ const verdict: ResourceAutoExecutionVerdict =
2510
+ ResourceCommandPolicy.evaluateForAutoExecution({
2511
+ resourceType: resource.resourceType,
2512
+ command: command.command,
2513
+ allowlistPatterns: resource.aiCommandAllowlist,
2514
+ bypassApproval,
2515
+ });
2516
+
2517
+ if (verdict.verdict !== AiRemediationCommandPolicyVerdict.AutoApproved) {
2518
+ if (verdict.verdict === AiRemediationCommandPolicyVerdict.Denied) {
2519
+ return {
2520
+ text: `${verdict.reason} The command was NOT executed.`,
2521
+ };
2522
+ }
2523
+
2524
+ return this.describeResourceNeedsAHuman({
2525
+ resource,
2526
+ verdict,
2527
+ bypassApproval,
2528
+ });
2529
+ }
2530
+
2531
+ if (command.rollbackCommand) {
2532
+ const rollbackVerdict: ResourceAutoExecutionVerdict =
2533
+ ResourceCommandPolicy.evaluateForAutoExecution({
2534
+ resourceType: resource.resourceType,
2535
+ command: command.rollbackCommand,
2536
+ allowlistPatterns: resource.aiCommandAllowlist,
2537
+ bypassApproval,
2538
+ });
2539
+
2540
+ if (
2541
+ rollbackVerdict.verdict !==
2542
+ AiRemediationCommandPolicyVerdict.AutoApproved
2543
+ ) {
2544
+ return {
2545
+ text: `The rollbackCommand does not qualify for automatic execution: ${rollbackVerdict.reason} Nothing was executed. Provide a safe rollback on ONE named object (for example the start that undoes a stop), or omit it.`,
2546
+ };
2547
+ }
2548
+ }
2549
+
2550
+ return null;
2551
+ }
2552
+
2553
+ /*
2554
+ * describeNeedsAHuman for a resource: named for what actually holds the
2555
+ * change back — a change the policy says always needs a human (in every
2556
+ * mode, Bypass approval and the allowlist included), or a riskier change
2557
+ * on a resource that runs only safe changes on its own.
2558
+ */
2559
+ private describeResourceNeedsAHuman(data: {
2560
+ resource: ResourceAiAccessStatus;
2561
+ verdict: ResourceAutoExecutionVerdict;
2562
+ bypassApproval: boolean;
2563
+ }): FullAutoRefusal {
2564
+ const { resource, verdict } = data;
2565
+ const label: string = describeResourceLabel(resource);
2566
+ const whereItGoes: string = this.describeWhereRefusedChangesGo();
2567
+
2568
+ if (verdict.requiresHuman === true) {
2569
+ return {
2570
+ text: `${verdict.reason} The command was NOT executed: this change always needs a human, in every mode — Bypass approval and the ${describeResourceNoun(
2571
+ resource.resourceType,
2572
+ )}'s allowlist included. ${whereItGoes} Do NOT hunt for a worse substitute that would need a human just the same.`,
2573
+ approvalReason: `the command policy of ${label} says this change always needs a human, in every mode`,
2574
+ };
2575
+ }
2576
+
2577
+ if (
2578
+ verdict.tier === ResourceCommandTier.RiskyWrite &&
2579
+ !data.bypassApproval
2580
+ ) {
2581
+ return {
2582
+ text: `${verdict.reason} The command was NOT executed. ${whereItGoes} Do NOT hunt for a worse safe substitute; use a safe change (${RESOURCE_SAFE_CHANGES_SUMMARY}) only when it is genuinely the right fix.`,
2583
+ approvalReason: `it is a riskier change (${verdict.tier}), and ${label} runs only safe changes on its own unless its command allowlist names the exact command`,
2584
+ };
2585
+ }
2586
+
2587
+ return {
2588
+ text: `${verdict.reason} The command was NOT executed. ${whereItGoes}`,
2589
+ approvalReason: `${label} does not allow it without a human: ${verdict.reason}`,
2590
+ };
2591
+ }
2592
+
1709
2593
  /*
1710
2594
  * Keep a kubectl change refused only for want of a human's click, so a
1711
2595
  * cluster round that executes nothing can propose it when it settles.
@@ -1717,9 +2601,11 @@ export default class RemediationCommandToolkit {
1717
2601
  command: AiRemediationCommand,
1718
2602
  refusal: FullAutoRefusal,
1719
2603
  ): void {
2604
+ // Kubectl changes on a cluster, and resource commands on a resource.
1720
2605
  if (
1721
2606
  !refusal.approvalReason ||
1722
- command.stepType !== RunbookStepType.Kubectl
2607
+ (command.stepType !== RunbookStepType.Kubectl &&
2608
+ command.stepType !== RunbookStepType.ResourceCommand)
1723
2609
  ) {
1724
2610
  return;
1725
2611
  }
@@ -1728,6 +2614,8 @@ export default class RemediationCommandToolkit {
1728
2614
  (kept: RemediationCommandNeedingApproval) => {
1729
2615
  return (
1730
2616
  kept.command.kubernetesClusterId === command.kubernetesClusterId &&
2617
+ getResourceKey(kept.command.resourceType, kept.command.resourceId) ===
2618
+ getResourceKey(command.resourceType, command.resourceId) &&
1731
2619
  kept.command.command === command.command
1732
2620
  );
1733
2621
  },
@@ -1989,6 +2877,283 @@ export default class RemediationCommandToolkit {
1989
2877
  }
1990
2878
  }
1991
2879
 
2880
+ /*
2881
+ * refreshClusterTarget for a resource: re-read the resource from its AI
2882
+ * page before every inline change. Refuses — and stops the run from
2883
+ * changing that resource again — when fixes were turned off or lost
2884
+ * readiness (project switches, the agent going offline or read-only
2885
+ * included: the status folds them in), when the resource is now reached
2886
+ * through another AI agent than the one this run's command names (the
2887
+ * agent was reset or replaced), or when the status cannot be read (fail
2888
+ * closed). Otherwise the snapshot is replaced with the live status, so the
2889
+ * verdict that follows uses the CURRENT mode and allowlist.
2890
+ */
2891
+ private async refreshResourceTarget(
2892
+ command: AiRemediationCommand,
2893
+ ): Promise<FullAutoRefusal | null> {
2894
+ const key: string = getResourceKey(
2895
+ command.resourceType,
2896
+ command.resourceId,
2897
+ );
2898
+ const label: string = describeResourceLabel({
2899
+ resourceType: command.resourceType,
2900
+ resourceName: command.resourceNameSnapshot || command.resourceId,
2901
+ });
2902
+ const noun: string = isAiResourceType(command.resourceType)
2903
+ ? describeResourceNoun(command.resourceType)
2904
+ : "resource";
2905
+ const stopText: string = `The command was NOT executed. Do NOT run any further command on this ${noun} in this run; summarize what happened and put the fix in your final recommendations.`;
2906
+
2907
+ if (
2908
+ !isAiResourceType(command.resourceType) ||
2909
+ !command.resourceId ||
2910
+ !ObjectID.isValidUUID(command.resourceId)
2911
+ ) {
2912
+ return {
2913
+ text: `The command names no valid resource. ${stopText}`,
2914
+ };
2915
+ }
2916
+
2917
+ let status: ResourceAiAccessStatus | null;
2918
+
2919
+ try {
2920
+ status = await ResourceAiAccessService.getStatusForResource({
2921
+ projectId: this.options.projectId,
2922
+ resourceType: command.resourceType,
2923
+ resourceId: new ObjectID(command.resourceId),
2924
+ });
2925
+ } catch (error) {
2926
+ logger.error(
2927
+ `RemediationCommandToolkit: could not re-read the AI access of ${command.resourceType} ${command.resourceId} before an inline change; refusing it: ${error}`,
2928
+ );
2929
+ return {
2930
+ text: `Could not confirm that ${label} still allows AI remediation. ${stopText}`,
2931
+ };
2932
+ }
2933
+
2934
+ if (!status) {
2935
+ this.revokeResource(key);
2936
+ return {
2937
+ text: `${label.charAt(0).toUpperCase()}${label.slice(1)} no longer exists in this project. ${stopText}`,
2938
+ };
2939
+ }
2940
+
2941
+ const liveLabel: string = describeResourceLabel(status);
2942
+
2943
+ if (!status.isRemediationReady) {
2944
+ this.revokeResource(key);
2945
+ const gap: ResourceAiAccessGap | undefined = status.gaps.find(
2946
+ (candidate: ResourceAiAccessGap): boolean => {
2947
+ return candidate.blocksRemediation;
2948
+ },
2949
+ );
2950
+ return {
2951
+ text: `${liveLabel.charAt(0).toUpperCase()}${liveLabel.slice(1)} no longer allows AI remediation${
2952
+ gap ? ` (${gap.title})` : ""
2953
+ } — its AI agent page changed during this run. ${stopText}`,
2954
+ };
2955
+ }
2956
+
2957
+ if (!status.agent || status.agent.agentId !== command.runnerId) {
2958
+ this.revokeResource(key);
2959
+ return {
2960
+ text: `${liveLabel.charAt(0).toUpperCase()}${liveLabel.slice(1)} is no longer reached through the AI agent this run started with (its agent was reset or replaced). ${stopText}`,
2961
+ };
2962
+ }
2963
+
2964
+ const snapshot: ResourceAiAccessStatus | undefined =
2965
+ this.findResourceTarget(command.resourceType, command.resourceId);
2966
+
2967
+ this.replaceResourceTarget(status);
2968
+
2969
+ const round: number = this.options.resourceRoundNumber || 1;
2970
+
2971
+ if (
2972
+ snapshot &&
2973
+ doesResourceModeRunRoundUnattended(snapshot.aiRemediationMode, round) &&
2974
+ !doesResourceModeRunRoundUnattended(status.aiRemediationMode, round)
2975
+ ) {
2976
+ /*
2977
+ * On a follow-up round, Automatic is still an unattended mode — but
2978
+ * one that asks for every round after the first, so it stops this
2979
+ * round's unattended changes like a move to "ask for approval" does.
2980
+ */
2981
+ if (
2982
+ isUnattendedResourceRemediationMode(status.aiRemediationMode) &&
2983
+ round > 1
2984
+ ) {
2985
+ return {
2986
+ text: `The AI remediation mode of ${liveLabel} was changed to Automatic during this run, and Automatic asks for approval of every change after a signal's first round (this is round ${round}), so no change runs on it unattended any more. The command was NOT executed. ${this.describeWhereRefusedChangesGo()} Do NOT try other changes on this ${noun}.`,
2987
+ approvalReason: `the AI remediation mode of ${liveLabel} was changed to Automatic during the round, which asks for approval after a signal's first round`,
2988
+ };
2989
+ }
2990
+
2991
+ return {
2992
+ text: `The AI remediation mode of ${liveLabel} was changed to ask for approval during this run, so no change runs on it unattended any more. The command was NOT executed. ${this.describeWhereRefusedChangesGo()} Do NOT try other changes on this ${noun}.`,
2993
+ approvalReason: `the AI remediation mode of ${liveLabel} was changed to ask for approval during the round`,
2994
+ };
2995
+ }
2996
+
2997
+ return null;
2998
+ }
2999
+
3000
+ /*
3001
+ * revokeCluster for a resource: the rest of the run treats it as never
3002
+ * having been a target, and what was kept for its proposal is dropped.
3003
+ */
3004
+ private revokeResource(key: string): void {
3005
+ this.revokedResourceKeys.add(key);
3006
+ this.commandsNeedingApproval = this.commandsNeedingApproval.filter(
3007
+ (kept: RemediationCommandNeedingApproval): boolean => {
3008
+ return (
3009
+ getResourceKey(kept.command.resourceType, kept.command.resourceId) !==
3010
+ key
3011
+ );
3012
+ },
3013
+ );
3014
+ }
3015
+
3016
+ private replaceResourceTarget(status: ResourceAiAccessStatus): void {
3017
+ const key: string = getResourceKey(status.resourceType, status.resourceId);
3018
+
3019
+ this.options.resourceTargets = (this.options.resourceTargets || []).map(
3020
+ (resource: ResourceAiAccessStatus): ResourceAiAccessStatus => {
3021
+ return getResourceKey(resource.resourceType, resource.resourceId) ===
3022
+ key
3023
+ ? status
3024
+ : resource;
3025
+ },
3026
+ );
3027
+ }
3028
+
3029
+ // Does this run already hold a slot on the resource (an inline job there)?
3030
+ private hasChangedResource(
3031
+ resourceType: string | undefined,
3032
+ resourceId: string | undefined,
3033
+ ): boolean {
3034
+ const key: string = getResourceKey(resourceType, resourceId);
3035
+
3036
+ return this.executedCommands.some(
3037
+ (executed: AiRemediationCommand): boolean => {
3038
+ return (
3039
+ executed.stepType === RunbookStepType.ResourceCommand &&
3040
+ getResourceKey(executed.resourceType, executed.resourceId) === key &&
3041
+ Boolean(executed.execution?.runnerJobId)
3042
+ );
3043
+ },
3044
+ );
3045
+ }
3046
+
3047
+ /*
3048
+ * reserveClusterSlot for a resource: one of the resource's hourly
3049
+ * unattended slots, taken under the per-resource breaker lock
3050
+ * (RESOURCE_BREAKER_LOCK_NAMESPACE, keyed by type and id, never a
3051
+ * cluster's key), which is returned HELD until this run's job row exists.
3052
+ * Under the same lock, no other AI run may hold the resource
3053
+ * (resourceHold). Fails closed.
3054
+ */
3055
+ private async reserveResourceSlot(
3056
+ command: AiRemediationCommand,
3057
+ ): Promise<ClusterSlotReservation> {
3058
+ const resourceType: AiResourceType = command.resourceType as AiResourceType;
3059
+ const resourceId: string = command.resourceId || "";
3060
+ const label: string = describeResourceLabel({
3061
+ resourceType,
3062
+ resourceName: command.resourceNameSnapshot || resourceId,
3063
+ });
3064
+ const noun: string = isAiResourceType(resourceType)
3065
+ ? describeResourceNoun(resourceType)
3066
+ : "resource";
3067
+ const couldNotCheck: FullAutoRefusal = {
3068
+ text: `Could not check the hourly limit on unattended AI fixes for ${label}, so the command was NOT executed. ${this.describeWhereRefusedChangesGo()}`,
3069
+ approvalReason: `the hourly limit on unattended AI fixes for ${label} could not be checked`,
3070
+ };
3071
+
3072
+ if (!isAiResourceType(resourceType) || !resourceId) {
3073
+ return { mutex: null, refusal: couldNotCheck };
3074
+ }
3075
+
3076
+ let mutex: SemaphoreMutex | null = null;
3077
+
3078
+ try {
3079
+ mutex = await Semaphore.lock({
3080
+ key: getResourceBreakerLockKey(resourceType, resourceId),
3081
+ namespace: RESOURCE_BREAKER_LOCK_NAMESPACE,
3082
+ lockTimeout: CLUSTER_BREAKER_LOCK_TIMEOUT_MS,
3083
+ acquireTimeout: CLUSTER_BREAKER_LOCK_ACQUIRE_TIMEOUT_MS,
3084
+ });
3085
+ } catch (error) {
3086
+ logger.error(
3087
+ `RemediationCommandToolkit: could not take the circuit-breaker lock of ${resourceType} ${resourceId}; refusing the inline change: ${error}`,
3088
+ );
3089
+ return { mutex: null, refusal: couldNotCheck };
3090
+ }
3091
+
3092
+ try {
3093
+ const breaker: ResourceBreakerState =
3094
+ await AutoRemediationRuleEngineService.getResourceBreakerState({
3095
+ resourceType,
3096
+ resourceId,
3097
+ projectId: this.options.projectId,
3098
+ forRound: {
3099
+ suggestionId: this.options.suggestionId,
3100
+ createdAt: this.options.suggestionCreatedAt,
3101
+ },
3102
+ });
3103
+
3104
+ if (!breaker.hasHeadroom) {
3105
+ await RemediationCommandToolkit.releaseLock(mutex);
3106
+ logger.warn(
3107
+ `RemediationCommandToolkit: ${resourceType} ${resourceId} hit its hourly circuit breaker (${breaker.autoExecutedInWindow} unattended AI fixes); refusing an inline change.`,
3108
+ );
3109
+ return {
3110
+ mutex: null,
3111
+ refusal: {
3112
+ text: `The hourly circuit breaker for ${label} tripped: it already had ${breaker.autoExecutedInWindow} unattended AI fix(es) in the last hour (the limit is ${MAX_AUTO_EXECUTIONS_PER_RULE_PER_HOUR}). The command was NOT executed. ${this.describeWhereRefusedChangesGo()}`,
3113
+ approvalReason: `the hourly circuit breaker for ${label} tripped (${breaker.autoExecutedInWindow} unattended AI fixes in the last hour)`,
3114
+ },
3115
+ };
3116
+ }
3117
+
3118
+ if (this.options.resourceHold) {
3119
+ const hold: ResourceRoundHold | null =
3120
+ await AutoRemediationRuleEngineService.findRoundHoldingResource({
3121
+ projectId: this.options.projectId,
3122
+ resourceType,
3123
+ resourceId,
3124
+ forRound: {
3125
+ suggestionId: this.options.suggestionId,
3126
+ createdAt: this.options.suggestionCreatedAt,
3127
+ },
3128
+ anyOrder: this.options.resourceHold.anyOrder,
3129
+ subject: this.options.resourceHold.subject,
3130
+ });
3131
+
3132
+ if (hold) {
3133
+ await RemediationCommandToolkit.releaseLock(mutex);
3134
+ logger.warn(
3135
+ `RemediationCommandToolkit: another AI run (${hold.suggestionId}) on ${resourceType} ${resourceId} ${hold.description}; refusing an inline change.`,
3136
+ );
3137
+ return {
3138
+ mutex: null,
3139
+ refusal: {
3140
+ text: `Another OneUptime AI run on ${label} ${hold.description}, so this run may not change the ${noun} too — two unattended fixes on one ${noun} verify and roll back on top of each other. The command was NOT executed. ${this.describeWhereRefusedChangesGo()} Do NOT try other changes on this ${noun}.`,
3141
+ approvalReason: `another OneUptime AI run on ${label} ${hold.description}`,
3142
+ },
3143
+ };
3144
+ }
3145
+ }
3146
+
3147
+ return { mutex };
3148
+ } catch (error) {
3149
+ await RemediationCommandToolkit.releaseLock(mutex);
3150
+ logger.error(
3151
+ `RemediationCommandToolkit: circuit-breaker or in-flight run check failed for ${resourceType} ${resourceId}; refusing the inline change: ${error}`,
3152
+ );
3153
+ return { mutex: null, refusal: couldNotCheck };
3154
+ }
3155
+ }
3156
+
1992
3157
  private static async releaseLock(mutex: SemaphoreMutex): Promise<void> {
1993
3158
  try {
1994
3159
  await Semaphore.release(mutex);
@@ -2023,7 +3188,9 @@ export default class RemediationCommandToolkit {
2023
3188
  return {
2024
3189
  definition: {
2025
3190
  name: "propose_remediation_commands",
2026
- description: `Propose an ordered plan of at most ${MAX_PLAN_COMMANDS} remediation commands for one-click human approval. Nothing executes until a human approves the whole plan. Call this at most once with your final plan (a later call replaces the earlier one). Provide a rollbackCommand for every state-changing command that has an undo (for Kubectl, e.g. kubectl rollout undo deployment/<name> -n <namespace>). Kubectl commands run through the cluster's Kubernetes AI agent or Runner, and a write outside its writeScope (list_command_targets) is refused; ${KUBECTL_NEVER_RUNS_SUMMARY}.`,
3191
+ description: this.isResourceRound()
3192
+ ? `Propose an ordered plan of at most ${MAX_PLAN_COMMANDS} remediation commands on the infrastructure resource this round is about (stepType ResourceCommand with its resourceId) for one-click human approval. Nothing executes until a human approves the whole plan. Call this at most once with your final plan (a later call replaces the earlier one). One command per step, written as the program followed by its arguments — never a shell line; a read-only command is not a fix (run it with ${RUN_INFRASTRUCTURE_COMMAND_TOOL_NAME} instead). Provide a rollbackCommand for every state-changing command that has an undo — it runs unattended, so it must be a safe change on ONE named object. The commands run through the resource's own AI agent, and a change it would refuse (it runs read-only, or the target is protected or outside its writeScope in list_command_targets) is refused; ${RESOURCE_NEVER_RUNS_SUMMARY}.\n\n${this.describeResourceWriteGuides()}`
3193
+ : `Propose an ordered plan of at most ${MAX_PLAN_COMMANDS} remediation commands for one-click human approval. Nothing executes until a human approves the whole plan. Call this at most once with your final plan (a later call replaces the earlier one). Provide a rollbackCommand for every state-changing command that has an undo (for Kubectl, e.g. kubectl rollout undo deployment/<name> -n <namespace>). Kubectl commands run through the cluster's Kubernetes AI agent or Runner, and a write outside its writeScope (list_command_targets) is refused; ${KUBECTL_NEVER_RUNS_SUMMARY}.`,
2027
3194
  inputSchema: {
2028
3195
  type: "object",
2029
3196
  properties: {
@@ -2034,12 +3201,15 @@ export default class RemediationCommandToolkit {
2034
3201
  items: {
2035
3202
  type: "object",
2036
3203
  properties: this.buildCommandSchemaProperties(),
2037
- required: [
2038
- "stepType",
2039
- "command",
2040
- "rationale",
2041
- "expectedEffect",
2042
- ],
3204
+ required: this.isResourceRound()
3205
+ ? [
3206
+ "stepType",
3207
+ "resourceId",
3208
+ "command",
3209
+ "rationale",
3210
+ "expectedEffect",
3211
+ ]
3212
+ : ["stepType", "command", "rationale", "expectedEffect"],
2043
3213
  },
2044
3214
  },
2045
3215
  },
@@ -2101,6 +3271,21 @@ export default class RemediationCommandToolkit {
2101
3271
  */
2102
3272
  parsed.command.policyVerdict =
2103
3273
  AiRemediationCommandPolicyVerdict.RequiresApproval;
3274
+ } else if (parsed.command.stepType === RunbookStepType.ResourceCommand) {
3275
+ /*
3276
+ * The same for a resource command: a proposal runs only after a
3277
+ * click, so it is RequiresApproval whatever the resource's mode —
3278
+ * and a read is not a fix a human needs to approve.
3279
+ */
3280
+ if (parsed.command.resourceCommandTier === ResourceCommandTier.Read) {
3281
+ problems.push(
3282
+ `Command ${i + 1}: "${parsed.command.command}" is read-only — it is not a fix. Run it with ${RUN_INFRASTRUCTURE_COMMAND_TOOL_NAME} and propose only the change.`,
3283
+ );
3284
+ continue;
3285
+ }
3286
+
3287
+ parsed.command.policyVerdict =
3288
+ AiRemediationCommandPolicyVerdict.RequiresApproval;
2104
3289
  } else {
2105
3290
  /*
2106
3291
  * Informational verdict for the approval card: AutoApproved
@@ -2164,9 +3349,37 @@ export default class RemediationCommandToolkit {
2164
3349
  const stepTypeRaw: string = ToolArgs.getString(args, "stepType") || "";
2165
3350
  const stepType: RunbookStepType = stepTypeRaw as RunbookStepType;
2166
3351
 
2167
- if (!AI_COMMAND_STEP_TYPES.includes(stepType)) {
3352
+ /*
3353
+ * The step types this round offers — what its schema's stepType enum
3354
+ * lists: ResourceCommand on a resource round; Bash, SSH and Kubectl on
3355
+ * every other round, where ResourceCommand is as unknown as it always
3356
+ * was (so a Kubernetes or rule round's refusal keeps its words).
3357
+ */
3358
+ const offeredStepTypes: Array<RunbookStepType> = this.isResourceRound()
3359
+ ? [RunbookStepType.ResourceCommand]
3360
+ : AI_COMMAND_STEP_TYPES.filter((type: RunbookStepType): boolean => {
3361
+ return type !== RunbookStepType.ResourceCommand;
3362
+ });
3363
+
3364
+ if (
3365
+ !AI_COMMAND_STEP_TYPES.includes(stepType) ||
3366
+ (!this.isResourceRound() && stepType === RunbookStepType.ResourceCommand)
3367
+ ) {
3368
+ return {
3369
+ errorText: `stepType must be one of: ${offeredStepTypes.join(", ")}.`,
3370
+ };
3371
+ }
3372
+
3373
+ /*
3374
+ * A resource round runs resource commands on its resource and nothing
3375
+ * else: it was given no Runner and no cluster.
3376
+ */
3377
+ if (
3378
+ this.isResourceRound() &&
3379
+ stepType !== RunbookStepType.ResourceCommand
3380
+ ) {
2168
3381
  return {
2169
- errorText: `stepType must be one of: ${AI_COMMAND_STEP_TYPES.join(", ")}.`,
3382
+ errorText: `This remediation round is about one infrastructure resource: use stepType ResourceCommand with its resourceId from list_command_targets. ${stepType} is not available here.`,
2170
3383
  };
2171
3384
  }
2172
3385
 
@@ -2209,6 +3422,31 @@ export default class RemediationCommandToolkit {
2209
3422
  });
2210
3423
  }
2211
3424
 
3425
+ /*
3426
+ * A resource command runs on the resource's own AI agent, never on a
3427
+ * Runner, so it must never fall through to the Bash/SSH path below.
3428
+ * Only a resource round (resourceTargets) offers it — any other round
3429
+ * refused it with the step types it offers, above; this is the belt
3430
+ * and braces.
3431
+ */
3432
+ if (stepType === RunbookStepType.ResourceCommand) {
3433
+ if (!this.isResourceRound()) {
3434
+ return {
3435
+ errorText: `stepType must be one of: ${offeredStepTypes.join(", ")}.`,
3436
+ };
3437
+ }
3438
+
3439
+ return this.parseResourceCommand({
3440
+ args,
3441
+ sequence,
3442
+ commandText,
3443
+ rollbackCommand,
3444
+ timeoutInMs,
3445
+ rationale,
3446
+ expectedEffect,
3447
+ });
3448
+ }
3449
+
2212
3450
  const denyReason: string | null = CommandPolicy.getDenyReason(commandText);
2213
3451
  if (denyReason) {
2214
3452
  return {
@@ -2466,6 +3704,176 @@ export default class RemediationCommandToolkit {
2466
3704
  );
2467
3705
  }
2468
3706
 
3707
+ /*
3708
+ * ResourceCommand: the target is the round's resource, the AI agent is
3709
+ * whichever one its AI page reports online, and no credential ever
3710
+ * travels. The model only names a resource it was shown (by resourceId);
3711
+ * the tier the resource command policy gives the command is recorded for
3712
+ * the card, and a command, or a rollback, the agent's write scope would
3713
+ * refuse is never composed. Denied never is either.
3714
+ */
3715
+ private parseResourceCommand(data: {
3716
+ args: JSONObject;
3717
+ sequence: number;
3718
+ commandText: string;
3719
+ rollbackCommand: string | undefined;
3720
+ timeoutInMs: number;
3721
+ rationale: string;
3722
+ expectedEffect: string;
3723
+ }): CommandArgsParseResult {
3724
+ const resourceIdRaw: string | undefined = ToolArgs.getString(
3725
+ data.args,
3726
+ "resourceId",
3727
+ );
3728
+
3729
+ const resource: ResourceAiAccessStatus | undefined = resourceIdRaw
3730
+ ? this.getResourceTargets().find(
3731
+ (candidate: ResourceAiAccessStatus): boolean => {
3732
+ return (
3733
+ candidate.resourceId.toLowerCase() === resourceIdRaw.toLowerCase()
3734
+ );
3735
+ },
3736
+ )
3737
+ : undefined;
3738
+
3739
+ if (!resource || !resource.agent) {
3740
+ return {
3741
+ errorText:
3742
+ "resourceId is required for ResourceCommand and must be the resource from list_command_targets that allows AI remediation.",
3743
+ };
3744
+ }
3745
+
3746
+ /*
3747
+ * A resource's agent is never given a credential by OneUptime: a step
3748
+ * that names one is refused, never silently stripped.
3749
+ */
3750
+ const credentialIdRaw: string | undefined = ToolArgs.getString(
3751
+ data.args,
3752
+ "credentialId",
3753
+ );
3754
+
3755
+ if (credentialIdRaw) {
3756
+ return {
3757
+ errorText: `A ResourceCommand never carries a credential: the ${
3758
+ AI_RESOURCE_TYPE_INFO[resource.resourceType].agentDisplayName
3759
+ } uses only the credentials in its own environment. Omit credentialId.`,
3760
+ };
3761
+ }
3762
+
3763
+ const info: AiResourceTypeInfo =
3764
+ AI_RESOURCE_TYPE_INFO[resource.resourceType];
3765
+
3766
+ const policy: ResourceCommandPolicyResult =
3767
+ ResourceCommandPolicy.evaluateCommand({
3768
+ resourceType: resource.resourceType,
3769
+ command: data.commandText,
3770
+ });
3771
+
3772
+ if (policy.tier === ResourceCommandTier.Denied) {
3773
+ return {
3774
+ errorText: `Denied by the ${info.displayName} command policy: ${policy.reason}. This command can never run, even with human approval — take a different approach.`,
3775
+ };
3776
+ }
3777
+
3778
+ let rollbackDisplay: string | undefined = undefined;
3779
+
3780
+ if (data.rollbackCommand) {
3781
+ const rollbackPolicy: ResourceCommandPolicyResult =
3782
+ ResourceCommandPolicy.evaluateCommand({
3783
+ resourceType: resource.resourceType,
3784
+ command: data.rollbackCommand,
3785
+ });
3786
+
3787
+ if (rollbackPolicy.tier === ResourceCommandTier.Denied) {
3788
+ return {
3789
+ errorText: `The rollbackCommand is denied by the ${info.displayName} command policy: ${rollbackPolicy.reason}. Provide a safe rollback or omit it.`,
3790
+ };
3791
+ }
3792
+
3793
+ /*
3794
+ * A rollback runs unattended after verification fails: a change that
3795
+ * always needs a human can never be one, and a riskier one only on a
3796
+ * resource whose operator bypassed approvals.
3797
+ */
3798
+ if (rollbackPolicy.requiresHuman === true) {
3799
+ return {
3800
+ errorText: `The rollbackCommand "${rollbackPolicy.displayCommand}" always needs a human (${rollbackPolicy.reason}), and rollbacks run unattended. Use a safe undo for ONE named object instead, or omit it.`,
3801
+ };
3802
+ }
3803
+
3804
+ if (
3805
+ rollbackPolicy.tier === ResourceCommandTier.RiskyWrite &&
3806
+ resource.aiRemediationMode !== ResourceAiRemediationMode.BypassApproval
3807
+ ) {
3808
+ return {
3809
+ errorText: `The rollbackCommand "${rollbackPolicy.displayCommand}" is a risky change (${rollbackPolicy.reason}) and rollbacks run unattended. Use a safe undo for ONE named object instead (for example the start that undoes a stop), or omit it.`,
3810
+ };
3811
+ }
3812
+
3813
+ rollbackDisplay = rollbackPolicy.displayCommand;
3814
+ }
3815
+
3816
+ // A write the agent has said it will refuse is never composed.
3817
+ const scopeRefusal: string | null = this.getResourceCommandScopeRefusal(
3818
+ resource,
3819
+ {
3820
+ command: policy.displayCommand,
3821
+ rollbackCommand: rollbackDisplay,
3822
+ },
3823
+ );
3824
+
3825
+ if (scopeRefusal) {
3826
+ return { errorText: scopeRefusal };
3827
+ }
3828
+
3829
+ return {
3830
+ command: {
3831
+ sequence: data.sequence,
3832
+ stepType: RunbookStepType.ResourceCommand,
3833
+ /*
3834
+ * The access target is the resource's AI agent (its row id and
3835
+ * display name), as a Kubectl step through the Kubernetes AI agent
3836
+ * names that agent.
3837
+ */
3838
+ runnerId: resource.agent.agentId,
3839
+ runnerNameSnapshot: info.agentDisplayName,
3840
+ resourceType: resource.resourceType,
3841
+ resourceId: resource.resourceId,
3842
+ resourceNameSnapshot: resource.resourceName,
3843
+ resourceCommandTier: policy.tier,
3844
+ // Stored in the canonical rendered form so the card shows exactly what runs.
3845
+ command: policy.displayCommand,
3846
+ timeoutInMs: Math.min(
3847
+ data.timeoutInMs,
3848
+ MAX_RESOURCE_COMMAND_TIMEOUT_MS,
3849
+ ),
3850
+ rationale: data.rationale,
3851
+ expectedEffect: data.expectedEffect,
3852
+ rollbackCommand: rollbackDisplay,
3853
+ policyVerdict: AiRemediationCommandPolicyVerdict.RequiresApproval,
3854
+ },
3855
+ };
3856
+ }
3857
+
3858
+ private findResourceTarget(
3859
+ resourceType: string | undefined,
3860
+ resourceId: string | undefined,
3861
+ ): ResourceAiAccessStatus | undefined {
3862
+ const key: string = getResourceKey(resourceType, resourceId);
3863
+
3864
+ if (!key) {
3865
+ return undefined;
3866
+ }
3867
+
3868
+ return this.getResourceTargets().find(
3869
+ (resource: ResourceAiAccessStatus): boolean => {
3870
+ return (
3871
+ getResourceKey(resource.resourceType, resource.resourceId) === key
3872
+ );
3873
+ },
3874
+ );
3875
+ }
3876
+
2469
3877
  /*
2470
3878
  * Wait for the RunnerJob to reach a terminal state while keeping the
2471
3879
  * AIRun's heartbeat fresh — a command may legitimately take minutes, and