@oneuptime/common 14.0.8 → 14.0.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (976) hide show
  1. package/Models/DatabaseModels/AutoRemediationSuggestion.ts +60 -0
  2. package/Models/DatabaseModels/CephCluster.ts +213 -0
  3. package/Models/DatabaseModels/DatabaseServer.ts +213 -0
  4. package/Models/DatabaseModels/DockerHost.ts +213 -0
  5. package/Models/DatabaseModels/DockerSwarmCluster.ts +213 -0
  6. package/Models/DatabaseModels/GlobalConfig.ts +1 -1
  7. package/Models/DatabaseModels/Host.ts +213 -0
  8. package/Models/DatabaseModels/Index.ts +4 -0
  9. package/Models/DatabaseModels/KubernetesAiAgent.ts +364 -0
  10. package/Models/DatabaseModels/KubernetesCluster.ts +3 -3
  11. package/Models/DatabaseModels/PodmanHost.ts +213 -0
  12. package/Models/DatabaseModels/Project.ts +55 -5
  13. package/Models/DatabaseModels/ProxmoxCluster.ts +213 -0
  14. package/Models/DatabaseModels/ProxmoxResource.ts +49 -1
  15. package/Models/DatabaseModels/ResourceAiAgent.ts +419 -0
  16. package/Models/DatabaseModels/RunnerJob.ts +219 -0
  17. package/Models/DatabaseModels/TeamComplianceSetting.ts +143 -2
  18. package/Models/DatabaseModels/VMwareVCenter.ts +213 -0
  19. package/Models/DatabaseModels/WorkspaceProjectAuthToken.ts +17 -0
  20. package/Server/API/AIChatAPI.ts +6 -3
  21. package/Server/API/AIInvestigationAPI.ts +17 -10
  22. package/Server/API/AutoRemediationAPI.ts +598 -25
  23. package/Server/API/KubernetesClusterAiAccessAPI.ts +623 -21
  24. package/Server/API/MicrosoftTeamsAPI.ts +93 -14
  25. package/Server/API/ProxmoxResourceAPI.ts +244 -14
  26. package/Server/API/ResourceAiAccessAPI.ts +1669 -0
  27. package/Server/Infrastructure/GlobalCache.ts +32 -0
  28. package/Server/Infrastructure/Postgres/SchemaMigrations/1796000000000-AddTeamComplianceRuleScope.ts +99 -0
  29. package/Server/Infrastructure/Postgres/SchemaMigrations/1796100000000-AddKubernetesAiAgentAndAiDefaults.ts +137 -0
  30. package/Server/Infrastructure/Postgres/SchemaMigrations/1796200000000-AddProxmoxResourceNativePushColumns.ts +42 -0
  31. package/Server/Infrastructure/Postgres/SchemaMigrations/1796300000000-AddResourceAiAgents.ts +423 -0
  32. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +8 -0
  33. package/Server/Infrastructure/Semaphore.ts +22 -0
  34. package/Server/Middleware/TelemetryIngest.ts +51 -18
  35. package/Server/Services/AIService.ts +70 -1
  36. package/Server/Services/AlertService.ts +352 -11
  37. package/Server/Services/AlertSeverityService.ts +65 -15
  38. package/Server/Services/AnalyticsDatabaseService.ts +45 -1
  39. package/Server/Services/AutoRemediationRuleEngineService.ts +940 -112
  40. package/Server/Services/AutoRemediationRuleService.ts +1 -1
  41. package/Server/Services/CephClusterService.ts +109 -1
  42. package/Server/Services/DatabaseServerService.ts +116 -1
  43. package/Server/Services/DockerHostService.ts +109 -1
  44. package/Server/Services/DockerSwarmClusterService.ts +113 -1
  45. package/Server/Services/HostService.ts +126 -4
  46. package/Server/Services/IncidentService.ts +280 -104
  47. package/Server/Services/IncidentSeverityService.ts +66 -15
  48. package/Server/Services/KubernetesAiAgentJobService.ts +185 -0
  49. package/Server/Services/KubernetesAiAgentService.ts +1634 -0
  50. package/Server/Services/KubernetesClusterAiAccessService.ts +1118 -451
  51. package/Server/Services/KubernetesClusterService.ts +129 -21
  52. package/Server/Services/MetricRecordingRuleService.ts +47 -0
  53. package/Server/Services/PodmanHostService.ts +109 -1
  54. package/Server/Services/ProjectService.ts +32 -0
  55. package/Server/Services/ProxmoxClusterService.ts +110 -1
  56. package/Server/Services/ProxmoxResourceService.ts +322 -5
  57. package/Server/Services/ResourceAiAccessService.ts +1439 -0
  58. package/Server/Services/ResourceAiAgentJobService.ts +202 -0
  59. package/Server/Services/ResourceAiAgentService.ts +2432 -0
  60. package/Server/Services/RunnerJobService.ts +852 -108
  61. package/Server/Services/RunnerService.ts +1 -1
  62. package/Server/Services/ScheduledMaintenanceService.ts +737 -1
  63. package/Server/Services/ScheduledMaintenanceStateTimelineService.ts +414 -56
  64. package/Server/Services/TeamComplianceSettingService.ts +1125 -9
  65. package/Server/Services/TelemetryUsageBillingService.ts +28 -0
  66. package/Server/Services/TraceRecordingRuleService.ts +33 -0
  67. package/Server/Services/VMwareVCenterService.ts +110 -1
  68. package/Server/Utils/AI/ClusterAccess/ClusterAccessContext.ts +67 -9
  69. package/Server/Utils/AI/ClusterAccess/KubectlInvestigationToolkit.ts +39 -10
  70. package/Server/Utils/AI/ClusterAccess/KubectlJobRunner.ts +14 -3
  71. package/Server/Utils/AI/Remediation/RemediationCommandTools.ts +1475 -51
  72. package/Server/Utils/AI/Remediation/RemediationExecutionRunner.ts +1000 -43
  73. package/Server/Utils/AI/Remediation/RemediationPlanRunner.ts +25 -1
  74. package/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.ts +577 -0
  75. package/Server/Utils/AI/ResourceAccess/ResourceAccessContext.ts +271 -0
  76. package/Server/Utils/AI/ResourceAccess/ResourceAccessToolNames.ts +45 -0
  77. package/Server/Utils/AI/ResourceAccess/ResourceAiAccessSettings.ts +964 -0
  78. package/Server/Utils/AI/ResourceAccess/ResourceAiDeleteCleanup.ts +333 -0
  79. package/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.ts +873 -0
  80. package/Server/Utils/AI/SRE/AIInvestigationEngine.ts +120 -7
  81. package/Server/Utils/AI/SRE/AlertInvestigationRunner.ts +72 -5
  82. package/Server/Utils/AI/SRE/IncidentInvestigationRunner.ts +72 -5
  83. package/Server/Utils/AI/SRE/IncidentPostmortemRunner.ts +40 -8
  84. package/Server/Utils/AI/SRE/InvestigationEligibility.ts +13 -2
  85. package/Server/Utils/AI/SRE/InvestigationGrader.ts +1 -1
  86. package/Server/Utils/AutoRemediation/CommandPlanExecutor.ts +402 -14
  87. package/Server/Utils/AutoRemediation/RemediationVerifier.ts +35 -2
  88. package/Server/Utils/Database/ProjectScopedReferenceValidator.ts +9 -1
  89. package/Server/Utils/SessionReplay/SessionReplayBudgetMetrics.ts +920 -0
  90. package/Server/Utils/SessionReplay/SessionReplayUsage.ts +84 -6
  91. package/Server/Utils/Telemetry/InventoryEntityRegistry.ts +133 -7
  92. package/Server/Utils/Telemetry/ProxmoxCephSnapshotScan.ts +58 -4
  93. package/Server/Utils/Telemetry/ProxmoxNativeNodeLiveness.ts +447 -0
  94. package/Server/Utils/Telemetry/ProxmoxNativePush.ts +903 -0
  95. package/Server/Utils/Telemetry/TelemetryEntity.ts +87 -27
  96. package/Server/Utils/Workspace/MicrosoftTeams/Actions/Alert.ts +35 -15
  97. package/Server/Utils/Workspace/MicrosoftTeams/Actions/AlertEpisode.ts +33 -15
  98. package/Server/Utils/Workspace/MicrosoftTeams/Actions/Auth.ts +21 -1
  99. package/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.ts +298 -224
  100. package/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.ts +35 -15
  101. package/Server/Utils/Workspace/MicrosoftTeams/Actions/ScheduledMaintenance.ts +389 -175
  102. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +1073 -213
  103. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsActivityDeduplicator.ts +163 -0
  104. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCardChoices.ts +396 -0
  105. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateCommands.ts +418 -0
  106. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsMessageSize.ts +152 -0
  107. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsReplies.ts +251 -0
  108. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsTimezone.ts +214 -0
  109. package/Tests/App/AdminDashboard/RowActionPlacementOverrides.test.tsx +278 -0
  110. package/Tests/App/Dashboard/AIChatChartWidgetZoom.test.tsx +738 -0
  111. package/Tests/App/Dashboard/AIFeaturesSettingsPointers.test.tsx +147 -0
  112. package/Tests/App/Dashboard/AIInsightsKubernetesClusterPage.test.tsx +1523 -0
  113. package/Tests/App/Dashboard/AdminUserNotificationMethodsPage.test.tsx +463 -3
  114. package/Tests/App/Dashboard/AffectedResourcesPickerDropdownPlacement.test.tsx +958 -0
  115. package/Tests/App/Dashboard/AffectedResourcesPickerFocusLeave.test.tsx +595 -0
  116. package/Tests/App/Dashboard/AskAiAvailability.test.ts +20 -3
  117. package/Tests/App/Dashboard/AskAiDisabled.test.tsx +8 -3
  118. package/Tests/App/Dashboard/CephRateChartReload.test.tsx +1456 -0
  119. package/Tests/App/Dashboard/CephTimeRangeZoom.test.tsx +1229 -0
  120. package/Tests/App/Dashboard/ChartCardTimeRangeZoom.test.tsx +151 -0
  121. package/Tests/App/Dashboard/ChartCardZoomAffordances.test.tsx +257 -0
  122. package/Tests/App/Dashboard/ChartRefetchFrame.test.tsx +141 -0
  123. package/Tests/App/Dashboard/ChartZoomHarness.tsx +249 -0
  124. package/Tests/App/Dashboard/ChartZoomStandIn.tsx +131 -0
  125. package/Tests/App/Dashboard/CloudServerlessSlowLoads.test.tsx +628 -0
  126. package/Tests/App/Dashboard/CloudServerlessTimeRangeZoom.test.tsx +607 -0
  127. package/Tests/App/Dashboard/ClusterAccessNotice.test.tsx +184 -19
  128. package/Tests/App/Dashboard/CompanionMetricsTabZoom.test.tsx +632 -0
  129. package/Tests/App/Dashboard/ContainerChartZoomStandIn.tsx +195 -0
  130. package/Tests/App/Dashboard/ContainerHostOverviewSlowLoads.test.tsx +542 -0
  131. package/Tests/App/Dashboard/ContainerHostOverviewTimeRangeZoom.test.tsx +848 -0
  132. package/Tests/App/Dashboard/ContainerMetricsTimeRangeZoom.test.tsx +561 -0
  133. package/Tests/App/Dashboard/DashboardBoardWideZoomShell.test.tsx +1147 -0
  134. package/Tests/App/Dashboard/DashboardEditPermissions.test.tsx +3 -2
  135. package/Tests/App/Dashboard/DashboardHistogramWidgetDragCursor.test.tsx +399 -0
  136. package/Tests/App/Dashboard/DashboardHistogramWidgetZoom.test.tsx +985 -0
  137. package/Tests/App/Dashboard/DashboardHistogramWidgetZoomHint.test.tsx +803 -0
  138. package/Tests/App/Dashboard/DashboardLazyPages.test.tsx +1 -0
  139. package/Tests/App/Dashboard/DashboardSettingsPreviewZoom.test.tsx +679 -0
  140. package/Tests/App/Dashboard/DashboardSloAndDataSourceChartZoom.test.tsx +881 -0
  141. package/Tests/App/Dashboard/DashboardTraceStatusWidgets.test.tsx +878 -0
  142. package/Tests/App/Dashboard/DatabaseDocumentationMarkdown.test.ts +18 -6
  143. package/Tests/App/Dashboard/DatabaseMetricChartModalTimeRangeZoom.test.tsx +442 -0
  144. package/Tests/App/Dashboard/DatabaseOverviewTimeRangeZoom.test.tsx +831 -0
  145. package/Tests/App/Dashboard/DatabaseServerComponents.test.tsx +43 -0
  146. package/Tests/App/Dashboard/DockerSwarmInsightsTimeRangeZoom.test.tsx +524 -0
  147. package/Tests/App/Dashboard/DockerSwarmRateChartRefresh.test.tsx +259 -0
  148. package/Tests/App/Dashboard/EdgeDetailPanelHistory.test.tsx +763 -0
  149. package/Tests/App/Dashboard/EdgeDetailPanelTimeRangeZoom.test.tsx +547 -0
  150. package/Tests/App/Dashboard/EdgeHistoryBucketsCases.tsx +565 -0
  151. package/Tests/App/Dashboard/EdgeHistoryBucketsKathmandu.test.tsx +73 -0
  152. package/Tests/App/Dashboard/EdgeHistoryBucketsKolkata.test.tsx +74 -0
  153. package/Tests/App/Dashboard/EdgeHistoryBucketsNewYork.test.tsx +72 -0
  154. package/Tests/App/Dashboard/EdgeHistoryBucketsUtc.test.tsx +72 -0
  155. package/Tests/App/Dashboard/EmbeddedMetricCardRefresh.test.tsx +310 -0
  156. package/Tests/App/Dashboard/EmbeddedMetricCardTimeRangeZoom.test.tsx +536 -0
  157. package/Tests/App/Dashboard/EscalationRuleReadiness.test.tsx +3 -1
  158. package/Tests/App/Dashboard/EscalationRuleRowActions.test.tsx +660 -0
  159. package/Tests/App/Dashboard/EventNotes.test.tsx +2 -2
  160. package/Tests/App/Dashboard/EventOverviewPages.test.tsx +587 -13
  161. package/Tests/App/Dashboard/EventOverviewSnapshotExplorerZoom.test.tsx +1139 -0
  162. package/Tests/App/Dashboard/EventOverviewSnapshotZoomAcrossTabs.test.tsx +1057 -0
  163. package/Tests/App/Dashboard/EventOverviewTelemetrySnapshotZoom.test.tsx +757 -0
  164. package/Tests/App/Dashboard/ExceptionOccurrenceTrendZoom.test.tsx +675 -0
  165. package/Tests/App/Dashboard/ExceptionOccurrencesZoomSurvivesViewSwitch.test.tsx +405 -0
  166. package/Tests/App/Dashboard/ExceptionSignalPages.test.tsx +67 -3
  167. package/Tests/App/Dashboard/ExceptionTablesSpanStatus.test.tsx +515 -0
  168. package/Tests/App/Dashboard/ExplorerOwnZoomRegression.test.tsx +739 -0
  169. package/Tests/App/Dashboard/FlowBandwidthAxisCases.tsx +461 -0
  170. package/Tests/App/Dashboard/FlowBandwidthAxisKathmandu.test.tsx +25 -0
  171. package/Tests/App/Dashboard/FlowBandwidthAxisKolkata.test.tsx +25 -0
  172. package/Tests/App/Dashboard/FlowBandwidthAxisNewYork.test.tsx +25 -0
  173. package/Tests/App/Dashboard/FlowBandwidthAxisUtc.test.tsx +24 -0
  174. package/Tests/App/Dashboard/FlowTopTalkersZoomRefetch.test.tsx +722 -0
  175. package/Tests/App/Dashboard/FlowViewportGuard.test.tsx +2526 -0
  176. package/Tests/App/Dashboard/HostPagesSlowLoads.test.tsx +872 -0
  177. package/Tests/App/Dashboard/HostPagesTimeRangeZoom.test.tsx +1208 -0
  178. package/Tests/App/Dashboard/IncidentRootCauseTimeRangeZoom.test.tsx +358 -0
  179. package/Tests/App/Dashboard/InfrastructureGraph.test.tsx +100 -9
  180. package/Tests/App/Dashboard/InfrastructureMetricsTabTimeRangeZoom.test.tsx +485 -0
  181. package/Tests/App/Dashboard/InvestigationDrawerCompanionZoom.test.tsx +655 -0
  182. package/Tests/App/Dashboard/InvestigationDrawerZoom.test.tsx +830 -0
  183. package/Tests/App/Dashboard/InvestigationInfrastructureTools.test.tsx +506 -0
  184. package/Tests/App/Dashboard/InvestigationNotStarted.test.tsx +338 -2
  185. package/Tests/App/Dashboard/InvoicesPayInvoice.test.tsx +454 -16
  186. package/Tests/App/Dashboard/KubernetesClusterAiAccessSettings.test.ts +799 -819
  187. package/Tests/App/Dashboard/KubernetesClusterAiAgentOverviewCard.test.tsx +367 -0
  188. package/Tests/App/Dashboard/KubernetesClusterAiAgentStatus.test.ts +1202 -0
  189. package/Tests/App/Dashboard/KubernetesClusterAiDocumentationMarkdown.test.ts +106 -0
  190. package/Tests/App/Dashboard/KubernetesClusterAiNavigation.test.tsx +354 -0
  191. package/Tests/App/Dashboard/KubernetesClusterAiPage.test.tsx +1884 -2054
  192. package/Tests/App/Dashboard/KubernetesClusterAiPageServerParity.test.ts +478 -179
  193. package/Tests/App/Dashboard/KubernetesClusterMetricTooltips.test.ts +50 -0
  194. package/Tests/App/Dashboard/KubernetesClusterOverviewTooltips.test.tsx +2 -1
  195. package/Tests/App/Dashboard/KubernetesClusterOverviewZoom.test.tsx +1217 -0
  196. package/Tests/App/Dashboard/KubernetesClusterPagesZoom.test.tsx +731 -0
  197. package/Tests/App/Dashboard/KubernetesCostsLoadRecovery.test.tsx +869 -0
  198. package/Tests/App/Dashboard/KubernetesCostsZoom.test.tsx +1214 -0
  199. package/Tests/App/Dashboard/KubernetesCostsZoomExactHours.test.tsx +692 -0
  200. package/Tests/App/Dashboard/KubernetesNetworkThroughputReload.test.tsx +902 -0
  201. package/Tests/App/Dashboard/KubernetesNetworkZoomBucketEdges.test.tsx +571 -0
  202. package/Tests/App/Dashboard/KubernetesOverviewZoomBucketEdges.test.tsx +697 -0
  203. package/Tests/App/Dashboard/KubernetesResourceMetricsTabZoom.test.tsx +633 -0
  204. package/Tests/App/Dashboard/LogsExplorerTimeRangeZoom.test.tsx +470 -0
  205. package/Tests/App/Dashboard/LogsInsightsTimeRangeZoom.test.tsx +948 -0
  206. package/Tests/App/Dashboard/LogsViewerPinnedWindowZoom.test.tsx +486 -0
  207. package/Tests/App/Dashboard/MetricChartsBucketInspectorDoubleClick.test.tsx +1001 -0
  208. package/Tests/App/Dashboard/MetricExplorerInvestigationAutoRefresh.test.tsx +514 -0
  209. package/Tests/App/Dashboard/MetricExplorerSavedViewZoomRoundTrip.test.tsx +581 -0
  210. package/Tests/App/Dashboard/MetricExplorerTimeRangeZoom.test.tsx +1162 -0
  211. package/Tests/App/Dashboard/MetricMonitorPreviewZoomLabel.test.ts +72 -0
  212. package/Tests/App/Dashboard/MetricRowSparklineTimeRangeZoom.test.tsx +204 -0
  213. package/Tests/App/Dashboard/MetricViewFirstResultLands.test.tsx +408 -0
  214. package/Tests/App/Dashboard/MetricViewOwnZoomResetPlacement.test.tsx +952 -0
  215. package/Tests/App/Dashboard/MetricViewTimeRange.test.ts +139 -0
  216. package/Tests/App/Dashboard/MetricViewTimeRangeZoom.test.tsx +556 -0
  217. package/Tests/App/Dashboard/MonitorMetricsChartWrappersZoom.test.tsx +552 -0
  218. package/Tests/App/Dashboard/MonitorMetricsTabsTimeRangeZoom.test.tsx +740 -0
  219. package/Tests/App/Dashboard/MonitorOverviewChartsTimeRangeZoom.test.tsx +735 -0
  220. package/Tests/App/Dashboard/MonitorStepPreviewsTimeRangeZoom.test.tsx +835 -0
  221. package/Tests/App/Dashboard/NetworkDeviceTimeRangeZoom.test.tsx +1115 -0
  222. package/Tests/App/Dashboard/OnCallPreventionGuards.test.tsx +186 -17
  223. package/Tests/App/Dashboard/OnCallRulesDeleteGuard.test.tsx +155 -46
  224. package/Tests/App/Dashboard/PasskeySettings.test.tsx +87 -2
  225. package/Tests/App/Dashboard/ProjectAISettingsPages.test.tsx +884 -0
  226. package/Tests/App/Dashboard/ProxmoxNodeRemove.test.tsx +621 -0
  227. package/Tests/App/Dashboard/ProxmoxOverviewSlowLoads.test.tsx +584 -0
  228. package/Tests/App/Dashboard/ProxmoxPagesTimeRangeZoom.test.tsx +823 -0
  229. package/Tests/App/Dashboard/ProxmoxRateChartReload.test.tsx +1253 -0
  230. package/Tests/App/Dashboard/PublicDashboardBoardWideZoom.test.tsx +605 -0
  231. package/Tests/App/Dashboard/RealRowsLineChart.tsx +250 -0
  232. package/Tests/App/Dashboard/RechartsHostsPlotCursor.test.tsx +513 -0
  233. package/Tests/App/Dashboard/RemediationSuggestionCardDescription.test.tsx +209 -0
  234. package/Tests/App/Dashboard/RemediationSuggestionCardResource.test.tsx +317 -0
  235. package/Tests/App/Dashboard/ResourceAiAccessSettingsUtil.test.ts +921 -0
  236. package/Tests/App/Dashboard/ResourceAiAgentInstall.test.ts +860 -0
  237. package/Tests/App/Dashboard/ResourceAiAgentPage.test.tsx +1721 -0
  238. package/Tests/App/Dashboard/ResourceAiAgentStatus.test.ts +1002 -0
  239. package/Tests/App/Dashboard/ResourceAiInsightsPage.test.tsx +931 -0
  240. package/Tests/App/Dashboard/ResourceAiNavigation.test.tsx +575 -0
  241. package/Tests/App/Dashboard/RowActionPlacementOverrides.test.tsx +865 -0
  242. package/Tests/App/Dashboard/RumOverviewTimeRangeZoom.test.tsx +877 -0
  243. package/Tests/App/Dashboard/RunbookStepTypeMaps.test.ts +38 -7
  244. package/Tests/App/Dashboard/RunnerKubernetesAgentForm.test.tsx +20 -4
  245. package/Tests/App/Dashboard/RunnerSupersededByAiAgentNote.test.tsx +296 -0
  246. package/Tests/App/Dashboard/SecurityEventConnectionsTable.test.tsx +146 -36
  247. package/Tests/App/Dashboard/ServiceDatabaseSlowLoads.test.tsx +1166 -0
  248. package/Tests/App/Dashboard/ServiceMapGraph.test.tsx +1243 -104
  249. package/Tests/App/Dashboard/ServiceOverviewTimeRangeZoom.test.tsx +792 -0
  250. package/Tests/App/Dashboard/SloBudgetBurnDownZoom.test.tsx +771 -0
  251. package/Tests/App/Dashboard/SloBudgetBurnDownZoomAffordances.test.tsx +380 -0
  252. package/Tests/App/Dashboard/SloEventMetricsBarChartZoom.test.tsx +369 -0
  253. package/Tests/App/Dashboard/SloHistoryChartsTimeRangeZoom.test.tsx +694 -0
  254. package/Tests/App/Dashboard/SloHistoryChartsZoomAffordances.test.tsx +497 -0
  255. package/Tests/App/Dashboard/SloMetricsTimeRangeZoom.test.tsx +541 -0
  256. package/Tests/App/Dashboard/SlowLoadHarness.ts +123 -0
  257. package/Tests/App/Dashboard/SnapshotExplorerPrimaryZoom.test.tsx +1194 -0
  258. package/Tests/App/Dashboard/SnapshotViewerPinnedWindow.test.tsx +620 -0
  259. package/Tests/App/Dashboard/TelemetrySnapshotPanelTimeRangeZoom.test.tsx +765 -0
  260. package/Tests/App/Dashboard/TelemetrySnapshotZoom.test.tsx +516 -0
  261. package/Tests/App/Dashboard/TelemetrySnapshotZoomAcrossTabs.test.tsx +827 -0
  262. package/Tests/App/Dashboard/TimeRangeZoomPageHarness.tsx +463 -0
  263. package/Tests/App/Dashboard/TraceChartEditorStatusSplit.test.tsx +543 -0
  264. package/Tests/App/Dashboard/TraceStatusPresentation.test.tsx +967 -0
  265. package/Tests/App/Dashboard/TraceTimelineMinimapZoom.test.tsx +315 -0
  266. package/Tests/App/Dashboard/TracesAnalyticsStatusSplit.test.tsx +778 -0
  267. package/Tests/App/Dashboard/TracesAnalyticsViewZoom.test.tsx +349 -0
  268. package/Tests/App/Dashboard/TracesExplorerTimeRangeZoom.test.tsx +551 -0
  269. package/Tests/App/Dashboard/TracesStatusChartAndFacet.test.tsx +687 -0
  270. package/Tests/App/Dashboard/TracesViewerStaleResponses.test.tsx +458 -0
  271. package/Tests/App/Dashboard/UptimeStripsExcludedFromZoom.test.tsx +406 -0
  272. package/Tests/App/Dashboard/VMwareOverviewSlowLoads.test.tsx +535 -0
  273. package/Tests/App/Dashboard/VMwarePagesTimeRangeZoom.test.tsx +606 -0
  274. package/Tests/App/Dashboard/ValueWidgetSparklineStaleHover.test.tsx +1292 -0
  275. package/Tests/App/Dashboard/ValueWidgetSparklineZoom.test.tsx +765 -0
  276. package/Tests/App/StatusPage/StatusPageResourceExplorer.test.tsx +98 -0
  277. package/Tests/Models/DatabaseModels/DatabaseServerModels.test.ts +33 -1
  278. package/Tests/Models/DatabaseModels/KubernetesAiAgentModel.test.ts +295 -0
  279. package/Tests/Models/DatabaseModels/ResourceAiAccessColumns.test.ts +738 -0
  280. package/Tests/Models/DatabaseModels/ResourceAiAgentModel.test.ts +842 -0
  281. package/Tests/Models/DatabaseModels/TeamComplianceSettingModel.test.ts +347 -0
  282. package/Tests/Server/API/AIChatRouteAuthorization.test.ts +58 -0
  283. package/Tests/Server/API/AIGenerationProjectAIToggle.test.ts +1 -1
  284. package/Tests/Server/API/AIInvestigationAPI.test.ts +123 -45
  285. package/Tests/Server/API/AutoRemediationApproveClusterRound.test.ts +1329 -0
  286. package/Tests/Server/API/AutoRemediationApproveKubectlRecheck.test.ts +25 -2
  287. package/Tests/Server/API/AutoRemediationApproveResourceRound.test.ts +835 -0
  288. package/Tests/Server/API/KubernetesClusterAiAccessAPI.test.ts +2 -0
  289. package/Tests/Server/API/KubernetesClusterAiAccessAPIAgent.test.ts +903 -0
  290. package/Tests/Server/API/MicrosoftTeamsChatsRefreshRoute.test.ts +667 -0
  291. package/Tests/Server/API/MicrosoftTeamsManifest.test.ts +294 -6
  292. package/Tests/Server/API/ProxmoxResourceAPIRemoveNode.test.ts +1932 -0
  293. package/Tests/Server/API/ResourceAiAccessAPI.test.ts +2730 -0
  294. package/Tests/Server/Infrastructure/GlobalCache.test.ts +195 -0
  295. package/Tests/Server/Infrastructure/Postgres/AddDatabaseServerTablesMigration.test.ts +60 -0
  296. package/Tests/Server/Infrastructure/Postgres/AddKubernetesAiAgentAndAiDefaultsMigration.test.ts +623 -0
  297. package/Tests/Server/Infrastructure/Postgres/AddKubernetesClusterAiAccessMigration.test.ts +87 -10
  298. package/Tests/Server/Infrastructure/Postgres/AddResourceAiAgentsMigration.test.ts +659 -0
  299. package/Tests/Server/Infrastructure/Postgres/AddTeamComplianceRuleScopeMigration.test.ts +622 -0
  300. package/Tests/Server/Infrastructure/SemaphoreMutex.test.ts +31 -0
  301. package/Tests/Server/Middleware/TelemetryIngestBrowserKey.test.ts +119 -4
  302. package/Tests/Server/Middleware/TelemetryIngestKubernetesAgentRunnerPinnedKey.test.ts +196 -2
  303. package/Tests/Server/Middleware/TelemetryIngestKubernetesAgentRunnerRateLimit.test.ts +123 -2
  304. package/Tests/Server/Services/AIServiceBalanceBlocker.test.ts +282 -0
  305. package/Tests/Server/Services/AlertMonitorClearWritesNull.test.ts +409 -0
  306. package/Tests/Server/Services/AlertMonitorEditFeed.test.ts +474 -0
  307. package/Tests/Server/Services/AlertMonitorEditGuard.test.ts +610 -0
  308. package/Tests/Server/Services/AutoRemediationClusterRuleEngine.test.ts +2 -0
  309. package/Tests/Server/Services/AutoRemediationResourceRuleEngine.test.ts +1279 -0
  310. package/Tests/Server/Services/AutoRemediationRuleCommandRunners.test.ts +2 -1
  311. package/Tests/Server/Services/DatabaseServerService.test.ts +55 -0
  312. package/Tests/Server/Services/GroupTelemetryUsageExcludeNames.test.ts +299 -0
  313. package/Tests/Server/Services/HostServiceFindOrCreateMemo.test.ts +44 -0
  314. package/Tests/Server/Services/IncidentAffectedMonitorsEdit.test.ts +1360 -0
  315. package/Tests/Server/Services/IncidentAlertSloLinkSurvivesEdit.test.ts +3 -1
  316. package/Tests/Server/Services/IncidentSeverityDeletePausesComplianceRules.test.ts +488 -0
  317. package/Tests/Server/Services/KubernetesAiAgentJobService.test.ts +329 -0
  318. package/Tests/Server/Services/KubernetesAiAgentServiceHelpers.test.ts +618 -0
  319. package/Tests/Server/Services/KubernetesAiAgentServiceLifecycle.test.ts +1444 -0
  320. package/Tests/Server/Services/KubernetesAiAgentServiceRegister.test.ts +1666 -0
  321. package/Tests/Server/Services/KubernetesClusterAiAccessDeletedRunnerRemedy.test.ts +140 -111
  322. package/Tests/Server/Services/KubernetesClusterAiAccessGapNextSteps.test.ts +267 -105
  323. package/Tests/Server/Services/KubernetesClusterAiAccessLegacySuperseded.test.ts +440 -0
  324. package/Tests/Server/Services/KubernetesClusterAiAccessService.test.ts +567 -411
  325. package/Tests/Server/Services/KubernetesClusterAiAccessTarget.test.ts +1168 -0
  326. package/Tests/Server/Services/KubernetesClusterAiSettingsPermission.test.ts +410 -12
  327. package/Tests/Server/Services/KubernetesClusterServiceAiAccessFeed.test.ts +55 -0
  328. package/Tests/Server/Services/MonitorProbeServiceIntervalScheduling.test.ts +45 -6
  329. package/Tests/Server/Services/ProjectServiceNewProjectAiDefaults.test.ts +288 -0
  330. package/Tests/Server/Services/ProxmoxResourcePostgres.test.ts +5633 -0
  331. package/Tests/Server/Services/ProxmoxResourceService.test.ts +6458 -5
  332. package/Tests/Server/Services/RecordingRuleReservedMetricName.test.ts +171 -0
  333. package/Tests/Server/Services/ResourceAiAccessChangeAuthorization.test.ts +256 -0
  334. package/Tests/Server/Services/ResourceAiAccessService.test.ts +1373 -0
  335. package/Tests/Server/Services/ResourceAiAgentJobService.test.ts +375 -0
  336. package/Tests/Server/Services/ResourceAiAgentServiceHelpers.test.ts +1114 -0
  337. package/Tests/Server/Services/ResourceAiAgentServiceLifecycle.test.ts +1050 -0
  338. package/Tests/Server/Services/ResourceAiAgentServiceRegister.test.ts +2251 -0
  339. package/Tests/Server/Services/ResourceAiSettingsCreate.test.ts +373 -0
  340. package/Tests/Server/Services/ResourceAiSettingsPermission.test.ts +1042 -0
  341. package/Tests/Server/Services/ResourceServiceDeleteCleansUpAi.test.ts +319 -0
  342. package/Tests/Server/Services/RunnerJobEnqueueKubectl.test.ts +153 -15
  343. package/Tests/Server/Services/RunnerJobEnqueueKubectlAiAgent.test.ts +620 -0
  344. package/Tests/Server/Services/RunnerJobEnqueueResourceCommand.test.ts +986 -0
  345. package/Tests/Server/Services/RunnerJobKubectlWriteScope.test.ts +170 -3
  346. package/Tests/Server/Services/RunnerJobResourceCommandLane.test.ts +211 -0
  347. package/Tests/Server/Services/RunnerJobResourceCommandTimeoutAndRedaction.test.ts +352 -0
  348. package/Tests/Server/Services/RunnerJobTimeoutReason.test.ts +72 -0
  349. package/Tests/Server/Services/RunnerServiceAgentName.test.ts +6 -4
  350. package/Tests/Server/Services/ScheduledMaintenanceAttachmentEdit.test.ts +2113 -0
  351. package/Tests/Server/Services/ScheduledMaintenanceMonitorRelease.test.ts +972 -0
  352. package/Tests/Server/Services/TeamComplianceSettingPostgres.test.ts +2237 -0
  353. package/Tests/Server/Services/TeamComplianceSettingService.test.ts +3988 -138
  354. package/Tests/Server/Services/TelemetryUsageBillingSloExclusion.test.ts +218 -0
  355. package/Tests/Server/TestingUtils/Services/FakeRunnerJobCount.ts +145 -0
  356. package/Tests/Server/Utils/AI/ClusterAccessContext.test.ts +107 -1
  357. package/Tests/Server/Utils/AI/IncidentPostmortemRunner.test.ts +351 -0
  358. package/Tests/Server/Utils/AI/InvestigationClusterAccessWiring.test.ts +2 -0
  359. package/Tests/Server/Utils/AI/InvestigationEligibility.test.ts +310 -0
  360. package/Tests/Server/Utils/AI/InvestigationInfrastructureAccessWiring.test.ts +453 -0
  361. package/Tests/Server/Utils/AI/InvestigationInfrastructureReport.test.ts +721 -0
  362. package/Tests/Server/Utils/AI/KubectlInvestigationToolkit.test.ts +70 -0
  363. package/Tests/Server/Utils/AI/KubectlJobRunnerFinishedJob.test.ts +58 -0
  364. package/Tests/Server/Utils/AI/RemediationCommandTools.test.ts +94 -1
  365. package/Tests/Server/Utils/AI/RemediationCommandToolsKubectl.test.ts +2 -0
  366. package/Tests/Server/Utils/AI/RemediationCommandToolsKubectlOutcome.test.ts +2 -0
  367. package/Tests/Server/Utils/AI/RemediationCommandToolsLiveCluster.test.ts +2 -0
  368. package/Tests/Server/Utils/AI/RemediationCommandToolsResource.test.ts +1530 -0
  369. package/Tests/Server/Utils/AI/RemediationCommandToolsRunnerScope.test.ts +125 -1
  370. package/Tests/Server/Utils/AI/RemediationExecutionRunner.test.ts +252 -3
  371. package/Tests/Server/Utils/AI/RemediationExecutionRunnerClusterMode.test.ts +2 -0
  372. package/Tests/Server/Utils/AI/RemediationExecutionRunnerProjectGates.test.ts +240 -0
  373. package/Tests/Server/Utils/AI/RemediationExecutionRunnerResourceMode.test.ts +1249 -0
  374. package/Tests/Server/Utils/AI/RemediationKubectlCopyParity.test.ts +2 -0
  375. package/Tests/Server/Utils/AI/RemediationPlanRunner.test.ts +117 -0
  376. package/Tests/Server/Utils/AI/RemediationResourceCopyParity.test.ts +463 -0
  377. package/Tests/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.test.ts +722 -0
  378. package/Tests/Server/Utils/AI/ResourceAccess/ResourceAccessContext.test.ts +266 -0
  379. package/Tests/Server/Utils/AI/ResourceAccess/ResourceAiAccessSettings.test.ts +1220 -0
  380. package/Tests/Server/Utils/AI/ResourceAccess/ResourceAiDeleteCleanup.test.ts +569 -0
  381. package/Tests/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.test.ts +830 -0
  382. package/Tests/Server/Utils/AutoRemediation/CommandPlanExecutor.test.ts +2 -0
  383. package/Tests/Server/Utils/AutoRemediation/CommandPlanExecutorResource.test.ts +717 -0
  384. package/Tests/Server/Utils/AutoRemediation/CommandPlanExecutorUnknownRun.test.ts +2 -0
  385. package/Tests/Server/Utils/AutoRemediation/CommandPlanVerification.test.ts +2 -0
  386. package/Tests/Server/Utils/AutoRemediation/RemediationVerifierResourceFollowUp.test.ts +338 -0
  387. package/Tests/Server/Utils/Monitor/Criteria/SessionReplayBudgetTemplateCriteria.test.ts +422 -0
  388. package/Tests/Server/Utils/SessionReplay/SessionReplayBudgetMetrics.test.ts +1647 -0
  389. package/Tests/Server/Utils/SessionReplay/SessionReplayUsage.test.ts +143 -1
  390. package/Tests/Server/Utils/Telemetry/HostAssetAttributesFromOtlp.test.ts +68 -0
  391. package/Tests/Server/Utils/Telemetry/InventoryMirrorPostgres.test.ts +370 -0
  392. package/Tests/Server/Utils/Telemetry/NetworkDeviceInventoryAttributes.test.ts +522 -0
  393. package/Tests/Server/Utils/Telemetry/ProxmoxCephSnapshotScan.test.ts +155 -0
  394. package/Tests/Server/Utils/Telemetry/ProxmoxNativeNodeLiveness.test.ts +8631 -0
  395. package/Tests/Server/Utils/Telemetry/ProxmoxNativePush.test.ts +2852 -0
  396. package/Tests/Server/Utils/Telemetry/TelemetryEntity.test.ts +367 -1
  397. package/Tests/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.test.ts +75 -3
  398. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsAccountNotLinked.test.ts +1093 -0
  399. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsActivityDeduplicator.test.ts +1049 -0
  400. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCardChoices.test.ts +1676 -0
  401. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateCards.test.ts +2884 -0
  402. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateCommands.test.ts +2490 -0
  403. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateSubmit.test.ts +2293 -0
  404. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateSubmitServerTimezone.test.ts +386 -0
  405. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsMessageSize.test.ts +1477 -0
  406. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsReplies.test.ts +1967 -0
  407. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsStripHtmlTags.test.ts +92 -0
  408. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsSubmittedFormRemoval.test.ts +1819 -0
  409. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsTimezone.test.ts +1033 -0
  410. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsTimezoneServerZone.test.ts +610 -0
  411. package/Tests/Server/Utils/Workspace/MicrosoftTeamsBotMessageHandling.test.ts +2610 -0
  412. package/Tests/Server/Utils/Workspace/MicrosoftTeamsChats.test.ts +25 -0
  413. package/Tests/Server/Utils/Workspace/MicrosoftTeamsCreateCommandsEndToEnd.test.ts +4672 -0
  414. package/Tests/Server/Utils/Workspace/MicrosoftTeamsGroupChatNames.test.ts +3119 -0
  415. package/Tests/Server/Utils/Workspace/MicrosoftTeamsGroupChatNamesPostgres.test.ts +1721 -0
  416. package/Tests/Server/Utils/Workspace/WorkspaceCreateProjectReferences.test.ts +190 -65
  417. package/Tests/Types/AutoRemediation/AiRemediationCommandPlan.test.ts +10 -4
  418. package/Tests/Types/AutoRemediation/AiRemediationCommandPlanResourceCommand.test.ts +305 -0
  419. package/Tests/Types/Kubernetes/KubernetesAgentChartAiAccess.test.ts +581 -113
  420. package/Tests/Types/Kubernetes/KubernetesAiAgentAccessContract.test.ts +510 -0
  421. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCatalog.test.ts +277 -13
  422. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationUtil.test.ts +113 -0
  423. package/Tests/Types/Monitor/RumAlertTemplates.test.ts +773 -2
  424. package/Tests/Types/ResourceAiAgent/AiResourceType.test.ts +419 -0
  425. package/Tests/Types/ResourceAiAgent/ResourceAiAccess.test.ts +517 -0
  426. package/Tests/Types/Runbook/RunbookStepType.test.ts +147 -8
  427. package/Tests/Types/Team/ComplianceRule.test.ts +1029 -0
  428. package/Tests/Types/Team/TeamComplianceStatus.test.ts +176 -0
  429. package/Tests/UI/Components/ActionButton/RowActions.test.tsx +641 -0
  430. package/Tests/UI/Components/ActionButton/RowActionsAccessibility.test.tsx +414 -0
  431. package/Tests/UI/Components/ActionButton/SplitActionButtons.test.ts +565 -0
  432. package/Tests/UI/Components/Charts/BarChartDragToSelect.test.tsx +386 -0
  433. package/Tests/UI/Components/Charts/ChartDoubleClickResetWithoutDblclick.test.tsx +1025 -0
  434. package/Tests/UI/Components/Charts/ChartGroupPageZoomHint.test.tsx +196 -0
  435. package/Tests/UI/Components/Charts/ChartPlaceholdersTakeDoubleClick.test.tsx +1861 -0
  436. package/Tests/UI/Components/Charts/ChartPlotClicksWhileResetArmed.test.tsx +382 -0
  437. package/Tests/UI/Components/Charts/ChartRangeSelection.test.tsx +704 -0
  438. package/Tests/UI/Components/Charts/ChartRangeSelectionDoubleClickReset.test.tsx +1481 -0
  439. package/Tests/UI/Components/Charts/ChartRangeSelectionRealRecharts.test.tsx +918 -0
  440. package/Tests/UI/Components/Charts/ChartRowBucketStart.test.ts +350 -0
  441. package/Tests/UI/Components/Charts/DoubleClickReset.test.tsx +996 -0
  442. package/Tests/UI/Components/Charts/HistogramDoubleClickResetRealRecharts.test.tsx +965 -0
  443. package/Tests/UI/Components/Charts/HistogramDriftThenRefetch.test.tsx +277 -0
  444. package/Tests/UI/Components/Charts/HistogramRangeSelectionDataChange.test.tsx +1757 -0
  445. package/Tests/UI/Components/Charts/HistogramRangeSelectionRealRecharts.test.tsx +560 -0
  446. package/Tests/UI/Components/Charts/TimeRangeZoom/ChartPageTimeRangeZoom.test.tsx +513 -0
  447. package/Tests/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomContext.test.tsx +845 -0
  448. package/Tests/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomHint.test.tsx +119 -0
  449. package/Tests/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomHintTailwind.test.tsx +274 -0
  450. package/Tests/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomUtil.test.ts +433 -0
  451. package/Tests/UI/Components/Charts/TimeRangeZoom/UseTimeRangeZoom.test.tsx +863 -0
  452. package/Tests/UI/Components/Charts/TimeRangeZoom/ZoomDocsPromises.test.tsx +1147 -0
  453. package/Tests/UI/Components/DisabledButtonTooltip.test.tsx +14 -3
  454. package/Tests/UI/Components/EntityDropdownEscape.test.tsx +454 -0
  455. package/Tests/UI/Components/EntityDropdownFocusLeave.test.tsx +420 -0
  456. package/Tests/UI/Components/Forms/FormFieldDropdownDisabled.test.tsx +233 -0
  457. package/Tests/UI/Components/Input.test.tsx +80 -1
  458. package/Tests/UI/Components/LogsAnalyticsViewZoom.test.tsx +947 -0
  459. package/Tests/UI/Components/LogsHistogramDragTooltip.test.tsx +17 -5
  460. package/Tests/UI/Components/LogsViewerAnalyticsZoom.test.tsx +501 -0
  461. package/Tests/UI/Components/LogsViewerHistogramZoom.test.tsx +1 -1
  462. package/Tests/UI/Components/ModelTable/BaseModelTableBulkDelete.test.tsx +6 -4
  463. package/Tests/UI/Components/ModelTable/BaseModelTablePermissionGating.test.tsx +60 -8
  464. package/Tests/UI/Components/ModelTable/BaseModelTableRowActions.test.tsx +476 -0
  465. package/Tests/UI/Components/ModelTable/ModelTableWrapContent.test.tsx +7 -5
  466. package/Tests/UI/Components/MoreMenuPortal.test.tsx +623 -0
  467. package/Tests/UI/Components/StatusPage/ResourceGridActions.test.tsx +538 -0
  468. package/Tests/UI/Components/StatusPage/ResourceGridSelection.test.tsx +14 -4
  469. package/Tests/UI/Components/TableCellWrapping.test.tsx +3 -3
  470. package/Tests/UI/Components/TableRowActions.test.tsx +472 -0
  471. package/Tests/UI/Components/TelemetryHistogramDragTooltip.test.tsx +1 -1
  472. package/Tests/UI/Components/TelemetryViewer/TelemetryViewerHistogramClickZoom.test.tsx +1 -1
  473. package/Tests/UI/Components/TelemetryViewer/TelemetryViewerZoomScope.test.tsx +470 -0
  474. package/Tests/UI/Components/TelemetryViewer/UseViewerTimeRangeZoom.test.tsx +571 -0
  475. package/Tests/UI/Components/TelemetryViewer/ViewerDoubleClickResetUnderDataChange.test.tsx +928 -0
  476. package/Tests/UI/Components/TelemetryViewer/ViewerFollowsEnclosingZoom.test.tsx +1569 -0
  477. package/Tests/UI/Components/Toggle.test.tsx +66 -0
  478. package/Tests/UI/MicrosoftTeams/MicrosoftTeamsChatsCardRefreshNames.test.tsx +1023 -0
  479. package/Tests/UI/Rum/ChunkLoader.test.ts +201 -0
  480. package/Tests/UI/Rum/FidelityNotices.test.ts +54 -0
  481. package/Tests/UI/Rum/RecordingHealthDashboard.test.tsx +769 -1
  482. package/Tests/UI/Rum/ReplayCorrelationPanel.test.tsx +72 -0
  483. package/Tests/UI/Rum/ReplayFrameCapture.test.ts +1009 -9
  484. package/Tests/UI/Rum/ReplayRecordedAssets.test.ts +1069 -0
  485. package/Tests/UI/Rum/ReplayStage.test.tsx +913 -2
  486. package/Tests/UI/Rum/SessionReplayTable.test.tsx +443 -8
  487. package/Tests/UI/Rum/SessionReplayUsersTable.test.tsx +439 -9
  488. package/Tests/UI/Rum/UserFlowTablesRowActions.test.tsx +501 -0
  489. package/Tests/Utils/AiRemediation/KubectlPolicyChartRbacParity.test.ts +47 -19
  490. package/Tests/Utils/AiRemediation/KubectlWriteScopeCallerParity.test.ts +2 -0
  491. package/Tests/Utils/AiRemediation/KubernetesAiAgentPolicyCopyParity.test.ts +396 -0
  492. package/Tests/Utils/AiRemediation/Resource/CephCommandPolicy.test.ts +1653 -0
  493. package/Tests/Utils/AiRemediation/Resource/CephOutputRedaction.test.ts +204 -0
  494. package/Tests/Utils/AiRemediation/Resource/DatabaseCommandPolicy.test.ts +1077 -0
  495. package/Tests/Utils/AiRemediation/Resource/DatabaseDiagnosticCatalog.test.ts +558 -0
  496. package/Tests/Utils/AiRemediation/Resource/DatabaseQueryRedactor.test.ts +834 -0
  497. package/Tests/Utils/AiRemediation/Resource/DockerCliGrammar.test.ts +747 -0
  498. package/Tests/Utils/AiRemediation/Resource/DockerEngineCommandPolicy.test.ts +1259 -0
  499. package/Tests/Utils/AiRemediation/Resource/DockerOutputRedaction.test.ts +386 -0
  500. package/Tests/Utils/AiRemediation/Resource/DockerSwarmCommandPolicy.test.ts +782 -0
  501. package/Tests/Utils/AiRemediation/Resource/GovcCommandPolicy.test.ts +2259 -0
  502. package/Tests/Utils/AiRemediation/Resource/HostCommandPolicy.test.ts +2019 -0
  503. package/Tests/Utils/AiRemediation/Resource/ProxmoxCommandPolicy.test.ts +2497 -0
  504. package/Tests/Utils/AiRemediation/Resource/ResourceCommandPolicy.test.ts +1305 -0
  505. package/Tests/Utils/AiRemediation/Resource/ResourceCommandPolicyCore.test.ts +585 -0
  506. package/Tests/Utils/AiRemediation/Resource/ResourceOutputRedactor.test.ts +334 -0
  507. package/Tests/Utils/AiRemediation/Resource/ResourceOutputRedactorCopyParity.test.ts +98 -0
  508. package/Tests/Utils/AiRemediation/Resource/ResourcePolicyImportClosure.test.ts +391 -0
  509. package/Tests/Utils/AiRemediation/ResourceAiAgentPolicyCopyParity.test.ts +497 -0
  510. package/Tests/Utils/Dashboard/DashboardTimeRangeZoom.test.ts +104 -1
  511. package/Tests/Utils/SessionReplay/SessionReplayBudgetMetricType.test.ts +383 -0
  512. package/Types/AI/AIRunType.ts +9 -4
  513. package/Types/AI/InvestigationNotStartedReason.ts +6 -0
  514. package/Types/AI/ResourceAiAccessApi.ts +140 -0
  515. package/Types/AI/ResourceAiAccessPermissions.ts +126 -0
  516. package/Types/AutoRemediation/AiRemediationCommandPlan.ts +197 -18
  517. package/Types/AutoRemediation/AiRemediationCommandPolicyVerdict.ts +28 -0
  518. package/Types/Dashboard/DashboardComponents/DashboardTraceChartComponent.ts +4 -2
  519. package/Types/Kubernetes/KubernetesClusterAiAccess.ts +263 -32
  520. package/Types/Kubernetes/KubernetesClusterAiAccessPermissions.ts +20 -16
  521. package/Types/Kubernetes/KubernetesClusterAiInsights.ts +81 -0
  522. package/Types/Monitor/ProxmoxAlertTemplates.ts +4 -4
  523. package/Types/Monitor/Recommendation/MonitorRecommendationCatalog.ts +55 -22
  524. package/Types/Monitor/Recommendation/MonitorRecommendationTypes.ts +35 -3
  525. package/Types/Monitor/RumAlertTemplates.ts +351 -4
  526. package/Types/ResourceAiAgent/AiResourceType.ts +310 -0
  527. package/Types/ResourceAiAgent/ResourceAiAccess.ts +574 -0
  528. package/Types/Rum/SessionReplayBudgetMetricType.ts +47 -0
  529. package/Types/Runbook/RunbookStepType.ts +29 -0
  530. package/Types/Team/ComplianceNotificationChannel.ts +22 -0
  531. package/Types/Team/ComplianceRule.ts +434 -0
  532. package/Types/Team/ComplianceRuleType.ts +21 -0
  533. package/Types/Team/TeamComplianceStatus.ts +81 -0
  534. package/Types/Telemetry/TelemetryIngestSurface.ts +40 -0
  535. package/UI/Components/ActionButton/ActionButtonSchema.ts +21 -0
  536. package/UI/Components/ActionButton/RowActions.tsx +238 -0
  537. package/UI/Components/ActionButton/SplitActionButtons.ts +173 -0
  538. package/UI/Components/Charts/Area/AreaChart.tsx +32 -2
  539. package/UI/Components/Charts/Bar/BarChart.tsx +40 -3
  540. package/UI/Components/Charts/ChartGroup/ChartGroup.tsx +37 -11
  541. package/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.tsx +80 -243
  542. package/UI/Components/Charts/ChartLibrary/BarChart/BarChart.tsx +122 -31
  543. package/UI/Components/Charts/ChartLibrary/LineChart/LineChart.tsx +95 -244
  544. package/UI/Components/Charts/ChartLibrary/Utils/DoubleClick.ts +214 -0
  545. package/UI/Components/Charts/ChartLibrary/Utils/UseChartBucketsChange.ts +32 -0
  546. package/UI/Components/Charts/ChartLibrary/Utils/UseChartRangeSelection.ts +599 -0
  547. package/UI/Components/Charts/Line/LineChart.tsx +32 -2
  548. package/UI/Components/Charts/TimeRangeZoom/ResetTimeRangeZoomButton.tsx +70 -0
  549. package/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomContext.tsx +226 -0
  550. package/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomHint.tsx +73 -0
  551. package/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomUtil.ts +163 -0
  552. package/UI/Components/Charts/TimeRangeZoom/UseTimeRangeZoom.ts +215 -0
  553. package/UI/Components/Charts/Utils/DataPoint.ts +20 -8
  554. package/UI/Components/Charts/Utils/XAxis.ts +75 -0
  555. package/UI/Components/Charts/Utils/useHistogramRangeSelection.ts +493 -59
  556. package/UI/Components/EntityDropdown/EntityDropdown.tsx +107 -11
  557. package/UI/Components/Forms/Fields/FormField.tsx +10 -0
  558. package/UI/Components/Input/Input.tsx +90 -57
  559. package/UI/Components/List/ListRow.tsx +8 -74
  560. package/UI/Components/LogsViewer/LogsViewer.tsx +40 -11
  561. package/UI/Components/LogsViewer/components/LogTimeRangePicker.tsx +22 -6
  562. package/UI/Components/LogsViewer/components/LogsAnalyticsView.tsx +209 -6
  563. package/UI/Components/LogsViewer/components/LogsHistogram.tsx +127 -84
  564. package/UI/Components/LogsViewer/components/LogsViewerToolbar.tsx +3 -0
  565. package/UI/Components/ModelTable/BaseModelTable.tsx +12 -1
  566. package/UI/Components/MoreMenu/MoreMenu.tsx +365 -30
  567. package/UI/Components/MoreMenu/MoreMenuItem.tsx +70 -17
  568. package/UI/Components/OrderedStatesList/Item.tsx +7 -72
  569. package/UI/Components/StatusPage/ResourceGrid.tsx +126 -77
  570. package/UI/Components/Table/TableBody.tsx +8 -2
  571. package/UI/Components/Table/TableRow.tsx +20 -140
  572. package/UI/Components/TelemetryViewer/TelemetryViewer.tsx +41 -10
  573. package/UI/Components/TelemetryViewer/components/TelemetryHistogram.tsx +47 -9
  574. package/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.tsx +25 -6
  575. package/UI/Components/TelemetryViewer/types.ts +2 -0
  576. package/UI/Components/TelemetryViewer/useViewerTimeRangeZoom.ts +448 -0
  577. package/UI/Components/Toggle/Toggle.tsx +26 -0
  578. package/UI/Components/Tooltip/Tooltip.tsx +8 -1
  579. package/UI/Styles/Theme.css +14 -2
  580. package/Utils/AI/InvestigationReport.ts +121 -15
  581. package/Utils/AiRemediation/CommandPolicy.ts +1 -1
  582. package/Utils/AiRemediation/KubectlPolicy.ts +1 -1
  583. package/Utils/AiRemediation/Resource/CephCommandPolicy.ts +1936 -0
  584. package/Utils/AiRemediation/Resource/DatabaseCommandPolicy.ts +166 -0
  585. package/Utils/AiRemediation/Resource/DatabaseDiagnosticCatalog.ts +1532 -0
  586. package/Utils/AiRemediation/Resource/DatabaseQueryRedactor.ts +1394 -0
  587. package/Utils/AiRemediation/Resource/DockerCliGrammar.ts +1839 -0
  588. package/Utils/AiRemediation/Resource/DockerEngineCommandPolicy.ts +490 -0
  589. package/Utils/AiRemediation/Resource/DockerSwarmCommandPolicy.ts +687 -0
  590. package/Utils/AiRemediation/Resource/GovcCommandPolicy.ts +2096 -0
  591. package/Utils/AiRemediation/Resource/HostCommandPolicy.ts +2982 -0
  592. package/Utils/AiRemediation/Resource/ProxmoxCommandPolicy.ts +1679 -0
  593. package/Utils/AiRemediation/Resource/ResourceCommandPolicy.ts +851 -0
  594. package/Utils/AiRemediation/Resource/ResourceCommandPolicyCore.ts +593 -0
  595. package/Utils/AiRemediation/Resource/ResourceOutputRedactor.ts +2812 -0
  596. package/Utils/Dashboard/DashboardTimeRangeZoom.ts +46 -2
  597. package/Utils/SessionReplay/SessionReplayBudgetMetricType.ts +184 -0
  598. package/build/dist/Models/DatabaseModels/AutoRemediationSuggestion.js +62 -0
  599. package/build/dist/Models/DatabaseModels/AutoRemediationSuggestion.js.map +1 -1
  600. package/build/dist/Models/DatabaseModels/CephCluster.js +219 -0
  601. package/build/dist/Models/DatabaseModels/CephCluster.js.map +1 -1
  602. package/build/dist/Models/DatabaseModels/DatabaseServer.js +219 -0
  603. package/build/dist/Models/DatabaseModels/DatabaseServer.js.map +1 -1
  604. package/build/dist/Models/DatabaseModels/DockerHost.js +219 -0
  605. package/build/dist/Models/DatabaseModels/DockerHost.js.map +1 -1
  606. package/build/dist/Models/DatabaseModels/DockerSwarmCluster.js +219 -0
  607. package/build/dist/Models/DatabaseModels/DockerSwarmCluster.js.map +1 -1
  608. package/build/dist/Models/DatabaseModels/GlobalConfig.js +1 -1
  609. package/build/dist/Models/DatabaseModels/GlobalConfig.js.map +1 -1
  610. package/build/dist/Models/DatabaseModels/Host.js +219 -0
  611. package/build/dist/Models/DatabaseModels/Host.js.map +1 -1
  612. package/build/dist/Models/DatabaseModels/Index.js +4 -0
  613. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  614. package/build/dist/Models/DatabaseModels/KubernetesAiAgent.js +385 -0
  615. package/build/dist/Models/DatabaseModels/KubernetesAiAgent.js.map +1 -0
  616. package/build/dist/Models/DatabaseModels/KubernetesCluster.js +3 -3
  617. package/build/dist/Models/DatabaseModels/KubernetesCluster.js.map +1 -1
  618. package/build/dist/Models/DatabaseModels/PodmanHost.js +219 -0
  619. package/build/dist/Models/DatabaseModels/PodmanHost.js.map +1 -1
  620. package/build/dist/Models/DatabaseModels/Project.js +56 -5
  621. package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
  622. package/build/dist/Models/DatabaseModels/ProxmoxCluster.js +219 -0
  623. package/build/dist/Models/DatabaseModels/ProxmoxCluster.js.map +1 -1
  624. package/build/dist/Models/DatabaseModels/ProxmoxResource.js +51 -1
  625. package/build/dist/Models/DatabaseModels/ProxmoxResource.js.map +1 -1
  626. package/build/dist/Models/DatabaseModels/ResourceAiAgent.js +439 -0
  627. package/build/dist/Models/DatabaseModels/ResourceAiAgent.js.map +1 -0
  628. package/build/dist/Models/DatabaseModels/RunnerJob.js +219 -0
  629. package/build/dist/Models/DatabaseModels/RunnerJob.js.map +1 -1
  630. package/build/dist/Models/DatabaseModels/TeamComplianceSetting.js +134 -3
  631. package/build/dist/Models/DatabaseModels/TeamComplianceSetting.js.map +1 -1
  632. package/build/dist/Models/DatabaseModels/VMwareVCenter.js +219 -0
  633. package/build/dist/Models/DatabaseModels/VMwareVCenter.js.map +1 -1
  634. package/build/dist/Models/DatabaseModels/WorkspaceProjectAuthToken.js.map +1 -1
  635. package/build/dist/Server/API/AIChatAPI.js +6 -1
  636. package/build/dist/Server/API/AIChatAPI.js.map +1 -1
  637. package/build/dist/Server/API/AIInvestigationAPI.js +17 -10
  638. package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
  639. package/build/dist/Server/API/AutoRemediationAPI.js +374 -24
  640. package/build/dist/Server/API/AutoRemediationAPI.js.map +1 -1
  641. package/build/dist/Server/API/KubernetesClusterAiAccessAPI.js +436 -22
  642. package/build/dist/Server/API/KubernetesClusterAiAccessAPI.js.map +1 -1
  643. package/build/dist/Server/API/MicrosoftTeamsAPI.js +69 -13
  644. package/build/dist/Server/API/MicrosoftTeamsAPI.js.map +1 -1
  645. package/build/dist/Server/API/ProxmoxResourceAPI.js +187 -14
  646. package/build/dist/Server/API/ProxmoxResourceAPI.js.map +1 -1
  647. package/build/dist/Server/API/ResourceAiAccessAPI.js +1119 -0
  648. package/build/dist/Server/API/ResourceAiAccessAPI.js.map +1 -0
  649. package/build/dist/Server/Infrastructure/GlobalCache.js +27 -0
  650. package/build/dist/Server/Infrastructure/GlobalCache.js.map +1 -1
  651. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796000000000-AddTeamComplianceRuleScope.js +50 -0
  652. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796000000000-AddTeamComplianceRuleScope.js.map +1 -0
  653. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796100000000-AddKubernetesAiAgentAndAiDefaults.js +84 -0
  654. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796100000000-AddKubernetesAiAgentAndAiDefaults.js.map +1 -0
  655. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796200000000-AddProxmoxResourceNativePushColumns.js +31 -0
  656. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796200000000-AddProxmoxResourceNativePushColumns.js.map +1 -0
  657. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796300000000-AddResourceAiAgents.js +168 -0
  658. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796300000000-AddResourceAiAgents.js.map +1 -0
  659. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +8 -0
  660. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  661. package/build/dist/Server/Infrastructure/Semaphore.js +6 -0
  662. package/build/dist/Server/Infrastructure/Semaphore.js.map +1 -1
  663. package/build/dist/Server/Middleware/TelemetryIngest.js +41 -19
  664. package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
  665. package/build/dist/Server/Services/AIService.js +59 -1
  666. package/build/dist/Server/Services/AIService.js.map +1 -1
  667. package/build/dist/Server/Services/AlertService.js +248 -13
  668. package/build/dist/Server/Services/AlertService.js.map +1 -1
  669. package/build/dist/Server/Services/AlertSeverityService.js +51 -15
  670. package/build/dist/Server/Services/AlertSeverityService.js.map +1 -1
  671. package/build/dist/Server/Services/AnalyticsDatabaseService.js +26 -1
  672. package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
  673. package/build/dist/Server/Services/AutoRemediationRuleEngineService.js +601 -3
  674. package/build/dist/Server/Services/AutoRemediationRuleEngineService.js.map +1 -1
  675. package/build/dist/Server/Services/AutoRemediationRuleService.js +1 -1
  676. package/build/dist/Server/Services/AutoRemediationRuleService.js.map +1 -1
  677. package/build/dist/Server/Services/CephClusterService.js +104 -0
  678. package/build/dist/Server/Services/CephClusterService.js.map +1 -1
  679. package/build/dist/Server/Services/DatabaseServerService.js +99 -0
  680. package/build/dist/Server/Services/DatabaseServerService.js.map +1 -1
  681. package/build/dist/Server/Services/DockerHostService.js +104 -0
  682. package/build/dist/Server/Services/DockerHostService.js.map +1 -1
  683. package/build/dist/Server/Services/DockerSwarmClusterService.js +104 -0
  684. package/build/dist/Server/Services/DockerSwarmClusterService.js.map +1 -1
  685. package/build/dist/Server/Services/HostService.js +114 -2
  686. package/build/dist/Server/Services/HostService.js.map +1 -1
  687. package/build/dist/Server/Services/IncidentService.js +199 -72
  688. package/build/dist/Server/Services/IncidentService.js.map +1 -1
  689. package/build/dist/Server/Services/IncidentSeverityService.js +51 -15
  690. package/build/dist/Server/Services/IncidentSeverityService.js.map +1 -1
  691. package/build/dist/Server/Services/KubernetesAiAgentJobService.js +158 -0
  692. package/build/dist/Server/Services/KubernetesAiAgentJobService.js.map +1 -0
  693. package/build/dist/Server/Services/KubernetesAiAgentService.js +1145 -0
  694. package/build/dist/Server/Services/KubernetesAiAgentService.js.map +1 -0
  695. package/build/dist/Server/Services/KubernetesClusterAiAccessService.js +842 -371
  696. package/build/dist/Server/Services/KubernetesClusterAiAccessService.js.map +1 -1
  697. package/build/dist/Server/Services/KubernetesClusterService.js +86 -17
  698. package/build/dist/Server/Services/KubernetesClusterService.js.map +1 -1
  699. package/build/dist/Server/Services/MetricRecordingRuleService.js +46 -0
  700. package/build/dist/Server/Services/MetricRecordingRuleService.js.map +1 -1
  701. package/build/dist/Server/Services/PodmanHostService.js +104 -0
  702. package/build/dist/Server/Services/PodmanHostService.js.map +1 -1
  703. package/build/dist/Server/Services/ProjectService.js +22 -0
  704. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  705. package/build/dist/Server/Services/ProxmoxClusterService.js +104 -0
  706. package/build/dist/Server/Services/ProxmoxClusterService.js.map +1 -1
  707. package/build/dist/Server/Services/ProxmoxResourceService.js +258 -3
  708. package/build/dist/Server/Services/ProxmoxResourceService.js.map +1 -1
  709. package/build/dist/Server/Services/ResourceAiAccessService.js +1028 -0
  710. package/build/dist/Server/Services/ResourceAiAccessService.js.map +1 -0
  711. package/build/dist/Server/Services/ResourceAiAgentJobService.js +173 -0
  712. package/build/dist/Server/Services/ResourceAiAgentJobService.js.map +1 -0
  713. package/build/dist/Server/Services/ResourceAiAgentService.js +1687 -0
  714. package/build/dist/Server/Services/ResourceAiAgentService.js.map +1 -0
  715. package/build/dist/Server/Services/RunnerJobService.js +522 -97
  716. package/build/dist/Server/Services/RunnerJobService.js.map +1 -1
  717. package/build/dist/Server/Services/RunnerService.js +1 -1
  718. package/build/dist/Server/Services/RunnerService.js.map +1 -1
  719. package/build/dist/Server/Services/ScheduledMaintenanceService.js +535 -3
  720. package/build/dist/Server/Services/ScheduledMaintenanceService.js.map +1 -1
  721. package/build/dist/Server/Services/ScheduledMaintenanceStateTimelineService.js +316 -46
  722. package/build/dist/Server/Services/ScheduledMaintenanceStateTimelineService.js.map +1 -1
  723. package/build/dist/Server/Services/TeamComplianceSettingService.js +833 -7
  724. package/build/dist/Server/Services/TeamComplianceSettingService.js.map +1 -1
  725. package/build/dist/Server/Services/TelemetryUsageBillingService.js +26 -0
  726. package/build/dist/Server/Services/TelemetryUsageBillingService.js.map +1 -1
  727. package/build/dist/Server/Services/TraceRecordingRuleService.js +37 -0
  728. package/build/dist/Server/Services/TraceRecordingRuleService.js.map +1 -1
  729. package/build/dist/Server/Services/VMwareVCenterService.js +104 -0
  730. package/build/dist/Server/Services/VMwareVCenterService.js.map +1 -1
  731. package/build/dist/Server/Utils/AI/ClusterAccess/ClusterAccessContext.js +52 -9
  732. package/build/dist/Server/Utils/AI/ClusterAccess/ClusterAccessContext.js.map +1 -1
  733. package/build/dist/Server/Utils/AI/ClusterAccess/KubectlInvestigationToolkit.js +13 -9
  734. package/build/dist/Server/Utils/AI/ClusterAccess/KubectlInvestigationToolkit.js.map +1 -1
  735. package/build/dist/Server/Utils/AI/ClusterAccess/KubectlJobRunner.js +7 -3
  736. package/build/dist/Server/Utils/AI/ClusterAccess/KubectlJobRunner.js.map +1 -1
  737. package/build/dist/Server/Utils/AI/Remediation/RemediationCommandTools.js +1056 -43
  738. package/build/dist/Server/Utils/AI/Remediation/RemediationCommandTools.js.map +1 -1
  739. package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js +683 -42
  740. package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js.map +1 -1
  741. package/build/dist/Server/Utils/AI/Remediation/RemediationPlanRunner.js +21 -1
  742. package/build/dist/Server/Utils/AI/Remediation/RemediationPlanRunner.js.map +1 -1
  743. package/build/dist/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.js +330 -0
  744. package/build/dist/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.js.map +1 -0
  745. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAccessContext.js +160 -0
  746. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAccessContext.js.map +1 -0
  747. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAccessToolNames.js +33 -0
  748. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAccessToolNames.js.map +1 -0
  749. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAiAccessSettings.js +640 -0
  750. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAiAccessSettings.js.map +1 -0
  751. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAiDeleteCleanup.js +226 -0
  752. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAiDeleteCleanup.js.map +1 -0
  753. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.js +600 -0
  754. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.js.map +1 -0
  755. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js +89 -9
  756. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -1
  757. package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js +55 -4
  758. package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js.map +1 -1
  759. package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js +55 -4
  760. package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js.map +1 -1
  761. package/build/dist/Server/Utils/AI/SRE/IncidentPostmortemRunner.js +30 -3
  762. package/build/dist/Server/Utils/AI/SRE/IncidentPostmortemRunner.js.map +1 -1
  763. package/build/dist/Server/Utils/AI/SRE/InvestigationEligibility.js +13 -2
  764. package/build/dist/Server/Utils/AI/SRE/InvestigationEligibility.js.map +1 -1
  765. package/build/dist/Server/Utils/AI/SRE/InvestigationGrader.js +1 -1
  766. package/build/dist/Server/Utils/AutoRemediation/CommandPlanExecutor.js +294 -15
  767. package/build/dist/Server/Utils/AutoRemediation/CommandPlanExecutor.js.map +1 -1
  768. package/build/dist/Server/Utils/AutoRemediation/RemediationVerifier.js +29 -1
  769. package/build/dist/Server/Utils/AutoRemediation/RemediationVerifier.js.map +1 -1
  770. package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js +9 -1
  771. package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js.map +1 -1
  772. package/build/dist/Server/Utils/SessionReplay/SessionReplayBudgetMetrics.js +627 -0
  773. package/build/dist/Server/Utils/SessionReplay/SessionReplayBudgetMetrics.js.map +1 -0
  774. package/build/dist/Server/Utils/SessionReplay/SessionReplayUsage.js +60 -5
  775. package/build/dist/Server/Utils/SessionReplay/SessionReplayUsage.js.map +1 -1
  776. package/build/dist/Server/Utils/Telemetry/InventoryEntityRegistry.js +111 -6
  777. package/build/dist/Server/Utils/Telemetry/InventoryEntityRegistry.js.map +1 -1
  778. package/build/dist/Server/Utils/Telemetry/ProxmoxCephSnapshotScan.js +40 -4
  779. package/build/dist/Server/Utils/Telemetry/ProxmoxCephSnapshotScan.js.map +1 -1
  780. package/build/dist/Server/Utils/Telemetry/ProxmoxNativeNodeLiveness.js +296 -0
  781. package/build/dist/Server/Utils/Telemetry/ProxmoxNativeNodeLiveness.js.map +1 -0
  782. package/build/dist/Server/Utils/Telemetry/ProxmoxNativePush.js +699 -0
  783. package/build/dist/Server/Utils/Telemetry/ProxmoxNativePush.js.map +1 -0
  784. package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js +77 -19
  785. package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js.map +1 -1
  786. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Alert.js +19 -15
  787. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Alert.js.map +1 -1
  788. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/AlertEpisode.js +19 -15
  789. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/AlertEpisode.js.map +1 -1
  790. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Auth.js +17 -1
  791. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Auth.js.map +1 -1
  792. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.js +183 -209
  793. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.js.map +1 -1
  794. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.js +19 -15
  795. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.js.map +1 -1
  796. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/ScheduledMaintenance.js +233 -167
  797. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/ScheduledMaintenance.js.map +1 -1
  798. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +768 -152
  799. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
  800. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsActivityDeduplicator.js +129 -0
  801. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsActivityDeduplicator.js.map +1 -0
  802. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCardChoices.js +266 -0
  803. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCardChoices.js.map +1 -0
  804. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateCommands.js +258 -0
  805. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateCommands.js.map +1 -0
  806. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsMessageSize.js +104 -0
  807. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsMessageSize.js.map +1 -0
  808. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsReplies.js +183 -0
  809. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsReplies.js.map +1 -0
  810. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsTimezone.js +123 -0
  811. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsTimezone.js.map +1 -0
  812. package/build/dist/Types/AI/AIRunType.js +9 -4
  813. package/build/dist/Types/AI/AIRunType.js.map +1 -1
  814. package/build/dist/Types/AI/ResourceAiAccessApi.js +30 -0
  815. package/build/dist/Types/AI/ResourceAiAccessApi.js.map +1 -0
  816. package/build/dist/Types/AI/ResourceAiAccessPermissions.js +98 -0
  817. package/build/dist/Types/AI/ResourceAiAccessPermissions.js.map +1 -0
  818. package/build/dist/Types/AutoRemediation/AiRemediationCommandPlan.js +126 -45
  819. package/build/dist/Types/AutoRemediation/AiRemediationCommandPlan.js.map +1 -1
  820. package/build/dist/Types/AutoRemediation/AiRemediationCommandPolicyVerdict.js +28 -0
  821. package/build/dist/Types/AutoRemediation/AiRemediationCommandPolicyVerdict.js.map +1 -0
  822. package/build/dist/Types/Kubernetes/KubernetesClusterAiAccess.js +72 -16
  823. package/build/dist/Types/Kubernetes/KubernetesClusterAiAccess.js.map +1 -1
  824. package/build/dist/Types/Kubernetes/KubernetesClusterAiAccessPermissions.js +20 -16
  825. package/build/dist/Types/Kubernetes/KubernetesClusterAiAccessPermissions.js.map +1 -1
  826. package/build/dist/Types/Kubernetes/KubernetesClusterAiInsights.js +17 -0
  827. package/build/dist/Types/Kubernetes/KubernetesClusterAiInsights.js.map +1 -0
  828. package/build/dist/Types/Monitor/ProxmoxAlertTemplates.js +4 -4
  829. package/build/dist/Types/Monitor/ProxmoxAlertTemplates.js.map +1 -1
  830. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js +47 -21
  831. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js.map +1 -1
  832. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js +5 -0
  833. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js.map +1 -1
  834. package/build/dist/Types/Monitor/RumAlertTemplates.js +199 -3
  835. package/build/dist/Types/Monitor/RumAlertTemplates.js.map +1 -1
  836. package/build/dist/Types/ResourceAiAgent/AiResourceType.js +242 -0
  837. package/build/dist/Types/ResourceAiAgent/AiResourceType.js.map +1 -0
  838. package/build/dist/Types/ResourceAiAgent/ResourceAiAccess.js +275 -0
  839. package/build/dist/Types/ResourceAiAgent/ResourceAiAccess.js.map +1 -0
  840. package/build/dist/Types/Rum/SessionReplayBudgetMetricType.js +45 -0
  841. package/build/dist/Types/Rum/SessionReplayBudgetMetricType.js.map +1 -0
  842. package/build/dist/Types/Runbook/RunbookStepType.js +27 -0
  843. package/build/dist/Types/Runbook/RunbookStepType.js.map +1 -1
  844. package/build/dist/Types/Team/ComplianceNotificationChannel.js +23 -0
  845. package/build/dist/Types/Team/ComplianceNotificationChannel.js.map +1 -0
  846. package/build/dist/Types/Team/ComplianceRule.js +304 -0
  847. package/build/dist/Types/Team/ComplianceRule.js.map +1 -0
  848. package/build/dist/Types/Team/ComplianceRuleType.js +21 -0
  849. package/build/dist/Types/Team/ComplianceRuleType.js.map +1 -1
  850. package/build/dist/Types/Team/TeamComplianceStatus.js +2 -0
  851. package/build/dist/Types/Team/TeamComplianceStatus.js.map +1 -0
  852. package/build/dist/Types/Telemetry/TelemetryIngestSurface.js +36 -0
  853. package/build/dist/Types/Telemetry/TelemetryIngestSurface.js.map +1 -1
  854. package/build/dist/UI/Components/ActionButton/ActionButtonSchema.js +20 -1
  855. package/build/dist/UI/Components/ActionButton/ActionButtonSchema.js.map +1 -1
  856. package/build/dist/UI/Components/ActionButton/RowActions.js +113 -0
  857. package/build/dist/UI/Components/ActionButton/RowActions.js.map +1 -0
  858. package/build/dist/UI/Components/ActionButton/SplitActionButtons.js +71 -0
  859. package/build/dist/UI/Components/ActionButton/SplitActionButtons.js.map +1 -0
  860. package/build/dist/UI/Components/Charts/Area/AreaChart.js +16 -1
  861. package/build/dist/UI/Components/Charts/Area/AreaChart.js.map +1 -1
  862. package/build/dist/UI/Components/Charts/Bar/BarChart.js +16 -1
  863. package/build/dist/UI/Components/Charts/Bar/BarChart.js.map +1 -1
  864. package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js +27 -5
  865. package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js.map +1 -1
  866. package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js +61 -194
  867. package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js.map +1 -1
  868. package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js +84 -26
  869. package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js.map +1 -1
  870. package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js +75 -196
  871. package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js.map +1 -1
  872. package/build/dist/UI/Components/Charts/ChartLibrary/Utils/DoubleClick.js +133 -0
  873. package/build/dist/UI/Components/Charts/ChartLibrary/Utils/DoubleClick.js.map +1 -1
  874. package/build/dist/UI/Components/Charts/ChartLibrary/Utils/UseChartBucketsChange.js +26 -0
  875. package/build/dist/UI/Components/Charts/ChartLibrary/Utils/UseChartBucketsChange.js.map +1 -0
  876. package/build/dist/UI/Components/Charts/ChartLibrary/Utils/UseChartRangeSelection.js +371 -0
  877. package/build/dist/UI/Components/Charts/ChartLibrary/Utils/UseChartRangeSelection.js.map +1 -0
  878. package/build/dist/UI/Components/Charts/Line/LineChart.js +16 -1
  879. package/build/dist/UI/Components/Charts/Line/LineChart.js.map +1 -1
  880. package/build/dist/UI/Components/Charts/TimeRangeZoom/ResetTimeRangeZoomButton.js +35 -0
  881. package/build/dist/UI/Components/Charts/TimeRangeZoom/ResetTimeRangeZoomButton.js.map +1 -0
  882. package/build/dist/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomContext.js +107 -0
  883. package/build/dist/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomContext.js.map +1 -0
  884. package/build/dist/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomHint.js +41 -0
  885. package/build/dist/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomHint.js.map +1 -0
  886. package/build/dist/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomUtil.js +117 -0
  887. package/build/dist/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomUtil.js.map +1 -0
  888. package/build/dist/UI/Components/Charts/TimeRangeZoom/UseTimeRangeZoom.js +121 -0
  889. package/build/dist/UI/Components/Charts/TimeRangeZoom/UseTimeRangeZoom.js.map +1 -0
  890. package/build/dist/UI/Components/Charts/Utils/DataPoint.js +15 -7
  891. package/build/dist/UI/Components/Charts/Utils/DataPoint.js.map +1 -1
  892. package/build/dist/UI/Components/Charts/Utils/XAxis.js +70 -0
  893. package/build/dist/UI/Components/Charts/Utils/XAxis.js.map +1 -1
  894. package/build/dist/UI/Components/Charts/Utils/useHistogramRangeSelection.js +305 -38
  895. package/build/dist/UI/Components/Charts/Utils/useHistogramRangeSelection.js.map +1 -1
  896. package/build/dist/UI/Components/EntityDropdown/EntityDropdown.js +89 -14
  897. package/build/dist/UI/Components/EntityDropdown/EntityDropdown.js.map +1 -1
  898. package/build/dist/UI/Components/Forms/Fields/FormField.js +11 -2
  899. package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
  900. package/build/dist/UI/Components/Input/Input.js +69 -54
  901. package/build/dist/UI/Components/Input/Input.js.map +1 -1
  902. package/build/dist/UI/Components/List/ListRow.js +4 -39
  903. package/build/dist/UI/Components/List/ListRow.js.map +1 -1
  904. package/build/dist/UI/Components/LogsViewer/LogsViewer.js +31 -8
  905. package/build/dist/UI/Components/LogsViewer/LogsViewer.js.map +1 -1
  906. package/build/dist/UI/Components/LogsViewer/components/LogTimeRangePicker.js +10 -1
  907. package/build/dist/UI/Components/LogsViewer/components/LogTimeRangePicker.js.map +1 -1
  908. package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js +139 -21
  909. package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js.map +1 -1
  910. package/build/dist/UI/Components/LogsViewer/components/LogsHistogram.js +30 -8
  911. package/build/dist/UI/Components/LogsViewer/components/LogsHistogram.js.map +1 -1
  912. package/build/dist/UI/Components/LogsViewer/components/LogsViewerToolbar.js +1 -1
  913. package/build/dist/UI/Components/LogsViewer/components/LogsViewerToolbar.js.map +1 -1
  914. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +10 -0
  915. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  916. package/build/dist/UI/Components/MoreMenu/MoreMenu.js +253 -14
  917. package/build/dist/UI/Components/MoreMenu/MoreMenu.js.map +1 -1
  918. package/build/dist/UI/Components/MoreMenu/MoreMenuItem.js +43 -13
  919. package/build/dist/UI/Components/MoreMenu/MoreMenuItem.js.map +1 -1
  920. package/build/dist/UI/Components/OrderedStatesList/Item.js +2 -38
  921. package/build/dist/UI/Components/OrderedStatesList/Item.js.map +1 -1
  922. package/build/dist/UI/Components/StatusPage/ResourceGrid.js +53 -15
  923. package/build/dist/UI/Components/StatusPage/ResourceGrid.js.map +1 -1
  924. package/build/dist/UI/Components/Table/TableBody.js +6 -2
  925. package/build/dist/UI/Components/Table/TableBody.js.map +1 -1
  926. package/build/dist/UI/Components/Table/TableRow.js +12 -75
  927. package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
  928. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js +32 -7
  929. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js.map +1 -1
  930. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js +27 -9
  931. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js.map +1 -1
  932. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.js +11 -1
  933. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.js.map +1 -1
  934. package/build/dist/UI/Components/TelemetryViewer/useViewerTimeRangeZoom.js +272 -0
  935. package/build/dist/UI/Components/TelemetryViewer/useViewerTimeRangeZoom.js.map +1 -0
  936. package/build/dist/UI/Components/Toggle/Toggle.js +14 -1
  937. package/build/dist/UI/Components/Toggle/Toggle.js.map +1 -1
  938. package/build/dist/UI/Components/Tooltip/Tooltip.js +1 -1
  939. package/build/dist/UI/Components/Tooltip/Tooltip.js.map +1 -1
  940. package/build/dist/Utils/AI/InvestigationReport.js +71 -11
  941. package/build/dist/Utils/AI/InvestigationReport.js.map +1 -1
  942. package/build/dist/Utils/AiRemediation/CommandPolicy.js +1 -1
  943. package/build/dist/Utils/AiRemediation/CommandPolicy.js.map +1 -1
  944. package/build/dist/Utils/AiRemediation/KubectlPolicy.js +1 -1
  945. package/build/dist/Utils/AiRemediation/KubectlPolicy.js.map +1 -1
  946. package/build/dist/Utils/AiRemediation/Resource/CephCommandPolicy.js +1462 -0
  947. package/build/dist/Utils/AiRemediation/Resource/CephCommandPolicy.js.map +1 -0
  948. package/build/dist/Utils/AiRemediation/Resource/DatabaseCommandPolicy.js +122 -0
  949. package/build/dist/Utils/AiRemediation/Resource/DatabaseCommandPolicy.js.map +1 -0
  950. package/build/dist/Utils/AiRemediation/Resource/DatabaseDiagnosticCatalog.js +1139 -0
  951. package/build/dist/Utils/AiRemediation/Resource/DatabaseDiagnosticCatalog.js.map +1 -0
  952. package/build/dist/Utils/AiRemediation/Resource/DatabaseQueryRedactor.js +1060 -0
  953. package/build/dist/Utils/AiRemediation/Resource/DatabaseQueryRedactor.js.map +1 -0
  954. package/build/dist/Utils/AiRemediation/Resource/DockerCliGrammar.js +1301 -0
  955. package/build/dist/Utils/AiRemediation/Resource/DockerCliGrammar.js.map +1 -0
  956. package/build/dist/Utils/AiRemediation/Resource/DockerEngineCommandPolicy.js +370 -0
  957. package/build/dist/Utils/AiRemediation/Resource/DockerEngineCommandPolicy.js.map +1 -0
  958. package/build/dist/Utils/AiRemediation/Resource/DockerSwarmCommandPolicy.js +498 -0
  959. package/build/dist/Utils/AiRemediation/Resource/DockerSwarmCommandPolicy.js.map +1 -0
  960. package/build/dist/Utils/AiRemediation/Resource/GovcCommandPolicy.js +1565 -0
  961. package/build/dist/Utils/AiRemediation/Resource/GovcCommandPolicy.js.map +1 -0
  962. package/build/dist/Utils/AiRemediation/Resource/HostCommandPolicy.js +2206 -0
  963. package/build/dist/Utils/AiRemediation/Resource/HostCommandPolicy.js.map +1 -0
  964. package/build/dist/Utils/AiRemediation/Resource/ProxmoxCommandPolicy.js +1129 -0
  965. package/build/dist/Utils/AiRemediation/Resource/ProxmoxCommandPolicy.js.map +1 -0
  966. package/build/dist/Utils/AiRemediation/Resource/ResourceCommandPolicy.js +565 -0
  967. package/build/dist/Utils/AiRemediation/Resource/ResourceCommandPolicy.js.map +1 -0
  968. package/build/dist/Utils/AiRemediation/Resource/ResourceCommandPolicyCore.js +408 -0
  969. package/build/dist/Utils/AiRemediation/Resource/ResourceCommandPolicyCore.js.map +1 -0
  970. package/build/dist/Utils/AiRemediation/Resource/ResourceOutputRedactor.js +1910 -0
  971. package/build/dist/Utils/AiRemediation/Resource/ResourceOutputRedactor.js.map +1 -0
  972. package/build/dist/Utils/Dashboard/DashboardTimeRangeZoom.js +27 -1
  973. package/build/dist/Utils/Dashboard/DashboardTimeRangeZoom.js.map +1 -1
  974. package/build/dist/Utils/SessionReplay/SessionReplayBudgetMetricType.js +160 -0
  975. package/build/dist/Utils/SessionReplay/SessionReplayBudgetMetricType.js.map +1 -0
  976. package/package.json +1 -1
