@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
@@ -10,15 +10,33 @@ import {
10
10
  KubernetesAiAccessOfferedFields,
11
11
  KubernetesAiAccessSavedSettings,
12
12
  KubernetesAiAccessSettingsFormValues,
13
- buildKubernetesAiRunnerOptions,
14
- describeRunnerWriteAccess,
15
- getAiAccessConnectCardMode,
16
13
  getKubernetesAiAccessLooseningChanges,
17
14
  getKubernetesAiAccessOfferedFields,
18
15
  getKubernetesAiAccessSettingsChanges,
19
16
  getKubernetesAiAccessSettingsInitialValues,
17
+ isRemediationModeOpenToEveryEditor,
20
18
  validateKubectlAllowlistText,
21
- } from "../../../../App/FeatureSet/Dashboard/src/Pages/Kubernetes/View/AI";
19
+ } from "../../../../App/FeatureSet/Dashboard/src/Pages/Kubernetes/Utils/KubernetesAiAccessSettings";
20
+ import {
21
+ AI_AGENT_GONE_TEXT,
22
+ AI_AGENT_SIGNED_OFF_TEXT,
23
+ AI_AGENT_SILENT_TEXT,
24
+ canSwitchToAiAgent,
25
+ getAiAgentCardCommand,
26
+ getAiAgentCardState,
27
+ getAiAgentGapAction,
28
+ getAiAgentMetaParts,
29
+ getAiAgentOfflineReason,
30
+ getAiAgentOverviewState,
31
+ getAiAgentPodNamespace,
32
+ getAiAgentStateSentence,
33
+ getAiAgentSummary,
34
+ getAttentionGaps,
35
+ getAutomaticInvestigation,
36
+ isAdvancedRunnerTarget,
37
+ isLegacyRunnerTarget,
38
+ shouldShowWriteAccessCommands,
39
+ } from "../../../../App/FeatureSet/Dashboard/src/Pages/Kubernetes/Utils/KubernetesAiAgentStatus";
22
40
  import { isKubernetesAgentRunnerRow } from "../../../../App/FeatureSet/Dashboard/src/Pages/Kubernetes/Utils/KubernetesAgentRunner";
