@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
@@ -5,18 +5,24 @@ import RunnerJobOrigin from "../../../../Types/Runbook/RunnerJobOrigin";
5
5
  import RunnerJobStatus from "../../../../Types/Runbook/RunnerJobStatus";
6
6
  import AIRunStatus from "../../../../Types/AI/AIRunStatus";
7
7
  import AutoRemediationSuggestionStatus from "../../../../Types/AutoRemediation/AutoRemediationSuggestionStatus";
8
- import { AI_COMMAND_STEP_TYPES, AiRemediationCommandExecutionStatus, AiRemediationCommandPolicyVerdict, AiRemediationCommandPlanUtil, DEFAULT_COMMAND_TIMEOUT_MS, INLINE_COMMAND_STEP_ID_PREFIX, KUBECTL_ALLOWLIST_SUMMARY, KUBECTL_ALWAYS_ASKS_SUMMARY, KUBECTL_NEVER_RUNS_SUMMARY, KUBECTL_RISKIER_CHANGES_SUMMARY, KUBECTL_SAFE_CHANGES_SUMMARY, MAX_COMMAND_TIMEOUT_MS, MAX_PLAN_COMMANDS, MIN_COMMAND_TIMEOUT_MS, getKubectlAlwaysAsksSummary, getKubectlRiskierChangesSummary, getKubectlSafeChangesSummary, } from "../../../../Types/AutoRemediation/AiRemediationCommandPlan";
9
- import { KUBECTL_ALLOW_NODE_OPERATIONS_ENV, KUBECTL_WRITE_NAMESPACES_ENV, KubectlCommandTier, KubernetesAiRemediationMode, isKubernetesAgentRunnerName, isKubernetesAgentRunnerPosture, getKubernetesAiAccessTargetKind, isUnattendedRemediationMode, parseKubernetesRunnerPosture, } from "../../../../Types/Kubernetes/KubernetesClusterAiAccess";
8
+ import { AI_COMMAND_STEP_TYPES, AiRemediationCommandExecutionStatus, AiRemediationCommandPolicyVerdict, AiRemediationCommandPlanUtil, DEFAULT_COMMAND_TIMEOUT_MS, INLINE_COMMAND_STEP_ID_PREFIX, KUBECTL_ALLOWLIST_SUMMARY, KUBECTL_ALWAYS_ASKS_SUMMARY, KUBECTL_NEVER_RUNS_SUMMARY, KUBECTL_RISKIER_CHANGES_SUMMARY, KUBECTL_SAFE_CHANGES_SUMMARY, MAX_COMMAND_TIMEOUT_MS, MAX_PLAN_COMMANDS, MIN_COMMAND_TIMEOUT_MS, RESOURCE_ALLOWLIST_SUMMARY, RESOURCE_ALWAYS_ASKS_SUMMARY, RESOURCE_NEVER_RUNS_SUMMARY, RESOURCE_RISKIER_CHANGES_SUMMARY, RESOURCE_SAFE_CHANGES_SUMMARY, RESOURCE_UNATTENDED_ROUND_BECOMES_PROPOSAL_SUMMARY, getKubectlAlwaysAsksSummary, getKubectlRiskierChangesSummary, getKubectlSafeChangesSummary, } from "../../../../Types/AutoRemediation/AiRemediationCommandPlan";
9
+ import { AI_RESOURCE_TYPE_INFO, ALL_AI_RESOURCE_TYPES, isAiResourceType, } from "../../../../Types/ResourceAiAgent/AiResourceType";
10
+ import { MAX_RESOURCE_COMMAND_TIMEOUT_MS, RESOURCE_AI_ALLOW_WRITES_ENV, RESOURCE_AI_WRITE_TARGETS_ENV, ResourceAiRemediationMode, ResourceCommandTier, isUnattendedResourceRemediationMode, } from "../../../../Types/ResourceAiAgent/ResourceAiAccess";
11
+ import ResourceCommandPolicy from "../../../../Utils/AiRemediation/Resource/ResourceCommandPolicy";
12
+ import ResourceAiAccessService, { describeResourceNoun, } from "../../../Services/ResourceAiAccessService";
13
+ import ResourceCommandJobRunner, { RESOURCE_COMMAND_CLAIM_TIMEOUT_MS, ResourceCommandRunState, } from "../ResourceAccess/ResourceCommandJobRunner";
14
+ import { RUN_INFRASTRUCTURE_COMMAND_TOOL_NAME } from "../ResourceAccess/ResourceAccessToolNames";
15
+ import { KUBECTL_ALLOW_NODE_OPERATIONS_ENV, KUBECTL_WRITE_NAMESPACES_ENV, KubectlCommandTier, KubernetesAiRemediationMode, MAX_KUBECTL_OUTPUT_CHARS_FOR_LLM, isKubernetesAgentRunnerName, isKubernetesAgentRunnerPosture, getKubernetesAiAccessTargetKind, isUnattendedRemediationMode, parseKubernetesRunnerPosture, } from "../../../../Types/Kubernetes/KubernetesClusterAiAccess";
10
16
  import CommandPolicy from "../../../../Utils/AiRemediation/CommandPolicy";
11
17
  import KubectlPolicy from "../../../../Utils/AiRemediation/KubectlPolicy";
12
18
  import KubectlWriteScope from "../../../../Utils/AiRemediation/KubectlWriteScope";
13
19
  import AIRunService from "../../../Services/AIRunService";
14
- import AutoRemediationRuleEngineService, { MAX_AUTO_EXECUTIONS_PER_RULE_PER_HOUR, } from "../../../Services/AutoRemediationRuleEngineService";
20
+ import AutoRemediationRuleEngineService, { MAX_AUTO_EXECUTIONS_PER_RULE_PER_HOUR, RESOURCE_BREAKER_LOCK_NAMESPACE, doesResourceModeRunRoundUnattended, getResourceBreakerLockKey, } from "../../../Services/AutoRemediationRuleEngineService";
15
21
  import AutoRemediationSuggestionService from "../../../Services/AutoRemediationSuggestionService";
16
22
  import KubernetesClusterAiAccessService from "../../../Services/KubernetesClusterAiAccessService";
17
23
  import Semaphore from "../../../Infrastructure/Semaphore";
18
24
  import RunbookCredentialService from "../../../Services/RunbookCredentialService";
19
- import RunnerJobService, { isTerminalAgentJobStatus, MAX_AI_COMMAND_JOBS_PER_PROJECT_PER_HOUR, } from "../../../Services/RunnerJobService";
25
+ import RunnerJobService, { isTerminalAgentJobStatus, MAX_AI_COMMAND_JOBS_PER_PROJECT_PER_HOUR, MAX_AI_RESOURCE_COMMAND_JOBS_PER_PROJECT_PER_HOUR, } from "../../../Services/RunnerJobService";
20
26
  import RunnerService from "../../../Services/RunnerService";
21
27
  import QueryHelper from "../../../Types/Database/QueryHelper";
22
28
  import { ToolArgs } from "../Toolbox/ToolTypes";
@@ -122,7 +128,12 @@ export const AI_COMMAND_CLAIM_TIMEOUT_MS = 60000;
122
128
  * touches the heartbeat itself to stay clear of the stale-run sweeper.
123
129
  */
124
130
  const HEARTBEAT_TOUCH_INTERVAL_MS = 15000;
125
- const MAX_OUTPUT_CHARS_FOR_LLM = 6000;
131
+ /*
132
+ * What the model sees of a Bash/SSH command's output — the same cap as a
133
+ * kubectl command's, generous enough that a diagnostic's answer is never
134
+ * cut off in the part that matters.
135
+ */
136
+ const MAX_OUTPUT_CHARS_FOR_LLM = MAX_KUBECTL_OUTPUT_CHARS_FOR_LLM;
126
137
  // A reason that already ends a sentence.
127
138
  const SENTENCE_END_PATTERN = /[.!?]$/;
128
139
  /*
@@ -138,6 +149,27 @@ const KUBECTL_UNFINISHED_CHECK_FIRST = "kubectl did not finish (it was stopped b
138
149
  const CLUSTER_BREAKER_LOCK_NAMESPACE = "AutoRemediationClusterBreaker";
139
150
  const CLUSTER_BREAKER_LOCK_TIMEOUT_MS = 60000;
140
151
  const CLUSTER_BREAKER_LOCK_ACQUIRE_TIMEOUT_MS = 20000;
152
+ /*
153
+ * What the model is told when a resource command ran but did not finish
154
+ * (no exit code): the change may have landed before the agent stopped it.
155
+ */
156
+ const RESOURCE_UNFINISHED_CHECK_FIRST = `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.`;
157
+ /*
158
+ * The key a resource target, and the commands aimed at it, are matched by:
159
+ * the type and the (case-insensitive) id.
160
+ */
161
+ function getResourceKey(resourceType, resourceId) {
162
+ if (!resourceType || !resourceId) {
163
+ return "";
164
+ }
165
+ return `${resourceType}:${resourceId.toLowerCase()}`;
166
+ }
167
+ // 'Docker host "web-1"' — how the toolkit names a resource in copy.
168
+ function describeResourceLabel(data) {
169
+ return `${isAiResourceType(data.resourceType)
170
+ ? describeResourceNoun(data.resourceType)
171
+ : "resource"} "${data.resourceName || "(unknown)"}"`;
172
+ }
141
173
  /*
142
174
  * Verbs that never run on their own in any mode, whatever the allowlist
143
175
  * says. A patch of a Node never does either; the policy marks all three
@@ -173,6 +205,11 @@ export default class RemediationCommandToolkit {
173
205
  * treats them as if they had never been targets.
174
206
  */
