@oneuptime/common 14.0.10 → 14.0.11
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/AIConversation.ts +127 -1
- package/Models/DatabaseModels/CephCluster.ts +12 -0
- package/Models/DatabaseModels/CloudResource.ts +12 -0
- package/Models/DatabaseModels/DatabaseServer.ts +12 -0
- package/Models/DatabaseModels/DockerHost.ts +12 -0
- package/Models/DatabaseModels/DockerSwarmCluster.ts +12 -0
- package/Models/DatabaseModels/GlobalOidc.ts +0 -4
- package/Models/DatabaseModels/GlobalOidcProject.ts +0 -4
- package/Models/DatabaseModels/GlobalSso.ts +0 -4
- package/Models/DatabaseModels/GlobalSsoProject.ts +0 -4
- package/Models/DatabaseModels/Host.ts +12 -0
- package/Models/DatabaseModels/IncidentForm.ts +594 -0
- package/Models/DatabaseModels/IncidentFormSubmission.ts +283 -0
- package/Models/DatabaseModels/IncidentTemplate.ts +59 -0
- package/Models/DatabaseModels/Index.ts +14 -0
- package/Models/DatabaseModels/IoTFleet.ts +12 -0
- package/Models/DatabaseModels/KubernetesCluster.ts +12 -0
- package/Models/DatabaseModels/MessageQueue.ts +1102 -0
- package/Models/DatabaseModels/MessageQueueLabelRule.ts +553 -0
- package/Models/DatabaseModels/MessageQueueOwnerRule.ts +633 -0
- package/Models/DatabaseModels/MessageQueueOwnerTeam.ts +491 -0
- package/Models/DatabaseModels/MessageQueueOwnerUser.ts +490 -0
- package/Models/DatabaseModels/PodmanHost.ts +12 -0
- package/Models/DatabaseModels/Project.ts +59 -0
- package/Models/DatabaseModels/ProjectOidc.ts +0 -4
- package/Models/DatabaseModels/ProjectSso.ts +0 -4
- package/Models/DatabaseModels/ProxmoxCluster.ts +12 -0
- package/Models/DatabaseModels/RumApplication.ts +12 -0
- package/Models/DatabaseModels/ServerlessFunction.ts +12 -0
- package/Models/DatabaseModels/Service.ts +12 -0
- package/Models/DatabaseModels/StatusPageOidc.ts +0 -4
- package/Models/DatabaseModels/StatusPageSso.ts +0 -4
- package/Models/DatabaseModels/TeamComplianceSetting.ts +47 -2
- package/Models/DatabaseModels/VMwareVCenter.ts +12 -0
- package/Server/API/AIChatAPI.ts +13 -114
- package/Server/API/AIInvestigationAPI.ts +3 -3
- package/Server/API/AIInvestigationConversationAPI.ts +266 -0
- package/Server/API/IncidentFormAPI.ts +376 -0
- package/Server/API/ProjectOIDC.ts +16 -25
- package/Server/API/ProjectSSO.ts +16 -24
- package/Server/API/StatusPageAPI.ts +42 -77
- package/Server/Enterprise/EnterpriseEdition.ts +93 -28
- package/Server/Enterprise/EnterpriseFeature.ts +25 -3
- package/Server/Enterprise/EnterpriseLicenseSnapshot.ts +1 -1
- package/Server/Enterprise/EnterpriseServerModule.ts +4 -1
- package/Server/EnvironmentConfig.ts +1 -1
- package/Server/Infrastructure/Postgres/SchemaMigrations/1796400000000-AddIncidentForms.ts +129 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1796500000000-AddTeamComplianceRuleNotificationChannels.ts +52 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1796600000000-AddAIInvestigationConversationAndTimeLimits.ts +75 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1796700000000-AddMessageQueueTables.ts +477 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +8 -0
- package/Server/Middleware/IncidentFormRateLimit.ts +847 -0
- package/Server/Middleware/UserAuthorization.ts +16 -38
- package/Server/Services/AIService.ts +10 -13
- package/Server/Services/IncidentCustomFieldService.ts +112 -2
- package/Server/Services/IncidentEpisodeMemberService.ts +24 -4
- package/Server/Services/IncidentEpisodeService.ts +10 -1
- package/Server/Services/IncidentFormService.ts +1566 -0
- package/Server/Services/IncidentFormSubmissionService.ts +97 -0
- package/Server/Services/IncidentGroupingEngineService.ts +45 -8
- package/Server/Services/IncidentService.ts +123 -5
- package/Server/Services/IncidentTemplateService.ts +22 -0
- package/Server/Services/Index.ts +14 -0
- package/Server/Services/MessageQueueLabelRuleEngineService.ts +321 -0
- package/Server/Services/MessageQueueLabelRuleService.ts +14 -0
- package/Server/Services/MessageQueueOwnerRuleEngineService.ts +412 -0
- package/Server/Services/MessageQueueOwnerRuleService.ts +14 -0
- package/Server/Services/MessageQueueOwnerTeamService.ts +62 -0
- package/Server/Services/MessageQueueOwnerUserService.ts +62 -0
- package/Server/Services/MessageQueueService.ts +1463 -0
- package/Server/Services/OpenTelemetryIngestService.ts +37 -4
- package/Server/Services/ProjectService.ts +0 -59
- package/Server/Services/StatusPagePrivateUserService.ts +1 -4
- package/Server/Services/StatusPageService.ts +1 -51
- package/Server/Services/TeamComplianceSettingService.ts +163 -42
- package/Server/Services/UserNotificationRuleService.ts +8 -1
- package/Server/Services/WorkspaceNotificationSummaryService.ts +12 -3
- package/Server/Types/Database/Permissions/CreatePermission.ts +17 -3
- package/Server/Types/Database/Permissions/EditionPermission.ts +140 -38
- package/Server/Types/Database/Permissions/OwnerTableRegistry.ts +16 -0
- package/Server/Types/Database/Permissions/TablePermission.ts +3 -3
- package/Server/Types/Database/Permissions/UpdatePermission.ts +20 -6
- package/Server/Utils/AI/Chat/AgentContextCompactor.ts +200 -0
- package/Server/Utils/AI/Chat/ChatAgentRunner.ts +307 -48
- package/Server/Utils/AI/Chat/ChatRunCancellation.ts +156 -0
- package/Server/Utils/AI/Chat/ObservabilityAssistant.ts +78 -18
- package/Server/Utils/AI/Chat/ObservabilityChatPrompt.ts +1 -1
- package/Server/Utils/AI/Chat/ToolOutputPager.ts +322 -0
- package/Server/Utils/AI/ClusterAccess/KubectlInvestigationToolkit.ts +88 -30
- package/Server/Utils/AI/ClusterAccess/KubectlJobRunner.ts +13 -1
- package/Server/Utils/AI/CodeFix/CodeFixReadiness.ts +0 -32
- package/Server/Utils/AI/CodeFix/FixRunBudget.ts +27 -25
- package/Server/Utils/AI/Remediation/RemediationCommandTools.ts +7 -1
- package/Server/Utils/AI/Remediation/RemediationExecutionRunner.ts +34 -14
- package/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.ts +69 -24
- package/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.ts +9 -0
- package/Server/Utils/AI/SRE/AIInvestigationEngine.ts +53 -10
- package/Server/Utils/AI/SRE/AlertInvestigationRunner.ts +27 -10
- package/Server/Utils/AI/SRE/IncidentInvestigationRunner.ts +27 -10
- package/Server/Utils/AI/SRE/InvestigationQueue.ts +16 -19
- package/Server/Utils/AI/SRE/InvestigationThread.ts +646 -0
- package/Server/Utils/AI/SRE/InvestigationThreadService.ts +715 -0
- package/Server/Utils/AI/Toolbox/Serializer.ts +10 -3
- package/Server/Utils/EditionEnforcement.ts +19 -202
- package/Server/Utils/LLM/LLMService.ts +259 -63
- package/Server/Utils/RelaxedScimTeamLocksReport.ts +245 -0
- package/Server/Utils/Rules/RuleRun/RuleRunRegistry.ts +25 -0
- package/Server/Utils/SameOriginRequest.ts +203 -0
- package/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.ts +2 -0
- package/Server/Utils/Telemetry/EntityRegistry.ts +4 -1
- package/Server/Utils/Telemetry/MessageQueueDiscovery.ts +1402 -0
- package/Server/Utils/Telemetry/ResourceEntityFilter.ts +4 -1
- package/Server/Utils/VendorAssets.ts +3 -3
- package/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.ts +3 -1
- package/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.ts +3 -1
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +10 -1
- package/Tests/App/Accounts/IncidentFormPage.test.tsx +2036 -0
- package/Tests/App/Accounts/IncidentFormServerMessages.test.ts +119 -0
- package/Tests/App/Accounts/IncidentFormUtils.test.ts +1157 -0
- package/Tests/App/Accounts/LoginPasskey.test.tsx +6 -4
- package/Tests/App/Accounts/LoginSso.test.tsx +724 -0
- package/Tests/App/AdminDashboard/AdminAuthenticationRequireSso.test.tsx +338 -0
- package/Tests/App/AdminDashboard/AdminAuthenticationSsoCardLocales.test.tsx +331 -0
- package/Tests/App/AdminDashboard/AdminEnterprisePluginPage.test.tsx +47 -33
- package/Tests/App/AdminDashboard/GlobalSsoOidcPages.test.tsx +1021 -0
- package/Tests/App/Dashboard/AffectedResourcesDisplay.test.tsx +876 -78
- package/Tests/App/Dashboard/AffectedResourcesSlo.test.tsx +20 -3
- package/Tests/App/Dashboard/CephProxmoxVMwareDocumentationCards.test.tsx +359 -0
- package/Tests/App/Dashboard/CephSetupGuide.test.ts +961 -0
- package/Tests/App/Dashboard/CloudDocumentationCard.test.tsx +381 -95
- package/Tests/App/Dashboard/CloudSetupGuide.test.ts +1463 -0
- package/Tests/App/Dashboard/ClusterAccessNotice.test.tsx +174 -12
- package/Tests/App/Dashboard/ContainerSetupGuideCards.test.tsx +345 -0
- package/Tests/App/Dashboard/CoreListEmptyStates.test.tsx +501 -0
- package/Tests/App/Dashboard/DashboardLazyPages.test.tsx +0 -1
- package/Tests/App/Dashboard/DatabaseDocumentationCard.test.tsx +400 -0
- package/Tests/App/Dashboard/DatabaseDocumentationMarkdown.test.ts +5 -0
- package/Tests/App/Dashboard/DatabaseSetupGuide.test.ts +1869 -0
- package/Tests/App/Dashboard/DatabaseTelemetryScope.test.ts +44 -0
- package/Tests/App/Dashboard/DatabaseTelemetryTabs.test.tsx +50 -9
- package/Tests/App/Dashboard/DockerSetupGuide.test.ts +899 -0
- package/Tests/App/Dashboard/DockerSwarmSetupGuide.test.ts +964 -0
- package/Tests/App/Dashboard/EnterpriseFeatureUpgrade.test.tsx +141 -7
- package/Tests/App/Dashboard/EnterprisePluginPage.test.tsx +52 -39
- package/Tests/App/Dashboard/EventOverviewPages.test.tsx +7 -1
- package/Tests/App/Dashboard/GettingStartedTaskRoutes.test.tsx +331 -0
- package/Tests/App/Dashboard/HomeOverviewStatsFirstRun.test.tsx +925 -0
- package/Tests/App/Dashboard/HostDocumentationCard.test.tsx +225 -0
- package/Tests/App/Dashboard/HostSetupGuide.test.ts +1183 -0
- package/Tests/App/Dashboard/IdentityEnterpriseShells.test.tsx +69 -45
- package/Tests/App/Dashboard/IncidentCreateTemplateCustomFieldSettings.test.tsx +745 -0
- package/Tests/App/Dashboard/IncidentCreateTemplateOwners.test.tsx +414 -0
- package/Tests/App/Dashboard/IncidentCustomFieldCreateSettingsForm.test.ts +1042 -0
- package/Tests/App/Dashboard/IncidentCustomFieldSettingsCard.test.tsx +1816 -0
- package/Tests/App/Dashboard/IncidentFormPlan.test.ts +89 -0
- package/Tests/App/Dashboard/IncidentFormShareLinkCard.test.tsx +846 -0
- package/Tests/App/Dashboard/IncidentFormsPages.test.tsx +1324 -0
- package/Tests/App/Dashboard/IncidentTemplateCustomFieldSettings.test.tsx +630 -0
- package/Tests/App/Dashboard/IncidentsSideMenu.test.tsx +13 -0
- package/Tests/App/Dashboard/IncomingEmailMonitorLinkVerifyHint.test.tsx +104 -0
- package/Tests/App/Dashboard/InvestigationConversation.test.tsx +1107 -0
- package/Tests/App/Dashboard/InvestigationConversationData.test.ts +546 -0
- package/Tests/App/Dashboard/InvestigationEvidenceList.test.tsx +170 -5
- package/Tests/App/Dashboard/InvestigationNotStarted.test.tsx +207 -2
- package/Tests/App/Dashboard/InvestigationPanel.test.tsx +729 -34
- package/Tests/App/Dashboard/InvestigationPanelStatus.test.tsx +9 -21
- package/Tests/App/Dashboard/InvestigationReportView.test.tsx +274 -37
- package/Tests/App/Dashboard/InvestigationStatusBadge.test.tsx +130 -0
- package/Tests/App/Dashboard/IoTDocumentationCard.test.tsx +218 -0
- package/Tests/App/Dashboard/IoTSetupGuide.test.ts +1124 -0
- package/Tests/App/Dashboard/KubernetesClusterAiAccessSettings.test.ts +20 -6
- package/Tests/App/Dashboard/KubernetesClusterAiDocumentationMarkdown.test.ts +107 -83
- package/Tests/App/Dashboard/KubernetesSetupGuide.test.ts +787 -0
- package/Tests/App/Dashboard/MessageQueueBreadcrumbs.test.tsx +228 -0
- package/Tests/App/Dashboard/MessageQueueBrokerHealth.test.tsx +1538 -0
- package/Tests/App/Dashboard/MessageQueueBrokerHealthMetricChart.test.tsx +969 -0
- package/Tests/App/Dashboard/MessageQueueBrokerHealthReads.test.ts +889 -0
- package/Tests/App/Dashboard/MessageQueueBrokerMetricsReach.test.ts +236 -0
- package/Tests/App/Dashboard/MessageQueueDocumentationCard.test.tsx +479 -0
- package/Tests/App/Dashboard/MessageQueueListPages.test.tsx +1232 -0
- package/Tests/App/Dashboard/MessageQueueMetricDescriptions.test.ts +244 -0
- package/Tests/App/Dashboard/MessageQueueMonitorLink.test.ts +952 -0
- package/Tests/App/Dashboard/MessageQueueMonitorLinkMonitorCreate.test.tsx +859 -0
- package/Tests/App/Dashboard/MessageQueueOverview.test.tsx +1773 -0
- package/Tests/App/Dashboard/MessageQueueOverviewPresentation.test.ts +196 -0
- package/Tests/App/Dashboard/MessageQueuePresentation.test.ts +799 -0
- package/Tests/App/Dashboard/MessageQueueProducersConsumers.test.tsx +680 -0
- package/Tests/App/Dashboard/MessageQueueRoutes.test.tsx +383 -0
- package/Tests/App/Dashboard/MessageQueueRulePages.test.tsx +278 -0
- package/Tests/App/Dashboard/MessageQueueSetupGuide.test.ts +2778 -0
- package/Tests/App/Dashboard/MessageQueueSideMenus.test.tsx +273 -0
- package/Tests/App/Dashboard/MessageQueueSpanPopulations.test.ts +930 -0
- package/Tests/App/Dashboard/MessageQueueSpanStore.ts +351 -0
- package/Tests/App/Dashboard/MessageQueueTelemetryScope.test.ts +375 -0
- package/Tests/App/Dashboard/MessageQueueTelemetryScopeTabs.test.tsx +668 -0
- package/Tests/App/Dashboard/MessageQueueViewPages.test.tsx +685 -0
- package/Tests/App/Dashboard/MonitorAndHomeNotOperationalMenus.test.tsx +342 -0
- package/Tests/App/Dashboard/MonitorCreateFirstRunDefaults.test.tsx +623 -0
- package/Tests/App/Dashboard/MonitorCreateFromMonitorBackedDevice.test.tsx +442 -0
- package/Tests/App/Dashboard/MonitorLogsPageViewSummary.test.tsx +814 -0
- package/Tests/App/Dashboard/MonitorSetupCardBodies.test.tsx +246 -0
- package/Tests/App/Dashboard/NavigationSearchKeywords.test.tsx +8 -0
- package/Tests/App/Dashboard/OnboardingSsoEmptyState.test.tsx +27 -12
- package/Tests/App/Dashboard/PlanGatedPage.test.tsx +292 -0
- package/Tests/App/Dashboard/PodmanSetupGuide.test.ts +948 -0
- package/Tests/App/Dashboard/ProductOrientation.test.tsx +5 -4
- package/Tests/App/Dashboard/ProductSettingsSectionCollapsed.test.tsx +266 -0
- package/Tests/App/Dashboard/ProxmoxSetupGuide.test.ts +1318 -0
- package/Tests/App/Dashboard/ResourceAiAgentAttentionServerParity.test.ts +555 -0
- package/Tests/App/Dashboard/ResourceAiAgentPage.test.tsx +298 -9
- package/Tests/App/Dashboard/ResourceAiAgentStatus.test.ts +453 -0
- package/Tests/App/Dashboard/ResourceArchiveSettings.test.tsx +16 -0
- package/Tests/App/Dashboard/ResourceConnectionGuideCard.test.tsx +444 -0
- package/Tests/App/Dashboard/ResourceConnectionGuideOverviewsInfra.test.tsx +798 -0
- package/Tests/App/Dashboard/ResourceConnectionGuideOverviewsPlatforms.test.tsx +717 -0
- package/Tests/App/Dashboard/ResourceConnectionGuides.test.ts +981 -0
- package/Tests/App/Dashboard/ResourceConnectionState.test.ts +132 -0
- package/Tests/App/Dashboard/RumDocumentationCard.test.tsx +293 -0
- package/Tests/App/Dashboard/RumSessionReplayRetentionSettings.test.tsx +467 -0
- package/Tests/App/Dashboard/RumSetupGuide.test.ts +758 -0
- package/Tests/App/Dashboard/ScheduledMaintenanceOverviewPage.test.tsx +25 -0
- package/Tests/App/Dashboard/ServerlessDocumentationCard.test.tsx +254 -0
- package/Tests/App/Dashboard/ServerlessSetupGuide.test.ts +1074 -0
- package/Tests/App/Dashboard/SetupGuide.test.ts +246 -0
- package/Tests/App/Dashboard/SetupGuideCard.test.tsx +756 -0
- package/Tests/App/Dashboard/SloListSideMenu.test.tsx +120 -0
- package/Tests/App/Dashboard/SsoPages.test.tsx +833 -0
- package/Tests/App/Dashboard/TelemetryDocumentation.test.tsx +253 -0
- package/Tests/App/Dashboard/TelemetryRetentionShells.test.tsx +730 -0
- package/Tests/App/Dashboard/VMwareSetupGuide.test.ts +1033 -0
- package/Tests/App/StatusPage/StatusPageSsoEmptyState.test.tsx +87 -7
- package/Tests/Models/DatabaseModels/DatabaseServerModels.test.ts +28 -9
- package/Tests/Models/DatabaseModels/IncidentFormModel.test.ts +1250 -0
- package/Tests/Models/DatabaseModels/MessageQueueModels.test.ts +1983 -0
- package/Tests/Models/DatabaseModels/StaticRuleCriteriaInheritance.test.ts +4 -2
- package/Tests/Models/DatabaseModels/TeamComplianceSettingModel.test.ts +190 -14
- package/Tests/Models/IncidentTemplateCustomFieldSettingsColumn.test.ts +291 -0
- package/Tests/Server/API/AIInvestigationConversationAPI.test.ts +412 -0
- package/Tests/Server/API/GlobalConfigLicense.test.ts +38 -9
- package/Tests/Server/API/IncidentFormAPI.test.ts +942 -0
- package/Tests/Server/API/IncidentFormPublicRoutes.test.ts +1653 -0
- package/Tests/Server/API/KubernetesClusterAiAccessAPI.test.ts +2 -1
- package/Tests/Server/API/{SsoProviderListingsEdition.test.ts → SsoProviderListings.test.ts} +164 -110
- package/Tests/Server/Enterprise/EnterpriseEdition.test.ts +76 -54
- package/Tests/Server/Enterprise/EnterpriseFeatureActive.test.ts +125 -42
- package/Tests/Server/Enterprise/EnterpriseLicenseSnapshot.test.ts +36 -10
- package/Tests/Server/Enterprise/EnterpriseModelFeatureMap.test.ts +51 -9
- package/Tests/Server/Enterprise/FakeEnterpriseModule.ts +13 -8
- package/Tests/Server/Enterprise/SsoInCommunityEdition.test.ts +540 -0
- package/Tests/Server/Infrastructure/Postgres/AddConfigurableRuleCriteriaMigration.test.ts +3 -0
- package/Tests/Server/Infrastructure/Postgres/AddIncidentFormsMigration.test.ts +438 -0
- package/Tests/Server/Infrastructure/Postgres/AddTeamComplianceRuleNotificationChannelsMigration.test.ts +255 -0
- package/Tests/Server/Infrastructure/Postgres/MessageQueueTablesMigration.test.ts +637 -0
- package/Tests/Server/Middleware/IncidentFormRateLimit.test.ts +1630 -0
- package/Tests/Server/Middleware/UserAuthorization.test.ts +16 -17
- package/Tests/Server/Middleware/UserAuthorizationSsoEnforcement.test.ts +544 -0
- package/Tests/Server/Services/AIServiceDailyBudget.test.ts +37 -8
- package/Tests/Server/Services/IncidentCreatedFeedTitle.test.ts +212 -0
- package/Tests/Server/Services/IncidentCustomFieldDeleteFormQuestions.test.ts +297 -0
- package/Tests/Server/Services/IncidentFormOwnersCreatedNotification.test.ts +497 -0
- package/Tests/Server/Services/IncidentFormPostgres.test.ts +958 -0
- package/Tests/Server/Services/IncidentFormPublicForm.test.ts +1260 -0
- package/Tests/Server/Services/IncidentFormPublicSubmission.test.ts +2520 -0
- package/Tests/Server/Services/IncidentFormRegistration.test.ts +159 -0
- package/Tests/Server/Services/IncidentFormService.test.ts +663 -0
- package/Tests/Server/Services/IncidentFormSubmissionService.test.ts +430 -0
- package/Tests/Server/Services/IncidentFormSubmissionTemplateBranch.test.ts +473 -0
- package/Tests/Server/Services/IncidentGroupingTemplateSubstitution.test.ts +81 -0
- package/Tests/Server/Services/IncidentTemplateCustomFieldSettings.test.ts +262 -0
- package/Tests/Server/Services/IncidentTemplateOwnersOnDeclare.test.ts +566 -0
- package/Tests/Server/Services/IncidentTitleMarkdownSinks.test.ts +640 -0
- package/Tests/Server/Services/LlmLogServiceTokenAggregateParams.test.ts +3 -3
- package/Tests/Server/Services/MessageQueueOwnerServices.test.ts +440 -0
- package/Tests/Server/Services/MessageQueueRegistries.test.ts +577 -0
- package/Tests/Server/Services/MessageQueueRuleEngines.test.ts +900 -0
- package/Tests/Server/Services/MessageQueueService.test.ts +2210 -0
- package/Tests/Server/Services/MessageQueueSqlPostgres.test.ts +1271 -0
- package/Tests/Server/Services/OpenTelemetryResourceRetentionMemo.test.ts +28 -1
- package/Tests/Server/Services/OpenTelemetryRetentionOverrideEdition.test.ts +474 -0
- package/Tests/Server/Services/OpenTelemetryServiceResolutionCache.test.ts +21 -0
- package/Tests/Server/Services/OwnerRowUniqueness.test.ts +3 -0
- package/Tests/Server/Services/ProjectServiceAuditLogLicense.test.ts +0 -1
- package/Tests/Server/Services/RuleRun/LabelRuleEnginesGroupBRun.test.ts +56 -6
- package/Tests/Server/Services/RuleRun/OwnerRuleEnginesGroupBRun.test.ts +30 -1
- package/Tests/Server/Services/SsoRequirementReads.test.ts +454 -0
- package/Tests/Server/Services/SsoRequirementWrites.test.ts +529 -0
- package/Tests/Server/Services/StaticRuleCriteriaRuntimeCoverage.test.ts +3 -3
- package/Tests/Server/Services/StatusPagePrivateUserInvitationPolicy.test.ts +107 -89
- package/Tests/Server/Services/TeamComplianceSettingPostgres.test.ts +1068 -176
- package/Tests/Server/Services/TeamComplianceSettingService.test.ts +1962 -200
- package/Tests/Server/Types/Database/Permissions/EditionPermission.test.ts +654 -297
- package/Tests/Server/Types/Database/Permissions/RetentionOverrideColumns.test.ts +784 -0
- package/Tests/Server/Types/Database/Permissions/SsoScalePlanGate.test.ts +418 -0
- package/Tests/Server/Utils/AI/AIAlertGating.test.ts +0 -1
- package/Tests/Server/Utils/AI/AIInvestigationEngineRunLimits.test.ts +136 -0
- package/Tests/Server/Utils/AI/AIInvestigationQueue.test.ts +15 -14
- package/Tests/Server/Utils/AI/AgentContextCompactor.test.ts +351 -0
- package/Tests/Server/Utils/AI/ChatAgentRunnerSharedThread.test.ts +842 -0
- package/Tests/Server/Utils/AI/ChatRunCancellation.test.ts +195 -0
- package/Tests/Server/Utils/AI/CodeFixReadiness.test.ts +10 -57
- package/Tests/Server/Utils/AI/FixRunBudget.test.ts +20 -24
- package/Tests/Server/Utils/AI/Insights/InvestigationQueueInsightSubject.test.ts +7 -30
- package/Tests/Server/Utils/AI/InvestigationClusterAccessWiring.test.ts +225 -29
- package/Tests/Server/Utils/AI/InvestigationInfrastructureAccessWiring.test.ts +266 -25
- package/Tests/Server/Utils/AI/InvestigationThread.test.ts +580 -0
- package/Tests/Server/Utils/AI/InvestigationThreadService.test.ts +801 -0
- package/Tests/Server/Utils/AI/KubectlInvestigationToolkit.test.ts +525 -43
- package/Tests/Server/Utils/AI/KubectlJobRunner.test.ts +4 -2
- package/Tests/Server/Utils/AI/LLMServiceUnreachableProvider.test.ts +435 -0
- package/Tests/Server/Utils/AI/ObservabilityAssistantLimits.test.ts +462 -0
- package/Tests/Server/Utils/AI/RemediationExecutionRunner.test.ts +14 -25
- package/Tests/Server/Utils/AI/RemediationExecutionRunnerResourceMode.test.ts +2 -0
- package/Tests/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.test.ts +297 -15
- package/Tests/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.test.ts +10 -6
- package/Tests/Server/Utils/AI/ToolOutputPager.test.ts +382 -0
- package/Tests/Server/Utils/AI/ToolResultSerializer.test.ts +23 -4
- package/Tests/Server/Utils/AI/Toolbox/LogTools.test.ts +25 -6
- package/Tests/Server/Utils/AI/Toolbox/Serializer.test.ts +14 -3
- package/Tests/Server/Utils/EditionEnforcement.test.ts +107 -147
- package/Tests/Server/Utils/{CommunityEditionSsoReport.test.ts → RelaxedScimTeamLocksReport.test.ts} +212 -208
- package/Tests/Server/Utils/SameOriginRequest.test.ts +372 -0
- package/Tests/Server/Utils/Telemetry/EntityRegistry.test.ts +20 -0
- package/Tests/Server/Utils/Telemetry/MessageQueueDiscovery.test.ts +2590 -0
- package/Tests/Server/Utils/Telemetry/MessageQueueSpanQueryTwin.ts +246 -0
- package/Tests/Server/Utils/Telemetry/TelemetryEntity.test.ts +23 -0
- package/Tests/Types/AI/AIAgentRunLimits.test.ts +255 -0
- package/Tests/Types/Code/JsonSyntax.test.ts +1300 -0
- package/Tests/Types/CustomField/CustomFieldCreateSettings.test.ts +1113 -0
- package/Tests/Types/CustomField/CustomFieldMappingCatalog.test.ts +91 -0
- package/Tests/Types/CustomField/CustomFieldValueValidator.test.ts +30 -0
- package/Tests/Types/Incident/IncidentFormIpAllowlist.test.ts +227 -0
- package/Tests/Types/Incident/IncidentFormPublic.test.ts +1916 -0
- package/Tests/Types/MessageQueue/MessageQueueEntityKey.test.ts +916 -0
- package/Tests/Types/MessageQueue/MessageQueueIdentity.test.ts +567 -0
- package/Tests/Types/MessageQueue/MessageQueueManualIdentity.test.ts +686 -0
- package/Tests/Types/MessageQueue/MessageQueueMetricCatalog.test.ts +1726 -0
- package/Tests/Types/MessageQueue/MessageQueueMetricResolution.test.ts +1758 -0
- package/Tests/Types/MessageQueue/MessagingInstrumentationFixtures.test.ts +4686 -0
- package/Tests/Types/MessageQueue/MessagingSystem.test.ts +840 -0
- package/Tests/Types/MessageQueue/MessagingTelemetryFixtures.ts +3287 -0
- package/Tests/Types/MessageQueue/MessagingTelemetryResolver.test.ts +2966 -0
- package/Tests/Types/Monitor/MessageQueueAlertTemplates.test.ts +5401 -0
- package/Tests/Types/Monitor/MetricEngineFold.ts +154 -0
- package/Tests/Types/ResourceAiAgent/ResourceAiAccess.test.ts +5 -3
- package/Tests/Types/Team/ComplianceRule.test.ts +588 -37
- package/Tests/Types/Team/TeamComplianceStatus.test.ts +64 -11
- package/Tests/Types/XML.test.ts +51 -0
- package/Tests/UI/Components/CodeEditor/CodeEditor.test.tsx +2362 -0
- package/Tests/UI/Components/CodeEditor/CodeEditorCommands.test.ts +810 -0
- package/Tests/UI/Components/CodeEditor/CodeEditorHighlight.test.ts +338 -0
- package/Tests/UI/Components/CodeEditor/CodeEditorLanguages.test.ts +222 -0
- package/Tests/UI/Components/CodeEditor/CodeEditorStyles.test.ts +807 -0
- package/Tests/UI/Components/CodeEditor/NoMonaco.test.ts +245 -0
- package/Tests/UI/Components/CodeEditor/YamlEditor.test.tsx +729 -0
- package/Tests/UI/Components/CopyTextButton.test.tsx +76 -0
- package/Tests/UI/Components/EditionLabelLapseCopy.ts +51 -14
- package/Tests/UI/Components/EditionLabelLicenseStatus.test.tsx +131 -23
- package/Tests/UI/Components/ErrorMessageAction.test.tsx +142 -0
- package/Tests/UI/Components/FacetSidebarInScope.test.tsx +459 -0
- package/Tests/UI/Components/FacetValuesInScope.test.ts +270 -0
- package/Tests/UI/Components/Forms/FormFieldCodeEditors.test.tsx +294 -0
- package/Tests/UI/Components/Forms/FormFieldMarkdown.test.tsx +126 -0
- package/Tests/UI/Components/Forms/FormFieldYaml.test.tsx +22 -75
- package/Tests/UI/Components/Forms/ModelFormOnBeforeCreateMiscData.test.tsx +254 -0
- package/Tests/UI/Components/Icon.test.tsx +32 -0
- package/Tests/UI/Components/Input.test.tsx +31 -0
- package/Tests/UI/Components/LockedFilterChipScope.test.tsx +501 -0
- package/Tests/UI/Components/MarkdownConverters.test.ts +253 -1
- package/Tests/UI/Components/MarkdownEditor.test.tsx +2785 -2
- package/Tests/UI/Components/MarkdownEditorHistory.test.ts +243 -0
- package/Tests/UI/Components/MarkdownListEditing.test.ts +1118 -0
- package/Tests/UI/Components/MarkdownPaste.test.ts +1180 -0
- package/Tests/UI/Components/MarkdownViewerCopy.test.tsx +466 -0
- package/Tests/UI/Components/MarkdownVisualEditing.test.ts +1089 -0
- package/Tests/UI/Components/ModelTable/BaseModelTableEmptyStateAction.test.tsx +623 -0
- package/Tests/UI/Components/ResetObjectID.test.tsx +282 -0
- package/Tests/UI/Components/RuleCriteria/RuleCriteriaModelTable.test.tsx +3 -3
- package/Tests/UI/Components/Table/EmptyTableMessage.test.ts +439 -0
- package/Tests/UI/Components/Table/TableEmptyState.test.tsx +352 -0
- package/Tests/UI/Components/TableRowMobileTitles.test.tsx +78 -0
- package/Tests/UI/Components/TextArea.test.tsx +19 -0
- package/Tests/UI/Components/Workflow/ModelColumnEditor.render.test.tsx +12 -29
- package/Tests/UI/Components/fixtures/MarkdownPasteFixtures.ts +460 -0
- package/Tests/UI/EsbuildConfig.test.ts +115 -39
- package/Tests/UI/EsbuildEnterpriseAlias.test.ts +4 -4
- package/Tests/UI/Monitor/MonitorLogSummaryRender.test.tsx +377 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +81 -1
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +17 -0
- package/Tests/Utils/LabelRuleImportExport.test.ts +5 -0
- package/Tests/Utils/Markdown/DashboardMarkdownRenderer.ts +81 -0
- package/Tests/Utils/Markdown/UntrustedMarkdown.test.ts +1339 -0
- package/Tests/Utils/Monitor/MonitorLogSummaryUtil.test.ts +862 -0
- package/Types/AI/AIAgentRunLimits.ts +146 -0
- package/Types/Code/CodeType.ts +2 -0
- package/Types/Code/JsonSyntax.ts +923 -0
- package/Types/CustomField/CustomFieldCreateSettings.ts +549 -0
- package/Types/CustomField/CustomFieldMappingCatalog.ts +77 -0
- package/Types/CustomField/CustomFieldValueValidator.ts +10 -7
- package/Types/EnterpriseLicense/EnterpriseLicensePeriods.ts +1 -1
- package/Types/Icon/IconProp.ts +2 -0
- package/Types/Incident/IncidentFormIpAllowlist.ts +206 -0
- package/Types/Incident/IncidentFormPublic.ts +1145 -0
- package/Types/Kubernetes/KubernetesClusterAiAccess.ts +10 -3
- package/Types/MessageQueue/MessageQueueIdentity.ts +256 -0
- package/Types/MessageQueue/MessageQueueManualIdentity.ts +325 -0
- package/Types/MessageQueue/MessageQueueMetricCatalog.ts +1357 -0
- package/Types/MessageQueue/MessagingSystem.ts +518 -0
- package/Types/MessageQueue/MessagingTelemetryResolver.ts +2311 -0
- package/Types/Monitor/MessageQueueAlertTemplates.ts +2128 -0
- package/Types/Permission.ts +310 -0
- package/Types/ResourceAiAgent/ResourceAiAccess.ts +10 -4
- package/Types/Rules/RuleCriteriaFieldRegistry.ts +12 -0
- package/Types/Rules/RuleRun.ts +4 -0
- package/Types/Team/ComplianceNotificationChannel.ts +4 -3
- package/Types/Team/ComplianceRule.ts +71 -18
- package/Types/Team/ComplianceRuleType.ts +2 -2
- package/Types/Team/TeamComplianceStatus.ts +6 -2
- package/Types/Telemetry/EntityType.ts +16 -0
- package/Types/Telemetry/LockedFilterDetail.ts +22 -0
- package/Types/XML.ts +26 -0
- package/UI/Components/CodeEditor/CodeEditor.css +379 -0
- package/UI/Components/CodeEditor/CodeEditor.tsx +1128 -294
- package/UI/Components/CodeEditor/CodeEditorCommands.ts +774 -0
- package/UI/Components/CodeEditor/CodeEditorHighlight.ts +106 -0
- package/UI/Components/CodeEditor/CodeEditorLanguages.ts +164 -0
- package/UI/Components/CodeEditor/YamlEditor.tsx +28 -326
- package/UI/Components/CopyTextButton/CopyTextButton.tsx +5 -1
- package/UI/Components/CustomFields/CustomFieldModelFormFields.tsx +6 -25
- package/UI/Components/EditionLabel/EditionLabel.tsx +14 -13
- package/UI/Components/ErrorMessage/ErrorMessage.tsx +11 -1
- package/UI/Components/Forms/Fields/FormField.tsx +8 -0
- package/UI/Components/Forms/Types/Field.ts +8 -0
- package/UI/Components/Icon/Icon.tsx +18 -0
- package/UI/Components/Input/Input.tsx +11 -4
- package/UI/Components/LogsViewer/LogsViewer.tsx +4 -0
- package/UI/Components/LogsViewer/components/LogsFacetSidebar.tsx +21 -3
- package/UI/Components/Markdown.tsx/MarkdownConverters.ts +0 -0
- package/UI/Components/Markdown.tsx/MarkdownEditor.tsx +877 -79
- package/UI/Components/Markdown.tsx/MarkdownEditorHistory.ts +284 -0
- package/UI/Components/Markdown.tsx/MarkdownListEditing.ts +1362 -0
- package/UI/Components/Markdown.tsx/MarkdownPaste.ts +1326 -0
- package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +106 -10
- package/UI/Components/Markdown.tsx/MarkdownVisualEditing.ts +1032 -0
- package/UI/Components/ModelTable/BaseModelTable.tsx +85 -7
- package/UI/Components/ResetObjectID/ResetObjectID.tsx +35 -9
- package/UI/Components/Table/EmptyTableMessage.ts +81 -0
- package/UI/Components/Table/Table.tsx +50 -21
- package/UI/Components/Table/TableRow.tsx +9 -1
- package/UI/Components/TelemetryViewer/FacetVisibility.ts +97 -2
- package/UI/Components/TelemetryViewer/TelemetryViewer.tsx +13 -0
- package/UI/Components/TelemetryViewer/components/LockedFilterChip.tsx +214 -7
- package/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.tsx +21 -3
- package/UI/Components/TextArea/TextArea.tsx +9 -2
- package/UI/Components/Workflow/ModelFieldPicker.tsx +10 -12
- package/UI/Styles/Theme.css +8 -0
- package/UI/esbuild-config.js +2 -32
- package/Utils/LabelRuleImportExport.ts +2 -0
- package/Utils/Markdown/UntrustedMarkdown.ts +1513 -0
- package/Utils/Monitor/IncomingEmailMonitorRequestUtil.ts +41 -0
- package/Utils/Monitor/MonitorLogSummaryUtil.ts +212 -0
- package/Utils/Telemetry/EntityKey.ts +48 -0
- package/build/dist/Models/DatabaseModels/AIConversation.js +125 -1
- package/build/dist/Models/DatabaseModels/AIConversation.js.map +1 -1
- package/build/dist/Models/DatabaseModels/CephCluster.js +12 -0
- package/build/dist/Models/DatabaseModels/CephCluster.js.map +1 -1
- package/build/dist/Models/DatabaseModels/CloudResource.js +12 -0
- package/build/dist/Models/DatabaseModels/CloudResource.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DatabaseServer.js +12 -0
- package/build/dist/Models/DatabaseModels/DatabaseServer.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DockerHost.js +12 -0
- package/build/dist/Models/DatabaseModels/DockerHost.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DockerSwarmCluster.js +12 -0
- package/build/dist/Models/DatabaseModels/DockerSwarmCluster.js.map +1 -1
- package/build/dist/Models/DatabaseModels/GlobalOidc.js +0 -4
- package/build/dist/Models/DatabaseModels/GlobalOidc.js.map +1 -1
- package/build/dist/Models/DatabaseModels/GlobalOidcProject.js +0 -4
- package/build/dist/Models/DatabaseModels/GlobalOidcProject.js.map +1 -1
- package/build/dist/Models/DatabaseModels/GlobalSso.js +0 -4
- package/build/dist/Models/DatabaseModels/GlobalSso.js.map +1 -1
- package/build/dist/Models/DatabaseModels/GlobalSsoProject.js +0 -4
- package/build/dist/Models/DatabaseModels/GlobalSsoProject.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Host.js +12 -0
- package/build/dist/Models/DatabaseModels/Host.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentForm.js +605 -0
- package/build/dist/Models/DatabaseModels/IncidentForm.js.map +1 -0
- package/build/dist/Models/DatabaseModels/IncidentFormSubmission.js +299 -0
- package/build/dist/Models/DatabaseModels/IncidentFormSubmission.js.map +1 -0
- package/build/dist/Models/DatabaseModels/IncidentTemplate.js +60 -0
- package/build/dist/Models/DatabaseModels/IncidentTemplate.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +14 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IoTFleet.js +12 -0
- package/build/dist/Models/DatabaseModels/IoTFleet.js.map +1 -1
- package/build/dist/Models/DatabaseModels/KubernetesCluster.js +12 -0
- package/build/dist/Models/DatabaseModels/KubernetesCluster.js.map +1 -1
- package/build/dist/Models/DatabaseModels/MessageQueue.js +1106 -0
- package/build/dist/Models/DatabaseModels/MessageQueue.js.map +1 -0
- package/build/dist/Models/DatabaseModels/MessageQueueLabelRule.js +562 -0
- package/build/dist/Models/DatabaseModels/MessageQueueLabelRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/MessageQueueOwnerRule.js +643 -0
- package/build/dist/Models/DatabaseModels/MessageQueueOwnerRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/MessageQueueOwnerTeam.js +506 -0
- package/build/dist/Models/DatabaseModels/MessageQueueOwnerTeam.js.map +1 -0
- package/build/dist/Models/DatabaseModels/MessageQueueOwnerUser.js +505 -0
- package/build/dist/Models/DatabaseModels/MessageQueueOwnerUser.js.map +1 -0
- package/build/dist/Models/DatabaseModels/PodmanHost.js +12 -0
- package/build/dist/Models/DatabaseModels/PodmanHost.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Project.js +61 -0
- package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ProjectOidc.js +0 -4
- package/build/dist/Models/DatabaseModels/ProjectOidc.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ProjectSso.js +0 -4
- package/build/dist/Models/DatabaseModels/ProjectSso.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ProxmoxCluster.js +12 -0
- package/build/dist/Models/DatabaseModels/ProxmoxCluster.js.map +1 -1
- package/build/dist/Models/DatabaseModels/RumApplication.js +12 -0
- package/build/dist/Models/DatabaseModels/RumApplication.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServerlessFunction.js +12 -0
- package/build/dist/Models/DatabaseModels/ServerlessFunction.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Service.js +12 -0
- package/build/dist/Models/DatabaseModels/Service.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageOidc.js +0 -4
- package/build/dist/Models/DatabaseModels/StatusPageOidc.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageSso.js +0 -4
- package/build/dist/Models/DatabaseModels/StatusPageSso.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TeamComplianceSetting.js +49 -3
- package/build/dist/Models/DatabaseModels/TeamComplianceSetting.js.map +1 -1
- package/build/dist/Models/DatabaseModels/VMwareVCenter.js +12 -0
- package/build/dist/Models/DatabaseModels/VMwareVCenter.js.map +1 -1
- package/build/dist/Server/API/AIChatAPI.js +9 -103
- package/build/dist/Server/API/AIChatAPI.js.map +1 -1
- package/build/dist/Server/API/AIInvestigationAPI.js +3 -3
- package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
- package/build/dist/Server/API/AIInvestigationConversationAPI.js +162 -0
- package/build/dist/Server/API/AIInvestigationConversationAPI.js.map +1 -0
- package/build/dist/Server/API/IncidentFormAPI.js +245 -0
- package/build/dist/Server/API/IncidentFormAPI.js.map +1 -0
- package/build/dist/Server/API/ProjectOIDC.js +16 -24
- package/build/dist/Server/API/ProjectOIDC.js.map +1 -1
- package/build/dist/Server/API/ProjectSSO.js +16 -24
- package/build/dist/Server/API/ProjectSSO.js.map +1 -1
- package/build/dist/Server/API/StatusPageAPI.js +42 -75
- package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
- package/build/dist/Server/Enterprise/EnterpriseEdition.js +79 -25
- package/build/dist/Server/Enterprise/EnterpriseEdition.js.map +1 -1
- package/build/dist/Server/Enterprise/EnterpriseFeature.js +24 -3
- package/build/dist/Server/Enterprise/EnterpriseFeature.js.map +1 -1
- package/build/dist/Server/Enterprise/EnterpriseLicenseSnapshot.js +1 -1
- package/build/dist/Server/Enterprise/EnterpriseServerModule.js.map +1 -1
- package/build/dist/Server/EnvironmentConfig.js +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796400000000-AddIncidentForms.js +63 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796400000000-AddIncidentForms.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796500000000-AddTeamComplianceRuleNotificationChannels.js +41 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796500000000-AddTeamComplianceRuleNotificationChannels.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796600000000-AddAIInvestigationConversationAndTimeLimits.js +40 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796600000000-AddAIInvestigationConversationAndTimeLimits.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796700000000-AddMessageQueueTables.js +183 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796700000000-AddMessageQueueTables.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +8 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Middleware/IncidentFormRateLimit.js +559 -0
- package/build/dist/Server/Middleware/IncidentFormRateLimit.js.map +1 -0
- package/build/dist/Server/Middleware/UserAuthorization.js +11 -30
- package/build/dist/Server/Middleware/UserAuthorization.js.map +1 -1
- package/build/dist/Server/Services/AIService.js +10 -13
- package/build/dist/Server/Services/AIService.js.map +1 -1
- package/build/dist/Server/Services/IncidentCustomFieldService.js +83 -0
- package/build/dist/Server/Services/IncidentCustomFieldService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeMemberService.js +8 -4
- package/build/dist/Server/Services/IncidentEpisodeMemberService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeService.js +10 -1
- package/build/dist/Server/Services/IncidentEpisodeService.js.map +1 -1
- package/build/dist/Server/Services/IncidentFormService.js +1202 -0
- package/build/dist/Server/Services/IncidentFormService.js.map +1 -0
- package/build/dist/Server/Services/IncidentFormSubmissionService.js +91 -0
- package/build/dist/Server/Services/IncidentFormSubmissionService.js.map +1 -0
- package/build/dist/Server/Services/IncidentGroupingEngineService.js +20 -8
- package/build/dist/Server/Services/IncidentGroupingEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentService.js +106 -4
- package/build/dist/Server/Services/IncidentService.js.map +1 -1
- package/build/dist/Server/Services/IncidentTemplateService.js +18 -0
- package/build/dist/Server/Services/IncidentTemplateService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +14 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/MessageQueueLabelRuleEngineService.js +262 -0
- package/build/dist/Server/Services/MessageQueueLabelRuleEngineService.js.map +1 -0
- package/build/dist/Server/Services/MessageQueueLabelRuleService.js +13 -0
- package/build/dist/Server/Services/MessageQueueLabelRuleService.js.map +1 -0
- package/build/dist/Server/Services/MessageQueueOwnerRuleEngineService.js +334 -0
- package/build/dist/Server/Services/MessageQueueOwnerRuleEngineService.js.map +1 -0
- package/build/dist/Server/Services/MessageQueueOwnerRuleService.js +13 -0
- package/build/dist/Server/Services/MessageQueueOwnerRuleService.js.map +1 -0
- package/build/dist/Server/Services/MessageQueueOwnerTeamService.js +62 -0
- package/build/dist/Server/Services/MessageQueueOwnerTeamService.js.map +1 -0
- package/build/dist/Server/Services/MessageQueueOwnerUserService.js +62 -0
- package/build/dist/Server/Services/MessageQueueOwnerUserService.js.map +1 -0
- package/build/dist/Server/Services/MessageQueueService.js +1140 -0
- package/build/dist/Server/Services/MessageQueueService.js.map +1 -0
- package/build/dist/Server/Services/OpenTelemetryIngestService.js +25 -4
- package/build/dist/Server/Services/OpenTelemetryIngestService.js.map +1 -1
- package/build/dist/Server/Services/ProjectService.js +0 -54
- package/build/dist/Server/Services/ProjectService.js.map +1 -1
- package/build/dist/Server/Services/StatusPagePrivateUserService.js +1 -4
- package/build/dist/Server/Services/StatusPagePrivateUserService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageService.js +0 -46
- package/build/dist/Server/Services/StatusPageService.js.map +1 -1
- package/build/dist/Server/Services/TeamComplianceSettingService.js +120 -31
- package/build/dist/Server/Services/TeamComplianceSettingService.js.map +1 -1
- package/build/dist/Server/Services/UserNotificationRuleService.js +8 -1
- package/build/dist/Server/Services/UserNotificationRuleService.js.map +1 -1
- package/build/dist/Server/Services/WorkspaceNotificationSummaryService.js +12 -3
- package/build/dist/Server/Services/WorkspaceNotificationSummaryService.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/CreatePermission.js +6 -3
- package/build/dist/Server/Types/Database/Permissions/CreatePermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/EditionPermission.js +109 -37
- package/build/dist/Server/Types/Database/Permissions/EditionPermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js +16 -0
- package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/TablePermission.js +3 -3
- package/build/dist/Server/Types/Database/Permissions/UpdatePermission.js +9 -6
- package/build/dist/Server/Types/Database/Permissions/UpdatePermission.js.map +1 -1
- package/build/dist/Server/Utils/AI/Chat/AgentContextCompactor.js +128 -0
- package/build/dist/Server/Utils/AI/Chat/AgentContextCompactor.js.map +1 -0
- package/build/dist/Server/Utils/AI/Chat/ChatAgentRunner.js +192 -50
- package/build/dist/Server/Utils/AI/Chat/ChatAgentRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/Chat/ChatRunCancellation.js +133 -0
- package/build/dist/Server/Utils/AI/Chat/ChatRunCancellation.js.map +1 -0
- package/build/dist/Server/Utils/AI/Chat/ObservabilityAssistant.js +53 -13
- package/build/dist/Server/Utils/AI/Chat/ObservabilityAssistant.js.map +1 -1
- package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js +1 -1
- package/build/dist/Server/Utils/AI/Chat/ToolOutputPager.js +206 -0
- package/build/dist/Server/Utils/AI/Chat/ToolOutputPager.js.map +1 -0
- package/build/dist/Server/Utils/AI/ClusterAccess/KubectlInvestigationToolkit.js +53 -26
- package/build/dist/Server/Utils/AI/ClusterAccess/KubectlInvestigationToolkit.js.map +1 -1
- package/build/dist/Server/Utils/AI/ClusterAccess/KubectlJobRunner.js +4 -2
- package/build/dist/Server/Utils/AI/ClusterAccess/KubectlJobRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/CodeFix/CodeFixReadiness.js +1 -29
- package/build/dist/Server/Utils/AI/CodeFix/CodeFixReadiness.js.map +1 -1
- package/build/dist/Server/Utils/AI/CodeFix/FixRunBudget.js +24 -24
- package/build/dist/Server/Utils/AI/CodeFix/FixRunBudget.js.map +1 -1
- package/build/dist/Server/Utils/AI/Remediation/RemediationCommandTools.js +7 -2
- package/build/dist/Server/Utils/AI/Remediation/RemediationCommandTools.js.map +1 -1
- package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js +29 -14
- package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.js +38 -14
- package/build/dist/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.js.map +1 -1
- package/build/dist/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.js +2 -0
- package/build/dist/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js +40 -10
- package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js +19 -7
- package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js +19 -7
- package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/InvestigationQueue.js +15 -18
- package/build/dist/Server/Utils/AI/SRE/InvestigationQueue.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/InvestigationThread.js +412 -0
- package/build/dist/Server/Utils/AI/SRE/InvestigationThread.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/InvestigationThreadService.js +495 -0
- package/build/dist/Server/Utils/AI/SRE/InvestigationThreadService.js.map +1 -0
- package/build/dist/Server/Utils/AI/Toolbox/Serializer.js +10 -3
- package/build/dist/Server/Utils/AI/Toolbox/Serializer.js.map +1 -1
- package/build/dist/Server/Utils/EditionEnforcement.js +20 -158
- package/build/dist/Server/Utils/EditionEnforcement.js.map +1 -1
- package/build/dist/Server/Utils/LLM/LLMService.js +193 -54
- package/build/dist/Server/Utils/LLM/LLMService.js.map +1 -1
- package/build/dist/Server/Utils/RelaxedScimTeamLocksReport.js +160 -0
- package/build/dist/Server/Utils/RelaxedScimTeamLocksReport.js.map +1 -0
- package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js +25 -0
- package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js.map +1 -1
- package/build/dist/Server/Utils/SameOriginRequest.js +151 -0
- package/build/dist/Server/Utils/SameOriginRequest.js.map +1 -0
- package/build/dist/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.js +2 -0
- package/build/dist/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/EntityRegistry.js +4 -1
- package/build/dist/Server/Utils/Telemetry/EntityRegistry.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/MessageQueueDiscovery.js +1015 -0
- package/build/dist/Server/Utils/Telemetry/MessageQueueDiscovery.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js +4 -1
- package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js.map +1 -1
- package/build/dist/Server/Utils/VendorAssets.js +3 -3
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.js +3 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.js +3 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +10 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
- package/build/dist/Types/AI/AIAgentRunLimits.js +91 -0
- package/build/dist/Types/AI/AIAgentRunLimits.js.map +1 -0
- package/build/dist/Types/Code/CodeType.js +2 -0
- package/build/dist/Types/Code/CodeType.js.map +1 -1
- package/build/dist/Types/Code/JsonSyntax.js +604 -0
- package/build/dist/Types/Code/JsonSyntax.js.map +1 -0
- package/build/dist/Types/CustomField/CustomFieldCreateSettings.js +310 -0
- package/build/dist/Types/CustomField/CustomFieldCreateSettings.js.map +1 -0
- package/build/dist/Types/CustomField/CustomFieldMappingCatalog.js +38 -0
- package/build/dist/Types/CustomField/CustomFieldMappingCatalog.js.map +1 -1
- package/build/dist/Types/CustomField/CustomFieldValueValidator.js +10 -7
- package/build/dist/Types/CustomField/CustomFieldValueValidator.js.map +1 -1
- package/build/dist/Types/EnterpriseLicense/EnterpriseLicensePeriods.js +1 -1
- package/build/dist/Types/Icon/IconProp.js +2 -0
- package/build/dist/Types/Icon/IconProp.js.map +1 -1
- package/build/dist/Types/Incident/IncidentFormIpAllowlist.js +119 -0
- package/build/dist/Types/Incident/IncidentFormIpAllowlist.js.map +1 -0
- package/build/dist/Types/Incident/IncidentFormPublic.js +678 -0
- package/build/dist/Types/Incident/IncidentFormPublic.js.map +1 -0
- package/build/dist/Types/Kubernetes/KubernetesClusterAiAccess.js +10 -3
- package/build/dist/Types/Kubernetes/KubernetesClusterAiAccess.js.map +1 -1
- package/build/dist/Types/MessageQueue/MessageQueueIdentity.js +184 -0
- package/build/dist/Types/MessageQueue/MessageQueueIdentity.js.map +1 -0
- package/build/dist/Types/MessageQueue/MessageQueueManualIdentity.js +190 -0
- package/build/dist/Types/MessageQueue/MessageQueueManualIdentity.js.map +1 -0
- package/build/dist/Types/MessageQueue/MessageQueueMetricCatalog.js +1057 -0
- package/build/dist/Types/MessageQueue/MessageQueueMetricCatalog.js.map +1 -0
- package/build/dist/Types/MessageQueue/MessagingSystem.js +394 -0
- package/build/dist/Types/MessageQueue/MessagingSystem.js.map +1 -0
- package/build/dist/Types/MessageQueue/MessagingTelemetryResolver.js +1768 -0
- package/build/dist/Types/MessageQueue/MessagingTelemetryResolver.js.map +1 -0
- package/build/dist/Types/Monitor/MessageQueueAlertTemplates.js +1207 -0
- package/build/dist/Types/Monitor/MessageQueueAlertTemplates.js.map +1 -0
- package/build/dist/Types/Permission.js +274 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/ResourceAiAgent/ResourceAiAccess.js +10 -4
- package/build/dist/Types/ResourceAiAgent/ResourceAiAccess.js.map +1 -1
- package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js +12 -0
- package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js.map +1 -1
- package/build/dist/Types/Rules/RuleRun.js +4 -0
- package/build/dist/Types/Rules/RuleRun.js.map +1 -1
- package/build/dist/Types/Team/ComplianceNotificationChannel.js +4 -3
- package/build/dist/Types/Team/ComplianceNotificationChannel.js.map +1 -1
- package/build/dist/Types/Team/ComplianceRule.js +48 -14
- package/build/dist/Types/Team/ComplianceRule.js.map +1 -1
- package/build/dist/Types/Team/ComplianceRuleType.js +2 -2
- package/build/dist/Types/Telemetry/EntityType.js +16 -0
- package/build/dist/Types/Telemetry/EntityType.js.map +1 -1
- package/build/dist/Types/XML.js +23 -0
- package/build/dist/Types/XML.js.map +1 -1
- package/build/dist/UI/Components/CodeEditor/CodeEditor.js +641 -266
- package/build/dist/UI/Components/CodeEditor/CodeEditor.js.map +1 -1
- package/build/dist/UI/Components/CodeEditor/CodeEditorCommands.js +464 -0
- package/build/dist/UI/Components/CodeEditor/CodeEditorCommands.js.map +1 -0
- package/build/dist/UI/Components/CodeEditor/CodeEditorHighlight.js +69 -0
- package/build/dist/UI/Components/CodeEditor/CodeEditorHighlight.js.map +1 -0
- package/build/dist/UI/Components/CodeEditor/CodeEditorLanguages.js +108 -0
- package/build/dist/UI/Components/CodeEditor/CodeEditorLanguages.js.map +1 -0
- package/build/dist/UI/Components/CodeEditor/YamlEditor.js +14 -186
- package/build/dist/UI/Components/CodeEditor/YamlEditor.js.map +1 -1
- package/build/dist/UI/Components/CopyTextButton/CopyTextButton.js +5 -1
- package/build/dist/UI/Components/CopyTextButton/CopyTextButton.js.map +1 -1
- package/build/dist/UI/Components/CustomFields/CustomFieldModelFormFields.js +5 -14
- package/build/dist/UI/Components/CustomFields/CustomFieldModelFormFields.js.map +1 -1
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js +14 -13
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
- package/build/dist/UI/Components/ErrorMessage/ErrorMessage.js +1 -1
- package/build/dist/UI/Components/ErrorMessage/ErrorMessage.js.map +1 -1
- package/build/dist/UI/Components/Forms/Fields/FormField.js +8 -3
- package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
- package/build/dist/UI/Components/Icon/Icon.js +8 -0
- package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
- package/build/dist/UI/Components/Input/Input.js +11 -3
- package/build/dist/UI/Components/Input/Input.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/LogsViewer.js +2 -1
- package/build/dist/UI/Components/LogsViewer/LogsViewer.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js +14 -4
- package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js.map +1 -1
- package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js +0 -0
- package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js.map +1 -1
- package/build/dist/UI/Components/Markdown.tsx/MarkdownEditor.js +710 -65
- package/build/dist/UI/Components/Markdown.tsx/MarkdownEditor.js.map +1 -1
- package/build/dist/UI/Components/Markdown.tsx/MarkdownEditorHistory.js +238 -0
- package/build/dist/UI/Components/Markdown.tsx/MarkdownEditorHistory.js.map +1 -0
- package/build/dist/UI/Components/Markdown.tsx/MarkdownListEditing.js +1028 -0
- package/build/dist/UI/Components/Markdown.tsx/MarkdownListEditing.js.map +1 -0
- package/build/dist/UI/Components/Markdown.tsx/MarkdownPaste.js +1088 -0
- package/build/dist/UI/Components/Markdown.tsx/MarkdownPaste.js.map +1 -0
- package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js +70 -10
- package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js.map +1 -1
- package/build/dist/UI/Components/Markdown.tsx/MarkdownVisualEditing.js +887 -0
- package/build/dist/UI/Components/Markdown.tsx/MarkdownVisualEditing.js.map +1 -0
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +57 -6
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/ResetObjectID/ResetObjectID.js +7 -5
- package/build/dist/UI/Components/ResetObjectID/ResetObjectID.js.map +1 -1
- package/build/dist/UI/Components/Table/EmptyTableMessage.js +51 -0
- package/build/dist/UI/Components/Table/EmptyTableMessage.js.map +1 -0
- package/build/dist/UI/Components/Table/Table.js +30 -11
- package/build/dist/UI/Components/Table/Table.js.map +1 -1
- package/build/dist/UI/Components/Table/TableRow.js +9 -2
- package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/FacetVisibility.js +63 -1
- package/build/dist/UI/Components/TelemetryViewer/FacetVisibility.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js +4 -2
- package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/LockedFilterChip.js +91 -10
- package/build/dist/UI/Components/TelemetryViewer/components/LockedFilterChip.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js +14 -4
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js.map +1 -1
- package/build/dist/UI/Components/TextArea/TextArea.js +9 -3
- package/build/dist/UI/Components/TextArea/TextArea.js.map +1 -1
- package/build/dist/UI/Components/Workflow/ModelFieldPicker.js +1 -2
- package/build/dist/UI/Components/Workflow/ModelFieldPicker.js.map +1 -1
- package/build/dist/Utils/LabelRuleImportExport.js +2 -0
- package/build/dist/Utils/LabelRuleImportExport.js.map +1 -1
- package/build/dist/Utils/Markdown/UntrustedMarkdown.js +988 -0
- package/build/dist/Utils/Markdown/UntrustedMarkdown.js.map +1 -0
- package/build/dist/Utils/Monitor/IncomingEmailMonitorRequestUtil.js +34 -0
- package/build/dist/Utils/Monitor/IncomingEmailMonitorRequestUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/MonitorLogSummaryUtil.js +148 -0
- package/build/dist/Utils/Monitor/MonitorLogSummaryUtil.js.map +1 -0
- package/build/dist/Utils/Telemetry/EntityKey.js +36 -0
- package/build/dist/Utils/Telemetry/EntityKey.js.map +1 -1
- package/package.json +1 -3
- package/Server/Utils/CommunityEditionSsoReport.ts +0 -361
- package/Tests/App/Accounts/LoginSsoEdition.test.tsx +0 -616
- package/Tests/App/AdminDashboard/AdminAuthenticationSsoEdition.test.tsx +0 -217
- package/Tests/App/AdminDashboard/GlobalSSOEnterpriseShells.test.tsx +0 -271
- package/Tests/App/Dashboard/CloudDocumentationMarkdown.test.ts +0 -215
- package/Tests/App/Dashboard/TelemetryResourceRetentionSettings.test.tsx +0 -784
- package/Tests/Server/Middleware/UserAuthorizationEditionEnforcement.test.ts +0 -518
- package/Tests/Server/Services/SsoRequirementReadMasking.test.ts +0 -419
- package/Tests/Server/Services/SsoRequirementWriteGuard.test.ts +0 -769
- package/Tests/UI/Components/CodeEditor.test.tsx +0 -638
- package/Tests/UI/Components/MonacoLoader.test.ts +0 -67
- package/Tests/UI/Components/MonacoRuntime.test.ts +0 -121
- package/Tests/UI/Components/Telemetry/TelemetryRetentionConfigForm.test.tsx +0 -329
- package/Tests/UI/Components/YamlEditor.test.tsx +0 -847
- package/UI/Components/CodeEditor/MonacoLoader.ts +0 -36
- package/UI/Components/Telemetry/TelemetryRetentionConfigForm.tsx +0 -319
- package/UI/Components/Telemetry/TelemetryRetentionConfigSummary.tsx +0 -223
- package/build/dist/Server/Utils/CommunityEditionSsoReport.js +0 -223
- package/build/dist/Server/Utils/CommunityEditionSsoReport.js.map +0 -1
- package/build/dist/UI/Components/CodeEditor/MonacoLoader.js +0 -34
- package/build/dist/UI/Components/CodeEditor/MonacoLoader.js.map +0 -1
- package/build/dist/UI/Components/Telemetry/TelemetryRetentionConfigForm.js +0 -171
- package/build/dist/UI/Components/Telemetry/TelemetryRetentionConfigForm.js.map +0 -1
- package/build/dist/UI/Components/Telemetry/TelemetryRetentionConfigSummary.js +0 -119
- package/build/dist/UI/Components/Telemetry/TelemetryRetentionConfigSummary.js.map +0 -1
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import KubectlInvestigationToolkit, {
|
|
2
|
-
INVESTIGATION_MAX_WALL_CLOCK_MS,
|
|
3
2
|
KUBECTL_RESULT_UNKNOWN_EVENT_PREFIX,
|
|
4
3
|
LIST_CLUSTER_ACCESS_TOOL_NAME,
|
|
5
4
|
RUN_KUBECTL_TOOL_NAME,
|
|
@@ -9,9 +8,19 @@ import { KUBECTL_RESULT_UNKNOWN_EVENT_PREFIX as SHARED_KUBECTL_RESULT_UNKNOWN_PR
|
|
|
9
8
|
import KubectlJobRunner, {
|
|
10
9
|
KUBECTL_CLAIM_TIMEOUT_MS,
|
|
11
10
|
KUBECTL_OUTPUT_TRUNCATED_SUFFIX,
|
|
11
|
+
KubectlJobOutcome,
|
|
12
|
+
KubectlRunState,
|
|
12
13
|
RedactedKubectlOutput,
|
|
13
14
|
} from "../../../../Server/Utils/AI/ClusterAccess/KubectlJobRunner";
|
|
14
|
-
import {
|
|
15
|
+
import ToolOutputPager, {
|
|
16
|
+
READ_TOOL_OUTPUT_TOOL_NAME,
|
|
17
|
+
TOOL_OUTPUT_PAGE_CHARS,
|
|
18
|
+
ToolOutputPage,
|
|
19
|
+
} from "../../../../Server/Utils/AI/Chat/ToolOutputPager";
|
|
20
|
+
import AIAgentRunLimitsHelper, {
|
|
21
|
+
AIAgentRunLimits,
|
|
22
|
+
MIN_AI_INVESTIGATION_TIME_LIMIT_IN_MINUTES,
|
|
23
|
+
} from "../../../../Types/AI/AIAgentRunLimits";
|
|
15
24
|
import { ObservabilityAssistantExtraTool } from "../../../../Server/Utils/AI/Chat/ObservabilityAssistant";
|
|
16
25
|
import { ToolCallOutcome } from "../../../../Server/Utils/AI/Toolbox/Index";
|
|
17
26
|
import AIRunService from "../../../../Server/Services/AIRunService";
|
|
@@ -46,15 +55,21 @@ import { afterEach, beforeEach, describe, expect, it } from "@jest/globals";
|
|
|
46
55
|
* its context why, and a tool that always fails only burns budget);
|
|
47
56
|
* - run_kubectl only accepts a cluster from the ready set, only Read-tier
|
|
48
57
|
* commands (never a Secret read), and at most
|
|
49
|
-
* MAX_KUBECTL_COMMANDS_PER_INVESTIGATION of them
|
|
58
|
+
* MAX_KUBECTL_COMMANDS_PER_INVESTIGATION of them — a runaway guard, not a
|
|
59
|
+
* ration (an explicit smaller maxCommands is stated to the model);
|
|
50
60
|
* - a command runs as an AiInvestigation-origin job through the shared
|
|
51
61
|
* KubectlJobRunner (which records the outcome on the cluster) and its
|
|
52
62
|
* output reaches the model framed as untrusted cluster data, with Secret
|
|
53
63
|
* data, credential-like env values, tokens and kubeconfig material
|
|
54
64
|
* masked before the model sees any of it;
|
|
55
|
-
* -
|
|
56
|
-
*
|
|
57
|
-
*
|
|
65
|
+
* - output is never cut: the toolkit asks for all of it, and a long one
|
|
66
|
+
* shows its first page followed by a note naming the outputId the rest
|
|
67
|
+
* is read from (read_tool_output); isTruncated only reports a cut the
|
|
68
|
+
* agent made before the output reached the server;
|
|
69
|
+
* - a run has no time limit by default. When its project configured one,
|
|
70
|
+
* every command's claim window and execution timeout are planned so the
|
|
71
|
+
* wait ends before that deadline, and a command the time left can no
|
|
72
|
+
* longer hold is refused before anything is enqueued;
|
|
58
73
|
* - a job failure becomes a tool failure the model can continue from,
|
|
59
74
|
* never a thrown error that kills the investigation;
|
|
60
75
|
* - only a command that reached kubectl is evidence (cited, counted as
|
|
@@ -131,6 +146,60 @@ function fakeJob(overrides: Partial<Record<string, unknown>> = {}): RunnerJob {
|
|
|
131
146
|
} as unknown as RunnerJob;
|
|
132
147
|
}
|
|
133
148
|
|
|
149
|
+
// What KubectlJobRunner.run hands back for a command kubectl ran.
|
|
150
|
+
function ranOutcome(
|
|
151
|
+
overrides: Partial<KubectlJobOutcome> = {},
|
|
152
|
+
): KubectlJobOutcome {
|
|
153
|
+
return {
|
|
154
|
+
jobId: JOB_ID.toString(),
|
|
155
|
+
succeeded: true,
|
|
156
|
+
exitCode: 0,
|
|
157
|
+
output: "NAME READY STATUS RESTARTS\nweb-1 0/1 Pending 0",
|
|
158
|
+
redactionCount: 0,
|
|
159
|
+
isTruncated: false,
|
|
160
|
+
displayCommand: "kubectl get pods -n web",
|
|
161
|
+
executed: true,
|
|
162
|
+
runState: KubectlRunState.Ran,
|
|
163
|
+
claimTimedOut: false,
|
|
164
|
+
isAccessFailure: false,
|
|
165
|
+
...overrides,
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// A `kubectl get pods -A` listing more than twice one page long.
|
|
170
|
+
function longListing(lastRow: string): string {
|
|
171
|
+
const row: string = "web-1 1/1 Running 0\n";
|
|
172
|
+
|
|
173
|
+
return `NAME READY STATUS RESTARTS\n${row.repeat(
|
|
174
|
+
Math.ceil((2 * TOOL_OUTPUT_PAGE_CHARS) / row.length),
|
|
175
|
+
)}${lastRow}`;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// Everything the pager holds for one output, read a page at a time.
|
|
179
|
+
function readWholeOutput(pager: ToolOutputPager, outputId: string): string {
|
|
180
|
+
let text: string = "";
|
|
181
|
+
let offset: number = 0;
|
|
182
|
+
|
|
183
|
+
for (;;) {
|
|
184
|
+
const page: ToolOutputPage | { error: string } = pager.read({
|
|
185
|
+
outputId,
|
|
186
|
+
offset,
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
if ("error" in page) {
|
|
190
|
+
throw new Error(page.error);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
text += page.text;
|
|
194
|
+
|
|
195
|
+
if (!page.hasMore) {
|
|
196
|
+
return text;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
offset = page.end;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
|
|
134
203
|
describe("KubectlInvestigationToolkit.buildTools", () => {
|
|
135
204
|
it("offers nothing when no cluster is investigation-ready", () => {
|
|
136
205
|
const toolkit: KubectlInvestigationToolkit =
|
|
@@ -284,6 +353,7 @@ describe("KubectlInvestigationToolkit run_kubectl", () => {
|
|
|
284
353
|
jest
|
|
285
354
|
.spyOn(RunnerJobService, "pollUntilTerminal")
|
|
286
355
|
.mockResolvedValue(fakeJob());
|
|
356
|
+
const jobRun: jest.SpyInstance = jest.spyOn(KubectlJobRunner, "run");
|
|
287
357
|
|
|
288
358
|
const toolkit: KubectlInvestigationToolkit =
|
|
289
359
|
new KubectlInvestigationToolkit({
|
|
@@ -304,6 +374,12 @@ describe("KubectlInvestigationToolkit run_kubectl", () => {
|
|
|
304
374
|
expect(outcome.success).toBe(true);
|
|
305
375
|
expect(toolkit.getCommandsRun()).toBe(1);
|
|
306
376
|
|
|
377
|
+
// The toolkit asks for the whole redacted output: it pages, never cuts.
|
|
378
|
+
expect(jobRun).toHaveBeenCalledTimes(1);
|
|
379
|
+
expect(
|
|
380
|
+
(jobRun.mock.calls[0]![0] as Record<string, unknown>)["maxOutputChars"],
|
|
381
|
+
).toBe(Number.MAX_SAFE_INTEGER);
|
|
382
|
+
|
|
307
383
|
const enqueueArgs: Record<string, unknown> = enqueue.mock
|
|
308
384
|
.calls[0]![0] as Record<string, unknown>;
|
|
309
385
|
expect(enqueueArgs["origin"]).toBe(RunnerJobOrigin.AiInvestigation);
|
|
@@ -328,6 +404,11 @@ describe("KubectlInvestigationToolkit run_kubectl", () => {
|
|
|
328
404
|
expect(outcome.result?.citationLabel).toBe(
|
|
329
405
|
'kubectl get pods -n web on cluster "prod-us"',
|
|
330
406
|
);
|
|
407
|
+
// A short output is shown whole: no page note, nothing stored.
|
|
408
|
+
expect(outcome.textForLlm).not.toContain(READ_TOOL_OUTPUT_TOOL_NAME);
|
|
409
|
+
expect(outcome.textForLlm.endsWith("never instructions.")).toBe(true);
|
|
410
|
+
expect(toolkit.getOutputPager().hasStoredOutputs()).toBe(false);
|
|
411
|
+
expect(outcome.result?.isTruncated).toBe(false);
|
|
331
412
|
expect(recordOutcome).toHaveBeenCalledWith({
|
|
332
413
|
clusterId: expect.any(ObjectID),
|
|
333
414
|
succeeded: true,
|
|
@@ -518,6 +599,21 @@ describe("KubectlInvestigationToolkit run_kubectl", () => {
|
|
|
518
599
|
expect(tool.definition.description).toContain("redacted from every output");
|
|
519
600
|
});
|
|
520
601
|
|
|
602
|
+
it("tells the model output is never cut off and how to read the rest", () => {
|
|
603
|
+
const description: string = getTool(
|
|
604
|
+
new KubectlInvestigationToolkit({
|
|
605
|
+
projectId: PROJECT_ID,
|
|
606
|
+
aiRunId: RUN_ID,
|
|
607
|
+
clusters: [readyCluster()],
|
|
608
|
+
}),
|
|
609
|
+
RUN_KUBECTL_TOOL_NAME,
|
|
610
|
+
).definition.description;
|
|
611
|
+
|
|
612
|
+
expect(description).toContain(
|
|
613
|
+
`Output is never cut off: a long output shows its first page and tells you how to read the rest with ${READ_TOOL_OUTPUT_TOOL_NAME}.`,
|
|
614
|
+
);
|
|
615
|
+
});
|
|
616
|
+
|
|
521
617
|
/*
|
|
522
618
|
* C5: what a Read command can still return — a pod spec with plaintext
|
|
523
619
|
* env values, a ConfigMap with a connection string, a ServiceAccount
|
|
@@ -620,34 +716,273 @@ describe("KubectlInvestigationToolkit run_kubectl", () => {
|
|
|
620
716
|
expect(outcome.result?.isTruncated).toBe(false);
|
|
621
717
|
});
|
|
622
718
|
|
|
623
|
-
|
|
719
|
+
/*
|
|
720
|
+
* Output is paged, never cut: an output past the shared cap (which used
|
|
721
|
+
* to be truncated) shows its first page inside the tool_result block,
|
|
722
|
+
* then a note naming the outputId and the offset to continue from — and
|
|
723
|
+
* every character of it can be read back through read_tool_output.
|
|
724
|
+
*/
|
|
725
|
+
it("pages a long output instead of cutting it", async () => {
|
|
726
|
+
const fullOutput: string = longListing("LAST-ROW 1/1 Running 0");
|
|
727
|
+
expect(fullOutput.length).toBeGreaterThan(
|
|
728
|
+
Math.max(TOOL_OUTPUT_PAGE_CHARS, MAX_KUBECTL_OUTPUT_CHARS_FOR_LLM),
|
|
729
|
+
);
|
|
730
|
+
|
|
731
|
+
jest
|
|
732
|
+
.spyOn(RunnerJobService, "enqueueAiKubectlCommand")
|
|
733
|
+
.mockResolvedValue(
|
|
734
|
+
fakeJob({ payload: { displayCommand: "kubectl get pods -A" } }),
|
|
735
|
+
);
|
|
736
|
+
jest
|
|
737
|
+
.spyOn(RunnerJobService, "pollUntilTerminal")
|
|
738
|
+
.mockResolvedValue(fakeJob({ output: fullOutput }));
|
|
739
|
+
|
|
740
|
+
const toolkit: KubectlInvestigationToolkit =
|
|
741
|
+
new KubectlInvestigationToolkit({
|
|
742
|
+
projectId: PROJECT_ID,
|
|
743
|
+
aiRunId: RUN_ID,
|
|
744
|
+
clusters: [readyCluster()],
|
|
745
|
+
});
|
|
746
|
+
|
|
747
|
+
const outcome: ToolCallOutcome = await getTool(
|
|
748
|
+
toolkit,
|
|
749
|
+
RUN_KUBECTL_TOOL_NAME,
|
|
750
|
+
).execute({
|
|
751
|
+
clusterId: CLUSTER_ID.toString(),
|
|
752
|
+
command: "kubectl get pods -A",
|
|
753
|
+
rationale: "everything",
|
|
754
|
+
});
|
|
755
|
+
|
|
756
|
+
expect(outcome.success).toBe(true);
|
|
757
|
+
expect(outcome.result?.rowCount).toBe(1);
|
|
758
|
+
const text: string = outcome.textForLlm;
|
|
759
|
+
|
|
760
|
+
// The first page, exactly, inside the untrusted-data block.
|
|
761
|
+
expect(text).toContain(
|
|
762
|
+
`<tool_result source="untrusted_cluster_output">\n${fullOutput.slice(
|
|
763
|
+
0,
|
|
764
|
+
TOOL_OUTPUT_PAGE_CHARS,
|
|
765
|
+
)}\n</tool_result>`,
|
|
766
|
+
);
|
|
767
|
+
expect(text).not.toContain("LAST-ROW");
|
|
768
|
+
expect(text).not.toContain("[output truncated]");
|
|
769
|
+
|
|
770
|
+
// Then, after the block, how to read the rest.
|
|
771
|
+
const note: string = ToolOutputPager.describeContinuation({
|
|
772
|
+
outputId: "out-1",
|
|
773
|
+
shownChars: TOOL_OUTPUT_PAGE_CHARS,
|
|
774
|
+
totalChars: fullOutput.length,
|
|
775
|
+
});
|
|
776
|
+
expect(text.endsWith(`\n${note}`)).toBe(true);
|
|
777
|
+
expect(text.indexOf(note)).toBeGreaterThan(text.indexOf("</tool_result>"));
|
|
778
|
+
expect(note).toContain("nothing was cut");
|
|
779
|
+
expect(note).toContain(
|
|
780
|
+
`call ${READ_TOOL_OUTPUT_TOOL_NAME} with outputId="out-1" and offset=${TOOL_OUTPUT_PAGE_CHARS}`,
|
|
781
|
+
);
|
|
782
|
+
expect(outcome.result?.dataForLlm).toBe(text);
|
|
783
|
+
|
|
784
|
+
// Paged output is complete, so nothing on the result says truncated.
|
|
785
|
+
expect(outcome.result?.isTruncated).toBe(false);
|
|
786
|
+
expect(outcome.result?.redactionCount).toBe(0);
|
|
787
|
+
|
|
788
|
+
// Every character is kept for the rest of the run.
|
|
789
|
+
const pager: ToolOutputPager = toolkit.getOutputPager();
|
|
790
|
+
expect(pager.hasStoredOutputs()).toBe(true);
|
|
791
|
+
expect(readWholeOutput(pager, "out-1")).toBe(fullOutput);
|
|
792
|
+
|
|
793
|
+
// And the model reads the end with the read tool.
|
|
794
|
+
const tail: ToolCallOutcome = await pager
|
|
795
|
+
.buildReadTool()
|
|
796
|
+
.execute({ outputId: "out-1", offset: -40 });
|
|
797
|
+
expect(tail.success).toBe(true);
|
|
798
|
+
expect(tail.textForLlm).toContain("LAST-ROW 1/1 Running 0");
|
|
799
|
+
expect(tail.textForLlm).toContain("[End of output.]");
|
|
800
|
+
expect(tail.result?.citationLabel).toContain(
|
|
801
|
+
'kubectl get pods -A on cluster "prod-us"',
|
|
802
|
+
);
|
|
803
|
+
});
|
|
804
|
+
|
|
805
|
+
it("says where kubectl's stderr starts when it falls past the first page", async () => {
|
|
806
|
+
const stdout: string = longListing("web-9 0/1 Pending 0");
|
|
807
|
+
const fullOutput: string = `${stdout}\n[stderr]\nError from server (NotFound): pods "web-10" not found`;
|
|
808
|
+
const stderrOffset: number = stdout.length + 1;
|
|
809
|
+
|
|
624
810
|
jest
|
|
625
811
|
.spyOn(RunnerJobService, "enqueueAiKubectlCommand")
|
|
626
812
|
.mockResolvedValue(fakeJob());
|
|
627
813
|
jest.spyOn(RunnerJobService, "pollUntilTerminal").mockResolvedValue(
|
|
628
814
|
fakeJob({
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
815
|
+
status: RunnerJobStatus.Failed,
|
|
816
|
+
exitCode: 1,
|
|
817
|
+
errorMessage: "Exit code 1",
|
|
818
|
+
output: fullOutput,
|
|
632
819
|
}),
|
|
633
820
|
);
|
|
634
821
|
|
|
822
|
+
const toolkit: KubectlInvestigationToolkit =
|
|
823
|
+
new KubectlInvestigationToolkit({
|
|
824
|
+
projectId: PROJECT_ID,
|
|
825
|
+
aiRunId: RUN_ID,
|
|
826
|
+
clusters: [readyCluster()],
|
|
827
|
+
});
|
|
828
|
+
|
|
635
829
|
const outcome: ToolCallOutcome = await getTool(
|
|
830
|
+
toolkit,
|
|
831
|
+
RUN_KUBECTL_TOOL_NAME,
|
|
832
|
+
).execute({
|
|
833
|
+
clusterId: CLUSTER_ID.toString(),
|
|
834
|
+
command: "kubectl get pods -n web",
|
|
835
|
+
rationale: "see pod phases",
|
|
836
|
+
});
|
|
837
|
+
|
|
838
|
+
// It ran and failed: still evidence, cited with rowCount 0.
|
|
839
|
+
expect(outcome.success).toBe(true);
|
|
840
|
+
expect(outcome.result?.rowCount).toBe(0);
|
|
841
|
+
expect(outcome.textForLlm).not.toContain("NotFound");
|
|
842
|
+
expect(outcome.textForLlm).toContain(
|
|
843
|
+
`kubectl's stderr starts at offset ${stderrOffset}.]`,
|
|
844
|
+
);
|
|
845
|
+
|
|
846
|
+
const stderrPage: ToolOutputPage | { error: string } = toolkit
|
|
847
|
+
.getOutputPager()
|
|
848
|
+
.read({ outputId: "out-1", offset: stderrOffset });
|
|
849
|
+
expect("error" in stderrPage).toBe(false);
|
|
850
|
+
expect((stderrPage as ToolOutputPage).text).toBe(
|
|
851
|
+
'[stderr]\nError from server (NotFound): pods "web-10" not found',
|
|
852
|
+
);
|
|
853
|
+
});
|
|
854
|
+
|
|
855
|
+
it("names the stderr offset only when stderr is past the first page", () => {
|
|
856
|
+
expect(
|
|
857
|
+
KubectlInvestigationToolkit.describeStderrPosition("just stdout", 10),
|
|
858
|
+
).toBeUndefined();
|
|
859
|
+
expect(
|
|
860
|
+
KubectlInvestigationToolkit.describeStderrPosition(
|
|
861
|
+
"ab\n[stderr]\nboom",
|
|
862
|
+
10,
|
|
863
|
+
),
|
|
864
|
+
).toBeUndefined();
|
|
865
|
+
expect(
|
|
866
|
+
KubectlInvestigationToolkit.describeStderrPosition(
|
|
867
|
+
`${"x".repeat(20)}\n[stderr]\nboom`,
|
|
868
|
+
10,
|
|
869
|
+
),
|
|
870
|
+
).toBe("kubectl's stderr starts at offset 21.");
|
|
871
|
+
});
|
|
872
|
+
|
|
873
|
+
/*
|
|
874
|
+
* The server no longer cuts anything, so isTruncated only reports a cut
|
|
875
|
+
* made before the output reached it (the agent's own byte cap) — never
|
|
876
|
+
* an output that is merely long and paged.
|
|
877
|
+
*/
|
|
878
|
+
it("reports isTruncated only for output the agent already cut", async () => {
|
|
879
|
+
const jobRun: jest.SpyInstance = jest.spyOn(KubectlJobRunner, "run");
|
|
880
|
+
const toolkit: KubectlInvestigationToolkit =
|
|
636
881
|
new KubectlInvestigationToolkit({
|
|
637
882
|
projectId: PROJECT_ID,
|
|
638
883
|
aiRunId: RUN_ID,
|
|
639
884
|
clusters: [readyCluster()],
|
|
885
|
+
});
|
|
886
|
+
const tool: ObservabilityAssistantExtraTool = getTool(
|
|
887
|
+
toolkit,
|
|
888
|
+
RUN_KUBECTL_TOOL_NAME,
|
|
889
|
+
);
|
|
890
|
+
const call: JSONObject = {
|
|
891
|
+
clusterId: CLUSTER_ID.toString(),
|
|
892
|
+
command: "kubectl get pods -n web",
|
|
893
|
+
rationale: "see pod phases",
|
|
894
|
+
};
|
|
895
|
+
|
|
896
|
+
// Cut before it arrived, as the job runner reports it.
|
|
897
|
+
jobRun.mockResolvedValueOnce(ranOutcome({ isTruncated: true }));
|
|
898
|
+
const cut: ToolCallOutcome = await tool.execute(call);
|
|
899
|
+
expect(cut.result?.isTruncated).toBe(true);
|
|
900
|
+
expect(cut.textForLlm).not.toContain(READ_TOOL_OUTPUT_TOOL_NAME);
|
|
901
|
+
|
|
902
|
+
// An outcome that does not say, but carries the cut marker.
|
|
903
|
+
jobRun.mockResolvedValueOnce(
|
|
904
|
+
ranOutcome({
|
|
905
|
+
isTruncated: undefined,
|
|
906
|
+
output: `web-1 1/1 Running 0${KUBECTL_OUTPUT_TRUNCATED_SUFFIX}`,
|
|
907
|
+
}),
|
|
908
|
+
);
|
|
909
|
+
expect((await tool.execute(call)).result?.isTruncated).toBe(true);
|
|
910
|
+
|
|
911
|
+
/*
|
|
912
|
+
* What really arrives: the full-output read reports isTruncated false,
|
|
913
|
+
* but the Runner / AI agent wrote its own cut marker into the output
|
|
914
|
+
* (stdout past its byte cap, stderr kept after it).
|
|
915
|
+
*/
|
|
916
|
+
jobRun.mockResolvedValueOnce(
|
|
917
|
+
ranOutcome({
|
|
918
|
+
isTruncated: false,
|
|
919
|
+
output:
|
|
920
|
+
"[stdout]\nweb-1 1/1 Running\n... [output truncated: stdout cut at 1000000 bytes; stderr follows]\n[stderr]\nwarning",
|
|
640
921
|
}),
|
|
922
|
+
);
|
|
923
|
+
expect((await tool.execute(call)).result?.isTruncated).toBe(true);
|
|
924
|
+
|
|
925
|
+
// Long but whole: paged, and not truncated.
|
|
926
|
+
jobRun.mockResolvedValueOnce(
|
|
927
|
+
ranOutcome({ isTruncated: false, output: longListing("END") }),
|
|
928
|
+
);
|
|
929
|
+
const paged: ToolCallOutcome = await tool.execute(call);
|
|
930
|
+
expect(paged.result?.isTruncated).toBe(false);
|
|
931
|
+
expect(paged.textForLlm).toContain('outputId="out-1"');
|
|
932
|
+
|
|
933
|
+
// Short and whole.
|
|
934
|
+
jobRun.mockResolvedValueOnce(ranOutcome({ isTruncated: false }));
|
|
935
|
+
expect((await tool.execute(call)).result?.isTruncated).toBe(false);
|
|
936
|
+
});
|
|
937
|
+
|
|
938
|
+
/*
|
|
939
|
+
* An investigation's toolkits share one pager, so one read_tool_output
|
|
940
|
+
* reads every long output of the run — and outputIds never collide.
|
|
941
|
+
*/
|
|
942
|
+
it("keeps long outputs in the pager it was given, numbered across the run", async () => {
|
|
943
|
+
jest
|
|
944
|
+
.spyOn(KubectlJobRunner, "run")
|
|
945
|
+
.mockResolvedValue(ranOutcome({ output: longListing("SHARED-END") }));
|
|
946
|
+
|
|
947
|
+
const pager: ToolOutputPager = new ToolOutputPager();
|
|
948
|
+
// Another toolkit of the run already stored one.
|
|
949
|
+
pager.paginate({
|
|
950
|
+
label: "earlier output",
|
|
951
|
+
text: "e".repeat(TOOL_OUTPUT_PAGE_CHARS + 1),
|
|
952
|
+
});
|
|
953
|
+
|
|
954
|
+
const toolkit: KubectlInvestigationToolkit =
|
|
955
|
+
new KubectlInvestigationToolkit({
|
|
956
|
+
projectId: PROJECT_ID,
|
|
957
|
+
aiRunId: RUN_ID,
|
|
958
|
+
clusters: [readyCluster()],
|
|
959
|
+
outputPager: pager,
|
|
960
|
+
});
|
|
961
|
+
expect(toolkit.getOutputPager()).toBe(pager);
|
|
962
|
+
|
|
963
|
+
const outcome: ToolCallOutcome = await getTool(
|
|
964
|
+
toolkit,
|
|
641
965
|
RUN_KUBECTL_TOOL_NAME,
|
|
642
966
|
).execute({
|
|
643
967
|
clusterId: CLUSTER_ID.toString(),
|
|
644
|
-
command: "kubectl get pods -
|
|
645
|
-
rationale: "
|
|
968
|
+
command: "kubectl get pods -n web",
|
|
969
|
+
rationale: "see pod phases",
|
|
646
970
|
});
|
|
647
971
|
|
|
648
|
-
expect(outcome.
|
|
649
|
-
expect(
|
|
650
|
-
expect(
|
|
972
|
+
expect(outcome.textForLlm).toContain('outputId="out-2"');
|
|
973
|
+
expect(readWholeOutput(pager, "out-2")).toBe(longListing("SHARED-END"));
|
|
974
|
+
expect(readWholeOutput(pager, "out-1")).toBe(
|
|
975
|
+
"e".repeat(TOOL_OUTPUT_PAGE_CHARS + 1),
|
|
976
|
+
);
|
|
977
|
+
|
|
978
|
+
// Without one, each toolkit keeps its own.
|
|
979
|
+
const own: ToolOutputPager = new KubectlInvestigationToolkit({
|
|
980
|
+
projectId: PROJECT_ID,
|
|
981
|
+
aiRunId: RUN_ID,
|
|
982
|
+
clusters: [readyCluster()],
|
|
983
|
+
}).getOutputPager();
|
|
984
|
+
expect(own).toBeInstanceOf(ToolOutputPager);
|
|
985
|
+
expect(own).not.toBe(pager);
|
|
651
986
|
});
|
|
652
987
|
|
|
653
988
|
it("redacts a Runner error message that echoes credential material", async () => {
|
|
@@ -689,8 +1024,8 @@ describe("KubectlInvestigationToolkit run_kubectl", () => {
|
|
|
689
1024
|
);
|
|
690
1025
|
});
|
|
691
1026
|
|
|
692
|
-
it("spends
|
|
693
|
-
jest
|
|
1027
|
+
it("spends an explicit smaller command cap and then refuses", async () => {
|
|
1028
|
+
const enqueue: jest.SpyInstance = jest
|
|
694
1029
|
.spyOn(RunnerJobService, "enqueueAiKubectlCommand")
|
|
695
1030
|
.mockResolvedValue(fakeJob());
|
|
696
1031
|
jest
|
|
@@ -714,23 +1049,96 @@ describe("KubectlInvestigationToolkit run_kubectl", () => {
|
|
|
714
1049
|
rationale: "again",
|
|
715
1050
|
};
|
|
716
1051
|
|
|
1052
|
+
// A cap below the runaway guard is stated to the model up front.
|
|
1053
|
+
expect(tool.definition.description).toContain(
|
|
1054
|
+
" At most 2 commands in this run.",
|
|
1055
|
+
);
|
|
1056
|
+
|
|
717
1057
|
expect((await tool.execute(call)).success).toBe(true);
|
|
718
1058
|
expect((await tool.execute(call)).success).toBe(true);
|
|
719
1059
|
|
|
720
1060
|
const third: ToolCallOutcome = await tool.execute(call);
|
|
721
1061
|
expect(third.success).toBe(false);
|
|
722
|
-
expect(third.textForLlm).
|
|
1062
|
+
expect(third.textForLlm).toBe(
|
|
1063
|
+
"This run has already sent 2 kubectl commands, the most one run may send. Finish your analysis with what you have.",
|
|
1064
|
+
);
|
|
1065
|
+
expect(third.result).toBeUndefined();
|
|
1066
|
+
expect(enqueue).toHaveBeenCalledTimes(2);
|
|
723
1067
|
expect(toolkit.getCommandsRun()).toBe(2);
|
|
724
|
-
|
|
1068
|
+
});
|
|
1069
|
+
|
|
1070
|
+
/*
|
|
1071
|
+
* By default the cap is a runaway guard, not a ration: the model is told
|
|
1072
|
+
* to run as many commands as it needs and is not told a number.
|
|
1073
|
+
*/
|
|
1074
|
+
it("defaults to the shared runaway guard of MAX_KUBECTL_COMMANDS_PER_INVESTIGATION", async () => {
|
|
1075
|
+
expect(MAX_KUBECTL_COMMANDS_PER_INVESTIGATION).toBe(200);
|
|
1076
|
+
|
|
1077
|
+
const jobRun: jest.SpyInstance = jest
|
|
1078
|
+
.spyOn(KubectlJobRunner, "run")
|
|
1079
|
+
.mockResolvedValue(ranOutcome());
|
|
1080
|
+
const toolkit: KubectlInvestigationToolkit =
|
|
1081
|
+
new KubectlInvestigationToolkit({
|
|
1082
|
+
projectId: PROJECT_ID,
|
|
1083
|
+
aiRunId: RUN_ID,
|
|
1084
|
+
clusters: [readyCluster()],
|
|
1085
|
+
});
|
|
1086
|
+
const tool: ObservabilityAssistantExtraTool = getTool(
|
|
1087
|
+
toolkit,
|
|
1088
|
+
RUN_KUBECTL_TOOL_NAME,
|
|
1089
|
+
);
|
|
1090
|
+
|
|
1091
|
+
expect(tool.definition.description).toContain(
|
|
1092
|
+
"Run as many commands as the investigation needs.",
|
|
1093
|
+
);
|
|
1094
|
+
expect(tool.definition.description).not.toContain("At most");
|
|
1095
|
+
|
|
1096
|
+
const call: JSONObject = {
|
|
1097
|
+
clusterId: CLUSTER_ID.toString(),
|
|
1098
|
+
command: "kubectl get pods -n web",
|
|
1099
|
+
rationale: "again",
|
|
1100
|
+
};
|
|
1101
|
+
|
|
1102
|
+
for (
|
|
1103
|
+
let index: number = 0;
|
|
1104
|
+
index < MAX_KUBECTL_COMMANDS_PER_INVESTIGATION;
|
|
1105
|
+
index++
|
|
1106
|
+
) {
|
|
1107
|
+
expect((await tool.execute(call)).success).toBe(true);
|
|
1108
|
+
}
|
|
1109
|
+
|
|
1110
|
+
const over: ToolCallOutcome = await tool.execute(call);
|
|
1111
|
+
expect(over.success).toBe(false);
|
|
1112
|
+
expect(over.textForLlm).toContain(
|
|
1113
|
+
`This run has already sent ${MAX_KUBECTL_COMMANDS_PER_INVESTIGATION} kubectl commands, the most one run may send.`,
|
|
1114
|
+
);
|
|
1115
|
+
expect(jobRun).toHaveBeenCalledTimes(
|
|
1116
|
+
MAX_KUBECTL_COMMANDS_PER_INVESTIGATION,
|
|
1117
|
+
);
|
|
1118
|
+
expect(toolkit.getCommandsRun()).toBe(
|
|
1119
|
+
MAX_KUBECTL_COMMANDS_PER_INVESTIGATION,
|
|
1120
|
+
);
|
|
1121
|
+
expect(
|
|
1122
|
+
(
|
|
1123
|
+
jobRun.mock.calls[jobRun.mock.calls.length - 1]![0] as Record<
|
|
1124
|
+
string,
|
|
1125
|
+
unknown
|
|
1126
|
+
>
|
|
1127
|
+
)["stepId"],
|
|
1128
|
+
).toBe(
|
|
1129
|
+
`ai-investigation-kubectl-${MAX_KUBECTL_COMMANDS_PER_INVESTIGATION}`,
|
|
1130
|
+
);
|
|
725
1131
|
});
|
|
726
1132
|
});
|
|
727
1133
|
|
|
728
1134
|
/*
|
|
729
|
-
* C27:
|
|
730
|
-
* the
|
|
731
|
-
*
|
|
1135
|
+
* C27: a run has no time limit unless its project configured one. When it
|
|
1136
|
+
* did, the agent loop checks it only between tool calls, so the toolkit
|
|
1137
|
+
* plans each command's claim window and execution timeout against the
|
|
1138
|
+
* run's deadline and refuses what no longer fits. Without one, nothing
|
|
1139
|
+
* about a command's wait depends on the clock.
|
|
732
1140
|
*/
|
|
733
|
-
describe("KubectlInvestigationToolkit run_kubectl and the run's
|
|
1141
|
+
describe("KubectlInvestigationToolkit run_kubectl and the run's time limit", () => {
|
|
734
1142
|
const NOW_MS: number = 1_700_000_000_000;
|
|
735
1143
|
|
|
736
1144
|
let enqueue: jest.SpyInstance;
|
|
@@ -854,8 +1262,9 @@ describe("KubectlInvestigationToolkit run_kubectl and the run's wall clock", ()
|
|
|
854
1262
|
const outcome: ToolCallOutcome = await run(toolkit, MAX_KUBECTL_TIMEOUT_MS);
|
|
855
1263
|
|
|
856
1264
|
expect(outcome.success).toBe(false);
|
|
857
|
-
expect(outcome.textForLlm).toContain(
|
|
858
|
-
|
|
1265
|
+
expect(outcome.textForLlm).toContain(
|
|
1266
|
+
"Not enough time is left before this investigation's configured time limit to run another kubectl command (about 10s remain;",
|
|
1267
|
+
);
|
|
859
1268
|
expect(outcome.textForLlm).toContain(
|
|
860
1269
|
`at least ${Math.round(KubectlWaitBudget.getMinimumBudgetMs() / 1000)}s`,
|
|
861
1270
|
);
|
|
@@ -900,13 +1309,18 @@ describe("KubectlInvestigationToolkit run_kubectl and the run's wall clock", ()
|
|
|
900
1309
|
expect(toolkit.getCommandsRun()).toBe(0);
|
|
901
1310
|
});
|
|
902
1311
|
|
|
903
|
-
it("never lets a planned wait exceed the remaining
|
|
1312
|
+
it("never lets a planned wait exceed the remaining time, whatever is asked for", async () => {
|
|
904
1313
|
const remainings: Array<number> = [
|
|
905
1314
|
KubectlWaitBudget.getMinimumBudgetMs(),
|
|
906
1315
|
30_000,
|
|
907
|
-
|
|
1316
|
+
// The smallest time limit a project can configure.
|
|
1317
|
+
AIAgentRunLimitsHelper.fromTimeLimitInMinutes(
|
|
1318
|
+
MIN_AI_INVESTIGATION_TIME_LIMIT_IN_MINUTES,
|
|
1319
|
+
).maxWallClockMs!,
|
|
908
1320
|
96_000,
|
|
909
|
-
|
|
1321
|
+
150_000,
|
|
1322
|
+
// A typical configured limit, from its start.
|
|
1323
|
+
AIAgentRunLimitsHelper.fromTimeLimitInMinutes(15).maxWallClockMs!,
|
|
910
1324
|
];
|
|
911
1325
|
const requests: Array<number> = [
|
|
912
1326
|
1_000,
|
|
@@ -948,24 +1362,92 @@ describe("KubectlInvestigationToolkit run_kubectl and the run's wall clock", ()
|
|
|
948
1362
|
});
|
|
949
1363
|
});
|
|
950
1364
|
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
1365
|
+
/*
|
|
1366
|
+
* No time limit is the default: what the runners derive for a project
|
|
1367
|
+
* that configured none is no deadline at all, and a toolkit without one
|
|
1368
|
+
* plans without a deadline and never refuses a command for time — however
|
|
1369
|
+
* long the run has been going.
|
|
1370
|
+
*/
|
|
1371
|
+
it("has no deadline by default, so an unlimited run never refuses for time", async () => {
|
|
1372
|
+
const defaults: AIAgentRunLimits = AIAgentRunLimitsHelper.getDefault();
|
|
1373
|
+
expect(defaults.maxWallClockMs).toBeUndefined();
|
|
1374
|
+
expect(
|
|
1375
|
+
AIAgentRunLimitsHelper.getDeadlineAtMs(defaults, NOW_MS),
|
|
1376
|
+
).toBeUndefined();
|
|
1377
|
+
|
|
1378
|
+
const plan: jest.SpyInstance = jest.spyOn(KubectlWaitBudget, "plan");
|
|
1379
|
+
const toolkit: KubectlInvestigationToolkit =
|
|
1380
|
+
new KubectlInvestigationToolkit({
|
|
1381
|
+
projectId: PROJECT_ID,
|
|
1382
|
+
aiRunId: RUN_ID,
|
|
1383
|
+
clusters: [readyCluster()],
|
|
1384
|
+
});
|
|
1385
|
+
|
|
1386
|
+
// A day into the run.
|
|
1387
|
+
jest.spyOn(Date, "now").mockReturnValue(NOW_MS + 24 * 60 * 60 * 1000);
|
|
1388
|
+
|
|
1389
|
+
const outcome: ToolCallOutcome = await run(toolkit, MAX_KUBECTL_TIMEOUT_MS);
|
|
1390
|
+
|
|
1391
|
+
expect(outcome.success).toBe(true);
|
|
1392
|
+
expect(plan).toHaveBeenCalledWith({
|
|
1393
|
+
requestedTimeoutInMs: MAX_KUBECTL_TIMEOUT_MS,
|
|
1394
|
+
maxClaimTimeoutInMs: KUBECTL_CLAIM_TIMEOUT_MS,
|
|
1395
|
+
deadlineAtMs: undefined,
|
|
1396
|
+
});
|
|
1397
|
+
expect(enqueuedWindows()).toEqual({
|
|
1398
|
+
timeoutInMs: MAX_KUBECTL_TIMEOUT_MS,
|
|
1399
|
+
claimTimeoutInMs: KUBECTL_CLAIM_TIMEOUT_MS,
|
|
1400
|
+
});
|
|
1401
|
+
expect(toolkit.getCommandsRun()).toBe(1);
|
|
1402
|
+
});
|
|
1403
|
+
|
|
1404
|
+
it("mentions shortening the timeout only when the run has a time limit", () => {
|
|
1405
|
+
const timeoutDescription: (
|
|
1406
|
+
toolkit: KubectlInvestigationToolkit,
|
|
1407
|
+
) => string = (toolkit: KubectlInvestigationToolkit): string => {
|
|
1408
|
+
const schema: JSONObject = getTool(toolkit, RUN_KUBECTL_TOOL_NAME)
|
|
1409
|
+
.definition.inputSchema as JSONObject;
|
|
1410
|
+
return (
|
|
1411
|
+
(schema["properties"] as JSONObject)["timeoutInMs"] as JSONObject
|
|
1412
|
+
)["description"] as string;
|
|
1413
|
+
};
|
|
1414
|
+
|
|
1415
|
+
const unlimited: string = timeoutDescription(
|
|
1416
|
+
toolkitWithDeadline(undefined),
|
|
1417
|
+
);
|
|
1418
|
+
expect(unlimited).toBe(
|
|
1419
|
+
`Timeout in milliseconds (default ${DEFAULT_KUBECTL_TIMEOUT_MS}, max ${MAX_KUBECTL_TIMEOUT_MS}).`,
|
|
1420
|
+
);
|
|
1421
|
+
|
|
1422
|
+
expect(timeoutDescription(toolkitWithDeadline(NOW_MS + 60_000))).toBe(
|
|
1423
|
+
`${unlimited} Shortened automatically when the investigation's configured time limit is close.`,
|
|
1424
|
+
);
|
|
959
1425
|
});
|
|
960
1426
|
|
|
961
|
-
it("
|
|
962
|
-
|
|
1427
|
+
it("can run a command at the start of the smallest time limit a project can configure", async () => {
|
|
1428
|
+
const smallest: AIAgentRunLimits =
|
|
1429
|
+
AIAgentRunLimitsHelper.fromTimeLimitInMinutes(
|
|
1430
|
+
MIN_AI_INVESTIGATION_TIME_LIMIT_IN_MINUTES,
|
|
1431
|
+
);
|
|
1432
|
+
expect(smallest.maxWallClockMs).toBe(
|
|
1433
|
+
MIN_AI_INVESTIGATION_TIME_LIMIT_IN_MINUTES * 60 * 1000,
|
|
1434
|
+
);
|
|
1435
|
+
// Even the floors of one command fit, or the tool would never run.
|
|
1436
|
+
expect(KubectlWaitBudget.getMinimumBudgetMs()).toBeLessThan(
|
|
1437
|
+
smallest.maxWallClockMs!,
|
|
1438
|
+
);
|
|
1439
|
+
|
|
1440
|
+
const outcome: ToolCallOutcome = await run(
|
|
1441
|
+
toolkitWithDeadline(
|
|
1442
|
+
AIAgentRunLimitsHelper.getDeadlineAtMs(smallest, NOW_MS),
|
|
1443
|
+
),
|
|
1444
|
+
DEFAULT_KUBECTL_TIMEOUT_MS,
|
|
1445
|
+
);
|
|
1446
|
+
|
|
1447
|
+
expect(outcome.success).toBe(true);
|
|
963
1448
|
expect(
|
|
964
|
-
KubectlWaitBudget.getWorstCaseWaitMs(
|
|
965
|
-
|
|
966
|
-
claimTimeoutInMs: KUBECTL_CLAIM_TIMEOUT_MS,
|
|
967
|
-
}),
|
|
968
|
-
).toBeLessThan(INVESTIGATION_MAX_WALL_CLOCK_MS);
|
|
1449
|
+
KubectlWaitBudget.getWorstCaseWaitMs(enqueuedWindows()),
|
|
1450
|
+
).toBeLessThanOrEqual(smallest.maxWallClockMs!);
|
|
969
1451
|
});
|
|
970
1452
|
});
|
|
971
1453
|
|