@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
@@ -16,6 +16,7 @@ import TooManyRequestsException from "../../Types/Exception/TooManyRequestsExcep
16
16
  import ObjectID from "../../Types/ObjectID";
17
17
  import { JSONObject } from "../../Types/JSON";
18
18
  import Permission, {
19
+ PermissionHelper,
19
20
  UserPermission,
20
21
  UserTenantAccessPermission,
21
22
  } from "../../Types/Permission";
@@ -24,12 +25,39 @@ import RunnerJobStatus from "../../Types/Runbook/RunnerJobStatus";
24
25
  import {
25
26
  DEFAULT_KUBECTL_TIMEOUT_MS,
26
27
  KubernetesAiAccessGap,
28
+ KubernetesAiAccessGapCode,
27
29
  KubernetesClusterAiAccessStatus,
30
+ getKubernetesAiAccessTargetKind,
28
31
  } from "../../Types/Kubernetes/KubernetesClusterAiAccess";
29
- import { KUBERNETES_AI_ACCESS_CREDENTIAL_PERMISSIONS } from "../../Types/Kubernetes/KubernetesClusterAiAccessPermissions";
32
+ import {
33
+ KUBERNETES_AI_ACCESS_ADMIN_PERMISSIONS,
34
+ KUBERNETES_AI_ACCESS_CREDENTIAL_PERMISSIONS,
35
+ } from "../../Types/Kubernetes/KubernetesClusterAiAccessPermissions";
36
+ import {
37
+ KUBERNETES_CLUSTER_AI_INSIGHTS_COMMAND_WINDOW_IN_DAYS,
38
+ KUBERNETES_CLUSTER_AI_INSIGHTS_LIMIT,
39
+ KUBERNETES_CLUSTER_AI_INSIGHTS_RATIONALE_MAX_LENGTH,
40
+ KubernetesClusterAiInsightFix,
41
+ KubernetesClusterAiInsightInvestigation,
42
+ KubernetesClusterAiInsights,
43
+ } from "../../Types/Kubernetes/KubernetesClusterAiInsights";
44
+ import AIRunType from "../../Types/AI/AIRunType";
45
+ import SortOrder from "../../Types/BaseDatabase/SortOrder";
46
+ import RunbookStepType from "../../Types/Runbook/RunbookStepType";
47
+ import AIRun from "../../Models/DatabaseModels/AIRun";
48
+ import Alert from "../../Models/DatabaseModels/Alert";
49
+ import AutoRemediationSuggestion from "../../Models/DatabaseModels/AutoRemediationSuggestion";
50
+ import Incident from "../../Models/DatabaseModels/Incident";
51
+ import KubernetesAiAgent from "../../Models/DatabaseModels/KubernetesAiAgent";
30
52
  import KubernetesCluster from "../../Models/DatabaseModels/KubernetesCluster";
53
+ import RunnerJob from "../../Models/DatabaseModels/RunnerJob";
31
54
  import GlobalCache from "../Infrastructure/GlobalCache";
32
55
  import Semaphore, { SemaphoreMutex } from "../Infrastructure/Semaphore";
56
+ import AIRunService from "../Services/AIRunService";
57
+ import AlertService from "../Services/AlertService";
58
+ import AutoRemediationSuggestionService from "../Services/AutoRemediationSuggestionService";
59
+ import IncidentService from "../Services/IncidentService";
60
+ import KubernetesAiAgentService from "../Services/KubernetesAiAgentService";
33
61
  import KubernetesClusterService from "../Services/KubernetesClusterService";
34
62
  import KubernetesClusterAiAccessService from "../Services/KubernetesClusterAiAccessService";
35
63
  import RunnerJobService from "../Services/RunnerJobService";