@@ -20,13 +20,19 @@ import KubectlPolicy from "../../Utils/AiRemediation/KubectlPolicy";
20
20
  import KubectlOutputRedactor from "../../Utils/AiRemediation/KubectlOutputRedactor";
21
21
  import KubectlWriteScope from "../../Utils/AiRemediation/KubectlWriteScope";
22
22
  import ToolResultSerializer from "../Utils/AI/Toolbox/Serializer";
23
- import { KUBECTL_ALLOW_NODE_OPERATIONS_ENV, KUBECTL_ALLOW_WRITES_ENV, KUBECTL_WRITE_NAMESPACES_ENV, KubectlCommandTier, KubernetesAiRemediationMode, isInClusterPostureForCluster, parseKubernetesRunnerPosture, } from "../../Types/Kubernetes/KubernetesClusterAiAccess";
23
+ import { KUBECTL_ALLOW_NODE_OPERATIONS_ENV, KUBECTL_ALLOW_WRITES_ENV, KUBECTL_WRITE_NAMESPACES_ENV, KubectlCommandTier, KubernetesAiRemediationMode, isInClusterPostureForCluster, parseKubernetesAgentPosture, parseKubernetesRunnerPosture, } from "../../Types/Kubernetes/KubernetesClusterAiAccess";
24
24
  import RunbookCredentialType from "../../Types/Runbook/RunbookCredentialType";
