@oneuptime/common 14.0.9 → 14.0.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Models/DatabaseModels/AutoRemediationSuggestion.ts +60 -0
- package/Models/DatabaseModels/CephCluster.ts +213 -0
- package/Models/DatabaseModels/DatabaseServer.ts +213 -0
- package/Models/DatabaseModels/DockerHost.ts +213 -0
- package/Models/DatabaseModels/DockerSwarmCluster.ts +213 -0
- package/Models/DatabaseModels/GlobalConfig.ts +1 -1
- package/Models/DatabaseModels/Host.ts +213 -0
- package/Models/DatabaseModels/Index.ts +2 -0
- package/Models/DatabaseModels/PodmanHost.ts +213 -0
- package/Models/DatabaseModels/ProxmoxCluster.ts +213 -0
- package/Models/DatabaseModels/ResourceAiAgent.ts +419 -0
- package/Models/DatabaseModels/RunnerJob.ts +144 -0
- package/Models/DatabaseModels/VMwareVCenter.ts +213 -0
- package/Server/API/AutoRemediationAPI.ts +392 -1
- package/Server/API/ResourceAiAccessAPI.ts +1669 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1796300000000-AddResourceAiAgents.ts +423 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +2 -0
- package/Server/Infrastructure/Semaphore.ts +22 -0
- package/Server/Middleware/TelemetryIngest.ts +15 -5
- package/Server/Services/AnalyticsDatabaseService.ts +45 -1
- package/Server/Services/AutoRemediationRuleEngineService.ts +940 -112
- package/Server/Services/CephClusterService.ts +109 -1
- package/Server/Services/DatabaseServerService.ts +116 -1
- package/Server/Services/DockerHostService.ts +109 -1
- package/Server/Services/DockerSwarmClusterService.ts +113 -1
- package/Server/Services/HostService.ts +126 -4
- package/Server/Services/MetricRecordingRuleService.ts +47 -0
- package/Server/Services/PodmanHostService.ts +109 -1
- package/Server/Services/ProxmoxClusterService.ts +110 -1
- package/Server/Services/ResourceAiAccessService.ts +1439 -0
- package/Server/Services/ResourceAiAgentJobService.ts +202 -0
- package/Server/Services/ResourceAiAgentService.ts +2432 -0
- package/Server/Services/RunnerJobService.ts +611 -4
- package/Server/Services/TelemetryUsageBillingService.ts +28 -0
- package/Server/Services/TraceRecordingRuleService.ts +33 -0
- package/Server/Services/VMwareVCenterService.ts +110 -1
- package/Server/Utils/AI/Remediation/RemediationCommandTools.ts +1434 -32
- package/Server/Utils/AI/Remediation/RemediationExecutionRunner.ts +935 -21
- package/Server/Utils/AI/Remediation/RemediationPlanRunner.ts +25 -1
- package/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.ts +577 -0
- package/Server/Utils/AI/ResourceAccess/ResourceAccessContext.ts +271 -0
- package/Server/Utils/AI/ResourceAccess/ResourceAccessToolNames.ts +45 -0
- package/Server/Utils/AI/ResourceAccess/ResourceAiAccessSettings.ts +964 -0
- package/Server/Utils/AI/ResourceAccess/ResourceAiDeleteCleanup.ts +333 -0
- package/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.ts +873 -0
- package/Server/Utils/AI/SRE/AIInvestigationEngine.ts +72 -2
- package/Server/Utils/AI/SRE/AlertInvestigationRunner.ts +72 -5
- package/Server/Utils/AI/SRE/IncidentInvestigationRunner.ts +72 -5
- package/Server/Utils/AutoRemediation/CommandPlanExecutor.ts +396 -13
- package/Server/Utils/AutoRemediation/RemediationVerifier.ts +35 -2
- package/Server/Utils/Database/ProjectScopedReferenceValidator.ts +9 -1
- package/Server/Utils/SessionReplay/SessionReplayBudgetMetrics.ts +920 -0
- package/Server/Utils/SessionReplay/SessionReplayUsage.ts +84 -6
- package/Server/Utils/Workspace/MicrosoftTeams/Actions/Alert.ts +35 -15
- package/Server/Utils/Workspace/MicrosoftTeams/Actions/AlertEpisode.ts +33 -15
- package/Server/Utils/Workspace/MicrosoftTeams/Actions/Auth.ts +21 -1
- package/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.ts +298 -224
- package/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.ts +35 -15
- package/Server/Utils/Workspace/MicrosoftTeams/Actions/ScheduledMaintenance.ts +389 -175
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +366 -143
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsActivityDeduplicator.ts +163 -0
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCardChoices.ts +396 -0
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateCommands.ts +418 -0
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsMessageSize.ts +152 -0
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsReplies.ts +251 -0
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsTimezone.ts +214 -0
- package/Tests/App/Dashboard/ClusterAccessNotice.test.tsx +93 -0
- package/Tests/App/Dashboard/DatabaseDocumentationMarkdown.test.ts +18 -6
- package/Tests/App/Dashboard/InvestigationInfrastructureTools.test.tsx +506 -0
- package/Tests/App/Dashboard/RemediationSuggestionCardDescription.test.tsx +209 -0
- package/Tests/App/Dashboard/RemediationSuggestionCardResource.test.tsx +317 -0
- package/Tests/App/Dashboard/ResourceAiAccessSettingsUtil.test.ts +921 -0
- package/Tests/App/Dashboard/ResourceAiAgentInstall.test.ts +860 -0
- package/Tests/App/Dashboard/ResourceAiAgentPage.test.tsx +1721 -0
- package/Tests/App/Dashboard/ResourceAiAgentStatus.test.ts +1002 -0
- package/Tests/App/Dashboard/ResourceAiInsightsPage.test.tsx +931 -0
- package/Tests/App/Dashboard/ResourceAiNavigation.test.tsx +575 -0
- package/Tests/App/Dashboard/RunbookStepTypeMaps.test.ts +38 -7
- package/Tests/Models/DatabaseModels/DatabaseServerModels.test.ts +33 -1
- package/Tests/Models/DatabaseModels/ResourceAiAccessColumns.test.ts +738 -0
- package/Tests/Models/DatabaseModels/ResourceAiAgentModel.test.ts +842 -0
- package/Tests/Server/API/AutoRemediationApproveResourceRound.test.ts +835 -0
- package/Tests/Server/API/ResourceAiAccessAPI.test.ts +2730 -0
- package/Tests/Server/Infrastructure/Postgres/AddDatabaseServerTablesMigration.test.ts +60 -0
- package/Tests/Server/Infrastructure/Postgres/AddResourceAiAgentsMigration.test.ts +659 -0
- package/Tests/Server/Infrastructure/SemaphoreMutex.test.ts +31 -0
- package/Tests/Server/Middleware/TelemetryIngestBrowserKey.test.ts +63 -5
- package/Tests/Server/Middleware/TelemetryIngestKubernetesAgentRunnerPinnedKey.test.ts +103 -5
- package/Tests/Server/Middleware/TelemetryIngestKubernetesAgentRunnerRateLimit.test.ts +19 -1
- package/Tests/Server/Services/AutoRemediationResourceRuleEngine.test.ts +1279 -0
- package/Tests/Server/Services/DatabaseServerService.test.ts +55 -0
- package/Tests/Server/Services/GroupTelemetryUsageExcludeNames.test.ts +299 -0
- package/Tests/Server/Services/HostServiceFindOrCreateMemo.test.ts +44 -0
- package/Tests/Server/Services/MonitorProbeServiceIntervalScheduling.test.ts +45 -6
- package/Tests/Server/Services/RecordingRuleReservedMetricName.test.ts +171 -0
- package/Tests/Server/Services/ResourceAiAccessChangeAuthorization.test.ts +256 -0
- package/Tests/Server/Services/ResourceAiAccessService.test.ts +1373 -0
- package/Tests/Server/Services/ResourceAiAgentJobService.test.ts +375 -0
- package/Tests/Server/Services/ResourceAiAgentServiceHelpers.test.ts +1114 -0
- package/Tests/Server/Services/ResourceAiAgentServiceLifecycle.test.ts +1050 -0
- package/Tests/Server/Services/ResourceAiAgentServiceRegister.test.ts +2251 -0
- package/Tests/Server/Services/ResourceAiSettingsCreate.test.ts +373 -0
- package/Tests/Server/Services/ResourceAiSettingsPermission.test.ts +1042 -0
- package/Tests/Server/Services/ResourceServiceDeleteCleansUpAi.test.ts +319 -0
- package/Tests/Server/Services/RunnerJobEnqueueKubectl.test.ts +105 -0
- package/Tests/Server/Services/RunnerJobEnqueueResourceCommand.test.ts +986 -0
- package/Tests/Server/Services/RunnerJobResourceCommandLane.test.ts +211 -0
- package/Tests/Server/Services/RunnerJobResourceCommandTimeoutAndRedaction.test.ts +352 -0
- package/Tests/Server/Services/TelemetryUsageBillingSloExclusion.test.ts +218 -0
- package/Tests/Server/TestingUtils/Services/FakeRunnerJobCount.ts +145 -0
- package/Tests/Server/Utils/AI/InvestigationInfrastructureAccessWiring.test.ts +453 -0
- package/Tests/Server/Utils/AI/InvestigationInfrastructureReport.test.ts +721 -0
- package/Tests/Server/Utils/AI/RemediationCommandTools.test.ts +94 -1
- package/Tests/Server/Utils/AI/RemediationCommandToolsResource.test.ts +1530 -0
- package/Tests/Server/Utils/AI/RemediationExecutionRunnerResourceMode.test.ts +1249 -0
- package/Tests/Server/Utils/AI/RemediationPlanRunner.test.ts +117 -0
- package/Tests/Server/Utils/AI/RemediationResourceCopyParity.test.ts +463 -0
- package/Tests/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.test.ts +722 -0
- package/Tests/Server/Utils/AI/ResourceAccess/ResourceAccessContext.test.ts +266 -0
- package/Tests/Server/Utils/AI/ResourceAccess/ResourceAiAccessSettings.test.ts +1220 -0
- package/Tests/Server/Utils/AI/ResourceAccess/ResourceAiDeleteCleanup.test.ts +569 -0
- package/Tests/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.test.ts +830 -0
- package/Tests/Server/Utils/AutoRemediation/CommandPlanExecutorResource.test.ts +717 -0
- package/Tests/Server/Utils/AutoRemediation/RemediationVerifierResourceFollowUp.test.ts +338 -0
- package/Tests/Server/Utils/Monitor/Criteria/SessionReplayBudgetTemplateCriteria.test.ts +422 -0
- package/Tests/Server/Utils/SessionReplay/SessionReplayBudgetMetrics.test.ts +1647 -0
- package/Tests/Server/Utils/SessionReplay/SessionReplayUsage.test.ts +143 -1
- package/Tests/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.test.ts +33 -3
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsAccountNotLinked.test.ts +1093 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsActivityDeduplicator.test.ts +1049 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCardChoices.test.ts +1676 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateCards.test.ts +2884 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateCommands.test.ts +2490 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateSubmit.test.ts +2293 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateSubmitServerTimezone.test.ts +386 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsMessageSize.test.ts +1477 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsReplies.test.ts +1967 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsStripHtmlTags.test.ts +92 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsSubmittedFormRemoval.test.ts +1819 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsTimezone.test.ts +1033 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsTimezoneServerZone.test.ts +610 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsBotMessageHandling.test.ts +2610 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsCreateCommandsEndToEnd.test.ts +4672 -0
- package/Tests/Server/Utils/Workspace/WorkspaceCreateProjectReferences.test.ts +190 -65
- package/Tests/Types/AutoRemediation/AiRemediationCommandPlan.test.ts +10 -4
- package/Tests/Types/AutoRemediation/AiRemediationCommandPlanResourceCommand.test.ts +305 -0
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCatalog.test.ts +277 -13
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationUtil.test.ts +113 -0
- package/Tests/Types/Monitor/RumAlertTemplates.test.ts +773 -2
- package/Tests/Types/ResourceAiAgent/AiResourceType.test.ts +419 -0
- package/Tests/Types/ResourceAiAgent/ResourceAiAccess.test.ts +517 -0
- package/Tests/Types/Runbook/RunbookStepType.test.ts +147 -8
- package/Tests/UI/Rum/RecordingHealthDashboard.test.tsx +769 -1
- package/Tests/Utils/AiRemediation/Resource/CephCommandPolicy.test.ts +1653 -0
- package/Tests/Utils/AiRemediation/Resource/CephOutputRedaction.test.ts +204 -0
- package/Tests/Utils/AiRemediation/Resource/DatabaseCommandPolicy.test.ts +1077 -0
- package/Tests/Utils/AiRemediation/Resource/DatabaseDiagnosticCatalog.test.ts +558 -0
- package/Tests/Utils/AiRemediation/Resource/DatabaseQueryRedactor.test.ts +834 -0
- package/Tests/Utils/AiRemediation/Resource/DockerCliGrammar.test.ts +747 -0
- package/Tests/Utils/AiRemediation/Resource/DockerEngineCommandPolicy.test.ts +1259 -0
- package/Tests/Utils/AiRemediation/Resource/DockerOutputRedaction.test.ts +386 -0
- package/Tests/Utils/AiRemediation/Resource/DockerSwarmCommandPolicy.test.ts +782 -0
- package/Tests/Utils/AiRemediation/Resource/GovcCommandPolicy.test.ts +2259 -0
- package/Tests/Utils/AiRemediation/Resource/HostCommandPolicy.test.ts +2019 -0
- package/Tests/Utils/AiRemediation/Resource/ProxmoxCommandPolicy.test.ts +2497 -0
- package/Tests/Utils/AiRemediation/Resource/ResourceCommandPolicy.test.ts +1305 -0
- package/Tests/Utils/AiRemediation/Resource/ResourceCommandPolicyCore.test.ts +585 -0
- package/Tests/Utils/AiRemediation/Resource/ResourceOutputRedactor.test.ts +334 -0
- package/Tests/Utils/AiRemediation/Resource/ResourceOutputRedactorCopyParity.test.ts +98 -0
- package/Tests/Utils/AiRemediation/Resource/ResourcePolicyImportClosure.test.ts +391 -0
- package/Tests/Utils/AiRemediation/ResourceAiAgentPolicyCopyParity.test.ts +497 -0
- package/Tests/Utils/SessionReplay/SessionReplayBudgetMetricType.test.ts +383 -0
- package/Types/AI/ResourceAiAccessApi.ts +140 -0
- package/Types/AI/ResourceAiAccessPermissions.ts +126 -0
- package/Types/AutoRemediation/AiRemediationCommandPlan.ts +183 -2
- package/Types/Monitor/Recommendation/MonitorRecommendationCatalog.ts +55 -22
- package/Types/Monitor/Recommendation/MonitorRecommendationTypes.ts +35 -3
- package/Types/Monitor/RumAlertTemplates.ts +351 -4
- package/Types/ResourceAiAgent/AiResourceType.ts +310 -0
- package/Types/ResourceAiAgent/ResourceAiAccess.ts +574 -0
- package/Types/Rum/SessionReplayBudgetMetricType.ts +47 -0
- package/Types/Runbook/RunbookStepType.ts +29 -0
- package/Types/Telemetry/TelemetryIngestSurface.ts +14 -2
- package/Utils/AI/InvestigationReport.ts +121 -15
- package/Utils/AiRemediation/Resource/CephCommandPolicy.ts +1936 -0
- package/Utils/AiRemediation/Resource/DatabaseCommandPolicy.ts +166 -0
- package/Utils/AiRemediation/Resource/DatabaseDiagnosticCatalog.ts +1532 -0
- package/Utils/AiRemediation/Resource/DatabaseQueryRedactor.ts +1394 -0
- package/Utils/AiRemediation/Resource/DockerCliGrammar.ts +1839 -0
- package/Utils/AiRemediation/Resource/DockerEngineCommandPolicy.ts +490 -0
- package/Utils/AiRemediation/Resource/DockerSwarmCommandPolicy.ts +687 -0
- package/Utils/AiRemediation/Resource/GovcCommandPolicy.ts +2096 -0
- package/Utils/AiRemediation/Resource/HostCommandPolicy.ts +2982 -0
- package/Utils/AiRemediation/Resource/ProxmoxCommandPolicy.ts +1679 -0
- package/Utils/AiRemediation/Resource/ResourceCommandPolicy.ts +851 -0
- package/Utils/AiRemediation/Resource/ResourceCommandPolicyCore.ts +593 -0
- package/Utils/AiRemediation/Resource/ResourceOutputRedactor.ts +2812 -0
- package/Utils/SessionReplay/SessionReplayBudgetMetricType.ts +184 -0
- package/build/dist/Models/DatabaseModels/AutoRemediationSuggestion.js +62 -0
- package/build/dist/Models/DatabaseModels/AutoRemediationSuggestion.js.map +1 -1
- package/build/dist/Models/DatabaseModels/CephCluster.js +219 -0
- package/build/dist/Models/DatabaseModels/CephCluster.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DatabaseServer.js +219 -0
- package/build/dist/Models/DatabaseModels/DatabaseServer.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DockerHost.js +219 -0
- package/build/dist/Models/DatabaseModels/DockerHost.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DockerSwarmCluster.js +219 -0
- package/build/dist/Models/DatabaseModels/DockerSwarmCluster.js.map +1 -1
- package/build/dist/Models/DatabaseModels/GlobalConfig.js +1 -1
- package/build/dist/Models/DatabaseModels/GlobalConfig.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Host.js +219 -0
- package/build/dist/Models/DatabaseModels/Host.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +2 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/PodmanHost.js +219 -0
- package/build/dist/Models/DatabaseModels/PodmanHost.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ProxmoxCluster.js +219 -0
- package/build/dist/Models/DatabaseModels/ProxmoxCluster.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ResourceAiAgent.js +439 -0
- package/build/dist/Models/DatabaseModels/ResourceAiAgent.js.map +1 -0
- package/build/dist/Models/DatabaseModels/RunnerJob.js +145 -0
- package/build/dist/Models/DatabaseModels/RunnerJob.js.map +1 -1
- package/build/dist/Models/DatabaseModels/VMwareVCenter.js +219 -0
- package/build/dist/Models/DatabaseModels/VMwareVCenter.js.map +1 -1
- package/build/dist/Server/API/AutoRemediationAPI.js +231 -1
- package/build/dist/Server/API/AutoRemediationAPI.js.map +1 -1
- package/build/dist/Server/API/ResourceAiAccessAPI.js +1119 -0
- package/build/dist/Server/API/ResourceAiAccessAPI.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796300000000-AddResourceAiAgents.js +168 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796300000000-AddResourceAiAgents.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +2 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Infrastructure/Semaphore.js +6 -0
- package/build/dist/Server/Infrastructure/Semaphore.js.map +1 -1
- package/build/dist/Server/Middleware/TelemetryIngest.js +12 -5
- package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
- package/build/dist/Server/Services/AnalyticsDatabaseService.js +26 -1
- package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
- package/build/dist/Server/Services/AutoRemediationRuleEngineService.js +601 -3
- package/build/dist/Server/Services/AutoRemediationRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CephClusterService.js +104 -0
- package/build/dist/Server/Services/CephClusterService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseServerService.js +99 -0
- package/build/dist/Server/Services/DatabaseServerService.js.map +1 -1
- package/build/dist/Server/Services/DockerHostService.js +104 -0
- package/build/dist/Server/Services/DockerHostService.js.map +1 -1
- package/build/dist/Server/Services/DockerSwarmClusterService.js +104 -0
- package/build/dist/Server/Services/DockerSwarmClusterService.js.map +1 -1
- package/build/dist/Server/Services/HostService.js +114 -2
- package/build/dist/Server/Services/HostService.js.map +1 -1
- package/build/dist/Server/Services/MetricRecordingRuleService.js +46 -0
- package/build/dist/Server/Services/MetricRecordingRuleService.js.map +1 -1
- package/build/dist/Server/Services/PodmanHostService.js +104 -0
- package/build/dist/Server/Services/PodmanHostService.js.map +1 -1
- package/build/dist/Server/Services/ProxmoxClusterService.js +104 -0
- package/build/dist/Server/Services/ProxmoxClusterService.js.map +1 -1
- package/build/dist/Server/Services/ResourceAiAccessService.js +1028 -0
- package/build/dist/Server/Services/ResourceAiAccessService.js.map +1 -0
- package/build/dist/Server/Services/ResourceAiAgentJobService.js +173 -0
- package/build/dist/Server/Services/ResourceAiAgentJobService.js.map +1 -0
- package/build/dist/Server/Services/ResourceAiAgentService.js +1687 -0
- package/build/dist/Server/Services/ResourceAiAgentService.js.map +1 -0
- package/build/dist/Server/Services/RunnerJobService.js +344 -5
- package/build/dist/Server/Services/RunnerJobService.js.map +1 -1
- package/build/dist/Server/Services/TelemetryUsageBillingService.js +26 -0
- package/build/dist/Server/Services/TelemetryUsageBillingService.js.map +1 -1
- package/build/dist/Server/Services/TraceRecordingRuleService.js +37 -0
- package/build/dist/Server/Services/TraceRecordingRuleService.js.map +1 -1
- package/build/dist/Server/Services/VMwareVCenterService.js +104 -0
- package/build/dist/Server/Services/VMwareVCenterService.js.map +1 -1
- package/build/dist/Server/Utils/AI/Remediation/RemediationCommandTools.js +1029 -30
- package/build/dist/Server/Utils/AI/Remediation/RemediationCommandTools.js.map +1 -1
- package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js +633 -28
- package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/Remediation/RemediationPlanRunner.js +21 -1
- package/build/dist/Server/Utils/AI/Remediation/RemediationPlanRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.js +330 -0
- package/build/dist/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.js.map +1 -0
- package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAccessContext.js +160 -0
- package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAccessContext.js.map +1 -0
- package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAccessToolNames.js +33 -0
- package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAccessToolNames.js.map +1 -0
- package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAiAccessSettings.js +640 -0
- package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAiAccessSettings.js.map +1 -0
- package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAiDeleteCleanup.js +226 -0
- package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAiDeleteCleanup.js.map +1 -0
- package/build/dist/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.js +600 -0
- package/build/dist/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js +50 -4
- package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js +55 -4
- package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js +55 -4
- package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js.map +1 -1
- package/build/dist/Server/Utils/AutoRemediation/CommandPlanExecutor.js +290 -13
- package/build/dist/Server/Utils/AutoRemediation/CommandPlanExecutor.js.map +1 -1
- package/build/dist/Server/Utils/AutoRemediation/RemediationVerifier.js +29 -1
- package/build/dist/Server/Utils/AutoRemediation/RemediationVerifier.js.map +1 -1
- package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js +9 -1
- package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js.map +1 -1
- package/build/dist/Server/Utils/SessionReplay/SessionReplayBudgetMetrics.js +627 -0
- package/build/dist/Server/Utils/SessionReplay/SessionReplayBudgetMetrics.js.map +1 -0
- package/build/dist/Server/Utils/SessionReplay/SessionReplayUsage.js +60 -5
- package/build/dist/Server/Utils/SessionReplay/SessionReplayUsage.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Alert.js +19 -15
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Alert.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/AlertEpisode.js +19 -15
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/AlertEpisode.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Auth.js +17 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Auth.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.js +183 -209
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.js +19 -15
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/ScheduledMaintenance.js +233 -167
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/ScheduledMaintenance.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +263 -110
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsActivityDeduplicator.js +129 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsActivityDeduplicator.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCardChoices.js +266 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCardChoices.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateCommands.js +258 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateCommands.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsMessageSize.js +104 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsMessageSize.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsReplies.js +183 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsReplies.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsTimezone.js +123 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsTimezone.js.map +1 -0
- package/build/dist/Types/AI/ResourceAiAccessApi.js +30 -0
- package/build/dist/Types/AI/ResourceAiAccessApi.js.map +1 -0
- package/build/dist/Types/AI/ResourceAiAccessPermissions.js +98 -0
- package/build/dist/Types/AI/ResourceAiAccessPermissions.js.map +1 -0
- package/build/dist/Types/AutoRemediation/AiRemediationCommandPlan.js +116 -29
- package/build/dist/Types/AutoRemediation/AiRemediationCommandPlan.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js +47 -21
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js +5 -0
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js.map +1 -1
- package/build/dist/Types/Monitor/RumAlertTemplates.js +199 -3
- package/build/dist/Types/Monitor/RumAlertTemplates.js.map +1 -1
- package/build/dist/Types/ResourceAiAgent/AiResourceType.js +242 -0
- package/build/dist/Types/ResourceAiAgent/AiResourceType.js.map +1 -0
- package/build/dist/Types/ResourceAiAgent/ResourceAiAccess.js +275 -0
- package/build/dist/Types/ResourceAiAgent/ResourceAiAccess.js.map +1 -0
- package/build/dist/Types/Rum/SessionReplayBudgetMetricType.js +45 -0
- package/build/dist/Types/Rum/SessionReplayBudgetMetricType.js.map +1 -0
- package/build/dist/Types/Runbook/RunbookStepType.js +27 -0
- package/build/dist/Types/Runbook/RunbookStepType.js.map +1 -1
- package/build/dist/Types/Telemetry/TelemetryIngestSurface.js +13 -2
- package/build/dist/Types/Telemetry/TelemetryIngestSurface.js.map +1 -1
- package/build/dist/Utils/AI/InvestigationReport.js +71 -11
- package/build/dist/Utils/AI/InvestigationReport.js.map +1 -1
- package/build/dist/Utils/AiRemediation/Resource/CephCommandPolicy.js +1462 -0
- package/build/dist/Utils/AiRemediation/Resource/CephCommandPolicy.js.map +1 -0
- package/build/dist/Utils/AiRemediation/Resource/DatabaseCommandPolicy.js +122 -0
- package/build/dist/Utils/AiRemediation/Resource/DatabaseCommandPolicy.js.map +1 -0
- package/build/dist/Utils/AiRemediation/Resource/DatabaseDiagnosticCatalog.js +1139 -0
- package/build/dist/Utils/AiRemediation/Resource/DatabaseDiagnosticCatalog.js.map +1 -0
- package/build/dist/Utils/AiRemediation/Resource/DatabaseQueryRedactor.js +1060 -0
- package/build/dist/Utils/AiRemediation/Resource/DatabaseQueryRedactor.js.map +1 -0
- package/build/dist/Utils/AiRemediation/Resource/DockerCliGrammar.js +1301 -0
- package/build/dist/Utils/AiRemediation/Resource/DockerCliGrammar.js.map +1 -0
- package/build/dist/Utils/AiRemediation/Resource/DockerEngineCommandPolicy.js +370 -0
- package/build/dist/Utils/AiRemediation/Resource/DockerEngineCommandPolicy.js.map +1 -0
- package/build/dist/Utils/AiRemediation/Resource/DockerSwarmCommandPolicy.js +498 -0
- package/build/dist/Utils/AiRemediation/Resource/DockerSwarmCommandPolicy.js.map +1 -0
- package/build/dist/Utils/AiRemediation/Resource/GovcCommandPolicy.js +1565 -0
- package/build/dist/Utils/AiRemediation/Resource/GovcCommandPolicy.js.map +1 -0
- package/build/dist/Utils/AiRemediation/Resource/HostCommandPolicy.js +2206 -0
- package/build/dist/Utils/AiRemediation/Resource/HostCommandPolicy.js.map +1 -0
- package/build/dist/Utils/AiRemediation/Resource/ProxmoxCommandPolicy.js +1129 -0
- package/build/dist/Utils/AiRemediation/Resource/ProxmoxCommandPolicy.js.map +1 -0
- package/build/dist/Utils/AiRemediation/Resource/ResourceCommandPolicy.js +565 -0
- package/build/dist/Utils/AiRemediation/Resource/ResourceCommandPolicy.js.map +1 -0
- package/build/dist/Utils/AiRemediation/Resource/ResourceCommandPolicyCore.js +408 -0
- package/build/dist/Utils/AiRemediation/Resource/ResourceCommandPolicyCore.js.map +1 -0
- package/build/dist/Utils/AiRemediation/Resource/ResourceOutputRedactor.js +1910 -0
- package/build/dist/Utils/AiRemediation/Resource/ResourceOutputRedactor.js.map +1 -0
- package/build/dist/Utils/SessionReplay/SessionReplayBudgetMetricType.js +160 -0
- package/build/dist/Utils/SessionReplay/SessionReplayBudgetMetricType.js.map +1 -0
- package/package.json +1 -1
|
@@ -22,10 +22,12 @@ import MonitorService from "../../../../Server/Services/MonitorService";
|
|
|
22
22
|
import MonitorStatusService from "../../../../Server/Services/MonitorStatusService";
|
|
23
23
|
import OnCallDutyPolicyService from "../../../../Server/Services/OnCallDutyPolicyService";
|
|
24
24
|
import ScheduledMaintenanceService from "../../../../Server/Services/ScheduledMaintenanceService";
|
|
25
|
+
import { ProjectScopedReferenceException } from "../../../../Server/Utils/Database/ProjectScopedReferenceValidator";
|
|
25
26
|
import {
|
|
26
27
|
ExpressRequest,
|
|
27
28
|
ExpressResponse,
|
|
28
29
|
} from "../../../../Server/Utils/Express";
|
|
30
|
+
import logger from "../../../../Server/Utils/Logger";
|
|
29
31
|
import Response from "../../../../Server/Utils/Response";
|
|
30
32
|
import {
|
|
31
33
|
MicrosoftTeamsIncidentActionType,
|
|
@@ -45,6 +47,7 @@ import WorkspaceActionAuthorization from "../../../../Server/Utils/Workspace/Wor
|
|
|
45
47
|
import WorkspaceProjectReferenceValidator from "../../../../Server/Utils/Workspace/WorkspaceProjectReferenceValidator";
|
|
46
48
|
import URL from "../../../../Types/API/URL";
|
|
47
49
|
import DatabaseCommonInteractionProps from "../../../../Types/BaseDatabase/DatabaseCommonInteractionProps";
|
|
50
|
+
import BadDataException from "../../../../Types/Exception/BadDataException";
|
|
48
51
|
import ObjectID from "../../../../Types/ObjectID";
|
|
49
52
|
|
|
50
53
|
/*
|
|
@@ -53,11 +56,18 @@ import ObjectID from "../../../../Types/ObjectID";
|
|
|
53
56
|
* client, not by the form we rendered, so a user linked to one project could
|
|
54
57
|
* send another project's monitors, labels, on-call policies or monitor status.
|
|
55
58
|
* Teams then wrote currentMonitorStatusId onto every submitted monitor by id
|
|
56
|
-
* alone, changing another project's monitors.
|
|
59
|
+
* alone, changing another project's monitors. Teams now hands the status to
|
|
60
|
+
* the incident or event (changeMonitorStatusToId), as Slack and the dashboard
|
|
61
|
+
* do, and the service applies it to the validated monitors.
|
|
57
62
|
*
|
|
58
63
|
* These tests run the real ProjectScopedReferenceValidator and only stub the
|
|
59
64
|
* lookups it makes, so a foreign or unknown id has to be caught by the actual
|
|
60
65
|
* check before anything is created or written.
|
|
66
|
+
*
|
|
67
|
+
* The refusal is a ProjectScopedReferenceException: still a BadDataException
|
|
68
|
+
* with the message it always had, which the API and Slack pass on as before.
|
|
69
|
+
* That message names the other project's records, so Teams answers with a
|
|
70
|
+
* fixed line instead and leaves the message to its error log.
|
|
61
71
|
*/
|
|
62
72
|
|
|
63
73
|
const PROJECT_ID: ObjectID = new ObjectID(
|
|
@@ -83,14 +93,28 @@ const CREATED_ID: ObjectID = new ObjectID(
|
|
|
83
93
|
"a2eb67d4-bd2e-4186-9187-dad799c9316c",
|
|
84
94
|
);
|
|
85
95
|
|
|
96
|
+
// The other project's records, by the names a refusal gives them.
|
|
97
|
+
const FOREIGN_MONITOR_NAME: string = "Acme Corp payroll API";
|
|
98
|
+
const FOREIGN_LABEL_NAME: string = "acme-corp-payroll";
|
|
99
|
+
const FOREIGN_POLICY_NAME: string = "Acme Corp executives on call";
|
|
100
|
+
const FOREIGN_STATUS_NAME: string = "Acme Corp degraded";
|
|
101
|
+
|
|
102
|
+
/*
|
|
103
|
+
* What Microsoft Teams answers a submit that references a record the project
|
|
104
|
+
* does not have. It names no record.
|
|
105
|
+
*/
|
|
106
|
+
const UNAVAILABLE_REFERENCE_REASON: string =
|
|
107
|
+
"One of the values you picked (a monitor, label, on-call policy, severity or status) is not available in this project any more. Please pick it again.";
|
|
108
|
+
|
|
86
109
|
function withProject<T extends DatabaseBaseModel>(
|
|
87
110
|
model: T,
|
|
88
111
|
id: string,
|
|
89
112
|
projectId: ObjectID,
|
|
113
|
+
name?: string | undefined,
|
|
90
114
|
): T {
|
|
91
115
|
model._id = id;
|
|
92
116
|
model.setValue("projectId", projectId);
|
|
93
|
-
model.setValue("name", `record ${id}`);
|
|
117
|
+
model.setValue("name", name || `record ${id}`);
|
|
94
118
|
return model;
|
|
95
119
|
}
|
|
96
120
|
|
|
@@ -105,14 +129,24 @@ function registerRecords(): void {
|
|
|
105
129
|
records: [
|
|
106
130
|
withProject(new Monitor(), OWN_MONITOR_ID, PROJECT_ID),
|
|
107
131
|
withProject(new Monitor(), SECOND_OWN_MONITOR_ID, PROJECT_ID),
|
|
108
|
-
withProject(
|
|
132
|
+
withProject(
|
|
133
|
+
new Monitor(),
|
|
134
|
+
FOREIGN_MONITOR_ID,
|
|
135
|
+
OTHER_PROJECT_ID,
|
|
136
|
+
FOREIGN_MONITOR_NAME,
|
|
137
|
+
),
|
|
109
138
|
],
|
|
110
139
|
},
|
|
111
140
|
{
|
|
112
141
|
service: LabelService,
|
|
113
142
|
records: [
|
|
114
143
|
withProject(new Label(), OWN_LABEL_ID, PROJECT_ID),
|
|
115
|
-
withProject(
|
|
144
|
+
withProject(
|
|
145
|
+
new Label(),
|
|
146
|
+
FOREIGN_LABEL_ID,
|
|
147
|
+
OTHER_PROJECT_ID,
|
|
148
|
+
FOREIGN_LABEL_NAME,
|
|
149
|
+
),
|
|
116
150
|
],
|
|
117
151
|
},
|
|
118
152
|
{
|
|
@@ -123,6 +157,7 @@ function registerRecords(): void {
|
|
|
123
157
|
new OnCallDutyPolicy(),
|
|
124
158
|
FOREIGN_POLICY_ID,
|
|
125
159
|
OTHER_PROJECT_ID,
|
|
160
|
+
FOREIGN_POLICY_NAME,
|
|
126
161
|
),
|
|
127
162
|
],
|
|
128
163
|
},
|
|
@@ -130,7 +165,12 @@ function registerRecords(): void {
|
|
|
130
165
|
service: MonitorStatusService,
|
|
131
166
|
records: [
|
|
132
167
|
withProject(new MonitorStatus(), OWN_STATUS_ID, PROJECT_ID),
|
|
133
|
-
withProject(
|
|
168
|
+
withProject(
|
|
169
|
+
new MonitorStatus(),
|
|
170
|
+
FOREIGN_STATUS_ID,
|
|
171
|
+
OTHER_PROJECT_ID,
|
|
172
|
+
FOREIGN_STATUS_NAME,
|
|
173
|
+
),
|
|
134
174
|
],
|
|
135
175
|
},
|
|
136
176
|
];
|
|
@@ -183,24 +223,20 @@ function relationIds(
|
|
|
183
223
|
});
|
|
184
224
|
}
|
|
185
225
|
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
226
|
+
/*
|
|
227
|
+
* The chosen monitor status travels on the created incident or event, for
|
|
228
|
+
* IncidentService / ScheduledMaintenanceService to apply to its (validated)
|
|
229
|
+
* monitors with a status timeline entry. Nothing is written to a monitor
|
|
230
|
+
* directly any more.
|
|
231
|
+
*/
|
|
232
|
+
function expectStatusChangeHandedToService(
|
|
233
|
+
writes: WriteSpies,
|
|
234
|
+
created: Incident | ScheduledMaintenance,
|
|
189
235
|
statusId: string,
|
|
190
236
|
): void {
|
|
191
|
-
expect(
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
const args: Parameters<typeof MonitorService.updateOneBy>[0] =
|
|
195
|
-
updateOneBy.mock.calls[index]![0];
|
|
196
|
-
|
|
197
|
-
expect(args.query).toEqual({
|
|
198
|
-
_id: monitorId,
|
|
199
|
-
projectId: PROJECT_ID,
|
|
200
|
-
});
|
|
201
|
-
expect(String(args.data.currentMonitorStatusId)).toBe(statusId);
|
|
202
|
-
expect(args.props).toEqual({ isRoot: true });
|
|
203
|
-
});
|
|
237
|
+
expect(created.changeMonitorStatusToId?.toString()).toBe(statusId);
|
|
238
|
+
expect(writes.updateOneBy).not.toHaveBeenCalled();
|
|
239
|
+
expect(writes.updateOneById).not.toHaveBeenCalled();
|
|
204
240
|
}
|
|
205
241
|
|
|
206
242
|
function createTurnContext(): TurnContext {
|
|
@@ -219,14 +255,22 @@ function sentMessages(turnContext: TurnContext): Array<string> {
|
|
|
219
255
|
);
|
|
220
256
|
}
|
|
221
257
|
|
|
222
|
-
|
|
223
|
-
|
|
258
|
+
// The ids a submitted card or view carries, as the client sends them.
|
|
259
|
+
type ReferenceChoice = {
|
|
224
260
|
monitors: string;
|
|
225
261
|
monitorStatus: string;
|
|
226
262
|
labels: string;
|
|
227
263
|
onCallDutyPolicies: string;
|
|
228
264
|
};
|
|
229
265
|
|
|
266
|
+
type ForeignReferenceCase = ReferenceChoice & {
|
|
267
|
+
name: string;
|
|
268
|
+
// What the validator says of the bad reference, after "This <subject> ".
|
|
269
|
+
refusal: string;
|
|
270
|
+
// What identifies the bad record: its name and id. Never shown in chat.
|
|
271
|
+
identifying: Array<string>;
|
|
272
|
+
};
|
|
273
|
+
|
|
230
274
|
// One foreign (or unknown) id at a time; everything else stays valid.
|
|
231
275
|
const INCIDENT_BAD_REFERENCES: ReadonlyArray<ForeignReferenceCase> = [
|
|
232
276
|
{
|
|
@@ -235,6 +279,8 @@ const INCIDENT_BAD_REFERENCES: ReadonlyArray<ForeignReferenceCase> = [
|
|
|
235
279
|
monitorStatus: OWN_STATUS_ID,
|
|
236
280
|
labels: OWN_LABEL_ID,
|
|
237
281
|
onCallDutyPolicies: OWN_POLICY_ID,
|
|
282
|
+
refusal: `references records that belong to a different project: Monitor "${FOREIGN_MONITOR_NAME}". Please pick values from this project and try again.`,
|
|
283
|
+
identifying: [FOREIGN_MONITOR_NAME, FOREIGN_MONITOR_ID],
|
|
238
284
|
},
|
|
239
285
|
{
|
|
240
286
|
name: "a monitor id that does not exist",
|
|
@@ -242,6 +288,8 @@ const INCIDENT_BAD_REFERENCES: ReadonlyArray<ForeignReferenceCase> = [
|
|
|
242
288
|
monitorStatus: OWN_STATUS_ID,
|
|
243
289
|
labels: OWN_LABEL_ID,
|
|
244
290
|
onCallDutyPolicies: OWN_POLICY_ID,
|
|
291
|
+
refusal: `references records that do not exist: Monitor "${UNKNOWN_ID}". Please pick values that exist in this project and try again.`,
|
|
292
|
+
identifying: [UNKNOWN_ID],
|
|
245
293
|
},
|
|
246
294
|
{
|
|
247
295
|
name: "a monitor status from another project",
|
|
@@ -249,6 +297,8 @@ const INCIDENT_BAD_REFERENCES: ReadonlyArray<ForeignReferenceCase> = [
|
|
|
249
297
|
monitorStatus: FOREIGN_STATUS_ID,
|
|
250
298
|
labels: OWN_LABEL_ID,
|
|
251
299
|
onCallDutyPolicies: OWN_POLICY_ID,
|
|
300
|
+
refusal: `references records that belong to a different project: Monitor Status "${FOREIGN_STATUS_NAME}". Please pick values from this project and try again.`,
|
|
301
|
+
identifying: [FOREIGN_STATUS_NAME, FOREIGN_STATUS_ID],
|
|
252
302
|
},
|
|
253
303
|
{
|
|
254
304
|
name: "a label from another project",
|
|
@@ -256,6 +306,8 @@ const INCIDENT_BAD_REFERENCES: ReadonlyArray<ForeignReferenceCase> = [
|
|
|
256
306
|
monitorStatus: OWN_STATUS_ID,
|
|
257
307
|
labels: `${OWN_LABEL_ID},${FOREIGN_LABEL_ID}`,
|
|
258
308
|
onCallDutyPolicies: OWN_POLICY_ID,
|
|
309
|
+
refusal: `references records that belong to a different project: Label "${FOREIGN_LABEL_NAME}". Please pick values from this project and try again.`,
|
|
310
|
+
identifying: [FOREIGN_LABEL_NAME, FOREIGN_LABEL_ID],
|
|
259
311
|
},
|
|
260
312
|
{
|
|
261
313
|
name: "an on-call policy from another project",
|
|
@@ -263,6 +315,8 @@ const INCIDENT_BAD_REFERENCES: ReadonlyArray<ForeignReferenceCase> = [
|
|
|
263
315
|
monitorStatus: OWN_STATUS_ID,
|
|
264
316
|
labels: OWN_LABEL_ID,
|
|
265
317
|
onCallDutyPolicies: `${OWN_POLICY_ID},${FOREIGN_POLICY_ID}`,
|
|
318
|
+
refusal: `references records that belong to a different project: On-Call Policy "${FOREIGN_POLICY_NAME}". Please pick values from this project and try again.`,
|
|
319
|
+
identifying: [FOREIGN_POLICY_NAME, FOREIGN_POLICY_ID],
|
|
266
320
|
},
|
|
267
321
|
];
|
|
268
322
|
|
|
@@ -339,11 +393,47 @@ describe("WorkspaceProjectReferenceValidator", (): void => {
|
|
|
339
393
|
/This incident references records that belong to a different project: .*Monitor .*Label .*On-Call Policy .*Monitor Status/,
|
|
340
394
|
);
|
|
341
395
|
});
|
|
396
|
+
|
|
397
|
+
test.each(INCIDENT_BAD_REFERENCES)(
|
|
398
|
+
"refuses $name with a ProjectScopedReferenceException: still a BadDataException, with the message API callers always had",
|
|
399
|
+
async (reference: ForeignReferenceCase): Promise<void> => {
|
|
400
|
+
let refusal: unknown = undefined;
|
|
401
|
+
|
|
402
|
+
try {
|
|
403
|
+
await WorkspaceProjectReferenceValidator.validateReferencesBelongToProject(
|
|
404
|
+
{
|
|
405
|
+
projectId: PROJECT_ID,
|
|
406
|
+
subject: "incident",
|
|
407
|
+
monitorIds:
|
|
408
|
+
WorkspaceProjectReferenceValidator.parseCommaSeparatedIds(
|
|
409
|
+
reference.monitors,
|
|
410
|
+
),
|
|
411
|
+
labelIds: WorkspaceProjectReferenceValidator.parseCommaSeparatedIds(
|
|
412
|
+
reference.labels,
|
|
413
|
+
),
|
|
414
|
+
onCallDutyPolicyIds:
|
|
415
|
+
WorkspaceProjectReferenceValidator.parseCommaSeparatedIds(
|
|
416
|
+
reference.onCallDutyPolicies,
|
|
417
|
+
),
|
|
418
|
+
monitorStatusId: new ObjectID(reference.monitorStatus),
|
|
419
|
+
},
|
|
420
|
+
);
|
|
421
|
+
} catch (error) {
|
|
422
|
+
refusal = error;
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
expect(refusal).toBeInstanceOf(ProjectScopedReferenceException);
|
|
426
|
+
expect(refusal).toBeInstanceOf(BadDataException);
|
|
427
|
+
expect((refusal as BadDataException).message).toBe(
|
|
428
|
+
`This incident ${reference.refusal}`,
|
|
429
|
+
);
|
|
430
|
+
},
|
|
431
|
+
);
|
|
342
432
|
});
|
|
343
433
|
|
|
344
434
|
describe("Microsoft Teams bot: SubmitNewIncident", (): void => {
|
|
345
435
|
function submit(
|
|
346
|
-
reference:
|
|
436
|
+
reference: ReferenceChoice,
|
|
347
437
|
turnContext: TurnContext,
|
|
348
438
|
): Promise<void> {
|
|
349
439
|
return MicrosoftTeamsIncidentActions.handleBotIncidentAction({
|
|
@@ -365,7 +455,13 @@ describe("Microsoft Teams bot: SubmitNewIncident", (): void => {
|
|
|
365
455
|
});
|
|
366
456
|
}
|
|
367
457
|
|
|
368
|
-
|
|
458
|
+
let errorLog: SpyInstance<typeof logger.error>;
|
|
459
|
+
|
|
460
|
+
beforeEach((): void => {
|
|
461
|
+
errorLog = jest.spyOn(logger, "error").mockImplementation((): void => {});
|
|
462
|
+
});
|
|
463
|
+
|
|
464
|
+
test("creates the incident and hands the monitor status to IncidentService instead of writing monitors", async (): Promise<void> => {
|
|
369
465
|
const writes: WriteSpies = spyOnMonitorWrites();
|
|
370
466
|
const createSpy: SpyInstance<typeof IncidentService.create> = jest
|
|
371
467
|
.spyOn(IncidentService, "create")
|
|
@@ -395,12 +491,7 @@ describe("Microsoft Teams bot: SubmitNewIncident", (): void => {
|
|
|
395
491
|
expect(relationIds(incident.labels)).toEqual([OWN_LABEL_ID]);
|
|
396
492
|
expect(relationIds(incident.onCallDutyPolicies)).toEqual([OWN_POLICY_ID]);
|
|
397
493
|
|
|
398
|
-
|
|
399
|
-
writes.updateOneBy,
|
|
400
|
-
[OWN_MONITOR_ID, SECOND_OWN_MONITOR_ID],
|
|
401
|
-
OWN_STATUS_ID,
|
|
402
|
-
);
|
|
403
|
-
expect(writes.updateOneById).not.toHaveBeenCalled();
|
|
494
|
+
expectStatusChangeHandedToService(writes, incident, OWN_STATUS_ID);
|
|
404
495
|
expect(sentMessages(turnContext)[0]).toContain(
|
|
405
496
|
"Incident created successfully",
|
|
406
497
|
);
|
|
@@ -420,17 +511,35 @@ describe("Microsoft Teams bot: SubmitNewIncident", (): void => {
|
|
|
420
511
|
expect(createSpy).not.toHaveBeenCalled();
|
|
421
512
|
expect(writes.updateOneBy).not.toHaveBeenCalled();
|
|
422
513
|
expect(writes.updateOneById).not.toHaveBeenCalled();
|
|
423
|
-
|
|
424
|
-
|
|
514
|
+
|
|
515
|
+
/*
|
|
516
|
+
* One reply, and it says what to do, but not which record: the
|
|
517
|
+
* validator's message names another project's.
|
|
518
|
+
*/
|
|
519
|
+
const messages: Array<string> = sentMessages(turnContext);
|
|
520
|
+
expect(messages).toEqual([
|
|
521
|
+
`❌ Could not create the incident: ${UNAVAILABLE_REFERENCE_REASON}`,
|
|
425
522
|
]);
|
|
523
|
+
for (const identifying of reference.identifying) {
|
|
524
|
+
expect(messages[0]).not.toContain(identifying);
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
// Which record it was is for an operator, in the log.
|
|
528
|
+
expect(errorLog).toHaveBeenCalledTimes(2);
|
|
529
|
+
expect(errorLog).toHaveBeenNthCalledWith(
|
|
530
|
+
1,
|
|
531
|
+
`Could not create an incident from Microsoft Teams: ProjectScopedReferenceException: This incident ${reference.refusal}`,
|
|
532
|
+
{ projectId: PROJECT_ID.toString() },
|
|
533
|
+
);
|
|
534
|
+
expect(errorLog.mock.calls[1]![0]).toBeInstanceOf(
|
|
535
|
+
ProjectScopedReferenceException,
|
|
536
|
+
);
|
|
426
537
|
},
|
|
427
538
|
);
|
|
428
539
|
});
|
|
429
540
|
|
|
430
541
|
describe("Microsoft Teams card: submitNewIncident", (): void => {
|
|
431
|
-
function submit(
|
|
432
|
-
reference: Omit<ForeignReferenceCase, "name">,
|
|
433
|
-
): Promise<void> {
|
|
542
|
+
function submit(reference: ReferenceChoice): Promise<void> {
|
|
434
543
|
const teamsRequest: MicrosoftTeamsRequest = {
|
|
435
544
|
isAuthorized: true,
|
|
436
545
|
projectId: PROJECT_ID,
|
|
@@ -467,7 +576,7 @@ describe("Microsoft Teams card: submitNewIncident", (): void => {
|
|
|
467
576
|
.mockResolvedValue(USER_ID);
|
|
468
577
|
});
|
|
469
578
|
|
|
470
|
-
test("
|
|
579
|
+
test("hands the monitor status to IncidentService instead of writing monitors", async (): Promise<void> => {
|
|
471
580
|
const writes: WriteSpies = spyOnMonitorWrites();
|
|
472
581
|
const createSpy: SpyInstance<typeof IncidentService.create> = jest
|
|
473
582
|
.spyOn(IncidentService, "create")
|
|
@@ -481,12 +590,11 @@ describe("Microsoft Teams card: submitNewIncident", (): void => {
|
|
|
481
590
|
});
|
|
482
591
|
|
|
483
592
|
expect(createSpy).toHaveBeenCalledTimes(1);
|
|
484
|
-
|
|
485
|
-
writes
|
|
486
|
-
[
|
|
593
|
+
expectStatusChangeHandedToService(
|
|
594
|
+
writes,
|
|
595
|
+
createSpy.mock.calls[0]![0].data,
|
|
487
596
|
OWN_STATUS_ID,
|
|
488
597
|
);
|
|
489
|
-
expect(writes.updateOneById).not.toHaveBeenCalled();
|
|
490
598
|
});
|
|
491
599
|
|
|
492
600
|
test.each(INCIDENT_BAD_REFERENCES)(
|
|
@@ -508,7 +616,7 @@ describe("Microsoft Teams card: submitNewIncident", (): void => {
|
|
|
508
616
|
|
|
509
617
|
describe("Microsoft Teams bot: SubmitNewScheduledMaintenance", (): void => {
|
|
510
618
|
function submit(
|
|
511
|
-
reference:
|
|
619
|
+
reference: ReferenceChoice,
|
|
512
620
|
turnContext: TurnContext,
|
|
513
621
|
): Promise<void> {
|
|
514
622
|
return MicrosoftTeamsScheduledMaintenanceActions.handleBotScheduledMaintenanceAction(
|
|
@@ -536,14 +644,17 @@ describe("Microsoft Teams bot: SubmitNewScheduledMaintenance", (): void => {
|
|
|
536
644
|
);
|
|
537
645
|
}
|
|
538
646
|
|
|
647
|
+
let errorLog: SpyInstance<typeof logger.error>;
|
|
648
|
+
|
|
539
649
|
beforeEach((): void => {
|
|
540
650
|
// Create permission is covered by the workspace authorization tests.
|
|
541
651
|
jest
|
|
542
652
|
.spyOn(WorkspaceActionAuthorization, "assertCanCreate")
|
|
543
653
|
.mockResolvedValue();
|
|
654
|
+
errorLog = jest.spyOn(logger, "error").mockImplementation((): void => {});
|
|
544
655
|
});
|
|
545
656
|
|
|
546
|
-
test("creates the event and
|
|
657
|
+
test("creates the event and hands the monitor status to ScheduledMaintenanceService instead of writing monitors", async (): Promise<void> => {
|
|
547
658
|
const writes: WriteSpies = spyOnMonitorWrites();
|
|
548
659
|
const createSpy: SpyInstance<typeof ScheduledMaintenanceService.create> =
|
|
549
660
|
jest
|
|
@@ -577,12 +688,11 @@ describe("Microsoft Teams bot: SubmitNewScheduledMaintenance", (): void => {
|
|
|
577
688
|
]);
|
|
578
689
|
expect(relationIds(scheduledMaintenance.labels)).toEqual([OWN_LABEL_ID]);
|
|
579
690
|
|
|
580
|
-
|
|
581
|
-
writes
|
|
582
|
-
|
|
691
|
+
expectStatusChangeHandedToService(
|
|
692
|
+
writes,
|
|
693
|
+
scheduledMaintenance,
|
|
583
694
|
OWN_STATUS_ID,
|
|
584
695
|
);
|
|
585
|
-
expect(writes.updateOneById).not.toHaveBeenCalled();
|
|
586
696
|
expect(sentMessages(turnContext)[0]).toContain(
|
|
587
697
|
"Scheduled maintenance created successfully",
|
|
588
698
|
);
|
|
@@ -603,17 +713,35 @@ describe("Microsoft Teams bot: SubmitNewScheduledMaintenance", (): void => {
|
|
|
603
713
|
expect(createSpy).not.toHaveBeenCalled();
|
|
604
714
|
expect(writes.updateOneBy).not.toHaveBeenCalled();
|
|
605
715
|
expect(writes.updateOneById).not.toHaveBeenCalled();
|
|
606
|
-
|
|
607
|
-
|
|
716
|
+
|
|
717
|
+
/*
|
|
718
|
+
* One reply, and it says what to do, but not which record: the
|
|
719
|
+
* validator's message names another project's.
|
|
720
|
+
*/
|
|
721
|
+
const messages: Array<string> = sentMessages(turnContext);
|
|
722
|
+
expect(messages).toEqual([
|
|
723
|
+
`❌ Could not create the scheduled maintenance event: ${UNAVAILABLE_REFERENCE_REASON}`,
|
|
608
724
|
]);
|
|
725
|
+
for (const identifying of reference.identifying) {
|
|
726
|
+
expect(messages[0]).not.toContain(identifying);
|
|
727
|
+
}
|
|
728
|
+
|
|
729
|
+
// Which record it was is for an operator, in the log.
|
|
730
|
+
expect(errorLog).toHaveBeenCalledTimes(2);
|
|
731
|
+
expect(errorLog).toHaveBeenNthCalledWith(
|
|
732
|
+
1,
|
|
733
|
+
`Could not create a scheduled maintenance event from Microsoft Teams: ProjectScopedReferenceException: This scheduled maintenance event ${reference.refusal}`,
|
|
734
|
+
{ projectId: PROJECT_ID.toString() },
|
|
735
|
+
);
|
|
736
|
+
expect(errorLog.mock.calls[1]![0]).toBeInstanceOf(
|
|
737
|
+
ProjectScopedReferenceException,
|
|
738
|
+
);
|
|
609
739
|
},
|
|
610
740
|
);
|
|
611
741
|
});
|
|
612
742
|
|
|
613
743
|
describe("Microsoft Teams card: submitNewScheduledMaintenance", (): void => {
|
|
614
|
-
function submit(
|
|
615
|
-
reference: Omit<ForeignReferenceCase, "name">,
|
|
616
|
-
): Promise<void> {
|
|
744
|
+
function submit(reference: ReferenceChoice): Promise<void> {
|
|
617
745
|
return MicrosoftTeamsScheduledMaintenanceActions.submitNewScheduledMaintenance(
|
|
618
746
|
{
|
|
619
747
|
teamsRequest: {
|
|
@@ -651,7 +779,7 @@ describe("Microsoft Teams card: submitNewScheduledMaintenance", (): void => {
|
|
|
651
779
|
.mockResolvedValue(USER_ID);
|
|
652
780
|
});
|
|
653
781
|
|
|
654
|
-
test("
|
|
782
|
+
test("hands the monitor status to ScheduledMaintenanceService instead of writing monitors", async (): Promise<void> => {
|
|
655
783
|
const writes: WriteSpies = spyOnMonitorWrites();
|
|
656
784
|
const createSpy: SpyInstance<typeof ScheduledMaintenanceService.create> =
|
|
657
785
|
jest
|
|
@@ -666,12 +794,11 @@ describe("Microsoft Teams card: submitNewScheduledMaintenance", (): void => {
|
|
|
666
794
|
});
|
|
667
795
|
|
|
668
796
|
expect(createSpy).toHaveBeenCalledTimes(1);
|
|
669
|
-
|
|
670
|
-
writes
|
|
671
|
-
[
|
|
797
|
+
expectStatusChangeHandedToService(
|
|
798
|
+
writes,
|
|
799
|
+
createSpy.mock.calls[0]![0].data,
|
|
672
800
|
OWN_STATUS_ID,
|
|
673
801
|
);
|
|
674
|
-
expect(writes.updateOneById).not.toHaveBeenCalled();
|
|
675
802
|
});
|
|
676
803
|
|
|
677
804
|
test.each(SCHEDULED_MAINTENANCE_BAD_REFERENCES)(
|
|
@@ -714,9 +841,7 @@ describe("Slack: SubmitNewIncident", (): void => {
|
|
|
714
841
|
});
|
|
715
842
|
}
|
|
716
843
|
|
|
717
|
-
function viewValues(
|
|
718
|
-
reference: Omit<ForeignReferenceCase, "name">,
|
|
719
|
-
): SlackRequest["viewValues"] {
|
|
844
|
+
function viewValues(reference: ReferenceChoice): SlackRequest["viewValues"] {
|
|
720
845
|
return {
|
|
721
846
|
incidentTitle: "Database down",
|
|
722
847
|
incidentDescription: "Primary is not answering",
|
|
@@ -767,8 +892,9 @@ describe("Slack: SubmitNewIncident", (): void => {
|
|
|
767
892
|
.spyOn(IncidentService, "create")
|
|
768
893
|
.mockResolvedValue(createdIncident());
|
|
769
894
|
|
|
895
|
+
// The validator's own message, as Slack has always passed it on.
|
|
770
896
|
await expect(submit(viewValues(reference))).rejects.toThrow(
|
|
771
|
-
|
|
897
|
+
`This incident ${reference.refusal}`,
|
|
772
898
|
);
|
|
773
899
|
|
|
774
900
|
expect(createSpy).not.toHaveBeenCalled();
|
|
@@ -777,9 +903,7 @@ describe("Slack: SubmitNewIncident", (): void => {
|
|
|
777
903
|
});
|
|
778
904
|
|
|
779
905
|
describe("Slack: SubmitNewScheduledMaintenance", (): void => {
|
|
780
|
-
function submit(
|
|
781
|
-
reference: Omit<ForeignReferenceCase, "name">,
|
|
782
|
-
): Promise<void> {
|
|
906
|
+
function submit(reference: ReferenceChoice): Promise<void> {
|
|
783
907
|
return SlackScheduledMaintenanceActions.submitNewScheduledMaintenance({
|
|
784
908
|
slackRequest: {
|
|
785
909
|
isAuthorized: true,
|
|
@@ -851,8 +975,9 @@ describe("Slack: SubmitNewScheduledMaintenance", (): void => {
|
|
|
851
975
|
.spyOn(ScheduledMaintenanceService, "create")
|
|
852
976
|
.mockResolvedValue(createdScheduledMaintenance());
|
|
853
977
|
|
|
978
|
+
// The validator's own message, as Slack has always passed it on.
|
|
854
979
|
await expect(submit(reference)).rejects.toThrow(
|
|
855
|
-
|
|
980
|
+
`This scheduled maintenance event ${reference.refusal}`,
|
|
856
981
|
);
|
|
857
982
|
|
|
858
983
|
expect(createSpy).not.toHaveBeenCalled();
|
|
@@ -153,25 +153,31 @@ describe("AI command step id prefixes", () => {
|
|
|
153
153
|
});
|
|
154
154
|
|
|
155
155
|
describe("AI_COMMAND_STEP_TYPES", () => {
|
|
156
|
-
test("permits exactly Bash, SSH and
|
|
156
|
+
test("permits exactly Bash, SSH, Kubectl and ResourceCommand, in that order", () => {
|
|
157
157
|
/*
|
|
158
158
|
* This array IS the whitelist parse checks against. Widening it (to
|
|
159
159
|
* Kubernetes, JavaScript, ...) would let the AI compose step types the
|
|
160
160
|
* command lane was never reviewed for. Kubectl is the one cluster lane
|
|
161
161
|
* that was: a single kubectl argv, tiered by KubectlPolicy, on a Runner
|
|
162
|
-
* the cluster's AI page bound.
|
|
162
|
+
* the cluster's AI page bound. ResourceCommand is its counterpart for
|
|
163
|
+
* every other infrastructure resource: a single argv, tiered by the
|
|
164
|
+
* resource command policy, on the resource's own AI agent.
|
|
163
165
|
*/
|
|
164
166
|
expect(AI_COMMAND_STEP_TYPES).toEqual([
|
|
165
167
|
RunbookStepType.Bash,
|
|
166
168
|
RunbookStepType.SSH,
|
|
167
169
|
RunbookStepType.Kubectl,
|
|
170
|
+
RunbookStepType.ResourceCommand,
|
|
168
171
|
]);
|
|
169
172
|
});
|
|
170
173
|
|
|
171
|
-
test("places Kubectl
|
|
172
|
-
expect(AI_COMMAND_STEP_TYPES.indexOf(RunbookStepType.
|
|
174
|
+
test("places Kubectl after the two host lanes and ResourceCommand last, with no duplicates", () => {
|
|
175
|
+
expect(AI_COMMAND_STEP_TYPES.indexOf(RunbookStepType.ResourceCommand)).toBe(
|
|
173
176
|
AI_COMMAND_STEP_TYPES.length - 1,
|
|
174
177
|
);
|
|
178
|
+
expect(AI_COMMAND_STEP_TYPES.indexOf(RunbookStepType.Kubectl)).toBe(
|
|
179
|
+
AI_COMMAND_STEP_TYPES.indexOf(RunbookStepType.ResourceCommand) - 1,
|
|
180
|
+
);
|
|
175
181
|
expect(AI_COMMAND_STEP_TYPES.indexOf(RunbookStepType.SSH)).toBeLessThan(
|
|
176
182
|
AI_COMMAND_STEP_TYPES.indexOf(RunbookStepType.Kubectl),
|
|
177
183
|
);
|