@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.
- package/Models/DatabaseModels/Index.ts +2 -0
- package/Models/DatabaseModels/KubernetesAiAgent.ts +364 -0
- package/Models/DatabaseModels/KubernetesCluster.ts +3 -3
- package/Models/DatabaseModels/Project.ts +55 -5
- package/Models/DatabaseModels/ProxmoxResource.ts +49 -1
- package/Models/DatabaseModels/RunnerJob.ts +75 -0
- package/Models/DatabaseModels/TeamComplianceSetting.ts +143 -2
- package/Models/DatabaseModels/WorkspaceProjectAuthToken.ts +17 -0
- package/Server/API/AIChatAPI.ts +6 -3
- package/Server/API/AIInvestigationAPI.ts +17 -10
- package/Server/API/AutoRemediationAPI.ts +207 -25
- package/Server/API/KubernetesClusterAiAccessAPI.ts +623 -21
- package/Server/API/MicrosoftTeamsAPI.ts +93 -14
- package/Server/API/ProxmoxResourceAPI.ts +244 -14
- package/Server/Infrastructure/GlobalCache.ts +32 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1796000000000-AddTeamComplianceRuleScope.ts +99 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1796100000000-AddKubernetesAiAgentAndAiDefaults.ts +137 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1796200000000-AddProxmoxResourceNativePushColumns.ts +42 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +6 -0
- package/Server/Middleware/TelemetryIngest.ts +41 -18
- package/Server/Services/AIService.ts +70 -1
- package/Server/Services/AlertService.ts +352 -11
- package/Server/Services/AlertSeverityService.ts +65 -15
- package/Server/Services/AutoRemediationRuleService.ts +1 -1
- package/Server/Services/IncidentService.ts +280 -104
- package/Server/Services/IncidentSeverityService.ts +66 -15
- package/Server/Services/KubernetesAiAgentJobService.ts +185 -0
- package/Server/Services/KubernetesAiAgentService.ts +1634 -0
- package/Server/Services/KubernetesClusterAiAccessService.ts +1118 -451
- package/Server/Services/KubernetesClusterService.ts +129 -21
- package/Server/Services/ProjectService.ts +32 -0
- package/Server/Services/ProxmoxResourceService.ts +322 -5
- package/Server/Services/RunnerJobService.ts +241 -104
- package/Server/Services/RunnerService.ts +1 -1
- package/Server/Services/ScheduledMaintenanceService.ts +737 -1
- package/Server/Services/ScheduledMaintenanceStateTimelineService.ts +414 -56
- package/Server/Services/TeamComplianceSettingService.ts +1125 -9
- package/Server/Utils/AI/ClusterAccess/ClusterAccessContext.ts +67 -9
- package/Server/Utils/AI/ClusterAccess/KubectlInvestigationToolkit.ts +39 -10
- package/Server/Utils/AI/ClusterAccess/KubectlJobRunner.ts +14 -3
- package/Server/Utils/AI/Remediation/RemediationCommandTools.ts +37 -15
- package/Server/Utils/AI/Remediation/RemediationExecutionRunner.ts +67 -24
- package/Server/Utils/AI/SRE/AIInvestigationEngine.ts +48 -5
- package/Server/Utils/AI/SRE/IncidentPostmortemRunner.ts +40 -8
- package/Server/Utils/AI/SRE/InvestigationEligibility.ts +13 -2
- package/Server/Utils/AI/SRE/InvestigationGrader.ts +1 -1
- package/Server/Utils/AutoRemediation/CommandPlanExecutor.ts +6 -1
- package/Server/Utils/Telemetry/InventoryEntityRegistry.ts +133 -7
- package/Server/Utils/Telemetry/ProxmoxCephSnapshotScan.ts +58 -4
- package/Server/Utils/Telemetry/ProxmoxNativeNodeLiveness.ts +447 -0
- package/Server/Utils/Telemetry/ProxmoxNativePush.ts +903 -0
- package/Server/Utils/Telemetry/TelemetryEntity.ts +87 -27
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +684 -47
- package/Tests/App/AdminDashboard/RowActionPlacementOverrides.test.tsx +278 -0
- package/Tests/App/Dashboard/AIChatChartWidgetZoom.test.tsx +738 -0
- package/Tests/App/Dashboard/AIFeaturesSettingsPointers.test.tsx +147 -0
- package/Tests/App/Dashboard/AIInsightsKubernetesClusterPage.test.tsx +1523 -0
- package/Tests/App/Dashboard/AdminUserNotificationMethodsPage.test.tsx +463 -3
- package/Tests/App/Dashboard/AffectedResourcesPickerDropdownPlacement.test.tsx +958 -0
- package/Tests/App/Dashboard/AffectedResourcesPickerFocusLeave.test.tsx +595 -0
- package/Tests/App/Dashboard/AskAiAvailability.test.ts +20 -3
- package/Tests/App/Dashboard/AskAiDisabled.test.tsx +8 -3
- package/Tests/App/Dashboard/CephRateChartReload.test.tsx +1456 -0
- package/Tests/App/Dashboard/CephTimeRangeZoom.test.tsx +1229 -0
- package/Tests/App/Dashboard/ChartCardTimeRangeZoom.test.tsx +151 -0
- package/Tests/App/Dashboard/ChartCardZoomAffordances.test.tsx +257 -0
- package/Tests/App/Dashboard/ChartRefetchFrame.test.tsx +141 -0
- package/Tests/App/Dashboard/ChartZoomHarness.tsx +249 -0
- package/Tests/App/Dashboard/ChartZoomStandIn.tsx +131 -0
- package/Tests/App/Dashboard/CloudServerlessSlowLoads.test.tsx +628 -0
- package/Tests/App/Dashboard/CloudServerlessTimeRangeZoom.test.tsx +607 -0
- package/Tests/App/Dashboard/ClusterAccessNotice.test.tsx +91 -19
- package/Tests/App/Dashboard/CompanionMetricsTabZoom.test.tsx +632 -0
- package/Tests/App/Dashboard/ContainerChartZoomStandIn.tsx +195 -0
- package/Tests/App/Dashboard/ContainerHostOverviewSlowLoads.test.tsx +542 -0
- package/Tests/App/Dashboard/ContainerHostOverviewTimeRangeZoom.test.tsx +848 -0
- package/Tests/App/Dashboard/ContainerMetricsTimeRangeZoom.test.tsx +561 -0
- package/Tests/App/Dashboard/DashboardBoardWideZoomShell.test.tsx +1147 -0
- package/Tests/App/Dashboard/DashboardEditPermissions.test.tsx +3 -2
- package/Tests/App/Dashboard/DashboardHistogramWidgetDragCursor.test.tsx +399 -0
- package/Tests/App/Dashboard/DashboardHistogramWidgetZoom.test.tsx +985 -0
- package/Tests/App/Dashboard/DashboardHistogramWidgetZoomHint.test.tsx +803 -0
- package/Tests/App/Dashboard/DashboardLazyPages.test.tsx +1 -0
- package/Tests/App/Dashboard/DashboardSettingsPreviewZoom.test.tsx +679 -0
- package/Tests/App/Dashboard/DashboardSloAndDataSourceChartZoom.test.tsx +881 -0
- package/Tests/App/Dashboard/DashboardTraceStatusWidgets.test.tsx +878 -0
- package/Tests/App/Dashboard/DatabaseMetricChartModalTimeRangeZoom.test.tsx +442 -0
- package/Tests/App/Dashboard/DatabaseOverviewTimeRangeZoom.test.tsx +831 -0
- package/Tests/App/Dashboard/DatabaseServerComponents.test.tsx +43 -0
- package/Tests/App/Dashboard/DockerSwarmInsightsTimeRangeZoom.test.tsx +524 -0
- package/Tests/App/Dashboard/DockerSwarmRateChartRefresh.test.tsx +259 -0
- package/Tests/App/Dashboard/EdgeDetailPanelHistory.test.tsx +763 -0
- package/Tests/App/Dashboard/EdgeDetailPanelTimeRangeZoom.test.tsx +547 -0
- package/Tests/App/Dashboard/EdgeHistoryBucketsCases.tsx +565 -0
- package/Tests/App/Dashboard/EdgeHistoryBucketsKathmandu.test.tsx +73 -0
- package/Tests/App/Dashboard/EdgeHistoryBucketsKolkata.test.tsx +74 -0
- package/Tests/App/Dashboard/EdgeHistoryBucketsNewYork.test.tsx +72 -0
- package/Tests/App/Dashboard/EdgeHistoryBucketsUtc.test.tsx +72 -0
- package/Tests/App/Dashboard/EmbeddedMetricCardRefresh.test.tsx +310 -0
- package/Tests/App/Dashboard/EmbeddedMetricCardTimeRangeZoom.test.tsx +536 -0
- package/Tests/App/Dashboard/EscalationRuleReadiness.test.tsx +3 -1
- package/Tests/App/Dashboard/EscalationRuleRowActions.test.tsx +660 -0
- package/Tests/App/Dashboard/EventNotes.test.tsx +2 -2
- package/Tests/App/Dashboard/EventOverviewPages.test.tsx +587 -13
- package/Tests/App/Dashboard/EventOverviewSnapshotExplorerZoom.test.tsx +1139 -0
- package/Tests/App/Dashboard/EventOverviewSnapshotZoomAcrossTabs.test.tsx +1057 -0
- package/Tests/App/Dashboard/EventOverviewTelemetrySnapshotZoom.test.tsx +757 -0
- package/Tests/App/Dashboard/ExceptionOccurrenceTrendZoom.test.tsx +675 -0
- package/Tests/App/Dashboard/ExceptionOccurrencesZoomSurvivesViewSwitch.test.tsx +405 -0
- package/Tests/App/Dashboard/ExceptionSignalPages.test.tsx +67 -3
- package/Tests/App/Dashboard/ExceptionTablesSpanStatus.test.tsx +515 -0
- package/Tests/App/Dashboard/ExplorerOwnZoomRegression.test.tsx +739 -0
- package/Tests/App/Dashboard/FlowBandwidthAxisCases.tsx +461 -0
- package/Tests/App/Dashboard/FlowBandwidthAxisKathmandu.test.tsx +25 -0
- package/Tests/App/Dashboard/FlowBandwidthAxisKolkata.test.tsx +25 -0
- package/Tests/App/Dashboard/FlowBandwidthAxisNewYork.test.tsx +25 -0
- package/Tests/App/Dashboard/FlowBandwidthAxisUtc.test.tsx +24 -0
- package/Tests/App/Dashboard/FlowTopTalkersZoomRefetch.test.tsx +722 -0
- package/Tests/App/Dashboard/FlowViewportGuard.test.tsx +2526 -0
- package/Tests/App/Dashboard/HostPagesSlowLoads.test.tsx +872 -0
- package/Tests/App/Dashboard/HostPagesTimeRangeZoom.test.tsx +1208 -0
- package/Tests/App/Dashboard/IncidentRootCauseTimeRangeZoom.test.tsx +358 -0
- package/Tests/App/Dashboard/InfrastructureGraph.test.tsx +100 -9
- package/Tests/App/Dashboard/InfrastructureMetricsTabTimeRangeZoom.test.tsx +485 -0
- package/Tests/App/Dashboard/InvestigationDrawerCompanionZoom.test.tsx +655 -0
- package/Tests/App/Dashboard/InvestigationDrawerZoom.test.tsx +830 -0
- package/Tests/App/Dashboard/InvestigationNotStarted.test.tsx +338 -2
- package/Tests/App/Dashboard/InvoicesPayInvoice.test.tsx +454 -16
- package/Tests/App/Dashboard/KubernetesClusterAiAccessSettings.test.ts +799 -819
- package/Tests/App/Dashboard/KubernetesClusterAiAgentOverviewCard.test.tsx +367 -0
- package/Tests/App/Dashboard/KubernetesClusterAiAgentStatus.test.ts +1202 -0
- package/Tests/App/Dashboard/KubernetesClusterAiDocumentationMarkdown.test.ts +106 -0
- package/Tests/App/Dashboard/KubernetesClusterAiNavigation.test.tsx +354 -0
- package/Tests/App/Dashboard/KubernetesClusterAiPage.test.tsx +1884 -2054
- package/Tests/App/Dashboard/KubernetesClusterAiPageServerParity.test.ts +478 -179
- package/Tests/App/Dashboard/KubernetesClusterMetricTooltips.test.ts +50 -0
- package/Tests/App/Dashboard/KubernetesClusterOverviewTooltips.test.tsx +2 -1
- package/Tests/App/Dashboard/KubernetesClusterOverviewZoom.test.tsx +1217 -0
- package/Tests/App/Dashboard/KubernetesClusterPagesZoom.test.tsx +731 -0
- package/Tests/App/Dashboard/KubernetesCostsLoadRecovery.test.tsx +869 -0
- package/Tests/App/Dashboard/KubernetesCostsZoom.test.tsx +1214 -0
- package/Tests/App/Dashboard/KubernetesCostsZoomExactHours.test.tsx +692 -0
- package/Tests/App/Dashboard/KubernetesNetworkThroughputReload.test.tsx +902 -0
- package/Tests/App/Dashboard/KubernetesNetworkZoomBucketEdges.test.tsx +571 -0
- package/Tests/App/Dashboard/KubernetesOverviewZoomBucketEdges.test.tsx +697 -0
- package/Tests/App/Dashboard/KubernetesResourceMetricsTabZoom.test.tsx +633 -0
- package/Tests/App/Dashboard/LogsExplorerTimeRangeZoom.test.tsx +470 -0
- package/Tests/App/Dashboard/LogsInsightsTimeRangeZoom.test.tsx +948 -0
- package/Tests/App/Dashboard/LogsViewerPinnedWindowZoom.test.tsx +486 -0
- package/Tests/App/Dashboard/MetricChartsBucketInspectorDoubleClick.test.tsx +1001 -0
- package/Tests/App/Dashboard/MetricExplorerInvestigationAutoRefresh.test.tsx +514 -0
- package/Tests/App/Dashboard/MetricExplorerSavedViewZoomRoundTrip.test.tsx +581 -0
- package/Tests/App/Dashboard/MetricExplorerTimeRangeZoom.test.tsx +1162 -0
- package/Tests/App/Dashboard/MetricMonitorPreviewZoomLabel.test.ts +72 -0
- package/Tests/App/Dashboard/MetricRowSparklineTimeRangeZoom.test.tsx +204 -0
- package/Tests/App/Dashboard/MetricViewFirstResultLands.test.tsx +408 -0
- package/Tests/App/Dashboard/MetricViewOwnZoomResetPlacement.test.tsx +952 -0
- package/Tests/App/Dashboard/MetricViewTimeRange.test.ts +139 -0
- package/Tests/App/Dashboard/MetricViewTimeRangeZoom.test.tsx +556 -0
- package/Tests/App/Dashboard/MonitorMetricsChartWrappersZoom.test.tsx +552 -0
- package/Tests/App/Dashboard/MonitorMetricsTabsTimeRangeZoom.test.tsx +740 -0
- package/Tests/App/Dashboard/MonitorOverviewChartsTimeRangeZoom.test.tsx +735 -0
- package/Tests/App/Dashboard/MonitorStepPreviewsTimeRangeZoom.test.tsx +835 -0
- package/Tests/App/Dashboard/NetworkDeviceTimeRangeZoom.test.tsx +1115 -0
- package/Tests/App/Dashboard/OnCallPreventionGuards.test.tsx +186 -17
- package/Tests/App/Dashboard/OnCallRulesDeleteGuard.test.tsx +155 -46
- package/Tests/App/Dashboard/PasskeySettings.test.tsx +87 -2
- package/Tests/App/Dashboard/ProjectAISettingsPages.test.tsx +884 -0
- package/Tests/App/Dashboard/ProxmoxNodeRemove.test.tsx +621 -0
- package/Tests/App/Dashboard/ProxmoxOverviewSlowLoads.test.tsx +584 -0
- package/Tests/App/Dashboard/ProxmoxPagesTimeRangeZoom.test.tsx +823 -0
- package/Tests/App/Dashboard/ProxmoxRateChartReload.test.tsx +1253 -0
- package/Tests/App/Dashboard/PublicDashboardBoardWideZoom.test.tsx +605 -0
- package/Tests/App/Dashboard/RealRowsLineChart.tsx +250 -0
- package/Tests/App/Dashboard/RechartsHostsPlotCursor.test.tsx +513 -0
- package/Tests/App/Dashboard/RowActionPlacementOverrides.test.tsx +865 -0
- package/Tests/App/Dashboard/RumOverviewTimeRangeZoom.test.tsx +877 -0
- package/Tests/App/Dashboard/RunnerKubernetesAgentForm.test.tsx +20 -4
- package/Tests/App/Dashboard/RunnerSupersededByAiAgentNote.test.tsx +296 -0
- package/Tests/App/Dashboard/SecurityEventConnectionsTable.test.tsx +146 -36
- package/Tests/App/Dashboard/ServiceDatabaseSlowLoads.test.tsx +1166 -0
- package/Tests/App/Dashboard/ServiceMapGraph.test.tsx +1243 -104
- package/Tests/App/Dashboard/ServiceOverviewTimeRangeZoom.test.tsx +792 -0
- package/Tests/App/Dashboard/SloBudgetBurnDownZoom.test.tsx +771 -0
- package/Tests/App/Dashboard/SloBudgetBurnDownZoomAffordances.test.tsx +380 -0
- package/Tests/App/Dashboard/SloEventMetricsBarChartZoom.test.tsx +369 -0
- package/Tests/App/Dashboard/SloHistoryChartsTimeRangeZoom.test.tsx +694 -0
- package/Tests/App/Dashboard/SloHistoryChartsZoomAffordances.test.tsx +497 -0
- package/Tests/App/Dashboard/SloMetricsTimeRangeZoom.test.tsx +541 -0
- package/Tests/App/Dashboard/SlowLoadHarness.ts +123 -0
- package/Tests/App/Dashboard/SnapshotExplorerPrimaryZoom.test.tsx +1194 -0
- package/Tests/App/Dashboard/SnapshotViewerPinnedWindow.test.tsx +620 -0
- package/Tests/App/Dashboard/TelemetrySnapshotPanelTimeRangeZoom.test.tsx +765 -0
- package/Tests/App/Dashboard/TelemetrySnapshotZoom.test.tsx +516 -0
- package/Tests/App/Dashboard/TelemetrySnapshotZoomAcrossTabs.test.tsx +827 -0
- package/Tests/App/Dashboard/TimeRangeZoomPageHarness.tsx +463 -0
- package/Tests/App/Dashboard/TraceChartEditorStatusSplit.test.tsx +543 -0
- package/Tests/App/Dashboard/TraceStatusPresentation.test.tsx +967 -0
- package/Tests/App/Dashboard/TraceTimelineMinimapZoom.test.tsx +315 -0
- package/Tests/App/Dashboard/TracesAnalyticsStatusSplit.test.tsx +778 -0
- package/Tests/App/Dashboard/TracesAnalyticsViewZoom.test.tsx +349 -0
- package/Tests/App/Dashboard/TracesExplorerTimeRangeZoom.test.tsx +551 -0
- package/Tests/App/Dashboard/TracesStatusChartAndFacet.test.tsx +687 -0
- package/Tests/App/Dashboard/TracesViewerStaleResponses.test.tsx +458 -0
- package/Tests/App/Dashboard/UptimeStripsExcludedFromZoom.test.tsx +406 -0
- package/Tests/App/Dashboard/VMwareOverviewSlowLoads.test.tsx +535 -0
- package/Tests/App/Dashboard/VMwarePagesTimeRangeZoom.test.tsx +606 -0
- package/Tests/App/Dashboard/ValueWidgetSparklineStaleHover.test.tsx +1292 -0
- package/Tests/App/Dashboard/ValueWidgetSparklineZoom.test.tsx +765 -0
- package/Tests/App/StatusPage/StatusPageResourceExplorer.test.tsx +98 -0
- package/Tests/Models/DatabaseModels/KubernetesAiAgentModel.test.ts +295 -0
- package/Tests/Models/DatabaseModels/TeamComplianceSettingModel.test.ts +347 -0
- package/Tests/Server/API/AIChatRouteAuthorization.test.ts +58 -0
- package/Tests/Server/API/AIGenerationProjectAIToggle.test.ts +1 -1
- package/Tests/Server/API/AIInvestigationAPI.test.ts +123 -45
- package/Tests/Server/API/AutoRemediationApproveClusterRound.test.ts +1329 -0
- package/Tests/Server/API/AutoRemediationApproveKubectlRecheck.test.ts +25 -2
- package/Tests/Server/API/KubernetesClusterAiAccessAPI.test.ts +2 -0
- package/Tests/Server/API/KubernetesClusterAiAccessAPIAgent.test.ts +903 -0
- package/Tests/Server/API/MicrosoftTeamsChatsRefreshRoute.test.ts +667 -0
- package/Tests/Server/API/MicrosoftTeamsManifest.test.ts +294 -6
- package/Tests/Server/API/ProxmoxResourceAPIRemoveNode.test.ts +1932 -0
- package/Tests/Server/Infrastructure/GlobalCache.test.ts +195 -0
- package/Tests/Server/Infrastructure/Postgres/AddKubernetesAiAgentAndAiDefaultsMigration.test.ts +623 -0
- package/Tests/Server/Infrastructure/Postgres/AddKubernetesClusterAiAccessMigration.test.ts +87 -10
- package/Tests/Server/Infrastructure/Postgres/AddTeamComplianceRuleScopeMigration.test.ts +622 -0
- package/Tests/Server/Middleware/TelemetryIngestBrowserKey.test.ts +61 -4
- package/Tests/Server/Middleware/TelemetryIngestKubernetesAgentRunnerPinnedKey.test.ts +98 -2
- package/Tests/Server/Middleware/TelemetryIngestKubernetesAgentRunnerRateLimit.test.ts +105 -2
- package/Tests/Server/Services/AIServiceBalanceBlocker.test.ts +282 -0
- package/Tests/Server/Services/AlertMonitorClearWritesNull.test.ts +409 -0
- package/Tests/Server/Services/AlertMonitorEditFeed.test.ts +474 -0
- package/Tests/Server/Services/AlertMonitorEditGuard.test.ts +610 -0
- package/Tests/Server/Services/AutoRemediationClusterRuleEngine.test.ts +2 -0
- package/Tests/Server/Services/AutoRemediationRuleCommandRunners.test.ts +2 -1
- package/Tests/Server/Services/IncidentAffectedMonitorsEdit.test.ts +1360 -0
- package/Tests/Server/Services/IncidentAlertSloLinkSurvivesEdit.test.ts +3 -1
- package/Tests/Server/Services/IncidentSeverityDeletePausesComplianceRules.test.ts +488 -0
- package/Tests/Server/Services/KubernetesAiAgentJobService.test.ts +329 -0
- package/Tests/Server/Services/KubernetesAiAgentServiceHelpers.test.ts +618 -0
- package/Tests/Server/Services/KubernetesAiAgentServiceLifecycle.test.ts +1444 -0
- package/Tests/Server/Services/KubernetesAiAgentServiceRegister.test.ts +1666 -0
- package/Tests/Server/Services/KubernetesClusterAiAccessDeletedRunnerRemedy.test.ts +140 -111
- package/Tests/Server/Services/KubernetesClusterAiAccessGapNextSteps.test.ts +267 -105
- package/Tests/Server/Services/KubernetesClusterAiAccessLegacySuperseded.test.ts +440 -0
- package/Tests/Server/Services/KubernetesClusterAiAccessService.test.ts +567 -411
- package/Tests/Server/Services/KubernetesClusterAiAccessTarget.test.ts +1168 -0
- package/Tests/Server/Services/KubernetesClusterAiSettingsPermission.test.ts +410 -12
- package/Tests/Server/Services/KubernetesClusterServiceAiAccessFeed.test.ts +55 -0
- package/Tests/Server/Services/ProjectServiceNewProjectAiDefaults.test.ts +288 -0
- package/Tests/Server/Services/ProxmoxResourcePostgres.test.ts +5633 -0
- package/Tests/Server/Services/ProxmoxResourceService.test.ts +6458 -5
- package/Tests/Server/Services/RunnerJobEnqueueKubectl.test.ts +48 -15
- package/Tests/Server/Services/RunnerJobEnqueueKubectlAiAgent.test.ts +620 -0
- package/Tests/Server/Services/RunnerJobKubectlWriteScope.test.ts +170 -3
- package/Tests/Server/Services/RunnerJobTimeoutReason.test.ts +72 -0
- package/Tests/Server/Services/RunnerServiceAgentName.test.ts +6 -4
- package/Tests/Server/Services/ScheduledMaintenanceAttachmentEdit.test.ts +2113 -0
- package/Tests/Server/Services/ScheduledMaintenanceMonitorRelease.test.ts +972 -0
- package/Tests/Server/Services/TeamComplianceSettingPostgres.test.ts +2237 -0
- package/Tests/Server/Services/TeamComplianceSettingService.test.ts +3988 -138
- package/Tests/Server/Utils/AI/ClusterAccessContext.test.ts +107 -1
- package/Tests/Server/Utils/AI/IncidentPostmortemRunner.test.ts +351 -0
- package/Tests/Server/Utils/AI/InvestigationClusterAccessWiring.test.ts +2 -0
- package/Tests/Server/Utils/AI/InvestigationEligibility.test.ts +310 -0
- package/Tests/Server/Utils/AI/KubectlInvestigationToolkit.test.ts +70 -0
- package/Tests/Server/Utils/AI/KubectlJobRunnerFinishedJob.test.ts +58 -0
- package/Tests/Server/Utils/AI/RemediationCommandToolsKubectl.test.ts +2 -0
- package/Tests/Server/Utils/AI/RemediationCommandToolsKubectlOutcome.test.ts +2 -0
- package/Tests/Server/Utils/AI/RemediationCommandToolsLiveCluster.test.ts +2 -0
- package/Tests/Server/Utils/AI/RemediationCommandToolsRunnerScope.test.ts +125 -1
- package/Tests/Server/Utils/AI/RemediationExecutionRunner.test.ts +252 -3
- package/Tests/Server/Utils/AI/RemediationExecutionRunnerClusterMode.test.ts +2 -0
- package/Tests/Server/Utils/AI/RemediationExecutionRunnerProjectGates.test.ts +240 -0
- package/Tests/Server/Utils/AI/RemediationKubectlCopyParity.test.ts +2 -0
- package/Tests/Server/Utils/AutoRemediation/CommandPlanExecutor.test.ts +2 -0
- package/Tests/Server/Utils/AutoRemediation/CommandPlanExecutorUnknownRun.test.ts +2 -0
- package/Tests/Server/Utils/AutoRemediation/CommandPlanVerification.test.ts +2 -0
- package/Tests/Server/Utils/Telemetry/HostAssetAttributesFromOtlp.test.ts +68 -0
- package/Tests/Server/Utils/Telemetry/InventoryMirrorPostgres.test.ts +370 -0
- package/Tests/Server/Utils/Telemetry/NetworkDeviceInventoryAttributes.test.ts +522 -0
- package/Tests/Server/Utils/Telemetry/ProxmoxCephSnapshotScan.test.ts +155 -0
- package/Tests/Server/Utils/Telemetry/ProxmoxNativeNodeLiveness.test.ts +8631 -0
- package/Tests/Server/Utils/Telemetry/ProxmoxNativePush.test.ts +2852 -0
- package/Tests/Server/Utils/Telemetry/TelemetryEntity.test.ts +367 -1
- package/Tests/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.test.ts +45 -3
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsChats.test.ts +25 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsGroupChatNames.test.ts +3119 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsGroupChatNamesPostgres.test.ts +1721 -0
- package/Tests/Types/Kubernetes/KubernetesAgentChartAiAccess.test.ts +581 -113
- package/Tests/Types/Kubernetes/KubernetesAiAgentAccessContract.test.ts +510 -0
- package/Tests/Types/Team/ComplianceRule.test.ts +1029 -0
- package/Tests/Types/Team/TeamComplianceStatus.test.ts +176 -0
- package/Tests/UI/Components/ActionButton/RowActions.test.tsx +641 -0
- package/Tests/UI/Components/ActionButton/RowActionsAccessibility.test.tsx +414 -0
- package/Tests/UI/Components/ActionButton/SplitActionButtons.test.ts +565 -0
- package/Tests/UI/Components/Charts/BarChartDragToSelect.test.tsx +386 -0
- package/Tests/UI/Components/Charts/ChartDoubleClickResetWithoutDblclick.test.tsx +1025 -0
- package/Tests/UI/Components/Charts/ChartGroupPageZoomHint.test.tsx +196 -0
- package/Tests/UI/Components/Charts/ChartPlaceholdersTakeDoubleClick.test.tsx +1861 -0
- package/Tests/UI/Components/Charts/ChartPlotClicksWhileResetArmed.test.tsx +382 -0
- package/Tests/UI/Components/Charts/ChartRangeSelection.test.tsx +704 -0
- package/Tests/UI/Components/Charts/ChartRangeSelectionDoubleClickReset.test.tsx +1481 -0
- package/Tests/UI/Components/Charts/ChartRangeSelectionRealRecharts.test.tsx +918 -0
- package/Tests/UI/Components/Charts/ChartRowBucketStart.test.ts +350 -0
- package/Tests/UI/Components/Charts/DoubleClickReset.test.tsx +996 -0
- package/Tests/UI/Components/Charts/HistogramDoubleClickResetRealRecharts.test.tsx +965 -0
- package/Tests/UI/Components/Charts/HistogramDriftThenRefetch.test.tsx +277 -0
- package/Tests/UI/Components/Charts/HistogramRangeSelectionDataChange.test.tsx +1757 -0
- package/Tests/UI/Components/Charts/HistogramRangeSelectionRealRecharts.test.tsx +560 -0
- package/Tests/UI/Components/Charts/TimeRangeZoom/ChartPageTimeRangeZoom.test.tsx +513 -0
- package/Tests/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomContext.test.tsx +845 -0
- package/Tests/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomHint.test.tsx +119 -0
- package/Tests/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomHintTailwind.test.tsx +274 -0
- package/Tests/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomUtil.test.ts +433 -0
- package/Tests/UI/Components/Charts/TimeRangeZoom/UseTimeRangeZoom.test.tsx +863 -0
- package/Tests/UI/Components/Charts/TimeRangeZoom/ZoomDocsPromises.test.tsx +1147 -0
- package/Tests/UI/Components/DisabledButtonTooltip.test.tsx +14 -3
- package/Tests/UI/Components/EntityDropdownEscape.test.tsx +454 -0
- package/Tests/UI/Components/EntityDropdownFocusLeave.test.tsx +420 -0
- package/Tests/UI/Components/Forms/FormFieldDropdownDisabled.test.tsx +233 -0
- package/Tests/UI/Components/Input.test.tsx +80 -1
- package/Tests/UI/Components/LogsAnalyticsViewZoom.test.tsx +947 -0
- package/Tests/UI/Components/LogsHistogramDragTooltip.test.tsx +17 -5
- package/Tests/UI/Components/LogsViewerAnalyticsZoom.test.tsx +501 -0
- package/Tests/UI/Components/LogsViewerHistogramZoom.test.tsx +1 -1
- package/Tests/UI/Components/ModelTable/BaseModelTableBulkDelete.test.tsx +6 -4
- package/Tests/UI/Components/ModelTable/BaseModelTablePermissionGating.test.tsx +60 -8
- package/Tests/UI/Components/ModelTable/BaseModelTableRowActions.test.tsx +476 -0
- package/Tests/UI/Components/ModelTable/ModelTableWrapContent.test.tsx +7 -5
- package/Tests/UI/Components/MoreMenuPortal.test.tsx +623 -0
- package/Tests/UI/Components/StatusPage/ResourceGridActions.test.tsx +538 -0
- package/Tests/UI/Components/StatusPage/ResourceGridSelection.test.tsx +14 -4
- package/Tests/UI/Components/TableCellWrapping.test.tsx +3 -3
- package/Tests/UI/Components/TableRowActions.test.tsx +472 -0
- package/Tests/UI/Components/TelemetryHistogramDragTooltip.test.tsx +1 -1
- package/Tests/UI/Components/TelemetryViewer/TelemetryViewerHistogramClickZoom.test.tsx +1 -1
- package/Tests/UI/Components/TelemetryViewer/TelemetryViewerZoomScope.test.tsx +470 -0
- package/Tests/UI/Components/TelemetryViewer/UseViewerTimeRangeZoom.test.tsx +571 -0
- package/Tests/UI/Components/TelemetryViewer/ViewerDoubleClickResetUnderDataChange.test.tsx +928 -0
- package/Tests/UI/Components/TelemetryViewer/ViewerFollowsEnclosingZoom.test.tsx +1569 -0
- package/Tests/UI/Components/Toggle.test.tsx +66 -0
- package/Tests/UI/MicrosoftTeams/MicrosoftTeamsChatsCardRefreshNames.test.tsx +1023 -0
- package/Tests/UI/Rum/ChunkLoader.test.ts +201 -0
- package/Tests/UI/Rum/FidelityNotices.test.ts +54 -0
- package/Tests/UI/Rum/ReplayCorrelationPanel.test.tsx +72 -0
- package/Tests/UI/Rum/ReplayFrameCapture.test.ts +1009 -9
- package/Tests/UI/Rum/ReplayRecordedAssets.test.ts +1069 -0
- package/Tests/UI/Rum/ReplayStage.test.tsx +913 -2
- package/Tests/UI/Rum/SessionReplayTable.test.tsx +443 -8
- package/Tests/UI/Rum/SessionReplayUsersTable.test.tsx +439 -9
- package/Tests/UI/Rum/UserFlowTablesRowActions.test.tsx +501 -0
- package/Tests/Utils/AiRemediation/KubectlPolicyChartRbacParity.test.ts +47 -19
- package/Tests/Utils/AiRemediation/KubectlWriteScopeCallerParity.test.ts +2 -0
- package/Tests/Utils/AiRemediation/KubernetesAiAgentPolicyCopyParity.test.ts +396 -0
- package/Tests/Utils/Dashboard/DashboardTimeRangeZoom.test.ts +104 -1
- package/Types/AI/AIRunType.ts +9 -4
- package/Types/AI/InvestigationNotStartedReason.ts +6 -0
- package/Types/AutoRemediation/AiRemediationCommandPlan.ts +14 -16
- package/Types/AutoRemediation/AiRemediationCommandPolicyVerdict.ts +28 -0
- package/Types/Dashboard/DashboardComponents/DashboardTraceChartComponent.ts +4 -2
- package/Types/Kubernetes/KubernetesClusterAiAccess.ts +263 -32
- package/Types/Kubernetes/KubernetesClusterAiAccessPermissions.ts +20 -16
- package/Types/Kubernetes/KubernetesClusterAiInsights.ts +81 -0
- package/Types/Monitor/ProxmoxAlertTemplates.ts +4 -4
- package/Types/Team/ComplianceNotificationChannel.ts +22 -0
- package/Types/Team/ComplianceRule.ts +434 -0
- package/Types/Team/ComplianceRuleType.ts +21 -0
- package/Types/Team/TeamComplianceStatus.ts +81 -0
- package/Types/Telemetry/TelemetryIngestSurface.ts +28 -0
- package/UI/Components/ActionButton/ActionButtonSchema.ts +21 -0
- package/UI/Components/ActionButton/RowActions.tsx +238 -0
- package/UI/Components/ActionButton/SplitActionButtons.ts +173 -0
- package/UI/Components/Charts/Area/AreaChart.tsx +32 -2
- package/UI/Components/Charts/Bar/BarChart.tsx +40 -3
- package/UI/Components/Charts/ChartGroup/ChartGroup.tsx +37 -11
- package/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.tsx +80 -243
- package/UI/Components/Charts/ChartLibrary/BarChart/BarChart.tsx +122 -31
- package/UI/Components/Charts/ChartLibrary/LineChart/LineChart.tsx +95 -244
- package/UI/Components/Charts/ChartLibrary/Utils/DoubleClick.ts +214 -0
- package/UI/Components/Charts/ChartLibrary/Utils/UseChartBucketsChange.ts +32 -0
- package/UI/Components/Charts/ChartLibrary/Utils/UseChartRangeSelection.ts +599 -0
- package/UI/Components/Charts/Line/LineChart.tsx +32 -2
- package/UI/Components/Charts/TimeRangeZoom/ResetTimeRangeZoomButton.tsx +70 -0
- package/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomContext.tsx +226 -0
- package/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomHint.tsx +73 -0
- package/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomUtil.ts +163 -0
- package/UI/Components/Charts/TimeRangeZoom/UseTimeRangeZoom.ts +215 -0
- package/UI/Components/Charts/Utils/DataPoint.ts +20 -8
- package/UI/Components/Charts/Utils/XAxis.ts +75 -0
- package/UI/Components/Charts/Utils/useHistogramRangeSelection.ts +493 -59
- package/UI/Components/EntityDropdown/EntityDropdown.tsx +107 -11
- package/UI/Components/Forms/Fields/FormField.tsx +10 -0
- package/UI/Components/Input/Input.tsx +90 -57
- package/UI/Components/List/ListRow.tsx +8 -74
- package/UI/Components/LogsViewer/LogsViewer.tsx +40 -11
- package/UI/Components/LogsViewer/components/LogTimeRangePicker.tsx +22 -6
- package/UI/Components/LogsViewer/components/LogsAnalyticsView.tsx +209 -6
- package/UI/Components/LogsViewer/components/LogsHistogram.tsx +127 -84
- package/UI/Components/LogsViewer/components/LogsViewerToolbar.tsx +3 -0
- package/UI/Components/ModelTable/BaseModelTable.tsx +12 -1
- package/UI/Components/MoreMenu/MoreMenu.tsx +365 -30
- package/UI/Components/MoreMenu/MoreMenuItem.tsx +70 -17
- package/UI/Components/OrderedStatesList/Item.tsx +7 -72
- package/UI/Components/StatusPage/ResourceGrid.tsx +126 -77
- package/UI/Components/Table/TableBody.tsx +8 -2
- package/UI/Components/Table/TableRow.tsx +20 -140
- package/UI/Components/TelemetryViewer/TelemetryViewer.tsx +41 -10
- package/UI/Components/TelemetryViewer/components/TelemetryHistogram.tsx +47 -9
- package/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.tsx +25 -6
- package/UI/Components/TelemetryViewer/types.ts +2 -0
- package/UI/Components/TelemetryViewer/useViewerTimeRangeZoom.ts +448 -0
- package/UI/Components/Toggle/Toggle.tsx +26 -0
- package/UI/Components/Tooltip/Tooltip.tsx +8 -1
- package/UI/Styles/Theme.css +14 -2
- package/Utils/AiRemediation/CommandPolicy.ts +1 -1
- package/Utils/AiRemediation/KubectlPolicy.ts +1 -1
- package/Utils/Dashboard/DashboardTimeRangeZoom.ts +46 -2
- package/build/dist/Models/DatabaseModels/Index.js +2 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/KubernetesAiAgent.js +385 -0
- package/build/dist/Models/DatabaseModels/KubernetesAiAgent.js.map +1 -0
- package/build/dist/Models/DatabaseModels/KubernetesCluster.js +3 -3
- package/build/dist/Models/DatabaseModels/KubernetesCluster.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Project.js +56 -5
- package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ProxmoxResource.js +51 -1
- package/build/dist/Models/DatabaseModels/ProxmoxResource.js.map +1 -1
- package/build/dist/Models/DatabaseModels/RunnerJob.js +74 -0
- package/build/dist/Models/DatabaseModels/RunnerJob.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TeamComplianceSetting.js +134 -3
- package/build/dist/Models/DatabaseModels/TeamComplianceSetting.js.map +1 -1
- package/build/dist/Models/DatabaseModels/WorkspaceProjectAuthToken.js.map +1 -1
- package/build/dist/Server/API/AIChatAPI.js +6 -1
- package/build/dist/Server/API/AIChatAPI.js.map +1 -1
- package/build/dist/Server/API/AIInvestigationAPI.js +17 -10
- package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
- package/build/dist/Server/API/AutoRemediationAPI.js +144 -24
- package/build/dist/Server/API/AutoRemediationAPI.js.map +1 -1
- package/build/dist/Server/API/KubernetesClusterAiAccessAPI.js +436 -22
- package/build/dist/Server/API/KubernetesClusterAiAccessAPI.js.map +1 -1
- package/build/dist/Server/API/MicrosoftTeamsAPI.js +69 -13
- package/build/dist/Server/API/MicrosoftTeamsAPI.js.map +1 -1
- package/build/dist/Server/API/ProxmoxResourceAPI.js +187 -14
- package/build/dist/Server/API/ProxmoxResourceAPI.js.map +1 -1
- package/build/dist/Server/Infrastructure/GlobalCache.js +27 -0
- package/build/dist/Server/Infrastructure/GlobalCache.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796000000000-AddTeamComplianceRuleScope.js +50 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796000000000-AddTeamComplianceRuleScope.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796100000000-AddKubernetesAiAgentAndAiDefaults.js +84 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796100000000-AddKubernetesAiAgentAndAiDefaults.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796200000000-AddProxmoxResourceNativePushColumns.js +31 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796200000000-AddProxmoxResourceNativePushColumns.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +6 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Middleware/TelemetryIngest.js +34 -19
- package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
- package/build/dist/Server/Services/AIService.js +59 -1
- package/build/dist/Server/Services/AIService.js.map +1 -1
- package/build/dist/Server/Services/AlertService.js +248 -13
- package/build/dist/Server/Services/AlertService.js.map +1 -1
- package/build/dist/Server/Services/AlertSeverityService.js +51 -15
- package/build/dist/Server/Services/AlertSeverityService.js.map +1 -1
- package/build/dist/Server/Services/AutoRemediationRuleService.js +1 -1
- package/build/dist/Server/Services/AutoRemediationRuleService.js.map +1 -1
- package/build/dist/Server/Services/IncidentService.js +199 -72
- package/build/dist/Server/Services/IncidentService.js.map +1 -1
- package/build/dist/Server/Services/IncidentSeverityService.js +51 -15
- package/build/dist/Server/Services/IncidentSeverityService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesAiAgentJobService.js +158 -0
- package/build/dist/Server/Services/KubernetesAiAgentJobService.js.map +1 -0
- package/build/dist/Server/Services/KubernetesAiAgentService.js +1145 -0
- package/build/dist/Server/Services/KubernetesAiAgentService.js.map +1 -0
- package/build/dist/Server/Services/KubernetesClusterAiAccessService.js +842 -371
- package/build/dist/Server/Services/KubernetesClusterAiAccessService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterService.js +86 -17
- package/build/dist/Server/Services/KubernetesClusterService.js.map +1 -1
- package/build/dist/Server/Services/ProjectService.js +22 -0
- package/build/dist/Server/Services/ProjectService.js.map +1 -1
- package/build/dist/Server/Services/ProxmoxResourceService.js +258 -3
- package/build/dist/Server/Services/ProxmoxResourceService.js.map +1 -1
- package/build/dist/Server/Services/RunnerJobService.js +178 -92
- package/build/dist/Server/Services/RunnerJobService.js.map +1 -1
- package/build/dist/Server/Services/RunnerService.js +1 -1
- package/build/dist/Server/Services/RunnerService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceService.js +535 -3
- package/build/dist/Server/Services/ScheduledMaintenanceService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceStateTimelineService.js +316 -46
- package/build/dist/Server/Services/ScheduledMaintenanceStateTimelineService.js.map +1 -1
- package/build/dist/Server/Services/TeamComplianceSettingService.js +833 -7
- package/build/dist/Server/Services/TeamComplianceSettingService.js.map +1 -1
- package/build/dist/Server/Utils/AI/ClusterAccess/ClusterAccessContext.js +52 -9
- package/build/dist/Server/Utils/AI/ClusterAccess/ClusterAccessContext.js.map +1 -1
- package/build/dist/Server/Utils/AI/ClusterAccess/KubectlInvestigationToolkit.js +13 -9
- package/build/dist/Server/Utils/AI/ClusterAccess/KubectlInvestigationToolkit.js.map +1 -1
- package/build/dist/Server/Utils/AI/ClusterAccess/KubectlJobRunner.js +7 -3
- package/build/dist/Server/Utils/AI/ClusterAccess/KubectlJobRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/Remediation/RemediationCommandTools.js +29 -15
- package/build/dist/Server/Utils/AI/Remediation/RemediationCommandTools.js.map +1 -1
- package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js +56 -20
- package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js +39 -5
- package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/IncidentPostmortemRunner.js +30 -3
- package/build/dist/Server/Utils/AI/SRE/IncidentPostmortemRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/InvestigationEligibility.js +13 -2
- package/build/dist/Server/Utils/AI/SRE/InvestigationEligibility.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/InvestigationGrader.js +1 -1
- package/build/dist/Server/Utils/AutoRemediation/CommandPlanExecutor.js +4 -2
- package/build/dist/Server/Utils/AutoRemediation/CommandPlanExecutor.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/InventoryEntityRegistry.js +111 -6
- package/build/dist/Server/Utils/Telemetry/InventoryEntityRegistry.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/ProxmoxCephSnapshotScan.js +40 -4
- package/build/dist/Server/Utils/Telemetry/ProxmoxCephSnapshotScan.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/ProxmoxNativeNodeLiveness.js +296 -0
- package/build/dist/Server/Utils/Telemetry/ProxmoxNativeNodeLiveness.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/ProxmoxNativePush.js +699 -0
- package/build/dist/Server/Utils/Telemetry/ProxmoxNativePush.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js +77 -19
- package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +505 -42
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
- package/build/dist/Types/AI/AIRunType.js +9 -4
- package/build/dist/Types/AI/AIRunType.js.map +1 -1
- package/build/dist/Types/AutoRemediation/AiRemediationCommandPlan.js +10 -16
- package/build/dist/Types/AutoRemediation/AiRemediationCommandPlan.js.map +1 -1
- package/build/dist/Types/AutoRemediation/AiRemediationCommandPolicyVerdict.js +28 -0
- package/build/dist/Types/AutoRemediation/AiRemediationCommandPolicyVerdict.js.map +1 -0
- package/build/dist/Types/Kubernetes/KubernetesClusterAiAccess.js +72 -16
- package/build/dist/Types/Kubernetes/KubernetesClusterAiAccess.js.map +1 -1
- package/build/dist/Types/Kubernetes/KubernetesClusterAiAccessPermissions.js +20 -16
- package/build/dist/Types/Kubernetes/KubernetesClusterAiAccessPermissions.js.map +1 -1
- package/build/dist/Types/Kubernetes/KubernetesClusterAiInsights.js +17 -0
- package/build/dist/Types/Kubernetes/KubernetesClusterAiInsights.js.map +1 -0
- package/build/dist/Types/Monitor/ProxmoxAlertTemplates.js +4 -4
- package/build/dist/Types/Monitor/ProxmoxAlertTemplates.js.map +1 -1
- package/build/dist/Types/Team/ComplianceNotificationChannel.js +23 -0
- package/build/dist/Types/Team/ComplianceNotificationChannel.js.map +1 -0
- package/build/dist/Types/Team/ComplianceRule.js +304 -0
- package/build/dist/Types/Team/ComplianceRule.js.map +1 -0
- package/build/dist/Types/Team/ComplianceRuleType.js +21 -0
- package/build/dist/Types/Team/ComplianceRuleType.js.map +1 -1
- package/build/dist/Types/Team/TeamComplianceStatus.js +2 -0
- package/build/dist/Types/Team/TeamComplianceStatus.js.map +1 -0
- package/build/dist/Types/Telemetry/TelemetryIngestSurface.js +25 -0
- package/build/dist/Types/Telemetry/TelemetryIngestSurface.js.map +1 -1
- package/build/dist/UI/Components/ActionButton/ActionButtonSchema.js +20 -1
- package/build/dist/UI/Components/ActionButton/ActionButtonSchema.js.map +1 -1
- package/build/dist/UI/Components/ActionButton/RowActions.js +113 -0
- package/build/dist/UI/Components/ActionButton/RowActions.js.map +1 -0
- package/build/dist/UI/Components/ActionButton/SplitActionButtons.js +71 -0
- package/build/dist/UI/Components/ActionButton/SplitActionButtons.js.map +1 -0
- package/build/dist/UI/Components/Charts/Area/AreaChart.js +16 -1
- package/build/dist/UI/Components/Charts/Area/AreaChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/Bar/BarChart.js +16 -1
- package/build/dist/UI/Components/Charts/Bar/BarChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js +27 -5
- package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js +61 -194
- package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js +84 -26
- package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js +75 -196
- package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/Utils/DoubleClick.js +133 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/Utils/DoubleClick.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/Utils/UseChartBucketsChange.js +26 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/Utils/UseChartBucketsChange.js.map +1 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/Utils/UseChartRangeSelection.js +371 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/Utils/UseChartRangeSelection.js.map +1 -0
- package/build/dist/UI/Components/Charts/Line/LineChart.js +16 -1
- package/build/dist/UI/Components/Charts/Line/LineChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/TimeRangeZoom/ResetTimeRangeZoomButton.js +35 -0
- package/build/dist/UI/Components/Charts/TimeRangeZoom/ResetTimeRangeZoomButton.js.map +1 -0
- package/build/dist/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomContext.js +107 -0
- package/build/dist/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomContext.js.map +1 -0
- package/build/dist/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomHint.js +41 -0
- package/build/dist/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomHint.js.map +1 -0
- package/build/dist/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomUtil.js +117 -0
- package/build/dist/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomUtil.js.map +1 -0
- package/build/dist/UI/Components/Charts/TimeRangeZoom/UseTimeRangeZoom.js +121 -0
- package/build/dist/UI/Components/Charts/TimeRangeZoom/UseTimeRangeZoom.js.map +1 -0
- package/build/dist/UI/Components/Charts/Utils/DataPoint.js +15 -7
- package/build/dist/UI/Components/Charts/Utils/DataPoint.js.map +1 -1
- package/build/dist/UI/Components/Charts/Utils/XAxis.js +70 -0
- package/build/dist/UI/Components/Charts/Utils/XAxis.js.map +1 -1
- package/build/dist/UI/Components/Charts/Utils/useHistogramRangeSelection.js +305 -38
- package/build/dist/UI/Components/Charts/Utils/useHistogramRangeSelection.js.map +1 -1
- package/build/dist/UI/Components/EntityDropdown/EntityDropdown.js +89 -14
- package/build/dist/UI/Components/EntityDropdown/EntityDropdown.js.map +1 -1
- package/build/dist/UI/Components/Forms/Fields/FormField.js +11 -2
- package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
- package/build/dist/UI/Components/Input/Input.js +69 -54
- package/build/dist/UI/Components/Input/Input.js.map +1 -1
- package/build/dist/UI/Components/List/ListRow.js +4 -39
- package/build/dist/UI/Components/List/ListRow.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/LogsViewer.js +31 -8
- package/build/dist/UI/Components/LogsViewer/LogsViewer.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogTimeRangePicker.js +10 -1
- package/build/dist/UI/Components/LogsViewer/components/LogTimeRangePicker.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js +139 -21
- package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsHistogram.js +30 -8
- package/build/dist/UI/Components/LogsViewer/components/LogsHistogram.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsViewerToolbar.js +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsViewerToolbar.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +10 -0
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/MoreMenu/MoreMenu.js +253 -14
- package/build/dist/UI/Components/MoreMenu/MoreMenu.js.map +1 -1
- package/build/dist/UI/Components/MoreMenu/MoreMenuItem.js +43 -13
- package/build/dist/UI/Components/MoreMenu/MoreMenuItem.js.map +1 -1
- package/build/dist/UI/Components/OrderedStatesList/Item.js +2 -38
- package/build/dist/UI/Components/OrderedStatesList/Item.js.map +1 -1
- package/build/dist/UI/Components/StatusPage/ResourceGrid.js +53 -15
- package/build/dist/UI/Components/StatusPage/ResourceGrid.js.map +1 -1
- package/build/dist/UI/Components/Table/TableBody.js +6 -2
- package/build/dist/UI/Components/Table/TableBody.js.map +1 -1
- package/build/dist/UI/Components/Table/TableRow.js +12 -75
- package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js +32 -7
- package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js +27 -9
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.js +11 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/useViewerTimeRangeZoom.js +272 -0
- package/build/dist/UI/Components/TelemetryViewer/useViewerTimeRangeZoom.js.map +1 -0
- package/build/dist/UI/Components/Toggle/Toggle.js +14 -1
- package/build/dist/UI/Components/Toggle/Toggle.js.map +1 -1
- package/build/dist/UI/Components/Tooltip/Tooltip.js +1 -1
- package/build/dist/UI/Components/Tooltip/Tooltip.js.map +1 -1
- package/build/dist/Utils/AiRemediation/CommandPolicy.js +1 -1
- package/build/dist/Utils/AiRemediation/CommandPolicy.js.map +1 -1
- package/build/dist/Utils/AiRemediation/KubectlPolicy.js +1 -1
- package/build/dist/Utils/AiRemediation/KubectlPolicy.js.map +1 -1
- package/build/dist/Utils/Dashboard/DashboardTimeRangeZoom.js +27 -1
- package/build/dist/Utils/Dashboard/DashboardTimeRangeZoom.js.map +1 -1
- package/package.json +1 -1
|
@@ -559,7 +559,14 @@ describe("the Runner pages, rendered", () => {
|
|
|
559
559
|
);
|
|
560
560
|
}
|
|
561
561
|
|
|
562
|
-
|
|
562
|
+
/*
|
|
563
|
+
* A row's actions are one button and a ⋯ menu holding the rest
|
|
564
|
+
* (RowActions). On this table "View" is the button, so "Edit" is in the
|
|
565
|
+
* menu. The menu is portalled to document.body so the table's scroller
|
|
566
|
+
* cannot clip it, which is why it is found through `screen` and not
|
|
567
|
+
* inside the row - and why only one menu is ever open to find.
|
|
568
|
+
*/
|
|
569
|
+
async function clickRowMenuAction(
|
|
563
570
|
rowName: string,
|
|
564
571
|
action: string,
|
|
565
572
|
): Promise<void> {
|
|
@@ -572,7 +579,16 @@ describe("the Runner pages, rendered", () => {
|
|
|
572
579
|
if (!row) {
|
|
573
580
|
throw new Error(`"${rowName}" is not in a table row.`);
|
|
574
581
|
}
|
|
575
|
-
|
|
582
|
+
const trigger: HTMLElement | null = within(row).queryByTestId(
|
|
583
|
+
"row-actions-more-button",
|
|
584
|
+
);
|
|
585
|
+
if (!trigger) {
|
|
586
|
+
throw new Error(`"${rowName}" has no ⋯ menu on its row.`);
|
|
587
|
+
}
|
|
588
|
+
fireEvent.click(trigger);
|
|
589
|
+
fireEvent.click(
|
|
590
|
+
within(screen.getByRole("menu")).getByRole("menuitem", { name: action }),
|
|
591
|
+
);
|
|
576
592
|
}
|
|
577
593
|
|
|
578
594
|
async function openDialog(firstField: string): Promise<HTMLElement> {
|
|
@@ -598,7 +614,7 @@ describe("the Runner pages, rendered", () => {
|
|
|
598
614
|
test("the list page's edit form on an agent row leaves out the name; create and the next edit do not", async () => {
|
|
599
615
|
openRunnersPage();
|
|
600
616
|
|
|
601
|
-
await
|
|
617
|
+
await clickRowMenuAction("kubernetes-agent/prod-east", "Edit");
|
|
602
618
|
const editDialog: HTMLElement = await openDialog("Description");
|
|
603
619
|
expect(hasFieldTitled(editDialog, "Name")).toBe(false);
|
|
604
620
|
expect(editDialog).toHaveTextContent(AGENT_NOTE_START);
|
|
@@ -614,7 +630,7 @@ describe("the Runner pages, rendered", () => {
|
|
|
614
630
|
await closeDialog(createDialog);
|
|
615
631
|
|
|
616
632
|
// The next edit follows its own row: an ordinary Runner keeps its name.
|
|
617
|
-
await
|
|
633
|
+
await clickRowMenuAction("bash-runner", "Edit");
|
|
618
634
|
const hostDialog: HTMLElement = await openDialog("Description");
|
|
619
635
|
expect(hasFieldTitled(hostDialog, "Name")).toBe(true);
|
|
620
636
|
expect(hostDialog).not.toHaveTextContent(AGENT_NOTE_START);
|
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
import "@testing-library/jest-dom";
|
|
2
|
+
import {
|
|
3
|
+
afterEach,
|
|
4
|
+
beforeEach,
|
|
5
|
+
describe,
|
|
6
|
+
expect,
|
|
7
|
+
jest,
|
|
8
|
+
test,
|
|
9
|
+
} from "@jest/globals";
|
|
10
|
+
import { cleanup, render, screen } from "@testing-library/react";
|
|
11
|
+
import React from "react";
|
|
12
|
+
import { MemoryRouter } from "react-router-dom";
|
|
13
|
+
import RunnerView from "../../../../App/FeatureSet/Dashboard/src/Pages/Settings/RunnerView";
|
|
14
|
+
import {
|
|
15
|
+
KUBERNETES_AGENT_RUNNER_SUPERSEDED_NOTE,
|
|
16
|
+
NO_RUNNER_FORM_RESTRICTIONS,
|
|
17
|
+
RunnerFormRestrictions,
|
|
18
|
+
getKubernetesAgentRunnerFormNote,
|
|
19
|
+
getRunnerFormFields,
|
|
20
|
+
getRunnerFormRestrictions,
|
|
21
|
+
getRunnerTableFormFields,
|
|
22
|
+
} from "../../../../App/FeatureSet/Dashboard/src/Pages/Settings/RunnerFormFields";
|
|
23
|
+
import PageMap from "../../../../App/FeatureSet/Dashboard/src/Utils/PageMap";
|
|
24
|
+
import RouteMap from "../../../../App/FeatureSet/Dashboard/src/Utils/RouteMap";
|
|
25
|
+
import Runner from "../../../Models/DatabaseModels/Runner";
|
|
26
|
+
import Route from "../../../Types/API/Route";
|
|
27
|
+
import ListResult from "../../../Types/BaseDatabase/ListResult";
|
|
28
|
+
import { JSONObject } from "../../../Types/JSON";
|
|
29
|
+
import ObjectID from "../../../Types/ObjectID";
|
|
30
|
+
import Permission from "../../../Types/Permission";
|
|
31
|
+
import Field from "../../../UI/Components/Forms/Types/Field";
|
|
32
|
+
import Fields from "../../../UI/Components/Forms/Types/Fields";
|
|
33
|
+
import ModelAPI from "../../../UI/Utils/ModelAPI/ModelAPI";
|
|
34
|
+
import PermissionUtil from "../../../UI/Utils/Permission";
|
|
35
|
+
import User from "../../../UI/Utils/User";
|
|
36
|
+
import { goTo, PROJECT_ID } from "./SideMenuHarness";
|
|
37
|
+
|
|
38
|
+
jest.mock("react-i18next", () => {
|
|
39
|
+
return {
|
|
40
|
+
useTranslation: () => {
|
|
41
|
+
return {
|
|
42
|
+
t: (value: string): string => {
|
|
43
|
+
return value;
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
/*
|
|
51
|
+
* The Kubernetes AI agent — its own identity, never a Runner row — replaced
|
|
52
|
+
* the in-cluster Runner the Kubernetes agent chart used to install, and the
|
|
53
|
+
* server refuses that legacy Runner's registration while the agent is
|
|
54
|
+
* online. The legacy rows keep their existing guards; their note now also
|
|
55
|
+
* says they are superseded, what to do (upgrade the chart), and when the row
|
|
56
|
+
* can go (once the AI agent is connected). Ordinary Runners say nothing of
|
|
57
|
+
* the sort.
|
|
58
|
+
*/
|
|
59
|
+
|
|
60
|
+
const WAIT_TIMEOUT: number = 20000;
|
|
61
|
+
|
|
62
|
+
const AGENT_RUNNER_ID: string = "66666666-0000-4000-8000-0000000000a1";
|
|
63
|
+
const HOST_RUNNER_ID: string = "66666666-0000-4000-8000-0000000000a2";
|
|
64
|
+
const RENAMED_AGENT_RUNNER_ID: string = "66666666-0000-4000-8000-0000000000a3";
|
|
65
|
+
|
|
66
|
+
const AGENT_POSTURE: JSONObject = {
|
|
67
|
+
kubernetes: {
|
|
68
|
+
inCluster: true,
|
|
69
|
+
allowWrites: false,
|
|
70
|
+
clusterIdentifier: "prod-east",
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
const PERMISSIONS: Array<Permission> = [
|
|
75
|
+
Permission.Public,
|
|
76
|
+
Permission.User,
|
|
77
|
+
Permission.CurrentUser,
|
|
78
|
+
Permission.ProjectAdmin,
|
|
79
|
+
];
|
|
80
|
+
|
|
81
|
+
function makeRunnerRow(
|
|
82
|
+
id: string,
|
|
83
|
+
name: string,
|
|
84
|
+
hostInfo?: JSONObject,
|
|
85
|
+
): Runner {
|
|
86
|
+
return Object.assign(new Runner(), {
|
|
87
|
+
_id: id,
|
|
88
|
+
name,
|
|
89
|
+
description: "",
|
|
90
|
+
key: "runner-key",
|
|
91
|
+
canRunRunbooks: false,
|
|
92
|
+
canRunCodeFixTasks: false,
|
|
93
|
+
canRunAiCommands: true,
|
|
94
|
+
lastAlive: new Date("2026-09-23T10:00:00Z"),
|
|
95
|
+
...(hostInfo ? { hostInfo } : {}),
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
const ROWS: Array<Runner> = [
|
|
100
|
+
makeRunnerRow(AGENT_RUNNER_ID, "kubernetes-agent/prod-east", AGENT_POSTURE),
|
|
101
|
+
makeRunnerRow(HOST_RUNNER_ID, "bash-runner"),
|
|
102
|
+
makeRunnerRow(RENAMED_AGENT_RUNNER_ID, "prod-east-kubectl", AGENT_POSTURE),
|
|
103
|
+
];
|
|
104
|
+
|
|
105
|
+
function rowById(id: string): Runner {
|
|
106
|
+
return ROWS.find((row: Runner): boolean => {
|
|
107
|
+
return String(row._id) === id;
|
|
108
|
+
})!;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
describe("the superseded sentence", () => {
|
|
112
|
+
test("names the replacement, the step and when the row can go", () => {
|
|
113
|
+
expect(KUBERNETES_AGENT_RUNNER_SUPERSEDED_NOTE).toContain(
|
|
114
|
+
"superseded by the Kubernetes AI agent",
|
|
115
|
+
);
|
|
116
|
+
expect(KUBERNETES_AGENT_RUNNER_SUPERSEDED_NOTE).toContain(
|
|
117
|
+
"upgrade the Kubernetes agent chart",
|
|
118
|
+
);
|
|
119
|
+
expect(KUBERNETES_AGENT_RUNNER_SUPERSEDED_NOTE).toContain(
|
|
120
|
+
"this Runner can be deleted once the AI agent is connected",
|
|
121
|
+
);
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
test.each<[string, RunnerFormRestrictions]>([
|
|
125
|
+
[
|
|
126
|
+
"name and switches locked",
|
|
127
|
+
{ isNameLocked: true, areShellCapabilitiesLocked: true },
|
|
128
|
+
],
|
|
129
|
+
[
|
|
130
|
+
"switches locked (an agent by posture alone)",
|
|
131
|
+
{ isNameLocked: false, areShellCapabilitiesLocked: true },
|
|
132
|
+
],
|
|
133
|
+
[
|
|
134
|
+
"name locked only",
|
|
135
|
+
{ isNameLocked: true, areShellCapabilitiesLocked: false },
|
|
136
|
+
],
|
|
137
|
+
])(
|
|
138
|
+
"ends every kubernetes-agent row's note: %s",
|
|
139
|
+
(_label: string, restrictions: RunnerFormRestrictions) => {
|
|
140
|
+
const note: string | null =
|
|
141
|
+
getKubernetesAgentRunnerFormNote(restrictions);
|
|
142
|
+
|
|
143
|
+
expect(note).not.toBeNull();
|
|
144
|
+
// The existing explanation is kept, first.
|
|
145
|
+
expect(note).toMatch(
|
|
146
|
+
/^This is the in-cluster Runner the Kubernetes agent chart installed\./,
|
|
147
|
+
);
|
|
148
|
+
expect(note).toContain("OneUptime refuses those changes");
|
|
149
|
+
expect(note!.endsWith(KUBERNETES_AGENT_RUNNER_SUPERSEDED_NOTE)).toBe(
|
|
150
|
+
true,
|
|
151
|
+
);
|
|
152
|
+
},
|
|
153
|
+
);
|
|
154
|
+
|
|
155
|
+
test("is not said about an ordinary Runner", () => {
|
|
156
|
+
expect(
|
|
157
|
+
getKubernetesAgentRunnerFormNote(NO_RUNNER_FORM_RESTRICTIONS),
|
|
158
|
+
).toBeNull();
|
|
159
|
+
expect(
|
|
160
|
+
getKubernetesAgentRunnerFormNote(
|
|
161
|
+
getRunnerFormRestrictions(rowById(HOST_RUNNER_ID)),
|
|
162
|
+
),
|
|
163
|
+
).toBeNull();
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
test("reaches the edit forms of both Runner pages on a legacy row", () => {
|
|
167
|
+
for (const row of [
|
|
168
|
+
rowById(AGENT_RUNNER_ID),
|
|
169
|
+
rowById(RENAMED_AGENT_RUNNER_ID),
|
|
170
|
+
]) {
|
|
171
|
+
const restrictions: RunnerFormRestrictions =
|
|
172
|
+
getRunnerFormRestrictions(row);
|
|
173
|
+
|
|
174
|
+
const detailForm: Fields<Runner> = getRunnerFormFields({
|
|
175
|
+
withSteps: false,
|
|
176
|
+
restrictions,
|
|
177
|
+
});
|
|
178
|
+
const listEditForm: Fields<Runner> = getRunnerTableFormFields(
|
|
179
|
+
restrictions,
|
|
180
|
+
).filter((field: Field<Runner>): boolean => {
|
|
181
|
+
return !field.doNotShowWhenEditing;
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
for (const fields of [detailForm, listEditForm]) {
|
|
185
|
+
const described: Array<string> = fields
|
|
186
|
+
.map((field: Field<Runner>): string => {
|
|
187
|
+
return String(field.sectionDescription || "");
|
|
188
|
+
})
|
|
189
|
+
.filter((description: string): boolean => {
|
|
190
|
+
return description.length > 0;
|
|
191
|
+
});
|
|
192
|
+
expect(described.length).toBe(1);
|
|
193
|
+
expect(described[0]).toContain(KUBERNETES_AGENT_RUNNER_SUPERSEDED_NOTE);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
});
|
|
197
|
+
|
|
198
|
+
test("never reaches the create form", () => {
|
|
199
|
+
const createForm: Fields<Runner> = getRunnerTableFormFields(
|
|
200
|
+
getRunnerFormRestrictions(rowById(AGENT_RUNNER_ID)),
|
|
201
|
+
).filter((field: Field<Runner>): boolean => {
|
|
202
|
+
return !field.doNotShowWhenCreating;
|
|
203
|
+
});
|
|
204
|
+
|
|
205
|
+
for (const field of createForm) {
|
|
206
|
+
expect(String(field.sectionDescription || "")).not.toContain(
|
|
207
|
+
"superseded",
|
|
208
|
+
);
|
|
209
|
+
}
|
|
210
|
+
});
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
describe("the Runner detail page", () => {
|
|
214
|
+
beforeEach(() => {
|
|
215
|
+
window.localStorage.clear();
|
|
216
|
+
window.sessionStorage.clear();
|
|
217
|
+
jest.spyOn(User, "isMasterAdmin").mockReturnValue(false);
|
|
218
|
+
jest
|
|
219
|
+
.spyOn(PermissionUtil, "getAllPermissions")
|
|
220
|
+
.mockReturnValue(PERMISSIONS);
|
|
221
|
+
jest.spyOn(PermissionUtil, "getGlobalPermissions").mockReturnValue(null);
|
|
222
|
+
jest.spyOn(PermissionUtil, "getProjectPermissions").mockReturnValue({
|
|
223
|
+
projectId: new ObjectID(PROJECT_ID),
|
|
224
|
+
userId: ObjectID.generate(),
|
|
225
|
+
permissions: PERMISSIONS.map((permission: Permission) => {
|
|
226
|
+
return {
|
|
227
|
+
permission: permission,
|
|
228
|
+
labelIds: [],
|
|
229
|
+
_type: "UserPermission",
|
|
230
|
+
};
|
|
231
|
+
}),
|
|
232
|
+
_type: "UserTenantAccessPermission",
|
|
233
|
+
} as unknown as ReturnType<typeof PermissionUtil.getProjectPermissions>);
|
|
234
|
+
|
|
235
|
+
jest
|
|
236
|
+
.spyOn(ModelAPI, "getItem")
|
|
237
|
+
.mockImplementation(async (args: unknown): Promise<Runner | null> => {
|
|
238
|
+
return rowById(String((args as { id?: unknown }).id)) || null;
|
|
239
|
+
});
|
|
240
|
+
jest
|
|
241
|
+
.spyOn(ModelAPI, "getList")
|
|
242
|
+
.mockImplementation(async (): Promise<ListResult<Runner>> => {
|
|
243
|
+
return { data: [], count: 0, skip: 0, limit: 10 };
|
|
244
|
+
});
|
|
245
|
+
jest
|
|
246
|
+
.spyOn(ModelAPI, "count")
|
|
247
|
+
.mockImplementation(async (): Promise<number> => {
|
|
248
|
+
return 0;
|
|
249
|
+
});
|
|
250
|
+
});
|
|
251
|
+
|
|
252
|
+
afterEach(() => {
|
|
253
|
+
cleanup();
|
|
254
|
+
jest.restoreAllMocks();
|
|
255
|
+
});
|
|
256
|
+
|
|
257
|
+
function openRunnerView(runnerId: string): void {
|
|
258
|
+
const path: string = `/dashboard/${PROJECT_ID}/settings/runners/${runnerId}`;
|
|
259
|
+
goTo(path);
|
|
260
|
+
render(
|
|
261
|
+
<MemoryRouter initialEntries={[path]}>
|
|
262
|
+
<RunnerView
|
|
263
|
+
pageRoute={RouteMap[PageMap.SETTINGS_RUNNER_VIEW] as Route}
|
|
264
|
+
currentProject={null}
|
|
265
|
+
hasPaymentMethod={true}
|
|
266
|
+
/>
|
|
267
|
+
</MemoryRouter>,
|
|
268
|
+
);
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
test("says a legacy kubernetes-agent Runner is superseded", async () => {
|
|
272
|
+
openRunnerView(AGENT_RUNNER_ID);
|
|
273
|
+
|
|
274
|
+
const note: HTMLElement = await screen.findByTestId(
|
|
275
|
+
"kubernetes-agent-runner-note",
|
|
276
|
+
{},
|
|
277
|
+
{ timeout: WAIT_TIMEOUT },
|
|
278
|
+
);
|
|
279
|
+
expect(note).toHaveTextContent(
|
|
280
|
+
"This is the in-cluster Runner the Kubernetes agent chart installed.",
|
|
281
|
+
);
|
|
282
|
+
expect(note).toHaveTextContent(KUBERNETES_AGENT_RUNNER_SUPERSEDED_NOTE);
|
|
283
|
+
});
|
|
284
|
+
|
|
285
|
+
test("says nothing of the sort on an ordinary Runner", async () => {
|
|
286
|
+
openRunnerView(HOST_RUNNER_ID);
|
|
287
|
+
|
|
288
|
+
expect(
|
|
289
|
+
await screen.findByText("bash-runner", {}, { timeout: WAIT_TIMEOUT }),
|
|
290
|
+
).toBeInTheDocument();
|
|
291
|
+
expect(
|
|
292
|
+
screen.queryByTestId("kubernetes-agent-runner-note"),
|
|
293
|
+
).not.toBeInTheDocument();
|
|
294
|
+
expect(screen.queryByText(/superseded/)).not.toBeInTheDocument();
|
|
295
|
+
});
|
|
296
|
+
});
|
|
@@ -156,6 +156,15 @@ const RESELLER_MESSAGE: string =
|
|
|
156
156
|
const EMPTY_STATE_ID: string = "security-event-connections-empty-state";
|
|
157
157
|
const NO_CREATE_REASON: string =
|
|
158
158
|
"You do not have permission to create connections.";
|
|
159
|
+
const NO_UPDATE_REASON: string =
|
|
160
|
+
"You do not have permission to update connections.";
|
|
161
|
+
// The row actions a member without update permission finds locked.
|
|
162
|
+
const WRITE_ACTIONS: Array<string> = [
|
|
163
|
+
"Test connection",
|
|
164
|
+
"Run now",
|
|
165
|
+
"Edit",
|
|
166
|
+
"Update credentials",
|
|
167
|
+
];
|
|
159
168
|
|
|
160
169
|
/*
|
|
161
170
|
* The empty state's provider tiles in catalog order, written out so a
|
|
@@ -364,6 +373,46 @@ function row(name: string = "Acme Okta"): HTMLElement {
|
|
|
364
373
|
return screen.getByTestId(name);
|
|
365
374
|
}
|
|
366
375
|
|
|
376
|
+
/*
|
|
377
|
+
* A row shows one action as its button and folds every other action into a
|
|
378
|
+
* ⋯ menu beside it. The button is View Error when the row has an error to
|
|
379
|
+
* read and Test connection when it does not, so Run now, Diagnostics, Edit
|
|
380
|
+
* and Update credentials are reached the way a person reaches them: open
|
|
381
|
+
* that row's menu, then pick the item. The menu is portalled to the body,
|
|
382
|
+
* so it is found on the screen rather than inside the row.
|
|
383
|
+
*/
|
|
384
|
+
function openRowMenu(current: HTMLElement): HTMLElement {
|
|
385
|
+
fireEvent.click(within(current).getByTestId("row-actions-more-button"));
|
|
386
|
+
return screen.getByRole("menu");
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
function clickRowMenuItem(current: HTMLElement, title: string): void {
|
|
390
|
+
fireEvent.click(
|
|
391
|
+
within(openRowMenu(current)).getByRole("menuitem", { name: title }),
|
|
392
|
+
);
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
function menuItemTitles(menu: HTMLElement): Array<string> {
|
|
396
|
+
return within(menu)
|
|
397
|
+
.getAllByRole("menuitem")
|
|
398
|
+
.map((item: HTMLElement): string => {
|
|
399
|
+
return item.textContent || "";
|
|
400
|
+
});
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
/*
|
|
404
|
+
* A locked menu item is aria-disabled rather than natively disabled, so it
|
|
405
|
+
* stays reachable from the keyboard, and the reason it is locked is its own
|
|
406
|
+
* accessible description whether or not the tooltip is showing. Every locked
|
|
407
|
+
* item gives the same reason, and jsdom never finishes a tooltip's exit
|
|
408
|
+
* transition, so the reason is read from the item rather than from whichever
|
|
409
|
+
* tooltip happens to be on the page.
|
|
410
|
+
*/
|
|
411
|
+
function expectLockedMenuItem(item: HTMLElement, reason: string): void {
|
|
412
|
+
expect(item).toHaveAttribute("aria-disabled", "true");
|
|
413
|
+
expect(item).toHaveAccessibleDescription(reason);
|
|
414
|
+
}
|
|
415
|
+
|
|
367
416
|
function postCall(index: number = 0): JSONObject {
|
|
368
417
|
return jest.mocked(API.post).mock.calls[index]?.[0] as unknown as JSONObject;
|
|
369
418
|
}
|
|
@@ -1043,39 +1092,99 @@ describe("SecurityEventConnectionsTable", () => {
|
|
|
1043
1092
|
expect(row("Acme Okta")).not.toHaveTextContent("Alerts and detections");
|
|
1044
1093
|
});
|
|
1045
1094
|
|
|
1095
|
+
/*
|
|
1096
|
+
* A row used to be a strip of six outlined buttons. It is now one button
|
|
1097
|
+
* and a ⋯ menu: the error when there is one to read, otherwise Test
|
|
1098
|
+
* connection, with every other action in the menu in the order the table
|
|
1099
|
+
* lists them. Nothing here is destructive, so the menu has no red tail.
|
|
1100
|
+
*/
|
|
1101
|
+
test.each([
|
|
1102
|
+
{ layout: "desktop", isMobile: false },
|
|
1103
|
+
{ layout: "mobile", isMobile: true },
|
|
1104
|
+
])(
|
|
1105
|
+
"$layout rows show one action as a button and the rest in a ⋯ menu",
|
|
1106
|
+
({ isMobile }: { isMobile: boolean }): void => {
|
|
1107
|
+
mockIsMobile = isMobile;
|
|
1108
|
+
renderTable([
|
|
1109
|
+
connection(),
|
|
1110
|
+
connection({
|
|
1111
|
+
_id: "44444444-4444-4444-8444-444444444444",
|
|
1112
|
+
name: "Failing Okta",
|
|
1113
|
+
lastError: "Okta System Log request failed (HTTP 401)",
|
|
1114
|
+
}),
|
|
1115
|
+
]);
|
|
1116
|
+
|
|
1117
|
+
const healthy: HTMLElement = within(row()).getByTestId("row-actions");
|
|
1118
|
+
expect(within(healthy).getAllByRole("button")).toEqual([
|
|
1119
|
+
within(healthy).getByRole("button", { name: "Test connection" }),
|
|
1120
|
+
within(healthy).getByRole("button", { name: "More actions" }),
|
|
1121
|
+
]);
|
|
1122
|
+
const healthyMenu: HTMLElement = openRowMenu(row());
|
|
1123
|
+
expect(menuItemTitles(healthyMenu)).toEqual([
|
|
1124
|
+
"Run now",
|
|
1125
|
+
"Diagnostics",
|
|
1126
|
+
"Edit",
|
|
1127
|
+
"Update credentials",
|
|
1128
|
+
]);
|
|
1129
|
+
fireEvent.keyDown(
|
|
1130
|
+
within(healthyMenu).getByRole("menuitem", { name: "Run now" }),
|
|
1131
|
+
{ key: "Escape" },
|
|
1132
|
+
);
|
|
1133
|
+
expect(screen.queryByRole("menu")).not.toBeInTheDocument();
|
|
1134
|
+
|
|
1135
|
+
const failing: HTMLElement = within(row("Failing Okta")).getByTestId(
|
|
1136
|
+
"row-actions",
|
|
1137
|
+
);
|
|
1138
|
+
expect(within(failing).getAllByRole("button")).toEqual([
|
|
1139
|
+
within(failing).getByRole("button", { name: "View Error" }),
|
|
1140
|
+
within(failing).getByRole("button", { name: "More actions" }),
|
|
1141
|
+
]);
|
|
1142
|
+
expect(menuItemTitles(openRowMenu(row("Failing Okta")))).toEqual([
|
|
1143
|
+
"Test connection",
|
|
1144
|
+
"Run now",
|
|
1145
|
+
"Diagnostics",
|
|
1146
|
+
"Edit",
|
|
1147
|
+
"Update credentials",
|
|
1148
|
+
]);
|
|
1149
|
+
// Opening a menu is not running anything in it.
|
|
1150
|
+
expect(screen.queryByRole("dialog")).not.toBeInTheDocument();
|
|
1151
|
+
expect(API.post).not.toHaveBeenCalled();
|
|
1152
|
+
},
|
|
1153
|
+
);
|
|
1154
|
+
|
|
1046
1155
|
test("read-only members keep View Error and Diagnostics while every write action is locked", (): void => {
|
|
1047
1156
|
jest.spyOn(PermissionGate, "check").mockReturnValue({
|
|
1048
1157
|
isAllowed: false,
|
|
1049
|
-
disabledReason:
|
|
1158
|
+
disabledReason: NO_UPDATE_REASON,
|
|
1050
1159
|
});
|
|
1051
1160
|
renderTable([
|
|
1052
1161
|
connection({ lastError: "Okta System Log request failed (HTTP 401)" }),
|
|
1053
1162
|
]);
|
|
1054
1163
|
|
|
1164
|
+
// The error is the row's one button, and reading it needs no permission.
|
|
1055
1165
|
const current: HTMLElement = row();
|
|
1056
|
-
for (const title of [
|
|
1057
|
-
"Test connection",
|
|
1058
|
-
"Run now",
|
|
1059
|
-
"Edit",
|
|
1060
|
-
"Update credentials",
|
|
1061
|
-
]) {
|
|
1062
|
-
expect(
|
|
1063
|
-
within(current).getByRole("button", { name: title }),
|
|
1064
|
-
).toBeDisabled();
|
|
1065
|
-
}
|
|
1066
1166
|
expect(
|
|
1067
|
-
within(current).getByRole("button", { name: "
|
|
1167
|
+
within(current).getByRole("button", { name: "View Error" }),
|
|
1068
1168
|
).toBeEnabled();
|
|
1169
|
+
|
|
1170
|
+
const menu: HTMLElement = openRowMenu(current);
|
|
1171
|
+
for (const title of WRITE_ACTIONS) {
|
|
1172
|
+
const item: HTMLElement = within(menu).getByRole("menuitem", {
|
|
1173
|
+
name: title,
|
|
1174
|
+
});
|
|
1175
|
+
expectLockedMenuItem(item, NO_UPDATE_REASON);
|
|
1176
|
+
// Locked is inert: picking it opens nothing and sends nothing.
|
|
1177
|
+
fireEvent.click(item);
|
|
1178
|
+
}
|
|
1179
|
+
expect(screen.queryByRole("dialog")).not.toBeInTheDocument();
|
|
1069
1180
|
expect(
|
|
1070
|
-
within(
|
|
1181
|
+
within(menu).getByRole("menuitem", { name: "Diagnostics" }),
|
|
1071
1182
|
).toBeEnabled();
|
|
1072
1183
|
|
|
1073
1184
|
const button: CardButtonSchema = tableProps().cardProps
|
|
1074
1185
|
?.buttons?.[0] as CardButtonSchema;
|
|
1075
1186
|
expect(button.disabled).toBe(true);
|
|
1076
|
-
expect(button.tooltip).toBe(
|
|
1077
|
-
"You do not have permission to update connections.",
|
|
1078
|
-
);
|
|
1187
|
+
expect(button.tooltip).toBe(NO_UPDATE_REASON);
|
|
1079
1188
|
expect(API.post).not.toHaveBeenCalled();
|
|
1080
1189
|
});
|
|
1081
1190
|
|
|
@@ -1175,7 +1284,7 @@ describe("SecurityEventConnectionsTable", () => {
|
|
|
1175
1284
|
);
|
|
1176
1285
|
renderTable([connection()]);
|
|
1177
1286
|
|
|
1178
|
-
|
|
1287
|
+
clickRowMenuItem(row(), "Run now");
|
|
1179
1288
|
|
|
1180
1289
|
expect(
|
|
1181
1290
|
await screen.findByRole("dialog", {
|
|
@@ -1198,7 +1307,7 @@ describe("SecurityEventConnectionsTable", () => {
|
|
|
1198
1307
|
test("Diagnostics shows the same health wording and UTC times with a local-time title", async (): Promise<void> => {
|
|
1199
1308
|
renderTable([connection()]);
|
|
1200
1309
|
|
|
1201
|
-
|
|
1310
|
+
clickRowMenuItem(row(), "Diagnostics");
|
|
1202
1311
|
|
|
1203
1312
|
const dialog: HTMLElement = await screen.findByRole("dialog", {
|
|
1204
1313
|
name: "Connection diagnostics: Acme Okta",
|
|
@@ -1219,11 +1328,7 @@ describe("SecurityEventConnectionsTable", () => {
|
|
|
1219
1328
|
.mockResolvedValue(googleConnection({ alertingOnly: false }));
|
|
1220
1329
|
renderTable([googleConnection({ alertingOnly: false })]);
|
|
1221
1330
|
|
|
1222
|
-
|
|
1223
|
-
within(row("Customer SecOps")).getByRole("button", {
|
|
1224
|
-
name: "Diagnostics",
|
|
1225
|
-
}),
|
|
1226
|
-
);
|
|
1331
|
+
clickRowMenuItem(row("Customer SecOps"), "Diagnostics");
|
|
1227
1332
|
const dialog: HTMLElement = await screen.findByRole("dialog", {
|
|
1228
1333
|
name: "Connection diagnostics: Customer SecOps",
|
|
1229
1334
|
});
|
|
@@ -1247,7 +1352,7 @@ describe("SecurityEventConnectionsTable", () => {
|
|
|
1247
1352
|
test("Diagnostics Test connection clears the previous checklist when a re-run fails", async (): Promise<void> => {
|
|
1248
1353
|
renderTable([connection()]);
|
|
1249
1354
|
|
|
1250
|
-
|
|
1355
|
+
clickRowMenuItem(row(), "Diagnostics");
|
|
1251
1356
|
const dialog: HTMLElement = await screen.findByRole("dialog", {
|
|
1252
1357
|
name: "Connection diagnostics: Acme Okta",
|
|
1253
1358
|
});
|
|
@@ -1289,7 +1394,7 @@ describe("SecurityEventConnectionsTable", () => {
|
|
|
1289
1394
|
test("Edit and Update credentials open the form modal in the matching mode", async (): Promise<void> => {
|
|
1290
1395
|
renderTable([connection()]);
|
|
1291
1396
|
|
|
1292
|
-
|
|
1397
|
+
clickRowMenuItem(row(), "Edit");
|
|
1293
1398
|
const edit: HTMLElement = await screen.findByRole("dialog", {
|
|
1294
1399
|
name: "Edit connection: Acme Okta",
|
|
1295
1400
|
});
|
|
@@ -1301,9 +1406,9 @@ describe("SecurityEventConnectionsTable", () => {
|
|
|
1301
1406
|
expect(screen.queryByRole("dialog")).not.toBeInTheDocument();
|
|
1302
1407
|
});
|
|
1303
1408
|
|
|
1304
|
-
|
|
1305
|
-
|
|
1306
|
-
);
|
|
1409
|
+
// The menu closed behind the first pick; the second opens it again.
|
|
1410
|
+
expect(screen.queryByRole("menu")).not.toBeInTheDocument();
|
|
1411
|
+
clickRowMenuItem(row(), "Update credentials");
|
|
1307
1412
|
const credentials: HTMLElement = await screen.findByRole("dialog", {
|
|
1308
1413
|
name: "Update credentials: Acme Okta",
|
|
1309
1414
|
});
|
|
@@ -1679,20 +1784,25 @@ describe("Last Error actions", () => {
|
|
|
1679
1784
|
test("allows read-only members to view and copy errors while update actions remain disabled", async (): Promise<void> => {
|
|
1680
1785
|
jest.spyOn(PermissionGate, "check").mockReturnValue({
|
|
1681
1786
|
isAllowed: false,
|
|
1682
|
-
disabledReason:
|
|
1787
|
+
disabledReason: NO_UPDATE_REASON,
|
|
1683
1788
|
});
|
|
1684
1789
|
const error: string =
|
|
1685
1790
|
"Google SecOps alerts fetch failed (HTTP 403): permission denied";
|
|
1686
1791
|
renderTable([errorConnection("Production", error)]);
|
|
1687
1792
|
|
|
1688
|
-
|
|
1689
|
-
|
|
1690
|
-
|
|
1691
|
-
|
|
1692
|
-
|
|
1693
|
-
|
|
1694
|
-
expect(screen.getByRole("button", { name: title })).toBeDisabled();
|
|
1793
|
+
const menu: HTMLElement = openRowMenu(screen.getByTestId("Production"));
|
|
1794
|
+
for (const title of WRITE_ACTIONS) {
|
|
1795
|
+
expectLockedMenuItem(
|
|
1796
|
+
within(menu).getByRole("menuitem", { name: title }),
|
|
1797
|
+
NO_UPDATE_REASON,
|
|
1798
|
+
);
|
|
1695
1799
|
}
|
|
1800
|
+
// Diagnostics is the one item left to focus; Escape leaves from there.
|
|
1801
|
+
fireEvent.keyDown(
|
|
1802
|
+
within(menu).getByRole("menuitem", { name: "Diagnostics" }),
|
|
1803
|
+
{ key: "Escape" },
|
|
1804
|
+
);
|
|
1805
|
+
expect(screen.queryByRole("menu")).not.toBeInTheDocument();
|
|
1696
1806
|
expect(screen.getByRole("button", { name: "View Error" })).toBeEnabled();
|
|
1697
1807
|
|
|
1698
1808
|
const dialog: HTMLElement = openError();
|