@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
@@ -559,7 +559,14 @@ describe("the Runner pages, rendered", () => {
559
559
  );
560
560
  }
561
561
 
562
- async function clickRowAction(
562
+ /*
563
+ * A row's actions are one button and a ⋯ menu holding the rest
564
+ * (RowActions). On this table "View" is the button, so "Edit" is in the
565
+ * menu. The menu is portalled to document.body so the table's scroller
566
+ * cannot clip it, which is why it is found through `screen` and not
567
+ * inside the row - and why only one menu is ever open to find.
568
+ */
569
+ async function clickRowMenuAction(
563
570
  rowName: string,
564
571
  action: string,
565
572
  ): Promise<void> {
@@ -572,7 +579,16 @@ describe("the Runner pages, rendered", () => {
572
579
  if (!row) {
573
580
  throw new Error(`"${rowName}" is not in a table row.`);
574
581
  }
575
- fireEvent.click(within(row).getByText(action));
582
+ const trigger: HTMLElement | null = within(row).queryByTestId(
583
+ "row-actions-more-button",
584
+ );
585
+ if (!trigger) {
586
+ throw new Error(`"${rowName}" has no ⋯ menu on its row.`);
587
+ }
588
+ fireEvent.click(trigger);
589
+ fireEvent.click(
590
+ within(screen.getByRole("menu")).getByRole("menuitem", { name: action }),
591
+ );
576
592
  }
577
593
 
578
594
  async function openDialog(firstField: string): Promise<HTMLElement> {
@@ -598,7 +614,7 @@ describe("the Runner pages, rendered", () => {
598
614
  test("the list page's edit form on an agent row leaves out the name; create and the next edit do not", async () => {
599
615
  openRunnersPage();
600
616
 
601
- await clickRowAction("kubernetes-agent/prod-east", "Edit");
617
+ await clickRowMenuAction("kubernetes-agent/prod-east", "Edit");
602
618
  const editDialog: HTMLElement = await openDialog("Description");
603
619
  expect(hasFieldTitled(editDialog, "Name")).toBe(false);
604
620
  expect(editDialog).toHaveTextContent(AGENT_NOTE_START);
@@ -614,7 +630,7 @@ describe("the Runner pages, rendered", () => {
614
630
  await closeDialog(createDialog);
615
631
 
616
632
  // The next edit follows its own row: an ordinary Runner keeps its name.
617
- await clickRowAction("bash-runner", "Edit");
633
+ await clickRowMenuAction("bash-runner", "Edit");
618
634
  const hostDialog: HTMLElement = await openDialog("Description");
619
635
  expect(hasFieldTitled(hostDialog, "Name")).toBe(true);
620
636
  expect(hostDialog).not.toHaveTextContent(AGENT_NOTE_START);
@@ -0,0 +1,296 @@
1
+ import "@testing-library/jest-dom";
2
+ import {
3
+ afterEach,
4
+ beforeEach,
5
+ describe,
6
+ expect,
7
+ jest,
8
+ test,
9
+ } from "@jest/globals";
10
+ import { cleanup, render, screen } from "@testing-library/react";
11
+ import React from "react";
12
+ import { MemoryRouter } from "react-router-dom";
13
+ import RunnerView from "../../../../App/FeatureSet/Dashboard/src/Pages/Settings/RunnerView";
14
+ import {
15
+ KUBERNETES_AGENT_RUNNER_SUPERSEDED_NOTE,
16
+ NO_RUNNER_FORM_RESTRICTIONS,
17
+ RunnerFormRestrictions,
18
+ getKubernetesAgentRunnerFormNote,
19
+ getRunnerFormFields,
20
+ getRunnerFormRestrictions,
21
+ getRunnerTableFormFields,
22
+ } from "../../../../App/FeatureSet/Dashboard/src/Pages/Settings/RunnerFormFields";
23
+ import PageMap from "../../../../App/FeatureSet/Dashboard/src/Utils/PageMap";
24
+ import RouteMap from "../../../../App/FeatureSet/Dashboard/src/Utils/RouteMap";
25
+ import Runner from "../../../Models/DatabaseModels/Runner";
26
+ import Route from "../../../Types/API/Route";
27
+ import ListResult from "../../../Types/BaseDatabase/ListResult";
28
+ import { JSONObject } from "../../../Types/JSON";
29
+ import ObjectID from "../../../Types/ObjectID";
30
+ import Permission from "../../../Types/Permission";
31
+ import Field from "../../../UI/Components/Forms/Types/Field";
32
+ import Fields from "../../../UI/Components/Forms/Types/Fields";
33
+ import ModelAPI from "../../../UI/Utils/ModelAPI/ModelAPI";
34
+ import PermissionUtil from "../../../UI/Utils/Permission";
35
+ import User from "../../../UI/Utils/User";
36
+ import { goTo, PROJECT_ID } from "./SideMenuHarness";
37
+
38
+ jest.mock("react-i18next", () => {
39
+ return {
40
+ useTranslation: () => {
41
+ return {
42
+ t: (value: string): string => {
43
+ return value;
44
+ },
45
+ };
46
+ },
47
+ };
48
+ });
49
+
50
+ /*
51
+ * The Kubernetes AI agent — its own identity, never a Runner row — replaced
52
+ * the in-cluster Runner the Kubernetes agent chart used to install, and the
53
+ * server refuses that legacy Runner's registration while the agent is
54
+ * online. The legacy rows keep their existing guards; their note now also
55
+ * says they are superseded, what to do (upgrade the chart), and when the row
56
+ * can go (once the AI agent is connected). Ordinary Runners say nothing of
57
+ * the sort.
58
+ */
59
+
60
+ const WAIT_TIMEOUT: number = 20000;
61
+
62
+ const AGENT_RUNNER_ID: string = "66666666-0000-4000-8000-0000000000a1";
63
+ const HOST_RUNNER_ID: string = "66666666-0000-4000-8000-0000000000a2";
64
+ const RENAMED_AGENT_RUNNER_ID: string = "66666666-0000-4000-8000-0000000000a3";
65
+
66
+ const AGENT_POSTURE: JSONObject = {
67
+ kubernetes: {
68
+ inCluster: true,
69
+ allowWrites: false,
70
+ clusterIdentifier: "prod-east",
71
+ },
72
+ };
73
+
74
+ const PERMISSIONS: Array<Permission> = [
75
+ Permission.Public,
76
+ Permission.User,
77
+ Permission.CurrentUser,
78
+ Permission.ProjectAdmin,
79
+ ];
80
+
81
+ function makeRunnerRow(
82
+ id: string,
83
+ name: string,
84
+ hostInfo?: JSONObject,
85
+ ): Runner {
86
+ return Object.assign(new Runner(), {
87
+ _id: id,
88
+ name,
89
+ description: "",
90
+ key: "runner-key",
91
+ canRunRunbooks: false,
92
+ canRunCodeFixTasks: false,
93
+ canRunAiCommands: true,
94
+ lastAlive: new Date("2026-09-23T10:00:00Z"),
95
+ ...(hostInfo ? { hostInfo } : {}),
96
+ });
97
+ }
98
+
99
+ const ROWS: Array<Runner> = [
100
+ makeRunnerRow(AGENT_RUNNER_ID, "kubernetes-agent/prod-east", AGENT_POSTURE),
101
+ makeRunnerRow(HOST_RUNNER_ID, "bash-runner"),
102
+ makeRunnerRow(RENAMED_AGENT_RUNNER_ID, "prod-east-kubectl", AGENT_POSTURE),
103
+ ];
104
+
105
+ function rowById(id: string): Runner {
106
+ return ROWS.find((row: Runner): boolean => {
107
+ return String(row._id) === id;
108
+ })!;
109
+ }
110
+
111
+ describe("the superseded sentence", () => {
112
+ test("names the replacement, the step and when the row can go", () => {
113
+ expect(KUBERNETES_AGENT_RUNNER_SUPERSEDED_NOTE).toContain(
114
+ "superseded by the Kubernetes AI agent",
115
+ );
116
+ expect(KUBERNETES_AGENT_RUNNER_SUPERSEDED_NOTE).toContain(
117
+ "upgrade the Kubernetes agent chart",
118
+ );
119
+ expect(KUBERNETES_AGENT_RUNNER_SUPERSEDED_NOTE).toContain(
120
+ "this Runner can be deleted once the AI agent is connected",
121
+ );
122
+ });
123
+
124
+ test.each<[string, RunnerFormRestrictions]>([
125
+ [
126
+ "name and switches locked",
127
+ { isNameLocked: true, areShellCapabilitiesLocked: true },
128
+ ],
129
+ [
130
+ "switches locked (an agent by posture alone)",
131
+ { isNameLocked: false, areShellCapabilitiesLocked: true },
132
+ ],
133
+ [
134
+ "name locked only",
135
+ { isNameLocked: true, areShellCapabilitiesLocked: false },
136
+ ],
137
+ ])(
138
+ "ends every kubernetes-agent row's note: %s",
139
+ (_label: string, restrictions: RunnerFormRestrictions) => {
140
+ const note: string | null =
141
+ getKubernetesAgentRunnerFormNote(restrictions);
142
+
143
+ expect(note).not.toBeNull();
144
+ // The existing explanation is kept, first.
145
+ expect(note).toMatch(
146
+ /^This is the in-cluster Runner the Kubernetes agent chart installed\./,
147
+ );
148
+ expect(note).toContain("OneUptime refuses those changes");
149
+ expect(note!.endsWith(KUBERNETES_AGENT_RUNNER_SUPERSEDED_NOTE)).toBe(
150
+ true,
151
+ );
152
+ },
153
+ );
154
+
155
+ test("is not said about an ordinary Runner", () => {
156
+ expect(
157
+ getKubernetesAgentRunnerFormNote(NO_RUNNER_FORM_RESTRICTIONS),
158
+ ).toBeNull();
159
+ expect(
160
+ getKubernetesAgentRunnerFormNote(
161
+ getRunnerFormRestrictions(rowById(HOST_RUNNER_ID)),
162
+ ),
163
+ ).toBeNull();
164
+ });
165
+
166
+ test("reaches the edit forms of both Runner pages on a legacy row", () => {
167
+ for (const row of [
168
+ rowById(AGENT_RUNNER_ID),
169
+ rowById(RENAMED_AGENT_RUNNER_ID),
170
+ ]) {
171
+ const restrictions: RunnerFormRestrictions =
172
+ getRunnerFormRestrictions(row);
173
+
174
+ const detailForm: Fields<Runner> = getRunnerFormFields({
175
+ withSteps: false,
176
+ restrictions,
177
+ });
178
+ const listEditForm: Fields<Runner> = getRunnerTableFormFields(
179
+ restrictions,
180
+ ).filter((field: Field<Runner>): boolean => {
181
+ return !field.doNotShowWhenEditing;
182
+ });
183
+
184
+ for (const fields of [detailForm, listEditForm]) {
185
+ const described: Array<string> = fields
186
+ .map((field: Field<Runner>): string => {
187
+ return String(field.sectionDescription || "");
188
+ })
189
+ .filter((description: string): boolean => {
190
+ return description.length > 0;
191
+ });
192
+ expect(described.length).toBe(1);
193
+ expect(described[0]).toContain(KUBERNETES_AGENT_RUNNER_SUPERSEDED_NOTE);
194
+ }
195
+ }
196
+ });
197
+
198
+ test("never reaches the create form", () => {
199
+ const createForm: Fields<Runner> = getRunnerTableFormFields(
200
+ getRunnerFormRestrictions(rowById(AGENT_RUNNER_ID)),
201
+ ).filter((field: Field<Runner>): boolean => {
202
+ return !field.doNotShowWhenCreating;
203
+ });
204
+
205
+ for (const field of createForm) {
206
+ expect(String(field.sectionDescription || "")).not.toContain(
207
+ "superseded",
208
+ );
209
+ }
210
+ });
211
+ });
212
+
213
+ describe("the Runner detail page", () => {
214
+ beforeEach(() => {
215
+ window.localStorage.clear();
216
+ window.sessionStorage.clear();
217
+ jest.spyOn(User, "isMasterAdmin").mockReturnValue(false);
218
+ jest
219
+ .spyOn(PermissionUtil, "getAllPermissions")
220
+ .mockReturnValue(PERMISSIONS);
221
+ jest.spyOn(PermissionUtil, "getGlobalPermissions").mockReturnValue(null);
222
+ jest.spyOn(PermissionUtil, "getProjectPermissions").mockReturnValue({
223
+ projectId: new ObjectID(PROJECT_ID),
224
+ userId: ObjectID.generate(),
225
+ permissions: PERMISSIONS.map((permission: Permission) => {
226
+ return {
227
+ permission: permission,
228
+ labelIds: [],
229
+ _type: "UserPermission",
230
+ };
231
+ }),
232
+ _type: "UserTenantAccessPermission",
233
+ } as unknown as ReturnType<typeof PermissionUtil.getProjectPermissions>);
234
+
235
+ jest
236
+ .spyOn(ModelAPI, "getItem")
237
+ .mockImplementation(async (args: unknown): Promise<Runner | null> => {
238
+ return rowById(String((args as { id?: unknown }).id)) || null;
239
+ });
240
+ jest
241
+ .spyOn(ModelAPI, "getList")
242
+ .mockImplementation(async (): Promise<ListResult<Runner>> => {
243
+ return { data: [], count: 0, skip: 0, limit: 10 };
244
+ });
245
+ jest
246
+ .spyOn(ModelAPI, "count")
247
+ .mockImplementation(async (): Promise<number> => {
248
+ return 0;
249
+ });
250
+ });
251
+
252
+ afterEach(() => {
253
+ cleanup();
254
+ jest.restoreAllMocks();
255
+ });
256
+
257
+ function openRunnerView(runnerId: string): void {
258
+ const path: string = `/dashboard/${PROJECT_ID}/settings/runners/${runnerId}`;
259
+ goTo(path);
260
+ render(
261
+ <MemoryRouter initialEntries={[path]}>
262
+ <RunnerView
263
+ pageRoute={RouteMap[PageMap.SETTINGS_RUNNER_VIEW] as Route}
264
+ currentProject={null}
265
+ hasPaymentMethod={true}
266
+ />
267
+ </MemoryRouter>,
268
+ );
269
+ }
270
+
271
+ test("says a legacy kubernetes-agent Runner is superseded", async () => {
272
+ openRunnerView(AGENT_RUNNER_ID);
273
+
274
+ const note: HTMLElement = await screen.findByTestId(
275
+ "kubernetes-agent-runner-note",
276
+ {},
277
+ { timeout: WAIT_TIMEOUT },
278
+ );
279
+ expect(note).toHaveTextContent(
280
+ "This is the in-cluster Runner the Kubernetes agent chart installed.",
281
+ );
282
+ expect(note).toHaveTextContent(KUBERNETES_AGENT_RUNNER_SUPERSEDED_NOTE);
283
+ });
284
+
285
+ test("says nothing of the sort on an ordinary Runner", async () => {
286
+ openRunnerView(HOST_RUNNER_ID);
287
+
288
+ expect(
289
+ await screen.findByText("bash-runner", {}, { timeout: WAIT_TIMEOUT }),
290
+ ).toBeInTheDocument();
291
+ expect(
292
+ screen.queryByTestId("kubernetes-agent-runner-note"),
293
+ ).not.toBeInTheDocument();
294
+ expect(screen.queryByText(/superseded/)).not.toBeInTheDocument();
295
+ });
296
+ });
@@ -156,6 +156,15 @@ const RESELLER_MESSAGE: string =
156
156
  const EMPTY_STATE_ID: string = "security-event-connections-empty-state";
157
157
  const NO_CREATE_REASON: string =
158
158
  "You do not have permission to create connections.";
159
+ const NO_UPDATE_REASON: string =
160
+ "You do not have permission to update connections.";
161
+ // The row actions a member without update permission finds locked.
162
+ const WRITE_ACTIONS: Array<string> = [
163
+ "Test connection",
164
+ "Run now",
165
+ "Edit",
166
+ "Update credentials",
167
+ ];
159
168
 
160
169
  /*
161
170
  * The empty state's provider tiles in catalog order, written out so a
@@ -364,6 +373,46 @@ function row(name: string = "Acme Okta"): HTMLElement {
364
373
  return screen.getByTestId(name);
365
374
  }
366
375
 
376
+ /*
377
+ * A row shows one action as its button and folds every other action into a
378
+ * ⋯ menu beside it. The button is View Error when the row has an error to
379
+ * read and Test connection when it does not, so Run now, Diagnostics, Edit
380
+ * and Update credentials are reached the way a person reaches them: open
381
+ * that row's menu, then pick the item. The menu is portalled to the body,
382
+ * so it is found on the screen rather than inside the row.
383
+ */
384
+ function openRowMenu(current: HTMLElement): HTMLElement {
385
+ fireEvent.click(within(current).getByTestId("row-actions-more-button"));
386
+ return screen.getByRole("menu");
387
+ }
388
+
389
+ function clickRowMenuItem(current: HTMLElement, title: string): void {
390
+ fireEvent.click(
391
+ within(openRowMenu(current)).getByRole("menuitem", { name: title }),
392
+ );
393
+ }
394
+
395
+ function menuItemTitles(menu: HTMLElement): Array<string> {
396
+ return within(menu)
397
+ .getAllByRole("menuitem")
398
+ .map((item: HTMLElement): string => {
399
+ return item.textContent || "";
400
+ });
401
+ }
402
+
403
+ /*
404
+ * A locked menu item is aria-disabled rather than natively disabled, so it
405
+ * stays reachable from the keyboard, and the reason it is locked is its own
406
+ * accessible description whether or not the tooltip is showing. Every locked
407
+ * item gives the same reason, and jsdom never finishes a tooltip's exit
408
+ * transition, so the reason is read from the item rather than from whichever
409
+ * tooltip happens to be on the page.
410
+ */
411
+ function expectLockedMenuItem(item: HTMLElement, reason: string): void {
412
+ expect(item).toHaveAttribute("aria-disabled", "true");
413
+ expect(item).toHaveAccessibleDescription(reason);
414
+ }
415
+
367
416
  function postCall(index: number = 0): JSONObject {
368
417
  return jest.mocked(API.post).mock.calls[index]?.[0] as unknown as JSONObject;
369
418
  }
@@ -1043,39 +1092,99 @@ describe("SecurityEventConnectionsTable", () => {
1043
1092
  expect(row("Acme Okta")).not.toHaveTextContent("Alerts and detections");
1044
1093
  });
1045
1094
 
1095
+ /*
1096
+ * A row used to be a strip of six outlined buttons. It is now one button
1097
+ * and a ⋯ menu: the error when there is one to read, otherwise Test
1098
+ * connection, with every other action in the menu in the order the table
1099
+ * lists them. Nothing here is destructive, so the menu has no red tail.
1100
+ */
1101
+ test.each([
1102
+ { layout: "desktop", isMobile: false },
1103
+ { layout: "mobile", isMobile: true },
1104
+ ])(
1105
+ "$layout rows show one action as a button and the rest in a ⋯ menu",
1106
+ ({ isMobile }: { isMobile: boolean }): void => {
1107
+ mockIsMobile = isMobile;
1108
+ renderTable([
1109
+ connection(),
1110
+ connection({
1111
+ _id: "44444444-4444-4444-8444-444444444444",
1112
+ name: "Failing Okta",
1113
+ lastError: "Okta System Log request failed (HTTP 401)",
1114
+ }),
1115
+ ]);
1116
+
1117
+ const healthy: HTMLElement = within(row()).getByTestId("row-actions");
1118
+ expect(within(healthy).getAllByRole("button")).toEqual([
1119
+ within(healthy).getByRole("button", { name: "Test connection" }),
1120
+ within(healthy).getByRole("button", { name: "More actions" }),
1121
+ ]);
1122
+ const healthyMenu: HTMLElement = openRowMenu(row());
1123
+ expect(menuItemTitles(healthyMenu)).toEqual([
1124
+ "Run now",
1125
+ "Diagnostics",
1126
+ "Edit",
1127
+ "Update credentials",
1128
+ ]);
1129
+ fireEvent.keyDown(
1130
+ within(healthyMenu).getByRole("menuitem", { name: "Run now" }),
1131
+ { key: "Escape" },
1132
+ );
1133
+ expect(screen.queryByRole("menu")).not.toBeInTheDocument();
1134
+
1135
+ const failing: HTMLElement = within(row("Failing Okta")).getByTestId(
1136
+ "row-actions",
1137
+ );
1138
+ expect(within(failing).getAllByRole("button")).toEqual([
1139
+ within(failing).getByRole("button", { name: "View Error" }),
1140
+ within(failing).getByRole("button", { name: "More actions" }),
1141
+ ]);
1142
+ expect(menuItemTitles(openRowMenu(row("Failing Okta")))).toEqual([
1143
+ "Test connection",
1144
+ "Run now",
1145
+ "Diagnostics",
1146
+ "Edit",
1147
+ "Update credentials",
1148
+ ]);
1149
+ // Opening a menu is not running anything in it.
1150
+ expect(screen.queryByRole("dialog")).not.toBeInTheDocument();
1151
+ expect(API.post).not.toHaveBeenCalled();
1152
+ },
1153
+ );
1154
+
1046
1155
  test("read-only members keep View Error and Diagnostics while every write action is locked", (): void => {
1047
1156
  jest.spyOn(PermissionGate, "check").mockReturnValue({
1048
1157
  isAllowed: false,
1049
- disabledReason: "You do not have permission to update connections.",
1158
+ disabledReason: NO_UPDATE_REASON,
1050
1159
  });
1051
1160
  renderTable([
1052
1161
  connection({ lastError: "Okta System Log request failed (HTTP 401)" }),
1053
1162
  ]);
1054
1163
 
1164
+ // The error is the row's one button, and reading it needs no permission.
1055
1165
  const current: HTMLElement = row();
1056
- for (const title of [
1057
- "Test connection",
1058
- "Run now",
1059
- "Edit",
1060
- "Update credentials",
1061
- ]) {
1062
- expect(
1063
- within(current).getByRole("button", { name: title }),
1064
- ).toBeDisabled();
1065
- }
1066
1166
  expect(
1067
- within(current).getByRole("button", { name: "Diagnostics" }),
1167
+ within(current).getByRole("button", { name: "View Error" }),
1068
1168
  ).toBeEnabled();
1169
+
1170
+ const menu: HTMLElement = openRowMenu(current);
1171
+ for (const title of WRITE_ACTIONS) {
1172
+ const item: HTMLElement = within(menu).getByRole("menuitem", {
1173
+ name: title,
1174
+ });
1175
+ expectLockedMenuItem(item, NO_UPDATE_REASON);
1176
+ // Locked is inert: picking it opens nothing and sends nothing.
1177
+ fireEvent.click(item);
1178
+ }
1179
+ expect(screen.queryByRole("dialog")).not.toBeInTheDocument();
1069
1180
  expect(
1070
- within(current).getByRole("button", { name: "View Error" }),
1181
+ within(menu).getByRole("menuitem", { name: "Diagnostics" }),
1071
1182
  ).toBeEnabled();
1072
1183
 
1073
1184
  const button: CardButtonSchema = tableProps().cardProps
1074
1185
  ?.buttons?.[0] as CardButtonSchema;
1075
1186
  expect(button.disabled).toBe(true);
1076
- expect(button.tooltip).toBe(
1077
- "You do not have permission to update connections.",
1078
- );
1187
+ expect(button.tooltip).toBe(NO_UPDATE_REASON);
1079
1188
  expect(API.post).not.toHaveBeenCalled();
1080
1189
  });
1081
1190
 
@@ -1175,7 +1284,7 @@ describe("SecurityEventConnectionsTable", () => {
1175
1284
  );
1176
1285
  renderTable([connection()]);
1177
1286
 
1178
- fireEvent.click(within(row()).getByRole("button", { name: "Run now" }));
1287
+ clickRowMenuItem(row(), "Run now");
1179
1288
 
1180
1289
  expect(
1181
1290
  await screen.findByRole("dialog", {
@@ -1198,7 +1307,7 @@ describe("SecurityEventConnectionsTable", () => {
1198
1307
  test("Diagnostics shows the same health wording and UTC times with a local-time title", async (): Promise<void> => {
1199
1308
  renderTable([connection()]);
1200
1309
 
1201
- fireEvent.click(within(row()).getByRole("button", { name: "Diagnostics" }));
1310
+ clickRowMenuItem(row(), "Diagnostics");
1202
1311
 
1203
1312
  const dialog: HTMLElement = await screen.findByRole("dialog", {
1204
1313
  name: "Connection diagnostics: Acme Okta",
@@ -1219,11 +1328,7 @@ describe("SecurityEventConnectionsTable", () => {
1219
1328
  .mockResolvedValue(googleConnection({ alertingOnly: false }));
1220
1329
  renderTable([googleConnection({ alertingOnly: false })]);
1221
1330
 
1222
- fireEvent.click(
1223
- within(row("Customer SecOps")).getByRole("button", {
1224
- name: "Diagnostics",
1225
- }),
1226
- );
1331
+ clickRowMenuItem(row("Customer SecOps"), "Diagnostics");
1227
1332
  const dialog: HTMLElement = await screen.findByRole("dialog", {
1228
1333
  name: "Connection diagnostics: Customer SecOps",
1229
1334
  });
@@ -1247,7 +1352,7 @@ describe("SecurityEventConnectionsTable", () => {
1247
1352
  test("Diagnostics Test connection clears the previous checklist when a re-run fails", async (): Promise<void> => {
1248
1353
  renderTable([connection()]);
1249
1354
 
1250
- fireEvent.click(within(row()).getByRole("button", { name: "Diagnostics" }));
1355
+ clickRowMenuItem(row(), "Diagnostics");
1251
1356
  const dialog: HTMLElement = await screen.findByRole("dialog", {
1252
1357
  name: "Connection diagnostics: Acme Okta",
1253
1358
  });
@@ -1289,7 +1394,7 @@ describe("SecurityEventConnectionsTable", () => {
1289
1394
  test("Edit and Update credentials open the form modal in the matching mode", async (): Promise<void> => {
1290
1395
  renderTable([connection()]);
1291
1396
 
1292
- fireEvent.click(within(row()).getByRole("button", { name: "Edit" }));
1397
+ clickRowMenuItem(row(), "Edit");
1293
1398
  const edit: HTMLElement = await screen.findByRole("dialog", {
1294
1399
  name: "Edit connection: Acme Okta",
1295
1400
  });
@@ -1301,9 +1406,9 @@ describe("SecurityEventConnectionsTable", () => {
1301
1406
  expect(screen.queryByRole("dialog")).not.toBeInTheDocument();
1302
1407
  });
1303
1408
 
1304
- fireEvent.click(
1305
- within(row()).getByRole("button", { name: "Update credentials" }),
1306
- );
1409
+ // The menu closed behind the first pick; the second opens it again.
1410
+ expect(screen.queryByRole("menu")).not.toBeInTheDocument();
1411
+ clickRowMenuItem(row(), "Update credentials");
1307
1412
  const credentials: HTMLElement = await screen.findByRole("dialog", {
1308
1413
  name: "Update credentials: Acme Okta",
1309
1414
  });
@@ -1679,20 +1784,25 @@ describe("Last Error actions", () => {
1679
1784
  test("allows read-only members to view and copy errors while update actions remain disabled", async (): Promise<void> => {
1680
1785
  jest.spyOn(PermissionGate, "check").mockReturnValue({
1681
1786
  isAllowed: false,
1682
- disabledReason: "You do not have permission to update connections.",
1787
+ disabledReason: NO_UPDATE_REASON,
1683
1788
  });
1684
1789
  const error: string =
1685
1790
  "Google SecOps alerts fetch failed (HTTP 403): permission denied";
1686
1791
  renderTable([errorConnection("Production", error)]);
1687
1792
 
1688
- for (const title of [
1689
- "Test connection",
1690
- "Run now",
1691
- "Edit",
1692
- "Update credentials",
1693
- ]) {
1694
- expect(screen.getByRole("button", { name: title })).toBeDisabled();
1793
+ const menu: HTMLElement = openRowMenu(screen.getByTestId("Production"));
1794
+ for (const title of WRITE_ACTIONS) {
1795
+ expectLockedMenuItem(
1796
+ within(menu).getByRole("menuitem", { name: title }),
1797
+ NO_UPDATE_REASON,
1798
+ );
1695
1799
  }
1800
+ // Diagnostics is the one item left to focus; Escape leaves from there.
1801
+ fireEvent.keyDown(
1802
+ within(menu).getByRole("menuitem", { name: "Diagnostics" }),
1803
+ { key: "Escape" },
1804
+ );
1805
+ expect(screen.queryByRole("menu")).not.toBeInTheDocument();
1696
1806
  expect(screen.getByRole("button", { name: "View Error" })).toBeEnabled();
1697
1807
 
1698
1808
  const dialog: HTMLElement = openError();