@oneuptime/common 14.0.0 → 14.0.2
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/AutoRemediationSuggestion.ts +63 -0
- package/Models/DatabaseModels/IncidentEpisodeMember.ts +8 -1
- package/Models/DatabaseModels/IncidentEpisodePublicNote.ts +9 -2
- package/Models/DatabaseModels/IncidentPublicNote.ts +9 -2
- package/Models/DatabaseModels/Index.ts +4 -0
- package/Models/DatabaseModels/KubernetesCluster.ts +429 -0
- package/Models/DatabaseModels/Monitor.ts +48 -0
- package/Models/DatabaseModels/Runner.ts +5 -4
- package/Models/DatabaseModels/RunnerJob.ts +66 -0
- package/Models/DatabaseModels/ScheduledMaintenancePublicNote.ts +10 -2
- package/Models/DatabaseModels/ServiceLevelObjectiveFeed.ts +2 -0
- package/Models/DatabaseModels/ServiceLevelObjectiveLabelRule.ts +522 -0
- package/Models/DatabaseModels/ServiceLevelObjectiveMonitorRule.ts +38 -4
- package/Models/DatabaseModels/ServiceLevelObjectiveOwnerRule.ts +603 -0
- 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/1794100000000-AddSloLabelAndOwnerRules.ts +248 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1794200000000-AddSloMonitorRuleMonitorType.ts +19 -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/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/DatabaseService.ts +10 -0
- package/Server/Services/InboundEmail/Providers/SendGridInboundProvider.ts +16 -22
- 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 +120 -20
- package/Server/Services/IncidentStateTimelineService.ts +15 -0
- package/Server/Services/IncidentTemplateService.ts +83 -3
- package/Server/Services/Index.ts +4 -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 +654 -54
- 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/ServiceLevelObjectiveLabelRuleEngineService.ts +385 -0
- package/Server/Services/ServiceLevelObjectiveLabelRuleService.ts +51 -0
- package/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.ts +92 -16
- package/Server/Services/ServiceLevelObjectiveMonitorRuleService.ts +36 -1
- package/Server/Services/ServiceLevelObjectiveOwnerRuleEngineService.ts +521 -0
- package/Server/Services/ServiceLevelObjectiveOwnerRuleService.ts +51 -0
- package/Server/Services/ServiceLevelObjectiveService.ts +42 -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/Types/Workflow/Components/Telegram/SendMessageToChat.ts +27 -1
- 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/AI/Toolbox/SloTools.ts +1 -0
- 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/AffectedResourceList.ts +31 -73
- package/Server/Utils/Monitor/Criteria/CompareCriteria.ts +1 -1
- package/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.ts +1 -1
- package/Server/Utils/Monitor/MonitorAlert.ts +83 -9
- package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +181 -136
- 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/Monitor/RootCauseList.ts +139 -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/Rules/RuleRun/RuleRunRegistry.ts +28 -0
- package/Server/Utils/Runbook/RunbookExecutePermission.ts +56 -6
- package/Server/Utils/SessionReplay/SessionReplayReadService.ts +223 -33
- package/Server/Utils/SessionReplay/SessionReplayUserFlowReadService.ts +559 -0
- package/Server/Utils/Slo/SloRulePatternValidator.ts +42 -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/ClusterAccessNotice.test.tsx +794 -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/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 +218 -0
- package/Tests/App/Dashboard/FeedFilterSortIntegration.test.tsx +1632 -0
- package/Tests/App/Dashboard/FeedOptionsLocales.test.ts +250 -0
- package/Tests/App/Dashboard/FeedOrdering.test.ts +279 -9
- package/Tests/App/Dashboard/IncidentChangeStateNotifyDefault.test.tsx +665 -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/InvestigationFeedRefresh.test.tsx +60 -1
- package/Tests/App/Dashboard/InvestigationPanel.test.tsx +606 -3
- package/Tests/App/Dashboard/InvestigationPanelClusterAccess.test.tsx +476 -0
- package/Tests/App/Dashboard/InvestigationRunDetailsKubectl.test.tsx +383 -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/LayerDateTimeFieldTimezoneName.test.tsx +66 -0
- package/Tests/App/Dashboard/LogMonitorPreview.test.tsx +174 -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/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/ProductOrientation.test.tsx +646 -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/ResourceFeed.test.tsx +612 -2
- package/Tests/App/Dashboard/ResourceFeedPageWiring.test.ts +30 -0
- package/Tests/App/Dashboard/ResourceFeedPagesFilterSort.test.tsx +1202 -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/ScheduledMaintenanceFeedRefresh.test.tsx +52 -1
- 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/SloFeed.test.tsx +106 -1
- package/Tests/App/Dashboard/SloMonitorRuleCriteria.test.tsx +566 -0
- package/Tests/App/Dashboard/SloNavigationWiring.test.tsx +6 -4
- package/Tests/App/Dashboard/SloNoticeBanner.test.tsx +186 -0
- package/Tests/App/Dashboard/SloOverviewKpiStrip.test.tsx +388 -44
- package/Tests/App/Dashboard/SloOverviewLayout.test.tsx +613 -0
- package/Tests/App/Dashboard/TeamMembershipRemoval.test.ts +900 -0
- package/Tests/App/Dashboard/TeamMembershipRemovalPages.test.tsx +460 -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/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/KubernetesClusterAiAccessColumns.test.ts +520 -0
- package/Tests/Models/DatabaseModels/MonitorSecretKeyColumnAccessControl.test.ts +66 -2
- package/Tests/Models/DatabaseModels/ResourceFeedModels.test.ts +0 -8
- package/Tests/Models/DatabaseModels/SloLabelAndOwnerRuleModels.test.ts +404 -0
- package/Tests/Models/DatabaseModels/SloOverhaulModels.test.ts +17 -1
- package/Tests/Models/DatabaseModels/StaticRuleCriteriaInheritance.test.ts +4 -2
- 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/AddConfigurableRuleCriteriaMigration.test.ts +3 -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/AddSloLabelAndOwnerRulesMigration.test.ts +407 -0
- package/Tests/Server/Infrastructure/Postgres/AddSloMonitorRuleMonitorTypeMigration.test.ts +171 -0
- package/Tests/Server/Infrastructure/Postgres/SloProductOverhaulMigration.test.ts +88 -4
- 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/DatabaseServiceRuleCriteriaValidation.test.ts +104 -0
- package/Tests/Server/Services/FindOwnersProjectMembership.test.ts +267 -0
- package/Tests/Server/Services/InboundEmail/SendGridInboundProviderAddress.test.ts +90 -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/LabelRuleEnginesGroupBRun.test.ts +48 -1
- package/Tests/Server/Services/RuleRun/OwnerRuleEnginesGroupARun.test.ts +28 -0
- package/Tests/Server/Services/RuleRun/OwnerRuleEnginesGroupBRun.test.ts +39 -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 +1175 -0
- package/Tests/Server/Services/ServiceLevelObjectiveLabelAndOwnerRuleServices.test.ts +172 -0
- package/Tests/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.test.ts +323 -0
- package/Tests/Server/Services/ServiceLevelObjectiveMonitorRuleService.test.ts +115 -0
- package/Tests/Server/Services/ServiceLevelObjectiveMonitorRuleTriggers.test.ts +21 -2
- package/Tests/Server/Services/ServiceLevelObjectiveMonitorTypePostgres.test.ts +480 -0
- package/Tests/Server/Services/ServiceLevelObjectiveService.test.ts +174 -0
- package/Tests/Server/Services/StaticRuleCriteriaRuntimeCoverage.test.ts +45 -6
- 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/FeedEventTypeFilterQuery.test.ts +745 -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 +1035 -1
- package/Tests/Server/Types/Workflow/Components/ApiComponentSsrf.test.ts +49 -0
- package/Tests/Server/Types/Workflow/Components/TelegramSendMessageToChat.test.ts +331 -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/AI/SloTools.test.ts +10 -0
- 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/Criteria/MetricMonitorCriteriaAnomalyUnits.test.ts +1 -1
- 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/MonitorCriteriaEvaluator.test.ts +405 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorBreachingSamples.test.ts +1156 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorMetricUnits.test.ts +106 -80
- 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/Monitor/RootCauseList.test.ts +252 -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/Rules/RuleRun/RuleRunPermission.test.ts +154 -0
- package/Tests/Server/Utils/SSRFProtection.test.ts +111 -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/Slo/SloRulePatternValidator.test.ts +67 -0
- package/Tests/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.test.ts +40 -3
- package/Tests/Server/Utils/VM/VMRunnerSsrf.test.ts +213 -0
- 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/API/Route.test.ts +56 -0
- package/Tests/Types/API/URLSchemeLikePath.test.ts +304 -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/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/FeedOptions.test.ts +1404 -0
- package/Tests/UI/Components/FeedOptionsButton.test.tsx +2603 -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/Icon.test.tsx +26 -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/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/RuleCriteria/RuleCriteriaModelTable.test.tsx +3 -3
- 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/Components/useFeedItemsViewKey.test.tsx +1017 -0
- package/Tests/UI/Components/useFeedOptions.test.tsx +1107 -0
- package/Tests/UI/Monitor/MonitorSummarySnapshotRender.test.tsx +5 -5
- package/Tests/UI/Telemetry/TelemetryDetailPanel.test.tsx +28 -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/LabelRuleImportExport.test.ts +102 -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/UserFlow.test.ts +1010 -0
- package/Tests/Utils/Slo/SloDuration.test.ts +115 -24
- package/Tests/Utils/Slo/SloHealth.test.ts +93 -10
- package/Tests/Utils/Slo/SloMonitorRuleCriteria.test.ts +109 -0
- package/Tests/Utils/Slo/SloOverviewText.test.ts +64 -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/API/Route.ts +19 -2
- package/Types/API/URL.ts +26 -2
- 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/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/MetricMonitor/MetricCriteriaContext.ts +6 -5
- package/Types/Monitor/MetricMonitor/MetricMonitorResponse.ts +9 -0
- 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 +90 -0
- package/Types/Rules/RuleCriteriaFieldRegistry.ts +11 -0
- package/Types/Rules/RuleRun.ts +4 -0
- package/Types/Rum/SessionReplay.ts +55 -2
- package/Types/Rum/SessionReplayApi.ts +44 -1
- package/Types/Rum/UserFlow.ts +187 -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/Dropdown/Dropdown.tsx +58 -9
- package/UI/Components/Feed/FeedOptions.ts +427 -0
- package/UI/Components/Feed/FeedOptionsButton.tsx +692 -0
- package/UI/Components/Feed/useFeedItems.ts +28 -9
- package/UI/Components/Feed/useFeedOptions.ts +225 -0
- 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/Icon/Icon.tsx +1 -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 +66 -14
- 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/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/Utils/ModelAPI/ProjectUsersModelAPI.ts +19 -1
- 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/LabelRuleImportExport.ts +27 -9
- package/Utils/Monitor/IncomingEmailMonitorAddress.ts +292 -0
- package/Utils/Monitor/MetricValueFormatter.ts +2 -2
- 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/Rules/MonitorTypeRuleCriteria.ts +31 -0
- package/Utils/Rum/SessionIdentity.ts +44 -0
- package/Utils/Rum/SessionReplayWireEncoding.ts +137 -0
- package/Utils/Rum/UserFlow.ts +1527 -0
- package/Utils/Slo/SloDuration.ts +22 -6
- package/Utils/Slo/SloHealth.ts +8 -7
- package/Utils/Slo/SloMonitorRuleCriteria.ts +33 -1
- package/Utils/Slo/SloOverviewText.ts +33 -0
- package/Utils/Slo/SloProjection.ts +4 -3
- 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/AutoRemediationSuggestion.js +62 -0
- package/build/dist/Models/DatabaseModels/AutoRemediationSuggestion.js.map +1 -1
- 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/IncidentPublicNote.js +10 -3
- package/build/dist/Models/DatabaseModels/IncidentPublicNote.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +4 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/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/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/ServiceLevelObjectiveFeed.js +2 -0
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveFeed.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveLabelRule.js +530 -0
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveLabelRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveMonitorRule.js +39 -4
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveMonitorRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerRule.js +612 -0
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerRule.js.map +1 -0
- 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/1794100000000-AddSloLabelAndOwnerRules.js +93 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794100000000-AddSloLabelAndOwnerRules.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794200000000-AddSloMonitorRuleMonitorType.js +12 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794200000000-AddSloMonitorRuleMonitorType.js.map +1 -0
- 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/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/DatabaseService.js +7 -0
- package/build/dist/Server/Services/DatabaseService.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/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 +99 -21
- package/build/dist/Server/Services/IncidentService.js.map +1 -1
- package/build/dist/Server/Services/IncidentStateTimelineService.js +12 -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 +4 -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 +490 -50
- 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/ServiceLevelObjectiveLabelRuleEngineService.js +295 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveLabelRuleEngineService.js.map +1 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveLabelRuleService.js +56 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveLabelRuleService.js.map +1 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.js +59 -14
- package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleService.js +22 -1
- package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleService.js.map +1 -1
- package/build/dist/Server/Services/ServiceLevelObjectiveOwnerRuleEngineService.js +400 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveOwnerRuleEngineService.js.map +1 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveOwnerRuleService.js +56 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveOwnerRuleService.js.map +1 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveService.js +33 -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/Types/Workflow/Components/Telegram/SendMessageToChat.js +20 -1
- package/build/dist/Server/Types/Workflow/Components/Telegram/SendMessageToChat.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/AI/Toolbox/SloTools.js +1 -0
- package/build/dist/Server/Utils/AI/Toolbox/SloTools.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/AffectedResourceList.js +22 -51
- package/build/dist/Server/Utils/Monitor/AffectedResourceList.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js +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/MonitorCriteriaEvaluator.js +139 -109
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.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/Monitor/RootCauseList.js +101 -0
- package/build/dist/Server/Utils/Monitor/RootCauseList.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/Rules/RuleRun/RuleRunRegistry.js +28 -0
- package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.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/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/Slo/SloRulePatternValidator.js +28 -0
- package/build/dist/Server/Utils/Slo/SloRulePatternValidator.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/API/Route.js +18 -2
- package/build/dist/Types/API/Route.js.map +1 -1
- package/build/dist/Types/API/URL.js +23 -2
- package/build/dist/Types/API/URL.js.map +1 -1
- 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/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 +84 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js +11 -0
- package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js.map +1 -1
- package/build/dist/Types/Rules/RuleRun.js +4 -0
- package/build/dist/Types/Rules/RuleRun.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/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/Dropdown/Dropdown.js +33 -9
- package/build/dist/UI/Components/Dropdown/Dropdown.js.map +1 -1
- package/build/dist/UI/Components/Feed/FeedOptions.js +235 -0
- package/build/dist/UI/Components/Feed/FeedOptions.js.map +1 -0
- package/build/dist/UI/Components/Feed/FeedOptionsButton.js +346 -0
- package/build/dist/UI/Components/Feed/FeedOptionsButton.js.map +1 -0
- package/build/dist/UI/Components/Feed/useFeedItems.js +17 -7
- package/build/dist/UI/Components/Feed/useFeedItems.js.map +1 -1
- package/build/dist/UI/Components/Feed/useFeedOptions.js +130 -0
- package/build/dist/UI/Components/Feed/useFeedOptions.js.map +1 -0
- 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/Icon/Icon.js +1 -1
- package/build/dist/UI/Components/Icon/Icon.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 +23 -8
- 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/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/Utils/ModelAPI/ProjectUsersModelAPI.js +15 -1
- package/build/dist/UI/Utils/ModelAPI/ProjectUsersModelAPI.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/LabelRuleImportExport.js +22 -6
- package/build/dist/Utils/LabelRuleImportExport.js.map +1 -1
- package/build/dist/Utils/Monitor/IncomingEmailMonitorAddress.js +214 -0
- package/build/dist/Utils/Monitor/IncomingEmailMonitorAddress.js.map +1 -0
- package/build/dist/Utils/Monitor/MetricValueFormatter.js +2 -2
- 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/Rules/MonitorTypeRuleCriteria.js +18 -0
- package/build/dist/Utils/Rules/MonitorTypeRuleCriteria.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/UserFlow.js +941 -0
- package/build/dist/Utils/Rum/UserFlow.js.map +1 -0
- package/build/dist/Utils/Slo/SloDuration.js +13 -5
- package/build/dist/Utils/Slo/SloDuration.js.map +1 -1
- package/build/dist/Utils/Slo/SloHealth.js +8 -7
- package/build/dist/Utils/Slo/SloHealth.js.map +1 -1
- package/build/dist/Utils/Slo/SloMonitorRuleCriteria.js +16 -1
- package/build/dist/Utils/Slo/SloMonitorRuleCriteria.js.map +1 -1
- package/build/dist/Utils/Slo/SloOverviewText.js +16 -0
- package/build/dist/Utils/Slo/SloOverviewText.js.map +1 -1
- package/build/dist/Utils/Slo/SloProjection.js.map +1 -1
- 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
|
@@ -3,21 +3,76 @@ import ObjectID from "../../Types/ObjectID";
|
|
|
3
3
|
import BadDataException from "../../Types/Exception/BadDataException";
|
|
4
4
|
import Model from "../../Models/DatabaseModels/RunnerJob";
|
|
5
5
|
import RunnerJobStatus from "../../Types/Runbook/RunnerJobStatus";
|
|
6
|
-
import RunnerJobOrigin
|
|
6
|
+
import RunnerJobOrigin, {
|
|
7
|
+
AI_COMMAND_JOB_ORIGINS,
|
|
8
|
+
} from "../../Types/Runbook/RunnerJobOrigin";
|
|
7
9
|
import RunbookStepType, {
|
|
8
10
|
isPayloadCarryingStepType,
|
|
9
11
|
isRunnerExecutedStepType,
|
|
10
12
|
} from "../../Types/Runbook/RunbookStepType";
|
|
11
13
|
import { AI_COMMAND_STEP_TYPES } from "../../Types/AutoRemediation/AiRemediationCommandPlan";
|
|
12
14
|
import CommandPolicy from "../../Utils/AiRemediation/CommandPolicy";
|
|
15
|
+
import KubectlPolicy, {
|
|
16
|
+
KubectlPolicyResult,
|
|
17
|
+
} from "../../Utils/AiRemediation/KubectlPolicy";
|
|
18
|
+
import KubectlOutputRedactor from "../../Utils/AiRemediation/KubectlOutputRedactor";
|
|
19
|
+
import KubectlWriteScope, {
|
|
20
|
+
KubectlWriteScopeRefusal,
|
|
21
|
+
} from "../../Utils/AiRemediation/KubectlWriteScope";
|
|
22
|
+
import ToolResultSerializer from "../Utils/AI/Toolbox/Serializer";
|
|
23
|
+
import {
|
|
24
|
+
KUBECTL_ALLOW_NODE_OPERATIONS_ENV,
|
|
25
|
+
KUBECTL_ALLOW_WRITES_ENV,
|
|
26
|
+
KUBECTL_WRITE_NAMESPACES_ENV,
|
|
27
|
+
KubectlCommandTier,
|
|
28
|
+
KubernetesAiRemediationMode,
|
|
29
|
+
KubernetesRunnerPosture,
|
|
30
|
+
isInClusterPostureForCluster,
|
|
31
|
+
parseKubernetesRunnerPosture,
|
|
32
|
+
} from "../../Types/Kubernetes/KubernetesClusterAiAccess";
|
|
33
|
+
import RunbookCredentialType from "../../Types/Runbook/RunbookCredentialType";
|
|
34
|
+
import AIRunType from "../../Types/AI/AIRunType";
|
|
35
|
+
import AIRun from "../../Models/DatabaseModels/AIRun";
|
|
36
|
+
import KubernetesCluster from "../../Models/DatabaseModels/KubernetesCluster";
|
|
37
|
+
import RunbookCredential from "../../Models/DatabaseModels/RunbookCredential";
|
|
38
|
+
import Runner from "../../Models/DatabaseModels/Runner";
|
|
39
|
+
import AIRunService from "./AIRunService";
|
|
40
|
+
import KubernetesClusterService from "./KubernetesClusterService";
|
|
41
|
+
import RunbookCredentialService from "./RunbookCredentialService";
|
|
42
|
+
import RunnerService, { Service as RunnerServiceClass } from "./RunnerService";
|
|
13
43
|
import QueryHelper from "../Types/Database/QueryHelper";
|
|
14
44
|
|
|
45
|
+
/*
|
|
46
|
+
* The cluster remediation modes in which a kubectl job for remediation may
|
|
47
|
+
* be enqueued at all. Anything else — Disabled, or a value the dashboard
|
|
48
|
+
* does not know — reads as "remediation is off".
|
|
49
|
+
*/
|
|
50
|
+
const ENABLED_REMEDIATION_MODES: Array<KubernetesAiRemediationMode> = [
|
|
51
|
+
KubernetesAiRemediationMode.RequireApproval,
|
|
52
|
+
KubernetesAiRemediationMode.Automatic,
|
|
53
|
+
KubernetesAiRemediationMode.BypassApproval,
|
|
54
|
+
];
|
|
55
|
+
|
|
56
|
+
// AI runs whose cluster reads are governed by the remediation switch.
|
|
57
|
+
const REMEDIATION_RUN_TYPES: Array<AIRunType> = [
|
|
58
|
+
AIRunType.RemediationExecution,
|
|
59
|
+
AIRunType.RemediationPlan,
|
|
60
|
+
];
|
|
61
|
+
|
|
15
62
|
/*
|
|
16
63
|
* Project-wide hourly ceiling on AI-composed command jobs, counted on the
|
|
17
64
|
* RunnerJob rows themselves so every path (FullAuto inline execution,
|
|
18
65
|
* approved plans, rollbacks) shares one brake.
|
|
19
66
|
*/
|
|
20
67
|
export const MAX_AI_COMMAND_JOBS_PER_PROJECT_PER_HOUR: number = 30;
|
|
68
|
+
|
|
69
|
+
/*
|
|
70
|
+
* Separate, looser brake for READ-ONLY kubectl during investigations: a
|
|
71
|
+
* busy hour of alerts on a large cluster legitimately runs many describe /
|
|
72
|
+
* logs / events calls, and none of them can change anything. Still a
|
|
73
|
+
* ceiling, because every call spends Runner time and LLM budget.
|
|
74
|
+
*/
|
|
75
|
+
export const MAX_AI_INVESTIGATION_COMMAND_JOBS_PER_PROJECT_PER_HOUR: number = 240;
|
|
21
76
|
import SortOrder from "../../Types/BaseDatabase/SortOrder";
|
|
22
77
|
import OneUptimeDate from "../../Types/Date";
|
|
23
78
|
import { JSONObject } from "../../Types/JSON";
|
|
@@ -78,11 +133,287 @@ function unwrapRows(result: unknown): Array<JSONObject> {
|
|
|
78
133
|
return [];
|
|
79
134
|
}
|
|
80
135
|
|
|
136
|
+
/*
|
|
137
|
+
* What stands in for a character a Postgres text column cannot hold: the
|
|
138
|
+
* Unicode replacement character, so a reader of the stored output can see
|
|
139
|
+
* that something was there instead of the bytes silently closing up.
|
|
140
|
+
*/
|
|
141
|
+
export const RUNNER_JOB_UNSTORABLE_CHARACTER_REPLACEMENT: string = "\uFFFD";
|
|
142
|
+
|
|
143
|
+
/*
|
|
144
|
+
* U+0000. Postgres rejects it anywhere in a text value (22021 "invalid byte
|
|
145
|
+
* sequence for encoding UTF8: 0x00") — at bind time, so even a parameter
|
|
146
|
+
* the statement's CASE would not pick fails the whole UPDATE.
|
|
147
|
+
*/
|
|
148
|
+
// eslint-disable-next-line no-control-regex
|
|
149
|
+
const NUL_CHARACTER_PATTERN: RegExp = /\u0000/g;
|
|
150
|
+
|
|
151
|
+
/*
|
|
152
|
+
* A UTF-16 surrogate pair, or a surrogate half on its own. A lone half has
|
|
153
|
+
* no UTF-8 encoding at all (a Runner that cut a string between the two
|
|
154
|
+
* halves sends one); the driver would quietly turn it into U+FFFD on the
|
|
155
|
+
* wire, so it is replaced here explicitly, before redaction, and the text
|
|
156
|
+
* the redaction passes read is exactly the text that is stored. A whole
|
|
157
|
+
* pair is matched first and kept.
|
|
158
|
+
*/
|
|
159
|
+
const SURROGATE_PATTERN: RegExp =
|
|
160
|
+
/[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDFFF]/g;
|
|
161
|
+
|
|
162
|
+
function keepSurrogatePairOnly(match: string): string {
|
|
163
|
+
return match.length === 2
|
|
164
|
+
? match
|
|
165
|
+
: RUNNER_JOB_UNSTORABLE_CHARACTER_REPLACEMENT;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/*
|
|
169
|
+
* Why a timed-out job timed out, in words that fit what it was. A runbook
|
|
170
|
+
* step is waited on by a runbook agent; an AI-composed kubectl command is
|
|
171
|
+
* run by the cluster's Runner, and for it the difference between "nobody
|
|
172
|
+
* picked it up" (nothing ran) and "it was picked up and then went silent"
|
|
173
|
+
* (what it did is unknown) is what the access test, the AI page's command
|
|
174
|
+
* history and a remediation run must each be told — so the row itself
|
|
175
|
+
* carries it, and every reader shows the same text.
|
|
176
|
+
*/
|
|
177
|
+
export type RunnerJobTimeoutKind = "unclaimed" | "lease_expired" | "overall";
|
|
178
|
+
|
|
179
|
+
export function describeRunnerJobTimeout(data: {
|
|
180
|
+
kind: RunnerJobTimeoutKind;
|
|
181
|
+
/*
|
|
182
|
+
* Whether any Runner claimed the job. A job still Pending when the
|
|
183
|
+
* overall window ran out was never picked up, whatever its claim deadline
|
|
184
|
+
* said, and a kubectl command is worded that way ("nothing was run").
|
|
185
|
+
*/
|
|
186
|
+
wasClaimed?: boolean | undefined;
|
|
187
|
+
origin: RunnerJobOrigin | undefined;
|
|
188
|
+
stepType: RunbookStepType | undefined;
|
|
189
|
+
claimTimeoutInMs: number;
|
|
190
|
+
executionTimeoutInMs: number;
|
|
191
|
+
}): string {
|
|
192
|
+
const isAiKubectl: boolean =
|
|
193
|
+
data.stepType === RunbookStepType.Kubectl &&
|
|
194
|
+
AI_COMMAND_JOB_ORIGINS.includes(data.origin || RunnerJobOrigin.Runbook);
|
|
195
|
+
|
|
196
|
+
if (!isAiKubectl) {
|
|
197
|
+
switch (data.kind) {
|
|
198
|
+
case "unclaimed":
|
|
199
|
+
return "No runbook agent picked up this step before the wait window expired. The agent may be offline — check that it is running and reachable, then try again.";
|
|
200
|
+
case "lease_expired":
|
|
201
|
+
return "The runbook agent stopped responding while this step was running. The agent may have crashed or lost its network connection — check that it is still online, then try running the runbook again.";
|
|
202
|
+
default:
|
|
203
|
+
return "This step ran longer than the allowed execution window. Increase the timeout on the step or make the script complete faster.";
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/*
|
|
208
|
+
* A change that may have been applied must not read as "try again": for
|
|
209
|
+
* a remediation command, say to look first.
|
|
210
|
+
*/
|
|
211
|
+
const checkFirst: string =
|
|
212
|
+
data.origin === RunnerJobOrigin.AiRemediation
|
|
213
|
+
? " Check the cluster before running a change again."
|
|
214
|
+
: "";
|
|
215
|
+
|
|
216
|
+
const kind: RunnerJobTimeoutKind =
|
|
217
|
+
data.kind === "overall" && data.wasClaimed === false
|
|
218
|
+
? "unclaimed"
|
|
219
|
+
: data.kind;
|
|
220
|
+
|
|
221
|
+
switch (kind) {
|
|
222
|
+
case "unclaimed":
|
|
223
|
+
return `The cluster's Runner did not pick up this kubectl command within ${describeSeconds(
|
|
224
|
+
data.claimTimeoutInMs,
|
|
225
|
+
)} — it may be offline, restarting or busy with other work. Nothing was run on the cluster.`;
|
|
226
|
+
case "lease_expired":
|
|
227
|
+
return `The cluster's Runner stopped responding while this kubectl command was running — it may have restarted or lost its connection. What the command did is unknown.${checkFirst}`;
|
|
228
|
+
default:
|
|
229
|
+
return `The cluster's Runner did not report a result for this kubectl command in time — kubectl may have outlived its ${describeSeconds(
|
|
230
|
+
data.executionTimeoutInMs,
|
|
231
|
+
)} timeout. What the command did is unknown.${checkFirst}`;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
function describeSeconds(milliseconds: number): string {
|
|
236
|
+
return `${Math.max(1, Math.round(milliseconds / 1000))}s`;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
// Where a Runner's write scope is set, as a refusal words it.
|
|
240
|
+
interface RunnerWriteScopeSettings {
|
|
241
|
+
// Why the Runner refuses node operations (a clause).
|
|
242
|
+
nodeOperationsOff: string;
|
|
243
|
+
// How to let it change nodes (a clause, after "To let OneUptime AI change nodes, ").
|
|
244
|
+
allowNodeOperations: string;
|
|
245
|
+
// Where its write namespaces are set (after the listed namespaces).
|
|
246
|
+
namespaces: string;
|
|
247
|
+
// How to add a namespace to them (after 'To let OneUptime AI change "x", ').
|
|
248
|
+
addNamespace: string;
|
|
249
|
+
}
|
|
250
|
+
|
|
81
251
|
export class Service extends DatabaseService<Model> {
|
|
82
252
|
public constructor() {
|
|
83
253
|
super(Model);
|
|
84
254
|
}
|
|
85
255
|
|
|
256
|
+
/*
|
|
257
|
+
* Why the target Runner, by its own reported posture, will refuse this
|
|
258
|
+
* kubectl WRITE — or null when nothing it reported rules the write out.
|
|
259
|
+
* The rule is the Runner's own (KubectlWriteScope.getRefusal, the one the
|
|
260
|
+
* Runner asks before it spawns kubectl), asked here with what the Runner
|
|
261
|
+
* reported instead of what it was started with. Refusing here means
|
|
262
|
+
* nothing is approved, enqueued or counted by the cluster's circuit
|
|
263
|
+
* breaker only to be refused on the Runner (or answered Forbidden by the
|
|
264
|
+
* API server). Each refusal names the setting to change where that
|
|
265
|
+
* Runner is configured (getRunnerWriteScopeSettings): the Kubernetes
|
|
266
|
+
* agent chart's values for the in-cluster Runner, the Runner's own
|
|
267
|
+
* environment on its host for a Runner that reaches the cluster through
|
|
268
|
+
* a credential.
|
|
269
|
+
*
|
|
270
|
+
* - writeNamespaces (aiAccess.remediation.namespaces, or a credential
|
|
271
|
+
* Runner's ONEUPTIME_KUBECTL_WRITE_NAMESPACES) and podNamespace are the
|
|
272
|
+
* Runner's scope; a Runner that did not report one has none.
|
|
273
|
+
* - allowNodeOperations === false (aiAccess.remediation.nodeOperations,
|
|
274
|
+
* or a credential Runner's ONEUPTIME_KUBECTL_ALLOW_NODE_OPERATIONS): no
|
|
275
|
+
* node operation. A Runner that never said (absent) is not
|
|
276
|
+
* second-guessed.
|
|
277
|
+
* - usesCredential: a write that names no namespace lands in "default"
|
|
278
|
+
* through a credential's kubeconfig, and in the pod's own namespace
|
|
279
|
+
* in-cluster.
|
|
280
|
+
*
|
|
281
|
+
* Reads, and commands the policy denies outright, are never refused for
|
|
282
|
+
* scope.
|
|
283
|
+
*/
|
|
284
|
+
public static getRunnerWriteScopeRefusal(data: {
|
|
285
|
+
policy: KubectlPolicyResult;
|
|
286
|
+
posture: KubernetesRunnerPosture | undefined;
|
|
287
|
+
usesCredential: boolean;
|
|
288
|
+
}): string | null {
|
|
289
|
+
const { policy, posture } = data;
|
|
290
|
+
|
|
291
|
+
if (
|
|
292
|
+
!posture ||
|
|
293
|
+
policy.tier === KubectlCommandTier.Read ||
|
|
294
|
+
policy.tier === KubectlCommandTier.Denied
|
|
295
|
+
) {
|
|
296
|
+
return null;
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
const refusal: KubectlWriteScopeRefusal | null =
|
|
300
|
+
KubectlWriteScope.getRefusal({
|
|
301
|
+
command: policy,
|
|
302
|
+
writeNamespaces: posture.writeNamespaces || [],
|
|
303
|
+
podNamespace: posture.podNamespace || null,
|
|
304
|
+
allowNodeOperations: posture.allowNodeOperations !== false,
|
|
305
|
+
usesCredential: data.usesCredential,
|
|
306
|
+
});
|
|
307
|
+
|
|
308
|
+
return refusal
|
|
309
|
+
? Service.describeRunnerWriteScopeRefusal(
|
|
310
|
+
refusal,
|
|
311
|
+
Service.getRunnerWriteScopeSettings(data.usesCredential),
|
|
312
|
+
)
|
|
313
|
+
: null;
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
/*
|
|
317
|
+
* Where the target Runner's write scope is set, in the words a refusal
|
|
318
|
+
* uses. The in-cluster Runner is the Kubernetes agent's: its chart sets
|
|
319
|
+
* the scope (and the environment variables behind it), and an upgrade
|
|
320
|
+
* changes it. A Runner that reaches the cluster through a Kubernetes
|
|
321
|
+
* credential is an ordinary Runner no chart configures: it reports what
|
|
322
|
+
* it was started with — ONEUPTIME_KUBECTL_WRITE_NAMESPACES and
|
|
323
|
+
* ONEUPTIME_KUBECTL_ALLOW_NODE_OPERATIONS on its own host — and a
|
|
324
|
+
* restart picks up a change.
|
|
325
|
+
*/
|
|
326
|
+
private static getRunnerWriteScopeSettings(
|
|
327
|
+
usesCredential: boolean,
|
|
328
|
+
): RunnerWriteScopeSettings {
|
|
329
|
+
if (usesCredential) {
|
|
330
|
+
return {
|
|
331
|
+
nodeOperationsOff: `it was started with ${KUBECTL_ALLOW_NODE_OPERATIONS_ENV} (or ${KUBECTL_ALLOW_WRITES_ENV}) set to something other than true on its host`,
|
|
332
|
+
allowNodeOperations: `set ${KUBECTL_ALLOW_NODE_OPERATIONS_ENV}=true on that Runner's host and restart it`,
|
|
333
|
+
namespaces: `${KUBECTL_WRITE_NAMESPACES_ENV} on that Runner's host`,
|
|
334
|
+
addNamespace: `add it to ${KUBECTL_WRITE_NAMESPACES_ENV} on that Runner's host and restart it`,
|
|
335
|
+
};
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
return {
|
|
339
|
+
nodeOperationsOff: `its Kubernetes agent was installed with aiAccess.remediation.nodeOperations=false (${KUBECTL_ALLOW_NODE_OPERATIONS_ENV})`,
|
|
340
|
+
allowNodeOperations:
|
|
341
|
+
"upgrade the agent with --set aiAccess.remediation.nodeOperations=true",
|
|
342
|
+
namespaces: `aiAccess.remediation.namespaces on the Kubernetes agent chart, ${KUBECTL_WRITE_NAMESPACES_ENV}`,
|
|
343
|
+
addNamespace:
|
|
344
|
+
"add it to aiAccess.remediation.namespaces and upgrade the agent",
|
|
345
|
+
};
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
// A write-scope refusal, worded for whoever enqueued the command.
|
|
349
|
+
private static describeRunnerWriteScopeRefusal(
|
|
350
|
+
refusal: KubectlWriteScopeRefusal,
|
|
351
|
+
settings: RunnerWriteScopeSettings,
|
|
352
|
+
): string {
|
|
353
|
+
const command: string = `"${refusal.displayCommand}"`;
|
|
354
|
+
const wouldRefuse: string =
|
|
355
|
+
"so the Runner would refuse it. It was not enqueued.";
|
|
356
|
+
const scopeList: string = `${refusal.writeNamespaces
|
|
357
|
+
.map((allowed: string) => {
|
|
358
|
+
return `"${allowed}"`;
|
|
359
|
+
})
|
|
360
|
+
.join(", ")}: ${settings.namespaces}`;
|
|
361
|
+
const namespace: string = refusal.namespace || "";
|
|
362
|
+
const fix: string = refusal.fix ? ` ${refusal.fix}` : "";
|
|
363
|
+
|
|
364
|
+
switch (refusal.code) {
|
|
365
|
+
case "node_operations":
|
|
366
|
+
return `${
|
|
367
|
+
refusal.uncertainty === null
|
|
368
|
+
? `${command} changes a node`
|
|
369
|
+
: `The cluster's Runner cannot tell for certain whether ${command} changes a node (${refusal.uncertainty})`
|
|
370
|
+
}, and the cluster's Runner does not allow node operations (cordon, uncordon, drain, taint, or labelling, annotating or patching a Node): ${settings.nodeOperationsOff}, ${wouldRefuse}${fix} To let OneUptime AI change nodes, ${settings.allowNodeOperations}.`;
|
|
371
|
+
case "objects_uncertain":
|
|
372
|
+
case "namespace_uncertain":
|
|
373
|
+
return `The cluster's Runner cannot tell for certain which ${
|
|
374
|
+
refusal.code === "namespace_uncertain" ? "namespace" : "objects"
|
|
375
|
+
} ${command} changes (${refusal.uncertainty}), ${wouldRefuse}${fix}`;
|
|
376
|
+
case "verb_mismatch":
|
|
377
|
+
return `The cluster's Runner reads the verb of ${command} as "${refusal.readVerb}", but the kubectl policy read "${refusal.policyVerb}", so it cannot tell for certain what the command changes, ${wouldRefuse}`;
|
|
378
|
+
case "unnamed_namespace_objects":
|
|
379
|
+
return `${command} would change Namespace objects without naming them (a selector, --all or no name at all), so the cluster's Runner cannot tell whether one of them is ${
|
|
380
|
+
refusal.podNamespace
|
|
381
|
+
? `"${refusal.podNamespace}", the namespace it runs in`
|
|
382
|
+
: "outside the namespaces it lets OneUptime AI change"
|
|
383
|
+
}, ${wouldRefuse}${fix}`;
|
|
384
|
+
case "cluster_scoped":
|
|
385
|
+
return `${command} changes ${refusal.clusterScopedKinds.join(
|
|
386
|
+
", ",
|
|
387
|
+
)} objects, which are cluster-scoped: they live outside every namespace, so outside the namespaces the cluster's Runner lets OneUptime AI change (${scopeList}) whatever -n says, ${wouldRefuse}`;
|
|
388
|
+
case "all_namespaces":
|
|
389
|
+
return `${command} would change every namespace, including ones the cluster's Runner may not change, ${wouldRefuse}${fix}`;
|
|
390
|
+
case "no_namespace":
|
|
391
|
+
return `${command} names no namespace, and the cluster's Runner reported no namespace of its own for kubectl to use there, ${wouldRefuse}${fix}`;
|
|
392
|
+
case "own_namespace":
|
|
393
|
+
return refusal.namespaceSource === "namespace_object"
|
|
394
|
+
? `${command} would change the Namespace object "${namespace}", the namespace the cluster's in-cluster Runner itself runs in. OneUptime AI never changes it — a change there could reconfigure the Kubernetes agent or the Runner — ${wouldRefuse}`
|
|
395
|
+
: `${command} would change namespace "${namespace}"${
|
|
396
|
+
refusal.namespaceSource === "default_namespace"
|
|
397
|
+
? " (the command names none, so kubectl would use that one)"
|
|
398
|
+
: ""
|
|
399
|
+
}, the namespace the cluster's in-cluster Runner itself runs in. OneUptime AI never changes it — a change there could scale away the Kubernetes agent or the Runner — ${wouldRefuse} Name the namespace of the workload to fix with -n <namespace>.`;
|
|
400
|
+
case "outside_scope":
|
|
401
|
+
return `${command} would change ${
|
|
402
|
+
refusal.namespaceSource === "namespace_object"
|
|
403
|
+
? `the Namespace object "${namespace}" (a Namespace object is judged by its name; -n does not apply to it)`
|
|
404
|
+
: `namespace "${namespace}"${
|
|
405
|
+
refusal.namespaceSource === "default_namespace"
|
|
406
|
+
? " (the command names none, so kubectl would use that one)"
|
|
407
|
+
: ""
|
|
408
|
+
}`
|
|
409
|
+
}, which is outside the namespaces the cluster's Runner lets OneUptime AI change (${scopeList}), ${wouldRefuse} To let OneUptime AI change "${namespace}", ${settings.addNamespace}.`;
|
|
410
|
+
default: {
|
|
411
|
+
const unhandled: never = refusal.code;
|
|
412
|
+
return unhandled;
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
|
|
86
417
|
@CaptureSpan()
|
|
87
418
|
public async enqueue(data: {
|
|
88
419
|
projectId: ObjectID;
|
|
@@ -184,6 +515,16 @@ export class Service extends DatabaseService<Model> {
|
|
|
184
515
|
);
|
|
185
516
|
}
|
|
186
517
|
|
|
518
|
+
/*
|
|
519
|
+
* kubectl has its own policy and its own payload shape (an argv, a
|
|
520
|
+
* cluster, an optional credential) — enqueueAiKubectlCommand owns it.
|
|
521
|
+
*/
|
|
522
|
+
if (data.stepType === RunbookStepType.Kubectl) {
|
|
523
|
+
throw new BadDataException(
|
|
524
|
+
"Kubectl commands are enqueued through enqueueAiKubectlCommand.",
|
|
525
|
+
);
|
|
526
|
+
}
|
|
527
|
+
|
|
187
528
|
const command: string = (data.command || "").trim();
|
|
188
529
|
if (!command) {
|
|
189
530
|
throw new BadDataException("An AI command job needs a command.");
|
|
@@ -200,6 +541,38 @@ export class Service extends DatabaseService<Model> {
|
|
|
200
541
|
throw new BadDataException("An SSH command job needs a credentialId.");
|
|
201
542
|
}
|
|
202
543
|
|
|
544
|
+
/*
|
|
545
|
+
* The target must be one of this project's Runners, and never a
|
|
546
|
+
* kubernetes-agent Runner. That Runner exists to run policy-tiered
|
|
547
|
+
* kubectl with its own ServiceAccount: the claim path serves it kubectl
|
|
548
|
+
* only, so a Bash or SSH job aimed at it would sit unclaimed until its
|
|
549
|
+
* deadline after a human approved it — and its identity is minted with
|
|
550
|
+
* the project's telemetry ingestion key, so it must never be handed
|
|
551
|
+
* AI-composed shell work or an SSH credential. Checked here, at the
|
|
552
|
+
* enqueue chokepoint, so an already-stored plan is refused too.
|
|
553
|
+
*/
|
|
554
|
+
const targetRunner: Runner | null = await RunnerService.findOneBy({
|
|
555
|
+
query: {
|
|
556
|
+
_id: data.targetAgentId.toString(),
|
|
557
|
+
projectId: data.projectId,
|
|
558
|
+
},
|
|
559
|
+
select: { _id: true, name: true, hostInfo: true },
|
|
560
|
+
props: { isRoot: true },
|
|
561
|
+
});
|
|
562
|
+
|
|
563
|
+
if (!targetRunner) {
|
|
564
|
+
throw new BadDataException(
|
|
565
|
+
"The target Runner was not found or it does not belong to this project.",
|
|
566
|
+
);
|
|
567
|
+
}
|
|
568
|
+
|
|
569
|
+
// The one "is an agent row" rule: the name marker or an agent posture.
|
|
570
|
+
if (RunnerServiceClass.isKubernetesAgentRunnerRow(targetRunner)) {
|
|
571
|
+
throw new BadDataException(
|
|
572
|
+
`Runner "${targetRunner.name}" is a cluster's in-cluster Runner: it runs kubectl through its cluster only, never ${data.stepType} commands. Target the Kubernetes cluster instead, or pick a Runner you created under Project Settings → Runners.`,
|
|
573
|
+
);
|
|
574
|
+
}
|
|
575
|
+
|
|
203
576
|
/*
|
|
204
577
|
* Project-wide hourly storm brake for the whole AI-command lane. It
|
|
205
578
|
* lives HERE, at the single enqueue chokepoint, so it also bounds the
|
|
@@ -259,6 +632,449 @@ export class Service extends DatabaseService<Model> {
|
|
|
259
632
|
return this.create({ data: row, props: { isRoot: true } });
|
|
260
633
|
}
|
|
261
634
|
|
|
635
|
+
/*
|
|
636
|
+
* Enqueue ONE kubectl command OneUptime AI composed against a cluster.
|
|
637
|
+
*
|
|
638
|
+
* This is the server-side chokepoint between an LLM's output and a
|
|
639
|
+
* cluster's API server, so it re-runs the kubectl policy regardless of
|
|
640
|
+
* what the tool layer checked: Denied never enqueues, and an
|
|
641
|
+
* investigation-origin job must be Read tier — an investigation can never
|
|
642
|
+
* write, no matter which prompt produced the call. The Runner re-checks
|
|
643
|
+
* the same policy on the argv it receives.
|
|
644
|
+
*
|
|
645
|
+
* The command travels as an argv in the payload (never a shell line) plus
|
|
646
|
+
* the cluster and, for Runners outside the cluster, the credential id the
|
|
647
|
+
* ingress resolves at claim time. In-cluster Runners carry no credential:
|
|
648
|
+
* kubectl uses the pod's own ServiceAccount — which reaches whatever
|
|
649
|
+
* cluster that pod lives in. So a credential-less job is only ever
|
|
650
|
+
* enqueued for the in-cluster Runner OF THIS CLUSTER (its posture names
|
|
651
|
+
* the cluster), and the payload carries the cluster's identifier so the
|
|
652
|
+
* claim path and the Runner can refuse a job that reaches the wrong pod.
|
|
653
|
+
* A credential is never sent to a kubernetes-agent Runner (its identity
|
|
654
|
+
* is minted with the project's telemetry ingestion key).
|
|
655
|
+
*
|
|
656
|
+
* It also re-reads the cluster's CURRENT AI access configuration, because
|
|
657
|
+
* every caller acts on a snapshot (an investigation reads the cluster's
|
|
658
|
+
* status once when it starts, a remediation run when it composes): the
|
|
659
|
+
* target must still be the cluster's bound Runner, a credential must still
|
|
660
|
+
* be its bound Kubernetes credential, an investigation's reads need "Let
|
|
661
|
+
* AI investigate with kubectl" still on, and a remediation run's commands
|
|
662
|
+
* (its reads included) need the cluster's remediation still enabled. An
|
|
663
|
+
* operator who revokes or re-points access therefore stops an in-flight
|
|
664
|
+
* run at its next command.
|
|
665
|
+
*/
|
|
666
|
+
@CaptureSpan()
|
|
667
|
+
public async enqueueAiKubectlCommand(data: {
|
|
668
|
+
projectId: ObjectID;
|
|
669
|
+
/*
|
|
670
|
+
* The AI run the command belongs to. Required for an investigation job;
|
|
671
|
+
* absent only for the dashboard's access test (isAccessTest), which
|
|
672
|
+
* runs a read command with no AI run behind it.
|
|
673
|
+
*/
|
|
674
|
+
aiRunId?: ObjectID | undefined;
|
|
675
|
+
origin: RunnerJobOrigin.AiInvestigation | RunnerJobOrigin.AiRemediation;
|
|
676
|
+
autoRemediationSuggestionId?: ObjectID | undefined;
|
|
677
|
+
kubernetesClusterId: ObjectID;
|
|
678
|
+
stepId: string;
|
|
679
|
+
targetAgentId: ObjectID;
|
|
680
|
+
credentialId?: string | undefined;
|
|
681
|
+
command: string;
|
|
682
|
+
timeoutInMs: number;
|
|
683
|
+
claimTimeoutInMs?: number | undefined;
|
|
684
|
+
/*
|
|
685
|
+
* The cluster AI page's "Test access" check. It is how an operator
|
|
686
|
+
* verifies access BEFORE turning AI on, so it is exempt from the
|
|
687
|
+
* investigation switch — never from the binding, the policy or the
|
|
688
|
+
* read-only rule — and it is kept out of the project-wide investigation
|
|
689
|
+
* brake (the test route has its own per-cluster and per-user limits),
|
|
690
|
+
* so testing can never starve real incident investigations.
|
|
691
|
+
*/
|
|
692
|
+
isAccessTest?: boolean | undefined;
|
|
693
|
+
}): Promise<Model> {
|
|
694
|
+
if (!data.targetAgentId) {
|
|
695
|
+
throw new BadDataException(
|
|
696
|
+
"targetAgentId is required to dispatch a kubectl command to a Runner.",
|
|
697
|
+
);
|
|
698
|
+
}
|
|
699
|
+
|
|
700
|
+
if (!data.kubernetesClusterId) {
|
|
701
|
+
throw new BadDataException(
|
|
702
|
+
"kubernetesClusterId is required for a kubectl command.",
|
|
703
|
+
);
|
|
704
|
+
}
|
|
705
|
+
|
|
706
|
+
if (
|
|
707
|
+
data.origin !== RunnerJobOrigin.AiInvestigation &&
|
|
708
|
+
data.origin !== RunnerJobOrigin.AiRemediation
|
|
709
|
+
) {
|
|
710
|
+
throw new BadDataException(
|
|
711
|
+
`A kubectl command job cannot have origin "${String(data.origin)}".`,
|
|
712
|
+
);
|
|
713
|
+
}
|
|
714
|
+
|
|
715
|
+
if (
|
|
716
|
+
data.origin === RunnerJobOrigin.AiRemediation &&
|
|
717
|
+
!data.autoRemediationSuggestionId
|
|
718
|
+
) {
|
|
719
|
+
throw new BadDataException(
|
|
720
|
+
"A kubectl remediation job needs its auto-remediation suggestion.",
|
|
721
|
+
);
|
|
722
|
+
}
|
|
723
|
+
|
|
724
|
+
const isAccessTest: boolean = data.isAccessTest === true;
|
|
725
|
+
|
|
726
|
+
/*
|
|
727
|
+
* The access test is the only kubectl job without an AI run, and it is
|
|
728
|
+
* a read: that is what lets the investigation brake below count real
|
|
729
|
+
* investigations only (rows with an AI run) without the test slipping
|
|
730
|
+
* work past it under another name.
|
|
731
|
+
*/
|
|
732
|
+
if (
|
|
733
|
+
isAccessTest &&
|
|
734
|
+
(data.origin !== RunnerJobOrigin.AiInvestigation || data.aiRunId)
|
|
735
|
+
) {
|
|
736
|
+
throw new BadDataException(
|
|
737
|
+
"An access test is a read-only check with no AI run behind it.",
|
|
738
|
+
);
|
|
739
|
+
}
|
|
740
|
+
|
|
741
|
+
if (
|
|
742
|
+
data.origin === RunnerJobOrigin.AiInvestigation &&
|
|
743
|
+
!isAccessTest &&
|
|
744
|
+
!data.aiRunId
|
|
745
|
+
) {
|
|
746
|
+
throw new BadDataException(
|
|
747
|
+
"An investigation kubectl job needs the AI run it belongs to.",
|
|
748
|
+
);
|
|
749
|
+
}
|
|
750
|
+
|
|
751
|
+
const policy: KubectlPolicyResult = KubectlPolicy.evaluateCommand(
|
|
752
|
+
data.command,
|
|
753
|
+
);
|
|
754
|
+
|
|
755
|
+
if (policy.tier === KubectlCommandTier.Denied) {
|
|
756
|
+
throw new BadDataException(
|
|
757
|
+
`Denied by the kubectl command policy: ${policy.reason}.`,
|
|
758
|
+
);
|
|
759
|
+
}
|
|
760
|
+
|
|
761
|
+
if (
|
|
762
|
+
data.origin === RunnerJobOrigin.AiInvestigation &&
|
|
763
|
+
policy.tier !== KubectlCommandTier.Read
|
|
764
|
+
) {
|
|
765
|
+
throw new BadDataException(
|
|
766
|
+
`An investigation may only run read-only kubectl commands; "${policy.displayCommand}" would change the cluster (${policy.tier}).`,
|
|
767
|
+
);
|
|
768
|
+
}
|
|
769
|
+
|
|
770
|
+
/*
|
|
771
|
+
* The access test is bounded by its own route limits instead, and an
|
|
772
|
+
* investigation's brake counts only rows with an AI run, so tests never
|
|
773
|
+
* spend the budget real investigations share.
|
|
774
|
+
*/
|
|
775
|
+
if (!isAccessTest) {
|
|
776
|
+
const hourlyCap: number =
|
|
777
|
+
data.origin === RunnerJobOrigin.AiInvestigation
|
|
778
|
+
? MAX_AI_INVESTIGATION_COMMAND_JOBS_PER_PROJECT_PER_HOUR
|
|
779
|
+
: MAX_AI_COMMAND_JOBS_PER_PROJECT_PER_HOUR;
|
|
780
|
+
|
|
781
|
+
const jobsInLastHour: number = (
|
|
782
|
+
await this.countBy({
|
|
783
|
+
query: {
|
|
784
|
+
projectId: data.projectId,
|
|
785
|
+
origin: data.origin,
|
|
786
|
+
createdAt: QueryHelper.greaterThan(
|
|
787
|
+
OneUptimeDate.getSomeHoursAgo(1),
|
|
788
|
+
),
|
|
789
|
+
...(data.origin === RunnerJobOrigin.AiInvestigation
|
|
790
|
+
? { aiRunId: QueryHelper.notNull() }
|
|
791
|
+
: {}),
|
|
792
|
+
},
|
|
793
|
+
props: { isRoot: true },
|
|
794
|
+
})
|
|
795
|
+
).toNumber();
|
|
796
|
+
|
|
797
|
+
if (jobsInLastHour >= hourlyCap) {
|
|
798
|
+
throw new BadDataException(
|
|
799
|
+
data.origin === RunnerJobOrigin.AiInvestigation
|
|
800
|
+
? `This project has run ${jobsInLastHour} AI investigation commands in the last hour, which is its limit (${hourlyCap}). No further cluster commands can run this hour.`
|
|
801
|
+
: `This project has run ${jobsInLastHour} AI remediation commands in the last hour, which is its limit (${hourlyCap}). No further AI commands can run this hour.`,
|
|
802
|
+
);
|
|
803
|
+
}
|
|
804
|
+
}
|
|
805
|
+
|
|
806
|
+
/*
|
|
807
|
+
* The cluster and the target Runner must both be THIS project's. The
|
|
808
|
+
* cluster's identifier travels in the payload; without a credential the
|
|
809
|
+
* Runner must be that cluster's own in-cluster agent, because its
|
|
810
|
+
* ServiceAccount reaches only the cluster its pod lives in.
|
|
811
|
+
*/
|
|
812
|
+
const cluster: KubernetesCluster | null =
|
|
813
|
+
await KubernetesClusterService.findOneBy({
|
|
814
|
+
query: {
|
|
815
|
+
_id: data.kubernetesClusterId.toString(),
|
|
816
|
+
projectId: data.projectId,
|
|
817
|
+
},
|
|
818
|
+
select: {
|
|
819
|
+
_id: true,
|
|
820
|
+
name: true,
|
|
821
|
+
clusterIdentifier: true,
|
|
822
|
+
aiAccessRunnerId: true,
|
|
823
|
+
aiAccessCredentialId: true,
|
|
824
|
+
isAiInvestigationEnabled: true,
|
|
825
|
+
aiRemediationMode: true,
|
|
826
|
+
},
|
|
827
|
+
props: { isRoot: true },
|
|
828
|
+
});
|
|
829
|
+
|
|
830
|
+
if (!cluster) {
|
|
831
|
+
throw new BadDataException(
|
|
832
|
+
"Kubernetes cluster not found or it does not belong to this project.",
|
|
833
|
+
);
|
|
834
|
+
}
|
|
835
|
+
|
|
836
|
+
const clusterIdentifier: string = (cluster.clusterIdentifier || "").trim();
|
|
837
|
+
const clusterLabel: string =
|
|
838
|
+
cluster.name || clusterIdentifier || data.kubernetesClusterId.toString();
|
|
839
|
+
|
|
840
|
+
const bindingRefusal: string | null = Service.getClusterBindingRefusal({
|
|
841
|
+
cluster,
|
|
842
|
+
clusterLabel,
|
|
843
|
+
targetAgentId: data.targetAgentId,
|
|
844
|
+
credentialId: data.credentialId,
|
|
845
|
+
requiredSwitch: await this.getRequiredClusterSwitch({
|
|
846
|
+
projectId: data.projectId,
|
|
847
|
+
origin: data.origin,
|
|
848
|
+
aiRunId: data.aiRunId,
|
|
849
|
+
isAccessTest,
|
|
850
|
+
}),
|
|
851
|
+
});
|
|
852
|
+
|
|
853
|
+
if (bindingRefusal) {
|
|
854
|
+
throw new BadDataException(bindingRefusal);
|
|
855
|
+
}
|
|
856
|
+
|
|
857
|
+
const targetRunner: Runner | null = await RunnerService.findOneBy({
|
|
858
|
+
query: {
|
|
859
|
+
_id: data.targetAgentId.toString(),
|
|
860
|
+
projectId: data.projectId,
|
|
861
|
+
},
|
|
862
|
+
select: { _id: true, name: true, hostInfo: true },
|
|
863
|
+
props: { isRoot: true },
|
|
864
|
+
});
|
|
865
|
+
|
|
866
|
+
if (!targetRunner) {
|
|
867
|
+
throw new BadDataException(
|
|
868
|
+
"The target Runner was not found or it does not belong to this project.",
|
|
869
|
+
);
|
|
870
|
+
}
|
|
871
|
+
|
|
872
|
+
if (data.credentialId) {
|
|
873
|
+
/*
|
|
874
|
+
* A kubernetes-agent Runner is never handed credential material: its
|
|
875
|
+
* identity is issued with the project's telemetry ingestion key, so
|
|
876
|
+
* anyone holding that key could come to hold the credential too. The
|
|
877
|
+
* claim path refuses it as well (by the same name-or-posture rule);
|
|
878
|
+
* refusing here keeps the job from ever existing.
|
|
879
|
+
*/
|
|
880
|
+
if (RunnerServiceClass.isKubernetesAgentRunnerRow(targetRunner)) {
|
|
881
|
+
throw new BadDataException(
|
|
882
|
+
`Runner "${targetRunner.name}" is a cluster's in-cluster Runner and is never given a credential, so a kubectl command for cluster "${clusterLabel}" that needs one cannot run on it. Create a Runner under Project Settings → Runners, assign the Kubernetes credential to it and select both on the cluster's AI page.`,
|
|
883
|
+
);
|
|
884
|
+
}
|
|
885
|
+
|
|
886
|
+
const credential: RunbookCredential | null = ObjectID.isValidUUID(
|
|
887
|
+
data.credentialId,
|
|
888
|
+
)
|
|
889
|
+
? await RunbookCredentialService.findOneBy({
|
|
890
|
+
query: {
|
|
891
|
+
_id: data.credentialId,
|
|
892
|
+
projectId: data.projectId,
|
|
893
|
+
},
|
|
894
|
+
select: { _id: true, name: true, credentialType: true },
|
|
895
|
+
props: { isRoot: true },
|
|
896
|
+
})
|
|
897
|
+
: null;
|
|
898
|
+
|
|
899
|
+
if (
|
|
900
|
+
!credential ||
|
|
901
|
+
credential.credentialType !== RunbookCredentialType.Kubernetes
|
|
902
|
+
) {
|
|
903
|
+
throw new BadDataException(
|
|
904
|
+
`The credential this kubectl command names is not a Kubernetes credential of this project, so it was not enqueued for cluster "${clusterLabel}".`,
|
|
905
|
+
);
|
|
906
|
+
}
|
|
907
|
+
}
|
|
908
|
+
|
|
909
|
+
const posture: KubernetesRunnerPosture | undefined =
|
|
910
|
+
parseKubernetesRunnerPosture(targetRunner.hostInfo);
|
|
911
|
+
|
|
912
|
+
if (!data.credentialId) {
|
|
913
|
+
if (!isInClusterPostureForCluster(posture, clusterIdentifier)) {
|
|
914
|
+
throw new BadDataException(
|
|
915
|
+
`A kubectl command without a Kubernetes credential can only run on the in-cluster Runner of cluster "${
|
|
916
|
+
clusterIdentifier || cluster.name || cluster.id?.toString()
|
|
917
|
+
}", and Runner "${targetRunner.name}" ${
|
|
918
|
+
posture?.inCluster
|
|
919
|
+
? `is the in-cluster Runner of ${
|
|
920
|
+
posture.clusterIdentifier?.trim()
|
|
921
|
+
? `cluster "${posture.clusterIdentifier.trim()}"`
|
|
922
|
+
: "an unnamed cluster"
|
|
923
|
+
}`
|
|
924
|
+
: "runs outside the cluster"
|
|
925
|
+
}. Select a Kubernetes credential for this Runner on the cluster's AI page, or install the in-cluster Runner on this cluster.`,
|
|
926
|
+
);
|
|
927
|
+
}
|
|
928
|
+
}
|
|
929
|
+
|
|
930
|
+
/*
|
|
931
|
+
* A remediation write the Runner's own posture says it will refuse — a
|
|
932
|
+
* namespace outside its write scope, its own namespace, or a node
|
|
933
|
+
* operation its chart did not grant — is refused here, before it can be
|
|
934
|
+
* approved, enqueued or counted by the cluster's circuit breaker, with
|
|
935
|
+
* the chart value that would allow it. Reads are never refused for
|
|
936
|
+
* scope.
|
|
937
|
+
*/
|
|
938
|
+
if (data.origin === RunnerJobOrigin.AiRemediation) {
|
|
939
|
+
const scopeRefusal: string | null = Service.getRunnerWriteScopeRefusal({
|
|
940
|
+
policy,
|
|
941
|
+
posture,
|
|
942
|
+
usesCredential: Boolean(data.credentialId),
|
|
943
|
+
});
|
|
944
|
+
|
|
945
|
+
if (scopeRefusal) {
|
|
946
|
+
throw new BadDataException(scopeRefusal);
|
|
947
|
+
}
|
|
948
|
+
}
|
|
949
|
+
|
|
950
|
+
const claimDeadlineAt: Date = OneUptimeDate.addRemoveSeconds(
|
|
951
|
+
OneUptimeDate.getCurrentDate(),
|
|
952
|
+
Math.ceil((data.claimTimeoutInMs ?? DEFAULT_CLAIM_TIMEOUT_MS) / 1000),
|
|
953
|
+
);
|
|
954
|
+
|
|
955
|
+
const row: Model = new Model();
|
|
956
|
+
row.projectId = data.projectId;
|
|
957
|
+
row.origin = data.origin;
|
|
958
|
+
if (data.aiRunId) {
|
|
959
|
+
row.aiRunId = data.aiRunId;
|
|
960
|
+
}
|
|
961
|
+
if (data.autoRemediationSuggestionId) {
|
|
962
|
+
row.autoRemediationSuggestionId = data.autoRemediationSuggestionId;
|
|
963
|
+
}
|
|
964
|
+
row.kubernetesClusterId = data.kubernetesClusterId;
|
|
965
|
+
row.stepId = data.stepId;
|
|
966
|
+
row.stepType = RunbookStepType.Kubectl;
|
|
967
|
+
row.targetAgentId = data.targetAgentId;
|
|
968
|
+
row.script = "";
|
|
969
|
+
row.payload = {
|
|
970
|
+
args: policy.args,
|
|
971
|
+
displayCommand: policy.displayCommand,
|
|
972
|
+
tier: policy.tier,
|
|
973
|
+
kubernetesClusterId: data.kubernetesClusterId.toString(),
|
|
974
|
+
...(clusterIdentifier ? { clusterIdentifier } : {}),
|
|
975
|
+
...(data.credentialId ? { credentialId: data.credentialId } : {}),
|
|
976
|
+
};
|
|
977
|
+
row.timeoutInMs = data.timeoutInMs;
|
|
978
|
+
row.status = RunnerJobStatus.Pending;
|
|
979
|
+
row.claimDeadlineAt = claimDeadlineAt;
|
|
980
|
+
|
|
981
|
+
return this.create({ data: row, props: { isRoot: true } });
|
|
982
|
+
}
|
|
983
|
+
|
|
984
|
+
/*
|
|
985
|
+
* Which of the cluster's AI switches must still be on for this kubectl
|
|
986
|
+
* job, or null for none (the access test, which is how an operator checks
|
|
987
|
+
* access before turning AI on).
|
|
988
|
+
*
|
|
989
|
+
* A remediation job needs remediation. A read-only (investigation-origin)
|
|
990
|
+
* job follows the run it belongs to: a remediation run reads the cluster
|
|
991
|
+
* it may fix through the same read-only lane — even when the operator
|
|
992
|
+
* left investigation off — so its reads need remediation, and every
|
|
993
|
+
* other run's reads need the investigation switch.
|
|
994
|
+
*/
|
|
995
|
+
private async getRequiredClusterSwitch(data: {
|
|
996
|
+
projectId: ObjectID;
|
|
997
|
+
origin: RunnerJobOrigin;
|
|
998
|
+
aiRunId?: ObjectID | undefined;
|
|
999
|
+
isAccessTest: boolean;
|
|
1000
|
+
}): Promise<"investigation" | "remediation" | null> {
|
|
1001
|
+
if (data.origin === RunnerJobOrigin.AiRemediation) {
|
|
1002
|
+
return "remediation";
|
|
1003
|
+
}
|
|
1004
|
+
|
|
1005
|
+
if (data.isAccessTest || !data.aiRunId) {
|
|
1006
|
+
return null;
|
|
1007
|
+
}
|
|
1008
|
+
|
|
1009
|
+
const run: AIRun | null = await AIRunService.findOneBy({
|
|
1010
|
+
query: {
|
|
1011
|
+
_id: data.aiRunId.toString(),
|
|
1012
|
+
projectId: data.projectId,
|
|
1013
|
+
},
|
|
1014
|
+
select: { _id: true, runType: true },
|
|
1015
|
+
props: { isRoot: true },
|
|
1016
|
+
});
|
|
1017
|
+
|
|
1018
|
+
return run?.runType && REMEDIATION_RUN_TYPES.includes(run.runType)
|
|
1019
|
+
? "remediation"
|
|
1020
|
+
: "investigation";
|
|
1021
|
+
}
|
|
1022
|
+
|
|
1023
|
+
/*
|
|
1024
|
+
* Why a kubectl job may NOT be enqueued for this cluster as it is
|
|
1025
|
+
* configured right now, or null when it may. Pure, so the rule reads in
|
|
1026
|
+
* one place: the job must go through the cluster's CURRENT binding, and
|
|
1027
|
+
* the capability it is for must still be switched on.
|
|
1028
|
+
*
|
|
1029
|
+
* A credential-less job does not require the credential binding to be
|
|
1030
|
+
* empty: the in-cluster Runner of the cluster wins over a bound
|
|
1031
|
+
* credential (the readiness status prefers it), so such a job is
|
|
1032
|
+
* legitimate with a credential still selected.
|
|
1033
|
+
*/
|
|
1034
|
+
public static getClusterBindingRefusal(data: {
|
|
1035
|
+
cluster: KubernetesCluster;
|
|
1036
|
+
clusterLabel: string;
|
|
1037
|
+
targetAgentId: ObjectID;
|
|
1038
|
+
credentialId?: string | undefined;
|
|
1039
|
+
// The switch that must still be on; null for the access test.
|
|
1040
|
+
requiredSwitch: "investigation" | "remediation" | null;
|
|
1041
|
+
}): string | null {
|
|
1042
|
+
const { cluster, clusterLabel } = data;
|
|
1043
|
+
|
|
1044
|
+
if (
|
|
1045
|
+
!cluster.aiAccessRunnerId ||
|
|
1046
|
+
cluster.aiAccessRunnerId.toString() !== data.targetAgentId.toString()
|
|
1047
|
+
) {
|
|
1048
|
+
return `Cluster "${clusterLabel}" is no longer reached through this Runner (its AI access binding changed or was cleared on the cluster's AI page), so this kubectl command was not enqueued.`;
|
|
1049
|
+
}
|
|
1050
|
+
|
|
1051
|
+
if (
|
|
1052
|
+
data.credentialId &&
|
|
1053
|
+
(!cluster.aiAccessCredentialId ||
|
|
1054
|
+
cluster.aiAccessCredentialId.toString() !== data.credentialId)
|
|
1055
|
+
) {
|
|
1056
|
+
return `Cluster "${clusterLabel}" is no longer reached with this Kubernetes credential (its AI access binding changed or was cleared on the cluster's AI page), so this kubectl command was not enqueued.`;
|
|
1057
|
+
}
|
|
1058
|
+
|
|
1059
|
+
if (
|
|
1060
|
+
data.requiredSwitch === "investigation" &&
|
|
1061
|
+
cluster.isAiInvestigationEnabled !== true
|
|
1062
|
+
) {
|
|
1063
|
+
return `"Let AI investigate with kubectl" is turned off for cluster "${clusterLabel}", so this investigation command was not enqueued.`;
|
|
1064
|
+
}
|
|
1065
|
+
|
|
1066
|
+
if (
|
|
1067
|
+
data.requiredSwitch === "remediation" &&
|
|
1068
|
+
!ENABLED_REMEDIATION_MODES.includes(
|
|
1069
|
+
cluster.aiRemediationMode as KubernetesAiRemediationMode,
|
|
1070
|
+
)
|
|
1071
|
+
) {
|
|
1072
|
+
return `AI remediation is turned off for cluster "${clusterLabel}", so this kubectl command was not enqueued.`;
|
|
1073
|
+
}
|
|
1074
|
+
|
|
1075
|
+
return null;
|
|
1076
|
+
}
|
|
1077
|
+
|
|
262
1078
|
/*
|
|
263
1079
|
* The job this (execution, step) pair already produced, if any.
|
|
264
1080
|
*
|
|
@@ -316,7 +1132,21 @@ export class Service extends DatabaseService<Model> {
|
|
|
316
1132
|
* asked for explicitly by the ingress after checking canRunAiCommands.
|
|
317
1133
|
*/
|
|
318
1134
|
allowedOrigins?: Array<RunnerJobOrigin> | undefined;
|
|
1135
|
+
/*
|
|
1136
|
+
* Which step types this Runner may be handed. Undefined means every
|
|
1137
|
+
* runner-executed type (the historical contract); an explicit empty
|
|
1138
|
+
* list means nothing at all and returns null without touching the
|
|
1139
|
+
* database. The ingress narrows this for the kubernetes-agent Runner
|
|
1140
|
+
* (kubectl only) and for a Runner that declares its own list on the
|
|
1141
|
+
* claim, so an AI-composed shell command can never be leased by a pod
|
|
1142
|
+
* that only exists to run kubectl.
|
|
1143
|
+
*/
|
|
1144
|
+
allowedStepTypes?: Array<RunbookStepType> | undefined;
|
|
319
1145
|
}): Promise<Model | null> {
|
|
1146
|
+
if (data.allowedStepTypes && data.allowedStepTypes.length === 0) {
|
|
1147
|
+
return null;
|
|
1148
|
+
}
|
|
1149
|
+
|
|
320
1150
|
const dataSource: ReturnType<typeof PostgresAppInstance.getDataSource> =
|
|
321
1151
|
PostgresAppInstance.getDataSource();
|
|
322
1152
|
|
|
@@ -331,6 +1161,9 @@ export class Service extends DatabaseService<Model> {
|
|
|
331
1161
|
? data.allowedOrigins
|
|
332
1162
|
: [RunnerJobOrigin.Runbook];
|
|
333
1163
|
|
|
1164
|
+
const allowedStepTypes: Array<RunbookStepType> | null =
|
|
1165
|
+
data.allowedStepTypes ?? null;
|
|
1166
|
+
|
|
334
1167
|
const sql: string = `
|
|
335
1168
|
WITH claimed AS (
|
|
336
1169
|
SELECT "_id" FROM "RunnerJob"
|
|
@@ -338,6 +1171,7 @@ export class Service extends DatabaseService<Model> {
|
|
|
338
1171
|
AND "status" = $2
|
|
339
1172
|
AND "targetAgentId" = $3::uuid
|
|
340
1173
|
AND "origin" = ANY($6::text[])
|
|
1174
|
+
AND ($7::text[] IS NULL OR "stepType" = ANY($7::text[]))
|
|
341
1175
|
AND "claimDeadlineAt" > NOW()
|
|
342
1176
|
AND "deletedAt" IS NULL
|
|
343
1177
|
ORDER BY "createdAt" ASC
|
|
@@ -368,6 +1202,7 @@ export class Service extends DatabaseService<Model> {
|
|
|
368
1202
|
RunnerJobStatus.Claimed,
|
|
369
1203
|
leaseMs.toString(),
|
|
370
1204
|
allowedOrigins,
|
|
1205
|
+
allowedStepTypes,
|
|
371
1206
|
]),
|
|
372
1207
|
);
|
|
373
1208
|
|
|
@@ -454,6 +1289,42 @@ export class Service extends DatabaseService<Model> {
|
|
|
454
1289
|
return rows.length > 0;
|
|
455
1290
|
}
|
|
456
1291
|
|
|
1292
|
+
/*
|
|
1293
|
+
* What an AI-origin job's output looks like on the row. The dashboard
|
|
1294
|
+
* renders RunnerJob.output verbatim on the cluster's AI page and the
|
|
1295
|
+
* remediation card, so a `kubectl get secret -o yaml` an investigation
|
|
1296
|
+
* ran must never land there with its data values intact: the same two
|
|
1297
|
+
* passes KubectlJobRunner applies before the model sees the output are
|
|
1298
|
+
* applied here before the row does. Both are pure text transforms (the
|
|
1299
|
+
* redactor is dependency-free by design; importing KubectlJobRunner into
|
|
1300
|
+
* this service would be an import cycle). A runbook step's output is the
|
|
1301
|
+
* operator's own script and is stored as it was.
|
|
1302
|
+
*/
|
|
1303
|
+
public static redactAiJobText(text: string): string {
|
|
1304
|
+
return ToolResultSerializer.redact(KubectlOutputRedactor.redact(text).text)
|
|
1305
|
+
.text;
|
|
1306
|
+
}
|
|
1307
|
+
|
|
1308
|
+
/*
|
|
1309
|
+
* A Runner's text as a Postgres text column can hold it. A NUL byte is
|
|
1310
|
+
* ordinary in what a Runner reports — `kubectl logs` of a log that was
|
|
1311
|
+
* rotated with copytruncate, a ConfigMap value `describe` prints
|
|
1312
|
+
* verbatim, a script that writes binary — and Postgres refuses the whole
|
|
1313
|
+
* UPDATE over one, so the result could never be stored: every submission
|
|
1314
|
+
* failed the same way, the Runner retried it as if the server were down,
|
|
1315
|
+
* and the job ended "result unknown" although the command had run. Each
|
|
1316
|
+
* such character becomes U+FFFD instead, for every origin, and before
|
|
1317
|
+
* anything else reads the text.
|
|
1318
|
+
*/
|
|
1319
|
+
public static toStorableText(text: string): string {
|
|
1320
|
+
return text
|
|
1321
|
+
.replace(
|
|
1322
|
+
NUL_CHARACTER_PATTERN,
|
|
1323
|
+
RUNNER_JOB_UNSTORABLE_CHARACTER_REPLACEMENT,
|
|
1324
|
+
)
|
|
1325
|
+
.replace(SURROGATE_PATTERN, keepSurrogatePairOnly);
|
|
1326
|
+
}
|
|
1327
|
+
|
|
457
1328
|
@CaptureSpan()
|
|
458
1329
|
public async submitResult(data: {
|
|
459
1330
|
jobId: ObjectID;
|
|
@@ -473,6 +1344,33 @@ export class Service extends DatabaseService<Model> {
|
|
|
473
1344
|
? RunnerJobStatus.Succeeded
|
|
474
1345
|
: RunnerJobStatus.Failed;
|
|
475
1346
|
|
|
1347
|
+
/*
|
|
1348
|
+
* Made storable first: every text parameter below is bound whichever
|
|
1349
|
+
* branch of the CASE the row takes, so one unstorable character in any
|
|
1350
|
+
* of them would fail the write for every origin.
|
|
1351
|
+
*/
|
|
1352
|
+
const rawOutput: string | null =
|
|
1353
|
+
typeof data.output === "string"
|
|
1354
|
+
? Service.toStorableText(data.output)
|
|
1355
|
+
: null;
|
|
1356
|
+
const rawErrorMessage: string | null =
|
|
1357
|
+
typeof data.errorMessage === "string"
|
|
1358
|
+
? Service.toStorableText(data.errorMessage)
|
|
1359
|
+
: null;
|
|
1360
|
+
|
|
1361
|
+
/*
|
|
1362
|
+
* The origin decides which text is stored, and it is read in the same
|
|
1363
|
+
* statement rather than looked up first so the lease check and the
|
|
1364
|
+
* write stay one atomic step (and one round trip): the CASE picks the
|
|
1365
|
+
* redacted text for an AI-origin row and the verbatim text otherwise.
|
|
1366
|
+
*/
|
|
1367
|
+
const redactedOutput: string | null =
|
|
1368
|
+
rawOutput === null ? null : Service.redactAiJobText(rawOutput);
|
|
1369
|
+
const redactedErrorMessage: string | null =
|
|
1370
|
+
rawErrorMessage === null
|
|
1371
|
+
? null
|
|
1372
|
+
: Service.redactAiJobText(rawErrorMessage);
|
|
1373
|
+
|
|
476
1374
|
/*
|
|
477
1375
|
* Only the agent that holds the lease is allowed to write the terminal
|
|
478
1376
|
* result. If the lease has already moved on (Worker timed out and
|
|
@@ -481,9 +1379,15 @@ export class Service extends DatabaseService<Model> {
|
|
|
481
1379
|
const sql: string = `
|
|
482
1380
|
UPDATE "RunnerJob"
|
|
483
1381
|
SET "status" = $1,
|
|
484
|
-
"output" =
|
|
1382
|
+
"output" = CASE
|
|
1383
|
+
WHEN "origin" = ANY($9::text[]) THEN $10::text
|
|
1384
|
+
ELSE $2::text
|
|
1385
|
+
END,
|
|
485
1386
|
"exitCode" = $3,
|
|
486
|
-
"errorMessage" =
|
|
1387
|
+
"errorMessage" = CASE
|
|
1388
|
+
WHEN "origin" = ANY($9::text[]) THEN $11::text
|
|
1389
|
+
ELSE $4::text
|
|
1390
|
+
END,
|
|
487
1391
|
"completedAt" = NOW(),
|
|
488
1392
|
"updatedAt" = NOW(),
|
|
489
1393
|
"version" = "version" + 1
|
|
@@ -495,13 +1399,16 @@ export class Service extends DatabaseService<Model> {
|
|
|
495
1399
|
const rows: Array<JSONObject> = unwrapRows(
|
|
496
1400
|
await dataSource.query(sql, [
|
|
497
1401
|
status,
|
|
498
|
-
|
|
1402
|
+
rawOutput,
|
|
499
1403
|
data.exitCode ?? null,
|
|
500
|
-
|
|
1404
|
+
rawErrorMessage,
|
|
501
1405
|
data.jobId.toString(),
|
|
502
1406
|
data.agentId.toString(),
|
|
503
1407
|
RunnerJobStatus.Claimed,
|
|
504
1408
|
RunnerJobStatus.Running,
|
|
1409
|
+
AI_COMMAND_JOB_ORIGINS,
|
|
1410
|
+
redactedOutput,
|
|
1411
|
+
redactedErrorMessage,
|
|
505
1412
|
]),
|
|
506
1413
|
);
|
|
507
1414
|
|
|
@@ -548,6 +1455,9 @@ export class Service extends DatabaseService<Model> {
|
|
|
548
1455
|
startedAt: true,
|
|
549
1456
|
completedAt: true,
|
|
550
1457
|
assignedAgentId: true,
|
|
1458
|
+
// The timeout reason is worded for what the job is.
|
|
1459
|
+
origin: true,
|
|
1460
|
+
stepType: true,
|
|
551
1461
|
},
|
|
552
1462
|
props: { isRoot: true },
|
|
553
1463
|
});
|
|
@@ -563,39 +1473,38 @@ export class Service extends DatabaseService<Model> {
|
|
|
563
1473
|
}
|
|
564
1474
|
|
|
565
1475
|
const now: Date = OneUptimeDate.getCurrentDate();
|
|
1476
|
+
let timeoutKind: RunnerJobTimeoutKind | null = null;
|
|
566
1477
|
|
|
567
|
-
// Pending with claim deadline elapsed -> no agent picked it up.
|
|
568
1478
|
if (
|
|
569
1479
|
job.status === RunnerJobStatus.Pending &&
|
|
570
1480
|
job.claimDeadlineAt &&
|
|
571
1481
|
now > job.claimDeadlineAt
|
|
572
1482
|
) {
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
"No runbook agent picked up this step before the wait window expired. The agent may be offline — check that it is running and reachable, then try again.",
|
|
577
|
-
});
|
|
578
|
-
}
|
|
579
|
-
|
|
580
|
-
// Claimed/Running with lease elapsed -> agent went silent.
|
|
581
|
-
if (
|
|
1483
|
+
// Pending with claim deadline elapsed -> no agent picked it up.
|
|
1484
|
+
timeoutKind = "unclaimed";
|
|
1485
|
+
} else if (
|
|
582
1486
|
(job.status === RunnerJobStatus.Claimed ||
|
|
583
1487
|
job.status === RunnerJobStatus.Running) &&
|
|
584
1488
|
job.leaseExpiresAt &&
|
|
585
1489
|
now > job.leaseExpiresAt
|
|
586
1490
|
) {
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
});
|
|
1491
|
+
// Claimed/Running with lease elapsed -> agent went silent.
|
|
1492
|
+
timeoutKind = "lease_expired";
|
|
1493
|
+
} else if (now > overallDeadline) {
|
|
1494
|
+
timeoutKind = "overall";
|
|
592
1495
|
}
|
|
593
1496
|
|
|
594
|
-
if (
|
|
1497
|
+
if (timeoutKind) {
|
|
595
1498
|
return this.timeoutJob({
|
|
596
1499
|
jobId: data.jobId,
|
|
597
|
-
reason:
|
|
598
|
-
|
|
1500
|
+
reason: describeRunnerJobTimeout({
|
|
1501
|
+
kind: timeoutKind,
|
|
1502
|
+
wasClaimed: job.status !== RunnerJobStatus.Pending,
|
|
1503
|
+
origin: job.origin,
|
|
1504
|
+
stepType: job.stepType,
|
|
1505
|
+
claimTimeoutInMs: data.claimTimeoutInMs,
|
|
1506
|
+
executionTimeoutInMs: data.executionTimeoutInMs,
|
|
1507
|
+
}),
|
|
599
1508
|
});
|
|
600
1509
|
}
|
|
601
1510
|
|
|
@@ -639,6 +1548,12 @@ export class Service extends DatabaseService<Model> {
|
|
|
639
1548
|
RunnerJobStatus.Cancelled,
|
|
640
1549
|
]);
|
|
641
1550
|
|
|
1551
|
+
/*
|
|
1552
|
+
* The claim facts come back with the row, so a caller can tell whether
|
|
1553
|
+
* any Runner ever picked the job up (claimedAt / assignedAgentId) or
|
|
1554
|
+
* started it (startedAt) — "nothing ran" versus "unknown" — without a
|
|
1555
|
+
* second read.
|
|
1556
|
+
*/
|
|
642
1557
|
const updated: Model | null = await this.findOneById({
|
|
643
1558
|
id: data.jobId,
|
|
644
1559
|
select: {
|
|
@@ -648,6 +1563,9 @@ export class Service extends DatabaseService<Model> {
|
|
|
648
1563
|
exitCode: true,
|
|
649
1564
|
errorMessage: true,
|
|
650
1565
|
completedAt: true,
|
|
1566
|
+
claimedAt: true,
|
|
1567
|
+
startedAt: true,
|
|
1568
|
+
assignedAgentId: true,
|
|
651
1569
|
},
|
|
652
1570
|
props: { isRoot: true },
|
|
653
1571
|
});
|