25
25
  import AIRunType from "../../Types/AI/AIRunType";
26
26
  import AIRunService from "./AIRunService";
27
+ import KubernetesClusterAiAccessService, { getKubernetesAiAccessTargetId, } from "./KubernetesClusterAiAccessService";
27
28
  import KubernetesClusterService from "./KubernetesClusterService";
28
29
  import RunbookCredentialService from "./RunbookCredentialService";
29
30
  import RunnerService, { Service as RunnerServiceClass } from "./RunnerService";
31
+ import ResourceAiAccessService, { describeResourceNoun, getResourceAiAgentInstallNextStep, getResourceAiAgentPage, } from "./ResourceAiAccessService";
32
+ import { AI_RESOURCE_TYPE_INFO, isAiResourceType, } from "../../Types/ResourceAiAgent/AiResourceType";
33
+ import { ResourceAiRemediationMode, ResourceCommandTier, parseResourceAiAgentPosture, } from "../../Types/ResourceAiAgent/ResourceAiAccess";
34
+ import ResourceCommandPolicy from "../../Utils/AiRemediation/Resource/ResourceCommandPolicy";
35
+ import { redactResourceCommandOutput } from "../../Utils/AiRemediation/Resource/ResourceOutputRedactor";
30
36
  import QueryHelper from "../Types/Database/QueryHelper";
