@oneuptime/common 14.0.0 → 14.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Models/DatabaseModels/AlertEpisodeMember.ts +8 -1
- package/Models/DatabaseModels/AutoRemediationSuggestion.ts +63 -0
- package/Models/DatabaseModels/IncidentEpisodeMember.ts +8 -1
- package/Models/DatabaseModels/IncidentEpisodePublicNote.ts +9 -2
- package/Models/DatabaseModels/IncidentPublicNote.ts +9 -2
- package/Models/DatabaseModels/Index.ts +4 -0
- package/Models/DatabaseModels/KubernetesCluster.ts +429 -0
- package/Models/DatabaseModels/Monitor.ts +48 -0
- package/Models/DatabaseModels/Runner.ts +5 -4
- package/Models/DatabaseModels/RunnerJob.ts +66 -0
- package/Models/DatabaseModels/ScheduledMaintenancePublicNote.ts +10 -2
- package/Models/DatabaseModels/ServiceLevelObjectiveFeed.ts +2 -0
- package/Models/DatabaseModels/ServiceLevelObjectiveLabelRule.ts +522 -0
- package/Models/DatabaseModels/ServiceLevelObjectiveMonitorRule.ts +38 -4
- package/Models/DatabaseModels/ServiceLevelObjectiveOwnerRule.ts +603 -0
- package/Models/DatabaseModels/WorkflowVariable.ts +479 -2
- package/Models/DatabaseModels/WorkspaceProjectAuthToken.ts +79 -25
- package/Server/API/AIInvestigationAPI.ts +341 -0
- package/Server/API/AutoRemediationAPI.ts +184 -2
- package/Server/API/CommonAPI.ts +70 -0
- package/Server/API/KubernetesClusterAiAccessAPI.ts +793 -0
- package/Server/API/MicrosoftTeamsAPI.ts +770 -315
- package/Server/API/MonitorAPI.ts +140 -0
- package/Server/API/OnCallScheduleTimelineAPI.ts +5 -21
- package/Server/API/SlackAPI.ts +447 -99
- package/Server/API/StatusPageAPI.ts +146 -26
- package/Server/API/TelemetryAPI.ts +216 -5
- package/Server/API/UserTwoFactorBackupCodeAPI.ts +1 -0
- package/Server/API/WorkflowVariableAPI.ts +156 -0
- package/Server/Infrastructure/GlobalCache.ts +35 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1794100000000-AddSloLabelAndOwnerRules.ts +248 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1794200000000-AddSloMonitorRuleMonitorType.ts +19 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1794300000000-AddOAuth2WorkflowVariables.ts +97 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1794400000000-AddKubernetesClusterAiAccess.ts +129 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1794500000000-AddIncomingEmailCustomAddressToMonitor.ts +25 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1794600000000-AddAuthTokenExpiresAtToWorkspaceProjectAuthToken.ts +20 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1794700000000-RemoveAppAccessTokenFromWorkspaceProjectAuthTokenMiscData.ts +38 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +14 -0
- package/Server/Middleware/MasterAdminAuthorization.ts +28 -0
- package/Server/Middleware/TelemetryIngest.ts +47 -2
- package/Server/Middleware/UserAuthorization.ts +56 -2
- package/Server/Services/AIAgentService.ts +1 -0
- package/Server/Services/AccessTokenService.ts +121 -48
- package/Server/Services/AlertEpisodeMemberService.ts +9 -0
- package/Server/Services/AlertEpisodeService.ts +14 -1
- package/Server/Services/AlertService.ts +134 -22
- package/Server/Services/AutoRemediationRuleEngineService.ts +968 -39
- package/Server/Services/AutoRemediationRuleService.ts +118 -0
- package/Server/Services/BillingService.ts +1 -0
- package/Server/Services/DatabaseService.ts +10 -0
- package/Server/Services/InboundEmail/Providers/SendGridInboundProvider.ts +16 -22
- package/Server/Services/IncidentEpisodeMemberService.ts +9 -0
- package/Server/Services/IncidentEpisodePublicNoteService.ts +66 -0
- package/Server/Services/IncidentEpisodeRoleMemberService.ts +27 -0
- package/Server/Services/IncidentEpisodeService.ts +14 -1
- package/Server/Services/IncidentGroupingEngineService.ts +11 -0
- package/Server/Services/IncidentMemberService.ts +21 -0
- package/Server/Services/IncidentPublicNoteService.ts +63 -0
- package/Server/Services/IncidentService.ts +120 -20
- package/Server/Services/IncidentStateTimelineService.ts +15 -0
- package/Server/Services/IncidentTemplateService.ts +83 -3
- package/Server/Services/Index.ts +4 -0
- package/Server/Services/KubernetesClusterAiAccessService.ts +1943 -0
- package/Server/Services/KubernetesClusterService.ts +1570 -1
- package/Server/Services/LogAggregationService.ts +14 -6
- package/Server/Services/MonitorService.ts +654 -54
- package/Server/Services/MonitorStatusTimelineService.ts +639 -2
- package/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.ts +2 -0
- package/Server/Services/OnCallDutyPolicyEscalationRuleTeamService.ts +2 -0
- package/Server/Services/OnCallDutyPolicyEscalationRuleUserService.ts +2 -0
- package/Server/Services/OnCallDutyPolicyScheduleService.ts +3 -0
- package/Server/Services/OnCallNotificationAlertingService.ts +36 -12
- package/Server/Services/OnCallSetupReminderService.ts +1 -0
- package/Server/Services/ProbeService.ts +7 -1
- package/Server/Services/ProjectService.ts +11 -1
- package/Server/Services/RunbookCredentialService.ts +26 -1
- package/Server/Services/RunbookSecretService.ts +36 -0
- package/Server/Services/RunnerJobService.ts +941 -23
- package/Server/Services/RunnerService.ts +439 -6
- package/Server/Services/ScheduledMaintenancePublicNoteService.ts +66 -0
- package/Server/Services/ScheduledMaintenanceService.ts +124 -19
- package/Server/Services/ScheduledMaintenanceTemplateService.ts +82 -3
- package/Server/Services/ServiceLevelObjectiveLabelRuleEngineService.ts +385 -0
- package/Server/Services/ServiceLevelObjectiveLabelRuleService.ts +51 -0
- package/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.ts +92 -16
- package/Server/Services/ServiceLevelObjectiveMonitorRuleService.ts +36 -1
- package/Server/Services/ServiceLevelObjectiveOwnerRuleEngineService.ts +521 -0
- package/Server/Services/ServiceLevelObjectiveOwnerRuleService.ts +51 -0
- package/Server/Services/ServiceLevelObjectiveService.ts +42 -1
- package/Server/Services/StatusPagePrivateUserService.ts +1 -0
- package/Server/Services/StatusPageService.ts +301 -74
- package/Server/Services/StatusPageSubscriberService.ts +4 -0
- package/Server/Services/TeamMemberService.ts +309 -7
- package/Server/Services/TraceAggregationService.ts +10 -6
- package/Server/Services/UserEmailService.ts +1 -0
- package/Server/Services/UserNotificationMethodAdminService.ts +1 -0
- package/Server/Services/UserNotificationRuleAdminService.ts +1 -0
- package/Server/Services/UserNotificationRuleService.ts +4 -0
- package/Server/Services/UserService.ts +122 -1
- package/Server/Services/WorkflowVariableService.ts +593 -8
- package/Server/Services/WorkspaceNotificationRuleService.ts +588 -8
- package/Server/Services/WorkspaceProjectAuthTokenService.ts +170 -1
- package/Server/Types/Database/QueryHelper.ts +22 -0
- package/Server/Types/Markdown.ts +502 -27
- package/Server/Types/Workflow/Components/Telegram/SendMessageToChat.ts +27 -1
- package/Server/Utils/AI/ClusterAccess/ClusterAccessContext.ts +182 -0
- package/Server/Utils/AI/ClusterAccess/KubectlInvestigationToolkit.ts +525 -0
- package/Server/Utils/AI/ClusterAccess/KubectlJobRunner.ts +854 -0
- package/Server/Utils/AI/CodeFix/CodeFixAgentAuth.ts +22 -2
- package/Server/Utils/AI/Remediation/RemediationCommandTools.ts +1916 -307
- package/Server/Utils/AI/Remediation/RemediationExecutionRunner.ts +1601 -74
- package/Server/Utils/AI/SRE/AIInvestigationEngine.ts +139 -7
- package/Server/Utils/AI/SRE/AlertInvestigationRunner.ts +58 -1
- package/Server/Utils/AI/SRE/IncidentInvestigationRunner.ts +54 -1
- package/Server/Utils/AI/Toolbox/AIActionTools.ts +14 -6
- package/Server/Utils/AI/Toolbox/ResourceTools.ts +4 -2
- package/Server/Utils/AI/Toolbox/SloTools.ts +1 -0
- package/Server/Utils/AutoRemediation/CommandPlanExecutor.ts +1341 -150
- package/Server/Utils/AutoRemediation/RemediationVerifier.ts +375 -4
- package/Server/Utils/Database/AffectedResourceRelations.ts +127 -0
- package/Server/Utils/Database/ProjectScopedReferenceValidator.ts +240 -1
- package/Server/Utils/EmailRollup/EmailRollupFlushRunner.ts +1 -0
- package/Server/Utils/Monitor/AffectedResourceList.ts +31 -73
- package/Server/Utils/Monitor/Criteria/CompareCriteria.ts +1 -1
- package/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.ts +1 -1
- package/Server/Utils/Monitor/MonitorAlert.ts +83 -9
- package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +181 -136
- package/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.ts +5 -1
- package/Server/Utils/Monitor/MonitorIncident.ts +104 -9
- package/Server/Utils/Monitor/MonitorPayloadRedaction.ts +124 -7
- package/Server/Utils/Monitor/ProbeMonitorsNotification.ts +407 -0
- package/Server/Utils/Monitor/RootCauseList.ts +139 -0
- package/Server/Utils/OnCall/OnCallShiftReminderRunner.ts +1 -0
- package/Server/Utils/PushNotificationUtil.ts +45 -0
- package/Server/Utils/Rules/OwnerRuleAssignment.ts +40 -3
- package/Server/Utils/Rules/RuleRun/RuleRunRegistry.ts +28 -0
- package/Server/Utils/Runbook/RunbookExecutePermission.ts +56 -6
- package/Server/Utils/SessionReplay/SessionReplayReadService.ts +223 -33
- package/Server/Utils/SessionReplay/SessionReplayUserFlowReadService.ts +559 -0
- package/Server/Utils/Slo/SloRulePatternValidator.ts +42 -0
- package/Server/Utils/StartServer.ts +4 -3
- package/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.ts +528 -0
- package/Server/Utils/TwoFactorBackupCodeNotification.ts +1 -0
- package/Server/Utils/UserPermission/UserPermission.ts +16 -0
- package/Server/Utils/Workflow/OAuth2TokenClient.ts +704 -0
- package/Server/Utils/Workflow/WorkflowVariableOAuthToken.ts +318 -0
- package/Server/Utils/Workspace/MicrosoftTeams/Actions/Alert.ts +47 -7
- package/Server/Utils/Workspace/MicrosoftTeams/Actions/AlertEpisode.ts +57 -16
- package/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.ts +193 -214
- package/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.ts +57 -13
- package/Server/Utils/Workspace/MicrosoftTeams/Actions/Monitor.ts +54 -17
- package/Server/Utils/Workspace/MicrosoftTeams/Actions/ScheduledMaintenance.ts +179 -161
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +281 -167
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsServiceUrl.ts +114 -0
- package/Server/Utils/Workspace/MicrosoftTeams/ReactionNoteSync.ts +895 -0
- package/Server/Utils/Workspace/Slack/Actions/ActionTypes.ts +7 -9
- package/Server/Utils/Workspace/Slack/Actions/Alert.ts +96 -227
- package/Server/Utils/Workspace/Slack/Actions/AlertEpisode.ts +93 -214
- package/Server/Utils/Workspace/Slack/Actions/Auth.ts +30 -3
- package/Server/Utils/Workspace/Slack/Actions/Authorization.ts +99 -0
- package/Server/Utils/Workspace/Slack/Actions/Incident.ts +117 -283
- package/Server/Utils/Workspace/Slack/Actions/IncidentEpisode.ts +101 -196
- package/Server/Utils/Workspace/Slack/Actions/ReactionNote.ts +329 -0
- package/Server/Utils/Workspace/Slack/Actions/ScheduledMaintenance.ts +111 -287
- package/Server/Utils/Workspace/Slack/Slack.ts +86 -17
- package/Server/Utils/Workspace/Slack/app-manifest.json +2 -0
- package/Server/Utils/Workspace/Workspace.ts +171 -54
- package/Server/Utils/Workspace/WorkspaceActionAuthorization.ts +252 -0
- package/Server/Utils/Workspace/WorkspaceBase.ts +39 -0
- package/Server/Utils/Workspace/WorkspaceOAuthState.ts +280 -0
- package/Server/Utils/Workspace/WorkspaceProjectReferenceValidator.ts +96 -0
- package/Server/Utils/Workspace/WorkspaceReactionNote.ts +620 -0
- package/Tests/App/Dashboard/AttributesJSONDashboardSurfaces.test.tsx +496 -0
- package/Tests/App/Dashboard/AutoRemediationRulesTableCommandRunners.test.tsx +152 -0
- package/Tests/App/Dashboard/BreadcrumbCoverage.test.tsx +32 -0
- package/Tests/App/Dashboard/ClusterAccessNotice.test.tsx +794 -0
- package/Tests/App/Dashboard/CreateOAuthWorkflowVariableModal.test.tsx +840 -0
- package/Tests/App/Dashboard/CreateWorkflowModal.test.tsx +653 -0
- package/Tests/App/Dashboard/DatabaseMonitorStepForm.test.tsx +197 -0
- package/Tests/App/Dashboard/DatabaseMonitorView.test.tsx +376 -0
- package/Tests/App/Dashboard/DisabledWarningRobustness.test.tsx +262 -0
- package/Tests/App/Dashboard/EventNotes.test.tsx +2080 -0
- package/Tests/App/Dashboard/EventNotesPages.test.tsx +486 -0
- package/Tests/App/Dashboard/EventNotesUtil.test.ts +933 -0
- package/Tests/App/Dashboard/ExceptionMonitorEnvironmentFilter.test.tsx +218 -0
- package/Tests/App/Dashboard/FeedFilterSortIntegration.test.tsx +1632 -0
- package/Tests/App/Dashboard/FeedOptionsLocales.test.ts +250 -0
- package/Tests/App/Dashboard/FeedOrdering.test.ts +279 -9
- package/Tests/App/Dashboard/IncidentChangeStateNotifyDefault.test.tsx +665 -0
- package/Tests/App/Dashboard/IncidentEpisodeFeedPublicNoteNotifyDefault.test.tsx +494 -0
- package/Tests/App/Dashboard/IncidentEpisodeOverviewNotifyDefault.test.tsx +706 -0
- package/Tests/App/Dashboard/IncidentFeedPublicNoteNotifyDefault.test.tsx +472 -0
- package/Tests/App/Dashboard/IncidentOverviewNotifyDefault.test.tsx +858 -0
- package/Tests/App/Dashboard/IncomingEmailAddressSettings.test.tsx +567 -0
- package/Tests/App/Dashboard/InvestigationClusterToolFormat.test.ts +241 -0
- package/Tests/App/Dashboard/InvestigationEvidenceKubectl.test.tsx +322 -0
- package/Tests/App/Dashboard/InvestigationFeedRefresh.test.tsx +60 -1
- package/Tests/App/Dashboard/InvestigationPanel.test.tsx +606 -3
- package/Tests/App/Dashboard/InvestigationPanelClusterAccess.test.tsx +476 -0
- package/Tests/App/Dashboard/InvestigationRunDetailsKubectl.test.tsx +383 -0
- package/Tests/App/Dashboard/KubectlActivitySummary.test.tsx +366 -0
- package/Tests/App/Dashboard/KubernetesClusterAiAccessSettings.test.ts +2886 -0
- package/Tests/App/Dashboard/KubernetesClusterAiPage.test.tsx +2688 -0
- package/Tests/App/Dashboard/KubernetesClusterAiPageServerParity.test.ts +915 -0
- package/Tests/App/Dashboard/LayerDateTimeFieldTimezoneName.test.tsx +66 -0
- package/Tests/App/Dashboard/LogMonitorPreview.test.tsx +174 -0
- package/Tests/App/Dashboard/MonitorFeedRefresh.test.tsx +279 -0
- package/Tests/App/Dashboard/MonitorMetricQueryConfig.test.ts +244 -0
- package/Tests/App/Dashboard/MonitorOpenWorkCard.test.tsx +381 -0
- package/Tests/App/Dashboard/MonitorOpenWorkHook.test.tsx +784 -0
- package/Tests/App/Dashboard/MonitorOverviewData.test.tsx +2199 -0
- package/Tests/App/Dashboard/MonitorOverviewHero.test.tsx +1169 -0
- package/Tests/App/Dashboard/MonitorOverviewInput.test.ts +1127 -0
- package/Tests/App/Dashboard/MonitorOverviewPage.test.tsx +2136 -0
- package/Tests/App/Dashboard/MonitorOverviewSelectReadable.test.ts +368 -0
- package/Tests/App/Dashboard/MonitorOverviewStatBar.test.tsx +526 -0
- package/Tests/App/Dashboard/MonitorOverviewSupportingCards.test.tsx +542 -0
- package/Tests/App/Dashboard/MonitorOwnersCombine.test.ts +299 -0
- package/Tests/App/Dashboard/MonitorProbesCard.test.tsx +602 -0
- package/Tests/App/Dashboard/MonitorResponseTimeCard.test.tsx +386 -0
- package/Tests/App/Dashboard/MonitorSetupAndConnectionCards.test.tsx +612 -0
- package/Tests/App/Dashboard/MonitorStatusChangesCard.test.tsx +257 -0
- package/Tests/App/Dashboard/MonitorSummaryTestMonitorButton.test.tsx +360 -1
- package/Tests/App/Dashboard/MonitorUptimeHistoryCard.test.tsx +835 -0
- package/Tests/App/Dashboard/MonitorUptimeSummaryHook.test.tsx +971 -0
- package/Tests/App/Dashboard/MonitorViewLayout.test.tsx +580 -0
- package/Tests/App/Dashboard/OnCallLayerRestrictionTimesPreserved.test.tsx +441 -0
- package/Tests/App/Dashboard/OnCallNavbar.test.tsx +214 -0
- package/Tests/App/Dashboard/OnCallSchedulePreviewCalendarDisplay.test.tsx +1389 -0
- package/Tests/App/Dashboard/OnCallSchedulePreviewOverrides.test.tsx +205 -1
- package/Tests/App/Dashboard/OnCallScheduleTimeInputsSettingsZone.test.tsx +198 -0
- package/Tests/App/Dashboard/ProductOrientation.test.tsx +646 -0
- package/Tests/App/Dashboard/PublicNotePagesNotifyDefault.test.tsx +524 -0
- package/Tests/App/Dashboard/RemediationSuggestionCardApproval.test.tsx +702 -0
- package/Tests/App/Dashboard/RemoveUserFromProject.test.tsx +427 -0
- package/Tests/App/Dashboard/ResourceArchiveSettings.test.tsx +4 -0
- package/Tests/App/Dashboard/ResourceFeed.test.tsx +612 -2
- package/Tests/App/Dashboard/ResourceFeedPageWiring.test.ts +30 -0
- package/Tests/App/Dashboard/ResourceFeedPagesFilterSort.test.tsx +1202 -0
- package/Tests/App/Dashboard/RumSessionReplaySideMenu.test.tsx +3 -1
- package/Tests/App/Dashboard/RunbookStepTypeMaps.test.ts +166 -0
- package/Tests/App/Dashboard/RunnerKubernetesAgentForm.test.tsx +622 -0
- package/Tests/App/Dashboard/ScheduledMaintenanceChangeStateNotifyDefault.test.tsx +1491 -0
- package/Tests/App/Dashboard/ScheduledMaintenanceFeedPublicNoteNotifyDefault.test.tsx +489 -0
- package/Tests/App/Dashboard/ScheduledMaintenanceFeedRefresh.test.tsx +52 -1
- package/Tests/App/Dashboard/ScheduledMaintenanceOverviewNotifyDefault.test.tsx +909 -0
- package/Tests/App/Dashboard/ScheduledMaintenanceOverviewPage.test.tsx +14 -0
- package/Tests/App/Dashboard/ScheduledMaintenanceWindowStatsTranslation.test.tsx +307 -0
- package/Tests/App/Dashboard/SecurityEventAttributeColumnPicker.test.tsx +542 -0
- package/Tests/App/Dashboard/SecurityEventConnectionFormModal.test.tsx +174 -0
- package/Tests/App/Dashboard/SecurityEventConnectionsEmptyState.test.tsx +973 -212
- package/Tests/App/Dashboard/SecurityEventConnectionsTable.test.tsx +491 -52
- package/Tests/App/Dashboard/SecurityEventDetailPanel.test.tsx +301 -0
- package/Tests/App/Dashboard/SecurityEventListRow.test.tsx +158 -1
- package/Tests/App/Dashboard/SecurityEventProviderTile.test.tsx +869 -0
- package/Tests/App/Dashboard/SecurityEventsEmptyState.test.tsx +959 -94
- package/Tests/App/Dashboard/SecurityEventsNoResults.test.tsx +2 -0
- package/Tests/App/Dashboard/SecurityEventsViewer.test.tsx +274 -1
- package/Tests/App/Dashboard/SloFeed.test.tsx +106 -1
- package/Tests/App/Dashboard/SloMonitorRuleCriteria.test.tsx +566 -0
- package/Tests/App/Dashboard/SloNavigationWiring.test.tsx +6 -4
- package/Tests/App/Dashboard/SloNoticeBanner.test.tsx +186 -0
- package/Tests/App/Dashboard/SloOverviewKpiStrip.test.tsx +388 -44
- package/Tests/App/Dashboard/SloOverviewLayout.test.tsx +613 -0
- package/Tests/App/Dashboard/TeamMembershipRemoval.test.ts +900 -0
- package/Tests/App/Dashboard/TeamMembershipRemovalPages.test.tsx +460 -0
- package/Tests/App/Dashboard/TimezoneElements.test.tsx +321 -0
- package/Tests/App/Dashboard/TimezoneSelectButton.test.tsx +634 -0
- package/Tests/App/Dashboard/TraceExplorer.test.tsx +260 -0
- package/Tests/App/Dashboard/TraceMonitorPreview.test.tsx +182 -0
- package/Tests/App/Dashboard/UserTimezoneInit.test.tsx +544 -0
- package/Tests/App/Dashboard/WorkflowVariableModals.test.tsx +1630 -0
- package/Tests/App/Dashboard/WorkflowVariableRoutes.test.tsx +603 -0
- package/Tests/App/Dashboard/WorkflowVariableTokenStatus.test.tsx +589 -0
- package/Tests/App/Dashboard/WorkflowVariableUtil.test.ts +1543 -0
- package/Tests/App/Dashboard/WorkflowVariableView.test.tsx +3227 -0
- package/Tests/App/Dashboard/WorkflowVariablesTable.test.tsx +1277 -395
- package/Tests/App/StatusPage/StatusPageOverviewMonitorGroupUptime.test.tsx +714 -0
- package/Tests/App/StatusPage/StatusPageOverviewUptimeBars.NewYork.test.tsx +1009 -0
- package/Tests/App/StatusPage/StatusPageOverviewUptimeBars.test.tsx +1092 -0
- package/Tests/Models/DatabaseModels/DomainRoleTierCoverage.test.ts +5 -0
- package/Tests/Models/DatabaseModels/KubernetesClusterAiAccessColumns.test.ts +520 -0
- package/Tests/Models/DatabaseModels/MonitorSecretKeyColumnAccessControl.test.ts +66 -2
- package/Tests/Models/DatabaseModels/ResourceFeedModels.test.ts +0 -8
- package/Tests/Models/DatabaseModels/SloLabelAndOwnerRuleModels.test.ts +404 -0
- package/Tests/Models/DatabaseModels/SloOverhaulModels.test.ts +17 -1
- package/Tests/Models/DatabaseModels/StaticRuleCriteriaInheritance.test.ts +4 -2
- package/Tests/Models/DatabaseModels/WorkspaceProjectAuthTokenAccessControl.test.ts +236 -0
- package/Tests/Models/IncidentEpisodePublicNoteNotifyColumnContract.test.ts +103 -0
- package/Tests/Models/IncidentPublicNoteNotifyColumnContract.test.ts +96 -0
- package/Tests/Models/ScheduledMaintenancePublicNoteNotifyColumnContract.test.ts +111 -0
- package/Tests/Server/API/AIInvestigationAPI.test.ts +976 -0
- package/Tests/Server/API/AutoRemediationApproveKubectlRecheck.test.ts +836 -0
- package/Tests/Server/API/CommonAPIAssertCanCreateTable.test.ts +565 -0
- package/Tests/Server/API/CommonAPIAssertCanReadTable.test.ts +282 -0
- package/Tests/Server/API/KubernetesClusterAiAccessAPI.test.ts +1744 -0
- package/Tests/Server/API/LogHistogramAPI.test.ts +371 -0
- package/Tests/Server/API/MicrosoftTeamsLegacyWebhookRemoval.test.ts +125 -30
- package/Tests/Server/API/MicrosoftTeamsOAuthState.test.ts +1121 -0
- package/Tests/Server/API/MonitorUptimeSummaryAPI.test.ts +685 -0
- package/Tests/Server/API/SessionReplayAPI.test.ts +602 -1
- package/Tests/Server/API/SlackChannelCacheAPI.test.ts +358 -0
- package/Tests/Server/API/SlackOAuthState.test.ts +688 -0
- package/Tests/Server/API/StatusPageOverviewMonitorGroupUptime.test.ts +527 -0
- package/Tests/Server/API/StatusPageTestEmailReportAuth.test.ts +2 -0
- package/Tests/Server/API/StatusPageUptimeAPI.test.ts +427 -0
- package/Tests/Server/API/UserProjectsAPI.test.ts +4 -0
- package/Tests/Server/API/WorkflowVariableAPI.test.ts +404 -0
- package/Tests/Server/API/WorkspaceOAuthTestHelpers.ts +289 -0
- package/Tests/Server/API/WorkspaceSendTestNotificationRoutes.test.ts +2064 -0
- package/Tests/Server/Infrastructure/GlobalCache.test.ts +86 -0
- package/Tests/Server/Infrastructure/Postgres/AddConfigurableRuleCriteriaMigration.test.ts +3 -0
- package/Tests/Server/Infrastructure/Postgres/AddKubernetesClusterAiAccessMigration.test.ts +589 -0
- package/Tests/Server/Infrastructure/Postgres/AddOAuth2WorkflowVariablesMigration.test.ts +254 -0
- package/Tests/Server/Infrastructure/Postgres/AddSloLabelAndOwnerRulesMigration.test.ts +407 -0
- package/Tests/Server/Infrastructure/Postgres/AddSloMonitorRuleMonitorTypeMigration.test.ts +171 -0
- package/Tests/Server/Infrastructure/Postgres/SloProductOverhaulMigration.test.ts +88 -4
- package/Tests/Server/Middleware/BlockedUserMiddleware.test.ts +403 -0
- package/Tests/Server/Middleware/MasterAdminAuthorization.test.ts +13 -0
- package/Tests/Server/Middleware/PublicRouteUserMiddleware.test.ts +2 -0
- package/Tests/Server/Middleware/RemovedProjectMemberAuthorization.test.ts +469 -0
- package/Tests/Server/Middleware/TelemetryIngestBrowserKey.test.ts +77 -1
- package/Tests/Server/Middleware/TelemetryIngestKubernetesAgentRunnerPinnedKey.test.ts +211 -0
- package/Tests/Server/Middleware/TelemetryIngestKubernetesAgentRunnerRateLimit.test.ts +358 -0
- package/Tests/Server/Middleware/UserAuthorization.test.ts +97 -0
- package/Tests/Server/Middleware/UserAuthorizationEditionEnforcement.test.ts +2 -0
- package/Tests/Server/Services/AccessTokenProjectUserGrant.test.ts +14 -2
- package/Tests/Server/Services/AccessTokenRemovedMemberAccess.test.ts +1044 -0
- package/Tests/Server/Services/AddOwnersIdempotency.test.ts +5 -0
- package/Tests/Server/Services/AlertEpisodeMemberCreatePermission.test.ts +139 -0
- package/Tests/Server/Services/AutoRemediationClusterRuleEngine.test.ts +1361 -0
- package/Tests/Server/Services/AutoRemediationRuleCommandRunners.test.ts +375 -0
- package/Tests/Server/Services/CrossProjectRelationWriteGuard.test.ts +2384 -0
- package/Tests/Server/Services/DatabaseServiceRuleCriteriaValidation.test.ts +104 -0
- package/Tests/Server/Services/FindOwnersProjectMembership.test.ts +267 -0
- package/Tests/Server/Services/InboundEmail/SendGridInboundProviderAddress.test.ts +90 -0
- package/Tests/Server/Services/IncidentEpisodeMemberCreatePermission.test.ts +143 -0
- package/Tests/Server/Services/IncidentEpisodePublicNoteNotifyDefault.test.ts +805 -0
- package/Tests/Server/Services/IncidentPublicNoteNotifyDefault.test.ts +724 -0
- package/Tests/Server/Services/IncidentRoleProjectMembership.test.ts +233 -0
- package/Tests/Server/Services/KubernetesClusterAiAccessAgentRunnerAssignments.test.ts +372 -0
- package/Tests/Server/Services/KubernetesClusterAiAccessBindingGuard.test.ts +1876 -0
- package/Tests/Server/Services/KubernetesClusterAiAccessDeletedRunnerRemedy.test.ts +620 -0
- package/Tests/Server/Services/KubernetesClusterAiAccessGapNextSteps.test.ts +421 -0
- package/Tests/Server/Services/KubernetesClusterAiAccessService.test.ts +3662 -0
- package/Tests/Server/Services/KubernetesClusterAiAccessSubjectClusters.test.ts +405 -0
- package/Tests/Server/Services/KubernetesClusterAiSettingsPermission.test.ts +975 -0
- package/Tests/Server/Services/KubernetesClusterServiceAiAccessFeed.test.ts +497 -0
- package/Tests/Server/Services/KubernetesClusterServiceDeleteSettlesRemediation.test.ts +328 -0
- package/Tests/Server/Services/LogAggregationService.test.ts +99 -0
- package/Tests/Server/Services/MonitorServiceIncomingEmailCustomAddress.test.ts +447 -0
- package/Tests/Server/Services/MonitorServiceProbeFlagSync.test.ts +1334 -0
- package/Tests/Server/Services/MonitorServiceProbeStatusGrouping.test.ts +1640 -0
- package/Tests/Server/Services/MonitorServiceRefreshCurrentStatus.test.ts +225 -0
- package/Tests/Server/Services/MonitorStatusBridgeProbePath.test.ts +8 -8
- package/Tests/Server/Services/MonitorStatusTimelineDailyAggregates.test.ts +264 -1
- package/Tests/Server/Services/MonitorStatusTimelineMergedDowntime.test.ts +284 -0
- package/Tests/Server/Services/MonitorUptimeSummaryService.test.ts +1043 -0
- package/Tests/Server/Services/NetworkDeviceRuleEngines.test.ts +5 -0
- package/Tests/Server/Services/OnCallUndeliverablePageOwnerMembership.test.ts +359 -0
- package/Tests/Server/Services/ProbeServiceDashboardLink.test.ts +191 -0
- package/Tests/Server/Services/ProjectOwnersProjectMembership.test.ts +221 -0
- package/Tests/Server/Services/RuleRun/IncidentAlertMaintenanceRuleEnginesRun.test.ts +5 -0
- package/Tests/Server/Services/RuleRun/LabelRuleEnginesGroupBRun.test.ts +48 -1
- package/Tests/Server/Services/RuleRun/OwnerRuleEnginesGroupARun.test.ts +28 -0
- package/Tests/Server/Services/RuleRun/OwnerRuleEnginesGroupBRun.test.ts +39 -1
- package/Tests/Server/Services/RunnerJobEnqueueAiCommandAgentRunner.test.ts +230 -0
- package/Tests/Server/Services/RunnerJobEnqueueKubectl.test.ts +978 -0
- package/Tests/Server/Services/RunnerJobKubectlWriteScope.test.ts +866 -0
- package/Tests/Server/Services/RunnerJobSubmitResultRedaction.test.ts +322 -0
- package/Tests/Server/Services/RunnerJobSubmitResultUnstorableText.test.ts +357 -0
- package/Tests/Server/Services/RunnerJobTimeoutReason.test.ts +227 -0
- package/Tests/Server/Services/RunnerServiceAgentName.test.ts +581 -0
- package/Tests/Server/Services/ScheduledMaintenancePublicNoteNotifyDefault.test.ts +802 -0
- package/Tests/Server/Services/ScheduledMaintenanceSubscriberTemplateFormats.test.ts +53 -0
- package/Tests/Server/Services/ServiceLevelObjectiveLabelAndOwnerRuleEngines.test.ts +1175 -0
- package/Tests/Server/Services/ServiceLevelObjectiveLabelAndOwnerRuleServices.test.ts +172 -0
- package/Tests/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.test.ts +323 -0
- package/Tests/Server/Services/ServiceLevelObjectiveMonitorRuleService.test.ts +115 -0
- package/Tests/Server/Services/ServiceLevelObjectiveMonitorRuleTriggers.test.ts +21 -2
- package/Tests/Server/Services/ServiceLevelObjectiveMonitorTypePostgres.test.ts +480 -0
- package/Tests/Server/Services/ServiceLevelObjectiveService.test.ts +174 -0
- package/Tests/Server/Services/StaticRuleCriteriaRuntimeCoverage.test.ts +45 -6
- package/Tests/Server/Services/StatusPageSubscriberReport.test.ts +1176 -1
- package/Tests/Server/Services/TeamMemberBillingSeatSync.test.ts +9 -0
- package/Tests/Server/Services/TeamMemberOnCallCleanup.test.ts +18 -0
- package/Tests/Server/Services/TeamMemberProjectMembership.test.ts +255 -0
- package/Tests/Server/Services/TeamMemberRemovalRevokesProjectAccess.test.ts +600 -0
- package/Tests/Server/Services/TeamMemberResourceCleanup.test.ts +731 -0
- package/Tests/Server/Services/TeamMemberWorkspaceAccountCleanup.test.ts +164 -0
- package/Tests/Server/Services/TraceAggregationService.test.ts +64 -0
- package/Tests/Server/Services/UserServiceBlockedUser.test.ts +293 -0
- package/Tests/Server/Services/WorkflowVariableOAuthHooks.test.ts +1016 -0
- package/Tests/Server/Services/WorkflowVariableOAuthPostgres.test.ts +543 -0
- package/Tests/Server/Services/WorkflowVariableRenameUniqueness.test.ts +16 -5
- package/Tests/Server/Services/WorkspaceNotificationRuleNoteDelivery.test.ts +473 -0
- package/Tests/Server/Services/WorkspaceNotificationRuleSendTestNotification.test.ts +3690 -0
- package/Tests/Server/Services/WorkspaceProjectAuthTokenMiscDataSecrets.test.ts +374 -0
- package/Tests/Server/Services/WorkspaceProjectAuthTokenSlackChannelCache.test.ts +143 -0
- package/Tests/Server/Types/Database/FeedEventTypeFilterQuery.test.ts +745 -0
- package/Tests/Server/Types/Database/Permissions/WorkflowVariableOAuthColumnPermission.test.ts +250 -0
- package/Tests/Server/Types/Database/QueryHelperJsonContains.test.ts +96 -0
- package/Tests/Server/Types/Markdown.test.ts +1035 -1
- package/Tests/Server/Types/Workflow/Components/ApiComponentSsrf.test.ts +49 -0
- package/Tests/Server/Types/Workflow/Components/TelegramSendMessageToChat.test.ts +331 -0
- package/Tests/Server/Utils/AI/ClusterAccessContext.test.ts +285 -0
- package/Tests/Server/Utils/AI/CodeFix/CodeFixAgentAuth.test.ts +159 -1
- package/Tests/Server/Utils/AI/InvestigationClusterAccessWiring.test.ts +752 -0
- package/Tests/Server/Utils/AI/KubectlInvestigationToolkit.test.ts +1840 -0
- package/Tests/Server/Utils/AI/KubectlJobRunner.test.ts +1067 -0
- package/Tests/Server/Utils/AI/KubectlJobRunnerFinishedJob.test.ts +355 -0
- package/Tests/Server/Utils/AI/PostIncidentStatusUpdateTool.test.ts +496 -0
- package/Tests/Server/Utils/AI/RemediationCommandTools.test.ts +305 -0
- package/Tests/Server/Utils/AI/RemediationCommandToolsKubectl.test.ts +1365 -0
- package/Tests/Server/Utils/AI/RemediationCommandToolsKubectlOutcome.test.ts +639 -0
- package/Tests/Server/Utils/AI/RemediationCommandToolsLiveCluster.test.ts +1585 -0
- package/Tests/Server/Utils/AI/RemediationCommandToolsRunnerScope.test.ts +1065 -0
- package/Tests/Server/Utils/AI/RemediationExecutionRunner.test.ts +2138 -1
- package/Tests/Server/Utils/AI/RemediationExecutionRunnerClusterMode.test.ts +1035 -0
- package/Tests/Server/Utils/AI/RemediationKubectlCopyParity.test.ts +517 -0
- package/Tests/Server/Utils/AI/ResourceTools.test.ts +27 -1
- package/Tests/Server/Utils/AI/SloTools.test.ts +10 -0
- package/Tests/Server/Utils/AutoRemediation/CommandPlanExecutor.test.ts +1371 -24
- package/Tests/Server/Utils/AutoRemediation/CommandPlanExecutorRollbackRace.test.ts +962 -0
- package/Tests/Server/Utils/AutoRemediation/CommandPlanExecutorUnknownRun.test.ts +518 -0
- package/Tests/Server/Utils/AutoRemediation/CommandPlanVerification.test.ts +939 -2
- package/Tests/Server/Utils/Database/ProjectScopedRelationReferences.test.ts +371 -0
- package/Tests/Server/Utils/Monitor/AffectedResourceList.test.ts +64 -0
- package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteriaAnomalyUnits.test.ts +1 -1
- package/Tests/Server/Utils/Monitor/DatabaseMetricObservationRemediation.test.ts +102 -0
- package/Tests/Server/Utils/Monitor/MonitorAlertCriteriaReferences.test.ts +362 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluator.test.ts +405 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorBreachingSamples.test.ts +1156 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorMetricUnits.test.ts +106 -80
- package/Tests/Server/Utils/Monitor/MonitorEmailAddressRedaction.test.ts +255 -0
- package/Tests/Server/Utils/Monitor/MonitorIncidentCriteriaReferences.test.ts +347 -0
- package/Tests/Server/Utils/Monitor/MonitorIncidentMemberRoleMembership.test.ts +203 -0
- package/Tests/Server/Utils/Monitor/ProbeMonitorsNotification.test.ts +1147 -0
- package/Tests/Server/Utils/Monitor/RootCauseList.test.ts +252 -0
- package/Tests/Server/Utils/PushNotificationUtilCreators.test.ts +79 -0
- package/Tests/Server/Utils/ResourceFeed/ResourceFeedUtil.test.ts +21 -1
- package/Tests/Server/Utils/Rules/OwnerRuleAssignment.test.ts +155 -1
- package/Tests/Server/Utils/Rules/RuleRun/RuleRunPermission.test.ts +154 -0
- package/Tests/Server/Utils/SSRFProtection.test.ts +111 -0
- package/Tests/Server/Utils/SessionReplay/SessionReplayReadServiceQueries.test.ts +288 -0
- package/Tests/Server/Utils/SessionReplay/SessionReplayUserFlowReadService.test.ts +304 -0
- package/Tests/Server/Utils/Slo/SloRulePatternValidator.test.ts +67 -0
- package/Tests/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.test.ts +40 -3
- package/Tests/Server/Utils/VM/VMRunnerSsrf.test.ts +213 -0
- package/Tests/Server/Utils/Workflow/OAuth2TokenClient.test.ts +702 -0
- package/Tests/Server/Utils/Workflow/OAuth2TokenClientHttpIntegration.test.ts +507 -0
- package/Tests/Server/Utils/Workflow/WorkflowVariableOAuthToken.test.ts +831 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsActionAuthorization.test.ts +63 -1
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsAppAccessToken.test.ts +256 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsChannelSend.test.ts +60 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsChatActionAuthorization.test.ts +442 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsChats.test.ts +44 -2
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsDirectMessage.test.ts +55 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsReactionNoteSync.test.ts +1522 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsServiceUrl.test.ts +130 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsTeamInstalls.test.ts +4 -4
- package/Tests/Server/Utils/Workspace/Slack/SlackActionAuthorization.test.ts +691 -0
- package/Tests/Server/Utils/Workspace/Slack/SlackMessageByTimestamp.test.ts +253 -0
- package/Tests/Server/Utils/Workspace/Slack/SlackReactionNote.test.ts +574 -0
- package/Tests/Server/Utils/Workspace/WorkspaceActionAuthorization.test.ts +488 -0
- package/Tests/Server/Utils/Workspace/WorkspaceCreateProjectReferences.test.ts +861 -0
- package/Tests/Server/Utils/Workspace/WorkspaceMessageAuthor.test.ts +635 -0
- package/Tests/Server/Utils/Workspace/WorkspaceOAuthState.test.ts +548 -0
- package/Tests/Server/Utils/Workspace/WorkspaceReactionNote.test.ts +839 -0
- package/Tests/Server/Utils/Workspace/WorkspaceSendErrorMessage.test.ts +725 -0
- package/Tests/Types/API/Route.test.ts +56 -0
- package/Tests/Types/API/URLSchemeLikePath.test.ts +304 -0
- package/Tests/Types/AutoRemediation/AiRemediationCommandPlan.test.ts +283 -9
- package/Tests/Types/DateBrowserLocalWallClock.test.ts +280 -0
- package/Tests/Types/DateLocalShortMonthNameFallback.test.ts +389 -0
- package/Tests/Types/DateUserTimezone.test.ts +177 -4
- package/Tests/Types/Kubernetes/KubernetesAgentChartAiAccess.test.ts +306 -0
- package/Tests/Types/Kubernetes/KubernetesClusterAiAccess.test.ts +283 -0
- package/Tests/Types/Kubernetes/KubernetesRunnerPostureWriteScope.test.ts +68 -0
- package/Tests/Types/Monitor/DatabaseMonitor/SqlServerPlatform.test.ts +144 -0
- package/Tests/Types/Monitor/MonitorStepExceptionMonitor.test.ts +160 -0
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCoverage.test.ts +53 -0
- package/Tests/Types/Runbook/RunbookStepType.test.ts +91 -16
- package/Tests/Types/Runner/RunnerLiveStatus.test.ts +14 -3
- package/Tests/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.test.ts +15 -0
- package/Tests/Types/StatusPage/PublicNoteSubscriberNotificationDefault.test.ts +1868 -0
- package/Tests/Types/Timezone.test.ts +5 -0
- package/Tests/Types/TimezoneAlias.test.ts +1034 -0
- package/Tests/Types/Workflow/JiraTemplateFixtures.ts +833 -0
- package/Tests/Types/Workflow/JiraTemplateScripts.test.ts +5414 -0
- package/Tests/Types/Workflow/JiraTemplateSimulation.test.ts +4803 -0
- package/Tests/Types/Workflow/JiraTemplates.test.ts +5429 -0
- package/Tests/Types/Workflow/Templates.test.ts +79 -4
- package/Tests/Types/Workflow/WorkflowVariableOAuth.test.ts +520 -0
- package/Tests/Types/Workspace/WorkspaceNoteReaction.test.ts +177 -0
- package/Tests/UI/Components/AttributesJSON/AttributesJSONView.test.tsx +390 -0
- package/Tests/UI/Components/AttributesJSON/CopyAttributesAsJSONButton.test.tsx +566 -0
- package/Tests/UI/Components/AttributesJSON/JSONHighlight.test.ts +131 -0
- package/Tests/UI/Components/BasicFormDropdownNormalization.test.tsx +276 -1
- package/Tests/UI/Components/Calendar/Calendar.test.tsx +1611 -0
- package/Tests/UI/Components/Calendar/CalendarDayLayout.test.ts +1486 -0
- package/Tests/UI/Components/Calendar/CalendarDayLayoutDst.test.ts +632 -0
- package/Tests/UI/Components/Calendar/CalendarDst.test.tsx +388 -0
- package/Tests/UI/Components/Charts/ChartGroupPlotFloor.test.tsx +170 -0
- package/Tests/UI/Components/Charts/HistogramSelection.test.ts +282 -0
- package/Tests/UI/Components/CustomTimeRangeModal.test.tsx +6 -0
- package/Tests/UI/Components/CustomTimeRangeModalTimezoneTranslation.test.tsx +285 -0
- package/Tests/UI/Components/Dropdown.test.tsx +999 -2
- package/Tests/UI/Components/FeedOptions.test.ts +1404 -0
- package/Tests/UI/Components/FeedOptionsButton.test.tsx +2603 -0
- package/Tests/UI/Components/Forms/FormFieldCheckboxTranslation.test.tsx +216 -0
- package/Tests/UI/Components/Forms/FormFieldTimezoneDescriptionTranslation.test.tsx +461 -0
- package/Tests/UI/Components/Forms/IncidentEpisodePublicNoteNotifyPayload.test.tsx +641 -0
- package/Tests/UI/Components/Forms/IncidentPublicNoteNotifyPayload.test.tsx +346 -0
- package/Tests/UI/Components/Forms/ScheduledMaintenancePublicNoteNotifyPayload.test.tsx +493 -0
- package/Tests/UI/Components/Graphs/DayUptimeGraph.test.tsx +911 -2
- package/Tests/UI/Components/Graphs/DayUptimeGraphTimezone.NewYork.test.tsx +730 -0
- package/Tests/UI/Components/Graphs/DayUptimeGraphTimezone.Tokyo.test.tsx +506 -0
- package/Tests/UI/Components/HistogramClickToZoom.test.tsx +619 -0
- package/Tests/UI/Components/Icon.test.tsx +26 -0
- package/Tests/UI/Components/LogDetailsPanelAttributesJSON.test.tsx +248 -0
- package/Tests/UI/Components/LogsViewerHistogramZoom.test.tsx +47 -1
- package/Tests/UI/Components/LogsViewerSmallScreens.test.tsx +620 -0
- package/Tests/UI/Components/ModelPageModelChange.test.tsx +242 -3
- package/Tests/UI/Components/ModelTable/BaseModelTableDeleteConfirmation.test.tsx +521 -0
- package/Tests/UI/Components/MonitorGraphs/Uptime.test.tsx +406 -2
- package/Tests/UI/Components/MonitorGraphs/UptimeBarDayModal.test.tsx +169 -2
- package/Tests/UI/Components/RuleCriteria/RuleCriteriaModelTable.test.tsx +3 -3
- package/Tests/UI/Components/TelemetryViewer/TelemetryViewerHistogramClickZoom.test.tsx +266 -0
- package/Tests/UI/Components/TelemetryViewer/TelemetryViewerSmallScreens.test.tsx +439 -0
- package/Tests/UI/Components/TimezoneDropdownLegacyValues.test.tsx +704 -0
- package/Tests/UI/Components/UseHistogramZoom.test.tsx +89 -1
- package/Tests/UI/Components/UseLogsHistogram.test.tsx +175 -0
- package/Tests/UI/Components/useFeedItemsViewKey.test.tsx +1017 -0
- package/Tests/UI/Components/useFeedOptions.test.tsx +1107 -0
- package/Tests/UI/Monitor/MonitorSummarySnapshotRender.test.tsx +5 -5
- package/Tests/UI/Telemetry/TelemetryDetailPanel.test.tsx +28 -0
- package/Tests/UI/Utils/ProjectUsersModelAPI.test.ts +51 -0
- package/Tests/UI/Utils/Timezone.test.ts +747 -33
- package/Tests/UI/Workspace/SendTestNotificationButton.test.tsx +1854 -0
- package/Tests/UI/Workspace/WorkspaceCardsSendTestNotification.test.tsx +1864 -0
- package/Tests/Utils/AI/InvestigationReport.test.ts +435 -7
- package/Tests/Utils/AiRemediation/KubectlAllowlistValidatorParity.test.ts +1084 -0
- package/Tests/Utils/AiRemediation/KubectlOutputRedactor.test.ts +2531 -0
- package/Tests/Utils/AiRemediation/KubectlPolicy.test.ts +1895 -0
- package/Tests/Utils/AiRemediation/KubectlPolicyAllowlist.test.ts +428 -0
- package/Tests/Utils/AiRemediation/KubectlPolicyChartRbacParity.test.ts +828 -0
- package/Tests/Utils/AiRemediation/KubectlPolicyCustomResourceScope.test.ts +573 -0
- package/Tests/Utils/AiRemediation/KubectlPolicyDenials.test.ts +1525 -0
- package/Tests/Utils/AiRemediation/KubectlPolicyExposeOverrides.test.ts +275 -0
- package/Tests/Utils/AiRemediation/KubectlPolicyNodePatch.test.ts +428 -0
- package/Tests/Utils/AiRemediation/KubectlPolicyObjectWords.test.ts +195 -0
- package/Tests/Utils/AiRemediation/KubectlPolicyPatchParents.test.ts +637 -0
- package/Tests/Utils/AiRemediation/KubectlPolicyPodSecurityBaseline.test.ts +322 -0
- package/Tests/Utils/AiRemediation/KubectlPolicySafeWriteScope.test.ts +1026 -0
- package/Tests/Utils/AiRemediation/KubectlWaitBudget.test.ts +267 -0
- package/Tests/Utils/AiRemediation/KubectlWriteScope.test.ts +390 -0
- package/Tests/Utils/AiRemediation/KubectlWriteScopeCallerParity.test.ts +777 -0
- package/Tests/Utils/AiRemediation/KubectlWriteScopeClusterScoped.test.ts +613 -0
- package/Tests/Utils/AiRemediation/KubectlWriteScopeEntryPoint.test.ts +576 -0
- package/Tests/Utils/AiRemediation/KubectlWriteScopeKubectlSpellings.test.ts +752 -0
- package/Tests/Utils/AiRemediation/KubectlWriteScopeObjectWords.test.ts +358 -0
- package/Tests/Utils/AiRemediation/KubectlWriteScopeOverrides.test.ts +293 -0
- package/Tests/Utils/AiRemediation/KubectlWriteScopeParityCases.ts +598 -0
- package/Tests/Utils/AiRemediation/KubectlWriteScopePolicyParity.test.ts +403 -0
- package/Tests/Utils/Dashboard/DashboardClockComponent.test.ts +154 -5
- package/Tests/Utils/LabelRuleImportExport.test.ts +102 -0
- package/Tests/Utils/Monitor/IncomingEmailMonitorAddress.test.ts +478 -0
- package/Tests/Utils/Monitor/MonitorCheckScheduleUtil.test.ts +646 -0
- package/Tests/Utils/Monitor/MonitorOverviewCriteriaUtil.test.ts +292 -0
- package/Tests/Utils/Monitor/MonitorOverviewFamily.test.ts +274 -0
- package/Tests/Utils/Monitor/MonitorOverviewPresentationUtil.test.ts +3100 -0
- package/Tests/Utils/Monitor/MonitorOverviewProbeUtil.test.ts +1412 -0
- package/Tests/Utils/Monitor/MonitorOverviewTargetUtil.test.ts +374 -0
- package/Tests/Utils/Monitor/MonitorStatusHistoryUtil.test.ts +332 -0
- package/Tests/Utils/Monitor/MonitorUptimeSummaryUtil.test.ts +946 -0
- package/Tests/Utils/Rum/SessionIdentity.test.ts +94 -0
- package/Tests/Utils/Rum/SessionReplayWafCompatibility.test.ts +840 -0
- package/Tests/Utils/Rum/SessionReplayWireEncoding.test.ts +208 -0
- package/Tests/Utils/Rum/UserFlow.test.ts +1010 -0
- package/Tests/Utils/Slo/SloDuration.test.ts +115 -24
- package/Tests/Utils/Slo/SloHealth.test.ts +93 -10
- package/Tests/Utils/Slo/SloMonitorRuleCriteria.test.ts +109 -0
- package/Tests/Utils/Slo/SloOverviewText.test.ts +64 -0
- package/Tests/Utils/StatusPage/MonitorGroupMergedDowntimeUtil.test.ts +217 -0
- package/Tests/Utils/StatusPage/ResourceUptime.test.ts +1272 -1
- package/Tests/Utils/StatusPage/UptimeDailyAggregateTotals.test.ts +298 -0
- package/Tests/Utils/StatusPage/UptimeDailyAggregateUtil.test.ts +649 -1
- package/Tests/Utils/StatusPage/UptimeDailyAggregateWindow.test.ts +314 -0
- package/Tests/Utils/Telemetry/AttributesJSON.test.ts +454 -0
- package/Tests/Utils/Uptime/DayUptimeGraphUtil.test.ts +418 -2
- package/Tests/Utils/Uptime/DayUptimeGraphUtilMidnightDst.test.ts +160 -0
- package/Tests/Utils/Uptime/DayUptimeGraphUtilTimezone.Auckland.test.ts +45 -0
- package/Tests/Utils/Uptime/DayUptimeGraphUtilTimezone.Kolkata.test.ts +40 -0
- package/Tests/Utils/Uptime/DayUptimeGraphUtilTimezone.London.test.ts +147 -0
- package/Tests/Utils/Uptime/DayUptimeGraphUtilTimezone.NewYork.test.ts +48 -0
- package/Tests/Utils/Uptime/DayUptimeGraphUtilTimezone.Tokyo.test.ts +39 -0
- package/Tests/Utils/Uptime/DayUptimeGraphUtilTimezoneCases.ts +1015 -0
- package/Tests/Utils/Uptime/UptimeUtil.test.ts +75 -0
- package/Tests/Utils/Uptime/UptimeUtilChronologicalOrder.test.ts +1279 -0
- package/Types/API/Route.ts +19 -2
- package/Types/API/URL.ts +26 -2
- package/Types/AutoRemediation/AiRemediationCommandPlan.ts +203 -5
- package/Types/Date.ts +121 -7
- package/Types/Email/EmailMessage.ts +8 -0
- package/Types/Email/EmailTemplateType.ts +1 -0
- package/Types/Exception/ExceptionMessages.ts +1 -0
- package/Types/Kubernetes/KubernetesClusterAiAccess.ts +488 -0
- package/Types/Kubernetes/KubernetesClusterAiAccessPermissions.ts +54 -0
- package/Types/Kubernetes/KubernetesClusterAiAccessToolNames.ts +17 -0
- package/Types/Monitor/DatabaseMonitor/DatabaseMonitorResponse.ts +9 -0
- package/Types/Monitor/DatabaseMonitor/SqlServerPlatform.ts +117 -0
- package/Types/Monitor/KubernetesAlertTemplates.ts +6 -5
- package/Types/Monitor/MetricMonitor/MetricCriteriaContext.ts +6 -5
- package/Types/Monitor/MetricMonitor/MetricMonitorResponse.ts +9 -0
- package/Types/Monitor/MonitorStepExceptionMonitor.ts +56 -0
- package/Types/Monitor/MonitorUptimeSummary.ts +113 -0
- package/Types/Monitor/Recommendation/MonitorRecommendationUtil.ts +11 -0
- package/Types/Permission.ts +90 -0
- package/Types/Rules/RuleCriteriaFieldRegistry.ts +11 -0
- package/Types/Rules/RuleRun.ts +4 -0
- package/Types/Rum/SessionReplay.ts +55 -2
- package/Types/Rum/SessionReplayApi.ts +44 -1
- package/Types/Rum/UserFlow.ts +187 -0
- package/Types/Runbook/RunbookStepType.ts +10 -0
- package/Types/Runbook/RunnerJobOrigin.ts +15 -0
- package/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.ts +6 -2
- package/Types/StatusPage/MergedDowntimeTotals.ts +17 -0
- package/Types/StatusPage/PublicNoteSubscriberNotificationDefault.ts +148 -0
- package/Types/StatusPage/UptimeDailyAggregate.ts +15 -0
- package/Types/Telemetry/TelemetryIngestSurface.ts +9 -0
- package/Types/Timezone.ts +5 -0
- package/Types/TimezoneAlias.ts +385 -0
- package/Types/Workflow/Templates.ts +3041 -2
- package/Types/Workflow/WorkflowVariableOAuth.ts +476 -0
- package/Types/Workspace/WorkspaceNoteReaction.ts +132 -0
- package/Typings/Index.d.ts +24 -0
- package/UI/Components/AttributesJSON/AttributesJSONPreferences.ts +175 -0
- package/UI/Components/AttributesJSON/AttributesJSONView.tsx +138 -0
- package/UI/Components/AttributesJSON/AttributesViewToggle.tsx +79 -0
- package/UI/Components/AttributesJSON/BracesGlyph.tsx +30 -0
- package/UI/Components/AttributesJSON/CopyAttributesAsJSONButton.tsx +491 -0
- package/UI/Components/AttributesJSON/JSONHighlight.ts +77 -0
- package/UI/Components/Calendar/Calendar.css +83 -0
- package/UI/Components/Calendar/Calendar.tsx +136 -7
- package/UI/Components/Calendar/CalendarDayLayout.ts +236 -0
- package/UI/Components/Charts/ChartGroup/ChartGroup.tsx +23 -1
- package/UI/Components/Charts/Utils/HistogramSelection.ts +117 -0
- package/UI/Components/Charts/Utils/useHistogramRangeSelection.ts +269 -0
- package/UI/Components/Charts/Utils/useHistogramZoom.ts +26 -2
- package/UI/Components/Date/CustomTimeRangeModal.tsx +26 -3
- package/UI/Components/Dropdown/Dropdown.tsx +58 -9
- package/UI/Components/Feed/FeedOptions.ts +427 -0
- package/UI/Components/Feed/FeedOptionsButton.tsx +692 -0
- package/UI/Components/Feed/useFeedItems.ts +28 -9
- package/UI/Components/Feed/useFeedOptions.ts +225 -0
- package/UI/Components/Forms/Fields/FormField.tsx +49 -14
- package/UI/Components/Graphs/DayUptimeGraph.tsx +166 -25
- package/UI/Components/Graphs/UptimeBarTooltip.tsx +10 -2
- package/UI/Components/Graphs/UptimeDaySummary.tsx +8 -0
- package/UI/Components/Icon/Icon.tsx +1 -1
- package/UI/Components/LogsViewer/LogsViewer.tsx +52 -5
- package/UI/Components/LogsViewer/components/ColumnSelector.tsx +13 -2
- package/UI/Components/LogsViewer/components/KeyboardShortcutsHelp.tsx +13 -1
- package/UI/Components/LogsViewer/components/LogDetailsPanel.tsx +91 -76
- package/UI/Components/LogsViewer/components/LogsFacetSidebar.tsx +15 -1
- package/UI/Components/LogsViewer/components/LogsHistogram.tsx +28 -106
- package/UI/Components/LogsViewer/components/LogsViewerToolbar.tsx +54 -6
- package/UI/Components/LogsViewer/components/SavedViewsDropdown.tsx +8 -2
- package/UI/Components/LogsViewer/useLogsHistogram.ts +39 -6
- package/UI/Components/ModelTable/BaseModelTable.tsx +66 -14
- package/UI/Components/MonitorGraphs/Uptime.tsx +12 -0
- package/UI/Components/MonitorGraphs/UptimeBarDayModal.tsx +10 -2
- package/UI/Components/Page/ModelPage.tsx +59 -3
- package/UI/Components/TelemetryViewer/TelemetryViewer.tsx +69 -5
- package/UI/Components/TelemetryViewer/components/TelemetryDetailPanel.tsx +12 -1
- package/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.tsx +15 -1
- package/UI/Components/TelemetryViewer/components/TelemetryHistogram.tsx +36 -104
- package/UI/Components/TelemetryViewer/components/TelemetrySearchBar.tsx +9 -1
- package/UI/Utils/ModelAPI/ProjectUsersModelAPI.ts +19 -1
- package/UI/Utils/Timezone.ts +69 -28
- package/Utils/AI/InvestigationReport.ts +195 -25
- package/Utils/AiRemediation/KubectlOutputRedactor.ts +1724 -0
- package/Utils/AiRemediation/KubectlPolicy.ts +4136 -0
- package/Utils/AiRemediation/KubectlWaitBudget.ts +156 -0
- package/Utils/AiRemediation/KubectlWriteScope.ts +1964 -0
- package/Utils/Dashboard/Components/DashboardClockComponent.ts +7 -6
- package/Utils/LabelRuleImportExport.ts +27 -9
- package/Utils/Monitor/IncomingEmailMonitorAddress.ts +292 -0
- package/Utils/Monitor/MetricValueFormatter.ts +2 -2
- package/Utils/Monitor/MonitorCheckScheduleUtil.ts +654 -0
- package/Utils/Monitor/MonitorOverviewCriteriaUtil.ts +188 -0
- package/Utils/Monitor/MonitorOverviewFamily.ts +263 -0
- package/Utils/Monitor/MonitorOverviewPresentationUtil.ts +1958 -0
- package/Utils/Monitor/MonitorOverviewProbeUtil.ts +979 -0
- package/Utils/Monitor/MonitorOverviewTargetUtil.ts +299 -0
- package/Utils/Monitor/MonitorStatusHistoryUtil.ts +201 -0
- package/Utils/Monitor/MonitorUptimeSummaryUtil.ts +638 -0
- package/Utils/Rules/MonitorTypeRuleCriteria.ts +31 -0
- package/Utils/Rum/SessionIdentity.ts +44 -0
- package/Utils/Rum/SessionReplayWireEncoding.ts +137 -0
- package/Utils/Rum/UserFlow.ts +1527 -0
- package/Utils/Slo/SloDuration.ts +22 -6
- package/Utils/Slo/SloHealth.ts +8 -7
- package/Utils/Slo/SloMonitorRuleCriteria.ts +33 -1
- package/Utils/Slo/SloOverviewText.ts +33 -0
- package/Utils/Slo/SloProjection.ts +4 -3
- package/Utils/StatusPage/MonitorGroupMergedDowntimeUtil.ts +107 -0
- package/Utils/StatusPage/ResourceUptime.ts +99 -0
- package/Utils/StatusPage/UptimeDailyAggregateUtil.ts +197 -0
- package/Utils/Telemetry/AttributesJSON.ts +367 -0
- package/Utils/Uptime/DayUptimeGraphUtil.ts +165 -0
- package/Utils/Uptime/UptimeUtil.ts +122 -38
- package/build/dist/Models/DatabaseModels/AlertEpisodeMember.js +8 -1
- package/build/dist/Models/DatabaseModels/AlertEpisodeMember.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AutoRemediationSuggestion.js +62 -0
- package/build/dist/Models/DatabaseModels/AutoRemediationSuggestion.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisodeMember.js +8 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisodeMember.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisodePublicNote.js +10 -3
- package/build/dist/Models/DatabaseModels/IncidentEpisodePublicNote.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentPublicNote.js +10 -3
- package/build/dist/Models/DatabaseModels/IncidentPublicNote.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +4 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/KubernetesCluster.js +434 -0
- package/build/dist/Models/DatabaseModels/KubernetesCluster.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Monitor.js +49 -0
- package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Runner.js +4 -4
- package/build/dist/Models/DatabaseModels/Runner.js.map +1 -1
- package/build/dist/Models/DatabaseModels/RunnerJob.js +66 -0
- package/build/dist/Models/DatabaseModels/RunnerJob.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenancePublicNote.js +11 -3
- package/build/dist/Models/DatabaseModels/ScheduledMaintenancePublicNote.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveFeed.js +2 -0
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveFeed.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveLabelRule.js +530 -0
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveLabelRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveMonitorRule.js +39 -4
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveMonitorRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerRule.js +612 -0
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/WorkflowVariable.js +487 -3
- package/build/dist/Models/DatabaseModels/WorkflowVariable.js.map +1 -1
- package/build/dist/Models/DatabaseModels/WorkspaceProjectAuthToken.js +64 -16
- package/build/dist/Models/DatabaseModels/WorkspaceProjectAuthToken.js.map +1 -1
- package/build/dist/Server/API/AIInvestigationAPI.js +205 -0
- package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
- package/build/dist/Server/API/AutoRemediationAPI.js +115 -2
- package/build/dist/Server/API/AutoRemediationAPI.js.map +1 -1
- package/build/dist/Server/API/CommonAPI.js +49 -0
- package/build/dist/Server/API/CommonAPI.js.map +1 -1
- package/build/dist/Server/API/KubernetesClusterAiAccessAPI.js +564 -0
- package/build/dist/Server/API/KubernetesClusterAiAccessAPI.js.map +1 -0
- package/build/dist/Server/API/MicrosoftTeamsAPI.js +465 -176
- package/build/dist/Server/API/MicrosoftTeamsAPI.js.map +1 -1
- package/build/dist/Server/API/MonitorAPI.js +107 -1
- package/build/dist/Server/API/MonitorAPI.js.map +1 -1
- package/build/dist/Server/API/OnCallScheduleTimelineAPI.js +5 -16
- package/build/dist/Server/API/OnCallScheduleTimelineAPI.js.map +1 -1
- package/build/dist/Server/API/SlackAPI.js +322 -78
- package/build/dist/Server/API/SlackAPI.js.map +1 -1
- package/build/dist/Server/API/StatusPageAPI.js +123 -17
- package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
- package/build/dist/Server/API/TelemetryAPI.js +144 -5
- package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
- package/build/dist/Server/API/UserTwoFactorBackupCodeAPI.js +1 -0
- package/build/dist/Server/API/UserTwoFactorBackupCodeAPI.js.map +1 -1
- package/build/dist/Server/API/WorkflowVariableAPI.js +109 -0
- package/build/dist/Server/API/WorkflowVariableAPI.js.map +1 -0
- package/build/dist/Server/Infrastructure/GlobalCache.js +29 -0
- package/build/dist/Server/Infrastructure/GlobalCache.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794100000000-AddSloLabelAndOwnerRules.js +93 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794100000000-AddSloLabelAndOwnerRules.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794200000000-AddSloMonitorRuleMonitorType.js +12 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794200000000-AddSloMonitorRuleMonitorType.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794300000000-AddOAuth2WorkflowVariables.js +38 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794300000000-AddOAuth2WorkflowVariables.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794400000000-AddKubernetesClusterAiAccess.js +54 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794400000000-AddKubernetesClusterAiAccess.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794500000000-AddIncomingEmailCustomAddressToMonitor.js +14 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794500000000-AddIncomingEmailCustomAddressToMonitor.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794600000000-AddAuthTokenExpiresAtToWorkspaceProjectAuthToken.js +12 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794600000000-AddAuthTokenExpiresAtToWorkspaceProjectAuthToken.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794700000000-RemoveAppAccessTokenFromWorkspaceProjectAuthTokenMiscData.js +32 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794700000000-RemoveAppAccessTokenFromWorkspaceProjectAuthTokenMiscData.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +14 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Middleware/MasterAdminAuthorization.js +21 -0
- package/build/dist/Server/Middleware/MasterAdminAuthorization.js.map +1 -1
- package/build/dist/Server/Middleware/TelemetryIngest.js +32 -2
- package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
- package/build/dist/Server/Middleware/UserAuthorization.js +39 -6
- package/build/dist/Server/Middleware/UserAuthorization.js.map +1 -1
- package/build/dist/Server/Services/AIAgentService.js +1 -0
- package/build/dist/Server/Services/AIAgentService.js.map +1 -1
- package/build/dist/Server/Services/AccessTokenService.js +87 -42
- package/build/dist/Server/Services/AccessTokenService.js.map +1 -1
- package/build/dist/Server/Services/AlertEpisodeMemberService.js +4 -0
- package/build/dist/Server/Services/AlertEpisodeMemberService.js.map +1 -1
- package/build/dist/Server/Services/AlertEpisodeService.js +12 -1
- package/build/dist/Server/Services/AlertEpisodeService.js.map +1 -1
- package/build/dist/Server/Services/AlertService.js +110 -23
- package/build/dist/Server/Services/AlertService.js.map +1 -1
- package/build/dist/Server/Services/AutoRemediationRuleEngineService.js +716 -30
- package/build/dist/Server/Services/AutoRemediationRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AutoRemediationRuleService.js +100 -0
- package/build/dist/Server/Services/AutoRemediationRuleService.js.map +1 -1
- package/build/dist/Server/Services/BillingService.js +1 -0
- package/build/dist/Server/Services/BillingService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +7 -0
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/InboundEmail/Providers/SendGridInboundProvider.js +11 -16
- package/build/dist/Server/Services/InboundEmail/Providers/SendGridInboundProvider.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeMemberService.js +4 -0
- package/build/dist/Server/Services/IncidentEpisodeMemberService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodePublicNoteService.js +48 -0
- package/build/dist/Server/Services/IncidentEpisodePublicNoteService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeRoleMemberService.js +21 -0
- package/build/dist/Server/Services/IncidentEpisodeRoleMemberService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeService.js +12 -1
- package/build/dist/Server/Services/IncidentEpisodeService.js.map +1 -1
- package/build/dist/Server/Services/IncidentGroupingEngineService.js +8 -0
- package/build/dist/Server/Services/IncidentGroupingEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentMemberService.js +14 -0
- package/build/dist/Server/Services/IncidentMemberService.js.map +1 -1
- package/build/dist/Server/Services/IncidentPublicNoteService.js +48 -0
- package/build/dist/Server/Services/IncidentPublicNoteService.js.map +1 -1
- package/build/dist/Server/Services/IncidentService.js +99 -21
- package/build/dist/Server/Services/IncidentService.js.map +1 -1
- package/build/dist/Server/Services/IncidentStateTimelineService.js +12 -0
- package/build/dist/Server/Services/IncidentStateTimelineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentTemplateService.js +68 -4
- package/build/dist/Server/Services/IncidentTemplateService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +4 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterAiAccessService.js +1470 -0
- package/build/dist/Server/Services/KubernetesClusterAiAccessService.js.map +1 -0
- package/build/dist/Server/Services/KubernetesClusterService.js +1097 -0
- package/build/dist/Server/Services/KubernetesClusterService.js.map +1 -1
- package/build/dist/Server/Services/LogAggregationService.js +14 -6
- package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
- package/build/dist/Server/Services/MonitorService.js +490 -50
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/MonitorStatusTimelineService.js +540 -3
- package/build/dist/Server/Services/MonitorStatusTimelineService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js +2 -0
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleTeamService.js +2 -0
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleTeamService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleUserService.js +2 -0
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleUserService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleService.js +3 -0
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleService.js.map +1 -1
- package/build/dist/Server/Services/OnCallNotificationAlertingService.js +29 -7
- package/build/dist/Server/Services/OnCallNotificationAlertingService.js.map +1 -1
- package/build/dist/Server/Services/OnCallSetupReminderService.js +1 -0
- package/build/dist/Server/Services/OnCallSetupReminderService.js.map +1 -1
- package/build/dist/Server/Services/ProbeService.js +7 -1
- package/build/dist/Server/Services/ProbeService.js.map +1 -1
- package/build/dist/Server/Services/ProjectService.js +11 -1
- package/build/dist/Server/Services/ProjectService.js.map +1 -1
- package/build/dist/Server/Services/RunbookCredentialService.js +24 -0
- package/build/dist/Server/Services/RunbookCredentialService.js.map +1 -1
- package/build/dist/Server/Services/RunbookSecretService.js +44 -0
- package/build/dist/Server/Services/RunbookSecretService.js.map +1 -1
- package/build/dist/Server/Services/RunnerJobService.js +641 -21
- package/build/dist/Server/Services/RunnerJobService.js.map +1 -1
- package/build/dist/Server/Services/RunnerService.js +344 -5
- package/build/dist/Server/Services/RunnerService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenancePublicNoteService.js +48 -0
- package/build/dist/Server/Services/ScheduledMaintenancePublicNoteService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceService.js +102 -20
- package/build/dist/Server/Services/ScheduledMaintenanceService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceTemplateService.js +67 -4
- package/build/dist/Server/Services/ScheduledMaintenanceTemplateService.js.map +1 -1
- package/build/dist/Server/Services/ServiceLevelObjectiveLabelRuleEngineService.js +295 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveLabelRuleEngineService.js.map +1 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveLabelRuleService.js +56 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveLabelRuleService.js.map +1 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.js +59 -14
- package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleService.js +22 -1
- package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleService.js.map +1 -1
- package/build/dist/Server/Services/ServiceLevelObjectiveOwnerRuleEngineService.js +400 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveOwnerRuleEngineService.js.map +1 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveOwnerRuleService.js +56 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveOwnerRuleService.js.map +1 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveService.js +33 -1
- package/build/dist/Server/Services/ServiceLevelObjectiveService.js.map +1 -1
- package/build/dist/Server/Services/StatusPagePrivateUserService.js +1 -0
- package/build/dist/Server/Services/StatusPagePrivateUserService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageService.js +230 -32
- package/build/dist/Server/Services/StatusPageService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageSubscriberService.js +4 -0
- package/build/dist/Server/Services/StatusPageSubscriberService.js.map +1 -1
- package/build/dist/Server/Services/TeamMemberService.js +270 -11
- package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
- package/build/dist/Server/Services/TraceAggregationService.js +10 -6
- package/build/dist/Server/Services/TraceAggregationService.js.map +1 -1
- package/build/dist/Server/Services/UserEmailService.js +1 -0
- package/build/dist/Server/Services/UserEmailService.js.map +1 -1
- package/build/dist/Server/Services/UserNotificationMethodAdminService.js +1 -0
- package/build/dist/Server/Services/UserNotificationMethodAdminService.js.map +1 -1
- package/build/dist/Server/Services/UserNotificationRuleAdminService.js +1 -0
- package/build/dist/Server/Services/UserNotificationRuleAdminService.js.map +1 -1
- package/build/dist/Server/Services/UserNotificationRuleService.js +4 -0
- package/build/dist/Server/Services/UserNotificationRuleService.js.map +1 -1
- package/build/dist/Server/Services/UserService.js +107 -1
- package/build/dist/Server/Services/UserService.js.map +1 -1
- package/build/dist/Server/Services/WorkflowVariableService.js +396 -7
- package/build/dist/Server/Services/WorkflowVariableService.js.map +1 -1
- package/build/dist/Server/Services/WorkspaceNotificationRuleService.js +463 -7
- package/build/dist/Server/Services/WorkspaceNotificationRuleService.js.map +1 -1
- package/build/dist/Server/Services/WorkspaceProjectAuthTokenService.js +144 -2
- package/build/dist/Server/Services/WorkspaceProjectAuthTokenService.js.map +1 -1
- package/build/dist/Server/Types/Database/QueryHelper.js +20 -0
- package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
- package/build/dist/Server/Types/Markdown.js +394 -27
- package/build/dist/Server/Types/Markdown.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/Telegram/SendMessageToChat.js +20 -1
- package/build/dist/Server/Types/Workflow/Components/Telegram/SendMessageToChat.js.map +1 -1
- package/build/dist/Server/Utils/AI/ClusterAccess/ClusterAccessContext.js +123 -0
- package/build/dist/Server/Utils/AI/ClusterAccess/ClusterAccessContext.js.map +1 -0
- package/build/dist/Server/Utils/AI/ClusterAccess/KubectlInvestigationToolkit.js +344 -0
- package/build/dist/Server/Utils/AI/ClusterAccess/KubectlInvestigationToolkit.js.map +1 -0
- package/build/dist/Server/Utils/AI/ClusterAccess/KubectlJobRunner.js +587 -0
- package/build/dist/Server/Utils/AI/ClusterAccess/KubectlJobRunner.js.map +1 -0
- package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentAuth.js +18 -2
- package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentAuth.js.map +1 -1
- package/build/dist/Server/Utils/AI/Remediation/RemediationCommandTools.js +1380 -239
- package/build/dist/Server/Utils/AI/Remediation/RemediationCommandTools.js.map +1 -1
- package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js +1099 -68
- package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js +88 -6
- package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js +45 -11
- package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js +41 -11
- package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/AIActionTools.js +11 -4
- package/build/dist/Server/Utils/AI/Toolbox/AIActionTools.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/ResourceTools.js +4 -2
- package/build/dist/Server/Utils/AI/Toolbox/ResourceTools.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/SloTools.js +1 -0
- package/build/dist/Server/Utils/AI/Toolbox/SloTools.js.map +1 -1
- package/build/dist/Server/Utils/AutoRemediation/CommandPlanExecutor.js +997 -141
- package/build/dist/Server/Utils/AutoRemediation/CommandPlanExecutor.js.map +1 -1
- package/build/dist/Server/Utils/AutoRemediation/RemediationVerifier.js +299 -4
- package/build/dist/Server/Utils/AutoRemediation/RemediationVerifier.js.map +1 -1
- package/build/dist/Server/Utils/Database/AffectedResourceRelations.js +120 -0
- package/build/dist/Server/Utils/Database/AffectedResourceRelations.js.map +1 -0
- package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js +160 -1
- package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js.map +1 -1
- package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js +1 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/AffectedResourceList.js +22 -51
- package/build/dist/Server/Utils/Monitor/AffectedResourceList.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js +59 -12
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +139 -109
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js +5 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js +84 -22
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorPayloadRedaction.js +70 -5
- package/build/dist/Server/Utils/Monitor/MonitorPayloadRedaction.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/ProbeMonitorsNotification.js +249 -0
- package/build/dist/Server/Utils/Monitor/ProbeMonitorsNotification.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/RootCauseList.js +101 -0
- package/build/dist/Server/Utils/Monitor/RootCauseList.js.map +1 -0
- package/build/dist/Server/Utils/OnCall/OnCallShiftReminderRunner.js +1 -0
- package/build/dist/Server/Utils/OnCall/OnCallShiftReminderRunner.js.map +1 -1
- package/build/dist/Server/Utils/PushNotificationUtil.js +27 -0
- package/build/dist/Server/Utils/PushNotificationUtil.js.map +1 -1
- package/build/dist/Server/Utils/Rules/OwnerRuleAssignment.js +26 -3
- package/build/dist/Server/Utils/Rules/OwnerRuleAssignment.js.map +1 -1
- package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js +28 -0
- package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js.map +1 -1
- package/build/dist/Server/Utils/Runbook/RunbookExecutePermission.js +38 -3
- package/build/dist/Server/Utils/Runbook/RunbookExecutePermission.js.map +1 -1
- package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js +143 -23
- package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js.map +1 -1
- package/build/dist/Server/Utils/SessionReplay/SessionReplayUserFlowReadService.js +406 -0
- package/build/dist/Server/Utils/SessionReplay/SessionReplayUserFlowReadService.js.map +1 -0
- package/build/dist/Server/Utils/Slo/SloRulePatternValidator.js +28 -0
- package/build/dist/Server/Utils/Slo/SloRulePatternValidator.js.map +1 -0
- package/build/dist/Server/Utils/StartServer.js +4 -3
- package/build/dist/Server/Utils/StartServer.js.map +1 -1
- package/build/dist/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.js +382 -0
- package/build/dist/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.js.map +1 -0
- package/build/dist/Server/Utils/TwoFactorBackupCodeNotification.js +1 -0
- package/build/dist/Server/Utils/TwoFactorBackupCodeNotification.js.map +1 -1
- package/build/dist/Server/Utils/UserPermission/UserPermission.js +10 -0
- package/build/dist/Server/Utils/UserPermission/UserPermission.js.map +1 -1
- package/build/dist/Server/Utils/Workflow/OAuth2TokenClient.js +447 -0
- package/build/dist/Server/Utils/Workflow/OAuth2TokenClient.js.map +1 -0
- package/build/dist/Server/Utils/Workflow/WorkflowVariableOAuthToken.js +202 -0
- package/build/dist/Server/Utils/Workflow/WorkflowVariableOAuthToken.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Alert.js +39 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Alert.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/AlertEpisode.js +44 -4
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/AlertEpisode.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.js +150 -191
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.js +44 -4
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Monitor.js +39 -17
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Monitor.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/ScheduledMaintenance.js +151 -145
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/ScheduledMaintenance.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +221 -127
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsServiceUrl.js +91 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsServiceUrl.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/ReactionNoteSync.js +673 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/ReactionNoteSync.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/Slack/Actions/ActionTypes.js +3 -9
- package/build/dist/Server/Utils/Workspace/Slack/Actions/ActionTypes.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/Slack/Actions/Alert.js +65 -166
- package/build/dist/Server/Utils/Workspace/Slack/Actions/Alert.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/Slack/Actions/AlertEpisode.js +63 -157
- package/build/dist/Server/Utils/Workspace/Slack/Actions/AlertEpisode.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/Slack/Actions/Auth.js +23 -3
- package/build/dist/Server/Utils/Workspace/Slack/Actions/Auth.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/Slack/Actions/Authorization.js +92 -0
- package/build/dist/Server/Utils/Workspace/Slack/Actions/Authorization.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/Slack/Actions/Incident.js +81 -210
- package/build/dist/Server/Utils/Workspace/Slack/Actions/Incident.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/Slack/Actions/IncidentEpisode.js +68 -138
- package/build/dist/Server/Utils/Workspace/Slack/Actions/IncidentEpisode.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/Slack/Actions/ReactionNote.js +240 -0
- package/build/dist/Server/Utils/Workspace/Slack/Actions/ReactionNote.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/Slack/Actions/ScheduledMaintenance.js +85 -212
- package/build/dist/Server/Utils/Workspace/Slack/Actions/ScheduledMaintenance.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/Slack/Slack.js +60 -17
- package/build/dist/Server/Utils/Workspace/Slack/Slack.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/Slack/app-manifest.json +2 -0
- package/build/dist/Server/Utils/Workspace/Workspace.js +134 -41
- package/build/dist/Server/Utils/Workspace/Workspace.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/WorkspaceActionAuthorization.js +197 -0
- package/build/dist/Server/Utils/Workspace/WorkspaceActionAuthorization.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/WorkspaceBase.js +32 -0
- package/build/dist/Server/Utils/Workspace/WorkspaceBase.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/WorkspaceOAuthState.js +199 -0
- package/build/dist/Server/Utils/Workspace/WorkspaceOAuthState.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/WorkspaceProjectReferenceValidator.js +91 -0
- package/build/dist/Server/Utils/Workspace/WorkspaceProjectReferenceValidator.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/WorkspaceReactionNote.js +450 -0
- package/build/dist/Server/Utils/Workspace/WorkspaceReactionNote.js.map +1 -0
- package/build/dist/Types/API/Route.js +18 -2
- package/build/dist/Types/API/Route.js.map +1 -1
- package/build/dist/Types/API/URL.js +23 -2
- package/build/dist/Types/API/URL.js.map +1 -1
- package/build/dist/Types/AutoRemediation/AiRemediationCommandPlan.js +103 -5
- package/build/dist/Types/AutoRemediation/AiRemediationCommandPlan.js.map +1 -1
- package/build/dist/Types/Date.js +97 -7
- package/build/dist/Types/Date.js.map +1 -1
- package/build/dist/Types/Email/EmailTemplateType.js +1 -0
- package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
- package/build/dist/Types/Exception/ExceptionMessages.js +1 -0
- package/build/dist/Types/Exception/ExceptionMessages.js.map +1 -1
- package/build/dist/Types/Kubernetes/KubernetesClusterAiAccess.js +245 -0
- package/build/dist/Types/Kubernetes/KubernetesClusterAiAccess.js.map +1 -0
- package/build/dist/Types/Kubernetes/KubernetesClusterAiAccessPermissions.js +49 -0
- package/build/dist/Types/Kubernetes/KubernetesClusterAiAccessPermissions.js.map +1 -0
- package/build/dist/Types/Kubernetes/KubernetesClusterAiAccessToolNames.js +16 -0
- package/build/dist/Types/Kubernetes/KubernetesClusterAiAccessToolNames.js.map +1 -0
- package/build/dist/Types/Monitor/DatabaseMonitor/SqlServerPlatform.js +104 -0
- package/build/dist/Types/Monitor/DatabaseMonitor/SqlServerPlatform.js.map +1 -0
- package/build/dist/Types/Monitor/KubernetesAlertTemplates.js +6 -5
- package/build/dist/Types/Monitor/KubernetesAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepExceptionMonitor.js +32 -0
- package/build/dist/Types/Monitor/MonitorStepExceptionMonitor.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorUptimeSummary.js +52 -0
- package/build/dist/Types/Monitor/MonitorUptimeSummary.js.map +1 -0
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js +9 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js.map +1 -1
- package/build/dist/Types/Permission.js +84 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js +11 -0
- package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js.map +1 -1
- package/build/dist/Types/Rules/RuleRun.js +4 -0
- package/build/dist/Types/Rules/RuleRun.js.map +1 -1
- package/build/dist/Types/Rum/SessionReplay.js +52 -2
- package/build/dist/Types/Rum/SessionReplay.js.map +1 -1
- package/build/dist/Types/Rum/SessionReplayApi.js +11 -0
- package/build/dist/Types/Rum/SessionReplayApi.js.map +1 -1
- package/build/dist/Types/Rum/UserFlow.js +115 -0
- package/build/dist/Types/Rum/UserFlow.js.map +1 -0
- package/build/dist/Types/Runbook/RunbookStepType.js +10 -0
- package/build/dist/Types/Runbook/RunbookStepType.js.map +1 -1
- package/build/dist/Types/Runbook/RunnerJobOrigin.js +14 -0
- package/build/dist/Types/Runbook/RunnerJobOrigin.js.map +1 -1
- package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.js +2 -2
- package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.js.map +1 -1
- package/build/dist/Types/StatusPage/MergedDowntimeTotals.js +2 -0
- package/build/dist/Types/StatusPage/MergedDowntimeTotals.js.map +1 -0
- package/build/dist/Types/StatusPage/PublicNoteSubscriberNotificationDefault.js +65 -0
- package/build/dist/Types/StatusPage/PublicNoteSubscriberNotificationDefault.js.map +1 -0
- package/build/dist/Types/Telemetry/TelemetryIngestSurface.js +8 -0
- package/build/dist/Types/Telemetry/TelemetryIngestSurface.js.map +1 -1
- package/build/dist/Types/Timezone.js +5 -0
- package/build/dist/Types/Timezone.js.map +1 -1
- package/build/dist/Types/TimezoneAlias.js +340 -0
- package/build/dist/Types/TimezoneAlias.js.map +1 -0
- package/build/dist/Types/Workflow/Templates.js +2694 -2
- package/build/dist/Types/Workflow/Templates.js.map +1 -1
- package/build/dist/Types/Workflow/WorkflowVariableOAuth.js +314 -0
- package/build/dist/Types/Workflow/WorkflowVariableOAuth.js.map +1 -0
- package/build/dist/Types/Workspace/WorkspaceNoteReaction.js +98 -0
- package/build/dist/Types/Workspace/WorkspaceNoteReaction.js.map +1 -0
- package/build/dist/UI/Components/AttributesJSON/AttributesJSONPreferences.js +95 -0
- package/build/dist/UI/Components/AttributesJSON/AttributesJSONPreferences.js.map +1 -0
- package/build/dist/UI/Components/AttributesJSON/AttributesJSONView.js +44 -0
- package/build/dist/UI/Components/AttributesJSON/AttributesJSONView.js.map +1 -0
- package/build/dist/UI/Components/AttributesJSON/AttributesViewToggle.js +27 -0
- package/build/dist/UI/Components/AttributesJSON/AttributesViewToggle.js.map +1 -0
- package/build/dist/UI/Components/AttributesJSON/BracesGlyph.js +9 -0
- package/build/dist/UI/Components/AttributesJSON/BracesGlyph.js.map +1 -0
- package/build/dist/UI/Components/AttributesJSON/CopyAttributesAsJSONButton.js +260 -0
- package/build/dist/UI/Components/AttributesJSON/CopyAttributesAsJSONButton.js.map +1 -0
- package/build/dist/UI/Components/AttributesJSON/JSONHighlight.js +56 -0
- package/build/dist/UI/Components/AttributesJSON/JSONHighlight.js.map +1 -0
- package/build/dist/UI/Components/Calendar/Calendar.js +94 -7
- package/build/dist/UI/Components/Calendar/Calendar.js.map +1 -1
- package/build/dist/UI/Components/Calendar/CalendarDayLayout.js +136 -0
- package/build/dist/UI/Components/Calendar/CalendarDayLayout.js.map +1 -0
- package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js +1 -1
- package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js.map +1 -1
- package/build/dist/UI/Components/Charts/Utils/HistogramSelection.js +72 -0
- package/build/dist/UI/Components/Charts/Utils/HistogramSelection.js.map +1 -0
- package/build/dist/UI/Components/Charts/Utils/useHistogramRangeSelection.js +178 -0
- package/build/dist/UI/Components/Charts/Utils/useHistogramRangeSelection.js.map +1 -0
- package/build/dist/UI/Components/Charts/Utils/useHistogramZoom.js +13 -1
- package/build/dist/UI/Components/Charts/Utils/useHistogramZoom.js.map +1 -1
- package/build/dist/UI/Components/Date/CustomTimeRangeModal.js +20 -4
- package/build/dist/UI/Components/Date/CustomTimeRangeModal.js.map +1 -1
- package/build/dist/UI/Components/Dropdown/Dropdown.js +33 -9
- package/build/dist/UI/Components/Dropdown/Dropdown.js.map +1 -1
- package/build/dist/UI/Components/Feed/FeedOptions.js +235 -0
- package/build/dist/UI/Components/Feed/FeedOptions.js.map +1 -0
- package/build/dist/UI/Components/Feed/FeedOptionsButton.js +346 -0
- package/build/dist/UI/Components/Feed/FeedOptionsButton.js.map +1 -0
- package/build/dist/UI/Components/Feed/useFeedItems.js +17 -7
- package/build/dist/UI/Components/Feed/useFeedItems.js.map +1 -1
- package/build/dist/UI/Components/Feed/useFeedOptions.js +130 -0
- package/build/dist/UI/Components/Feed/useFeedOptions.js.map +1 -0
- package/build/dist/UI/Components/Forms/Fields/FormField.js +36 -13
- package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
- package/build/dist/UI/Components/Graphs/DayUptimeGraph.js +117 -11
- package/build/dist/UI/Components/Graphs/DayUptimeGraph.js.map +1 -1
- package/build/dist/UI/Components/Graphs/UptimeBarTooltip.js +5 -1
- package/build/dist/UI/Components/Graphs/UptimeBarTooltip.js.map +1 -1
- package/build/dist/UI/Components/Graphs/UptimeDaySummary.js.map +1 -1
- package/build/dist/UI/Components/Icon/Icon.js +1 -1
- package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/LogsViewer.js +36 -8
- package/build/dist/UI/Components/LogsViewer/LogsViewer.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/ColumnSelector.js +10 -2
- package/build/dist/UI/Components/LogsViewer/components/ColumnSelector.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/KeyboardShortcutsHelp.js +9 -1
- package/build/dist/UI/Components/LogsViewer/components/KeyboardShortcutsHelp.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogDetailsPanel.js +16 -15
- package/build/dist/UI/Components/LogsViewer/components/LogDetailsPanel.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsHistogram.js +14 -74
- package/build/dist/UI/Components/LogsViewer/components/LogsHistogram.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsViewerToolbar.js +22 -5
- package/build/dist/UI/Components/LogsViewer/components/LogsViewerToolbar.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/SavedViewsDropdown.js +9 -2
- package/build/dist/UI/Components/LogsViewer/components/SavedViewsDropdown.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/useLogsHistogram.js +16 -5
- package/build/dist/UI/Components/LogsViewer/useLogsHistogram.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +23 -8
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/MonitorGraphs/Uptime.js +7 -1
- package/build/dist/UI/Components/MonitorGraphs/Uptime.js.map +1 -1
- package/build/dist/UI/Components/MonitorGraphs/UptimeBarDayModal.js +5 -1
- package/build/dist/UI/Components/MonitorGraphs/UptimeBarDayModal.js.map +1 -1
- package/build/dist/UI/Components/Page/ModelPage.js +37 -3
- package/build/dist/UI/Components/Page/ModelPage.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js +27 -6
- package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryDetailPanel.js +7 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryDetailPanel.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js +17 -77
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetrySearchBar.js +10 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetrySearchBar.js.map +1 -1
- package/build/dist/UI/Utils/ModelAPI/ProjectUsersModelAPI.js +15 -1
- package/build/dist/UI/Utils/ModelAPI/ProjectUsersModelAPI.js.map +1 -1
- package/build/dist/UI/Utils/Timezone.js +52 -17
- package/build/dist/UI/Utils/Timezone.js.map +1 -1
- package/build/dist/Utils/AI/InvestigationReport.js +116 -21
- package/build/dist/Utils/AI/InvestigationReport.js.map +1 -1
- package/build/dist/Utils/AiRemediation/KubectlOutputRedactor.js +1209 -0
- package/build/dist/Utils/AiRemediation/KubectlOutputRedactor.js.map +1 -0
- package/build/dist/Utils/AiRemediation/KubectlPolicy.js +2973 -0
- package/build/dist/Utils/AiRemediation/KubectlPolicy.js.map +1 -0
- package/build/dist/Utils/AiRemediation/KubectlWaitBudget.js +99 -0
- package/build/dist/Utils/AiRemediation/KubectlWaitBudget.js.map +1 -0
- package/build/dist/Utils/AiRemediation/KubectlWriteScope.js +1429 -0
- package/build/dist/Utils/AiRemediation/KubectlWriteScope.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardClockComponent.js +7 -6
- package/build/dist/Utils/Dashboard/Components/DashboardClockComponent.js.map +1 -1
- package/build/dist/Utils/LabelRuleImportExport.js +22 -6
- package/build/dist/Utils/LabelRuleImportExport.js.map +1 -1
- package/build/dist/Utils/Monitor/IncomingEmailMonitorAddress.js +214 -0
- package/build/dist/Utils/Monitor/IncomingEmailMonitorAddress.js.map +1 -0
- package/build/dist/Utils/Monitor/MetricValueFormatter.js +2 -2
- package/build/dist/Utils/Monitor/MonitorCheckScheduleUtil.js +471 -0
- package/build/dist/Utils/Monitor/MonitorCheckScheduleUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/MonitorOverviewCriteriaUtil.js +107 -0
- package/build/dist/Utils/Monitor/MonitorOverviewCriteriaUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/MonitorOverviewFamily.js +191 -0
- package/build/dist/Utils/Monitor/MonitorOverviewFamily.js.map +1 -0
- package/build/dist/Utils/Monitor/MonitorOverviewPresentationUtil.js +1259 -0
- package/build/dist/Utils/Monitor/MonitorOverviewPresentationUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/MonitorOverviewProbeUtil.js +593 -0
- package/build/dist/Utils/Monitor/MonitorOverviewProbeUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/MonitorOverviewTargetUtil.js +195 -0
- package/build/dist/Utils/Monitor/MonitorOverviewTargetUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/MonitorStatusHistoryUtil.js +127 -0
- package/build/dist/Utils/Monitor/MonitorStatusHistoryUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/MonitorUptimeSummaryUtil.js +464 -0
- package/build/dist/Utils/Monitor/MonitorUptimeSummaryUtil.js.map +1 -0
- package/build/dist/Utils/Rules/MonitorTypeRuleCriteria.js +18 -0
- package/build/dist/Utils/Rules/MonitorTypeRuleCriteria.js.map +1 -0
- package/build/dist/Utils/Rum/SessionIdentity.js +31 -1
- package/build/dist/Utils/Rum/SessionIdentity.js.map +1 -1
- package/build/dist/Utils/Rum/SessionReplayWireEncoding.js +128 -0
- package/build/dist/Utils/Rum/SessionReplayWireEncoding.js.map +1 -0
- package/build/dist/Utils/Rum/UserFlow.js +941 -0
- package/build/dist/Utils/Rum/UserFlow.js.map +1 -0
- package/build/dist/Utils/Slo/SloDuration.js +13 -5
- package/build/dist/Utils/Slo/SloDuration.js.map +1 -1
- package/build/dist/Utils/Slo/SloHealth.js +8 -7
- package/build/dist/Utils/Slo/SloHealth.js.map +1 -1
- package/build/dist/Utils/Slo/SloMonitorRuleCriteria.js +16 -1
- package/build/dist/Utils/Slo/SloMonitorRuleCriteria.js.map +1 -1
- package/build/dist/Utils/Slo/SloOverviewText.js +16 -0
- package/build/dist/Utils/Slo/SloOverviewText.js.map +1 -1
- package/build/dist/Utils/Slo/SloProjection.js.map +1 -1
- package/build/dist/Utils/StatusPage/MonitorGroupMergedDowntimeUtil.js +82 -0
- package/build/dist/Utils/StatusPage/MonitorGroupMergedDowntimeUtil.js.map +1 -0
- package/build/dist/Utils/StatusPage/ResourceUptime.js +46 -0
- package/build/dist/Utils/StatusPage/ResourceUptime.js.map +1 -1
- package/build/dist/Utils/StatusPage/UptimeDailyAggregateUtil.js +148 -0
- package/build/dist/Utils/StatusPage/UptimeDailyAggregateUtil.js.map +1 -1
- package/build/dist/Utils/Telemetry/AttributesJSON.js +245 -0
- package/build/dist/Utils/Telemetry/AttributesJSON.js.map +1 -0
- package/build/dist/Utils/Uptime/DayUptimeGraphUtil.js +103 -0
- package/build/dist/Utils/Uptime/DayUptimeGraphUtil.js.map +1 -1
- package/build/dist/Utils/Uptime/UptimeUtil.js +91 -27
- package/build/dist/Utils/Uptime/UptimeUtil.js.map +1 -1
- package/jest.config.json +2 -1
- package/package.json +2 -1
- package/tsconfig.tests.json +36 -0
- package/Tests/UI/Components/EmptyState/EmptyStateGuideLinks.test.tsx +0 -337
- package/UI/Components/EmptyState/EmptyStateGuideLinks.tsx +0 -124
- package/build/dist/UI/Components/EmptyState/EmptyStateGuideLinks.js +0 -47
- package/build/dist/UI/Components/EmptyState/EmptyStateGuideLinks.js.map +0 -1
|
@@ -41,6 +41,23 @@ import CommonAPI from "./CommonAPI";
|
|
|
41
41
|
import DatabaseCommonInteractionProps from "../../Types/BaseDatabase/DatabaseCommonInteractionProps";
|
|
42
42
|
import Dictionary from "../../Types/Dictionary";
|
|
43
43
|
import { WorkspaceChannel } from "../Utils/Workspace/WorkspaceBase";
|
|
44
|
+
import WorkspaceNotificationRuleService from "../Services/WorkspaceNotificationRuleService";
|
|
45
|
+
import WorkspaceNotificationRule from "../../Models/DatabaseModels/WorkspaceNotificationRule";
|
|
46
|
+
import WorkspaceOAuthState, {
|
|
47
|
+
WorkspaceOAuthFlow,
|
|
48
|
+
WorkspaceOAuthStateRecord,
|
|
49
|
+
} from "../Utils/Workspace/WorkspaceOAuthState";
|
|
50
|
+
|
|
51
|
+
// Delegated scopes for "sign in with Microsoft Teams" — authorize and token requests must agree.
|
|
52
|
+
const MICROSOFT_TEAMS_USER_SIGN_IN_SCOPES: string =
|
|
53
|
+
"https://graph.microsoft.com/User.Read https://graph.microsoft.com/Team.ReadBasic.All https://graph.microsoft.com/Channel.ReadBasic.All https://graph.microsoft.com/ChannelMessage.Send";
|
|
54
|
+
|
|
55
|
+
// The admin-consent sign-in only needs an ID token, to learn the tenant.
|
|
56
|
+
const ADMIN_CONSENT_SIGN_IN_SCOPES: string = "openid profile";
|
|
57
|
+
|
|
58
|
+
// Microsoft Entra tenant ids are GUIDs.
|
|
59
|
+
const ENTRA_TENANT_ID_PATTERN: RegExp =
|
|
60
|
+
/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
44
61
|
|
|
45
62
|
export default class MicrosoftTeamsAPI {
|
|
46
63
|
private static getTeamsAppManifest(): JSONObject {
|
|
@@ -192,6 +209,473 @@ export default class MicrosoftTeamsAPI {
|
|
|
192
209
|
return manifest;
|
|
193
210
|
}
|
|
194
211
|
|
|
212
|
+
private static getUserSignInRedirectUri(): string {
|
|
213
|
+
return `${AppApiClientUrl.toString()}/microsoft-teams/auth`;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
private static getAdminConsentRedirectUri(): string {
|
|
217
|
+
return `${AppApiClientUrl.toString()}/microsoft-teams/admin-consent/callback`;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
private static getIntegrationPageUrl(projectId: ObjectID): URL {
|
|
221
|
+
return URL.fromString(
|
|
222
|
+
DashboardClientUrl.toString() +
|
|
223
|
+
`/${projectId.toString()}/settings/microsoft-teams-integration`,
|
|
224
|
+
);
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/*
|
|
228
|
+
* Reads the tenant out of the ID token returned by the admin-consent
|
|
229
|
+
* sign-in, and refuses it unless every claim that ties it to this flow
|
|
230
|
+
* checks out.
|
|
231
|
+
*
|
|
232
|
+
* The token is not signature-checked, and does not need to be: it came
|
|
233
|
+
* straight back from Microsoft's token endpoint over TLS, in exchange for a
|
|
234
|
+
* code and this app's client secret, which OpenID Connect Core 3.1.3.7 lets
|
|
235
|
+
* stand in for the signature. The claims are still checked — audience,
|
|
236
|
+
* issuer, nonce and expiry — so a token minted for another app, another
|
|
237
|
+
* tenant or another sign-in is never accepted.
|
|
238
|
+
*/
|
|
239
|
+
public static getVerifiedTenantIdFromIdToken(data: {
|
|
240
|
+
idToken: unknown;
|
|
241
|
+
expectedTenantId: string;
|
|
242
|
+
expectedNonce: string;
|
|
243
|
+
}): string {
|
|
244
|
+
if (typeof data.idToken !== "string") {
|
|
245
|
+
throw new BadDataException(
|
|
246
|
+
"Microsoft did not return an ID token for the admin consent sign-in.",
|
|
247
|
+
);
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
const parts: Array<string> = data.idToken.split(".");
|
|
251
|
+
|
|
252
|
+
if (parts.length !== 3 || !parts[1]) {
|
|
253
|
+
throw new BadDataException(
|
|
254
|
+
"Microsoft returned a malformed ID token for the admin consent sign-in.",
|
|
255
|
+
);
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
let claims: JSONObject;
|
|
259
|
+
|
|
260
|
+
try {
|
|
261
|
+
claims = JSON.parse(
|
|
262
|
+
Buffer.from(parts[1], "base64url").toString("utf8"),
|
|
263
|
+
) as JSONObject;
|
|
264
|
+
} catch {
|
|
265
|
+
throw new BadDataException(
|
|
266
|
+
"Microsoft returned a malformed ID token for the admin consent sign-in.",
|
|
267
|
+
);
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
if (!claims || typeof claims !== "object" || Array.isArray(claims)) {
|
|
271
|
+
throw new BadDataException(
|
|
272
|
+
"Microsoft returned a malformed ID token for the admin consent sign-in.",
|
|
273
|
+
);
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
const tenantClaim: unknown = claims["tid"];
|
|
277
|
+
|
|
278
|
+
if (
|
|
279
|
+
typeof tenantClaim !== "string" ||
|
|
280
|
+
!ENTRA_TENANT_ID_PATTERN.test(tenantClaim)
|
|
281
|
+
) {
|
|
282
|
+
throw new BadDataException(
|
|
283
|
+
"The admin consent sign-in did not identify a Microsoft 365 tenant.",
|
|
284
|
+
);
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
const tenantId: string = tenantClaim.toLowerCase();
|
|
288
|
+
|
|
289
|
+
if (
|
|
290
|
+
typeof claims["aud"] !== "string" ||
|
|
291
|
+
claims["aud"].toLowerCase() !==
|
|
292
|
+
(MicrosoftTeamsAppClientId || "").toLowerCase()
|
|
293
|
+
) {
|
|
294
|
+
throw new BadDataException(
|
|
295
|
+
"The admin consent sign-in was issued for a different application.",
|
|
296
|
+
);
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
if (
|
|
300
|
+
typeof claims["iss"] !== "string" ||
|
|
301
|
+
claims["iss"].toLowerCase() !==
|
|
302
|
+
`https://login.microsoftonline.com/${tenantId}/v2.0`
|
|
303
|
+
) {
|
|
304
|
+
throw new BadDataException(
|
|
305
|
+
"The admin consent sign-in was issued by an unexpected authority.",
|
|
306
|
+
);
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
if (claims["nonce"] !== data.expectedNonce) {
|
|
310
|
+
throw new BadDataException(
|
|
311
|
+
"The admin consent sign-in does not belong to this connection attempt.",
|
|
312
|
+
);
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
const expiresAtSeconds: unknown = claims["exp"];
|
|
316
|
+
|
|
317
|
+
if (
|
|
318
|
+
typeof expiresAtSeconds !== "number" ||
|
|
319
|
+
expiresAtSeconds * 1000 <= Date.now()
|
|
320
|
+
) {
|
|
321
|
+
throw new BadDataException("The admin consent sign-in has expired.");
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
if (tenantId !== data.expectedTenantId.toLowerCase()) {
|
|
325
|
+
throw new BadDataException(
|
|
326
|
+
"You signed in to a different Microsoft 365 tenant from the one that granted admin consent. Please sign in with an account from the tenant you granted consent for.",
|
|
327
|
+
);
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
return tenantId;
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
/*
|
|
334
|
+
* Admin consent, leg 1: the consent screen has redirected back with the
|
|
335
|
+
* tenant it says consented. That claim is only a query parameter, so it is
|
|
336
|
+
* used for nothing but choosing where to send the admin to sign in. A new
|
|
337
|
+
* single-use state pins the flow to that tenant, and the sign-in's ID token
|
|
338
|
+
* must then prove it.
|
|
339
|
+
*/
|
|
340
|
+
private static async continueAdminConsentWithSignIn(data: {
|
|
341
|
+
req: ExpressRequest;
|
|
342
|
+
res: ExpressResponse;
|
|
343
|
+
stateRecord: WorkspaceOAuthStateRecord;
|
|
344
|
+
teamsIntegrationPageUrl: URL;
|
|
345
|
+
}): Promise<void> {
|
|
346
|
+
const { req, res, stateRecord, teamsIntegrationPageUrl } = data;
|
|
347
|
+
|
|
348
|
+
const tenantId: string = (req.query["tenant"]?.toString() || "")
|
|
349
|
+
.trim()
|
|
350
|
+
.toLowerCase();
|
|
351
|
+
|
|
352
|
+
if (!ENTRA_TENANT_ID_PATTERN.test(tenantId)) {
|
|
353
|
+
return Response.redirect(
|
|
354
|
+
req,
|
|
355
|
+
res,
|
|
356
|
+
teamsIntegrationPageUrl.addQueryParam(
|
|
357
|
+
"error",
|
|
358
|
+
"Missing tenant information from admin consent callback",
|
|
359
|
+
),
|
|
360
|
+
);
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
if (req.query["admin_consent"]?.toString().toLowerCase() !== "true") {
|
|
364
|
+
return Response.redirect(
|
|
365
|
+
req,
|
|
366
|
+
res,
|
|
367
|
+
teamsIntegrationPageUrl.addQueryParam(
|
|
368
|
+
"error",
|
|
369
|
+
"Admin consent was not granted for the OneUptime Microsoft Teams app",
|
|
370
|
+
),
|
|
371
|
+
);
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
if (
|
|
375
|
+
stateRecord.tenantId &&
|
|
376
|
+
stateRecord.tenantId.toLowerCase() !== tenantId
|
|
377
|
+
) {
|
|
378
|
+
logger.warn(
|
|
379
|
+
`Refusing Microsoft Teams admin consent for project ${stateRecord.projectId.toString()}: consent came back for tenant ${tenantId}, but the project is connected to tenant ${stateRecord.tenantId}.`,
|
|
380
|
+
getLogAttributesFromRequest(req as any),
|
|
381
|
+
);
|
|
382
|
+
|
|
383
|
+
return Response.redirect(
|
|
384
|
+
req,
|
|
385
|
+
res,
|
|
386
|
+
teamsIntegrationPageUrl.addQueryParam(
|
|
387
|
+
"error",
|
|
388
|
+
"Admin consent was granted for a different Microsoft 365 tenant from the one this project is connected to. Disconnect Microsoft Teams in Project Settings before connecting a different tenant.",
|
|
389
|
+
),
|
|
390
|
+
);
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
const { state, oidcNonce } = await WorkspaceOAuthState.create({
|
|
394
|
+
req,
|
|
395
|
+
res,
|
|
396
|
+
flow: WorkspaceOAuthFlow.MicrosoftTeamsAdminConsentSignIn,
|
|
397
|
+
projectId: stateRecord.projectId,
|
|
398
|
+
userId: stateRecord.userId,
|
|
399
|
+
tenantId: tenantId,
|
|
400
|
+
includeOidcNonce: true,
|
|
401
|
+
});
|
|
402
|
+
|
|
403
|
+
const signInUrl: string = `https://login.microsoftonline.com/${tenantId}/oauth2/v2.0/authorize?client_id=${encodeURIComponent(
|
|
404
|
+
MicrosoftTeamsAppClientId || "",
|
|
405
|
+
)}&response_type=code&redirect_uri=${encodeURIComponent(
|
|
406
|
+
MicrosoftTeamsAPI.getAdminConsentRedirectUri(),
|
|
407
|
+
)}&response_mode=query&scope=${encodeURIComponent(
|
|
408
|
+
ADMIN_CONSENT_SIGN_IN_SCOPES,
|
|
409
|
+
)}&state=${encodeURIComponent(state)}&nonce=${encodeURIComponent(
|
|
410
|
+
oidcNonce || "",
|
|
411
|
+
)}`;
|
|
412
|
+
|
|
413
|
+
return Response.redirect(req, res, URL.fromString(signInUrl));
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
/*
|
|
417
|
+
* Admin consent, leg 2: trade the sign-in code for an ID token, take the
|
|
418
|
+
* tenant from it, and only then fetch that tenant's Graph app token and
|
|
419
|
+
* bind it to the project recorded in the state.
|
|
420
|
+
*/
|
|
421
|
+
private static async completeAdminConsent(data: {
|
|
422
|
+
req: ExpressRequest;
|
|
423
|
+
res: ExpressResponse;
|
|
424
|
+
stateRecord: WorkspaceOAuthStateRecord;
|
|
425
|
+
teamsIntegrationPageUrl: URL;
|
|
426
|
+
}): Promise<void> {
|
|
427
|
+
const { req, res, stateRecord, teamsIntegrationPageUrl } = data;
|
|
428
|
+
|
|
429
|
+
const projectId: ObjectID = stateRecord.projectId;
|
|
430
|
+
const userId: ObjectID = stateRecord.userId;
|
|
431
|
+
|
|
432
|
+
const code: string | undefined = req.query["code"]?.toString();
|
|
433
|
+
|
|
434
|
+
if (!code || !stateRecord.tenantId || !stateRecord.oidcNonce) {
|
|
435
|
+
return Response.redirect(
|
|
436
|
+
req,
|
|
437
|
+
res,
|
|
438
|
+
teamsIntegrationPageUrl.addQueryParam(
|
|
439
|
+
"error",
|
|
440
|
+
"Microsoft did not return a sign-in for the admin consent. Please try again.",
|
|
441
|
+
),
|
|
442
|
+
);
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
// The request holds the client secret and the code; neither is logged.
|
|
446
|
+
const signInTokenResponse: HTTPErrorResponse | HTTPResponse<JSONObject> =
|
|
447
|
+
await API.post<JSONObject>({
|
|
448
|
+
url: URL.fromString(
|
|
449
|
+
`https://login.microsoftonline.com/${stateRecord.tenantId}/oauth2/v2.0/token`,
|
|
450
|
+
),
|
|
451
|
+
data: {
|
|
452
|
+
grant_type: "authorization_code",
|
|
453
|
+
code: code,
|
|
454
|
+
client_id: MicrosoftTeamsAppClientId || "",
|
|
455
|
+
client_secret: MicrosoftTeamsAppClientSecret || "",
|
|
456
|
+
redirect_uri: MicrosoftTeamsAPI.getAdminConsentRedirectUri(),
|
|
457
|
+
scope: ADMIN_CONSENT_SIGN_IN_SCOPES,
|
|
458
|
+
},
|
|
459
|
+
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
|
460
|
+
});
|
|
461
|
+
|
|
462
|
+
if (signInTokenResponse instanceof HTTPErrorResponse) {
|
|
463
|
+
logger.error(
|
|
464
|
+
"Error exchanging the Microsoft Teams admin consent sign-in code:",
|
|
465
|
+
getLogAttributesFromRequest(req as any),
|
|
466
|
+
);
|
|
467
|
+
logger.error(
|
|
468
|
+
signInTokenResponse,
|
|
469
|
+
getLogAttributesFromRequest(req as any),
|
|
470
|
+
);
|
|
471
|
+
return Response.redirect(
|
|
472
|
+
req,
|
|
473
|
+
res,
|
|
474
|
+
teamsIntegrationPageUrl.addQueryParam(
|
|
475
|
+
"error",
|
|
476
|
+
"Could not verify the Microsoft 365 sign-in after admin consent",
|
|
477
|
+
),
|
|
478
|
+
);
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
let tenantId: string;
|
|
482
|
+
|
|
483
|
+
try {
|
|
484
|
+
tenantId = MicrosoftTeamsAPI.getVerifiedTenantIdFromIdToken({
|
|
485
|
+
idToken: signInTokenResponse.data["id_token"],
|
|
486
|
+
expectedTenantId: stateRecord.tenantId,
|
|
487
|
+
expectedNonce: stateRecord.oidcNonce,
|
|
488
|
+
});
|
|
489
|
+
} catch (verificationError) {
|
|
490
|
+
logger.warn(
|
|
491
|
+
`Refusing Microsoft Teams admin consent for project ${projectId.toString()}: ${(verificationError as Error).message}`,
|
|
492
|
+
getLogAttributesFromRequest(req as any),
|
|
493
|
+
);
|
|
494
|
+
return Response.redirect(
|
|
495
|
+
req,
|
|
496
|
+
res,
|
|
497
|
+
teamsIntegrationPageUrl.addQueryParam(
|
|
498
|
+
"error",
|
|
499
|
+
(verificationError as Error).message,
|
|
500
|
+
),
|
|
501
|
+
);
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
// Fetch any existing project auth to merge
|
|
505
|
+
const existingAuth: WorkspaceProjectAuthToken | null =
|
|
506
|
+
await WorkspaceProjectAuthTokenService.getProjectAuth({
|
|
507
|
+
projectId: projectId,
|
|
508
|
+
workspaceType: WorkspaceType.MicrosoftTeams,
|
|
509
|
+
});
|
|
510
|
+
|
|
511
|
+
// Acquire an application token for the verified tenant using client credentials
|
|
512
|
+
const tokenResp: HTTPErrorResponse | HTTPResponse<JSONObject> =
|
|
513
|
+
await API.post<JSONObject>({
|
|
514
|
+
url: URL.fromString(
|
|
515
|
+
`https://login.microsoftonline.com/${tenantId}/oauth2/v2.0/token`,
|
|
516
|
+
),
|
|
517
|
+
data: {
|
|
518
|
+
client_id: MicrosoftTeamsAppClientId || "",
|
|
519
|
+
client_secret: MicrosoftTeamsAppClientSecret || "",
|
|
520
|
+
grant_type: "client_credentials",
|
|
521
|
+
scope: "https://graph.microsoft.com/.default",
|
|
522
|
+
},
|
|
523
|
+
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
|
524
|
+
});
|
|
525
|
+
|
|
526
|
+
if (tokenResp instanceof HTTPErrorResponse) {
|
|
527
|
+
logger.error(
|
|
528
|
+
"Error getting app token after admin consent:",
|
|
529
|
+
getLogAttributesFromRequest(req as any),
|
|
530
|
+
);
|
|
531
|
+
logger.error(tokenResp, getLogAttributesFromRequest(req as any));
|
|
532
|
+
return Response.redirect(
|
|
533
|
+
req,
|
|
534
|
+
res,
|
|
535
|
+
teamsIntegrationPageUrl.addQueryParam(
|
|
536
|
+
"error",
|
|
537
|
+
"Failed to get Graph app token after admin consent",
|
|
538
|
+
),
|
|
539
|
+
);
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
const tokenData: JSONObject = tokenResp.data;
|
|
543
|
+
const appAccessToken: string = (tokenData["access_token"] as string) || "";
|
|
544
|
+
const expiresInSec: number = Number(tokenData["expires_in"] || 0);
|
|
545
|
+
const expiresAt: Date = new Date(
|
|
546
|
+
Date.now() + Math.max(0, (expiresInSec - 60) * 1000),
|
|
547
|
+
);
|
|
548
|
+
|
|
549
|
+
// tokenData carries the app access token; only its expiry is logged.
|
|
550
|
+
logger.debug(
|
|
551
|
+
"Microsoft Graph app token acquired via admin consent. expiresAt: " +
|
|
552
|
+
expiresAt.toISOString(),
|
|
553
|
+
getLogAttributesFromRequest(req as any),
|
|
554
|
+
);
|
|
555
|
+
|
|
556
|
+
// Get available teams from user auth token
|
|
557
|
+
const userAuth: WorkspaceUserAuthToken | null =
|
|
558
|
+
await WorkspaceUserAuthTokenService.getUserAuth({
|
|
559
|
+
projectId: projectId,
|
|
560
|
+
userId: userId,
|
|
561
|
+
workspaceType: WorkspaceType.MicrosoftTeams,
|
|
562
|
+
});
|
|
563
|
+
|
|
564
|
+
let availableTeams: Record<string, MicrosoftTeamsTeam> = {};
|
|
565
|
+
if (userAuth?.miscData) {
|
|
566
|
+
availableTeams = (userAuth.miscData as any).availableTeams || {};
|
|
567
|
+
}
|
|
568
|
+
|
|
569
|
+
// If no teams from user auth, try to get them using app token
|
|
570
|
+
if (Object.keys(availableTeams).length === 0) {
|
|
571
|
+
try {
|
|
572
|
+
const teamsResponse: HTTPErrorResponse | HTTPResponse<JSONObject> =
|
|
573
|
+
await API.get<JSONObject>({
|
|
574
|
+
url: URL.fromString(
|
|
575
|
+
"https://graph.microsoft.com/v1.0/teams?$select=id,displayName",
|
|
576
|
+
),
|
|
577
|
+
headers: {
|
|
578
|
+
Authorization: `Bearer ${appAccessToken}`,
|
|
579
|
+
},
|
|
580
|
+
});
|
|
581
|
+
|
|
582
|
+
if (teamsResponse instanceof HTTPErrorResponse) {
|
|
583
|
+
logger.error(
|
|
584
|
+
"Failed to get teams:",
|
|
585
|
+
getLogAttributesFromRequest(req as any),
|
|
586
|
+
);
|
|
587
|
+
logger.error(teamsResponse, getLogAttributesFromRequest(req as any));
|
|
588
|
+
return Response.redirect(
|
|
589
|
+
req,
|
|
590
|
+
res,
|
|
591
|
+
teamsIntegrationPageUrl.addQueryParam(
|
|
592
|
+
"error",
|
|
593
|
+
"Failed to retrieve teams from Microsoft Graph API after admin consent",
|
|
594
|
+
),
|
|
595
|
+
);
|
|
596
|
+
}
|
|
597
|
+
|
|
598
|
+
const teamsData: JSONObject = teamsResponse.data;
|
|
599
|
+
const teams: Array<JSONObject> =
|
|
600
|
+
(teamsData["value"] as Array<JSONObject>) || [];
|
|
601
|
+
|
|
602
|
+
if (teams.length === 0) {
|
|
603
|
+
return Response.redirect(
|
|
604
|
+
req,
|
|
605
|
+
res,
|
|
606
|
+
teamsIntegrationPageUrl.addQueryParam(
|
|
607
|
+
"error",
|
|
608
|
+
"No teams available in your Microsoft 365 tenant. Please create a team first.",
|
|
609
|
+
),
|
|
610
|
+
);
|
|
611
|
+
}
|
|
612
|
+
|
|
613
|
+
availableTeams = teams.reduce(
|
|
614
|
+
(acc: Record<string, MicrosoftTeamsTeam>, t: JSONObject) => {
|
|
615
|
+
const team: MicrosoftTeamsTeam = {
|
|
616
|
+
id: t["id"] as string,
|
|
617
|
+
name: (t["displayName"] as string) || "Unnamed Team",
|
|
618
|
+
};
|
|
619
|
+
/*
|
|
620
|
+
* Keyed by id, not display name — Teams allows duplicate
|
|
621
|
+
* team names, and keying by name silently collapsed them so
|
|
622
|
+
* only the last one of each name was selectable.
|
|
623
|
+
*/
|
|
624
|
+
acc[team.id] = team;
|
|
625
|
+
return acc;
|
|
626
|
+
},
|
|
627
|
+
{} as Record<string, MicrosoftTeamsTeam>,
|
|
628
|
+
);
|
|
629
|
+
} catch (error) {
|
|
630
|
+
logger.error(
|
|
631
|
+
"Error getting teams:",
|
|
632
|
+
getLogAttributesFromRequest(req as any),
|
|
633
|
+
);
|
|
634
|
+
logger.error(error, getLogAttributesFromRequest(req as any));
|
|
635
|
+
return Response.redirect(
|
|
636
|
+
req,
|
|
637
|
+
res,
|
|
638
|
+
teamsIntegrationPageUrl.addQueryParam(
|
|
639
|
+
"error",
|
|
640
|
+
"Failed to retrieve teams from Microsoft Graph API",
|
|
641
|
+
),
|
|
642
|
+
);
|
|
643
|
+
}
|
|
644
|
+
}
|
|
645
|
+
|
|
646
|
+
/*
|
|
647
|
+
* Merge and persist project auth with tenantId and available teams. The
|
|
648
|
+
* app token goes in authToken / authTokenExpiresAt only: miscData is
|
|
649
|
+
* readable by every project Viewer.
|
|
650
|
+
*/
|
|
651
|
+
const mergedMiscData: MicrosoftTeamsMiscData = {
|
|
652
|
+
...(existingAuth?.miscData as any),
|
|
653
|
+
tenantId: tenantId,
|
|
654
|
+
adminConsentGranted: true,
|
|
655
|
+
adminConsentGrantedAt: new Date().toISOString(),
|
|
656
|
+
adminConsentGrantedBy: userId.toString(),
|
|
657
|
+
availableTeams: availableTeams,
|
|
658
|
+
botId: MicrosoftTeamsAppClientId || "",
|
|
659
|
+
};
|
|
660
|
+
|
|
661
|
+
await WorkspaceProjectAuthTokenService.refreshAuthToken({
|
|
662
|
+
projectId: projectId,
|
|
663
|
+
workspaceType: WorkspaceType.MicrosoftTeams,
|
|
664
|
+
authToken: appAccessToken,
|
|
665
|
+
authTokenExpiresAt: expiresAt,
|
|
666
|
+
workspaceProjectId: tenantId, // Use tenant ID as the workspace project identifier
|
|
667
|
+
miscData: mergedMiscData,
|
|
668
|
+
});
|
|
669
|
+
|
|
670
|
+
return Response.redirect(
|
|
671
|
+
req,
|
|
672
|
+
res,
|
|
673
|
+
teamsIntegrationPageUrl
|
|
674
|
+
.addQueryParam("adminConsent", "success")
|
|
675
|
+
.addQueryParam("tenantId", tenantId),
|
|
676
|
+
);
|
|
677
|
+
}
|
|
678
|
+
|
|
195
679
|
public getRouter(): ExpressRouter {
|
|
196
680
|
const router: ExpressRouter = Express.getRouter();
|
|
197
681
|
|
|
@@ -298,10 +782,56 @@ export default class MicrosoftTeamsAPI {
|
|
|
298
782
|
);
|
|
299
783
|
|
|
300
784
|
/*
|
|
301
|
-
*
|
|
302
|
-
*
|
|
303
|
-
*
|
|
785
|
+
* Start "sign in with Microsoft Teams" for the calling user.
|
|
786
|
+
*
|
|
787
|
+
* Returns the Microsoft authorize URL for the dashboard to navigate to. The
|
|
788
|
+
* `state` in it is an opaque single-use nonce (see WorkspaceOAuthState):
|
|
789
|
+
* the callback below learns the project and user from the server-side
|
|
790
|
+
* record behind it, never from the redirect.
|
|
304
791
|
*/
|
|
792
|
+
router.get(
|
|
793
|
+
"/microsoft-teams/sign-in-url",
|
|
794
|
+
UserMiddleware.getUserMiddleware,
|
|
795
|
+
async (req: ExpressRequest, res: ExpressResponse) => {
|
|
796
|
+
try {
|
|
797
|
+
const databaseProps: DatabaseCommonInteractionProps =
|
|
798
|
+
await CommonAPI.getDatabaseCommonInteractionProps(req);
|
|
799
|
+
|
|
800
|
+
const projectId: ObjectID =
|
|
801
|
+
CommonAPI.assertAuthenticatedProjectMember(databaseProps);
|
|
802
|
+
|
|
803
|
+
if (!MicrosoftTeamsAppClientId) {
|
|
804
|
+
throw new BadDataException(
|
|
805
|
+
"Microsoft Teams App Client ID is not set",
|
|
806
|
+
);
|
|
807
|
+
}
|
|
808
|
+
|
|
809
|
+
const { state } = await WorkspaceOAuthState.create({
|
|
810
|
+
req,
|
|
811
|
+
res,
|
|
812
|
+
flow: WorkspaceOAuthFlow.MicrosoftTeamsUserSignIn,
|
|
813
|
+
projectId: projectId,
|
|
814
|
+
userId: databaseProps.userId!,
|
|
815
|
+
});
|
|
816
|
+
|
|
817
|
+
const authorizationUrl: string = `https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=${encodeURIComponent(
|
|
818
|
+
MicrosoftTeamsAppClientId,
|
|
819
|
+
)}&response_type=code&redirect_uri=${encodeURIComponent(
|
|
820
|
+
MicrosoftTeamsAPI.getUserSignInRedirectUri(),
|
|
821
|
+
)}&response_mode=query&scope=${encodeURIComponent(
|
|
822
|
+
MICROSOFT_TEAMS_USER_SIGN_IN_SCOPES,
|
|
823
|
+
)}&state=${encodeURIComponent(state)}`;
|
|
824
|
+
|
|
825
|
+
return Response.sendJsonObjectResponse(req, res, {
|
|
826
|
+
authorizationUrl: authorizationUrl,
|
|
827
|
+
});
|
|
828
|
+
} catch (err) {
|
|
829
|
+
return Response.sendErrorResponse(req, res, err as Exception);
|
|
830
|
+
}
|
|
831
|
+
},
|
|
832
|
+
);
|
|
833
|
+
|
|
834
|
+
// Microsoft Teams OAuth callback for "sign in with Microsoft Teams".
|
|
305
835
|
router.get(
|
|
306
836
|
"/microsoft-teams/auth",
|
|
307
837
|
async (req: ExpressRequest, res: ExpressResponse) => {
|
|
@@ -323,36 +853,33 @@ export default class MicrosoftTeamsAPI {
|
|
|
323
853
|
);
|
|
324
854
|
}
|
|
325
855
|
|
|
326
|
-
|
|
327
|
-
const stateParam: string | undefined = req.query["state"]?.toString();
|
|
856
|
+
let stateRecord: WorkspaceOAuthStateRecord | null = null;
|
|
328
857
|
|
|
329
|
-
|
|
330
|
-
|
|
858
|
+
try {
|
|
859
|
+
stateRecord = await WorkspaceOAuthState.consume({
|
|
331
860
|
req,
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
);
|
|
861
|
+
state: req.query["state"]?.toString(),
|
|
862
|
+
flows: [WorkspaceOAuthFlow.MicrosoftTeamsUserSignIn],
|
|
863
|
+
});
|
|
864
|
+
} catch (err) {
|
|
865
|
+
logger.error(err, getLogAttributesFromRequest(req as any));
|
|
337
866
|
}
|
|
338
867
|
|
|
339
|
-
|
|
340
|
-
const stateParts: Array<string> = stateParam.split(":");
|
|
341
|
-
if (stateParts.length !== 2 || !stateParts[0] || !stateParts[1]) {
|
|
868
|
+
if (!stateRecord) {
|
|
342
869
|
return Response.sendErrorResponse(
|
|
343
870
|
req,
|
|
344
871
|
res,
|
|
345
|
-
new BadRequestException(
|
|
872
|
+
new BadRequestException(WorkspaceOAuthState.INVALID_STATE_MESSAGE),
|
|
346
873
|
);
|
|
347
874
|
}
|
|
348
875
|
|
|
349
|
-
const projectId:
|
|
350
|
-
const userId:
|
|
876
|
+
const projectId: ObjectID = stateRecord.projectId;
|
|
877
|
+
const userId: ObjectID = stateRecord.userId;
|
|
351
878
|
|
|
352
|
-
const teamsIntegrationPageUrl: URL =
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
);
|
|
879
|
+
const teamsIntegrationPageUrl: URL =
|
|
880
|
+
MicrosoftTeamsAPI.getIntegrationPageUrl(projectId);
|
|
881
|
+
|
|
882
|
+
const error: string | undefined = req.query["error"]?.toString();
|
|
356
883
|
|
|
357
884
|
if (error) {
|
|
358
885
|
return Response.redirect(
|
|
@@ -373,19 +900,13 @@ export default class MicrosoftTeamsAPI {
|
|
|
373
900
|
}
|
|
374
901
|
|
|
375
902
|
try {
|
|
376
|
-
// Exchange code for access token
|
|
377
|
-
const redirectUri: URL = URL.fromString(
|
|
378
|
-
`${AppApiClientUrl.toString()}/microsoft-teams/auth`,
|
|
379
|
-
);
|
|
380
|
-
|
|
381
903
|
const tokenRequestBody: JSONObject = {
|
|
382
904
|
grant_type: "authorization_code",
|
|
383
905
|
code: code,
|
|
384
906
|
client_id: MicrosoftTeamsAppClientId,
|
|
385
907
|
client_secret: MicrosoftTeamsAppClientSecret,
|
|
386
|
-
redirect_uri:
|
|
387
|
-
scope:
|
|
388
|
-
"https://graph.microsoft.com/User.Read https://graph.microsoft.com/Team.ReadBasic.All https://graph.microsoft.com/Channel.ReadBasic.All https://graph.microsoft.com/ChannelMessage.Send",
|
|
908
|
+
redirect_uri: MicrosoftTeamsAPI.getUserSignInRedirectUri(),
|
|
909
|
+
scope: MICROSOFT_TEAMS_USER_SIGN_IN_SCOPES,
|
|
389
910
|
};
|
|
390
911
|
|
|
391
912
|
/*
|
|
@@ -469,8 +990,8 @@ export default class MicrosoftTeamsAPI {
|
|
|
469
990
|
logger.debug(userProfile, getLogAttributesFromRequest(req as any));
|
|
470
991
|
|
|
471
992
|
await WorkspaceUserAuthTokenService.refreshAuthToken({
|
|
472
|
-
projectId:
|
|
473
|
-
userId:
|
|
993
|
+
projectId: projectId,
|
|
994
|
+
userId: userId,
|
|
474
995
|
workspaceType: WorkspaceType.MicrosoftTeams,
|
|
475
996
|
authToken: accessToken,
|
|
476
997
|
workspaceUserId: userProfile["id"] as string,
|
|
@@ -486,7 +1007,7 @@ export default class MicrosoftTeamsAPI {
|
|
|
486
1007
|
// Check if admin consent is already granted
|
|
487
1008
|
const existingProjectAuth: WorkspaceProjectAuthToken | null =
|
|
488
1009
|
await WorkspaceProjectAuthTokenService.getProjectAuth({
|
|
489
|
-
projectId:
|
|
1010
|
+
projectId: projectId,
|
|
490
1011
|
workspaceType: WorkspaceType.MicrosoftTeams,
|
|
491
1012
|
});
|
|
492
1013
|
|
|
@@ -496,7 +1017,7 @@ export default class MicrosoftTeamsAPI {
|
|
|
496
1017
|
) {
|
|
497
1018
|
// Admin consent already granted, refresh teams
|
|
498
1019
|
await MicrosoftTeamsUtil.refreshTeams({
|
|
499
|
-
projectId:
|
|
1020
|
+
projectId: projectId,
|
|
500
1021
|
});
|
|
501
1022
|
|
|
502
1023
|
return Response.redirect(req, res, teamsIntegrationPageUrl);
|
|
@@ -523,131 +1044,134 @@ export default class MicrosoftTeamsAPI {
|
|
|
523
1044
|
);
|
|
524
1045
|
|
|
525
1046
|
/*
|
|
526
|
-
* Admin consent - start flow (tenant-wide admin consent)
|
|
527
|
-
*
|
|
1047
|
+
* Admin consent - start flow (tenant-wide admin consent).
|
|
1048
|
+
*
|
|
1049
|
+
* Only a signed-in member who may manage the project's workspace
|
|
1050
|
+
* connections can start it, and it returns the Microsoft admin-consent URL
|
|
1051
|
+
* for the dashboard to navigate to. Its `state` is a single-use nonce
|
|
1052
|
+
* recorded against this user and project — see WorkspaceOAuthState.
|
|
528
1053
|
*/
|
|
529
1054
|
router.get(
|
|
530
1055
|
"/microsoft-teams/admin-consent",
|
|
1056
|
+
UserMiddleware.getUserMiddleware,
|
|
531
1057
|
async (req: ExpressRequest, res: ExpressResponse) => {
|
|
532
1058
|
try {
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
req,
|
|
536
|
-
res,
|
|
537
|
-
new BadDataException("Microsoft Teams App Client ID is not set"),
|
|
538
|
-
);
|
|
539
|
-
}
|
|
1059
|
+
const databaseProps: DatabaseCommonInteractionProps =
|
|
1060
|
+
await CommonAPI.getDatabaseCommonInteractionProps(req);
|
|
540
1061
|
|
|
541
|
-
const
|
|
542
|
-
|
|
543
|
-
return Response.sendErrorResponse(
|
|
544
|
-
req,
|
|
545
|
-
res,
|
|
546
|
-
new BadRequestException(
|
|
547
|
-
"Invalid request - state param not present",
|
|
548
|
-
),
|
|
549
|
-
);
|
|
550
|
-
}
|
|
1062
|
+
const projectId: ObjectID =
|
|
1063
|
+
CommonAPI.assertAuthenticatedProjectMember(databaseProps);
|
|
551
1064
|
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
1065
|
+
CommonAPI.assertPermittedInProject({
|
|
1066
|
+
databaseProps: databaseProps,
|
|
1067
|
+
allowedPermissions:
|
|
1068
|
+
WorkspaceOAuthState.MANAGE_CONNECTION_PERMISSIONS,
|
|
1069
|
+
errorMessage:
|
|
1070
|
+
"You do not have permission to connect this project to Microsoft Teams.",
|
|
1071
|
+
});
|
|
1072
|
+
|
|
1073
|
+
if (!MicrosoftTeamsAppClientId) {
|
|
1074
|
+
throw new BadDataException(
|
|
1075
|
+
"Microsoft Teams App Client ID is not set",
|
|
558
1076
|
);
|
|
559
1077
|
}
|
|
560
1078
|
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
if (existingTenant) {
|
|
573
|
-
tenantForConsent = existingTenant;
|
|
574
|
-
}
|
|
575
|
-
} catch {
|
|
576
|
-
// ignore and fall back to default
|
|
577
|
-
}
|
|
1079
|
+
/*
|
|
1080
|
+
* A project already bound to a tenant re-consents for THAT tenant
|
|
1081
|
+
* only: the consent URL targets it, and the callback refuses any
|
|
1082
|
+
* other. Moving a project to a different tenant means disconnecting
|
|
1083
|
+
* it first.
|
|
1084
|
+
*/
|
|
1085
|
+
const existingAuth: WorkspaceProjectAuthToken | null =
|
|
1086
|
+
await WorkspaceProjectAuthTokenService.getProjectAuth({
|
|
1087
|
+
projectId: projectId,
|
|
1088
|
+
workspaceType: WorkspaceType.MicrosoftTeams,
|
|
1089
|
+
});
|
|
578
1090
|
|
|
579
|
-
const
|
|
580
|
-
|
|
581
|
-
|
|
1091
|
+
const existingTenantId: string | undefined =
|
|
1092
|
+
existingAuth?.workspaceProjectId || undefined;
|
|
1093
|
+
|
|
1094
|
+
const { state } = await WorkspaceOAuthState.create({
|
|
1095
|
+
req,
|
|
1096
|
+
res,
|
|
1097
|
+
flow: WorkspaceOAuthFlow.MicrosoftTeamsAdminConsent,
|
|
1098
|
+
projectId: projectId,
|
|
1099
|
+
userId: databaseProps.userId!,
|
|
1100
|
+
tenantId: existingTenantId,
|
|
1101
|
+
});
|
|
582
1102
|
|
|
583
|
-
const
|
|
584
|
-
|
|
1103
|
+
const authorizationUrl: string = `https://login.microsoftonline.com/${encodeURIComponent(
|
|
1104
|
+
existingTenantId || "organizations",
|
|
585
1105
|
)}/v2.0/adminconsent?client_id=${encodeURIComponent(
|
|
586
1106
|
MicrosoftTeamsAppClientId,
|
|
587
1107
|
)}&scope=${encodeURIComponent(
|
|
588
1108
|
"https://graph.microsoft.com/.default",
|
|
589
|
-
)}&redirect_uri=${encodeURIComponent(
|
|
590
|
-
|
|
591
|
-
)}`;
|
|
1109
|
+
)}&redirect_uri=${encodeURIComponent(
|
|
1110
|
+
MicrosoftTeamsAPI.getAdminConsentRedirectUri(),
|
|
1111
|
+
)}&state=${encodeURIComponent(state)}`;
|
|
592
1112
|
|
|
593
|
-
return Response.
|
|
1113
|
+
return Response.sendJsonObjectResponse(req, res, {
|
|
1114
|
+
authorizationUrl: authorizationUrl,
|
|
1115
|
+
});
|
|
594
1116
|
} catch (error) {
|
|
595
1117
|
logger.error(
|
|
596
1118
|
"Error starting Teams admin consent: ",
|
|
597
1119
|
getLogAttributesFromRequest(req as any),
|
|
598
1120
|
);
|
|
599
1121
|
logger.error(error, getLogAttributesFromRequest(req as any));
|
|
600
|
-
return Response.sendErrorResponse(
|
|
601
|
-
req,
|
|
602
|
-
res,
|
|
603
|
-
new BadDataException(
|
|
604
|
-
"Failed to start Microsoft Teams admin consent",
|
|
605
|
-
),
|
|
606
|
-
);
|
|
1122
|
+
return Response.sendErrorResponse(req, res, error as Exception);
|
|
607
1123
|
}
|
|
608
1124
|
},
|
|
609
1125
|
);
|
|
610
1126
|
|
|
611
1127
|
/*
|
|
612
|
-
* Admin consent - callback handler
|
|
613
|
-
*
|
|
1128
|
+
* Admin consent - callback handler. Microsoft redirects here twice:
|
|
1129
|
+
*
|
|
1130
|
+
* 1. After the admin-consent screen, with tenant=<tenantId> and
|
|
1131
|
+
* admin_consent=True. Both are plain query parameters anyone can type,
|
|
1132
|
+
* so nothing is stored on them. The flow continues to a sign-in against
|
|
1133
|
+
* that tenant instead.
|
|
1134
|
+
* 2. After that sign-in, with an authorization code. Its ID token says
|
|
1135
|
+
* which tenant the person completing the flow actually signed in to,
|
|
1136
|
+
* and only a tenant proven that way is bound to the project.
|
|
1137
|
+
*
|
|
1138
|
+
* Which leg a request is comes from the server-side state record, not from
|
|
1139
|
+
* the shape of the query string.
|
|
614
1140
|
*/
|
|
615
1141
|
router.get(
|
|
616
1142
|
"/microsoft-teams/admin-consent/callback",
|
|
617
1143
|
async (req: ExpressRequest, res: ExpressResponse) => {
|
|
1144
|
+
let teamsIntegrationPageUrl: URL | null = null;
|
|
1145
|
+
|
|
618
1146
|
try {
|
|
619
|
-
const
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
1147
|
+
const stateRecord: WorkspaceOAuthStateRecord | null =
|
|
1148
|
+
await WorkspaceOAuthState.consume({
|
|
1149
|
+
req,
|
|
1150
|
+
state: req.query["state"]?.toString(),
|
|
1151
|
+
flows: [
|
|
1152
|
+
WorkspaceOAuthFlow.MicrosoftTeamsAdminConsent,
|
|
1153
|
+
WorkspaceOAuthFlow.MicrosoftTeamsAdminConsentSignIn,
|
|
1154
|
+
],
|
|
1155
|
+
});
|
|
624
1156
|
|
|
625
|
-
if (!
|
|
1157
|
+
if (!stateRecord) {
|
|
626
1158
|
return Response.sendErrorResponse(
|
|
627
1159
|
req,
|
|
628
1160
|
res,
|
|
629
1161
|
new BadRequestException(
|
|
630
|
-
|
|
1162
|
+
WorkspaceOAuthState.INVALID_STATE_MESSAGE,
|
|
631
1163
|
),
|
|
632
1164
|
);
|
|
633
1165
|
}
|
|
634
1166
|
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
return Response.sendErrorResponse(
|
|
638
|
-
req,
|
|
639
|
-
res,
|
|
640
|
-
new BadRequestException("Invalid state param"),
|
|
641
|
-
);
|
|
642
|
-
}
|
|
643
|
-
|
|
644
|
-
const projectId: string = stateParts[0]!;
|
|
645
|
-
|
|
646
|
-
const teamsIntegrationPageUrl: URL = URL.fromString(
|
|
647
|
-
DashboardClientUrl.toString() +
|
|
648
|
-
`/${projectId.toString()}/settings/microsoft-teams-integration`,
|
|
1167
|
+
teamsIntegrationPageUrl = MicrosoftTeamsAPI.getIntegrationPageUrl(
|
|
1168
|
+
stateRecord.projectId,
|
|
649
1169
|
);
|
|
650
1170
|
|
|
1171
|
+
const error: string | undefined = req.query["error"]?.toString();
|
|
1172
|
+
const errorDescription: string | undefined =
|
|
1173
|
+
req.query["error_description"]?.toString();
|
|
1174
|
+
|
|
651
1175
|
if (error) {
|
|
652
1176
|
return Response.redirect(
|
|
653
1177
|
req,
|
|
@@ -659,17 +1183,6 @@ export default class MicrosoftTeamsAPI {
|
|
|
659
1183
|
);
|
|
660
1184
|
}
|
|
661
1185
|
|
|
662
|
-
if (!tenantId) {
|
|
663
|
-
return Response.redirect(
|
|
664
|
-
req,
|
|
665
|
-
res,
|
|
666
|
-
teamsIntegrationPageUrl.addQueryParam(
|
|
667
|
-
"error",
|
|
668
|
-
"Missing tenant information from admin consent callback",
|
|
669
|
-
),
|
|
670
|
-
);
|
|
671
|
-
}
|
|
672
|
-
|
|
673
1186
|
if (!MicrosoftTeamsAppClientId || !MicrosoftTeamsAppClientSecret) {
|
|
674
1187
|
return Response.redirect(
|
|
675
1188
|
req,
|
|
@@ -681,209 +1194,41 @@ export default class MicrosoftTeamsAPI {
|
|
|
681
1194
|
);
|
|
682
1195
|
}
|
|
683
1196
|
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
workspaceType: WorkspaceType.MicrosoftTeams,
|
|
689
|
-
});
|
|
690
|
-
|
|
691
|
-
// Acquire an application token for the specific tenant using client credentials
|
|
692
|
-
const tokenResp: HTTPErrorResponse | HTTPResponse<JSONObject> =
|
|
693
|
-
await API.post<JSONObject>({
|
|
694
|
-
url: URL.fromString(
|
|
695
|
-
`https://login.microsoftonline.com/${tenantId}/oauth2/v2.0/token`,
|
|
696
|
-
),
|
|
697
|
-
data: {
|
|
698
|
-
client_id: MicrosoftTeamsAppClientId,
|
|
699
|
-
client_secret: MicrosoftTeamsAppClientSecret,
|
|
700
|
-
grant_type: "client_credentials",
|
|
701
|
-
scope: "https://graph.microsoft.com/.default",
|
|
702
|
-
},
|
|
703
|
-
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
|
704
|
-
});
|
|
705
|
-
|
|
706
|
-
if (tokenResp instanceof HTTPErrorResponse) {
|
|
707
|
-
logger.error(
|
|
708
|
-
"Error getting app token after admin consent:",
|
|
709
|
-
getLogAttributesFromRequest(req as any),
|
|
710
|
-
);
|
|
711
|
-
logger.error(tokenResp, getLogAttributesFromRequest(req as any));
|
|
712
|
-
return Response.redirect(
|
|
1197
|
+
if (
|
|
1198
|
+
stateRecord.flow === WorkspaceOAuthFlow.MicrosoftTeamsAdminConsent
|
|
1199
|
+
) {
|
|
1200
|
+
return await MicrosoftTeamsAPI.continueAdminConsentWithSignIn({
|
|
713
1201
|
req,
|
|
714
1202
|
res,
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
"Failed to get Graph app token after admin consent",
|
|
718
|
-
),
|
|
719
|
-
);
|
|
720
|
-
}
|
|
721
|
-
|
|
722
|
-
const tokenData: JSONObject = tokenResp.data;
|
|
723
|
-
const appAccessToken: string =
|
|
724
|
-
(tokenData["access_token"] as string) || "";
|
|
725
|
-
const expiresInSec: number = Number(tokenData["expires_in"] || 0);
|
|
726
|
-
const expiresAtIso: string = new Date(
|
|
727
|
-
Date.now() + Math.max(0, (expiresInSec - 60) * 1000),
|
|
728
|
-
).toISOString();
|
|
729
|
-
|
|
730
|
-
// tokenData carries the app access token; only its expiry is logged.
|
|
731
|
-
logger.debug(
|
|
732
|
-
"Microsoft Graph app token acquired via admin consent. expiresAt: " +
|
|
733
|
-
expiresAtIso,
|
|
734
|
-
getLogAttributesFromRequest(req as any),
|
|
735
|
-
);
|
|
736
|
-
|
|
737
|
-
// Get available teams from user auth token
|
|
738
|
-
const userId: string = stateParts[1]!;
|
|
739
|
-
const userAuth: WorkspaceUserAuthToken | null =
|
|
740
|
-
await WorkspaceUserAuthTokenService.getUserAuth({
|
|
741
|
-
projectId: new ObjectID(projectId),
|
|
742
|
-
userId: new ObjectID(userId),
|
|
743
|
-
workspaceType: WorkspaceType.MicrosoftTeams,
|
|
1203
|
+
stateRecord,
|
|
1204
|
+
teamsIntegrationPageUrl,
|
|
744
1205
|
});
|
|
745
|
-
|
|
746
|
-
let availableTeams: Record<string, MicrosoftTeamsTeam> = {};
|
|
747
|
-
if (userAuth?.miscData) {
|
|
748
|
-
availableTeams = (userAuth.miscData as any).availableTeams || {};
|
|
749
1206
|
}
|
|
750
1207
|
|
|
751
|
-
|
|
752
|
-
if (Object.keys(availableTeams).length === 0) {
|
|
753
|
-
try {
|
|
754
|
-
const teamsResponse:
|
|
755
|
-
| HTTPErrorResponse
|
|
756
|
-
| HTTPResponse<JSONObject> = await API.get<JSONObject>({
|
|
757
|
-
url: URL.fromString(
|
|
758
|
-
"https://graph.microsoft.com/v1.0/teams?$select=id,displayName",
|
|
759
|
-
),
|
|
760
|
-
headers: {
|
|
761
|
-
Authorization: `Bearer ${appAccessToken}`,
|
|
762
|
-
},
|
|
763
|
-
});
|
|
764
|
-
|
|
765
|
-
if (teamsResponse instanceof HTTPErrorResponse) {
|
|
766
|
-
logger.error(
|
|
767
|
-
"Failed to get teams:",
|
|
768
|
-
getLogAttributesFromRequest(req as any),
|
|
769
|
-
);
|
|
770
|
-
logger.error(
|
|
771
|
-
teamsResponse,
|
|
772
|
-
getLogAttributesFromRequest(req as any),
|
|
773
|
-
);
|
|
774
|
-
return Response.redirect(
|
|
775
|
-
req,
|
|
776
|
-
res,
|
|
777
|
-
teamsIntegrationPageUrl.addQueryParam(
|
|
778
|
-
"error",
|
|
779
|
-
"Failed to retrieve teams from Microsoft Graph API after admin consent",
|
|
780
|
-
),
|
|
781
|
-
);
|
|
782
|
-
}
|
|
783
|
-
|
|
784
|
-
const teamsData: JSONObject = teamsResponse.data;
|
|
785
|
-
const teams: Array<JSONObject> =
|
|
786
|
-
(teamsData["value"] as Array<JSONObject>) || [];
|
|
787
|
-
|
|
788
|
-
if (teams.length === 0) {
|
|
789
|
-
return Response.redirect(
|
|
790
|
-
req,
|
|
791
|
-
res,
|
|
792
|
-
teamsIntegrationPageUrl.addQueryParam(
|
|
793
|
-
"error",
|
|
794
|
-
"No teams available in your Microsoft 365 tenant. Please create a team first.",
|
|
795
|
-
),
|
|
796
|
-
);
|
|
797
|
-
}
|
|
798
|
-
|
|
799
|
-
availableTeams = teams.reduce(
|
|
800
|
-
(acc: Record<string, MicrosoftTeamsTeam>, t: JSONObject) => {
|
|
801
|
-
const team: MicrosoftTeamsTeam = {
|
|
802
|
-
id: t["id"] as string,
|
|
803
|
-
name: (t["displayName"] as string) || "Unnamed Team",
|
|
804
|
-
};
|
|
805
|
-
/*
|
|
806
|
-
* Keyed by id, not display name — Teams allows duplicate
|
|
807
|
-
* team names, and keying by name silently collapsed them so
|
|
808
|
-
* only the last one of each name was selectable.
|
|
809
|
-
*/
|
|
810
|
-
acc[team.id] = team;
|
|
811
|
-
return acc;
|
|
812
|
-
},
|
|
813
|
-
{} as Record<string, MicrosoftTeamsTeam>,
|
|
814
|
-
);
|
|
815
|
-
} catch (error) {
|
|
816
|
-
logger.error(
|
|
817
|
-
"Error getting teams:",
|
|
818
|
-
getLogAttributesFromRequest(req as any),
|
|
819
|
-
);
|
|
820
|
-
logger.error(error, getLogAttributesFromRequest(req as any));
|
|
821
|
-
return Response.redirect(
|
|
822
|
-
req,
|
|
823
|
-
res,
|
|
824
|
-
teamsIntegrationPageUrl.addQueryParam(
|
|
825
|
-
"error",
|
|
826
|
-
"Failed to retrieve teams from Microsoft Graph API",
|
|
827
|
-
),
|
|
828
|
-
);
|
|
829
|
-
}
|
|
830
|
-
}
|
|
831
|
-
|
|
832
|
-
// Merge and persist project auth with tenantId, app token, and available teams
|
|
833
|
-
const mergedMiscData: MicrosoftTeamsMiscData = {
|
|
834
|
-
...(existingAuth?.miscData as any),
|
|
835
|
-
tenantId: tenantId,
|
|
836
|
-
appAccessToken: appAccessToken,
|
|
837
|
-
appAccessTokenExpiresAt: expiresAtIso,
|
|
838
|
-
adminConsentGranted: true,
|
|
839
|
-
adminConsentGrantedAt: new Date().toISOString(),
|
|
840
|
-
availableTeams: availableTeams,
|
|
841
|
-
botId: MicrosoftTeamsAppClientId || "",
|
|
842
|
-
};
|
|
843
|
-
|
|
844
|
-
await WorkspaceProjectAuthTokenService.refreshAuthToken({
|
|
845
|
-
projectId: new ObjectID(projectId),
|
|
846
|
-
workspaceType: WorkspaceType.MicrosoftTeams,
|
|
847
|
-
authToken: appAccessToken,
|
|
848
|
-
workspaceProjectId: tenantId, // Use tenant ID as the workspace project identifier
|
|
849
|
-
miscData: mergedMiscData,
|
|
850
|
-
});
|
|
851
|
-
|
|
852
|
-
return Response.redirect(
|
|
1208
|
+
return await MicrosoftTeamsAPI.completeAdminConsent({
|
|
853
1209
|
req,
|
|
854
1210
|
res,
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
);
|
|
1211
|
+
stateRecord,
|
|
1212
|
+
teamsIntegrationPageUrl,
|
|
1213
|
+
});
|
|
859
1214
|
} catch (err) {
|
|
860
1215
|
logger.error(
|
|
861
1216
|
"Error in Microsoft Teams admin consent callback: ",
|
|
862
1217
|
getLogAttributesFromRequest(req as any),
|
|
863
1218
|
);
|
|
864
1219
|
logger.error(err, getLogAttributesFromRequest(req as any));
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
req
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
return Response.redirect(
|
|
876
|
-
req,
|
|
877
|
-
res,
|
|
878
|
-
teamsIntegrationPageUrl.addQueryParam(
|
|
879
|
-
"error",
|
|
880
|
-
"Failed to finalize Microsoft Teams admin consent",
|
|
881
|
-
),
|
|
882
|
-
);
|
|
883
|
-
}
|
|
884
|
-
} catch {
|
|
885
|
-
// ignore
|
|
1220
|
+
|
|
1221
|
+
if (teamsIntegrationPageUrl) {
|
|
1222
|
+
return Response.redirect(
|
|
1223
|
+
req,
|
|
1224
|
+
res,
|
|
1225
|
+
teamsIntegrationPageUrl.addQueryParam(
|
|
1226
|
+
"error",
|
|
1227
|
+
"Failed to finalize Microsoft Teams admin consent",
|
|
1228
|
+
),
|
|
1229
|
+
);
|
|
886
1230
|
}
|
|
1231
|
+
|
|
887
1232
|
return Response.sendErrorResponse(
|
|
888
1233
|
req,
|
|
889
1234
|
res,
|
|
@@ -1211,6 +1556,62 @@ export default class MicrosoftTeamsAPI {
|
|
|
1211
1556
|
},
|
|
1212
1557
|
);
|
|
1213
1558
|
|
|
1559
|
+
// Send a test notification to one channel ("Send Test" in Project Settings).
|
|
1560
|
+
router.post(
|
|
1561
|
+
"/microsoft-teams/channels/test",
|
|
1562
|
+
UserMiddleware.getUserMiddleware,
|
|
1563
|
+
async (req: ExpressRequest, res: ExpressResponse) => {
|
|
1564
|
+
try {
|
|
1565
|
+
const databaseProps: DatabaseCommonInteractionProps =
|
|
1566
|
+
await CommonAPI.getDatabaseCommonInteractionProps(req);
|
|
1567
|
+
|
|
1568
|
+
/*
|
|
1569
|
+
* Posting into a channel is a side effect, so membership alone is
|
|
1570
|
+
* not enough. Anyone who could create a workspace notification rule
|
|
1571
|
+
* - including its team block list, which the CRUD create enforces
|
|
1572
|
+
* too - can already make OneUptime post to this channel; a Viewer,
|
|
1573
|
+
* or a member whose team is blocked from creating rules, cannot.
|
|
1574
|
+
* getUserMiddleware admits unauthenticated requests as "public", so
|
|
1575
|
+
* the membership check is mandatory as well.
|
|
1576
|
+
*/
|
|
1577
|
+
const projectId: ObjectID =
|
|
1578
|
+
CommonAPI.assertAuthenticatedProjectMember(databaseProps);
|
|
1579
|
+
|
|
1580
|
+
CommonAPI.assertCanCreateTable({
|
|
1581
|
+
modelType: WorkspaceNotificationRule,
|
|
1582
|
+
props: databaseProps,
|
|
1583
|
+
errorMessage:
|
|
1584
|
+
"You do not have permission to send test notifications in this project.",
|
|
1585
|
+
});
|
|
1586
|
+
|
|
1587
|
+
const teamId: string =
|
|
1588
|
+
typeof req.body?.["teamId"] === "string"
|
|
1589
|
+
? (req.body["teamId"] as string)
|
|
1590
|
+
: "";
|
|
1591
|
+
|
|
1592
|
+
const channelId: string =
|
|
1593
|
+
typeof req.body?.["channelId"] === "string"
|
|
1594
|
+
? (req.body["channelId"] as string)
|
|
1595
|
+
: "";
|
|
1596
|
+
|
|
1597
|
+
// chatId is deliberately not forwarded: this route tests channels only.
|
|
1598
|
+
await WorkspaceNotificationRuleService.sendTestNotificationToDestination(
|
|
1599
|
+
{
|
|
1600
|
+
projectId: projectId,
|
|
1601
|
+
workspaceType: WorkspaceType.MicrosoftTeams,
|
|
1602
|
+
testByUserId: databaseProps.userId!,
|
|
1603
|
+
teamId: teamId,
|
|
1604
|
+
channelId: channelId,
|
|
1605
|
+
},
|
|
1606
|
+
);
|
|
1607
|
+
|
|
1608
|
+
return Response.sendEmptySuccessResponse(req, res);
|
|
1609
|
+
} catch (err) {
|
|
1610
|
+
return Response.sendErrorResponse(req, res, err as Exception);
|
|
1611
|
+
}
|
|
1612
|
+
},
|
|
1613
|
+
);
|
|
1614
|
+
|
|
1214
1615
|
/*
|
|
1215
1616
|
* Get chats (group / personal chats) the OneUptime app has been added to.
|
|
1216
1617
|
* Chats cannot be listed via app-only Graph permissions, so this returns
|
|
@@ -1252,6 +1653,60 @@ export default class MicrosoftTeamsAPI {
|
|
|
1252
1653
|
},
|
|
1253
1654
|
);
|
|
1254
1655
|
|
|
1656
|
+
// Send a test notification to one chat ("Send Test" in Project Settings).
|
|
1657
|
+
router.post(
|
|
1658
|
+
"/microsoft-teams/chats/test",
|
|
1659
|
+
UserMiddleware.getUserMiddleware,
|
|
1660
|
+
async (req: ExpressRequest, res: ExpressResponse) => {
|
|
1661
|
+
try {
|
|
1662
|
+
const databaseProps: DatabaseCommonInteractionProps =
|
|
1663
|
+
await CommonAPI.getDatabaseCommonInteractionProps(req);
|
|
1664
|
+
|
|
1665
|
+
/*
|
|
1666
|
+
* Posting into a chat is a side effect, so membership alone is not
|
|
1667
|
+
* enough. Anyone who could create a workspace notification rule -
|
|
1668
|
+
* including its team block list, which the CRUD create enforces
|
|
1669
|
+
* too - can already make OneUptime post to this chat; a Viewer, or
|
|
1670
|
+
* a member whose team is blocked from creating rules, cannot.
|
|
1671
|
+
* getUserMiddleware admits unauthenticated requests as "public", so
|
|
1672
|
+
* the membership check is mandatory as well.
|
|
1673
|
+
*/
|
|
1674
|
+
const projectId: ObjectID =
|
|
1675
|
+
CommonAPI.assertAuthenticatedProjectMember(databaseProps);
|
|
1676
|
+
|
|
1677
|
+
CommonAPI.assertCanCreateTable({
|
|
1678
|
+
modelType: WorkspaceNotificationRule,
|
|
1679
|
+
props: databaseProps,
|
|
1680
|
+
errorMessage:
|
|
1681
|
+
"You do not have permission to send test notifications in this project.",
|
|
1682
|
+
});
|
|
1683
|
+
|
|
1684
|
+
const chatId: string =
|
|
1685
|
+
typeof req.body?.["chatId"] === "string"
|
|
1686
|
+
? (req.body["chatId"] as string)
|
|
1687
|
+
: "";
|
|
1688
|
+
|
|
1689
|
+
/*
|
|
1690
|
+
* Only the chat id is forwarded. The service checks it against the
|
|
1691
|
+
* chats this project captured, so a chat id from another tenant is
|
|
1692
|
+
* rejected before anything is sent.
|
|
1693
|
+
*/
|
|
1694
|
+
await WorkspaceNotificationRuleService.sendTestNotificationToDestination(
|
|
1695
|
+
{
|
|
1696
|
+
projectId: projectId,
|
|
1697
|
+
workspaceType: WorkspaceType.MicrosoftTeams,
|
|
1698
|
+
testByUserId: databaseProps.userId!,
|
|
1699
|
+
chatId: chatId,
|
|
1700
|
+
},
|
|
1701
|
+
);
|
|
1702
|
+
|
|
1703
|
+
return Response.sendEmptySuccessResponse(req, res);
|
|
1704
|
+
} catch (err) {
|
|
1705
|
+
return Response.sendErrorResponse(req, res, err as Exception);
|
|
1706
|
+
}
|
|
1707
|
+
},
|
|
1708
|
+
);
|
|
1709
|
+
|
|
1255
1710
|
return router;
|
|
1256
1711
|
}
|
|
1257
1712
|
}
|