@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
package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsActivityDeduplicator.js
ADDED
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import ErrorClass from "../../../../Types/Telemetry/ErrorClass";
|
|
2
|
+
import { ERROR_CLASS_ATTRIBUTE_KEY } from "../../../../Types/Telemetry/UnitOfWork";
|
|
3
|
+
import GlobalCache from "../../../Infrastructure/GlobalCache";
|
|
4
|
+
import InMemoryTTLCache from "../../../Infrastructure/InMemoryTTLCache";
|
|
5
|
+
import Redis from "../../../Infrastructure/Redis";
|
|
6
|
+
import logger from "../../Logger";
|
|
7
|
+
/*
|
|
8
|
+
* Teams delivers an activity again when the bot was slow to answer it
|
|
9
|
+
* (documented: more than 15 seconds) and, in practice, when the bot answered
|
|
10
|
+
* it with an error. The redelivery carries the same activity id. Without a
|
|
11
|
+
* guard the user sees every reply twice, and a submitted form creates two
|
|
12
|
+
* incidents (issue #4111 showed each error bubble twice). Claiming the id
|
|
13
|
+
* before acting on an activity turns every delivery after the first into a
|
|
14
|
+
* no-op.
|
|
15
|
+
*
|
|
16
|
+
* The claim is shared through Redis, because a redelivery can reach another
|
|
17
|
+
* App instance, and kept in this process's memory as well. When Redis is
|
|
18
|
+
* disconnected the memory decides at once; when it is slow, after at most
|
|
19
|
+
* REDIS_CLAIM_TIMEOUT_IN_MS. Memory alone still covers a single instance.
|
|
20
|
+
*/
|
|
21
|
+
const CLAIM_NAMESPACE = "microsoft-teams-inbound-activity";
|
|
22
|
+
// Redeliveries arrive within seconds; ten minutes leaves a wide margin.
|
|
23
|
+
const CLAIM_TTL_IN_SECONDS = 10 * 60;
|
|
24
|
+
// How long a Redis claim may take before this process's memory decides.
|
|
25
|
+
const REDIS_CLAIM_TIMEOUT_IN_MS = 2000;
|
|
26
|
+
// A Redis fallback is logged at most this often; each message would repeat it.
|
|
27
|
+
const FALLBACK_LOG_INTERVAL_IN_MS = 60 * 1000;
|
|
28
|
+
class MicrosoftTeamsActivityDeduplicator {
|
|
29
|
+
/*
|
|
30
|
+
* The key an activity is claimed under: its conversation and its id. Null
|
|
31
|
+
* when the activity has no id, which Teams always sends.
|
|
32
|
+
*/
|
|
33
|
+
static getClaimKey(activity) {
|
|
34
|
+
var _a;
|
|
35
|
+
const activityId = activity["id"] || "";
|
|
36
|
+
if (!activityId) {
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
const conversationId = ((_a = activity["conversation"]) === null || _a === void 0 ? void 0 : _a["id"]) || "";
|
|
40
|
+
return `${conversationId}|${activityId}`;
|
|
41
|
+
}
|
|
42
|
+
/*
|
|
43
|
+
* True for the first delivery of an activity, false for a repeat. An
|
|
44
|
+
* activity without an id is always processed.
|
|
45
|
+
*/
|
|
46
|
+
static async claim(activity) {
|
|
47
|
+
const key = this.getClaimKey(activity);
|
|
48
|
+
if (!key) {
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
/*
|
|
52
|
+
* This process's memory is consulted whatever Redis says: a claim made
|
|
53
|
+
* here while Redis was down never reached Redis, so once Redis is back it
|
|
54
|
+
* would let a redelivery of that activity through.
|
|
55
|
+
*/
|
|
56
|
+
const isClaimedHere = this.localClaims.has(key);
|
|
57
|
+
// A repeat leaves the claim alone, so it lapses with the Redis key.
|
|
58
|
+
if (!isClaimedHere) {
|
|
59
|
+
this.localClaims.set(key, true, CLAIM_TTL_IN_SECONDS * 1000);
|
|
60
|
+
}
|
|
61
|
+
// Asked even then, so that other App instances learn of the claim.
|
|
62
|
+
const claimedInRedis = await this.claimInRedis(key);
|
|
63
|
+
if (isClaimedHere) {
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
return claimedInRedis !== null && claimedInRedis !== void 0 ? claimedInRedis : true;
|
|
67
|
+
}
|
|
68
|
+
// The Redis answer, or null when Redis could not answer in time.
|
|
69
|
+
static async claimInRedis(key) {
|
|
70
|
+
let timeout = undefined;
|
|
71
|
+
try {
|
|
72
|
+
return await Promise.race([
|
|
73
|
+
GlobalCache.setStringIfNotExists(CLAIM_NAMESPACE, key, "1", {
|
|
74
|
+
expiresInSeconds: CLAIM_TTL_IN_SECONDS,
|
|
75
|
+
}),
|
|
76
|
+
new Promise((resolve) => {
|
|
77
|
+
timeout = setTimeout(() => {
|
|
78
|
+
this.logFallback(`Redis did not answer within ${REDIS_CLAIM_TIMEOUT_IN_MS} ms`);
|
|
79
|
+
resolve(null);
|
|
80
|
+
}, REDIS_CLAIM_TIMEOUT_IN_MS);
|
|
81
|
+
}),
|
|
82
|
+
]);
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
this.logFallback("Redis refused the claim", error);
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
finally {
|
|
89
|
+
if (timeout) {
|
|
90
|
+
clearTimeout(timeout);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/*
|
|
95
|
+
* Falling back to memory means a redelivery that reaches another App
|
|
96
|
+
* instance is handled twice, which an operator should hear about. Logged at
|
|
97
|
+
* error level (warn is dropped at the default LOG_LEVEL) and at most once a
|
|
98
|
+
* minute. A process that never had a Redis client (a script, a test) has no
|
|
99
|
+
* other instance to share with, so it only logs at debug.
|
|
100
|
+
*
|
|
101
|
+
* It never throws: it runs from the claim's catch and from its timeout, and
|
|
102
|
+
* a throw there would lose the claim, or the reply, over a log line.
|
|
103
|
+
*/
|
|
104
|
+
static logFallback(reason, error) {
|
|
105
|
+
try {
|
|
106
|
+
const now = Date.now();
|
|
107
|
+
if (!Redis.getClient() ||
|
|
108
|
+
now - this.lastFallbackLoggedAt < FALLBACK_LOG_INTERVAL_IN_MS) {
|
|
109
|
+
logger.debug(`Microsoft Teams activity dedupe is using this process's memory: ${reason}`);
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
this.lastFallbackLoggedAt = now;
|
|
113
|
+
const attributes = {
|
|
114
|
+
[ERROR_CLASS_ATTRIBUTE_KEY]: ErrorClass.Infrastructure,
|
|
115
|
+
};
|
|
116
|
+
logger.error(`Microsoft Teams activity dedupe fell back to this process's memory (${reason}); a Teams redelivery that reaches another App instance may be handled twice.`, attributes);
|
|
117
|
+
if (error) {
|
|
118
|
+
logger.error(error, attributes);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
catch (_a) {
|
|
122
|
+
// Nothing to do: the claim goes on from memory either way.
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
MicrosoftTeamsActivityDeduplicator.localClaims = new InMemoryTTLCache(10000);
|
|
127
|
+
MicrosoftTeamsActivityDeduplicator.lastFallbackLoggedAt = 0;
|
|
128
|
+
export default MicrosoftTeamsActivityDeduplicator;
|
|
129
|
+
//# sourceMappingURL=MicrosoftTeamsActivityDeduplicator.js.map
|
package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsActivityDeduplicator.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MicrosoftTeamsActivityDeduplicator.js","sourceRoot":"","sources":["../../../../../../Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsActivityDeduplicator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
import SortOrder from "../../../../Types/BaseDatabase/SortOrder";
|
|
2
|
+
import MonitorService from "../../../Services/MonitorService";
|
|
3
|
+
import MonitorStatusService from "../../../Services/MonitorStatusService";
|
|
4
|
+
import LabelService from "../../../Services/LabelService";
|
|
5
|
+
import IncidentSeverityService from "../../../Services/IncidentSeverityService";
|
|
6
|
+
import OnCallDutyPolicyService from "../../../Services/OnCallDutyPolicyService";
|
|
7
|
+
import { truncateToLength } from "../../Database/TruncateColumnValue";
|
|
8
|
+
import MicrosoftTeamsMessageSize from "./MicrosoftTeamsMessageSize";
|
|
9
|
+
/*
|
|
10
|
+
* Most choices read for one list. The size budget, not these caps, decides
|
|
11
|
+
* how many a card shows; the caps only keep the reads small. More than a
|
|
12
|
+
* couple of hundred entries is not a usable dropdown anyway.
|
|
13
|
+
*/
|
|
14
|
+
export const MICROSOFT_TEAMS_MAX_MONITOR_CHOICES = 250;
|
|
15
|
+
export const MICROSOFT_TEAMS_MAX_LABEL_CHOICES = 100;
|
|
16
|
+
export const MICROSOFT_TEAMS_MAX_ON_CALL_POLICY_CHOICES = 100;
|
|
17
|
+
export const MICROSOFT_TEAMS_MAX_SEVERITY_CHOICES = 50;
|
|
18
|
+
export const MICROSOFT_TEAMS_MAX_MONITOR_STATUS_CHOICES = 50;
|
|
19
|
+
// Longer names are cut: a Teams dropdown shows about this much of a row.
|
|
20
|
+
export const MICROSOFT_TEAMS_MAX_CHOICE_TITLE_LENGTH = 80;
|
|
21
|
+
export default class MicrosoftTeamsCardChoices {
|
|
22
|
+
// Rows to choices, skipping rows without a name or id.
|
|
23
|
+
static toChoices(rows) {
|
|
24
|
+
var _a;
|
|
25
|
+
const choices = [];
|
|
26
|
+
for (const row of rows) {
|
|
27
|
+
const title = (row.name || "").trim();
|
|
28
|
+
const value = ((_a = row._id) === null || _a === void 0 ? void 0 : _a.toString()) || "";
|
|
29
|
+
if (!title || !value) {
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
choices.push({
|
|
33
|
+
title: title.length > MICROSOFT_TEAMS_MAX_CHOICE_TITLE_LENGTH
|
|
34
|
+
? truncateToLength(title, MICROSOFT_TEAMS_MAX_CHOICE_TITLE_LENGTH - 1) + "…"
|
|
35
|
+
: title,
|
|
36
|
+
value: value,
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
return choices;
|
|
40
|
+
}
|
|
41
|
+
/*
|
|
42
|
+
* Builds the card from every choice it was given, then, while it is over
|
|
43
|
+
* the budget, shortens the longest trimmable list by a quarter (at least by
|
|
44
|
+
* one). The longest list goes first because it is what makes the card big,
|
|
45
|
+
* and shortening it by a share keeps the number of rebuilds small even for
|
|
46
|
+
* hundreds of choices. Lists that are not trimmable are always shown whole.
|
|
47
|
+
*/
|
|
48
|
+
static fitCardToBudget(data) {
|
|
49
|
+
const keys = Object.keys(data.lists);
|
|
50
|
+
const shownCounts = {};
|
|
51
|
+
for (const key of keys) {
|
|
52
|
+
shownCounts[key] = data.lists[key].choices.length;
|
|
53
|
+
}
|
|
54
|
+
// No budget: leave every trimmable list off in one go.
|
|
55
|
+
if (data.budgetInBytes <= 0) {
|
|
56
|
+
for (const key of data.trimmableKeys) {
|
|
57
|
+
shownCounts[key] = 0;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
const build = () => {
|
|
61
|
+
const shownLists = {};
|
|
62
|
+
for (const key of keys) {
|
|
63
|
+
shownLists[key] = {
|
|
64
|
+
choices: data.lists[key].choices.slice(0, shownCounts[key]),
|
|
65
|
+
totalCount: data.lists[key].totalCount,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
return data.buildCard(shownLists);
|
|
69
|
+
};
|
|
70
|
+
let card = build();
|
|
71
|
+
while (MicrosoftTeamsMessageSize.getSizeInBytes(card) > data.budgetInBytes) {
|
|
72
|
+
let longestKey = null;
|
|
73
|
+
for (const key of data.trimmableKeys) {
|
|
74
|
+
if (shownCounts[key] > 0 &&
|
|
75
|
+
(longestKey === null || shownCounts[key] > shownCounts[longestKey])) {
|
|
76
|
+
longestKey = key;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
if (longestKey === null) {
|
|
80
|
+
return { card: card, shownCounts: shownCounts, fitsBudget: false };
|
|
81
|
+
}
|
|
82
|
+
const count = shownCounts[longestKey];
|
|
83
|
+
shownCounts[longestKey] = Math.min(count - 1, Math.floor(count * 0.75));
|
|
84
|
+
card = build();
|
|
85
|
+
}
|
|
86
|
+
return { card: card, shownCounts: shownCounts, fitsBudget: true };
|
|
87
|
+
}
|
|
88
|
+
// A small line of text on a card, such as what a list leaves out.
|
|
89
|
+
static buildNoteElement(text) {
|
|
90
|
+
return {
|
|
91
|
+
type: "TextBlock",
|
|
92
|
+
text: text,
|
|
93
|
+
wrap: true,
|
|
94
|
+
isSubtle: true,
|
|
95
|
+
size: "Small",
|
|
96
|
+
spacing: "Small",
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
// The note element for a list the card could not show in full, or null.
|
|
100
|
+
static buildNotShownNoteElement(data) {
|
|
101
|
+
const note = this.getNotShownNote(data);
|
|
102
|
+
return note ? this.buildNoteElement(note) : null;
|
|
103
|
+
}
|
|
104
|
+
// The button a card offers when it had to leave something off.
|
|
105
|
+
static buildCreateInOneUptimeAction(url) {
|
|
106
|
+
return {
|
|
107
|
+
type: "Action.OpenUrl",
|
|
108
|
+
title: "Create in OneUptime",
|
|
109
|
+
url: url,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
/*
|
|
113
|
+
* The line shown under a list the card could not show in full, or null
|
|
114
|
+
* when it shows every record.
|
|
115
|
+
*/
|
|
116
|
+
static getNotShownNote(data) {
|
|
117
|
+
const shownCount = data.list.choices.length;
|
|
118
|
+
const totalCount = Math.max(data.list.totalCount, shownCount);
|
|
119
|
+
if (shownCount >= totalCount) {
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
122
|
+
if (shownCount === 0) {
|
|
123
|
+
return `This project has ${totalCount} ${data.pluralNoun}, too many to list in Microsoft Teams. ${data.addLaterHint}`;
|
|
124
|
+
}
|
|
125
|
+
return `Showing the first ${shownCount} of ${totalCount} ${data.pluralNoun}, by name. ${data.addLaterHint}`;
|
|
126
|
+
}
|
|
127
|
+
static async getMonitorChoices(projectId) {
|
|
128
|
+
const monitors = await MonitorService.findBy({
|
|
129
|
+
query: {
|
|
130
|
+
projectId: projectId,
|
|
131
|
+
},
|
|
132
|
+
select: {
|
|
133
|
+
_id: true,
|
|
134
|
+
name: true,
|
|
135
|
+
},
|
|
136
|
+
sort: {
|
|
137
|
+
name: SortOrder.Ascending,
|
|
138
|
+
},
|
|
139
|
+
limit: MICROSOFT_TEAMS_MAX_MONITOR_CHOICES,
|
|
140
|
+
skip: 0,
|
|
141
|
+
props: {
|
|
142
|
+
isRoot: true,
|
|
143
|
+
},
|
|
144
|
+
});
|
|
145
|
+
return {
|
|
146
|
+
choices: this.toChoices(monitors),
|
|
147
|
+
totalCount: monitors.length < MICROSOFT_TEAMS_MAX_MONITOR_CHOICES
|
|
148
|
+
? monitors.length
|
|
149
|
+
: (await MonitorService.countBy({
|
|
150
|
+
query: {
|
|
151
|
+
projectId: projectId,
|
|
152
|
+
},
|
|
153
|
+
props: {
|
|
154
|
+
isRoot: true,
|
|
155
|
+
},
|
|
156
|
+
})).toNumber(),
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
static async getMonitorStatusChoices(projectId) {
|
|
160
|
+
const monitorStatuses = await MonitorStatusService.findBy({
|
|
161
|
+
query: {
|
|
162
|
+
projectId: projectId,
|
|
163
|
+
},
|
|
164
|
+
select: {
|
|
165
|
+
_id: true,
|
|
166
|
+
name: true,
|
|
167
|
+
},
|
|
168
|
+
sort: {
|
|
169
|
+
priority: SortOrder.Ascending,
|
|
170
|
+
},
|
|
171
|
+
limit: MICROSOFT_TEAMS_MAX_MONITOR_STATUS_CHOICES,
|
|
172
|
+
skip: 0,
|
|
173
|
+
props: {
|
|
174
|
+
isRoot: true,
|
|
175
|
+
},
|
|
176
|
+
});
|
|
177
|
+
const choices = this.toChoices(monitorStatuses);
|
|
178
|
+
return { choices: choices, totalCount: choices.length };
|
|
179
|
+
}
|
|
180
|
+
static async getLabelChoices(projectId) {
|
|
181
|
+
const labels = await LabelService.findBy({
|
|
182
|
+
query: {
|
|
183
|
+
projectId: projectId,
|
|
184
|
+
},
|
|
185
|
+
select: {
|
|
186
|
+
_id: true,
|
|
187
|
+
name: true,
|
|
188
|
+
},
|
|
189
|
+
sort: {
|
|
190
|
+
name: SortOrder.Ascending,
|
|
191
|
+
},
|
|
192
|
+
limit: MICROSOFT_TEAMS_MAX_LABEL_CHOICES,
|
|
193
|
+
skip: 0,
|
|
194
|
+
props: {
|
|
195
|
+
isRoot: true,
|
|
196
|
+
},
|
|
197
|
+
});
|
|
198
|
+
return {
|
|
199
|
+
choices: this.toChoices(labels),
|
|
200
|
+
totalCount: labels.length < MICROSOFT_TEAMS_MAX_LABEL_CHOICES
|
|
201
|
+
? labels.length
|
|
202
|
+
: (await LabelService.countBy({
|
|
203
|
+
query: {
|
|
204
|
+
projectId: projectId,
|
|
205
|
+
},
|
|
206
|
+
props: {
|
|
207
|
+
isRoot: true,
|
|
208
|
+
},
|
|
209
|
+
})).toNumber(),
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
static async getIncidentSeverityChoices(projectId) {
|
|
213
|
+
const severities = await IncidentSeverityService.findBy({
|
|
214
|
+
query: {
|
|
215
|
+
projectId: projectId,
|
|
216
|
+
},
|
|
217
|
+
select: {
|
|
218
|
+
_id: true,
|
|
219
|
+
name: true,
|
|
220
|
+
},
|
|
221
|
+
sort: {
|
|
222
|
+
order: SortOrder.Ascending,
|
|
223
|
+
},
|
|
224
|
+
limit: MICROSOFT_TEAMS_MAX_SEVERITY_CHOICES,
|
|
225
|
+
skip: 0,
|
|
226
|
+
props: {
|
|
227
|
+
isRoot: true,
|
|
228
|
+
},
|
|
229
|
+
});
|
|
230
|
+
const choices = this.toChoices(severities);
|
|
231
|
+
return { choices: choices, totalCount: choices.length };
|
|
232
|
+
}
|
|
233
|
+
static async getOnCallDutyPolicyChoices(projectId) {
|
|
234
|
+
const policies = await OnCallDutyPolicyService.findBy({
|
|
235
|
+
query: {
|
|
236
|
+
projectId: projectId,
|
|
237
|
+
},
|
|
238
|
+
select: {
|
|
239
|
+
_id: true,
|
|
240
|
+
name: true,
|
|
241
|
+
},
|
|
242
|
+
sort: {
|
|
243
|
+
name: SortOrder.Ascending,
|
|
244
|
+
},
|
|
245
|
+
limit: MICROSOFT_TEAMS_MAX_ON_CALL_POLICY_CHOICES,
|
|
246
|
+
skip: 0,
|
|
247
|
+
props: {
|
|
248
|
+
isRoot: true,
|
|
249
|
+
},
|
|
250
|
+
});
|
|
251
|
+
return {
|
|
252
|
+
choices: this.toChoices(policies),
|
|
253
|
+
totalCount: policies.length < MICROSOFT_TEAMS_MAX_ON_CALL_POLICY_CHOICES
|
|
254
|
+
? policies.length
|
|
255
|
+
: (await OnCallDutyPolicyService.countBy({
|
|
256
|
+
query: {
|
|
257
|
+
projectId: projectId,
|
|
258
|
+
},
|
|
259
|
+
props: {
|
|
260
|
+
isRoot: true,
|
|
261
|
+
},
|
|
262
|
+
})).toNumber(),
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
//# sourceMappingURL=MicrosoftTeamsCardChoices.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MicrosoftTeamsCardChoices.js","sourceRoot":"","sources":["../../../../../../Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCardChoices.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
import NotAuthorizedException from "../../../../Types/Exception/NotAuthorizedException";
|
|
11
|
+
import ScheduledMaintenance from "../../../../Models/DatabaseModels/ScheduledMaintenance";
|
|
12
|
+
import logger from "../../Logger";
|
|
13
|
+
import CaptureSpan from "../../Telemetry/CaptureSpan";
|
|
14
|
+
import WorkspaceActionAuthorization from "../WorkspaceActionAuthorization";
|
|
15
|
+
import MicrosoftTeamsAuthAction, { MicrosoftTeamsAccountNotLinkedException, } from "./Actions/Auth";
|
|
16
|
+
import MicrosoftTeamsIncidentActions from "./Actions/Incident";
|
|
17
|
+
import MicrosoftTeamsScheduledMaintenanceActions from "./Actions/ScheduledMaintenance";
|
|
18
|
+
import MicrosoftTeamsMessageSize from "./MicrosoftTeamsMessageSize";
|
|
19
|
+
import MicrosoftTeamsReplies from "./MicrosoftTeamsReplies";
|
|
20
|
+
import MicrosoftTeamsTimezone from "./MicrosoftTeamsTimezone";
|
|
21
|
+
const INCIDENT_FORM = {
|
|
22
|
+
what: "an incident",
|
|
23
|
+
dashboardRoute: "/incidents/create",
|
|
24
|
+
purpose: "create incidents from Microsoft Teams",
|
|
25
|
+
lists: "monitors, labels and on-call policies",
|
|
26
|
+
};
|
|
27
|
+
const SCHEDULED_MAINTENANCE_FORM = {
|
|
28
|
+
what: "a scheduled maintenance event",
|
|
29
|
+
dashboardRoute: "/scheduled-maintenance-events/create",
|
|
30
|
+
purpose: "schedule maintenance from Microsoft Teams",
|
|
31
|
+
lists: "monitors and labels",
|
|
32
|
+
};
|
|
33
|
+
export default class MicrosoftTeamsCreateCommands {
|
|
34
|
+
static async handleCreateIncidentCommand(data) {
|
|
35
|
+
const { turnContext, activity, projectId } = data;
|
|
36
|
+
if (this.isPersonalConversation(activity) &&
|
|
37
|
+
!(await this.authorizeSender({
|
|
38
|
+
turnContext: turnContext,
|
|
39
|
+
activity: activity,
|
|
40
|
+
projectId: projectId,
|
|
41
|
+
form: INCIDENT_FORM,
|
|
42
|
+
}))) {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
let choices;
|
|
46
|
+
try {
|
|
47
|
+
choices =
|
|
48
|
+
await MicrosoftTeamsIncidentActions.getNewIncidentFormChoices(projectId);
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
await this.replyFormCouldNotLoad({
|
|
52
|
+
turnContext: turnContext,
|
|
53
|
+
projectId: projectId,
|
|
54
|
+
form: INCIDENT_FORM,
|
|
55
|
+
error: error,
|
|
56
|
+
});
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
if (choices.severities.choices.length === 0) {
|
|
60
|
+
const severitySettingsUrl = await MicrosoftTeamsReplies.getDashboardLink({
|
|
61
|
+
projectId: projectId,
|
|
62
|
+
route: "/incidents/settings/severity",
|
|
63
|
+
});
|
|
64
|
+
await MicrosoftTeamsReplies.sendBestEffort(turnContext, `An incident needs a severity, and this project has no incident severities yet. Add one in OneUptime under ${severitySettingsUrl
|
|
65
|
+
? `[Incidents → Settings → Incident Severity](${severitySettingsUrl})`
|
|
66
|
+
: "Incidents → Settings → Incident Severity"}, then try again.`);
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
const createInOneUptimeUrl = await MicrosoftTeamsReplies.getDashboardLink({
|
|
70
|
+
projectId: projectId,
|
|
71
|
+
route: INCIDENT_FORM.dashboardRoute,
|
|
72
|
+
});
|
|
73
|
+
await this.sendForm({
|
|
74
|
+
turnContext: turnContext,
|
|
75
|
+
projectId: projectId,
|
|
76
|
+
form: INCIDENT_FORM,
|
|
77
|
+
createInOneUptimeUrl: createInOneUptimeUrl,
|
|
78
|
+
buildCard: (budgetInBytes) => {
|
|
79
|
+
return MicrosoftTeamsIncidentActions.buildNewIncidentCardForBudget({
|
|
80
|
+
choices: choices,
|
|
81
|
+
budgetInBytes: budgetInBytes,
|
|
82
|
+
initialTitle: data.initialTitle,
|
|
83
|
+
createInOneUptimeUrl: createInOneUptimeUrl,
|
|
84
|
+
});
|
|
85
|
+
},
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
static async handleCreateScheduledMaintenanceCommand(data) {
|
|
89
|
+
const { turnContext, activity, projectId } = data;
|
|
90
|
+
if (this.isPersonalConversation(activity) &&
|
|
91
|
+
!(await this.authorizeSender({
|
|
92
|
+
turnContext: turnContext,
|
|
93
|
+
activity: activity,
|
|
94
|
+
projectId: projectId,
|
|
95
|
+
form: SCHEDULED_MAINTENANCE_FORM,
|
|
96
|
+
// Submitting checks the same permission.
|
|
97
|
+
createPermission: {
|
|
98
|
+
modelType: ScheduledMaintenance,
|
|
99
|
+
action: "create a scheduled maintenance event",
|
|
100
|
+
},
|
|
101
|
+
}))) {
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
let choices;
|
|
105
|
+
try {
|
|
106
|
+
choices =
|
|
107
|
+
await MicrosoftTeamsScheduledMaintenanceActions.getNewScheduledMaintenanceFormChoices(projectId);
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
await this.replyFormCouldNotLoad({
|
|
111
|
+
turnContext: turnContext,
|
|
112
|
+
projectId: projectId,
|
|
113
|
+
form: SCHEDULED_MAINTENANCE_FORM,
|
|
114
|
+
error: error,
|
|
115
|
+
});
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
const createInOneUptimeUrl = await MicrosoftTeamsReplies.getDashboardLink({
|
|
119
|
+
projectId: projectId,
|
|
120
|
+
route: SCHEDULED_MAINTENANCE_FORM.dashboardRoute,
|
|
121
|
+
});
|
|
122
|
+
// The zone the start and end are typed in; see MicrosoftTeamsTimezone.
|
|
123
|
+
const timezone = MicrosoftTeamsTimezone.getTimezoneFromActivity(activity);
|
|
124
|
+
await this.sendForm({
|
|
125
|
+
turnContext: turnContext,
|
|
126
|
+
projectId: projectId,
|
|
127
|
+
form: SCHEDULED_MAINTENANCE_FORM,
|
|
128
|
+
createInOneUptimeUrl: createInOneUptimeUrl,
|
|
129
|
+
buildCard: (budgetInBytes) => {
|
|
130
|
+
return MicrosoftTeamsScheduledMaintenanceActions.buildNewScheduledMaintenanceCardForBudget({
|
|
131
|
+
choices: choices,
|
|
132
|
+
budgetInBytes: budgetInBytes,
|
|
133
|
+
initialTitle: data.initialTitle,
|
|
134
|
+
createInOneUptimeUrl: createInOneUptimeUrl,
|
|
135
|
+
timezone: timezone,
|
|
136
|
+
});
|
|
137
|
+
},
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
// A 1:1 chat with the bot, where whoever asks for a form is the one to submit it.
|
|
141
|
+
static isPersonalConversation(activity) {
|
|
142
|
+
var _a;
|
|
143
|
+
return (((_a = activity["conversation"]) === null || _a === void 0 ? void 0 : _a["conversationType"]) === "personal");
|
|
144
|
+
}
|
|
145
|
+
/*
|
|
146
|
+
* True when the sender can submit the form. Otherwise the sender is told
|
|
147
|
+
* why (no connected account, not a project member, no permission) and this
|
|
148
|
+
* returns false.
|
|
149
|
+
*/
|
|
150
|
+
static async authorizeSender(data) {
|
|
151
|
+
var _a;
|
|
152
|
+
const { turnContext, activity, projectId, form } = data;
|
|
153
|
+
const teamsUserId = ((_a = activity["from"]) === null || _a === void 0 ? void 0 : _a["aadObjectId"]) || "";
|
|
154
|
+
if (!teamsUserId) {
|
|
155
|
+
logger.warn("A Microsoft Teams create command arrived without the sender's AAD object id", {
|
|
156
|
+
projectId: projectId.toString(),
|
|
157
|
+
});
|
|
158
|
+
await MicrosoftTeamsReplies.sendBestEffort(turnContext, `Sorry, I couldn't tell who sent this message, so I can't open the form to create ${form.what}. Please try again.`);
|
|
159
|
+
return false;
|
|
160
|
+
}
|
|
161
|
+
try {
|
|
162
|
+
const userId = await MicrosoftTeamsAuthAction.getOneUptimeUserIdFromTeamsUserId({
|
|
163
|
+
teamsUserId: teamsUserId,
|
|
164
|
+
projectId: projectId,
|
|
165
|
+
});
|
|
166
|
+
const props = await WorkspaceActionAuthorization.getProjectMemberProps({
|
|
167
|
+
userId: userId,
|
|
168
|
+
projectId: projectId,
|
|
169
|
+
});
|
|
170
|
+
if (data.createPermission) {
|
|
171
|
+
await WorkspaceActionAuthorization.assertCanCreate({
|
|
172
|
+
props: props,
|
|
173
|
+
modelType: data.createPermission.modelType,
|
|
174
|
+
action: data.createPermission.action,
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
return true;
|
|
178
|
+
}
|
|
179
|
+
catch (error) {
|
|
180
|
+
if (error instanceof MicrosoftTeamsAccountNotLinkedException) {
|
|
181
|
+
await MicrosoftTeamsReplies.sendBestEffort(turnContext, await MicrosoftTeamsReplies.getAccountNotLinkedMessage({
|
|
182
|
+
projectId: projectId,
|
|
183
|
+
purpose: form.purpose,
|
|
184
|
+
}));
|
|
185
|
+
return false;
|
|
186
|
+
}
|
|
187
|
+
if (error instanceof NotAuthorizedException) {
|
|
188
|
+
await MicrosoftTeamsReplies.sendBestEffort(turnContext, error.message);
|
|
189
|
+
return false;
|
|
190
|
+
}
|
|
191
|
+
MicrosoftTeamsReplies.logFailure("Could not check the Microsoft Teams sender of a create command", error, {
|
|
192
|
+
projectId: projectId.toString(),
|
|
193
|
+
});
|
|
194
|
+
await MicrosoftTeamsReplies.sendBestEffort(turnContext, `Sorry, I couldn't open the form to create ${form.what} because OneUptime could not check your account just now. Please try again in a minute.`);
|
|
195
|
+
return false;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
static async sendForm(data) {
|
|
199
|
+
try {
|
|
200
|
+
await MicrosoftTeamsReplies.sendCardWithinSizeLimit({
|
|
201
|
+
turnContext: data.turnContext,
|
|
202
|
+
buildCard: data.buildCard,
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
catch (error) {
|
|
206
|
+
MicrosoftTeamsReplies.logFailure(`Microsoft Teams did not accept the form to create ${data.form.what}`, error, {
|
|
207
|
+
projectId: data.projectId.toString(),
|
|
208
|
+
});
|
|
209
|
+
await MicrosoftTeamsReplies.sendBestEffort(data.turnContext, this.getFormNotAcceptedMessage({
|
|
210
|
+
form: data.form,
|
|
211
|
+
error: error,
|
|
212
|
+
createInOneUptimeUrl: data.createInOneUptimeUrl,
|
|
213
|
+
}));
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
static async replyFormCouldNotLoad(data) {
|
|
217
|
+
MicrosoftTeamsReplies.logFailure(`Could not load the Microsoft Teams form to create ${data.form.what}`, data.error, {
|
|
218
|
+
projectId: data.projectId.toString(),
|
|
219
|
+
});
|
|
220
|
+
const createInOneUptimeUrl = await MicrosoftTeamsReplies.getDashboardLink({
|
|
221
|
+
projectId: data.projectId,
|
|
222
|
+
route: data.form.dashboardRoute,
|
|
223
|
+
});
|
|
224
|
+
await MicrosoftTeamsReplies.sendBestEffort(data.turnContext, `Sorry, I couldn't open the form to create ${data.form.what} because OneUptime could not load the lists it needs just now. Please try again in a minute, ${this.getCreateInOneUptimeHint(createInOneUptimeUrl, "or create it")}`);
|
|
225
|
+
}
|
|
226
|
+
static getFormNotAcceptedMessage(data) {
|
|
227
|
+
const createInOneUptime = this.getCreateInOneUptimeHint(data.createInOneUptimeUrl, "You can create it");
|
|
228
|
+
if (MicrosoftTeamsMessageSize.isMessageTooLargeError(data.error)) {
|
|
229
|
+
return `Sorry, I couldn't open the form to create ${data.form.what}: Microsoft Teams refused it as too large, even without the lists of ${data.form.lists}. ${createInOneUptime}`;
|
|
230
|
+
}
|
|
231
|
+
const statusCode = MicrosoftTeamsMessageSize.getErrorStatusCode(data.error);
|
|
232
|
+
const code = MicrosoftTeamsMessageSize.getErrorCode(data.error);
|
|
233
|
+
const teamsReason = [statusCode, code]
|
|
234
|
+
.filter((part) => {
|
|
235
|
+
return part !== undefined && part !== "";
|
|
236
|
+
})
|
|
237
|
+
.join(" ");
|
|
238
|
+
return `Sorry, I couldn't open the form to create ${data.form.what}: Microsoft Teams did not accept it${teamsReason ? ` (${teamsReason})` : ""}. ${createInOneUptime}`;
|
|
239
|
+
}
|
|
240
|
+
static getCreateInOneUptimeHint(createInOneUptimeUrl, lead) {
|
|
241
|
+
return createInOneUptimeUrl
|
|
242
|
+
? `${lead} in OneUptime instead: ${createInOneUptimeUrl}`
|
|
243
|
+
: `${lead} in OneUptime instead.`;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
__decorate([
|
|
247
|
+
CaptureSpan(),
|
|
248
|
+
__metadata("design:type", Function),
|
|
249
|
+
__metadata("design:paramtypes", [Object]),
|
|
250
|
+
__metadata("design:returntype", Promise)
|
|
251
|
+
], MicrosoftTeamsCreateCommands, "handleCreateIncidentCommand", null);
|
|
252
|
+
__decorate([
|
|
253
|
+
CaptureSpan(),
|
|
254
|
+
__metadata("design:type", Function),
|
|
255
|
+
__metadata("design:paramtypes", [Object]),
|
|
256
|
+
__metadata("design:returntype", Promise)
|
|
257
|
+
], MicrosoftTeamsCreateCommands, "handleCreateScheduledMaintenanceCommand", null);
|
|
258
|
+
//# sourceMappingURL=MicrosoftTeamsCreateCommands.js.map
|