@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
|
@@ -139,6 +139,7 @@ jest.mock(
|
|
|
139
139
|
|
|
140
140
|
import InvestigationPanel, {
|
|
141
141
|
InvestigationSubjectType,
|
|
142
|
+
VERDICT_QUESTION,
|
|
142
143
|
} from "../../../../App/FeatureSet/Dashboard/src/Components/AI/InvestigationPanel";
|
|
143
144
|
import AIRunEvent from "../../../Models/DatabaseModels/AIRunEvent";
|
|
144
145
|
import HTTPErrorResponse from "../../../Types/API/HTTPErrorResponse";
|
|
@@ -532,7 +533,7 @@ describe("InvestigationPanel report lifecycle", () => {
|
|
|
532
533
|
renderPanel({ onAnalysisAvailable });
|
|
533
534
|
await flush();
|
|
534
535
|
|
|
535
|
-
expect(screen.getByText("
|
|
536
|
+
expect(screen.getByText("Completed")).toBeInTheDocument();
|
|
536
537
|
expect(screen.getByLabelText("Investigation report")).toBeInTheDocument();
|
|
537
538
|
expect(screen.getByTestId("investigation-markdown")).toHaveTextContent(
|
|
538
539
|
"The database connection pool was exhausted.",
|
|
@@ -550,8 +551,12 @@ describe("InvestigationPanel report lifecycle", () => {
|
|
|
550
551
|
renderEventReference: expect.any(Function),
|
|
551
552
|
}),
|
|
552
553
|
});
|
|
554
|
+
/*
|
|
555
|
+
* Sections sit directly under the card's title, so their headings are
|
|
556
|
+
* h3s, like the Summary's.
|
|
557
|
+
*/
|
|
553
558
|
expect(
|
|
554
|
-
screen.getByRole("heading", { level:
|
|
559
|
+
screen.getByRole("heading", { level: 3, name: "Root cause" }),
|
|
555
560
|
).toBeInTheDocument();
|
|
556
561
|
/*
|
|
557
562
|
* This report carries no evidence, so the section is only the activity
|
|
@@ -602,7 +607,7 @@ describe("InvestigationPanel report lifecycle", () => {
|
|
|
602
607
|
renderPanel({ onAnalysisAvailable });
|
|
603
608
|
await flush();
|
|
604
609
|
|
|
605
|
-
expect(screen.getByText("Preparing
|
|
610
|
+
expect(screen.getByText("Preparing report…")).toBeVisible();
|
|
606
611
|
expect(screen.getByText("Preparing the final report")).toBeVisible();
|
|
607
612
|
expect(screen.queryByTestId("investigation-markdown")).toBeNull();
|
|
608
613
|
// The steps can already be checked while the report is being written.
|
|
@@ -612,7 +617,7 @@ describe("InvestigationPanel report lifecycle", () => {
|
|
|
612
617
|
/* Status, run id, events and recommendation remain identical. */
|
|
613
618
|
await tick(POLL_INTERVAL_MS);
|
|
614
619
|
|
|
615
|
-
expect(screen.getByText("
|
|
620
|
+
expect(screen.getByText("Completed")).toBeVisible();
|
|
616
621
|
expect(screen.getByTestId("investigation-markdown")).toHaveTextContent(
|
|
617
622
|
"The database connection pool was exhausted.",
|
|
618
623
|
);
|
|
@@ -652,7 +657,7 @@ describe("InvestigationPanel report lifecycle", () => {
|
|
|
652
657
|
expect(postMock).toHaveBeenCalledTimes(2);
|
|
653
658
|
|
|
654
659
|
await resolveDeferred(slowPoll, completedResponse());
|
|
655
|
-
expect(screen.getByText("
|
|
660
|
+
expect(screen.getByText("Completed")).toBeVisible();
|
|
656
661
|
expect(postMock).toHaveBeenCalledTimes(2);
|
|
657
662
|
});
|
|
658
663
|
|
|
@@ -682,7 +687,7 @@ describe("InvestigationPanel report lifecycle", () => {
|
|
|
682
687
|
);
|
|
683
688
|
await flush();
|
|
684
689
|
|
|
685
|
-
expect(screen.getByText("
|
|
690
|
+
expect(screen.getByText("Completed")).toBeVisible();
|
|
686
691
|
expect(postRequestAt(1).data).toEqual({ alertId: ALERT_ID.toString() });
|
|
687
692
|
|
|
688
693
|
await resolveDeferred(
|
|
@@ -690,7 +695,7 @@ describe("InvestigationPanel report lifecycle", () => {
|
|
|
690
695
|
successfulResponse(investigationPayload({ status: AIRunStatus.Running })),
|
|
691
696
|
);
|
|
692
697
|
|
|
693
|
-
expect(screen.getByText("
|
|
698
|
+
expect(screen.getByText("Completed")).toBeVisible();
|
|
694
699
|
expect(screen.queryByText("Investigating…")).toBeNull();
|
|
695
700
|
expect(statuses[statuses.length - 1]).toBe(AIRunStatus.Completed);
|
|
696
701
|
});
|
|
@@ -749,9 +754,7 @@ describe("InvestigationPanel report lifecycle", () => {
|
|
|
749
754
|
renderPanel();
|
|
750
755
|
await flush();
|
|
751
756
|
|
|
752
|
-
expect(
|
|
753
|
-
screen.getByText("Investigation completed without a report"),
|
|
754
|
-
).toBeVisible();
|
|
757
|
+
expect(screen.getByText("No report")).toBeVisible();
|
|
755
758
|
expect(
|
|
756
759
|
screen.getByText("No investigation report was published."),
|
|
757
760
|
).toBeVisible();
|
|
@@ -770,7 +773,7 @@ describe("InvestigationPanel report lifecycle", () => {
|
|
|
770
773
|
);
|
|
771
774
|
expect(fixButton()).toBeDisabled();
|
|
772
775
|
// There is no report to judge, so the rating row is left out entirely.
|
|
773
|
-
expect(screen.queryByText("
|
|
776
|
+
expect(screen.queryByText("Was this analysis correct?")).toBeNull();
|
|
774
777
|
expect(screen.queryByRole("button", { name: "Confirmed" })).toBeNull();
|
|
775
778
|
expect(screen.queryByRole("button", { name: "Rejected" })).toBeNull();
|
|
776
779
|
});
|
|
@@ -789,7 +792,7 @@ describe("InvestigationPanel report lifecycle", () => {
|
|
|
789
792
|
renderPanel();
|
|
790
793
|
await flush();
|
|
791
794
|
|
|
792
|
-
expect(screen.getByText("
|
|
795
|
+
expect(screen.getByText("Did not finish")).toBeVisible();
|
|
793
796
|
expect(screen.getByText("The model provider timed out.")).toBeVisible();
|
|
794
797
|
expect(
|
|
795
798
|
screen.getByText("The investigation stopped before it could report."),
|
|
@@ -804,7 +807,7 @@ describe("InvestigationPanel report lifecycle", () => {
|
|
|
804
807
|
}),
|
|
805
808
|
);
|
|
806
809
|
expect(fixButton()).toBeNull();
|
|
807
|
-
expect(screen.queryByText("
|
|
810
|
+
expect(screen.queryByText("Was this analysis correct?")).toBeNull();
|
|
808
811
|
});
|
|
809
812
|
|
|
810
813
|
test("uses the alert endpoint and alert id", async () => {
|
|
@@ -1078,9 +1081,19 @@ describe("InvestigationPanel TL;DR", () => {
|
|
|
1078
1081
|
renderPanel();
|
|
1079
1082
|
await flush();
|
|
1080
1083
|
|
|
1084
|
+
/*
|
|
1085
|
+
* The summary is the card's first section, under the same kind of
|
|
1086
|
+
* heading as the rest, and the TL;DR is its lead line. There is no
|
|
1087
|
+
* "TL;DR" chip any more: the larger type says it is the answer.
|
|
1088
|
+
*/
|
|
1081
1089
|
const summary: HTMLElement = screen.getByLabelText("Investigation summary");
|
|
1082
|
-
expect(
|
|
1083
|
-
|
|
1090
|
+
expect(
|
|
1091
|
+
within(summary).getByRole("heading", { level: 3, name: "Summary" }),
|
|
1092
|
+
).toBeInTheDocument();
|
|
1093
|
+
expect(summary).not.toHaveTextContent("TL;DR");
|
|
1094
|
+
const lead: HTMLElement = within(summary).getByText(TLDR);
|
|
1095
|
+
expect(lead.tagName).toBe("P");
|
|
1096
|
+
expect(lead).toHaveClass("text-base", "font-semibold");
|
|
1084
1097
|
|
|
1085
1098
|
// The summary is never routed through the markdown renderer.
|
|
1086
1099
|
expect(markdownTexts().length).toBeGreaterThan(0);
|
|
@@ -1306,7 +1319,7 @@ describe("InvestigationPanel TL;DR", () => {
|
|
|
1306
1319
|
*/
|
|
1307
1320
|
describe("InvestigationPanel verdict control", () => {
|
|
1308
1321
|
function verdictGroup(): HTMLElement | null {
|
|
1309
|
-
return screen.queryByRole("group", { name: "
|
|
1322
|
+
return screen.queryByRole("group", { name: "Was this analysis correct?" });
|
|
1310
1323
|
}
|
|
1311
1324
|
|
|
1312
1325
|
test("offers both verdicts inside one labelled group", async () => {
|
|
@@ -1383,7 +1396,7 @@ describe("InvestigationPanel verdict control", () => {
|
|
|
1383
1396
|
await flush();
|
|
1384
1397
|
|
|
1385
1398
|
expect(screen.getByLabelText("Investigation status")).toHaveTextContent(
|
|
1386
|
-
"
|
|
1399
|
+
"Completed",
|
|
1387
1400
|
);
|
|
1388
1401
|
});
|
|
1389
1402
|
});
|
|
@@ -1399,11 +1412,13 @@ describe("InvestigationPanel verdict control", () => {
|
|
|
1399
1412
|
*/
|
|
1400
1413
|
describe("InvestigationPanel rating availability", () => {
|
|
1401
1414
|
function ratingHeading(): HTMLElement | null {
|
|
1402
|
-
return screen.queryByRole("heading", {
|
|
1415
|
+
return screen.queryByRole("heading", {
|
|
1416
|
+
name: "Was this analysis correct?",
|
|
1417
|
+
});
|
|
1403
1418
|
}
|
|
1404
1419
|
|
|
1405
1420
|
function ratingGroup(): HTMLElement | null {
|
|
1406
|
-
return screen.queryByRole("group", { name: "
|
|
1421
|
+
return screen.queryByRole("group", { name: "Was this analysis correct?" });
|
|
1407
1422
|
}
|
|
1408
1423
|
|
|
1409
1424
|
function actionsFrame(): HTMLElement | null {
|
|
@@ -1428,7 +1443,7 @@ describe("InvestigationPanel rating availability", () => {
|
|
|
1428
1443
|
|
|
1429
1444
|
function expectNoRating(): void {
|
|
1430
1445
|
expect(ratingHeading()).toBeNull();
|
|
1431
|
-
expect(screen.queryByText("
|
|
1446
|
+
expect(screen.queryByText("Was this analysis correct?")).toBeNull();
|
|
1432
1447
|
expect(ratingGroup()).toBeNull();
|
|
1433
1448
|
expect(verdictAnswers()).toEqual([]);
|
|
1434
1449
|
expect(screen.queryByText(/You (confirmed|rejected) this/)).toBeNull();
|
|
@@ -1530,9 +1545,7 @@ describe("InvestigationPanel rating availability", () => {
|
|
|
1530
1545
|
await flush();
|
|
1531
1546
|
|
|
1532
1547
|
expect(requestPath(0)).toContain(path);
|
|
1533
|
-
expect(
|
|
1534
|
-
screen.getByText("Investigation completed without a report"),
|
|
1535
|
-
).toBeVisible();
|
|
1548
|
+
expect(screen.getByText("No report")).toBeVisible();
|
|
1536
1549
|
expect(
|
|
1537
1550
|
screen.getByText("No investigation report was published."),
|
|
1538
1551
|
).toBeVisible();
|
|
@@ -1592,7 +1605,7 @@ describe("InvestigationPanel rating availability", () => {
|
|
|
1592
1605
|
await flush();
|
|
1593
1606
|
|
|
1594
1607
|
expect(screen.getByLabelText("Investigation status")).toHaveTextContent(
|
|
1595
|
-
"
|
|
1608
|
+
"Completed",
|
|
1596
1609
|
);
|
|
1597
1610
|
expect(
|
|
1598
1611
|
screen.getByText("No investigation report was published."),
|
|
@@ -1986,7 +1999,7 @@ describe("InvestigationPanel code-fix recommendation", () => {
|
|
|
1986
1999
|
|
|
1987
2000
|
expect(fixButton()).toBeEnabled();
|
|
1988
2001
|
expect(screen.getByText("Act on this investigation")).toBeVisible();
|
|
1989
|
-
expect(screen.getByText("
|
|
2002
|
+
expect(screen.getByText("Was this analysis correct?")).toBeVisible();
|
|
1990
2003
|
});
|
|
1991
2004
|
|
|
1992
2005
|
test("hides every fix-task element for NotRecommended but retains verdict controls", async () => {
|
|
@@ -2002,7 +2015,7 @@ describe("InvestigationPanel code-fix recommendation", () => {
|
|
|
2002
2015
|
expect(fixButton()).toBeNull();
|
|
2003
2016
|
expect(screen.queryByText("Act on this investigation")).toBeNull();
|
|
2004
2017
|
expect(screen.queryByText(/Fix task created/)).toBeNull();
|
|
2005
|
-
expect(screen.getByText("
|
|
2018
|
+
expect(screen.getByText("Was this analysis correct?")).toBeVisible();
|
|
2006
2019
|
expect(screen.getByRole("button", { name: "Confirmed" })).toBeEnabled();
|
|
2007
2020
|
expect(screen.getByRole("button", { name: "Rejected" })).toBeEnabled();
|
|
2008
2021
|
});
|
|
@@ -2019,7 +2032,7 @@ describe("InvestigationPanel code-fix recommendation", () => {
|
|
|
2019
2032
|
await flush();
|
|
2020
2033
|
|
|
2021
2034
|
expect(fixButton()).toBeNull();
|
|
2022
|
-
expect(screen.getByText("
|
|
2035
|
+
expect(screen.getByText("Was this analysis correct?")).toBeVisible();
|
|
2023
2036
|
expect(jest.getTimerCount()).toBe(1);
|
|
2024
2037
|
|
|
2025
2038
|
await advanceFastPolls(4);
|
|
@@ -2055,7 +2068,7 @@ describe("InvestigationPanel code-fix recommendation", () => {
|
|
|
2055
2068
|
await flush();
|
|
2056
2069
|
|
|
2057
2070
|
expect(fixButton()).toBeNull();
|
|
2058
|
-
expect(screen.getByText("
|
|
2071
|
+
expect(screen.getByText("Was this analysis correct?")).toBeVisible();
|
|
2059
2072
|
expect(jest.getTimerCount()).toBe(2);
|
|
2060
2073
|
|
|
2061
2074
|
await advanceFastPolls();
|
|
@@ -2077,7 +2090,7 @@ describe("InvestigationPanel code-fix recommendation", () => {
|
|
|
2077
2090
|
renderPanel();
|
|
2078
2091
|
await flush();
|
|
2079
2092
|
|
|
2080
|
-
expect(screen.getByText("
|
|
2093
|
+
expect(screen.getByText("Completed")).toBeVisible();
|
|
2081
2094
|
expect(fixButton()).toBeNull();
|
|
2082
2095
|
expect(postMock).toHaveBeenCalledTimes(1);
|
|
2083
2096
|
expect(jest.getTimerCount()).toBe(2);
|
|
@@ -2099,7 +2112,7 @@ describe("InvestigationPanel code-fix recommendation", () => {
|
|
|
2099
2112
|
renderPanel();
|
|
2100
2113
|
await flush();
|
|
2101
2114
|
|
|
2102
|
-
expect(screen.getByText("
|
|
2115
|
+
expect(screen.getByText("Completed")).toBeVisible();
|
|
2103
2116
|
expect(screen.queryByText("Investigating…")).toBeNull();
|
|
2104
2117
|
expect(
|
|
2105
2118
|
document.querySelector('[class~="motion-safe:animate-ping"]'),
|
|
@@ -2361,7 +2374,7 @@ describe("InvestigationPanel completed actions", () => {
|
|
|
2361
2374
|
|
|
2362
2375
|
expect(screen.queryByRole("alert")).toBeNull();
|
|
2363
2376
|
expect(fixButton()).toBeEnabled();
|
|
2364
|
-
expect(screen.getByText("
|
|
2377
|
+
expect(screen.getByText("Completed")).toBeVisible();
|
|
2365
2378
|
});
|
|
2366
2379
|
|
|
2367
2380
|
test("resets fix-task and verdict state when the same subject gets a new run", async () => {
|
|
@@ -2439,7 +2452,7 @@ describe("InvestigationPanel completed actions", () => {
|
|
|
2439
2452
|
expect(fixButton()).toBeNull();
|
|
2440
2453
|
expect(screen.getByText(/You confirmed this analysis/)).toBeVisible();
|
|
2441
2454
|
expect(screen.getByText("Change")).toBeVisible();
|
|
2442
|
-
expect(screen.getByText("
|
|
2455
|
+
expect(screen.getByText("Was this analysis correct?")).toBeVisible();
|
|
2443
2456
|
});
|
|
2444
2457
|
|
|
2445
2458
|
test("a GET started before verdict save cannot overwrite the saved verdict", async () => {
|
|
@@ -2709,7 +2722,7 @@ describe("InvestigationPanel structured report", () => {
|
|
|
2709
2722
|
});
|
|
2710
2723
|
expect(
|
|
2711
2724
|
within(report)
|
|
2712
|
-
.getAllByRole("heading", { level:
|
|
2725
|
+
.getAllByRole("heading", { level: 3 })
|
|
2713
2726
|
.map((heading: HTMLElement): string => {
|
|
2714
2727
|
return heading.textContent || "";
|
|
2715
2728
|
}),
|
|
@@ -3360,7 +3373,7 @@ describe("InvestigationPanel structured report", () => {
|
|
|
3360
3373
|
screen.getByRole("heading", { name: "Act on this investigation" }),
|
|
3361
3374
|
).toBeVisible();
|
|
3362
3375
|
expect(
|
|
3363
|
-
screen.getByRole("heading", { name: "
|
|
3376
|
+
screen.getByRole("heading", { name: "Was this analysis correct?" }),
|
|
3364
3377
|
).toBeVisible();
|
|
3365
3378
|
expect(container.querySelectorAll("p div")).toHaveLength(0);
|
|
3366
3379
|
});
|
|
@@ -4205,3 +4218,685 @@ describe("InvestigationPanel verdict callback", () => {
|
|
|
4205
4218
|
expect(first).toHaveBeenCalledTimes(firstCallCount);
|
|
4206
4219
|
});
|
|
4207
4220
|
});
|
|
4221
|
+
|
|
4222
|
+
/*
|
|
4223
|
+
* A completed investigation used to stack a tinted summary box, a report box
|
|
4224
|
+
* with an amber callout inside it, a details box and an actions box inside
|
|
4225
|
+
* the card: a card inside a card inside a card. Every state is now the card
|
|
4226
|
+
* and plain content inside it, spaced apart and split by at most a hairline,
|
|
4227
|
+
* with the state named once, in the header's neutral pill.
|
|
4228
|
+
*/
|
|
4229
|
+
describe("InvestigationPanel as one flat card", () => {
|
|
4230
|
+
const CLUSTER_ID: string = "0193c0de-1111-4aaa-8bbb-000000000001";
|
|
4231
|
+
const OTHER_CLUSTER_ID: string = "0193c0de-2222-4aaa-8bbb-000000000002";
|
|
4232
|
+
|
|
4233
|
+
const clusterAccess: JSONArray = [
|
|
4234
|
+
{
|
|
4235
|
+
clusterId: CLUSTER_ID,
|
|
4236
|
+
clusterName: "prod-east",
|
|
4237
|
+
isInvestigationReady: true,
|
|
4238
|
+
isRemediationReady: true,
|
|
4239
|
+
remediationMode: "RequireApproval",
|
|
4240
|
+
gaps: [],
|
|
4241
|
+
evaluatedAt: COMPLETED_AT,
|
|
4242
|
+
},
|
|
4243
|
+
{
|
|
4244
|
+
clusterId: OTHER_CLUSTER_ID,
|
|
4245
|
+
clusterName: "staging-west",
|
|
4246
|
+
isInvestigationReady: false,
|
|
4247
|
+
isRemediationReady: false,
|
|
4248
|
+
remediationMode: "Disabled",
|
|
4249
|
+
gaps: [
|
|
4250
|
+
{
|
|
4251
|
+
code: "investigation_disabled",
|
|
4252
|
+
title: "Investigation is off",
|
|
4253
|
+
description: "AI may not run kubectl on this cluster.",
|
|
4254
|
+
nextStep: "Turn on 'Investigate with kubectl'.",
|
|
4255
|
+
blocks: "investigation",
|
|
4256
|
+
},
|
|
4257
|
+
],
|
|
4258
|
+
evaluatedAt: COMPLETED_AT,
|
|
4259
|
+
},
|
|
4260
|
+
];
|
|
4261
|
+
|
|
4262
|
+
const structuredMarkdown: string = [
|
|
4263
|
+
"**Summary** — the connection pool ran dry after the 18:00 deploy [C1].",
|
|
4264
|
+
"",
|
|
4265
|
+
"**Most likely root cause** — the deploy halved the pool size [C1].",
|
|
4266
|
+
"",
|
|
4267
|
+
"**Suggested next steps**",
|
|
4268
|
+
"- Roll back the deploy",
|
|
4269
|
+
].join("\n");
|
|
4270
|
+
|
|
4271
|
+
const evidenceItems: JSONArray = [
|
|
4272
|
+
{
|
|
4273
|
+
citationId: "C1",
|
|
4274
|
+
toolName: "search_logs",
|
|
4275
|
+
label: "Logs 17:20 – 18:20 (1 shown)",
|
|
4276
|
+
rowCount: 1,
|
|
4277
|
+
queryArguments: { bodySearchText: "pool timeout" },
|
|
4278
|
+
executedAt: "2026-08-07T11:59:00.000Z",
|
|
4279
|
+
canLoadRows: true,
|
|
4280
|
+
},
|
|
4281
|
+
];
|
|
4282
|
+
|
|
4283
|
+
function withClusters(response: ApiResponse): ApiResponse {
|
|
4284
|
+
return { data: { ...response.data, clusterAccess } };
|
|
4285
|
+
}
|
|
4286
|
+
|
|
4287
|
+
function fullReportResponse(): ApiResponse {
|
|
4288
|
+
return withClusters(
|
|
4289
|
+
completedResponse({
|
|
4290
|
+
analysisMarkdown: structuredMarkdown,
|
|
4291
|
+
analysisTldr: TLDR,
|
|
4292
|
+
evidence: evidenceItems,
|
|
4293
|
+
}),
|
|
4294
|
+
);
|
|
4295
|
+
}
|
|
4296
|
+
|
|
4297
|
+
/*
|
|
4298
|
+
* Classes that turn an element into a panel of its own: a large rounded
|
|
4299
|
+
* frame, a shadow, a gradient or a tinted wash. Controls (buttons, links,
|
|
4300
|
+
* tabs and the verdict's two-answer group) are drawn as controls and are
|
|
4301
|
+
* left out.
|
|
4302
|
+
*/
|
|
4303
|
+
const PANEL_CLASS: RegExp =
|
|
4304
|
+
/^(rounded-xl|rounded-2xl|shadow|shadow-(sm|md|lg)|bg-gradient-to-[a-z]+|bg-(indigo|amber|emerald|red|green|rose|violet)-50(\/\d+)?|bg-gray-50(\/\d+)?)$/;
|
|
4305
|
+
const CONTROL_SELECTOR: string =
|
|
4306
|
+
"button, a, [role='tab'], [role='group'], [data-testid='investigation-markdown']";
|
|
4307
|
+
|
|
4308
|
+
function classTokens(element: Element): Array<string> {
|
|
4309
|
+
return (element.getAttribute("class") || "").split(/\s+/);
|
|
4310
|
+
}
|
|
4311
|
+
|
|
4312
|
+
function panelsInsideTheCard(): Array<string> {
|
|
4313
|
+
const region: HTMLElement = screen.getByRole("region", {
|
|
4314
|
+
name: "AI Investigation",
|
|
4315
|
+
});
|
|
4316
|
+
|
|
4317
|
+
return Array.from(region.querySelectorAll("*"))
|
|
4318
|
+
.filter((element: Element): boolean => {
|
|
4319
|
+
if (element.closest(CONTROL_SELECTOR)) {
|
|
4320
|
+
return false;
|
|
4321
|
+
}
|
|
4322
|
+
|
|
4323
|
+
const tokens: Array<string> = classTokens(element);
|
|
4324
|
+
const isFramedBox: boolean =
|
|
4325
|
+
tokens.includes("border") &&
|
|
4326
|
+
tokens.some((token: string): boolean => {
|
|
4327
|
+
return token.startsWith("rounded");
|
|
4328
|
+
});
|
|
4329
|
+
|
|
4330
|
+
return (
|
|
4331
|
+
isFramedBox ||
|
|
4332
|
+
tokens.some((token: string): boolean => {
|
|
4333
|
+
return PANEL_CLASS.test(token);
|
|
4334
|
+
})
|
|
4335
|
+
);
|
|
4336
|
+
})
|
|
4337
|
+
.map((element: Element): string => {
|
|
4338
|
+
return `<${element.tagName.toLowerCase()} class="${element.getAttribute("class")}">`;
|
|
4339
|
+
});
|
|
4340
|
+
}
|
|
4341
|
+
|
|
4342
|
+
const STATES: Array<[string, () => ApiResponse]> = [
|
|
4343
|
+
[
|
|
4344
|
+
"a completed report with a TL;DR, evidence and cluster access",
|
|
4345
|
+
fullReportResponse,
|
|
4346
|
+
],
|
|
4347
|
+
[
|
|
4348
|
+
"a running investigation",
|
|
4349
|
+
(): ApiResponse => {
|
|
4350
|
+
return withClusters(
|
|
4351
|
+
successfulResponse(
|
|
4352
|
+
investigationPayload({
|
|
4353
|
+
status: AIRunStatus.Running,
|
|
4354
|
+
events: [activityEvent],
|
|
4355
|
+
}),
|
|
4356
|
+
),
|
|
4357
|
+
);
|
|
4358
|
+
},
|
|
4359
|
+
],
|
|
4360
|
+
[
|
|
4361
|
+
"a queued investigation",
|
|
4362
|
+
(): ApiResponse => {
|
|
4363
|
+
return successfulResponse(
|
|
4364
|
+
investigationPayload({ status: AIRunStatus.Queued }),
|
|
4365
|
+
);
|
|
4366
|
+
},
|
|
4367
|
+
],
|
|
4368
|
+
[
|
|
4369
|
+
"a run that stopped with an error",
|
|
4370
|
+
(): ApiResponse => {
|
|
4371
|
+
return withClusters(
|
|
4372
|
+
successfulResponse(
|
|
4373
|
+
investigationPayload({
|
|
4374
|
+
status: AIRunStatus.Error,
|
|
4375
|
+
errorMessage: "The model provider timed out.",
|
|
4376
|
+
events: [activityEvent],
|
|
4377
|
+
toolCallCount: 3,
|
|
4378
|
+
totalTokens: 900,
|
|
4379
|
+
}),
|
|
4380
|
+
),
|
|
4381
|
+
);
|
|
4382
|
+
},
|
|
4383
|
+
],
|
|
4384
|
+
[
|
|
4385
|
+
"a report that is still being prepared",
|
|
4386
|
+
(): ApiResponse => {
|
|
4387
|
+
return completedResponse({
|
|
4388
|
+
analysisMarkdown: null,
|
|
4389
|
+
isAnalysisPending: true,
|
|
4390
|
+
});
|
|
4391
|
+
},
|
|
4392
|
+
],
|
|
4393
|
+
[
|
|
4394
|
+
"a run that finished without a report",
|
|
4395
|
+
(): ApiResponse => {
|
|
4396
|
+
return completedResponse({
|
|
4397
|
+
analysisMarkdown: null,
|
|
4398
|
+
isAnalysisPending: false,
|
|
4399
|
+
});
|
|
4400
|
+
},
|
|
4401
|
+
],
|
|
4402
|
+
];
|
|
4403
|
+
|
|
4404
|
+
test.each(STATES)(
|
|
4405
|
+
"draws %s as one card with no panel inside it",
|
|
4406
|
+
async (_state: string, response: () => ApiResponse) => {
|
|
4407
|
+
postMock.mockResolvedValue(response() as never);
|
|
4408
|
+
|
|
4409
|
+
renderPanel();
|
|
4410
|
+
await flush();
|
|
4411
|
+
|
|
4412
|
+
expect(screen.getAllByTestId("card")).toHaveLength(1);
|
|
4413
|
+
expect(panelsInsideTheCard()).toEqual([]);
|
|
4414
|
+
},
|
|
4415
|
+
);
|
|
4416
|
+
|
|
4417
|
+
test("still draws no panel once the details and an evidence row are open", async () => {
|
|
4418
|
+
routePosts({
|
|
4419
|
+
investigation: (): unknown => {
|
|
4420
|
+
return Promise.resolve(fullReportResponse());
|
|
4421
|
+
},
|
|
4422
|
+
evidence: (): unknown => {
|
|
4423
|
+
return Promise.resolve(
|
|
4424
|
+
evidenceRowsResponse("C1", "18:01 ERROR pool timeout"),
|
|
4425
|
+
);
|
|
4426
|
+
},
|
|
4427
|
+
});
|
|
4428
|
+
|
|
4429
|
+
renderPanel();
|
|
4430
|
+
await flush();
|
|
4431
|
+
|
|
4432
|
+
openDetails();
|
|
4433
|
+
fireEvent.click(
|
|
4434
|
+
within(evidenceList()).getByRole("button", { name: /Logs 17:20/ }),
|
|
4435
|
+
);
|
|
4436
|
+
await flush();
|
|
4437
|
+
|
|
4438
|
+
expect(screen.getByText("18:01 ERROR pool timeout")).toBeVisible();
|
|
4439
|
+
expect(panelsInsideTheCard()).toEqual([]);
|
|
4440
|
+
});
|
|
4441
|
+
|
|
4442
|
+
test.each([
|
|
4443
|
+
[
|
|
4444
|
+
"Investigating…",
|
|
4445
|
+
"live",
|
|
4446
|
+
(): ApiResponse => {
|
|
4447
|
+
return successfulResponse(
|
|
4448
|
+
investigationPayload({ status: AIRunStatus.Running }),
|
|
4449
|
+
);
|
|
4450
|
+
},
|
|
4451
|
+
],
|
|
4452
|
+
[
|
|
4453
|
+
"Queued",
|
|
4454
|
+
"live",
|
|
4455
|
+
(): ApiResponse => {
|
|
4456
|
+
return successfulResponse(
|
|
4457
|
+
investigationPayload({ status: AIRunStatus.Queued }),
|
|
4458
|
+
);
|
|
4459
|
+
},
|
|
4460
|
+
],
|
|
4461
|
+
[
|
|
4462
|
+
"Preparing report…",
|
|
4463
|
+
"live",
|
|
4464
|
+
(): ApiResponse => {
|
|
4465
|
+
return completedResponse({
|
|
4466
|
+
analysisMarkdown: null,
|
|
4467
|
+
isAnalysisPending: true,
|
|
4468
|
+
});
|
|
4469
|
+
},
|
|
4470
|
+
],
|
|
4471
|
+
[
|
|
4472
|
+
"Completed",
|
|
4473
|
+
"done",
|
|
4474
|
+
(): ApiResponse => {
|
|
4475
|
+
return completedResponse();
|
|
4476
|
+
},
|
|
4477
|
+
],
|
|
4478
|
+
[
|
|
4479
|
+
"No report",
|
|
4480
|
+
"attention",
|
|
4481
|
+
(): ApiResponse => {
|
|
4482
|
+
return completedResponse({
|
|
4483
|
+
analysisMarkdown: null,
|
|
4484
|
+
isAnalysisPending: false,
|
|
4485
|
+
});
|
|
4486
|
+
},
|
|
4487
|
+
],
|
|
4488
|
+
[
|
|
4489
|
+
"Did not finish",
|
|
4490
|
+
"failed",
|
|
4491
|
+
(): ApiResponse => {
|
|
4492
|
+
return successfulResponse(
|
|
4493
|
+
investigationPayload({
|
|
4494
|
+
status: AIRunStatus.Error,
|
|
4495
|
+
errorMessage: "The provider timed out.",
|
|
4496
|
+
}),
|
|
4497
|
+
);
|
|
4498
|
+
},
|
|
4499
|
+
],
|
|
4500
|
+
])(
|
|
4501
|
+
'names the state "%s" in the neutral header pill, marked %s',
|
|
4502
|
+
async (text: string, indicator: string, response: () => ApiResponse) => {
|
|
4503
|
+
postMock.mockResolvedValue(response() as never);
|
|
4504
|
+
|
|
4505
|
+
renderPanel();
|
|
4506
|
+
await flush();
|
|
4507
|
+
|
|
4508
|
+
const badge: HTMLElement = screen.getByLabelText("Investigation status");
|
|
4509
|
+
expect(badge).toHaveTextContent(text);
|
|
4510
|
+
expect(badge).toHaveAttribute("data-indicator", indicator);
|
|
4511
|
+
// The pill itself never changes colour with the state.
|
|
4512
|
+
expect(badge).toHaveClass("bg-gray-50", "text-gray-700", "ring-gray-200");
|
|
4513
|
+
expect(badge.className).not.toMatch(
|
|
4514
|
+
/(^|\s)(bg|text|ring)-(green|indigo|red|amber|rose|emerald)-/,
|
|
4515
|
+
);
|
|
4516
|
+
// It sits in the card's header, not in the body with the report.
|
|
4517
|
+
expect(
|
|
4518
|
+
screen.getByRole("region", { name: "AI Investigation" }),
|
|
4519
|
+
).not.toContainElement(badge);
|
|
4520
|
+
},
|
|
4521
|
+
);
|
|
4522
|
+
|
|
4523
|
+
test("reads summary, report, cluster access, working, then actions, in that order", async () => {
|
|
4524
|
+
postMock.mockResolvedValue(fullReportResponse() as never);
|
|
4525
|
+
|
|
4526
|
+
renderPanel();
|
|
4527
|
+
await flush();
|
|
4528
|
+
|
|
4529
|
+
const order: Array<HTMLElement> = [
|
|
4530
|
+
screen.getByRole("region", { name: "Investigation summary" }),
|
|
4531
|
+
screen.getByRole("region", { name: "Investigation report" }),
|
|
4532
|
+
screen.getByTestId("cluster-access-notice"),
|
|
4533
|
+
runDetails(),
|
|
4534
|
+
screen.getByTestId("investigation-actions"),
|
|
4535
|
+
];
|
|
4536
|
+
|
|
4537
|
+
for (let index: number = 1; index < order.length; index++) {
|
|
4538
|
+
expect(
|
|
4539
|
+
order[index - 1]!.compareDocumentPosition(order[index]!) &
|
|
4540
|
+
Node.DOCUMENT_POSITION_FOLLOWING,
|
|
4541
|
+
).toBeTruthy();
|
|
4542
|
+
}
|
|
4543
|
+
|
|
4544
|
+
// The report comes first: nothing about clusters stands above the answer.
|
|
4545
|
+
const region: HTMLElement = screen.getByRole("region", {
|
|
4546
|
+
name: "AI Investigation",
|
|
4547
|
+
});
|
|
4548
|
+
expect(region.firstElementChild).toBe(
|
|
4549
|
+
screen.getByRole("region", { name: "Investigation summary" }),
|
|
4550
|
+
);
|
|
4551
|
+
});
|
|
4552
|
+
|
|
4553
|
+
test("separates the report from its working and its actions with hairlines, not boxes", async () => {
|
|
4554
|
+
postMock.mockResolvedValue(fullReportResponse() as never);
|
|
4555
|
+
|
|
4556
|
+
renderPanel();
|
|
4557
|
+
await flush();
|
|
4558
|
+
|
|
4559
|
+
expect(runDetails()).toHaveClass("border-t", "border-gray-200", "pt-5");
|
|
4560
|
+
expect(classTokens(runDetails())).not.toContain("border");
|
|
4561
|
+
expect(runDetails().className).not.toMatch(/rounded|shadow|bg-/);
|
|
4562
|
+
|
|
4563
|
+
const actions: HTMLElement = screen.getByTestId("investigation-actions");
|
|
4564
|
+
expect(actions).toHaveClass("border-t", "border-gray-200", "divide-y");
|
|
4565
|
+
expect(classTokens(actions)).not.toContain("border");
|
|
4566
|
+
expect(actions.className).not.toMatch(/rounded|shadow|bg-/);
|
|
4567
|
+
});
|
|
4568
|
+
|
|
4569
|
+
test("gives every heading inside the card the same weight and size", async () => {
|
|
4570
|
+
postMock.mockResolvedValue(fullReportResponse() as never);
|
|
4571
|
+
|
|
4572
|
+
renderPanel();
|
|
4573
|
+
await flush();
|
|
4574
|
+
|
|
4575
|
+
const region: HTMLElement = screen.getByRole("region", {
|
|
4576
|
+
name: "AI Investigation",
|
|
4577
|
+
});
|
|
4578
|
+
const headings: Array<HTMLElement> = within(region).getAllByRole("heading");
|
|
4579
|
+
expect(
|
|
4580
|
+
headings.map((heading: HTMLElement): string => {
|
|
4581
|
+
return heading.textContent || "";
|
|
4582
|
+
}),
|
|
4583
|
+
).toEqual([
|
|
4584
|
+
"Summary",
|
|
4585
|
+
"Most likely root cause",
|
|
4586
|
+
"Suggested next steps",
|
|
4587
|
+
"Evidence and activity",
|
|
4588
|
+
"Act on this investigation",
|
|
4589
|
+
VERDICT_QUESTION,
|
|
4590
|
+
]);
|
|
4591
|
+
|
|
4592
|
+
for (const heading of headings) {
|
|
4593
|
+
expect(heading.tagName).toBe("H3");
|
|
4594
|
+
expect(heading).toHaveClass("text-sm", "font-semibold", "text-gray-900");
|
|
4595
|
+
expect(heading.className).not.toMatch(/uppercase|amber|indigo/);
|
|
4596
|
+
}
|
|
4597
|
+
});
|
|
4598
|
+
|
|
4599
|
+
test("asks for the verdict in plain words", async () => {
|
|
4600
|
+
postMock.mockResolvedValue(completedResponse() as never);
|
|
4601
|
+
|
|
4602
|
+
renderPanel();
|
|
4603
|
+
await flush();
|
|
4604
|
+
|
|
4605
|
+
expect(VERDICT_QUESTION).toBe("Was this analysis correct?");
|
|
4606
|
+
expect(
|
|
4607
|
+
screen.getByRole("heading", { level: 3, name: VERDICT_QUESTION }),
|
|
4608
|
+
).toBeVisible();
|
|
4609
|
+
const answers: HTMLElement = screen.getByRole("group", {
|
|
4610
|
+
name: VERDICT_QUESTION,
|
|
4611
|
+
});
|
|
4612
|
+
expect(
|
|
4613
|
+
within(answers)
|
|
4614
|
+
.getAllByRole("button")
|
|
4615
|
+
.map((button: HTMLElement): string => {
|
|
4616
|
+
return button.textContent || "";
|
|
4617
|
+
}),
|
|
4618
|
+
).toEqual(["Confirmed", "Rejected"]);
|
|
4619
|
+
});
|
|
4620
|
+
|
|
4621
|
+
test("describes only a queued or running investigation as live", async () => {
|
|
4622
|
+
postMock.mockResolvedValue(
|
|
4623
|
+
successfulResponse(
|
|
4624
|
+
investigationPayload({ status: AIRunStatus.Running }),
|
|
4625
|
+
) as never,
|
|
4626
|
+
);
|
|
4627
|
+
const view: ReturnType<typeof render> = renderPanel();
|
|
4628
|
+
await flush();
|
|
4629
|
+
|
|
4630
|
+
expect(screen.getByTestId("card-description")).toHaveTextContent(
|
|
4631
|
+
"OneUptime AI's live root-cause investigation for this incident.",
|
|
4632
|
+
);
|
|
4633
|
+
view.unmount();
|
|
4634
|
+
|
|
4635
|
+
postMock.mockReset();
|
|
4636
|
+
postMock.mockResolvedValue(
|
|
4637
|
+
successfulResponse(
|
|
4638
|
+
investigationPayload({
|
|
4639
|
+
status: AIRunStatus.Error,
|
|
4640
|
+
errorMessage: "The provider timed out.",
|
|
4641
|
+
}),
|
|
4642
|
+
) as never,
|
|
4643
|
+
);
|
|
4644
|
+
renderPanel();
|
|
4645
|
+
await flush();
|
|
4646
|
+
|
|
4647
|
+
// A run that stopped is not live any more.
|
|
4648
|
+
expect(screen.getByTestId("card-description")).toHaveTextContent(
|
|
4649
|
+
"OneUptime AI's root-cause investigation for this incident.",
|
|
4650
|
+
);
|
|
4651
|
+
expect(screen.getByTestId("card-description")).not.toHaveTextContent(
|
|
4652
|
+
"live",
|
|
4653
|
+
);
|
|
4654
|
+
});
|
|
4655
|
+
|
|
4656
|
+
test("tells a live run's story without a frame or a progress bar of its own", async () => {
|
|
4657
|
+
postMock.mockResolvedValue(
|
|
4658
|
+
successfulResponse(
|
|
4659
|
+
investigationPayload({
|
|
4660
|
+
status: AIRunStatus.Running,
|
|
4661
|
+
events: [activityEvent],
|
|
4662
|
+
}),
|
|
4663
|
+
) as never,
|
|
4664
|
+
);
|
|
4665
|
+
|
|
4666
|
+
renderPanel();
|
|
4667
|
+
await flush();
|
|
4668
|
+
|
|
4669
|
+
const live: HTMLElement = screen.getByRole("region", {
|
|
4670
|
+
name: "Live investigation",
|
|
4671
|
+
});
|
|
4672
|
+
expect(live.className).toBe("space-y-4");
|
|
4673
|
+
expect(
|
|
4674
|
+
within(live).getByRole("heading", {
|
|
4675
|
+
level: 3,
|
|
4676
|
+
name: "OneUptime AI is investigating",
|
|
4677
|
+
}),
|
|
4678
|
+
).toBeVisible();
|
|
4679
|
+
expect(live).toContainElement(screen.getByTestId("investigation-activity"));
|
|
4680
|
+
// The header's pulsing badge says the run is moving; no hairline bar.
|
|
4681
|
+
expect(
|
|
4682
|
+
screen
|
|
4683
|
+
.getByRole("region", { name: "AI Investigation" })
|
|
4684
|
+
.querySelector(".h-0\\.5"),
|
|
4685
|
+
).toBeNull();
|
|
4686
|
+
});
|
|
4687
|
+
|
|
4688
|
+
test("states a failure as a line with a red mark, not a red box", async () => {
|
|
4689
|
+
postMock.mockResolvedValue(
|
|
4690
|
+
successfulResponse(
|
|
4691
|
+
investigationPayload({
|
|
4692
|
+
status: AIRunStatus.Error,
|
|
4693
|
+
errorMessage: "The model provider timed out.",
|
|
4694
|
+
events: [activityEvent],
|
|
4695
|
+
}),
|
|
4696
|
+
) as never,
|
|
4697
|
+
);
|
|
4698
|
+
|
|
4699
|
+
renderPanel();
|
|
4700
|
+
await flush();
|
|
4701
|
+
|
|
4702
|
+
const failure: HTMLElement = screen.getByTestId("investigation-error");
|
|
4703
|
+
expect(failure).toHaveTextContent(
|
|
4704
|
+
"The investigation stopped before it could report.",
|
|
4705
|
+
);
|
|
4706
|
+
expect(failure).toHaveTextContent("The model provider timed out.");
|
|
4707
|
+
expect(failure.className).toBe("flex items-start gap-3");
|
|
4708
|
+
expect(failure.querySelector("svg")?.getAttribute("class")).toContain(
|
|
4709
|
+
"text-red-600",
|
|
4710
|
+
);
|
|
4711
|
+
for (const paragraph of Array.from(failure.querySelectorAll("p"))) {
|
|
4712
|
+
expect(paragraph.className).not.toMatch(/red/);
|
|
4713
|
+
}
|
|
4714
|
+
});
|
|
4715
|
+
|
|
4716
|
+
test.each([
|
|
4717
|
+
[
|
|
4718
|
+
"Preparing the final report",
|
|
4719
|
+
(): ApiResponse => {
|
|
4720
|
+
return completedResponse({
|
|
4721
|
+
analysisMarkdown: null,
|
|
4722
|
+
isAnalysisPending: true,
|
|
4723
|
+
});
|
|
4724
|
+
},
|
|
4725
|
+
],
|
|
4726
|
+
[
|
|
4727
|
+
"No investigation report was published.",
|
|
4728
|
+
(): ApiResponse => {
|
|
4729
|
+
return completedResponse({
|
|
4730
|
+
analysisMarkdown: null,
|
|
4731
|
+
isAnalysisPending: false,
|
|
4732
|
+
});
|
|
4733
|
+
},
|
|
4734
|
+
],
|
|
4735
|
+
])(
|
|
4736
|
+
'stands "%s" in for the report as a plain line',
|
|
4737
|
+
async (title: string, response: () => ApiResponse) => {
|
|
4738
|
+
postMock.mockResolvedValue(response() as never);
|
|
4739
|
+
|
|
4740
|
+
renderPanel();
|
|
4741
|
+
await flush();
|
|
4742
|
+
|
|
4743
|
+
const line: HTMLElement = screen
|
|
4744
|
+
.getByText(title)
|
|
4745
|
+
.closest("div")!.parentElement!;
|
|
4746
|
+
expect(line.className).toBe("flex items-start gap-3");
|
|
4747
|
+
expect(screen.getByText(title)).toHaveClass(
|
|
4748
|
+
"text-sm",
|
|
4749
|
+
"font-medium",
|
|
4750
|
+
"text-gray-900",
|
|
4751
|
+
);
|
|
4752
|
+
expect(panelsInsideTheCard()).toEqual([]);
|
|
4753
|
+
},
|
|
4754
|
+
);
|
|
4755
|
+
|
|
4756
|
+
test("renders no block inside a paragraph in any state", async () => {
|
|
4757
|
+
const consoleError: ReturnType<typeof jest.spyOn> = jest.spyOn(
|
|
4758
|
+
console,
|
|
4759
|
+
"error",
|
|
4760
|
+
);
|
|
4761
|
+
|
|
4762
|
+
try {
|
|
4763
|
+
for (const [, response] of STATES) {
|
|
4764
|
+
postMock.mockReset();
|
|
4765
|
+
postMock.mockResolvedValue(response() as never);
|
|
4766
|
+
const view: ReturnType<typeof render> = renderPanel();
|
|
4767
|
+
await flush();
|
|
4768
|
+
|
|
4769
|
+
expect(view.container.querySelectorAll("p div")).toHaveLength(0);
|
|
4770
|
+
view.unmount();
|
|
4771
|
+
}
|
|
4772
|
+
|
|
4773
|
+
expect(
|
|
4774
|
+
consoleError.mock.calls.some((args: Array<unknown>): boolean => {
|
|
4775
|
+
return args.some((value: unknown): boolean => {
|
|
4776
|
+
return (
|
|
4777
|
+
typeof value === "string" && value.includes("validateDOMNesting")
|
|
4778
|
+
);
|
|
4779
|
+
});
|
|
4780
|
+
}),
|
|
4781
|
+
).toBe(false);
|
|
4782
|
+
} finally {
|
|
4783
|
+
consoleError.mockRestore();
|
|
4784
|
+
}
|
|
4785
|
+
});
|
|
4786
|
+
});
|
|
4787
|
+
|
|
4788
|
+
/*
|
|
4789
|
+
* The conversation with OneUptime AI is supplied by the page and placed by
|
|
4790
|
+
* the panel: at the bottom of the investigation card while there is a run,
|
|
4791
|
+
* or as its own card under the "not investigated" explanation — the box is
|
|
4792
|
+
* two-way whether or not an automatic investigation ran.
|
|
4793
|
+
*/
|
|
4794
|
+
describe("InvestigationPanel conversation slot", () => {
|
|
4795
|
+
const renderConversationMock: MockFunction = getJestMockFunction();
|
|
4796
|
+
|
|
4797
|
+
function renderWithConversation(): ReturnType<typeof render> {
|
|
4798
|
+
renderConversationMock.mockImplementation(((
|
|
4799
|
+
variant: "embedded" | "card",
|
|
4800
|
+
): React.ReactElement => {
|
|
4801
|
+
return React.createElement(
|
|
4802
|
+
"div",
|
|
4803
|
+
{ "data-testid": `conversation-${variant}` },
|
|
4804
|
+
"Ask OneUptime AI",
|
|
4805
|
+
);
|
|
4806
|
+
}) as never);
|
|
4807
|
+
|
|
4808
|
+
return render(
|
|
4809
|
+
<InvestigationPanel
|
|
4810
|
+
subjectType="incident"
|
|
4811
|
+
subjectId={INCIDENT_ID}
|
|
4812
|
+
renderConversation={(variant: "embedded" | "card") => {
|
|
4813
|
+
return renderConversationMock(variant) as React.ReactElement;
|
|
4814
|
+
}}
|
|
4815
|
+
/>,
|
|
4816
|
+
);
|
|
4817
|
+
}
|
|
4818
|
+
|
|
4819
|
+
afterEach(() => {
|
|
4820
|
+
renderConversationMock.mockReset();
|
|
4821
|
+
});
|
|
4822
|
+
|
|
4823
|
+
test("closes a completed investigation card with the embedded conversation", async () => {
|
|
4824
|
+
postMock.mockResolvedValue(completedResponse() as never);
|
|
4825
|
+
|
|
4826
|
+
renderWithConversation();
|
|
4827
|
+
await flush();
|
|
4828
|
+
|
|
4829
|
+
const embedded: HTMLElement = screen.getByTestId("conversation-embedded");
|
|
4830
|
+
const region: HTMLElement = screen.getByRole("region", {
|
|
4831
|
+
name: "AI Investigation",
|
|
4832
|
+
});
|
|
4833
|
+
|
|
4834
|
+
expect(region).toContainElement(embedded);
|
|
4835
|
+
expect(screen.queryByTestId("conversation-card")).toBeNull();
|
|
4836
|
+
|
|
4837
|
+
// It is the last thing in the card, after the report and its actions.
|
|
4838
|
+
expect(region.lastElementChild).toBe(embedded);
|
|
4839
|
+
});
|
|
4840
|
+
|
|
4841
|
+
test("is embedded while the investigation is still running", async () => {
|
|
4842
|
+
postMock.mockResolvedValue(
|
|
4843
|
+
successfulResponse(
|
|
4844
|
+
investigationPayload({
|
|
4845
|
+
status: AIRunStatus.Running,
|
|
4846
|
+
events: [activityEvent],
|
|
4847
|
+
}),
|
|
4848
|
+
) as never,
|
|
4849
|
+
);
|
|
4850
|
+
|
|
4851
|
+
renderWithConversation();
|
|
4852
|
+
await flush();
|
|
4853
|
+
|
|
4854
|
+
expect(screen.getByTestId("conversation-embedded")).toBeInTheDocument();
|
|
4855
|
+
expect(renderConversationMock).not.toHaveBeenCalledWith("card");
|
|
4856
|
+
});
|
|
4857
|
+
|
|
4858
|
+
test("stands as its own card when no investigation ran", async () => {
|
|
4859
|
+
postMock.mockResolvedValue(noInvestigationResponse() as never);
|
|
4860
|
+
|
|
4861
|
+
renderWithConversation();
|
|
4862
|
+
await flush();
|
|
4863
|
+
|
|
4864
|
+
expect(
|
|
4865
|
+
screen.getByText("No investigation has been recorded"),
|
|
4866
|
+
).toBeVisible();
|
|
4867
|
+
|
|
4868
|
+
const card: HTMLElement = screen.getByTestId("conversation-card");
|
|
4869
|
+
expect(card).toBeInTheDocument();
|
|
4870
|
+
expect(screen.queryByTestId("conversation-embedded")).toBeNull();
|
|
4871
|
+
// Its own card, beside the explanation rather than inside it.
|
|
4872
|
+
expect(
|
|
4873
|
+
screen.getByRole("region", { name: "AI Investigation" }),
|
|
4874
|
+
).not.toContainElement(card);
|
|
4875
|
+
});
|
|
4876
|
+
|
|
4877
|
+
test("waits for the investigation status before showing it", async () => {
|
|
4878
|
+
const deferred: Deferred<ApiResponse> = createDeferred<ApiResponse>();
|
|
4879
|
+
postMock.mockReturnValue(deferred.promise as never);
|
|
4880
|
+
|
|
4881
|
+
renderWithConversation();
|
|
4882
|
+
await flush();
|
|
4883
|
+
|
|
4884
|
+
expect(screen.getByText("Checking investigation status…")).toBeVisible();
|
|
4885
|
+
expect(screen.queryByTestId("conversation-card")).toBeNull();
|
|
4886
|
+
expect(screen.queryByTestId("conversation-embedded")).toBeNull();
|
|
4887
|
+
|
|
4888
|
+
await resolveDeferred(deferred, completedResponse());
|
|
4889
|
+
|
|
4890
|
+
expect(screen.getByTestId("conversation-embedded")).toBeInTheDocument();
|
|
4891
|
+
});
|
|
4892
|
+
|
|
4893
|
+
test("renders nothing extra when the page supplies no conversation", async () => {
|
|
4894
|
+
postMock.mockResolvedValue(noInvestigationResponse() as never);
|
|
4895
|
+
|
|
4896
|
+
renderPanel();
|
|
4897
|
+
await flush();
|
|
4898
|
+
|
|
4899
|
+
expect(screen.queryByTestId("conversation-card")).toBeNull();
|
|
4900
|
+
expect(screen.getAllByTestId("card")).toHaveLength(1);
|
|
4901
|
+
});
|
|
4902
|
+
});
|