@oneuptime/common 14.0.8 → 14.0.9

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 (639) hide show
  1. package/Models/DatabaseModels/Index.ts +2 -0
  2. package/Models/DatabaseModels/KubernetesAiAgent.ts +364 -0
  3. package/Models/DatabaseModels/KubernetesCluster.ts +3 -3
  4. package/Models/DatabaseModels/Project.ts +55 -5
  5. package/Models/DatabaseModels/ProxmoxResource.ts +49 -1
  6. package/Models/DatabaseModels/RunnerJob.ts +75 -0
  7. package/Models/DatabaseModels/TeamComplianceSetting.ts +143 -2
  8. package/Models/DatabaseModels/WorkspaceProjectAuthToken.ts +17 -0
  9. package/Server/API/AIChatAPI.ts +6 -3
  10. package/Server/API/AIInvestigationAPI.ts +17 -10
  11. package/Server/API/AutoRemediationAPI.ts +207 -25
  12. package/Server/API/KubernetesClusterAiAccessAPI.ts +623 -21
  13. package/Server/API/MicrosoftTeamsAPI.ts +93 -14
  14. package/Server/API/ProxmoxResourceAPI.ts +244 -14
  15. package/Server/Infrastructure/GlobalCache.ts +32 -0
  16. package/Server/Infrastructure/Postgres/SchemaMigrations/1796000000000-AddTeamComplianceRuleScope.ts +99 -0
  17. package/Server/Infrastructure/Postgres/SchemaMigrations/1796100000000-AddKubernetesAiAgentAndAiDefaults.ts +137 -0
  18. package/Server/Infrastructure/Postgres/SchemaMigrations/1796200000000-AddProxmoxResourceNativePushColumns.ts +42 -0
  19. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +6 -0
  20. package/Server/Middleware/TelemetryIngest.ts +41 -18
  21. package/Server/Services/AIService.ts +70 -1
  22. package/Server/Services/AlertService.ts +352 -11
  23. package/Server/Services/AlertSeverityService.ts +65 -15
  24. package/Server/Services/AutoRemediationRuleService.ts +1 -1
  25. package/Server/Services/IncidentService.ts +280 -104
  26. package/Server/Services/IncidentSeverityService.ts +66 -15
  27. package/Server/Services/KubernetesAiAgentJobService.ts +185 -0
  28. package/Server/Services/KubernetesAiAgentService.ts +1634 -0
  29. package/Server/Services/KubernetesClusterAiAccessService.ts +1118 -451
  30. package/Server/Services/KubernetesClusterService.ts +129 -21
  31. package/Server/Services/ProjectService.ts +32 -0
  32. package/Server/Services/ProxmoxResourceService.ts +322 -5
  33. package/Server/Services/RunnerJobService.ts +241 -104
  34. package/Server/Services/RunnerService.ts +1 -1
  35. package/Server/Services/ScheduledMaintenanceService.ts +737 -1
  36. package/Server/Services/ScheduledMaintenanceStateTimelineService.ts +414 -56
  37. package/Server/Services/TeamComplianceSettingService.ts +1125 -9
  38. package/Server/Utils/AI/ClusterAccess/ClusterAccessContext.ts +67 -9
  39. package/Server/Utils/AI/ClusterAccess/KubectlInvestigationToolkit.ts +39 -10
  40. package/Server/Utils/AI/ClusterAccess/KubectlJobRunner.ts +14 -3
  41. package/Server/Utils/AI/Remediation/RemediationCommandTools.ts +37 -15
  42. package/Server/Utils/AI/Remediation/RemediationExecutionRunner.ts +67 -24
  43. package/Server/Utils/AI/SRE/AIInvestigationEngine.ts +48 -5
  44. package/Server/Utils/AI/SRE/IncidentPostmortemRunner.ts +40 -8
  45. package/Server/Utils/AI/SRE/InvestigationEligibility.ts +13 -2
  46. package/Server/Utils/AI/SRE/InvestigationGrader.ts +1 -1
  47. package/Server/Utils/AutoRemediation/CommandPlanExecutor.ts +6 -1
  48. package/Server/Utils/Telemetry/InventoryEntityRegistry.ts +133 -7
  49. package/Server/Utils/Telemetry/ProxmoxCephSnapshotScan.ts +58 -4
  50. package/Server/Utils/Telemetry/ProxmoxNativeNodeLiveness.ts +447 -0
  51. package/Server/Utils/Telemetry/ProxmoxNativePush.ts +903 -0
  52. package/Server/Utils/Telemetry/TelemetryEntity.ts +87 -27
  53. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +684 -47
  54. package/Tests/App/AdminDashboard/RowActionPlacementOverrides.test.tsx +278 -0
  55. package/Tests/App/Dashboard/AIChatChartWidgetZoom.test.tsx +738 -0
  56. package/Tests/App/Dashboard/AIFeaturesSettingsPointers.test.tsx +147 -0
  57. package/Tests/App/Dashboard/AIInsightsKubernetesClusterPage.test.tsx +1523 -0
  58. package/Tests/App/Dashboard/AdminUserNotificationMethodsPage.test.tsx +463 -3
  59. package/Tests/App/Dashboard/AffectedResourcesPickerDropdownPlacement.test.tsx +958 -0
  60. package/Tests/App/Dashboard/AffectedResourcesPickerFocusLeave.test.tsx +595 -0
  61. package/Tests/App/Dashboard/AskAiAvailability.test.ts +20 -3
  62. package/Tests/App/Dashboard/AskAiDisabled.test.tsx +8 -3
  63. package/Tests/App/Dashboard/CephRateChartReload.test.tsx +1456 -0
  64. package/Tests/App/Dashboard/CephTimeRangeZoom.test.tsx +1229 -0
  65. package/Tests/App/Dashboard/ChartCardTimeRangeZoom.test.tsx +151 -0
  66. package/Tests/App/Dashboard/ChartCardZoomAffordances.test.tsx +257 -0
  67. package/Tests/App/Dashboard/ChartRefetchFrame.test.tsx +141 -0
  68. package/Tests/App/Dashboard/ChartZoomHarness.tsx +249 -0
  69. package/Tests/App/Dashboard/ChartZoomStandIn.tsx +131 -0
  70. package/Tests/App/Dashboard/CloudServerlessSlowLoads.test.tsx +628 -0
  71. package/Tests/App/Dashboard/CloudServerlessTimeRangeZoom.test.tsx +607 -0
  72. package/Tests/App/Dashboard/ClusterAccessNotice.test.tsx +91 -19
  73. package/Tests/App/Dashboard/CompanionMetricsTabZoom.test.tsx +632 -0
  74. package/Tests/App/Dashboard/ContainerChartZoomStandIn.tsx +195 -0
  75. package/Tests/App/Dashboard/ContainerHostOverviewSlowLoads.test.tsx +542 -0
  76. package/Tests/App/Dashboard/ContainerHostOverviewTimeRangeZoom.test.tsx +848 -0
  77. package/Tests/App/Dashboard/ContainerMetricsTimeRangeZoom.test.tsx +561 -0
  78. package/Tests/App/Dashboard/DashboardBoardWideZoomShell.test.tsx +1147 -0
  79. package/Tests/App/Dashboard/DashboardEditPermissions.test.tsx +3 -2
  80. package/Tests/App/Dashboard/DashboardHistogramWidgetDragCursor.test.tsx +399 -0
  81. package/Tests/App/Dashboard/DashboardHistogramWidgetZoom.test.tsx +985 -0
  82. package/Tests/App/Dashboard/DashboardHistogramWidgetZoomHint.test.tsx +803 -0
  83. package/Tests/App/Dashboard/DashboardLazyPages.test.tsx +1 -0
  84. package/Tests/App/Dashboard/DashboardSettingsPreviewZoom.test.tsx +679 -0
  85. package/Tests/App/Dashboard/DashboardSloAndDataSourceChartZoom.test.tsx +881 -0
  86. package/Tests/App/Dashboard/DashboardTraceStatusWidgets.test.tsx +878 -0
  87. package/Tests/App/Dashboard/DatabaseMetricChartModalTimeRangeZoom.test.tsx +442 -0
  88. package/Tests/App/Dashboard/DatabaseOverviewTimeRangeZoom.test.tsx +831 -0
  89. package/Tests/App/Dashboard/DatabaseServerComponents.test.tsx +43 -0
  90. package/Tests/App/Dashboard/DockerSwarmInsightsTimeRangeZoom.test.tsx +524 -0
  91. package/Tests/App/Dashboard/DockerSwarmRateChartRefresh.test.tsx +259 -0
  92. package/Tests/App/Dashboard/EdgeDetailPanelHistory.test.tsx +763 -0
  93. package/Tests/App/Dashboard/EdgeDetailPanelTimeRangeZoom.test.tsx +547 -0
  94. package/Tests/App/Dashboard/EdgeHistoryBucketsCases.tsx +565 -0
  95. package/Tests/App/Dashboard/EdgeHistoryBucketsKathmandu.test.tsx +73 -0
  96. package/Tests/App/Dashboard/EdgeHistoryBucketsKolkata.test.tsx +74 -0
  97. package/Tests/App/Dashboard/EdgeHistoryBucketsNewYork.test.tsx +72 -0
  98. package/Tests/App/Dashboard/EdgeHistoryBucketsUtc.test.tsx +72 -0
  99. package/Tests/App/Dashboard/EmbeddedMetricCardRefresh.test.tsx +310 -0
  100. package/Tests/App/Dashboard/EmbeddedMetricCardTimeRangeZoom.test.tsx +536 -0
  101. package/Tests/App/Dashboard/EscalationRuleReadiness.test.tsx +3 -1
  102. package/Tests/App/Dashboard/EscalationRuleRowActions.test.tsx +660 -0
  103. package/Tests/App/Dashboard/EventNotes.test.tsx +2 -2
  104. package/Tests/App/Dashboard/EventOverviewPages.test.tsx +587 -13
  105. package/Tests/App/Dashboard/EventOverviewSnapshotExplorerZoom.test.tsx +1139 -0
  106. package/Tests/App/Dashboard/EventOverviewSnapshotZoomAcrossTabs.test.tsx +1057 -0
  107. package/Tests/App/Dashboard/EventOverviewTelemetrySnapshotZoom.test.tsx +757 -0
  108. package/Tests/App/Dashboard/ExceptionOccurrenceTrendZoom.test.tsx +675 -0
  109. package/Tests/App/Dashboard/ExceptionOccurrencesZoomSurvivesViewSwitch.test.tsx +405 -0
  110. package/Tests/App/Dashboard/ExceptionSignalPages.test.tsx +67 -3
  111. package/Tests/App/Dashboard/ExceptionTablesSpanStatus.test.tsx +515 -0
  112. package/Tests/App/Dashboard/ExplorerOwnZoomRegression.test.tsx +739 -0
  113. package/Tests/App/Dashboard/FlowBandwidthAxisCases.tsx +461 -0
  114. package/Tests/App/Dashboard/FlowBandwidthAxisKathmandu.test.tsx +25 -0
  115. package/Tests/App/Dashboard/FlowBandwidthAxisKolkata.test.tsx +25 -0
  116. package/Tests/App/Dashboard/FlowBandwidthAxisNewYork.test.tsx +25 -0
  117. package/Tests/App/Dashboard/FlowBandwidthAxisUtc.test.tsx +24 -0
  118. package/Tests/App/Dashboard/FlowTopTalkersZoomRefetch.test.tsx +722 -0
  119. package/Tests/App/Dashboard/FlowViewportGuard.test.tsx +2526 -0
  120. package/Tests/App/Dashboard/HostPagesSlowLoads.test.tsx +872 -0
  121. package/Tests/App/Dashboard/HostPagesTimeRangeZoom.test.tsx +1208 -0
  122. package/Tests/App/Dashboard/IncidentRootCauseTimeRangeZoom.test.tsx +358 -0
  123. package/Tests/App/Dashboard/InfrastructureGraph.test.tsx +100 -9
  124. package/Tests/App/Dashboard/InfrastructureMetricsTabTimeRangeZoom.test.tsx +485 -0
  125. package/Tests/App/Dashboard/InvestigationDrawerCompanionZoom.test.tsx +655 -0
  126. package/Tests/App/Dashboard/InvestigationDrawerZoom.test.tsx +830 -0
  127. package/Tests/App/Dashboard/InvestigationNotStarted.test.tsx +338 -2
  128. package/Tests/App/Dashboard/InvoicesPayInvoice.test.tsx +454 -16
  129. package/Tests/App/Dashboard/KubernetesClusterAiAccessSettings.test.ts +799 -819
  130. package/Tests/App/Dashboard/KubernetesClusterAiAgentOverviewCard.test.tsx +367 -0
  131. package/Tests/App/Dashboard/KubernetesClusterAiAgentStatus.test.ts +1202 -0
  132. package/Tests/App/Dashboard/KubernetesClusterAiDocumentationMarkdown.test.ts +106 -0
  133. package/Tests/App/Dashboard/KubernetesClusterAiNavigation.test.tsx +354 -0
  134. package/Tests/App/Dashboard/KubernetesClusterAiPage.test.tsx +1884 -2054
  135. package/Tests/App/Dashboard/KubernetesClusterAiPageServerParity.test.ts +478 -179
  136. package/Tests/App/Dashboard/KubernetesClusterMetricTooltips.test.ts +50 -0
  137. package/Tests/App/Dashboard/KubernetesClusterOverviewTooltips.test.tsx +2 -1
  138. package/Tests/App/Dashboard/KubernetesClusterOverviewZoom.test.tsx +1217 -0
  139. package/Tests/App/Dashboard/KubernetesClusterPagesZoom.test.tsx +731 -0
  140. package/Tests/App/Dashboard/KubernetesCostsLoadRecovery.test.tsx +869 -0
  141. package/Tests/App/Dashboard/KubernetesCostsZoom.test.tsx +1214 -0
  142. package/Tests/App/Dashboard/KubernetesCostsZoomExactHours.test.tsx +692 -0
  143. package/Tests/App/Dashboard/KubernetesNetworkThroughputReload.test.tsx +902 -0
  144. package/Tests/App/Dashboard/KubernetesNetworkZoomBucketEdges.test.tsx +571 -0
  145. package/Tests/App/Dashboard/KubernetesOverviewZoomBucketEdges.test.tsx +697 -0
  146. package/Tests/App/Dashboard/KubernetesResourceMetricsTabZoom.test.tsx +633 -0
  147. package/Tests/App/Dashboard/LogsExplorerTimeRangeZoom.test.tsx +470 -0
  148. package/Tests/App/Dashboard/LogsInsightsTimeRangeZoom.test.tsx +948 -0
  149. package/Tests/App/Dashboard/LogsViewerPinnedWindowZoom.test.tsx +486 -0
  150. package/Tests/App/Dashboard/MetricChartsBucketInspectorDoubleClick.test.tsx +1001 -0
  151. package/Tests/App/Dashboard/MetricExplorerInvestigationAutoRefresh.test.tsx +514 -0
  152. package/Tests/App/Dashboard/MetricExplorerSavedViewZoomRoundTrip.test.tsx +581 -0
  153. package/Tests/App/Dashboard/MetricExplorerTimeRangeZoom.test.tsx +1162 -0
  154. package/Tests/App/Dashboard/MetricMonitorPreviewZoomLabel.test.ts +72 -0
  155. package/Tests/App/Dashboard/MetricRowSparklineTimeRangeZoom.test.tsx +204 -0
  156. package/Tests/App/Dashboard/MetricViewFirstResultLands.test.tsx +408 -0
  157. package/Tests/App/Dashboard/MetricViewOwnZoomResetPlacement.test.tsx +952 -0
  158. package/Tests/App/Dashboard/MetricViewTimeRange.test.ts +139 -0
  159. package/Tests/App/Dashboard/MetricViewTimeRangeZoom.test.tsx +556 -0
  160. package/Tests/App/Dashboard/MonitorMetricsChartWrappersZoom.test.tsx +552 -0
  161. package/Tests/App/Dashboard/MonitorMetricsTabsTimeRangeZoom.test.tsx +740 -0
  162. package/Tests/App/Dashboard/MonitorOverviewChartsTimeRangeZoom.test.tsx +735 -0
  163. package/Tests/App/Dashboard/MonitorStepPreviewsTimeRangeZoom.test.tsx +835 -0
  164. package/Tests/App/Dashboard/NetworkDeviceTimeRangeZoom.test.tsx +1115 -0
  165. package/Tests/App/Dashboard/OnCallPreventionGuards.test.tsx +186 -17
  166. package/Tests/App/Dashboard/OnCallRulesDeleteGuard.test.tsx +155 -46
  167. package/Tests/App/Dashboard/PasskeySettings.test.tsx +87 -2
  168. package/Tests/App/Dashboard/ProjectAISettingsPages.test.tsx +884 -0
  169. package/Tests/App/Dashboard/ProxmoxNodeRemove.test.tsx +621 -0
  170. package/Tests/App/Dashboard/ProxmoxOverviewSlowLoads.test.tsx +584 -0
  171. package/Tests/App/Dashboard/ProxmoxPagesTimeRangeZoom.test.tsx +823 -0
  172. package/Tests/App/Dashboard/ProxmoxRateChartReload.test.tsx +1253 -0
  173. package/Tests/App/Dashboard/PublicDashboardBoardWideZoom.test.tsx +605 -0
  174. package/Tests/App/Dashboard/RealRowsLineChart.tsx +250 -0
  175. package/Tests/App/Dashboard/RechartsHostsPlotCursor.test.tsx +513 -0
  176. package/Tests/App/Dashboard/RowActionPlacementOverrides.test.tsx +865 -0
  177. package/Tests/App/Dashboard/RumOverviewTimeRangeZoom.test.tsx +877 -0
  178. package/Tests/App/Dashboard/RunnerKubernetesAgentForm.test.tsx +20 -4
  179. package/Tests/App/Dashboard/RunnerSupersededByAiAgentNote.test.tsx +296 -0
  180. package/Tests/App/Dashboard/SecurityEventConnectionsTable.test.tsx +146 -36
  181. package/Tests/App/Dashboard/ServiceDatabaseSlowLoads.test.tsx +1166 -0
  182. package/Tests/App/Dashboard/ServiceMapGraph.test.tsx +1243 -104
  183. package/Tests/App/Dashboard/ServiceOverviewTimeRangeZoom.test.tsx +792 -0
  184. package/Tests/App/Dashboard/SloBudgetBurnDownZoom.test.tsx +771 -0
  185. package/Tests/App/Dashboard/SloBudgetBurnDownZoomAffordances.test.tsx +380 -0
  186. package/Tests/App/Dashboard/SloEventMetricsBarChartZoom.test.tsx +369 -0
  187. package/Tests/App/Dashboard/SloHistoryChartsTimeRangeZoom.test.tsx +694 -0
  188. package/Tests/App/Dashboard/SloHistoryChartsZoomAffordances.test.tsx +497 -0
  189. package/Tests/App/Dashboard/SloMetricsTimeRangeZoom.test.tsx +541 -0
  190. package/Tests/App/Dashboard/SlowLoadHarness.ts +123 -0
  191. package/Tests/App/Dashboard/SnapshotExplorerPrimaryZoom.test.tsx +1194 -0
  192. package/Tests/App/Dashboard/SnapshotViewerPinnedWindow.test.tsx +620 -0
  193. package/Tests/App/Dashboard/TelemetrySnapshotPanelTimeRangeZoom.test.tsx +765 -0
  194. package/Tests/App/Dashboard/TelemetrySnapshotZoom.test.tsx +516 -0
  195. package/Tests/App/Dashboard/TelemetrySnapshotZoomAcrossTabs.test.tsx +827 -0
  196. package/Tests/App/Dashboard/TimeRangeZoomPageHarness.tsx +463 -0
  197. package/Tests/App/Dashboard/TraceChartEditorStatusSplit.test.tsx +543 -0
  198. package/Tests/App/Dashboard/TraceStatusPresentation.test.tsx +967 -0
  199. package/Tests/App/Dashboard/TraceTimelineMinimapZoom.test.tsx +315 -0
  200. package/Tests/App/Dashboard/TracesAnalyticsStatusSplit.test.tsx +778 -0
  201. package/Tests/App/Dashboard/TracesAnalyticsViewZoom.test.tsx +349 -0
  202. package/Tests/App/Dashboard/TracesExplorerTimeRangeZoom.test.tsx +551 -0
  203. package/Tests/App/Dashboard/TracesStatusChartAndFacet.test.tsx +687 -0
  204. package/Tests/App/Dashboard/TracesViewerStaleResponses.test.tsx +458 -0
  205. package/Tests/App/Dashboard/UptimeStripsExcludedFromZoom.test.tsx +406 -0
  206. package/Tests/App/Dashboard/VMwareOverviewSlowLoads.test.tsx +535 -0
  207. package/Tests/App/Dashboard/VMwarePagesTimeRangeZoom.test.tsx +606 -0
  208. package/Tests/App/Dashboard/ValueWidgetSparklineStaleHover.test.tsx +1292 -0
  209. package/Tests/App/Dashboard/ValueWidgetSparklineZoom.test.tsx +765 -0
  210. package/Tests/App/StatusPage/StatusPageResourceExplorer.test.tsx +98 -0
  211. package/Tests/Models/DatabaseModels/KubernetesAiAgentModel.test.ts +295 -0
  212. package/Tests/Models/DatabaseModels/TeamComplianceSettingModel.test.ts +347 -0
  213. package/Tests/Server/API/AIChatRouteAuthorization.test.ts +58 -0
  214. package/Tests/Server/API/AIGenerationProjectAIToggle.test.ts +1 -1
  215. package/Tests/Server/API/AIInvestigationAPI.test.ts +123 -45
  216. package/Tests/Server/API/AutoRemediationApproveClusterRound.test.ts +1329 -0
  217. package/Tests/Server/API/AutoRemediationApproveKubectlRecheck.test.ts +25 -2
  218. package/Tests/Server/API/KubernetesClusterAiAccessAPI.test.ts +2 -0
  219. package/Tests/Server/API/KubernetesClusterAiAccessAPIAgent.test.ts +903 -0
  220. package/Tests/Server/API/MicrosoftTeamsChatsRefreshRoute.test.ts +667 -0
  221. package/Tests/Server/API/MicrosoftTeamsManifest.test.ts +294 -6
  222. package/Tests/Server/API/ProxmoxResourceAPIRemoveNode.test.ts +1932 -0
  223. package/Tests/Server/Infrastructure/GlobalCache.test.ts +195 -0
  224. package/Tests/Server/Infrastructure/Postgres/AddKubernetesAiAgentAndAiDefaultsMigration.test.ts +623 -0
  225. package/Tests/Server/Infrastructure/Postgres/AddKubernetesClusterAiAccessMigration.test.ts +87 -10
  226. package/Tests/Server/Infrastructure/Postgres/AddTeamComplianceRuleScopeMigration.test.ts +622 -0
  227. package/Tests/Server/Middleware/TelemetryIngestBrowserKey.test.ts +61 -4
  228. package/Tests/Server/Middleware/TelemetryIngestKubernetesAgentRunnerPinnedKey.test.ts +98 -2
  229. package/Tests/Server/Middleware/TelemetryIngestKubernetesAgentRunnerRateLimit.test.ts +105 -2
  230. package/Tests/Server/Services/AIServiceBalanceBlocker.test.ts +282 -0
  231. package/Tests/Server/Services/AlertMonitorClearWritesNull.test.ts +409 -0
  232. package/Tests/Server/Services/AlertMonitorEditFeed.test.ts +474 -0
  233. package/Tests/Server/Services/AlertMonitorEditGuard.test.ts +610 -0
  234. package/Tests/Server/Services/AutoRemediationClusterRuleEngine.test.ts +2 -0
  235. package/Tests/Server/Services/AutoRemediationRuleCommandRunners.test.ts +2 -1
  236. package/Tests/Server/Services/IncidentAffectedMonitorsEdit.test.ts +1360 -0
  237. package/Tests/Server/Services/IncidentAlertSloLinkSurvivesEdit.test.ts +3 -1
  238. package/Tests/Server/Services/IncidentSeverityDeletePausesComplianceRules.test.ts +488 -0
  239. package/Tests/Server/Services/KubernetesAiAgentJobService.test.ts +329 -0
  240. package/Tests/Server/Services/KubernetesAiAgentServiceHelpers.test.ts +618 -0
  241. package/Tests/Server/Services/KubernetesAiAgentServiceLifecycle.test.ts +1444 -0
  242. package/Tests/Server/Services/KubernetesAiAgentServiceRegister.test.ts +1666 -0
  243. package/Tests/Server/Services/KubernetesClusterAiAccessDeletedRunnerRemedy.test.ts +140 -111
  244. package/Tests/Server/Services/KubernetesClusterAiAccessGapNextSteps.test.ts +267 -105
  245. package/Tests/Server/Services/KubernetesClusterAiAccessLegacySuperseded.test.ts +440 -0
  246. package/Tests/Server/Services/KubernetesClusterAiAccessService.test.ts +567 -411
  247. package/Tests/Server/Services/KubernetesClusterAiAccessTarget.test.ts +1168 -0
  248. package/Tests/Server/Services/KubernetesClusterAiSettingsPermission.test.ts +410 -12
  249. package/Tests/Server/Services/KubernetesClusterServiceAiAccessFeed.test.ts +55 -0
  250. package/Tests/Server/Services/ProjectServiceNewProjectAiDefaults.test.ts +288 -0
  251. package/Tests/Server/Services/ProxmoxResourcePostgres.test.ts +5633 -0
  252. package/Tests/Server/Services/ProxmoxResourceService.test.ts +6458 -5
  253. package/Tests/Server/Services/RunnerJobEnqueueKubectl.test.ts +48 -15
  254. package/Tests/Server/Services/RunnerJobEnqueueKubectlAiAgent.test.ts +620 -0
  255. package/Tests/Server/Services/RunnerJobKubectlWriteScope.test.ts +170 -3
  256. package/Tests/Server/Services/RunnerJobTimeoutReason.test.ts +72 -0
  257. package/Tests/Server/Services/RunnerServiceAgentName.test.ts +6 -4
  258. package/Tests/Server/Services/ScheduledMaintenanceAttachmentEdit.test.ts +2113 -0
  259. package/Tests/Server/Services/ScheduledMaintenanceMonitorRelease.test.ts +972 -0
  260. package/Tests/Server/Services/TeamComplianceSettingPostgres.test.ts +2237 -0
  261. package/Tests/Server/Services/TeamComplianceSettingService.test.ts +3988 -138
  262. package/Tests/Server/Utils/AI/ClusterAccessContext.test.ts +107 -1
  263. package/Tests/Server/Utils/AI/IncidentPostmortemRunner.test.ts +351 -0
  264. package/Tests/Server/Utils/AI/InvestigationClusterAccessWiring.test.ts +2 -0
  265. package/Tests/Server/Utils/AI/InvestigationEligibility.test.ts +310 -0
  266. package/Tests/Server/Utils/AI/KubectlInvestigationToolkit.test.ts +70 -0
  267. package/Tests/Server/Utils/AI/KubectlJobRunnerFinishedJob.test.ts +58 -0
  268. package/Tests/Server/Utils/AI/RemediationCommandToolsKubectl.test.ts +2 -0
  269. package/Tests/Server/Utils/AI/RemediationCommandToolsKubectlOutcome.test.ts +2 -0
  270. package/Tests/Server/Utils/AI/RemediationCommandToolsLiveCluster.test.ts +2 -0
  271. package/Tests/Server/Utils/AI/RemediationCommandToolsRunnerScope.test.ts +125 -1
  272. package/Tests/Server/Utils/AI/RemediationExecutionRunner.test.ts +252 -3
  273. package/Tests/Server/Utils/AI/RemediationExecutionRunnerClusterMode.test.ts +2 -0
  274. package/Tests/Server/Utils/AI/RemediationExecutionRunnerProjectGates.test.ts +240 -0
  275. package/Tests/Server/Utils/AI/RemediationKubectlCopyParity.test.ts +2 -0
  276. package/Tests/Server/Utils/AutoRemediation/CommandPlanExecutor.test.ts +2 -0
  277. package/Tests/Server/Utils/AutoRemediation/CommandPlanExecutorUnknownRun.test.ts +2 -0
  278. package/Tests/Server/Utils/AutoRemediation/CommandPlanVerification.test.ts +2 -0
  279. package/Tests/Server/Utils/Telemetry/HostAssetAttributesFromOtlp.test.ts +68 -0
  280. package/Tests/Server/Utils/Telemetry/InventoryMirrorPostgres.test.ts +370 -0
  281. package/Tests/Server/Utils/Telemetry/NetworkDeviceInventoryAttributes.test.ts +522 -0
  282. package/Tests/Server/Utils/Telemetry/ProxmoxCephSnapshotScan.test.ts +155 -0
  283. package/Tests/Server/Utils/Telemetry/ProxmoxNativeNodeLiveness.test.ts +8631 -0
  284. package/Tests/Server/Utils/Telemetry/ProxmoxNativePush.test.ts +2852 -0
  285. package/Tests/Server/Utils/Telemetry/TelemetryEntity.test.ts +367 -1
  286. package/Tests/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.test.ts +45 -3
  287. package/Tests/Server/Utils/Workspace/MicrosoftTeamsChats.test.ts +25 -0
  288. package/Tests/Server/Utils/Workspace/MicrosoftTeamsGroupChatNames.test.ts +3119 -0
  289. package/Tests/Server/Utils/Workspace/MicrosoftTeamsGroupChatNamesPostgres.test.ts +1721 -0
  290. package/Tests/Types/Kubernetes/KubernetesAgentChartAiAccess.test.ts +581 -113
  291. package/Tests/Types/Kubernetes/KubernetesAiAgentAccessContract.test.ts +510 -0
  292. package/Tests/Types/Team/ComplianceRule.test.ts +1029 -0
  293. package/Tests/Types/Team/TeamComplianceStatus.test.ts +176 -0
  294. package/Tests/UI/Components/ActionButton/RowActions.test.tsx +641 -0
  295. package/Tests/UI/Components/ActionButton/RowActionsAccessibility.test.tsx +414 -0
  296. package/Tests/UI/Components/ActionButton/SplitActionButtons.test.ts +565 -0
  297. package/Tests/UI/Components/Charts/BarChartDragToSelect.test.tsx +386 -0
  298. package/Tests/UI/Components/Charts/ChartDoubleClickResetWithoutDblclick.test.tsx +1025 -0
  299. package/Tests/UI/Components/Charts/ChartGroupPageZoomHint.test.tsx +196 -0
  300. package/Tests/UI/Components/Charts/ChartPlaceholdersTakeDoubleClick.test.tsx +1861 -0
  301. package/Tests/UI/Components/Charts/ChartPlotClicksWhileResetArmed.test.tsx +382 -0
  302. package/Tests/UI/Components/Charts/ChartRangeSelection.test.tsx +704 -0
  303. package/Tests/UI/Components/Charts/ChartRangeSelectionDoubleClickReset.test.tsx +1481 -0
  304. package/Tests/UI/Components/Charts/ChartRangeSelectionRealRecharts.test.tsx +918 -0
  305. package/Tests/UI/Components/Charts/ChartRowBucketStart.test.ts +350 -0
  306. package/Tests/UI/Components/Charts/DoubleClickReset.test.tsx +996 -0
  307. package/Tests/UI/Components/Charts/HistogramDoubleClickResetRealRecharts.test.tsx +965 -0
  308. package/Tests/UI/Components/Charts/HistogramDriftThenRefetch.test.tsx +277 -0
  309. package/Tests/UI/Components/Charts/HistogramRangeSelectionDataChange.test.tsx +1757 -0
  310. package/Tests/UI/Components/Charts/HistogramRangeSelectionRealRecharts.test.tsx +560 -0
  311. package/Tests/UI/Components/Charts/TimeRangeZoom/ChartPageTimeRangeZoom.test.tsx +513 -0
  312. package/Tests/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomContext.test.tsx +845 -0
  313. package/Tests/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomHint.test.tsx +119 -0
  314. package/Tests/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomHintTailwind.test.tsx +274 -0
  315. package/Tests/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomUtil.test.ts +433 -0
  316. package/Tests/UI/Components/Charts/TimeRangeZoom/UseTimeRangeZoom.test.tsx +863 -0
  317. package/Tests/UI/Components/Charts/TimeRangeZoom/ZoomDocsPromises.test.tsx +1147 -0
  318. package/Tests/UI/Components/DisabledButtonTooltip.test.tsx +14 -3
  319. package/Tests/UI/Components/EntityDropdownEscape.test.tsx +454 -0
  320. package/Tests/UI/Components/EntityDropdownFocusLeave.test.tsx +420 -0
  321. package/Tests/UI/Components/Forms/FormFieldDropdownDisabled.test.tsx +233 -0
  322. package/Tests/UI/Components/Input.test.tsx +80 -1
  323. package/Tests/UI/Components/LogsAnalyticsViewZoom.test.tsx +947 -0
  324. package/Tests/UI/Components/LogsHistogramDragTooltip.test.tsx +17 -5
  325. package/Tests/UI/Components/LogsViewerAnalyticsZoom.test.tsx +501 -0
  326. package/Tests/UI/Components/LogsViewerHistogramZoom.test.tsx +1 -1
  327. package/Tests/UI/Components/ModelTable/BaseModelTableBulkDelete.test.tsx +6 -4
  328. package/Tests/UI/Components/ModelTable/BaseModelTablePermissionGating.test.tsx +60 -8
  329. package/Tests/UI/Components/ModelTable/BaseModelTableRowActions.test.tsx +476 -0
  330. package/Tests/UI/Components/ModelTable/ModelTableWrapContent.test.tsx +7 -5
  331. package/Tests/UI/Components/MoreMenuPortal.test.tsx +623 -0
  332. package/Tests/UI/Components/StatusPage/ResourceGridActions.test.tsx +538 -0
  333. package/Tests/UI/Components/StatusPage/ResourceGridSelection.test.tsx +14 -4
  334. package/Tests/UI/Components/TableCellWrapping.test.tsx +3 -3
  335. package/Tests/UI/Components/TableRowActions.test.tsx +472 -0
  336. package/Tests/UI/Components/TelemetryHistogramDragTooltip.test.tsx +1 -1
  337. package/Tests/UI/Components/TelemetryViewer/TelemetryViewerHistogramClickZoom.test.tsx +1 -1
  338. package/Tests/UI/Components/TelemetryViewer/TelemetryViewerZoomScope.test.tsx +470 -0
  339. package/Tests/UI/Components/TelemetryViewer/UseViewerTimeRangeZoom.test.tsx +571 -0
  340. package/Tests/UI/Components/TelemetryViewer/ViewerDoubleClickResetUnderDataChange.test.tsx +928 -0
  341. package/Tests/UI/Components/TelemetryViewer/ViewerFollowsEnclosingZoom.test.tsx +1569 -0
  342. package/Tests/UI/Components/Toggle.test.tsx +66 -0
  343. package/Tests/UI/MicrosoftTeams/MicrosoftTeamsChatsCardRefreshNames.test.tsx +1023 -0
  344. package/Tests/UI/Rum/ChunkLoader.test.ts +201 -0
  345. package/Tests/UI/Rum/FidelityNotices.test.ts +54 -0
  346. package/Tests/UI/Rum/ReplayCorrelationPanel.test.tsx +72 -0
  347. package/Tests/UI/Rum/ReplayFrameCapture.test.ts +1009 -9
  348. package/Tests/UI/Rum/ReplayRecordedAssets.test.ts +1069 -0
  349. package/Tests/UI/Rum/ReplayStage.test.tsx +913 -2
  350. package/Tests/UI/Rum/SessionReplayTable.test.tsx +443 -8
  351. package/Tests/UI/Rum/SessionReplayUsersTable.test.tsx +439 -9
  352. package/Tests/UI/Rum/UserFlowTablesRowActions.test.tsx +501 -0
  353. package/Tests/Utils/AiRemediation/KubectlPolicyChartRbacParity.test.ts +47 -19
  354. package/Tests/Utils/AiRemediation/KubectlWriteScopeCallerParity.test.ts +2 -0
  355. package/Tests/Utils/AiRemediation/KubernetesAiAgentPolicyCopyParity.test.ts +396 -0
  356. package/Tests/Utils/Dashboard/DashboardTimeRangeZoom.test.ts +104 -1
  357. package/Types/AI/AIRunType.ts +9 -4
  358. package/Types/AI/InvestigationNotStartedReason.ts +6 -0
  359. package/Types/AutoRemediation/AiRemediationCommandPlan.ts +14 -16
  360. package/Types/AutoRemediation/AiRemediationCommandPolicyVerdict.ts +28 -0
  361. package/Types/Dashboard/DashboardComponents/DashboardTraceChartComponent.ts +4 -2
  362. package/Types/Kubernetes/KubernetesClusterAiAccess.ts +263 -32
  363. package/Types/Kubernetes/KubernetesClusterAiAccessPermissions.ts +20 -16
  364. package/Types/Kubernetes/KubernetesClusterAiInsights.ts +81 -0
  365. package/Types/Monitor/ProxmoxAlertTemplates.ts +4 -4
  366. package/Types/Team/ComplianceNotificationChannel.ts +22 -0
  367. package/Types/Team/ComplianceRule.ts +434 -0
  368. package/Types/Team/ComplianceRuleType.ts +21 -0
  369. package/Types/Team/TeamComplianceStatus.ts +81 -0
  370. package/Types/Telemetry/TelemetryIngestSurface.ts +28 -0
  371. package/UI/Components/ActionButton/ActionButtonSchema.ts +21 -0
  372. package/UI/Components/ActionButton/RowActions.tsx +238 -0
  373. package/UI/Components/ActionButton/SplitActionButtons.ts +173 -0
  374. package/UI/Components/Charts/Area/AreaChart.tsx +32 -2
  375. package/UI/Components/Charts/Bar/BarChart.tsx +40 -3
  376. package/UI/Components/Charts/ChartGroup/ChartGroup.tsx +37 -11
  377. package/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.tsx +80 -243
  378. package/UI/Components/Charts/ChartLibrary/BarChart/BarChart.tsx +122 -31
  379. package/UI/Components/Charts/ChartLibrary/LineChart/LineChart.tsx +95 -244
  380. package/UI/Components/Charts/ChartLibrary/Utils/DoubleClick.ts +214 -0
  381. package/UI/Components/Charts/ChartLibrary/Utils/UseChartBucketsChange.ts +32 -0
  382. package/UI/Components/Charts/ChartLibrary/Utils/UseChartRangeSelection.ts +599 -0
  383. package/UI/Components/Charts/Line/LineChart.tsx +32 -2
  384. package/UI/Components/Charts/TimeRangeZoom/ResetTimeRangeZoomButton.tsx +70 -0
  385. package/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomContext.tsx +226 -0
  386. package/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomHint.tsx +73 -0
  387. package/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomUtil.ts +163 -0
  388. package/UI/Components/Charts/TimeRangeZoom/UseTimeRangeZoom.ts +215 -0
  389. package/UI/Components/Charts/Utils/DataPoint.ts +20 -8
  390. package/UI/Components/Charts/Utils/XAxis.ts +75 -0
  391. package/UI/Components/Charts/Utils/useHistogramRangeSelection.ts +493 -59
  392. package/UI/Components/EntityDropdown/EntityDropdown.tsx +107 -11
  393. package/UI/Components/Forms/Fields/FormField.tsx +10 -0
  394. package/UI/Components/Input/Input.tsx +90 -57
  395. package/UI/Components/List/ListRow.tsx +8 -74
  396. package/UI/Components/LogsViewer/LogsViewer.tsx +40 -11
  397. package/UI/Components/LogsViewer/components/LogTimeRangePicker.tsx +22 -6
  398. package/UI/Components/LogsViewer/components/LogsAnalyticsView.tsx +209 -6
  399. package/UI/Components/LogsViewer/components/LogsHistogram.tsx +127 -84
  400. package/UI/Components/LogsViewer/components/LogsViewerToolbar.tsx +3 -0
  401. package/UI/Components/ModelTable/BaseModelTable.tsx +12 -1
  402. package/UI/Components/MoreMenu/MoreMenu.tsx +365 -30
  403. package/UI/Components/MoreMenu/MoreMenuItem.tsx +70 -17
  404. package/UI/Components/OrderedStatesList/Item.tsx +7 -72
  405. package/UI/Components/StatusPage/ResourceGrid.tsx +126 -77
  406. package/UI/Components/Table/TableBody.tsx +8 -2
  407. package/UI/Components/Table/TableRow.tsx +20 -140
  408. package/UI/Components/TelemetryViewer/TelemetryViewer.tsx +41 -10
  409. package/UI/Components/TelemetryViewer/components/TelemetryHistogram.tsx +47 -9
  410. package/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.tsx +25 -6
  411. package/UI/Components/TelemetryViewer/types.ts +2 -0
  412. package/UI/Components/TelemetryViewer/useViewerTimeRangeZoom.ts +448 -0
  413. package/UI/Components/Toggle/Toggle.tsx +26 -0
  414. package/UI/Components/Tooltip/Tooltip.tsx +8 -1
  415. package/UI/Styles/Theme.css +14 -2
  416. package/Utils/AiRemediation/CommandPolicy.ts +1 -1
  417. package/Utils/AiRemediation/KubectlPolicy.ts +1 -1
  418. package/Utils/Dashboard/DashboardTimeRangeZoom.ts +46 -2
  419. package/build/dist/Models/DatabaseModels/Index.js +2 -0
  420. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  421. package/build/dist/Models/DatabaseModels/KubernetesAiAgent.js +385 -0
  422. package/build/dist/Models/DatabaseModels/KubernetesAiAgent.js.map +1 -0
  423. package/build/dist/Models/DatabaseModels/KubernetesCluster.js +3 -3
  424. package/build/dist/Models/DatabaseModels/KubernetesCluster.js.map +1 -1
  425. package/build/dist/Models/DatabaseModels/Project.js +56 -5
  426. package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
  427. package/build/dist/Models/DatabaseModels/ProxmoxResource.js +51 -1
  428. package/build/dist/Models/DatabaseModels/ProxmoxResource.js.map +1 -1
  429. package/build/dist/Models/DatabaseModels/RunnerJob.js +74 -0
  430. package/build/dist/Models/DatabaseModels/RunnerJob.js.map +1 -1
  431. package/build/dist/Models/DatabaseModels/TeamComplianceSetting.js +134 -3
  432. package/build/dist/Models/DatabaseModels/TeamComplianceSetting.js.map +1 -1
  433. package/build/dist/Models/DatabaseModels/WorkspaceProjectAuthToken.js.map +1 -1
  434. package/build/dist/Server/API/AIChatAPI.js +6 -1
  435. package/build/dist/Server/API/AIChatAPI.js.map +1 -1
  436. package/build/dist/Server/API/AIInvestigationAPI.js +17 -10
  437. package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
  438. package/build/dist/Server/API/AutoRemediationAPI.js +144 -24
  439. package/build/dist/Server/API/AutoRemediationAPI.js.map +1 -1
  440. package/build/dist/Server/API/KubernetesClusterAiAccessAPI.js +436 -22
  441. package/build/dist/Server/API/KubernetesClusterAiAccessAPI.js.map +1 -1
  442. package/build/dist/Server/API/MicrosoftTeamsAPI.js +69 -13
  443. package/build/dist/Server/API/MicrosoftTeamsAPI.js.map +1 -1
  444. package/build/dist/Server/API/ProxmoxResourceAPI.js +187 -14
  445. package/build/dist/Server/API/ProxmoxResourceAPI.js.map +1 -1
  446. package/build/dist/Server/Infrastructure/GlobalCache.js +27 -0
  447. package/build/dist/Server/Infrastructure/GlobalCache.js.map +1 -1
  448. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796000000000-AddTeamComplianceRuleScope.js +50 -0
  449. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796000000000-AddTeamComplianceRuleScope.js.map +1 -0
  450. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796100000000-AddKubernetesAiAgentAndAiDefaults.js +84 -0
  451. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796100000000-AddKubernetesAiAgentAndAiDefaults.js.map +1 -0
  452. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796200000000-AddProxmoxResourceNativePushColumns.js +31 -0
  453. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796200000000-AddProxmoxResourceNativePushColumns.js.map +1 -0
  454. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +6 -0
  455. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  456. package/build/dist/Server/Middleware/TelemetryIngest.js +34 -19
  457. package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
  458. package/build/dist/Server/Services/AIService.js +59 -1
  459. package/build/dist/Server/Services/AIService.js.map +1 -1
  460. package/build/dist/Server/Services/AlertService.js +248 -13
  461. package/build/dist/Server/Services/AlertService.js.map +1 -1
  462. package/build/dist/Server/Services/AlertSeverityService.js +51 -15
  463. package/build/dist/Server/Services/AlertSeverityService.js.map +1 -1
  464. package/build/dist/Server/Services/AutoRemediationRuleService.js +1 -1
  465. package/build/dist/Server/Services/AutoRemediationRuleService.js.map +1 -1
  466. package/build/dist/Server/Services/IncidentService.js +199 -72
  467. package/build/dist/Server/Services/IncidentService.js.map +1 -1
  468. package/build/dist/Server/Services/IncidentSeverityService.js +51 -15
  469. package/build/dist/Server/Services/IncidentSeverityService.js.map +1 -1
  470. package/build/dist/Server/Services/KubernetesAiAgentJobService.js +158 -0
  471. package/build/dist/Server/Services/KubernetesAiAgentJobService.js.map +1 -0
  472. package/build/dist/Server/Services/KubernetesAiAgentService.js +1145 -0
  473. package/build/dist/Server/Services/KubernetesAiAgentService.js.map +1 -0
  474. package/build/dist/Server/Services/KubernetesClusterAiAccessService.js +842 -371
  475. package/build/dist/Server/Services/KubernetesClusterAiAccessService.js.map +1 -1
  476. package/build/dist/Server/Services/KubernetesClusterService.js +86 -17
  477. package/build/dist/Server/Services/KubernetesClusterService.js.map +1 -1
  478. package/build/dist/Server/Services/ProjectService.js +22 -0
  479. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  480. package/build/dist/Server/Services/ProxmoxResourceService.js +258 -3
  481. package/build/dist/Server/Services/ProxmoxResourceService.js.map +1 -1
  482. package/build/dist/Server/Services/RunnerJobService.js +178 -92
  483. package/build/dist/Server/Services/RunnerJobService.js.map +1 -1
  484. package/build/dist/Server/Services/RunnerService.js +1 -1
  485. package/build/dist/Server/Services/RunnerService.js.map +1 -1
  486. package/build/dist/Server/Services/ScheduledMaintenanceService.js +535 -3
  487. package/build/dist/Server/Services/ScheduledMaintenanceService.js.map +1 -1
  488. package/build/dist/Server/Services/ScheduledMaintenanceStateTimelineService.js +316 -46
  489. package/build/dist/Server/Services/ScheduledMaintenanceStateTimelineService.js.map +1 -1
  490. package/build/dist/Server/Services/TeamComplianceSettingService.js +833 -7
  491. package/build/dist/Server/Services/TeamComplianceSettingService.js.map +1 -1
  492. package/build/dist/Server/Utils/AI/ClusterAccess/ClusterAccessContext.js +52 -9
  493. package/build/dist/Server/Utils/AI/ClusterAccess/ClusterAccessContext.js.map +1 -1
  494. package/build/dist/Server/Utils/AI/ClusterAccess/KubectlInvestigationToolkit.js +13 -9
  495. package/build/dist/Server/Utils/AI/ClusterAccess/KubectlInvestigationToolkit.js.map +1 -1
  496. package/build/dist/Server/Utils/AI/ClusterAccess/KubectlJobRunner.js +7 -3
  497. package/build/dist/Server/Utils/AI/ClusterAccess/KubectlJobRunner.js.map +1 -1
  498. package/build/dist/Server/Utils/AI/Remediation/RemediationCommandTools.js +29 -15
  499. package/build/dist/Server/Utils/AI/Remediation/RemediationCommandTools.js.map +1 -1
  500. package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js +56 -20
  501. package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js.map +1 -1
  502. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js +39 -5
  503. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -1
  504. package/build/dist/Server/Utils/AI/SRE/IncidentPostmortemRunner.js +30 -3
  505. package/build/dist/Server/Utils/AI/SRE/IncidentPostmortemRunner.js.map +1 -1
  506. package/build/dist/Server/Utils/AI/SRE/InvestigationEligibility.js +13 -2
  507. package/build/dist/Server/Utils/AI/SRE/InvestigationEligibility.js.map +1 -1
  508. package/build/dist/Server/Utils/AI/SRE/InvestigationGrader.js +1 -1
  509. package/build/dist/Server/Utils/AutoRemediation/CommandPlanExecutor.js +4 -2
  510. package/build/dist/Server/Utils/AutoRemediation/CommandPlanExecutor.js.map +1 -1
  511. package/build/dist/Server/Utils/Telemetry/InventoryEntityRegistry.js +111 -6
  512. package/build/dist/Server/Utils/Telemetry/InventoryEntityRegistry.js.map +1 -1
  513. package/build/dist/Server/Utils/Telemetry/ProxmoxCephSnapshotScan.js +40 -4
  514. package/build/dist/Server/Utils/Telemetry/ProxmoxCephSnapshotScan.js.map +1 -1
  515. package/build/dist/Server/Utils/Telemetry/ProxmoxNativeNodeLiveness.js +296 -0
  516. package/build/dist/Server/Utils/Telemetry/ProxmoxNativeNodeLiveness.js.map +1 -0
  517. package/build/dist/Server/Utils/Telemetry/ProxmoxNativePush.js +699 -0
  518. package/build/dist/Server/Utils/Telemetry/ProxmoxNativePush.js.map +1 -0
  519. package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js +77 -19
  520. package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js.map +1 -1
  521. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +505 -42
  522. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
  523. package/build/dist/Types/AI/AIRunType.js +9 -4
  524. package/build/dist/Types/AI/AIRunType.js.map +1 -1
  525. package/build/dist/Types/AutoRemediation/AiRemediationCommandPlan.js +10 -16
  526. package/build/dist/Types/AutoRemediation/AiRemediationCommandPlan.js.map +1 -1
  527. package/build/dist/Types/AutoRemediation/AiRemediationCommandPolicyVerdict.js +28 -0
  528. package/build/dist/Types/AutoRemediation/AiRemediationCommandPolicyVerdict.js.map +1 -0
  529. package/build/dist/Types/Kubernetes/KubernetesClusterAiAccess.js +72 -16
  530. package/build/dist/Types/Kubernetes/KubernetesClusterAiAccess.js.map +1 -1
  531. package/build/dist/Types/Kubernetes/KubernetesClusterAiAccessPermissions.js +20 -16
  532. package/build/dist/Types/Kubernetes/KubernetesClusterAiAccessPermissions.js.map +1 -1
  533. package/build/dist/Types/Kubernetes/KubernetesClusterAiInsights.js +17 -0
  534. package/build/dist/Types/Kubernetes/KubernetesClusterAiInsights.js.map +1 -0
  535. package/build/dist/Types/Monitor/ProxmoxAlertTemplates.js +4 -4
  536. package/build/dist/Types/Monitor/ProxmoxAlertTemplates.js.map +1 -1
  537. package/build/dist/Types/Team/ComplianceNotificationChannel.js +23 -0
  538. package/build/dist/Types/Team/ComplianceNotificationChannel.js.map +1 -0
  539. package/build/dist/Types/Team/ComplianceRule.js +304 -0
  540. package/build/dist/Types/Team/ComplianceRule.js.map +1 -0
  541. package/build/dist/Types/Team/ComplianceRuleType.js +21 -0
  542. package/build/dist/Types/Team/ComplianceRuleType.js.map +1 -1
  543. package/build/dist/Types/Team/TeamComplianceStatus.js +2 -0
  544. package/build/dist/Types/Team/TeamComplianceStatus.js.map +1 -0
  545. package/build/dist/Types/Telemetry/TelemetryIngestSurface.js +25 -0
  546. package/build/dist/Types/Telemetry/TelemetryIngestSurface.js.map +1 -1
  547. package/build/dist/UI/Components/ActionButton/ActionButtonSchema.js +20 -1
  548. package/build/dist/UI/Components/ActionButton/ActionButtonSchema.js.map +1 -1
  549. package/build/dist/UI/Components/ActionButton/RowActions.js +113 -0
  550. package/build/dist/UI/Components/ActionButton/RowActions.js.map +1 -0
  551. package/build/dist/UI/Components/ActionButton/SplitActionButtons.js +71 -0
  552. package/build/dist/UI/Components/ActionButton/SplitActionButtons.js.map +1 -0
  553. package/build/dist/UI/Components/Charts/Area/AreaChart.js +16 -1
  554. package/build/dist/UI/Components/Charts/Area/AreaChart.js.map +1 -1
  555. package/build/dist/UI/Components/Charts/Bar/BarChart.js +16 -1
  556. package/build/dist/UI/Components/Charts/Bar/BarChart.js.map +1 -1
  557. package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js +27 -5
  558. package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js.map +1 -1
  559. package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js +61 -194
  560. package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js.map +1 -1
  561. package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js +84 -26
  562. package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js.map +1 -1
  563. package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js +75 -196
  564. package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js.map +1 -1
  565. package/build/dist/UI/Components/Charts/ChartLibrary/Utils/DoubleClick.js +133 -0
  566. package/build/dist/UI/Components/Charts/ChartLibrary/Utils/DoubleClick.js.map +1 -1
  567. package/build/dist/UI/Components/Charts/ChartLibrary/Utils/UseChartBucketsChange.js +26 -0
  568. package/build/dist/UI/Components/Charts/ChartLibrary/Utils/UseChartBucketsChange.js.map +1 -0
  569. package/build/dist/UI/Components/Charts/ChartLibrary/Utils/UseChartRangeSelection.js +371 -0
  570. package/build/dist/UI/Components/Charts/ChartLibrary/Utils/UseChartRangeSelection.js.map +1 -0
  571. package/build/dist/UI/Components/Charts/Line/LineChart.js +16 -1
  572. package/build/dist/UI/Components/Charts/Line/LineChart.js.map +1 -1
  573. package/build/dist/UI/Components/Charts/TimeRangeZoom/ResetTimeRangeZoomButton.js +35 -0
  574. package/build/dist/UI/Components/Charts/TimeRangeZoom/ResetTimeRangeZoomButton.js.map +1 -0
  575. package/build/dist/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomContext.js +107 -0
  576. package/build/dist/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomContext.js.map +1 -0
  577. package/build/dist/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomHint.js +41 -0
  578. package/build/dist/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomHint.js.map +1 -0
  579. package/build/dist/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomUtil.js +117 -0
  580. package/build/dist/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomUtil.js.map +1 -0
  581. package/build/dist/UI/Components/Charts/TimeRangeZoom/UseTimeRangeZoom.js +121 -0
  582. package/build/dist/UI/Components/Charts/TimeRangeZoom/UseTimeRangeZoom.js.map +1 -0
  583. package/build/dist/UI/Components/Charts/Utils/DataPoint.js +15 -7
  584. package/build/dist/UI/Components/Charts/Utils/DataPoint.js.map +1 -1
  585. package/build/dist/UI/Components/Charts/Utils/XAxis.js +70 -0
  586. package/build/dist/UI/Components/Charts/Utils/XAxis.js.map +1 -1
  587. package/build/dist/UI/Components/Charts/Utils/useHistogramRangeSelection.js +305 -38
  588. package/build/dist/UI/Components/Charts/Utils/useHistogramRangeSelection.js.map +1 -1
  589. package/build/dist/UI/Components/EntityDropdown/EntityDropdown.js +89 -14
  590. package/build/dist/UI/Components/EntityDropdown/EntityDropdown.js.map +1 -1
  591. package/build/dist/UI/Components/Forms/Fields/FormField.js +11 -2
  592. package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
  593. package/build/dist/UI/Components/Input/Input.js +69 -54
  594. package/build/dist/UI/Components/Input/Input.js.map +1 -1
  595. package/build/dist/UI/Components/List/ListRow.js +4 -39
  596. package/build/dist/UI/Components/List/ListRow.js.map +1 -1
  597. package/build/dist/UI/Components/LogsViewer/LogsViewer.js +31 -8
  598. package/build/dist/UI/Components/LogsViewer/LogsViewer.js.map +1 -1
  599. package/build/dist/UI/Components/LogsViewer/components/LogTimeRangePicker.js +10 -1
  600. package/build/dist/UI/Components/LogsViewer/components/LogTimeRangePicker.js.map +1 -1
  601. package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js +139 -21
  602. package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js.map +1 -1
  603. package/build/dist/UI/Components/LogsViewer/components/LogsHistogram.js +30 -8
  604. package/build/dist/UI/Components/LogsViewer/components/LogsHistogram.js.map +1 -1
  605. package/build/dist/UI/Components/LogsViewer/components/LogsViewerToolbar.js +1 -1
  606. package/build/dist/UI/Components/LogsViewer/components/LogsViewerToolbar.js.map +1 -1
  607. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +10 -0
  608. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  609. package/build/dist/UI/Components/MoreMenu/MoreMenu.js +253 -14
  610. package/build/dist/UI/Components/MoreMenu/MoreMenu.js.map +1 -1
  611. package/build/dist/UI/Components/MoreMenu/MoreMenuItem.js +43 -13
  612. package/build/dist/UI/Components/MoreMenu/MoreMenuItem.js.map +1 -1
  613. package/build/dist/UI/Components/OrderedStatesList/Item.js +2 -38
  614. package/build/dist/UI/Components/OrderedStatesList/Item.js.map +1 -1
  615. package/build/dist/UI/Components/StatusPage/ResourceGrid.js +53 -15
  616. package/build/dist/UI/Components/StatusPage/ResourceGrid.js.map +1 -1
  617. package/build/dist/UI/Components/Table/TableBody.js +6 -2
  618. package/build/dist/UI/Components/Table/TableBody.js.map +1 -1
  619. package/build/dist/UI/Components/Table/TableRow.js +12 -75
  620. package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
  621. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js +32 -7
  622. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js.map +1 -1
  623. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js +27 -9
  624. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js.map +1 -1
  625. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.js +11 -1
  626. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.js.map +1 -1
  627. package/build/dist/UI/Components/TelemetryViewer/useViewerTimeRangeZoom.js +272 -0
  628. package/build/dist/UI/Components/TelemetryViewer/useViewerTimeRangeZoom.js.map +1 -0
  629. package/build/dist/UI/Components/Toggle/Toggle.js +14 -1
  630. package/build/dist/UI/Components/Toggle/Toggle.js.map +1 -1
  631. package/build/dist/UI/Components/Tooltip/Tooltip.js +1 -1
  632. package/build/dist/UI/Components/Tooltip/Tooltip.js.map +1 -1
  633. package/build/dist/Utils/AiRemediation/CommandPolicy.js +1 -1
  634. package/build/dist/Utils/AiRemediation/CommandPolicy.js.map +1 -1
  635. package/build/dist/Utils/AiRemediation/KubectlPolicy.js +1 -1
  636. package/build/dist/Utils/AiRemediation/KubectlPolicy.js.map +1 -1
  637. package/build/dist/Utils/Dashboard/DashboardTimeRangeZoom.js +27 -1
  638. package/build/dist/Utils/Dashboard/DashboardTimeRangeZoom.js.map +1 -1
  639. package/package.json +1 -1
