@oneuptime/common 14.0.10 → 14.0.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Models/DatabaseModels/AIConversation.ts +127 -1
- package/Models/DatabaseModels/CephCluster.ts +12 -0
- package/Models/DatabaseModels/CloudResource.ts +12 -0
- package/Models/DatabaseModels/DatabaseServer.ts +12 -0
- package/Models/DatabaseModels/DockerHost.ts +12 -0
- package/Models/DatabaseModels/DockerSwarmCluster.ts +12 -0
- package/Models/DatabaseModels/GlobalOidc.ts +0 -4
- package/Models/DatabaseModels/GlobalOidcProject.ts +0 -4
- package/Models/DatabaseModels/GlobalSso.ts +0 -4
- package/Models/DatabaseModels/GlobalSsoProject.ts +0 -4
- package/Models/DatabaseModels/Host.ts +12 -0
- package/Models/DatabaseModels/IncidentForm.ts +594 -0
- package/Models/DatabaseModels/IncidentFormSubmission.ts +283 -0
- package/Models/DatabaseModels/IncidentTemplate.ts +59 -0
- package/Models/DatabaseModels/Index.ts +14 -0
- package/Models/DatabaseModels/IoTFleet.ts +12 -0
- package/Models/DatabaseModels/KubernetesCluster.ts +12 -0
- package/Models/DatabaseModels/MessageQueue.ts +1102 -0
- package/Models/DatabaseModels/MessageQueueLabelRule.ts +553 -0
- package/Models/DatabaseModels/MessageQueueOwnerRule.ts +633 -0
- package/Models/DatabaseModels/MessageQueueOwnerTeam.ts +491 -0
- package/Models/DatabaseModels/MessageQueueOwnerUser.ts +490 -0
- package/Models/DatabaseModels/PodmanHost.ts +12 -0
- package/Models/DatabaseModels/Project.ts +59 -0
- package/Models/DatabaseModels/ProjectOidc.ts +0 -4
- package/Models/DatabaseModels/ProjectSso.ts +0 -4
- package/Models/DatabaseModels/ProxmoxCluster.ts +12 -0
- package/Models/DatabaseModels/RumApplication.ts +12 -0
- package/Models/DatabaseModels/ServerlessFunction.ts +12 -0
- package/Models/DatabaseModels/Service.ts +12 -0
- package/Models/DatabaseModels/StatusPageOidc.ts +0 -4
- package/Models/DatabaseModels/StatusPageSso.ts +0 -4
- package/Models/DatabaseModels/TeamComplianceSetting.ts +47 -2
- package/Models/DatabaseModels/VMwareVCenter.ts +12 -0
- package/Server/API/AIChatAPI.ts +13 -114
- package/Server/API/AIInvestigationAPI.ts +3 -3
- package/Server/API/AIInvestigationConversationAPI.ts +266 -0
- package/Server/API/IncidentFormAPI.ts +376 -0
- package/Server/API/ProjectOIDC.ts +16 -25
- package/Server/API/ProjectSSO.ts +16 -24
- package/Server/API/StatusPageAPI.ts +42 -77
- package/Server/Enterprise/EnterpriseEdition.ts +93 -28
- package/Server/Enterprise/EnterpriseFeature.ts +25 -3
- package/Server/Enterprise/EnterpriseLicenseSnapshot.ts +1 -1
- package/Server/Enterprise/EnterpriseServerModule.ts +4 -1
- package/Server/EnvironmentConfig.ts +1 -1
- package/Server/Infrastructure/Postgres/SchemaMigrations/1796400000000-AddIncidentForms.ts +129 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1796500000000-AddTeamComplianceRuleNotificationChannels.ts +52 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1796600000000-AddAIInvestigationConversationAndTimeLimits.ts +75 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1796700000000-AddMessageQueueTables.ts +477 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +8 -0
- package/Server/Middleware/IncidentFormRateLimit.ts +847 -0
- package/Server/Middleware/UserAuthorization.ts +16 -38
- package/Server/Services/AIService.ts +10 -13
- package/Server/Services/IncidentCustomFieldService.ts +112 -2
- package/Server/Services/IncidentEpisodeMemberService.ts +24 -4
- package/Server/Services/IncidentEpisodeService.ts +10 -1
- package/Server/Services/IncidentFormService.ts +1566 -0
- package/Server/Services/IncidentFormSubmissionService.ts +97 -0
- package/Server/Services/IncidentGroupingEngineService.ts +45 -8
- package/Server/Services/IncidentService.ts +123 -5
- package/Server/Services/IncidentTemplateService.ts +22 -0
- package/Server/Services/Index.ts +14 -0
- package/Server/Services/MessageQueueLabelRuleEngineService.ts +321 -0
- package/Server/Services/MessageQueueLabelRuleService.ts +14 -0
- package/Server/Services/MessageQueueOwnerRuleEngineService.ts +412 -0
- package/Server/Services/MessageQueueOwnerRuleService.ts +14 -0
- package/Server/Services/MessageQueueOwnerTeamService.ts +62 -0
- package/Server/Services/MessageQueueOwnerUserService.ts +62 -0
- package/Server/Services/MessageQueueService.ts +1463 -0
- package/Server/Services/OpenTelemetryIngestService.ts +37 -4
- package/Server/Services/ProjectService.ts +0 -59
- package/Server/Services/StatusPagePrivateUserService.ts +1 -4
- package/Server/Services/StatusPageService.ts +1 -51
- package/Server/Services/TeamComplianceSettingService.ts +163 -42
- package/Server/Services/UserNotificationRuleService.ts +8 -1
- package/Server/Services/WorkspaceNotificationSummaryService.ts +12 -3
- package/Server/Types/Database/Permissions/CreatePermission.ts +17 -3
- package/Server/Types/Database/Permissions/EditionPermission.ts +140 -38
- package/Server/Types/Database/Permissions/OwnerTableRegistry.ts +16 -0
- package/Server/Types/Database/Permissions/TablePermission.ts +3 -3
- package/Server/Types/Database/Permissions/UpdatePermission.ts +20 -6
- package/Server/Utils/AI/Chat/AgentContextCompactor.ts +200 -0
- package/Server/Utils/AI/Chat/ChatAgentRunner.ts +307 -48
- package/Server/Utils/AI/Chat/ChatRunCancellation.ts +156 -0
- package/Server/Utils/AI/Chat/ObservabilityAssistant.ts +78 -18
- package/Server/Utils/AI/Chat/ObservabilityChatPrompt.ts +1 -1
- package/Server/Utils/AI/Chat/ToolOutputPager.ts +322 -0
- package/Server/Utils/AI/ClusterAccess/KubectlInvestigationToolkit.ts +88 -30
- package/Server/Utils/AI/ClusterAccess/KubectlJobRunner.ts +13 -1
- package/Server/Utils/AI/CodeFix/CodeFixReadiness.ts +0 -32
- package/Server/Utils/AI/CodeFix/FixRunBudget.ts +27 -25
- package/Server/Utils/AI/Remediation/RemediationCommandTools.ts +7 -1
- package/Server/Utils/AI/Remediation/RemediationExecutionRunner.ts +34 -14
- package/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.ts +69 -24
- package/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.ts +9 -0
- package/Server/Utils/AI/SRE/AIInvestigationEngine.ts +53 -10
- package/Server/Utils/AI/SRE/AlertInvestigationRunner.ts +27 -10
- package/Server/Utils/AI/SRE/IncidentInvestigationRunner.ts +27 -10
- package/Server/Utils/AI/SRE/InvestigationQueue.ts +16 -19
- package/Server/Utils/AI/SRE/InvestigationThread.ts +646 -0
- package/Server/Utils/AI/SRE/InvestigationThreadService.ts +715 -0
- package/Server/Utils/AI/Toolbox/Serializer.ts +10 -3
- package/Server/Utils/EditionEnforcement.ts +19 -202
- package/Server/Utils/LLM/LLMService.ts +259 -63
- package/Server/Utils/RelaxedScimTeamLocksReport.ts +245 -0
- package/Server/Utils/Rules/RuleRun/RuleRunRegistry.ts +25 -0
- package/Server/Utils/SameOriginRequest.ts +203 -0
- package/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.ts +2 -0
- package/Server/Utils/Telemetry/EntityRegistry.ts +4 -1
- package/Server/Utils/Telemetry/MessageQueueDiscovery.ts +1402 -0
- package/Server/Utils/Telemetry/ResourceEntityFilter.ts +4 -1
- package/Server/Utils/VendorAssets.ts +3 -3
- package/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.ts +3 -1
- package/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.ts +3 -1
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +10 -1
- package/Tests/App/Accounts/IncidentFormPage.test.tsx +2036 -0
- package/Tests/App/Accounts/IncidentFormServerMessages.test.ts +119 -0
- package/Tests/App/Accounts/IncidentFormUtils.test.ts +1157 -0
- package/Tests/App/Accounts/LoginPasskey.test.tsx +6 -4
- package/Tests/App/Accounts/LoginSso.test.tsx +724 -0
- package/Tests/App/AdminDashboard/AdminAuthenticationRequireSso.test.tsx +338 -0
- package/Tests/App/AdminDashboard/AdminAuthenticationSsoCardLocales.test.tsx +331 -0
- package/Tests/App/AdminDashboard/AdminEnterprisePluginPage.test.tsx +47 -33
- package/Tests/App/AdminDashboard/GlobalSsoOidcPages.test.tsx +1021 -0
- package/Tests/App/Dashboard/AffectedResourcesDisplay.test.tsx +876 -78
- package/Tests/App/Dashboard/AffectedResourcesSlo.test.tsx +20 -3
- package/Tests/App/Dashboard/CephProxmoxVMwareDocumentationCards.test.tsx +359 -0
- package/Tests/App/Dashboard/CephSetupGuide.test.ts +961 -0
- package/Tests/App/Dashboard/CloudDocumentationCard.test.tsx +381 -95
- package/Tests/App/Dashboard/CloudSetupGuide.test.ts +1463 -0
- package/Tests/App/Dashboard/ClusterAccessNotice.test.tsx +174 -12
- package/Tests/App/Dashboard/ContainerSetupGuideCards.test.tsx +345 -0
- package/Tests/App/Dashboard/CoreListEmptyStates.test.tsx +501 -0
- package/Tests/App/Dashboard/DashboardLazyPages.test.tsx +0 -1
- package/Tests/App/Dashboard/DatabaseDocumentationCard.test.tsx +400 -0
- package/Tests/App/Dashboard/DatabaseDocumentationMarkdown.test.ts +5 -0
- package/Tests/App/Dashboard/DatabaseSetupGuide.test.ts +1869 -0
- package/Tests/App/Dashboard/DatabaseTelemetryScope.test.ts +44 -0
- package/Tests/App/Dashboard/DatabaseTelemetryTabs.test.tsx +50 -9
- package/Tests/App/Dashboard/DockerSetupGuide.test.ts +899 -0
- package/Tests/App/Dashboard/DockerSwarmSetupGuide.test.ts +964 -0
- package/Tests/App/Dashboard/EnterpriseFeatureUpgrade.test.tsx +141 -7
- package/Tests/App/Dashboard/EnterprisePluginPage.test.tsx +52 -39
- package/Tests/App/Dashboard/EventOverviewPages.test.tsx +7 -1
- package/Tests/App/Dashboard/GettingStartedTaskRoutes.test.tsx +331 -0
- package/Tests/App/Dashboard/HomeOverviewStatsFirstRun.test.tsx +925 -0
- package/Tests/App/Dashboard/HostDocumentationCard.test.tsx +225 -0
- package/Tests/App/Dashboard/HostSetupGuide.test.ts +1183 -0
- package/Tests/App/Dashboard/IdentityEnterpriseShells.test.tsx +69 -45
- package/Tests/App/Dashboard/IncidentCreateTemplateCustomFieldSettings.test.tsx +745 -0
- package/Tests/App/Dashboard/IncidentCreateTemplateOwners.test.tsx +414 -0
- package/Tests/App/Dashboard/IncidentCustomFieldCreateSettingsForm.test.ts +1042 -0
- package/Tests/App/Dashboard/IncidentCustomFieldSettingsCard.test.tsx +1816 -0
- package/Tests/App/Dashboard/IncidentFormPlan.test.ts +89 -0
- package/Tests/App/Dashboard/IncidentFormShareLinkCard.test.tsx +846 -0
- package/Tests/App/Dashboard/IncidentFormsPages.test.tsx +1324 -0
- package/Tests/App/Dashboard/IncidentTemplateCustomFieldSettings.test.tsx +630 -0
- package/Tests/App/Dashboard/IncidentsSideMenu.test.tsx +13 -0
- package/Tests/App/Dashboard/IncomingEmailMonitorLinkVerifyHint.test.tsx +104 -0
- package/Tests/App/Dashboard/InvestigationConversation.test.tsx +1107 -0
- package/Tests/App/Dashboard/InvestigationConversationData.test.ts +546 -0
- package/Tests/App/Dashboard/InvestigationEvidenceList.test.tsx +170 -5
- package/Tests/App/Dashboard/InvestigationNotStarted.test.tsx +207 -2
- package/Tests/App/Dashboard/InvestigationPanel.test.tsx +729 -34
- package/Tests/App/Dashboard/InvestigationPanelStatus.test.tsx +9 -21
- package/Tests/App/Dashboard/InvestigationReportView.test.tsx +274 -37
- package/Tests/App/Dashboard/InvestigationStatusBadge.test.tsx +130 -0
- package/Tests/App/Dashboard/IoTDocumentationCard.test.tsx +218 -0
- package/Tests/App/Dashboard/IoTSetupGuide.test.ts +1124 -0
- package/Tests/App/Dashboard/KubernetesClusterAiAccessSettings.test.ts +20 -6
- package/Tests/App/Dashboard/KubernetesClusterAiDocumentationMarkdown.test.ts +107 -83
- package/Tests/App/Dashboard/KubernetesSetupGuide.test.ts +787 -0
- package/Tests/App/Dashboard/MessageQueueBreadcrumbs.test.tsx +228 -0
- package/Tests/App/Dashboard/MessageQueueBrokerHealth.test.tsx +1538 -0
- package/Tests/App/Dashboard/MessageQueueBrokerHealthMetricChart.test.tsx +969 -0
- package/Tests/App/Dashboard/MessageQueueBrokerHealthReads.test.ts +889 -0
- package/Tests/App/Dashboard/MessageQueueBrokerMetricsReach.test.ts +236 -0
- package/Tests/App/Dashboard/MessageQueueDocumentationCard.test.tsx +479 -0
- package/Tests/App/Dashboard/MessageQueueListPages.test.tsx +1232 -0
- package/Tests/App/Dashboard/MessageQueueMetricDescriptions.test.ts +244 -0
- package/Tests/App/Dashboard/MessageQueueMonitorLink.test.ts +952 -0
- package/Tests/App/Dashboard/MessageQueueMonitorLinkMonitorCreate.test.tsx +859 -0
- package/Tests/App/Dashboard/MessageQueueOverview.test.tsx +1773 -0
- package/Tests/App/Dashboard/MessageQueueOverviewPresentation.test.ts +196 -0
- package/Tests/App/Dashboard/MessageQueuePresentation.test.ts +799 -0
- package/Tests/App/Dashboard/MessageQueueProducersConsumers.test.tsx +680 -0
- package/Tests/App/Dashboard/MessageQueueRoutes.test.tsx +383 -0
- package/Tests/App/Dashboard/MessageQueueRulePages.test.tsx +278 -0
- package/Tests/App/Dashboard/MessageQueueSetupGuide.test.ts +2778 -0
- package/Tests/App/Dashboard/MessageQueueSideMenus.test.tsx +273 -0
- package/Tests/App/Dashboard/MessageQueueSpanPopulations.test.ts +930 -0
- package/Tests/App/Dashboard/MessageQueueSpanStore.ts +351 -0
- package/Tests/App/Dashboard/MessageQueueTelemetryScope.test.ts +375 -0
- package/Tests/App/Dashboard/MessageQueueTelemetryScopeTabs.test.tsx +668 -0
- package/Tests/App/Dashboard/MessageQueueViewPages.test.tsx +685 -0
- package/Tests/App/Dashboard/MonitorAndHomeNotOperationalMenus.test.tsx +342 -0
- package/Tests/App/Dashboard/MonitorCreateFirstRunDefaults.test.tsx +623 -0
- package/Tests/App/Dashboard/MonitorCreateFromMonitorBackedDevice.test.tsx +442 -0
- package/Tests/App/Dashboard/MonitorLogsPageViewSummary.test.tsx +814 -0
- package/Tests/App/Dashboard/MonitorSetupCardBodies.test.tsx +246 -0
- package/Tests/App/Dashboard/NavigationSearchKeywords.test.tsx +8 -0
- package/Tests/App/Dashboard/OnboardingSsoEmptyState.test.tsx +27 -12
- package/Tests/App/Dashboard/PlanGatedPage.test.tsx +292 -0
- package/Tests/App/Dashboard/PodmanSetupGuide.test.ts +948 -0
- package/Tests/App/Dashboard/ProductOrientation.test.tsx +5 -4
- package/Tests/App/Dashboard/ProductSettingsSectionCollapsed.test.tsx +266 -0
- package/Tests/App/Dashboard/ProxmoxSetupGuide.test.ts +1318 -0
- package/Tests/App/Dashboard/ResourceAiAgentAttentionServerParity.test.ts +555 -0
- package/Tests/App/Dashboard/ResourceAiAgentPage.test.tsx +298 -9
- package/Tests/App/Dashboard/ResourceAiAgentStatus.test.ts +453 -0
- package/Tests/App/Dashboard/ResourceArchiveSettings.test.tsx +16 -0
- package/Tests/App/Dashboard/ResourceConnectionGuideCard.test.tsx +444 -0
- package/Tests/App/Dashboard/ResourceConnectionGuideOverviewsInfra.test.tsx +798 -0
- package/Tests/App/Dashboard/ResourceConnectionGuideOverviewsPlatforms.test.tsx +717 -0
- package/Tests/App/Dashboard/ResourceConnectionGuides.test.ts +981 -0
- package/Tests/App/Dashboard/ResourceConnectionState.test.ts +132 -0
- package/Tests/App/Dashboard/RumDocumentationCard.test.tsx +293 -0
- package/Tests/App/Dashboard/RumSessionReplayRetentionSettings.test.tsx +467 -0
- package/Tests/App/Dashboard/RumSetupGuide.test.ts +758 -0
- package/Tests/App/Dashboard/ScheduledMaintenanceOverviewPage.test.tsx +25 -0
- package/Tests/App/Dashboard/ServerlessDocumentationCard.test.tsx +254 -0
- package/Tests/App/Dashboard/ServerlessSetupGuide.test.ts +1074 -0
- package/Tests/App/Dashboard/SetupGuide.test.ts +246 -0
- package/Tests/App/Dashboard/SetupGuideCard.test.tsx +756 -0
- package/Tests/App/Dashboard/SloListSideMenu.test.tsx +120 -0
- package/Tests/App/Dashboard/SsoPages.test.tsx +833 -0
- package/Tests/App/Dashboard/TelemetryDocumentation.test.tsx +253 -0
- package/Tests/App/Dashboard/TelemetryRetentionShells.test.tsx +730 -0
- package/Tests/App/Dashboard/VMwareSetupGuide.test.ts +1033 -0
- package/Tests/App/StatusPage/StatusPageSsoEmptyState.test.tsx +87 -7
- package/Tests/Models/DatabaseModels/DatabaseServerModels.test.ts +28 -9
- package/Tests/Models/DatabaseModels/IncidentFormModel.test.ts +1250 -0
- package/Tests/Models/DatabaseModels/MessageQueueModels.test.ts +1983 -0
- package/Tests/Models/DatabaseModels/StaticRuleCriteriaInheritance.test.ts +4 -2
- package/Tests/Models/DatabaseModels/TeamComplianceSettingModel.test.ts +190 -14
- package/Tests/Models/IncidentTemplateCustomFieldSettingsColumn.test.ts +291 -0
- package/Tests/Server/API/AIInvestigationConversationAPI.test.ts +412 -0
- package/Tests/Server/API/GlobalConfigLicense.test.ts +38 -9
- package/Tests/Server/API/IncidentFormAPI.test.ts +942 -0
- package/Tests/Server/API/IncidentFormPublicRoutes.test.ts +1653 -0
- package/Tests/Server/API/KubernetesClusterAiAccessAPI.test.ts +2 -1
- package/Tests/Server/API/{SsoProviderListingsEdition.test.ts → SsoProviderListings.test.ts} +164 -110
- package/Tests/Server/Enterprise/EnterpriseEdition.test.ts +76 -54
- package/Tests/Server/Enterprise/EnterpriseFeatureActive.test.ts +125 -42
- package/Tests/Server/Enterprise/EnterpriseLicenseSnapshot.test.ts +36 -10
- package/Tests/Server/Enterprise/EnterpriseModelFeatureMap.test.ts +51 -9
- package/Tests/Server/Enterprise/FakeEnterpriseModule.ts +13 -8
- package/Tests/Server/Enterprise/SsoInCommunityEdition.test.ts +540 -0
- package/Tests/Server/Infrastructure/Postgres/AddConfigurableRuleCriteriaMigration.test.ts +3 -0
- package/Tests/Server/Infrastructure/Postgres/AddIncidentFormsMigration.test.ts +438 -0
- package/Tests/Server/Infrastructure/Postgres/AddTeamComplianceRuleNotificationChannelsMigration.test.ts +255 -0
- package/Tests/Server/Infrastructure/Postgres/MessageQueueTablesMigration.test.ts +637 -0
- package/Tests/Server/Middleware/IncidentFormRateLimit.test.ts +1630 -0
- package/Tests/Server/Middleware/UserAuthorization.test.ts +16 -17
- package/Tests/Server/Middleware/UserAuthorizationSsoEnforcement.test.ts +544 -0
- package/Tests/Server/Services/AIServiceDailyBudget.test.ts +37 -8
- package/Tests/Server/Services/IncidentCreatedFeedTitle.test.ts +212 -0
- package/Tests/Server/Services/IncidentCustomFieldDeleteFormQuestions.test.ts +297 -0
- package/Tests/Server/Services/IncidentFormOwnersCreatedNotification.test.ts +497 -0
- package/Tests/Server/Services/IncidentFormPostgres.test.ts +958 -0
- package/Tests/Server/Services/IncidentFormPublicForm.test.ts +1260 -0
- package/Tests/Server/Services/IncidentFormPublicSubmission.test.ts +2520 -0
- package/Tests/Server/Services/IncidentFormRegistration.test.ts +159 -0
- package/Tests/Server/Services/IncidentFormService.test.ts +663 -0
- package/Tests/Server/Services/IncidentFormSubmissionService.test.ts +430 -0
- package/Tests/Server/Services/IncidentFormSubmissionTemplateBranch.test.ts +473 -0
- package/Tests/Server/Services/IncidentGroupingTemplateSubstitution.test.ts +81 -0
- package/Tests/Server/Services/IncidentTemplateCustomFieldSettings.test.ts +262 -0
- package/Tests/Server/Services/IncidentTemplateOwnersOnDeclare.test.ts +566 -0
- package/Tests/Server/Services/IncidentTitleMarkdownSinks.test.ts +640 -0
- package/Tests/Server/Services/LlmLogServiceTokenAggregateParams.test.ts +3 -3
- package/Tests/Server/Services/MessageQueueOwnerServices.test.ts +440 -0
- package/Tests/Server/Services/MessageQueueRegistries.test.ts +577 -0
- package/Tests/Server/Services/MessageQueueRuleEngines.test.ts +900 -0
- package/Tests/Server/Services/MessageQueueService.test.ts +2210 -0
- package/Tests/Server/Services/MessageQueueSqlPostgres.test.ts +1271 -0
- package/Tests/Server/Services/OpenTelemetryResourceRetentionMemo.test.ts +28 -1
- package/Tests/Server/Services/OpenTelemetryRetentionOverrideEdition.test.ts +474 -0
- package/Tests/Server/Services/OpenTelemetryServiceResolutionCache.test.ts +21 -0
- package/Tests/Server/Services/OwnerRowUniqueness.test.ts +3 -0
- package/Tests/Server/Services/ProjectServiceAuditLogLicense.test.ts +0 -1
- package/Tests/Server/Services/RuleRun/LabelRuleEnginesGroupBRun.test.ts +56 -6
- package/Tests/Server/Services/RuleRun/OwnerRuleEnginesGroupBRun.test.ts +30 -1
- package/Tests/Server/Services/SsoRequirementReads.test.ts +454 -0
- package/Tests/Server/Services/SsoRequirementWrites.test.ts +529 -0
- package/Tests/Server/Services/StaticRuleCriteriaRuntimeCoverage.test.ts +3 -3
- package/Tests/Server/Services/StatusPagePrivateUserInvitationPolicy.test.ts +107 -89
- package/Tests/Server/Services/TeamComplianceSettingPostgres.test.ts +1068 -176
- package/Tests/Server/Services/TeamComplianceSettingService.test.ts +1962 -200
- package/Tests/Server/Types/Database/Permissions/EditionPermission.test.ts +654 -297
- package/Tests/Server/Types/Database/Permissions/RetentionOverrideColumns.test.ts +784 -0
- package/Tests/Server/Types/Database/Permissions/SsoScalePlanGate.test.ts +418 -0
- package/Tests/Server/Utils/AI/AIAlertGating.test.ts +0 -1
- package/Tests/Server/Utils/AI/AIInvestigationEngineRunLimits.test.ts +136 -0
- package/Tests/Server/Utils/AI/AIInvestigationQueue.test.ts +15 -14
- package/Tests/Server/Utils/AI/AgentContextCompactor.test.ts +351 -0
- package/Tests/Server/Utils/AI/ChatAgentRunnerSharedThread.test.ts +842 -0
- package/Tests/Server/Utils/AI/ChatRunCancellation.test.ts +195 -0
- package/Tests/Server/Utils/AI/CodeFixReadiness.test.ts +10 -57
- package/Tests/Server/Utils/AI/FixRunBudget.test.ts +20 -24
- package/Tests/Server/Utils/AI/Insights/InvestigationQueueInsightSubject.test.ts +7 -30
- package/Tests/Server/Utils/AI/InvestigationClusterAccessWiring.test.ts +225 -29
- package/Tests/Server/Utils/AI/InvestigationInfrastructureAccessWiring.test.ts +266 -25
- package/Tests/Server/Utils/AI/InvestigationThread.test.ts +580 -0
- package/Tests/Server/Utils/AI/InvestigationThreadService.test.ts +801 -0
- package/Tests/Server/Utils/AI/KubectlInvestigationToolkit.test.ts +525 -43
- package/Tests/Server/Utils/AI/KubectlJobRunner.test.ts +4 -2
- package/Tests/Server/Utils/AI/LLMServiceUnreachableProvider.test.ts +435 -0
- package/Tests/Server/Utils/AI/ObservabilityAssistantLimits.test.ts +462 -0
- package/Tests/Server/Utils/AI/RemediationExecutionRunner.test.ts +14 -25
- package/Tests/Server/Utils/AI/RemediationExecutionRunnerResourceMode.test.ts +2 -0
- package/Tests/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.test.ts +297 -15
- package/Tests/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.test.ts +10 -6
- package/Tests/Server/Utils/AI/ToolOutputPager.test.ts +382 -0
- package/Tests/Server/Utils/AI/ToolResultSerializer.test.ts +23 -4
- package/Tests/Server/Utils/AI/Toolbox/LogTools.test.ts +25 -6
- package/Tests/Server/Utils/AI/Toolbox/Serializer.test.ts +14 -3
- package/Tests/Server/Utils/EditionEnforcement.test.ts +107 -147
- package/Tests/Server/Utils/{CommunityEditionSsoReport.test.ts → RelaxedScimTeamLocksReport.test.ts} +212 -208
- package/Tests/Server/Utils/SameOriginRequest.test.ts +372 -0
- package/Tests/Server/Utils/Telemetry/EntityRegistry.test.ts +20 -0
- package/Tests/Server/Utils/Telemetry/MessageQueueDiscovery.test.ts +2590 -0
- package/Tests/Server/Utils/Telemetry/MessageQueueSpanQueryTwin.ts +246 -0
- package/Tests/Server/Utils/Telemetry/TelemetryEntity.test.ts +23 -0
- package/Tests/Types/AI/AIAgentRunLimits.test.ts +255 -0
- package/Tests/Types/Code/JsonSyntax.test.ts +1300 -0
- package/Tests/Types/CustomField/CustomFieldCreateSettings.test.ts +1113 -0
- package/Tests/Types/CustomField/CustomFieldMappingCatalog.test.ts +91 -0
- package/Tests/Types/CustomField/CustomFieldValueValidator.test.ts +30 -0
- package/Tests/Types/Incident/IncidentFormIpAllowlist.test.ts +227 -0
- package/Tests/Types/Incident/IncidentFormPublic.test.ts +1916 -0
- package/Tests/Types/MessageQueue/MessageQueueEntityKey.test.ts +916 -0
- package/Tests/Types/MessageQueue/MessageQueueIdentity.test.ts +567 -0
- package/Tests/Types/MessageQueue/MessageQueueManualIdentity.test.ts +686 -0
- package/Tests/Types/MessageQueue/MessageQueueMetricCatalog.test.ts +1726 -0
- package/Tests/Types/MessageQueue/MessageQueueMetricResolution.test.ts +1758 -0
- package/Tests/Types/MessageQueue/MessagingInstrumentationFixtures.test.ts +4686 -0
- package/Tests/Types/MessageQueue/MessagingSystem.test.ts +840 -0
- package/Tests/Types/MessageQueue/MessagingTelemetryFixtures.ts +3287 -0
- package/Tests/Types/MessageQueue/MessagingTelemetryResolver.test.ts +2966 -0
- package/Tests/Types/Monitor/MessageQueueAlertTemplates.test.ts +5401 -0
- package/Tests/Types/Monitor/MetricEngineFold.ts +154 -0
- package/Tests/Types/ResourceAiAgent/ResourceAiAccess.test.ts +5 -3
- package/Tests/Types/Team/ComplianceRule.test.ts +588 -37
- package/Tests/Types/Team/TeamComplianceStatus.test.ts +64 -11
- package/Tests/Types/XML.test.ts +51 -0
- package/Tests/UI/Components/CodeEditor/CodeEditor.test.tsx +2362 -0
- package/Tests/UI/Components/CodeEditor/CodeEditorCommands.test.ts +810 -0
- package/Tests/UI/Components/CodeEditor/CodeEditorHighlight.test.ts +338 -0
- package/Tests/UI/Components/CodeEditor/CodeEditorLanguages.test.ts +222 -0
- package/Tests/UI/Components/CodeEditor/CodeEditorStyles.test.ts +807 -0
- package/Tests/UI/Components/CodeEditor/NoMonaco.test.ts +245 -0
- package/Tests/UI/Components/CodeEditor/YamlEditor.test.tsx +729 -0
- package/Tests/UI/Components/CopyTextButton.test.tsx +76 -0
- package/Tests/UI/Components/EditionLabelLapseCopy.ts +51 -14
- package/Tests/UI/Components/EditionLabelLicenseStatus.test.tsx +131 -23
- package/Tests/UI/Components/ErrorMessageAction.test.tsx +142 -0
- package/Tests/UI/Components/FacetSidebarInScope.test.tsx +459 -0
- package/Tests/UI/Components/FacetValuesInScope.test.ts +270 -0
- package/Tests/UI/Components/Forms/FormFieldCodeEditors.test.tsx +294 -0
- package/Tests/UI/Components/Forms/FormFieldMarkdown.test.tsx +126 -0
- package/Tests/UI/Components/Forms/FormFieldYaml.test.tsx +22 -75
- package/Tests/UI/Components/Forms/ModelFormOnBeforeCreateMiscData.test.tsx +254 -0
- package/Tests/UI/Components/Icon.test.tsx +32 -0
- package/Tests/UI/Components/Input.test.tsx +31 -0
- package/Tests/UI/Components/LockedFilterChipScope.test.tsx +501 -0
- package/Tests/UI/Components/MarkdownConverters.test.ts +253 -1
- package/Tests/UI/Components/MarkdownEditor.test.tsx +2785 -2
- package/Tests/UI/Components/MarkdownEditorHistory.test.ts +243 -0
- package/Tests/UI/Components/MarkdownListEditing.test.ts +1118 -0
- package/Tests/UI/Components/MarkdownPaste.test.ts +1180 -0
- package/Tests/UI/Components/MarkdownViewerCopy.test.tsx +466 -0
- package/Tests/UI/Components/MarkdownVisualEditing.test.ts +1089 -0
- package/Tests/UI/Components/ModelTable/BaseModelTableEmptyStateAction.test.tsx +623 -0
- package/Tests/UI/Components/ResetObjectID.test.tsx +282 -0
- package/Tests/UI/Components/RuleCriteria/RuleCriteriaModelTable.test.tsx +3 -3
- package/Tests/UI/Components/Table/EmptyTableMessage.test.ts +439 -0
- package/Tests/UI/Components/Table/TableEmptyState.test.tsx +352 -0
- package/Tests/UI/Components/TableRowMobileTitles.test.tsx +78 -0
- package/Tests/UI/Components/TextArea.test.tsx +19 -0
- package/Tests/UI/Components/Workflow/ModelColumnEditor.render.test.tsx +12 -29
- package/Tests/UI/Components/fixtures/MarkdownPasteFixtures.ts +460 -0
- package/Tests/UI/EsbuildConfig.test.ts +115 -39
- package/Tests/UI/EsbuildEnterpriseAlias.test.ts +4 -4
- package/Tests/UI/Monitor/MonitorLogSummaryRender.test.tsx +377 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +81 -1
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +17 -0
- package/Tests/Utils/LabelRuleImportExport.test.ts +5 -0
- package/Tests/Utils/Markdown/DashboardMarkdownRenderer.ts +81 -0
- package/Tests/Utils/Markdown/UntrustedMarkdown.test.ts +1339 -0
- package/Tests/Utils/Monitor/MonitorLogSummaryUtil.test.ts +862 -0
- package/Types/AI/AIAgentRunLimits.ts +146 -0
- package/Types/Code/CodeType.ts +2 -0
- package/Types/Code/JsonSyntax.ts +923 -0
- package/Types/CustomField/CustomFieldCreateSettings.ts +549 -0
- package/Types/CustomField/CustomFieldMappingCatalog.ts +77 -0
- package/Types/CustomField/CustomFieldValueValidator.ts +10 -7
- package/Types/EnterpriseLicense/EnterpriseLicensePeriods.ts +1 -1
- package/Types/Icon/IconProp.ts +2 -0
- package/Types/Incident/IncidentFormIpAllowlist.ts +206 -0
- package/Types/Incident/IncidentFormPublic.ts +1145 -0
- package/Types/Kubernetes/KubernetesClusterAiAccess.ts +10 -3
- package/Types/MessageQueue/MessageQueueIdentity.ts +256 -0
- package/Types/MessageQueue/MessageQueueManualIdentity.ts +325 -0
- package/Types/MessageQueue/MessageQueueMetricCatalog.ts +1357 -0
- package/Types/MessageQueue/MessagingSystem.ts +518 -0
- package/Types/MessageQueue/MessagingTelemetryResolver.ts +2311 -0
- package/Types/Monitor/MessageQueueAlertTemplates.ts +2128 -0
- package/Types/Permission.ts +310 -0
- package/Types/ResourceAiAgent/ResourceAiAccess.ts +10 -4
- package/Types/Rules/RuleCriteriaFieldRegistry.ts +12 -0
- package/Types/Rules/RuleRun.ts +4 -0
- package/Types/Team/ComplianceNotificationChannel.ts +4 -3
- package/Types/Team/ComplianceRule.ts +71 -18
- package/Types/Team/ComplianceRuleType.ts +2 -2
- package/Types/Team/TeamComplianceStatus.ts +6 -2
- package/Types/Telemetry/EntityType.ts +16 -0
- package/Types/Telemetry/LockedFilterDetail.ts +22 -0
- package/Types/XML.ts +26 -0
- package/UI/Components/CodeEditor/CodeEditor.css +379 -0
- package/UI/Components/CodeEditor/CodeEditor.tsx +1128 -294
- package/UI/Components/CodeEditor/CodeEditorCommands.ts +774 -0
- package/UI/Components/CodeEditor/CodeEditorHighlight.ts +106 -0
- package/UI/Components/CodeEditor/CodeEditorLanguages.ts +164 -0
- package/UI/Components/CodeEditor/YamlEditor.tsx +28 -326
- package/UI/Components/CopyTextButton/CopyTextButton.tsx +5 -1
- package/UI/Components/CustomFields/CustomFieldModelFormFields.tsx +6 -25
- package/UI/Components/EditionLabel/EditionLabel.tsx +14 -13
- package/UI/Components/ErrorMessage/ErrorMessage.tsx +11 -1
- package/UI/Components/Forms/Fields/FormField.tsx +8 -0
- package/UI/Components/Forms/Types/Field.ts +8 -0
- package/UI/Components/Icon/Icon.tsx +18 -0
- package/UI/Components/Input/Input.tsx +11 -4
- package/UI/Components/LogsViewer/LogsViewer.tsx +4 -0
- package/UI/Components/LogsViewer/components/LogsFacetSidebar.tsx +21 -3
- package/UI/Components/Markdown.tsx/MarkdownConverters.ts +0 -0
- package/UI/Components/Markdown.tsx/MarkdownEditor.tsx +877 -79
- package/UI/Components/Markdown.tsx/MarkdownEditorHistory.ts +284 -0
- package/UI/Components/Markdown.tsx/MarkdownListEditing.ts +1362 -0
- package/UI/Components/Markdown.tsx/MarkdownPaste.ts +1326 -0
- package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +106 -10
- package/UI/Components/Markdown.tsx/MarkdownVisualEditing.ts +1032 -0
- package/UI/Components/ModelTable/BaseModelTable.tsx +85 -7
- package/UI/Components/ResetObjectID/ResetObjectID.tsx +35 -9
- package/UI/Components/Table/EmptyTableMessage.ts +81 -0
- package/UI/Components/Table/Table.tsx +50 -21
- package/UI/Components/Table/TableRow.tsx +9 -1
- package/UI/Components/TelemetryViewer/FacetVisibility.ts +97 -2
- package/UI/Components/TelemetryViewer/TelemetryViewer.tsx +13 -0
- package/UI/Components/TelemetryViewer/components/LockedFilterChip.tsx +214 -7
- package/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.tsx +21 -3
- package/UI/Components/TextArea/TextArea.tsx +9 -2
- package/UI/Components/Workflow/ModelFieldPicker.tsx +10 -12
- package/UI/Styles/Theme.css +8 -0
- package/UI/esbuild-config.js +2 -32
- package/Utils/LabelRuleImportExport.ts +2 -0
- package/Utils/Markdown/UntrustedMarkdown.ts +1513 -0
- package/Utils/Monitor/IncomingEmailMonitorRequestUtil.ts +41 -0
- package/Utils/Monitor/MonitorLogSummaryUtil.ts +212 -0
- package/Utils/Telemetry/EntityKey.ts +48 -0
- package/build/dist/Models/DatabaseModels/AIConversation.js +125 -1
- package/build/dist/Models/DatabaseModels/AIConversation.js.map +1 -1
- package/build/dist/Models/DatabaseModels/CephCluster.js +12 -0
- package/build/dist/Models/DatabaseModels/CephCluster.js.map +1 -1
- package/build/dist/Models/DatabaseModels/CloudResource.js +12 -0
- package/build/dist/Models/DatabaseModels/CloudResource.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DatabaseServer.js +12 -0
- package/build/dist/Models/DatabaseModels/DatabaseServer.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DockerHost.js +12 -0
- package/build/dist/Models/DatabaseModels/DockerHost.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DockerSwarmCluster.js +12 -0
- package/build/dist/Models/DatabaseModels/DockerSwarmCluster.js.map +1 -1
- package/build/dist/Models/DatabaseModels/GlobalOidc.js +0 -4
- package/build/dist/Models/DatabaseModels/GlobalOidc.js.map +1 -1
- package/build/dist/Models/DatabaseModels/GlobalOidcProject.js +0 -4
- package/build/dist/Models/DatabaseModels/GlobalOidcProject.js.map +1 -1
- package/build/dist/Models/DatabaseModels/GlobalSso.js +0 -4
- package/build/dist/Models/DatabaseModels/GlobalSso.js.map +1 -1
- package/build/dist/Models/DatabaseModels/GlobalSsoProject.js +0 -4
- package/build/dist/Models/DatabaseModels/GlobalSsoProject.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Host.js +12 -0
- package/build/dist/Models/DatabaseModels/Host.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentForm.js +605 -0
- package/build/dist/Models/DatabaseModels/IncidentForm.js.map +1 -0
- package/build/dist/Models/DatabaseModels/IncidentFormSubmission.js +299 -0
- package/build/dist/Models/DatabaseModels/IncidentFormSubmission.js.map +1 -0
- package/build/dist/Models/DatabaseModels/IncidentTemplate.js +60 -0
- package/build/dist/Models/DatabaseModels/IncidentTemplate.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +14 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IoTFleet.js +12 -0
- package/build/dist/Models/DatabaseModels/IoTFleet.js.map +1 -1
- package/build/dist/Models/DatabaseModels/KubernetesCluster.js +12 -0
- package/build/dist/Models/DatabaseModels/KubernetesCluster.js.map +1 -1
- package/build/dist/Models/DatabaseModels/MessageQueue.js +1106 -0
- package/build/dist/Models/DatabaseModels/MessageQueue.js.map +1 -0
- package/build/dist/Models/DatabaseModels/MessageQueueLabelRule.js +562 -0
- package/build/dist/Models/DatabaseModels/MessageQueueLabelRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/MessageQueueOwnerRule.js +643 -0
- package/build/dist/Models/DatabaseModels/MessageQueueOwnerRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/MessageQueueOwnerTeam.js +506 -0
- package/build/dist/Models/DatabaseModels/MessageQueueOwnerTeam.js.map +1 -0
- package/build/dist/Models/DatabaseModels/MessageQueueOwnerUser.js +505 -0
- package/build/dist/Models/DatabaseModels/MessageQueueOwnerUser.js.map +1 -0
- package/build/dist/Models/DatabaseModels/PodmanHost.js +12 -0
- package/build/dist/Models/DatabaseModels/PodmanHost.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Project.js +61 -0
- package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ProjectOidc.js +0 -4
- package/build/dist/Models/DatabaseModels/ProjectOidc.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ProjectSso.js +0 -4
- package/build/dist/Models/DatabaseModels/ProjectSso.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ProxmoxCluster.js +12 -0
- package/build/dist/Models/DatabaseModels/ProxmoxCluster.js.map +1 -1
- package/build/dist/Models/DatabaseModels/RumApplication.js +12 -0
- package/build/dist/Models/DatabaseModels/RumApplication.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServerlessFunction.js +12 -0
- package/build/dist/Models/DatabaseModels/ServerlessFunction.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Service.js +12 -0
- package/build/dist/Models/DatabaseModels/Service.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageOidc.js +0 -4
- package/build/dist/Models/DatabaseModels/StatusPageOidc.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageSso.js +0 -4
- package/build/dist/Models/DatabaseModels/StatusPageSso.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TeamComplianceSetting.js +49 -3
- package/build/dist/Models/DatabaseModels/TeamComplianceSetting.js.map +1 -1
- package/build/dist/Models/DatabaseModels/VMwareVCenter.js +12 -0
- package/build/dist/Models/DatabaseModels/VMwareVCenter.js.map +1 -1
- package/build/dist/Server/API/AIChatAPI.js +9 -103
- package/build/dist/Server/API/AIChatAPI.js.map +1 -1
- package/build/dist/Server/API/AIInvestigationAPI.js +3 -3
- package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
- package/build/dist/Server/API/AIInvestigationConversationAPI.js +162 -0
- package/build/dist/Server/API/AIInvestigationConversationAPI.js.map +1 -0
- package/build/dist/Server/API/IncidentFormAPI.js +245 -0
- package/build/dist/Server/API/IncidentFormAPI.js.map +1 -0
- package/build/dist/Server/API/ProjectOIDC.js +16 -24
- package/build/dist/Server/API/ProjectOIDC.js.map +1 -1
- package/build/dist/Server/API/ProjectSSO.js +16 -24
- package/build/dist/Server/API/ProjectSSO.js.map +1 -1
- package/build/dist/Server/API/StatusPageAPI.js +42 -75
- package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
- package/build/dist/Server/Enterprise/EnterpriseEdition.js +79 -25
- package/build/dist/Server/Enterprise/EnterpriseEdition.js.map +1 -1
- package/build/dist/Server/Enterprise/EnterpriseFeature.js +24 -3
- package/build/dist/Server/Enterprise/EnterpriseFeature.js.map +1 -1
- package/build/dist/Server/Enterprise/EnterpriseLicenseSnapshot.js +1 -1
- package/build/dist/Server/Enterprise/EnterpriseServerModule.js.map +1 -1
- package/build/dist/Server/EnvironmentConfig.js +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796400000000-AddIncidentForms.js +63 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796400000000-AddIncidentForms.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796500000000-AddTeamComplianceRuleNotificationChannels.js +41 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796500000000-AddTeamComplianceRuleNotificationChannels.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796600000000-AddAIInvestigationConversationAndTimeLimits.js +40 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796600000000-AddAIInvestigationConversationAndTimeLimits.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796700000000-AddMessageQueueTables.js +183 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796700000000-AddMessageQueueTables.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +8 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Middleware/IncidentFormRateLimit.js +559 -0
- package/build/dist/Server/Middleware/IncidentFormRateLimit.js.map +1 -0
- package/build/dist/Server/Middleware/UserAuthorization.js +11 -30
- package/build/dist/Server/Middleware/UserAuthorization.js.map +1 -1
- package/build/dist/Server/Services/AIService.js +10 -13
- package/build/dist/Server/Services/AIService.js.map +1 -1
- package/build/dist/Server/Services/IncidentCustomFieldService.js +83 -0
- package/build/dist/Server/Services/IncidentCustomFieldService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeMemberService.js +8 -4
- package/build/dist/Server/Services/IncidentEpisodeMemberService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeService.js +10 -1
- package/build/dist/Server/Services/IncidentEpisodeService.js.map +1 -1
- package/build/dist/Server/Services/IncidentFormService.js +1202 -0
- package/build/dist/Server/Services/IncidentFormService.js.map +1 -0
- package/build/dist/Server/Services/IncidentFormSubmissionService.js +91 -0
- package/build/dist/Server/Services/IncidentFormSubmissionService.js.map +1 -0
- package/build/dist/Server/Services/IncidentGroupingEngineService.js +20 -8
- package/build/dist/Server/Services/IncidentGroupingEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentService.js +106 -4
- package/build/dist/Server/Services/IncidentService.js.map +1 -1
- package/build/dist/Server/Services/IncidentTemplateService.js +18 -0
- package/build/dist/Server/Services/IncidentTemplateService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +14 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/MessageQueueLabelRuleEngineService.js +262 -0
- package/build/dist/Server/Services/MessageQueueLabelRuleEngineService.js.map +1 -0
- package/build/dist/Server/Services/MessageQueueLabelRuleService.js +13 -0
- package/build/dist/Server/Services/MessageQueueLabelRuleService.js.map +1 -0
- package/build/dist/Server/Services/MessageQueueOwnerRuleEngineService.js +334 -0
- package/build/dist/Server/Services/MessageQueueOwnerRuleEngineService.js.map +1 -0
- package/build/dist/Server/Services/MessageQueueOwnerRuleService.js +13 -0
- package/build/dist/Server/Services/MessageQueueOwnerRuleService.js.map +1 -0
- package/build/dist/Server/Services/MessageQueueOwnerTeamService.js +62 -0
- package/build/dist/Server/Services/MessageQueueOwnerTeamService.js.map +1 -0
- package/build/dist/Server/Services/MessageQueueOwnerUserService.js +62 -0
- package/build/dist/Server/Services/MessageQueueOwnerUserService.js.map +1 -0
- package/build/dist/Server/Services/MessageQueueService.js +1140 -0
- package/build/dist/Server/Services/MessageQueueService.js.map +1 -0
- package/build/dist/Server/Services/OpenTelemetryIngestService.js +25 -4
- package/build/dist/Server/Services/OpenTelemetryIngestService.js.map +1 -1
- package/build/dist/Server/Services/ProjectService.js +0 -54
- package/build/dist/Server/Services/ProjectService.js.map +1 -1
- package/build/dist/Server/Services/StatusPagePrivateUserService.js +1 -4
- package/build/dist/Server/Services/StatusPagePrivateUserService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageService.js +0 -46
- package/build/dist/Server/Services/StatusPageService.js.map +1 -1
- package/build/dist/Server/Services/TeamComplianceSettingService.js +120 -31
- package/build/dist/Server/Services/TeamComplianceSettingService.js.map +1 -1
- package/build/dist/Server/Services/UserNotificationRuleService.js +8 -1
- package/build/dist/Server/Services/UserNotificationRuleService.js.map +1 -1
- package/build/dist/Server/Services/WorkspaceNotificationSummaryService.js +12 -3
- package/build/dist/Server/Services/WorkspaceNotificationSummaryService.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/CreatePermission.js +6 -3
- package/build/dist/Server/Types/Database/Permissions/CreatePermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/EditionPermission.js +109 -37
- package/build/dist/Server/Types/Database/Permissions/EditionPermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js +16 -0
- package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/TablePermission.js +3 -3
- package/build/dist/Server/Types/Database/Permissions/UpdatePermission.js +9 -6
- package/build/dist/Server/Types/Database/Permissions/UpdatePermission.js.map +1 -1
- package/build/dist/Server/Utils/AI/Chat/AgentContextCompactor.js +128 -0
- package/build/dist/Server/Utils/AI/Chat/AgentContextCompactor.js.map +1 -0
- package/build/dist/Server/Utils/AI/Chat/ChatAgentRunner.js +192 -50
- package/build/dist/Server/Utils/AI/Chat/ChatAgentRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/Chat/ChatRunCancellation.js +133 -0
- package/build/dist/Server/Utils/AI/Chat/ChatRunCancellation.js.map +1 -0
- package/build/dist/Server/Utils/AI/Chat/ObservabilityAssistant.js +53 -13
- package/build/dist/Server/Utils/AI/Chat/ObservabilityAssistant.js.map +1 -1
- package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js +1 -1
- package/build/dist/Server/Utils/AI/Chat/ToolOutputPager.js +206 -0
- package/build/dist/Server/Utils/AI/Chat/ToolOutputPager.js.map +1 -0
- package/build/dist/Server/Utils/AI/ClusterAccess/KubectlInvestigationToolkit.js +53 -26
- package/build/dist/Server/Utils/AI/ClusterAccess/KubectlInvestigationToolkit.js.map +1 -1
- package/build/dist/Server/Utils/AI/ClusterAccess/KubectlJobRunner.js +4 -2
- package/build/dist/Server/Utils/AI/ClusterAccess/KubectlJobRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/CodeFix/CodeFixReadiness.js +1 -29
- package/build/dist/Server/Utils/AI/CodeFix/CodeFixReadiness.js.map +1 -1
- package/build/dist/Server/Utils/AI/CodeFix/FixRunBudget.js +24 -24
- package/build/dist/Server/Utils/AI/CodeFix/FixRunBudget.js.map +1 -1
- package/build/dist/Server/Utils/AI/Remediation/RemediationCommandTools.js +7 -2
- package/build/dist/Server/Utils/AI/Remediation/RemediationCommandTools.js.map +1 -1
- package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js +29 -14
- package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.js +38 -14
- package/build/dist/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.js.map +1 -1
- package/build/dist/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.js +2 -0
- package/build/dist/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js +40 -10
- package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js +19 -7
- package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js +19 -7
- package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/InvestigationQueue.js +15 -18
- package/build/dist/Server/Utils/AI/SRE/InvestigationQueue.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/InvestigationThread.js +412 -0
- package/build/dist/Server/Utils/AI/SRE/InvestigationThread.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/InvestigationThreadService.js +495 -0
- package/build/dist/Server/Utils/AI/SRE/InvestigationThreadService.js.map +1 -0
- package/build/dist/Server/Utils/AI/Toolbox/Serializer.js +10 -3
- package/build/dist/Server/Utils/AI/Toolbox/Serializer.js.map +1 -1
- package/build/dist/Server/Utils/EditionEnforcement.js +20 -158
- package/build/dist/Server/Utils/EditionEnforcement.js.map +1 -1
- package/build/dist/Server/Utils/LLM/LLMService.js +193 -54
- package/build/dist/Server/Utils/LLM/LLMService.js.map +1 -1
- package/build/dist/Server/Utils/RelaxedScimTeamLocksReport.js +160 -0
- package/build/dist/Server/Utils/RelaxedScimTeamLocksReport.js.map +1 -0
- package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js +25 -0
- package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js.map +1 -1
- package/build/dist/Server/Utils/SameOriginRequest.js +151 -0
- package/build/dist/Server/Utils/SameOriginRequest.js.map +1 -0
- package/build/dist/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.js +2 -0
- package/build/dist/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/EntityRegistry.js +4 -1
- package/build/dist/Server/Utils/Telemetry/EntityRegistry.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/MessageQueueDiscovery.js +1015 -0
- package/build/dist/Server/Utils/Telemetry/MessageQueueDiscovery.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js +4 -1
- package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js.map +1 -1
- package/build/dist/Server/Utils/VendorAssets.js +3 -3
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.js +3 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.js +3 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +10 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
- package/build/dist/Types/AI/AIAgentRunLimits.js +91 -0
- package/build/dist/Types/AI/AIAgentRunLimits.js.map +1 -0
- package/build/dist/Types/Code/CodeType.js +2 -0
- package/build/dist/Types/Code/CodeType.js.map +1 -1
- package/build/dist/Types/Code/JsonSyntax.js +604 -0
- package/build/dist/Types/Code/JsonSyntax.js.map +1 -0
- package/build/dist/Types/CustomField/CustomFieldCreateSettings.js +310 -0
- package/build/dist/Types/CustomField/CustomFieldCreateSettings.js.map +1 -0
- package/build/dist/Types/CustomField/CustomFieldMappingCatalog.js +38 -0
- package/build/dist/Types/CustomField/CustomFieldMappingCatalog.js.map +1 -1
- package/build/dist/Types/CustomField/CustomFieldValueValidator.js +10 -7
- package/build/dist/Types/CustomField/CustomFieldValueValidator.js.map +1 -1
- package/build/dist/Types/EnterpriseLicense/EnterpriseLicensePeriods.js +1 -1
- package/build/dist/Types/Icon/IconProp.js +2 -0
- package/build/dist/Types/Icon/IconProp.js.map +1 -1
- package/build/dist/Types/Incident/IncidentFormIpAllowlist.js +119 -0
- package/build/dist/Types/Incident/IncidentFormIpAllowlist.js.map +1 -0
- package/build/dist/Types/Incident/IncidentFormPublic.js +678 -0
- package/build/dist/Types/Incident/IncidentFormPublic.js.map +1 -0
- package/build/dist/Types/Kubernetes/KubernetesClusterAiAccess.js +10 -3
- package/build/dist/Types/Kubernetes/KubernetesClusterAiAccess.js.map +1 -1
- package/build/dist/Types/MessageQueue/MessageQueueIdentity.js +184 -0
- package/build/dist/Types/MessageQueue/MessageQueueIdentity.js.map +1 -0
- package/build/dist/Types/MessageQueue/MessageQueueManualIdentity.js +190 -0
- package/build/dist/Types/MessageQueue/MessageQueueManualIdentity.js.map +1 -0
- package/build/dist/Types/MessageQueue/MessageQueueMetricCatalog.js +1057 -0
- package/build/dist/Types/MessageQueue/MessageQueueMetricCatalog.js.map +1 -0
- package/build/dist/Types/MessageQueue/MessagingSystem.js +394 -0
- package/build/dist/Types/MessageQueue/MessagingSystem.js.map +1 -0
- package/build/dist/Types/MessageQueue/MessagingTelemetryResolver.js +1768 -0
- package/build/dist/Types/MessageQueue/MessagingTelemetryResolver.js.map +1 -0
- package/build/dist/Types/Monitor/MessageQueueAlertTemplates.js +1207 -0
- package/build/dist/Types/Monitor/MessageQueueAlertTemplates.js.map +1 -0
- package/build/dist/Types/Permission.js +274 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/ResourceAiAgent/ResourceAiAccess.js +10 -4
- package/build/dist/Types/ResourceAiAgent/ResourceAiAccess.js.map +1 -1
- package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js +12 -0
- package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js.map +1 -1
- package/build/dist/Types/Rules/RuleRun.js +4 -0
- package/build/dist/Types/Rules/RuleRun.js.map +1 -1
- package/build/dist/Types/Team/ComplianceNotificationChannel.js +4 -3
- package/build/dist/Types/Team/ComplianceNotificationChannel.js.map +1 -1
- package/build/dist/Types/Team/ComplianceRule.js +48 -14
- package/build/dist/Types/Team/ComplianceRule.js.map +1 -1
- package/build/dist/Types/Team/ComplianceRuleType.js +2 -2
- package/build/dist/Types/Telemetry/EntityType.js +16 -0
- package/build/dist/Types/Telemetry/EntityType.js.map +1 -1
- package/build/dist/Types/XML.js +23 -0
- package/build/dist/Types/XML.js.map +1 -1
- package/build/dist/UI/Components/CodeEditor/CodeEditor.js +641 -266
- package/build/dist/UI/Components/CodeEditor/CodeEditor.js.map +1 -1
- package/build/dist/UI/Components/CodeEditor/CodeEditorCommands.js +464 -0
- package/build/dist/UI/Components/CodeEditor/CodeEditorCommands.js.map +1 -0
- package/build/dist/UI/Components/CodeEditor/CodeEditorHighlight.js +69 -0
- package/build/dist/UI/Components/CodeEditor/CodeEditorHighlight.js.map +1 -0
- package/build/dist/UI/Components/CodeEditor/CodeEditorLanguages.js +108 -0
- package/build/dist/UI/Components/CodeEditor/CodeEditorLanguages.js.map +1 -0
- package/build/dist/UI/Components/CodeEditor/YamlEditor.js +14 -186
- package/build/dist/UI/Components/CodeEditor/YamlEditor.js.map +1 -1
- package/build/dist/UI/Components/CopyTextButton/CopyTextButton.js +5 -1
- package/build/dist/UI/Components/CopyTextButton/CopyTextButton.js.map +1 -1
- package/build/dist/UI/Components/CustomFields/CustomFieldModelFormFields.js +5 -14
- package/build/dist/UI/Components/CustomFields/CustomFieldModelFormFields.js.map +1 -1
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js +14 -13
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
- package/build/dist/UI/Components/ErrorMessage/ErrorMessage.js +1 -1
- package/build/dist/UI/Components/ErrorMessage/ErrorMessage.js.map +1 -1
- package/build/dist/UI/Components/Forms/Fields/FormField.js +8 -3
- package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
- package/build/dist/UI/Components/Icon/Icon.js +8 -0
- package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
- package/build/dist/UI/Components/Input/Input.js +11 -3
- package/build/dist/UI/Components/Input/Input.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/LogsViewer.js +2 -1
- package/build/dist/UI/Components/LogsViewer/LogsViewer.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js +14 -4
- package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js.map +1 -1
- package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js +0 -0
- package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js.map +1 -1
- package/build/dist/UI/Components/Markdown.tsx/MarkdownEditor.js +710 -65
- package/build/dist/UI/Components/Markdown.tsx/MarkdownEditor.js.map +1 -1
- package/build/dist/UI/Components/Markdown.tsx/MarkdownEditorHistory.js +238 -0
- package/build/dist/UI/Components/Markdown.tsx/MarkdownEditorHistory.js.map +1 -0
- package/build/dist/UI/Components/Markdown.tsx/MarkdownListEditing.js +1028 -0
- package/build/dist/UI/Components/Markdown.tsx/MarkdownListEditing.js.map +1 -0
- package/build/dist/UI/Components/Markdown.tsx/MarkdownPaste.js +1088 -0
- package/build/dist/UI/Components/Markdown.tsx/MarkdownPaste.js.map +1 -0
- package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js +70 -10
- package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js.map +1 -1
- package/build/dist/UI/Components/Markdown.tsx/MarkdownVisualEditing.js +887 -0
- package/build/dist/UI/Components/Markdown.tsx/MarkdownVisualEditing.js.map +1 -0
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +57 -6
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/ResetObjectID/ResetObjectID.js +7 -5
- package/build/dist/UI/Components/ResetObjectID/ResetObjectID.js.map +1 -1
- package/build/dist/UI/Components/Table/EmptyTableMessage.js +51 -0
- package/build/dist/UI/Components/Table/EmptyTableMessage.js.map +1 -0
- package/build/dist/UI/Components/Table/Table.js +30 -11
- package/build/dist/UI/Components/Table/Table.js.map +1 -1
- package/build/dist/UI/Components/Table/TableRow.js +9 -2
- package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/FacetVisibility.js +63 -1
- package/build/dist/UI/Components/TelemetryViewer/FacetVisibility.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js +4 -2
- package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/LockedFilterChip.js +91 -10
- package/build/dist/UI/Components/TelemetryViewer/components/LockedFilterChip.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js +14 -4
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js.map +1 -1
- package/build/dist/UI/Components/TextArea/TextArea.js +9 -3
- package/build/dist/UI/Components/TextArea/TextArea.js.map +1 -1
- package/build/dist/UI/Components/Workflow/ModelFieldPicker.js +1 -2
- package/build/dist/UI/Components/Workflow/ModelFieldPicker.js.map +1 -1
- package/build/dist/Utils/LabelRuleImportExport.js +2 -0
- package/build/dist/Utils/LabelRuleImportExport.js.map +1 -1
- package/build/dist/Utils/Markdown/UntrustedMarkdown.js +988 -0
- package/build/dist/Utils/Markdown/UntrustedMarkdown.js.map +1 -0
- package/build/dist/Utils/Monitor/IncomingEmailMonitorRequestUtil.js +34 -0
- package/build/dist/Utils/Monitor/IncomingEmailMonitorRequestUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/MonitorLogSummaryUtil.js +148 -0
- package/build/dist/Utils/Monitor/MonitorLogSummaryUtil.js.map +1 -0
- package/build/dist/Utils/Telemetry/EntityKey.js +36 -0
- package/build/dist/Utils/Telemetry/EntityKey.js.map +1 -1
- package/package.json +1 -3
- package/Server/Utils/CommunityEditionSsoReport.ts +0 -361
- package/Tests/App/Accounts/LoginSsoEdition.test.tsx +0 -616
- package/Tests/App/AdminDashboard/AdminAuthenticationSsoEdition.test.tsx +0 -217
- package/Tests/App/AdminDashboard/GlobalSSOEnterpriseShells.test.tsx +0 -271
- package/Tests/App/Dashboard/CloudDocumentationMarkdown.test.ts +0 -215
- package/Tests/App/Dashboard/TelemetryResourceRetentionSettings.test.tsx +0 -784
- package/Tests/Server/Middleware/UserAuthorizationEditionEnforcement.test.ts +0 -518
- package/Tests/Server/Services/SsoRequirementReadMasking.test.ts +0 -419
- package/Tests/Server/Services/SsoRequirementWriteGuard.test.ts +0 -769
- package/Tests/UI/Components/CodeEditor.test.tsx +0 -638
- package/Tests/UI/Components/MonacoLoader.test.ts +0 -67
- package/Tests/UI/Components/MonacoRuntime.test.ts +0 -121
- package/Tests/UI/Components/Telemetry/TelemetryRetentionConfigForm.test.tsx +0 -329
- package/Tests/UI/Components/YamlEditor.test.tsx +0 -847
- package/UI/Components/CodeEditor/MonacoLoader.ts +0 -36
- package/UI/Components/Telemetry/TelemetryRetentionConfigForm.tsx +0 -319
- package/UI/Components/Telemetry/TelemetryRetentionConfigSummary.tsx +0 -223
- package/build/dist/Server/Utils/CommunityEditionSsoReport.js +0 -223
- package/build/dist/Server/Utils/CommunityEditionSsoReport.js.map +0 -1
- package/build/dist/UI/Components/CodeEditor/MonacoLoader.js +0 -34
- package/build/dist/UI/Components/CodeEditor/MonacoLoader.js.map +0 -1
- package/build/dist/UI/Components/Telemetry/TelemetryRetentionConfigForm.js +0 -171
- package/build/dist/UI/Components/Telemetry/TelemetryRetentionConfigForm.js.map +0 -1
- package/build/dist/UI/Components/Telemetry/TelemetryRetentionConfigSummary.js +0 -119
- package/build/dist/UI/Components/Telemetry/TelemetryRetentionConfigSummary.js.map +0 -1
|
@@ -0,0 +1,678 @@
|
|
|
1
|
+
import { parseCustomFieldDropdownOptions } from "../CustomField/CustomFieldDropdownOption";
|
|
2
|
+
import CustomFieldType from "../CustomField/CustomFieldType";
|
|
3
|
+
import { isCustomFieldValueEmpty } from "../CustomField/CustomFieldValueMapping";
|
|
4
|
+
import { validateCustomFieldValues, } from "../CustomField/CustomFieldValueValidator";
|
|
5
|
+
import ColumnLength from "../Database/ColumnLength";
|
|
6
|
+
import Email from "../Email";
|
|
7
|
+
/*
|
|
8
|
+
* The public half of incident forms: what the page anyone with a form's link
|
|
9
|
+
* opens is told about the form, what it sends back, and the one set of rules
|
|
10
|
+
* a submission is held to.
|
|
11
|
+
*
|
|
12
|
+
* A form is filled in by people with no OneUptime account, so nothing on the
|
|
13
|
+
* way in is trusted. The server builds the incident only from what
|
|
14
|
+
* validateIncidentFormSubmission hands back - a value assembled field by
|
|
15
|
+
* field from the answers the form actually asks for. Anything else in the
|
|
16
|
+
* request (a projectId, a state, isPrivate, an answer to a field the form
|
|
17
|
+
* does not ask) never reaches it. Every text is trimmed and capped so it fits
|
|
18
|
+
* the column it lands in, and every custom field answer is checked with the
|
|
19
|
+
* same rules as an API write (validateCustomFieldValues) plus the form's own
|
|
20
|
+
* Required.
|
|
21
|
+
*
|
|
22
|
+
* Pure, with no database or React imports: the server enforces these rules,
|
|
23
|
+
* and the public page can show the same limits before anything is sent.
|
|
24
|
+
*/
|
|
25
|
+
/*
|
|
26
|
+
* How the form treats one of its built-in questions. Only the description
|
|
27
|
+
* has a setting today: Title is always asked and always required.
|
|
28
|
+
*/
|
|
29
|
+
export var IncidentFormFieldSetting;
|
|
30
|
+
(function (IncidentFormFieldSetting) {
|
|
31
|
+
IncidentFormFieldSetting["Required"] = "Required";
|
|
32
|
+
IncidentFormFieldSetting["Optional"] = "Optional";
|
|
33
|
+
IncidentFormFieldSetting["Hidden"] = "Hidden";
|
|
34
|
+
})(IncidentFormFieldSetting || (IncidentFormFieldSetting = {}));
|
|
35
|
+
// Every setting, in the order a picker lists them.
|
|
36
|
+
export const INCIDENT_FORM_FIELD_SETTINGS = [
|
|
37
|
+
IncidentFormFieldSetting.Required,
|
|
38
|
+
IncidentFormFieldSetting.Optional,
|
|
39
|
+
IncidentFormFieldSetting.Hidden,
|
|
40
|
+
];
|
|
41
|
+
// What a form asks for the description when nobody chose otherwise.
|
|
42
|
+
export const DEFAULT_INCIDENT_FORM_DESCRIPTION_SETTING = IncidentFormFieldSetting.Optional;
|
|
43
|
+
/** Whether a value is one of the settings, spelled exactly as stored. */
|
|
44
|
+
export const isIncidentFormFieldSetting = (value) => {
|
|
45
|
+
return (typeof value === "string" &&
|
|
46
|
+
INCIDENT_FORM_FIELD_SETTINGS.includes(value));
|
|
47
|
+
};
|
|
48
|
+
/*
|
|
49
|
+
* The longest answers a form takes. Each is at most the column the answer is
|
|
50
|
+
* stored in, so a submission that passes here cannot then fail to save:
|
|
51
|
+
*
|
|
52
|
+
* - the title becomes Incident.title, a varchar(500);
|
|
53
|
+
* - the description becomes Incident.description (text) - capped anyway,
|
|
54
|
+
* since the request body may be up to 50 MB and an incident description
|
|
55
|
+
* is read in emails, Slack and on status pages;
|
|
56
|
+
* - each custom field text answer is stored in Incident.customFields;
|
|
57
|
+
* - the reporter's name and email are stored on IncidentFormSubmission, in
|
|
58
|
+
* a varchar(100) each (an email longer than that is not one anybody can
|
|
59
|
+
* sign up to OneUptime with either).
|
|
60
|
+
*/
|
|
61
|
+
export const INCIDENT_FORM_TITLE_MAX_LENGTH = ColumnLength.LongText;
|
|
62
|
+
export const INCIDENT_FORM_DESCRIPTION_MAX_LENGTH = 20000;
|
|
63
|
+
export const INCIDENT_FORM_CUSTOM_FIELD_TEXT_MAX_LENGTH = 10000;
|
|
64
|
+
export const INCIDENT_FORM_REPORTER_NAME_MAX_LENGTH = ColumnLength.ShortText;
|
|
65
|
+
export const INCIDENT_FORM_REPORTER_EMAIL_MAX_LENGTH = ColumnLength.Email;
|
|
66
|
+
/*
|
|
67
|
+
* The most entries a multi-select answer may have: this many, or the
|
|
68
|
+
* field's number of options when it has more. The page sends each option
|
|
69
|
+
* at most once, so a real answer never comes near it; what it bounds is a
|
|
70
|
+
* request that sends a million entries, each of which would otherwise be
|
|
71
|
+
* cleaned, sorted and quoted back in the refusal (or, for a field nobody
|
|
72
|
+
* gave options to, stored on the incident).
|
|
73
|
+
*/
|
|
74
|
+
export const INCIDENT_FORM_MULTI_SELECT_MAX_CHOICES = 100;
|
|
75
|
+
export const INCIDENT_FORM_QUESTION_LABELS = {
|
|
76
|
+
title: "Title",
|
|
77
|
+
description: "Description",
|
|
78
|
+
severity: "Severity",
|
|
79
|
+
reporterName: "Your Name",
|
|
80
|
+
reporterEmail: "Your Email",
|
|
81
|
+
};
|
|
82
|
+
/*
|
|
83
|
+
* The message templates, worded as the form's own client-side checks word
|
|
84
|
+
* them (Forms/Validation and CUSTOM_FIELD_MUST_BE_CHECKED_MESSAGE), so an
|
|
85
|
+
* answer refused by the server reads like one refused in the browser.
|
|
86
|
+
*/
|
|
87
|
+
const REQUIRED_MESSAGE = "{{field}} is required.";
|
|
88
|
+
const TOO_LONG_MESSAGE = "{{field}} cannot be more than {{maxLength}} characters.";
|
|
89
|
+
const MUST_BE_CHECKED_MESSAGE = "{{field}} must be checked.";
|
|
90
|
+
const TOO_MANY_CHOICES_MESSAGE = "{{field}} cannot have more than {{maxLength}} choices.";
|
|
91
|
+
const NOT_A_LIST_MESSAGE = "{{field}} takes one answer, not a list.";
|
|
92
|
+
const NESTED_CHOICE_MESSAGE = "{{field}} takes a list of its options, not lists or objects within it.";
|
|
93
|
+
const OBJECT_ANSWER_MESSAGE = "{{field}} takes one answer, not an object.";
|
|
94
|
+
const OBJECT_CHOICES_MESSAGE = "{{field}} takes a list of its options, not an object.";
|
|
95
|
+
/*
|
|
96
|
+
* Replacer functions, not replacement strings: a field named "Cost ($)" or
|
|
97
|
+
* "$& total" must come out as typed, and a replacement string would read its
|
|
98
|
+
* "$" patterns.
|
|
99
|
+
*/
|
|
100
|
+
const fillMessage = (template, values) => {
|
|
101
|
+
return template
|
|
102
|
+
.replace("{{field}}", () => {
|
|
103
|
+
return values.field;
|
|
104
|
+
})
|
|
105
|
+
.replace("{{maxLength}}", () => {
|
|
106
|
+
var _a;
|
|
107
|
+
return String((_a = values.maxLength) !== null && _a !== void 0 ? _a : "");
|
|
108
|
+
});
|
|
109
|
+
};
|
|
110
|
+
/*
|
|
111
|
+
* A header the public page's own script adds to every request it makes, and
|
|
112
|
+
* the value it gives it. Reading a form needs it: another site's page can
|
|
113
|
+
* have a visitor's browser send that GET - an <img>, a link, a no-cors
|
|
114
|
+
* fetch - carrying neither of the headers that say where a request came
|
|
115
|
+
* from (over plain HTTP a browser sends neither on such a request), but it
|
|
116
|
+
* cannot add a header of its own to one. A request that adds one is
|
|
117
|
+
* preflighted first, and then carries the Origin that gives it away
|
|
118
|
+
* (SameOriginRequest). The name is in lower case, as the server reads
|
|
119
|
+
* header names.
|
|
120
|
+
*/
|
|
121
|
+
export const INCIDENT_FORM_PAGE_HEADER = "x-oneuptime-incident-form";
|
|
122
|
+
export const INCIDENT_FORM_PAGE_HEADER_VALUE = "1";
|
|
123
|
+
const isPlainObject = (value) => {
|
|
124
|
+
return (value !== null &&
|
|
125
|
+
typeof value === "object" &&
|
|
126
|
+
!Array.isArray(value) &&
|
|
127
|
+
!(value instanceof Date));
|
|
128
|
+
};
|
|
129
|
+
const hasOwn = (target, key) => {
|
|
130
|
+
return Object.prototype.hasOwnProperty.call(target, key);
|
|
131
|
+
};
|
|
132
|
+
/*
|
|
133
|
+
* Postgres cannot store a NUL character in a text column, nor in a jsonb
|
|
134
|
+
* string, so one pasted into an answer would fail the insert - after the
|
|
135
|
+
* checks here had passed. Nobody means to type one. no-control-regex is
|
|
136
|
+
* disabled for these two on purpose: matching control characters is exactly
|
|
137
|
+
* what they are for.
|
|
138
|
+
*/
|
|
139
|
+
// eslint-disable-next-line no-control-regex
|
|
140
|
+
const NUL_CHARACTERS = /\u0000/g;
|
|
141
|
+
// Control characters, line breaks and tabs included.
|
|
142
|
+
// eslint-disable-next-line no-control-regex
|
|
143
|
+
const CONTROL_CHARACTER_RUNS = /[\u0000-\u001F\u007F]+/g;
|
|
144
|
+
/*
|
|
145
|
+
* A one-line answer (the title, the reporter's name): line breaks, tabs and
|
|
146
|
+
* other control characters become spaces - a title is shown on one line in
|
|
147
|
+
* lists, emails and chat messages - runs of spaces become one, and the ends
|
|
148
|
+
* are trimmed.
|
|
149
|
+
*/
|
|
150
|
+
const cleanSingleLine = (value) => {
|
|
151
|
+
return value
|
|
152
|
+
.replace(CONTROL_CHARACTER_RUNS, " ")
|
|
153
|
+
.replace(/ {2,}/g, " ")
|
|
154
|
+
.trim();
|
|
155
|
+
};
|
|
156
|
+
/*
|
|
157
|
+
* A Markdown or multi-line answer. Blank lines before the text and
|
|
158
|
+
* whitespace after it are dropped, but the first line keeps its own
|
|
159
|
+
* indentation: four spaces there start a code block, and trimming them would
|
|
160
|
+
* turn the reporter's pasted log into a paragraph.
|
|
161
|
+
*/
|
|
162
|
+
const cleanMultiLine = (value) => {
|
|
163
|
+
return value
|
|
164
|
+
.replace(NUL_CHARACTERS, "")
|
|
165
|
+
.replace(/^\s*\n/, "")
|
|
166
|
+
.trimEnd();
|
|
167
|
+
};
|
|
168
|
+
// A dropdown option, a number or a date typed as text.
|
|
169
|
+
const cleanScalarText = (value) => {
|
|
170
|
+
return value.replace(NUL_CHARACTERS, "").trim();
|
|
171
|
+
};
|
|
172
|
+
const KNOWN_CUSTOM_FIELD_TYPES = Object.values(CustomFieldType);
|
|
173
|
+
const DROPDOWN_TYPES = [
|
|
174
|
+
CustomFieldType.Dropdown,
|
|
175
|
+
CustomFieldType.MultiSelectDropdown,
|
|
176
|
+
];
|
|
177
|
+
/*
|
|
178
|
+
* One asked definition as the public page sees it and as its answers are
|
|
179
|
+
* checked. A field with no type - rows from before types were required - or
|
|
180
|
+
* a type this version does not know is asked and checked as Text: the admin
|
|
181
|
+
* put it on the form, and text is what an untyped field has always held.
|
|
182
|
+
*/
|
|
183
|
+
const toPublicField = (definition) => {
|
|
184
|
+
if (!definition ||
|
|
185
|
+
typeof definition.name !== "string" ||
|
|
186
|
+
definition.name.length === 0) {
|
|
187
|
+
return null;
|
|
188
|
+
}
|
|
189
|
+
const customFieldType = typeof definition.customFieldType === "string" &&
|
|
190
|
+
KNOWN_CUSTOM_FIELD_TYPES.includes(definition.customFieldType)
|
|
191
|
+
? definition.customFieldType
|
|
192
|
+
: CustomFieldType.Text;
|
|
193
|
+
const field = {
|
|
194
|
+
name: definition.name,
|
|
195
|
+
customFieldType: customFieldType,
|
|
196
|
+
isRequired: definition.isRequiredOnCreate === true,
|
|
197
|
+
};
|
|
198
|
+
if (typeof definition.description === "string" &&
|
|
199
|
+
definition.description.trim().length > 0) {
|
|
200
|
+
field.description = definition.description;
|
|
201
|
+
}
|
|
202
|
+
if (DROPDOWN_TYPES.includes(customFieldType) &&
|
|
203
|
+
typeof definition.dropdownOptions === "string" &&
|
|
204
|
+
definition.dropdownOptions.trim().length > 0) {
|
|
205
|
+
field.dropdownOptions = definition.dropdownOptions;
|
|
206
|
+
}
|
|
207
|
+
return field;
|
|
208
|
+
};
|
|
209
|
+
/**
|
|
210
|
+
* The custom fields the public page shows, in the order given (pass the
|
|
211
|
+
* result of getIncidentFormAskedDefinitions). A definition without a name is
|
|
212
|
+
* left out, and so is a second one with a name already listed - answers are
|
|
213
|
+
* keyed by name, so it could not be told apart.
|
|
214
|
+
*/
|
|
215
|
+
export const getPublicIncidentFormFields = (askedDefinitions) => {
|
|
216
|
+
const fields = [];
|
|
217
|
+
const seenNames = new Set();
|
|
218
|
+
for (const definition of askedDefinitions || []) {
|
|
219
|
+
const field = toPublicField(definition);
|
|
220
|
+
if (!field || seenNames.has(field.name)) {
|
|
221
|
+
continue;
|
|
222
|
+
}
|
|
223
|
+
seenNames.add(field.name);
|
|
224
|
+
fields.push(field);
|
|
225
|
+
}
|
|
226
|
+
return fields;
|
|
227
|
+
};
|
|
228
|
+
// A stored setting, or the column's default for anything else.
|
|
229
|
+
const readDescriptionSetting = (value) => {
|
|
230
|
+
return isIncidentFormFieldSetting(value)
|
|
231
|
+
? value
|
|
232
|
+
: DEFAULT_INCIDENT_FORM_DESCRIPTION_SETTING;
|
|
233
|
+
};
|
|
234
|
+
/**
|
|
235
|
+
* What the public page is told about a form, built field by field so that
|
|
236
|
+
* nothing else about the form - its share key, its template, its IP
|
|
237
|
+
* allowlist, its project - is ever sent. The project's severities are only
|
|
238
|
+
* listed when the reporter may choose one.
|
|
239
|
+
*/
|
|
240
|
+
export const getPublicIncidentForm = (data) => {
|
|
241
|
+
const publicForm = {
|
|
242
|
+
name: typeof data.form.name === "string" ? data.form.name : "",
|
|
243
|
+
descriptionSetting: readDescriptionSetting(data.form.descriptionSetting),
|
|
244
|
+
isReporterDetailsRequired: data.form.isReporterDetailsRequired !== false,
|
|
245
|
+
customFields: getPublicIncidentFormFields(data.askedDefinitions),
|
|
246
|
+
isCaptchaRequired: data.isCaptchaRequired === true,
|
|
247
|
+
};
|
|
248
|
+
if (typeof data.form.description === "string" &&
|
|
249
|
+
data.form.description.trim().length > 0) {
|
|
250
|
+
publicForm.description = data.form.description;
|
|
251
|
+
}
|
|
252
|
+
if (data.form.allowReporterToChooseSeverity === true) {
|
|
253
|
+
const severities = [];
|
|
254
|
+
// Only the three properties the page draws, whatever the caller passed.
|
|
255
|
+
for (const severity of data.severities || []) {
|
|
256
|
+
if (!severity || typeof severity._id !== "string" || !severity._id) {
|
|
257
|
+
continue;
|
|
258
|
+
}
|
|
259
|
+
const listed = {
|
|
260
|
+
_id: severity._id,
|
|
261
|
+
name: typeof severity.name === "string" ? severity.name : "",
|
|
262
|
+
};
|
|
263
|
+
if (typeof severity.color === "string" && severity.color) {
|
|
264
|
+
listed.color = severity.color;
|
|
265
|
+
}
|
|
266
|
+
severities.push(listed);
|
|
267
|
+
}
|
|
268
|
+
publicForm.severities = severities;
|
|
269
|
+
const formSeverityId = data.form.incidentSeverityId
|
|
270
|
+
? data.form.incidentSeverityId.toString().toLowerCase()
|
|
271
|
+
: "";
|
|
272
|
+
const formSeverity = severities.find((severity) => {
|
|
273
|
+
return severity._id.toLowerCase() === formSeverityId;
|
|
274
|
+
});
|
|
275
|
+
if (formSeverity) {
|
|
276
|
+
publicForm.defaultIncidentSeverityId = formSeverity._id;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
return publicForm;
|
|
280
|
+
};
|
|
281
|
+
/*
|
|
282
|
+
* An answer as it is checked and stored: text cleaned as its field shows
|
|
283
|
+
* it, "true" / "false" as the booleans the dashboard's own checkbox stores,
|
|
284
|
+
* and a multi-select as a list with each option once. Anything else is left
|
|
285
|
+
* for the checks to judge.
|
|
286
|
+
*/
|
|
287
|
+
const cleanAnswer = (field, value) => {
|
|
288
|
+
if (typeof value === "string") {
|
|
289
|
+
switch (field.customFieldType) {
|
|
290
|
+
case CustomFieldType.Text:
|
|
291
|
+
return cleanSingleLine(value);
|
|
292
|
+
case CustomFieldType.LongText:
|
|
293
|
+
case CustomFieldType.Markdown:
|
|
294
|
+
return cleanMultiLine(value);
|
|
295
|
+
case CustomFieldType.Boolean: {
|
|
296
|
+
const text = cleanScalarText(value);
|
|
297
|
+
if (text === "true") {
|
|
298
|
+
return true;
|
|
299
|
+
}
|
|
300
|
+
if (text === "false") {
|
|
301
|
+
return false;
|
|
302
|
+
}
|
|
303
|
+
return text;
|
|
304
|
+
}
|
|
305
|
+
case CustomFieldType.MultiSelectDropdown: {
|
|
306
|
+
const text = cleanScalarText(value);
|
|
307
|
+
return text.length > 0 ? [text] : [];
|
|
308
|
+
}
|
|
309
|
+
default:
|
|
310
|
+
return cleanScalarText(value);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
if (Array.isArray(value) &&
|
|
314
|
+
field.customFieldType === CustomFieldType.MultiSelectDropdown) {
|
|
315
|
+
const entries = [];
|
|
316
|
+
const seen = new Set();
|
|
317
|
+
for (const entry of value) {
|
|
318
|
+
const cleaned = typeof entry === "string" ? cleanScalarText(entry) : entry;
|
|
319
|
+
if (cleaned === "") {
|
|
320
|
+
continue;
|
|
321
|
+
}
|
|
322
|
+
const key = `${typeof cleaned}:${String(cleaned)}`;
|
|
323
|
+
if (seen.has(key)) {
|
|
324
|
+
continue;
|
|
325
|
+
}
|
|
326
|
+
seen.add(key);
|
|
327
|
+
entries.push(cleaned);
|
|
328
|
+
}
|
|
329
|
+
return entries;
|
|
330
|
+
}
|
|
331
|
+
return value;
|
|
332
|
+
};
|
|
333
|
+
// A text answer, or any text entry of a list, longer than the cap.
|
|
334
|
+
const isTooLong = (value, maxLength) => {
|
|
335
|
+
if (typeof value === "string") {
|
|
336
|
+
return value.length > maxLength;
|
|
337
|
+
}
|
|
338
|
+
if (Array.isArray(value)) {
|
|
339
|
+
return value.some((entry) => {
|
|
340
|
+
return typeof entry === "string" && entry.length > maxLength;
|
|
341
|
+
});
|
|
342
|
+
}
|
|
343
|
+
return false;
|
|
344
|
+
};
|
|
345
|
+
// See INCIDENT_FORM_MULTI_SELECT_MAX_CHOICES.
|
|
346
|
+
const getMaxChoices = (field) => {
|
|
347
|
+
return Math.max(INCIDENT_FORM_MULTI_SELECT_MAX_CHOICES, parseCustomFieldDropdownOptions(field.dropdownOptions).length);
|
|
348
|
+
};
|
|
349
|
+
/*
|
|
350
|
+
* The custom field answers a submission may store. Only the fields the form
|
|
351
|
+
* asks for are read; an answer keyed by any other name is dropped unread.
|
|
352
|
+
*/
|
|
353
|
+
const validateAnswers = (data) => {
|
|
354
|
+
const accepted = {};
|
|
355
|
+
for (const field of data.fields) {
|
|
356
|
+
const answer = hasOwn(data.answers, field.name)
|
|
357
|
+
? data.answers[field.name]
|
|
358
|
+
: undefined;
|
|
359
|
+
/*
|
|
360
|
+
* An answer is one value - text, a number, a yes/no - or, for a
|
|
361
|
+
* multi-select, a list of them; nothing the form's page sends is an
|
|
362
|
+
* object. So an object is refused here, unread: checking it against
|
|
363
|
+
* its field (validateCustomFieldValues) would turn all of it into text
|
|
364
|
+
* twice before refusing it, and the request may carry millions of keys
|
|
365
|
+
* or a nesting millions deep, whose conversion alone blocks the server
|
|
366
|
+
* for seconds - a minute, at the body's 50 MB.
|
|
367
|
+
*/
|
|
368
|
+
if (answer !== null &&
|
|
369
|
+
typeof answer === "object" &&
|
|
370
|
+
!Array.isArray(answer)) {
|
|
371
|
+
data.errors.push(fillMessage(field.customFieldType === CustomFieldType.MultiSelectDropdown
|
|
372
|
+
? OBJECT_CHOICES_MESSAGE
|
|
373
|
+
: OBJECT_ANSWER_MESSAGE, { field: field.name }));
|
|
374
|
+
continue;
|
|
375
|
+
}
|
|
376
|
+
/*
|
|
377
|
+
* A list is bounded before anything reads its entries: cleaning,
|
|
378
|
+
* de-duplicating and checking them, and quoting the ones that are not
|
|
379
|
+
* options back in the refusal, all cost as much as the list is long,
|
|
380
|
+
* and the request may carry millions. Only a multi-select takes a list
|
|
381
|
+
* at all, and only as many entries as it could have choices.
|
|
382
|
+
*/
|
|
383
|
+
if (Array.isArray(answer) && answer.length > 0) {
|
|
384
|
+
if (field.customFieldType !== CustomFieldType.MultiSelectDropdown) {
|
|
385
|
+
data.errors.push(fillMessage(NOT_A_LIST_MESSAGE, { field: field.name }));
|
|
386
|
+
continue;
|
|
387
|
+
}
|
|
388
|
+
const maxChoices = getMaxChoices(field);
|
|
389
|
+
if (answer.length > maxChoices) {
|
|
390
|
+
data.errors.push(fillMessage(TOO_MANY_CHOICES_MESSAGE, {
|
|
391
|
+
field: field.name,
|
|
392
|
+
maxLength: maxChoices,
|
|
393
|
+
}));
|
|
394
|
+
continue;
|
|
395
|
+
}
|
|
396
|
+
/*
|
|
397
|
+
* Each choice is one option, so a list or an object inside the list
|
|
398
|
+
* is refused here, unread: turning a list nested thousands deep into
|
|
399
|
+
* text, as cleaning and checking the entries would, overflows the
|
|
400
|
+
* stack - a refusal must never become a thrown error.
|
|
401
|
+
*/
|
|
402
|
+
if (answer.some((entry) => {
|
|
403
|
+
return entry !== null && typeof entry === "object";
|
|
404
|
+
})) {
|
|
405
|
+
data.errors.push(fillMessage(NESTED_CHOICE_MESSAGE, { field: field.name }));
|
|
406
|
+
continue;
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
const value = cleanAnswer(field, answer);
|
|
410
|
+
if (isCustomFieldValueEmpty(value)) {
|
|
411
|
+
if (field.isRequired) {
|
|
412
|
+
data.errors.push(fillMessage(field.customFieldType === CustomFieldType.Boolean
|
|
413
|
+
? MUST_BE_CHECKED_MESSAGE
|
|
414
|
+
: REQUIRED_MESSAGE, { field: field.name }));
|
|
415
|
+
}
|
|
416
|
+
continue;
|
|
417
|
+
}
|
|
418
|
+
if (isTooLong(value, INCIDENT_FORM_CUSTOM_FIELD_TEXT_MAX_LENGTH)) {
|
|
419
|
+
data.errors.push(fillMessage(TOO_LONG_MESSAGE, {
|
|
420
|
+
field: field.name,
|
|
421
|
+
maxLength: INCIDENT_FORM_CUSTOM_FIELD_TEXT_MAX_LENGTH,
|
|
422
|
+
}));
|
|
423
|
+
continue;
|
|
424
|
+
}
|
|
425
|
+
const typeErrors = validateCustomFieldValues({
|
|
426
|
+
definitions: [
|
|
427
|
+
{
|
|
428
|
+
name: field.name,
|
|
429
|
+
customFieldType: field.customFieldType,
|
|
430
|
+
dropdownOptions: field.dropdownOptions,
|
|
431
|
+
},
|
|
432
|
+
],
|
|
433
|
+
customFields: { [field.name]: value },
|
|
434
|
+
storedCustomFields: {},
|
|
435
|
+
});
|
|
436
|
+
if (typeErrors.length > 0) {
|
|
437
|
+
data.errors.push(...typeErrors.map((error) => {
|
|
438
|
+
return error.message;
|
|
439
|
+
}));
|
|
440
|
+
continue;
|
|
441
|
+
}
|
|
442
|
+
/*
|
|
443
|
+
* A required yes/no question is an acknowledgement: only a tick answers
|
|
444
|
+
* it, as on the dashboard (CUSTOM_FIELD_MUST_BE_CHECKED_MESSAGE).
|
|
445
|
+
*/
|
|
446
|
+
if (field.isRequired &&
|
|
447
|
+
field.customFieldType === CustomFieldType.Boolean &&
|
|
448
|
+
value !== true) {
|
|
449
|
+
data.errors.push(fillMessage(MUST_BE_CHECKED_MESSAGE, { field: field.name }));
|
|
450
|
+
continue;
|
|
451
|
+
}
|
|
452
|
+
/*
|
|
453
|
+
* Defined, not assigned: a field may be named "__proto__", and assigning
|
|
454
|
+
* that name would set the object's prototype instead of storing the
|
|
455
|
+
* answer.
|
|
456
|
+
*/
|
|
457
|
+
Object.defineProperty(accepted, field.name, {
|
|
458
|
+
value: value,
|
|
459
|
+
enumerable: true,
|
|
460
|
+
writable: true,
|
|
461
|
+
configurable: true,
|
|
462
|
+
});
|
|
463
|
+
}
|
|
464
|
+
return accepted;
|
|
465
|
+
};
|
|
466
|
+
/*
|
|
467
|
+
* Email alone finds an address anywhere in a text - "Jane <jane@x.test>"
|
|
468
|
+
* passes it - so the whole answer must also be one ordinary address: the
|
|
469
|
+
* dot-atom half of Email's own pattern, anchored at both ends.
|
|
470
|
+
*/
|
|
471
|
+
export const WHOLE_EMAIL_ADDRESS = /^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i;
|
|
472
|
+
/*
|
|
473
|
+
* One of the built-in text questions: "" when it was not answered, the
|
|
474
|
+
* cleaned text when it was, and null - with the problem recorded - when the
|
|
475
|
+
* answer is not text at all, so the caller does not also call it missing.
|
|
476
|
+
*/
|
|
477
|
+
const readTextAnswer = (data) => {
|
|
478
|
+
if (data.value === undefined || data.value === null) {
|
|
479
|
+
return "";
|
|
480
|
+
}
|
|
481
|
+
if (typeof data.value !== "string") {
|
|
482
|
+
data.errors.push(`${data.label} must be text.`);
|
|
483
|
+
return null;
|
|
484
|
+
}
|
|
485
|
+
return data.clean(data.value);
|
|
486
|
+
};
|
|
487
|
+
// Required and too-long checks for a built-in text question.
|
|
488
|
+
const checkLength = (data) => {
|
|
489
|
+
if (data.text.length === 0) {
|
|
490
|
+
if (data.isRequired) {
|
|
491
|
+
data.errors.push(fillMessage(REQUIRED_MESSAGE, { field: data.label }));
|
|
492
|
+
}
|
|
493
|
+
return;
|
|
494
|
+
}
|
|
495
|
+
if (data.text.length > data.maxLength) {
|
|
496
|
+
data.errors.push(fillMessage(TOO_LONG_MESSAGE, {
|
|
497
|
+
field: data.label,
|
|
498
|
+
maxLength: data.maxLength,
|
|
499
|
+
}));
|
|
500
|
+
}
|
|
501
|
+
};
|
|
502
|
+
/**
|
|
503
|
+
* Checks a submission against its form and returns either every problem
|
|
504
|
+
* with it, or the answers the incident may be built from. Never throws on a
|
|
505
|
+
* parsed JSON body, whatever it holds.
|
|
506
|
+
*
|
|
507
|
+
* - Title: always required, one line, at most 500 characters.
|
|
508
|
+
* - Description: ignored when the form hides it; required or optional
|
|
509
|
+
* otherwise, at most 20000 characters.
|
|
510
|
+
* - Severity: only read when the form lets the reporter choose, and then it
|
|
511
|
+
* must be one of the project's severities. Leaving it out means the
|
|
512
|
+
* form's own severity.
|
|
513
|
+
* - Name and email: required unless the form says otherwise; when given,
|
|
514
|
+
* the name is at most 100 characters and the email one valid address of
|
|
515
|
+
* at most 100.
|
|
516
|
+
* - Custom fields: only those the form asks, each checked as an API write
|
|
517
|
+
* would be, required ones filled in (a required yes/no ticked), text at
|
|
518
|
+
* most 10000 characters, never an object, a list only for a multi-select
|
|
519
|
+
* and then with at most 100 choices (or as many as it has options), none
|
|
520
|
+
* of them a list or an object. Answers to anything else are dropped.
|
|
521
|
+
*
|
|
522
|
+
* No check costs more for a larger body: text is measured, a list is
|
|
523
|
+
* counted and an object refused before anything reads what they hold.
|
|
524
|
+
*/
|
|
525
|
+
export const validateIncidentFormSubmission = (data) => {
|
|
526
|
+
if (!isPlainObject(data.data)) {
|
|
527
|
+
return {
|
|
528
|
+
isValid: false,
|
|
529
|
+
errors: [
|
|
530
|
+
"The submission must be an object holding the form's answers.",
|
|
531
|
+
],
|
|
532
|
+
};
|
|
533
|
+
}
|
|
534
|
+
const input = data.data;
|
|
535
|
+
const form = data.form || {};
|
|
536
|
+
const labels = INCIDENT_FORM_QUESTION_LABELS;
|
|
537
|
+
const errors = [];
|
|
538
|
+
// Title: always asked, always required.
|
|
539
|
+
const title = readTextAnswer({
|
|
540
|
+
value: input["title"],
|
|
541
|
+
label: labels.title,
|
|
542
|
+
clean: cleanSingleLine,
|
|
543
|
+
errors: errors,
|
|
544
|
+
});
|
|
545
|
+
if (title !== null) {
|
|
546
|
+
checkLength({
|
|
547
|
+
text: title,
|
|
548
|
+
label: labels.title,
|
|
549
|
+
isRequired: true,
|
|
550
|
+
maxLength: INCIDENT_FORM_TITLE_MAX_LENGTH,
|
|
551
|
+
errors: errors,
|
|
552
|
+
});
|
|
553
|
+
}
|
|
554
|
+
// Description: not even read when the form hides it.
|
|
555
|
+
const descriptionSetting = readDescriptionSetting(form.descriptionSetting);
|
|
556
|
+
let description = "";
|
|
557
|
+
if (descriptionSetting !== IncidentFormFieldSetting.Hidden) {
|
|
558
|
+
description = readTextAnswer({
|
|
559
|
+
value: input["description"],
|
|
560
|
+
label: labels.description,
|
|
561
|
+
clean: cleanMultiLine,
|
|
562
|
+
errors: errors,
|
|
563
|
+
});
|
|
564
|
+
if (description !== null) {
|
|
565
|
+
checkLength({
|
|
566
|
+
text: description,
|
|
567
|
+
label: labels.description,
|
|
568
|
+
isRequired: descriptionSetting === IncidentFormFieldSetting.Required,
|
|
569
|
+
maxLength: INCIDENT_FORM_DESCRIPTION_MAX_LENGTH,
|
|
570
|
+
errors: errors,
|
|
571
|
+
});
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
// Severity: only a choice the form offers, and only when it offers one.
|
|
575
|
+
let incidentSeverityId = undefined;
|
|
576
|
+
if (form.allowReporterToChooseSeverity === true) {
|
|
577
|
+
const requested = input["incidentSeverityId"];
|
|
578
|
+
const isUnanswered = requested === undefined ||
|
|
579
|
+
requested === null ||
|
|
580
|
+
(typeof requested === "string" && requested.trim().length === 0);
|
|
581
|
+
if (!isUnanswered) {
|
|
582
|
+
const requestedId = typeof requested === "string" ? requested.trim().toLowerCase() : "";
|
|
583
|
+
const listed = requestedId
|
|
584
|
+
? (data.severities || []).find((severity) => {
|
|
585
|
+
return (typeof (severity === null || severity === void 0 ? void 0 : severity._id) === "string" &&
|
|
586
|
+
severity._id.toLowerCase() === requestedId);
|
|
587
|
+
})
|
|
588
|
+
: undefined;
|
|
589
|
+
if (listed) {
|
|
590
|
+
incidentSeverityId = listed._id;
|
|
591
|
+
}
|
|
592
|
+
else {
|
|
593
|
+
errors.push(`${labels.severity} must be one of the severities this form lists.`);
|
|
594
|
+
}
|
|
595
|
+
}
|
|
596
|
+
}
|
|
597
|
+
// The reporter: required unless the form says otherwise.
|
|
598
|
+
const detailsRequired = form.isReporterDetailsRequired !== false;
|
|
599
|
+
const reporterName = readTextAnswer({
|
|
600
|
+
value: input["reporterName"],
|
|
601
|
+
label: labels.reporterName,
|
|
602
|
+
clean: cleanSingleLine,
|
|
603
|
+
errors: errors,
|
|
604
|
+
});
|
|
605
|
+
if (reporterName !== null) {
|
|
606
|
+
checkLength({
|
|
607
|
+
text: reporterName,
|
|
608
|
+
label: labels.reporterName,
|
|
609
|
+
isRequired: detailsRequired,
|
|
610
|
+
maxLength: INCIDENT_FORM_REPORTER_NAME_MAX_LENGTH,
|
|
611
|
+
errors: errors,
|
|
612
|
+
});
|
|
613
|
+
}
|
|
614
|
+
let reporterEmail = readTextAnswer({
|
|
615
|
+
value: input["reporterEmail"],
|
|
616
|
+
label: labels.reporterEmail,
|
|
617
|
+
clean: cleanScalarText,
|
|
618
|
+
errors: errors,
|
|
619
|
+
});
|
|
620
|
+
if (reporterEmail !== null) {
|
|
621
|
+
const errorCount = errors.length;
|
|
622
|
+
checkLength({
|
|
623
|
+
text: reporterEmail,
|
|
624
|
+
label: labels.reporterEmail,
|
|
625
|
+
isRequired: detailsRequired,
|
|
626
|
+
maxLength: INCIDENT_FORM_REPORTER_EMAIL_MAX_LENGTH,
|
|
627
|
+
errors: errors,
|
|
628
|
+
});
|
|
629
|
+
if (reporterEmail.length > 0 && errors.length === errorCount) {
|
|
630
|
+
if (WHOLE_EMAIL_ADDRESS.test(reporterEmail) &&
|
|
631
|
+
Email.isValid(reporterEmail)) {
|
|
632
|
+
reporterEmail = new Email(reporterEmail).toString();
|
|
633
|
+
}
|
|
634
|
+
else {
|
|
635
|
+
errors.push(`${labels.reporterEmail} is not a valid email address.`);
|
|
636
|
+
}
|
|
637
|
+
}
|
|
638
|
+
}
|
|
639
|
+
// Custom fields: only the ones the form asks for are read.
|
|
640
|
+
const rawAnswers = input["customFields"];
|
|
641
|
+
let answers = {};
|
|
642
|
+
if (isPlainObject(rawAnswers)) {
|
|
643
|
+
answers = rawAnswers;
|
|
644
|
+
}
|
|
645
|
+
else if (rawAnswers !== undefined && rawAnswers !== null) {
|
|
646
|
+
errors.push("The custom field answers must be an object keyed by field name.");
|
|
647
|
+
}
|
|
648
|
+
const customFields = validateAnswers({
|
|
649
|
+
fields: getPublicIncidentFormFields(data.askedDefinitions || []),
|
|
650
|
+
answers: answers,
|
|
651
|
+
errors: errors,
|
|
652
|
+
});
|
|
653
|
+
if (errors.length > 0) {
|
|
654
|
+
return { isValid: false, errors: errors };
|
|
655
|
+
}
|
|
656
|
+
const value = {
|
|
657
|
+
title: title || "",
|
|
658
|
+
customFields: customFields,
|
|
659
|
+
};
|
|
660
|
+
if (description) {
|
|
661
|
+
value.description = description;
|
|
662
|
+
}
|
|
663
|
+
if (incidentSeverityId) {
|
|
664
|
+
value.incidentSeverityId = incidentSeverityId;
|
|
665
|
+
}
|
|
666
|
+
if (reporterName) {
|
|
667
|
+
value.reporterName = reporterName;
|
|
668
|
+
}
|
|
669
|
+
if (reporterEmail) {
|
|
670
|
+
value.reporterEmail = reporterEmail;
|
|
671
|
+
}
|
|
672
|
+
return { isValid: true, value: value };
|
|
673
|
+
};
|
|
674
|
+
/** Every problem as one message, for an API error response. */
|
|
675
|
+
export const formatIncidentFormSubmissionErrors = (errors) => {
|
|
676
|
+
return errors.join(" ");
|
|
677
|
+
};
|
|
678
|
+
//# sourceMappingURL=IncidentFormPublic.js.map
|