@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
|
@@ -18,8 +18,10 @@ import AutoRemediationSuggestionStatus from "../../Types/AutoRemediation/AutoRem
|
|
|
18
18
|
import AutoRemediationSuggestionType from "../../Types/AutoRemediation/AutoRemediationSuggestionType";
|
|
19
19
|
import AutoRemediationVerificationStatus from "../../Types/AutoRemediation/AutoRemediationVerificationStatus";
|
|
20
20
|
import AutoRemediationTriggerEntity from "../../Types/AutoRemediation/AutoRemediationTriggerEntity";
|
|
21
|
-
import { APPROVED_COMMAND_STEP_ID_PREFIX, INLINE_COMMAND_STEP_ID_PREFIX, KUBECTL_ALWAYS_ASKS_SUMMARY, KUBECTL_SAFE_CHANGES_SUMMARY, } from "../../Types/AutoRemediation/AiRemediationCommandPlan";
|
|
21
|
+
import { APPROVED_COMMAND_STEP_ID_PREFIX, INLINE_COMMAND_STEP_ID_PREFIX, KUBECTL_ALWAYS_ASKS_SUMMARY, KUBECTL_SAFE_CHANGES_SUMMARY, RESOURCE_ALWAYS_ASKS_SUMMARY, RESOURCE_SAFE_CHANGES_SUMMARY, } from "../../Types/AutoRemediation/AiRemediationCommandPlan";
|
|
22
22
|
import { KubernetesAiRemediationMode, } from "../../Types/Kubernetes/KubernetesClusterAiAccess";
|
|
23
|
+
import { AI_RESOURCE_TYPE_INFO, ALL_AI_RESOURCE_TYPES, isAiResourceType, } from "../../Types/ResourceAiAgent/AiResourceType";
|
|
24
|
+
import { ResourceAiRemediationMode, } from "../../Types/ResourceAiAgent/ResourceAiAccess";
|
|
23
25
|
import RunnerJobOrigin from "../../Types/Runbook/RunnerJobOrigin";
|
|
24
26
|
import { Indigo500 } from "../../Types/BrandColors";
|
|
25
27
|
import OneUptimeDate from "../../Types/Date";
|
|
@@ -33,6 +35,7 @@ import AutoRemediationSuggestionService from "./AutoRemediationSuggestionService
|
|
|
33
35
|
import IncidentFeedService from "./IncidentFeedService";
|
|
34
36
|
import KubernetesClusterAiAccessService from "./KubernetesClusterAiAccessService";
|
|
35
37
|
import LlmProviderService from "./LlmProviderService";
|
|
38
|
+
import ResourceAiAccessService, { describeResourceNoun, } from "./ResourceAiAccessService";
|
|
36
39
|
import ProjectService from "./ProjectService";
|
|
37
40
|
import RunbookRuleEngineService from "./RunbookRuleEngineService";
|
|
38
41
|
import RunnerJobService from "./RunnerJobService";
|
|
@@ -71,6 +74,13 @@ export const DEFAULT_VERIFICATION_WINDOW_MINUTES = 15;
|
|
|
71
74
|
* commands"). Beyond that a human takes over.
|
|
72
75
|
*/
|
|
73
76
|
export const MAX_CLUSTER_REMEDIATION_ROUNDS_PER_SUBJECT = 2;
|
|
77
|
+
/*
|
|
78
|
+
* - Resource-level remediation (the AI page of a Docker or Podman host, a
|
|
79
|
+
* Docker Swarm, Proxmox, VMware or Ceph cluster, a database server or a
|
|
80
|
+
* host — no rule) gets the same two rounds per subject per resource: the
|
|
81
|
+
* first plan, then one follow-up when verification fails.
|
|
82
|
+
*/
|
|
83
|
+
export const MAX_RESOURCE_REMEDIATION_ROUNDS_PER_SUBJECT = 2;
|
|
74
84
|
/*
|
|
75
85
|
* Upper bound on the rows the per-cluster circuit breaker and the in-flight
|
|
76
86
|
* round check read for one cluster. The project-wide hourly AI-command cap
|
|
@@ -103,6 +113,23 @@ const HELD_ROUND_LOOKBACK_HOURS = 24;
|
|
|
103
113
|
* the announcement of an unattended round.
|
|
104
114
|
*/
|
|
105
115
|
const UNATTENDED_ROUND_PROPOSAL_FEED_SENTENCE = "If the hourly circuit breaker for this cluster trips, or another unattended OneUptime AI round already holds the cluster (it is still changing it, or its fix is still being verified), this round becomes a proposal for your approval instead.";
|
|
116
|
+
/*
|
|
117
|
+
* The same clause for a resource round, in the words of
|
|
118
|
+
* RESOURCE_UNATTENDED_ROUND_BECOMES_PROPOSAL_SUMMARY.
|
|
119
|
+
*/
|
|
120
|
+
function getResourceRoundProposalFeedSentence(noun) {
|
|
121
|
+
return `If the hourly circuit breaker for this ${noun} trips, or another unattended OneUptime AI round already holds the ${noun} (it is still changing it, or its fix is still being verified), this round becomes a proposal for your approval instead.`;
|
|
122
|
+
}
|
|
123
|
+
/*
|
|
124
|
+
* The per-resource breaker lock: the rule engine's breaker is read under it
|
|
125
|
+
* by the command toolkit before a run's first inline change on a resource
|
|
126
|
+
* (RemediationCommandToolkit.reserveResourceSlot), in its own namespace so
|
|
127
|
+
* a resource's key can never collide with a cluster's.
|
|
128
|
+
*/
|
|
129
|
+
export const RESOURCE_BREAKER_LOCK_NAMESPACE = "AutoRemediationResourceBreaker";
|
|
130
|
+
export function getResourceBreakerLockKey(resourceType, resourceId) {
|
|
131
|
+
return `${resourceType}:${resourceId.toLowerCase()}`;
|
|
132
|
+
}
|
|
106
133
|
// "a write ..." -> "A write ..." for copy that starts a sentence.
|
|
107
134
|
function capitalizeFirst(text) {
|
|
108
135
|
return text.charAt(0).toUpperCase() + text.slice(1);
|
|
@@ -133,6 +160,43 @@ export function parseClusterRoundNameSnapshot(name) {
|
|
|
133
160
|
}
|
|
134
161
|
return { clusterName: match[1] || "" };
|
|
135
162
|
}
|
|
163
|
+
/*
|
|
164
|
+
* The name a resource-level round carries: 'AI remediation for Docker host
|
|
165
|
+
* "web-1"', 'AI remediation for host "web-2" (round 2)'. Server-written.
|
|
166
|
+
* Never "for cluster": parseClusterRoundNameSnapshot must not read a
|
|
167
|
+
* resource round as a deleted cluster's.
|
|
168
|
+
*/
|
|
169
|
+
export function getResourceRoundNameSnapshot(resourceType, resourceName, round) {
|
|
170
|
+
return `AI remediation for ${describeResourceNoun(resourceType)} "${resourceName}"${round > 1 ? ` (round ${round})` : ""}`;
|
|
171
|
+
}
|
|
172
|
+
const RESOURCE_ROUND_NAME_SUFFIX = /" \(round (\d+)\)$/;
|
|
173
|
+
/*
|
|
174
|
+
* The round a resource round's server-written name carries (see
|
|
175
|
+
* getResourceRoundNameSnapshot): N for '... "web-1" (round N)', 1 for
|
|
176
|
+
* anything else. The suffix always follows the closing quote, so a
|
|
177
|
+
* resource named 'web (round 2)' is never read as a round 2.
|
|
178
|
+
*/
|
|
179
|
+
export function parseResourceRoundNumber(ruleNameSnapshot) {
|
|
180
|
+
const match = RESOURCE_ROUND_NAME_SUFFIX.exec(ruleNameSnapshot || "");
|
|
181
|
+
const round = match ? parseInt(match[1], 10) : 1;
|
|
182
|
+
return Number.isFinite(round) && round > 1 ? round : 1;
|
|
183
|
+
}
|
|
184
|
+
/*
|
|
185
|
+
* Does a resource on this mode run this round of a signal unattended?
|
|
186
|
+
* Bypass approval runs every round unattended; Automatic runs only the
|
|
187
|
+
* signal's FIRST round unattended and asks for its follow-ups; every other
|
|
188
|
+
* mode asks. The rule engine announces a round by it, and the execution
|
|
189
|
+
* runner and the toolkit re-check it against the LIVE mode — a follow-up
|
|
190
|
+
* announced under Bypass approval asks once the resource is on Automatic.
|
|
191
|
+
*/
|
|
192
|
+
export function doesResourceModeRunRoundUnattended(mode, round) {
|
|
193
|
+
return (mode === ResourceAiRemediationMode.BypassApproval ||
|
|
194
|
+
(round <= 1 && mode === ResourceAiRemediationMode.Automatic));
|
|
195
|
+
}
|
|
196
|
+
// 'Docker host "web-1"' — how a resource round names its resource in copy.
|
|
197
|
+
function describeResourceForFeed(status) {
|
|
198
|
+
return `${describeResourceNoun(status.resourceType)} "${status.resourceName}"`;
|
|
199
|
+
}
|
|
136
200
|
// Is `row` ordered before the reference (createdAt, then id as tie-break)?
|
|
137
201
|
function isRoundOrderedBefore(row, reference) {
|
|
138
202
|
var _a;
|
|
@@ -147,6 +211,16 @@ function isRoundOrderedBefore(row, reference) {
|
|
|
147
211
|
}
|
|
148
212
|
return (((_a = row.id) === null || _a === void 0 ? void 0 : _a.toString()) || "") < (reference.suggestionId.toString() || "");
|
|
149
213
|
}
|
|
214
|
+
/*
|
|
215
|
+
* Does any of these suggestions belong to a resource-level round? A signal
|
|
216
|
+
* with one is in the resource lane, so the cluster lane must not start a
|
|
217
|
+
* round on it (one AI fix lane per signal).
|
|
218
|
+
*/
|
|
219
|
+
function hasResourceRound(suggestions) {
|
|
220
|
+
return suggestions.some((suggestion) => {
|
|
221
|
+
return Boolean(suggestion.resourceId);
|
|
222
|
+
});
|
|
223
|
+
}
|
|
150
224
|
function isSameSubject(row, subject) {
|
|
151
225
|
if (subject.incidentId && row.incidentId) {
|
|
152
226
|
return row.incidentId.toString() === subject.incidentId.toString();
|
|
@@ -389,6 +463,216 @@ class AutoRemediationRuleEngineServiceClass {
|
|
|
389
463
|
}
|
|
390
464
|
return null;
|
|
391
465
|
}
|
|
466
|
+
/*
|
|
467
|
+
* The per-resource hourly circuit breaker — getClusterBreakerState for an
|
|
468
|
+
* infrastructure resource reached through its resource AI agent, with the
|
|
469
|
+
* same limit (MAX_AUTO_EXECUTIONS_PER_RULE_PER_HOUR) and the same three
|
|
470
|
+
* counts, the larger winning:
|
|
471
|
+
* - resource-level rounds already settled AutoExecuted (their suggestion
|
|
472
|
+
* carries the resource's type and id);
|
|
473
|
+
* - distinct AI runs that executed at least one inline `ai-command-*`
|
|
474
|
+
* job on the resource (RunnerJob.resourceType/resourceId);
|
|
475
|
+
* - unattended resource rounds still IN FLIGHT: Planning with a
|
|
476
|
+
* FullAuto snapshot, created before the asking round.
|
|
477
|
+
* In-flight rows are read first, for the same reason as the cluster's.
|
|
478
|
+
*
|
|
479
|
+
* Throws on a failed read: every caller fails safe to "no headroom".
|
|
480
|
+
*/
|
|
481
|
+
async getResourceBreakerState(data) {
|
|
482
|
+
var _a, _b, _c, _d;
|
|
483
|
+
const since = OneUptimeDate.getSomeHoursAgo(1);
|
|
484
|
+
const resourceId = new ObjectID(data.resourceId);
|
|
485
|
+
const selfId = (_a = data.forRound) === null || _a === void 0 ? void 0 : _a.suggestionId.toString();
|
|
486
|
+
const inFlightRounds = await AutoRemediationSuggestionService.findBy({
|
|
487
|
+
query: Object.assign(Object.assign({}, (data.projectId ? { projectId: data.projectId } : {})), { resourceType: data.resourceType, resourceId, suggestionType: AutoRemediationSuggestionType.CommandPlan, status: AutoRemediationSuggestionStatus.Planning, executionMode: AutoRemediationExecutionMode.FullAuto, createdAt: QueryHelper.greaterThan(since) }),
|
|
488
|
+
select: {
|
|
489
|
+
_id: true,
|
|
490
|
+
createdAt: true,
|
|
491
|
+
},
|
|
492
|
+
limit: MAX_CLUSTER_ROUND_ROWS,
|
|
493
|
+
skip: 0,
|
|
494
|
+
props: { isRoot: true },
|
|
495
|
+
});
|
|
496
|
+
const settledResourceRounds = (await AutoRemediationSuggestionService.countBy({
|
|
497
|
+
query: Object.assign(Object.assign({}, (data.projectId ? { projectId: data.projectId } : {})), { resourceType: data.resourceType, resourceId, suggestionType: AutoRemediationSuggestionType.CommandPlan, status: AutoRemediationSuggestionStatus.AutoExecuted, createdAt: QueryHelper.greaterThan(since) }),
|
|
498
|
+
props: { isRoot: true },
|
|
499
|
+
})).toNumber();
|
|
500
|
+
const inlineResourceJobs = await RunnerJobService.findBy({
|
|
501
|
+
query: Object.assign(Object.assign({}, (data.projectId ? { projectId: data.projectId } : {})), { resourceType: data.resourceType, resourceId, origin: RunnerJobOrigin.AiRemediation, stepId: QueryHelper.startsWith(INLINE_COMMAND_STEP_ID_PREFIX), createdAt: QueryHelper.greaterThan(since) }),
|
|
502
|
+
select: {
|
|
503
|
+
_id: true,
|
|
504
|
+
autoRemediationSuggestionId: true,
|
|
505
|
+
},
|
|
506
|
+
limit: MAX_CLUSTER_ROUND_ROWS,
|
|
507
|
+
skip: 0,
|
|
508
|
+
props: { isRoot: true },
|
|
509
|
+
});
|
|
510
|
+
const unattendedRuns = new Set();
|
|
511
|
+
for (const job of inlineResourceJobs) {
|
|
512
|
+
unattendedRuns.add(((_b = job.autoRemediationSuggestionId) === null || _b === void 0 ? void 0 : _b.toString()) || ((_c = job.id) === null || _c === void 0 ? void 0 : _c.toString()) || "");
|
|
513
|
+
}
|
|
514
|
+
for (const round of inFlightRounds) {
|
|
515
|
+
if (isRoundOrderedBefore(round, data.forRound)) {
|
|
516
|
+
unattendedRuns.add(((_d = round.id) === null || _d === void 0 ? void 0 : _d.toString()) || "");
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
// The asking round never counts against itself.
|
|
520
|
+
if (selfId) {
|
|
521
|
+
unattendedRuns.delete(selfId);
|
|
522
|
+
}
|
|
523
|
+
const autoExecutedInWindow = Math.max(settledResourceRounds, unattendedRuns.size);
|
|
524
|
+
return {
|
|
525
|
+
autoExecutedInWindow,
|
|
526
|
+
hasHeadroom: autoExecutedInWindow < MAX_AUTO_EXECUTIONS_PER_RULE_PER_HOUR,
|
|
527
|
+
};
|
|
528
|
+
}
|
|
529
|
+
/*
|
|
530
|
+
* Another AI run that holds this resource right now, or null — the
|
|
531
|
+
* resource sibling of findRoundHoldingCluster, with the same rules: a
|
|
532
|
+
* resource-level round holds its resource while it is still running
|
|
533
|
+
* unattended (only rounds created before the asking one, unless
|
|
534
|
+
* `anyOrder`) and while its executed fix is still being verified,
|
|
535
|
+
* whatever subject it is for; with `subject`, any round of that same
|
|
536
|
+
* signal still composing holds it too. A run that already changed the
|
|
537
|
+
* resource (an inline or approved job there, found through
|
|
538
|
+
* RunnerJob.resourceType/resourceId) holds it while it is still running
|
|
539
|
+
* and while its fix is being verified, whatever its order or mode.
|
|
540
|
+
*
|
|
541
|
+
* Throws on a failed read: callers fail safe to "held".
|
|
542
|
+
*/
|
|
543
|
+
async findRoundHoldingResource(data) {
|
|
544
|
+
var _a, _b, _c, _d;
|
|
545
|
+
const resourceId = new ObjectID(data.resourceId);
|
|
546
|
+
const rows = await AutoRemediationSuggestionService.findBy({
|
|
547
|
+
query: {
|
|
548
|
+
projectId: data.projectId,
|
|
549
|
+
resourceType: data.resourceType,
|
|
550
|
+
resourceId,
|
|
551
|
+
suggestionType: AutoRemediationSuggestionType.CommandPlan,
|
|
552
|
+
status: QueryHelper.any([
|
|
553
|
+
AutoRemediationSuggestionStatus.Planning,
|
|
554
|
+
AutoRemediationSuggestionStatus.AutoExecuted,
|
|
555
|
+
AutoRemediationSuggestionStatus.Approved,
|
|
556
|
+
]),
|
|
557
|
+
createdAt: QueryHelper.greaterThan(OneUptimeDate.getSomeHoursAgo(HELD_ROUND_LOOKBACK_HOURS)),
|
|
558
|
+
},
|
|
559
|
+
select: {
|
|
560
|
+
_id: true,
|
|
561
|
+
status: true,
|
|
562
|
+
executionMode: true,
|
|
563
|
+
verificationStatus: true,
|
|
564
|
+
verificationDeadlineAt: true,
|
|
565
|
+
incidentId: true,
|
|
566
|
+
alertId: true,
|
|
567
|
+
ruleNameSnapshot: true,
|
|
568
|
+
createdAt: true,
|
|
569
|
+
},
|
|
570
|
+
limit: MAX_CLUSTER_ROUND_ROWS,
|
|
571
|
+
skip: 0,
|
|
572
|
+
props: { isRoot: true },
|
|
573
|
+
});
|
|
574
|
+
const selfId = (_a = data.forRound) === null || _a === void 0 ? void 0 : _a.suggestionId.toString();
|
|
575
|
+
for (const row of rows) {
|
|
576
|
+
const rowId = ((_b = row.id) === null || _b === void 0 ? void 0 : _b.toString()) || "";
|
|
577
|
+
if (!rowId || rowId === selfId) {
|
|
578
|
+
continue;
|
|
579
|
+
}
|
|
580
|
+
const hold = this.getHold({
|
|
581
|
+
row,
|
|
582
|
+
rowId,
|
|
583
|
+
hasChangedCluster: false,
|
|
584
|
+
anyOrder: data.anyOrder === true,
|
|
585
|
+
forRound: data.forRound,
|
|
586
|
+
subject: data.subject,
|
|
587
|
+
});
|
|
588
|
+
if (hold) {
|
|
589
|
+
return hold;
|
|
590
|
+
}
|
|
591
|
+
}
|
|
592
|
+
// Runs that changed this resource, found through their jobs on it.
|
|
593
|
+
const seen = new Set(rows.map((row) => {
|
|
594
|
+
var _a;
|
|
595
|
+
return ((_a = row.id) === null || _a === void 0 ? void 0 : _a.toString()) || "";
|
|
596
|
+
}));
|
|
597
|
+
if (selfId) {
|
|
598
|
+
seen.add(selfId);
|
|
599
|
+
}
|
|
600
|
+
const resourceJobs = await RunnerJobService.findBy({
|
|
601
|
+
query: {
|
|
602
|
+
projectId: data.projectId,
|
|
603
|
+
resourceType: data.resourceType,
|
|
604
|
+
resourceId,
|
|
605
|
+
origin: RunnerJobOrigin.AiRemediation,
|
|
606
|
+
createdAt: QueryHelper.greaterThan(OneUptimeDate.getSomeHoursAgo(HELD_ROUND_LOOKBACK_HOURS)),
|
|
607
|
+
},
|
|
608
|
+
select: {
|
|
609
|
+
_id: true,
|
|
610
|
+
autoRemediationSuggestionId: true,
|
|
611
|
+
stepId: true,
|
|
612
|
+
},
|
|
613
|
+
limit: MAX_CLUSTER_ROUND_ROWS,
|
|
614
|
+
skip: 0,
|
|
615
|
+
props: { isRoot: true },
|
|
616
|
+
});
|
|
617
|
+
const changedBy = new Set();
|
|
618
|
+
for (const job of resourceJobs) {
|
|
619
|
+
const suggestionId = ((_c = job.autoRemediationSuggestionId) === null || _c === void 0 ? void 0 : _c.toString()) || "";
|
|
620
|
+
const stepId = job.stepId || "";
|
|
621
|
+
// A rollback job belongs to a fix whose verification already failed.
|
|
622
|
+
const isForwardChange = stepId.startsWith(INLINE_COMMAND_STEP_ID_PREFIX) ||
|
|
623
|
+
stepId.startsWith(APPROVED_COMMAND_STEP_ID_PREFIX);
|
|
624
|
+
if (suggestionId && isForwardChange && !seen.has(suggestionId)) {
|
|
625
|
+
changedBy.add(suggestionId);
|
|
626
|
+
}
|
|
627
|
+
}
|
|
628
|
+
if (changedBy.size === 0) {
|
|
629
|
+
return null;
|
|
630
|
+
}
|
|
631
|
+
const runs = await AutoRemediationSuggestionService.findBy({
|
|
632
|
+
query: {
|
|
633
|
+
projectId: data.projectId,
|
|
634
|
+
_id: QueryHelper.any(Array.from(changedBy)),
|
|
635
|
+
suggestionType: AutoRemediationSuggestionType.CommandPlan,
|
|
636
|
+
status: QueryHelper.any([
|
|
637
|
+
AutoRemediationSuggestionStatus.Planning,
|
|
638
|
+
AutoRemediationSuggestionStatus.AutoExecuted,
|
|
639
|
+
AutoRemediationSuggestionStatus.Approved,
|
|
640
|
+
]),
|
|
641
|
+
},
|
|
642
|
+
select: {
|
|
643
|
+
_id: true,
|
|
644
|
+
status: true,
|
|
645
|
+
executionMode: true,
|
|
646
|
+
verificationStatus: true,
|
|
647
|
+
verificationDeadlineAt: true,
|
|
648
|
+
incidentId: true,
|
|
649
|
+
alertId: true,
|
|
650
|
+
ruleNameSnapshot: true,
|
|
651
|
+
createdAt: true,
|
|
652
|
+
},
|
|
653
|
+
limit: MAX_CLUSTER_ROUND_ROWS,
|
|
654
|
+
skip: 0,
|
|
655
|
+
props: { isRoot: true },
|
|
656
|
+
});
|
|
657
|
+
for (const run of runs) {
|
|
658
|
+
const runId = ((_d = run.id) === null || _d === void 0 ? void 0 : _d.toString()) || "";
|
|
659
|
+
if (!changedBy.has(runId)) {
|
|
660
|
+
continue;
|
|
661
|
+
}
|
|
662
|
+
const hold = this.getHold({
|
|
663
|
+
row: run,
|
|
664
|
+
rowId: runId,
|
|
665
|
+
hasChangedCluster: true,
|
|
666
|
+
anyOrder: data.anyOrder === true,
|
|
667
|
+
forRound: data.forRound,
|
|
668
|
+
subject: data.subject,
|
|
669
|
+
});
|
|
670
|
+
if (hold) {
|
|
671
|
+
return hold;
|
|
672
|
+
}
|
|
673
|
+
}
|
|
674
|
+
return null;
|
|
675
|
+
}
|
|
392
676
|
/*
|
|
393
677
|
* Whether one other run holds the cluster — see findRoundHoldingCluster.
|
|
394
678
|
* `hasChangedCluster`: the run already has a kubectl job on the cluster,
|
|
@@ -575,6 +859,8 @@ class AutoRemediationRuleEngineServiceClass {
|
|
|
575
859
|
_id: true,
|
|
576
860
|
autoRemediationRuleId: true,
|
|
577
861
|
kubernetesClusterId: true,
|
|
862
|
+
resourceType: true,
|
|
863
|
+
resourceId: true,
|
|
578
864
|
},
|
|
579
865
|
limit: MAX_SUGGESTIONS_PER_SUBJECT * 10,
|
|
580
866
|
skip: 0,
|
|
@@ -591,13 +877,32 @@ class AutoRemediationRuleEngineServiceClass {
|
|
|
591
877
|
/*
|
|
592
878
|
* Cluster-level remediation first: an operator who set a mode on the
|
|
593
879
|
* cluster's AI page expressed a more specific intent than any project
|
|
594
|
-
* rule, and it needs no rule to fire.
|
|
880
|
+
* rule, and it needs no rule to fire. It starts nothing on a signal an
|
|
881
|
+
* earlier pass already gave a resource round (one lane per signal).
|
|
882
|
+
*/
|
|
883
|
+
const clusterRoundsStarted = await this.applyClusterLevelRemediation({
|
|
884
|
+
projectId: data.projectId,
|
|
885
|
+
linkage,
|
|
886
|
+
existingSuggestions,
|
|
887
|
+
budget: remainingBudget,
|
|
888
|
+
});
|
|
889
|
+
remainingBudget -= clusterRoundsStarted;
|
|
890
|
+
if (remainingBudget <= 0) {
|
|
891
|
+
return;
|
|
892
|
+
}
|
|
893
|
+
/*
|
|
894
|
+
* Resource-level remediation next, and only when the signal has no
|
|
895
|
+
* cluster round: a resource's AI page expresses the same specific
|
|
896
|
+
* intent a cluster's does, but one signal gets one AI fix lane — two
|
|
897
|
+
* agents changing a cluster and a host for the same signal would each
|
|
898
|
+
* verify and roll back on top of the other's change.
|
|
595
899
|
*/
|
|
596
|
-
remainingBudget -= await this.
|
|
900
|
+
remainingBudget -= await this.applyResourceLevelRemediation({
|
|
597
901
|
projectId: data.projectId,
|
|
598
902
|
linkage,
|
|
599
903
|
existingSuggestions,
|
|
600
904
|
budget: remainingBudget,
|
|
905
|
+
clusterRoundStarted: clusterRoundsStarted > 0,
|
|
601
906
|
});
|
|
602
907
|
if (remainingBudget <= 0) {
|
|
603
908
|
return;
|
|
@@ -859,9 +1164,18 @@ class AutoRemediationRuleEngineServiceClass {
|
|
|
859
1164
|
* cluster or being verified on it asks instead (see
|
|
860
1165
|
* startClusterCommandRun and findRoundHoldingCluster). Returns how much
|
|
861
1166
|
* of the per-subject budget it used.
|
|
1167
|
+
*
|
|
1168
|
+
* One AI fix lane per signal holds both ways: a signal that already has
|
|
1169
|
+
* a resource round (started by an earlier pass, while no linked cluster
|
|
1170
|
+
* was ready) gets no cluster round now — the two would each verify and
|
|
1171
|
+
* roll back on top of the other's change. A signal with no resource
|
|
1172
|
+
* round is unaffected.
|
|
862
1173
|
*/
|
|
863
1174
|
async applyClusterLevelRemediation(data) {
|
|
864
1175
|
let consumed = 0;
|
|
1176
|
+
if (hasResourceRound(data.existingSuggestions)) {
|
|
1177
|
+
return 0;
|
|
1178
|
+
}
|
|
865
1179
|
let statuses = [];
|
|
866
1180
|
try {
|
|
867
1181
|
statuses = await KubernetesClusterAiAccessService.getStatusesForSubject({
|
|
@@ -940,6 +1254,25 @@ class AutoRemediationRuleEngineServiceClass {
|
|
|
940
1254
|
logger.debug(`AutoRemediationRuleEngine: cluster ${data.kubernetesClusterId.toString()} already used ${priorRounds} remediation round(s) on this subject; not asking again.`, { projectId: data.projectId.toString() });
|
|
941
1255
|
return false;
|
|
942
1256
|
}
|
|
1257
|
+
/*
|
|
1258
|
+
* One AI fix lane per signal: a signal whose resource lane holds it
|
|
1259
|
+
* (see applyClusterLevelRemediation) never gets another cluster
|
|
1260
|
+
* round from here either. A signal with no resource round is
|
|
1261
|
+
* unaffected.
|
|
1262
|
+
*/
|
|
1263
|
+
const resourceRounds = await AutoRemediationSuggestionService.findBy({
|
|
1264
|
+
query: Object.assign(Object.assign({}, (linkage.incidentId
|
|
1265
|
+
? { incidentId: linkage.incidentId }
|
|
1266
|
+
: { alertId: linkage.alertId })), { resourceId: QueryHelper.notNull() }),
|
|
1267
|
+
props: { isRoot: true },
|
|
1268
|
+
select: { _id: true, resourceId: true },
|
|
1269
|
+
limit: 1,
|
|
1270
|
+
skip: 0,
|
|
1271
|
+
});
|
|
1272
|
+
if (hasResourceRound(resourceRounds)) {
|
|
1273
|
+
logger.debug(`AutoRemediationRuleEngine: this subject already has a resource AI round; not starting another round on cluster ${data.kubernetesClusterId.toString()}.`, { projectId: data.projectId.toString() });
|
|
1274
|
+
return false;
|
|
1275
|
+
}
|
|
943
1276
|
const status = await KubernetesClusterAiAccessService.getStatusForCluster({
|
|
944
1277
|
clusterId: data.kubernetesClusterId,
|
|
945
1278
|
projectId: data.projectId,
|
|
@@ -1098,6 +1431,253 @@ class AutoRemediationRuleEngineServiceClass {
|
|
|
1098
1431
|
});
|
|
1099
1432
|
return true;
|
|
1100
1433
|
}
|
|
1434
|
+
/*
|
|
1435
|
+
* Resource-level remediation: the signal is linked to infrastructure
|
|
1436
|
+
* resources (Docker and Podman hosts, Docker Swarm, Proxmox, VMware and
|
|
1437
|
+
* Ceph clusters, database servers, hosts) and a resource's AI page lets AI
|
|
1438
|
+
* fix it. The first eligible resource — in ALL_AI_RESOURCE_TYPES order,
|
|
1439
|
+
* with fixes on (mode not Disabled) and remediation ready — gets ONE AI
|
|
1440
|
+
* command run with that resource as its only target, exactly as a
|
|
1441
|
+
* cluster's round does: Automatic runs its first round FullAuto (safe
|
|
1442
|
+
* changes, and allowlisted riskier ones, without a human; a riskier fix is
|
|
1443
|
+
* proposed), BypassApproval runs every round FullAuto (what the policy
|
|
1444
|
+
* says always needs a human still asks), RequireApproval runs Suggest.
|
|
1445
|
+
*
|
|
1446
|
+
* One resource lane per signal, and only when the signal has no cluster
|
|
1447
|
+
* round (started now or earlier): a cluster round is the more established
|
|
1448
|
+
* lane, and two AI rounds fixing different parts of one signal would each
|
|
1449
|
+
* verify and roll back on top of the other. Returns how much of the
|
|
1450
|
+
* per-subject budget it used (0 or 1). Never throws.
|
|
1451
|
+
*/
|
|
1452
|
+
async applyResourceLevelRemediation(data) {
|
|
1453
|
+
if (data.budget <= 0 || data.clusterRoundStarted) {
|
|
1454
|
+
return 0;
|
|
1455
|
+
}
|
|
1456
|
+
const hasOtherAiRound = data.existingSuggestions.some((suggestion) => {
|
|
1457
|
+
return Boolean(suggestion.kubernetesClusterId || suggestion.resourceId);
|
|
1458
|
+
});
|
|
1459
|
+
if (hasOtherAiRound) {
|
|
1460
|
+
return 0;
|
|
1461
|
+
}
|
|
1462
|
+
let statuses = [];
|
|
1463
|
+
try {
|
|
1464
|
+
statuses = await ResourceAiAccessService.getStatusesForSubject({
|
|
1465
|
+
projectId: data.projectId,
|
|
1466
|
+
incidentId: data.linkage.incidentId,
|
|
1467
|
+
alertId: data.linkage.alertId,
|
|
1468
|
+
});
|
|
1469
|
+
}
|
|
1470
|
+
catch (error) {
|
|
1471
|
+
logger.error(`AutoRemediationRuleEngine: could not resolve infrastructure access for the subject; skipping resource-level remediation: ${error}`, { projectId: data.projectId.toString() });
|
|
1472
|
+
return 0;
|
|
1473
|
+
}
|
|
1474
|
+
const eligible = statuses
|
|
1475
|
+
.filter((status) => {
|
|
1476
|
+
return (isAiResourceType(status.resourceType) &&
|
|
1477
|
+
status.aiRemediationMode !== ResourceAiRemediationMode.Disabled &&
|
|
1478
|
+
status.isRemediationReady);
|
|
1479
|
+
})
|
|
1480
|
+
.sort((a, b) => {
|
|
1481
|
+
return (ALL_AI_RESOURCE_TYPES.indexOf(a.resourceType) -
|
|
1482
|
+
ALL_AI_RESOURCE_TYPES.indexOf(b.resourceType));
|
|
1483
|
+
})[0];
|
|
1484
|
+
if (!eligible) {
|
|
1485
|
+
return 0;
|
|
1486
|
+
}
|
|
1487
|
+
try {
|
|
1488
|
+
const started = await this.startResourceCommandRun({
|
|
1489
|
+
projectId: data.projectId,
|
|
1490
|
+
resource: eligible,
|
|
1491
|
+
linkage: data.linkage,
|
|
1492
|
+
round: 1,
|
|
1493
|
+
});
|
|
1494
|
+
return started ? 1 : 0;
|
|
1495
|
+
}
|
|
1496
|
+
catch (error) {
|
|
1497
|
+
logger.error(`AutoRemediationRuleEngine: could not start resource-level remediation for ${eligible.resourceType} ${eligible.resourceId}: ${error}`, { projectId: data.projectId.toString() });
|
|
1498
|
+
return 0;
|
|
1499
|
+
}
|
|
1500
|
+
}
|
|
1501
|
+
/*
|
|
1502
|
+
* A follow-up round after a resource plan ran and verification failed —
|
|
1503
|
+
* startFollowUpClusterRemediation for a resource: Suggest for
|
|
1504
|
+
* RequireApproval and Automatic resources, unattended again for
|
|
1505
|
+
* BypassApproval ones, capped by MAX_RESOURCE_REMEDIATION_ROUNDS_PER_SUBJECT,
|
|
1506
|
+
* and asking first whatever the mode when `forceSuggest` is set (the
|
|
1507
|
+
* failed round's rollback did not complete). Called by the verifier;
|
|
1508
|
+
* never throws.
|
|
1509
|
+
*/
|
|
1510
|
+
async startFollowUpResourceRemediation(data) {
|
|
1511
|
+
try {
|
|
1512
|
+
if (!isAiResourceType(data.resourceType)) {
|
|
1513
|
+
return false;
|
|
1514
|
+
}
|
|
1515
|
+
const project = await ProjectService.findOneById({
|
|
1516
|
+
id: data.projectId,
|
|
1517
|
+
select: { enableAutoRemediation: true },
|
|
1518
|
+
props: { isRoot: true },
|
|
1519
|
+
});
|
|
1520
|
+
if (!project || project.enableAutoRemediation === false) {
|
|
1521
|
+
return false;
|
|
1522
|
+
}
|
|
1523
|
+
const linkage = {
|
|
1524
|
+
incidentId: data.incidentId,
|
|
1525
|
+
alertId: data.alertId,
|
|
1526
|
+
};
|
|
1527
|
+
if (!linkage.incidentId && !linkage.alertId) {
|
|
1528
|
+
return false;
|
|
1529
|
+
}
|
|
1530
|
+
const priorRounds = (await AutoRemediationSuggestionService.countBy({
|
|
1531
|
+
query: Object.assign(Object.assign({}, (linkage.incidentId
|
|
1532
|
+
? { incidentId: linkage.incidentId }
|
|
1533
|
+
: { alertId: linkage.alertId })), { resourceType: data.resourceType, resourceId: data.resourceId }),
|
|
1534
|
+
props: { isRoot: true },
|
|
1535
|
+
})).toNumber();
|
|
1536
|
+
if (priorRounds >= MAX_RESOURCE_REMEDIATION_ROUNDS_PER_SUBJECT) {
|
|
1537
|
+
logger.debug(`AutoRemediationRuleEngine: ${data.resourceType} ${data.resourceId.toString()} already used ${priorRounds} remediation round(s) on this subject; not asking again.`, { projectId: data.projectId.toString() });
|
|
1538
|
+
return false;
|
|
1539
|
+
}
|
|
1540
|
+
const status = await ResourceAiAccessService.getStatusForResource({
|
|
1541
|
+
projectId: data.projectId,
|
|
1542
|
+
resourceType: data.resourceType,
|
|
1543
|
+
resourceId: data.resourceId,
|
|
1544
|
+
});
|
|
1545
|
+
if (!status ||
|
|
1546
|
+
!status.isRemediationReady ||
|
|
1547
|
+
status.aiRemediationMode === ResourceAiRemediationMode.Disabled) {
|
|
1548
|
+
return false;
|
|
1549
|
+
}
|
|
1550
|
+
return await this.startResourceCommandRun({
|
|
1551
|
+
projectId: data.projectId,
|
|
1552
|
+
resource: status,
|
|
1553
|
+
linkage,
|
|
1554
|
+
round: priorRounds + 1,
|
|
1555
|
+
askFirstReason: data.forceSuggest === true
|
|
1556
|
+
? data.forceSuggestReason ||
|
|
1557
|
+
"the previous fix's rollback did not complete, so its change may still be applied"
|
|
1558
|
+
: undefined,
|
|
1559
|
+
});
|
|
1560
|
+
}
|
|
1561
|
+
catch (error) {
|
|
1562
|
+
logger.error(`AutoRemediationRuleEngine: follow-up resource remediation failed: ${error}`, { projectId: data.projectId.toString() });
|
|
1563
|
+
return false;
|
|
1564
|
+
}
|
|
1565
|
+
}
|
|
1566
|
+
/*
|
|
1567
|
+
* startClusterCommandRun for a resource: the suggestion carries the
|
|
1568
|
+
* resource's type and id, its snapshot mode follows the same rules
|
|
1569
|
+
* (unattended for BypassApproval, and for Automatic on round 1 only;
|
|
1570
|
+
* asking first when another round holds the resource or that cannot be
|
|
1571
|
+
* checked), and the feed says exactly what the round does.
|
|
1572
|
+
*/
|
|
1573
|
+
async startResourceCommandRun(data) {
|
|
1574
|
+
const { resource } = data;
|
|
1575
|
+
const noun = describeResourceNoun(resource.resourceType);
|
|
1576
|
+
const label = describeResourceForFeed(resource);
|
|
1577
|
+
const agentName = AI_RESOURCE_TYPE_INFO[resource.resourceType].agentDisplayName;
|
|
1578
|
+
const isBypass = resource.aiRemediationMode === ResourceAiRemediationMode.BypassApproval;
|
|
1579
|
+
const wantsUnattended = doesResourceModeRunRoundUnattended(resource.aiRemediationMode, data.round);
|
|
1580
|
+
let askFirstReason = data.askFirstReason || null;
|
|
1581
|
+
// One unattended round per resource at a time (see startClusterCommandRun).
|
|
1582
|
+
if (wantsUnattended && !askFirstReason) {
|
|
1583
|
+
try {
|
|
1584
|
+
const hold = await this.findRoundHoldingResource({
|
|
1585
|
+
projectId: data.projectId,
|
|
1586
|
+
resourceType: resource.resourceType,
|
|
1587
|
+
resourceId: resource.resourceId,
|
|
1588
|
+
anyOrder: true,
|
|
1589
|
+
});
|
|
1590
|
+
if (hold) {
|
|
1591
|
+
askFirstReason = `another OneUptime AI round on this ${noun} ${hold.description}`;
|
|
1592
|
+
}
|
|
1593
|
+
}
|
|
1594
|
+
catch (error) {
|
|
1595
|
+
logger.error(`AutoRemediationRuleEngine: could not check ${resource.resourceType} ${resource.resourceId} for another AI round in flight; this round asks first: ${error}`, { projectId: data.projectId.toString() });
|
|
1596
|
+
askFirstReason = `OneUptime AI could not confirm that no other AI round is changing this ${noun}`;
|
|
1597
|
+
}
|
|
1598
|
+
}
|
|
1599
|
+
const isAutomatic = wantsUnattended && !askFirstReason;
|
|
1600
|
+
const suggestion = new AutoRemediationSuggestion();
|
|
1601
|
+
suggestion.projectId = data.projectId;
|
|
1602
|
+
suggestion.resourceType = resource.resourceType;
|
|
1603
|
+
suggestion.resourceId = new ObjectID(resource.resourceId);
|
|
1604
|
+
suggestion.ruleNameSnapshot = getResourceRoundNameSnapshot(resource.resourceType, resource.resourceName, data.round);
|
|
1605
|
+
suggestion.status = AutoRemediationSuggestionStatus.Planning;
|
|
1606
|
+
suggestion.suggestionType = AutoRemediationSuggestionType.CommandPlan;
|
|
1607
|
+
suggestion.executionMode = isAutomatic
|
|
1608
|
+
? AutoRemediationExecutionMode.FullAuto
|
|
1609
|
+
: AutoRemediationExecutionMode.Suggest;
|
|
1610
|
+
suggestion.verificationWindowMinutes = DEFAULT_VERIFICATION_WINDOW_MINUTES;
|
|
1611
|
+
// Closed loop only when nobody approves: the human resolves otherwise.
|
|
1612
|
+
suggestion.autoResolveOnRecovery = isAutomatic;
|
|
1613
|
+
if (data.linkage.incidentId) {
|
|
1614
|
+
suggestion.incidentId = data.linkage.incidentId;
|
|
1615
|
+
}
|
|
1616
|
+
if (data.linkage.alertId) {
|
|
1617
|
+
suggestion.alertId = data.linkage.alertId;
|
|
1618
|
+
}
|
|
1619
|
+
const created = await AutoRemediationSuggestionService.create({
|
|
1620
|
+
data: suggestion,
|
|
1621
|
+
props: { isRoot: true },
|
|
1622
|
+
});
|
|
1623
|
+
const aiRunId = await AIInvestigationQueue.enqueue({
|
|
1624
|
+
projectId: data.projectId,
|
|
1625
|
+
subjectIncidentId: data.linkage.incidentId,
|
|
1626
|
+
subjectAlertId: data.linkage.alertId,
|
|
1627
|
+
subjectAutoRemediationSuggestionId: created.id,
|
|
1628
|
+
remediationRunType: AIRunType.RemediationExecution,
|
|
1629
|
+
});
|
|
1630
|
+
if (!aiRunId) {
|
|
1631
|
+
await AutoRemediationSuggestionService.updateOneById({
|
|
1632
|
+
id: created.id,
|
|
1633
|
+
data: {
|
|
1634
|
+
status: AutoRemediationSuggestionStatus.NoneApplicable,
|
|
1635
|
+
rationaleMarkdown: "The AI remediation run could not be started — the daily autonomous AI budget is exhausted or no run could be queued. Re-enable by raising the budget or waiting for the daily reset.",
|
|
1636
|
+
},
|
|
1637
|
+
props: { isRoot: true },
|
|
1638
|
+
});
|
|
1639
|
+
return false;
|
|
1640
|
+
}
|
|
1641
|
+
await AutoRemediationSuggestionService.updateOneById({
|
|
1642
|
+
id: created.id,
|
|
1643
|
+
data: { aiRunId },
|
|
1644
|
+
props: { isRoot: true },
|
|
1645
|
+
});
|
|
1646
|
+
/*
|
|
1647
|
+
* The feed states exactly what this round does, in the terms of the
|
|
1648
|
+
* canonical ResourceAiRemediationMode comment — the resource wording of
|
|
1649
|
+
* startClusterCommandRun's announcement.
|
|
1650
|
+
*/
|
|
1651
|
+
const proposalSentence = getResourceRoundProposalFeedSentence(noun);
|
|
1652
|
+
let markdown;
|
|
1653
|
+
if (wantsUnattended && askFirstReason) {
|
|
1654
|
+
markdown = `⚡ **OneUptime AI is composing ${data.round > 1 ? "another" : "a"} fix for ${label}**${data.round > 1
|
|
1655
|
+
? ` (round ${data.round}) — the previous fix did not recover the service`
|
|
1656
|
+
: ""}. This round asks first because ${askFirstReason}: nothing runs until you approve the plan, which will appear here shortly.`;
|
|
1657
|
+
}
|
|
1658
|
+
else if (isBypass) {
|
|
1659
|
+
markdown =
|
|
1660
|
+
data.round > 1
|
|
1661
|
+
? `⚡ **OneUptime AI is applying another fix on ${label}** (round ${data.round}) — the previous fix did not recover the service. Approvals are bypassed for this ${noun}, so the new fix runs on its own through its ${agentName}: every change the command policy allows, safe or riskier — except that ${RESOURCE_ALWAYS_ASKS_SUMMARY}, so AI proposes such a change for your approval; destructive commands never run. ${proposalSentence} Progress appears here.`
|
|
1662
|
+
: `⚡ **OneUptime AI is fixing ${label}.** Approvals are bypassed for this ${noun}: AI is diagnosing through its ${agentName} and will apply whatever fix the command policy allows — safe or riskier — on its own, without asking, except that ${RESOURCE_ALWAYS_ASKS_SUMMARY}, so AI proposes such a change for your approval; destructive commands never run. ${proposalSentence} Progress appears here.`;
|
|
1663
|
+
}
|
|
1664
|
+
else if (isAutomatic) {
|
|
1665
|
+
markdown = `⚡ **OneUptime AI is fixing ${label}.** Automatic remediation is on for this ${noun}: AI is diagnosing through its ${agentName} and will apply safe changes (${RESOURCE_SAFE_CHANGES_SUMMARY}), plus riskier changes whose shape the ${noun}'s command allowlist names, on its own. A riskier change never runs on its own otherwise: if the round finds only riskier fixes, AI proposes exactly those for your one-click approval; if it also applied safe changes, a riskier fix is proposed only if verification shows the service did not recover. ${capitalizeFirst(RESOURCE_ALWAYS_ASKS_SUMMARY)}, and destructive commands never run. ${proposalSentence} Progress appears here.`;
|
|
1666
|
+
}
|
|
1667
|
+
else {
|
|
1668
|
+
markdown =
|
|
1669
|
+
data.round > 1
|
|
1670
|
+
? `⚡ **OneUptime AI is composing another fix for ${label}** (round ${data.round}) — the previous fix did not recover the service. This round asks first: nothing runs until you approve the new plan, which will appear here shortly.`
|
|
1671
|
+
: `⚡ **OneUptime AI is composing a fix for ${label}.** Nothing runs until you approve the plan — it will appear here shortly.`;
|
|
1672
|
+
}
|
|
1673
|
+
await this.postFeedItem({
|
|
1674
|
+
projectId: data.projectId,
|
|
1675
|
+
linkage: data.linkage,
|
|
1676
|
+
markdown,
|
|
1677
|
+
pingWorkspace: false,
|
|
1678
|
+
});
|
|
1679
|
+
return true;
|
|
1680
|
+
}
|
|
1101
1681
|
/*
|
|
1102
1682
|
* AI path: create a Planning suggestion and enqueue a RemediationPlan run
|
|
1103
1683
|
* on the durable AI queue. The planning runner fills in the picked runbook
|
|
@@ -1612,6 +2192,18 @@ __decorate([
|
|
|
1612
2192
|
__metadata("design:paramtypes", [Object]),
|
|
1613
2193
|
__metadata("design:returntype", Promise)
|
|
1614
2194
|
], AutoRemediationRuleEngineServiceClass.prototype, "findRoundHoldingCluster", null);
|
|
2195
|
+
__decorate([
|
|
2196
|
+
CaptureSpan(),
|
|
2197
|
+
__metadata("design:type", Function),
|
|
2198
|
+
__metadata("design:paramtypes", [Object]),
|
|
2199
|
+
__metadata("design:returntype", Promise)
|
|
2200
|
+
], AutoRemediationRuleEngineServiceClass.prototype, "getResourceBreakerState", null);
|
|
2201
|
+
__decorate([
|
|
2202
|
+
CaptureSpan(),
|
|
2203
|
+
__metadata("design:type", Function),
|
|
2204
|
+
__metadata("design:paramtypes", [Object]),
|
|
2205
|
+
__metadata("design:returntype", Promise)
|
|
2206
|
+
], AutoRemediationRuleEngineServiceClass.prototype, "findRoundHoldingResource", null);
|
|
1615
2207
|
__decorate([
|
|
1616
2208
|
CaptureSpan(),
|
|
1617
2209
|
__metadata("design:type", Function),
|
|
@@ -1648,6 +2240,12 @@ __decorate([
|
|
|
1648
2240
|
__metadata("design:paramtypes", [Object]),
|
|
1649
2241
|
__metadata("design:returntype", Promise)
|
|
1650
2242
|
], AutoRemediationRuleEngineServiceClass.prototype, "startFollowUpClusterRemediation", null);
|
|
2243
|
+
__decorate([
|
|
2244
|
+
CaptureSpan(),
|
|
2245
|
+
__metadata("design:type", Function),
|
|
2246
|
+
__metadata("design:paramtypes", [Object]),
|
|
2247
|
+
__metadata("design:returntype", Promise)
|
|
2248
|
+
], AutoRemediationRuleEngineServiceClass.prototype, "startFollowUpResourceRemediation", null);
|
|
1651
2249
|
const AutoRemediationRuleEngineService = new AutoRemediationRuleEngineServiceClass();
|
|
1652
2250
|
export default AutoRemediationRuleEngineService;
|
|
1653
2251
|
//# sourceMappingURL=AutoRemediationRuleEngineService.js.map
|