@@ -75,9 +75,11 @@ import { afterEach, beforeEach, describe, expect, it } from "@jest/globals";
75
75
  * - a retried run whose earlier attempt already executed commands (the
76
76
  * durable commandPlan record proves it) settles what happened and NEVER
77
77
  * re-runs the agent loop;
78
- * - the project gates (enableAi, enableAutoRemediation, and the strict
79
- * opt-in enableAiCommandExecution === true) and the rule gates
80
- * (exists, enabled, aiComposesCommands) are re-checked at execution time;
78
+ * - the project gates (enableAi, enableAutoRemediation, and — for rule
79
+ * rounds only — the strict opt-in enableAiCommandExecution === true) and
80
+ * the rule gates (exists, enabled, aiComposesCommands) are re-checked at
81
+ * execution time; a cluster round (a cluster, no rule) needs only the
82
+ * kill switches and its cluster's own readiness;
81
83
  * - FullAuto requires the rule to say FullAuto AND a non-empty operator
82
84
  * allowlist AND breaker headroom — every other combination (including a
83
85
  * failing breaker query) fails safe to Suggest, whose tools cannot
@@ -524,6 +526,64 @@ describe("RemediationExecutionRunner.executeRemediation", () => {
524
526
  expect(executeRun).not.toHaveBeenCalled();
525
527
  expectSettledNoneApplicable("AI command execution is not enabled");
526
528
  });
