@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,396 @@
1
+ import fs from "fs";
2
+ import os from "os";
3
+ import path from "path";
4
+ import ts from "typescript";
5
+
6
+ /*
7
+ * The Kubernetes AI agent (agents/KubernetesAIAgent) enforces the same
8
+ * kubectl rules as the server before it spawns anything: KubectlPolicy tiers
9
+ * the argv, KubectlWriteScope bounds where a write may land. It is a
10
+ * standalone package with no Common dependency, so it carries BYTE-IDENTICAL
11
+ * copies of those files (and everything they import) under
12
+ * agents/KubernetesAIAgent/Common/, in the same relative layout — plus the
13
+ * Runner's KubectlArgvGuard. If a copy drifts, the two sides of the trust
14
+ * boundary disagree about a command: the server approves what the agent
15
+ * refuses (every fix fails in the cluster), or the agent runs what the
16
+ * server would now refuse.
17
+ *
18
+ * So this fails when:
19
+ * - a copy differs from its source (run `npm run sync-common` in
20
+ * agents/KubernetesAIAgent);
21
+ * - the policy closure starts importing a file that is not copied (add it
22
+ * to agents/KubernetesAIAgent/Scripts/CommonCopies.json and sync), or
23
+ * anything that is not a relative import — a package, or the
24
+ * "Common/..." alias, which the agent cannot resolve;
25
+ * - the agent imports a Common file that is not in the copied set, or the
26
+ * set carries a copy nothing uses.
27
+ *
28
+ * Files (and the copy list) are read with fs, never required: Common's jest
29
+ * config maps any specifier containing "Common/" to this package, which
30
+ * would silently compare a file with itself.
31
+ */
32
+
33
+ const REPO_ROOT: string = path.resolve(__dirname, "..", "..", "..", "..", "..");
34
+ const COMMON_ROOT: string = path.join(REPO_ROOT, "packages", "Common");
35
+ const AGENT_ROOT: string = path.join(REPO_ROOT, "agents", "KubernetesAIAgent");
36
+ const AGENT_COMMON_ROOT: string = path.join(AGENT_ROOT, "Common");
37
+ // The list Scripts/SyncCommon.js (npm run sync-common) copies from.
38
+ const COPY_LIST: string = path.join(AGENT_ROOT, "Scripts", "CommonCopies.json");
39
+
40
+ interface CopyList {
41
+ commonPolicyFiles: Array<string>;
42
+ otherCopies: Array<{ source: string; target: string }>;
43
+ }
44
+
45
+ const copyList: CopyList = JSON.parse(
46
+ fs.readFileSync(COPY_LIST, "utf8"),
47
+ ) as CopyList;
48
+
49
+ const COPIED: Array<string> = [...copyList.commonPolicyFiles].sort();
50
+
51
+ // Every module specifier a TypeScript file imports or re-exports.
52
+ function getImportSpecifiers(file: string): Array<string> {
53
+ const source: ts.SourceFile = ts.createSourceFile(
54
+ file,
55
+ fs.readFileSync(file, "utf8"),
56
+ ts.ScriptTarget.Latest,
57
+ true,
58
+ );
59
+ const specifiers: Array<string> = [];
60
+
61
+ const visit: (node: ts.Node) => void = (node: ts.Node): void => {
62
+ if (
63
+ (ts.isImportDeclaration(node) || ts.isExportDeclaration(node)) &&
64
+ node.moduleSpecifier &&
65
+ ts.isStringLiteral(node.moduleSpecifier)
66
+ ) {
67
+ specifiers.push(node.moduleSpecifier.text);
68
+ }
69
+
70
+ if (
71
+ ts.isImportEqualsDeclaration(node) &&
72
+ ts.isExternalModuleReference(node.moduleReference) &&
73
+ ts.isStringLiteral(node.moduleReference.expression)
74
+ ) {
75
+ specifiers.push(node.moduleReference.expression.text);
76
+ }
77
+
78
+ if (
79
+ ts.isCallExpression(node) &&
80
+ (node.expression.kind === ts.SyntaxKind.ImportKeyword ||
81
+ (ts.isIdentifier(node.expression) &&
82
+ node.expression.text === "require")) &&
83
+ node.arguments[0] &&
84
+ ts.isStringLiteral(node.arguments[0])
85
+ ) {
86
+ specifiers.push(node.arguments[0].text);
87
+ }
88
+
89
+ ts.forEachChild(node, visit);
90
+ };
91
+
92
+ visit(source);
93
+ return specifiers;
94
+ }
95
+
96
+ // A relative specifier resolved to a .ts file, or null when none exists.
97
+ function resolveRelative(fromFile: string, specifier: string): string | null {
98
+ const base: string = path.resolve(path.dirname(fromFile), specifier);
99
+
100
+ for (const candidate of [
101
+ `${base}.ts`,
102
+ `${base}.tsx`,
103
+ path.join(base, "index.ts"),
104
+ path.join(base, "Index.ts"),
105
+ ]) {
106
+ if (fs.existsSync(candidate)) {
107
+ return candidate;
108
+ }
109
+ }
110
+
111
+ return null;
112
+ }
113
+
114
+ /*
115
+ * Walk the import graph from these Common files; returns every file reached
116
+ * (Common-relative) and every import that leaves the closure.
117
+ */
118
+ function walkClosure(
119
+ entries: Array<string>,
120
+ root: string = COMMON_ROOT,
121
+ ): {
122
+ files: Array<string>;
123
+ problems: Array<string>;
124
+ } {
125
+ const seen: Set<string> = new Set<string>();
126
+ const problems: Array<string> = [];
127
+ const stack: Array<string> = entries.map((relative: string): string => {
128
+ return path.join(root, relative);
129
+ });
130
+
131
+ while (stack.length > 0) {
132
+ const file: string = stack.pop()!;
133
+
134
+ if (seen.has(file)) {
135
+ continue;
136
+ }
137
+ seen.add(file);
138
+
139
+ for (const specifier of getImportSpecifiers(file)) {
140
+ const from: string = path.relative(root, file);
141
+
142
+ if (!specifier.startsWith(".")) {
143
+ problems.push(
144
+ `${from} imports "${specifier}", which is not a relative import the agent can carry`,
145
+ );
146
+ continue;
147
+ }
148
+
149
+ const resolved: string | null = resolveRelative(file, specifier);
150
+
151
+ if (!resolved) {
152
+ problems.push(`${from} imports "${specifier}", which does not resolve`);
153
+ continue;
154
+ }
155
+
156
+ if (!resolved.startsWith(`${root}${path.sep}`)) {
157
+ problems.push(
158
+ `${from} imports "${specifier}", outside packages/Common`,
159
+ );
160
+ continue;
161
+ }
162
+
163
+ stack.push(resolved);
164
+ }
165
+ }
166
+
167
+ return {
168
+ files: Array.from(seen)
169
+ .map((file: string): string => {
170
+ return path.relative(root, file).split(path.sep).join("/");
171
+ })
172
+ .sort(),
173
+ problems,
174
+ };
175
+ }
176
+
177
+ // The agent's own sources (everything but the copies, builds and deps).
178
+ function listAgentSources(dir: string = AGENT_ROOT): Array<string> {
179
+ const files: Array<string> = [];
180
+
181
+ for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
182
+ const full: string = path.join(dir, entry.name);
183
+
184
+ if (entry.isDirectory()) {
185
+ if (
186
+ ["node_modules", "build", "Common"].includes(entry.name) &&
187
+ dir === AGENT_ROOT
188
+ ) {
189
+ continue;
190
+ }
191
+ files.push(...listAgentSources(full));
192
+ } else if (entry.name.endsWith(".ts")) {
193
+ files.push(full);
194
+ }
195
+ }
196
+
197
+ return files;
198
+ }
199
+
200
+ // The copied Common files the agent's own sources import directly.
201
+ function getAgentEntryPoints(): Array<string> {
202
+ const entries: Set<string> = new Set<string>();
203
+
204
+ for (const file of listAgentSources()) {
205
+ for (const specifier of getImportSpecifiers(file)) {
206
+ if (!specifier.startsWith(".")) {
207
+ continue;
208
+ }
209
+
210
+ const target: string = path.resolve(path.dirname(file), specifier);
211
+
212
+ if (target.startsWith(`${AGENT_COMMON_ROOT}${path.sep}`)) {
213
+ entries.add(
214
+ path
215
+ .relative(AGENT_COMMON_ROOT, `${target}.ts`)
216
+ .split(path.sep)
217
+ .join("/"),
218
+ );
219
+ }
220
+ }
221
+ }
222
+
223
+ return Array.from(entries).sort();
224
+ }
225
+
226
+ describe("Kubernetes AI agent: copies of the kubectl policy closure", () => {
227
+ test("the copied set is the policy and everything it imports", () => {
228
+ expect(COPIED).toEqual(
229
+ expect.arrayContaining([
230
+ "Utils/AiRemediation/KubectlPolicy.ts",
231
+ "Utils/AiRemediation/KubectlWriteScope.ts",
232
+ "Utils/AiRemediation/CommandPolicy.ts",
233
+ "Types/Kubernetes/KubernetesClusterAiAccess.ts",
234
+ "Types/AutoRemediation/AiRemediationCommandPolicyVerdict.ts",
235
+ ]),
236
+ );
237
+ });
238
+
239
+ test.each(COPIED)(
240
+ "Common/%s is byte-identical to its source",
241
+ (relative: string) => {
242
+ const source: Buffer = fs.readFileSync(path.join(COMMON_ROOT, relative));
243
+ const copyPath: string = path.join(AGENT_COMMON_ROOT, relative);
244
+
245
+ expect({ relative, copied: fs.existsSync(copyPath) }).toEqual({
246
+ relative,
247
+ copied: true,
248
+ });
249
+ expect({
250
+ relative,
251
+ identical: source.equals(fs.readFileSync(copyPath)),
252
+ }).toEqual({
253
+ relative,
254
+ identical: true,
255
+ });
256
+ },
257
+ );
258
+
259
+ test.each(
260
+ copyList.otherCopies.map((copy: { source: string; target: string }) => {
261
+ return [copy.target, copy.source];
262
+ }),
263
+ )("%s is byte-identical to %s", (target: string, source: string) => {
264
+ expect(
265
+ fs
266
+ .readFileSync(path.join(REPO_ROOT, source))
267
+ .equals(fs.readFileSync(path.join(AGENT_ROOT, target))),
268
+ ).toBe(true);
269
+ });
270
+
271
+ test("the argv guard is among the verbatim copies", () => {
272
+ expect(copyList.otherCopies).toContainEqual({
273
+ source: "packages/Runner/Utils/KubectlArgvGuard.ts",
274
+ target: "KubectlArgvGuard.ts",
275
+ });
276
+ });
277
+
278
+ test("the closure imports nothing outside the copied set", () => {
279
+ const closure: { files: Array<string>; problems: Array<string> } =
280
+ walkClosure(COPIED);
281
+
282
+ expect(closure.problems).toEqual([]);
283
+ expect(closure.files).toEqual(COPIED);
284
+ });
285
+
286
+ test("the agent imports only copied files, and every copy is used", () => {
287
+ const entries: Array<string> = getAgentEntryPoints();
288
+
289
+ // Imported directly by the agent...
290
+ for (const entry of entries) {
291
+ expect({ entry, copied: COPIED.includes(entry) }).toEqual({
292
+ entry,
293
+ copied: true,
294
+ });
295
+ }
296
+
297
+ // ...and nothing copied that neither the agent nor the closure needs.
298
+ expect(walkClosure(entries).files).toEqual(COPIED);
299
+ });
300
+
301
+ test("the agent directory holds no stray copies", () => {
302
+ const present: Array<string> = [];
303
+ const walk: (dir: string) => void = (dir: string): void => {
304
+ for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
305
+ const full: string = path.join(dir, entry.name);
306
+ if (entry.isDirectory()) {
307
+ walk(full);
308
+ } else {
309
+ present.push(
310
+ path.relative(AGENT_COMMON_ROOT, full).split(path.sep).join("/"),
311
+ );
312
+ }
313
+ }
314
+ };
315
+ walk(AGENT_COMMON_ROOT);
316
+
317
+ expect(present.sort()).toEqual(COPIED);
318
+ });
319
+
320
+ describe("the checks themselves", () => {
321
+ test("imports that leave the closure are reported", () => {
322
+ const scratch: string = fs.mkdtempSync(path.join(os.tmpdir(), "parity-"));
323
+ const root: string = path.join(scratch, "Common");
324
+
325
+ try {
326
+ fs.mkdirSync(root);
327
+ fs.writeFileSync(
328
+ path.join(scratch, "Outside.ts"),
329
+ "export default 1;\n",
330
+ );
331
+ fs.writeFileSync(path.join(root, "Inside.ts"), "export default 2;\n");
332
+ fs.writeFileSync(
333
+ path.join(root, "Leaf.ts"),
334
+ [
335
+ 'import x from "lodash";',
336
+ 'import y from "./Missing";',
337
+ 'import z from "Common/Types/JSON";',
338
+ 'import o from "../Outside";',
339
+ 'import i from "./Inside";',
340
+ "export default [x, y, z, o, i];",
341
+ "",
342
+ ].join("\n"),
343
+ );
344
+
345
+ const closure: { files: Array<string>; problems: Array<string> } =
346
+ walkClosure(["Leaf.ts"], root);
347
+
348
+ expect(closure.files).toEqual(["Inside.ts", "Leaf.ts"]);
349
+ expect(closure.problems).toHaveLength(4);
350
+ expect(closure.problems[0]).toMatch(
351
+ /imports "lodash", which is not a relative import/,
352
+ );
353
+ expect(closure.problems[1]).toMatch(
354
+ /"\.\/Missing", which does not resolve/,
355
+ );
356
+ expect(closure.problems[2]).toMatch(/imports "Common\/Types\/JSON"/);
357
+ expect(closure.problems[3]).toMatch(
358
+ /"\.\.\/Outside", outside packages\/Common/,
359
+ );
360
+ } finally {
361
+ fs.rmSync(scratch, { recursive: true, force: true });
362
+ }
363
+ });
364
+
365
+ test("import specifiers are found in every form", () => {
366
+ const scratch: string = fs.mkdtempSync(path.join(os.tmpdir(), "parity-"));
367
+
368
+ try {
369
+ const file: string = path.join(scratch, "Forms.ts");
370
+ fs.writeFileSync(
371
+ file,
372
+ [
373
+ 'import a from "./a";',
374
+ 'import type { B } from "./b";',
375
+ 'export { c } from "./c";',
376
+ 'export * from "./d";',
377
+ 'const e = require("./e");',
378
+ 'const f = import("./f");',
379
+ "",
380
+ ].join("\n"),
381
+ );
382
+
383
+ expect(getImportSpecifiers(file)).toEqual([
384
+ "./a",
385
+ "./b",
386
+ "./c",
387
+ "./d",
388
+ "./e",
389
+ "./f",
390
+ ]);
391
+ } finally {
392
+ fs.rmSync(scratch, { recursive: true, force: true });
393
+ }
394
+ });
395
+ });
396
+ });
@@ -1,4 +1,4 @@
1
- import { describe, expect, test } from "@jest/globals";
1
+ import { afterEach, describe, expect, jest, test } from "@jest/globals";
2
2
  import DashboardTimeRangeZoomUtil, {
3
3
  DashboardTimeRangeZoomState,
4
4
  } from "../../../Utils/Dashboard/DashboardTimeRangeZoom";
