@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
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import AlertSeverity from "./AlertSeverity";
|
|
2
|
+
import IncidentSeverity from "./IncidentSeverity";
|
|
1
3
|
import Project from "./Project";
|
|
2
4
|
import Team from "./Team";
|
|
3
5
|
import User from "./User";
|
|
@@ -21,8 +23,17 @@ import IconProp from "../../Types/Icon/IconProp";
|
|
|
21
23
|
import { JSONObject } from "../../Types/JSON";
|
|
22
24
|
import ObjectID from "../../Types/ObjectID";
|
|
23
25
|
import Permission from "../../Types/Permission";
|
|
26
|
+
import ComplianceNotificationChannel from "../../Types/Team/ComplianceNotificationChannel";
|
|
24
27
|
import ComplianceRuleType from "../../Types/Team/ComplianceRuleType";
|
|
25
|
-
import {
|
|
28
|
+
import {
|
|
29
|
+
Column,
|
|
30
|
+
Entity,
|
|
31
|
+
Index,
|
|
32
|
+
JoinColumn,
|
|
33
|
+
JoinTable,
|
|
34
|
+
ManyToMany,
|
|
35
|
+
ManyToOne,
|
|
36
|
+
} from "typeorm";
|
|
26
37
|
|
|
27
38
|
@TableEditionAccessControl({
|
|
28
39
|
requiresEnterprise: true,
|
|
@@ -60,7 +71,12 @@ import { Column, Entity, Index, JoinColumn, ManyToOne } from "typeorm";
|
|
|
60
71
|
})
|
|
61
72
|
@TenantColumn("projectId")
|
|
62
73
|
@CrudApiEndpoint(new Route("/team-compliance-setting"))
|
|
63
|
-
|
|
74
|
+
/*
|
|
75
|
+
* No unique (teamId, ruleType) index: one team can hold several rules of the
|
|
76
|
+
* same type - "Call for Critical incidents" and "Push for Critical incidents"
|
|
77
|
+
* are both HasIncidentOnCallRules. TeamComplianceSettingService rejects exact
|
|
78
|
+
* duplicates (same type, channel and severities) instead.
|
|
79
|
+
*/
|
|
64
80
|
@Entity({
|
|
65
81
|
name: "TeamComplianceSetting",
|
|
66
82
|
})
|
|
@@ -414,4 +430,129 @@ export default class TeamComplianceSetting extends BaseModel {
|
|
|
414
430
|
nullable: true,
|
|
415
431
|
})
|
|
416
432
|
public options?: JSONObject = undefined;
|
|
433
|
+
|
|
434
|
+
@ColumnAccessControl({
|
|
435
|
+
create: [
|
|
436
|
+
Permission.ProjectOwner,
|
|
437
|
+
Permission.ProjectAdmin,
|
|
438
|
+
Permission.EditProjectTeam,
|
|
439
|
+
],
|
|
440
|
+
read: [
|
|
441
|
+
Permission.ProjectOwner,
|
|
442
|
+
Permission.ProjectAdmin,
|
|
443
|
+
Permission.ProjectMember,
|
|
444
|
+
Permission.Viewer,
|
|
445
|
+
Permission.ReadProjectTeam,
|
|
446
|
+
],
|
|
447
|
+
update: [
|
|
448
|
+
Permission.ProjectOwner,
|
|
449
|
+
Permission.ProjectAdmin,
|
|
450
|
+
Permission.EditProjectTeam,
|
|
451
|
+
],
|
|
452
|
+
})
|
|
453
|
+
@TableColumn({
|
|
454
|
+
required: false,
|
|
455
|
+
type: TableColumnType.ShortText,
|
|
456
|
+
title: "Notification Channel",
|
|
457
|
+
description:
|
|
458
|
+
"On-call rules only: the channel the member's rule must notify them on (Call, SMS, Push, Email, WhatsApp, Telegram, Slack, MicrosoftTeams or Webhook). Leave empty to accept any channel.",
|
|
459
|
+
})
|
|
460
|
+
@Column({
|
|
461
|
+
nullable: true,
|
|
462
|
+
type: ColumnType.ShortText,
|
|
463
|
+
length: ColumnLength.ShortText,
|
|
464
|
+
})
|
|
465
|
+
public notificationChannel?: ComplianceNotificationChannel = undefined;
|
|
466
|
+
|
|
467
|
+
@ColumnAccessControl({
|
|
468
|
+
create: [
|
|
469
|
+
Permission.ProjectOwner,
|
|
470
|
+
Permission.ProjectAdmin,
|
|
471
|
+
Permission.EditProjectTeam,
|
|
472
|
+
],
|
|
473
|
+
read: [
|
|
474
|
+
Permission.ProjectOwner,
|
|
475
|
+
Permission.ProjectAdmin,
|
|
476
|
+
Permission.ProjectMember,
|
|
477
|
+
Permission.Viewer,
|
|
478
|
+
Permission.ReadProjectTeam,
|
|
479
|
+
],
|
|
480
|
+
update: [
|
|
481
|
+
Permission.ProjectOwner,
|
|
482
|
+
Permission.ProjectAdmin,
|
|
483
|
+
Permission.EditProjectTeam,
|
|
484
|
+
],
|
|
485
|
+
})
|
|
486
|
+
@TableColumn({
|
|
487
|
+
required: false,
|
|
488
|
+
type: TableColumnType.EntityArray,
|
|
489
|
+
modelType: IncidentSeverity,
|
|
490
|
+
title: "Incident Severities",
|
|
491
|
+
description:
|
|
492
|
+
"Incident and incident episode on-call rules only: the severities members must have a rule for. Leave empty to require every incident severity.",
|
|
493
|
+
})
|
|
494
|
+
@ManyToMany(
|
|
495
|
+
() => {
|
|
496
|
+
return IncidentSeverity;
|
|
497
|
+
},
|
|
498
|
+
{ eager: false },
|
|
499
|
+
)
|
|
500
|
+
@JoinTable({
|
|
501
|
+
name: "TeamComplianceSettingIncidentSeverity",
|
|
502
|
+
inverseJoinColumn: {
|
|
503
|
+
name: "incidentSeverityId",
|
|
504
|
+
referencedColumnName: "_id",
|
|
505
|
+
},
|
|
506
|
+
joinColumn: {
|
|
507
|
+
name: "teamComplianceSettingId",
|
|
508
|
+
referencedColumnName: "_id",
|
|
509
|
+
},
|
|
510
|
+
})
|
|
511
|
+
public incidentSeverities?: Array<IncidentSeverity> = undefined;
|
|
512
|
+
|
|
513
|
+
@ColumnAccessControl({
|
|
514
|
+
create: [
|
|
515
|
+
Permission.ProjectOwner,
|
|
516
|
+
Permission.ProjectAdmin,
|
|
517
|
+
Permission.EditProjectTeam,
|
|
518
|
+
],
|
|
519
|
+
read: [
|
|
520
|
+
Permission.ProjectOwner,
|
|
521
|
+
Permission.ProjectAdmin,
|
|
522
|
+
Permission.ProjectMember,
|
|
523
|
+
Permission.Viewer,
|
|
524
|
+
Permission.ReadProjectTeam,
|
|
525
|
+
],
|
|
526
|
+
update: [
|
|
527
|
+
Permission.ProjectOwner,
|
|
528
|
+
Permission.ProjectAdmin,
|
|
529
|
+
Permission.EditProjectTeam,
|
|
530
|
+
],
|
|
531
|
+
})
|
|
532
|
+
@TableColumn({
|
|
533
|
+
required: false,
|
|
534
|
+
type: TableColumnType.EntityArray,
|
|
535
|
+
modelType: AlertSeverity,
|
|
536
|
+
title: "Alert Severities",
|
|
537
|
+
description:
|
|
538
|
+
"Alert and alert episode on-call rules only: the severities members must have a rule for. Leave empty to require every alert severity.",
|
|
539
|
+
})
|
|
540
|
+
@ManyToMany(
|
|
541
|
+
() => {
|
|
542
|
+
return AlertSeverity;
|
|
543
|
+
},
|
|
544
|
+
{ eager: false },
|
|
545
|
+
)
|
|
546
|
+
@JoinTable({
|
|
547
|
+
name: "TeamComplianceSettingAlertSeverity",
|
|
548
|
+
inverseJoinColumn: {
|
|
549
|
+
name: "alertSeverityId",
|
|
550
|
+
referencedColumnName: "_id",
|
|
551
|
+
},
|
|
552
|
+
joinColumn: {
|
|
553
|
+
name: "teamComplianceSettingId",
|
|
554
|
+
referencedColumnName: "_id",
|
|
555
|
+
},
|
|
556
|
+
})
|
|
557
|
+
public alertSeverities?: Array<AlertSeverity> = undefined;
|
|
417
558
|
}
|
|
@@ -43,6 +43,23 @@ export interface MicrosoftTeamsChat {
|
|
|
43
43
|
* shipped.
|
|
44
44
|
*/
|
|
45
45
|
memberAadObjectIds?: Array<string> | undefined;
|
|
46
|
+
/*
|
|
47
|
+
* The chat's name in Teams (Graph's "topic"), as last read. `name` is built
|
|
48
|
+
* from it; it is kept separately so a lookup that fails later can keep the
|
|
49
|
+
* chat's real name instead of falling back to member names. Absent when the
|
|
50
|
+
* chat has no name, or its name has never been readable.
|
|
51
|
+
*/
|
|
52
|
+
topic?: string | undefined;
|
|
53
|
+
/*
|
|
54
|
+
* The first few human members' display names — only what a chat named
|
|
55
|
+
* after its members shows — and how many members have a name. Kept so the
|
|
56
|
+
* name can be rebuilt when a group chat's Teams name is removed, without a
|
|
57
|
+
* roster call. miscData is readable by every project Viewer, so the full
|
|
58
|
+
* roster is deliberately not stored. Absent on records captured before this
|
|
59
|
+
* shipped (a group chat without memberCount is re-captured once).
|
|
60
|
+
*/
|
|
61
|
+
memberNames?: Array<string> | undefined;
|
|
62
|
+
memberCount?: number | undefined;
|
|
46
63
|
}
|
|
47
64
|
|
|
48
65
|
/*
|
package/Server/API/AIChatAPI.ts
CHANGED
|
@@ -47,6 +47,7 @@ import AIConversationMessageService from "../Services/AIConversationMessageServi
|
|
|
47
47
|
import AIRunEventService from "../Services/AIRunEventService";
|
|
48
48
|
import AIRunService from "../Services/AIRunService";
|
|
49
49
|
import ProjectService from "../Services/ProjectService";
|
|
50
|
+
import { AI_DISABLED_MESSAGE } from "../Services/AIService";
|
|
50
51
|
import LlmProviderService from "../Services/LlmProviderService";
|
|
51
52
|
import LlmProvider from "../../Models/DatabaseModels/LlmProvider";
|
|
52
53
|
import ChatAgentRunner, {
|
|
@@ -217,10 +218,12 @@ router.post(
|
|
|
217
218
|
}),
|
|
218
219
|
]);
|
|
219
220
|
|
|
221
|
+
/*
|
|
222
|
+
* The shared kill-switch sentence, so Ask AI names the same settings
|
|
223
|
+
* page as every other AI surface that refuses.
|
|
224
|
+
*/
|
|
220
225
|
if (project && project.enableAi === false) {
|
|
221
|
-
throw new BadDataException(
|
|
222
|
-
"AI features are disabled for this project. Enable them in Project Settings > AI Credits.",
|
|
223
|
-
);
|
|
226
|
+
throw new BadDataException(AI_DISABLED_MESSAGE);
|
|
224
227
|
}
|
|
225
228
|
|
|
226
229
|
if (runningRunsInProject >= MAX_CONCURRENT_RUNS_PER_PROJECT) {
|
|
@@ -49,6 +49,7 @@ import {
|
|
|
49
49
|
KubernetesAiAccessGapCode,
|
|
50
50
|
KubernetesAiAccessRunnerSummary,
|
|
51
51
|
KubernetesClusterAiAccessStatus,
|
|
52
|
+
getKubernetesAiAccessTargetKind,
|
|
52
53
|
} from "../../Types/Kubernetes/KubernetesClusterAiAccess";
|
|
53
54
|
import { KUBERNETES_AI_ACCESS_CREDENTIAL_PERMISSIONS } from "../../Types/Kubernetes/KubernetesClusterAiAccessPermissions";
|
|
54
55
|
import CodeFixTaskType from "../../Types/AI/CodeFixTaskType";
|
|
@@ -544,22 +545,21 @@ export type InvestigationPanelClusterAccess = Pick<
|
|
|
544
545
|
* identifier the Runner reported.
|
|
545
546
|
*/
|
|
546
547
|
export const RESTRICTED_GAP_DESCRIPTION: string =
|
|
547
|
-
"Someone who can view this Kubernetes cluster can see the details on its AI page.";
|
|
548
|
+
"Someone who can view this Kubernetes cluster can see the details on its AI agent page (AI → Agent).";
|
|
548
549
|
|
|
549
550
|
/*
|
|
550
551
|
* Stand in for a gap's next step on a row whose viewer cannot read the
|
|
551
|
-
* cluster. The service's next steps are written for the cluster's AI
|
|
552
|
-
* and may name the Runner
|
|
553
|
-
*
|
|
554
|
-
*
|
|
555
|
-
*
|
|
556
|
-
* Settings instead.
|
|
552
|
+
* cluster. The service's next steps are written for the cluster's AI agent
|
|
553
|
+
* page and may name the Runner, the credential, the agent's namespace or
|
|
554
|
+
* the cluster identifier — none of which such a viewer is shown — and
|
|
555
|
+
* point at a page they cannot open. A project-level gap is fixed in
|
|
556
|
+
* Project Settings instead.
|
|
557
557
|
*/
|
|
558
558
|
export const RESTRICTED_GAP_NEXT_STEP: string =
|
|
559
|
-
"Ask someone who can edit this Kubernetes cluster's AI access to fix it on the cluster's AI page.";
|
|
559
|
+
"Ask someone who can edit this Kubernetes cluster's AI access to fix it on the cluster's AI agent page (AI → Agent).";
|
|
560
560
|
|
|
561
561
|
export const RESTRICTED_PROJECT_GAP_NEXT_STEP: string =
|
|
562
|
-
"Ask a project admin to change this
|
|
562
|
+
"Ask a project owner or admin to change this in Project Settings (AI Features, AI Credits or LLM Providers).";
|
|
563
563
|
|
|
564
564
|
/*
|
|
565
565
|
* The gaps fixed in Project Settings rather than on the cluster. Every
|
|
@@ -571,6 +571,7 @@ const PROJECT_LEVEL_GAP_CODES: ReadonlyArray<KubernetesAiAccessGapCode> = [
|
|
|
571
571
|
"project_auto_remediation_disabled",
|
|
572
572
|
"project_ai_command_execution_disabled",
|
|
573
573
|
"llm_provider_missing",
|
|
574
|
+
"ai_balance_insufficient",
|
|
574
575
|
];
|
|
575
576
|
|
|
576
577
|
// The next step a viewer who cannot read the cluster sees for a gap.
|
|
@@ -586,7 +587,7 @@ export function getRestrictedGapNextStep(code: string): string {
|
|
|
586
587
|
* credential.
|
|
587
588
|
*/
|
|
588
589
|
export const RESTRICTED_CREDENTIAL_GAP_DESCRIPTION: string =
|
|
589
|
-
"The Kubernetes credential this cluster's Runner needs is missing or cannot be used. Someone who can view Runner credentials can see which one on the cluster's AI page.";
|
|
590
|
+
"The Kubernetes credential this cluster's Runner needs is missing or cannot be used. Someone who can view Runner credentials can see which one on the cluster's AI agent page (AI → Agent).";
|
|
590
591
|
|
|
591
592
|
function toPanelRunnerSummary(
|
|
592
593
|
runner: KubernetesAiAccessRunnerSummary | null,
|
|
@@ -598,6 +599,12 @@ function toPanelRunnerSummary(
|
|
|
598
599
|
return {
|
|
599
600
|
id: runner.id,
|
|
600
601
|
name: runner.name,
|
|
602
|
+
/*
|
|
603
|
+
* Which kind of target it is: the panel names the Kubernetes AI agent
|
|
604
|
+
* and a Runner differently, and accessMethod ("in_cluster" for both
|
|
605
|
+
* the agent and the previous in-cluster Runner) cannot tell them apart.
|
|
606
|
+
*/
|
|
607
|
+
kind: getKubernetesAiAccessTargetKind(runner) || undefined,
|
|
601
608
|
isOnline: runner.isOnline,
|
|
602
609
|
lastAliveAt: runner.lastAliveAt,
|
|
603
610
|
canRunAiCommands: runner.canRunAiCommands,
|
|
@@ -24,6 +24,7 @@ import RunbookStepType from "../../Types/Runbook/RunbookStepType";
|
|
|
24
24
|
import {
|
|
25
25
|
KubernetesAiAccessGap,
|
|
26
26
|
KubernetesClusterAiAccessStatus,
|
|
27
|
+
getKubernetesAiAccessTargetKind,
|
|
27
28
|
isKubernetesAgentRunnerName,
|
|
28
29
|
isKubernetesAgentRunnerPosture,
|
|
29
30
|
parseKubernetesRunnerPosture,
|
|
@@ -53,6 +54,7 @@ import RunnerService from "../Services/RunnerService";
|
|
|
53
54
|
import KubernetesClusterAiAccessService from "../Services/KubernetesClusterAiAccessService";
|
|
54
55
|
import CommandPlanExecutor from "../Utils/AutoRemediation/CommandPlanExecutor";
|
|
55
56
|
import RemediationCommandToolkit from "../Utils/AI/Remediation/RemediationCommandTools";
|
|
57
|
+
import { isClusterRemediationRound } from "../Utils/AI/Remediation/RemediationExecutionRunner";
|
|
56
58
|
import logger from "../Utils/Logger";
|
|
57
59
|
|
|
58
60
|
const router: ExpressRouter = Express.getRouter();
|
|
@@ -112,24 +114,158 @@ async function findAccessibleSuggestion(
|
|
|
112
114
|
return suggestion.id;
|
|
113
115
|
}
|
|
114
116
|
|
|
117
|
+
/*
|
|
118
|
+
* One approval reads each cluster's AI access status at most once: the
|
|
119
|
+
* Runner loop reads it to recognise the Kubernetes AI agent, and the kubectl
|
|
120
|
+
* re-check reuses the same answer.
|
|
121
|
+
*/
|
|
122
|
+
type ClusterStatusCache = Map<string, KubernetesClusterAiAccessStatus | null>;
|
|
123
|
+
|
|
124
|
+
async function getClusterStatusOnce(data: {
|
|
125
|
+
clusterId: string;
|
|
126
|
+
projectId: ObjectID;
|
|
127
|
+
statusByClusterId: ClusterStatusCache;
|
|
128
|
+
}): Promise<KubernetesClusterAiAccessStatus | null> {
|
|
129
|
+
if (data.statusByClusterId.has(data.clusterId)) {
|
|
130
|
+
return data.statusByClusterId.get(data.clusterId) || null;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
const status: KubernetesClusterAiAccessStatus | null =
|
|
134
|
+
await KubernetesClusterAiAccessService.getStatusForCluster({
|
|
135
|
+
clusterId: new ObjectID(data.clusterId),
|
|
136
|
+
projectId: data.projectId,
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
data.statusByClusterId.set(data.clusterId, status);
|
|
140
|
+
|
|
141
|
+
return status;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/*
|
|
145
|
+
* The cluster status whose access target is the Kubernetes AI agent this
|
|
146
|
+
* plan names as `runnerId`, or null when `runnerId` is not the resolved AI
|
|
147
|
+
* agent of any cluster its kubectl commands target. Only a Kubectl command
|
|
148
|
+
* can reach the agent, and only the cluster's current status (not the plan)
|
|
149
|
+
* says what the target is — so a Runner id never passes for the agent, and
|
|
150
|
+
* an agent that is no longer the cluster's target falls back to the Runner
|
|
151
|
+
* re-read, which refuses it.
|
|
152
|
+
*/
|
|
153
|
+
async function findAiAgentTargetStatus(data: {
|
|
154
|
+
plan: AiRemediationCommandPlan;
|
|
155
|
+
runnerId: string;
|
|
156
|
+
projectId: ObjectID;
|
|
157
|
+
statusByClusterId: ClusterStatusCache;
|
|
158
|
+
}): Promise<KubernetesClusterAiAccessStatus | null> {
|
|
159
|
+
for (const command of data.plan.commands) {
|
|
160
|
+
if (
|
|
161
|
+
command.stepType !== RunbookStepType.Kubectl ||
|
|
162
|
+
command.runnerId !== data.runnerId ||
|
|
163
|
+
!command.kubernetesClusterId
|
|
164
|
+
) {
|
|
165
|
+
continue;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
const status: KubernetesClusterAiAccessStatus | null =
|
|
169
|
+
await getClusterStatusOnce({
|
|
170
|
+
clusterId: command.kubernetesClusterId,
|
|
171
|
+
projectId: data.projectId,
|
|
172
|
+
statusByClusterId: data.statusByClusterId,
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
if (
|
|
176
|
+
status?.runner &&
|
|
177
|
+
getKubernetesAiAccessTargetKind(status.runner) === "ai_agent" &&
|
|
178
|
+
status.runner.id === data.runnerId
|
|
179
|
+
) {
|
|
180
|
+
return status;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
return null;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/*
|
|
188
|
+
* The AI agent's side of the Runner consent re-check. The agent is not a
|
|
189
|
+
* Runner row, so there is no canRunAiCommands flag to re-read — the chart
|
|
190
|
+
* that installed it is its consent. What can still have changed is whether
|
|
191
|
+
* it is connected, and it only ever runs Kubectl steps, so a Bash or SSH
|
|
192
|
+
* step aimed at it fails the click for the same reason as on the legacy
|
|
193
|
+
* in-cluster Runner.
|
|
194
|
+
*/
|
|
195
|
+
function assertAiAgentCanRunPlan(data: {
|
|
196
|
+
plan: AiRemediationCommandPlan;
|
|
197
|
+
runnerId: string;
|
|
198
|
+
status: KubernetesClusterAiAccessStatus;
|
|
199
|
+
}): void {
|
|
200
|
+
const hostStep: AiRemediationCommand | undefined = data.plan.commands.find(
|
|
201
|
+
(command: AiRemediationCommand) => {
|
|
202
|
+
return (
|
|
203
|
+
command.runnerId === data.runnerId &&
|
|
204
|
+
command.stepType !== RunbookStepType.Kubectl
|
|
205
|
+
);
|
|
206
|
+
},
|
|
207
|
+
);
|
|
208
|
+
|
|
209
|
+
if (hostStep) {
|
|
210
|
+
throw new BadDataException(
|
|
211
|
+
`Command ${hostStep.sequence} is a ${hostStep.stepType} step on the Kubernetes AI agent of cluster "${data.status.clusterName}", which runs only Kubectl steps. The plan cannot be run — dismiss it and let a new suggestion be composed.`,
|
|
212
|
+
);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
if (!data.status.runner?.isOnline) {
|
|
216
|
+
throw new BadDataException(
|
|
217
|
+
`The Kubernetes AI agent of cluster "${data.status.clusterName}" is offline, so this plan cannot be run. Check the agent on the cluster's AI agent page (AI → Agent) and approve again, or dismiss the suggestion.`,
|
|
218
|
+
);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/*
|
|
223
|
+
* What to do about a write-scope refusal, three ways by who runs kubectl for
|
|
224
|
+
* the cluster — the same split as RemediationCommandToolkit
|
|
225
|
+
* .getRunnerScopeSettings, which words the refusal itself:
|
|
226
|
+
*
|
|
227
|
+
* - the Kubernetes AI agent: its chart values; after a helm upgrade the
|
|
228
|
+
* same agent serves the cluster, so the plan can be approved again;
|
|
229
|
+
* - the chart's previous in-cluster Runner: the chart no longer ships it,
|
|
230
|
+
* so the way to widen its scope is to upgrade to the AI agent — which
|
|
231
|
+
* replaces the Runner, so this plan (composed for the Runner) cannot be
|
|
232
|
+
* approved again and a new one is needed;
|
|
233
|
+
* - any other Runner (a credential Runner): no chart configures it, its
|
|
234
|
+
* scope is set where it runs.
|
|
235
|
+
*/
|
|
236
|
+
export function getScopeRefusalNextStep(
|
|
237
|
+
runner: KubernetesClusterAiAccessStatus["runner"],
|
|
238
|
+
): string {
|
|
239
|
+
if (getKubernetesAiAccessTargetKind(runner) === "ai_agent") {
|
|
240
|
+
return "Dismiss the suggestion and let a new plan be composed, or change the AI agent's write access (aiAgent.remediation.*) on the Kubernetes agent chart and approve again.";
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
if (
|
|
244
|
+
isKubernetesAgentRunnerName(runner?.name) ||
|
|
245
|
+
isKubernetesAgentRunnerPosture(runner?.posture)
|
|
246
|
+
) {
|
|
247
|
+
return "Dismiss the suggestion and let a new plan be composed. To allow changes like this, upgrade the Kubernetes agent chart to the AI agent and set aiAgent.remediation.*.";
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
return "Dismiss the suggestion and let a new plan be composed, or change the Runner's write scope on the Runner's host and approve again.";
|
|
251
|
+
}
|
|
252
|
+
|
|
115
253
|
/*
|
|
116
254
|
* Approval-time re-check of a Kubectl command's cluster. The plan named the
|
|
117
255
|
* cluster, the Runner and the credential it was composed for; any of them
|
|
118
256
|
* can have changed since (the operator turned remediation off on the
|
|
119
|
-
* cluster's AI page, re-pointed it at another Runner, swapped or
|
|
120
|
-
* the credential, the agent went offline). CommandPlanExecutor
|
|
121
|
-
* on the same conditions right before each command runs — this
|
|
122
|
-
* Approve click fail up front, with the first blocking gap named,
|
|
123
|
-
* of claiming the plan and having it stop one command in. Each
|
|
124
|
-
* checked once however many commands target it.
|
|
257
|
+
* cluster's AI agent page, re-pointed it at another Runner, swapped or
|
|
258
|
+
* removed the credential, the agent went offline). CommandPlanExecutor
|
|
259
|
+
* hard-stops on the same conditions right before each command runs — this
|
|
260
|
+
* makes the Approve click fail up front, with the first blocking gap named,
|
|
261
|
+
* instead of claiming the plan and having it stop one command in. Each
|
|
262
|
+
* cluster is checked once however many commands target it.
|
|
125
263
|
*/
|
|
126
264
|
async function assertKubectlCommandsStillRunnable(data: {
|
|
127
265
|
plan: AiRemediationCommandPlan;
|
|
128
266
|
projectId: ObjectID;
|
|
267
|
+
statusByClusterId: ClusterStatusCache;
|
|
129
268
|
}): Promise<void> {
|
|
130
|
-
const statusByClusterId: Map<string, KubernetesClusterAiAccessStatus | null> =
|
|
131
|
-
new Map<string, KubernetesClusterAiAccessStatus | null>();
|
|
132
|
-
|
|
133
269
|
for (const command of data.plan.commands) {
|
|
134
270
|
if (command.stepType !== RunbookStepType.Kubectl) {
|
|
135
271
|
continue;
|
|
@@ -146,16 +282,12 @@ async function assertKubectlCommandsStillRunnable(data: {
|
|
|
146
282
|
);
|
|
147
283
|
}
|
|
148
284
|
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
if (status === undefined) {
|
|
153
|
-
status = await KubernetesClusterAiAccessService.getStatusForCluster({
|
|
154
|
-
clusterId: new ObjectID(command.kubernetesClusterId),
|
|
285
|
+
const status: KubernetesClusterAiAccessStatus | null =
|
|
286
|
+
await getClusterStatusOnce({
|
|
287
|
+
clusterId: command.kubernetesClusterId,
|
|
155
288
|
projectId: data.projectId,
|
|
289
|
+
statusByClusterId: data.statusByClusterId,
|
|
156
290
|
});
|
|
157
|
-
statusByClusterId.set(command.kubernetesClusterId, status);
|
|
158
|
-
}
|
|
159
291
|
|
|
160
292
|
if (!status) {
|
|
161
293
|
throw new BadDataException(
|
|
@@ -173,7 +305,7 @@ async function assertKubectlCommandsStillRunnable(data: {
|
|
|
173
305
|
throw new BadDataException(
|
|
174
306
|
`Cluster "${status.clusterName}" (command ${command.sequence}) no longer allows AI remediation${
|
|
175
307
|
gap ? `: ${gap.title} — ${gap.nextStep}` : ""
|
|
176
|
-
}. Fix that on the cluster's AI page and approve again, or dismiss the suggestion.`,
|
|
308
|
+
}. Fix that on the cluster's AI agent page (AI → Agent) and approve again, or dismiss the suggestion.`,
|
|
177
309
|
);
|
|
178
310
|
}
|
|
179
311
|
|
|
@@ -218,7 +350,7 @@ async function assertKubectlCommandsStillRunnable(data: {
|
|
|
218
350
|
|
|
219
351
|
if (scopeRefusal) {
|
|
220
352
|
throw new BadDataException(
|
|
221
|
-
`Command ${command.sequence}${part.label} cannot run on cluster "${status.clusterName}": ${scopeRefusal} Nothing ran.
|
|
353
|
+
`Command ${command.sequence}${part.label} cannot run on cluster "${status.clusterName}": ${scopeRefusal} Nothing ran. ${getScopeRefusalNextStep(status.runner)}`,
|
|
222
354
|
);
|
|
223
355
|
}
|
|
224
356
|
}
|
|
@@ -284,6 +416,13 @@ async function loadSuggestionAsRoot(
|
|
|
284
416
|
verificationWindowMinutes: true,
|
|
285
417
|
suggestionType: true,
|
|
286
418
|
commandPlan: true,
|
|
419
|
+
/*
|
|
420
|
+
* Which lane composed a command plan: a cluster round (a cluster,
|
|
421
|
+
* no rule) does not need the project's AI command execution opt-in,
|
|
422
|
+
* a rule round does (isClusterRemediationRound).
|
|
423
|
+
*/
|
|
424
|
+
kubernetesClusterId: true,
|
|
425
|
+
autoRemediationRuleId: true,
|
|
287
426
|
},
|
|
288
427
|
props: { isRoot: true },
|
|
289
428
|
});
|
|
@@ -371,10 +510,15 @@ router.post(
|
|
|
371
510
|
assertCanExecuteRunbooks(props, suggestion.projectId);
|
|
372
511
|
|
|
373
512
|
/*
|
|
374
|
-
* Re-check the project
|
|
375
|
-
* been composed hours ago; an operator who has since turned AI
|
|
376
|
-
* command execution off expects that switch
|
|
377
|
-
* too, not just new ones.
|
|
513
|
+
* Re-check the project switches at approval time. The plan may have
|
|
514
|
+
* been composed hours ago; an operator who has since turned AI,
|
|
515
|
+
* auto-remediation or AI command execution off expects that switch
|
|
516
|
+
* to stop pending plans too, not just new ones. The command
|
|
517
|
+
* execution opt-in covers rule rounds only — the same line
|
|
518
|
+
* RemediationExecutionRunner.checkProjectGates draws — and is keyed
|
|
519
|
+
* on the round, never on the plan's step types: a rule's
|
|
520
|
+
* all-kubectl plan still needs it. A cluster round's consent is the
|
|
521
|
+
* cluster's own, re-checked per kubectl command below.
|
|
378
522
|
*/
|
|
379
523
|
const project: Project | null = await ProjectService.findOneById({
|
|
380
524
|
id: suggestion.projectId,
|
|
@@ -390,11 +534,19 @@ router.post(
|
|
|
390
534
|
if (
|
|
391
535
|
!project ||
|
|
392
536
|
project.enableAi === false ||
|
|
393
|
-
project.enableAutoRemediation === false
|
|
537
|
+
project.enableAutoRemediation === false
|
|
538
|
+
) {
|
|
539
|
+
throw new BadDataException(
|
|
540
|
+
"AI or auto-remediation is disabled for this project, so this plan cannot be run. Re-enable it in Project Settings → AI Features, or dismiss the suggestion.",
|
|
541
|
+
);
|
|
542
|
+
}
|
|
543
|
+
|
|
544
|
+
if (
|
|
545
|
+
!isClusterRemediationRound(suggestion) &&
|
|
394
546
|
project.enableAiCommandExecution !== true
|
|
395
547
|
) {
|
|
396
548
|
throw new BadDataException(
|
|
397
|
-
"AI command execution is disabled for this project, so this plan cannot be run. Re-enable it in Project Settings → AI, or dismiss the suggestion.",
|
|
549
|
+
"AI command execution is disabled for this project, so this plan cannot be run. Re-enable it in Project Settings → AI Features, or dismiss the suggestion.",
|
|
398
550
|
);
|
|
399
551
|
}
|
|
400
552
|
|
|
@@ -421,7 +573,36 @@ router.post(
|
|
|
421
573
|
),
|
|
422
574
|
);
|
|
423
575
|
|
|
576
|
+
const statusByClusterId: ClusterStatusCache = new Map<
|
|
577
|
+
string,
|
|
578
|
+
KubernetesClusterAiAccessStatus | null
|
|
579
|
+
>();
|
|
580
|
+
|
|
424
581
|
for (const runnerId of runnerIds) {
|
|
582
|
+
/*
|
|
583
|
+
* A kubectl command composed for a cluster's Kubernetes AI agent
|
|
584
|
+
* names the agent's id where a Runner id would be. The agent is
|
|
585
|
+
* not a Runner row — re-reading the Runner table would refuse
|
|
586
|
+
* every agent plan — so it is recognised from the cluster's
|
|
587
|
+
* status instead, and must be connected.
|
|
588
|
+
*/
|
|
589
|
+
const aiAgentStatus: KubernetesClusterAiAccessStatus | null =
|
|
590
|
+
await findAiAgentTargetStatus({
|
|
591
|
+
plan,
|
|
592
|
+
runnerId,
|
|
593
|
+
projectId: suggestion.projectId,
|
|
594
|
+
statusByClusterId,
|
|
595
|
+
});
|
|
596
|
+
|
|
597
|
+
if (aiAgentStatus) {
|
|
598
|
+
assertAiAgentCanRunPlan({
|
|
599
|
+
plan,
|
|
600
|
+
runnerId,
|
|
601
|
+
status: aiAgentStatus,
|
|
602
|
+
});
|
|
603
|
+
continue;
|
|
604
|
+
}
|
|
605
|
+
|
|
425
606
|
const runner: Runner | null = await RunnerService.findOneBy({
|
|
426
607
|
query: {
|
|
427
608
|
_id: runnerId,
|
|
@@ -454,6 +635,7 @@ router.post(
|
|
|
454
635
|
await assertKubectlCommandsStillRunnable({
|
|
455
636
|
plan,
|
|
456
637
|
projectId: suggestion.projectId,
|
|
638
|
+
statusByClusterId,
|
|
457
639
|
});
|
|
458
640
|
|
|
459
641
|
const claimedPlan: number =
|