@oneuptime/common 14.0.8 → 14.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (639) hide show
  1. package/Models/DatabaseModels/Index.ts +2 -0
  2. package/Models/DatabaseModels/KubernetesAiAgent.ts +364 -0
  3. package/Models/DatabaseModels/KubernetesCluster.ts +3 -3
  4. package/Models/DatabaseModels/Project.ts +55 -5
  5. package/Models/DatabaseModels/ProxmoxResource.ts +49 -1
  6. package/Models/DatabaseModels/RunnerJob.ts +75 -0
  7. package/Models/DatabaseModels/TeamComplianceSetting.ts +143 -2
  8. package/Models/DatabaseModels/WorkspaceProjectAuthToken.ts +17 -0
  9. package/Server/API/AIChatAPI.ts +6 -3
  10. package/Server/API/AIInvestigationAPI.ts +17 -10
  11. package/Server/API/AutoRemediationAPI.ts +207 -25
  12. package/Server/API/KubernetesClusterAiAccessAPI.ts +623 -21
  13. package/Server/API/MicrosoftTeamsAPI.ts +93 -14
  14. package/Server/API/ProxmoxResourceAPI.ts +244 -14
  15. package/Server/Infrastructure/GlobalCache.ts +32 -0
  16. package/Server/Infrastructure/Postgres/SchemaMigrations/1796000000000-AddTeamComplianceRuleScope.ts +99 -0
  17. package/Server/Infrastructure/Postgres/SchemaMigrations/1796100000000-AddKubernetesAiAgentAndAiDefaults.ts +137 -0
  18. package/Server/Infrastructure/Postgres/SchemaMigrations/1796200000000-AddProxmoxResourceNativePushColumns.ts +42 -0
  19. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +6 -0
  20. package/Server/Middleware/TelemetryIngest.ts +41 -18
  21. package/Server/Services/AIService.ts +70 -1
  22. package/Server/Services/AlertService.ts +352 -11
  23. package/Server/Services/AlertSeverityService.ts +65 -15
  24. package/Server/Services/AutoRemediationRuleService.ts +1 -1
  25. package/Server/Services/IncidentService.ts +280 -104
  26. package/Server/Services/IncidentSeverityService.ts +66 -15
  27. package/Server/Services/KubernetesAiAgentJobService.ts +185 -0
  28. package/Server/Services/KubernetesAiAgentService.ts +1634 -0
  29. package/Server/Services/KubernetesClusterAiAccessService.ts +1118 -451
  30. package/Server/Services/KubernetesClusterService.ts +129 -21
  31. package/Server/Services/ProjectService.ts +32 -0
  32. package/Server/Services/ProxmoxResourceService.ts +322 -5
  33. package/Server/Services/RunnerJobService.ts +241 -104
  34. package/Server/Services/RunnerService.ts +1 -1
  35. package/Server/Services/ScheduledMaintenanceService.ts +737 -1
  36. package/Server/Services/ScheduledMaintenanceStateTimelineService.ts +414 -56
  37. package/Server/Services/TeamComplianceSettingService.ts +1125 -9
  38. package/Server/Utils/AI/ClusterAccess/ClusterAccessContext.ts +67 -9
  39. package/Server/Utils/AI/ClusterAccess/KubectlInvestigationToolkit.ts +39 -10
  40. package/Server/Utils/AI/ClusterAccess/KubectlJobRunner.ts +14 -3
  41. package/Server/Utils/AI/Remediation/RemediationCommandTools.ts +37 -15
  42. package/Server/Utils/AI/Remediation/RemediationExecutionRunner.ts +67 -24
  43. package/Server/Utils/AI/SRE/AIInvestigationEngine.ts +48 -5
  44. package/Server/Utils/AI/SRE/IncidentPostmortemRunner.ts +40 -8
  45. package/Server/Utils/AI/SRE/InvestigationEligibility.ts +13 -2
  46. package/Server/Utils/AI/SRE/InvestigationGrader.ts +1 -1
  47. package/Server/Utils/AutoRemediation/CommandPlanExecutor.ts +6 -1
  48. package/Server/Utils/Telemetry/InventoryEntityRegistry.ts +133 -7
  49. package/Server/Utils/Telemetry/ProxmoxCephSnapshotScan.ts +58 -4
  50. package/Server/Utils/Telemetry/ProxmoxNativeNodeLiveness.ts +447 -0
  51. package/Server/Utils/Telemetry/ProxmoxNativePush.ts +903 -0
  52. package/Server/Utils/Telemetry/TelemetryEntity.ts +87 -27
  53. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +684 -47
  54. package/Tests/App/AdminDashboard/RowActionPlacementOverrides.test.tsx +278 -0
  55. package/Tests/App/Dashboard/AIChatChartWidgetZoom.test.tsx +738 -0
  56. package/Tests/App/Dashboard/AIFeaturesSettingsPointers.test.tsx +147 -0
  57. package/Tests/App/Dashboard/AIInsightsKubernetesClusterPage.test.tsx +1523 -0
  58. package/Tests/App/Dashboard/AdminUserNotificationMethodsPage.test.tsx +463 -3
  59. package/Tests/App/Dashboard/AffectedResourcesPickerDropdownPlacement.test.tsx +958 -0
  60. package/Tests/App/Dashboard/AffectedResourcesPickerFocusLeave.test.tsx +595 -0
  61. package/Tests/App/Dashboard/AskAiAvailability.test.ts +20 -3
  62. package/Tests/App/Dashboard/AskAiDisabled.test.tsx +8 -3
  63. package/Tests/App/Dashboard/CephRateChartReload.test.tsx +1456 -0
  64. package/Tests/App/Dashboard/CephTimeRangeZoom.test.tsx +1229 -0
  65. package/Tests/App/Dashboard/ChartCardTimeRangeZoom.test.tsx +151 -0
  66. package/Tests/App/Dashboard/ChartCardZoomAffordances.test.tsx +257 -0
  67. package/Tests/App/Dashboard/ChartRefetchFrame.test.tsx +141 -0
  68. package/Tests/App/Dashboard/ChartZoomHarness.tsx +249 -0
  69. package/Tests/App/Dashboard/ChartZoomStandIn.tsx +131 -0
  70. package/Tests/App/Dashboard/CloudServerlessSlowLoads.test.tsx +628 -0
  71. package/Tests/App/Dashboard/CloudServerlessTimeRangeZoom.test.tsx +607 -0
  72. package/Tests/App/Dashboard/ClusterAccessNotice.test.tsx +91 -19
  73. package/Tests/App/Dashboard/CompanionMetricsTabZoom.test.tsx +632 -0
  74. package/Tests/App/Dashboard/ContainerChartZoomStandIn.tsx +195 -0
  75. package/Tests/App/Dashboard/ContainerHostOverviewSlowLoads.test.tsx +542 -0
  76. package/Tests/App/Dashboard/ContainerHostOverviewTimeRangeZoom.test.tsx +848 -0
  77. package/Tests/App/Dashboard/ContainerMetricsTimeRangeZoom.test.tsx +561 -0
  78. package/Tests/App/Dashboard/DashboardBoardWideZoomShell.test.tsx +1147 -0
  79. package/Tests/App/Dashboard/DashboardEditPermissions.test.tsx +3 -2
  80. package/Tests/App/Dashboard/DashboardHistogramWidgetDragCursor.test.tsx +399 -0
  81. package/Tests/App/Dashboard/DashboardHistogramWidgetZoom.test.tsx +985 -0
  82. package/Tests/App/Dashboard/DashboardHistogramWidgetZoomHint.test.tsx +803 -0
  83. package/Tests/App/Dashboard/DashboardLazyPages.test.tsx +1 -0
  84. package/Tests/App/Dashboard/DashboardSettingsPreviewZoom.test.tsx +679 -0
  85. package/Tests/App/Dashboard/DashboardSloAndDataSourceChartZoom.test.tsx +881 -0
  86. package/Tests/App/Dashboard/DashboardTraceStatusWidgets.test.tsx +878 -0
  87. package/Tests/App/Dashboard/DatabaseMetricChartModalTimeRangeZoom.test.tsx +442 -0
  88. package/Tests/App/Dashboard/DatabaseOverviewTimeRangeZoom.test.tsx +831 -0
  89. package/Tests/App/Dashboard/DatabaseServerComponents.test.tsx +43 -0
  90. package/Tests/App/Dashboard/DockerSwarmInsightsTimeRangeZoom.test.tsx +524 -0
  91. package/Tests/App/Dashboard/DockerSwarmRateChartRefresh.test.tsx +259 -0
  92. package/Tests/App/Dashboard/EdgeDetailPanelHistory.test.tsx +763 -0
  93. package/Tests/App/Dashboard/EdgeDetailPanelTimeRangeZoom.test.tsx +547 -0
  94. package/Tests/App/Dashboard/EdgeHistoryBucketsCases.tsx +565 -0
  95. package/Tests/App/Dashboard/EdgeHistoryBucketsKathmandu.test.tsx +73 -0
  96. package/Tests/App/Dashboard/EdgeHistoryBucketsKolkata.test.tsx +74 -0
  97. package/Tests/App/Dashboard/EdgeHistoryBucketsNewYork.test.tsx +72 -0
  98. package/Tests/App/Dashboard/EdgeHistoryBucketsUtc.test.tsx +72 -0
  99. package/Tests/App/Dashboard/EmbeddedMetricCardRefresh.test.tsx +310 -0
  100. package/Tests/App/Dashboard/EmbeddedMetricCardTimeRangeZoom.test.tsx +536 -0
  101. package/Tests/App/Dashboard/EscalationRuleReadiness.test.tsx +3 -1
  102. package/Tests/App/Dashboard/EscalationRuleRowActions.test.tsx +660 -0
  103. package/Tests/App/Dashboard/EventNotes.test.tsx +2 -2
  104. package/Tests/App/Dashboard/EventOverviewPages.test.tsx +587 -13
  105. package/Tests/App/Dashboard/EventOverviewSnapshotExplorerZoom.test.tsx +1139 -0
  106. package/Tests/App/Dashboard/EventOverviewSnapshotZoomAcrossTabs.test.tsx +1057 -0
  107. package/Tests/App/Dashboard/EventOverviewTelemetrySnapshotZoom.test.tsx +757 -0
  108. package/Tests/App/Dashboard/ExceptionOccurrenceTrendZoom.test.tsx +675 -0
  109. package/Tests/App/Dashboard/ExceptionOccurrencesZoomSurvivesViewSwitch.test.tsx +405 -0
  110. package/Tests/App/Dashboard/ExceptionSignalPages.test.tsx +67 -3
  111. package/Tests/App/Dashboard/ExceptionTablesSpanStatus.test.tsx +515 -0
  112. package/Tests/App/Dashboard/ExplorerOwnZoomRegression.test.tsx +739 -0
  113. package/Tests/App/Dashboard/FlowBandwidthAxisCases.tsx +461 -0
  114. package/Tests/App/Dashboard/FlowBandwidthAxisKathmandu.test.tsx +25 -0
  115. package/Tests/App/Dashboard/FlowBandwidthAxisKolkata.test.tsx +25 -0
  116. package/Tests/App/Dashboard/FlowBandwidthAxisNewYork.test.tsx +25 -0
  117. package/Tests/App/Dashboard/FlowBandwidthAxisUtc.test.tsx +24 -0
  118. package/Tests/App/Dashboard/FlowTopTalkersZoomRefetch.test.tsx +722 -0
  119. package/Tests/App/Dashboard/FlowViewportGuard.test.tsx +2526 -0
  120. package/Tests/App/Dashboard/HostPagesSlowLoads.test.tsx +872 -0
  121. package/Tests/App/Dashboard/HostPagesTimeRangeZoom.test.tsx +1208 -0
  122. package/Tests/App/Dashboard/IncidentRootCauseTimeRangeZoom.test.tsx +358 -0
  123. package/Tests/App/Dashboard/InfrastructureGraph.test.tsx +100 -9
  124. package/Tests/App/Dashboard/InfrastructureMetricsTabTimeRangeZoom.test.tsx +485 -0
  125. package/Tests/App/Dashboard/InvestigationDrawerCompanionZoom.test.tsx +655 -0
  126. package/Tests/App/Dashboard/InvestigationDrawerZoom.test.tsx +830 -0
  127. package/Tests/App/Dashboard/InvestigationNotStarted.test.tsx +338 -2
  128. package/Tests/App/Dashboard/InvoicesPayInvoice.test.tsx +454 -16
  129. package/Tests/App/Dashboard/KubernetesClusterAiAccessSettings.test.ts +799 -819
  130. package/Tests/App/Dashboard/KubernetesClusterAiAgentOverviewCard.test.tsx +367 -0
  131. package/Tests/App/Dashboard/KubernetesClusterAiAgentStatus.test.ts +1202 -0
  132. package/Tests/App/Dashboard/KubernetesClusterAiDocumentationMarkdown.test.ts +106 -0
  133. package/Tests/App/Dashboard/KubernetesClusterAiNavigation.test.tsx +354 -0
  134. package/Tests/App/Dashboard/KubernetesClusterAiPage.test.tsx +1884 -2054
  135. package/Tests/App/Dashboard/KubernetesClusterAiPageServerParity.test.ts +478 -179
  136. package/Tests/App/Dashboard/KubernetesClusterMetricTooltips.test.ts +50 -0
  137. package/Tests/App/Dashboard/KubernetesClusterOverviewTooltips.test.tsx +2 -1
  138. package/Tests/App/Dashboard/KubernetesClusterOverviewZoom.test.tsx +1217 -0
  139. package/Tests/App/Dashboard/KubernetesClusterPagesZoom.test.tsx +731 -0
  140. package/Tests/App/Dashboard/KubernetesCostsLoadRecovery.test.tsx +869 -0
  141. package/Tests/App/Dashboard/KubernetesCostsZoom.test.tsx +1214 -0
  142. package/Tests/App/Dashboard/KubernetesCostsZoomExactHours.test.tsx +692 -0
  143. package/Tests/App/Dashboard/KubernetesNetworkThroughputReload.test.tsx +902 -0
  144. package/Tests/App/Dashboard/KubernetesNetworkZoomBucketEdges.test.tsx +571 -0
  145. package/Tests/App/Dashboard/KubernetesOverviewZoomBucketEdges.test.tsx +697 -0
  146. package/Tests/App/Dashboard/KubernetesResourceMetricsTabZoom.test.tsx +633 -0
  147. package/Tests/App/Dashboard/LogsExplorerTimeRangeZoom.test.tsx +470 -0
  148. package/Tests/App/Dashboard/LogsInsightsTimeRangeZoom.test.tsx +948 -0
  149. package/Tests/App/Dashboard/LogsViewerPinnedWindowZoom.test.tsx +486 -0
  150. package/Tests/App/Dashboard/MetricChartsBucketInspectorDoubleClick.test.tsx +1001 -0
  151. package/Tests/App/Dashboard/MetricExplorerInvestigationAutoRefresh.test.tsx +514 -0
  152. package/Tests/App/Dashboard/MetricExplorerSavedViewZoomRoundTrip.test.tsx +581 -0
  153. package/Tests/App/Dashboard/MetricExplorerTimeRangeZoom.test.tsx +1162 -0
  154. package/Tests/App/Dashboard/MetricMonitorPreviewZoomLabel.test.ts +72 -0
  155. package/Tests/App/Dashboard/MetricRowSparklineTimeRangeZoom.test.tsx +204 -0
  156. package/Tests/App/Dashboard/MetricViewFirstResultLands.test.tsx +408 -0
  157. package/Tests/App/Dashboard/MetricViewOwnZoomResetPlacement.test.tsx +952 -0
  158. package/Tests/App/Dashboard/MetricViewTimeRange.test.ts +139 -0
  159. package/Tests/App/Dashboard/MetricViewTimeRangeZoom.test.tsx +556 -0
  160. package/Tests/App/Dashboard/MonitorMetricsChartWrappersZoom.test.tsx +552 -0
  161. package/Tests/App/Dashboard/MonitorMetricsTabsTimeRangeZoom.test.tsx +740 -0
  162. package/Tests/App/Dashboard/MonitorOverviewChartsTimeRangeZoom.test.tsx +735 -0
  163. package/Tests/App/Dashboard/MonitorStepPreviewsTimeRangeZoom.test.tsx +835 -0
  164. package/Tests/App/Dashboard/NetworkDeviceTimeRangeZoom.test.tsx +1115 -0
  165. package/Tests/App/Dashboard/OnCallPreventionGuards.test.tsx +186 -17
  166. package/Tests/App/Dashboard/OnCallRulesDeleteGuard.test.tsx +155 -46
  167. package/Tests/App/Dashboard/PasskeySettings.test.tsx +87 -2
  168. package/Tests/App/Dashboard/ProjectAISettingsPages.test.tsx +884 -0
  169. package/Tests/App/Dashboard/ProxmoxNodeRemove.test.tsx +621 -0
  170. package/Tests/App/Dashboard/ProxmoxOverviewSlowLoads.test.tsx +584 -0
  171. package/Tests/App/Dashboard/ProxmoxPagesTimeRangeZoom.test.tsx +823 -0
  172. package/Tests/App/Dashboard/ProxmoxRateChartReload.test.tsx +1253 -0
  173. package/Tests/App/Dashboard/PublicDashboardBoardWideZoom.test.tsx +605 -0
  174. package/Tests/App/Dashboard/RealRowsLineChart.tsx +250 -0
  175. package/Tests/App/Dashboard/RechartsHostsPlotCursor.test.tsx +513 -0
  176. package/Tests/App/Dashboard/RowActionPlacementOverrides.test.tsx +865 -0
  177. package/Tests/App/Dashboard/RumOverviewTimeRangeZoom.test.tsx +877 -0
  178. package/Tests/App/Dashboard/RunnerKubernetesAgentForm.test.tsx +20 -4
  179. package/Tests/App/Dashboard/RunnerSupersededByAiAgentNote.test.tsx +296 -0
  180. package/Tests/App/Dashboard/SecurityEventConnectionsTable.test.tsx +146 -36
  181. package/Tests/App/Dashboard/ServiceDatabaseSlowLoads.test.tsx +1166 -0
  182. package/Tests/App/Dashboard/ServiceMapGraph.test.tsx +1243 -104
  183. package/Tests/App/Dashboard/ServiceOverviewTimeRangeZoom.test.tsx +792 -0
  184. package/Tests/App/Dashboard/SloBudgetBurnDownZoom.test.tsx +771 -0
  185. package/Tests/App/Dashboard/SloBudgetBurnDownZoomAffordances.test.tsx +380 -0
  186. package/Tests/App/Dashboard/SloEventMetricsBarChartZoom.test.tsx +369 -0
  187. package/Tests/App/Dashboard/SloHistoryChartsTimeRangeZoom.test.tsx +694 -0
  188. package/Tests/App/Dashboard/SloHistoryChartsZoomAffordances.test.tsx +497 -0
  189. package/Tests/App/Dashboard/SloMetricsTimeRangeZoom.test.tsx +541 -0
  190. package/Tests/App/Dashboard/SlowLoadHarness.ts +123 -0
  191. package/Tests/App/Dashboard/SnapshotExplorerPrimaryZoom.test.tsx +1194 -0
  192. package/Tests/App/Dashboard/SnapshotViewerPinnedWindow.test.tsx +620 -0
  193. package/Tests/App/Dashboard/TelemetrySnapshotPanelTimeRangeZoom.test.tsx +765 -0
  194. package/Tests/App/Dashboard/TelemetrySnapshotZoom.test.tsx +516 -0
  195. package/Tests/App/Dashboard/TelemetrySnapshotZoomAcrossTabs.test.tsx +827 -0
  196. package/Tests/App/Dashboard/TimeRangeZoomPageHarness.tsx +463 -0
  197. package/Tests/App/Dashboard/TraceChartEditorStatusSplit.test.tsx +543 -0
  198. package/Tests/App/Dashboard/TraceStatusPresentation.test.tsx +967 -0
  199. package/Tests/App/Dashboard/TraceTimelineMinimapZoom.test.tsx +315 -0
  200. package/Tests/App/Dashboard/TracesAnalyticsStatusSplit.test.tsx +778 -0
  201. package/Tests/App/Dashboard/TracesAnalyticsViewZoom.test.tsx +349 -0
  202. package/Tests/App/Dashboard/TracesExplorerTimeRangeZoom.test.tsx +551 -0
  203. package/Tests/App/Dashboard/TracesStatusChartAndFacet.test.tsx +687 -0
  204. package/Tests/App/Dashboard/TracesViewerStaleResponses.test.tsx +458 -0
  205. package/Tests/App/Dashboard/UptimeStripsExcludedFromZoom.test.tsx +406 -0
  206. package/Tests/App/Dashboard/VMwareOverviewSlowLoads.test.tsx +535 -0
  207. package/Tests/App/Dashboard/VMwarePagesTimeRangeZoom.test.tsx +606 -0
  208. package/Tests/App/Dashboard/ValueWidgetSparklineStaleHover.test.tsx +1292 -0
  209. package/Tests/App/Dashboard/ValueWidgetSparklineZoom.test.tsx +765 -0
  210. package/Tests/App/StatusPage/StatusPageResourceExplorer.test.tsx +98 -0
  211. package/Tests/Models/DatabaseModels/KubernetesAiAgentModel.test.ts +295 -0
  212. package/Tests/Models/DatabaseModels/TeamComplianceSettingModel.test.ts +347 -0
  213. package/Tests/Server/API/AIChatRouteAuthorization.test.ts +58 -0
  214. package/Tests/Server/API/AIGenerationProjectAIToggle.test.ts +1 -1
  215. package/Tests/Server/API/AIInvestigationAPI.test.ts +123 -45
  216. package/Tests/Server/API/AutoRemediationApproveClusterRound.test.ts +1329 -0
  217. package/Tests/Server/API/AutoRemediationApproveKubectlRecheck.test.ts +25 -2
  218. package/Tests/Server/API/KubernetesClusterAiAccessAPI.test.ts +2 -0
  219. package/Tests/Server/API/KubernetesClusterAiAccessAPIAgent.test.ts +903 -0
  220. package/Tests/Server/API/MicrosoftTeamsChatsRefreshRoute.test.ts +667 -0
  221. package/Tests/Server/API/MicrosoftTeamsManifest.test.ts +294 -6
  222. package/Tests/Server/API/ProxmoxResourceAPIRemoveNode.test.ts +1932 -0
  223. package/Tests/Server/Infrastructure/GlobalCache.test.ts +195 -0
  224. package/Tests/Server/Infrastructure/Postgres/AddKubernetesAiAgentAndAiDefaultsMigration.test.ts +623 -0
  225. package/Tests/Server/Infrastructure/Postgres/AddKubernetesClusterAiAccessMigration.test.ts +87 -10
  226. package/Tests/Server/Infrastructure/Postgres/AddTeamComplianceRuleScopeMigration.test.ts +622 -0
  227. package/Tests/Server/Middleware/TelemetryIngestBrowserKey.test.ts +61 -4
  228. package/Tests/Server/Middleware/TelemetryIngestKubernetesAgentRunnerPinnedKey.test.ts +98 -2
  229. package/Tests/Server/Middleware/TelemetryIngestKubernetesAgentRunnerRateLimit.test.ts +105 -2
  230. package/Tests/Server/Services/AIServiceBalanceBlocker.test.ts +282 -0
  231. package/Tests/Server/Services/AlertMonitorClearWritesNull.test.ts +409 -0
  232. package/Tests/Server/Services/AlertMonitorEditFeed.test.ts +474 -0
  233. package/Tests/Server/Services/AlertMonitorEditGuard.test.ts +610 -0
  234. package/Tests/Server/Services/AutoRemediationClusterRuleEngine.test.ts +2 -0
  235. package/Tests/Server/Services/AutoRemediationRuleCommandRunners.test.ts +2 -1
  236. package/Tests/Server/Services/IncidentAffectedMonitorsEdit.test.ts +1360 -0
  237. package/Tests/Server/Services/IncidentAlertSloLinkSurvivesEdit.test.ts +3 -1
  238. package/Tests/Server/Services/IncidentSeverityDeletePausesComplianceRules.test.ts +488 -0
  239. package/Tests/Server/Services/KubernetesAiAgentJobService.test.ts +329 -0
  240. package/Tests/Server/Services/KubernetesAiAgentServiceHelpers.test.ts +618 -0
  241. package/Tests/Server/Services/KubernetesAiAgentServiceLifecycle.test.ts +1444 -0
  242. package/Tests/Server/Services/KubernetesAiAgentServiceRegister.test.ts +1666 -0
  243. package/Tests/Server/Services/KubernetesClusterAiAccessDeletedRunnerRemedy.test.ts +140 -111
  244. package/Tests/Server/Services/KubernetesClusterAiAccessGapNextSteps.test.ts +267 -105
  245. package/Tests/Server/Services/KubernetesClusterAiAccessLegacySuperseded.test.ts +440 -0
  246. package/Tests/Server/Services/KubernetesClusterAiAccessService.test.ts +567 -411
  247. package/Tests/Server/Services/KubernetesClusterAiAccessTarget.test.ts +1168 -0
  248. package/Tests/Server/Services/KubernetesClusterAiSettingsPermission.test.ts +410 -12
  249. package/Tests/Server/Services/KubernetesClusterServiceAiAccessFeed.test.ts +55 -0
  250. package/Tests/Server/Services/ProjectServiceNewProjectAiDefaults.test.ts +288 -0
  251. package/Tests/Server/Services/ProxmoxResourcePostgres.test.ts +5633 -0
  252. package/Tests/Server/Services/ProxmoxResourceService.test.ts +6458 -5
  253. package/Tests/Server/Services/RunnerJobEnqueueKubectl.test.ts +48 -15
  254. package/Tests/Server/Services/RunnerJobEnqueueKubectlAiAgent.test.ts +620 -0
  255. package/Tests/Server/Services/RunnerJobKubectlWriteScope.test.ts +170 -3
  256. package/Tests/Server/Services/RunnerJobTimeoutReason.test.ts +72 -0
  257. package/Tests/Server/Services/RunnerServiceAgentName.test.ts +6 -4
  258. package/Tests/Server/Services/ScheduledMaintenanceAttachmentEdit.test.ts +2113 -0
  259. package/Tests/Server/Services/ScheduledMaintenanceMonitorRelease.test.ts +972 -0
  260. package/Tests/Server/Services/TeamComplianceSettingPostgres.test.ts +2237 -0
  261. package/Tests/Server/Services/TeamComplianceSettingService.test.ts +3988 -138
  262. package/Tests/Server/Utils/AI/ClusterAccessContext.test.ts +107 -1
  263. package/Tests/Server/Utils/AI/IncidentPostmortemRunner.test.ts +351 -0
  264. package/Tests/Server/Utils/AI/InvestigationClusterAccessWiring.test.ts +2 -0
  265. package/Tests/Server/Utils/AI/InvestigationEligibility.test.ts +310 -0
  266. package/Tests/Server/Utils/AI/KubectlInvestigationToolkit.test.ts +70 -0
  267. package/Tests/Server/Utils/AI/KubectlJobRunnerFinishedJob.test.ts +58 -0
  268. package/Tests/Server/Utils/AI/RemediationCommandToolsKubectl.test.ts +2 -0
  269. package/Tests/Server/Utils/AI/RemediationCommandToolsKubectlOutcome.test.ts +2 -0
  270. package/Tests/Server/Utils/AI/RemediationCommandToolsLiveCluster.test.ts +2 -0
  271. package/Tests/Server/Utils/AI/RemediationCommandToolsRunnerScope.test.ts +125 -1
  272. package/Tests/Server/Utils/AI/RemediationExecutionRunner.test.ts +252 -3
  273. package/Tests/Server/Utils/AI/RemediationExecutionRunnerClusterMode.test.ts +2 -0
  274. package/Tests/Server/Utils/AI/RemediationExecutionRunnerProjectGates.test.ts +240 -0
  275. package/Tests/Server/Utils/AI/RemediationKubectlCopyParity.test.ts +2 -0
  276. package/Tests/Server/Utils/AutoRemediation/CommandPlanExecutor.test.ts +2 -0
  277. package/Tests/Server/Utils/AutoRemediation/CommandPlanExecutorUnknownRun.test.ts +2 -0
  278. package/Tests/Server/Utils/AutoRemediation/CommandPlanVerification.test.ts +2 -0
  279. package/Tests/Server/Utils/Telemetry/HostAssetAttributesFromOtlp.test.ts +68 -0
  280. package/Tests/Server/Utils/Telemetry/InventoryMirrorPostgres.test.ts +370 -0
  281. package/Tests/Server/Utils/Telemetry/NetworkDeviceInventoryAttributes.test.ts +522 -0
  282. package/Tests/Server/Utils/Telemetry/ProxmoxCephSnapshotScan.test.ts +155 -0
  283. package/Tests/Server/Utils/Telemetry/ProxmoxNativeNodeLiveness.test.ts +8631 -0
  284. package/Tests/Server/Utils/Telemetry/ProxmoxNativePush.test.ts +2852 -0
  285. package/Tests/Server/Utils/Telemetry/TelemetryEntity.test.ts +367 -1
  286. package/Tests/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.test.ts +45 -3
  287. package/Tests/Server/Utils/Workspace/MicrosoftTeamsChats.test.ts +25 -0
  288. package/Tests/Server/Utils/Workspace/MicrosoftTeamsGroupChatNames.test.ts +3119 -0
  289. package/Tests/Server/Utils/Workspace/MicrosoftTeamsGroupChatNamesPostgres.test.ts +1721 -0
  290. package/Tests/Types/Kubernetes/KubernetesAgentChartAiAccess.test.ts +581 -113
  291. package/Tests/Types/Kubernetes/KubernetesAiAgentAccessContract.test.ts +510 -0
  292. package/Tests/Types/Team/ComplianceRule.test.ts +1029 -0
  293. package/Tests/Types/Team/TeamComplianceStatus.test.ts +176 -0
  294. package/Tests/UI/Components/ActionButton/RowActions.test.tsx +641 -0
  295. package/Tests/UI/Components/ActionButton/RowActionsAccessibility.test.tsx +414 -0
  296. package/Tests/UI/Components/ActionButton/SplitActionButtons.test.ts +565 -0
  297. package/Tests/UI/Components/Charts/BarChartDragToSelect.test.tsx +386 -0
  298. package/Tests/UI/Components/Charts/ChartDoubleClickResetWithoutDblclick.test.tsx +1025 -0
  299. package/Tests/UI/Components/Charts/ChartGroupPageZoomHint.test.tsx +196 -0
  300. package/Tests/UI/Components/Charts/ChartPlaceholdersTakeDoubleClick.test.tsx +1861 -0
  301. package/Tests/UI/Components/Charts/ChartPlotClicksWhileResetArmed.test.tsx +382 -0
  302. package/Tests/UI/Components/Charts/ChartRangeSelection.test.tsx +704 -0
  303. package/Tests/UI/Components/Charts/ChartRangeSelectionDoubleClickReset.test.tsx +1481 -0
  304. package/Tests/UI/Components/Charts/ChartRangeSelectionRealRecharts.test.tsx +918 -0
  305. package/Tests/UI/Components/Charts/ChartRowBucketStart.test.ts +350 -0
  306. package/Tests/UI/Components/Charts/DoubleClickReset.test.tsx +996 -0
  307. package/Tests/UI/Components/Charts/HistogramDoubleClickResetRealRecharts.test.tsx +965 -0
  308. package/Tests/UI/Components/Charts/HistogramDriftThenRefetch.test.tsx +277 -0
  309. package/Tests/UI/Components/Charts/HistogramRangeSelectionDataChange.test.tsx +1757 -0
  310. package/Tests/UI/Components/Charts/HistogramRangeSelectionRealRecharts.test.tsx +560 -0
  311. package/Tests/UI/Components/Charts/TimeRangeZoom/ChartPageTimeRangeZoom.test.tsx +513 -0
  312. package/Tests/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomContext.test.tsx +845 -0
  313. package/Tests/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomHint.test.tsx +119 -0
  314. package/Tests/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomHintTailwind.test.tsx +274 -0
  315. package/Tests/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomUtil.test.ts +433 -0
  316. package/Tests/UI/Components/Charts/TimeRangeZoom/UseTimeRangeZoom.test.tsx +863 -0
  317. package/Tests/UI/Components/Charts/TimeRangeZoom/ZoomDocsPromises.test.tsx +1147 -0
  318. package/Tests/UI/Components/DisabledButtonTooltip.test.tsx +14 -3
  319. package/Tests/UI/Components/EntityDropdownEscape.test.tsx +454 -0
  320. package/Tests/UI/Components/EntityDropdownFocusLeave.test.tsx +420 -0
  321. package/Tests/UI/Components/Forms/FormFieldDropdownDisabled.test.tsx +233 -0
  322. package/Tests/UI/Components/Input.test.tsx +80 -1
  323. package/Tests/UI/Components/LogsAnalyticsViewZoom.test.tsx +947 -0
  324. package/Tests/UI/Components/LogsHistogramDragTooltip.test.tsx +17 -5
  325. package/Tests/UI/Components/LogsViewerAnalyticsZoom.test.tsx +501 -0
  326. package/Tests/UI/Components/LogsViewerHistogramZoom.test.tsx +1 -1
  327. package/Tests/UI/Components/ModelTable/BaseModelTableBulkDelete.test.tsx +6 -4
  328. package/Tests/UI/Components/ModelTable/BaseModelTablePermissionGating.test.tsx +60 -8
  329. package/Tests/UI/Components/ModelTable/BaseModelTableRowActions.test.tsx +476 -0
  330. package/Tests/UI/Components/ModelTable/ModelTableWrapContent.test.tsx +7 -5
  331. package/Tests/UI/Components/MoreMenuPortal.test.tsx +623 -0
  332. package/Tests/UI/Components/StatusPage/ResourceGridActions.test.tsx +538 -0
  333. package/Tests/UI/Components/StatusPage/ResourceGridSelection.test.tsx +14 -4
  334. package/Tests/UI/Components/TableCellWrapping.test.tsx +3 -3
  335. package/Tests/UI/Components/TableRowActions.test.tsx +472 -0
  336. package/Tests/UI/Components/TelemetryHistogramDragTooltip.test.tsx +1 -1
  337. package/Tests/UI/Components/TelemetryViewer/TelemetryViewerHistogramClickZoom.test.tsx +1 -1
  338. package/Tests/UI/Components/TelemetryViewer/TelemetryViewerZoomScope.test.tsx +470 -0
  339. package/Tests/UI/Components/TelemetryViewer/UseViewerTimeRangeZoom.test.tsx +571 -0
  340. package/Tests/UI/Components/TelemetryViewer/ViewerDoubleClickResetUnderDataChange.test.tsx +928 -0
  341. package/Tests/UI/Components/TelemetryViewer/ViewerFollowsEnclosingZoom.test.tsx +1569 -0
  342. package/Tests/UI/Components/Toggle.test.tsx +66 -0
  343. package/Tests/UI/MicrosoftTeams/MicrosoftTeamsChatsCardRefreshNames.test.tsx +1023 -0
  344. package/Tests/UI/Rum/ChunkLoader.test.ts +201 -0
  345. package/Tests/UI/Rum/FidelityNotices.test.ts +54 -0
  346. package/Tests/UI/Rum/ReplayCorrelationPanel.test.tsx +72 -0
  347. package/Tests/UI/Rum/ReplayFrameCapture.test.ts +1009 -9
  348. package/Tests/UI/Rum/ReplayRecordedAssets.test.ts +1069 -0
  349. package/Tests/UI/Rum/ReplayStage.test.tsx +913 -2
  350. package/Tests/UI/Rum/SessionReplayTable.test.tsx +443 -8
  351. package/Tests/UI/Rum/SessionReplayUsersTable.test.tsx +439 -9
  352. package/Tests/UI/Rum/UserFlowTablesRowActions.test.tsx +501 -0
  353. package/Tests/Utils/AiRemediation/KubectlPolicyChartRbacParity.test.ts +47 -19
  354. package/Tests/Utils/AiRemediation/KubectlWriteScopeCallerParity.test.ts +2 -0
  355. package/Tests/Utils/AiRemediation/KubernetesAiAgentPolicyCopyParity.test.ts +396 -0
  356. package/Tests/Utils/Dashboard/DashboardTimeRangeZoom.test.ts +104 -1
  357. package/Types/AI/AIRunType.ts +9 -4
  358. package/Types/AI/InvestigationNotStartedReason.ts +6 -0
  359. package/Types/AutoRemediation/AiRemediationCommandPlan.ts +14 -16
  360. package/Types/AutoRemediation/AiRemediationCommandPolicyVerdict.ts +28 -0
  361. package/Types/Dashboard/DashboardComponents/DashboardTraceChartComponent.ts +4 -2
  362. package/Types/Kubernetes/KubernetesClusterAiAccess.ts +263 -32
  363. package/Types/Kubernetes/KubernetesClusterAiAccessPermissions.ts +20 -16
  364. package/Types/Kubernetes/KubernetesClusterAiInsights.ts +81 -0
  365. package/Types/Monitor/ProxmoxAlertTemplates.ts +4 -4
  366. package/Types/Team/ComplianceNotificationChannel.ts +22 -0
  367. package/Types/Team/ComplianceRule.ts +434 -0
  368. package/Types/Team/ComplianceRuleType.ts +21 -0
  369. package/Types/Team/TeamComplianceStatus.ts +81 -0
  370. package/Types/Telemetry/TelemetryIngestSurface.ts +28 -0
  371. package/UI/Components/ActionButton/ActionButtonSchema.ts +21 -0
  372. package/UI/Components/ActionButton/RowActions.tsx +238 -0
  373. package/UI/Components/ActionButton/SplitActionButtons.ts +173 -0
  374. package/UI/Components/Charts/Area/AreaChart.tsx +32 -2
  375. package/UI/Components/Charts/Bar/BarChart.tsx +40 -3
  376. package/UI/Components/Charts/ChartGroup/ChartGroup.tsx +37 -11
  377. package/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.tsx +80 -243
  378. package/UI/Components/Charts/ChartLibrary/BarChart/BarChart.tsx +122 -31
  379. package/UI/Components/Charts/ChartLibrary/LineChart/LineChart.tsx +95 -244
  380. package/UI/Components/Charts/ChartLibrary/Utils/DoubleClick.ts +214 -0
  381. package/UI/Components/Charts/ChartLibrary/Utils/UseChartBucketsChange.ts +32 -0
  382. package/UI/Components/Charts/ChartLibrary/Utils/UseChartRangeSelection.ts +599 -0
  383. package/UI/Components/Charts/Line/LineChart.tsx +32 -2
  384. package/UI/Components/Charts/TimeRangeZoom/ResetTimeRangeZoomButton.tsx +70 -0
  385. package/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomContext.tsx +226 -0
  386. package/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomHint.tsx +73 -0
  387. package/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomUtil.ts +163 -0
  388. package/UI/Components/Charts/TimeRangeZoom/UseTimeRangeZoom.ts +215 -0
  389. package/UI/Components/Charts/Utils/DataPoint.ts +20 -8
  390. package/UI/Components/Charts/Utils/XAxis.ts +75 -0
  391. package/UI/Components/Charts/Utils/useHistogramRangeSelection.ts +493 -59
  392. package/UI/Components/EntityDropdown/EntityDropdown.tsx +107 -11
  393. package/UI/Components/Forms/Fields/FormField.tsx +10 -0
  394. package/UI/Components/Input/Input.tsx +90 -57
  395. package/UI/Components/List/ListRow.tsx +8 -74
  396. package/UI/Components/LogsViewer/LogsViewer.tsx +40 -11
  397. package/UI/Components/LogsViewer/components/LogTimeRangePicker.tsx +22 -6
  398. package/UI/Components/LogsViewer/components/LogsAnalyticsView.tsx +209 -6
  399. package/UI/Components/LogsViewer/components/LogsHistogram.tsx +127 -84
  400. package/UI/Components/LogsViewer/components/LogsViewerToolbar.tsx +3 -0
  401. package/UI/Components/ModelTable/BaseModelTable.tsx +12 -1
  402. package/UI/Components/MoreMenu/MoreMenu.tsx +365 -30
  403. package/UI/Components/MoreMenu/MoreMenuItem.tsx +70 -17
  404. package/UI/Components/OrderedStatesList/Item.tsx +7 -72
  405. package/UI/Components/StatusPage/ResourceGrid.tsx +126 -77
  406. package/UI/Components/Table/TableBody.tsx +8 -2
  407. package/UI/Components/Table/TableRow.tsx +20 -140
  408. package/UI/Components/TelemetryViewer/TelemetryViewer.tsx +41 -10
  409. package/UI/Components/TelemetryViewer/components/TelemetryHistogram.tsx +47 -9
  410. package/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.tsx +25 -6
  411. package/UI/Components/TelemetryViewer/types.ts +2 -0
  412. package/UI/Components/TelemetryViewer/useViewerTimeRangeZoom.ts +448 -0
  413. package/UI/Components/Toggle/Toggle.tsx +26 -0
  414. package/UI/Components/Tooltip/Tooltip.tsx +8 -1
  415. package/UI/Styles/Theme.css +14 -2
  416. package/Utils/AiRemediation/CommandPolicy.ts +1 -1
  417. package/Utils/AiRemediation/KubectlPolicy.ts +1 -1
  418. package/Utils/Dashboard/DashboardTimeRangeZoom.ts +46 -2
  419. package/build/dist/Models/DatabaseModels/Index.js +2 -0
  420. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  421. package/build/dist/Models/DatabaseModels/KubernetesAiAgent.js +385 -0
  422. package/build/dist/Models/DatabaseModels/KubernetesAiAgent.js.map +1 -0
  423. package/build/dist/Models/DatabaseModels/KubernetesCluster.js +3 -3
  424. package/build/dist/Models/DatabaseModels/KubernetesCluster.js.map +1 -1
  425. package/build/dist/Models/DatabaseModels/Project.js +56 -5
  426. package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
  427. package/build/dist/Models/DatabaseModels/ProxmoxResource.js +51 -1
  428. package/build/dist/Models/DatabaseModels/ProxmoxResource.js.map +1 -1
  429. package/build/dist/Models/DatabaseModels/RunnerJob.js +74 -0
  430. package/build/dist/Models/DatabaseModels/RunnerJob.js.map +1 -1
  431. package/build/dist/Models/DatabaseModels/TeamComplianceSetting.js +134 -3
  432. package/build/dist/Models/DatabaseModels/TeamComplianceSetting.js.map +1 -1
  433. package/build/dist/Models/DatabaseModels/WorkspaceProjectAuthToken.js.map +1 -1
  434. package/build/dist/Server/API/AIChatAPI.js +6 -1
  435. package/build/dist/Server/API/AIChatAPI.js.map +1 -1
  436. package/build/dist/Server/API/AIInvestigationAPI.js +17 -10
  437. package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
  438. package/build/dist/Server/API/AutoRemediationAPI.js +144 -24
  439. package/build/dist/Server/API/AutoRemediationAPI.js.map +1 -1
  440. package/build/dist/Server/API/KubernetesClusterAiAccessAPI.js +436 -22
  441. package/build/dist/Server/API/KubernetesClusterAiAccessAPI.js.map +1 -1
  442. package/build/dist/Server/API/MicrosoftTeamsAPI.js +69 -13
  443. package/build/dist/Server/API/MicrosoftTeamsAPI.js.map +1 -1
  444. package/build/dist/Server/API/ProxmoxResourceAPI.js +187 -14
  445. package/build/dist/Server/API/ProxmoxResourceAPI.js.map +1 -1
  446. package/build/dist/Server/Infrastructure/GlobalCache.js +27 -0
  447. package/build/dist/Server/Infrastructure/GlobalCache.js.map +1 -1
  448. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796000000000-AddTeamComplianceRuleScope.js +50 -0
  449. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796000000000-AddTeamComplianceRuleScope.js.map +1 -0
  450. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796100000000-AddKubernetesAiAgentAndAiDefaults.js +84 -0
  451. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796100000000-AddKubernetesAiAgentAndAiDefaults.js.map +1 -0
  452. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796200000000-AddProxmoxResourceNativePushColumns.js +31 -0
  453. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796200000000-AddProxmoxResourceNativePushColumns.js.map +1 -0
  454. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +6 -0
  455. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  456. package/build/dist/Server/Middleware/TelemetryIngest.js +34 -19
  457. package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
  458. package/build/dist/Server/Services/AIService.js +59 -1
  459. package/build/dist/Server/Services/AIService.js.map +1 -1
  460. package/build/dist/Server/Services/AlertService.js +248 -13
  461. package/build/dist/Server/Services/AlertService.js.map +1 -1
  462. package/build/dist/Server/Services/AlertSeverityService.js +51 -15
  463. package/build/dist/Server/Services/AlertSeverityService.js.map +1 -1
  464. package/build/dist/Server/Services/AutoRemediationRuleService.js +1 -1
  465. package/build/dist/Server/Services/AutoRemediationRuleService.js.map +1 -1
  466. package/build/dist/Server/Services/IncidentService.js +199 -72
  467. package/build/dist/Server/Services/IncidentService.js.map +1 -1
  468. package/build/dist/Server/Services/IncidentSeverityService.js +51 -15
  469. package/build/dist/Server/Services/IncidentSeverityService.js.map +1 -1
  470. package/build/dist/Server/Services/KubernetesAiAgentJobService.js +158 -0
  471. package/build/dist/Server/Services/KubernetesAiAgentJobService.js.map +1 -0
  472. package/build/dist/Server/Services/KubernetesAiAgentService.js +1145 -0
  473. package/build/dist/Server/Services/KubernetesAiAgentService.js.map +1 -0
  474. package/build/dist/Server/Services/KubernetesClusterAiAccessService.js +842 -371
  475. package/build/dist/Server/Services/KubernetesClusterAiAccessService.js.map +1 -1
  476. package/build/dist/Server/Services/KubernetesClusterService.js +86 -17
  477. package/build/dist/Server/Services/KubernetesClusterService.js.map +1 -1
  478. package/build/dist/Server/Services/ProjectService.js +22 -0
  479. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  480. package/build/dist/Server/Services/ProxmoxResourceService.js +258 -3
  481. package/build/dist/Server/Services/ProxmoxResourceService.js.map +1 -1
  482. package/build/dist/Server/Services/RunnerJobService.js +178 -92
  483. package/build/dist/Server/Services/RunnerJobService.js.map +1 -1
  484. package/build/dist/Server/Services/RunnerService.js +1 -1
  485. package/build/dist/Server/Services/RunnerService.js.map +1 -1
  486. package/build/dist/Server/Services/ScheduledMaintenanceService.js +535 -3
  487. package/build/dist/Server/Services/ScheduledMaintenanceService.js.map +1 -1
  488. package/build/dist/Server/Services/ScheduledMaintenanceStateTimelineService.js +316 -46
  489. package/build/dist/Server/Services/ScheduledMaintenanceStateTimelineService.js.map +1 -1
  490. package/build/dist/Server/Services/TeamComplianceSettingService.js +833 -7
  491. package/build/dist/Server/Services/TeamComplianceSettingService.js.map +1 -1
  492. package/build/dist/Server/Utils/AI/ClusterAccess/ClusterAccessContext.js +52 -9
  493. package/build/dist/Server/Utils/AI/ClusterAccess/ClusterAccessContext.js.map +1 -1
  494. package/build/dist/Server/Utils/AI/ClusterAccess/KubectlInvestigationToolkit.js +13 -9
  495. package/build/dist/Server/Utils/AI/ClusterAccess/KubectlInvestigationToolkit.js.map +1 -1
  496. package/build/dist/Server/Utils/AI/ClusterAccess/KubectlJobRunner.js +7 -3
  497. package/build/dist/Server/Utils/AI/ClusterAccess/KubectlJobRunner.js.map +1 -1
  498. package/build/dist/Server/Utils/AI/Remediation/RemediationCommandTools.js +29 -15
  499. package/build/dist/Server/Utils/AI/Remediation/RemediationCommandTools.js.map +1 -1
  500. package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js +56 -20
  501. package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js.map +1 -1
  502. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js +39 -5
  503. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -1
  504. package/build/dist/Server/Utils/AI/SRE/IncidentPostmortemRunner.js +30 -3
  505. package/build/dist/Server/Utils/AI/SRE/IncidentPostmortemRunner.js.map +1 -1
  506. package/build/dist/Server/Utils/AI/SRE/InvestigationEligibility.js +13 -2
  507. package/build/dist/Server/Utils/AI/SRE/InvestigationEligibility.js.map +1 -1
  508. package/build/dist/Server/Utils/AI/SRE/InvestigationGrader.js +1 -1
  509. package/build/dist/Server/Utils/AutoRemediation/CommandPlanExecutor.js +4 -2
  510. package/build/dist/Server/Utils/AutoRemediation/CommandPlanExecutor.js.map +1 -1
  511. package/build/dist/Server/Utils/Telemetry/InventoryEntityRegistry.js +111 -6
  512. package/build/dist/Server/Utils/Telemetry/InventoryEntityRegistry.js.map +1 -1
  513. package/build/dist/Server/Utils/Telemetry/ProxmoxCephSnapshotScan.js +40 -4
  514. package/build/dist/Server/Utils/Telemetry/ProxmoxCephSnapshotScan.js.map +1 -1
  515. package/build/dist/Server/Utils/Telemetry/ProxmoxNativeNodeLiveness.js +296 -0
  516. package/build/dist/Server/Utils/Telemetry/ProxmoxNativeNodeLiveness.js.map +1 -0
  517. package/build/dist/Server/Utils/Telemetry/ProxmoxNativePush.js +699 -0
  518. package/build/dist/Server/Utils/Telemetry/ProxmoxNativePush.js.map +1 -0
  519. package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js +77 -19
  520. package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js.map +1 -1
  521. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +505 -42
  522. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
  523. package/build/dist/Types/AI/AIRunType.js +9 -4
  524. package/build/dist/Types/AI/AIRunType.js.map +1 -1
  525. package/build/dist/Types/AutoRemediation/AiRemediationCommandPlan.js +10 -16
  526. package/build/dist/Types/AutoRemediation/AiRemediationCommandPlan.js.map +1 -1
  527. package/build/dist/Types/AutoRemediation/AiRemediationCommandPolicyVerdict.js +28 -0
  528. package/build/dist/Types/AutoRemediation/AiRemediationCommandPolicyVerdict.js.map +1 -0
  529. package/build/dist/Types/Kubernetes/KubernetesClusterAiAccess.js +72 -16
  530. package/build/dist/Types/Kubernetes/KubernetesClusterAiAccess.js.map +1 -1
  531. package/build/dist/Types/Kubernetes/KubernetesClusterAiAccessPermissions.js +20 -16
  532. package/build/dist/Types/Kubernetes/KubernetesClusterAiAccessPermissions.js.map +1 -1
  533. package/build/dist/Types/Kubernetes/KubernetesClusterAiInsights.js +17 -0
  534. package/build/dist/Types/Kubernetes/KubernetesClusterAiInsights.js.map +1 -0
  535. package/build/dist/Types/Monitor/ProxmoxAlertTemplates.js +4 -4
  536. package/build/dist/Types/Monitor/ProxmoxAlertTemplates.js.map +1 -1
  537. package/build/dist/Types/Team/ComplianceNotificationChannel.js +23 -0
  538. package/build/dist/Types/Team/ComplianceNotificationChannel.js.map +1 -0
  539. package/build/dist/Types/Team/ComplianceRule.js +304 -0
  540. package/build/dist/Types/Team/ComplianceRule.js.map +1 -0
  541. package/build/dist/Types/Team/ComplianceRuleType.js +21 -0
  542. package/build/dist/Types/Team/ComplianceRuleType.js.map +1 -1
  543. package/build/dist/Types/Team/TeamComplianceStatus.js +2 -0
  544. package/build/dist/Types/Team/TeamComplianceStatus.js.map +1 -0
  545. package/build/dist/Types/Telemetry/TelemetryIngestSurface.js +25 -0
  546. package/build/dist/Types/Telemetry/TelemetryIngestSurface.js.map +1 -1
  547. package/build/dist/UI/Components/ActionButton/ActionButtonSchema.js +20 -1
  548. package/build/dist/UI/Components/ActionButton/ActionButtonSchema.js.map +1 -1
  549. package/build/dist/UI/Components/ActionButton/RowActions.js +113 -0
  550. package/build/dist/UI/Components/ActionButton/RowActions.js.map +1 -0
  551. package/build/dist/UI/Components/ActionButton/SplitActionButtons.js +71 -0
  552. package/build/dist/UI/Components/ActionButton/SplitActionButtons.js.map +1 -0
  553. package/build/dist/UI/Components/Charts/Area/AreaChart.js +16 -1
  554. package/build/dist/UI/Components/Charts/Area/AreaChart.js.map +1 -1
  555. package/build/dist/UI/Components/Charts/Bar/BarChart.js +16 -1
  556. package/build/dist/UI/Components/Charts/Bar/BarChart.js.map +1 -1
  557. package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js +27 -5
  558. package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js.map +1 -1
  559. package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js +61 -194
  560. package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js.map +1 -1
  561. package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js +84 -26
  562. package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js.map +1 -1
  563. package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js +75 -196
  564. package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js.map +1 -1
  565. package/build/dist/UI/Components/Charts/ChartLibrary/Utils/DoubleClick.js +133 -0
  566. package/build/dist/UI/Components/Charts/ChartLibrary/Utils/DoubleClick.js.map +1 -1
  567. package/build/dist/UI/Components/Charts/ChartLibrary/Utils/UseChartBucketsChange.js +26 -0
  568. package/build/dist/UI/Components/Charts/ChartLibrary/Utils/UseChartBucketsChange.js.map +1 -0
  569. package/build/dist/UI/Components/Charts/ChartLibrary/Utils/UseChartRangeSelection.js +371 -0
  570. package/build/dist/UI/Components/Charts/ChartLibrary/Utils/UseChartRangeSelection.js.map +1 -0
  571. package/build/dist/UI/Components/Charts/Line/LineChart.js +16 -1
  572. package/build/dist/UI/Components/Charts/Line/LineChart.js.map +1 -1
  573. package/build/dist/UI/Components/Charts/TimeRangeZoom/ResetTimeRangeZoomButton.js +35 -0
  574. package/build/dist/UI/Components/Charts/TimeRangeZoom/ResetTimeRangeZoomButton.js.map +1 -0
  575. package/build/dist/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomContext.js +107 -0
  576. package/build/dist/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomContext.js.map +1 -0
  577. package/build/dist/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomHint.js +41 -0
  578. package/build/dist/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomHint.js.map +1 -0
  579. package/build/dist/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomUtil.js +117 -0
  580. package/build/dist/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomUtil.js.map +1 -0
  581. package/build/dist/UI/Components/Charts/TimeRangeZoom/UseTimeRangeZoom.js +121 -0
  582. package/build/dist/UI/Components/Charts/TimeRangeZoom/UseTimeRangeZoom.js.map +1 -0
  583. package/build/dist/UI/Components/Charts/Utils/DataPoint.js +15 -7
  584. package/build/dist/UI/Components/Charts/Utils/DataPoint.js.map +1 -1
  585. package/build/dist/UI/Components/Charts/Utils/XAxis.js +70 -0
  586. package/build/dist/UI/Components/Charts/Utils/XAxis.js.map +1 -1
  587. package/build/dist/UI/Components/Charts/Utils/useHistogramRangeSelection.js +305 -38
  588. package/build/dist/UI/Components/Charts/Utils/useHistogramRangeSelection.js.map +1 -1
  589. package/build/dist/UI/Components/EntityDropdown/EntityDropdown.js +89 -14
  590. package/build/dist/UI/Components/EntityDropdown/EntityDropdown.js.map +1 -1
  591. package/build/dist/UI/Components/Forms/Fields/FormField.js +11 -2
  592. package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
  593. package/build/dist/UI/Components/Input/Input.js +69 -54
  594. package/build/dist/UI/Components/Input/Input.js.map +1 -1
  595. package/build/dist/UI/Components/List/ListRow.js +4 -39
  596. package/build/dist/UI/Components/List/ListRow.js.map +1 -1
  597. package/build/dist/UI/Components/LogsViewer/LogsViewer.js +31 -8
  598. package/build/dist/UI/Components/LogsViewer/LogsViewer.js.map +1 -1
  599. package/build/dist/UI/Components/LogsViewer/components/LogTimeRangePicker.js +10 -1
  600. package/build/dist/UI/Components/LogsViewer/components/LogTimeRangePicker.js.map +1 -1
  601. package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js +139 -21
  602. package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js.map +1 -1
  603. package/build/dist/UI/Components/LogsViewer/components/LogsHistogram.js +30 -8
  604. package/build/dist/UI/Components/LogsViewer/components/LogsHistogram.js.map +1 -1
  605. package/build/dist/UI/Components/LogsViewer/components/LogsViewerToolbar.js +1 -1
  606. package/build/dist/UI/Components/LogsViewer/components/LogsViewerToolbar.js.map +1 -1
  607. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +10 -0
  608. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  609. package/build/dist/UI/Components/MoreMenu/MoreMenu.js +253 -14
  610. package/build/dist/UI/Components/MoreMenu/MoreMenu.js.map +1 -1
  611. package/build/dist/UI/Components/MoreMenu/MoreMenuItem.js +43 -13
  612. package/build/dist/UI/Components/MoreMenu/MoreMenuItem.js.map +1 -1
  613. package/build/dist/UI/Components/OrderedStatesList/Item.js +2 -38
  614. package/build/dist/UI/Components/OrderedStatesList/Item.js.map +1 -1
  615. package/build/dist/UI/Components/StatusPage/ResourceGrid.js +53 -15
  616. package/build/dist/UI/Components/StatusPage/ResourceGrid.js.map +1 -1
  617. package/build/dist/UI/Components/Table/TableBody.js +6 -2
  618. package/build/dist/UI/Components/Table/TableBody.js.map +1 -1
  619. package/build/dist/UI/Components/Table/TableRow.js +12 -75
  620. package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
  621. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js +32 -7
  622. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js.map +1 -1
  623. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js +27 -9
  624. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js.map +1 -1
  625. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.js +11 -1
  626. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.js.map +1 -1
  627. package/build/dist/UI/Components/TelemetryViewer/useViewerTimeRangeZoom.js +272 -0
  628. package/build/dist/UI/Components/TelemetryViewer/useViewerTimeRangeZoom.js.map +1 -0
  629. package/build/dist/UI/Components/Toggle/Toggle.js +14 -1
  630. package/build/dist/UI/Components/Toggle/Toggle.js.map +1 -1
  631. package/build/dist/UI/Components/Tooltip/Tooltip.js +1 -1
  632. package/build/dist/UI/Components/Tooltip/Tooltip.js.map +1 -1
  633. package/build/dist/Utils/AiRemediation/CommandPolicy.js +1 -1
  634. package/build/dist/Utils/AiRemediation/CommandPolicy.js.map +1 -1
  635. package/build/dist/Utils/AiRemediation/KubectlPolicy.js +1 -1
  636. package/build/dist/Utils/AiRemediation/KubectlPolicy.js.map +1 -1
  637. package/build/dist/Utils/Dashboard/DashboardTimeRangeZoom.js +27 -1
  638. package/build/dist/Utils/Dashboard/DashboardTimeRangeZoom.js.map +1 -1
  639. package/package.json +1 -1