31
37
  /*
32
38
  * The cluster remediation modes in which a kubectl job for remediation may
@@ -56,6 +62,31 @@ export const MAX_AI_COMMAND_JOBS_PER_PROJECT_PER_HOUR = 30;
56
62
  * ceiling, because every call spends Runner time and LLM budget.
57
63
  */
58
64
  export const MAX_AI_INVESTIGATION_COMMAND_JOBS_PER_PROJECT_PER_HOUR = 240;
65
+ /*
66
+ * The same two brakes for commands on infrastructure resources (Docker,
67
+ * Podman, Swarm, Proxmox, VMware, Ceph, database servers, hosts), counted
68
+ * on their own ResourceCommand rows so a busy hour on one kind of
69
+ * infrastructure never starves the cluster lane, or the other way round.
70
+ */
71
+ export const MAX_AI_INVESTIGATION_RESOURCE_COMMAND_JOBS_PER_PROJECT_PER_HOUR = 240;
72
+ export const MAX_AI_RESOURCE_COMMAND_JOBS_PER_PROJECT_PER_HOUR = 30;
73
+ /*
74
+ * A refusal of the resource command chokepoint. A BadDataException, so
75
+ * every caller that already handles the kubectl chokepoint's refusals
76
+ * handles this one the same way; `refusalCode` says which rule refused it.
77
+ */
78
+ export class ResourceCommandEnqueueRefusedException extends BadDataException {
79
+ constructor(refusalCode, message) {
80
+ super(message);
81
+ this.refusalCode = refusalCode;
82
+ }
83
+ }
84
+ // The resource modes in which a remediation command may be enqueued at all.
85
+ const ENABLED_RESOURCE_REMEDIATION_MODES = [
86
+ ResourceAiRemediationMode.RequireApproval,
87
+ ResourceAiRemediationMode.Automatic,
88
+ ResourceAiRemediationMode.BypassApproval,
89
+ ];
59
90
  import SortOrder from "../../Types/BaseDatabase/SortOrder";