175
207
  this.revokedClusterIds = new Set();
208
+ /*
209
+ * The same for resource targets (by getResourceKey): their AI page
210
+ * stopped allowing this run to change them mid-run.
211
+ */
212
+ this.revokedResourceKeys = new Set();
176
213
  /*
177
214
  * Commands this run sent to a Runner that never reached kubectl. They are
178
215
  * not executed commands, but their jobs exist: their sequence numbers
@@ -197,7 +234,30 @@ export default class RemediationCommandToolkit {
197
234
  */
198
235
  getCommandsNeedingApproval() {
199
236
  return this.commandsNeedingApproval.filter((kept) => {
200
- return !this.revokedClusterIds.has(kept.command.kubernetesClusterId || "");
237
+ return (!this.revokedClusterIds.has(kept.command.kubernetesClusterId || "") &&
238
+ !this.revokedResourceKeys.has(getResourceKey(kept.command.resourceType, kept.command.resourceId)));
239
+ });
240
+ }
241
+ /*
242
+ * Is this a resource round? Fixed at construction (from the targets it was
243
+ * given, not the ones still allowed), so the tools the model was handed
244
+ * never change shape mid-run.
245
+ */
246
+ isResourceRound() {
247
+ return (this.options.resourceTargets || []).length > 0;
248
+ }
249
+ /*
250
+ * The resources this run may still change: remediation-ready, with an AI
251
+ * agent, and not revoked by a live re-check.
252
+ */
253
+ getResourceTargets() {
254
+ return (this.options.resourceTargets || []).filter((resource) => {
255
+ var _a;
256
+ return (resource.isRemediationReady &&
257
+ isAiResourceType(resource.resourceType) &&
258
+ resource.agent !== null &&
259
+ Boolean((_a = resource.agent) === null || _a === void 0 ? void 0 : _a.agentId) &&
260
+ !this.revokedResourceKeys.has(getResourceKey(resource.resourceType, resource.resourceId)));
201
261
  });
202
262
  }
