@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
@@ -4,6 +4,7 @@ import React, {
4
4
  useCallback,
5
5
  useEffect,
6
6
  useMemo,
7
+ useRef,
7
8
  useState,
8
9
  } from "react";
9
10
  import {
@@ -16,6 +17,7 @@ import {
16
17
  CartesianGrid,
17
18
  AreaChart,
18
19
  Area,
20
+ ReferenceArea,
19
21
  } from "recharts";
20
22
  import RangeStartAndEndDateTime, {
21
23
  RangeStartAndEndDateTimeUtil,
@@ -44,6 +46,15 @@ import {
44
46
  getAnalyticsSeriesLabel,
45
47
  LogsEntityResolutionRequest,
46
48
  } from "../LogsEntityNames";
49
+ import useHistogramRangeSelection, {
50
+ HistogramRangeSelectionState,
51
+ } from "../../Charts/Utils/useHistogramRangeSelection";
52
+ import {
53
+ ChartTimeRangeZoomContextValue,
54
+ ChartTimeRangeZoomHandlers,
55
+ resolveChartTimeRangeZoom,
56
+ useChartTimeRangeZoom,
57
+ } from "../../Charts/TimeRangeZoom/TimeRangeZoomContext";
47
58
 
48
59
  type AnalyticsChartType = "timeseries" | "toplist" | "table";
49
60
  type AnalyticsAggregation = "count" | "unique";
@@ -74,8 +85,21 @@ export interface LogsAnalyticsViewProps {
74
85
  sessionIds?: Array<string> | undefined;
75
86
  appliedFacetFilters: Map<string, Set<string>>;
76
87
  logAttributes: Array<string>;
88
+ /*
89
+ * Drag-to-zoom for the timeseries chart. Without these the chart zooms
90
+ * whatever the enclosing viewer offers (the logs viewer hands it the same
91
+ * zoom its volume histogram uses), so a drag here retimes the viewer.
92
+ */
93
+ onTimeRangeSelect?: ((startTime: Date, endTime: Date) => void) | undefined;
94
+ // Set only while there is a zoom to undo: it holds single clicks open.
95
+ onTimeRangeReset?: (() => void) | undefined;
77
96
  }
78
97
 
98
+ export const LOGS_ANALYTICS_TIMESERIES_TEST_ID: string =
99
+ "logs-analytics-timeseries";
100
+ export const LOGS_ANALYTICS_ZOOM_HINT_TEST_ID: string =
101
+ "logs-analytics-zoom-hint";
102
+
79
103
  const CHART_COLORS: Array<string> = [
80
104
  "#6366f1", // indigo
81
105
  "#ec4899", // pink
@@ -330,6 +354,15 @@ const LogsAnalyticsView: FunctionComponent<LogsAnalyticsViewProps> = (
330
354
  const [timeseriesData, setTimeseriesData] = useState<
331
355
  Array<AnalyticsTimeseriesRow>
332
356
  >([]);
357
+ /*
358
+ * How much time one timeseries bucket covers, as the request that
359
+ * produced the rows on screen bucketed them. Kept next to the rows so a
360
+ * refetch in flight cannot pair these bars with another window's width;
361
+ * it is what lets a click on one bar zoom into that bar.
362
+ */
363
+ const [timeseriesBucketMs, setTimeseriesBucketMs] = useState<
364
+ number | undefined
365
+ >(undefined);
333
366
  const [topListData, setTopListData] = useState<Array<AnalyticsTopItem>>([]);
334
367
  const [tableData, setTableData] = useState<Array<AnalyticsTableRow>>([]);
335
368
  /*
@@ -341,6 +374,15 @@ const LogsAnalyticsView: FunctionComponent<LogsAnalyticsViewProps> = (
341
374
  [],
342
375
  );
343
376
 
377
+ /*
378
+ * Staleness guard. A zoom, its reset and the picker can change the window
379
+ * faster than an analytics request returns, and a wide window answers
380
+ * slower than a narrow one: without a sequence check the older response
381
+ * lands last and paints the window the reader just left under the one
382
+ * the picker, the list and the histogram show.
383
+ */
384
+ const requestSequenceRef: React.MutableRefObject<number> = useRef<number>(0);
385
+
344
386
  const allDimensionOptions: Array<{ value: string; label: string }> =
345
387
  useMemo(() => {
346
388
  const attributeOptions: Array<{ value: string; label: string }> =
@@ -359,6 +401,11 @@ const LogsAnalyticsView: FunctionComponent<LogsAnalyticsViewProps> = (
359
401
 
360
402
  const fetchAnalytics: () => Promise<void> =
361
403
  useCallback(async (): Promise<void> => {
404
+ const requestSequence: number = ++requestSequenceRef.current;
405
+ const isStale: () => boolean = (): boolean => {
406
+ return requestSequence !== requestSequenceRef.current;
407
+ };
408
+
362
409
  try {
363
410
  setIsLoading(true);
364
411
 
@@ -367,13 +414,17 @@ const LogsAnalyticsView: FunctionComponent<LogsAnalyticsViewProps> = (
367
414
 
368
415
  const startTime: Date = dateRange.startValue;
369
416
  const endTime: Date = dateRange.endValue;
417
+ const bucketSizeInMinutes: number = computeDefaultBucketSize(
418
+ startTime,
419
+ endTime,
420
+ );
370
421
 
371
422
  const requestData: JSONObject = {
372
423
  chartType,
373
424
  aggregation,
374
425
  startTime: startTime.toISOString(),
375
426
  endTime: endTime.toISOString(),
376
- bucketSizeInMinutes: computeDefaultBucketSize(startTime, endTime),
427
+ bucketSizeInMinutes: bucketSizeInMinutes,
377
428
  } as JSONObject;
378
429
 
379
430
  const requestGroupBy: Array<string> =
@@ -473,24 +524,42 @@ const LogsAnalyticsView: FunctionComponent<LogsAnalyticsViewProps> = (
473
524
  throw response;
474
525
  }
475
526
 
527
+ /*
528
+ * Superseded: drop it whole, labels included - a stale group-by
529
+ * would relabel the newer rows.
530
+ */
531
+ if (isStale()) {
532
+ return;
533
+ }
534
+
476
535
  const data: unknown = response.data["data"] || [];
477
536
 
478
537
  setResultGroupByFields(requestGroupBy);
479
538
 
480
539
  if (chartType === "timeseries") {
481
540
  setTimeseriesData(data as Array<AnalyticsTimeseriesRow>);
541
+ setTimeseriesBucketMs(bucketSizeInMinutes * 60 * 1000);
482
542
  } else if (chartType === "toplist") {
483
543
  setTopListData(data as Array<AnalyticsTopItem>);
484
544
  } else {
485
545
  setTableData(data as Array<AnalyticsTableRow>);
486
546
  }
487
547
  } catch {
548
+ // A late failure of a superseded request must not blank newer data.
549
+ if (isStale()) {
550
+ return;
551
+ }
552
+
488
553
  // Silently degrade
489
554
  setTimeseriesData([]);
555
+ setTimeseriesBucketMs(undefined);
490
556
  setTopListData([]);
491
557
  setTableData([]);
492
558
  } finally {
493
- setIsLoading(false);
559
+ // Only the latest request may take the loader down.
560
+ if (!isStale()) {
561
+ setIsLoading(false);
562
+ }
494
563
  }
495
564
  }, [
496
565
  chartType,
@@ -537,6 +606,43 @@ const LogsAnalyticsView: FunctionComponent<LogsAnalyticsViewProps> = (
537
606
  return pivotTimeseriesData(timeseriesData, entityNameMap);
538
607
  }, [timeseriesData, entityNameMap]);
539
608
 
609
+ /*
610
+ * Only the timeseries has a time axis: a window dragged across a top
611
+ * list or a table would not be a time range. Handlers the host passes win
612
+ * over the zoom the enclosing viewer offers.
613
+ */
614
+ const pageZoom: ChartTimeRangeZoomContextValue | null =
615
+ useChartTimeRangeZoom();
616
+ const zoomHandlers: ChartTimeRangeZoomHandlers = resolveChartTimeRangeZoom({
617
+ onTimeRangeSelect: props.onTimeRangeSelect,
618
+ onTimeRangeReset: props.onTimeRangeReset,
619
+ isTimeAxis: chartType === "timeseries",
620
+ pageZoom: pageZoom,
621
+ });
622
+
623
+ /*
624
+ * The same click-or-drag selection the volume histogram above uses, over
625
+ * the same bucket-start labels: a drag zooms into every bucket it covered,
626
+ * a click into one bucket, and a double-click zooms back out.
627
+ */
628
+ const selection: HistogramRangeSelectionState = useHistogramRangeSelection({
629
+ onTimeRangeSelect: zoomHandlers.onTimeRangeSelect,
630
+ onZoomOut: zoomHandlers.onTimeRangeReset,
631
+ bucketIntervalMs: timeseriesBucketMs,
632
+ });
633
+
634
+ const canZoom: boolean = Boolean(zoomHandlers.onTimeRangeSelect);
635
+
636
+ /*
637
+ * The crosshair goes on the chart root itself: recharts sets an inline
638
+ * `cursor: default` on the .recharts-wrapper that fills the plot, so a
639
+ * cursor on any element around it never shows over the chart. Left off
640
+ * entirely when nothing can be dragged, so recharts keeps its default.
641
+ */
642
+ const chartRootCursorProps: { style?: React.CSSProperties } = canZoom
643
+ ? { style: { cursor: "crosshair" } }
644
+ : {};
645
+
540
646
  const renderSelectControl: (
541
647
  label: string,
542
648
  value: string | number,
@@ -682,9 +788,29 @@ const LogsAnalyticsView: FunctionComponent<LogsAnalyticsViewProps> = (
682
788
  );
683
789
  };
684
790
 
791
+ const renderZoomHint: () => ReactElement | null = (): ReactElement | null => {
792
+ if (!canZoom) {
793
+ return null;
794
+ }
795
+
796
+ return (
797
+ <span
798
+ className="ml-auto shrink-0 whitespace-nowrap text-[10px] text-gray-400"
799
+ data-testid={LOGS_ANALYTICS_ZOOM_HINT_TEST_ID}
800
+ >
801
+ {selection.canClickToZoom ? "Click or drag to zoom" : "Drag to zoom"}
802
+ {zoomHandlers.onTimeRangeReset ? " · double-click to reset" : ""}
803
+ </span>
804
+ );
805
+ };
806
+
685
807
  const renderLegend: () => ReactElement = (): ReactElement => {
686
808
  if (seriesKeys.length <= 1) {
687
- return <></>;
809
+ return canZoom ? (
810
+ <div className="flex items-center px-5 pb-2">{renderZoomHint()}</div>
811
+ ) : (
812
+ <></>
813
+ );
688
814
  }
689
815
 
690
816
  return (
@@ -704,13 +830,58 @@ const LogsAnalyticsView: FunctionComponent<LogsAnalyticsViewProps> = (
704
830
  </div>
705
831
  );
706
832
  })}
833
+ {renderZoomHint()}
707
834
  </div>
708
835
  );
709
836
  };
710
837
 
838
+ /*
839
+ * The band a drag paints across the buckets it covers, in the same colours
840
+ * the volume histogram uses.
841
+ */
842
+ const renderSelectionBand: () => ReactElement | null =
843
+ (): ReactElement | null => {
844
+ if (!selection.selectionStart || !selection.selectionEnd) {
845
+ return null;
846
+ }
847
+
848
+ return (
849
+ <ReferenceArea
850
+ x1={selection.selectionStart}
851
+ x2={selection.selectionEnd}
852
+ fill="rgba(99,102,241,0.12)"
853
+ stroke="rgba(99,102,241,0.5)"
854
+ strokeWidth={1}
855
+ radius={2}
856
+ />
857
+ );
858
+ };
859
+
860
+ /*
861
+ * The tooltip is pinned shut for the length of a drag: it would otherwise
862
+ * sit over the very buckets the reader is picking. Dropping the prop hands
863
+ * control back to recharts once the drag ends.
864
+ */
865
+ const tooltipDragProps: { active?: boolean } = selection.isDragging
866
+ ? { active: false }
867
+ : {};
868
+
711
869
  const renderTimeseries: () => ReactElement = (): ReactElement => {
712
870
  if (pivotedData.length === 0) {
713
- return renderEmptyState();
871
+ /*
872
+ * A zoom into a quiet stretch lands here, with no chart left to
873
+ * double-click; the empty area takes the double-click instead, so the
874
+ * way back is where the reader's pointer already is. select-none: a
875
+ * double-click on the message would otherwise also select a word.
876
+ */
877
+ return (
878
+ <div
879
+ className="select-none"
880
+ onDoubleClick={zoomHandlers.onTimeRangeReset}
881
+ >
882
+ {renderEmptyState()}
883
+ </div>
884
+ );
714
885
  }
715
886
 
716
887
  const useAreaChart: boolean = seriesKeys.length === 1;
@@ -718,12 +889,25 @@ const LogsAnalyticsView: FunctionComponent<LogsAnalyticsViewProps> = (
718
889
  return (
719
890
  <div className="px-2 pt-4 pb-2">
720
891
  {renderLegend()}
721
- <div style={{ height: 320 }}>
892
+ <div
893
+ className="select-none"
894
+ style={{
895
+ height: 320,
896
+ cursor: canZoom ? "crosshair" : "default",
897
+ }}
898
+ data-testid={LOGS_ANALYTICS_TIMESERIES_TEST_ID}
899
+ onDoubleClick={selection.onDoubleClick}
900
+ >
722
901
  <ResponsiveContainer width="100%" height="100%">
723
902
  {useAreaChart ? (
724
903
  <AreaChart
725
904
  data={pivotedData}
726
905
  margin={{ top: 8, right: 20, bottom: 4, left: 0 }}
906
+ onMouseDown={selection.onMouseDown}
907
+ {...selection.chartRootProps}
908
+ onMouseMove={selection.onMouseMove}
909
+ onMouseUp={selection.onMouseUp}
910
+ {...chartRootCursorProps}
727
911
  >
728
912
  <defs>
729
913
  <linearGradient
@@ -781,6 +965,7 @@ const LogsAnalyticsView: FunctionComponent<LogsAnalyticsViewProps> = (
781
965
  strokeWidth: 1,
782
966
  strokeDasharray: "4 4",
783
967
  }}
968
+ {...tooltipDragProps}
784
969
  />
785
970
  <Area
786
971
  dataKey={seriesKeys[0] || "count"}
@@ -796,6 +981,7 @@ const LogsAnalyticsView: FunctionComponent<LogsAnalyticsViewProps> = (
796
981
  }}
797
982
  isAnimationActive={false}
798
983
  />
984
+ {renderSelectionBand()}
799
985
  </AreaChart>
800
986
  ) : (
801
987
  <BarChart
@@ -803,6 +989,11 @@ const LogsAnalyticsView: FunctionComponent<LogsAnalyticsViewProps> = (
803
989
  margin={{ top: 8, right: 20, bottom: 4, left: 0 }}
804
990
  barCategoryGap="20%"
805
991
  barGap={0}
992
+ onMouseDown={selection.onMouseDown}
993
+ {...selection.chartRootProps}
994
+ onMouseMove={selection.onMouseMove}
995
+ onMouseUp={selection.onMouseUp}
996
+ {...chartRootCursorProps}
806
997
  >
807
998
  <CartesianGrid
808
999
  strokeDasharray="none"
@@ -836,6 +1027,7 @@ const LogsAnalyticsView: FunctionComponent<LogsAnalyticsViewProps> = (
836
1027
  <Tooltip
837
1028
  content={<AnalyticsTooltip seriesLabels={seriesLabels} />}
838
1029
  cursor={{ fill: "rgba(99,102,241,0.04)" }}
1030
+ {...tooltipDragProps}
839
1031
  />
840
1032
  {seriesKeys.map((key: string, index: number) => {
841
1033
  return (
@@ -854,6 +1046,7 @@ const LogsAnalyticsView: FunctionComponent<LogsAnalyticsViewProps> = (
854
1046
  />
855
1047
  );
856
1048
  })}
1049
+ {renderSelectionBand()}
857
1050
  </BarChart>
858
1051
  )}
859
1052
  </ResponsiveContainer>
@@ -1069,8 +1262,18 @@ const LogsAnalyticsView: FunctionComponent<LogsAnalyticsViewProps> = (
1069
1262
 
1070
1263
  const renderChart: () => ReactElement = (): ReactElement => {
1071
1264
  if (isLoading) {
1265
+ /*
1266
+ * A zoom refetches, and until the new window lands the loader stands
1267
+ * where the timeseries was - just when a reader double-clicks to undo
1268
+ * the zoom (issue #4116). It takes that double-click as the chart
1269
+ * does, even when the chart replaces it mid-double-click (see
1270
+ * placeholderProps).
1271
+ */
1072
1272
  return (
1073
- <div className="flex h-72 items-center justify-center">
1273
+ <div
1274
+ className="flex h-72 select-none items-center justify-center"
1275
+ {...(chartType === "timeseries" ? selection.placeholderProps : {})}
1276
+ >
1074
1277
  <ComponentLoader />
1075
1278
  </div>
1076
1279
  );
@@ -95,6 +95,15 @@ const LogsHistogram: FunctionComponent<LogsHistogramProps> = (
95
95
  bucketIntervalMs: props.bucketIntervalMs,
96
96
  });
97
97
 
98
+ /*
99
+ * The crosshair goes on the chart root itself: recharts sets an inline
100
+ * `cursor: default` on the .recharts-wrapper that fills the plot, so the
101
+ * cursor on the box around it never shows over the bars. Left off
102
+ * entirely when nothing can be dragged, so recharts keeps its default.
103
+ */
104
+ const chartRootCursorProps: { style?: React.CSSProperties } =
105
+ props.onTimeRangeSelect ? { style: { cursor: "crosshair" } } : {};
106
+
98
107
  const pivotedData: Array<PivotedRow> = useMemo(() => {
99
108
  return pivotBuckets(props.buckets);
100
109
  }, [props.buckets]);
@@ -111,15 +120,32 @@ const LogsHistogram: FunctionComponent<LogsHistogramProps> = (
111
120
  });
112
121
  }, [props.buckets]);
113
122
 
114
- if (props.isLoading && pivotedData.length === 0) {
123
+ /*
124
+ * The loader and the empty box below stand where the bars were, and take
125
+ * the double-click as the bars do: right after a zoom, while its window
126
+ * loads or when it holds nothing, is exactly when a reader double-clicks
127
+ * to go back (issue #4116), and the bars can replace them in the middle
128
+ * of that double-click (see placeholderProps). select-none: a
129
+ * double-click on the message would otherwise also select a word. A
130
+ * zoomed chart keeps its card while it loads (below), so the way back
131
+ * stays in the same place.
132
+ */
133
+ if (props.isLoading && pivotedData.length === 0 && !props.onZoomOut) {
115
134
  return (
116
- <div className="flex h-32 items-center justify-center rounded-lg border border-gray-200 bg-white">
135
+ <div
136
+ className="flex h-32 select-none items-center justify-center rounded-lg border border-gray-200 bg-white"
137
+ {...selection.placeholderProps}
138
+ >
117
139
  <ComponentLoader />
118
140
  </div>
119
141
  );
120
142
  }
121
143
 
122
- if (pivotedData.length === 0) {
144
+ /*
145
+ * A window with no logs has nothing to chart - unless a zoom brought the
146
+ * reader there: then the card stays, and its empty box is the way back.
147
+ */
148
+ if (pivotedData.length === 0 && !props.onZoomOut) {
123
149
  return <></>;
124
150
  }
125
151
 
@@ -129,7 +155,7 @@ const LogsHistogram: FunctionComponent<LogsHistogramProps> = (
129
155
  <div className="flex items-center justify-between border-b border-gray-100 px-4 py-2">
130
156
  <div className="flex items-center gap-2">
131
157
  <span className="text-xs font-medium text-gray-500">Log Volume</span>
132
- {props.onTimeRangeSelect && (
158
+ {props.onTimeRangeSelect && pivotedData.length > 0 && (
133
159
  <span className="text-[10px] text-gray-300">
134
160
  {selection.canClickToZoom
135
161
  ? "Click or drag to zoom"
@@ -138,7 +164,7 @@ const LogsHistogram: FunctionComponent<LogsHistogramProps> = (
138
164
  )}
139
165
  {props.onZoomOut && (
140
166
  <span className="text-[10px] text-gray-300">
141
- Double-click to zoom out
167
+ Double-click to reset
142
168
  </span>
143
169
  )}
144
170
  </div>
@@ -158,87 +184,104 @@ const LogsHistogram: FunctionComponent<LogsHistogramProps> = (
158
184
  </div>
159
185
  </div>
160
186
 
187
+ {pivotedData.length === 0 && (
188
+ <div
189
+ className="flex h-[120px] select-none items-center justify-center text-xs text-gray-400"
190
+ {...selection.placeholderProps}
191
+ >
192
+ {props.isLoading ? (
193
+ <ComponentLoader />
194
+ ) : (
195
+ "No logs in the selected range"
196
+ )}
197
+ </div>
198
+ )}
199
+
161
200
  {/* Chart */}
162
- <div
163
- className="select-none px-2 pb-1 pt-2"
164
- style={{
165
- height: 120,
166
- cursor: props.onTimeRangeSelect ? "crosshair" : "default",
167
- }}
168
- onDoubleClick={selection.onDoubleClick}
169
- >
170
- <ResponsiveContainer width="100%" height="100%">
171
- <BarChart
172
- data={pivotedData}
173
- margin={{ top: 4, right: 8, bottom: 0, left: -4 }}
174
- onMouseDown={selection.onMouseDown}
175
- onMouseMove={selection.onMouseMove}
176
- onMouseUp={selection.onMouseUp}
177
- barCategoryGap="15%"
178
- barGap={0}
179
- >
180
- <XAxis
181
- dataKey="time"
182
- tickFormatter={formatTickTime}
183
- tick={{
184
- fontSize: 10,
185
- fill: "var(--ou-chart-tick, #9ca3af)",
186
- }}
187
- axisLine={{ stroke: "var(--ou-chart-grid, #e5e7eb)" }}
188
- tickLine={false}
189
- minTickGap={40}
190
- dy={4}
191
- interval="preserveStartEnd"
192
- />
193
- <YAxis
194
- tick={{
195
- fontSize: 10,
196
- fill: "var(--ou-chart-tick, #9ca3af)",
197
- }}
198
- axisLine={false}
199
- tickLine={false}
200
- width={48}
201
- allowDecimals={false}
202
- tickFormatter={formatYAxisTick}
203
- />
204
- {/*
205
- * The tooltip is pinned shut for the length of a drag: it would
206
- * otherwise sit over the very bars the reader is trying to read
207
- * while they pick the range. Dropping the prop hands control back
208
- * to recharts once the drag ends.
209
- */}
210
- <Tooltip
211
- content={<HistogramTooltip />}
212
- cursor={{ fill: "rgba(99,102,241,0.06)" }}
213
- {...(selection.isDragging ? { active: false } : {})}
214
- />
215
- {activeSeverities.map((severity: string, index: number) => {
216
- const isLast: boolean = index === activeSeverities.length - 1;
217
- return (
218
- <Bar
219
- key={severity}
220
- dataKey={severity}
221
- stackId="severity"
222
- fill={getSeverityColor(severity).fill}
223
- radius={isLast ? [1.5, 1.5, 0, 0] : [0, 0, 0, 0]}
224
- isAnimationActive={false}
225
- maxBarSize={24}
226
- />
227
- );
228
- })}
229
- {selection.selectionStart && selection.selectionEnd && (
230
- <ReferenceArea
231
- x1={selection.selectionStart}
232
- x2={selection.selectionEnd}
233
- fill="rgba(99,102,241,0.12)"
234
- stroke="rgba(99,102,241,0.5)"
235
- strokeWidth={1}
236
- radius={2}
201
+ {pivotedData.length > 0 && (
202
+ <div
203
+ className="select-none px-2 pb-1 pt-2"
204
+ style={{
205
+ height: 120,
206
+ cursor: props.onTimeRangeSelect ? "crosshair" : "default",
207
+ }}
208
+ onDoubleClick={selection.onDoubleClick}
209
+ >
210
+ <ResponsiveContainer width="100%" height="100%">
211
+ <BarChart
212
+ data={pivotedData}
213
+ margin={{ top: 4, right: 8, bottom: 0, left: -4 }}
214
+ onMouseDown={selection.onMouseDown}
215
+ {...selection.chartRootProps}
216
+ onMouseMove={selection.onMouseMove}
217
+ onMouseUp={selection.onMouseUp}
218
+ barCategoryGap="15%"
219
+ barGap={0}
220
+ {...chartRootCursorProps}
221
+ >
222
+ <XAxis
223
+ dataKey="time"
224
+ tickFormatter={formatTickTime}
225
+ tick={{
226
+ fontSize: 10,
227
+ fill: "var(--ou-chart-tick, #9ca3af)",
228
+ }}
229
+ axisLine={{ stroke: "var(--ou-chart-grid, #e5e7eb)" }}
230
+ tickLine={false}
231
+ minTickGap={40}
232
+ dy={4}
233
+ interval="preserveStartEnd"
237
234
  />
238
- )}
239
- </BarChart>
240
- </ResponsiveContainer>
241
- </div>
235
+ <YAxis
236
+ tick={{
237
+ fontSize: 10,
238
+ fill: "var(--ou-chart-tick, #9ca3af)",
239
+ }}
240
+ axisLine={false}
241
+ tickLine={false}
242
+ width={48}
243
+ allowDecimals={false}
244
+ tickFormatter={formatYAxisTick}
245
+ />
246
+ {/*
247
+ * The tooltip is pinned shut for the length of a drag: it would
248
+ * otherwise sit over the very bars the reader is trying to read
249
+ * while they pick the range. Dropping the prop hands control back
250
+ * to recharts once the drag ends.
251
+ */}
252
+ <Tooltip
253
+ content={<HistogramTooltip />}
254
+ cursor={{ fill: "rgba(99,102,241,0.06)" }}
255
+ {...(selection.isDragging ? { active: false } : {})}
256
+ />
257
+ {activeSeverities.map((severity: string, index: number) => {
258
+ const isLast: boolean = index === activeSeverities.length - 1;
259
+ return (
260
+ <Bar
261
+ key={severity}
262
+ dataKey={severity}
263
+ stackId="severity"
264
+ fill={getSeverityColor(severity).fill}
265
+ radius={isLast ? [1.5, 1.5, 0, 0] : [0, 0, 0, 0]}
266
+ isAnimationActive={false}
267
+ maxBarSize={24}
268
+ />
269
+ );
270
+ })}
271
+ {selection.selectionStart && selection.selectionEnd && (
272
+ <ReferenceArea
273
+ x1={selection.selectionStart}
274
+ x2={selection.selectionEnd}
275
+ fill="rgba(99,102,241,0.12)"
276
+ stroke="rgba(99,102,241,0.5)"
277
+ strokeWidth={1}
278
+ radius={2}
279
+ />
280
+ )}
281
+ </BarChart>
282
+ </ResponsiveContainer>
283
+ </div>
284
+ )}
242
285
  </div>
243
286
  );
244
287
  };
@@ -25,6 +25,8 @@ export interface LogsViewerToolbarProps {
25
25
  liveOptions?: LiveLogsOptions;
26
26
  timeRange?: RangeStartAndEndDateTime;
27
27
  onTimeRangeChange?: (value: RangeStartAndEndDateTime) => void;
28
+ // Whether the picker offers "Reset zoom"; see LogTimeRangePicker.
29
+ showResetZoom?: boolean | undefined;
28
30
  onCreateSavedView?: (() => void) | undefined;
29
31
  savedViews?: Array<LogsSavedViewOption> | undefined;
30
32
  selectedSavedViewId?: string | null | undefined;
@@ -355,6 +357,7 @@ const LogsViewerToolbar: FunctionComponent<LogsViewerToolbarProps> = (
355
357
  <LogTimeRangePicker
356
358
  value={props.timeRange}
357
359
  onChange={props.onTimeRangeChange}
360
+ showResetZoom={props.showResetZoom}
358
361
  />
359
362
  )}
360
363
 
@@ -25,7 +25,9 @@ import PermissionGate, {
25
25
  } from "../../Utils/PermissionGate";
26
26
  import ProjectUtil from "../../Utils/Project";
27
27
  import User from "../../Utils/User";
28
- import ActionButtonSchema from "../ActionButton/ActionButtonSchema";
28
+ import ActionButtonSchema, {
29
+ ActionButtonPlacement,
30
+ } from "../ActionButton/ActionButtonSchema";
29
31
  import {
30
32
  BulkActionButtonSchema,
31
33
  BulkActionFailed,
@@ -2830,6 +2832,8 @@ const BaseModelTable: <TBaseModel extends BaseModel | AnalyticsBaseModel>(
2830
2832
  title: tx("Show ID"),
2831
2833
  buttonStyleType: ButtonStyleType.OUTLINE,
2832
2834
  hideOnMobile: true,
2835
+ // A utility every row carries - it belongs in the ⋯ menu, not on the row.
2836
+ placement: ActionButtonPlacement.MoreMenu,
2833
2837
  onClick: async (
2834
2838
  item: TBaseModel,
2835
2839
  onCompleteAction: VoidFunction,
@@ -2863,6 +2867,13 @@ const BaseModelTable: <TBaseModel extends BaseModel | AnalyticsBaseModel>(
2863
2867
  ? tx(props.viewButtonText)
2864
2868
  : `${tx("View")} ${tx(props.singularName || model.singularName || "")}`,
2865
2869
  buttonStyleType: ButtonStyleType.NORMAL,
2870
+ /*
2871
+ * Opening the record is what a row is for, so View is the row's one
2872
+ * button and Edit, Delete and the rest go in the ⋯ menu beside it.
2873
+ * Custom actions are listed ahead of View, so a table that wants one
2874
+ * of its own on the row can still mark it Primary.
2875
+ */
2876
+ placement: ActionButtonPlacement.Primary,
2866
2877
  onClick: async (
2867
2878
  item: TBaseModel,
2868
2879
  onCompleteAction: VoidFunction,