@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
|
@@ -0,0 +1,396 @@
|
|
|
1
|
+
import fs from "fs";
|
|
2
|
+
import os from "os";
|
|
3
|
+
import path from "path";
|
|
4
|
+
import ts from "typescript";
|
|
5
|
+
|
|
6
|
+
/*
|
|
7
|
+
* The Kubernetes AI agent (agents/KubernetesAIAgent) enforces the same
|
|
8
|
+
* kubectl rules as the server before it spawns anything: KubectlPolicy tiers
|
|
9
|
+
* the argv, KubectlWriteScope bounds where a write may land. It is a
|
|
10
|
+
* standalone package with no Common dependency, so it carries BYTE-IDENTICAL
|
|
11
|
+
* copies of those files (and everything they import) under
|
|
12
|
+
* agents/KubernetesAIAgent/Common/, in the same relative layout — plus the
|
|
13
|
+
* Runner's KubectlArgvGuard. If a copy drifts, the two sides of the trust
|
|
14
|
+
* boundary disagree about a command: the server approves what the agent
|
|
15
|
+
* refuses (every fix fails in the cluster), or the agent runs what the
|
|
16
|
+
* server would now refuse.
|
|
17
|
+
*
|
|
18
|
+
* So this fails when:
|
|
19
|
+
* - a copy differs from its source (run `npm run sync-common` in
|
|
20
|
+
* agents/KubernetesAIAgent);
|
|
21
|
+
* - the policy closure starts importing a file that is not copied (add it
|
|
22
|
+
* to agents/KubernetesAIAgent/Scripts/CommonCopies.json and sync), or
|
|
23
|
+
* anything that is not a relative import — a package, or the
|
|
24
|
+
* "Common/..." alias, which the agent cannot resolve;
|
|
25
|
+
* - the agent imports a Common file that is not in the copied set, or the
|
|
26
|
+
* set carries a copy nothing uses.
|
|
27
|
+
*
|
|
28
|
+
* Files (and the copy list) are read with fs, never required: Common's jest
|
|
29
|
+
* config maps any specifier containing "Common/" to this package, which
|
|
30
|
+
* would silently compare a file with itself.
|
|
31
|
+
*/
|
|
32
|
+
|
|
33
|
+
const REPO_ROOT: string = path.resolve(__dirname, "..", "..", "..", "..", "..");
|
|
34
|
+
const COMMON_ROOT: string = path.join(REPO_ROOT, "packages", "Common");
|
|
35
|
+
const AGENT_ROOT: string = path.join(REPO_ROOT, "agents", "KubernetesAIAgent");
|
|
36
|
+
const AGENT_COMMON_ROOT: string = path.join(AGENT_ROOT, "Common");
|
|
37
|
+
// The list Scripts/SyncCommon.js (npm run sync-common) copies from.
|
|
38
|
+
const COPY_LIST: string = path.join(AGENT_ROOT, "Scripts", "CommonCopies.json");
|
|
39
|
+
|
|
40
|
+
interface CopyList {
|
|
41
|
+
commonPolicyFiles: Array<string>;
|
|
42
|
+
otherCopies: Array<{ source: string; target: string }>;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const copyList: CopyList = JSON.parse(
|
|
46
|
+
fs.readFileSync(COPY_LIST, "utf8"),
|
|
47
|
+
) as CopyList;
|
|
48
|
+
|
|
49
|
+
const COPIED: Array<string> = [...copyList.commonPolicyFiles].sort();
|
|
50
|
+
|
|
51
|
+
// Every module specifier a TypeScript file imports or re-exports.
|
|
52
|
+
function getImportSpecifiers(file: string): Array<string> {
|
|
53
|
+
const source: ts.SourceFile = ts.createSourceFile(
|
|
54
|
+
file,
|
|
55
|
+
fs.readFileSync(file, "utf8"),
|
|
56
|
+
ts.ScriptTarget.Latest,
|
|
57
|
+
true,
|
|
58
|
+
);
|
|
59
|
+
const specifiers: Array<string> = [];
|
|
60
|
+
|
|
61
|
+
const visit: (node: ts.Node) => void = (node: ts.Node): void => {
|
|
62
|
+
if (
|
|
63
|
+
(ts.isImportDeclaration(node) || ts.isExportDeclaration(node)) &&
|
|
64
|
+
node.moduleSpecifier &&
|
|
65
|
+
ts.isStringLiteral(node.moduleSpecifier)
|
|
66
|
+
) {
|
|
67
|
+
specifiers.push(node.moduleSpecifier.text);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
if (
|
|
71
|
+
ts.isImportEqualsDeclaration(node) &&
|
|
72
|
+
ts.isExternalModuleReference(node.moduleReference) &&
|
|
73
|
+
ts.isStringLiteral(node.moduleReference.expression)
|
|
74
|
+
) {
|
|
75
|
+
specifiers.push(node.moduleReference.expression.text);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
if (
|
|
79
|
+
ts.isCallExpression(node) &&
|
|
80
|
+
(node.expression.kind === ts.SyntaxKind.ImportKeyword ||
|
|
81
|
+
(ts.isIdentifier(node.expression) &&
|
|
82
|
+
node.expression.text === "require")) &&
|
|
83
|
+
node.arguments[0] &&
|
|
84
|
+
ts.isStringLiteral(node.arguments[0])
|
|
85
|
+
) {
|
|
86
|
+
specifiers.push(node.arguments[0].text);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
ts.forEachChild(node, visit);
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
visit(source);
|
|
93
|
+
return specifiers;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// A relative specifier resolved to a .ts file, or null when none exists.
|
|
97
|
+
function resolveRelative(fromFile: string, specifier: string): string | null {
|
|
98
|
+
const base: string = path.resolve(path.dirname(fromFile), specifier);
|
|
99
|
+
|
|
100
|
+
for (const candidate of [
|
|
101
|
+
`${base}.ts`,
|
|
102
|
+
`${base}.tsx`,
|
|
103
|
+
path.join(base, "index.ts"),
|
|
104
|
+
path.join(base, "Index.ts"),
|
|
105
|
+
]) {
|
|
106
|
+
if (fs.existsSync(candidate)) {
|
|
107
|
+
return candidate;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/*
|
|
115
|
+
* Walk the import graph from these Common files; returns every file reached
|
|
116
|
+
* (Common-relative) and every import that leaves the closure.
|
|
117
|
+
*/
|
|
118
|
+
function walkClosure(
|
|
119
|
+
entries: Array<string>,
|
|
120
|
+
root: string = COMMON_ROOT,
|
|
121
|
+
): {
|
|
122
|
+
files: Array<string>;
|
|
123
|
+
problems: Array<string>;
|
|
124
|
+
} {
|
|
125
|
+
const seen: Set<string> = new Set<string>();
|
|
126
|
+
const problems: Array<string> = [];
|
|
127
|
+
const stack: Array<string> = entries.map((relative: string): string => {
|
|
128
|
+
return path.join(root, relative);
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
while (stack.length > 0) {
|
|
132
|
+
const file: string = stack.pop()!;
|
|
133
|
+
|
|
134
|
+
if (seen.has(file)) {
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
seen.add(file);
|
|
138
|
+
|
|
139
|
+
for (const specifier of getImportSpecifiers(file)) {
|
|
140
|
+
const from: string = path.relative(root, file);
|
|
141
|
+
|
|
142
|
+
if (!specifier.startsWith(".")) {
|
|
143
|
+
problems.push(
|
|
144
|
+
`${from} imports "${specifier}", which is not a relative import the agent can carry`,
|
|
145
|
+
);
|
|
146
|
+
continue;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
const resolved: string | null = resolveRelative(file, specifier);
|
|
150
|
+
|
|
151
|
+
if (!resolved) {
|
|
152
|
+
problems.push(`${from} imports "${specifier}", which does not resolve`);
|
|
153
|
+
continue;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
if (!resolved.startsWith(`${root}${path.sep}`)) {
|
|
157
|
+
problems.push(
|
|
158
|
+
`${from} imports "${specifier}", outside packages/Common`,
|
|
159
|
+
);
|
|
160
|
+
continue;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
stack.push(resolved);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
return {
|
|
168
|
+
files: Array.from(seen)
|
|
169
|
+
.map((file: string): string => {
|
|
170
|
+
return path.relative(root, file).split(path.sep).join("/");
|
|
171
|
+
})
|
|
172
|
+
.sort(),
|
|
173
|
+
problems,
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// The agent's own sources (everything but the copies, builds and deps).
|
|
178
|
+
function listAgentSources(dir: string = AGENT_ROOT): Array<string> {
|
|
179
|
+
const files: Array<string> = [];
|
|
180
|
+
|
|
181
|
+
for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
|
|
182
|
+
const full: string = path.join(dir, entry.name);
|
|
183
|
+
|
|
184
|
+
if (entry.isDirectory()) {
|
|
185
|
+
if (
|
|
186
|
+
["node_modules", "build", "Common"].includes(entry.name) &&
|
|
187
|
+
dir === AGENT_ROOT
|
|
188
|
+
) {
|
|
189
|
+
continue;
|
|
190
|
+
}
|
|
191
|
+
files.push(...listAgentSources(full));
|
|
192
|
+
} else if (entry.name.endsWith(".ts")) {
|
|
193
|
+
files.push(full);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
return files;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
// The copied Common files the agent's own sources import directly.
|
|
201
|
+
function getAgentEntryPoints(): Array<string> {
|
|
202
|
+
const entries: Set<string> = new Set<string>();
|
|
203
|
+
|
|
204
|
+
for (const file of listAgentSources()) {
|
|
205
|
+
for (const specifier of getImportSpecifiers(file)) {
|
|
206
|
+
if (!specifier.startsWith(".")) {
|
|
207
|
+
continue;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
const target: string = path.resolve(path.dirname(file), specifier);
|
|
211
|
+
|
|
212
|
+
if (target.startsWith(`${AGENT_COMMON_ROOT}${path.sep}`)) {
|
|
213
|
+
entries.add(
|
|
214
|
+
path
|
|
215
|
+
.relative(AGENT_COMMON_ROOT, `${target}.ts`)
|
|
216
|
+
.split(path.sep)
|
|
217
|
+
.join("/"),
|
|
218
|
+
);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
return Array.from(entries).sort();
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
describe("Kubernetes AI agent: copies of the kubectl policy closure", () => {
|
|
227
|
+
test("the copied set is the policy and everything it imports", () => {
|
|
228
|
+
expect(COPIED).toEqual(
|
|
229
|
+
expect.arrayContaining([
|
|
230
|
+
"Utils/AiRemediation/KubectlPolicy.ts",
|
|
231
|
+
"Utils/AiRemediation/KubectlWriteScope.ts",
|
|
232
|
+
"Utils/AiRemediation/CommandPolicy.ts",
|
|
233
|
+
"Types/Kubernetes/KubernetesClusterAiAccess.ts",
|
|
234
|
+
"Types/AutoRemediation/AiRemediationCommandPolicyVerdict.ts",
|
|
235
|
+
]),
|
|
236
|
+
);
|
|
237
|
+
});
|
|
238
|
+
|
|
239
|
+
test.each(COPIED)(
|
|
240
|
+
"Common/%s is byte-identical to its source",
|
|
241
|
+
(relative: string) => {
|
|
242
|
+
const source: Buffer = fs.readFileSync(path.join(COMMON_ROOT, relative));
|
|
243
|
+
const copyPath: string = path.join(AGENT_COMMON_ROOT, relative);
|
|
244
|
+
|
|
245
|
+
expect({ relative, copied: fs.existsSync(copyPath) }).toEqual({
|
|
246
|
+
relative,
|
|
247
|
+
copied: true,
|
|
248
|
+
});
|
|
249
|
+
expect({
|
|
250
|
+
relative,
|
|
251
|
+
identical: source.equals(fs.readFileSync(copyPath)),
|
|
252
|
+
}).toEqual({
|
|
253
|
+
relative,
|
|
254
|
+
identical: true,
|
|
255
|
+
});
|
|
256
|
+
},
|
|
257
|
+
);
|
|
258
|
+
|
|
259
|
+
test.each(
|
|
260
|
+
copyList.otherCopies.map((copy: { source: string; target: string }) => {
|
|
261
|
+
return [copy.target, copy.source];
|
|
262
|
+
}),
|
|
263
|
+
)("%s is byte-identical to %s", (target: string, source: string) => {
|
|
264
|
+
expect(
|
|
265
|
+
fs
|
|
266
|
+
.readFileSync(path.join(REPO_ROOT, source))
|
|
267
|
+
.equals(fs.readFileSync(path.join(AGENT_ROOT, target))),
|
|
268
|
+
).toBe(true);
|
|
269
|
+
});
|
|
270
|
+
|
|
271
|
+
test("the argv guard is among the verbatim copies", () => {
|
|
272
|
+
expect(copyList.otherCopies).toContainEqual({
|
|
273
|
+
source: "packages/Runner/Utils/KubectlArgvGuard.ts",
|
|
274
|
+
target: "KubectlArgvGuard.ts",
|
|
275
|
+
});
|
|
276
|
+
});
|
|
277
|
+
|
|
278
|
+
test("the closure imports nothing outside the copied set", () => {
|
|
279
|
+
const closure: { files: Array<string>; problems: Array<string> } =
|
|
280
|
+
walkClosure(COPIED);
|
|
281
|
+
|
|
282
|
+
expect(closure.problems).toEqual([]);
|
|
283
|
+
expect(closure.files).toEqual(COPIED);
|
|
284
|
+
});
|
|
285
|
+
|
|
286
|
+
test("the agent imports only copied files, and every copy is used", () => {
|
|
287
|
+
const entries: Array<string> = getAgentEntryPoints();
|
|
288
|
+
|
|
289
|
+
// Imported directly by the agent...
|
|
290
|
+
for (const entry of entries) {
|
|
291
|
+
expect({ entry, copied: COPIED.includes(entry) }).toEqual({
|
|
292
|
+
entry,
|
|
293
|
+
copied: true,
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
// ...and nothing copied that neither the agent nor the closure needs.
|
|
298
|
+
expect(walkClosure(entries).files).toEqual(COPIED);
|
|
299
|
+
});
|
|
300
|
+
|
|
301
|
+
test("the agent directory holds no stray copies", () => {
|
|
302
|
+
const present: Array<string> = [];
|
|
303
|
+
const walk: (dir: string) => void = (dir: string): void => {
|
|
304
|
+
for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
|
|
305
|
+
const full: string = path.join(dir, entry.name);
|
|
306
|
+
if (entry.isDirectory()) {
|
|
307
|
+
walk(full);
|
|
308
|
+
} else {
|
|
309
|
+
present.push(
|
|
310
|
+
path.relative(AGENT_COMMON_ROOT, full).split(path.sep).join("/"),
|
|
311
|
+
);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
};
|
|
315
|
+
walk(AGENT_COMMON_ROOT);
|
|
316
|
+
|
|
317
|
+
expect(present.sort()).toEqual(COPIED);
|
|
318
|
+
});
|
|
319
|
+
|
|
320
|
+
describe("the checks themselves", () => {
|
|
321
|
+
test("imports that leave the closure are reported", () => {
|
|
322
|
+
const scratch: string = fs.mkdtempSync(path.join(os.tmpdir(), "parity-"));
|
|
323
|
+
const root: string = path.join(scratch, "Common");
|
|
324
|
+
|
|
325
|
+
try {
|
|
326
|
+
fs.mkdirSync(root);
|
|
327
|
+
fs.writeFileSync(
|
|
328
|
+
path.join(scratch, "Outside.ts"),
|
|
329
|
+
"export default 1;\n",
|
|
330
|
+
);
|
|
331
|
+
fs.writeFileSync(path.join(root, "Inside.ts"), "export default 2;\n");
|
|
332
|
+
fs.writeFileSync(
|
|
333
|
+
path.join(root, "Leaf.ts"),
|
|
334
|
+
[
|
|
335
|
+
'import x from "lodash";',
|
|
336
|
+
'import y from "./Missing";',
|
|
337
|
+
'import z from "Common/Types/JSON";',
|
|
338
|
+
'import o from "../Outside";',
|
|
339
|
+
'import i from "./Inside";',
|
|
340
|
+
"export default [x, y, z, o, i];",
|
|
341
|
+
"",
|
|
342
|
+
].join("\n"),
|
|
343
|
+
);
|
|
344
|
+
|
|
345
|
+
const closure: { files: Array<string>; problems: Array<string> } =
|
|
346
|
+
walkClosure(["Leaf.ts"], root);
|
|
347
|
+
|
|
348
|
+
expect(closure.files).toEqual(["Inside.ts", "Leaf.ts"]);
|
|
349
|
+
expect(closure.problems).toHaveLength(4);
|
|
350
|
+
expect(closure.problems[0]).toMatch(
|
|
351
|
+
/imports "lodash", which is not a relative import/,
|
|
352
|
+
);
|
|
353
|
+
expect(closure.problems[1]).toMatch(
|
|
354
|
+
/"\.\/Missing", which does not resolve/,
|
|
355
|
+
);
|
|
356
|
+
expect(closure.problems[2]).toMatch(/imports "Common\/Types\/JSON"/);
|
|
357
|
+
expect(closure.problems[3]).toMatch(
|
|
358
|
+
/"\.\.\/Outside", outside packages\/Common/,
|
|
359
|
+
);
|
|
360
|
+
} finally {
|
|
361
|
+
fs.rmSync(scratch, { recursive: true, force: true });
|
|
362
|
+
}
|
|
363
|
+
});
|
|
364
|
+
|
|
365
|
+
test("import specifiers are found in every form", () => {
|
|
366
|
+
const scratch: string = fs.mkdtempSync(path.join(os.tmpdir(), "parity-"));
|
|
367
|
+
|
|
368
|
+
try {
|
|
369
|
+
const file: string = path.join(scratch, "Forms.ts");
|
|
370
|
+
fs.writeFileSync(
|
|
371
|
+
file,
|
|
372
|
+
[
|
|
373
|
+
'import a from "./a";',
|
|
374
|
+
'import type { B } from "./b";',
|
|
375
|
+
'export { c } from "./c";',
|
|
376
|
+
'export * from "./d";',
|
|
377
|
+
'const e = require("./e");',
|
|
378
|
+
'const f = import("./f");',
|
|
379
|
+
"",
|
|
380
|
+
].join("\n"),
|
|
381
|
+
);
|
|
382
|
+
|
|
383
|
+
expect(getImportSpecifiers(file)).toEqual([
|
|
384
|
+
"./a",
|
|
385
|
+
"./b",
|
|
386
|
+
"./c",
|
|
387
|
+
"./d",
|
|
388
|
+
"./e",
|
|
389
|
+
"./f",
|
|
390
|
+
]);
|
|
391
|
+
} finally {
|
|
392
|
+
fs.rmSync(scratch, { recursive: true, force: true });
|
|
393
|
+
}
|
|
394
|
+
});
|
|
395
|
+
});
|
|
396
|
+
});
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { describe, expect, test } from "@jest/globals";
|
|
1
|
+
import { afterEach, describe, expect, jest, test } from "@jest/globals";
|
|
2
2
|
import DashboardTimeRangeZoomUtil, {
|
|
3
3
|
DashboardTimeRangeZoomState,
|
|
4
4
|
} from "../../../Utils/Dashboard/DashboardTimeRangeZoom";
|
|
@@ -165,6 +165,109 @@ describe("DashboardTimeRangeZoomUtil", () => {
|
|
|
165
165
|
});
|
|
166
166
|
});
|
|
167
167
|
|
|
168
|
+
/*
|
|
169
|
+
* Issue #4105: a panel's selection runs to the END of its last bucket, and
|
|
170
|
+
* the newest bucket of a rolling range is still filling up. Taken whole, a
|
|
171
|
+
* drag onto it would zoom the whole board to a window that ends in the
|
|
172
|
+
* future. The board's zoom now follows the same rule as the page-wide
|
|
173
|
+
* zoom and the log and trace histograms: never past the end of the window
|
|
174
|
+
* the board is on.
|
|
175
|
+
*/
|
|
176
|
+
describe("zoomToWindow never runs past the board's window", () => {
|
|
177
|
+
afterEach(() => {
|
|
178
|
+
jest.useRealTimers();
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
test("a drag onto the newest bucket of a rolling range stops at now", () => {
|
|
182
|
+
jest.useFakeTimers();
|
|
183
|
+
jest.setSystemTime(new Date("2026-09-28T12:00:00.000Z"));
|
|
184
|
+
const state: DashboardTimeRangeZoomState =
|
|
185
|
+
DashboardTimeRangeZoomUtil.getInitialState(ROLLING_HOUR);
|
|
186
|
+
|
|
187
|
+
const zoomed: DashboardTimeRangeZoomState =
|
|
188
|
+
DashboardTimeRangeZoomUtil.zoomToWindow(
|
|
189
|
+
state,
|
|
190
|
+
new Date("2026-09-28T11:50:00.000Z"),
|
|
191
|
+
new Date("2026-09-28T12:01:00.000Z"),
|
|
192
|
+
);
|
|
193
|
+
|
|
194
|
+
expect(zoomed.current.startAndEndDate?.startValue.toISOString()).toBe(
|
|
195
|
+
"2026-09-28T11:50:00.000Z",
|
|
196
|
+
);
|
|
197
|
+
expect(zoomed.current.startAndEndDate?.endValue.toISOString()).toBe(
|
|
198
|
+
"2026-09-28T12:00:00.000Z",
|
|
199
|
+
);
|
|
200
|
+
// The way back is untouched: the rolling hour itself.
|
|
201
|
+
expect(zoomed.baseline).toBe(ROLLING_HOUR);
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
test("a drag past the end of a pinned range stops at that end", () => {
|
|
205
|
+
const state: DashboardTimeRangeZoomState =
|
|
206
|
+
DashboardTimeRangeZoomUtil.getInitialState(PINNED_DAY);
|
|
207
|
+
|
|
208
|
+
const zoomed: DashboardTimeRangeZoomState =
|
|
209
|
+
DashboardTimeRangeZoomUtil.zoomToWindow(
|
|
210
|
+
state,
|
|
211
|
+
new Date("2026-08-20T23:30:00.000Z"),
|
|
212
|
+
new Date("2026-08-21T00:10:00.000Z"),
|
|
213
|
+
);
|
|
214
|
+
|
|
215
|
+
expect(zoomed.current.startAndEndDate?.endValue.toISOString()).toBe(
|
|
216
|
+
"2026-08-21T00:00:00.000Z",
|
|
217
|
+
);
|
|
218
|
+
});
|
|
219
|
+
|
|
220
|
+
test("a drag wholly inside the window is kept as it is", () => {
|
|
221
|
+
const state: DashboardTimeRangeZoomState =
|
|
222
|
+
DashboardTimeRangeZoomUtil.getInitialState(PINNED_DAY);
|
|
223
|
+
|
|
224
|
+
const zoomed: DashboardTimeRangeZoomState =
|
|
225
|
+
DashboardTimeRangeZoomUtil.zoomToWindow(state, DRAG_START, DRAG_END);
|
|
226
|
+
|
|
227
|
+
expect(zoomed.current.startAndEndDate?.endValue).toEqual(DRAG_END);
|
|
228
|
+
});
|
|
229
|
+
|
|
230
|
+
test("a selection that starts after the window ends is not clamped away", () => {
|
|
231
|
+
// The chart can still be drawing a window the board has since left.
|
|
232
|
+
const state: DashboardTimeRangeZoomState =
|
|
233
|
+
DashboardTimeRangeZoomUtil.getInitialState(PINNED_DAY);
|
|
234
|
+
|
|
235
|
+
const zoomed: DashboardTimeRangeZoomState =
|
|
236
|
+
DashboardTimeRangeZoomUtil.zoomToWindow(
|
|
237
|
+
state,
|
|
238
|
+
new Date("2026-08-22T01:00:00.000Z"),
|
|
239
|
+
new Date("2026-08-22T02:00:00.000Z"),
|
|
240
|
+
);
|
|
241
|
+
|
|
242
|
+
expect(zoomed.current.startAndEndDate?.startValue.toISOString()).toBe(
|
|
243
|
+
"2026-08-22T01:00:00.000Z",
|
|
244
|
+
);
|
|
245
|
+
expect(zoomed.current.startAndEndDate?.endValue.toISOString()).toBe(
|
|
246
|
+
"2026-08-22T02:00:00.000Z",
|
|
247
|
+
);
|
|
248
|
+
});
|
|
249
|
+
|
|
250
|
+
test("the zoomed window's end is clamped against the CURRENT window, even when already zoomed", () => {
|
|
251
|
+
const first: DashboardTimeRangeZoomState =
|
|
252
|
+
DashboardTimeRangeZoomUtil.zoomToWindow(
|
|
253
|
+
DashboardTimeRangeZoomUtil.getInitialState(PINNED_DAY),
|
|
254
|
+
DRAG_START,
|
|
255
|
+
DRAG_END,
|
|
256
|
+
);
|
|
257
|
+
|
|
258
|
+
const second: DashboardTimeRangeZoomState =
|
|
259
|
+
DashboardTimeRangeZoomUtil.zoomToWindow(
|
|
260
|
+
first,
|
|
261
|
+
NARROWER_START,
|
|
262
|
+
new Date("2026-08-20T09:40:00.000Z"),
|
|
263
|
+
);
|
|
264
|
+
|
|
265
|
+
expect(second.current.startAndEndDate?.endValue).toEqual(DRAG_END);
|
|
266
|
+
// And the original range is still the way back.
|
|
267
|
+
expect(second.baseline).toBe(PINNED_DAY);
|
|
268
|
+
});
|
|
269
|
+
});
|
|
270
|
+
|
|
168
271
|
describe("resetZoom", () => {
|
|
169
272
|
test("restores the range the board had before the first drag", () => {
|
|
170
273
|
const zoomed: DashboardTimeRangeZoomState =
|
package/Types/AI/AIRunType.ts
CHANGED
|
@@ -17,12 +17,17 @@ enum AIRunType {
|
|
|
17
17
|
RemediationPlan = "RemediationPlan",
|
|
18
18
|
/*
|
|
19
19
|
* An auto-remediation run that COMPOSES commands instead of picking a
|
|
20
|
-
* runbook
|
|
20
|
+
* runbook: rules with aiComposesCommands, and cluster rounds a
|
|
21
|
+
* Kubernetes cluster's AI agent page asks for. In Suggest mode it
|
|
21
22
|
* investigates read-only and proposes a command plan for one-click
|
|
22
23
|
* approval; in FullAuto mode it may also execute commands inline, but
|
|
23
|
-
* only ones that
|
|
24
|
-
* the
|
|
25
|
-
*
|
|
24
|
+
* only ones that pass the structural policy guard and match the rule's
|
|
25
|
+
* operator-authored allowlist (or the cluster's Fixes mode). Rule runs
|
|
26
|
+
* require Project.enableAiCommandExecution (Bash/SSH on Runners, and any
|
|
27
|
+
* kubectl a rule composes) and a target Runner with canRunAiCommands. A
|
|
28
|
+
* cluster round's consent is the cluster's Fixes mode plus the Kubernetes
|
|
29
|
+
* agent chart's write access; it needs the project opt-in only when the
|
|
30
|
+
* cluster is reached through a Runner with a Kubernetes credential.
|
|
26
31
|
*/
|
|
27
32
|
RemediationExecution = "RemediationExecution",
|
|
28
33
|
}
|
|
@@ -2,6 +2,12 @@ export type InvestigationNotStartedCode =
|
|
|
2
2
|
| "ai_disabled"
|
|
3
3
|
| "automatic_investigation_disabled"
|
|
4
4
|
| "provider_missing"
|
|
5
|
+
/*
|
|
6
|
+
* The project runs on OneUptime's own (billed) LLM provider and has no AI
|
|
7
|
+
* credits left, with auto-recharge off — every model call would be
|
|
8
|
+
* refused with "Insufficient AI balance", so no run is started.
|
|
9
|
+
*/
|
|
10
|
+
| "insufficient_ai_balance"
|
|
5
11
|
| "severity_below_threshold"
|
|
6
12
|
| "monitor_cooldown"
|
|
7
13
|
| "daily_budget_exhausted"
|
|
@@ -4,6 +4,20 @@ import {
|
|
|
4
4
|
KubectlCommandTier,
|
|
5
5
|
PROTECTED_KUBERNETES_NAMESPACES,
|
|
6
6
|
} from "../Kubernetes/KubernetesClusterAiAccess";
|
|
7
|
+
import {
|
|
8
|
+
AiRemediationCommandPolicyVerdict,
|
|
9
|
+
MAX_COMMAND_LENGTH_CHARS,
|
|
10
|
+
} from "./AiRemediationCommandPolicyVerdict";
|
|
11
|
+
|
|
12
|
+
/*
|
|
13
|
+
* Defined in a leaf module of their own (no imports) so the pure kubectl
|
|
14
|
+
* policy closure — KubectlPolicy, KubectlWriteScope, CommandPolicy and the
|
|
15
|
+
* types they read — can be copied verbatim into the standalone Kubernetes AI
|
|
16
|
+
* agent (agents/KubernetesAIAgent) without dragging this file, and through
|
|
17
|
+
* its JSON import most of Common, along. Re-exported here so every existing
|
|
18
|
+
* importer keeps working.
|
|
19
|
+
*/
|
|
20
|
+
export { AiRemediationCommandPolicyVerdict, MAX_COMMAND_LENGTH_CHARS };
|
|
7
21
|
|
|
8
22
|
/*
|
|
9
23
|
* The AI-composed command plan stored on
|
|
@@ -26,21 +40,6 @@ export const AI_COMMAND_STEP_TYPES: Array<RunbookStepType> = [
|
|
|
26
40
|
RunbookStepType.Kubectl,
|
|
27
41
|
];
|
|
28
42
|
|
|
29
|
-
export enum AiRemediationCommandPolicyVerdict {
|
|
30
|
-
/*
|
|
31
|
-
* Matched the rule's operator-authored allowlist and passed the
|
|
32
|
-
* structural chain guard — eligible for FullAuto inline execution.
|
|
33
|
-
*/
|
|
34
|
-
AutoApproved = "AutoApproved",
|
|
35
|
-
// Not denylisted, but a human must approve before it runs.
|
|
36
|
-
RequiresApproval = "RequiresApproval",
|
|
37
|
-
/*
|
|
38
|
-
* Matched the hard denylist. Denied commands are never stored in a plan —
|
|
39
|
-
* the verdict exists so policy evaluation has a complete result type.
|
|
40
|
-
*/
|
|
41
|
-
Denied = "Denied",
|
|
42
|
-
}
|
|
43
|
-
|
|
44
43
|
export enum AiRemediationCommandExecutionStatus {
|
|
45
44
|
Pending = "Pending",
|
|
46
45
|
Running = "Running",
|
|
@@ -186,7 +185,6 @@ export function getRollbackCommandStepId(
|
|
|
186
185
|
|
|
187
186
|
// Hard caps — enforced at plan acceptance, not just in the prompt.
|
|
188
187
|
export const MAX_PLAN_COMMANDS: number = 5;
|
|
189
|
-
export const MAX_COMMAND_LENGTH_CHARS: number = 2000;
|
|
190
188
|
export const MIN_COMMAND_TIMEOUT_MS: number = 1000;
|
|
191
189
|
export const MAX_COMMAND_TIMEOUT_MS: number = 5 * 60 * 1000;
|
|
192
190
|
export const DEFAULT_COMMAND_TIMEOUT_MS: number = 60 * 1000;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* The verdict the command policies (CommandPolicy, KubectlPolicy) give one
|
|
3
|
+
* AI-composed command, and the longest command either accepts.
|
|
4
|
+
*
|
|
5
|
+
* A leaf module with no imports on purpose: it is part of the pure policy
|
|
6
|
+
* closure that agents/KubernetesAIAgent carries a byte-identical copy of
|
|
7
|
+
* (see Tests/Utils/AiRemediation/KubernetesAiAgentPolicyCopyParity.test.ts),
|
|
8
|
+
* so it must never import anything outside that closure.
|
|
9
|
+
* AiRemediationCommandPlan re-exports both names.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
export enum AiRemediationCommandPolicyVerdict {
|
|
13
|
+
/*
|
|
14
|
+
* Matched the rule's operator-authored allowlist and passed the
|
|
15
|
+
* structural chain guard — eligible for FullAuto inline execution.
|
|
16
|
+
*/
|
|
17
|
+
AutoApproved = "AutoApproved",
|
|
18
|
+
// Not denylisted, but a human must approve before it runs.
|
|
19
|
+
RequiresApproval = "RequiresApproval",
|
|
20
|
+
/*
|
|
21
|
+
* Matched the hard denylist. Denied commands are never stored in a plan —
|
|
22
|
+
* the verdict exists so policy evaluation has a complete result type.
|
|
23
|
+
*/
|
|
24
|
+
Denied = "Denied",
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// Hard cap — enforced at plan acceptance, not just in the prompt.
|
|
28
|
+
export const MAX_COMMAND_LENGTH_CHARS: number = 2000;
|
|
@@ -38,7 +38,8 @@ export default interface DashboardTraceChartComponent extends BaseComponent {
|
|
|
38
38
|
* (e.g. "#6366f1"). Single-series → the series color; split charts → the
|
|
39
39
|
* first unpinned series, with the rest following the default palette.
|
|
40
40
|
* Same semantics as MetricQueryConfigData.color on the metric Chart
|
|
41
|
-
* widget. Unset = Auto (default palette).
|
|
41
|
+
* widget. Unset = Auto (default palette). A split by statusCode ignores
|
|
42
|
+
* it: each status keeps its own color unless pinned.
|
|
42
43
|
*/
|
|
43
44
|
color?: string | undefined;
|
|
44
45
|
/*
|
|
@@ -46,7 +47,8 @@ export default interface DashboardTraceChartComponent extends BaseComponent {
|
|
|
46
47
|
* (e.g. { "url.host=api.example.com": "#10b981" }) — the same storage
|
|
47
48
|
* shape as MetricQueryConfigData.colorsByGroup, so the shared
|
|
48
49
|
* SeriesGroupColorSelector editor works unchanged. Unpinned series fall
|
|
49
|
-
* back to `color` (lead) then the default palette
|
|
50
|
+
* back to `color` (lead) then the default palette — or, in a statusCode
|
|
51
|
+
* split, to each status's own color.
|
|
50
52
|
*/
|
|
51
53
|
colorsByGroup?: Record<string, string> | undefined;
|
|
52
54
|
/*
|