@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
@@ -24,7 +24,13 @@ import ExemplarPoint from "../../Types/ExemplarPoint";
24
24
  import FormattedExemplarPoint from "../Types/FormattedExemplarPoint";
25
25
  import FormattedReferenceRegion from "../Types/FormattedReferenceRegion";
26
26
  import FormattedTimeReferenceLine from "../Types/FormattedTimeReferenceLine";
27
- import { CHART_DATA_POINT_DATE_KEY } from "../Types/ChartDataPoint";
27
+ import useChartRangeSelection, {
28
+ ChartBucketWindow,
29
+ ChartRangeSelection,
30
+ RangeSelectionChartState,
31
+ getChartBucketWindow,
32
+ getChartRowIndex,
33
+ } from "../Utils/UseChartRangeSelection";
28
34
  import { AxisDomain } from "recharts/types/util/types";
29
35
 
30
36
  import { useOnWindowResize } from "../Utils/UseWindowOnResize";
@@ -40,7 +46,11 @@ import useChartAnnotations, {
40
46
  UseChartAnnotationsResult,
41
47
  } from "../Annotations/UseChartAnnotations";
42
48
  import { cx } from "../Utils/Cx";
43
- import { DOUBLE_CLICK_DISAMBIGUATION_MS } from "../Utils/DoubleClick";
49
+ import {
50
+ DeferredChartClick,
51
+ useDeferredChartClick,
52
+ } from "../Utils/DoubleClick";
53
+ import useChartBucketsChange from "../Utils/UseChartBucketsChange";
44
54
  import { getYAxisDomain } from "../Utils/GetYAxisDomain";
45
55
  import { hasOnlyOneValueForKey } from "../Utils/HasOnlyOneValueForKey";
