@oneuptime/common 14.0.1 → 14.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Models/DatabaseModels/AlertEpisodeMember.ts +8 -1
- package/Models/DatabaseModels/AlertFeed.ts +2 -0
- package/Models/DatabaseModels/AutoRemediationSuggestion.ts +63 -0
- package/Models/DatabaseModels/IncidentAlert.ts +540 -0
- package/Models/DatabaseModels/IncidentEpisodeMember.ts +8 -1
- package/Models/DatabaseModels/IncidentEpisodePublicNote.ts +9 -2
- package/Models/DatabaseModels/IncidentFeed.ts +2 -0
- package/Models/DatabaseModels/IncidentPublicNote.ts +9 -2
- package/Models/DatabaseModels/Index.ts +2 -0
- package/Models/DatabaseModels/KubernetesCluster.ts +429 -0
- package/Models/DatabaseModels/Monitor.ts +48 -0
- package/Models/DatabaseModels/Project.ts +60 -0
- package/Models/DatabaseModels/RumApplication.ts +52 -1
- package/Models/DatabaseModels/Runner.ts +5 -4
- package/Models/DatabaseModels/RunnerJob.ts +66 -0
- package/Models/DatabaseModels/ScheduledMaintenancePublicNote.ts +10 -2
- package/Models/DatabaseModels/WorkflowVariable.ts +479 -2
- package/Models/DatabaseModels/WorkspaceProjectAuthToken.ts +79 -25
- package/Server/API/AIInvestigationAPI.ts +341 -0
- package/Server/API/AutoRemediationAPI.ts +184 -2
- package/Server/API/CommonAPI.ts +70 -0
- package/Server/API/KubernetesClusterAiAccessAPI.ts +793 -0
- package/Server/API/MicrosoftTeamsAPI.ts +770 -315
- package/Server/API/MonitorAPI.ts +140 -0
- package/Server/API/OnCallScheduleTimelineAPI.ts +5 -21
- package/Server/API/SlackAPI.ts +447 -99
- package/Server/API/StatusPageAPI.ts +146 -26
- package/Server/API/TelemetryAPI.ts +216 -5
- package/Server/API/UserTwoFactorBackupCodeAPI.ts +1 -0
- package/Server/API/WorkflowVariableAPI.ts +156 -0
- package/Server/Infrastructure/GlobalCache.ts +35 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1794300000000-AddOAuth2WorkflowVariables.ts +97 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1794400000000-AddKubernetesClusterAiAccess.ts +129 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1794500000000-AddIncomingEmailCustomAddressToMonitor.ts +25 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1794600000000-AddAuthTokenExpiresAtToWorkspaceProjectAuthToken.ts +20 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1794700000000-RemoveAppAccessTokenFromWorkspaceProjectAuthTokenMiscData.ts +38 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1794800000000-AddSessionReplaySameOriginTracePropagation.ts +28 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1794900000000-AddIncidentAlert.ts +89 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +14 -0
- package/Server/Middleware/MasterAdminAuthorization.ts +28 -0
- package/Server/Middleware/TelemetryIngest.ts +47 -2
- package/Server/Middleware/UserAuthorization.ts +56 -2
- package/Server/Services/AIAgentService.ts +1 -0
- package/Server/Services/AccessTokenService.ts +121 -48
- package/Server/Services/AlertEpisodeMemberService.ts +9 -0
- package/Server/Services/AlertEpisodeService.ts +14 -1
- package/Server/Services/AlertService.ts +134 -22
- package/Server/Services/AutoRemediationRuleEngineService.ts +968 -39
- package/Server/Services/AutoRemediationRuleService.ts +118 -0
- package/Server/Services/BillingService.ts +1 -0
- package/Server/Services/InboundEmail/Providers/SendGridInboundProvider.ts +16 -22
- package/Server/Services/IncidentAlertService.ts +1811 -0
- package/Server/Services/IncidentEpisodeMemberService.ts +9 -0
- package/Server/Services/IncidentEpisodePublicNoteService.ts +66 -0
- package/Server/Services/IncidentEpisodeRoleMemberService.ts +27 -0
- package/Server/Services/IncidentEpisodeService.ts +14 -1
- package/Server/Services/IncidentGroupingEngineService.ts +11 -0
- package/Server/Services/IncidentMemberService.ts +21 -0
- package/Server/Services/IncidentPublicNoteService.ts +63 -0
- package/Server/Services/IncidentService.ts +330 -30
- package/Server/Services/IncidentStateTimelineService.ts +39 -0
- package/Server/Services/IncidentTemplateService.ts +83 -3
- package/Server/Services/Index.ts +2 -0
- package/Server/Services/KubernetesClusterAiAccessService.ts +1943 -0
- package/Server/Services/KubernetesClusterService.ts +1570 -1
- package/Server/Services/LogAggregationService.ts +14 -6
- package/Server/Services/MonitorService.ts +651 -52
- package/Server/Services/MonitorStatusTimelineService.ts +639 -2
- package/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.ts +2 -0
- package/Server/Services/OnCallDutyPolicyEscalationRuleTeamService.ts +2 -0
- package/Server/Services/OnCallDutyPolicyEscalationRuleUserService.ts +2 -0
- package/Server/Services/OnCallDutyPolicyScheduleService.ts +3 -0
- package/Server/Services/OnCallNotificationAlertingService.ts +36 -12
- package/Server/Services/OnCallSetupReminderService.ts +1 -0
- package/Server/Services/ProbeService.ts +7 -1
- package/Server/Services/ProjectService.ts +11 -1
- package/Server/Services/RunbookCredentialService.ts +26 -1
- package/Server/Services/RunbookSecretService.ts +36 -0
- package/Server/Services/RunnerJobService.ts +941 -23
- package/Server/Services/RunnerService.ts +439 -6
- package/Server/Services/ScheduledMaintenancePublicNoteService.ts +66 -0
- package/Server/Services/ScheduledMaintenanceService.ts +124 -19
- package/Server/Services/ScheduledMaintenanceTemplateService.ts +82 -3
- package/Server/Services/ServiceLevelObjectiveService.ts +14 -1
- package/Server/Services/StatusPagePrivateUserService.ts +1 -0
- package/Server/Services/StatusPageService.ts +301 -74
- package/Server/Services/StatusPageSubscriberService.ts +4 -0
- package/Server/Services/TeamMemberService.ts +309 -7
- package/Server/Services/TraceAggregationService.ts +10 -6
- package/Server/Services/UserEmailService.ts +1 -0
- package/Server/Services/UserNotificationMethodAdminService.ts +1 -0
- package/Server/Services/UserNotificationRuleAdminService.ts +1 -0
- package/Server/Services/UserNotificationRuleService.ts +4 -0
- package/Server/Services/UserService.ts +122 -1
- package/Server/Services/WorkflowVariableService.ts +593 -8
- package/Server/Services/WorkspaceNotificationRuleService.ts +588 -8
- package/Server/Services/WorkspaceProjectAuthTokenService.ts +170 -1
- package/Server/Types/Database/QueryHelper.ts +22 -0
- package/Server/Types/Markdown.ts +502 -27
- package/Server/Utils/AI/ClusterAccess/ClusterAccessContext.ts +182 -0
- package/Server/Utils/AI/ClusterAccess/KubectlInvestigationToolkit.ts +525 -0
- package/Server/Utils/AI/ClusterAccess/KubectlJobRunner.ts +854 -0
- package/Server/Utils/AI/CodeFix/CodeFixAgentAuth.ts +22 -2
- package/Server/Utils/AI/Remediation/RemediationCommandTools.ts +1916 -307
- package/Server/Utils/AI/Remediation/RemediationExecutionRunner.ts +1601 -74
- package/Server/Utils/AI/SRE/AIInvestigationEngine.ts +139 -7
- package/Server/Utils/AI/SRE/AlertInvestigationRunner.ts +58 -1
- package/Server/Utils/AI/SRE/IncidentInvestigationRunner.ts +54 -1
- package/Server/Utils/AI/Toolbox/AIActionTools.ts +14 -6
- package/Server/Utils/AI/Toolbox/ResourceTools.ts +4 -2
- package/Server/Utils/AutoRemediation/CommandPlanExecutor.ts +1341 -150
- package/Server/Utils/AutoRemediation/RemediationVerifier.ts +375 -4
- package/Server/Utils/Database/AffectedResourceRelations.ts +127 -0
- package/Server/Utils/Database/ProjectScopedReferenceValidator.ts +240 -1
- package/Server/Utils/EmailRollup/EmailRollupFlushRunner.ts +1 -0
- package/Server/Utils/Monitor/MonitorAlert.ts +83 -9
- package/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.ts +5 -1
- package/Server/Utils/Monitor/MonitorIncident.ts +104 -9
- package/Server/Utils/Monitor/MonitorPayloadRedaction.ts +124 -7
- package/Server/Utils/Monitor/ProbeMonitorsNotification.ts +407 -0
- package/Server/Utils/OnCall/OnCallShiftReminderRunner.ts +1 -0
- package/Server/Utils/PushNotificationUtil.ts +45 -0
- package/Server/Utils/Rules/OwnerRuleAssignment.ts +40 -3
- package/Server/Utils/Runbook/RunbookExecutePermission.ts +56 -6
- package/Server/Utils/SessionReplay/SessionReplayGateCache.ts +24 -2
- package/Server/Utils/SessionReplay/SessionReplayReadService.ts +223 -33
- package/Server/Utils/SessionReplay/SessionReplayUserFlowReadService.ts +559 -0
- package/Server/Utils/StartServer.ts +4 -3
- package/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.ts +528 -0
- package/Server/Utils/TwoFactorBackupCodeNotification.ts +1 -0
- package/Server/Utils/UserPermission/UserPermission.ts +16 -0
- package/Server/Utils/Workflow/OAuth2TokenClient.ts +704 -0
- package/Server/Utils/Workflow/WorkflowVariableOAuthToken.ts +318 -0
- package/Server/Utils/Workspace/MicrosoftTeams/Actions/Alert.ts +47 -7
- package/Server/Utils/Workspace/MicrosoftTeams/Actions/AlertEpisode.ts +57 -16
- package/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.ts +193 -214
- package/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.ts +57 -13
- package/Server/Utils/Workspace/MicrosoftTeams/Actions/Monitor.ts +54 -17
- package/Server/Utils/Workspace/MicrosoftTeams/Actions/ScheduledMaintenance.ts +179 -161
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +281 -167
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsServiceUrl.ts +114 -0
- package/Server/Utils/Workspace/MicrosoftTeams/ReactionNoteSync.ts +895 -0
- package/Server/Utils/Workspace/Slack/Actions/ActionTypes.ts +7 -9
- package/Server/Utils/Workspace/Slack/Actions/Alert.ts +96 -227
- package/Server/Utils/Workspace/Slack/Actions/AlertEpisode.ts +93 -214
- package/Server/Utils/Workspace/Slack/Actions/Auth.ts +30 -3
- package/Server/Utils/Workspace/Slack/Actions/Authorization.ts +99 -0
- package/Server/Utils/Workspace/Slack/Actions/Incident.ts +117 -283
- package/Server/Utils/Workspace/Slack/Actions/IncidentEpisode.ts +101 -196
- package/Server/Utils/Workspace/Slack/Actions/ReactionNote.ts +329 -0
- package/Server/Utils/Workspace/Slack/Actions/ScheduledMaintenance.ts +111 -287
- package/Server/Utils/Workspace/Slack/Slack.ts +86 -17
- package/Server/Utils/Workspace/Slack/app-manifest.json +2 -0
- package/Server/Utils/Workspace/Workspace.ts +171 -54
- package/Server/Utils/Workspace/WorkspaceActionAuthorization.ts +252 -0
- package/Server/Utils/Workspace/WorkspaceBase.ts +39 -0
- package/Server/Utils/Workspace/WorkspaceOAuthState.ts +280 -0
- package/Server/Utils/Workspace/WorkspaceProjectReferenceValidator.ts +96 -0
- package/Server/Utils/Workspace/WorkspaceReactionNote.ts +620 -0
- package/Tests/App/Dashboard/AttributesJSONDashboardSurfaces.test.tsx +496 -0
- package/Tests/App/Dashboard/AutoRemediationRulesTableCommandRunners.test.tsx +152 -0
- package/Tests/App/Dashboard/BreadcrumbCoverage.test.tsx +32 -0
- package/Tests/App/Dashboard/BulkIncidentLinkActions.test.tsx +869 -0
- package/Tests/App/Dashboard/CephMetricTooltips.test.tsx +1777 -0
- package/Tests/App/Dashboard/CloudFleetSummary.test.ts +8 -0
- package/Tests/App/Dashboard/CloudMetricTooltips.test.tsx +887 -0
- package/Tests/App/Dashboard/ClusterAccessNotice.test.tsx +794 -0
- package/Tests/App/Dashboard/ContainerHostMetricTooltips.test.tsx +1309 -0
- package/Tests/App/Dashboard/CreateOAuthWorkflowVariableModal.test.tsx +840 -0
- package/Tests/App/Dashboard/CreateWorkflowModal.test.tsx +653 -0
- package/Tests/App/Dashboard/DatabaseMonitorStepForm.test.tsx +197 -0
- package/Tests/App/Dashboard/DatabaseMonitorView.test.tsx +376 -0
- package/Tests/App/Dashboard/DisabledWarningRobustness.test.tsx +262 -0
- package/Tests/App/Dashboard/DiscoveryScanLivePage.test.tsx +39 -0
- package/Tests/App/Dashboard/DockerSwarmClustersListTooltips.test.tsx +414 -0
- package/Tests/App/Dashboard/DockerSwarmMetricTooltips.test.ts +796 -0
- package/Tests/App/Dashboard/DockerSwarmOverviewTooltips.test.tsx +747 -0
- package/Tests/App/Dashboard/EventNotes.test.tsx +2080 -0
- package/Tests/App/Dashboard/EventNotesPages.test.tsx +486 -0
- package/Tests/App/Dashboard/EventNotesUtil.test.ts +933 -0
- package/Tests/App/Dashboard/ExceptionMonitorEnvironmentFilter.test.tsx +238 -0
- package/Tests/App/Dashboard/HostDetailViewTooltips.test.tsx +725 -0
- package/Tests/App/Dashboard/HostListColumnTooltips.test.tsx +472 -0
- package/Tests/App/Dashboard/HostMetricTooltips.test.ts +709 -0
- package/Tests/App/Dashboard/HostOverviewTooltips.test.tsx +698 -0
- package/Tests/App/Dashboard/HostTooltipHarness.ts +124 -0
- package/Tests/App/Dashboard/HostsListTooltips.test.tsx +395 -0
- package/Tests/App/Dashboard/IncidentAlertLinkDialog.test.tsx +691 -0
- package/Tests/App/Dashboard/IncidentAlertLinkHelpers.test.ts +458 -0
- package/Tests/App/Dashboard/IncidentAlertLinkPages.test.tsx +828 -0
- package/Tests/App/Dashboard/IncidentAlertLinkSideMenus.test.tsx +231 -0
- package/Tests/App/Dashboard/IncidentChangeStateNotifyDefault.test.tsx +665 -0
- package/Tests/App/Dashboard/IncidentCreateFromAlerts.test.tsx +689 -0
- package/Tests/App/Dashboard/IncidentEpisodeFeedPublicNoteNotifyDefault.test.tsx +494 -0
- package/Tests/App/Dashboard/IncidentEpisodeOverviewNotifyDefault.test.tsx +706 -0
- package/Tests/App/Dashboard/IncidentFeedPublicNoteNotifyDefault.test.tsx +472 -0
- package/Tests/App/Dashboard/IncidentOverviewNotifyDefault.test.tsx +858 -0
- package/Tests/App/Dashboard/IncomingEmailAddressSettings.test.tsx +567 -0
- package/Tests/App/Dashboard/InvestigationClusterToolFormat.test.ts +241 -0
- package/Tests/App/Dashboard/InvestigationEvidenceKubectl.test.tsx +322 -0
- package/Tests/App/Dashboard/InvestigationPanel.test.tsx +12 -0
- package/Tests/App/Dashboard/InvestigationPanelClusterAccess.test.tsx +476 -0
- package/Tests/App/Dashboard/InvestigationRunDetailsKubectl.test.tsx +383 -0
- package/Tests/App/Dashboard/IoTMetricTooltips.test.tsx +1123 -0
- package/Tests/App/Dashboard/KubectlActivitySummary.test.tsx +366 -0
- package/Tests/App/Dashboard/KubernetesClusterAiAccessSettings.test.ts +2886 -0
- package/Tests/App/Dashboard/KubernetesClusterAiPage.test.tsx +2688 -0
- package/Tests/App/Dashboard/KubernetesClusterAiPageServerParity.test.ts +915 -0
- package/Tests/App/Dashboard/KubernetesClusterMetricTooltips.test.ts +837 -0
- package/Tests/App/Dashboard/KubernetesClusterOverviewTooltips.test.tsx +699 -0
- package/Tests/App/Dashboard/KubernetesContainersTabTooltips.test.tsx +320 -0
- package/Tests/App/Dashboard/KubernetesCostTooltips.test.tsx +502 -0
- package/Tests/App/Dashboard/KubernetesInsightsTooltips.test.tsx +222 -0
- package/Tests/App/Dashboard/KubernetesResourceMetricTooltips.test.ts +561 -0
- package/Tests/App/Dashboard/KubernetesResourcePagesTooltips.test.tsx +1168 -0
- package/Tests/App/Dashboard/LayerDateTimeFieldTimezoneName.test.tsx +66 -0
- package/Tests/App/Dashboard/LinkIncidentAlertModal.test.tsx +154 -0
- package/Tests/App/Dashboard/LogMonitorPreview.test.tsx +174 -0
- package/Tests/App/Dashboard/MetricDescriptionRules.ts +170 -0
- package/Tests/App/Dashboard/MetricDescriptionsCatalog.test.ts +206 -0
- package/Tests/App/Dashboard/MetricDescriptionsConsistency.test.ts +275 -0
- package/Tests/App/Dashboard/MonitorFeedRefresh.test.tsx +279 -0
- package/Tests/App/Dashboard/MonitorMetricQueryConfig.test.ts +244 -0
- package/Tests/App/Dashboard/MonitorOpenWorkCard.test.tsx +381 -0
- package/Tests/App/Dashboard/MonitorOpenWorkHook.test.tsx +784 -0
- package/Tests/App/Dashboard/MonitorOverviewData.test.tsx +2199 -0
- package/Tests/App/Dashboard/MonitorOverviewHero.test.tsx +1169 -0
- package/Tests/App/Dashboard/MonitorOverviewInput.test.ts +1127 -0
- package/Tests/App/Dashboard/MonitorOverviewPage.test.tsx +2136 -0
- package/Tests/App/Dashboard/MonitorOverviewSelectReadable.test.ts +368 -0
- package/Tests/App/Dashboard/MonitorOverviewStatBar.test.tsx +526 -0
- package/Tests/App/Dashboard/MonitorOverviewSupportingCards.test.tsx +542 -0
- package/Tests/App/Dashboard/MonitorOwnersCombine.test.ts +299 -0
- package/Tests/App/Dashboard/MonitorProbesCard.test.tsx +602 -0
- package/Tests/App/Dashboard/MonitorResponseTimeCard.test.tsx +386 -0
- package/Tests/App/Dashboard/MonitorSetupAndConnectionCards.test.tsx +612 -0
- package/Tests/App/Dashboard/MonitorStatusChangesCard.test.tsx +257 -0
- package/Tests/App/Dashboard/MonitorSummaryTestMonitorButton.test.tsx +360 -1
- package/Tests/App/Dashboard/MonitorUptimeHistoryCard.test.tsx +835 -0
- package/Tests/App/Dashboard/MonitorUptimeSummaryHook.test.tsx +971 -0
- package/Tests/App/Dashboard/MonitorViewLayout.test.tsx +580 -0
- package/Tests/App/Dashboard/NetworkDeviceTooltips.test.tsx +852 -0
- package/Tests/App/Dashboard/NetworkDiagnosticsTooltips.test.tsx +556 -0
- package/Tests/App/Dashboard/NetworkMetricTooltips.test.ts +1348 -0
- package/Tests/App/Dashboard/NetworkSiteTooltips.test.tsx +679 -0
- package/Tests/App/Dashboard/OnCallLayerRestrictionTimesPreserved.test.tsx +441 -0
- package/Tests/App/Dashboard/OnCallNavbar.test.tsx +214 -0
- package/Tests/App/Dashboard/OnCallSchedulePreviewCalendarDisplay.test.tsx +1389 -0
- package/Tests/App/Dashboard/OnCallSchedulePreviewOverrides.test.tsx +205 -1
- package/Tests/App/Dashboard/OnCallScheduleTimeInputsSettingsZone.test.tsx +198 -0
- package/Tests/App/Dashboard/ProxmoxMetricTooltips.test.ts +592 -0
- package/Tests/App/Dashboard/ProxmoxOverviewTooltips.test.tsx +1002 -0
- package/Tests/App/Dashboard/ProxmoxResourcePageTooltips.test.tsx +923 -0
- package/Tests/App/Dashboard/PublicNotePagesNotifyDefault.test.tsx +524 -0
- package/Tests/App/Dashboard/RemediationSuggestionCardApproval.test.tsx +702 -0
- package/Tests/App/Dashboard/RemoveUserFromProject.test.tsx +427 -0
- package/Tests/App/Dashboard/ResourceArchiveSettings.test.tsx +4 -0
- package/Tests/App/Dashboard/ResourceOverviewTileTooltips.test.tsx +1066 -0
- package/Tests/App/Dashboard/RumOverviewPage.test.tsx +1195 -0
- package/Tests/App/Dashboard/RumSessionReplaySideMenu.test.tsx +3 -1
- package/Tests/App/Dashboard/RunbookStepTypeMaps.test.ts +166 -0
- package/Tests/App/Dashboard/RunnerKubernetesAgentForm.test.tsx +622 -0
- package/Tests/App/Dashboard/ScheduledMaintenanceChangeStateNotifyDefault.test.tsx +1491 -0
- package/Tests/App/Dashboard/ScheduledMaintenanceFeedPublicNoteNotifyDefault.test.tsx +489 -0
- package/Tests/App/Dashboard/ScheduledMaintenanceOverviewNotifyDefault.test.tsx +909 -0
- package/Tests/App/Dashboard/ScheduledMaintenanceOverviewPage.test.tsx +14 -0
- package/Tests/App/Dashboard/ScheduledMaintenanceWindowStatsTranslation.test.tsx +307 -0
- package/Tests/App/Dashboard/SecurityEventAttributeColumnPicker.test.tsx +542 -0
- package/Tests/App/Dashboard/SecurityEventConnectionFormModal.test.tsx +174 -0
- package/Tests/App/Dashboard/SecurityEventConnectionsEmptyState.test.tsx +973 -212
- package/Tests/App/Dashboard/SecurityEventConnectionsTable.test.tsx +491 -52
- package/Tests/App/Dashboard/SecurityEventDetailPanel.test.tsx +301 -0
- package/Tests/App/Dashboard/SecurityEventListRow.test.tsx +158 -1
- package/Tests/App/Dashboard/SecurityEventProviderTile.test.tsx +869 -0
- package/Tests/App/Dashboard/SecurityEventsEmptyState.test.tsx +959 -94
- package/Tests/App/Dashboard/SecurityEventsNoResults.test.tsx +2 -0
- package/Tests/App/Dashboard/SecurityEventsViewer.test.tsx +274 -1
- package/Tests/App/Dashboard/ServerlessMetricTooltips.test.tsx +474 -0
- package/Tests/App/Dashboard/ServiceMetricTooltips.test.tsx +772 -0
- package/Tests/App/Dashboard/SessionReplayAuditTable.test.tsx +56 -1
- package/Tests/App/Dashboard/TeamMembershipRemoval.test.ts +900 -0
- package/Tests/App/Dashboard/TeamMembershipRemovalPages.test.tsx +460 -0
- package/Tests/App/Dashboard/TelemetryMetricsSignals.test.ts +1207 -0
- package/Tests/App/Dashboard/TelemetryResourceTabTooltips.test.tsx +437 -0
- package/Tests/App/Dashboard/TimezoneElements.test.tsx +321 -0
- package/Tests/App/Dashboard/TimezoneSelectButton.test.tsx +634 -0
- package/Tests/App/Dashboard/TraceExplorer.test.tsx +260 -0
- package/Tests/App/Dashboard/TraceMonitorPreview.test.tsx +182 -0
- package/Tests/App/Dashboard/UserTimezoneInit.test.tsx +544 -0
- package/Tests/App/Dashboard/VMwareMetricTooltips.test.ts +801 -0
- package/Tests/App/Dashboard/VMwareOverviewTooltips.test.tsx +601 -0
- package/Tests/App/Dashboard/VMwareResourcePagesTooltips.test.tsx +646 -0
- package/Tests/App/Dashboard/VMwareTooltipHarness.ts +145 -0
- package/Tests/App/Dashboard/WorkflowVariableModals.test.tsx +1630 -0
- package/Tests/App/Dashboard/WorkflowVariableRoutes.test.tsx +603 -0
- package/Tests/App/Dashboard/WorkflowVariableTokenStatus.test.tsx +589 -0
- package/Tests/App/Dashboard/WorkflowVariableUtil.test.ts +1543 -0
- package/Tests/App/Dashboard/WorkflowVariableView.test.tsx +3227 -0
- package/Tests/App/Dashboard/WorkflowVariablesTable.test.tsx +1277 -395
- package/Tests/App/StatusPage/StatusPageOverviewMonitorGroupUptime.test.tsx +714 -0
- package/Tests/App/StatusPage/StatusPageOverviewUptimeBars.NewYork.test.tsx +1009 -0
- package/Tests/App/StatusPage/StatusPageOverviewUptimeBars.test.tsx +1092 -0
- package/Tests/Models/DatabaseModels/DomainRoleTierCoverage.test.ts +5 -0
- package/Tests/Models/DatabaseModels/IncidentAlertModel.test.ts +554 -0
- package/Tests/Models/DatabaseModels/KubernetesClusterAiAccessColumns.test.ts +520 -0
- package/Tests/Models/DatabaseModels/MonitorSecretKeyColumnAccessControl.test.ts +66 -2
- package/Tests/Models/DatabaseModels/SessionReplayModels.test.ts +117 -0
- package/Tests/Models/DatabaseModels/WorkspaceProjectAuthTokenAccessControl.test.ts +236 -0
- package/Tests/Models/IncidentEpisodePublicNoteNotifyColumnContract.test.ts +103 -0
- package/Tests/Models/IncidentPublicNoteNotifyColumnContract.test.ts +96 -0
- package/Tests/Models/ScheduledMaintenancePublicNoteNotifyColumnContract.test.ts +111 -0
- package/Tests/Server/API/AIInvestigationAPI.test.ts +976 -0
- package/Tests/Server/API/AutoRemediationApproveKubectlRecheck.test.ts +836 -0
- package/Tests/Server/API/CommonAPIAssertCanCreateTable.test.ts +565 -0
- package/Tests/Server/API/CommonAPIAssertCanReadTable.test.ts +282 -0
- package/Tests/Server/API/KubernetesClusterAiAccessAPI.test.ts +1744 -0
- package/Tests/Server/API/LogHistogramAPI.test.ts +371 -0
- package/Tests/Server/API/MicrosoftTeamsLegacyWebhookRemoval.test.ts +125 -30
- package/Tests/Server/API/MicrosoftTeamsOAuthState.test.ts +1121 -0
- package/Tests/Server/API/MonitorUptimeSummaryAPI.test.ts +685 -0
- package/Tests/Server/API/SessionReplayAPI.test.ts +602 -1
- package/Tests/Server/API/SlackChannelCacheAPI.test.ts +358 -0
- package/Tests/Server/API/SlackOAuthState.test.ts +688 -0
- package/Tests/Server/API/StatusPageOverviewMonitorGroupUptime.test.ts +527 -0
- package/Tests/Server/API/StatusPageTestEmailReportAuth.test.ts +2 -0
- package/Tests/Server/API/StatusPageUptimeAPI.test.ts +427 -0
- package/Tests/Server/API/UserProjectsAPI.test.ts +4 -0
- package/Tests/Server/API/WorkflowVariableAPI.test.ts +404 -0
- package/Tests/Server/API/WorkspaceOAuthTestHelpers.ts +289 -0
- package/Tests/Server/API/WorkspaceSendTestNotificationRoutes.test.ts +2064 -0
- package/Tests/Server/Infrastructure/GlobalCache.test.ts +86 -0
- package/Tests/Server/Infrastructure/Postgres/AddIncidentAlertMigration.test.ts +341 -0
- package/Tests/Server/Infrastructure/Postgres/AddKubernetesClusterAiAccessMigration.test.ts +589 -0
- package/Tests/Server/Infrastructure/Postgres/AddOAuth2WorkflowVariablesMigration.test.ts +254 -0
- package/Tests/Server/Infrastructure/Postgres/AddSessionReplaySameOriginTracePropagationMigration.test.ts +247 -0
- package/Tests/Server/Middleware/BlockedUserMiddleware.test.ts +403 -0
- package/Tests/Server/Middleware/MasterAdminAuthorization.test.ts +13 -0
- package/Tests/Server/Middleware/PublicRouteUserMiddleware.test.ts +2 -0
- package/Tests/Server/Middleware/RemovedProjectMemberAuthorization.test.ts +469 -0
- package/Tests/Server/Middleware/TelemetryIngestBrowserKey.test.ts +77 -1
- package/Tests/Server/Middleware/TelemetryIngestKubernetesAgentRunnerPinnedKey.test.ts +211 -0
- package/Tests/Server/Middleware/TelemetryIngestKubernetesAgentRunnerRateLimit.test.ts +358 -0
- package/Tests/Server/Middleware/UserAuthorization.test.ts +97 -0
- package/Tests/Server/Middleware/UserAuthorizationEditionEnforcement.test.ts +2 -0
- package/Tests/Server/Services/AccessTokenProjectUserGrant.test.ts +14 -2
- package/Tests/Server/Services/AccessTokenRemovedMemberAccess.test.ts +1044 -0
- package/Tests/Server/Services/AddOwnersIdempotency.test.ts +5 -0
- package/Tests/Server/Services/AlertEpisodeMemberCreatePermission.test.ts +139 -0
- package/Tests/Server/Services/AutoRemediationClusterRuleEngine.test.ts +1361 -0
- package/Tests/Server/Services/AutoRemediationRuleCommandRunners.test.ts +375 -0
- package/Tests/Server/Services/CrossProjectRelationWriteGuard.test.ts +2384 -0
- package/Tests/Server/Services/FindOwnersProjectMembership.test.ts +267 -0
- package/Tests/Server/Services/InboundEmail/SendGridInboundProviderAddress.test.ts +90 -0
- package/Tests/Server/Services/IncidentAlertPostgres.test.ts +903 -0
- package/Tests/Server/Services/IncidentAlertRegistration.test.ts +96 -0
- package/Tests/Server/Services/IncidentAlertService.test.ts +2225 -0
- package/Tests/Server/Services/IncidentAlertStateCascade.test.ts +970 -0
- package/Tests/Server/Services/IncidentCreateFromAlerts.test.ts +1284 -0
- package/Tests/Server/Services/IncidentEpisodeMemberCreatePermission.test.ts +143 -0
- package/Tests/Server/Services/IncidentEpisodePublicNoteNotifyDefault.test.ts +805 -0
- package/Tests/Server/Services/IncidentPublicNoteNotifyDefault.test.ts +724 -0
- package/Tests/Server/Services/IncidentRoleProjectMembership.test.ts +233 -0
- package/Tests/Server/Services/KubernetesClusterAiAccessAgentRunnerAssignments.test.ts +372 -0
- package/Tests/Server/Services/KubernetesClusterAiAccessBindingGuard.test.ts +1876 -0
- package/Tests/Server/Services/KubernetesClusterAiAccessDeletedRunnerRemedy.test.ts +620 -0
- package/Tests/Server/Services/KubernetesClusterAiAccessGapNextSteps.test.ts +421 -0
- package/Tests/Server/Services/KubernetesClusterAiAccessService.test.ts +3662 -0
- package/Tests/Server/Services/KubernetesClusterAiAccessSubjectClusters.test.ts +405 -0
- package/Tests/Server/Services/KubernetesClusterAiSettingsPermission.test.ts +975 -0
- package/Tests/Server/Services/KubernetesClusterServiceAiAccessFeed.test.ts +497 -0
- package/Tests/Server/Services/KubernetesClusterServiceDeleteSettlesRemediation.test.ts +328 -0
- package/Tests/Server/Services/LogAggregationService.test.ts +99 -0
- package/Tests/Server/Services/MonitorServiceIncomingEmailCustomAddress.test.ts +447 -0
- package/Tests/Server/Services/MonitorServiceProbeFlagSync.test.ts +1334 -0
- package/Tests/Server/Services/MonitorServiceProbeStatusGrouping.test.ts +1640 -0
- package/Tests/Server/Services/MonitorServiceRefreshCurrentStatus.test.ts +225 -0
- package/Tests/Server/Services/MonitorStatusBridgeProbePath.test.ts +8 -8
- package/Tests/Server/Services/MonitorStatusTimelineDailyAggregates.test.ts +264 -1
- package/Tests/Server/Services/MonitorStatusTimelineMergedDowntime.test.ts +284 -0
- package/Tests/Server/Services/MonitorUptimeSummaryService.test.ts +1043 -0
- package/Tests/Server/Services/NetworkDeviceRuleEngines.test.ts +5 -0
- package/Tests/Server/Services/OnCallUndeliverablePageOwnerMembership.test.ts +359 -0
- package/Tests/Server/Services/ProbeServiceDashboardLink.test.ts +191 -0
- package/Tests/Server/Services/ProjectOwnersProjectMembership.test.ts +221 -0
- package/Tests/Server/Services/RuleRun/IncidentAlertMaintenanceRuleEnginesRun.test.ts +5 -0
- package/Tests/Server/Services/RuleRun/OwnerRuleEnginesGroupARun.test.ts +28 -0
- package/Tests/Server/Services/RuleRun/OwnerRuleEnginesGroupBRun.test.ts +9 -1
- package/Tests/Server/Services/RunnerJobEnqueueAiCommandAgentRunner.test.ts +230 -0
- package/Tests/Server/Services/RunnerJobEnqueueKubectl.test.ts +978 -0
- package/Tests/Server/Services/RunnerJobKubectlWriteScope.test.ts +866 -0
- package/Tests/Server/Services/RunnerJobSubmitResultRedaction.test.ts +322 -0
- package/Tests/Server/Services/RunnerJobSubmitResultUnstorableText.test.ts +357 -0
- package/Tests/Server/Services/RunnerJobTimeoutReason.test.ts +227 -0
- package/Tests/Server/Services/RunnerServiceAgentName.test.ts +581 -0
- package/Tests/Server/Services/ScheduledMaintenancePublicNoteNotifyDefault.test.ts +802 -0
- package/Tests/Server/Services/ScheduledMaintenanceSubscriberTemplateFormats.test.ts +53 -0
- package/Tests/Server/Services/ServiceLevelObjectiveLabelAndOwnerRuleEngines.test.ts +5 -0
- package/Tests/Server/Services/ServiceLevelObjectiveService.test.ts +12 -0
- package/Tests/Server/Services/StatusPageSubscriberReport.test.ts +1176 -1
- package/Tests/Server/Services/TeamMemberBillingSeatSync.test.ts +9 -0
- package/Tests/Server/Services/TeamMemberOnCallCleanup.test.ts +18 -0
- package/Tests/Server/Services/TeamMemberProjectMembership.test.ts +255 -0
- package/Tests/Server/Services/TeamMemberRemovalRevokesProjectAccess.test.ts +600 -0
- package/Tests/Server/Services/TeamMemberResourceCleanup.test.ts +731 -0
- package/Tests/Server/Services/TeamMemberWorkspaceAccountCleanup.test.ts +164 -0
- package/Tests/Server/Services/TraceAggregationService.test.ts +64 -0
- package/Tests/Server/Services/UserServiceBlockedUser.test.ts +293 -0
- package/Tests/Server/Services/WorkflowVariableOAuthHooks.test.ts +1016 -0
- package/Tests/Server/Services/WorkflowVariableOAuthPostgres.test.ts +543 -0
- package/Tests/Server/Services/WorkflowVariableRenameUniqueness.test.ts +16 -5
- package/Tests/Server/Services/WorkspaceNotificationRuleNoteDelivery.test.ts +473 -0
- package/Tests/Server/Services/WorkspaceNotificationRuleSendTestNotification.test.ts +3690 -0
- package/Tests/Server/Services/WorkspaceProjectAuthTokenMiscDataSecrets.test.ts +374 -0
- package/Tests/Server/Services/WorkspaceProjectAuthTokenSlackChannelCache.test.ts +143 -0
- package/Tests/Server/Types/Database/Permissions/WorkflowVariableOAuthColumnPermission.test.ts +250 -0
- package/Tests/Server/Types/Database/QueryHelperJsonContains.test.ts +96 -0
- package/Tests/Server/Types/Markdown.test.ts +1033 -0
- package/Tests/Server/Utils/AI/ClusterAccessContext.test.ts +285 -0
- package/Tests/Server/Utils/AI/CodeFix/CodeFixAgentAuth.test.ts +159 -1
- package/Tests/Server/Utils/AI/InvestigationClusterAccessWiring.test.ts +752 -0
- package/Tests/Server/Utils/AI/KubectlInvestigationToolkit.test.ts +1840 -0
- package/Tests/Server/Utils/AI/KubectlJobRunner.test.ts +1067 -0
- package/Tests/Server/Utils/AI/KubectlJobRunnerFinishedJob.test.ts +355 -0
- package/Tests/Server/Utils/AI/PostIncidentStatusUpdateTool.test.ts +496 -0
- package/Tests/Server/Utils/AI/RemediationCommandTools.test.ts +305 -0
- package/Tests/Server/Utils/AI/RemediationCommandToolsKubectl.test.ts +1365 -0
- package/Tests/Server/Utils/AI/RemediationCommandToolsKubectlOutcome.test.ts +639 -0
- package/Tests/Server/Utils/AI/RemediationCommandToolsLiveCluster.test.ts +1585 -0
- package/Tests/Server/Utils/AI/RemediationCommandToolsRunnerScope.test.ts +1065 -0
- package/Tests/Server/Utils/AI/RemediationExecutionRunner.test.ts +2138 -1
- package/Tests/Server/Utils/AI/RemediationExecutionRunnerClusterMode.test.ts +1035 -0
- package/Tests/Server/Utils/AI/RemediationKubectlCopyParity.test.ts +517 -0
- package/Tests/Server/Utils/AI/ResourceTools.test.ts +27 -1
- package/Tests/Server/Utils/AutoRemediation/CommandPlanExecutor.test.ts +1371 -24
- package/Tests/Server/Utils/AutoRemediation/CommandPlanExecutorRollbackRace.test.ts +962 -0
- package/Tests/Server/Utils/AutoRemediation/CommandPlanExecutorUnknownRun.test.ts +518 -0
- package/Tests/Server/Utils/AutoRemediation/CommandPlanVerification.test.ts +939 -2
- package/Tests/Server/Utils/Database/ProjectScopedRelationReferences.test.ts +371 -0
- package/Tests/Server/Utils/Monitor/AffectedResourceList.test.ts +64 -0
- package/Tests/Server/Utils/Monitor/DatabaseMetricObservationRemediation.test.ts +102 -0
- package/Tests/Server/Utils/Monitor/MonitorAlertCriteriaReferences.test.ts +362 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorBreachingSamples.test.ts +55 -0
- package/Tests/Server/Utils/Monitor/MonitorEmailAddressRedaction.test.ts +255 -0
- package/Tests/Server/Utils/Monitor/MonitorIncidentCriteriaReferences.test.ts +347 -0
- package/Tests/Server/Utils/Monitor/MonitorIncidentMemberRoleMembership.test.ts +203 -0
- package/Tests/Server/Utils/Monitor/ProbeMonitorsNotification.test.ts +1147 -0
- package/Tests/Server/Utils/PushNotificationUtilCreators.test.ts +79 -0
- package/Tests/Server/Utils/ResourceFeed/ResourceFeedUtil.test.ts +21 -1
- package/Tests/Server/Utils/Rules/OwnerRuleAssignment.test.ts +155 -1
- package/Tests/Server/Utils/SessionReplay/SessionReplayGateCachePolicy.test.ts +103 -0
- package/Tests/Server/Utils/SessionReplay/SessionReplayReadServiceQueries.test.ts +288 -0
- package/Tests/Server/Utils/SessionReplay/SessionReplayUserFlowReadService.test.ts +304 -0
- package/Tests/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.test.ts +40 -3
- package/Tests/Server/Utils/Workflow/OAuth2TokenClient.test.ts +702 -0
- package/Tests/Server/Utils/Workflow/OAuth2TokenClientHttpIntegration.test.ts +507 -0
- package/Tests/Server/Utils/Workflow/WorkflowVariableOAuthToken.test.ts +831 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsActionAuthorization.test.ts +63 -1
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsAppAccessToken.test.ts +256 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsChannelSend.test.ts +60 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsChatActionAuthorization.test.ts +442 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsChats.test.ts +44 -2
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsDirectMessage.test.ts +55 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsReactionNoteSync.test.ts +1522 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsServiceUrl.test.ts +130 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsTeamInstalls.test.ts +4 -4
- package/Tests/Server/Utils/Workspace/Slack/SlackActionAuthorization.test.ts +691 -0
- package/Tests/Server/Utils/Workspace/Slack/SlackMessageByTimestamp.test.ts +253 -0
- package/Tests/Server/Utils/Workspace/Slack/SlackReactionNote.test.ts +574 -0
- package/Tests/Server/Utils/Workspace/WorkspaceActionAuthorization.test.ts +488 -0
- package/Tests/Server/Utils/Workspace/WorkspaceCreateProjectReferences.test.ts +861 -0
- package/Tests/Server/Utils/Workspace/WorkspaceMessageAuthor.test.ts +635 -0
- package/Tests/Server/Utils/Workspace/WorkspaceOAuthState.test.ts +548 -0
- package/Tests/Server/Utils/Workspace/WorkspaceReactionNote.test.ts +839 -0
- package/Tests/Server/Utils/Workspace/WorkspaceSendErrorMessage.test.ts +725 -0
- package/Tests/Types/AutoRemediation/AiRemediationCommandPlan.test.ts +283 -9
- package/Tests/Types/DateBrowserLocalWallClock.test.ts +280 -0
- package/Tests/Types/DateLocalShortMonthNameFallback.test.ts +389 -0
- package/Tests/Types/DateUserTimezone.test.ts +177 -4
- package/Tests/Types/Kubernetes/KubernetesAgentChartAiAccess.test.ts +306 -0
- package/Tests/Types/Kubernetes/KubernetesClusterAiAccess.test.ts +283 -0
- package/Tests/Types/Kubernetes/KubernetesRunnerPostureWriteScope.test.ts +68 -0
- package/Tests/Types/Monitor/DatabaseMonitor/SqlServerPlatform.test.ts +144 -0
- package/Tests/Types/Monitor/MonitorStepExceptionMonitor.test.ts +160 -0
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCoverage.test.ts +53 -0
- package/Tests/Types/Rum/WebVitals.test.ts +173 -0
- package/Tests/Types/Runbook/RunbookStepType.test.ts +91 -16
- package/Tests/Types/Runner/RunnerLiveStatus.test.ts +14 -3
- package/Tests/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.test.ts +15 -0
- package/Tests/Types/StatusPage/PublicNoteSubscriberNotificationDefault.test.ts +1868 -0
- package/Tests/Types/Timezone.test.ts +5 -0
- package/Tests/Types/TimezoneAlias.test.ts +1034 -0
- package/Tests/Types/Workflow/JiraTemplateFixtures.ts +833 -0
- package/Tests/Types/Workflow/JiraTemplateScripts.test.ts +5414 -0
- package/Tests/Types/Workflow/JiraTemplateSimulation.test.ts +4803 -0
- package/Tests/Types/Workflow/JiraTemplates.test.ts +5429 -0
- package/Tests/Types/Workflow/Templates.test.ts +79 -4
- package/Tests/Types/Workflow/WorkflowVariableOAuth.test.ts +520 -0
- package/Tests/Types/Workspace/WorkspaceNoteReaction.test.ts +177 -0
- package/Tests/UI/Components/AttributesJSON/AttributesJSONView.test.tsx +390 -0
- package/Tests/UI/Components/AttributesJSON/CopyAttributesAsJSONButton.test.tsx +566 -0
- package/Tests/UI/Components/AttributesJSON/JSONHighlight.test.ts +131 -0
- package/Tests/UI/Components/BasicFormDropdownNormalization.test.tsx +276 -1
- package/Tests/UI/Components/Calendar/Calendar.test.tsx +1611 -0
- package/Tests/UI/Components/Calendar/CalendarDayLayout.test.ts +1486 -0
- package/Tests/UI/Components/Calendar/CalendarDayLayoutDst.test.ts +632 -0
- package/Tests/UI/Components/Calendar/CalendarDst.test.tsx +388 -0
- package/Tests/UI/Components/Charts/ChartGroupPlotFloor.test.tsx +170 -0
- package/Tests/UI/Components/Charts/HistogramSelection.test.ts +282 -0
- package/Tests/UI/Components/CustomTimeRangeModal.test.tsx +6 -0
- package/Tests/UI/Components/CustomTimeRangeModalTimezoneTranslation.test.tsx +285 -0
- package/Tests/UI/Components/Dropdown.test.tsx +999 -2
- package/Tests/UI/Components/FieldLabelInfoCardTooltip.test.tsx +413 -0
- package/Tests/UI/Components/Forms/FormFieldCheckboxTranslation.test.tsx +216 -0
- package/Tests/UI/Components/Forms/FormFieldTimezoneDescriptionTranslation.test.tsx +461 -0
- package/Tests/UI/Components/Forms/IncidentEpisodePublicNoteNotifyPayload.test.tsx +641 -0
- package/Tests/UI/Components/Forms/IncidentPublicNoteNotifyPayload.test.tsx +346 -0
- package/Tests/UI/Components/Forms/ScheduledMaintenancePublicNoteNotifyPayload.test.tsx +493 -0
- package/Tests/UI/Components/Graphs/DayUptimeGraph.test.tsx +911 -2
- package/Tests/UI/Components/Graphs/DayUptimeGraphTimezone.NewYork.test.tsx +730 -0
- package/Tests/UI/Components/Graphs/DayUptimeGraphTimezone.Tokyo.test.tsx +506 -0
- package/Tests/UI/Components/HistogramClickToZoom.test.tsx +619 -0
- package/Tests/UI/Components/InfoTooltip.test.tsx +242 -0
- package/Tests/UI/Components/LogDetailsPanelAttributesJSON.test.tsx +248 -0
- package/Tests/UI/Components/LogsViewerHistogramZoom.test.tsx +47 -1
- package/Tests/UI/Components/LogsViewerSmallScreens.test.tsx +620 -0
- package/Tests/UI/Components/ModelPageModelChange.test.tsx +242 -3
- package/Tests/UI/Components/ModelTable/BaseModelTableBulkDelete.test.tsx +207 -3
- package/Tests/UI/Components/ModelTable/BaseModelTableBulkDeleteVerb.test.tsx +367 -0
- package/Tests/UI/Components/ModelTable/BaseModelTableCreateButtonTitle.test.tsx +275 -0
- package/Tests/UI/Components/ModelTable/BaseModelTableDeleteConfirmation.test.tsx +521 -0
- package/Tests/UI/Components/MonitorGraphs/Uptime.test.tsx +406 -2
- package/Tests/UI/Components/MonitorGraphs/UptimeBarDayModal.test.tsx +169 -2
- package/Tests/UI/Components/TableHeaderTooltip.test.tsx +662 -0
- package/Tests/UI/Components/TelemetryViewer/TelemetryViewerHistogramClickZoom.test.tsx +266 -0
- package/Tests/UI/Components/TelemetryViewer/TelemetryViewerSmallScreens.test.tsx +439 -0
- package/Tests/UI/Components/TimezoneDropdownLegacyValues.test.tsx +704 -0
- package/Tests/UI/Components/UseHistogramZoom.test.tsx +89 -1
- package/Tests/UI/Components/UseLogsHistogram.test.tsx +175 -0
- package/Tests/UI/Monitor/MonitorSummarySnapshotRender.test.tsx +5 -5
- package/Tests/UI/Rum/PrivacySummaryCard.test.tsx +166 -9
- package/Tests/UI/Rum/RecordingHealthTooltips.test.tsx +447 -0
- package/Tests/UI/Rum/ReplayCorrelationPanel.test.tsx +164 -0
- package/Tests/UI/Rum/ReplayFrameCapture.test.ts +6750 -0
- package/Tests/UI/Rum/ReplayRail.test.tsx +723 -12
- package/Tests/UI/Rum/ReplayRailDetail.test.tsx +86 -0
- package/Tests/UI/Rum/ReplayScreenshot.test.ts +2124 -0
- package/Tests/UI/Rum/ReplayScreenshotActions.test.tsx +3288 -0
- package/Tests/UI/Rum/ReplayStage.test.tsx +62 -0
- package/Tests/UI/Rum/ReplayStageOverlays.test.tsx +983 -2
- package/Tests/UI/Rum/SessionReplaySettingsPolicyLoading.test.tsx +149 -0
- package/Tests/UI/Rum/SessionReplaySetupGuide.test.tsx +107 -6
- package/Tests/UI/Rum/SessionReplayUsersTableTooltips.test.tsx +330 -0
- package/Tests/UI/Rum/UserFlowTooltips.test.tsx +886 -0
- package/Tests/UI/Telemetry/TelemetryDetailPanel.test.tsx +28 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +10 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +2 -0
- package/Tests/UI/Utils/PermissionGate.test.ts +76 -0
- package/Tests/UI/Utils/ProjectUsersModelAPI.test.ts +51 -0
- package/Tests/UI/Utils/Timezone.test.ts +747 -33
- package/Tests/UI/Workspace/SendTestNotificationButton.test.tsx +1854 -0
- package/Tests/UI/Workspace/WorkspaceCardsSendTestNotification.test.tsx +1864 -0
- package/Tests/Utils/AI/InvestigationReport.test.ts +435 -7
- package/Tests/Utils/AiRemediation/KubectlAllowlistValidatorParity.test.ts +1084 -0
- package/Tests/Utils/AiRemediation/KubectlOutputRedactor.test.ts +2531 -0
- package/Tests/Utils/AiRemediation/KubectlPolicy.test.ts +1895 -0
- package/Tests/Utils/AiRemediation/KubectlPolicyAllowlist.test.ts +428 -0
- package/Tests/Utils/AiRemediation/KubectlPolicyChartRbacParity.test.ts +828 -0
- package/Tests/Utils/AiRemediation/KubectlPolicyCustomResourceScope.test.ts +573 -0
- package/Tests/Utils/AiRemediation/KubectlPolicyDenials.test.ts +1525 -0
- package/Tests/Utils/AiRemediation/KubectlPolicyExposeOverrides.test.ts +275 -0
- package/Tests/Utils/AiRemediation/KubectlPolicyNodePatch.test.ts +428 -0
- package/Tests/Utils/AiRemediation/KubectlPolicyObjectWords.test.ts +195 -0
- package/Tests/Utils/AiRemediation/KubectlPolicyPatchParents.test.ts +637 -0
- package/Tests/Utils/AiRemediation/KubectlPolicyPodSecurityBaseline.test.ts +322 -0
- package/Tests/Utils/AiRemediation/KubectlPolicySafeWriteScope.test.ts +1026 -0
- package/Tests/Utils/AiRemediation/KubectlWaitBudget.test.ts +267 -0
- package/Tests/Utils/AiRemediation/KubectlWriteScope.test.ts +390 -0
- package/Tests/Utils/AiRemediation/KubectlWriteScopeCallerParity.test.ts +777 -0
- package/Tests/Utils/AiRemediation/KubectlWriteScopeClusterScoped.test.ts +613 -0
- package/Tests/Utils/AiRemediation/KubectlWriteScopeEntryPoint.test.ts +576 -0
- package/Tests/Utils/AiRemediation/KubectlWriteScopeKubectlSpellings.test.ts +752 -0
- package/Tests/Utils/AiRemediation/KubectlWriteScopeObjectWords.test.ts +358 -0
- package/Tests/Utils/AiRemediation/KubectlWriteScopeOverrides.test.ts +293 -0
- package/Tests/Utils/AiRemediation/KubectlWriteScopeParityCases.ts +598 -0
- package/Tests/Utils/AiRemediation/KubectlWriteScopePolicyParity.test.ts +403 -0
- package/Tests/Utils/Dashboard/DashboardClockComponent.test.ts +154 -5
- package/Tests/Utils/Incident/IncidentFromAlerts.test.ts +696 -0
- package/Tests/Utils/Monitor/IncomingEmailMonitorAddress.test.ts +478 -0
- package/Tests/Utils/Monitor/MonitorCheckScheduleUtil.test.ts +646 -0
- package/Tests/Utils/Monitor/MonitorOverviewCriteriaUtil.test.ts +292 -0
- package/Tests/Utils/Monitor/MonitorOverviewFamily.test.ts +274 -0
- package/Tests/Utils/Monitor/MonitorOverviewPresentationUtil.test.ts +3100 -0
- package/Tests/Utils/Monitor/MonitorOverviewProbeUtil.test.ts +1412 -0
- package/Tests/Utils/Monitor/MonitorOverviewTargetUtil.test.ts +374 -0
- package/Tests/Utils/Monitor/MonitorStatusHistoryUtil.test.ts +332 -0
- package/Tests/Utils/Monitor/MonitorUptimeSummaryUtil.test.ts +946 -0
- package/Tests/Utils/Rum/SessionIdentity.test.ts +94 -0
- package/Tests/Utils/Rum/SessionReplayWafCompatibility.test.ts +840 -0
- package/Tests/Utils/Rum/SessionReplayWireEncoding.test.ts +208 -0
- package/Tests/Utils/Rum/SessionTraceState.test.ts +239 -0
- package/Tests/Utils/Rum/UserFlow.test.ts +1010 -0
- package/Tests/Utils/StatusPage/MonitorGroupMergedDowntimeUtil.test.ts +217 -0
- package/Tests/Utils/StatusPage/ResourceUptime.test.ts +1272 -1
- package/Tests/Utils/StatusPage/UptimeDailyAggregateTotals.test.ts +298 -0
- package/Tests/Utils/StatusPage/UptimeDailyAggregateUtil.test.ts +649 -1
- package/Tests/Utils/StatusPage/UptimeDailyAggregateWindow.test.ts +314 -0
- package/Tests/Utils/Telemetry/AttributesJSON.test.ts +454 -0
- package/Tests/Utils/Uptime/DayUptimeGraphUtil.test.ts +418 -2
- package/Tests/Utils/Uptime/DayUptimeGraphUtilMidnightDst.test.ts +160 -0
- package/Tests/Utils/Uptime/DayUptimeGraphUtilTimezone.Auckland.test.ts +45 -0
- package/Tests/Utils/Uptime/DayUptimeGraphUtilTimezone.Kolkata.test.ts +40 -0
- package/Tests/Utils/Uptime/DayUptimeGraphUtilTimezone.London.test.ts +147 -0
- package/Tests/Utils/Uptime/DayUptimeGraphUtilTimezone.NewYork.test.ts +48 -0
- package/Tests/Utils/Uptime/DayUptimeGraphUtilTimezone.Tokyo.test.ts +39 -0
- package/Tests/Utils/Uptime/DayUptimeGraphUtilTimezoneCases.ts +1015 -0
- package/Tests/Utils/Uptime/UptimeUtil.test.ts +75 -0
- package/Tests/Utils/Uptime/UptimeUtilChronologicalOrder.test.ts +1279 -0
- package/Types/AutoRemediation/AiRemediationCommandPlan.ts +203 -5
- package/Types/Date.ts +121 -7
- package/Types/Email/EmailMessage.ts +8 -0
- package/Types/Email/EmailTemplateType.ts +1 -0
- package/Types/Exception/ExceptionMessages.ts +1 -0
- package/Types/Incident/IncidentAlertLink.ts +38 -0
- package/Types/Kubernetes/KubernetesClusterAiAccess.ts +488 -0
- package/Types/Kubernetes/KubernetesClusterAiAccessPermissions.ts +54 -0
- package/Types/Kubernetes/KubernetesClusterAiAccessToolNames.ts +17 -0
- package/Types/Monitor/DatabaseMonitor/DatabaseMonitorResponse.ts +9 -0
- package/Types/Monitor/DatabaseMonitor/SqlServerPlatform.ts +117 -0
- package/Types/Monitor/KubernetesAlertTemplates.ts +6 -5
- package/Types/Monitor/MonitorStepExceptionMonitor.ts +56 -0
- package/Types/Monitor/MonitorUptimeSummary.ts +113 -0
- package/Types/Monitor/Recommendation/MonitorRecommendationUtil.ts +11 -0
- package/Types/Permission.ts +48 -0
- package/Types/Rum/SessionReplay.ts +80 -8
- package/Types/Rum/SessionReplayApi.ts +44 -1
- package/Types/Rum/UserFlow.ts +187 -0
- package/Types/Rum/WebVitals.ts +52 -0
- package/Types/Runbook/RunbookStepType.ts +10 -0
- package/Types/Runbook/RunnerJobOrigin.ts +15 -0
- package/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.ts +6 -2
- package/Types/StatusPage/MergedDowntimeTotals.ts +17 -0
- package/Types/StatusPage/PublicNoteSubscriberNotificationDefault.ts +148 -0
- package/Types/StatusPage/UptimeDailyAggregate.ts +15 -0
- package/Types/Telemetry/TelemetryIngestSurface.ts +9 -0
- package/Types/Timezone.ts +5 -0
- package/Types/TimezoneAlias.ts +385 -0
- package/Types/Workflow/Templates.ts +3041 -2
- package/Types/Workflow/WorkflowVariableOAuth.ts +476 -0
- package/Types/Workspace/WorkspaceNoteReaction.ts +132 -0
- package/Typings/Index.d.ts +24 -0
- package/UI/Components/AttributesJSON/AttributesJSONPreferences.ts +175 -0
- package/UI/Components/AttributesJSON/AttributesJSONView.tsx +138 -0
- package/UI/Components/AttributesJSON/AttributesViewToggle.tsx +79 -0
- package/UI/Components/AttributesJSON/BracesGlyph.tsx +30 -0
- package/UI/Components/AttributesJSON/CopyAttributesAsJSONButton.tsx +491 -0
- package/UI/Components/AttributesJSON/JSONHighlight.ts +77 -0
- package/UI/Components/Calendar/Calendar.css +83 -0
- package/UI/Components/Calendar/Calendar.tsx +136 -7
- package/UI/Components/Calendar/CalendarDayLayout.ts +236 -0
- package/UI/Components/Charts/ChartGroup/ChartGroup.tsx +23 -1
- package/UI/Components/Charts/Utils/HistogramSelection.ts +117 -0
- package/UI/Components/Charts/Utils/useHistogramRangeSelection.ts +269 -0
- package/UI/Components/Charts/Utils/useHistogramZoom.ts +26 -2
- package/UI/Components/Date/CustomTimeRangeModal.tsx +26 -3
- package/UI/Components/Detail/FieldLabel.tsx +8 -0
- package/UI/Components/Dropdown/Dropdown.tsx +58 -9
- package/UI/Components/Forms/Fields/FormField.tsx +49 -14
- package/UI/Components/Graphs/DayUptimeGraph.tsx +166 -25
- package/UI/Components/Graphs/UptimeBarTooltip.tsx +10 -2
- package/UI/Components/Graphs/UptimeDaySummary.tsx +8 -0
- package/UI/Components/InfoCard/InfoCard.tsx +47 -1
- package/UI/Components/LogsViewer/LogsViewer.tsx +52 -5
- package/UI/Components/LogsViewer/components/ColumnSelector.tsx +13 -2
- package/UI/Components/LogsViewer/components/KeyboardShortcutsHelp.tsx +13 -1
- package/UI/Components/LogsViewer/components/LogDetailsPanel.tsx +91 -76
- package/UI/Components/LogsViewer/components/LogsFacetSidebar.tsx +15 -1
- package/UI/Components/LogsViewer/components/LogsHistogram.tsx +28 -106
- package/UI/Components/LogsViewer/components/LogsViewerToolbar.tsx +54 -6
- package/UI/Components/LogsViewer/components/SavedViewsDropdown.tsx +8 -2
- package/UI/Components/LogsViewer/useLogsHistogram.ts +39 -6
- package/UI/Components/ModelTable/BaseModelTable.tsx +161 -31
- package/UI/Components/ModelTable/Column.ts +5 -0
- package/UI/Components/MonitorGraphs/Uptime.tsx +12 -0
- package/UI/Components/MonitorGraphs/UptimeBarDayModal.tsx +10 -2
- package/UI/Components/Page/ModelPage.tsx +59 -3
- package/UI/Components/Table/TableHeader.tsx +47 -2
- package/UI/Components/Table/Types/Column.ts +7 -0
- package/UI/Components/TelemetryViewer/TelemetryViewer.tsx +69 -5
- package/UI/Components/TelemetryViewer/components/TelemetryDetailPanel.tsx +12 -1
- package/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.tsx +15 -1
- package/UI/Components/TelemetryViewer/components/TelemetryHistogram.tsx +36 -104
- package/UI/Components/TelemetryViewer/components/TelemetrySearchBar.tsx +9 -1
- package/UI/Components/Tooltip/InfoTooltip.tsx +78 -0
- package/UI/Utils/ModelAPI/ProjectUsersModelAPI.ts +19 -1
- package/UI/Utils/PermissionGate.ts +11 -2
- package/UI/Utils/Timezone.ts +69 -28
- package/Utils/AI/InvestigationReport.ts +195 -25
- package/Utils/AiRemediation/KubectlOutputRedactor.ts +1724 -0
- package/Utils/AiRemediation/KubectlPolicy.ts +4136 -0
- package/Utils/AiRemediation/KubectlWaitBudget.ts +156 -0
- package/Utils/AiRemediation/KubectlWriteScope.ts +1964 -0
- package/Utils/Dashboard/Components/DashboardClockComponent.ts +7 -6
- package/Utils/Incident/IncidentFromAlerts.ts +516 -0
- package/Utils/Monitor/IncomingEmailMonitorAddress.ts +292 -0
- package/Utils/Monitor/MonitorCheckScheduleUtil.ts +654 -0
- package/Utils/Monitor/MonitorOverviewCriteriaUtil.ts +188 -0
- package/Utils/Monitor/MonitorOverviewFamily.ts +263 -0
- package/Utils/Monitor/MonitorOverviewPresentationUtil.ts +1958 -0
- package/Utils/Monitor/MonitorOverviewProbeUtil.ts +979 -0
- package/Utils/Monitor/MonitorOverviewTargetUtil.ts +299 -0
- package/Utils/Monitor/MonitorStatusHistoryUtil.ts +201 -0
- package/Utils/Monitor/MonitorUptimeSummaryUtil.ts +638 -0
- package/Utils/Rum/SessionIdentity.ts +44 -0
- package/Utils/Rum/SessionReplayWireEncoding.ts +137 -0
- package/Utils/Rum/SessionTraceState.ts +212 -0
- package/Utils/Rum/UserFlow.ts +1527 -0
- package/Utils/StatusPage/MonitorGroupMergedDowntimeUtil.ts +107 -0
- package/Utils/StatusPage/ResourceUptime.ts +99 -0
- package/Utils/StatusPage/UptimeDailyAggregateUtil.ts +197 -0
- package/Utils/Telemetry/AttributesJSON.ts +367 -0
- package/Utils/Uptime/DayUptimeGraphUtil.ts +165 -0
- package/Utils/Uptime/UptimeUtil.ts +122 -38
- package/build/dist/Models/DatabaseModels/AlertEpisodeMember.js +8 -1
- package/build/dist/Models/DatabaseModels/AlertEpisodeMember.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertFeed.js +2 -0
- package/build/dist/Models/DatabaseModels/AlertFeed.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AutoRemediationSuggestion.js +62 -0
- package/build/dist/Models/DatabaseModels/AutoRemediationSuggestion.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentAlert.js +553 -0
- package/build/dist/Models/DatabaseModels/IncidentAlert.js.map +1 -0
- package/build/dist/Models/DatabaseModels/IncidentEpisodeMember.js +8 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisodeMember.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisodePublicNote.js +10 -3
- package/build/dist/Models/DatabaseModels/IncidentEpisodePublicNote.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentFeed.js +2 -0
- package/build/dist/Models/DatabaseModels/IncidentFeed.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentPublicNote.js +10 -3
- package/build/dist/Models/DatabaseModels/IncidentPublicNote.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +2 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/KubernetesCluster.js +434 -0
- package/build/dist/Models/DatabaseModels/KubernetesCluster.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Monitor.js +49 -0
- package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Project.js +62 -0
- package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
- package/build/dist/Models/DatabaseModels/RumApplication.js +53 -1
- package/build/dist/Models/DatabaseModels/RumApplication.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Runner.js +4 -4
- package/build/dist/Models/DatabaseModels/Runner.js.map +1 -1
- package/build/dist/Models/DatabaseModels/RunnerJob.js +66 -0
- package/build/dist/Models/DatabaseModels/RunnerJob.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenancePublicNote.js +11 -3
- package/build/dist/Models/DatabaseModels/ScheduledMaintenancePublicNote.js.map +1 -1
- package/build/dist/Models/DatabaseModels/WorkflowVariable.js +487 -3
- package/build/dist/Models/DatabaseModels/WorkflowVariable.js.map +1 -1
- package/build/dist/Models/DatabaseModels/WorkspaceProjectAuthToken.js +64 -16
- package/build/dist/Models/DatabaseModels/WorkspaceProjectAuthToken.js.map +1 -1
- package/build/dist/Server/API/AIInvestigationAPI.js +205 -0
- package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
- package/build/dist/Server/API/AutoRemediationAPI.js +115 -2
- package/build/dist/Server/API/AutoRemediationAPI.js.map +1 -1
- package/build/dist/Server/API/CommonAPI.js +49 -0
- package/build/dist/Server/API/CommonAPI.js.map +1 -1
- package/build/dist/Server/API/KubernetesClusterAiAccessAPI.js +564 -0
- package/build/dist/Server/API/KubernetesClusterAiAccessAPI.js.map +1 -0
- package/build/dist/Server/API/MicrosoftTeamsAPI.js +465 -176
- package/build/dist/Server/API/MicrosoftTeamsAPI.js.map +1 -1
- package/build/dist/Server/API/MonitorAPI.js +107 -1
- package/build/dist/Server/API/MonitorAPI.js.map +1 -1
- package/build/dist/Server/API/OnCallScheduleTimelineAPI.js +5 -16
- package/build/dist/Server/API/OnCallScheduleTimelineAPI.js.map +1 -1
- package/build/dist/Server/API/SlackAPI.js +322 -78
- package/build/dist/Server/API/SlackAPI.js.map +1 -1
- package/build/dist/Server/API/StatusPageAPI.js +123 -17
- package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
- package/build/dist/Server/API/TelemetryAPI.js +144 -5
- package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
- package/build/dist/Server/API/UserTwoFactorBackupCodeAPI.js +1 -0
- package/build/dist/Server/API/UserTwoFactorBackupCodeAPI.js.map +1 -1
- package/build/dist/Server/API/WorkflowVariableAPI.js +109 -0
- package/build/dist/Server/API/WorkflowVariableAPI.js.map +1 -0
- package/build/dist/Server/Infrastructure/GlobalCache.js +29 -0
- package/build/dist/Server/Infrastructure/GlobalCache.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794300000000-AddOAuth2WorkflowVariables.js +38 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794300000000-AddOAuth2WorkflowVariables.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794400000000-AddKubernetesClusterAiAccess.js +54 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794400000000-AddKubernetesClusterAiAccess.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794500000000-AddIncomingEmailCustomAddressToMonitor.js +14 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794500000000-AddIncomingEmailCustomAddressToMonitor.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794600000000-AddAuthTokenExpiresAtToWorkspaceProjectAuthToken.js +12 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794600000000-AddAuthTokenExpiresAtToWorkspaceProjectAuthToken.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794700000000-RemoveAppAccessTokenFromWorkspaceProjectAuthTokenMiscData.js +32 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794700000000-RemoveAppAccessTokenFromWorkspaceProjectAuthTokenMiscData.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794800000000-AddSessionReplaySameOriginTracePropagation.js +20 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794800000000-AddSessionReplaySameOriginTracePropagation.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794900000000-AddIncidentAlert.js +42 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794900000000-AddIncidentAlert.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +14 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Middleware/MasterAdminAuthorization.js +21 -0
- package/build/dist/Server/Middleware/MasterAdminAuthorization.js.map +1 -1
- package/build/dist/Server/Middleware/TelemetryIngest.js +32 -2
- package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
- package/build/dist/Server/Middleware/UserAuthorization.js +39 -6
- package/build/dist/Server/Middleware/UserAuthorization.js.map +1 -1
- package/build/dist/Server/Services/AIAgentService.js +1 -0
- package/build/dist/Server/Services/AIAgentService.js.map +1 -1
- package/build/dist/Server/Services/AccessTokenService.js +87 -42
- package/build/dist/Server/Services/AccessTokenService.js.map +1 -1
- package/build/dist/Server/Services/AlertEpisodeMemberService.js +4 -0
- package/build/dist/Server/Services/AlertEpisodeMemberService.js.map +1 -1
- package/build/dist/Server/Services/AlertEpisodeService.js +12 -1
- package/build/dist/Server/Services/AlertEpisodeService.js.map +1 -1
- package/build/dist/Server/Services/AlertService.js +110 -23
- package/build/dist/Server/Services/AlertService.js.map +1 -1
- package/build/dist/Server/Services/AutoRemediationRuleEngineService.js +716 -30
- package/build/dist/Server/Services/AutoRemediationRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AutoRemediationRuleService.js +100 -0
- package/build/dist/Server/Services/AutoRemediationRuleService.js.map +1 -1
- package/build/dist/Server/Services/BillingService.js +1 -0
- package/build/dist/Server/Services/BillingService.js.map +1 -1
- package/build/dist/Server/Services/InboundEmail/Providers/SendGridInboundProvider.js +11 -16
- package/build/dist/Server/Services/InboundEmail/Providers/SendGridInboundProvider.js.map +1 -1
- package/build/dist/Server/Services/IncidentAlertService.js +1370 -0
- package/build/dist/Server/Services/IncidentAlertService.js.map +1 -0
- package/build/dist/Server/Services/IncidentEpisodeMemberService.js +4 -0
- package/build/dist/Server/Services/IncidentEpisodeMemberService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodePublicNoteService.js +48 -0
- package/build/dist/Server/Services/IncidentEpisodePublicNoteService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeRoleMemberService.js +21 -0
- package/build/dist/Server/Services/IncidentEpisodeRoleMemberService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeService.js +12 -1
- package/build/dist/Server/Services/IncidentEpisodeService.js.map +1 -1
- package/build/dist/Server/Services/IncidentGroupingEngineService.js +8 -0
- package/build/dist/Server/Services/IncidentGroupingEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentMemberService.js +14 -0
- package/build/dist/Server/Services/IncidentMemberService.js.map +1 -1
- package/build/dist/Server/Services/IncidentPublicNoteService.js +48 -0
- package/build/dist/Server/Services/IncidentPublicNoteService.js.map +1 -1
- package/build/dist/Server/Services/IncidentService.js +263 -33
- package/build/dist/Server/Services/IncidentService.js.map +1 -1
- package/build/dist/Server/Services/IncidentStateTimelineService.js +33 -0
- package/build/dist/Server/Services/IncidentStateTimelineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentTemplateService.js +68 -4
- package/build/dist/Server/Services/IncidentTemplateService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +2 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterAiAccessService.js +1470 -0
- package/build/dist/Server/Services/KubernetesClusterAiAccessService.js.map +1 -0
- package/build/dist/Server/Services/KubernetesClusterService.js +1097 -0
- package/build/dist/Server/Services/KubernetesClusterService.js.map +1 -1
- package/build/dist/Server/Services/LogAggregationService.js +14 -6
- package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
- package/build/dist/Server/Services/MonitorService.js +487 -48
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/MonitorStatusTimelineService.js +540 -3
- package/build/dist/Server/Services/MonitorStatusTimelineService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js +2 -0
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleTeamService.js +2 -0
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleTeamService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleUserService.js +2 -0
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleUserService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleService.js +3 -0
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleService.js.map +1 -1
- package/build/dist/Server/Services/OnCallNotificationAlertingService.js +29 -7
- package/build/dist/Server/Services/OnCallNotificationAlertingService.js.map +1 -1
- package/build/dist/Server/Services/OnCallSetupReminderService.js +1 -0
- package/build/dist/Server/Services/OnCallSetupReminderService.js.map +1 -1
- package/build/dist/Server/Services/ProbeService.js +7 -1
- package/build/dist/Server/Services/ProbeService.js.map +1 -1
- package/build/dist/Server/Services/ProjectService.js +11 -1
- package/build/dist/Server/Services/ProjectService.js.map +1 -1
- package/build/dist/Server/Services/RunbookCredentialService.js +24 -0
- package/build/dist/Server/Services/RunbookCredentialService.js.map +1 -1
- package/build/dist/Server/Services/RunbookSecretService.js +44 -0
- package/build/dist/Server/Services/RunbookSecretService.js.map +1 -1
- package/build/dist/Server/Services/RunnerJobService.js +641 -21
- package/build/dist/Server/Services/RunnerJobService.js.map +1 -1
- package/build/dist/Server/Services/RunnerService.js +344 -5
- package/build/dist/Server/Services/RunnerService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenancePublicNoteService.js +48 -0
- package/build/dist/Server/Services/ScheduledMaintenancePublicNoteService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceService.js +102 -20
- package/build/dist/Server/Services/ScheduledMaintenanceService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceTemplateService.js +67 -4
- package/build/dist/Server/Services/ScheduledMaintenanceTemplateService.js.map +1 -1
- package/build/dist/Server/Services/ServiceLevelObjectiveService.js +12 -1
- package/build/dist/Server/Services/ServiceLevelObjectiveService.js.map +1 -1
- package/build/dist/Server/Services/StatusPagePrivateUserService.js +1 -0
- package/build/dist/Server/Services/StatusPagePrivateUserService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageService.js +230 -32
- package/build/dist/Server/Services/StatusPageService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageSubscriberService.js +4 -0
- package/build/dist/Server/Services/StatusPageSubscriberService.js.map +1 -1
- package/build/dist/Server/Services/TeamMemberService.js +270 -11
- package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
- package/build/dist/Server/Services/TraceAggregationService.js +10 -6
- package/build/dist/Server/Services/TraceAggregationService.js.map +1 -1
- package/build/dist/Server/Services/UserEmailService.js +1 -0
- package/build/dist/Server/Services/UserEmailService.js.map +1 -1
- package/build/dist/Server/Services/UserNotificationMethodAdminService.js +1 -0
- package/build/dist/Server/Services/UserNotificationMethodAdminService.js.map +1 -1
- package/build/dist/Server/Services/UserNotificationRuleAdminService.js +1 -0
- package/build/dist/Server/Services/UserNotificationRuleAdminService.js.map +1 -1
- package/build/dist/Server/Services/UserNotificationRuleService.js +4 -0
- package/build/dist/Server/Services/UserNotificationRuleService.js.map +1 -1
- package/build/dist/Server/Services/UserService.js +107 -1
- package/build/dist/Server/Services/UserService.js.map +1 -1
- package/build/dist/Server/Services/WorkflowVariableService.js +396 -7
- package/build/dist/Server/Services/WorkflowVariableService.js.map +1 -1
- package/build/dist/Server/Services/WorkspaceNotificationRuleService.js +463 -7
- package/build/dist/Server/Services/WorkspaceNotificationRuleService.js.map +1 -1
- package/build/dist/Server/Services/WorkspaceProjectAuthTokenService.js +144 -2
- package/build/dist/Server/Services/WorkspaceProjectAuthTokenService.js.map +1 -1
- package/build/dist/Server/Types/Database/QueryHelper.js +20 -0
- package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
- package/build/dist/Server/Types/Markdown.js +394 -27
- package/build/dist/Server/Types/Markdown.js.map +1 -1
- package/build/dist/Server/Utils/AI/ClusterAccess/ClusterAccessContext.js +123 -0
- package/build/dist/Server/Utils/AI/ClusterAccess/ClusterAccessContext.js.map +1 -0
- package/build/dist/Server/Utils/AI/ClusterAccess/KubectlInvestigationToolkit.js +344 -0
- package/build/dist/Server/Utils/AI/ClusterAccess/KubectlInvestigationToolkit.js.map +1 -0
- package/build/dist/Server/Utils/AI/ClusterAccess/KubectlJobRunner.js +587 -0
- package/build/dist/Server/Utils/AI/ClusterAccess/KubectlJobRunner.js.map +1 -0
- package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentAuth.js +18 -2
- package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentAuth.js.map +1 -1
- package/build/dist/Server/Utils/AI/Remediation/RemediationCommandTools.js +1380 -239
- package/build/dist/Server/Utils/AI/Remediation/RemediationCommandTools.js.map +1 -1
- package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js +1099 -68
- package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js +88 -6
- package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js +45 -11
- package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js +41 -11
- package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/AIActionTools.js +11 -4
- package/build/dist/Server/Utils/AI/Toolbox/AIActionTools.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/ResourceTools.js +4 -2
- package/build/dist/Server/Utils/AI/Toolbox/ResourceTools.js.map +1 -1
- package/build/dist/Server/Utils/AutoRemediation/CommandPlanExecutor.js +997 -141
- package/build/dist/Server/Utils/AutoRemediation/CommandPlanExecutor.js.map +1 -1
- package/build/dist/Server/Utils/AutoRemediation/RemediationVerifier.js +299 -4
- package/build/dist/Server/Utils/AutoRemediation/RemediationVerifier.js.map +1 -1
- package/build/dist/Server/Utils/Database/AffectedResourceRelations.js +120 -0
- package/build/dist/Server/Utils/Database/AffectedResourceRelations.js.map +1 -0
- package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js +160 -1
- package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js.map +1 -1
- package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js +1 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js +59 -12
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js +5 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js +84 -22
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorPayloadRedaction.js +70 -5
- package/build/dist/Server/Utils/Monitor/MonitorPayloadRedaction.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/ProbeMonitorsNotification.js +249 -0
- package/build/dist/Server/Utils/Monitor/ProbeMonitorsNotification.js.map +1 -0
- package/build/dist/Server/Utils/OnCall/OnCallShiftReminderRunner.js +1 -0
- package/build/dist/Server/Utils/OnCall/OnCallShiftReminderRunner.js.map +1 -1
- package/build/dist/Server/Utils/PushNotificationUtil.js +27 -0
- package/build/dist/Server/Utils/PushNotificationUtil.js.map +1 -1
- package/build/dist/Server/Utils/Rules/OwnerRuleAssignment.js +26 -3
- package/build/dist/Server/Utils/Rules/OwnerRuleAssignment.js.map +1 -1
- package/build/dist/Server/Utils/Runbook/RunbookExecutePermission.js +38 -3
- package/build/dist/Server/Utils/Runbook/RunbookExecutePermission.js.map +1 -1
- package/build/dist/Server/Utils/SessionReplay/SessionReplayGateCache.js +8 -0
- package/build/dist/Server/Utils/SessionReplay/SessionReplayGateCache.js.map +1 -1
- package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js +143 -23
- package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js.map +1 -1
- package/build/dist/Server/Utils/SessionReplay/SessionReplayUserFlowReadService.js +406 -0
- package/build/dist/Server/Utils/SessionReplay/SessionReplayUserFlowReadService.js.map +1 -0
- package/build/dist/Server/Utils/StartServer.js +4 -3
- package/build/dist/Server/Utils/StartServer.js.map +1 -1
- package/build/dist/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.js +382 -0
- package/build/dist/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.js.map +1 -0
- package/build/dist/Server/Utils/TwoFactorBackupCodeNotification.js +1 -0
- package/build/dist/Server/Utils/TwoFactorBackupCodeNotification.js.map +1 -1
- package/build/dist/Server/Utils/UserPermission/UserPermission.js +10 -0
- package/build/dist/Server/Utils/UserPermission/UserPermission.js.map +1 -1
- package/build/dist/Server/Utils/Workflow/OAuth2TokenClient.js +447 -0
- package/build/dist/Server/Utils/Workflow/OAuth2TokenClient.js.map +1 -0
- package/build/dist/Server/Utils/Workflow/WorkflowVariableOAuthToken.js +202 -0
- package/build/dist/Server/Utils/Workflow/WorkflowVariableOAuthToken.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Alert.js +39 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Alert.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/AlertEpisode.js +44 -4
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/AlertEpisode.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.js +150 -191
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.js +44 -4
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Monitor.js +39 -17
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Monitor.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/ScheduledMaintenance.js +151 -145
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/ScheduledMaintenance.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +221 -127
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsServiceUrl.js +91 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsServiceUrl.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/ReactionNoteSync.js +673 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/ReactionNoteSync.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/Slack/Actions/ActionTypes.js +3 -9
- package/build/dist/Server/Utils/Workspace/Slack/Actions/ActionTypes.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/Slack/Actions/Alert.js +65 -166
- package/build/dist/Server/Utils/Workspace/Slack/Actions/Alert.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/Slack/Actions/AlertEpisode.js +63 -157
- package/build/dist/Server/Utils/Workspace/Slack/Actions/AlertEpisode.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/Slack/Actions/Auth.js +23 -3
- package/build/dist/Server/Utils/Workspace/Slack/Actions/Auth.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/Slack/Actions/Authorization.js +92 -0
- package/build/dist/Server/Utils/Workspace/Slack/Actions/Authorization.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/Slack/Actions/Incident.js +81 -210
- package/build/dist/Server/Utils/Workspace/Slack/Actions/Incident.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/Slack/Actions/IncidentEpisode.js +68 -138
- package/build/dist/Server/Utils/Workspace/Slack/Actions/IncidentEpisode.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/Slack/Actions/ReactionNote.js +240 -0
- package/build/dist/Server/Utils/Workspace/Slack/Actions/ReactionNote.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/Slack/Actions/ScheduledMaintenance.js +85 -212
- package/build/dist/Server/Utils/Workspace/Slack/Actions/ScheduledMaintenance.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/Slack/Slack.js +60 -17
- package/build/dist/Server/Utils/Workspace/Slack/Slack.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/Slack/app-manifest.json +2 -0
- package/build/dist/Server/Utils/Workspace/Workspace.js +134 -41
- package/build/dist/Server/Utils/Workspace/Workspace.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/WorkspaceActionAuthorization.js +197 -0
- package/build/dist/Server/Utils/Workspace/WorkspaceActionAuthorization.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/WorkspaceBase.js +32 -0
- package/build/dist/Server/Utils/Workspace/WorkspaceBase.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/WorkspaceOAuthState.js +199 -0
- package/build/dist/Server/Utils/Workspace/WorkspaceOAuthState.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/WorkspaceProjectReferenceValidator.js +91 -0
- package/build/dist/Server/Utils/Workspace/WorkspaceProjectReferenceValidator.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/WorkspaceReactionNote.js +450 -0
- package/build/dist/Server/Utils/Workspace/WorkspaceReactionNote.js.map +1 -0
- package/build/dist/Types/AutoRemediation/AiRemediationCommandPlan.js +103 -5
- package/build/dist/Types/AutoRemediation/AiRemediationCommandPlan.js.map +1 -1
- package/build/dist/Types/Date.js +97 -7
- package/build/dist/Types/Date.js.map +1 -1
- package/build/dist/Types/Email/EmailTemplateType.js +1 -0
- package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
- package/build/dist/Types/Exception/ExceptionMessages.js +1 -0
- package/build/dist/Types/Exception/ExceptionMessages.js.map +1 -1
- package/build/dist/Types/Incident/IncidentAlertLink.js +34 -0
- package/build/dist/Types/Incident/IncidentAlertLink.js.map +1 -0
- package/build/dist/Types/Kubernetes/KubernetesClusterAiAccess.js +245 -0
- package/build/dist/Types/Kubernetes/KubernetesClusterAiAccess.js.map +1 -0
- package/build/dist/Types/Kubernetes/KubernetesClusterAiAccessPermissions.js +49 -0
- package/build/dist/Types/Kubernetes/KubernetesClusterAiAccessPermissions.js.map +1 -0
- package/build/dist/Types/Kubernetes/KubernetesClusterAiAccessToolNames.js +16 -0
- package/build/dist/Types/Kubernetes/KubernetesClusterAiAccessToolNames.js.map +1 -0
- package/build/dist/Types/Monitor/DatabaseMonitor/SqlServerPlatform.js +104 -0
- package/build/dist/Types/Monitor/DatabaseMonitor/SqlServerPlatform.js.map +1 -0
- package/build/dist/Types/Monitor/KubernetesAlertTemplates.js +6 -5
- package/build/dist/Types/Monitor/KubernetesAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepExceptionMonitor.js +32 -0
- package/build/dist/Types/Monitor/MonitorStepExceptionMonitor.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorUptimeSummary.js +52 -0
- package/build/dist/Types/Monitor/MonitorUptimeSummary.js.map +1 -0
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js +9 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js.map +1 -1
- package/build/dist/Types/Permission.js +42 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/Rum/SessionReplay.js +52 -2
- package/build/dist/Types/Rum/SessionReplay.js.map +1 -1
- package/build/dist/Types/Rum/SessionReplayApi.js +11 -0
- package/build/dist/Types/Rum/SessionReplayApi.js.map +1 -1
- package/build/dist/Types/Rum/UserFlow.js +115 -0
- package/build/dist/Types/Rum/UserFlow.js.map +1 -0
- package/build/dist/Types/Rum/WebVitals.js +25 -0
- package/build/dist/Types/Rum/WebVitals.js.map +1 -1
- package/build/dist/Types/Runbook/RunbookStepType.js +10 -0
- package/build/dist/Types/Runbook/RunbookStepType.js.map +1 -1
- package/build/dist/Types/Runbook/RunnerJobOrigin.js +14 -0
- package/build/dist/Types/Runbook/RunnerJobOrigin.js.map +1 -1
- package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.js +2 -2
- package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.js.map +1 -1
- package/build/dist/Types/StatusPage/MergedDowntimeTotals.js +2 -0
- package/build/dist/Types/StatusPage/MergedDowntimeTotals.js.map +1 -0
- package/build/dist/Types/StatusPage/PublicNoteSubscriberNotificationDefault.js +65 -0
- package/build/dist/Types/StatusPage/PublicNoteSubscriberNotificationDefault.js.map +1 -0
- package/build/dist/Types/Telemetry/TelemetryIngestSurface.js +8 -0
- package/build/dist/Types/Telemetry/TelemetryIngestSurface.js.map +1 -1
- package/build/dist/Types/Timezone.js +5 -0
- package/build/dist/Types/Timezone.js.map +1 -1
- package/build/dist/Types/TimezoneAlias.js +340 -0
- package/build/dist/Types/TimezoneAlias.js.map +1 -0
- package/build/dist/Types/Workflow/Templates.js +2694 -2
- package/build/dist/Types/Workflow/Templates.js.map +1 -1
- package/build/dist/Types/Workflow/WorkflowVariableOAuth.js +314 -0
- package/build/dist/Types/Workflow/WorkflowVariableOAuth.js.map +1 -0
- package/build/dist/Types/Workspace/WorkspaceNoteReaction.js +98 -0
- package/build/dist/Types/Workspace/WorkspaceNoteReaction.js.map +1 -0
- package/build/dist/UI/Components/AttributesJSON/AttributesJSONPreferences.js +95 -0
- package/build/dist/UI/Components/AttributesJSON/AttributesJSONPreferences.js.map +1 -0
- package/build/dist/UI/Components/AttributesJSON/AttributesJSONView.js +44 -0
- package/build/dist/UI/Components/AttributesJSON/AttributesJSONView.js.map +1 -0
- package/build/dist/UI/Components/AttributesJSON/AttributesViewToggle.js +27 -0
- package/build/dist/UI/Components/AttributesJSON/AttributesViewToggle.js.map +1 -0
- package/build/dist/UI/Components/AttributesJSON/BracesGlyph.js +9 -0
- package/build/dist/UI/Components/AttributesJSON/BracesGlyph.js.map +1 -0
- package/build/dist/UI/Components/AttributesJSON/CopyAttributesAsJSONButton.js +260 -0
- package/build/dist/UI/Components/AttributesJSON/CopyAttributesAsJSONButton.js.map +1 -0
- package/build/dist/UI/Components/AttributesJSON/JSONHighlight.js +56 -0
- package/build/dist/UI/Components/AttributesJSON/JSONHighlight.js.map +1 -0
- package/build/dist/UI/Components/Calendar/Calendar.js +94 -7
- package/build/dist/UI/Components/Calendar/Calendar.js.map +1 -1
- package/build/dist/UI/Components/Calendar/CalendarDayLayout.js +136 -0
- package/build/dist/UI/Components/Calendar/CalendarDayLayout.js.map +1 -0
- package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js +1 -1
- package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js.map +1 -1
- package/build/dist/UI/Components/Charts/Utils/HistogramSelection.js +72 -0
- package/build/dist/UI/Components/Charts/Utils/HistogramSelection.js.map +1 -0
- package/build/dist/UI/Components/Charts/Utils/useHistogramRangeSelection.js +178 -0
- package/build/dist/UI/Components/Charts/Utils/useHistogramRangeSelection.js.map +1 -0
- package/build/dist/UI/Components/Charts/Utils/useHistogramZoom.js +13 -1
- package/build/dist/UI/Components/Charts/Utils/useHistogramZoom.js.map +1 -1
- package/build/dist/UI/Components/Date/CustomTimeRangeModal.js +20 -4
- package/build/dist/UI/Components/Date/CustomTimeRangeModal.js.map +1 -1
- package/build/dist/UI/Components/Detail/FieldLabel.js +2 -0
- package/build/dist/UI/Components/Detail/FieldLabel.js.map +1 -1
- package/build/dist/UI/Components/Dropdown/Dropdown.js +33 -9
- package/build/dist/UI/Components/Dropdown/Dropdown.js.map +1 -1
- package/build/dist/UI/Components/Forms/Fields/FormField.js +36 -13
- package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
- package/build/dist/UI/Components/Graphs/DayUptimeGraph.js +117 -11
- package/build/dist/UI/Components/Graphs/DayUptimeGraph.js.map +1 -1
- package/build/dist/UI/Components/Graphs/UptimeBarTooltip.js +5 -1
- package/build/dist/UI/Components/Graphs/UptimeBarTooltip.js.map +1 -1
- package/build/dist/UI/Components/Graphs/UptimeDaySummary.js.map +1 -1
- package/build/dist/UI/Components/InfoCard/InfoCard.js +22 -1
- package/build/dist/UI/Components/InfoCard/InfoCard.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/LogsViewer.js +36 -8
- package/build/dist/UI/Components/LogsViewer/LogsViewer.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/ColumnSelector.js +10 -2
- package/build/dist/UI/Components/LogsViewer/components/ColumnSelector.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/KeyboardShortcutsHelp.js +9 -1
- package/build/dist/UI/Components/LogsViewer/components/KeyboardShortcutsHelp.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogDetailsPanel.js +16 -15
- package/build/dist/UI/Components/LogsViewer/components/LogDetailsPanel.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsHistogram.js +14 -74
- package/build/dist/UI/Components/LogsViewer/components/LogsHistogram.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsViewerToolbar.js +22 -5
- package/build/dist/UI/Components/LogsViewer/components/LogsViewerToolbar.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/SavedViewsDropdown.js +9 -2
- package/build/dist/UI/Components/LogsViewer/components/SavedViewsDropdown.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/useLogsHistogram.js +16 -5
- package/build/dist/UI/Components/LogsViewer/useLogsHistogram.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +89 -22
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/MonitorGraphs/Uptime.js +7 -1
- package/build/dist/UI/Components/MonitorGraphs/Uptime.js.map +1 -1
- package/build/dist/UI/Components/MonitorGraphs/UptimeBarDayModal.js +5 -1
- package/build/dist/UI/Components/MonitorGraphs/UptimeBarDayModal.js.map +1 -1
- package/build/dist/UI/Components/Page/ModelPage.js +37 -3
- package/build/dist/UI/Components/Page/ModelPage.js.map +1 -1
- package/build/dist/UI/Components/Table/TableHeader.js +18 -2
- package/build/dist/UI/Components/Table/TableHeader.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js +27 -6
- package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryDetailPanel.js +7 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryDetailPanel.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js +17 -77
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetrySearchBar.js +10 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetrySearchBar.js.map +1 -1
- package/build/dist/UI/Components/Tooltip/InfoTooltip.js +28 -0
- package/build/dist/UI/Components/Tooltip/InfoTooltip.js.map +1 -0
- package/build/dist/UI/Utils/ModelAPI/ProjectUsersModelAPI.js +15 -1
- package/build/dist/UI/Utils/ModelAPI/ProjectUsersModelAPI.js.map +1 -1
- package/build/dist/UI/Utils/PermissionGate.js +4 -2
- package/build/dist/UI/Utils/PermissionGate.js.map +1 -1
- package/build/dist/UI/Utils/Timezone.js +52 -17
- package/build/dist/UI/Utils/Timezone.js.map +1 -1
- package/build/dist/Utils/AI/InvestigationReport.js +116 -21
- package/build/dist/Utils/AI/InvestigationReport.js.map +1 -1
- package/build/dist/Utils/AiRemediation/KubectlOutputRedactor.js +1209 -0
- package/build/dist/Utils/AiRemediation/KubectlOutputRedactor.js.map +1 -0
- package/build/dist/Utils/AiRemediation/KubectlPolicy.js +2973 -0
- package/build/dist/Utils/AiRemediation/KubectlPolicy.js.map +1 -0
- package/build/dist/Utils/AiRemediation/KubectlWaitBudget.js +99 -0
- package/build/dist/Utils/AiRemediation/KubectlWaitBudget.js.map +1 -0
- package/build/dist/Utils/AiRemediation/KubectlWriteScope.js +1429 -0
- package/build/dist/Utils/AiRemediation/KubectlWriteScope.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardClockComponent.js +7 -6
- package/build/dist/Utils/Dashboard/Components/DashboardClockComponent.js.map +1 -1
- package/build/dist/Utils/Incident/IncidentFromAlerts.js +306 -0
- package/build/dist/Utils/Incident/IncidentFromAlerts.js.map +1 -0
- package/build/dist/Utils/Monitor/IncomingEmailMonitorAddress.js +214 -0
- package/build/dist/Utils/Monitor/IncomingEmailMonitorAddress.js.map +1 -0
- package/build/dist/Utils/Monitor/MonitorCheckScheduleUtil.js +471 -0
- package/build/dist/Utils/Monitor/MonitorCheckScheduleUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/MonitorOverviewCriteriaUtil.js +107 -0
- package/build/dist/Utils/Monitor/MonitorOverviewCriteriaUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/MonitorOverviewFamily.js +191 -0
- package/build/dist/Utils/Monitor/MonitorOverviewFamily.js.map +1 -0
- package/build/dist/Utils/Monitor/MonitorOverviewPresentationUtil.js +1259 -0
- package/build/dist/Utils/Monitor/MonitorOverviewPresentationUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/MonitorOverviewProbeUtil.js +593 -0
- package/build/dist/Utils/Monitor/MonitorOverviewProbeUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/MonitorOverviewTargetUtil.js +195 -0
- package/build/dist/Utils/Monitor/MonitorOverviewTargetUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/MonitorStatusHistoryUtil.js +127 -0
- package/build/dist/Utils/Monitor/MonitorStatusHistoryUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/MonitorUptimeSummaryUtil.js +464 -0
- package/build/dist/Utils/Monitor/MonitorUptimeSummaryUtil.js.map +1 -0
- package/build/dist/Utils/Rum/SessionIdentity.js +31 -1
- package/build/dist/Utils/Rum/SessionIdentity.js.map +1 -1
- package/build/dist/Utils/Rum/SessionReplayWireEncoding.js +128 -0
- package/build/dist/Utils/Rum/SessionReplayWireEncoding.js.map +1 -0
- package/build/dist/Utils/Rum/SessionTraceState.js +154 -0
- package/build/dist/Utils/Rum/SessionTraceState.js.map +1 -0
- package/build/dist/Utils/Rum/UserFlow.js +941 -0
- package/build/dist/Utils/Rum/UserFlow.js.map +1 -0
- package/build/dist/Utils/StatusPage/MonitorGroupMergedDowntimeUtil.js +82 -0
- package/build/dist/Utils/StatusPage/MonitorGroupMergedDowntimeUtil.js.map +1 -0
- package/build/dist/Utils/StatusPage/ResourceUptime.js +46 -0
- package/build/dist/Utils/StatusPage/ResourceUptime.js.map +1 -1
- package/build/dist/Utils/StatusPage/UptimeDailyAggregateUtil.js +148 -0
- package/build/dist/Utils/StatusPage/UptimeDailyAggregateUtil.js.map +1 -1
- package/build/dist/Utils/Telemetry/AttributesJSON.js +245 -0
- package/build/dist/Utils/Telemetry/AttributesJSON.js.map +1 -0
- package/build/dist/Utils/Uptime/DayUptimeGraphUtil.js +103 -0
- package/build/dist/Utils/Uptime/DayUptimeGraphUtil.js.map +1 -1
- package/build/dist/Utils/Uptime/UptimeUtil.js +91 -27
- package/build/dist/Utils/Uptime/UptimeUtil.js.map +1 -1
- package/jest.config.json +2 -1
- package/package.json +2 -1
- package/tsconfig.tests.json +36 -0
- package/Tests/UI/Components/EmptyState/EmptyStateGuideLinks.test.tsx +0 -337
- package/UI/Components/EmptyState/EmptyStateGuideLinks.tsx +0 -124
- package/build/dist/UI/Components/EmptyState/EmptyStateGuideLinks.js +0 -47
- package/build/dist/UI/Components/EmptyState/EmptyStateGuideLinks.js.map +0 -1
|
@@ -0,0 +1,1429 @@
|
|
|
1
|
+
import { KUBECTL_ALLOW_NODE_OPERATIONS_ENV, KUBECTL_WRITE_NAMESPACES_ENV, KubectlCommandTier, RUNNER_POD_NAMESPACE_ENV, } from "../../Types/Kubernetes/KubernetesClusterAiAccess";
|
|
2
|
+
import KubectlPolicy, { normalizeKubectlFlagName } from "./KubectlPolicy";
|
|
3
|
+
/*
|
|
4
|
+
* Where an AI-composed kubectl WRITE lands, and whether the Runner that
|
|
5
|
+
* runs it lets it land there — the Runner's own bound, independent of RBAC.
|
|
6
|
+
*
|
|
7
|
+
* ONE rule, asked in three places that must never disagree:
|
|
8
|
+
*
|
|
9
|
+
* - the Runner (KubectlExecutor), before it spawns kubectl, with the
|
|
10
|
+
* configuration it was started with — the authoritative check;
|
|
11
|
+
* - the server's enqueue chokepoint (RunnerJobService
|
|
12
|
+
* .getRunnerWriteScopeRefusal), with the posture that Runner reported,
|
|
13
|
+
* so nothing is enqueued or counted by the circuit breaker only to be
|
|
14
|
+
* refused on the Runner;
|
|
15
|
+
* - the remediation toolkit (RemediationCommandToolkit
|
|
16
|
+
* .getRunnerScopeRefusal), at propose and approve time, so nothing is
|
|
17
|
+
* composed or approved only to be refused.
|
|
18
|
+
*
|
|
19
|
+
* All three call getRefusal with the same five inputs (the command, the
|
|
20
|
+
* write namespaces, the pod's namespace, the node switch, and whether
|
|
21
|
+
* kubectl runs through a credential's kubeconfig or the in-cluster
|
|
22
|
+
* ServiceAccount) and word the answer for their own reader. This module is
|
|
23
|
+
* pure: it reads no environment and no Node API; the Runner passes its
|
|
24
|
+
* configuration in, the server passes the posture.
|
|
25
|
+
*
|
|
26
|
+
* RBAC alone is not a namespace bound worth the name: patch/update on a
|
|
27
|
+
* workload's pod template, or create on a job, is running any image as any
|
|
28
|
+
* ServiceAccount of that namespace and mounting its Secrets. So every
|
|
29
|
+
* non-Read argv is refused that
|
|
30
|
+
*
|
|
31
|
+
* - is a node operation while the node switch is off
|
|
32
|
+
* (KUBECTL_ALLOW_NODE_OPERATIONS_ENV, the chart's
|
|
33
|
+
* aiAccess.remediation.nodeOperations) — or might be one: a write whose
|
|
34
|
+
* objects cannot be read for certain;
|
|
35
|
+
* - changes something in the namespace the Runner's pod runs in
|
|
36
|
+
* (RUNNER_POD_NAMESPACE_ENV): a change there could scale the Kubernetes
|
|
37
|
+
* agent — or the Runner, and with it any rollback — away. A namespaced
|
|
38
|
+
* write with no -n runs in the pod's own namespace in-cluster, so a
|
|
39
|
+
* missing -n counts as that namespace; or
|
|
40
|
+
* - changes something outside KUBECTL_WRITE_NAMESPACES_ENV when that list
|
|
41
|
+
* is non-empty (the chart passes the namespaces it bound write RBAC in).
|
|
42
|
+
*
|
|
43
|
+
* What a write changes decides how it is judged, the way kubectl decides
|
|
44
|
+
* it — kubectl ignores -n for an object that lives outside every namespace:
|
|
45
|
+
*
|
|
46
|
+
* - a namespaced object (a pod, a workload, a custom resource) is judged
|
|
47
|
+
* by the namespace it lands in: -n, or the default namespace without it
|
|
48
|
+
* (the pod's own in-cluster, "default" through a credential's
|
|
49
|
+
* kubeconfig, which names none);
|
|
50
|
+
* - a Namespace object is judged by its NAME — `label namespace X` changes
|
|
51
|
+
* namespace X, whatever -n says — so only a namespace the Runner may
|
|
52
|
+
* write in can be changed, never its own;
|
|
53
|
+
* - a Node, and every node verb (cordon, uncordon, drain, taint), is a
|
|
54
|
+
* node operation: not namespace-scoped, but governed by the node
|
|
55
|
+
* switch;
|
|
56
|
+
* - any other cluster-scoped object (a PersistentVolume, a StorageClass,
|
|
57
|
+
* an IngressClass, a ClusterRole, a CRD, ...) is outside every
|
|
58
|
+
* namespace: refused when the write-namespace list is non-empty (the
|
|
59
|
+
* chart's namespaced RoleBindings could not grant it anyway), left to
|
|
60
|
+
* RBAC when it is empty.
|
|
61
|
+
*
|
|
62
|
+
* A write that changes several kinds of object meets every rule that
|
|
63
|
+
* applies to one of them. Reads are never restricted.
|
|
64
|
+
*
|
|
65
|
+
* Only the built-in cluster-scoped kinds are known here — every one the API
|
|
66
|
+
* server serves — by every name kubectl resolves: plural, singular, short
|
|
67
|
+
* name and Kind case, bare or group-qualified the way kubectl qualifies
|
|
68
|
+
* them (its own API group, any prefix of it — "sc.storage", "csr.cert" —
|
|
69
|
+
* or none: "sc.", "storageclasses.v1."; see clusterScopedKindOf). A custom
|
|
70
|
+
* resource is read as namespaced — nobody can run discovery before
|
|
71
|
+
* deciding — so a cluster-scoped custom resource is judged by -n like a
|
|
72
|
+
* namespaced one. On the in-cluster Runner with a write-namespace list its
|
|
73
|
+
* RoleBindings cannot grant one anyway; elsewhere the credential's RBAC
|
|
74
|
+
* bounds it.
|
|
75
|
+
*
|
|
76
|
+
* A flag that replaces the object kubectl builds (--overrides and
|
|
77
|
+
* --override-type, on expose and run) makes what the write changes
|
|
78
|
+
* unreadable: kubectl creates whatever object the flag's value describes.
|
|
79
|
+
* Such a write is uncertain on every verb, whatever the shared policy
|
|
80
|
+
* decides about the flag.
|
|
81
|
+
*
|
|
82
|
+
* The objects and the namespace are read the way kubectl reads the argv:
|
|
83
|
+
* every flag by its arity (the same table the shared policy parses with —
|
|
84
|
+
* a flag this reader does not know makes the objects uncertain, which is
|
|
85
|
+
* refused), -n x, -nx, -n=x, --namespace x, --namespace=x, inside a cluster
|
|
86
|
+
* of boolean short flags such as -An x. Every namespace the argv sets must
|
|
87
|
+
* be allowed, not just the last one kubectl uses; a namespaced write across
|
|
88
|
+
* all namespaces (-A) is never inside a scope. What this reader cannot
|
|
89
|
+
* decide for certain — a namespace flag that the flag before it might
|
|
90
|
+
* swallow as its value, a namespace flag after `--` — is refused rather
|
|
91
|
+
* than guessed, with the unambiguous spelling in the message:
|
|
92
|
+
* `kubectl -n <namespace> ...`.
|
|
93
|
+
*/
|
|
94
|
+
// Verbs whose objects are always nodes: cluster-scoped, not namespaced.
|
|
95
|
+
const NODE_VERBS = new Set([
|
|
96
|
+
"cordon",
|
|
97
|
+
"uncordon",
|
|
98
|
+
"drain",
|
|
99
|
+
"taint",
|
|
100
|
+
]);
|
|
101
|
+
/*
|
|
102
|
+
* Verbs whose positionals name objects as "kind name..." or "kind/name...",
|
|
103
|
+
* mirroring the shared policy's OBJECT_VERBS. For rollout and set the
|
|
104
|
+
* objects follow the subcommand.
|
|
105
|
+
*/
|
|
106
|
+
const OBJECT_VERBS = new Set([
|
|
107
|
+
"get",
|
|
108
|
+
"describe",
|
|
109
|
+
"delete",
|
|
110
|
+
"label",
|
|
111
|
+
"annotate",
|
|
112
|
+
"patch",
|
|
113
|
+
"scale",
|
|
114
|
+
"autoscale",
|
|
115
|
+
"expose",
|
|
116
|
+
"taint",
|
|
117
|
+
"rollout",
|
|
118
|
+
"set",
|
|
119
|
+
]);
|
|
120
|
+
/*
|
|
121
|
+
* Verbs that make a NEW namespaced object from the one they name (a
|
|
122
|
+
* Service, a HorizontalPodAutoscaler) in the namespace -n names, whatever
|
|
123
|
+
* kind the named object is. That holds only without --overrides, which
|
|
124
|
+
* lets expose create any object at all (see OBJECT_REPLACING_FLAGS).
|
|
125
|
+
*/
|
|
126
|
+
const CREATES_NAMESPACED_OBJECT_VERBS = new Set([
|
|
127
|
+
"expose",
|
|
128
|
+
"autoscale",
|
|
129
|
+
]);
|
|
130
|
+
/*
|
|
131
|
+
* What each `kubectl create` subcommand makes, by every alias cobra
|
|
132
|
+
* matches. Anything not listed here is uncertain (the shared policy denies
|
|
133
|
+
* it anyway).
|
|
134
|
+
*/
|
|
135
|
+
const CREATE_SUBCOMMAND_SCOPES = {
|
|
136
|
+
namespace: "namespace-object",
|
|
137
|
+
ns: "namespace-object",
|
|
138
|
+
priorityclass: "cluster-scoped",
|
|
139
|
+
pc: "cluster-scoped",
|
|
140
|
+
clusterrole: "cluster-scoped",
|
|
141
|
+
clusterrolebinding: "cluster-scoped",
|
|
142
|
+
quota: "namespaced",
|
|
143
|
+
resourcequota: "namespaced",
|
|
144
|
+
secret: "namespaced",
|
|
145
|
+
configmap: "namespaced",
|
|
146
|
+
cm: "namespaced",
|
|
147
|
+
serviceaccount: "namespaced",
|
|
148
|
+
sa: "namespaced",
|
|
149
|
+
service: "namespaced",
|
|
150
|
+
svc: "namespaced",
|
|
151
|
+
deployment: "namespaced",
|
|
152
|
+
deploy: "namespaced",
|
|
153
|
+
role: "namespaced",
|
|
154
|
+
rolebinding: "namespaced",
|
|
155
|
+
poddisruptionbudget: "namespaced",
|
|
156
|
+
pdb: "namespaced",
|
|
157
|
+
job: "namespaced",
|
|
158
|
+
cronjob: "namespaced",
|
|
159
|
+
cj: "namespaced",
|
|
160
|
+
ingress: "namespaced",
|
|
161
|
+
ing: "namespaced",
|
|
162
|
+
token: "namespaced",
|
|
163
|
+
};
|
|
164
|
+
// The kind a `kubectl create <subcommand>` of this scope makes, for messages.
|
|
165
|
+
const CREATE_CLUSTER_SCOPED_KINDS = {
|
|
166
|
+
priorityclass: "priorityclass",
|
|
167
|
+
pc: "priorityclass",
|
|
168
|
+
clusterrole: "clusterrole",
|
|
169
|
+
clusterrolebinding: "clusterrolebinding",
|
|
170
|
+
};
|
|
171
|
+
/*
|
|
172
|
+
* EVERY built-in cluster-scoped kind the Kubernetes API server serves
|
|
173
|
+
* (upstream discovery, api/discovery/aggregated_v2.json and api__v1.json of
|
|
174
|
+
* v1.36), keyed by its singular — alpha and beta kinds included, since a
|
|
175
|
+
* cluster may switch them on. A superset of the shared policy's
|
|
176
|
+
* CLUSTER_SCOPED_KINDS (the scope test pins that parity through the
|
|
177
|
+
* policy's own verdicts).
|
|
178
|
+
*/
|
|
179
|
+
const BUILTIN_CLUSTER_SCOPED_KINDS = {
|
|
180
|
+
node: { group: "", plural: "nodes", shortNames: ["no"] },
|
|
181
|
+
namespace: { group: "", plural: "namespaces", shortNames: ["ns"] },
|
|
182
|
+
persistentvolume: {
|
|
183
|
+
group: "",
|
|
184
|
+
plural: "persistentvolumes",
|
|
185
|
+
shortNames: ["pv"],
|
|
186
|
+
},
|
|
187
|
+
componentstatus: {
|
|
188
|
+
group: "",
|
|
189
|
+
plural: "componentstatuses",
|
|
190
|
+
shortNames: ["cs"],
|
|
191
|
+
},
|
|
192
|
+
storageclass: {
|
|
193
|
+
group: "storage.k8s.io",
|
|
194
|
+
plural: "storageclasses",
|
|
195
|
+
shortNames: ["sc"],
|
|
196
|
+
},
|
|
197
|
+
csidriver: { group: "storage.k8s.io", plural: "csidrivers", shortNames: [] },
|
|
198
|
+
csinode: { group: "storage.k8s.io", plural: "csinodes", shortNames: [] },
|
|
199
|
+
volumeattachment: {
|
|
200
|
+
group: "storage.k8s.io",
|
|
201
|
+
plural: "volumeattachments",
|
|
202
|
+
shortNames: [],
|
|
203
|
+
},
|
|
204
|
+
volumeattributesclass: {
|
|
205
|
+
group: "storage.k8s.io",
|
|
206
|
+
plural: "volumeattributesclasses",
|
|
207
|
+
shortNames: ["vac"],
|
|
208
|
+
},
|
|
209
|
+
storageversionmigration: {
|
|
210
|
+
group: "storagemigration.k8s.io",
|
|
211
|
+
plural: "storageversionmigrations",
|
|
212
|
+
shortNames: [],
|
|
213
|
+
},
|
|
214
|
+
customresourcedefinition: {
|
|
215
|
+
group: "apiextensions.k8s.io",
|
|
216
|
+
plural: "customresourcedefinitions",
|
|
217
|
+
shortNames: ["crd", "crds"],
|
|
218
|
+
},
|
|
219
|
+
apiservice: {
|
|
220
|
+
group: "apiregistration.k8s.io",
|
|
221
|
+
plural: "apiservices",
|
|
222
|
+
shortNames: [],
|
|
223
|
+
},
|
|
224
|
+
mutatingwebhookconfiguration: {
|
|
225
|
+
group: "admissionregistration.k8s.io",
|
|
226
|
+
plural: "mutatingwebhookconfigurations",
|
|
227
|
+
shortNames: [],
|
|
228
|
+
},
|
|
229
|
+
validatingwebhookconfiguration: {
|
|
230
|
+
group: "admissionregistration.k8s.io",
|
|
231
|
+
plural: "validatingwebhookconfigurations",
|
|
232
|
+
shortNames: [],
|
|
233
|
+
},
|
|
234
|
+
validatingadmissionpolicy: {
|
|
235
|
+
group: "admissionregistration.k8s.io",
|
|
236
|
+
plural: "validatingadmissionpolicies",
|
|
237
|
+
shortNames: [],
|
|
238
|
+
},
|
|
239
|
+
validatingadmissionpolicybinding: {
|
|
240
|
+
group: "admissionregistration.k8s.io",
|
|
241
|
+
plural: "validatingadmissionpolicybindings",
|
|
242
|
+
shortNames: [],
|
|
243
|
+
},
|
|
244
|
+
mutatingadmissionpolicy: {
|
|
245
|
+
group: "admissionregistration.k8s.io",
|
|
246
|
+
plural: "mutatingadmissionpolicies",
|
|
247
|
+
shortNames: [],
|
|
248
|
+
},
|
|
249
|
+
mutatingadmissionpolicybinding: {
|
|
250
|
+
group: "admissionregistration.k8s.io",
|
|
251
|
+
plural: "mutatingadmissionpolicybindings",
|
|
252
|
+
shortNames: [],
|
|
253
|
+
},
|
|
254
|
+
clusterrole: {
|
|
255
|
+
group: "rbac.authorization.k8s.io",
|
|
256
|
+
plural: "clusterroles",
|
|
257
|
+
shortNames: [],
|
|
258
|
+
},
|
|
259
|
+
clusterrolebinding: {
|
|
260
|
+
group: "rbac.authorization.k8s.io",
|
|
261
|
+
plural: "clusterrolebindings",
|
|
262
|
+
shortNames: [],
|
|
263
|
+
},
|
|
264
|
+
tokenreview: {
|
|
265
|
+
group: "authentication.k8s.io",
|
|
266
|
+
plural: "tokenreviews",
|
|
267
|
+
shortNames: [],
|
|
268
|
+
},
|
|
269
|
+
selfsubjectreview: {
|
|
270
|
+
group: "authentication.k8s.io",
|
|
271
|
+
plural: "selfsubjectreviews",
|
|
272
|
+
shortNames: [],
|
|
273
|
+
},
|
|
274
|
+
subjectaccessreview: {
|
|
275
|
+
group: "authorization.k8s.io",
|
|
276
|
+
plural: "subjectaccessreviews",
|
|
277
|
+
shortNames: [],
|
|
278
|
+
},
|
|
279
|
+
selfsubjectaccessreview: {
|
|
280
|
+
group: "authorization.k8s.io",
|
|
281
|
+
plural: "selfsubjectaccessreviews",
|
|
282
|
+
shortNames: [],
|
|
283
|
+
},
|
|
284
|
+
selfsubjectrulesreview: {
|
|
285
|
+
group: "authorization.k8s.io",
|
|
286
|
+
plural: "selfsubjectrulesreviews",
|
|
287
|
+
shortNames: [],
|
|
288
|
+
},
|
|
289
|
+
priorityclass: {
|
|
290
|
+
group: "scheduling.k8s.io",
|
|
291
|
+
plural: "priorityclasses",
|
|
292
|
+
shortNames: ["pc"],
|
|
293
|
+
},
|
|
294
|
+
ingressclass: {
|
|
295
|
+
group: "networking.k8s.io",
|
|
296
|
+
plural: "ingressclasses",
|
|
297
|
+
shortNames: [],
|
|
298
|
+
},
|
|
299
|
+
ipaddress: {
|
|
300
|
+
group: "networking.k8s.io",
|
|
301
|
+
plural: "ipaddresses",
|
|
302
|
+
shortNames: ["ip"],
|
|
303
|
+
},
|
|
304
|
+
servicecidr: {
|
|
305
|
+
group: "networking.k8s.io",
|
|
306
|
+
plural: "servicecidrs",
|
|
307
|
+
shortNames: [],
|
|
308
|
+
},
|
|
309
|
+
runtimeclass: {
|
|
310
|
+
group: "node.k8s.io",
|
|
311
|
+
plural: "runtimeclasses",
|
|
312
|
+
shortNames: [],
|
|
313
|
+
},
|
|
314
|
+
certificatesigningrequest: {
|
|
315
|
+
group: "certificates.k8s.io",
|
|
316
|
+
plural: "certificatesigningrequests",
|
|
317
|
+
shortNames: ["csr"],
|
|
318
|
+
},
|
|
319
|
+
clustertrustbundle: {
|
|
320
|
+
group: "certificates.k8s.io",
|
|
321
|
+
plural: "clustertrustbundles",
|
|
322
|
+
shortNames: [],
|
|
323
|
+
},
|
|
324
|
+
flowschema: {
|
|
325
|
+
group: "flowcontrol.apiserver.k8s.io",
|
|
326
|
+
plural: "flowschemas",
|
|
327
|
+
shortNames: [],
|
|
328
|
+
},
|
|
329
|
+
prioritylevelconfiguration: {
|
|
330
|
+
group: "flowcontrol.apiserver.k8s.io",
|
|
331
|
+
plural: "prioritylevelconfigurations",
|
|
332
|
+
shortNames: [],
|
|
333
|
+
},
|
|
334
|
+
storageversion: {
|
|
335
|
+
group: "internal.apiserver.k8s.io",
|
|
336
|
+
plural: "storageversions",
|
|
337
|
+
shortNames: [],
|
|
338
|
+
},
|
|
339
|
+
deviceclass: {
|
|
340
|
+
group: "resource.k8s.io",
|
|
341
|
+
plural: "deviceclasses",
|
|
342
|
+
shortNames: [],
|
|
343
|
+
},
|
|
344
|
+
devicetaintrule: {
|
|
345
|
+
group: "resource.k8s.io",
|
|
346
|
+
plural: "devicetaintrules",
|
|
347
|
+
shortNames: [],
|
|
348
|
+
},
|
|
349
|
+
resourceslice: {
|
|
350
|
+
group: "resource.k8s.io",
|
|
351
|
+
plural: "resourceslices",
|
|
352
|
+
shortNames: [],
|
|
353
|
+
},
|
|
354
|
+
resourcepoolstatusrequest: {
|
|
355
|
+
group: "resource.k8s.io",
|
|
356
|
+
plural: "resourcepoolstatusrequests",
|
|
357
|
+
shortNames: [],
|
|
358
|
+
},
|
|
359
|
+
};
|
|
360
|
+
/*
|
|
361
|
+
* Every name kubectl resolves to one of those kinds (lowercased): plural,
|
|
362
|
+
* singular and short names. A Kind ("StorageClass") is its singular once
|
|
363
|
+
* lowercased, which is how kubectl matches it too.
|
|
364
|
+
*/
|
|
365
|
+
function buildClusterScopedKindNames() {
|
|
366
|
+
const names = {};
|
|
367
|
+
for (const kind of Object.keys(BUILTIN_CLUSTER_SCOPED_KINDS)) {
|
|
368
|
+
const definition = BUILTIN_CLUSTER_SCOPED_KINDS[kind];
|
|
369
|
+
names[kind] = { kind, isShortName: false };
|
|
370
|
+
names[definition.plural] = { kind, isShortName: false };
|
|
371
|
+
for (const shortName of definition.shortNames) {
|
|
372
|
+
names[shortName] = { kind, isShortName: true };
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
return names;
|
|
376
|
+
}
|
|
377
|
+
const CLUSTER_SCOPED_KIND_NAMES = buildClusterScopedKindNames();
|
|
378
|
+
/*
|
|
379
|
+
* An API version as Kubernetes spells one ("v1", "v1beta2", "v2alpha1"):
|
|
380
|
+
* the middle segment of "RESOURCE.VERSION.GROUP".
|
|
381
|
+
*/
|
|
382
|
+
const API_VERSION_SEGMENT = /^v\d+(?:(?:alpha|beta)\d+)?$/;
|
|
383
|
+
/*
|
|
384
|
+
* Flags by arity, mirroring the shared policy's KNOWN_FLAGS (every flag
|
|
385
|
+
* OneUptime AI may use; the policy denies the rest). "value" flags take a
|
|
386
|
+
* value — the rest of a short cluster, or the next token; "none" flags
|
|
387
|
+
* (booleans, and optional-value flags such as --cascade, --dry-run and
|
|
388
|
+
* --validate, which only take one written with "=") never consume the next
|
|
389
|
+
* token.
|
|
390
|
+
*/
|
|
391
|
+
const BOOLEAN_SHORT_FLAGS = new Set(["A", "w", "q"]);
|
|
392
|
+
const VALUE_SHORT_FLAGS = new Set([
|
|
393
|
+
"n",
|
|
394
|
+
"o",
|
|
395
|
+
"L",
|
|
396
|
+
"l",
|
|
397
|
+
"c",
|
|
398
|
+
"p",
|
|
399
|
+
"e",
|
|
400
|
+
"r",
|
|
401
|
+
]);
|
|
402
|
+
/*
|
|
403
|
+
* Long flags that never take the next token as their value: the policy's
|
|
404
|
+
* boolean flags and its optional-value flags (--cascade, --dry-run,
|
|
405
|
+
* --validate), which only take a value written with "=". The namespace
|
|
406
|
+
* reader only uses it to decide that a namespace flag right after one of
|
|
407
|
+
* these IS a flag (a flag missing from it makes that namespace flag
|
|
408
|
+
* ambiguous, which is refused); the object reader needs every flag's
|
|
409
|
+
* arity, and refuses a flag it finds in neither table.
|
|
410
|
+
*/
|
|
411
|
+
const NON_CONSUMING_LONG_FLAGS = new Set([
|
|
412
|
+
"match-server-version",
|
|
413
|
+
"allow-missing-template-keys",
|
|
414
|
+
"show-labels",
|
|
415
|
+
"show-kind",
|
|
416
|
+
"show-managed-fields",
|
|
417
|
+
"no-headers",
|
|
418
|
+
"server-print",
|
|
419
|
+
"ignore-not-found",
|
|
420
|
+
"output-watch-events",
|
|
421
|
+
"all-namespaces",
|
|
422
|
+
"all",
|
|
423
|
+
"watch",
|
|
424
|
+
"watch-only",
|
|
425
|
+
"follow",
|
|
426
|
+
"previous",
|
|
427
|
+
"timestamps",
|
|
428
|
+
"all-containers",
|
|
429
|
+
"all-pods",
|
|
430
|
+
"ignore-errors",
|
|
431
|
+
"insecure-skip-tls-verify-backend",
|
|
432
|
+
"show-events",
|
|
433
|
+
"sum",
|
|
434
|
+
"use-protocol-buffers",
|
|
435
|
+
"show-capacity",
|
|
436
|
+
"cached",
|
|
437
|
+
"namespaced",
|
|
438
|
+
"client",
|
|
439
|
+
"list",
|
|
440
|
+
"quiet",
|
|
441
|
+
"force",
|
|
442
|
+
"now",
|
|
443
|
+
"wait",
|
|
444
|
+
"ignore-daemonsets",
|
|
445
|
+
"delete-emptydir-data",
|
|
446
|
+
"delete-local-data",
|
|
447
|
+
"disable-eviction",
|
|
448
|
+
"overwrite",
|
|
449
|
+
"local",
|
|
450
|
+
"record",
|
|
451
|
+
"save-config",
|
|
452
|
+
"append-hash",
|
|
453
|
+
"global-default",
|
|
454
|
+
"windows-line-endings",
|
|
455
|
+
"cascade",
|
|
456
|
+
"dry-run",
|
|
457
|
+
"validate",
|
|
458
|
+
]);
|
|
459
|
+
// Long flags that always take a value: "--selector app=web", "--image=x".
|
|
460
|
+
const VALUE_LONG_FLAGS = new Set([
|
|
461
|
+
"namespace",
|
|
462
|
+
"request-timeout",
|
|
463
|
+
"output",
|
|
464
|
+
"label-columns",
|
|
465
|
+
"sort-by",
|
|
466
|
+
"chunk-size",
|
|
467
|
+
"subresource",
|
|
468
|
+
"selector",
|
|
469
|
+
"labels",
|
|
470
|
+
"field-selector",
|
|
471
|
+
"container",
|
|
472
|
+
"since",
|
|
473
|
+
"since-time",
|
|
474
|
+
"tail",
|
|
475
|
+
"limit-bytes",
|
|
476
|
+
"max-log-requests",
|
|
477
|
+
"pod-running-timeout",
|
|
478
|
+
"patch",
|
|
479
|
+
"prefix",
|
|
480
|
+
"containers",
|
|
481
|
+
"for",
|
|
482
|
+
"types",
|
|
483
|
+
"api-group",
|
|
484
|
+
"categories",
|
|
485
|
+
"verbs",
|
|
486
|
+
"api-version",
|
|
487
|
+
"revision",
|
|
488
|
+
"to-revision",
|
|
489
|
+
"timeout",
|
|
490
|
+
"field-manager",
|
|
491
|
+
"replicas",
|
|
492
|
+
"current-replicas",
|
|
493
|
+
"resource-version",
|
|
494
|
+
"grace-period",
|
|
495
|
+
"pod-selector",
|
|
496
|
+
"skip-wait-for-delete-timeout",
|
|
497
|
+
"type",
|
|
498
|
+
"image",
|
|
499
|
+
"env",
|
|
500
|
+
"from",
|
|
501
|
+
"keys",
|
|
502
|
+
"limits",
|
|
503
|
+
"requests",
|
|
504
|
+
"restart",
|
|
505
|
+
"schedule",
|
|
506
|
+
"port",
|
|
507
|
+
"target-port",
|
|
508
|
+
"protocol",
|
|
509
|
+
"name",
|
|
510
|
+
"external-ip",
|
|
511
|
+
"cluster-ip",
|
|
512
|
+
"load-balancer-ip",
|
|
513
|
+
"overrides",
|
|
514
|
+
"override-type",
|
|
515
|
+
"session-affinity",
|
|
516
|
+
"min",
|
|
517
|
+
"max",
|
|
518
|
+
"cpu",
|
|
519
|
+
"cpu-percent",
|
|
520
|
+
"from-literal",
|
|
521
|
+
"resource",
|
|
522
|
+
"resource-name",
|
|
523
|
+
"verb",
|
|
524
|
+
"non-resource-url",
|
|
525
|
+
"aggregation-rule",
|
|
526
|
+
"role",
|
|
527
|
+
"clusterrole",
|
|
528
|
+
"group",
|
|
529
|
+
"serviceaccount",
|
|
530
|
+
"hard",
|
|
531
|
+
"scopes",
|
|
532
|
+
"min-available",
|
|
533
|
+
"max-unavailable",
|
|
534
|
+
"value",
|
|
535
|
+
"description",
|
|
536
|
+
"preemption-policy",
|
|
537
|
+
"class",
|
|
538
|
+
"rule",
|
|
539
|
+
"annotation",
|
|
540
|
+
"default-backend",
|
|
541
|
+
"tcp",
|
|
542
|
+
"node-port",
|
|
543
|
+
"clusterip",
|
|
544
|
+
"docker-server",
|
|
545
|
+
"docker-username",
|
|
546
|
+
"docker-password",
|
|
547
|
+
"docker-email",
|
|
548
|
+
]);
|
|
549
|
+
/*
|
|
550
|
+
* Flags whose arity depends on the verb, as in the policy's
|
|
551
|
+
* VERB_FLAG_OVERRIDES: -p is --previous (boolean) on logs, --prefix a
|
|
552
|
+
* boolean on logs, --containers a boolean on top, and --recursive a boolean
|
|
553
|
+
* on explain.
|
|
554
|
+
*/
|
|
555
|
+
const VERB_FLAG_ARITY_OVERRIDES = {
|
|
556
|
+
logs: { p: "none", prefix: "none" },
|
|
557
|
+
top: { containers: "none" },
|
|
558
|
+
explain: { recursive: "none" },
|
|
559
|
+
};
|
|
560
|
+
// A negative number or duration (`-1`, `-5s`): a value, never a flag.
|
|
561
|
+
const NEGATIVE_NUMBER_TOKEN = /^-\d/;
|
|
562
|
+
function hasOwn(record, key) {
|
|
563
|
+
return Object.prototype.hasOwnProperty.call(record, key);
|
|
564
|
+
}
|
|
565
|
+
/*
|
|
566
|
+
* A flag's arity the way the policy looks it up: by its name alone (short
|
|
567
|
+
* letters and long names share one table), after the verb's own meaning of
|
|
568
|
+
* it. Null for a flag neither table knows.
|
|
569
|
+
*/
|
|
570
|
+
function lookupFlagArity(name, verb) {
|
|
571
|
+
if (verb !== undefined && hasOwn(VERB_FLAG_ARITY_OVERRIDES, verb)) {
|
|
572
|
+
const overrides = VERB_FLAG_ARITY_OVERRIDES[verb];
|
|
573
|
+
if (hasOwn(overrides, name)) {
|
|
574
|
+
return overrides[name];
|
|
575
|
+
}
|
|
576
|
+
}
|
|
577
|
+
if (BOOLEAN_SHORT_FLAGS.has(name) || NON_CONSUMING_LONG_FLAGS.has(name)) {
|
|
578
|
+
return "none";
|
|
579
|
+
}
|
|
580
|
+
if (VALUE_SHORT_FLAGS.has(name) || VALUE_LONG_FLAGS.has(name)) {
|
|
581
|
+
return "value";
|
|
582
|
+
}
|
|
583
|
+
return null;
|
|
584
|
+
}
|
|
585
|
+
function describeUnknownFlag(flag) {
|
|
586
|
+
return `"${flag}" is a flag the write scope does not know, so whether it takes the next word as its value cannot be told`;
|
|
587
|
+
}
|
|
588
|
+
/*
|
|
589
|
+
* Flags that replace the object kubectl builds with one the flag's value
|
|
590
|
+
* describes: kubectl merges --overrides (a JSON merge, strategic merge or
|
|
591
|
+
* JSON patch, per --override-type) into the Service `kubectl expose`
|
|
592
|
+
* generates — or the Pod `kubectl run` does — and then picks the REST
|
|
593
|
+
* mapping, and so the kind and the namespace it creates in, from the
|
|
594
|
+
* merged object. `kubectl expose deployment web -n prod --overrides=...`
|
|
595
|
+
* can therefore create a ClusterRoleBinding, a PriorityClass, a Namespace
|
|
596
|
+
* or a privileged Job instead of a Service in prod. Read by their
|
|
597
|
+
* normalized name ("--override_type" is "--override-type" to kubectl).
|
|
598
|
+
*/
|
|
599
|
+
const OBJECT_REPLACING_FLAGS = new Set([
|
|
600
|
+
"overrides",
|
|
601
|
+
"override-type",
|
|
602
|
+
]);
|
|
603
|
+
function describeObjectReplacingFlag(flag) {
|
|
604
|
+
return `"${flag}" lets kubectl create whatever object its value describes instead of the one the command names — of any kind, in any namespace — so what the command changes cannot be read from it`;
|
|
605
|
+
}
|
|
606
|
+
/*
|
|
607
|
+
* The positionals of an argv, split exactly the way the shared policy (and
|
|
608
|
+
* pflag) split them: a value flag takes the rest of its short cluster or
|
|
609
|
+
* the next token, "--flag=value" carries its own, and everything after
|
|
610
|
+
* "--" is positional. A flag neither arity table knows makes the split
|
|
611
|
+
* uncertain — whether it swallows the next word decides which word is the
|
|
612
|
+
* kind — so the reason is returned instead of a guess.
|
|
613
|
+
*/
|
|
614
|
+
function readPositionals(args) {
|
|
615
|
+
const positionals = [];
|
|
616
|
+
let verb = undefined;
|
|
617
|
+
let afterDoubleDash = false;
|
|
618
|
+
let objectReplacingFlag = null;
|
|
619
|
+
for (let i = 0; i < args.length; i++) {
|
|
620
|
+
const token = args[i];
|
|
621
|
+
if (afterDoubleDash || !token.startsWith("-") || token === "-") {
|
|
622
|
+
positionals.push(token);
|
|
623
|
+
if (verb === undefined) {
|
|
624
|
+
verb = token.toLowerCase();
|
|
625
|
+
}
|
|
626
|
+
continue;
|
|
627
|
+
}
|
|
628
|
+
if (token === "--") {
|
|
629
|
+
afterDoubleDash = true;
|
|
630
|
+
continue;
|
|
631
|
+
}
|
|
632
|
+
if (token.startsWith("--")) {
|
|
633
|
+
const eq = token.indexOf("=");
|
|
634
|
+
const written = eq >= 0 ? token.slice(0, eq) : token;
|
|
635
|
+
const name = normalizeKubectlFlagName(written.slice(2));
|
|
636
|
+
const arity = lookupFlagArity(name, verb);
|
|
637
|
+
if (arity === null) {
|
|
638
|
+
return {
|
|
639
|
+
positionals,
|
|
640
|
+
uncertainty: describeUnknownFlag(token),
|
|
641
|
+
objectReplacingFlag,
|
|
642
|
+
};
|
|
643
|
+
}
|
|
644
|
+
if (objectReplacingFlag === null && OBJECT_REPLACING_FLAGS.has(name)) {
|
|
645
|
+
objectReplacingFlag = written;
|
|
646
|
+
}
|
|
647
|
+
if (eq < 0 && arity === "value") {
|
|
648
|
+
i++; // Its value is the next token, whatever it looks like.
|
|
649
|
+
}
|
|
650
|
+
continue;
|
|
651
|
+
}
|
|
652
|
+
// "-abc": a cluster of short flags, read letter by letter.
|
|
653
|
+
let rest = token.slice(1);
|
|
654
|
+
while (rest.length > 0) {
|
|
655
|
+
const letter = rest.charAt(0);
|
|
656
|
+
const arity = lookupFlagArity(letter, verb);
|
|
657
|
+
if (arity === null) {
|
|
658
|
+
return {
|
|
659
|
+
positionals,
|
|
660
|
+
uncertainty: describeUnknownFlag(`-${letter}`),
|
|
661
|
+
objectReplacingFlag,
|
|
662
|
+
};
|
|
663
|
+
}
|
|
664
|
+
// "-n=web"
|
|
665
|
+
if (rest.charAt(1) === "=") {
|
|
666
|
+
break;
|
|
667
|
+
}
|
|
668
|
+
if (arity === "none") {
|
|
669
|
+
rest = rest.slice(1);
|
|
670
|
+
continue;
|
|
671
|
+
}
|
|
672
|
+
// "-n web" takes the next token; "-nweb" carries its value inline.
|
|
673
|
+
if (rest.length === 1) {
|
|
674
|
+
i++;
|
|
675
|
+
}
|
|
676
|
+
break;
|
|
677
|
+
}
|
|
678
|
+
}
|
|
679
|
+
return { positionals, uncertainty: null, objectReplacingFlag };
|
|
680
|
+
}
|
|
681
|
+
/*
|
|
682
|
+
* The commands that read the words after their objects as updates, KEY=VALUE
|
|
683
|
+
* or KEY- (kubectl's GetResourcesAndPairs for label, annotate and set image,
|
|
684
|
+
* SplitEnvironmentFromResources for set env, and taint's own split) — the
|
|
685
|
+
* shared policy's readsObjectsThenPairs. For these, and only these, the
|
|
686
|
+
* objects end at the first such word. Every other verb hands kubectl's
|
|
687
|
+
* resource builder ALL of its words, `=` or not, and kubectl goes on to the
|
|
688
|
+
* next object when one fails: with the pinned kubectl v1.36.4 against a
|
|
689
|
+
* fake API server, `patch pod/a=b node/n1` PATCHed the Node after the
|
|
690
|
+
* missing pod's error. (taint never gets here: it is a node verb.)
|
|
691
|
+
*/
|
|
692
|
+
function readsObjectsThenPairs(verb, subcommand) {
|
|
693
|
+
if (verb === "label" || verb === "annotate" || verb === "taint") {
|
|
694
|
+
return true;
|
|
695
|
+
}
|
|
696
|
+
return verb === "set" && (subcommand === "image" || subcommand === "env");
|
|
697
|
+
}
|
|
698
|
+
/*
|
|
699
|
+
* The object tokens of a command, split the way kubectl splits positionals:
|
|
700
|
+
* every token after the verb for delete; for label, annotate, set image and
|
|
701
|
+
* set env (readsObjectsThenPairs), the leading tokens after the verb (and
|
|
702
|
+
* the subcommand) that are not KEY=VALUE or KEY- pairs; for set selector,
|
|
703
|
+
* every token after the subcommand but the last, which kubectl always reads
|
|
704
|
+
* as the selector expression (getResourcesAndSelector); for every other
|
|
705
|
+
* object verb, every token after the verb (and the subcommand, for rollout
|
|
706
|
+
* and set). So `label pod web-1 node/n1=x` names only the pod, while `patch
|
|
707
|
+
* pod/a=b node/n1` names the Node.
|
|
708
|
+
*/
|
|
709
|
+
function objectTokens(verb, positionals) {
|
|
710
|
+
if (verb === "delete") {
|
|
711
|
+
return positionals.slice(1);
|
|
712
|
+
}
|
|
713
|
+
const start = verb === "rollout" || verb === "set" ? 2 : 1;
|
|
714
|
+
const words = positionals.slice(start);
|
|
715
|
+
const subcommand = (positionals[1] || "").toLowerCase();
|
|
716
|
+
if (verb === "set" && subcommand === "selector") {
|
|
717
|
+
return words.slice(0, -1);
|
|
718
|
+
}
|
|
719
|
+
if (!readsObjectsThenPairs(verb, subcommand)) {
|
|
720
|
+
return words;
|
|
721
|
+
}
|
|
722
|
+
const tokens = [];
|
|
723
|
+
for (const token of words) {
|
|
724
|
+
if (token.includes("=") || token.endsWith("-")) {
|
|
725
|
+
break;
|
|
726
|
+
}
|
|
727
|
+
tokens.push(token);
|
|
728
|
+
}
|
|
729
|
+
return tokens;
|
|
730
|
+
}
|
|
731
|
+
/*
|
|
732
|
+
* The objects the tokens name, read the way kubectl's resource builder
|
|
733
|
+
* reads them: "kind[,kind2] name1 name2" (each name of each kind) or
|
|
734
|
+
* "kind/name kind2/name2". A separate name after a kind/name is an error in
|
|
735
|
+
* kubectl, and uncertain here.
|
|
736
|
+
*/
|
|
737
|
+
function readObjectReferences(tokens) {
|
|
738
|
+
const references = [];
|
|
739
|
+
let kinds = [];
|
|
740
|
+
const names = [];
|
|
741
|
+
for (let i = 0; i < tokens.length; i++) {
|
|
742
|
+
const token = tokens[i];
|
|
743
|
+
const slash = token.indexOf("/");
|
|
744
|
+
if (slash >= 0) {
|
|
745
|
+
references.push({
|
|
746
|
+
rawKind: token.slice(0, slash),
|
|
747
|
+
name: token.slice(slash + 1),
|
|
748
|
+
});
|
|
749
|
+
}
|
|
750
|
+
else if (i === 0) {
|
|
751
|
+
kinds = token.split(",");
|
|
752
|
+
}
|
|
753
|
+
else if (kinds.length === 0) {
|
|
754
|
+
return {
|
|
755
|
+
references,
|
|
756
|
+
uncertainty: `"${token}" follows "${tokens[0]}", and kubectl does not accept a separate name after TYPE/NAME`,
|
|
757
|
+
};
|
|
758
|
+
}
|
|
759
|
+
else {
|
|
760
|
+
names.push(token);
|
|
761
|
+
}
|
|
762
|
+
}
|
|
763
|
+
for (const kind of kinds) {
|
|
764
|
+
if (names.length === 0) {
|
|
765
|
+
references.push({ rawKind: kind, name: null });
|
|
766
|
+
continue;
|
|
767
|
+
}
|
|
768
|
+
for (const name of names) {
|
|
769
|
+
references.push({ rawKind: kind, name });
|
|
770
|
+
}
|
|
771
|
+
}
|
|
772
|
+
return { references, uncertainty: null };
|
|
773
|
+
}
|
|
774
|
+
/*
|
|
775
|
+
* Does a group written after a kind name match that kind's own group, the
|
|
776
|
+
* way kubectl matches it? An empty group matches the name in every group
|
|
777
|
+
* (as the bare name does); otherwise the kind's own group, or — kubectl's
|
|
778
|
+
* "group prefixing" fallback when no group matches exactly — any prefix of
|
|
779
|
+
* it. The core group is never a prefix match ("nodes.core" is an error).
|
|
780
|
+
*/
|
|
781
|
+
function writtenGroupNamesKindGroup(data) {
|
|
782
|
+
if (data.written === "" || data.written === data.group) {
|
|
783
|
+
return true;
|
|
784
|
+
}
|
|
785
|
+
return (data.prefixMatches &&
|
|
786
|
+
data.group !== "" &&
|
|
787
|
+
data.group.startsWith(data.written));
|
|
788
|
+
}
|
|
789
|
+
/*
|
|
790
|
+
* The built-in cluster-scoped kind a written kind names, or null for any
|
|
791
|
+
* other kind (namespaced, or a custom resource whose scope this reader
|
|
792
|
+
* cannot see). Read the way kubectl's resource builder reads it
|
|
793
|
+
* (schema.ParseResourceArg, then client-go's shortcut expander and REST
|
|
794
|
+
* mapper):
|
|
795
|
+
*
|
|
796
|
+
* - with two dots or more, first as "RESOURCE.VERSION.GROUP". A short
|
|
797
|
+
* name there matches its kind in any group that GROUP is a prefix of
|
|
798
|
+
* ("sc.v1.storage"), and in every group when GROUP is empty — whatever
|
|
799
|
+
* the version, which the expansion drops ("sc.v1.", "sc.foo.", "no.x.").
|
|
800
|
+
* A plural or singular name matches with an empty GROUP or its own,
|
|
801
|
+
* after a real API version ("nodes.v1.", "storageclasses.v1.") or none
|
|
802
|
+
* ("nodes..");
|
|
803
|
+
* - then as "RESOURCE.GROUP", GROUP being everything after the first dot:
|
|
804
|
+
* empty ("sc.", "nodes."), the kind's own group, or any prefix of it
|
|
805
|
+
* ("sc.storage", "storageclasses.stor", "csr.cert", "ip.net",
|
|
806
|
+
* "storageclasses.storage.").
|
|
807
|
+
*
|
|
808
|
+
* The core group is never a prefix match: "nodes.core" and "no.x" are
|
|
809
|
+
* errors in kubectl, and "nodes.example.com" is some custom resource.
|
|
810
|
+
*
|
|
811
|
+
* A custom resource that shares a name, a short name or a group prefix with
|
|
812
|
+
* a built-in kind loses to it — discovery lists the built-in groups first,
|
|
813
|
+
* and kubectl takes the first match — so the prefix spellings are the
|
|
814
|
+
* built-in kind exactly as the bare name is.
|
|
815
|
+
*/
|
|
816
|
+
function clusterScopedKindOf(rawKind) {
|
|
817
|
+
const lower = rawKind.trim().toLowerCase();
|
|
818
|
+
const dot = lower.indexOf(".");
|
|
819
|
+
const head = dot >= 0 ? lower.slice(0, dot) : lower;
|
|
820
|
+
if (!hasOwn(CLUSTER_SCOPED_KIND_NAMES, head)) {
|
|
821
|
+
return null;
|
|
822
|
+
}
|
|
823
|
+
const name = CLUSTER_SCOPED_KIND_NAMES[head];
|
|
824
|
+
if (dot < 0) {
|
|
825
|
+
return name.kind;
|
|
826
|
+
}
|
|
827
|
+
const group = BUILTIN_CLUSTER_SCOPED_KINDS[name.kind].group;
|
|
828
|
+
const qualifier = lower.slice(dot + 1);
|
|
829
|
+
const versionDot = qualifier.indexOf(".");
|
|
830
|
+
// RESOURCE.VERSION.GROUP
|
|
831
|
+
if (versionDot >= 0) {
|
|
832
|
+
const version = qualifier.slice(0, versionDot);
|
|
833
|
+
const versionedGroup = qualifier.slice(versionDot + 1);
|
|
834
|
+
// A short name's expansion keeps no version when no group is written.
|
|
835
|
+
if (name.isShortName && versionedGroup === "") {
|
|
836
|
+
return name.kind;
|
|
837
|
+
}
|
|
838
|
+
if ((version === "" || API_VERSION_SEGMENT.test(version)) &&
|
|
839
|
+
writtenGroupNamesKindGroup({
|
|
840
|
+
written: versionedGroup,
|
|
841
|
+
group,
|
|
842
|
+
// With a version, only a short name falls back to a group prefix.
|
|
843
|
+
prefixMatches: name.isShortName || version === "",
|
|
844
|
+
})) {
|
|
845
|
+
return name.kind;
|
|
846
|
+
}
|
|
847
|
+
}
|
|
848
|
+
// RESOURCE.GROUP
|
|
849
|
+
if (writtenGroupNamesKindGroup({
|
|
850
|
+
written: qualifier,
|
|
851
|
+
group,
|
|
852
|
+
prefixMatches: true,
|
|
853
|
+
})) {
|
|
854
|
+
return name.kind;
|
|
855
|
+
}
|
|
856
|
+
return null;
|
|
857
|
+
}
|
|
858
|
+
function isFlagToken(token) {
|
|
859
|
+
return (token.startsWith("-") &&
|
|
860
|
+
token !== "-" &&
|
|
861
|
+
token !== "--" &&
|
|
862
|
+
!NEGATIVE_NUMBER_TOKEN.test(token));
|
|
863
|
+
}
|
|
864
|
+
/*
|
|
865
|
+
* Does this token switch on --all-namespaces (-A alone, or inside a cluster
|
|
866
|
+
* of boolean letters)? Not when it is written "=false".
|
|
867
|
+
*/
|
|
868
|
+
function readsAllNamespaces(token) {
|
|
869
|
+
if (!isFlagToken(token)) {
|
|
870
|
+
return false;
|
|
871
|
+
}
|
|
872
|
+
if (token.startsWith("--")) {
|
|
873
|
+
const eq = token.indexOf("=");
|
|
874
|
+
const name = normalizeKubectlFlagName(eq >= 0 ? token.slice(2, eq) : token.slice(2));
|
|
875
|
+
const value = eq >= 0 ? token.slice(eq + 1) : "";
|
|
876
|
+
return name === "all-namespaces" && value.trim().toLowerCase() !== "false";
|
|
877
|
+
}
|
|
878
|
+
const body = token.slice(1);
|
|
879
|
+
for (let j = 0; j < body.length; j++) {
|
|
880
|
+
const letter = body[j];
|
|
881
|
+
if (letter === "A") {
|
|
882
|
+
const rest = body.slice(j + 1);
|
|
883
|
+
return rest.startsWith("=")
|
|
884
|
+
? rest.slice(1).trim().toLowerCase() !== "false"
|
|
885
|
+
: true;
|
|
886
|
+
}
|
|
887
|
+
if (BOOLEAN_SHORT_FLAGS.has(letter)) {
|
|
888
|
+
continue;
|
|
889
|
+
}
|
|
890
|
+
if (VALUE_SHORT_FLAGS.has(letter) || letter === "=") {
|
|
891
|
+
// The rest of the token is that flag's value.
|
|
892
|
+
return false;
|
|
893
|
+
}
|
|
894
|
+
// A letter this reader does not know: assume the worst about what follows.
|
|
895
|
+
return body.slice(j + 1).includes("A");
|
|
896
|
+
}
|
|
897
|
+
return false;
|
|
898
|
+
}
|
|
899
|
+
/*
|
|
900
|
+
* Does this token set the namespace, and where is its value? Null when it
|
|
901
|
+
* does not. "uncertain" for a short cluster where an unknown letter comes
|
|
902
|
+
* before an `n` — whether kubectl reaches that `n` depends on the letter.
|
|
903
|
+
*/
|
|
904
|
+
function readNamespaceFlag(token) {
|
|
905
|
+
if (!isFlagToken(token)) {
|
|
906
|
+
return null;
|
|
907
|
+
}
|
|
908
|
+
if (token.startsWith("--")) {
|
|
909
|
+
const eq = token.indexOf("=");
|
|
910
|
+
const name = normalizeKubectlFlagName(eq >= 0 ? token.slice(2, eq) : token.slice(2));
|
|
911
|
+
if (name !== "namespace") {
|
|
912
|
+
return null;
|
|
913
|
+
}
|
|
914
|
+
return eq >= 0
|
|
915
|
+
? { kind: "inline", value: token.slice(eq + 1) }
|
|
916
|
+
: { kind: "next" };
|
|
917
|
+
}
|
|
918
|
+
const body = token.slice(1);
|
|
919
|
+
for (let j = 0; j < body.length; j++) {
|
|
920
|
+
const letter = body[j];
|
|
921
|
+
if (letter === "n") {
|
|
922
|
+
const rest = body.slice(j + 1);
|
|
923
|
+
if (rest.startsWith("=")) {
|
|
924
|
+
return { kind: "inline", value: rest.slice(1) };
|
|
925
|
+
}
|
|
926
|
+
return rest ? { kind: "inline", value: rest } : { kind: "next" };
|
|
927
|
+
}
|
|
928
|
+
if (BOOLEAN_SHORT_FLAGS.has(letter)) {
|
|
929
|
+
continue;
|
|
930
|
+
}
|
|
931
|
+
if (VALUE_SHORT_FLAGS.has(letter) || letter === "=") {
|
|
932
|
+
// The rest of the token is that flag's value, not more flags.
|
|
933
|
+
return null;
|
|
934
|
+
}
|
|
935
|
+
// A letter the policy does not know: its arity decides whether `n` counts.
|
|
936
|
+
return body.slice(j + 1).includes("n") ? { kind: "uncertain" } : null;
|
|
937
|
+
}
|
|
938
|
+
return null;
|
|
939
|
+
}
|
|
940
|
+
/*
|
|
941
|
+
* Could this token, read as a flag, take the NEXT token as its value? "no"
|
|
942
|
+
* only when that is certain; "maybe" otherwise (a value flag written
|
|
943
|
+
* without "=", a flag this reader does not know). A token that is itself a
|
|
944
|
+
* value can never take the next one, so "no" for a positional is exact.
|
|
945
|
+
*/
|
|
946
|
+
function mayTakeNextToken(token) {
|
|
947
|
+
if (!isFlagToken(token)) {
|
|
948
|
+
return "no";
|
|
949
|
+
}
|
|
950
|
+
if (token.startsWith("--")) {
|
|
951
|
+
const eq = token.indexOf("=");
|
|
952
|
+
if (eq >= 0) {
|
|
953
|
+
return "no";
|
|
954
|
+
}
|
|
955
|
+
return NON_CONSUMING_LONG_FLAGS.has(normalizeKubectlFlagName(token.slice(2)))
|
|
956
|
+
? "no"
|
|
957
|
+
: "maybe";
|
|
958
|
+
}
|
|
959
|
+
const body = token.slice(1);
|
|
960
|
+
for (let j = 0; j < body.length; j++) {
|
|
961
|
+
const letter = body[j];
|
|
962
|
+
if (letter === "=") {
|
|
963
|
+
return "no";
|
|
964
|
+
}
|
|
965
|
+
if (BOOLEAN_SHORT_FLAGS.has(letter)) {
|
|
966
|
+
continue;
|
|
967
|
+
}
|
|
968
|
+
if (VALUE_SHORT_FLAGS.has(letter)) {
|
|
969
|
+
// An inline value ("-lapp=web", "-nweb") leaves nothing to take.
|
|
970
|
+
return j + 1 < body.length ? "no" : "maybe";
|
|
971
|
+
}
|
|
972
|
+
return "maybe";
|
|
973
|
+
}
|
|
974
|
+
// A cluster of boolean letters only ("-A").
|
|
975
|
+
return "no";
|
|
976
|
+
}
|
|
977
|
+
const FIX_PUT_THE_NAMESPACE_FIRST = "Put the namespace first so it cannot be misread: kubectl -n <namespace> ...";
|
|
978
|
+
const FIX_NAME_THE_OBJECTS = 'Name the objects right after the verb (TYPE NAME or TYPE/NAME) and give each flag its value with "=" (--selector=app=web).';
|
|
979
|
+
const FIX_LEAVE_OUT_OVERRIDES = "Leave out --overrides and --override-type, so kubectl creates only the object the command itself describes.";
|
|
980
|
+
const FIX_NAME_EACH_NAMESPACE_OBJECT = "Name each Namespace object.";
|
|
981
|
+
const FIX_NAME_ONE_NAMESPACE = "Name one namespace with -n <namespace>.";
|
|
982
|
+
const FIX_NAME_THE_NAMESPACE = "Name the namespace with -n <namespace>.";
|
|
983
|
+
const FIX_NAME_THE_TARGET_NAMESPACE = "Name the target namespace with -n <namespace>.";
|
|
984
|
+
function normalizeNamespace(value) {
|
|
985
|
+
return (value || "").trim().toLowerCase();
|
|
986
|
+
}
|
|
987
|
+
function normalizeNamespaces(values) {
|
|
988
|
+
return (values || [])
|
|
989
|
+
.map((value) => {
|
|
990
|
+
return normalizeNamespace(value);
|
|
991
|
+
})
|
|
992
|
+
.filter((value) => {
|
|
993
|
+
return value.length > 0;
|
|
994
|
+
});
|
|
995
|
+
}
|
|
996
|
+
// The Runner's scope, in its own words, for the end of a refusal.
|
|
997
|
+
function describeRunnerScope(data) {
|
|
998
|
+
const parts = [];
|
|
999
|
+
if (data.writeNamespaces.length > 0) {
|
|
1000
|
+
parts.push(`This Runner only lets OneUptime AI change ${data.writeNamespaces
|
|
1001
|
+
.map((namespace) => {
|
|
1002
|
+
return `"${namespace}"`;
|
|
1003
|
+
})
|
|
1004
|
+
.join(", ")} (${KUBECTL_WRITE_NAMESPACES_ENV}, from aiAccess.remediation.namespaces on the Kubernetes agent chart).`);
|
|
1005
|
+
}
|
|
1006
|
+
if (data.podNamespace) {
|
|
1007
|
+
parts.push(`It never changes its own namespace "${data.podNamespace}" (${RUNNER_POD_NAMESPACE_ENV}).`);
|
|
1008
|
+
}
|
|
1009
|
+
parts.push("Reads are not restricted.");
|
|
1010
|
+
return parts.join(" ");
|
|
1011
|
+
}
|
|
1012
|
+
// A sentence and, when there is one, the fix after it.
|
|
1013
|
+
function withFix(sentence, fix) {
|
|
1014
|
+
return fix ? `${sentence} ${fix}` : sentence;
|
|
1015
|
+
}
|
|
1016
|
+
/*
|
|
1017
|
+
* A refusal in the Runner's own words. The Runner reports a node-switch
|
|
1018
|
+
* refusal with its own host's setting instead (KubectlExecutor); this
|
|
1019
|
+
* wording is the fallback that names the variable.
|
|
1020
|
+
*/
|
|
1021
|
+
function describeForRunner(refusal) {
|
|
1022
|
+
const command = refusal.displayCommand;
|
|
1023
|
+
const scope = describeRunnerScope(refusal);
|
|
1024
|
+
const target = refusal.namespace || "";
|
|
1025
|
+
switch (refusal.code) {
|
|
1026
|
+
case "node_operations":
|
|
1027
|
+
return withFix(`${refusal.uncertainty === null
|
|
1028
|
+
? `"${command}" is a node operation (cordon, uncordon, drain, taint, or a change to a Node object)`
|
|
1029
|
+
: `this Runner cannot tell for certain whether "${command}" changes a node (${refusal.uncertainty})`}, and this Runner does not allow AI-composed node operations (${KUBECTL_ALLOW_NODE_OPERATIONS_ENV}).`, refusal.fix);
|
|
1030
|
+
case "namespace_uncertain":
|
|
1031
|
+
return withFix(`this Runner cannot tell for certain which namespace "${command}" changes (${refusal.uncertainty}). ${scope}`, refusal.fix);
|
|
1032
|
+
case "objects_uncertain":
|
|
1033
|
+
return withFix(`this Runner cannot tell for certain which objects "${command}" changes (${refusal.uncertainty}). ${scope}`, refusal.fix);
|
|
1034
|
+
case "verb_mismatch":
|
|
1035
|
+
return `this 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. ${scope}`;
|
|
1036
|
+
case "unnamed_namespace_objects":
|
|
1037
|
+
return withFix(`"${command}" would change Namespace objects without naming them (a selector, --all or no name at all), so this Runner cannot tell whether one of them is ${refusal.podNamespace
|
|
1038
|
+
? `"${refusal.podNamespace}", the namespace it runs in`
|
|
1039
|
+
: "outside the namespaces it lets OneUptime AI change"}. ${scope}`, refusal.fix);
|
|
1040
|
+
case "cluster_scoped":
|
|
1041
|
+
return `"${command}" changes ${refusal.clusterScopedKinds.join(", ")} objects, which are cluster-scoped: they live outside every namespace, so outside the namespaces this Runner lets OneUptime AI change, whatever -n says. ${scope}`;
|
|
1042
|
+
case "all_namespaces":
|
|
1043
|
+
return withFix(`"${command}" would change every namespace, including ones this Runner may not change. ${scope}`, refusal.fix);
|
|
1044
|
+
case "no_namespace":
|
|
1045
|
+
return withFix(`"${command}" names no namespace and this Runner cannot tell which one it would change. ${scope}`, refusal.fix);
|
|
1046
|
+
case "own_namespace":
|
|
1047
|
+
if (refusal.namespaceSource === "namespace_object") {
|
|
1048
|
+
return `"${command}" would change the Namespace object "${target}" — the namespace this Runner itself runs in; a change there could reconfigure the Kubernetes agent or this Runner, so OneUptime AI never makes one. ${scope}`;
|
|
1049
|
+
}
|
|
1050
|
+
return withFix(`"${command}" ${refusal.namespaceSource === "namespace_flag"
|
|
1051
|
+
? `would change namespace "${target}"`
|
|
1052
|
+
: `names no namespace, so kubectl would run it in "${target}"`}, the namespace this Runner itself runs in — a change there could scale away or reconfigure the Kubernetes agent or this Runner, so OneUptime AI never makes one. ${scope}`, refusal.fix);
|
|
1053
|
+
case "outside_scope":
|
|
1054
|
+
if (refusal.namespaceSource === "namespace_object") {
|
|
1055
|
+
return `"${command}" would change the Namespace object "${target}", which is outside the namespaces this Runner lets OneUptime AI change (a Namespace object is judged by its name; -n does not apply to it). ${scope}`;
|
|
1056
|
+
}
|
|
1057
|
+
return withFix(`"${command}" ${refusal.namespaceSource === "namespace_flag"
|
|
1058
|
+
? `would change namespace "${target}"`
|
|
1059
|
+
: `names no namespace, so kubectl would run it in "${target}"`}, which is outside the namespaces this Runner lets OneUptime AI change. ${scope}`, refusal.fix);
|
|
1060
|
+
default: {
|
|
1061
|
+
const unhandled = refusal.code;
|
|
1062
|
+
return unhandled;
|
|
1063
|
+
}
|
|
1064
|
+
}
|
|
1065
|
+
}
|
|
1066
|
+
class KubectlWriteScope {
|
|
1067
|
+
/*
|
|
1068
|
+
* The namespaces an argv sets, read the way kubectl reads them, or why
|
|
1069
|
+
* that cannot be decided for certain.
|
|
1070
|
+
*/
|
|
1071
|
+
static resolveNamespaces(args) {
|
|
1072
|
+
const namespaces = [];
|
|
1073
|
+
let allNamespaces = false;
|
|
1074
|
+
// Whether the previous token might take this one as its value.
|
|
1075
|
+
let previous = "no";
|
|
1076
|
+
let afterDoubleDash = false;
|
|
1077
|
+
const ambiguous = (reason) => {
|
|
1078
|
+
return { namespaces, allNamespaces, ambiguity: reason };
|
|
1079
|
+
};
|
|
1080
|
+
for (let i = 0; i < args.length; i++) {
|
|
1081
|
+
const token = args[i];
|
|
1082
|
+
const flag = readNamespaceFlag(token);
|
|
1083
|
+
if (afterDoubleDash) {
|
|
1084
|
+
if (flag) {
|
|
1085
|
+
return ambiguous(`"${token}" comes after "--", where kubectl does not read it as a flag`);
|
|
1086
|
+
}
|
|
1087
|
+
continue;
|
|
1088
|
+
}
|
|
1089
|
+
if (token === "--") {
|
|
1090
|
+
afterDoubleDash = true;
|
|
1091
|
+
continue;
|
|
1092
|
+
}
|
|
1093
|
+
/*
|
|
1094
|
+
* Counted even when the token might be the previous flag's value:
|
|
1095
|
+
* assuming "every namespace" can only ever cost a refusal.
|
|
1096
|
+
*/
|
|
1097
|
+
if (readsAllNamespaces(token)) {
|
|
1098
|
+
allNamespaces = true;
|
|
1099
|
+
}
|
|
1100
|
+
if (!flag) {
|
|
1101
|
+
previous = mayTakeNextToken(token);
|
|
1102
|
+
continue;
|
|
1103
|
+
}
|
|
1104
|
+
if (previous === "maybe") {
|
|
1105
|
+
return ambiguous(`"${token}" follows "${args[i - 1]}", which may take it as its own value`);
|
|
1106
|
+
}
|
|
1107
|
+
if (flag.kind === "uncertain") {
|
|
1108
|
+
return ambiguous(`"${token}" combines "n" with a short flag the write scope does not know`);
|
|
1109
|
+
}
|
|
1110
|
+
if (flag.kind === "inline") {
|
|
1111
|
+
namespaces.push(flag.value);
|
|
1112
|
+
previous = "no";
|
|
1113
|
+
continue;
|
|
1114
|
+
}
|
|
1115
|
+
// "-n web" / "--namespace web": the value is the next token, whatever it is.
|
|
1116
|
+
if (i + 1 >= args.length) {
|
|
1117
|
+
return ambiguous(`"${token}" has no namespace after it`);
|
|
1118
|
+
}
|
|
1119
|
+
namespaces.push(args[i + 1]);
|
|
1120
|
+
i++;
|
|
1121
|
+
previous = "no";
|
|
1122
|
+
}
|
|
1123
|
+
return { namespaces, allNamespaces, ambiguity: null };
|
|
1124
|
+
}
|
|
1125
|
+
/*
|
|
1126
|
+
* What a write changes, read from the argv the way kubectl reads it (see
|
|
1127
|
+
* the header): whether it is a node operation, which Namespace objects
|
|
1128
|
+
* and other cluster-scoped kinds it names, and whether anything it
|
|
1129
|
+
* changes lives in a namespace. getRefusal judges both the node switch
|
|
1130
|
+
* and the namespace scope from this one reading.
|
|
1131
|
+
*/
|
|
1132
|
+
static resolveTargets(args) {
|
|
1133
|
+
const targets = {
|
|
1134
|
+
verb: "",
|
|
1135
|
+
uncertainty: null,
|
|
1136
|
+
uncertaintyFix: "",
|
|
1137
|
+
touchesNodes: false,
|
|
1138
|
+
namespaceObjects: [],
|
|
1139
|
+
unnamedNamespaceObjects: false,
|
|
1140
|
+
clusterScopedKinds: [],
|
|
1141
|
+
namespaced: false,
|
|
1142
|
+
};
|
|
1143
|
+
const reading = readPositionals(args);
|
|
1144
|
+
if (reading.uncertainty !== null) {
|
|
1145
|
+
targets.uncertainty = reading.uncertainty;
|
|
1146
|
+
targets.uncertaintyFix = FIX_NAME_THE_OBJECTS;
|
|
1147
|
+
return targets;
|
|
1148
|
+
}
|
|
1149
|
+
const positionals = reading.positionals;
|
|
1150
|
+
const verb = (positionals[0] || "").toLowerCase();
|
|
1151
|
+
targets.verb = verb;
|
|
1152
|
+
/*
|
|
1153
|
+
* --overrides decides what kubectl creates, whatever the verb and the
|
|
1154
|
+
* objects say (see OBJECT_REPLACING_FLAGS) — on every verb, not only
|
|
1155
|
+
* expose, so this reading never depends on the shared policy denying
|
|
1156
|
+
* the flag first.
|
|
1157
|
+
*/
|
|
1158
|
+
if (reading.objectReplacingFlag !== null) {
|
|
1159
|
+
targets.uncertainty = describeObjectReplacingFlag(reading.objectReplacingFlag);
|
|
1160
|
+
targets.uncertaintyFix = FIX_LEAVE_OUT_OVERRIDES;
|
|
1161
|
+
return targets;
|
|
1162
|
+
}
|
|
1163
|
+
// cordon, uncordon, drain and taint only ever act on nodes.
|
|
1164
|
+
if (NODE_VERBS.has(verb)) {
|
|
1165
|
+
targets.touchesNodes = true;
|
|
1166
|
+
return targets;
|
|
1167
|
+
}
|
|
1168
|
+
if (verb === "create") {
|
|
1169
|
+
// cobra matches subcommands case-sensitively (the policy denies others).
|
|
1170
|
+
const subcommand = positionals[1] || "";
|
|
1171
|
+
if (!hasOwn(CREATE_SUBCOMMAND_SCOPES, subcommand)) {
|
|
1172
|
+
targets.uncertainty = `"create ${subcommand}" is not a kubectl create subcommand the write scope knows`;
|
|
1173
|
+
targets.uncertaintyFix = FIX_NAME_THE_OBJECTS;
|
|
1174
|
+
return targets;
|
|
1175
|
+
}
|
|
1176
|
+
const scope = CREATE_SUBCOMMAND_SCOPES[subcommand];
|
|
1177
|
+
if (scope === "namespace-object") {
|
|
1178
|
+
const name = (positionals[2] || "").trim().toLowerCase();
|
|
1179
|
+
if (name) {
|
|
1180
|
+
targets.namespaceObjects.push(name);
|
|
1181
|
+
}
|
|
1182
|
+
else {
|
|
1183
|
+
targets.unnamedNamespaceObjects = true;
|
|
1184
|
+
}
|
|
1185
|
+
}
|
|
1186
|
+
else if (scope === "cluster-scoped") {
|
|
1187
|
+
targets.clusterScopedKinds.push(CREATE_CLUSTER_SCOPED_KINDS[subcommand] || subcommand);
|
|
1188
|
+
}
|
|
1189
|
+
else {
|
|
1190
|
+
targets.namespaced = true;
|
|
1191
|
+
}
|
|
1192
|
+
return targets;
|
|
1193
|
+
}
|
|
1194
|
+
// Any other verb acts in the namespace kubectl runs it in.
|
|
1195
|
+
if (!OBJECT_VERBS.has(verb)) {
|
|
1196
|
+
targets.namespaced = true;
|
|
1197
|
+
return targets;
|
|
1198
|
+
}
|
|
1199
|
+
const references = readObjectReferences(objectTokens(verb, positionals));
|
|
1200
|
+
if (references.uncertainty !== null) {
|
|
1201
|
+
targets.uncertainty = references.uncertainty;
|
|
1202
|
+
targets.uncertaintyFix = FIX_NAME_THE_OBJECTS;
|
|
1203
|
+
return targets;
|
|
1204
|
+
}
|
|
1205
|
+
/*
|
|
1206
|
+
* No object at all is a kubectl error; judging it as namespaced keeps
|
|
1207
|
+
* the stricter rule. expose and autoscale make a namespaced Service or
|
|
1208
|
+
* HorizontalPodAutoscaler whatever they name (--overrides, which could
|
|
1209
|
+
* make it anything else, was refused as uncertain above).
|
|
1210
|
+
*/
|
|
1211
|
+
if (references.references.length === 0 ||
|
|
1212
|
+
CREATES_NAMESPACED_OBJECT_VERBS.has(verb)) {
|
|
1213
|
+
targets.namespaced = true;
|
|
1214
|
+
}
|
|
1215
|
+
for (const reference of references.references) {
|
|
1216
|
+
const kind = clusterScopedKindOf(reference.rawKind);
|
|
1217
|
+
if (kind === null) {
|
|
1218
|
+
targets.namespaced = true;
|
|
1219
|
+
continue;
|
|
1220
|
+
}
|
|
1221
|
+
if (kind === "node") {
|
|
1222
|
+
targets.touchesNodes = true;
|
|
1223
|
+
continue;
|
|
1224
|
+
}
|
|
1225
|
+
if (kind === "namespace") {
|
|
1226
|
+
const name = (reference.name || "").trim().toLowerCase();
|
|
1227
|
+
if (!name) {
|
|
1228
|
+
targets.unnamedNamespaceObjects = true;
|
|
1229
|
+
}
|
|
1230
|
+
else if (!targets.namespaceObjects.includes(name)) {
|
|
1231
|
+
targets.namespaceObjects.push(name);
|
|
1232
|
+
}
|
|
1233
|
+
continue;
|
|
1234
|
+
}
|
|
1235
|
+
if (!targets.clusterScopedKinds.includes(kind)) {
|
|
1236
|
+
targets.clusterScopedKinds.push(kind);
|
|
1237
|
+
}
|
|
1238
|
+
}
|
|
1239
|
+
return targets;
|
|
1240
|
+
}
|
|
1241
|
+
static getFlagArity(name, verb) {
|
|
1242
|
+
return lookupFlagArity(name, verb);
|
|
1243
|
+
}
|
|
1244
|
+
static getClusterScopedKind(rawKind) {
|
|
1245
|
+
return clusterScopedKindOf(rawKind);
|
|
1246
|
+
}
|
|
1247
|
+
/*
|
|
1248
|
+
* THE write-scope question, for every caller (see the header): why the
|
|
1249
|
+
* Runner will not run this command where it lands — or null when it
|
|
1250
|
+
* will. Read commands are never refused; every other tier is judged as a
|
|
1251
|
+
* write (the policy refuses a Denied one on its own, before or after).
|
|
1252
|
+
*
|
|
1253
|
+
* In order: the node switch (a node operation, or a write whose objects
|
|
1254
|
+
* cannot be read for certain, while it is off); then, when a scope is
|
|
1255
|
+
* set at all (write namespaces, or a known pod namespace), what the write
|
|
1256
|
+
* changes — Namespace objects by name, other cluster-scoped objects
|
|
1257
|
+
* against the write-namespace list, and namespaced objects by the
|
|
1258
|
+
* namespace they land in.
|
|
1259
|
+
*/
|
|
1260
|
+
static getRefusal(input) {
|
|
1261
|
+
const command = Array.isArray(input.command)
|
|
1262
|
+
? KubectlPolicy.evaluateArgs(input.command)
|
|
1263
|
+
: input.command;
|
|
1264
|
+
if (command.tier === KubectlCommandTier.Read) {
|
|
1265
|
+
return null;
|
|
1266
|
+
}
|
|
1267
|
+
const writeNamespaces = normalizeNamespaces(input.writeNamespaces);
|
|
1268
|
+
const podNamespace = normalizeNamespace(input.podNamespace);
|
|
1269
|
+
const hasScope = writeNamespaces.length > 0 || podNamespace !== "";
|
|
1270
|
+
if (input.allowNodeOperations && !hasScope) {
|
|
1271
|
+
return null;
|
|
1272
|
+
}
|
|
1273
|
+
const refuse = (code, facts = {}) => {
|
|
1274
|
+
const refusalFacts = Object.assign({ code, displayCommand: command.displayCommand, writeNamespaces,
|
|
1275
|
+
podNamespace, namespace: null, namespaceSource: null, uncertainty: null, clusterScopedKinds: [], readVerb: "", policyVerb: "", fix: "" }, facts);
|
|
1276
|
+
return Object.assign(Object.assign({}, refusalFacts), { reason: describeForRunner(refusalFacts) });
|
|
1277
|
+
};
|
|
1278
|
+
const targets = KubectlWriteScope.resolveTargets(command.args);
|
|
1279
|
+
/*
|
|
1280
|
+
* The node switch: nodes are cluster-scoped, so no namespace scope can
|
|
1281
|
+
* bound them, and the chart's node role is optional. A write whose
|
|
1282
|
+
* objects cannot be read for certain could be a node operation, so it
|
|
1283
|
+
* is refused too.
|
|
1284
|
+
*/
|
|
1285
|
+
if (!input.allowNodeOperations &&
|
|
1286
|
+
(targets.touchesNodes || targets.uncertainty !== null)) {
|
|
1287
|
+
return refuse("node_operations", {
|
|
1288
|
+
uncertainty: targets.uncertainty,
|
|
1289
|
+
fix: targets.uncertainty === null ? "" : targets.uncertaintyFix,
|
|
1290
|
+
});
|
|
1291
|
+
}
|
|
1292
|
+
if (!hasScope) {
|
|
1293
|
+
return null;
|
|
1294
|
+
}
|
|
1295
|
+
if (targets.uncertainty !== null) {
|
|
1296
|
+
/*
|
|
1297
|
+
* A namespace flag that another flag may swallow is the usual cause
|
|
1298
|
+
* (`--selector -n web` makes "web" an object); say so, with the
|
|
1299
|
+
* spelling that cannot be misread.
|
|
1300
|
+
*/
|
|
1301
|
+
const namespaceReading = KubectlWriteScope.resolveNamespaces(command.args);
|
|
1302
|
+
if (namespaceReading.ambiguity) {
|
|
1303
|
+
return refuse("namespace_uncertain", {
|
|
1304
|
+
uncertainty: namespaceReading.ambiguity,
|
|
1305
|
+
fix: FIX_PUT_THE_NAMESPACE_FIRST,
|
|
1306
|
+
});
|
|
1307
|
+
}
|
|
1308
|
+
return refuse("objects_uncertain", {
|
|
1309
|
+
uncertainty: targets.uncertainty,
|
|
1310
|
+
fix: targets.uncertaintyFix,
|
|
1311
|
+
});
|
|
1312
|
+
}
|
|
1313
|
+
const policyVerb = (command.verb.split(" ")[0] || "").toLowerCase();
|
|
1314
|
+
if (policyVerb && policyVerb !== targets.verb) {
|
|
1315
|
+
return refuse("verb_mismatch", {
|
|
1316
|
+
readVerb: targets.verb,
|
|
1317
|
+
policyVerb,
|
|
1318
|
+
});
|
|
1319
|
+
}
|
|
1320
|
+
/*
|
|
1321
|
+
* A Namespace object is judged by its name: kubectl ignores -n for it,
|
|
1322
|
+
* so `label namespace X ... -n <allowed>` changes X.
|
|
1323
|
+
*/
|
|
1324
|
+
if (targets.unnamedNamespaceObjects) {
|
|
1325
|
+
return refuse("unnamed_namespace_objects", {
|
|
1326
|
+
fix: FIX_NAME_EACH_NAMESPACE_OBJECT,
|
|
1327
|
+
});
|
|
1328
|
+
}
|
|
1329
|
+
for (const name of targets.namespaceObjects) {
|
|
1330
|
+
if (podNamespace && name === podNamespace) {
|
|
1331
|
+
return refuse("own_namespace", {
|
|
1332
|
+
namespace: name,
|
|
1333
|
+
namespaceSource: "namespace_object",
|
|
1334
|
+
});
|
|
1335
|
+
}
|
|
1336
|
+
if (writeNamespaces.length > 0 && !writeNamespaces.includes(name)) {
|
|
1337
|
+
return refuse("outside_scope", {
|
|
1338
|
+
namespace: name,
|
|
1339
|
+
namespaceSource: "namespace_object",
|
|
1340
|
+
});
|
|
1341
|
+
}
|
|
1342
|
+
}
|
|
1343
|
+
/*
|
|
1344
|
+
* Any other cluster-scoped object lives outside every namespace, so
|
|
1345
|
+
* outside every listed one. Without a list, RBAC bounds it.
|
|
1346
|
+
*/
|
|
1347
|
+
if (targets.clusterScopedKinds.length > 0 && writeNamespaces.length > 0) {
|
|
1348
|
+
return refuse("cluster_scoped", {
|
|
1349
|
+
clusterScopedKinds: [...targets.clusterScopedKinds],
|
|
1350
|
+
});
|
|
1351
|
+
}
|
|
1352
|
+
if (!targets.namespaced) {
|
|
1353
|
+
return null;
|
|
1354
|
+
}
|
|
1355
|
+
const resolution = KubectlWriteScope.resolveNamespaces(command.args);
|
|
1356
|
+
if (resolution.ambiguity) {
|
|
1357
|
+
return refuse("namespace_uncertain", {
|
|
1358
|
+
uncertainty: resolution.ambiguity,
|
|
1359
|
+
fix: FIX_PUT_THE_NAMESPACE_FIRST,
|
|
1360
|
+
});
|
|
1361
|
+
}
|
|
1362
|
+
/*
|
|
1363
|
+
* The shared policy already denies a write across all namespaces; this
|
|
1364
|
+
* layer does not rely on that — every namespace includes the ones the
|
|
1365
|
+
* Runner may not change.
|
|
1366
|
+
*/
|
|
1367
|
+
if (resolution.allNamespaces) {
|
|
1368
|
+
return refuse("all_namespaces", { fix: FIX_NAME_ONE_NAMESPACE });
|
|
1369
|
+
}
|
|
1370
|
+
const explicit = resolution.namespaces.length > 0;
|
|
1371
|
+
const source = explicit
|
|
1372
|
+
? "namespace_flag"
|
|
1373
|
+
: "default_namespace";
|
|
1374
|
+
// What a missing -n means: see KubectlWriteScopeInput.usesCredential.
|
|
1375
|
+
const defaultNamespace = input.usesCredential
|
|
1376
|
+
? "default"
|
|
1377
|
+
: podNamespace;
|
|
1378
|
+
/*
|
|
1379
|
+
* Every namespace the argv sets, blanks kept: `-n ""` names no
|
|
1380
|
+
* namespace kubectl could be held to.
|
|
1381
|
+
*/
|
|
1382
|
+
const namespaces = explicit
|
|
1383
|
+
? resolution.namespaces.map((namespace) => {
|
|
1384
|
+
return normalizeNamespace(namespace);
|
|
1385
|
+
})
|
|
1386
|
+
: [defaultNamespace];
|
|
1387
|
+
const fix = explicit ? "" : FIX_NAME_THE_TARGET_NAMESPACE;
|
|
1388
|
+
for (const target of namespaces) {
|
|
1389
|
+
if (!target) {
|
|
1390
|
+
return refuse("no_namespace", { fix: FIX_NAME_THE_NAMESPACE });
|
|
1391
|
+
}
|
|
1392
|
+
if (podNamespace && target === podNamespace) {
|
|
1393
|
+
return refuse("own_namespace", {
|
|
1394
|
+
namespace: target,
|
|
1395
|
+
namespaceSource: source,
|
|
1396
|
+
fix,
|
|
1397
|
+
});
|
|
1398
|
+
}
|
|
1399
|
+
if (writeNamespaces.length > 0 && !writeNamespaces.includes(target)) {
|
|
1400
|
+
return refuse("outside_scope", {
|
|
1401
|
+
namespace: target,
|
|
1402
|
+
namespaceSource: source,
|
|
1403
|
+
fix,
|
|
1404
|
+
});
|
|
1405
|
+
}
|
|
1406
|
+
}
|
|
1407
|
+
return null;
|
|
1408
|
+
}
|
|
1409
|
+
}
|
|
1410
|
+
/*
|
|
1411
|
+
* Test seams, so a test can hold these tables against the shared policy's
|
|
1412
|
+
* own verdicts: every flag name this reader knows the arity of, a flag's
|
|
1413
|
+
* arity ("value", "none", or null when unknown), every kind spelling it
|
|
1414
|
+
* knows is cluster-scoped, and the cluster-scoped kind a spelling names.
|
|
1415
|
+
*/
|
|
1416
|
+
KubectlWriteScope.knownFlagNames = [
|
|
1417
|
+
...Array.from(BOOLEAN_SHORT_FLAGS),
|
|
1418
|
+
...Array.from(VALUE_SHORT_FLAGS),
|
|
1419
|
+
...Array.from(NON_CONSUMING_LONG_FLAGS),
|
|
1420
|
+
...Array.from(VALUE_LONG_FLAGS),
|
|
1421
|
+
];
|
|
1422
|
+
KubectlWriteScope.verbFlagArityOverrides = Object.entries(VERB_FLAG_ARITY_OVERRIDES).flatMap(([verb, overrides]) => {
|
|
1423
|
+
return Object.entries(overrides).map(([flag, arity]) => {
|
|
1424
|
+
return { verb, flag, arity };
|
|
1425
|
+
});
|
|
1426
|
+
});
|
|
1427
|
+
KubectlWriteScope.clusterScopedKindSpellings = Object.keys(CLUSTER_SCOPED_KIND_NAMES);
|
|
1428
|
+
export default KubectlWriteScope;
|
|
1429
|
+
//# sourceMappingURL=KubectlWriteScope.js.map
|