@@ -44,25 +72,36 @@ import KubectlJobRunner, {
44
72
  const router: ExpressRouter = Express.getRouter();
45
73
 
46
74
  /*
47
- * The cluster AI page's two custom calls. Everything else on that page is
48
- * ordinary CRUD on KubernetesCluster (the bound Runner, the credential, the
49
- * two switches, the allowlist).
75
+ * The custom calls behind a cluster's AI pages (AI → Agent and
76
+ * AI → Insights). Everything else there is ordinary CRUD on
77
+ * KubernetesCluster (the two switches, the allowlist, an advanced Runner
78
+ * and credential).
50
79
  *
51
- * POST /kubernetes-cluster/ai-access/status { clusterId }
52
- * The readiness checklist: can OneUptime AI reach this cluster, what
53
- * may it do, and what is missing. Requires read access to the cluster;
54
- * the credential's name (and descriptions that name it) additionally
55
- * need permission to read credentials.
80
+ * POST /kubernetes-cluster/ai-access/status { clusterId }
81
+ * The readiness checklist: can OneUptime AI reach this cluster, through
82
+ * which access target, what may it do, and what is missing. Requires
83
+ * read access to the cluster; the credential's name (and descriptions
84
+ * that name it) additionally need permission to read credentials.
56
85
  *
57
- * POST /kubernetes-cluster/ai-access/test { clusterId }
86
+ * POST /kubernetes-cluster/ai-access/test { clusterId }
58
87
  * Runs `kubectl version` and `kubectl auth can-i --list` through the
59
- * bound Runner and returns their output, so an operator can see the
60
- * access work (and the RBAC the Runner actually has) before an incident
61
- * does. Read-only, but it spends Runner time, so it requires edit access
62
- * to the cluster and has its own limits instead of spending the
88
+ * cluster's access target (its Kubernetes AI agent, or the Runner it is
89
+ * reached through) and returns their output, so an operator can see the
90
+ * access work (and the RBAC it actually has) before an incident does.
91
+ * Read-only, but it spends the target's time, so it requires edit
92
+ * access to the cluster and has its own limits instead of spending the
63
93
  * project's investigation budget: one test at a time per cluster (an
64
94
  * atomic reservation), a few per minute and a cumulative ceiling per
65
95
  * hour per cluster, and a few per minute per user.
96
+ *
97
+ * POST /kubernetes-cluster/ai-access/reset-agent { clusterId }
98
+ * Forgets the key of the cluster's Kubernetes AI agent, so whatever
99
+ * holds it is locked out and the real pod registers afresh within a
100
+ * few minutes. For the people who may loosen AI access.
101
+ *
102
+ * POST /kubernetes-cluster/ai-access/insights { clusterId }
103
+ * What AI investigated and changed on the cluster, as summaries. Same
104
+ * read gate as the status.
66
105
  */
67
106
 
68
107
  async function getLoggedInProps(
@@ -208,6 +247,17 @@ const AI_ACCESS_TEST_USER_LOCK_ACQUIRE_TIMEOUT_MS: number = 15_000;
208
247
  const ALREADY_RUNNING_MESSAGE: string =
209
248
  "An AI access test is already running for this cluster. Wait for it to finish, then run it again.";
210
249
 
250
+ /*
251
+ * Gaps that block both capabilities but not the access test's transport:
252
+ * they are about the project's AI (switched off, no provider, no credits),
253
+ * and the test runs kubectl, never a model.
254
+ */
255
+ const NON_TRANSPORT_GAP_CODES: Array<KubernetesAiAccessGapCode> = [
256
+ "project_ai_disabled",
257
+ "llm_provider_missing",
258
+ "ai_balance_insufficient",
259
+ ];
260
+
211
261
  const AI_ACCESS_TEST_COMMANDS: Array<string> = [
212
262
  "kubectl version",
213
263
  "kubectl auth can-i --list",
@@ -469,6 +519,29 @@ async function runAccessTestCommand(data: {
469
519
  export const RESTRICTED_CREDENTIAL_GAP_DESCRIPTION: string =
470
520
  "The Kubernetes credential this cluster's Runner needs is missing or cannot be used. Someone who can view Runner credentials can see which one on this page.";
471
521
 
522
+ /*
523
+ * Resetting the agent locks out whatever holds its key, and the real pod
524
+ * registers afresh: the same people who may loosen AI access may do it.
525
+ */
526
+ function assertCanResetAiAgent(
527
+ props: DatabaseCommonInteractionProps,
528
+ projectId: ObjectID,
529
+ ): void {
530
+ if (
531
+ !holdsAnyUnblockedPermission({
532
+ props,
533
+ projectId,
534
+ allowed: KUBERNETES_AI_ACCESS_ADMIN_PERMISSIONS,
535
+ })
536
+ ) {
537
+ throw new NotAuthorizedException(
538
+ `You need one of these permissions to reset this cluster's Kubernetes AI agent: ${PermissionHelper.getPermissionTitles(
539
+ KUBERNETES_AI_ACCESS_ADMIN_PERMISSIONS,
540
+ ).join(", ")}.`,
541
+ );
542
+ }
543
+ }
544
+
472
545
  /*
473
546
  * The status as this caller may see it. Reading the cluster shows its
474
547
  * readiness; the credential's name — and gap descriptions that name it —
@@ -658,16 +731,16 @@ router.post(
658
731
  }
659
732
 
660
733
  /*
661
- * The test needs a reachable Runner, not the investigation switch:
662
- * an operator checks access BEFORE turning AI on. Only gaps that
663
- * block the transport itself stop it.
734
+ * The test needs a reachable access target, not the investigation
735
+ * switch: an operator checks access BEFORE turning AI on. Only gaps
736
+ * that block the transport itself stop it — never one about the
737
+ * project's AI (the test runs kubectl, not a model).
664
738
  */
665
739
  const transportGap: KubernetesAiAccessGap | undefined =
666
740
  status.gaps.find((gap: KubernetesAiAccessGap) => {
667
741
  return (
668
742
  gap.blocks === "both" &&
669
- gap.code !== "project_ai_disabled" &&
670
- gap.code !== "llm_provider_missing"
743
+ !NON_TRANSPORT_GAP_CODES.includes(gap.code)
671
744
  );
672
745
  });
673
746
 
@@ -676,7 +749,7 @@ router.post(
676
749
  ok: false,
677
750
  message: transportGap
678
751
  ? `${transportGap.title}. ${transportGap.nextStep}`
679
- : "No Runner is bound to this cluster.",
752
+ : "Nothing can reach this cluster yet: install the Kubernetes AI agent.",
680
753
  results: [],
681
754
  status: toViewerStatus({
682
755
  status,
@@ -768,7 +841,11 @@ router.post(
768
841
  Response.sendJsonObjectResponse(req, res, {
769
842
  ok: allSucceeded,
770
843
  message: allSucceeded
771
- ? `OneUptime AI can run kubectl on "${cluster.name}" through Runner "${status.runner.name}".`
844
+ ? `OneUptime AI can run kubectl on "${cluster.name}" through ${
845
+ getKubernetesAiAccessTargetKind(status.runner) === "ai_agent"
846
+ ? "the Kubernetes AI agent"
847
+ : `Runner "${status.runner.name}"`
848
+ }.`
772
849
  : "kubectl could not run successfully — see the command output below.",
773
850
  results,
774
851
  status: toViewerStatus({
@@ -790,4 +867,529 @@ router.post(
790
867
  },
791
868
  );
792
869
 
870
+ /*
871
+ * How many of the cluster's newest kubectl jobs the insights read to find
872
+ * the AI runs and suggestions that ran commands on it. Each AI run runs at
873
+ * most a handful, so this reaches well past the newest 25 of either.
874
+ */
875
+ const INSIGHTS_JOB_SCAN_LIMIT: number = 500;
876
+
877
+ // How many incidents and alerts linked to the cluster the insights read.
878
+ const INSIGHTS_LINKED_SUBJECT_LIMIT: number = 200;
879
+
880
+ // What the insights' merge reads off every row it unions.
881
+ interface BaseRow {
882
+ id?: ObjectID | null | undefined;
883
+ createdAt?: Date | undefined;
884
+ }
885
+
886
+ function toIsoString(date: Date | undefined): string | undefined {
887
+ return date ? OneUptimeDate.toString(date) : undefined;
888
+ }
889
+
890
+ function newestFirst<T extends { createdAt?: Date | undefined }>(
891
+ rows: Array<T>,
892
+ ): Array<T> {
893
+ return rows.sort((a: T, b: T): number => {
894
+ return (
895
+ (b.createdAt ? new Date(b.createdAt).getTime() : 0) -
896
+ (a.createdAt ? new Date(a.createdAt).getTime() : 0)
897
+ );
898
+ });
899
+ }
900
+
901
+ // The union of several newest-first reads: one row per id, newest first.
902
+ function mergeNewest<T extends BaseRow>(
903
+ groups: Array<Array<T>>,
904
+ limit: number,
905
+ ): Array<T> {
906
+ const byId: Map<string, T> = new Map<string, T>();
907
+
908
+ for (const rows of groups) {
909
+ for (const row of rows) {
910
+ const id: string | undefined = row.id?.toString();
911
+
912
+ if (id && !byId.has(id)) {
913
+ byId.set(id, row);
914
+ }
915
+ }
916
+ }
917
+
918
+ return newestFirst(Array.from(byId.values())).slice(0, limit);
919
+ }
920
+
921
+ /*
922
+ * What OneUptime AI investigated and changed on one cluster, as summaries
923
+ * (KubernetesClusterAiInsights). Read as root: the caller has already been
924
+ * checked for read access to the cluster (findAccessibleCluster), and the
925
+ * rows it summarises — AI runs, suggestions, Runner jobs — have narrower
926
+ * read ACLs of their own, so reading them under the viewer's props would
927
+ * break the page for exactly the people it is for. That is why nothing
928
+ * here returns kubectl output, prompts or command plans.
929
+ *
930
+ * - investigations: AI investigations that ran kubectl on this cluster
931
+ * (their RunnerJob rows name it), UNION investigations of incidents and
932
+ * alerts linked to it — which also covers one whose cluster access was
933
+ * not set up, so it never ran kubectl. Newest first, at most
934
+ * KUBERNETES_CLUSTER_AI_INSIGHTS_LIMIT.
935
+ * - fixes: suggestions the cluster's Fixes setting produced (their
936
+ * kubernetesClusterId), UNION any suggestion whose kubectl ran on this
937
+ * cluster (a rule's round, too). Newest first, same limit.
938
+ * - commandCounts: kubectl commands in the last
939
+ * KUBERNETES_CLUSTER_AI_INSIGHTS_COMMAND_WINDOW_IN_DAYS days. The AI
940
+ * agent page's connection tests have no AI run behind them and are not
941
+ * counted, the way the project's investigation brake leaves them out.
942
+ */
943
+ export async function getClusterAiInsights(data: {
944
+ projectId: ObjectID;
945
+ clusterId: ObjectID;
946
+ }): Promise<KubernetesClusterAiInsights> {
947
+ const { projectId, clusterId } = data;
948
+ const limit: number = KUBERNETES_CLUSTER_AI_INSIGHTS_LIMIT;
949
+
950
+ const jobs: Array<RunnerJob> = await RunnerJobService.findBy({
951
+ query: {
952
+ projectId,
953
+ kubernetesClusterId: clusterId,
954
+ stepType: RunbookStepType.Kubectl,
955
+ },
956
+ select: { _id: true, aiRunId: true, autoRemediationSuggestionId: true },
957
+ sort: { createdAt: SortOrder.Descending },
958
+ limit: INSIGHTS_JOB_SCAN_LIMIT,
959
+ skip: 0,
960
+ props: { isRoot: true },
961
+ });
962
+
963
+ const runIdsFromJobs: Map<string, ObjectID> = new Map<string, ObjectID>();
964
+ const suggestionIdsFromJobs: Map<string, ObjectID> = new Map<
965
+ string,
966
+ ObjectID
967
+ >();
968
+
969
+ for (const job of jobs) {
970
+ if (job.aiRunId) {
971
+ runIdsFromJobs.set(job.aiRunId.toString(), job.aiRunId);
972
+ }
973
+
974
+ if (job.autoRemediationSuggestionId) {
975
+ suggestionIdsFromJobs.set(
976
+ job.autoRemediationSuggestionId.toString(),
977
+ job.autoRemediationSuggestionId,
978
+ );
979
+ }
980
+ }
981
+
982
+ const [linkedIncidents, linkedAlerts]: [Array<Incident>, Array<Alert>] =
983
+ await Promise.all([
984
+ IncidentService.findBy({
985
+ query: {
986
+ projectId,
987
+ kubernetesClusters: QueryHelper.inRelationArray([clusterId]),
988
+ },
989
+ select: { _id: true },
990
+ sort: { createdAt: SortOrder.Descending },
991
+ limit: INSIGHTS_LINKED_SUBJECT_LIMIT,
992
+ skip: 0,
993
+ props: { isRoot: true },
994
+ }),
995
+ AlertService.findBy({
996
+ query: {
997
+ projectId,
998
+ kubernetesClusters: QueryHelper.inRelationArray([clusterId]),
999
+ },
1000
+ select: { _id: true },
1001
+ sort: { createdAt: SortOrder.Descending },
1002
+ limit: INSIGHTS_LINKED_SUBJECT_LIMIT,
1003
+ skip: 0,
1004
+ props: { isRoot: true },
1005
+ }),
1006
+ ]);
1007
+
1008
+ const investigations: Array<KubernetesClusterAiInsightInvestigation> =
1009
+ await getInsightInvestigations({
1010
+ projectId,
1011
+ runIds: Array.from(runIdsFromJobs.values()),
1012
+ incidentIds: getIds(linkedIncidents),
1013
+ alertIds: getIds(linkedAlerts),
1014
+ limit,
1015
+ });
1016
+
1017
+ const fixes: Array<KubernetesClusterAiInsightFix> = await getInsightFixes({
1018
+ projectId,
1019
+ clusterId,
1020
+ suggestionIds: Array.from(suggestionIdsFromJobs.values()),
1021
+ limit,
1022
+ });
1023
+
1024
+ const since: Date = OneUptimeDate.getSomeDaysAgo(
1025
+ KUBERNETES_CLUSTER_AI_INSIGHTS_COMMAND_WINDOW_IN_DAYS,
1026
+ );
1027
+
1028
+ const countCommands: (
1029
+ query: Record<string, unknown>,
1030
+ ) => Promise<number> = async (
1031
+ query: Record<string, unknown>,
1032
+ ): Promise<number> => {
1033
+ return (
1034
+ await RunnerJobService.countBy({
1035
+ query: {
1036
+ ...query,
1037
+ projectId,
1038
+ kubernetesClusterId: clusterId,
1039
+ stepType: RunbookStepType.Kubectl,
1040
+ createdAt: QueryHelper.greaterThan(since),
1041
+ } as never,
1042
+ props: { isRoot: true },
1043
+ })
1044
+ ).toNumber();
1045
+ };
1046
+
1047
+ const [investigationCommands, remediationCommands]: [number, number] =
1048
+ await Promise.all([
1049
+ countCommands({
1050
+ origin: RunnerJobOrigin.AiInvestigation,
1051
+ // Connection tests have no AI run; every investigation command does.
1052
+ aiRunId: QueryHelper.notNull(),
1053
+ }),
1054
+ countCommands({ origin: RunnerJobOrigin.AiRemediation }),
1055
+ ]);
1056
+
1057
+ return {
1058
+ clusterId: clusterId.toString(),
1059
+ investigations,
1060
+ fixes,
1061
+ commandCounts: {
1062
+ investigation: investigationCommands,
1063
+ remediation: remediationCommands,
1064
+ },
1065
+ };
1066
+ }
1067
+
1068
+ function getIds(
1069
+ rows: Array<{ id?: ObjectID | null | undefined }>,
1070
+ ): Array<ObjectID> {
1071
+ return rows
1072
+ .map((row: { id?: ObjectID | null | undefined }): ObjectID | undefined => {
1073
+ return row.id || undefined;
1074
+ })
1075
+ .filter((id: ObjectID | undefined): id is ObjectID => {
1076
+ return Boolean(id);
1077
+ });
1078
+ }
1079
+
1080
+ const INSIGHT_RUN_SELECT: Record<string, boolean> = {
1081
+ _id: true,
1082
+ status: true,
1083
+ analysisTldr: true,
1084
+ createdAt: true,
1085
+ completedAt: true,
1086
+ triggeredByIncidentId: true,
1087
+ triggeredByAlertId: true,
1088
+ };
1089
+
1090
+ async function getInsightInvestigations(data: {
1091
+ projectId: ObjectID;
1092
+ runIds: Array<ObjectID>;
1093
+ incidentIds: Array<ObjectID>;
1094
+ alertIds: Array<ObjectID>;
1095
+ limit: number;
1096
+ }): Promise<Array<KubernetesClusterAiInsightInvestigation>> {
1097
+ const reads: Array<Promise<Array<AIRun>>> = [];
1098
+
1099
+ const readRuns: (query: Record<string, unknown>) => Promise<Array<AIRun>> = (
1100
+ query: Record<string, unknown>,
1101
+ ): Promise<Array<AIRun>> => {
1102
+ return AIRunService.findBy({
1103
+ query: {
1104
+ ...query,
1105
+ projectId: data.projectId,
1106
+ runType: AIRunType.Investigation,
1107
+ } as never,
1108
+ select: INSIGHT_RUN_SELECT,
1109
+ sort: { createdAt: SortOrder.Descending },
1110
+ limit: data.limit,
1111
+ skip: 0,
1112
+ props: { isRoot: true },
1113
+ });
1114
+ };
1115
+
1116
+ if (data.runIds.length > 0) {
1117
+ reads.push(readRuns({ _id: QueryHelper.any(data.runIds) }));
1118
+ }
1119
+
1120
+ if (data.incidentIds.length > 0) {
1121
+ reads.push(
1122
+ readRuns({ triggeredByIncidentId: QueryHelper.any(data.incidentIds) }),
1123
+ );
1124
+ }
1125
+
1126
+ if (data.alertIds.length > 0) {
1127
+ reads.push(
1128
+ readRuns({ triggeredByAlertId: QueryHelper.any(data.alertIds) }),
1129
+ );
1130
+ }
1131
+
1132
+ if (reads.length === 0) {
1133
+ return [];
1134
+ }
1135
+
1136
+ const runs: Array<AIRun> = mergeNewest(await Promise.all(reads), data.limit);
1137
+
1138
+ const incidentIds: Array<ObjectID> = getUniqueIds(
1139
+ runs.map((run: AIRun): ObjectID | undefined => {
1140
+ return run.triggeredByIncidentId;
1141
+ }),
1142
+ );
1143
+ const alertIds: Array<ObjectID> = getUniqueIds(
1144
+ runs.map((run: AIRun): ObjectID | undefined => {
1145
+ return run.triggeredByAlertId;
1146
+ }),
1147
+ );
1148
+
1149
+ const [incidents, alerts]: [Array<Incident>, Array<Alert>] =
1150
+ await Promise.all([
1151
+ incidentIds.length > 0
1152
+ ? IncidentService.findBy({
1153
+ query: {
1154
+ projectId: data.projectId,
1155
+ _id: QueryHelper.any(incidentIds),
1156
+ },
1157
+ select: { _id: true, title: true, incidentNumber: true },
1158
+ limit: incidentIds.length,
1159
+ skip: 0,
1160
+ props: { isRoot: true },
1161
+ })
1162
+ : Promise.resolve([]),
1163
+ alertIds.length > 0
1164
+ ? AlertService.findBy({
1165
+ query: {
1166
+ projectId: data.projectId,
1167
+ _id: QueryHelper.any(alertIds),
1168
+ },
1169
+ select: { _id: true, title: true },
1170
+ limit: alertIds.length,
1171
+ skip: 0,
1172
+ props: { isRoot: true },
1173
+ })
1174
+ : Promise.resolve([]),
1175
+ ]);
1176
+
1177
+ const incidentsById: Map<string, Incident> = new Map<string, Incident>(
1178
+ incidents.map((incident: Incident): [string, Incident] => {
1179
+ return [incident.id?.toString() || "", incident];
1180
+ }),
1181
+ );
1182
+ const alertsById: Map<string, Alert> = new Map<string, Alert>(
1183
+ alerts.map((alert: Alert): [string, Alert] => {
1184
+ return [alert.id?.toString() || "", alert];
1185
+ }),
1186
+ );
1187
+
1188
+ return runs.map((run: AIRun): KubernetesClusterAiInsightInvestigation => {
1189
+ const incident: Incident | undefined = run.triggeredByIncidentId
1190
+ ? incidentsById.get(run.triggeredByIncidentId.toString())
1191
+ : undefined;
1192
+ const alert: Alert | undefined = run.triggeredByAlertId
1193
+ ? alertsById.get(run.triggeredByAlertId.toString())
1194
+ : undefined;
1195
+
1196
+ return {
1197
+ aiRunId: run.id!.toString(),
1198
+ status: run.status,
1199
+ analysisTldr: run.analysisTldr || undefined,
1200
+ createdAt: toIsoString(run.createdAt),
1201
+ completedAt: toIsoString(run.completedAt),
1202
+ incident: run.triggeredByIncidentId
1203
+ ? {
1204
+ id: run.triggeredByIncidentId.toString(),
1205
+ title: incident?.title,
1206
+ number: incident?.incidentNumber,
1207
+ }
1208
+ : undefined,
1209
+ alert: run.triggeredByAlertId
1210
+ ? {
1211
+ id: run.triggeredByAlertId.toString(),
1212
+ title: alert?.title,
1213
+ }
1214
+ : undefined,
1215
+ };
1216
+ });
1217
+ }
1218
+
1219
+ function getUniqueIds(ids: Array<ObjectID | undefined>): Array<ObjectID> {
1220
+ const byId: Map<string, ObjectID> = new Map<string, ObjectID>();
1221
+
1222
+ for (const id of ids) {
1223
+ if (id) {
1224
+ byId.set(id.toString(), id);
1225
+ }
1226
+ }
1227
+
1228
+ return Array.from(byId.values());
1229
+ }
1230
+
1231
+ const INSIGHT_FIX_SELECT: Record<string, boolean> = {
1232
+ _id: true,
1233
+ status: true,
1234
+ executionMode: true,
1235
+ suggestionType: true,
1236
+ rationaleMarkdown: true,
1237
+ createdAt: true,
1238
+ approvedAt: true,
1239
+ incidentId: true,
1240
+ alertId: true,
1241
+ };
1242
+
1243
+ async function getInsightFixes(data: {
1244
+ projectId: ObjectID;
1245
+ clusterId: ObjectID;
1246
+ suggestionIds: Array<ObjectID>;
1247
+ limit: number;
1248
+ }): Promise<Array<KubernetesClusterAiInsightFix>> {
1249
+ const readSuggestions: (
1250
+ query: Record<string, unknown>,
1251
+ ) => Promise<Array<AutoRemediationSuggestion>> = (
1252
+ query: Record<string, unknown>,
1253
+ ): Promise<Array<AutoRemediationSuggestion>> => {
1254
+ return AutoRemediationSuggestionService.findBy({
1255
+ query: { ...query, projectId: data.projectId } as never,
1256
+ select: INSIGHT_FIX_SELECT,
1257
+ sort: { createdAt: SortOrder.Descending },
1258
+ limit: data.limit,
1259
+ skip: 0,
1260
+ props: { isRoot: true },
1261
+ });
1262
+ };
1263
+
1264
+ const reads: Array<Promise<Array<AutoRemediationSuggestion>>> = [
1265
+ readSuggestions({ kubernetesClusterId: data.clusterId }),
1266
+ ];
1267
+
1268
+ if (data.suggestionIds.length > 0) {
1269
+ reads.push(readSuggestions({ _id: QueryHelper.any(data.suggestionIds) }));
1270
+ }
1271
+
1272
+ return mergeNewest(await Promise.all(reads), data.limit).map(
1273
+ (suggestion: AutoRemediationSuggestion): KubernetesClusterAiInsightFix => {
1274
+ return {
1275
+ id: suggestion.id!.toString(),
1276
+ status: suggestion.status,
1277
+ executionMode: suggestion.executionMode,
1278
+ suggestionType: suggestion.suggestionType,
1279
+ rationale: suggestion.rationaleMarkdown
1280
+ ? suggestion.rationaleMarkdown.slice(
1281
+ 0,
1282
+ KUBERNETES_CLUSTER_AI_INSIGHTS_RATIONALE_MAX_LENGTH,
1283
+ )
1284
+ : undefined,
1285
+ createdAt: toIsoString(suggestion.createdAt),
1286
+ approvedAt: toIsoString(suggestion.approvedAt),
1287
+ incidentId: suggestion.incidentId?.toString(),
1288
+ alertId: suggestion.alertId?.toString(),
1289
+ };
1290
+ },
1291
+ );
1292
+ }
1293
+
1294
+ router.post(
1295
+ "/kubernetes-cluster/ai-access/reset-agent",
1296
+ UserMiddleware.getUserMiddleware,
1297
+ async (
1298
+ req: ExpressRequest,
1299
+ res: ExpressResponse,
1300
+ next: NextFunction,
1301
+ ): Promise<void> => {
1302
+ try {
1303
+ const props: DatabaseCommonInteractionProps = await getLoggedInProps(req);
1304
+ const tenantId: ObjectID = CommonAPI.assertTenantScoped(props);
1305
+
1306
+ const cluster: KubernetesCluster = await findAccessibleCluster({
1307
+ req,
1308
+ props,
1309
+ tenantId,
1310
+ });
1311
+
1312
+ assertCanResetAiAgent(props, tenantId);
1313
+
1314
+ const agent: KubernetesAiAgent | null =
1315
+ await KubernetesAiAgentService.findForCluster({
1316
+ projectId: tenantId,
1317
+ kubernetesClusterId: cluster.id!,
1318
+ });
1319
+
1320
+ if (!agent) {
1321
+ throw new BadDataException(
1322
+ "This cluster has no Kubernetes AI agent to reset.",
1323
+ );
1324
+ }
1325
+
1326
+ await KubernetesAiAgentService.resetAgent({
1327
+ projectId: tenantId,
1328
+ kubernetesClusterId: cluster.id!,
1329
+ userId: props.userId,
1330
+ });
1331
+
1332
+ const status: KubernetesClusterAiAccessStatus | null =
1333
+ await KubernetesClusterAiAccessService.getStatusForCluster({
1334
+ clusterId: cluster.id!,
1335
+ projectId: tenantId,
1336
+ });
1337
+
1338
+ Response.sendJsonObjectResponse(req, res, {
1339
+ ok: true,
1340
+ message:
1341
+ "The Kubernetes AI agent was reset. It reconnects on its own within a few minutes.",
1342
+ ...(status
1343
+ ? {
1344
+ status: toViewerStatus({
1345
+ status,
1346
+ canReadCredentials: canReadCredentials(props, tenantId),
1347
+ }) as unknown as JSONObject,
1348
+ }
1349
+ : {}),
1350
+ });
1351
+ return;
1352
+ } catch (err) {
1353
+ next(err);
1354
+ return;
1355
+ }
1356
+ },
1357
+ );
1358
+
1359
+ router.post(
1360
+ "/kubernetes-cluster/ai-access/insights",
1361
+ UserMiddleware.getUserMiddleware,
1362
+ async (
1363
+ req: ExpressRequest,
1364
+ res: ExpressResponse,
1365
+ next: NextFunction,
1366
+ ): Promise<void> => {
1367
+ try {
1368
+ const props: DatabaseCommonInteractionProps = await getLoggedInProps(req);
1369
+ const tenantId: ObjectID = CommonAPI.assertTenantScoped(props);
1370
+
1371
+ const cluster: KubernetesCluster = await findAccessibleCluster({
1372
+ req,
1373
+ props,
1374
+ tenantId,
1375
+ });
1376
+
1377
+ const insights: KubernetesClusterAiInsights = await getClusterAiInsights({
1378
+ projectId: tenantId,
1379
+ clusterId: cluster.id!,
1380
+ });
1381
+
1382
+ Response.sendJsonObjectResponse(
1383
+ req,
1384
+ res,
1385
+ insights as unknown as JSONObject,
1386
+ );
1387
+ return;
1388
+ } catch (err) {
1389
+ next(err);
1390
+ return;
1391
+ }
1392
+ },
1393
+ );
1394
+
793
1395
  export default router;