@oneuptime/common 14.0.8 → 14.0.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Models/DatabaseModels/AutoRemediationSuggestion.ts +60 -0
- package/Models/DatabaseModels/CephCluster.ts +213 -0
- package/Models/DatabaseModels/DatabaseServer.ts +213 -0
- package/Models/DatabaseModels/DockerHost.ts +213 -0
- package/Models/DatabaseModels/DockerSwarmCluster.ts +213 -0
- package/Models/DatabaseModels/GlobalConfig.ts +1 -1
- package/Models/DatabaseModels/Host.ts +213 -0
- package/Models/DatabaseModels/Index.ts +4 -0
- package/Models/DatabaseModels/KubernetesAiAgent.ts +364 -0
- package/Models/DatabaseModels/KubernetesCluster.ts +3 -3
- package/Models/DatabaseModels/PodmanHost.ts +213 -0
- package/Models/DatabaseModels/Project.ts +55 -5
- package/Models/DatabaseModels/ProxmoxCluster.ts +213 -0
- package/Models/DatabaseModels/ProxmoxResource.ts +49 -1
- package/Models/DatabaseModels/ResourceAiAgent.ts +419 -0
- package/Models/DatabaseModels/RunnerJob.ts +219 -0
- package/Models/DatabaseModels/TeamComplianceSetting.ts +143 -2
- package/Models/DatabaseModels/VMwareVCenter.ts +213 -0
- package/Models/DatabaseModels/WorkspaceProjectAuthToken.ts +17 -0
- package/Server/API/AIChatAPI.ts +6 -3
- package/Server/API/AIInvestigationAPI.ts +17 -10
- package/Server/API/AutoRemediationAPI.ts +598 -25
- package/Server/API/KubernetesClusterAiAccessAPI.ts +623 -21
- package/Server/API/MicrosoftTeamsAPI.ts +93 -14
- package/Server/API/ProxmoxResourceAPI.ts +244 -14
- package/Server/API/ResourceAiAccessAPI.ts +1669 -0
- package/Server/Infrastructure/GlobalCache.ts +32 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1796000000000-AddTeamComplianceRuleScope.ts +99 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1796100000000-AddKubernetesAiAgentAndAiDefaults.ts +137 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1796200000000-AddProxmoxResourceNativePushColumns.ts +42 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1796300000000-AddResourceAiAgents.ts +423 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +8 -0
- package/Server/Infrastructure/Semaphore.ts +22 -0
- package/Server/Middleware/TelemetryIngest.ts +51 -18
- package/Server/Services/AIService.ts +70 -1
- package/Server/Services/AlertService.ts +352 -11
- package/Server/Services/AlertSeverityService.ts +65 -15
- package/Server/Services/AnalyticsDatabaseService.ts +45 -1
- package/Server/Services/AutoRemediationRuleEngineService.ts +940 -112
- package/Server/Services/AutoRemediationRuleService.ts +1 -1
- package/Server/Services/CephClusterService.ts +109 -1
- package/Server/Services/DatabaseServerService.ts +116 -1
- package/Server/Services/DockerHostService.ts +109 -1
- package/Server/Services/DockerSwarmClusterService.ts +113 -1
- package/Server/Services/HostService.ts +126 -4
- package/Server/Services/IncidentService.ts +280 -104
- package/Server/Services/IncidentSeverityService.ts +66 -15
- package/Server/Services/KubernetesAiAgentJobService.ts +185 -0
- package/Server/Services/KubernetesAiAgentService.ts +1634 -0
- package/Server/Services/KubernetesClusterAiAccessService.ts +1118 -451
- package/Server/Services/KubernetesClusterService.ts +129 -21
- package/Server/Services/MetricRecordingRuleService.ts +47 -0
- package/Server/Services/PodmanHostService.ts +109 -1
- package/Server/Services/ProjectService.ts +32 -0
- package/Server/Services/ProxmoxClusterService.ts +110 -1
- package/Server/Services/ProxmoxResourceService.ts +322 -5
- package/Server/Services/ResourceAiAccessService.ts +1439 -0
- package/Server/Services/ResourceAiAgentJobService.ts +202 -0
- package/Server/Services/ResourceAiAgentService.ts +2432 -0
- package/Server/Services/RunnerJobService.ts +852 -108
- package/Server/Services/RunnerService.ts +1 -1
- package/Server/Services/ScheduledMaintenanceService.ts +737 -1
- package/Server/Services/ScheduledMaintenanceStateTimelineService.ts +414 -56
- package/Server/Services/TeamComplianceSettingService.ts +1125 -9
- package/Server/Services/TelemetryUsageBillingService.ts +28 -0
- package/Server/Services/TraceRecordingRuleService.ts +33 -0
- package/Server/Services/VMwareVCenterService.ts +110 -1
- package/Server/Utils/AI/ClusterAccess/ClusterAccessContext.ts +67 -9
- package/Server/Utils/AI/ClusterAccess/KubectlInvestigationToolkit.ts +39 -10
- package/Server/Utils/AI/ClusterAccess/KubectlJobRunner.ts +14 -3
- package/Server/Utils/AI/Remediation/RemediationCommandTools.ts +1475 -51
- package/Server/Utils/AI/Remediation/RemediationExecutionRunner.ts +1000 -43
- package/Server/Utils/AI/Remediation/RemediationPlanRunner.ts +25 -1
- package/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.ts +577 -0
- package/Server/Utils/AI/ResourceAccess/ResourceAccessContext.ts +271 -0
- package/Server/Utils/AI/ResourceAccess/ResourceAccessToolNames.ts +45 -0
- package/Server/Utils/AI/ResourceAccess/ResourceAiAccessSettings.ts +964 -0
- package/Server/Utils/AI/ResourceAccess/ResourceAiDeleteCleanup.ts +333 -0
- package/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.ts +873 -0
- package/Server/Utils/AI/SRE/AIInvestigationEngine.ts +120 -7
- package/Server/Utils/AI/SRE/AlertInvestigationRunner.ts +72 -5
- package/Server/Utils/AI/SRE/IncidentInvestigationRunner.ts +72 -5
- package/Server/Utils/AI/SRE/IncidentPostmortemRunner.ts +40 -8
- package/Server/Utils/AI/SRE/InvestigationEligibility.ts +13 -2
- package/Server/Utils/AI/SRE/InvestigationGrader.ts +1 -1
- package/Server/Utils/AutoRemediation/CommandPlanExecutor.ts +402 -14
- package/Server/Utils/AutoRemediation/RemediationVerifier.ts +35 -2
- package/Server/Utils/Database/ProjectScopedReferenceValidator.ts +9 -1
- package/Server/Utils/SessionReplay/SessionReplayBudgetMetrics.ts +920 -0
- package/Server/Utils/SessionReplay/SessionReplayUsage.ts +84 -6
- package/Server/Utils/Telemetry/InventoryEntityRegistry.ts +133 -7
- package/Server/Utils/Telemetry/ProxmoxCephSnapshotScan.ts +58 -4
- package/Server/Utils/Telemetry/ProxmoxNativeNodeLiveness.ts +447 -0
- package/Server/Utils/Telemetry/ProxmoxNativePush.ts +903 -0
- package/Server/Utils/Telemetry/TelemetryEntity.ts +87 -27
- package/Server/Utils/Workspace/MicrosoftTeams/Actions/Alert.ts +35 -15
- package/Server/Utils/Workspace/MicrosoftTeams/Actions/AlertEpisode.ts +33 -15
- package/Server/Utils/Workspace/MicrosoftTeams/Actions/Auth.ts +21 -1
- package/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.ts +298 -224
- package/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.ts +35 -15
- package/Server/Utils/Workspace/MicrosoftTeams/Actions/ScheduledMaintenance.ts +389 -175
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +1073 -213
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsActivityDeduplicator.ts +163 -0
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCardChoices.ts +396 -0
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateCommands.ts +418 -0
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsMessageSize.ts +152 -0
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsReplies.ts +251 -0
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsTimezone.ts +214 -0
- package/Tests/App/AdminDashboard/RowActionPlacementOverrides.test.tsx +278 -0
- package/Tests/App/Dashboard/AIChatChartWidgetZoom.test.tsx +738 -0
- package/Tests/App/Dashboard/AIFeaturesSettingsPointers.test.tsx +147 -0
- package/Tests/App/Dashboard/AIInsightsKubernetesClusterPage.test.tsx +1523 -0
- package/Tests/App/Dashboard/AdminUserNotificationMethodsPage.test.tsx +463 -3
- package/Tests/App/Dashboard/AffectedResourcesPickerDropdownPlacement.test.tsx +958 -0
- package/Tests/App/Dashboard/AffectedResourcesPickerFocusLeave.test.tsx +595 -0
- package/Tests/App/Dashboard/AskAiAvailability.test.ts +20 -3
- package/Tests/App/Dashboard/AskAiDisabled.test.tsx +8 -3
- package/Tests/App/Dashboard/CephRateChartReload.test.tsx +1456 -0
- package/Tests/App/Dashboard/CephTimeRangeZoom.test.tsx +1229 -0
- package/Tests/App/Dashboard/ChartCardTimeRangeZoom.test.tsx +151 -0
- package/Tests/App/Dashboard/ChartCardZoomAffordances.test.tsx +257 -0
- package/Tests/App/Dashboard/ChartRefetchFrame.test.tsx +141 -0
- package/Tests/App/Dashboard/ChartZoomHarness.tsx +249 -0
- package/Tests/App/Dashboard/ChartZoomStandIn.tsx +131 -0
- package/Tests/App/Dashboard/CloudServerlessSlowLoads.test.tsx +628 -0
- package/Tests/App/Dashboard/CloudServerlessTimeRangeZoom.test.tsx +607 -0
- package/Tests/App/Dashboard/ClusterAccessNotice.test.tsx +184 -19
- package/Tests/App/Dashboard/CompanionMetricsTabZoom.test.tsx +632 -0
- package/Tests/App/Dashboard/ContainerChartZoomStandIn.tsx +195 -0
- package/Tests/App/Dashboard/ContainerHostOverviewSlowLoads.test.tsx +542 -0
- package/Tests/App/Dashboard/ContainerHostOverviewTimeRangeZoom.test.tsx +848 -0
- package/Tests/App/Dashboard/ContainerMetricsTimeRangeZoom.test.tsx +561 -0
- package/Tests/App/Dashboard/DashboardBoardWideZoomShell.test.tsx +1147 -0
- package/Tests/App/Dashboard/DashboardEditPermissions.test.tsx +3 -2
- package/Tests/App/Dashboard/DashboardHistogramWidgetDragCursor.test.tsx +399 -0
- package/Tests/App/Dashboard/DashboardHistogramWidgetZoom.test.tsx +985 -0
- package/Tests/App/Dashboard/DashboardHistogramWidgetZoomHint.test.tsx +803 -0
- package/Tests/App/Dashboard/DashboardLazyPages.test.tsx +1 -0
- package/Tests/App/Dashboard/DashboardSettingsPreviewZoom.test.tsx +679 -0
- package/Tests/App/Dashboard/DashboardSloAndDataSourceChartZoom.test.tsx +881 -0
- package/Tests/App/Dashboard/DashboardTraceStatusWidgets.test.tsx +878 -0
- package/Tests/App/Dashboard/DatabaseDocumentationMarkdown.test.ts +18 -6
- package/Tests/App/Dashboard/DatabaseMetricChartModalTimeRangeZoom.test.tsx +442 -0
- package/Tests/App/Dashboard/DatabaseOverviewTimeRangeZoom.test.tsx +831 -0
- package/Tests/App/Dashboard/DatabaseServerComponents.test.tsx +43 -0
- package/Tests/App/Dashboard/DockerSwarmInsightsTimeRangeZoom.test.tsx +524 -0
- package/Tests/App/Dashboard/DockerSwarmRateChartRefresh.test.tsx +259 -0
- package/Tests/App/Dashboard/EdgeDetailPanelHistory.test.tsx +763 -0
- package/Tests/App/Dashboard/EdgeDetailPanelTimeRangeZoom.test.tsx +547 -0
- package/Tests/App/Dashboard/EdgeHistoryBucketsCases.tsx +565 -0
- package/Tests/App/Dashboard/EdgeHistoryBucketsKathmandu.test.tsx +73 -0
- package/Tests/App/Dashboard/EdgeHistoryBucketsKolkata.test.tsx +74 -0
- package/Tests/App/Dashboard/EdgeHistoryBucketsNewYork.test.tsx +72 -0
- package/Tests/App/Dashboard/EdgeHistoryBucketsUtc.test.tsx +72 -0
- package/Tests/App/Dashboard/EmbeddedMetricCardRefresh.test.tsx +310 -0
- package/Tests/App/Dashboard/EmbeddedMetricCardTimeRangeZoom.test.tsx +536 -0
- package/Tests/App/Dashboard/EscalationRuleReadiness.test.tsx +3 -1
- package/Tests/App/Dashboard/EscalationRuleRowActions.test.tsx +660 -0
- package/Tests/App/Dashboard/EventNotes.test.tsx +2 -2
- package/Tests/App/Dashboard/EventOverviewPages.test.tsx +587 -13
- package/Tests/App/Dashboard/EventOverviewSnapshotExplorerZoom.test.tsx +1139 -0
- package/Tests/App/Dashboard/EventOverviewSnapshotZoomAcrossTabs.test.tsx +1057 -0
- package/Tests/App/Dashboard/EventOverviewTelemetrySnapshotZoom.test.tsx +757 -0
- package/Tests/App/Dashboard/ExceptionOccurrenceTrendZoom.test.tsx +675 -0
- package/Tests/App/Dashboard/ExceptionOccurrencesZoomSurvivesViewSwitch.test.tsx +405 -0
- package/Tests/App/Dashboard/ExceptionSignalPages.test.tsx +67 -3
- package/Tests/App/Dashboard/ExceptionTablesSpanStatus.test.tsx +515 -0
- package/Tests/App/Dashboard/ExplorerOwnZoomRegression.test.tsx +739 -0
- package/Tests/App/Dashboard/FlowBandwidthAxisCases.tsx +461 -0
- package/Tests/App/Dashboard/FlowBandwidthAxisKathmandu.test.tsx +25 -0
- package/Tests/App/Dashboard/FlowBandwidthAxisKolkata.test.tsx +25 -0
- package/Tests/App/Dashboard/FlowBandwidthAxisNewYork.test.tsx +25 -0
- package/Tests/App/Dashboard/FlowBandwidthAxisUtc.test.tsx +24 -0
- package/Tests/App/Dashboard/FlowTopTalkersZoomRefetch.test.tsx +722 -0
- package/Tests/App/Dashboard/FlowViewportGuard.test.tsx +2526 -0
- package/Tests/App/Dashboard/HostPagesSlowLoads.test.tsx +872 -0
- package/Tests/App/Dashboard/HostPagesTimeRangeZoom.test.tsx +1208 -0
- package/Tests/App/Dashboard/IncidentRootCauseTimeRangeZoom.test.tsx +358 -0
- package/Tests/App/Dashboard/InfrastructureGraph.test.tsx +100 -9
- package/Tests/App/Dashboard/InfrastructureMetricsTabTimeRangeZoom.test.tsx +485 -0
- package/Tests/App/Dashboard/InvestigationDrawerCompanionZoom.test.tsx +655 -0
- package/Tests/App/Dashboard/InvestigationDrawerZoom.test.tsx +830 -0
- package/Tests/App/Dashboard/InvestigationInfrastructureTools.test.tsx +506 -0
- package/Tests/App/Dashboard/InvestigationNotStarted.test.tsx +338 -2
- package/Tests/App/Dashboard/InvoicesPayInvoice.test.tsx +454 -16
- package/Tests/App/Dashboard/KubernetesClusterAiAccessSettings.test.ts +799 -819
- package/Tests/App/Dashboard/KubernetesClusterAiAgentOverviewCard.test.tsx +367 -0
- package/Tests/App/Dashboard/KubernetesClusterAiAgentStatus.test.ts +1202 -0
- package/Tests/App/Dashboard/KubernetesClusterAiDocumentationMarkdown.test.ts +106 -0
- package/Tests/App/Dashboard/KubernetesClusterAiNavigation.test.tsx +354 -0
- package/Tests/App/Dashboard/KubernetesClusterAiPage.test.tsx +1884 -2054
- package/Tests/App/Dashboard/KubernetesClusterAiPageServerParity.test.ts +478 -179
- package/Tests/App/Dashboard/KubernetesClusterMetricTooltips.test.ts +50 -0
- package/Tests/App/Dashboard/KubernetesClusterOverviewTooltips.test.tsx +2 -1
- package/Tests/App/Dashboard/KubernetesClusterOverviewZoom.test.tsx +1217 -0
- package/Tests/App/Dashboard/KubernetesClusterPagesZoom.test.tsx +731 -0
- package/Tests/App/Dashboard/KubernetesCostsLoadRecovery.test.tsx +869 -0
- package/Tests/App/Dashboard/KubernetesCostsZoom.test.tsx +1214 -0
- package/Tests/App/Dashboard/KubernetesCostsZoomExactHours.test.tsx +692 -0
- package/Tests/App/Dashboard/KubernetesNetworkThroughputReload.test.tsx +902 -0
- package/Tests/App/Dashboard/KubernetesNetworkZoomBucketEdges.test.tsx +571 -0
- package/Tests/App/Dashboard/KubernetesOverviewZoomBucketEdges.test.tsx +697 -0
- package/Tests/App/Dashboard/KubernetesResourceMetricsTabZoom.test.tsx +633 -0
- package/Tests/App/Dashboard/LogsExplorerTimeRangeZoom.test.tsx +470 -0
- package/Tests/App/Dashboard/LogsInsightsTimeRangeZoom.test.tsx +948 -0
- package/Tests/App/Dashboard/LogsViewerPinnedWindowZoom.test.tsx +486 -0
- package/Tests/App/Dashboard/MetricChartsBucketInspectorDoubleClick.test.tsx +1001 -0
- package/Tests/App/Dashboard/MetricExplorerInvestigationAutoRefresh.test.tsx +514 -0
- package/Tests/App/Dashboard/MetricExplorerSavedViewZoomRoundTrip.test.tsx +581 -0
- package/Tests/App/Dashboard/MetricExplorerTimeRangeZoom.test.tsx +1162 -0
- package/Tests/App/Dashboard/MetricMonitorPreviewZoomLabel.test.ts +72 -0
- package/Tests/App/Dashboard/MetricRowSparklineTimeRangeZoom.test.tsx +204 -0
- package/Tests/App/Dashboard/MetricViewFirstResultLands.test.tsx +408 -0
- package/Tests/App/Dashboard/MetricViewOwnZoomResetPlacement.test.tsx +952 -0
- package/Tests/App/Dashboard/MetricViewTimeRange.test.ts +139 -0
- package/Tests/App/Dashboard/MetricViewTimeRangeZoom.test.tsx +556 -0
- package/Tests/App/Dashboard/MonitorMetricsChartWrappersZoom.test.tsx +552 -0
- package/Tests/App/Dashboard/MonitorMetricsTabsTimeRangeZoom.test.tsx +740 -0
- package/Tests/App/Dashboard/MonitorOverviewChartsTimeRangeZoom.test.tsx +735 -0
- package/Tests/App/Dashboard/MonitorStepPreviewsTimeRangeZoom.test.tsx +835 -0
- package/Tests/App/Dashboard/NetworkDeviceTimeRangeZoom.test.tsx +1115 -0
- package/Tests/App/Dashboard/OnCallPreventionGuards.test.tsx +186 -17
- package/Tests/App/Dashboard/OnCallRulesDeleteGuard.test.tsx +155 -46
- package/Tests/App/Dashboard/PasskeySettings.test.tsx +87 -2
- package/Tests/App/Dashboard/ProjectAISettingsPages.test.tsx +884 -0
- package/Tests/App/Dashboard/ProxmoxNodeRemove.test.tsx +621 -0
- package/Tests/App/Dashboard/ProxmoxOverviewSlowLoads.test.tsx +584 -0
- package/Tests/App/Dashboard/ProxmoxPagesTimeRangeZoom.test.tsx +823 -0
- package/Tests/App/Dashboard/ProxmoxRateChartReload.test.tsx +1253 -0
- package/Tests/App/Dashboard/PublicDashboardBoardWideZoom.test.tsx +605 -0
- package/Tests/App/Dashboard/RealRowsLineChart.tsx +250 -0
- package/Tests/App/Dashboard/RechartsHostsPlotCursor.test.tsx +513 -0
- package/Tests/App/Dashboard/RemediationSuggestionCardDescription.test.tsx +209 -0
- package/Tests/App/Dashboard/RemediationSuggestionCardResource.test.tsx +317 -0
- package/Tests/App/Dashboard/ResourceAiAccessSettingsUtil.test.ts +921 -0
- package/Tests/App/Dashboard/ResourceAiAgentInstall.test.ts +860 -0
- package/Tests/App/Dashboard/ResourceAiAgentPage.test.tsx +1721 -0
- package/Tests/App/Dashboard/ResourceAiAgentStatus.test.ts +1002 -0
- package/Tests/App/Dashboard/ResourceAiInsightsPage.test.tsx +931 -0
- package/Tests/App/Dashboard/ResourceAiNavigation.test.tsx +575 -0
- package/Tests/App/Dashboard/RowActionPlacementOverrides.test.tsx +865 -0
- package/Tests/App/Dashboard/RumOverviewTimeRangeZoom.test.tsx +877 -0
- package/Tests/App/Dashboard/RunbookStepTypeMaps.test.ts +38 -7
- package/Tests/App/Dashboard/RunnerKubernetesAgentForm.test.tsx +20 -4
- package/Tests/App/Dashboard/RunnerSupersededByAiAgentNote.test.tsx +296 -0
- package/Tests/App/Dashboard/SecurityEventConnectionsTable.test.tsx +146 -36
- package/Tests/App/Dashboard/ServiceDatabaseSlowLoads.test.tsx +1166 -0
- package/Tests/App/Dashboard/ServiceMapGraph.test.tsx +1243 -104
- package/Tests/App/Dashboard/ServiceOverviewTimeRangeZoom.test.tsx +792 -0
- package/Tests/App/Dashboard/SloBudgetBurnDownZoom.test.tsx +771 -0
- package/Tests/App/Dashboard/SloBudgetBurnDownZoomAffordances.test.tsx +380 -0
- package/Tests/App/Dashboard/SloEventMetricsBarChartZoom.test.tsx +369 -0
- package/Tests/App/Dashboard/SloHistoryChartsTimeRangeZoom.test.tsx +694 -0
- package/Tests/App/Dashboard/SloHistoryChartsZoomAffordances.test.tsx +497 -0
- package/Tests/App/Dashboard/SloMetricsTimeRangeZoom.test.tsx +541 -0
- package/Tests/App/Dashboard/SlowLoadHarness.ts +123 -0
- package/Tests/App/Dashboard/SnapshotExplorerPrimaryZoom.test.tsx +1194 -0
- package/Tests/App/Dashboard/SnapshotViewerPinnedWindow.test.tsx +620 -0
- package/Tests/App/Dashboard/TelemetrySnapshotPanelTimeRangeZoom.test.tsx +765 -0
- package/Tests/App/Dashboard/TelemetrySnapshotZoom.test.tsx +516 -0
- package/Tests/App/Dashboard/TelemetrySnapshotZoomAcrossTabs.test.tsx +827 -0
- package/Tests/App/Dashboard/TimeRangeZoomPageHarness.tsx +463 -0
- package/Tests/App/Dashboard/TraceChartEditorStatusSplit.test.tsx +543 -0
- package/Tests/App/Dashboard/TraceStatusPresentation.test.tsx +967 -0
- package/Tests/App/Dashboard/TraceTimelineMinimapZoom.test.tsx +315 -0
- package/Tests/App/Dashboard/TracesAnalyticsStatusSplit.test.tsx +778 -0
- package/Tests/App/Dashboard/TracesAnalyticsViewZoom.test.tsx +349 -0
- package/Tests/App/Dashboard/TracesExplorerTimeRangeZoom.test.tsx +551 -0
- package/Tests/App/Dashboard/TracesStatusChartAndFacet.test.tsx +687 -0
- package/Tests/App/Dashboard/TracesViewerStaleResponses.test.tsx +458 -0
- package/Tests/App/Dashboard/UptimeStripsExcludedFromZoom.test.tsx +406 -0
- package/Tests/App/Dashboard/VMwareOverviewSlowLoads.test.tsx +535 -0
- package/Tests/App/Dashboard/VMwarePagesTimeRangeZoom.test.tsx +606 -0
- package/Tests/App/Dashboard/ValueWidgetSparklineStaleHover.test.tsx +1292 -0
- package/Tests/App/Dashboard/ValueWidgetSparklineZoom.test.tsx +765 -0
- package/Tests/App/StatusPage/StatusPageResourceExplorer.test.tsx +98 -0
- package/Tests/Models/DatabaseModels/DatabaseServerModels.test.ts +33 -1
- package/Tests/Models/DatabaseModels/KubernetesAiAgentModel.test.ts +295 -0
- package/Tests/Models/DatabaseModels/ResourceAiAccessColumns.test.ts +738 -0
- package/Tests/Models/DatabaseModels/ResourceAiAgentModel.test.ts +842 -0
- package/Tests/Models/DatabaseModels/TeamComplianceSettingModel.test.ts +347 -0
- package/Tests/Server/API/AIChatRouteAuthorization.test.ts +58 -0
- package/Tests/Server/API/AIGenerationProjectAIToggle.test.ts +1 -1
- package/Tests/Server/API/AIInvestigationAPI.test.ts +123 -45
- package/Tests/Server/API/AutoRemediationApproveClusterRound.test.ts +1329 -0
- package/Tests/Server/API/AutoRemediationApproveKubectlRecheck.test.ts +25 -2
- package/Tests/Server/API/AutoRemediationApproveResourceRound.test.ts +835 -0
- package/Tests/Server/API/KubernetesClusterAiAccessAPI.test.ts +2 -0
- package/Tests/Server/API/KubernetesClusterAiAccessAPIAgent.test.ts +903 -0
- package/Tests/Server/API/MicrosoftTeamsChatsRefreshRoute.test.ts +667 -0
- package/Tests/Server/API/MicrosoftTeamsManifest.test.ts +294 -6
- package/Tests/Server/API/ProxmoxResourceAPIRemoveNode.test.ts +1932 -0
- package/Tests/Server/API/ResourceAiAccessAPI.test.ts +2730 -0
- package/Tests/Server/Infrastructure/GlobalCache.test.ts +195 -0
- package/Tests/Server/Infrastructure/Postgres/AddDatabaseServerTablesMigration.test.ts +60 -0
- package/Tests/Server/Infrastructure/Postgres/AddKubernetesAiAgentAndAiDefaultsMigration.test.ts +623 -0
- package/Tests/Server/Infrastructure/Postgres/AddKubernetesClusterAiAccessMigration.test.ts +87 -10
- package/Tests/Server/Infrastructure/Postgres/AddResourceAiAgentsMigration.test.ts +659 -0
- package/Tests/Server/Infrastructure/Postgres/AddTeamComplianceRuleScopeMigration.test.ts +622 -0
- package/Tests/Server/Infrastructure/SemaphoreMutex.test.ts +31 -0
- package/Tests/Server/Middleware/TelemetryIngestBrowserKey.test.ts +119 -4
- package/Tests/Server/Middleware/TelemetryIngestKubernetesAgentRunnerPinnedKey.test.ts +196 -2
- package/Tests/Server/Middleware/TelemetryIngestKubernetesAgentRunnerRateLimit.test.ts +123 -2
- package/Tests/Server/Services/AIServiceBalanceBlocker.test.ts +282 -0
- package/Tests/Server/Services/AlertMonitorClearWritesNull.test.ts +409 -0
- package/Tests/Server/Services/AlertMonitorEditFeed.test.ts +474 -0
- package/Tests/Server/Services/AlertMonitorEditGuard.test.ts +610 -0
- package/Tests/Server/Services/AutoRemediationClusterRuleEngine.test.ts +2 -0
- package/Tests/Server/Services/AutoRemediationResourceRuleEngine.test.ts +1279 -0
- package/Tests/Server/Services/AutoRemediationRuleCommandRunners.test.ts +2 -1
- package/Tests/Server/Services/DatabaseServerService.test.ts +55 -0
- package/Tests/Server/Services/GroupTelemetryUsageExcludeNames.test.ts +299 -0
- package/Tests/Server/Services/HostServiceFindOrCreateMemo.test.ts +44 -0
- package/Tests/Server/Services/IncidentAffectedMonitorsEdit.test.ts +1360 -0
- package/Tests/Server/Services/IncidentAlertSloLinkSurvivesEdit.test.ts +3 -1
- package/Tests/Server/Services/IncidentSeverityDeletePausesComplianceRules.test.ts +488 -0
- package/Tests/Server/Services/KubernetesAiAgentJobService.test.ts +329 -0
- package/Tests/Server/Services/KubernetesAiAgentServiceHelpers.test.ts +618 -0
- package/Tests/Server/Services/KubernetesAiAgentServiceLifecycle.test.ts +1444 -0
- package/Tests/Server/Services/KubernetesAiAgentServiceRegister.test.ts +1666 -0
- package/Tests/Server/Services/KubernetesClusterAiAccessDeletedRunnerRemedy.test.ts +140 -111
- package/Tests/Server/Services/KubernetesClusterAiAccessGapNextSteps.test.ts +267 -105
- package/Tests/Server/Services/KubernetesClusterAiAccessLegacySuperseded.test.ts +440 -0
- package/Tests/Server/Services/KubernetesClusterAiAccessService.test.ts +567 -411
- package/Tests/Server/Services/KubernetesClusterAiAccessTarget.test.ts +1168 -0
- package/Tests/Server/Services/KubernetesClusterAiSettingsPermission.test.ts +410 -12
- package/Tests/Server/Services/KubernetesClusterServiceAiAccessFeed.test.ts +55 -0
- package/Tests/Server/Services/MonitorProbeServiceIntervalScheduling.test.ts +45 -6
- package/Tests/Server/Services/ProjectServiceNewProjectAiDefaults.test.ts +288 -0
- package/Tests/Server/Services/ProxmoxResourcePostgres.test.ts +5633 -0
- package/Tests/Server/Services/ProxmoxResourceService.test.ts +6458 -5
- package/Tests/Server/Services/RecordingRuleReservedMetricName.test.ts +171 -0
- package/Tests/Server/Services/ResourceAiAccessChangeAuthorization.test.ts +256 -0
- package/Tests/Server/Services/ResourceAiAccessService.test.ts +1373 -0
- package/Tests/Server/Services/ResourceAiAgentJobService.test.ts +375 -0
- package/Tests/Server/Services/ResourceAiAgentServiceHelpers.test.ts +1114 -0
- package/Tests/Server/Services/ResourceAiAgentServiceLifecycle.test.ts +1050 -0
- package/Tests/Server/Services/ResourceAiAgentServiceRegister.test.ts +2251 -0
- package/Tests/Server/Services/ResourceAiSettingsCreate.test.ts +373 -0
- package/Tests/Server/Services/ResourceAiSettingsPermission.test.ts +1042 -0
- package/Tests/Server/Services/ResourceServiceDeleteCleansUpAi.test.ts +319 -0
- package/Tests/Server/Services/RunnerJobEnqueueKubectl.test.ts +153 -15
- package/Tests/Server/Services/RunnerJobEnqueueKubectlAiAgent.test.ts +620 -0
- package/Tests/Server/Services/RunnerJobEnqueueResourceCommand.test.ts +986 -0
- package/Tests/Server/Services/RunnerJobKubectlWriteScope.test.ts +170 -3
- package/Tests/Server/Services/RunnerJobResourceCommandLane.test.ts +211 -0
- package/Tests/Server/Services/RunnerJobResourceCommandTimeoutAndRedaction.test.ts +352 -0
- package/Tests/Server/Services/RunnerJobTimeoutReason.test.ts +72 -0
- package/Tests/Server/Services/RunnerServiceAgentName.test.ts +6 -4
- package/Tests/Server/Services/ScheduledMaintenanceAttachmentEdit.test.ts +2113 -0
- package/Tests/Server/Services/ScheduledMaintenanceMonitorRelease.test.ts +972 -0
- package/Tests/Server/Services/TeamComplianceSettingPostgres.test.ts +2237 -0
- package/Tests/Server/Services/TeamComplianceSettingService.test.ts +3988 -138
- package/Tests/Server/Services/TelemetryUsageBillingSloExclusion.test.ts +218 -0
- package/Tests/Server/TestingUtils/Services/FakeRunnerJobCount.ts +145 -0
- package/Tests/Server/Utils/AI/ClusterAccessContext.test.ts +107 -1
- package/Tests/Server/Utils/AI/IncidentPostmortemRunner.test.ts +351 -0
- package/Tests/Server/Utils/AI/InvestigationClusterAccessWiring.test.ts +2 -0
- package/Tests/Server/Utils/AI/InvestigationEligibility.test.ts +310 -0
- package/Tests/Server/Utils/AI/InvestigationInfrastructureAccessWiring.test.ts +453 -0
- package/Tests/Server/Utils/AI/InvestigationInfrastructureReport.test.ts +721 -0
- package/Tests/Server/Utils/AI/KubectlInvestigationToolkit.test.ts +70 -0
- package/Tests/Server/Utils/AI/KubectlJobRunnerFinishedJob.test.ts +58 -0
- package/Tests/Server/Utils/AI/RemediationCommandTools.test.ts +94 -1
- package/Tests/Server/Utils/AI/RemediationCommandToolsKubectl.test.ts +2 -0
- package/Tests/Server/Utils/AI/RemediationCommandToolsKubectlOutcome.test.ts +2 -0
- package/Tests/Server/Utils/AI/RemediationCommandToolsLiveCluster.test.ts +2 -0
- package/Tests/Server/Utils/AI/RemediationCommandToolsResource.test.ts +1530 -0
- package/Tests/Server/Utils/AI/RemediationCommandToolsRunnerScope.test.ts +125 -1
- package/Tests/Server/Utils/AI/RemediationExecutionRunner.test.ts +252 -3
- package/Tests/Server/Utils/AI/RemediationExecutionRunnerClusterMode.test.ts +2 -0
- package/Tests/Server/Utils/AI/RemediationExecutionRunnerProjectGates.test.ts +240 -0
- package/Tests/Server/Utils/AI/RemediationExecutionRunnerResourceMode.test.ts +1249 -0
- package/Tests/Server/Utils/AI/RemediationKubectlCopyParity.test.ts +2 -0
- package/Tests/Server/Utils/AI/RemediationPlanRunner.test.ts +117 -0
- package/Tests/Server/Utils/AI/RemediationResourceCopyParity.test.ts +463 -0
- package/Tests/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.test.ts +722 -0
- package/Tests/Server/Utils/AI/ResourceAccess/ResourceAccessContext.test.ts +266 -0
- package/Tests/Server/Utils/AI/ResourceAccess/ResourceAiAccessSettings.test.ts +1220 -0
- package/Tests/Server/Utils/AI/ResourceAccess/ResourceAiDeleteCleanup.test.ts +569 -0
- package/Tests/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.test.ts +830 -0
- package/Tests/Server/Utils/AutoRemediation/CommandPlanExecutor.test.ts +2 -0
- package/Tests/Server/Utils/AutoRemediation/CommandPlanExecutorResource.test.ts +717 -0
- package/Tests/Server/Utils/AutoRemediation/CommandPlanExecutorUnknownRun.test.ts +2 -0
- package/Tests/Server/Utils/AutoRemediation/CommandPlanVerification.test.ts +2 -0
- package/Tests/Server/Utils/AutoRemediation/RemediationVerifierResourceFollowUp.test.ts +338 -0
- package/Tests/Server/Utils/Monitor/Criteria/SessionReplayBudgetTemplateCriteria.test.ts +422 -0
- package/Tests/Server/Utils/SessionReplay/SessionReplayBudgetMetrics.test.ts +1647 -0
- package/Tests/Server/Utils/SessionReplay/SessionReplayUsage.test.ts +143 -1
- package/Tests/Server/Utils/Telemetry/HostAssetAttributesFromOtlp.test.ts +68 -0
- package/Tests/Server/Utils/Telemetry/InventoryMirrorPostgres.test.ts +370 -0
- package/Tests/Server/Utils/Telemetry/NetworkDeviceInventoryAttributes.test.ts +522 -0
- package/Tests/Server/Utils/Telemetry/ProxmoxCephSnapshotScan.test.ts +155 -0
- package/Tests/Server/Utils/Telemetry/ProxmoxNativeNodeLiveness.test.ts +8631 -0
- package/Tests/Server/Utils/Telemetry/ProxmoxNativePush.test.ts +2852 -0
- package/Tests/Server/Utils/Telemetry/TelemetryEntity.test.ts +367 -1
- package/Tests/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.test.ts +75 -3
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsAccountNotLinked.test.ts +1093 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsActivityDeduplicator.test.ts +1049 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCardChoices.test.ts +1676 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateCards.test.ts +2884 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateCommands.test.ts +2490 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateSubmit.test.ts +2293 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateSubmitServerTimezone.test.ts +386 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsMessageSize.test.ts +1477 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsReplies.test.ts +1967 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsStripHtmlTags.test.ts +92 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsSubmittedFormRemoval.test.ts +1819 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsTimezone.test.ts +1033 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsTimezoneServerZone.test.ts +610 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsBotMessageHandling.test.ts +2610 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsChats.test.ts +25 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsCreateCommandsEndToEnd.test.ts +4672 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsGroupChatNames.test.ts +3119 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsGroupChatNamesPostgres.test.ts +1721 -0
- package/Tests/Server/Utils/Workspace/WorkspaceCreateProjectReferences.test.ts +190 -65
- package/Tests/Types/AutoRemediation/AiRemediationCommandPlan.test.ts +10 -4
- package/Tests/Types/AutoRemediation/AiRemediationCommandPlanResourceCommand.test.ts +305 -0
- package/Tests/Types/Kubernetes/KubernetesAgentChartAiAccess.test.ts +581 -113
- package/Tests/Types/Kubernetes/KubernetesAiAgentAccessContract.test.ts +510 -0
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCatalog.test.ts +277 -13
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationUtil.test.ts +113 -0
- package/Tests/Types/Monitor/RumAlertTemplates.test.ts +773 -2
- package/Tests/Types/ResourceAiAgent/AiResourceType.test.ts +419 -0
- package/Tests/Types/ResourceAiAgent/ResourceAiAccess.test.ts +517 -0
- package/Tests/Types/Runbook/RunbookStepType.test.ts +147 -8
- package/Tests/Types/Team/ComplianceRule.test.ts +1029 -0
- package/Tests/Types/Team/TeamComplianceStatus.test.ts +176 -0
- package/Tests/UI/Components/ActionButton/RowActions.test.tsx +641 -0
- package/Tests/UI/Components/ActionButton/RowActionsAccessibility.test.tsx +414 -0
- package/Tests/UI/Components/ActionButton/SplitActionButtons.test.ts +565 -0
- package/Tests/UI/Components/Charts/BarChartDragToSelect.test.tsx +386 -0
- package/Tests/UI/Components/Charts/ChartDoubleClickResetWithoutDblclick.test.tsx +1025 -0
- package/Tests/UI/Components/Charts/ChartGroupPageZoomHint.test.tsx +196 -0
- package/Tests/UI/Components/Charts/ChartPlaceholdersTakeDoubleClick.test.tsx +1861 -0
- package/Tests/UI/Components/Charts/ChartPlotClicksWhileResetArmed.test.tsx +382 -0
- package/Tests/UI/Components/Charts/ChartRangeSelection.test.tsx +704 -0
- package/Tests/UI/Components/Charts/ChartRangeSelectionDoubleClickReset.test.tsx +1481 -0
- package/Tests/UI/Components/Charts/ChartRangeSelectionRealRecharts.test.tsx +918 -0
- package/Tests/UI/Components/Charts/ChartRowBucketStart.test.ts +350 -0
- package/Tests/UI/Components/Charts/DoubleClickReset.test.tsx +996 -0
- package/Tests/UI/Components/Charts/HistogramDoubleClickResetRealRecharts.test.tsx +965 -0
- package/Tests/UI/Components/Charts/HistogramDriftThenRefetch.test.tsx +277 -0
- package/Tests/UI/Components/Charts/HistogramRangeSelectionDataChange.test.tsx +1757 -0
- package/Tests/UI/Components/Charts/HistogramRangeSelectionRealRecharts.test.tsx +560 -0
- package/Tests/UI/Components/Charts/TimeRangeZoom/ChartPageTimeRangeZoom.test.tsx +513 -0
- package/Tests/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomContext.test.tsx +845 -0
- package/Tests/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomHint.test.tsx +119 -0
- package/Tests/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomHintTailwind.test.tsx +274 -0
- package/Tests/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomUtil.test.ts +433 -0
- package/Tests/UI/Components/Charts/TimeRangeZoom/UseTimeRangeZoom.test.tsx +863 -0
- package/Tests/UI/Components/Charts/TimeRangeZoom/ZoomDocsPromises.test.tsx +1147 -0
- package/Tests/UI/Components/DisabledButtonTooltip.test.tsx +14 -3
- package/Tests/UI/Components/EntityDropdownEscape.test.tsx +454 -0
- package/Tests/UI/Components/EntityDropdownFocusLeave.test.tsx +420 -0
- package/Tests/UI/Components/Forms/FormFieldDropdownDisabled.test.tsx +233 -0
- package/Tests/UI/Components/Input.test.tsx +80 -1
- package/Tests/UI/Components/LogsAnalyticsViewZoom.test.tsx +947 -0
- package/Tests/UI/Components/LogsHistogramDragTooltip.test.tsx +17 -5
- package/Tests/UI/Components/LogsViewerAnalyticsZoom.test.tsx +501 -0
- package/Tests/UI/Components/LogsViewerHistogramZoom.test.tsx +1 -1
- package/Tests/UI/Components/ModelTable/BaseModelTableBulkDelete.test.tsx +6 -4
- package/Tests/UI/Components/ModelTable/BaseModelTablePermissionGating.test.tsx +60 -8
- package/Tests/UI/Components/ModelTable/BaseModelTableRowActions.test.tsx +476 -0
- package/Tests/UI/Components/ModelTable/ModelTableWrapContent.test.tsx +7 -5
- package/Tests/UI/Components/MoreMenuPortal.test.tsx +623 -0
- package/Tests/UI/Components/StatusPage/ResourceGridActions.test.tsx +538 -0
- package/Tests/UI/Components/StatusPage/ResourceGridSelection.test.tsx +14 -4
- package/Tests/UI/Components/TableCellWrapping.test.tsx +3 -3
- package/Tests/UI/Components/TableRowActions.test.tsx +472 -0
- package/Tests/UI/Components/TelemetryHistogramDragTooltip.test.tsx +1 -1
- package/Tests/UI/Components/TelemetryViewer/TelemetryViewerHistogramClickZoom.test.tsx +1 -1
- package/Tests/UI/Components/TelemetryViewer/TelemetryViewerZoomScope.test.tsx +470 -0
- package/Tests/UI/Components/TelemetryViewer/UseViewerTimeRangeZoom.test.tsx +571 -0
- package/Tests/UI/Components/TelemetryViewer/ViewerDoubleClickResetUnderDataChange.test.tsx +928 -0
- package/Tests/UI/Components/TelemetryViewer/ViewerFollowsEnclosingZoom.test.tsx +1569 -0
- package/Tests/UI/Components/Toggle.test.tsx +66 -0
- package/Tests/UI/MicrosoftTeams/MicrosoftTeamsChatsCardRefreshNames.test.tsx +1023 -0
- package/Tests/UI/Rum/ChunkLoader.test.ts +201 -0
- package/Tests/UI/Rum/FidelityNotices.test.ts +54 -0
- package/Tests/UI/Rum/RecordingHealthDashboard.test.tsx +769 -1
- package/Tests/UI/Rum/ReplayCorrelationPanel.test.tsx +72 -0
- package/Tests/UI/Rum/ReplayFrameCapture.test.ts +1009 -9
- package/Tests/UI/Rum/ReplayRecordedAssets.test.ts +1069 -0
- package/Tests/UI/Rum/ReplayStage.test.tsx +913 -2
- package/Tests/UI/Rum/SessionReplayTable.test.tsx +443 -8
- package/Tests/UI/Rum/SessionReplayUsersTable.test.tsx +439 -9
- package/Tests/UI/Rum/UserFlowTablesRowActions.test.tsx +501 -0
- package/Tests/Utils/AiRemediation/KubectlPolicyChartRbacParity.test.ts +47 -19
- package/Tests/Utils/AiRemediation/KubectlWriteScopeCallerParity.test.ts +2 -0
- package/Tests/Utils/AiRemediation/KubernetesAiAgentPolicyCopyParity.test.ts +396 -0
- package/Tests/Utils/AiRemediation/Resource/CephCommandPolicy.test.ts +1653 -0
- package/Tests/Utils/AiRemediation/Resource/CephOutputRedaction.test.ts +204 -0
- package/Tests/Utils/AiRemediation/Resource/DatabaseCommandPolicy.test.ts +1077 -0
- package/Tests/Utils/AiRemediation/Resource/DatabaseDiagnosticCatalog.test.ts +558 -0
- package/Tests/Utils/AiRemediation/Resource/DatabaseQueryRedactor.test.ts +834 -0
- package/Tests/Utils/AiRemediation/Resource/DockerCliGrammar.test.ts +747 -0
- package/Tests/Utils/AiRemediation/Resource/DockerEngineCommandPolicy.test.ts +1259 -0
- package/Tests/Utils/AiRemediation/Resource/DockerOutputRedaction.test.ts +386 -0
- package/Tests/Utils/AiRemediation/Resource/DockerSwarmCommandPolicy.test.ts +782 -0
- package/Tests/Utils/AiRemediation/Resource/GovcCommandPolicy.test.ts +2259 -0
- package/Tests/Utils/AiRemediation/Resource/HostCommandPolicy.test.ts +2019 -0
- package/Tests/Utils/AiRemediation/Resource/ProxmoxCommandPolicy.test.ts +2497 -0
- package/Tests/Utils/AiRemediation/Resource/ResourceCommandPolicy.test.ts +1305 -0
- package/Tests/Utils/AiRemediation/Resource/ResourceCommandPolicyCore.test.ts +585 -0
- package/Tests/Utils/AiRemediation/Resource/ResourceOutputRedactor.test.ts +334 -0
- package/Tests/Utils/AiRemediation/Resource/ResourceOutputRedactorCopyParity.test.ts +98 -0
- package/Tests/Utils/AiRemediation/Resource/ResourcePolicyImportClosure.test.ts +391 -0
- package/Tests/Utils/AiRemediation/ResourceAiAgentPolicyCopyParity.test.ts +497 -0
- package/Tests/Utils/Dashboard/DashboardTimeRangeZoom.test.ts +104 -1
- package/Tests/Utils/SessionReplay/SessionReplayBudgetMetricType.test.ts +383 -0
- package/Types/AI/AIRunType.ts +9 -4
- package/Types/AI/InvestigationNotStartedReason.ts +6 -0
- package/Types/AI/ResourceAiAccessApi.ts +140 -0
- package/Types/AI/ResourceAiAccessPermissions.ts +126 -0
- package/Types/AutoRemediation/AiRemediationCommandPlan.ts +197 -18
- package/Types/AutoRemediation/AiRemediationCommandPolicyVerdict.ts +28 -0
- package/Types/Dashboard/DashboardComponents/DashboardTraceChartComponent.ts +4 -2
- package/Types/Kubernetes/KubernetesClusterAiAccess.ts +263 -32
- package/Types/Kubernetes/KubernetesClusterAiAccessPermissions.ts +20 -16
- package/Types/Kubernetes/KubernetesClusterAiInsights.ts +81 -0
- package/Types/Monitor/ProxmoxAlertTemplates.ts +4 -4
- package/Types/Monitor/Recommendation/MonitorRecommendationCatalog.ts +55 -22
- package/Types/Monitor/Recommendation/MonitorRecommendationTypes.ts +35 -3
- package/Types/Monitor/RumAlertTemplates.ts +351 -4
- package/Types/ResourceAiAgent/AiResourceType.ts +310 -0
- package/Types/ResourceAiAgent/ResourceAiAccess.ts +574 -0
- package/Types/Rum/SessionReplayBudgetMetricType.ts +47 -0
- package/Types/Runbook/RunbookStepType.ts +29 -0
- package/Types/Team/ComplianceNotificationChannel.ts +22 -0
- package/Types/Team/ComplianceRule.ts +434 -0
- package/Types/Team/ComplianceRuleType.ts +21 -0
- package/Types/Team/TeamComplianceStatus.ts +81 -0
- package/Types/Telemetry/TelemetryIngestSurface.ts +40 -0
- package/UI/Components/ActionButton/ActionButtonSchema.ts +21 -0
- package/UI/Components/ActionButton/RowActions.tsx +238 -0
- package/UI/Components/ActionButton/SplitActionButtons.ts +173 -0
- package/UI/Components/Charts/Area/AreaChart.tsx +32 -2
- package/UI/Components/Charts/Bar/BarChart.tsx +40 -3
- package/UI/Components/Charts/ChartGroup/ChartGroup.tsx +37 -11
- package/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.tsx +80 -243
- package/UI/Components/Charts/ChartLibrary/BarChart/BarChart.tsx +122 -31
- package/UI/Components/Charts/ChartLibrary/LineChart/LineChart.tsx +95 -244
- package/UI/Components/Charts/ChartLibrary/Utils/DoubleClick.ts +214 -0
- package/UI/Components/Charts/ChartLibrary/Utils/UseChartBucketsChange.ts +32 -0
- package/UI/Components/Charts/ChartLibrary/Utils/UseChartRangeSelection.ts +599 -0
- package/UI/Components/Charts/Line/LineChart.tsx +32 -2
- package/UI/Components/Charts/TimeRangeZoom/ResetTimeRangeZoomButton.tsx +70 -0
- package/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomContext.tsx +226 -0
- package/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomHint.tsx +73 -0
- package/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomUtil.ts +163 -0
- package/UI/Components/Charts/TimeRangeZoom/UseTimeRangeZoom.ts +215 -0
- package/UI/Components/Charts/Utils/DataPoint.ts +20 -8
- package/UI/Components/Charts/Utils/XAxis.ts +75 -0
- package/UI/Components/Charts/Utils/useHistogramRangeSelection.ts +493 -59
- package/UI/Components/EntityDropdown/EntityDropdown.tsx +107 -11
- package/UI/Components/Forms/Fields/FormField.tsx +10 -0
- package/UI/Components/Input/Input.tsx +90 -57
- package/UI/Components/List/ListRow.tsx +8 -74
- package/UI/Components/LogsViewer/LogsViewer.tsx +40 -11
- package/UI/Components/LogsViewer/components/LogTimeRangePicker.tsx +22 -6
- package/UI/Components/LogsViewer/components/LogsAnalyticsView.tsx +209 -6
- package/UI/Components/LogsViewer/components/LogsHistogram.tsx +127 -84
- package/UI/Components/LogsViewer/components/LogsViewerToolbar.tsx +3 -0
- package/UI/Components/ModelTable/BaseModelTable.tsx +12 -1
- package/UI/Components/MoreMenu/MoreMenu.tsx +365 -30
- package/UI/Components/MoreMenu/MoreMenuItem.tsx +70 -17
- package/UI/Components/OrderedStatesList/Item.tsx +7 -72
- package/UI/Components/StatusPage/ResourceGrid.tsx +126 -77
- package/UI/Components/Table/TableBody.tsx +8 -2
- package/UI/Components/Table/TableRow.tsx +20 -140
- package/UI/Components/TelemetryViewer/TelemetryViewer.tsx +41 -10
- package/UI/Components/TelemetryViewer/components/TelemetryHistogram.tsx +47 -9
- package/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.tsx +25 -6
- package/UI/Components/TelemetryViewer/types.ts +2 -0
- package/UI/Components/TelemetryViewer/useViewerTimeRangeZoom.ts +448 -0
- package/UI/Components/Toggle/Toggle.tsx +26 -0
- package/UI/Components/Tooltip/Tooltip.tsx +8 -1
- package/UI/Styles/Theme.css +14 -2
- package/Utils/AI/InvestigationReport.ts +121 -15
- package/Utils/AiRemediation/CommandPolicy.ts +1 -1
- package/Utils/AiRemediation/KubectlPolicy.ts +1 -1
- package/Utils/AiRemediation/Resource/CephCommandPolicy.ts +1936 -0
- package/Utils/AiRemediation/Resource/DatabaseCommandPolicy.ts +166 -0
- package/Utils/AiRemediation/Resource/DatabaseDiagnosticCatalog.ts +1532 -0
- package/Utils/AiRemediation/Resource/DatabaseQueryRedactor.ts +1394 -0
- package/Utils/AiRemediation/Resource/DockerCliGrammar.ts +1839 -0
- package/Utils/AiRemediation/Resource/DockerEngineCommandPolicy.ts +490 -0
- package/Utils/AiRemediation/Resource/DockerSwarmCommandPolicy.ts +687 -0
- package/Utils/AiRemediation/Resource/GovcCommandPolicy.ts +2096 -0
- package/Utils/AiRemediation/Resource/HostCommandPolicy.ts +2982 -0
- package/Utils/AiRemediation/Resource/ProxmoxCommandPolicy.ts +1679 -0
- package/Utils/AiRemediation/Resource/ResourceCommandPolicy.ts +851 -0
- package/Utils/AiRemediation/Resource/ResourceCommandPolicyCore.ts +593 -0
- package/Utils/AiRemediation/Resource/ResourceOutputRedactor.ts +2812 -0
- package/Utils/Dashboard/DashboardTimeRangeZoom.ts +46 -2
- package/Utils/SessionReplay/SessionReplayBudgetMetricType.ts +184 -0
- package/build/dist/Models/DatabaseModels/AutoRemediationSuggestion.js +62 -0
- package/build/dist/Models/DatabaseModels/AutoRemediationSuggestion.js.map +1 -1
- package/build/dist/Models/DatabaseModels/CephCluster.js +219 -0
- package/build/dist/Models/DatabaseModels/CephCluster.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DatabaseServer.js +219 -0
- package/build/dist/Models/DatabaseModels/DatabaseServer.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DockerHost.js +219 -0
- package/build/dist/Models/DatabaseModels/DockerHost.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DockerSwarmCluster.js +219 -0
- package/build/dist/Models/DatabaseModels/DockerSwarmCluster.js.map +1 -1
- package/build/dist/Models/DatabaseModels/GlobalConfig.js +1 -1
- package/build/dist/Models/DatabaseModels/GlobalConfig.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Host.js +219 -0
- package/build/dist/Models/DatabaseModels/Host.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +4 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/KubernetesAiAgent.js +385 -0
- package/build/dist/Models/DatabaseModels/KubernetesAiAgent.js.map +1 -0
- package/build/dist/Models/DatabaseModels/KubernetesCluster.js +3 -3
- package/build/dist/Models/DatabaseModels/KubernetesCluster.js.map +1 -1
- package/build/dist/Models/DatabaseModels/PodmanHost.js +219 -0
- package/build/dist/Models/DatabaseModels/PodmanHost.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Project.js +56 -5
- package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ProxmoxCluster.js +219 -0
- package/build/dist/Models/DatabaseModels/ProxmoxCluster.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ProxmoxResource.js +51 -1
- package/build/dist/Models/DatabaseModels/ProxmoxResource.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ResourceAiAgent.js +439 -0
- package/build/dist/Models/DatabaseModels/ResourceAiAgent.js.map +1 -0
- package/build/dist/Models/DatabaseModels/RunnerJob.js +219 -0
- package/build/dist/Models/DatabaseModels/RunnerJob.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TeamComplianceSetting.js +134 -3
- package/build/dist/Models/DatabaseModels/TeamComplianceSetting.js.map +1 -1
- package/build/dist/Models/DatabaseModels/VMwareVCenter.js +219 -0
- package/build/dist/Models/DatabaseModels/VMwareVCenter.js.map +1 -1
- package/build/dist/Models/DatabaseModels/WorkspaceProjectAuthToken.js.map +1 -1
- package/build/dist/Server/API/AIChatAPI.js +6 -1
- package/build/dist/Server/API/AIChatAPI.js.map +1 -1
- package/build/dist/Server/API/AIInvestigationAPI.js +17 -10
- package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
- package/build/dist/Server/API/AutoRemediationAPI.js +374 -24
- package/build/dist/Server/API/AutoRemediationAPI.js.map +1 -1
- package/build/dist/Server/API/KubernetesClusterAiAccessAPI.js +436 -22
- package/build/dist/Server/API/KubernetesClusterAiAccessAPI.js.map +1 -1
- package/build/dist/Server/API/MicrosoftTeamsAPI.js +69 -13
- package/build/dist/Server/API/MicrosoftTeamsAPI.js.map +1 -1
- package/build/dist/Server/API/ProxmoxResourceAPI.js +187 -14
- package/build/dist/Server/API/ProxmoxResourceAPI.js.map +1 -1
- package/build/dist/Server/API/ResourceAiAccessAPI.js +1119 -0
- package/build/dist/Server/API/ResourceAiAccessAPI.js.map +1 -0
- package/build/dist/Server/Infrastructure/GlobalCache.js +27 -0
- package/build/dist/Server/Infrastructure/GlobalCache.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796000000000-AddTeamComplianceRuleScope.js +50 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796000000000-AddTeamComplianceRuleScope.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796100000000-AddKubernetesAiAgentAndAiDefaults.js +84 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796100000000-AddKubernetesAiAgentAndAiDefaults.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796200000000-AddProxmoxResourceNativePushColumns.js +31 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796200000000-AddProxmoxResourceNativePushColumns.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796300000000-AddResourceAiAgents.js +168 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796300000000-AddResourceAiAgents.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +8 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Infrastructure/Semaphore.js +6 -0
- package/build/dist/Server/Infrastructure/Semaphore.js.map +1 -1
- package/build/dist/Server/Middleware/TelemetryIngest.js +41 -19
- package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
- package/build/dist/Server/Services/AIService.js +59 -1
- package/build/dist/Server/Services/AIService.js.map +1 -1
- package/build/dist/Server/Services/AlertService.js +248 -13
- package/build/dist/Server/Services/AlertService.js.map +1 -1
- package/build/dist/Server/Services/AlertSeverityService.js +51 -15
- package/build/dist/Server/Services/AlertSeverityService.js.map +1 -1
- package/build/dist/Server/Services/AnalyticsDatabaseService.js +26 -1
- package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
- package/build/dist/Server/Services/AutoRemediationRuleEngineService.js +601 -3
- package/build/dist/Server/Services/AutoRemediationRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AutoRemediationRuleService.js +1 -1
- package/build/dist/Server/Services/AutoRemediationRuleService.js.map +1 -1
- package/build/dist/Server/Services/CephClusterService.js +104 -0
- package/build/dist/Server/Services/CephClusterService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseServerService.js +99 -0
- package/build/dist/Server/Services/DatabaseServerService.js.map +1 -1
- package/build/dist/Server/Services/DockerHostService.js +104 -0
- package/build/dist/Server/Services/DockerHostService.js.map +1 -1
- package/build/dist/Server/Services/DockerSwarmClusterService.js +104 -0
- package/build/dist/Server/Services/DockerSwarmClusterService.js.map +1 -1
- package/build/dist/Server/Services/HostService.js +114 -2
- package/build/dist/Server/Services/HostService.js.map +1 -1
- package/build/dist/Server/Services/IncidentService.js +199 -72
- package/build/dist/Server/Services/IncidentService.js.map +1 -1
- package/build/dist/Server/Services/IncidentSeverityService.js +51 -15
- package/build/dist/Server/Services/IncidentSeverityService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesAiAgentJobService.js +158 -0
- package/build/dist/Server/Services/KubernetesAiAgentJobService.js.map +1 -0
- package/build/dist/Server/Services/KubernetesAiAgentService.js +1145 -0
- package/build/dist/Server/Services/KubernetesAiAgentService.js.map +1 -0
- package/build/dist/Server/Services/KubernetesClusterAiAccessService.js +842 -371
- package/build/dist/Server/Services/KubernetesClusterAiAccessService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterService.js +86 -17
- package/build/dist/Server/Services/KubernetesClusterService.js.map +1 -1
- package/build/dist/Server/Services/MetricRecordingRuleService.js +46 -0
- package/build/dist/Server/Services/MetricRecordingRuleService.js.map +1 -1
- package/build/dist/Server/Services/PodmanHostService.js +104 -0
- package/build/dist/Server/Services/PodmanHostService.js.map +1 -1
- package/build/dist/Server/Services/ProjectService.js +22 -0
- package/build/dist/Server/Services/ProjectService.js.map +1 -1
- package/build/dist/Server/Services/ProxmoxClusterService.js +104 -0
- package/build/dist/Server/Services/ProxmoxClusterService.js.map +1 -1
- package/build/dist/Server/Services/ProxmoxResourceService.js +258 -3
- package/build/dist/Server/Services/ProxmoxResourceService.js.map +1 -1
- package/build/dist/Server/Services/ResourceAiAccessService.js +1028 -0
- package/build/dist/Server/Services/ResourceAiAccessService.js.map +1 -0
- package/build/dist/Server/Services/ResourceAiAgentJobService.js +173 -0
- package/build/dist/Server/Services/ResourceAiAgentJobService.js.map +1 -0
- package/build/dist/Server/Services/ResourceAiAgentService.js +1687 -0
- package/build/dist/Server/Services/ResourceAiAgentService.js.map +1 -0
- package/build/dist/Server/Services/RunnerJobService.js +522 -97
- package/build/dist/Server/Services/RunnerJobService.js.map +1 -1
- package/build/dist/Server/Services/RunnerService.js +1 -1
- package/build/dist/Server/Services/RunnerService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceService.js +535 -3
- package/build/dist/Server/Services/ScheduledMaintenanceService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceStateTimelineService.js +316 -46
- package/build/dist/Server/Services/ScheduledMaintenanceStateTimelineService.js.map +1 -1
- package/build/dist/Server/Services/TeamComplianceSettingService.js +833 -7
- package/build/dist/Server/Services/TeamComplianceSettingService.js.map +1 -1
- package/build/dist/Server/Services/TelemetryUsageBillingService.js +26 -0
- package/build/dist/Server/Services/TelemetryUsageBillingService.js.map +1 -1
- package/build/dist/Server/Services/TraceRecordingRuleService.js +37 -0
- package/build/dist/Server/Services/TraceRecordingRuleService.js.map +1 -1
- package/build/dist/Server/Services/VMwareVCenterService.js +104 -0
- package/build/dist/Server/Services/VMwareVCenterService.js.map +1 -1
- package/build/dist/Server/Utils/AI/ClusterAccess/ClusterAccessContext.js +52 -9
- package/build/dist/Server/Utils/AI/ClusterAccess/ClusterAccessContext.js.map +1 -1
- package/build/dist/Server/Utils/AI/ClusterAccess/KubectlInvestigationToolkit.js +13 -9
- package/build/dist/Server/Utils/AI/ClusterAccess/KubectlInvestigationToolkit.js.map +1 -1
- package/build/dist/Server/Utils/AI/ClusterAccess/KubectlJobRunner.js +7 -3
- package/build/dist/Server/Utils/AI/ClusterAccess/KubectlJobRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/Remediation/RemediationCommandTools.js +1056 -43
- package/build/dist/Server/Utils/AI/Remediation/RemediationCommandTools.js.map +1 -1
- package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js +683 -42
- package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/Remediation/RemediationPlanRunner.js +21 -1
- package/build/dist/Server/Utils/AI/Remediation/RemediationPlanRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.js +330 -0
- package/build/dist/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.js.map +1 -0
- package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAccessContext.js +160 -0
- package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAccessContext.js.map +1 -0
- package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAccessToolNames.js +33 -0
- package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAccessToolNames.js.map +1 -0
- package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAiAccessSettings.js +640 -0
- package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAiAccessSettings.js.map +1 -0
- package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAiDeleteCleanup.js +226 -0
- package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAiDeleteCleanup.js.map +1 -0
- package/build/dist/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.js +600 -0
- package/build/dist/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js +89 -9
- package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js +55 -4
- package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js +55 -4
- package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/IncidentPostmortemRunner.js +30 -3
- package/build/dist/Server/Utils/AI/SRE/IncidentPostmortemRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/InvestigationEligibility.js +13 -2
- package/build/dist/Server/Utils/AI/SRE/InvestigationEligibility.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/InvestigationGrader.js +1 -1
- package/build/dist/Server/Utils/AutoRemediation/CommandPlanExecutor.js +294 -15
- package/build/dist/Server/Utils/AutoRemediation/CommandPlanExecutor.js.map +1 -1
- package/build/dist/Server/Utils/AutoRemediation/RemediationVerifier.js +29 -1
- package/build/dist/Server/Utils/AutoRemediation/RemediationVerifier.js.map +1 -1
- package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js +9 -1
- package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js.map +1 -1
- package/build/dist/Server/Utils/SessionReplay/SessionReplayBudgetMetrics.js +627 -0
- package/build/dist/Server/Utils/SessionReplay/SessionReplayBudgetMetrics.js.map +1 -0
- package/build/dist/Server/Utils/SessionReplay/SessionReplayUsage.js +60 -5
- package/build/dist/Server/Utils/SessionReplay/SessionReplayUsage.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/InventoryEntityRegistry.js +111 -6
- package/build/dist/Server/Utils/Telemetry/InventoryEntityRegistry.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/ProxmoxCephSnapshotScan.js +40 -4
- package/build/dist/Server/Utils/Telemetry/ProxmoxCephSnapshotScan.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/ProxmoxNativeNodeLiveness.js +296 -0
- package/build/dist/Server/Utils/Telemetry/ProxmoxNativeNodeLiveness.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/ProxmoxNativePush.js +699 -0
- package/build/dist/Server/Utils/Telemetry/ProxmoxNativePush.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js +77 -19
- package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Alert.js +19 -15
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Alert.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/AlertEpisode.js +19 -15
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/AlertEpisode.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Auth.js +17 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Auth.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.js +183 -209
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.js +19 -15
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/ScheduledMaintenance.js +233 -167
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/ScheduledMaintenance.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +768 -152
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsActivityDeduplicator.js +129 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsActivityDeduplicator.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCardChoices.js +266 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCardChoices.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateCommands.js +258 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateCommands.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsMessageSize.js +104 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsMessageSize.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsReplies.js +183 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsReplies.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsTimezone.js +123 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsTimezone.js.map +1 -0
- package/build/dist/Types/AI/AIRunType.js +9 -4
- package/build/dist/Types/AI/AIRunType.js.map +1 -1
- package/build/dist/Types/AI/ResourceAiAccessApi.js +30 -0
- package/build/dist/Types/AI/ResourceAiAccessApi.js.map +1 -0
- package/build/dist/Types/AI/ResourceAiAccessPermissions.js +98 -0
- package/build/dist/Types/AI/ResourceAiAccessPermissions.js.map +1 -0
- package/build/dist/Types/AutoRemediation/AiRemediationCommandPlan.js +126 -45
- package/build/dist/Types/AutoRemediation/AiRemediationCommandPlan.js.map +1 -1
- package/build/dist/Types/AutoRemediation/AiRemediationCommandPolicyVerdict.js +28 -0
- package/build/dist/Types/AutoRemediation/AiRemediationCommandPolicyVerdict.js.map +1 -0
- package/build/dist/Types/Kubernetes/KubernetesClusterAiAccess.js +72 -16
- package/build/dist/Types/Kubernetes/KubernetesClusterAiAccess.js.map +1 -1
- package/build/dist/Types/Kubernetes/KubernetesClusterAiAccessPermissions.js +20 -16
- package/build/dist/Types/Kubernetes/KubernetesClusterAiAccessPermissions.js.map +1 -1
- package/build/dist/Types/Kubernetes/KubernetesClusterAiInsights.js +17 -0
- package/build/dist/Types/Kubernetes/KubernetesClusterAiInsights.js.map +1 -0
- package/build/dist/Types/Monitor/ProxmoxAlertTemplates.js +4 -4
- package/build/dist/Types/Monitor/ProxmoxAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js +47 -21
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js +5 -0
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js.map +1 -1
- package/build/dist/Types/Monitor/RumAlertTemplates.js +199 -3
- package/build/dist/Types/Monitor/RumAlertTemplates.js.map +1 -1
- package/build/dist/Types/ResourceAiAgent/AiResourceType.js +242 -0
- package/build/dist/Types/ResourceAiAgent/AiResourceType.js.map +1 -0
- package/build/dist/Types/ResourceAiAgent/ResourceAiAccess.js +275 -0
- package/build/dist/Types/ResourceAiAgent/ResourceAiAccess.js.map +1 -0
- package/build/dist/Types/Rum/SessionReplayBudgetMetricType.js +45 -0
- package/build/dist/Types/Rum/SessionReplayBudgetMetricType.js.map +1 -0
- package/build/dist/Types/Runbook/RunbookStepType.js +27 -0
- package/build/dist/Types/Runbook/RunbookStepType.js.map +1 -1
- package/build/dist/Types/Team/ComplianceNotificationChannel.js +23 -0
- package/build/dist/Types/Team/ComplianceNotificationChannel.js.map +1 -0
- package/build/dist/Types/Team/ComplianceRule.js +304 -0
- package/build/dist/Types/Team/ComplianceRule.js.map +1 -0
- package/build/dist/Types/Team/ComplianceRuleType.js +21 -0
- package/build/dist/Types/Team/ComplianceRuleType.js.map +1 -1
- package/build/dist/Types/Team/TeamComplianceStatus.js +2 -0
- package/build/dist/Types/Team/TeamComplianceStatus.js.map +1 -0
- package/build/dist/Types/Telemetry/TelemetryIngestSurface.js +36 -0
- package/build/dist/Types/Telemetry/TelemetryIngestSurface.js.map +1 -1
- package/build/dist/UI/Components/ActionButton/ActionButtonSchema.js +20 -1
- package/build/dist/UI/Components/ActionButton/ActionButtonSchema.js.map +1 -1
- package/build/dist/UI/Components/ActionButton/RowActions.js +113 -0
- package/build/dist/UI/Components/ActionButton/RowActions.js.map +1 -0
- package/build/dist/UI/Components/ActionButton/SplitActionButtons.js +71 -0
- package/build/dist/UI/Components/ActionButton/SplitActionButtons.js.map +1 -0
- package/build/dist/UI/Components/Charts/Area/AreaChart.js +16 -1
- package/build/dist/UI/Components/Charts/Area/AreaChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/Bar/BarChart.js +16 -1
- package/build/dist/UI/Components/Charts/Bar/BarChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js +27 -5
- package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js +61 -194
- package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js +84 -26
- package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js +75 -196
- package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/Utils/DoubleClick.js +133 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/Utils/DoubleClick.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/Utils/UseChartBucketsChange.js +26 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/Utils/UseChartBucketsChange.js.map +1 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/Utils/UseChartRangeSelection.js +371 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/Utils/UseChartRangeSelection.js.map +1 -0
- package/build/dist/UI/Components/Charts/Line/LineChart.js +16 -1
- package/build/dist/UI/Components/Charts/Line/LineChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/TimeRangeZoom/ResetTimeRangeZoomButton.js +35 -0
- package/build/dist/UI/Components/Charts/TimeRangeZoom/ResetTimeRangeZoomButton.js.map +1 -0
- package/build/dist/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomContext.js +107 -0
- package/build/dist/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomContext.js.map +1 -0
- package/build/dist/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomHint.js +41 -0
- package/build/dist/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomHint.js.map +1 -0
- package/build/dist/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomUtil.js +117 -0
- package/build/dist/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomUtil.js.map +1 -0
- package/build/dist/UI/Components/Charts/TimeRangeZoom/UseTimeRangeZoom.js +121 -0
- package/build/dist/UI/Components/Charts/TimeRangeZoom/UseTimeRangeZoom.js.map +1 -0
- package/build/dist/UI/Components/Charts/Utils/DataPoint.js +15 -7
- package/build/dist/UI/Components/Charts/Utils/DataPoint.js.map +1 -1
- package/build/dist/UI/Components/Charts/Utils/XAxis.js +70 -0
- package/build/dist/UI/Components/Charts/Utils/XAxis.js.map +1 -1
- package/build/dist/UI/Components/Charts/Utils/useHistogramRangeSelection.js +305 -38
- package/build/dist/UI/Components/Charts/Utils/useHistogramRangeSelection.js.map +1 -1
- package/build/dist/UI/Components/EntityDropdown/EntityDropdown.js +89 -14
- package/build/dist/UI/Components/EntityDropdown/EntityDropdown.js.map +1 -1
- package/build/dist/UI/Components/Forms/Fields/FormField.js +11 -2
- package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
- package/build/dist/UI/Components/Input/Input.js +69 -54
- package/build/dist/UI/Components/Input/Input.js.map +1 -1
- package/build/dist/UI/Components/List/ListRow.js +4 -39
- package/build/dist/UI/Components/List/ListRow.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/LogsViewer.js +31 -8
- package/build/dist/UI/Components/LogsViewer/LogsViewer.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogTimeRangePicker.js +10 -1
- package/build/dist/UI/Components/LogsViewer/components/LogTimeRangePicker.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js +139 -21
- package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsHistogram.js +30 -8
- package/build/dist/UI/Components/LogsViewer/components/LogsHistogram.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsViewerToolbar.js +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsViewerToolbar.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +10 -0
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/MoreMenu/MoreMenu.js +253 -14
- package/build/dist/UI/Components/MoreMenu/MoreMenu.js.map +1 -1
- package/build/dist/UI/Components/MoreMenu/MoreMenuItem.js +43 -13
- package/build/dist/UI/Components/MoreMenu/MoreMenuItem.js.map +1 -1
- package/build/dist/UI/Components/OrderedStatesList/Item.js +2 -38
- package/build/dist/UI/Components/OrderedStatesList/Item.js.map +1 -1
- package/build/dist/UI/Components/StatusPage/ResourceGrid.js +53 -15
- package/build/dist/UI/Components/StatusPage/ResourceGrid.js.map +1 -1
- package/build/dist/UI/Components/Table/TableBody.js +6 -2
- package/build/dist/UI/Components/Table/TableBody.js.map +1 -1
- package/build/dist/UI/Components/Table/TableRow.js +12 -75
- package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js +32 -7
- package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js +27 -9
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.js +11 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/useViewerTimeRangeZoom.js +272 -0
- package/build/dist/UI/Components/TelemetryViewer/useViewerTimeRangeZoom.js.map +1 -0
- package/build/dist/UI/Components/Toggle/Toggle.js +14 -1
- package/build/dist/UI/Components/Toggle/Toggle.js.map +1 -1
- package/build/dist/UI/Components/Tooltip/Tooltip.js +1 -1
- package/build/dist/UI/Components/Tooltip/Tooltip.js.map +1 -1
- package/build/dist/Utils/AI/InvestigationReport.js +71 -11
- package/build/dist/Utils/AI/InvestigationReport.js.map +1 -1
- package/build/dist/Utils/AiRemediation/CommandPolicy.js +1 -1
- package/build/dist/Utils/AiRemediation/CommandPolicy.js.map +1 -1
- package/build/dist/Utils/AiRemediation/KubectlPolicy.js +1 -1
- package/build/dist/Utils/AiRemediation/KubectlPolicy.js.map +1 -1
- package/build/dist/Utils/AiRemediation/Resource/CephCommandPolicy.js +1462 -0
- package/build/dist/Utils/AiRemediation/Resource/CephCommandPolicy.js.map +1 -0
- package/build/dist/Utils/AiRemediation/Resource/DatabaseCommandPolicy.js +122 -0
- package/build/dist/Utils/AiRemediation/Resource/DatabaseCommandPolicy.js.map +1 -0
- package/build/dist/Utils/AiRemediation/Resource/DatabaseDiagnosticCatalog.js +1139 -0
- package/build/dist/Utils/AiRemediation/Resource/DatabaseDiagnosticCatalog.js.map +1 -0
- package/build/dist/Utils/AiRemediation/Resource/DatabaseQueryRedactor.js +1060 -0
- package/build/dist/Utils/AiRemediation/Resource/DatabaseQueryRedactor.js.map +1 -0
- package/build/dist/Utils/AiRemediation/Resource/DockerCliGrammar.js +1301 -0
- package/build/dist/Utils/AiRemediation/Resource/DockerCliGrammar.js.map +1 -0
- package/build/dist/Utils/AiRemediation/Resource/DockerEngineCommandPolicy.js +370 -0
- package/build/dist/Utils/AiRemediation/Resource/DockerEngineCommandPolicy.js.map +1 -0
- package/build/dist/Utils/AiRemediation/Resource/DockerSwarmCommandPolicy.js +498 -0
- package/build/dist/Utils/AiRemediation/Resource/DockerSwarmCommandPolicy.js.map +1 -0
- package/build/dist/Utils/AiRemediation/Resource/GovcCommandPolicy.js +1565 -0
- package/build/dist/Utils/AiRemediation/Resource/GovcCommandPolicy.js.map +1 -0
- package/build/dist/Utils/AiRemediation/Resource/HostCommandPolicy.js +2206 -0
- package/build/dist/Utils/AiRemediation/Resource/HostCommandPolicy.js.map +1 -0
- package/build/dist/Utils/AiRemediation/Resource/ProxmoxCommandPolicy.js +1129 -0
- package/build/dist/Utils/AiRemediation/Resource/ProxmoxCommandPolicy.js.map +1 -0
- package/build/dist/Utils/AiRemediation/Resource/ResourceCommandPolicy.js +565 -0
- package/build/dist/Utils/AiRemediation/Resource/ResourceCommandPolicy.js.map +1 -0
- package/build/dist/Utils/AiRemediation/Resource/ResourceCommandPolicyCore.js +408 -0
- package/build/dist/Utils/AiRemediation/Resource/ResourceCommandPolicyCore.js.map +1 -0
- package/build/dist/Utils/AiRemediation/Resource/ResourceOutputRedactor.js +1910 -0
- package/build/dist/Utils/AiRemediation/Resource/ResourceOutputRedactor.js.map +1 -0
- package/build/dist/Utils/Dashboard/DashboardTimeRangeZoom.js +27 -1
- package/build/dist/Utils/Dashboard/DashboardTimeRangeZoom.js.map +1 -1
- package/build/dist/Utils/SessionReplay/SessionReplayBudgetMetricType.js +160 -0
- package/build/dist/Utils/SessionReplay/SessionReplayBudgetMetricType.js.map +1 -0
- package/package.json +1 -1
|
@@ -30,11 +30,12 @@ import UserService from "../../../Services/UserService";
|
|
|
30
30
|
import QueryHelper from "../../../Types/Database/QueryHelper";
|
|
31
31
|
import SortOrder from "../../../../Types/BaseDatabase/SortOrder";
|
|
32
32
|
import LIMIT_MAX from "../../../../Types/Database/LimitMax";
|
|
33
|
+
import { truncateToLength } from "../../Database/TruncateColumnValue";
|
|
33
34
|
// Bot Framework SDK imports
|
|
34
35
|
import { CloudAdapter, ConfigurationBotFrameworkAuthentication, TeamsActivityHandler, TeamsInfo, MessageFactory, } from "botbuilder";
|
|
35
36
|
import MicrosoftTeamsServiceUrl from "./MicrosoftTeamsServiceUrl";
|
|
36
37
|
// Teams action handlers and types
|
|
37
|
-
import MicrosoftTeamsAuthAction from "./Actions/Auth";
|
|
38
|
+
import MicrosoftTeamsAuthAction, { MicrosoftTeamsAccountNotLinkedException, } from "./Actions/Auth";
|
|
38
39
|
import MicrosoftTeamsIncidentActions from "./Actions/Incident";
|
|
39
40
|
import MicrosoftTeamsAlertActions from "./Actions/Alert";
|
|
40
41
|
import MicrosoftTeamsAlertEpisodeActions from "./Actions/AlertEpisode";
|
|
@@ -42,6 +43,10 @@ import MicrosoftTeamsIncidentEpisodeActions from "./Actions/IncidentEpisode";
|
|
|
42
43
|
import MicrosoftTeamsMonitorActions from "./Actions/Monitor";
|
|
43
44
|
import MicrosoftTeamsScheduledMaintenanceActions from "./Actions/ScheduledMaintenance";
|
|
44
45
|
import MicrosoftTeamsOnCallDutyActions from "./Actions/OnCallDutyPolicy";
|
|
46
|
+
import MicrosoftTeamsActivityDeduplicator from "./MicrosoftTeamsActivityDeduplicator";
|
|
47
|
+
import MicrosoftTeamsCreateCommands from "./MicrosoftTeamsCreateCommands";
|
|
48
|
+
import MicrosoftTeamsMessageSize from "./MicrosoftTeamsMessageSize";
|
|
49
|
+
import MicrosoftTeamsReplies from "./MicrosoftTeamsReplies";
|
|
45
50
|
import WorkspaceActionAuthorization from "../WorkspaceActionAuthorization";
|
|
46
51
|
import NotAuthorizedException from "../../../../Types/Exception/NotAuthorizedException";
|
|
47
52
|
import AIService, { AI_DISABLED_MESSAGE } from "../../../Services/AIService";
|
|
@@ -79,6 +84,38 @@ export var MicrosoftTeamsAppInstallState;
|
|
|
79
84
|
* literal too.
|
|
80
85
|
*/
|
|
81
86
|
export const MICROSOFT_TEAMS_INSTALL_READ_PERMISSION = "TeamsAppInstallation.ReadForTeam.All";
|
|
87
|
+
/*
|
|
88
|
+
* The resource-specific (per chat) permission that lets OneUptime read a group
|
|
89
|
+
* chat's name (its Graph "topic") with the app-only token. Bot Framework
|
|
90
|
+
* activities from group chats do not reliably carry the name, so without this
|
|
91
|
+
* a group chat can only be named after its members. It is granted per chat
|
|
92
|
+
* when the app is installed or updated there with a manifest that requests it.
|
|
93
|
+
* (The tenant-wide Chat.ReadBasic.WhereInstalled application permission works
|
|
94
|
+
* with the same call, for admins who would rather grant it once.)
|
|
95
|
+
*/
|
|
96
|
+
export const MICROSOFT_TEAMS_CHAT_TOPIC_READ_PERMISSION = "ChatSettings.Read.Chat";
|
|
97
|
+
export var MicrosoftTeamsChatTopicLookupStatus;
|
|
98
|
+
(function (MicrosoftTeamsChatTopicLookupStatus) {
|
|
99
|
+
MicrosoftTeamsChatTopicLookupStatus["Found"] = "Found";
|
|
100
|
+
MicrosoftTeamsChatTopicLookupStatus["NoTopic"] = "NoTopic";
|
|
101
|
+
MicrosoftTeamsChatTopicLookupStatus["PermissionDenied"] = "PermissionDenied";
|
|
102
|
+
MicrosoftTeamsChatTopicLookupStatus["Unknown"] = "Unknown";
|
|
103
|
+
})(MicrosoftTeamsChatTopicLookupStatus || (MicrosoftTeamsChatTopicLookupStatus = {}));
|
|
104
|
+
// How many Graph chat lookups Refresh Chats runs at once.
|
|
105
|
+
const MICROSOFT_TEAMS_CHAT_TOPIC_LOOKUP_CONCURRENCY = 5;
|
|
106
|
+
/*
|
|
107
|
+
* Per-lookup ceiling. Concurrent refreshes of a project share one run, so a
|
|
108
|
+
* lookup that never answers would otherwise hold every later Refresh Chats
|
|
109
|
+
* for that project.
|
|
110
|
+
*/
|
|
111
|
+
const MICROSOFT_TEAMS_CHAT_TOPIC_LOOKUP_TIMEOUT_IN_MS = 15000;
|
|
112
|
+
/*
|
|
113
|
+
* Chat names are kept well under the 100-character ShortText columns that
|
|
114
|
+
* store them in notification logs — Teams chat names can be much longer.
|
|
115
|
+
*/
|
|
116
|
+
const MICROSOFT_TEAMS_CHAT_NAME_MAX_LENGTH = 80;
|
|
117
|
+
// How many member names a group chat named after its members shows.
|
|
118
|
+
const MICROSOFT_TEAMS_CHAT_NAME_MEMBERS_SHOWN = 3;
|
|
82
119
|
/*
|
|
83
120
|
* Microsoft's wording when the Bot Framework refuses a proactive post because
|
|
84
121
|
* the app is not a member of the target conversation. Matched case-insensitively
|
|
@@ -90,6 +127,11 @@ const MICROSOFT_TEAMS_ROSTER_ERROR_FRAGMENTS = [
|
|
|
90
127
|
];
|
|
91
128
|
// Maximum number of pages to fetch when paginating teams
|
|
92
129
|
const MICROSOFT_TEAMS_MAX_PAGES = 500;
|
|
130
|
+
// Bot commands that open a form; text after them becomes the form's title.
|
|
131
|
+
const CREATE_INCIDENT_COMMAND = "create incident";
|
|
132
|
+
const CREATE_MAINTENANCE_COMMAND = "create maintenance";
|
|
133
|
+
// How many affected monitors a "show ..." reply names for one item.
|
|
134
|
+
const MICROSOFT_TEAMS_MAX_AFFECTED_MONITOR_NAMES = 10;
|
|
93
135
|
/*
|
|
94
136
|
* Hosts that may receive a Teams incoming webhook. Legacy Connector webhooks
|
|
95
137
|
* use Office domains. Teams Workflows use regional logic.azure.com hosts, and
|
|
@@ -1932,7 +1974,7 @@ class MicrosoftTeamsUtil extends WorkspaceBase {
|
|
|
1932
1974
|
}
|
|
1933
1975
|
// Bot Framework specific methods
|
|
1934
1976
|
static async handleBotMessageActivity(data) {
|
|
1935
|
-
var _a, _b, _c, _d;
|
|
1977
|
+
var _a, _b, _c, _d, _e;
|
|
1936
1978
|
// Handle direct messages to bot or @mentions via Bot Framework
|
|
1937
1979
|
const messageText = data.activity["text"] || "";
|
|
1938
1980
|
const possibleActionValue = data.activity["value"] || {};
|
|
@@ -1991,18 +2033,8 @@ class MicrosoftTeamsUtil extends WorkspaceBase {
|
|
|
1991
2033
|
onlyIfMissingOrStale: true,
|
|
1992
2034
|
});
|
|
1993
2035
|
}
|
|
1994
|
-
// If this is actually an Adaptive Card submit wrapped as a message, route to invoke handler
|
|
1995
|
-
if (possibleActionValue["action"] ||
|
|
1996
|
-
((_b = possibleActionValue["data"]) === null || _b === void 0 ? void 0 : _b["action"])) {
|
|
1997
|
-
logger.debug("Message activity contains action payload; routing to invoke handler");
|
|
1998
|
-
await this.handleBotInvokeActivity({
|
|
1999
|
-
activity: data.activity,
|
|
2000
|
-
turnContext: data.turnContext,
|
|
2001
|
-
});
|
|
2002
|
-
return;
|
|
2003
|
-
}
|
|
2004
2036
|
// Check if the bot was mentioned
|
|
2005
|
-
const recipientId = (
|
|
2037
|
+
const recipientId = (_b = data.activity["recipient"]) === null || _b === void 0 ? void 0 : _b["id"];
|
|
2006
2038
|
const conversationType = conversation["conversationType"] || "";
|
|
2007
2039
|
const isDirectMessage = conversationType === "personal";
|
|
2008
2040
|
const isMentioned = entities.some((entity) => {
|
|
@@ -2010,29 +2042,34 @@ class MicrosoftTeamsUtil extends WorkspaceBase {
|
|
|
2010
2042
|
return (entity["type"] === "mention" &&
|
|
2011
2043
|
((_a = entity["mentioned"]) === null || _a === void 0 ? void 0 : _a["id"]) === recipientId);
|
|
2012
2044
|
});
|
|
2013
|
-
//
|
|
2014
|
-
|
|
2045
|
+
// An Adaptive Card submit arrives as a message whose value names the action.
|
|
2046
|
+
const isCardSubmit = Boolean(possibleActionValue["action"] ||
|
|
2047
|
+
((_c = possibleActionValue["data"]) === null || _c === void 0 ? void 0 : _c["action"]));
|
|
2048
|
+
// Only respond to card submits, direct messages and @mentions.
|
|
2049
|
+
if (!isCardSubmit && !isDirectMessage && !isMentioned) {
|
|
2015
2050
|
logger.debug("Bot not mentioned in channel message, ignoring");
|
|
2016
2051
|
return;
|
|
2017
2052
|
}
|
|
2018
|
-
|
|
2019
|
-
|
|
2020
|
-
|
|
2021
|
-
|
|
2022
|
-
|
|
2053
|
+
/*
|
|
2054
|
+
* Teams delivers an activity again when the first delivery was slow or
|
|
2055
|
+
* failed. Handling it twice sends every reply twice and creates a
|
|
2056
|
+
* submitted incident twice, so only the first delivery is handled.
|
|
2057
|
+
*/
|
|
2058
|
+
if (!(await MicrosoftTeamsActivityDeduplicator.claim(data.activity))) {
|
|
2059
|
+
logger.debug("Microsoft Teams delivered this activity before; ignoring the repeat", {
|
|
2060
|
+
activityId: data.activity["id"] || "",
|
|
2061
|
+
});
|
|
2023
2062
|
return;
|
|
2024
2063
|
}
|
|
2025
|
-
//
|
|
2026
|
-
|
|
2027
|
-
|
|
2028
|
-
|
|
2029
|
-
|
|
2030
|
-
|
|
2031
|
-
|
|
2064
|
+
// If this is actually an Adaptive Card submit wrapped as a message, route to invoke handler
|
|
2065
|
+
if (isCardSubmit) {
|
|
2066
|
+
logger.debug("Message activity contains action payload; routing to invoke handler");
|
|
2067
|
+
await this.handleBotInvokeActivity({
|
|
2068
|
+
activity: data.activity,
|
|
2069
|
+
turnContext: data.turnContext,
|
|
2070
|
+
});
|
|
2032
2071
|
return;
|
|
2033
2072
|
}
|
|
2034
|
-
const projectId = tenantResolution.projectAuth.projectId;
|
|
2035
|
-
logger.debug(`Found project ID: ${projectId.toString()} for tenant ID: ${tenantId}`);
|
|
2036
2073
|
// Clean the message text by removing bot mentions
|
|
2037
2074
|
const cleanText = messageText
|
|
2038
2075
|
.replace(/<at[^>]*>.*?<\/at>/g, "")
|
|
@@ -2046,62 +2083,98 @@ class MicrosoftTeamsUtil extends WorkspaceBase {
|
|
|
2046
2083
|
const originalQuestionText = messageText
|
|
2047
2084
|
.replace(/<at[^>]*>.*?<\/at>/g, "")
|
|
2048
2085
|
.trim();
|
|
2086
|
+
const isCreateIncidentCommand = cleanText === CREATE_INCIDENT_COMMAND ||
|
|
2087
|
+
cleanText.startsWith(CREATE_INCIDENT_COMMAND + " ");
|
|
2088
|
+
const isCreateMaintenanceCommand = cleanText === CREATE_MAINTENANCE_COMMAND ||
|
|
2089
|
+
cleanText.startsWith(CREATE_MAINTENANCE_COMMAND + " ");
|
|
2090
|
+
/*
|
|
2091
|
+
* Explicit commands are matched precisely so that natural-language
|
|
2092
|
+
* questions (which may incidentally contain words like "help" or
|
|
2093
|
+
* "alerts") fall through to the AI assistant instead of a canned command.
|
|
2094
|
+
*/
|
|
2095
|
+
const isHelpCommand = cleanText === "help" || cleanText === "" || cleanText === "?";
|
|
2096
|
+
const isShowActiveIncidentsCommand = cleanText === "show active incidents" || cleanText === "active incidents";
|
|
2097
|
+
const isShowScheduledMaintenanceCommand = cleanText === "show scheduled maintenance" ||
|
|
2098
|
+
cleanText === "scheduled maintenance";
|
|
2099
|
+
const isShowOngoingMaintenanceCommand = cleanText === "show ongoing maintenance" ||
|
|
2100
|
+
cleanText === "ongoing maintenance";
|
|
2101
|
+
const isShowActiveAlertsCommand = cleanText === "show active alerts" || cleanText === "active alerts";
|
|
2102
|
+
/*
|
|
2103
|
+
* "ask <question>" is an explicit prefix that always routes to the AI
|
|
2104
|
+
* assistant. When present, strip the prefix and use the remainder as the
|
|
2105
|
+
* question.
|
|
2106
|
+
*/
|
|
2107
|
+
const isAskCommand = cleanText === "ask" || cleanText.startsWith("ask ");
|
|
2108
|
+
/*
|
|
2109
|
+
* The command, named for log lines that must not quote the message: a
|
|
2110
|
+
* free-form question can carry things that do not belong in a log.
|
|
2111
|
+
*/
|
|
2112
|
+
const commandName = (_d = [
|
|
2113
|
+
{ matches: isHelpCommand, name: "help" },
|
|
2114
|
+
{ matches: isCreateIncidentCommand, name: CREATE_INCIDENT_COMMAND },
|
|
2115
|
+
{ matches: isCreateMaintenanceCommand, name: CREATE_MAINTENANCE_COMMAND },
|
|
2116
|
+
{ matches: isShowActiveIncidentsCommand, name: "show active incidents" },
|
|
2117
|
+
{
|
|
2118
|
+
matches: isShowScheduledMaintenanceCommand,
|
|
2119
|
+
name: "show scheduled maintenance",
|
|
2120
|
+
},
|
|
2121
|
+
{
|
|
2122
|
+
matches: isShowOngoingMaintenanceCommand,
|
|
2123
|
+
name: "show ongoing maintenance",
|
|
2124
|
+
},
|
|
2125
|
+
{ matches: isShowActiveAlertsCommand, name: "show active alerts" },
|
|
2126
|
+
{ matches: isAskCommand, name: "ask" },
|
|
2127
|
+
].find((command) => {
|
|
2128
|
+
return command.matches;
|
|
2129
|
+
})) === null || _d === void 0 ? void 0 : _d.name;
|
|
2130
|
+
let projectId = undefined;
|
|
2049
2131
|
let responseText = "";
|
|
2050
2132
|
try {
|
|
2051
|
-
|
|
2052
|
-
|
|
2053
|
-
|
|
2054
|
-
|
|
2055
|
-
|
|
2056
|
-
|
|
2057
|
-
|
|
2058
|
-
|
|
2059
|
-
|
|
2060
|
-
|
|
2061
|
-
|
|
2062
|
-
|
|
2063
|
-
|
|
2064
|
-
|
|
2065
|
-
|
|
2066
|
-
|
|
2067
|
-
|
|
2068
|
-
|
|
2069
|
-
* "ask <question>" is an explicit prefix that always routes to the AI
|
|
2070
|
-
* assistant. When present, strip the prefix and use the remainder as the
|
|
2071
|
-
* question.
|
|
2072
|
-
*/
|
|
2073
|
-
const isAskCommand = cleanText === "ask" || cleanText.startsWith("ask ");
|
|
2133
|
+
// Extract tenant ID to get project ID
|
|
2134
|
+
const tenantId = (_e = channelData["tenant"]) === null || _e === void 0 ? void 0 : _e["id"];
|
|
2135
|
+
if (!tenantId) {
|
|
2136
|
+
logger.error("Tenant ID not found in channelData");
|
|
2137
|
+
await data.turnContext.sendActivity("Sorry, I couldn't identify your organization. Please try again later.");
|
|
2138
|
+
return;
|
|
2139
|
+
}
|
|
2140
|
+
// Get project auth by tenant ID
|
|
2141
|
+
const tenantResolution = await this.resolveProjectByTenantId({
|
|
2142
|
+
tenantId: tenantId,
|
|
2143
|
+
});
|
|
2144
|
+
if (!tenantResolution.projectAuth ||
|
|
2145
|
+
!tenantResolution.projectAuth.projectId) {
|
|
2146
|
+
await data.turnContext.sendActivity(this.getTenantResolutionFailureMessage(tenantResolution));
|
|
2147
|
+
return;
|
|
2148
|
+
}
|
|
2149
|
+
projectId = tenantResolution.projectAuth.projectId;
|
|
2150
|
+
logger.debug(`Found project ID: ${projectId.toString()} for tenant ID: ${tenantId}`);
|
|
2074
2151
|
if (isHelpCommand) {
|
|
2075
2152
|
responseText = this.getHelpMessage();
|
|
2076
2153
|
}
|
|
2077
2154
|
else if (isCreateIncidentCommand) {
|
|
2078
|
-
//
|
|
2155
|
+
// "create incident <title>" opens the form with the title filled in.
|
|
2079
2156
|
logger.debug("Processing create incident command");
|
|
2080
|
-
|
|
2081
|
-
|
|
2082
|
-
|
|
2083
|
-
|
|
2084
|
-
|
|
2085
|
-
|
|
2086
|
-
|
|
2087
|
-
],
|
|
2157
|
+
await MicrosoftTeamsCreateCommands.handleCreateIncidentCommand({
|
|
2158
|
+
turnContext: data.turnContext,
|
|
2159
|
+
activity: data.activity,
|
|
2160
|
+
projectId: projectId,
|
|
2161
|
+
initialTitle: originalQuestionText
|
|
2162
|
+
.substring(CREATE_INCIDENT_COMMAND.length)
|
|
2163
|
+
.trim(),
|
|
2088
2164
|
});
|
|
2089
|
-
logger.debug("New incident card sent successfully");
|
|
2090
2165
|
return;
|
|
2091
2166
|
}
|
|
2092
2167
|
else if (isCreateMaintenanceCommand) {
|
|
2093
|
-
//
|
|
2168
|
+
// "create maintenance <title>" opens the form with the title filled in.
|
|
2094
2169
|
logger.debug("Processing create maintenance command");
|
|
2095
|
-
|
|
2096
|
-
|
|
2097
|
-
|
|
2098
|
-
|
|
2099
|
-
|
|
2100
|
-
|
|
2101
|
-
|
|
2102
|
-
],
|
|
2170
|
+
await MicrosoftTeamsCreateCommands.handleCreateScheduledMaintenanceCommand({
|
|
2171
|
+
turnContext: data.turnContext,
|
|
2172
|
+
activity: data.activity,
|
|
2173
|
+
projectId: projectId,
|
|
2174
|
+
initialTitle: originalQuestionText
|
|
2175
|
+
.substring(CREATE_MAINTENANCE_COMMAND.length)
|
|
2176
|
+
.trim(),
|
|
2103
2177
|
});
|
|
2104
|
-
logger.debug("New scheduled maintenance card sent successfully");
|
|
2105
2178
|
return;
|
|
2106
2179
|
}
|
|
2107
2180
|
else if (isShowActiveIncidentsCommand) {
|
|
@@ -2139,18 +2212,71 @@ class MicrosoftTeamsUtil extends WorkspaceBase {
|
|
|
2139
2212
|
});
|
|
2140
2213
|
return;
|
|
2141
2214
|
}
|
|
2142
|
-
|
|
2143
|
-
|
|
2215
|
+
/*
|
|
2216
|
+
* Send response directly using TurnContext - this is the recommended Bot
|
|
2217
|
+
* Framework pattern. Lists grow with the project, so the text is kept
|
|
2218
|
+
* within what Teams accepts.
|
|
2219
|
+
*/
|
|
2220
|
+
await data.turnContext.sendActivity(MicrosoftTeamsMessageSize.fitTextToBudget({ text: responseText }));
|
|
2144
2221
|
logger.debug("Bot message sent successfully using TurnContext", {
|
|
2145
2222
|
projectId: projectId.toString(),
|
|
2146
2223
|
});
|
|
2147
2224
|
}
|
|
2148
2225
|
catch (error) {
|
|
2149
|
-
|
|
2150
|
-
|
|
2226
|
+
/*
|
|
2227
|
+
* One reply, and no rethrow. This used to reply and then rethrow: the
|
|
2228
|
+
* adapter answered Teams with HTTP 500, Teams delivered the message
|
|
2229
|
+
* again, and every failure showed up twice (issue #4111).
|
|
2230
|
+
*/
|
|
2231
|
+
/*
|
|
2232
|
+
* The command is named, not quoted: a free-form question can carry
|
|
2233
|
+
* things that do not belong in an error log. The text is in the debug
|
|
2234
|
+
* log above.
|
|
2235
|
+
*/
|
|
2236
|
+
MicrosoftTeamsReplies.logFailure(`Microsoft Teams message ${data.activity["id"] || ""} (${commandName
|
|
2237
|
+
? `"${commandName}"`
|
|
2238
|
+
: `a ${cleanText.length}-character question`}) failed`, error, {
|
|
2239
|
+
projectId: projectId === null || projectId === void 0 ? void 0 : projectId.toString(),
|
|
2240
|
+
});
|
|
2241
|
+
await MicrosoftTeamsReplies.sendBestEffort(data.turnContext, this.getUnexpectedErrorMessage(data.activity));
|
|
2242
|
+
}
|
|
2243
|
+
}
|
|
2244
|
+
/*
|
|
2245
|
+
* The reply to a message whose handling failed in a way nobody planned for.
|
|
2246
|
+
* It names the activity id, which the server log line carries too, so an
|
|
2247
|
+
* administrator can find what went wrong.
|
|
2248
|
+
*/
|
|
2249
|
+
static getUnexpectedErrorMessage(activity) {
|
|
2250
|
+
const reference = activity["id"] || "";
|
|
2251
|
+
return `Sorry, something went wrong in OneUptime while handling that message. Please try again in a minute.${reference
|
|
2252
|
+
? ` If it keeps happening, ask your OneUptime administrator to look for reference ${reference} in the server logs.`
|
|
2253
|
+
: ""}`;
|
|
2254
|
+
}
|
|
2255
|
+
/*
|
|
2256
|
+
* The last line of defence for an inbound activity whose handler threw.
|
|
2257
|
+
*
|
|
2258
|
+
* The error is logged and the turn ends normally, so CloudAdapter answers
|
|
2259
|
+
* Teams with 200. Letting the error through made CloudAdapter answer HTTP
|
|
2260
|
+
* 500, Teams delivered the activity again, and every reply the turn had
|
|
2261
|
+
* posted appeared twice (issue #4111). A message that got no reply yet gets
|
|
2262
|
+
* one; an invoke gets the response it needs, or CloudAdapter answers 501.
|
|
2263
|
+
*
|
|
2264
|
+
* This is deliberately not adapter.onTurnError: the same adapter sends
|
|
2265
|
+
* proactive notifications, and their callers need their errors thrown.
|
|
2266
|
+
*/
|
|
2267
|
+
static async recoverFromFailedTurn(data) {
|
|
2268
|
+
const { turnContext, error } = data;
|
|
2269
|
+
const activity = turnContext.activity || {};
|
|
2270
|
+
MicrosoftTeamsReplies.logFailure(`Microsoft Teams ${activity.type || "unknown"} activity ${activity.id || ""} failed`, error);
|
|
2271
|
+
if (activity.type === "message" && !turnContext.responded) {
|
|
2272
|
+
await MicrosoftTeamsReplies.sendBestEffort(turnContext, this.getUnexpectedErrorMessage(activity));
|
|
2273
|
+
return;
|
|
2274
|
+
}
|
|
2275
|
+
if (activity.type === "invoke") {
|
|
2276
|
+
await MicrosoftTeamsReplies.sendBestEffort(turnContext, {
|
|
2277
|
+
type: "invokeResponse",
|
|
2278
|
+
value: { status: 200 },
|
|
2151
2279
|
});
|
|
2152
|
-
await data.turnContext.sendActivity("Sorry, I encountered an error processing your request. Please try again later.");
|
|
2153
|
-
throw error;
|
|
2154
2280
|
}
|
|
2155
2281
|
}
|
|
2156
2282
|
/*
|
|
@@ -2159,13 +2285,31 @@ class MicrosoftTeamsUtil extends WorkspaceBase {
|
|
|
2159
2285
|
* channel/chat message bodies are typically HTML (body.contentType "html").
|
|
2160
2286
|
*/
|
|
2161
2287
|
static toPlainTextFromTeamsMessageBody(rawContent) {
|
|
2162
|
-
return rawContent
|
|
2163
|
-
.replace(/<at[^>]*>.*?<\/at>/g, "")
|
|
2164
|
-
.replace(/<[^>]*>/g, "")
|
|
2288
|
+
return this.stripHtmlTags(rawContent.replace(/<at[^>]*>.*?<\/at>/g, ""))
|
|
2165
2289
|
.replace(/ /g, " ")
|
|
2166
2290
|
.replace(/\s+/g, " ")
|
|
2167
2291
|
.trim();
|
|
2168
2292
|
}
|
|
2293
|
+
/*
|
|
2294
|
+
* Plain text out of a Teams message body, which Graph and the Bot Framework
|
|
2295
|
+
* hand over as HTML. Removing complete tags is not enough on its own: an
|
|
2296
|
+
* unclosed one ("<script" with no ">" after it) matches no tag pattern, so
|
|
2297
|
+
* once no tag is left, any "<" still standing goes too, and the text holds
|
|
2298
|
+
* no markup at all. The tag pass repeats until nothing changes - the shape
|
|
2299
|
+
* code scanning recognises as complete, where a single pass is reported as
|
|
2300
|
+
* incomplete multi-character sanitization. Teams sends a literal "<" in a
|
|
2301
|
+
* message as "<", which is left encoded: decoding it here would hand
|
|
2302
|
+
* back what this removed.
|
|
2303
|
+
*/
|
|
2304
|
+
static stripHtmlTags(html) {
|
|
2305
|
+
let text = html;
|
|
2306
|
+
let previous;
|
|
2307
|
+
do {
|
|
2308
|
+
previous = text;
|
|
2309
|
+
text = text.replace(/<[^>]*>/g, "");
|
|
2310
|
+
} while (text !== previous);
|
|
2311
|
+
return text.replace(/</g, "");
|
|
2312
|
+
}
|
|
2169
2313
|
/*
|
|
2170
2314
|
* AI Ops: gather the prior turns of the current Teams conversation/thread and
|
|
2171
2315
|
* map them to the assistant's history shape ({ role, content }, oldest-first,
|
|
@@ -2349,12 +2493,18 @@ class MicrosoftTeamsUtil extends WorkspaceBase {
|
|
|
2349
2493
|
});
|
|
2350
2494
|
}
|
|
2351
2495
|
catch (error) {
|
|
2496
|
+
// A failed lookup is not a missing account; the caller answers it.
|
|
2497
|
+
if (!(error instanceof MicrosoftTeamsAccountNotLinkedException)) {
|
|
2498
|
+
throw error;
|
|
2499
|
+
}
|
|
2352
2500
|
logger.debug("No OneUptime user linked to Teams user; prompting to connect account", {
|
|
2353
2501
|
projectId: projectId.toString(),
|
|
2354
2502
|
workspaceUserId: teamsUserId,
|
|
2355
2503
|
});
|
|
2356
|
-
|
|
2357
|
-
|
|
2504
|
+
await turnContext.sendActivity(await MicrosoftTeamsReplies.getAccountNotLinkedMessage({
|
|
2505
|
+
projectId: projectId,
|
|
2506
|
+
purpose: "ask OneUptime questions from Microsoft Teams",
|
|
2507
|
+
}));
|
|
2358
2508
|
return;
|
|
2359
2509
|
}
|
|
2360
2510
|
// The user's real permission props - the assistant's tools run under these.
|
|
@@ -2455,6 +2605,25 @@ class MicrosoftTeamsUtil extends WorkspaceBase {
|
|
|
2455
2605
|
await turnContext.sendActivity("Sorry, I ran into a problem answering that question. Please try again later.");
|
|
2456
2606
|
}
|
|
2457
2607
|
}
|
|
2608
|
+
/*
|
|
2609
|
+
* The monitors an incident or maintenance event affects, as one line: the
|
|
2610
|
+
* first few names, then how many more. An event can cover hundreds of
|
|
2611
|
+
* monitors, and listing them all made the reply too large for Teams.
|
|
2612
|
+
*/
|
|
2613
|
+
static formatAffectedMonitorNames(monitors) {
|
|
2614
|
+
const names = monitors
|
|
2615
|
+
.map((monitor) => {
|
|
2616
|
+
return monitor.name || "";
|
|
2617
|
+
})
|
|
2618
|
+
.filter((name) => {
|
|
2619
|
+
return Boolean(name);
|
|
2620
|
+
});
|
|
2621
|
+
const shownNames = names.slice(0, MICROSOFT_TEAMS_MAX_AFFECTED_MONITOR_NAMES);
|
|
2622
|
+
const notShownCount = names.length - shownNames.length;
|
|
2623
|
+
return notShownCount > 0
|
|
2624
|
+
? `${shownNames.join(", ")} and ${notShownCount} more`
|
|
2625
|
+
: shownNames.join(", ");
|
|
2626
|
+
}
|
|
2458
2627
|
// Helper methods for bot commands
|
|
2459
2628
|
static getHelpMessage() {
|
|
2460
2629
|
return `Hello! I'm the OneUptime bot. I can help you with the following commands:
|
|
@@ -2462,8 +2631,8 @@ class MicrosoftTeamsUtil extends WorkspaceBase {
|
|
|
2462
2631
|
**Available Commands:**
|
|
2463
2632
|
- **help** - Show this help message
|
|
2464
2633
|
- **ask <question>** - Ask OneUptime AI about your logs, traces, metrics, incidents and monitors
|
|
2465
|
-
- **create incident** - Create a new incident
|
|
2466
|
-
- **create maintenance** - Create a new scheduled maintenance event
|
|
2634
|
+
- **create incident [title]** - Create a new incident
|
|
2635
|
+
- **create maintenance [title]** - Create a new scheduled maintenance event
|
|
2467
2636
|
- **show active incidents** - Display all currently active incidents
|
|
2468
2637
|
- **show scheduled maintenance** - Show upcoming scheduled maintenance events
|
|
2469
2638
|
- **show ongoing maintenance** - Display currently ongoing maintenance events
|
|
@@ -2547,11 +2716,7 @@ If you need to report an incident or check historical incidents, please visit th
|
|
|
2547
2716
|
• **Declared:** ${declaredAtText}
|
|
2548
2717
|
`;
|
|
2549
2718
|
if (incident.monitors && incident.monitors.length > 0) {
|
|
2550
|
-
message += `• **Affected Services:** ${incident.monitors
|
|
2551
|
-
.map((m) => {
|
|
2552
|
-
return m.name;
|
|
2553
|
-
})
|
|
2554
|
-
.join(", ")}\n`;
|
|
2719
|
+
message += `• **Affected Services:** ${this.formatAffectedMonitorNames(incident.monitors)}\n`;
|
|
2555
2720
|
}
|
|
2556
2721
|
if (incident.description) {
|
|
2557
2722
|
const desc = incident.description.replace(/\s+/g, " ");
|
|
@@ -2635,11 +2800,7 @@ Check back later for upcoming maintenance windows.`;
|
|
|
2635
2800
|
• **Ends:** ${endTime}
|
|
2636
2801
|
`;
|
|
2637
2802
|
if (event.monitors && event.monitors.length > 0) {
|
|
2638
|
-
message += `• **Affected Services:** ${event.monitors
|
|
2639
|
-
.map((m) => {
|
|
2640
|
-
return m.name;
|
|
2641
|
-
})
|
|
2642
|
-
.join(", ")}\n`;
|
|
2803
|
+
message += `• **Affected Services:** ${this.formatAffectedMonitorNames(event.monitors)}\n`;
|
|
2643
2804
|
}
|
|
2644
2805
|
if (event.description) {
|
|
2645
2806
|
const desc = event.description.replace(/\s+/g, " ");
|
|
@@ -2722,11 +2883,7 @@ All systems are currently operating normally.`;
|
|
|
2722
2883
|
• **Expected End:** ${endTime}
|
|
2723
2884
|
`;
|
|
2724
2885
|
if (event.monitors && event.monitors.length > 0) {
|
|
2725
|
-
message += `• **Affected Services:** ${event.monitors
|
|
2726
|
-
.map((m) => {
|
|
2727
|
-
return m.name;
|
|
2728
|
-
})
|
|
2729
|
-
.join(", ")}\n`;
|
|
2886
|
+
message += `• **Affected Services:** ${this.formatAffectedMonitorNames(event.monitors)}\n`;
|
|
2730
2887
|
}
|
|
2731
2888
|
if (event.description) {
|
|
2732
2889
|
const desc = event.description.replace(/\s+/g, " ");
|
|
@@ -2838,6 +2995,7 @@ All monitoring checks are passing normally.`;
|
|
|
2838
2995
|
const { actionType, actionValue } = this.extractActionFromValue(value);
|
|
2839
2996
|
logger.debug(`Bot invoke activity - Action type: ${actionType}`);
|
|
2840
2997
|
logger.debug(`Bot invoke value: ${JSON.stringify(value)}`);
|
|
2998
|
+
let projectId = undefined;
|
|
2841
2999
|
try {
|
|
2842
3000
|
// Resolve project and user context from activity
|
|
2843
3001
|
const channelData = data.activity["channelData"] || {};
|
|
@@ -2855,7 +3013,7 @@ All monitoring checks are passing normally.`;
|
|
|
2855
3013
|
await data.turnContext.sendActivity(this.getTenantResolutionFailureMessage(tenantResolution));
|
|
2856
3014
|
return;
|
|
2857
3015
|
}
|
|
2858
|
-
|
|
3016
|
+
projectId = tenantResolution.projectAuth.projectId;
|
|
2859
3017
|
const fromObj = (data.activity["from"] ||
|
|
2860
3018
|
{});
|
|
2861
3019
|
const teamsUserId = fromObj["aadObjectId"] || undefined;
|
|
@@ -2968,19 +3126,39 @@ All monitoring checks are passing normally.`;
|
|
|
2968
3126
|
}
|
|
2969
3127
|
}
|
|
2970
3128
|
catch (error) {
|
|
3129
|
+
/*
|
|
3130
|
+
* Every reply below is sent best-effort: a reply that fails here must
|
|
3131
|
+
* not escape, or the adapter answers Teams with HTTP 500 and Teams
|
|
3132
|
+
* delivers the action again (issue #4111).
|
|
3133
|
+
*/
|
|
3134
|
+
// The account is not connected: say where to connect it.
|
|
3135
|
+
if (error instanceof MicrosoftTeamsAccountNotLinkedException &&
|
|
3136
|
+
projectId) {
|
|
3137
|
+
logger.debug("Bot invoke activity from a Teams user with no linked account", {
|
|
3138
|
+
actionType: actionType,
|
|
3139
|
+
});
|
|
3140
|
+
await MicrosoftTeamsReplies.sendBestEffort(data.turnContext, await MicrosoftTeamsReplies.getAccountNotLinkedMessage({
|
|
3141
|
+
projectId: projectId,
|
|
3142
|
+
purpose: "use OneUptime actions in Microsoft Teams",
|
|
3143
|
+
}));
|
|
3144
|
+
return;
|
|
3145
|
+
}
|
|
2971
3146
|
// Tell the user why they were refused; the message is written for them.
|
|
2972
3147
|
if (error instanceof NotAuthorizedException) {
|
|
2973
3148
|
logger.debug("Bot invoke activity refused: " + error.message, {
|
|
2974
3149
|
actionType: actionType,
|
|
2975
3150
|
});
|
|
2976
|
-
await data.turnContext
|
|
3151
|
+
await MicrosoftTeamsReplies.sendBestEffort(data.turnContext, error.message);
|
|
2977
3152
|
return;
|
|
2978
3153
|
}
|
|
2979
|
-
|
|
3154
|
+
MicrosoftTeamsReplies.logFailure("Error handling bot invoke activity", error, {
|
|
2980
3155
|
actionType: actionType,
|
|
3156
|
+
projectId: projectId === null || projectId === void 0 ? void 0 : projectId.toString(),
|
|
2981
3157
|
});
|
|
2982
|
-
|
|
2983
|
-
await data.turnContext
|
|
3158
|
+
const reason = MicrosoftTeamsReplies.getUserFacingErrorMessage(error);
|
|
3159
|
+
await MicrosoftTeamsReplies.sendBestEffort(data.turnContext, reason
|
|
3160
|
+
? `Sorry, that action failed: ${reason}`
|
|
3161
|
+
: "Sorry, that action failed. Please try again later.");
|
|
2984
3162
|
}
|
|
2985
3163
|
}
|
|
2986
3164
|
static async handleConversationUpdateActivity(data) {
|
|
@@ -3167,36 +3345,117 @@ All monitoring checks are passing normally.`;
|
|
|
3167
3345
|
return null; // channels and meetings are not chats.
|
|
3168
3346
|
}
|
|
3169
3347
|
static getChatDisplayName(data) {
|
|
3170
|
-
/*
|
|
3171
|
-
* Keep well under the 100-char ShortText columns that store the chat
|
|
3172
|
-
* name in notification logs — Teams chat topics can be much longer.
|
|
3173
|
-
*/
|
|
3174
|
-
const maxNameLength = 80;
|
|
3175
3348
|
const truncate = (name) => {
|
|
3176
|
-
|
|
3177
|
-
|
|
3178
|
-
|
|
3349
|
+
if (name.length <= MICROSOFT_TEAMS_CHAT_NAME_MAX_LENGTH) {
|
|
3350
|
+
return name;
|
|
3351
|
+
}
|
|
3352
|
+
/*
|
|
3353
|
+
* Cut by UTF-16 code units, but never between the two halves of an
|
|
3354
|
+
* emoji: a lone surrogate makes Postgres refuse the whole jsonb write
|
|
3355
|
+
* that carries the name.
|
|
3356
|
+
*/
|
|
3357
|
+
return `${truncateToLength(name, MICROSOFT_TEAMS_CHAT_NAME_MAX_LENGTH - 1)}…`;
|
|
3179
3358
|
};
|
|
3180
3359
|
if (data.topic && data.topic.trim()) {
|
|
3181
3360
|
return truncate(data.topic.trim());
|
|
3182
3361
|
}
|
|
3183
|
-
const memberNames = data.memberNames
|
|
3184
|
-
return Boolean(name && name.trim());
|
|
3185
|
-
});
|
|
3362
|
+
const memberNames = this.getNonBlankNames(data.memberNames);
|
|
3186
3363
|
if (data.chatType === "personal") {
|
|
3187
3364
|
return memberNames[0] ? truncate(`${memberNames[0]}`) : "Personal chat";
|
|
3188
3365
|
}
|
|
3189
3366
|
if (memberNames.length === 0) {
|
|
3190
3367
|
return "Group chat";
|
|
3191
3368
|
}
|
|
3192
|
-
const
|
|
3193
|
-
const
|
|
3194
|
-
const remainingCount =
|
|
3369
|
+
const shownNames = memberNames.slice(0, MICROSOFT_TEAMS_CHAT_NAME_MEMBERS_SHOWN);
|
|
3370
|
+
const memberCount = Math.max(data.memberCount || 0, memberNames.length);
|
|
3371
|
+
const remainingCount = memberCount - shownNames.length;
|
|
3195
3372
|
if (remainingCount > 0) {
|
|
3196
3373
|
return truncate(`${shownNames.join(", ")} + ${remainingCount} more`);
|
|
3197
3374
|
}
|
|
3198
3375
|
return truncate(shownNames.join(", "));
|
|
3199
3376
|
}
|
|
3377
|
+
static getNonBlankNames(names) {
|
|
3378
|
+
return names.filter((name) => {
|
|
3379
|
+
return Boolean(name && name.trim());
|
|
3380
|
+
});
|
|
3381
|
+
}
|
|
3382
|
+
/*
|
|
3383
|
+
* Builds the record to store for a chat that was just heard from, on top of
|
|
3384
|
+
* what is already stored. Whatever could not be read this time — the name
|
|
3385
|
+
* (Graph refused, failed, or was not asked) or the roster (the Bot Framework
|
|
3386
|
+
* call failed) — is taken from the stored record instead of being dropped:
|
|
3387
|
+
* a failed lookup must never turn a chat's real name back into member
|
|
3388
|
+
* names, or member names into a bare "Group chat".
|
|
3389
|
+
*/
|
|
3390
|
+
static buildCapturedChat(data) {
|
|
3391
|
+
var _a, _b, _c;
|
|
3392
|
+
const storedChat = data.storedChat;
|
|
3393
|
+
const activityTopic = (data.activityTopic || "").trim();
|
|
3394
|
+
const lookupStatus = (_a = data.topicLookup) === null || _a === void 0 ? void 0 : _a.status;
|
|
3395
|
+
const topicCleared = !activityTopic &&
|
|
3396
|
+
lookupStatus === MicrosoftTeamsChatTopicLookupStatus.NoTopic;
|
|
3397
|
+
let topic = undefined;
|
|
3398
|
+
if (activityTopic) {
|
|
3399
|
+
topic = activityTopic;
|
|
3400
|
+
}
|
|
3401
|
+
else if (lookupStatus === MicrosoftTeamsChatTopicLookupStatus.Found) {
|
|
3402
|
+
topic = (_b = data.topicLookup) === null || _b === void 0 ? void 0 : _b.topic;
|
|
3403
|
+
}
|
|
3404
|
+
else if (!topicCleared) {
|
|
3405
|
+
topic = storedChat === null || storedChat === void 0 ? void 0 : storedChat.topic; // not read this time: keep the last known name.
|
|
3406
|
+
}
|
|
3407
|
+
let memberNames = (_c = storedChat === null || storedChat === void 0 ? void 0 : storedChat.memberNames) === null || _c === void 0 ? void 0 : _c.slice(0, MICROSOFT_TEAMS_CHAT_NAME_MEMBERS_SHOWN);
|
|
3408
|
+
let memberCount = storedChat === null || storedChat === void 0 ? void 0 : storedChat.memberCount;
|
|
3409
|
+
let memberAadObjectIds = (storedChat === null || storedChat === void 0 ? void 0 : storedChat.memberAadObjectIds) || [];
|
|
3410
|
+
if (data.roster) {
|
|
3411
|
+
const names = this.getNonBlankNames(data.roster.memberNames);
|
|
3412
|
+
memberNames = names.slice(0, MICROSOFT_TEAMS_CHAT_NAME_MEMBERS_SHOWN);
|
|
3413
|
+
memberCount = names.length;
|
|
3414
|
+
memberAadObjectIds = data.roster.memberAadObjectIds;
|
|
3415
|
+
}
|
|
3416
|
+
let name;
|
|
3417
|
+
if (topic || (memberNames && memberNames.length > 0)) {
|
|
3418
|
+
name = this.getChatDisplayName({
|
|
3419
|
+
chatType: data.chatType,
|
|
3420
|
+
topic: topic,
|
|
3421
|
+
memberNames: memberNames || [],
|
|
3422
|
+
memberCount: memberCount,
|
|
3423
|
+
});
|
|
3424
|
+
}
|
|
3425
|
+
else if ((storedChat === null || storedChat === void 0 ? void 0 : storedChat.name) && !(topicCleared && storedChat.topic)) {
|
|
3426
|
+
/*
|
|
3427
|
+
* Nothing to build a name from this time. The stored name is still the
|
|
3428
|
+
* best there is — unless it was the Teams name, and Teams just said the
|
|
3429
|
+
* chat no longer has one.
|
|
3430
|
+
*/
|
|
3431
|
+
name = storedChat.name;
|
|
3432
|
+
}
|
|
3433
|
+
else {
|
|
3434
|
+
name = this.getChatDisplayName({
|
|
3435
|
+
chatType: data.chatType,
|
|
3436
|
+
memberNames: [],
|
|
3437
|
+
});
|
|
3438
|
+
}
|
|
3439
|
+
const chat = {
|
|
3440
|
+
id: data.chatId,
|
|
3441
|
+
name: name,
|
|
3442
|
+
chatType: data.chatType,
|
|
3443
|
+
serviceUrl: data.serviceUrl,
|
|
3444
|
+
// When the chat was first connected; hearing from it again is not that.
|
|
3445
|
+
addedAt: (storedChat === null || storedChat === void 0 ? void 0 : storedChat.addedAt) || data.now,
|
|
3446
|
+
memberAadObjectIds: memberAadObjectIds,
|
|
3447
|
+
};
|
|
3448
|
+
if (topic) {
|
|
3449
|
+
chat.topic = topic;
|
|
3450
|
+
}
|
|
3451
|
+
if (memberNames !== undefined) {
|
|
3452
|
+
chat.memberNames = memberNames;
|
|
3453
|
+
}
|
|
3454
|
+
if (memberCount !== undefined) {
|
|
3455
|
+
chat.memberCount = memberCount;
|
|
3456
|
+
}
|
|
3457
|
+
return chat;
|
|
3458
|
+
}
|
|
3200
3459
|
/*
|
|
3201
3460
|
* Returns true when every connected project of this tenant already has
|
|
3202
3461
|
* this chat stored with the same service URL — i.e. there is nothing to
|
|
@@ -3239,6 +3498,20 @@ All monitoring checks are passing normally.`;
|
|
|
3239
3498
|
(chat.memberAadObjectIds || []).length === 0) {
|
|
3240
3499
|
return false;
|
|
3241
3500
|
}
|
|
3501
|
+
/*
|
|
3502
|
+
* Group chats captured before member counts were stored were also
|
|
3503
|
+
* captured before OneUptime asked Graph for their name. Re-capture
|
|
3504
|
+
* them once: that stores the roster (so the name can fall back to the
|
|
3505
|
+
* members if the chat's name is ever removed), and reads the name if
|
|
3506
|
+
* the chat already lets OneUptime read it. Chats the app was added to
|
|
3507
|
+
* with an older manifest only allow that once the app is updated in the
|
|
3508
|
+
* chat, which sends no activity — Refresh Chats picks the name up then.
|
|
3509
|
+
* A roster that could not be read leaves the count unset, so the next
|
|
3510
|
+
* message tries again.
|
|
3511
|
+
*/
|
|
3512
|
+
if (chat.chatType === "groupChat" && chat.memberCount === undefined) {
|
|
3513
|
+
return false;
|
|
3514
|
+
}
|
|
3242
3515
|
}
|
|
3243
3516
|
return true;
|
|
3244
3517
|
}
|
|
@@ -3281,9 +3554,11 @@ All monitoring checks are passing normally.`;
|
|
|
3281
3554
|
}
|
|
3282
3555
|
}
|
|
3283
3556
|
// Resolve a human friendly name for the chat.
|
|
3284
|
-
const
|
|
3285
|
-
|
|
3286
|
-
|
|
3557
|
+
const activityTopic = typeof conversation["name"] === "string"
|
|
3558
|
+
? conversation["name"].trim()
|
|
3559
|
+
: "";
|
|
3560
|
+
// null when the roster could not be read.
|
|
3561
|
+
let roster = null;
|
|
3287
3562
|
try {
|
|
3288
3563
|
const botId = (_b = data.turnContext.activity.recipient) === null || _b === void 0 ? void 0 : _b.id;
|
|
3289
3564
|
/*
|
|
@@ -3300,38 +3575,54 @@ All monitoring checks are passing normally.`;
|
|
|
3300
3575
|
const humanMembers = members.filter((member) => {
|
|
3301
3576
|
return member.id !== botId;
|
|
3302
3577
|
});
|
|
3303
|
-
|
|
3304
|
-
|
|
3305
|
-
|
|
3306
|
-
|
|
3307
|
-
|
|
3308
|
-
|
|
3309
|
-
|
|
3310
|
-
|
|
3311
|
-
|
|
3312
|
-
|
|
3313
|
-
|
|
3314
|
-
|
|
3315
|
-
|
|
3316
|
-
|
|
3317
|
-
|
|
3578
|
+
roster = {
|
|
3579
|
+
memberNames: humanMembers.map((member) => {
|
|
3580
|
+
return member.name || "";
|
|
3581
|
+
}),
|
|
3582
|
+
/*
|
|
3583
|
+
* The Entra object id is what maps a chat member back to the
|
|
3584
|
+
* OneUptime user who connected that Teams account, so personal
|
|
3585
|
+
* chats can serve as direct-message delivery targets.
|
|
3586
|
+
*/
|
|
3587
|
+
memberAadObjectIds: humanMembers
|
|
3588
|
+
.map((member) => {
|
|
3589
|
+
return member.aadObjectId || "";
|
|
3590
|
+
})
|
|
3591
|
+
.filter((aadObjectId) => {
|
|
3592
|
+
return Boolean(aadObjectId);
|
|
3593
|
+
}),
|
|
3594
|
+
};
|
|
3318
3595
|
}
|
|
3319
3596
|
catch (err) {
|
|
3320
3597
|
logger.debug("Could not fetch chat members for chat name resolution");
|
|
3321
3598
|
logger.debug(err);
|
|
3322
3599
|
}
|
|
3323
|
-
const
|
|
3324
|
-
|
|
3325
|
-
|
|
3326
|
-
|
|
3327
|
-
|
|
3328
|
-
|
|
3329
|
-
|
|
3600
|
+
const tenantChat = await this.getTenantChatContext({
|
|
3601
|
+
tenantId: tenantId,
|
|
3602
|
+
chatId: chatId,
|
|
3603
|
+
});
|
|
3604
|
+
/*
|
|
3605
|
+
* Teams does not reliably put a group chat's name on its activities, so
|
|
3606
|
+
* a named group chat would otherwise be listed by its members. Graph has
|
|
3607
|
+
* the name; ask it. Personal chats have no name to find.
|
|
3608
|
+
*/
|
|
3609
|
+
let topicLookup = undefined;
|
|
3610
|
+
if (chatType === "groupChat" && !activityTopic && tenantChat.projectId) {
|
|
3611
|
+
topicLookup = await this.getGroupChatTopicFromGraph({
|
|
3612
|
+
projectId: tenantChat.projectId,
|
|
3613
|
+
chatId: chatId,
|
|
3614
|
+
});
|
|
3615
|
+
}
|
|
3616
|
+
const chat = this.buildCapturedChat({
|
|
3617
|
+
chatId: chatId,
|
|
3330
3618
|
chatType: chatType,
|
|
3331
3619
|
serviceUrl: activityServiceUrl,
|
|
3332
|
-
|
|
3333
|
-
|
|
3334
|
-
|
|
3620
|
+
activityTopic: activityTopic,
|
|
3621
|
+
topicLookup: topicLookup,
|
|
3622
|
+
roster: roster,
|
|
3623
|
+
storedChat: tenantChat.storedChat,
|
|
3624
|
+
now: OneUptimeDate.getCurrentDate().toISOString(),
|
|
3625
|
+
});
|
|
3335
3626
|
await this.saveChatToProjectAuthTokens({
|
|
3336
3627
|
tenantId: tenantId,
|
|
3337
3628
|
chat: chat,
|
|
@@ -3440,6 +3731,303 @@ All monitoring checks are passing normally.`;
|
|
|
3440
3731
|
});
|
|
3441
3732
|
}
|
|
3442
3733
|
}
|
|
3734
|
+
/*
|
|
3735
|
+
* What a bot activity needs to know about its tenant before storing a chat:
|
|
3736
|
+
* any project connected to the tenant (bot activities identify the tenant,
|
|
3737
|
+
* not the project, and every project of a tenant yields the same Graph app
|
|
3738
|
+
* token), and the chat as it is stored now, so a re-capture builds on it.
|
|
3739
|
+
*
|
|
3740
|
+
* A failed read throws: capturing without knowing what is stored would
|
|
3741
|
+
* overwrite a chat's real name with whatever this activity could supply.
|
|
3742
|
+
*/
|
|
3743
|
+
static async getTenantChatContext(data) {
|
|
3744
|
+
var _a, _b;
|
|
3745
|
+
let projectId = null;
|
|
3746
|
+
let storedChat = undefined;
|
|
3747
|
+
const projectAuths = await WorkspaceProjectAuthTokenService.findBy({
|
|
3748
|
+
query: {
|
|
3749
|
+
workspaceType: WorkspaceType.MicrosoftTeams,
|
|
3750
|
+
workspaceProjectId: data.tenantId,
|
|
3751
|
+
},
|
|
3752
|
+
select: {
|
|
3753
|
+
_id: true,
|
|
3754
|
+
projectId: true,
|
|
3755
|
+
miscData: true,
|
|
3756
|
+
},
|
|
3757
|
+
limit: LIMIT_MAX,
|
|
3758
|
+
skip: 0,
|
|
3759
|
+
props: {
|
|
3760
|
+
isRoot: true,
|
|
3761
|
+
},
|
|
3762
|
+
});
|
|
3763
|
+
for (const projectAuth of projectAuths) {
|
|
3764
|
+
if (!projectId && projectAuth.projectId) {
|
|
3765
|
+
projectId = projectAuth.projectId;
|
|
3766
|
+
}
|
|
3767
|
+
if (!storedChat) {
|
|
3768
|
+
storedChat = (_b = (_a = projectAuth.miscData) === null || _a === void 0 ? void 0 : _a.availableChats) === null || _b === void 0 ? void 0 : _b[data.chatId];
|
|
3769
|
+
}
|
|
3770
|
+
}
|
|
3771
|
+
return { projectId: projectId, storedChat: storedChat };
|
|
3772
|
+
}
|
|
3773
|
+
/*
|
|
3774
|
+
* Reads a group chat's name from Graph (GET /chats/{id}). Only group chats
|
|
3775
|
+
* are looked up: their Bot Framework conversation id is also their Graph
|
|
3776
|
+
* chat id, and they are the only chats that can be named.
|
|
3777
|
+
*
|
|
3778
|
+
* Never throws. A refusal comes back as PermissionDenied — the app-only
|
|
3779
|
+
* token needs ChatSettings.Read.Chat (granted per chat, and chats the app
|
|
3780
|
+
* was added to before the manifest requested it do not have it) or the
|
|
3781
|
+
* tenant-wide Chat.ReadBasic.WhereInstalled. Pass accessToken when looking
|
|
3782
|
+
* up many chats, so the token is fetched once rather than once per chat.
|
|
3783
|
+
*/
|
|
3784
|
+
static async getGroupChatTopicFromGraph(data) {
|
|
3785
|
+
var _a;
|
|
3786
|
+
if (!data.chatId) {
|
|
3787
|
+
return { status: MicrosoftTeamsChatTopicLookupStatus.Unknown };
|
|
3788
|
+
}
|
|
3789
|
+
try {
|
|
3790
|
+
const accessToken = data.accessToken ||
|
|
3791
|
+
(await this.getValidAccessToken({
|
|
3792
|
+
authToken: "",
|
|
3793
|
+
projectId: data.projectId,
|
|
3794
|
+
}));
|
|
3795
|
+
const response = await API.get({
|
|
3796
|
+
url: URL.fromString(`https://graph.microsoft.com/v1.0/chats/${encodeURIComponent(data.chatId)}`),
|
|
3797
|
+
headers: {
|
|
3798
|
+
Authorization: `Bearer ${accessToken}`,
|
|
3799
|
+
"Content-Type": "application/json",
|
|
3800
|
+
},
|
|
3801
|
+
options: {
|
|
3802
|
+
timeout: MICROSOFT_TEAMS_CHAT_TOPIC_LOOKUP_TIMEOUT_IN_MS,
|
|
3803
|
+
},
|
|
3804
|
+
});
|
|
3805
|
+
if (response instanceof HTTPErrorResponse) {
|
|
3806
|
+
if (this.isGraphPermissionDeniedResponse(response)) {
|
|
3807
|
+
logger.debug(`Cannot read the name of Microsoft Teams chat ${data.chatId}: Microsoft Graph denied the request. The OneUptime app in that chat needs the ${MICROSOFT_TEAMS_CHAT_TOPIC_READ_PERMISSION} permission — update the app in the chat so Teams grants it.`);
|
|
3808
|
+
return {
|
|
3809
|
+
status: MicrosoftTeamsChatTopicLookupStatus.PermissionDenied,
|
|
3810
|
+
};
|
|
3811
|
+
}
|
|
3812
|
+
/*
|
|
3813
|
+
* A 404 for a chat the bot is in would mean the Bot Framework
|
|
3814
|
+
* conversation id is not the Graph chat id — worth seeing in
|
|
3815
|
+
* production logs, unlike a passing throttle or outage.
|
|
3816
|
+
*/
|
|
3817
|
+
if (response.statusCode === 404) {
|
|
3818
|
+
logger.warn(`Microsoft Graph has no chat with the id of Microsoft Teams chat ${data.chatId}, so its name cannot be read.`);
|
|
3819
|
+
}
|
|
3820
|
+
else {
|
|
3821
|
+
logger.debug(`Could not read Microsoft Teams chat ${data.chatId}:`);
|
|
3822
|
+
logger.debug(response);
|
|
3823
|
+
}
|
|
3824
|
+
return { status: MicrosoftTeamsChatTopicLookupStatus.Unknown };
|
|
3825
|
+
}
|
|
3826
|
+
const topic = (_a = response.data) === null || _a === void 0 ? void 0 : _a["topic"];
|
|
3827
|
+
if (typeof topic === "string" && topic.trim()) {
|
|
3828
|
+
return {
|
|
3829
|
+
status: MicrosoftTeamsChatTopicLookupStatus.Found,
|
|
3830
|
+
topic: topic.trim(),
|
|
3831
|
+
};
|
|
3832
|
+
}
|
|
3833
|
+
return { status: MicrosoftTeamsChatTopicLookupStatus.NoTopic };
|
|
3834
|
+
}
|
|
3835
|
+
catch (err) {
|
|
3836
|
+
logger.debug(`Error reading Microsoft Teams chat ${data.chatId}:`);
|
|
3837
|
+
logger.debug(err);
|
|
3838
|
+
return { status: MicrosoftTeamsChatTopicLookupStatus.Unknown };
|
|
3839
|
+
}
|
|
3840
|
+
}
|
|
3841
|
+
/*
|
|
3842
|
+
* What "Refresh Chats" does. Microsoft does not let an app list chats, but
|
|
3843
|
+
* it does let it read one it is in — so every stored group chat is re-read,
|
|
3844
|
+
* which fixes chats captured under their member names and picks up renames.
|
|
3845
|
+
*
|
|
3846
|
+
* A chat whose name was removed in Teams goes back to its member names when
|
|
3847
|
+
* they were stored with it; otherwise it keeps its current name, unless
|
|
3848
|
+
* that was the removed Teams name. A chat whose name could not be read is
|
|
3849
|
+
* left as it is and reported, so the page can say why.
|
|
3850
|
+
*
|
|
3851
|
+
* Concurrent refreshes of one project (within this App process) share a
|
|
3852
|
+
* single run, so a held-down button costs one pass over the chats, not one
|
|
3853
|
+
* per click.
|
|
3854
|
+
*/
|
|
3855
|
+
static async refreshChatNamesForProject(data) {
|
|
3856
|
+
const key = data.projectId.toString();
|
|
3857
|
+
const inFlight = this.chatNameRefreshesInFlight.get(key);
|
|
3858
|
+
if (inFlight) {
|
|
3859
|
+
return inFlight;
|
|
3860
|
+
}
|
|
3861
|
+
const refresh = this.runChatNameRefresh(data).finally(() => {
|
|
3862
|
+
this.chatNameRefreshesInFlight.delete(key);
|
|
3863
|
+
});
|
|
3864
|
+
this.chatNameRefreshesInFlight.set(key, refresh);
|
|
3865
|
+
return refresh;
|
|
3866
|
+
}
|
|
3867
|
+
static async runChatNameRefresh(data) {
|
|
3868
|
+
var _a;
|
|
3869
|
+
const projectAuth = await WorkspaceProjectAuthTokenService.getProjectAuth({
|
|
3870
|
+
projectId: data.projectId,
|
|
3871
|
+
workspaceType: WorkspaceType.MicrosoftTeams,
|
|
3872
|
+
});
|
|
3873
|
+
const storedChats = ((_a = projectAuth === null || projectAuth === void 0 ? void 0 : projectAuth.miscData) === null || _a === void 0 ? void 0 : _a.availableChats) || {};
|
|
3874
|
+
const result = {
|
|
3875
|
+
chats: Object.assign({}, storedChats),
|
|
3876
|
+
permissionDeniedChatIds: [],
|
|
3877
|
+
failedChatIds: [],
|
|
3878
|
+
};
|
|
3879
|
+
const tenantId = projectAuth === null || projectAuth === void 0 ? void 0 : projectAuth.workspaceProjectId;
|
|
3880
|
+
const groupChats = Object.values(storedChats).filter((chat) => {
|
|
3881
|
+
return Boolean(chat && chat.id && chat.chatType === "groupChat");
|
|
3882
|
+
});
|
|
3883
|
+
if (!tenantId || groupChats.length === 0) {
|
|
3884
|
+
return result;
|
|
3885
|
+
}
|
|
3886
|
+
/*
|
|
3887
|
+
* One token for every lookup. Without one nothing can be read, and that
|
|
3888
|
+
* is a failure the caller must see — not a refresh that silently changed
|
|
3889
|
+
* nothing.
|
|
3890
|
+
*/
|
|
3891
|
+
const accessToken = await this.getValidAccessToken({
|
|
3892
|
+
authToken: "",
|
|
3893
|
+
projectId: data.projectId,
|
|
3894
|
+
});
|
|
3895
|
+
const updates = {};
|
|
3896
|
+
for (let index = 0; index < groupChats.length; index += MICROSOFT_TEAMS_CHAT_TOPIC_LOOKUP_CONCURRENCY) {
|
|
3897
|
+
const batch = groupChats.slice(index, index + MICROSOFT_TEAMS_CHAT_TOPIC_LOOKUP_CONCURRENCY);
|
|
3898
|
+
const lookups = await Promise.all(batch.map((chat) => {
|
|
3899
|
+
return this.getGroupChatTopicFromGraph({
|
|
3900
|
+
projectId: data.projectId,
|
|
3901
|
+
chatId: chat.id,
|
|
3902
|
+
accessToken: accessToken,
|
|
3903
|
+
});
|
|
3904
|
+
}));
|
|
3905
|
+
batch.forEach((chat, batchIndex) => {
|
|
3906
|
+
const lookup = lookups[batchIndex];
|
|
3907
|
+
if (lookup.status === MicrosoftTeamsChatTopicLookupStatus.PermissionDenied) {
|
|
3908
|
+
result.permissionDeniedChatIds.push(chat.id);
|
|
3909
|
+
return;
|
|
3910
|
+
}
|
|
3911
|
+
if (lookup.status === MicrosoftTeamsChatTopicLookupStatus.Unknown) {
|
|
3912
|
+
result.failedChatIds.push(chat.id);
|
|
3913
|
+
return;
|
|
3914
|
+
}
|
|
3915
|
+
const update = this.getChatNameUpdate({
|
|
3916
|
+
chat: chat,
|
|
3917
|
+
lookup: lookup,
|
|
3918
|
+
});
|
|
3919
|
+
if (update.name !== chat.name || update.topic !== chat.topic) {
|
|
3920
|
+
updates[chat.id] = update;
|
|
3921
|
+
}
|
|
3922
|
+
});
|
|
3923
|
+
}
|
|
3924
|
+
if (Object.keys(updates).length > 0) {
|
|
3925
|
+
await this.renameChatsInProjectAuthTokens({
|
|
3926
|
+
tenantId: tenantId,
|
|
3927
|
+
chatNames: updates,
|
|
3928
|
+
});
|
|
3929
|
+
}
|
|
3930
|
+
/*
|
|
3931
|
+
* What is stored now, whether or not anything was renamed: a chat
|
|
3932
|
+
* removed while names were being read is gone, and is not reported.
|
|
3933
|
+
*/
|
|
3934
|
+
result.chats = await this.getChatsForProject({
|
|
3935
|
+
projectId: data.projectId,
|
|
3936
|
+
});
|
|
3937
|
+
return result;
|
|
3938
|
+
}
|
|
3939
|
+
// The name a stored group chat gets from a lookup that Graph answered.
|
|
3940
|
+
static getChatNameUpdate(data) {
|
|
3941
|
+
const chat = data.chat;
|
|
3942
|
+
if (data.lookup.status === MicrosoftTeamsChatTopicLookupStatus.Found &&
|
|
3943
|
+
data.lookup.topic) {
|
|
3944
|
+
return {
|
|
3945
|
+
name: this.getChatDisplayName({
|
|
3946
|
+
chatType: chat.chatType,
|
|
3947
|
+
topic: data.lookup.topic,
|
|
3948
|
+
memberNames: [],
|
|
3949
|
+
}),
|
|
3950
|
+
topic: data.lookup.topic,
|
|
3951
|
+
};
|
|
3952
|
+
}
|
|
3953
|
+
// The chat has no name in Teams.
|
|
3954
|
+
if (chat.memberNames && chat.memberNames.length > 0) {
|
|
3955
|
+
return {
|
|
3956
|
+
name: this.getChatDisplayName({
|
|
3957
|
+
chatType: chat.chatType,
|
|
3958
|
+
memberNames: chat.memberNames,
|
|
3959
|
+
memberCount: chat.memberCount,
|
|
3960
|
+
}),
|
|
3961
|
+
};
|
|
3962
|
+
}
|
|
3963
|
+
/*
|
|
3964
|
+
* No members to name it after. Keep the current name — unless it was the
|
|
3965
|
+
* Teams name that has just been removed.
|
|
3966
|
+
*/
|
|
3967
|
+
return {
|
|
3968
|
+
name: chat.topic
|
|
3969
|
+
? this.getChatDisplayName({ chatType: chat.chatType, memberNames: [] })
|
|
3970
|
+
: chat.name,
|
|
3971
|
+
};
|
|
3972
|
+
}
|
|
3973
|
+
/*
|
|
3974
|
+
* Sets the name (and the Teams name it came from) of chats already stored
|
|
3975
|
+
* for a tenant, on every connected project. Only those fields are written,
|
|
3976
|
+
* onto each record as it is now — a chat removed or re-captured while names
|
|
3977
|
+
* were being looked up is neither resurrected nor rolled back.
|
|
3978
|
+
*/
|
|
3979
|
+
static async renameChatsInProjectAuthTokens(data) {
|
|
3980
|
+
const projectAuths = await WorkspaceProjectAuthTokenService.findBy({
|
|
3981
|
+
query: {
|
|
3982
|
+
workspaceType: WorkspaceType.MicrosoftTeams,
|
|
3983
|
+
workspaceProjectId: data.tenantId,
|
|
3984
|
+
},
|
|
3985
|
+
select: {
|
|
3986
|
+
_id: true,
|
|
3987
|
+
miscData: true,
|
|
3988
|
+
},
|
|
3989
|
+
limit: LIMIT_MAX,
|
|
3990
|
+
skip: 0,
|
|
3991
|
+
props: {
|
|
3992
|
+
isRoot: true,
|
|
3993
|
+
},
|
|
3994
|
+
});
|
|
3995
|
+
for (const projectAuth of projectAuths) {
|
|
3996
|
+
const miscData = Object.assign({}, (projectAuth.miscData || {}));
|
|
3997
|
+
const availableChats = Object.assign({}, (miscData.availableChats || {}));
|
|
3998
|
+
let changed = false;
|
|
3999
|
+
for (const [chatId, update] of Object.entries(data.chatNames)) {
|
|
4000
|
+
const existingChat = availableChats[chatId];
|
|
4001
|
+
if (!existingChat ||
|
|
4002
|
+
(existingChat.name === update.name &&
|
|
4003
|
+
existingChat.topic === update.topic)) {
|
|
4004
|
+
continue;
|
|
4005
|
+
}
|
|
4006
|
+
const renamedChat = Object.assign(Object.assign({}, existingChat), { name: update.name });
|
|
4007
|
+
if (update.topic) {
|
|
4008
|
+
renamedChat.topic = update.topic;
|
|
4009
|
+
}
|
|
4010
|
+
else {
|
|
4011
|
+
delete renamedChat.topic;
|
|
4012
|
+
}
|
|
4013
|
+
availableChats[chatId] = renamedChat;
|
|
4014
|
+
changed = true;
|
|
4015
|
+
}
|
|
4016
|
+
if (!changed) {
|
|
4017
|
+
continue;
|
|
4018
|
+
}
|
|
4019
|
+
miscData.availableChats = availableChats;
|
|
4020
|
+
await WorkspaceProjectAuthTokenService.updateOneById({
|
|
4021
|
+
id: projectAuth.id,
|
|
4022
|
+
data: {
|
|
4023
|
+
miscData: miscData,
|
|
4024
|
+
},
|
|
4025
|
+
props: {
|
|
4026
|
+
isRoot: true,
|
|
4027
|
+
},
|
|
4028
|
+
});
|
|
4029
|
+
}
|
|
4030
|
+
}
|
|
3443
4031
|
static async getChatsForProject(data) {
|
|
3444
4032
|
const projectAuth = await WorkspaceProjectAuthTokenService.getProjectAuth({
|
|
3445
4033
|
projectId: data.projectId,
|
|
@@ -3865,8 +4453,17 @@ All monitoring checks are passing normally.`;
|
|
|
3865
4453
|
from: (_a = context.activity.from) === null || _a === void 0 ? void 0 : _a.name,
|
|
3866
4454
|
conversationId: (_b = context.activity.conversation) === null || _b === void 0 ? void 0 : _b.id,
|
|
3867
4455
|
}));
|
|
3868
|
-
|
|
3869
|
-
|
|
4456
|
+
try {
|
|
4457
|
+
// Run the activity through our activity handler
|
|
4458
|
+
await activityHandler.run(context);
|
|
4459
|
+
}
|
|
4460
|
+
catch (error) {
|
|
4461
|
+
// Never answer Teams with a 500; see recoverFromFailedTurn.
|
|
4462
|
+
await MicrosoftTeamsUtil.recoverFromFailedTurn({
|
|
4463
|
+
turnContext: context,
|
|
4464
|
+
error: error,
|
|
4465
|
+
});
|
|
4466
|
+
}
|
|
3870
4467
|
});
|
|
3871
4468
|
logger.debug("Bot Framework activity processed successfully");
|
|
3872
4469
|
}
|
|
@@ -4266,9 +4863,8 @@ All monitoring checks are passing normally.`;
|
|
|
4266
4863
|
}
|
|
4267
4864
|
const body = msg["body"];
|
|
4268
4865
|
let text = (body === null || body === void 0 ? void 0 : body["content"]) || "";
|
|
4269
|
-
//
|
|
4270
|
-
text = text.
|
|
4271
|
-
text = text.trim();
|
|
4866
|
+
// Teams message bodies are HTML.
|
|
4867
|
+
text = this.stripHtmlTags(text).trim();
|
|
4272
4868
|
// Skip empty messages
|
|
4273
4869
|
if (!text) {
|
|
4274
4870
|
continue;
|
|
@@ -4323,6 +4919,8 @@ MicrosoftTeamsUtil.AI_OPS_ACK_TEXT = "Looking into it…";
|
|
|
4323
4919
|
* engine also clamps history internally, but we keep the payload small.
|
|
4324
4920
|
*/
|
|
4325
4921
|
MicrosoftTeamsUtil.AI_OPS_MAX_HISTORY_TURNS = 12;
|
|
4922
|
+
// Refreshes in progress, by project: a second click joins the first.
|
|
4923
|
+
MicrosoftTeamsUtil.chatNameRefreshesInFlight = new Map();
|
|
4326
4924
|
export default MicrosoftTeamsUtil;
|
|
4327
4925
|
__decorate([
|
|
4328
4926
|
CaptureSpan(),
|
|
@@ -4618,6 +5216,24 @@ __decorate([
|
|
|
4618
5216
|
__metadata("design:paramtypes", [Object]),
|
|
4619
5217
|
__metadata("design:returntype", Promise)
|
|
4620
5218
|
], MicrosoftTeamsUtil, "removeChatFromProjectAuthTokens", null);
|
|
5219
|
+
__decorate([
|
|
5220
|
+
CaptureSpan(),
|
|
5221
|
+
__metadata("design:type", Function),
|
|
5222
|
+
__metadata("design:paramtypes", [Object]),
|
|
5223
|
+
__metadata("design:returntype", Promise)
|
|
5224
|
+
], MicrosoftTeamsUtil, "getGroupChatTopicFromGraph", null);
|
|
5225
|
+
__decorate([
|
|
5226
|
+
CaptureSpan(),
|
|
5227
|
+
__metadata("design:type", Function),
|
|
5228
|
+
__metadata("design:paramtypes", [Object]),
|
|
5229
|
+
__metadata("design:returntype", Promise)
|
|
5230
|
+
], MicrosoftTeamsUtil, "runChatNameRefresh", null);
|
|
5231
|
+
__decorate([
|
|
5232
|
+
CaptureSpan(),
|
|
5233
|
+
__metadata("design:type", Function),
|
|
5234
|
+
__metadata("design:paramtypes", [Object]),
|
|
5235
|
+
__metadata("design:returntype", Promise)
|
|
5236
|
+
], MicrosoftTeamsUtil, "renameChatsInProjectAuthTokens", null);
|
|
4621
5237
|
__decorate([
|
|
4622
5238
|
CaptureSpan(),
|
|
4623
5239
|
__metadata("design:type", Function),
|