@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
@@ -0,0 +1,501 @@
1
+ import "@testing-library/jest-dom";
2
+ import {
3
+ cleanup,
4
+ fireEvent,
5
+ render,
6
+ RenderResult,
7
+ screen,
8
+ within,
9
+ } from "@testing-library/react";
10
+ import * as React from "react";
11
+ import { MemoryRouter } from "react-router-dom";
12
+ import { afterEach, describe, expect, jest, test } from "@jest/globals";
13
+ import { Mock } from "jest-mock";
14
+ import ObjectID from "../../../Types/ObjectID";
15
+ import {
16
+ UserFlowLoop,
17
+ UserFlowPageStats,
18
+ UserFlowPath,
19
+ } from "../../../Utils/Rum/UserFlow";
20
+ import UserFlowTables, {
21
+ ComponentProps as UserFlowTablesProps,
22
+ } from "../../../../App/FeatureSet/Dashboard/src/Components/UserFlow/UserFlowTables";
23
+
24
+ /*
25
+ * The Pages tab of the User Flows tables used to end every row with two text
26
+ * buttons, "Paths before" and "Paths after". It now ends like every other
27
+ * table row: one button - "Paths after", because forward is what a click on a
28
+ * page means everywhere else on the screen - and a ⋯ menu holding "Paths
29
+ * before".
30
+ *
31
+ * These tests drive it the way a person does - look at a row, press its
32
+ * button, open its ⋯, pick the item - and check that each row still re-anchors
33
+ * the map on its OWN page, in the right direction, whatever order the table
34
+ * is sorted in. The Top paths and Back and forth tabs have a single control
35
+ * per row and are meant to stay that way, with no ⋯ of their own.
36
+ */
37
+
38
+ jest.mock("react-i18next", () => {
39
+ return {
40
+ useTranslation: () => {
41
+ return {
42
+ t: (key: string, options?: { defaultValue?: string }): string => {
43
+ return options?.defaultValue ?? key;
44
+ },
45
+ };
46
+ },
47
+ };
48
+ });
49
+
50
+ jest.setTimeout(60000);
51
+
52
+ type OnAnchor = UserFlowTablesProps["onAnchor"];
53
+
54
+ const APP_ID: ObjectID = new ObjectID("0193c0de-1111-4aaa-8bbb-000000000002");
55
+
56
+ type MakePageFunction = (
57
+ page: string,
58
+ sessions: number,
59
+ exitRate: number,
60
+ ) => UserFlowPageStats;
61
+
62
+ const makePage: MakePageFunction = (
63
+ page: string,
64
+ sessions: number,
65
+ exitRate: number,
66
+ ): UserFlowPageStats => {
67
+ return {
68
+ page: page,
69
+ sessions: sessions,
70
+ views: sessions,
71
+ entries: 0,
72
+ exits: Math.round(sessions * exitRate),
73
+ bounces: 0,
74
+ exitRate: exitRate,
75
+ errorSessions: 0,
76
+ frustrationSessions: 0,
77
+ next: [],
78
+ previous: [],
79
+ sampleSessionIds: [],
80
+ };
81
+ };
82
+
83
+ /*
84
+ * Handed over out of order on purpose. By Sessions (the default sort) the
85
+ * table reads /home, /cart, /checkout; by Exit rate it reads the other way
86
+ * round - so a re-sort moves every page to a different row.
87
+ */
88
+ const PAGES: Array<UserFlowPageStats> = [
89
+ makePage("/checkout", 3, 1),
90
+ makePage("/home", 10, 0.2),
91
+ makePage("/cart", 6, 0.5),
92
+ ];
93
+
94
+ const PATHS: Array<UserFlowPath> = [
95
+ {
96
+ pages: ["/home", "/cart", "/checkout"],
97
+ isTruncated: false,
98
+ sessions: 3,
99
+ share: 0.3,
100
+ avgDurationMs: 60_000,
101
+ errorSessions: 0,
102
+ frustrationSessions: 0,
103
+ sampleSessionIds: ["s1"],
104
+ },
105
+ {
106
+ pages: ["/home"],
107
+ isTruncated: false,
108
+ sessions: 2,
109
+ share: 0.2,
110
+ avgDurationMs: 10_000,
111
+ errorSessions: 0,
112
+ frustrationSessions: 0,
113
+ sampleSessionIds: ["s2"],
114
+ },
115
+ ];
116
+
117
+ const LOOPS: Array<UserFlowLoop> = [
118
+ {
119
+ pageA: "/home",
120
+ pageB: "/cart",
121
+ sessions: 1,
122
+ share: 0.1,
123
+ sampleSessionIds: ["s3"],
124
+ },
125
+ ];
126
+
127
+ type TablesElementFunction = (
128
+ onAnchor: OnAnchor,
129
+ pages?: Array<UserFlowPageStats>,
130
+ ) => React.ReactElement;
131
+
132
+ const tablesElement: TablesElementFunction = (
133
+ onAnchor: OnAnchor,
134
+ pages?: Array<UserFlowPageStats>,
135
+ ): React.ReactElement => {
136
+ return (
137
+ <MemoryRouter>
138
+ <UserFlowTables
139
+ paths={PATHS}
140
+ pages={pages || PAGES}
141
+ loops={LOOPS}
142
+ rumApplicationId={APP_ID}
143
+ onAnchor={onAnchor}
144
+ />
145
+ </MemoryRouter>
146
+ );
147
+ };
148
+
149
+ type RenderTablesFunction = (
150
+ onAnchor: OnAnchor,
151
+ pages?: Array<UserFlowPageStats>,
152
+ ) => RenderResult;
153
+
154
+ const renderTables: RenderTablesFunction = (
155
+ onAnchor: OnAnchor,
156
+ pages?: Array<UserFlowPageStats>,
157
+ ): RenderResult => {
158
+ return render(tablesElement(onAnchor, pages));
159
+ };
160
+
161
+ type OpenTabFunction = (id: "paths" | "pages" | "loops") => void;
162
+
163
+ const openTab: OpenTabFunction = (id: "paths" | "pages" | "loops"): void => {
164
+ fireEvent.click(screen.getByTestId(`user-flow-tab-${id}`));
165
+ };
166
+
167
+ const pageRows: () => Array<HTMLElement> = (): Array<HTMLElement> => {
168
+ return screen.getAllByTestId("user-flow-page-row");
169
+ };
170
+
171
+ const pageOrder: () => Array<string> = (): Array<string> => {
172
+ return pageRows().map((row: HTMLElement): string => {
173
+ return row.getAttribute("data-page") || "";
174
+ });
175
+ };
176
+
177
+ const pageRow: (page: string) => HTMLElement = (page: string): HTMLElement => {
178
+ const row: HTMLElement | undefined = pageRows().find(
179
+ (candidate: HTMLElement): boolean => {
180
+ return candidate.getAttribute("data-page") === page;
181
+ },
182
+ );
183
+
184
+ if (!row) {
185
+ throw new Error(`No Pages row for ${page}.`);
186
+ }
187
+
188
+ return row;
189
+ };
190
+
191
+ const pathsAfterButton: (row: HTMLElement) => HTMLElement = (
192
+ row: HTMLElement,
193
+ ): HTMLElement => {
194
+ return within(row).getByRole("button", { name: "Paths after" });
195
+ };
196
+
197
+ const moreButton: (row: HTMLElement) => HTMLElement = (
198
+ row: HTMLElement,
199
+ ): HTMLElement => {
200
+ return within(row).getByTestId("row-actions-more-button");
201
+ };
202
+
203
+ const openMenuOf: (row: HTMLElement) => HTMLElement = (
204
+ row: HTMLElement,
205
+ ): HTMLElement => {
206
+ fireEvent.click(moreButton(row));
207
+
208
+ return screen.getByRole("menu");
209
+ };
210
+
211
+ const menuItemLabels: (menu: HTMLElement) => Array<string> = (
212
+ menu: HTMLElement,
213
+ ): Array<string> => {
214
+ return within(menu)
215
+ .getAllByRole("menuitem")
216
+ .map((item: HTMLElement): string => {
217
+ return (item.textContent || "").trim();
218
+ });
219
+ };
220
+
221
+ const choosePathsBefore: (row: HTMLElement) => void = (
222
+ row: HTMLElement,
223
+ ): void => {
224
+ fireEvent.click(
225
+ within(openMenuOf(row)).getByRole("menuitem", { name: "Paths before" }),
226
+ );
227
+ };
228
+
229
+ afterEach(() => {
230
+ cleanup();
231
+ });
232
+
233
+ describe("User Flows Pages rows: one button and a ⋯ menu", () => {
234
+ test("every row shows Paths after as its one button, with the ⋯ beside it and Paths before out of sight", () => {
235
+ renderTables(jest.fn<OnAnchor>());
236
+ openTab("pages");
237
+
238
+ expect(pageOrder()).toEqual(["/home", "/cart", "/checkout"]);
239
+
240
+ for (const row of pageRows()) {
241
+ const cells: Array<HTMLTableCellElement> = Array.from(
242
+ row.querySelectorAll("td"),
243
+ );
244
+ const actions: HTMLElement = within(row).getByTestId("row-actions");
245
+ const buttons: Array<HTMLElement> =
246
+ within(actions).getAllByRole("button");
247
+
248
+ // Still the last column, under its blank header.
249
+ expect(cells[cells.length - 1]).toContainElement(actions);
250
+ expect(cells).toHaveLength(
251
+ screen.getByTestId("user-flow-pages-table").querySelectorAll("thead th")
252
+ .length,
253
+ );
254
+
255
+ // The row's button first, then the ⋯ - and nothing else.
256
+ expect(buttons).toHaveLength(2);
257
+ expect(buttons[0]).toBe(pathsAfterButton(row));
258
+ expect(buttons[0]).toHaveTextContent(/^Paths after$/);
259
+ expect(buttons[0]).toBeEnabled();
260
+ expect(buttons[1]).toBe(moreButton(row));
261
+ expect(buttons[1]).toHaveAttribute("aria-label", "More actions");
262
+ expect(buttons[1]).toHaveAttribute("aria-haspopup", "menu");
263
+ expect(buttons[1]).toHaveAttribute("aria-expanded", "false");
264
+
265
+ // Besides those two, the row keeps only its page chip.
266
+ expect(within(row).getAllByRole("button")).toHaveLength(3);
267
+ expect(within(row).queryByText("Paths before")).toBeNull();
268
+ }
269
+
270
+ expect(screen.queryByRole("menu")).toBeNull();
271
+ });
272
+
273
+ test("a row's ⋯ menu holds Paths before and nothing else, drawn outside the table", () => {
274
+ renderTables(jest.fn<OnAnchor>());
275
+ openTab("pages");
276
+
277
+ const menu: HTMLElement = openMenuOf(pageRow("/cart"));
278
+
279
+ expect(menuItemLabels(menu)).toEqual(["Paths before"]);
280
+
281
+ const item: HTMLElement = within(menu).getByRole("menuitem", {
282
+ name: "Paths before",
283
+ });
284
+
285
+ // Neither direction is destructive, so neither is drawn in red.
286
+ expect(item).not.toHaveClass("text-red-600");
287
+ expect(item).not.toHaveAttribute("aria-disabled", "true");
288
+
289
+ /*
290
+ * The table sits in an overflow-x-auto scroller that would clip a menu
291
+ * opened under its last rows, so the menu is portalled to the body.
292
+ */
293
+ expect(screen.getByTestId("user-flow-pages-table")).not.toContainElement(
294
+ menu,
295
+ );
296
+ expect(menu.parentElement).toBe(document.body);
297
+
298
+ // The menu belongs to the row that was clicked, and only that row.
299
+ expect(moreButton(pageRow("/cart"))).toHaveAttribute(
300
+ "aria-expanded",
301
+ "true",
302
+ );
303
+ expect(moreButton(pageRow("/cart"))).toHaveAttribute(
304
+ "aria-controls",
305
+ menu.id,
306
+ );
307
+ expect(moreButton(pageRow("/home"))).toHaveAttribute(
308
+ "aria-expanded",
309
+ "false",
310
+ );
311
+ expect(screen.getAllByRole("menu")).toHaveLength(1);
312
+ });
313
+
314
+ test("Paths after anchors the map forward on the page of its own row", () => {
315
+ const onAnchor: Mock<OnAnchor> = jest.fn<OnAnchor>();
316
+
317
+ renderTables(onAnchor);
318
+ openTab("pages");
319
+
320
+ fireEvent.click(pathsAfterButton(pageRow("/cart")));
321
+
322
+ expect(onAnchor).toHaveBeenCalledTimes(1);
323
+ expect(onAnchor).toHaveBeenCalledWith("/cart", "forward");
324
+ });
325
+
326
+ test("Paths before, picked from a row's ⋯ menu, anchors the map backward on that row's page and closes the menu", () => {
327
+ const onAnchor: Mock<OnAnchor> = jest.fn<OnAnchor>();
328
+
329
+ renderTables(onAnchor);
330
+ openTab("pages");
331
+
332
+ choosePathsBefore(pageRow("/checkout"));
333
+
334
+ expect(onAnchor).toHaveBeenCalledTimes(1);
335
+ expect(onAnchor).toHaveBeenCalledWith("/checkout", "backward");
336
+ expect(screen.queryByRole("menu")).toBeNull();
337
+ expect(moreButton(pageRow("/checkout"))).toHaveAttribute(
338
+ "aria-expanded",
339
+ "false",
340
+ );
341
+ });
342
+
343
+ test("opening the ⋯ and closing it again anchors nothing", () => {
344
+ const onAnchor: Mock<OnAnchor> = jest.fn<OnAnchor>();
345
+
346
+ renderTables(onAnchor);
347
+ openTab("pages");
348
+
349
+ const row: HTMLElement = pageRow("/home");
350
+
351
+ openMenuOf(row);
352
+ fireEvent.click(moreButton(row));
353
+
354
+ expect(screen.queryByRole("menu")).toBeNull();
355
+ expect(onAnchor).not.toHaveBeenCalled();
356
+ });
357
+
358
+ test("every row's actions act on its own page, in both directions", () => {
359
+ const onAnchor: Mock<OnAnchor> = jest.fn<OnAnchor>();
360
+
361
+ renderTables(onAnchor);
362
+ openTab("pages");
363
+
364
+ for (const page of pageOrder()) {
365
+ fireEvent.click(pathsAfterButton(pageRow(page)));
366
+ choosePathsBefore(pageRow(page));
367
+ }
368
+
369
+ expect(onAnchor.mock.calls).toEqual([
370
+ ["/home", "forward"],
371
+ ["/home", "backward"],
372
+ ["/cart", "forward"],
373
+ ["/cart", "backward"],
374
+ ["/checkout", "forward"],
375
+ ["/checkout", "backward"],
376
+ ]);
377
+ });
378
+
379
+ test("after a re-sort the actions follow their page, not the position of the row", () => {
380
+ const onAnchor: Mock<OnAnchor> = jest.fn<OnAnchor>();
381
+
382
+ renderTables(onAnchor);
383
+ openTab("pages");
384
+
385
+ const header: HTMLElement = screen
386
+ .getByTestId("user-flow-pages-table")
387
+ .querySelector("thead") as HTMLElement;
388
+
389
+ fireEvent.click(within(header).getByRole("button", { name: "Exit rate" }));
390
+
391
+ expect(pageOrder()).toEqual(["/checkout", "/cart", "/home"]);
392
+
393
+ const [firstRow, , lastRow] = pageRows();
394
+
395
+ fireEvent.click(pathsAfterButton(firstRow!));
396
+ choosePathsBefore(lastRow!);
397
+
398
+ expect(onAnchor.mock.calls).toEqual([
399
+ ["/checkout", "forward"],
400
+ ["/home", "backward"],
401
+ ]);
402
+ });
403
+
404
+ /*
405
+ * Re-anchoring re-renders the whole page around the table. An action that
406
+ * never said it had finished would come back from that render as a disabled
407
+ * spinner, and the row could not be asked again.
408
+ */
409
+ test("the row's button is ready again once the map has re-anchored", () => {
410
+ const onAnchor: Mock<OnAnchor> = jest.fn<OnAnchor>();
411
+ const { rerender }: RenderResult = renderTables(onAnchor);
412
+
413
+ openTab("pages");
414
+
415
+ fireEvent.click(pathsAfterButton(pageRow("/home")));
416
+ rerender(tablesElement(onAnchor));
417
+
418
+ const button: HTMLElement = pathsAfterButton(pageRow("/home"));
419
+
420
+ expect(button).toBeEnabled();
421
+ expect(button).toHaveAttribute("aria-disabled", "false");
422
+
423
+ fireEvent.click(button);
424
+ choosePathsBefore(pageRow("/home"));
425
+ rerender(tablesElement(onAnchor));
426
+ fireEvent.click(pathsAfterButton(pageRow("/home")));
427
+
428
+ expect(onAnchor.mock.calls).toEqual([
429
+ ["/home", "forward"],
430
+ ["/home", "forward"],
431
+ ["/home", "backward"],
432
+ ["/home", "forward"],
433
+ ]);
434
+ });
435
+
436
+ test("the page chip still anchors forward, the same way the row's button does", () => {
437
+ const onAnchor: Mock<OnAnchor> = jest.fn<OnAnchor>();
438
+
439
+ renderTables(onAnchor);
440
+ openTab("pages");
441
+
442
+ fireEvent.click(
443
+ within(pageRow("/cart")).getByRole("button", { name: "/cart" }),
444
+ );
445
+ fireEvent.click(pathsAfterButton(pageRow("/cart")));
446
+
447
+ expect(onAnchor.mock.calls).toEqual([
448
+ ["/cart", "forward"],
449
+ ["/cart", "forward"],
450
+ ]);
451
+ });
452
+
453
+ test("with no pages there are no rows and no actions", () => {
454
+ renderTables(jest.fn<OnAnchor>(), []);
455
+ openTab("pages");
456
+
457
+ expect(screen.queryAllByTestId("user-flow-page-row")).toHaveLength(0);
458
+ expect(screen.queryByTestId("row-actions")).toBeNull();
459
+ });
460
+ });
461
+
462
+ describe("the other User Flows tabs keep their one control per row", () => {
463
+ test("Top paths rows carry only their Watch link, with no ⋯", () => {
464
+ renderTables(jest.fn<OnAnchor>());
465
+
466
+ const rows: Array<HTMLElement> =
467
+ screen.getAllByTestId("user-flow-path-row");
468
+
469
+ expect(rows).toHaveLength(PATHS.length);
470
+
471
+ for (const row of rows) {
472
+ expect(within(row).queryByTestId("row-actions")).toBeNull();
473
+ expect(within(row).queryByTestId("row-actions-more-button")).toBeNull();
474
+
475
+ const links: Array<HTMLElement> = within(row).getAllByRole("link");
476
+
477
+ expect(links).toHaveLength(1);
478
+ expect(links[0]).toHaveTextContent(/^Watch$/);
479
+ }
480
+ });
481
+
482
+ test("Back and forth rows carry only their Watch link, with no ⋯", () => {
483
+ renderTables(jest.fn<OnAnchor>());
484
+ openTab("loops");
485
+
486
+ const rows: Array<HTMLElement> =
487
+ screen.getAllByTestId("user-flow-loop-row");
488
+
489
+ expect(rows).toHaveLength(LOOPS.length);
490
+
491
+ for (const row of rows) {
492
+ expect(within(row).queryByTestId("row-actions")).toBeNull();
493
+ expect(within(row).queryByTestId("row-actions-more-button")).toBeNull();
494
+
495
+ const links: Array<HTMLElement> = within(row).getAllByRole("link");
496
+
497
+ expect(links).toHaveLength(1);
498
+ expect(links[0]).toHaveTextContent(/^Watch$/);
499
+ }
500
+ });
501
+ });
@@ -9,20 +9,20 @@ import path from "path";
9
9
 
