@oneuptime/common 14.0.9 → 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/AutoRemediationSuggestion.ts +60 -0
- package/Models/DatabaseModels/CephCluster.ts +225 -0
- package/Models/DatabaseModels/CloudResource.ts +12 -0
- package/Models/DatabaseModels/DatabaseServer.ts +225 -0
- package/Models/DatabaseModels/DockerHost.ts +225 -0
- package/Models/DatabaseModels/DockerSwarmCluster.ts +225 -0
- package/Models/DatabaseModels/GlobalConfig.ts +1 -1
- 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 +225 -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 +16 -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 +225 -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 +225 -0
- package/Models/DatabaseModels/ResourceAiAgent.ts +419 -0
- package/Models/DatabaseModels/RumApplication.ts +12 -0
- package/Models/DatabaseModels/RunnerJob.ts +144 -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 +225 -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/AutoRemediationAPI.ts +392 -1
- package/Server/API/IncidentFormAPI.ts +376 -0
- package/Server/API/ProjectOIDC.ts +16 -25
- package/Server/API/ProjectSSO.ts +16 -24
- package/Server/API/ResourceAiAccessAPI.ts +1669 -0
- 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/1796300000000-AddResourceAiAgents.ts +423 -0
- 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 +10 -0
- package/Server/Infrastructure/Semaphore.ts +22 -0
- package/Server/Middleware/IncidentFormRateLimit.ts +847 -0
- package/Server/Middleware/TelemetryIngest.ts +15 -5
- package/Server/Middleware/UserAuthorization.ts +16 -38
- package/Server/Services/AIService.ts +10 -13
- package/Server/Services/AnalyticsDatabaseService.ts +45 -1
- package/Server/Services/AutoRemediationRuleEngineService.ts +940 -112
- package/Server/Services/CephClusterService.ts +109 -1
- package/Server/Services/DatabaseServerService.ts +116 -1
- package/Server/Services/DockerHostService.ts +109 -1
- package/Server/Services/DockerSwarmClusterService.ts +113 -1
- package/Server/Services/HostService.ts +126 -4
- 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/MetricRecordingRuleService.ts +47 -0
- package/Server/Services/OpenTelemetryIngestService.ts +37 -4
- package/Server/Services/PodmanHostService.ts +109 -1
- package/Server/Services/ProjectService.ts +0 -59
- package/Server/Services/ProxmoxClusterService.ts +110 -1
- package/Server/Services/ResourceAiAccessService.ts +1439 -0
- package/Server/Services/ResourceAiAgentJobService.ts +202 -0
- package/Server/Services/ResourceAiAgentService.ts +2432 -0
- package/Server/Services/RunnerJobService.ts +611 -4
- package/Server/Services/StatusPagePrivateUserService.ts +1 -4
- package/Server/Services/StatusPageService.ts +1 -51
- package/Server/Services/TeamComplianceSettingService.ts +163 -42
- package/Server/Services/TelemetryUsageBillingService.ts +28 -0
- package/Server/Services/TraceRecordingRuleService.ts +33 -0
- package/Server/Services/UserNotificationRuleService.ts +8 -1
- package/Server/Services/VMwareVCenterService.ts +110 -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 +1442 -34
- package/Server/Utils/AI/Remediation/RemediationExecutionRunner.ts +968 -34
- package/Server/Utils/AI/Remediation/RemediationPlanRunner.ts +25 -1
- package/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.ts +622 -0
- package/Server/Utils/AI/ResourceAccess/ResourceAccessContext.ts +271 -0
- package/Server/Utils/AI/ResourceAccess/ResourceAccessToolNames.ts +45 -0
- package/Server/Utils/AI/ResourceAccess/ResourceAiAccessSettings.ts +964 -0
- package/Server/Utils/AI/ResourceAccess/ResourceAiDeleteCleanup.ts +333 -0
- package/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.ts +882 -0
- package/Server/Utils/AI/SRE/AIInvestigationEngine.ts +125 -12
- package/Server/Utils/AI/SRE/AlertInvestigationRunner.ts +99 -15
- package/Server/Utils/AI/SRE/IncidentInvestigationRunner.ts +99 -15
- 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/AutoRemediation/CommandPlanExecutor.ts +396 -13
- package/Server/Utils/AutoRemediation/RemediationVerifier.ts +35 -2
- package/Server/Utils/Database/ProjectScopedReferenceValidator.ts +9 -1
- 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/SessionReplay/SessionReplayBudgetMetrics.ts +920 -0
- package/Server/Utils/SessionReplay/SessionReplayUsage.ts +84 -6
- 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/Alert.ts +35 -15
- package/Server/Utils/Workspace/MicrosoftTeams/Actions/AlertEpisode.ts +33 -15
- package/Server/Utils/Workspace/MicrosoftTeams/Actions/Auth.ts +21 -1
- package/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.ts +301 -225
- package/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.ts +38 -16
- package/Server/Utils/Workspace/MicrosoftTeams/Actions/ScheduledMaintenance.ts +389 -175
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +376 -144
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsActivityDeduplicator.ts +163 -0
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCardChoices.ts +396 -0
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateCommands.ts +418 -0
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsMessageSize.ts +152 -0
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsReplies.ts +251 -0
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsTimezone.ts +214 -0
- 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 +267 -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 +23 -6
- 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/InvestigationInfrastructureTools.test.tsx +506 -0
- 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/RemediationSuggestionCardDescription.test.tsx +209 -0
- package/Tests/App/Dashboard/RemediationSuggestionCardResource.test.tsx +317 -0
- package/Tests/App/Dashboard/ResourceAiAccessSettingsUtil.test.ts +921 -0
- package/Tests/App/Dashboard/ResourceAiAgentAttentionServerParity.test.ts +555 -0
- package/Tests/App/Dashboard/ResourceAiAgentInstall.test.ts +860 -0
- package/Tests/App/Dashboard/ResourceAiAgentPage.test.tsx +2010 -0
- package/Tests/App/Dashboard/ResourceAiAgentStatus.test.ts +1455 -0
- package/Tests/App/Dashboard/ResourceAiInsightsPage.test.tsx +931 -0
- package/Tests/App/Dashboard/ResourceAiNavigation.test.tsx +575 -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/RunbookStepTypeMaps.test.ts +38 -7
- 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 +61 -10
- package/Tests/Models/DatabaseModels/IncidentFormModel.test.ts +1250 -0
- package/Tests/Models/DatabaseModels/MessageQueueModels.test.ts +1983 -0
- package/Tests/Models/DatabaseModels/ResourceAiAccessColumns.test.ts +738 -0
- package/Tests/Models/DatabaseModels/ResourceAiAgentModel.test.ts +842 -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/AutoRemediationApproveResourceRound.test.ts +835 -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/ResourceAiAccessAPI.test.ts +2730 -0
- 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/AddDatabaseServerTablesMigration.test.ts +60 -0
- package/Tests/Server/Infrastructure/Postgres/AddIncidentFormsMigration.test.ts +438 -0
- package/Tests/Server/Infrastructure/Postgres/AddResourceAiAgentsMigration.test.ts +659 -0
- package/Tests/Server/Infrastructure/Postgres/AddTeamComplianceRuleNotificationChannelsMigration.test.ts +255 -0
- package/Tests/Server/Infrastructure/Postgres/MessageQueueTablesMigration.test.ts +637 -0
- package/Tests/Server/Infrastructure/SemaphoreMutex.test.ts +31 -0
- package/Tests/Server/Middleware/IncidentFormRateLimit.test.ts +1630 -0
- package/Tests/Server/Middleware/TelemetryIngestBrowserKey.test.ts +63 -5
- package/Tests/Server/Middleware/TelemetryIngestKubernetesAgentRunnerPinnedKey.test.ts +103 -5
- package/Tests/Server/Middleware/TelemetryIngestKubernetesAgentRunnerRateLimit.test.ts +19 -1
- 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/AutoRemediationResourceRuleEngine.test.ts +1279 -0
- package/Tests/Server/Services/DatabaseServerService.test.ts +55 -0
- package/Tests/Server/Services/GroupTelemetryUsageExcludeNames.test.ts +299 -0
- package/Tests/Server/Services/HostServiceFindOrCreateMemo.test.ts +44 -0
- 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/MonitorProbeServiceIntervalScheduling.test.ts +45 -6
- 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/RecordingRuleReservedMetricName.test.ts +171 -0
- package/Tests/Server/Services/ResourceAiAccessChangeAuthorization.test.ts +256 -0
- package/Tests/Server/Services/ResourceAiAccessService.test.ts +1373 -0
- package/Tests/Server/Services/ResourceAiAgentJobService.test.ts +375 -0
- package/Tests/Server/Services/ResourceAiAgentServiceHelpers.test.ts +1114 -0
- package/Tests/Server/Services/ResourceAiAgentServiceLifecycle.test.ts +1050 -0
- package/Tests/Server/Services/ResourceAiAgentServiceRegister.test.ts +2251 -0
- package/Tests/Server/Services/ResourceAiSettingsCreate.test.ts +373 -0
- package/Tests/Server/Services/ResourceAiSettingsPermission.test.ts +1042 -0
- package/Tests/Server/Services/ResourceServiceDeleteCleansUpAi.test.ts +319 -0
- package/Tests/Server/Services/RuleRun/LabelRuleEnginesGroupBRun.test.ts +56 -6
- package/Tests/Server/Services/RuleRun/OwnerRuleEnginesGroupBRun.test.ts +30 -1
- package/Tests/Server/Services/RunnerJobEnqueueKubectl.test.ts +105 -0
- package/Tests/Server/Services/RunnerJobEnqueueResourceCommand.test.ts +986 -0
- package/Tests/Server/Services/RunnerJobResourceCommandLane.test.ts +211 -0
- package/Tests/Server/Services/RunnerJobResourceCommandTimeoutAndRedaction.test.ts +352 -0
- 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/Services/TelemetryUsageBillingSloExclusion.test.ts +218 -0
- package/Tests/Server/TestingUtils/Services/FakeRunnerJobCount.ts +145 -0
- 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 +694 -0
- package/Tests/Server/Utils/AI/InvestigationInfrastructureReport.test.ts +721 -0
- 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/RemediationCommandTools.test.ts +94 -1
- package/Tests/Server/Utils/AI/RemediationCommandToolsResource.test.ts +1530 -0
- package/Tests/Server/Utils/AI/RemediationExecutionRunner.test.ts +14 -25
- package/Tests/Server/Utils/AI/RemediationExecutionRunnerResourceMode.test.ts +1251 -0
- package/Tests/Server/Utils/AI/RemediationPlanRunner.test.ts +117 -0
- package/Tests/Server/Utils/AI/RemediationResourceCopyParity.test.ts +463 -0
- package/Tests/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.test.ts +1004 -0
- package/Tests/Server/Utils/AI/ResourceAccess/ResourceAccessContext.test.ts +266 -0
- package/Tests/Server/Utils/AI/ResourceAccess/ResourceAiAccessSettings.test.ts +1220 -0
- package/Tests/Server/Utils/AI/ResourceAccess/ResourceAiDeleteCleanup.test.ts +569 -0
- package/Tests/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.test.ts +834 -0
- 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/AutoRemediation/CommandPlanExecutorResource.test.ts +717 -0
- package/Tests/Server/Utils/AutoRemediation/RemediationVerifierResourceFollowUp.test.ts +338 -0
- package/Tests/Server/Utils/EditionEnforcement.test.ts +107 -147
- package/Tests/Server/Utils/Monitor/Criteria/SessionReplayBudgetTemplateCriteria.test.ts +422 -0
- 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/SessionReplay/SessionReplayBudgetMetrics.test.ts +1647 -0
- package/Tests/Server/Utils/SessionReplay/SessionReplayUsage.test.ts +143 -1
- 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/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.test.ts +33 -3
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsAccountNotLinked.test.ts +1093 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsActivityDeduplicator.test.ts +1049 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCardChoices.test.ts +1676 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateCards.test.ts +2884 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateCommands.test.ts +2490 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateSubmit.test.ts +2293 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateSubmitServerTimezone.test.ts +386 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsMessageSize.test.ts +1477 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsReplies.test.ts +1967 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsStripHtmlTags.test.ts +92 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsSubmittedFormRemoval.test.ts +1819 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsTimezone.test.ts +1033 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsTimezoneServerZone.test.ts +610 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsBotMessageHandling.test.ts +2610 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsCreateCommandsEndToEnd.test.ts +4672 -0
- package/Tests/Server/Utils/Workspace/WorkspaceCreateProjectReferences.test.ts +190 -65
- package/Tests/Types/AI/AIAgentRunLimits.test.ts +255 -0
- package/Tests/Types/AutoRemediation/AiRemediationCommandPlan.test.ts +10 -4
- package/Tests/Types/AutoRemediation/AiRemediationCommandPlanResourceCommand.test.ts +305 -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/Monitor/Recommendation/MonitorRecommendationCatalog.test.ts +277 -13
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationUtil.test.ts +113 -0
- package/Tests/Types/Monitor/RumAlertTemplates.test.ts +773 -2
- package/Tests/Types/ResourceAiAgent/AiResourceType.test.ts +419 -0
- package/Tests/Types/ResourceAiAgent/ResourceAiAccess.test.ts +519 -0
- package/Tests/Types/Runbook/RunbookStepType.test.ts +147 -8
- 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/Rum/RecordingHealthDashboard.test.tsx +769 -1
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +81 -1
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +17 -0
- package/Tests/Utils/AiRemediation/Resource/CephCommandPolicy.test.ts +1653 -0
- package/Tests/Utils/AiRemediation/Resource/CephOutputRedaction.test.ts +204 -0
- package/Tests/Utils/AiRemediation/Resource/DatabaseCommandPolicy.test.ts +1077 -0
- package/Tests/Utils/AiRemediation/Resource/DatabaseDiagnosticCatalog.test.ts +558 -0
- package/Tests/Utils/AiRemediation/Resource/DatabaseQueryRedactor.test.ts +834 -0
- package/Tests/Utils/AiRemediation/Resource/DockerCliGrammar.test.ts +747 -0
- package/Tests/Utils/AiRemediation/Resource/DockerEngineCommandPolicy.test.ts +1259 -0
- package/Tests/Utils/AiRemediation/Resource/DockerOutputRedaction.test.ts +386 -0
- package/Tests/Utils/AiRemediation/Resource/DockerSwarmCommandPolicy.test.ts +782 -0
- package/Tests/Utils/AiRemediation/Resource/GovcCommandPolicy.test.ts +2259 -0
- package/Tests/Utils/AiRemediation/Resource/HostCommandPolicy.test.ts +2019 -0
- package/Tests/Utils/AiRemediation/Resource/ProxmoxCommandPolicy.test.ts +2497 -0
- package/Tests/Utils/AiRemediation/Resource/ResourceCommandPolicy.test.ts +1305 -0
- package/Tests/Utils/AiRemediation/Resource/ResourceCommandPolicyCore.test.ts +585 -0
- package/Tests/Utils/AiRemediation/Resource/ResourceOutputRedactor.test.ts +334 -0
- package/Tests/Utils/AiRemediation/Resource/ResourceOutputRedactorCopyParity.test.ts +98 -0
- package/Tests/Utils/AiRemediation/Resource/ResourcePolicyImportClosure.test.ts +391 -0
- package/Tests/Utils/AiRemediation/ResourceAiAgentPolicyCopyParity.test.ts +497 -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/Tests/Utils/SessionReplay/SessionReplayBudgetMetricType.test.ts +383 -0
- package/Types/AI/AIAgentRunLimits.ts +146 -0
- package/Types/AI/ResourceAiAccessApi.ts +140 -0
- package/Types/AI/ResourceAiAccessPermissions.ts +126 -0
- package/Types/AutoRemediation/AiRemediationCommandPlan.ts +183 -2
- 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/Monitor/Recommendation/MonitorRecommendationCatalog.ts +55 -22
- package/Types/Monitor/Recommendation/MonitorRecommendationTypes.ts +35 -3
- package/Types/Monitor/RumAlertTemplates.ts +351 -4
- package/Types/Permission.ts +310 -0
- package/Types/ResourceAiAgent/AiResourceType.ts +310 -0
- package/Types/ResourceAiAgent/ResourceAiAccess.ts +580 -0
- package/Types/Rules/RuleCriteriaFieldRegistry.ts +12 -0
- package/Types/Rules/RuleRun.ts +4 -0
- package/Types/Rum/SessionReplayBudgetMetricType.ts +47 -0
- package/Types/Runbook/RunbookStepType.ts +29 -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/Telemetry/TelemetryIngestSurface.ts +14 -2
- 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/AI/InvestigationReport.ts +121 -15
- package/Utils/AiRemediation/Resource/CephCommandPolicy.ts +1936 -0
- package/Utils/AiRemediation/Resource/DatabaseCommandPolicy.ts +166 -0
- package/Utils/AiRemediation/Resource/DatabaseDiagnosticCatalog.ts +1532 -0
- package/Utils/AiRemediation/Resource/DatabaseQueryRedactor.ts +1394 -0
- package/Utils/AiRemediation/Resource/DockerCliGrammar.ts +1839 -0
- package/Utils/AiRemediation/Resource/DockerEngineCommandPolicy.ts +490 -0
- package/Utils/AiRemediation/Resource/DockerSwarmCommandPolicy.ts +687 -0
- package/Utils/AiRemediation/Resource/GovcCommandPolicy.ts +2096 -0
- package/Utils/AiRemediation/Resource/HostCommandPolicy.ts +2982 -0
- package/Utils/AiRemediation/Resource/ProxmoxCommandPolicy.ts +1679 -0
- package/Utils/AiRemediation/Resource/ResourceCommandPolicy.ts +851 -0
- package/Utils/AiRemediation/Resource/ResourceCommandPolicyCore.ts +593 -0
- package/Utils/AiRemediation/Resource/ResourceOutputRedactor.ts +2812 -0
- 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/SessionReplay/SessionReplayBudgetMetricType.ts +184 -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/AutoRemediationSuggestion.js +62 -0
- package/build/dist/Models/DatabaseModels/AutoRemediationSuggestion.js.map +1 -1
- package/build/dist/Models/DatabaseModels/CephCluster.js +231 -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 +231 -0
- package/build/dist/Models/DatabaseModels/DatabaseServer.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DockerHost.js +231 -0
- package/build/dist/Models/DatabaseModels/DockerHost.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DockerSwarmCluster.js +231 -0
- package/build/dist/Models/DatabaseModels/DockerSwarmCluster.js.map +1 -1
- package/build/dist/Models/DatabaseModels/GlobalConfig.js +1 -1
- package/build/dist/Models/DatabaseModels/GlobalConfig.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 +231 -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 +16 -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 +231 -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 +231 -0
- package/build/dist/Models/DatabaseModels/ProxmoxCluster.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ResourceAiAgent.js +439 -0
- package/build/dist/Models/DatabaseModels/ResourceAiAgent.js.map +1 -0
- package/build/dist/Models/DatabaseModels/RumApplication.js +12 -0
- package/build/dist/Models/DatabaseModels/RumApplication.js.map +1 -1
- package/build/dist/Models/DatabaseModels/RunnerJob.js +145 -0
- package/build/dist/Models/DatabaseModels/RunnerJob.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 +231 -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/AutoRemediationAPI.js +231 -1
- package/build/dist/Server/API/AutoRemediationAPI.js.map +1 -1
- 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/ResourceAiAccessAPI.js +1119 -0
- package/build/dist/Server/API/ResourceAiAccessAPI.js.map +1 -0
- 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/1796300000000-AddResourceAiAgents.js +168 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796300000000-AddResourceAiAgents.js.map +1 -0
- 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 +10 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Infrastructure/Semaphore.js +6 -0
- package/build/dist/Server/Infrastructure/Semaphore.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/TelemetryIngest.js +12 -5
- package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
- 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/AnalyticsDatabaseService.js +26 -1
- package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
- package/build/dist/Server/Services/AutoRemediationRuleEngineService.js +601 -3
- package/build/dist/Server/Services/AutoRemediationRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CephClusterService.js +104 -0
- package/build/dist/Server/Services/CephClusterService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseServerService.js +99 -0
- package/build/dist/Server/Services/DatabaseServerService.js.map +1 -1
- package/build/dist/Server/Services/DockerHostService.js +104 -0
- package/build/dist/Server/Services/DockerHostService.js.map +1 -1
- package/build/dist/Server/Services/DockerSwarmClusterService.js +104 -0
- package/build/dist/Server/Services/DockerSwarmClusterService.js.map +1 -1
- package/build/dist/Server/Services/HostService.js +114 -2
- package/build/dist/Server/Services/HostService.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/MetricRecordingRuleService.js +46 -0
- package/build/dist/Server/Services/MetricRecordingRuleService.js.map +1 -1
- package/build/dist/Server/Services/OpenTelemetryIngestService.js +25 -4
- package/build/dist/Server/Services/OpenTelemetryIngestService.js.map +1 -1
- package/build/dist/Server/Services/PodmanHostService.js +104 -0
- package/build/dist/Server/Services/PodmanHostService.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/ProxmoxClusterService.js +104 -0
- package/build/dist/Server/Services/ProxmoxClusterService.js.map +1 -1
- package/build/dist/Server/Services/ResourceAiAccessService.js +1028 -0
- package/build/dist/Server/Services/ResourceAiAccessService.js.map +1 -0
- package/build/dist/Server/Services/ResourceAiAgentJobService.js +173 -0
- package/build/dist/Server/Services/ResourceAiAgentJobService.js.map +1 -0
- package/build/dist/Server/Services/ResourceAiAgentService.js +1687 -0
- package/build/dist/Server/Services/ResourceAiAgentService.js.map +1 -0
- package/build/dist/Server/Services/RunnerJobService.js +344 -5
- package/build/dist/Server/Services/RunnerJobService.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/TelemetryUsageBillingService.js +26 -0
- package/build/dist/Server/Services/TelemetryUsageBillingService.js.map +1 -1
- package/build/dist/Server/Services/TraceRecordingRuleService.js +37 -0
- package/build/dist/Server/Services/TraceRecordingRuleService.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/VMwareVCenterService.js +104 -0
- package/build/dist/Server/Services/VMwareVCenterService.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 +1036 -32
- package/build/dist/Server/Utils/AI/Remediation/RemediationCommandTools.js.map +1 -1
- package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js +661 -41
- package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/Remediation/RemediationPlanRunner.js +21 -1
- package/build/dist/Server/Utils/AI/Remediation/RemediationPlanRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.js +354 -0
- package/build/dist/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.js.map +1 -0
- package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAccessContext.js +160 -0
- package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAccessContext.js.map +1 -0
- package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAccessToolNames.js +33 -0
- package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAccessToolNames.js.map +1 -0
- package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAiAccessSettings.js +640 -0
- package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAiAccessSettings.js.map +1 -0
- package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAiDeleteCleanup.js +226 -0
- package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAiDeleteCleanup.js.map +1 -0
- package/build/dist/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.js +602 -0
- package/build/dist/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js +90 -14
- package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js +73 -10
- package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js +73 -10
- 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/AutoRemediation/CommandPlanExecutor.js +290 -13
- package/build/dist/Server/Utils/AutoRemediation/CommandPlanExecutor.js.map +1 -1
- package/build/dist/Server/Utils/AutoRemediation/RemediationVerifier.js +29 -1
- package/build/dist/Server/Utils/AutoRemediation/RemediationVerifier.js.map +1 -1
- package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js +9 -1
- package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.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/SessionReplay/SessionReplayBudgetMetrics.js +627 -0
- package/build/dist/Server/Utils/SessionReplay/SessionReplayBudgetMetrics.js.map +1 -0
- package/build/dist/Server/Utils/SessionReplay/SessionReplayUsage.js +60 -5
- package/build/dist/Server/Utils/SessionReplay/SessionReplayUsage.js.map +1 -1
- 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/Alert.js +19 -15
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Alert.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/AlertEpisode.js +19 -15
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/AlertEpisode.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Auth.js +17 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Auth.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.js +186 -210
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.js +22 -16
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/ScheduledMaintenance.js +233 -167
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/ScheduledMaintenance.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +273 -111
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsActivityDeduplicator.js +129 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsActivityDeduplicator.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCardChoices.js +266 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCardChoices.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateCommands.js +258 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateCommands.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsMessageSize.js +104 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsMessageSize.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsReplies.js +183 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsReplies.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsTimezone.js +123 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsTimezone.js.map +1 -0
- package/build/dist/Types/AI/AIAgentRunLimits.js +91 -0
- package/build/dist/Types/AI/AIAgentRunLimits.js.map +1 -0
- package/build/dist/Types/AI/ResourceAiAccessApi.js +30 -0
- package/build/dist/Types/AI/ResourceAiAccessApi.js.map +1 -0
- package/build/dist/Types/AI/ResourceAiAccessPermissions.js +98 -0
- package/build/dist/Types/AI/ResourceAiAccessPermissions.js.map +1 -0
- package/build/dist/Types/AutoRemediation/AiRemediationCommandPlan.js +116 -29
- package/build/dist/Types/AutoRemediation/AiRemediationCommandPlan.js.map +1 -1
- 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/Monitor/Recommendation/MonitorRecommendationCatalog.js +47 -21
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js +5 -0
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js.map +1 -1
- package/build/dist/Types/Monitor/RumAlertTemplates.js +199 -3
- package/build/dist/Types/Monitor/RumAlertTemplates.js.map +1 -1
- package/build/dist/Types/Permission.js +274 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/ResourceAiAgent/AiResourceType.js +242 -0
- package/build/dist/Types/ResourceAiAgent/AiResourceType.js.map +1 -0
- package/build/dist/Types/ResourceAiAgent/ResourceAiAccess.js +281 -0
- package/build/dist/Types/ResourceAiAgent/ResourceAiAccess.js.map +1 -0
- 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/Rum/SessionReplayBudgetMetricType.js +45 -0
- package/build/dist/Types/Rum/SessionReplayBudgetMetricType.js.map +1 -0
- package/build/dist/Types/Runbook/RunbookStepType.js +27 -0
- package/build/dist/Types/Runbook/RunbookStepType.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/Telemetry/TelemetryIngestSurface.js +13 -2
- package/build/dist/Types/Telemetry/TelemetryIngestSurface.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/AI/InvestigationReport.js +71 -11
- package/build/dist/Utils/AI/InvestigationReport.js.map +1 -1
- package/build/dist/Utils/AiRemediation/Resource/CephCommandPolicy.js +1462 -0
- package/build/dist/Utils/AiRemediation/Resource/CephCommandPolicy.js.map +1 -0
- package/build/dist/Utils/AiRemediation/Resource/DatabaseCommandPolicy.js +122 -0
- package/build/dist/Utils/AiRemediation/Resource/DatabaseCommandPolicy.js.map +1 -0
- package/build/dist/Utils/AiRemediation/Resource/DatabaseDiagnosticCatalog.js +1139 -0
- package/build/dist/Utils/AiRemediation/Resource/DatabaseDiagnosticCatalog.js.map +1 -0
- package/build/dist/Utils/AiRemediation/Resource/DatabaseQueryRedactor.js +1060 -0
- package/build/dist/Utils/AiRemediation/Resource/DatabaseQueryRedactor.js.map +1 -0
- package/build/dist/Utils/AiRemediation/Resource/DockerCliGrammar.js +1301 -0
- package/build/dist/Utils/AiRemediation/Resource/DockerCliGrammar.js.map +1 -0
- package/build/dist/Utils/AiRemediation/Resource/DockerEngineCommandPolicy.js +370 -0
- package/build/dist/Utils/AiRemediation/Resource/DockerEngineCommandPolicy.js.map +1 -0
- package/build/dist/Utils/AiRemediation/Resource/DockerSwarmCommandPolicy.js +498 -0
- package/build/dist/Utils/AiRemediation/Resource/DockerSwarmCommandPolicy.js.map +1 -0
- package/build/dist/Utils/AiRemediation/Resource/GovcCommandPolicy.js +1565 -0
- package/build/dist/Utils/AiRemediation/Resource/GovcCommandPolicy.js.map +1 -0
- package/build/dist/Utils/AiRemediation/Resource/HostCommandPolicy.js +2206 -0
- package/build/dist/Utils/AiRemediation/Resource/HostCommandPolicy.js.map +1 -0
- package/build/dist/Utils/AiRemediation/Resource/ProxmoxCommandPolicy.js +1129 -0
- package/build/dist/Utils/AiRemediation/Resource/ProxmoxCommandPolicy.js.map +1 -0
- package/build/dist/Utils/AiRemediation/Resource/ResourceCommandPolicy.js +565 -0
- package/build/dist/Utils/AiRemediation/Resource/ResourceCommandPolicy.js.map +1 -0
- package/build/dist/Utils/AiRemediation/Resource/ResourceCommandPolicyCore.js +408 -0
- package/build/dist/Utils/AiRemediation/Resource/ResourceCommandPolicyCore.js.map +1 -0
- package/build/dist/Utils/AiRemediation/Resource/ResourceOutputRedactor.js +1910 -0
- package/build/dist/Utils/AiRemediation/Resource/ResourceOutputRedactor.js.map +1 -0
- 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/SessionReplay/SessionReplayBudgetMetricType.js +160 -0
- package/build/dist/Utils/SessionReplay/SessionReplayBudgetMetricType.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
|
@@ -0,0 +1,1463 @@
|
|
|
1
|
+
import DatabaseService from "./DatabaseService";
|
|
2
|
+
import MessageQueueLabelRuleEngineService from "./MessageQueueLabelRuleEngineService";
|
|
3
|
+
import MessageQueueOwnerRuleEngineService from "./MessageQueueOwnerRuleEngineService";
|
|
4
|
+
import BaseModel from "../../Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel";
|
|
5
|
+
import Model, {
|
|
6
|
+
MessageQueueDiscoverySource,
|
|
7
|
+
MessageQueueSightingSource,
|
|
8
|
+
} from "../../Models/DatabaseModels/MessageQueue";
|
|
9
|
+
import DatabaseConfig from "../DatabaseConfig";
|
|
10
|
+
import CreateBy from "../Types/Database/CreateBy";
|
|
11
|
+
import { OnCreate, OnUpdate } from "../Types/Database/Hooks";
|
|
12
|
+
import ModelPermission from "../Types/Database/Permissions/Index";
|
|
13
|
+
import Select from "../Types/Database/Select";
|
|
14
|
+
import RelationIdUtil from "../Utils/Database/RelationIdUtil";
|
|
15
|
+
import {
|
|
16
|
+
truncateLongText,
|
|
17
|
+
truncateShortText,
|
|
18
|
+
} from "../Utils/Database/TruncateColumnValue";
|
|
19
|
+
import InProcessMemo from "../Utils/InProcessMemo";
|
|
20
|
+
import logger, { LogAttributes } from "../Utils/Logger";
|
|
21
|
+
import ResourceFeedUtil from "../Utils/ResourceFeed/ResourceFeedUtil";
|
|
22
|
+
import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
|
|
23
|
+
import ResourceHeartbeat from "../Utils/Telemetry/ResourceHeartbeat";
|
|
24
|
+
import URL from "../../Types/API/URL";
|
|
25
|
+
import DatabaseCommonInteractionProps from "../../Types/BaseDatabase/DatabaseCommonInteractionProps";
|
|
26
|
+
import PartialEntity from "../../Types/Database/PartialEntity";
|
|
27
|
+
import OneUptimeDate from "../../Types/Date";
|
|
28
|
+
import BadDataException from "../../Types/Exception/BadDataException";
|
|
29
|
+
import { JSONObject } from "../../Types/JSON";
|
|
30
|
+
import {
|
|
31
|
+
MESSAGE_QUEUE_DISPLAY_NAME_MAX_LENGTH,
|
|
32
|
+
MessageQueueIdentity,
|
|
33
|
+
buildMessageQueueDisplayName,
|
|
34
|
+
buildMessageQueueIdentifier,
|
|
35
|
+
hasControlCharacter,
|
|
36
|
+
toMessageQueueIdentity,
|
|
37
|
+
} from "../../Types/MessageQueue/MessageQueueIdentity";
|
|
38
|
+
import {
|
|
39
|
+
ManualMessageQueue,
|
|
40
|
+
quoteManualMessageQueueInput,
|
|
41
|
+
resolveManualMessageQueue,
|
|
42
|
+
} from "../../Types/MessageQueue/MessageQueueManualIdentity";
|
|
43
|
+
import {
|
|
44
|
+
getMessagingIdentitySystem,
|
|
45
|
+
getMessagingSystemDisplayName,
|
|
46
|
+
getMoreSpecificMessagingSystem,
|
|
47
|
+
normalizeMessagingSystem,
|
|
48
|
+
} from "../../Types/MessageQueue/MessagingSystem";
|
|
49
|
+
import ObjectID from "../../Types/ObjectID";
|
|
50
|
+
import { canonicalizeEntityValue } from "../../Utils/Telemetry/EntityKey";
|
|
51
|
+
import crypto from "crypto";
|
|
52
|
+
|
|
53
|
+
/*
|
|
54
|
+
* Two sightings, two namespaces: a queue named in an application's spans is a
|
|
55
|
+
* different fact from the broker reporting on it, and one must never be able
|
|
56
|
+
* to suppress the other inside a window - brokerMetricsLastSeenAt would stop
|
|
57
|
+
* moving while spans keep arriving.
|
|
58
|
+
*/
|
|
59
|
+
const TRACE_SIGHTING_CACHE_NAMESPACE: string = "message-queue-trace-sighting";
|
|
60
|
+
const BROKER_METRICS_SIGHTING_CACHE_NAMESPACE: string =
|
|
61
|
+
"message-queue-broker-metrics-sighting";
|
|
62
|
+
const SIGHTING_THROTTLE_SECONDS: number = 60;
|
|
63
|
+
|
|
64
|
+
const DEFAULT_AUTO_ARCHIVE_DAYS: number = 7;
|
|
65
|
+
const MIN_AUTO_ARCHIVE_DAYS: number = 1;
|
|
66
|
+
// Rows archived per sweep; the rest wait for the next five-minute run.
|
|
67
|
+
const AUTO_ARCHIVE_BATCH_SIZE: number = 500;
|
|
68
|
+
|
|
69
|
+
/*
|
|
70
|
+
* A person's Restore holds the sweep off this long (or the archive window,
|
|
71
|
+
* if that is longer) unless discovery sees the queue again first.
|
|
72
|
+
*/
|
|
73
|
+
const MANUAL_RESTORE_GRACE_DAYS: number = 30;
|
|
74
|
+
|
|
75
|
+
const DEFAULT_AUTO_CREATE_BUDGET: number = 500;
|
|
76
|
+
|
|
77
|
+
/*
|
|
78
|
+
* The auto-create budget as the discovery path reads it: one count per
|
|
79
|
+
* project per minute per process, bumped locally by every create in
|
|
80
|
+
* between, so a burst of new destinations stops at the budget instead of a
|
|
81
|
+
* minute's worth past it.
|
|
82
|
+
*/
|
|
83
|
+
const AUTO_CREATE_BUDGET_CACHE_MS: number = 60 * 1000;
|
|
84
|
+
// One "budget reached" warning per project per ten minutes per process.
|
|
85
|
+
const AUTO_CREATE_BUDGET_WARNING_MS: number = 10 * 60 * 1000;
|
|
86
|
+
|
|
87
|
+
const MANUAL_DISCOVERY_SOURCE: MessageQueueDiscoverySource = "manual";
|
|
88
|
+
|
|
89
|
+
/*
|
|
90
|
+
* The columns discovery reads back: enough to key telemetry (id, project,
|
|
91
|
+
* identifier), name it, refine its system and decide on archive handling.
|
|
92
|
+
*/
|
|
93
|
+
const DISCOVERY_SELECT: Select<Model> = {
|
|
94
|
+
_id: true,
|
|
95
|
+
projectId: true,
|
|
96
|
+
name: true,
|
|
97
|
+
queueIdentifier: true,
|
|
98
|
+
messagingSystem: true,
|
|
99
|
+
destinationName: true,
|
|
100
|
+
brokerScope: true,
|
|
101
|
+
discoverySource: true,
|
|
102
|
+
isArchived: true,
|
|
103
|
+
autoArchivedAt: true,
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
/*
|
|
107
|
+
* A discovered row's name as discovery wrote it (buildMessageQueueDisplayName
|
|
108
|
+
* of its destinationName): the destination itself, or - past the name
|
|
109
|
+
* column's width - its first characters, trailing spaces trimmed, and "…".
|
|
110
|
+
* A person renaming a queue is investing in it; this is how the sweep tells.
|
|
111
|
+
* Postgres counts code points and trims only spaces where the TypeScript
|
|
112
|
+
* counts UTF-16 units and trims any whitespace, so a long destination full
|
|
113
|
+
* of astral characters can read as renamed - never archived - which is the
|
|
114
|
+
* safe side to err on.
|
|
115
|
+
*/
|
|
116
|
+
const DISCOVERY_NAMED_PREDICATE: string = `(mq."name" = mq."destinationName"
|
|
117
|
+
OR (
|
|
118
|
+
char_length(mq."destinationName") > ${MESSAGE_QUEUE_DISPLAY_NAME_MAX_LENGTH}
|
|
119
|
+
AND mq."name" = rtrim(left(mq."destinationName", ${
|
|
120
|
+
MESSAGE_QUEUE_DISPLAY_NAME_MAX_LENGTH - 1
|
|
121
|
+
})) || '…'
|
|
122
|
+
))`;
|
|
123
|
+
|
|
124
|
+
/*
|
|
125
|
+
* "Nobody invested in this row", as one SQL predicate over `mq` (a
|
|
126
|
+
* MessageQueue row): no description, still the name discovery gave it, and
|
|
127
|
+
* no label or owner a person added - each checked against the row's own
|
|
128
|
+
* project and live rows only. Labels and owners that rules attached on
|
|
129
|
+
* their own (automaticAssignments) do not count: a catch-all rule would
|
|
130
|
+
* otherwise keep every discovered queue alive forever.
|
|
131
|
+
*/
|
|
132
|
+
const UNTOUCHED_MESSAGE_QUEUE_PREDICATE: string = `(mq."description" IS NULL OR btrim(mq."description") = '')
|
|
133
|
+
AND ${DISCOVERY_NAMED_PREDICATE}
|
|
134
|
+
AND NOT EXISTS (
|
|
135
|
+
SELECT 1 FROM "MessageQueueLabel" l
|
|
136
|
+
INNER JOIN "Label" lbl ON lbl."_id" = l."labelId"
|
|
137
|
+
WHERE l."messageQueueId" = mq."_id"
|
|
138
|
+
AND lbl."projectId" = mq."projectId"
|
|
139
|
+
AND lbl."deletedAt" IS NULL
|
|
140
|
+
AND NOT (COALESCE(mq."automaticAssignments" -> 'labelIds', '[]'::jsonb) @> jsonb_build_array(l."labelId"::text))
|
|
141
|
+
)
|
|
142
|
+
AND NOT EXISTS (
|
|
143
|
+
SELECT 1 FROM "MessageQueueOwnerUser" ou
|
|
144
|
+
WHERE ou."messageQueueId" = mq."_id"
|
|
145
|
+
AND ou."projectId" = mq."projectId"
|
|
146
|
+
AND ou."deletedAt" IS NULL
|
|
147
|
+
AND NOT (COALESCE(mq."automaticAssignments" -> 'ownerUserIds', '[]'::jsonb) @> jsonb_build_array(ou."userId"::text))
|
|
148
|
+
)
|
|
149
|
+
AND NOT EXISTS (
|
|
150
|
+
SELECT 1 FROM "MessageQueueOwnerTeam" ot
|
|
151
|
+
WHERE ot."messageQueueId" = mq."_id"
|
|
152
|
+
AND ot."projectId" = mq."projectId"
|
|
153
|
+
AND ot."deletedAt" IS NULL
|
|
154
|
+
AND NOT (COALESCE(mq."automaticAssignments" -> 'ownerTeamIds', '[]'::jsonb) @> jsonb_build_array(ot."teamId"::text))
|
|
155
|
+
)`;
|
|
156
|
+
|
|
157
|
+
/*
|
|
158
|
+
* The labels and owners rules attach on their own, recorded per row in
|
|
159
|
+
* MessageQueue.automaticAssignments under these keys.
|
|
160
|
+
*/
|
|
161
|
+
export type MessageQueueAutomaticAssignmentKind =
|
|
162
|
+
| "labelIds"
|
|
163
|
+
| "ownerUserIds"
|
|
164
|
+
| "ownerTeamIds";
|
|
165
|
+
|
|
166
|
+
const AUTOMATIC_ASSIGNMENT_KINDS: ReadonlyArray<MessageQueueAutomaticAssignmentKind> =
|
|
167
|
+
["labelIds", "ownerUserIds", "ownerTeamIds"];
|
|
168
|
+
|
|
169
|
+
export interface FindOrCreateMessageQueueByIdentityData {
|
|
170
|
+
projectId: ObjectID;
|
|
171
|
+
/*
|
|
172
|
+
* The canonical identity (toMessageQueueIdentity): keyed on the system's
|
|
173
|
+
* identity FAMILY - an ActiveMQ queue's identity says "jms".
|
|
174
|
+
*/
|
|
175
|
+
identity: MessageQueueIdentity;
|
|
176
|
+
/*
|
|
177
|
+
* The sighting's SPECIFIC canonical system ("activemq" while
|
|
178
|
+
* identity.system is the "jms" family). A new row stores it; an existing
|
|
179
|
+
* row is refined to it when it is more specific within the family.
|
|
180
|
+
*/
|
|
181
|
+
system: string;
|
|
182
|
+
// The destination for display, as the sighting spells it (original casing).
|
|
183
|
+
destination: string;
|
|
184
|
+
// Display only; a new row starts with it, later sightings go through recordSighting.
|
|
185
|
+
brokerAddress?: string | null | undefined;
|
|
186
|
+
source: MessageQueueSightingSource;
|
|
187
|
+
// False: only an existing row is returned (and sighted) - nothing is created.
|
|
188
|
+
allowCreate: boolean;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
export interface MessageQueueFindOrCreateResult {
|
|
192
|
+
queue: Model | null;
|
|
193
|
+
// True only for the call whose insert won: it ran the rule engines.
|
|
194
|
+
created: boolean;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
export interface RecordMessageQueueSightingData {
|
|
198
|
+
projectId: ObjectID;
|
|
199
|
+
queueId: ObjectID;
|
|
200
|
+
source: MessageQueueSightingSource;
|
|
201
|
+
brokerAddress?: string | null | undefined;
|
|
202
|
+
/*
|
|
203
|
+
* Broker metrics only: when the newest datapoint the pass saw was taken,
|
|
204
|
+
* stored as brokerMetricsLastSeenAt. Defaults to now, never later than
|
|
205
|
+
* now. lastSeenAt is always the time of the call (see recordSighting).
|
|
206
|
+
*/
|
|
207
|
+
at?: Date | undefined;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
interface AutoCreateCount {
|
|
211
|
+
count: number;
|
|
212
|
+
readAtMs: number;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/*
|
|
216
|
+
* A manual create's identity. The create form previews it in the browser,
|
|
217
|
+
* so it is resolved in Common/Types/MessageQueue (MessageQueueManualIdentity)
|
|
218
|
+
* and re-exported here, where the service's callers have always found it.
|
|
219
|
+
*/
|
|
220
|
+
export type { ManualMessageQueue };
|
|
221
|
+
export { resolveManualMessageQueue };
|
|
222
|
+
|
|
223
|
+
/*
|
|
224
|
+
* The Queues product's root service. A MessageQueue row is found and created
|
|
225
|
+
* by IDENTITY (queueIdentifier - system family, Azure namespace and
|
|
226
|
+
* destination, canonical), never by name: "orders" can be a Kafka topic and
|
|
227
|
+
* a RabbitMQ queue, and a person can rename any row.
|
|
228
|
+
*
|
|
229
|
+
* Invariants every discovery path relies on:
|
|
230
|
+
* - the (projectId, queueIdentifier) unique index is the only arbiter of a
|
|
231
|
+
* race: the loser of an insert re-reads the winner's row, and only the
|
|
232
|
+
* winner runs the rule engines;
|
|
233
|
+
* - a row's messagingSystem stays inside the identity family its
|
|
234
|
+
* identifier names, and only ever becomes more specific (jms ->
|
|
235
|
+
* activemq, never back);
|
|
236
|
+
* - discovery only ever un-archives a row it archived itself
|
|
237
|
+
* (autoArchivedAt), never one a person archived;
|
|
238
|
+
* - discovery stops creating rows once a project holds
|
|
239
|
+
* getAutoCreateBudget() live, non-archived discovered queues.
|
|
240
|
+
*/
|
|
241
|
+
export class Service extends DatabaseService<Model> {
|
|
242
|
+
// Per project: its auto-created row count, as last read.
|
|
243
|
+
private autoCreateCountMemo: InProcessMemo<AutoCreateCount> =
|
|
244
|
+
new InProcessMemo<AutoCreateCount>({
|
|
245
|
+
ttlInMs: AUTO_CREATE_BUDGET_CACHE_MS,
|
|
246
|
+
maxEntries: 10_000,
|
|
247
|
+
});
|
|
248
|
+
|
|
249
|
+
// Per project: a "budget reached" warning was logged recently.
|
|
250
|
+
private autoCreateBudgetWarningMemo: InProcessMemo<boolean> =
|
|
251
|
+
new InProcessMemo<boolean>({
|
|
252
|
+
ttlInMs: AUTO_CREATE_BUDGET_WARNING_MS,
|
|
253
|
+
maxEntries: 10_000,
|
|
254
|
+
});
|
|
255
|
+
|
|
256
|
+
public constructor() {
|
|
257
|
+
super(Model);
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
/*
|
|
261
|
+
* A person adding a queue from the dashboard or the API. Root creates -
|
|
262
|
+
* discovery - pass through untouched: they compute identity themselves.
|
|
263
|
+
*
|
|
264
|
+
* Everything set here is a user-creatable column on the model (name,
|
|
265
|
+
* messagingSystem, destinationName, brokerScope, queueIdentifier,
|
|
266
|
+
* discoverySource), because the column permission check runs after this
|
|
267
|
+
* hook. Setting a root-only column here would refuse every manual create.
|
|
268
|
+
*
|
|
269
|
+
* The create permission is checked FIRST, before any lookup: the refusal
|
|
270
|
+
* for a duplicate names a queue, and a caller who may not add a queue must
|
|
271
|
+
* not be able to use it to learn what exists.
|
|
272
|
+
*
|
|
273
|
+
* The typed system and destination go through the same normalization
|
|
274
|
+
* discovery applies (resolveManualMessageQueue), so the row keys the same
|
|
275
|
+
* identity the queue's own telemetry builds - an SQS queue URL is keyed by
|
|
276
|
+
* its name, a Pulsar short name by its persistent:// topic, a RabbitMQ
|
|
277
|
+
* queue by its whole name, as its broker's metrics key it.
|
|
278
|
+
*/
|
|
279
|
+
@CaptureSpan()
|
|
280
|
+
protected override async onBeforeCreate(
|
|
281
|
+
createBy: CreateBy<Model>,
|
|
282
|
+
): Promise<OnCreate<Model>> {
|
|
283
|
+
if (createBy.props.isRoot) {
|
|
284
|
+
return { createBy: createBy, carryForward: null };
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
const data: Model = createBy.data;
|
|
288
|
+
|
|
289
|
+
ModelPermission.checkCreatePermissions(Model, data, createBy.props);
|
|
290
|
+
|
|
291
|
+
// The tenant column is stamped from props.tenantId only after this hook.
|
|
292
|
+
const projectId: ObjectID | undefined =
|
|
293
|
+
createBy.props.tenantId || data.projectId || undefined;
|
|
294
|
+
|
|
295
|
+
if (!projectId) {
|
|
296
|
+
throw new BadDataException("Project ID is required to add a queue.");
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
const manual: ManualMessageQueue = resolveManualMessageQueue({
|
|
300
|
+
messagingSystem: data.messagingSystem,
|
|
301
|
+
destinationName: data.destinationName,
|
|
302
|
+
brokerScope: data.brokerScope,
|
|
303
|
+
});
|
|
304
|
+
|
|
305
|
+
/*
|
|
306
|
+
* The unique index would otherwise answer a duplicate with a raw
|
|
307
|
+
* constraint error.
|
|
308
|
+
*/
|
|
309
|
+
const sameIdentity: Model | null = await this.findOneBy({
|
|
310
|
+
query: {
|
|
311
|
+
projectId: projectId,
|
|
312
|
+
queueIdentifier: manual.queueIdentifier,
|
|
313
|
+
},
|
|
314
|
+
select: {
|
|
315
|
+
_id: true,
|
|
316
|
+
name: true,
|
|
317
|
+
},
|
|
318
|
+
props: {
|
|
319
|
+
isRoot: true,
|
|
320
|
+
},
|
|
321
|
+
});
|
|
322
|
+
|
|
323
|
+
if (sameIdentity) {
|
|
324
|
+
// Named only when the caller may read it.
|
|
325
|
+
const sameIdentityName: string = sameIdentity.id
|
|
326
|
+
? await this.getMessageQueueNameIfReadable({
|
|
327
|
+
messageQueueId: sameIdentity.id,
|
|
328
|
+
props: createBy.props,
|
|
329
|
+
})
|
|
330
|
+
: "";
|
|
331
|
+
|
|
332
|
+
throw new BadDataException(
|
|
333
|
+
`The ${getMessagingSystemDisplayName(
|
|
334
|
+
manual.system,
|
|
335
|
+
)} queue ${quoteManualMessageQueueInput(manual.destination)}${
|
|
336
|
+
manual.brokerScope
|
|
337
|
+
? ` in the ${quoteManualMessageQueueInput(
|
|
338
|
+
manual.brokerScope,
|
|
339
|
+
)} namespace`
|
|
340
|
+
: ""
|
|
341
|
+
} already exists${sameIdentityName ? `: "${sameIdentityName}"` : ""}.`,
|
|
342
|
+
);
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
const name: string = typeof data.name === "string" ? data.name.trim() : "";
|
|
346
|
+
|
|
347
|
+
data.messagingSystem = manual.system;
|
|
348
|
+
data.destinationName = manual.destination;
|
|
349
|
+
if (manual.brokerScope) {
|
|
350
|
+
data.brokerScope = manual.brokerScope;
|
|
351
|
+
} else {
|
|
352
|
+
delete data.brokerScope;
|
|
353
|
+
}
|
|
354
|
+
data.queueIdentifier = manual.queueIdentifier;
|
|
355
|
+
// First creator wins, and a person creating it is "manual" - whatever was sent.
|
|
356
|
+
data.discoverySource = MANUAL_DISCOVERY_SOURCE;
|
|
357
|
+
data.name =
|
|
358
|
+
name || buildMessageQueueDisplayName({ destination: manual.destination });
|
|
359
|
+
|
|
360
|
+
return { createBy: createBy, carryForward: null };
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
@CaptureSpan()
|
|
364
|
+
protected override async onCreateSuccess(
|
|
365
|
+
_onCreate: OnCreate<Model>,
|
|
366
|
+
createdItem: Model,
|
|
367
|
+
): Promise<Model> {
|
|
368
|
+
this.runCreatedSideEffects(createdItem);
|
|
369
|
+
|
|
370
|
+
return createdItem;
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
@CaptureSpan()
|
|
374
|
+
protected override async onUpdateSuccess(
|
|
375
|
+
onUpdate: OnUpdate<Model>,
|
|
376
|
+
updatedItemIds: Array<ObjectID>,
|
|
377
|
+
): Promise<OnUpdate<Model>> {
|
|
378
|
+
const updateData: JSONObject = onUpdate.updateBy
|
|
379
|
+
.data as unknown as JSONObject;
|
|
380
|
+
|
|
381
|
+
/*
|
|
382
|
+
* A person archiving or restoring a row takes it out of discovery's
|
|
383
|
+
* hands: from now on only a person restores it. A person's Restore also
|
|
384
|
+
* holds off the auto-archive sweep (manuallyRestoredAt), which would
|
|
385
|
+
* otherwise re-archive a stale row within minutes. Discovery's own
|
|
386
|
+
* archive and restore are raw writes, so they never reach this hook.
|
|
387
|
+
*/
|
|
388
|
+
if (
|
|
389
|
+
ResourceFeedUtil.isArchiveChange(updateData) &&
|
|
390
|
+
!("autoArchivedAt" in updateData)
|
|
391
|
+
) {
|
|
392
|
+
await this.recordArchiveDecisionByPerson(
|
|
393
|
+
updatedItemIds,
|
|
394
|
+
!updateData["isArchived"],
|
|
395
|
+
);
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
/*
|
|
399
|
+
* Labels a person saves on a row are theirs, whichever rule first
|
|
400
|
+
* attached them: they now count as investment.
|
|
401
|
+
*/
|
|
402
|
+
if ("labels" in updateData) {
|
|
403
|
+
const labelIds: Array<string> = readRelationIds(updateData["labels"]);
|
|
404
|
+
|
|
405
|
+
for (const messageQueueId of updatedItemIds) {
|
|
406
|
+
await this.forgetAutomaticAssignments({
|
|
407
|
+
messageQueueId: messageQueueId,
|
|
408
|
+
kind: "labelIds",
|
|
409
|
+
ids: labelIds,
|
|
410
|
+
});
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
return onUpdate;
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
/**
|
|
418
|
+
* The queue a sighting names, found by its identity - or, when none exists
|
|
419
|
+
* and creating is allowed, a new one.
|
|
420
|
+
*
|
|
421
|
+
* Lookup first, by (projectId, queueIdentifier) - the identifier built
|
|
422
|
+
* from `identity`, which is canonicalized again here. An existing row is
|
|
423
|
+
* told about the sighting: its messagingSystem is refined to `system` when
|
|
424
|
+
* that is more specific within the row's family (jms -> activemq, never
|
|
425
|
+
* back; getMoreSpecificMessagingSystem), and a row the auto-archive sweep
|
|
426
|
+
* archived is restored - never one a person archived. That happens whether
|
|
427
|
+
* or not creating is allowed.
|
|
428
|
+
*
|
|
429
|
+
* When no row exists: `{ queue: null, created: false }` if `allowCreate` is
|
|
430
|
+
* false, if the identity is invalid, or if the project holds
|
|
431
|
+
* getAutoCreateBudget() live, non-archived discovered queues already (or
|
|
432
|
+
* the count cannot be read - fail closed). Otherwise a row is created as
|
|
433
|
+
* root, without hooks, storing the sighting's SPECIFIC system (a `system`
|
|
434
|
+
* outside the identity's family falls back to the family itself), the
|
|
435
|
+
* display destination, the Azure namespace, the broker address, the
|
|
436
|
+
* discovery source and lastSeenAt (now). brokerMetricsLastSeenAt stays
|
|
437
|
+
* empty: the recordSighting call that follows every find or create sets
|
|
438
|
+
* it to the broker's datapoint time.
|
|
439
|
+
*
|
|
440
|
+
* Races: two writers can both miss the lookup. The unique index lets one
|
|
441
|
+
* insert win; the loser re-reads the winner's row, sights it as above and
|
|
442
|
+
* answers `created: false`. Only the winner runs the label and owner rule
|
|
443
|
+
* engines (fire and forget). A create failure that is not a lost race is
|
|
444
|
+
* thrown.
|
|
445
|
+
*/
|
|
446
|
+
@CaptureSpan()
|
|
447
|
+
public async findOrCreateByIdentity(
|
|
448
|
+
data: FindOrCreateMessageQueueByIdentityData,
|
|
449
|
+
): Promise<MessageQueueFindOrCreateResult> {
|
|
450
|
+
const nothing: MessageQueueFindOrCreateResult = {
|
|
451
|
+
queue: null,
|
|
452
|
+
created: false,
|
|
453
|
+
};
|
|
454
|
+
|
|
455
|
+
if (!data || !data.projectId || !data.identity) {
|
|
456
|
+
return nothing;
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
const identity: MessageQueueIdentity | null = toMessageQueueIdentity(
|
|
460
|
+
data.identity,
|
|
461
|
+
);
|
|
462
|
+
const queueIdentifier: string | null = identity
|
|
463
|
+
? buildMessageQueueIdentifier(identity)
|
|
464
|
+
: null;
|
|
465
|
+
|
|
466
|
+
if (!identity || !queueIdentifier) {
|
|
467
|
+
return nothing;
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
const system: string = getSightingSystem(data.system, identity);
|
|
471
|
+
|
|
472
|
+
const existing: Model | null = await this.findByQueueIdentifier(
|
|
473
|
+
data.projectId,
|
|
474
|
+
queueIdentifier,
|
|
475
|
+
);
|
|
476
|
+
|
|
477
|
+
if (existing) {
|
|
478
|
+
await this.recordIdentitySighting(existing, system);
|
|
479
|
+
return { queue: existing, created: false };
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
if (!data.allowCreate) {
|
|
483
|
+
return nothing;
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
if (!(await this.allowsAutoCreate(data.projectId, queueIdentifier))) {
|
|
487
|
+
return nothing;
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
const source: MessageQueueSightingSource =
|
|
491
|
+
data.source === "broker-metrics" ? "broker-metrics" : "traces";
|
|
492
|
+
const now: Date = OneUptimeDate.getCurrentDate();
|
|
493
|
+
const destination: string = getDisplayDestination(
|
|
494
|
+
data.destination,
|
|
495
|
+
identity,
|
|
496
|
+
);
|
|
497
|
+
|
|
498
|
+
const newRow: Model = new Model();
|
|
499
|
+
newRow.projectId = data.projectId;
|
|
500
|
+
newRow.name = truncateShortText(
|
|
501
|
+
buildMessageQueueDisplayName({ destination: destination }),
|
|
502
|
+
);
|
|
503
|
+
newRow.queueIdentifier = queueIdentifier;
|
|
504
|
+
newRow.messagingSystem = truncateShortText(system);
|
|
505
|
+
newRow.destinationName = truncateLongText(destination);
|
|
506
|
+
if (identity.brokerScope) {
|
|
507
|
+
newRow.brokerScope = truncateShortText(identity.brokerScope);
|
|
508
|
+
}
|
|
509
|
+
const brokerAddress: string | null = cleanBrokerAddress(data.brokerAddress);
|
|
510
|
+
if (brokerAddress) {
|
|
511
|
+
newRow.brokerAddress = brokerAddress;
|
|
512
|
+
}
|
|
513
|
+
newRow.discoverySource = source;
|
|
514
|
+
/*
|
|
515
|
+
* No brokerMetricsLastSeenAt: only the broker-metrics sighting knows when
|
|
516
|
+
* the newest datapoint was taken (recordSighting, its only writer).
|
|
517
|
+
* Stamped now, it would move back to that older time moments later.
|
|
518
|
+
*/
|
|
519
|
+
newRow.lastSeenAt = now;
|
|
520
|
+
|
|
521
|
+
let created: Model;
|
|
522
|
+
|
|
523
|
+
try {
|
|
524
|
+
/*
|
|
525
|
+
* Without hooks: the rule engines run below, and only for the insert
|
|
526
|
+
* that won - a racing writer's loser never reaches them.
|
|
527
|
+
*/
|
|
528
|
+
created = await this.create({
|
|
529
|
+
data: newRow,
|
|
530
|
+
props: {
|
|
531
|
+
isRoot: true,
|
|
532
|
+
ignoreHooks: true,
|
|
533
|
+
},
|
|
534
|
+
});
|
|
535
|
+
} catch (error) {
|
|
536
|
+
// The same identity created by a racing writer.
|
|
537
|
+
const winner: Model | null = await this.findByQueueIdentifier(
|
|
538
|
+
data.projectId,
|
|
539
|
+
queueIdentifier,
|
|
540
|
+
);
|
|
541
|
+
|
|
542
|
+
if (!winner) {
|
|
543
|
+
throw error;
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
await this.recordIdentitySighting(winner, system);
|
|
547
|
+
return { queue: winner, created: false };
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
this.noteAutoCreated(data.projectId);
|
|
551
|
+
this.runCreatedSideEffects(created);
|
|
552
|
+
|
|
553
|
+
return { queue: created, created: true };
|
|
554
|
+
}
|
|
555
|
+
|
|
556
|
+
/**
|
|
557
|
+
* Liveness: a queue was seen - in application spans (`traces`) or in the
|
|
558
|
+
* broker's own metrics (`broker-metrics`). One gated, non-blocking
|
|
559
|
+
* ResourceHeartbeat write per queue per source per window: lastSeenAt
|
|
560
|
+
* always, brokerMetricsLastSeenAt too for broker metrics, and the broker
|
|
561
|
+
* address (sanitized, clamped) only when it is non-empty and has changed
|
|
562
|
+
* since this source last wrote one. The two sources use separate cache
|
|
563
|
+
* namespaces, so neither can suppress the other.
|
|
564
|
+
*
|
|
565
|
+
* lastSeenAt is when discovery saw the queue - now - whichever source saw
|
|
566
|
+
* it, as DatabaseServerService.recordSighting writes it. Both sources
|
|
567
|
+
* write it, one after the other in every pass, each a plain SET, and
|
|
568
|
+
* their newest data can be minutes apart (Azure Monitor, CloudWatch and
|
|
569
|
+
* Cloud Monitoring deliver datapoints late; a source can also stop). A
|
|
570
|
+
* datapoint's own time from whichever source wrote last would move the
|
|
571
|
+
* column back behind the other's sighting - and a new row's behind its
|
|
572
|
+
* own creation.
|
|
573
|
+
*
|
|
574
|
+
* brokerMetricsLastSeenAt is `at`: when the newest broker datapoint the
|
|
575
|
+
* pass saw was taken (default now; a future or invalid value is read as
|
|
576
|
+
* now). Broker-metrics sightings are its only writer, and each pass's
|
|
577
|
+
* window ends later than the last one's, so it only moves forward.
|
|
578
|
+
* findOrCreateByIdentity leaves it empty on a new row: call this for
|
|
579
|
+
* every sighted row, created or found. A traces sighting ignores `at`.
|
|
580
|
+
*
|
|
581
|
+
* It restores nothing: findOrCreateByIdentity, which every discovery pass
|
|
582
|
+
* calls first, is what brings an auto-archived queue back.
|
|
583
|
+
*/
|
|
584
|
+
@CaptureSpan()
|
|
585
|
+
public async recordSighting(
|
|
586
|
+
data: RecordMessageQueueSightingData,
|
|
587
|
+
): Promise<void> {
|
|
588
|
+
if (!data || !data.queueId) {
|
|
589
|
+
return;
|
|
590
|
+
}
|
|
591
|
+
|
|
592
|
+
const isBrokerMetrics: boolean = data.source === "broker-metrics";
|
|
593
|
+
const now: Date = OneUptimeDate.getCurrentDate();
|
|
594
|
+
|
|
595
|
+
const liveness: PartialEntity<Model> = {
|
|
596
|
+
lastSeenAt: now,
|
|
597
|
+
};
|
|
598
|
+
|
|
599
|
+
if (isBrokerMetrics) {
|
|
600
|
+
liveness.brokerMetricsLastSeenAt = getSightingTime(data.at, now);
|
|
601
|
+
}
|
|
602
|
+
|
|
603
|
+
const metadata: PartialEntity<Model> = {};
|
|
604
|
+
const brokerAddress: string | null = cleanBrokerAddress(data.brokerAddress);
|
|
605
|
+
|
|
606
|
+
if (brokerAddress) {
|
|
607
|
+
metadata.brokerAddress = brokerAddress;
|
|
608
|
+
}
|
|
609
|
+
|
|
610
|
+
await ResourceHeartbeat.write({
|
|
611
|
+
service: this,
|
|
612
|
+
id: data.queueId,
|
|
613
|
+
cacheNamespace: isBrokerMetrics
|
|
614
|
+
? BROKER_METRICS_SIGHTING_CACHE_NAMESPACE
|
|
615
|
+
: TRACE_SIGHTING_CACHE_NAMESPACE,
|
|
616
|
+
throttleInSeconds: SIGHTING_THROTTLE_SECONDS,
|
|
617
|
+
liveness: liveness,
|
|
618
|
+
metadata: metadata,
|
|
619
|
+
fingerprint: brokerAddress
|
|
620
|
+
? crypto.createHash("sha256").update(brokerAddress).digest("hex")
|
|
621
|
+
: "",
|
|
622
|
+
describe: `queue ${data.queueId.toString()} (${
|
|
623
|
+
isBrokerMetrics ? "broker-metrics" : "traces"
|
|
624
|
+
} sighting, project ${data.projectId?.toString() || "unknown"})`,
|
|
625
|
+
});
|
|
626
|
+
}
|
|
627
|
+
|
|
628
|
+
/*
|
|
629
|
+
* Days a discovered queue may go unseen before the sweep archives it
|
|
630
|
+
* (MESSAGE_QUEUE_AUTO_ARCHIVE_DAYS). Default 7, at least 1.
|
|
631
|
+
*/
|
|
632
|
+
public getAutoArchiveDays(): number {
|
|
633
|
+
return readIntegerEnv({
|
|
634
|
+
name: "MESSAGE_QUEUE_AUTO_ARCHIVE_DAYS",
|
|
635
|
+
defaultValue: DEFAULT_AUTO_ARCHIVE_DAYS,
|
|
636
|
+
min: MIN_AUTO_ARCHIVE_DAYS,
|
|
637
|
+
});
|
|
638
|
+
}
|
|
639
|
+
|
|
640
|
+
/**
|
|
641
|
+
* Archive discovered queues nobody has seen - and nobody has touched - for
|
|
642
|
+
* getAutoArchiveDays(). Discovery creates rows on its own, so without this
|
|
643
|
+
* a queue a decommissioned service used, or a per-run topic seen once in a
|
|
644
|
+
* trace, would sit in the list forever.
|
|
645
|
+
*
|
|
646
|
+
* "Untouched" is what makes this safe to do unasked: a manually added
|
|
647
|
+
* queue is never archived, and neither is one somebody invested in - a
|
|
648
|
+
* description, a rename, labels or owners a PERSON added (not the ones
|
|
649
|
+
* rules attached on their own). Every one of those checks is done in SQL,
|
|
650
|
+
* scoped to the row's project and to live rows
|
|
651
|
+
* (UNTOUCHED_MESSAGE_QUEUE_PREDICATE). A row a person restored from the
|
|
652
|
+
* archive is left alone until discovery sees it again or the grace period
|
|
653
|
+
* passes - their Restore must stick.
|
|
654
|
+
*
|
|
655
|
+
* The row is marked autoArchivedAt, which is what lets discovery restore
|
|
656
|
+
* it the moment it is seen again - and never restore one a person
|
|
657
|
+
* archived. At most AUTO_ARCHIVE_BATCH_SIZE rows per run, oldest first,
|
|
658
|
+
* in one statement. Returns how many rows were archived.
|
|
659
|
+
*/
|
|
660
|
+
@CaptureSpan()
|
|
661
|
+
public async autoArchiveStaleMessageQueues(): Promise<number> {
|
|
662
|
+
const days: number = this.getAutoArchiveDays();
|
|
663
|
+
const now: Date = OneUptimeDate.getCurrentDate();
|
|
664
|
+
const cutoff: Date = OneUptimeDate.addRemoveDays(now, -days);
|
|
665
|
+
const restoreGraceCutoff: Date = OneUptimeDate.addRemoveDays(
|
|
666
|
+
now,
|
|
667
|
+
-Math.max(MANUAL_RESTORE_GRACE_DAYS, days),
|
|
668
|
+
);
|
|
669
|
+
|
|
670
|
+
const archived: unknown = await this.getRepository().manager.query(
|
|
671
|
+
`WITH "candidates" AS (
|
|
672
|
+
SELECT mq."_id"
|
|
673
|
+
FROM "MessageQueue" mq
|
|
674
|
+
WHERE mq."deletedAt" IS NULL
|
|
675
|
+
AND mq."isArchived" = false
|
|
676
|
+
AND mq."discoverySource" IS NOT NULL
|
|
677
|
+
AND mq."discoverySource" <> $3
|
|
678
|
+
AND COALESCE(mq."lastSeenAt", mq."createdAt") < $1
|
|
679
|
+
AND (
|
|
680
|
+
mq."manuallyRestoredAt" IS NULL
|
|
681
|
+
OR mq."manuallyRestoredAt" < $5
|
|
682
|
+
OR COALESCE(mq."lastSeenAt", mq."createdAt") > mq."manuallyRestoredAt"
|
|
683
|
+
)
|
|
684
|
+
AND ${UNTOUCHED_MESSAGE_QUEUE_PREDICATE}
|
|
685
|
+
ORDER BY COALESCE(mq."lastSeenAt", mq."createdAt") ASC
|
|
686
|
+
LIMIT $4
|
|
687
|
+
),
|
|
688
|
+
"archived" AS (
|
|
689
|
+
UPDATE "MessageQueue" stale
|
|
690
|
+
SET "isArchived" = true,
|
|
691
|
+
"archivedAt" = $2,
|
|
692
|
+
"autoArchivedAt" = $2,
|
|
693
|
+
"archivedByUserId" = NULL,
|
|
694
|
+
"updatedAt" = CURRENT_TIMESTAMP
|
|
695
|
+
FROM "candidates"
|
|
696
|
+
WHERE stale."_id" = "candidates"."_id"
|
|
697
|
+
AND stale."isArchived" = false
|
|
698
|
+
RETURNING stale."_id" AS "_id", stale."projectId" AS "projectId"
|
|
699
|
+
)
|
|
700
|
+
SELECT "_id", "projectId" FROM "archived"`,
|
|
701
|
+
[
|
|
702
|
+
cutoff,
|
|
703
|
+
now,
|
|
704
|
+
MANUAL_DISCOVERY_SOURCE,
|
|
705
|
+
AUTO_ARCHIVE_BATCH_SIZE,
|
|
706
|
+
restoreGraceCutoff,
|
|
707
|
+
],
|
|
708
|
+
);
|
|
709
|
+
|
|
710
|
+
return Array.isArray(archived) ? archived.length : 0;
|
|
711
|
+
}
|
|
712
|
+
|
|
713
|
+
/*
|
|
714
|
+
* How many discovered queues (traces, broker metrics) a project may
|
|
715
|
+
* accumulate before discovery stops creating more on its own
|
|
716
|
+
* (MESSAGE_QUEUE_AUTO_CREATE_BUDGET). Manual rows do not count and are
|
|
717
|
+
* never blocked; archived rows do not count, so the auto-archive sweep
|
|
718
|
+
* frees budget. Default 500, at least 0 (0 turns auto-creation off).
|
|
719
|
+
*/
|
|
720
|
+
public getAutoCreateBudget(): number {
|
|
721
|
+
return readIntegerEnv({
|
|
722
|
+
name: "MESSAGE_QUEUE_AUTO_CREATE_BUDGET",
|
|
723
|
+
defaultValue: DEFAULT_AUTO_CREATE_BUDGET,
|
|
724
|
+
min: 0,
|
|
725
|
+
});
|
|
726
|
+
}
|
|
727
|
+
|
|
728
|
+
/**
|
|
729
|
+
* True while the project holds fewer live, non-archived discovered queues
|
|
730
|
+
* than getAutoCreateBudget(). Always reads the count.
|
|
731
|
+
*/
|
|
732
|
+
@CaptureSpan()
|
|
733
|
+
public async isUnderAutoCreateBudget(projectId: ObjectID): Promise<boolean> {
|
|
734
|
+
const budget: number = this.getAutoCreateBudget();
|
|
735
|
+
|
|
736
|
+
if (budget <= 0) {
|
|
737
|
+
return false;
|
|
738
|
+
}
|
|
739
|
+
|
|
740
|
+
return (await this.countAutoCreatedMessageQueues(projectId)) < budget;
|
|
741
|
+
}
|
|
742
|
+
|
|
743
|
+
/**
|
|
744
|
+
* isUnderAutoCreateBudget as findOrCreateByIdentity asks it: the count is
|
|
745
|
+
* read at most once a minute per project in this process, and every row
|
|
746
|
+
* this process creates in between is added to it, so a burst of new
|
|
747
|
+
* destinations stops at the budget instead of a minute's worth past it.
|
|
748
|
+
*/
|
|
749
|
+
@CaptureSpan()
|
|
750
|
+
public async isUnderAutoCreateBudgetCached(
|
|
751
|
+
projectId: ObjectID,
|
|
752
|
+
): Promise<boolean> {
|
|
753
|
+
const budget: number = this.getAutoCreateBudget();
|
|
754
|
+
|
|
755
|
+
if (budget <= 0) {
|
|
756
|
+
return false;
|
|
757
|
+
}
|
|
758
|
+
|
|
759
|
+
const key: string = projectId.toString();
|
|
760
|
+
let cached: AutoCreateCount | undefined = this.autoCreateCountMemo.get(key);
|
|
761
|
+
|
|
762
|
+
if (!cached) {
|
|
763
|
+
cached = {
|
|
764
|
+
count: await this.countAutoCreatedMessageQueues(projectId),
|
|
765
|
+
readAtMs: Date.now(),
|
|
766
|
+
};
|
|
767
|
+
this.autoCreateCountMemo.set(key, cached);
|
|
768
|
+
}
|
|
769
|
+
|
|
770
|
+
return cached.count < budget;
|
|
771
|
+
}
|
|
772
|
+
|
|
773
|
+
// Live, non-archived, non-manual rows of one project.
|
|
774
|
+
@CaptureSpan()
|
|
775
|
+
public async countAutoCreatedMessageQueues(
|
|
776
|
+
projectId: ObjectID,
|
|
777
|
+
): Promise<number> {
|
|
778
|
+
const rows: unknown = await this.getRepository().manager.query(
|
|
779
|
+
`SELECT COUNT(*)::int AS "count"
|
|
780
|
+
FROM "MessageQueue"
|
|
781
|
+
WHERE "projectId" = $1
|
|
782
|
+
AND "deletedAt" IS NULL
|
|
783
|
+
AND "isArchived" = false
|
|
784
|
+
AND COALESCE("discoverySource", '') <> $2`,
|
|
785
|
+
[projectId.toString(), MANUAL_DISCOVERY_SOURCE],
|
|
786
|
+
);
|
|
787
|
+
|
|
788
|
+
return readCount(rows);
|
|
789
|
+
}
|
|
790
|
+
|
|
791
|
+
/**
|
|
792
|
+
* Display name for this queue, or an empty string when the row is gone.
|
|
793
|
+
* Callers use it on a best-effort basis, so a missing row must not throw.
|
|
794
|
+
*/
|
|
795
|
+
@CaptureSpan()
|
|
796
|
+
public async getMessageQueueName(data: {
|
|
797
|
+
messageQueueId: ObjectID;
|
|
798
|
+
}): Promise<string> {
|
|
799
|
+
const messageQueue: Model | null = await this.findOneById({
|
|
800
|
+
id: data.messageQueueId,
|
|
801
|
+
select: {
|
|
802
|
+
name: true,
|
|
803
|
+
},
|
|
804
|
+
props: {
|
|
805
|
+
isRoot: true,
|
|
806
|
+
},
|
|
807
|
+
});
|
|
808
|
+
|
|
809
|
+
return messageQueue?.name || "";
|
|
810
|
+
}
|
|
811
|
+
|
|
812
|
+
/**
|
|
813
|
+
* The queue's name - but only when `props` may read that row (project,
|
|
814
|
+
* label and Owned scopes applied); "" otherwise, or on any error. Refusal
|
|
815
|
+
* messages use it, so a caller with scoped permissions is never told the
|
|
816
|
+
* name of a queue they cannot see. Without props (or as root) the name is
|
|
817
|
+
* read as root.
|
|
818
|
+
*/
|
|
819
|
+
@CaptureSpan()
|
|
820
|
+
public async getMessageQueueNameIfReadable(data: {
|
|
821
|
+
messageQueueId: ObjectID;
|
|
822
|
+
props?: DatabaseCommonInteractionProps | undefined;
|
|
823
|
+
}): Promise<string> {
|
|
824
|
+
if (!data.props || data.props.isRoot) {
|
|
825
|
+
return await this.getMessageQueueName({
|
|
826
|
+
messageQueueId: data.messageQueueId,
|
|
827
|
+
});
|
|
828
|
+
}
|
|
829
|
+
|
|
830
|
+
try {
|
|
831
|
+
const readable: Model | null = await this.findOneBy({
|
|
832
|
+
query: {
|
|
833
|
+
_id: data.messageQueueId.toString(),
|
|
834
|
+
},
|
|
835
|
+
select: {
|
|
836
|
+
name: true,
|
|
837
|
+
},
|
|
838
|
+
props: data.props,
|
|
839
|
+
});
|
|
840
|
+
|
|
841
|
+
return readable?.name || "";
|
|
842
|
+
} catch {
|
|
843
|
+
return "";
|
|
844
|
+
}
|
|
845
|
+
}
|
|
846
|
+
|
|
847
|
+
/**
|
|
848
|
+
* Validate the queue a child row (an owner) is created for by a caller:
|
|
849
|
+
* the FK column and the relation object must agree (TypeORM would persist
|
|
850
|
+
* the relation object's id over the column's), and the queue must be in
|
|
851
|
+
* the caller's project. Leaves the validated FK column as the only
|
|
852
|
+
* reference. Root creates are the caller's business.
|
|
853
|
+
*/
|
|
854
|
+
@CaptureSpan()
|
|
855
|
+
public async assertMessageQueueReferenceInProject<TModel extends BaseModel>(
|
|
856
|
+
createBy: CreateBy<TModel>,
|
|
857
|
+
): Promise<ObjectID> {
|
|
858
|
+
const data: TModel = createBy.data;
|
|
859
|
+
|
|
860
|
+
const projectId: ObjectID | undefined =
|
|
861
|
+
createBy.props.tenantId ||
|
|
862
|
+
(data.getColumnValue("projectId") as ObjectID | undefined) ||
|
|
863
|
+
undefined;
|
|
864
|
+
|
|
865
|
+
if (!projectId) {
|
|
866
|
+
throw new BadDataException("Project ID is required.");
|
|
867
|
+
}
|
|
868
|
+
|
|
869
|
+
const messageQueueId: ObjectID | null = RelationIdUtil.readConsistent(
|
|
870
|
+
data as unknown as Record<string, unknown>,
|
|
871
|
+
["messageQueueId", "messageQueue"],
|
|
872
|
+
"queue",
|
|
873
|
+
);
|
|
874
|
+
|
|
875
|
+
data.setColumnValue("messageQueue", undefined);
|
|
876
|
+
|
|
877
|
+
if (!messageQueueId) {
|
|
878
|
+
throw new BadDataException("Select a queue.");
|
|
879
|
+
}
|
|
880
|
+
|
|
881
|
+
const messageQueue: Model | null = await this.findOneBy({
|
|
882
|
+
query: {
|
|
883
|
+
_id: messageQueueId.toString(),
|
|
884
|
+
projectId: projectId,
|
|
885
|
+
},
|
|
886
|
+
select: {
|
|
887
|
+
_id: true,
|
|
888
|
+
},
|
|
889
|
+
props: {
|
|
890
|
+
isRoot: true,
|
|
891
|
+
},
|
|
892
|
+
});
|
|
893
|
+
|
|
894
|
+
if (!messageQueue) {
|
|
895
|
+
throw new BadDataException("Queue not found.");
|
|
896
|
+
}
|
|
897
|
+
|
|
898
|
+
data.setColumnValue("messageQueueId", messageQueueId);
|
|
899
|
+
|
|
900
|
+
return messageQueueId;
|
|
901
|
+
}
|
|
902
|
+
|
|
903
|
+
/**
|
|
904
|
+
* Record labels or owners that a rule attached to a queue on its own
|
|
905
|
+
* (MessageQueue.automaticAssignments), so the auto-archive sweep does not
|
|
906
|
+
* mistake them for a person's investment. One atomic statement; ids
|
|
907
|
+
* deduped. Never throws - it only annotates a write that happened.
|
|
908
|
+
*/
|
|
909
|
+
@CaptureSpan()
|
|
910
|
+
public async recordAutomaticAssignments(data: {
|
|
911
|
+
messageQueueId: ObjectID;
|
|
912
|
+
kind: MessageQueueAutomaticAssignmentKind;
|
|
913
|
+
ids: Array<ObjectID | string>;
|
|
914
|
+
}): Promise<void> {
|
|
915
|
+
const ids: Array<string> = normalizeAssignmentIds(data.ids);
|
|
916
|
+
|
|
917
|
+
if (ids.length === 0 || !AUTOMATIC_ASSIGNMENT_KINDS.includes(data.kind)) {
|
|
918
|
+
return;
|
|
919
|
+
}
|
|
920
|
+
|
|
921
|
+
try {
|
|
922
|
+
await this.getRepository().manager.query(
|
|
923
|
+
`UPDATE "MessageQueue"
|
|
924
|
+
SET "automaticAssignments" =
|
|
925
|
+
(CASE WHEN jsonb_typeof("automaticAssignments") = 'object' THEN "automaticAssignments" ELSE '{}'::jsonb END)
|
|
926
|
+
|| jsonb_build_object(
|
|
927
|
+
$2::text,
|
|
928
|
+
(
|
|
929
|
+
SELECT COALESCE(jsonb_agg(DISTINCT assigned.id), '[]'::jsonb)
|
|
930
|
+
FROM jsonb_array_elements_text(
|
|
931
|
+
(CASE WHEN jsonb_typeof("automaticAssignments" -> $2::text) = 'array' THEN "automaticAssignments" -> $2::text ELSE '[]'::jsonb END)
|
|
932
|
+
|| $3::jsonb
|
|
933
|
+
) AS assigned(id)
|
|
934
|
+
)
|
|
935
|
+
)
|
|
936
|
+
WHERE "_id" = $1`,
|
|
937
|
+
[data.messageQueueId.toString(), data.kind, JSON.stringify(ids)],
|
|
938
|
+
);
|
|
939
|
+
} catch (error) {
|
|
940
|
+
logger.warn(
|
|
941
|
+
`MessageQueueService: could not record automatic ${data.kind} on queue ${data.messageQueueId.toString()}: ${
|
|
942
|
+
error instanceof Error ? error.message : String(error)
|
|
943
|
+
}`,
|
|
944
|
+
);
|
|
945
|
+
}
|
|
946
|
+
}
|
|
947
|
+
|
|
948
|
+
/**
|
|
949
|
+
* The opposite of recordAutomaticAssignments: a person (re)added these
|
|
950
|
+
* labels or owners, so from now on they count as investment. Never throws.
|
|
951
|
+
*/
|
|
952
|
+
@CaptureSpan()
|
|
953
|
+
public async forgetAutomaticAssignments(data: {
|
|
954
|
+
messageQueueId: ObjectID;
|
|
955
|
+
kind: MessageQueueAutomaticAssignmentKind;
|
|
956
|
+
ids: Array<ObjectID | string>;
|
|
957
|
+
}): Promise<void> {
|
|
958
|
+
const ids: Array<string> = normalizeAssignmentIds(data.ids);
|
|
959
|
+
|
|
960
|
+
if (ids.length === 0 || !AUTOMATIC_ASSIGNMENT_KINDS.includes(data.kind)) {
|
|
961
|
+
return;
|
|
962
|
+
}
|
|
963
|
+
|
|
964
|
+
try {
|
|
965
|
+
await this.getRepository().manager.query(
|
|
966
|
+
`UPDATE "MessageQueue"
|
|
967
|
+
SET "automaticAssignments" = "automaticAssignments" || jsonb_build_object(
|
|
968
|
+
$2::text,
|
|
969
|
+
(
|
|
970
|
+
SELECT COALESCE(jsonb_agg(assigned.id), '[]'::jsonb)
|
|
971
|
+
FROM jsonb_array_elements_text("automaticAssignments" -> $2::text) AS assigned(id)
|
|
972
|
+
WHERE NOT (assigned.id = ANY($3::text[]))
|
|
973
|
+
)
|
|
974
|
+
)
|
|
975
|
+
WHERE "_id" = $1
|
|
976
|
+
AND jsonb_typeof("automaticAssignments") = 'object'
|
|
977
|
+
AND jsonb_typeof("automaticAssignments" -> $2::text) = 'array'`,
|
|
978
|
+
[data.messageQueueId.toString(), data.kind, ids],
|
|
979
|
+
);
|
|
980
|
+
} catch (error) {
|
|
981
|
+
logger.warn(
|
|
982
|
+
`MessageQueueService: could not forget automatic ${data.kind} on queue ${data.messageQueueId.toString()}: ${
|
|
983
|
+
error instanceof Error ? error.message : String(error)
|
|
984
|
+
}`,
|
|
985
|
+
);
|
|
986
|
+
}
|
|
987
|
+
}
|
|
988
|
+
|
|
989
|
+
@CaptureSpan()
|
|
990
|
+
public async getMessageQueueLinkInDashboard(
|
|
991
|
+
projectId: ObjectID,
|
|
992
|
+
messageQueueId: ObjectID,
|
|
993
|
+
): Promise<URL> {
|
|
994
|
+
const dashboardUrl: URL = await DatabaseConfig.getDashboardUrl();
|
|
995
|
+
|
|
996
|
+
return URL.fromString(dashboardUrl.toString()).addRoute(
|
|
997
|
+
`/${projectId.toString()}/queues/${messageQueueId.toString()}`,
|
|
998
|
+
);
|
|
999
|
+
}
|
|
1000
|
+
|
|
1001
|
+
// "[Queue orders.created](https://…)" - the form a markdown message names a queue by.
|
|
1002
|
+
@CaptureSpan()
|
|
1003
|
+
public async getMessageQueueMarkdownLink(
|
|
1004
|
+
projectId: ObjectID,
|
|
1005
|
+
messageQueueId: ObjectID,
|
|
1006
|
+
): Promise<string> {
|
|
1007
|
+
const name: string = await this.getMessageQueueName({
|
|
1008
|
+
messageQueueId: messageQueueId,
|
|
1009
|
+
});
|
|
1010
|
+
const link: URL = await this.getMessageQueueLinkInDashboard(
|
|
1011
|
+
projectId,
|
|
1012
|
+
messageQueueId,
|
|
1013
|
+
);
|
|
1014
|
+
|
|
1015
|
+
return `[Queue ${name}](${link.toString()})`;
|
|
1016
|
+
}
|
|
1017
|
+
|
|
1018
|
+
// For tests: forget the cached auto-create counts and budget warnings.
|
|
1019
|
+
public clearAutoCreateBudgetMemo(): void {
|
|
1020
|
+
this.autoCreateCountMemo.clear();
|
|
1021
|
+
this.autoCreateBudgetWarningMemo.clear();
|
|
1022
|
+
}
|
|
1023
|
+
|
|
1024
|
+
// One live row by identifier, with the columns discovery reads back.
|
|
1025
|
+
private async findByQueueIdentifier(
|
|
1026
|
+
projectId: ObjectID,
|
|
1027
|
+
queueIdentifier: string,
|
|
1028
|
+
): Promise<Model | null> {
|
|
1029
|
+
return await this.findOneBy({
|
|
1030
|
+
query: {
|
|
1031
|
+
projectId: projectId,
|
|
1032
|
+
queueIdentifier: queueIdentifier,
|
|
1033
|
+
},
|
|
1034
|
+
select: DISCOVERY_SELECT,
|
|
1035
|
+
props: {
|
|
1036
|
+
isRoot: true,
|
|
1037
|
+
},
|
|
1038
|
+
});
|
|
1039
|
+
}
|
|
1040
|
+
|
|
1041
|
+
/*
|
|
1042
|
+
* What a sighting tells the row it names: the system is refined within its
|
|
1043
|
+
* family, and a row the sweep archived is restored.
|
|
1044
|
+
*/
|
|
1045
|
+
private async recordIdentitySighting(
|
|
1046
|
+
row: Model,
|
|
1047
|
+
system: string,
|
|
1048
|
+
): Promise<void> {
|
|
1049
|
+
await this.refineMessagingSystem(row, system);
|
|
1050
|
+
await this.restoreIfAutoArchived(row);
|
|
1051
|
+
}
|
|
1052
|
+
|
|
1053
|
+
/*
|
|
1054
|
+
* The more specific system of the row's family (jms -> activemq), written
|
|
1055
|
+
* only while the row still says what was read - a compare-and-set, so two
|
|
1056
|
+
* sightings cannot interleave - and never outside the family: the
|
|
1057
|
+
* identifier (and so the entity key telemetry is joined on) never moves.
|
|
1058
|
+
* Never throws: a refinement must not fail the discovery that saw it.
|
|
1059
|
+
*/
|
|
1060
|
+
private async refineMessagingSystem(
|
|
1061
|
+
row: Model,
|
|
1062
|
+
system: string,
|
|
1063
|
+
): Promise<void> {
|
|
1064
|
+
const current: string | undefined = row.messagingSystem;
|
|
1065
|
+
const next: string | null = getMoreSpecificMessagingSystem(current, system);
|
|
1066
|
+
|
|
1067
|
+
if (!next || next === current || !row.id || !row.projectId) {
|
|
1068
|
+
return;
|
|
1069
|
+
}
|
|
1070
|
+
|
|
1071
|
+
try {
|
|
1072
|
+
const refined: unknown = await this.getRepository().manager.query(
|
|
1073
|
+
`WITH "refined" AS (
|
|
1074
|
+
UPDATE "MessageQueue"
|
|
1075
|
+
SET "messagingSystem" = $1,
|
|
1076
|
+
"updatedAt" = CURRENT_TIMESTAMP
|
|
1077
|
+
WHERE "_id" = $2
|
|
1078
|
+
AND "projectId" = $3
|
|
1079
|
+
AND "deletedAt" IS NULL
|
|
1080
|
+
AND "messagingSystem" IS NOT DISTINCT FROM $4
|
|
1081
|
+
RETURNING "_id"
|
|
1082
|
+
)
|
|
1083
|
+
SELECT "_id" FROM "refined"`,
|
|
1084
|
+
[
|
|
1085
|
+
truncateShortText(next),
|
|
1086
|
+
row.id.toString(),
|
|
1087
|
+
row.projectId.toString(),
|
|
1088
|
+
current === undefined ? null : current,
|
|
1089
|
+
],
|
|
1090
|
+
);
|
|
1091
|
+
|
|
1092
|
+
if (Array.isArray(refined) && refined.length > 0) {
|
|
1093
|
+
row.messagingSystem = next;
|
|
1094
|
+
}
|
|
1095
|
+
} catch (error) {
|
|
1096
|
+
logger.warn(
|
|
1097
|
+
`MessageQueueService: could not refine the messaging system of queue ${row.id.toString()} to ${next}: ${
|
|
1098
|
+
error instanceof Error ? error.message : String(error)
|
|
1099
|
+
}`,
|
|
1100
|
+
{ projectId: row.projectId.toString() } as LogAttributes,
|
|
1101
|
+
);
|
|
1102
|
+
}
|
|
1103
|
+
}
|
|
1104
|
+
|
|
1105
|
+
/*
|
|
1106
|
+
* Restore a row the auto-archive sweep archived, now that it was seen
|
|
1107
|
+
* again. The conditions live in the UPDATE itself, so a row a person
|
|
1108
|
+
* archived (autoArchivedAt cleared - see onUpdateSuccess) or a row a person
|
|
1109
|
+
* restored in the meantime is never touched. Never throws: a restore must
|
|
1110
|
+
* not fail the discovery that triggered it.
|
|
1111
|
+
*/
|
|
1112
|
+
private async restoreIfAutoArchived(row: Model): Promise<boolean> {
|
|
1113
|
+
if (!row.isArchived || !row.autoArchivedAt || !row.id || !row.projectId) {
|
|
1114
|
+
return false;
|
|
1115
|
+
}
|
|
1116
|
+
|
|
1117
|
+
try {
|
|
1118
|
+
const restored: unknown = await this.getRepository().manager.query(
|
|
1119
|
+
`WITH "restored" AS (
|
|
1120
|
+
UPDATE "MessageQueue"
|
|
1121
|
+
SET "isArchived" = false,
|
|
1122
|
+
"archivedAt" = NULL,
|
|
1123
|
+
"archivedByUserId" = NULL,
|
|
1124
|
+
"autoArchivedAt" = NULL,
|
|
1125
|
+
"updatedAt" = CURRENT_TIMESTAMP
|
|
1126
|
+
WHERE "_id" = $1
|
|
1127
|
+
AND "projectId" = $2
|
|
1128
|
+
AND "isArchived" = true
|
|
1129
|
+
AND "autoArchivedAt" IS NOT NULL
|
|
1130
|
+
AND "deletedAt" IS NULL
|
|
1131
|
+
RETURNING "_id"
|
|
1132
|
+
)
|
|
1133
|
+
SELECT "_id" FROM "restored"`,
|
|
1134
|
+
[row.id.toString(), row.projectId.toString()],
|
|
1135
|
+
);
|
|
1136
|
+
|
|
1137
|
+
/*
|
|
1138
|
+
* Nothing matched: a person restored it, or archived it themselves, in
|
|
1139
|
+
* the meantime. Their state stands - the in-memory row is left as read.
|
|
1140
|
+
*/
|
|
1141
|
+
if (!Array.isArray(restored) || restored.length === 0) {
|
|
1142
|
+
return false;
|
|
1143
|
+
}
|
|
1144
|
+
|
|
1145
|
+
row.isArchived = false;
|
|
1146
|
+
delete row.autoArchivedAt;
|
|
1147
|
+
|
|
1148
|
+
return true;
|
|
1149
|
+
} catch (error) {
|
|
1150
|
+
logger.warn(
|
|
1151
|
+
`MessageQueueService: could not restore auto-archived queue ${row.id.toString()}: ${
|
|
1152
|
+
error instanceof Error ? error.message : String(error)
|
|
1153
|
+
}`,
|
|
1154
|
+
{ projectId: row.projectId.toString() } as LogAttributes,
|
|
1155
|
+
);
|
|
1156
|
+
|
|
1157
|
+
return false;
|
|
1158
|
+
}
|
|
1159
|
+
}
|
|
1160
|
+
|
|
1161
|
+
/*
|
|
1162
|
+
* A person archived (restored = false) or restored a row: it is no longer
|
|
1163
|
+
* discovery's archive (autoArchivedAt cleared), and a restore is stamped
|
|
1164
|
+
* so the sweep leaves the row alone until it is seen again or the grace
|
|
1165
|
+
* period passes (manuallyRestoredAt; cleared again on an archive).
|
|
1166
|
+
*/
|
|
1167
|
+
private async recordArchiveDecisionByPerson(
|
|
1168
|
+
messageQueueIds: Array<ObjectID>,
|
|
1169
|
+
restored: boolean,
|
|
1170
|
+
): Promise<void> {
|
|
1171
|
+
const now: Date = OneUptimeDate.getCurrentDate();
|
|
1172
|
+
|
|
1173
|
+
for (const messageQueueId of messageQueueIds) {
|
|
1174
|
+
try {
|
|
1175
|
+
await this.updateColumnsByIdWithoutHooks({
|
|
1176
|
+
id: messageQueueId,
|
|
1177
|
+
data: {
|
|
1178
|
+
autoArchivedAt: null,
|
|
1179
|
+
manuallyRestoredAt: restored ? now : null,
|
|
1180
|
+
},
|
|
1181
|
+
skipUpdateDateColumn: true,
|
|
1182
|
+
});
|
|
1183
|
+
} catch (error) {
|
|
1184
|
+
logger.warn(
|
|
1185
|
+
`MessageQueueService: could not record the ${
|
|
1186
|
+
restored ? "restore" : "archive"
|
|
1187
|
+
} of queue ${messageQueueId.toString()}: ${
|
|
1188
|
+
error instanceof Error ? error.message : String(error)
|
|
1189
|
+
}`,
|
|
1190
|
+
);
|
|
1191
|
+
}
|
|
1192
|
+
}
|
|
1193
|
+
}
|
|
1194
|
+
|
|
1195
|
+
/*
|
|
1196
|
+
* The discovery path's budget gate: false when the project has reached its
|
|
1197
|
+
* auto-create budget - warned about once per project per ten minutes,
|
|
1198
|
+
* since every discovery pass would otherwise repeat it for every new
|
|
1199
|
+
* destination - or when the count cannot be read (fail closed).
|
|
1200
|
+
*/
|
|
1201
|
+
private async allowsAutoCreate(
|
|
1202
|
+
projectId: ObjectID,
|
|
1203
|
+
queueIdentifier: string,
|
|
1204
|
+
): Promise<boolean> {
|
|
1205
|
+
let underBudget: boolean = false;
|
|
1206
|
+
|
|
1207
|
+
try {
|
|
1208
|
+
underBudget = await this.isUnderAutoCreateBudgetCached(projectId);
|
|
1209
|
+
} catch (error) {
|
|
1210
|
+
logger.error(
|
|
1211
|
+
`MessageQueueService: auto-create budget check failed for project ${projectId.toString()}; not creating queue ${queueIdentifier}: ${
|
|
1212
|
+
error instanceof Error ? error.message : String(error)
|
|
1213
|
+
}`,
|
|
1214
|
+
{ projectId: projectId.toString() } as LogAttributes,
|
|
1215
|
+
);
|
|
1216
|
+
|
|
1217
|
+
return false;
|
|
1218
|
+
}
|
|
1219
|
+
|
|
1220
|
+
if (!underBudget) {
|
|
1221
|
+
const key: string = projectId.toString();
|
|
1222
|
+
|
|
1223
|
+
if (!this.autoCreateBudgetWarningMemo.get(key)) {
|
|
1224
|
+
this.autoCreateBudgetWarningMemo.set(key, true);
|
|
1225
|
+
|
|
1226
|
+
logger.warn(
|
|
1227
|
+
`MessageQueueService: project ${key} reached its auto-create budget (MESSAGE_QUEUE_AUTO_CREATE_BUDGET=${this.getAutoCreateBudget()}); not creating queue ${queueIdentifier}, nor any other new queue until the project is under the budget again (this warning repeats at most every ten minutes). Raise the budget, archive or delete queues nobody needs, or add the queue manually.`,
|
|
1228
|
+
{ projectId: key } as LogAttributes,
|
|
1229
|
+
);
|
|
1230
|
+
}
|
|
1231
|
+
}
|
|
1232
|
+
|
|
1233
|
+
return underBudget;
|
|
1234
|
+
}
|
|
1235
|
+
|
|
1236
|
+
// A row was auto-created: count it against the cached budget straight away.
|
|
1237
|
+
private noteAutoCreated(projectId: ObjectID): void {
|
|
1238
|
+
const key: string = projectId.toString();
|
|
1239
|
+
const cached: AutoCreateCount | undefined =
|
|
1240
|
+
this.autoCreateCountMemo.get(key);
|
|
1241
|
+
|
|
1242
|
+
if (!cached) {
|
|
1243
|
+
return;
|
|
1244
|
+
}
|
|
1245
|
+
|
|
1246
|
+
const remainingMs: number =
|
|
1247
|
+
cached.readAtMs + AUTO_CREATE_BUDGET_CACHE_MS - Date.now();
|
|
1248
|
+
|
|
1249
|
+
if (remainingMs <= 0) {
|
|
1250
|
+
this.autoCreateCountMemo.delete(key);
|
|
1251
|
+
return;
|
|
1252
|
+
}
|
|
1253
|
+
|
|
1254
|
+
this.autoCreateCountMemo.set(
|
|
1255
|
+
key,
|
|
1256
|
+
{ count: cached.count + 1, readAtMs: cached.readAtMs },
|
|
1257
|
+
remainingMs,
|
|
1258
|
+
);
|
|
1259
|
+
}
|
|
1260
|
+
|
|
1261
|
+
/*
|
|
1262
|
+
* Rules run once, on creation only - exact parity with the other resource
|
|
1263
|
+
* types. Label engine first: it syncs the in-memory labels so the owner
|
|
1264
|
+
* engine can match rule-added labels. Fire and forget: they may not fail
|
|
1265
|
+
* the create they follow.
|
|
1266
|
+
*/
|
|
1267
|
+
private runCreatedSideEffects(createdItem: Model): void {
|
|
1268
|
+
if (!createdItem.projectId || !createdItem.id) {
|
|
1269
|
+
return;
|
|
1270
|
+
}
|
|
1271
|
+
|
|
1272
|
+
Promise.resolve()
|
|
1273
|
+
.then(async () => {
|
|
1274
|
+
await MessageQueueLabelRuleEngineService.applyRulesToMessageQueue(
|
|
1275
|
+
createdItem,
|
|
1276
|
+
);
|
|
1277
|
+
})
|
|
1278
|
+
.then(async () => {
|
|
1279
|
+
await MessageQueueOwnerRuleEngineService.applyRulesToMessageQueue(
|
|
1280
|
+
createdItem,
|
|
1281
|
+
);
|
|
1282
|
+
})
|
|
1283
|
+
.catch((error: Error) => {
|
|
1284
|
+
logger.error(
|
|
1285
|
+
`Error applying queue rules in MessageQueueService: ${error}`,
|
|
1286
|
+
{
|
|
1287
|
+
projectId: createdItem.projectId?.toString(),
|
|
1288
|
+
messageQueueId: createdItem.id?.toString(),
|
|
1289
|
+
} as LogAttributes,
|
|
1290
|
+
);
|
|
1291
|
+
});
|
|
1292
|
+
}
|
|
1293
|
+
}
|
|
1294
|
+
|
|
1295
|
+
/**
|
|
1296
|
+
* The values a label or owner rule's messaging system pattern is matched
|
|
1297
|
+
* against: the canonical messaging.system value ("kafka") and its display
|
|
1298
|
+
* name ("Apache Kafka"), deduped, empty ones dropped - so both `^kafka$`
|
|
1299
|
+
* and `Kafka` say "every Kafka topic". An unknown system is matched as
|
|
1300
|
+
* stored.
|
|
1301
|
+
*/
|
|
1302
|
+
export function getMessagingSystemRuleMatchValues(
|
|
1303
|
+
system: unknown,
|
|
1304
|
+
): Array<string> {
|
|
1305
|
+
const raw: string = typeof system === "string" ? system.trim() : "";
|
|
1306
|
+
const canonical: string = normalizeMessagingSystem(raw) || raw;
|
|
1307
|
+
const values: Array<string> = [];
|
|
1308
|
+
|
|
1309
|
+
for (const value of [canonical, getMessagingSystemDisplayName(canonical)]) {
|
|
1310
|
+
if (value && !values.includes(value)) {
|
|
1311
|
+
values.push(value);
|
|
1312
|
+
}
|
|
1313
|
+
}
|
|
1314
|
+
|
|
1315
|
+
return values;
|
|
1316
|
+
}
|
|
1317
|
+
|
|
1318
|
+
/*
|
|
1319
|
+
* The system a sighting stores: its own specific system when that belongs
|
|
1320
|
+
* to the identity's family (activemq for a jms identity), else the family
|
|
1321
|
+
* itself - a row never stores a system outside the family its identifier
|
|
1322
|
+
* names.
|
|
1323
|
+
*/
|
|
1324
|
+
function getSightingSystem(
|
|
1325
|
+
system: unknown,
|
|
1326
|
+
identity: MessageQueueIdentity,
|
|
1327
|
+
): string {
|
|
1328
|
+
const specific: string | null = normalizeMessagingSystem(system);
|
|
1329
|
+
|
|
1330
|
+
if (specific && getMessagingIdentitySystem(specific) === identity.system) {
|
|
1331
|
+
return specific;
|
|
1332
|
+
}
|
|
1333
|
+
|
|
1334
|
+
return identity.system;
|
|
1335
|
+
}
|
|
1336
|
+
|
|
1337
|
+
/*
|
|
1338
|
+
* The destination as the sighting spells it, trimmed - when it is the one
|
|
1339
|
+
* the identity names; the identity's canonical destination otherwise.
|
|
1340
|
+
*/
|
|
1341
|
+
function getDisplayDestination(
|
|
1342
|
+
destination: unknown,
|
|
1343
|
+
identity: MessageQueueIdentity,
|
|
1344
|
+
): string {
|
|
1345
|
+
const display: string =
|
|
1346
|
+
typeof destination === "string" ? destination.trim() : "";
|
|
1347
|
+
|
|
1348
|
+
return display && canonicalizeEntityValue(display) === identity.destination
|
|
1349
|
+
? display
|
|
1350
|
+
: identity.destination;
|
|
1351
|
+
}
|
|
1352
|
+
|
|
1353
|
+
/*
|
|
1354
|
+
* A broker address as the row may store it: trimmed, clamped to the column,
|
|
1355
|
+
* null when blank or when it holds a control character.
|
|
1356
|
+
*/
|
|
1357
|
+
function cleanBrokerAddress(value: unknown): string | null {
|
|
1358
|
+
if (typeof value !== "string") {
|
|
1359
|
+
return null;
|
|
1360
|
+
}
|
|
1361
|
+
|
|
1362
|
+
const address: string = value.trim();
|
|
1363
|
+
|
|
1364
|
+
if (!address || hasControlCharacter(address)) {
|
|
1365
|
+
return null;
|
|
1366
|
+
}
|
|
1367
|
+
|
|
1368
|
+
return truncateLongText(address);
|
|
1369
|
+
}
|
|
1370
|
+
|
|
1371
|
+
/*
|
|
1372
|
+
* A broker datapoint's time as a sighting reports it: `now`, unless a valid
|
|
1373
|
+
* time no later than `now` was given.
|
|
1374
|
+
*/
|
|
1375
|
+
function getSightingTime(at: unknown, now: Date): Date {
|
|
1376
|
+
if (!(at instanceof Date) || !Number.isFinite(at.getTime())) {
|
|
1377
|
+
return now;
|
|
1378
|
+
}
|
|
1379
|
+
|
|
1380
|
+
return at.getTime() > now.getTime() ? now : at;
|
|
1381
|
+
}
|
|
1382
|
+
|
|
1383
|
+
/*
|
|
1384
|
+
* A positive-integer env setting: unset or unparseable → the default, below
|
|
1385
|
+
* the floor → the floor.
|
|
1386
|
+
*/
|
|
1387
|
+
function readIntegerEnv(data: {
|
|
1388
|
+
name: string;
|
|
1389
|
+
defaultValue: number;
|
|
1390
|
+
min: number;
|
|
1391
|
+
}): number {
|
|
1392
|
+
const raw: string | undefined = process.env[data.name];
|
|
1393
|
+
|
|
1394
|
+
if (raw === undefined || raw.trim() === "") {
|
|
1395
|
+
return data.defaultValue;
|
|
1396
|
+
}
|
|
1397
|
+
|
|
1398
|
+
const parsed: number = Number(raw.trim());
|
|
1399
|
+
|
|
1400
|
+
if (!Number.isFinite(parsed) || !Number.isInteger(parsed)) {
|
|
1401
|
+
return data.defaultValue;
|
|
1402
|
+
}
|
|
1403
|
+
|
|
1404
|
+
return Math.max(parsed, data.min);
|
|
1405
|
+
}
|
|
1406
|
+
|
|
1407
|
+
function readCount(rows: unknown): number {
|
|
1408
|
+
if (!Array.isArray(rows) || rows.length === 0) {
|
|
1409
|
+
return 0;
|
|
1410
|
+
}
|
|
1411
|
+
|
|
1412
|
+
const count: number = Number((rows[0] as { count?: unknown })?.count);
|
|
1413
|
+
|
|
1414
|
+
return Number.isFinite(count) ? count : 0;
|
|
1415
|
+
}
|
|
1416
|
+
|
|
1417
|
+
/*
|
|
1418
|
+
* The ids in a relation payload (an update's `labels`): model instances,
|
|
1419
|
+
* `{ _id }` / `{ id }` objects, ObjectIDs or id strings. Anything else is
|
|
1420
|
+
* skipped.
|
|
1421
|
+
*/
|
|
1422
|
+
function readRelationIds(value: unknown): Array<string> {
|
|
1423
|
+
const ids: Array<string> = [];
|
|
1424
|
+
|
|
1425
|
+
for (const item of Array.isArray(value) ? value : []) {
|
|
1426
|
+
let id: unknown = item;
|
|
1427
|
+
|
|
1428
|
+
if (item && typeof item === "object" && !(item instanceof ObjectID)) {
|
|
1429
|
+
id =
|
|
1430
|
+
(item as { _id?: unknown; id?: unknown })._id ||
|
|
1431
|
+
(item as { _id?: unknown; id?: unknown }).id;
|
|
1432
|
+
}
|
|
1433
|
+
|
|
1434
|
+
const text: string =
|
|
1435
|
+
id instanceof ObjectID || typeof id === "string" ? id.toString() : "";
|
|
1436
|
+
|
|
1437
|
+
if (text) {
|
|
1438
|
+
ids.push(text);
|
|
1439
|
+
}
|
|
1440
|
+
}
|
|
1441
|
+
|
|
1442
|
+
return ids;
|
|
1443
|
+
}
|
|
1444
|
+
|
|
1445
|
+
/*
|
|
1446
|
+
* Assignment ids as automaticAssignments stores them: lowercase UUID strings
|
|
1447
|
+
* (what Postgres prints for a uuid column), deduped, invalid ones dropped.
|
|
1448
|
+
*/
|
|
1449
|
+
function normalizeAssignmentIds(ids: Array<ObjectID | string>): Array<string> {
|
|
1450
|
+
const result: Array<string> = [];
|
|
1451
|
+
|
|
1452
|
+
for (const id of Array.isArray(ids) ? ids : []) {
|
|
1453
|
+
const text: string = (id ? id.toString() : "").trim().toLowerCase();
|
|
1454
|
+
|
|
1455
|
+
if (text && ObjectID.isValidUUID(text) && !result.includes(text)) {
|
|
1456
|
+
result.push(text);
|
|
1457
|
+
}
|
|
1458
|
+
}
|
|
1459
|
+
|
|
1460
|
+
return result;
|
|
1461
|
+
}
|
|
1462
|
+
|
|
1463
|
+
export default new Service();
|