529
+
530
+ it("still refuses a RULE round with the opt-in off even when its signal has a remediation-ready cluster — nothing about kubectl exempts a rule", async () => {
531
+ mockSuggestion();
532
+ mockProject({ enableAiCommandExecution: false });
533
+ const subjectStatuses: jest.SpyInstance = jest
534
+ .spyOn(KubernetesClusterAiAccessService, "getStatusesForSubject")
535
+ .mockResolvedValue([clusterStatus()]);
536
+ const clusterStatusRead: jest.SpyInstance = jest.spyOn(
537
+ KubernetesClusterAiAccessService,
538
+ "getStatusForCluster",
539
+ );
540
+ const ruleRead: jest.SpyInstance = jest.spyOn(
541
+ AutoRemediationRuleService,
542
+ "findOneById",
543
+ );
544
+ const executeRun: jest.SpyInstance = jest
545
+ .spyOn(AIInvestigationEngine, "executeRun")
546
+ .mockResolvedValue(undefined as never);
547
+
548
+ await run();
549
+
550
+ expect(executeRun).not.toHaveBeenCalled();
551
+ // Refused on the project switch, before the rule or any cluster is read.
552
+ expect(ruleRead).not.toHaveBeenCalled();
553
+ expect(subjectStatuses).not.toHaveBeenCalled();
554
+ expect(clusterStatusRead).not.toHaveBeenCalled();
555
+ expectSettledNoneApplicable("AI command execution is not enabled");
556
+ });
557
+
558
+ it("gates a row that names a rule AND a cluster as a rule round — the exemption fails closed", async () => {
559
+ mockSuggestion({ kubernetesClusterId: CLUSTER_ID });
560
+ mockProject({ enableAiCommandExecution: undefined });
561
+ const clusterStatusRead: jest.SpyInstance = jest.spyOn(
562
+ KubernetesClusterAiAccessService,
563
+ "getStatusForCluster",
564
+ );
565
+ const executeRun: jest.SpyInstance = jest
566
+ .spyOn(AIInvestigationEngine, "executeRun")
567
+ .mockResolvedValue(undefined as never);
568
+
569
+ await run();
570
+
571
+ expect(executeRun).not.toHaveBeenCalled();
572
+ expect(clusterStatusRead).not.toHaveBeenCalled();
573
+ expectSettledNoneApplicable("AI command execution is not enabled");
574
+ });
575
+
576
+ it("sends people to Project Settings → AI Features, the page every install shows", async () => {
577
+ mockSuggestion();
578
+ mockProject({ enableAiCommandExecution: false });
579
+ jest
580
+ .spyOn(AIInvestigationEngine, "executeRun")
581
+ .mockResolvedValue(undefined as never);
582
+
583
+ await run();
584
+
585
+ expectSettledNoneApplicable("(Project Settings → AI Features)");
586
+ });
527
587
  });
