@oneuptime/common 11.7.3 → 12.0.0
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/AnalyticsModels/ExceptionInstance.ts +67 -0
- package/Models/AnalyticsModels/Index.ts +10 -0
- package/Models/AnalyticsModels/Log.ts +60 -0
- package/Models/AnalyticsModels/RumSession.ts +1401 -0
- package/Models/AnalyticsModels/RumSessionChunk.ts +798 -0
- package/Models/AnalyticsModels/Span.ts +60 -0
- package/Models/DatabaseModels/AIAgentTaskPullRequest.ts +52 -0
- package/Models/DatabaseModels/AIRun.ts +31 -0
- package/Models/DatabaseModels/Alert.ts +29 -0
- package/Models/DatabaseModels/AlertCustomField.ts +1 -1
- package/Models/DatabaseModels/AlertEpisodeStateTimeline.ts +1 -0
- package/Models/DatabaseModels/AlertFeed.ts +1 -0
- package/Models/DatabaseModels/AlertStateTimeline.ts +1 -0
- package/Models/DatabaseModels/AutoRemediationRule.ts +989 -0
- package/Models/DatabaseModels/AutoRemediationSuggestion.ts +874 -0
- package/Models/DatabaseModels/CodeRepository.ts +129 -0
- package/Models/DatabaseModels/GlobalConfig.ts +312 -0
- package/Models/DatabaseModels/Incident.ts +29 -0
- package/Models/DatabaseModels/IncidentCustomField.ts +1 -1
- package/Models/DatabaseModels/IncidentEpisodeStateTimeline.ts +1 -0
- package/Models/DatabaseModels/IncidentFeed.ts +1 -0
- package/Models/DatabaseModels/IncidentStateTimeline.ts +1 -0
- package/Models/DatabaseModels/Index.ts +26 -8
- package/Models/DatabaseModels/InstanceHealthLog.ts +8 -0
- package/Models/DatabaseModels/LogDropFilter.ts +89 -0
- package/Models/DatabaseModels/MonitorCustomField.ts +1 -1
- package/Models/DatabaseModels/MonitorStatus.ts +1 -1
- package/Models/DatabaseModels/NetworkDeviceDiscoveryScan.ts +13 -3
- package/Models/DatabaseModels/NetworkDeviceLabelRule.ts +2 -2
- package/Models/DatabaseModels/NetworkDeviceOwnerRule.ts +2 -2
- package/Models/DatabaseModels/NetworkSiteAssignmentRule.ts +1 -1
- package/Models/DatabaseModels/OnCallDutyPolicyCustomField.ts +1 -1
- package/Models/DatabaseModels/Project.ts +231 -0
- package/Models/DatabaseModels/RecommendationDismissal.ts +463 -0
- package/Models/DatabaseModels/RumApplication.ts +906 -0
- package/Models/DatabaseModels/RumSessionErasureRequest.ts +561 -0
- package/Models/DatabaseModels/RumSessionPin.ts +457 -0
- package/Models/DatabaseModels/RumSessionReplayView.ts +406 -0
- package/Models/DatabaseModels/RunbookCredential.ts +673 -0
- package/Models/DatabaseModels/RunbookSecret.ts +7 -7
- package/Models/DatabaseModels/{RunbookAgent.ts → Runner.ts} +206 -46
- package/Models/DatabaseModels/{RunbookAgentJob.ts → RunnerJob.ts} +151 -18
- package/Models/DatabaseModels/{RunbookAgentOwnerTeam.ts → RunnerOwnerTeam.ts} +41 -43
- package/Models/DatabaseModels/{RunbookAgentOwnerUser.ts → RunnerOwnerUser.ts} +41 -43
- package/Models/DatabaseModels/ScheduledMaintenanceCustomField.ts +1 -1
- package/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.ts +1 -0
- package/Models/DatabaseModels/StatusPageCustomField.ts +1 -1
- package/Models/DatabaseModels/StatusPageGroup.ts +95 -0
- package/Models/DatabaseModels/TeamCustomField.ts +1 -1
- package/Models/DatabaseModels/TeamMemberCustomField.ts +1 -1
- package/Models/DatabaseModels/TraceDropFilter.ts +89 -0
- package/Models/DatabaseModels/WorkflowVariable.ts +5 -1
- package/Server/API/AIAgentDataAPI.ts +179 -48
- package/Server/API/AIAgentTaskAPI.ts +36 -37
- package/Server/API/AIAgentTaskLogAPI.ts +19 -33
- package/Server/API/AlertAPI.ts +32 -17
- package/Server/API/AutoRemediationAPI.ts +557 -0
- package/Server/API/BaseAPI.ts +31 -2
- package/Server/API/BaseAnalyticsAPI.ts +40 -3
- package/Server/API/CommonAPI.ts +92 -0
- package/Server/API/DashboardAPI.ts +340 -15
- package/Server/API/IncidentAPI.ts +60 -33
- package/Server/API/IncidentEpisodeAPI.ts +31 -16
- package/Server/API/MonitorAPI.ts +30 -0
- package/Server/API/MonitorTemplateAPI.ts +8 -0
- package/Server/API/ProbeAPI.ts +196 -15
- package/Server/API/ProjectAPI.ts +79 -1
- package/Server/API/ScheduledMaintenanceAPI.ts +33 -18
- package/Server/API/StatusPageAPI.ts +74 -37
- package/Server/API/TelemetryAPI.ts +1622 -3
- package/Server/API/UserIncomingCallNumberAPI.ts +31 -0
- package/Server/API/WorkspaceNotificationRuleAPI.ts +34 -4
- package/Server/DatabaseConfig.ts +26 -1
- package/Server/EnvironmentConfig.ts +13 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1785320000000-RepairCrossProjectIncidentReferences.ts +527 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1785329453269-AddParentGroupToStatusPageGroup.ts +31 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1785397674289-AddRecommendationDismissalTable.ts +55 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1785405581596-AddDroppedCountersToDropFilters.ts +53 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1785417351021-AddSessionReplay.ts +293 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1785491583874-EnableSessionReplayByDefault.ts +67 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1785496223183-AddMonitorSummaryToIncidentAndAlert.ts +33 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1785516996695-AddSessionReplayReliabilityColumns.ts +40 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1785533806494-AddSessionReplayCorrelationColumns.ts +54 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1785749674203-AddRedisAndPostgresHealthNotificationColumns.ts +104 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1785763818197-AddAutoRemediation.ts +349 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1785768089408-AddRemediationVerification.ts +67 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1785776960660-AddRunnerCapabilities.ts +23 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1785790000000-AddIncidentInvestigationGating.ts +42 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1785800000000-AddRunbookCredential.ts +84 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1785810000000-RenameRunbookAgentToRunner.ts +152 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1785860000000-SessionReplayDefaultToSensitiveInputMasking.ts +81 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1785870000000-AddAiCommandRemediation.ts +151 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1785880000000-AlignRunnerSchemaWithEntities.ts +597 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1785890000000-AddFixVerificationAndAutomaticCodeFixes.ts +71 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +40 -0
- package/Server/Services/AIRunService.ts +10 -0
- package/Server/Services/AIService.ts +30 -0
- package/Server/Services/AlertEpisodeService.ts +47 -0
- package/Server/Services/AlertService.ts +166 -4
- package/Server/Services/AlertSeverityService.ts +25 -11
- package/Server/Services/AlertStateService.ts +25 -11
- package/Server/Services/AutoRemediationRuleEngineService.ts +1101 -0
- package/Server/Services/{RunbookAgentOwnerTeamService.ts → AutoRemediationRuleService.ts} +1 -1
- package/Server/Services/AutoRemediationSuggestionService.ts +183 -0
- package/Server/Services/BillingService.ts +148 -1
- package/Server/Services/DatabaseService.ts +274 -22
- package/Server/Services/IncidentEpisodeService.ts +47 -0
- package/Server/Services/IncidentService.ts +179 -4
- package/Server/Services/IncidentSeverityService.ts +25 -11
- package/Server/Services/IncidentStateService.ts +25 -11
- package/Server/Services/IncidentTemplateService.ts +123 -1
- package/Server/Services/Index.ts +21 -0
- package/Server/Services/LogDropFilterService.ts +133 -0
- package/Server/Services/MonitorProbeService.ts +94 -4
- package/Server/Services/MonitorService.ts +72 -43
- package/Server/Services/MonitorStatusService.ts +25 -11
- package/Server/Services/NetworkDeviceDiscoveryScanService.ts +70 -0
- package/Server/Services/NetworkDeviceLabelRuleEngineService.ts +18 -19
- package/Server/Services/NetworkDeviceLabelRuleService.ts +39 -0
- package/Server/Services/NetworkDeviceOwnerRuleEngineService.ts +18 -19
- package/Server/Services/NetworkDeviceOwnerRuleService.ts +37 -0
- package/Server/Services/NetworkDeviceService.ts +172 -21
- package/Server/Services/NetworkSiteAssignmentRuleService.ts +92 -12
- package/Server/Services/NetworkSiteService.ts +27 -10
- package/Server/Services/ProbeService.ts +66 -0
- package/Server/Services/ProjectService.ts +178 -7
- package/Server/Services/RecommendationDismissalService.ts +52 -0
- package/Server/Services/RumApplicationService.ts +240 -1
- package/Server/Services/RumSessionChunkService.ts +11 -0
- package/Server/Services/RumSessionErasureRequestService.ts +197 -0
- package/Server/Services/RumSessionPinService.ts +213 -0
- package/Server/Services/RumSessionReplayViewService.ts +201 -0
- package/Server/Services/RumSessionService.ts +123 -0
- package/Server/Services/RunbookCredentialService.ts +76 -0
- package/Server/Services/{RunbookAgentJobService.ts → RunnerJobService.ts} +264 -52
- package/Server/Services/{RunbookAgentOwnerUserService.ts → RunnerOwnerTeamService.ts} +1 -1
- package/Server/Services/RunnerOwnerUserService.ts +10 -0
- package/Server/Services/RunnerService.ts +172 -0
- package/Server/Services/ScheduledMaintenanceService.ts +103 -0
- package/Server/Services/ScheduledMaintenanceStateService.ts +25 -11
- package/Server/Services/ScheduledMaintenanceStateTimelineService.ts +15 -1
- package/Server/Services/ScheduledMaintenanceTemplateService.ts +90 -0
- package/Server/Services/ServiceService.ts +8 -2
- package/Server/Services/StatusPageGroupService.ts +186 -0
- package/Server/Services/StatusPageService.ts +240 -36
- package/Server/Services/StatusPageSubscriberNotificationTemplateService.ts +20 -1
- package/Server/Services/TelemetryExceptionService.ts +3 -16
- package/Server/Services/TelemetryUsageBillingService.ts +33 -2
- package/Server/Services/TraceAggregationService.ts +196 -32
- package/Server/Services/TraceDropFilterService.ts +133 -0
- package/Server/Types/Billing/MeteredPlan/AllMeteredPlans.ts +17 -0
- package/Server/Types/Billing/MeteredPlan/ServerMeteredPlan.ts +10 -0
- package/Server/Types/Workflow/Components/API/Delete.ts +12 -0
- package/Server/Types/Workflow/Components/API/Get.ts +12 -0
- package/Server/Types/Workflow/Components/API/Patch.ts +12 -0
- package/Server/Types/Workflow/Components/API/Post.ts +12 -0
- package/Server/Types/Workflow/Components/API/Put.ts +13 -0
- package/Server/Utils/AI/Chat/ObservabilityAssistant.ts +63 -7
- package/Server/Utils/AI/CodeFix/CodeFixAgentAuth.ts +128 -0
- package/Server/Utils/AI/CodeFix/CodeFixAgentAvailability.ts +54 -0
- package/Server/Utils/AI/CodeFix/CodeFixReadiness.ts +17 -10
- package/Server/Utils/AI/CodeFix/CodeFixRunQueue.ts +8 -6
- package/Server/Utils/AI/Remediation/RemediationCommandTools.ts +943 -0
- package/Server/Utils/AI/Remediation/RemediationExecutionRunner.ts +866 -0
- package/Server/Utils/AI/Remediation/RemediationPlanRunner.ts +823 -0
- package/Server/Utils/AI/SRE/AIInvestigationEngine.ts +103 -12
- package/Server/Utils/AI/SRE/AlertInvestigationRunner.ts +75 -17
- package/Server/Utils/AI/SRE/ConfidenceSignal.ts +28 -6
- package/Server/Utils/AI/SRE/FixFromIncidentTaskTrigger.ts +202 -12
- package/Server/Utils/AI/SRE/IncidentInvestigationRunner.ts +264 -14
- package/Server/Utils/AI/SRE/Insights/Triage.ts +2 -7
- package/Server/Utils/AI/SRE/InvestigationGrader.ts +5 -24
- package/Server/Utils/AI/SRE/InvestigationQueue.ts +259 -20
- package/Server/Utils/AI/SRE/PostedRootCause.ts +82 -0
- package/Server/Utils/AI/SRE/README.md +3 -2
- package/Server/Utils/AI/SRE/RemediationHandoff.ts +82 -0
- package/Server/Utils/AI/SRE/SubjectCodeFixRun.ts +6 -19
- package/Server/Utils/AI/Toolbox/CodeWriteTools.ts +2 -2
- package/Server/Utils/Alert/AlertPrivacyFilter.ts +58 -0
- package/Server/Utils/AutoRemediation/CommandPlanExecutor.ts +604 -0
- package/Server/Utils/AutoRemediation/RemediationVerifier.ts +619 -0
- package/Server/Utils/CorsOptions.ts +52 -0
- package/Server/Utils/Database/ProjectScopedReferenceValidator.ts +212 -0
- package/Server/Utils/Database/RelationIdUtil.ts +68 -0
- package/Server/Utils/DropFilterValidation.ts +127 -0
- package/Server/Utils/Errors.ts +5 -0
- package/Server/Utils/Incident/IncidentPrivacyFilter.ts +60 -0
- package/Server/Utils/InstanceHealth/PostgresHealth.ts +286 -0
- package/Server/Utils/InstanceHealth/RedisHealth.ts +434 -0
- package/Server/Utils/Monitor/MonitorAlert.ts +48 -1
- package/Server/Utils/Monitor/MonitorIncident.ts +51 -2
- package/Server/Utils/Monitor/MonitorResource.ts +19 -0
- package/Server/Utils/Monitor/MonitorSummaryCapture.ts +104 -0
- package/Server/Utils/NetworkDevice/RulePatternValidator.ts +44 -0
- package/Server/Utils/OpenAPI.ts +2 -1
- package/Server/Utils/Runbook/RunbookExecutePermission.ts +94 -0
- package/Server/Utils/SessionReplay/SessionReplayErasureTombstone.ts +128 -0
- package/Server/Utils/SessionReplay/SessionReplayGateCache.ts +586 -0
- package/Server/Utils/SessionReplay/SessionReplayGateCacheStore.ts +188 -0
- package/Server/Utils/SessionReplay/SessionReplayReadService.ts +1449 -0
- package/Server/Utils/SessionReplay/SessionReplayRetention.ts +114 -0
- package/Server/Utils/SessionReplay/SessionReplayTargeting.ts +144 -0
- package/Server/Utils/SessionReplay/SessionReplayUsage.ts +92 -0
- package/Server/Utils/StartServer.ts +47 -3
- package/Server/Utils/Telemetry/AppMetrics.ts +31 -0
- package/Server/Utils/Telemetry/TelemetryFanInWriter.ts +44 -10
- package/Tests/App/Dashboard/AddWidgetModal.test.tsx +557 -0
- package/Tests/App/Dashboard/WidgetCatalog.test.ts +479 -0
- package/Tests/App/StatusPage/BulkAddStatusPageMonitors.test.ts +343 -0
- package/Tests/App/StatusPage/BulkAddStatusPageMonitorsModal.test.tsx +320 -0
- package/Tests/Models/AnalyticsModels/RumSessionSchema.test.ts +455 -0
- package/Tests/Models/AnalyticsModels/SessionIdCorrelation.test.ts +158 -0
- package/Tests/Models/DatabaseModels/MonitorProbeColumnAccessControl.test.ts +196 -0
- package/Tests/Models/DatabaseModels/SessionReplayModels.test.ts +447 -0
- package/Tests/Models/RecommendationDismissalModel.test.ts +269 -0
- package/Tests/Models/RunnerVersionLabel.test.ts +223 -0
- package/Tests/Server/API/BaseAPIUpdatePayloadValidation.test.ts +320 -0
- package/Tests/Server/API/BaseAnalyticsAPIUpdatePayloadValidation.test.ts +293 -0
- package/Tests/Server/API/CommonAPIAuthGuard.test.ts +164 -0
- package/Tests/Server/API/DashboardPublicResourceListAPI.test.ts +1287 -0
- package/Tests/Server/API/LegacyRunbookAgentRoutes.test.ts +117 -0
- package/Tests/Server/API/ProbeAPI.test.ts +422 -53
- package/Tests/Server/API/ProjectAPI.test.ts +180 -0
- package/Tests/Server/API/ProjectAPIExtendTrialBillingDisabled.test.ts +138 -0
- package/Tests/Server/API/ProjectScopedCustomRouteAuth.test.ts +458 -0
- package/Tests/Server/API/SessionReplayAPI.test.ts +2093 -0
- package/Tests/Server/API/UserIncomingCallNumberApi.test.ts +429 -0
- package/Tests/Server/API/UserSmsApi.test.ts +68 -2
- package/Tests/Server/DatabaseConfig.test.ts +150 -0
- package/Tests/Server/Infrastructure/ContainerBootConfiguration.test.ts +359 -0
- package/Tests/Server/Infrastructure/ProcessSignalDelivery.test.ts +426 -0
- package/Tests/Server/Services/AIRunCodeFixClaimScoping.test.ts +100 -0
- package/Tests/Server/Services/AIServiceDailyBudget.test.ts +8 -0
- package/Tests/Server/Services/AutoRemediationCommandRuleEngine.test.ts +334 -0
- package/Tests/Server/Services/AutoRemediationRuleEngineService.test.ts +517 -0
- package/Tests/Server/Services/BillingService.test.ts +158 -1
- package/Tests/Server/Services/BillingServiceExtendTrial.test.ts +439 -0
- package/Tests/Server/Services/CrossProjectReferenceWriteGuard.test.ts +810 -0
- package/Tests/Server/Services/DatabaseServiceAtomicAddToColumns.test.ts +269 -0
- package/Tests/Server/Services/DatabaseServiceEmptyUpdate.test.ts +299 -0
- package/Tests/Server/Services/DatabaseServiceSanitizeUpdateData.test.ts +17 -10
- package/Tests/Server/Services/DatabaseServiceSortColumnSelect.test.ts +201 -0
- package/Tests/Server/Services/DatabaseServiceUpdateColumnsWithoutHooks.test.ts +128 -0
- package/Tests/Server/Services/DatabaseServiceUpdateWriteRouting.test.ts +178 -0
- package/Tests/Server/Services/DatabaseServiceUpdateWriteRoutingMonitor.test.ts +206 -0
- package/Tests/Server/Services/DiscoveryScanClaimHookFreeSafety.test.ts +81 -23
- package/Tests/Server/Services/DropFilterSaveValidation.test.ts +398 -0
- package/Tests/Server/Services/MonitorProbeDeleteHooks.test.ts +280 -0
- package/Tests/Server/Services/MonitorProbeServiceProbeTenancy.test.ts +304 -0
- package/Tests/Server/Services/MonitorServiceOperationalStatusSelection.test.ts +145 -0
- package/Tests/Server/Services/NetworkDeviceDiscoveryScanService.test.ts +262 -0
- package/Tests/Server/Services/NetworkDeviceRuleEngines.test.ts +726 -0
- package/Tests/Server/Services/NetworkDeviceSiteAssignment.test.ts +570 -9
- package/Tests/Server/Services/NetworkSiteAssignmentRuleService.test.ts +94 -1
- package/Tests/Server/Services/NetworkSiteService.test.ts +85 -0
- package/Tests/Server/Services/ProjectServiceExtendTrial.test.ts +614 -0
- package/Tests/Server/Services/RecommendationDismissalService.test.ts +306 -0
- package/Tests/Server/Services/RepairCrossProjectIncidentReferencesMigration.test.ts +528 -0
- package/Tests/Server/Services/RumApplicationReplayHealth.test.ts +114 -0
- package/Tests/Server/Services/RunbookCredentialService.test.ts +657 -0
- package/Tests/Server/Services/SessionReplayCreatePath.test.ts +376 -0
- package/Tests/Server/Services/SessionReplayGateCacheInvalidation.test.ts +211 -0
- package/Tests/Server/Services/SessionReplayMetering.test.ts +174 -0
- package/Tests/Server/Services/StatusPageGroupNesting.test.ts +395 -0
- package/Tests/Server/Services/StatusPageSubscriberReport.test.ts +555 -0
- package/Tests/Server/Services/TelemetryExceptionAIFixReadiness.test.ts +25 -4
- package/Tests/Server/Services/TelemetryExceptionCodeFixRun.test.ts +17 -2
- package/Tests/Server/Services/TraceAggregationService.test.ts +48 -0
- package/Tests/Server/Services/TraceAnalyticsResourceDisplayNames.test.ts +855 -0
- package/Tests/Server/Services/UpdateOneByIdKeepsRowId.test.ts +38 -27
- package/Tests/Server/TestingUtils/Services/BillingServiceHelper.ts +26 -21
- package/Tests/Server/Types/Database/Permissions/WorkflowVariableColumnPermission.test.ts +227 -0
- package/Tests/Server/Types/Workflow/Components/ApiComponentErrorPort.test.ts +285 -0
- package/Tests/Server/Utils/AI/AIConfidenceSignal.test.ts +44 -0
- package/Tests/Server/Utils/AI/AIIncidentGating.test.ts +475 -0
- package/Tests/Server/Utils/AI/CodeFix/CodeFixAgentAuth.test.ts +257 -0
- package/Tests/Server/Utils/AI/CodeFix/CodeFixAgentAvailability.test.ts +236 -0
- package/Tests/Server/Utils/AI/CodeFixReadiness.test.ts +44 -6
- package/Tests/Server/Utils/AI/CodeFixRunQueue.test.ts +47 -1
- package/Tests/Server/Utils/AI/CodeWriteTools.test.ts +2 -2
- package/Tests/Server/Utils/AI/FixFromIncidentAutoTrigger.test.ts +294 -0
- package/Tests/Server/Utils/AI/Insights/InsightTriageRunner.test.ts +2 -2
- package/Tests/Server/Utils/AI/Insights/InvestigationQueueInsightSubject.test.ts +47 -3
- package/Tests/Server/Utils/AI/InvestigationQueueRemediationExecution.test.ts +233 -0
- package/Tests/Server/Utils/AI/InvestigationSettlement.test.ts +463 -0
- package/Tests/Server/Utils/AI/PostedRootCause.test.ts +254 -0
- package/Tests/Server/Utils/AI/RemediationAllowlistNormalization.test.ts +248 -0
- package/Tests/Server/Utils/AI/RemediationCommandTools.test.ts +1008 -0
- package/Tests/Server/Utils/AI/RemediationExecutionRunner.test.ts +887 -0
- package/Tests/Server/Utils/AI/RemediationHandoff.test.ts +306 -0
- package/Tests/Server/Utils/AI/RemediationPlanRunner.test.ts +745 -0
- package/Tests/Server/Utils/AI/SubjectCodeFixRunDedupe.test.ts +291 -0
- package/Tests/Server/Utils/AutoRemediation/CommandPlanExecutor.test.ts +1050 -0
- package/Tests/Server/Utils/AutoRemediation/CommandPlanVerification.test.ts +350 -0
- package/Tests/Server/Utils/AutoRemediation/RemediationVerifier.test.ts +341 -0
- package/Tests/Server/Utils/CorsOptions.test.ts +119 -0
- package/Tests/Server/Utils/Database/ProjectScopedReferenceValidator.test.ts +463 -0
- package/Tests/Server/Utils/Database/RelationIdUtil.test.ts +120 -0
- package/Tests/Server/Utils/Database/ResolveReferenceId.test.ts +60 -0
- package/Tests/Server/Utils/DropFilterValidation.test.ts +269 -0
- package/Tests/Server/Utils/InstanceHealth/PostgresHealth.test.ts +337 -0
- package/Tests/Server/Utils/InstanceHealth/RedisHealth.test.ts +671 -0
- package/Tests/Server/Utils/Monitor/MonitorSummaryCapture.test.ts +205 -0
- package/Tests/Server/Utils/Monitor/MonitorSummaryPersistence.test.ts +313 -0
- package/Tests/Server/Utils/PushNotificationUtil.test.ts +228 -0
- package/Tests/Server/Utils/SessionReplay/SessionReplayGateCachePolicy.test.ts +177 -0
- package/Tests/Server/Utils/SessionReplay/SessionReplayOriginAllowlist.test.ts +108 -0
- package/Tests/Server/Utils/SessionReplay/SessionReplayRetention.test.ts +229 -0
- package/Tests/Server/Utils/SessionReplay/SessionReplayTargeting.test.ts +246 -0
- package/Tests/Server/Utils/Telemetry/SpanUtil.test.ts +94 -0
- package/Tests/Server/Utils/Telemetry/TelemetryFanInWriter.test.ts +110 -0
- package/Tests/Types/AI/AIRunStatus.test.ts +25 -0
- package/Tests/Types/AutoRemediation/AiRemediationCommandPlan.test.ts +1063 -0
- package/Tests/Types/BaseDatabase/AggregationType.test.ts +56 -0
- package/Tests/Types/CustomField/CustomFieldDropdownOption.test.ts +227 -0
- package/Tests/Types/Dashboard/DashboardTemplateInvariants.test.ts +811 -0
- package/Tests/Types/Dashboard/RumDashboardTemplate.test.ts +1238 -0
- package/Tests/Types/DateUserTimezone.test.ts +52 -0
- package/Tests/Types/Day/DayOfWeek.test.ts +46 -0
- package/Tests/Types/Docker/DockerInventoryExtractor.test.ts +249 -0
- package/Tests/Types/Kubernetes/KubernetesInventoryExtractor.test.ts +231 -0
- package/Tests/Types/Kubernetes/KubernetesRightSizing.test.ts +323 -0
- package/Tests/Types/Metrics/MetricDownsamplingRetentionDays.test.ts +77 -0
- package/Tests/Types/Monitor/KubernetesAlertTemplates.test.ts +177 -9
- package/Tests/Types/Monitor/MonitorStepDnsMonitor.test.ts +105 -0
- package/Tests/Types/Monitor/MonitorStepDnssecMonitor.test.ts +131 -0
- package/Tests/Types/Monitor/MonitorStepDomainMonitor.test.ts +60 -0
- package/Tests/Types/Monitor/MonitorStepExternalStatusPageMonitor.test.ts +82 -0
- package/Tests/Types/Monitor/MonitorStepInfrastructureMonitors.test.ts +268 -0
- package/Tests/Types/Monitor/MonitorStepMetricMonitor.test.ts +386 -0
- package/Tests/Types/Monitor/MonitorStepProfileMonitor.test.ts +185 -0
- package/Tests/Types/Monitor/MonitorStepSnmpMonitor.test.ts +156 -0
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCatalog.test.ts +399 -0
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCoverage.test.ts +901 -0
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationNotificationMode.test.ts +608 -0
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.test.ts +754 -0
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationUtil.test.ts +963 -0
- package/Tests/Types/Monitor/RumAlertTemplates.test.ts +285 -0
- package/Tests/Types/Podman/PodmanInventoryExtractor.test.ts +159 -0
- package/Tests/Types/RollingTime/RollingTimeUtil.test.ts +186 -0
- package/Tests/Types/Runbook/RunbookExecutionDeadline.test.ts +268 -0
- package/Tests/Types/Runbook/RunbookStepTimeout.test.ts +410 -0
- package/Tests/Types/Runbook/RunbookStepType.test.ts +242 -0
- package/Tests/Types/Telemetry/DropFilterSampling.test.ts +241 -0
- package/Tests/Types/Telemetry/TelemetryRetentionConfig.test.ts +225 -0
- package/Tests/Types/Text.test.ts +60 -0
- package/Tests/Types/Workspace/NotificationRuleConditionUtil.test.ts +353 -0
- package/Tests/Types/Workspace/NotificationRuleUtil.test.ts +566 -0
- package/Tests/UI/Components/AutocompleteTextInputMenu.test.tsx +555 -0
- package/Tests/UI/Components/BulkLabelActions.test.tsx +1502 -0
- package/Tests/UI/Components/BulkOwnerActions.test.tsx +1255 -0
- package/Tests/UI/Components/CodeEditor.test.tsx +174 -0
- package/Tests/UI/Components/CustomFields/DropdownOptionsInput.test.tsx +228 -0
- package/Tests/UI/Components/Detail/DropdownColors.test.tsx +128 -0
- package/Tests/UI/Components/Dropdown/DropdownValueBadge.test.tsx +60 -0
- package/Tests/UI/Components/ErrorBoundary.test.tsx +555 -24
- package/Tests/UI/Components/FilterModalOperatorMenu.test.tsx +674 -0
- package/Tests/UI/Components/Forms/ColorPicker.test.tsx +48 -0
- package/Tests/UI/Components/Forms/ColorPickerPopup.test.tsx +222 -0
- package/Tests/UI/Components/Forms/IconPickerPopup.test.tsx +270 -0
- package/Tests/UI/Components/InfoCard.test.tsx +358 -0
- package/Tests/UI/Components/LogTimeRangePicker.test.tsx +138 -0
- package/Tests/UI/Components/Modal.test.tsx +43 -5
- package/Tests/UI/Components/ModelTable/BaseModelTableSearchLabels.test.tsx +397 -0
- package/Tests/UI/Components/ModelTable/ColumnCustomizationModal.test.tsx +427 -0
- package/Tests/UI/Components/ModelTable/CustomFieldColumns.test.tsx +125 -6
- package/Tests/UI/Components/OperatorSelectorFilterTypes.test.tsx +1595 -0
- package/Tests/UI/Components/OperatorSelectorKeyboard.test.tsx +851 -0
- package/Tests/UI/Components/OperatorSelectorMenu.test.tsx +1229 -0
- package/Tests/UI/Components/Pagination.test.tsx +85 -0
- package/Tests/UI/Components/Runbook/StepTimeoutInput.test.tsx +386 -0
- package/Tests/UI/Components/StatusPage/ResourceGroupSection.test.tsx +671 -0
- package/Tests/UI/Components/TelemetryTimeRangePicker.test.tsx +404 -0
- package/Tests/UI/Monitor/MonitorSummarySnapshotRender.test.tsx +248 -0
- package/Tests/UI/Rum/ChunkLoader.test.ts +790 -0
- package/Tests/UI/Rum/ReplayScrubber.test.tsx +236 -0
- package/Tests/UI/Rum/ReplayStage.test.tsx +606 -0
- package/Tests/UI/Utils/DropdownAlignment.test.ts +306 -0
- package/Tests/UI/Utils/TableFilterUrlState.test.ts +292 -0
- package/Tests/UI/Utils/Timezone.test.ts +86 -0
- package/Tests/UI/Utils/UseClockTick.test.tsx +276 -0
- package/Tests/Utils/AiRemediation/CommandPolicy.test.ts +1063 -0
- package/Tests/Utils/Dashboard/ClockWidgetFormat.test.ts +1374 -0
- package/Tests/Utils/Dashboard/DashboardClockComponent.test.ts +362 -0
- package/Tests/Utils/Dashboard/DashboardHtmlComponent.test.ts +217 -0
- package/Tests/Utils/Dashboard/HtmlWidgetDocument.test.ts +656 -0
- package/Tests/Utils/Dashboard/ValueWidgetLayout.test.ts +1007 -0
- package/Tests/Utils/Metrics/MetricSeriesScope.test.ts +1197 -0
- package/Tests/Utils/Monitor/MonitorSummaryProbeUtil.test.ts +263 -0
- package/Tests/Utils/Monitor/MonitorSummarySnapshotUtil.test.ts +839 -0
- package/Tests/Utils/NetworkDiscovery/ScanTargetUtil.test.ts +583 -0
- package/Tests/Utils/NetworkSite/CidrMatchUtil.test.ts +69 -0
- package/Tests/Utils/Rules/RulePatternMatchUtil.test.ts +274 -0
- package/Tests/Utils/Rum/ChunkMath.test.ts +286 -0
- package/Tests/Utils/Rum/Masking.test.ts +186 -0
- package/Tests/Utils/Rum/SessionIdentity.test.ts +272 -0
- package/Tests/Utils/Rum/SessionSampling.test.ts +164 -0
- package/Tests/Utils/Rum/UrlScrubber.test.ts +175 -0
- package/Tests/Utils/StatusPage/GroupNestingLayout.test.ts +1072 -0
- package/Tests/Utils/StatusPage/GroupTree.test.ts +583 -0
- package/Tests/Utils/StatusPage/Report.test.ts +708 -0
- package/Tests/Utils/StatusPage/ResourceUptime.test.ts +411 -0
- package/Tests/Utils/ValueFormatter.test.ts +299 -1
- package/Types/AI/AIRunStatus.ts +18 -7
- package/Types/AI/AIRunType.ts +18 -0
- package/Types/AI/FixVerificationStatus.ts +21 -0
- package/Types/AnalyticsDatabase/AnalyticsTableName.ts +16 -0
- package/Types/AutoRemediation/AiRemediationCommandPlan.ts +304 -0
- package/Types/AutoRemediation/AutoRemediationExecutionMode.ts +17 -0
- package/Types/AutoRemediation/AutoRemediationSuggestionStatus.ts +35 -0
- package/Types/AutoRemediation/AutoRemediationSuggestionType.ts +17 -0
- package/Types/AutoRemediation/AutoRemediationTriggerEntity.ts +11 -0
- package/Types/AutoRemediation/AutoRemediationVerificationStatus.ts +21 -0
- package/Types/CustomField/CustomFieldDropdownOption.ts +190 -0
- package/Types/Dashboard/DashboardComponentType.ts +2 -0
- package/Types/Dashboard/DashboardComponents/ComponentArgument.ts +4 -0
- package/Types/Dashboard/DashboardComponents/DashboardClockComponent.ts +45 -0
- package/Types/Dashboard/DashboardComponents/DashboardHtmlComponent.ts +27 -0
- package/Types/Dashboard/DashboardComponents/DashboardValueComponent.ts +8 -0
- package/Types/Dashboard/DashboardTemplates.ts +516 -0
- package/Types/Date.ts +21 -6
- package/Types/Email/EmailTemplateType.ts +2 -0
- package/Types/Kubernetes/KubernetesRightSizing.ts +353 -0
- package/Types/MeteredPlan/ProductType.ts +1 -0
- package/Types/Monitor/KubernetesAlertTemplates.ts +205 -0
- package/Types/Monitor/MonitorStep.ts +10 -1
- package/Types/Monitor/MonitorStepMetricMonitor.ts +73 -2
- package/Types/Monitor/MonitorSteps.ts +5 -0
- package/Types/Monitor/MonitorSummarySnapshot.ts +88 -0
- package/Types/Monitor/Recommendation/MonitorRecommendationCatalog.ts +455 -0
- package/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.ts +168 -0
- package/Types/Monitor/Recommendation/MonitorRecommendationTypes.ts +177 -0
- package/Types/Monitor/Recommendation/MonitorRecommendationUtil.ts +824 -0
- package/Types/Monitor/RumAlertTemplates.ts +386 -0
- package/Types/Permission.ts +249 -24
- package/Types/Recommendation/RecommendationType.ts +20 -0
- package/Types/Rum/SessionReplay.ts +452 -0
- package/Types/Rum/SessionReplayCaptureTrigger.ts +26 -0
- package/Types/Rum/SessionReplayConsentMode.ts +27 -0
- package/Types/Rum/SessionReplayMaskingMode.ts +86 -0
- package/Types/Rum/SessionReplayTriggerReason.ts +31 -0
- package/Types/Runbook/RunbookCredentialType.ts +6 -0
- package/Types/Runbook/RunbookExecutionDeadline.ts +129 -0
- package/Types/Runbook/RunbookStep.ts +66 -1
- package/Types/Runbook/RunbookStepTimeout.ts +202 -0
- package/Types/Runbook/RunbookStepType.ts +26 -0
- package/Types/Runbook/RunnerJobOrigin.ts +20 -0
- package/Types/Runbook/{RunbookAgentJobStatus.ts → RunnerJobStatus.ts} +2 -2
- package/Types/StatusPage/StatusPageReport.ts +99 -0
- package/Types/Telemetry/DropFilterSampling.ts +92 -0
- package/Types/Telemetry/TelemetryRetentionConfig.ts +18 -1
- package/Types/Text.ts +33 -0
- package/UI/Components/AI/GenerateFromAIModal.tsx +0 -2
- package/UI/Components/Accordion/Accordion.tsx +10 -2
- package/UI/Components/AutocompleteTextInput/AutocompleteTextInput.tsx +260 -75
- package/UI/Components/BulkUpdate/BulkLabelActions.tsx +99 -10
- package/UI/Components/BulkUpdate/BulkOwnerActions.tsx +11 -0
- package/UI/Components/CodeEditor/CodeEditor.tsx +34 -20
- package/UI/Components/CustomFields/CustomFieldsDetail.tsx +19 -14
- package/UI/Components/CustomFields/DropdownOptionsInput.tsx +144 -54
- package/UI/Components/Date/RangeStartAndEndDateView.tsx +0 -1
- package/UI/Components/Detail/Detail.tsx +9 -22
- package/UI/Components/Dropdown/Dropdown.tsx +2 -5
- package/UI/Components/Dropdown/DropdownMenuZIndex.ts +7 -0
- package/UI/Components/Dropdown/DropdownValueBadge.tsx +61 -0
- package/UI/Components/EditionLabel/EditionLabel.tsx +1 -27
- package/UI/Components/Error/PageError.tsx +0 -4
- package/UI/Components/ErrorBoundary.tsx +252 -15
- package/UI/Components/Filters/OperatorSelector.tsx +350 -39
- package/UI/Components/Forms/Fields/ColorPicker.tsx +60 -27
- package/UI/Components/Forms/Fields/IconPicker.tsx +89 -60
- package/UI/Components/Forms/Validation.ts +9 -4
- package/UI/Components/InfoCard/InfoCard.tsx +58 -1
- package/UI/Components/List/List.tsx +1 -0
- package/UI/Components/LogsViewer/components/LogTimeRangePicker.tsx +34 -1
- package/UI/Components/Modal/Modal.tsx +16 -60
- package/UI/Components/ModelFormModal/ModelFormModal.tsx +0 -8
- package/UI/Components/ModelTable/BaseModelTable.tsx +116 -67
- package/UI/Components/ModelTable/ColumnCustomizationModal.tsx +150 -47
- package/UI/Components/ModelTable/CustomFieldColumns.tsx +41 -32
- package/UI/Components/Pagination/Pagination.tsx +33 -10
- package/UI/Components/Runbook/StepTimeoutInput.tsx +173 -0
- package/UI/Components/StatusPage/ResourceGroupSection.tsx +231 -0
- package/UI/Components/Table/Table.tsx +1 -0
- package/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.tsx +34 -1
- package/UI/Types/UseAnchoredFieldPopup.ts +321 -0
- package/UI/Utils/Dropdown.ts +26 -0
- package/UI/Utils/DropdownAlignment.ts +162 -0
- package/UI/Utils/TableFilterUrlState.ts +59 -20
- package/UI/Utils/Timezone.ts +18 -2
- package/UI/Utils/UseClockTick.ts +78 -0
- package/Utils/API.ts +106 -2
- package/Utils/AiRemediation/CommandPolicy.ts +398 -0
- package/Utils/Dashboard/ClockWidgetFormat.ts +604 -0
- package/Utils/Dashboard/Components/DashboardClockComponent.ts +181 -0
- package/Utils/Dashboard/Components/DashboardHtmlComponent.ts +162 -0
- package/Utils/Dashboard/Components/DashboardValueComponent.ts +12 -1
- package/Utils/Dashboard/Components/Index.ts +14 -0
- package/Utils/Dashboard/HtmlWidgetDocument.ts +309 -0
- package/Utils/Dashboard/ValueWidgetLayout.ts +471 -0
- package/Utils/Metrics/MetricSeriesScope.ts +301 -0
- package/Utils/Monitor/MonitorSummaryProbeUtil.ts +130 -0
- package/Utils/Monitor/MonitorSummarySnapshotUtil.ts +593 -0
- package/Utils/NetworkDiscovery/ScanTargetUtil.ts +434 -0
- package/Utils/NetworkSite/CidrMatchUtil.ts +30 -17
- package/Utils/Rules/RulePatternMatchUtil.ts +103 -0
- package/Utils/Rum/ChunkMath.ts +211 -0
- package/Utils/Rum/Masking.ts +168 -0
- package/Utils/Rum/SessionIdentity.ts +230 -0
- package/Utils/Rum/SessionSampling.ts +108 -0
- package/Utils/Rum/UrlScrubber.ts +185 -0
- package/Utils/Schema/ModelSchema.ts +27 -3
- package/Utils/StatusPage/GroupNestingLayout.ts +343 -0
- package/Utils/StatusPage/GroupTree.ts +307 -0
- package/Utils/StatusPage/Report.ts +304 -0
- package/Utils/StatusPage/ResourceUptime.ts +90 -17
- package/Utils/ValueFormatter.ts +300 -54
- package/build/dist/Models/AnalyticsModels/ExceptionInstance.js +63 -0
- package/build/dist/Models/AnalyticsModels/ExceptionInstance.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/Index.js +10 -0
- package/build/dist/Models/AnalyticsModels/Index.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/Log.js +56 -0
- package/build/dist/Models/AnalyticsModels/Log.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/RumSession.js +1159 -0
- package/build/dist/Models/AnalyticsModels/RumSession.js.map +1 -0
- package/build/dist/Models/AnalyticsModels/RumSessionChunk.js +670 -0
- package/build/dist/Models/AnalyticsModels/RumSessionChunk.js.map +1 -0
- package/build/dist/Models/AnalyticsModels/Span.js +56 -0
- package/build/dist/Models/AnalyticsModels/Span.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AIAgentTaskPullRequest.js +54 -0
- package/build/dist/Models/DatabaseModels/AIAgentTaskPullRequest.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AIRun.js +32 -0
- package/build/dist/Models/DatabaseModels/AIRun.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Alert.js +30 -0
- package/build/dist/Models/DatabaseModels/Alert.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertCustomField.js +1 -1
- package/build/dist/Models/DatabaseModels/AlertCustomField.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertEpisodeStateTimeline.js +1 -0
- package/build/dist/Models/DatabaseModels/AlertEpisodeStateTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertFeed.js +1 -0
- package/build/dist/Models/DatabaseModels/AlertFeed.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertStateTimeline.js +1 -0
- package/build/dist/Models/DatabaseModels/AlertStateTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AutoRemediationRule.js +998 -0
- package/build/dist/Models/DatabaseModels/AutoRemediationRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/AutoRemediationSuggestion.js +917 -0
- package/build/dist/Models/DatabaseModels/AutoRemediationSuggestion.js.map +1 -0
- package/build/dist/Models/DatabaseModels/CodeRepository.js +132 -0
- package/build/dist/Models/DatabaseModels/CodeRepository.js.map +1 -1
- package/build/dist/Models/DatabaseModels/GlobalConfig.js +327 -0
- package/build/dist/Models/DatabaseModels/GlobalConfig.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Incident.js +30 -0
- package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentCustomField.js +1 -1
- package/build/dist/Models/DatabaseModels/IncidentCustomField.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisodeStateTimeline.js +1 -0
- package/build/dist/Models/DatabaseModels/IncidentEpisodeStateTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentFeed.js +1 -0
- package/build/dist/Models/DatabaseModels/IncidentFeed.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentStateTimeline.js +1 -0
- package/build/dist/Models/DatabaseModels/IncidentStateTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +22 -8
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/InstanceHealthLog.js +8 -0
- package/build/dist/Models/DatabaseModels/InstanceHealthLog.js.map +1 -1
- package/build/dist/Models/DatabaseModels/LogDropFilter.js +91 -0
- package/build/dist/Models/DatabaseModels/LogDropFilter.js.map +1 -1
- package/build/dist/Models/DatabaseModels/MonitorCustomField.js +1 -1
- package/build/dist/Models/DatabaseModels/MonitorCustomField.js.map +1 -1
- package/build/dist/Models/DatabaseModels/MonitorStatus.js +1 -1
- package/build/dist/Models/DatabaseModels/MonitorStatus.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js +14 -4
- package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/NetworkDeviceLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/NetworkDeviceOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkSiteAssignmentRule.js +1 -1
- package/build/dist/Models/DatabaseModels/NetworkSiteAssignmentRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyCustomField.js +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyCustomField.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Project.js +235 -0
- package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
- package/build/dist/Models/DatabaseModels/RecommendationDismissal.js +484 -0
- package/build/dist/Models/DatabaseModels/RecommendationDismissal.js.map +1 -0
- package/build/dist/Models/DatabaseModels/RumApplication.js +930 -0
- package/build/dist/Models/DatabaseModels/RumApplication.js.map +1 -1
- package/build/dist/Models/DatabaseModels/RumSessionErasureRequest.js +591 -0
- package/build/dist/Models/DatabaseModels/RumSessionErasureRequest.js.map +1 -0
- package/build/dist/Models/DatabaseModels/RumSessionPin.js +483 -0
- package/build/dist/Models/DatabaseModels/RumSessionPin.js.map +1 -0
- package/build/dist/Models/DatabaseModels/RumSessionReplayView.js +433 -0
- package/build/dist/Models/DatabaseModels/RumSessionReplayView.js.map +1 -0
- package/build/dist/Models/DatabaseModels/RunbookCredential.js +693 -0
- package/build/dist/Models/DatabaseModels/RunbookCredential.js.map +1 -0
- package/build/dist/Models/DatabaseModels/RunbookSecret.js +8 -8
- package/build/dist/Models/DatabaseModels/RunbookSecret.js.map +1 -1
- package/build/dist/Models/DatabaseModels/{RunbookAgent.js → Runner.js} +235 -70
- package/build/dist/Models/DatabaseModels/Runner.js.map +1 -0
- package/build/dist/Models/DatabaseModels/{RunbookAgentJob.js → RunnerJob.js} +173 -40
- package/build/dist/Models/DatabaseModels/RunnerJob.js.map +1 -0
- package/build/dist/Models/DatabaseModels/{RunbookAgentOwnerTeam.js → RunnerOwnerTeam.js} +57 -57
- package/build/dist/Models/DatabaseModels/RunnerOwnerTeam.js.map +1 -0
- package/build/dist/Models/DatabaseModels/{RunbookAgentOwnerUser.js → RunnerOwnerUser.js} +57 -57
- package/build/dist/Models/DatabaseModels/RunnerOwnerUser.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceCustomField.js +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceCustomField.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.js +1 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageCustomField.js +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageCustomField.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageGroup.js +94 -0
- package/build/dist/Models/DatabaseModels/StatusPageGroup.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TeamCustomField.js +1 -1
- package/build/dist/Models/DatabaseModels/TeamCustomField.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TeamMemberCustomField.js +1 -1
- package/build/dist/Models/DatabaseModels/TeamMemberCustomField.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TraceDropFilter.js +91 -0
- package/build/dist/Models/DatabaseModels/TraceDropFilter.js.map +1 -1
- package/build/dist/Models/DatabaseModels/WorkflowVariable.js +5 -1
- package/build/dist/Models/DatabaseModels/WorkflowVariable.js.map +1 -1
- package/build/dist/Server/API/AIAgentDataAPI.js +130 -45
- package/build/dist/Server/API/AIAgentDataAPI.js.map +1 -1
- package/build/dist/Server/API/AIAgentTaskAPI.js +26 -36
- package/build/dist/Server/API/AIAgentTaskAPI.js.map +1 -1
- package/build/dist/Server/API/AIAgentTaskLogAPI.js +11 -28
- package/build/dist/Server/API/AIAgentTaskLogAPI.js.map +1 -1
- package/build/dist/Server/API/AlertAPI.js +22 -13
- package/build/dist/Server/API/AlertAPI.js.map +1 -1
- package/build/dist/Server/API/AutoRemediationAPI.js +416 -0
- package/build/dist/Server/API/AutoRemediationAPI.js.map +1 -0
- package/build/dist/Server/API/BaseAPI.js +22 -1
- package/build/dist/Server/API/BaseAPI.js.map +1 -1
- package/build/dist/Server/API/BaseAnalyticsAPI.js +28 -2
- package/build/dist/Server/API/BaseAnalyticsAPI.js.map +1 -1
- package/build/dist/Server/API/CommonAPI.js +66 -0
- package/build/dist/Server/API/CommonAPI.js.map +1 -1
- package/build/dist/Server/API/DashboardAPI.js +265 -6
- package/build/dist/Server/API/DashboardAPI.js.map +1 -1
- package/build/dist/Server/API/IncidentAPI.js +43 -26
- package/build/dist/Server/API/IncidentAPI.js.map +1 -1
- package/build/dist/Server/API/IncidentEpisodeAPI.js +21 -12
- package/build/dist/Server/API/IncidentEpisodeAPI.js.map +1 -1
- package/build/dist/Server/API/MonitorAPI.js +23 -0
- package/build/dist/Server/API/MonitorAPI.js.map +1 -1
- package/build/dist/Server/API/MonitorTemplateAPI.js +4 -0
- package/build/dist/Server/API/MonitorTemplateAPI.js.map +1 -1
- package/build/dist/Server/API/ProbeAPI.js +131 -15
- package/build/dist/Server/API/ProbeAPI.js.map +1 -1
- package/build/dist/Server/API/ProjectAPI.js +62 -3
- package/build/dist/Server/API/ProjectAPI.js.map +1 -1
- package/build/dist/Server/API/ScheduledMaintenanceAPI.js +23 -14
- package/build/dist/Server/API/ScheduledMaintenanceAPI.js.map +1 -1
- package/build/dist/Server/API/StatusPageAPI.js +61 -33
- package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
- package/build/dist/Server/API/TelemetryAPI.js +940 -3
- package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
- package/build/dist/Server/API/UserIncomingCallNumberAPI.js +18 -0
- package/build/dist/Server/API/UserIncomingCallNumberAPI.js.map +1 -1
- package/build/dist/Server/API/WorkspaceNotificationRuleAPI.js +26 -2
- package/build/dist/Server/API/WorkspaceNotificationRuleAPI.js.map +1 -1
- package/build/dist/Server/DatabaseConfig.js +23 -4
- package/build/dist/Server/DatabaseConfig.js.map +1 -1
- package/build/dist/Server/EnvironmentConfig.js +8 -0
- package/build/dist/Server/EnvironmentConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785320000000-RepairCrossProjectIncidentReferences.js +397 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785320000000-RepairCrossProjectIncidentReferences.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785329453269-AddParentGroupToStatusPageGroup.js +16 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785329453269-AddParentGroupToStatusPageGroup.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785397674289-AddRecommendationDismissalTable.js +30 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785397674289-AddRecommendationDismissalTable.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785405581596-AddDroppedCountersToDropFilters.js +34 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785405581596-AddDroppedCountersToDropFilters.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785417351021-AddSessionReplay.js +106 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785417351021-AddSessionReplay.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785491583874-EnableSessionReplayByDefault.js +37 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785491583874-EnableSessionReplayByDefault.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785496223183-AddMonitorSummaryToIncidentAndAlert.js +18 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785496223183-AddMonitorSummaryToIncidentAndAlert.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785516996695-AddSessionReplayReliabilityColumns.js +29 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785516996695-AddSessionReplayReliabilityColumns.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785533806494-AddSessionReplayCorrelationColumns.js +35 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785533806494-AddSessionReplayCorrelationColumns.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785749674203-AddRedisAndPostgresHealthNotificationColumns.js +40 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785749674203-AddRedisAndPostgresHealthNotificationColumns.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785763818197-AddAutoRemediation.js +128 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785763818197-AddAutoRemediation.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785768089408-AddRemediationVerification.js +28 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785768089408-AddRemediationVerification.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785776960660-AddRunnerCapabilities.js +14 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785776960660-AddRunnerCapabilities.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785790000000-AddIncidentInvestigationGating.js +27 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785790000000-AddIncidentInvestigationGating.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785800000000-AddRunbookCredential.js +44 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785800000000-AddRunbookCredential.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785810000000-RenameRunbookAgentToRunner.js +88 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785810000000-RenameRunbookAgentToRunner.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785860000000-SessionReplayDefaultToSensitiveInputMasking.js +59 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785860000000-SessionReplayDefaultToSensitiveInputMasking.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785870000000-AddAiCommandRemediation.js +76 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785870000000-AddAiCommandRemediation.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785880000000-AlignRunnerSchemaWithEntities.js +214 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785880000000-AlignRunnerSchemaWithEntities.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785890000000-AddFixVerificationAndAutomaticCodeFixes.js +44 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785890000000-AddFixVerificationAndAutomaticCodeFixes.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +40 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Services/AIRunService.js +1 -4
- package/build/dist/Server/Services/AIRunService.js.map +1 -1
- package/build/dist/Server/Services/AIService.js +26 -0
- package/build/dist/Server/Services/AIService.js.map +1 -1
- package/build/dist/Server/Services/AlertEpisodeService.js +39 -0
- package/build/dist/Server/Services/AlertEpisodeService.js.map +1 -1
- package/build/dist/Server/Services/AlertService.js +132 -4
- package/build/dist/Server/Services/AlertService.js.map +1 -1
- package/build/dist/Server/Services/AlertSeverityService.js +24 -11
- package/build/dist/Server/Services/AlertSeverityService.js.map +1 -1
- package/build/dist/Server/Services/AlertStateService.js +24 -11
- package/build/dist/Server/Services/AlertStateService.js.map +1 -1
- package/build/dist/Server/Services/AutoRemediationRuleEngineService.js +917 -0
- package/build/dist/Server/Services/AutoRemediationRuleEngineService.js.map +1 -0
- package/build/dist/Server/Services/{RunbookAgentOwnerTeamService.js → AutoRemediationRuleService.js} +2 -2
- package/build/dist/Server/Services/AutoRemediationRuleService.js.map +1 -0
- package/build/dist/Server/Services/AutoRemediationSuggestionService.js +127 -0
- package/build/dist/Server/Services/AutoRemediationSuggestionService.js.map +1 -0
- package/build/dist/Server/Services/BillingService.js +116 -1
- package/build/dist/Server/Services/BillingService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +210 -19
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeService.js +39 -0
- package/build/dist/Server/Services/IncidentEpisodeService.js.map +1 -1
- package/build/dist/Server/Services/IncidentService.js +152 -4
- package/build/dist/Server/Services/IncidentService.js.map +1 -1
- package/build/dist/Server/Services/IncidentSeverityService.js +24 -11
- package/build/dist/Server/Services/IncidentSeverityService.js.map +1 -1
- package/build/dist/Server/Services/IncidentStateService.js +24 -11
- package/build/dist/Server/Services/IncidentStateService.js.map +1 -1
- package/build/dist/Server/Services/IncidentTemplateService.js +97 -0
- package/build/dist/Server/Services/IncidentTemplateService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +20 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/LogDropFilterService.js +93 -0
- package/build/dist/Server/Services/LogDropFilterService.js.map +1 -1
- package/build/dist/Server/Services/MonitorProbeService.js +73 -5
- package/build/dist/Server/Services/MonitorProbeService.js.map +1 -1
- package/build/dist/Server/Services/MonitorService.js +58 -39
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/MonitorStatusService.js +25 -11
- package/build/dist/Server/Services/MonitorStatusService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceDiscoveryScanService.js +71 -0
- package/build/dist/Server/Services/NetworkDeviceDiscoveryScanService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceLabelRuleEngineService.js +12 -11
- package/build/dist/Server/Services/NetworkDeviceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceLabelRuleService.js +43 -0
- package/build/dist/Server/Services/NetworkDeviceLabelRuleService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js +12 -11
- package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceOwnerRuleService.js +41 -0
- package/build/dist/Server/Services/NetworkDeviceOwnerRuleService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceService.js +129 -20
- package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
- package/build/dist/Server/Services/NetworkSiteAssignmentRuleService.js +67 -10
- package/build/dist/Server/Services/NetworkSiteAssignmentRuleService.js.map +1 -1
- package/build/dist/Server/Services/NetworkSiteService.js +19 -8
- package/build/dist/Server/Services/NetworkSiteService.js.map +1 -1
- package/build/dist/Server/Services/ProbeService.js +64 -0
- package/build/dist/Server/Services/ProbeService.js.map +1 -1
- package/build/dist/Server/Services/ProjectService.js +146 -7
- package/build/dist/Server/Services/ProjectService.js.map +1 -1
- package/build/dist/Server/Services/RecommendationDismissalService.js +50 -0
- package/build/dist/Server/Services/RecommendationDismissalService.js.map +1 -0
- package/build/dist/Server/Services/RumApplicationService.js +202 -0
- package/build/dist/Server/Services/RumApplicationService.js.map +1 -1
- package/build/dist/Server/Services/RumSessionChunkService.js +9 -0
- package/build/dist/Server/Services/RumSessionChunkService.js.map +1 -0
- package/build/dist/Server/Services/RumSessionErasureRequestService.js +190 -0
- package/build/dist/Server/Services/RumSessionErasureRequestService.js.map +1 -0
- package/build/dist/Server/Services/RumSessionPinService.js +208 -0
- package/build/dist/Server/Services/RumSessionPinService.js.map +1 -0
- package/build/dist/Server/Services/RumSessionReplayViewService.js +180 -0
- package/build/dist/Server/Services/RumSessionReplayViewService.js.map +1 -0
- package/build/dist/Server/Services/RumSessionService.js +102 -0
- package/build/dist/Server/Services/RumSessionService.js.map +1 -0
- package/build/dist/Server/Services/RunbookCredentialService.js +67 -0
- package/build/dist/Server/Services/RunbookCredentialService.js.map +1 -0
- package/build/dist/Server/Services/{RunbookAgentJobService.js → RunnerJobService.js} +217 -47
- package/build/dist/Server/Services/RunnerJobService.js.map +1 -0
- package/build/dist/Server/Services/{RunbookAgentOwnerUserService.js → RunnerOwnerTeamService.js} +2 -2
- package/build/dist/Server/Services/RunnerOwnerTeamService.js.map +1 -0
- package/build/dist/Server/Services/RunnerOwnerUserService.js +9 -0
- package/build/dist/Server/Services/RunnerOwnerUserService.js.map +1 -0
- package/build/dist/Server/Services/RunnerService.js +168 -0
- package/build/dist/Server/Services/RunnerService.js.map +1 -0
- package/build/dist/Server/Services/ScheduledMaintenanceService.js +83 -0
- package/build/dist/Server/Services/ScheduledMaintenanceService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceStateService.js +24 -11
- package/build/dist/Server/Services/ScheduledMaintenanceStateService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceStateTimelineService.js +15 -1
- package/build/dist/Server/Services/ScheduledMaintenanceStateTimelineService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceTemplateService.js +65 -0
- package/build/dist/Server/Services/ScheduledMaintenanceTemplateService.js.map +1 -1
- package/build/dist/Server/Services/ServiceService.js +8 -2
- package/build/dist/Server/Services/ServiceService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageGroupService.js +136 -0
- package/build/dist/Server/Services/StatusPageGroupService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageService.js +173 -16
- package/build/dist/Server/Services/StatusPageService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageSubscriberNotificationTemplateService.js +17 -1
- package/build/dist/Server/Services/StatusPageSubscriberNotificationTemplateService.js.map +1 -1
- package/build/dist/Server/Services/TelemetryExceptionService.js +3 -16
- package/build/dist/Server/Services/TelemetryExceptionService.js.map +1 -1
- package/build/dist/Server/Services/TelemetryUsageBillingService.js +31 -3
- package/build/dist/Server/Services/TelemetryUsageBillingService.js.map +1 -1
- package/build/dist/Server/Services/TraceAggregationService.js +106 -2
- package/build/dist/Server/Services/TraceAggregationService.js.map +1 -1
- package/build/dist/Server/Services/TraceDropFilterService.js +93 -0
- package/build/dist/Server/Services/TraceDropFilterService.js.map +1 -1
- package/build/dist/Server/Types/Billing/MeteredPlan/AllMeteredPlans.js +16 -0
- package/build/dist/Server/Types/Billing/MeteredPlan/AllMeteredPlans.js.map +1 -1
- package/build/dist/Server/Types/Billing/MeteredPlan/ServerMeteredPlan.js +9 -0
- package/build/dist/Server/Types/Billing/MeteredPlan/ServerMeteredPlan.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Delete.js +11 -0
- package/build/dist/Server/Types/Workflow/Components/API/Delete.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Get.js +11 -0
- package/build/dist/Server/Types/Workflow/Components/API/Get.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Patch.js +11 -0
- package/build/dist/Server/Types/Workflow/Components/API/Patch.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Post.js +11 -0
- package/build/dist/Server/Types/Workflow/Components/API/Post.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Put.js +12 -0
- package/build/dist/Server/Types/Workflow/Components/API/Put.js.map +1 -1
- package/build/dist/Server/Utils/AI/Chat/ObservabilityAssistant.js +38 -6
- package/build/dist/Server/Utils/AI/Chat/ObservabilityAssistant.js.map +1 -1
- package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentAuth.js +104 -0
- package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentAuth.js.map +1 -0
- package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentAvailability.js +54 -0
- package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentAvailability.js.map +1 -0
- package/build/dist/Server/Utils/AI/CodeFix/CodeFixReadiness.js +11 -7
- package/build/dist/Server/Utils/AI/CodeFix/CodeFixReadiness.js.map +1 -1
- package/build/dist/Server/Utils/AI/CodeFix/CodeFixRunQueue.js +3 -4
- package/build/dist/Server/Utils/AI/CodeFix/CodeFixRunQueue.js.map +1 -1
- package/build/dist/Server/Utils/AI/Remediation/RemediationCommandTools.js +724 -0
- package/build/dist/Server/Utils/AI/Remediation/RemediationCommandTools.js.map +1 -0
- package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js +668 -0
- package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js.map +1 -0
- package/build/dist/Server/Utils/AI/Remediation/RemediationPlanRunner.js +657 -0
- package/build/dist/Server/Utils/AI/Remediation/RemediationPlanRunner.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js +52 -7
- package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js +53 -5
- package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/ConfidenceSignal.js +25 -6
- package/build/dist/Server/Utils/AI/SRE/ConfidenceSignal.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/FixFromIncidentTaskTrigger.js +131 -17
- package/build/dist/Server/Utils/AI/SRE/FixFromIncidentTaskTrigger.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js +200 -5
- package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/Insights/Triage.js +2 -7
- package/build/dist/Server/Utils/AI/SRE/Insights/Triage.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/InvestigationGrader.js +4 -17
- package/build/dist/Server/Utils/AI/SRE/InvestigationGrader.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/InvestigationQueue.js +203 -19
- package/build/dist/Server/Utils/AI/SRE/InvestigationQueue.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/PostedRootCause.js +89 -0
- package/build/dist/Server/Utils/AI/SRE/PostedRootCause.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/RemediationHandoff.js +82 -0
- package/build/dist/Server/Utils/AI/SRE/RemediationHandoff.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/SubjectCodeFixRun.js +4 -19
- package/build/dist/Server/Utils/AI/SRE/SubjectCodeFixRun.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/CodeWriteTools.js +2 -2
- package/build/dist/Server/Utils/Alert/AlertPrivacyFilter.js +36 -0
- package/build/dist/Server/Utils/Alert/AlertPrivacyFilter.js.map +1 -1
- package/build/dist/Server/Utils/AutoRemediation/CommandPlanExecutor.js +498 -0
- package/build/dist/Server/Utils/AutoRemediation/CommandPlanExecutor.js.map +1 -0
- package/build/dist/Server/Utils/AutoRemediation/RemediationVerifier.js +492 -0
- package/build/dist/Server/Utils/AutoRemediation/RemediationVerifier.js.map +1 -0
- package/build/dist/Server/Utils/CorsOptions.js +47 -0
- package/build/dist/Server/Utils/CorsOptions.js.map +1 -0
- package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js +132 -0
- package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js.map +1 -0
- package/build/dist/Server/Utils/Database/RelationIdUtil.js +51 -0
- package/build/dist/Server/Utils/Database/RelationIdUtil.js.map +1 -0
- package/build/dist/Server/Utils/DropFilterValidation.js +80 -0
- package/build/dist/Server/Utils/DropFilterValidation.js.map +1 -0
- package/build/dist/Server/Utils/Errors.js +3 -0
- package/build/dist/Server/Utils/Errors.js.map +1 -1
- package/build/dist/Server/Utils/Incident/IncidentPrivacyFilter.js +38 -0
- package/build/dist/Server/Utils/Incident/IncidentPrivacyFilter.js.map +1 -1
- package/build/dist/Server/Utils/InstanceHealth/PostgresHealth.js +194 -0
- package/build/dist/Server/Utils/InstanceHealth/PostgresHealth.js.map +1 -0
- package/build/dist/Server/Utils/InstanceHealth/RedisHealth.js +292 -0
- package/build/dist/Server/Utils/InstanceHealth/RedisHealth.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js +39 -12
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js +47 -18
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorResource.js +16 -0
- package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorSummaryCapture.js +92 -0
- package/build/dist/Server/Utils/Monitor/MonitorSummaryCapture.js.map +1 -0
- package/build/dist/Server/Utils/NetworkDevice/RulePatternValidator.js +27 -0
- package/build/dist/Server/Utils/NetworkDevice/RulePatternValidator.js.map +1 -0
- package/build/dist/Server/Utils/OpenAPI.js +2 -1
- package/build/dist/Server/Utils/OpenAPI.js.map +1 -1
- package/build/dist/Server/Utils/Runbook/RunbookExecutePermission.js +67 -0
- package/build/dist/Server/Utils/Runbook/RunbookExecutePermission.js.map +1 -0
- package/build/dist/Server/Utils/SessionReplay/SessionReplayErasureTombstone.js +98 -0
- package/build/dist/Server/Utils/SessionReplay/SessionReplayErasureTombstone.js.map +1 -0
- package/build/dist/Server/Utils/SessionReplay/SessionReplayGateCache.js +378 -0
- package/build/dist/Server/Utils/SessionReplay/SessionReplayGateCache.js.map +1 -0
- package/build/dist/Server/Utils/SessionReplay/SessionReplayGateCacheStore.js +137 -0
- package/build/dist/Server/Utils/SessionReplay/SessionReplayGateCacheStore.js.map +1 -0
- package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js +998 -0
- package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js.map +1 -0
- package/build/dist/Server/Utils/SessionReplay/SessionReplayRetention.js +59 -0
- package/build/dist/Server/Utils/SessionReplay/SessionReplayRetention.js.map +1 -0
- package/build/dist/Server/Utils/SessionReplay/SessionReplayTargeting.js +98 -0
- package/build/dist/Server/Utils/SessionReplay/SessionReplayTargeting.js.map +1 -0
- package/build/dist/Server/Utils/SessionReplay/SessionReplayUsage.js +69 -0
- package/build/dist/Server/Utils/SessionReplay/SessionReplayUsage.js.map +1 -0
- package/build/dist/Server/Utils/StartServer.js +40 -3
- package/build/dist/Server/Utils/StartServer.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/AppMetrics.js +26 -0
- package/build/dist/Server/Utils/Telemetry/AppMetrics.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/TelemetryFanInWriter.js +27 -6
- package/build/dist/Server/Utils/Telemetry/TelemetryFanInWriter.js.map +1 -1
- package/build/dist/Types/AI/AIRunStatus.js +17 -5
- package/build/dist/Types/AI/AIRunStatus.js.map +1 -1
- package/build/dist/Types/AI/AIRunType.js +18 -0
- package/build/dist/Types/AI/AIRunType.js.map +1 -1
- package/build/dist/Types/AI/FixVerificationStatus.js +22 -0
- package/build/dist/Types/AI/FixVerificationStatus.js.map +1 -0
- package/build/dist/Types/AnalyticsDatabase/AnalyticsTableName.js +16 -0
- package/build/dist/Types/AnalyticsDatabase/AnalyticsTableName.js.map +1 -1
- package/build/dist/Types/AutoRemediation/AiRemediationCommandPlan.js +192 -0
- package/build/dist/Types/AutoRemediation/AiRemediationCommandPlan.js.map +1 -0
- package/build/dist/Types/AutoRemediation/AutoRemediationExecutionMode.js +18 -0
- package/build/dist/Types/AutoRemediation/AutoRemediationExecutionMode.js.map +1 -0
- package/build/dist/Types/AutoRemediation/AutoRemediationSuggestionStatus.js +31 -0
- package/build/dist/Types/AutoRemediation/AutoRemediationSuggestionStatus.js.map +1 -0
- package/build/dist/Types/AutoRemediation/AutoRemediationSuggestionType.js +18 -0
- package/build/dist/Types/AutoRemediation/AutoRemediationSuggestionType.js.map +1 -0
- package/build/dist/Types/AutoRemediation/AutoRemediationTriggerEntity.js +12 -0
- package/build/dist/Types/AutoRemediation/AutoRemediationTriggerEntity.js.map +1 -0
- package/build/dist/Types/AutoRemediation/AutoRemediationVerificationStatus.js +22 -0
- package/build/dist/Types/AutoRemediation/AutoRemediationVerificationStatus.js.map +1 -0
- package/build/dist/Types/CustomField/CustomFieldDropdownOption.js +110 -0
- package/build/dist/Types/CustomField/CustomFieldDropdownOption.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardComponentType.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponentType.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js +4 -0
- package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardClockComponent.js +19 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardClockComponent.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardHtmlComponent.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardHtmlComponent.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardTemplates.js +487 -0
- package/build/dist/Types/Dashboard/DashboardTemplates.js.map +1 -1
- package/build/dist/Types/Date.js +20 -4
- package/build/dist/Types/Date.js.map +1 -1
- package/build/dist/Types/Email/EmailTemplateType.js +2 -0
- package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
- package/build/dist/Types/Kubernetes/KubernetesRightSizing.js +229 -0
- package/build/dist/Types/Kubernetes/KubernetesRightSizing.js.map +1 -0
- package/build/dist/Types/MeteredPlan/ProductType.js +1 -0
- package/build/dist/Types/MeteredPlan/ProductType.js.map +1 -1
- package/build/dist/Types/Monitor/KubernetesAlertTemplates.js +192 -0
- package/build/dist/Types/Monitor/KubernetesAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStep.js +6 -1
- package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepMetricMonitor.js +43 -2
- package/build/dist/Types/Monitor/MonitorStepMetricMonitor.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorSteps.js +5 -0
- package/build/dist/Types/Monitor/MonitorSteps.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorSummarySnapshot.js +13 -0
- package/build/dist/Types/Monitor/MonitorSummarySnapshot.js.map +1 -0
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js +326 -0
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js.map +1 -0
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.js +110 -0
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.js.map +1 -0
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js +59 -0
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js.map +1 -0
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js +491 -0
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js.map +1 -0
- package/build/dist/Types/Monitor/RumAlertTemplates.js +297 -0
- package/build/dist/Types/Monitor/RumAlertTemplates.js.map +1 -0
- package/build/dist/Types/Permission.js +224 -24
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/Recommendation/RecommendationType.js +21 -0
- package/build/dist/Types/Recommendation/RecommendationType.js.map +1 -0
- package/build/dist/Types/Rum/SessionReplay.js +155 -0
- package/build/dist/Types/Rum/SessionReplay.js.map +1 -0
- package/build/dist/Types/Rum/SessionReplayCaptureTrigger.js +26 -0
- package/build/dist/Types/Rum/SessionReplayCaptureTrigger.js.map +1 -0
- package/build/dist/Types/Rum/SessionReplayConsentMode.js +27 -0
- package/build/dist/Types/Rum/SessionReplayConsentMode.js.map +1 -0
- package/build/dist/Types/Rum/SessionReplayMaskingMode.js +79 -0
- package/build/dist/Types/Rum/SessionReplayMaskingMode.js.map +1 -0
- package/build/dist/Types/Rum/SessionReplayTriggerReason.js +28 -0
- package/build/dist/Types/Rum/SessionReplayTriggerReason.js.map +1 -0
- package/build/dist/Types/Runbook/RunbookCredentialType.js +7 -0
- package/build/dist/Types/Runbook/RunbookCredentialType.js.map +1 -0
- package/build/dist/Types/Runbook/RunbookExecutionDeadline.js +93 -0
- package/build/dist/Types/Runbook/RunbookExecutionDeadline.js.map +1 -0
- package/build/dist/Types/Runbook/RunbookStep.js +20 -1
- package/build/dist/Types/Runbook/RunbookStep.js.map +1 -1
- package/build/dist/Types/Runbook/RunbookStepTimeout.js +142 -0
- package/build/dist/Types/Runbook/RunbookStepTimeout.js.map +1 -0
- package/build/dist/Types/Runbook/RunbookStepType.js +24 -0
- package/build/dist/Types/Runbook/RunbookStepType.js.map +1 -1
- package/build/dist/Types/Runbook/RunnerJobOrigin.js +21 -0
- package/build/dist/Types/Runbook/RunnerJobOrigin.js.map +1 -0
- package/build/dist/Types/Runbook/RunnerJobStatus.js +22 -0
- package/build/dist/Types/Runbook/RunnerJobStatus.js.map +1 -0
- package/build/dist/Types/StatusPage/StatusPageReport.js +22 -0
- package/build/dist/Types/StatusPage/StatusPageReport.js.map +1 -0
- package/build/dist/Types/Telemetry/DropFilterSampling.js +75 -0
- package/build/dist/Types/Telemetry/DropFilterSampling.js.map +1 -0
- package/build/dist/Types/Telemetry/TelemetryRetentionConfig.js.map +1 -1
- package/build/dist/Types/Text.js +29 -0
- package/build/dist/Types/Text.js.map +1 -1
- package/build/dist/UI/Components/AI/GenerateFromAIModal.js +1 -2
- package/build/dist/UI/Components/AI/GenerateFromAIModal.js.map +1 -1
- package/build/dist/UI/Components/Accordion/Accordion.js +9 -2
- package/build/dist/UI/Components/Accordion/Accordion.js.map +1 -1
- package/build/dist/UI/Components/AutocompleteTextInput/AutocompleteTextInput.js +143 -28
- package/build/dist/UI/Components/AutocompleteTextInput/AutocompleteTextInput.js.map +1 -1
- package/build/dist/UI/Components/BulkUpdate/BulkLabelActions.js +83 -10
- package/build/dist/UI/Components/BulkUpdate/BulkLabelActions.js.map +1 -1
- package/build/dist/UI/Components/BulkUpdate/BulkOwnerActions.js +11 -0
- package/build/dist/UI/Components/BulkUpdate/BulkOwnerActions.js.map +1 -1
- package/build/dist/UI/Components/CodeEditor/CodeEditor.js +27 -14
- package/build/dist/UI/Components/CodeEditor/CodeEditor.js.map +1 -1
- package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js +11 -13
- package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js.map +1 -1
- package/build/dist/UI/Components/CustomFields/DropdownOptionsInput.js +76 -45
- package/build/dist/UI/Components/CustomFields/DropdownOptionsInput.js.map +1 -1
- package/build/dist/UI/Components/Date/RangeStartAndEndDateView.js +1 -1
- package/build/dist/UI/Components/Date/RangeStartAndEndDateView.js.map +1 -1
- package/build/dist/UI/Components/Detail/Detail.js +3 -8
- package/build/dist/UI/Components/Detail/Detail.js.map +1 -1
- package/build/dist/UI/Components/Dropdown/Dropdown.js +2 -5
- package/build/dist/UI/Components/Dropdown/Dropdown.js.map +1 -1
- package/build/dist/UI/Components/Dropdown/DropdownMenuZIndex.js +7 -0
- package/build/dist/UI/Components/Dropdown/DropdownMenuZIndex.js.map +1 -0
- package/build/dist/UI/Components/Dropdown/DropdownValueBadge.js +32 -0
- package/build/dist/UI/Components/Dropdown/DropdownValueBadge.js.map +1 -0
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js +2 -20
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
- package/build/dist/UI/Components/Error/PageError.js +1 -3
- package/build/dist/UI/Components/Error/PageError.js.map +1 -1
- package/build/dist/UI/Components/ErrorBoundary.js +145 -11
- package/build/dist/UI/Components/ErrorBoundary.js.map +1 -1
- package/build/dist/UI/Components/Filters/OperatorSelector.js +210 -20
- package/build/dist/UI/Components/Filters/OperatorSelector.js.map +1 -1
- package/build/dist/UI/Components/Forms/Fields/ColorPicker.js +26 -10
- package/build/dist/UI/Components/Forms/Fields/ColorPicker.js.map +1 -1
- package/build/dist/UI/Components/Forms/Fields/IconPicker.js +28 -13
- package/build/dist/UI/Components/Forms/Fields/IconPicker.js.map +1 -1
- package/build/dist/UI/Components/Forms/Validation.js +9 -5
- package/build/dist/UI/Components/Forms/Validation.js.map +1 -1
- package/build/dist/UI/Components/InfoCard/InfoCard.js +28 -1
- package/build/dist/UI/Components/InfoCard/InfoCard.js.map +1 -1
- package/build/dist/UI/Components/List/List.js +1 -1
- package/build/dist/UI/Components/List/List.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogTimeRangePicker.js +13 -2
- package/build/dist/UI/Components/LogsViewer/components/LogTimeRangePicker.js.map +1 -1
- package/build/dist/UI/Components/Modal/Modal.js +4 -32
- package/build/dist/UI/Components/Modal/Modal.js.map +1 -1
- package/build/dist/UI/Components/ModelFormModal/ModelFormModal.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +69 -33
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/ColumnCustomizationModal.js +73 -32
- package/build/dist/UI/Components/ModelTable/ColumnCustomizationModal.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/CustomFieldColumns.js +21 -19
- package/build/dist/UI/Components/ModelTable/CustomFieldColumns.js.map +1 -1
- package/build/dist/UI/Components/Pagination/Pagination.js +14 -3
- package/build/dist/UI/Components/Pagination/Pagination.js.map +1 -1
- package/build/dist/UI/Components/Runbook/StepTimeoutInput.js +101 -0
- package/build/dist/UI/Components/Runbook/StepTimeoutInput.js.map +1 -0
- package/build/dist/UI/Components/StatusPage/ResourceGroupSection.js +73 -0
- package/build/dist/UI/Components/StatusPage/ResourceGroupSection.js.map +1 -0
- package/build/dist/UI/Components/Table/Table.js +1 -1
- package/build/dist/UI/Components/Table/Table.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.js +13 -2
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.js.map +1 -1
- package/build/dist/UI/Types/UseAnchoredFieldPopup.js +197 -0
- package/build/dist/UI/Types/UseAnchoredFieldPopup.js.map +1 -0
- package/build/dist/UI/Utils/Dropdown.js +18 -0
- package/build/dist/UI/Utils/Dropdown.js.map +1 -1
- package/build/dist/UI/Utils/DropdownAlignment.js +98 -0
- package/build/dist/UI/Utils/DropdownAlignment.js.map +1 -0
- package/build/dist/UI/Utils/TableFilterUrlState.js +48 -15
- package/build/dist/UI/Utils/TableFilterUrlState.js.map +1 -1
- package/build/dist/UI/Utils/Timezone.js +13 -2
- package/build/dist/UI/Utils/Timezone.js.map +1 -1
- package/build/dist/UI/Utils/UseClockTick.js +41 -0
- package/build/dist/UI/Utils/UseClockTick.js.map +1 -0
- package/build/dist/Utils/API.js +39 -2
- package/build/dist/Utils/API.js.map +1 -1
- package/build/dist/Utils/AiRemediation/CommandPolicy.js +303 -0
- package/build/dist/Utils/AiRemediation/CommandPolicy.js.map +1 -0
- package/build/dist/Utils/Dashboard/ClockWidgetFormat.js +232 -0
- package/build/dist/Utils/Dashboard/ClockWidgetFormat.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardClockComponent.js +146 -0
- package/build/dist/Utils/Dashboard/Components/DashboardClockComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardHtmlComponent.js +133 -0
- package/build/dist/Utils/Dashboard/Components/DashboardHtmlComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardValueComponent.js +10 -1
- package/build/dist/Utils/Dashboard/Components/DashboardValueComponent.js.map +1 -1
- package/build/dist/Utils/Dashboard/Components/Index.js +8 -0
- package/build/dist/Utils/Dashboard/Components/Index.js.map +1 -1
- package/build/dist/Utils/Dashboard/HtmlWidgetDocument.js +198 -0
- package/build/dist/Utils/Dashboard/HtmlWidgetDocument.js.map +1 -0
- package/build/dist/Utils/Dashboard/ValueWidgetLayout.js +276 -0
- package/build/dist/Utils/Dashboard/ValueWidgetLayout.js.map +1 -0
- package/build/dist/Utils/Metrics/MetricSeriesScope.js +203 -0
- package/build/dist/Utils/Metrics/MetricSeriesScope.js.map +1 -0
- package/build/dist/Utils/Monitor/MonitorSummaryProbeUtil.js +97 -0
- package/build/dist/Utils/Monitor/MonitorSummaryProbeUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/MonitorSummarySnapshotUtil.js +382 -0
- package/build/dist/Utils/Monitor/MonitorSummarySnapshotUtil.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/ScanTargetUtil.js +330 -0
- package/build/dist/Utils/NetworkDiscovery/ScanTargetUtil.js.map +1 -0
- package/build/dist/Utils/NetworkSite/CidrMatchUtil.js +13 -7
- package/build/dist/Utils/NetworkSite/CidrMatchUtil.js.map +1 -1
- package/build/dist/Utils/Rules/RulePatternMatchUtil.js +87 -0
- package/build/dist/Utils/Rules/RulePatternMatchUtil.js.map +1 -0
- package/build/dist/Utils/Rum/ChunkMath.js +147 -0
- package/build/dist/Utils/Rum/ChunkMath.js.map +1 -0
- package/build/dist/Utils/Rum/Masking.js +143 -0
- package/build/dist/Utils/Rum/Masking.js.map +1 -0
- package/build/dist/Utils/Rum/SessionIdentity.js +161 -0
- package/build/dist/Utils/Rum/SessionIdentity.js.map +1 -0
- package/build/dist/Utils/Rum/SessionSampling.js +91 -0
- package/build/dist/Utils/Rum/SessionSampling.js.map +1 -0
- package/build/dist/Utils/Rum/UrlScrubber.js +144 -0
- package/build/dist/Utils/Rum/UrlScrubber.js.map +1 -0
- package/build/dist/Utils/Schema/ModelSchema.js +28 -3
- package/build/dist/Utils/Schema/ModelSchema.js.map +1 -1
- package/build/dist/Utils/StatusPage/GroupNestingLayout.js +280 -0
- package/build/dist/Utils/StatusPage/GroupNestingLayout.js.map +1 -0
- package/build/dist/Utils/StatusPage/GroupTree.js +214 -0
- package/build/dist/Utils/StatusPage/GroupTree.js.map +1 -0
- package/build/dist/Utils/StatusPage/Report.js +194 -0
- package/build/dist/Utils/StatusPage/Report.js.map +1 -0
- package/build/dist/Utils/StatusPage/ResourceUptime.js +60 -16
- package/build/dist/Utils/StatusPage/ResourceUptime.js.map +1 -1
- package/build/dist/Utils/ValueFormatter.js +239 -46
- package/build/dist/Utils/ValueFormatter.js.map +1 -1
- package/jest.config.json +3 -0
- package/package.json +1 -1
- package/tsconfig.json +19 -1
- package/Server/Services/RunbookAgentService.ts +0 -93
- package/build/dist/Models/DatabaseModels/RunbookAgent.js.map +0 -1
- package/build/dist/Models/DatabaseModels/RunbookAgentJob.js.map +0 -1
- package/build/dist/Models/DatabaseModels/RunbookAgentOwnerTeam.js.map +0 -1
- package/build/dist/Models/DatabaseModels/RunbookAgentOwnerUser.js.map +0 -1
- package/build/dist/Server/Services/RunbookAgentJobService.js.map +0 -1
- package/build/dist/Server/Services/RunbookAgentOwnerTeamService.js.map +0 -1
- package/build/dist/Server/Services/RunbookAgentOwnerUserService.js.map +0 -1
- package/build/dist/Server/Services/RunbookAgentService.js +0 -91
- package/build/dist/Server/Services/RunbookAgentService.js.map +0 -1
- package/build/dist/Types/Runbook/RunbookAgentJobStatus.js +0 -22
- package/build/dist/Types/Runbook/RunbookAgentJobStatus.js.map +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import UserMiddleware from "../Middleware/UserAuthorization";
|
|
2
|
-
import Express from "../Utils/Express";
|
|
2
|
+
import Express, { getClientIp, } from "../Utils/Express";
|
|
3
3
|
import Response from "../Utils/Response";
|
|
4
4
|
import BadDataException from "../../Types/Exception/BadDataException";
|
|
5
5
|
import CommonAPI from "./CommonAPI";
|
|
@@ -14,10 +14,24 @@ import PprofEncoder from "../Utils/Profile/PprofEncoder";
|
|
|
14
14
|
import ProfileService from "../Services/ProfileService";
|
|
15
15
|
import ProfileSampleService from "../Services/ProfileSampleService";
|
|
16
16
|
import SortOrder from "../../Types/BaseDatabase/SortOrder";
|
|
17
|
-
import Permission from "../../Types/Permission";
|
|
17
|
+
import Permission, { PermissionHelper, } from "../../Types/Permission";
|
|
18
|
+
import DatabaseCommonInteractionPropsUtil, { PermissionType, } from "../../Types/BaseDatabase/DatabaseCommonInteractionPropsUtil";
|
|
19
|
+
import NotAuthorizedException from "../../Types/Exception/NotAuthorizedException";
|
|
20
|
+
import PaymentRequiredException from "../../Types/Exception/PaymentRequiredException";
|
|
21
|
+
import PermissionScope from "../../Types/Database/AccessControl/PermissionScope";
|
|
22
|
+
import SubscriptionPlan from "../../Types/Billing/SubscriptionPlan";
|
|
23
|
+
import { IsBillingEnabled, getAllEnvVars } from "../EnvironmentConfig";
|
|
24
|
+
import RumSession from "../../Models/AnalyticsModels/RumSession";
|
|
18
25
|
import ObjectID from "../../Types/ObjectID";
|
|
19
26
|
import OneUptimeDate from "../../Types/Date";
|
|
20
27
|
import ResourceFacetResolver from "../Utils/Telemetry/ResourceFacetResolver";
|
|
28
|
+
import RumApplicationService from "../Services/RumApplicationService";
|
|
29
|
+
import ProjectService from "../Services/ProjectService";
|
|
30
|
+
import SessionReplayTargeting from "../Utils/SessionReplay/SessionReplayTargeting";
|
|
31
|
+
import SessionReplayUsage from "../Utils/SessionReplay/SessionReplayUsage";
|
|
32
|
+
import RumSessionReplayViewService from "../Services/RumSessionReplayViewService";
|
|
33
|
+
import SessionReplayReadService, { DEFAULT_SESSION_REPLAY_LIST_LIMIT, MAX_SESSION_REPLAY_FOR_EXCEPTION_LIMIT, } from "../Utils/SessionReplay/SessionReplayReadService";
|
|
34
|
+
import { DEFAULT_SESSION_REPLAY_MAX_BYTES_PER_PROJECT_PER_DAY, MAX_SESSION_REPLAY_CHUNKS_PER_READ, MAX_SESSION_REPLAY_READ_BYTES, } from "../../Types/Rum/SessionReplay";
|
|
21
35
|
const router = Express.getRouter();
|
|
22
36
|
const createTelemetryReadAccessGuard = (signalReadPermission) => {
|
|
23
37
|
return [
|
|
@@ -377,6 +391,37 @@ function parseTraceFilterBody(body) {
|
|
|
377
391
|
}
|
|
378
392
|
return Object.fromEntries(entries);
|
|
379
393
|
};
|
|
394
|
+
/*
|
|
395
|
+
* Exact attribute predicates accept a single value or a list of values
|
|
396
|
+
* (`IN (...)`) — a multi-select dashboard variable resolves to the latter.
|
|
397
|
+
* Non-string array entries are dropped, and an array left empty by that
|
|
398
|
+
* filtering is dropped entirely so it cannot narrow to nothing.
|
|
399
|
+
*/
|
|
400
|
+
const attributeFilterRecord = () => {
|
|
401
|
+
const raw = body["attributes"];
|
|
402
|
+
if (!raw || typeof raw !== "object" || Array.isArray(raw)) {
|
|
403
|
+
return undefined;
|
|
404
|
+
}
|
|
405
|
+
const filters = {};
|
|
406
|
+
for (const [key, value] of Object.entries(raw)) {
|
|
407
|
+
if (typeof value === "string") {
|
|
408
|
+
filters[key] = value;
|
|
409
|
+
continue;
|
|
410
|
+
}
|
|
411
|
+
if (Array.isArray(value)) {
|
|
412
|
+
const values = value.filter((v) => {
|
|
413
|
+
return typeof v === "string";
|
|
414
|
+
});
|
|
415
|
+
if (values.length > 0) {
|
|
416
|
+
filters[key] = values;
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
if (Object.keys(filters).length === 0) {
|
|
421
|
+
return undefined;
|
|
422
|
+
}
|
|
423
|
+
return filters;
|
|
424
|
+
};
|
|
380
425
|
return {
|
|
381
426
|
serviceIds,
|
|
382
427
|
entityKeys: stringArray("entityKeys"),
|
|
@@ -416,7 +461,7 @@ function parseTraceFilterBody(body) {
|
|
|
416
461
|
? body["exactDurationNano"]
|
|
417
462
|
: undefined,
|
|
418
463
|
rootOnly: body["rootOnly"] === undefined ? undefined : Boolean(body["rootOnly"]),
|
|
419
|
-
attributes:
|
|
464
|
+
attributes: attributeFilterRecord(),
|
|
420
465
|
attributeSearches: stringRecord("attributeSearches"),
|
|
421
466
|
};
|
|
422
467
|
}
|
|
@@ -1648,5 +1693,897 @@ router.post("/telemetry/profiles/breakdown", ...requireProfileReadAccess, async
|
|
|
1648
1693
|
next(err);
|
|
1649
1694
|
}
|
|
1650
1695
|
});
|
|
1696
|
+
/*
|
|
1697
|
+
* ---------------------------------------------------------------------
|
|
1698
|
+
* Session replay playback
|
|
1699
|
+
* ---------------------------------------------------------------------
|
|
1700
|
+
*
|
|
1701
|
+
* These five routes are the ONLY reader of RumSessionV1 / RumSessionChunkV1:
|
|
1702
|
+
* both analytics models deliberately omit `crudApiPath`, so there is no
|
|
1703
|
+
* generic CRUD surface for them and ModelPermission is NEVER invoked on
|
|
1704
|
+
* this path.
|
|
1705
|
+
*
|
|
1706
|
+
* That has a consequence which is easy to get wrong and expensive to get
|
|
1707
|
+
* wrong: the `payload` column's own read ACL and the narrower ACL on
|
|
1708
|
+
* `identifiedUserLabel` are, on their own, decorative here. Nothing
|
|
1709
|
+
* enforces them unless this file does. Hence a dedicated guard rather
|
|
1710
|
+
* than createTelemetryReadAccessGuard above, whose OR-list already
|
|
1711
|
+
* contains ProjectMember, Viewer and TelemetryViewer - reusing it would
|
|
1712
|
+
* let every read-only member of a project watch recordings of that
|
|
1713
|
+
* project's real end users, which is precisely the outcome the design
|
|
1714
|
+
* rejected.
|
|
1715
|
+
*
|
|
1716
|
+
* Declared before the route registrations below for the same
|
|
1717
|
+
* temporal-dead-zone reason the guards at the top of this file are.
|
|
1718
|
+
*/
|
|
1719
|
+
/*
|
|
1720
|
+
* Listing sessions. Mirrors RumSession's table-level read ACL exactly:
|
|
1721
|
+
* knowing WHICH sessions errored is triage.
|
|
1722
|
+
*/
|
|
1723
|
+
const requireSessionReplayListAccess = [
|
|
1724
|
+
UserMiddleware.getUserMiddleware,
|
|
1725
|
+
UserMiddleware.requireUserAuthentication,
|
|
1726
|
+
UserMiddleware.requirePermission({
|
|
1727
|
+
permissions: [
|
|
1728
|
+
Permission.ProjectOwner,
|
|
1729
|
+
Permission.ProjectAdmin,
|
|
1730
|
+
Permission.TelemetryAdmin,
|
|
1731
|
+
Permission.ReadRumSessionReplay,
|
|
1732
|
+
],
|
|
1733
|
+
}),
|
|
1734
|
+
];
|
|
1735
|
+
/*
|
|
1736
|
+
* Watching a session. Deliberately a strict subset of the list guard's
|
|
1737
|
+
* audience: reading a recording of a real person's screen is a further
|
|
1738
|
+
* disclosure over knowing that their session went wrong. Mirrors the
|
|
1739
|
+
* `payload` column ACL on RumSessionChunk.
|
|
1740
|
+
*/
|
|
1741
|
+
const requireSessionReplayPayloadAccess = [
|
|
1742
|
+
UserMiddleware.getUserMiddleware,
|
|
1743
|
+
UserMiddleware.requireUserAuthentication,
|
|
1744
|
+
UserMiddleware.requirePermission({
|
|
1745
|
+
permissions: [
|
|
1746
|
+
Permission.ProjectOwner,
|
|
1747
|
+
Permission.ProjectAdmin,
|
|
1748
|
+
Permission.TelemetryAdmin,
|
|
1749
|
+
Permission.ReadRumSessionReplayPayload,
|
|
1750
|
+
],
|
|
1751
|
+
}),
|
|
1752
|
+
];
|
|
1753
|
+
/* The permission list each guard above enforces, reused for label scope. */
|
|
1754
|
+
const SESSION_REPLAY_LIST_PERMISSIONS = [
|
|
1755
|
+
Permission.ProjectOwner,
|
|
1756
|
+
Permission.ProjectAdmin,
|
|
1757
|
+
Permission.TelemetryAdmin,
|
|
1758
|
+
Permission.ReadRumSessionReplay,
|
|
1759
|
+
];
|
|
1760
|
+
const SESSION_REPLAY_PAYLOAD_PERMISSIONS = [
|
|
1761
|
+
Permission.ProjectOwner,
|
|
1762
|
+
Permission.ProjectAdmin,
|
|
1763
|
+
Permission.TelemetryAdmin,
|
|
1764
|
+
Permission.ReadRumSessionReplayPayload,
|
|
1765
|
+
];
|
|
1766
|
+
/*
|
|
1767
|
+
* The raw end-user identifier carries its own narrower ACL on the model
|
|
1768
|
+
* (no TelemetryAdmin): knowing that *a* user had a bad session is triage,
|
|
1769
|
+
* knowing *which named person* is a further disclosure again.
|
|
1770
|
+
*/
|
|
1771
|
+
const SESSION_REPLAY_IDENTITY_PERMISSIONS = [
|
|
1772
|
+
Permission.ProjectOwner,
|
|
1773
|
+
Permission.ProjectAdmin,
|
|
1774
|
+
Permission.ReadRumSessionReplayPayload,
|
|
1775
|
+
];
|
|
1776
|
+
const getSessionReplayLabelScope = (databaseProps, permissions) => {
|
|
1777
|
+
if (databaseProps.isRoot || databaseProps.isMasterAdmin) {
|
|
1778
|
+
return { isUnrestricted: true };
|
|
1779
|
+
}
|
|
1780
|
+
const userPermissions = DatabaseCommonInteractionPropsUtil.getUserPermissions(databaseProps, PermissionType.Allow);
|
|
1781
|
+
const unscopedPermissions = PermissionHelper.getNonAccessControlPermissions(userPermissions);
|
|
1782
|
+
if (PermissionHelper.doesPermissionsIntersect(permissions, unscopedPermissions)) {
|
|
1783
|
+
return { isUnrestricted: true };
|
|
1784
|
+
}
|
|
1785
|
+
const scopedPermissions = PermissionHelper.getAccessControlPermissions(userPermissions);
|
|
1786
|
+
const labelIds = [];
|
|
1787
|
+
for (const permission of permissions) {
|
|
1788
|
+
for (const scopedPermission of scopedPermissions) {
|
|
1789
|
+
if (scopedPermission.permission === permission &&
|
|
1790
|
+
scopedPermission.labelIds.length > 0) {
|
|
1791
|
+
labelIds.push(...scopedPermission.labelIds);
|
|
1792
|
+
}
|
|
1793
|
+
}
|
|
1794
|
+
}
|
|
1795
|
+
if (labelIds.length > 0) {
|
|
1796
|
+
return { isUnrestricted: false, labelIds: labelIds };
|
|
1797
|
+
}
|
|
1798
|
+
/*
|
|
1799
|
+
* Neither an unscoped grant nor a label-scoped one, yet the route guard
|
|
1800
|
+
* let the caller in - so the grant they hold carries a scope this
|
|
1801
|
+
* bespoke path does not implement. PermissionScope.Owned is the real
|
|
1802
|
+
* case: both PermissionHelper filters exclude Owned rows on purpose
|
|
1803
|
+
* because the ORM enforces them through
|
|
1804
|
+
* OwnedScopePermission.addOwnedScopeToQuery, and there is no such step
|
|
1805
|
+
* here. Refusing is the only safe answer; returning "no labels" would
|
|
1806
|
+
* hand an administrator's deliberately narrowed reviewer the whole
|
|
1807
|
+
* project.
|
|
1808
|
+
*/
|
|
1809
|
+
const hasOwnedScopedGrant = userPermissions.some((userPermission) => {
|
|
1810
|
+
return (userPermission.scope === PermissionScope.Owned &&
|
|
1811
|
+
permissions.includes(userPermission.permission));
|
|
1812
|
+
});
|
|
1813
|
+
if (hasOwnedScopedGrant) {
|
|
1814
|
+
throw new NotAuthorizedException("Owned-scoped session replay permissions are not supported. Ask an administrator to scope this permission to labels instead.");
|
|
1815
|
+
}
|
|
1816
|
+
/*
|
|
1817
|
+
* No applicable grant at all. This is reachable even behind the route
|
|
1818
|
+
* guard, because the guard matches on permission NAME across every
|
|
1819
|
+
* tenant permission row while getUserPermissions drops block rows. It
|
|
1820
|
+
* means the caller reaches no application, not every application.
|
|
1821
|
+
*/
|
|
1822
|
+
return { isUnrestricted: false, labelIds: [] };
|
|
1823
|
+
};
|
|
1824
|
+
/*
|
|
1825
|
+
* Ceiling on the RUM applications scanned when resolving a label-scoped
|
|
1826
|
+
* caller's reachable set. RUM is keyed by application (service.name), not
|
|
1827
|
+
* by end-user device, so a project has tens of these, not millions.
|
|
1828
|
+
*/
|
|
1829
|
+
const MAX_RUM_APPLICATIONS_SCANNED = 1000;
|
|
1830
|
+
const assertSessionReplayPlan = (databaseProps) => {
|
|
1831
|
+
if (!IsBillingEnabled || !databaseProps.currentPlan) {
|
|
1832
|
+
return;
|
|
1833
|
+
}
|
|
1834
|
+
const requiredPlan = new RumSession().getReadBillingPlan();
|
|
1835
|
+
if (!requiredPlan) {
|
|
1836
|
+
return;
|
|
1837
|
+
}
|
|
1838
|
+
if (!SubscriptionPlan.isFeatureAccessibleOnCurrentPlan(requiredPlan, databaseProps.currentPlan, getAllEnvVars())) {
|
|
1839
|
+
throw new PaymentRequiredException(`Please upgrade your plan to ${requiredPlan} to access session replay.`);
|
|
1840
|
+
}
|
|
1841
|
+
};
|
|
1842
|
+
const getRumApplicationLabelIds = (application) => {
|
|
1843
|
+
return (application.labels || [])
|
|
1844
|
+
.filter((label) => {
|
|
1845
|
+
return Boolean(label.id);
|
|
1846
|
+
})
|
|
1847
|
+
.map((label) => {
|
|
1848
|
+
return label.id.toString();
|
|
1849
|
+
});
|
|
1850
|
+
};
|
|
1851
|
+
const isApplicationInSessionReplayScope = (data) => {
|
|
1852
|
+
if (data.scope.isUnrestricted) {
|
|
1853
|
+
return true;
|
|
1854
|
+
}
|
|
1855
|
+
const applicationLabelIds = getRumApplicationLabelIds(data.application);
|
|
1856
|
+
return data.scope.labelIds.some((labelId) => {
|
|
1857
|
+
return applicationLabelIds.includes(labelId.toString());
|
|
1858
|
+
});
|
|
1859
|
+
};
|
|
1860
|
+
const assertSessionReplayApplicationAccess = async (data) => {
|
|
1861
|
+
const scope = getSessionReplayLabelScope(data.databaseProps, data.permissions);
|
|
1862
|
+
const application = await RumApplicationService.findOneBy({
|
|
1863
|
+
query: {
|
|
1864
|
+
_id: data.rumApplicationId.toString(),
|
|
1865
|
+
projectId: data.projectId,
|
|
1866
|
+
},
|
|
1867
|
+
select: {
|
|
1868
|
+
_id: true,
|
|
1869
|
+
labels: {
|
|
1870
|
+
_id: true,
|
|
1871
|
+
},
|
|
1872
|
+
},
|
|
1873
|
+
props: {
|
|
1874
|
+
isRoot: true,
|
|
1875
|
+
},
|
|
1876
|
+
});
|
|
1877
|
+
/*
|
|
1878
|
+
* An application that does not exist in this project is refused the
|
|
1879
|
+
* same way an out-of-scope one is, so the endpoint cannot be used to
|
|
1880
|
+
* probe which application ids exist elsewhere.
|
|
1881
|
+
*/
|
|
1882
|
+
if (!application) {
|
|
1883
|
+
throw new NotAuthorizedException("You do not have access to session replays for this application.");
|
|
1884
|
+
}
|
|
1885
|
+
if (!isApplicationInSessionReplayScope({
|
|
1886
|
+
scope: scope,
|
|
1887
|
+
application: application,
|
|
1888
|
+
})) {
|
|
1889
|
+
throw new NotAuthorizedException("You do not have access to session replays for this application.");
|
|
1890
|
+
}
|
|
1891
|
+
return application;
|
|
1892
|
+
};
|
|
1893
|
+
const canReadIdentifiedUserLabel = (data) => {
|
|
1894
|
+
let scope;
|
|
1895
|
+
try {
|
|
1896
|
+
scope = getSessionReplayLabelScope(data.databaseProps, SESSION_REPLAY_IDENTITY_PERMISSIONS);
|
|
1897
|
+
}
|
|
1898
|
+
catch (_a) {
|
|
1899
|
+
/*
|
|
1900
|
+
* getSessionReplayLabelScope refuses a scope it cannot enforce. For
|
|
1901
|
+
* an optional column the right answer is to omit the column, not to
|
|
1902
|
+
* fail the whole listing the caller is otherwise entitled to.
|
|
1903
|
+
*/
|
|
1904
|
+
return false;
|
|
1905
|
+
}
|
|
1906
|
+
return isApplicationInSessionReplayScope({
|
|
1907
|
+
scope: scope,
|
|
1908
|
+
application: data.application,
|
|
1909
|
+
});
|
|
1910
|
+
};
|
|
1911
|
+
const resolveAccessibleRumApplicationIds = async (data) => {
|
|
1912
|
+
const scope = getSessionReplayLabelScope(data.databaseProps, data.permissions);
|
|
1913
|
+
if (scope.isUnrestricted) {
|
|
1914
|
+
return { applicationIds: null, isTruncated: false };
|
|
1915
|
+
}
|
|
1916
|
+
if (scope.labelIds.length === 0) {
|
|
1917
|
+
/* Reaches no application at all - not "reaches everything". */
|
|
1918
|
+
return { applicationIds: [], isTruncated: false };
|
|
1919
|
+
}
|
|
1920
|
+
const applications = await RumApplicationService.findBy({
|
|
1921
|
+
query: {
|
|
1922
|
+
projectId: data.projectId,
|
|
1923
|
+
},
|
|
1924
|
+
select: {
|
|
1925
|
+
_id: true,
|
|
1926
|
+
labels: {
|
|
1927
|
+
_id: true,
|
|
1928
|
+
},
|
|
1929
|
+
},
|
|
1930
|
+
/*
|
|
1931
|
+
* A deterministic sort so the page that is scanned is at least
|
|
1932
|
+
* stable between calls, and one row past the ceiling so hitting
|
|
1933
|
+
* it is detectable rather than indistinguishable from a project
|
|
1934
|
+
* that happens to have exactly that many applications.
|
|
1935
|
+
*/
|
|
1936
|
+
sort: {
|
|
1937
|
+
createdAt: SortOrder.Ascending,
|
|
1938
|
+
},
|
|
1939
|
+
skip: 0,
|
|
1940
|
+
limit: MAX_RUM_APPLICATIONS_SCANNED + 1,
|
|
1941
|
+
props: {
|
|
1942
|
+
isRoot: true,
|
|
1943
|
+
},
|
|
1944
|
+
});
|
|
1945
|
+
const isTruncated = applications.length > MAX_RUM_APPLICATIONS_SCANNED;
|
|
1946
|
+
const accessibleIds = [];
|
|
1947
|
+
for (const application of applications.slice(0, MAX_RUM_APPLICATIONS_SCANNED)) {
|
|
1948
|
+
if (isApplicationInSessionReplayScope({
|
|
1949
|
+
scope: scope,
|
|
1950
|
+
application: application,
|
|
1951
|
+
}) &&
|
|
1952
|
+
application.id) {
|
|
1953
|
+
accessibleIds.push(application.id);
|
|
1954
|
+
}
|
|
1955
|
+
}
|
|
1956
|
+
return { applicationIds: accessibleIds, isTruncated: isTruncated };
|
|
1957
|
+
};
|
|
1958
|
+
const resolveAuthorizedSession = async (data) => {
|
|
1959
|
+
const header = await SessionReplayReadService.getSessionHeader({
|
|
1960
|
+
projectId: data.projectId,
|
|
1961
|
+
sessionId: data.sessionId,
|
|
1962
|
+
});
|
|
1963
|
+
if (!header) {
|
|
1964
|
+
throw new BadDataException("Session replay not found.");
|
|
1965
|
+
}
|
|
1966
|
+
await assertSessionReplayApplicationAccess({
|
|
1967
|
+
projectId: data.projectId,
|
|
1968
|
+
rumApplicationId: new ObjectID(header.rumApplicationId),
|
|
1969
|
+
databaseProps: data.databaseProps,
|
|
1970
|
+
permissions: SESSION_REPLAY_PAYLOAD_PERMISSIONS,
|
|
1971
|
+
});
|
|
1972
|
+
return header;
|
|
1973
|
+
};
|
|
1974
|
+
const readObjectIdFromBody = (body, key) => {
|
|
1975
|
+
const value = body[key];
|
|
1976
|
+
if (typeof value !== "string" || value.length === 0) {
|
|
1977
|
+
throw new BadDataException(`${key} is required`);
|
|
1978
|
+
}
|
|
1979
|
+
if (!ObjectID.isValidUUID(value)) {
|
|
1980
|
+
throw new BadDataException(`${key} is not a valid id`);
|
|
1981
|
+
}
|
|
1982
|
+
return new ObjectID(value);
|
|
1983
|
+
};
|
|
1984
|
+
const readSessionIdFromBody = (body) => {
|
|
1985
|
+
const sessionId = body["sessionId"];
|
|
1986
|
+
if (typeof sessionId !== "string" || sessionId.length === 0) {
|
|
1987
|
+
throw new BadDataException("sessionId is required");
|
|
1988
|
+
}
|
|
1989
|
+
return sessionId;
|
|
1990
|
+
};
|
|
1991
|
+
const readStringArrayFromBody = (body, key) => {
|
|
1992
|
+
const value = body[key];
|
|
1993
|
+
if (!Array.isArray(value)) {
|
|
1994
|
+
return undefined;
|
|
1995
|
+
}
|
|
1996
|
+
const strings = value.filter((item) => {
|
|
1997
|
+
return typeof item === "string" && item.length > 0;
|
|
1998
|
+
});
|
|
1999
|
+
return strings.length > 0 ? strings : undefined;
|
|
2000
|
+
};
|
|
2001
|
+
// --- Session Replay List Endpoint ---
|
|
2002
|
+
router.post("/telemetry/rum/session-replay/list", ...requireSessionReplayListAccess, async (req, res, next) => {
|
|
2003
|
+
try {
|
|
2004
|
+
const databaseProps = await CommonAPI.getDatabaseCommonInteractionProps(req);
|
|
2005
|
+
if (!(databaseProps === null || databaseProps === void 0 ? void 0 : databaseProps.tenantId)) {
|
|
2006
|
+
return Response.sendErrorResponse(req, res, new BadDataException("Invalid Project ID"));
|
|
2007
|
+
}
|
|
2008
|
+
assertSessionReplayPlan(databaseProps);
|
|
2009
|
+
const projectId = databaseProps.tenantId;
|
|
2010
|
+
const body = req.body;
|
|
2011
|
+
const rumApplicationId = readObjectIdFromBody(body, "rumApplicationId");
|
|
2012
|
+
/*
|
|
2013
|
+
* The application id is caller-supplied here, which is safe only
|
|
2014
|
+
* because it is the thing being authorized rather than a lookup key
|
|
2015
|
+
* for something already authorized: a caller outside the label
|
|
2016
|
+
* scope is refused, and the query is tenant-pinned regardless.
|
|
2017
|
+
*/
|
|
2018
|
+
const application = await assertSessionReplayApplicationAccess({
|
|
2019
|
+
projectId: projectId,
|
|
2020
|
+
rumApplicationId: rumApplicationId,
|
|
2021
|
+
databaseProps: databaseProps,
|
|
2022
|
+
permissions: SESSION_REPLAY_LIST_PERMISSIONS,
|
|
2023
|
+
});
|
|
2024
|
+
const startTime = body["startTime"]
|
|
2025
|
+
? OneUptimeDate.fromString(body["startTime"])
|
|
2026
|
+
: OneUptimeDate.addRemoveDays(OneUptimeDate.getCurrentDate(), -7);
|
|
2027
|
+
const endTime = body["endTime"]
|
|
2028
|
+
? OneUptimeDate.fromString(body["endTime"])
|
|
2029
|
+
: OneUptimeDate.getCurrentDate();
|
|
2030
|
+
const rawFilters = body["filters"] || {};
|
|
2031
|
+
const filters = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, (typeof rawFilters["hasError"] === "boolean" && {
|
|
2032
|
+
hasError: rawFilters["hasError"],
|
|
2033
|
+
})), (typeof rawFilters["hasFrustration"] === "boolean" && {
|
|
2034
|
+
hasFrustration: rawFilters["hasFrustration"],
|
|
2035
|
+
})), (typeof rawFilters["isFinalized"] === "boolean" && {
|
|
2036
|
+
isFinalized: rawFilters["isFinalized"],
|
|
2037
|
+
})), (readStringArrayFromBody(rawFilters, "triggerReasons") && {
|
|
2038
|
+
triggerReasons: readStringArrayFromBody(rawFilters, "triggerReasons"),
|
|
2039
|
+
})), (readStringArrayFromBody(rawFilters, "browserNames") && {
|
|
2040
|
+
browserNames: readStringArrayFromBody(rawFilters, "browserNames"),
|
|
2041
|
+
})), (readStringArrayFromBody(rawFilters, "osNames") && {
|
|
2042
|
+
osNames: readStringArrayFromBody(rawFilters, "osNames"),
|
|
2043
|
+
})), (readStringArrayFromBody(rawFilters, "deviceTypes") && {
|
|
2044
|
+
deviceTypes: readStringArrayFromBody(rawFilters, "deviceTypes"),
|
|
2045
|
+
})), (readStringArrayFromBody(rawFilters, "countryCodes") && {
|
|
2046
|
+
countryCodes: readStringArrayFromBody(rawFilters, "countryCodes"),
|
|
2047
|
+
})), (typeof rawFilters["identifiedUserKey"] === "string" && {
|
|
2048
|
+
identifiedUserKey: rawFilters["identifiedUserKey"],
|
|
2049
|
+
})), (typeof rawFilters["route"] === "string" && {
|
|
2050
|
+
route: rawFilters["route"],
|
|
2051
|
+
})), (typeof rawFilters["minDurationMs"] === "number" && {
|
|
2052
|
+
minDurationMs: rawFilters["minDurationMs"],
|
|
2053
|
+
}));
|
|
2054
|
+
const rawCursor = body["cursor"]
|
|
2055
|
+
? body["cursor"]
|
|
2056
|
+
: undefined;
|
|
2057
|
+
const cursor = rawCursor &&
|
|
2058
|
+
typeof rawCursor["startTimeUnixMs"] === "number" &&
|
|
2059
|
+
typeof rawCursor["sessionId"] === "string"
|
|
2060
|
+
? {
|
|
2061
|
+
startTimeUnixMs: rawCursor["startTimeUnixMs"],
|
|
2062
|
+
sessionId: rawCursor["sessionId"],
|
|
2063
|
+
}
|
|
2064
|
+
: undefined;
|
|
2065
|
+
/*
|
|
2066
|
+
* The narrower identity ACL is enforced by simply not naming the
|
|
2067
|
+
* column in the SELECT. There is no ModelPermission on this path to
|
|
2068
|
+
* strip it after the fact. Decided against the application already
|
|
2069
|
+
* loaded by the access check, so a caller whose identity grant is
|
|
2070
|
+
* label-scoped elsewhere does not get named end users here.
|
|
2071
|
+
*/
|
|
2072
|
+
const includeIdentifiedUserLabel = canReadIdentifiedUserLabel({
|
|
2073
|
+
databaseProps: databaseProps,
|
|
2074
|
+
application: application,
|
|
2075
|
+
});
|
|
2076
|
+
const result = await SessionReplayReadService.listSessions(Object.assign(Object.assign({ projectId: projectId, rumApplicationId: rumApplicationId, startTime: startTime, endTime: endTime, filters: filters, limit: typeof body["limit"] === "number"
|
|
2077
|
+
? body["limit"]
|
|
2078
|
+
: DEFAULT_SESSION_REPLAY_LIST_LIMIT }, (cursor !== undefined && { cursor })), { includeIdentifiedUserLabel: includeIdentifiedUserLabel }));
|
|
2079
|
+
return Response.sendJsonObjectResponse(req, res, {
|
|
2080
|
+
sessions: result.sessions,
|
|
2081
|
+
nextCursor: result.nextCursor,
|
|
2082
|
+
});
|
|
2083
|
+
}
|
|
2084
|
+
catch (err) {
|
|
2085
|
+
next(err);
|
|
2086
|
+
}
|
|
2087
|
+
});
|
|
2088
|
+
// --- Session Replay Manifest Endpoint ---
|
|
2089
|
+
router.post("/telemetry/rum/session-replay/manifest", ...requireSessionReplayPayloadAccess, async (req, res, next) => {
|
|
2090
|
+
try {
|
|
2091
|
+
const databaseProps = await CommonAPI.getDatabaseCommonInteractionProps(req);
|
|
2092
|
+
if (!(databaseProps === null || databaseProps === void 0 ? void 0 : databaseProps.tenantId)) {
|
|
2093
|
+
return Response.sendErrorResponse(req, res, new BadDataException("Invalid Project ID"));
|
|
2094
|
+
}
|
|
2095
|
+
assertSessionReplayPlan(databaseProps);
|
|
2096
|
+
const projectId = databaseProps.tenantId;
|
|
2097
|
+
const body = req.body;
|
|
2098
|
+
const sessionId = readSessionIdFromBody(body);
|
|
2099
|
+
const header = await resolveAuthorizedSession({
|
|
2100
|
+
projectId: projectId,
|
|
2101
|
+
sessionId: sessionId,
|
|
2102
|
+
databaseProps: databaseProps,
|
|
2103
|
+
});
|
|
2104
|
+
/*
|
|
2105
|
+
* The authorized application, resolved server-side from the header.
|
|
2106
|
+
* Every chunk-table read below is pinned to it: that table's replace
|
|
2107
|
+
* key is (projectId, sessionId, tabId, chunkIndex) with
|
|
2108
|
+
* rumApplicationId a plain column, so (projectId, sessionId) alone
|
|
2109
|
+
* is not enough to keep two applications' recordings apart.
|
|
2110
|
+
*/
|
|
2111
|
+
const authorizedApplicationId = new ObjectID(header.rumApplicationId);
|
|
2112
|
+
/*
|
|
2113
|
+
* The audit row is written BEFORE the manifest is built, not after.
|
|
2114
|
+
* A read that fails halfway through still happened, and an audit
|
|
2115
|
+
* that only records successful reads is an audit an attacker can
|
|
2116
|
+
* evade by aborting the request.
|
|
2117
|
+
*/
|
|
2118
|
+
const view = await RumSessionReplayViewService.recordView({
|
|
2119
|
+
projectId: projectId,
|
|
2120
|
+
rumApplicationId: authorizedApplicationId,
|
|
2121
|
+
sessionId: sessionId,
|
|
2122
|
+
viewedByUserId: databaseProps.userId,
|
|
2123
|
+
ipAddress: getClientIp(req),
|
|
2124
|
+
userAgent: typeof req.headers["user-agent"] === "string"
|
|
2125
|
+
? req.headers["user-agent"]
|
|
2126
|
+
: undefined,
|
|
2127
|
+
accessReason: typeof body["accessReason"] === "string"
|
|
2128
|
+
? body["accessReason"]
|
|
2129
|
+
: undefined,
|
|
2130
|
+
linkedIncidentId: typeof body["linkedIncidentId"] === "string" &&
|
|
2131
|
+
body["linkedIncidentId"].length > 0
|
|
2132
|
+
? new ObjectID(body["linkedIncidentId"])
|
|
2133
|
+
: undefined,
|
|
2134
|
+
linkedExceptionFingerprint: typeof body["linkedExceptionFingerprint"] === "string"
|
|
2135
|
+
? body["linkedExceptionFingerprint"]
|
|
2136
|
+
: undefined,
|
|
2137
|
+
});
|
|
2138
|
+
const manifest = await SessionReplayReadService.getManifest({
|
|
2139
|
+
header: header,
|
|
2140
|
+
projectId: projectId,
|
|
2141
|
+
rumApplicationId: authorizedApplicationId,
|
|
2142
|
+
sessionId: sessionId,
|
|
2143
|
+
});
|
|
2144
|
+
return Response.sendJsonObjectResponse(req, res, {
|
|
2145
|
+
/*
|
|
2146
|
+
* viewId is echoed back so the player's heartbeat can advance the
|
|
2147
|
+
* very row this read created, instead of guessing at one.
|
|
2148
|
+
*/
|
|
2149
|
+
viewId: view.id ? view.id.toString() : null,
|
|
2150
|
+
header: manifest.header,
|
|
2151
|
+
tabs: manifest.tabs,
|
|
2152
|
+
isChunkIndexTruncated: manifest.isChunkIndexTruncated,
|
|
2153
|
+
});
|
|
2154
|
+
}
|
|
2155
|
+
catch (err) {
|
|
2156
|
+
next(err);
|
|
2157
|
+
}
|
|
2158
|
+
});
|
|
2159
|
+
// --- Session Replay Chunk Endpoint ---
|
|
2160
|
+
router.post("/telemetry/rum/session-replay/chunks", ...requireSessionReplayPayloadAccess, async (req, res, next) => {
|
|
2161
|
+
try {
|
|
2162
|
+
const databaseProps = await CommonAPI.getDatabaseCommonInteractionProps(req);
|
|
2163
|
+
if (!(databaseProps === null || databaseProps === void 0 ? void 0 : databaseProps.tenantId)) {
|
|
2164
|
+
return Response.sendErrorResponse(req, res, new BadDataException("Invalid Project ID"));
|
|
2165
|
+
}
|
|
2166
|
+
assertSessionReplayPlan(databaseProps);
|
|
2167
|
+
const projectId = databaseProps.tenantId;
|
|
2168
|
+
const body = req.body;
|
|
2169
|
+
const sessionId = readSessionIdFromBody(body);
|
|
2170
|
+
const tabId = body["tabId"];
|
|
2171
|
+
if (typeof tabId !== "string" || tabId.length === 0) {
|
|
2172
|
+
return Response.sendErrorResponse(req, res, new BadDataException("tabId is required"));
|
|
2173
|
+
}
|
|
2174
|
+
const rawChunkIndexes = body["chunkIndexes"];
|
|
2175
|
+
if (!Array.isArray(rawChunkIndexes) || rawChunkIndexes.length === 0) {
|
|
2176
|
+
return Response.sendErrorResponse(req, res, new BadDataException("chunkIndexes is required"));
|
|
2177
|
+
}
|
|
2178
|
+
const chunkIndexes = rawChunkIndexes.filter((index) => {
|
|
2179
|
+
return (typeof index === "number" && Number.isInteger(index) && index >= 0);
|
|
2180
|
+
});
|
|
2181
|
+
if (chunkIndexes.length !== rawChunkIndexes.length) {
|
|
2182
|
+
return Response.sendErrorResponse(req, res, new BadDataException("chunkIndexes must contain only non-negative integers"));
|
|
2183
|
+
}
|
|
2184
|
+
/*
|
|
2185
|
+
* Checked here as well as inside the read service: the route should
|
|
2186
|
+
* refuse an abusive request before it authorizes and queries
|
|
2187
|
+
* anything, and the service must refuse it for any future caller
|
|
2188
|
+
* that does not come through this route.
|
|
2189
|
+
*/
|
|
2190
|
+
if (chunkIndexes.length > MAX_SESSION_REPLAY_CHUNKS_PER_READ) {
|
|
2191
|
+
return Response.sendErrorResponse(req, res, new BadDataException(`A maximum of ${MAX_SESSION_REPLAY_CHUNKS_PER_READ} chunks may be requested at a time.`));
|
|
2192
|
+
}
|
|
2193
|
+
const header = await resolveAuthorizedSession({
|
|
2194
|
+
projectId: projectId,
|
|
2195
|
+
sessionId: sessionId,
|
|
2196
|
+
databaseProps: databaseProps,
|
|
2197
|
+
});
|
|
2198
|
+
const chunks = await SessionReplayReadService.getChunks({
|
|
2199
|
+
projectId: projectId,
|
|
2200
|
+
/* Always the application the caller was authorized against. */
|
|
2201
|
+
rumApplicationId: new ObjectID(header.rumApplicationId),
|
|
2202
|
+
sessionId: sessionId,
|
|
2203
|
+
tabId: tabId,
|
|
2204
|
+
chunkIndexes: chunkIndexes,
|
|
2205
|
+
});
|
|
2206
|
+
/*
|
|
2207
|
+
* Concatenated binary frames: [u32 chunkIndex][u32 byteLength][bytes]
|
|
2208
|
+
* repeated, little-endian, application/octet-stream.
|
|
2209
|
+
*
|
|
2210
|
+
* Not JSON: the payload is already a JSON document, so a JSON
|
|
2211
|
+
* envelope would force the server to re-escape and the browser to
|
|
2212
|
+
* double-parse several megabytes per page. The length prefix lets
|
|
2213
|
+
* the player slice the response without scanning it.
|
|
2214
|
+
*/
|
|
2215
|
+
const frames = [];
|
|
2216
|
+
/*
|
|
2217
|
+
* The byte cap is re-checked here against the bytes actually being
|
|
2218
|
+
* framed, not only against what the pre-check in the read service
|
|
2219
|
+
* believed. This is the last place the size of the response is
|
|
2220
|
+
* knowable, so it is the one place a cap on the response can be
|
|
2221
|
+
* absolute regardless of how stored size was estimated upstream.
|
|
2222
|
+
*/
|
|
2223
|
+
let responseBytes = 0;
|
|
2224
|
+
for (const chunk of chunks) {
|
|
2225
|
+
const payloadBuffer = Buffer.from(chunk.payload, "utf8");
|
|
2226
|
+
responseBytes += payloadBuffer.length + 8;
|
|
2227
|
+
if (responseBytes > MAX_SESSION_REPLAY_READ_BYTES) {
|
|
2228
|
+
return Response.sendErrorResponse(req, res, new BadDataException(`The requested chunks exceed the ${MAX_SESSION_REPLAY_READ_BYTES} byte limit for a single read. Request fewer chunks.`));
|
|
2229
|
+
}
|
|
2230
|
+
const headerBuffer = Buffer.alloc(8);
|
|
2231
|
+
headerBuffer.writeUInt32LE(chunk.chunkIndex, 0);
|
|
2232
|
+
headerBuffer.writeUInt32LE(payloadBuffer.length, 4);
|
|
2233
|
+
frames.push(headerBuffer, payloadBuffer);
|
|
2234
|
+
}
|
|
2235
|
+
const responseBody = Buffer.concat(frames);
|
|
2236
|
+
res.setHeader("Content-Type", "application/octet-stream");
|
|
2237
|
+
res.setHeader("Content-Length", responseBody.length.toString());
|
|
2238
|
+
/*
|
|
2239
|
+
* A recording is personal data. Nothing about it may sit in a
|
|
2240
|
+
* shared cache, and the browser should not keep it on disk either.
|
|
2241
|
+
*/
|
|
2242
|
+
res.setHeader("Cache-Control", "no-store");
|
|
2243
|
+
res.send(responseBody);
|
|
2244
|
+
}
|
|
2245
|
+
catch (err) {
|
|
2246
|
+
next(err);
|
|
2247
|
+
}
|
|
2248
|
+
});
|
|
2249
|
+
// --- Session Replay Heartbeat Endpoint ---
|
|
2250
|
+
router.post("/telemetry/rum/session-replay/heartbeat", ...requireSessionReplayPayloadAccess, async (req, res, next) => {
|
|
2251
|
+
try {
|
|
2252
|
+
const databaseProps = await CommonAPI.getDatabaseCommonInteractionProps(req);
|
|
2253
|
+
if (!(databaseProps === null || databaseProps === void 0 ? void 0 : databaseProps.tenantId)) {
|
|
2254
|
+
return Response.sendErrorResponse(req, res, new BadDataException("Invalid Project ID"));
|
|
2255
|
+
}
|
|
2256
|
+
assertSessionReplayPlan(databaseProps);
|
|
2257
|
+
const projectId = databaseProps.tenantId;
|
|
2258
|
+
const body = req.body;
|
|
2259
|
+
const viewId = readObjectIdFromBody(body, "viewId");
|
|
2260
|
+
const secondsWatched = body["secondsWatched"];
|
|
2261
|
+
if (typeof secondsWatched !== "number" ||
|
|
2262
|
+
!Number.isFinite(secondsWatched)) {
|
|
2263
|
+
return Response.sendErrorResponse(req, res, new BadDataException("secondsWatched must be a number"));
|
|
2264
|
+
}
|
|
2265
|
+
/*
|
|
2266
|
+
* Floored to the 15s heartbeat cadence. recordSecondsWatched is
|
|
2267
|
+
* monotonic and returns without writing when the value does not
|
|
2268
|
+
* advance, so flooring here turns a chatty client into at most one
|
|
2269
|
+
* UPDATE per 15 seconds watched without any server-side timer or
|
|
2270
|
+
* cross-pod throttle state.
|
|
2271
|
+
*/
|
|
2272
|
+
const throttledSeconds = Math.floor(Math.max(0, secondsWatched) / 15) * 15;
|
|
2273
|
+
/*
|
|
2274
|
+
* secondsWatched is a privacy control, not telemetry: it is shown on
|
|
2275
|
+
* the player as "who watched how much of this recording". Scoping
|
|
2276
|
+
* the write to the tenant alone would let any principal holding the
|
|
2277
|
+
* payload permission inflate somebody else's audit row for a session
|
|
2278
|
+
* they may not even read, which forges the very record the design
|
|
2279
|
+
* relies on.
|
|
2280
|
+
*
|
|
2281
|
+
* The row is therefore looked up as the CALLER'S own view row - a
|
|
2282
|
+
* viewId belonging to anyone else matches nothing and is refused
|
|
2283
|
+
* indistinguishably from one that does not exist - and the
|
|
2284
|
+
* application it points at is authorized exactly as a payload read
|
|
2285
|
+
* would be.
|
|
2286
|
+
*/
|
|
2287
|
+
if (!databaseProps.userId) {
|
|
2288
|
+
return Response.sendErrorResponse(req, res, new NotAuthorizedException("You do not have access to this session replay view."));
|
|
2289
|
+
}
|
|
2290
|
+
const view = await RumSessionReplayViewService.findOneBy({
|
|
2291
|
+
query: {
|
|
2292
|
+
_id: viewId.toString(),
|
|
2293
|
+
projectId: projectId,
|
|
2294
|
+
viewedByUserId: databaseProps.userId,
|
|
2295
|
+
},
|
|
2296
|
+
select: {
|
|
2297
|
+
_id: true,
|
|
2298
|
+
rumApplicationId: true,
|
|
2299
|
+
},
|
|
2300
|
+
props: {
|
|
2301
|
+
isRoot: true,
|
|
2302
|
+
},
|
|
2303
|
+
});
|
|
2304
|
+
if (!view || !view.rumApplicationId) {
|
|
2305
|
+
return Response.sendErrorResponse(req, res, new NotAuthorizedException("You do not have access to this session replay view."));
|
|
2306
|
+
}
|
|
2307
|
+
await assertSessionReplayApplicationAccess({
|
|
2308
|
+
projectId: projectId,
|
|
2309
|
+
rumApplicationId: view.rumApplicationId,
|
|
2310
|
+
databaseProps: databaseProps,
|
|
2311
|
+
permissions: SESSION_REPLAY_PAYLOAD_PERMISSIONS,
|
|
2312
|
+
});
|
|
2313
|
+
await RumSessionReplayViewService.recordSecondsWatched({
|
|
2314
|
+
viewId: viewId,
|
|
2315
|
+
projectId: projectId,
|
|
2316
|
+
secondsWatched: throttledSeconds,
|
|
2317
|
+
});
|
|
2318
|
+
return Response.sendJsonObjectResponse(req, res, {
|
|
2319
|
+
secondsWatched: throttledSeconds,
|
|
2320
|
+
});
|
|
2321
|
+
}
|
|
2322
|
+
catch (err) {
|
|
2323
|
+
next(err);
|
|
2324
|
+
}
|
|
2325
|
+
});
|
|
2326
|
+
// --- Session Replay For Exception Endpoint ---
|
|
2327
|
+
router.post("/telemetry/rum/session-replay/for-exception", ...requireSessionReplayListAccess, async (req, res, next) => {
|
|
2328
|
+
try {
|
|
2329
|
+
const databaseProps = await CommonAPI.getDatabaseCommonInteractionProps(req);
|
|
2330
|
+
if (!(databaseProps === null || databaseProps === void 0 ? void 0 : databaseProps.tenantId)) {
|
|
2331
|
+
return Response.sendErrorResponse(req, res, new BadDataException("Invalid Project ID"));
|
|
2332
|
+
}
|
|
2333
|
+
assertSessionReplayPlan(databaseProps);
|
|
2334
|
+
const projectId = databaseProps.tenantId;
|
|
2335
|
+
const body = req.body;
|
|
2336
|
+
const fingerprint = body["fingerprint"];
|
|
2337
|
+
if (typeof fingerprint !== "string" || fingerprint.length === 0) {
|
|
2338
|
+
return Response.sendErrorResponse(req, res, new BadDataException("fingerprint is required"));
|
|
2339
|
+
}
|
|
2340
|
+
/*
|
|
2341
|
+
* An exception is not scoped to a RUM application, so there is no
|
|
2342
|
+
* single application to authorize against. Restrict the query to
|
|
2343
|
+
* the applications the caller's labels reach instead.
|
|
2344
|
+
*/
|
|
2345
|
+
const accessibleApplications = await resolveAccessibleRumApplicationIds({
|
|
2346
|
+
projectId: projectId,
|
|
2347
|
+
databaseProps: databaseProps,
|
|
2348
|
+
permissions: SESSION_REPLAY_LIST_PERMISSIONS,
|
|
2349
|
+
});
|
|
2350
|
+
const startTime = body["startTime"]
|
|
2351
|
+
? OneUptimeDate.fromString(body["startTime"])
|
|
2352
|
+
: undefined;
|
|
2353
|
+
const endTime = body["endTime"]
|
|
2354
|
+
? OneUptimeDate.fromString(body["endTime"])
|
|
2355
|
+
: undefined;
|
|
2356
|
+
const sessions = await SessionReplayReadService.getSessionsForException(Object.assign(Object.assign(Object.assign({ projectId: projectId, exceptionFingerprint: fingerprint, accessibleRumApplicationIds: accessibleApplications.applicationIds }, (startTime !== undefined && { startTime })), (endTime !== undefined && { endTime })), { limit: typeof body["limit"] === "number"
|
|
2357
|
+
? body["limit"]
|
|
2358
|
+
: MAX_SESSION_REPLAY_FOR_EXCEPTION_LIMIT }));
|
|
2359
|
+
return Response.sendJsonObjectResponse(req, res, {
|
|
2360
|
+
sessions: sessions,
|
|
2361
|
+
/*
|
|
2362
|
+
* Told, not hidden: the accessible-application scan has a ceiling,
|
|
2363
|
+
* and a caller who hits it is looking at a possibly short answer.
|
|
2364
|
+
*/
|
|
2365
|
+
isApplicationScopeTruncated: accessibleApplications.isTruncated,
|
|
2366
|
+
});
|
|
2367
|
+
}
|
|
2368
|
+
catch (err) {
|
|
2369
|
+
next(err);
|
|
2370
|
+
}
|
|
2371
|
+
});
|
|
2372
|
+
// --- Session Replay Ingest Status Endpoint ---
|
|
2373
|
+
/*
|
|
2374
|
+
* Recording health for one application: is replay switched on at every
|
|
2375
|
+
* level, when did the last chunk actually land, and how much of the byte
|
|
2376
|
+
* budgets is spent. This is what lets the Dashboard answer "why are there
|
|
2377
|
+
* no recordings?" and "am I about to hit my budget?" as states rather than
|
|
2378
|
+
* leaving the customer to infer them from silence — the ingest gate's
|
|
2379
|
+
* refusals are deliberately quiet toward end users' browsers, so this
|
|
2380
|
+
* endpoint is the loud side of that trade.
|
|
2381
|
+
*
|
|
2382
|
+
* Reads settings metadata and Redis counters only; never touches recording
|
|
2383
|
+
* payloads, so list-level access is the right bar.
|
|
2384
|
+
*
|
|
2385
|
+
* The application row is loaded with root props even though its columns
|
|
2386
|
+
* carry their own read ACLs. That is deliberate and bounded: every column
|
|
2387
|
+
* returned here (appIdentifier, the replay policy fields, the two health
|
|
2388
|
+
* timestamps) is readable by a plain project Viewer under its declared
|
|
2389
|
+
* ACL — the least-privileged read tier there is — while this route demands
|
|
2390
|
+
* the STRICTER session-replay list permission and pins tenancy and label
|
|
2391
|
+
* scope first. Nothing is disclosed that the caller's project peers cannot
|
|
2392
|
+
* already read through the generic CRUD API. If a column with a narrower
|
|
2393
|
+
* ACL (e.g. anything identity-adjacent) is ever added to this SELECT, it
|
|
2394
|
+
* must get an explicit permission check, not a wider isRoot ride-along.
|
|
2395
|
+
*/
|
|
2396
|
+
router.post("/telemetry/rum/session-replay/ingest-status", ...requireSessionReplayListAccess, async (req, res, next) => {
|
|
2397
|
+
var _a;
|
|
2398
|
+
try {
|
|
2399
|
+
const databaseProps = await CommonAPI.getDatabaseCommonInteractionProps(req);
|
|
2400
|
+
if (!(databaseProps === null || databaseProps === void 0 ? void 0 : databaseProps.tenantId)) {
|
|
2401
|
+
return Response.sendErrorResponse(req, res, new BadDataException("Invalid Project ID"));
|
|
2402
|
+
}
|
|
2403
|
+
assertSessionReplayPlan(databaseProps);
|
|
2404
|
+
const projectId = databaseProps.tenantId;
|
|
2405
|
+
const body = req.body;
|
|
2406
|
+
const rumApplicationId = readObjectIdFromBody(body, "rumApplicationId");
|
|
2407
|
+
await assertSessionReplayApplicationAccess({
|
|
2408
|
+
projectId: projectId,
|
|
2409
|
+
rumApplicationId: rumApplicationId,
|
|
2410
|
+
databaseProps: databaseProps,
|
|
2411
|
+
permissions: SESSION_REPLAY_LIST_PERMISSIONS,
|
|
2412
|
+
});
|
|
2413
|
+
const application = await RumApplicationService.findOneBy({
|
|
2414
|
+
query: {
|
|
2415
|
+
_id: rumApplicationId.toString(),
|
|
2416
|
+
projectId: projectId,
|
|
2417
|
+
},
|
|
2418
|
+
select: {
|
|
2419
|
+
_id: true,
|
|
2420
|
+
appIdentifier: true,
|
|
2421
|
+
isSessionReplayEnabled: true,
|
|
2422
|
+
sessionReplayAllowedOrigins: true,
|
|
2423
|
+
sessionReplaySamplePercentage: true,
|
|
2424
|
+
sessionReplayCaptureTrigger: true,
|
|
2425
|
+
sessionReplayMonthlyBudgetInGB: true,
|
|
2426
|
+
sessionReplayLastChunkReceivedAt: true,
|
|
2427
|
+
sessionReplayBudgetExceededAt: true,
|
|
2428
|
+
},
|
|
2429
|
+
props: {
|
|
2430
|
+
isRoot: true,
|
|
2431
|
+
},
|
|
2432
|
+
});
|
|
2433
|
+
if (!application) {
|
|
2434
|
+
return Response.sendErrorResponse(req, res, new BadDataException("RUM application not found."));
|
|
2435
|
+
}
|
|
2436
|
+
const project = await ProjectService.findOneBy({
|
|
2437
|
+
query: {
|
|
2438
|
+
_id: projectId.toString(),
|
|
2439
|
+
},
|
|
2440
|
+
select: {
|
|
2441
|
+
isSessionReplayAllowed: true,
|
|
2442
|
+
},
|
|
2443
|
+
props: {
|
|
2444
|
+
isRoot: true,
|
|
2445
|
+
},
|
|
2446
|
+
});
|
|
2447
|
+
const [projectBytesUsedToday, applicationBytesUsedThisMonth] = await Promise.all([
|
|
2448
|
+
SessionReplayUsage.getProjectBytesUsedToday(projectId),
|
|
2449
|
+
SessionReplayUsage.getApplicationBytesUsedThisMonth({
|
|
2450
|
+
projectId: projectId,
|
|
2451
|
+
rumApplicationId: rumApplicationId,
|
|
2452
|
+
}),
|
|
2453
|
+
]);
|
|
2454
|
+
/*
|
|
2455
|
+
* Same env var, same default, as the value the ingest gate enforces
|
|
2456
|
+
* (App Telemetry Config). The default is a shared constant so the
|
|
2457
|
+
* number shown here cannot drift from the number enforced there.
|
|
2458
|
+
*/
|
|
2459
|
+
const dailyCapEnv = parseInt(process.env["SESSION_REPLAY_MAX_BYTES_PER_PROJECT_PER_DAY"] || "", 10);
|
|
2460
|
+
const dailyByteLimit = !isNaN(dailyCapEnv) && dailyCapEnv > 0
|
|
2461
|
+
? dailyCapEnv
|
|
2462
|
+
: DEFAULT_SESSION_REPLAY_MAX_BYTES_PER_PROJECT_PER_DAY;
|
|
2463
|
+
const applicationView = application;
|
|
2464
|
+
return Response.sendJsonObjectResponse(req, res, {
|
|
2465
|
+
isProjectAllowed: Boolean(project === null || project === void 0 ? void 0 : project["isSessionReplayAllowed"]),
|
|
2466
|
+
isApplicationEnabled: Boolean(applicationView["isSessionReplayEnabled"]),
|
|
2467
|
+
appIdentifier: String(applicationView["appIdentifier"] || ""),
|
|
2468
|
+
allowedOrigins: (applicationView["sessionReplayAllowedOrigins"] ||
|
|
2469
|
+
[]),
|
|
2470
|
+
samplePercentage: Number(applicationView["sessionReplaySamplePercentage"] || 0),
|
|
2471
|
+
captureTrigger: String(applicationView["sessionReplayCaptureTrigger"] || ""),
|
|
2472
|
+
lastChunkReceivedAt: applicationView["sessionReplayLastChunkReceivedAt"] ||
|
|
2473
|
+
null,
|
|
2474
|
+
budgetExceededAt: applicationView["sessionReplayBudgetExceededAt"] || null,
|
|
2475
|
+
/* null = counter unreachable; render as unknown, never as zero. */
|
|
2476
|
+
projectBytesUsedToday: projectBytesUsedToday,
|
|
2477
|
+
dailyByteLimit: dailyByteLimit,
|
|
2478
|
+
applicationBytesUsedThisMonth: applicationBytesUsedThisMonth,
|
|
2479
|
+
monthlyBudgetInGB: (_a = applicationView["sessionReplayMonthlyBudgetInGB"]) !== null && _a !== void 0 ? _a : null,
|
|
2480
|
+
});
|
|
2481
|
+
}
|
|
2482
|
+
catch (err) {
|
|
2483
|
+
next(err);
|
|
2484
|
+
}
|
|
2485
|
+
});
|
|
2486
|
+
/*
|
|
2487
|
+
* "Record the next session for this user."
|
|
2488
|
+
*
|
|
2489
|
+
* One route, three actions, because all three are the same tiny
|
|
2490
|
+
* conversation with one Redis key: set arms a 24h one-shot target for a
|
|
2491
|
+
* named end-user reference, clear disarms it, status reads it. The
|
|
2492
|
+
* response is always the resulting { isPending }.
|
|
2493
|
+
*
|
|
2494
|
+
* The guard requires EDIT on the application, not the session-replay READ
|
|
2495
|
+
* permission: arming this causes a recording of a named person to be
|
|
2496
|
+
* made, which is a capture-policy write - the same class of action as
|
|
2497
|
+
* flipping the enable flag - and a reviewer who may only WATCH recordings
|
|
2498
|
+
* must not be able to order new ones.
|
|
2499
|
+
*/
|
|
2500
|
+
const requireSessionReplayTargetAccess = [
|
|
2501
|
+
UserMiddleware.getUserMiddleware,
|
|
2502
|
+
UserMiddleware.requireUserAuthentication,
|
|
2503
|
+
UserMiddleware.requirePermission({
|
|
2504
|
+
permissions: [
|
|
2505
|
+
Permission.ProjectOwner,
|
|
2506
|
+
Permission.ProjectAdmin,
|
|
2507
|
+
Permission.TelemetryAdmin,
|
|
2508
|
+
Permission.EditRumApplication,
|
|
2509
|
+
],
|
|
2510
|
+
}),
|
|
2511
|
+
];
|
|
2512
|
+
router.post("/telemetry/rum/session-replay/target", ...requireSessionReplayTargetAccess, async (req, res, next) => {
|
|
2513
|
+
try {
|
|
2514
|
+
const databaseProps = await CommonAPI.getDatabaseCommonInteractionProps(req);
|
|
2515
|
+
if (!(databaseProps === null || databaseProps === void 0 ? void 0 : databaseProps.tenantId)) {
|
|
2516
|
+
return Response.sendErrorResponse(req, res, new BadDataException("Invalid Project ID"));
|
|
2517
|
+
}
|
|
2518
|
+
assertSessionReplayPlan(databaseProps);
|
|
2519
|
+
const projectId = databaseProps.tenantId;
|
|
2520
|
+
const body = req.body;
|
|
2521
|
+
const rumApplicationId = readObjectIdFromBody(body, "rumApplicationId");
|
|
2522
|
+
const action = body["action"];
|
|
2523
|
+
if (action !== "set" && action !== "clear" && action !== "status") {
|
|
2524
|
+
return Response.sendErrorResponse(req, res, new BadDataException('action must be one of "set", "clear" or "status".'));
|
|
2525
|
+
}
|
|
2526
|
+
const userRef = body["userRef"];
|
|
2527
|
+
if (!SessionReplayTargeting.isUsableUserRef(userRef)) {
|
|
2528
|
+
return Response.sendErrorResponse(req, res, new BadDataException("userRef must be a non-empty string of at most 512 characters."));
|
|
2529
|
+
}
|
|
2530
|
+
await assertSessionReplayApplicationAccess({
|
|
2531
|
+
projectId: projectId,
|
|
2532
|
+
rumApplicationId: rumApplicationId,
|
|
2533
|
+
databaseProps: databaseProps,
|
|
2534
|
+
permissions: [
|
|
2535
|
+
Permission.ProjectOwner,
|
|
2536
|
+
Permission.ProjectAdmin,
|
|
2537
|
+
Permission.TelemetryAdmin,
|
|
2538
|
+
Permission.EditRumApplication,
|
|
2539
|
+
],
|
|
2540
|
+
});
|
|
2541
|
+
/*
|
|
2542
|
+
* The Redis key is scoped by the application's ingest identifier -
|
|
2543
|
+
* the name the recorder introduces itself with - not by the row id
|
|
2544
|
+
* the dashboard holds, so resolve one from the other here.
|
|
2545
|
+
*/
|
|
2546
|
+
const application = await RumApplicationService.findOneBy({
|
|
2547
|
+
query: {
|
|
2548
|
+
_id: rumApplicationId.toString(),
|
|
2549
|
+
projectId: projectId,
|
|
2550
|
+
},
|
|
2551
|
+
select: {
|
|
2552
|
+
_id: true,
|
|
2553
|
+
appIdentifier: true,
|
|
2554
|
+
},
|
|
2555
|
+
props: {
|
|
2556
|
+
isRoot: true,
|
|
2557
|
+
},
|
|
2558
|
+
});
|
|
2559
|
+
const appIdentifier = String((application === null || application === void 0 ? void 0 : application["appIdentifier"]) || "");
|
|
2560
|
+
if (!application || !appIdentifier) {
|
|
2561
|
+
return Response.sendErrorResponse(req, res, new BadDataException("RUM application not found."));
|
|
2562
|
+
}
|
|
2563
|
+
const target = {
|
|
2564
|
+
projectId: projectId,
|
|
2565
|
+
appIdentifier: appIdentifier,
|
|
2566
|
+
userRef: userRef,
|
|
2567
|
+
};
|
|
2568
|
+
let isPending = false;
|
|
2569
|
+
if (action === "set") {
|
|
2570
|
+
await SessionReplayTargeting.setTarget(target);
|
|
2571
|
+
isPending = true;
|
|
2572
|
+
}
|
|
2573
|
+
else if (action === "clear") {
|
|
2574
|
+
await SessionReplayTargeting.clearTarget(target);
|
|
2575
|
+
isPending = false;
|
|
2576
|
+
}
|
|
2577
|
+
else {
|
|
2578
|
+
isPending = await SessionReplayTargeting.isTargetPending(target);
|
|
2579
|
+
}
|
|
2580
|
+
return Response.sendJsonObjectResponse(req, res, {
|
|
2581
|
+
isPending: isPending,
|
|
2582
|
+
});
|
|
2583
|
+
}
|
|
2584
|
+
catch (err) {
|
|
2585
|
+
next(err);
|
|
2586
|
+
}
|
|
2587
|
+
});
|
|
1651
2588
|
export default router;
|
|
1652
2589
|
//# sourceMappingURL=TelemetryAPI.js.map
|