46
56
  import {
@@ -581,15 +591,6 @@ type BaseEventProps = {
581
591
 
582
592
  type AreaChartEventProps = BaseEventProps | null | undefined;
583
593
 
584
- /*
585
- * Subset of the recharts MouseHandlerDataParam passed to chart-level
586
- * mouse handlers — just the fields range selection needs.
587
- */
588
- type RangeSelectionChartState = {
589
- activeTooltipIndex?: number | string | null | undefined;
590
- activeLabel?: string | number | undefined;
591
- };
592
-
593
594
  interface AreaChartProps extends React.HTMLAttributes<HTMLDivElement> {
594
595
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
595
596
  data: Record<string, any>[];
@@ -719,41 +720,31 @@ const AreaChart: React.ForwardRefExoticComponent<
719
720
  const [activeLegend, setActiveLegend] = React.useState<string | undefined>(
720
721
  undefined,
721
722
  );
722
- const hasOnTimeRangeSelect: boolean = Boolean(onTimeRangeSelect);
723
- const [rangeSelectionStart, setRangeSelectionStart] = React.useState<
724
- string | null
725
- >(null);
726
- const [rangeSelectionEnd, setRangeSelectionEnd] = React.useState<
727
- string | null
728
- >(null);
729
- const isRangeSelecting: React.MutableRefObject<boolean> =
730
- React.useRef<boolean>(false);
731
- const rangeSelectionStartIndexRef: React.MutableRefObject<number | null> =
732
- React.useRef<number | null>(null);
733
- const rangeSelectionEndIndexRef: React.MutableRefObject<number | null> =
734
- React.useRef<number | null>(null);
735
- const suppressNextClickRef: React.MutableRefObject<boolean> =
736
- React.useRef<boolean>(false);
737
- const hasOnTimeRangeReset: boolean = Boolean(onTimeRangeReset);
738
723
  /*
739
- * A pending single-click, held open long enough for a second click to
740
- * cancel it. Only armed when onTimeRangeReset is supplied.
724
+ * Every click on the plot waits out the double-click window while a
725
+ * reset is on offer; see useDeferredChartClick.
726
+ */
727
+ const deferredClick: DeferredChartClick = useDeferredChartClick(
728
+ Boolean(onTimeRangeReset),
729
+ );
730
+ /*
731
+ * Drag-to-select a time window, and the double-click that undoes a
732
+ * zoom, dropping the clicks it was made of; see useChartRangeSelection.
741
733
  */
742
- const pendingClickTimeoutRef: React.MutableRefObject<ReturnType<
743
- typeof setTimeout
744
- > | null> = React.useRef<ReturnType<typeof setTimeout> | null>(null);
734
+ const rangeSelection: ChartRangeSelection = useChartRangeSelection({
735
+ data: data,
736
+ index: index,
737
+ onTimeRangeSelect: onTimeRangeSelect,
738
+ onTimeRangeReset: onTimeRangeReset
739
+ ? (): void => {
740
+ deferredClick.cancel();
741
+ onTimeRangeReset();
742
+ }
743
+ : undefined,
744
+ });
745
745
  const categoryColors: Map<string, ChartColorValue> =
746
746
  constructCategoryColors(categories, colors);
747
747
 
748
- React.useEffect(() => {
749
- return () => {
750
- if (pendingClickTimeoutRef.current !== null) {
751
- clearTimeout(pendingClickTimeoutRef.current);
752
- pendingClickTimeoutRef.current = null;
753
- }
754
- };
755
- }, []);
756
-
757
748
  /*
758
749
  * Annotations are drawn onto the categorical axis, so the layer needs
759
750
  * the same x values recharts is drawing — not the source dates.
@@ -768,6 +759,20 @@ const AreaChart: React.ForwardRefExoticComponent<
768
759
  );
769
760
  }, [data, index]);
770
761
 
762
+ /*
763
+ * A clicked dot names its row by index, and after a zoom, a reset or a
764
+ * new range that index holds another bucket: drop it, with the series
765
+ * highlight it brought. A series picked from the legend still exists,
766
+ * so it stays picked.
767
+ */
768
+ useChartBucketsChange(categoryLabels, (): void => {
769
+ if (activeDot) {
770
+ setActiveDot(undefined);
771
+ setActiveLegend(undefined);
772
+ onValueChange?.(null);
773
+ }
774
+ });
775
+
771
776
  const annotations: UseChartAnnotationsResult = useChartAnnotations({
772
777
  formattedTimeReferenceLines,
773
778
  formattedReferenceRegions,
@@ -775,9 +780,7 @@ const AreaChart: React.ForwardRefExoticComponent<
775
780
  axisPaddingPx: paddingValue,
776
781
  scaleKind: "point",
777
782
  hasTopLegend: showLegend,
778
- isClickSuppressed: (): boolean => {
779
- return suppressNextClickRef.current;
780
- },
783
+ isClickSuppressed: rangeSelection.isClickSuppressed,
781
784
  });
782
785
 
783
786
  const yAxisDomain: (number | "auto")[] = getYAxisDomain(
@@ -797,13 +800,20 @@ const AreaChart: React.ForwardRefExoticComponent<
797
800
  event.stopPropagation();
798
801
 
799
802
  // Ignore the click that immediately follows a drag-to-select.
800
- if (suppressNextClickRef.current) {
803
+ if (rangeSelection.isClickSuppressed()) {
801
804
  return;
802
805
  }
803
806
 
804
807
  if (!hasOnValueChange) {
805
808
  return;
806
809
  }
810
+ deferredClick.run((): void => {
811
+ toggleDot(itemData);
812
+ });
813
+ }
814
+
815
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
816
+ function toggleDot(itemData: any): void {
807
817
  if (
808
818
  (itemData.index === activeDot?.index &&
809
819
  itemData.dataKey === activeDot?.dataKey) ||
@@ -830,7 +840,7 @@ const AreaChart: React.ForwardRefExoticComponent<
830
840
 
831
841
  function onCategoryClick(dataKey: string): void {
832
842
  // Ignore the click that immediately follows a drag-to-select.
833
- if (suppressNextClickRef.current) {
843
+ if (rangeSelection.isClickSuppressed()) {
834
844
  return;
835
845
  }
836
846
  if (!hasOnValueChange) {
@@ -854,151 +864,6 @@ const AreaChart: React.ForwardRefExoticComponent<
854
864
  setActiveDot(undefined);
855
865
  }
856
866
 
857
- function getRowIndexFromChartState(
858
- chartState: RangeSelectionChartState,
859
- ): number | null {
860
- const activeTooltipIndex: number | string | null | undefined =
861
- chartState.activeTooltipIndex;
862
- const numericIndex: number =
863
- typeof activeTooltipIndex === "number"
864
- ? activeTooltipIndex
865
- : Number(activeTooltipIndex);
866
- if (
867
- activeTooltipIndex !== undefined &&
868
- activeTooltipIndex !== null &&
869
- Number.isInteger(numericIndex) &&
870
- numericIndex >= 0 &&
871
- numericIndex < data.length
872
- ) {
873
- return numericIndex;
874
- }
875
- // Fall back to matching activeLabel against the row labels.
876
- if (chartState.activeLabel !== undefined) {
877
- const rowIndex: number = data.findIndex(
878
- (row: Record<string, unknown>) => {
879
- return row[index] === chartState.activeLabel;
880
- },
881
- );
882
- return rowIndex >= 0 ? rowIndex : null;
883
- }
884
- return null;
885
- }
886
-
887
- function getBucketDateAtIndex(rowIndex: number): Date | null {
888
- const rawDate: unknown = data[rowIndex]?.[CHART_DATA_POINT_DATE_KEY];
889
- return typeof rawDate === "number" ? new Date(rawDate) : null;
890
- }
891
-
892
- function handleRangeSelectMouseDown(
893
- chartState: RangeSelectionChartState,
894
- ): void {
895
- if (!hasOnTimeRangeSelect) {
896
- return;
897
- }
898
- const rowIndex: number | null = getRowIndexFromChartState(chartState);
899
- if (rowIndex === null) {
900
- return;
901
- }
902
- const rowLabel: unknown = data[rowIndex]?.[index];
903
- if (typeof rowLabel !== "string") {
904
- return;
905
- }
906
- isRangeSelecting.current = true;
907
- rangeSelectionStartIndexRef.current = rowIndex;
908
- rangeSelectionEndIndexRef.current = rowIndex;
909
- setRangeSelectionStart(rowLabel);
910
- setRangeSelectionEnd(null);
911
- }
912
-
913
- function handleRangeSelectMouseMove(
914
- chartState: RangeSelectionChartState,
915
- mouseEvent: React.MouseEvent<SVGGraphicsElement>,
916
- ): void {
917
- if (!isRangeSelecting.current) {
918
- return;
919
- }
920
- // Button was released outside the chart — abandon the selection.
921
- if (mouseEvent.buttons === 0) {
922
- isRangeSelecting.current = false;
923
- rangeSelectionStartIndexRef.current = null;
924
- rangeSelectionEndIndexRef.current = null;
925
- setRangeSelectionStart(null);
926
- setRangeSelectionEnd(null);
927
- return;
928
- }
929
- const rowIndex: number | null = getRowIndexFromChartState(chartState);
930
- if (rowIndex === null) {
931
- return;
932
- }
933
- const rowLabel: unknown = data[rowIndex]?.[index];
934
- if (typeof rowLabel !== "string") {
935
- return;
936
- }
937
- rangeSelectionEndIndexRef.current = rowIndex;
938
- setRangeSelectionEnd(rowLabel);
939
- }
940
-
941
- function handleRangeSelectMouseUp(): void {
942
- if (!isRangeSelecting.current) {
943
- return;
944
- }
945
- isRangeSelecting.current = false;
946
-
947
- const startIndex: number | null = rangeSelectionStartIndexRef.current;
948
- const endIndex: number | null = rangeSelectionEndIndexRef.current;
949
- rangeSelectionStartIndexRef.current = null;
950
- rangeSelectionEndIndexRef.current = null;
951
- setRangeSelectionStart(null);
952
- setRangeSelectionEnd(null);
953
-
954
- /*
955
- * A plain click (pointer never left the starting bucket) must keep
956
- * behaving exactly as before — only a real drag selects a range.
957
- */
958
- if (startIndex === null || endIndex === null || startIndex === endIndex) {
959
- return;
960
- }
961
-
962
- /*
963
- * The browser fires a click right after mouseup; swallow it so a
964
- * drag doesn't also toggle legend/dot selection. Cleared on a
965
- * timeout so a never-delivered click can't suppress a later one.
966
- */
967
- suppressNextClickRef.current = true;
968
- setTimeout(() => {
969
- suppressNextClickRef.current = false;
970
- }, 0);
971
-
972
- if (!onTimeRangeSelect) {
973
- return;
974
- }
975
-
976
- const lowerIndex: number = Math.min(startIndex, endIndex);
977
- const upperIndex: number = Math.max(startIndex, endIndex);
978
- const startDate: Date | null = getBucketDateAtIndex(lowerIndex);
979
- const lastBucketDate: Date | null = getBucketDateAtIndex(upperIndex);
980
- if (!startDate || !lastBucketDate) {
981
- return;
982
- }
983
-
984
- /*
985
- * Cover the full final bucket: its end is its start plus one
986
- * bucket width, derived from adjacent row dates.
987
- */
988
- const adjacentDate: Date | null =
989
- upperIndex > 0
990
- ? getBucketDateAtIndex(upperIndex - 1)
991
- : getBucketDateAtIndex(upperIndex + 1);
992
- const bucketWidthInMs: number = adjacentDate
993
- ? Math.abs(lastBucketDate.getTime() - adjacentDate.getTime())
994
- : 0;
995
- const endDate: Date = new Date(
996
- lastBucketDate.getTime() + bucketWidthInMs,
997
- );
998
-
999
- onTimeRangeSelect(startDate, endDate);
1000
- }
1001
-
1002
867
  /*
1003
868
  * The plain-click path, split out so it can either run inline (no
1004
869
  * reset handler) or be deferred behind the double-click window.
@@ -1018,28 +883,25 @@ const AreaChart: React.ForwardRefExoticComponent<
1018
883
  if (!onBucketClick) {
1019
884
  return;
1020
885
  }
1021
- const rowIndex: number | null = getRowIndexFromChartState(chartState);
886
+ const rowIndex: number | null = getChartRowIndex(data, index, chartState);
1022
887
  if (rowIndex === null) {
1023
888
  return;
1024
889
  }
1025
- const bucketStart: Date | null = getBucketDateAtIndex(rowIndex);
1026
- if (!bucketStart) {
1027
- return;
1028
- }
1029
890
  /*
1030
891
  * Cover the full bucket: width from adjacent row dates, the
1031
892
  * same derivation drag-to-select uses.
1032
893
  */
1033
- const adjacentBucketDate: Date | null =
1034
- rowIndex > 0
1035
- ? getBucketDateAtIndex(rowIndex - 1)
1036
- : getBucketDateAtIndex(rowIndex + 1);
1037
- const clickedBucketWidthInMs: number = adjacentBucketDate
1038
- ? Math.abs(bucketStart.getTime() - adjacentBucketDate.getTime())
1039
- : 0;
894
+ const bucket: ChartBucketWindow | null = getChartBucketWindow(
895
+ data,
896
+ rowIndex,
897
+ rowIndex,
898
+ );
899
+ if (!bucket) {
900
+ return;
901
+ }
1040
902
  onBucketClick(
1041
- bucketStart,
1042
- new Date(bucketStart.getTime() + clickedBucketWidthInMs),
903
+ bucket.start,
904
+ bucket.end,
1043
905
  (data[rowIndex] || {}) as Record<string, number | string>,
1044
906
  );
1045
907
  }
@@ -1049,7 +911,7 @@ const AreaChart: React.ForwardRefExoticComponent<
1049
911
  ref={ref}
1050
912
  className={cx(
1051
913
  "flex-1 w-full",
1052
- hasOnTimeRangeSelect && "cursor-crosshair",
914
+ rangeSelection.canSelect && "cursor-crosshair select-none",
1053
915
  className,
1054
916
  )}
1055
917
  {...other}
@@ -1070,47 +932,21 @@ const AreaChart: React.ForwardRefExoticComponent<
1070
932
  * accidentally sync with every other one.
1071
933
  */
1072
934
  {...(props.syncid ? { syncId: props.syncid.toString() } : {})}
1073
- {...(hasOnTimeRangeSelect
1074
- ? {
1075
- onMouseDown: handleRangeSelectMouseDown,
1076
- onMouseMove: handleRangeSelectMouseMove,
1077
- onMouseUp: handleRangeSelectMouseUp,
1078
- }
1079
- : {})}
935
+ {...rangeSelection.chartEventProps}
1080
936
  onClick={(chartState: RangeSelectionChartState) => {
1081
937
  // Ignore the click that follows a drag-to-select.
1082
- if (suppressNextClickRef.current) {
1083
- return;
1084
- }
1085
- if (!hasOnTimeRangeReset) {
1086
- handleChartClick(chartState);
938
+ if (rangeSelection.isClickSuppressed()) {
1087
939
  return;
1088
940
  }
1089
941
  /*
1090
- * Reset is on, so hold the click open: both clicks of a
1091
- * double-click arrive before dblclick does, and neither
1092
- * may pin a bucket. The second click re-arms the timer,
1093
- * dblclick clears it.
942
+ * With reset on, both clicks of a double-click arrive
943
+ * before dblclick does, and neither may pin a bucket: the
944
+ * second click re-arms the wait, dblclick drops it.
1094
945
  */
1095
- if (pendingClickTimeoutRef.current !== null) {
1096
- clearTimeout(pendingClickTimeoutRef.current);
1097
- }
1098
- pendingClickTimeoutRef.current = setTimeout(() => {
1099
- pendingClickTimeoutRef.current = null;
946
+ deferredClick.run((): void => {
1100
947
  handleChartClick(chartState);
1101
- }, DOUBLE_CLICK_DISAMBIGUATION_MS);
948
+ });
1102
949
  }}
1103
- {...(hasOnTimeRangeReset
1104
- ? {
1105
- onDoubleClick: () => {
1106
- if (pendingClickTimeoutRef.current !== null) {
1107
- clearTimeout(pendingClickTimeoutRef.current);
1108
- pendingClickTimeoutRef.current = null;
1109
- }
1110
- onTimeRangeReset?.();
1111
- },
1112
- }
1113
- : {})}
1114
950
  margin={{
1115
951
  bottom: (xAxisLabel
1116
952
  ? 40
@@ -1503,7 +1339,7 @@ const AreaChart: React.ForwardRefExoticComponent<
1503
1339
  // Never let an exemplar click also pin a bucket.
1504
1340
  stopChartEventPropagation(...args);
1505
1341
  // Ignore the click that follows a drag-to-select.
1506
- if (suppressNextClickRef.current) {
1342
+ if (rangeSelection.isClickSuppressed()) {
1507
1343
  return;
1508
1344
  }
1509
1345
  props.onExemplarClick?.(exemplar.original);
@@ -1525,10 +1361,11 @@ const AreaChart: React.ForwardRefExoticComponent<
1525
1361
  },
1526
1362
  )}
1527
1363
  {/* Live drag-to-select highlight */}
1528
- {rangeSelectionStart && rangeSelectionEnd ? (
1364
+ {rangeSelection.selectionStartLabel &&
1365
+ rangeSelection.selectionEndLabel ? (
1529
1366
  <ReferenceArea
1530
- x1={rangeSelectionStart}
1531
- x2={rangeSelectionEnd}
1367
+ x1={rangeSelection.selectionStartLabel}
1368
+ x2={rangeSelection.selectionEndLabel}
1532
1369
  fill="rgba(99,102,241,0.12)"
1533
1370
  stroke="rgba(99,102,241,0.5)"
1534
1371
  strokeWidth={1}
@@ -11,6 +11,7 @@ import {
11
11
  Label,
12
12
  BarChart as RechartsBarChart,
13
13
  Legend as RechartsLegend,
14
+ ReferenceArea,
14
15
  ReferenceLine,
15
16
  ResponsiveContainer,
16
17
  Tooltip,
@@ -18,6 +19,14 @@ import {
18
19
  YAxis,
19
20
  } from "recharts";
20
21
  import ChartReferenceLineProps from "../../Types/ReferenceLineProps";
22
+ import useChartRangeSelection, {
23
+ ChartRangeSelection,
24
+ } from "../Utils/UseChartRangeSelection";
25
+ import {
26
+ DeferredChartClick,
27
+ useDeferredChartClick,
28
+ } from "../Utils/DoubleClick";
29
+ import useChartBucketsChange from "../Utils/UseChartBucketsChange";
21
30
  import FormattedReferenceRegion from "../Types/FormattedReferenceRegion";
22
31
  import FormattedTimeReferenceLine from "../Types/FormattedTimeReferenceLine";
23
32
  import type { AxisDomain } from "recharts/types/util/types";
@@ -693,9 +702,17 @@ interface BarChartProps extends React.HTMLAttributes<HTMLDivElement> {
693
702
  formattedTimeReferenceLines?: Array<FormattedTimeReferenceLine> | undefined;
694
703
  formattedReferenceRegions?: Array<FormattedReferenceRegion> | undefined;
695
704
  /**
696
- * Double-click on the plot surface. Bar charts have no drag-to-select of
697
- * their own, but they sit on the same dashboards as line/area panels and
698
- * must offer the same way out of a board-wide zoom.
705
+ * Drag across bars to select the time window they cover: calls back with
706
+ * [start of the first bar, end of the last bar), the same window the
707
+ * line and area charts hand out. A press and release on one bar is a
708
+ * plain click and keeps its old meaning. Only a horizontal chart whose
709
+ * rows carry their bucket start (CHART_DATA_POINT_DATE_KEY, as the
710
+ * time-series wrapper's rows do) can select; a vertical chart ignores it.
711
+ */
712
+ onTimeRangeSelect?: ((startTime: Date, endTime: Date) => void) | undefined;
713
+ /**
714
+ * Double-click on the plot surface: the way out of whatever
715
+ * drag-to-select produced, on this chart or a neighbouring one.
699
716
  */
700
717
  onTimeRangeReset?: (() => void) | undefined;
701
718
  }
@@ -741,6 +758,7 @@ const BarChart: React.ForwardRefExoticComponent<
741
758
  customTooltip,
742
759
  formattedTimeReferenceLines,
743
760
  formattedReferenceRegions,
761
+ onTimeRangeSelect,
744
762
  onTimeRangeReset,
745
763
  ...other
746
764
  } = props;
@@ -754,6 +772,33 @@ const BarChart: React.ForwardRefExoticComponent<
754
772
  const categoryColors: Map<string, ChartColorValue> =
755
773
  constructCategoryColors(categories, colors);
756
774
 
775
+ /*
776
+ * Every click on the plot waits out the double-click window while a
777
+ * reset is on offer; see useDeferredChartClick.
778
+ */
779
+ const deferredClick: DeferredChartClick = useDeferredChartClick(
780
+ Boolean(onTimeRangeReset),
781
+ );
782
+
783
+ /*
784
+ * Drag-to-select a time window, and the double-click that undoes a
785
+ * zoom, dropping the clicks it was made of; see useChartRangeSelection.
786
+ * A drag needs the category axis to be the time axis, which is only
787
+ * true in horizontal layout; the double-click works in either.
788
+ */
789
+ const rangeSelection: ChartRangeSelection = useChartRangeSelection({
790
+ data: data,
791
+ index: index,
792
+ onTimeRangeSelect: onTimeRangeSelect,
793
+ enabled: layout !== "vertical",
794
+ onTimeRangeReset: onTimeRangeReset
795
+ ? (): void => {
796
+ deferredClick.cancel();
797
+ onTimeRangeReset();
798
+ }
799
+ : undefined,
800
+ });
801
+
757
802
  /*
758
803
  * Annotations are drawn onto the categorical axis, so the layer needs
759
804
  * the same x values recharts is drawing — not the source dates. A
@@ -779,10 +824,23 @@ const BarChart: React.ForwardRefExoticComponent<
779
824
  axisPaddingPx: paddingValue,
780
825
  scaleKind: "band",
781
826
  hasTopLegend: showLegend,
827
+ isClickSuppressed: rangeSelection.isClickSuppressed,
782
828
  });
783
829
  const [activeBar, setActiveBar] = React.useState<any | undefined>(
784
830
  undefined,
785
831
  );
832
+ /*
833
+ * A clicked bar is kept as a copy of its row. After a zoom, a reset or
834
+ * a new range no bar matches it any more, and every bar drew dimmed
835
+ * until the reader clicked the empty plot.
836
+ */
837
+ useChartBucketsChange(categoryLabels, (): void => {
838
+ if (activeBar) {
839
+ setActiveBar(undefined);
840
+ setActiveLegend(undefined);
841
+ onValueChange?.(null);
842
+ }
843
+ });
786
844
  const yAxisDomain: AxisDomain = getYAxisDomain(
787
845
  autoMinValue,
788
846
  minValue,
@@ -804,30 +862,47 @@ const BarChart: React.ForwardRefExoticComponent<
804
862
  React.useCallback(
805
863
  (data: any, _: any, event: React.MouseEvent): void => {
806
864
  event.stopPropagation();
807
- if (!onValueChange) {
865
+ // Ignore the click that immediately follows a drag-to-select.
866
+ if (rangeSelection.isClickSuppressed()) {
808
867
  return;
809
868
  }
810
- if (deepEqual(activeBar, { ...data.payload, value: data.value })) {
811
- setActiveLegend(undefined);
812
- setActiveBar(undefined);
813
- onValueChange?.(null);
814
- } else {
815
- setActiveLegend(data.tooltipPayload?.[0]?.dataKey);
816
- setActiveBar({
817
- ...data.payload,
818
- value: data.value,
819
- });
820
- onValueChange?.({
821
- eventType: "bar",
822
- categoryClicked: data.tooltipPayload?.[0]?.dataKey,
823
- ...data.payload,
824
- });
869
+ if (!onValueChange) {
870
+ return;
825
871
  }
872
+ deferredClick.run((): void => {
873
+ if (deepEqual(activeBar, { ...data.payload, value: data.value })) {
874
+ setActiveLegend(undefined);
875
+ setActiveBar(undefined);
876
+ onValueChange?.(null);
877
+ } else {
878
+ setActiveLegend(data.tooltipPayload?.[0]?.dataKey);
879
+ setActiveBar({
880
+ ...data.payload,
881
+ value: data.value,
882
+ });
883
+ onValueChange?.({
884
+ eventType: "bar",
885
+ categoryClicked: data.tooltipPayload?.[0]?.dataKey,
886
+ ...data.payload,
887
+ });
888
+ }
889
+ });
826
890
  },
827
- [activeBar, onValueChange, setActiveLegend, setActiveBar],
891
+ [
892
+ activeBar,
893
+ onValueChange,
894
+ setActiveLegend,
895
+ setActiveBar,
896
+ deferredClick,
897
+ rangeSelection.isClickSuppressed,
898
+ ],
828
899
  );
829
900
 
830
901
  function onCategoryClick(dataKey: string): void {
902
+ // Ignore the click that immediately follows a drag-to-select.
903
+ if (rangeSelection.isClickSuppressed()) {
904
+ return;
905
+ }
831
906
  if (!hasOnValueChange) {
832
907
  return;
833
908
  }
@@ -851,15 +926,25 @@ const BarChart: React.ForwardRefExoticComponent<
851
926
  };
852
927
 
853
928
  const handleChartClick: () => void = (): void => {
854
- setActiveBar(undefined);
855
- setActiveLegend(undefined);
856
- onValueChange?.(null);
929
+ // Ignore the click that immediately follows a drag-to-select.
930
+ if (rangeSelection.isClickSuppressed()) {
931
+ return;
932
+ }
933
+ deferredClick.run((): void => {
934
+ setActiveBar(undefined);
935
+ setActiveLegend(undefined);
936
+ onValueChange?.(null);
937
+ });
857
938
  };
858
939
 
859
940
  return (
860
941
  <div
861
942
  ref={forwardedRef}
862
- className={cx("flex-1 w-full", className)}
943
+ className={cx(
944
+ "flex-1 w-full",
945
+ rangeSelection.canSelect && "cursor-crosshair select-none",
946
+ className,
947
+ )}
863
948
  data-tremor-id="tremor-raw"
864
949
  {...other}
865
950
  >
@@ -879,18 +964,12 @@ const BarChart: React.ForwardRefExoticComponent<
879
964
  * accidentally sync with every other one.
880
965
  */
881
966
  {...(props.syncid ? { syncId: props.syncid.toString() } : {})}
967
+ {...rangeSelection.chartEventProps}
882
968
  {...(hasOnValueChange && (activeLegend || activeBar)
883
969
  ? {
884
970
  onClick: handleChartClick,
885
971
  }
886
972
  : {})}
887
- {...(onTimeRangeReset
888
- ? {
889
- onDoubleClick: () => {
890
- onTimeRangeReset();
891
- },
892
- }
893
- : {})}
894
973
  margin={{
895
974
  bottom: xAxisLabel ? 40 : showXAxis ? 24 : 8,
896
975
  left: yAxisLabel ? 20 : 0,
@@ -1172,6 +1251,18 @@ const BarChart: React.ForwardRefExoticComponent<
1172
1251
  * lives in the chip's hover card.
1173
1252
  */}
1174
1253
  {annotations.layer}
1254
+ {/* Live drag-to-select highlight */}
1255
+ {rangeSelection.selectionStartLabel &&
1256
+ rangeSelection.selectionEndLabel ? (
1257
+ <ReferenceArea
1258
+ x1={rangeSelection.selectionStartLabel}
1259
+ x2={rangeSelection.selectionEndLabel}
1260
+ fill="rgba(99,102,241,0.12)"
1261
+ stroke="rgba(99,102,241,0.5)"
1262
+ strokeWidth={1}
1263
+ radius={2}
1264
+ />
1265
+ ) : null}
1175
1266
  </RechartsBarChart>
1176
1267
  </ResponsiveContainer>
1177
1268
  {annotations.overlay}