@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
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import AcmeCertificate from "./AcmeCertificate";
|
|
2
2
|
import AcmeChallenge from "./AcmeChallenge";
|
|
3
3
|
import KubernetesCluster from "./KubernetesCluster";
|
|
4
|
+
import KubernetesAiAgent from "./KubernetesAiAgent";
|
|
4
5
|
import KubernetesClusterOwnerTeam from "./KubernetesClusterOwnerTeam";
|
|
5
6
|
import KubernetesClusterOwnerUser from "./KubernetesClusterOwnerUser";
|
|
6
7
|
import KubernetesResource from "./KubernetesResource";
|
|
@@ -908,6 +909,7 @@ const AllModelTypes: Array<{
|
|
|
908
909
|
StatusPageSCIMLog,
|
|
909
910
|
|
|
910
911
|
KubernetesCluster,
|
|
912
|
+
KubernetesAiAgent,
|
|
911
913
|
KubernetesClusterOwnerTeam,
|
|
912
914
|
KubernetesClusterOwnerUser,
|
|
913
915
|
KubernetesResource,
|
|
@@ -0,0 +1,364 @@
|
|
|
1
|
+
import KubernetesCluster from "./KubernetesCluster";
|
|
2
|
+
import Project from "./Project";
|
|
3
|
+
import BaseModel from "./DatabaseBaseModel/DatabaseBaseModel";
|
|
4
|
+
import ColumnAccessControl from "../../Types/Database/AccessControl/ColumnAccessControl";
|
|
5
|
+
import TableAccessControl from "../../Types/Database/AccessControl/TableAccessControl";
|
|
6
|
+
import ColumnLength from "../../Types/Database/ColumnLength";
|
|
7
|
+
import ColumnType from "../../Types/Database/ColumnType";
|
|
8
|
+
import TableColumn from "../../Types/Database/TableColumn";
|
|
9
|
+
import TableColumnType from "../../Types/Database/TableColumnType";
|
|
10
|
+
import TableMetadata from "../../Types/Database/TableMetadata";
|
|
11
|
+
import TenantColumn from "../../Types/Database/TenantColumn";
|
|
12
|
+
import IconProp from "../../Types/Icon/IconProp";
|
|
13
|
+
import { JSONObject } from "../../Types/JSON";
|
|
14
|
+
import {
|
|
15
|
+
KubernetesAiAgentConnectionStatus,
|
|
16
|
+
KubernetesAiAgentRegistrationRefusalReason,
|
|
17
|
+
} from "../../Types/Kubernetes/KubernetesClusterAiAccess";
|
|
18
|
+
import ObjectID from "../../Types/ObjectID";
|
|
19
|
+
import Permission from "../../Types/Permission";
|
|
20
|
+
import { Column, Entity, Index, JoinColumn, ManyToOne } from "typeorm";
|
|
21
|
+
|
|
22
|
+
/*
|
|
23
|
+
* Who may see a cluster's Kubernetes AI agent: exactly who may read the
|
|
24
|
+
* cluster (KubernetesCluster's read list). Nobody writes a row through the
|
|
25
|
+
* API — the agent registers and heartbeats through
|
|
26
|
+
* /kubernetes-ai-agent-ingest, and an admin reset goes through the cluster's
|
|
27
|
+
* AI access API, both as root.
|
|
28
|
+
*/
|
|
29
|
+
const CLUSTER_READERS: Array<Permission> = [
|
|
30
|
+
Permission.ProjectOwner,
|
|
31
|
+
Permission.ProjectAdmin,
|
|
32
|
+
Permission.ProjectMember,
|
|
33
|
+
Permission.Viewer,
|
|
34
|
+
Permission.SettingsAdmin,
|
|
35
|
+
Permission.SettingsMember,
|
|
36
|
+
Permission.SettingsViewer,
|
|
37
|
+
Permission.ReadKubernetesCluster,
|
|
38
|
+
];
|
|
39
|
+
|
|
40
|
+
/*
|
|
41
|
+
* The Kubernetes AI agent of one cluster: the slim in-cluster kubectl
|
|
42
|
+
* executor the kubernetes-agent chart installs (image
|
|
43
|
+
* oneuptime/kubernetes-ai-agent). It is deliberately NOT a Runner: it never
|
|
44
|
+
* appears on the Runners page, is never handed a credential and runs nothing
|
|
45
|
+
* but AI kubectl jobs (RunnerJob rows targeted at it through
|
|
46
|
+
* RunnerJob.targetKubernetesAiAgentId) with its own ServiceAccount.
|
|
47
|
+
*
|
|
48
|
+
* One row per cluster. The agent registers with the project's telemetry
|
|
49
|
+
* ingestion key and receives an agent key; only the key's sha256 is kept
|
|
50
|
+
* (keyHash), and no user can read it. The dashboard reads the row through the
|
|
51
|
+
* cluster's AI access status, which is why there is no CRUD API and no API
|
|
52
|
+
* documentation for this table (UserProjectSsoConsent is the precedent).
|
|
53
|
+
*/
|
|
54
|
+
@TenantColumn("projectId")
|
|
55
|
+
@TableAccessControl({
|
|
56
|
+
create: [],
|
|
57
|
+
read: CLUSTER_READERS,
|
|
58
|
+
delete: [],
|
|
59
|
+
update: [],
|
|
60
|
+
})
|
|
61
|
+
/*
|
|
62
|
+
* One agent per cluster, enforced by the database: two pods registering for
|
|
63
|
+
* the same new cluster at once must not both create a row. Named, and
|
|
64
|
+
* declared here rather than only in a migration, so TypeORM's schema builder
|
|
65
|
+
* recognises it and never generates a DROP for it.
|
|
66
|
+
*/
|
|
67
|
+
@Index("IDX_KubernetesAiAgent_kubernetesClusterId", ["kubernetesClusterId"], {
|
|
68
|
+
unique: true,
|
|
69
|
+
where: '"deletedAt" IS NULL',
|
|
70
|
+
})
|
|
71
|
+
@TableMetadata({
|
|
72
|
+
tableName: "KubernetesAiAgent",
|
|
73
|
+
singularName: "Kubernetes AI Agent",
|
|
74
|
+
pluralName: "Kubernetes AI Agents",
|
|
75
|
+
icon: IconProp.Cube,
|
|
76
|
+
tableDescription:
|
|
77
|
+
"The Kubernetes AI agent installed in a cluster by the Kubernetes agent chart: the in-cluster kubectl executor OneUptime AI uses to investigate (and, when allowed, fix) that cluster. One per cluster. Managed by the server; not user-writable.",
|
|
78
|
+
})
|
|
79
|
+
@Entity({
|
|
80
|
+
name: "KubernetesAiAgent",
|
|
81
|
+
})
|
|
82
|
+
export default class KubernetesAiAgent extends BaseModel {
|
|
83
|
+
@ColumnAccessControl({
|
|
84
|
+
create: [],
|
|
85
|
+
read: CLUSTER_READERS,
|
|
86
|
+
update: [],
|
|
87
|
+
})
|
|
88
|
+
@TableColumn({
|
|
89
|
+
manyToOneRelationColumn: "projectId",
|
|
90
|
+
type: TableColumnType.Entity,
|
|
91
|
+
modelType: Project,
|
|
92
|
+
title: "Project",
|
|
93
|
+
description: "Relation to Project Resource in which this object belongs",
|
|
94
|
+
})
|
|
95
|
+
@ManyToOne(
|
|
96
|
+
() => {
|
|
97
|
+
return Project;
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
eager: false,
|
|
101
|
+
nullable: false,
|
|
102
|
+
onDelete: "CASCADE",
|
|
103
|
+
orphanedRowAction: "nullify",
|
|
104
|
+
},
|
|
105
|
+
)
|
|
106
|
+
@JoinColumn({ name: "projectId" })
|
|
107
|
+
public project?: Project = undefined;
|
|
108
|
+
|
|
109
|
+
@ColumnAccessControl({
|
|
110
|
+
create: [],
|
|
111
|
+
read: CLUSTER_READERS,
|
|
112
|
+
update: [],
|
|
113
|
+
})
|
|
114
|
+
@Index()
|
|
115
|
+
@TableColumn({
|
|
116
|
+
type: TableColumnType.ObjectID,
|
|
117
|
+
required: true,
|
|
118
|
+
canReadOnRelationQuery: true,
|
|
119
|
+
title: "Project ID",
|
|
120
|
+
description: "ID of your OneUptime Project in which this object belongs",
|
|
121
|
+
})
|
|
122
|
+
@Column({
|
|
123
|
+
type: ColumnType.ObjectID,
|
|
124
|
+
nullable: false,
|
|
125
|
+
transformer: ObjectID.getDatabaseTransformer(),
|
|
126
|
+
})
|
|
127
|
+
public projectId?: ObjectID = undefined;
|
|
128
|
+
|
|
129
|
+
@ColumnAccessControl({
|
|
130
|
+
create: [],
|
|
131
|
+
read: CLUSTER_READERS,
|
|
132
|
+
update: [],
|
|
133
|
+
})
|
|
134
|
+
@TableColumn({
|
|
135
|
+
manyToOneRelationColumn: "kubernetesClusterId",
|
|
136
|
+
type: TableColumnType.Entity,
|
|
137
|
+
modelType: KubernetesCluster,
|
|
138
|
+
title: "Kubernetes Cluster",
|
|
139
|
+
description: "The cluster this Kubernetes AI agent runs in.",
|
|
140
|
+
})
|
|
141
|
+
@ManyToOne(
|
|
142
|
+
() => {
|
|
143
|
+
return KubernetesCluster;
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
eager: false,
|
|
147
|
+
nullable: false,
|
|
148
|
+
onDelete: "CASCADE",
|
|
149
|
+
orphanedRowAction: "nullify",
|
|
150
|
+
},
|
|
151
|
+
)
|
|
152
|
+
@JoinColumn({ name: "kubernetesClusterId" })
|
|
153
|
+
public kubernetesCluster?: KubernetesCluster = undefined;
|
|
154
|
+
|
|
155
|
+
@ColumnAccessControl({
|
|
156
|
+
create: [],
|
|
157
|
+
read: CLUSTER_READERS,
|
|
158
|
+
update: [],
|
|
159
|
+
})
|
|
160
|
+
@TableColumn({
|
|
161
|
+
type: TableColumnType.ObjectID,
|
|
162
|
+
required: true,
|
|
163
|
+
canReadOnRelationQuery: true,
|
|
164
|
+
title: "Kubernetes Cluster ID",
|
|
165
|
+
description:
|
|
166
|
+
"ID of the cluster this Kubernetes AI agent runs in. A cluster has at most one agent.",
|
|
167
|
+
})
|
|
168
|
+
@Column({
|
|
169
|
+
type: ColumnType.ObjectID,
|
|
170
|
+
nullable: false,
|
|
171
|
+
transformer: ObjectID.getDatabaseTransformer(),
|
|
172
|
+
})
|
|
173
|
+
public kubernetesClusterId?: ObjectID = undefined;
|
|
174
|
+
|
|
175
|
+
/*
|
|
176
|
+
* sha256 (hex) of the agent key the agent presents on every request after
|
|
177
|
+
* registration. The key itself is never stored. Null after an admin reset:
|
|
178
|
+
* no key matches, so the running pod fails authentication and registers
|
|
179
|
+
* again. Unreadable by every role — even a hash of a bearer credential is
|
|
180
|
+
* nothing the dashboard or the API should hand out.
|
|
181
|
+
*/
|
|
182
|
+
@ColumnAccessControl({
|
|
183
|
+
create: [],
|
|
184
|
+
read: [],
|
|
185
|
+
update: [],
|
|
186
|
+
})
|
|
187
|
+
@TableColumn({
|
|
188
|
+
type: TableColumnType.ShortText,
|
|
189
|
+
required: false,
|
|
190
|
+
title: "Key Hash",
|
|
191
|
+
description:
|
|
192
|
+
"SHA-256 of the key the agent authenticates with. Set by the server; never readable.",
|
|
193
|
+
})
|
|
194
|
+
@Column({
|
|
195
|
+
type: ColumnType.ShortText,
|
|
196
|
+
length: ColumnLength.ShortText,
|
|
197
|
+
nullable: true,
|
|
198
|
+
})
|
|
199
|
+
public keyHash?: string = undefined;
|
|
200
|
+
|
|
201
|
+
@ColumnAccessControl({
|
|
202
|
+
create: [],
|
|
203
|
+
read: CLUSTER_READERS,
|
|
204
|
+
update: [],
|
|
205
|
+
})
|
|
206
|
+
@TableColumn({
|
|
207
|
+
type: TableColumnType.ShortText,
|
|
208
|
+
required: false,
|
|
209
|
+
title: "Agent Version",
|
|
210
|
+
description:
|
|
211
|
+
"Self-reported version of the Kubernetes AI agent. Updated on registration and every heartbeat.",
|
|
212
|
+
})
|
|
213
|
+
@Column({
|
|
214
|
+
type: ColumnType.ShortText,
|
|
215
|
+
length: ColumnLength.ShortText,
|
|
216
|
+
nullable: true,
|
|
217
|
+
})
|
|
218
|
+
public agentVersion?: string = undefined;
|
|
219
|
+
|
|
220
|
+
/*
|
|
221
|
+
* The agent's last reported posture (KubernetesAgentPosture), stored bare
|
|
222
|
+
* — not under a hostInfo.kubernetes wrapper like a Runner's — and always
|
|
223
|
+
* read back through parseKubernetesAgentPosture. The server forces
|
|
224
|
+
* inCluster and clusterIdentifier before storing it.
|
|
225
|
+
*/
|
|
226
|
+
@ColumnAccessControl({
|
|
227
|
+
create: [],
|
|
228
|
+
read: CLUSTER_READERS,
|
|
229
|
+
update: [],
|
|
230
|
+
})
|
|
231
|
+
@TableColumn({
|
|
232
|
+
type: TableColumnType.JSON,
|
|
233
|
+
required: false,
|
|
234
|
+
title: "Posture",
|
|
235
|
+
description:
|
|
236
|
+
"What the agent last reported about itself: whether it may write, the namespaces it may write in, whether it may run node operations, its own namespace and its kubectl and chart versions. Set by the server.",
|
|
237
|
+
})
|
|
238
|
+
@Column({
|
|
239
|
+
type: ColumnType.JSON,
|
|
240
|
+
nullable: true,
|
|
241
|
+
})
|
|
242
|
+
public posture?: JSONObject = undefined;
|
|
243
|
+
|
|
244
|
+
@ColumnAccessControl({
|
|
245
|
+
create: [],
|
|
246
|
+
read: CLUSTER_READERS,
|
|
247
|
+
update: [],
|
|
248
|
+
})
|
|
249
|
+
@TableColumn({
|
|
250
|
+
type: TableColumnType.Date,
|
|
251
|
+
required: false,
|
|
252
|
+
canReadOnRelationQuery: true,
|
|
253
|
+
title: "Last Alive At",
|
|
254
|
+
description: "Most recent registration or heartbeat from this agent.",
|
|
255
|
+
})
|
|
256
|
+
@Column({
|
|
257
|
+
type: ColumnType.Date,
|
|
258
|
+
nullable: true,
|
|
259
|
+
})
|
|
260
|
+
public lastAliveAt?: Date = undefined;
|
|
261
|
+
|
|
262
|
+
@ColumnAccessControl({
|
|
263
|
+
create: [],
|
|
264
|
+
read: CLUSTER_READERS,
|
|
265
|
+
update: [],
|
|
266
|
+
})
|
|
267
|
+
@TableColumn({
|
|
268
|
+
type: TableColumnType.ShortText,
|
|
269
|
+
required: true,
|
|
270
|
+
isDefaultValueColumn: true,
|
|
271
|
+
canReadOnRelationQuery: true,
|
|
272
|
+
title: "Connection Status",
|
|
273
|
+
description:
|
|
274
|
+
"connected while the agent registers and heartbeats; disconnected once it signs off or is reset. It is online only when connected AND its last heartbeat is recent.",
|
|
275
|
+
defaultValue: "disconnected",
|
|
276
|
+
})
|
|
277
|
+
@Column({
|
|
278
|
+
type: ColumnType.ShortText,
|
|
279
|
+
length: ColumnLength.ShortText,
|
|
280
|
+
nullable: false,
|
|
281
|
+
default: "disconnected",
|
|
282
|
+
})
|
|
283
|
+
public connectionStatus?: KubernetesAiAgentConnectionStatus = undefined;
|
|
284
|
+
|
|
285
|
+
@ColumnAccessControl({
|
|
286
|
+
create: [],
|
|
287
|
+
read: CLUSTER_READERS,
|
|
288
|
+
update: [],
|
|
289
|
+
})
|
|
290
|
+
@TableColumn({
|
|
291
|
+
type: TableColumnType.Date,
|
|
292
|
+
required: false,
|
|
293
|
+
title: "Last Registered At",
|
|
294
|
+
description: "When the agent last registered and was issued a key.",
|
|
295
|
+
})
|
|
296
|
+
@Column({
|
|
297
|
+
type: ColumnType.Date,
|
|
298
|
+
nullable: true,
|
|
299
|
+
})
|
|
300
|
+
public lastRegisteredAt?: Date = undefined;
|
|
301
|
+
|
|
302
|
+
/*
|
|
303
|
+
* The TelemetryIngestionKey whose request last minted this agent's key
|
|
304
|
+
* (TelemetryRequest.ingestionKeyPolicy.ingestionKeyId), so an operator
|
|
305
|
+
* who revokes a leaked key can tell which agents it registered. No foreign
|
|
306
|
+
* key: deleting an ingestion key must not delete or re-key an agent.
|
|
307
|
+
*/
|
|
308
|
+
@ColumnAccessControl({
|
|
309
|
+
create: [],
|
|
310
|
+
read: CLUSTER_READERS,
|
|
311
|
+
update: [],
|
|
312
|
+
})
|
|
313
|
+
@TableColumn({
|
|
314
|
+
type: TableColumnType.ObjectID,
|
|
315
|
+
required: false,
|
|
316
|
+
title: "Registered With Ingestion Key ID",
|
|
317
|
+
description:
|
|
318
|
+
"ID of the telemetry ingestion key the agent last registered with.",
|
|
319
|
+
})
|
|
320
|
+
@Column({
|
|
321
|
+
type: ColumnType.ObjectID,
|
|
322
|
+
nullable: true,
|
|
323
|
+
transformer: ObjectID.getDatabaseTransformer(),
|
|
324
|
+
})
|
|
325
|
+
public registeredWithIngestionKeyId?: ObjectID = undefined;
|
|
326
|
+
|
|
327
|
+
@ColumnAccessControl({
|
|
328
|
+
create: [],
|
|
329
|
+
read: CLUSTER_READERS,
|
|
330
|
+
update: [],
|
|
331
|
+
})
|
|
332
|
+
@TableColumn({
|
|
333
|
+
type: TableColumnType.Date,
|
|
334
|
+
required: false,
|
|
335
|
+
title: "Last Refused Registration At",
|
|
336
|
+
description:
|
|
337
|
+
"When another agent pod last tried to register for this cluster and was refused.",
|
|
338
|
+
})
|
|
339
|
+
@Column({
|
|
340
|
+
type: ColumnType.Date,
|
|
341
|
+
nullable: true,
|
|
342
|
+
})
|
|
343
|
+
public lastRefusedRegistrationAt?: Date = undefined;
|
|
344
|
+
|
|
345
|
+
@ColumnAccessControl({
|
|
346
|
+
create: [],
|
|
347
|
+
read: CLUSTER_READERS,
|
|
348
|
+
update: [],
|
|
349
|
+
})
|
|
350
|
+
@TableColumn({
|
|
351
|
+
type: TableColumnType.ShortText,
|
|
352
|
+
required: false,
|
|
353
|
+
title: "Last Refused Registration Reason",
|
|
354
|
+
description:
|
|
355
|
+
"Why that registration was refused, for example previous_instance_online.",
|
|
356
|
+
})
|
|
357
|
+
@Column({
|
|
358
|
+
type: ColumnType.ShortText,
|
|
359
|
+
length: ColumnLength.ShortText,
|
|
360
|
+
nullable: true,
|
|
361
|
+
})
|
|
362
|
+
public lastRefusedRegistrationReason?: KubernetesAiAgentRegistrationRefusalReason =
|
|
363
|
+
undefined;
|
|
364
|
+
}
|
|
@@ -1203,13 +1203,13 @@ export default class KubernetesCluster extends BaseModel {
|
|
|
1203
1203
|
type: TableColumnType.Boolean,
|
|
1204
1204
|
title: "Let AI Investigate With kubectl",
|
|
1205
1205
|
description:
|
|
1206
|
-
"When on, OneUptime AI runs read-only kubectl commands (get, describe, logs, events, top, rollout status) on this cluster while investigating incidents and alerts linked to it, and uses their output, with secret values redacted, as evidence. Nothing is ever changed by an investigation. Anyone who may edit the cluster can turn it on or off.",
|
|
1207
|
-
defaultValue:
|
|
1206
|
+
"When on, OneUptime AI runs read-only kubectl commands (get, describe, logs, events, top, rollout status) on this cluster, through the cluster's Kubernetes AI agent, while investigating incidents and alerts linked to it, and uses their output, with secret values redacted, as evidence. Nothing is ever changed by an investigation. On by default. Anyone who may edit the cluster can turn it on or off.",
|
|
1207
|
+
defaultValue: true,
|
|
1208
1208
|
})
|
|
1209
1209
|
@Column({
|
|
1210
1210
|
type: ColumnType.Boolean,
|
|
1211
1211
|
nullable: false,
|
|
1212
|
-
default:
|
|
1212
|
+
default: true,
|
|
1213
1213
|
})
|
|
1214
1214
|
public isAiInvestigationEnabled?: boolean = undefined;
|
|
1215
1215
|
|
|
@@ -1582,7 +1582,7 @@ export default class Project extends TenantModel {
|
|
|
1582
1582
|
type: TableColumnType.Boolean,
|
|
1583
1583
|
title: "Enable AI Command Execution",
|
|
1584
1584
|
description:
|
|
1585
|
-
"When enabled, auto-remediation rules may let the AI compose and run commands on opted-in Runners (with an operator allowlist for auto-execution, and one-click approval for everything else). Off by default.",
|
|
1585
|
+
"When enabled, auto-remediation rules may let the AI compose and run commands on opted-in Runners (with an operator allowlist for auto-execution, and one-click approval for everything else), and AI may fix Kubernetes clusters reached through a Runner with a Kubernetes credential. Fixes on a cluster through its in-cluster Kubernetes AI agent do not need it: that cluster's AI agent page and the agent's write access decide. Off by default.",
|
|
1586
1586
|
defaultValue: false,
|
|
1587
1587
|
example: false,
|
|
1588
1588
|
})
|
|
@@ -1593,8 +1593,19 @@ export default class Project extends TenantModel {
|
|
|
1593
1593
|
})
|
|
1594
1594
|
public enableAiCommandExecution?: boolean = undefined;
|
|
1595
1595
|
|
|
1596
|
+
/*
|
|
1597
|
+
* The automatic-investigation opt-ins are ON for projects created from now
|
|
1598
|
+
* on, and the column default stays OFF on purpose. ProjectService's
|
|
1599
|
+
* onBeforeCreate turns both on when the create request leaves them unset
|
|
1600
|
+
* (every project created in the dashboard), which is why a creator may
|
|
1601
|
+
* set them (create ACL): a create that says false keeps false. The column
|
|
1602
|
+
* default and defaultValue stay false so existing projects are not
|
|
1603
|
+
* switched on (that would start spending their AI budget), and so the
|
|
1604
|
+
* generated Terraform provider's static default does not flip existing
|
|
1605
|
+
* Terraform-managed projects on their next apply.
|
|
1606
|
+
*/
|
|
1596
1607
|
@ColumnAccessControl({
|
|
1597
|
-
create: [],
|
|
1608
|
+
create: [Permission.User],
|
|
1598
1609
|
read: [
|
|
1599
1610
|
Permission.ProjectOwner,
|
|
1600
1611
|
Permission.ProjectAdmin,
|
|
@@ -1612,7 +1623,7 @@ export default class Project extends TenantModel {
|
|
|
1612
1623
|
type: TableColumnType.Boolean,
|
|
1613
1624
|
title: "Enable Automatic Incident Investigation",
|
|
1614
1625
|
description:
|
|
1615
|
-
"When enabled, OneUptime's AI SRE automatically investigates every new incident and posts a cited root cause analysis to the incident timeline. Requires AI to be enabled and an LLM provider to be configured.",
|
|
1626
|
+
"When enabled, OneUptime's AI SRE automatically investigates every new incident and posts a cited root cause analysis to the incident timeline; any auto-remediation for the incident waits until that investigation settles. On for new projects created in OneUptime; projects that existed before keep their setting. Drafting a postmortem when an incident resolves is a separate setting (Enable Automatic Postmortem Draft). Requires AI to be enabled and an LLM provider to be configured.",
|
|
1616
1627
|
defaultValue: false,
|
|
1617
1628
|
example: true,
|
|
1618
1629
|
})
|
|
@@ -1623,8 +1634,9 @@ export default class Project extends TenantModel {
|
|
|
1623
1634
|
})
|
|
1624
1635
|
public enableAutomaticIncidentInvestigation?: boolean = undefined;
|
|
1625
1636
|
|
|
1637
|
+
// On for new projects; see enableAutomaticIncidentInvestigation above.
|
|
1626
1638
|
@ColumnAccessControl({
|
|
1627
|
-
create: [],
|
|
1639
|
+
create: [Permission.User],
|
|
1628
1640
|
read: [
|
|
1629
1641
|
Permission.ProjectOwner,
|
|
1630
1642
|
Permission.ProjectAdmin,
|
|
@@ -1642,7 +1654,7 @@ export default class Project extends TenantModel {
|
|
|
1642
1654
|
type: TableColumnType.Boolean,
|
|
1643
1655
|
title: "Enable Automatic Alert Investigation",
|
|
1644
1656
|
description:
|
|
1645
|
-
"When enabled, OneUptime's AI SRE automatically investigates every new alert and posts a cited root cause analysis to the alert timeline. Requires AI to be enabled and an LLM provider to be configured.",
|
|
1657
|
+
"When enabled, OneUptime's AI SRE automatically investigates every new alert and posts a cited root cause analysis to the alert timeline. On for new projects created in OneUptime; projects that existed before keep their setting. Requires AI to be enabled and an LLM provider to be configured.",
|
|
1646
1658
|
defaultValue: false,
|
|
1647
1659
|
example: true,
|
|
1648
1660
|
})
|
|
@@ -1653,6 +1665,44 @@ export default class Project extends TenantModel {
|
|
|
1653
1665
|
})
|
|
1654
1666
|
public enableAutomaticAlertInvestigation?: boolean = undefined;
|
|
1655
1667
|
|
|
1668
|
+
/*
|
|
1669
|
+
* Drafting a postmortem when an incident resolves used to ride on
|
|
1670
|
+
* enableAutomaticIncidentInvestigation. It is its own switch now, off by
|
|
1671
|
+
* default, so turning investigations on for new projects does not also
|
|
1672
|
+
* start writing postmortem notes. The migration that added it copied each
|
|
1673
|
+
* existing project's investigation flag into it, so nothing changed for
|
|
1674
|
+
* projects that already had the behaviour.
|
|
1675
|
+
*/
|
|
1676
|
+
@ColumnAccessControl({
|
|
1677
|
+
create: [Permission.User],
|
|
1678
|
+
read: [
|
|
1679
|
+
Permission.ProjectOwner,
|
|
1680
|
+
Permission.ProjectAdmin,
|
|
1681
|
+
Permission.ProjectMember,
|
|
1682
|
+
Permission.Viewer,
|
|
1683
|
+
Permission.ReadProject,
|
|
1684
|
+
Permission.UnAuthorizedSsoUser,
|
|
1685
|
+
Permission.ProjectUser,
|
|
1686
|
+
],
|
|
1687
|
+
update: [Permission.ProjectOwner, Permission.ProjectAdmin],
|
|
1688
|
+
})
|
|
1689
|
+
@TableColumn({
|
|
1690
|
+
required: true,
|
|
1691
|
+
isDefaultValueColumn: true,
|
|
1692
|
+
type: TableColumnType.Boolean,
|
|
1693
|
+
title: "Enable Automatic Postmortem Draft",
|
|
1694
|
+
description:
|
|
1695
|
+
"When enabled, OneUptime's AI SRE drafts a postmortem from the incident's timeline and telemetry when an incident is resolved, for a human to review and edit. It never overwrites a postmortem that already exists. Off by default. Requires AI to be enabled and an LLM provider to be configured.",
|
|
1696
|
+
defaultValue: false,
|
|
1697
|
+
example: true,
|
|
1698
|
+
})
|
|
1699
|
+
@Column({
|
|
1700
|
+
nullable: false,
|
|
1701
|
+
default: false,
|
|
1702
|
+
type: ColumnType.Boolean,
|
|
1703
|
+
})
|
|
1704
|
+
public enableAutomaticPostmortemDraft?: boolean = undefined;
|
|
1705
|
+
|
|
1656
1706
|
@ColumnAccessControl({
|
|
1657
1707
|
create: [],
|
|
1658
1708
|
read: [
|
|
@@ -42,6 +42,16 @@ import { Column, Entity, Index, JoinColumn, ManyToOne } from "typeorm";
|
|
|
42
42
|
* hard-deleted once lastSeenAt falls behind "now - 15min" for clusters
|
|
43
43
|
* that remain connected.
|
|
44
44
|
*
|
|
45
|
+
* One exception to that prune: a Node that reports itself over the
|
|
46
|
+
* Proxmox VE native OpenTelemetry push (isNativePush). Those pushes
|
|
47
|
+
* never say which nodes the cluster has, so a node that goes quiet
|
|
48
|
+
* cannot be told apart from one that was removed: its row is kept for
|
|
49
|
+
* the retention window (PVE_SILENT_NODE_RETENTION_HOURS, 7 days by
|
|
50
|
+
* default) while the nodes still alive report it as Offline
|
|
51
|
+
* (ProxmoxResourceService.markNodesNotReporting — isUp only, never
|
|
52
|
+
* lastSeenAt), however long a OneUptime outage interrupts them, until it
|
|
53
|
+
* reports again or is removed with removeOfflineNode ("Remove Node").
|
|
54
|
+
*
|
|
45
55
|
* Writes go through ProxmoxResourceService under isRoot; users never
|
|
46
56
|
* create/update/delete rows directly.
|
|
47
57
|
*
|
|
@@ -73,7 +83,7 @@ const READ_PERMISSIONS: Array<Permission> = [
|
|
|
73
83
|
pluralName: "Proxmox Resources",
|
|
74
84
|
icon: IconProp.Cube,
|
|
75
85
|
tableDescription:
|
|
76
|
-
"Snapshot of a Proxmox VE object (node, guest or storage) as last reported by the Proxmox agent. Populated by the telemetry ingest pipeline; not user-editable.",
|
|
86
|
+
"Snapshot of a Proxmox VE object (node, guest or storage) as last reported by the Proxmox agent or by Proxmox VE's native OpenTelemetry push, where a node that stops reporting is marked offline by the nodes still reporting. Populated by the telemetry ingest pipeline; not user-editable.",
|
|
77
87
|
})
|
|
78
88
|
@Index(["projectId", "proxmoxClusterId", "kind", "externalId"], {
|
|
79
89
|
unique: true,
|
|
@@ -618,6 +628,44 @@ export default class ProxmoxResource extends BaseModel {
|
|
|
618
628
|
})
|
|
619
629
|
public metricsUpdatedAt?: Date = undefined;
|
|
620
630
|
|
|
631
|
+
@ColumnAccessControl({
|
|
632
|
+
create: [],
|
|
633
|
+
read: READ_PERMISSIONS,
|
|
634
|
+
update: [],
|
|
635
|
+
})
|
|
636
|
+
@TableColumn({
|
|
637
|
+
required: false,
|
|
638
|
+
type: TableColumnType.Boolean,
|
|
639
|
+
canReadOnRelationQuery: true,
|
|
640
|
+
title: "Is Native Push",
|
|
641
|
+
description:
|
|
642
|
+
"True when this row comes from Proxmox VE's built-in OpenTelemetry push, where each node reports only itself; false (or null) for the Proxmox Agent, which asks the cluster about every node. A native-push node that stops reporting is kept, and reported as Offline by the nodes still alive, for the retention window.",
|
|
643
|
+
})
|
|
644
|
+
@Column({
|
|
645
|
+
nullable: true,
|
|
646
|
+
type: ColumnType.Boolean,
|
|
647
|
+
})
|
|
648
|
+
public isNativePush?: boolean = undefined;
|
|
649
|
+
|
|
650
|
+
@ColumnAccessControl({
|
|
651
|
+
create: [],
|
|
652
|
+
read: READ_PERMISSIONS,
|
|
653
|
+
update: [],
|
|
654
|
+
})
|
|
655
|
+
@TableColumn({
|
|
656
|
+
required: false,
|
|
657
|
+
type: TableColumnType.Date,
|
|
658
|
+
canReadOnRelationQuery: true,
|
|
659
|
+
title: "Not Reporting Marked At",
|
|
660
|
+
description:
|
|
661
|
+
"Proxmox VE native push: when the nodes still alive last reported this node as having stopped reporting (refreshed at most once a minute while they keep reporting it). Cleared by the node's own next report. Null for every other row.",
|
|
662
|
+
})
|
|
663
|
+
@Column({
|
|
664
|
+
nullable: true,
|
|
665
|
+
type: ColumnType.Date,
|
|
666
|
+
})
|
|
667
|
+
public notReportingMarkedAt?: Date = undefined;
|
|
668
|
+
|
|
621
669
|
@ColumnAccessControl({
|
|
622
670
|
create: [],
|
|
623
671
|
read: READ_PERMISSIONS,
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import KubernetesAiAgent from "./KubernetesAiAgent";
|
|
1
2
|
import KubernetesCluster from "./KubernetesCluster";
|
|
2
3
|
import Project from "./Project";
|
|
3
4
|
import Runner from "./Runner";
|
|
@@ -460,6 +461,80 @@ export default class RunnerJob extends BaseModel {
|
|
|
460
461
|
})
|
|
461
462
|
public targetAgentId?: ObjectID = undefined;
|
|
462
463
|
|
|
464
|
+
/*
|
|
465
|
+
* The Kubernetes AI agent an AI kubectl job is targeted at, when the
|
|
466
|
+
* cluster is reached through its agent rather than a Runner. An AI kubectl
|
|
467
|
+
* job sets exactly one of targetAgentId (a Runner) and this; only the named
|
|
468
|
+
* agent may claim it. The agent's id is also written to assignedAgentId on
|
|
469
|
+
* claim (that column has no foreign key), so the job heartbeat and result
|
|
470
|
+
* paths are the Runner's own. Deleting the agent row nulls this, which
|
|
471
|
+
* leaves the job claimable by nobody.
|
|
472
|
+
*/
|
|
473
|
+
@ColumnAccessControl({
|
|
474
|
+
create: [],
|
|
475
|
+
read: [
|
|
476
|
+
Permission.ProjectOwner,
|
|
477
|
+
Permission.ProjectAdmin,
|
|
478
|
+
Permission.ProjectMember,
|
|
479
|
+
Permission.Viewer,
|
|
480
|
+
Permission.RunbookAdmin,
|
|
481
|
+
Permission.RunbookMember,
|
|
482
|
+
Permission.RunbookViewer,
|
|
483
|
+
Permission.ReadRunbookExecution,
|
|
484
|
+
],
|
|
485
|
+
update: [],
|
|
486
|
+
})
|
|
487
|
+
@TableColumn({
|
|
488
|
+
manyToOneRelationColumn: "targetKubernetesAiAgentId",
|
|
489
|
+
type: TableColumnType.Entity,
|
|
490
|
+
modelType: KubernetesAiAgent,
|
|
491
|
+
title: "Target Kubernetes AI Agent",
|
|
492
|
+
description:
|
|
493
|
+
"The Kubernetes AI agent this AI kubectl job runs on, when the cluster is reached through its agent rather than a Runner. Only this agent may claim the job.",
|
|
494
|
+
})
|
|
495
|
+
@ManyToOne(
|
|
496
|
+
() => {
|
|
497
|
+
return KubernetesAiAgent;
|
|
498
|
+
},
|
|
499
|
+
{
|
|
500
|
+
eager: false,
|
|
501
|
+
nullable: true,
|
|
502
|
+
onDelete: "SET NULL",
|
|
503
|
+
orphanedRowAction: "nullify",
|
|
504
|
+
},
|
|
505
|
+
)
|
|
506
|
+
@JoinColumn({ name: "targetKubernetesAiAgentId" })
|
|
507
|
+
public targetKubernetesAiAgent?: KubernetesAiAgent = undefined;
|
|
508
|
+
|
|
509
|
+
@ColumnAccessControl({
|
|
510
|
+
create: [],
|
|
511
|
+
read: [
|
|
512
|
+
Permission.ProjectOwner,
|
|
513
|
+
Permission.ProjectAdmin,
|
|
514
|
+
Permission.ProjectMember,
|
|
515
|
+
Permission.Viewer,
|
|
516
|
+
Permission.RunbookAdmin,
|
|
517
|
+
Permission.RunbookMember,
|
|
518
|
+
Permission.RunbookViewer,
|
|
519
|
+
Permission.ReadRunbookExecution,
|
|
520
|
+
],
|
|
521
|
+
update: [],
|
|
522
|
+
})
|
|
523
|
+
@Index()
|
|
524
|
+
@TableColumn({
|
|
525
|
+
type: TableColumnType.ObjectID,
|
|
526
|
+
required: false,
|
|
527
|
+
title: "Target Kubernetes AI Agent ID",
|
|
528
|
+
description:
|
|
529
|
+
"ID of the Kubernetes AI agent that should claim and execute this job.",
|
|
530
|
+
})
|
|
531
|
+
@Column({
|
|
532
|
+
type: ColumnType.ObjectID,
|
|
533
|
+
nullable: true,
|
|
534
|
+
transformer: ObjectID.getDatabaseTransformer(),
|
|
535
|
+
})
|
|
536
|
+
public targetKubernetesAiAgentId?: ObjectID = undefined;
|
|
537
|
+
|
|
463
538
|
@ColumnAccessControl({
|
|
464
539
|
create: [],
|
|
465
540
|
read: [
|