@@ -0,0 +1,32 @@
1
+ import React from "react";
2
+
3
+ /**
4
+ * Calls `onChange` when a chart is redrawn over other buckets (a zoom, a
5
+ * reset, a new range), before the browser paints, and never on the first
6
+ * render. The buckets are the labels the chart draws on its x-axis.
7
+ *
8
+ * A chart's click selections (a dot, a bar) point at the buckets they were
9
+ * made on; once those are gone the selection matches nothing, and a
10
+ * selection that dims the rest of the chart would dim all of it.
11
+ */
12
+ export default function useChartBucketsChange(
13
+ categoryLabels: Array<string>,
14
+ onChange: () => void,
15
+ ): void {
16
+ const bucketKey: string = React.useMemo((): string => {
17
+ return categoryLabels.join("\u0000");
18
+ }, [categoryLabels]);
19
+ const lastBucketKeyRef: React.MutableRefObject<string> =
20
+ React.useRef<string>(bucketKey);
21
+ const onChangeRef: React.MutableRefObject<() => void> =
22
+ React.useRef<() => void>(onChange);
23
+ onChangeRef.current = onChange;
24
+
25
+ React.useLayoutEffect(() => {
26
+ if (lastBucketKeyRef.current === bucketKey) {
27
+ return;
28
+ }
29
+ lastBucketKeyRef.current = bucketKey;
30
+ onChangeRef.current();
31
+ }, [bucketKey]);
32
+ }
@@ -0,0 +1,599 @@
1
+ import React from "react";
2
+ import { CHART_DATA_POINT_DATE_KEY } from "../Types/ChartDataPoint";
3
+ import {
4
+ ChartPointerEvent,
5
+ DoubleClickReset,
6
+ useDoubleClickReset,
7
+ } from "./DoubleClick";
8
+
9
+ /*
10
+ * How far the pointer may wander from where it was pressed and still be a
11
+ * pointer that has not moved: a hand on a mouse or a trackpad is never
12
+ * quite still, and a press that drifts a pixel or two across the edge of a
13
+ * bucket is still a click.
14
+ */
15
+ export const CHART_PRESS_STILLNESS_PX: number = 3;
16
+
17
+ /*
18
+ * Subset of the recharts MouseHandlerDataParam passed to chart-level
19
+ * mouse handlers — just the fields range selection needs.
20
+ */
21
+ export type RangeSelectionChartState = {
22
+ activeTooltipIndex?: number | string | null | undefined;
23
+ activeLabel?: string | number | undefined;
24
+ };
25
+
26
+ export interface ChartBucketWindow {
27
+ start: Date;
28
+ end: Date;
29
+ }
30
+
31
+ type ChartRows = Array<Record<string, unknown>>;
32
+
33
+ /**
34
+ * The row under the pointer: recharts' active tooltip index when it is a
35
+ * valid row, else the row whose label matches recharts' active label.
36
+ */
37
+ export function getChartRowIndex(
38
+ data: ChartRows,
39
+ index: string,
40
+ chartState: RangeSelectionChartState | null | undefined,
41
+ ): number | null {
42
+ const activeTooltipIndex: number | string | null | undefined =
43
+ chartState?.activeTooltipIndex;
44
+ const numericIndex: number =
45
+ typeof activeTooltipIndex === "number"
46
+ ? activeTooltipIndex
47
+ : Number(activeTooltipIndex);
48
+ if (
49
+ activeTooltipIndex !== undefined &&
50
+ activeTooltipIndex !== null &&
51
+ activeTooltipIndex !== "" &&
52
+ Number.isInteger(numericIndex) &&
53
+ numericIndex >= 0 &&
54
+ numericIndex < data.length
55
+ ) {
56
+ return numericIndex;
57
+ }
58
+ // Fall back to matching activeLabel against the row labels.
59
+ if (chartState?.activeLabel !== undefined) {
60
+ const rowIndex: number = data.findIndex((row: Record<string, unknown>) => {
61
+ return row[index] === chartState.activeLabel;
62
+ });
63
+ return rowIndex >= 0 ? rowIndex : null;
64
+ }
65
+ return null;
66
+ }
67
+
68
+ /** When a row's bucket starts, from the epoch ms every row carries. */
69
+ export function getChartBucketStart(
70
+ data: ChartRows,
71
+ rowIndex: number,
72
+ ): Date | null {
73
+ const rawDate: unknown = data[rowIndex]?.[CHART_DATA_POINT_DATE_KEY];
74
+ return typeof rawDate === "number" ? new Date(rawDate) : null;
75
+ }
76
+
77
+ /**
78
+ * The time rows lowerIndex..upperIndex cover: from the start of the first
79
+ * bucket to the END of the last one. Its end is its start plus one bucket
80
+ * width, derived from the adjacent row (the rows are an evenly spaced
81
+ * grid). A single row with no neighbour has no known width.
82
+ */
83
+ export function getChartBucketWindow(
84
+ data: ChartRows,
85
+ lowerIndex: number,
86
+ upperIndex: number,
87
+ ): ChartBucketWindow | null {
88
+ const start: Date | null = getChartBucketStart(data, lowerIndex);
89
+ const lastBucketStart: Date | null = getChartBucketStart(data, upperIndex);
90
+ if (!start || !lastBucketStart) {
91
+ return null;
92
+ }
93
+
94
+ const adjacentDate: Date | null =
95
+ upperIndex > 0
96
+ ? getChartBucketStart(data, upperIndex - 1)
97
+ : getChartBucketStart(data, upperIndex + 1);
98
+ const bucketWidthInMs: number = adjacentDate
99
+ ? Math.abs(lastBucketStart.getTime() - adjacentDate.getTime())
100
+ : 0;
101
+
102
+ return {
103
+ start: start,
104
+ end: new Date(lastBucketStart.getTime() + bucketWidthInMs),
105
+ };
106
+ }
107
+
108
+ export interface UseChartRangeSelectionOptions {
109
+ data: ChartRows;
110
+ /** The row key recharts draws the x-axis from (the formatted label). */
111
+ index: string;
112
+ onTimeRangeSelect?: ((startTime: Date, endTime: Date) => void) | undefined;
113
+ /*
114
+ * false turns selection off even with a handler: a vertical bar chart
115
+ * has its categories on the y-axis, so there is no time to drag across.
116
+ */
117
+ enabled?: boolean | undefined;
118
+ /*
119
+ * What a double-click on the chart does while it offers one (a zoom to
120
+ * undo), including dropping any plot click it is holding back. With it,
121
+ * chartEventProps carries the chart's dblclick handler and the second
122
+ * press of a double-click is the reset, never a selection (see
123
+ * useDoubleClickReset).
124
+ */
125
+ onTimeRangeReset?: (() => void) | undefined;
126
+ }
127
+
128
+ /*
129
+ * The events recharts may hold for the next animation frame on a chart that
130
+ * offers a drag: its defaults, less "mousemove".
131
+ *
132
+ * recharts works out the bucket under the pointer a frame after each
133
+ * mousemove, but hands mousedown and mouseup to the chart at once, with
134
+ * the bucket it last worked out. So a drag released in the frame of its
135
+ * last move lost the buckets that move crossed, and a press in the frame
136
+ * the pointer arrived started one bucket early, or was dropped outright
137
+ * when the move queued before it (no button held yet) landed after it.
138
+ * Browsers already coalesce mousemove to about one a frame, so taking it
139
+ * at once costs no extra renders.
140
+ */
141
+ export const RANGE_SELECTION_THROTTLED_EVENTS: ReadonlyArray<
142
+ keyof GlobalEventHandlersEventMap
143
+ > = ["touchmove", "pointermove", "scroll", "wheel"];
144
+
145
+ const RANGE_SELECTION_ROOT_STYLE: React.CSSProperties = {
146
+ cursor: "crosshair",
147
+ };
148
+
149
+ export interface ChartRangeSelectionRootProps {
150
+ onMouseDown?: (
151
+ chartState: RangeSelectionChartState,
152
+ mouseEvent?: React.MouseEvent<SVGGraphicsElement>,
153
+ ) => void;
154
+ onMouseMove?: (
155
+ chartState: RangeSelectionChartState,
156
+ mouseEvent: React.MouseEvent<SVGGraphicsElement>,
157
+ ) => void;
158
+ onMouseUp?: (
159
+ chartState?: RangeSelectionChartState | null,
160
+ mouseEvent?: ChartPointerEvent | null,
161
+ ) => void;
162
+ onDoubleClick?: () => void;
163
+ throttledEvents?: ReadonlyArray<keyof GlobalEventHandlersEventMap>;
164
+ style?: React.CSSProperties;
165
+ }
166
+
167
+ export interface ChartRangeSelection {
168
+ /** Whether the chart offers drag-to-select at all. */
169
+ canSelect: boolean;
170
+ /*
171
+ * Labels of the first and last bucket (in row order) the live selection
172
+ * band spans, or null.
173
+ */
174
+ selectionStartLabel: string | null;
175
+ selectionEndLabel: string | null;
176
+ /*
177
+ * True for the click the browser delivers straight after a drag, which
178
+ * must not also toggle a legend, dot or bar selection.
179
+ */
180
+ isClickSuppressed: () => boolean;
181
+ /*
182
+ * Spread onto the recharts chart root. Empty when the chart neither
183
+ * selects nor resets.
184
+ */
185
+ chartEventProps: ChartRangeSelectionRootProps;
186
+ }
187
+
188
+ interface LatestRangeSelectionInputs {
189
+ data: ChartRows;
190
+ index: string;
191
+ onTimeRangeSelect: ((startTime: Date, endTime: Date) => void) | undefined;
192
+ canSelect: boolean;
193
+ }
194
+
195
+ /**
196
+ * Drag-to-select a time window on the line, area and bar charts.
197
+ *
198
+ * - A drag across buckets selects from the start of the first to the END
199
+ * of the last, as soon as the button is released.
200
+ * - A press and release on one bucket is a plain click and keeps its
201
+ * meaning (a bucket click, a legend toggle); only a real drag selects.
202
+ * A drag needs the pointer itself to move, by more than
203
+ * CHART_PRESS_STILLNESS_PX: a press whose bucket changes under a still
204
+ * pointer (new rows landing mid-press, a hand's drift across a bucket's
205
+ * edge) is still a plain click.
206
+ * - Nothing re-renders until the pointer leaves the bucket it pressed. A
207
+ * render under a press can replace the node it landed on (recharts
208
+ * re-keys a line's dots when it redraws them), and a press whose node
209
+ * is gone by the release gets no click and no dblclick - so a
210
+ * double-click on a line never reached the chart's zoom reset.
211
+ * - The release is resolved from the bucket recharts reports under the
212
+ * pointer at mouseup, falling back to the last move. The chart takes
213
+ * mousemove unthrottled (RANGE_SELECTION_THROTTLED_EVENTS), so that
214
+ * bucket is the one under the pointer now, not a frame ago.
215
+ * - A drag released outside the chart still selects: readers overshoot a
216
+ * 180px-tall chart all the time, and the chart's own mouseup never fires
217
+ * there. Before, the drag was abandoned and its band stayed painted until
218
+ * the pointer came back.
219
+ * - The click the browser fires after a drag is reported as suppressed.
220
+ * - With onTimeRangeReset, the second press of a double-click is the reset
221
+ * and never a selection, and it resets even when the browser drops the
222
+ * `dblclick` because the chart's new data re-keyed the node under the
223
+ * press (see useDoubleClickReset).
224
+ */
225
+ const useChartRangeSelection: (
226
+ options: UseChartRangeSelectionOptions,
227
+ ) => ChartRangeSelection = (
228
+ options: UseChartRangeSelectionOptions,
229
+ ): ChartRangeSelection => {
230
+ const canSelect: boolean =
231
+ Boolean(options.onTimeRangeSelect) && options.enabled !== false;
232
+ const canReset: boolean = Boolean(options.onTimeRangeReset);
233
+ const doubleClickReset: DoubleClickReset = useDoubleClickReset(
234
+ options.onTimeRangeReset,
235
+ );
236
+
237
+ const [selectionStartLabel, setSelectionStartLabel] = React.useState<
238
+ string | null
239
+ >(null);
240
+ const [selectionEndLabel, setSelectionEndLabel] = React.useState<
241
+ string | null
242
+ >(null);
243
+
244
+ /*
245
+ * The refs, not render state, are the authority on a selection in
246
+ * progress: a release can be seen twice (the chart's own mouseup and the
247
+ * page-wide listener below) and must only commit once.
248
+ */
249
+ const isSelecting: React.MutableRefObject<boolean> =
250
+ React.useRef<boolean>(false);
251
+ const startIndexRef: React.MutableRefObject<number | null> = React.useRef<
252
+ number | null
253
+ >(null);
254
+ const endIndexRef: React.MutableRefObject<number | null> = React.useRef<
255
+ number | null
256
+ >(null);
257
+ const suppressNextClickRef: React.MutableRefObject<boolean> =
258
+ React.useRef<boolean>(false);
259
+ // Whether the band is painted, i.e. the selection is in render state.
260
+ const isBandShownRef: React.MutableRefObject<boolean> =
261
+ React.useRef<boolean>(false);
262
+ // Where the press in progress went down, when recharts said.
263
+ const pressClientXRef: React.MutableRefObject<number | null> = React.useRef<
264
+ number | null
265
+ >(null);
266
+ // The page-wide mouseup listener of the press in progress, if any.
267
+ const releaseListenerRef: React.MutableRefObject<
268
+ ((event: MouseEvent) => void) | null
269
+ > = React.useRef<((event: MouseEvent) => void) | null>(null);
270
+
271
+ /*
272
+ * A release outside the chart is handled by a window listener installed
273
+ * a render earlier, so it reads the latest rows and handler from here.
274
+ */
275
+ const latest: React.MutableRefObject<LatestRangeSelectionInputs> =
276
+ React.useRef<LatestRangeSelectionInputs>({
277
+ data: options.data,
278
+ index: options.index,
279
+ onTimeRangeSelect: options.onTimeRangeSelect,
280
+ canSelect: canSelect,
281
+ });
282
+ latest.current = {
283
+ data: options.data,
284
+ index: options.index,
285
+ onTimeRangeSelect: options.onTimeRangeSelect,
286
+ canSelect: canSelect,
287
+ };
288
+
289
+ const stopListeningForRelease: () => void = React.useCallback((): void => {
290
+ if (releaseListenerRef.current) {
291
+ window.removeEventListener("mouseup", releaseListenerRef.current);
292
+ releaseListenerRef.current = null;
293
+ }
294
+ }, []);
295
+
296
+ const clearSelection: () => void = React.useCallback((): void => {
297
+ isSelecting.current = false;
298
+ startIndexRef.current = null;
299
+ endIndexRef.current = null;
300
+ stopListeningForRelease();
301
+ // A press that never became a drag painted nothing: leave render alone.
302
+ if (isBandShownRef.current) {
303
+ isBandShownRef.current = false;
304
+ setSelectionStartLabel(null);
305
+ setSelectionEndLabel(null);
306
+ }
307
+ }, [stopListeningForRelease]);
308
+
309
+ /*
310
+ * Whether the pointer has left the spot the press went down on. Without
311
+ * positions to go by (a caller that hands no event), it has: any change
312
+ * of bucket counts, as it always did.
313
+ */
314
+ const hasPointerMoved: (event?: ChartPointerEvent | null) => boolean =
315
+ React.useCallback((event?: ChartPointerEvent | null): boolean => {
316
+ const clientX: number | undefined = event?.clientX;
317
+
318
+ if (pressClientXRef.current === null || typeof clientX !== "number") {
319
+ return true;
320
+ }
321
+
322
+ return (
323
+ Math.abs(clientX - pressClientXRef.current) > CHART_PRESS_STILLNESS_PX
324
+ );
325
+ }, []);
326
+
327
+ const getLabel: (rowIndex: number) => string | null = React.useCallback(
328
+ (rowIndex: number): string | null => {
329
+ const label: unknown =
330
+ latest.current.data[rowIndex]?.[latest.current.index];
331
+ return typeof label === "string" ? label : null;
332
+ },
333
+ [],
334
+ );
335
+
336
+ const onMouseMove: (
337
+ chartState: RangeSelectionChartState,
338
+ mouseEvent: React.MouseEvent<SVGGraphicsElement>,
339
+ ) => void = React.useCallback(
340
+ (
341
+ chartState: RangeSelectionChartState,
342
+ mouseEvent: React.MouseEvent<SVGGraphicsElement>,
343
+ ): void => {
344
+ if (!isSelecting.current) {
345
+ return;
346
+ }
347
+ /*
348
+ * No button held: it came up somewhere no mouseup could be heard
349
+ * (outside the browser window, say). Abandon the selection.
350
+ */
351
+ if (mouseEvent && mouseEvent.buttons === 0) {
352
+ clearSelection();
353
+ return;
354
+ }
355
+ const rowIndex: number | null = getChartRowIndex(
356
+ latest.current.data,
357
+ latest.current.index,
358
+ chartState,
359
+ );
360
+ if (rowIndex === null) {
361
+ return;
362
+ }
363
+ const startIndex: number | null = startIndexRef.current;
364
+ if (startIndex === null || getLabel(rowIndex) === null) {
365
+ return;
366
+ }
367
+ if (!isBandShownRef.current) {
368
+ // Still on the pressed bucket: a click so far, so paint nothing.
369
+ if (rowIndex === startIndex) {
370
+ endIndexRef.current = rowIndex;
371
+ return;
372
+ }
373
+ /*
374
+ * Another bucket under a pointer that has not really moved: new
375
+ * rows landed under the press, or a hand's drift crossed the edge
376
+ * of the bucket it pressed. Not a drag.
377
+ */
378
+ if (!hasPointerMoved(mouseEvent)) {
379
+ return;
380
+ }
381
+ }
382
+ endIndexRef.current = rowIndex;
383
+ /*
384
+ * The band runs between its buckets in row order, whichever way the
385
+ * drag goes: a bar chart draws x1 from the left edge of its bar and
386
+ * x2 to the right edge of its own, so a right-to-left drag in drag
387
+ * order left both end bars unshaded (and two neighbours none).
388
+ */
389
+ const lowerLabel: string | null = getLabel(
390
+ Math.min(startIndex, rowIndex),
391
+ );
392
+ const upperLabel: string | null = getLabel(
393
+ Math.max(startIndex, rowIndex),
394
+ );
395
+ if (lowerLabel === null || upperLabel === null) {
396
+ return;
397
+ }
398
+ isBandShownRef.current = true;
399
+ setSelectionStartLabel(lowerLabel);
400
+ setSelectionEndLabel(upperLabel);
401
+ },
402
+ [clearSelection, getLabel, hasPointerMoved],
403
+ );
404
+
405
+ const onMouseUp: (
406
+ chartState?: RangeSelectionChartState | null,
407
+ mouseEvent?: ChartPointerEvent | null,
408
+ ) => void = React.useCallback(
409
+ (
410
+ chartState?: RangeSelectionChartState | null,
411
+ mouseEvent?: ChartPointerEvent | null,
412
+ ): void => {
413
+ // The end of a double-click's second press: the reset, nothing else.
414
+ if (doubleClickReset.onRelease(mouseEvent)) {
415
+ stopListeningForRelease();
416
+ return;
417
+ }
418
+
419
+ if (!isSelecting.current) {
420
+ return;
421
+ }
422
+
423
+ const releaseIndex: number | null = chartState
424
+ ? getChartRowIndex(
425
+ latest.current.data,
426
+ latest.current.index,
427
+ chartState,
428
+ )
429
+ : null;
430
+ const startIndex: number | null = startIndexRef.current;
431
+ const endIndex: number | null =
432
+ releaseIndex !== null ? releaseIndex : endIndexRef.current;
433
+ const wasDragging: boolean = isBandShownRef.current;
434
+ clearSelection();
435
+
436
+ /*
437
+ * A press whose pointer stayed put is a plain click, whatever bucket
438
+ * recharts reports under it by now: new rows can land during the
439
+ * press, and a hand drifts across a bucket's edge.
440
+ */
441
+ if (!wasDragging && !hasPointerMoved(mouseEvent)) {
442
+ return;
443
+ }
444
+
445
+ /*
446
+ * A plain click (the pointer never left the starting bucket) must
447
+ * keep behaving exactly as before — only a real drag selects.
448
+ */
449
+ if (startIndex === null || endIndex === null || startIndex === endIndex) {
450
+ return;
451
+ }
452
+
453
+ /*
454
+ * The browser fires a click right after mouseup; swallow it so a
455
+ * drag doesn't also toggle a legend, dot or bar selection. Cleared
456
+ * on a timeout so a never-delivered click can't suppress a later
457
+ * one.
458
+ */
459
+ suppressNextClickRef.current = true;
460
+ setTimeout(() => {
461
+ suppressNextClickRef.current = false;
462
+ }, 0);
463
+
464
+ const selectedWindow: ChartBucketWindow | null = getChartBucketWindow(
465
+ latest.current.data,
466
+ Math.min(startIndex, endIndex),
467
+ Math.max(startIndex, endIndex),
468
+ );
469
+ if (!selectedWindow) {
470
+ return;
471
+ }
472
+
473
+ latest.current.onTimeRangeSelect?.(
474
+ selectedWindow.start,
475
+ selectedWindow.end,
476
+ );
477
+ },
478
+ [clearSelection, doubleClickReset, stopListeningForRelease],
479
+ );
480
+
481
+ /*
482
+ * A press released outside the chart: the chart's own mouseup never
483
+ * fires, so listen on the window until the press ends. A release over
484
+ * the chart reaches the chart's handler first (React listens below the
485
+ * window), which ends the press and removes this listener before the
486
+ * window hears it. Added by the press rather than from render state so
487
+ * the press itself renders nothing (see above).
488
+ */
489
+ const listenForReleaseOffChart: () => void = React.useCallback((): void => {
490
+ stopListeningForRelease();
491
+ // No bucket off the chart, but the pointer's place and the click count.
492
+ const finishPressOutsideChart: (event: MouseEvent) => void = (
493
+ event: MouseEvent,
494
+ ): void => {
495
+ onMouseUp(null, event);
496
+ };
497
+ releaseListenerRef.current = finishPressOutsideChart;
498
+ window.addEventListener("mouseup", finishPressOutsideChart);
499
+ }, [onMouseUp, stopListeningForRelease]);
500
+
501
+ const onMouseDown: (
502
+ chartState: RangeSelectionChartState,
503
+ mouseEvent?: React.MouseEvent<SVGGraphicsElement>,
504
+ ) => void = React.useCallback(
505
+ (
506
+ chartState: RangeSelectionChartState,
507
+ mouseEvent?: React.MouseEvent<SVGGraphicsElement>,
508
+ ): void => {
509
+ /*
510
+ * The second press of a double-click is the reset, on its release,
511
+ * wherever that is: the window hears a release off the chart, as for
512
+ * a drag below.
513
+ */
514
+ if (doubleClickReset.onPress(mouseEvent)) {
515
+ clearSelection();
516
+ listenForReleaseOffChart();
517
+ return;
518
+ }
519
+ /*
520
+ * Also on a chart that only resets: it takes presses to spot that
521
+ * second one, and selects nothing.
522
+ */
523
+ if (!latest.current.canSelect) {
524
+ return;
525
+ }
526
+ // Only the main button drags; a right-click opens a context menu.
527
+ if (mouseEvent && mouseEvent.button > 0) {
528
+ return;
529
+ }
530
+ const rowIndex: number | null = getChartRowIndex(
531
+ latest.current.data,
532
+ latest.current.index,
533
+ chartState,
534
+ );
535
+ if (rowIndex === null || getLabel(rowIndex) === null) {
536
+ return;
537
+ }
538
+ clearSelection();
539
+ isSelecting.current = true;
540
+ startIndexRef.current = rowIndex;
541
+ endIndexRef.current = rowIndex;
542
+ pressClientXRef.current =
543
+ typeof mouseEvent?.clientX === "number" ? mouseEvent.clientX : null;
544
+ listenForReleaseOffChart();
545
+ },
546
+ [clearSelection, doubleClickReset, getLabel, listenForReleaseOffChart],
547
+ );
548
+
549
+ // A chart unmounted mid-press stops listening for its release.
550
+ React.useEffect(() => {
551
+ return () => {
552
+ stopListeningForRelease();
553
+ };
554
+ }, [stopListeningForRelease]);
555
+
556
+ const isClickSuppressed: () => boolean = React.useCallback((): boolean => {
557
+ return suppressNextClickRef.current;
558
+ }, []);
559
+
560
+ const resetEventProps: ChartRangeSelectionRootProps = canReset
561
+ ? { onDoubleClick: doubleClickReset.onDoubleClick }
562
+ : {};
563
+
564
+ let chartEventProps: ChartRangeSelectionRootProps = {};
565
+
566
+ if (canSelect) {
567
+ chartEventProps = {
568
+ onMouseDown: onMouseDown,
569
+ onMouseMove: onMouseMove,
570
+ onMouseUp: onMouseUp,
571
+ throttledEvents: RANGE_SELECTION_THROTTLED_EVENTS,
572
+ /*
573
+ * The crosshair that says the plot can be dragged. It has to be on
574
+ * the chart root: recharts gives its wrapper, which fills the plot,
575
+ * an inline cursor: default that a class outside can't beat. Left
576
+ * off entirely otherwise - an explicit undefined would drop
577
+ * recharts' default too.
578
+ */
579
+ style: RANGE_SELECTION_ROOT_STYLE,
580
+ ...resetEventProps,
581
+ };
582
+ } else if (canReset) {
583
+ chartEventProps = {
584
+ onMouseDown: onMouseDown,
585
+ onMouseUp: onMouseUp,
586
+ ...resetEventProps,
587
+ };
588
+ }
589
+
590
+ return {
591
+ canSelect: canSelect,
592
+ selectionStartLabel: selectionStartLabel,
593
+ selectionEndLabel: selectionEndLabel,
594
+ isClickSuppressed: isClickSuppressed,
595
+ chartEventProps: chartEventProps,
596
+ };
597
+ };
598
+
599
+ export default useChartRangeSelection;
@@ -26,7 +26,14 @@ import ChartReferenceRegionProps from "../Types/ReferenceRegionProps";
26
26
  import ChartTimeReferenceLineProps from "../Types/TimeReferenceLineProps";
