@oneuptime/common 13.0.6 → 13.0.7
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/AIAgentOwnerTeam.ts +6 -0
- package/Models/DatabaseModels/AIAgentOwnerUser.ts +6 -0
- package/Models/DatabaseModels/Alert.ts +12 -0
- package/Models/DatabaseModels/AlertEpisodeOwnerTeam.ts +6 -1
- package/Models/DatabaseModels/AlertEpisodeOwnerUser.ts +6 -1
- package/Models/DatabaseModels/AlertOwnerTeam.ts +6 -1
- package/Models/DatabaseModels/AlertOwnerUser.ts +6 -1
- package/Models/DatabaseModels/CephClusterOwnerTeam.ts +6 -0
- package/Models/DatabaseModels/CephClusterOwnerUser.ts +6 -0
- package/Models/DatabaseModels/CloudResourceOwnerTeam.ts +6 -0
- package/Models/DatabaseModels/CloudResourceOwnerUser.ts +6 -0
- package/Models/DatabaseModels/DashboardOwnerTeam.ts +6 -1
- package/Models/DatabaseModels/DashboardOwnerUser.ts +6 -1
- package/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.ts +8 -0
- package/Models/DatabaseModels/DockerHostOwnerTeam.ts +6 -0
- package/Models/DatabaseModels/DockerHostOwnerUser.ts +6 -0
- package/Models/DatabaseModels/DockerSwarmClusterOwnerTeam.ts +6 -0
- package/Models/DatabaseModels/DockerSwarmClusterOwnerUser.ts +6 -0
- package/Models/DatabaseModels/HostOwnerTeam.ts +6 -0
- package/Models/DatabaseModels/HostOwnerUser.ts +6 -0
- package/Models/DatabaseModels/Incident.ts +12 -0
- package/Models/DatabaseModels/IncidentEpisodeOwnerTeam.ts +6 -1
- package/Models/DatabaseModels/IncidentEpisodeOwnerUser.ts +6 -1
- package/Models/DatabaseModels/IncidentOwnerTeam.ts +6 -1
- package/Models/DatabaseModels/IncidentOwnerUser.ts +6 -1
- package/Models/DatabaseModels/IncidentTemplateOwnerTeam.ts +6 -0
- package/Models/DatabaseModels/IncidentTemplateOwnerUser.ts +6 -0
- package/Models/DatabaseModels/IncomingCallPolicyOwnerTeam.ts +6 -1
- package/Models/DatabaseModels/IncomingCallPolicyOwnerUser.ts +6 -1
- package/Models/DatabaseModels/IoTFleetOwnerTeam.ts +6 -0
- package/Models/DatabaseModels/IoTFleetOwnerUser.ts +6 -0
- package/Models/DatabaseModels/KubernetesClusterOwnerTeam.ts +6 -0
- package/Models/DatabaseModels/KubernetesClusterOwnerUser.ts +6 -0
- package/Models/DatabaseModels/Monitor.ts +2 -3
- package/Models/DatabaseModels/MonitorGroupOwnerTeam.ts +6 -0
- package/Models/DatabaseModels/MonitorGroupOwnerUser.ts +6 -0
- package/Models/DatabaseModels/MonitorOwnerTeam.ts +6 -1
- package/Models/DatabaseModels/MonitorOwnerUser.ts +6 -1
- package/Models/DatabaseModels/MonitorTemplate.ts +2 -3
- package/Models/DatabaseModels/NetworkDeviceOwnerTeam.ts +6 -0
- package/Models/DatabaseModels/NetworkDeviceOwnerUser.ts +6 -0
- package/Models/DatabaseModels/OnCallDutyPolicyOwnerTeam.ts +6 -1
- package/Models/DatabaseModels/OnCallDutyPolicyOwnerUser.ts +6 -1
- package/Models/DatabaseModels/OnCallDutyPolicyScheduleOwnerTeam.ts +6 -1
- package/Models/DatabaseModels/OnCallDutyPolicyScheduleOwnerUser.ts +6 -1
- package/Models/DatabaseModels/PodmanHostOwnerTeam.ts +6 -0
- package/Models/DatabaseModels/PodmanHostOwnerUser.ts +6 -0
- package/Models/DatabaseModels/ProbeOwnerTeam.ts +6 -0
- package/Models/DatabaseModels/ProbeOwnerUser.ts +6 -0
- package/Models/DatabaseModels/ProxmoxClusterOwnerTeam.ts +6 -0
- package/Models/DatabaseModels/ProxmoxClusterOwnerUser.ts +6 -0
- package/Models/DatabaseModels/RumApplicationOwnerTeam.ts +6 -0
- package/Models/DatabaseModels/RumApplicationOwnerUser.ts +6 -0
- package/Models/DatabaseModels/RunbookOwnerTeam.ts +6 -1
- package/Models/DatabaseModels/RunbookOwnerUser.ts +6 -1
- package/Models/DatabaseModels/RunnerOwnerTeam.ts +6 -1
- package/Models/DatabaseModels/RunnerOwnerUser.ts +6 -1
- package/Models/DatabaseModels/ScheduledMaintenanceOwnerTeam.ts +6 -1
- package/Models/DatabaseModels/ScheduledMaintenanceOwnerUser.ts +6 -1
- package/Models/DatabaseModels/ScheduledMaintenanceTemplateOwnerTeam.ts +8 -0
- package/Models/DatabaseModels/ScheduledMaintenanceTemplateOwnerUser.ts +8 -0
- package/Models/DatabaseModels/ServerlessFunctionOwnerTeam.ts +6 -0
- package/Models/DatabaseModels/ServerlessFunctionOwnerUser.ts +6 -0
- package/Models/DatabaseModels/ServiceLevelObjectiveOwnerTeam.ts +6 -1
- package/Models/DatabaseModels/ServiceLevelObjectiveOwnerUser.ts +6 -1
- package/Models/DatabaseModels/ServiceOwnerTeam.ts +6 -0
- package/Models/DatabaseModels/ServiceOwnerUser.ts +6 -0
- package/Models/DatabaseModels/StatusPageOwnerTeam.ts +6 -1
- package/Models/DatabaseModels/StatusPageOwnerUser.ts +6 -1
- package/Models/DatabaseModels/VMwareVCenterOwnerTeam.ts +6 -0
- package/Models/DatabaseModels/VMwareVCenterOwnerUser.ts +6 -0
- package/Models/DatabaseModels/WorkflowOwnerTeam.ts +6 -1
- package/Models/DatabaseModels/WorkflowOwnerUser.ts +6 -1
- package/Scripts/benchmark-fanin-capacity.js +2 -2
- package/Server/API/AIAgentDataAPI.ts +1 -1
- package/Server/API/AIChatAPI.ts +6 -4
- package/Server/API/AIInvestigationAPI.ts +7 -0
- package/Server/API/StatusPageAPI.ts +13 -0
- package/Server/Infrastructure/Postgres/LocalMigrationGenerationDataSource.ts +1 -1
- package/Server/Infrastructure/Postgres/SchemaMigrations/1793500000000-MakeOwnerRowsUnique.ts +1057 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1793700000000-AddAIInvestigationDecision.ts +25 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1793800000000-RemoveMonitorDescriptionLengthLimit.ts +31 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +6 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Readme.md +6 -4
- package/Server/Middleware/IdentityRateLimit.ts +34 -1
- package/Server/Middleware/PublicDashboardRateLimit.ts +169 -39
- package/Server/Services/AlertEpisodeService.ts +13 -34
- package/Server/Services/AlertGroupingEngineService.ts +7 -4
- package/Server/Services/AlertService.ts +13 -32
- package/Server/Services/CephClusterOwnerRuleEngineService.ts +18 -10
- package/Server/Services/CloudResourceOwnerRuleEngineService.ts +18 -10
- package/Server/Services/DashboardOwnerRuleEngineService.ts +18 -10
- package/Server/Services/DatabaseService.ts +101 -1
- package/Server/Services/DockerHostOwnerRuleEngineService.ts +18 -10
- package/Server/Services/DockerSwarmClusterOwnerRuleEngineService.ts +18 -10
- package/Server/Services/HostOwnerRuleEngineService.ts +18 -10
- package/Server/Services/IncidentEpisodeOwnerRuleEngineService.ts +6 -4
- package/Server/Services/IncidentEpisodeService.ts +15 -75
- package/Server/Services/IncidentGroupingEngineService.ts +7 -4
- package/Server/Services/IncidentService.ts +13 -32
- package/Server/Services/IncidentTemplateService.ts +13 -36
- package/Server/Services/IncomingCallPolicyOwnerRuleEngineService.ts +18 -10
- package/Server/Services/IoTFleetOwnerRuleEngineService.ts +18 -10
- package/Server/Services/KubernetesClusterOwnerRuleEngineService.ts +18 -10
- package/Server/Services/MonitorService.ts +13 -32
- package/Server/Services/NetworkDeviceOwnerRuleEngineService.ts +18 -10
- package/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.ts +18 -10
- package/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.ts +18 -10
- package/Server/Services/PodmanHostOwnerRuleEngineService.ts +18 -10
- package/Server/Services/ProxmoxClusterOwnerRuleEngineService.ts +18 -10
- package/Server/Services/RumApplicationOwnerRuleEngineService.ts +18 -10
- package/Server/Services/RunbookOwnerRuleEngineService.ts +18 -10
- package/Server/Services/ScheduledMaintenanceService.ts +13 -34
- package/Server/Services/ScheduledMaintenanceTemplateService.ts +12 -34
- package/Server/Services/ServerlessFunctionOwnerRuleEngineService.ts +18 -10
- package/Server/Services/ServiceOwnerRuleEngineService.ts +18 -10
- package/Server/Services/StatusPagePrivateUserService.ts +38 -29
- package/Server/Services/StatusPagePrivateUserSessionService.ts +49 -1
- package/Server/Services/StatusPageService.ts +59 -36
- package/Server/Services/UserSessionService.ts +6 -0
- package/Server/Services/VMwareVCenterOwnerRuleEngineService.ts +18 -10
- package/Server/Services/WorkflowOwnerRuleEngineService.ts +18 -10
- package/Server/Static/Brand/README.md +7 -7
- package/Server/Static/Vendor/README.md +7 -7
- package/Server/Types/Database/Permissions/OwnedScopePermission.ts +18 -9
- package/Server/Types/Database/Permissions/OwnerTableRegistry.ts +82 -0
- package/Server/Utils/AI/Chat/ChatAgentRunner.ts +21 -8
- package/Server/Utils/AI/Chat/ObservabilityChatPrompt.ts +41 -4
- package/Server/Utils/AI/CodeFix/CodeAgentWorkspaceGuard.ts +1 -1
- package/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.ts +1 -1
- package/Server/Utils/AI/SRE/AIInvestigationEngine.ts +13 -5
- package/Server/Utils/AI/SRE/AlertInvestigationRunner.ts +53 -13
- package/Server/Utils/AI/SRE/IncidentInvestigationRunner.ts +51 -14
- package/Server/Utils/AI/SRE/InvestigationEligibility.ts +292 -0
- package/Server/Utils/AI/SRE/InvestigationQueue.ts +25 -0
- package/Server/Utils/AI/Toolbox/Index.ts +43 -13
- package/Server/Utils/AI/Toolbox/ResourceTools.ts +952 -0
- package/Server/Utils/AI/Toolbox/RumTools.ts +424 -0
- package/Server/Utils/AI/Toolbox/ToolTypes.ts +10 -0
- package/Server/Utils/AI/Toolbox/TraceTools.ts +2 -1
- package/Server/Utils/Database/PostgresErrorTranslator.ts +14 -0
- package/Server/Utils/Monitor/Criteria/CompareCriteria.ts +137 -126
- package/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.ts +4 -1
- package/Server/Utils/Rules/OwnerRuleAssignment.ts +157 -6
- package/Server/Utils/Telemetry/TelemetryEntity.ts +205 -6
- package/SslCertificates/GlobalSign.crt +26 -0
- package/SslCertificates/Readme.md +3 -0
- package/Tests/App/AdminDashboard/EnterpriseLicenseInstanceActivity.test.tsx +451 -0
- package/Tests/App/Dashboard/AIInsightsChatPanel.test.tsx +881 -0
- package/Tests/App/Dashboard/AIInsightsPageContext.test.ts +458 -0
- package/Tests/App/Dashboard/AIInsightsResourceCitations.test.ts +124 -0
- package/Tests/App/Dashboard/AIInsightsResourcePageContext.test.ts +798 -0
- package/Tests/App/Dashboard/AskAiSuggestedPrompts.test.ts +7 -0
- package/Tests/App/Dashboard/DashboardChartWidgetZoom.test.tsx +104 -0
- package/Tests/App/Dashboard/DashboardCommandPalette.test.tsx +156 -64
- package/Tests/App/Dashboard/DiscoveryScanStatusMessage.test.tsx +970 -0
- package/Tests/App/Dashboard/DiscoveryScanWizardValidation.test.tsx +406 -12
- package/Tests/App/Dashboard/EmbeddedMetricEventScope.test.tsx +358 -0
- package/Tests/App/Dashboard/ErrorPatternEventScope.test.tsx +148 -0
- package/Tests/App/Dashboard/EventOverlayAdditionalResourceScope.test.ts +255 -0
- package/Tests/App/Dashboard/EventOverlayScope.test.ts +845 -0
- package/Tests/App/Dashboard/EventOverlayScopeHook.test.tsx +903 -0
- package/Tests/App/Dashboard/ExternalStatusPageCriteriaFilter.test.ts +3 -3
- package/Tests/App/Dashboard/InvestigationDrawer.test.tsx +21 -0
- package/Tests/App/Dashboard/InvestigationNotStarted.test.tsx +761 -0
- package/Tests/App/Dashboard/InvestigationPanel.test.tsx +7 -4
- package/Tests/App/Dashboard/InvestigationPanelStatus.test.tsx +15 -7
- package/Tests/App/Dashboard/MetricsViewerEventScopeNavigation.test.tsx +264 -0
- package/Tests/App/Dashboard/MonitorSummaryTestMonitorButton.test.tsx +342 -0
- package/Tests/App/Dashboard/MonitorTestForm.test.tsx +612 -0
- package/Tests/App/Dashboard/NavigationSearchKeywords.test.tsx +301 -0
- package/Tests/App/Dashboard/ServiceMapGraph.test.tsx +74 -2
- package/Tests/App/Dashboard/TextClampLayoutHarness.ts +224 -0
- package/Tests/Models/InventoryItemNaming.test.ts +54 -0
- package/Tests/Server/API/AIChatRouteAuthorization.test.ts +161 -0
- package/Tests/Server/API/AIInvestigationAPI.test.ts +14 -0
- package/Tests/Server/API/AIInvestigationAvailabilityAuthorization.test.ts +260 -0
- package/Tests/Server/API/EnterpriseLicenseReportUserCount.test.ts +133 -0
- package/Tests/Server/API/StatusPageMasterPasswordRateLimit.test.ts +482 -0
- package/Tests/Server/EnvironmentConfigOnCallCalendarFeed.test.ts +1 -1
- package/Tests/Server/Infrastructure/ClickhouseKeepAliveOptions.test.ts +1 -1
- package/Tests/Server/Infrastructure/ContainerBootConfiguration.test.ts +38 -16
- package/Tests/Server/Infrastructure/E2EClickHouseFixtureAccess.test.ts +106 -31
- package/Tests/Server/Infrastructure/ExampleDockerfiles.test.ts +46 -12
- package/Tests/Server/Infrastructure/Postgres/MonitorDescriptionMigration.test.ts +422 -0
- package/Tests/Server/Infrastructure/TelemetryExporterDeploymentConfig.test.ts +1 -1
- package/Tests/Server/Infrastructure/ValkeyDeploymentConfig.test.ts +25 -4
- package/Tests/Server/Middleware/IdentityRateLimit.test.ts +72 -0
- package/Tests/Server/Middleware/PublicDashboardRateLimit.test.ts +12 -12
- package/Tests/Server/Middleware/PublicDashboardRateLimitStatusPage.test.ts +800 -0
- package/Tests/Server/Services/AIInvestigationDecisionPostgres.test.ts +346 -0
- package/Tests/Server/Services/AddOwnersIdempotency.test.ts +471 -0
- package/Tests/Server/Services/DatabaseServiceAutoOwnerOnCreate.test.ts +250 -0
- package/Tests/Server/Services/DatabaseServiceUniqueColumnsTogether.test.ts +622 -0
- package/Tests/Server/Services/MonitorDescriptionValidation.test.ts +211 -0
- package/Tests/Server/Services/MonitorTemplateDescriptionPropagation.test.ts +269 -0
- package/Tests/Server/Services/OwnerRowUniqueness.test.ts +504 -0
- package/Tests/Server/Services/RuleRun/OwnerRuleEnginesGroupARun.test.ts +43 -0
- package/Tests/Server/Services/SessionRetention.test.ts +334 -0
- package/Tests/Server/Services/StatusPagePrivateUserInvitationPolicy.test.ts +172 -0
- package/Tests/Server/Services/StatusPagePrivateUserReadAccess.test.ts +178 -0
- package/Tests/Server/Services/StatusPagePrivateUserReadAccessPostgres.test.ts +311 -0
- package/Tests/Server/Services/StatusPagePrivateUserSessionService.test.ts +216 -1
- package/Tests/Server/Services/TeamComplianceServiceBehaviour.test.ts +1 -1
- package/Tests/Server/Services/UserOnCallLogNoNotificationRules.test.ts +1 -1
- package/Tests/Server/Types/Database/EventOverlayScopePostgres.test.ts +626 -0
- package/Tests/Server/Types/Database/Permissions/InfrastructureOwnershipScope.test.ts +668 -0
- package/Tests/Server/Types/Database/Permissions/SelectRejectionMessageContract.test.ts +1 -0
- package/Tests/Server/Types/Database/Permissions/UserNotificationRuleScoping.test.ts +1 -1
- package/Tests/Server/Utils/AI/AIIncidentGating.test.ts +16 -9
- package/Tests/Server/Utils/AI/ChatAgentRunner.test.ts +137 -1
- package/Tests/Server/Utils/AI/InvestigationEligibility.test.ts +697 -0
- package/Tests/Server/Utils/AI/ObservabilityChatPrompt.test.ts +105 -0
- package/Tests/Server/Utils/AI/RemediationHandoff.test.ts +16 -5
- package/Tests/Server/Utils/AI/ResourceTools.test.ts +1304 -0
- package/Tests/Server/Utils/AI/RumTools.test.ts +769 -0
- package/Tests/Server/Utils/Database/PostgresErrorTranslator.test.ts +63 -0
- package/Tests/Server/Utils/Monitor/Criteria/APIRequestCriteriaEvaluateOverTime.test.ts +11 -9
- package/Tests/Server/Utils/Monitor/Criteria/CompareCriteria.test.ts +62 -45
- package/Tests/Server/Utils/Monitor/Criteria/CompareCriteriaAggregation.test.ts +25 -24
- package/Tests/Server/Utils/Monitor/Criteria/CompareCriteriaHumanMessages.test.ts +513 -0
- package/Tests/Server/Utils/Monitor/Criteria/CustomCodeMonitorCriteria.test.ts +2 -2
- package/Tests/Server/Utils/Monitor/Criteria/DnsMonitorCriteria.test.ts +1 -1
- package/Tests/Server/Utils/Monitor/Criteria/ExternalStatusPageMonitorCriteria.test.ts +9 -9
- package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.test.ts +7 -5
- package/Tests/Server/Utils/Monitor/Criteria/ProfileMonitorCriteria.test.ts +2 -2
- package/Tests/Server/Utils/Monitor/Criteria/ServerMonitorCriteria.test.ts +4 -3
- package/Tests/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.test.ts +2 -2
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorMetricUnits.test.ts +3 -2
- package/Tests/Server/Utils/Monitor/MonitorCriteriaHumanMessages.test.ts +529 -0
- package/Tests/Server/Utils/Rules/OwnerRuleAssignment.test.ts +412 -4
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsPollingClickhouseIntegration.test.ts +1 -1
- package/Tests/Server/Utils/TailwindBuildCopy.test.ts +14 -2
- package/Tests/Server/Utils/Telemetry/HostAssetAttributesFromOtlp.test.ts +235 -0
- package/Tests/Server/Utils/Telemetry/TelemetryEntity.test.ts +385 -2
- package/Tests/Server/Utils/VendorAssets.test.ts +17 -3
- package/Tests/Types/AI/AIChatPageContext.test.ts +0 -0
- package/Tests/Types/AI/AIResourceContext.test.ts +312 -0
- package/Tests/Types/Database/UniqueColumnsTogether.test.ts +100 -0
- package/Tests/Types/Monitor/MetricAndProfileDefaultCriteria.test.ts +4 -4
- package/Tests/Types/Monitor/MonitorStepRetryPersistence.test.ts +125 -0
- package/Tests/Types/WebsiteRequest.test.ts +44 -0
- package/Tests/UI/Components/Forms/MonitorDescriptionForm.test.tsx +410 -0
- package/Tests/UI/Components/ModelTable/BaseModelTableReadPermissions.test.tsx +439 -0
- package/Tests/UI/Components/NavBarMenuSearch.test.tsx +372 -0
- package/Tests/UI/EsbuildConfig.test.ts +1 -1
- package/Tests/UI/Monitor/MonitorStepRetrySettings.test.tsx +616 -0
- package/Tests/UI/ReactRouterSingletonBuild.test.ts +4 -2
- package/Tests/UI/Rum/ReplayEngine.test.ts +179 -0
- package/Tests/UI/Rum/ReplayHeader.test.tsx +23 -0
- package/Tests/UI/Rum/ReplayScrubber.test.tsx +88 -0
- package/Tests/UI/Rum/ReplayStageOverlays.test.tsx +83 -0
- package/Tests/UI/Rum/ReplayTabSwitcher.test.tsx +33 -0
- package/Tests/Utils/API.test.ts +96 -0
- package/Tests/Utils/HTTPResponseBodyReader.test.ts +188 -1
- package/Tests/Utils/Metrics/MetricEventScopeUrl.test.ts +101 -0
- package/Tests/Utils/Monitor/MonitorTestAvailabilityUtil.test.ts +256 -0
- package/Tests/Utils/Telemetry/HostIpAddresses.test.ts +105 -0
- package/Types/AI/AIChatPageContext.ts +87 -2
- package/Types/AI/AIChatTypes.ts +4 -0
- package/Types/AI/AIResourceContext.ts +198 -0
- package/Types/AI/InvestigationNotStartedReason.ts +30 -0
- package/Types/Database/UniqueColumnsTogether.ts +55 -0
- package/Types/Metrics/MetricQueryConfigData.ts +8 -0
- package/Types/Rum/WebVitals.ts +71 -0
- package/Types/WebsiteRequest.ts +2 -0
- package/UI/Components/EditionLabel/EditionLabel.tsx +7 -5
- package/UI/Components/KeyboardShortcut/Screenshots/README.md +1 -1
- package/UI/Components/ModelTable/BaseModelTable.tsx +8 -0
- package/UI/Components/Navbar/NavBar.tsx +2 -0
- package/UI/Components/Navbar/NavBarMenuModal.tsx +6 -2
- package/UI/esbuild-config.js +4 -4
- package/Utils/API.ts +10 -1
- package/Utils/Dashboard/HtmlWidgetDocument.ts +1 -1
- package/Utils/HTTPResponseBodyReader.ts +64 -8
- package/Utils/Metrics/MetricExplorerUrl.ts +19 -0
- package/Utils/Monitor/MonitorTestAvailabilityUtil.ts +92 -0
- package/Utils/Telemetry/HostIpAddresses.ts +46 -2
- package/build/dist/Models/DatabaseModels/AIAgentOwnerTeam.js +4 -1
- package/build/dist/Models/DatabaseModels/AIAgentOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AIAgentOwnerUser.js +4 -1
- package/build/dist/Models/DatabaseModels/AIAgentOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Alert.js +12 -0
- package/build/dist/Models/DatabaseModels/Alert.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertEpisodeOwnerTeam.js +3 -1
- package/build/dist/Models/DatabaseModels/AlertEpisodeOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertEpisodeOwnerUser.js +3 -1
- package/build/dist/Models/DatabaseModels/AlertEpisodeOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertOwnerTeam.js +3 -1
- package/build/dist/Models/DatabaseModels/AlertOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertOwnerUser.js +3 -1
- package/build/dist/Models/DatabaseModels/AlertOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/CephClusterOwnerTeam.js +4 -1
- package/build/dist/Models/DatabaseModels/CephClusterOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/CephClusterOwnerUser.js +4 -1
- package/build/dist/Models/DatabaseModels/CephClusterOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/CloudResourceOwnerTeam.js +4 -1
- package/build/dist/Models/DatabaseModels/CloudResourceOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/CloudResourceOwnerUser.js +4 -1
- package/build/dist/Models/DatabaseModels/CloudResourceOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DashboardOwnerTeam.js +3 -1
- package/build/dist/Models/DatabaseModels/DashboardOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DashboardOwnerUser.js +3 -1
- package/build/dist/Models/DatabaseModels/DashboardOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.js +3 -0
- package/build/dist/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DockerHostOwnerTeam.js +4 -1
- package/build/dist/Models/DatabaseModels/DockerHostOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DockerHostOwnerUser.js +4 -1
- package/build/dist/Models/DatabaseModels/DockerHostOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DockerSwarmClusterOwnerTeam.js +4 -1
- package/build/dist/Models/DatabaseModels/DockerSwarmClusterOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DockerSwarmClusterOwnerUser.js +4 -1
- package/build/dist/Models/DatabaseModels/DockerSwarmClusterOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/HostOwnerTeam.js +4 -1
- package/build/dist/Models/DatabaseModels/HostOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/HostOwnerUser.js +4 -1
- package/build/dist/Models/DatabaseModels/HostOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Incident.js +12 -0
- package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisodeOwnerTeam.js +3 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisodeOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisodeOwnerUser.js +3 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisodeOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentOwnerTeam.js +3 -1
- package/build/dist/Models/DatabaseModels/IncidentOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentOwnerUser.js +3 -1
- package/build/dist/Models/DatabaseModels/IncidentOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentTemplateOwnerTeam.js +4 -1
- package/build/dist/Models/DatabaseModels/IncidentTemplateOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentTemplateOwnerUser.js +4 -1
- package/build/dist/Models/DatabaseModels/IncidentTemplateOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncomingCallPolicyOwnerTeam.js +3 -1
- package/build/dist/Models/DatabaseModels/IncomingCallPolicyOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncomingCallPolicyOwnerUser.js +3 -1
- package/build/dist/Models/DatabaseModels/IncomingCallPolicyOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IoTFleetOwnerTeam.js +4 -1
- package/build/dist/Models/DatabaseModels/IoTFleetOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IoTFleetOwnerUser.js +4 -1
- package/build/dist/Models/DatabaseModels/IoTFleetOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/KubernetesClusterOwnerTeam.js +4 -1
- package/build/dist/Models/DatabaseModels/KubernetesClusterOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/KubernetesClusterOwnerUser.js +4 -1
- package/build/dist/Models/DatabaseModels/KubernetesClusterOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Monitor.js +2 -3
- package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
- package/build/dist/Models/DatabaseModels/MonitorGroupOwnerTeam.js +4 -1
- package/build/dist/Models/DatabaseModels/MonitorGroupOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/MonitorGroupOwnerUser.js +4 -1
- package/build/dist/Models/DatabaseModels/MonitorGroupOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/MonitorOwnerTeam.js +3 -1
- package/build/dist/Models/DatabaseModels/MonitorOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/MonitorOwnerUser.js +3 -1
- package/build/dist/Models/DatabaseModels/MonitorOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/MonitorTemplate.js +2 -3
- package/build/dist/Models/DatabaseModels/MonitorTemplate.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceOwnerTeam.js +4 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceOwnerUser.js +4 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyOwnerTeam.js +3 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyOwnerUser.js +3 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleOwnerTeam.js +3 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleOwnerUser.js +3 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/PodmanHostOwnerTeam.js +4 -1
- package/build/dist/Models/DatabaseModels/PodmanHostOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/PodmanHostOwnerUser.js +4 -1
- package/build/dist/Models/DatabaseModels/PodmanHostOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ProbeOwnerTeam.js +4 -1
- package/build/dist/Models/DatabaseModels/ProbeOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ProbeOwnerUser.js +4 -1
- package/build/dist/Models/DatabaseModels/ProbeOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ProxmoxClusterOwnerTeam.js +4 -1
- package/build/dist/Models/DatabaseModels/ProxmoxClusterOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ProxmoxClusterOwnerUser.js +4 -1
- package/build/dist/Models/DatabaseModels/ProxmoxClusterOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/RumApplicationOwnerTeam.js +4 -1
- package/build/dist/Models/DatabaseModels/RumApplicationOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/RumApplicationOwnerUser.js +4 -1
- package/build/dist/Models/DatabaseModels/RumApplicationOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/RunbookOwnerTeam.js +3 -1
- package/build/dist/Models/DatabaseModels/RunbookOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/RunbookOwnerUser.js +3 -1
- package/build/dist/Models/DatabaseModels/RunbookOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/RunnerOwnerTeam.js +3 -1
- package/build/dist/Models/DatabaseModels/RunnerOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/RunnerOwnerUser.js +3 -1
- package/build/dist/Models/DatabaseModels/RunnerOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceOwnerTeam.js +3 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceOwnerUser.js +3 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplateOwnerTeam.js +6 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplateOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplateOwnerUser.js +6 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplateOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServerlessFunctionOwnerTeam.js +4 -1
- package/build/dist/Models/DatabaseModels/ServerlessFunctionOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServerlessFunctionOwnerUser.js +4 -1
- package/build/dist/Models/DatabaseModels/ServerlessFunctionOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerTeam.js +3 -1
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerUser.js +3 -1
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServiceOwnerTeam.js +4 -1
- package/build/dist/Models/DatabaseModels/ServiceOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServiceOwnerUser.js +4 -1
- package/build/dist/Models/DatabaseModels/ServiceOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageOwnerTeam.js +3 -1
- package/build/dist/Models/DatabaseModels/StatusPageOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageOwnerUser.js +3 -1
- package/build/dist/Models/DatabaseModels/StatusPageOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerTeam.js +4 -1
- package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerUser.js +4 -1
- package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/WorkflowOwnerTeam.js +3 -1
- package/build/dist/Models/DatabaseModels/WorkflowOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/WorkflowOwnerUser.js +3 -1
- package/build/dist/Models/DatabaseModels/WorkflowOwnerUser.js.map +1 -1
- package/build/dist/Server/API/AIAgentDataAPI.js +1 -1
- package/build/dist/Server/API/AIChatAPI.js +3 -1
- package/build/dist/Server/API/AIChatAPI.js.map +1 -1
- package/build/dist/Server/API/AIInvestigationAPI.js +3 -0
- package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
- package/build/dist/Server/API/StatusPageAPI.js +9 -1
- package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/LocalMigrationGenerationDataSource.js +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793500000000-MakeOwnerRowsUnique.js +602 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793500000000-MakeOwnerRowsUnique.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793700000000-AddAIInvestigationDecision.js +14 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793700000000-AddAIInvestigationDecision.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793800000000-RemoveMonitorDescriptionLengthLimit.js +20 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793800000000-RemoveMonitorDescriptionLengthLimit.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +6 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Middleware/IdentityRateLimit.js +22 -1
- package/build/dist/Server/Middleware/IdentityRateLimit.js.map +1 -1
- package/build/dist/Server/Middleware/PublicDashboardRateLimit.js +117 -36
- package/build/dist/Server/Middleware/PublicDashboardRateLimit.js.map +1 -1
- package/build/dist/Server/Services/AlertEpisodeService.js +13 -31
- package/build/dist/Server/Services/AlertEpisodeService.js.map +1 -1
- package/build/dist/Server/Services/AlertGroupingEngineService.js +7 -4
- package/build/dist/Server/Services/AlertGroupingEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertService.js +13 -31
- package/build/dist/Server/Services/AlertService.js.map +1 -1
- package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js +12 -8
- package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js +12 -8
- package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DashboardOwnerRuleEngineService.js +12 -8
- package/build/dist/Server/Services/DashboardOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +71 -1
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js +12 -8
- package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js +12 -8
- package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/HostOwnerRuleEngineService.js +12 -8
- package/build/dist/Server/Services/HostOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeOwnerRuleEngineService.js +6 -4
- package/build/dist/Server/Services/IncidentEpisodeOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeService.js +15 -68
- package/build/dist/Server/Services/IncidentEpisodeService.js.map +1 -1
- package/build/dist/Server/Services/IncidentGroupingEngineService.js +7 -4
- package/build/dist/Server/Services/IncidentGroupingEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentService.js +13 -31
- package/build/dist/Server/Services/IncidentService.js.map +1 -1
- package/build/dist/Server/Services/IncidentTemplateService.js +13 -31
- package/build/dist/Server/Services/IncidentTemplateService.js.map +1 -1
- package/build/dist/Server/Services/IncomingCallPolicyOwnerRuleEngineService.js +12 -8
- package/build/dist/Server/Services/IncomingCallPolicyOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IoTFleetOwnerRuleEngineService.js +12 -8
- package/build/dist/Server/Services/IoTFleetOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js +12 -8
- package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/MonitorService.js +13 -31
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js +12 -8
- package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.js +12 -8
- package/build/dist/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.js +12 -8
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js +12 -8
- package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js +12 -8
- package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js +12 -8
- package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RunbookOwnerRuleEngineService.js +12 -8
- package/build/dist/Server/Services/RunbookOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceService.js +13 -31
- package/build/dist/Server/Services/ScheduledMaintenanceService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceTemplateService.js +12 -29
- package/build/dist/Server/Services/ScheduledMaintenanceTemplateService.js.map +1 -1
- package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js +12 -8
- package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js +12 -8
- package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/StatusPagePrivateUserService.js +33 -25
- package/build/dist/Server/Services/StatusPagePrivateUserService.js.map +1 -1
- package/build/dist/Server/Services/StatusPagePrivateUserSessionService.js +36 -1
- package/build/dist/Server/Services/StatusPagePrivateUserSessionService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageService.js +50 -35
- package/build/dist/Server/Services/StatusPageService.js.map +1 -1
- package/build/dist/Server/Services/UserSessionService.js +5 -0
- package/build/dist/Server/Services/UserSessionService.js.map +1 -1
- package/build/dist/Server/Services/VMwareVCenterOwnerRuleEngineService.js +12 -8
- package/build/dist/Server/Services/VMwareVCenterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/WorkflowOwnerRuleEngineService.js +12 -8
- package/build/dist/Server/Services/WorkflowOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/OwnedScopePermission.js +15 -10
- package/build/dist/Server/Types/Database/Permissions/OwnedScopePermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js +82 -0
- package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js.map +1 -1
- package/build/dist/Server/Utils/AI/Chat/ChatAgentRunner.js +12 -3
- package/build/dist/Server/Utils/AI/Chat/ChatAgentRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js +32 -4
- package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js.map +1 -1
- package/build/dist/Server/Utils/AI/CodeFix/CodeAgentWorkspaceGuard.js +1 -1
- package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.js +1 -1
- package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js +8 -5
- package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js +33 -13
- package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js +31 -10
- package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/InvestigationEligibility.js +205 -0
- package/build/dist/Server/Utils/AI/SRE/InvestigationEligibility.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/InvestigationQueue.js +13 -0
- package/build/dist/Server/Utils/AI/SRE/InvestigationQueue.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/Index.js +30 -6
- package/build/dist/Server/Utils/AI/Toolbox/Index.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/ResourceTools.js +721 -0
- package/build/dist/Server/Utils/AI/Toolbox/ResourceTools.js.map +1 -0
- package/build/dist/Server/Utils/AI/Toolbox/RumTools.js +330 -0
- package/build/dist/Server/Utils/AI/Toolbox/RumTools.js.map +1 -0
- package/build/dist/Server/Utils/AI/Toolbox/ToolTypes.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/TraceTools.js +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/TraceTools.js.map +1 -1
- package/build/dist/Server/Utils/Database/PostgresErrorTranslator.js +11 -0
- package/build/dist/Server/Utils/Database/PostgresErrorTranslator.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js +106 -101
- package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js +4 -2
- package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Rules/OwnerRuleAssignment.js +94 -0
- package/build/dist/Server/Utils/Rules/OwnerRuleAssignment.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js +171 -6
- package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js.map +1 -1
- package/build/dist/Types/AI/AIChatPageContext.js +68 -2
- package/build/dist/Types/AI/AIChatPageContext.js.map +1 -1
- package/build/dist/Types/AI/AIChatTypes.js +4 -0
- package/build/dist/Types/AI/AIChatTypes.js.map +1 -1
- package/build/dist/Types/AI/AIResourceContext.js +162 -0
- package/build/dist/Types/AI/AIResourceContext.js.map +1 -0
- package/build/dist/Types/AI/InvestigationNotStartedReason.js +2 -0
- package/build/dist/Types/AI/InvestigationNotStartedReason.js.map +1 -0
- package/build/dist/Types/Database/UniqueColumnsTogether.js +19 -0
- package/build/dist/Types/Database/UniqueColumnsTogether.js.map +1 -0
- package/build/dist/Types/Metrics/MetricQueryConfigData.js.map +1 -1
- package/build/dist/Types/Rum/WebVitals.js +64 -0
- package/build/dist/Types/Rum/WebVitals.js.map +1 -0
- package/build/dist/Types/WebsiteRequest.js +2 -0
- package/build/dist/Types/WebsiteRequest.js.map +1 -1
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js +7 -5
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +7 -0
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
- package/build/dist/UI/Components/Navbar/NavBarMenuModal.js +4 -2
- package/build/dist/UI/Components/Navbar/NavBarMenuModal.js.map +1 -1
- package/build/dist/Utils/API.js +8 -4
- package/build/dist/Utils/API.js.map +1 -1
- package/build/dist/Utils/HTTPResponseBodyReader.js +50 -6
- package/build/dist/Utils/HTTPResponseBodyReader.js.map +1 -1
- package/build/dist/Utils/Metrics/MetricExplorerUrl.js +14 -3
- package/build/dist/Utils/Metrics/MetricExplorerUrl.js.map +1 -1
- package/build/dist/Utils/Monitor/MonitorTestAvailabilityUtil.js +68 -0
- package/build/dist/Utils/Monitor/MonitorTestAvailabilityUtil.js.map +1 -0
- package/build/dist/Utils/Telemetry/HostIpAddresses.js +42 -3
- package/build/dist/Utils/Telemetry/HostIpAddresses.js.map +1 -1
- package/package.json +5 -5
- package/test-setup.sh +2 -2
|
@@ -0,0 +1,881 @@
|
|
|
1
|
+
import "@testing-library/jest-dom";
|
|
2
|
+
import {
|
|
3
|
+
afterEach,
|
|
4
|
+
beforeEach,
|
|
5
|
+
describe,
|
|
6
|
+
expect,
|
|
7
|
+
jest,
|
|
8
|
+
test,
|
|
9
|
+
} from "@jest/globals";
|
|
10
|
+
import {
|
|
11
|
+
act,
|
|
12
|
+
cleanup,
|
|
13
|
+
fireEvent,
|
|
14
|
+
render,
|
|
15
|
+
screen,
|
|
16
|
+
} from "@testing-library/react";
|
|
17
|
+
import React, { ReactElement } from "react";
|
|
18
|
+
import {
|
|
19
|
+
MemoryRouter,
|
|
20
|
+
NavigateFunction,
|
|
21
|
+
useLocation,
|
|
22
|
+
useNavigate,
|
|
23
|
+
} from "react-router-dom";
|
|
24
|
+
import getJestMockFunction, { MockFunction } from "../../MockType";
|
|
25
|
+
import RumApplication from "../../../Models/DatabaseModels/RumApplication";
|
|
26
|
+
import Service from "../../../Models/DatabaseModels/Service";
|
|
27
|
+
import PodmanHost from "../../../Models/DatabaseModels/PodmanHost";
|
|
28
|
+
import HTTPResponse from "../../../Types/API/HTTPResponse";
|
|
29
|
+
import AIChatPageContextType from "../../../Types/AI/AIChatPageContext";
|
|
30
|
+
import {
|
|
31
|
+
AIResourceSubresourceKind,
|
|
32
|
+
AIResourceType,
|
|
33
|
+
} from "../../../Types/AI/AIResourceContext";
|
|
34
|
+
import { JSONObject } from "../../../Types/JSON";
|
|
35
|
+
import ObjectID from "../../../Types/ObjectID";
|
|
36
|
+
import GlobalEvents from "../../../UI/Utils/GlobalEvents";
|
|
37
|
+
import Navigation from "../../../UI/Utils/Navigation";
|
|
38
|
+
import AIChatPanel from "../../../../App/FeatureSet/Dashboard/src/Components/AIChat/AIChatPanel";
|
|
39
|
+
import EventName from "../../../../App/FeatureSet/Dashboard/src/Utils/EventName";
|
|
40
|
+
|
|
41
|
+
/*
|
|
42
|
+
* Issue #3844: insights have to follow the module the user is investigating.
|
|
43
|
+
* Exercise the actual panel, hook, route detection, suggestions, and request
|
|
44
|
+
* serialization together. Only network, project storage, and the unused PDF
|
|
45
|
+
* exporter are replaced. Navigation is wired to MemoryRouter in the same way
|
|
46
|
+
* the dashboard wires it to its browser router, so these tests also catch a
|
|
47
|
+
* valid route being classified as the wrong module.
|
|
48
|
+
*/
|
|
49
|
+
const postMock: MockFunction = getJestMockFunction();
|
|
50
|
+
const getListMock: MockFunction = getJestMockFunction();
|
|
51
|
+
const getItemMock: MockFunction = getJestMockFunction();
|
|
52
|
+
|
|
53
|
+
const PROJECT_ID: string = "11111111-1111-4111-8111-111111111111";
|
|
54
|
+
const OTHER_PROJECT_ID: string = "22222222-2222-4222-8222-222222222222";
|
|
55
|
+
const ENTITY_ID: string = "33333333-3333-4333-8333-333333333333";
|
|
56
|
+
const OTHER_ENTITY_ID: string = "44444444-4444-4444-8444-444444444444";
|
|
57
|
+
const CONVERSATION_ID: string = "55555555-5555-4555-8555-555555555555";
|
|
58
|
+
|
|
59
|
+
let currentProjectId: string = PROJECT_ID;
|
|
60
|
+
let navigate: NavigateFunction;
|
|
61
|
+
|
|
62
|
+
jest.mock("../../../UI/Utils/API/API", () => {
|
|
63
|
+
return {
|
|
64
|
+
__esModule: true,
|
|
65
|
+
default: {
|
|
66
|
+
post: (...args: Array<unknown>) => {
|
|
67
|
+
return postMock(...args);
|
|
68
|
+
},
|
|
69
|
+
getFriendlyMessage: () => {
|
|
70
|
+
return "Could not load data";
|
|
71
|
+
},
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
jest.mock("../../../UI/Utils/ModelAPI/ModelAPI", () => {
|
|
77
|
+
return {
|
|
78
|
+
__esModule: true,
|
|
79
|
+
default: {
|
|
80
|
+
getList: (...args: Array<unknown>) => {
|
|
81
|
+
return getListMock(...args);
|
|
82
|
+
},
|
|
83
|
+
getItem: (...args: Array<unknown>) => {
|
|
84
|
+
return getItemMock(...args);
|
|
85
|
+
},
|
|
86
|
+
getCommonHeaders: () => {
|
|
87
|
+
return { tenantid: currentProjectId };
|
|
88
|
+
},
|
|
89
|
+
},
|
|
90
|
+
};
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
jest.mock("../../../UI/Utils/Project", () => {
|
|
94
|
+
return {
|
|
95
|
+
__esModule: true,
|
|
96
|
+
default: {
|
|
97
|
+
getCurrentProjectId: () => {
|
|
98
|
+
return new ObjectID(currentProjectId);
|
|
99
|
+
},
|
|
100
|
+
},
|
|
101
|
+
};
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
jest.mock("../../../UI/Utils/Realtime", () => {
|
|
105
|
+
return {
|
|
106
|
+
__esModule: true,
|
|
107
|
+
default: {
|
|
108
|
+
listenToModelEvent: () => {
|
|
109
|
+
return () => {};
|
|
110
|
+
},
|
|
111
|
+
},
|
|
112
|
+
};
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
jest.mock(
|
|
116
|
+
"../../../../App/FeatureSet/Dashboard/src/Components/AIChat/ChatDownloadMenu",
|
|
117
|
+
() => {
|
|
118
|
+
return {
|
|
119
|
+
__esModule: true,
|
|
120
|
+
default: () => {
|
|
121
|
+
return null;
|
|
122
|
+
},
|
|
123
|
+
};
|
|
124
|
+
},
|
|
125
|
+
);
|
|
126
|
+
|
|
127
|
+
jest.mock(
|
|
128
|
+
"../../../../App/FeatureSet/Dashboard/src/Components/AI/AIPlanGate",
|
|
129
|
+
() => {
|
|
130
|
+
return {
|
|
131
|
+
__esModule: true,
|
|
132
|
+
isAIAccessibleOnCurrentPlan: () => {
|
|
133
|
+
return true;
|
|
134
|
+
},
|
|
135
|
+
default: () => {
|
|
136
|
+
return null;
|
|
137
|
+
},
|
|
138
|
+
};
|
|
139
|
+
},
|
|
140
|
+
);
|
|
141
|
+
|
|
142
|
+
interface PostRequest {
|
|
143
|
+
url: { toString: () => string };
|
|
144
|
+
data: JSONObject;
|
|
145
|
+
headers: JSONObject;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
interface PendingTitle {
|
|
149
|
+
promise: Promise<{ name: string }>;
|
|
150
|
+
resolve: (item: { name: string }) => void;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
function pendingTitle(): PendingTitle {
|
|
154
|
+
let resolve: PendingTitle["resolve"] = () => {};
|
|
155
|
+
const promise: Promise<{ name: string }> = new Promise(
|
|
156
|
+
(resolvePromise: PendingTitle["resolve"]) => {
|
|
157
|
+
resolve = resolvePromise;
|
|
158
|
+
},
|
|
159
|
+
);
|
|
160
|
+
return { promise, resolve };
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
function route(modulePath: string, projectId: string = PROJECT_ID): string {
|
|
164
|
+
return `/dashboard/${projectId}/${modulePath}`;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
function PanelWithNavigation(): ReactElement {
|
|
168
|
+
Navigation.setLocation(useLocation());
|
|
169
|
+
navigate = useNavigate();
|
|
170
|
+
Navigation.setNavigateHook(navigate);
|
|
171
|
+
return <AIChatPanel />;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
async function openAskAi(modulePath: string): Promise<void> {
|
|
175
|
+
render(
|
|
176
|
+
<MemoryRouter initialEntries={[route(modulePath)]}>
|
|
177
|
+
<PanelWithNavigation />
|
|
178
|
+
</MemoryRouter>,
|
|
179
|
+
);
|
|
180
|
+
await act(async () => {
|
|
181
|
+
GlobalEvents.dispatchEvent(EventName.AI_CHAT_TOGGLE);
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
async function goTo(
|
|
186
|
+
modulePath: string,
|
|
187
|
+
projectId: string = PROJECT_ID,
|
|
188
|
+
): Promise<void> {
|
|
189
|
+
await act(async () => {
|
|
190
|
+
currentProjectId = projectId;
|
|
191
|
+
await navigate(route(modulePath, projectId));
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
function sentRequests(): Array<PostRequest> {
|
|
196
|
+
return postMock.mock.calls
|
|
197
|
+
.map((call: Array<unknown>) => {
|
|
198
|
+
return call[0] as PostRequest;
|
|
199
|
+
})
|
|
200
|
+
.filter((request: PostRequest) => {
|
|
201
|
+
return request.url.toString().endsWith("/ai-chat/send-message");
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
async function sendQuestion(
|
|
206
|
+
question: string = "What needs attention?",
|
|
207
|
+
): Promise<PostRequest> {
|
|
208
|
+
fireEvent.change(screen.getByRole("textbox"), {
|
|
209
|
+
target: { value: question },
|
|
210
|
+
});
|
|
211
|
+
await act(async () => {
|
|
212
|
+
fireEvent.click(screen.getByTitle("Send (Enter)"));
|
|
213
|
+
});
|
|
214
|
+
const requests: Array<PostRequest> = sentRequests();
|
|
215
|
+
expect(requests.length).toBeGreaterThan(0);
|
|
216
|
+
return requests[requests.length - 1]!;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
beforeEach(() => {
|
|
220
|
+
jest.useFakeTimers();
|
|
221
|
+
currentProjectId = PROJECT_ID;
|
|
222
|
+
postMock.mockReset();
|
|
223
|
+
getListMock.mockReset();
|
|
224
|
+
getItemMock.mockReset();
|
|
225
|
+
getListMock.mockResolvedValue({ data: [], count: 0, skip: 0, limit: 25 });
|
|
226
|
+
getItemMock.mockResolvedValue({ name: "Storefront" });
|
|
227
|
+
postMock.mockImplementation(async (request: PostRequest) => {
|
|
228
|
+
return new HTTPResponse<JSONObject>(
|
|
229
|
+
200,
|
|
230
|
+
request.url.toString().endsWith("/ai-chat/providers")
|
|
231
|
+
? {
|
|
232
|
+
isAIEnabledForProject: true,
|
|
233
|
+
defaultProviderId: "provider-1",
|
|
234
|
+
providers: [
|
|
235
|
+
{
|
|
236
|
+
id: "provider-1",
|
|
237
|
+
name: "Project provider",
|
|
238
|
+
llmType: "OpenAI",
|
|
239
|
+
isDefault: true,
|
|
240
|
+
},
|
|
241
|
+
],
|
|
242
|
+
}
|
|
243
|
+
: { conversationId: CONVERSATION_ID },
|
|
244
|
+
{},
|
|
245
|
+
);
|
|
246
|
+
});
|
|
247
|
+
Object.defineProperty(HTMLElement.prototype, "scrollTo", {
|
|
248
|
+
configurable: true,
|
|
249
|
+
value: getJestMockFunction(),
|
|
250
|
+
});
|
|
251
|
+
});
|
|
252
|
+
|
|
253
|
+
afterEach(() => {
|
|
254
|
+
cleanup();
|
|
255
|
+
jest.clearAllTimers();
|
|
256
|
+
jest.useRealTimers();
|
|
257
|
+
});
|
|
258
|
+
|
|
259
|
+
describe("module insights in Ask AI", () => {
|
|
260
|
+
test.each(["", "/metrics", "/logs", "/traces", "/session-replay"])(
|
|
261
|
+
"RUM application%s opens with application context and its display name",
|
|
262
|
+
async (subpage: string) => {
|
|
263
|
+
await openAskAi(`rum/${ENTITY_ID}${subpage}`);
|
|
264
|
+
|
|
265
|
+
expect(screen.getByRole("heading", { level: 3 })).toHaveTextContent(
|
|
266
|
+
"this RUM application",
|
|
267
|
+
);
|
|
268
|
+
expect(screen.getByRole("textbox")).toHaveAttribute(
|
|
269
|
+
"placeholder",
|
|
270
|
+
"Ask about this RUM application…",
|
|
271
|
+
);
|
|
272
|
+
expect(
|
|
273
|
+
screen.getByText("This RUM application · Storefront"),
|
|
274
|
+
).toBeInTheDocument();
|
|
275
|
+
expect(screen.getByText("Or explore everything")).toBeInTheDocument();
|
|
276
|
+
expect(getItemMock).toHaveBeenCalledWith(
|
|
277
|
+
expect.objectContaining({
|
|
278
|
+
modelType: RumApplication,
|
|
279
|
+
id: new ObjectID(ENTITY_ID),
|
|
280
|
+
select: { name: true },
|
|
281
|
+
}),
|
|
282
|
+
);
|
|
283
|
+
expect(sentRequests()).toHaveLength(0);
|
|
284
|
+
},
|
|
285
|
+
);
|
|
286
|
+
|
|
287
|
+
test("a RUM question sends the application identity and resolved title", async () => {
|
|
288
|
+
await openAskAi(`rum/${ENTITY_ID}/metrics`);
|
|
289
|
+
|
|
290
|
+
const request: PostRequest = await sendQuestion(
|
|
291
|
+
"Why is this application slow?",
|
|
292
|
+
);
|
|
293
|
+
|
|
294
|
+
expect(request.data).toEqual(
|
|
295
|
+
expect.objectContaining({
|
|
296
|
+
content: "Why is this application slow?",
|
|
297
|
+
pageContext: {
|
|
298
|
+
type: AIChatPageContextType.RumApplication,
|
|
299
|
+
entityId: ENTITY_ID,
|
|
300
|
+
entityTitle: "Storefront",
|
|
301
|
+
},
|
|
302
|
+
}),
|
|
303
|
+
);
|
|
304
|
+
expect(request.headers["tenantid"]).toBe(PROJECT_ID);
|
|
305
|
+
});
|
|
306
|
+
|
|
307
|
+
test("RUM insight suggestions cover web vitals, regressions, requests, and connection health", async () => {
|
|
308
|
+
await openAskAi(`rum/${ENTITY_ID}`);
|
|
309
|
+
|
|
310
|
+
for (const title of [
|
|
311
|
+
"Web vitals trends",
|
|
312
|
+
"Performance regressions",
|
|
313
|
+
"Slow or failing requests",
|
|
314
|
+
"Connection health",
|
|
315
|
+
]) {
|
|
316
|
+
expect(
|
|
317
|
+
screen.getByRole("button", { name: new RegExp(title) }),
|
|
318
|
+
).toBeEnabled();
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
await act(async () => {
|
|
322
|
+
fireEvent.click(
|
|
323
|
+
screen.getByRole("button", { name: /Web vitals trends/ }),
|
|
324
|
+
);
|
|
325
|
+
});
|
|
326
|
+
|
|
327
|
+
expect(sentRequests()).toHaveLength(1);
|
|
328
|
+
expect(sentRequests()[0]!.data).toEqual(
|
|
329
|
+
expect.objectContaining({
|
|
330
|
+
content:
|
|
331
|
+
"Chart this RUM application's LCP, INP and CLS over the last 24 hours. Which web vitals need attention?",
|
|
332
|
+
pageContext: {
|
|
333
|
+
type: AIChatPageContextType.RumApplication,
|
|
334
|
+
entityId: ENTITY_ID,
|
|
335
|
+
entityTitle: "Storefront",
|
|
336
|
+
},
|
|
337
|
+
}),
|
|
338
|
+
);
|
|
339
|
+
});
|
|
340
|
+
|
|
341
|
+
test.each(["rum", "rum/archived"])(
|
|
342
|
+
"%s offers application-wide insights without inventing an entity",
|
|
343
|
+
async (modulePath: string) => {
|
|
344
|
+
await openAskAi(modulePath);
|
|
345
|
+
|
|
346
|
+
expect(screen.getByRole("heading", { level: 3 })).toHaveTextContent(
|
|
347
|
+
"your RUM applications",
|
|
348
|
+
);
|
|
349
|
+
expect(screen.getByRole("textbox")).toHaveAttribute(
|
|
350
|
+
"placeholder",
|
|
351
|
+
"Ask about your RUM applications…",
|
|
352
|
+
);
|
|
353
|
+
expect(screen.getByText("Or explore everything")).toBeInTheDocument();
|
|
354
|
+
expect(getItemMock).not.toHaveBeenCalled();
|
|
355
|
+
|
|
356
|
+
const request: PostRequest = await sendQuestion();
|
|
357
|
+
expect(request.data["pageContext"]).toEqual({
|
|
358
|
+
type: AIChatPageContextType.RumApplications,
|
|
359
|
+
});
|
|
360
|
+
},
|
|
361
|
+
);
|
|
362
|
+
|
|
363
|
+
test("the services list offers insights scoped to services", async () => {
|
|
364
|
+
await openAskAi("service");
|
|
365
|
+
|
|
366
|
+
expect(screen.getByRole("heading", { level: 3 })).toHaveTextContent(
|
|
367
|
+
"your services",
|
|
368
|
+
);
|
|
369
|
+
expect(screen.getByRole("textbox")).toHaveAttribute(
|
|
370
|
+
"placeholder",
|
|
371
|
+
"Ask about your services…",
|
|
372
|
+
);
|
|
373
|
+
expect(screen.getByText("Or explore everything")).toBeInTheDocument();
|
|
374
|
+
expect(getItemMock).not.toHaveBeenCalled();
|
|
375
|
+
|
|
376
|
+
const request: PostRequest = await sendQuestion();
|
|
377
|
+
expect(request.data["pageContext"]).toEqual({
|
|
378
|
+
type: AIChatPageContextType.TelemetryServicesList,
|
|
379
|
+
});
|
|
380
|
+
});
|
|
381
|
+
|
|
382
|
+
test("a contextual service suggestion sends its question with the current service", async () => {
|
|
383
|
+
getItemMock.mockResolvedValue({ name: "Checkout API" });
|
|
384
|
+
await openAskAi(`service/${ENTITY_ID}/traces`);
|
|
385
|
+
|
|
386
|
+
await act(async () => {
|
|
387
|
+
fireEvent.click(screen.getByRole("button", { name: /Health overview/ }));
|
|
388
|
+
});
|
|
389
|
+
|
|
390
|
+
expect(sentRequests()).toHaveLength(1);
|
|
391
|
+
expect(sentRequests()[0]!.data).toEqual(
|
|
392
|
+
expect.objectContaining({
|
|
393
|
+
content:
|
|
394
|
+
"Give me a health overview of this service — errors, latency and log volume over the last 24 hours.",
|
|
395
|
+
pageContext: {
|
|
396
|
+
type: AIChatPageContextType.TelemetryService,
|
|
397
|
+
entityId: ENTITY_ID,
|
|
398
|
+
entityTitle: "Checkout API",
|
|
399
|
+
},
|
|
400
|
+
}),
|
|
401
|
+
);
|
|
402
|
+
});
|
|
403
|
+
|
|
404
|
+
test("removing context restores general suggestions and explicitly clears the conversation context", async () => {
|
|
405
|
+
await openAskAi(`rum/${ENTITY_ID}`);
|
|
406
|
+
fireEvent.click(screen.getByTitle("Remove page context"));
|
|
407
|
+
|
|
408
|
+
expect(screen.getByRole("heading", { level: 3 })).toHaveTextContent(
|
|
409
|
+
"Ask AI about your data — or tell it to act",
|
|
410
|
+
);
|
|
411
|
+
expect(screen.queryByText("Or explore everything")).not.toBeInTheDocument();
|
|
412
|
+
expect(
|
|
413
|
+
screen.getByTitle("Attach this page as context for your questions"),
|
|
414
|
+
).toBeInTheDocument();
|
|
415
|
+
|
|
416
|
+
const request: PostRequest = await sendQuestion();
|
|
417
|
+
expect(request.data["pageContext"]).toBeNull();
|
|
418
|
+
});
|
|
419
|
+
|
|
420
|
+
test("reattaching restores the application context for subsequent questions", async () => {
|
|
421
|
+
await openAskAi(`rum/${ENTITY_ID}`);
|
|
422
|
+
fireEvent.click(screen.getByTitle("Remove page context"));
|
|
423
|
+
fireEvent.click(
|
|
424
|
+
screen.getByTitle("Attach this page as context for your questions"),
|
|
425
|
+
);
|
|
426
|
+
|
|
427
|
+
const request: PostRequest = await sendQuestion();
|
|
428
|
+
expect(request.data["pageContext"]).toEqual({
|
|
429
|
+
type: AIChatPageContextType.RumApplication,
|
|
430
|
+
entityId: ENTITY_ID,
|
|
431
|
+
entityTitle: "Storefront",
|
|
432
|
+
});
|
|
433
|
+
});
|
|
434
|
+
|
|
435
|
+
test("detach and reattach apply to follow-up messages in an existing conversation", async () => {
|
|
436
|
+
await openAskAi(`rum/${ENTITY_ID}`);
|
|
437
|
+
await sendQuestion("Summarize this application's performance.");
|
|
438
|
+
|
|
439
|
+
fireEvent.click(screen.getByTitle("Remove page context"));
|
|
440
|
+
const detached: PostRequest = await sendQuestion(
|
|
441
|
+
"Now summarize all services.",
|
|
442
|
+
);
|
|
443
|
+
expect(detached.data).toEqual(
|
|
444
|
+
expect.objectContaining({
|
|
445
|
+
conversationId: CONVERSATION_ID,
|
|
446
|
+
pageContext: null,
|
|
447
|
+
}),
|
|
448
|
+
);
|
|
449
|
+
|
|
450
|
+
fireEvent.click(
|
|
451
|
+
screen.getByTitle("Attach this page as context for your questions"),
|
|
452
|
+
);
|
|
453
|
+
const reattached: PostRequest = await sendQuestion(
|
|
454
|
+
"Back to this application: what changed?",
|
|
455
|
+
);
|
|
456
|
+
expect(reattached.data).toEqual(
|
|
457
|
+
expect.objectContaining({
|
|
458
|
+
conversationId: CONVERSATION_ID,
|
|
459
|
+
pageContext: {
|
|
460
|
+
type: AIChatPageContextType.RumApplication,
|
|
461
|
+
entityId: ENTITY_ID,
|
|
462
|
+
entityTitle: "Storefront",
|
|
463
|
+
},
|
|
464
|
+
}),
|
|
465
|
+
);
|
|
466
|
+
expect(sentRequests()).toHaveLength(3);
|
|
467
|
+
});
|
|
468
|
+
|
|
469
|
+
test("detached context stays detached when navigating within the same application", async () => {
|
|
470
|
+
await openAskAi(`rum/${ENTITY_ID}/metrics`);
|
|
471
|
+
fireEvent.click(screen.getByTitle("Remove page context"));
|
|
472
|
+
|
|
473
|
+
await goTo(`rum/${ENTITY_ID}/traces`);
|
|
474
|
+
|
|
475
|
+
expect(screen.queryByTitle("Remove page context")).not.toBeInTheDocument();
|
|
476
|
+
expect(
|
|
477
|
+
screen.getByTitle("Attach this page as context for your questions"),
|
|
478
|
+
).toBeInTheDocument();
|
|
479
|
+
const request: PostRequest = await sendQuestion();
|
|
480
|
+
expect(request.data["pageContext"]).toBeNull();
|
|
481
|
+
});
|
|
482
|
+
|
|
483
|
+
test("navigating to another application attaches its context and sends its identity", async () => {
|
|
484
|
+
await openAskAi(`rum/${ENTITY_ID}`);
|
|
485
|
+
fireEvent.click(screen.getByTitle("Remove page context"));
|
|
486
|
+
getItemMock.mockResolvedValue({ name: "Admin console" });
|
|
487
|
+
|
|
488
|
+
await goTo(`rum/${OTHER_ENTITY_ID}`);
|
|
489
|
+
|
|
490
|
+
expect(
|
|
491
|
+
screen.getByText("This RUM application · Admin console"),
|
|
492
|
+
).toBeInTheDocument();
|
|
493
|
+
const request: PostRequest = await sendQuestion();
|
|
494
|
+
expect(request.data["pageContext"]).toEqual({
|
|
495
|
+
type: AIChatPageContextType.RumApplication,
|
|
496
|
+
entityId: OTHER_ENTITY_ID,
|
|
497
|
+
entityTitle: "Admin console",
|
|
498
|
+
});
|
|
499
|
+
});
|
|
500
|
+
|
|
501
|
+
test("ordinary navigation away from a supported module omits context for the existing conversation", async () => {
|
|
502
|
+
await openAskAi(`rum/${ENTITY_ID}`);
|
|
503
|
+
await sendQuestion("Summarize this application's performance.");
|
|
504
|
+
await goTo("settings/general");
|
|
505
|
+
|
|
506
|
+
expect(screen.queryByTitle("Remove page context")).not.toBeInTheDocument();
|
|
507
|
+
expect(
|
|
508
|
+
screen.queryByTitle("Attach this page as context for your questions"),
|
|
509
|
+
).not.toBeInTheDocument();
|
|
510
|
+
const request: PostRequest = await sendQuestion();
|
|
511
|
+
expect(request.data["conversationId"]).toBe(CONVERSATION_ID);
|
|
512
|
+
expect(request.data).not.toHaveProperty("pageContext");
|
|
513
|
+
});
|
|
514
|
+
|
|
515
|
+
test("detaching before navigating to an unsupported page still clears the conversation context", async () => {
|
|
516
|
+
await openAskAi(`rum/${ENTITY_ID}`);
|
|
517
|
+
await sendQuestion("Summarize this application's performance.");
|
|
518
|
+
fireEvent.click(screen.getByTitle("Remove page context"));
|
|
519
|
+
|
|
520
|
+
await goTo("settings/general");
|
|
521
|
+
|
|
522
|
+
expect(screen.queryByTitle("Remove page context")).not.toBeInTheDocument();
|
|
523
|
+
expect(
|
|
524
|
+
screen.queryByTitle("Attach this page as context for your questions"),
|
|
525
|
+
).not.toBeInTheDocument();
|
|
526
|
+
const request: PostRequest = await sendQuestion(
|
|
527
|
+
"Now summarize all services.",
|
|
528
|
+
);
|
|
529
|
+
expect(request.data).toEqual(
|
|
530
|
+
expect.objectContaining({
|
|
531
|
+
conversationId: CONVERSATION_ID,
|
|
532
|
+
pageContext: null,
|
|
533
|
+
}),
|
|
534
|
+
);
|
|
535
|
+
});
|
|
536
|
+
|
|
537
|
+
test("switching projects on an unsupported page clears the previous project's detach intent", async () => {
|
|
538
|
+
await openAskAi(`rum/${ENTITY_ID}`);
|
|
539
|
+
await sendQuestion("Summarize this application's performance.");
|
|
540
|
+
fireEvent.click(screen.getByTitle("Remove page context"));
|
|
541
|
+
await goTo("settings/general");
|
|
542
|
+
|
|
543
|
+
await goTo("settings/general", OTHER_PROJECT_ID);
|
|
544
|
+
|
|
545
|
+
const request: PostRequest = await sendQuestion();
|
|
546
|
+
expect(request.headers["tenantid"]).toBe(OTHER_PROJECT_ID);
|
|
547
|
+
expect(request.data).not.toHaveProperty("conversationId");
|
|
548
|
+
expect(request.data).not.toHaveProperty("pageContext");
|
|
549
|
+
});
|
|
550
|
+
|
|
551
|
+
test.each(["reattach", "new supported page"])(
|
|
552
|
+
"%s clears remembered detachment before later unsupported navigation",
|
|
553
|
+
async (action: string) => {
|
|
554
|
+
await openAskAi(`rum/${ENTITY_ID}`);
|
|
555
|
+
await sendQuestion("Summarize this application's performance.");
|
|
556
|
+
fireEvent.click(screen.getByTitle("Remove page context"));
|
|
557
|
+
|
|
558
|
+
if (action === "reattach") {
|
|
559
|
+
fireEvent.click(
|
|
560
|
+
screen.getByTitle("Attach this page as context for your questions"),
|
|
561
|
+
);
|
|
562
|
+
} else {
|
|
563
|
+
await goTo(`rum/${OTHER_ENTITY_ID}`);
|
|
564
|
+
}
|
|
565
|
+
await sendQuestion("Summarize the attached application.");
|
|
566
|
+
await goTo("settings/general");
|
|
567
|
+
|
|
568
|
+
const request: PostRequest = await sendQuestion();
|
|
569
|
+
expect(request.data["conversationId"]).toBe(CONVERSATION_ID);
|
|
570
|
+
expect(request.data).not.toHaveProperty("pageContext");
|
|
571
|
+
},
|
|
572
|
+
);
|
|
573
|
+
|
|
574
|
+
test.each([
|
|
575
|
+
["logs", AIChatPageContextType.LogsExplorer],
|
|
576
|
+
["traces", AIChatPageContextType.TracesExplorer],
|
|
577
|
+
["metrics", AIChatPageContextType.MetricsExplorer],
|
|
578
|
+
] as Array<[string, AIChatPageContextType]>)(
|
|
579
|
+
"navigating to %s replaces the application context with the explorer",
|
|
580
|
+
async (modulePath: string, type: AIChatPageContextType) => {
|
|
581
|
+
await openAskAi(`rum/${ENTITY_ID}`);
|
|
582
|
+
await goTo(modulePath);
|
|
583
|
+
|
|
584
|
+
expect(screen.getByRole("textbox")).toHaveAttribute(
|
|
585
|
+
"placeholder",
|
|
586
|
+
`Ask about your ${modulePath}…`,
|
|
587
|
+
);
|
|
588
|
+
expect(screen.queryByText(/Storefront/)).not.toBeInTheDocument();
|
|
589
|
+
const request: PostRequest = await sendQuestion();
|
|
590
|
+
expect(request.data["pageContext"]).toEqual({ type });
|
|
591
|
+
},
|
|
592
|
+
);
|
|
593
|
+
|
|
594
|
+
test("an unreadable application still allows insights with its ID and a generic chip", async () => {
|
|
595
|
+
getItemMock.mockRejectedValue(new Error("Access denied"));
|
|
596
|
+
await openAskAi(`rum/${ENTITY_ID}`);
|
|
597
|
+
|
|
598
|
+
expect(screen.getByText("This RUM application")).toBeInTheDocument();
|
|
599
|
+
const request: PostRequest = await sendQuestion();
|
|
600
|
+
expect(request.data["pageContext"]).toEqual({
|
|
601
|
+
type: AIChatPageContextType.RumApplication,
|
|
602
|
+
entityId: ENTITY_ID,
|
|
603
|
+
});
|
|
604
|
+
});
|
|
605
|
+
});
|
|
606
|
+
|
|
607
|
+
describe("asynchronous module context changes", () => {
|
|
608
|
+
test("a delayed application title cannot overwrite a service with the same ID", async () => {
|
|
609
|
+
const oldTitle: PendingTitle = pendingTitle();
|
|
610
|
+
getItemMock.mockImplementation((request: { modelType: unknown }) => {
|
|
611
|
+
return request.modelType === RumApplication
|
|
612
|
+
? oldTitle.promise
|
|
613
|
+
: Promise.resolve({ name: "Checkout API" });
|
|
614
|
+
});
|
|
615
|
+
await openAskAi(`rum/${ENTITY_ID}`);
|
|
616
|
+
await goTo(`service/${ENTITY_ID}`);
|
|
617
|
+
expect(screen.getByText("This service · Checkout API")).toBeInTheDocument();
|
|
618
|
+
|
|
619
|
+
await act(async () => {
|
|
620
|
+
oldTitle.resolve({ name: "Stale application title" });
|
|
621
|
+
});
|
|
622
|
+
|
|
623
|
+
expect(screen.getByText("This service · Checkout API")).toBeInTheDocument();
|
|
624
|
+
expect(
|
|
625
|
+
screen.queryByText(/Stale application title/),
|
|
626
|
+
).not.toBeInTheDocument();
|
|
627
|
+
const request: PostRequest = await sendQuestion();
|
|
628
|
+
expect(request.data["pageContext"]).toEqual({
|
|
629
|
+
type: AIChatPageContextType.TelemetryService,
|
|
630
|
+
entityId: ENTITY_ID,
|
|
631
|
+
entityTitle: "Checkout API",
|
|
632
|
+
});
|
|
633
|
+
expect(getItemMock).toHaveBeenCalledWith(
|
|
634
|
+
expect.objectContaining({ modelType: Service }),
|
|
635
|
+
);
|
|
636
|
+
});
|
|
637
|
+
|
|
638
|
+
test("a delayed title from the previous project cannot overwrite the current project", async () => {
|
|
639
|
+
const oldTitle: PendingTitle = pendingTitle();
|
|
640
|
+
getItemMock.mockImplementation(() => {
|
|
641
|
+
return currentProjectId === PROJECT_ID
|
|
642
|
+
? oldTitle.promise
|
|
643
|
+
: Promise.resolve({ name: "Other project application" });
|
|
644
|
+
});
|
|
645
|
+
await openAskAi(`rum/${ENTITY_ID}`);
|
|
646
|
+
fireEvent.click(screen.getByTitle("Remove page context"));
|
|
647
|
+
await goTo(`rum/${ENTITY_ID}`, OTHER_PROJECT_ID);
|
|
648
|
+
|
|
649
|
+
expect(
|
|
650
|
+
screen.getByText("This RUM application · Other project application"),
|
|
651
|
+
).toBeInTheDocument();
|
|
652
|
+
await act(async () => {
|
|
653
|
+
oldTitle.resolve({ name: "Old project application" });
|
|
654
|
+
});
|
|
655
|
+
|
|
656
|
+
expect(
|
|
657
|
+
screen.queryByText(/Old project application/),
|
|
658
|
+
).not.toBeInTheDocument();
|
|
659
|
+
const request: PostRequest = await sendQuestion();
|
|
660
|
+
expect(request.headers["tenantid"]).toBe(OTHER_PROJECT_ID);
|
|
661
|
+
expect(request.data["pageContext"]).toEqual({
|
|
662
|
+
type: AIChatPageContextType.RumApplication,
|
|
663
|
+
entityId: ENTITY_ID,
|
|
664
|
+
entityTitle: "Other project application",
|
|
665
|
+
});
|
|
666
|
+
});
|
|
667
|
+
|
|
668
|
+
test("closing and reopening invalidates a title request from the previous opening", async () => {
|
|
669
|
+
const oldTitle: PendingTitle = pendingTitle();
|
|
670
|
+
getItemMock.mockReturnValueOnce(oldTitle.promise);
|
|
671
|
+
getItemMock.mockResolvedValue({ name: "Renamed application" });
|
|
672
|
+
await openAskAi(`rum/${ENTITY_ID}`);
|
|
673
|
+
fireEvent.click(screen.getByTitle("Close (Esc)"));
|
|
674
|
+
|
|
675
|
+
await act(async () => {
|
|
676
|
+
GlobalEvents.dispatchEvent(EventName.AI_CHAT_TOGGLE);
|
|
677
|
+
});
|
|
678
|
+
expect(
|
|
679
|
+
screen.getByText("This RUM application · Renamed application"),
|
|
680
|
+
).toBeInTheDocument();
|
|
681
|
+
await act(async () => {
|
|
682
|
+
oldTitle.resolve({ name: "Previous application name" });
|
|
683
|
+
});
|
|
684
|
+
|
|
685
|
+
expect(
|
|
686
|
+
screen.queryByText(/Previous application name/),
|
|
687
|
+
).not.toBeInTheDocument();
|
|
688
|
+
const request: PostRequest = await sendQuestion();
|
|
689
|
+
expect(request.data["pageContext"]).toEqual({
|
|
690
|
+
type: AIChatPageContextType.RumApplication,
|
|
691
|
+
entityId: ENTITY_ID,
|
|
692
|
+
entityTitle: "Renamed application",
|
|
693
|
+
});
|
|
694
|
+
});
|
|
695
|
+
});
|
|
696
|
+
|
|
697
|
+
describe("infrastructure context in Ask AI", () => {
|
|
698
|
+
test.each([
|
|
699
|
+
["kubernetes", AIResourceType.KubernetesCluster, "Kubernetes cluster"],
|
|
700
|
+
["iot", AIResourceType.IoTFleet, "IoT fleet"],
|
|
701
|
+
["network-devices", AIResourceType.NetworkDevice, "network device"],
|
|
702
|
+
] as Array<[string, AIResourceType, string]>)(
|
|
703
|
+
"%s questions carry the resource type, canonical ID, and resolved name",
|
|
704
|
+
async (modulePath: string, resourceType: AIResourceType, noun: string) => {
|
|
705
|
+
await openAskAi(`${modulePath}/${ENTITY_ID}`);
|
|
706
|
+
|
|
707
|
+
expect(screen.getByText(`This ${noun} · Storefront`)).toBeInTheDocument();
|
|
708
|
+
expect(screen.getByRole("textbox")).toHaveAttribute(
|
|
709
|
+
"placeholder",
|
|
710
|
+
`Ask about this ${noun}…`,
|
|
711
|
+
);
|
|
712
|
+
const request: PostRequest = await sendQuestion();
|
|
713
|
+
expect(request.data["pageContext"]).toEqual({
|
|
714
|
+
type: AIChatPageContextType.Resource,
|
|
715
|
+
resourceType,
|
|
716
|
+
entityId: ENTITY_ID,
|
|
717
|
+
entityTitle: "Storefront",
|
|
718
|
+
});
|
|
719
|
+
},
|
|
720
|
+
);
|
|
721
|
+
|
|
722
|
+
test("an infrastructure list sends only its resource category", async () => {
|
|
723
|
+
await openAskAi("docker");
|
|
724
|
+
expect(getItemMock).not.toHaveBeenCalled();
|
|
725
|
+
expect(
|
|
726
|
+
screen.getByRole("button", { name: /Resource overview/ }),
|
|
727
|
+
).toBeEnabled();
|
|
728
|
+
|
|
729
|
+
const request: PostRequest = await sendQuestion();
|
|
730
|
+
expect(request.data["pageContext"]).toEqual({
|
|
731
|
+
type: AIChatPageContextType.ResourcesList,
|
|
732
|
+
resourceType: AIResourceType.DockerHost,
|
|
733
|
+
});
|
|
734
|
+
});
|
|
735
|
+
|
|
736
|
+
test("a pod suggestion sends its external identity separately from the parent UUID without inventing a namespace", async () => {
|
|
737
|
+
await openAskAi(`kubernetes/${ENTITY_ID}/pods/checkout-123`);
|
|
738
|
+
expect(
|
|
739
|
+
screen.getByText("This pod · Storefront / pod: checkout-123"),
|
|
740
|
+
).toBeInTheDocument();
|
|
741
|
+
|
|
742
|
+
await act(async () => {
|
|
743
|
+
fireEvent.click(
|
|
744
|
+
screen.getByRole("button", { name: /Understand this view/ }),
|
|
745
|
+
);
|
|
746
|
+
});
|
|
747
|
+
|
|
748
|
+
expect(sentRequests()).toHaveLength(1);
|
|
749
|
+
expect(sentRequests()[0]!.data["pageContext"]).toEqual({
|
|
750
|
+
type: AIChatPageContextType.Resource,
|
|
751
|
+
resourceType: AIResourceType.KubernetesCluster,
|
|
752
|
+
entityId: ENTITY_ID,
|
|
753
|
+
entityTitle: "Storefront / pod: checkout-123",
|
|
754
|
+
subresource: { kind: AIResourceSubresourceKind.Pod, key: "checkout-123" },
|
|
755
|
+
});
|
|
756
|
+
expect(sentRequests()[0]!.data["content"]).toContain("missing namespace");
|
|
757
|
+
});
|
|
758
|
+
|
|
759
|
+
test("a collection view keeps the parent identity and a child kind without a selected key", async () => {
|
|
760
|
+
await openAskAi(`kubernetes/${ENTITY_ID}/pods`);
|
|
761
|
+
expect(
|
|
762
|
+
screen.getByText("This Kubernetes cluster · Storefront"),
|
|
763
|
+
).toBeInTheDocument();
|
|
764
|
+
|
|
765
|
+
const request: PostRequest = await sendQuestion();
|
|
766
|
+
expect(request.data["pageContext"]).toEqual({
|
|
767
|
+
type: AIChatPageContextType.Resource,
|
|
768
|
+
resourceType: AIResourceType.KubernetesCluster,
|
|
769
|
+
entityId: ENTITY_ID,
|
|
770
|
+
entityTitle: "Storefront",
|
|
771
|
+
subresource: { kind: AIResourceSubresourceKind.Pod },
|
|
772
|
+
});
|
|
773
|
+
});
|
|
774
|
+
|
|
775
|
+
test("navigating to another child of the same parent attaches the new child context", async () => {
|
|
776
|
+
await openAskAi(`docker/${ENTITY_ID}/containers/old-container`);
|
|
777
|
+
fireEvent.click(screen.getByTitle("Remove page context"));
|
|
778
|
+
|
|
779
|
+
await goTo(`docker/${ENTITY_ID}/containers/new-container`);
|
|
780
|
+
|
|
781
|
+
expect(
|
|
782
|
+
screen.getByText(
|
|
783
|
+
"This container · Storefront / container: new-container",
|
|
784
|
+
),
|
|
785
|
+
).toBeInTheDocument();
|
|
786
|
+
const request: PostRequest = await sendQuestion();
|
|
787
|
+
expect(request.data["pageContext"]).toEqual({
|
|
788
|
+
type: AIChatPageContextType.Resource,
|
|
789
|
+
resourceType: AIResourceType.DockerHost,
|
|
790
|
+
entityId: ENTITY_ID,
|
|
791
|
+
entityTitle: "Storefront / container: new-container",
|
|
792
|
+
subresource: {
|
|
793
|
+
kind: AIResourceSubresourceKind.Container,
|
|
794
|
+
key: "new-container",
|
|
795
|
+
},
|
|
796
|
+
});
|
|
797
|
+
});
|
|
798
|
+
|
|
799
|
+
test("detaching a child context clears its saved subject and reattaching restores the full child identity", async () => {
|
|
800
|
+
await openAskAi(`kubernetes/${ENTITY_ID}/pods/checkout`);
|
|
801
|
+
await sendQuestion("Investigate this pod.");
|
|
802
|
+
fireEvent.click(screen.getByTitle("Remove page context"));
|
|
803
|
+
|
|
804
|
+
const detached: PostRequest = await sendQuestion(
|
|
805
|
+
"Now summarize all services.",
|
|
806
|
+
);
|
|
807
|
+
expect(detached.data).toEqual(
|
|
808
|
+
expect.objectContaining({
|
|
809
|
+
conversationId: CONVERSATION_ID,
|
|
810
|
+
pageContext: null,
|
|
811
|
+
}),
|
|
812
|
+
);
|
|
813
|
+
|
|
814
|
+
fireEvent.click(
|
|
815
|
+
screen.getByTitle("Attach this page as context for your questions"),
|
|
816
|
+
);
|
|
817
|
+
const reattached: PostRequest = await sendQuestion("Return to this pod.");
|
|
818
|
+
expect(reattached.data).toEqual(
|
|
819
|
+
expect.objectContaining({
|
|
820
|
+
conversationId: CONVERSATION_ID,
|
|
821
|
+
pageContext: {
|
|
822
|
+
type: AIChatPageContextType.Resource,
|
|
823
|
+
resourceType: AIResourceType.KubernetesCluster,
|
|
824
|
+
entityId: ENTITY_ID,
|
|
825
|
+
entityTitle: "Storefront / pod: checkout",
|
|
826
|
+
subresource: { kind: AIResourceSubresourceKind.Pod, key: "checkout" },
|
|
827
|
+
},
|
|
828
|
+
}),
|
|
829
|
+
);
|
|
830
|
+
});
|
|
831
|
+
|
|
832
|
+
test("changing child kind with the same parent and external name selects a new subject", async () => {
|
|
833
|
+
await openAskAi(`kubernetes/${ENTITY_ID}/pods/checkout`);
|
|
834
|
+
fireEvent.click(screen.getByTitle("Remove page context"));
|
|
835
|
+
|
|
836
|
+
await goTo(`kubernetes/${ENTITY_ID}/deployments/checkout`);
|
|
837
|
+
|
|
838
|
+
expect(
|
|
839
|
+
screen.getByText("This deployment · Storefront / deployment: checkout"),
|
|
840
|
+
).toBeInTheDocument();
|
|
841
|
+
const request: PostRequest = await sendQuestion();
|
|
842
|
+
expect(request.data["pageContext"]).toEqual({
|
|
843
|
+
type: AIChatPageContextType.Resource,
|
|
844
|
+
resourceType: AIResourceType.KubernetesCluster,
|
|
845
|
+
entityId: ENTITY_ID,
|
|
846
|
+
entityTitle: "Storefront / deployment: checkout",
|
|
847
|
+
subresource: {
|
|
848
|
+
kind: AIResourceSubresourceKind.Deployment,
|
|
849
|
+
key: "checkout",
|
|
850
|
+
},
|
|
851
|
+
});
|
|
852
|
+
});
|
|
853
|
+
|
|
854
|
+
test("resource type changes with the same UUID reattach context and reject a delayed title from the previous module", async () => {
|
|
855
|
+
const oldTitle: PendingTitle = pendingTitle();
|
|
856
|
+
getItemMock.mockImplementation((request: { modelType: unknown }) => {
|
|
857
|
+
return request.modelType === PodmanHost
|
|
858
|
+
? Promise.resolve({ name: "Podman production" })
|
|
859
|
+
: oldTitle.promise;
|
|
860
|
+
});
|
|
861
|
+
await openAskAi(`docker/${ENTITY_ID}`);
|
|
862
|
+
fireEvent.click(screen.getByTitle("Remove page context"));
|
|
863
|
+
|
|
864
|
+
await goTo(`podman/${ENTITY_ID}`);
|
|
865
|
+
await act(async () => {
|
|
866
|
+
oldTitle.resolve({ name: "Stale Docker title" });
|
|
867
|
+
});
|
|
868
|
+
|
|
869
|
+
expect(
|
|
870
|
+
screen.getByText("This Podman host · Podman production"),
|
|
871
|
+
).toBeInTheDocument();
|
|
872
|
+
expect(screen.queryByText(/Stale Docker title/)).not.toBeInTheDocument();
|
|
873
|
+
const request: PostRequest = await sendQuestion();
|
|
874
|
+
expect(request.data["pageContext"]).toEqual({
|
|
875
|
+
type: AIChatPageContextType.Resource,
|
|
876
|
+
resourceType: AIResourceType.PodmanHost,
|
|
877
|
+
entityId: ENTITY_ID,
|
|
878
|
+
entityTitle: "Podman production",
|
|
879
|
+
});
|
|
880
|
+
});
|
|
881
|
+
});
|