@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
|
@@ -32,7 +32,9 @@ import ObjectID from "../../Types/ObjectID";
|
|
|
32
32
|
import WorkspaceUserAuthTokenService from "../Services/WorkspaceUserAuthTokenService";
|
|
33
33
|
import WorkspaceUserAuthToken from "../../Models/DatabaseModels/WorkspaceUserAuthToken";
|
|
34
34
|
import WorkspaceType from "../../Types/Workspace/WorkspaceType";
|
|
35
|
-
import MicrosoftTeamsUtil
|
|
35
|
+
import MicrosoftTeamsUtil, {
|
|
36
|
+
MicrosoftTeamsChatNameRefreshResult,
|
|
37
|
+
} from "../Utils/Workspace/MicrosoftTeams/MicrosoftTeams";
|
|
36
38
|
import archiver, { Archiver } from "archiver";
|
|
37
39
|
import LocalFile from "../Utils/LocalFile";
|
|
38
40
|
import path from "path";
|
|
@@ -69,8 +71,14 @@ export default class MicrosoftTeamsAPI {
|
|
|
69
71
|
$schema:
|
|
70
72
|
"https://developer.microsoft.com/json-schemas/teams/v1.23/MicrosoftTeams.schema.json",
|
|
71
73
|
manifestVersion: "1.23",
|
|
74
|
+
/*
|
|
75
|
+
* Teams only takes an uploaded package as an update when its version is
|
|
76
|
+
* higher than the installed one. Release images carry APP_VERSION; a
|
|
77
|
+
* build without it uses this fallback, so bump it whenever the manifest
|
|
78
|
+
* changes (1.6.0: ChatSettings.Read.Chat added).
|
|
79
|
+
*/
|
|
72
80
|
version: AppVersion.toLowerCase().includes("unknown")
|
|
73
|
-
? "1.
|
|
81
|
+
? "1.6.0"
|
|
74
82
|
: AppVersion,
|
|
75
83
|
id: MicrosoftTeamsAppClientId,
|
|
76
84
|
developer: {
|
|
@@ -186,6 +194,15 @@ export default class MicrosoftTeamsAPI {
|
|
|
186
194
|
type: "Application",
|
|
187
195
|
name: "ChatMember.Read.Chat",
|
|
188
196
|
},
|
|
197
|
+
/*
|
|
198
|
+
* Lets OneUptime read a group chat's name. Teams does not put it on
|
|
199
|
+
* bot activities, so without this group chats are listed by their
|
|
200
|
+
* members' names.
|
|
201
|
+
*/
|
|
202
|
+
{
|
|
203
|
+
type: "Application",
|
|
204
|
+
name: "ChatSettings.Read.Chat",
|
|
205
|
+
},
|
|
189
206
|
/*
|
|
190
207
|
* Lets OneUptime confirm, per team, that the installed OneUptime app
|
|
191
208
|
* is the package built from THIS deployment before telling an admin
|
|
@@ -209,6 +226,24 @@ export default class MicrosoftTeamsAPI {
|
|
|
209
226
|
return manifest;
|
|
210
227
|
}
|
|
211
228
|
|
|
229
|
+
// The chat list shape the Chats card reads, sorted by name.
|
|
230
|
+
private static serializeChats(
|
|
231
|
+
chats: Record<string, MicrosoftTeamsChat>,
|
|
232
|
+
): Array<JSONObject> {
|
|
233
|
+
return Object.values(chats)
|
|
234
|
+
.sort((a: MicrosoftTeamsChat, b: MicrosoftTeamsChat) => {
|
|
235
|
+
return a.name.localeCompare(b.name);
|
|
236
|
+
})
|
|
237
|
+
.map((chat: MicrosoftTeamsChat) => {
|
|
238
|
+
return {
|
|
239
|
+
id: chat.id,
|
|
240
|
+
name: chat.name,
|
|
241
|
+
chatType: chat.chatType,
|
|
242
|
+
addedAt: chat.addedAt || null,
|
|
243
|
+
};
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
|
|
212
247
|
private static getUserSignInRedirectUri(): string {
|
|
213
248
|
return `${AppApiClientUrl.toString()}/microsoft-teams/auth`;
|
|
214
249
|
}
|
|
@@ -1634,18 +1669,62 @@ export default class MicrosoftTeamsAPI {
|
|
|
1634
1669
|
});
|
|
1635
1670
|
|
|
1636
1671
|
return Response.sendJsonObjectResponse(req, res, {
|
|
1637
|
-
chats:
|
|
1638
|
-
|
|
1639
|
-
|
|
1640
|
-
|
|
1641
|
-
|
|
1642
|
-
|
|
1643
|
-
|
|
1644
|
-
|
|
1645
|
-
|
|
1646
|
-
|
|
1647
|
-
|
|
1648
|
-
|
|
1672
|
+
chats: MicrosoftTeamsAPI.serializeChats(availableChats),
|
|
1673
|
+
});
|
|
1674
|
+
} catch (err) {
|
|
1675
|
+
return Response.sendErrorResponse(req, res, err as Exception);
|
|
1676
|
+
}
|
|
1677
|
+
},
|
|
1678
|
+
);
|
|
1679
|
+
|
|
1680
|
+
/*
|
|
1681
|
+
* "Refresh Chats". Chats still cannot be listed, but the name of each
|
|
1682
|
+
* stored group chat can be re-read from Graph — which is what fixes a
|
|
1683
|
+
* group chat listed under its member names, and picks up renames.
|
|
1684
|
+
* Returns the same list as GET, plus which chats' names could not be read
|
|
1685
|
+
* (Microsoft refused, or failed) so the page can mark them and say why.
|
|
1686
|
+
*
|
|
1687
|
+
* Member access, like the list: it changes nothing but the stored display
|
|
1688
|
+
* names, and concurrent refreshes of a project share one run.
|
|
1689
|
+
*/
|
|
1690
|
+
router.post(
|
|
1691
|
+
"/microsoft-teams/chats/refresh",
|
|
1692
|
+
UserMiddleware.getUserMiddleware,
|
|
1693
|
+
async (req: ExpressRequest, res: ExpressResponse) => {
|
|
1694
|
+
try {
|
|
1695
|
+
const databaseProps: DatabaseCommonInteractionProps =
|
|
1696
|
+
await CommonAPI.getDatabaseCommonInteractionProps(req);
|
|
1697
|
+
|
|
1698
|
+
const projectId: ObjectID =
|
|
1699
|
+
CommonAPI.assertAuthenticatedProjectMember(databaseProps);
|
|
1700
|
+
|
|
1701
|
+
const refreshResult: MicrosoftTeamsChatNameRefreshResult =
|
|
1702
|
+
await MicrosoftTeamsUtil.refreshChatNamesForProject({
|
|
1703
|
+
projectId: projectId,
|
|
1704
|
+
});
|
|
1705
|
+
|
|
1706
|
+
// Only chats that are still listed (one may be removed mid-refresh).
|
|
1707
|
+
const listed: (chatIds: Array<string>) => Array<string> = (
|
|
1708
|
+
chatIds: Array<string>,
|
|
1709
|
+
): Array<string> => {
|
|
1710
|
+
return chatIds.filter((chatId: string) => {
|
|
1711
|
+
return Boolean(refreshResult.chats[chatId]);
|
|
1712
|
+
});
|
|
1713
|
+
};
|
|
1714
|
+
|
|
1715
|
+
const permissionDeniedChatIds: Array<string> = listed(
|
|
1716
|
+
refreshResult.permissionDeniedChatIds,
|
|
1717
|
+
);
|
|
1718
|
+
const failedChatIds: Array<string> = listed(
|
|
1719
|
+
refreshResult.failedChatIds,
|
|
1720
|
+
);
|
|
1721
|
+
|
|
1722
|
+
return Response.sendJsonObjectResponse(req, res, {
|
|
1723
|
+
chats: MicrosoftTeamsAPI.serializeChats(refreshResult.chats),
|
|
1724
|
+
chatNamePermissionDeniedChatIds: permissionDeniedChatIds,
|
|
1725
|
+
chatNamePermissionDeniedCount: permissionDeniedChatIds.length,
|
|
1726
|
+
chatNameFailedChatIds: failedChatIds,
|
|
1727
|
+
chatNameFailedCount: failedChatIds.length,
|
|
1649
1728
|
});
|
|
1650
1729
|
} catch (err) {
|
|
1651
1730
|
return Response.sendErrorResponse(req, res, err as Exception);
|
|
@@ -4,6 +4,7 @@ import BadDataException from "../../Types/Exception/BadDataException";
|
|
|
4
4
|
import ObjectID from "../../Types/ObjectID";
|
|
5
5
|
import ProxmoxResourceService, {
|
|
6
6
|
ProxmoxInventorySummary,
|
|
7
|
+
ProxmoxRemoveNodeResult,
|
|
7
8
|
Service as ProxmoxResourceServiceType,
|
|
8
9
|
} from "../Services/ProxmoxResourceService";
|
|
9
10
|
import ProxmoxClusterService from "../Services/ProxmoxClusterService";
|
|
@@ -17,18 +18,49 @@ import {
|
|
|
17
18
|
} from "../Utils/Express";
|
|
18
19
|
import CommonAPI from "./CommonAPI";
|
|
19
20
|
import DatabaseCommonInteractionProps from "../../Types/BaseDatabase/DatabaseCommonInteractionProps";
|
|
21
|
+
import NotAuthorizedException from "../../Types/Exception/NotAuthorizedException";
|
|
20
22
|
import NotFoundException from "../../Types/Exception/NotFoundException";
|
|
21
23
|
import { JSONObject } from "../../Types/JSON";
|
|
24
|
+
import ModelPermission from "../Types/Database/Permissions/Index";
|
|
25
|
+
import Query from "../Types/Database/Query";
|
|
26
|
+
|
|
27
|
+
// A node's pve externalId is "node/<name>" on the agent and the native push.
|
|
28
|
+
const NODE_EXTERNAL_ID_PREFIX: string = "node/";
|
|
29
|
+
|
|
30
|
+
/*
|
|
31
|
+
* One answer for "no such cluster in this project" and "a cluster you
|
|
32
|
+
* may not edit", so the refusal is not a way to probe for ids.
|
|
33
|
+
*/
|
|
34
|
+
const EDITABLE_CLUSTER_NOT_FOUND_MESSAGE: string =
|
|
35
|
+
"Proxmox Cluster not found, or you do not have permission to edit it. Removing a node needs permission to edit its cluster.";
|
|
36
|
+
|
|
37
|
+
const NODE_STILL_REPORTING_MESSAGE: string =
|
|
38
|
+
"Only a node that has stopped reporting can be removed. A node that is still reporting would come back on its next report.";
|
|
39
|
+
|
|
40
|
+
const NODE_NOT_FOUND_MESSAGE: string =
|
|
41
|
+
"This node is not in the cluster's inventory. It may already have been removed.";
|
|
42
|
+
|
|
43
|
+
const NODE_NOT_NATIVE_MESSAGE: string =
|
|
44
|
+
"Only a node that reports over Proxmox VE's built-in metric push can be removed here. With the Proxmox Agent, a node leaves OneUptime on its own once the cluster no longer lists it.";
|
|
22
45
|
|
|
23
46
|
/*
|
|
24
47
|
* ------------------------------------------------------------------
|
|
25
48
|
* ProxmoxResourceAPI
|
|
26
49
|
*
|
|
27
|
-
* Augments the auto-generated CRUD router with
|
|
28
|
-
* endpoint the Proxmox layout/overview pages use to fetch sidebar
|
|
29
|
-
* badge counts in one round-trip:
|
|
50
|
+
* Augments the auto-generated CRUD router with two custom endpoints:
|
|
30
51
|
*
|
|
31
52
|
* POST /proxmox-resource/inventory-summary/:clusterId
|
|
53
|
+
* Sidebar badge counts for the Proxmox layout/overview pages in
|
|
54
|
+
* one round-trip. Needs read access to the cluster.
|
|
55
|
+
*
|
|
56
|
+
* POST /proxmox-resource/remove-node/:clusterId { nodeName }
|
|
57
|
+
* Removes a node that has stopped reporting, for a node taken out
|
|
58
|
+
* of the Proxmox cluster, which OneUptime cannot tell apart from a
|
|
59
|
+
* dead one on the Proxmox VE native push. Its live siblings stop
|
|
60
|
+
* reporting it as down and its Node Offline alert resolves. A node
|
|
61
|
+
* that is still up is refused: it would come back on its next
|
|
62
|
+
* report. Needs permission to EDIT the cluster, since users have
|
|
63
|
+
* no write access to the inventory table itself.
|
|
32
64
|
*
|
|
33
65
|
* The standard CRUD endpoints (list / get) are still registered by
|
|
34
66
|
* BaseAPI; the UI uses them via ModelAPI for list/detail reads.
|
|
@@ -56,6 +88,33 @@ export default class ProxmoxResourceAPI extends BaseAPI<
|
|
|
56
88
|
}
|
|
57
89
|
},
|
|
58
90
|
);
|
|
91
|
+
|
|
92
|
+
this.router.post(
|
|
93
|
+
`${new this.entityType()
|
|
94
|
+
.getCrudApiPath()
|
|
95
|
+
?.toString()}/remove-node/:clusterId`,
|
|
96
|
+
UserMiddleware.getUserMiddleware,
|
|
97
|
+
async (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => {
|
|
98
|
+
try {
|
|
99
|
+
await this.removeNode(req, res);
|
|
100
|
+
} catch (err) {
|
|
101
|
+
next(err);
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
private readClusterIdParam(req: ExpressRequest): ObjectID {
|
|
108
|
+
const clusterIdParam: string | undefined = req.params["clusterId"];
|
|
109
|
+
if (!clusterIdParam) {
|
|
110
|
+
throw new BadDataException("Cluster ID is required");
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
try {
|
|
114
|
+
return new ObjectID(clusterIdParam);
|
|
115
|
+
} catch {
|
|
116
|
+
throw new BadDataException("Invalid Cluster ID");
|
|
117
|
+
}
|
|
59
118
|
}
|
|
60
119
|
|
|
61
120
|
/*
|
|
@@ -69,17 +128,7 @@ export default class ProxmoxResourceAPI extends BaseAPI<
|
|
|
69
128
|
projectId: ObjectID;
|
|
70
129
|
proxmoxClusterId: ObjectID;
|
|
71
130
|
}> {
|
|
72
|
-
const
|
|
73
|
-
if (!clusterIdParam) {
|
|
74
|
-
throw new BadDataException("Cluster ID is required");
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
let proxmoxClusterId: ObjectID;
|
|
78
|
-
try {
|
|
79
|
-
proxmoxClusterId = new ObjectID(clusterIdParam);
|
|
80
|
-
} catch {
|
|
81
|
-
throw new BadDataException("Invalid Cluster ID");
|
|
82
|
-
}
|
|
131
|
+
const proxmoxClusterId: ObjectID = this.readClusterIdParam(req);
|
|
83
132
|
|
|
84
133
|
const props: DatabaseCommonInteractionProps =
|
|
85
134
|
await CommonAPI.getDatabaseCommonInteractionProps(req);
|
|
@@ -129,4 +178,185 @@ export default class ProxmoxResourceAPI extends BaseAPI<
|
|
|
129
178
|
|
|
130
179
|
return Response.sendJsonObjectResponse(req, res, responseBody);
|
|
131
180
|
}
|
|
181
|
+
|
|
182
|
+
/*
|
|
183
|
+
* The cluster a caller removes a node from, read only if the caller
|
|
184
|
+
* may EDIT it, decided the way the cluster's own update endpoint
|
|
185
|
+
* decides it:
|
|
186
|
+
*
|
|
187
|
+
* 1. the update permission check scopes the lookup the way an update
|
|
188
|
+
* of that row would be scoped (project, label- and Owned-scoped
|
|
189
|
+
* grants), and the row is then read as root;
|
|
190
|
+
* 2. the per-row check the update endpoint runs before writing
|
|
191
|
+
* (updateOneById) enforces the team block list, which the query
|
|
192
|
+
* check does not.
|
|
193
|
+
*
|
|
194
|
+
* The project is the caller's own (props.tenantId), the only project
|
|
195
|
+
* the caller was checked in. A missing cluster, a cluster in another
|
|
196
|
+
* project and a cluster the caller may not edit all get the same
|
|
197
|
+
* NotFound.
|
|
198
|
+
*/
|
|
199
|
+
private async resolveEditableClusterForRequest(
|
|
200
|
+
req: ExpressRequest,
|
|
201
|
+
proxmoxClusterId: ObjectID,
|
|
202
|
+
): Promise<{
|
|
203
|
+
projectId: ObjectID;
|
|
204
|
+
proxmoxClusterId: ObjectID;
|
|
205
|
+
}> {
|
|
206
|
+
const props: DatabaseCommonInteractionProps =
|
|
207
|
+
await CommonAPI.getDatabaseCommonInteractionProps(req);
|
|
208
|
+
|
|
209
|
+
const projectId: ObjectID | undefined = props.tenantId;
|
|
210
|
+
if (!projectId) {
|
|
211
|
+
throw new NotFoundException(EDITABLE_CLUSTER_NOT_FOUND_MESSAGE);
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
let cluster: ProxmoxCluster | null = null;
|
|
215
|
+
try {
|
|
216
|
+
const editableQuery: Query<ProxmoxCluster> =
|
|
217
|
+
await ModelPermission.checkUpdateQueryPermissions(
|
|
218
|
+
ProxmoxCluster,
|
|
219
|
+
{
|
|
220
|
+
_id: proxmoxClusterId.toString(),
|
|
221
|
+
projectId: projectId,
|
|
222
|
+
},
|
|
223
|
+
{},
|
|
224
|
+
props,
|
|
225
|
+
);
|
|
226
|
+
|
|
227
|
+
cluster = await ProxmoxClusterService.findOneBy({
|
|
228
|
+
query: editableQuery,
|
|
229
|
+
select: {
|
|
230
|
+
_id: true,
|
|
231
|
+
projectId: true,
|
|
232
|
+
},
|
|
233
|
+
props: {
|
|
234
|
+
isRoot: true,
|
|
235
|
+
},
|
|
236
|
+
});
|
|
237
|
+
|
|
238
|
+
if (cluster) {
|
|
239
|
+
/*
|
|
240
|
+
* The block check needs every label on the cluster. The lookup
|
|
241
|
+
* above is narrowed to the caller's permitted labels when the
|
|
242
|
+
* grant is label-scoped, and loading labels through it would
|
|
243
|
+
* return only those — hiding a label the caller's team is
|
|
244
|
+
* blocked on. Load them unfiltered, as updateOneById does —
|
|
245
|
+
* once, though the block and the allow checks both ask.
|
|
246
|
+
*/
|
|
247
|
+
let withAllLabels: Promise<ProxmoxCluster | null> | null = null;
|
|
248
|
+
await ModelPermission.checkUpdatePermissionByModel({
|
|
249
|
+
modelType: ProxmoxCluster,
|
|
250
|
+
fetchModelWithAccessControlIds:
|
|
251
|
+
async (): Promise<ProxmoxCluster | null> => {
|
|
252
|
+
if (!withAllLabels) {
|
|
253
|
+
withAllLabels = ProxmoxClusterService.findOneById({
|
|
254
|
+
id: proxmoxClusterId,
|
|
255
|
+
select: {
|
|
256
|
+
_id: true,
|
|
257
|
+
projectId: true,
|
|
258
|
+
labels: {
|
|
259
|
+
_id: true,
|
|
260
|
+
},
|
|
261
|
+
},
|
|
262
|
+
props: {
|
|
263
|
+
isRoot: true,
|
|
264
|
+
},
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
const loaded: ProxmoxCluster | null = await withAllLabels;
|
|
268
|
+
// Deleted since the lookup above: the same answer as missing.
|
|
269
|
+
if (!loaded) {
|
|
270
|
+
throw new NotFoundException(EDITABLE_CLUSTER_NOT_FOUND_MESSAGE);
|
|
271
|
+
}
|
|
272
|
+
return loaded;
|
|
273
|
+
},
|
|
274
|
+
props,
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
} catch (err) {
|
|
278
|
+
if (err instanceof NotAuthorizedException) {
|
|
279
|
+
throw new NotFoundException(EDITABLE_CLUSTER_NOT_FOUND_MESSAGE);
|
|
280
|
+
}
|
|
281
|
+
throw err;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
if (!cluster || !cluster.projectId) {
|
|
285
|
+
throw new NotFoundException(EDITABLE_CLUSTER_NOT_FOUND_MESSAGE);
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
return {
|
|
289
|
+
projectId: cluster.projectId,
|
|
290
|
+
proxmoxClusterId,
|
|
291
|
+
};
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
/*
|
|
295
|
+
* The node name from the body: a non-empty string, trimmed, and a
|
|
296
|
+
* single name. The externalId is "node/<name>", so a "/" would point
|
|
297
|
+
* at something other than a node.
|
|
298
|
+
*/
|
|
299
|
+
private readNodeName(req: ExpressRequest): string {
|
|
300
|
+
const body: JSONObject =
|
|
301
|
+
req.body && typeof req.body === "object" ? (req.body as JSONObject) : {};
|
|
302
|
+
const rawNodeName: unknown = body["nodeName"];
|
|
303
|
+
|
|
304
|
+
if (typeof rawNodeName !== "string" || !rawNodeName.trim()) {
|
|
305
|
+
throw new BadDataException("Node name is required");
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
const nodeName: string = rawNodeName.trim();
|
|
309
|
+
|
|
310
|
+
if (nodeName.includes("/")) {
|
|
311
|
+
throw new BadDataException("Node name must not contain a slash");
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
// Control characters (a NUL would fail in Postgres, not here).
|
|
315
|
+
for (let i: number = 0; i < nodeName.length; i++) {
|
|
316
|
+
const code: number = nodeName.charCodeAt(i);
|
|
317
|
+
if (code < 32 || code === 127) {
|
|
318
|
+
throw new BadDataException(
|
|
319
|
+
"Node name must not contain control characters",
|
|
320
|
+
);
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
return nodeName;
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
private async removeNode(
|
|
328
|
+
req: ExpressRequest,
|
|
329
|
+
res: ExpressResponse,
|
|
330
|
+
): Promise<void> {
|
|
331
|
+
const requestedClusterId: ObjectID = this.readClusterIdParam(req);
|
|
332
|
+
|
|
333
|
+
// ObjectID accepts any string; this id goes into a Postgres uuid column.
|
|
334
|
+
if (!ObjectID.isValidUUID(requestedClusterId.toString())) {
|
|
335
|
+
throw new BadDataException("Invalid Cluster ID");
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
const nodeName: string = this.readNodeName(req);
|
|
339
|
+
|
|
340
|
+
const { projectId, proxmoxClusterId } =
|
|
341
|
+
await this.resolveEditableClusterForRequest(req, requestedClusterId);
|
|
342
|
+
|
|
343
|
+
const result: ProxmoxRemoveNodeResult =
|
|
344
|
+
await this.service.removeOfflineNode({
|
|
345
|
+
projectId,
|
|
346
|
+
proxmoxClusterId,
|
|
347
|
+
externalId: `${NODE_EXTERNAL_ID_PREFIX}${nodeName}`,
|
|
348
|
+
});
|
|
349
|
+
|
|
350
|
+
if (result === "not-found") {
|
|
351
|
+
throw new NotFoundException(NODE_NOT_FOUND_MESSAGE);
|
|
352
|
+
}
|
|
353
|
+
if (result === "not-native") {
|
|
354
|
+
throw new BadDataException(NODE_NOT_NATIVE_MESSAGE);
|
|
355
|
+
}
|
|
356
|
+
if (result !== "removed") {
|
|
357
|
+
throw new BadDataException(NODE_STILL_REPORTING_MESSAGE);
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
return Response.sendJsonObjectResponse(req, res, { removed: true });
|
|
361
|
+
}
|
|
132
362
|
}
|
|
@@ -136,6 +136,38 @@ export default abstract class GlobalCache {
|
|
|
136
136
|
return value;
|
|
137
137
|
}
|
|
138
138
|
|
|
139
|
+
/*
|
|
140
|
+
* Several keys of one namespace in a single round-trip (MGET). The result
|
|
141
|
+
* is positional: one entry per requested key, null where the key is
|
|
142
|
+
* missing or empty.
|
|
143
|
+
*/
|
|
144
|
+
@CaptureSpan()
|
|
145
|
+
public static async getStrings(
|
|
146
|
+
namespace: string,
|
|
147
|
+
keys: Array<string>,
|
|
148
|
+
): Promise<Array<string | null>> {
|
|
149
|
+
if (keys.length === 0) {
|
|
150
|
+
return [];
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
const client: ClientType | null = Redis.getClient();
|
|
154
|
+
|
|
155
|
+
if (!client || !Redis.isConnected()) {
|
|
156
|
+
throw new DatabaseNotConnectedException("Cache is not connected");
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
const values: Array<string | null> = await client.mget(
|
|
160
|
+
keys.map((key: string) => {
|
|
161
|
+
return `${namespace}-${key}`;
|
|
162
|
+
}),
|
|
163
|
+
);
|
|
164
|
+
|
|
165
|
+
return keys.map((_key: string, index: number) => {
|
|
166
|
+
const value: string | null | undefined = values[index];
|
|
167
|
+
return value ? value : null;
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
|
|
139
171
|
@CaptureSpan()
|
|
140
172
|
public static async setJSON(
|
|
141
173
|
namespace: string,
|
package/Server/Infrastructure/Postgres/SchemaMigrations/1796000000000-AddTeamComplianceRuleScope.ts
ADDED
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { MigrationInterface, QueryRunner } from "typeorm";
|
|
2
|
+
|
|
3
|
+
/*
|
|
4
|
+
* Team compliance rules scoped by severity and channel.
|
|
5
|
+
*
|
|
6
|
+
* - "notificationChannel": the channel an on-call compliance rule insists on
|
|
7
|
+
* (Call, Push, ...). Nullable with no default, so every existing rule reads
|
|
8
|
+
* as "any channel" - exactly what it checked before.
|
|
9
|
+
* - "TeamComplianceSettingIncidentSeverity" / "...AlertSeverity": the
|
|
10
|
+
* severities an on-call compliance rule is scoped to. Empty means every
|
|
11
|
+
* severity, which is again what every existing rule already checked. Both
|
|
12
|
+
* cascade from the rule and from the severity.
|
|
13
|
+
* - The unique ("teamId", "ruleType") index goes: "Call for Critical
|
|
14
|
+
* incidents" and "Push for Critical incidents" are both
|
|
15
|
+
* HasIncidentOnCallRules on one team. TeamComplianceSettingService rejects
|
|
16
|
+
* exact duplicates instead. Existing data cannot violate the change - it only
|
|
17
|
+
* relaxes a constraint.
|
|
18
|
+
*/
|
|
19
|
+
export class AddTeamComplianceRuleScope1796000000000
|
|
20
|
+
implements MigrationInterface
|
|
21
|
+
{
|
|
22
|
+
public name: string = "AddTeamComplianceRuleScope1796000000000";
|
|
23
|
+
|
|
24
|
+
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
25
|
+
await queryRunner.query(
|
|
26
|
+
`DROP INDEX "public"."IDX_ef7342919ff02501c2b0ddc029"`,
|
|
27
|
+
);
|
|
28
|
+
await queryRunner.query(
|
|
29
|
+
`CREATE TABLE "TeamComplianceSettingIncidentSeverity" ("teamComplianceSettingId" uuid NOT NULL, "incidentSeverityId" uuid NOT NULL, CONSTRAINT "PK_0071a6d21730a2ed9e098873b2e" PRIMARY KEY ("teamComplianceSettingId", "incidentSeverityId"))`,
|
|
30
|
+
);
|
|
31
|
+
await queryRunner.query(
|
|
32
|
+
`CREATE INDEX "IDX_013768788937d0e484fb3c1bcb" ON "TeamComplianceSettingIncidentSeverity" ("teamComplianceSettingId") `,
|
|
33
|
+
);
|
|
34
|
+
await queryRunner.query(
|
|
35
|
+
`CREATE INDEX "IDX_6e477b60ddefe41bfdee3e6142" ON "TeamComplianceSettingIncidentSeverity" ("incidentSeverityId") `,
|
|
36
|
+
);
|
|
37
|
+
await queryRunner.query(
|
|
38
|
+
`CREATE TABLE "TeamComplianceSettingAlertSeverity" ("teamComplianceSettingId" uuid NOT NULL, "alertSeverityId" uuid NOT NULL, CONSTRAINT "PK_ba665b5e7d6413db2be11bf2f09" PRIMARY KEY ("teamComplianceSettingId", "alertSeverityId"))`,
|
|
39
|
+
);
|
|
40
|
+
await queryRunner.query(
|
|
41
|
+
`CREATE INDEX "IDX_c01a8eeea98cb41a45806fe5c7" ON "TeamComplianceSettingAlertSeverity" ("teamComplianceSettingId") `,
|
|
42
|
+
);
|
|
43
|
+
await queryRunner.query(
|
|
44
|
+
`CREATE INDEX "IDX_573637e6a2df47b516b0f955d9" ON "TeamComplianceSettingAlertSeverity" ("alertSeverityId") `,
|
|
45
|
+
);
|
|
46
|
+
await queryRunner.query(
|
|
47
|
+
`ALTER TABLE "TeamComplianceSetting" ADD "notificationChannel" character varying(100)`,
|
|
48
|
+
);
|
|
49
|
+
await queryRunner.query(
|
|
50
|
+
`ALTER TABLE "TeamComplianceSettingIncidentSeverity" ADD CONSTRAINT "FK_013768788937d0e484fb3c1bcb8" FOREIGN KEY ("teamComplianceSettingId") REFERENCES "TeamComplianceSetting"("_id") ON DELETE CASCADE ON UPDATE CASCADE`,
|
|
51
|
+
);
|
|
52
|
+
await queryRunner.query(
|
|
53
|
+
`ALTER TABLE "TeamComplianceSettingIncidentSeverity" ADD CONSTRAINT "FK_6e477b60ddefe41bfdee3e61424" FOREIGN KEY ("incidentSeverityId") REFERENCES "IncidentSeverity"("_id") ON DELETE CASCADE ON UPDATE CASCADE`,
|
|
54
|
+
);
|
|
55
|
+
await queryRunner.query(
|
|
56
|
+
`ALTER TABLE "TeamComplianceSettingAlertSeverity" ADD CONSTRAINT "FK_c01a8eeea98cb41a45806fe5c77" FOREIGN KEY ("teamComplianceSettingId") REFERENCES "TeamComplianceSetting"("_id") ON DELETE CASCADE ON UPDATE CASCADE`,
|
|
57
|
+
);
|
|
58
|
+
await queryRunner.query(
|
|
59
|
+
`ALTER TABLE "TeamComplianceSettingAlertSeverity" ADD CONSTRAINT "FK_573637e6a2df47b516b0f955d96" FOREIGN KEY ("alertSeverityId") REFERENCES "AlertSeverity"("_id") ON DELETE CASCADE ON UPDATE CASCADE`,
|
|
60
|
+
);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
64
|
+
await queryRunner.query(
|
|
65
|
+
`ALTER TABLE "TeamComplianceSettingAlertSeverity" DROP CONSTRAINT "FK_573637e6a2df47b516b0f955d96"`,
|
|
66
|
+
);
|
|
67
|
+
await queryRunner.query(
|
|
68
|
+
`ALTER TABLE "TeamComplianceSettingAlertSeverity" DROP CONSTRAINT "FK_c01a8eeea98cb41a45806fe5c77"`,
|
|
69
|
+
);
|
|
70
|
+
await queryRunner.query(
|
|
71
|
+
`ALTER TABLE "TeamComplianceSettingIncidentSeverity" DROP CONSTRAINT "FK_6e477b60ddefe41bfdee3e61424"`,
|
|
72
|
+
);
|
|
73
|
+
await queryRunner.query(
|
|
74
|
+
`ALTER TABLE "TeamComplianceSettingIncidentSeverity" DROP CONSTRAINT "FK_013768788937d0e484fb3c1bcb8"`,
|
|
75
|
+
);
|
|
76
|
+
await queryRunner.query(
|
|
77
|
+
`ALTER TABLE "TeamComplianceSetting" DROP COLUMN "notificationChannel"`,
|
|
78
|
+
);
|
|
79
|
+
await queryRunner.query(
|
|
80
|
+
`DROP INDEX "public"."IDX_573637e6a2df47b516b0f955d9"`,
|
|
81
|
+
);
|
|
82
|
+
await queryRunner.query(
|
|
83
|
+
`DROP INDEX "public"."IDX_c01a8eeea98cb41a45806fe5c7"`,
|
|
84
|
+
);
|
|
85
|
+
await queryRunner.query(`DROP TABLE "TeamComplianceSettingAlertSeverity"`);
|
|
86
|
+
await queryRunner.query(
|
|
87
|
+
`DROP INDEX "public"."IDX_6e477b60ddefe41bfdee3e6142"`,
|
|
88
|
+
);
|
|
89
|
+
await queryRunner.query(
|
|
90
|
+
`DROP INDEX "public"."IDX_013768788937d0e484fb3c1bcb"`,
|
|
91
|
+
);
|
|
92
|
+
await queryRunner.query(
|
|
93
|
+
`DROP TABLE "TeamComplianceSettingIncidentSeverity"`,
|
|
94
|
+
);
|
|
95
|
+
await queryRunner.query(
|
|
96
|
+
`CREATE UNIQUE INDEX "IDX_ef7342919ff02501c2b0ddc029" ON "TeamComplianceSetting" ("teamId", "ruleType") `,
|
|
97
|
+
);
|
|
98
|
+
}
|
|
99
|
+
}
|