23
41
  import {
24
42
  RunnerFormRestrictions,
@@ -26,10 +44,11 @@ import {
26
44
  getRunnerFormFields,
27
45
  getRunnerFormRestrictions,
28
46
  } from "../../../../App/FeatureSet/Dashboard/src/Pages/Settings/RunnerFormFields";
47
+ import KubernetesAiAgentService from "../../../Server/Services/KubernetesAiAgentService";
29
48
  import KubernetesClusterAiAccessService, {
30
49
  KubernetesClusterAiAccessProjectGates,
31
- getKubernetesAgentRunnerNameForCluster,
32
50
  } from "../../../Server/Services/KubernetesClusterAiAccessService";
51
+ import KubernetesClusterFeedService from "../../../Server/Services/KubernetesClusterFeedService";
33
52
  import KubernetesClusterService, {
34
53
  normalizeKubectlAllowlistForWrite,
35
54
  } from "../../../Server/Services/KubernetesClusterService";
@@ -37,10 +56,12 @@ import RunbookCredentialService from "../../../Server/Services/RunbookCredential
37
56
  import RunnerService, {
38
57
  Service as RunnerServiceClass,
39
58
  } from "../../../Server/Services/RunnerService";
59
+ import UserService from "../../../Server/Services/UserService";
40
60
  import CreateBy from "../../../Server/Types/Database/CreateBy";
41
61
  import { OnCreate, OnUpdate } from "../../../Server/Types/Database/Hooks";
42
62
  import UpdateBy from "../../../Server/Types/Database/UpdateBy";
43
63
  import logger from "../../../Server/Utils/Logger";
64
+ import KubernetesAiAgent from "../../../Models/DatabaseModels/KubernetesAiAgent";
44
65
  import KubernetesCluster from "../../../Models/DatabaseModels/KubernetesCluster";
45
66
  import RunbookCredential from "../../../Models/DatabaseModels/RunbookCredential";
46
67
  import Runner from "../../../Models/DatabaseModels/Runner";
@@ -59,22 +80,24 @@ import Permission, {
59
80
  UserTenantAccessPermission,
60
81
  } from "../../../Types/Permission";
61
82
  import RunbookCredentialType from "../../../Types/Runbook/RunbookCredentialType";
62
- import { DropdownOption } from "../../../UI/Components/Dropdown/Dropdown";
63
83
  import Field from "../../../UI/Components/Forms/Types/Field";
64
84
  import FormValues from "../../../UI/Components/Forms/Types/FormValues";
65
85
 
66
86
  /*
67
- * The AI page against the server it talks to — run for real, with only
68
- * the database stubbed:
87
+ * The AI agent page against the server it talks to — run for real, with
88
+ * only the database stubbed:
69
89
  *
70
90
  * - who may loosen: the page's rule (getKubernetesAiAccessLooseningChanges)
71
91
  * gives the verdict KubernetesClusterService's write hook gives, for the
72
- * same saved settings and the same change, and every tightening a cluster
73
- * editor makes through the form is accepted by the server;
74
- * - the gaps the real status computes drive the page's connect card;
75
- * - the Runner name the server gives a long cluster identifier is still
76
- * recognised by the page's Runner picker;
77
- * - the page's allowlist validation agrees with the server's.
92
+ * same saved settings, the same change and the same answer to "does this
93
+ * cluster have a Kubernetes AI agent?" — Off -> Ask for approval and
94
+ * clearing a binding while an agent exists included;
95
+ * - the status the real service computes drives the page's card: every
96
+ * state of the "Kubernetes AI agent" card, the Needs attention rows, the
97
+ * write-access commands and the Overview card, from the real resolution
98
+ * of the access target;
99
+ * - the page's allowlist validation agrees with the server's;
100
+ * - the Runner pages and RunnerService agree on which rows are the chart's.
78
101
  */
79
102
 
80
103
  const PROJECT_ID: ObjectID = new ObjectID(
@@ -87,6 +110,7 @@ const RUNNER_ID: string = "44444444-4444-4444-8444-444444444444";
87
110
  const OTHER_RUNNER_ID: string = "77777777-7777-4777-8777-777777777777";
88
111
  const CREDENTIAL_ID: string = "55555555-5555-4555-8555-555555555555";
89
112
  const OTHER_CREDENTIAL_ID: string = "88888888-8888-4888-8888-888888888888";
113
+ const AGENT_ID: string = "99999999-9999-4999-8999-999999999990";
90
114
 
91
115
  const SET_IMAGE_PATTERN: string = "kubectl set image deployment/web * -n web";
92
116
  const PATCH_PATTERN: string = "kubectl patch deployment/web -n web -p *";
@@ -98,6 +122,8 @@ const READY_GATES: KubernetesClusterAiAccessProjectGates = {
98
122
  isAutoRemediationEnabled: true,
99
123
  isAiCommandExecutionEnabled: true,
100
124
  hasLlmProvider: true,
125
+ aiBalanceBlocker: null,
126
+ automaticInvestigation: { incidents: true, alerts: false },
101
127
  };
102
128
 
103
129
  type Hooks = {
@@ -139,14 +165,17 @@ interface StoredSettings {
139
165
  aiKubectlCommandAllowlist: unknown;
140
166
  aiAccessRunnerId: string | null;
141
167
  aiAccessCredentialId: string | null;
168
+ hasAiAgent: boolean;
142
169
  }
143
170
 
171
+ // A cluster bound to an advanced Runner, with no AI agent unless said.
144
172
  function stored(overrides: Partial<StoredSettings> = {}): StoredSettings {
145
173
  return {
146
174
  aiRemediationMode: KubernetesAiRemediationMode.Automatic,
147
175
  aiKubectlCommandAllowlist: [SET_IMAGE_PATTERN, PATCH_PATTERN],
148
176
  aiAccessRunnerId: RUNNER_ID,
149
177
  aiAccessCredentialId: null,
178
+ hasAiAgent: false,
150
179
  ...overrides,
151
180
  };
152
181
  }
@@ -160,13 +189,40 @@ function asPageSaved(
160
189
  aiRemediationMode: settings.aiRemediationMode,
161
190
  aiKubectlCommandAllowlist: settings.aiKubectlCommandAllowlist,
162
191
  aiAccessRunnerId: settings.aiAccessRunnerId,
163
- aiAccessRunnerName: "bash-runner",
192
+ aiAccessRunnerName: settings.aiAccessRunnerId ? "bash-runner" : null,
164
193
  aiAccessCredentialId: settings.aiAccessCredentialId,
165
194
  aiAccessCredentialName: settings.aiAccessCredentialId ? "prod token" : null,
166
195
  };
167
196
  }
168
197
 
169
- // Serves `settings` as the cluster the server's write hook reads first.
198
+ function makeAgentRow(
199
+ overrides: Record<string, unknown> = {},
200
+ ): KubernetesAiAgent {
201
+ return Object.assign(new KubernetesAiAgent(), {
202
+ id: new ObjectID(AGENT_ID),
203
+ _id: AGENT_ID,
204
+ projectId: PROJECT_ID,
205
+ kubernetesClusterId: CLUSTER_ID,
206
+ connectionStatus: "connected",
207
+ lastAliveAt: OneUptimeDate.getCurrentDate(),
208
+ lastRegisteredAt: OneUptimeDate.getCurrentDate(),
209
+ agentVersion: "14.1.0",
210
+ posture: {
211
+ clusterIdentifier: "prod-us",
212
+ inCluster: true,
213
+ allowWrites: false,
214
+ writeNamespaces: [],
215
+ podNamespace: "monitoring",
216
+ kubectlVersion: "v1.31.2",
217
+ },
218
+ ...overrides,
219
+ });
220
+ }
221
+
222
+ /*
223
+ * Serves `settings` as the cluster the server's write hook reads first,
224
+ * and answers "which of these clusters has an AI agent?" the same way.
225
+ */
170
226
  function serveStoredCluster(settings: StoredSettings): void {
171
227
  jest.spyOn(KubernetesClusterService, "findBy").mockResolvedValue([
172
228
  {
@@ -184,6 +240,20 @@ function serveStoredCluster(settings: StoredSettings): void {
184
240
  : null,
185
241
  } as unknown as KubernetesCluster,
186
242
  ]);
243
+
244
+ const agents: Map<string, KubernetesAiAgent> = new Map<
245
+ string,
246
+ KubernetesAiAgent
247
+ >();
248
+ if (settings.hasAiAgent) {
249
+ agents.set(CLUSTER_ID.toString(), makeAgentRow());
250
+ }
251
+ jest
252
+ .spyOn(KubernetesAiAgentService, "findForClusters")
253
+ .mockResolvedValue(agents);
254
+ jest
255
+ .spyOn(KubernetesAiAgentService, "findForCluster")
256
+ .mockResolvedValue(settings.hasAiAgent ? makeAgentRow() : null);
187
257
  }
188
258
 
189
259
  // Does the server refuse this write to a cluster editor as loosening?
@@ -218,6 +288,7 @@ function pageSaysLoosens(
218
288
  getKubernetesAiAccessLooseningChanges({
219
289
  saved: asPageSaved(settings),
220
290
  changes,
291
+ hasAiAgent: settings.hasAiAgent,
221
292
  }).length > 0
222
293
  );
223
294
  }
@@ -232,6 +303,8 @@ beforeEach(() => {
232
303
  jest.spyOn(RunbookCredentialService, "findOneBy").mockResolvedValue({
233
304
  id: new ObjectID(CREDENTIAL_ID),
234
305
  credentialType: RunbookCredentialType.Kubernetes,
306
+ name: "prod token",
307
+ runners: [{ _id: RUNNER_ID, id: new ObjectID(RUNNER_ID) }],
235
308
  } as unknown as RunbookCredential);
236
309
  });
237
310
 
@@ -239,11 +312,6 @@ afterEach(() => {
239
312
  jest.restoreAllMocks();
240
313
  });
241
314
 
242
- /*
243
- * The finding (dashboard-ai-page-4, XP-7, SIA-4): the server's rule is
244
- * relative to the saved settings, the page's was absolute, and the page
245
- * hid tightening the server accepts from every cluster editor.
246
- */
247
315
  describe("who may loosen: the page and the server agree", () => {
248
316
  const CASES: Array<{
249
317
  name: string;
@@ -271,6 +339,27 @@ describe("who may loosen: the page and the server agree", () => {
271
339
  }),
272
340
  changes: { aiRemediationMode: KubernetesAiRemediationMode.Automatic },
273
341
  },
342
+ // Regression (§11): turning fixes on at all needs the admin set.
343
+ {
344
+ name: "Off -> Ask for approval",
345
+ settings: stored({
346
+ aiRemediationMode: KubernetesAiRemediationMode.Disabled,
347
+ }),
348
+ changes: {
349
+ aiRemediationMode: KubernetesAiRemediationMode.RequireApproval,
350
+ },
351
+ },
352
+ {
353
+ name: "Off -> Ask for approval on a cluster with an AI agent",
354
+ settings: stored({
355
+ aiRemediationMode: KubernetesAiRemediationMode.Disabled,
356
+ aiAccessRunnerId: null,
357
+ hasAiAgent: true,
358
+ }),
359
+ changes: {
360
+ aiRemediationMode: KubernetesAiRemediationMode.RequireApproval,
361
+ },
362
+ },
274
363
  {
275
364
  name: "Automatic -> Ask for approval",
276
365
  settings: stored(),
@@ -278,6 +367,13 @@ describe("who may loosen: the page and the server agree", () => {
278
367
  aiRemediationMode: KubernetesAiRemediationMode.RequireApproval,
279
368
  },
280
369
  },
370
+ {
371
+ name: "Ask for approval -> Off",
372
+ settings: stored({
373
+ aiRemediationMode: KubernetesAiRemediationMode.RequireApproval,
374
+ }),
375
+ changes: { aiRemediationMode: KubernetesAiRemediationMode.Disabled },
376
+ },
281
377
  {
282
378
  name: "re-send the saved mode",
283
379
  settings: stored(),
@@ -321,27 +417,43 @@ describe("who may loosen: the page and the server agree", () => {
321
417
  }),
322
418
  changes: { aiKubectlCommandAllowlist: [ODDLY_SPACED_PATTERN] },
323
419
  },
324
- {
325
- name: "keep a pattern stored with odd spacing, re-spaced",
326
- settings: stored({
327
- aiKubectlCommandAllowlist: [SET_IMAGE_PATTERN, ODDLY_SPACED_PATTERN],
328
- }),
329
- changes: {
330
- aiKubectlCommandAllowlist: [
331
- "kubectl scale deployment/web --replicas=* -n web",
332
- ],
333
- },
334
- },
335
420
  {
336
421
  name: "clear an allowlist stored as a plain string",
337
422
  settings: stored({ aiKubectlCommandAllowlist: SET_IMAGE_PATTERN }),
338
423
  changes: { aiKubectlCommandAllowlist: [] },
339
424
  },
340
425
  {
341
- name: "unbind the Runner",
426
+ name: "unbind the Runner of a cluster without an AI agent",
342
427
  settings: stored(),
343
428
  changes: { aiAccessRunnerId: null },
344
429
  },
430
+ // Regression (§11): with an agent, clearing hands the cluster to it.
431
+ {
432
+ name: "unbind the Runner of a cluster with an AI agent",
433
+ settings: stored({ hasAiAgent: true }),
434
+ changes: { aiAccessRunnerId: null },
435
+ },
436
+ {
437
+ name: "unbind the Runner and credential of a cluster with an AI agent",
438
+ settings: stored({
439
+ aiAccessCredentialId: CREDENTIAL_ID,
440
+ hasAiAgent: true,
441
+ }),
442
+ changes: { aiAccessRunnerId: null, aiAccessCredentialId: null },
443
+ },
444
+ {
445
+ name: "unbind the credential of a cluster with an AI agent",
446
+ settings: stored({
447
+ aiAccessCredentialId: CREDENTIAL_ID,
448
+ hasAiAgent: true,
449
+ }),
450
+ changes: { aiAccessCredentialId: null },
451
+ },
452
+ {
453
+ name: "unbind the credential of a cluster without an AI agent",
454
+ settings: stored({ aiAccessCredentialId: CREDENTIAL_ID }),
455
+ changes: { aiAccessCredentialId: null },
456
+ },
345
457
  {
346
458
  name: "bind another Runner",
347
459
  settings: stored(),
@@ -349,14 +461,9 @@ describe("who may loosen: the page and the server agree", () => {
349
461
  },
350
462
  {
351
463
  name: "re-send the bound Runner",
352
- settings: stored(),
464
+ settings: stored({ hasAiAgent: true }),
353
465
  changes: { aiAccessRunnerId: RUNNER_ID },
354
466
  },
355
- {
356
- name: "unbind the credential",
357
- settings: stored({ aiAccessCredentialId: CREDENTIAL_ID }),
358
- changes: { aiAccessCredentialId: null },
359
- },
360
467
  {
361
468
  name: "bind a credential",
362
469
  settings: stored(),
@@ -369,9 +476,14 @@ describe("who may loosen: the page and the server agree", () => {
369
476
  },
370
477
  {
371
478
  name: "turn investigation off",
372
- settings: stored(),
479
+ settings: stored({ hasAiAgent: true }),
373
480
  changes: { isAiInvestigationEnabled: false },
374
481
  },
482
+ {
483
+ name: "turn investigation on",
484
+ settings: stored({ hasAiAgent: true }),
485
+ changes: { isAiInvestigationEnabled: true },
486
+ },
375
487
  ];
376
488
 
377
489
  test("harness guard: the server refuses a member's loosening and accepts their tightening", async () => {
@@ -396,6 +508,31 @@ describe("who may loosen: the page and the server agree", () => {
396
508
  });
397
509
  });
398
510
  }
511
+
512
+ // The modes the modal offers a member are exactly the ones the server accepts.
513
+ test("the modes offered to a member are the ones the server lets them save", async () => {
514
+ for (const savedMode of Object.values(KubernetesAiRemediationMode)) {
515
+ for (const mode of Object.values(KubernetesAiRemediationMode)) {
516
+ if (mode === savedMode) {
517
+ continue;
518
+ }
519
+ const settings: StoredSettings = stored({
520
+ aiRemediationMode: savedMode,
521
+ });
522
+ expect({
523
+ savedMode,
524
+ mode,
525
+ offered: isRemediationModeOpenToEveryEditor(mode, savedMode),
526
+ }).toEqual({
527
+ savedMode,
528
+ mode,
529
+ offered: !(await serverSaysLoosens(settings, {
530
+ aiRemediationMode: mode,
531
+ })),
532
+ });
533
+ }
534
+ }
535
+ });
399
536
  });
400
537
 
401
538
  /*
@@ -414,10 +551,17 @@ describe("a cluster editor's tightening through the form is accepted end to end"
414
551
  name: "steps down from Bypass approval to Automatic",
415
552
  settings: stored({
416
553
  aiRemediationMode: KubernetesAiRemediationMode.BypassApproval,
554
+ hasAiAgent: true,
417
555
  }),
418
556
  edits: { aiRemediationMode: KubernetesAiRemediationMode.Automatic },
419
557
  expected: { aiRemediationMode: KubernetesAiRemediationMode.Automatic },
420
558
  },
559
+ {
560
+ name: "turns fixes off",
561
+ settings: stored({ hasAiAgent: true }),
562
+ edits: { aiRemediationMode: KubernetesAiRemediationMode.Disabled },
563
+ expected: { aiRemediationMode: KubernetesAiRemediationMode.Disabled },
564
+ },
421
565
  {
422
566
  name: "removes a pattern",
423
567
  settings: stored(),
@@ -425,7 +569,6 @@ describe("a cluster editor's tightening through the form is accepted end to end"
425
569
  expected: { aiKubectlCommandAllowlist: [PATCH_PATTERN] },
426
570
  },
427
571
  {
428
- // The form shows the kept line re-spaced; it is sent as stored.
429
572
  name: "removes a pattern next to one stored with odd spacing",
430
573
  settings: stored({
431
574
  aiKubectlCommandAllowlist: [SET_IMAGE_PATTERN, ODDLY_SPACED_PATTERN],
@@ -443,7 +586,7 @@ describe("a cluster editor's tightening through the form is accepted end to end"
443
586
  expected: { aiKubectlCommandAllowlist: [] },
444
587
  },
445
588
  {
446
- name: "unbinds the Runner and the credential",
589
+ name: "unbinds the Runner and the credential of a cluster without an AI agent",
447
590
  settings: stored({ aiAccessCredentialId: CREDENTIAL_ID }),
448
591
  edits: { clearAiAccessRunner: true, clearAiAccessCredential: true },
449
592
  expected: { aiAccessRunnerId: null, aiAccessCredentialId: null },
@@ -459,6 +602,8 @@ describe("a cluster editor's tightening through the form is accepted end to end"
459
602
  canConfigureUnattended: false,
460
603
  isRunnerPickerAvailable: false,
461
604
  isCredentialPickerAvailable: false,
605
+ isAdvancedBinding: saved.aiAccessRunnerId !== null,
606
+ hasAiAgent: edit.settings.hasAiAgent,
462
607
  });
463
608
  const changes: JSONObject = getKubernetesAiAccessSettingsChanges({
464
609
  saved,
@@ -470,12 +615,45 @@ describe("a cluster editor's tightening through the form is accepted end to end"
470
615
  });
471
616
 
472
617
  expect(changes).toEqual(edit.expected);
473
- expect(getKubernetesAiAccessLooseningChanges({ saved, changes })).toEqual(
474
- [],
475
- );
618
+ expect(
619
+ getKubernetesAiAccessLooseningChanges({
620
+ saved,
621
+ changes,
622
+ hasAiAgent: edit.settings.hasAiAgent,
623
+ }),
624
+ ).toEqual([]);
476
625
  expect(await serverSaysLoosens(edit.settings, changes)).toBe(false);
477
626
  });
478
627
  }
628
+
629
+ /*
630
+ * The unbind switch is gone for a member once the cluster has an agent
631
+ * — and the server would refuse the write it used to send.
632
+ */
633
+ test("a member is not offered the unbind the server would refuse", async () => {
634
+ const settings: StoredSettings = stored({
635
+ aiAccessCredentialId: CREDENTIAL_ID,
636
+ hasAiAgent: true,
637
+ });
638
+ const offered: KubernetesAiAccessOfferedFields =
639
+ getKubernetesAiAccessOfferedFields({
640
+ saved: asPageSaved(settings),
641
+ canConfigureUnattended: false,
642
+ isRunnerPickerAvailable: false,
643
+ isCredentialPickerAvailable: false,
644
+ isAdvancedBinding: true,
645
+ hasAiAgent: true,
646
+ });
647
+
648
+ expect(offered.runnerClear).toBe(false);
649
+ expect(offered.credentialClear).toBe(false);
650
+ expect(
651
+ await serverSaysLoosens(settings, {
652
+ aiAccessRunnerId: null,
653
+ aiAccessCredentialId: null,
654
+ }),
655
+ ).toBe(true);
656
+ });
479
657
  });
480
658
 
481
659
  function fakeCluster(
@@ -487,16 +665,17 @@ function fakeCluster(
487
665
  projectId: PROJECT_ID,
488
666
  name: "prod-us",
489
667
  clusterIdentifier: "prod-us",
490
- aiAccessRunnerId: new ObjectID(RUNNER_ID),
668
+ aiAccessRunnerId: undefined,
491
669
  aiAccessCredentialId: undefined,
492
670
  isAiInvestigationEnabled: true,
493
- aiRemediationMode: KubernetesAiRemediationMode.RequireApproval,
671
+ aiRemediationMode: KubernetesAiRemediationMode.Disabled,
494
672
  aiKubectlCommandAllowlist: undefined,
495
673
  ...overrides,
496
674
  } as unknown as KubernetesCluster;
497
675
  }
498
676
 
499
- function fakeRunner(overrides: Record<string, unknown> = {}): Runner {
677
+ // The chart's previous in-cluster Runner of this cluster.
678
+ function fakeLegacyRunner(overrides: Record<string, unknown> = {}): Runner {
500
679
  return {
501
680
  id: new ObjectID(RUNNER_ID),
502
681
  _id: RUNNER_ID,
@@ -514,14 +693,30 @@ function fakeRunner(overrides: Record<string, unknown> = {}): Runner {
514
693
  } as unknown as Runner;
515
694
  }
516
695
 
696
+ // A Runner an operator created, outside the chart.
697
+ function fakeAdvancedRunner(overrides: Record<string, unknown> = {}): Runner {
698
+ return {
699
+ id: new ObjectID(OTHER_RUNNER_ID),
700
+ _id: OTHER_RUNNER_ID,
701
+ name: "bash-runner",
702
+ lastAlive: OneUptimeDate.getCurrentDate(),
703
+ canRunAiCommands: true,
704
+ hostInfo: {},
705
+ ...overrides,
706
+ } as unknown as Runner;
707
+ }
708
+
517
709
  async function realStatus(data: {
518
710
  cluster: KubernetesCluster;
519
- runner: Runner | null;
711
+ runner?: Runner | null;
712
+ agentRow?: KubernetesAiAgent | null;
713
+ gates?: KubernetesClusterAiAccessProjectGates;
520
714
  }): Promise<KubernetesClusterAiAccessStatus> {
521
- jest.spyOn(RunnerService, "findOneBy").mockResolvedValue(data.runner);
715
+ jest.spyOn(RunnerService, "findOneBy").mockResolvedValue(data.runner || null);
522
716
  return await KubernetesClusterAiAccessService.getStatusForClusterModel({
523
717
  cluster: data.cluster,
524
- gates: READY_GATES,
718
+ gates: data.gates || READY_GATES,
719
+ aiAgentRow: data.agentRow ?? null,
525
720
  });
526
721
  }
527
722
 
@@ -532,119 +727,266 @@ function gapCodes(status: KubernetesClusterAiAccessStatus): Array<string> {
532
727
  }
533
728
 
534
729
  /*
535
- * The server tells "no Runner can reach this cluster" from "this cluster's
536
- * in-cluster Runner is installed but not selected" only in the words of
537
- * one no_runner_bound gap. The page's connect card is chosen from those
538
- * words, so it is checked against what the real status produces.
730
+ * The server resolves the access target (agent, previous Runner, advanced
731
+ * Runner, none) and the page reads the result. Each state of the card is
732
+ * checked against what the real status produces for it.
539
733
  */
540
- describe("the connect card follows the real status", () => {
541
- test("no Runner bound and none registered: the helm upgrade", async () => {
734
+ describe("the AI agent card follows the real status", () => {
735
+ test("every status carries the agent and the automatic-investigation opt-ins", async () => {
542
736
  const status: KubernetesClusterAiAccessStatus = await realStatus({
543
- cluster: fakeCluster({ aiAccessRunnerId: undefined }),
544
- runner: null,
737
+ cluster: fakeCluster(),
738
+ });
739
+ expect(status).toHaveProperty("aiAgent", null);
740
+ expect(getAutomaticInvestigation(status)).toEqual({
741
+ incidents: true,
742
+ alerts: false,
545
743
  });
546
- expect(gapCodes(status)).toEqual(["no_runner_bound"]);
547
- expect(getAiAccessConnectCardMode(status)).toBe("connect");
548
744
  });
549
745
 
550
- test("no Runner bound but this cluster's in-cluster Runner registered: select it", async () => {
746
+ test("nothing installed: the install command, and Needs attention says so", async () => {
551
747
  const status: KubernetesClusterAiAccessStatus = await realStatus({
552
- cluster: fakeCluster({ aiAccessRunnerId: undefined }),
553
- runner: fakeRunner(),
748
+ cluster: fakeCluster(),
554
749
  });
555
- expect(gapCodes(status)).toEqual(["no_runner_bound"]);
556
- expect(getAiAccessConnectCardMode(status)).toBe("select_agent_runner");
750
+ expect(gapCodes(status)).toContain("ai_agent_not_connected");
751
+ expect(getAiAgentCardState(status)).toBe("not_installed");
752
+ expect(getAiAgentCardCommand(status)).toBe("install");
753
+ expect(getAiAgentOverviewState(status).text).toBe("Not installed");
754
+ expect(
755
+ getAttentionGaps(status).map((gap: KubernetesAiAccessGap): string => {
756
+ return gap.code;
757
+ }),
758
+ ).toContain("ai_agent_not_connected");
557
759
  });
558
760
 
559
- test("a bound read-only in-cluster Runner: no connect card, and the page says it is read-only", async () => {
761
+ /*
762
+ * A default install: the agent connected, read-only, Fixes off. The one
763
+ * server gap is the fixes-off choice, so the page shows no Needs
764
+ * attention card and reads Ready.
765
+ */
766
+ test("the agent online, fixes off: connected, ready, nothing needs attention", async () => {
560
767
  const status: KubernetesClusterAiAccessStatus = await realStatus({
561
768
  cluster: fakeCluster(),
562
- runner: fakeRunner(),
769
+ agentRow: makeAgentRow(),
563
770
  });
564
- expect(gapCodes(status)).toContain("remediation_write_access_missing");
565
- expect(getAiAccessConnectCardMode(status)).toBe("none");
566
- expect(describeRunnerWriteAccess(status.runner?.posture)).toBe(
567
- "read-only RBAC",
568
- );
771
+ expect(status.runner?.kind).toBe("ai_agent");
772
+ expect(status.accessMethod).toBe("in_cluster");
773
+ expect(getAiAgentSummary(status)?.id).toBe(AGENT_ID);
774
+ expect(getAiAgentCardState(status)).toBe("connected");
775
+ expect(gapCodes(status)).toEqual(["remediation_disabled"]);
776
+ expect(getAttentionGaps(status)).toEqual([]);
777
+ expect(status.isInvestigationReady).toBe(true);
778
+ expect(shouldShowWriteAccessCommands(status)).toBe(false);
779
+ expect(getAiAgentOverviewState(status).text).toBe("Connected");
569
780
  });
570
781
 
571
- test("a credential on another cluster's in-cluster Runner: its gap, no connect card", async () => {
782
+ test("the agent offline: its logs, in the namespace it reported", async () => {
572
783
  const status: KubernetesClusterAiAccessStatus = await realStatus({
573
- cluster: fakeCluster({
574
- aiAccessCredentialId: new ObjectID(CREDENTIAL_ID),
575
- }),
576
- runner: fakeRunner({
577
- name: "kubernetes-agent/prod-eu",
578
- hostInfo: {
579
- kubernetes: {
580
- inCluster: true,
581
- allowWrites: false,
582
- clusterIdentifier: "prod-eu",
583
- },
584
- },
784
+ cluster: fakeCluster(),
785
+ agentRow: makeAgentRow({
786
+ lastAliveAt: OneUptimeDate.addRemoveMinutes(
787
+ OneUptimeDate.getCurrentDate(),
788
+ -30,
789
+ ),
585
790
  }),
586
791
  });
587
- expect(gapCodes(status)).toContain("credential_on_agent_runner");
588
- expect(getAiAccessConnectCardMode(status)).toBe("none");
792
+ expect(gapCodes(status)).toContain("ai_agent_offline");
793
+ expect(getAiAgentCardState(status)).toBe("offline");
794
+ expect(getAiAgentCardCommand(status)).toBe("logs");
795
+ expect(getAiAgentPodNamespace(status)).toBe("monitoring");
796
+ expect(getAiAgentOverviewState(status).text).toBe("Offline");
797
+ // It never signed off: its heartbeats stopped.
798
+ expect(getAiAgentOfflineReason(status)).toBe("silent");
799
+ expect(getAiAgentStateSentence(status)).toBe(AI_AGENT_SILENT_TEXT);
589
800
  });
590
- });
591
801
 
592
- /*
593
- * The finding (dashboard-ai-page-2): the server shortens an agent Runner's
594
- * name with a hash once "kubernetes-agent/<id>" passes 100 characters, and
595
- * the page rebuilt the name to find this cluster's Runner.
596
- */
597
- describe("the Runner picker recognises the Runner name the server gives", () => {
598
- function agentRunner(id: string, clusterIdentifier: string): Runner {
599
- return Object.assign(new Runner(), {
600
- _id: id,
601
- name: getKubernetesAgentRunnerNameForCluster(clusterIdentifier),
602
- canRunAiCommands: true,
603
- hostInfo: {
604
- kubernetes: { inCluster: true, allowWrites: false, clusterIdentifier },
605
- },
802
+ /*
803
+ * The server's two halves of "offline" (KubernetesAiAgentService.isOnline)
804
+ * are written by its own sign-off and reset. Each is run for real here —
805
+ * only the database write is captured and applied to the row — and the
806
+ * status the real service then computes must read as a sign-off on the
807
+ * page: offline at once, last seen seconds ago, and a sentence that does
808
+ * not claim five silent minutes.
809
+ */
810
+ describe("the agent's own sign-off and an admin's reset", () => {
811
+ function captureWrites(row: KubernetesAiAgent): void {
812
+ jest
813
+ .spyOn(KubernetesAiAgentService, "updateColumnsByIdWithoutHooks")
814
+ .mockImplementation(async (input: unknown): Promise<void> => {
815
+ Object.assign(row, (input as { data: Record<string, unknown> }).data);
816
+ });
817
+ jest
818
+ .spyOn(KubernetesAiAgentService, "updateOneById")
819
+ .mockImplementation(async (input: unknown): Promise<number> => {
820
+ Object.assign(row, (input as { data: Record<string, unknown> }).data);
821
+ return 1;
822
+ });
823
+ jest
824
+ .spyOn(KubernetesAiAgentService, "findForCluster")
825
+ .mockResolvedValue(row);
826
+ jest
827
+ .spyOn(KubernetesClusterFeedService, "createKubernetesClusterFeedItem")
828
+ .mockResolvedValue(undefined as never);
829
+ jest
830
+ .spyOn(UserService, "getUserMarkdownString")
831
+ .mockResolvedValue("an admin");
832
+ jest.spyOn(logger, "info").mockImplementation((): void => {
833
+ return undefined;
834
+ });
835
+ }
836
+
837
+ async function expectSignedOff(row: KubernetesAiAgent): Promise<void> {
838
+ const status: KubernetesClusterAiAccessStatus = await realStatus({
839
+ cluster: fakeCluster(),
840
+ agentRow: row,
841
+ });
842
+ expect(getAiAgentSummary(status)?.connectionStatus).toBe("disconnected");
843
+ expect(getAiAgentCardState(status)).toBe("offline");
844
+ expect(getAiAgentOverviewState(status).text).toBe("Offline");
845
+ expect(getAiAgentOfflineReason(status)).toBe("signed_off");
846
+ expect(getAiAgentStateSentence(status)).toBe(AI_AGENT_SIGNED_OFF_TEXT);
847
+ expect(getAiAgentStateSentence(status)).not.toContain(
848
+ "has not checked in",
849
+ );
850
+ expect(getAiAgentMetaParts(status)[0]).toMatch(/^last seen /);
851
+ expect(getAiAgentCardCommand(status)).toBe("logs");
852
+ }
853
+
854
+ test("a clean shutdown (a helm upgrade's old pod) reads as signed off", async () => {
855
+ const row: KubernetesAiAgent = makeAgentRow();
856
+ captureWrites(row);
857
+
858
+ await KubernetesAiAgentService.markDisconnected({
859
+ kubernetesAiAgentId: new ObjectID(AGENT_ID),
860
+ });
861
+
862
+ await expectSignedOff(row);
606
863
  });
607
- }
608
864
 
609
- for (const length of [83, 84, 87, 100]) {
610
- test(`a ${length}-character cluster identifier`, () => {
611
- const identifier: string = `eks-${"a".repeat(length - 9)}-blue`;
612
- const other: string = `eks-${"a".repeat(length - 9)}-gren`;
613
- expect(identifier.length).toBe(length);
865
+ test("Reset agent reads as signed off, not as five silent minutes", async () => {
866
+ const row: KubernetesAiAgent = makeAgentRow();
867
+ captureWrites(row);
614
868
 
615
- const options: Array<DropdownOption> = buildKubernetesAiRunnerOptions({
616
- runners: [
617
- agentRunner("r-other", other),
618
- agentRunner("r-this", identifier),
619
- ],
620
- clusterIdentifier: identifier,
621
- boundRunnerId: null,
622
- boundRunnerName: null,
869
+ await KubernetesAiAgentService.resetAgent({
870
+ projectId: PROJECT_ID,
871
+ kubernetesClusterId: CLUSTER_ID,
872
+ userId: ObjectID.generate(),
623
873
  });
624
874
 
625
- expect(options).toEqual([
626
- {
627
- value: "r-this",
628
- label: `${getKubernetesAgentRunnerNameForCluster(identifier)} (in-cluster Runner for this cluster)`,
629
- },
630
- ]);
875
+ await expectSignedOff(row);
631
876
  });
632
- }
633
877
 
634
- test("harness guard: past 83 characters the server's name is not kubernetes-agent/<id>", () => {
635
- const identifier: string = "a".repeat(84);
636
- expect(getKubernetesAgentRunnerNameForCluster(identifier)).not.toBe(
637
- `kubernetes-agent/${identifier}`,
638
- );
878
+ test("a sign-off it never came back from reads as gone", async () => {
879
+ const status: KubernetesClusterAiAccessStatus = await realStatus({
880
+ cluster: fakeCluster(),
881
+ agentRow: makeAgentRow({
882
+ connectionStatus: "disconnected",
883
+ lastAliveAt: OneUptimeDate.addRemoveMinutes(
884
+ OneUptimeDate.getCurrentDate(),
885
+ -30,
886
+ ),
887
+ }),
888
+ });
889
+ expect(getAiAgentCardState(status)).toBe("offline");
890
+ expect(getAiAgentOfflineReason(status)).toBe("gone");
891
+ expect(getAiAgentStateSentence(status)).toBe(AI_AGENT_GONE_TEXT);
892
+ });
893
+ });
894
+
895
+ test("fixes on with a read-only agent: the write-access commands and their gap", async () => {
896
+ const status: KubernetesClusterAiAccessStatus = await realStatus({
897
+ cluster: fakeCluster({
898
+ aiRemediationMode: KubernetesAiRemediationMode.RequireApproval,
899
+ }),
900
+ agentRow: makeAgentRow(),
901
+ });
902
+ expect(gapCodes(status)).toContain("remediation_write_access_missing");
903
+ expect(shouldShowWriteAccessCommands(status)).toBe(true);
904
+ // Its action is the commands already on the page.
905
+ expect(
906
+ getAiAgentGapAction(
907
+ status.gaps.find((gap: KubernetesAiAccessGap): boolean => {
908
+ return gap.code === "remediation_write_access_missing";
909
+ })!,
910
+ status,
911
+ ),
912
+ ).toBeNull();
913
+ });
914
+
915
+ test("the previous in-cluster Runner, online and bound: works today", async () => {
916
+ const status: KubernetesClusterAiAccessStatus = await realStatus({
917
+ cluster: fakeCluster({ aiAccessRunnerId: new ObjectID(RUNNER_ID) }),
918
+ runner: fakeLegacyRunner(),
919
+ });
920
+ expect(isLegacyRunnerTarget(status)).toBe(true);
921
+ expect(getAiAgentCardState(status)).toBe("legacy_runner");
922
+ expect(getAiAgentCardCommand(status)).toBe("install");
923
+ });
924
+
925
+ /*
926
+ * Rolling the chart back (or the seconds of a helm upgrade) leaves the
927
+ * legacy Runner online and the agent offline: the page follows the
928
+ * server to the Runner, not to an agent that is not there.
929
+ */
930
+ test("a rollback: the previous Runner online and the agent offline resolves to the Runner", async () => {
931
+ const status: KubernetesClusterAiAccessStatus = await realStatus({
932
+ cluster: fakeCluster({ aiAccessRunnerId: new ObjectID(RUNNER_ID) }),
933
+ runner: fakeLegacyRunner(),
934
+ agentRow: makeAgentRow({ connectionStatus: "disconnected" }),
935
+ });
936
+ expect(getAiAgentCardState(status)).toBe("legacy_runner");
937
+ expect(getAiAgentSummary(status)?.isOnline).toBe(false);
938
+ });
939
+
940
+ test("the agent online wins over the previous Runner bound", async () => {
941
+ const status: KubernetesClusterAiAccessStatus = await realStatus({
942
+ cluster: fakeCluster({ aiAccessRunnerId: new ObjectID(RUNNER_ID) }),
943
+ runner: fakeLegacyRunner(),
944
+ agentRow: makeAgentRow(),
945
+ });
946
+ expect(getAiAgentCardState(status)).toBe("connected");
947
+ });
948
+
949
+ test("an advanced Runner wins over an online agent, and can be switched back to it", async () => {
950
+ const status: KubernetesClusterAiAccessStatus = await realStatus({
951
+ cluster: fakeCluster({
952
+ aiAccessRunnerId: new ObjectID(OTHER_RUNNER_ID),
953
+ aiAccessCredentialId: new ObjectID(CREDENTIAL_ID),
954
+ }),
955
+ runner: fakeAdvancedRunner(),
956
+ agentRow: makeAgentRow(),
957
+ });
958
+ expect(isAdvancedRunnerTarget(status)).toBe(true);
959
+ expect(getAiAgentCardState(status)).toBe("advanced_runner");
960
+ expect(canSwitchToAiAgent(status)).toBe(true);
961
+ expect(getAiAgentCardCommand(status)).toBeNull();
962
+ });
963
+
964
+ test("project gates become Needs attention rows the page acts on", async () => {
965
+ const status: KubernetesClusterAiAccessStatus = await realStatus({
966
+ cluster: fakeCluster(),
967
+ agentRow: makeAgentRow(),
968
+ gates: {
969
+ ...READY_GATES,
970
+ isAiEnabled: false,
971
+ hasLlmProvider: false,
972
+ aiBalanceBlocker: "The project's AI balance is used up.",
973
+ },
974
+ });
975
+ const actions: Record<string, string | null> = {};
976
+ for (const gap of getAttentionGaps(status)) {
977
+ actions[gap.code] = getAiAgentGapAction(gap, status);
978
+ }
979
+ expect(actions).toEqual({
980
+ project_ai_disabled: "open_ai_features",
981
+ llm_provider_missing: "open_llm_providers",
982
+ ai_balance_insufficient: "open_ai_credits",
983
+ });
639
984
  });
640
985
  });
641
986
 
642
987
  /*
643
- * One definition of a usable allowlist entry. These entries get the same
644
- * answer from the page and from the server's save validation. (Entries the
645
- * matcher reads but the server's validation still refuses on its own
646
- * terms — a pattern without the leading "kubectl" — are the server's to
647
- * change; see KubectlPolicy.describeAllowlistPatternProblem.)
988
+ * One definition of a usable allowlist entry: the page and the server's
989
+ * save validation give these entries the same answer.
648
990
  */
649
991
  describe("allowlist validation: the page and the server agree", () => {
650
992
  const ENTRIES: Array<{ name: string; patterns: Array<string> }> = [
@@ -689,7 +1031,7 @@ describe("allowlist validation: the page and the server agree", () => {
689
1031
  * The Runner pages against RunnerService, run for real with only the
690
1032
  * database read stubbed. The pages decide which rows are kubernetes-agent
691
1033
  * rows with the server's rule, and their edit form posts nothing the
692
- * server's write hook refuses — and leaves out exactly what it refuses.
1034
+ * server's write hook refuses.
693
1035
  */
694
1036
  describe("the Runner pages and RunnerService agree on agent rows", () => {
695
1037
  interface RowCase {
@@ -714,10 +1056,6 @@ describe("the Runner pages and RunnerService agree on agent rows", () => {
714
1056
  label: "a case-variant agent name",
715
1057
  row: { name: "Kubernetes-Agent/prod", hostInfo: {} },
716
1058
  },
717
- {
718
- label: "a padded upper-case agent name",
719
- row: { name: " KUBERNETES-AGENT/prod ", hostInfo: {} },
720
- },
721
1059
  {
722
1060
  label: "an agent by posture alone (a legacy rename)",
723
1061
  row: { name: "prod-kubectl", hostInfo: AGENT_POSTURE },
@@ -753,7 +1091,6 @@ describe("the Runner pages and RunnerService agree on agent rows", () => {
753
1091
  } as DatabaseCommonInteractionProps;
754
1092
  }
755
1093
 
756
- // Serves `row` as the Runner the update hook reads.
757
1094
  function serveRunnerRow(row: RowCase["row"]): void {
758
1095
  jest.spyOn(RunnerService, "findBy").mockResolvedValue([
759
1096
  {
@@ -764,7 +1101,6 @@ describe("the Runner pages and RunnerService agree on agent rows", () => {
764
1101
  ]);
765
1102
  }
766
1103
 
767
- // What the hook says about a non-root update of `row`: null, or the refusal.
768
1104
  async function serverRefusal(
769
1105
  row: RowCase["row"],
770
1106
  data: JSONObject,
@@ -788,7 +1124,6 @@ describe("the Runner pages and RunnerService agree on agent rows", () => {
788
1124
  }
789
1125
  }
790
1126
 
791
- // The fields the detail page's edit form offers for `row`.
792
1127
  function formFieldNames(row: RowCase["row"]): Array<string> {
793
1128
  return getRunnerFormFields({
794
1129
  withSteps: false,
@@ -810,7 +1145,7 @@ describe("the Runner pages and RunnerService agree on agent rows", () => {
810
1145
  }
811
1146
  });
812
1147
 
813
- test("the form's locks are the hook's rules: the name marker, and the row rule", () => {
1148
+ test("the form's locks are the hook's rules", () => {
814
1149
  for (const rowCase of ROWS) {
815
1150
  const restrictions: RunnerFormRestrictions = getRunnerFormRestrictions(
816
1151
  rowCase.row,
@@ -828,35 +1163,6 @@ describe("the Runner pages and RunnerService agree on agent rows", () => {
828
1163
  }
829
1164
  });
830
1165
 
831
- /*
832
- * What the form posts for a row: every field it offers, the capability
833
- * switches it offers as they are stored (off) and "Runs AI Remediation
834
- * Commands" on, the name re-posted unchanged.
835
- */
836
- test("the hook accepts everything the edit form posts, for every row", async () => {
837
- for (const rowCase of ROWS) {
838
- const fields: Array<string> = formFieldNames(rowCase.row);
839
- const data: JSONObject = {};
840
-
841
- if (fields.includes("name")) {
842
- data["name"] = rowCase.row.name as string;
843
- }
844
- data["description"] = "Edited from the Runner page.";
845
- if (fields.includes("canRunRunbooks")) {
846
- data["canRunRunbooks"] = false;
847
- }
848
- if (fields.includes("canRunCodeFixTasks")) {
849
- data["canRunCodeFixTasks"] = false;
850
- }
851
- data["canRunAiCommands"] = true;
852
-
853
- expect({
854
- row: rowCase.label,
855
- refusal: await serverRefusal(rowCase.row, data),
856
- }).toEqual({ row: rowCase.label, refusal: null });
857
- }
858
- });
859
-
860
1166
  test("the hook refuses exactly what the form leaves out", async () => {
861
1167
  for (const rowCase of ROWS) {
862
1168
  const fields: Array<string> = formFieldNames(rowCase.row);
@@ -865,20 +1171,15 @@ describe("the Runner pages and RunnerService agree on agent rows", () => {
865
1171
  (await serverRefusal(rowCase.row, { name: "renamed-runner" })) !== null;
866
1172
  const runbooksRefused: boolean =
867
1173
  (await serverRefusal(rowCase.row, { canRunRunbooks: true })) !== null;
868
- const codeFixesRefused: boolean =
869
- (await serverRefusal(rowCase.row, { canRunCodeFixTasks: true })) !==
870
- null;
871
1174
 
872
1175
  expect({
873
1176
  row: rowCase.label,
874
1177
  renameRefused,
875
1178
  runbooksRefused,
876
- codeFixesRefused,
877
1179
  }).toEqual({
878
1180
  row: rowCase.label,
879
1181
  renameRefused: !fields.includes("name"),
880
1182
  runbooksRefused: !fields.includes("canRunRunbooks"),
881
- codeFixesRefused: !fields.includes("canRunCodeFixTasks"),
882
1183
  });
883
1184
  }
884
1185
  });
@@ -887,11 +1188,9 @@ describe("the Runner pages and RunnerService agree on agent rows", () => {
887
1188
  for (const name of [
888
1189
  "kubernetes-agent/prod",
889
1190
  "Kubernetes-Agent/prod",
890
- " KUBERNETES-AGENT/prod",
891
1191
  "prod-runner",
892
1192
  "kubernetes-agent",
893
1193
  "kubernetes-agent-office",
894
- "my-kubernetes-agent/prod",
895
1194
  ]) {
896
1195
  let serverRefuses: boolean = false;
897
1196
  try {