10
10
  /*
11
11
  * Contract under test — the kubectl policy and the kubernetes-agent chart's
12
- * RBAC agree on what the in-cluster Runner can do unattended.
12
+ * RBAC agree on what the Kubernetes AI agent can do unattended.
13
13
  *
14
14
  * A SafeWrite runs with nobody asked on an Automatic cluster. If the policy
15
- * tiers a command SafeWrite that the chart's RBAC does not allow, the Runner
15
+ * tiers a command SafeWrite that the chart's RBAC does not allow, the agent
16
16
  * runs it unattended, the API server answers Forbidden, and the failure lands
17
- * on the incident and the cluster's AI page as if the fix had been tried and
18
- * failed. So every command the policy tiers SafeWrite must be covered by the
19
- * roles the chart renders; a new SafeWrite kind with no grant fails here.
20
- * The fix for a failure is normally in the policy (tier it riskier), not in
21
- * the chart: widening the Runner's write RBAC is a deliberate decision, which
22
- * the second half of this file pins.
17
+ * on the incident and the cluster's AI agent page as if the fix had been
18
+ * tried and failed. So every command the policy tiers SafeWrite must be
19
+ * covered by the roles the chart renders; a new SafeWrite kind with no grant
20
+ * fails here. The fix for a failure is normally in the policy (tier it
21
+ * riskier), not in the chart: widening the agent's write RBAC is a
22
+ * deliberate decision, which the second half of this file pins.
23
23
  *
24
24
  * The rules are not copied here. They are read from the arrays
25
- * tests/ai-runner_test.yaml pins with `equal` against the rendered chart, so
25
+ * tests/ai-agent_test.yaml pins with `equal` against the rendered chart, so
26
26
  * this file and the chart cannot drift apart silently: change the chart and
27
27
  * helm-unittest makes you change those arrays, and this test reads the new
28
28
  * ones. Each command is mapped to the (apiGroup, resource, verb) requests
@@ -38,11 +38,17 @@ const CHART_TEST_PATH: string = path.join(
38
38
  "Public",
39
39
  "kubernetes-agent",
40
40
  "tests",
41
- "ai-runner_test.yaml",
41
+ "ai-agent_test.yaml",
42
42
  );
43
43
  // The helm-unittest case that pins all three roles with remediation on.
44
44
  const PINNED_TEST_NAME_PREFIX: string =
45
45
  "puts the fix verbs in a remediation role";
46
+ /*
47
+ * Every object the chart renders for the agent is `<fullname>-ai-agent`,
48
+ * plus `-remediation` / `-node-operations` for the write roles; the prefix
49
+ * is the release's, so it is stripped before the roles are told apart.
50
+ */
51
+ const KUBERNETES_AI_AGENT_OBJECT_SUFFIX: string = "ai-agent";
46
52
 