203
263
  getClusterTargets() {
@@ -228,7 +288,9 @@ export default class RemediationCommandToolkit {
228
288
  return {
229
289
  definition: {
230
290
  name: "list_command_targets",
231
- description: "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.",
291
+ description: this.isResourceRound()
292
+ ? "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."
293
+ : "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.",
232
294
  inputSchema: {
233
295
  type: "object",
234
296
  properties: {},
@@ -312,6 +374,42 @@ export default class RemediationCommandToolkit {
312
374
  ? cluster.kubectlAllowlist.join(" | ")
313
375
  : "(none)", allowlistMatching: KUBECTL_ALLOWLIST_SUMMARY }));
314
376
  }
377
+ for (const resource of this.getResourceTargets()) {
378
+ const info = AI_RESOURCE_TYPE_INFO[resource.resourceType];
379
+ rows.push({
380
+ targetType: "Resource",
381
+ resourceType: resource.resourceType,
382
+ resourceId: resource.resourceId,
383
+ name: resource.resourceName,
384
+ stepTypes: "ResourceCommand",
385
+ via: `its ${info.agentDisplayName}`,
386
+ programs: info.programs.join(", "),
387
+ // One idea per field, as for clusters (the serializer caps each).
388
+ remediationMode: this.describeResourceModeForLlm(resource),
389
+ safeChanges: RESOURCE_SAFE_CHANGES_SUMMARY,
390
+ riskierChanges: RESOURCE_RISKIER_CHANGES_SUMMARY,
391
+ alwaysNeedsAHuman: RESOURCE_ALWAYS_ASKS_SUMMARY,
392
+ neverRuns: RESOURCE_NEVER_RUNS_SUMMARY,
393
+ writeScope: RemediationCommandToolkit.describeResourceWriteScope(resource),
394
+ commandAllowlist: resource.aiCommandAllowlist.length > 0
395
+ ? resource.aiCommandAllowlist.join(" | ")
396
+ : "(none)",
397
+ allowlistMatching: RESOURCE_ALLOWLIST_SUMMARY,
398
+ });
399
+ }
400
+ if (rows.length === 0 && this.isResourceRound()) {
401
+ return {
402
+ success: true,
403
+ textForLlm: "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.",
404
+ result: {
405
+ dataForLlm: "(no command targets available)",
406
+ rowCount: 0,
407
+ citationLabel: "Available command targets",
408
+ redactionCount: 0,
409
+ isTruncated: false,
410
+ },
411
+ };
412
+ }
315
413
  if (rows.length === 0) {
316
414
  return {
317
415
  success: true,
@@ -357,6 +455,92 @@ export default class RemediationCommandToolkit {
357
455
  }
358
456
  return "RequireApproval: every kubectl change is proposed for one-click approval";
359
457
  }
458
+ /*
459
+ * describeClusterModeForLlm for a resource: the canonical
460
+ * ResourceAiRemediationMode semantics in one field of at most the
461
+ * serializer's 500 characters.
462
+ */
463
+ describeResourceModeForLlm(resource) {
464
+ if (resource.aiRemediationMode === ResourceAiRemediationMode.BypassApproval) {
465
+ return `BypassApproval: AI does not ask — every change the policy allows, safeChanges AND riskierChanges, runs without a human, except alwaysNeedsAHuman${this.options.proposesRefusedCommands
466
+ ? " (submit such a change anyway: it is refused, recorded, and proposed for one-click approval when this round ends if no other change ran)"
467
+ : ""}; and ${RESOURCE_UNATTENDED_ROUND_BECOMES_PROPOSAL_SUMMARY}`;
468
+ }
469
+ if (resource.aiRemediationMode === ResourceAiRemediationMode.Automatic) {
470
+ return `Automatic: safeChanges run without a human; riskierChanges never run inline unless the commandAllowlist names their exact shape, and alwaysNeedsAHuman never does — ${this.options.proposesRefusedCommands
471
+ ? "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"
472
+ : "put it in your written recommendations for a human"}; and ${RESOURCE_UNATTENDED_ROUND_BECOMES_PROPOSAL_SUMMARY}`;
473
+ }
474
+ return "RequireApproval: every change is proposed for one-click approval";
475
+ }
476
+ /*
477
+ * Where the resource's AI agent lets AI-composed writes land, as it last
478
+ * reported (its posture): read-only unless ONEUPTIME_AI_ALLOW_WRITES is
479
+ * true, never its protected targets, and — with ONEUPTIME_AI_WRITE_TARGETS
480
+ * set — only the targets its globs name.
481
+ */
482
+ static describeResourceWriteScope(resource) {
483
+ var _a;
484
+ const posture = (_a = resource.agent) === null || _a === void 0 ? void 0 : _a.posture;
485
+ if (!posture) {
486
+ return "not reported by the agent yet, so it runs no change";
487
+ }
488
+ if (posture.allowWrites !== true) {
489
+ return `read-only (${RESOURCE_AI_ALLOW_WRITES_ENV} is not true on the agent): it refuses every change`;
490
+ }
491
+ const parts = [
492
+ posture.writeTargets.length > 0
493
+ ? `changes only targets matching ${RESOURCE_AI_WRITE_TARGETS_ENV}=${posture.writeTargets.join(",")} — name each target exactly`
494
+ : "changes any target its command policy allows",
495
+ ];
496
+ if (posture.protectedTargets.length > 0) {
497
+ parts.push(`never its protected targets (${posture.protectedTargets
498
+ .slice(0, 10)
499
+ .join(", ")}): itself and what it runs in`);
500
+ }
501
+ return parts.join("; ");
502
+ }
503
+ /*
504
+ * Why the resource's AI agent would refuse this write, going by the
505
+ * posture it reported — or null when it would not. The rule is the
506
+ * agent's own (ResourceCommandPolicy.getWriteScopeRefusal: read-only
507
+ * unless ONEUPTIME_AI_ALLOW_WRITES is true, never a protected target,
508
+ * only the ONEUPTIME_AI_WRITE_TARGETS globs when set), the one the enqueue
509
+ * chokepoint asks too. Reads and Denied commands are not this rule's
510
+ * business (the policy refuses the latter on its own).
511
+ */
512
+ static getResourceWriteScopeRefusal(data) {
513
+ var _a;
514
+ if (!isAiResourceType(data.resource.resourceType)) {
515
+ return "The resource type is unknown, so no change can run on it.";
516
+ }
517
+ const policy = ResourceCommandPolicy.evaluateCommand({
518
+ resourceType: data.resource.resourceType,
519
+ command: data.command,
520
+ });
521
+ if (policy.tier === ResourceCommandTier.Read ||
522
+ policy.tier === ResourceCommandTier.Denied) {
523
+ return null;
524
+ }
525
+ const posture = (_a = data.resource.agent) === null || _a === void 0 ? void 0 : _a.posture;
526
+ return ResourceCommandPolicy.getWriteScopeRefusal({
527
+ result: policy,
528
+ allowWrites: (posture === null || posture === void 0 ? void 0 : posture.allowWrites) === true,
529
+ writeTargets: (posture === null || posture === void 0 ? void 0 : posture.writeTargets) || [],
530
+ protectedTargets: (posture === null || posture === void 0 ? void 0 : posture.protectedTargets) || [],
531
+ resourceType: data.resource.resourceType,
532
+ });
533
+ }
534
+ /*
535
+ * What to do about a resource write-scope refusal, for the approve route
536
+ * and the model: the agent's own environment decides.
537
+ */
538
+ static getResourceScopeRefusalNextStep(resourceType) {
539
+ const agentName = isAiResourceType(resourceType)
540
+ ? AI_RESOURCE_TYPE_INFO[resourceType].agentDisplayName
541
+ : "resource's AI agent";
542
+ 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.`;
543
+ }
360
544
  /*
361
545
  * Which kubectl changes the model may be offered on this cluster. A
362
546
  * Runner that reported node operations off refuses every one, approved
@@ -605,6 +789,28 @@ export default class RemediationCommandToolkit {
605
789
  * ------------------------------------------------------------------
606
790
  */
607
791
  buildExecuteTool() {
792
+ if (this.isResourceRound()) {
793
+ return {
794
+ definition: {
795
+ name: "execute_remediation_command",
796
+ description: this.describeResourceExecuteTool(),
797
+ inputSchema: {
798
+ type: "object",
799
+ properties: this.buildCommandSchemaProperties(),
800
+ required: [
801
+ "stepType",
802
+ "resourceId",
803
+ "command",
804
+ "rationale",
805
+ "expectedEffect",
806
+ ],
807
+ },
808
+ },
809
+ execute: async (args) => {
810
+ return this.executeCommand(args);
811
+ },
812
+ };
813
+ }
608
814
  return {
609
815
  definition: {
610
816
  name: "execute_remediation_command",
@@ -622,7 +828,80 @@ export default class RemediationCommandToolkit {
622
828
  },
623
829
  };
624
830
  }
831
+ /*
832
+ * What each resource this round may change accepts, by tier — its tool
833
+ * policy's own guide, once per policy.
834
+ */
835
+ describeResourceWriteGuides() {
836
+ const sections = [];
837
+ const seenPolicies = new Set();
838
+ for (const type of ALL_AI_RESOURCE_TYPES) {
839
+ const resources = (this.options.resourceTargets || []).filter((resource) => {
840
+ return resource.resourceType === type;
841
+ });
842
+ if (resources.length === 0) {
843
+ continue;
844
+ }
845
+ const policyName = ResourceCommandPolicy.getToolPolicy(type).name;
846
+ if (seenPolicies.has(policyName)) {
847
+ continue;
848
+ }
849
+ seenPolicies.add(policyName);
850
+ sections.push(`${resources
851
+ .map((resource) => {
852
+ return `${AI_RESOURCE_TYPE_INFO[type].displayName} "${resource.resourceName}" (resourceId: ${resource.resourceId})`;
853
+ })
854
+ .join(", ")} — changes it accepts:\n${ResourceCommandPolicy.getWriteCommandGuide(type)}`);
855
+ }
856
+ return sections.join("\n\n");
857
+ }
858
+ // execute_remediation_command's description on a resource round.
859
+ describeResourceExecuteTool() {
860
+ 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 — ${this.options.proposesRefusedCommands
861
+ ? "a refused riskier change is recorded and proposed for one-click approval when this round ends, provided no other change ran"
862
+ : "put those in your recommendations"}. 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()}`;
863
+ }
864
+ /*
865
+ * The command schema of a resource round: ResourceCommand only, on the
866
+ * round's resource — never a Runner, a cluster or a credential.
867
+ */
868
+ buildResourceCommandSchemaProperties() {
869
+ return {
870
+ resourceId: {
871
+ type: "string",
872
+ description: "The resource to change: its resourceId from list_command_targets.",
873
+ },
874
+ stepType: {
875
+ type: "string",
876
+ enum: ["ResourceCommand"],
877
+ description: "ResourceCommand runs ONE command on the resource through its own AI agent.",
878
+ },
879
+ command: {
880
+ type: "string",
881
+ description: '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.',
882
+ },
883
+ timeoutInMs: {
884
+ type: "number",
885
+ description: `Execution timeout in milliseconds (default ${Math.min(DEFAULT_COMMAND_TIMEOUT_MS, MAX_RESOURCE_COMMAND_TIMEOUT_MS)}, max ${MAX_RESOURCE_COMMAND_TIMEOUT_MS}).`,
886
+ },
887
+ rationale: {
888
+ type: "string",
889
+ description: "Why this command remediates the incident — shown to humans verbatim.",
890
+ },
891
+ expectedEffect: {
892
+ type: "string",
893
+ description: "What you expect to observe if it works.",
894
+ },
895
+ rollbackCommand: {
896
+ type: "string",
897
+ description: "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>.",
898
+ },
899
+ };
900
+ }
625
901
  buildCommandSchemaProperties() {
902
+ if (this.isResourceRound()) {
903
+ return this.buildResourceCommandSchemaProperties();
904
+ }
626
905
  return {
627
906
  runnerId: {
628
907
  type: "string",
@@ -714,6 +993,35 @@ export default class RemediationCommandToolkit {
714
993
  return this.failure(scopeRefusal);
715
994
  }
716
995
  }
996
+ if (command.stepType === RunbookStepType.ResourceCommand) {
997
+ /*
998
+ * Reads belong to run_infrastructure_command, for the reason they
999
+ * belong to run_kubectl on a cluster: sent here, a read would count
1000
+ * as an executed fix, take a breaker slot and could auto-resolve the
1001
+ * signal in the name of a change that changed nothing.
1002
+ */
1003
+ if (command.resourceCommandTier === ResourceCommandTier.Read) {
1004
+ return this.failure(`"${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.`);
1005
+ }
1006
+ // The resource as its AI page stands NOW, as for a cluster.
1007
+ const liveRefusal = await this.refreshResourceTarget(command);
1008
+ if (liveRefusal) {
1009
+ this.recordNeedingApproval(command, liveRefusal);
1010
+ return this.failure(liveRefusal.text);
1011
+ }
1012
+ /*
1013
+ * The agent's write scope as it reports it NOW: a write it would
1014
+ * refuse is never enqueued — nor kept for a proposal, which no click
1015
+ * could make runnable.
1016
+ */
1017
+ const liveResource = this.findResourceTarget(command.resourceType, command.resourceId);
1018
+ const scopeRefusal = liveResource
1019
+ ? this.getResourceCommandScopeRefusal(liveResource, command)
1020
+ : null;
1021
+ if (scopeRefusal) {
1022
+ return this.failure(scopeRefusal);
1023
+ }
1024
+ }
717
1025
  /*
718
1026
  * FullAuto gate: the full policy. Anything that is not AutoApproved is
719
1027
  * refused here; the model is told why so it can pick an allowlisted
@@ -725,17 +1033,44 @@ export default class RemediationCommandToolkit {
725
1033
  return this.failure(gateFailure.text);
726
1034
  }
727
1035
  command.policyVerdict = AiRemediationCommandPolicyVerdict.AutoApproved;
728
- // Project-wide hourly storm brake across all AI command jobs.
729
- const jobsInLastHour = (await RunnerJobService.countBy({
730
- query: {
731
- projectId: this.options.projectId,
732
- origin: RunnerJobOrigin.AiRemediation,
733
- createdAt: QueryHelper.greaterThan(OneUptimeDate.getSomeHoursAgo(1)),
734
- },
735
- props: { isRoot: true },
736
- })).toNumber();
737
- if (jobsInLastHour >= MAX_AI_COMMAND_JOBS_PER_PROJECT_PER_HOUR) {
738
- return this.failure(`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.`);
1036
+ if (command.stepType === RunbookStepType.ResourceCommand) {
1037
+ /*
1038
+ * The resource lane's own hourly brake, counted the way the enqueue
1039
+ * chokepoint counts it (ResourceCommand rows only): pre-checked here
1040
+ * so the model gets a useful refusal instead of a thrown one.
1041
+ */
1042
+ const resourceJobsInLastHour = (await RunnerJobService.countBy({
1043
+ query: {
1044
+ projectId: this.options.projectId,
1045
+ origin: RunnerJobOrigin.AiRemediation,
1046
+ stepType: RunbookStepType.ResourceCommand,
1047
+ createdAt: QueryHelper.greaterThan(OneUptimeDate.getSomeHoursAgo(1)),
1048
+ },
1049
+ props: { isRoot: true },
1050
+ })).toNumber();
1051
+ if (resourceJobsInLastHour >=
1052
+ MAX_AI_RESOURCE_COMMAND_JOBS_PER_PROJECT_PER_HOUR) {
1053
+ return this.failure(`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.`);
1054
+ }
1055
+ }
1056
+ else {
1057
+ /*
1058
+ * Project-wide hourly storm brake across the kubectl and Runner AI
1059
+ * command jobs, counted the way the enqueue chokepoints count it:
1060
+ * resource commands have their own brake above and never count here.
1061
+ */
1062
+ const jobsInLastHour = (await RunnerJobService.countBy({
1063
+ query: {
1064
+ projectId: this.options.projectId,
1065
+ origin: RunnerJobOrigin.AiRemediation,
1066
+ stepType: QueryHelper.notEquals(RunbookStepType.ResourceCommand),
1067
+ createdAt: QueryHelper.greaterThan(OneUptimeDate.getSomeHoursAgo(1)),
1068
+ },
1069
+ props: { isRoot: true },
1070
+ })).toNumber();
1071
+ if (jobsInLastHour >= MAX_AI_COMMAND_JOBS_PER_PROJECT_PER_HOUR) {
1072
+ return this.failure(`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.`);
1073
+ }
739
1074
  }
740
1075
  /*
741
1076
  * The first change this run makes on a cluster takes one of the
@@ -753,6 +1088,16 @@ export default class RemediationCommandToolkit {
753
1088
  }
754
1089
  clusterSlotLock = reservation.mutex;
755
1090
  }
1091
+ // The same for the run's first change on a resource.
1092
+ if (command.stepType === RunbookStepType.ResourceCommand &&
1093
+ !this.hasChangedResource(command.resourceType, command.resourceId)) {
1094
+ const reservation = await this.reserveResourceSlot(command);
1095
+ if (reservation.refusal) {
1096
+ this.recordNeedingApproval(command, reservation.refusal);
1097
+ return this.failure(reservation.refusal.text);
1098
+ }
1099
+ clusterSlotLock = reservation.mutex;
1100
+ }
756
1101
  const releaseClusterSlotLock = async () => {
757
1102
  if (!clusterSlotLock) {
758
1103
  return;
@@ -773,7 +1118,7 @@ export default class RemediationCommandToolkit {
773
1118
  * the job exists (and its id is on the record) — before the wait.
774
1119
  */
775
1120
  async recordAndRun(command, afterEnqueue) {
776
- var _a, _b, _c, _d, _e;
1121
+ var _a, _b, _c, _d, _e, _f, _g, _h;
777
1122
  command.wasAutoExecuted = true;
778
1123
  command.execution = {
779
1124
  status: AiRemediationCommandExecutionStatus.Pending,
@@ -808,6 +1153,8 @@ export default class RemediationCommandToolkit {
808
1153
  * whose wait broke): it may have run. Its citation says so.
809
1154
  */
810
1155
  let kubectlResultUnknown = false;
1156
+ // The same for a resource command the agent took with no result back.
1157
+ let resourceResultUnknown = false;
811
1158
  try {
812
1159
  if (command.stepType === RunbookStepType.Kubectl) {
813
1160
  /*
@@ -910,6 +1257,93 @@ export default class RemediationCommandToolkit {
910
1257
  outcomeText = KubectlJobRunner.describeForLlm(outcome);
911
1258
  }
912
1259
  }
1260
+ else if (command.stepType === RunbookStepType.ResourceCommand) {
1261
+ /*
1262
+ * The kubectl lane's shape for a resource: enqueue through the
1263
+ * resource chokepoint (which re-runs the policy, the binding, the
1264
+ * switch and the agent's write scope), name the job on the record
1265
+ * BEFORE the wait, release the breaker slot, wait, and read the
1266
+ * finished job exactly as the investigation lane reads it
1267
+ * (ResourceCommandJobRunner: run state, redaction, access failure).
1268
+ */
1269
+ const resourceType = command.resourceType;
1270
+ const resourceId = new ObjectID(command.resourceId);
1271
+ const job = await RunnerJobService.enqueueAiResourceCommand({
1272
+ projectId: this.options.projectId,
1273
+ aiRunId: this.options.aiRunId,
1274
+ origin: RunnerJobOrigin.AiRemediation,
1275
+ autoRemediationSuggestionId: this.options.suggestionId,
1276
+ resourceType,
1277
+ resourceId,
1278
+ stepId: `${INLINE_COMMAND_STEP_ID_PREFIX}${command.sequence}`,
1279
+ targetResourceAiAgentId: new ObjectID(command.runnerId),
1280
+ command: command.command,
1281
+ timeoutInMs: command.timeoutInMs,
1282
+ claimTimeoutInMs: RESOURCE_COMMAND_CLAIM_TIMEOUT_MS,
1283
+ });
1284
+ command.execution.runnerJobId = (_d = job.id) === null || _d === void 0 ? void 0 : _d.toString();
1285
+ await this.persistPlanProgress();
1286
+ // The job row is the breaker reservation: the next holder counts it.
1287
+ await afterEnqueue();
1288
+ const terminalJob = await this.waitForJobWithHeartbeat({
1289
+ jobId: job.id,
1290
+ claimTimeoutInMs: RESOURCE_COMMAND_CLAIM_TIMEOUT_MS,
1291
+ executionTimeoutInMs: command.timeoutInMs,
1292
+ });
1293
+ const outcome = await ResourceCommandJobRunner.readFinishedJob({
1294
+ job,
1295
+ terminalJob,
1296
+ command: command.command,
1297
+ resourceType,
1298
+ claimTimeoutInMs: RESOURCE_COMMAND_CLAIM_TIMEOUT_MS,
1299
+ executionTimeoutInMs: command.timeoutInMs,
1300
+ });
1301
+ await ResourceCommandJobRunner.recordOutcomeOnResource({
1302
+ resourceType,
1303
+ resourceId,
1304
+ outcome,
1305
+ });
1306
+ // Certainly never ran: a failed tool call, off the record.
1307
+ if (outcome.runState === ResourceCommandRunState.NotRun) {
1308
+ return await this.settleNeverRan(command, {
1309
+ displayCommand: outcome.displayCommand,
1310
+ errorMessage: outcome.errorMessage,
1311
+ claimTimedOut: outcome.claimTimedOut === true,
1312
+ });
1313
+ }
1314
+ command.execution.status = outcome.succeeded
1315
+ ? AiRemediationCommandExecutionStatus.Succeeded
1316
+ : AiRemediationCommandExecutionStatus.Failed;
1317
+ command.execution.completedAt =
1318
+ OneUptimeDate.getCurrentDate().toISOString();
1319
+ command.execution.exitCode = outcome.exitCode;
1320
+ command.execution.output = outcome.output;
1321
+ redactionCount = (_e = outcome.redactionCount) !== null && _e !== void 0 ? _e : 0;
1322
+ isTruncated = (_f = outcome.isTruncated) !== null && _f !== void 0 ? _f : false;
1323
+ if (!outcome.succeeded) {
1324
+ command.execution.errorMessage = outcome.errorMessage;
1325
+ }
1326
+ if (outcome.runState === ResourceCommandRunState.Unknown) {
1327
+ resourceResultUnknown = true;
1328
+ outcomeText = this.describeResultUnknown(command, {
1329
+ displayCommand: outcome.displayCommand,
1330
+ reason: outcome.errorMessage,
1331
+ });
1332
+ }
1333
+ else if (!outcome.succeeded && typeof outcome.exitCode !== "number") {
1334
+ // The program ran but was stopped before it finished.
1335
+ outcomeText = `${ResourceCommandJobRunner.describeForLlm({
1336
+ outcome,
1337
+ resourceType,
1338
+ })}\n${RESOURCE_UNFINISHED_CHECK_FIRST}`;
1339
+ }
1340
+ else {
1341
+ outcomeText = ResourceCommandJobRunner.describeForLlm({
1342
+ outcome,
1343
+ resourceType,
1344
+ });
1345
+ }
1346
+ }
913
1347
  else {
914
1348
  const job = await RunnerJobService.enqueueAiCommand({
915
1349
  projectId: this.options.projectId,
@@ -924,7 +1358,7 @@ export default class RemediationCommandToolkit {
924
1358
  claimTimeoutInMs: AI_COMMAND_CLAIM_TIMEOUT_MS,
925
1359
  });
926
1360
  // Same rule as the kubectl lane: the job id lands before the wait.
927
- command.execution.runnerJobId = (_d = job.id) === null || _d === void 0 ? void 0 : _d.toString();
1361
+ command.execution.runnerJobId = (_g = job.id) === null || _g === void 0 ? void 0 : _g.toString();
928
1362
  await this.persistPlanProgress();
929
1363
  const terminalJob = await this.waitForJobWithHeartbeat({
930
1364
  jobId: job.id,
@@ -948,7 +1382,7 @@ export default class RemediationCommandToolkit {
948
1382
  `Command ended with status ${terminalJob.status}.`;
949
1383
  }
950
1384
  outcomeText = [
951
- `Command ${succeeded ? "SUCCEEDED" : "FAILED"} (exit code: ${(_e = terminalJob.exitCode) !== null && _e !== void 0 ? _e : "n/a"}${succeeded ? "" : `, error: ${command.execution.errorMessage}`}).`,
1385
+ `Command ${succeeded ? "SUCCEEDED" : "FAILED"} (exit code: ${(_h = terminalJob.exitCode) !== null && _h !== void 0 ? _h : "n/a"}${succeeded ? "" : `, error: ${command.execution.errorMessage}`}).`,
952
1386
  `<tool_result source="untrusted_command_output">`,
953
1387
  command.execution.output || "(no output)",
954
1388
  `</tool_result>`,
@@ -972,6 +1406,19 @@ export default class RemediationCommandToolkit {
972
1406
  claimTimedOut: false,
973
1407
  });
974
1408
  }
1409
+ /*
1410
+ * The resource chokepoint refused the command (its policy, binding,
1411
+ * switch, brake and write-scope checks run before the row is
1412
+ * written): no job exists, so it certainly never ran.
1413
+ */
1414
+ if (command.stepType === RunbookStepType.ResourceCommand &&
1415
+ !command.execution.runnerJobId) {
1416
+ return await this.settleNeverRan(command, {
1417
+ displayCommand: command.command,
1418
+ errorMessage: this.redactResourceText(command, message),
1419
+ claimTimedOut: false,
1420
+ });
1421
+ }
975
1422
  command.execution.status = AiRemediationCommandExecutionStatus.Failed;
976
1423
  command.execution.completedAt =
977
1424
  OneUptimeDate.getCurrentDate().toISOString();
@@ -988,6 +1435,15 @@ export default class RemediationCommandToolkit {
988
1435
  reason: `Waiting for its result failed: ${message}`,
989
1436
  });
990
1437
  }
1438
+ else if (command.stepType === RunbookStepType.ResourceCommand) {
1439
+ // The same for a resource's agent.
1440
+ command.execution.errorMessage = this.redactResourceText(command, message);
1441
+ resourceResultUnknown = true;
1442
+ outcomeText = this.describeResultUnknown(command, {
1443
+ displayCommand: command.command,
1444
+ reason: `Waiting for its result failed: ${message}`,
1445
+ });
1446
+ }
991
1447
  else {
992
1448
  outcomeText = `Command FAILED before completion: ${message}`;
993
1449
  }
@@ -1003,12 +1459,34 @@ export default class RemediationCommandToolkit {
1003
1459
  ? kubectlResultUnknown
1004
1460
  ? `Sent to cluster "${command.kubernetesClusterNameSnapshot}", result unknown: ${this.summarizeCommand(command.command)}`
1005
1461
  : `Executed on cluster "${command.kubernetesClusterNameSnapshot}": ${this.summarizeCommand(command.command)}`
1006
- : `Executed on Runner "${command.runnerNameSnapshot}": ${this.summarizeCommand(command.command)}`,
1462
+ : command.stepType === RunbookStepType.ResourceCommand
1463
+ ? resourceResultUnknown
1464
+ ? `Sent to ${this.describeCommandResource(command)}, result unknown: ${this.summarizeCommand(command.command)}`
1465
+ : `Executed on ${this.describeCommandResource(command)}: ${this.summarizeCommand(command.command)}`
1466
+ : `Executed on Runner "${command.runnerNameSnapshot}": ${this.summarizeCommand(command.command)}`,
1007
1467
  redactionCount,
1008
1468
  isTruncated,
1009
1469
  },
1010
1470
  };
1011
1471
  }
1472
+ // 'Docker host "web-1"' for a ResourceCommand step, from its snapshot.
1473
+ describeCommandResource(command) {
1474
+ const info = isAiResourceType(command.resourceType)
1475
+ ? AI_RESOURCE_TYPE_INFO[command.resourceType]
1476
+ : null;
1477
+ return `${info ? info.displayName : "resource"} "${command.resourceNameSnapshot || command.resourceId || "(unknown)"}"`;
1478
+ }
1479
+ // A resource program's text, through the resource redaction.
1480
+ redactResourceText(command, text) {
1481
+ if (!isAiResourceType(command.resourceType)) {
1482
+ return ToolResultSerializer.redact(text).text;
1483
+ }
1484
+ return ResourceCommandJobRunner.redactAndCap({
1485
+ output: text,
1486
+ resourceType: command.resourceType,
1487
+ program: command.command.trim().split(/\s+/)[0] || "",
1488
+ }).text;
1489
+ }
1012
1490
  /*
1013
1491
  * A kubectl command whose job certainly never reached kubectl (no Runner
1014
1492
  * claimed it, the server or the Runner refused it, kubectl could not
@@ -1022,6 +1500,15 @@ export default class RemediationCommandToolkit {
1022
1500
  });
1023
1501
  this.neverRanCount += 1;
1024
1502
  await this.persistPlanProgress();
1503
+ if (command.stepType === RunbookStepType.ResourceCommand) {
1504
+ const label = this.describeCommandResource(command);
1505
+ const noun = isAiResourceType(command.resourceType)
1506
+ ? describeResourceNoun(command.resourceType)
1507
+ : "resource";
1508
+ return this.failure(`"${data.displayCommand}" did NOT run on ${label}: ${data.errorMessage || "the job never reached the resource's AI agent."} Nothing changed on the ${noun} and nothing was recorded as executed. ${data.claimTimedOut
1509
+ ? `Do NOT send more commands to this ${noun} in this run — its AI agent is not picking them up; say so in your analysis.`
1510
+ : "Do NOT resend the same command; fix what the refusal names, or put the change in your recommendations for a human."}`);
1511
+ }
1025
1512
  return this.failure(`"${data.displayCommand}" did NOT run on cluster "${command.kubernetesClusterNameSnapshot || command.kubernetesClusterId}": ${data.errorMessage || "the job never reached kubectl."} Nothing changed on the cluster and nothing was recorded as executed. ${data.claimTimedOut
1026
1513
  ? "Do NOT send more commands to this cluster in this run — its Runner is not picking them up; say so in your analysis."
1027
1514
  : "Do NOT resend the same command; fix what the refusal names, or put the change in your recommendations for a human."}`);
@@ -1033,6 +1520,22 @@ export default class RemediationCommandToolkit {
1033
1520
  * model checks with a read before it reissues it or builds on it.
1034
1521
  */
1035
1522
  describeResultUnknown(command, data) {
1523
+ if (command.stepType === RunbookStepType.ResourceCommand) {
1524
+ const resourceReason = this.redactResourceText(command, (data.reason || "No result came back for this command.").trim()).trim();
1525
+ const noun = isAiResourceType(command.resourceType)
1526
+ ? describeResourceNoun(command.resourceType)
1527
+ : "resource";
1528
+ return [
1529
+ `${data.displayCommand}`,
1530
+ `RESULT UNKNOWN on ${this.describeCommandResource(command)}: ${SENTENCE_END_PATTERN.test(resourceReason)
1531
+ ? resourceReason
1532
+ : `${resourceReason}.`}`,
1533
+ `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${command.rollbackCommand
1534
+ ? "; if the service does not recover, its rollbackCommand is not run blind — a human is asked to check and undo it"
1535
+ : ""}.`,
1536
+ `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.`,
1537
+ ].join("\n");
1538
+ }
1036
1539
  const reason = KubectlOutputRedactor.redact((data.reason || "No result came back for this command.").trim()).text;
1037
1540
  return [
1038
1541
  `${data.displayCommand}`,
@@ -1071,6 +1574,30 @@ export default class RemediationCommandToolkit {
1071
1574
  }
1072
1575
  return null;
1073
1576
  }
1577
+ /*
1578
+ * getCommandScopeRefusal for a resource: whether its AI agent would
1579
+ * refuse this command or its rollback (getResourceWriteScopeRefusal),
1580
+ * worded for the model.
1581
+ */
1582
+ getResourceCommandScopeRefusal(resource, command) {
1583
+ const forward = RemediationCommandToolkit.getResourceWriteScopeRefusal({
1584
+ resource,
1585
+ command: command.command,
1586
+ });
1587
+ if (forward) {
1588
+ return `${forward} The command was neither run nor recorded.`;
1589
+ }
1590
+ if (command.rollbackCommand) {
1591
+ const rollback = RemediationCommandToolkit.getResourceWriteScopeRefusal({
1592
+ resource,
1593
+ command: command.rollbackCommand,
1594
+ });
1595
+ if (rollback) {
1596
+ 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.`;
1597
+ }
1598
+ }
1599
+ return null;
1600
+ }
1074
1601
  /*
1075
1602
  * Null when the command may auto-execute in FullAuto; otherwise why not.
1076
1603
  * Bash/SSH: denylist, structural guard and the rule allowlist, for the
@@ -1134,6 +1661,9 @@ export default class RemediationCommandToolkit {
1134
1661
  }
1135
1662
  return null;
1136
1663
  }
1664
+ if (command.stepType === RunbookStepType.ResourceCommand) {
1665
+ return this.getResourceFullAutoRefusal(command);
1666
+ }
1137
1667
  const policy = CommandPolicy.evaluateCommand({
1138
1668
  command: command.command,
1139
1669
  allowlistPatterns: this.options.allowlistPatterns,
@@ -1213,6 +1743,92 @@ export default class RemediationCommandToolkit {
1213
1743
  ? "It is recorded for a human: if you run no other change in this round, OneUptime AI proposes it for one-click approval when the round ends. Also put it in your final recommendations."
1214
1744
  : "Include this action in your final recommendations for a human.";
1215
1745
  }
1746
+ /*
1747
+ * The FullAuto gate for a resource command — the kubectl branch of
1748
+ * getFullAutoRefusal, on the resource command policy: the resource's
1749
+ * (live) mode must run unattended, the ladder
1750
+ * (ResourceCommandPolicy.evaluateForAutoExecution with the resource's
1751
+ * allowlist, bypass = BypassApproval) must auto-approve the command, and
1752
+ * its rollback — which runs unattended — must auto-approve too. A refusal
1753
+ * a human's click would lift carries an approvalReason.
1754
+ */
1755
+ getResourceFullAutoRefusal(command) {
1756
+ const resource = this.findResourceTarget(command.resourceType, command.resourceId);
1757
+ if (!resource) {
1758
+ return {
1759
+ text: "The resource is no longer a valid target. Use list_command_targets.",
1760
+ };
1761
+ }
1762
+ const label = describeResourceLabel(resource);
1763
+ if (!isUnattendedResourceRemediationMode(resource.aiRemediationMode)) {
1764
+ return {
1765
+ text: `${label.charAt(0).toUpperCase()}${label.slice(1)} requires human approval for every change, so nothing can execute inline in this run. ${this.describeWhereRefusedChangesGo()}`,
1766
+ approvalReason: `${label} asks for approval of every change`,
1767
+ };
1768
+ }
1769
+ const bypassApproval = resource.aiRemediationMode === ResourceAiRemediationMode.BypassApproval;
1770
+ const verdict = ResourceCommandPolicy.evaluateForAutoExecution({
1771
+ resourceType: resource.resourceType,
1772
+ command: command.command,
1773
+ allowlistPatterns: resource.aiCommandAllowlist,
1774
+ bypassApproval,
1775
+ });
1776
+ if (verdict.verdict !== AiRemediationCommandPolicyVerdict.AutoApproved) {
1777
+ if (verdict.verdict === AiRemediationCommandPolicyVerdict.Denied) {
1778
+ return {
1779
+ text: `${verdict.reason} The command was NOT executed.`,
1780
+ };
1781
+ }
1782
+ return this.describeResourceNeedsAHuman({
1783
+ resource,
1784
+ verdict,
1785
+ bypassApproval,
1786
+ });
1787
+ }
1788
+ if (command.rollbackCommand) {
1789
+ const rollbackVerdict = ResourceCommandPolicy.evaluateForAutoExecution({
1790
+ resourceType: resource.resourceType,
1791
+ command: command.rollbackCommand,
1792
+ allowlistPatterns: resource.aiCommandAllowlist,
1793
+ bypassApproval,
1794
+ });
1795
+ if (rollbackVerdict.verdict !==
1796
+ AiRemediationCommandPolicyVerdict.AutoApproved) {
1797
+ return {
1798
+ 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.`,
1799
+ };
1800
+ }
1801
+ }
1802
+ return null;
1803
+ }
1804
+ /*
1805
+ * describeNeedsAHuman for a resource: named for what actually holds the
1806
+ * change back — a change the policy says always needs a human (in every
1807
+ * mode, Bypass approval and the allowlist included), or a riskier change
1808
+ * on a resource that runs only safe changes on its own.
1809
+ */
1810
+ describeResourceNeedsAHuman(data) {
1811
+ const { resource, verdict } = data;
1812
+ const label = describeResourceLabel(resource);
1813
+ const whereItGoes = this.describeWhereRefusedChangesGo();
1814
+ if (verdict.requiresHuman === true) {
1815
+ return {
1816
+ text: `${verdict.reason} The command was NOT executed: this change always needs a human, in every mode — Bypass approval and the ${describeResourceNoun(resource.resourceType)}'s allowlist included. ${whereItGoes} Do NOT hunt for a worse substitute that would need a human just the same.`,
1817
+ approvalReason: `the command policy of ${label} says this change always needs a human, in every mode`,
1818
+ };
1819
+ }
1820
+ if (verdict.tier === ResourceCommandTier.RiskyWrite &&
1821
+ !data.bypassApproval) {
1822
+ return {
1823
+ 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.`,
1824
+ 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`,
1825
+ };
1826
+ }
1827
+ return {
1828
+ text: `${verdict.reason} The command was NOT executed. ${whereItGoes}`,
1829
+ approvalReason: `${label} does not allow it without a human: ${verdict.reason}`,
1830
+ };
1831
+ }
1216
1832
  /*
1217
1833
  * Keep a kubectl change refused only for want of a human's click, so a
1218
1834
  * cluster round that executes nothing can propose it when it settles.
@@ -1221,12 +1837,16 @@ export default class RemediationCommandToolkit {
1221
1837
  * once; at most a plan's worth is kept.
1222
1838
  */
1223
1839
  recordNeedingApproval(command, refusal) {
1840
+ // Kubectl changes on a cluster, and resource commands on a resource.
1224
1841
  if (!refusal.approvalReason ||
1225
- command.stepType !== RunbookStepType.Kubectl) {
1842
+ (command.stepType !== RunbookStepType.Kubectl &&
1843
+ command.stepType !== RunbookStepType.ResourceCommand)) {
1226
1844
  return;
1227
1845
  }
1228
1846
  const alreadyKept = this.commandsNeedingApproval.some((kept) => {
1229
1847
  return (kept.command.kubernetesClusterId === command.kubernetesClusterId &&
1848
+ getResourceKey(kept.command.resourceType, kept.command.resourceId) ===
1849
+ getResourceKey(command.resourceType, command.resourceId) &&
1230
1850
  kept.command.command === command.command);
1231
1851
  });
1232
1852
  if (alreadyKept ||
@@ -1426,6 +2046,216 @@ export default class RemediationCommandToolkit {
1426
2046
  return { mutex: null, refusal: couldNotCheck };
1427
2047
  }
1428
2048
  }
2049
+ /*
2050
+ * refreshClusterTarget for a resource: re-read the resource from its AI
2051
+ * page before every inline change. Refuses — and stops the run from
2052
+ * changing that resource again — when fixes were turned off or lost
2053
+ * readiness (project switches, the agent going offline or read-only
2054
+ * included: the status folds them in), when the resource is now reached
2055
+ * through another AI agent than the one this run's command names (the
2056
+ * agent was reset or replaced), or when the status cannot be read (fail
2057
+ * closed). Otherwise the snapshot is replaced with the live status, so the
2058
+ * verdict that follows uses the CURRENT mode and allowlist.
2059
+ */
2060
+ async refreshResourceTarget(command) {
2061
+ const key = getResourceKey(command.resourceType, command.resourceId);
2062
+ const label = describeResourceLabel({
2063
+ resourceType: command.resourceType,
2064
+ resourceName: command.resourceNameSnapshot || command.resourceId,
2065
+ });
2066
+ const noun = isAiResourceType(command.resourceType)
2067
+ ? describeResourceNoun(command.resourceType)
2068
+ : "resource";
2069
+ const stopText = `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.`;
2070
+ if (!isAiResourceType(command.resourceType) ||
2071
+ !command.resourceId ||
2072
+ !ObjectID.isValidUUID(command.resourceId)) {
2073
+ return {
2074
+ text: `The command names no valid resource. ${stopText}`,
2075
+ };
2076
+ }
2077
+ let status;
2078
+ try {
2079
+ status = await ResourceAiAccessService.getStatusForResource({
2080
+ projectId: this.options.projectId,
2081
+ resourceType: command.resourceType,
2082
+ resourceId: new ObjectID(command.resourceId),
2083
+ });
2084
+ }
2085
+ catch (error) {
2086
+ logger.error(`RemediationCommandToolkit: could not re-read the AI access of ${command.resourceType} ${command.resourceId} before an inline change; refusing it: ${error}`);
2087
+ return {
2088
+ text: `Could not confirm that ${label} still allows AI remediation. ${stopText}`,
2089
+ };
2090
+ }
2091
+ if (!status) {
2092
+ this.revokeResource(key);
2093
+ return {
2094
+ text: `${label.charAt(0).toUpperCase()}${label.slice(1)} no longer exists in this project. ${stopText}`,
2095
+ };
2096
+ }
2097
+ const liveLabel = describeResourceLabel(status);
2098
+ if (!status.isRemediationReady) {
2099
+ this.revokeResource(key);
2100
+ const gap = status.gaps.find((candidate) => {
2101
+ return candidate.blocksRemediation;
2102
+ });
2103
+ return {
2104
+ text: `${liveLabel.charAt(0).toUpperCase()}${liveLabel.slice(1)} no longer allows AI remediation${gap ? ` (${gap.title})` : ""} — its AI agent page changed during this run. ${stopText}`,
2105
+ };
2106
+ }
2107
+ if (!status.agent || status.agent.agentId !== command.runnerId) {
2108
+ this.revokeResource(key);
2109
+ return {
2110
+ 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}`,
2111
+ };
2112
+ }
2113
+ const snapshot = this.findResourceTarget(command.resourceType, command.resourceId);
2114
+ this.replaceResourceTarget(status);
2115
+ const round = this.options.resourceRoundNumber || 1;
2116
+ if (snapshot &&
2117
+ doesResourceModeRunRoundUnattended(snapshot.aiRemediationMode, round) &&
2118
+ !doesResourceModeRunRoundUnattended(status.aiRemediationMode, round)) {
2119
+ /*
2120
+ * On a follow-up round, Automatic is still an unattended mode — but
2121
+ * one that asks for every round after the first, so it stops this
2122
+ * round's unattended changes like a move to "ask for approval" does.
2123
+ */
2124
+ if (isUnattendedResourceRemediationMode(status.aiRemediationMode) &&
2125
+ round > 1) {
2126
+ return {
2127
+ 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}.`,
2128
+ approvalReason: `the AI remediation mode of ${liveLabel} was changed to Automatic during the round, which asks for approval after a signal's first round`,
2129
+ };
2130
+ }
2131
+ return {
2132
+ 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}.`,
2133
+ approvalReason: `the AI remediation mode of ${liveLabel} was changed to ask for approval during the round`,
2134
+ };
2135
+ }
2136
+ return null;
2137
+ }
2138
+ /*
2139
+ * revokeCluster for a resource: the rest of the run treats it as never
2140
+ * having been a target, and what was kept for its proposal is dropped.
2141
+ */
2142
+ revokeResource(key) {
2143
+ this.revokedResourceKeys.add(key);
2144
+ this.commandsNeedingApproval = this.commandsNeedingApproval.filter((kept) => {
2145
+ return (getResourceKey(kept.command.resourceType, kept.command.resourceId) !==
2146
+ key);
2147
+ });
2148
+ }
2149
+ replaceResourceTarget(status) {
2150
+ const key = getResourceKey(status.resourceType, status.resourceId);
2151
+ this.options.resourceTargets = (this.options.resourceTargets || []).map((resource) => {
2152
+ return getResourceKey(resource.resourceType, resource.resourceId) ===
2153
+ key
2154
+ ? status
2155
+ : resource;
2156
+ });
2157
+ }
2158
+ // Does this run already hold a slot on the resource (an inline job there)?
2159
+ hasChangedResource(resourceType, resourceId) {
2160
+ const key = getResourceKey(resourceType, resourceId);
2161
+ return this.executedCommands.some((executed) => {
2162
+ var _a;
2163
+ return (executed.stepType === RunbookStepType.ResourceCommand &&
2164
+ getResourceKey(executed.resourceType, executed.resourceId) === key &&
2165
+ Boolean((_a = executed.execution) === null || _a === void 0 ? void 0 : _a.runnerJobId));
2166
+ });
2167
+ }
2168
+ /*
2169
+ * reserveClusterSlot for a resource: one of the resource's hourly
2170
+ * unattended slots, taken under the per-resource breaker lock
2171
+ * (RESOURCE_BREAKER_LOCK_NAMESPACE, keyed by type and id, never a
2172
+ * cluster's key), which is returned HELD until this run's job row exists.
2173
+ * Under the same lock, no other AI run may hold the resource
2174
+ * (resourceHold). Fails closed.
2175
+ */
2176
+ async reserveResourceSlot(command) {
2177
+ const resourceType = command.resourceType;
2178
+ const resourceId = command.resourceId || "";
2179
+ const label = describeResourceLabel({
2180
+ resourceType,
2181
+ resourceName: command.resourceNameSnapshot || resourceId,
2182
+ });
2183
+ const noun = isAiResourceType(resourceType)
2184
+ ? describeResourceNoun(resourceType)
2185
+ : "resource";
2186
+ const couldNotCheck = {
2187
+ text: `Could not check the hourly limit on unattended AI fixes for ${label}, so the command was NOT executed. ${this.describeWhereRefusedChangesGo()}`,
2188
+ approvalReason: `the hourly limit on unattended AI fixes for ${label} could not be checked`,
2189
+ };
2190
+ if (!isAiResourceType(resourceType) || !resourceId) {
2191
+ return { mutex: null, refusal: couldNotCheck };
2192
+ }
2193
+ let mutex = null;
2194
+ try {
2195
+ mutex = await Semaphore.lock({
2196
+ key: getResourceBreakerLockKey(resourceType, resourceId),
2197
+ namespace: RESOURCE_BREAKER_LOCK_NAMESPACE,
2198
+ lockTimeout: CLUSTER_BREAKER_LOCK_TIMEOUT_MS,
2199
+ acquireTimeout: CLUSTER_BREAKER_LOCK_ACQUIRE_TIMEOUT_MS,
2200
+ });
2201
+ }
2202
+ catch (error) {
2203
+ logger.error(`RemediationCommandToolkit: could not take the circuit-breaker lock of ${resourceType} ${resourceId}; refusing the inline change: ${error}`);
2204
+ return { mutex: null, refusal: couldNotCheck };
2205
+ }
2206
+ try {
2207
+ const breaker = await AutoRemediationRuleEngineService.getResourceBreakerState({
2208
+ resourceType,
2209
+ resourceId,
2210
+ projectId: this.options.projectId,
2211
+ forRound: {
2212
+ suggestionId: this.options.suggestionId,
2213
+ createdAt: this.options.suggestionCreatedAt,
2214
+ },
2215
+ });
2216
+ if (!breaker.hasHeadroom) {
2217
+ await RemediationCommandToolkit.releaseLock(mutex);
2218
+ logger.warn(`RemediationCommandToolkit: ${resourceType} ${resourceId} hit its hourly circuit breaker (${breaker.autoExecutedInWindow} unattended AI fixes); refusing an inline change.`);
2219
+ return {
2220
+ mutex: null,
2221
+ refusal: {
2222
+ 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()}`,
2223
+ approvalReason: `the hourly circuit breaker for ${label} tripped (${breaker.autoExecutedInWindow} unattended AI fixes in the last hour)`,
2224
+ },
2225
+ };
2226
+ }
2227
+ if (this.options.resourceHold) {
2228
+ const hold = await AutoRemediationRuleEngineService.findRoundHoldingResource({
2229
+ projectId: this.options.projectId,
2230
+ resourceType,
2231
+ resourceId,
2232
+ forRound: {
2233
+ suggestionId: this.options.suggestionId,
2234
+ createdAt: this.options.suggestionCreatedAt,
2235
+ },
2236
+ anyOrder: this.options.resourceHold.anyOrder,
2237
+ subject: this.options.resourceHold.subject,
2238
+ });
2239
+ if (hold) {
2240
+ await RemediationCommandToolkit.releaseLock(mutex);
2241
+ logger.warn(`RemediationCommandToolkit: another AI run (${hold.suggestionId}) on ${resourceType} ${resourceId} ${hold.description}; refusing an inline change.`);
2242
+ return {
2243
+ mutex: null,
2244
+ refusal: {
2245
+ 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}.`,
2246
+ approvalReason: `another OneUptime AI run on ${label} ${hold.description}`,
2247
+ },
2248
+ };
2249
+ }
2250
+ }
2251
+ return { mutex };
2252
+ }
2253
+ catch (error) {
2254
+ await RemediationCommandToolkit.releaseLock(mutex);
2255
+ logger.error(`RemediationCommandToolkit: circuit-breaker or in-flight run check failed for ${resourceType} ${resourceId}; refusing the inline change: ${error}`);
2256
+ return { mutex: null, refusal: couldNotCheck };
2257
+ }
2258
+ }
1429
2259
  static async releaseLock(mutex) {
1430
2260
  try {
1431
2261
  await Semaphore.release(mutex);
@@ -1452,7 +2282,9 @@ export default class RemediationCommandToolkit {
1452
2282
  return {
1453
2283
  definition: {
1454
2284
  name: "propose_remediation_commands",
1455
- 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}.`,
2285
+ description: this.isResourceRound()
2286
+ ? `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()}`
2287
+ : `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}.`,
1456
2288
  inputSchema: {
1457
2289
  type: "object",
1458
2290
  properties: {
@@ -1462,12 +2294,15 @@ export default class RemediationCommandToolkit {
1462
2294
  items: {
1463
2295
  type: "object",
1464
2296
  properties: this.buildCommandSchemaProperties(),
1465
- required: [
1466
- "stepType",
1467
- "command",
1468
- "rationale",
1469
- "expectedEffect",
1470
- ],
2297
+ required: this.isResourceRound()
2298
+ ? [
2299
+ "stepType",
2300
+ "resourceId",
2301
+ "command",
2302
+ "rationale",
2303
+ "expectedEffect",
2304
+ ]
2305
+ : ["stepType", "command", "rationale", "expectedEffect"],
1471
2306
  },
1472
2307
  },
1473
2308
  },
@@ -1515,6 +2350,19 @@ export default class RemediationCommandToolkit {
1515
2350
  parsed.command.policyVerdict =
1516
2351
  AiRemediationCommandPolicyVerdict.RequiresApproval;
1517
2352
  }
2353
+ else if (parsed.command.stepType === RunbookStepType.ResourceCommand) {
2354
+ /*
2355
+ * The same for a resource command: a proposal runs only after a
2356
+ * click, so it is RequiresApproval whatever the resource's mode —
2357
+ * and a read is not a fix a human needs to approve.
2358
+ */
2359
+ if (parsed.command.resourceCommandTier === ResourceCommandTier.Read) {
2360
+ problems.push(`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.`);
2361
+ continue;
2362
+ }
2363
+ parsed.command.policyVerdict =
2364
+ AiRemediationCommandPolicyVerdict.RequiresApproval;
2365
+ }
1518
2366
  else {
1519
2367
  /*
1520
2368
  * Informational verdict for the approval card: AutoApproved
@@ -1564,9 +2412,31 @@ export default class RemediationCommandToolkit {
1564
2412
  async parseAndValidateCommand(args, sequence) {
1565
2413
  const stepTypeRaw = ToolArgs.getString(args, "stepType") || "";
1566
2414
  const stepType = stepTypeRaw;
1567
- if (!AI_COMMAND_STEP_TYPES.includes(stepType)) {
2415
+ /*
2416
+ * The step types this round offers — what its schema's stepType enum
2417
+ * lists: ResourceCommand on a resource round; Bash, SSH and Kubectl on
2418
+ * every other round, where ResourceCommand is as unknown as it always
2419
+ * was (so a Kubernetes or rule round's refusal keeps its words).
2420
+ */
2421
+ const offeredStepTypes = this.isResourceRound()
2422
+ ? [RunbookStepType.ResourceCommand]
2423
+ : AI_COMMAND_STEP_TYPES.filter((type) => {
2424
+ return type !== RunbookStepType.ResourceCommand;
2425
+ });
2426
+ if (!AI_COMMAND_STEP_TYPES.includes(stepType) ||
2427
+ (!this.isResourceRound() && stepType === RunbookStepType.ResourceCommand)) {
1568
2428
  return {
1569
- errorText: `stepType must be one of: ${AI_COMMAND_STEP_TYPES.join(", ")}.`,
2429
+ errorText: `stepType must be one of: ${offeredStepTypes.join(", ")}.`,
2430
+ };
2431
+ }
2432
+ /*
2433
+ * A resource round runs resource commands on its resource and nothing
2434
+ * else: it was given no Runner and no cluster.
2435
+ */
2436
+ if (this.isResourceRound() &&
2437
+ stepType !== RunbookStepType.ResourceCommand) {
2438
+ return {
2439
+ errorText: `This remediation round is about one infrastructure resource: use stepType ResourceCommand with its resourceId from list_command_targets. ${stepType} is not available here.`,
1570
2440
  };
1571
2441
  }
1572
2442
  const commandText = ToolArgs.getString(args, "command") || "";
@@ -1597,6 +2467,29 @@ export default class RemediationCommandToolkit {
1597
2467
  expectedEffect,
1598
2468
  });
1599
2469
  }
2470
+ /*
2471
+ * A resource command runs on the resource's own AI agent, never on a
2472
+ * Runner, so it must never fall through to the Bash/SSH path below.
2473
+ * Only a resource round (resourceTargets) offers it — any other round
2474
+ * refused it with the step types it offers, above; this is the belt
2475
+ * and braces.
2476
+ */
2477
+ if (stepType === RunbookStepType.ResourceCommand) {
2478
+ if (!this.isResourceRound()) {
2479
+ return {
2480
+ errorText: `stepType must be one of: ${offeredStepTypes.join(", ")}.`,
2481
+ };
2482
+ }
2483
+ return this.parseResourceCommand({
2484
+ args,
2485
+ sequence,
2486
+ commandText,
2487
+ rollbackCommand,
2488
+ timeoutInMs,
2489
+ rationale,
2490
+ expectedEffect,
2491
+ });
2492
+ }
1600
2493
  const denyReason = CommandPolicy.getDenyReason(commandText);
1601
2494
  if (denyReason) {
1602
2495
  return {
@@ -1786,6 +2679,117 @@ export default class RemediationCommandToolkit {
1786
2679
  return cluster.clusterId === clusterId;
1787
2680
  });
1788
2681
  }
2682
+ /*
2683
+ * ResourceCommand: the target is the round's resource, the AI agent is
2684
+ * whichever one its AI page reports online, and no credential ever
2685
+ * travels. The model only names a resource it was shown (by resourceId);
2686
+ * the tier the resource command policy gives the command is recorded for
2687
+ * the card, and a command, or a rollback, the agent's write scope would
2688
+ * refuse is never composed. Denied never is either.
2689
+ */
2690
+ parseResourceCommand(data) {
2691
+ const resourceIdRaw = ToolArgs.getString(data.args, "resourceId");
2692
+ const resource = resourceIdRaw
2693
+ ? this.getResourceTargets().find((candidate) => {
2694
+ return (candidate.resourceId.toLowerCase() === resourceIdRaw.toLowerCase());
2695
+ })
2696
+ : undefined;
2697
+ if (!resource || !resource.agent) {
2698
+ return {
2699
+ errorText: "resourceId is required for ResourceCommand and must be the resource from list_command_targets that allows AI remediation.",
2700
+ };
2701
+ }
2702
+ /*
2703
+ * A resource's agent is never given a credential by OneUptime: a step
2704
+ * that names one is refused, never silently stripped.
2705
+ */
2706
+ const credentialIdRaw = ToolArgs.getString(data.args, "credentialId");
2707
+ if (credentialIdRaw) {
2708
+ return {
2709
+ errorText: `A ResourceCommand never carries a credential: the ${AI_RESOURCE_TYPE_INFO[resource.resourceType].agentDisplayName} uses only the credentials in its own environment. Omit credentialId.`,
2710
+ };
2711
+ }
2712
+ const info = AI_RESOURCE_TYPE_INFO[resource.resourceType];
2713
+ const policy = ResourceCommandPolicy.evaluateCommand({
2714
+ resourceType: resource.resourceType,
2715
+ command: data.commandText,
2716
+ });
2717
+ if (policy.tier === ResourceCommandTier.Denied) {
2718
+ return {
2719
+ errorText: `Denied by the ${info.displayName} command policy: ${policy.reason}. This command can never run, even with human approval — take a different approach.`,
2720
+ };
2721
+ }
2722
+ let rollbackDisplay = undefined;
2723
+ if (data.rollbackCommand) {
2724
+ const rollbackPolicy = ResourceCommandPolicy.evaluateCommand({
2725
+ resourceType: resource.resourceType,
2726
+ command: data.rollbackCommand,
2727
+ });
2728
+ if (rollbackPolicy.tier === ResourceCommandTier.Denied) {
2729
+ return {
2730
+ errorText: `The rollbackCommand is denied by the ${info.displayName} command policy: ${rollbackPolicy.reason}. Provide a safe rollback or omit it.`,
2731
+ };
2732
+ }
2733
+ /*
2734
+ * A rollback runs unattended after verification fails: a change that
2735
+ * always needs a human can never be one, and a riskier one only on a
2736
+ * resource whose operator bypassed approvals.
2737
+ */
2738
+ if (rollbackPolicy.requiresHuman === true) {
2739
+ return {
2740
+ 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.`,
2741
+ };
2742
+ }
2743
+ if (rollbackPolicy.tier === ResourceCommandTier.RiskyWrite &&
2744
+ resource.aiRemediationMode !== ResourceAiRemediationMode.BypassApproval) {
2745
+ return {
2746
+ 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.`,
2747
+ };
2748
+ }
2749
+ rollbackDisplay = rollbackPolicy.displayCommand;
2750
+ }
2751
+ // A write the agent has said it will refuse is never composed.
2752
+ const scopeRefusal = this.getResourceCommandScopeRefusal(resource, {
2753
+ command: policy.displayCommand,
2754
+ rollbackCommand: rollbackDisplay,
2755
+ });
2756
+ if (scopeRefusal) {
2757
+ return { errorText: scopeRefusal };
2758
+ }
2759
+ return {
2760
+ command: {
2761
+ sequence: data.sequence,
2762
+ stepType: RunbookStepType.ResourceCommand,
2763
+ /*
2764
+ * The access target is the resource's AI agent (its row id and
2765
+ * display name), as a Kubectl step through the Kubernetes AI agent
2766
+ * names that agent.
2767
+ */
2768
+ runnerId: resource.agent.agentId,
2769
+ runnerNameSnapshot: info.agentDisplayName,
2770
+ resourceType: resource.resourceType,
2771
+ resourceId: resource.resourceId,
2772
+ resourceNameSnapshot: resource.resourceName,
2773
+ resourceCommandTier: policy.tier,
2774
+ // Stored in the canonical rendered form so the card shows exactly what runs.
2775
+ command: policy.displayCommand,
2776
+ timeoutInMs: Math.min(data.timeoutInMs, MAX_RESOURCE_COMMAND_TIMEOUT_MS),
2777
+ rationale: data.rationale,
2778
+ expectedEffect: data.expectedEffect,
2779
+ rollbackCommand: rollbackDisplay,
2780
+ policyVerdict: AiRemediationCommandPolicyVerdict.RequiresApproval,
2781
+ },
2782
+ };
2783
+ }
2784
+ findResourceTarget(resourceType, resourceId) {
2785
+ const key = getResourceKey(resourceType, resourceId);
2786
+ if (!key) {
2787
+ return undefined;
2788
+ }
2789
+ return this.getResourceTargets().find((resource) => {
2790
+ return (getResourceKey(resource.resourceType, resource.resourceId) === key);
2791
+ });
2792
+ }
1789
2793
  /*
1790
2794
  * Wait for the RunnerJob to reach a terminal state while keeping the
1791
2795
  * AIRun's heartbeat fresh — a command may legitimately take minutes, and