528
588
 
529
589
  describe("rule gates re-checked at execution time", () => {
@@ -960,6 +1020,8 @@ function clusterStatus(
960
1020
  posture: { inCluster: true, allowWrites: true },
961
1021
  },
962
1022
  accessMethod: "in_cluster",
1023
+ aiAgent: null,
1024
+ automaticInvestigation: { incidents: false, alerts: false },
963
1025
  kubectlAllowlist: [],
964
1026
  isInvestigationEnabled: true,
965
1027
  isInvestigationReady: true,
@@ -2546,6 +2608,193 @@ describe("RemediationExecutionRunner.executeRemediation — cluster rounds", ()
2546
2608
  });
2547
2609
  });
2548
2610
 
2611
+ /*
2612
+ * The project's "Enable AI command execution" opt-in gates rule rounds.
2613
+ * A cluster round's consent is the cluster's own: its Fixes mode, and the
2614
+ * chart's write RBAC on the in-cluster agent. The kill switches still
2615
+ * stop it, and a cluster reached through an advanced Runner keeps needing
2616
+ * the opt-in — through its status gap, which the round re-reads.
2617
+ */
2618
+ describe("the project's AI command execution opt-in and cluster rounds", () => {
2619
+ it("runs an Ask-for-approval round when the opt-in was never set", async () => {
2620
+ mockProject({ enableAiCommandExecution: undefined });
2621
+ mockSuggestionHonouringSelect(
2622
+ clusterRow({ executionMode: AutoRemediationExecutionMode.Suggest }),
2623
+ );
2624
+ (
2625
+ KubernetesClusterAiAccessService.getStatusForCluster as unknown as jest.SpyInstance
2626
+ ).mockResolvedValue(
2627
+ clusterStatus({
2628
+ remediationMode: KubernetesAiRemediationMode.RequireApproval,
2629
+ }),
2630
+ );
2631
+ const request: { get: () => InvestigationRequest } = captureRequest();
2632
+
2633
+ await run();
2634
+
2635
+ expect(toolNames(request.get())).toContain(
2636
+ "propose_remediation_commands",
2637
+ );
2638
+ // Nothing settled it early: the run went to the engine.
2639
+ expect(suggestionCas).not.toHaveBeenCalled();
2640
+ });
2641
+
2642
+ it("runs a Bypass-approval round FullAuto with the opt-in explicitly off", async () => {
2643
+ mockProject({ enableAiCommandExecution: false });
2644
+ mockSuggestionHonouringSelect(clusterRow());
2645
+ const request: { get: () => InvestigationRequest } = captureRequest();
2646
+
2647
+ await run();
2648
+
2649
+ expect(toolNames(request.get())).toContain("execute_remediation_command");
2650
+ expect(suggestionCas).not.toHaveBeenCalled();
2651
+ });
2652
+
2653
+ it.each([
2654
+ ["Enable AI", { enableAi: false }],
2655
+ ["Enable auto-remediation", { enableAutoRemediation: false }],
2656
+ ])(
2657
+ "is still stopped by %s being off, before its cluster is read",
2658
+ async (_label: string, overrides: Record<string, unknown>) => {
2659
+ mockProject({ enableAiCommandExecution: false, ...overrides });
2660
+ mockSuggestionHonouringSelect(clusterRow());
2661
+ const statusRead: jest.SpyInstance =
2662
+ KubernetesClusterAiAccessService.getStatusForCluster as unknown as jest.SpyInstance;
2663
+ const executeRun: jest.SpyInstance = jest
2664
+ .spyOn(AIInvestigationEngine, "executeRun")
2665
+ .mockResolvedValue(undefined as never);
2666
+
2667
+ await run();
2668
+
2669
+ expect(executeRun).not.toHaveBeenCalled();
2670
+ expect(statusRead).not.toHaveBeenCalled();
2671
+ const set: ReturnType<typeof settleSet> = settleSet();
2672
+ expect(set.status).toBe(AutoRemediationSuggestionStatus.NoneApplicable);
2673
+ expect(set.rationaleMarkdown).toContain(
2674
+ "AI or auto-remediation was disabled for this project",
2675
+ );
2676
+ expect(set.rationaleMarkdown).not.toContain(
2677
+ "AI command execution is not enabled",
2678
+ );
2679
+ },
2680
+ );
2681
+
2682
+ it("a cluster reached through an advanced Runner is still held back by the opt-in — via its status gap", async () => {
2683
+ mockProject({ enableAiCommandExecution: false });
2684
+ mockSuggestionHonouringSelect(clusterRow());
2685
+ (
2686
+ KubernetesClusterAiAccessService.getStatusForCluster as unknown as jest.SpyInstance
2687
+ ).mockResolvedValue(
2688
+ clusterStatus({
2689
+ runner: {
2690
+ id: CLUSTER_RUNNER_ID.toString(),
2691
+ name: "ops-runner",
2692
+ kind: "runner",
2693
+ isOnline: true,
2694
+ canRunAiCommands: true,
2695
+ },
2696
+ accessMethod: "credential",
2697
+ credentialId: "99999999-9999-4999-8999-999999999999",
2698
+ isRemediationReady: false,
2699
+ gaps: [
2700
+ {
2701
+ code: "project_ai_command_execution_disabled",
2702
+ title: "AI command execution is off for this project",
2703
+ description:
2704
+ "This cluster is reached through a Runner with a Kubernetes credential.",
2705
+ nextStep:
2706
+ 'Turn on "Enable AI command execution" under Project Settings → AI Features.',
2707
+ blocks: "remediation",
2708
+ },
2709
+ ],
2710
+ }),
2711
+ );
2712
+ const executeRun: jest.SpyInstance = jest
2713
+ .spyOn(AIInvestigationEngine, "executeRun")
2714
+ .mockResolvedValue(undefined as never);
2715
+
2716
+ await run();
2717
+
2718
+ expect(executeRun).not.toHaveBeenCalled();
2719
+ const set: ReturnType<typeof settleSet> = settleSet();
2720
+ expect(set.status).toBe(AutoRemediationSuggestionStatus.NoneApplicable);
2721
+ expect(set.rationaleMarkdown).toContain(
2722
+ "AI command execution is off for this project",
2723
+ );
2724
+ expect(set.rationaleMarkdown).toContain(
2725
+ "Review the cluster's AI agent page (AI → Agent).",
2726
+ );
2727
+ expect(set.rationaleMarkdown).not.toContain("cluster's AI page");
2728
+ });
2729
+
2730
+ it("negative control: the same advanced-Runner cluster without the gap runs — the round follows the status, not the target kind", async () => {
2731
+ mockProject({ enableAiCommandExecution: true });
2732
+ mockSuggestionHonouringSelect(clusterRow());
2733
+ (
2734
+ KubernetesClusterAiAccessService.getStatusForCluster as unknown as jest.SpyInstance
2735
+ ).mockResolvedValue(
2736
+ clusterStatus({
2737
+ runner: {
2738
+ id: CLUSTER_RUNNER_ID.toString(),
2739
+ name: "ops-runner",
2740
+ kind: "runner",
2741
+ isOnline: true,
2742
+ canRunAiCommands: true,
2743
+ posture: { inCluster: false, allowWrites: true },
2744
+ },
2745
+ accessMethod: "credential",
2746
+ credentialId: "99999999-9999-4999-8999-999999999999",
2747
+ }),
2748
+ );
2749
+ const request: { get: () => InvestigationRequest } = captureRequest();
2750
+
2751
+ await run();
2752
+
2753
+ expect(toolNames(request.get())).toContain("execute_remediation_command");
2754
+ });
2755
+
2756
+ it("a round whose cluster was deleted is closed as such with the opt-in off — never blamed on an opt-in it did not need", async () => {
2757
+ mockProject({ enableAiCommandExecution: false });
2758
+ mockSuggestionHonouringSelect(
2759
+ clusterRow({ kubernetesClusterId: undefined }),
2760
+ );
2761
+ jest
2762
+ .spyOn(AIInvestigationEngine, "executeRun")
2763
+ .mockResolvedValue(undefined as never);
2764
+
2765
+ await run();
2766
+
2767
+ const set: ReturnType<typeof settleSet> = settleSet();
2768
+ expect(set.status).toBe(AutoRemediationSuggestionStatus.NoneApplicable);
2769
+ expect(set.rationaleMarkdown).toContain(
2770
+ 'The Kubernetes cluster "prod-us" was deleted before OneUptime AI could remediate it',
2771
+ );
2772
+ expect(set.rationaleMarkdown).not.toContain("AI command execution");
2773
+ });
2774
+
2775
+ it("a round whose cluster was deleted is closed as such even with AI off — nothing is left to gate", async () => {
2776
+ mockProject({ enableAi: false });
2777
+ mockSuggestionHonouringSelect(
2778
+ clusterRow({ kubernetesClusterId: undefined }),
2779
+ );
2780
+ const projectRead: jest.SpyInstance = jest.spyOn(
2781
+ ProjectService,
2782
+ "findOneById",
2783
+ );
2784
+ jest
2785
+ .spyOn(AIInvestigationEngine, "executeRun")
2786
+ .mockResolvedValue(undefined as never);
2787
+
2788
+ await run();
2789
+
2790
+ const set: ReturnType<typeof settleSet> = settleSet();
2791
+ expect(set.rationaleMarkdown).toContain(
2792
+ 'The Kubernetes cluster "prod-us" was deleted',
2793
+ );
2794
+ expect(projectRead).not.toHaveBeenCalled();
2795
+ });
2796
+ });
2797
+
2549
2798
  describe("a round whose cluster was deleted while it waited", () => {
2550
2799
  it("closes with an accurate message about the cluster — never a rule that never existed", async () => {
2551
2800
  mockSuggestionHonouringSelect(
@@ -78,6 +78,8 @@ function cluster(
78
78
  posture: { inCluster: true, allowWrites: true },
79
79
  },
80
80
  accessMethod: "in_cluster",
81
+ aiAgent: null,
82
+ automaticInvestigation: { incidents: false, alerts: false },
81
83
  kubectlAllowlist: [],
82
84
  isInvestigationEnabled: true,
83
85
  isInvestigationReady: true,
@@ -0,0 +1,240 @@
1
+ import RemediationExecutionRunner, {
2
+ isClusterRemediationRound,
3
+ } from "../../../../Server/Utils/AI/Remediation/RemediationExecutionRunner";
4
+ import ProjectService from "../../../../Server/Services/ProjectService";
5
+ import Project from "../../../../Models/DatabaseModels/Project";
6
+ import ObjectID from "../../../../Types/ObjectID";
7
+ import { afterEach, describe, expect, it } from "@jest/globals";
8
+
9
+ /*
10
+ * Contract under test — which project switches a remediation round must
11
+ * still pass when it runs (RemediationExecutionRunner.checkProjectGates),
12
+ * and which rounds count as cluster rounds (isClusterRemediationRound):
13
+ *
14
+ * - Enable AI and Enable auto-remediation are kill switches for EVERY
15
+ * round, cluster or rule (read as "off only when === false");
16
+ * - the project's "Enable AI command execution" opt-in (=== true) gates
17
+ * rule rounds only. A cluster round's consent is the cluster's own Fixes
18
+ * mode (and the chart's write RBAC on the in-cluster agent); a cluster
19
+ * reached through an advanced Runner is held back by its status gap, not
20
+ * here;
21
+ * - a cluster round is a suggestion that names a cluster and NO rule — a
22
+ * row naming a rule is a rule round whatever else it carries, so the
23
+ * exemption can never be reached from the rule lane;
24
+ * - the refusals send people to the always-visible Project Settings → AI
25
+ * Features page, never to AI Credits (billing-only).
26
+ */
27
+
28
+ const PROJECT_ID: ObjectID = new ObjectID(
29
+ "22222222-2222-4222-8222-222222222222",
30
+ );
31
+ const CLUSTER_ID: ObjectID = new ObjectID(
32
+ "44444444-4444-4444-8444-444444444444",
33
+ );
34
+ const RULE_ID: ObjectID = new ObjectID("11111111-1111-4111-8111-111111111111");
35
+
36
+ const KILL_SWITCH_MESSAGE: string =
37
+ "AI or auto-remediation was disabled for this project before the run started";
38
+ const OPT_IN_MESSAGE: string =
39
+ "AI command execution is not enabled for this project";
40
+
41
+ function mockProject(
42
+ project: Record<string, unknown> | null,
43
+ ): jest.SpyInstance {
44
+ return jest
45
+ .spyOn(ProjectService, "findOneById")
46
+ .mockResolvedValue(project as unknown as Project);
47
+ }
48
+
49
+ function allOn(
50
+ overrides: Record<string, unknown> = {},
51
+ ): Record<string, unknown> {
52
+ return {
53
+ id: PROJECT_ID,
54
+ enableAi: true,
55
+ enableAutoRemediation: true,
56
+ enableAiCommandExecution: true,
57
+ ...overrides,
58
+ };
59
+ }
60
+
61
+ async function gates(isClusterRound: boolean): Promise<string | null> {
62
+ return RemediationExecutionRunner.checkProjectGates({
63
+ projectId: PROJECT_ID,
64
+ isClusterRound,
65
+ });
66
+ }
67
+
68
+ afterEach(() => {
69
+ jest.restoreAllMocks();
70
+ });
71
+
72
+ describe("isClusterRemediationRound", () => {
73
+ it("is a cluster round when the suggestion names a cluster and no rule", () => {
74
+ expect(
75
+ isClusterRemediationRound({
76
+ kubernetesClusterId: CLUSTER_ID,
77
+ autoRemediationRuleId: undefined,
78
+ }),
79
+ ).toBe(true);
80
+ });
81
+
82
+ it("is a rule round when the suggestion names a rule and no cluster", () => {
83
+ expect(
84
+ isClusterRemediationRound({
85
+ kubernetesClusterId: undefined,
86
+ autoRemediationRuleId: RULE_ID,
87
+ }),
88
+ ).toBe(false);
89
+ });
90
+
91
+ it("is a rule round when the suggestion names BOTH — a rule id always wins, so the exemption fails closed", () => {
92
+ expect(
93
+ isClusterRemediationRound({
94
+ kubernetesClusterId: CLUSTER_ID,
95
+ autoRemediationRuleId: RULE_ID,
96
+ }),
97
+ ).toBe(false);
98
+ });
99
+
100
+ it("is not a cluster round when the suggestion names neither (a deleted cluster, or a deleted rule)", () => {
101
+ expect(isClusterRemediationRound({})).toBe(false);
102
+ expect(
103
+ isClusterRemediationRound({
104
+ kubernetesClusterId: undefined,
105
+ autoRemediationRuleId: undefined,
106
+ }),
107
+ ).toBe(false);
108
+ });
109
+ });
110
+
111
+ describe("RemediationExecutionRunner.checkProjectGates", () => {
112
+ it("reads the project as root, by id, with exactly the three switches", async () => {
113
+ const find: jest.SpyInstance = mockProject(allOn());
114
+
115
+ await gates(false);
116
+
117
+ expect(find).toHaveBeenCalledTimes(1);
118
+ expect(find).toHaveBeenCalledWith({
119
+ id: PROJECT_ID,
120
+ select: {
121
+ enableAi: true,
122
+ enableAutoRemediation: true,
123
+ enableAiCommandExecution: true,
124
+ },
125
+ props: { isRoot: true },
126
+ });
127
+ });
128
+
129
+ describe.each([
130
+ ["a rule round", false],
131
+ ["a cluster round", true],
132
+ ])("the kill switches stop %s", (_label: string, isClusterRound: boolean) => {
133
+ it("when the project row is gone", async () => {
134
+ mockProject(null);
135
+
136
+ expect(await gates(isClusterRound)).toContain(KILL_SWITCH_MESSAGE);
137
+ });
138
+
139
+ it("when Enable AI is off", async () => {
140
+ mockProject(allOn({ enableAi: false }));
141
+
142
+ expect(await gates(isClusterRound)).toContain(KILL_SWITCH_MESSAGE);
143
+ });
144
+
145
+ it("when Enable auto-remediation is off", async () => {
146
+ mockProject(allOn({ enableAutoRemediation: false }));
147
+
148
+ expect(await gates(isClusterRound)).toContain(KILL_SWITCH_MESSAGE);
149
+ });
150
+
151
+ it("but not when the kill switches were never set — they are on unless explicitly false", async () => {
152
+ mockProject({
153
+ id: PROJECT_ID,
154
+ enableAi: undefined,
155
+ enableAutoRemediation: null,
156
+ enableAiCommandExecution: true,
157
+ });
158
+
159
+ expect(await gates(isClusterRound)).toBeNull();
160
+ });
161
+
162
+ it("and a kill switch wins over the opt-in: the message names the kill switch, not command execution", async () => {
163
+ mockProject(allOn({ enableAi: false, enableAiCommandExecution: false }));
164
+
165
+ const failure: string | null = await gates(isClusterRound);
166
+
167
+ expect(failure).toContain(KILL_SWITCH_MESSAGE);
168
+ expect(failure).not.toContain(OPT_IN_MESSAGE);
169
+ });
170
+ });
171
+
172
+ describe("a rule round needs the AI command execution opt-in", () => {
173
+ it.each([
174
+ ["false", false],
175
+ ["never set (undefined)", undefined],
176
+ ["null", null],
177
+ ])(
178
+ "is refused when the opt-in is %s — only an explicit true opts in",
179
+ async (_label: string, value: boolean | null | undefined) => {
180
+ mockProject(allOn({ enableAiCommandExecution: value }));
181
+
182
+ expect(await gates(false)).toContain(OPT_IN_MESSAGE);
183
+ },
184
+ );
185
+
186
+ it("passes when the opt-in is explicitly true", async () => {
187
+ mockProject(allOn());
188
+
189
+ expect(await gates(false)).toBeNull();
190
+ });
191
+ });
192
+
193
+ describe("a cluster round does not need the AI command execution opt-in", () => {
194
+ it.each([
195
+ ["false", false],
196
+ ["never set (undefined)", undefined],
197
+ ["null", null],
198
+ ["true", true],
199
+ ])(
200
+ "passes when the opt-in is %s",
201
+ async (_label: string, value: boolean | null | undefined) => {
202
+ mockProject(allOn({ enableAiCommandExecution: value }));
203
+
204
+ expect(await gates(true)).toBeNull();
205
+ },
206
+ );
207
+ });
208
+
209
+ describe("the refusals point at the page that owns the switches", () => {
210
+ it.each([
211
+ ["a kill switch", allOn({ enableAi: false }), true],
212
+ [
213
+ "a kill switch (rule round)",
214
+ allOn({ enableAutoRemediation: false }),
215
+ false,
216
+ ],
217
+ [
218
+ "the command execution opt-in",
219
+ allOn({ enableAiCommandExecution: false }),
220
+ false,
221
+ ],
222
+ ])(
223
+ "%s names Project Settings → AI Features and says nothing ran",
224
+ async (
225
+ _label: string,
226
+ project: Record<string, unknown>,
227
+ isClusterRound: boolean,
228
+ ) => {
229
+ mockProject(project);
230
+
231
+ const failure: string = (await gates(isClusterRound)) || "";
232
+
233
+ expect(failure).toContain("Project Settings → AI Features");
234
+ expect(failure).not.toContain("AI Credits");
235
+ expect(failure).not.toMatch(/Project Settings → AI\)/);
236
+ expect(failure).toContain("nothing was run or proposed");
237
+ },
238
+ );
239
+ });
240
+ });
@@ -355,6 +355,8 @@ describe("the tools the model reads use the shared summaries", () => {
355
355
  canRunAiCommands: true,
356
356
  },
357
357
  accessMethod: "in_cluster",
358
+ aiAgent: null,
359
+ automaticInvestigation: { incidents: false, alerts: false },
358
360
  kubectlAllowlist: ["kubectl set image deployment/web * -n web"],
359
361
  isInvestigationEnabled: true,
360
362
  isInvestigationReady: true,
@@ -1421,6 +1421,8 @@ function clusterStatus(
1421
1421
  posture: { inCluster: true, allowWrites: true },
1422
1422
  },
1423
1423
  accessMethod: "in_cluster",
1424
+ aiAgent: null,
1425
+ automaticInvestigation: { incidents: false, alerts: false },
1424
1426
  kubectlAllowlist: [],
1425
1427
  isInvestigationEnabled: true,
1426
1428
  isInvestigationReady: true,
@@ -133,6 +133,8 @@ function clusterStatus(): KubernetesClusterAiAccessStatus {
133
133
  posture: { inCluster: true, allowWrites: true },
134
134
  },
135
135
  accessMethod: "in_cluster",
136
+ aiAgent: null,
137
+ automaticInvestigation: { incidents: false, alerts: false },
136
138
  kubectlAllowlist: [],
137
139
  isInvestigationEnabled: true,
138
140
  isInvestigationReady: true,
@@ -987,6 +987,8 @@ describe("RemediationVerifier.resumeInterruptedRollbacks — the follow-up after
987
987
  canRunAiCommands: true,
988
988
  },
989
989
  accessMethod: "in_cluster",
990
+ aiAgent: null,
991
+ automaticInvestigation: { incidents: false, alerts: false },
990
992
  kubectlAllowlist: [],
991
993
  isInvestigationEnabled: true,
992
994
  isInvestigationReady: true,
@@ -233,3 +233,71 @@ describe("host asset attributes survive the OTLP wire shape (issue #3866)", () =
233
233
  expect(host).toBeUndefined();
234
234
  });
235
235
  });
236
+
237
+ /*
238
+ * Issue #4107 — the same seam for the follow-up attributes. host.mac is
239
+ * the one that matters here: like host.ip it is an OTLP arrayValue (the
240
+ * system detector sends one IEEE RA address per interface that is up),
241
+ * so it has to survive getAttributes as a real array for the join to see
242
+ * every NIC.
243
+ */
244
+ const MAC_ADDRESSES: Array<string> = ["3C-7C-3F-1A-2B-3C", "00-15-5D-01-02-03"];
245
+
246
+ function fullyConfiguredWindowsHost(): JSONArray {
247
+ return [
248
+ ...(windowsHostResourceAttributes() as Array<JSONObject>),
249
+ stringArrayAttribute("host.mac", MAC_ADDRESSES),
250
+ stringAttribute("os.version", "10.0.22631"),
251
+ stringAttribute("device.firmware.version", "1.21.0"),
252
+ ] as JSONArray;
253
+ }
254
+
255
+ describe("MAC, OS version and firmware survive the OTLP wire shape (issue #4107)", () => {
256
+ test("host.mac reaches the extractor as a real array under the same key", () => {
257
+ const flat: Dictionary<AttributeType | Array<AttributeType>> =
258
+ TelemetryUtil.getAttributes({
259
+ items: fullyConfiguredWindowsHost(),
260
+ prefixKeysWithString: "",
261
+ });
262
+
263
+ expect(flat["host.mac"]).toEqual(MAC_ADDRESSES);
264
+ expect(flat["host.mac.0"]).toBeUndefined();
265
+ });
266
+
267
+ test("a fully configured Windows host yields every asset attribute", () => {
268
+ const host: ExtractedEntity | undefined = extractHost(
269
+ fullyConfiguredWindowsHost(),
270
+ );
271
+
272
+ expect(host!.descriptiveAttributes).toEqual({
273
+ "os.type": "windows",
274
+ "os.description": "Microsoft Windows 11 Enterprise",
275
+ "os.version": "10.0.22631",
276
+ "host.arch": "amd64",
277
+ "host.id": "4C4C4544-0037-5A10-8054-B4C04F335931",
278
+ "host.ip": "10.1.2.3, 10.1.2.4, fe80::42:acff:fe11:1",
279
+ "host.mac": "3C-7C-3F-1A-2B-3C, 00-15-5D-01-02-03",
280
+ "host.serial_number": "7XYZ123",
281
+ "device.manufacturer": "Dell Inc.",
282
+ "device.model.name": "OptiPlex 7090",
283
+ "device.firmware.version": "1.21.0",
284
+ });
285
+ });
286
+
287
+ test("a snake_case host.mac array yields the identical value", () => {
288
+ const snakeCase: ExtractedEntity | undefined = extractHost([
289
+ stringAttribute("host.name", "wbprjdeais002"),
290
+ snakeCaseStringArrayAttribute("host.mac", MAC_ADDRESSES),
291
+ ] as JSONArray);
292
+
293
+ expect(snakeCase!.descriptiveAttributes).toEqual({
294
+ "host.mac": "3C-7C-3F-1A-2B-3C, 00-15-5D-01-02-03",
295
+ });
296
+ });
297
+
298
+ test("the new attributes do not move the entity key", () => {
299
+ expect(extractHost(fullyConfiguredWindowsHost())!.entityKey).toBe(
300
+ extractHost(windowsHostResourceAttributes())!.entityKey,
301
+ );
302
+ });
303
+ });