@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
@@ -25,7 +25,13 @@ import ExemplarPoint from "../../Types/ExemplarPoint";
25
25
  import FormattedExemplarPoint from "../Types/FormattedExemplarPoint";
26
26
  import FormattedReferenceRegion from "../Types/FormattedReferenceRegion";
27
27
  import FormattedTimeReferenceLine from "../Types/FormattedTimeReferenceLine";
28
- import { CHART_DATA_POINT_DATE_KEY } from "../Types/ChartDataPoint";
28
+ import useChartRangeSelection, {
29
+ ChartBucketWindow,
30
+ ChartRangeSelection,
31
+ RangeSelectionChartState,
32
+ getChartBucketWindow,
33
+ getChartRowIndex,
34
+ } from "../Utils/UseChartRangeSelection";
29
35
  import { AxisDomain } from "recharts/types/util/types";
30
36
 
31
37
  import { useOnWindowResize } from "../Utils/UseWindowOnResize";
@@ -41,7 +47,11 @@ import useChartAnnotations, {
41
47
  UseChartAnnotationsResult,
42
48
  } from "../Annotations/UseChartAnnotations";
43
49
  import { cx } from "../Utils/Cx";
44
- import { DOUBLE_CLICK_DISAMBIGUATION_MS } from "../Utils/DoubleClick";
50
+ import {
51
+ DeferredChartClick,
52
+ useDeferredChartClick,
53
+ } from "../Utils/DoubleClick";
54
+ import useChartBucketsChange from "../Utils/UseChartBucketsChange";
45
55
  import { getYAxisDomain } from "../Utils/GetYAxisDomain";
46
56
  import { hasOnlyOneValueForKey } from "../Utils/HasOnlyOneValueForKey";
