@oneuptime/common 14.0.8 → 14.0.9
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/Index.ts +2 -0
- package/Models/DatabaseModels/KubernetesAiAgent.ts +364 -0
- package/Models/DatabaseModels/KubernetesCluster.ts +3 -3
- package/Models/DatabaseModels/Project.ts +55 -5
- package/Models/DatabaseModels/ProxmoxResource.ts +49 -1
- package/Models/DatabaseModels/RunnerJob.ts +75 -0
- package/Models/DatabaseModels/TeamComplianceSetting.ts +143 -2
- 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 +207 -25
- package/Server/API/KubernetesClusterAiAccessAPI.ts +623 -21
- package/Server/API/MicrosoftTeamsAPI.ts +93 -14
- package/Server/API/ProxmoxResourceAPI.ts +244 -14
- 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/Index.ts +6 -0
- package/Server/Middleware/TelemetryIngest.ts +41 -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/AutoRemediationRuleService.ts +1 -1
- 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/ProjectService.ts +32 -0
- package/Server/Services/ProxmoxResourceService.ts +322 -5
- package/Server/Services/RunnerJobService.ts +241 -104
- 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/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 +37 -15
- package/Server/Utils/AI/Remediation/RemediationExecutionRunner.ts +67 -24
- package/Server/Utils/AI/SRE/AIInvestigationEngine.ts +48 -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 +6 -1
- 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/MicrosoftTeams.ts +684 -47
- 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 +91 -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/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/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/RowActionPlacementOverrides.test.tsx +865 -0
- package/Tests/App/Dashboard/RumOverviewTimeRangeZoom.test.tsx +877 -0
- 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/KubernetesAiAgentModel.test.ts +295 -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/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/Infrastructure/GlobalCache.test.ts +195 -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/AddTeamComplianceRuleScopeMigration.test.ts +622 -0
- package/Tests/Server/Middleware/TelemetryIngestBrowserKey.test.ts +61 -4
- package/Tests/Server/Middleware/TelemetryIngestKubernetesAgentRunnerPinnedKey.test.ts +98 -2
- package/Tests/Server/Middleware/TelemetryIngestKubernetesAgentRunnerRateLimit.test.ts +105 -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/AutoRemediationRuleCommandRunners.test.ts +2 -1
- 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/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/RunnerJobEnqueueKubectl.test.ts +48 -15
- package/Tests/Server/Services/RunnerJobEnqueueKubectlAiAgent.test.ts +620 -0
- package/Tests/Server/Services/RunnerJobKubectlWriteScope.test.ts +170 -3
- 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/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/KubectlInvestigationToolkit.test.ts +70 -0
- package/Tests/Server/Utils/AI/KubectlJobRunnerFinishedJob.test.ts +58 -0
- 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/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/RemediationKubectlCopyParity.test.ts +2 -0
- package/Tests/Server/Utils/AutoRemediation/CommandPlanExecutor.test.ts +2 -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/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 +45 -3
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsChats.test.ts +25 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsGroupChatNames.test.ts +3119 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsGroupChatNamesPostgres.test.ts +1721 -0
- package/Tests/Types/Kubernetes/KubernetesAgentChartAiAccess.test.ts +581 -113
- package/Tests/Types/Kubernetes/KubernetesAiAgentAccessContract.test.ts +510 -0
- 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/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/Dashboard/DashboardTimeRangeZoom.test.ts +104 -1
- package/Types/AI/AIRunType.ts +9 -4
- package/Types/AI/InvestigationNotStartedReason.ts +6 -0
- package/Types/AutoRemediation/AiRemediationCommandPlan.ts +14 -16
- 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/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 +28 -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/AiRemediation/CommandPolicy.ts +1 -1
- package/Utils/AiRemediation/KubectlPolicy.ts +1 -1
- package/Utils/Dashboard/DashboardTimeRangeZoom.ts +46 -2
- package/build/dist/Models/DatabaseModels/Index.js +2 -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/Project.js +56 -5
- package/build/dist/Models/DatabaseModels/Project.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/RunnerJob.js +74 -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/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 +144 -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/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/Index.js +6 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Middleware/TelemetryIngest.js +34 -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/AutoRemediationRuleService.js +1 -1
- package/build/dist/Server/Services/AutoRemediationRuleService.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/ProjectService.js +22 -0
- package/build/dist/Server/Services/ProjectService.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/RunnerJobService.js +178 -92
- 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/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 +29 -15
- package/build/dist/Server/Utils/AI/Remediation/RemediationCommandTools.js.map +1 -1
- package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js +56 -20
- package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js +39 -5
- package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.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 +4 -2
- package/build/dist/Server/Utils/AutoRemediation/CommandPlanExecutor.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/MicrosoftTeams.js +505 -42
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
- package/build/dist/Types/AI/AIRunType.js +9 -4
- package/build/dist/Types/AI/AIRunType.js.map +1 -1
- package/build/dist/Types/AutoRemediation/AiRemediationCommandPlan.js +10 -16
- 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/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 +25 -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/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/Dashboard/DashboardTimeRangeZoom.js +27 -1
- package/build/dist/Utils/Dashboard/DashboardTimeRangeZoom.js.map +1 -1
- package/package.json +1 -1
|
@@ -171,10 +171,28 @@ interface AddedStatusPagesDecision {
|
|
|
171
171
|
|
|
172
172
|
// key is incidentId for this dictionary.
|
|
173
173
|
type UpdateCarryForward = Dictionary<{
|
|
174
|
+
/*
|
|
175
|
+
* The monitors the update takes off and puts on the incident. Both are
|
|
176
|
+
* empty unless the update sends the monitor list.
|
|
177
|
+
*/
|
|
174
178
|
monitorsRemoved: Array<Monitor>;
|
|
175
179
|
monitorsAdded: Array<Monitor>;
|
|
180
|
+
/*
|
|
181
|
+
* Whether the incident was resolved before the update, which decides if
|
|
182
|
+
* the monitors taken off it are restored. Read before the write, since the
|
|
183
|
+
* same update may resolve or reopen it, and only when a monitor is taken
|
|
184
|
+
* off (undefined otherwise).
|
|
185
|
+
*/
|
|
186
|
+
isResolvedBeforeUpdate?: boolean | undefined;
|
|
187
|
+
// The monitor status the incident put its monitors in before the update.
|
|
176
188
|
oldChangeMonitorStatusIdTo: ObjectID | undefined;
|
|
189
|
+
// The monitor status the update writes; undefined when it writes none.
|
|
177
190
|
newMonitorChangeStatusIdTo: ObjectID | undefined;
|
|
191
|
+
/*
|
|
192
|
+
* The update sets the incident's monitor status to nothing, so the
|
|
193
|
+
* incident no longer puts its monitors, old or added, in any status.
|
|
194
|
+
*/
|
|
195
|
+
isChangeMonitorStatusToCleared?: boolean | undefined;
|
|
178
196
|
statusPageScopeChange?: StatusPageScopeCarryForward | undefined;
|
|
179
197
|
}>;
|
|
180
198
|
|
|
@@ -523,9 +541,10 @@ export class Service extends DatabaseService<Model> {
|
|
|
523
541
|
updateBy: UpdateBy<Model>,
|
|
524
542
|
): Promise<OnUpdate<Model>> {
|
|
525
543
|
/*
|
|
526
|
-
*
|
|
527
|
-
*
|
|
528
|
-
*
|
|
544
|
+
* Records which monitors the update takes off and puts on each incident,
|
|
545
|
+
* the monitor status it writes, and whether the incident was resolved
|
|
546
|
+
* before it, for onUpdateSuccess to decide what that does to the
|
|
547
|
+
* monitors (updateMonitorsForIncidentEdit).
|
|
529
548
|
*/
|
|
530
549
|
|
|
531
550
|
updateBy.query = applyIncidentSelfPrivacyFilter(
|
|
@@ -554,8 +573,19 @@ export class Service extends DatabaseService<Model> {
|
|
|
554
573
|
|
|
555
574
|
const carryForward: UpdateCarryForward = {};
|
|
556
575
|
|
|
576
|
+
const data: Dictionary<unknown> = updateBy.data as Dictionary<unknown>;
|
|
577
|
+
|
|
578
|
+
/*
|
|
579
|
+
* Only an update that sends the monitor list changes which monitors the
|
|
580
|
+
* incident holds. One that sends just the monitor status (the API, the
|
|
581
|
+
* CLI or a workflow) takes no monitor off: reading the missing list as
|
|
582
|
+
* empty would restore every monitor, and walking it threw. A list set to
|
|
583
|
+
* null is sent: TypeORM clears a many-to-many set to null, like [].
|
|
584
|
+
*/
|
|
585
|
+
const isMonitorListUpdated: boolean = data["monitors"] !== undefined;
|
|
586
|
+
|
|
557
587
|
if (
|
|
558
|
-
|
|
588
|
+
isMonitorListUpdated ||
|
|
559
589
|
updateBy.data.changeMonitorStatusTo ||
|
|
560
590
|
updateBy.data.changeMonitorStatusToId
|
|
561
591
|
) {
|
|
@@ -573,64 +603,69 @@ export class Service extends DatabaseService<Model> {
|
|
|
573
603
|
props: updateBy.props,
|
|
574
604
|
});
|
|
575
605
|
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
isRemoved = false;
|
|
599
|
-
break;
|
|
600
|
-
}
|
|
601
|
-
}
|
|
606
|
+
/*
|
|
607
|
+
* The monitor status the update writes, in any shape the API accepts
|
|
608
|
+
* (an id, a bare uuid string or a relation object), so the status an
|
|
609
|
+
* update writes is never mistaken for one it leaves alone.
|
|
610
|
+
*/
|
|
611
|
+
const monitorStatusIdInUpdate: ObjectID | string | undefined =
|
|
612
|
+
resolveReferenceId(data["changeMonitorStatusToId"]) ||
|
|
613
|
+
resolveReferenceId(data["changeMonitorStatusTo"]);
|
|
614
|
+
|
|
615
|
+
const newMonitorChangeStatusIdTo: ObjectID | undefined =
|
|
616
|
+
monitorStatusIdInUpdate
|
|
617
|
+
? new ObjectID(monitorStatusIdInUpdate.toString())
|
|
618
|
+
: undefined;
|
|
619
|
+
|
|
620
|
+
const isChangeMonitorStatusToCleared: boolean =
|
|
621
|
+
!newMonitorChangeStatusIdTo &&
|
|
622
|
+
(data["changeMonitorStatusToId"] === null ||
|
|
623
|
+
data["changeMonitorStatusTo"] === null);
|
|
624
|
+
|
|
625
|
+
const monitorIdsAfterUpdate: Array<string> = isMonitorListUpdated
|
|
626
|
+
? this.getMonitorIdsInUpdate(data["monitors"])
|
|
627
|
+
: [];
|
|
602
628
|
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
monitor,
|
|
606
|
-
);
|
|
607
|
-
}
|
|
608
|
-
}
|
|
629
|
+
for (const incident of incidentsToUpdate) {
|
|
630
|
+
const storedMonitors: Array<Monitor> = incident.monitors || [];
|
|
609
631
|
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
for (const existingMonitor of incident.monitors || []) {
|
|
617
|
-
if (
|
|
618
|
-
existingMonitor._id &&
|
|
619
|
-
existingMonitor._id.toString() === monitor._id?.toString()
|
|
620
|
-
) {
|
|
621
|
-
isAdded = false;
|
|
622
|
-
break;
|
|
623
|
-
}
|
|
624
|
-
}
|
|
632
|
+
const storedMonitorIds: Array<string> = storedMonitors.map(
|
|
633
|
+
(monitor: Monitor): string => {
|
|
634
|
+
return this.getMonitorIdForComparison(monitor);
|
|
635
|
+
},
|
|
636
|
+
);
|
|
625
637
|
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
monitor,
|
|
638
|
+
const monitorsRemoved: Array<Monitor> = isMonitorListUpdated
|
|
639
|
+
? storedMonitors.filter((monitor: Monitor): boolean => {
|
|
640
|
+
return !monitorIdsAfterUpdate.includes(
|
|
641
|
+
this.getMonitorIdForComparison(monitor),
|
|
630
642
|
);
|
|
631
|
-
}
|
|
632
|
-
|
|
633
|
-
|
|
643
|
+
})
|
|
644
|
+
: [];
|
|
645
|
+
|
|
646
|
+
carryForward[incident.id!.toString()] = {
|
|
647
|
+
monitorsRemoved: monitorsRemoved,
|
|
648
|
+
/*
|
|
649
|
+
* Read now, before the write: an update that resolves the incident
|
|
650
|
+
* and takes a monitor off must still restore that monitor, and one
|
|
651
|
+
* that reopens a resolved incident must not restore it twice.
|
|
652
|
+
* After the write, the state no longer tells these cases apart.
|
|
653
|
+
*/
|
|
654
|
+
isResolvedBeforeUpdate:
|
|
655
|
+
monitorsRemoved.length > 0
|
|
656
|
+
? await this.isIncidentResolved({ incidentId: incident.id! })
|
|
657
|
+
: undefined,
|
|
658
|
+
monitorsAdded: monitorIdsAfterUpdate
|
|
659
|
+
.filter((monitorId: string): boolean => {
|
|
660
|
+
return !storedMonitorIds.includes(monitorId);
|
|
661
|
+
})
|
|
662
|
+
.map((monitorId: string): Monitor => {
|
|
663
|
+
return new Monitor(new ObjectID(monitorId));
|
|
664
|
+
}),
|
|
665
|
+
oldChangeMonitorStatusIdTo: incident.changeMonitorStatusToId,
|
|
666
|
+
newMonitorChangeStatusIdTo: newMonitorChangeStatusIdTo,
|
|
667
|
+
isChangeMonitorStatusToCleared: isChangeMonitorStatusToCleared,
|
|
668
|
+
};
|
|
634
669
|
}
|
|
635
670
|
}
|
|
636
671
|
|
|
@@ -705,6 +740,35 @@ export class Service extends DatabaseService<Model> {
|
|
|
705
740
|
};
|
|
706
741
|
}
|
|
707
742
|
|
|
743
|
+
/*
|
|
744
|
+
* The ids of the monitors an update's list holds, deduplicated and
|
|
745
|
+
* lowercased like getMonitorIdForComparison. The list reaches the hook as
|
|
746
|
+
* models, `{ _id }` objects, ObjectIDs or bare uuid strings (API update),
|
|
747
|
+
* and comparing only `_id` read every bare id as a monitor taken off and
|
|
748
|
+
* put back on again.
|
|
749
|
+
*/
|
|
750
|
+
private getMonitorIdsInUpdate(monitors: unknown): Array<string> {
|
|
751
|
+
const monitorIds: Array<string> = [];
|
|
752
|
+
|
|
753
|
+
for (const monitorId of resolveReferenceIds(monitors)) {
|
|
754
|
+
const normalizedMonitorId: string = monitorId
|
|
755
|
+
.toString()
|
|
756
|
+
.trim()
|
|
757
|
+
.toLowerCase();
|
|
758
|
+
|
|
759
|
+
if (!monitorIds.includes(normalizedMonitorId)) {
|
|
760
|
+
monitorIds.push(normalizedMonitorId);
|
|
761
|
+
}
|
|
762
|
+
}
|
|
763
|
+
|
|
764
|
+
return monitorIds;
|
|
765
|
+
}
|
|
766
|
+
|
|
767
|
+
// A monitor's id as getMonitorIdsInUpdate writes it, for comparing the two.
|
|
768
|
+
private getMonitorIdForComparison(monitor: Monitor): string {
|
|
769
|
+
return (monitor._id?.toString() || "").trim().toLowerCase();
|
|
770
|
+
}
|
|
771
|
+
|
|
708
772
|
/*
|
|
709
773
|
* The incidents an update will write to, as they are stored, for the hooks
|
|
710
774
|
* below that decide what else joins the update.
|
|
@@ -4352,12 +4416,6 @@ ${incidentSeverity.name}
|
|
|
4352
4416
|
},
|
|
4353
4417
|
});
|
|
4354
4418
|
|
|
4355
|
-
// change these monitors back to operational state.
|
|
4356
|
-
await this.markMonitorsActiveForMonitoring(
|
|
4357
|
-
projectId!,
|
|
4358
|
-
incidentCarryForward.monitorsRemoved,
|
|
4359
|
-
);
|
|
4360
|
-
|
|
4361
4419
|
feedInfoInMarkdown += `\n\n**🗑️ Monitors Removed**:\n`;
|
|
4362
4420
|
|
|
4363
4421
|
for (const monitor of monitorsRemoved) {
|
|
@@ -4417,9 +4475,11 @@ ${incidentSeverity.name}
|
|
|
4417
4475
|
change: incidentCarryForward.statusPageScopeChange,
|
|
4418
4476
|
});
|
|
4419
4477
|
|
|
4478
|
+
// Saving the status the incident already had changes nothing.
|
|
4420
4479
|
if (
|
|
4421
4480
|
incidentCarryForward.oldChangeMonitorStatusIdTo &&
|
|
4422
|
-
incidentCarryForward.newMonitorChangeStatusIdTo
|
|
4481
|
+
incidentCarryForward.newMonitorChangeStatusIdTo &&
|
|
4482
|
+
this.isMonitorStatusChangedByUpdate(incidentCarryForward)
|
|
4423
4483
|
) {
|
|
4424
4484
|
const oldMonitorStatus: MonitorStatus | null =
|
|
4425
4485
|
await MonitorStatusService.findOneBy({
|
|
@@ -4453,45 +4513,13 @@ ${incidentSeverity.name}
|
|
|
4453
4513
|
}
|
|
4454
4514
|
}
|
|
4455
4515
|
|
|
4456
|
-
|
|
4457
|
-
|
|
4458
|
-
|
|
4459
|
-
|
|
4460
|
-
|
|
4461
|
-
|
|
4462
|
-
}
|
|
4463
|
-
|
|
4464
|
-
if (changeNewMonitorStatusTo) {
|
|
4465
|
-
const incident: Model | null = await this.findOneById({
|
|
4466
|
-
id: incidentId,
|
|
4467
|
-
select: {
|
|
4468
|
-
projectId: true,
|
|
4469
|
-
monitors: {
|
|
4470
|
-
_id: true,
|
|
4471
|
-
},
|
|
4472
|
-
},
|
|
4473
|
-
props: {
|
|
4474
|
-
isRoot: true,
|
|
4475
|
-
},
|
|
4476
|
-
});
|
|
4477
|
-
|
|
4478
|
-
const monitorsForThisIncident: Array<Monitor> =
|
|
4479
|
-
incident?.monitors || [];
|
|
4480
|
-
|
|
4481
|
-
await MonitorService.changeMonitorStatus(
|
|
4482
|
-
projectId!,
|
|
4483
|
-
monitorsForThisIncident.map((monitor: Monitor) => {
|
|
4484
|
-
return new ObjectID(monitor._id?.toString() || "");
|
|
4485
|
-
}),
|
|
4486
|
-
changeNewMonitorStatusTo,
|
|
4487
|
-
true, // notifyMonitorOwners
|
|
4488
|
-
"Status was changed because Incident " +
|
|
4489
|
-
incidentNumberDisplay +
|
|
4490
|
-
" was updated.",
|
|
4491
|
-
undefined,
|
|
4492
|
-
onUpdate.updateBy.props,
|
|
4493
|
-
);
|
|
4494
|
-
}
|
|
4516
|
+
await this.updateMonitorsForIncidentEdit({
|
|
4517
|
+
projectId: projectId,
|
|
4518
|
+
incidentId: incidentId,
|
|
4519
|
+
incidentNumberDisplay: incidentNumberDisplay,
|
|
4520
|
+
carryForward: incidentCarryForward,
|
|
4521
|
+
props: onUpdate.updateBy.props,
|
|
4522
|
+
});
|
|
4495
4523
|
}
|
|
4496
4524
|
}
|
|
4497
4525
|
|
|
@@ -4514,6 +4542,154 @@ ${incidentSeverity.name}
|
|
|
4514
4542
|
return onUpdate;
|
|
4515
4543
|
}
|
|
4516
4544
|
|
|
4545
|
+
/*
|
|
4546
|
+
* Whether an update puts the incident's monitors in a different status
|
|
4547
|
+
* from the one it held: it writes a status, and not the same one again.
|
|
4548
|
+
*/
|
|
4549
|
+
private isMonitorStatusChangedByUpdate(
|
|
4550
|
+
carryForward: UpdateCarryForward[string],
|
|
4551
|
+
): boolean {
|
|
4552
|
+
if (!carryForward.newMonitorChangeStatusIdTo) {
|
|
4553
|
+
return false;
|
|
4554
|
+
}
|
|
4555
|
+
|
|
4556
|
+
return (
|
|
4557
|
+
carryForward.newMonitorChangeStatusIdTo.toString().toLowerCase() !==
|
|
4558
|
+
(carryForward.oldChangeMonitorStatusIdTo?.toString() || "").toLowerCase()
|
|
4559
|
+
);
|
|
4560
|
+
}
|
|
4561
|
+
|
|
4562
|
+
/*
|
|
4563
|
+
* What an edit of an incident's monitors, or of the status it puts them
|
|
4564
|
+
* in, does to the monitors themselves. The feed item records the edit
|
|
4565
|
+
* either way; this only decides which monitors change.
|
|
4566
|
+
*
|
|
4567
|
+
* The monitors taken off the incident are restored, unless another open
|
|
4568
|
+
* incident still holds them (markMonitorsActiveForMonitoring), when the
|
|
4569
|
+
* incident was open before the update. That includes an update that
|
|
4570
|
+
* resolves it as well: resolving restores only the monitors it still
|
|
4571
|
+
* holds (IncidentStateTimelineService), so this is the only restore the
|
|
4572
|
+
* ones taken off get. A monitor taken off an incident that was resolved
|
|
4573
|
+
* already was restored when it resolved, and restoring it again could
|
|
4574
|
+
* overwrite a status set since (maintenance, or a manual monitor's status
|
|
4575
|
+
* set by hand).
|
|
4576
|
+
*
|
|
4577
|
+
* A resolved incident, as it stands after the update, does nothing else
|
|
4578
|
+
* to its monitors. Nothing would clear what it did: an added monitor of a
|
|
4579
|
+
* manual incident would never be probed again, and the incident's status
|
|
4580
|
+
* would sit on its monitors as false downtime.
|
|
4581
|
+
*
|
|
4582
|
+
* An open incident:
|
|
4583
|
+
* - stops probing the monitors of a manual incident when one is added,
|
|
4584
|
+
* as creating it did (disableActiveMonitoringIfManualIncident);
|
|
4585
|
+
* - puts the monitors added in its status, and all of its monitors only
|
|
4586
|
+
* when the edit changes that status. Every save used to put all of them
|
|
4587
|
+
* in it again, overwriting a status a probe had set since.
|
|
4588
|
+
*/
|
|
4589
|
+
private async updateMonitorsForIncidentEdit(data: {
|
|
4590
|
+
projectId: ObjectID;
|
|
4591
|
+
incidentId: ObjectID;
|
|
4592
|
+
incidentNumberDisplay: string;
|
|
4593
|
+
carryForward: UpdateCarryForward[string];
|
|
4594
|
+
props: DatabaseCommonInteractionProps;
|
|
4595
|
+
}): Promise<void> {
|
|
4596
|
+
const carryForward: UpdateCarryForward[string] = data.carryForward;
|
|
4597
|
+
|
|
4598
|
+
if (
|
|
4599
|
+
carryForward.monitorsRemoved.length > 0 &&
|
|
4600
|
+
!carryForward.isResolvedBeforeUpdate
|
|
4601
|
+
) {
|
|
4602
|
+
// change these monitors back to operational state.
|
|
4603
|
+
await this.markMonitorsActiveForMonitoring(
|
|
4604
|
+
data.projectId,
|
|
4605
|
+
carryForward.monitorsRemoved,
|
|
4606
|
+
);
|
|
4607
|
+
}
|
|
4608
|
+
|
|
4609
|
+
const isMonitorStatusChanged: boolean =
|
|
4610
|
+
this.isMonitorStatusChangedByUpdate(carryForward);
|
|
4611
|
+
|
|
4612
|
+
if (carryForward.monitorsAdded.length === 0 && !isMonitorStatusChanged) {
|
|
4613
|
+
return;
|
|
4614
|
+
}
|
|
4615
|
+
|
|
4616
|
+
/*
|
|
4617
|
+
* Read after the update is written, so an edit that resolves the
|
|
4618
|
+
* incident as well counts as resolved: changing the state restored the
|
|
4619
|
+
* monitors it holds, the added ones included.
|
|
4620
|
+
*/
|
|
4621
|
+
if (await this.isIncidentResolved({ incidentId: data.incidentId })) {
|
|
4622
|
+
return;
|
|
4623
|
+
}
|
|
4624
|
+
|
|
4625
|
+
if (carryForward.monitorsAdded.length > 0) {
|
|
4626
|
+
await this.disableActiveMonitoringIfManualIncident(data.incidentId);
|
|
4627
|
+
}
|
|
4628
|
+
|
|
4629
|
+
// The status the incident puts its monitors in after the update.
|
|
4630
|
+
const monitorStatusIdToApply: ObjectID | undefined =
|
|
4631
|
+
carryForward.isChangeMonitorStatusToCleared
|
|
4632
|
+
? undefined
|
|
4633
|
+
: carryForward.newMonitorChangeStatusIdTo ||
|
|
4634
|
+
carryForward.oldChangeMonitorStatusIdTo;
|
|
4635
|
+
|
|
4636
|
+
if (
|
|
4637
|
+
!monitorStatusIdToApply ||
|
|
4638
|
+
(!isMonitorStatusChanged && carryForward.monitorsAdded.length === 0)
|
|
4639
|
+
) {
|
|
4640
|
+
return;
|
|
4641
|
+
}
|
|
4642
|
+
|
|
4643
|
+
const addedMonitorIds: Array<string> = carryForward.monitorsAdded.map(
|
|
4644
|
+
(monitor: Monitor): string => {
|
|
4645
|
+
return this.getMonitorIdForComparison(monitor);
|
|
4646
|
+
},
|
|
4647
|
+
);
|
|
4648
|
+
|
|
4649
|
+
/*
|
|
4650
|
+
* The monitors the incident holds now, so a status is only ever put on
|
|
4651
|
+
* a monitor the update left on it.
|
|
4652
|
+
*/
|
|
4653
|
+
const incident: Model | null = await this.findOneById({
|
|
4654
|
+
id: data.incidentId,
|
|
4655
|
+
select: {
|
|
4656
|
+
monitors: {
|
|
4657
|
+
_id: true,
|
|
4658
|
+
},
|
|
4659
|
+
},
|
|
4660
|
+
props: {
|
|
4661
|
+
isRoot: true,
|
|
4662
|
+
},
|
|
4663
|
+
});
|
|
4664
|
+
|
|
4665
|
+
const monitorIdsToChange: Array<ObjectID> = (incident?.monitors || [])
|
|
4666
|
+
.filter((monitor: Monitor): boolean => {
|
|
4667
|
+
return (
|
|
4668
|
+
isMonitorStatusChanged ||
|
|
4669
|
+
addedMonitorIds.includes(this.getMonitorIdForComparison(monitor))
|
|
4670
|
+
);
|
|
4671
|
+
})
|
|
4672
|
+
.map((monitor: Monitor): ObjectID => {
|
|
4673
|
+
return new ObjectID(monitor._id?.toString() || "");
|
|
4674
|
+
});
|
|
4675
|
+
|
|
4676
|
+
if (monitorIdsToChange.length === 0) {
|
|
4677
|
+
return;
|
|
4678
|
+
}
|
|
4679
|
+
|
|
4680
|
+
await MonitorService.changeMonitorStatus(
|
|
4681
|
+
data.projectId,
|
|
4682
|
+
monitorIdsToChange,
|
|
4683
|
+
monitorStatusIdToApply,
|
|
4684
|
+
true, // notifyMonitorOwners
|
|
4685
|
+
"Status was changed because Incident " +
|
|
4686
|
+
data.incidentNumberDisplay +
|
|
4687
|
+
" was updated.",
|
|
4688
|
+
undefined,
|
|
4689
|
+
data.props,
|
|
4690
|
+
);
|
|
4691
|
+
}
|
|
4692
|
+
|
|
4517
4693
|
/*
|
|
4518
4694
|
* The part of an update's feed item that records a change of the status
|
|
4519
4695
|
* pages the incident is limited to: the pages added and removed, whether
|
|
@@ -5,10 +5,12 @@ import { OnCreate, OnDelete, OnUpdate } from "../Types/Database/Hooks";
|
|
|
5
5
|
import QueryHelper from "../Types/Database/QueryHelper";
|
|
6
6
|
import UpdateBy from "../Types/Database/UpdateBy";
|
|
7
7
|
import DatabaseService from "./DatabaseService";
|
|
8
|
+
import TeamComplianceSettingService from "./TeamComplianceSettingService";
|
|
8
9
|
import SortOrder from "../../Types/BaseDatabase/SortOrder";
|
|
9
10
|
import LIMIT_MAX from "../../Types/Database/LimitMax";
|
|
10
11
|
import BadDataException from "../../Types/Exception/BadDataException";
|
|
11
12
|
import ObjectID from "../../Types/ObjectID";
|
|
13
|
+
import { ComplianceSeverityKind } from "../../Types/Team/ComplianceRule";
|
|
12
14
|
import Model from "../../Models/DatabaseModels/IncidentSeverity";
|
|
13
15
|
import Queue, { QueueName } from "../Infrastructure/Queue";
|
|
14
16
|
import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
|
|
@@ -22,6 +24,14 @@ import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
|
|
|
22
24
|
const BACKFILL_NOTIFICATION_RULES_JOB_NAME: string =
|
|
23
25
|
"OnCallDutyPolicy:BackfillNotificationRulesForNewSeverities";
|
|
24
26
|
|
|
27
|
+
// What a delete carries from onBeforeDelete to onDeleteSuccess.
|
|
28
|
+
interface SeverityDeleteCarryForward {
|
|
29
|
+
// The deleted severity, for re-ranking the rest; signed-in deletes only.
|
|
30
|
+
incidentSeverity: Model | null;
|
|
31
|
+
// Team compliance rules scoped only to severities this delete removes.
|
|
32
|
+
complianceSettingIds: Array<string>;
|
|
33
|
+
}
|
|
34
|
+
|
|
25
35
|
export class Service extends DatabaseService<Model> {
|
|
26
36
|
public constructor() {
|
|
27
37
|
super(Model);
|
|
@@ -126,24 +136,38 @@ export class Service extends DatabaseService<Model> {
|
|
|
126
136
|
);
|
|
127
137
|
}
|
|
128
138
|
|
|
129
|
-
|
|
139
|
+
/*
|
|
140
|
+
* The severities this delete is about to remove, read while the team
|
|
141
|
+
* compliance rules scoped to them still say so: the join rows cascade
|
|
142
|
+
* away with the severity. See TeamComplianceSettingService.
|
|
143
|
+
*/
|
|
144
|
+
const severities: Array<Model> = await this.findBy({
|
|
145
|
+
query: deleteBy.query,
|
|
146
|
+
select: {
|
|
147
|
+
_id: true,
|
|
148
|
+
order: true,
|
|
149
|
+
projectId: true,
|
|
150
|
+
},
|
|
151
|
+
limit: deleteBy.limit,
|
|
152
|
+
skip: deleteBy.skip,
|
|
153
|
+
props: {
|
|
154
|
+
isRoot: true,
|
|
155
|
+
},
|
|
156
|
+
});
|
|
130
157
|
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
},
|
|
141
|
-
});
|
|
142
|
-
}
|
|
158
|
+
const carryForward: SeverityDeleteCarryForward = {
|
|
159
|
+
// Only a signed-in delete re-ranks the severities that remain.
|
|
160
|
+
incidentSeverity: deleteBy.props.isRoot ? null : severities[0] || null,
|
|
161
|
+
complianceSettingIds:
|
|
162
|
+
await TeamComplianceSettingService.getRulesScopedToAnyOf({
|
|
163
|
+
severityKind: ComplianceSeverityKind.Incident,
|
|
164
|
+
severities: severities,
|
|
165
|
+
}),
|
|
166
|
+
};
|
|
143
167
|
|
|
144
168
|
return {
|
|
145
169
|
deleteBy,
|
|
146
|
-
carryForward:
|
|
170
|
+
carryForward: carryForward,
|
|
147
171
|
};
|
|
148
172
|
}
|
|
149
173
|
|
|
@@ -153,7 +177,10 @@ export class Service extends DatabaseService<Model> {
|
|
|
153
177
|
_itemIdsBeforeDelete: ObjectID[],
|
|
154
178
|
): Promise<OnDelete<Model>> {
|
|
155
179
|
const deleteBy: DeleteBy<Model> = onDelete.deleteBy;
|
|
156
|
-
const
|
|
180
|
+
const carryForward: SeverityDeleteCarryForward | null =
|
|
181
|
+
(onDelete.carryForward as SeverityDeleteCarryForward | null) || null;
|
|
182
|
+
const incidentSeverity: Model | null =
|
|
183
|
+
carryForward?.incidentSeverity || null;
|
|
157
184
|
|
|
158
185
|
if (!deleteBy.props.isRoot && incidentSeverity) {
|
|
159
186
|
if (
|
|
@@ -169,6 +196,30 @@ export class Service extends DatabaseService<Model> {
|
|
|
169
196
|
}
|
|
170
197
|
}
|
|
171
198
|
|
|
199
|
+
/*
|
|
200
|
+
* The severity is gone, so a compliance rule that was scoped only to it
|
|
201
|
+
* (and to severities other deletes have already removed) now reads as a
|
|
202
|
+
* rule for every incident severity. Pause and mark it instead; a rule with
|
|
203
|
+
* another severity left is left alone. The delete has already happened,
|
|
204
|
+
* so a failure here is logged rather than reported as a failed delete.
|
|
205
|
+
*/
|
|
206
|
+
const complianceSettingIds: Array<string> =
|
|
207
|
+
carryForward?.complianceSettingIds || [];
|
|
208
|
+
|
|
209
|
+
if (complianceSettingIds.length > 0) {
|
|
210
|
+
try {
|
|
211
|
+
await TeamComplianceSettingService.pauseRulesLeftWithoutSeverities({
|
|
212
|
+
severityKind: ComplianceSeverityKind.Incident,
|
|
213
|
+
settingIds: complianceSettingIds,
|
|
214
|
+
});
|
|
215
|
+
} catch (err) {
|
|
216
|
+
logger.error(
|
|
217
|
+
"Could not pause the team compliance rules left without a severity by an incident severity delete. They now check every incident severity until they are edited.",
|
|
218
|
+
);
|
|
219
|
+
logger.error(err);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
|
|
172
223
|
return {
|
|
173
224
|
deleteBy: deleteBy,
|
|
174
225
|
carryForward: null,
|