@oneuptime/common 14.0.8 → 14.0.10
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/AutoRemediationSuggestion.ts +60 -0
- package/Models/DatabaseModels/CephCluster.ts +213 -0
- package/Models/DatabaseModels/DatabaseServer.ts +213 -0
- package/Models/DatabaseModels/DockerHost.ts +213 -0
- package/Models/DatabaseModels/DockerSwarmCluster.ts +213 -0
- package/Models/DatabaseModels/GlobalConfig.ts +1 -1
- package/Models/DatabaseModels/Host.ts +213 -0
- package/Models/DatabaseModels/Index.ts +4 -0
- package/Models/DatabaseModels/KubernetesAiAgent.ts +364 -0
- package/Models/DatabaseModels/KubernetesCluster.ts +3 -3
- package/Models/DatabaseModels/PodmanHost.ts +213 -0
- package/Models/DatabaseModels/Project.ts +55 -5
- package/Models/DatabaseModels/ProxmoxCluster.ts +213 -0
- package/Models/DatabaseModels/ProxmoxResource.ts +49 -1
- package/Models/DatabaseModels/ResourceAiAgent.ts +419 -0
- package/Models/DatabaseModels/RunnerJob.ts +219 -0
- package/Models/DatabaseModels/TeamComplianceSetting.ts +143 -2
- package/Models/DatabaseModels/VMwareVCenter.ts +213 -0
- 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 +598 -25
- package/Server/API/KubernetesClusterAiAccessAPI.ts +623 -21
- package/Server/API/MicrosoftTeamsAPI.ts +93 -14
- package/Server/API/ProxmoxResourceAPI.ts +244 -14
- package/Server/API/ResourceAiAccessAPI.ts +1669 -0
- 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/1796300000000-AddResourceAiAgents.ts +423 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +8 -0
- package/Server/Infrastructure/Semaphore.ts +22 -0
- package/Server/Middleware/TelemetryIngest.ts +51 -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/AnalyticsDatabaseService.ts +45 -1
- package/Server/Services/AutoRemediationRuleEngineService.ts +940 -112
- package/Server/Services/AutoRemediationRuleService.ts +1 -1
- package/Server/Services/CephClusterService.ts +109 -1
- package/Server/Services/DatabaseServerService.ts +116 -1
- package/Server/Services/DockerHostService.ts +109 -1
- package/Server/Services/DockerSwarmClusterService.ts +113 -1
- package/Server/Services/HostService.ts +126 -4
- 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/MetricRecordingRuleService.ts +47 -0
- package/Server/Services/PodmanHostService.ts +109 -1
- package/Server/Services/ProjectService.ts +32 -0
- package/Server/Services/ProxmoxClusterService.ts +110 -1
- package/Server/Services/ProxmoxResourceService.ts +322 -5
- package/Server/Services/ResourceAiAccessService.ts +1439 -0
- package/Server/Services/ResourceAiAgentJobService.ts +202 -0
- package/Server/Services/ResourceAiAgentService.ts +2432 -0
- package/Server/Services/RunnerJobService.ts +852 -108
- 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/Services/TelemetryUsageBillingService.ts +28 -0
- package/Server/Services/TraceRecordingRuleService.ts +33 -0
- package/Server/Services/VMwareVCenterService.ts +110 -1
- 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 +1475 -51
- package/Server/Utils/AI/Remediation/RemediationExecutionRunner.ts +1000 -43
- package/Server/Utils/AI/Remediation/RemediationPlanRunner.ts +25 -1
- package/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.ts +577 -0
- package/Server/Utils/AI/ResourceAccess/ResourceAccessContext.ts +271 -0
- package/Server/Utils/AI/ResourceAccess/ResourceAccessToolNames.ts +45 -0
- package/Server/Utils/AI/ResourceAccess/ResourceAiAccessSettings.ts +964 -0
- package/Server/Utils/AI/ResourceAccess/ResourceAiDeleteCleanup.ts +333 -0
- package/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.ts +873 -0
- package/Server/Utils/AI/SRE/AIInvestigationEngine.ts +120 -7
- package/Server/Utils/AI/SRE/AlertInvestigationRunner.ts +72 -5
- package/Server/Utils/AI/SRE/IncidentInvestigationRunner.ts +72 -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 +402 -14
- package/Server/Utils/AutoRemediation/RemediationVerifier.ts +35 -2
- package/Server/Utils/Database/ProjectScopedReferenceValidator.ts +9 -1
- package/Server/Utils/SessionReplay/SessionReplayBudgetMetrics.ts +920 -0
- package/Server/Utils/SessionReplay/SessionReplayUsage.ts +84 -6
- 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/Actions/Alert.ts +35 -15
- package/Server/Utils/Workspace/MicrosoftTeams/Actions/AlertEpisode.ts +33 -15
- package/Server/Utils/Workspace/MicrosoftTeams/Actions/Auth.ts +21 -1
- package/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.ts +298 -224
- package/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.ts +35 -15
- package/Server/Utils/Workspace/MicrosoftTeams/Actions/ScheduledMaintenance.ts +389 -175
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +1073 -213
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsActivityDeduplicator.ts +163 -0
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCardChoices.ts +396 -0
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateCommands.ts +418 -0
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsMessageSize.ts +152 -0
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsReplies.ts +251 -0
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsTimezone.ts +214 -0
- 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 +184 -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/DatabaseDocumentationMarkdown.test.ts +18 -6
- 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/InvestigationInfrastructureTools.test.tsx +506 -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/RemediationSuggestionCardDescription.test.tsx +209 -0
- package/Tests/App/Dashboard/RemediationSuggestionCardResource.test.tsx +317 -0
- package/Tests/App/Dashboard/ResourceAiAccessSettingsUtil.test.ts +921 -0
- package/Tests/App/Dashboard/ResourceAiAgentInstall.test.ts +860 -0
- package/Tests/App/Dashboard/ResourceAiAgentPage.test.tsx +1721 -0
- package/Tests/App/Dashboard/ResourceAiAgentStatus.test.ts +1002 -0
- package/Tests/App/Dashboard/ResourceAiInsightsPage.test.tsx +931 -0
- package/Tests/App/Dashboard/ResourceAiNavigation.test.tsx +575 -0
- package/Tests/App/Dashboard/RowActionPlacementOverrides.test.tsx +865 -0
- package/Tests/App/Dashboard/RumOverviewTimeRangeZoom.test.tsx +877 -0
- package/Tests/App/Dashboard/RunbookStepTypeMaps.test.ts +38 -7
- 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/DatabaseServerModels.test.ts +33 -1
- package/Tests/Models/DatabaseModels/KubernetesAiAgentModel.test.ts +295 -0
- package/Tests/Models/DatabaseModels/ResourceAiAccessColumns.test.ts +738 -0
- package/Tests/Models/DatabaseModels/ResourceAiAgentModel.test.ts +842 -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/AutoRemediationApproveResourceRound.test.ts +835 -0
- 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/API/ResourceAiAccessAPI.test.ts +2730 -0
- package/Tests/Server/Infrastructure/GlobalCache.test.ts +195 -0
- package/Tests/Server/Infrastructure/Postgres/AddDatabaseServerTablesMigration.test.ts +60 -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/AddResourceAiAgentsMigration.test.ts +659 -0
- package/Tests/Server/Infrastructure/Postgres/AddTeamComplianceRuleScopeMigration.test.ts +622 -0
- package/Tests/Server/Infrastructure/SemaphoreMutex.test.ts +31 -0
- package/Tests/Server/Middleware/TelemetryIngestBrowserKey.test.ts +119 -4
- package/Tests/Server/Middleware/TelemetryIngestKubernetesAgentRunnerPinnedKey.test.ts +196 -2
- package/Tests/Server/Middleware/TelemetryIngestKubernetesAgentRunnerRateLimit.test.ts +123 -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/AutoRemediationResourceRuleEngine.test.ts +1279 -0
- package/Tests/Server/Services/AutoRemediationRuleCommandRunners.test.ts +2 -1
- package/Tests/Server/Services/DatabaseServerService.test.ts +55 -0
- package/Tests/Server/Services/GroupTelemetryUsageExcludeNames.test.ts +299 -0
- package/Tests/Server/Services/HostServiceFindOrCreateMemo.test.ts +44 -0
- 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/MonitorProbeServiceIntervalScheduling.test.ts +45 -6
- 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/RecordingRuleReservedMetricName.test.ts +171 -0
- package/Tests/Server/Services/ResourceAiAccessChangeAuthorization.test.ts +256 -0
- package/Tests/Server/Services/ResourceAiAccessService.test.ts +1373 -0
- package/Tests/Server/Services/ResourceAiAgentJobService.test.ts +375 -0
- package/Tests/Server/Services/ResourceAiAgentServiceHelpers.test.ts +1114 -0
- package/Tests/Server/Services/ResourceAiAgentServiceLifecycle.test.ts +1050 -0
- package/Tests/Server/Services/ResourceAiAgentServiceRegister.test.ts +2251 -0
- package/Tests/Server/Services/ResourceAiSettingsCreate.test.ts +373 -0
- package/Tests/Server/Services/ResourceAiSettingsPermission.test.ts +1042 -0
- package/Tests/Server/Services/ResourceServiceDeleteCleansUpAi.test.ts +319 -0
- package/Tests/Server/Services/RunnerJobEnqueueKubectl.test.ts +153 -15
- package/Tests/Server/Services/RunnerJobEnqueueKubectlAiAgent.test.ts +620 -0
- package/Tests/Server/Services/RunnerJobEnqueueResourceCommand.test.ts +986 -0
- package/Tests/Server/Services/RunnerJobKubectlWriteScope.test.ts +170 -3
- package/Tests/Server/Services/RunnerJobResourceCommandLane.test.ts +211 -0
- package/Tests/Server/Services/RunnerJobResourceCommandTimeoutAndRedaction.test.ts +352 -0
- 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/Services/TelemetryUsageBillingSloExclusion.test.ts +218 -0
- package/Tests/Server/TestingUtils/Services/FakeRunnerJobCount.ts +145 -0
- 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/InvestigationInfrastructureAccessWiring.test.ts +453 -0
- package/Tests/Server/Utils/AI/InvestigationInfrastructureReport.test.ts +721 -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/RemediationCommandTools.test.ts +94 -1
- 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/RemediationCommandToolsResource.test.ts +1530 -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/RemediationExecutionRunnerResourceMode.test.ts +1249 -0
- package/Tests/Server/Utils/AI/RemediationKubectlCopyParity.test.ts +2 -0
- package/Tests/Server/Utils/AI/RemediationPlanRunner.test.ts +117 -0
- package/Tests/Server/Utils/AI/RemediationResourceCopyParity.test.ts +463 -0
- package/Tests/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.test.ts +722 -0
- package/Tests/Server/Utils/AI/ResourceAccess/ResourceAccessContext.test.ts +266 -0
- package/Tests/Server/Utils/AI/ResourceAccess/ResourceAiAccessSettings.test.ts +1220 -0
- package/Tests/Server/Utils/AI/ResourceAccess/ResourceAiDeleteCleanup.test.ts +569 -0
- package/Tests/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.test.ts +830 -0
- package/Tests/Server/Utils/AutoRemediation/CommandPlanExecutor.test.ts +2 -0
- package/Tests/Server/Utils/AutoRemediation/CommandPlanExecutorResource.test.ts +717 -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/AutoRemediation/RemediationVerifierResourceFollowUp.test.ts +338 -0
- package/Tests/Server/Utils/Monitor/Criteria/SessionReplayBudgetTemplateCriteria.test.ts +422 -0
- package/Tests/Server/Utils/SessionReplay/SessionReplayBudgetMetrics.test.ts +1647 -0
- package/Tests/Server/Utils/SessionReplay/SessionReplayUsage.test.ts +143 -1
- 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 +75 -3
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsAccountNotLinked.test.ts +1093 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsActivityDeduplicator.test.ts +1049 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCardChoices.test.ts +1676 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateCards.test.ts +2884 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateCommands.test.ts +2490 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateSubmit.test.ts +2293 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateSubmitServerTimezone.test.ts +386 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsMessageSize.test.ts +1477 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsReplies.test.ts +1967 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsStripHtmlTags.test.ts +92 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsSubmittedFormRemoval.test.ts +1819 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsTimezone.test.ts +1033 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsTimezoneServerZone.test.ts +610 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsBotMessageHandling.test.ts +2610 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsChats.test.ts +25 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsCreateCommandsEndToEnd.test.ts +4672 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsGroupChatNames.test.ts +3119 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsGroupChatNamesPostgres.test.ts +1721 -0
- package/Tests/Server/Utils/Workspace/WorkspaceCreateProjectReferences.test.ts +190 -65
- package/Tests/Types/AutoRemediation/AiRemediationCommandPlan.test.ts +10 -4
- package/Tests/Types/AutoRemediation/AiRemediationCommandPlanResourceCommand.test.ts +305 -0
- package/Tests/Types/Kubernetes/KubernetesAgentChartAiAccess.test.ts +581 -113
- package/Tests/Types/Kubernetes/KubernetesAiAgentAccessContract.test.ts +510 -0
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCatalog.test.ts +277 -13
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationUtil.test.ts +113 -0
- package/Tests/Types/Monitor/RumAlertTemplates.test.ts +773 -2
- package/Tests/Types/ResourceAiAgent/AiResourceType.test.ts +419 -0
- package/Tests/Types/ResourceAiAgent/ResourceAiAccess.test.ts +517 -0
- package/Tests/Types/Runbook/RunbookStepType.test.ts +147 -8
- 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/RecordingHealthDashboard.test.tsx +769 -1
- 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/AiRemediation/Resource/CephCommandPolicy.test.ts +1653 -0
- package/Tests/Utils/AiRemediation/Resource/CephOutputRedaction.test.ts +204 -0
- package/Tests/Utils/AiRemediation/Resource/DatabaseCommandPolicy.test.ts +1077 -0
- package/Tests/Utils/AiRemediation/Resource/DatabaseDiagnosticCatalog.test.ts +558 -0
- package/Tests/Utils/AiRemediation/Resource/DatabaseQueryRedactor.test.ts +834 -0
- package/Tests/Utils/AiRemediation/Resource/DockerCliGrammar.test.ts +747 -0
- package/Tests/Utils/AiRemediation/Resource/DockerEngineCommandPolicy.test.ts +1259 -0
- package/Tests/Utils/AiRemediation/Resource/DockerOutputRedaction.test.ts +386 -0
- package/Tests/Utils/AiRemediation/Resource/DockerSwarmCommandPolicy.test.ts +782 -0
- package/Tests/Utils/AiRemediation/Resource/GovcCommandPolicy.test.ts +2259 -0
- package/Tests/Utils/AiRemediation/Resource/HostCommandPolicy.test.ts +2019 -0
- package/Tests/Utils/AiRemediation/Resource/ProxmoxCommandPolicy.test.ts +2497 -0
- package/Tests/Utils/AiRemediation/Resource/ResourceCommandPolicy.test.ts +1305 -0
- package/Tests/Utils/AiRemediation/Resource/ResourceCommandPolicyCore.test.ts +585 -0
- package/Tests/Utils/AiRemediation/Resource/ResourceOutputRedactor.test.ts +334 -0
- package/Tests/Utils/AiRemediation/Resource/ResourceOutputRedactorCopyParity.test.ts +98 -0
- package/Tests/Utils/AiRemediation/Resource/ResourcePolicyImportClosure.test.ts +391 -0
- package/Tests/Utils/AiRemediation/ResourceAiAgentPolicyCopyParity.test.ts +497 -0
- package/Tests/Utils/Dashboard/DashboardTimeRangeZoom.test.ts +104 -1
- package/Tests/Utils/SessionReplay/SessionReplayBudgetMetricType.test.ts +383 -0
- package/Types/AI/AIRunType.ts +9 -4
- package/Types/AI/InvestigationNotStartedReason.ts +6 -0
- package/Types/AI/ResourceAiAccessApi.ts +140 -0
- package/Types/AI/ResourceAiAccessPermissions.ts +126 -0
- package/Types/AutoRemediation/AiRemediationCommandPlan.ts +197 -18
- 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/Monitor/Recommendation/MonitorRecommendationCatalog.ts +55 -22
- package/Types/Monitor/Recommendation/MonitorRecommendationTypes.ts +35 -3
- package/Types/Monitor/RumAlertTemplates.ts +351 -4
- package/Types/ResourceAiAgent/AiResourceType.ts +310 -0
- package/Types/ResourceAiAgent/ResourceAiAccess.ts +574 -0
- package/Types/Rum/SessionReplayBudgetMetricType.ts +47 -0
- package/Types/Runbook/RunbookStepType.ts +29 -0
- 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 +40 -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/AI/InvestigationReport.ts +121 -15
- package/Utils/AiRemediation/CommandPolicy.ts +1 -1
- package/Utils/AiRemediation/KubectlPolicy.ts +1 -1
- package/Utils/AiRemediation/Resource/CephCommandPolicy.ts +1936 -0
- package/Utils/AiRemediation/Resource/DatabaseCommandPolicy.ts +166 -0
- package/Utils/AiRemediation/Resource/DatabaseDiagnosticCatalog.ts +1532 -0
- package/Utils/AiRemediation/Resource/DatabaseQueryRedactor.ts +1394 -0
- package/Utils/AiRemediation/Resource/DockerCliGrammar.ts +1839 -0
- package/Utils/AiRemediation/Resource/DockerEngineCommandPolicy.ts +490 -0
- package/Utils/AiRemediation/Resource/DockerSwarmCommandPolicy.ts +687 -0
- package/Utils/AiRemediation/Resource/GovcCommandPolicy.ts +2096 -0
- package/Utils/AiRemediation/Resource/HostCommandPolicy.ts +2982 -0
- package/Utils/AiRemediation/Resource/ProxmoxCommandPolicy.ts +1679 -0
- package/Utils/AiRemediation/Resource/ResourceCommandPolicy.ts +851 -0
- package/Utils/AiRemediation/Resource/ResourceCommandPolicyCore.ts +593 -0
- package/Utils/AiRemediation/Resource/ResourceOutputRedactor.ts +2812 -0
- package/Utils/Dashboard/DashboardTimeRangeZoom.ts +46 -2
- package/Utils/SessionReplay/SessionReplayBudgetMetricType.ts +184 -0
- package/build/dist/Models/DatabaseModels/AutoRemediationSuggestion.js +62 -0
- package/build/dist/Models/DatabaseModels/AutoRemediationSuggestion.js.map +1 -1
- package/build/dist/Models/DatabaseModels/CephCluster.js +219 -0
- package/build/dist/Models/DatabaseModels/CephCluster.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DatabaseServer.js +219 -0
- package/build/dist/Models/DatabaseModels/DatabaseServer.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DockerHost.js +219 -0
- package/build/dist/Models/DatabaseModels/DockerHost.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DockerSwarmCluster.js +219 -0
- package/build/dist/Models/DatabaseModels/DockerSwarmCluster.js.map +1 -1
- package/build/dist/Models/DatabaseModels/GlobalConfig.js +1 -1
- package/build/dist/Models/DatabaseModels/GlobalConfig.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Host.js +219 -0
- package/build/dist/Models/DatabaseModels/Host.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +4 -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/PodmanHost.js +219 -0
- package/build/dist/Models/DatabaseModels/PodmanHost.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/ProxmoxCluster.js +219 -0
- package/build/dist/Models/DatabaseModels/ProxmoxCluster.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/ResourceAiAgent.js +439 -0
- package/build/dist/Models/DatabaseModels/ResourceAiAgent.js.map +1 -0
- package/build/dist/Models/DatabaseModels/RunnerJob.js +219 -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/VMwareVCenter.js +219 -0
- package/build/dist/Models/DatabaseModels/VMwareVCenter.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 +374 -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/API/ResourceAiAccessAPI.js +1119 -0
- package/build/dist/Server/API/ResourceAiAccessAPI.js.map +1 -0
- 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/1796300000000-AddResourceAiAgents.js +168 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796300000000-AddResourceAiAgents.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +8 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Infrastructure/Semaphore.js +6 -0
- package/build/dist/Server/Infrastructure/Semaphore.js.map +1 -1
- package/build/dist/Server/Middleware/TelemetryIngest.js +41 -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/AnalyticsDatabaseService.js +26 -1
- package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
- package/build/dist/Server/Services/AutoRemediationRuleEngineService.js +601 -3
- package/build/dist/Server/Services/AutoRemediationRuleEngineService.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/CephClusterService.js +104 -0
- package/build/dist/Server/Services/CephClusterService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseServerService.js +99 -0
- package/build/dist/Server/Services/DatabaseServerService.js.map +1 -1
- package/build/dist/Server/Services/DockerHostService.js +104 -0
- package/build/dist/Server/Services/DockerHostService.js.map +1 -1
- package/build/dist/Server/Services/DockerSwarmClusterService.js +104 -0
- package/build/dist/Server/Services/DockerSwarmClusterService.js.map +1 -1
- package/build/dist/Server/Services/HostService.js +114 -2
- package/build/dist/Server/Services/HostService.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/MetricRecordingRuleService.js +46 -0
- package/build/dist/Server/Services/MetricRecordingRuleService.js.map +1 -1
- package/build/dist/Server/Services/PodmanHostService.js +104 -0
- package/build/dist/Server/Services/PodmanHostService.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/ProxmoxClusterService.js +104 -0
- package/build/dist/Server/Services/ProxmoxClusterService.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/ResourceAiAccessService.js +1028 -0
- package/build/dist/Server/Services/ResourceAiAccessService.js.map +1 -0
- package/build/dist/Server/Services/ResourceAiAgentJobService.js +173 -0
- package/build/dist/Server/Services/ResourceAiAgentJobService.js.map +1 -0
- package/build/dist/Server/Services/ResourceAiAgentService.js +1687 -0
- package/build/dist/Server/Services/ResourceAiAgentService.js.map +1 -0
- package/build/dist/Server/Services/RunnerJobService.js +522 -97
- 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/Services/TelemetryUsageBillingService.js +26 -0
- package/build/dist/Server/Services/TelemetryUsageBillingService.js.map +1 -1
- package/build/dist/Server/Services/TraceRecordingRuleService.js +37 -0
- package/build/dist/Server/Services/TraceRecordingRuleService.js.map +1 -1
- package/build/dist/Server/Services/VMwareVCenterService.js +104 -0
- package/build/dist/Server/Services/VMwareVCenterService.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 +1056 -43
- package/build/dist/Server/Utils/AI/Remediation/RemediationCommandTools.js.map +1 -1
- package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js +683 -42
- package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/Remediation/RemediationPlanRunner.js +21 -1
- package/build/dist/Server/Utils/AI/Remediation/RemediationPlanRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.js +330 -0
- package/build/dist/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.js.map +1 -0
- package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAccessContext.js +160 -0
- package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAccessContext.js.map +1 -0
- package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAccessToolNames.js +33 -0
- package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAccessToolNames.js.map +1 -0
- package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAiAccessSettings.js +640 -0
- package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAiAccessSettings.js.map +1 -0
- package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAiDeleteCleanup.js +226 -0
- package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAiDeleteCleanup.js.map +1 -0
- package/build/dist/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.js +600 -0
- package/build/dist/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js +89 -9
- package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js +55 -4
- package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js +55 -4
- package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.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 +294 -15
- package/build/dist/Server/Utils/AutoRemediation/CommandPlanExecutor.js.map +1 -1
- package/build/dist/Server/Utils/AutoRemediation/RemediationVerifier.js +29 -1
- package/build/dist/Server/Utils/AutoRemediation/RemediationVerifier.js.map +1 -1
- package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js +9 -1
- package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js.map +1 -1
- package/build/dist/Server/Utils/SessionReplay/SessionReplayBudgetMetrics.js +627 -0
- package/build/dist/Server/Utils/SessionReplay/SessionReplayBudgetMetrics.js.map +1 -0
- package/build/dist/Server/Utils/SessionReplay/SessionReplayUsage.js +60 -5
- package/build/dist/Server/Utils/SessionReplay/SessionReplayUsage.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/Actions/Alert.js +19 -15
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Alert.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/AlertEpisode.js +19 -15
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/AlertEpisode.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Auth.js +17 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Auth.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.js +183 -209
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.js +19 -15
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/ScheduledMaintenance.js +233 -167
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/ScheduledMaintenance.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +768 -152
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsActivityDeduplicator.js +129 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsActivityDeduplicator.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCardChoices.js +266 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCardChoices.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateCommands.js +258 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateCommands.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsMessageSize.js +104 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsMessageSize.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsReplies.js +183 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsReplies.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsTimezone.js +123 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsTimezone.js.map +1 -0
- package/build/dist/Types/AI/AIRunType.js +9 -4
- package/build/dist/Types/AI/AIRunType.js.map +1 -1
- package/build/dist/Types/AI/ResourceAiAccessApi.js +30 -0
- package/build/dist/Types/AI/ResourceAiAccessApi.js.map +1 -0
- package/build/dist/Types/AI/ResourceAiAccessPermissions.js +98 -0
- package/build/dist/Types/AI/ResourceAiAccessPermissions.js.map +1 -0
- package/build/dist/Types/AutoRemediation/AiRemediationCommandPlan.js +126 -45
- 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/Monitor/Recommendation/MonitorRecommendationCatalog.js +47 -21
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js +5 -0
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js.map +1 -1
- package/build/dist/Types/Monitor/RumAlertTemplates.js +199 -3
- package/build/dist/Types/Monitor/RumAlertTemplates.js.map +1 -1
- package/build/dist/Types/ResourceAiAgent/AiResourceType.js +242 -0
- package/build/dist/Types/ResourceAiAgent/AiResourceType.js.map +1 -0
- package/build/dist/Types/ResourceAiAgent/ResourceAiAccess.js +275 -0
- package/build/dist/Types/ResourceAiAgent/ResourceAiAccess.js.map +1 -0
- package/build/dist/Types/Rum/SessionReplayBudgetMetricType.js +45 -0
- package/build/dist/Types/Rum/SessionReplayBudgetMetricType.js.map +1 -0
- package/build/dist/Types/Runbook/RunbookStepType.js +27 -0
- package/build/dist/Types/Runbook/RunbookStepType.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 +36 -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/AI/InvestigationReport.js +71 -11
- package/build/dist/Utils/AI/InvestigationReport.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/AiRemediation/Resource/CephCommandPolicy.js +1462 -0
- package/build/dist/Utils/AiRemediation/Resource/CephCommandPolicy.js.map +1 -0
- package/build/dist/Utils/AiRemediation/Resource/DatabaseCommandPolicy.js +122 -0
- package/build/dist/Utils/AiRemediation/Resource/DatabaseCommandPolicy.js.map +1 -0
- package/build/dist/Utils/AiRemediation/Resource/DatabaseDiagnosticCatalog.js +1139 -0
- package/build/dist/Utils/AiRemediation/Resource/DatabaseDiagnosticCatalog.js.map +1 -0
- package/build/dist/Utils/AiRemediation/Resource/DatabaseQueryRedactor.js +1060 -0
- package/build/dist/Utils/AiRemediation/Resource/DatabaseQueryRedactor.js.map +1 -0
- package/build/dist/Utils/AiRemediation/Resource/DockerCliGrammar.js +1301 -0
- package/build/dist/Utils/AiRemediation/Resource/DockerCliGrammar.js.map +1 -0
- package/build/dist/Utils/AiRemediation/Resource/DockerEngineCommandPolicy.js +370 -0
- package/build/dist/Utils/AiRemediation/Resource/DockerEngineCommandPolicy.js.map +1 -0
- package/build/dist/Utils/AiRemediation/Resource/DockerSwarmCommandPolicy.js +498 -0
- package/build/dist/Utils/AiRemediation/Resource/DockerSwarmCommandPolicy.js.map +1 -0
- package/build/dist/Utils/AiRemediation/Resource/GovcCommandPolicy.js +1565 -0
- package/build/dist/Utils/AiRemediation/Resource/GovcCommandPolicy.js.map +1 -0
- package/build/dist/Utils/AiRemediation/Resource/HostCommandPolicy.js +2206 -0
- package/build/dist/Utils/AiRemediation/Resource/HostCommandPolicy.js.map +1 -0
- package/build/dist/Utils/AiRemediation/Resource/ProxmoxCommandPolicy.js +1129 -0
- package/build/dist/Utils/AiRemediation/Resource/ProxmoxCommandPolicy.js.map +1 -0
- package/build/dist/Utils/AiRemediation/Resource/ResourceCommandPolicy.js +565 -0
- package/build/dist/Utils/AiRemediation/Resource/ResourceCommandPolicy.js.map +1 -0
- package/build/dist/Utils/AiRemediation/Resource/ResourceCommandPolicyCore.js +408 -0
- package/build/dist/Utils/AiRemediation/Resource/ResourceCommandPolicyCore.js.map +1 -0
- package/build/dist/Utils/AiRemediation/Resource/ResourceOutputRedactor.js +1910 -0
- package/build/dist/Utils/AiRemediation/Resource/ResourceOutputRedactor.js.map +1 -0
- package/build/dist/Utils/Dashboard/DashboardTimeRangeZoom.js +27 -1
- package/build/dist/Utils/Dashboard/DashboardTimeRangeZoom.js.map +1 -1
- package/build/dist/Utils/SessionReplay/SessionReplayBudgetMetricType.js +160 -0
- package/build/dist/Utils/SessionReplay/SessionReplayBudgetMetricType.js.map +1 -0
- package/package.json +1 -1
|
@@ -20,13 +20,19 @@ import KubectlPolicy from "../../Utils/AiRemediation/KubectlPolicy";
|
|
|
20
20
|
import KubectlOutputRedactor from "../../Utils/AiRemediation/KubectlOutputRedactor";
|
|
21
21
|
import KubectlWriteScope from "../../Utils/AiRemediation/KubectlWriteScope";
|
|
22
22
|
import ToolResultSerializer from "../Utils/AI/Toolbox/Serializer";
|
|
23
|
-
import { KUBECTL_ALLOW_NODE_OPERATIONS_ENV, KUBECTL_ALLOW_WRITES_ENV, KUBECTL_WRITE_NAMESPACES_ENV, KubectlCommandTier, KubernetesAiRemediationMode, isInClusterPostureForCluster, parseKubernetesRunnerPosture, } from "../../Types/Kubernetes/KubernetesClusterAiAccess";
|
|
23
|
+
import { KUBECTL_ALLOW_NODE_OPERATIONS_ENV, KUBECTL_ALLOW_WRITES_ENV, KUBECTL_WRITE_NAMESPACES_ENV, KubectlCommandTier, KubernetesAiRemediationMode, isInClusterPostureForCluster, parseKubernetesAgentPosture, parseKubernetesRunnerPosture, } from "../../Types/Kubernetes/KubernetesClusterAiAccess";
|
|
24
24
|
import RunbookCredentialType from "../../Types/Runbook/RunbookCredentialType";
|
|
25
25
|
import AIRunType from "../../Types/AI/AIRunType";
|
|
26
26
|
import AIRunService from "./AIRunService";
|
|
27
|
+
import KubernetesClusterAiAccessService, { getKubernetesAiAccessTargetId, } from "./KubernetesClusterAiAccessService";
|
|
27
28
|
import KubernetesClusterService from "./KubernetesClusterService";
|
|
28
29
|
import RunbookCredentialService from "./RunbookCredentialService";
|
|
29
30
|
import RunnerService, { Service as RunnerServiceClass } from "./RunnerService";
|
|
31
|
+
import ResourceAiAccessService, { describeResourceNoun, getResourceAiAgentInstallNextStep, getResourceAiAgentPage, } from "./ResourceAiAccessService";
|
|
32
|
+
import { AI_RESOURCE_TYPE_INFO, isAiResourceType, } from "../../Types/ResourceAiAgent/AiResourceType";
|
|
33
|
+
import { ResourceAiRemediationMode, ResourceCommandTier, parseResourceAiAgentPosture, } from "../../Types/ResourceAiAgent/ResourceAiAccess";
|
|
34
|
+
import ResourceCommandPolicy from "../../Utils/AiRemediation/Resource/ResourceCommandPolicy";
|
|
35
|
+
import { redactResourceCommandOutput } from "../../Utils/AiRemediation/Resource/ResourceOutputRedactor";
|
|
30
36
|
import QueryHelper from "../Types/Database/QueryHelper";
|
|
31
37
|
/*
|
|
32
38
|
* The cluster remediation modes in which a kubectl job for remediation may
|
|
@@ -56,6 +62,31 @@ export const MAX_AI_COMMAND_JOBS_PER_PROJECT_PER_HOUR = 30;
|
|
|
56
62
|
* ceiling, because every call spends Runner time and LLM budget.
|
|
57
63
|
*/
|
|
58
64
|
export const MAX_AI_INVESTIGATION_COMMAND_JOBS_PER_PROJECT_PER_HOUR = 240;
|
|
65
|
+
/*
|
|
66
|
+
* The same two brakes for commands on infrastructure resources (Docker,
|
|
67
|
+
* Podman, Swarm, Proxmox, VMware, Ceph, database servers, hosts), counted
|
|
68
|
+
* on their own ResourceCommand rows so a busy hour on one kind of
|
|
69
|
+
* infrastructure never starves the cluster lane, or the other way round.
|
|
70
|
+
*/
|
|
71
|
+
export const MAX_AI_INVESTIGATION_RESOURCE_COMMAND_JOBS_PER_PROJECT_PER_HOUR = 240;
|
|
72
|
+
export const MAX_AI_RESOURCE_COMMAND_JOBS_PER_PROJECT_PER_HOUR = 30;
|
|
73
|
+
/*
|
|
74
|
+
* A refusal of the resource command chokepoint. A BadDataException, so
|
|
75
|
+
* every caller that already handles the kubectl chokepoint's refusals
|
|
76
|
+
* handles this one the same way; `refusalCode` says which rule refused it.
|
|
77
|
+
*/
|
|
78
|
+
export class ResourceCommandEnqueueRefusedException extends BadDataException {
|
|
79
|
+
constructor(refusalCode, message) {
|
|
80
|
+
super(message);
|
|
81
|
+
this.refusalCode = refusalCode;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
// The resource modes in which a remediation command may be enqueued at all.
|
|
85
|
+
const ENABLED_RESOURCE_REMEDIATION_MODES = [
|
|
86
|
+
ResourceAiRemediationMode.RequireApproval,
|
|
87
|
+
ResourceAiRemediationMode.Automatic,
|
|
88
|
+
ResourceAiRemediationMode.BypassApproval,
|
|
89
|
+
];
|
|
59
90
|
import SortOrder from "../../Types/BaseDatabase/SortOrder";
|
|
60
91
|
import OneUptimeDate from "../../Types/Date";
|
|
61
92
|
import PostgresAppInstance from "../Infrastructure/PostgresDatabase";
|
|
@@ -133,6 +164,10 @@ function keepSurrogatePairOnly(match) {
|
|
|
133
164
|
: RUNNER_JOB_UNSTORABLE_CHARACTER_REPLACEMENT;
|
|
134
165
|
}
|
|
135
166
|
export function describeRunnerJobTimeout(data) {
|
|
167
|
+
if (data.stepType === RunbookStepType.ResourceCommand &&
|
|
168
|
+
AI_COMMAND_JOB_ORIGINS.includes(data.origin || RunnerJobOrigin.Runbook)) {
|
|
169
|
+
return describeResourceCommandTimeout(data);
|
|
170
|
+
}
|
|
136
171
|
const isAiKubectl = data.stepType === RunbookStepType.Kubectl &&
|
|
137
172
|
AI_COMMAND_JOB_ORIGINS.includes(data.origin || RunnerJobOrigin.Runbook);
|
|
138
173
|
if (!isAiKubectl) {
|
|
@@ -155,18 +190,49 @@ export function describeRunnerJobTimeout(data) {
|
|
|
155
190
|
const kind = data.kind === "overall" && data.wasClaimed === false
|
|
156
191
|
? "unclaimed"
|
|
157
192
|
: data.kind;
|
|
193
|
+
const executor = data.isForKubernetesAiAgent
|
|
194
|
+
? "The cluster's Kubernetes AI agent"
|
|
195
|
+
: "The cluster's Runner";
|
|
158
196
|
switch (kind) {
|
|
159
197
|
case "unclaimed":
|
|
160
|
-
return
|
|
198
|
+
return `${executor} did not pick up this kubectl command within ${describeSeconds(data.claimTimeoutInMs)} — it may be offline, restarting or busy with other work. Nothing was run on the cluster.`;
|
|
161
199
|
case "lease_expired":
|
|
162
|
-
return
|
|
200
|
+
return `${executor} stopped responding while this kubectl command was running — it may have restarted or lost its connection. What the command did is unknown.${checkFirst}`;
|
|
163
201
|
default:
|
|
164
|
-
return
|
|
202
|
+
return `${executor} did not report a result for this kubectl command in time — kubectl may have outlived its ${describeSeconds(data.executionTimeoutInMs)} timeout. What the command did is unknown.${checkFirst}`;
|
|
165
203
|
}
|
|
166
204
|
}
|
|
167
205
|
function describeSeconds(milliseconds) {
|
|
168
206
|
return `${Math.max(1, Math.round(milliseconds / 1000))}s`;
|
|
169
207
|
}
|
|
208
|
+
/*
|
|
209
|
+
* The same three reasons for a command on an infrastructure resource, run
|
|
210
|
+
* by that resource's AI agent: "nobody picked it up" (nothing ran) versus
|
|
211
|
+
* "it was picked up and then went silent" (what it did is unknown), naming
|
|
212
|
+
* the agent ("the Docker AI agent") and the resource ("the Docker host").
|
|
213
|
+
*/
|
|
214
|
+
function describeResourceCommandTimeout(data) {
|
|
215
|
+
const agentName = isAiResourceType(data.resourceType)
|
|
216
|
+
? AI_RESOURCE_TYPE_INFO[data.resourceType].agentDisplayName
|
|
217
|
+
: "resource's AI agent";
|
|
218
|
+
const noun = isAiResourceType(data.resourceType)
|
|
219
|
+
? describeResourceNoun(data.resourceType)
|
|
220
|
+
: "resource";
|
|
221
|
+
const checkFirst = data.origin === RunnerJobOrigin.AiRemediation
|
|
222
|
+
? ` Check the ${noun} before running a change again.`
|
|
223
|
+
: "";
|
|
224
|
+
const kind = data.kind === "overall" && data.wasClaimed === false
|
|
225
|
+
? "unclaimed"
|
|
226
|
+
: data.kind;
|
|
227
|
+
switch (kind) {
|
|
228
|
+
case "unclaimed":
|
|
229
|
+
return `The ${agentName} did not pick up the command in time (within ${describeSeconds(data.claimTimeoutInMs)}) — it may be offline, restarting or busy with other work. Nothing was run on the ${noun}.`;
|
|
230
|
+
case "lease_expired":
|
|
231
|
+
return `The ${agentName} stopped responding while this command was running — it may have restarted or lost its connection. What the command did is unknown.${checkFirst}`;
|
|
232
|
+
default:
|
|
233
|
+
return `The ${agentName} did not report a result for this command in time — the command may have outlived its ${describeSeconds(data.executionTimeoutInMs)} timeout. What the command did is unknown.${checkFirst}`;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
170
236
|
export class Service extends DatabaseService {
|
|
171
237
|
constructor() {
|
|
172
238
|
super(Model);
|
|
@@ -214,39 +280,63 @@ export class Service extends DatabaseService {
|
|
|
214
280
|
usesCredential: data.usesCredential,
|
|
215
281
|
});
|
|
216
282
|
return refusal
|
|
217
|
-
? Service.describeRunnerWriteScopeRefusal(refusal, Service.getRunnerWriteScopeSettings(data.
|
|
283
|
+
? Service.describeRunnerWriteScopeRefusal(refusal, Service.getRunnerWriteScopeSettings(data.executorKind ||
|
|
284
|
+
(data.usesCredential ? "credential_runner" : "legacy_runner")))
|
|
218
285
|
: null;
|
|
219
286
|
}
|
|
220
287
|
/*
|
|
221
|
-
* Where the target
|
|
222
|
-
*
|
|
223
|
-
*
|
|
224
|
-
*
|
|
225
|
-
*
|
|
226
|
-
*
|
|
227
|
-
*
|
|
228
|
-
*
|
|
288
|
+
* Where the target's write scope is set, in the words a refusal uses —
|
|
289
|
+
* three ways, by who runs the command:
|
|
290
|
+
*
|
|
291
|
+
* - the Kubernetes AI agent: the chart's aiAgent.remediation.* values;
|
|
292
|
+
* - the previous in-cluster Runner an older chart installed: its values
|
|
293
|
+
* are aiAccess.remediation.*, and the way to change them now is to
|
|
294
|
+
* upgrade the chart to the AI agent, which replaces the Runner;
|
|
295
|
+
* - a Runner that reaches the cluster through a Kubernetes credential: an
|
|
296
|
+
* ordinary Runner no chart configures, which reports what it was
|
|
297
|
+
* started with — ONEUPTIME_KUBECTL_WRITE_NAMESPACES and
|
|
298
|
+
* ONEUPTIME_KUBECTL_ALLOW_NODE_OPERATIONS on its own host — and picks
|
|
299
|
+
* up a change on restart.
|
|
229
300
|
*/
|
|
230
|
-
static getRunnerWriteScopeSettings(
|
|
231
|
-
if (
|
|
301
|
+
static getRunnerWriteScopeSettings(executorKind) {
|
|
302
|
+
if (executorKind === "credential_runner") {
|
|
232
303
|
return {
|
|
304
|
+
executor: "the cluster's Runner",
|
|
305
|
+
inClusterExecutor: "the cluster's in-cluster Runner",
|
|
306
|
+
executorShort: "the Runner",
|
|
233
307
|
nodeOperationsOff: `it was started with ${KUBECTL_ALLOW_NODE_OPERATIONS_ENV} (or ${KUBECTL_ALLOW_WRITES_ENV}) set to something other than true on its host`,
|
|
234
308
|
allowNodeOperations: `set ${KUBECTL_ALLOW_NODE_OPERATIONS_ENV}=true on that Runner's host and restart it`,
|
|
235
309
|
namespaces: `${KUBECTL_WRITE_NAMESPACES_ENV} on that Runner's host`,
|
|
236
310
|
addNamespace: `add it to ${KUBECTL_WRITE_NAMESPACES_ENV} on that Runner's host and restart it`,
|
|
237
311
|
};
|
|
238
312
|
}
|
|
313
|
+
if (executorKind === "ai_agent") {
|
|
314
|
+
return {
|
|
315
|
+
executor: "the cluster's Kubernetes AI agent",
|
|
316
|
+
inClusterExecutor: "the cluster's Kubernetes AI agent",
|
|
317
|
+
executorShort: "the AI agent",
|
|
318
|
+
nodeOperationsOff: `it was installed with aiAgent.remediation.nodeOperations=false (${KUBECTL_ALLOW_NODE_OPERATIONS_ENV})`,
|
|
319
|
+
allowNodeOperations: "upgrade the Kubernetes agent chart with --set aiAgent.remediation.nodeOperations=true",
|
|
320
|
+
namespaces: `aiAgent.remediation.namespaces on the Kubernetes agent chart, ${KUBECTL_WRITE_NAMESPACES_ENV}`,
|
|
321
|
+
addNamespace: "add it to aiAgent.remediation.namespaces and upgrade the Kubernetes agent chart",
|
|
322
|
+
};
|
|
323
|
+
}
|
|
239
324
|
return {
|
|
325
|
+
executor: "the cluster's Runner",
|
|
326
|
+
inClusterExecutor: "the cluster's in-cluster Runner",
|
|
327
|
+
executorShort: "the Runner",
|
|
240
328
|
nodeOperationsOff: `its Kubernetes agent was installed with aiAccess.remediation.nodeOperations=false (${KUBECTL_ALLOW_NODE_OPERATIONS_ENV})`,
|
|
241
|
-
allowNodeOperations: "upgrade the agent with --set
|
|
329
|
+
allowNodeOperations: "upgrade the Kubernetes agent chart to the Kubernetes AI agent (it replaces the in-cluster Runner) with --set aiAgent.remediation.nodeOperations=true",
|
|
242
330
|
namespaces: `aiAccess.remediation.namespaces on the Kubernetes agent chart, ${KUBECTL_WRITE_NAMESPACES_ENV}`,
|
|
243
|
-
addNamespace: "add it to
|
|
331
|
+
addNamespace: "upgrade the Kubernetes agent chart to the Kubernetes AI agent (it replaces the in-cluster Runner) and add it to aiAgent.remediation.namespaces",
|
|
244
332
|
};
|
|
245
333
|
}
|
|
246
334
|
// A write-scope refusal, worded for whoever enqueued the command.
|
|
247
335
|
static describeRunnerWriteScopeRefusal(refusal, settings) {
|
|
248
336
|
const command = `"${refusal.displayCommand}"`;
|
|
249
|
-
const wouldRefuse =
|
|
337
|
+
const wouldRefuse = `so ${settings.executorShort} would refuse it. It was not enqueued.`;
|
|
338
|
+
const executor = settings.executor;
|
|
339
|
+
const Executor = `${executor.charAt(0).toUpperCase()}${executor.slice(1)}`;
|
|
250
340
|
const scopeList = `${refusal.writeNamespaces
|
|
251
341
|
.map((allowed) => {
|
|
252
342
|
return `"${allowed}"`;
|
|
@@ -258,34 +348,34 @@ export class Service extends DatabaseService {
|
|
|
258
348
|
case "node_operations":
|
|
259
349
|
return `${refusal.uncertainty === null
|
|
260
350
|
? `${command} changes a node`
|
|
261
|
-
:
|
|
351
|
+
: `${Executor} cannot tell for certain whether ${command} changes a node (${refusal.uncertainty})`}, and ${executor} does not allow node operations (cordon, uncordon, drain, taint, or labelling, annotating or patching a Node): ${settings.nodeOperationsOff}, ${wouldRefuse}${fix} To let OneUptime AI change nodes, ${settings.allowNodeOperations}.`;
|
|
262
352
|
case "objects_uncertain":
|
|
263
353
|
case "namespace_uncertain":
|
|
264
|
-
return
|
|
354
|
+
return `${Executor} cannot tell for certain which ${refusal.code === "namespace_uncertain" ? "namespace" : "objects"} ${command} changes (${refusal.uncertainty}), ${wouldRefuse}${fix}`;
|
|
265
355
|
case "verb_mismatch":
|
|
266
|
-
return
|
|
356
|
+
return `${Executor} reads the verb of ${command} as "${refusal.readVerb}", but the kubectl policy read "${refusal.policyVerb}", so it cannot tell for certain what the command changes, ${wouldRefuse}`;
|
|
267
357
|
case "unnamed_namespace_objects":
|
|
268
|
-
return `${command} would change Namespace objects without naming them (a selector, --all or no name at all), so
|
|
358
|
+
return `${command} would change Namespace objects without naming them (a selector, --all or no name at all), so ${executor} cannot tell whether one of them is ${refusal.podNamespace
|
|
269
359
|
? `"${refusal.podNamespace}", the namespace it runs in`
|
|
270
360
|
: "outside the namespaces it lets OneUptime AI change"}, ${wouldRefuse}${fix}`;
|
|
271
361
|
case "cluster_scoped":
|
|
272
|
-
return `${command} changes ${refusal.clusterScopedKinds.join(", ")} objects, which are cluster-scoped: they live outside every namespace, so outside the namespaces
|
|
362
|
+
return `${command} changes ${refusal.clusterScopedKinds.join(", ")} objects, which are cluster-scoped: they live outside every namespace, so outside the namespaces ${executor} lets OneUptime AI change (${scopeList}) whatever -n says, ${wouldRefuse}`;
|
|
273
363
|
case "all_namespaces":
|
|
274
|
-
return `${command} would change every namespace, including ones
|
|
364
|
+
return `${command} would change every namespace, including ones ${executor} may not change, ${wouldRefuse}${fix}`;
|
|
275
365
|
case "no_namespace":
|
|
276
|
-
return `${command} names no namespace, and
|
|
366
|
+
return `${command} names no namespace, and ${executor} reported no namespace of its own for kubectl to use there, ${wouldRefuse}${fix}`;
|
|
277
367
|
case "own_namespace":
|
|
278
368
|
return refusal.namespaceSource === "namespace_object"
|
|
279
|
-
? `${command} would change the Namespace object "${namespace}", the namespace
|
|
369
|
+
? `${command} would change the Namespace object "${namespace}", the namespace ${settings.inClusterExecutor} itself runs in. OneUptime AI never changes it — a change there could reconfigure the Kubernetes agent or ${settings.executorShort} — ${wouldRefuse}`
|
|
280
370
|
: `${command} would change namespace "${namespace}"${refusal.namespaceSource === "default_namespace"
|
|
281
371
|
? " (the command names none, so kubectl would use that one)"
|
|
282
|
-
: ""}, the namespace
|
|
372
|
+
: ""}, the namespace ${settings.inClusterExecutor} itself runs in. OneUptime AI never changes it — a change there could scale away the Kubernetes agent or ${settings.executorShort} — ${wouldRefuse} Name the namespace of the workload to fix with -n <namespace>.`;
|
|
283
373
|
case "outside_scope":
|
|
284
374
|
return `${command} would change ${refusal.namespaceSource === "namespace_object"
|
|
285
375
|
? `the Namespace object "${namespace}" (a Namespace object is judged by its name; -n does not apply to it)`
|
|
286
376
|
: `namespace "${namespace}"${refusal.namespaceSource === "default_namespace"
|
|
287
377
|
? " (the command names none, so kubectl would use that one)"
|
|
288
|
-
: ""}`}, which is outside the namespaces
|
|
378
|
+
: ""}`}, which is outside the namespaces ${executor} lets OneUptime AI change (${scopeList}), ${wouldRefuse} To let OneUptime AI change "${namespace}", ${settings.addNamespace}.`;
|
|
289
379
|
default: {
|
|
290
380
|
const unhandled = refusal.code;
|
|
291
381
|
return unhandled;
|
|
@@ -357,6 +447,14 @@ export class Service extends DatabaseService {
|
|
|
357
447
|
if (data.stepType === RunbookStepType.Kubectl) {
|
|
358
448
|
throw new BadDataException("Kubectl commands are enqueued through enqueueAiKubectlCommand.");
|
|
359
449
|
}
|
|
450
|
+
/*
|
|
451
|
+
* A resource command runs on that resource's own AI agent, never on a
|
|
452
|
+
* Runner: this lane would target a Runner (targetAgentId), which must
|
|
453
|
+
* never be handed one.
|
|
454
|
+
*/
|
|
455
|
+
if (data.stepType === RunbookStepType.ResourceCommand) {
|
|
456
|
+
throw new BadDataException("Resource commands run on the resource's AI agent, never on a Runner, and are enqueued through enqueueAiResourceCommand.");
|
|
457
|
+
}
|
|
360
458
|
const command = (data.command || "").trim();
|
|
361
459
|
if (!command) {
|
|
362
460
|
throw new BadDataException("An AI command job needs a command.");
|
|
@@ -399,12 +497,15 @@ export class Service extends DatabaseService {
|
|
|
399
497
|
* approved-plan and rollback paths — not just the FullAuto inline tool
|
|
400
498
|
* that has its own pre-check for a friendlier message to the model.
|
|
401
499
|
* Check-then-act, so a burst of concurrent runs can overshoot slightly;
|
|
402
|
-
* the cap is a storm brake, not a quota.
|
|
500
|
+
* the cap is a storm brake, not a quota. Resource commands share the
|
|
501
|
+
* table and the origin but have their own brake, so they never count
|
|
502
|
+
* here (see MAX_AI_RESOURCE_COMMAND_JOBS_PER_PROJECT_PER_HOUR).
|
|
403
503
|
*/
|
|
404
504
|
const jobsInLastHour = (await this.countBy({
|
|
405
505
|
query: {
|
|
406
506
|
projectId: data.projectId,
|
|
407
507
|
origin: RunnerJobOrigin.AiRemediation,
|
|
508
|
+
stepType: QueryHelper.notEquals(RunbookStepType.ResourceCommand),
|
|
408
509
|
createdAt: QueryHelper.greaterThan(OneUptimeDate.getSomeHoursAgo(1)),
|
|
409
510
|
},
|
|
410
511
|
props: { isRoot: true },
|
|
@@ -460,20 +561,27 @@ export class Service extends DatabaseService {
|
|
|
460
561
|
* the cluster), and the payload carries the cluster's identifier so the
|
|
461
562
|
* claim path and the Runner can refuse a job that reaches the wrong pod.
|
|
462
563
|
* A credential is never sent to a kubernetes-agent Runner (its identity
|
|
463
|
-
* is minted with the project's telemetry ingestion key)
|
|
564
|
+
* is minted with the project's telemetry ingestion key), nor to the
|
|
565
|
+
* cluster's Kubernetes AI agent.
|
|
566
|
+
*
|
|
567
|
+
* The target may be the cluster's Kubernetes AI agent (a KubernetesAiAgent
|
|
568
|
+
* row, never a Runner): targetAgentId then names the agent row, and the
|
|
569
|
+
* job is written with targetKubernetesAiAgentId instead, so only that
|
|
570
|
+
* agent can claim it and no Runner ever sees it.
|
|
464
571
|
*
|
|
465
572
|
* It also re-reads the cluster's CURRENT AI access configuration, because
|
|
466
573
|
* every caller acts on a snapshot (an investigation reads the cluster's
|
|
467
574
|
* status once when it starts, a remediation run when it composes): the
|
|
468
|
-
* target must still be the cluster's
|
|
469
|
-
*
|
|
470
|
-
*
|
|
471
|
-
*
|
|
472
|
-
*
|
|
473
|
-
*
|
|
575
|
+
* target must still be the cluster's access target as resolved now
|
|
576
|
+
* (KubernetesClusterAiAccessService.loadAccessTarget), a credential must
|
|
577
|
+
* still be its bound Kubernetes credential, an investigation's reads need
|
|
578
|
+
* "Investigate with kubectl" still on, and a remediation run's commands
|
|
579
|
+
* (its reads included) need the cluster's fixes still enabled. An
|
|
580
|
+
* operator who revokes or re-points access — or an agent that takes over
|
|
581
|
+
* from a Runner — therefore stops an in-flight run at its next command.
|
|
474
582
|
*/
|
|
475
583
|
async enqueueAiKubectlCommand(data) {
|
|
476
|
-
var _a, _b, _c;
|
|
584
|
+
var _a, _b, _c, _d, _e, _f;
|
|
477
585
|
if (!data.targetAgentId) {
|
|
478
586
|
throw new BadDataException("targetAgentId is required to dispatch a kubectl command to a Runner.");
|
|
479
587
|
}
|
|
@@ -515,14 +623,16 @@ export class Service extends DatabaseService {
|
|
|
515
623
|
/*
|
|
516
624
|
* The access test is bounded by its own route limits instead, and an
|
|
517
625
|
* investigation's brake counts only rows with an AI run, so tests never
|
|
518
|
-
* spend the budget real investigations share.
|
|
626
|
+
* spend the budget real investigations share. Resource commands have
|
|
627
|
+
* their own brake and never count here, so a busy hour on the project's
|
|
628
|
+
* other infrastructure never starves the cluster lane.
|
|
519
629
|
*/
|
|
520
630
|
if (!isAccessTest) {
|
|
521
631
|
const hourlyCap = data.origin === RunnerJobOrigin.AiInvestigation
|
|
522
632
|
? MAX_AI_INVESTIGATION_COMMAND_JOBS_PER_PROJECT_PER_HOUR
|
|
523
633
|
: MAX_AI_COMMAND_JOBS_PER_PROJECT_PER_HOUR;
|
|
524
634
|
const jobsInLastHour = (await this.countBy({
|
|
525
|
-
query: Object.assign({ projectId: data.projectId, origin: data.origin, createdAt: QueryHelper.greaterThan(OneUptimeDate.getSomeHoursAgo(1)) }, (data.origin === RunnerJobOrigin.AiInvestigation
|
|
635
|
+
query: Object.assign({ projectId: data.projectId, origin: data.origin, stepType: QueryHelper.notEquals(RunbookStepType.ResourceCommand), createdAt: QueryHelper.greaterThan(OneUptimeDate.getSomeHoursAgo(1)) }, (data.origin === RunnerJobOrigin.AiInvestigation
|
|
526
636
|
? { aiRunId: QueryHelper.notNull() }
|
|
527
637
|
: {})),
|
|
528
638
|
props: { isRoot: true },
|
|
@@ -546,6 +656,7 @@ export class Service extends DatabaseService {
|
|
|
546
656
|
},
|
|
547
657
|
select: {
|
|
548
658
|
_id: true,
|
|
659
|
+
projectId: true,
|
|
549
660
|
name: true,
|
|
550
661
|
clusterIdentifier: true,
|
|
551
662
|
aiAccessRunnerId: true,
|
|
@@ -560,9 +671,16 @@ export class Service extends DatabaseService {
|
|
|
560
671
|
}
|
|
561
672
|
const clusterIdentifier = (cluster.clusterIdentifier || "").trim();
|
|
562
673
|
const clusterLabel = cluster.name || clusterIdentifier || data.kubernetesClusterId.toString();
|
|
674
|
+
/*
|
|
675
|
+
* The cluster's access target as it resolves NOW. A target that is not
|
|
676
|
+
* it — a Runner the cluster was re-pointed away from, or a Runner after
|
|
677
|
+
* the cluster's Kubernetes AI agent came online — is refused below.
|
|
678
|
+
*/
|
|
679
|
+
const loaded = await KubernetesClusterAiAccessService.loadAccessTarget({ cluster });
|
|
563
680
|
const bindingRefusal = Service.getClusterBindingRefusal({
|
|
564
681
|
cluster,
|
|
565
682
|
clusterLabel,
|
|
683
|
+
resolvedTargetId: getKubernetesAiAccessTargetId(loaded.target),
|
|
566
684
|
targetAgentId: data.targetAgentId,
|
|
567
685
|
credentialId: data.credentialId,
|
|
568
686
|
requiredSwitch: await this.getRequiredClusterSwitch({
|
|
@@ -575,72 +693,103 @@ export class Service extends DatabaseService {
|
|
|
575
693
|
if (bindingRefusal) {
|
|
576
694
|
throw new BadDataException(bindingRefusal);
|
|
577
695
|
}
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
696
|
+
let posture = undefined;
|
|
697
|
+
let executorKind;
|
|
698
|
+
let targetKubernetesAiAgentId = undefined;
|
|
699
|
+
if (loaded.target.type === "ai_agent") {
|
|
700
|
+
const agent = loaded.target.agent;
|
|
701
|
+
/*
|
|
702
|
+
* The agent row was read by (project, cluster), so it is this
|
|
703
|
+
* cluster's: checked again here so the rule reads in one place.
|
|
704
|
+
*/
|
|
705
|
+
if (((_a = agent.projectId) === null || _a === void 0 ? void 0 : _a.toString()) !== data.projectId.toString() ||
|
|
706
|
+
((_b = agent.kubernetesClusterId) === null || _b === void 0 ? void 0 : _b.toString()) !==
|
|
707
|
+
data.kubernetesClusterId.toString()) {
|
|
708
|
+
throw new BadDataException(`The Kubernetes AI agent this kubectl command names is not cluster "${clusterLabel}"'s, so it was not enqueued.`);
|
|
709
|
+
}
|
|
590
710
|
/*
|
|
591
|
-
*
|
|
592
|
-
* identity is issued with the
|
|
593
|
-
*
|
|
594
|
-
* claim path refuses it as well (by the same name-or-posture rule);
|
|
595
|
-
* refusing here keeps the job from ever existing.
|
|
711
|
+
* The agent runs kubectl with its own ServiceAccount only and is
|
|
712
|
+
* never handed credential material: its identity is issued with the
|
|
713
|
+
* project's telemetry ingestion key.
|
|
596
714
|
*/
|
|
597
|
-
if (
|
|
598
|
-
throw new BadDataException(`
|
|
715
|
+
if (data.credentialId) {
|
|
716
|
+
throw new BadDataException(`Cluster "${clusterLabel}" is reached through its Kubernetes AI agent, which runs kubectl with its own ServiceAccount and is never given a credential, so a kubectl command that needs one was not enqueued.`);
|
|
599
717
|
}
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
},
|
|
606
|
-
select: { _id: true, name: true, credentialType: true },
|
|
607
|
-
props: { isRoot: true },
|
|
608
|
-
})
|
|
609
|
-
: null;
|
|
610
|
-
if (!credential ||
|
|
611
|
-
credential.credentialType !== RunbookCredentialType.Kubernetes) {
|
|
612
|
-
throw new BadDataException(`The credential this kubectl command names is not a Kubernetes credential of this project, so it was not enqueued for cluster "${clusterLabel}".`);
|
|
718
|
+
posture = parseKubernetesAgentPosture(agent.posture);
|
|
719
|
+
executorKind = "ai_agent";
|
|
720
|
+
targetKubernetesAiAgentId = agent.id;
|
|
721
|
+
if (!isInClusterPostureForCluster(posture, clusterIdentifier)) {
|
|
722
|
+
throw new BadDataException(`The Kubernetes AI agent has not reported that it runs in cluster "${clusterIdentifier || cluster.name || ((_c = cluster.id) === null || _c === void 0 ? void 0 : _c.toString())}", so this kubectl command was not enqueued. Wait for its next report (within a minute), or reset the agent on the cluster's AI agent page (AI → Agent).`);
|
|
613
723
|
}
|
|
614
724
|
}
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
725
|
+
else {
|
|
726
|
+
/*
|
|
727
|
+
* A Runner target: the Runner row the resolution read, which is the
|
|
728
|
+
* cluster's bound Runner and so belongs to this project.
|
|
729
|
+
*/
|
|
730
|
+
const targetRunner = loaded.target.type === "none" ? null : loaded.target.runner;
|
|
731
|
+
if (!targetRunner) {
|
|
732
|
+
throw new BadDataException("The target Runner was not found or it does not belong to this project.");
|
|
733
|
+
}
|
|
734
|
+
executorKind = data.credentialId ? "credential_runner" : "legacy_runner";
|
|
735
|
+
if (data.credentialId) {
|
|
736
|
+
/*
|
|
737
|
+
* A kubernetes-agent Runner is never handed credential material: its
|
|
738
|
+
* identity is issued with the project's telemetry ingestion key, so
|
|
739
|
+
* anyone holding that key could come to hold the credential too. The
|
|
740
|
+
* claim path refuses it as well (by the same name-or-posture rule);
|
|
741
|
+
* refusing here keeps the job from ever existing.
|
|
742
|
+
*/
|
|
743
|
+
if (RunnerServiceClass.isKubernetesAgentRunnerRow(targetRunner)) {
|
|
744
|
+
throw new BadDataException(`Runner "${targetRunner.name}" is a cluster's in-cluster Runner and is never given a credential, so a kubectl command for cluster "${clusterLabel}" that needs one cannot run on it. Create a Runner under Project Settings → Runners, assign the Kubernetes credential to it and select both on the cluster's AI agent page (AI → Agent).`);
|
|
745
|
+
}
|
|
746
|
+
const credential = ObjectID.isValidUUID(data.credentialId)
|
|
747
|
+
? await RunbookCredentialService.findOneBy({
|
|
748
|
+
query: {
|
|
749
|
+
_id: data.credentialId,
|
|
750
|
+
projectId: data.projectId,
|
|
751
|
+
},
|
|
752
|
+
select: { _id: true, name: true, credentialType: true },
|
|
753
|
+
props: { isRoot: true },
|
|
754
|
+
})
|
|
755
|
+
: null;
|
|
756
|
+
if (!credential ||
|
|
757
|
+
credential.credentialType !== RunbookCredentialType.Kubernetes) {
|
|
758
|
+
throw new BadDataException(`The credential this kubectl command names is not a Kubernetes credential of this project, so it was not enqueued for cluster "${clusterLabel}".`);
|
|
759
|
+
}
|
|
760
|
+
}
|
|
761
|
+
posture = parseKubernetesRunnerPosture(targetRunner.hostInfo);
|
|
762
|
+
if (!data.credentialId) {
|
|
763
|
+
if (!isInClusterPostureForCluster(posture, clusterIdentifier)) {
|
|
764
|
+
throw new BadDataException(`A kubectl command without a Kubernetes credential can only run on the in-cluster Runner of cluster "${clusterIdentifier || cluster.name || ((_d = cluster.id) === null || _d === void 0 ? void 0 : _d.toString())}", and Runner "${targetRunner.name}" ${(posture === null || posture === void 0 ? void 0 : posture.inCluster)
|
|
765
|
+
? `is the in-cluster Runner of ${((_e = posture.clusterIdentifier) === null || _e === void 0 ? void 0 : _e.trim())
|
|
766
|
+
? `cluster "${posture.clusterIdentifier.trim()}"`
|
|
767
|
+
: "an unnamed cluster"}`
|
|
768
|
+
: "runs outside the cluster"}. Select a Kubernetes credential for this Runner on the cluster's AI agent page (AI → Agent), or clear the Runner there to use the cluster's Kubernetes AI agent.`);
|
|
769
|
+
}
|
|
623
770
|
}
|
|
624
771
|
}
|
|
625
772
|
/*
|
|
626
|
-
* A remediation write the
|
|
773
|
+
* A remediation write the target's own posture says it will refuse — a
|
|
627
774
|
* namespace outside its write scope, its own namespace, or a node
|
|
628
775
|
* operation its chart did not grant — is refused here, before it can be
|
|
629
776
|
* approved, enqueued or counted by the cluster's circuit breaker, with
|
|
630
|
-
* the
|
|
631
|
-
*
|
|
777
|
+
* the setting that would allow it. Reads are never refused for scope.
|
|
778
|
+
* A job with no credential lands in the pod's own namespace when it
|
|
779
|
+
* names none — for the agent exactly as for the in-cluster Runner.
|
|
632
780
|
*/
|
|
633
781
|
if (data.origin === RunnerJobOrigin.AiRemediation) {
|
|
634
782
|
const scopeRefusal = Service.getRunnerWriteScopeRefusal({
|
|
635
783
|
policy,
|
|
636
784
|
posture,
|
|
637
785
|
usesCredential: Boolean(data.credentialId),
|
|
786
|
+
executorKind,
|
|
638
787
|
});
|
|
639
788
|
if (scopeRefusal) {
|
|
640
789
|
throw new BadDataException(scopeRefusal);
|
|
641
790
|
}
|
|
642
791
|
}
|
|
643
|
-
const claimDeadlineAt = OneUptimeDate.addRemoveSeconds(OneUptimeDate.getCurrentDate(), Math.ceil(((
|
|
792
|
+
const claimDeadlineAt = OneUptimeDate.addRemoveSeconds(OneUptimeDate.getCurrentDate(), Math.ceil(((_f = data.claimTimeoutInMs) !== null && _f !== void 0 ? _f : DEFAULT_CLAIM_TIMEOUT_MS) / 1000));
|
|
644
793
|
const row = new Model();
|
|
645
794
|
row.projectId = data.projectId;
|
|
646
795
|
row.origin = data.origin;
|
|
@@ -653,7 +802,16 @@ export class Service extends DatabaseService {
|
|
|
653
802
|
row.kubernetesClusterId = data.kubernetesClusterId;
|
|
654
803
|
row.stepId = data.stepId;
|
|
655
804
|
row.stepType = RunbookStepType.Kubectl;
|
|
656
|
-
|
|
805
|
+
/*
|
|
806
|
+
* Exactly one target: the agent's row, or the Runner. targetAgentId has
|
|
807
|
+
* a foreign key to Runner, so it stays empty for the agent.
|
|
808
|
+
*/
|
|
809
|
+
if (targetKubernetesAiAgentId) {
|
|
810
|
+
row.targetKubernetesAiAgentId = targetKubernetesAiAgentId;
|
|
811
|
+
}
|
|
812
|
+
else {
|
|
813
|
+
row.targetAgentId = data.targetAgentId;
|
|
814
|
+
}
|
|
657
815
|
row.script = "";
|
|
658
816
|
row.payload = Object.assign(Object.assign({ args: policy.args, displayCommand: policy.displayCommand, tier: policy.tier, kubernetesClusterId: data.kubernetesClusterId.toString() }, (clusterIdentifier ? { clusterIdentifier } : {})), (data.credentialId ? { credentialId: data.credentialId } : {}));
|
|
659
817
|
row.timeoutInMs = data.timeoutInMs;
|
|
@@ -694,32 +852,270 @@ export class Service extends DatabaseService {
|
|
|
694
852
|
/*
|
|
695
853
|
* Why a kubectl job may NOT be enqueued for this cluster as it is
|
|
696
854
|
* configured right now, or null when it may. Pure, so the rule reads in
|
|
697
|
-
* one place: the job must go
|
|
698
|
-
*
|
|
855
|
+
* one place: the job must go to the cluster's CURRENT access target
|
|
856
|
+
* (resolvedTargetId, from resolveKubernetesAiAccessTarget), and the
|
|
857
|
+
* capability it is for must still be switched on.
|
|
699
858
|
*
|
|
700
859
|
* A credential-less job does not require the credential binding to be
|
|
701
|
-
* empty: the in-cluster Runner of the cluster
|
|
702
|
-
* credential (the readiness status prefers it),
|
|
703
|
-
* legitimate with a credential still selected.
|
|
860
|
+
* empty: the in-cluster Runner of the cluster (or its Kubernetes AI
|
|
861
|
+
* agent) wins over a bound credential (the readiness status prefers it),
|
|
862
|
+
* so such a job is legitimate with a credential still selected.
|
|
704
863
|
*/
|
|
705
864
|
static getClusterBindingRefusal(data) {
|
|
706
865
|
const { cluster, clusterLabel } = data;
|
|
707
|
-
if (!
|
|
708
|
-
|
|
709
|
-
return `Cluster "${clusterLabel}" is no longer reached through this Runner (its AI access
|
|
866
|
+
if (!data.resolvedTargetId ||
|
|
867
|
+
data.resolvedTargetId !== data.targetAgentId.toString()) {
|
|
868
|
+
return `Cluster "${clusterLabel}" is no longer reached through this Runner or agent (its AI access changed on the cluster's AI agent page (AI → Agent), or its Kubernetes AI agent took over), so this kubectl command was not enqueued.`;
|
|
710
869
|
}
|
|
711
870
|
if (data.credentialId &&
|
|
712
871
|
(!cluster.aiAccessCredentialId ||
|
|
713
872
|
cluster.aiAccessCredentialId.toString() !== data.credentialId)) {
|
|
714
|
-
return `Cluster "${clusterLabel}" is no longer reached with this Kubernetes credential (its AI access
|
|
873
|
+
return `Cluster "${clusterLabel}" is no longer reached with this Kubernetes credential (its AI access changed on the cluster's AI agent page (AI → Agent)), so this kubectl command was not enqueued.`;
|
|
715
874
|
}
|
|
716
875
|
if (data.requiredSwitch === "investigation" &&
|
|
717
876
|
cluster.isAiInvestigationEnabled !== true) {
|
|
718
|
-
return `"
|
|
877
|
+
return `"Investigate with kubectl" is turned off for cluster "${clusterLabel}", so this investigation command was not enqueued.`;
|
|
719
878
|
}
|
|
720
879
|
if (data.requiredSwitch === "remediation" &&
|
|
721
880
|
!ENABLED_REMEDIATION_MODES.includes(cluster.aiRemediationMode)) {
|
|
722
|
-
return `AI
|
|
881
|
+
return `AI fixes are turned off for cluster "${clusterLabel}", so this kubectl command was not enqueued.`;
|
|
882
|
+
}
|
|
883
|
+
return null;
|
|
884
|
+
}
|
|
885
|
+
/*
|
|
886
|
+
* Enqueue ONE command OneUptime AI composed for an infrastructure
|
|
887
|
+
* resource — a Docker or Podman host, a Docker Swarm, Proxmox, VMware or
|
|
888
|
+
* Ceph cluster, a database server or a host — for that resource's AI
|
|
889
|
+
* agent (a ResourceAiAgent row, never a Runner).
|
|
890
|
+
*
|
|
891
|
+
* The server-side chokepoint between an LLM's output and a resource, in
|
|
892
|
+
* the order enqueueAiKubectlCommand checks a cluster command:
|
|
893
|
+
*
|
|
894
|
+
* 1. the call itself: a resource type and id, an AI origin, the
|
|
895
|
+
* suggestion a remediation job belongs to, the run an investigation
|
|
896
|
+
* job belongs to (the access test alone has none, and is a read);
|
|
897
|
+
* 2. the resource command policy, re-run whatever the tool layer
|
|
898
|
+
* checked: Denied never enqueues, and an investigation-origin job must
|
|
899
|
+
* be Read tier — an investigation can never write;
|
|
900
|
+
* 3. the project's hourly brake for resource commands (investigations
|
|
901
|
+
* and remediation counted apart, on ResourceCommand rows only);
|
|
902
|
+
* 4. the resource must be this project's;
|
|
903
|
+
* 5. the target is re-resolved NOW: the resource's online agent
|
|
904
|
+
* (ResourceAiAgentService.findOnlineAgentForResource), and the agent
|
|
905
|
+
* the caller named, if any, must still be it;
|
|
906
|
+
* 6. the switch the job needs must still be on: an investigation's reads
|
|
907
|
+
* need the resource's investigation switch (a remediation run's reads
|
|
908
|
+
* its fixes), and a remediation job needs its fixes (mode not
|
|
909
|
+
* Disabled) — so an operator who turns AI off stops an in-flight run
|
|
910
|
+
* at its next command;
|
|
911
|
+
* 7. no credential: the agent uses only its own environment's;
|
|
912
|
+
* 8. the agent's reported posture must be for this resource type and
|
|
913
|
+
* name the identity it registered with (the payload carries it, and
|
|
914
|
+
* the agent refuses a job for any other), and a write must fit it:
|
|
915
|
+
* ONEUPTIME_AI_ALLOW_WRITES on, ONEUPTIME_AI_WRITE_TARGETS and the
|
|
916
|
+
* agent's protected targets respected (ResourceCommandPolicy.
|
|
917
|
+
* getWriteScopeRefusal, the rule the agent itself applies).
|
|
918
|
+
*
|
|
919
|
+
* The command travels as an argv (never a shell line) in a
|
|
920
|
+
* ResourceCommandJobPayload, and the row names the agent in
|
|
921
|
+
* targetResourceAiAgentId, so only that agent can claim it. Every
|
|
922
|
+
* refusal is a ResourceCommandEnqueueRefusedException saying which rule.
|
|
923
|
+
*/
|
|
924
|
+
async enqueueAiResourceCommand(data) {
|
|
925
|
+
var _a;
|
|
926
|
+
// 1. The call itself.
|
|
927
|
+
if (!isAiResourceType(data.resourceType)) {
|
|
928
|
+
throw new ResourceCommandEnqueueRefusedException("invalid_request", `A resource command needs a resource type; "${String(data.resourceType)}" is not one.`);
|
|
929
|
+
}
|
|
930
|
+
const info = AI_RESOURCE_TYPE_INFO[data.resourceType];
|
|
931
|
+
const noun = describeResourceNoun(data.resourceType);
|
|
932
|
+
if (!data.resourceId) {
|
|
933
|
+
throw new ResourceCommandEnqueueRefusedException("invalid_request", `resourceId is required for a command on a ${noun}.`);
|
|
934
|
+
}
|
|
935
|
+
if (data.origin !== RunnerJobOrigin.AiInvestigation &&
|
|
936
|
+
data.origin !== RunnerJobOrigin.AiRemediation) {
|
|
937
|
+
throw new ResourceCommandEnqueueRefusedException("invalid_request", `A resource command job cannot have origin "${String(data.origin)}".`);
|
|
938
|
+
}
|
|
939
|
+
if (data.origin === RunnerJobOrigin.AiRemediation &&
|
|
940
|
+
!data.autoRemediationSuggestionId) {
|
|
941
|
+
throw new ResourceCommandEnqueueRefusedException("invalid_request", "A resource remediation job needs its auto-remediation suggestion.");
|
|
942
|
+
}
|
|
943
|
+
const isAccessTest = data.isAccessTest === true;
|
|
944
|
+
if (isAccessTest &&
|
|
945
|
+
(data.origin !== RunnerJobOrigin.AiInvestigation || data.aiRunId)) {
|
|
946
|
+
throw new ResourceCommandEnqueueRefusedException("invalid_request", "An access test is a read-only check with no AI run behind it.");
|
|
947
|
+
}
|
|
948
|
+
if (data.origin === RunnerJobOrigin.AiInvestigation &&
|
|
949
|
+
!isAccessTest &&
|
|
950
|
+
!data.aiRunId) {
|
|
951
|
+
throw new ResourceCommandEnqueueRefusedException("invalid_request", "An investigation resource command job needs the AI run it belongs to.");
|
|
952
|
+
}
|
|
953
|
+
// 2. The policy, whatever the tool layer decided.
|
|
954
|
+
const policy = ResourceCommandPolicy.evaluateCommand({
|
|
955
|
+
resourceType: data.resourceType,
|
|
956
|
+
command: data.command,
|
|
957
|
+
});
|
|
958
|
+
if (policy.tier === ResourceCommandTier.Denied) {
|
|
959
|
+
throw new ResourceCommandEnqueueRefusedException("policy_denied", `Denied by the ${info.displayName} command policy: ${policy.reason}.`);
|
|
960
|
+
}
|
|
961
|
+
if (data.origin === RunnerJobOrigin.AiInvestigation &&
|
|
962
|
+
policy.tier !== ResourceCommandTier.Read) {
|
|
963
|
+
throw new ResourceCommandEnqueueRefusedException("not_read_only", `An investigation may only run read-only commands; "${policy.displayCommand}" would change the ${noun} (${policy.tier}).`);
|
|
964
|
+
}
|
|
965
|
+
// 3. The hourly brake, on resource commands only.
|
|
966
|
+
if (!isAccessTest) {
|
|
967
|
+
const hourlyCap = data.origin === RunnerJobOrigin.AiInvestigation
|
|
968
|
+
? MAX_AI_INVESTIGATION_RESOURCE_COMMAND_JOBS_PER_PROJECT_PER_HOUR
|
|
969
|
+
: MAX_AI_RESOURCE_COMMAND_JOBS_PER_PROJECT_PER_HOUR;
|
|
970
|
+
const jobsInLastHour = (await this.countBy({
|
|
971
|
+
query: Object.assign({ projectId: data.projectId, origin: data.origin, stepType: RunbookStepType.ResourceCommand, createdAt: QueryHelper.greaterThan(OneUptimeDate.getSomeHoursAgo(1)) }, (data.origin === RunnerJobOrigin.AiInvestigation
|
|
972
|
+
? { aiRunId: QueryHelper.notNull() }
|
|
973
|
+
: {})),
|
|
974
|
+
props: { isRoot: true },
|
|
975
|
+
})).toNumber();
|
|
976
|
+
if (jobsInLastHour >= hourlyCap) {
|
|
977
|
+
throw new ResourceCommandEnqueueRefusedException("hourly_limit", data.origin === RunnerJobOrigin.AiInvestigation
|
|
978
|
+
? `This project has run ${jobsInLastHour} AI investigation commands on its infrastructure in the last hour, which is its limit (${hourlyCap}). No further infrastructure commands can run this hour.`
|
|
979
|
+
: `This project has run ${jobsInLastHour} AI remediation commands on its infrastructure in the last hour, which is its limit (${hourlyCap}). No further AI commands can run on its infrastructure this hour.`);
|
|
980
|
+
}
|
|
981
|
+
}
|
|
982
|
+
// 4 + 5. The resource, and the agent it is reached through NOW.
|
|
983
|
+
const loaded = await ResourceAiAccessService.loadAccessTarget({
|
|
984
|
+
projectId: data.projectId,
|
|
985
|
+
resourceType: data.resourceType,
|
|
986
|
+
resourceId: data.resourceId,
|
|
987
|
+
});
|
|
988
|
+
if (!loaded.resource) {
|
|
989
|
+
throw new ResourceCommandEnqueueRefusedException("resource_not_found", `${info.displayName} not found or it does not belong to this project.`);
|
|
990
|
+
}
|
|
991
|
+
const bindingRefusal = Service.getResourceBindingRefusal({
|
|
992
|
+
resource: loaded.resource,
|
|
993
|
+
agent: loaded.agent,
|
|
994
|
+
targetResourceAiAgentId: data.targetResourceAiAgentId,
|
|
995
|
+
credentialId: data.credentialId,
|
|
996
|
+
// 6. The switch this job needs.
|
|
997
|
+
requiredSwitch: await this.getRequiredClusterSwitch({
|
|
998
|
+
projectId: data.projectId,
|
|
999
|
+
origin: data.origin,
|
|
1000
|
+
aiRunId: data.aiRunId,
|
|
1001
|
+
isAccessTest,
|
|
1002
|
+
}),
|
|
1003
|
+
});
|
|
1004
|
+
if (bindingRefusal) {
|
|
1005
|
+
throw new ResourceCommandEnqueueRefusedException(bindingRefusal.code, bindingRefusal.message);
|
|
1006
|
+
}
|
|
1007
|
+
const agent = loaded.agent;
|
|
1008
|
+
const resourceLabel = loaded.resource.name;
|
|
1009
|
+
// 8. The agent's own posture: this resource, and room for the write.
|
|
1010
|
+
const posture = parseResourceAiAgentPosture(agent.posture);
|
|
1011
|
+
const resourceIdentifier = (agent.resourceIdentifier ||
|
|
1012
|
+
(posture === null || posture === void 0 ? void 0 : posture.resourceIdentifier) ||
|
|
1013
|
+
"").trim();
|
|
1014
|
+
if (!posture ||
|
|
1015
|
+
posture.resourceType !== data.resourceType ||
|
|
1016
|
+
!resourceIdentifier) {
|
|
1017
|
+
throw new ResourceCommandEnqueueRefusedException("agent_posture_mismatch", `The ${info.agentDisplayName} has not reported that it serves ${noun} "${resourceLabel}", so this command was not enqueued. Wait for its next report (within a minute), or reset the agent on ${getResourceAiAgentPage(data.resourceType)}.`);
|
|
1018
|
+
}
|
|
1019
|
+
if (policy.tier !== ResourceCommandTier.Read) {
|
|
1020
|
+
const scopeRefusal = ResourceCommandPolicy.getWriteScopeRefusal({
|
|
1021
|
+
result: policy,
|
|
1022
|
+
allowWrites: posture.allowWrites === true,
|
|
1023
|
+
writeTargets: posture.writeTargets,
|
|
1024
|
+
protectedTargets: posture.protectedTargets,
|
|
1025
|
+
resourceType: data.resourceType,
|
|
1026
|
+
});
|
|
1027
|
+
if (scopeRefusal) {
|
|
1028
|
+
throw new ResourceCommandEnqueueRefusedException("write_scope", `${scopeRefusal} It was not enqueued.`);
|
|
1029
|
+
}
|
|
1030
|
+
}
|
|
1031
|
+
const claimDeadlineAt = OneUptimeDate.addRemoveSeconds(OneUptimeDate.getCurrentDate(), Math.ceil(((_a = data.claimTimeoutInMs) !== null && _a !== void 0 ? _a : DEFAULT_CLAIM_TIMEOUT_MS) / 1000));
|
|
1032
|
+
const payload = {
|
|
1033
|
+
resourceType: data.resourceType,
|
|
1034
|
+
resourceId: loaded.resource.id.toString(),
|
|
1035
|
+
resourceIdentifier,
|
|
1036
|
+
program: policy.program,
|
|
1037
|
+
args: policy.args,
|
|
1038
|
+
displayCommand: policy.displayCommand,
|
|
1039
|
+
tier: policy.tier,
|
|
1040
|
+
};
|
|
1041
|
+
const row = new Model();
|
|
1042
|
+
row.projectId = data.projectId;
|
|
1043
|
+
row.origin = data.origin;
|
|
1044
|
+
if (data.aiRunId) {
|
|
1045
|
+
row.aiRunId = data.aiRunId;
|
|
1046
|
+
}
|
|
1047
|
+
if (data.autoRemediationSuggestionId) {
|
|
1048
|
+
row.autoRemediationSuggestionId = data.autoRemediationSuggestionId;
|
|
1049
|
+
}
|
|
1050
|
+
row.stepId = data.stepId;
|
|
1051
|
+
row.stepType = RunbookStepType.ResourceCommand;
|
|
1052
|
+
/*
|
|
1053
|
+
* The one target: the resource's agent row. targetAgentId (a Runner)
|
|
1054
|
+
* and targetKubernetesAiAgentId stay empty, so no Runner and no
|
|
1055
|
+
* Kubernetes AI agent can ever claim it.
|
|
1056
|
+
*/
|
|
1057
|
+
row.targetResourceAiAgentId = agent.id;
|
|
1058
|
+
row.resourceType = data.resourceType;
|
|
1059
|
+
row.resourceId = loaded.resource.id;
|
|
1060
|
+
row.script = "";
|
|
1061
|
+
row.payload = payload;
|
|
1062
|
+
row.timeoutInMs = data.timeoutInMs;
|
|
1063
|
+
row.status = RunnerJobStatus.Pending;
|
|
1064
|
+
row.claimDeadlineAt = claimDeadlineAt;
|
|
1065
|
+
return this.create({ data: row, props: { isRoot: true } });
|
|
1066
|
+
}
|
|
1067
|
+
/*
|
|
1068
|
+
* Why a resource command may NOT be enqueued for this resource as it is
|
|
1069
|
+
* configured right now, or null when it may. Pure, so the rule reads in
|
|
1070
|
+
* one place: the resource must have an online agent (the one the caller
|
|
1071
|
+
* named, when it named one) that is this resource's, the switch the job
|
|
1072
|
+
* needs must still be on, and no credential may travel with it.
|
|
1073
|
+
*/
|
|
1074
|
+
static getResourceBindingRefusal(data) {
|
|
1075
|
+
var _a, _b;
|
|
1076
|
+
const { resource, agent } = data;
|
|
1077
|
+
const info = AI_RESOURCE_TYPE_INFO[resource.resourceType];
|
|
1078
|
+
const noun = describeResourceNoun(resource.resourceType);
|
|
1079
|
+
const label = resource.name;
|
|
1080
|
+
if (!agent || !agent.id) {
|
|
1081
|
+
return {
|
|
1082
|
+
code: "agent_not_online",
|
|
1083
|
+
message: `${noun.charAt(0).toUpperCase()}${noun.slice(1)} "${label}" has no online ${info.agentDisplayName}, so this command was not enqueued. ${getResourceAiAgentInstallNextStep({
|
|
1084
|
+
resourceType: resource.resourceType,
|
|
1085
|
+
resourceId: resource.id.toString(),
|
|
1086
|
+
identifier: resource.identifier,
|
|
1087
|
+
})} Already installed? Check that its container is running and can reach your OneUptime URL.`,
|
|
1088
|
+
};
|
|
1089
|
+
}
|
|
1090
|
+
if (((_a = agent.projectId) === null || _a === void 0 ? void 0 : _a.toString()) !== resource.projectId.toString() ||
|
|
1091
|
+
agent.resourceType !== resource.resourceType ||
|
|
1092
|
+
((_b = agent.resourceId) === null || _b === void 0 ? void 0 : _b.toString()) !== resource.id.toString() ||
|
|
1093
|
+
(data.targetResourceAiAgentId &&
|
|
1094
|
+
data.targetResourceAiAgentId.toString() !== agent.id.toString())) {
|
|
1095
|
+
return {
|
|
1096
|
+
code: "agent_changed",
|
|
1097
|
+
message: `${noun.charAt(0).toUpperCase()}${noun.slice(1)} "${label}" is no longer reached through this ${info.agentDisplayName} (the agent was reset or replaced), so this command was not enqueued.`,
|
|
1098
|
+
};
|
|
1099
|
+
}
|
|
1100
|
+
if (data.requiredSwitch === "investigation" &&
|
|
1101
|
+
resource.isAiInvestigationEnabled !== true) {
|
|
1102
|
+
return {
|
|
1103
|
+
code: "switch_off",
|
|
1104
|
+
message: `AI investigation is turned off for ${noun} "${label}", so this investigation command was not enqueued.`,
|
|
1105
|
+
};
|
|
1106
|
+
}
|
|
1107
|
+
if (data.requiredSwitch === "remediation" &&
|
|
1108
|
+
!ENABLED_RESOURCE_REMEDIATION_MODES.includes(resource.aiRemediationMode)) {
|
|
1109
|
+
return {
|
|
1110
|
+
code: "switch_off",
|
|
1111
|
+
message: `AI fixes are turned off for ${noun} "${label}", so this command was not enqueued.`,
|
|
1112
|
+
};
|
|
1113
|
+
}
|
|
1114
|
+
if (data.credentialId) {
|
|
1115
|
+
return {
|
|
1116
|
+
code: "credential_refused",
|
|
1117
|
+
message: `${noun.charAt(0).toUpperCase()}${noun.slice(1)} "${label}" is reached through its ${info.agentDisplayName}, which uses only the credentials in its own environment and is never given one by OneUptime, so a command that names a credential was not enqueued.`,
|
|
1118
|
+
};
|
|
723
1119
|
}
|
|
724
1120
|
return null;
|
|
725
1121
|
}
|
|
@@ -898,6 +1294,21 @@ export class Service extends DatabaseService {
|
|
|
898
1294
|
return ToolResultSerializer.redact(KubectlOutputRedactor.redact(text).text)
|
|
899
1295
|
.text;
|
|
900
1296
|
}
|
|
1297
|
+
/*
|
|
1298
|
+
* A resource command's text through the resource command redactor (the
|
|
1299
|
+
* program's own rules, then the generic ones), or the text unchanged
|
|
1300
|
+
* when it is not one. Pure; redactAiJobText still runs after it.
|
|
1301
|
+
*/
|
|
1302
|
+
static redactResourceCommandText(text, resourceCommand) {
|
|
1303
|
+
if (!resourceCommand) {
|
|
1304
|
+
return text;
|
|
1305
|
+
}
|
|
1306
|
+
return redactResourceCommandOutput({
|
|
1307
|
+
resourceType: resourceCommand.resourceType,
|
|
1308
|
+
program: resourceCommand.program,
|
|
1309
|
+
text,
|
|
1310
|
+
});
|
|
1311
|
+
}
|
|
901
1312
|
/*
|
|
902
1313
|
* A Runner's text as a Postgres text column can hold it. A NUL byte is
|
|
903
1314
|
* ordinary in what a Runner reports — `kubectl logs` of a log that was
|
|
@@ -940,10 +1351,12 @@ export class Service extends DatabaseService {
|
|
|
940
1351
|
* write stay one atomic step (and one round trip): the CASE picks the
|
|
941
1352
|
* redacted text for an AI-origin row and the verbatim text otherwise.
|
|
942
1353
|
*/
|
|
943
|
-
const redactedOutput = rawOutput === null
|
|
1354
|
+
const redactedOutput = rawOutput === null
|
|
1355
|
+
? null
|
|
1356
|
+
: Service.redactAiJobText(Service.redactResourceCommandText(rawOutput, data.resourceCommand));
|
|
944
1357
|
const redactedErrorMessage = rawErrorMessage === null
|
|
945
1358
|
? null
|
|
946
|
-
: Service.redactAiJobText(rawErrorMessage);
|
|
1359
|
+
: Service.redactAiJobText(Service.redactResourceCommandText(rawErrorMessage, data.resourceCommand));
|
|
947
1360
|
/*
|
|
948
1361
|
* Only the agent that holds the lease is allowed to write the terminal
|
|
949
1362
|
* result. If the lease has already moved on (Worker timed out and
|
|
@@ -1015,6 +1428,10 @@ export class Service extends DatabaseService {
|
|
|
1015
1428
|
// The timeout reason is worded for what the job is.
|
|
1016
1429
|
origin: true,
|
|
1017
1430
|
stepType: true,
|
|
1431
|
+
targetKubernetesAiAgentId: true,
|
|
1432
|
+
// A resource command names its resource's AI agent.
|
|
1433
|
+
targetResourceAiAgentId: true,
|
|
1434
|
+
resourceType: true,
|
|
1018
1435
|
},
|
|
1019
1436
|
props: { isRoot: true },
|
|
1020
1437
|
});
|
|
@@ -1052,6 +1469,8 @@ export class Service extends DatabaseService {
|
|
|
1052
1469
|
stepType: job.stepType,
|
|
1053
1470
|
claimTimeoutInMs: data.claimTimeoutInMs,
|
|
1054
1471
|
executionTimeoutInMs: data.executionTimeoutInMs,
|
|
1472
|
+
isForKubernetesAiAgent: Boolean(job.targetKubernetesAiAgentId),
|
|
1473
|
+
resourceType: job.resourceType,
|
|
1055
1474
|
}),
|
|
1056
1475
|
});
|
|
1057
1476
|
}
|
|
@@ -1155,6 +1574,12 @@ __decorate([
|
|
|
1155
1574
|
__metadata("design:paramtypes", [Object]),
|
|
1156
1575
|
__metadata("design:returntype", Promise)
|
|
1157
1576
|
], Service.prototype, "enqueueAiKubectlCommand", null);
|
|
1577
|
+
__decorate([
|
|
1578
|
+
CaptureSpan(),
|
|
1579
|
+
__metadata("design:type", Function),
|
|
1580
|
+
__metadata("design:paramtypes", [Object]),
|
|
1581
|
+
__metadata("design:returntype", Promise)
|
|
1582
|
+
], Service.prototype, "enqueueAiResourceCommand", null);
|
|
1158
1583
|
__decorate([
|
|
1159
1584
|
CaptureSpan(),
|
|
1160
1585
|
__metadata("design:type", Function),
|