27
27
  import ExemplarPoint from "../Types/ExemplarPoint";
28
28
  import XAxisUtil from "../Utils/XAxis";
29
+ import XAxisType from "../Types/XAxis/XAxisType";
29
30
  import NoDataMessage from "../ChartGroup/NoDataMessage";
31
+ import {
32
+ ChartTimeRangeZoomContextValue,
33
+ ChartTimeRangeZoomHandlers,
34
+ resolveChartTimeRangeZoom,
35
+ useChartTimeRangeZoom,
36
+ } from "../TimeRangeZoom/TimeRangeZoomContext";
30
37
 
31
38
  export const LineChartPalette: Array<AvailableChartColorsKeys> = [
32
39
  "indigo",
@@ -60,6 +67,8 @@ export interface ComponentProps {
60
67
  /*
61
68
  * When provided, the chart supports drag-to-select: dragging across
62
69
  * buckets calls back with the [start, end) of the selected time range.
70
+ * Left unset, the chart zooms the enclosing page instead, when the page
71
+ * offers that (TimeRangeZoomScope).
63
72
  */
64
73
  onTimeRangeSelect?: ((startTime: Date, endTime: Date) => void) | undefined;
65
74
  /*
@@ -68,6 +77,11 @@ export interface ComponentProps {
68
77
  * onTimeRangeReset for why an idle handler costs click latency.
69
78
  */
70
79
  onTimeRangeReset?: (() => void) | undefined;
80
+ /*
81
+ * Keeps this chart out of drag-to-zoom altogether, including the page's:
82
+ * for a chart whose window is not the page's time range.
83
+ */
84
+ disableTimeRangeZoom?: boolean | undefined;
71
85
  // Plain click on a bucket — see ChartLibrary onBucketClick.
72
86
  onBucketClick?:
73
87
  | ((
@@ -105,6 +119,22 @@ const LineChartElement: FunctionComponent<LineInternalProps> = (
105
119
  ): ReactElement => {
106
120
  const [records, setRecords] = React.useState<Array<ChartDataPoint>>([]);
107
121
 
122
+ /*
123
+ * Drag-to-zoom: the host's own handlers, or else the enclosing page's
124
+ * (TimeRangeZoomScope), so a drag here retimes every chart on the page.
125
+ */
126
+ const pageZoom: ChartTimeRangeZoomContextValue | null =
127
+ useChartTimeRangeZoom();
128
+ const timeRangeZoom: ChartTimeRangeZoomHandlers = resolveChartTimeRangeZoom({
129
+ onTimeRangeSelect: props.onTimeRangeSelect,
130
+ onTimeRangeReset: props.onTimeRangeReset,
131
+ isTimeAxis:
132
+ props.xAxis.options.type === XAxisType.Time ||
133
+ props.xAxis.options.type === XAxisType.Date,
134
+ disableTimeRangeZoom: props.disableTimeRangeZoom,
135
+ pageZoom: pageZoom,
136
+ });
137
+
108
138
  const categories: Array<string> = props.data.map((item: SeriesPoint) => {
109
139
  return item.seriesName;
110
140
  });
@@ -244,8 +274,8 @@ const LineChartElement: FunctionComponent<LineInternalProps> = (
244
274
  formattedExemplars.length > 0 ? formattedExemplars : undefined
245
275
  }
246
276
  onExemplarClick={props.onExemplarClick}
247
- onTimeRangeSelect={props.onTimeRangeSelect}
248
- onTimeRangeReset={props.onTimeRangeReset}
277
+ onTimeRangeSelect={timeRangeZoom.onTimeRangeSelect}
278
+ onTimeRangeReset={timeRangeZoom.onTimeRangeReset}
249
279
  onBucketClick={props.onBucketClick}
250
280
  ghostCategories={props.ghostSeriesNames}
251
281
  />