47
53
  interface RbacRule {
48
54
  apiGroups: Array<string>;
@@ -70,6 +76,8 @@ interface PinnedRoles {
70
76
  read: Array<RbacRule>;
71
77
  remediation: Array<RbacRule>;
72
78
  nodeOperations: Array<RbacRule>;
79
+ // The rendered names of the roles whose rules were read, by index.
80
+ names: Array<string>;
73
81
  }
74
82
 
75
83
  function readPinnedRoles(): PinnedRoles {
@@ -84,7 +92,7 @@ function readPinnedRoles(): PinnedRoles {
84
92
 
85
93
  if (!test) {
86
94
  throw new Error(
87
- `tests/ai-runner_test.yaml has no case starting "${PINNED_TEST_NAME_PREFIX}"`,
95
+ `tests/ai-agent_test.yaml has no case starting "${PINNED_TEST_NAME_PREFIX}"`,
88
96
  );
89
97
  }
90
98
 
@@ -116,20 +124,28 @@ function readPinnedRoles(): PinnedRoles {
116
124
  Array<RbacRule>
117
125
  >();
118
126
 
127
+ const names: Array<string> = [];
128
+
119
129
  for (const [index, rules] of rulesByIndex) {
120
130
  const name: string | undefined = namesByIndex.get(index);
121
131
 
122
132
  if (name) {
123
- rolesBySuffix.set(name.replace(/^.*-ai-runner/, "ai-runner"), rules);
133
+ names.push(name);
134
+ rolesBySuffix.set(
135
+ name.replace(/^.*-ai-agent/, KUBERNETES_AI_AGENT_OBJECT_SUFFIX),
136
+ rules,
137
+ );
124
138
  }
125
139
  }
126
140
 
127
- const read: Array<RbacRule> | undefined = rolesBySuffix.get("ai-runner");
141
+ const read: Array<RbacRule> | undefined = rolesBySuffix.get(
142
+ KUBERNETES_AI_AGENT_OBJECT_SUFFIX,
143
+ );
128
144
  const remediation: Array<RbacRule> | undefined = rolesBySuffix.get(
129
- "ai-runner-remediation",
145
+ `${KUBERNETES_AI_AGENT_OBJECT_SUFFIX}-remediation`,
130
146
  );
131
147
  const nodeOperations: Array<RbacRule> | undefined = rolesBySuffix.get(
132
- "ai-runner-node-operations",
148
+ `${KUBERNETES_AI_AGENT_OBJECT_SUFFIX}-node-operations`,
133
149
  );
134
150
 
135
151
  if (!read || !remediation || !nodeOperations) {
@@ -138,7 +154,7 @@ function readPinnedRoles(): PinnedRoles {
138
154
  );
139
155
  }
140
156
 
141
- return { read, remediation, nodeOperations };
157
+ return { read, remediation, nodeOperations, names };
142
158
  }
143
159
 
144
160
  function isAllowed(rules: Array<RbacRule>, request: ApiRequest): boolean {
@@ -357,7 +373,7 @@ const GRANTED_FIXES: Array<Candidate> = [
357
373
 
358
374
  /*
359
375
  * Writes the chart deliberately does not grant. The policy may still let a
360
- * human approve them for an external Runner whose credential allows them;
376
+ * human approve them for an advanced Runner whose credential allows them;
361
377
  * in-cluster they fail Forbidden, which is why none of them may be
362
378
  * SafeWrite (checked above) and why the docs say so.
363
379
  */
@@ -599,6 +615,18 @@ describe("KubectlPolicy against the kubernetes-agent chart's RBAC", () => {
599
615
  });
600
616
  }
601
617
 
618
+ it("reads the Kubernetes AI agent's roles, as the chart names them", () => {
619
+ /*
620
+ * The pinned case renders release `oneuptime-agent`; the agent's
621
+ * objects are `<fullname>-ai-agent[-remediation|-node-operations]`.
622
+ */
623
+ expect(roles.names).toEqual([
624
+ "oneuptime-agent-kubernetes-agent-ai-agent",
625
+ "oneuptime-agent-kubernetes-agent-ai-agent-remediation",
626
+ "oneuptime-agent-kubernetes-agent-ai-agent-node-operations",
627
+ ]);
628
+ });
629
+
602
630
  it("reads the three roles the chart test pins", () => {
603
631
  expect(roles.read.length).toBeGreaterThan(0);
604
632
  expect(roles.remediation.length).toBeGreaterThan(0);
@@ -680,7 +708,7 @@ describe("KubectlPolicy against the kubernetes-agent chart's RBAC", () => {
680
708
  }
681
709
  });
682
710
 
683
- it("does not grant writes outside the workload kinds, so widening the Runner's RBAC stays a deliberate change", () => {
711
+ it("does not grant writes outside the workload kinds, so widening the agent's RBAC stays a deliberate change", () => {
684
712
  for (const candidate of NOT_GRANTED) {
685
713
  expect({
686
714
  command: candidate.command,
@@ -693,7 +721,7 @@ describe("KubectlPolicy against the kubernetes-agent chart's RBAC", () => {
693
721
  /*
694
722
  * Bound per namespace, a nodes rule would do nothing (nodes are
695
723
  * cluster-scoped) — and bound cluster-wide it would ignore
696
- * aiAccess.remediation.nodeOperations.
724
+ * aiAgent.remediation.nodeOperations.
697
725
  */
698
726
  expect(isAllowed(roles.remediation, request("node", "patch"))).toBe(false);
699
727
  expect(
@@ -133,6 +133,8 @@ function statusOf(
133
133
  posture: postureOf(runner),
134
134
  },
135
135
  accessMethod: accessMethodOf(runner),
136
+ aiAgent: null,
137
+ automaticInvestigation: { incidents: false, alerts: false },
136
138
  ...(runner.usesCredential
137
139
  ? { credentialId: "55555555-5555-4555-8555-555555555555" }
138
140
  : {}),