@oneuptime/common 12.0.33 → 12.0.34
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/RumSession.ts +117 -1
- package/Models/AnalyticsModels/RumSessionChunk.ts +13 -0
- package/Models/DatabaseModels/AlertCustomField.ts +77 -3
- package/Models/DatabaseModels/ApiKeyPermission.ts +3 -27
- package/Models/DatabaseModels/IncidentCustomField.ts +77 -3
- package/Models/DatabaseModels/InventoryItemCustomField.ts +77 -3
- package/Models/DatabaseModels/MonitorCustomField.ts +77 -3
- package/Models/DatabaseModels/OnCallDutyPolicyCustomField.ts +77 -3
- package/Models/DatabaseModels/RumApplication.ts +6 -6
- package/Models/DatabaseModels/ScheduledMaintenanceCustomField.ts +77 -3
- package/Models/DatabaseModels/StatusPageCustomField.ts +77 -3
- package/Models/DatabaseModels/TeamCustomField.ts +77 -3
- package/Models/DatabaseModels/TeamMember.ts +0 -9
- package/Models/DatabaseModels/TeamMemberCustomField.ts +77 -3
- package/Models/DatabaseModels/TeamPermission.ts +3 -24
- package/Models/DatabaseModels/TelemetryIngestionKey.ts +260 -0
- package/Models/DatabaseModels/UserTelegram.ts +0 -4
- package/Scripts/benchmark-fanin-capacity.js +181 -0
- package/Server/API/TelemetryAPI.ts +1284 -164
- package/Server/API/UserNotificationSettingAPI.ts +55 -0
- package/Server/API/UserTelegramAPI.ts +48 -4
- package/Server/EnvironmentConfig.ts +35 -2
- package/Server/Infrastructure/Postgres/SchemaMigrations/1791300000000-AddTelemetryIngestionKeyType.ts +91 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1791400000000-SessionReplayRecordEverySessionByDefault.ts +67 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1791500000000-WidenCustomFieldDropdownOptions.ts +139 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1791600000000-AddCustomFieldValueMapping.ts +121 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +8 -0
- package/Server/Infrastructure/QueueWorker.ts +20 -14
- package/Server/Infrastructure/Semaphore.ts +2 -0
- package/Server/Middleware/TelemetryIngest.ts +453 -7
- package/Server/Services/AccessTokenService.ts +1 -0
- package/Server/Services/AlertCustomFieldService.ts +98 -0
- package/Server/Services/AlertService.ts +37 -0
- package/Server/Services/ApiKeyPermissionService.ts +461 -29
- package/Server/Services/CustomFieldMappingService.ts +879 -0
- package/Server/Services/GlobalConfigService.ts +194 -0
- package/Server/Services/IncidentCustomFieldService.ts +98 -0
- package/Server/Services/IncidentService.ts +35 -0
- package/Server/Services/MetricService.ts +194 -0
- package/Server/Services/MonitorService.ts +32 -0
- package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +78 -25
- package/Server/Services/ProjectService.ts +22 -0
- package/Server/Services/RoutineEmailSettingsService.ts +73 -0
- package/Server/Services/RumSessionReplayViewService.ts +104 -24
- package/Server/Services/ScheduledMaintenanceCustomFieldService.ts +98 -0
- package/Server/Services/ScheduledMaintenanceService.ts +32 -0
- package/Server/Services/TeamMemberService.ts +78 -0
- package/Server/Services/TeamPermissionService.ts +235 -3
- package/Server/Services/TelemetryIngestionKeyService.ts +722 -19
- package/Server/Services/UserNotificationSettingService.ts +34 -6
- package/Server/Services/UserTelegramService.ts +326 -5
- package/Server/Types/Database/QueryHelper.ts +2 -0
- package/Server/Utils/APIKey/AccessPermission.ts +5 -2
- package/Server/Utils/CustomField/CustomFieldDefinitionMappingHooks.ts +54 -0
- package/Server/Utils/CustomField/CustomFieldMappingRegistry.ts +415 -0
- package/Server/Utils/CustomField/CustomFieldMappingValidator.ts +335 -0
- package/Server/Utils/DataSource/EgressGuard.ts +177 -8
- package/Server/Utils/EmailRollup/EmailRollupConstants.ts +38 -5
- package/Server/Utils/EmailRollup/EmailRollupFlushRunner.ts +57 -4
- package/Server/Utils/FrontendEnvironment.ts +40 -0
- package/Server/Utils/LogRedaction.ts +20 -0
- package/Server/Utils/Logger.ts +11 -0
- package/Server/Utils/Monitor/Criteria/CompareCriteria.ts +338 -77
- package/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.ts +30 -4
- package/Server/Utils/Monitor/MonitorAlert.ts +29 -6
- package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +110 -15
- package/Server/Utils/Monitor/MonitorIncident.ts +22 -6
- package/Server/Utils/Monitor/MonitorTemplateUtil.ts +29 -0
- package/Server/Utils/Monitor/SeriesContextEnricher.ts +304 -0
- package/Server/Utils/SSRFProtection.ts +217 -10
- package/Server/Utils/SessionReplay/SessionReplayGateCache.ts +239 -138
- package/Server/Utils/SessionReplay/SessionReplayHealthCounters.ts +305 -0
- package/Server/Utils/SessionReplay/SessionReplayReadService.ts +1430 -289
- package/Server/Utils/StartServer.ts +2 -17
- package/Server/Utils/TelegramVerificationToken.ts +185 -0
- package/Server/Utils/Telemetry/PinServiceName.ts +197 -0
- package/Server/Utils/Telemetry/TelemetryFanInWriter.ts +38 -16
- package/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.ts +92 -0
- package/Server/Utils/Telemetry/TelemetryIngestionKeyRateLimiter.ts +217 -0
- package/Server/Utils/VM/VMAPI.ts +1 -0
- package/Server/Utils/VM/VMRunner.ts +975 -95
- package/Tests/App/AdminDashboard/AdminHeaderSmallScreens.test.tsx +202 -0
- package/Tests/App/Dashboard/DashboardHeaderSmallScreens.test.tsx +404 -0
- package/Tests/App/Dashboard/DiscoveryScanWizardValidation.test.tsx +468 -0
- package/Tests/App/Dashboard/NotificationEmailPreferences.test.tsx +399 -0
- package/Tests/App/StatusPage/StatusPageLastUpdated.test.tsx +263 -0
- package/Tests/App/StatusPage/StatusPageOverviewLiveAndSearch.test.tsx +753 -0
- package/Tests/App/StatusPage/StatusPageResourceSearchBox.test.tsx +224 -0
- package/Tests/Models/AnalyticsModels/RumSessionReplayColumns.test.ts +262 -0
- package/Tests/Models/CustomFieldMappingColumns.test.ts +166 -0
- package/Tests/Models/DatabaseModels/SessionReplayModels.test.ts +20 -6
- package/Tests/ResponsiveVisibility.test.ts +115 -0
- package/Tests/ResponsiveVisibility.ts +183 -0
- package/Tests/Server/API/SessionReplayAPI.test.ts +1940 -216
- package/Tests/Server/API/UserNotificationSettingAPI.test.ts +186 -0
- package/Tests/Server/API/UserTelegramAPISecurity.test.ts +231 -0
- package/Tests/Server/EnvironmentConfigFrontendSecurity.test.ts +234 -0
- package/Tests/Server/Infrastructure/Postgres/CustomFieldValueMappingMigration.test.ts +202 -0
- package/Tests/Server/Infrastructure/Postgres/InventoryItemArchiveMigration.test.ts +41 -0
- package/Tests/Server/Infrastructure/Postgres/SessionReplayRecordEverySessionByDefaultMigration.test.ts +169 -0
- package/Tests/Server/Infrastructure/QueueWorkerTimeout.test.ts +210 -0
- package/Tests/Server/Infrastructure/TelemetryExporterDeploymentConfig.test.ts +130 -0
- package/Tests/Server/Middleware/ProjectAuthorizationApiKeyMiddleware.test.ts +4 -1
- package/Tests/Server/Middleware/TelemetryIngestBrowserKey.test.ts +1163 -0
- package/Tests/Server/Middleware/TelemetryIngestTokenLog.test.ts +5 -3
- package/Tests/Server/Services/AddTelemetryIngestionKeyTypeMigration.test.ts +555 -0
- package/Tests/Server/Services/ApiKeyPermissionSecurity.test.ts +678 -0
- package/Tests/Server/Services/ApiKeyPermissionService.test.ts +276 -28
- package/Tests/Server/Services/CustomFieldDropdownOptionsColumnWidth.test.ts +431 -0
- package/Tests/Server/Services/CustomFieldMappingService.test.ts +850 -0
- package/Tests/Server/Services/DiscoveryScanClaimHookFreeSafety.test.ts +32 -0
- package/Tests/Server/Services/GlobalConfigService.test.ts +414 -1
- package/Tests/Server/Services/MetricRawEntityKeyPrune.test.ts +592 -0
- package/Tests/Server/Services/NetworkDeviceAutoImportRuleEngineService.test.ts +226 -1
- package/Tests/Server/Services/RoutineEmailSettingsPostgres.test.ts +329 -0
- package/Tests/Server/Services/RumSessionReplayViewService.test.ts +267 -0
- package/Tests/Server/Services/TeamMemberAutoAcceptInvitation.test.ts +9 -0
- package/Tests/Server/Services/TeamMemberInviteRegistrationToken.test.ts +9 -0
- package/Tests/Server/Services/TeamPrivilegeEscalation.test.ts +834 -0
- package/Tests/Server/Services/TelemetryIngestionKeyPolicyResolution.test.ts +814 -0
- package/Tests/Server/Services/TelemetryIngestionKeyValidation.test.ts +998 -0
- package/Tests/Server/Services/UserNotificationSettingRollupRouting.test.ts +141 -0
- package/Tests/Server/Services/UserNotificationSettingWorkspaceChannels.test.ts +18 -10
- package/Tests/Server/Services/UserTelegramVerificationSecurity.test.ts +688 -0
- package/Tests/Server/Utils/AI/SRE/Insights/FixRouting.test.ts +497 -0
- package/Tests/Server/Utils/AI/Toolbox/Serializer.test.ts +383 -0
- package/Tests/Server/Utils/APIKey/AccessPermission.test.ts +7 -3
- package/Tests/Server/Utils/AnalyticsDatabase/ClusterConfig.test.ts +315 -0
- package/Tests/Server/Utils/CustomField/CustomFieldMappingValidator.test.ts +437 -0
- package/Tests/Server/Utils/DataSource/EgressGuard.test.ts +300 -11
- package/Tests/Server/Utils/EmailRollup/EmailRollupBurstWindow.test.ts +83 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupFlushRunnerBehaviour.test.ts +1 -1
- package/Tests/Server/Utils/EmailRollup/EmailRollupFlushRunnerPreferences.test.ts +362 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupTestHarness.ts +77 -1
- package/Tests/Server/Utils/FrontendEnvironment.test.ts +190 -0
- package/Tests/Server/Utils/LogRedaction.test.ts +26 -0
- package/Tests/Server/Utils/LoggerCredentialLeak.test.ts +23 -9
- package/Tests/Server/Utils/Monitor/Criteria/CompareCriteriaAggregation.test.ts +584 -0
- package/Tests/Server/Utils/Monitor/Criteria/IncomingRequestHeaderCriteria.test.ts +236 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluator.test.ts +437 -0
- package/Tests/Server/Utils/Monitor/MonitorTemplateUtilSeriesContext.test.ts +176 -0
- package/Tests/Server/Utils/Monitor/SeriesContextEnricher.test.ts +356 -0
- package/Tests/Server/Utils/SSRFProtectionCloudServiceAddresses.test.ts +595 -0
- package/Tests/Server/Utils/SessionReplay/SessionReplayGateCachePolicy.test.ts +198 -1
- package/Tests/Server/Utils/SessionReplay/SessionReplayHealthCounters.test.ts +453 -0
- package/Tests/Server/Utils/SessionReplay/SessionReplayReadServiceQueries.test.ts +1378 -0
- package/Tests/Server/Utils/SessionReplayOriginAllowListRefactor.test.ts +420 -0
- package/Tests/Server/Utils/TelegramVerificationToken.test.ts +253 -0
- package/Tests/Server/Utils/Telemetry/PinServiceName.test.ts +666 -0
- package/Tests/Server/Utils/Telemetry/TelemetryFanInWriterCapacity.test.ts +458 -0
- package/Tests/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.test.ts +424 -0
- package/Tests/Server/Utils/Telemetry/TelemetryIngestionKeyRateLimiter.test.ts +528 -0
- package/Tests/Server/Utils/TelemetryExporterEnvironment.test.ts +56 -0
- package/Tests/Server/Utils/VM/VMRunnerHostBridgeLatency.test.ts +74 -0
- package/Tests/Server/Utils/VM/VMRunnerPrivateNetworkWiring.test.ts +100 -7
- package/Tests/Server/Utils/VM/VMRunnerSsrf.test.ts +1176 -6
- package/Tests/Types/CustomField/CustomFieldMappingCatalog.test.ts +220 -0
- package/Tests/Types/CustomField/CustomFieldValueMapping.test.ts +348 -0
- package/Tests/Types/JSONFunctions.test.ts +260 -0
- package/Tests/Types/Monitor/CephAlertTemplates.test.ts +422 -53
- package/Tests/Types/Monitor/DockerAlertTemplates.test.ts +495 -15
- package/Tests/Types/Monitor/DockerSwarmAlertTemplates.test.ts +191 -45
- package/Tests/Types/Monitor/HostAlertTemplates.test.ts +370 -42
- package/Tests/Types/Monitor/IotAlertTemplates.test.ts +375 -20
- package/Tests/Types/Monitor/KubernetesAlertTemplates.test.ts +636 -42
- package/Tests/Types/Monitor/KubernetesMetricCatalog.test.ts +189 -0
- package/Tests/Types/Monitor/KubernetesTemplateGroupByKeys.test.ts +95 -14
- package/Tests/Types/Monitor/PodmanAlertTemplates.test.ts +190 -21
- package/Tests/Types/Monitor/ProxmoxAlertTemplates.test.ts +352 -22
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationAlertDebuggability.test.ts +363 -0
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationNotificationMode.test.ts +93 -18
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.test.ts +259 -0
- package/Tests/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.test.ts +476 -0
- package/Tests/Types/Monitor/RumAlertTemplates.test.ts +136 -0
- package/Tests/Types/Monitor/SeriesContext/SeriesDebugHints.test.ts +661 -0
- package/Tests/Types/Monitor/SeriesContext/SeriesLabelDisplay.test.ts +507 -0
- package/Tests/Types/Monitor/ServiceAlertTemplates.test.ts +270 -0
- package/Tests/Types/Monitor/TemplateGroupByKeys.test.ts +38 -10
- package/Tests/Types/Monitor/Utils/RecommendationCriteriaAssertions.ts +102 -0
- package/Tests/Types/NotificationSetting/RoutineEmailEvents.test.ts +47 -0
- package/Tests/Types/Rum/SessionReplayApiContracts.test.ts +608 -0
- package/Tests/Types/Rum/SessionReplayCustomEvents.test.ts +434 -0
- package/Tests/Types/WebsiteRequest.test.ts +285 -3
- package/Tests/UI/Components/Charts/ChartBucketIdentity.test.ts +16 -3
- package/Tests/UI/Components/Charts/ChartTrailingBucketGap.test.ts +691 -0
- package/Tests/UI/Components/ComponentsModal.test.tsx +12 -4
- package/Tests/UI/Components/ComponentsModalUsability.test.tsx +518 -0
- package/Tests/UI/Components/CustomFields/CustomFieldsDetailMapping.test.tsx +324 -0
- package/Tests/UI/Components/CustomFields/MapFromCustomFieldInput.test.tsx +176 -0
- package/Tests/UI/Components/Graphs/DayUptimeGraph.test.tsx +484 -0
- package/Tests/UI/Components/HeaderRightRail.test.tsx +157 -0
- package/Tests/UI/Components/IconDropdownItem.test.tsx +102 -0
- package/Tests/UI/Components/JSONTablePrototypePollution.test.tsx +117 -0
- package/Tests/UI/Components/KeyboardShortcutsModal.test.tsx +214 -0
- package/Tests/UI/Components/ModelTable/ModelTableWrapContent.test.tsx +561 -0
- package/Tests/UI/Components/MonitorGraphs/UptimeBarDayModal.test.tsx +302 -0
- package/Tests/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.test.ts +28 -12
- package/Tests/UI/Components/ShortcutDialogGuard.test.tsx +74 -0
- package/Tests/UI/Components/StatusPage/ResourceGroupSectionAutoExpand.test.tsx +248 -0
- package/Tests/UI/Components/TableCellWrapping.test.tsx +625 -0
- package/Tests/UI/Components/TableLoadingStates.test.tsx +205 -0
- package/Tests/UI/Components/Workflow/NodePlacement.test.ts +148 -0
- package/Tests/UI/Components/Workflow/Workflow.test.tsx +981 -0
- package/Tests/UI/ConfigBrowserTelemetry.test.ts +70 -0
- package/Tests/UI/Rum/ChunkLoader.test.ts +1036 -2
- package/Tests/UI/Rum/FidelityNotices.test.ts +187 -0
- package/Tests/UI/Rum/InactivityMap.test.ts +341 -0
- package/Tests/UI/Rum/PrivacySummaryCard.test.tsx +259 -0
- package/Tests/UI/Rum/RecordingHealthCard.test.tsx +855 -0
- package/Tests/UI/Rum/RecordingHealthStrip.test.tsx +594 -0
- package/Tests/UI/Rum/ReplayCard.test.tsx +451 -0
- package/Tests/UI/Rum/ReplayCorrelationPanel.test.tsx +536 -0
- package/Tests/UI/Rum/ReplayEngine.test.ts +2503 -0
- package/Tests/UI/Rum/ReplayEngineTypes.test.ts +171 -0
- package/Tests/UI/Rum/ReplayHeader.test.tsx +711 -0
- package/Tests/UI/Rum/ReplayLink.test.tsx +119 -0
- package/Tests/UI/Rum/ReplayPinControl.test.tsx +408 -0
- package/Tests/UI/Rum/ReplayPlaybackIntent.test.ts +152 -0
- package/Tests/UI/Rum/ReplayRail.test.tsx +1296 -0
- package/Tests/UI/Rum/ReplayRailDetail.test.tsx +900 -0
- package/Tests/UI/Rum/ReplayScrubber.test.tsx +763 -147
- package/Tests/UI/Rum/ReplaySignalTypes.test.ts +189 -0
- package/Tests/UI/Rum/ReplaySignals.test.ts +1579 -0
- package/Tests/UI/Rum/ReplayStage.test.tsx +396 -473
- package/Tests/UI/Rum/ReplayStageOverlays.test.tsx +918 -0
- package/Tests/UI/Rum/ReplayTimeline.test.tsx +696 -0
- package/Tests/UI/Rum/SessionReplayEmptyState.test.tsx +499 -0
- package/Tests/UI/Rum/SessionReplaySearchBar.test.tsx +346 -0
- package/Tests/UI/Rum/SessionReplaySetupGuide.test.tsx +545 -0
- package/Tests/UI/Rum/SessionReplayTable.test.tsx +991 -0
- package/Tests/UI/Rum/TargetedCapturePanel.test.tsx +254 -0
- package/Tests/UI/Telemetry/BrowserExporterIsolation.test.ts +71 -0
- package/Tests/UI/Utils/GlobalKeyboardShortcut.test.ts +344 -0
- package/Tests/Utils/API.test.ts +308 -0
- package/Tests/Utils/HTTPResponseBodyReader.test.ts +323 -0
- package/Tests/Utils/NetworkDiscovery/DiscoveryScanStatus.test.ts +117 -0
- package/Tests/Utils/Rum/ChunkMath.test.ts +83 -0
- package/Tests/Utils/Rum/SessionReplayHealthDiagnosis.test.ts +993 -0
- package/Tests/Utils/Rum/SessionReplayStringMap.test.ts +245 -0
- package/Tests/Utils/StatusPage/ResourceSearch.test.ts +631 -0
- package/Tests/Utils/Telemetry/OriginAllowList.test.ts +633 -0
- package/Tests/Utils/Uptime/DayUptimeGraphUtil.test.ts +461 -0
- package/Tests/Utils/ValueFormatter.test.ts +148 -0
- package/Types/CustomField/CustomFieldMappingCatalog.ts +161 -0
- package/Types/CustomField/CustomFieldMappingSourceResource.ts +19 -0
- package/Types/CustomField/CustomFieldValueMapping.ts +288 -0
- package/Types/Icon/IconProp.ts +1 -0
- package/Types/JSONFunctions.ts +189 -43
- package/Types/Monitor/CephAlertTemplates.ts +157 -195
- package/Types/Monitor/DockerAlertTemplates.ts +338 -128
- package/Types/Monitor/DockerSwarmAlertTemplates.ts +95 -112
- package/Types/Monitor/HostAlertTemplates.ts +302 -130
- package/Types/Monitor/IotAlertTemplates.ts +112 -104
- package/Types/Monitor/KubernetesAlertTemplates.ts +415 -224
- package/Types/Monitor/KubernetesMetricCatalog.ts +23 -19
- package/Types/Monitor/PodmanAlertTemplates.ts +116 -163
- package/Types/Monitor/ProxmoxAlertTemplates.ts +217 -99
- package/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.ts +98 -6
- package/Types/Monitor/Recommendation/MonitorRecommendationUtil.ts +44 -7
- package/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.ts +383 -0
- package/Types/Monitor/RumAlertTemplates.ts +46 -7
- package/Types/Monitor/SeriesContext/SeriesDebugHints.ts +596 -0
- package/Types/Monitor/SeriesContext/SeriesLabelDisplay.ts +554 -0
- package/Types/Monitor/ServiceAlertTemplates.ts +98 -11
- package/Types/Monitor/UptimeHistoryLabels.ts +56 -0
- package/Types/NotificationSetting/RoutineEmailEvents.ts +30 -0
- package/Types/Rum/SessionReplay.ts +209 -0
- package/Types/Rum/SessionReplayApi.ts +722 -0
- package/Types/Rum/SessionReplayCaptureTrigger.ts +21 -12
- package/Types/Rum/SessionReplayConsentMode.ts +11 -7
- package/Types/Rum/SessionReplayCustomEvents.ts +549 -0
- package/Types/Rum/SessionReplayHealth.ts +238 -0
- package/Types/Telemetry/TelemetryIngestSurface.ts +95 -0
- package/Types/Telemetry/TelemetryIngestionKeyPolicy.ts +75 -0
- package/Types/Telemetry/TelemetryIngestionKeyType.ts +29 -0
- package/Types/WebsiteRequest.ts +85 -3
- package/UI/Components/Charts/Area/AreaChart.tsx +13 -2
- package/UI/Components/Charts/Bar/BarChart.tsx +6 -2
- package/UI/Components/Charts/Line/LineChart.tsx +13 -2
- package/UI/Components/Charts/Types/XAxis/XAxis.ts +29 -0
- package/UI/Components/Charts/Utils/DataPoint.ts +22 -3
- package/UI/Components/Charts/Utils/TimeAnnotation.ts +76 -9
- package/UI/Components/Charts/Utils/XAxis.ts +217 -0
- package/UI/Components/CustomFields/CustomFieldsDetail.tsx +143 -25
- package/UI/Components/CustomFields/MapFromCustomFieldInput.tsx +216 -0
- package/UI/Components/Graphs/DayUptimeGraph.tsx +173 -8
- package/UI/Components/Graphs/UptimeBarTooltip.tsx +22 -278
- package/UI/Components/Graphs/UptimeDaySummary.tsx +327 -0
- package/UI/Components/Header/Header.tsx +25 -9
- package/UI/Components/Header/IconDropdown/IconDropdownItem.tsx +10 -1
- package/UI/Components/Header/IconDropdown/IconDropdownMenu.tsx +6 -1
- package/UI/Components/Header/ProjectPicker/ProjectPicker.tsx +6 -1
- package/UI/Components/HeaderAlert/NotificationBell/NotificationBellDropdown.tsx +6 -1
- package/UI/Components/Icon/Icon.tsx +11 -0
- package/UI/Components/JSONTable/JSONTable.tsx +2 -2
- package/UI/Components/KeyboardShortcut/KeyboardShortcutsModal.tsx +125 -0
- package/UI/Components/KeyboardShortcut/Screenshots/README.md +19 -0
- package/UI/Components/KeyboardShortcut/Screenshots/keyboard-shortcuts-command-palette.png +0 -0
- package/UI/Components/KeyboardShortcut/Screenshots/keyboard-shortcuts-dialog-dark.png +0 -0
- package/UI/Components/KeyboardShortcut/Screenshots/keyboard-shortcuts-dialog.png +0 -0
- package/UI/Components/KeyboardShortcut/Screenshots/keyboard-shortcuts-help-menu.png +0 -0
- package/UI/Components/KeyboardShortcut/Screenshots/keyboard-shortcuts-narrow.png +0 -0
- package/UI/Components/ModelTable/Column.ts +15 -0
- package/UI/Components/Monitor/SeriesDebugCommandsViewer.tsx +64 -0
- package/UI/Components/Monitor/SeriesLabelsViewer.tsx +93 -0
- package/UI/Components/MonitorGraphs/Uptime.tsx +14 -2
- package/UI/Components/MonitorGraphs/UptimeBarDayModal.tsx +63 -10
- package/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.ts +44 -0
- package/UI/Components/StatusPage/ResourceGroupSection.tsx +40 -0
- package/UI/Components/Table/CellClassName.ts +81 -0
- package/UI/Components/Table/TableRow.tsx +20 -14
- package/UI/Components/Table/TableSkeletonRows.tsx +9 -9
- package/UI/Components/Table/Types/Column.ts +36 -0
- package/UI/Components/Tooltip/Tooltip.tsx +11 -1
- package/UI/Components/Workflow/ComponentsModal.tsx +60 -39
- package/UI/Components/Workflow/NodePlacement.ts +57 -0
- package/UI/Components/Workflow/Workflow.tsx +47 -18
- package/UI/Config.ts +15 -33
- package/UI/Utils/GlobalKeyboardShortcut.ts +208 -0
- package/UI/Utils/Telemetry/BrowserTelemetryConfig.ts +28 -0
- package/UI/Utils/Telemetry/Telemetry.ts +10 -8
- package/Utils/API.ts +129 -3
- package/Utils/HTTPResponseBodyReader.ts +221 -0
- package/Utils/NetworkDiscovery/DiscoveryScanStatus.ts +77 -0
- package/Utils/Rum/ChunkMath.ts +106 -0
- package/Utils/Rum/SessionReplayHealth.ts +732 -0
- package/Utils/Rum/SessionReplayStringMap.ts +226 -0
- package/Utils/Schema/ModelSchema.ts +1 -0
- package/Utils/StatusPage/ResourceSearch.ts +290 -0
- package/Utils/Telemetry/OriginAllowList.ts +355 -0
- package/Utils/Uptime/DayUptimeGraphUtil.ts +205 -0
- package/Utils/ValueFormatter.ts +35 -1
- package/build/dist/Models/AnalyticsModels/RumSession.js +102 -19
- package/build/dist/Models/AnalyticsModels/RumSession.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/RumSessionChunk.js +11 -9
- package/build/dist/Models/AnalyticsModels/RumSessionChunk.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertCustomField.js +79 -3
- package/build/dist/Models/DatabaseModels/AlertCustomField.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ApiKeyPermission.js +3 -27
- package/build/dist/Models/DatabaseModels/ApiKeyPermission.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentCustomField.js +79 -3
- package/build/dist/Models/DatabaseModels/IncidentCustomField.js.map +1 -1
- package/build/dist/Models/DatabaseModels/InventoryItemCustomField.js +79 -3
- package/build/dist/Models/DatabaseModels/InventoryItemCustomField.js.map +1 -1
- package/build/dist/Models/DatabaseModels/MonitorCustomField.js +79 -3
- package/build/dist/Models/DatabaseModels/MonitorCustomField.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyCustomField.js +79 -3
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyCustomField.js.map +1 -1
- package/build/dist/Models/DatabaseModels/RumApplication.js +6 -6
- package/build/dist/Models/DatabaseModels/RumApplication.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceCustomField.js +79 -3
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceCustomField.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageCustomField.js +79 -3
- package/build/dist/Models/DatabaseModels/StatusPageCustomField.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TeamCustomField.js +79 -3
- package/build/dist/Models/DatabaseModels/TeamCustomField.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TeamMember.js +0 -9
- package/build/dist/Models/DatabaseModels/TeamMember.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TeamMemberCustomField.js +79 -3
- package/build/dist/Models/DatabaseModels/TeamMemberCustomField.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TeamPermission.js +3 -24
- package/build/dist/Models/DatabaseModels/TeamPermission.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TelemetryIngestionKey.js +267 -0
- package/build/dist/Models/DatabaseModels/TelemetryIngestionKey.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserTelegram.js +0 -4
- package/build/dist/Models/DatabaseModels/UserTelegram.js.map +1 -1
- package/build/dist/Server/API/TelemetryAPI.js +769 -109
- package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
- package/build/dist/Server/API/UserNotificationSettingAPI.js +35 -0
- package/build/dist/Server/API/UserNotificationSettingAPI.js.map +1 -0
- package/build/dist/Server/API/UserTelegramAPI.js +28 -6
- package/build/dist/Server/API/UserTelegramAPI.js.map +1 -1
- package/build/dist/Server/EnvironmentConfig.js +29 -2
- package/build/dist/Server/EnvironmentConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791300000000-AddTelemetryIngestionKeyType.js +60 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791300000000-AddTelemetryIngestionKeyType.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791400000000-SessionReplayRecordEverySessionByDefault.js +53 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791400000000-SessionReplayRecordEverySessionByDefault.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791500000000-WidenCustomFieldDropdownOptions.js +82 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791500000000-WidenCustomFieldDropdownOptions.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791600000000-AddCustomFieldValueMapping.js +46 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791600000000-AddCustomFieldValueMapping.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +8 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Infrastructure/QueueWorker.js +19 -7
- package/build/dist/Server/Infrastructure/QueueWorker.js.map +1 -1
- package/build/dist/Server/Infrastructure/Semaphore.js +1 -0
- package/build/dist/Server/Infrastructure/Semaphore.js.map +1 -1
- package/build/dist/Server/Middleware/TelemetryIngest.js +315 -8
- package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
- package/build/dist/Server/Services/AccessTokenService.js +1 -0
- package/build/dist/Server/Services/AccessTokenService.js.map +1 -1
- package/build/dist/Server/Services/AlertCustomFieldService.js +93 -0
- package/build/dist/Server/Services/AlertCustomFieldService.js.map +1 -1
- package/build/dist/Server/Services/AlertService.js +34 -0
- package/build/dist/Server/Services/AlertService.js.map +1 -1
- package/build/dist/Server/Services/ApiKeyPermissionService.js +331 -28
- package/build/dist/Server/Services/ApiKeyPermissionService.js.map +1 -1
- package/build/dist/Server/Services/CustomFieldMappingService.js +614 -0
- package/build/dist/Server/Services/CustomFieldMappingService.js.map +1 -0
- package/build/dist/Server/Services/GlobalConfigService.js +133 -0
- package/build/dist/Server/Services/GlobalConfigService.js.map +1 -1
- package/build/dist/Server/Services/IncidentCustomFieldService.js +93 -0
- package/build/dist/Server/Services/IncidentCustomFieldService.js.map +1 -1
- package/build/dist/Server/Services/IncidentService.js +32 -0
- package/build/dist/Server/Services/IncidentService.js.map +1 -1
- package/build/dist/Server/Services/MetricService.js +163 -0
- package/build/dist/Server/Services/MetricService.js.map +1 -1
- package/build/dist/Server/Services/MonitorService.js +29 -0
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +79 -27
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ProjectService.js +22 -0
- package/build/dist/Server/Services/ProjectService.js.map +1 -1
- package/build/dist/Server/Services/RoutineEmailSettingsService.js +69 -0
- package/build/dist/Server/Services/RoutineEmailSettingsService.js.map +1 -0
- package/build/dist/Server/Services/RumSessionReplayViewService.js +86 -24
- package/build/dist/Server/Services/RumSessionReplayViewService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceCustomFieldService.js +93 -0
- package/build/dist/Server/Services/ScheduledMaintenanceCustomFieldService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceService.js +29 -0
- package/build/dist/Server/Services/ScheduledMaintenanceService.js.map +1 -1
- package/build/dist/Server/Services/TeamMemberService.js +62 -2
- package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
- package/build/dist/Server/Services/TeamPermissionService.js +166 -3
- package/build/dist/Server/Services/TeamPermissionService.js.map +1 -1
- package/build/dist/Server/Services/TelemetryIngestionKeyService.js +562 -18
- package/build/dist/Server/Services/TelemetryIngestionKeyService.js.map +1 -1
- package/build/dist/Server/Services/UserNotificationSettingService.js +26 -6
- package/build/dist/Server/Services/UserNotificationSettingService.js.map +1 -1
- package/build/dist/Server/Services/UserTelegramService.js +257 -4
- package/build/dist/Server/Services/UserTelegramService.js.map +1 -1
- package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
- package/build/dist/Server/Utils/APIKey/AccessPermission.js +2 -2
- package/build/dist/Server/Utils/APIKey/AccessPermission.js.map +1 -1
- package/build/dist/Server/Utils/CustomField/CustomFieldDefinitionMappingHooks.js +27 -0
- package/build/dist/Server/Utils/CustomField/CustomFieldDefinitionMappingHooks.js.map +1 -0
- package/build/dist/Server/Utils/CustomField/CustomFieldMappingRegistry.js +226 -0
- package/build/dist/Server/Utils/CustomField/CustomFieldMappingRegistry.js.map +1 -0
- package/build/dist/Server/Utils/CustomField/CustomFieldMappingValidator.js +189 -0
- package/build/dist/Server/Utils/CustomField/CustomFieldMappingValidator.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/EgressGuard.js +121 -7
- package/build/dist/Server/Utils/DataSource/EgressGuard.js.map +1 -1
- package/build/dist/Server/Utils/EmailRollup/EmailRollupConstants.js +38 -5
- package/build/dist/Server/Utils/EmailRollup/EmailRollupConstants.js.map +1 -1
- package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js +44 -2
- package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js.map +1 -1
- package/build/dist/Server/Utils/FrontendEnvironment.js +33 -0
- package/build/dist/Server/Utils/FrontendEnvironment.js.map +1 -0
- package/build/dist/Server/Utils/LogRedaction.js +20 -0
- package/build/dist/Server/Utils/LogRedaction.js.map +1 -1
- package/build/dist/Server/Utils/Logger.js +10 -0
- package/build/dist/Server/Utils/Logger.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js +287 -68
- package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.js +20 -4
- package/build/dist/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js +29 -6
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +88 -13
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js +22 -6
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +22 -0
- package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/SeriesContextEnricher.js +237 -0
- package/build/dist/Server/Utils/Monitor/SeriesContextEnricher.js.map +1 -0
- package/build/dist/Server/Utils/SSRFProtection.js +136 -9
- package/build/dist/Server/Utils/SSRFProtection.js.map +1 -1
- package/build/dist/Server/Utils/SessionReplay/SessionReplayGateCache.js +174 -89
- package/build/dist/Server/Utils/SessionReplay/SessionReplayGateCache.js.map +1 -1
- package/build/dist/Server/Utils/SessionReplay/SessionReplayHealthCounters.js +223 -0
- package/build/dist/Server/Utils/SessionReplay/SessionReplayHealthCounters.js.map +1 -0
- package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js +945 -164
- package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js.map +1 -1
- package/build/dist/Server/Utils/StartServer.js +3 -14
- package/build/dist/Server/Utils/StartServer.js.map +1 -1
- package/build/dist/Server/Utils/TelegramVerificationToken.js +129 -0
- package/build/dist/Server/Utils/TelegramVerificationToken.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/PinServiceName.js +163 -0
- package/build/dist/Server/Utils/Telemetry/PinServiceName.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/TelemetryFanInWriter.js +28 -15
- package/build/dist/Server/Utils/Telemetry/TelemetryFanInWriter.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.js +64 -0
- package/build/dist/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/TelemetryIngestionKeyRateLimiter.js +171 -0
- package/build/dist/Server/Utils/Telemetry/TelemetryIngestionKeyRateLimiter.js.map +1 -0
- package/build/dist/Server/Utils/VM/VMAPI.js.map +1 -1
- package/build/dist/Server/Utils/VM/VMRunner.js +780 -69
- package/build/dist/Server/Utils/VM/VMRunner.js.map +1 -1
- package/build/dist/Types/CustomField/CustomFieldMappingCatalog.js +60 -0
- package/build/dist/Types/CustomField/CustomFieldMappingCatalog.js.map +1 -0
- package/build/dist/Types/CustomField/CustomFieldMappingSourceResource.js +20 -0
- package/build/dist/Types/CustomField/CustomFieldMappingSourceResource.js.map +1 -0
- package/build/dist/Types/CustomField/CustomFieldValueMapping.js +141 -0
- package/build/dist/Types/CustomField/CustomFieldValueMapping.js.map +1 -0
- package/build/dist/Types/Icon/IconProp.js +1 -0
- package/build/dist/Types/Icon/IconProp.js.map +1 -1
- package/build/dist/Types/JSONFunctions.js +118 -37
- package/build/dist/Types/JSONFunctions.js.map +1 -1
- package/build/dist/Types/Monitor/CephAlertTemplates.js +130 -171
- package/build/dist/Types/Monitor/CephAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/DockerAlertTemplates.js +286 -121
- package/build/dist/Types/Monitor/DockerAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/DockerSwarmAlertTemplates.js +84 -105
- package/build/dist/Types/Monitor/DockerSwarmAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/HostAlertTemplates.js +250 -122
- package/build/dist/Types/Monitor/HostAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/IotAlertTemplates.js +81 -81
- package/build/dist/Types/Monitor/IotAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/KubernetesAlertTemplates.js +375 -215
- package/build/dist/Types/Monitor/KubernetesAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/KubernetesMetricCatalog.js +19 -19
- package/build/dist/Types/Monitor/KubernetesMetricCatalog.js.map +1 -1
- package/build/dist/Types/Monitor/PodmanAlertTemplates.js +104 -153
- package/build/dist/Types/Monitor/PodmanAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/ProxmoxAlertTemplates.js +156 -91
- package/build/dist/Types/Monitor/ProxmoxAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.js +67 -6
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js +38 -7
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.js +261 -0
- package/build/dist/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.js.map +1 -0
- package/build/dist/Types/Monitor/RumAlertTemplates.js +46 -7
- package/build/dist/Types/Monitor/RumAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/SeriesContext/SeriesDebugHints.js +422 -0
- package/build/dist/Types/Monitor/SeriesContext/SeriesDebugHints.js.map +1 -0
- package/build/dist/Types/Monitor/SeriesContext/SeriesLabelDisplay.js +441 -0
- package/build/dist/Types/Monitor/SeriesContext/SeriesLabelDisplay.js.map +1 -0
- package/build/dist/Types/Monitor/ServiceAlertTemplates.js +79 -15
- package/build/dist/Types/Monitor/ServiceAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/UptimeHistoryLabels.js +17 -0
- package/build/dist/Types/Monitor/UptimeHistoryLabels.js.map +1 -0
- package/build/dist/Types/NotificationSetting/RoutineEmailEvents.js +29 -0
- package/build/dist/Types/NotificationSetting/RoutineEmailEvents.js.map +1 -0
- package/build/dist/Types/Rum/SessionReplay.js +117 -0
- package/build/dist/Types/Rum/SessionReplay.js.map +1 -1
- package/build/dist/Types/Rum/SessionReplayApi.js +181 -0
- package/build/dist/Types/Rum/SessionReplayApi.js.map +1 -0
- package/build/dist/Types/Rum/SessionReplayCaptureTrigger.js +21 -12
- package/build/dist/Types/Rum/SessionReplayCaptureTrigger.js.map +1 -1
- package/build/dist/Types/Rum/SessionReplayConsentMode.js +11 -7
- package/build/dist/Types/Rum/SessionReplayConsentMode.js.map +1 -1
- package/build/dist/Types/Rum/SessionReplayCustomEvents.js +172 -0
- package/build/dist/Types/Rum/SessionReplayCustomEvents.js.map +1 -0
- package/build/dist/Types/Rum/SessionReplayHealth.js +37 -0
- package/build/dist/Types/Rum/SessionReplayHealth.js.map +1 -0
- package/build/dist/Types/Telemetry/TelemetryIngestSurface.js +85 -0
- package/build/dist/Types/Telemetry/TelemetryIngestSurface.js.map +1 -0
- package/build/dist/Types/Telemetry/TelemetryIngestionKeyPolicy.js +15 -0
- package/build/dist/Types/Telemetry/TelemetryIngestionKeyPolicy.js.map +1 -0
- package/build/dist/Types/Telemetry/TelemetryIngestionKeyType.js +30 -0
- package/build/dist/Types/Telemetry/TelemetryIngestionKeyType.js.map +1 -0
- package/build/dist/Types/WebsiteRequest.js +55 -3
- package/build/dist/Types/WebsiteRequest.js.map +1 -1
- package/build/dist/UI/Components/Charts/Area/AreaChart.js +13 -2
- package/build/dist/UI/Components/Charts/Area/AreaChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/Bar/BarChart.js +6 -2
- package/build/dist/UI/Components/Charts/Bar/BarChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/Line/LineChart.js +13 -2
- package/build/dist/UI/Components/Charts/Line/LineChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/Types/XAxis/XAxis.js.map +1 -1
- package/build/dist/UI/Components/Charts/Utils/DataPoint.js +15 -3
- package/build/dist/UI/Components/Charts/Utils/DataPoint.js.map +1 -1
- package/build/dist/UI/Components/Charts/Utils/TimeAnnotation.js +40 -9
- package/build/dist/UI/Components/Charts/Utils/TimeAnnotation.js.map +1 -1
- package/build/dist/UI/Components/Charts/Utils/XAxis.js +186 -0
- package/build/dist/UI/Components/Charts/Utils/XAxis.js.map +1 -1
- package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js +80 -6
- package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js.map +1 -1
- package/build/dist/UI/Components/CustomFields/MapFromCustomFieldInput.js +118 -0
- package/build/dist/UI/Components/CustomFields/MapFromCustomFieldInput.js.map +1 -0
- package/build/dist/UI/Components/Graphs/DayUptimeGraph.js +112 -7
- package/build/dist/UI/Components/Graphs/DayUptimeGraph.js.map +1 -1
- package/build/dist/UI/Components/Graphs/UptimeBarTooltip.js +5 -162
- package/build/dist/UI/Components/Graphs/UptimeBarTooltip.js.map +1 -1
- package/build/dist/UI/Components/Graphs/UptimeDaySummary.js +181 -0
- package/build/dist/UI/Components/Graphs/UptimeDaySummary.js.map +1 -0
- package/build/dist/UI/Components/Header/Header.js +2 -3
- package/build/dist/UI/Components/Header/Header.js.map +1 -1
- package/build/dist/UI/Components/Header/IconDropdown/IconDropdownItem.js +2 -1
- package/build/dist/UI/Components/Header/IconDropdown/IconDropdownItem.js.map +1 -1
- package/build/dist/UI/Components/Header/IconDropdown/IconDropdownMenu.js +7 -1
- package/build/dist/UI/Components/Header/IconDropdown/IconDropdownMenu.js.map +1 -1
- package/build/dist/UI/Components/Header/ProjectPicker/ProjectPicker.js +7 -1
- package/build/dist/UI/Components/Header/ProjectPicker/ProjectPicker.js.map +1 -1
- package/build/dist/UI/Components/HeaderAlert/NotificationBell/NotificationBellDropdown.js +7 -1
- package/build/dist/UI/Components/HeaderAlert/NotificationBell/NotificationBellDropdown.js.map +1 -1
- package/build/dist/UI/Components/Icon/Icon.js +5 -0
- package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
- package/build/dist/UI/Components/JSONTable/JSONTable.js +2 -2
- package/build/dist/UI/Components/JSONTable/JSONTable.js.map +1 -1
- package/build/dist/UI/Components/KeyboardShortcut/KeyboardShortcutsModal.js +35 -0
- package/build/dist/UI/Components/KeyboardShortcut/KeyboardShortcutsModal.js.map +1 -0
- package/build/dist/UI/Components/Monitor/SeriesDebugCommandsViewer.js +34 -0
- package/build/dist/UI/Components/Monitor/SeriesDebugCommandsViewer.js.map +1 -0
- package/build/dist/UI/Components/Monitor/SeriesLabelsViewer.js +49 -0
- package/build/dist/UI/Components/Monitor/SeriesLabelsViewer.js.map +1 -0
- package/build/dist/UI/Components/MonitorGraphs/Uptime.js +1 -1
- package/build/dist/UI/Components/MonitorGraphs/Uptime.js.map +1 -1
- package/build/dist/UI/Components/MonitorGraphs/UptimeBarDayModal.js +32 -6
- package/build/dist/UI/Components/MonitorGraphs/UptimeBarDayModal.js.map +1 -1
- package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js +38 -0
- package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js.map +1 -1
- package/build/dist/UI/Components/StatusPage/ResourceGroupSection.js +22 -1
- package/build/dist/UI/Components/StatusPage/ResourceGroupSection.js.map +1 -1
- package/build/dist/UI/Components/Table/CellClassName.js +55 -0
- package/build/dist/UI/Components/Table/CellClassName.js.map +1 -0
- package/build/dist/UI/Components/Table/TableRow.js +16 -13
- package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
- package/build/dist/UI/Components/Table/TableSkeletonRows.js +9 -8
- package/build/dist/UI/Components/Table/TableSkeletonRows.js.map +1 -1
- package/build/dist/UI/Components/Tooltip/Tooltip.js +25 -1
- package/build/dist/UI/Components/Tooltip/Tooltip.js.map +1 -1
- package/build/dist/UI/Components/Workflow/ComponentsModal.js +47 -30
- package/build/dist/UI/Components/Workflow/ComponentsModal.js.map +1 -1
- package/build/dist/UI/Components/Workflow/NodePlacement.js +37 -0
- package/build/dist/UI/Components/Workflow/NodePlacement.js.map +1 -0
- package/build/dist/UI/Components/Workflow/Workflow.js +35 -18
- package/build/dist/UI/Components/Workflow/Workflow.js.map +1 -1
- package/build/dist/UI/Config.js +10 -20
- package/build/dist/UI/Config.js.map +1 -1
- package/build/dist/UI/Utils/GlobalKeyboardShortcut.js +138 -0
- package/build/dist/UI/Utils/GlobalKeyboardShortcut.js.map +1 -0
- package/build/dist/UI/Utils/Telemetry/BrowserTelemetryConfig.js +14 -0
- package/build/dist/UI/Utils/Telemetry/BrowserTelemetryConfig.js.map +1 -0
- package/build/dist/UI/Utils/Telemetry/Telemetry.js +7 -5
- package/build/dist/UI/Utils/Telemetry/Telemetry.js.map +1 -1
- package/build/dist/Utils/API.js +67 -5
- package/build/dist/Utils/API.js.map +1 -1
- package/build/dist/Utils/HTTPResponseBodyReader.js +157 -0
- package/build/dist/Utils/HTTPResponseBodyReader.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/DiscoveryScanStatus.js +69 -0
- package/build/dist/Utils/NetworkDiscovery/DiscoveryScanStatus.js.map +1 -0
- package/build/dist/Utils/Rum/ChunkMath.js +76 -0
- package/build/dist/Utils/Rum/ChunkMath.js.map +1 -1
- package/build/dist/Utils/Rum/SessionReplayHealth.js +534 -0
- package/build/dist/Utils/Rum/SessionReplayHealth.js.map +1 -0
- package/build/dist/Utils/Rum/SessionReplayStringMap.js +165 -0
- package/build/dist/Utils/Rum/SessionReplayStringMap.js.map +1 -0
- package/build/dist/Utils/Schema/ModelSchema.js +1 -0
- package/build/dist/Utils/Schema/ModelSchema.js.map +1 -1
- package/build/dist/Utils/StatusPage/ResourceSearch.js +200 -0
- package/build/dist/Utils/StatusPage/ResourceSearch.js.map +1 -0
- package/build/dist/Utils/Telemetry/OriginAllowList.js +299 -0
- package/build/dist/Utils/Telemetry/OriginAllowList.js.map +1 -0
- package/build/dist/Utils/Uptime/DayUptimeGraphUtil.js +147 -0
- package/build/dist/Utils/Uptime/DayUptimeGraphUtil.js.map +1 -0
- package/build/dist/Utils/ValueFormatter.js +32 -1
- package/build/dist/Utils/ValueFormatter.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,722 @@
|
|
|
1
|
+
import {
|
|
2
|
+
SessionReplayChunkManifestEntry,
|
|
3
|
+
SessionReplayGap,
|
|
4
|
+
} from "./SessionReplay";
|
|
5
|
+
|
|
6
|
+
/*
|
|
7
|
+
* Wire contract between the Dashboard and the session-replay read routes
|
|
8
|
+
* in Common/Server/API/TelemetryAPI.ts (/list, /manifest, /chunks,
|
|
9
|
+
* /heartbeat, /views, /for-exception, /ingest-status). Everything here is
|
|
10
|
+
* the JSON as it
|
|
11
|
+
* crosses HTTP, which is why:
|
|
12
|
+
*
|
|
13
|
+
* - Dates are ISO-8601 STRINGS. The server builds Date objects
|
|
14
|
+
* (SessionReplayReadService) and Response.sendJsonObjectResponse
|
|
15
|
+
* serialises them; the Dashboard parsers have always read them back
|
|
16
|
+
* as strings (parseSessionReplaySummary). The *UnixMs numbers are
|
|
17
|
+
* additive siblings so the player can do clock arithmetic without
|
|
18
|
+
* re-parsing.
|
|
19
|
+
* - Every field added after the first release is OPTIONAL. The Dashboard
|
|
20
|
+
* is deployed with the server, but a manifest fixture, a cached
|
|
21
|
+
* response, or a self-hosted install mid-rollout can still present
|
|
22
|
+
* the old shape, and a parser that throws on a missing engagement
|
|
23
|
+
* counter would take the whole player down over a column that adds a
|
|
24
|
+
* badge. Absence means "not measured", and the UI renders that as
|
|
25
|
+
* unknown rather than 0.
|
|
26
|
+
* - Nothing here is a class. The Dashboard reads rows off untyped
|
|
27
|
+
* JSONObject bodies with the readDto* helpers at the bottom, which
|
|
28
|
+
* carry the same defensive semantics the player and table parsers
|
|
29
|
+
* were written with (UInt8 booleans as 0/1/"1", numeric strings).
|
|
30
|
+
*/
|
|
31
|
+
|
|
32
|
+
/* ---- /list ---- */
|
|
33
|
+
|
|
34
|
+
/*
|
|
35
|
+
* Sort keys the list accepts. "frustration" sorts by the sum of the four
|
|
36
|
+
* frustration counters, which is what the Frustration quick filter shows.
|
|
37
|
+
*/
|
|
38
|
+
export type SessionReplaySortBy =
|
|
39
|
+
| "startTime"
|
|
40
|
+
| "durationMs"
|
|
41
|
+
| "errorCount"
|
|
42
|
+
| "frustration";
|
|
43
|
+
|
|
44
|
+
export const SESSION_REPLAY_SORT_BY_VALUES: ReadonlyArray<SessionReplaySortBy> =
|
|
45
|
+
["startTime", "durationMs", "errorCount", "frustration"];
|
|
46
|
+
|
|
47
|
+
/*
|
|
48
|
+
* Keyset cursor for the sorted list. sortValue is the numeric sort key of
|
|
49
|
+
* the last row on the previous page (unix ms for startTime, a count or a
|
|
50
|
+
* duration otherwise) and sessionId is the tiebreak.
|
|
51
|
+
*/
|
|
52
|
+
export interface SessionReplaySortedListCursorDto {
|
|
53
|
+
sortBy: SessionReplaySortBy;
|
|
54
|
+
sortValue: number;
|
|
55
|
+
sessionId: string;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/*
|
|
59
|
+
* The cursor shape the list has emitted since its first release. Still
|
|
60
|
+
* accepted (as sortBy: "startTime") so a bookmarked page and an older
|
|
61
|
+
* Dashboard keep paging; still emitted when sortBy is startTime so an
|
|
62
|
+
* older Dashboard can read the response.
|
|
63
|
+
*/
|
|
64
|
+
export interface SessionReplayLegacyListCursorDto {
|
|
65
|
+
startTimeUnixMs: number;
|
|
66
|
+
sessionId: string;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export type SessionReplayListCursorDto =
|
|
70
|
+
| SessionReplaySortedListCursorDto
|
|
71
|
+
| SessionReplayLegacyListCursorDto;
|
|
72
|
+
|
|
73
|
+
export interface SessionReplayListFiltersDto {
|
|
74
|
+
hasError?: boolean;
|
|
75
|
+
hasFrustration?: boolean;
|
|
76
|
+
isFinalized?: boolean;
|
|
77
|
+
triggerReasons?: Array<string>;
|
|
78
|
+
browserNames?: Array<string>;
|
|
79
|
+
osNames?: Array<string>;
|
|
80
|
+
deviceTypes?: Array<string>;
|
|
81
|
+
countryCodes?: Array<string>;
|
|
82
|
+
/*
|
|
83
|
+
* The end-user reference the customer's page supplied; the server hashes
|
|
84
|
+
* it. Silently dropped server-side unless the caller holds the identity
|
|
85
|
+
* permission, and a 400 when unusable.
|
|
86
|
+
*/
|
|
87
|
+
identifiedUserRef?: string;
|
|
88
|
+
/* An already-derived digest, for API callers that hold one. */
|
|
89
|
+
identifiedUserKey?: string;
|
|
90
|
+
/* Exact route match against the routes array. */
|
|
91
|
+
route?: string;
|
|
92
|
+
minDurationMs?: number;
|
|
93
|
+
|
|
94
|
+
/* ---- Additive filters. ---- */
|
|
95
|
+
|
|
96
|
+
/*
|
|
97
|
+
* Free text, capped at SESSION_REPLAY_LIST_SEARCH_MAX_LENGTH: sessionId
|
|
98
|
+
* prefix, entry/exit URL and routes substring, exact trace id, and the
|
|
99
|
+
* identified user label when the caller may read it. The server refuses
|
|
100
|
+
* a search over more than SESSION_REPLAY_LIST_SEARCH_MAX_WINDOW_DAYS.
|
|
101
|
+
*/
|
|
102
|
+
search?: string;
|
|
103
|
+
/* startsWith over routes and the entry URL: "/checkout", or a full URL. */
|
|
104
|
+
urlPrefix?: string;
|
|
105
|
+
/* Every pair must match (hasAll over the session's tag map). */
|
|
106
|
+
tags?: Record<string, string>;
|
|
107
|
+
hasIdentifiedUser?: boolean;
|
|
108
|
+
/* (not finalized OR has chunks) AND not recording-lost. */
|
|
109
|
+
isPlayable?: boolean;
|
|
110
|
+
hasTraces?: boolean;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
export interface SessionReplayListRequestDto {
|
|
114
|
+
rumApplicationId: string;
|
|
115
|
+
/* ISO-8601. Defaults server-side to the past 7 days. */
|
|
116
|
+
startTime?: string;
|
|
117
|
+
endTime?: string;
|
|
118
|
+
filters?: SessionReplayListFiltersDto;
|
|
119
|
+
limit?: number;
|
|
120
|
+
cursor?: SessionReplayListCursorDto;
|
|
121
|
+
/* Additive. Absent means "startTime", which is what the list always did. */
|
|
122
|
+
sortBy?: SessionReplaySortBy;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
export interface SessionReplayListItemDto {
|
|
126
|
+
sessionId: string;
|
|
127
|
+
rumApplicationId: string;
|
|
128
|
+
/* ISO-8601, server-clamped. */
|
|
129
|
+
startTime: string;
|
|
130
|
+
endTime: string;
|
|
131
|
+
durationMs: number;
|
|
132
|
+
isFinalized: boolean;
|
|
133
|
+
sealedReason: string;
|
|
134
|
+
chunkCount: number;
|
|
135
|
+
maxChunkIndex: number;
|
|
136
|
+
missingChunkCount: number;
|
|
137
|
+
eventCount: number;
|
|
138
|
+
payloadBytes: number;
|
|
139
|
+
hasError: boolean;
|
|
140
|
+
errorCount: number;
|
|
141
|
+
rageClickCount: number;
|
|
142
|
+
deadClickCount: number;
|
|
143
|
+
errorClickCount: number;
|
|
144
|
+
refreshRageCount: number;
|
|
145
|
+
pageCount: number;
|
|
146
|
+
triggerReason: string;
|
|
147
|
+
entryUrl: string;
|
|
148
|
+
exitUrl: string;
|
|
149
|
+
browserName: string;
|
|
150
|
+
browserVersion: string;
|
|
151
|
+
osName: string;
|
|
152
|
+
deviceType: string;
|
|
153
|
+
countryCode: string;
|
|
154
|
+
viewportWidth: number;
|
|
155
|
+
viewportHeight: number;
|
|
156
|
+
identifiedUserKey: string;
|
|
157
|
+
/* Present only when the caller holds the narrower identity permission. */
|
|
158
|
+
identifiedUserLabel?: string;
|
|
159
|
+
samplePercentageAtCapture: number;
|
|
160
|
+
|
|
161
|
+
/* ---- Additive projections. ---- */
|
|
162
|
+
|
|
163
|
+
/* First 5 routes, in order. */
|
|
164
|
+
routes?: Array<string>;
|
|
165
|
+
/* length(traceIds) - the header keeps at most 50 ids. */
|
|
166
|
+
traceCount?: number;
|
|
167
|
+
exceptionGroupCount?: number;
|
|
168
|
+
clickCount?: number;
|
|
169
|
+
/* Sum of chunk spans that carried user activity; 0 until finalized. */
|
|
170
|
+
activeMs?: number;
|
|
171
|
+
/* Offset of the first chunk with an error; 0 when there is none. */
|
|
172
|
+
firstErrorOffsetMs?: number;
|
|
173
|
+
/* argMax(retentionDate) as unix ms; drives "expires in 6d". */
|
|
174
|
+
expiresAtUnixMs?: number;
|
|
175
|
+
tags?: Record<string, string>;
|
|
176
|
+
startTimeUnixMs?: number;
|
|
177
|
+
endTimeUnixMs?: number;
|
|
178
|
+
/* Identity-gated like identifiedUserLabel. */
|
|
179
|
+
identifiedUserTraits?: Record<string, string>;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
export interface SessionReplayListResponseDto {
|
|
183
|
+
sessions: Array<SessionReplayListItemDto>;
|
|
184
|
+
nextCursor: SessionReplayListCursorDto | null;
|
|
185
|
+
/*
|
|
186
|
+
* Additive. Filter keys the server accepted the request WITH but did not
|
|
187
|
+
* apply - today identifiedUserRef/identifiedUserKey, which are dropped
|
|
188
|
+
* when the caller does not hold the narrower identity permission. The
|
|
189
|
+
* list turns this into "your user filter was ignored": a silently
|
|
190
|
+
* dropped filter shows a wider set of rows as if it were the filtered
|
|
191
|
+
* one, which is the worst possible answer in an evidence tool. Absent
|
|
192
|
+
* (rather than []) on a server that predates the field, which the
|
|
193
|
+
* Dashboard reads as "nothing known to have been dropped".
|
|
194
|
+
*/
|
|
195
|
+
ignoredFilters?: Array<string>;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/* ---- /manifest ---- */
|
|
199
|
+
|
|
200
|
+
export interface SessionReplayManifestRequestDto {
|
|
201
|
+
sessionId: string;
|
|
202
|
+
/*
|
|
203
|
+
* Additive disambiguator. A session id is minted in the browser and can,
|
|
204
|
+
* rarely, be seen under two applications of one project (a copied tab,
|
|
205
|
+
* a re-used identifier); the server refuses to guess between them, so
|
|
206
|
+
* the player sends the application it is looking at.
|
|
207
|
+
*/
|
|
208
|
+
rumApplicationId?: string;
|
|
209
|
+
/* Audit fields, written to the view row. */
|
|
210
|
+
accessReason?: string;
|
|
211
|
+
linkedIncidentId?: string;
|
|
212
|
+
linkedExceptionFingerprint?: string;
|
|
213
|
+
/*
|
|
214
|
+
* Additive. A live-session poll: when true and viewId names a view row
|
|
215
|
+
* that belongs to this caller and session, the server SKIPS recordView
|
|
216
|
+
* and echoes the same viewId, so polling writes one audit row per view
|
|
217
|
+
* rather than one per 30s. A mismatch falls back to a fresh recordView.
|
|
218
|
+
*/
|
|
219
|
+
isRefresh?: boolean;
|
|
220
|
+
viewId?: string;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/* ---- /chunks ---- */
|
|
224
|
+
|
|
225
|
+
export interface SessionReplayChunksRequestDto {
|
|
226
|
+
sessionId: string;
|
|
227
|
+
tabId: string;
|
|
228
|
+
/* At most MAX_SESSION_REPLAY_CHUNKS_PER_READ indexes, ascending. */
|
|
229
|
+
chunkIndexes: Array<number>;
|
|
230
|
+
/* Same disambiguator as the manifest request. */
|
|
231
|
+
rumApplicationId?: string;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
/*
|
|
235
|
+
* Response header on /chunks, comma-separated ascending indexes: chunks
|
|
236
|
+
* that EXIST and were asked for, but did not fit this body under
|
|
237
|
+
* MAX_SESSION_REPLAY_READ_BYTES. Absent when nothing was left out.
|
|
238
|
+
*
|
|
239
|
+
* A loader that reads their absence as missing footage would draw a hole
|
|
240
|
+
* in a recording that is whole; the honest response is to ask for them
|
|
241
|
+
* again in a smaller page. Named here so the server that sets it and the
|
|
242
|
+
* loader that reads it quote one string.
|
|
243
|
+
*/
|
|
244
|
+
export const SESSION_REPLAY_OMITTED_CHUNKS_HEADER: string =
|
|
245
|
+
"X-OneUptime-Replay-Omitted-Chunks";
|
|
246
|
+
|
|
247
|
+
/* ---- Read failures ---- */
|
|
248
|
+
|
|
249
|
+
/*
|
|
250
|
+
* The read routes answer 404 with a message whose PREFIX carries the
|
|
251
|
+
* reason, because the three reasons need three different screens and an
|
|
252
|
+
* HTTP status cannot tell them apart: a recording that aged out under
|
|
253
|
+
* retention (and whose signals may still exist in logs and traces), one
|
|
254
|
+
* erased by a data-subject request (which will never come back), and an
|
|
255
|
+
* id that was never recorded in this project. classifyManifestFailure in
|
|
256
|
+
* the Dashboard branches on exactly these; they live here so neither side
|
|
257
|
+
* invents a fourth spelling.
|
|
258
|
+
*/
|
|
259
|
+
export const SESSION_REPLAY_READ_ERROR_PREFIX_EXPIRED: string = "expired:";
|
|
260
|
+
export const SESSION_REPLAY_READ_ERROR_PREFIX_ERASED: string = "erased:";
|
|
261
|
+
export const SESSION_REPLAY_READ_ERROR_PREFIX_NOT_FOUND: string = "not-found:";
|
|
262
|
+
|
|
263
|
+
export const SESSION_REPLAY_READ_ERROR_PREFIXES: ReadonlyArray<string> = [
|
|
264
|
+
SESSION_REPLAY_READ_ERROR_PREFIX_EXPIRED,
|
|
265
|
+
SESSION_REPLAY_READ_ERROR_PREFIX_ERASED,
|
|
266
|
+
SESSION_REPLAY_READ_ERROR_PREFIX_NOT_FOUND,
|
|
267
|
+
];
|
|
268
|
+
|
|
269
|
+
/*
|
|
270
|
+
* The session header exactly as SessionReplayReadService.getSessionHeader
|
|
271
|
+
* builds it, serialised. The identity fields and the engagement counters
|
|
272
|
+
* are additive.
|
|
273
|
+
*/
|
|
274
|
+
export interface SessionReplayManifestHeaderDto {
|
|
275
|
+
sessionId: string;
|
|
276
|
+
projectId: string;
|
|
277
|
+
rumApplicationId: string;
|
|
278
|
+
startTime: string;
|
|
279
|
+
endTime: string;
|
|
280
|
+
durationMs: number;
|
|
281
|
+
isFinalized: boolean;
|
|
282
|
+
sealedReason: string;
|
|
283
|
+
chunkCount: number;
|
|
284
|
+
maxChunkIndex: number;
|
|
285
|
+
missingChunkCount: number;
|
|
286
|
+
eventCount: number;
|
|
287
|
+
payloadBytes: number;
|
|
288
|
+
hasError: boolean;
|
|
289
|
+
errorCount: number;
|
|
290
|
+
rageClickCount: number;
|
|
291
|
+
deadClickCount: number;
|
|
292
|
+
errorClickCount: number;
|
|
293
|
+
refreshRageCount: number;
|
|
294
|
+
pageCount: number;
|
|
295
|
+
triggerReason: string;
|
|
296
|
+
maskingMode: string;
|
|
297
|
+
consentState: string;
|
|
298
|
+
recorderKind: string;
|
|
299
|
+
recorderVersion: string;
|
|
300
|
+
rrwebVersion: string;
|
|
301
|
+
schemaVersion: number;
|
|
302
|
+
wireVersion: number;
|
|
303
|
+
entryUrl: string;
|
|
304
|
+
exitUrl: string;
|
|
305
|
+
routes: Array<string>;
|
|
306
|
+
browserName: string;
|
|
307
|
+
browserVersion: string;
|
|
308
|
+
osName: string;
|
|
309
|
+
deviceType: string;
|
|
310
|
+
countryCode: string;
|
|
311
|
+
viewportWidth: number;
|
|
312
|
+
viewportHeight: number;
|
|
313
|
+
fidelityNotices: Array<string>;
|
|
314
|
+
fullSnapshotChunkIndexes: Array<number>;
|
|
315
|
+
traceIds: Array<string>;
|
|
316
|
+
exceptionFingerprints: Array<string>;
|
|
317
|
+
/* Client-minus-server, positive when the device runs ahead. */
|
|
318
|
+
clockSkewMs: number;
|
|
319
|
+
|
|
320
|
+
/* ---- Additive. ---- */
|
|
321
|
+
|
|
322
|
+
/*
|
|
323
|
+
* The session clock. Every telemetry row is placed on the timeline as
|
|
324
|
+
* rowUnixMs - startTimeUnixMs, so this is a number rather than a
|
|
325
|
+
* re-parsed ISO string.
|
|
326
|
+
*/
|
|
327
|
+
startTimeUnixMs?: number;
|
|
328
|
+
endTimeUnixMs?: number;
|
|
329
|
+
/* The recorder's own start clock, before clamping. */
|
|
330
|
+
clientReportedStartUnixMs?: number;
|
|
331
|
+
tags?: Record<string, string>;
|
|
332
|
+
expiresAtUnixMs?: number;
|
|
333
|
+
clickCount?: number;
|
|
334
|
+
customEventCount?: number;
|
|
335
|
+
activeMs?: number;
|
|
336
|
+
firstErrorOffsetMs?: number;
|
|
337
|
+
/* Both present ONLY when the identity permission check passes. */
|
|
338
|
+
identifiedUserLabel?: string;
|
|
339
|
+
identifiedUserTraits?: Record<string, string>;
|
|
340
|
+
/*
|
|
341
|
+
* From chunk 0's envelope, so the player can say what an older recorder
|
|
342
|
+
* could not capture. Empty for recordings that predate the field.
|
|
343
|
+
*/
|
|
344
|
+
recorderCapabilities?: Array<string>;
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
export interface SessionReplayManifestTabDto {
|
|
348
|
+
tabId: string;
|
|
349
|
+
chunks: Array<SessionReplayChunkManifestEntry>;
|
|
350
|
+
chunkIndexes: Array<number>;
|
|
351
|
+
fullSnapshotChunkIndexes: Array<number>;
|
|
352
|
+
gaps: Array<SessionReplayGap>;
|
|
353
|
+
maxChunkIndex: number;
|
|
354
|
+
totalPayloadBytes: number;
|
|
355
|
+
/*
|
|
356
|
+
* Additive. Where this tab's footage begins on the session clock, so the
|
|
357
|
+
* tab pill can say "Tab 2 - 30s (opened 2:14)".
|
|
358
|
+
*/
|
|
359
|
+
firstChunkStartOffsetMs?: number;
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
export interface SessionReplayManifestResponseDto {
|
|
363
|
+
/* The audit row this read created; null only if no row could be made. */
|
|
364
|
+
viewId: string | null;
|
|
365
|
+
header: SessionReplayManifestHeaderDto;
|
|
366
|
+
tabs: Array<SessionReplayManifestTabDto>;
|
|
367
|
+
isChunkIndexTruncated: boolean;
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
/* ---- /heartbeat ---- */
|
|
371
|
+
|
|
372
|
+
export interface SessionReplayHeartbeatRequestDto {
|
|
373
|
+
viewId: string;
|
|
374
|
+
secondsWatched: number;
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
export interface SessionReplayHeartbeatResponseDto {
|
|
378
|
+
/* Floored to the 15s cadence server-side. */
|
|
379
|
+
secondsWatched: number;
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
/* ---- /views ---- */
|
|
383
|
+
|
|
384
|
+
/*
|
|
385
|
+
* "Who watched this recording". Every manifest read has written an audit
|
|
386
|
+
* row since the feature shipped; this route is what finally shows them,
|
|
387
|
+
* so a viewer can see that a colleague already watched (and why) instead
|
|
388
|
+
* of watching a customer's session a second time. Behind the payload
|
|
389
|
+
* permission, not the list permission: the viewer list is a fact about a
|
|
390
|
+
* recording of a real person and belongs to the people who may watch it.
|
|
391
|
+
*/
|
|
392
|
+
export interface SessionReplayViewsRequestDto {
|
|
393
|
+
sessionId: string;
|
|
394
|
+
/*
|
|
395
|
+
* Same disambiguator as the manifest request - a session id is only
|
|
396
|
+
* unique within one application, and the server refuses to guess.
|
|
397
|
+
*/
|
|
398
|
+
rumApplicationId?: string;
|
|
399
|
+
/* Server-capped; asking for more returns the cap, not an error. */
|
|
400
|
+
limit?: number;
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
/*
|
|
404
|
+
* The viewer, as the route projects them off the joined user row. The
|
|
405
|
+
* whole object is null for a view whose user was deleted since: the audit
|
|
406
|
+
* row outlives the account, and dropping the view would understate who
|
|
407
|
+
* has seen the recording. name/email are "" rather than null when the
|
|
408
|
+
* user row carries no value, so the header can render one branch.
|
|
409
|
+
*/
|
|
410
|
+
export interface SessionReplayViewerDto {
|
|
411
|
+
id: string | null;
|
|
412
|
+
name: string;
|
|
413
|
+
email: string;
|
|
414
|
+
profilePictureId: string | null;
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
export interface SessionReplayViewDto {
|
|
418
|
+
/* The audit row's id; null only when the row could not be serialised. */
|
|
419
|
+
id: string | null;
|
|
420
|
+
/* ISO-8601, null when the row carries no timestamp. */
|
|
421
|
+
viewedAt: string | null;
|
|
422
|
+
/*
|
|
423
|
+
* Floored to the 15s heartbeat cadence. 0 is a REAL measurement here -
|
|
424
|
+
* a view that opened the player and never got a heartbeat in - so the
|
|
425
|
+
* header says "opened, not watched" rather than hiding the row.
|
|
426
|
+
*/
|
|
427
|
+
secondsWatched: number;
|
|
428
|
+
/* Free text the reader gave ("incident-1234"); "" when they gave none. */
|
|
429
|
+
accessReason: string;
|
|
430
|
+
viewedByUserId: string | null;
|
|
431
|
+
viewedByUser: SessionReplayViewerDto | null;
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
export interface SessionReplayViewsResponseDto {
|
|
435
|
+
views: Array<SessionReplayViewDto>;
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
/* ---- /for-exception ---- */
|
|
439
|
+
|
|
440
|
+
export interface SessionReplayForExceptionRequestDto {
|
|
441
|
+
fingerprint: string;
|
|
442
|
+
/* ISO-8601 bounds; without them the server defaults to a 30-day window. */
|
|
443
|
+
startTime?: string;
|
|
444
|
+
endTime?: string;
|
|
445
|
+
limit?: number;
|
|
446
|
+
/*
|
|
447
|
+
* Additive. Pin the lookup to the session the exception instance itself
|
|
448
|
+
* carried, so the card lands on THIS occurrence's recording rather than
|
|
449
|
+
* on whichever session of the group sorted first.
|
|
450
|
+
*/
|
|
451
|
+
sessionId?: string;
|
|
452
|
+
/*
|
|
453
|
+
* Additive. The instance's own time in unix ms; the server derives the
|
|
454
|
+
* partition window from it, so the card never scans the whole project.
|
|
455
|
+
*/
|
|
456
|
+
errorTimeUnixMs?: number;
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
export interface SessionReplayExceptionSessionDto {
|
|
460
|
+
sessionId: string;
|
|
461
|
+
rumApplicationId: string;
|
|
462
|
+
startTime: string;
|
|
463
|
+
endTime: string;
|
|
464
|
+
durationMs: number;
|
|
465
|
+
hasError: boolean;
|
|
466
|
+
errorCount: number;
|
|
467
|
+
rageClickCount: number;
|
|
468
|
+
deadClickCount: number;
|
|
469
|
+
errorClickCount: number;
|
|
470
|
+
refreshRageCount: number;
|
|
471
|
+
maskingMode: string;
|
|
472
|
+
triggerReason: string;
|
|
473
|
+
entryUrl: string;
|
|
474
|
+
browserName: string;
|
|
475
|
+
osName: string;
|
|
476
|
+
deviceType: string;
|
|
477
|
+
isFinalized: boolean;
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
export interface SessionReplayForExceptionResponseDto {
|
|
481
|
+
sessions: Array<SessionReplayExceptionSessionDto>;
|
|
482
|
+
/* The accessible-application scan has a ceiling; true when it was hit. */
|
|
483
|
+
isApplicationScopeTruncated: boolean;
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
/* ---- /ingest-status ---- */
|
|
487
|
+
|
|
488
|
+
export interface SessionReplayIngestStatusRequestDto {
|
|
489
|
+
rumApplicationId: string;
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
/*
|
|
493
|
+
* The response is the wire form of RecordingHealthStatus; see
|
|
494
|
+
* Common/Types/Rum/SessionReplayHealth.ts, which owns it because the
|
|
495
|
+
* health diagnosis is the only consumer.
|
|
496
|
+
*/
|
|
497
|
+
|
|
498
|
+
/* ---- Defensive row readers shared by the Dashboard parsers. ---- */
|
|
499
|
+
|
|
500
|
+
/*
|
|
501
|
+
* Every route above answers a hand-written ClickHouse projection, not a
|
|
502
|
+
* model serialisation, so nothing is trusted: numbers may arrive as
|
|
503
|
+
* strings (ClickHouse quotes 64-bit integers in JSON), UInt8 booleans as
|
|
504
|
+
* 0/1 or "0"/"1", and any field may be absent on an older server.
|
|
505
|
+
*/
|
|
506
|
+
|
|
507
|
+
/* A finite number, or 0. Use readDtoOptionalNumber when 0 would be a lie. */
|
|
508
|
+
export function readDtoNumber(
|
|
509
|
+
row: Record<string, unknown>,
|
|
510
|
+
key: string,
|
|
511
|
+
): number {
|
|
512
|
+
const parsed: number = Number(row[key]);
|
|
513
|
+
|
|
514
|
+
return Number.isFinite(parsed) ? parsed : 0;
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
/*
|
|
518
|
+
* A finite number, or undefined when the field is absent, null, or not a
|
|
519
|
+
* number. This is the reader for every additive counter: "not measured"
|
|
520
|
+
* must stay distinguishable from "measured as zero" all the way to the UI.
|
|
521
|
+
*/
|
|
522
|
+
export function readDtoOptionalNumber(
|
|
523
|
+
row: Record<string, unknown>,
|
|
524
|
+
key: string,
|
|
525
|
+
): number | undefined {
|
|
526
|
+
const value: unknown = row[key];
|
|
527
|
+
|
|
528
|
+
if (value === null || value === undefined || value === "") {
|
|
529
|
+
return undefined;
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
const parsed: number = Number(value);
|
|
533
|
+
|
|
534
|
+
return Number.isFinite(parsed) ? parsed : undefined;
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
export function readDtoString(
|
|
538
|
+
row: Record<string, unknown>,
|
|
539
|
+
key: string,
|
|
540
|
+
): string {
|
|
541
|
+
const value: unknown = row[key];
|
|
542
|
+
|
|
543
|
+
return value === null || value === undefined ? "" : String(value);
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
/* A non-empty string, or undefined. */
|
|
547
|
+
export function readDtoOptionalString(
|
|
548
|
+
row: Record<string, unknown>,
|
|
549
|
+
key: string,
|
|
550
|
+
): string | undefined {
|
|
551
|
+
const value: unknown = row[key];
|
|
552
|
+
|
|
553
|
+
if (typeof value === "string") {
|
|
554
|
+
return value.length > 0 ? value : undefined;
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
return undefined;
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
/* ClickHouse UInt8 booleans arrive as 0/1, sometimes as the strings "0"/"1". */
|
|
561
|
+
export function readDtoBoolean(
|
|
562
|
+
row: Record<string, unknown>,
|
|
563
|
+
key: string,
|
|
564
|
+
): boolean {
|
|
565
|
+
const value: unknown = row[key];
|
|
566
|
+
|
|
567
|
+
return value === true || value === 1 || value === "1";
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
export function readDtoStringArray(
|
|
571
|
+
row: Record<string, unknown>,
|
|
572
|
+
key: string,
|
|
573
|
+
): Array<string> {
|
|
574
|
+
const value: unknown = row[key];
|
|
575
|
+
|
|
576
|
+
if (!Array.isArray(value)) {
|
|
577
|
+
return [];
|
|
578
|
+
}
|
|
579
|
+
|
|
580
|
+
return value.map((entry: unknown): string => {
|
|
581
|
+
return String(entry);
|
|
582
|
+
});
|
|
583
|
+
}
|
|
584
|
+
|
|
585
|
+
export function readDtoNumberArray(
|
|
586
|
+
row: Record<string, unknown>,
|
|
587
|
+
key: string,
|
|
588
|
+
): Array<number> {
|
|
589
|
+
const value: unknown = row[key];
|
|
590
|
+
|
|
591
|
+
if (!Array.isArray(value)) {
|
|
592
|
+
return [];
|
|
593
|
+
}
|
|
594
|
+
|
|
595
|
+
const numbers: Array<number> = [];
|
|
596
|
+
|
|
597
|
+
for (const entry of value) {
|
|
598
|
+
const parsed: number = Number(entry);
|
|
599
|
+
|
|
600
|
+
if (Number.isFinite(parsed)) {
|
|
601
|
+
numbers.push(parsed);
|
|
602
|
+
}
|
|
603
|
+
}
|
|
604
|
+
|
|
605
|
+
return numbers;
|
|
606
|
+
}
|
|
607
|
+
|
|
608
|
+
/*
|
|
609
|
+
* A Map(String, String) column, serialised by ClickHouse as a JSON object.
|
|
610
|
+
* Non-object values (including arrays) read as an empty map; values are
|
|
611
|
+
* stringified so a numeric-looking tag still renders.
|
|
612
|
+
*/
|
|
613
|
+
export function readDtoStringMap(
|
|
614
|
+
row: Record<string, unknown>,
|
|
615
|
+
key: string,
|
|
616
|
+
): Record<string, string> {
|
|
617
|
+
const value: unknown = row[key];
|
|
618
|
+
const result: Record<string, string> = {};
|
|
619
|
+
|
|
620
|
+
if (value === null || typeof value !== "object" || Array.isArray(value)) {
|
|
621
|
+
return result;
|
|
622
|
+
}
|
|
623
|
+
|
|
624
|
+
for (const entryKey of Object.keys(value as Record<string, unknown>)) {
|
|
625
|
+
const entry: unknown = (value as Record<string, unknown>)[entryKey];
|
|
626
|
+
|
|
627
|
+
if (entry === null || entry === undefined) {
|
|
628
|
+
continue;
|
|
629
|
+
}
|
|
630
|
+
|
|
631
|
+
result[entryKey] = String(entry);
|
|
632
|
+
}
|
|
633
|
+
|
|
634
|
+
return result;
|
|
635
|
+
}
|
|
636
|
+
|
|
637
|
+
/*
|
|
638
|
+
* An ISO-8601 timestamp as unix ms, or undefined when absent or
|
|
639
|
+
* unparseable. Never 0: epoch is a real instant and would place a row at
|
|
640
|
+
* 1970 on the timeline.
|
|
641
|
+
*/
|
|
642
|
+
export function readDtoUnixMs(
|
|
643
|
+
row: Record<string, unknown>,
|
|
644
|
+
key: string,
|
|
645
|
+
): number | undefined {
|
|
646
|
+
const value: unknown = row[key];
|
|
647
|
+
|
|
648
|
+
if (typeof value === "number") {
|
|
649
|
+
return Number.isFinite(value) ? value : undefined;
|
|
650
|
+
}
|
|
651
|
+
|
|
652
|
+
if (typeof value !== "string" || value.length === 0) {
|
|
653
|
+
return undefined;
|
|
654
|
+
}
|
|
655
|
+
|
|
656
|
+
const parsed: number = Date.parse(value);
|
|
657
|
+
|
|
658
|
+
return Number.isFinite(parsed) ? parsed : undefined;
|
|
659
|
+
}
|
|
660
|
+
|
|
661
|
+
/*
|
|
662
|
+
* True when the cursor carries the additive sort fields; false for the
|
|
663
|
+
* legacy {startTimeUnixMs, sessionId} shape.
|
|
664
|
+
*/
|
|
665
|
+
export function isSessionReplaySortedListCursor(
|
|
666
|
+
cursor: SessionReplayListCursorDto,
|
|
667
|
+
): cursor is SessionReplaySortedListCursorDto {
|
|
668
|
+
return (
|
|
669
|
+
typeof (cursor as SessionReplaySortedListCursorDto).sortBy === "string" &&
|
|
670
|
+
typeof (cursor as SessionReplaySortedListCursorDto).sortValue === "number"
|
|
671
|
+
);
|
|
672
|
+
}
|
|
673
|
+
|
|
674
|
+
/*
|
|
675
|
+
* Read a cursor off an untyped body. The legacy shape is normalised to
|
|
676
|
+
* sortBy "startTime" so callers have one branch to write. Returns null
|
|
677
|
+
* when neither shape is present.
|
|
678
|
+
*/
|
|
679
|
+
export function parseSessionReplayListCursor(
|
|
680
|
+
value: unknown,
|
|
681
|
+
): SessionReplaySortedListCursorDto | null {
|
|
682
|
+
if (value === null || typeof value !== "object" || Array.isArray(value)) {
|
|
683
|
+
return null;
|
|
684
|
+
}
|
|
685
|
+
|
|
686
|
+
const row: Record<string, unknown> = value as Record<string, unknown>;
|
|
687
|
+
const sessionId: string | undefined = readDtoOptionalString(row, "sessionId");
|
|
688
|
+
|
|
689
|
+
if (!sessionId) {
|
|
690
|
+
return null;
|
|
691
|
+
}
|
|
692
|
+
|
|
693
|
+
const sortBy: unknown = row["sortBy"];
|
|
694
|
+
const sortValue: number | undefined = readDtoOptionalNumber(row, "sortValue");
|
|
695
|
+
|
|
696
|
+
if (
|
|
697
|
+
typeof sortBy === "string" &&
|
|
698
|
+
(SESSION_REPLAY_SORT_BY_VALUES as ReadonlyArray<string>).includes(sortBy) &&
|
|
699
|
+
sortValue !== undefined
|
|
700
|
+
) {
|
|
701
|
+
return {
|
|
702
|
+
sortBy: sortBy as SessionReplaySortBy,
|
|
703
|
+
sortValue: sortValue,
|
|
704
|
+
sessionId: sessionId,
|
|
705
|
+
};
|
|
706
|
+
}
|
|
707
|
+
|
|
708
|
+
const startTimeUnixMs: number | undefined = readDtoOptionalNumber(
|
|
709
|
+
row,
|
|
710
|
+
"startTimeUnixMs",
|
|
711
|
+
);
|
|
712
|
+
|
|
713
|
+
if (startTimeUnixMs !== undefined) {
|
|
714
|
+
return {
|
|
715
|
+
sortBy: "startTime",
|
|
716
|
+
sortValue: startTimeUnixMs,
|
|
717
|
+
sessionId: sessionId,
|
|
718
|
+
};
|
|
719
|
+
}
|
|
720
|
+
|
|
721
|
+
return null;
|
|
722
|
+
}
|