@@ -165,6 +165,109 @@ describe("DashboardTimeRangeZoomUtil", () => {
165
165
  });
166
166
  });
167
167
 
168
+ /*
169
+ * Issue #4105: a panel's selection runs to the END of its last bucket, and
170
+ * the newest bucket of a rolling range is still filling up. Taken whole, a
171
+ * drag onto it would zoom the whole board to a window that ends in the
172
+ * future. The board's zoom now follows the same rule as the page-wide
173
+ * zoom and the log and trace histograms: never past the end of the window
174
+ * the board is on.
175
+ */
176
+ describe("zoomToWindow never runs past the board's window", () => {
177
+ afterEach(() => {
178
+ jest.useRealTimers();
179
+ });
180
+
181
+ test("a drag onto the newest bucket of a rolling range stops at now", () => {
182
+ jest.useFakeTimers();
183
+ jest.setSystemTime(new Date("2026-09-28T12:00:00.000Z"));
184
+ const state: DashboardTimeRangeZoomState =
185
+ DashboardTimeRangeZoomUtil.getInitialState(ROLLING_HOUR);
186
+
187
+ const zoomed: DashboardTimeRangeZoomState =
188
+ DashboardTimeRangeZoomUtil.zoomToWindow(
189
+ state,
190
+ new Date("2026-09-28T11:50:00.000Z"),
191
+ new Date("2026-09-28T12:01:00.000Z"),
192
+ );
193
+
194
+ expect(zoomed.current.startAndEndDate?.startValue.toISOString()).toBe(
195
+ "2026-09-28T11:50:00.000Z",
196
+ );
197
+ expect(zoomed.current.startAndEndDate?.endValue.toISOString()).toBe(
198
+ "2026-09-28T12:00:00.000Z",
199
+ );
200
+ // The way back is untouched: the rolling hour itself.
201
+ expect(zoomed.baseline).toBe(ROLLING_HOUR);
202
+ });
203
+
204
+ test("a drag past the end of a pinned range stops at that end", () => {
205
+ const state: DashboardTimeRangeZoomState =
206
+ DashboardTimeRangeZoomUtil.getInitialState(PINNED_DAY);
207
+
208
+ const zoomed: DashboardTimeRangeZoomState =
209
+ DashboardTimeRangeZoomUtil.zoomToWindow(
210
+ state,
211
+ new Date("2026-08-20T23:30:00.000Z"),
212
+ new Date("2026-08-21T00:10:00.000Z"),
213
+ );
214
+
215
+ expect(zoomed.current.startAndEndDate?.endValue.toISOString()).toBe(
216
+ "2026-08-21T00:00:00.000Z",
217
+ );
218
+ });
219
+
220
+ test("a drag wholly inside the window is kept as it is", () => {
221
+ const state: DashboardTimeRangeZoomState =
222
+ DashboardTimeRangeZoomUtil.getInitialState(PINNED_DAY);
223
+
224
+ const zoomed: DashboardTimeRangeZoomState =
225
+ DashboardTimeRangeZoomUtil.zoomToWindow(state, DRAG_START, DRAG_END);
226
+
227
+ expect(zoomed.current.startAndEndDate?.endValue).toEqual(DRAG_END);
228
+ });
229
+
230
+ test("a selection that starts after the window ends is not clamped away", () => {
231
+ // The chart can still be drawing a window the board has since left.
232
+ const state: DashboardTimeRangeZoomState =
233
+ DashboardTimeRangeZoomUtil.getInitialState(PINNED_DAY);
234
+
235
+ const zoomed: DashboardTimeRangeZoomState =
236
+ DashboardTimeRangeZoomUtil.zoomToWindow(
237
+ state,
238
+ new Date("2026-08-22T01:00:00.000Z"),
239
+ new Date("2026-08-22T02:00:00.000Z"),
240
+ );
241
+
242
+ expect(zoomed.current.startAndEndDate?.startValue.toISOString()).toBe(
243
+ "2026-08-22T01:00:00.000Z",
244
+ );
245
+ expect(zoomed.current.startAndEndDate?.endValue.toISOString()).toBe(
246
+ "2026-08-22T02:00:00.000Z",
247
+ );
248
+ });
249
+
250
+ test("the zoomed window's end is clamped against the CURRENT window, even when already zoomed", () => {
251
+ const first: DashboardTimeRangeZoomState =
252
+ DashboardTimeRangeZoomUtil.zoomToWindow(
253
+ DashboardTimeRangeZoomUtil.getInitialState(PINNED_DAY),
254
+ DRAG_START,
255
+ DRAG_END,
256
+ );
257
+
258
+ const second: DashboardTimeRangeZoomState =
259
+ DashboardTimeRangeZoomUtil.zoomToWindow(
260
+ first,
261
+ NARROWER_START,
262
+ new Date("2026-08-20T09:40:00.000Z"),
263
+ );
264
+
265
+ expect(second.current.startAndEndDate?.endValue).toEqual(DRAG_END);
266
+ // And the original range is still the way back.
267
+ expect(second.baseline).toBe(PINNED_DAY);
268
+ });
269
+ });
270
+
168
271
  describe("resetZoom", () => {
169
272
  test("restores the range the board had before the first drag", () => {
170
273
  const zoomed: DashboardTimeRangeZoomState =
@@ -17,12 +17,17 @@ enum AIRunType {
17
17
  RemediationPlan = "RemediationPlan",
18
18
  /*
19
19
  * An auto-remediation run that COMPOSES commands instead of picking a
20
- * runbook (rules with aiComposesCommands). In Suggest mode it
20
+ * runbook: rules with aiComposesCommands, and cluster rounds a
21
+ * Kubernetes cluster's AI agent page asks for. In Suggest mode it
21
22
  * investigates read-only and proposes a command plan for one-click
22
23
  * approval; in FullAuto mode it may also execute commands inline, but
23
- * only ones that match the rule's operator-authored allowlist and pass
24
- * the structural policy guard. Requires Project.enableAiCommandExecution
25
- * and a target Runner with canRunAiCommands.
24
+ * only ones that pass the structural policy guard and match the rule's
25
+ * operator-authored allowlist (or the cluster's Fixes mode). Rule runs
26
+ * require Project.enableAiCommandExecution (Bash/SSH on Runners, and any
27
+ * kubectl a rule composes) and a target Runner with canRunAiCommands. A
28
+ * cluster round's consent is the cluster's Fixes mode plus the Kubernetes
29
+ * agent chart's write access; it needs the project opt-in only when the
30
+ * cluster is reached through a Runner with a Kubernetes credential.
26
31
  */
27
32
  RemediationExecution = "RemediationExecution",
28
33
  }
@@ -2,6 +2,12 @@ export type InvestigationNotStartedCode =
2
2
  | "ai_disabled"
3
3
  | "automatic_investigation_disabled"
4
4
  | "provider_missing"
5
+ /*
6
+ * The project runs on OneUptime's own (billed) LLM provider and has no AI
7
+ * credits left, with auto-recharge off — every model call would be
8
+ * refused with "Insufficient AI balance", so no run is started.
9
+ */
10
+ | "insufficient_ai_balance"
5
11
  | "severity_below_threshold"
6
12
  | "monitor_cooldown"
7
13
  | "daily_budget_exhausted"
@@ -4,6 +4,20 @@ import {
4
4
  KubectlCommandTier,
5
5
  PROTECTED_KUBERNETES_NAMESPACES,
6
6
  } from "../Kubernetes/KubernetesClusterAiAccess";
7
+ import {
8
+ AiRemediationCommandPolicyVerdict,
9
+ MAX_COMMAND_LENGTH_CHARS,
10
+ } from "./AiRemediationCommandPolicyVerdict";
11
+
12
+ /*
13
+ * Defined in a leaf module of their own (no imports) so the pure kubectl
14
+ * policy closure — KubectlPolicy, KubectlWriteScope, CommandPolicy and the
15
+ * types they read — can be copied verbatim into the standalone Kubernetes AI
16
+ * agent (agents/KubernetesAIAgent) without dragging this file, and through
17
+ * its JSON import most of Common, along. Re-exported here so every existing
18
+ * importer keeps working.
19
+ */
20
+ export { AiRemediationCommandPolicyVerdict, MAX_COMMAND_LENGTH_CHARS };
7
21
 
8
22
  /*
9
23
  * The AI-composed command plan stored on
@@ -26,21 +40,6 @@ export const AI_COMMAND_STEP_TYPES: Array<RunbookStepType> = [
26
40
  RunbookStepType.Kubectl,
27
41
  ];
28
42
 
29
- export enum AiRemediationCommandPolicyVerdict {
30
- /*
31
- * Matched the rule's operator-authored allowlist and passed the
32
- * structural chain guard — eligible for FullAuto inline execution.
33
- */
34
- AutoApproved = "AutoApproved",
35
- // Not denylisted, but a human must approve before it runs.
36
- RequiresApproval = "RequiresApproval",
37
- /*
38
- * Matched the hard denylist. Denied commands are never stored in a plan —
39
- * the verdict exists so policy evaluation has a complete result type.
40
- */
41
- Denied = "Denied",
42
- }
43
-
44
43
  export enum AiRemediationCommandExecutionStatus {
45
44
  Pending = "Pending",
46
45
  Running = "Running",
@@ -186,7 +185,6 @@ export function getRollbackCommandStepId(
186
185
 
187
186
  // Hard caps — enforced at plan acceptance, not just in the prompt.
188
187
  export const MAX_PLAN_COMMANDS: number = 5;
189
- export const MAX_COMMAND_LENGTH_CHARS: number = 2000;
190
188
  export const MIN_COMMAND_TIMEOUT_MS: number = 1000;
191
189
  export const MAX_COMMAND_TIMEOUT_MS: number = 5 * 60 * 1000;
192
190
  export const DEFAULT_COMMAND_TIMEOUT_MS: number = 60 * 1000;
@@ -0,0 +1,28 @@
1
+ /*
2
+ * The verdict the command policies (CommandPolicy, KubectlPolicy) give one
3
+ * AI-composed command, and the longest command either accepts.
4
+ *
5
+ * A leaf module with no imports on purpose: it is part of the pure policy
6
+ * closure that agents/KubernetesAIAgent carries a byte-identical copy of
7
+ * (see Tests/Utils/AiRemediation/KubernetesAiAgentPolicyCopyParity.test.ts),
8
+ * so it must never import anything outside that closure.
9
+ * AiRemediationCommandPlan re-exports both names.
10
+ */
11
+
12
+ export enum AiRemediationCommandPolicyVerdict {
13
+ /*
14
+ * Matched the rule's operator-authored allowlist and passed the
15
+ * structural chain guard — eligible for FullAuto inline execution.
16
+ */
17
+ AutoApproved = "AutoApproved",
18
+ // Not denylisted, but a human must approve before it runs.
19
+ RequiresApproval = "RequiresApproval",
20
+ /*
21
+ * Matched the hard denylist. Denied commands are never stored in a plan —
22
+ * the verdict exists so policy evaluation has a complete result type.
23
+ */
24
+ Denied = "Denied",
25
+ }
26
+
27
+ // Hard cap — enforced at plan acceptance, not just in the prompt.
28
+ export const MAX_COMMAND_LENGTH_CHARS: number = 2000;
@@ -38,7 +38,8 @@ export default interface DashboardTraceChartComponent extends BaseComponent {
38
38
  * (e.g. "#6366f1"). Single-series → the series color; split charts → the
39
39
  * first unpinned series, with the rest following the default palette.
40
40
  * Same semantics as MetricQueryConfigData.color on the metric Chart
41
- * widget. Unset = Auto (default palette).
41
+ * widget. Unset = Auto (default palette). A split by statusCode ignores
42
+ * it: each status keeps its own color unless pinned.
42
43
  */
43
44
  color?: string | undefined;
44
45
  /*
@@ -46,7 +47,8 @@ export default interface DashboardTraceChartComponent extends BaseComponent {
46
47
  * (e.g. { "url.host=api.example.com": "#10b981" }) — the same storage
47
48
  * shape as MetricQueryConfigData.colorsByGroup, so the shared
48
49
  * SeriesGroupColorSelector editor works unchanged. Unpinned series fall
49
- * back to `color` (lead) then the default palette.
50
+ * back to `color` (lead) then the default palette — or, in a statusCode
51
+ * split, to each status's own color.
50
52
  */
51
53
  colorsByGroup?: Record<string, string> | undefined;
52
54
  /*