@oneuptime/common 14.0.1 → 14.0.3
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/AlertEpisodeMember.ts +8 -1
- package/Models/DatabaseModels/AlertFeed.ts +2 -0
- package/Models/DatabaseModels/AutoRemediationSuggestion.ts +63 -0
- package/Models/DatabaseModels/IncidentAlert.ts +540 -0
- package/Models/DatabaseModels/IncidentEpisodeMember.ts +8 -1
- package/Models/DatabaseModels/IncidentEpisodePublicNote.ts +9 -2
- package/Models/DatabaseModels/IncidentFeed.ts +2 -0
- package/Models/DatabaseModels/IncidentPublicNote.ts +9 -2
- package/Models/DatabaseModels/Index.ts +2 -0
- package/Models/DatabaseModels/KubernetesCluster.ts +429 -0
- package/Models/DatabaseModels/Monitor.ts +48 -0
- package/Models/DatabaseModels/Project.ts +60 -0
- package/Models/DatabaseModels/RumApplication.ts +52 -1
- package/Models/DatabaseModels/Runner.ts +5 -4
- package/Models/DatabaseModels/RunnerJob.ts +66 -0
- package/Models/DatabaseModels/ScheduledMaintenancePublicNote.ts +10 -2
- package/Models/DatabaseModels/WorkflowVariable.ts +479 -2
- package/Models/DatabaseModels/WorkspaceProjectAuthToken.ts +79 -25
- package/Server/API/AIInvestigationAPI.ts +341 -0
- package/Server/API/AutoRemediationAPI.ts +184 -2
- package/Server/API/CommonAPI.ts +70 -0
- package/Server/API/KubernetesClusterAiAccessAPI.ts +793 -0
- package/Server/API/MicrosoftTeamsAPI.ts +770 -315
- package/Server/API/MonitorAPI.ts +140 -0
- package/Server/API/OnCallScheduleTimelineAPI.ts +5 -21
- package/Server/API/SlackAPI.ts +447 -99
- package/Server/API/StatusPageAPI.ts +146 -26
- package/Server/API/TelemetryAPI.ts +216 -5
- package/Server/API/UserTwoFactorBackupCodeAPI.ts +1 -0
- package/Server/API/WorkflowVariableAPI.ts +156 -0
- package/Server/Infrastructure/GlobalCache.ts +35 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1794300000000-AddOAuth2WorkflowVariables.ts +97 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1794400000000-AddKubernetesClusterAiAccess.ts +129 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1794500000000-AddIncomingEmailCustomAddressToMonitor.ts +25 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1794600000000-AddAuthTokenExpiresAtToWorkspaceProjectAuthToken.ts +20 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1794700000000-RemoveAppAccessTokenFromWorkspaceProjectAuthTokenMiscData.ts +38 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1794800000000-AddSessionReplaySameOriginTracePropagation.ts +28 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1794900000000-AddIncidentAlert.ts +89 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +14 -0
- package/Server/Middleware/MasterAdminAuthorization.ts +28 -0
- package/Server/Middleware/TelemetryIngest.ts +47 -2
- package/Server/Middleware/UserAuthorization.ts +56 -2
- package/Server/Services/AIAgentService.ts +1 -0
- package/Server/Services/AccessTokenService.ts +121 -48
- package/Server/Services/AlertEpisodeMemberService.ts +9 -0
- package/Server/Services/AlertEpisodeService.ts +14 -1
- package/Server/Services/AlertService.ts +134 -22
- package/Server/Services/AutoRemediationRuleEngineService.ts +968 -39
- package/Server/Services/AutoRemediationRuleService.ts +118 -0
- package/Server/Services/BillingService.ts +1 -0
- package/Server/Services/InboundEmail/Providers/SendGridInboundProvider.ts +16 -22
- package/Server/Services/IncidentAlertService.ts +1811 -0
- package/Server/Services/IncidentEpisodeMemberService.ts +9 -0
- package/Server/Services/IncidentEpisodePublicNoteService.ts +66 -0
- package/Server/Services/IncidentEpisodeRoleMemberService.ts +27 -0
- package/Server/Services/IncidentEpisodeService.ts +14 -1
- package/Server/Services/IncidentGroupingEngineService.ts +11 -0
- package/Server/Services/IncidentMemberService.ts +21 -0
- package/Server/Services/IncidentPublicNoteService.ts +63 -0
- package/Server/Services/IncidentService.ts +330 -30
- package/Server/Services/IncidentStateTimelineService.ts +39 -0
- package/Server/Services/IncidentTemplateService.ts +83 -3
- package/Server/Services/Index.ts +2 -0
- package/Server/Services/KubernetesClusterAiAccessService.ts +1943 -0
- package/Server/Services/KubernetesClusterService.ts +1570 -1
- package/Server/Services/LogAggregationService.ts +14 -6
- package/Server/Services/MonitorService.ts +651 -52
- package/Server/Services/MonitorStatusTimelineService.ts +639 -2
- package/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.ts +2 -0
- package/Server/Services/OnCallDutyPolicyEscalationRuleTeamService.ts +2 -0
- package/Server/Services/OnCallDutyPolicyEscalationRuleUserService.ts +2 -0
- package/Server/Services/OnCallDutyPolicyScheduleService.ts +3 -0
- package/Server/Services/OnCallNotificationAlertingService.ts +36 -12
- package/Server/Services/OnCallSetupReminderService.ts +1 -0
- package/Server/Services/ProbeService.ts +7 -1
- package/Server/Services/ProjectService.ts +11 -1
- package/Server/Services/RunbookCredentialService.ts +26 -1
- package/Server/Services/RunbookSecretService.ts +36 -0
- package/Server/Services/RunnerJobService.ts +941 -23
- package/Server/Services/RunnerService.ts +439 -6
- package/Server/Services/ScheduledMaintenancePublicNoteService.ts +66 -0
- package/Server/Services/ScheduledMaintenanceService.ts +124 -19
- package/Server/Services/ScheduledMaintenanceTemplateService.ts +82 -3
- package/Server/Services/ServiceLevelObjectiveService.ts +14 -1
- package/Server/Services/StatusPagePrivateUserService.ts +1 -0
- package/Server/Services/StatusPageService.ts +301 -74
- package/Server/Services/StatusPageSubscriberService.ts +4 -0
- package/Server/Services/TeamMemberService.ts +309 -7
- package/Server/Services/TraceAggregationService.ts +10 -6
- package/Server/Services/UserEmailService.ts +1 -0
- package/Server/Services/UserNotificationMethodAdminService.ts +1 -0
- package/Server/Services/UserNotificationRuleAdminService.ts +1 -0
- package/Server/Services/UserNotificationRuleService.ts +4 -0
- package/Server/Services/UserService.ts +122 -1
- package/Server/Services/WorkflowVariableService.ts +593 -8
- package/Server/Services/WorkspaceNotificationRuleService.ts +588 -8
- package/Server/Services/WorkspaceProjectAuthTokenService.ts +170 -1
- package/Server/Types/Database/QueryHelper.ts +22 -0
- package/Server/Types/Markdown.ts +502 -27
- package/Server/Utils/AI/ClusterAccess/ClusterAccessContext.ts +182 -0
- package/Server/Utils/AI/ClusterAccess/KubectlInvestigationToolkit.ts +525 -0
- package/Server/Utils/AI/ClusterAccess/KubectlJobRunner.ts +854 -0
- package/Server/Utils/AI/CodeFix/CodeFixAgentAuth.ts +22 -2
- package/Server/Utils/AI/Remediation/RemediationCommandTools.ts +1916 -307
- package/Server/Utils/AI/Remediation/RemediationExecutionRunner.ts +1601 -74
- package/Server/Utils/AI/SRE/AIInvestigationEngine.ts +139 -7
- package/Server/Utils/AI/SRE/AlertInvestigationRunner.ts +58 -1
- package/Server/Utils/AI/SRE/IncidentInvestigationRunner.ts +54 -1
- package/Server/Utils/AI/Toolbox/AIActionTools.ts +14 -6
- package/Server/Utils/AI/Toolbox/ResourceTools.ts +4 -2
- package/Server/Utils/AutoRemediation/CommandPlanExecutor.ts +1341 -150
- package/Server/Utils/AutoRemediation/RemediationVerifier.ts +375 -4
- package/Server/Utils/Database/AffectedResourceRelations.ts +127 -0
- package/Server/Utils/Database/ProjectScopedReferenceValidator.ts +240 -1
- package/Server/Utils/EmailRollup/EmailRollupFlushRunner.ts +1 -0
- package/Server/Utils/Monitor/MonitorAlert.ts +83 -9
- package/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.ts +5 -1
- package/Server/Utils/Monitor/MonitorIncident.ts +104 -9
- package/Server/Utils/Monitor/MonitorPayloadRedaction.ts +124 -7
- package/Server/Utils/Monitor/ProbeMonitorsNotification.ts +407 -0
- package/Server/Utils/OnCall/OnCallShiftReminderRunner.ts +1 -0
- package/Server/Utils/PushNotificationUtil.ts +45 -0
- package/Server/Utils/Rules/OwnerRuleAssignment.ts +40 -3
- package/Server/Utils/Runbook/RunbookExecutePermission.ts +56 -6
- package/Server/Utils/SessionReplay/SessionReplayGateCache.ts +24 -2
- package/Server/Utils/SessionReplay/SessionReplayReadService.ts +223 -33
- package/Server/Utils/SessionReplay/SessionReplayUserFlowReadService.ts +559 -0
- package/Server/Utils/StartServer.ts +4 -3
- package/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.ts +528 -0
- package/Server/Utils/TwoFactorBackupCodeNotification.ts +1 -0
- package/Server/Utils/UserPermission/UserPermission.ts +16 -0
- package/Server/Utils/Workflow/OAuth2TokenClient.ts +704 -0
- package/Server/Utils/Workflow/WorkflowVariableOAuthToken.ts +318 -0
- package/Server/Utils/Workspace/MicrosoftTeams/Actions/Alert.ts +47 -7
- package/Server/Utils/Workspace/MicrosoftTeams/Actions/AlertEpisode.ts +57 -16
- package/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.ts +193 -214
- package/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.ts +57 -13
- package/Server/Utils/Workspace/MicrosoftTeams/Actions/Monitor.ts +54 -17
- package/Server/Utils/Workspace/MicrosoftTeams/Actions/ScheduledMaintenance.ts +179 -161
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +281 -167
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsServiceUrl.ts +114 -0
- package/Server/Utils/Workspace/MicrosoftTeams/ReactionNoteSync.ts +895 -0
- package/Server/Utils/Workspace/Slack/Actions/ActionTypes.ts +7 -9
- package/Server/Utils/Workspace/Slack/Actions/Alert.ts +96 -227
- package/Server/Utils/Workspace/Slack/Actions/AlertEpisode.ts +93 -214
- package/Server/Utils/Workspace/Slack/Actions/Auth.ts +30 -3
- package/Server/Utils/Workspace/Slack/Actions/Authorization.ts +99 -0
- package/Server/Utils/Workspace/Slack/Actions/Incident.ts +117 -283
- package/Server/Utils/Workspace/Slack/Actions/IncidentEpisode.ts +101 -196
- package/Server/Utils/Workspace/Slack/Actions/ReactionNote.ts +329 -0
- package/Server/Utils/Workspace/Slack/Actions/ScheduledMaintenance.ts +111 -287
- package/Server/Utils/Workspace/Slack/Slack.ts +86 -17
- package/Server/Utils/Workspace/Slack/app-manifest.json +2 -0
- package/Server/Utils/Workspace/Workspace.ts +171 -54
- package/Server/Utils/Workspace/WorkspaceActionAuthorization.ts +252 -0
- package/Server/Utils/Workspace/WorkspaceBase.ts +39 -0
- package/Server/Utils/Workspace/WorkspaceOAuthState.ts +280 -0
- package/Server/Utils/Workspace/WorkspaceProjectReferenceValidator.ts +96 -0
- package/Server/Utils/Workspace/WorkspaceReactionNote.ts +620 -0
- package/Tests/App/Dashboard/AttributesJSONDashboardSurfaces.test.tsx +496 -0
- package/Tests/App/Dashboard/AutoRemediationRulesTableCommandRunners.test.tsx +152 -0
- package/Tests/App/Dashboard/BreadcrumbCoverage.test.tsx +32 -0
- package/Tests/App/Dashboard/BulkIncidentLinkActions.test.tsx +869 -0
- package/Tests/App/Dashboard/CephMetricTooltips.test.tsx +1777 -0
- package/Tests/App/Dashboard/CloudFleetSummary.test.ts +8 -0
- package/Tests/App/Dashboard/CloudMetricTooltips.test.tsx +887 -0
- package/Tests/App/Dashboard/ClusterAccessNotice.test.tsx +794 -0
- package/Tests/App/Dashboard/ContainerHostMetricTooltips.test.tsx +1309 -0
- package/Tests/App/Dashboard/CreateOAuthWorkflowVariableModal.test.tsx +840 -0
- package/Tests/App/Dashboard/CreateWorkflowModal.test.tsx +653 -0
- package/Tests/App/Dashboard/DatabaseMonitorStepForm.test.tsx +197 -0
- package/Tests/App/Dashboard/DatabaseMonitorView.test.tsx +376 -0
- package/Tests/App/Dashboard/DisabledWarningRobustness.test.tsx +262 -0
- package/Tests/App/Dashboard/DiscoveryScanLivePage.test.tsx +39 -0
- package/Tests/App/Dashboard/DockerSwarmClustersListTooltips.test.tsx +414 -0
- package/Tests/App/Dashboard/DockerSwarmMetricTooltips.test.ts +796 -0
- package/Tests/App/Dashboard/DockerSwarmOverviewTooltips.test.tsx +747 -0
- package/Tests/App/Dashboard/EventNotes.test.tsx +2080 -0
- package/Tests/App/Dashboard/EventNotesPages.test.tsx +486 -0
- package/Tests/App/Dashboard/EventNotesUtil.test.ts +933 -0
- package/Tests/App/Dashboard/ExceptionMonitorEnvironmentFilter.test.tsx +238 -0
- package/Tests/App/Dashboard/HostDetailViewTooltips.test.tsx +725 -0
- package/Tests/App/Dashboard/HostListColumnTooltips.test.tsx +472 -0
- package/Tests/App/Dashboard/HostMetricTooltips.test.ts +709 -0
- package/Tests/App/Dashboard/HostOverviewTooltips.test.tsx +698 -0
- package/Tests/App/Dashboard/HostTooltipHarness.ts +124 -0
- package/Tests/App/Dashboard/HostsListTooltips.test.tsx +395 -0
- package/Tests/App/Dashboard/IncidentAlertLinkDialog.test.tsx +691 -0
- package/Tests/App/Dashboard/IncidentAlertLinkHelpers.test.ts +458 -0
- package/Tests/App/Dashboard/IncidentAlertLinkPages.test.tsx +828 -0
- package/Tests/App/Dashboard/IncidentAlertLinkSideMenus.test.tsx +231 -0
- package/Tests/App/Dashboard/IncidentChangeStateNotifyDefault.test.tsx +665 -0
- package/Tests/App/Dashboard/IncidentCreateFromAlerts.test.tsx +689 -0
- package/Tests/App/Dashboard/IncidentEpisodeFeedPublicNoteNotifyDefault.test.tsx +494 -0
- package/Tests/App/Dashboard/IncidentEpisodeOverviewNotifyDefault.test.tsx +706 -0
- package/Tests/App/Dashboard/IncidentFeedPublicNoteNotifyDefault.test.tsx +472 -0
- package/Tests/App/Dashboard/IncidentOverviewNotifyDefault.test.tsx +858 -0
- package/Tests/App/Dashboard/IncomingEmailAddressSettings.test.tsx +567 -0
- package/Tests/App/Dashboard/InvestigationClusterToolFormat.test.ts +241 -0
- package/Tests/App/Dashboard/InvestigationEvidenceKubectl.test.tsx +322 -0
- package/Tests/App/Dashboard/InvestigationPanel.test.tsx +12 -0
- package/Tests/App/Dashboard/InvestigationPanelClusterAccess.test.tsx +476 -0
- package/Tests/App/Dashboard/InvestigationRunDetailsKubectl.test.tsx +383 -0
- package/Tests/App/Dashboard/IoTMetricTooltips.test.tsx +1123 -0
- package/Tests/App/Dashboard/KubectlActivitySummary.test.tsx +366 -0
- package/Tests/App/Dashboard/KubernetesClusterAiAccessSettings.test.ts +2886 -0
- package/Tests/App/Dashboard/KubernetesClusterAiPage.test.tsx +2688 -0
- package/Tests/App/Dashboard/KubernetesClusterAiPageServerParity.test.ts +915 -0
- package/Tests/App/Dashboard/KubernetesClusterMetricTooltips.test.ts +837 -0
- package/Tests/App/Dashboard/KubernetesClusterOverviewTooltips.test.tsx +699 -0
- package/Tests/App/Dashboard/KubernetesContainersTabTooltips.test.tsx +320 -0
- package/Tests/App/Dashboard/KubernetesCostTooltips.test.tsx +502 -0
- package/Tests/App/Dashboard/KubernetesInsightsTooltips.test.tsx +222 -0
- package/Tests/App/Dashboard/KubernetesResourceMetricTooltips.test.ts +561 -0
- package/Tests/App/Dashboard/KubernetesResourcePagesTooltips.test.tsx +1168 -0
- package/Tests/App/Dashboard/LayerDateTimeFieldTimezoneName.test.tsx +66 -0
- package/Tests/App/Dashboard/LinkIncidentAlertModal.test.tsx +154 -0
- package/Tests/App/Dashboard/LogMonitorPreview.test.tsx +174 -0
- package/Tests/App/Dashboard/MetricDescriptionRules.ts +170 -0
- package/Tests/App/Dashboard/MetricDescriptionsCatalog.test.ts +206 -0
- package/Tests/App/Dashboard/MetricDescriptionsConsistency.test.ts +275 -0
- package/Tests/App/Dashboard/MonitorFeedRefresh.test.tsx +279 -0
- package/Tests/App/Dashboard/MonitorMetricQueryConfig.test.ts +244 -0
- package/Tests/App/Dashboard/MonitorOpenWorkCard.test.tsx +381 -0
- package/Tests/App/Dashboard/MonitorOpenWorkHook.test.tsx +784 -0
- package/Tests/App/Dashboard/MonitorOverviewData.test.tsx +2199 -0
- package/Tests/App/Dashboard/MonitorOverviewHero.test.tsx +1169 -0
- package/Tests/App/Dashboard/MonitorOverviewInput.test.ts +1127 -0
- package/Tests/App/Dashboard/MonitorOverviewPage.test.tsx +2136 -0
- package/Tests/App/Dashboard/MonitorOverviewSelectReadable.test.ts +368 -0
- package/Tests/App/Dashboard/MonitorOverviewStatBar.test.tsx +526 -0
- package/Tests/App/Dashboard/MonitorOverviewSupportingCards.test.tsx +542 -0
- package/Tests/App/Dashboard/MonitorOwnersCombine.test.ts +299 -0
- package/Tests/App/Dashboard/MonitorProbesCard.test.tsx +602 -0
- package/Tests/App/Dashboard/MonitorResponseTimeCard.test.tsx +386 -0
- package/Tests/App/Dashboard/MonitorSetupAndConnectionCards.test.tsx +612 -0
- package/Tests/App/Dashboard/MonitorStatusChangesCard.test.tsx +257 -0
- package/Tests/App/Dashboard/MonitorSummaryTestMonitorButton.test.tsx +360 -1
- package/Tests/App/Dashboard/MonitorUptimeHistoryCard.test.tsx +835 -0
- package/Tests/App/Dashboard/MonitorUptimeSummaryHook.test.tsx +971 -0
- package/Tests/App/Dashboard/MonitorViewLayout.test.tsx +580 -0
- package/Tests/App/Dashboard/NetworkDeviceTooltips.test.tsx +852 -0
- package/Tests/App/Dashboard/NetworkDiagnosticsTooltips.test.tsx +556 -0
- package/Tests/App/Dashboard/NetworkMetricTooltips.test.ts +1348 -0
- package/Tests/App/Dashboard/NetworkSiteTooltips.test.tsx +679 -0
- package/Tests/App/Dashboard/OnCallLayerRestrictionTimesPreserved.test.tsx +441 -0
- package/Tests/App/Dashboard/OnCallNavbar.test.tsx +214 -0
- package/Tests/App/Dashboard/OnCallSchedulePreviewCalendarDisplay.test.tsx +1389 -0
- package/Tests/App/Dashboard/OnCallSchedulePreviewOverrides.test.tsx +205 -1
- package/Tests/App/Dashboard/OnCallScheduleTimeInputsSettingsZone.test.tsx +198 -0
- package/Tests/App/Dashboard/ProxmoxMetricTooltips.test.ts +592 -0
- package/Tests/App/Dashboard/ProxmoxOverviewTooltips.test.tsx +1002 -0
- package/Tests/App/Dashboard/ProxmoxResourcePageTooltips.test.tsx +923 -0
- package/Tests/App/Dashboard/PublicNotePagesNotifyDefault.test.tsx +524 -0
- package/Tests/App/Dashboard/RemediationSuggestionCardApproval.test.tsx +702 -0
- package/Tests/App/Dashboard/RemoveUserFromProject.test.tsx +427 -0
- package/Tests/App/Dashboard/ResourceArchiveSettings.test.tsx +4 -0
- package/Tests/App/Dashboard/ResourceOverviewTileTooltips.test.tsx +1066 -0
- package/Tests/App/Dashboard/RumOverviewPage.test.tsx +1195 -0
- package/Tests/App/Dashboard/RumSessionReplaySideMenu.test.tsx +3 -1
- package/Tests/App/Dashboard/RunbookStepTypeMaps.test.ts +166 -0
- package/Tests/App/Dashboard/RunnerKubernetesAgentForm.test.tsx +622 -0
- package/Tests/App/Dashboard/ScheduledMaintenanceChangeStateNotifyDefault.test.tsx +1491 -0
- package/Tests/App/Dashboard/ScheduledMaintenanceFeedPublicNoteNotifyDefault.test.tsx +489 -0
- package/Tests/App/Dashboard/ScheduledMaintenanceOverviewNotifyDefault.test.tsx +909 -0
- package/Tests/App/Dashboard/ScheduledMaintenanceOverviewPage.test.tsx +14 -0
- package/Tests/App/Dashboard/ScheduledMaintenanceWindowStatsTranslation.test.tsx +307 -0
- package/Tests/App/Dashboard/SecurityEventAttributeColumnPicker.test.tsx +542 -0
- package/Tests/App/Dashboard/SecurityEventConnectionFormModal.test.tsx +174 -0
- package/Tests/App/Dashboard/SecurityEventConnectionsEmptyState.test.tsx +973 -212
- package/Tests/App/Dashboard/SecurityEventConnectionsTable.test.tsx +491 -52
- package/Tests/App/Dashboard/SecurityEventDetailPanel.test.tsx +301 -0
- package/Tests/App/Dashboard/SecurityEventListRow.test.tsx +158 -1
- package/Tests/App/Dashboard/SecurityEventProviderTile.test.tsx +869 -0
- package/Tests/App/Dashboard/SecurityEventsEmptyState.test.tsx +959 -94
- package/Tests/App/Dashboard/SecurityEventsNoResults.test.tsx +2 -0
- package/Tests/App/Dashboard/SecurityEventsViewer.test.tsx +274 -1
- package/Tests/App/Dashboard/ServerlessMetricTooltips.test.tsx +474 -0
- package/Tests/App/Dashboard/ServiceMetricTooltips.test.tsx +772 -0
- package/Tests/App/Dashboard/SessionReplayAuditTable.test.tsx +56 -1
- package/Tests/App/Dashboard/TeamMembershipRemoval.test.ts +900 -0
- package/Tests/App/Dashboard/TeamMembershipRemovalPages.test.tsx +460 -0
- package/Tests/App/Dashboard/TelemetryMetricsSignals.test.ts +1207 -0
- package/Tests/App/Dashboard/TelemetryResourceTabTooltips.test.tsx +437 -0
- package/Tests/App/Dashboard/TimezoneElements.test.tsx +321 -0
- package/Tests/App/Dashboard/TimezoneSelectButton.test.tsx +634 -0
- package/Tests/App/Dashboard/TraceExplorer.test.tsx +260 -0
- package/Tests/App/Dashboard/TraceMonitorPreview.test.tsx +182 -0
- package/Tests/App/Dashboard/UserTimezoneInit.test.tsx +544 -0
- package/Tests/App/Dashboard/VMwareMetricTooltips.test.ts +801 -0
- package/Tests/App/Dashboard/VMwareOverviewTooltips.test.tsx +601 -0
- package/Tests/App/Dashboard/VMwareResourcePagesTooltips.test.tsx +646 -0
- package/Tests/App/Dashboard/VMwareTooltipHarness.ts +145 -0
- package/Tests/App/Dashboard/WorkflowVariableModals.test.tsx +1630 -0
- package/Tests/App/Dashboard/WorkflowVariableRoutes.test.tsx +603 -0
- package/Tests/App/Dashboard/WorkflowVariableTokenStatus.test.tsx +589 -0
- package/Tests/App/Dashboard/WorkflowVariableUtil.test.ts +1543 -0
- package/Tests/App/Dashboard/WorkflowVariableView.test.tsx +3227 -0
- package/Tests/App/Dashboard/WorkflowVariablesTable.test.tsx +1277 -395
- package/Tests/App/StatusPage/StatusPageOverviewMonitorGroupUptime.test.tsx +714 -0
- package/Tests/App/StatusPage/StatusPageOverviewUptimeBars.NewYork.test.tsx +1009 -0
- package/Tests/App/StatusPage/StatusPageOverviewUptimeBars.test.tsx +1092 -0
- package/Tests/Models/DatabaseModels/DomainRoleTierCoverage.test.ts +5 -0
- package/Tests/Models/DatabaseModels/IncidentAlertModel.test.ts +554 -0
- package/Tests/Models/DatabaseModels/KubernetesClusterAiAccessColumns.test.ts +520 -0
- package/Tests/Models/DatabaseModels/MonitorSecretKeyColumnAccessControl.test.ts +66 -2
- package/Tests/Models/DatabaseModels/SessionReplayModels.test.ts +117 -0
- package/Tests/Models/DatabaseModels/WorkspaceProjectAuthTokenAccessControl.test.ts +236 -0
- package/Tests/Models/IncidentEpisodePublicNoteNotifyColumnContract.test.ts +103 -0
- package/Tests/Models/IncidentPublicNoteNotifyColumnContract.test.ts +96 -0
- package/Tests/Models/ScheduledMaintenancePublicNoteNotifyColumnContract.test.ts +111 -0
- package/Tests/Server/API/AIInvestigationAPI.test.ts +976 -0
- package/Tests/Server/API/AutoRemediationApproveKubectlRecheck.test.ts +836 -0
- package/Tests/Server/API/CommonAPIAssertCanCreateTable.test.ts +565 -0
- package/Tests/Server/API/CommonAPIAssertCanReadTable.test.ts +282 -0
- package/Tests/Server/API/KubernetesClusterAiAccessAPI.test.ts +1744 -0
- package/Tests/Server/API/LogHistogramAPI.test.ts +371 -0
- package/Tests/Server/API/MicrosoftTeamsLegacyWebhookRemoval.test.ts +125 -30
- package/Tests/Server/API/MicrosoftTeamsOAuthState.test.ts +1121 -0
- package/Tests/Server/API/MonitorUptimeSummaryAPI.test.ts +685 -0
- package/Tests/Server/API/SessionReplayAPI.test.ts +602 -1
- package/Tests/Server/API/SlackChannelCacheAPI.test.ts +358 -0
- package/Tests/Server/API/SlackOAuthState.test.ts +688 -0
- package/Tests/Server/API/StatusPageOverviewMonitorGroupUptime.test.ts +527 -0
- package/Tests/Server/API/StatusPageTestEmailReportAuth.test.ts +2 -0
- package/Tests/Server/API/StatusPageUptimeAPI.test.ts +427 -0
- package/Tests/Server/API/UserProjectsAPI.test.ts +4 -0
- package/Tests/Server/API/WorkflowVariableAPI.test.ts +404 -0
- package/Tests/Server/API/WorkspaceOAuthTestHelpers.ts +289 -0
- package/Tests/Server/API/WorkspaceSendTestNotificationRoutes.test.ts +2064 -0
- package/Tests/Server/Infrastructure/GlobalCache.test.ts +86 -0
- package/Tests/Server/Infrastructure/Postgres/AddIncidentAlertMigration.test.ts +341 -0
- package/Tests/Server/Infrastructure/Postgres/AddKubernetesClusterAiAccessMigration.test.ts +589 -0
- package/Tests/Server/Infrastructure/Postgres/AddOAuth2WorkflowVariablesMigration.test.ts +254 -0
- package/Tests/Server/Infrastructure/Postgres/AddSessionReplaySameOriginTracePropagationMigration.test.ts +247 -0
- package/Tests/Server/Middleware/BlockedUserMiddleware.test.ts +403 -0
- package/Tests/Server/Middleware/MasterAdminAuthorization.test.ts +13 -0
- package/Tests/Server/Middleware/PublicRouteUserMiddleware.test.ts +2 -0
- package/Tests/Server/Middleware/RemovedProjectMemberAuthorization.test.ts +469 -0
- package/Tests/Server/Middleware/TelemetryIngestBrowserKey.test.ts +77 -1
- package/Tests/Server/Middleware/TelemetryIngestKubernetesAgentRunnerPinnedKey.test.ts +211 -0
- package/Tests/Server/Middleware/TelemetryIngestKubernetesAgentRunnerRateLimit.test.ts +358 -0
- package/Tests/Server/Middleware/UserAuthorization.test.ts +97 -0
- package/Tests/Server/Middleware/UserAuthorizationEditionEnforcement.test.ts +2 -0
- package/Tests/Server/Services/AccessTokenProjectUserGrant.test.ts +14 -2
- package/Tests/Server/Services/AccessTokenRemovedMemberAccess.test.ts +1044 -0
- package/Tests/Server/Services/AddOwnersIdempotency.test.ts +5 -0
- package/Tests/Server/Services/AlertEpisodeMemberCreatePermission.test.ts +139 -0
- package/Tests/Server/Services/AutoRemediationClusterRuleEngine.test.ts +1361 -0
- package/Tests/Server/Services/AutoRemediationRuleCommandRunners.test.ts +375 -0
- package/Tests/Server/Services/CrossProjectRelationWriteGuard.test.ts +2384 -0
- package/Tests/Server/Services/FindOwnersProjectMembership.test.ts +267 -0
- package/Tests/Server/Services/InboundEmail/SendGridInboundProviderAddress.test.ts +90 -0
- package/Tests/Server/Services/IncidentAlertPostgres.test.ts +903 -0
- package/Tests/Server/Services/IncidentAlertRegistration.test.ts +96 -0
- package/Tests/Server/Services/IncidentAlertService.test.ts +2225 -0
- package/Tests/Server/Services/IncidentAlertStateCascade.test.ts +970 -0
- package/Tests/Server/Services/IncidentCreateFromAlerts.test.ts +1284 -0
- package/Tests/Server/Services/IncidentEpisodeMemberCreatePermission.test.ts +143 -0
- package/Tests/Server/Services/IncidentEpisodePublicNoteNotifyDefault.test.ts +805 -0
- package/Tests/Server/Services/IncidentPublicNoteNotifyDefault.test.ts +724 -0
- package/Tests/Server/Services/IncidentRoleProjectMembership.test.ts +233 -0
- package/Tests/Server/Services/KubernetesClusterAiAccessAgentRunnerAssignments.test.ts +372 -0
- package/Tests/Server/Services/KubernetesClusterAiAccessBindingGuard.test.ts +1876 -0
- package/Tests/Server/Services/KubernetesClusterAiAccessDeletedRunnerRemedy.test.ts +620 -0
- package/Tests/Server/Services/KubernetesClusterAiAccessGapNextSteps.test.ts +421 -0
- package/Tests/Server/Services/KubernetesClusterAiAccessService.test.ts +3662 -0
- package/Tests/Server/Services/KubernetesClusterAiAccessSubjectClusters.test.ts +405 -0
- package/Tests/Server/Services/KubernetesClusterAiSettingsPermission.test.ts +975 -0
- package/Tests/Server/Services/KubernetesClusterServiceAiAccessFeed.test.ts +497 -0
- package/Tests/Server/Services/KubernetesClusterServiceDeleteSettlesRemediation.test.ts +328 -0
- package/Tests/Server/Services/LogAggregationService.test.ts +99 -0
- package/Tests/Server/Services/MonitorServiceIncomingEmailCustomAddress.test.ts +447 -0
- package/Tests/Server/Services/MonitorServiceProbeFlagSync.test.ts +1334 -0
- package/Tests/Server/Services/MonitorServiceProbeStatusGrouping.test.ts +1640 -0
- package/Tests/Server/Services/MonitorServiceRefreshCurrentStatus.test.ts +225 -0
- package/Tests/Server/Services/MonitorStatusBridgeProbePath.test.ts +8 -8
- package/Tests/Server/Services/MonitorStatusTimelineDailyAggregates.test.ts +264 -1
- package/Tests/Server/Services/MonitorStatusTimelineMergedDowntime.test.ts +284 -0
- package/Tests/Server/Services/MonitorUptimeSummaryService.test.ts +1043 -0
- package/Tests/Server/Services/NetworkDeviceRuleEngines.test.ts +5 -0
- package/Tests/Server/Services/OnCallUndeliverablePageOwnerMembership.test.ts +359 -0
- package/Tests/Server/Services/ProbeServiceDashboardLink.test.ts +191 -0
- package/Tests/Server/Services/ProjectOwnersProjectMembership.test.ts +221 -0
- package/Tests/Server/Services/RuleRun/IncidentAlertMaintenanceRuleEnginesRun.test.ts +5 -0
- package/Tests/Server/Services/RuleRun/OwnerRuleEnginesGroupARun.test.ts +28 -0
- package/Tests/Server/Services/RuleRun/OwnerRuleEnginesGroupBRun.test.ts +9 -1
- package/Tests/Server/Services/RunnerJobEnqueueAiCommandAgentRunner.test.ts +230 -0
- package/Tests/Server/Services/RunnerJobEnqueueKubectl.test.ts +978 -0
- package/Tests/Server/Services/RunnerJobKubectlWriteScope.test.ts +866 -0
- package/Tests/Server/Services/RunnerJobSubmitResultRedaction.test.ts +322 -0
- package/Tests/Server/Services/RunnerJobSubmitResultUnstorableText.test.ts +357 -0
- package/Tests/Server/Services/RunnerJobTimeoutReason.test.ts +227 -0
- package/Tests/Server/Services/RunnerServiceAgentName.test.ts +581 -0
- package/Tests/Server/Services/ScheduledMaintenancePublicNoteNotifyDefault.test.ts +802 -0
- package/Tests/Server/Services/ScheduledMaintenanceSubscriberTemplateFormats.test.ts +53 -0
- package/Tests/Server/Services/ServiceLevelObjectiveLabelAndOwnerRuleEngines.test.ts +5 -0
- package/Tests/Server/Services/ServiceLevelObjectiveService.test.ts +12 -0
- package/Tests/Server/Services/StatusPageSubscriberReport.test.ts +1176 -1
- package/Tests/Server/Services/TeamMemberBillingSeatSync.test.ts +9 -0
- package/Tests/Server/Services/TeamMemberOnCallCleanup.test.ts +18 -0
- package/Tests/Server/Services/TeamMemberProjectMembership.test.ts +255 -0
- package/Tests/Server/Services/TeamMemberRemovalRevokesProjectAccess.test.ts +600 -0
- package/Tests/Server/Services/TeamMemberResourceCleanup.test.ts +731 -0
- package/Tests/Server/Services/TeamMemberWorkspaceAccountCleanup.test.ts +164 -0
- package/Tests/Server/Services/TraceAggregationService.test.ts +64 -0
- package/Tests/Server/Services/UserServiceBlockedUser.test.ts +293 -0
- package/Tests/Server/Services/WorkflowVariableOAuthHooks.test.ts +1016 -0
- package/Tests/Server/Services/WorkflowVariableOAuthPostgres.test.ts +543 -0
- package/Tests/Server/Services/WorkflowVariableRenameUniqueness.test.ts +16 -5
- package/Tests/Server/Services/WorkspaceNotificationRuleNoteDelivery.test.ts +473 -0
- package/Tests/Server/Services/WorkspaceNotificationRuleSendTestNotification.test.ts +3690 -0
- package/Tests/Server/Services/WorkspaceProjectAuthTokenMiscDataSecrets.test.ts +374 -0
- package/Tests/Server/Services/WorkspaceProjectAuthTokenSlackChannelCache.test.ts +143 -0
- package/Tests/Server/Types/Database/Permissions/WorkflowVariableOAuthColumnPermission.test.ts +250 -0
- package/Tests/Server/Types/Database/QueryHelperJsonContains.test.ts +96 -0
- package/Tests/Server/Types/Markdown.test.ts +1033 -0
- package/Tests/Server/Utils/AI/ClusterAccessContext.test.ts +285 -0
- package/Tests/Server/Utils/AI/CodeFix/CodeFixAgentAuth.test.ts +159 -1
- package/Tests/Server/Utils/AI/InvestigationClusterAccessWiring.test.ts +752 -0
- package/Tests/Server/Utils/AI/KubectlInvestigationToolkit.test.ts +1840 -0
- package/Tests/Server/Utils/AI/KubectlJobRunner.test.ts +1067 -0
- package/Tests/Server/Utils/AI/KubectlJobRunnerFinishedJob.test.ts +355 -0
- package/Tests/Server/Utils/AI/PostIncidentStatusUpdateTool.test.ts +496 -0
- package/Tests/Server/Utils/AI/RemediationCommandTools.test.ts +305 -0
- package/Tests/Server/Utils/AI/RemediationCommandToolsKubectl.test.ts +1365 -0
- package/Tests/Server/Utils/AI/RemediationCommandToolsKubectlOutcome.test.ts +639 -0
- package/Tests/Server/Utils/AI/RemediationCommandToolsLiveCluster.test.ts +1585 -0
- package/Tests/Server/Utils/AI/RemediationCommandToolsRunnerScope.test.ts +1065 -0
- package/Tests/Server/Utils/AI/RemediationExecutionRunner.test.ts +2138 -1
- package/Tests/Server/Utils/AI/RemediationExecutionRunnerClusterMode.test.ts +1035 -0
- package/Tests/Server/Utils/AI/RemediationKubectlCopyParity.test.ts +517 -0
- package/Tests/Server/Utils/AI/ResourceTools.test.ts +27 -1
- package/Tests/Server/Utils/AutoRemediation/CommandPlanExecutor.test.ts +1371 -24
- package/Tests/Server/Utils/AutoRemediation/CommandPlanExecutorRollbackRace.test.ts +962 -0
- package/Tests/Server/Utils/AutoRemediation/CommandPlanExecutorUnknownRun.test.ts +518 -0
- package/Tests/Server/Utils/AutoRemediation/CommandPlanVerification.test.ts +939 -2
- package/Tests/Server/Utils/Database/ProjectScopedRelationReferences.test.ts +371 -0
- package/Tests/Server/Utils/Monitor/AffectedResourceList.test.ts +64 -0
- package/Tests/Server/Utils/Monitor/DatabaseMetricObservationRemediation.test.ts +102 -0
- package/Tests/Server/Utils/Monitor/MonitorAlertCriteriaReferences.test.ts +362 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorBreachingSamples.test.ts +55 -0
- package/Tests/Server/Utils/Monitor/MonitorEmailAddressRedaction.test.ts +255 -0
- package/Tests/Server/Utils/Monitor/MonitorIncidentCriteriaReferences.test.ts +347 -0
- package/Tests/Server/Utils/Monitor/MonitorIncidentMemberRoleMembership.test.ts +203 -0
- package/Tests/Server/Utils/Monitor/ProbeMonitorsNotification.test.ts +1147 -0
- package/Tests/Server/Utils/PushNotificationUtilCreators.test.ts +79 -0
- package/Tests/Server/Utils/ResourceFeed/ResourceFeedUtil.test.ts +21 -1
- package/Tests/Server/Utils/Rules/OwnerRuleAssignment.test.ts +155 -1
- package/Tests/Server/Utils/SessionReplay/SessionReplayGateCachePolicy.test.ts +103 -0
- package/Tests/Server/Utils/SessionReplay/SessionReplayReadServiceQueries.test.ts +288 -0
- package/Tests/Server/Utils/SessionReplay/SessionReplayUserFlowReadService.test.ts +304 -0
- package/Tests/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.test.ts +40 -3
- package/Tests/Server/Utils/Workflow/OAuth2TokenClient.test.ts +702 -0
- package/Tests/Server/Utils/Workflow/OAuth2TokenClientHttpIntegration.test.ts +507 -0
- package/Tests/Server/Utils/Workflow/WorkflowVariableOAuthToken.test.ts +831 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsActionAuthorization.test.ts +63 -1
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsAppAccessToken.test.ts +256 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsChannelSend.test.ts +60 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsChatActionAuthorization.test.ts +442 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsChats.test.ts +44 -2
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsDirectMessage.test.ts +55 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsReactionNoteSync.test.ts +1522 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsServiceUrl.test.ts +130 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsTeamInstalls.test.ts +4 -4
- package/Tests/Server/Utils/Workspace/Slack/SlackActionAuthorization.test.ts +691 -0
- package/Tests/Server/Utils/Workspace/Slack/SlackMessageByTimestamp.test.ts +253 -0
- package/Tests/Server/Utils/Workspace/Slack/SlackReactionNote.test.ts +574 -0
- package/Tests/Server/Utils/Workspace/WorkspaceActionAuthorization.test.ts +488 -0
- package/Tests/Server/Utils/Workspace/WorkspaceCreateProjectReferences.test.ts +861 -0
- package/Tests/Server/Utils/Workspace/WorkspaceMessageAuthor.test.ts +635 -0
- package/Tests/Server/Utils/Workspace/WorkspaceOAuthState.test.ts +548 -0
- package/Tests/Server/Utils/Workspace/WorkspaceReactionNote.test.ts +839 -0
- package/Tests/Server/Utils/Workspace/WorkspaceSendErrorMessage.test.ts +725 -0
- package/Tests/Types/AutoRemediation/AiRemediationCommandPlan.test.ts +283 -9
- package/Tests/Types/DateBrowserLocalWallClock.test.ts +280 -0
- package/Tests/Types/DateLocalShortMonthNameFallback.test.ts +389 -0
- package/Tests/Types/DateUserTimezone.test.ts +177 -4
- package/Tests/Types/Kubernetes/KubernetesAgentChartAiAccess.test.ts +306 -0
- package/Tests/Types/Kubernetes/KubernetesClusterAiAccess.test.ts +283 -0
- package/Tests/Types/Kubernetes/KubernetesRunnerPostureWriteScope.test.ts +68 -0
- package/Tests/Types/Monitor/DatabaseMonitor/SqlServerPlatform.test.ts +144 -0
- package/Tests/Types/Monitor/MonitorStepExceptionMonitor.test.ts +160 -0
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCoverage.test.ts +53 -0
- package/Tests/Types/Rum/WebVitals.test.ts +173 -0
- package/Tests/Types/Runbook/RunbookStepType.test.ts +91 -16
- package/Tests/Types/Runner/RunnerLiveStatus.test.ts +14 -3
- package/Tests/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.test.ts +15 -0
- package/Tests/Types/StatusPage/PublicNoteSubscriberNotificationDefault.test.ts +1868 -0
- package/Tests/Types/Timezone.test.ts +5 -0
- package/Tests/Types/TimezoneAlias.test.ts +1034 -0
- package/Tests/Types/Workflow/JiraTemplateFixtures.ts +833 -0
- package/Tests/Types/Workflow/JiraTemplateScripts.test.ts +5414 -0
- package/Tests/Types/Workflow/JiraTemplateSimulation.test.ts +4803 -0
- package/Tests/Types/Workflow/JiraTemplates.test.ts +5429 -0
- package/Tests/Types/Workflow/Templates.test.ts +79 -4
- package/Tests/Types/Workflow/WorkflowVariableOAuth.test.ts +520 -0
- package/Tests/Types/Workspace/WorkspaceNoteReaction.test.ts +177 -0
- package/Tests/UI/Components/AttributesJSON/AttributesJSONView.test.tsx +390 -0
- package/Tests/UI/Components/AttributesJSON/CopyAttributesAsJSONButton.test.tsx +566 -0
- package/Tests/UI/Components/AttributesJSON/JSONHighlight.test.ts +131 -0
- package/Tests/UI/Components/BasicFormDropdownNormalization.test.tsx +276 -1
- package/Tests/UI/Components/Calendar/Calendar.test.tsx +1611 -0
- package/Tests/UI/Components/Calendar/CalendarDayLayout.test.ts +1486 -0
- package/Tests/UI/Components/Calendar/CalendarDayLayoutDst.test.ts +632 -0
- package/Tests/UI/Components/Calendar/CalendarDst.test.tsx +388 -0
- package/Tests/UI/Components/Charts/ChartGroupPlotFloor.test.tsx +170 -0
- package/Tests/UI/Components/Charts/HistogramSelection.test.ts +282 -0
- package/Tests/UI/Components/CustomTimeRangeModal.test.tsx +6 -0
- package/Tests/UI/Components/CustomTimeRangeModalTimezoneTranslation.test.tsx +285 -0
- package/Tests/UI/Components/Dropdown.test.tsx +999 -2
- package/Tests/UI/Components/FieldLabelInfoCardTooltip.test.tsx +413 -0
- package/Tests/UI/Components/Forms/FormFieldCheckboxTranslation.test.tsx +216 -0
- package/Tests/UI/Components/Forms/FormFieldTimezoneDescriptionTranslation.test.tsx +461 -0
- package/Tests/UI/Components/Forms/IncidentEpisodePublicNoteNotifyPayload.test.tsx +641 -0
- package/Tests/UI/Components/Forms/IncidentPublicNoteNotifyPayload.test.tsx +346 -0
- package/Tests/UI/Components/Forms/ScheduledMaintenancePublicNoteNotifyPayload.test.tsx +493 -0
- package/Tests/UI/Components/Graphs/DayUptimeGraph.test.tsx +911 -2
- package/Tests/UI/Components/Graphs/DayUptimeGraphTimezone.NewYork.test.tsx +730 -0
- package/Tests/UI/Components/Graphs/DayUptimeGraphTimezone.Tokyo.test.tsx +506 -0
- package/Tests/UI/Components/HistogramClickToZoom.test.tsx +619 -0
- package/Tests/UI/Components/InfoTooltip.test.tsx +242 -0
- package/Tests/UI/Components/LogDetailsPanelAttributesJSON.test.tsx +248 -0
- package/Tests/UI/Components/LogsViewerHistogramZoom.test.tsx +47 -1
- package/Tests/UI/Components/LogsViewerSmallScreens.test.tsx +620 -0
- package/Tests/UI/Components/ModelPageModelChange.test.tsx +242 -3
- package/Tests/UI/Components/ModelTable/BaseModelTableBulkDelete.test.tsx +207 -3
- package/Tests/UI/Components/ModelTable/BaseModelTableBulkDeleteVerb.test.tsx +367 -0
- package/Tests/UI/Components/ModelTable/BaseModelTableCreateButtonTitle.test.tsx +275 -0
- package/Tests/UI/Components/ModelTable/BaseModelTableDeleteConfirmation.test.tsx +521 -0
- package/Tests/UI/Components/MonitorGraphs/Uptime.test.tsx +406 -2
- package/Tests/UI/Components/MonitorGraphs/UptimeBarDayModal.test.tsx +169 -2
- package/Tests/UI/Components/TableHeaderTooltip.test.tsx +662 -0
- package/Tests/UI/Components/TelemetryViewer/TelemetryViewerHistogramClickZoom.test.tsx +266 -0
- package/Tests/UI/Components/TelemetryViewer/TelemetryViewerSmallScreens.test.tsx +439 -0
- package/Tests/UI/Components/TimezoneDropdownLegacyValues.test.tsx +704 -0
- package/Tests/UI/Components/UseHistogramZoom.test.tsx +89 -1
- package/Tests/UI/Components/UseLogsHistogram.test.tsx +175 -0
- package/Tests/UI/Monitor/MonitorSummarySnapshotRender.test.tsx +5 -5
- package/Tests/UI/Rum/PrivacySummaryCard.test.tsx +166 -9
- package/Tests/UI/Rum/RecordingHealthTooltips.test.tsx +447 -0
- package/Tests/UI/Rum/ReplayCorrelationPanel.test.tsx +164 -0
- package/Tests/UI/Rum/ReplayFrameCapture.test.ts +6750 -0
- package/Tests/UI/Rum/ReplayRail.test.tsx +723 -12
- package/Tests/UI/Rum/ReplayRailDetail.test.tsx +86 -0
- package/Tests/UI/Rum/ReplayScreenshot.test.ts +2124 -0
- package/Tests/UI/Rum/ReplayScreenshotActions.test.tsx +3288 -0
- package/Tests/UI/Rum/ReplayStage.test.tsx +62 -0
- package/Tests/UI/Rum/ReplayStageOverlays.test.tsx +983 -2
- package/Tests/UI/Rum/SessionReplaySettingsPolicyLoading.test.tsx +149 -0
- package/Tests/UI/Rum/SessionReplaySetupGuide.test.tsx +107 -6
- package/Tests/UI/Rum/SessionReplayUsersTableTooltips.test.tsx +330 -0
- package/Tests/UI/Rum/UserFlowTooltips.test.tsx +886 -0
- package/Tests/UI/Telemetry/TelemetryDetailPanel.test.tsx +28 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +10 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +2 -0
- package/Tests/UI/Utils/PermissionGate.test.ts +76 -0
- package/Tests/UI/Utils/ProjectUsersModelAPI.test.ts +51 -0
- package/Tests/UI/Utils/Timezone.test.ts +747 -33
- package/Tests/UI/Workspace/SendTestNotificationButton.test.tsx +1854 -0
- package/Tests/UI/Workspace/WorkspaceCardsSendTestNotification.test.tsx +1864 -0
- package/Tests/Utils/AI/InvestigationReport.test.ts +435 -7
- package/Tests/Utils/AiRemediation/KubectlAllowlistValidatorParity.test.ts +1084 -0
- package/Tests/Utils/AiRemediation/KubectlOutputRedactor.test.ts +2531 -0
- package/Tests/Utils/AiRemediation/KubectlPolicy.test.ts +1895 -0
- package/Tests/Utils/AiRemediation/KubectlPolicyAllowlist.test.ts +428 -0
- package/Tests/Utils/AiRemediation/KubectlPolicyChartRbacParity.test.ts +828 -0
- package/Tests/Utils/AiRemediation/KubectlPolicyCustomResourceScope.test.ts +573 -0
- package/Tests/Utils/AiRemediation/KubectlPolicyDenials.test.ts +1525 -0
- package/Tests/Utils/AiRemediation/KubectlPolicyExposeOverrides.test.ts +275 -0
- package/Tests/Utils/AiRemediation/KubectlPolicyNodePatch.test.ts +428 -0
- package/Tests/Utils/AiRemediation/KubectlPolicyObjectWords.test.ts +195 -0
- package/Tests/Utils/AiRemediation/KubectlPolicyPatchParents.test.ts +637 -0
- package/Tests/Utils/AiRemediation/KubectlPolicyPodSecurityBaseline.test.ts +322 -0
- package/Tests/Utils/AiRemediation/KubectlPolicySafeWriteScope.test.ts +1026 -0
- package/Tests/Utils/AiRemediation/KubectlWaitBudget.test.ts +267 -0
- package/Tests/Utils/AiRemediation/KubectlWriteScope.test.ts +390 -0
- package/Tests/Utils/AiRemediation/KubectlWriteScopeCallerParity.test.ts +777 -0
- package/Tests/Utils/AiRemediation/KubectlWriteScopeClusterScoped.test.ts +613 -0
- package/Tests/Utils/AiRemediation/KubectlWriteScopeEntryPoint.test.ts +576 -0
- package/Tests/Utils/AiRemediation/KubectlWriteScopeKubectlSpellings.test.ts +752 -0
- package/Tests/Utils/AiRemediation/KubectlWriteScopeObjectWords.test.ts +358 -0
- package/Tests/Utils/AiRemediation/KubectlWriteScopeOverrides.test.ts +293 -0
- package/Tests/Utils/AiRemediation/KubectlWriteScopeParityCases.ts +598 -0
- package/Tests/Utils/AiRemediation/KubectlWriteScopePolicyParity.test.ts +403 -0
- package/Tests/Utils/Dashboard/DashboardClockComponent.test.ts +154 -5
- package/Tests/Utils/Incident/IncidentFromAlerts.test.ts +696 -0
- package/Tests/Utils/Monitor/IncomingEmailMonitorAddress.test.ts +478 -0
- package/Tests/Utils/Monitor/MonitorCheckScheduleUtil.test.ts +646 -0
- package/Tests/Utils/Monitor/MonitorOverviewCriteriaUtil.test.ts +292 -0
- package/Tests/Utils/Monitor/MonitorOverviewFamily.test.ts +274 -0
- package/Tests/Utils/Monitor/MonitorOverviewPresentationUtil.test.ts +3100 -0
- package/Tests/Utils/Monitor/MonitorOverviewProbeUtil.test.ts +1412 -0
- package/Tests/Utils/Monitor/MonitorOverviewTargetUtil.test.ts +374 -0
- package/Tests/Utils/Monitor/MonitorStatusHistoryUtil.test.ts +332 -0
- package/Tests/Utils/Monitor/MonitorUptimeSummaryUtil.test.ts +946 -0
- package/Tests/Utils/Rum/SessionIdentity.test.ts +94 -0
- package/Tests/Utils/Rum/SessionReplayWafCompatibility.test.ts +840 -0
- package/Tests/Utils/Rum/SessionReplayWireEncoding.test.ts +208 -0
- package/Tests/Utils/Rum/SessionTraceState.test.ts +239 -0
- package/Tests/Utils/Rum/UserFlow.test.ts +1010 -0
- package/Tests/Utils/StatusPage/MonitorGroupMergedDowntimeUtil.test.ts +217 -0
- package/Tests/Utils/StatusPage/ResourceUptime.test.ts +1272 -1
- package/Tests/Utils/StatusPage/UptimeDailyAggregateTotals.test.ts +298 -0
- package/Tests/Utils/StatusPage/UptimeDailyAggregateUtil.test.ts +649 -1
- package/Tests/Utils/StatusPage/UptimeDailyAggregateWindow.test.ts +314 -0
- package/Tests/Utils/Telemetry/AttributesJSON.test.ts +454 -0
- package/Tests/Utils/Uptime/DayUptimeGraphUtil.test.ts +418 -2
- package/Tests/Utils/Uptime/DayUptimeGraphUtilMidnightDst.test.ts +160 -0
- package/Tests/Utils/Uptime/DayUptimeGraphUtilTimezone.Auckland.test.ts +45 -0
- package/Tests/Utils/Uptime/DayUptimeGraphUtilTimezone.Kolkata.test.ts +40 -0
- package/Tests/Utils/Uptime/DayUptimeGraphUtilTimezone.London.test.ts +147 -0
- package/Tests/Utils/Uptime/DayUptimeGraphUtilTimezone.NewYork.test.ts +48 -0
- package/Tests/Utils/Uptime/DayUptimeGraphUtilTimezone.Tokyo.test.ts +39 -0
- package/Tests/Utils/Uptime/DayUptimeGraphUtilTimezoneCases.ts +1015 -0
- package/Tests/Utils/Uptime/UptimeUtil.test.ts +75 -0
- package/Tests/Utils/Uptime/UptimeUtilChronologicalOrder.test.ts +1279 -0
- package/Types/AutoRemediation/AiRemediationCommandPlan.ts +203 -5
- package/Types/Date.ts +121 -7
- package/Types/Email/EmailMessage.ts +8 -0
- package/Types/Email/EmailTemplateType.ts +1 -0
- package/Types/Exception/ExceptionMessages.ts +1 -0
- package/Types/Incident/IncidentAlertLink.ts +38 -0
- package/Types/Kubernetes/KubernetesClusterAiAccess.ts +488 -0
- package/Types/Kubernetes/KubernetesClusterAiAccessPermissions.ts +54 -0
- package/Types/Kubernetes/KubernetesClusterAiAccessToolNames.ts +17 -0
- package/Types/Monitor/DatabaseMonitor/DatabaseMonitorResponse.ts +9 -0
- package/Types/Monitor/DatabaseMonitor/SqlServerPlatform.ts +117 -0
- package/Types/Monitor/KubernetesAlertTemplates.ts +6 -5
- package/Types/Monitor/MonitorStepExceptionMonitor.ts +56 -0
- package/Types/Monitor/MonitorUptimeSummary.ts +113 -0
- package/Types/Monitor/Recommendation/MonitorRecommendationUtil.ts +11 -0
- package/Types/Permission.ts +48 -0
- package/Types/Rum/SessionReplay.ts +80 -8
- package/Types/Rum/SessionReplayApi.ts +44 -1
- package/Types/Rum/UserFlow.ts +187 -0
- package/Types/Rum/WebVitals.ts +52 -0
- package/Types/Runbook/RunbookStepType.ts +10 -0
- package/Types/Runbook/RunnerJobOrigin.ts +15 -0
- package/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.ts +6 -2
- package/Types/StatusPage/MergedDowntimeTotals.ts +17 -0
- package/Types/StatusPage/PublicNoteSubscriberNotificationDefault.ts +148 -0
- package/Types/StatusPage/UptimeDailyAggregate.ts +15 -0
- package/Types/Telemetry/TelemetryIngestSurface.ts +9 -0
- package/Types/Timezone.ts +5 -0
- package/Types/TimezoneAlias.ts +385 -0
- package/Types/Workflow/Templates.ts +3041 -2
- package/Types/Workflow/WorkflowVariableOAuth.ts +476 -0
- package/Types/Workspace/WorkspaceNoteReaction.ts +132 -0
- package/Typings/Index.d.ts +24 -0
- package/UI/Components/AttributesJSON/AttributesJSONPreferences.ts +175 -0
- package/UI/Components/AttributesJSON/AttributesJSONView.tsx +138 -0
- package/UI/Components/AttributesJSON/AttributesViewToggle.tsx +79 -0
- package/UI/Components/AttributesJSON/BracesGlyph.tsx +30 -0
- package/UI/Components/AttributesJSON/CopyAttributesAsJSONButton.tsx +491 -0
- package/UI/Components/AttributesJSON/JSONHighlight.ts +77 -0
- package/UI/Components/Calendar/Calendar.css +83 -0
- package/UI/Components/Calendar/Calendar.tsx +136 -7
- package/UI/Components/Calendar/CalendarDayLayout.ts +236 -0
- package/UI/Components/Charts/ChartGroup/ChartGroup.tsx +23 -1
- package/UI/Components/Charts/Utils/HistogramSelection.ts +117 -0
- package/UI/Components/Charts/Utils/useHistogramRangeSelection.ts +269 -0
- package/UI/Components/Charts/Utils/useHistogramZoom.ts +26 -2
- package/UI/Components/Date/CustomTimeRangeModal.tsx +26 -3
- package/UI/Components/Detail/FieldLabel.tsx +8 -0
- package/UI/Components/Dropdown/Dropdown.tsx +58 -9
- package/UI/Components/Forms/Fields/FormField.tsx +49 -14
- package/UI/Components/Graphs/DayUptimeGraph.tsx +166 -25
- package/UI/Components/Graphs/UptimeBarTooltip.tsx +10 -2
- package/UI/Components/Graphs/UptimeDaySummary.tsx +8 -0
- package/UI/Components/InfoCard/InfoCard.tsx +47 -1
- package/UI/Components/LogsViewer/LogsViewer.tsx +52 -5
- package/UI/Components/LogsViewer/components/ColumnSelector.tsx +13 -2
- package/UI/Components/LogsViewer/components/KeyboardShortcutsHelp.tsx +13 -1
- package/UI/Components/LogsViewer/components/LogDetailsPanel.tsx +91 -76
- package/UI/Components/LogsViewer/components/LogsFacetSidebar.tsx +15 -1
- package/UI/Components/LogsViewer/components/LogsHistogram.tsx +28 -106
- package/UI/Components/LogsViewer/components/LogsViewerToolbar.tsx +54 -6
- package/UI/Components/LogsViewer/components/SavedViewsDropdown.tsx +8 -2
- package/UI/Components/LogsViewer/useLogsHistogram.ts +39 -6
- package/UI/Components/ModelTable/BaseModelTable.tsx +161 -31
- package/UI/Components/ModelTable/Column.ts +5 -0
- package/UI/Components/MonitorGraphs/Uptime.tsx +12 -0
- package/UI/Components/MonitorGraphs/UptimeBarDayModal.tsx +10 -2
- package/UI/Components/Page/ModelPage.tsx +59 -3
- package/UI/Components/Table/TableHeader.tsx +47 -2
- package/UI/Components/Table/Types/Column.ts +7 -0
- package/UI/Components/TelemetryViewer/TelemetryViewer.tsx +69 -5
- package/UI/Components/TelemetryViewer/components/TelemetryDetailPanel.tsx +12 -1
- package/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.tsx +15 -1
- package/UI/Components/TelemetryViewer/components/TelemetryHistogram.tsx +36 -104
- package/UI/Components/TelemetryViewer/components/TelemetrySearchBar.tsx +9 -1
- package/UI/Components/Tooltip/InfoTooltip.tsx +78 -0
- package/UI/Utils/ModelAPI/ProjectUsersModelAPI.ts +19 -1
- package/UI/Utils/PermissionGate.ts +11 -2
- package/UI/Utils/Timezone.ts +69 -28
- package/Utils/AI/InvestigationReport.ts +195 -25
- package/Utils/AiRemediation/KubectlOutputRedactor.ts +1724 -0
- package/Utils/AiRemediation/KubectlPolicy.ts +4136 -0
- package/Utils/AiRemediation/KubectlWaitBudget.ts +156 -0
- package/Utils/AiRemediation/KubectlWriteScope.ts +1964 -0
- package/Utils/Dashboard/Components/DashboardClockComponent.ts +7 -6
- package/Utils/Incident/IncidentFromAlerts.ts +516 -0
- package/Utils/Monitor/IncomingEmailMonitorAddress.ts +292 -0
- package/Utils/Monitor/MonitorCheckScheduleUtil.ts +654 -0
- package/Utils/Monitor/MonitorOverviewCriteriaUtil.ts +188 -0
- package/Utils/Monitor/MonitorOverviewFamily.ts +263 -0
- package/Utils/Monitor/MonitorOverviewPresentationUtil.ts +1958 -0
- package/Utils/Monitor/MonitorOverviewProbeUtil.ts +979 -0
- package/Utils/Monitor/MonitorOverviewTargetUtil.ts +299 -0
- package/Utils/Monitor/MonitorStatusHistoryUtil.ts +201 -0
- package/Utils/Monitor/MonitorUptimeSummaryUtil.ts +638 -0
- package/Utils/Rum/SessionIdentity.ts +44 -0
- package/Utils/Rum/SessionReplayWireEncoding.ts +137 -0
- package/Utils/Rum/SessionTraceState.ts +212 -0
- package/Utils/Rum/UserFlow.ts +1527 -0
- package/Utils/StatusPage/MonitorGroupMergedDowntimeUtil.ts +107 -0
- package/Utils/StatusPage/ResourceUptime.ts +99 -0
- package/Utils/StatusPage/UptimeDailyAggregateUtil.ts +197 -0
- package/Utils/Telemetry/AttributesJSON.ts +367 -0
- package/Utils/Uptime/DayUptimeGraphUtil.ts +165 -0
- package/Utils/Uptime/UptimeUtil.ts +122 -38
- package/build/dist/Models/DatabaseModels/AlertEpisodeMember.js +8 -1
- package/build/dist/Models/DatabaseModels/AlertEpisodeMember.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertFeed.js +2 -0
- package/build/dist/Models/DatabaseModels/AlertFeed.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AutoRemediationSuggestion.js +62 -0
- package/build/dist/Models/DatabaseModels/AutoRemediationSuggestion.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentAlert.js +553 -0
- package/build/dist/Models/DatabaseModels/IncidentAlert.js.map +1 -0
- package/build/dist/Models/DatabaseModels/IncidentEpisodeMember.js +8 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisodeMember.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisodePublicNote.js +10 -3
- package/build/dist/Models/DatabaseModels/IncidentEpisodePublicNote.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentFeed.js +2 -0
- package/build/dist/Models/DatabaseModels/IncidentFeed.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentPublicNote.js +10 -3
- package/build/dist/Models/DatabaseModels/IncidentPublicNote.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +2 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/KubernetesCluster.js +434 -0
- package/build/dist/Models/DatabaseModels/KubernetesCluster.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Monitor.js +49 -0
- package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Project.js +62 -0
- package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
- package/build/dist/Models/DatabaseModels/RumApplication.js +53 -1
- package/build/dist/Models/DatabaseModels/RumApplication.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Runner.js +4 -4
- package/build/dist/Models/DatabaseModels/Runner.js.map +1 -1
- package/build/dist/Models/DatabaseModels/RunnerJob.js +66 -0
- package/build/dist/Models/DatabaseModels/RunnerJob.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenancePublicNote.js +11 -3
- package/build/dist/Models/DatabaseModels/ScheduledMaintenancePublicNote.js.map +1 -1
- package/build/dist/Models/DatabaseModels/WorkflowVariable.js +487 -3
- package/build/dist/Models/DatabaseModels/WorkflowVariable.js.map +1 -1
- package/build/dist/Models/DatabaseModels/WorkspaceProjectAuthToken.js +64 -16
- package/build/dist/Models/DatabaseModels/WorkspaceProjectAuthToken.js.map +1 -1
- package/build/dist/Server/API/AIInvestigationAPI.js +205 -0
- package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
- package/build/dist/Server/API/AutoRemediationAPI.js +115 -2
- package/build/dist/Server/API/AutoRemediationAPI.js.map +1 -1
- package/build/dist/Server/API/CommonAPI.js +49 -0
- package/build/dist/Server/API/CommonAPI.js.map +1 -1
- package/build/dist/Server/API/KubernetesClusterAiAccessAPI.js +564 -0
- package/build/dist/Server/API/KubernetesClusterAiAccessAPI.js.map +1 -0
- package/build/dist/Server/API/MicrosoftTeamsAPI.js +465 -176
- package/build/dist/Server/API/MicrosoftTeamsAPI.js.map +1 -1
- package/build/dist/Server/API/MonitorAPI.js +107 -1
- package/build/dist/Server/API/MonitorAPI.js.map +1 -1
- package/build/dist/Server/API/OnCallScheduleTimelineAPI.js +5 -16
- package/build/dist/Server/API/OnCallScheduleTimelineAPI.js.map +1 -1
- package/build/dist/Server/API/SlackAPI.js +322 -78
- package/build/dist/Server/API/SlackAPI.js.map +1 -1
- package/build/dist/Server/API/StatusPageAPI.js +123 -17
- package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
- package/build/dist/Server/API/TelemetryAPI.js +144 -5
- package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
- package/build/dist/Server/API/UserTwoFactorBackupCodeAPI.js +1 -0
- package/build/dist/Server/API/UserTwoFactorBackupCodeAPI.js.map +1 -1
- package/build/dist/Server/API/WorkflowVariableAPI.js +109 -0
- package/build/dist/Server/API/WorkflowVariableAPI.js.map +1 -0
- package/build/dist/Server/Infrastructure/GlobalCache.js +29 -0
- package/build/dist/Server/Infrastructure/GlobalCache.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794300000000-AddOAuth2WorkflowVariables.js +38 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794300000000-AddOAuth2WorkflowVariables.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794400000000-AddKubernetesClusterAiAccess.js +54 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794400000000-AddKubernetesClusterAiAccess.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794500000000-AddIncomingEmailCustomAddressToMonitor.js +14 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794500000000-AddIncomingEmailCustomAddressToMonitor.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794600000000-AddAuthTokenExpiresAtToWorkspaceProjectAuthToken.js +12 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794600000000-AddAuthTokenExpiresAtToWorkspaceProjectAuthToken.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794700000000-RemoveAppAccessTokenFromWorkspaceProjectAuthTokenMiscData.js +32 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794700000000-RemoveAppAccessTokenFromWorkspaceProjectAuthTokenMiscData.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794800000000-AddSessionReplaySameOriginTracePropagation.js +20 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794800000000-AddSessionReplaySameOriginTracePropagation.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794900000000-AddIncidentAlert.js +42 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794900000000-AddIncidentAlert.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +14 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Middleware/MasterAdminAuthorization.js +21 -0
- package/build/dist/Server/Middleware/MasterAdminAuthorization.js.map +1 -1
- package/build/dist/Server/Middleware/TelemetryIngest.js +32 -2
- package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
- package/build/dist/Server/Middleware/UserAuthorization.js +39 -6
- package/build/dist/Server/Middleware/UserAuthorization.js.map +1 -1
- package/build/dist/Server/Services/AIAgentService.js +1 -0
- package/build/dist/Server/Services/AIAgentService.js.map +1 -1
- package/build/dist/Server/Services/AccessTokenService.js +87 -42
- package/build/dist/Server/Services/AccessTokenService.js.map +1 -1
- package/build/dist/Server/Services/AlertEpisodeMemberService.js +4 -0
- package/build/dist/Server/Services/AlertEpisodeMemberService.js.map +1 -1
- package/build/dist/Server/Services/AlertEpisodeService.js +12 -1
- package/build/dist/Server/Services/AlertEpisodeService.js.map +1 -1
- package/build/dist/Server/Services/AlertService.js +110 -23
- package/build/dist/Server/Services/AlertService.js.map +1 -1
- package/build/dist/Server/Services/AutoRemediationRuleEngineService.js +716 -30
- package/build/dist/Server/Services/AutoRemediationRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AutoRemediationRuleService.js +100 -0
- package/build/dist/Server/Services/AutoRemediationRuleService.js.map +1 -1
- package/build/dist/Server/Services/BillingService.js +1 -0
- package/build/dist/Server/Services/BillingService.js.map +1 -1
- package/build/dist/Server/Services/InboundEmail/Providers/SendGridInboundProvider.js +11 -16
- package/build/dist/Server/Services/InboundEmail/Providers/SendGridInboundProvider.js.map +1 -1
- package/build/dist/Server/Services/IncidentAlertService.js +1370 -0
- package/build/dist/Server/Services/IncidentAlertService.js.map +1 -0
- package/build/dist/Server/Services/IncidentEpisodeMemberService.js +4 -0
- package/build/dist/Server/Services/IncidentEpisodeMemberService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodePublicNoteService.js +48 -0
- package/build/dist/Server/Services/IncidentEpisodePublicNoteService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeRoleMemberService.js +21 -0
- package/build/dist/Server/Services/IncidentEpisodeRoleMemberService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeService.js +12 -1
- package/build/dist/Server/Services/IncidentEpisodeService.js.map +1 -1
- package/build/dist/Server/Services/IncidentGroupingEngineService.js +8 -0
- package/build/dist/Server/Services/IncidentGroupingEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentMemberService.js +14 -0
- package/build/dist/Server/Services/IncidentMemberService.js.map +1 -1
- package/build/dist/Server/Services/IncidentPublicNoteService.js +48 -0
- package/build/dist/Server/Services/IncidentPublicNoteService.js.map +1 -1
- package/build/dist/Server/Services/IncidentService.js +263 -33
- package/build/dist/Server/Services/IncidentService.js.map +1 -1
- package/build/dist/Server/Services/IncidentStateTimelineService.js +33 -0
- package/build/dist/Server/Services/IncidentStateTimelineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentTemplateService.js +68 -4
- package/build/dist/Server/Services/IncidentTemplateService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +2 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterAiAccessService.js +1470 -0
- package/build/dist/Server/Services/KubernetesClusterAiAccessService.js.map +1 -0
- package/build/dist/Server/Services/KubernetesClusterService.js +1097 -0
- package/build/dist/Server/Services/KubernetesClusterService.js.map +1 -1
- package/build/dist/Server/Services/LogAggregationService.js +14 -6
- package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
- package/build/dist/Server/Services/MonitorService.js +487 -48
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/MonitorStatusTimelineService.js +540 -3
- package/build/dist/Server/Services/MonitorStatusTimelineService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js +2 -0
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleTeamService.js +2 -0
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleTeamService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleUserService.js +2 -0
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleUserService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleService.js +3 -0
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleService.js.map +1 -1
- package/build/dist/Server/Services/OnCallNotificationAlertingService.js +29 -7
- package/build/dist/Server/Services/OnCallNotificationAlertingService.js.map +1 -1
- package/build/dist/Server/Services/OnCallSetupReminderService.js +1 -0
- package/build/dist/Server/Services/OnCallSetupReminderService.js.map +1 -1
- package/build/dist/Server/Services/ProbeService.js +7 -1
- package/build/dist/Server/Services/ProbeService.js.map +1 -1
- package/build/dist/Server/Services/ProjectService.js +11 -1
- package/build/dist/Server/Services/ProjectService.js.map +1 -1
- package/build/dist/Server/Services/RunbookCredentialService.js +24 -0
- package/build/dist/Server/Services/RunbookCredentialService.js.map +1 -1
- package/build/dist/Server/Services/RunbookSecretService.js +44 -0
- package/build/dist/Server/Services/RunbookSecretService.js.map +1 -1
- package/build/dist/Server/Services/RunnerJobService.js +641 -21
- package/build/dist/Server/Services/RunnerJobService.js.map +1 -1
- package/build/dist/Server/Services/RunnerService.js +344 -5
- package/build/dist/Server/Services/RunnerService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenancePublicNoteService.js +48 -0
- package/build/dist/Server/Services/ScheduledMaintenancePublicNoteService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceService.js +102 -20
- package/build/dist/Server/Services/ScheduledMaintenanceService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceTemplateService.js +67 -4
- package/build/dist/Server/Services/ScheduledMaintenanceTemplateService.js.map +1 -1
- package/build/dist/Server/Services/ServiceLevelObjectiveService.js +12 -1
- package/build/dist/Server/Services/ServiceLevelObjectiveService.js.map +1 -1
- package/build/dist/Server/Services/StatusPagePrivateUserService.js +1 -0
- package/build/dist/Server/Services/StatusPagePrivateUserService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageService.js +230 -32
- package/build/dist/Server/Services/StatusPageService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageSubscriberService.js +4 -0
- package/build/dist/Server/Services/StatusPageSubscriberService.js.map +1 -1
- package/build/dist/Server/Services/TeamMemberService.js +270 -11
- package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
- package/build/dist/Server/Services/TraceAggregationService.js +10 -6
- package/build/dist/Server/Services/TraceAggregationService.js.map +1 -1
- package/build/dist/Server/Services/UserEmailService.js +1 -0
- package/build/dist/Server/Services/UserEmailService.js.map +1 -1
- package/build/dist/Server/Services/UserNotificationMethodAdminService.js +1 -0
- package/build/dist/Server/Services/UserNotificationMethodAdminService.js.map +1 -1
- package/build/dist/Server/Services/UserNotificationRuleAdminService.js +1 -0
- package/build/dist/Server/Services/UserNotificationRuleAdminService.js.map +1 -1
- package/build/dist/Server/Services/UserNotificationRuleService.js +4 -0
- package/build/dist/Server/Services/UserNotificationRuleService.js.map +1 -1
- package/build/dist/Server/Services/UserService.js +107 -1
- package/build/dist/Server/Services/UserService.js.map +1 -1
- package/build/dist/Server/Services/WorkflowVariableService.js +396 -7
- package/build/dist/Server/Services/WorkflowVariableService.js.map +1 -1
- package/build/dist/Server/Services/WorkspaceNotificationRuleService.js +463 -7
- package/build/dist/Server/Services/WorkspaceNotificationRuleService.js.map +1 -1
- package/build/dist/Server/Services/WorkspaceProjectAuthTokenService.js +144 -2
- package/build/dist/Server/Services/WorkspaceProjectAuthTokenService.js.map +1 -1
- package/build/dist/Server/Types/Database/QueryHelper.js +20 -0
- package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
- package/build/dist/Server/Types/Markdown.js +394 -27
- package/build/dist/Server/Types/Markdown.js.map +1 -1
- package/build/dist/Server/Utils/AI/ClusterAccess/ClusterAccessContext.js +123 -0
- package/build/dist/Server/Utils/AI/ClusterAccess/ClusterAccessContext.js.map +1 -0
- package/build/dist/Server/Utils/AI/ClusterAccess/KubectlInvestigationToolkit.js +344 -0
- package/build/dist/Server/Utils/AI/ClusterAccess/KubectlInvestigationToolkit.js.map +1 -0
- package/build/dist/Server/Utils/AI/ClusterAccess/KubectlJobRunner.js +587 -0
- package/build/dist/Server/Utils/AI/ClusterAccess/KubectlJobRunner.js.map +1 -0
- package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentAuth.js +18 -2
- package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentAuth.js.map +1 -1
- package/build/dist/Server/Utils/AI/Remediation/RemediationCommandTools.js +1380 -239
- package/build/dist/Server/Utils/AI/Remediation/RemediationCommandTools.js.map +1 -1
- package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js +1099 -68
- package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js +88 -6
- package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js +45 -11
- package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js +41 -11
- package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/AIActionTools.js +11 -4
- package/build/dist/Server/Utils/AI/Toolbox/AIActionTools.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/ResourceTools.js +4 -2
- package/build/dist/Server/Utils/AI/Toolbox/ResourceTools.js.map +1 -1
- package/build/dist/Server/Utils/AutoRemediation/CommandPlanExecutor.js +997 -141
- package/build/dist/Server/Utils/AutoRemediation/CommandPlanExecutor.js.map +1 -1
- package/build/dist/Server/Utils/AutoRemediation/RemediationVerifier.js +299 -4
- package/build/dist/Server/Utils/AutoRemediation/RemediationVerifier.js.map +1 -1
- package/build/dist/Server/Utils/Database/AffectedResourceRelations.js +120 -0
- package/build/dist/Server/Utils/Database/AffectedResourceRelations.js.map +1 -0
- package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js +160 -1
- package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js.map +1 -1
- package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js +1 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js +59 -12
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js +5 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js +84 -22
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorPayloadRedaction.js +70 -5
- package/build/dist/Server/Utils/Monitor/MonitorPayloadRedaction.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/ProbeMonitorsNotification.js +249 -0
- package/build/dist/Server/Utils/Monitor/ProbeMonitorsNotification.js.map +1 -0
- package/build/dist/Server/Utils/OnCall/OnCallShiftReminderRunner.js +1 -0
- package/build/dist/Server/Utils/OnCall/OnCallShiftReminderRunner.js.map +1 -1
- package/build/dist/Server/Utils/PushNotificationUtil.js +27 -0
- package/build/dist/Server/Utils/PushNotificationUtil.js.map +1 -1
- package/build/dist/Server/Utils/Rules/OwnerRuleAssignment.js +26 -3
- package/build/dist/Server/Utils/Rules/OwnerRuleAssignment.js.map +1 -1
- package/build/dist/Server/Utils/Runbook/RunbookExecutePermission.js +38 -3
- package/build/dist/Server/Utils/Runbook/RunbookExecutePermission.js.map +1 -1
- package/build/dist/Server/Utils/SessionReplay/SessionReplayGateCache.js +8 -0
- package/build/dist/Server/Utils/SessionReplay/SessionReplayGateCache.js.map +1 -1
- package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js +143 -23
- package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js.map +1 -1
- package/build/dist/Server/Utils/SessionReplay/SessionReplayUserFlowReadService.js +406 -0
- package/build/dist/Server/Utils/SessionReplay/SessionReplayUserFlowReadService.js.map +1 -0
- package/build/dist/Server/Utils/StartServer.js +4 -3
- package/build/dist/Server/Utils/StartServer.js.map +1 -1
- package/build/dist/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.js +382 -0
- package/build/dist/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.js.map +1 -0
- package/build/dist/Server/Utils/TwoFactorBackupCodeNotification.js +1 -0
- package/build/dist/Server/Utils/TwoFactorBackupCodeNotification.js.map +1 -1
- package/build/dist/Server/Utils/UserPermission/UserPermission.js +10 -0
- package/build/dist/Server/Utils/UserPermission/UserPermission.js.map +1 -1
- package/build/dist/Server/Utils/Workflow/OAuth2TokenClient.js +447 -0
- package/build/dist/Server/Utils/Workflow/OAuth2TokenClient.js.map +1 -0
- package/build/dist/Server/Utils/Workflow/WorkflowVariableOAuthToken.js +202 -0
- package/build/dist/Server/Utils/Workflow/WorkflowVariableOAuthToken.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Alert.js +39 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Alert.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/AlertEpisode.js +44 -4
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/AlertEpisode.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.js +150 -191
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.js +44 -4
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Monitor.js +39 -17
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Monitor.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/ScheduledMaintenance.js +151 -145
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/ScheduledMaintenance.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +221 -127
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsServiceUrl.js +91 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsServiceUrl.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/ReactionNoteSync.js +673 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/ReactionNoteSync.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/Slack/Actions/ActionTypes.js +3 -9
- package/build/dist/Server/Utils/Workspace/Slack/Actions/ActionTypes.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/Slack/Actions/Alert.js +65 -166
- package/build/dist/Server/Utils/Workspace/Slack/Actions/Alert.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/Slack/Actions/AlertEpisode.js +63 -157
- package/build/dist/Server/Utils/Workspace/Slack/Actions/AlertEpisode.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/Slack/Actions/Auth.js +23 -3
- package/build/dist/Server/Utils/Workspace/Slack/Actions/Auth.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/Slack/Actions/Authorization.js +92 -0
- package/build/dist/Server/Utils/Workspace/Slack/Actions/Authorization.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/Slack/Actions/Incident.js +81 -210
- package/build/dist/Server/Utils/Workspace/Slack/Actions/Incident.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/Slack/Actions/IncidentEpisode.js +68 -138
- package/build/dist/Server/Utils/Workspace/Slack/Actions/IncidentEpisode.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/Slack/Actions/ReactionNote.js +240 -0
- package/build/dist/Server/Utils/Workspace/Slack/Actions/ReactionNote.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/Slack/Actions/ScheduledMaintenance.js +85 -212
- package/build/dist/Server/Utils/Workspace/Slack/Actions/ScheduledMaintenance.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/Slack/Slack.js +60 -17
- package/build/dist/Server/Utils/Workspace/Slack/Slack.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/Slack/app-manifest.json +2 -0
- package/build/dist/Server/Utils/Workspace/Workspace.js +134 -41
- package/build/dist/Server/Utils/Workspace/Workspace.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/WorkspaceActionAuthorization.js +197 -0
- package/build/dist/Server/Utils/Workspace/WorkspaceActionAuthorization.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/WorkspaceBase.js +32 -0
- package/build/dist/Server/Utils/Workspace/WorkspaceBase.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/WorkspaceOAuthState.js +199 -0
- package/build/dist/Server/Utils/Workspace/WorkspaceOAuthState.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/WorkspaceProjectReferenceValidator.js +91 -0
- package/build/dist/Server/Utils/Workspace/WorkspaceProjectReferenceValidator.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/WorkspaceReactionNote.js +450 -0
- package/build/dist/Server/Utils/Workspace/WorkspaceReactionNote.js.map +1 -0
- package/build/dist/Types/AutoRemediation/AiRemediationCommandPlan.js +103 -5
- package/build/dist/Types/AutoRemediation/AiRemediationCommandPlan.js.map +1 -1
- package/build/dist/Types/Date.js +97 -7
- package/build/dist/Types/Date.js.map +1 -1
- package/build/dist/Types/Email/EmailTemplateType.js +1 -0
- package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
- package/build/dist/Types/Exception/ExceptionMessages.js +1 -0
- package/build/dist/Types/Exception/ExceptionMessages.js.map +1 -1
- package/build/dist/Types/Incident/IncidentAlertLink.js +34 -0
- package/build/dist/Types/Incident/IncidentAlertLink.js.map +1 -0
- package/build/dist/Types/Kubernetes/KubernetesClusterAiAccess.js +245 -0
- package/build/dist/Types/Kubernetes/KubernetesClusterAiAccess.js.map +1 -0
- package/build/dist/Types/Kubernetes/KubernetesClusterAiAccessPermissions.js +49 -0
- package/build/dist/Types/Kubernetes/KubernetesClusterAiAccessPermissions.js.map +1 -0
- package/build/dist/Types/Kubernetes/KubernetesClusterAiAccessToolNames.js +16 -0
- package/build/dist/Types/Kubernetes/KubernetesClusterAiAccessToolNames.js.map +1 -0
- package/build/dist/Types/Monitor/DatabaseMonitor/SqlServerPlatform.js +104 -0
- package/build/dist/Types/Monitor/DatabaseMonitor/SqlServerPlatform.js.map +1 -0
- package/build/dist/Types/Monitor/KubernetesAlertTemplates.js +6 -5
- package/build/dist/Types/Monitor/KubernetesAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepExceptionMonitor.js +32 -0
- package/build/dist/Types/Monitor/MonitorStepExceptionMonitor.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorUptimeSummary.js +52 -0
- package/build/dist/Types/Monitor/MonitorUptimeSummary.js.map +1 -0
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js +9 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js.map +1 -1
- package/build/dist/Types/Permission.js +42 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/Rum/SessionReplay.js +52 -2
- package/build/dist/Types/Rum/SessionReplay.js.map +1 -1
- package/build/dist/Types/Rum/SessionReplayApi.js +11 -0
- package/build/dist/Types/Rum/SessionReplayApi.js.map +1 -1
- package/build/dist/Types/Rum/UserFlow.js +115 -0
- package/build/dist/Types/Rum/UserFlow.js.map +1 -0
- package/build/dist/Types/Rum/WebVitals.js +25 -0
- package/build/dist/Types/Rum/WebVitals.js.map +1 -1
- package/build/dist/Types/Runbook/RunbookStepType.js +10 -0
- package/build/dist/Types/Runbook/RunbookStepType.js.map +1 -1
- package/build/dist/Types/Runbook/RunnerJobOrigin.js +14 -0
- package/build/dist/Types/Runbook/RunnerJobOrigin.js.map +1 -1
- package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.js +2 -2
- package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.js.map +1 -1
- package/build/dist/Types/StatusPage/MergedDowntimeTotals.js +2 -0
- package/build/dist/Types/StatusPage/MergedDowntimeTotals.js.map +1 -0
- package/build/dist/Types/StatusPage/PublicNoteSubscriberNotificationDefault.js +65 -0
- package/build/dist/Types/StatusPage/PublicNoteSubscriberNotificationDefault.js.map +1 -0
- package/build/dist/Types/Telemetry/TelemetryIngestSurface.js +8 -0
- package/build/dist/Types/Telemetry/TelemetryIngestSurface.js.map +1 -1
- package/build/dist/Types/Timezone.js +5 -0
- package/build/dist/Types/Timezone.js.map +1 -1
- package/build/dist/Types/TimezoneAlias.js +340 -0
- package/build/dist/Types/TimezoneAlias.js.map +1 -0
- package/build/dist/Types/Workflow/Templates.js +2694 -2
- package/build/dist/Types/Workflow/Templates.js.map +1 -1
- package/build/dist/Types/Workflow/WorkflowVariableOAuth.js +314 -0
- package/build/dist/Types/Workflow/WorkflowVariableOAuth.js.map +1 -0
- package/build/dist/Types/Workspace/WorkspaceNoteReaction.js +98 -0
- package/build/dist/Types/Workspace/WorkspaceNoteReaction.js.map +1 -0
- package/build/dist/UI/Components/AttributesJSON/AttributesJSONPreferences.js +95 -0
- package/build/dist/UI/Components/AttributesJSON/AttributesJSONPreferences.js.map +1 -0
- package/build/dist/UI/Components/AttributesJSON/AttributesJSONView.js +44 -0
- package/build/dist/UI/Components/AttributesJSON/AttributesJSONView.js.map +1 -0
- package/build/dist/UI/Components/AttributesJSON/AttributesViewToggle.js +27 -0
- package/build/dist/UI/Components/AttributesJSON/AttributesViewToggle.js.map +1 -0
- package/build/dist/UI/Components/AttributesJSON/BracesGlyph.js +9 -0
- package/build/dist/UI/Components/AttributesJSON/BracesGlyph.js.map +1 -0
- package/build/dist/UI/Components/AttributesJSON/CopyAttributesAsJSONButton.js +260 -0
- package/build/dist/UI/Components/AttributesJSON/CopyAttributesAsJSONButton.js.map +1 -0
- package/build/dist/UI/Components/AttributesJSON/JSONHighlight.js +56 -0
- package/build/dist/UI/Components/AttributesJSON/JSONHighlight.js.map +1 -0
- package/build/dist/UI/Components/Calendar/Calendar.js +94 -7
- package/build/dist/UI/Components/Calendar/Calendar.js.map +1 -1
- package/build/dist/UI/Components/Calendar/CalendarDayLayout.js +136 -0
- package/build/dist/UI/Components/Calendar/CalendarDayLayout.js.map +1 -0
- package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js +1 -1
- package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js.map +1 -1
- package/build/dist/UI/Components/Charts/Utils/HistogramSelection.js +72 -0
- package/build/dist/UI/Components/Charts/Utils/HistogramSelection.js.map +1 -0
- package/build/dist/UI/Components/Charts/Utils/useHistogramRangeSelection.js +178 -0
- package/build/dist/UI/Components/Charts/Utils/useHistogramRangeSelection.js.map +1 -0
- package/build/dist/UI/Components/Charts/Utils/useHistogramZoom.js +13 -1
- package/build/dist/UI/Components/Charts/Utils/useHistogramZoom.js.map +1 -1
- package/build/dist/UI/Components/Date/CustomTimeRangeModal.js +20 -4
- package/build/dist/UI/Components/Date/CustomTimeRangeModal.js.map +1 -1
- package/build/dist/UI/Components/Detail/FieldLabel.js +2 -0
- package/build/dist/UI/Components/Detail/FieldLabel.js.map +1 -1
- package/build/dist/UI/Components/Dropdown/Dropdown.js +33 -9
- package/build/dist/UI/Components/Dropdown/Dropdown.js.map +1 -1
- package/build/dist/UI/Components/Forms/Fields/FormField.js +36 -13
- package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
- package/build/dist/UI/Components/Graphs/DayUptimeGraph.js +117 -11
- package/build/dist/UI/Components/Graphs/DayUptimeGraph.js.map +1 -1
- package/build/dist/UI/Components/Graphs/UptimeBarTooltip.js +5 -1
- package/build/dist/UI/Components/Graphs/UptimeBarTooltip.js.map +1 -1
- package/build/dist/UI/Components/Graphs/UptimeDaySummary.js.map +1 -1
- package/build/dist/UI/Components/InfoCard/InfoCard.js +22 -1
- package/build/dist/UI/Components/InfoCard/InfoCard.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/LogsViewer.js +36 -8
- package/build/dist/UI/Components/LogsViewer/LogsViewer.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/ColumnSelector.js +10 -2
- package/build/dist/UI/Components/LogsViewer/components/ColumnSelector.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/KeyboardShortcutsHelp.js +9 -1
- package/build/dist/UI/Components/LogsViewer/components/KeyboardShortcutsHelp.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogDetailsPanel.js +16 -15
- package/build/dist/UI/Components/LogsViewer/components/LogDetailsPanel.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsHistogram.js +14 -74
- package/build/dist/UI/Components/LogsViewer/components/LogsHistogram.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsViewerToolbar.js +22 -5
- package/build/dist/UI/Components/LogsViewer/components/LogsViewerToolbar.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/SavedViewsDropdown.js +9 -2
- package/build/dist/UI/Components/LogsViewer/components/SavedViewsDropdown.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/useLogsHistogram.js +16 -5
- package/build/dist/UI/Components/LogsViewer/useLogsHistogram.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +89 -22
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/MonitorGraphs/Uptime.js +7 -1
- package/build/dist/UI/Components/MonitorGraphs/Uptime.js.map +1 -1
- package/build/dist/UI/Components/MonitorGraphs/UptimeBarDayModal.js +5 -1
- package/build/dist/UI/Components/MonitorGraphs/UptimeBarDayModal.js.map +1 -1
- package/build/dist/UI/Components/Page/ModelPage.js +37 -3
- package/build/dist/UI/Components/Page/ModelPage.js.map +1 -1
- package/build/dist/UI/Components/Table/TableHeader.js +18 -2
- package/build/dist/UI/Components/Table/TableHeader.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js +27 -6
- package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryDetailPanel.js +7 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryDetailPanel.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js +17 -77
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetrySearchBar.js +10 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetrySearchBar.js.map +1 -1
- package/build/dist/UI/Components/Tooltip/InfoTooltip.js +28 -0
- package/build/dist/UI/Components/Tooltip/InfoTooltip.js.map +1 -0
- package/build/dist/UI/Utils/ModelAPI/ProjectUsersModelAPI.js +15 -1
- package/build/dist/UI/Utils/ModelAPI/ProjectUsersModelAPI.js.map +1 -1
- package/build/dist/UI/Utils/PermissionGate.js +4 -2
- package/build/dist/UI/Utils/PermissionGate.js.map +1 -1
- package/build/dist/UI/Utils/Timezone.js +52 -17
- package/build/dist/UI/Utils/Timezone.js.map +1 -1
- package/build/dist/Utils/AI/InvestigationReport.js +116 -21
- package/build/dist/Utils/AI/InvestigationReport.js.map +1 -1
- package/build/dist/Utils/AiRemediation/KubectlOutputRedactor.js +1209 -0
- package/build/dist/Utils/AiRemediation/KubectlOutputRedactor.js.map +1 -0
- package/build/dist/Utils/AiRemediation/KubectlPolicy.js +2973 -0
- package/build/dist/Utils/AiRemediation/KubectlPolicy.js.map +1 -0
- package/build/dist/Utils/AiRemediation/KubectlWaitBudget.js +99 -0
- package/build/dist/Utils/AiRemediation/KubectlWaitBudget.js.map +1 -0
- package/build/dist/Utils/AiRemediation/KubectlWriteScope.js +1429 -0
- package/build/dist/Utils/AiRemediation/KubectlWriteScope.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardClockComponent.js +7 -6
- package/build/dist/Utils/Dashboard/Components/DashboardClockComponent.js.map +1 -1
- package/build/dist/Utils/Incident/IncidentFromAlerts.js +306 -0
- package/build/dist/Utils/Incident/IncidentFromAlerts.js.map +1 -0
- package/build/dist/Utils/Monitor/IncomingEmailMonitorAddress.js +214 -0
- package/build/dist/Utils/Monitor/IncomingEmailMonitorAddress.js.map +1 -0
- package/build/dist/Utils/Monitor/MonitorCheckScheduleUtil.js +471 -0
- package/build/dist/Utils/Monitor/MonitorCheckScheduleUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/MonitorOverviewCriteriaUtil.js +107 -0
- package/build/dist/Utils/Monitor/MonitorOverviewCriteriaUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/MonitorOverviewFamily.js +191 -0
- package/build/dist/Utils/Monitor/MonitorOverviewFamily.js.map +1 -0
- package/build/dist/Utils/Monitor/MonitorOverviewPresentationUtil.js +1259 -0
- package/build/dist/Utils/Monitor/MonitorOverviewPresentationUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/MonitorOverviewProbeUtil.js +593 -0
- package/build/dist/Utils/Monitor/MonitorOverviewProbeUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/MonitorOverviewTargetUtil.js +195 -0
- package/build/dist/Utils/Monitor/MonitorOverviewTargetUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/MonitorStatusHistoryUtil.js +127 -0
- package/build/dist/Utils/Monitor/MonitorStatusHistoryUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/MonitorUptimeSummaryUtil.js +464 -0
- package/build/dist/Utils/Monitor/MonitorUptimeSummaryUtil.js.map +1 -0
- package/build/dist/Utils/Rum/SessionIdentity.js +31 -1
- package/build/dist/Utils/Rum/SessionIdentity.js.map +1 -1
- package/build/dist/Utils/Rum/SessionReplayWireEncoding.js +128 -0
- package/build/dist/Utils/Rum/SessionReplayWireEncoding.js.map +1 -0
- package/build/dist/Utils/Rum/SessionTraceState.js +154 -0
- package/build/dist/Utils/Rum/SessionTraceState.js.map +1 -0
- package/build/dist/Utils/Rum/UserFlow.js +941 -0
- package/build/dist/Utils/Rum/UserFlow.js.map +1 -0
- package/build/dist/Utils/StatusPage/MonitorGroupMergedDowntimeUtil.js +82 -0
- package/build/dist/Utils/StatusPage/MonitorGroupMergedDowntimeUtil.js.map +1 -0
- package/build/dist/Utils/StatusPage/ResourceUptime.js +46 -0
- package/build/dist/Utils/StatusPage/ResourceUptime.js.map +1 -1
- package/build/dist/Utils/StatusPage/UptimeDailyAggregateUtil.js +148 -0
- package/build/dist/Utils/StatusPage/UptimeDailyAggregateUtil.js.map +1 -1
- package/build/dist/Utils/Telemetry/AttributesJSON.js +245 -0
- package/build/dist/Utils/Telemetry/AttributesJSON.js.map +1 -0
- package/build/dist/Utils/Uptime/DayUptimeGraphUtil.js +103 -0
- package/build/dist/Utils/Uptime/DayUptimeGraphUtil.js.map +1 -1
- package/build/dist/Utils/Uptime/UptimeUtil.js +91 -27
- package/build/dist/Utils/Uptime/UptimeUtil.js.map +1 -1
- package/jest.config.json +2 -1
- package/package.json +2 -1
- package/tsconfig.tests.json +36 -0
- package/Tests/UI/Components/EmptyState/EmptyStateGuideLinks.test.tsx +0 -337
- package/UI/Components/EmptyState/EmptyStateGuideLinks.tsx +0 -124
- package/build/dist/UI/Components/EmptyState/EmptyStateGuideLinks.js +0 -47
- package/build/dist/UI/Components/EmptyState/EmptyStateGuideLinks.js.map +0 -1
|
@@ -7,6 +7,7 @@ import Monitor from "../../Models/DatabaseModels/Monitor";
|
|
|
7
7
|
import Project from "../../Models/DatabaseModels/Project";
|
|
8
8
|
import Runbook from "../../Models/DatabaseModels/Runbook";
|
|
9
9
|
import RunbookExecution from "../../Models/DatabaseModels/RunbookExecution";
|
|
10
|
+
import RunnerJob from "../../Models/DatabaseModels/RunnerJob";
|
|
10
11
|
import { AlertFeedEventType } from "../../Models/DatabaseModels/AlertFeed";
|
|
11
12
|
import { IncidentFeedEventType } from "../../Models/DatabaseModels/IncidentFeed";
|
|
12
13
|
import AlertSeverity from "../../Models/DatabaseModels/AlertSeverity";
|
|
@@ -17,6 +18,17 @@ import AutoRemediationSuggestionStatus from "../../Types/AutoRemediation/AutoRem
|
|
|
17
18
|
import AutoRemediationSuggestionType from "../../Types/AutoRemediation/AutoRemediationSuggestionType";
|
|
18
19
|
import AutoRemediationVerificationStatus from "../../Types/AutoRemediation/AutoRemediationVerificationStatus";
|
|
19
20
|
import AutoRemediationTriggerEntity from "../../Types/AutoRemediation/AutoRemediationTriggerEntity";
|
|
21
|
+
import {
|
|
22
|
+
APPROVED_COMMAND_STEP_ID_PREFIX,
|
|
23
|
+
INLINE_COMMAND_STEP_ID_PREFIX,
|
|
24
|
+
KUBECTL_ALWAYS_ASKS_SUMMARY,
|
|
25
|
+
KUBECTL_SAFE_CHANGES_SUMMARY,
|
|
26
|
+
} from "../../Types/AutoRemediation/AiRemediationCommandPlan";
|
|
27
|
+
import {
|
|
28
|
+
KubernetesAiRemediationMode,
|
|
29
|
+
KubernetesClusterAiAccessStatus,
|
|
30
|
+
} from "../../Types/Kubernetes/KubernetesClusterAiAccess";
|
|
31
|
+
import RunnerJobOrigin from "../../Types/Runbook/RunnerJobOrigin";
|
|
20
32
|
import { Indigo500 } from "../../Types/BrandColors";
|
|
21
33
|
import OneUptimeDate from "../../Types/Date";
|
|
22
34
|
import ObjectID from "../../Types/ObjectID";
|
|
@@ -27,9 +39,11 @@ import AlertFeedService from "./AlertFeedService";
|
|
|
27
39
|
import AutoRemediationRuleService from "./AutoRemediationRuleService";
|
|
28
40
|
import AutoRemediationSuggestionService from "./AutoRemediationSuggestionService";
|
|
29
41
|
import IncidentFeedService from "./IncidentFeedService";
|
|
42
|
+
import KubernetesClusterAiAccessService from "./KubernetesClusterAiAccessService";
|
|
30
43
|
import LlmProviderService from "./LlmProviderService";
|
|
31
44
|
import ProjectService from "./ProjectService";
|
|
32
45
|
import RunbookRuleEngineService from "./RunbookRuleEngineService";
|
|
46
|
+
import RunnerJobService from "./RunnerJobService";
|
|
33
47
|
import AIInvestigationQueue from "../Utils/AI/SRE/InvestigationQueue";
|
|
34
48
|
import Semaphore, { SemaphoreMutex } from "../Infrastructure/Semaphore";
|
|
35
49
|
import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
|
|
@@ -62,12 +76,563 @@ export const MAX_AUTO_EXECUTIONS_PER_RULE_PER_HOUR: number = 3;
|
|
|
62
76
|
*/
|
|
63
77
|
export const DEFAULT_VERIFICATION_WINDOW_MINUTES: number = 15;
|
|
64
78
|
|
|
79
|
+
/*
|
|
80
|
+
* - Cluster-level remediation (a cluster's AI page, no rule) may try at most
|
|
81
|
+
* this many rounds per subject per cluster: the first plan, then one
|
|
82
|
+
* follow-up when verification fails ("ask again for a new set of
|
|
83
|
+
* commands"). Beyond that a human takes over.
|
|
84
|
+
*/
|
|
85
|
+
export const MAX_CLUSTER_REMEDIATION_ROUNDS_PER_SUBJECT: number = 2;
|
|
86
|
+
|
|
87
|
+
/*
|
|
88
|
+
* Upper bound on the rows the per-cluster circuit breaker and the in-flight
|
|
89
|
+
* round check read for one cluster. The project-wide hourly AI-command cap
|
|
90
|
+
* keeps the real numbers far below this; the bound only stops a runaway
|
|
91
|
+
* read.
|
|
92
|
+
*/
|
|
93
|
+
const MAX_CLUSTER_ROUND_ROWS: number = 100;
|
|
94
|
+
|
|
95
|
+
/*
|
|
96
|
+
* How long a Planning unattended round is taken to still be running. A run
|
|
97
|
+
* lasts at most ten minutes; the rest is queue slack. A round stuck in
|
|
98
|
+
* Planning longer than this is the stranded-suggestion sweeper's business,
|
|
99
|
+
* not a reason to keep every other round on the cluster asking.
|
|
100
|
+
*/
|
|
101
|
+
const IN_FLIGHT_ROUND_WINDOW_HOURS: number = 1;
|
|
102
|
+
|
|
103
|
+
/*
|
|
104
|
+
* A fix whose verification is still Pending holds its cluster until the
|
|
105
|
+
* verifier settles it. The verifier sweeps every minute, so a deadline this
|
|
106
|
+
* far in the past means the verifier is not running — stop holding.
|
|
107
|
+
*/
|
|
108
|
+
const PENDING_VERIFICATION_HOLD_GRACE_MINUTES: number = 10;
|
|
109
|
+
|
|
110
|
+
/*
|
|
111
|
+
* Approved plans can be verified long after their round was created (a
|
|
112
|
+
* human approves hours later), so the in-flight round read looks back this
|
|
113
|
+
* far and lets the verification deadline decide.
|
|
114
|
+
*/
|
|
115
|
+
const HELD_ROUND_LOOKBACK_HOURS: number = 24;
|
|
116
|
+
|
|
117
|
+
/*
|
|
118
|
+
* The canonical every-mode clause (UNATTENDED_ROUND_BECOMES_PROPOSAL_SUMMARY)
|
|
119
|
+
* in the feed's words: what "holds the cluster" means to the human reading
|
|
120
|
+
* the announcement of an unattended round.
|
|
121
|
+
*/
|
|
122
|
+
const UNATTENDED_ROUND_PROPOSAL_FEED_SENTENCE: string =
|
|
123
|
+
"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.";
|
|
124
|
+
|
|
125
|
+
// "a write ..." -> "A write ..." for copy that starts a sentence.
|
|
126
|
+
function capitalizeFirst(text: string): string {
|
|
127
|
+
return text.charAt(0).toUpperCase() + text.slice(1);
|
|
128
|
+
}
|
|
129
|
+
|
|
65
130
|
type SubjectLinkage = {
|
|
66
131
|
incidentId?: ObjectID | undefined;
|
|
67
132
|
alertId?: ObjectID | undefined;
|
|
68
133
|
};
|
|
69
134
|
|
|
135
|
+
export interface ClusterBreakerState {
|
|
136
|
+
autoExecutedInWindow: number;
|
|
137
|
+
hasHeadroom: boolean;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/*
|
|
141
|
+
* The round (or rule-driven run) a breaker or in-flight check is made for.
|
|
142
|
+
* Its own row never counts against it, and among unattended rounds still
|
|
143
|
+
* running only the ones created BEFORE it do: when several rounds are
|
|
144
|
+
* announced at once, the earliest ones keep their unattended slot and the
|
|
145
|
+
* later ones ask — instead of every round counting every other one and all
|
|
146
|
+
* of them asking.
|
|
147
|
+
*/
|
|
148
|
+
export interface ClusterRoundReference {
|
|
149
|
+
suggestionId: ObjectID;
|
|
150
|
+
createdAt?: Date | undefined;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/*
|
|
154
|
+
* Another cluster-level round that currently holds a cluster: it is still
|
|
155
|
+
* running unattended, or its fix is still inside its verification window.
|
|
156
|
+
* Two unattended agents changing one cluster at once — each with its own
|
|
157
|
+
* verification and rollback — undo each other's fixes, so a second
|
|
158
|
+
* unattended round on a held cluster asks instead.
|
|
159
|
+
*/
|
|
160
|
+
export interface ClusterRoundHold {
|
|
161
|
+
suggestionId: string;
|
|
162
|
+
ruleNameSnapshot?: string | undefined;
|
|
163
|
+
// Completes "another OneUptime AI round on this cluster ...".
|
|
164
|
+
description: string;
|
|
165
|
+
isSameSubject: boolean;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
const CLUSTER_ROUND_NAME_PREFIX: string = "AI remediation for cluster";
|
|
169
|
+
|
|
170
|
+
/*
|
|
171
|
+
* The name a cluster-level round carries. Server-written, and parsed back
|
|
172
|
+
* by parseClusterRoundNameSnapshot: a cluster delete nulls the round's
|
|
173
|
+
* kubernetesClusterId (ON DELETE SET NULL), and this name is then the only
|
|
174
|
+
* thing left that says the round belonged to a cluster rather than a rule.
|
|
175
|
+
*/
|
|
176
|
+
export function getClusterRoundNameSnapshot(
|
|
177
|
+
clusterName: string,
|
|
178
|
+
round: number,
|
|
179
|
+
): string {
|
|
180
|
+
return `${CLUSTER_ROUND_NAME_PREFIX} "${clusterName}"${
|
|
181
|
+
round > 1 ? ` (round ${round})` : ""
|
|
182
|
+
}`;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/*
|
|
186
|
+
* The cluster name inside a cluster round's name snapshot, or null when the
|
|
187
|
+
* snapshot is not one. A rule can in principle be NAMED like a cluster
|
|
188
|
+
* round, so callers only trust this on a row that has neither a rule nor a
|
|
189
|
+
* cluster link left, where it is the best evidence there is.
|
|
190
|
+
*/
|
|
191
|
+
export function parseClusterRoundNameSnapshot(
|
|
192
|
+
name: unknown,
|
|
193
|
+
): { clusterName: string } | null {
|
|
194
|
+
if (typeof name !== "string") {
|
|
195
|
+
return null;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
const match: RegExpMatchArray | null = name.match(
|
|
199
|
+
/^AI remediation for cluster "(.*)"(?: \(round \d+\))?$/,
|
|
200
|
+
);
|
|
201
|
+
|
|
202
|
+
if (!match) {
|
|
203
|
+
return null;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
return { clusterName: match[1] || "" };
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
// Is `row` ordered before the reference (createdAt, then id as tie-break)?
|
|
210
|
+
function isRoundOrderedBefore(
|
|
211
|
+
row: AutoRemediationSuggestion,
|
|
212
|
+
reference: ClusterRoundReference | undefined,
|
|
213
|
+
): boolean {
|
|
214
|
+
if (!reference?.createdAt || !row.createdAt) {
|
|
215
|
+
// Order unknown: count it — the breaker's fail direction.
|
|
216
|
+
return true;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
const rowTime: number = new Date(row.createdAt).getTime();
|
|
220
|
+
const referenceTime: number = new Date(reference.createdAt).getTime();
|
|
221
|
+
|
|
222
|
+
if (rowTime !== referenceTime) {
|
|
223
|
+
return rowTime < referenceTime;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
return (row.id?.toString() || "") < (reference.suggestionId.toString() || "");
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
function isSameSubject(
|
|
230
|
+
row: AutoRemediationSuggestion,
|
|
231
|
+
subject: SubjectLinkage,
|
|
232
|
+
): boolean {
|
|
233
|
+
if (subject.incidentId && row.incidentId) {
|
|
234
|
+
return row.incidentId.toString() === subject.incidentId.toString();
|
|
235
|
+
}
|
|
236
|
+
if (subject.alertId && row.alertId) {
|
|
237
|
+
return row.alertId.toString() === subject.alertId.toString();
|
|
238
|
+
}
|
|
239
|
+
return false;
|
|
240
|
+
}
|
|
241
|
+
|
|
70
242
|
class AutoRemediationRuleEngineServiceClass {
|
|
243
|
+
/*
|
|
244
|
+
* The per-cluster hourly circuit breaker. It counts distinct unattended
|
|
245
|
+
* AI fixes on the cluster in the last hour, three ways, the larger total
|
|
246
|
+
* winning:
|
|
247
|
+
* - cluster-level rounds already settled AutoExecuted (their suggestion
|
|
248
|
+
* carries the cluster id);
|
|
249
|
+
* - distinct AI runs — cluster-level OR rule-driven — that executed at
|
|
250
|
+
* least one inline `ai-command-*` kubectl job on the cluster (a
|
|
251
|
+
* rule-driven run's suggestion carries no cluster id; its jobs do);
|
|
252
|
+
* - unattended cluster rounds still IN FLIGHT: Planning with a FullAuto
|
|
253
|
+
* snapshot, created before the asking round. A round that is still
|
|
254
|
+
* diagnosing has written nothing yet, so without this term every
|
|
255
|
+
* round announced in the same storm would read the same stale count
|
|
256
|
+
* and all of them would run unattended.
|
|
257
|
+
* The in-flight rounds and the runs with inline jobs are unioned by
|
|
258
|
+
* suggestion id (a running round that already executed shows up in both).
|
|
259
|
+
*
|
|
260
|
+
* The in-flight rows are read FIRST: a round that settles between the
|
|
261
|
+
* reads moves from Planning to AutoExecuted and is caught by the settled
|
|
262
|
+
* read that follows, never missed by both.
|
|
263
|
+
*
|
|
264
|
+
* Throws on a failed read: every caller fails safe to "no headroom".
|
|
265
|
+
*/
|
|
266
|
+
@CaptureSpan()
|
|
267
|
+
public async getClusterBreakerState(data: {
|
|
268
|
+
clusterId: string;
|
|
269
|
+
projectId?: ObjectID | undefined;
|
|
270
|
+
forRound?: ClusterRoundReference | undefined;
|
|
271
|
+
}): Promise<ClusterBreakerState> {
|
|
272
|
+
const since: Date = OneUptimeDate.getSomeHoursAgo(1);
|
|
273
|
+
const clusterId: ObjectID = new ObjectID(data.clusterId);
|
|
274
|
+
const selfId: string | undefined = data.forRound?.suggestionId.toString();
|
|
275
|
+
|
|
276
|
+
const inFlightRounds: Array<AutoRemediationSuggestion> =
|
|
277
|
+
await AutoRemediationSuggestionService.findBy({
|
|
278
|
+
query: {
|
|
279
|
+
...(data.projectId ? { projectId: data.projectId } : {}),
|
|
280
|
+
kubernetesClusterId: clusterId,
|
|
281
|
+
suggestionType: AutoRemediationSuggestionType.CommandPlan,
|
|
282
|
+
status: AutoRemediationSuggestionStatus.Planning,
|
|
283
|
+
executionMode: AutoRemediationExecutionMode.FullAuto,
|
|
284
|
+
createdAt: QueryHelper.greaterThan(since),
|
|
285
|
+
},
|
|
286
|
+
select: {
|
|
287
|
+
_id: true,
|
|
288
|
+
createdAt: true,
|
|
289
|
+
},
|
|
290
|
+
limit: MAX_CLUSTER_ROUND_ROWS,
|
|
291
|
+
skip: 0,
|
|
292
|
+
props: { isRoot: true },
|
|
293
|
+
});
|
|
294
|
+
|
|
295
|
+
const settledClusterRounds: number = (
|
|
296
|
+
await AutoRemediationSuggestionService.countBy({
|
|
297
|
+
query: {
|
|
298
|
+
kubernetesClusterId: clusterId,
|
|
299
|
+
suggestionType: AutoRemediationSuggestionType.CommandPlan,
|
|
300
|
+
status: AutoRemediationSuggestionStatus.AutoExecuted,
|
|
301
|
+
createdAt: QueryHelper.greaterThan(since),
|
|
302
|
+
},
|
|
303
|
+
props: { isRoot: true },
|
|
304
|
+
})
|
|
305
|
+
).toNumber();
|
|
306
|
+
|
|
307
|
+
const inlineKubectlJobs: Array<RunnerJob> = await RunnerJobService.findBy({
|
|
308
|
+
query: {
|
|
309
|
+
...(data.projectId ? { projectId: data.projectId } : {}),
|
|
310
|
+
kubernetesClusterId: clusterId,
|
|
311
|
+
origin: RunnerJobOrigin.AiRemediation,
|
|
312
|
+
stepId: QueryHelper.startsWith(INLINE_COMMAND_STEP_ID_PREFIX),
|
|
313
|
+
createdAt: QueryHelper.greaterThan(since),
|
|
314
|
+
},
|
|
315
|
+
select: {
|
|
316
|
+
_id: true,
|
|
317
|
+
autoRemediationSuggestionId: true,
|
|
318
|
+
},
|
|
319
|
+
limit: MAX_CLUSTER_ROUND_ROWS,
|
|
320
|
+
skip: 0,
|
|
321
|
+
props: { isRoot: true },
|
|
322
|
+
});
|
|
323
|
+
|
|
324
|
+
const unattendedRuns: Set<string> = new Set<string>();
|
|
325
|
+
|
|
326
|
+
for (const job of inlineKubectlJobs) {
|
|
327
|
+
unattendedRuns.add(
|
|
328
|
+
job.autoRemediationSuggestionId?.toString() || job.id?.toString() || "",
|
|
329
|
+
);
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
for (const round of inFlightRounds) {
|
|
333
|
+
if (isRoundOrderedBefore(round, data.forRound)) {
|
|
334
|
+
unattendedRuns.add(round.id?.toString() || "");
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
// The asking round never counts against itself.
|
|
339
|
+
if (selfId) {
|
|
340
|
+
unattendedRuns.delete(selfId);
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
const autoExecutedInWindow: number = Math.max(
|
|
344
|
+
settledClusterRounds,
|
|
345
|
+
unattendedRuns.size,
|
|
346
|
+
);
|
|
347
|
+
|
|
348
|
+
return {
|
|
349
|
+
autoExecutedInWindow,
|
|
350
|
+
hasHeadroom: autoExecutedInWindow < MAX_AUTO_EXECUTIONS_PER_RULE_PER_HOUR,
|
|
351
|
+
};
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
/*
|
|
355
|
+
* Another AI run that holds this cluster right now, or null.
|
|
356
|
+
*
|
|
357
|
+
* A cluster-level round holds its cluster while it is still running
|
|
358
|
+
* unattended (Planning with a FullAuto snapshot — only rounds created
|
|
359
|
+
* before the asking one, unless `anyOrder`) and while its executed fix is
|
|
360
|
+
* still being verified (AutoExecuted or Approved, verification Pending) —
|
|
361
|
+
* whatever subject it is for: an alert and an incident of one monitor
|
|
362
|
+
* each get their own round on the same cluster. With `subject`, any
|
|
363
|
+
* round of that same signal still composing (Planning, asking or not)
|
|
364
|
+
* holds it too: a rule-driven run must not change a cluster whose own
|
|
365
|
+
* round is working on the very same signal.
|
|
366
|
+
*
|
|
367
|
+
* A rule-driven run carries no cluster id — its kubectl JOBS do. One that
|
|
368
|
+
* already changed the cluster (an inline or approved kubectl job there)
|
|
369
|
+
* holds it the same way: while it is still running (whatever the order:
|
|
370
|
+
* it has already written), and while its fix is still being verified. So
|
|
371
|
+
* "one unattended round per cluster at a time" holds in both directions,
|
|
372
|
+
* not only for a rule run yielding to a cluster round.
|
|
373
|
+
*
|
|
374
|
+
* Throws on a failed read: callers fail safe to "held".
|
|
375
|
+
*/
|
|
376
|
+
@CaptureSpan()
|
|
377
|
+
public async findRoundHoldingCluster(data: {
|
|
378
|
+
projectId: ObjectID;
|
|
379
|
+
clusterId: string;
|
|
380
|
+
forRound?: ClusterRoundReference | undefined;
|
|
381
|
+
anyOrder?: boolean | undefined;
|
|
382
|
+
subject?: SubjectLinkage | undefined;
|
|
383
|
+
}): Promise<ClusterRoundHold | null> {
|
|
384
|
+
const rows: Array<AutoRemediationSuggestion> =
|
|
385
|
+
await AutoRemediationSuggestionService.findBy({
|
|
386
|
+
query: {
|
|
387
|
+
projectId: data.projectId,
|
|
388
|
+
kubernetesClusterId: new ObjectID(data.clusterId),
|
|
389
|
+
suggestionType: AutoRemediationSuggestionType.CommandPlan,
|
|
390
|
+
status: QueryHelper.any([
|
|
391
|
+
AutoRemediationSuggestionStatus.Planning,
|
|
392
|
+
AutoRemediationSuggestionStatus.AutoExecuted,
|
|
393
|
+
AutoRemediationSuggestionStatus.Approved,
|
|
394
|
+
]),
|
|
395
|
+
createdAt: QueryHelper.greaterThan(
|
|
396
|
+
OneUptimeDate.getSomeHoursAgo(HELD_ROUND_LOOKBACK_HOURS),
|
|
397
|
+
),
|
|
398
|
+
},
|
|
399
|
+
select: {
|
|
400
|
+
_id: true,
|
|
401
|
+
status: true,
|
|
402
|
+
executionMode: true,
|
|
403
|
+
verificationStatus: true,
|
|
404
|
+
verificationDeadlineAt: true,
|
|
405
|
+
incidentId: true,
|
|
406
|
+
alertId: true,
|
|
407
|
+
ruleNameSnapshot: true,
|
|
408
|
+
createdAt: true,
|
|
409
|
+
},
|
|
410
|
+
limit: MAX_CLUSTER_ROUND_ROWS,
|
|
411
|
+
skip: 0,
|
|
412
|
+
props: { isRoot: true },
|
|
413
|
+
});
|
|
414
|
+
|
|
415
|
+
const selfId: string | undefined = data.forRound?.suggestionId.toString();
|
|
416
|
+
|
|
417
|
+
for (const row of rows) {
|
|
418
|
+
const rowId: string = row.id?.toString() || "";
|
|
419
|
+
|
|
420
|
+
if (!rowId || rowId === selfId) {
|
|
421
|
+
continue;
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
const hold: ClusterRoundHold | null = this.getHold({
|
|
425
|
+
row,
|
|
426
|
+
rowId,
|
|
427
|
+
hasChangedCluster: false,
|
|
428
|
+
anyOrder: data.anyOrder === true,
|
|
429
|
+
forRound: data.forRound,
|
|
430
|
+
subject: data.subject,
|
|
431
|
+
});
|
|
432
|
+
|
|
433
|
+
if (hold) {
|
|
434
|
+
return hold;
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
/*
|
|
439
|
+
* Rule-driven runs that changed this cluster: found through their
|
|
440
|
+
* kubectl jobs on it (inline while the run planned, or an approved
|
|
441
|
+
* plan's), never through a cluster id they do not carry.
|
|
442
|
+
*/
|
|
443
|
+
const seen: Set<string> = new Set<string>(
|
|
444
|
+
rows.map((row: AutoRemediationSuggestion) => {
|
|
445
|
+
return row.id?.toString() || "";
|
|
446
|
+
}),
|
|
447
|
+
);
|
|
448
|
+
|
|
449
|
+
if (selfId) {
|
|
450
|
+
seen.add(selfId);
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
const kubectlJobs: Array<RunnerJob> = await RunnerJobService.findBy({
|
|
454
|
+
query: {
|
|
455
|
+
projectId: data.projectId,
|
|
456
|
+
kubernetesClusterId: new ObjectID(data.clusterId),
|
|
457
|
+
origin: RunnerJobOrigin.AiRemediation,
|
|
458
|
+
createdAt: QueryHelper.greaterThan(
|
|
459
|
+
OneUptimeDate.getSomeHoursAgo(HELD_ROUND_LOOKBACK_HOURS),
|
|
460
|
+
),
|
|
461
|
+
},
|
|
462
|
+
select: {
|
|
463
|
+
_id: true,
|
|
464
|
+
autoRemediationSuggestionId: true,
|
|
465
|
+
stepId: true,
|
|
466
|
+
},
|
|
467
|
+
limit: MAX_CLUSTER_ROUND_ROWS,
|
|
468
|
+
skip: 0,
|
|
469
|
+
props: { isRoot: true },
|
|
470
|
+
});
|
|
471
|
+
|
|
472
|
+
const changedBy: Set<string> = new Set<string>();
|
|
473
|
+
|
|
474
|
+
for (const job of kubectlJobs) {
|
|
475
|
+
const suggestionId: string =
|
|
476
|
+
job.autoRemediationSuggestionId?.toString() || "";
|
|
477
|
+
const stepId: string = job.stepId || "";
|
|
478
|
+
|
|
479
|
+
// A rollback job belongs to a fix whose verification already failed.
|
|
480
|
+
const isForwardChange: boolean =
|
|
481
|
+
stepId.startsWith(INLINE_COMMAND_STEP_ID_PREFIX) ||
|
|
482
|
+
stepId.startsWith(APPROVED_COMMAND_STEP_ID_PREFIX);
|
|
483
|
+
|
|
484
|
+
if (suggestionId && isForwardChange && !seen.has(suggestionId)) {
|
|
485
|
+
changedBy.add(suggestionId);
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
if (changedBy.size === 0) {
|
|
490
|
+
return null;
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
const runs: Array<AutoRemediationSuggestion> =
|
|
494
|
+
await AutoRemediationSuggestionService.findBy({
|
|
495
|
+
query: {
|
|
496
|
+
projectId: data.projectId,
|
|
497
|
+
_id: QueryHelper.any(Array.from(changedBy)),
|
|
498
|
+
suggestionType: AutoRemediationSuggestionType.CommandPlan,
|
|
499
|
+
status: QueryHelper.any([
|
|
500
|
+
AutoRemediationSuggestionStatus.Planning,
|
|
501
|
+
AutoRemediationSuggestionStatus.AutoExecuted,
|
|
502
|
+
AutoRemediationSuggestionStatus.Approved,
|
|
503
|
+
]),
|
|
504
|
+
},
|
|
505
|
+
select: {
|
|
506
|
+
_id: true,
|
|
507
|
+
status: true,
|
|
508
|
+
executionMode: true,
|
|
509
|
+
verificationStatus: true,
|
|
510
|
+
verificationDeadlineAt: true,
|
|
511
|
+
incidentId: true,
|
|
512
|
+
alertId: true,
|
|
513
|
+
ruleNameSnapshot: true,
|
|
514
|
+
createdAt: true,
|
|
515
|
+
},
|
|
516
|
+
limit: MAX_CLUSTER_ROUND_ROWS,
|
|
517
|
+
skip: 0,
|
|
518
|
+
props: { isRoot: true },
|
|
519
|
+
});
|
|
520
|
+
|
|
521
|
+
for (const run of runs) {
|
|
522
|
+
const runId: string = run.id?.toString() || "";
|
|
523
|
+
|
|
524
|
+
if (!changedBy.has(runId)) {
|
|
525
|
+
continue;
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
const hold: ClusterRoundHold | null = this.getHold({
|
|
529
|
+
row: run,
|
|
530
|
+
rowId: runId,
|
|
531
|
+
hasChangedCluster: true,
|
|
532
|
+
anyOrder: data.anyOrder === true,
|
|
533
|
+
forRound: data.forRound,
|
|
534
|
+
subject: data.subject,
|
|
535
|
+
});
|
|
536
|
+
|
|
537
|
+
if (hold) {
|
|
538
|
+
return hold;
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
return null;
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
/*
|
|
546
|
+
* Whether one other run holds the cluster — see findRoundHoldingCluster.
|
|
547
|
+
* `hasChangedCluster`: the run already has a kubectl job on the cluster,
|
|
548
|
+
* so while it is still running it holds whatever its order or mode.
|
|
549
|
+
*/
|
|
550
|
+
private getHold(data: {
|
|
551
|
+
row: AutoRemediationSuggestion;
|
|
552
|
+
rowId: string;
|
|
553
|
+
hasChangedCluster: boolean;
|
|
554
|
+
anyOrder: boolean;
|
|
555
|
+
forRound?: ClusterRoundReference | undefined;
|
|
556
|
+
subject?: SubjectLinkage | undefined;
|
|
557
|
+
}): ClusterRoundHold | null {
|
|
558
|
+
const { row, rowId } = data;
|
|
559
|
+
const now: number = OneUptimeDate.getCurrentDate().getTime();
|
|
560
|
+
const inFlightSince: number = OneUptimeDate.getSomeHoursAgo(
|
|
561
|
+
IN_FLIGHT_ROUND_WINDOW_HOURS,
|
|
562
|
+
).getTime();
|
|
563
|
+
|
|
564
|
+
const sameSubject: boolean = data.subject
|
|
565
|
+
? isSameSubject(row, data.subject)
|
|
566
|
+
: false;
|
|
567
|
+
|
|
568
|
+
if (
|
|
569
|
+
(row.status === AutoRemediationSuggestionStatus.AutoExecuted ||
|
|
570
|
+
row.status === AutoRemediationSuggestionStatus.Approved) &&
|
|
571
|
+
row.verificationStatus === AutoRemediationVerificationStatus.Pending
|
|
572
|
+
) {
|
|
573
|
+
const deadline: number | null = row.verificationDeadlineAt
|
|
574
|
+
? new Date(row.verificationDeadlineAt).getTime()
|
|
575
|
+
: null;
|
|
576
|
+
|
|
577
|
+
if (
|
|
578
|
+
deadline === null ||
|
|
579
|
+
deadline > now - PENDING_VERIFICATION_HOLD_GRACE_MINUTES * 60 * 1000
|
|
580
|
+
) {
|
|
581
|
+
return {
|
|
582
|
+
suggestionId: rowId,
|
|
583
|
+
ruleNameSnapshot: row.ruleNameSnapshot,
|
|
584
|
+
description: "applied a fix that is still being verified",
|
|
585
|
+
isSameSubject: sameSubject,
|
|
586
|
+
};
|
|
587
|
+
}
|
|
588
|
+
return null;
|
|
589
|
+
}
|
|
590
|
+
|
|
591
|
+
if (row.status !== AutoRemediationSuggestionStatus.Planning) {
|
|
592
|
+
return null;
|
|
593
|
+
}
|
|
594
|
+
|
|
595
|
+
const isRecent: boolean = row.createdAt
|
|
596
|
+
? new Date(row.createdAt).getTime() > inFlightSince
|
|
597
|
+
: true;
|
|
598
|
+
|
|
599
|
+
if (!isRecent) {
|
|
600
|
+
return null;
|
|
601
|
+
}
|
|
602
|
+
|
|
603
|
+
if (data.hasChangedCluster) {
|
|
604
|
+
return {
|
|
605
|
+
suggestionId: rowId,
|
|
606
|
+
ruleNameSnapshot: row.ruleNameSnapshot,
|
|
607
|
+
description: "is still changing it",
|
|
608
|
+
isSameSubject: sameSubject,
|
|
609
|
+
};
|
|
610
|
+
}
|
|
611
|
+
|
|
612
|
+
if (
|
|
613
|
+
row.executionMode === AutoRemediationExecutionMode.FullAuto &&
|
|
614
|
+
(data.anyOrder || isRoundOrderedBefore(row, data.forRound))
|
|
615
|
+
) {
|
|
616
|
+
return {
|
|
617
|
+
suggestionId: rowId,
|
|
618
|
+
ruleNameSnapshot: row.ruleNameSnapshot,
|
|
619
|
+
description: "is still running unattended",
|
|
620
|
+
isSameSubject: sameSubject,
|
|
621
|
+
};
|
|
622
|
+
}
|
|
623
|
+
|
|
624
|
+
if (sameSubject) {
|
|
625
|
+
return {
|
|
626
|
+
suggestionId: rowId,
|
|
627
|
+
ruleNameSnapshot: row.ruleNameSnapshot,
|
|
628
|
+
description: "is still working on this same signal",
|
|
629
|
+
isSameSubject: true,
|
|
630
|
+
};
|
|
631
|
+
}
|
|
632
|
+
|
|
633
|
+
return null;
|
|
634
|
+
}
|
|
635
|
+
|
|
71
636
|
/*
|
|
72
637
|
* Reload an incident and run the rules against it. Used by the
|
|
73
638
|
* post-investigation remediation hand-off (RemediationHandoff), which
|
|
@@ -194,6 +759,62 @@ class AutoRemediationRuleEngineServiceClass {
|
|
|
194
759
|
return;
|
|
195
760
|
}
|
|
196
761
|
|
|
762
|
+
const linkage: SubjectLinkage = {
|
|
763
|
+
incidentId: data.incident?.id || undefined,
|
|
764
|
+
alertId: data.alert?.id || undefined,
|
|
765
|
+
};
|
|
766
|
+
|
|
767
|
+
/*
|
|
768
|
+
* Per-subject cap + per-rule dedupe. A rule that already produced a
|
|
769
|
+
* suggestion on this subject never produces another (a dismissal is a
|
|
770
|
+
* human "no" — do not re-ask).
|
|
771
|
+
*/
|
|
772
|
+
const existingSuggestions: Array<AutoRemediationSuggestion> =
|
|
773
|
+
await AutoRemediationSuggestionService.findBy({
|
|
774
|
+
query: linkage.incidentId
|
|
775
|
+
? { incidentId: linkage.incidentId }
|
|
776
|
+
: { alertId: linkage.alertId! },
|
|
777
|
+
props: { isRoot: true },
|
|
778
|
+
select: {
|
|
779
|
+
_id: true,
|
|
780
|
+
autoRemediationRuleId: true,
|
|
781
|
+
kubernetesClusterId: true,
|
|
782
|
+
},
|
|
783
|
+
limit: MAX_SUGGESTIONS_PER_SUBJECT * 10,
|
|
784
|
+
skip: 0,
|
|
785
|
+
});
|
|
786
|
+
|
|
787
|
+
let remainingBudget: number =
|
|
788
|
+
MAX_SUGGESTIONS_PER_SUBJECT - existingSuggestions.length;
|
|
789
|
+
|
|
790
|
+
if (remainingBudget <= 0) {
|
|
791
|
+
logger.debug(
|
|
792
|
+
`AutoRemediationRuleEngine: suggestion cap reached for subject; skipping.`,
|
|
793
|
+
{
|
|
794
|
+
projectId: data.projectId.toString(),
|
|
795
|
+
incidentId: linkage.incidentId?.toString(),
|
|
796
|
+
alertId: linkage.alertId?.toString(),
|
|
797
|
+
} as LogAttributes,
|
|
798
|
+
);
|
|
799
|
+
return;
|
|
800
|
+
}
|
|
801
|
+
|
|
802
|
+
/*
|
|
803
|
+
* Cluster-level remediation first: an operator who set a mode on the
|
|
804
|
+
* cluster's AI page expressed a more specific intent than any project
|
|
805
|
+
* rule, and it needs no rule to fire.
|
|
806
|
+
*/
|
|
807
|
+
remainingBudget -= await this.applyClusterLevelRemediation({
|
|
808
|
+
projectId: data.projectId,
|
|
809
|
+
linkage,
|
|
810
|
+
existingSuggestions,
|
|
811
|
+
budget: remainingBudget,
|
|
812
|
+
});
|
|
813
|
+
|
|
814
|
+
if (remainingBudget <= 0) {
|
|
815
|
+
return;
|
|
816
|
+
}
|
|
817
|
+
|
|
197
818
|
const rules: Array<AutoRemediationRule> =
|
|
198
819
|
await AutoRemediationRuleService.findBy({
|
|
199
820
|
query: {
|
|
@@ -252,45 +873,6 @@ class AutoRemediationRuleEngineServiceClass {
|
|
|
252
873
|
return;
|
|
253
874
|
}
|
|
254
875
|
|
|
255
|
-
const linkage: SubjectLinkage = {
|
|
256
|
-
incidentId: data.incident?.id || undefined,
|
|
257
|
-
alertId: data.alert?.id || undefined,
|
|
258
|
-
};
|
|
259
|
-
|
|
260
|
-
/*
|
|
261
|
-
* Per-subject cap + per-rule dedupe. A rule that already produced a
|
|
262
|
-
* suggestion on this subject never produces another (a dismissal is a
|
|
263
|
-
* human "no" — do not re-ask).
|
|
264
|
-
*/
|
|
265
|
-
const existingSuggestions: Array<AutoRemediationSuggestion> =
|
|
266
|
-
await AutoRemediationSuggestionService.findBy({
|
|
267
|
-
query: linkage.incidentId
|
|
268
|
-
? { incidentId: linkage.incidentId }
|
|
269
|
-
: { alertId: linkage.alertId! },
|
|
270
|
-
props: { isRoot: true },
|
|
271
|
-
select: {
|
|
272
|
-
_id: true,
|
|
273
|
-
autoRemediationRuleId: true,
|
|
274
|
-
},
|
|
275
|
-
limit: MAX_SUGGESTIONS_PER_SUBJECT * 10,
|
|
276
|
-
skip: 0,
|
|
277
|
-
});
|
|
278
|
-
|
|
279
|
-
let remainingBudget: number =
|
|
280
|
-
MAX_SUGGESTIONS_PER_SUBJECT - existingSuggestions.length;
|
|
281
|
-
|
|
282
|
-
if (remainingBudget <= 0) {
|
|
283
|
-
logger.debug(
|
|
284
|
-
`AutoRemediationRuleEngine: suggestion cap reached for subject; skipping ${matchedRules.length} matched rule(s).`,
|
|
285
|
-
{
|
|
286
|
-
projectId: data.projectId.toString(),
|
|
287
|
-
incidentId: linkage.incidentId?.toString(),
|
|
288
|
-
alertId: linkage.alertId?.toString(),
|
|
289
|
-
} as LogAttributes,
|
|
290
|
-
);
|
|
291
|
-
return;
|
|
292
|
-
}
|
|
293
|
-
|
|
294
876
|
const ruleIdsWithExistingSuggestion: Set<string> = new Set<string>(
|
|
295
877
|
existingSuggestions
|
|
296
878
|
.map((s: AutoRemediationSuggestion) => {
|
|
@@ -532,6 +1114,353 @@ class AutoRemediationRuleEngineServiceClass {
|
|
|
532
1114
|
return consumed;
|
|
533
1115
|
}
|
|
534
1116
|
|
|
1117
|
+
/*
|
|
1118
|
+
* Cluster-level remediation: for every cluster this signal is about whose
|
|
1119
|
+
* AI page enables remediation (and whose access is ready), start one AI
|
|
1120
|
+
* command run with the cluster as its only target. Automatic clusters run
|
|
1121
|
+
* FullAuto (safe kubectl without a human; a riskier change never runs on
|
|
1122
|
+
* its own — a round that could only find riskier fixes ends by proposing
|
|
1123
|
+
* exactly those for one-click approval, and after safe fixes a riskier
|
|
1124
|
+
* one is proposed only if verification shows they did not recover the
|
|
1125
|
+
* signal, by the follow-up round, which asks);
|
|
1126
|
+
* BypassApproval clusters run FullAuto for every change the policy
|
|
1127
|
+
* allows (a protected-namespace write, a node drain, a node taint or a
|
|
1128
|
+
* patch of a Node still asks); clusters on "ask for approval" run
|
|
1129
|
+
* Suggest. One
|
|
1130
|
+
* suggestion per cluster per subject from this hook; and at most one
|
|
1131
|
+
* UNATTENDED AI run per cluster at a time, whatever the subject — a round
|
|
1132
|
+
* that finds another round, or a rule-driven run, still changing the
|
|
1133
|
+
* cluster or being verified on it asks instead (see
|
|
1134
|
+
* startClusterCommandRun and findRoundHoldingCluster). Returns how much
|
|
1135
|
+
* of the per-subject budget it used.
|
|
1136
|
+
*/
|
|
1137
|
+
private async applyClusterLevelRemediation(data: {
|
|
1138
|
+
projectId: ObjectID;
|
|
1139
|
+
linkage: SubjectLinkage;
|
|
1140
|
+
existingSuggestions: Array<AutoRemediationSuggestion>;
|
|
1141
|
+
budget: number;
|
|
1142
|
+
}): Promise<number> {
|
|
1143
|
+
let consumed: number = 0;
|
|
1144
|
+
|
|
1145
|
+
let statuses: Array<KubernetesClusterAiAccessStatus> = [];
|
|
1146
|
+
|
|
1147
|
+
try {
|
|
1148
|
+
statuses = await KubernetesClusterAiAccessService.getStatusesForSubject({
|
|
1149
|
+
projectId: data.projectId,
|
|
1150
|
+
incidentId: data.linkage.incidentId,
|
|
1151
|
+
alertId: data.linkage.alertId,
|
|
1152
|
+
});
|
|
1153
|
+
} catch (error) {
|
|
1154
|
+
logger.error(
|
|
1155
|
+
`AutoRemediationRuleEngine: could not resolve cluster access for the subject; skipping cluster-level remediation: ${error}`,
|
|
1156
|
+
{ projectId: data.projectId.toString() } as LogAttributes,
|
|
1157
|
+
);
|
|
1158
|
+
return 0;
|
|
1159
|
+
}
|
|
1160
|
+
|
|
1161
|
+
for (const status of statuses) {
|
|
1162
|
+
if (consumed >= data.budget) {
|
|
1163
|
+
break;
|
|
1164
|
+
}
|
|
1165
|
+
|
|
1166
|
+
if (!status.isRemediationReady) {
|
|
1167
|
+
continue;
|
|
1168
|
+
}
|
|
1169
|
+
|
|
1170
|
+
// One round per cluster per subject from the create hook.
|
|
1171
|
+
const alreadyHasRound: boolean = data.existingSuggestions.some(
|
|
1172
|
+
(suggestion: AutoRemediationSuggestion) => {
|
|
1173
|
+
return (
|
|
1174
|
+
suggestion.kubernetesClusterId?.toString() === status.clusterId
|
|
1175
|
+
);
|
|
1176
|
+
},
|
|
1177
|
+
);
|
|
1178
|
+
|
|
1179
|
+
if (alreadyHasRound) {
|
|
1180
|
+
continue;
|
|
1181
|
+
}
|
|
1182
|
+
|
|
1183
|
+
const started: boolean = await this.startClusterCommandRun({
|
|
1184
|
+
projectId: data.projectId,
|
|
1185
|
+
cluster: status,
|
|
1186
|
+
linkage: data.linkage,
|
|
1187
|
+
round: 1,
|
|
1188
|
+
});
|
|
1189
|
+
|
|
1190
|
+
if (started) {
|
|
1191
|
+
consumed += 1;
|
|
1192
|
+
}
|
|
1193
|
+
}
|
|
1194
|
+
|
|
1195
|
+
return consumed;
|
|
1196
|
+
}
|
|
1197
|
+
|
|
1198
|
+
/*
|
|
1199
|
+
* A follow-up round after a cluster plan ran and verification failed: the
|
|
1200
|
+
* operator asked to be asked again for a NEW set of commands. Suggest for
|
|
1201
|
+
* RequireApproval and Automatic clusters (a human approves the second
|
|
1202
|
+
* attempt), unattended again for BypassApproval clusters, and capped by
|
|
1203
|
+
* MAX_CLUSTER_REMEDIATION_ROUNDS_PER_SUBJECT. `forceSuggest` makes even a
|
|
1204
|
+
* BypassApproval follow-up ask first — the verifier sets it when the
|
|
1205
|
+
* failed round's rollback did not complete, so round 1's change may still
|
|
1206
|
+
* be applied and a human was just told to undo it by hand; an unattended
|
|
1207
|
+
* round on top of that state is exactly what must not happen. Called by
|
|
1208
|
+
* the verifier; never throws.
|
|
1209
|
+
*/
|
|
1210
|
+
@CaptureSpan()
|
|
1211
|
+
public async startFollowUpClusterRemediation(data: {
|
|
1212
|
+
projectId: ObjectID;
|
|
1213
|
+
kubernetesClusterId: ObjectID;
|
|
1214
|
+
incidentId?: ObjectID | undefined;
|
|
1215
|
+
alertId?: ObjectID | undefined;
|
|
1216
|
+
forceSuggest?: boolean | undefined;
|
|
1217
|
+
// Completes "this round asks first because ..." on the feed.
|
|
1218
|
+
forceSuggestReason?: string | undefined;
|
|
1219
|
+
}): Promise<boolean> {
|
|
1220
|
+
try {
|
|
1221
|
+
const project: Project | null = await ProjectService.findOneById({
|
|
1222
|
+
id: data.projectId,
|
|
1223
|
+
select: { enableAutoRemediation: true },
|
|
1224
|
+
props: { isRoot: true },
|
|
1225
|
+
});
|
|
1226
|
+
|
|
1227
|
+
if (!project || project.enableAutoRemediation === false) {
|
|
1228
|
+
return false;
|
|
1229
|
+
}
|
|
1230
|
+
|
|
1231
|
+
const linkage: SubjectLinkage = {
|
|
1232
|
+
incidentId: data.incidentId,
|
|
1233
|
+
alertId: data.alertId,
|
|
1234
|
+
};
|
|
1235
|
+
|
|
1236
|
+
if (!linkage.incidentId && !linkage.alertId) {
|
|
1237
|
+
return false;
|
|
1238
|
+
}
|
|
1239
|
+
|
|
1240
|
+
const priorRounds: number = (
|
|
1241
|
+
await AutoRemediationSuggestionService.countBy({
|
|
1242
|
+
query: {
|
|
1243
|
+
...(linkage.incidentId
|
|
1244
|
+
? { incidentId: linkage.incidentId }
|
|
1245
|
+
: { alertId: linkage.alertId! }),
|
|
1246
|
+
kubernetesClusterId: data.kubernetesClusterId,
|
|
1247
|
+
},
|
|
1248
|
+
props: { isRoot: true },
|
|
1249
|
+
})
|
|
1250
|
+
).toNumber();
|
|
1251
|
+
|
|
1252
|
+
if (priorRounds >= MAX_CLUSTER_REMEDIATION_ROUNDS_PER_SUBJECT) {
|
|
1253
|
+
logger.debug(
|
|
1254
|
+
`AutoRemediationRuleEngine: cluster ${data.kubernetesClusterId.toString()} already used ${priorRounds} remediation round(s) on this subject; not asking again.`,
|
|
1255
|
+
{ projectId: data.projectId.toString() } as LogAttributes,
|
|
1256
|
+
);
|
|
1257
|
+
return false;
|
|
1258
|
+
}
|
|
1259
|
+
|
|
1260
|
+
const status: KubernetesClusterAiAccessStatus | null =
|
|
1261
|
+
await KubernetesClusterAiAccessService.getStatusForCluster({
|
|
1262
|
+
clusterId: data.kubernetesClusterId,
|
|
1263
|
+
projectId: data.projectId,
|
|
1264
|
+
});
|
|
1265
|
+
|
|
1266
|
+
if (!status || !status.isRemediationReady) {
|
|
1267
|
+
return false;
|
|
1268
|
+
}
|
|
1269
|
+
|
|
1270
|
+
return await this.startClusterCommandRun({
|
|
1271
|
+
projectId: data.projectId,
|
|
1272
|
+
cluster: status,
|
|
1273
|
+
linkage,
|
|
1274
|
+
round: priorRounds + 1,
|
|
1275
|
+
askFirstReason:
|
|
1276
|
+
data.forceSuggest === true
|
|
1277
|
+
? data.forceSuggestReason ||
|
|
1278
|
+
"the previous fix's rollback did not complete, so its change may still be applied"
|
|
1279
|
+
: undefined,
|
|
1280
|
+
});
|
|
1281
|
+
} catch (error) {
|
|
1282
|
+
logger.error(
|
|
1283
|
+
`AutoRemediationRuleEngine: follow-up cluster remediation failed: ${error}`,
|
|
1284
|
+
{ projectId: data.projectId.toString() } as LogAttributes,
|
|
1285
|
+
);
|
|
1286
|
+
return false;
|
|
1287
|
+
}
|
|
1288
|
+
}
|
|
1289
|
+
|
|
1290
|
+
private async startClusterCommandRun(data: {
|
|
1291
|
+
projectId: ObjectID;
|
|
1292
|
+
cluster: KubernetesClusterAiAccessStatus;
|
|
1293
|
+
linkage: SubjectLinkage;
|
|
1294
|
+
round: number;
|
|
1295
|
+
/*
|
|
1296
|
+
* Set when a round that would run unattended must ask first anyway;
|
|
1297
|
+
* completes "this round asks first because ...".
|
|
1298
|
+
*/
|
|
1299
|
+
askFirstReason?: string | undefined;
|
|
1300
|
+
}): Promise<boolean> {
|
|
1301
|
+
const { cluster } = data;
|
|
1302
|
+
|
|
1303
|
+
/*
|
|
1304
|
+
* Automatic clusters run their first round unattended and ask a human
|
|
1305
|
+
* for the follow-up; a BypassApproval cluster runs every round
|
|
1306
|
+
* unattended, follow-ups included — that is what its operator chose.
|
|
1307
|
+
* (What needs a human in every mode — a protected-namespace write, a
|
|
1308
|
+
* node drain, a node taint, a patch of a Node — is still proposed,
|
|
1309
|
+
* never run, inside the round.)
|
|
1310
|
+
*/
|
|
1311
|
+
const isBypass: boolean =
|
|
1312
|
+
cluster.remediationMode === KubernetesAiRemediationMode.BypassApproval;
|
|
1313
|
+
const wantsUnattended: boolean =
|
|
1314
|
+
isBypass ||
|
|
1315
|
+
(data.round === 1 &&
|
|
1316
|
+
cluster.remediationMode === KubernetesAiRemediationMode.Automatic);
|
|
1317
|
+
|
|
1318
|
+
let askFirstReason: string | null = data.askFirstReason || null;
|
|
1319
|
+
|
|
1320
|
+
/*
|
|
1321
|
+
* One unattended round per cluster at a time. An alert and an incident
|
|
1322
|
+
* of the same monitor each reach this point with their own subject, so
|
|
1323
|
+
* the per-subject dedupe above never sees the other one; two unattended
|
|
1324
|
+
* agents on one cluster would each verify and roll back on top of the
|
|
1325
|
+
* other's change. The execution runner re-checks this when the round
|
|
1326
|
+
* starts (rounds announced at the same moment cannot see each other
|
|
1327
|
+
* here); this check only keeps the announcement honest.
|
|
1328
|
+
*/
|
|
1329
|
+
if (wantsUnattended && !askFirstReason) {
|
|
1330
|
+
try {
|
|
1331
|
+
const hold: ClusterRoundHold | null =
|
|
1332
|
+
await this.findRoundHoldingCluster({
|
|
1333
|
+
projectId: data.projectId,
|
|
1334
|
+
clusterId: cluster.clusterId,
|
|
1335
|
+
anyOrder: true,
|
|
1336
|
+
});
|
|
1337
|
+
|
|
1338
|
+
if (hold) {
|
|
1339
|
+
askFirstReason = `another OneUptime AI round on this cluster ${hold.description}`;
|
|
1340
|
+
}
|
|
1341
|
+
} catch (error) {
|
|
1342
|
+
logger.error(
|
|
1343
|
+
`AutoRemediationRuleEngine: could not check cluster ${cluster.clusterId} for another AI round in flight; this round asks first: ${error}`,
|
|
1344
|
+
{ projectId: data.projectId.toString() } as LogAttributes,
|
|
1345
|
+
);
|
|
1346
|
+
askFirstReason =
|
|
1347
|
+
"OneUptime AI could not confirm that no other AI round is changing this cluster";
|
|
1348
|
+
}
|
|
1349
|
+
}
|
|
1350
|
+
|
|
1351
|
+
const isAutomatic: boolean = wantsUnattended && !askFirstReason;
|
|
1352
|
+
|
|
1353
|
+
const suggestion: AutoRemediationSuggestion =
|
|
1354
|
+
new AutoRemediationSuggestion();
|
|
1355
|
+
suggestion.projectId = data.projectId;
|
|
1356
|
+
suggestion.kubernetesClusterId = new ObjectID(cluster.clusterId);
|
|
1357
|
+
suggestion.ruleNameSnapshot = getClusterRoundNameSnapshot(
|
|
1358
|
+
cluster.clusterName,
|
|
1359
|
+
data.round,
|
|
1360
|
+
);
|
|
1361
|
+
suggestion.status = AutoRemediationSuggestionStatus.Planning;
|
|
1362
|
+
suggestion.suggestionType = AutoRemediationSuggestionType.CommandPlan;
|
|
1363
|
+
suggestion.executionMode = isAutomatic
|
|
1364
|
+
? AutoRemediationExecutionMode.FullAuto
|
|
1365
|
+
: AutoRemediationExecutionMode.Suggest;
|
|
1366
|
+
suggestion.verificationWindowMinutes = DEFAULT_VERIFICATION_WINDOW_MINUTES;
|
|
1367
|
+
/*
|
|
1368
|
+
* An Automatic cluster's operator asked for the loop to be closed:
|
|
1369
|
+
* once the monitors recover the signal resolves itself. With a human
|
|
1370
|
+
* approving, the human resolves.
|
|
1371
|
+
*/
|
|
1372
|
+
suggestion.autoResolveOnRecovery = isAutomatic;
|
|
1373
|
+
if (data.linkage.incidentId) {
|
|
1374
|
+
suggestion.incidentId = data.linkage.incidentId;
|
|
1375
|
+
}
|
|
1376
|
+
if (data.linkage.alertId) {
|
|
1377
|
+
suggestion.alertId = data.linkage.alertId;
|
|
1378
|
+
}
|
|
1379
|
+
|
|
1380
|
+
const created: AutoRemediationSuggestion =
|
|
1381
|
+
await AutoRemediationSuggestionService.create({
|
|
1382
|
+
data: suggestion,
|
|
1383
|
+
props: { isRoot: true },
|
|
1384
|
+
});
|
|
1385
|
+
|
|
1386
|
+
const aiRunId: ObjectID | null = await AIInvestigationQueue.enqueue({
|
|
1387
|
+
projectId: data.projectId,
|
|
1388
|
+
subjectIncidentId: data.linkage.incidentId,
|
|
1389
|
+
subjectAlertId: data.linkage.alertId,
|
|
1390
|
+
subjectAutoRemediationSuggestionId: created.id!,
|
|
1391
|
+
remediationRunType: AIRunType.RemediationExecution,
|
|
1392
|
+
});
|
|
1393
|
+
|
|
1394
|
+
if (!aiRunId) {
|
|
1395
|
+
await AutoRemediationSuggestionService.updateOneById({
|
|
1396
|
+
id: created.id!,
|
|
1397
|
+
data: {
|
|
1398
|
+
status: AutoRemediationSuggestionStatus.NoneApplicable,
|
|
1399
|
+
rationaleMarkdown:
|
|
1400
|
+
"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.",
|
|
1401
|
+
},
|
|
1402
|
+
props: { isRoot: true },
|
|
1403
|
+
});
|
|
1404
|
+
return false;
|
|
1405
|
+
}
|
|
1406
|
+
|
|
1407
|
+
await AutoRemediationSuggestionService.updateOneById({
|
|
1408
|
+
id: created.id!,
|
|
1409
|
+
data: { aiRunId },
|
|
1410
|
+
props: { isRoot: true },
|
|
1411
|
+
});
|
|
1412
|
+
|
|
1413
|
+
/*
|
|
1414
|
+
* The feed states exactly what this round does, in the terms of the
|
|
1415
|
+
* canonical KubernetesAiRemediationMode comment. An Automatic round
|
|
1416
|
+
* runs safe (and allowlisted) changes on its own; a riskier change
|
|
1417
|
+
* never runs without a human — when the round finds only riskier
|
|
1418
|
+
* fixes it ends by proposing exactly those as a one-click approval
|
|
1419
|
+
* card, and when it also ran safe fixes a riskier one is proposed only
|
|
1420
|
+
* if verification shows they did not recover the service (the
|
|
1421
|
+
* follow-up round, which asks). A Bypass-approval round asks for
|
|
1422
|
+
* nothing but what always needs a human. In both, a protected-
|
|
1423
|
+
* namespace write, a node drain and a node taint always need a human,
|
|
1424
|
+
* and the round becomes a proposal if the hourly circuit breaker trips
|
|
1425
|
+
* or another unattended round holds the cluster — said here up front;
|
|
1426
|
+
* the execution runner posts its own explanation when that happens.
|
|
1427
|
+
*/
|
|
1428
|
+
let markdown: string;
|
|
1429
|
+
|
|
1430
|
+
if (wantsUnattended && askFirstReason) {
|
|
1431
|
+
markdown = `⚡ **OneUptime AI is composing ${
|
|
1432
|
+
data.round > 1 ? "another" : "a"
|
|
1433
|
+
} kubectl fix for cluster "${cluster.clusterName}"**${
|
|
1434
|
+
data.round > 1
|
|
1435
|
+
? ` (round ${data.round}) — the previous fix did not recover the service`
|
|
1436
|
+
: ""
|
|
1437
|
+
}. This round asks first because ${askFirstReason}: nothing runs until you approve the plan, which will appear here shortly.`;
|
|
1438
|
+
} else if (isBypass) {
|
|
1439
|
+
markdown =
|
|
1440
|
+
data.round > 1
|
|
1441
|
+
? `⚡ **OneUptime AI is applying another kubectl fix on cluster "${cluster.clusterName}"** (round ${data.round}) — the previous fix did not recover the service. Approvals are bypassed for this cluster, so the new fix runs on its own: every kubectl change the policy allows, safe or riskier — except that ${KUBECTL_ALWAYS_ASKS_SUMMARY}, so AI proposes such a change for your approval; destructive commands never run. ${UNATTENDED_ROUND_PROPOSAL_FEED_SENTENCE} Progress appears here.`
|
|
1442
|
+
: `⚡ **OneUptime AI is fixing cluster "${cluster.clusterName}".** Approvals are bypassed for this cluster: AI is diagnosing with kubectl and will apply whatever fix the policy allows — safe or riskier — on its own, without asking, except that ${KUBECTL_ALWAYS_ASKS_SUMMARY}, so AI proposes such a change for your approval; destructive commands never run. ${UNATTENDED_ROUND_PROPOSAL_FEED_SENTENCE} Progress appears here.`;
|
|
1443
|
+
} else if (isAutomatic) {
|
|
1444
|
+
markdown = `⚡ **OneUptime AI is fixing cluster "${cluster.clusterName}".** Automatic remediation is on for this cluster: AI is diagnosing with kubectl and will apply safe changes (${KUBECTL_SAFE_CHANGES_SUMMARY}), plus riskier changes whose shape the cluster's kubectl 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(
|
|
1445
|
+
KUBECTL_ALWAYS_ASKS_SUMMARY,
|
|
1446
|
+
)}, and destructive commands never run. ${UNATTENDED_ROUND_PROPOSAL_FEED_SENTENCE} Progress appears here.`;
|
|
1447
|
+
} else {
|
|
1448
|
+
markdown =
|
|
1449
|
+
data.round > 1
|
|
1450
|
+
? `⚡ **OneUptime AI is composing another kubectl fix for cluster "${cluster.clusterName}"** (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.`
|
|
1451
|
+
: `⚡ **OneUptime AI is composing a kubectl fix for cluster "${cluster.clusterName}".** Nothing runs until you approve the plan — it will appear here shortly.`;
|
|
1452
|
+
}
|
|
1453
|
+
|
|
1454
|
+
await this.postFeedItem({
|
|
1455
|
+
projectId: data.projectId,
|
|
1456
|
+
linkage: data.linkage,
|
|
1457
|
+
markdown,
|
|
1458
|
+
pingWorkspace: false,
|
|
1459
|
+
});
|
|
1460
|
+
|
|
1461
|
+
return true;
|
|
1462
|
+
}
|
|
1463
|
+
|
|
535
1464
|
/*
|
|
536
1465
|
* AI path: create a Planning suggestion and enqueue a RemediationPlan run
|
|
537
1466
|
* on the durable AI queue. The planning runner fills in the picked runbook
|