60
91
  import OneUptimeDate from "../../Types/Date";
61
92
  import PostgresAppInstance from "../Infrastructure/PostgresDatabase";
@@ -133,6 +164,10 @@ function keepSurrogatePairOnly(match) {
133
164
  : RUNNER_JOB_UNSTORABLE_CHARACTER_REPLACEMENT;
134
165
  }
135
166
  export function describeRunnerJobTimeout(data) {
167
+ if (data.stepType === RunbookStepType.ResourceCommand &&
168
+ AI_COMMAND_JOB_ORIGINS.includes(data.origin || RunnerJobOrigin.Runbook)) {
169
+ return describeResourceCommandTimeout(data);
170
+ }
136
171
  const isAiKubectl = data.stepType === RunbookStepType.Kubectl &&
137
172
  AI_COMMAND_JOB_ORIGINS.includes(data.origin || RunnerJobOrigin.Runbook);
138
173
  if (!isAiKubectl) {
@@ -155,18 +190,49 @@ export function describeRunnerJobTimeout(data) {
155
190
  const kind = data.kind === "overall" && data.wasClaimed === false
156
191
  ? "unclaimed"
157
192
  : data.kind;
193
+ const executor = data.isForKubernetesAiAgent
194
+ ? "The cluster's Kubernetes AI agent"
195
+ : "The cluster's Runner";
158
196
  switch (kind) {
159
197
  case "unclaimed":
160
- return `The cluster's Runner did not pick up this kubectl command within ${describeSeconds(data.claimTimeoutInMs)} — it may be offline, restarting or busy with other work. Nothing was run on the cluster.`;
198
+ return `${executor} did not pick up this kubectl command within ${describeSeconds(data.claimTimeoutInMs)} — it may be offline, restarting or busy with other work. Nothing was run on the cluster.`;
161
199
  case "lease_expired":
162
- return `The cluster's Runner stopped responding while this kubectl command was running — it may have restarted or lost its connection. What the command did is unknown.${checkFirst}`;
200
+ return `${executor} stopped responding while this kubectl command was running — it may have restarted or lost its connection. What the command did is unknown.${checkFirst}`;
163
201
  default:
164
- return `The cluster's Runner did not report a result for this kubectl command in time — kubectl may have outlived its ${describeSeconds(data.executionTimeoutInMs)} timeout. What the command did is unknown.${checkFirst}`;
202
+ return `${executor} did not report a result for this kubectl command in time — kubectl may have outlived its ${describeSeconds(data.executionTimeoutInMs)} timeout. What the command did is unknown.${checkFirst}`;
165
203
  }
166
204
  }
167
205
  function describeSeconds(milliseconds) {
168
206
  return `${Math.max(1, Math.round(milliseconds / 1000))}s`;
169
207
  }
208
+ /*
209
+ * The same three reasons for a command on an infrastructure resource, run
210
+ * by that resource's AI agent: "nobody picked it up" (nothing ran) versus
211
+ * "it was picked up and then went silent" (what it did is unknown), naming
212
+ * the agent ("the Docker AI agent") and the resource ("the Docker host").
213
+ */
214
+ function describeResourceCommandTimeout(data) {
215
+ const agentName = isAiResourceType(data.resourceType)
216
+ ? AI_RESOURCE_TYPE_INFO[data.resourceType].agentDisplayName
217
+ : "resource's AI agent";
218
+ const noun = isAiResourceType(data.resourceType)
219
+ ? describeResourceNoun(data.resourceType)
220
+ : "resource";
221
+ const checkFirst = data.origin === RunnerJobOrigin.AiRemediation
222
+ ? ` Check the ${noun} before running a change again.`
223
+ : "";
224
+ const kind = data.kind === "overall" && data.wasClaimed === false
225
+ ? "unclaimed"
226
+ : data.kind;
227
+ switch (kind) {
228
+ case "unclaimed":
229
+ return `The ${agentName} did not pick up the command in time (within ${describeSeconds(data.claimTimeoutInMs)}) — it may be offline, restarting or busy with other work. Nothing was run on the ${noun}.`;
230
+ case "lease_expired":
231
+ return `The ${agentName} stopped responding while this command was running — it may have restarted or lost its connection. What the command did is unknown.${checkFirst}`;
232
+ default:
233
+ return `The ${agentName} did not report a result for this command in time — the command may have outlived its ${describeSeconds(data.executionTimeoutInMs)} timeout. What the command did is unknown.${checkFirst}`;
234
+ }
235
+ }
170
236
  export class Service extends DatabaseService {
171
237
  constructor() {
172
238
  super(Model);
@@ -214,39 +280,63 @@ export class Service extends DatabaseService {
214
280
  usesCredential: data.usesCredential,
215
281
  });
216
282
  return refusal
217
- ? Service.describeRunnerWriteScopeRefusal(refusal, Service.getRunnerWriteScopeSettings(data.usesCredential))
283
+ ? Service.describeRunnerWriteScopeRefusal(refusal, Service.getRunnerWriteScopeSettings(data.executorKind ||
284
+ (data.usesCredential ? "credential_runner" : "legacy_runner")))
218
285
  : null;
219
286
  }
220
287
  /*
221
- * Where the target Runner's write scope is set, in the words a refusal
222
- * uses. The in-cluster Runner is the Kubernetes agent's: its chart sets
223
- * the scope (and the environment variables behind it), and an upgrade
224
- * changes it. A Runner that reaches the cluster through a Kubernetes
225
- * credential is an ordinary Runner no chart configures: it reports what
226
- * it was started with — ONEUPTIME_KUBECTL_WRITE_NAMESPACES and
227
- * ONEUPTIME_KUBECTL_ALLOW_NODE_OPERATIONS on its own host — and a
228
- * restart picks up a change.
288
+ * Where the target's write scope is set, in the words a refusal uses —
289
+ * three ways, by who runs the command:
290
+ *
291
+ * - the Kubernetes AI agent: the chart's aiAgent.remediation.* values;
292
+ * - the previous in-cluster Runner an older chart installed: its values
293
+ * are aiAccess.remediation.*, and the way to change them now is to
294
+ * upgrade the chart to the AI agent, which replaces the Runner;
295
+ * - a Runner that reaches the cluster through a Kubernetes credential: an
296
+ * ordinary Runner no chart configures, which reports what it was
297
+ * started with — ONEUPTIME_KUBECTL_WRITE_NAMESPACES and
298
+ * ONEUPTIME_KUBECTL_ALLOW_NODE_OPERATIONS on its own host — and picks
299
+ * up a change on restart.
229
300
  */
230
- static getRunnerWriteScopeSettings(usesCredential) {
231
- if (usesCredential) {
301
+ static getRunnerWriteScopeSettings(executorKind) {
302
+ if (executorKind === "credential_runner") {
232
303
  return {
304
+ executor: "the cluster's Runner",
305
+ inClusterExecutor: "the cluster's in-cluster Runner",
306
+ executorShort: "the Runner",
233
307
  nodeOperationsOff: `it was started with ${KUBECTL_ALLOW_NODE_OPERATIONS_ENV} (or ${KUBECTL_ALLOW_WRITES_ENV}) set to something other than true on its host`,
234
308
  allowNodeOperations: `set ${KUBECTL_ALLOW_NODE_OPERATIONS_ENV}=true on that Runner's host and restart it`,
235
309
  namespaces: `${KUBECTL_WRITE_NAMESPACES_ENV} on that Runner's host`,
236
310
  addNamespace: `add it to ${KUBECTL_WRITE_NAMESPACES_ENV} on that Runner's host and restart it`,
237
311
  };
238
312
  }
313
+ if (executorKind === "ai_agent") {
314
+ return {
315
+ executor: "the cluster's Kubernetes AI agent",
316
+ inClusterExecutor: "the cluster's Kubernetes AI agent",
317
+ executorShort: "the AI agent",
318
+ nodeOperationsOff: `it was installed with aiAgent.remediation.nodeOperations=false (${KUBECTL_ALLOW_NODE_OPERATIONS_ENV})`,
319
+ allowNodeOperations: "upgrade the Kubernetes agent chart with --set aiAgent.remediation.nodeOperations=true",
320
+ namespaces: `aiAgent.remediation.namespaces on the Kubernetes agent chart, ${KUBECTL_WRITE_NAMESPACES_ENV}`,
321
+ addNamespace: "add it to aiAgent.remediation.namespaces and upgrade the Kubernetes agent chart",
322
+ };
323
+ }
239
324
  return {
325
+ executor: "the cluster's Runner",
326
+ inClusterExecutor: "the cluster's in-cluster Runner",
327
+ executorShort: "the Runner",
240
328
  nodeOperationsOff: `its Kubernetes agent was installed with aiAccess.remediation.nodeOperations=false (${KUBECTL_ALLOW_NODE_OPERATIONS_ENV})`,
241
- allowNodeOperations: "upgrade the agent with --set aiAccess.remediation.nodeOperations=true",
329
+ allowNodeOperations: "upgrade the Kubernetes agent chart to the Kubernetes AI agent (it replaces the in-cluster Runner) with --set aiAgent.remediation.nodeOperations=true",
242
330
  namespaces: `aiAccess.remediation.namespaces on the Kubernetes agent chart, ${KUBECTL_WRITE_NAMESPACES_ENV}`,
243
- addNamespace: "add it to aiAccess.remediation.namespaces and upgrade the agent",
331
+ addNamespace: "upgrade the Kubernetes agent chart to the Kubernetes AI agent (it replaces the in-cluster Runner) and add it to aiAgent.remediation.namespaces",
244
332
  };
245
333
  }
246
334
  // A write-scope refusal, worded for whoever enqueued the command.
247
335
  static describeRunnerWriteScopeRefusal(refusal, settings) {
248
336
  const command = `"${refusal.displayCommand}"`;
249
- const wouldRefuse = "so the Runner would refuse it. It was not enqueued.";
337
+ const wouldRefuse = `so ${settings.executorShort} would refuse it. It was not enqueued.`;
338
+ const executor = settings.executor;
339
+ const Executor = `${executor.charAt(0).toUpperCase()}${executor.slice(1)}`;
250
340
  const scopeList = `${refusal.writeNamespaces
251
341
  .map((allowed) => {
252
342
  return `"${allowed}"`;
@@ -258,34 +348,34 @@ export class Service extends DatabaseService {
258
348
  case "node_operations":
259
349
  return `${refusal.uncertainty === null
260
350
  ? `${command} changes a node`
261
- : `The cluster's Runner cannot tell for certain whether ${command} changes a node (${refusal.uncertainty})`}, and the cluster's Runner does not allow node operations (cordon, uncordon, drain, taint, or labelling, annotating or patching a Node): ${settings.nodeOperationsOff}, ${wouldRefuse}${fix} To let OneUptime AI change nodes, ${settings.allowNodeOperations}.`;
351
+ : `${Executor} cannot tell for certain whether ${command} changes a node (${refusal.uncertainty})`}, and ${executor} does not allow node operations (cordon, uncordon, drain, taint, or labelling, annotating or patching a Node): ${settings.nodeOperationsOff}, ${wouldRefuse}${fix} To let OneUptime AI change nodes, ${settings.allowNodeOperations}.`;
262
352
  case "objects_uncertain":
263
353
  case "namespace_uncertain":
264
- return `The cluster's Runner cannot tell for certain which ${refusal.code === "namespace_uncertain" ? "namespace" : "objects"} ${command} changes (${refusal.uncertainty}), ${wouldRefuse}${fix}`;
354
+ return `${Executor} cannot tell for certain which ${refusal.code === "namespace_uncertain" ? "namespace" : "objects"} ${command} changes (${refusal.uncertainty}), ${wouldRefuse}${fix}`;
265
355
  case "verb_mismatch":
266
- return `The cluster's Runner reads the verb of ${command} as "${refusal.readVerb}", but the kubectl policy read "${refusal.policyVerb}", so it cannot tell for certain what the command changes, ${wouldRefuse}`;
356
+ return `${Executor} reads the verb of ${command} as "${refusal.readVerb}", but the kubectl policy read "${refusal.policyVerb}", so it cannot tell for certain what the command changes, ${wouldRefuse}`;
267
357
  case "unnamed_namespace_objects":
268
- return `${command} would change Namespace objects without naming them (a selector, --all or no name at all), so the cluster's Runner cannot tell whether one of them is ${refusal.podNamespace
358
+ return `${command} would change Namespace objects without naming them (a selector, --all or no name at all), so ${executor} cannot tell whether one of them is ${refusal.podNamespace
269
359
  ? `"${refusal.podNamespace}", the namespace it runs in`
270
360
  : "outside the namespaces it lets OneUptime AI change"}, ${wouldRefuse}${fix}`;
271
361
  case "cluster_scoped":
272
- return `${command} changes ${refusal.clusterScopedKinds.join(", ")} objects, which are cluster-scoped: they live outside every namespace, so outside the namespaces the cluster's Runner lets OneUptime AI change (${scopeList}) whatever -n says, ${wouldRefuse}`;
362
+ return `${command} changes ${refusal.clusterScopedKinds.join(", ")} objects, which are cluster-scoped: they live outside every namespace, so outside the namespaces ${executor} lets OneUptime AI change (${scopeList}) whatever -n says, ${wouldRefuse}`;
273
363
  case "all_namespaces":
274
- return `${command} would change every namespace, including ones the cluster's Runner may not change, ${wouldRefuse}${fix}`;
364
+ return `${command} would change every namespace, including ones ${executor} may not change, ${wouldRefuse}${fix}`;
275
365
  case "no_namespace":
276
- return `${command} names no namespace, and the cluster's Runner reported no namespace of its own for kubectl to use there, ${wouldRefuse}${fix}`;
366
+ return `${command} names no namespace, and ${executor} reported no namespace of its own for kubectl to use there, ${wouldRefuse}${fix}`;
277
367
  case "own_namespace":
278
368
  return refusal.namespaceSource === "namespace_object"
279
- ? `${command} would change the Namespace object "${namespace}", the namespace the cluster's in-cluster Runner itself runs in. OneUptime AI never changes it — a change there could reconfigure the Kubernetes agent or the Runner — ${wouldRefuse}`
369
+ ? `${command} would change the Namespace object "${namespace}", the namespace ${settings.inClusterExecutor} itself runs in. OneUptime AI never changes it — a change there could reconfigure the Kubernetes agent or ${settings.executorShort} — ${wouldRefuse}`
280
370
  : `${command} would change namespace "${namespace}"${refusal.namespaceSource === "default_namespace"
281
371
  ? " (the command names none, so kubectl would use that one)"
282
- : ""}, the namespace the cluster's in-cluster Runner itself runs in. OneUptime AI never changes it — a change there could scale away the Kubernetes agent or the Runner — ${wouldRefuse} Name the namespace of the workload to fix with -n <namespace>.`;
372
+ : ""}, the namespace ${settings.inClusterExecutor} itself runs in. OneUptime AI never changes it — a change there could scale away the Kubernetes agent or ${settings.executorShort} — ${wouldRefuse} Name the namespace of the workload to fix with -n <namespace>.`;
283
373
  case "outside_scope":
284
374
  return `${command} would change ${refusal.namespaceSource === "namespace_object"
285
375
  ? `the Namespace object "${namespace}" (a Namespace object is judged by its name; -n does not apply to it)`
286
376
  : `namespace "${namespace}"${refusal.namespaceSource === "default_namespace"
287
377
  ? " (the command names none, so kubectl would use that one)"
288
- : ""}`}, which is outside the namespaces the cluster's Runner lets OneUptime AI change (${scopeList}), ${wouldRefuse} To let OneUptime AI change "${namespace}", ${settings.addNamespace}.`;
378
+ : ""}`}, which is outside the namespaces ${executor} lets OneUptime AI change (${scopeList}), ${wouldRefuse} To let OneUptime AI change "${namespace}", ${settings.addNamespace}.`;
289
379
  default: {
290
380
  const unhandled = refusal.code;
291
381
  return unhandled;
@@ -357,6 +447,14 @@ export class Service extends DatabaseService {
357
447
  if (data.stepType === RunbookStepType.Kubectl) {
358
448
  throw new BadDataException("Kubectl commands are enqueued through enqueueAiKubectlCommand.");
359
449
  }
450
+ /*
451
+ * A resource command runs on that resource's own AI agent, never on a
452
+ * Runner: this lane would target a Runner (targetAgentId), which must
453
+ * never be handed one.
454
+ */
455
+ if (data.stepType === RunbookStepType.ResourceCommand) {
456
+ throw new BadDataException("Resource commands run on the resource's AI agent, never on a Runner, and are enqueued through enqueueAiResourceCommand.");
457
+ }
360
458
  const command = (data.command || "").trim();
361
459
  if (!command) {
362
460
  throw new BadDataException("An AI command job needs a command.");
@@ -399,12 +497,15 @@ export class Service extends DatabaseService {
399
497
  * approved-plan and rollback paths — not just the FullAuto inline tool
400
498
  * that has its own pre-check for a friendlier message to the model.
401
499
  * Check-then-act, so a burst of concurrent runs can overshoot slightly;
402
- * the cap is a storm brake, not a quota.
500
+ * the cap is a storm brake, not a quota. Resource commands share the
501
+ * table and the origin but have their own brake, so they never count
502
+ * here (see MAX_AI_RESOURCE_COMMAND_JOBS_PER_PROJECT_PER_HOUR).
403
503
  */
404
504
  const jobsInLastHour = (await this.countBy({
405
505
  query: {
406
506
  projectId: data.projectId,
407
507
  origin: RunnerJobOrigin.AiRemediation,
508
+ stepType: QueryHelper.notEquals(RunbookStepType.ResourceCommand),
408
509
  createdAt: QueryHelper.greaterThan(OneUptimeDate.getSomeHoursAgo(1)),
409
510
  },
410
511
  props: { isRoot: true },
@@ -460,20 +561,27 @@ export class Service extends DatabaseService {
460
561
  * the cluster), and the payload carries the cluster's identifier so the
461
562
  * claim path and the Runner can refuse a job that reaches the wrong pod.
462
563
  * A credential is never sent to a kubernetes-agent Runner (its identity
463
- * is minted with the project's telemetry ingestion key).
564
+ * is minted with the project's telemetry ingestion key), nor to the
565
+ * cluster's Kubernetes AI agent.
566
+ *
567
+ * The target may be the cluster's Kubernetes AI agent (a KubernetesAiAgent
568
+ * row, never a Runner): targetAgentId then names the agent row, and the
569
+ * job is written with targetKubernetesAiAgentId instead, so only that
570
+ * agent can claim it and no Runner ever sees it.
464
571
  *
465
572
  * It also re-reads the cluster's CURRENT AI access configuration, because
466
573
  * every caller acts on a snapshot (an investigation reads the cluster's
467
574
  * status once when it starts, a remediation run when it composes): the
468
- * target must still be the cluster's bound Runner, a credential must still
469
- * be its bound Kubernetes credential, an investigation's reads need "Let
470
- * AI investigate with kubectl" still on, and a remediation run's commands
471
- * (its reads included) need the cluster's remediation still enabled. An
472
- * operator who revokes or re-points access therefore stops an in-flight
473
- * run at its next command.
575
+ * target must still be the cluster's access target as resolved now
576
+ * (KubernetesClusterAiAccessService.loadAccessTarget), a credential must
577
+ * still be its bound Kubernetes credential, an investigation's reads need
578
+ * "Investigate with kubectl" still on, and a remediation run's commands
579
+ * (its reads included) need the cluster's fixes still enabled. An
580
+ * operator who revokes or re-points access — or an agent that takes over
581
+ * from a Runner — therefore stops an in-flight run at its next command.
474
582
  */
475
583
  async enqueueAiKubectlCommand(data) {
476
- var _a, _b, _c;
584
+ var _a, _b, _c, _d, _e, _f;
477
585
  if (!data.targetAgentId) {
478
586
  throw new BadDataException("targetAgentId is required to dispatch a kubectl command to a Runner.");
479
587
  }
@@ -515,14 +623,16 @@ export class Service extends DatabaseService {
515
623
  /*
516
624
  * The access test is bounded by its own route limits instead, and an
517
625
  * investigation's brake counts only rows with an AI run, so tests never
518
- * spend the budget real investigations share.
626
+ * spend the budget real investigations share. Resource commands have
627
+ * their own brake and never count here, so a busy hour on the project's
628
+ * other infrastructure never starves the cluster lane.
519
629
  */
520
630
  if (!isAccessTest) {
521
631
  const hourlyCap = data.origin === RunnerJobOrigin.AiInvestigation
522
632
  ? MAX_AI_INVESTIGATION_COMMAND_JOBS_PER_PROJECT_PER_HOUR
523
633
  : MAX_AI_COMMAND_JOBS_PER_PROJECT_PER_HOUR;
524
634
  const jobsInLastHour = (await this.countBy({
525
- query: Object.assign({ projectId: data.projectId, origin: data.origin, createdAt: QueryHelper.greaterThan(OneUptimeDate.getSomeHoursAgo(1)) }, (data.origin === RunnerJobOrigin.AiInvestigation
635
+ query: Object.assign({ projectId: data.projectId, origin: data.origin, stepType: QueryHelper.notEquals(RunbookStepType.ResourceCommand), createdAt: QueryHelper.greaterThan(OneUptimeDate.getSomeHoursAgo(1)) }, (data.origin === RunnerJobOrigin.AiInvestigation
526
636
  ? { aiRunId: QueryHelper.notNull() }
527
637
  : {})),
528
638
  props: { isRoot: true },
@@ -546,6 +656,7 @@ export class Service extends DatabaseService {
546
656
  },
547
657
  select: {
548
658
  _id: true,
659
+ projectId: true,
549
660
  name: true,
550
661
  clusterIdentifier: true,
551
662
  aiAccessRunnerId: true,
@@ -560,9 +671,16 @@ export class Service extends DatabaseService {
560
671
  }
561
672
  const clusterIdentifier = (cluster.clusterIdentifier || "").trim();
562
673
  const clusterLabel = cluster.name || clusterIdentifier || data.kubernetesClusterId.toString();
674
+ /*
675
+ * The cluster's access target as it resolves NOW. A target that is not
676
+ * it — a Runner the cluster was re-pointed away from, or a Runner after
677
+ * the cluster's Kubernetes AI agent came online — is refused below.
678
+ */
679
+ const loaded = await KubernetesClusterAiAccessService.loadAccessTarget({ cluster });
563
680
  const bindingRefusal = Service.getClusterBindingRefusal({
564
681
  cluster,
565
682
  clusterLabel,
683
+ resolvedTargetId: getKubernetesAiAccessTargetId(loaded.target),
566
684
  targetAgentId: data.targetAgentId,
567
685
  credentialId: data.credentialId,
568
686
  requiredSwitch: await this.getRequiredClusterSwitch({
@@ -575,72 +693,103 @@ export class Service extends DatabaseService {
575
693
  if (bindingRefusal) {
576
694
  throw new BadDataException(bindingRefusal);
577
695
  }
578
- const targetRunner = await RunnerService.findOneBy({
579
- query: {
580
- _id: data.targetAgentId.toString(),
581
- projectId: data.projectId,
582
- },
583
- select: { _id: true, name: true, hostInfo: true },
584
- props: { isRoot: true },
585
- });
586
- if (!targetRunner) {
587
- throw new BadDataException("The target Runner was not found or it does not belong to this project.");
588
- }
589
- if (data.credentialId) {
696
+ let posture = undefined;
697
+ let executorKind;
698
+ let targetKubernetesAiAgentId = undefined;
699
+ if (loaded.target.type === "ai_agent") {
700
+ const agent = loaded.target.agent;
701
+ /*
702
+ * The agent row was read by (project, cluster), so it is this
703
+ * cluster's: checked again here so the rule reads in one place.
704
+ */
705
+ if (((_a = agent.projectId) === null || _a === void 0 ? void 0 : _a.toString()) !== data.projectId.toString() ||
706
+ ((_b = agent.kubernetesClusterId) === null || _b === void 0 ? void 0 : _b.toString()) !==
707
+ data.kubernetesClusterId.toString()) {
708
+ throw new BadDataException(`The Kubernetes AI agent this kubectl command names is not cluster "${clusterLabel}"'s, so it was not enqueued.`);
709
+ }
590
710
  /*
591
- * A kubernetes-agent Runner is never handed credential material: its
592
- * identity is issued with the project's telemetry ingestion key, so
593
- * anyone holding that key could come to hold the credential too. The
594
- * claim path refuses it as well (by the same name-or-posture rule);
595
- * refusing here keeps the job from ever existing.
711
+ * The agent runs kubectl with its own ServiceAccount only and is
712
+ * never handed credential material: its identity is issued with the
713
+ * project's telemetry ingestion key.
596
714
  */
597
- if (RunnerServiceClass.isKubernetesAgentRunnerRow(targetRunner)) {
598
- throw new BadDataException(`Runner "${targetRunner.name}" is a cluster's in-cluster Runner and is never given a credential, so a kubectl command for cluster "${clusterLabel}" that needs one cannot run on it. Create a Runner under Project Settings → Runners, assign the Kubernetes credential to it and select both on the cluster's AI page.`);
715
+ if (data.credentialId) {
716
+ throw new BadDataException(`Cluster "${clusterLabel}" is reached through its Kubernetes AI agent, which runs kubectl with its own ServiceAccount and is never given a credential, so a kubectl command that needs one was not enqueued.`);
599
717
  }
600
- const credential = ObjectID.isValidUUID(data.credentialId)
601
- ? await RunbookCredentialService.findOneBy({
602
- query: {
603
- _id: data.credentialId,
604
- projectId: data.projectId,
605
- },
606
- select: { _id: true, name: true, credentialType: true },
607
- props: { isRoot: true },
608
- })
609
- : null;
610
- if (!credential ||
611
- credential.credentialType !== RunbookCredentialType.Kubernetes) {
612
- throw new BadDataException(`The credential this kubectl command names is not a Kubernetes credential of this project, so it was not enqueued for cluster "${clusterLabel}".`);
718
+ posture = parseKubernetesAgentPosture(agent.posture);
719
+ executorKind = "ai_agent";
720
+ targetKubernetesAiAgentId = agent.id;
721
+ if (!isInClusterPostureForCluster(posture, clusterIdentifier)) {
722
+ throw new BadDataException(`The Kubernetes AI agent has not reported that it runs in cluster "${clusterIdentifier || cluster.name || ((_c = cluster.id) === null || _c === void 0 ? void 0 : _c.toString())}", so this kubectl command was not enqueued. Wait for its next report (within a minute), or reset the agent on the cluster's AI agent page (AI → Agent).`);
613
723
  }
614
724
  }
615
- const posture = parseKubernetesRunnerPosture(targetRunner.hostInfo);
616
- if (!data.credentialId) {
617
- if (!isInClusterPostureForCluster(posture, clusterIdentifier)) {
618
- throw new BadDataException(`A kubectl command without a Kubernetes credential can only run on the in-cluster Runner of cluster "${clusterIdentifier || cluster.name || ((_a = cluster.id) === null || _a === void 0 ? void 0 : _a.toString())}", and Runner "${targetRunner.name}" ${(posture === null || posture === void 0 ? void 0 : posture.inCluster)
619
- ? `is the in-cluster Runner of ${((_b = posture.clusterIdentifier) === null || _b === void 0 ? void 0 : _b.trim())
620
- ? `cluster "${posture.clusterIdentifier.trim()}"`
621
- : "an unnamed cluster"}`
622
- : "runs outside the cluster"}. Select a Kubernetes credential for this Runner on the cluster's AI page, or install the in-cluster Runner on this cluster.`);
725
+ else {
726
+ /*
727
+ * A Runner target: the Runner row the resolution read, which is the
728
+ * cluster's bound Runner and so belongs to this project.
729
+ */
730
+ const targetRunner = loaded.target.type === "none" ? null : loaded.target.runner;
731
+ if (!targetRunner) {
732
+ throw new BadDataException("The target Runner was not found or it does not belong to this project.");
733
+ }
734
+ executorKind = data.credentialId ? "credential_runner" : "legacy_runner";
735
+ if (data.credentialId) {
736
+ /*
737
+ * A kubernetes-agent Runner is never handed credential material: its
738
+ * identity is issued with the project's telemetry ingestion key, so
739
+ * anyone holding that key could come to hold the credential too. The
740
+ * claim path refuses it as well (by the same name-or-posture rule);
741
+ * refusing here keeps the job from ever existing.
742
+ */
743
+ if (RunnerServiceClass.isKubernetesAgentRunnerRow(targetRunner)) {
744
+ throw new BadDataException(`Runner "${targetRunner.name}" is a cluster's in-cluster Runner and is never given a credential, so a kubectl command for cluster "${clusterLabel}" that needs one cannot run on it. Create a Runner under Project Settings → Runners, assign the Kubernetes credential to it and select both on the cluster's AI agent page (AI → Agent).`);
745
+ }
746
+ const credential = ObjectID.isValidUUID(data.credentialId)
747
+ ? await RunbookCredentialService.findOneBy({
748
+ query: {
749
+ _id: data.credentialId,
750
+ projectId: data.projectId,
751
+ },
752
+ select: { _id: true, name: true, credentialType: true },
753
+ props: { isRoot: true },
754
+ })
755
+ : null;
756
+ if (!credential ||
757
+ credential.credentialType !== RunbookCredentialType.Kubernetes) {
758
+ throw new BadDataException(`The credential this kubectl command names is not a Kubernetes credential of this project, so it was not enqueued for cluster "${clusterLabel}".`);
759
+ }
760
+ }
761
+ posture = parseKubernetesRunnerPosture(targetRunner.hostInfo);
762
+ if (!data.credentialId) {
763
+ if (!isInClusterPostureForCluster(posture, clusterIdentifier)) {
764
+ throw new BadDataException(`A kubectl command without a Kubernetes credential can only run on the in-cluster Runner of cluster "${clusterIdentifier || cluster.name || ((_d = cluster.id) === null || _d === void 0 ? void 0 : _d.toString())}", and Runner "${targetRunner.name}" ${(posture === null || posture === void 0 ? void 0 : posture.inCluster)
765
+ ? `is the in-cluster Runner of ${((_e = posture.clusterIdentifier) === null || _e === void 0 ? void 0 : _e.trim())
766
+ ? `cluster "${posture.clusterIdentifier.trim()}"`
767
+ : "an unnamed cluster"}`
768
+ : "runs outside the cluster"}. Select a Kubernetes credential for this Runner on the cluster's AI agent page (AI → Agent), or clear the Runner there to use the cluster's Kubernetes AI agent.`);
769
+ }
623
770
  }
624
771
  }
625
772
  /*
626
- * A remediation write the Runner's own posture says it will refuse — a
773
+ * A remediation write the target's own posture says it will refuse — a
627
774
  * namespace outside its write scope, its own namespace, or a node
628
775
  * operation its chart did not grant — is refused here, before it can be
629
776
  * approved, enqueued or counted by the cluster's circuit breaker, with
630
- * the chart value that would allow it. Reads are never refused for
631
- * scope.
777
+ * the setting that would allow it. Reads are never refused for scope.
778
+ * A job with no credential lands in the pod's own namespace when it
779
+ * names none — for the agent exactly as for the in-cluster Runner.
632
780
  */
633
781
  if (data.origin === RunnerJobOrigin.AiRemediation) {
634
782
  const scopeRefusal = Service.getRunnerWriteScopeRefusal({
635
783
  policy,
636
784
  posture,
637
785
  usesCredential: Boolean(data.credentialId),
786
+ executorKind,
638
787
  });
639
788
  if (scopeRefusal) {
640
789
  throw new BadDataException(scopeRefusal);
641
790
  }
642
791
  }
643
- const claimDeadlineAt = OneUptimeDate.addRemoveSeconds(OneUptimeDate.getCurrentDate(), Math.ceil(((_c = data.claimTimeoutInMs) !== null && _c !== void 0 ? _c : DEFAULT_CLAIM_TIMEOUT_MS) / 1000));
792
+ const claimDeadlineAt = OneUptimeDate.addRemoveSeconds(OneUptimeDate.getCurrentDate(), Math.ceil(((_f = data.claimTimeoutInMs) !== null && _f !== void 0 ? _f : DEFAULT_CLAIM_TIMEOUT_MS) / 1000));
644
793
  const row = new Model();
645
794
  row.projectId = data.projectId;
646
795
  row.origin = data.origin;
@@ -653,7 +802,16 @@ export class Service extends DatabaseService {
653
802
  row.kubernetesClusterId = data.kubernetesClusterId;
654
803
  row.stepId = data.stepId;
655
804
  row.stepType = RunbookStepType.Kubectl;
656
- row.targetAgentId = data.targetAgentId;
805
+ /*
806
+ * Exactly one target: the agent's row, or the Runner. targetAgentId has
807
+ * a foreign key to Runner, so it stays empty for the agent.
808
+ */
809
+ if (targetKubernetesAiAgentId) {
810
+ row.targetKubernetesAiAgentId = targetKubernetesAiAgentId;
811
+ }
812
+ else {
813
+ row.targetAgentId = data.targetAgentId;
814
+ }
657
815
  row.script = "";
658
816
  row.payload = Object.assign(Object.assign({ args: policy.args, displayCommand: policy.displayCommand, tier: policy.tier, kubernetesClusterId: data.kubernetesClusterId.toString() }, (clusterIdentifier ? { clusterIdentifier } : {})), (data.credentialId ? { credentialId: data.credentialId } : {}));
659
817
  row.timeoutInMs = data.timeoutInMs;
@@ -694,32 +852,270 @@ export class Service extends DatabaseService {
694
852
  /*
695
853
  * Why a kubectl job may NOT be enqueued for this cluster as it is
696
854
  * configured right now, or null when it may. Pure, so the rule reads in
697
- * one place: the job must go through the cluster's CURRENT binding, and
698
- * the capability it is for must still be switched on.
855
+ * one place: the job must go to the cluster's CURRENT access target
856
+ * (resolvedTargetId, from resolveKubernetesAiAccessTarget), and the
857
+ * capability it is for must still be switched on.
699
858
  *
700
859
  * A credential-less job does not require the credential binding to be
701
- * empty: the in-cluster Runner of the cluster wins over a bound
702
- * credential (the readiness status prefers it), so such a job is
703
- * legitimate with a credential still selected.
860
+ * empty: the in-cluster Runner of the cluster (or its Kubernetes AI
861
+ * agent) wins over a bound credential (the readiness status prefers it),
862
+ * so such a job is legitimate with a credential still selected.
704
863
  */
705
864
  static getClusterBindingRefusal(data) {
706
865
  const { cluster, clusterLabel } = data;
707
- if (!cluster.aiAccessRunnerId ||
708
- cluster.aiAccessRunnerId.toString() !== data.targetAgentId.toString()) {
709
- return `Cluster "${clusterLabel}" is no longer reached through this Runner (its AI access binding changed or was cleared on the cluster's AI page), so this kubectl command was not enqueued.`;
866
+ if (!data.resolvedTargetId ||
867
+ data.resolvedTargetId !== data.targetAgentId.toString()) {
868
+ return `Cluster "${clusterLabel}" is no longer reached through this Runner or agent (its AI access changed on the cluster's AI agent page (AI → Agent), or its Kubernetes AI agent took over), so this kubectl command was not enqueued.`;
710
869
  }
711
870
  if (data.credentialId &&
712
871
  (!cluster.aiAccessCredentialId ||
713
872
  cluster.aiAccessCredentialId.toString() !== data.credentialId)) {
714
- return `Cluster "${clusterLabel}" is no longer reached with this Kubernetes credential (its AI access binding changed or was cleared on the cluster's AI page), so this kubectl command was not enqueued.`;
873
+ return `Cluster "${clusterLabel}" is no longer reached with this Kubernetes credential (its AI access changed on the cluster's AI agent page (AI → Agent)), so this kubectl command was not enqueued.`;
715
874
  }
716
875
  if (data.requiredSwitch === "investigation" &&
717
876
  cluster.isAiInvestigationEnabled !== true) {
718
- return `"Let AI investigate with kubectl" is turned off for cluster "${clusterLabel}", so this investigation command was not enqueued.`;
877
+ return `"Investigate with kubectl" is turned off for cluster "${clusterLabel}", so this investigation command was not enqueued.`;
719
878
  }
720
879
  if (data.requiredSwitch === "remediation" &&
721
880
  !ENABLED_REMEDIATION_MODES.includes(cluster.aiRemediationMode)) {
722
- return `AI remediation is turned off for cluster "${clusterLabel}", so this kubectl command was not enqueued.`;
881
+ return `AI fixes are turned off for cluster "${clusterLabel}", so this kubectl command was not enqueued.`;
882
+ }
883
+ return null;
884
+ }
885
+ /*
886
+ * Enqueue ONE command OneUptime AI composed for an infrastructure
887
+ * resource — a Docker or Podman host, a Docker Swarm, Proxmox, VMware or
888
+ * Ceph cluster, a database server or a host — for that resource's AI
889
+ * agent (a ResourceAiAgent row, never a Runner).
890
+ *
891
+ * The server-side chokepoint between an LLM's output and a resource, in
892
+ * the order enqueueAiKubectlCommand checks a cluster command:
893
+ *
894
+ * 1. the call itself: a resource type and id, an AI origin, the
895
+ * suggestion a remediation job belongs to, the run an investigation
896
+ * job belongs to (the access test alone has none, and is a read);
897
+ * 2. the resource command policy, re-run whatever the tool layer
898
+ * checked: Denied never enqueues, and an investigation-origin job must
899
+ * be Read tier — an investigation can never write;
900
+ * 3. the project's hourly brake for resource commands (investigations
901
+ * and remediation counted apart, on ResourceCommand rows only);
902
+ * 4. the resource must be this project's;
903
+ * 5. the target is re-resolved NOW: the resource's online agent
904
+ * (ResourceAiAgentService.findOnlineAgentForResource), and the agent
905
+ * the caller named, if any, must still be it;
906
+ * 6. the switch the job needs must still be on: an investigation's reads
907
+ * need the resource's investigation switch (a remediation run's reads
908
+ * its fixes), and a remediation job needs its fixes (mode not
909
+ * Disabled) — so an operator who turns AI off stops an in-flight run
910
+ * at its next command;
911
+ * 7. no credential: the agent uses only its own environment's;
912
+ * 8. the agent's reported posture must be for this resource type and
913
+ * name the identity it registered with (the payload carries it, and
914
+ * the agent refuses a job for any other), and a write must fit it:
915
+ * ONEUPTIME_AI_ALLOW_WRITES on, ONEUPTIME_AI_WRITE_TARGETS and the
916
+ * agent's protected targets respected (ResourceCommandPolicy.
917
+ * getWriteScopeRefusal, the rule the agent itself applies).
918
+ *
919
+ * The command travels as an argv (never a shell line) in a
920
+ * ResourceCommandJobPayload, and the row names the agent in
921
+ * targetResourceAiAgentId, so only that agent can claim it. Every
922
+ * refusal is a ResourceCommandEnqueueRefusedException saying which rule.
923
+ */
924
+ async enqueueAiResourceCommand(data) {
925
+ var _a;
926
+ // 1. The call itself.
927
+ if (!isAiResourceType(data.resourceType)) {
928
+ throw new ResourceCommandEnqueueRefusedException("invalid_request", `A resource command needs a resource type; "${String(data.resourceType)}" is not one.`);
929
+ }
930
+ const info = AI_RESOURCE_TYPE_INFO[data.resourceType];
931
+ const noun = describeResourceNoun(data.resourceType);
932
+ if (!data.resourceId) {
933
+ throw new ResourceCommandEnqueueRefusedException("invalid_request", `resourceId is required for a command on a ${noun}.`);
934
+ }
935
+ if (data.origin !== RunnerJobOrigin.AiInvestigation &&
936
+ data.origin !== RunnerJobOrigin.AiRemediation) {
937
+ throw new ResourceCommandEnqueueRefusedException("invalid_request", `A resource command job cannot have origin "${String(data.origin)}".`);
938
+ }
939
+ if (data.origin === RunnerJobOrigin.AiRemediation &&
940
+ !data.autoRemediationSuggestionId) {
941
+ throw new ResourceCommandEnqueueRefusedException("invalid_request", "A resource remediation job needs its auto-remediation suggestion.");
942
+ }
943
+ const isAccessTest = data.isAccessTest === true;
944
+ if (isAccessTest &&
945
+ (data.origin !== RunnerJobOrigin.AiInvestigation || data.aiRunId)) {
946
+ throw new ResourceCommandEnqueueRefusedException("invalid_request", "An access test is a read-only check with no AI run behind it.");
947
+ }
948
+ if (data.origin === RunnerJobOrigin.AiInvestigation &&
949
+ !isAccessTest &&
950
+ !data.aiRunId) {
951
+ throw new ResourceCommandEnqueueRefusedException("invalid_request", "An investigation resource command job needs the AI run it belongs to.");
952
+ }
953
+ // 2. The policy, whatever the tool layer decided.
954
+ const policy = ResourceCommandPolicy.evaluateCommand({
955
+ resourceType: data.resourceType,
956
+ command: data.command,
957
+ });
958
+ if (policy.tier === ResourceCommandTier.Denied) {
959
+ throw new ResourceCommandEnqueueRefusedException("policy_denied", `Denied by the ${info.displayName} command policy: ${policy.reason}.`);
960
+ }
961
+ if (data.origin === RunnerJobOrigin.AiInvestigation &&
962
+ policy.tier !== ResourceCommandTier.Read) {
963
+ throw new ResourceCommandEnqueueRefusedException("not_read_only", `An investigation may only run read-only commands; "${policy.displayCommand}" would change the ${noun} (${policy.tier}).`);
964
+ }
965
+ // 3. The hourly brake, on resource commands only.
966
+ if (!isAccessTest) {
967
+ const hourlyCap = data.origin === RunnerJobOrigin.AiInvestigation
968
+ ? MAX_AI_INVESTIGATION_RESOURCE_COMMAND_JOBS_PER_PROJECT_PER_HOUR
969
+ : MAX_AI_RESOURCE_COMMAND_JOBS_PER_PROJECT_PER_HOUR;
970
+ const jobsInLastHour = (await this.countBy({
971
+ query: Object.assign({ projectId: data.projectId, origin: data.origin, stepType: RunbookStepType.ResourceCommand, createdAt: QueryHelper.greaterThan(OneUptimeDate.getSomeHoursAgo(1)) }, (data.origin === RunnerJobOrigin.AiInvestigation
972
+ ? { aiRunId: QueryHelper.notNull() }
973
+ : {})),
974
+ props: { isRoot: true },
975
+ })).toNumber();
976
+ if (jobsInLastHour >= hourlyCap) {
977
+ throw new ResourceCommandEnqueueRefusedException("hourly_limit", data.origin === RunnerJobOrigin.AiInvestigation
978
+ ? `This project has run ${jobsInLastHour} AI investigation commands on its infrastructure in the last hour, which is its limit (${hourlyCap}). No further infrastructure commands can run this hour.`
979
+ : `This project has run ${jobsInLastHour} AI remediation commands on its infrastructure in the last hour, which is its limit (${hourlyCap}). No further AI commands can run on its infrastructure this hour.`);
980
+ }
981
+ }
982
+ // 4 + 5. The resource, and the agent it is reached through NOW.
983
+ const loaded = await ResourceAiAccessService.loadAccessTarget({
984
+ projectId: data.projectId,
985
+ resourceType: data.resourceType,
986
+ resourceId: data.resourceId,
987
+ });
988
+ if (!loaded.resource) {
989
+ throw new ResourceCommandEnqueueRefusedException("resource_not_found", `${info.displayName} not found or it does not belong to this project.`);
990
+ }
991
+ const bindingRefusal = Service.getResourceBindingRefusal({
992
+ resource: loaded.resource,
993
+ agent: loaded.agent,
994
+ targetResourceAiAgentId: data.targetResourceAiAgentId,
995
+ credentialId: data.credentialId,
996
+ // 6. The switch this job needs.
997
+ requiredSwitch: await this.getRequiredClusterSwitch({
998
+ projectId: data.projectId,
999
+ origin: data.origin,
1000
+ aiRunId: data.aiRunId,
1001
+ isAccessTest,
1002
+ }),
1003
+ });
1004
+ if (bindingRefusal) {
1005
+ throw new ResourceCommandEnqueueRefusedException(bindingRefusal.code, bindingRefusal.message);
1006
+ }
1007
+ const agent = loaded.agent;
1008
+ const resourceLabel = loaded.resource.name;
1009
+ // 8. The agent's own posture: this resource, and room for the write.
1010
+ const posture = parseResourceAiAgentPosture(agent.posture);
1011
+ const resourceIdentifier = (agent.resourceIdentifier ||
1012
+ (posture === null || posture === void 0 ? void 0 : posture.resourceIdentifier) ||
1013
+ "").trim();
1014
+ if (!posture ||
1015
+ posture.resourceType !== data.resourceType ||
1016
+ !resourceIdentifier) {
1017
+ throw new ResourceCommandEnqueueRefusedException("agent_posture_mismatch", `The ${info.agentDisplayName} has not reported that it serves ${noun} "${resourceLabel}", so this command was not enqueued. Wait for its next report (within a minute), or reset the agent on ${getResourceAiAgentPage(data.resourceType)}.`);
1018
+ }
1019
+ if (policy.tier !== ResourceCommandTier.Read) {
1020
+ const scopeRefusal = ResourceCommandPolicy.getWriteScopeRefusal({
1021
+ result: policy,
1022
+ allowWrites: posture.allowWrites === true,
1023
+ writeTargets: posture.writeTargets,
1024
+ protectedTargets: posture.protectedTargets,
1025
+ resourceType: data.resourceType,
1026
+ });
1027
+ if (scopeRefusal) {
1028
+ throw new ResourceCommandEnqueueRefusedException("write_scope", `${scopeRefusal} It was not enqueued.`);
1029
+ }
1030
+ }
1031
+ const claimDeadlineAt = OneUptimeDate.addRemoveSeconds(OneUptimeDate.getCurrentDate(), Math.ceil(((_a = data.claimTimeoutInMs) !== null && _a !== void 0 ? _a : DEFAULT_CLAIM_TIMEOUT_MS) / 1000));
1032
+ const payload = {
1033
+ resourceType: data.resourceType,
1034
+ resourceId: loaded.resource.id.toString(),
1035
+ resourceIdentifier,
1036
+ program: policy.program,
1037
+ args: policy.args,
1038
+ displayCommand: policy.displayCommand,
1039
+ tier: policy.tier,
1040
+ };
1041
+ const row = new Model();
1042
+ row.projectId = data.projectId;
1043
+ row.origin = data.origin;
1044
+ if (data.aiRunId) {
1045
+ row.aiRunId = data.aiRunId;
1046
+ }
1047
+ if (data.autoRemediationSuggestionId) {
1048
+ row.autoRemediationSuggestionId = data.autoRemediationSuggestionId;
1049
+ }
1050
+ row.stepId = data.stepId;
1051
+ row.stepType = RunbookStepType.ResourceCommand;
1052
+ /*
1053
+ * The one target: the resource's agent row. targetAgentId (a Runner)
1054
+ * and targetKubernetesAiAgentId stay empty, so no Runner and no
1055
+ * Kubernetes AI agent can ever claim it.
1056
+ */
1057
+ row.targetResourceAiAgentId = agent.id;
1058
+ row.resourceType = data.resourceType;
1059
+ row.resourceId = loaded.resource.id;
1060
+ row.script = "";
1061
+ row.payload = payload;
1062
+ row.timeoutInMs = data.timeoutInMs;
1063
+ row.status = RunnerJobStatus.Pending;
1064
+ row.claimDeadlineAt = claimDeadlineAt;
1065
+ return this.create({ data: row, props: { isRoot: true } });
1066
+ }
1067
+ /*
1068
+ * Why a resource command may NOT be enqueued for this resource as it is
1069
+ * configured right now, or null when it may. Pure, so the rule reads in
1070
+ * one place: the resource must have an online agent (the one the caller
1071
+ * named, when it named one) that is this resource's, the switch the job
1072
+ * needs must still be on, and no credential may travel with it.
1073
+ */
1074
+ static getResourceBindingRefusal(data) {
1075
+ var _a, _b;
1076
+ const { resource, agent } = data;
1077
+ const info = AI_RESOURCE_TYPE_INFO[resource.resourceType];
1078
+ const noun = describeResourceNoun(resource.resourceType);
1079
+ const label = resource.name;
1080
+ if (!agent || !agent.id) {
1081
+ return {
1082
+ code: "agent_not_online",
1083
+ message: `${noun.charAt(0).toUpperCase()}${noun.slice(1)} "${label}" has no online ${info.agentDisplayName}, so this command was not enqueued. ${getResourceAiAgentInstallNextStep({
1084
+ resourceType: resource.resourceType,
1085
+ resourceId: resource.id.toString(),
1086
+ identifier: resource.identifier,
1087
+ })} Already installed? Check that its container is running and can reach your OneUptime URL.`,
1088
+ };
1089
+ }
1090
+ if (((_a = agent.projectId) === null || _a === void 0 ? void 0 : _a.toString()) !== resource.projectId.toString() ||
1091
+ agent.resourceType !== resource.resourceType ||
1092
+ ((_b = agent.resourceId) === null || _b === void 0 ? void 0 : _b.toString()) !== resource.id.toString() ||
1093
+ (data.targetResourceAiAgentId &&
1094
+ data.targetResourceAiAgentId.toString() !== agent.id.toString())) {
1095
+ return {
1096
+ code: "agent_changed",
1097
+ message: `${noun.charAt(0).toUpperCase()}${noun.slice(1)} "${label}" is no longer reached through this ${info.agentDisplayName} (the agent was reset or replaced), so this command was not enqueued.`,
1098
+ };
1099
+ }
1100
+ if (data.requiredSwitch === "investigation" &&
1101
+ resource.isAiInvestigationEnabled !== true) {
1102
+ return {
1103
+ code: "switch_off",
1104
+ message: `AI investigation is turned off for ${noun} "${label}", so this investigation command was not enqueued.`,
1105
+ };
1106
+ }
1107
+ if (data.requiredSwitch === "remediation" &&
1108
+ !ENABLED_RESOURCE_REMEDIATION_MODES.includes(resource.aiRemediationMode)) {
1109
+ return {
1110
+ code: "switch_off",
1111
+ message: `AI fixes are turned off for ${noun} "${label}", so this command was not enqueued.`,
1112
+ };
1113
+ }
1114
+ if (data.credentialId) {
1115
+ return {
1116
+ code: "credential_refused",
1117
+ message: `${noun.charAt(0).toUpperCase()}${noun.slice(1)} "${label}" is reached through its ${info.agentDisplayName}, which uses only the credentials in its own environment and is never given one by OneUptime, so a command that names a credential was not enqueued.`,
1118
+ };
723
1119
  }
724
1120
  return null;
725
1121
  }
@@ -898,6 +1294,21 @@ export class Service extends DatabaseService {
898
1294
  return ToolResultSerializer.redact(KubectlOutputRedactor.redact(text).text)
899
1295
  .text;
900
1296
  }
1297
+ /*
1298
+ * A resource command's text through the resource command redactor (the
1299
+ * program's own rules, then the generic ones), or the text unchanged
1300
+ * when it is not one. Pure; redactAiJobText still runs after it.
1301
+ */
1302
+ static redactResourceCommandText(text, resourceCommand) {
1303
+ if (!resourceCommand) {
1304
+ return text;
1305
+ }
1306
+ return redactResourceCommandOutput({
1307
+ resourceType: resourceCommand.resourceType,
1308
+ program: resourceCommand.program,
1309
+ text,
1310
+ });
1311
+ }
901
1312
  /*
902
1313
  * A Runner's text as a Postgres text column can hold it. A NUL byte is
903
1314
  * ordinary in what a Runner reports — `kubectl logs` of a log that was
@@ -940,10 +1351,12 @@ export class Service extends DatabaseService {
940
1351
  * write stay one atomic step (and one round trip): the CASE picks the
941
1352
  * redacted text for an AI-origin row and the verbatim text otherwise.
942
1353
  */
943
- const redactedOutput = rawOutput === null ? null : Service.redactAiJobText(rawOutput);
1354
+ const redactedOutput = rawOutput === null
1355
+ ? null
1356
+ : Service.redactAiJobText(Service.redactResourceCommandText(rawOutput, data.resourceCommand));
944
1357
  const redactedErrorMessage = rawErrorMessage === null
945
1358
  ? null
946
- : Service.redactAiJobText(rawErrorMessage);
1359
+ : Service.redactAiJobText(Service.redactResourceCommandText(rawErrorMessage, data.resourceCommand));
947
1360
  /*
948
1361
  * Only the agent that holds the lease is allowed to write the terminal
949
1362
  * result. If the lease has already moved on (Worker timed out and
@@ -1015,6 +1428,10 @@ export class Service extends DatabaseService {
1015
1428
  // The timeout reason is worded for what the job is.
1016
1429
  origin: true,
1017
1430
  stepType: true,
1431
+ targetKubernetesAiAgentId: true,
1432
+ // A resource command names its resource's AI agent.
1433
+ targetResourceAiAgentId: true,
1434
+ resourceType: true,
1018
1435
  },
1019
1436
  props: { isRoot: true },
1020
1437
  });
@@ -1052,6 +1469,8 @@ export class Service extends DatabaseService {
1052
1469
  stepType: job.stepType,
1053
1470
  claimTimeoutInMs: data.claimTimeoutInMs,
1054
1471
  executionTimeoutInMs: data.executionTimeoutInMs,
1472
+ isForKubernetesAiAgent: Boolean(job.targetKubernetesAiAgentId),
1473
+ resourceType: job.resourceType,
1055
1474
  }),
1056
1475
  });
1057
1476
  }
@@ -1155,6 +1574,12 @@ __decorate([
1155
1574
  __metadata("design:paramtypes", [Object]),
1156
1575
  __metadata("design:returntype", Promise)
1157
1576
  ], Service.prototype, "enqueueAiKubectlCommand", null);
1577
+ __decorate([
1578
+ CaptureSpan(),
1579
+ __metadata("design:type", Function),
1580
+ __metadata("design:paramtypes", [Object]),
1581
+ __metadata("design:returntype", Promise)
1582
+ ], Service.prototype, "enqueueAiResourceCommand", null);
1158
1583
  __decorate([
1159
1584
  CaptureSpan(),
1160
1585
  __metadata("design:type", Function),