47
57
  import {
@@ -600,15 +610,6 @@ type BaseEventProps = {
600
610
 
601
611
  type LineChartEventProps = BaseEventProps | null | undefined;
602
612
 
603
- /*
604
- * Subset of the recharts MouseHandlerDataParam passed to chart-level
605
- * mouse handlers — just the fields range selection needs.
606
- */
607
- type RangeSelectionChartState = {
608
- activeTooltipIndex?: number | string | null | undefined;
609
- activeLabel?: string | number | undefined;
610
- };
611
-
612
613
  interface LineChartProps extends React.HTMLAttributes<HTMLDivElement> {
613
614
  data: Record<string, any>[];
614
615
  index: string;
@@ -728,41 +729,31 @@ const LineChart: React.ForwardRefExoticComponent<
728
729
  const [activeLegend, setActiveLegend] = React.useState<string | undefined>(
729
730
  undefined,
730
731
  );
731
- const hasOnTimeRangeSelect: boolean = Boolean(onTimeRangeSelect);
732
- const [rangeSelectionStart, setRangeSelectionStart] = React.useState<
733
- string | null
734
- >(null);
735
- const [rangeSelectionEnd, setRangeSelectionEnd] = React.useState<
736
- string | null
737
- >(null);
738
- const isRangeSelecting: React.MutableRefObject<boolean> =
739
- React.useRef<boolean>(false);
740
- const rangeSelectionStartIndexRef: React.MutableRefObject<number | null> =
741
- React.useRef<number | null>(null);
742
- const rangeSelectionEndIndexRef: React.MutableRefObject<number | null> =
743
- React.useRef<number | null>(null);
744
- const suppressNextClickRef: React.MutableRefObject<boolean> =
745
- React.useRef<boolean>(false);
746
- const hasOnTimeRangeReset: boolean = Boolean(onTimeRangeReset);
747
732
  /*
748
- * A pending single-click, held open long enough for a second click to
749
- * cancel it. Only armed when onTimeRangeReset is supplied.
733
+ * Every click on the plot waits out the double-click window while a
734
+ * reset is on offer; see useDeferredChartClick.
735
+ */
736
+ const deferredClick: DeferredChartClick = useDeferredChartClick(
737
+ Boolean(onTimeRangeReset),
738
+ );
739
+ /*
740
+ * Drag-to-select a time window, and the double-click that undoes a
741
+ * zoom, dropping the clicks it was made of; see useChartRangeSelection.
750
742
  */
751
- const pendingClickTimeoutRef: React.MutableRefObject<ReturnType<
752
- typeof setTimeout
753
- > | null> = React.useRef<ReturnType<typeof setTimeout> | null>(null);
743
+ const rangeSelection: ChartRangeSelection = useChartRangeSelection({
744
+ data: data,
745
+ index: index,
746
+ onTimeRangeSelect: onTimeRangeSelect,
747
+ onTimeRangeReset: onTimeRangeReset
748
+ ? (): void => {
749
+ deferredClick.cancel();
750
+ onTimeRangeReset();
751
+ }
752
+ : undefined,
753
+ });
754
754
  const categoryColors: Map<string, ChartColorValue> =
755
755
  constructCategoryColors(categories, colors);
756
756
 
757
- React.useEffect(() => {
758
- return () => {
759
- if (pendingClickTimeoutRef.current !== null) {
760
- clearTimeout(pendingClickTimeoutRef.current);
761
- pendingClickTimeoutRef.current = null;
762
- }
763
- };
764
- }, []);
765
-
766
757
  /*
767
758
  * Annotations are drawn onto the categorical axis, so the layer needs
768
759
  * the same x values recharts is drawing — not the source dates.
@@ -777,6 +768,20 @@ const LineChart: React.ForwardRefExoticComponent<
777
768
  );
778
769
  }, [data, index]);
779
770
 
771
+ /*
772
+ * A clicked dot names its row by index, and after a zoom, a reset or a
773
+ * new range that index holds another bucket: drop it, with the series
774
+ * highlight it brought. A series picked from the legend still exists,
775
+ * so it stays picked.
776
+ */
777
+ useChartBucketsChange(categoryLabels, (): void => {
778
+ if (activeDot) {
779
+ setActiveDot(undefined);
780
+ setActiveLegend(undefined);
781
+ onValueChange?.(null);
782
+ }
783
+ });
784
+
780
785
  const annotations: UseChartAnnotationsResult = useChartAnnotations({
781
786
  formattedTimeReferenceLines,
782
787
  formattedReferenceRegions,
@@ -784,9 +789,7 @@ const LineChart: React.ForwardRefExoticComponent<
784
789
  axisPaddingPx: paddingValue,
785
790
  scaleKind: "point",
786
791
  hasTopLegend: showLegend,
787
- isClickSuppressed: (): boolean => {
788
- return suppressNextClickRef.current;
789
- },
792
+ isClickSuppressed: rangeSelection.isClickSuppressed,
790
793
  });
791
794
 
792
795
  const yAxisDomain: (number | "auto")[] = getYAxisDomain(
@@ -804,13 +807,19 @@ const LineChart: React.ForwardRefExoticComponent<
804
807
  event.stopPropagation();
805
808
 
806
809
  // Ignore the click that immediately follows a drag-to-select.
807
- if (suppressNextClickRef.current) {
810
+ if (rangeSelection.isClickSuppressed()) {
808
811
  return;
809
812
  }
810
813
 
811
814
  if (!hasOnValueChange) {
812
815
  return;
813
816
  }
817
+ deferredClick.run((): void => {
818
+ toggleDot(itemData);
819
+ });
820
+ }
821
+
822
+ function toggleDot(itemData: any): void {
814
823
  if (
815
824
  (itemData.index === activeDot?.index &&
816
825
  itemData.dataKey === activeDot?.dataKey) ||
@@ -837,7 +846,7 @@ const LineChart: React.ForwardRefExoticComponent<
837
846
 
838
847
  function onCategoryClick(dataKey: string): void {
839
848
  // Ignore the click that immediately follows a drag-to-select.
840
- if (suppressNextClickRef.current) {
849
+ if (rangeSelection.isClickSuppressed()) {
841
850
  return;
842
851
  }
843
852
  if (!hasOnValueChange) {
@@ -861,151 +870,6 @@ const LineChart: React.ForwardRefExoticComponent<
861
870
  setActiveDot(undefined);
862
871
  }
863
872
 
864
- function getRowIndexFromChartState(
865
- chartState: RangeSelectionChartState,
866
- ): number | null {
867
- const activeTooltipIndex: number | string | null | undefined =
868
- chartState.activeTooltipIndex;
869
- const numericIndex: number =
870
- typeof activeTooltipIndex === "number"
871
- ? activeTooltipIndex
872
- : Number(activeTooltipIndex);
873
- if (
874
- activeTooltipIndex !== undefined &&
875
- activeTooltipIndex !== null &&
876
- Number.isInteger(numericIndex) &&
877
- numericIndex >= 0 &&
878
- numericIndex < data.length
879
- ) {
880
- return numericIndex;
881
- }
882
- // Fall back to matching activeLabel against the row labels.
883
- if (chartState.activeLabel !== undefined) {
884
- const rowIndex: number = data.findIndex(
885
- (row: Record<string, unknown>) => {
886
- return row[index] === chartState.activeLabel;
887
- },
888
- );
889
- return rowIndex >= 0 ? rowIndex : null;
890
- }
891
- return null;
892
- }
893
-
894
- function getBucketDateAtIndex(rowIndex: number): Date | null {
895
- const rawDate: unknown = data[rowIndex]?.[CHART_DATA_POINT_DATE_KEY];
896
- return typeof rawDate === "number" ? new Date(rawDate) : null;
897
- }
898
-
899
- function handleRangeSelectMouseDown(
900
- chartState: RangeSelectionChartState,
901
- ): void {
902
- if (!hasOnTimeRangeSelect) {
903
- return;
904
- }
905
- const rowIndex: number | null = getRowIndexFromChartState(chartState);
906
- if (rowIndex === null) {
907
- return;
908
- }
909
- const rowLabel: unknown = data[rowIndex]?.[index];
910
- if (typeof rowLabel !== "string") {
911
- return;
912
- }
913
- isRangeSelecting.current = true;
914
- rangeSelectionStartIndexRef.current = rowIndex;
915
- rangeSelectionEndIndexRef.current = rowIndex;
916
- setRangeSelectionStart(rowLabel);
917
- setRangeSelectionEnd(null);
918
- }
919
-
920
- function handleRangeSelectMouseMove(
921
- chartState: RangeSelectionChartState,
922
- mouseEvent: React.MouseEvent<SVGGraphicsElement>,
923
- ): void {
924
- if (!isRangeSelecting.current) {
925
- return;
926
- }
927
- // Button was released outside the chart — abandon the selection.
928
- if (mouseEvent.buttons === 0) {
929
- isRangeSelecting.current = false;
930
- rangeSelectionStartIndexRef.current = null;
931
- rangeSelectionEndIndexRef.current = null;
932
- setRangeSelectionStart(null);
933
- setRangeSelectionEnd(null);
934
- return;
935
- }
936
- const rowIndex: number | null = getRowIndexFromChartState(chartState);
937
- if (rowIndex === null) {
938
- return;
939
- }
940
- const rowLabel: unknown = data[rowIndex]?.[index];
941
- if (typeof rowLabel !== "string") {
942
- return;
943
- }
944
- rangeSelectionEndIndexRef.current = rowIndex;
945
- setRangeSelectionEnd(rowLabel);
946
- }
947
-
948
- function handleRangeSelectMouseUp(): void {
949
- if (!isRangeSelecting.current) {
950
- return;
951
- }
952
- isRangeSelecting.current = false;
953
-
954
- const startIndex: number | null = rangeSelectionStartIndexRef.current;
955
- const endIndex: number | null = rangeSelectionEndIndexRef.current;
956
- rangeSelectionStartIndexRef.current = null;
957
- rangeSelectionEndIndexRef.current = null;
958
- setRangeSelectionStart(null);
959
- setRangeSelectionEnd(null);
960
-
961
- /*
962
- * A plain click (pointer never left the starting bucket) must keep
963
- * behaving exactly as before — only a real drag selects a range.
964
- */
965
- if (startIndex === null || endIndex === null || startIndex === endIndex) {
966
- return;
967
- }
968
-
969
- /*
970
- * The browser fires a click right after mouseup; swallow it so a
971
- * drag doesn't also toggle legend/dot selection. Cleared on a
972
- * timeout so a never-delivered click can't suppress a later one.
973
- */
974
- suppressNextClickRef.current = true;
975
- setTimeout(() => {
976
- suppressNextClickRef.current = false;
977
- }, 0);
978
-
979
- if (!onTimeRangeSelect) {
980
- return;
981
- }
982
-
983
- const lowerIndex: number = Math.min(startIndex, endIndex);
984
- const upperIndex: number = Math.max(startIndex, endIndex);
985
- const startDate: Date | null = getBucketDateAtIndex(lowerIndex);
986
- const lastBucketDate: Date | null = getBucketDateAtIndex(upperIndex);
987
- if (!startDate || !lastBucketDate) {
988
- return;
989
- }
990
-
991
- /*
992
- * Cover the full final bucket: its end is its start plus one
993
- * bucket width, derived from adjacent row dates.
994
- */
995
- const adjacentDate: Date | null =
996
- upperIndex > 0
997
- ? getBucketDateAtIndex(upperIndex - 1)
998
- : getBucketDateAtIndex(upperIndex + 1);
999
- const bucketWidthInMs: number = adjacentDate
1000
- ? Math.abs(lastBucketDate.getTime() - adjacentDate.getTime())
1001
- : 0;
1002
- const endDate: Date = new Date(
1003
- lastBucketDate.getTime() + bucketWidthInMs,
1004
- );
1005
-
1006
- onTimeRangeSelect(startDate, endDate);
1007
- }
1008
-
1009
873
  /*
1010
874
  * The plain-click path, split out so it can either run inline (no
1011
875
  * reset handler) or be deferred behind the double-click window.
@@ -1025,28 +889,25 @@ const LineChart: React.ForwardRefExoticComponent<
1025
889
  if (!onBucketClick) {
1026
890
  return;
1027
891
  }
1028
- const rowIndex: number | null = getRowIndexFromChartState(chartState);
892
+ const rowIndex: number | null = getChartRowIndex(data, index, chartState);
1029
893
  if (rowIndex === null) {
1030
894
  return;
1031
895
  }
1032
- const bucketStart: Date | null = getBucketDateAtIndex(rowIndex);
1033
- if (!bucketStart) {
1034
- return;
1035
- }
1036
896
  /*
1037
897
  * Cover the full bucket: width from adjacent row dates, the
1038
898
  * same derivation drag-to-select uses.
1039
899
  */
1040
- const adjacentBucketDate: Date | null =
1041
- rowIndex > 0
1042
- ? getBucketDateAtIndex(rowIndex - 1)
1043
- : getBucketDateAtIndex(rowIndex + 1);
1044
- const clickedBucketWidthInMs: number = adjacentBucketDate
1045
- ? Math.abs(bucketStart.getTime() - adjacentBucketDate.getTime())
1046
- : 0;
900
+ const bucket: ChartBucketWindow | null = getChartBucketWindow(
901
+ data,
902
+ rowIndex,
903
+ rowIndex,
904
+ );
905
+ if (!bucket) {
906
+ return;
907
+ }
1047
908
  onBucketClick(
1048
- bucketStart,
1049
- new Date(bucketStart.getTime() + clickedBucketWidthInMs),
909
+ bucket.start,
910
+ bucket.end,
1050
911
  (data[rowIndex] || {}) as Record<string, number | string>,
1051
912
  );
1052
913
  }
@@ -1056,7 +917,7 @@ const LineChart: React.ForwardRefExoticComponent<
1056
917
  ref={ref}
1057
918
  className={cx(
1058
919
  "flex-1 w-full",
1059
- hasOnTimeRangeSelect && "cursor-crosshair",
920
+ rangeSelection.canSelect && "cursor-crosshair select-none",
1060
921
  className,
1061
922
  )}
1062
923
  {...other}
@@ -1077,47 +938,21 @@ const LineChart: React.ForwardRefExoticComponent<
1077
938
  * accidentally sync with every other one.
1078
939
  */
1079
940
  {...(props.syncid ? { syncId: props.syncid.toString() } : {})}
1080
- {...(hasOnTimeRangeSelect
1081
- ? {
1082
- onMouseDown: handleRangeSelectMouseDown,
1083
- onMouseMove: handleRangeSelectMouseMove,
1084
- onMouseUp: handleRangeSelectMouseUp,
1085
- }
1086
- : {})}
941
+ {...rangeSelection.chartEventProps}
1087
942
  onClick={(chartState: RangeSelectionChartState) => {
1088
943
  // Ignore the click that follows a drag-to-select.
1089
- if (suppressNextClickRef.current) {
1090
- return;
1091
- }
1092
- if (!hasOnTimeRangeReset) {
1093
- handleChartClick(chartState);
944
+ if (rangeSelection.isClickSuppressed()) {
1094
945
  return;
1095
946
  }
1096
947
  /*
1097
- * Reset is on, so hold the click open: both clicks of a
1098
- * double-click arrive before dblclick does, and neither
1099
- * may pin a bucket. The second click re-arms the timer,
1100
- * dblclick clears it.
948
+ * With reset on, both clicks of a double-click arrive
949
+ * before dblclick does, and neither may pin a bucket: the
950
+ * second click re-arms the wait, dblclick drops it.
1101
951
  */
1102
- if (pendingClickTimeoutRef.current !== null) {
1103
- clearTimeout(pendingClickTimeoutRef.current);
1104
- }
1105
- pendingClickTimeoutRef.current = setTimeout(() => {
1106
- pendingClickTimeoutRef.current = null;
952
+ deferredClick.run((): void => {
1107
953
  handleChartClick(chartState);
1108
- }, DOUBLE_CLICK_DISAMBIGUATION_MS);
954
+ });
1109
955
  }}
1110
- {...(hasOnTimeRangeReset
1111
- ? {
1112
- onDoubleClick: () => {
1113
- if (pendingClickTimeoutRef.current !== null) {
1114
- clearTimeout(pendingClickTimeoutRef.current);
1115
- pendingClickTimeoutRef.current = null;
1116
- }
1117
- onTimeRangeReset?.();
1118
- },
1119
- }
1120
- : {})}
1121
956
  margin={{
1122
957
  /*
1123
958
  * Tick labels are 10px font with a translate(0, 6) — they
@@ -1443,10 +1278,25 @@ const LineChart: React.ForwardRefExoticComponent<
1443
1278
  tooltipType="none"
1444
1279
  strokeWidth={12}
1445
1280
  connectNulls={connectNulls}
1281
+ /*
1282
+ * The 12px band is the target. Dots here are
1283
+ * invisible nodes a press could land on, and an
1284
+ * animated redraw (after a zoom, say) swaps them
1285
+ * out from under a double-click.
1286
+ */
1287
+ dot={false}
1288
+ activeDot={false}
1289
+ isAnimationActive={false}
1446
1290
  onClick={(props: any, event: any) => {
1447
1291
  event.stopPropagation();
1292
+ // A drag's trailing click toggles nothing.
1293
+ if (rangeSelection.isClickSuppressed()) {
1294
+ return;
1295
+ }
1448
1296
  const { name } = props;
1449
- onCategoryClick(name);
1297
+ deferredClick.run((): void => {
1298
+ onCategoryClick(name);
1299
+ });
1450
1300
  }}
1451
1301
  />
1452
1302
  );
@@ -1499,7 +1349,7 @@ const LineChart: React.ForwardRefExoticComponent<
1499
1349
  // Never let an exemplar click also pin a bucket.
1500
1350
  stopChartEventPropagation(...args);
1501
1351
  // Ignore the click that follows a drag-to-select.
1502
- if (suppressNextClickRef.current) {
1352
+ if (rangeSelection.isClickSuppressed()) {
1503
1353
  return;
1504
1354
  }
1505
1355
  props.onExemplarClick?.(exemplar.original);
@@ -1521,10 +1371,11 @@ const LineChart: React.ForwardRefExoticComponent<
1521
1371
  },
1522
1372
  )}
1523
1373
  {/* Live drag-to-select highlight */}
1524
- {rangeSelectionStart && rangeSelectionEnd ? (
1374
+ {rangeSelection.selectionStartLabel &&
1375
+ rangeSelection.selectionEndLabel ? (
1525
1376
  <ReferenceArea
1526
- x1={rangeSelectionStart}
1527
- x2={rangeSelectionEnd}
1377
+ x1={rangeSelection.selectionStartLabel}
1378
+ x2={rangeSelection.selectionEndLabel}
1528
1379
  fill="rgba(99,102,241,0.12)"
1529
1380
  stroke="rgba(99,102,241,0.5)"
1530
1381
  strokeWidth={1}
@@ -1,3 +1,5 @@
1
+ import React from "react";
2
+
1
3
  /**
2
4
  * How long a chart holds a single click open, waiting to see whether it is
3
5
  * really the first half of a double-click.
@@ -11,3 +13,215 @@
11
13
  * feels immediate. Charts with no reset handler skip the wait entirely.
12
14
  */
13
15
  export const DOUBLE_CLICK_DISAMBIGUATION_MS: number = 250;
16
+
17
+ export interface DeferredChartClick {
18
+ /*
19
+ * Runs a click's action: at once while no double-click is on offer,
20
+ * else once DOUBLE_CLICK_DISAMBIGUATION_MS pass with no dblclick. A
21
+ * later click replaces a pending one.
22
+ */
23
+ run: (action: () => void) => void;
24
+ // For the chart's dblclick: drops the clicks it was made of.
25
+ cancel: () => void;
26
+ }
27
+
28
+ /**
29
+ * Holds every click action on a chart's plot (a bucket click, a series,
30
+ * dot or bar toggle) open while a double-click reset is on offer, so a
31
+ * double-click is not also two clicks.
32
+ *
33
+ * Holding them also keeps the chart from re-rendering between the two
34
+ * clicks and the dblclick. Chrome sends dblclick to the node the second
35
+ * click landed on, straight after that click; an action that re-renders
36
+ * the chart there (a series toggle - recharts re-keys a line's path when
37
+ * its props change) takes that node out of the page first, the dblclick
38
+ * never reaches the chart, and the zoom is not reset.
39
+ */
40
+ export function useDeferredChartClick(isArmed: boolean): DeferredChartClick {
41
+ const pendingClickRef: React.MutableRefObject<ReturnType<
42
+ typeof setTimeout
43
+ > | null> = React.useRef<ReturnType<typeof setTimeout> | null>(null);
44
+
45
+ const cancel: () => void = React.useCallback((): void => {
46
+ if (pendingClickRef.current !== null) {
47
+ clearTimeout(pendingClickRef.current);
48
+ pendingClickRef.current = null;
49
+ }
50
+ }, []);
51
+
52
+ React.useEffect(() => {
53
+ return cancel;
54
+ }, [cancel]);
55
+
56
+ const run: (action: () => void) => void = React.useCallback(
57
+ (action: () => void): void => {
58
+ if (!isArmed) {
59
+ action();
60
+ return;
61
+ }
62
+ cancel();
63
+ pendingClickRef.current = setTimeout(() => {
64
+ pendingClickRef.current = null;
65
+ action();
66
+ }, DOUBLE_CLICK_DISAMBIGUATION_MS);
67
+ },
68
+ [isArmed, cancel],
69
+ );
70
+
71
+ return React.useMemo((): DeferredChartClick => {
72
+ return { run: run, cancel: cancel };
73
+ }, [run, cancel]);
74
+ }
75
+
76
+ /*
77
+ * The part of a press or release a chart's handlers read. recharts hands a
78
+ * chart-level mouse handler the React event as its second argument.
79
+ */
80
+ export interface ChartPointerEvent {
81
+ // The browser's click count: 2 on both halves of a double-click's second click.
82
+ detail?: number | undefined;
83
+ clientX?: number | undefined;
84
+ button?: number | undefined;
85
+ }
86
+
87
+ /**
88
+ * Whether a press is the second of a double-click, by the browser's own
89
+ * count (MouseEvent.detail), so the platform's double-click time and
90
+ * distance decide, exactly as they decide when `dblclick` is sent: at a
91
+ * count of 2, not at the third press of a triple-click.
92
+ */
93
+ export function isSecondPressOfDoubleClick(
94
+ event?: ChartPointerEvent | null,
95
+ ): boolean {
96
+ if (!event || event.detail !== 2) {
97
+ return false;
98
+ }
99
+
100
+ // Only the main button: a right-click opens a context menu.
101
+ return !event.button;
102
+ }
103
+
104
+ export interface DoubleClickReset {
105
+ /*
106
+ * For every press on the chart. True when the press is the second of a
107
+ * double-click while a reset is on offer: that press IS the reset, so
108
+ * it must neither start a selection nor count as a click.
109
+ */
110
+ onPress: (event?: ChartPointerEvent | null) => boolean;
111
+ /*
112
+ * For the release of a press on the chart, or heard by the page. True
113
+ * when it ended the reset press, which the caller must then not handle
114
+ * as anything else.
115
+ */
116
+ onRelease: (event?: ChartPointerEvent | null) => boolean;
117
+ /*
118
+ * Whether a reset is armed for the next task: true from the release of
119
+ * the reset press until it runs or a dblclick does it first. False when
120
+ * that release was a fresh click's (see onRelease).
121
+ */
122
+ willReset: () => boolean;
123
+ // The chart's dblclick handler.
124
+ onDoubleClick: () => void;
125
+ }
126
+
127
+ /**
128
+ * Double-click to reset, without depending on the browser's `dblclick`
129
+ * arriving.
130
+ *
131
+ * Chrome sends `dblclick` to the node the second click landed on, straight
132
+ * after that click, and sends neither when that node left the page during
133
+ * the press. A chart re-renders under a press whenever fresh data lands:
134
+ * recharts re-keys a histogram's bars and a line's path when their data
135
+ * changes. And fresh data lands right after a zoom - the very moment a
136
+ * reader double-clicks to undo it - so the reset was lost at random, and
137
+ * the chart stayed zoomed (issue #4116).
138
+ *
139
+ * The second press itself always arrives, counted: MouseEvent.detail is 2
140
+ * whatever becomes of the node it landed on. Its release arms a reset for
141
+ * the next task. Chrome sends the release's click and `dblclick` before
142
+ * then, and the `dblclick` resets and stands the fallback down, so a
143
+ * double-click that keeps its `dblclick` resets exactly as it always has,
144
+ * and one that lost it still resets.
145
+ *
146
+ * `reset` is read when the reset happens, so a chart can hand a new one
147
+ * every render; with none, there is no reset on offer.
148
+ */
149
+ export function useDoubleClickReset(
150
+ reset: (() => void) | undefined,
151
+ ): DoubleClickReset {
152
+ const resetRef: React.MutableRefObject<(() => void) | undefined> =
153
+ React.useRef<(() => void) | undefined>(reset);
154
+ resetRef.current = reset;
155
+
156
+ // Whether the press in progress is the second of a double-click.
157
+ const isResetPressRef: React.MutableRefObject<boolean> =
158
+ React.useRef<boolean>(false);
159
+ const fallbackRef: React.MutableRefObject<ReturnType<
160
+ typeof setTimeout
161
+ > | null> = React.useRef<ReturnType<typeof setTimeout> | null>(null);
162
+
163
+ const standDown: () => void = React.useCallback((): void => {
164
+ if (fallbackRef.current !== null) {
165
+ clearTimeout(fallbackRef.current);
166
+ fallbackRef.current = null;
167
+ }
168
+ }, []);
169
+
170
+ React.useEffect(() => {
171
+ return standDown;
172
+ }, [standDown]);
173
+
174
+ const onPress: (event?: ChartPointerEvent | null) => boolean =
175
+ React.useCallback((event?: ChartPointerEvent | null): boolean => {
176
+ isResetPressRef.current =
177
+ Boolean(resetRef.current) && isSecondPressOfDoubleClick(event);
178
+ return isResetPressRef.current;
179
+ }, []);
180
+
181
+ const onRelease: (event?: ChartPointerEvent | null) => boolean =
182
+ React.useCallback(
183
+ (event?: ChartPointerEvent | null): boolean => {
184
+ if (!isResetPressRef.current) {
185
+ return false;
186
+ }
187
+
188
+ isResetPressRef.current = false;
189
+
190
+ /*
191
+ * The release of a fresh single click cannot end the second press:
192
+ * that press's own release never came (the window lost focus while
193
+ * the button was down, say), and this one belongs to a later click.
194
+ * It ends the reset press without resetting.
195
+ */
196
+ if (event && event.detail === 1) {
197
+ return true;
198
+ }
199
+
200
+ standDown();
201
+ fallbackRef.current = setTimeout(() => {
202
+ fallbackRef.current = null;
203
+ resetRef.current?.();
204
+ }, 0);
205
+ return true;
206
+ },
207
+ [standDown],
208
+ );
209
+
210
+ const willReset: () => boolean = React.useCallback((): boolean => {
211
+ return fallbackRef.current !== null;
212
+ }, []);
213
+
214
+ const onDoubleClick: () => void = React.useCallback((): void => {
215
+ standDown();
216
+ resetRef.current?.();
217
+ }, [standDown]);
218
+
219
+ return React.useMemo((): DoubleClickReset => {
220
+ return {
221
+ onPress: onPress,
222
+ onRelease: onRelease,
223
+ willReset: willReset,
224
+ onDoubleClick: onDoubleClick,
225
+ };
226
+ }, [onPress, onRelease, willReset, onDoubleClick]);
227
+ }